From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 From: Jered Floyd To: git-commits@fedoraproject.org Subject: [rpms/trafficserver] trafficserver-9.2.14-1: Merge branch 'rawhide' into epel7 Date: Wed, 15 Jul 2026 17:21:12 GMT Message-ID: <178413607234.1.15100351621857291694.rpms-trafficserver-c95a1ba8fa0c@fedoraproject.org> List-ID: X-Git-Repo: rpms/trafficserver X-Git-Branch: trafficserver-9.2.14-1 X-Git-Rev: c95a1ba8fa0c27c688137a97da5aa6dc2d44ef58 QSBuZXcgY29tbWl0IGhhcyBiZWVuIHB1c2hlZC4KClJlcG8gICA6IHJwbXMvdHJhZmZpY3NlcnZl cgpCcmFuY2ggOiB0cmFmZmljc2VydmVyLTkuMi4xNC0xCkNvbW1pdCA6IGM5NWExYmE4ZmEwYzI3 YzY4ODEzN2E5N2RhNWFhNmRjMmQ0NGVmNTgKQXV0aG9yIDogSmVyZWQgRmxveWQgPGplcmVkQHJl ZGhhdC5jb20+CkRhdGUgICA6IDIwMjItMDYtMDhUMTI6NDI6MzUrMDA6MDAKU3RhdHMgIDogKzE5 Njc5Ly0yMzggaW4gMjAgZmlsZShzKQpVUkwgICAgOiBodHRwczovL3NyYy5mZWRvcmFwcm9qZWN0 Lm9yZy9ycG1zL3RyYWZmaWNzZXJ2ZXIvYy9jOTVhMWJhOGZhMGMyN2M2ODgxMzdhOTdkYTVhYTZk YzJkNDRlZjU4P2JyYW5jaD10cmFmZmljc2VydmVyLTkuMi4xNC0xCgpMb2c6Ck1lcmdlIGJyYW5j aCAncmF3aGlkZScgaW50byBlcGVsNwoKLS0tCmRpZmYgLS1naXQgYS9LRVlTIGIvS0VZUwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDE0YWFlCi0tLSAvZGV2L251bGwKKysr IGIvS0VZUwpAQCAtMCwwICsxLDgzNCBAQAorVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQR1Aga2V5 cyBvZiB2YXJpb3VzIGRldmVsb3BlcnMgdGhhdCB3b3JrIG9uIHRoZQorQXBhY2hlIFRyYWZmaWMg U2VydmVyIHByb2plY3QuCisKK1BsZWFzZSBkb24ndCB1c2UgdGhlc2Uga2V5cyBmb3IgZW1haWwg dW5sZXNzIHlvdSBoYXZlIGFza2VkIHRoZSBvd25lcgorYmVjYXVzZSBzb21lIGtleXMgYXJlIG9u bHkgdXNlZCBmb3IgY29kZSBzaWduaW5nLgorCitQbGVhc2UgcmVhbGl6ZSB0aGF0IHRoaXMgZmls ZSBpdHNlbGYgb3IgdGhlIHB1YmxpYyBrZXkgc2VydmVycyBtYXkgYmUKK2NvbXByb21pc2VkLiAg WW91IGFyZSBlbmNvdXJhZ2VkIHRvIHZhbGlkYXRlIHRoZSBhdXRoZW50aWNpdHkgb2YgdGhlc2Ug a2V5cworaW4gYW4gb3V0LW9mLWJhbmQgbWFubmVyLiAgRm9yIGluZm9ybWF0aW9uIGFib3V0IG91 ciB2YWxpZGF0aW9uIGFuZCBzaWduaW5nCitwb2xpY2llcywgcGxlYXNlIHJlYWQKKworICAgIGh0 dHA6Ly9odHRwZC5hcGFjaGUub3JnL2Rldi92ZXJpZmljYXRpb24uaHRtbC4KKworCitBcGFjaGUg dXNlcnM6IEltcG9ydCB0aGUgS0VZUyBmaWxlIHdpdGgKKworICAgIGdwZyAtLWltcG9ydCA8IEtF WVMKKworCitBcGFjaGUgZGV2ZWxvcGVyczogR2VuZXJhdGUgdGhlIEtFWVMgc2VjdGlvbiB3aXRo CisKKyAgICAoZ3BnIC0tZmluZ2VycHJpbnQgLS1saXN0LXNpZ3MgPHlvdXIgbmFtZT4gICYmIFwK KyAgICAgZ3BnIC0tYXJtb3IgLS1leHBvcnQgPHlvdXIgbmFtZT4pID4+IEtFWVMKKworCitBcGFj aGUgZGV2ZWxvcGVyczogcGxlYXNlIGVuc3VyZSB0aGF0IHlvdXIga2V5IGlzIGFsc28gYXZhaWxh YmxlIHZpYSB0aGUKK1BHUCBrZXlzZXJ2ZXJzIChzdWNoIGFzIHBncGtleXMubWl0LmVkdSkuCisK KworcHViICAgNDA5NlIvNUQ3QkJDNUEgMjAwOS0xMC0xNworICAgICAgS2V5IGZpbmdlcnByaW50 ID0gN0FCMSA1RTVGIERFMTkgNTVBNSAwREE5ICA4NjA1IDUzM0QgRUYxNSA1RDdCIEJDNUEKK3Vp ZCAgICAgICAgICAgICAgICAgIExlaWYgSGVkc3Ryb20gKENPREUgU0lHTklORyBLRVkpIDx6d29v cEBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDVEN0JCQzVBIDIwMDktMTAtMTcgIExlaWYgSGVk c3Ryb20gKENPREUgU0lHTklORyBLRVkpIDx6d29vcEBhcGFjaGUub3JnPgorc2lnICAgICAgICAg IDlEMUFCNkFCIDIwMDktMTEtMTcgIEJyeWFuIFcuIENhbGwgPGJjYWxsQGFwYWNoZS5vcmc+Citz aWcgICAgICAgICAgNjk0MjY4MzggMjAwOS0xMS0xNyAgTGVpZiBIZWRzdHJvbSA8bGVpZkBvZ3Jl LmNvbT4KK3NpZyAgICAgICAgICBCNTVEOTk3NyAyMDEwLTAxLTI2ICBXaWxsaWFtIEEuIFJvd2Us IEpyLiA8d3Jvd2VAcm93ZS1jbGFuLm5ldD4KK3NpZyAgICAgICAgICBCODQ1MDhFQyAyMDEwLTAx LTI2ICBCcnlhbiBXLiBDYWxsIDxiY2FsbEBhcGFjaGUub3JnPgorc2lnICAgICAgICAgIDNGMEEw NEI2IDIwMTAtMDEtMjYgIEdlb2ZmIEdyZWVyIChDbG91ZGtpY2spIDxnZW9mZkBjbG91ZGtpY2su Y29tPgorc2lnICAgICAgICAgIDQyNzIxRjAwIDIwMTAtMDEtMjYgIFBhdWwgUXVlcm5hIDxjaGlw QGZvcmNlLWVsaXRlLmNvbT4KK3NpZyAgICAgICAgICA2ODY4OUYwNyAyMDEwLTAyLTAzICBHZW9y Z2UgVi4gUGF1bCAoQ09ERSBTSUdOSU5HIEtFWSkgPGdlb3JnZXBAYXBhY2hlLm9yZz4KK3NpZyAg ICAgICAgICA0RTI0NTE3QyAyMDExLTExLTEwICBIeXJ1bSBLLiBXcmlnaHQgKFBlcnNvbmFsKSA8 aHlydW1AaHlydW13cmlnaHQub3JnPgorc2lnICAgICAgICAgIEM0RkM5QTY1IDIwMTEtMTEtMTAg IEJlcm5kIEJvaG1hbm4gPGJvbW1lbEBhcGFjaGUub3JnPgorc2lnICAgICAgICAgIDFGNDlFQ0E1 IDIwMTEtMTEtMTAgIFVscmljaCBTdMOkcmsgPHVsaUBhcGFjaGUub3JnPgorc2lnICAgICAgICAg IDFFM0U1NkM2IDIwMTEtMDYtMTYgIFpoYW8gWW9uZ21pbmcgKHBlcnNvbmFsKSA8bWluZ196eW1A eWFob28uY29tLmNuPgorc2lnICAgICAgICAgIDIzOTJGNUYzIDIwMTAtMDEtMjcgIEpvaG4gQnJh ZGxleSBQbGV2eWFrIChDT0RFIFNJR05JTkcgS0VZKSA8anBsZXZ5YWtAYXBhY2hlLm9yZz4KK3Jl diAgICAgICAgICAxRTNFNTZDNiAyMDExLTA2LTE3ICBaaGFvIFlvbmdtaW5nIChwZXJzb25hbCkg PG1pbmdfenltQHlhaG9vLmNvbS5jbj4KK3NpZyAgICAgICAgICA3OTE0ODVBOCAyMDExLTExLTEw ICBKaW0gSmFnaWVsc2tpIChSZWxlYXNlIFNpZ25pbmcgS2V5KSA8amltQGFwYWNoZS5vcmc+Citz aWcgICAgICAgICAgMzUyQUNGNzYgMjAxMS0xMS0xMCAgUmljaGFyZCBLZWl0aCBUdXJuZXIgKENP REUgU0lHTklORyBLRVkpIDxrZWl0aEBkZWVubG8uY29tPgorc2lnICAgICAgICAgIEI2Q0QzMjgw IDIwMTEtMTEtMTEgIFVkbyBTY2hudXJwZmVpbCA8bG9md3lyQGFwYWNoZS5vcmc+CitzdWIgICA0 MDk2Ui9BNDk0QjU0RiAyMDA5LTEwLTE3CitzaWcgICAgICAgICAgNUQ3QkJDNUEgMjAwOS0xMC0x NyAgTGVpZiBIZWRzdHJvbSAoQ09ERSBTSUdOSU5HIEtFWSkgPHp3b29wQGFwYWNoZS5vcmc+CisK Ky0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorVmVyc2lvbjogR251UEcgdjIu MC4xOCAoR05VL0xpbnV4KQorCittUUlOQkVyWk9nb0JFQURJbUE4ZVFmMDNjT1hoMVVDdXpOQWc2 cGFlTlJCSEpnU3EybHkxbEY0N1dnSTFTMEtmCis3ZEhkcjNISDN4cGtNN2QwbTJObTJ0UHNaemVt WUZBVzFzaXh6WGo1Ym5DQ3VDYWVPSHpJKzRtTTlUdTlBVVFwCitacVRpYVcrK3RTZW5sK0N6Uld3 RFlGVUcycytyNC9GcDBWTnAvdkhvMUVxb08xY3lhdUcvSnZvM1ZwYnNLbDJnCitYdU5aZlJSb0RP c2NHVTdrY1NLajd3bnhSQ1htOElITUdzdW9idE9DNVVzdVFDZ2dveEZmRDBtYzFaS1pUOWR2CitX d2NZRzdzR0hVVXVFVmt3SFFyM2lranZJdHpaRmdEVTVEbzVrdjdxNE9aL042d1Fod1QzbHFYbXBG WDVmTUsvCisxek1sckZqZXBsN09lUGdQZjJxcllVR3U5RFZPY2RUMUVsTWxZNkJPSFYremtBN2kv U0JaVU92TjkzQ0dQOEk0Cis3RHAvRGFRYUNBczdtY0dTY3UrMDdOcjE0eEttZnFvK29xTDQwVWJh Vk55RUFxaHFIbHluS0dLTzZtWVBrVU9aCitLU1QwUjNBUUNNNm5Ucjh6c0dxaUp6ZTJDK3VFYzR1 QlVYSHNZNHRnbzlETzhaY3lhQmo2Ry9UWXVvbDRtMmtGCitJbnhOSFdGSjN0aU85ZGtNME8rWVlh ZTNVbkg3bVhCbktKTmhURy9lazM0TExMWUNnWG5PWjFjREtkdHlkNVo4CitwK1ZlNzNFTTRweEp1 QzBKM1VrUEdCUnhZenFrcXgwdFhEQ0FmMXpZcFRINDg2SEphcHhZdVl5djk0TFFLaHpwCitoRXlY Zm02ekZ1ZkhXZGN3ZTBiam92Y1RLQVJFOFE4MWVCaStOLzNjVXpOTVFOKzViaml5M25RT0JRQVJB UUFCCit0RE5NWldsbUlFaGxaSE4wY205dElDaERUMFJGSUZOSlIwNUpUa2NnUzBWWktTQThlbmR2 YjNCQVlYQmhZMmhsCitMbTl5Wno2SkFqY0VFd0VDQUNFQ0d3TUNIZ0VDRjRBRkFrclpPMWdGQ3dr SUJ3TUZGUW9KQ0FzRkZnSURBUUFBCitDZ2tRVXozdkZWMTd2RnA4TmcvK05rUXorVitjQ0Fpckpn MDhYclorRzUwOEk4UnhOc0hBdFo0a3JQSzk1OEVKCitGeHMyU0JDWDVWK2VkUDRuZzRwUmRFZzZ6 QTE3dXA0MHpsbm4xNEZWQnBkWitiVTB5ZC9EVGlLYVg1TXBmUFZOCitHencvdDRnRG9UbnRndUR5 dzJKQ1VLaE91N0I5ek1EQlNVVDRLRmVHOTFuSUFqeWdCNTVjL2Q5T013Ulhtb2VsCit2VUwxL0pW cUxCSnVaZ1RKNzBqbjRkVUh6NVZTdVVzeWx2bC9rUndjZVkzUXlackErM0xYVlc4VisrczM2V3pU CitRSVhTQWdmRmRzdzhSeTBDNE9XV1g1QW5kMHF1Qi9FOWwzektwRHZ3SDNGR3JpZk0yOGFOZDlX ZTVjOFFneFZkCitnS2JTSGM1OTV6cXVMZWJoSWowYzNwZVhSWTE1cW1xcTBmWUdjTWtwcitjYXBZ MEtFc3VzeERnL00wNnNyeW1xCitUcjUvQkZFOExxdi9ReStPZWJMUncwK0I3YitadlIwdE15djJM K2RyWWdXdlh0cENGS01DZnFwMUtXSll0b2x1CitiVWNJWnJDTXpVbHNDTlQ1ekNqZjM5NmpNVGh1 Y2ZSUTVQcmdMdEY4SmMrTkRubEt6ejhhY0NsaGROd2E0RjNzCitkbVMyQzNQcVJzOUpXRWhkWEN2 bnV1cm5NUU1zYnVqVmVhbThrUVJGVWN2Q2RsMzNjSFA4SlV5M2NRNHVBOE0rCitYYW5OREJIeERp czVERFRnTExuRGlXZkdITDZGVlNzSDNPeHNQQ09BL2dvN3VEdzBpaGlDN1RISnZoMkw4MDUxCitO UGxHVkRuQ3FibkZieklWTGJiWEZTVHBKUTV2YnpPUFJhS1pMT1RYdktFRzlNbWJ0cnhoWGZwUXI1 emFwSU9KCitBaHdFRUFFQ0FBWUZBa3NDOVUwQUNna1FKaW8zUTUwYXRxdjdGaEFBcy9tTFlDRjBl UVo4NkcwdWxXVVFrczhVCitMRWc0U1NzenhHekJYTHE2NjJUSmI3eUtpWkFPRVVQZm9RZkNleXJP R050K21JVy9UR1BVeGZNc1VxOTZodzNPCitFSWxmMWhienIrUTlIc1ppVGpjZHhWeFUyYjJSS2k4 dUQwdHJHVTJsZ00rbk1VVStkcFhPZ2ZsLzE3YlN3NkVNCiswSHVnREZwU28rRS9PeFpkU21qOUFt M1loVlQ4MjVVQVhvRU9pNmlqQkx4OFUwZGZYczB4bzIyVnlValFFdlJLCit3cTltc20xUWlsVUxG ME5tSVlTaUlvUWMvbDJ0VWM3V1RJMjZTQjJoYTZ1QWNsUmNneGoyNkE0QzJSSGE5anJGCit2bmhh a0gvOUdmSjdycGdsWmcyNmtCbG51ZE1nb3Fkd0xoeEh3aVNWSE5JZVlKaTZtMk01L2lhZHltZkFW UWI0Cit0SStNajU0VHlNTGdHcWNHU2N2aXJ5Yjh5K0dUWEFhYXIvbWQ5L1FWa3VoSldqaEV6aGh2 MVVBeWlsenQ2dXYzCitYbFQxZmdMUVpQZWtWRnYxaFgyYVcxcFNzbWNmMHJhTzliY3ZqT2xMRkhS aVgrTTBBd2hkYjNWWWRROHo3eEUyCitLQnZXckRacEhkT1dtb090RXYzcEdmZXNiWTdxS2hsS0U3 SzFTbmRXUEY2OWtLMmVydnlxV1J3SmxWN2VFUnEvCitUNU9pMWEzVnFpSk9yczdDZWQrODZSY1Fw dWdveC9mTzRXQ0JhM1ByMGp6ZlQ5dHg5VTJSNUQ3c1dHWTBkWnNvCityTmdZa05PcmxhNmNiNkFv clY2S29wMUxIOElsaHl4eGxsYkRjelROTFdaazBNbDZhUXVWVW9SaTR5ZFRpRFU1CitLbzBqSE1M SkRPK0NpeVpZSHNpSkFod0VFQUVLQUFZRkFrc0RLK2NBQ2drUTBSM1NJV2xDYURndHNRLy9Sa3Ir Citxa0xlMUxRa1lNaW91WGVuZzh0OWpQcW8xVDBJdjEybHNwVERMYXpaQ0JMcGF0Rkp5ekNyMEt3 Q1FQZVBsSFRiCitiVVk0NFllcFM0VE9DVzRVTE84ZFMyalZnTG9uajlOMmc4VzFqYjZ2bnVTajFs QXJnaU4zT3BQUi9Genl5QmNWCitVYlk1S21TS0tXdDNqcitRT0U4UlM0cWVDMExIVTBNNTdyVUk4 Y1NReWRZTUphb0pTUExmNENqdWxvMzRpRHY3CitNR1lBNU1PSy8wMU5ISDZoQTg5UHVHanZDUEd2 VEV4OXI2aEpCZzI2QmxtTnZCVGkrTHNxakdZdGkvaDZYSHRaCitpT1NyU21EU0QzV3J2RE40aGFS Vy9wU1FLelB2aGwxT2Z1QkowRUQ5SjRXc1ovZkdHeHRQZ1E2bGR6RitJVTZSCitNVEUrSXdvQ1Vk cGVtVHBBTU8zbDd4TEdCRTVjU010b1ppdU5wTmJzUEFqcWdsdmhieEdSOGdybXU2M1NQUUluCitI NDlSQ0dxOVQyQmdkOGs5M0dlR0lscE05R2ZqODdJZFdUeFdrOFh1ZFRTMk5IOHB0a1Fma011Ulph dWtRVCtjCitrbnB2WHFJdm96YVlvSzhaSUloOWhKU2JzVFQyQmVQcjNqZ3dDclZFM2J2aTQ1bUJ5 TThKNG5ob0dDNTNUNDIxCitxSXQySmZFblN0YzdyaDE0OUkxUlpka3NCNFpIZ2ZDRXdLMVMwYXNw ZE1DR0RSZUVtN05oeWI5YXBCeWlJY0VWCitmcm5IU3MvbmVRTWNCNEZGOGpocjhuWXo1Q1BoeDhm QTczRk9va21rYnNaQW1DUWZHT1EvRTRTV1BzUXhRdmFyCisvcnA0dFI2Y2lVTGM1aGc4WmFjVnJt M2EvOWYwcS9lZ1ZBNVFlQStKQWh3RUVBRUNBQVlGQWt0ZlpTd0FDZ2tRCitHVDhZQ3JWZG1YZENh aEFBdDRmd1ZpRm9yb1pYWkE2TW1udzl3eUttb09Lc3pDL1dKKzJIUGJ3T043bnB3OWs4CisxZ1pi Q2huOXhmWlA2YVJDVDl6M2NPNERCbnpEdDlwVXdXeDZPVzZ3b0RQVHIwTGhrODRGOXYyWDhyUGMv TVdmCitsZ3ExczB3ZzlIVlVzZS9oWERKNnpUSjhIM0dPMDRXR3l3Zk1pNGtoMHBUdnhTdXNuQ0hP UHJRN1A2OTdqNEgwCituNGVSREliVDk1WWdzR1huTWpJL0RqNnptTnI2QTU2QnVDWS8zZEJYMnF0 dlNJalM0cVFwT2dYZU1XSVEwTzJSCitnUmNjdjJySTRRVXRxVTRMOUFuajFvV2RGTkE4NzhISy9E bmhwTGp2dmQwV2x6T0hYSEZuSlZPajgzenlSeHRRCitZa1pBMFpwanBDbjhySGFCd29MY1F0VzRl RDNDbGZQR0hwNUlzZjU1MHRvbFJ0UXRYMTJiY2pNTUp6d3NTYW10CitzNDJlY2l2cklOZDczVnpO S0EwQitGNFB6WU1idUJ2bjdpcTY2NWZtUVF1Qk1VV1pvWXhIK0EwWHRTZ05ERk9PCit6dXBkMVRl eXdQNDFrbW9HblNXb1JzZmxwZE1MUU1iNyszT2JHR2xHM3ZqQ2FncE9Sand3WjJLS2Z5aUhIK3A1 CitRYW40VUdEYTZkUzkvenkyczBoKzZjK3ozVTJRMG9Yb0RUdmpnc1d6TVhIUURYZTJCNytjQi9W bFBSS0RSaHhiCis2VjI5MUNGc0I0YjNXOG1MUjBldDhKQTUvdDBxMzVGTkd1Zmd2d0tsNEk0ZmpG ODdZMTlnbGMxM2YwRXlKeTZ0CitkY3ZmMG51dFI5Szd1TG1NYUpubUJ5bUVDSUFmUmhjZllWMzZH TTd3bnI1L1o5KzZVdFF4Zmk3ZXVMMkpBaHdFCitFQUVDQUFZRkFrdGZicjhBQ2drUVRSVkJFTGhG Q095cG9SQUF0S1k5VzJQamdrWDBpelY0SlhvenZ4YkJDdjljCitjTi9Eck5oblc2YkwyWHkxaHY3 L1ZzTU13OFgydWpIbitLdTJQUWJtcjF5bTZFQUF4WDM2OVE1YVhxUklrbU0zCitWY3AyRHU2anVh NWFLM3FUeERhTVEyUXdieWQ1Z2JwanRsUWpoRjhDYjRwMWpaVE9zTkVxL3lSbEhjd0VqaXpqCitp RkRvQzJUU1ZrMjU1R2M5SHFHN3k5NmJiaTl3MTZORGhJMXBhNTQxSmRhc0R6cjgzcVJLZDJhYW1R N04zMHpNCisvVWx5NXpxb28wZzdITHNZMlMzcEExUlVjRzdCRzhsWTlpUUNxN0FKc0hydzNHcTd5 MzhWbHZuZlB6VEszQzh0CitvU3dkMVNjSCsreCtxTStabmowTjFxQU51TUt0V2EvWElxVGZJTi9W NG9jeU41QnFPLzFqekJJOVU3aGJ5bm01CitNU3FjYUQ1VHRRREt0Q1RqMmhRSWM1QTI1djZ5RHZv RXNuSVJiYk5TOUd1YU9sTXhuaStDeWpYZ0xiNFRuWWFSCit0dDZHM0k2c3F2c2xNbCtjdlNkQVVG QnltTk16V1RHUjZoZ2piZVJSRmdva0pkV3dseVdRZExBL0xwVTJCOExlCitkV3Z1c1gweFJaZk1k VjlYY1NMUnlpZ3p5VkVyK3BhVXF5eitaL3VNTWZGMFg2cmllUUx6d2x5RlJYTGY2em8wCitIc1JK S3FNSWMyck5EZHV0MDFnWWxnK0ZMMWRsM1BXeHVWQU0wOGVGbTV0VFpYb0JNbU8zQnRjeEc4bmQ5 VHdBCitxSXAzaUFSTkNjWVVmT3JFY20xWTM0cmxFYmlodDdRYVFmRVVVZXlnS0dCVGpZS0VoUHAv TWlaenB3bXkraTlQCitEdTZpOEx4bnBmSUYzRU9KQWh3RUVBRUNBQVlGQWt0ZmI5OEFDZ2tRVld1 LzhEOEtCTGFZOUEvL1hWSWRkZkloCitxM0tHRms2cVUzV21KRVAraFBWRTFHZXVNMXUvK2VyWmRG ZnF5dWRMOGZub0tLQlpFdUlrLzNRUVh4NGNkNEVECisyQ3FvcFROUUlUWkRONTFndEN0YU1maGJh ZGFWS1FIQVdnbGZwUDNKckx1SXVSNENhQVQwY05GTHpIUmxOdDJLCitOcU5ocGZQMHJ2ZldMcHk3 V3o5WjVBemFTek9GZGtVUG5zU1hRNXpuekdpUGZQQ2tIeFJpdkYwdVd3a2xEWFgxCis2Y3J4ZzVQ OWt2RXphSG05OG5lOVdXV0o0WjdQTlVLY1VqazIyUzgwRkw1T214M1E1WnI0azY3dVp3MGk2eVVM CitvNFlmTHRwdERHSEtUZ3d2WVFZdVRjYkVRYkYxcGRXSHNzTDhwK0pwT25VWm8vY0ZtRWV5ODd6 YWxXamxXNWgyCit4T2JXQzhkdFp1WTZ2TkVQQ3BsWXlmU0VySlJ2YVhRNU9PQzVEU05kWUdvOW9F OVRsVWJkVnJENnkyYzdzWFcxCis3UUVmM09JMkZ2ZGJMTnZlVVV3dk14NzJVdEVvM2FMRnNlaTFV bnNHb3p5Sk44a0xUTFV1ZndSOExnSTV2aytzCiszc0dmVUtKWGdPc1RUTjU0NnRsREE5YmZTcnN1 RmQ4SVFGUjc1b1ljVlZrT2VsU0w0ZitDUVhaM2dWTEpnWklOCisvcDdISi9aSmtwcXBMQUx6ZFhM d0w1SlJ6ZmY0N3FGY1pXQ0p6cWlMNWlFMDlhY1pTMW9qYUpXMGloRjBONHVyCitNbUJieE40bUsr akZPUEpPc3oyNVZ5elhNbE95UXpNZUg5aGRySGhuRGo2dzFTbUpEUEh2ZmVMb2dRbUlhQjloCitE R1NuN1lHdEFUM2VuR2hjWXg2Q0dKR3hFTG9qRW9xdVY4V0lSZ1FRRVFJQUJnVUNTMTlqN3dBS0NS RDNpSFgyCitRbklmQU1DUEFLQzJHY1p6QkQwNXlpK0pNTnI2azg1d0pEei82UUNmZVVTMzNKZ3Y2 RzN4K2ZibmYvT0lKMTdpCitjQmFKQWh3RUVBRUtBQVlGQWt0bzJBSUFDZ2tRazR5eDJXaG9ud2V1 UWcvL2RFSkV3NnAyREJzdmRaRGNsaVhvCis4TGF3blZMVzdYUklDYk1vZ2w0NG1JV1BmVjVGRW1r ZzF4ZEprRHNucmF6d0FlVG9YbUlSNGhoRUFYQjM3SXUvCitrYmNzRWhPNGk4U0w3T2Z3cUdFL1h5 eklUcU92Z2xOb3FBTnE2djFaWlRuc0Zyc0RFczA4Rm1IV3lzTTMwbit3Cis0S251SGVwN2hiK2hn c3VReVdBcDZUZUNsaE41UjdNc01iMXk4OERvcWJBNDcrOXBzeDMzdWJyNW9VRlcwK0xCCitOcklq Qkt2TUh4a0hlWVN0K2dFYktudlRBL3g2MGpiYjFJZ0V0Y3MxSjRJU0FaZnBJbHdLeHhsTGdmL3lN SHhzCit1aXBWcWRKRVorZ0t6aVhyWVpac2RnRStkUXIrOFFDb1ZMVmhXaXNPRk13UW1USktSK0Mx WUx0Q09keXp0UEFNCitNVmtCbHdQM3dPU0hVQjFYSmpmaWRtOFExK3UycS9mSlhneDlNK2IzaWN1 RTVHVU0wMitHUzFyRk95QktNOS95CitvTllUbFZxOVNBNm1sc2FZK291TEMyeTNPb0VHRUQrZkFG MHR6MTE5SWQzRll5WkE0c0ZaNXF4aHFqZ01nVkJ1CitBRUI5akVQWXNKNEdLSHJyeUVxekhwZVZB WUJsRmFqNm9UWHRBQk5McnNnWDRmbG5RdFNrWFoyRG0yL1RGaXpxCithVldpRHI1NTNUUDEzaVRE OWNRODE0bEU5ZTF1OGxwaFA3enJXbWdabkdqNXljV29FWndNOEtLNkgrM1FlUmRxCitCU2kwNk4v bzczaStwdkJoenVsUlZYWWFUS3I1OUlZYTRqRWo4MG0wNzN5ZFp6TDB4U1l6Y3ZqZFVHcFIzZ3VR CitnSUtmdjFSdkgwd3VzcVV1c3M3ZVBPK0lSZ1FRRVFJQUJnVUNUcndqZXdBS0NSQUxBNjV1VGlS UmZFY0xBSjQ2CitZcEc3dnNGejFMN2ZYTm51eDA0U0VsZUZXd0NnbFVUWEQ1NFVuUGp6Q1ZpVjJ5 eGw4a2RJT29XSVJnUVFFUUlBCitCZ1VDVHJ3cjFnQUtDUkNyMWpMc3hQeWFaUzNuQUtDZjJoaUM5 bFI2emRFaTFGYmd2QlFhbkNzRWJnQ2c4KzY3CitJQ0JsdHdrNGJTc2tvSE9sTWMwUU5CcUlSZ1FR RVFJQUJnVUNUcnhPbUFBS0NSQXZQbDB4SDBuc3BYV3BBS0NCCitrVGN1RUI5M0p2NDlMRmZvbllh KzJ3Tmt3Z0Nnczg5MUlvWHdjdE1GbVE3b0l6S2pTSVp2M0FTSkFod0VFQUVDCitBQVlGQWszNmto RUFDZ2tRUlBBbzV4NCtWc1l4b0JBQWtoeTF2SWJnTHdwbnVqUnB0NUlUT0g4OFlJVTQvZGJICis1 SDhxSzVHYTFXcWwwVlNmb29kWDBnL3JTRnFEOW1MVmR4Z0ZzK1gyMUxtUDJYeHV1YXB0c2N6WDVF dkRObzZSCit1ZlFiTGI4L0JVQVBkRW4yL1BQTDl2c0lqTG5oYnhvcWFOaXQzaXR2d0JtTFRvaG1V WGZRSmxKc25wSGE0eTZOCisyN081dHFEYjFYc09IY0JFLytOSUZPODlKN0VUNDNubUY4ZnNJVzRL V0x2K0ZkSEpFMTU5STg0bHdOcG1VaFo5CitmQUtUTnVmenI0Y2RrN1lLTjd1aENEMk5aTnpZWFpN TVMxazgwTGhrOTlycXFqODBCMk4vU0RNZVA1WGZhNC81CitvRGt0azdmQUdsWnNIbkR0VEt5WW1N Ni9tYjhBRzJ0Qys1RVYvMVJqV251WEtzWTdFL2JML3JkaTZlN2RtQWJkCitidzErMWtXaXNDVzcr a0VZZTZ2V1crRzJBanl2VmR3MzNxcXFoSDZYSW9PTG1DcUk0akpTZjlPUU1xNjdCMDRECitOWEl6 elBKOXV0czNPaVZzUXQ1MFRxcllISUZZNTZSWllndFVvc2UxOHppZEo4Q3JEQ09XUHZ3QndNUGFS ekNZCit6T1RtN21ocVVBK1FUY2EzeFB1UjJzR2dpVlMwK09mU3VXYVY1R2FSZGY3TTBPL29qbGdZ emNraWU2SWtnLzRJCitOM2V2ekxrMmV4b2RGMXJ5SzZacE5xVjJ3VXBMWnRoV2p4K0F6cE5qR3lr V0ZXVU5ObVdyZlN4eW5SYWFCN2xSCitGMEY3OFAvNFNnclY1ZVhDa3RSYmpWa01KVmxvN0trVThJ M1hEK2dZdzJsdmwrYVd1SVNOMTFzRnpKblpORkNhCit5eGhvbk9FQml4K0pBaHdFRUFFS0FBWUZB a3Rmc3FJQUNna1FDQXR3RWlPUzlmTS8xaEFBdFFqc3pjQ0drRE1TCitSaGFON1VORjl2ZVRUUmwv N0NiZVJTQTFXUURXSEV1T0JiNFI2aU42RjZSWVBGTFN6Uzl6NDZXT3d0a0RYWGp0Citab0h4TG1H dHhNRTVvYTU1VldQNkpteHlkY2RxZXJTNTljTFM4RXA0WU9zcWxxS3dvcHBwbVhpeE5IbW9MdTN3 CitXZUlJSmtlcTJXK1ZSQ2RXVTMwYmVhSzFDRHE3RTV4dHByMW5xaFJqTXE3YlBoYlpMejc1Q1pa OFJVODR6YTRvCitVaDEyN0pFbSt2aTArNy9KMXBDQ0pIVGxJZVNMZUJTeTZ3cmhoUmowWDdYdEU0 RHkweEdZcUFrWVo4NEhUc1diCitoM2lJQ3hJcVNVVThONGN2MHRRN0RUSGlJa3hlN1JBQzZSUlpk WGowa2s5OWNzcXpmdDhOcUxDSHd2RTlVTTBUCitFYjNIV29WemxGV3RoZDIvQlF5b3FnaGh3bUxD cTk4MjRjTkFGYVNrR2QwNHpwdkx0T2NvTVJFTFVYTUQwRDVRCithMkNnRHVYQnRxT3NOVkJJcVhS djdndERyUm9zNjFGNUJvdUFRWUJjZUM1eWhCSGdxTnYyNmJIVVdmS1I5SHovCitSbkZ4MGNRMnlX VDdKaGF2NFF4QUIxSWZZSzVPcjZBT0tLU0QxNWczZUtGcElXcTZ1VVVRbmlUYnV1cE85dG14CitG cVBqeUMwV0ZZRG1DTndVZmZyc0xwaFloSEQyWmpzbTJGTHJ2S1J2WGUxZXNkYnl6SEw0WFpDRS85 U2tBbWVrCiszVkJFNlZhV2RZdW5kZE5WWlRCMjZtcXRueVFKOHBYdXdIU29jRkkyZ1J2MTlwTDR1 cmd5TzdPNWJyTFBkWVpTCitLdVExSWhiTVhCSEVHM21FL1d2dUNpZ09qSi9UaElxSkFsRUVNQUVD QURzRkFrMzZtU00wSFFCemIzSnllU3dnCitkR2hsSUhOcFoyNGdibTkwSUdadmJHeHZkMmx1WnlC MGFHVWdjM1J5YVdOMElHTm9aV05yYVc1bkxnQUtDUkJFCis4Q2puSGo1V3h0bVlELzRnb24zNVFw SFBuaEY1aGdod1ZrdE5SU0szcXJUU1VFdXBnQ1pMMHI1cmlMaGRpeUVJCis5Ym0wcjZzcDNsNzQ3 VFhZWmRCa0dxVEZrelVkR0sybEF5Y2d1d1BheGZMV0RoMXJqdnErSjh5c3lkOU1WMEU1Cit6aTlV V1VMYUYyWEtnNy9MSGlDYTVNQm5kaWJ3dWV6ckRHNzRZdExyMUZWbDlUdm5kUm1qMXI4MDRDNVZa azhuCitsWmh1RmNzR3cxekRjZ1MvN3M1ODM1b0lhT3NUcFBaTkZQcTlGY1VsYkZ0aTVIOHQvcmpo aXJ3ZlVFa1p2TXZUCitXcllnWlBjdE1JY2hJZHR5NWE5Q1h2eFZZaGFpTGNhRCtaQlZRZW83Tk1t UFcwbWhUbzYvRUx0c0hGVmhuZDhLCithdjFtYmpTcWlsSld0TkJEYUw5WjUvdWVEVk0vT1IxenYz TzNUYnJlcktkdUpPUWpTK05jai9vOCtlK2pxWitLCitSWVhRK2hobnNvYmY2L1JhY3lnOHd6N0Nk ZWRTWmNuMS9sNlJXTG9ZRCtWYXh5VXY4UnB4Y2xacGdEMTdESEdTCitURVNPY25Jb1Z0N1BCQnMx YzdNMkFzNzVLV1lWdEExNnU0SVp1RjI2VlhIOTZ3WWdPN1pXbW5jT0dzc3Z0ZlllCit1YW1WOGtk aWtLYUtaTG9HZDg0OFduMnA1UHRJWFdtOXdxYzB5cWVGYkFZU0t0SVMrWnU1bFNBN1NMVU9Damcx CitJTDV5N052QVRobkFnbGJlQmF2dXlUNVFVelprNUtscnlYTk9oSHI0UWpWUkhFaGx5QmdNK290 cUxCUXovM0hjCitxa0lkMDFXQWlOdlNKY3FEY0plOS9Gc3hLelNPWlJJaXhSRW5KWTZ2bWE0ZDB4 cFhTaE54L1RIUkRZa0Nrd1FRCitBUUlBZlFVQ1Ryd29ZelVjU21sdElFcGhaMmxsYkhOcmFTQW9V bVZzWldGelpTQlRhV2R1YVc1bklFdGxlU2tnCitQR3BwYlVCaGNHRmphR1V1YjNKblBpQWNTbWx0 SUVwaFoybGxiSE5yYVNBOGFtbHRRR3BoWjNWT1JWUXVZMjl0CitQaDhjU21sdElFcGhaMmxsYkhO cmFTQThhbWx0UUdwcGJXcGhaeTVqYjIwK0FBb0pFRFRxZHVaNUZJV29ieHdQCisvaVgrelNhOHh1 bmFpZzR1VWRDemNRVkdpRDdlc1RRTFc0aXdLR3IxZUQ2b3pJamhyZS9tYXBqSmtWR2ppN0ptCitZ MEdXTng3SjBlczZ3cm9aZWRqWmhFMmY4RXFPb0s5ZmVPM3lPVEoxSEMwTmFiYVRWc1BubVVmWnk3 UHA5bmNpCit0M2xiQnl0ZlhGUlY0VmxoS2tlZm1ZYmgycUViMUJpamlqcmlDOGpqeURYd3RCM2VE WThtZU5nV1RvUGFLcXVhCis3T0NZaWpHdjZXeCtYZ1hRWGg3b2pSQlBDbVhyVlNUbGtiQXdRMm5s WnNRaHhqbUkvTURoc0N5Q0RKYm9jRU1vCis3TGZJaVJzZWJPak43QlY5Ulh0Rzl6Ukt1aU1oYkxE RDQzemxQSWxWMU9KL3M0bmlLTWcrQTZQYWJiL24raWYyCitXUDNkSmltdWs5VExCUXdBTHowY2Z6 ZjhxU2dTTTQ0dnNhQ0Q4T0t3Y051RzRIbmxWUVcwL0pyVERiWFFQTXhLCitPKzdjYnBJd3VJOTkw bWdvMzJiWXFaMUJLcHZlRUY0bXdpc1pmOVhmSzFNV2c3T25WQ3A3QzhRRVhjUndCOG1KCitBUHR3 STB1NlozT0dzS0JNYjFmcTZQcExJVkRRM09ZbitWOFV6a1J0L1BHUk9uWm0vakp3b0kxTWt1dWpL aW5vCisvUkUrQVJTZkhiZk9oSTNQVDdrMkN4bVhWV0M1NnBHQ3ZUMmpaTDM4ZVVsRnRXblM4OGpK eVNDdXozaVVETGUvCit6dU9IOGZEcHNhQnBOQU96TlR2cFRGTWxSMXVXckhISXhpendvR0tTckJB dTA5NVo4UlFxZnphbG4zc002VldCCitibEh4TUU1ZjJVbXZRYWRJMHpGSzVQWnVMMXFoR1VPQTFX dUE2RXl3QjEzdmlRSWNCQkFCQWdBR0JRSk92RnhRCitBQW9KRUpxcysxWTFLczkyY05FUC8yTUF5 NWVhODFKa1FobXhId29BMHI0NStielhNSGdPc09Ka29WT0g5TFNkCituOFh0LzFNNzZpQWVqYVo2 U1ZaZWpqcDBCTGlYZkJqRVVzbzJLVnF6dUQ0WS83TE9yMnVoVExUM2p6M0ZhQXd1CitGWkRlRFRR T3h2TGZSZ2R6SklCRFExUHpSRFA0a29OQ2ZLbDVhMW9HMXZtTUdTZFBYQnBReXYzMllzLys1OTZZ CitqNllsUmh2UVJycGxraWh5cVJ6UHhEbWxBRkZ6azNkOURLZ2RyM1p2WjhZRlhHTU1lSzRWVWpV UzJlZ0dMUjJ4CitNMWE4K3c3cmZ5T0FibVhHZkhqYmFaaDBWZWwyV3dIdHhCUllwWlFYbmsxQTFa NDB0SWlrMStBK1E0dXFtWFdDCis4VENHcytYOHlXbVFtNmJXaXdlRWdpNkFFUTRsQ0pBZVdyVCtt SkdJRHpxYUh4YWdZVndRcHIvdDN4d3VXQjkrCitTV2NPRUljcjd1aEpEK0w4L0VNd29vaU5lZDlp djVoUyt1THI2b0dISGRCK2pNL0hYZkJVb3llUERySHVvR2JwCitOb0ZoWVlkT2hpTmo5TmVYQWNZ cUU3a1J2SVJpVnM0anRPRUJ3RDdiQXZMTGduMkNZaDN6WjFZNlRlYkE1NUk3CitjOE1DN3JPMlNV M2o4N25YZGducnRlRWtDanJXcmhtUjR6VzZsR2l3VFhZVDJ4UEg5VUk3czRvNTdGOHQxVm51CitF cG50NmlUMXBVR0NlVW53S3MwQkhqMnlnOWsxRmpMN1g0dTdrT25wMkNFTVdXMTEyYVQwTVBmS0hM bWVXTlA5Cit3ektJbXJDSlFaeDhUaDFPRGc5WU5pbmh0azBrZHE1aiswbU5POENQMXlTY1NjYk5l am5ZbHdTUHB4NnBSdmNWCitpUUljQkJBQkFnQUdCUUpPdlhIRkFBb0pFQUViUnJhMnpUS0ErVUFQ LzFxalRGaVRMYmxEaFhSUjRPbW8xd2taCityNHJhTTlhT1Z2ZjJyanBZUnZweFNONGRnUlN2Q1o4 R29LOHd2TXA2eUpEM3pDaDFXdmExdFNVeFRveG5yRE0zCis0ejNEMnVYMmhoODFjWUNUZ2JBa2Z2 YUt1d01HZkZ3YzhtdFRNRkpPWlc2Qm5lQjJWeFB4WUlGa2tlTW5Kb0JLCisvNlRNSXJoZnl1eVox UFluT3VjUlVHZmR1QmJBeU5YYVRJY2xNemtpRUNlc3pMWFl4Uzg4elcrRVYrMkFqb1dxCitaeWZj Q1JWOEZIK2Z0UVhkL1pwL3lETzhDSzlDMkQrbktEZ2JQWlNhT3FMUEJFT0dYWitwVlAyRTdwcDUr SERYCitUak0zSnBTQmJ0UGtPalRZNHJ4ZFIraW9oUVlwb3VLTzVMSHZnelJhRyt4L29Kd0lpZnFa ZFJXeDRoZ3BUVG9jCitYWXZrWTNQcXNiS0ZRekd1aGNvUWlmOUsrZ1VNVThldkJsWnpVUnYwQzdQ Z3laWTJ6eitHM2NMTzd2QnpySGlvCisvYXdDTE9uNi9qMW1FZjJWM21kc1Z1WWsrQUdQYzhrOER2 VHJxQnVWR08wT0MwNFB6OEtBNTZmS25IVWJXNE9aCitsR1lVLzY2elcyTWhqVHc0aENaeGdYVitm cWVrc3A5Q1g3ZStHOUZBQnNhQjVBTUJLVUVKdDhYOThwaVlraWFHCitFUXJ3MFZHbCtvY3RFeXh6 MUtxeXhqRWFoZU56VmtER1NNZk9GazBlVy9mSGhmTE9Hb29ZYUJJaDZjdDROZXE2CisyM2hiZXV6 eFRTVHZzRlZHek84K3hoYVNtK0cvcTdMdlhRVlFFUWgwUVZCMEZoTEluVnlIRy9ieVY5Y2gySjZj CithSlhVejBlWDJ6V1lMc3RZZi9GNnVRSU5CRXJaT2dvQkVBRFRNQ08wSnoxa0tNRElId3QrdVJ0 VHBXWGgxak5ZCitjSFQ2cVhDYkNOaWtpSHduQW1paC9OZW0zVGEvOTZldEs2ZDFDQlFoMHExK0Fn TWIySjNoRGh0NlNtTDh4bitoCittQ080T0RXeXhydGQzQlRyQVg4OTl0VHVhWm1Uemg5eFlBMWIw QVdBbXd0WEgzMWtJa2RyS2VsUGp0YThBRlpQCitQZnBNWWVrWDVENktUd3VKSk1OZkUxTElqU3h6 MExIMFAyaldzeTNZT2I0QmlxTVI0OUFTTWV3VW0raVlHYnVQCitITTd0Nlp0WWJuVm44cUE3V1JW VUpnMWhSWk0zWVg3eWp0cVpqSXh0aUJhdzNWUzRNWFNqanRWb0xBdmowbVhyCitINUhqcnpkS21o YVJXaDhDRVZUMk01ZllNS1BNK1N5VUxBaENzZDJqSm13MzVBM2krWnpmQ29XOXFlOHNzc2NICitU MVVzU3FjZTVSblpnckhGVm8vTytPMnhvUHRRL3J3Q0FTZ1dLVU05bTFrS3gzREsydXEwNjJ1dWVp aUZsOEVYCitwYzdWSzRKSHhPUU1jYmJNalg1WmxkMit5YkJOOGdMRjU3WTVnQkRwMlZIc2hvTGpT VWQ5YUZaK0Z2cUhvdTd4CitwaFljMEdaSlJtaW50SmFOUWJHNWpOQnoxYnY1K2JMVlVZNHFqTHl4 NzJYWDhmeEd4QzVCT2U5dnpYTVNoK0Z6CitOOEp0ZlJUZzNCQ2N2QUY0Tm1KUTVMUHdRKzV5eGho TG5uNmpJR1l4WDZERms1SGlCQjRteUpDWFpqbE1hazE3Cit4dkVrTU5rdTBJaGhFMjAzczdCTXFt VmZUVGQ4amYwYTZOQVpJTEdLdG8xOVh6MG1FZlFoMWE0VlUvQVJFcDc3CitlQmNFa3hNY3JuajFH d0FSQVFBQmlRSWZCQmdCQWdBSkJRSksyVG9LQWhzTUFBb0pFRk05N3hWZGU3eGE1MDBQCisvQTBa SnYzc2cvVVI5RUZabmdwVUp0azE2c2J3L2Vaekd3TW5KaXA2SHRmaWdVOXVxRGJQdTE4RkJlTFg1 MmZFCit3alBEWUVOTjAzWGt0cFhNMXhFWjVpMUNYTllqTjF4VXdSSXVwK3dhMjFHblE5VHhRMytC dHMxeGxmcmV4NlByCitwSU5ONlRYdVdQbFVKMmhlb2JlZFJoelBKTndGc1dFb0RwUU5kVS9oUG1B UW9tY3l3T1JtcDM1UmtWZEZZL3BXCitXNmVvTEFqZjl5Rk1UdEpuMWZ5YmJ6RVNreHJ4UUxMR2Fh aGNDU1ZRMFNXWUsvaGxDbjMvbFhuL1B1OEFlL0ZtCitCUGR6OTh0R0R3Nk9maDY0REFYby9vczRG WXpJTkNrNkFjMmFGeWpWamNzQTcxZDZXWjlNeTk5c015bHRkSVlBCitIckZjcWpYbTg1NUFieDJK TnZRVlZFZUgwME5neWZENzExNTQxclg4amhuTkpjK2g2UVpSbHdJR3ptV1kwWFNXCisvWGdiWTNB QzZGRHdFTW91RThqZTUzY2N6YlpyTEJ0d2ZsNzlQUDFjaHNkTkFwVml4MHlQclJYOEszNmVPdU5M CituTjJLNE9Ba1dRNFZpNXNad3pYT3RSYm5TUCtqNHozeUtPQlRWaTRDekVkMkVibFRvbzlmMXNh TFAxeDFZYmh1CitKQVlaQm4yTWdaaEVTMW5hUHhRQlhGL3oydGdlVW04UFc2ZjRmajY2TkNxMElw eWI5cHNvQmh2OU9PVXVsaXFHCis4bUdURFJVd0tyanJSUWFzemZzV3dTL3hIaXlkMVpZOWRiOE5h a1hlbzQwM2FRdXF5cldEVTU1azdoMGd1aHdsCitqV2VQWFJOaHdueVBrSVY3eTc2cWN5TGNXd2o5 VzAzVS83U1k0amNxRS9NVworPU1HR1MKKy0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0t LS0KK3B1YiAgIDQwOTZSLzIzOTJGNUYzIDIwMTAtMDEtMTUKKyAgICAgIEtleSBmaW5nZXJwcmlu dCA9IDMyQzQgMEY1RSA4ODc1IEQwMzggRkY5QyAgRjMyQiAwODBCIDcwMTIgMjM5MiBGNUYzCit1 aWQgICAgICAgICAgICAgICAgICBKb2huIEJyYWRsZXkgUGxldnlhayAoQ09ERSBTSUdOSU5HIEtF WSkgPGpwbGV2eWFrQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgMjM5MkY1RjMgMjAxMC0wMS0y NyAgSm9obiBCcmFkbGV5IFBsZXZ5YWsgKENPREUgU0lHTklORyBLRVkpIDxqcGxldnlha0BhcGFj aGUub3JnPgorc2lnICAgICAgICAgIEI1NUQ5OTc3IDIwMTAtMDEtMjYgIFdpbGxpYW0gQS4gUm93 ZSwgSnIuIDx3cm93ZUByb3dlLWNsYW4ubmV0Pgorc2lnICAgICAgICAgIEI4NDUwOEVDIDIwMTAt MDEtMjYgIEJyeWFuIFcuIENhbGwgPGJjYWxsQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgNUQ3 QkJDNUEgMjAxMC0wMS0yNiAgTGVpZiBIZWRzdHJvbSAoQ09ERSBTSUdOSU5HIEtFWSkgPHp3b29w QGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgNDI3MjFGMDAgMjAxMC0wMS0yNiAgUGF1bCBRdWVy bmEgPGNoaXBAZm9yY2UtZWxpdGUuY29tPgorc2lnICAgICAgICAgIDY4Njg5RjA3IDIwMTAtMDEt MjcgIEdlb3JnZSBWLiBQYXVsIChDT0RFIFNJR05JTkcgS0VZKSA8Z2VvcmdlcEBhcGFjaGUub3Jn Pgorc2lnIDMgICAgICAgIDIzOTJGNUYzIDIwMTAtMDEtMTUgIEpvaG4gQnJhZGxleSBQbGV2eWFr IChDT0RFIFNJR05JTkcgS0VZKSA8anBsZXZ5YWtAYXBhY2hlLm9yZz4KK3VpZCAgICAgICAgICAg ICAgICAgIEpvaG4gQnJhZGxleSBQbGV2eWFrIDxqb2huQHBsZXZ5YWsuY29tPgorc2lnIDMgICAg ICAgIDIzOTJGNUYzIDIwMTAtMDEtMjcgIEpvaG4gQnJhZGxleSBQbGV2eWFrIChDT0RFIFNJR05J TkcgS0VZKSA8anBsZXZ5YWtAYXBhY2hlLm9yZz4KK3VpZCAgICAgICAgICAgICAgICAgIEpvaG4g QnJhZGxleSBQbGV2eWFrIDxqcGxldnlha0BhY20ub3JnPgorc2lnIDMgICAgICAgIDIzOTJGNUYz IDIwMTAtMDEtMjcgIEpvaG4gQnJhZGxleSBQbGV2eWFrIChDT0RFIFNJR05JTkcgS0VZKSA8anBs ZXZ5YWtAYXBhY2hlLm9yZz4KK3N1YiAgIDQwOTZSL0QxRThGMjczIDIwMTAtMDEtMTUKK3NpZyAg ICAgICAgICAyMzkyRjVGMyAyMDEwLTAxLTE1ICBKb2huIEJyYWRsZXkgUGxldnlhayAoQ09ERSBT SUdOSU5HIEtFWSkgPGpwbGV2eWFrQGFwYWNoZS5vcmc+CisKKy0tLS0tQkVHSU4gUEdQIFBVQkxJ QyBLRVkgQkxPQ0stLS0tLQorVmVyc2lvbjogR251UEcgdjIuMC4xNCAoR05VL0xpbnV4KQorCitt UUlOQkV0UTVQY0JFQURBellIRWM3dzdYQjRDcUpPQ2U2Q2hPS2dNN0NmWUlBV053WnREUW1jbVZt M2NkRmE4Cit1MTluZm9IbTFHZ3pCdVE2cmJqVFBlNW1pSXpJQVZ4TkVXdTFXUytkaytmN1JvTXl6 ejFjM0x6OXJZdUtYeTNtCit1cXNUVGc2RlRBRytGYjU3TDZTNDBBSkMwbmZUSUNEZW02MDhUZmVG TGJvSjVMUFlrR3VoQUFlU0ZNcnR4aXhjCitIMTRrc3NuZ2svNW4zSUVoN2xyK1Zpa0wyeUFSNDNN MW9pclV4M2dQbDBQdXhuU1dxd0dUWTlBTWVGWlkxNFpnCis1a1M3ZFhjQmpESW0va1BXTENmT1NT M0RVcEFFcVVaem0wQXI5Q0RUMkNjNTU0YkdLU25pZEJnWTM1RG5MT1pLCitNNzdxVlZlRlEyTG94 MURNUHBDeXVJRlZyajhqY2k2OTJ6UnBtaEZMQ2NTQXdVcUlnd0dKQzYvZlczeUtuS3cyCit0SW9h UE9TUmV5K1p2cXdTMzNRbjFsY0R2WXZwYXF1YXVJU2xYT0ovZGVIajBaN1lrcmVOV3hWeEtEQjZh TjNLCit2eUJqelJOZ1lCdVI3Y0kwanFSQVlGcmZWSWJLblNJekViU2pqUmRuaWp2WG53cStWZHI5 Z0xUbnczRnVBNVVMCitvMm55d0xQN3o4TFJKWmozQlVrTXZwNWZMK2IyUDEvbzFnR1h2Wi9ZMjY3 NXJPc0JlR2cxbDJRSnhFOXRTWExVCitwQVd1WUJUNDFpYWhGUGE5d2xpK2xDTzZndHdPSlFBMG5x VUhhQ0RyVHJvUmt3NnRJTTIzWHZycTBLN1M3TzNpCisyMTE0Nm1Oc3VyV3djcmk3OWFPR2dUdXRG a2luS3A0aFZZTG9ScnZXbEJkQlNPTzB5dXlsVzBNNm53QVJBUUFCCit0Q2RLYjJodUlFSnlZV1Jz WlhrZ1VHeGxkbmxoYXlBOGFtOW9ia0J3YkdWMmVXRnJMbU52YlQ2SkFqY0VFd0VLCitBQ0VGQWt0 ZnVEOENHd01GQ3drSUJ3TUZGUW9KQ0FzRkZnSURBUUFDSGdFQ0Y0QUFDZ2tRQ0F0d0VpT1M5Zk51 CitXUkFBdDAvMDI3R0RTU3Bnc2NiT2ZSZXVRU2kwR2F2V3hheWFHUHozMkxiWnJpaFdYN2NLaEg5 QVE1aVBmenQ2Cis5S0NJWFY2aUZKbjcrS2VhenNFNW1hNWg0SnFRVXJOVDhTUzQ5YmFNRDJ3TFYz NGhncmpFT21qSWEwVnozSFZ3CitpT2xGR1BqL0MraE10VWZ3U2FNUnN3bm82Ky9LZXE0ZkhsbVEz WUhidjRHc2NudlE4cVJWZ3ZkMU1GU0RZRjB6CitjQXpCVjhuT0M5UkxtTmV5clkrU0VlQ0JQM0RC WmUyU1JDRFFaTURNWEFDeEJuRDBPV0JWdERFSmtPc3hzNzN1Citod1pXU1FKNnBFaUNBMzc1VWdt ajNqYUxJRkNxWm0raEMvRnRVUDdGVWJ5SThaYWFoSExnT2t4d1lkUXV5R1JYCitYc1FpZ2pINGd6 dFBsdHo2QUZ3clJGYUpQRndLL1A3enBESk5nSXUwYWpPOElDYncrMk5XRU9ZTFFGei9GNHgzCitT MWVXY0lndkFremZHcEhPODJsczBQcWJ2TWFPeGVxSWtSeEtpTDJEQ0FSenpQUFMrWFY4bmpMR0li NFVjSGJuCitHU0dqa3JQbnU5WmVMVUt6enkrMVIxN2plVXMzTzQ3U0NPNWdhWDduTTh5TngzSnhq TUZ1K1gxODZaV2gwL3k4CitIWjJZQzRqbVY2UGcvZWRDWWFzZXAyTUNLb1hMK2FJNWJ0ZkFycGtt blVXNlkzcUdXelJvTnp0V2wxR2U1ckZLCis1ODhBVjFKcHVEWUZDTmR4U3Y1UGdYd1ZwOTRwWDVj aWRMNDFEV1BLazdFME9YUlc5MEFCbmNIQUJCQmNLQXVQCitMZVVLVVl1WThCN1RJVVdLUFB1ZkhB UmdHdXQyS2JjT090c2FreUlObHlJeDllbTBQVXB2YUc0Z1FuSmhaR3hsCitlU0JRYkdWMmVXRnJJ Q2hEVDBSRklGTkpSMDVKVGtjZ1MwVlpLU0E4YW5Cc1pYWjVZV3RBWVhCaFkyaGxMbTl5CitaejZK QWpvRUV3RUtBQ1FDR3dNRkN3a0lCd01GRlFvSkNBc0ZGZ0lEQVFBQ0hnRUNGNEFGQWt0ZnZRa0NH UUVBCitDZ2tRQ0F0d0VpT1M5ZlBxaHcvOUhlWE1pTE94OVRHbzBXZTdaaUtPUnFUZ1RzVml6UEdw THZONE5jZHRXbjJ5CitWUnlub3lPbVRKTE8yb3krTm1WVU5NRWlNSEZ2K3RoeWZJd0tPNzJkTUNF d1pxL1JKdm5JUUgwanZQQlZIajk5CitvSXAyT0VSSitrbUIxUjk2a0Q2OHFlU2NFNnRLQlpFMlJt bE84OElDbzZSR01jYTNjYnkzZlNReWcxZkx6Qk0vCiszVFlTSDVzYXRDOENKZWQ0M0UvNTVJVlhl T2NEV3NyaHpsUWtzWXhxY3psUDFtNmJyZHN4ZXkvdGtKck9pQWVQCitmZmhHMWZiUjY5eWl4WXhZ QW9BNnJrck0ycXlYdEs3Q05Id2FQMlVyb2IrUDR5VE90bjlkTzRWQ3hWc2Yvb3BJCiszcXdtTURl clNmSXd5M3B5MXJyOG1sWlNVb2NkOVlwQ3NieGJSQ2tCQXp1NTJuQWczbG9sdUtuWldhek9YTHRz CityRzR2emozcVQwNmVWdUNBdnUrNWpPcmc0eEFaK1hkelNlWjJWdUNiemZHaSthbjhhTnZsaVA1 MXdLenc5bHorCitFeWUvMkxOampDeWJ3bi9QbkpiRU1oVDFNU0FNa2hyb0IydWJFVTlQay9OMmxZ Zkl0eXpKdUU5dkVucjZtdWVmCit0MGs0bkpOTW5KZG5IRGRkUVhJZ2tTMkY0dlpvVG16czY5djhP RVIxQVJyRnVPQlpnMWNDeXhGc0FPNHZ1Q2RVCitVaHBhSmhEOWtjYU5Dandyb25sTlZCSy9rWjFv QkxPcXdCSGtUR0ZzalUwYWJReFlscTBsdzhUSFNXQm1HZlNOCitaWmNUdWZEU3RCaDB6NEFCQXU4 MnZidlVRWmpHMVQwNE9JT0NoWjJCM3hBY0ppWmFxamRhb2E5VEVBaDRveFdKCitBaHdFRUFFQ0FB WUZBa3RmYmVZQUNna1FHVDhZQ3JWZG1YY0lXeEFBdkhmK1QzZGhiRjgzd0FKNmFVUko4ZkhECitF dUExRWlzem02bWdJQWN6QW1pRHArcDhYTXZqZ0hpR2tSdTdCbzZIUHMvUTRtMXREZFpyRHZYRFNw NGRjbnY3CitsVE93NDRnclZJQ2FTSkZXRW5OQ2l5eWpDNnhFK0RTb21NY1d5UEVDeUdBRGtSMDdv RnBSYjlhTDRZZW9rbnJICisrdUxucFdIR1hUd0NHODZ6WDRlSEhOY3BhcFR4YlFDc2krZkh4RFRH aUV4T3pYRTNOeUFMbC9iOGpKc09vUU5jCitveDhOYXVDMDRqa3V2TzlKWHN0UjdiM0poUnFMWjZH WVZQd01GMjg2bXBFbjkySUtBckEwd0dRa05yQTVpVGM0CitoSzBJRC9FMmI4TVU4cG5kZlFlY2Vj UTdRY3Jvc1VTUTdvWkgzTTEvZG90TmFjSUNvbU42RlV1NGVUdUtFbjI1CitsVVdodjJJU1VzcGc2 Nld2L2FHaWh5eTg1c3ZCd2ZsT2t4NTIzNHFOSWR3T1VlSWJjU29waHNKbTdDOE5nci9PCitsdlR3 MGxicnJHMDk5VUcwUmhGdG5yaWNIZTAwRGJtZ3djZWJpcDZZK21zczFvUXdGcGV1TVdQc3F5bHVU NXZjCitVblBzR2ZOUGY4M21TeFQrSU9DSzk2UXh4MkFWRDc2RFpmN0VPcVorV2pRbWNTZWdFSDRN cmp0S0ZPdjlzbWI3CitPS3ZVZi92SFh0RnRKK1B6c0NLM01jaGxaS0syUWFqdGlZeXptMS9pVHlq bHM4eU1xYTNyeEVqYXFQaW1XUVd3CitZYjlyNlQyb0hqQWpud3VoSFpXc2R5U1VSQ2VkeHJJUkdj Nzg1bnVlZXZ5b0NOWnhJaTdhQ3lMUWZ4WnUrS0Z3CitSOXF3WHpPUjRSaFN2czVHZUdLSkFod0VF QUVDQUFZRkFrdGZkNFlBQ2drUVRSVkJFTGhGQ095YlFRLy9mMi8xCiswTmZ2QnFLbEVHRXVZTzBj czlZMHJ0emxCd2dJS3pzMWFnTUZIclhLSEJuazZKalRjS2Vnc2tEVldjaFhNbStICitDMUFyZUxK bUxYdjZOV0JpOHp2bUk4Qk9rZ0RTUFhscGRSZUZRUWVkMGhNcENwVUViWS9hZ01lVGpPWVVLbHdp CitqVlR2QUlUSDhLTzlqVjVSdElJRTE3ai81VEhQMmdKNyt1YldodkFwUTZtSVg3SGVRNGs2aGJD UzcxRno4SlQyCitNS3JkZkE0REkrUXlDY0h1aVIyNVF1OS9nMzY0b012R2s0ZEh3UHo5b1ZhL0s0 am9sd21SaFh3dmE0SElVeHlzCit6bFFOemY5SHBudFJmWDVCZTVoOEp3Tm9BL01OQnBnME5wTHJV ZFBoRzFPZC91M09SMDd4YjZVS08rWlR4bnc5CitBekxsMVNtdElMelBqUkJpMjNYd1N5ZUZoRTVP VW5RQVRIeEZwUHowVFYxWU44TFNKQTVBVVZObU9zZTBEWUR3CitoOVNacklzbmQ5WDdRVGx0K09F V0d0NmJNNkdrZHViVnVFcXNMeWZwbGhabVVYTkdxUlIvNk1DL0paV2xpRkNyCitzU0h2c2wrMWth bTV2TTNNTHlBUHM3NXduMnVQV3p5ai9CV2YzY0xPUUZVZjJDc3ZwbWgrMDYwU3Flc1hQM1VoCitL Mnl5cFpTMXVLeDI4T2duRGFZWFBkdHhkT29VNXptZ1o1bVZ5UWwramExZXJnYzAyNHJHWDMzcERh R250YnVOCitwWUFSbWxlRjdXSlhmVmJObUxWY2FLaGpZUWdJVDZtM3JjR3h3VDNCUVVNMmVwTm1Z bHBzd3FrL1cwNUZtck1GCitGN3BEVHFRdVJ3amg2aUVzTWU4VExZNEVtT1VzQmc2K2pMYmhGV3lK QWh3RUVBRUtBQVlGQWt0ZmJaZ0FDZ2tRCitVejN2RlYxN3ZGckEwQkFBaWs0K0UyamRsVE82TkZq QklHNTB5RVpBVENCalNPUVRocUU2VjZBN2NmR2hSQk9KCis3YmlxeDdjS0FzVURQVFVCanVISVVs a2t5U0o5Y1VpM3RsM0ZuZEFmUU43VTU2QVRuci9PNnlDalQyQWdpS2E2CitpVXdPWnJoQ0lGckZT TTVwTGRrZElPM29LSm5PVVY2cUZORXBFTWZUZjhySmFPSTlBSmhvVjc5dHV3T2JVd2htCisvMHN4 TEFxQmJaVmdocmUrelZTUTFXMk5kR0pqZlQxVW5JTEZkRElkZ2tkWGJzTk9lcjhZREcrTURTeXZy end5Cit1TXUrMTNHNndNU3FzVWNWNDFTOGs4MmZWY28wKzZleFRoSlQwSWRnNHZrdzRBdWo4TmEz cWVPOEdmSGNyL0wwCiszVGtZekhYdGEvODd3bGxCZ2RacnEzVElqTExuZUNNNXlhYU1WK3RlYVdt WlJpckE4YjRTMW13QldtVldXTW5aCit4Umc0Y1dQR1k1eDhwbzJ1M1FQekl3L2wySlhrR1orVVJy QklQcHN0TG5tdEorNkZaNWVkTmVPWjFvMDFYdDRkCitKUmdvUS9XQVZScE1pUWNZRWNSL3RhOXdX d05renBlTGk2ZVR5TUxFZGQ4M0VtRjZldHFQZ1JjSmZRWWU2dTJsCisrNklXQWppNmdVR25yenNw NzFBcHVFNzEvdER5QWlXRGVZTFBZWnd1bHdzNGE5UjNtUkF3ckxSVnQ3UTNFVTA0CitOemI5N3pk aVI3R3dwY3lqdnVFeEJZTXNZdi9na1BuVHN3azN6Y3JwRVU2eDJ4cHB5OUNFSWxNOXVxZVRNV3NB Cis0S2cvQmE5a3NvV2dIQ0FlbnAvTEs2Qk5aUTVrdXlWTWw5czA5ZEdwQURXN0x0R0xld3ZCSlFm dGZIV0lSZ1FRCitFUUlBQmdVQ1MxOW4yUUFLQ1JEM2lIWDJRbklmQU5DaUFKOXRyMU4xVlVocnc2 R3FGbnNJc3VwRnVQQW9LUUNkCitIZXVFdmJKWHJ1b2IwMlpKSGxXVlNEYldmanlKQWh3RUVBRUtB QVlGQWt0ZnQ5d0FDZ2tRazR5eDJXaG9ud2VPCitpQS83QlM2U0wyWFFpRkF3TWJuOW55aVltaVo5 RTFMOTNBOVpjc0pnSnlIa1BzcWZwc3JNSHI3M1hNelRpeHpNCitYYVNibTdCRDBJNG5RUGVNVks1 NkxPWDlTT3I0UWpqYnd0dFI4MXNoOGVjODhaak43Y3A5M3BmRXJJc0FTQm40Cit6N1VZUy9zM0FD MjRhczZvcWVldVgxZ2NMeitkZTZ4Ky9sbDFxWVo3MVhCY1p2cWRHQTJxRk00dG5OQkdnbUJPCit4 VTlLdDdDQXRJNEhjSmF4cmphQlZXczNGSjFPT043czVxS1c5Rk01WDRuYk9tWjMveldSdzM5Z21p NFFyOTNvCitQSzFVb2tpaTcxZ05qYXVRalF4QS9PNXFsT2o4Z2F6WTFsWkp0K0lGcjZmeGpzRU80 UTJLWkR5NW1BQ3RTTFl6CitEcUtDMm9mZkRrR3gyRy9MSkswTGlMZG9GWHVIWllObHJwOGJXQkIz bk5rTjd0aTJtUmtIcTVxaTFTeS9tdlZ5CiszaWdxWHVxUXZsaFNoQXE5aHlxS0F0Q21qZ28wdFBs Z1VLaU5VZXdwRGlTNWNKRTlqN0tBWHd5dnhWZFFaQWRYCitadDJyYm1SbkpWRVpjRVdlM2tPbG9T VDR1SjR0Vko5ei9Ea29UN0NBN2xDWTBHbnd2aWY4WFZkaUt4ckxjNkhuCitMZlpYRmlYcjBzYllO M1BSOTJDRmg1UHEwUU91R0VIaWN2MFRFTGt2RWdqSm9ld0ZBRk1Fc3NKbjNnVFY1cTJHCitnOW52 YndsSlNFa1A4c09HWkI1UGx5Q1VRTkh0TEFzUE5SZHVYdXlNdkcvdTdXSURTRzE4dVJTNWRNZXFC TlRyCitSaTVLUTcxZXVuYW01K1RDOWg0RzdaOTNnWk43QTJ3Smk4cFFYdjg0VElQeHdRV0pBamNF RXdFS0FDRUZBa3RRCis1UGNDR3dNRkN3a0lCd01GRlFvSkNBc0ZGZ0lEQVFBQ0hnRUNGNEFBQ2dr UUNBdHdFaU9TOWZNdDJ4QUFubXg0CisyZ0xSZnVETEc5VkJzSzlLUjZ0aDB5SXUxMFh1bkZPSzFs ZllLRHVQZURzYlNSWUwwMmJpZW91V2lvb0JCeDNXCityODRuMkplS0o2WUNOOC9yNjVIREpwWjh1 RVptSG9ydThPTGd4RmhLMDZWUDhSdUl6Y1liSmVlTEtIT0lkMXI4CitqOWpXRTRLSEpvWDk1Ukdw ZG9MeXRlbFlYa09tSTFRZHhLOTkvTmJpTlIySWNNeFFYVTVQd0JBZTd3cmJoSFY5CisxRWxjZ3NL eUpkZzNQS1V1dmlwdjZtcHRGVTFkeCtzemNnaWlaT3lFRHBGV0F4YWN1VCtuVVBUOW5IRUZDc1Bp CitNQUpDQzYramhQaHgrbWVETkxlNk1McWNUZDUwc0tkY2lYa1hyenIrK3AwS3Z4anFENGxKcVY3 Y0ZCMjdqY2Z6CitpWjNSWUN5SG5qek5YT3g5aVRJaTJsdld0cUxYOTU0M0N2dWhmZXU4SEF6aTJy NWhaWllvMXJkejZjNUI1NW81CitGUWI2WEgzUFVIWHFrR1NabG9jdDVqWENXRFZJZVZTQjBPNjJn THdDV3RaQzYySVNxVGJZTG40R0s1SVY3a1JxCitZZXhFQTlUNU9TV1QrcWZmMTB2U21NcS9GUFRK eFBoUFk4bkhTTzRRUmdicUhhYkp1ZW5aUzdLc1I0enhaa1VFCis1Q0ZZVURBakN4bDJYeFEzeUgr YlFnV1l2bTdRNXFCYjJ5VTlmNTNYaUFiM016Y29hOVpRVlpDZ0lWaHZvQXJwCitzWVJNbkxYL2x5 YnpQcjlGK0tFOG55SmI1Njc1d2xOak5IWlQ3M2FSVWt0UGl6N3Q1K3dUZzNVcU9JZFFWeDRtCis4 Y0RyWWNCaDgzMlhld3RGczF1dW45bTJucE9Qc2ZCMEhNRFZwZXUwSjBwdmFHNGdRbkpoWkd4bGVT QlFiR1YyCitlV0ZySUR4cWNHeGxkbmxoYTBCaFkyMHViM0puUG9rQ053UVRBUW9BSVFVQ1MxKzNZ UUliQXdVTENRZ0hBd1VWCitDZ2tJQ3dVV0FnTUJBQUllQVFJWGdBQUtDUkFJQzNBU0k1TDE4MlFC RUFDMGNpTnphME5sUmtLZjZXcS9OQmdJCitTMzU0T3F3SjJGQytBUWN0bEFYSU5iNGlVejZIZFM2 LzhlcExYdU85NlU4S0E3aVpxd1I5dm9qNWk3RGx0dWlBCitOaVYxaVRIdWZXUm5GOVBQcDJLYmd0 b3RKL1lrWDIwWStRWlpRTTNtUUpPZVdNOXF3Qkd4aUxMd1VmdlJtV0FGCitzWTBiRWpveFR6ckxD TUo1ZGcvdWZXYXFoZE9iQVAzSjBNWXZtSHIzY2tqNk0zQ2RXN09HdERDZllSSEJrYUx6CitkeC9V c1NpQ0lyaUN2a2ZWNVVCR1VuWGdIb2J6dVNvSkE0cVJ1QzBvR2EwNFpqTkpQTTdIb1ROL2dzYXVR cGgwCitvbTRhaHppSEM4em5BNVNXQ3FqOXU4eW1iMmp6U3RkZXk5b3RoNWkvUTJPK1Z2OWFVekdP VVBza3hzWUpHc3VhCitVbFZUMVpTeTZ4NVQzREg4U1NyOFQzZkxJUHdiSnlCRlI5UE1zSFVGb1Zo K21Sczlnc2VOODF6Mk9zbEdkNVNFCitjSFlWN0ZKNDBFWHZaM2k2THpsRHdVRVY0Ylc5ekxaQmdQ RjUvY1pwZVhyTXRhOWtLRW83d3JLazVSQ3dXaGZjCitNbmdQekorbVZsVnUrM2ZpL1UwY2liWHBz c2FzUTBaUDRwTjNpSEdwUEZjMmxCUzFMTWZmL2k1dWsvQXc1TzZNCitjNzJtaUMwaHJpMmZzWXI5 WlcvYTdmNldVdjJOMjFUUmxTWEJHa3RaNTRGYXk3YVZaamdsOXM2dkNHQU5idGx6CitqZ1BqR0xU dXhKbFJuTWFuWlM1a0NlTHppVTFoSXQ1NWQrT1ZXYVg0T3pwaEJPTzZ4N0t2NVg1ZjlwdDVjTGd2 CitnZWc3UjB4RndoaURlMFJSSFY3NHpia0NEUVJMVU9UM0FSQUF5NlB5ZTVFSEhER0haYWtWNi84 dlFrQnh2UHV1CitSTU1wV211cXQyWjdwWThFcnBYdFlSWlArNGhyODBBYkFsNU9qaHdyd2gvYWlI Smx0NUtoTzZuVUN2MWczV2xsCittaUczbzlLMTFha0w0OG9FcjdSWktncUlySzlwSWFpbUZ4Sytv dGoyZUtmK3RtYkFiUFhaVDNZUFpMcng1SXhvCitiVXI0bE44YlVNSURtVGZxMUV2V2ZPdGt1LzRa ekVFY0VpTzZjL1d6RUhpOG5DVDJhQVBIS1YyOTRxa0REcEdLCitJTDk3eXF2d3BZUUNPTkF4bWQv U0Mrbmd4bDhQeFd1a1lqTkxvRXMraDNUcXR0ZEFpcnFrMWN6bG9IVi9VMEdCCitKekRyRXcrcjdt ZklucnFRa2ZhUS9TeWFkVWEyZ2lxMVZTekNaeG00QU9vZ2hCcHg2eEg3S2Q1akt6ZFNpRFloCitu amxSZS9hY3duTFgrRU83cEFYc1FLYkw2OXNGRTZqaHlkVFVoTnVEdS93NHRSajdXZUlwd0dMTEsy OXZPSUJECitLZmgydmp3TXk4OGNJeXZ5cEpNalIwOExablVBOEJPOUdwWnNTWExGNkRkRTByRWZK SXEraXlMZUR0bXJhekRCCit2bWZmVGVmVVI3KzZlaE5CRDkrU0xDb0hJaXEvWHRNcVdKVW95bXZ4 SW9ZVWRpVWZmRmoyWTlTUnJzTkdQOWZOCitmM3dJL3BkWXhmN2hhRG9INFk4M1FTZEhFY25DWXl3 SHpIbm9NYSs5am1uR1pjZTJwWUp1cDdWanFtWFFrbWhWCitqcEVPbXB1RmY1V2ZteWNBZThiYWJY YzJCSFh0bnRYeHNnZWw4NElVcE5DUGhzZXh4QVhibDFrVmRHWlZDd1dUCitxOEJaeEhubU9ZWTg5 ek1BRVFFQUFZa0NId1FZQVFvQUNRVUNTMURrOXdJYkRBQUtDUkFJQzNBU0k1TDE4NzgyCitELzQ1 MGhQcGNkZ1UzdytOUUpjVWlub3VCK1Nqc09BVnBENTVxNk81RFhsVWY5YzNJRUlxSFR3S1VhQkEx K09HCitMTzNNVnVId20rOGlQaE05SUlCMXJmUmlKd0ZhLzVNWG5ZMDlrMFB1QUFlaTBSL1BQUjh0 QVFrY3Rza0w5bWhECitQV21KdkU0K3RJbzVpYVJxL3hucXBQaDdybGZ3bDJ5M25IaTV2ZDlqenY1 U1dnM0RBZXU0ZW9NMkl5OExEeEM3CitTWGQrZnFuZ0x4OFhHWmV5SW1GRUFhUWQ0SzNRWVo5UEJT VktJV2NLYjBPUUs2RjltSFdwbFV1bnJjdjVncEZHCit1eFI2QWtUajRmQXppaFlPekZoeCs0djc5 aEtpVzloa3pCNjNqSEh4cXQzRGJ1QWg5b05kRExNMGRZNDNYaGRsCis0REZDcnZXWW5FZ3VNcmxp Y2ozcmVRM3B6dUNWa0lsdEhTSUFjc0N4VFhpZW0zZ2ZQcjFaRUxZMndHVGlkMXdzCityVE85TldY TVhFKzF6cWhpc1I0WkxsVWh2MjY5TUZXMlU4NWJzVmRjUlNoR1FjbkN0d3ZtUmc4RDFWNW51RS9H CitaekFHSXBLUW9KZVFFc2d0eUYvVGFHQUtrdUVlWmkvR2kvWW1keGFYRGd2aTBtU2pIU2hqYVh4 YUQyNGE3ak0zCitJdVUzZllCcnlYVWpNOFhRT0FkTWxidjJDelorVW9qZWFhdVU1YXJGY1BaQS9Y YmlpM0FNOEVTb1JOMnFTZkxaCitUa1dGYVVyOXFTRHpGbnVUUWpWb2JEUFFjK1FsanI4U2pxaGMz RTVibHlOOVE5NDc3Qi81UGNXK2FycHdyK3hvCitUMy9RcHZnbkFxZUZkVGJDek5XeTlGK3ZBMElZ dnY1Rmo4bkJJQ1F3Ny9ENHhBPT0KKz1YTmRnCistLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9D Sy0tLS0tCitwdWIgICA0MDk2Ui9CODQ1MDhFQyAyMDEwLTAxLTI2CisgICAgICBLZXkgZmluZ2Vy cHJpbnQgPSBCMjgwIDFGRjkgRDc1NyBFN0M0IDZEODkgIDBDNkMgNEQxNSA0MTEwIEI4NDUgMDhF QwordWlkICAgICAgICAgICAgICAgICAgQnJ5YW4gVy4gQ2FsbCA8YmNhbGxAYXBhY2hlLm9yZz4K K3NpZyAzICAgICAgICBCODQ1MDhFQyAyMDEwLTAxLTI2ICBCcnlhbiBXLiBDYWxsIDxiY2FsbEBh cGFjaGUub3JnPgorc2lnICAgICAgICAgIDNGMEEwNEI2IDIwMTAtMDEtMjYgIEdlb2ZmIEdyZWVy IChBbmdyeVBhcnNsZXkpIDxhbmdyeXBhcnNsZXlAZ21haWwuY29tPgorc2lnICAgICAgICAgIDY2 MTk3MUJGIDIwMTAtMDEtMjYgIEJyeWFuIFcuIENhbGwgPGJjYWxsQG1pbmQubmV0Pgorc2lnICAg ICAgICAgIDQyNzIxRjAwIDIwMTAtMDEtMjYgIFBhdWwgUXVlcm5hIDxjaGlwQGZvcmNlLWVsaXRl LmNvbT4KK3NpZyAgICAgICAgICA1RDdCQkM1QSAyMDEwLTAxLTI2ICBMZWlmIEhlZHN0cm9tIChD T0RFIFNJR05JTkcgS0VZKSA8endvb3BAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICAyMzkyRjVG MyAyMDEwLTAxLTI3ICBKb2huIEJyYWRsZXkgUGxldnlhayAoQ09ERSBTSUdOSU5HIEtFWSkgPGpw bGV2eWFrQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgNjg2ODlGMDcgMjAxMC0wMS0yNyAgR2Vv cmdlIFYuIFBhdWwgKENPREUgU0lHTklORyBLRVkpIDxnZW9yZ2VwQGFwYWNoZS5vcmc+CitzdWIg ICA0MDk2Ui9EREIxMTM0MCAyMDEwLTAxLTI2CitzaWcgICAgICAgICAgQjg0NTA4RUMgMjAxMC0w MS0yNiAgQnJ5YW4gVy4gQ2FsbCA8YmNhbGxAYXBhY2hlLm9yZz4KKworLS0tLS1CRUdJTiBQR1Ag UFVCTElDIEtFWSBCTE9DSy0tLS0tCitWZXJzaW9uOiBHbnVQRyB2MS40LjEwIChHTlUvTGludXgp CisKK21RSU5CRXRmYWpRQkVBREFtV3FJSmt0Mk1Qam1aSjlSbHltQUF1T2N2SW1CNUUzY3ZwV0Zx Vkg4aDV5Y1MzTkEKK1RUY3ZvbVNuSUxzaXErTk0waC9KM0JkM2NjaENOQTB1dVhXMUNJRFk3bUdy a1BkWE54UVZ5Z1lZMkwvdWJBRTgKK0VkMXUxZ2h6UFVhTVl0RmY3UUFrNFdDcGdsQmFMMmZySm1m UzkzQUlZT0FJdVYwenc4K2NlOHV2VllTdDdhQWsKK1d3OEpLbnBXOTFuTVpyM0dCVGliaHRoQ21M Y0RXSXludFIyZ1l5UFg5TmRBQVZpU2ZrbVc4ZWE0ZHRiWGZ1OGoKK25rcjdEbmJzUXUrdmwyOW53 TG1JM2gyamNnVjZRa0h1NDBicmVZNU5iRlNUVm15eUJnTTV5SDNjVms3eFZJR3YKKzFydDBROUR2 b2Z0YVNpV24zVGNYY3JuSG5XVlBUbzFWTStrWUhUOUo5cDZKU3haZHJjQXlTUjQ4WVp2Z0RYVEkK K0JDMnNOQ3RXL2dIQzRpTmR4V3ZPWUtETzd4djlmTHdlcWlVTlhpL0J4Y3djQ2FwWU41eFpFT05G S1ZWUnZkNVgKK3BjcjBoeHZpTmprRC9Ha1dUWUV0M0VxaG5BR0RPd1FjNjBEdHl1WTF3ODJiaHRJ aENtTmNuTEFVRVhZbEpNWE4KK2lQeTFvd0t1WTBFQnQzVk8zS3NJNVJxWlRHZ3ZZSHRCMlhwbnlS THV0bndBc01RY2VVbDNyM0NNUm9OYWdUR3cKKytnZlkxODgxOWI1ZGdNU1lwMStJbTBUdEltTXYv TE9QalpZNDRCcjI0SmlzU2NhcVFYYytERVRFZmFmb0lLc1cKK0JCajFnZno1R3N1VXhkbG5aSHd3 SU00TXd0V3ZvVTgvT0hwM3pWbERKWkZMTkJSZVRpbVYxTGEwRFFBUkFRQUIKK3RDQkNjbmxoYmlC WExpQkRZV3hzSUR4aVkyRnNiRUJoY0dGamFHVXViM0puUG9rQ09BUVRBUUlBSWdVQ1MxOXEKK05B SWJBd1lMQ1FnSEF3SUdGUWdDQ1FvTEJCWUNBd0VDSGdFQ0Y0QUFDZ2tRVFJWQkVMaEZDT3l1eXhB QXJZZ1QKK3FyTXh2ZXFnS0VFVXJkbllGK2h3MXdlb0E1STR2SlBVb0Fkc1VyNTJXVVoyUDhBbkt4 c0VTZEdlZkEwWHdHMnYKK3Q2cXlvMGZGY2UwNFlaNWdZamc1YXUwc1luZE44NHZ3eXNqdW81UEtC UjRtdDNJajA5N2dNbm90UnpGRFJlSkQKK1RCNVlrNG9qMC9qSE1Va2tTMmR3M2dNMkRGZkkySUxB YUNSTmJGYXBlandrNGpDeHQ1SkFHVkVyK3o4QkV5T2cKK05jd0wwWDVHMXFjaStPUjljdjBBemZD aHhhS053Vy9vR3BXL2g1Z000akJRdUVsTW1DeHFEY3lBbElITGFHb00KK0g3M2lHbkQ5VTRiSTA1 a3ZwSWRxQUJRcmZEb04xUXlRa2lxRzY0MExuUDRXVkh5Y05ESXlPZWVRY0RWZW5LNWEKK0lPbS80 Z25Fck95elFrUFMwdjVKNGpENGRmMmx2eFhub1N2akx5U0NlQTF1bS9IVi9nRjAyTnVmeW9NSERK RkQKK1FlRUlqUXU2S0xZUE5PVDNkTWV1aW9xdElzbmN5bG1BWGlTcW53clA3emZwMlJXUmFXekFn UDFTU1pNekYvODAKK2ErNlc1dVF0OGoyb2svejBOUENLUWZsUytvVTRHYzVDKy9LSFVyZERDWTVH Y3d3Z0ZCdjFpNDFqWGRqaDBua3oKK1Z6WC9hc1VJTzlwdFc4VFI3YUljUzNsbTg0N1lWNGlzTnZX bHJvZUdobVZmSWs4TThScXNEZnE3SFBMdnFpcEkKK1YycGhGaVVFaU9OOE9nRDB4OCsyZlRudmVF L2xZMWpwallVZzczWE9jSEc2d25hNEQ2RUNUemxHM3M0UXRCckkKK2djVUZZOTduZkhndDZzVC9p eDdqQjc0NndWZktnUnpSeUN1Q3d4S0pBaHdFRUFFQ0FBWUZBa3RmY2o4QUNna1EKK1ZXdS84RDhL QkxiTS9SQUFpYjkyUUhNbXlST2FjL1p4QmloKythY1lUMnM4d2tLYm1oajVlR1AxYU9USHJWL2oK KzJQU3J4dFMvMU4yeWJRYTJ0MUc2ajZqTEpieGk5RHJDdVJlWk5uL1dPS0dtOU0rK2RHejRERlFB dVdZZ0VEemoKK3NhT1JTRlFPSTdqQ25LZFdoRjZtUVkyR2RzSERVT2xFcEF0YVkzZDNNOEdKSWtm LzNJWFJmcmt5K0lFRDB4ZXUKK3ZINlEwOWdudlk5bE1GamJld2JHRlZaS0FyUVNnUEVNSCt0ei9C L0JYTnJnRC9IRzdiK0lTRUZoY3U4dlVTdUEKK2QzcTNYMzhLT1pWMlJjN1MzOStKSzdheXlXWnhr M1R0Vkw4d3R3ck93WkE5cHEzZnVZWkJmS2FiV2dwRFF6SkkKK1BOdXQreHR5bzh2Vlh5aWhoQUhF Mm1CUVpNc3A3ZGhhd3I5MXJ6N0h3S05LODExM3paTDJsbVVFZFU0T0psbzkKK2dyUmxLNzJaUy9U WTJxVHcza2o3WHFUdVEwMjJJc1dJUWx5ZkhETldneWZiYkl5aHp3ZTh4dXRoVE1FUzZURWsKK2FR bkVaWmVUaFNaVS8wZTlqeHkwS05RRUNTNnJIYkI4NlBFZ0N2YkdpaDlBNS9DZ1FicWxXQVM5cm5O Rnp6djgKKzJobUNmOUZNL3lxYmwwaG56Y0NPdE1vajdDRnZndm96ZEtUSVRPbDJJR0MxeFY3blFR bHAraTdKQTByam9QcFkKKzBHcGxiVGJXZTlnY1NuM2J5YlpjRHlRYzNjbENBYXZ0SGlXVitBOHNl RXE3K1NuZ09yQ0FtNnRIZXZkZzMrWEwKKzZGQ3NERy8zNFNBZDUvRFk0aWVhTnQycDgvQytZcWEw cUpMUHc1aWVvRUFPTTVHcVp5emdlV1VNTTZpSVJnUVEKK0VRSUFCZ1VDUzE5N1RRQUtDUkFNaEJR ZFpobHh2MnFNQUo5VkhxSDhiaWIwa0JpSDBGS0FERmlkblBVNWZBQ2IKK0JxUWxjQUNIa1hTYU9C TU9DVURSL2dkVUIwaUlSZ1FRRVFJQUJnVUNTMStBYXdBS0NSRDNpSFgyUW5JZkFFUDAKK0FKOUZr T1B6aEVSY2dKNlp4bEpRN1o0ODVLd1g0Z0NnaHJ6bTBPcjRlc2tKWVFEWVppSkZRQkw2UHRTSkFo d0UKK0VBRUtBQVlGQWt0ZmRub0FDZ2tRVXozdkZWMTd2Rm9lK0EvOUd4RXRGZ3ZGcTQxTHI4Y3VH bExGVVhMVFF4bnMKKyszcStBWDNmeFlKR2cxMkRwSG53dUtwalMxelhIbkFrU29qRE1weDAvT21n bmhoUVFYWE1wWnFOY3lLMTlGQ3AKKzRZcVBEVTVUckZaUUJNT2h1M2JpSE9HNUI1UDgxTURaemVB VFFnWVUxU01FYVgzZUJhTW5NY1V2QjR3TW1Kc04KK2ZkdER2c0lqN1ZjdkRQSC9WeThsakZJWjRo WHdYQ1VlSGVtY3JSdi8vUTJESlhYSWRrZ0VHOGhVTGJEQ3ZTblMKK2MzOXRra3NrTW9XN2J0U3Rv UXhJMUhWVklLZGJqTlpkN1VPeDZaQzE2SDcwVmhRZDdBc0VHNThZVG42NVMwTWMKK09KTis4WCtv MlZlK1Vzc1o1ZXR6azE1aldMYUtsVURiZ0tsQ2txR3FMT2xPUXpMcjg1RUxKSHprMStLeWpaRVQK K3VsaXBHR1QxRDBjZDVlaEtWanI5eU0zMENyMjZIRHdLeXo2YUl3WmkzdUVEWGQ3MlF0cEZ2cU1K aXROZm9vSEUKK0kyNzVLNTlMaTVmNGZlQW95UWRvMXh5dENFcFR3UVBsNXM5dkMrMWJtSW9XR0hK a2FZTmx1MXdkcEExTFBxNWsKK21CYkFoYjd6KzRUZ2JWSEtka2huSnBOZzRsbXZOb1NXL3ZsV2pC ajV4b3JyM2c4MEJBRWVPK2p2TW5JYXVWZXYKK1pLaTA5azFqRWNUeWEyQUxBWTdiZEJ1VWhwa3B3 bW8rWFdvT0ZaN3pMTklORVVtREU5OVpJd05Xank2azhJMG8KK3h0WkxzZ2NyUm81R0J4SWxEdThX Zk95RFNSUk8vZzlnNm80SDE2dzVJVlZQa0YwK045QTNxNHlQNTI5MDZIaUgKK1l0NmtjQ0c4bm15 WkxycUpBaHdFRUFFS0FBWUZBa3Rmc2tjQUNna1FDQXR3RWlPUzlmTzlLZy84Q1poNVNSRlkKK29Q TjRQdjc3UURRNmpMWUdvT0lYVDg0QmF1RE1hQnJOYlJORWRFamMxZzMrNlVxUnU1MUs5NDFOdlB3 MEs0UkMKK2dWYUFYbUpadWtGWGl4R1h2R285Sm1oK1NuczdtdGpwaFcvaVU3U1JhRzNvUzFHbnYz ZjloWEZjdVFwSnVpRUoKK0p3Z294ZzJudVZFMGlZU1ZTcTd2N2NQMXBwNFVJODVrUVdOdWNGcGxB SnlMU09GOWpDTyt2dEZQRjc4Y0Y0V3YKKzUzeW1tN1FPeWFieWxNbXpQVTJOVm1QdHJqOUJhUDZ3 MUtMNkdoNE82cDBlUi9aWVJsV1VQTnFuRnA5bEJETk8KKy9ITVp5L0hJL21Cd1IyZ2UycmYyZ2xy Wnhlc3ZZMEpSbXEzSXhaakNvc0pVRGdYem8wN0xzSWwzOEs1ejJBaSsKK3lyS0d1YzIxVk9ka1ZC ZytIbzY0MWFPd2dyejJVKzAxaGpKYmcvRHpUYm15ZVZnZGZWZElTRmVwSWdJWHcxNXIKK0xDMFQ2 R1Y0d1VocFJsczF6S2JkUERQNG14Z2djZ1JhMU5rQjRaR1R5L0VHRDhvblM4MDNKS2xTdnkrRXlH RTUKK294MVd1T2w0Q0dZd1p1YVdhV2lSL2tZT0Q3MHpxbnRCcVFhV0huNGNvVmIxWVZleWhUUGdp b0FnUGtUMXpGbkIKK3poYmxCU0RJMmMwajNTL3UvRmpFR3RjeTVkVkhqMGhCQVR3ZlhxV1dNNDQx ckRNcTZxZ0wyNU9EOW1jMWJJZC8KK20vMGcyYkFkbU5VZXdMc1NxNERPc2NtQU05TXkxME9nd242 a2JYQ2x0Zmlya3lBWHUwZm5uK2VmeWZ3UjNMMlcKKytIQThkNHJLOTJFbFAvVmt0NEg4ZnlVN0dj WExTRUpibXhlSkFod0VFQUVLQUFZRkFrdGZ1T2dBQ2drUWs0eXgKKzJXaG9ud2VScUEvL1YwVlpo UG95RVgvZDcydUdXUDBoY2llV0Q0d2Zrdk94YTN1WVNPcm5hL1UwQmg1YWQzYnEKKzNwUGZET0RW djFpQ1BJWmdtRFhrN2hibWxybW5yMzY3VTNCN3VPR1FVbSszbFo2OC9JV1YwSlgvM0kvNlRPeFkK KytLbmhEUldFR21ZVHJPbk90a1JvZmVXQ2ZGS0tPdEt3MHFmblFWRXZEUmdDMlJNMmVTWk5NOWZI RWRMdytMRnIKK2g0NHJNU0cvTUlHZmJkWEh5MEttMjVCQkVKRVkvWnpPN0tBQ0dXRzU5Q3RMbWZO clBJVHl2SllqWGNQM3hrUnQKKy84dDlydmVvTHlLd281V0NHMlMvSGk1TEZCRnR5Z0pHK2pEbEc5 bEpDUytFelN0S3hkWkNDbE5QbWk1N3dOU3oKK2ZIdzNvVUdUNGcrRXBxTE4vWXJtRmJRdHBXdVQw MnVOK25TMUpUaVQ4cTExTkJYRjZhRnlVTTlwYll4NDAxVlkKK0p4N0dSWWZYN3IxSTJwN0JRN2Nk NDIyZnV2K0xXT3oycHZlbU9OUm9jcFdBb2lOeHBXV01MbFZEMC93eWs0eDAKK3Q5WDlJRzJDYmsz bDhsVVVldkloUStqaG51UXNRaTRKczFodkgxUklQZzdKOFg2OE5SUm5IL0gzMHEwOWJJMDMKK2hG S0M0Szk4aGJ6YjhXcVYyY2VnVDZuZTY0TUxhUGN1UlB5SmlpNTlPaTV5cHVvZFNqbjhiempBM0ts YUQ2VFUKK2orVHB3NnVxMnNIb1BEdEpGOHA3S2RMb0xaTnd6WlJCanIydTE0NDlxV00wV25rZmNo bUVsMFgzUW1OeUZEeGQKK21DaGpsVktYVUZXWXZodHVFaXRXMktkOG4ycVRseXI5SDlFbVZFTWw0 NGxScnZBMll4Y3dOS2U1QWcwRVMxOXEKK05BRVFBTDNyYm9iNG4zanljVWhESXFnN2J6UmViNHJm b1M1SldLVkN1MTY5cThhR3lzMkhKNHRDS3RQRTJsZHcKK0hLbzU1blRac1FRVGJhTE1XeHpubUdX eEVTVjRPSktERE5YT2hjdElTYWl3T1NORWo1OFF2REdtY21LMzhabHIKK1NzdW9VTmdwYm5GZnhs d3hEQnUwTmg1b2NLaU5KY0J4NUJ3aHJEOWh6cWFTVy9IalFVNTJFVXJMZlQ1Z1luVDIKKzVadG1U SUV6b25iVDFBR2J2TVdQUWVOVkh3VVpteTdmb0ZJcDY4SHc0WjU0U1dXQjZ3T3Mzc1BnNVBmcHRm clQKK2UyVFRDZTFDZmNVQ0N6QUpJRWVOSzh1MnRZd0sxdTAycG1ZSjJuWHhDbzBvcDBiUDRCbzQw VVNicUk0MHFmMzcKK1dBakdZSWlrMzF1cE5PVTdLdTZ2WW9wUU1WOGtCN2k1SEJ1WXpUdnhqQ3or ZEM4UDJUdUFMd21NQ3BPZEJRNWMKKytsVDRnUnI1a3QwT2xEMWtJcEwvdnJsVEZzbWhJTGU1S2Jh d2ZNMlp3TTZLYkp5WDBlcjM4WE5LNEhQcEhpeWEKK05yTFMyYlFTRGdCVThQQzVzT0hLcE9YcTQw NG93RHlia09maUIwdm9DSm0vZTdSa09JNkF5ZW9rQ29iWHpjTzYKK1pyV213aVJ3WHo5SzVFdUtJ ZkE4Z1dzNWkzcEszWDljQk1ualEvdU1TTDB3N1NZNWtoVUFNRndFQ003M1lXNTMKK0UraHFhQjdM RzI2QVRqcWxlc00zdWhhVmQzSU5OTnAraGFvSFNzUlVZN0RaaDJzL2doWDV0L1QvcGtSemZOaW0K K1ZkZWpZT1V4QUhIWDR4OFNmY1hzQjFJOXI4MXdvbGJVcWFkZEhkWkxZUzRaN1pCTkFCRUJBQUdK QWg4RUdBRUMKK0FBa0ZBa3RmYWpRQ0d3d0FDZ2tRVFJWQkVMaEZDT3lOcHcvL2ZGNnBLbGxTUHY5 eXZOQU12dCtMeTBoazZHd08KK0NSWUNNZTl1UXVrN0VEVElpZGlHNkRiekVLc3FHSXVndmN5TXJP R0p4R0RmU2MrSThLZ09oc3VZMzFhV2xsU0wKK3lNbzJmVkZQRUN6dFBQRnQ3SW92d1hlMXNTQTVk Mjc4S0cyWGkrMlowVzBYTW5DcVZMTG9Rb0Zxa1Z2YmdhTEsKK1dydmdrOTN5b3pzWVljSmQyaURJ c2V5TDNZenVxU05lTG9YZjBEV2xNRFg4b1h0ZW1sRDg3b1dKV09uZkhUVk0KK0xtR000NXFBdm1j RGY5NmJaaURqZG80U242TFN1NVhuL2ZDTnJaT3RwVERYSlBKOWZiOUFQejRuMnRkVFM0VXIKK3pD UWR0WUVhTnhiNUxlUDdNeVNNT0lUcFoyeHJtQzNTekw2N1NUWG40UE9UeFhhOGxuWTFEQ3BHVUw4 dXhZZWoKKzhjWGtQRFNDOXNYODM2dkpEYmFsWVBIbGdiNUZ5bjlwYitMb1pXaFVLeHRmcDZkcDhO MmtWS0oxeUxsVHdWZFIKK0ZFaWNGNWhxaU1hNkN1cmtUVklWYjlWUXhFenc5Ym5CbW9pOWs0WExK QUh6MzVjRnZMTmpKVlN0MG5hTnFqcHkKKzZmeEhsbEo2STFzNmRKZTlqR2ZFQ0VjMXN3MXZMalM0 ZitOSUdUU2pjaXV4V2tPZlozVWx3M1JQdVViZU1ITUMKKzZGRWZ2MzVNMWREUnYzZWN4SUJLTzB0 N3F2SjhRNmIvRHp3VytJaHF6TFRLNWJYRVhWS1MxekFKM0l5ZDFRT20KK0dPTGRQL2Nhb0tWMzEz SjVZVnorYnF0Y2xGVkpRMjBjcUFQaFdFZjdVTlpURkN3YTFDQUtiUElHS1lvRFNDSWQKKzRzcXNO eVJDbWJScVk4QT0KKz1iTWU3CistLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCitw dWIgICA0MDk2Ui8yOTk4MTY0MSAyMDEzLTEwLTI5IFtleHBpcmVzOiAyMDE3LTEwLTI4XQorICAg ICAgS2V5IGZpbmdlcnByaW50ID0gODcxNiA3QTlGIDk4OUIgQUJENSAxMDBGICA0MDA4IEYyNjYg NTVENiAyOTk4IDE2NDEKK3VpZCAgICAgICAgICAgICAgICAgIElnb3IgR2FsacSHIDxpLmdhbGlj QGJyYWluc3dhcmUub3JnPgorc2lnIDMgICAgICAgIDI5OTgxNjQxIDIwMTMtMTAtMjkgIElnb3Ig R2FsacSHIDxpLmdhbGljQGJyYWluc3dhcmUub3JnPgorc2lnICAgICAgICAgIEEwOTdDOUFFIDIw MTMtMTAtMjkgIElnb3IgR2FsacSHIDxpLmdhbGljQGJyYWluc3dhcmUub3JnPgorc2lnIDMgICAg ICAgIDI5OTgxNjQxIDIwMTMtMTAtMjkgIElnb3IgR2FsacSHIDxpLmdhbGljQGJyYWluc3dhcmUu b3JnPgordWlkICAgICAgICAgICAgICAgICAgSWdvciBHYWxpxIcgPGlnb3IuZ2FsaWNAcmlzZS13 b3JsZC5jb20+CitzaWcgMyAgICAgICAgMjk5ODE2NDEgMjAxMy0xMC0yOSAgSWdvciBHYWxpxIcg PGkuZ2FsaWNAYnJhaW5zd2FyZS5vcmc+Cit1aWQgICAgICAgICAgICAgICAgICBJZ29yIEdhbGnE hyA8aWdhbGljQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgMjk5ODE2NDEgMjAxMy0xMC0yOSAg SWdvciBHYWxpxIcgPGkuZ2FsaWNAYnJhaW5zd2FyZS5vcmc+Cit1aWQgICAgICAgICAgICAgICAg ICBJZ29yIEdhbGnEhyA8aWdhbGljQG9wZW5jc3cub3JnPgorc2lnIDMgICAgICAgIDI5OTgxNjQx IDIwMTMtMTAtMjkgIElnb3IgR2FsacSHIDxpLmdhbGljQGJyYWluc3dhcmUub3JnPgorc3ViICAg NDA5NlIvNjNGQUYxQjIgMjAxMy0xMC0yOSBbZXhwaXJlczogMjAxNy0xMC0yOF0KK3NpZyAgICAg ICAgICAyOTk4MTY0MSAyMDEzLTEwLTI5ICBJZ29yIEdhbGnEhyA8aS5nYWxpY0BicmFpbnN3YXJl Lm9yZz4KKworLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCitWZXJzaW9uOiBH bnVQRyB2MS40LjE0IChHTlUvTGludXgpCisKK21RSU5CRkp2dXE0QkVBRE1HWGhjMkExS2Y1TlFx dVBtclJLSDNGa2FvNk5LT3UvWFFtOUZ0MzFyRk9qZU90SGwKKzJoUURtNCtPeGVkdjZiem1VS2Ni ODVyRUFHaUttbm9JSC9OVkpxM3IwckY3SVVZODhZOW5FZ2hRWmJtOUdQSnAKK0xkQTlaVTdOWFdW ZHhYenRkTXpRODVNem5pWVZNR2hnNVZOWUJsNU9STEJWZUs5UEZkWTYrU0hKS3BZRUNZZHMKK1Vt ZGc4TkZMellCVnpBNURnVWRwTDNyUTVVOElWUjJhb0d6UUhRT2IzdnkxTUlCclpJMWh4NnR3dWdi eklxSFEKKzNPblJxVEU4cWFlWmI3YTZ4UTlORCthWDBsS1VFV3hlUWpzSCsvZS8ybE8yTFZ1M3Iw NGw3YjNTRGY2SGZJZkYKK2JTUmZ4Sm9GdTNBK3RvRVdSUFF2bDFOeTJCYng4clVZYTdCYzIzZWZ0 TTZZaWtHdnBkRjFldlBlT3phOVI2QkYKK0dsVmNCZkZjUTExV2RhSC9lWWMzUnFha0R6Rms3YU5s WWRNeDhPZCtxU1Q0YkFON0xzK1FCaVFoajFCTmpmZzUKK3V1S25teUxIRDZNQWFIZ3Uzdis5L0VF N1Vac0N4dTFPNlJNM1VoLzlSRHlpeC9aejhxZnJPN0pDWkVXMkowbSsKK3FKTjVlb2cvT1o2R0lN UExxejF6akZUTU8xVTRKVXpOUTZSbjIzd24wWThVdEZOZGlCV3NlYWNUeEtMaE11bGUKKzRqS09D S3lHcHhjV2NEZTYyOEZqeUxjSHdPOUhWYk1HMGlNKzUrcytnRnozeGpRVExrRE9XdTVtK2FYeEdr Z3oKKzNJdmhKeThBTXFoTmhhMlNPWWFvcWtzallrMXNVOGxZQlovL1VaODErMjJLdVRyZjlPTHh3 c1RIK1FBUkFRQUIKK3RDZEpaMjl5SUVkaGJHbkVoeUE4YVdkdmNpNW5ZV3hwWTBCeWFYTmxMWGR2 Y214a0xtTnZiVDZKQWo0RUV3RUsKK0FDZ0ZBbEp2d0NNQ0d3TUZDUWVFemdBR0N3a0lCd01DQmhV SUFna0tDd1FXQWdNQkFoNEJBaGVBQUFvSkVQSm0KK1ZkWXBtQlpCNm5NUC8xS2dteUVra0I3L2lj cHViYVQwUGpIZDJFWFpWL0swRk1jeStHejBjMDBIQUxQQmpkRFoKK244dVBvRGxxMVlTSmMzOEVw REIxNlV4bzUxQy9VVnQxMjkzNGdxRXBjZDRLRDU2K2Fab3V4aHAzYU5uZlRTdU0KKzNmc3NTTTRD b0c2MFJXUktyL2hvOEtyc2ZYQ2ExdmlLeVFRUFpNVVJ0d3JvVXh1UzNjNjUyYnFrbWhsVTFPL1IK K2pWc284aEgyaFBTR2ZHbUZKR0N1R1dqa0pmbVdNQmFIZGxCRmxiN3NiRFVmaW14dUlobWE4a3JI emdLUHEvTXAKK2hndG9tbnJ1eGVMWEltL1BBQS9NQ1dROENLV2hWRzFzYmVWMGF3dExzbkNOUXgx aVRWbmhyNTJzd1FpQ0Zma1UKK3ZpYUF5QlFZWnF4blFLak1Ud1ZHTjFubTNvdFY3QVdLOG56L0Nx ZkE4K1RCYkJDNG1yQTRBaXhaOEJyMGgyd1EKKzZadmlDWU03TjRCM1UxU3JXZWRKSDVROFhDT2Ir U3JRbEp0dnBxVkRiOGhPbXlQdDRuVWFtZ1YxeGRPMzRmTXoKK0w3dEt0M1FORWFwYkp4VnIrYlhm UG9CSFlROFpwcURoY2krWTNIaEo0dnFtTDY3ZXBUSlBYaHpTSnk1SFgzZHgKK2xWWUMwVXEyOHBK YlRDSW5RK3p3d2FXWVp2TlVZc20vOGdXZkJaYTFudSt5a1pKWWxkVVc3bFlsOFZQUnkyZWQKK2NO ZVFNNFF0OXpDamY2YkN5NnV2ZnVIdVdKRXRWUU5DY3c0aUdRdVBzWXEzZkxGTmpyNks1OVE3ZEo5 K2ZkbTcKK0xTem00bjdpcWZJMlVKazN3a2d5cFZEY1d5L0dSM3VXSTMrRUhmbTFvQ1o3bXZ2R0V6 bXpaMjNjdENSSloyOXkKK0lFZGhiR25FaHlBOGFTNW5ZV3hwWTBCaWNtRnBibk4zWVhKbExtOXla ejZKQWtFRUV3RUtBQ3NDR3dNRkNRZUUKK3pnQUdDd2tJQndNQ0JoVUlBZ2tLQ3dRV0FnTUJBaDRC QWhlQUJRSlNiOElJQWhrQkFBb0pFUEptVmRZcG1CWkIKK25uMFAvaW9hZ2JMaFRLWWNwTDk3ck95 aGtKemRiV2h2QW1xQUdSUUxvWmFzU2FKQS85bFFaMHhqWFloRkJSQUkKKzBNZjNTeklCMDM3bkc5 RGhIMUNxUGhPaTY0ZDBBUXdvLzRXV2NVdFB1R2MyTCtFWEhabC96cC9HVUVpWi9tbXMKK1FkSHpS eXpaZG9hVUswWWxZMlVONXFoR2w3ekNYcDZheXFJaGtCNklYNU5BKzVNVmZXdVJzWFdiVFhpeVBa T2IKK21ZNVhTb0xWRkV5RXJ3NUY4NUp1cGNxK0J3OXB4SWc1RUwxcE83NUVFa25SV3lFc1VtSm5x OEorR0ljQTdlRlUKK05EanZCdUV6bXZsZkpTZEZRb2lOMzVaVjcwYkJ5SXlWQ3l3Y2ZNWldzd3g3 QkhlMGtReWQydUJWK2pRMVFCeWwKK3dNWXoyTGpFQ1d0MW05dzhJTDlJNDhZOWdIOGFScWJ4eUc3 U0VQV1Znb3hsZ3lsU0ZZb2l0bEtPMlFNS2RubHMKK0VHeWNFK2JKTlFqOHJzTTQ1SDZ6Z1pBZlZL RmRweUFaRkU5Tkg2emI3RWJ1NEp6M1ZOTmpieG05QWVVYisvYU8KK2xvZWpPOG1FSHIvd29qQ0x5 VTZrcWFWKytNZU9qK3VPRUFHdFlCT0dyUU95dTYwVk1OTTZ4OGR3bFFPUUpBd1QKK24xQ29vNkhR TnpRYXF0VEpWYnhGYkVpckZvT1ExYzlSVUsrWE5lcXhHMzVSaVBVRXRaZzVkV2NHclpJdWFyUjEK K3BGdmx1QnZvUmJnYTd4OHNCdlYrTU1XMVRhSXYxWFhpanhCVlRVYkN2MXRkT2hWVndlOWhGVzdE SnJkc3JoRzMKK1pmZWpUOUZ4Q2RRYzh4K2x6V2dDNG42TTVaUmxxR0pIaEpVRlk3V0pTZUFvYnpH Y2lRSWNCQkFCQ2dBR0JRSlMKK2I3ekhBQW9KRUVzZG5naWdsOG11MHQwUC9qYXI3dlpUYlRHN2tm S29NYXRIYjdFejlJNlNtSVoyZGlNOFg3VWIKK1ViTHNZNDlnR2FOSTN1MmRxeWcrT2RFekFBb2w2 ZkZXVEh2bnJXSndZaXhBZzlINWlCY0hqeWpoeWlMRWlOblkKK1Bnb0NMYWFublRoK21la0s0bkVR QWcreEduNW5sZlNyMUc0MU1HV0JHbm5Pd3FiVEU3NE13bk5NTWVBKzRDS1UKK1lUTnZFcENGVysz VStvdC95RmduRnFDRU9ENUd0SlBLRng4YWZoTjZFUDJkZ3J0QVFraDFhbWl6QTBpQmxueUEKK3dP V09SbS84eTZ2cXhQcTVIYTRpNzRJNld4bkRxOUlMc2dBdWozWnVFa1hibVdvVlVXdloxOHZ3MmNv OXFDUVEKK0lVRURFZEE2QTg2ZE4vcXhLaGVTSFV3UjVyZ24wZ3g3SmV3S2dGR1c2MW1XYTc0YkU3 R2F0dFdpa3krdUR6VVYKK3ZvaDQ3d0VkVzNsUlIzQlJrSXdQQU9ML0pib2lKMVJjbUtwcWFudHNt alBMZ0RZRFozZzJoZndGcldWVVJFN3oKK0dwK1BTeVp1bXZOd29mckNBZHFDY3NmOWFobzJ2OHlF cVpWbUJ1Q1VIWTErM3NIN1E4QW1FRlBVSjFkb01BdVYKKzFLUGM0Nkp1YXBpNTNZR2gzVytiVnRv ZGJsc0NHc2NTeXA0bCs2L1pmR2FOaE5DcDc4Z1BlWDJqa1BWMHBiRmEKK2hBR0xTSVQzN1BhbXFz NXZOTHNSZFNZZ25keFYzOVpzRTFCNDJrZnRiZmZreWZ5ZlhkZXZNZE1CaEFldzJuZEcKK3NGSHFK a3BGdlVPaG5aa2NnRXdjRktzdnRUbXkvY0V3emdrb2dDVHFYTit2enZDVVZzS0RBeWw0c2lNRkQx TU0KK2pwY3ppUUkrQkJNQkNnQW9CUUpTYjdxdUFoc0RCUWtIaE00QUJnc0pDQWNEQWdZVkNBSUpD Z3NFRmdJREFRSWUKK0FRSVhnQUFLQ1JEeVpsWFdLWmdXUVN3Q0QvNHBHMjgxRDcreFg4SGhQTUlW VGRaVENnbGlIYTFzbUZ5MEQzakoKKzVra1ROakNaSDhKZmUvVllIZ1pUS0ZPZ0MwdjdJVEEvMHp0 bjNjR2pMTmo3Vkx2TXlMMnpmbmNvMVRQWURQNHIKK1JQcHlxMC84dTVXNFNQN3JPVXpMOFJRWXpM Kzd5eGZ3VFpqdHJqQzB5Z3oxNC9oM2lwVVVWUnJOcnRvYlRkQ1gKK1o3eXl5YnlKK0o3MHhQdW02 Vm04QW1BcFVxbkUxY2pKVEp2aFJjZjEyUjVFK1VWMmZuZU1HMGdOLzdXaVFPVWoKK0NRZHloQlc3 akFnWEFnc2FyRHB0UTJ2ZHFYUkF5SU9ndmFWdi9KM1FoOTQyUWJTNG02VlYzeVJNKzg5eDRZaG0K K3JEdlNCU0dxM24xcmtaOUxyaGJrY1dNWG8zWEgrNVJpMGFCUlNvdFk2Y2tVZkpnajBpdWI3VmtG WWRGMVZxL3MKK3RrU2xuQUVjdkQvVlVpaVJ3cTNmSjNhREVuUFFXWHVBQXh2OUozN3hUMDhqTlA0 eFhzVjBLRXZvM3ozNzdJTmMKKy8xMDVrTmtha2V5aXRpQUd5cXJmMW90RENpTENDUzhTNTB3L2hn MCtBV1FCS1NUdkZoVUxSVG51Y1FXTHFOY00KK0NwZFR3V2lKMWpTc2JwbVEyeVNYc29XZ01kSkcx Z0U2Vk9vcm1FK0lScGhtZk9ZamR2dnQ1M0xldVRHa1poZ1MKK3p2Wk1lNjgxYktKN2NlellCWmp3 eFJnRGRkdnF0Mm9kalBTMWRTYlhkTzdCb1lZNFZJcWxTejBxajV2MjF5WGYKK3I0YVFydnN5WWlC YmhaTWFpMElvcW1PMXV3dWsveW1VcWxFK1haNERvNDIxeG85UFZDeTVYaS9iUnViaHRjVEkKKzJa Y2hvYlFmU1dkdmNpQkhZV3hweEljZ1BHbG5ZV3hwWTBCaGNHRmphR1V1YjNKblBva0NQZ1FUQVFv QUtBVUMKK1VtKy96UUliQXdVSkI0VE9BQVlMQ1FnSEF3SUdGUWdDQ1FvTEJCWUNBd0VDSGdFQ0Y0 QUFDZ2tROG1aVjFpbVkKK0ZrSDZPaEFBcEphRVlpei9wY2FLKzBuWlFoN0dSVUQyYndWZW5IMllY UGsyTEQ2YXhTZHk0M0ZZV1N2QWQ0Rk8KK1ZkRmllSWtEUTBqc0I0Ym1GTnRhSFhLOUhTZ3NabTF2 K29HVnF3Y0FXMHQvYnhMb3c0aUFVa05KeHVNazdDYVgKK0hBbSt1UVFVNE0yYkFtOFl4akNpREIw Ulg3eHNOSGVhQTF6aDlja2JtWGtENkxqdTkzaWFtQWpJUUJUTjF1dDYKK01BMW91TWhSekExTmlF RG03MTRGVUx6MHQ3cVNzSGhMUS8vS1RKWkxDU3VmZnFrZkNiZGdWUU5Vclh2ci9PK1UKK0cxYUJ0 S0ZMR3JaOGh4WWM4YjNmWUF6WHFWeDRiQmlZdFpaMGtLOHNVTm9FRTVjVVp0U3llMk9RekQwMUdu VVgKK1A0QkZBaUMyN0s5NXpueVVRQ2oxMHRXMVVkZTFVOVBmZ0lpVmI1TEFpcGxLMkVBNVgxRE9J WkVtUlh5YlR3dm4KK1Nlb3RXdVhVUHR1TVhUVkJ1WjdhSDVZczZCWjNlYTdjbjQ4c1gvQmlpRjho SndBVkZoZ0NQNUJDcEFCZkNrc20KK0NLZjllOGpBdW5WU3Y1bGFiRWVabE1hNFY3M1JDd1NsaHoy TitTWVMxL0hNc09PVmJmOWFyK243Q0FFQWRiSUgKK1RCU1grL1FocjVvdm1pZ1IxenNXS1FTOUwv ZHpNQzMxZCttcUJlMWxzODYxSnY2bWRselUzaG95SXhrenEyL1EKKzJEOEJ0L1ZpTE9oUTBkWjR3 QzhSNS9OaTRIMUJmN3JlZ1VNajdKQVNSR1hld0hQV3h5akpBdWR0MmF0WUtQNGwKK1FDTW1HQjdr ZlhYZHQ4Z2hBUUg4dlFnNU1uSy9IZEdkcHFOV0p6dDBMVzFnaHJvcnRVUzBJRWxuYjNJZ1IyRnMK K2FjU0hJRHhwWjJGc2FXTkFiM0JsYm1OemR5NXZjbWMraVFJK0JCTUJDZ0FvQlFKU2I3L21BaHNE QlFrSGhNNEEKK0Jnc0pDQWNEQWdZVkNBSUpDZ3NFRmdJREFRSWVBUUlYZ0FBS0NSRHlabFhXS1pn V1FlWFdFQUNoTlNWZEQvRmkKK2xqVnhGN1AraVo3aTgzdmdZQ05CN3djYkFxVHBveXA2V2xwaGxw eDE0anMzS3cxOXpxMGY3S3RLQmFzMUdpTWcKKzYxVjd5eUxTN3pmd0o1aXhzdVBkZXdOSW5yNVNX ZGVKQUhBVjlBNmYveCtPTTQ3VHR5eHZXNGhydjdTUXRZRzYKK0pDOHZQbTNydzhENHI0L2I2cnJY Vll5UUFZbkpjQVRBQmpyaHFrVW1SYVNKY0IwenN4QWY5dkU5clljYmlONmoKK2NrYThabHMwSThO ZzQ1RlJtOC95SExVeTdYN2hCd3BlcVJEeWt2OHE5Q3djUWsrNmNWYU1sbktuMjlzTUZGNVYKKzNx QWtDakt6YVNpWldramZrYittdlA1ejF3cEw0UTVXRUlUZGZ3Vk5FcVJDV3ArMVNJaVRoQXlmcVpi ZitpbnkKK0kxdm51eTU0MWlRWHJLZVRodkdYbGZhRjAyK2N4MXJNZG0yTjlZcmpaTmZadlEwblo5 RlEzeW5KRUI2TlRTRkQKK0hicTJyaTdjbHpDNzRuaEhHbUtkd0pHWFhGaWZ2bW5oamtsTW43dUpX RGk1VkxQQWNwek0vcS9MNXk1aWxlTlMKKytBL3hJVVhSUzJYaHhNMEtQRDhTQm8rYUIyRTNOUjVa bk9ZbUI4eXRTWnhTWTdwKzFoVU9pckdUclJacXBPQjEKK0RTZzhjTWxZeDhNR3I1ZUM4eWVWeEtI VklOSzVsUUMxY0Z5d0M4QURET1ZEYnNFSFFqRHViQzdJSzZWWkMydGoKKzg3QzBseFE0Y0I5Ykp5 b0F2K2V5MW9lS1gyTWMyKzAzbDk4N0dWSXpXeFQ2dGozOS83aEpNRTlCMVRaZWNRZnkKK0xJaEUy a3JwN2E5TkZ4M0MyZ2hqRVJqV2l0VDAwWVI1eWJrQ0RRUlNiN3F1QVJBQTdTY1kxMXBJc3Y0N2Rz VncKK3Nuaml5Mll1VUk3YUN3N09XTitrRjlvOWM1RjJxMlR3ekxneXY4UnhuUzNHc3RFaEJOS1RH eEM0K2MxSUZxemoKK0pHanhhcGFpUkNvdHdXbVljempHT1NydjhPQkJyRVdheEg0RGFaWlNvei9T SzUxb0dsZWxiUXB5YjVBcHJ3WWoKK2dMU0NFM05oTXpHd2FLRWVnU1hrQzlkYUNuY2tZSlI3TWFP N3l0T2RKSzEvWWdENkZMc2wwRVY4aUIzUVkrQVYKK0VvWFBmT3ZlcFlkVjJFTnNFZ1p3eThBSjlj MFQxeU5nSVlEQlZyWHlwN0NEMCtoSmwyVWFaM0dIcnhHSGY5U0oKK0VidHhpRU9oekVkMmhnSWJP V3p4K2ovZ0w2QnFHYmN5WHRKZ3lhaEtlTENjOXVIVllwZlNpRHV1YXFJYnpZVisKK2Z6Y20xM1di ZmgzYTZ2SXNDNjhFOFhteXJ6eEpaWmdkbDVmTEhLc1MwNzNQTFBQYmZxdG9pZ0lBM0dsQ0dTd1YK KzBFTG5aZTB4eUtZWk5FTzgvcktkbVlCTklRM0RnUEoxY3hhUkdldUhxd080NmY4YzJMUnhTT3lw RmNySml0ci8KK2p2VnpMZEd3Q1F5Vlk1VTNHY3BJaDlZMFNRbWN1dEJoUFFkOFhFd21jNkhSVWtJ WHZpOXluak83VWNic3A1ekkKK2N0aGh5eWJ1cHNWKzlsdnFsd0tDK0ZINnkxZTllTVRGOEdGaEw5 K2JPNGtzTGlWbkxrRmRQMFAvV1U1RG1tTC8KK3Z2S0ZmeUNOcmc4YlRqbzRiOU1QWFBoWUdtWE5E cUxUUGVxTDNpWmZXZ05oekV0RCtGQ3VONmpsWW5OZXdORUwKKzBiclJaNEZ6RzlkVy93ZEU5ejhI SDM0ZzVuRUFFUUVBQVlrQ0pRUVlBUW9BRHdVQ1VtKzZyZ0liREFVSkI0VE8KK0FBQUtDUkR5WmxY V0taZ1dRV1BXRUFEREhnMUdCeENQaTBYMVBHN1IwZG5pUVMvMTVad0oydzdpOHZDaFY2d3MKK0ta Rm56SnBUU3NiR1pkWCs0YlNlQ1ozWlBTTzk0WUpDNHdqdFZvVGVnRkMySlJaWVRMZkREdENWNW5a aUpwTVYKK3QvcDB1a0lEWjVweTBST2k5MXM5RWJiOUNodmIyUHoyTnpxaStuSGdyUlR1TGh0NTNS VmUwUnpBb2xvUjdKYkoKKzBLLzBFVjRmQVd5ejdDWlRUTExoRzZvWWF0R25ETm5KMGQxVTd2Q2lX dHdTR1AyaGRIeE1NS25VaDVKYi9xeUUKKzdLbmxGa2JGdE8zRzBTZkJjbElDZWVIUlAwdEwzWTYz TnlpQ1JzMVF3MTZrMWFFbnQ4NUxidnc1NElTQzB4TnYKK0U3bjJ1dHd4THNnaHg1RWJObms2MmFX NmlOc2NyU2lueXR3eTlXYituR3cwQUJNS3VTeWFkU1E3Nkt6cjQxWkoKK0JTWFhLaGNodGxxMDBJ OFdYdjFMdk04M1ozNk0xN1JuOXZVTDhucjFwUDhBYkdKZSt4V0U4QjY2bXV1ZU5HcVcKK0VEbU1h YUc5OGsxa1hEYk1LSWozZDN6MllveW1sbFVJNlZJNW5IVkgyWHhhb3Vxa2g5Q094ZXRVeFlFSTRv SGMKK3pkWFZ5dnZKY2xRU0N2b25wK3o1emx1N00xdmx5Vzg1RGN5d1UzQWVmT09rN2QvWWNzeW82 Y1J2UjdVRms1RWgKK1R1ZVJmRzN1Ym1XTVJuaS9QTE5rMEI3TTFtWlR6S3YxUjhHUWxXRjdvRUQ4 OEp6ZC9NOVBCK1FUdHArbURlVGMKK1hHZHN6Sm5RdHRYVlV1RzhxL2ZIay9sUmc2K2luc3dORDhT Q1ZtcFMycjRVTnNEeGdXSUJSZ3VieUhUaUZXUy8KK0hnPT0KKz13Zis1CistLS0tLUVORCBQR1Ag UFVCTElDIEtFWSBCTE9DSy0tLS0tCisKK3B1YiAgIDQwOTZSL0RBRTFGRTJCIDIwMTQtMDEtMjcK KyAgICAgIEtleSBmaW5nZXJwcmludCA9IDVEQTkgMDczMyAxQTdGIEQ2NEEgREU5QiAgNjUwMSAx QUVDIENFMjggREFFMSBGRTJCCit1aWQgICAgICAgICAgICAgICAgICBQaGlsIFNvcmJlciAoQ09E RSBTSUdOSU5HIEtFWSkgPHNvcmJlckBhcGFjaGUub3JnPgorc3ViICAgNDA5NlIvODk4OTNENEQg MjAxNC0wMS0yNworCistLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KK1ZlcnNp b246IEdudVBHIHYyLjAuMjIgKEdOVS9MaW51eCkKKworbVFJTkJGTG1xK3NCRUFDdGJvSmEwSk5W M1R6bk8rendhcTZMNG5yL252ZG9jN21PUmtVSHYwS2ZFa3FvejdleAoraWRhSnBydksvOGxidVBD bHQ1M3ZHVHVNcDA4QThiSVpSZkNDbW9xMTBleUVKMEYzSlMvUHRXTlhDaURORVFaVAorcFowWGht V2NZZlJ3WmZUa1dkZ0pPZWMrRjN3S0FISXh5UFM3ZFN5c21KVmYwL2lTb3haRHI2OTJ2UHB3OHA1 aworRlZWNFdXUVQ3Zm1BMTgvZjVmV3QwVlhUUFBLZWNtT3c1S011K1dQZnpuNXpCZURsQmdvaGFv WnFHcFJWTTFHOQorNXB0MnZOcGVnNVgxNDJWbnV4ZEFOR3VqU2ROZWJXWFpZQXArYitMVDQ3b2pV UTk5YytYcWhoOWx4b01hbC82RworcHlYcGpHalJXRVUvdytMVnBudHIwemF5L0pvY2tCRkQ1azFr S0lydTJJQnZZeWVLck1GRHBtNEpRckdtdHNaMgorNkRJZy9mZDZQMmxyc0NkcjhYdzRsaTYvWUdv cjk2VWJNQTJtS1FJaEpoMUJuajVUK2NiWnZBZVhCSm1TNWh1SQorOXhVMzJCbkZyOGo3cVkyS0J3 N2FoUjN0aGFvQVNBWkNtaXd5Q3JRSWlOdk1wUGlva1NZeTB0dTlHeWk0SkxoUgorbTFzQmZtWXJI TGlVM0lTMDUxZnhrckV6M0hRdysweXdHbkxFNi8vQWlJZkFOQThSVit0N0c5UlF2ODQ2WHYyQgor L2V6dFcvTTR5dUEvODNPUHpoRE5ZL3pLUkl2ZXI3QTVLbVE3SWdzdmVrcys5c3l1Z1djRDZMYlFP MXdZV3JtSworc2k5MXRUYjhkcHBBQ3JXcHRxcjVxRjdEZmJlTHBUWjJNdERNRkh0OS9nUzBMNG5v U0dON2U5UW1FUUFSQVFBQgordERKUWFHbHNJRk52Y21KbGNpQW9RMDlFUlNCVFNVZE9TVTVISUV0 RldTa2dQSE52Y21KbGNrQmhjR0ZqYUdVdQorYjNKblBva0NOd1FUQVFvQUlRVUNVdWFyNndJYkF3 VUxDUWdIQXdVVkNna0lDd1VXQWdNQkFBSWVBUUlYZ0FBSworQ1JBYTdNNG8ydUgrSzFkdkQvOTNZ Y0VqOEN6MWYxaStpZktPeHovb0tXL0UrTGUySjJqc1dqSzllWGRPTm1iKworTjFQT0hacjhPSVpy NVpQOWR2c1IxRlFWNlRsb1JMbWkyUGEyU09UUG5JcUFQejJhSExBNndybnVTTlpHV3ozWQorZnlR ZWlRazhEVm9xYVZIVEVjcU1BTGwvY2NIRnJmZXF3dk1nYnRlK1UxVGlrQ2ZCU1BoZFhvYXJrK2hV RCt0aQorSFJlSWJNb3p1ZXhOSnlPTnNsMU5hWTZiZTZJbXVxT1UxeWphUktpNU5zQmhQVnJqN2JY YURHbi9EV25rTFFIdgorenVnZkkyRTEvNi9PenY3QVAxTGw1TUk0OXc2dk1KcnAyamU4SGF1S0xN dXR2VVpOcHFJUXNLZjRLeEgzYkZWWQorSUVleElmdENjdEk2aS8vMzlMWlZYNWhxYW4xejg5L2I0 K2ZyL1NKTUdVY28yZ1MyTXp5VlpOMkN3QWNPdE50cgorVkluek9TN0dWa3hjNy9CN3FLTGlxY3E0 MXFqRjhsMlJWZVZzNHhSL0VaU2pkVmtoZUMraHRaM2xtSVFTRDBBTgorMVFGTUxWdzgyY2lGTm5r OE52U0lrUEFRMDEzRFdjQVVkYzBreVFBa3k0aGF5RnVsTTU3S3BxMjBsNlRiVXdGUworbllpY1ZS WmtJRkxCRENJb0RFampRVHlDVnYxTjhHbm9xTDVjWnZEZ1pmaiswQ01Oc0NmRzdEVVZ5bGEzOEJV UworRmdoZElJQmtBM0k0Y2ZoajJTclY1YUJockRmejZZYWxoYTFJT2dXS01RSkl2aFhqb0VGTFpz M1hoVTdJOEtURAorWURuZTIvM3JDellxeFhwdW8wRjhxVTA4cnFKVkZYZ3JlZ3NaVUFUUCtMM0M0 d2lIaE5FNzl0SDFOVG9KdkxrQworRFFSUzVxdnJBUkFBMDN1VDFqdmJSb3hXZTRlMnhWcVFEbmk4 elVyVzhlbk0yeEFneUtRQTMyMysrUDhrMERyTgorM2xXakZ4d2lEbmJ1ODVlZmlQY2JYZk10Y21n eUJFTGtJRC9VdXdHL2d2VSsycjhJQjRvaE1KYWRxNFhlZS80SgorRURkUlgxcFZJSHRCMFVuUnFV UzZlY2J6eU9JLy9PQTduZEh6WXkxRngySWhMQTRja2VxU01GaG93Q2V5cnlPVQordlkzWVFOQmtp Y3NoaURxUElBSVRNRlo0STJJaEplQ0FvNXFqa1lBLzBEbGpINnJ0dGpGdDM1MWdTZXdkQy8rawor NEpieE95TkhQamJoZ1gveWFzZCtJMWZjYkFORC9ZVUJ6OFE3WDVVLy9lMEhZTnVpdHNLSXUydXhj REhJb2RzMworME16dHRhUEVscVdNQjlqQW9DektBWjNGT1VRWFZtQnl0TmhRZkdNcTNIakVDTnZJ dkJMMVpzSWYyOXB4S0RROQorQ1NNK0VMNU8zMzRtQmtYSWp2amplOC8zd3NzUktTZjFjeGJCcUkx amtxQVQzT0lQMkxXRFFtL1N6RnpxRXR5dwora1Uycis5V2dxQlF6Tkdqcll3Y01TWnltamd4MGJy YTFoTW9SdWZYYXlPbEcyeENnVmN4dGNReFduczdyMUliVgorNjNic2J2bk1tcTBwMUd5Y1ZzUDdl TDhPUVhYRkprR1NLUHA0ai9PWi9yK2NLTkZVbzhmdm5FRWhkODh6b1k1QgorOEdDYndPUU4wd0VI YUVxNHEwMUVRQklUSXVmaWV4aXpIeXU2OWxQaHpzTE1TY0dNY25TZ1d4aDY2SDBCY3paUQorKzNY WHpTM1VvbE85NDFnU2ZZOUtia05kdEJpa3ZaazM4T1hqQ09waklvWVlmRCtDcG5ramZza0FFUUVB QVlrQworSHdRWUFRb0FDUVVDVXVhcjZ3SWJEQUFLQ1JBYTdNNG8ydUgrSzV1bEQvOXN5SzRYanVB eHZtdW15cHdnQnRVQgorMmlSY0VScmZwdlVWVXpxYmc5TjF0SDhCbzd5ckY0dE53R28yRnVoU2FM eTgrT1YwVnBSYnU0aDdxZmIvOHVYUAorUDQxSjVRTDN4UzZoQTJpT3RDU3ByWHlDQW9TWjVqVnlm Tlo3akpLcnVMMHBlOGwrbW05V1pmR21nRHlGV2tQeAorQW9lVEtSdkR1djFuZVJ6V1NicEpyYWJX RUNIU3BaM1E4ZDcrM1FoaTFlQnZEMDcycmhoc0JNWCtnS3haQlJKUAorWkh3b2JIRG5YSFRYK1cx czJPUWR2TFJDandCNGc1SjZmaGhQN0FoMmdaTjRmVDFQUzErNFZIT1IvTDZtNWlVdworNEFWYXRE bWlKUlIra1cxSTRiY01tRVNmMS9KT2NTQ2w2S1pmQytUVHpZR3Z0YkRXa0I2cmt4eUdVNkR0enJS bQorYXBab0R4UGZaR0lsWHlJVmYweEpuclpKTlMwaTlGbEg3V3ZyVTFoZFJkWml0VFdrWE8vbEly aUsvMCsrYldJMgorajhFbzVkYUtCaWc1OTJiTzNJRDg4Yy9yL1lFWklsMDBtREZjU3UxeUtkc3A0 UDdhMUZkaUFOdm96RjBwd01lQQorUnc0VXZsZlBXZzlqSnUxR1gvbStndHR3MlZlVGw1QlczV0Fj MnFGb2FZZ2V4SlVZVUdONWI1Z0xibnowNEVzZworckRGN2d4aUVpRk1ZWDFHTDZUVllYclcxZ0wx eWtaSVUvTUkrbEZMU0c0ODdIbFdPYlh1NjZyaEowMllaUnVyWAorRnpxZ1VpM1ZBc3d1bzNvc2w5 SmxwcFVsb3h6Mk1KdnpoNkJ2cjUvYmtCSlZvbExwY2psMEg0QnkvdENXN2JmeAoreFVBbG5adW1Q THFSMisvZDBESm10UT09Cis9SkFnUQorLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0t LQorcHViICAgNDA5NlIvMURFMDA2NDkgMjAxNC0wOC0yNyBbZXhwaXJlczogMjAxOS0wOC0yNl0K KyAgICAgIEtleSBmaW5nZXJwcmludCA9IEY5MTggQTVEMiBFRERGIDVGN0MgNkFCNiAgN0NCNCA3 MUM1IDY3MDkgMURFMCAwNjQ5Cit1aWQgICAgICAgICAgICAgICAgICBBbGFuIE0uIENhcnJvbGwg PGFtY0BhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDFERTAwNjQ5IDIwMTQtMDgtMjcgIEFsYW4g TS4gQ2Fycm9sbCA8YW1jQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgQUJBQTJDOUYgMjAxNC0w OS0wNCAgQWxhbiBNLiBDYXJyb2xsIDxhbWNAbmV0d29yay1nZW9ncmFwaGljcy5jb20+CitzaWcg ICAgICAgICAgNUQ3QkJDNUEgMjAxNC0wOS0wNCAgTGVpZiBIZWRzdHJvbSAoQ09ERSBTSUdOSU5H IEtFWSkgPHp3b29wQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgQjg0NTA4RUMgMjAxNC0wOS0w NCAgQnJ5YW4gVy4gQ2FsbCA8YmNhbGxAYXBhY2hlLm9yZz4KK3N1YiAgIDQwOTZSL0IzMjA3MkUw IDIwMTQtMDgtMjcgW2V4cGlyZXM6IDIwMTktMDgtMjZdCitzaWcgICAgICAgICAgMURFMDA2NDkg MjAxNC0wOC0yNyAgQWxhbiBNLiBDYXJyb2xsIDxhbWNAYXBhY2hlLm9yZz4KK3N1YiAgIDQwOTZS Lzk0RDk2REUyIDIwMTQtMDktMDMgW2V4cGlyZXM6IDIwMTktMDktMDJdCitzaWcgICAgICAgICAg MURFMDA2NDkgMjAxNC0wOS0wMyAgQWxhbiBNLiBDYXJyb2xsIDxhbWNAYXBhY2hlLm9yZz4KKwor LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCitWZXJzaW9uOiBHbnVQRyB2MQor CittUUlOQkZQK1BxZ0JFQUROanBBVW40dHVOY1lFOENUWG5qYTB4MHJ0ZW8yTWRaSnJIZWE3cmRS OFlqTjJybGdjCitRdm1Pb1lTWWYxOTRNYWNCdVg3cGZjK0I1d2d5LzA3QXVxVlRyTjlQZkx6VEpm QlpTcUw0R1U0UllIQi9vZFdRCit4aVlXcERsbVBQYU52SGVjQ2RFMjFVUDkwRkFOYmZBb0o4MEsw ZCt0WVZxMmpjZnV5NlpBcE0zdlhjRU1EZVVYCisxUFVzcjhGY0ttbjhNYjlqMjRGUnE0amJqRlBh b0VnL2dpVWl6Sk8wTjQrcTlJc203QUR1NXFxbzFjL1pSTEdZCitFSVRLekhlNU4yMElzcnZFbllj YUMxYUhncTRjYmR2NjM4Vjk2TXlzdXlpdFgyN1dtcmhnMWo1WkJmT3FaOUlyCiswUUR4d0J3OVVT L3k3S3hnb2x2Q0xKVG5PdjNSKzA4ajgvZGtiQWZtcU5oWVJTdEF5eExyM1B3akRoWU83Y1FICitT aWFEc1VtZTBibWMrdkFvalQ0T3ZNQS9BRWxHQjdFUm9ZdWo0NVJYUTRkdXR0eWdyQk9JZmkyYUJG SzRMOHBECit0Qm1BaG4zMHllNVJTNlEwcytBY2J0WHFzeVh1NHcwdS9JbkNLcU14ZnhlbFV6UzR0 OTB0dkF4QmtSUEQ1dUFxCitXSDFlaWZoL2l0WDZoemtxb2RYMkMvcGdjeURtejJhZ2JzSUJYRVpW MU5LUFQ5a21Oam50Sit4a1ZhUUJhcWRsCis2YkZmYlZoZWlGdVNlN1ZHbHFGNnRiSEkwNEZ5TVRt R3FOdlF0VXZsWXlXQklIWUJGWC9UWDA2em1iU0hkS2V5CitHZ1BEakNYTnRESXlrNDRsSFl2RGlX VnE1WUVDQmgzTFlsNzNYam5PQ1ordlB2a1pyYlhySzFaUFpRQVJBUUFCCit0Q0JCYkdGdUlFMHVJ RU5oY25KdmJHd2dQR0Z0WTBCaGNHRmphR1V1YjNKblBva0NRUVFUQVFJQUt3SWJBd1VKCitDV1lC Z0FZTENRZ0hBd0lHRlFnQ0NRb0xCQllDQXdFQ0hnRUNGNEFGQWxQK1FwSUNHUUVBQ2drUWNjVm5D UjNnCitCa203a1EvK09iT1U3ZWZBNUhneXU4NHR5anBrVUNWcEdpTVdTMWhOMXVvS0xQdmxUOG1p WFM4UlNYYVovTFlyCitBUjd4UFZiQkI3Q1daU2R2VHJGOGcwdUkxQjB3N2J3RnhwVFZBVlpBaW40 eDR3WTg3OXZSdDZCMU9uaERCdkVsCitzbzVKL1ZEVnlOd0lmR0pTeXRjS1JkRmJCZXdyY0UrMyty SjE0eVpkNWVDam9Ed1B2UENCbVVPWHQ0RTFtbzJrCitFV2Z5RDZmclZpK1BpWW1GTWF1QU5sUkRO TmxhOWgwNXVBTlFZOFJGdGZ4RWY1TlFFK2hiUkZwQjdVa2dEQUVRCis2SGwxaTdSaWM2R0hFUmhp YTljeisxUHRFQjZQWktTOU9KRTg0WWpXRytTN0RqZDRqYlA0QUt2VWJtYWZpSGM2CithbnZQeGVC V2VBekt4VnM2K2prT3dzK3ZMMUVNOHdCbVhZbm1aVGF5Tk1FbXBCaURBSFRFM2laUnBNaXliZlJn CitWUXVqWlg0bUUyZkZHMUF6bUIrZ0k3bnpselR1WkJoZlN0Yi9FMEJRcnMxbzZYZ0FzTnpSQ1dl d3FsaXdTUm5jCis4NERNWGg3Nld6UUhjd05EMDZwaGxkUmhpTklnNVVQQjRraVROSkp2d01zcUhy SEJoYUtCSVVuRWxCN3JrUnhOCis1V1BwUUVVYU9rdEhNOFBBR1d5T09xOWhacVIzY0lDRHdiYmlV eXk5a3ZIbkdEU2o3d283YVU5SXo2VHdtVG9RCitQRGVVZUF4S212QWRMZ0NWam5BU2ZQWmQ3VHVL ZUlxQnIyM1hlZEtjSktzVVZhZjVkYVVKb0hoWUxOOStqVDZ5CitNWWxocjBKTlF0MVFqQ2dBcHcy aitubHFSZjlrdFdYdTVsYlVjRVNydVRCQUFDNTdMcDZKQWh3RUVBRUNBQVlGCitBbFFIclVVQUNn a1FDb2NDNzZ1cUxKL3BVeEFBa2FQa3RsNWkraFBJaWlqOEVuREg3WFEzREV0TWgveGs5MzNMCitn bi9JZXRKNmxxbVRncjJvaC9tWXQrMFNKb1ZHa2t3a211bldmUmUzeG91QlEvSXZVOGhYRVFsOVNk Y0pmRGVyCitTeHVhb0xFdHNGUDN5dWs1cDRkWVRpMTVRRnhCb3RISUtkOFFnRmRpTmtOTGYvaGxu d1NwaDZ5aXB6eGpPYnNaCitRR2tXc3RzQnZlRGgvT0V6bFl4U0xLM3hRbHl0RzVuNEJOb2hMY3Vv TEF3T1M5NUtjUXhRSUUxZ2RHY0x2VExTCit2VTFOeWt0VmozZ21yZnJ1UzRtTjhxb1lERXlkWGgw ZWs0VlBnNk5QL0p5ZVl2RVUwdFNaMFZPaHk0bkdoVDU2CitFYkl0a1VxekE5WlhTNXNyT3dWa3Mz NTJRbVF3S2paL2VEVHZLeGpZSjhXOUk3c0oweDdxOVFkYVEwckNYT0xtCitKVTFoejdxU2dhUStY byt2d0FGcG1RWjV2REpvdDUvbnpxUjB5dVBSdEhyZGpPS0VteDN3S2puN045T2NHZFluCisvQUky TWlWQ2I1bVlDNmFJQXZjdmdXb3hBYk9lZ0tQY1dacHhCSmM2RDNBVzc0RTV1NmFCWS9MT1VHaVk1 V25BCitlaEZEOW5tcmZqUEs5ZHZkMDRVWnNVODQ3b1FxaE43VzNMQ2FkOFM4N1BnUm52Ym0rVldr SHB0VWdyekJueHVKCitYa20waE5QN2duMGZpYTU3QVJnSy9OYjZabDlFdG9qN0tKWkJxMmRNWmZO aTd4eGk1dVBYQVJraVZhR1JHR25jCitSV0JSekVPUC8xbTNoVXQwLzY5QUhCVmc2cUhtUGVCSGov bDdyOE52SmdoV0JUTnc5NVRyQVA5MENUMEhIWnNqCitJUVJhNHFTSkFod0VFQUVLQUFZRkFsUUkx K1VBQ2drUVV6M3ZGVjE3dkZyZEdRLytOdnJkQ1ZXaU4vejZtQVRXCitZdU9ISHRFdTJYVkUxT0VI WXdGZ2d6WGpoN3NiQWN4NE9MeUhjV3RUL1BVZTdaYUN1L1RqL1ZGNkI0SjRsNzNiCitab1MyQXk4 eDUzbXVpeEhrYzI2QkhsbWl0dG00Q3RWTmZ0MFY4eU9rY0VnSWxPYzVBeUc3K1Voc2lvNWIrSVlv Cis3WVZDcFNsWmw5WjkrRGk1WFlVR2Vxei9Vbnd0ZCtRSXl0REsyNDNBSkZLTzArZFhuZUFpYnRw UEx6MGwwdGR4CiszNk5LdjZRT1p4dzRqeC9SN2RHK3BDdkhyQ2pNRS9rSUxVSDVEM2NoYTF5UFdB SFRwQS9RY0FoaXBGQ3NqYzNNCitIbkRUaHVzdGdiVElqa2JsREE3c1RTemplZ1h0bmd2V1BYWFdF bU51NGRXcVg5R2N6UVpnWE5OWTZISUVZU1BPCit1WCsxNEpFa0RHYXYwN29rOVNXM0Z4aTdwNEtD WnZJRFkvT081VGd1OWdmb3ZocFhub0dObVNnV29WditERXVwCitPaldkdFE4ejNtMEk2R0l5RzdF Zm41OG1zS2xMVlQwdGdQUGpBcDF4YWJsNWFXSTVtY2J2ZWxTTC9DZlM2QWhHCitzaWlyaStpT2wz bS93ck9XRTA4TEs0QS9Xa3oxMmNvZDIwMldEUTBIU1JLQzlmVW9pM2NyMy9HQ0xqWjE0UmJSCitL SlRlcHo2ZDRub3dLT2l2VVkrS2JhMUVMRG9Fa2JPTjQxRGlVbnBReFlxang2eDhNNWJ0L2lJTGho Z3NHZkpTCit1Q051aDloTzZjQVE3ajU2eGZKK25MWnNTSVpHL1AwMUgvSHE0aDZ0UW9tWTF0VHhn bWREczZZUm53amFvNWJGCitsQXBxYlBaaG9ITHNRT1U4RWhSdGUyZTVBbnlKQWh3RUVBRUNBQVlG QWxRSTJBRUFDZ2tRVFJWQkVMaEZDT3dtCit0Zy8rTDNaczR1Rk96M0E3QTJtRnBYalVhV2Q1N0pl NWhwZklha3N1OWQ1QTFRcGhoZi9qWU1sUnFGYjdwVFdYCitRU2trWE96aUFZSCthUEdyQkdxVGZm Mzl6SDB0U2ZxdisxYk1CT0dnT0Y2ZkpPS21PNVhmdXdBL0RtU3NxT203Cit3dkhDNEc1YzdwLzdE cXFsSEE3RHJXelJIR2g4VG4rT3RWenV0OVpxS3JESlVvV2NmTW84dFllZWdVWXZuUHl1CitkbUJY KzdwSEVxREo0VVRkZjhtYmcwcWR2NVgzVFd3cSs2MG9EbGxHNFZ0dm5rRFhBUU1zamFYT2hLZnhn QzlRCithb0xaQUVGbkZ0U01rZkU2OFc3WHo5ZWZOdmVyU0h0UEZlWnpjNVJpN2tDOWxtaTAwS2dp QUxOajB3cFR4ZU1kCitMRGZza1V1Z1VrUXRoYlF3R1N6ZEl5Ui9XQ0YyM1JvMENJaUliUHVaK0Rq MC9tdHhHbG9kS2R5eFpNalJUNkc0Cit2U2cydGIrakVMdTd5NjI0VU80dXZOTjhaZjI2cnE5RnE3 UFBzTC9CV3FmZVAranp4SFpUaHBNVHUvRklvRHN2CityRDdLU252YTBrOWd4Tndhd2VjMXZkMWNi alhGbWVPZTdsVXk2NSttdmVlK3VSd2hHbU1mVWlYTkRXRk5GUllVCiswNHdGSkhyM0MyOEg4QXR6 bWdESVpYK0wwSDIyY2FGUHBVeHVuay85WmhxY1NjOFJCbE5VNXcwUG9ub0RSUlExCituSVhDTWZN SWN0VC81a3dKSDYvZ0FjSW9CcGI0eFFpMVAyR2hHRWRGY2phOW1Ja3ZMYXdIYmQ1NEN1UlN5dkxM CitXRThhQTB2bHJXeEdRNUkreUsrT1U2eUowZENVSmJYbkNMSjk3WGFQRDd1bWFWZTVBZzBFVS80 K3FBRVFBTFVxCit2c3B4OTZPcktISjh3QUplcFZnRXV5ZHBJb2wxNTl0elo1UzYzZkFJUFNRSTVZ Yk92MmJrR29WcThUVDFGZzhwCitzTW9WZFVsalJOc3RjOUxsS1VUQ2RDK2xjSUVoMk5vL1g4czRB ay9STkF2MFZtOGowUUJ1SjhGUkVQZkVOcVQ5CitGQmdaNWhyeWFxSHJWeWc0MnVpbFQ4Rll6TnV0 dmUrRlp1cmI1YnB4Q3N4Y2FsLzlyS3NzaEJ1aWtrQW4wT2lxCitxSjJPTXFwSzRFa0xMMFNOSnBT UEo2UGtkZThrVkp2d1pFOXR5MmVpVnhvTUc2cnJ1cGZyajJuZWtJZ0pFRVc2CityS0VzRUlrTWJ3 aWNoTjY1N0J4UDRwQTRSV05sTnJGb2wzajEwdVQwZjVNSFpEaWlQVHVwMmFQN2IrcGZCdGJ2Cis5 MjJNWVFMb2hEMVQwdU9IYWhiY1JpVG9wRll6TGc0enQrdWU1aTNaOVdtYnNhQVZVb1JBT0lLelk5 MmVzZS8wCis4R0xEem1pNEljOGk5MThQRkhDY0RmUTJFNjUrQnZFR1dVU1JIcUV3SlZuOWNNOFFQ WFhVTkRzS3dWQkxFU0QwCitEaGllZ3F5MTZ0VE9oSU1xYlJOdEZaUWxYTFRwRlA2NkhCSVRpd0dI bWYyeEtZMTRTWTVra1YvalgvWkdwYnd2CitlTHBiZVFqS2h6Tk9tODVHUjNyZGVmYnkrYk5sTWQz YXNVbFRkd3ZMa0F6MWt1L3ZTVEdycnR3V2ZJZ3N2OTh0Cit1ams0V2FUVFIwWjFVQW1yNHBjTGxm TGNHb1BJUnJydlRBNDg1V1BUckRUNVpUMVpINGFrODdMaUllbG9zd0s1Cis0SFpjYnVJM0N2UFZr RVhidDB5dGlDVCtkMFh5cnI5Y3dTVllLOWZwQUJFQkFBR0pBaVVFR0FFQ0FBOEZBbFArCitQcWdD R3d3RkNRbG1BWUFBQ2drUWNjVm5DUjNnQmtuTHJRLy9jLytQWUcvSWl4SkZ5RFIzaGlNbDBZNmpL YWlZCitpUXFCTGpQZ0dUeTNUK0VDWFQya250UVUyT29hZk5YZ0pnSmhGUjZCYkRwWjREdlB2SWtw cks1eG5FbGdSVzFPCityUjFoVFRsOWZhVDRqOVQ3RUlNMVpZeUhNN1RWNmNIdEJ4YUxaQXh0cXQx Z2dwRk5wMFdub1IwaHV4dzMydlZhCitjS3BNYkVjNFpRTzVNcHphbkRPYWxRalN6M21LdllQOHlx Q3QrOTlMYXI0YWJxOEJWb2ExSVBZUHRLRTBENzVuCitUQXE1NENySWp0ZWx3K2ExenpFd3V1R0Nl Q0hhUTZlY1pScDM0OFcva205Sm9sK1VnZmJxZU9vbGtFeHRWakNCCitXS0EzYkNQY2FiaGVZTmN0 Qm9XcWw0aVgwYkVzU01BYnhJUTBnYWt3OVkrZFFHVXhQRVRndWV0WkF1ZDJadUJDCitOTlZ2TW0y d3VQOXl5ajFITktRTm14S3k4eWFWQnRrMU1FUkxqejg0STgzZUYzK2NHQ0xjeE1TTGV3ZnhJQ29O CisxUXlVR3I4aVk2OENzMndBUVBGSWNXYkUrUm95RVhVK3h1UmVYb3ZhVDN5Um8zdEk1d2k0WVNM Y2J3WUV1UUc3Cis3ejl1UXpUaXlkeUF1Y3lIQlRlU1hRaHFDSGRXL3UxaW84eU5Rd2orMFJKcUIw b2NyR2t6S2Y5WWZZYjNERWx6CitCQ0VPbXE3U3Z0WHlubGJzS1d2WFAwSUdFOFgzSG1SWnVUaXNM ajIwMkhidDVQM0lyQS9nQW9aUm81N0ZHWDZpCitjRUpOdEdyOHJSU3lFamZTdnJOV0x1cWovVnU0 U3VPbmZYQ20wM3ZGR00rK1RPMU5NbVcwblVZR0F5aFJicG5FCitwbzNYeVdDYTZBV3ZHZm01QWcw RVZBZVpNd0VRQUxmd080OUp4eW4wbmRkZ2hXOTJlMkM0ZVZ1cnpvRWxnVi9yCitmLzl0Q3lCK1hC Tmd1Nm5Db0VuQmZDdEpRT0srV0ZrS3VFeFBGSCttcWc0WkRidDk5VFhjM0o4eTB3cnNvWjI2Cisr bWhkaXpLaTBaVEVVWUY5UU9vLzY0RmFndFhVN0VJQkZ1enBDMmhNbHc0MEFnWHNpNHJHdmdxR2tZ eFlxZjFDCisxUGsyOUVVMllvQ0t5OFJ4eUVNWU1zV0psZE5nMkMzQUxWbTE4d2VFQk01NlJ6cWwy RkgrRXdJdHRnTEFJMzdJCitVeUhBUFpnZkdQN0c1RE4vbnZwcjJqdmNxTE5zTTRWdDZsNVk5R21P cnBJRXNSU3BaOXRRVUplckNOcU12UjRyCitndFJIYm4ra2RtbU82VzY5d2NGcmc5dHMxWFZWTCtM bjk5VmtxSGxkYmZVcjhVN0VkRE9PVU0rOGhTNTNscEZnCitIaVNZWnRqK1hYQzZic1ZRTitrdld2 em9KSkxXR0oxWFpyNXJzQ0hObVRzRlN5TFFrQklUNlQvM08ySjNhOWlCCisxTmRFTmlUWDlqbjNH aDdEbHJuVm5Zc2JyaFViZkQ2a0lKUHRzV2V1ejdwUWh4WTlsd2owMUJUU0hZeVNvbERVCitSdzRN T1ZYWWNucjlscDAxbWt6QlRhb1lCOTJXbkppY3JUSVBBY0ZSQnhhRTQyYlU3bTB3MTljZDdNVVhC R3FkCitpZjdydytNY1o3VytiTHRGQklvV0FvRnRmaUFKZUtwYTNYUDBWcnFsWDQ1YnlVdEUwQ09S bm56c2QyaStOdmc0CitrSlhsMUllWTNibE1OSWEzcDRMRm52bGg3MldZTng4TTVBbFY1Q2Vjc09B bFk2SjRMWTIwUllFS3VZaHlISnRwCitiNnVYRmZrSEFCRUJBQUdKQkVRRUdBRUNBQThGQWxRSG1U TUNHd0lGQ1FsbUFZQUNLUWtRY2NWbkNSM2dCa25CCitYU0FFR1FFQ0FBWUZBbFFIbVRNQUNna1Fh djdSVXBUWmJlS3BUQS8vV2dGOVZnMXh4ZytPV1ZNMmRiQjFSd0FlCisxL1R5dVdOQWRmZXNDdEFV c09oSjVFRWdCOHNGNmNpK2R4OFFmR0FYdGJxUGwyb3Bqakh0QkZmQTlLZmVORXAvCitjNjE5YXIr NzRqQnY4V0lhamdLclpoSnFtSlNUM0Z3UUJUMGxaWjN6WFo1N2hmYmFFN1B4bVUwVU03b0NBV21i CitjQ21BeUhpREZKSDNTdTkzcWxtSUdjOXRjVVNFQlBaMVFhbHFWNkxXVURkVHZRVjlacHMzbUdn bldTUHI2cnZSCitNcmYyYis4ZUpNMllxdm13aWxVZ3RHd0VKMnY5R3ZVeTM5bTN6WE1aRUJvUjVs RG0ycXRhN2RiVkIybERRdVRwCis0cE5XdmdNOG1ocDZKRWVTaURyYjUwd3JES1pmMWt2MmMxZWZt bjNFQ1BxNkZ6d3JoRVRiMkh6U3hmazdjNGZkCittOVpuNXErcEFMZisvNmNkNW4yWldnVnJpODE1 VlltN2M3bWJNRCtFRkZERVoyTGdPNDQyWmY2aEQxMmV5RGc3CitCZ3Z6cmZub0oxb0wvVXpXeUxl ci9KcWZRMkpIZ3BSeWVOUUg1VXBaWVI1RzdjVnJPaUJ2MzZoVHU3SnN0TXFzCitsNlhTUUZFSFpL M1F2eUt2L29pUGxaUHY4MlJIdkRLUWp6UDJRVzA5NWhVRVlabnZ4aldNN0wvSkRSeHN3K2hhCit3 NHFiM3JkQ3hlK1R5SytOYU5oZzZ1M0E1Mlphd0J0N3pzVFhaR1lsZ1JvTStFeDlZZnZWNVpsb3pY QzdpZnhFCitCSTNnQmxpem1YYllXTGdhMlJ5K0tZRUQ1djZ0L0xSRlVqNEI4V0Zid2p4QnIrZmk1 VXhLM2JYY0w5RGthMFQ4CitiWk9DSWtZamlnOHZlc2c4ank2eHBoQUF4V1JnNG5pYzM3RFEzVHZQ UWdxVXdTSGs4ZzFtSldscUdwbmhUb3NrCis3Y08wRTE2ZzYvZTRPZUN2YnZWRGpTRnZxZlFmbEpX WmF1VEdJaUwyWXlYTHNUTFpsL2ZCR1pVaXl3MGphV0hkCit6cUlxVWx2Y2pienJEeTJMSmFXQlND cTlKNXMvRjBic0RjRk5QT1pPTnRJdEd0akNKNnBsR1FJa2lYSkVkWDhYCis0aTVpYWk3cnVGbXRk aFhNTXE3YWtLcjRzeUVrMUpLUHNGekRSbkVsNDVpQTJESThBWjc3dml3cGVpZ0dMOGtxCitrM0xE c1RBY1loY3JlaEZjQ3ZKcmJKREo1bDlHZStSL2VRVzdVUVZzdmsyNE5zOHZERXdZL2s0RHRkRnlv dFJnCitMYlVaNG5QaEsvbGhYYktZQy84OWUvMG5tNC9DVmd2QUIzZlJWRVJqVS95c04zbGxJTnJi LzZzL1JZblBvbXY2CitGaWtZTmtZUXFPYkZGdkdCelRJbnBhT1ZObjdwOXdYUjZqMzVnMDA3ZWJM clRpQnBZdHJUUmhsbEpHVytUUXUxCitLYWxuc2NURkh2RGlzd2gvM2lLeW8zYUZDYjBjUEREdEZw KzhUbTlXTUZuamdybk1qdFM2Y3ZqcCtnc012RkthCituZ3JSTUJ3c0xjM0xVamRDQWpQd3hubWwx YmRoQUdpbXpMdXVkd1d0ZEViaEh1Q1VKZ2pIalZlS1I2RVlNS2lUCitMU25OQjlMK0RVblZBZVNC b2RWRllWTFY3d3NBRXVCN3hmMk55Rmw5MmNZTmlqQXIyREtaL21DZkZmYnlWZ2prCitoU2JueEMz bTJrQk9RLzZUQ3lCSlM3TjlMY2xxVlhZKzZoZkRVTDMxc3pZa2hZQzh1V1h4NUJqS29aV29taCs0 Cit1ejQ9Cis9TXgvNworLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQoKZGlmZiAt LWdpdCBhL2NhdGNoLmhwcCBiL2NhdGNoLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi5kYjFmZWQzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0Y2guaHBwCkBAIC0wLDAgKzEs MTc5NjYgQEAKKy8qCisgKiAgQ2F0Y2ggdjIuMTMuOAorICogIEdlbmVyYXRlZDogMjAyMi0wMS0w MyAyMToyMDowOS41ODk1MDMKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhpcyBmaWxlIGhhcyBiZWVuIG1lcmdlZCBm cm9tIG11bHRpcGxlIGhlYWRlcnMuIFBsZWFzZSBkb24ndCBlZGl0IGl0IGRpcmVjdGx5CisgKiAg Q29weXJpZ2h0IChjKSAyMDIyIFR3byBCbHVlIEN1YmVzIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2Us IFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICogIGZpbGUgTElDRU5TRV8xXzAudHh0 IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisj aWZuZGVmIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKyNk ZWZpbmUgVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NBVENIX0hQUF9JTkNMVURFRAorLy8g c3RhcnQgY2F0Y2guaHBwCisKKworI2RlZmluZSBDQVRDSF9WRVJTSU9OX01BSk9SIDIKKyNkZWZp bmUgQ0FUQ0hfVkVSU0lPTl9NSU5PUiAxMworI2RlZmluZSBDQVRDSF9WRVJTSU9OX1BBVENIIDgK KworI2lmZGVmIF9fY2xhbmdfXworIyAgICBwcmFnbWEgY2xhbmcgc3lzdGVtX2hlYWRlcgorI2Vs aWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRp ZgorCisvLyBzdGFydCBjYXRjaF9zdXBwcmVzc193YXJuaW5ncy5oCisKKyNpZmRlZiBfX2NsYW5n X18KKyMgICBpZmRlZiBfX0lDQyAvLyBpY3BjIGRlZmluZXMgdGhlIF9fY2xhbmdfXyBtYWNybwor IyAgICAgICBwcmFnbWEgd2FybmluZyhwdXNoKQorIyAgICAgICBwcmFnbWEgd2FybmluZyhkaXNh YmxlOiAxNjEgMTY4MikKKyMgICBlbHNlIC8vIF9fSUNDCisjICAgICAgIHByYWdtYSBjbGFuZyBk aWFnbm9zdGljIHB1c2gKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAi LVdwYWRkZWQiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xc3dp dGNoLWVudW0iCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XY292 ZXJlZC1zd2l0Y2gtZGVmYXVsdCIKKyMgICAgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19HTlVDX18K KyAgICAgLy8gQmVjYXVzZSBSRVFVSVJFcyB0cmlnZ2VyIEdDQydzIC1XcGFyZW50aGVzZXMsIGFu ZCBiZWNhdXNlIHN0aWxsCisgICAgIC8vIHN1cHBvcnRlZCB2ZXJzaW9uIG9mIGcrKyBoYXZlIG9u bHkgYnVnZ3kgc3VwcG9ydCBmb3IgX1ByYWdtYXMsCisgICAgIC8vIFdwYXJlbnRoZXNlcyBoYXZl IHRvIGJlIHN1cHByZXNzZWQgZ2xvYmFsbHkuCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBp Z25vcmVkICItV3BhcmVudGhlc2VzIiAvLyBTZWUgIzY3NCBmb3IgZGV0YWlscworCisjICAgIHBy YWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25v cmVkICItV3VudXNlZC12YXJpYWJsZSIKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9y ZWQgIi1XcGFkZGVkIgorI2VuZGlmCisvLyBlbmQgY2F0Y2hfc3VwcHJlc3Nfd2FybmluZ3MuaAor I2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX01BSU4pIHx8IGRlZmluZWQoQ0FUQ0hfQ09ORklHX1JV Tk5FUikKKyMgIGRlZmluZSBDQVRDSF9JTVBMCisjICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0FMTF9Q QVJUUworI2VuZGlmCisKKy8vIEluIHRoZSBpbXBsIGZpbGUsIHdlIHdhbnQgdG8gaGF2ZSBhY2Nl c3MgdG8gYWxsIHBhcnRzIG9mIHRoZSBoZWFkZXJzCisvLyBDYW4gYWxzbyBiZSB1c2VkIHRvIHNh bmVseSBzdXBwb3J0IFBDSHMKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19BTExfUEFSVFMpCisj ICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0VYVEVSTkFMX0lOVEVSRkFDRVMKKyMgIGlmIGRlZmluZWQo Q0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMpCisjICAgIHVuZGVmIENBVENIX0NPTkZJR19E SVNBQkxFX01BVENIRVJTCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0VO QUJMRV9DSFJPTk9fU1RSSU5HTUFLRVIpCisjICAgIGRlZmluZSBDQVRDSF9DT05GSUdfRU5BQkxF X0NIUk9OT19TVFJJTkdNQUtFUgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0FU Q0hfQ09ORklHX0lNUExfT05MWSkKKy8vIHN0YXJ0IGNhdGNoX3BsYXRmb3JtLmgKKworLy8gU2Vl IGUuZy46CisvLyBodHRwczovL29wZW5zb3VyY2UuYXBwbGUuY29tL3NvdXJjZS9DYXJib25IZWFk ZXJzL0NhcmJvbkhlYWRlcnMtMTguMS9UYXJnZXRDb25kaXRpb25hbHMuaC5hdXRvLmh0bWwKKyNp ZmRlZiBfX0FQUExFX18KKyMgIGluY2x1ZGUgPFRhcmdldENvbmRpdGlvbmFscy5oPgorIyAgaWYg KGRlZmluZWQoVEFSR0VUX09TX09TWCkgJiYgVEFSR0VUX09TX09TWCA9PSAxKSB8fCBcCisgICAg ICAoZGVmaW5lZChUQVJHRVRfT1NfTUFDKSAmJiBUQVJHRVRfT1NfTUFDID09IDEpCisjICAgIGRl ZmluZSBDQVRDSF9QTEFURk9STV9NQUMKKyMgIGVsaWYgKGRlZmluZWQoVEFSR0VUX09TX0lQSE9O RSkgJiYgVEFSR0VUX09TX0lQSE9ORSA9PSAxKQorIyAgICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1f SVBIT05FCisjICBlbmRpZgorCisjZWxpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fbGlu dXgpIHx8IGRlZmluZWQoX19saW51eF9fKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX0xJTlVY CisKKyNlbGlmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVk KF9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyMg IGRlZmluZSBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisjZW5kaWYKKworLy8gZW5kIGNhdGNoX3Bs YXRmb3JtLmgKKworI2lmZGVmIENBVENIX0lNUEwKKyMgIGlmbmRlZiBDTEFSQV9DT05GSUdfTUFJ TgorIyAgICBkZWZpbmUgQ0xBUkFfQ09ORklHX01BSU5fTk9UX0RFRklORUQKKyMgICAgZGVmaW5l IENMQVJBX0NPTkZJR19NQUlOCisjICBlbmRpZgorI2VuZGlmCisKKy8vIHN0YXJ0IGNhdGNoX3Vz ZXJfaW50ZXJmYWNlcy5oCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdW5zaWduZWQgaW50IHJu Z1NlZWQoKTsKK30KKworLy8gZW5kIGNhdGNoX3VzZXJfaW50ZXJmYWNlcy5oCisvLyBzdGFydCBj YXRjaF90YWdfYWxpYXNfYXV0b3JlZ2lzdHJhci5oCisKKy8vIHN0YXJ0IGNhdGNoX2NvbW1vbi5o CisKKy8vIHN0YXJ0IGNhdGNoX2NvbXBpbGVyX2NhcGFiaWxpdGllcy5oCisKKy8vIERldGVjdCBh IG51bWJlciBvZiBjb21waWxlciBmZWF0dXJlcyAtIGJ5IGNvbXBpbGVyCisvLyBUaGUgZm9sbG93 aW5nIGZlYXR1cmVzIGFyZSBkZWZpbmVkOgorLy8KKy8vIENBVENIX0NPTkZJR19DT1VOVEVSIDog aXMgdGhlIF9fQ09VTlRFUl9fIG1hY3JvIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19XSU5E T1dTX1NFSCA6IGlzIFdpbmRvd3MgU0VIIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19QT1NJ WF9TSUdOQUxTIDogYXJlIFBPU0lYIHNpZ25hbHMgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklH X0RJU0FCTEVfRVhDRVBUSU9OUyA6IEFyZSBleGNlcHRpb25zIGVuYWJsZWQ/CisvLyAqKioqKioq KioqKioqKioqCisvLyBOb3RlIHRvIG1haW50YWluZXJzOiBpZiBuZXcgdG9nZ2xlcyBhcmUgYWRk ZWQgcGxlYXNlIGRvY3VtZW50IHRoZW0KKy8vIGluIGNvbmZpZ3VyYXRpb24ubWQsIHRvbworLy8g KioqKioqKioqKioqKioqKgorCisvLyBJbiBnZW5lcmFsIGVhY2ggbWFjcm8gaGFzIGEgX05PXzxm ZWF0dXJlIG5hbWU+IGZvcm0KKy8vIChlLmcuIENBVENIX0NPTkZJR19OT19QT1NJWF9TSUdOQUxT KSB3aGljaCBkaXNhYmxlcyB0aGUgZmVhdHVyZS4KKy8vIE1hbnkgZmVhdHVyZXMsIGF0IHBvaW50 IG9mIGRldGVjdGlvbiwgZGVmaW5lIGFuIF9JTlRFUk5BTF8gbWFjcm8sIHNvIHRoZXkKKy8vIGNh biBiZSBjb21iaW5lZCwgZW4tbWFzcywgd2l0aCB0aGUgX05PXyBmb3JtcyBsYXRlci4KKworI2lm ZGVmIF9fY3BsdXNwbHVzCisKKyMgIGlmIChfX2NwbHVzcGx1cyA+PSAyMDE0MDJMKSB8fCAoZGVm aW5lZChfTVNWQ19MQU5HKSAmJiBfTVNWQ19MQU5HID49IDIwMTQwMkwpCisjICAgIGRlZmluZSBD QVRDSF9DUFAxNF9PUl9HUkVBVEVSCisjICBlbmRpZgorCisjICBpZiAoX19jcGx1c3BsdXMgPj0g MjAxNzAzTCkgfHwgKGRlZmluZWQoX01TVkNfTEFORykgJiYgX01TVkNfTEFORyA+PSAyMDE3MDNM KQorIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTdfT1JfR1JFQVRFUgorIyAgZW5kaWYKKworI2VuZGlm CisKKy8vIE9ubHkgR0NDIGNvbXBpbGVyIHNob3VsZCBiZSB1c2VkIGluIHRoaXMgYmxvY2ssIHNv IG90aGVyIGNvbXBpbGVycyB0cnlpbmcgdG8KKy8vIG1hc2sgdGhlbXNlbHZlcyBhcyBHQ0Mgc2hv dWxkIGJlIGlnbm9yZWQuCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19jbGFu Z19fKSAmJiAhZGVmaW5lZChfX0lDQykgJiYgIWRlZmluZWQoX19DVURBQ0NfXykgJiYgIWRlZmlu ZWQoX19MQ0NfXykKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NUQVJUX1dBUk5JTkdTX1NV UFBSRVNTSU9OIF9QcmFnbWEoICJHQ0MgZGlhZ25vc3RpYyBwdXNoIiApCisjICAgIGRlZmluZSBD QVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9OICBfUHJhZ21hKCAiR0NDIGRp YWdub3N0aWMgcG9wIiApCisKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0lHTk9SRV9CVVRf V0FSTiguLi4pICh2b2lkKV9fYnVpbHRpbl9jb25zdGFudF9wKF9fVkFfQVJHU19fKQorCisjZW5k aWYKKworI2lmIGRlZmluZWQoX19jbGFuZ19fKQorCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5B TF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTiBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBw dXNoIiApCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNT SU9OICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwb3AiICkKKworLy8gQXMgb2YgdGhpcyB3 cml0aW5nLCBJQk0gWEwncyBpbXBsZW1lbnRhdGlvbiBvZiBfX2J1aWx0aW5fY29uc3RhbnRfcCBo YXMgYSBidWcKKy8vIHdoaWNoIHJlc3VsdHMgaW4gY2FsbHMgdG8gZGVzdHJ1Y3RvcnMgYmVpbmcg ZW1pdHRlZCBmb3IgZWFjaCB0ZW1wb3JhcnksCisvLyB3aXRob3V0IGEgbWF0Y2hpbmcgaW5pdGlh bGl6YXRpb24uIEluIHByYWN0aWNlLCB0aGlzIGNhbiByZXN1bHQgaW4gc29tZXRoaW5nCisvLyBs aWtlIGBzdGQ6OnN0cmluZzo6fnN0cmluZ2AgYmVpbmcgY2FsbGVkIG9uIGFuIHVuaW5pdGlhbGl6 ZWQgdmFsdWUuCisvLworLy8gRm9yIGV4YW1wbGUsIHRoaXMgY29kZSB3aWxsIGxpa2VseSBzZWdm YXVsdCB1bmRlciBJQk0gWEw6CisvLyBgYGAKKy8vIFJFUVVJUkUoc3RkOjpzdHJpbmcoIjEyIikg KyAiMzQiID09ICIxMjM0IikKKy8vIGBgYAorLy8KKy8vIFRoZXJlZm9yZSwgYENBVENIX0lOVEVS TkFMX0lHTk9SRV9CVVRfV0FSTmAgaXMgbm90IGltcGxlbWVudGVkLgorIyAgaWYgIWRlZmluZWQo X19pYm14bF9fKSAmJiAhZGVmaW5lZChfX0NVREFDQ19fKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5U RVJOQUxfSUdOT1JFX0JVVF9XQVJOKC4uLikgKHZvaWQpX19idWlsdGluX2NvbnN0YW50X3AoX19W QV9BUkdTX18pIC8qIE5PTElOVChjcHBjb3JlZ3VpZGVsaW5lcy1wcm8tdHlwZS12YXJhcmcsIGhp Y3BwLXZhcmFyZykgKi8KKyMgIGVuZGlmCisKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NV UFBSRVNTX0dMT0JBTFNfV0FSTklOR1MgXAorICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdu b3N0aWMgaWdub3JlZCBcIi1XZXhpdC10aW1lLWRlc3RydWN0b3JzXCIiICkgXAorICAgICAgICAg X1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XZ2xvYmFsLWNvbnN0cnVjdG9y c1wiIikKKworIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNf V0FSTklOR1MgXAorICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBc Ii1XcGFyZW50aGVzZXNcIiIgKQorCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVT U19VTlVTRURfV0FSTklOR1MgXAorICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMg aWdub3JlZCBcIi1XdW51c2VkLXZhcmlhYmxlXCIiICkKKworIyAgICBkZWZpbmUgQ0FUQ0hfSU5U RVJOQUxfU1VQUFJFU1NfWkVST19WQVJJQURJQ19XQVJOSU5HUyBcCisgICAgICAgICBfUHJhZ21h KCAiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdnbnUtemVyby12YXJpYWRpYy1tYWNyby1h cmd1bWVudHNcIiIgKQorCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19VTlVT RURfVEVNUExBVEVfV0FSTklOR1MgXAorICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0 aWMgaWdub3JlZCBcIi1XdW51c2VkLXRlbXBsYXRlXCIiICkKKworI2VuZGlmIC8vIF9fY2xhbmdf XworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQXNzdW1lIHRoYXQgbm9uLVdpbmRvd3Mg cGxhdGZvcm1zIHN1cHBvcnQgcG9zaXggc2lnbmFscyBieSBkZWZhdWx0CisjaWYgIWRlZmluZWQo Q0FUQ0hfUExBVEZPUk1fV0lORE9XUykKKyAgICAjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJ R19QT1NJWF9TSUdOQUxTCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdl IGtub3cgc29tZSBlbnZpcm9ubWVudHMgbm90IHRvIHN1cHBvcnQgZnVsbCBQT1NJWCBzaWduYWxz CisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fUU5YX18pIHx8IGRlZmluZWQo X19FTVNDUklQVEVOX18pIHx8IGRlZmluZWQoX19ESkdQUF9fKQorICAgICNkZWZpbmUgQ0FUQ0hf SU5URVJOQUxfQ09ORklHX05PX1BPU0lYX1NJR05BTFMKKyNlbmRpZgorCisjaWZkZWYgX19PUzQw MF9fCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fUE9TSVhfU0lHTkFM UworIyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9VUl9OT05FCisjZW5kaWYKKworLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFuZHJvaWQgc29tZWhvdyBzdGlsbCBkb2VzIG5vdCBz dXBwb3J0IHN0ZDo6dG9fc3RyaW5nCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykKKyMgICAgZGVm aW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19DUFAxMV9UT19TVFJJTkcKKyMgICAgZGVmaW5l IENBVENIX0lOVEVSTkFMX0NPTkZJR19BTkRST0lEX0xPR1dSSVRFCisjZW5kaWYKKworLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8KKy8vIE5vdCBhbGwgV2luZG93cyBlbnZpcm9ubWVudHMgc3VwcG9y dCBTRUggcHJvcGVybHkKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgICBkZWZpbmUgQ0FU Q0hfSU5URVJOQUxfQ09ORklHX05PX1dJTkRPV1NfU0VICisjZW5kaWYKKworLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8KKy8vIFBTNAorI2lmIGRlZmluZWQoX19PUkJJU19fKQorIyAgICBkZWZpbmUg Q0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX05FV19DQVBUVVJFCisjZW5kaWYKKworLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8KKy8vIEN5Z3dpbgorI2lmZGVmIF9fQ1lHV0lOX18KKworLy8gUmVxdWly ZWQgZm9yIHNvbWUgdmVyc2lvbnMgb2YgQ3lnd2luIHRvIGRlY2xhcmUgZ2V0dGltZW9mZGF5Cisv LyBzZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzY5MDE4MDMvZ2V0dGlt ZW9mZGF5LW5vdC1kZWNsYXJlZC1pbi10aGlzLXNjb3BlLWN5Z3dpbgorIyAgIGRlZmluZSBfQlNE X1NPVVJDRQorLy8gc29tZSB2ZXJzaW9ucyBvZiBjeWd3aW4gKG1vc3QpIGRvIG5vdCBzdXBwb3J0 IHN0ZDo6dG9fc3RyaW5nLiBVc2UgdGhlIGxpYnN0ZCBjaGVjay4KKy8vIGh0dHBzOi8vZ2NjLmdu dS5vcmcvb25saW5lZG9jcy9nY2MtNC44LjIvbGlic3RkYysrL2FwaS9hMDEwNTNfc291cmNlLmh0 bWwgbGluZSAyODEyLTI4MTMKKyMgaWYgISgoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgJiYgZGVm aW5lZChfR0xJQkNYWF9VU0VfQzk5KSBcCisgICAgICAgICAgICYmICFkZWZpbmVkKF9HTElCQ1hY X0hBVkVfQlJPS0VOX1ZTV1BSSU5URikpCisKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NP TkZJR19OT19DUFAxMV9UT19TVFJJTkcKKworIyBlbmRpZgorI2VuZGlmIC8vIF9fQ1lHV0lOX18K KworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZpc3VhbCBDKysKKyNpZiBkZWZpbmVkKF9N U0NfVkVSKQorCisvLyBVbml2ZXJzYWwgV2luZG93cyBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0 IFNFSAorLy8gT3IgY29uc29sZSBjb2xvdXJzIChvciBjb25zb2xlIGF0IGFsbC4uLikKKyMgIGlm IGRlZmluZWQoV0lOQVBJX0ZBTUlMWSkgJiYgKFdJTkFQSV9GQU1JTFkgPT0gV0lOQVBJX0ZBTUlM WV9BUFApCisjICAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ09MT1VSX05PTkUKKyMgIGVsc2UKKyMg ICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19XSU5ET1dTX1NFSAorIyAgZW5kaWYKKwor IyAgaWYgIWRlZmluZWQoX19jbGFuZ19fKSAvLyBIYW5kbGUgQ2xhbmcgbWFzcXVlcmFkaW5nIGZv ciBtc3ZjCisKKy8vIE1TVkMgdHJhZGl0aW9uYWwgcHJlcHJvY2Vzc29yIG5lZWRzIHNvbWUgd29y a2Fyb3VuZCBmb3IgX19WQV9BUkdTX18KKy8vIF9NU1ZDX1RSQURJVElPTkFMID09IDAgbWVhbnMg bmV3IGNvbmZvcm1hbnQgcHJlcHJvY2Vzc29yCisvLyBfTVNWQ19UUkFESVRJT05BTCA9PSAxIG1l YW5zIG9sZCB0cmFkaXRpb25hbCBub24tY29uZm9ybWFudCBwcmVwcm9jZXNzb3IKKyMgICAgaWYg IWRlZmluZWQoX01TVkNfVFJBRElUSU9OQUwpIHx8IChkZWZpbmVkKF9NU1ZDX1RSQURJVElPTkFM KSAmJiBfTVNWQ19UUkFESVRJT05BTCkKKyMgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09O RklHX1RSQURJVElPTkFMX01TVkNfUFJFUFJPQ0VTU09SCisjICAgIGVuZGlmIC8vIE1TVkNfVFJB RElUSU9OQUwKKworLy8gT25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCB1c2luZyBjbGFuZyBvbiBX aW5kb3dzLCB3aGljaCB1c2VzIGBkaWFnbm9zdGljIHB1c2hgICYgYGRpYWdub3N0aWMgcG9wYAor IyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1RBUlRfV0FSTklOR1NfU1VQUFJFU1NJT04gX19w cmFnbWEoIHdhcm5pbmcocHVzaCkgKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1RPUF9X QVJOSU5HU19TVVBQUkVTU0lPTiAgX19wcmFnbWEoIHdhcm5pbmcocG9wKSApCisjICBlbmRpZiAv LyBfX2NsYW5nX18KKworI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZiBkZWZpbmVkKF9SRUVOVFJB TlQpIHx8IGRlZmluZWQoX01TQ19WRVIpCisvLyBFbmFibGUgYXN5bmMgcHJvY2Vzc2luZywgYXMg LXB0aHJlYWQgaXMgc3BlY2lmaWVkIG9yIG5vIGFkZGl0aW9uYWwgbGlua2luZyBpcyByZXF1aXJl ZAorIyBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1VTRV9BU1lOQworI2VuZGlmIC8vIF9N U0NfVkVSCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDaGVjayBpZiB3ZSBhcmUgY29t cGlsZWQgd2l0aCAtZm5vLWV4Y2VwdGlvbnMgb3IgZXF1aXZhbGVudAorI2lmIGRlZmluZWQoX19F WENFUFRJT05TKSB8fCBkZWZpbmVkKF9fY3BwX2V4Y2VwdGlvbnMpIHx8IGRlZmluZWQoX0NQUFVO V0lORCkKKyMgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfRVhDRVBUSU9OU19FTkFCTEVE CisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERKR1BQCisjaWZkZWYgX19E SkdQUF9fCisjICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1dDSEFSCisjZW5kaWYg Ly8gX19ESkdQUF9fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBFbWJhcmNhZGVybyBD KytCdWlsZAorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQorICAgICNkZWZpbmUgQ0FUQ0hfSU5U RVJOQUxfQ09ORklHX1BPTFlGSUxMX0lTTkFOCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8KKworLy8gVXNlIG9mIF9fQ09VTlRFUl9fIGlzIHN1cHByZXNzZWQgZHVyaW5nIGNvZGUg YW5hbHlzaXMgaW4KKy8vIENMaW9uL0FwcENvZGUgMjAxNy4yLnggYW5kIGZvcm1lciwgYmVjYXVz ZSBfX0NPVU5URVJfXyBpcyBub3QgcHJvcGVybHkKKy8vIGhhbmRsZWQgYnkgaXQuCisvLyBPdGhl cndpc2UgYWxsIHN1cHBvcnRlZCBjb21waWxlcnMgc3VwcG9ydCBDT1VOVEVSIG1hY3JvLAorLy8g YnV0IHVzZXIgc3RpbGwgbWlnaHQgd2FudCB0byB0dXJuIGl0IG9mZgorI2lmICggIWRlZmluZWQo X19KRVRCUkFJTlNfSURFX18pIHx8IF9fSkVUQlJBSU5TX0lERV9fID49IDIwMTcwMzAwTCApCisg ICAgI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ09VTlRFUgorI2VuZGlmCisKKy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFJUWCBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBXaW5k b3dzIHRoYXQgaXMgcmVhbCB0aW1lLgorLy8gVGhpcyBtZWFucyB0aGF0IGl0IGlzIGRldGVjdGVk IGFzIFdpbmRvd3MsIGJ1dCBkb2VzIG5vdCBwcm92aWRlCisvLyB0aGUgc2FtZSBzZXQgb2YgY2Fw YWJpbGl0aWVzIGFzIHJlYWwgV2luZG93cyBkb2VzLgorI2lmIGRlZmluZWQoVU5ERVJfUlRTUykg fHwgZGVmaW5lZChSVFg2NF9CVUlMRCkKKyAgICAjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJ R19OT19XSU5ET1dTX1NFSAorICAgICNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX0FT WU5DCisgICAgI2RlZmluZSBDQVRDSF9DT05GSUdfQ09MT1VSX05PTkUKKyNlbmRpZgorCisjaWYg IWRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMSkKKyNkZWZpbmUgQ0FUQ0hfSU5URVJO QUxfQ09ORklHX0dMT0JBTF9ORVhUQUZURVIKKyNlbmRpZgorCisvLyBWYXJpb3VzIHN0ZGxpYiBz dXBwb3J0IGNoZWNrcyB0aGF0IHJlcXVpcmUgX19oYXNfaW5jbHVkZQorI2lmIGRlZmluZWQoX19o YXNfaW5jbHVkZSkKKyAgLy8gQ2hlY2sgaWYgc3RyaW5nX3ZpZXcgaXMgYXZhaWxhYmxlIGFuZCB1 c2FibGUKKyAgI2lmIF9faGFzX2luY2x1ZGUoPHN0cmluZ192aWV3PikgJiYgZGVmaW5lZChDQVRD SF9DUFAxN19PUl9HUkVBVEVSKQorICAjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdf Q1BQMTdfU1RSSU5HX1ZJRVcKKyAgI2VuZGlmCisKKyAgLy8gQ2hlY2sgaWYgb3B0aW9uYWwgaXMg YXZhaWxhYmxlIGFuZCB1c2FibGUKKyAgIyAgaWYgX19oYXNfaW5jbHVkZSg8b3B0aW9uYWw+KSAm JiBkZWZpbmVkKENBVENIX0NQUDE3X09SX0dSRUFURVIpCisgICMgICAgZGVmaW5lIENBVENIX0lO VEVSTkFMX0NPTkZJR19DUFAxN19PUFRJT05BTAorICAjICBlbmRpZiAvLyBfX2hhc19pbmNsdWRl KDxvcHRpb25hbD4pICYmIGRlZmluZWQoQ0FUQ0hfQ1BQMTdfT1JfR1JFQVRFUikKKworICAvLyBD aGVjayBpZiBieXRlIGlzIGF2YWlsYWJsZSBhbmQgdXNhYmxlCisgICMgIGlmIF9faGFzX2luY2x1 ZGUoPGNzdGRkZWY+KSAmJiBkZWZpbmVkKENBVENIX0NQUDE3X09SX0dSRUFURVIpCisgICMgICAg aW5jbHVkZSA8Y3N0ZGRlZj4KKyAgIyAgICBpZiBkZWZpbmVkKF9fY3BwX2xpYl9ieXRlKSAmJiAo X19jcHBfbGliX2J5dGUgPiAwKQorICAjICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJ R19DUFAxN19CWVRFCisgICMgICAgZW5kaWYKKyAgIyAgZW5kaWYgLy8gX19oYXNfaW5jbHVkZSg8 Y3N0ZGRlZj4pICYmIGRlZmluZWQoQ0FUQ0hfQ1BQMTdfT1JfR1JFQVRFUikKKworICAvLyBDaGVj ayBpZiB2YXJpYW50IGlzIGF2YWlsYWJsZSBhbmQgdXNhYmxlCisgICMgIGlmIF9faGFzX2luY2x1 ZGUoPHZhcmlhbnQ+KSAmJiBkZWZpbmVkKENBVENIX0NQUDE3X09SX0dSRUFURVIpCisgICMgICAg aWYgZGVmaW5lZChfX2NsYW5nX18pICYmIChfX2NsYW5nX21ham9yX18gPCA4KQorICAgICAgICAg Ly8gd29yayBhcm91bmQgY2xhbmcgYnVnIHdpdGggbGlic3RkYysrIGh0dHBzOi8vYnVncy5sbHZt Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzE4NTIKKyAgICAgICAgIC8vIGZpeCBzaG91bGQgYmUgaW4g Y2xhbmcgOCwgd29ya2Fyb3VuZCBpbiBsaWJzdGRjKysgOC4yCisgICMgICAgICBpbmNsdWRlIDxj aXNvNjQ2PgorICAjICAgICAgaWYgZGVmaW5lZChfX0dMSUJDWFhfXykgJiYgZGVmaW5lZChfR0xJ QkNYWF9SRUxFQVNFKSAmJiAoX0dMSUJDWFhfUkVMRUFTRSA8IDkpCisgICMgICAgICAgIGRlZmlu ZSBDQVRDSF9DT05GSUdfTk9fQ1BQMTdfVkFSSUFOVAorICAjICAgICAgZWxzZQorICAjICAgICAg ICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDE3X1ZBUklBTlQKKyAgIyAgICAgIGVu ZGlmIC8vIGRlZmluZWQoX19HTElCQ1hYX18pICYmIGRlZmluZWQoX0dMSUJDWFhfUkVMRUFTRSkg JiYgKF9HTElCQ1hYX1JFTEVBU0UgPCA5KQorICAjICAgIGVsc2UKKyAgIyAgICAgIGRlZmluZSBD QVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTdfVkFSSUFOVAorICAjICAgIGVuZGlmIC8vIGRlZmlu ZWQoX19jbGFuZ19fKSAmJiAoX19jbGFuZ19tYWpvcl9fIDwgOCkKKyAgIyAgZW5kaWYgLy8gX19o YXNfaW5jbHVkZSg8dmFyaWFudD4pICYmIGRlZmluZWQoQ0FUQ0hfQ1BQMTdfT1JfR1JFQVRFUikK KyNlbmRpZiAvLyBkZWZpbmVkKF9faGFzX2luY2x1ZGUpCisKKyNpZiBkZWZpbmVkKENBVENIX0lO VEVSTkFMX0NPTkZJR19DT1VOVEVSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ09VTlRF UikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NPVU5URVIpCisjICAgZGVmaW5lIENBVENIX0NP TkZJR19DT1VOVEVSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19X SU5ET1dTX1NFSCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dJTkRPV1NfU0VIKSAmJiAh ZGVmaW5lZChDQVRDSF9DT05GSUdfV0lORE9XU19TRUgpICYmICFkZWZpbmVkKENBVENIX0lOVEVS TkFMX0NPTkZJR19OT19XSU5ET1dTX1NFSCkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1dJTkRP V1NfU0VICisjZW5kaWYKKy8vIFRoaXMgaXMgc2V0IGJ5IGRlZmF1bHQsIGJlY2F1c2Ugd2UgYXNz dW1lIHRoYXQgdW5peCBjb21waWxlcnMgYXJlIHBvc2l4LXNpZ25hbC1jb21wYXRpYmxlIGJ5IGRl ZmF1bHQuCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfUE9TSVhfU0lHTkFMUykg JiYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1BPU0lYX1NJR05BTFMpICYmICFk ZWZpbmVkKENBVENIX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTKSAmJiAhZGVmaW5lZChDQVRDSF9D T05GSUdfUE9TSVhfU0lHTkFMUykKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05B TFMKKyNlbmRpZgorLy8gVGhpcyBpcyBzZXQgYnkgZGVmYXVsdCwgYmVjYXVzZSB3ZSBhc3N1bWUg dGhhdCBjb21waWxlcnMgd2l0aCBubyB3Y2hhcl90IHN1cHBvcnQgYXJlIGp1c3QgcmFyZSBleGNl cHRpb25zLgorI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19XQ0hBUikgJiYg IWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dDSEFSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdf V0NIQVIpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19XQ0hBUgorI2VuZGlmCisKKyNpZiAhZGVm aW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fQ1BQMTFfVE9fU1RSSU5HKSAmJiAhZGVmaW5l ZChDQVRDSF9DT05GSUdfTk9fQ1BQMTFfVE9fU1RSSU5HKSAmJiAhZGVmaW5lZChDQVRDSF9DT05G SUdfQ1BQMTFfVE9fU1RSSU5HKQorIyAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1RPX1NU UklORworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxN19P UFRJT05BTCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDE3X09QVElPTkFMKSAmJiAh ZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTdfT1BUSU9OQUwpCisjICBkZWZpbmUgQ0FUQ0hfQ09O RklHX0NQUDE3X09QVElPTkFMCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxf Q09ORklHX0NQUDE3X1NUUklOR19WSUVXKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQ MTdfU1RSSU5HX1ZJRVcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxN19TVFJJTkdfVklF VykKKyMgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTdfU1RSSU5HX1ZJRVcKKyNlbmRpZgorCisj aWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTdfVkFSSUFOVCkgJiYgIWRlZmlu ZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDE3X1ZBUklBTlQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJ R19DUFAxN19WQVJJQU5UKQorIyAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxN19WQVJJQU5UCisj ZW5kaWYKKworI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDE3X0JZVEUpICYm ICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxN19CWVRFKSAmJiAhZGVmaW5lZChDQVRDSF9D T05GSUdfQ1BQMTdfQllURSkKKyMgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTdfQllURQorI2Vu ZGlmCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FWFBFUklNRU5UQUxfUkVESVJFQ1QpCisj ICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05FV19DQVBUVVJFCisjZW5kaWYKKworI2lm IGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05FV19DQVBUVVJFKSAmJiAhZGVmaW5lZChD QVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fTkVXX0NBUFRVUkUpICYmICFkZWZpbmVkKENBVENIX0NP TkZJR19OT19ORVdfQ0FQVFVSRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05FV19DQVBUVVJF KQorIyAgZGVmaW5lIENBVENIX0NPTkZJR19ORVdfQ0FQVFVSRQorI2VuZGlmCisKKyNpZiAhZGVm aW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfRVhDRVBUSU9OU19FTkFCTEVEKSAmJiAhZGVmaW5l ZChDQVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TKQorIyAgZGVmaW5lIENBVENIX0NPTkZJ R19ESVNBQkxFX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5B TF9DT05GSUdfUE9MWUZJTExfSVNOQU4pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19QT0xZ RklMTF9JU05BTikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPTFlGSUxMX0lTTkFOKQorIyAg ZGVmaW5lIENBVENIX0NPTkZJR19QT0xZRklMTF9JU05BTgorI2VuZGlmCisKKyNpZiBkZWZpbmVk KENBVENIX0lOVEVSTkFMX0NPTkZJR19VU0VfQVNZTkMpICAmJiAhZGVmaW5lZChDQVRDSF9JTlRF Uk5BTF9DT05GSUdfTk9fQVNZTkMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19VU0VfQVNZ TkMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19VU0VfQVNZTkMpCisjICBkZWZpbmUgQ0FUQ0hf Q09ORklHX1VTRV9BU1lOQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NP TkZJR19BTkRST0lEX0xPR1dSSVRFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQU5EUk9J RF9MT0dXUklURSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0FORFJPSURfTE9HV1JJVEUpCisj ICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0FORFJPSURfTE9HV1JJVEUKKyNlbmRpZgorCisjaWYgZGVm aW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfR0xPQkFMX05FWFRBRlRFUikgJiYgIWRlZmluZWQo Q0FUQ0hfQ09ORklHX05PX0dMT0JBTF9ORVhUQUZURVIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJ R19HTE9CQUxfTkVYVEFGVEVSKQorIyAgZGVmaW5lIENBVENIX0NPTkZJR19HTE9CQUxfTkVYVEFG VEVSCisjZW5kaWYKKworLy8gRXZlbiBpZiB3ZSBkbyBub3QgdGhpbmsgdGhlIGNvbXBpbGVyIGhh cyB0aGF0IHdhcm5pbmcsIHdlIHN0aWxsIGhhdmUKKy8vIHRvIHByb3ZpZGUgYSBtYWNybyB0aGF0 IGNhbiBiZSB1c2VkIGJ5IHRoZSBjb2RlLgorI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX1NU QVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVEFS VF9XQVJOSU5HU19TVVBQUkVTU0lPTgorI2VuZGlmCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJO QUxfU1RPUF9XQVJOSU5HU19TVVBQUkVTU0lPTikKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxf U1RPUF9XQVJOSU5HU19TVVBQUkVTU0lPTgorI2VuZGlmCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5U RVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MpCisjICAgZGVmaW5lIENBVENIX0lO VEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTCisjZW5kaWYKKyNpZiAhZGVmaW5l ZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dBUk5JTkdTKQorIyAgIGRlZmluZSBD QVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dBUk5JTkdTCisjZW5kaWYKKyNpZiAhZGVm aW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19VTlVTRURfV0FSTklOR1MpCisjICAgZGVmaW5l IENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1VOVVNFRF9XQVJOSU5HUworI2VuZGlmCisjaWYgIWRl ZmluZWQoQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfWkVST19WQVJJQURJQ19XQVJOSU5HUykKKyMg ICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfWkVST19WQVJJQURJQ19XQVJOSU5HUwor I2VuZGlmCisKKy8vIFRoZSBnb2FsIG9mIHRoaXMgbWFjcm8gaXMgdG8gYXZvaWQgZXZhbHVhdGlv biBvZiB0aGUgYXJndW1lbnRzLCBidXQKKy8vIHN0aWxsIGhhdmUgdGhlIGNvbXBpbGVyIHdhcm4g b24gcHJvYmxlbXMgaW5zaWRlLi4uCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfSUdOT1JF X0JVVF9XQVJOKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9JR05PUkVfQlVUX1dBUk4oLi4u KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX2FwcGxlX2J1 aWxkX3ZlcnNpb25fXykgJiYgKF9fY2xhbmdfbWFqb3JfXyA8IDEwKQorIyAgIHVuZGVmIENBVENI X0lOVEVSTkFMX1NVUFBSRVNTX1VOVVNFRF9URU1QTEFURV9XQVJOSU5HUworI2VsaWYgZGVmaW5l ZChfX2NsYW5nX18pICYmIChfX2NsYW5nX21ham9yX18gPCA1KQorIyAgIHVuZGVmIENBVENIX0lO VEVSTkFMX1NVUFBSRVNTX1VOVVNFRF9URU1QTEFURV9XQVJOSU5HUworI2VuZGlmCisKKyNpZiAh ZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19VTlVTRURfVEVNUExBVEVfV0FSTklOR1Mp CisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1VOVVNFRF9URU1QTEFURV9XQVJO SU5HUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFX0VYQ0VQVElP TlMpCisjZGVmaW5lIENBVENIX1RSWSBpZiAoKHRydWUpKQorI2RlZmluZSBDQVRDSF9DQVRDSF9B TEwgaWYgKChmYWxzZSkpCisjZGVmaW5lIENBVENIX0NBVENIX0FOT04odHlwZSkgaWYgKChmYWxz ZSkpCisjZWxzZQorI2RlZmluZSBDQVRDSF9UUlkgdHJ5CisjZGVmaW5lIENBVENIX0NBVENIX0FM TCBjYXRjaCAoLi4uKQorI2RlZmluZSBDQVRDSF9DQVRDSF9BTk9OKHR5cGUpIGNhdGNoICh0eXBl KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19UUkFESVRJT05B TF9NU1ZDX1BSRVBST0NFU1NPUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1RSQURJVElP TkFMX01TVkNfUFJFUFJPQ0VTU09SKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfVFJBRElUSU9O QUxfTVNWQ19QUkVQUk9DRVNTT1IpCisjZGVmaW5lIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9N U1ZDX1BSRVBST0NFU1NPUgorI2VuZGlmCisKKy8vIGVuZCBjYXRjaF9jb21waWxlcl9jYXBhYmls aXRpZXMuaAorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FMiggbmFtZSwg bGluZSApIG5hbWUjI2xpbmUKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElO RSggbmFtZSwgbGluZSApIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUyKCBuYW1lLCBs aW5lICkKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ09VTlRFUgorIyAgZGVmaW5lIElOVEVSTkFMX0NB VENIX1VOSVFVRV9OQU1FKCBuYW1lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORSgg bmFtZSwgX19DT1VOVEVSX18gKQorI2Vsc2UKKyMgIGRlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklR VUVfTkFNRSggbmFtZSApIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUoIG5hbWUsIF9f TElORV9fICkKKyNlbmRpZgorCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPHN0cmluZz4K KyNpbmNsdWRlIDxjc3RkaW50PgorCisvLyBXZSBuZWVkIGEgZHVtbXkgZ2xvYmFsIG9wZXJhdG9y PDwgc28gd2UgY2FuIGJyaW5nIGl0IGludG8gQ2F0Y2ggbmFtZXNwYWNlIGxhdGVyCitzdHJ1Y3Qg Q2F0Y2hfZ2xvYmFsX25hbWVzcGFjZV9kdW1teSB7fTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8 PChzdGQ6Om9zdHJlYW0mLCBDYXRjaF9nbG9iYWxfbmFtZXNwYWNlX2R1bW15KTsKKworbmFtZXNw YWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDYXNlU2Vuc2l0aXZlIHsgZW51bSBDaG9pY2Ugewor ICAgICAgICBZZXMsCisgICAgICAgIE5vCisgICAgfTsgfTsKKworICAgIGNsYXNzIE5vbkNvcHlh YmxlIHsKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlIGNvbnN0JiApICAgICAgICAg ICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlICYmICkgICAg ICAgICAgICAgICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0g KCBOb25Db3B5YWJsZSBjb25zdCYgKSA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9w ZXJhdG9yID0gKCBOb25Db3B5YWJsZSAmJiApICAgICA9IGRlbGV0ZTsKKworICAgIHByb3RlY3Rl ZDoKKyAgICAgICAgTm9uQ29weWFibGUoKTsKKyAgICAgICAgdmlydHVhbCB+Tm9uQ29weWFibGUo KTsKKyAgICB9OworCisgICAgc3RydWN0IFNvdXJjZUxpbmVJbmZvIHsKKworICAgICAgICBTb3Vy Y2VMaW5lSW5mbygpID0gZGVsZXRlOworICAgICAgICBTb3VyY2VMaW5lSW5mbyggY2hhciBjb25z dCogX2ZpbGUsIHN0ZDo6c2l6ZV90IF9saW5lICkgbm9leGNlcHQKKyAgICAgICAgOiAgIGZpbGUo IF9maWxlICksCisgICAgICAgICAgICBsaW5lKCBfbGluZSApCisgICAgICAgIHt9CisKKyAgICAg ICAgU291cmNlTGluZUluZm8oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApICAgICAgICAg ICAgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyYgb3BlcmF0b3IgPSAoIFNvdXJj ZUxpbmVJbmZvIGNvbnN0JiApICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZv KCBTb3VyY2VMaW5lSW5mbyYmICkgICAgICAgICAgICAgIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAg ICAgICAgU291cmNlTGluZUluZm8mIG9wZXJhdG9yID0gKCBTb3VyY2VMaW5lSW5mbyYmICkgbm9l eGNlcHQgPSBkZWZhdWx0OworCisgICAgICAgIGJvb2wgZW1wdHkoKSBjb25zdCBub2V4Y2VwdCB7 IHJldHVybiBmaWxlWzBdID09ICdcMCc7IH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFNv dXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IG5vZXhjZXB0OworICAgICAgICBib29s IG9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCBub2V4Y2Vw dDsKKworICAgICAgICBjaGFyIGNvbnN0KiBmaWxlOworICAgICAgICBzdGQ6OnNpemVfdCBsaW5l OworICAgIH07CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFt JiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKTsKKworICAgIC8vIEJyaW5nIGluIG9w ZXJhdG9yPDwgZnJvbSBnbG9iYWwgbmFtZXNwYWNlIGludG8gQ2F0Y2ggbmFtZXNwYWNlCisgICAg Ly8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgb3ZlcmxvYWQgb2Ygb3BlcmF0b3I8PCBh Ym92ZSBtYWtlcworICAgIC8vIGxvb2t1cCBzdG9wIGF0IG5hbWVzcGFjZSBDYXRjaAorICAgIHVz aW5nIDo6b3BlcmF0b3I8PDsKKworICAgIC8vIFVzZSB0aGlzIGluIHZhcmlhZGljIHN0cmVhbWlu ZyBtYWNyb3MgdG8gYWxsb3cKKyAgICAvLyAgICA+PiArU3RyZWFtRW5kU3RvcAorICAgIC8vIGFz IHdlbGwgYXMKKyAgICAvLyAgICA+PiBzdHVmZiArU3RyZWFtRW5kU3RvcAorICAgIHN0cnVjdCBT dHJlYW1FbmRTdG9wIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgb3BlcmF0b3IrKCkgY29uc3Q7Cisg ICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQgY29uc3QmIG9wZXJhdG9yICsg KCBUIGNvbnN0JiB2YWx1ZSwgU3RyZWFtRW5kU3RvcCApIHsKKyAgICAgICAgcmV0dXJuIHZhbHVl OworICAgIH0KK30KKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyBcCisgICAgOjpD YXRjaDo6U291cmNlTGluZUluZm8oIF9fRklMRV9fLCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4o IF9fTElORV9fICkgKQorCisvLyBlbmQgY2F0Y2hfY29tbW9uLmgKK25hbWVzcGFjZSBDYXRjaCB7 CisKKyAgICBzdHJ1Y3QgUmVnaXN0cmFyRm9yVGFnQWxpYXNlcyB7CisgICAgICAgIFJlZ2lzdHJh ckZvclRhZ0FsaWFzZXMoIGNoYXIgY29uc3QqIGFsaWFzLCBjaGFyIGNvbnN0KiB0YWcsIFNvdXJj ZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFj ZSBDYXRjaAorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX1RBR19BTElBUyggYWxpYXMsIHNwZWMg KSBcCisgICAgQ0FUQ0hfSU5URVJOQUxfU1RBUlRfV0FSTklOR1NfU1VQUFJFU1NJT04gXAorICAg IENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JBTFNfV0FSTklOR1MgXAorICAgIG5hbWVzcGFj ZXsgQ2F0Y2g6OlJlZ2lzdHJhckZvclRhZ0FsaWFzZXMgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05B TUUoIEF1dG9SZWdpc3RlclRhZ0FsaWFzICkoIGFsaWFzLCBzcGVjLCBDQVRDSF9JTlRFUk5BTF9M SU5FSU5GTyApOyB9IFwKKyAgICBDQVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNT SU9OCisKKy8vIGVuZCBjYXRjaF90YWdfYWxpYXNfYXV0b3JlZ2lzdHJhci5oCisvLyBzdGFydCBj YXRjaF90ZXN0X3JlZ2lzdHJ5LmgKKworLy8gc3RhcnQgY2F0Y2hfaW50ZXJmYWNlc190ZXN0Y2Fz ZS5oCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFz cyBUZXN0U3BlYzsKKworICAgIHN0cnVjdCBJVGVzdEludm9rZXIgeworICAgICAgICB2aXJ0dWFs IHZvaWQgaW52b2tlICgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB+SVRlc3RJbnZva2Vy KCk7CisgICAgfTsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIHN0cnVjdCBJQ29uZmlnOwor CisgICAgc3RydWN0IElUZXN0Q2FzZVJlZ2lzdHJ5IHsKKyAgICAgICAgdmlydHVhbCB+SVRlc3RD YXNlUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29u c3QmIGdldEFsbFRlc3RzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9y PFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZp ZyApIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgYm9vbCBpc1Rocm93U2FmZSggVGVzdENhc2Ug Y29uc3QmIHRlc3RDYXNlLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICBib29sIG1hdGNo VGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMs IElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0 ZXJUZXN0cyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0Q2FzZXMsIFRlc3RTcGVj IGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgc3RkOjp2ZWN0 b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIElDb25maWcgY29uc3Qm IGNvbmZpZyApOworCit9CisKKy8vIGVuZCBjYXRjaF9pbnRlcmZhY2VzX3Rlc3RjYXNlLmgKKy8v IHN0YXJ0IGNhdGNoX3N0cmluZ3JlZi5oCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUg PHN0cmluZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNw YWNlIENhdGNoIHsKKworICAgIC8vLyBBIG5vbi1vd25pbmcgc3RyaW5nIGNsYXNzIChzaW1pbGFy IHRvIHRoZSBmb3J0aGNvbWluZyBzdGQ6OnN0cmluZ192aWV3KQorICAgIC8vLyBOb3RlIHRoYXQs IGJlY2F1c2UgYSBTdHJpbmdSZWYgbWF5IGJlIGEgc3Vic3RyaW5nIG9mIGFub3RoZXIgc3RyaW5n LAorICAgIC8vLyBpdCBtYXkgbm90IGJlIG51bGwgdGVybWluYXRlZC4KKyAgICBjbGFzcyBTdHJp bmdSZWYgeworICAgIHB1YmxpYzoKKyAgICAgICAgdXNpbmcgc2l6ZV90eXBlID0gc3RkOjpzaXpl X3Q7CisgICAgICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gY29uc3QgY2hhcio7CisKKyAgICBw cml2YXRlOgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIGNvbnN0IHNfZW1w dHkgPSAiIjsKKworICAgICAgICBjaGFyIGNvbnN0KiBtX3N0YXJ0ID0gc19lbXB0eTsKKyAgICAg ICAgc2l6ZV90eXBlIG1fc2l6ZSA9IDA7CisKKyAgICBwdWJsaWM6IC8vIGNvbnN0cnVjdGlvbgor ICAgICAgICBjb25zdGV4cHIgU3RyaW5nUmVmKCkgbm9leGNlcHQgPSBkZWZhdWx0OworCisgICAg ICAgIFN0cmluZ1JlZiggY2hhciBjb25zdCogcmF3Q2hhcnMgKSBub2V4Y2VwdDsKKworICAgICAg ICBjb25zdGV4cHIgU3RyaW5nUmVmKCBjaGFyIGNvbnN0KiByYXdDaGFycywgc2l6ZV90eXBlIHNp emUgKSBub2V4Y2VwdAorICAgICAgICA6ICAgbV9zdGFydCggcmF3Q2hhcnMgKSwKKyAgICAgICAg ICAgIG1fc2l6ZSggc2l6ZSApCisgICAgICAgIHt9CisKKyAgICAgICAgU3RyaW5nUmVmKCBzdGQ6 OnN0cmluZyBjb25zdCYgc3RkU3RyaW5nICkgbm9leGNlcHQKKyAgICAgICAgOiAgIG1fc3RhcnQo IHN0ZFN0cmluZy5jX3N0cigpICksCisgICAgICAgICAgICBtX3NpemUoIHN0ZFN0cmluZy5zaXpl KCkgKQorICAgICAgICB7fQorCisgICAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIHN0ZDo6c3RyaW5n KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKG1fc3RhcnQsIG1fc2l6 ZSk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzogLy8gb3BlcmF0b3JzCisgICAgICAgIGF1dG8g b3BlcmF0b3IgPT0gKCBTdHJpbmdSZWYgY29uc3QmIG90aGVyICkgY29uc3Qgbm9leGNlcHQgLT4g Ym9vbDsKKyAgICAgICAgYXV0byBvcGVyYXRvciAhPSAoU3RyaW5nUmVmIGNvbnN0JiBvdGhlcikg Y29uc3Qgbm9leGNlcHQgLT4gYm9vbCB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBv dGhlcik7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIG9wZXJhdG9yW10gKCBzaXplX3R5cGUg aW5kZXggKSBjb25zdCBub2V4Y2VwdCAtPiBjaGFyIHsKKyAgICAgICAgICAgIGFzc2VydChpbmRl eCA8IG1fc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gbV9zdGFydFtpbmRleF07CisgICAgICAg IH0KKworICAgIHB1YmxpYzogLy8gbmFtZWQgcXVlcmllcworICAgICAgICBjb25zdGV4cHIgYXV0 byBlbXB0eSgpIGNvbnN0IG5vZXhjZXB0IC0+IGJvb2wgeworICAgICAgICAgICAgcmV0dXJuIG1f c2l6ZSA9PSAwOworICAgICAgICB9CisgICAgICAgIGNvbnN0ZXhwciBhdXRvIHNpemUoKSBjb25z dCBub2V4Y2VwdCAtPiBzaXplX3R5cGUgeworICAgICAgICAgICAgcmV0dXJuIG1fc2l6ZTsKKyAg ICAgICAgfQorCisgICAgICAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhcnQgcG9pbnRlci4g SWYgdGhlIFN0cmluZ1JlZiBpcyBub3QKKyAgICAgICAgLy8gbnVsbC10ZXJtaW5hdGVkLCB0aHJv d3Mgc3RkOjpkb21haW5fZXhjZXB0aW9uCisgICAgICAgIGF1dG8gY19zdHIoKSBjb25zdCAtPiBj aGFyIGNvbnN0KjsKKworICAgIHB1YmxpYzogLy8gc3Vic3RyaW5ncyBhbmQgc2VhcmNoZXMKKyAg ICAgICAgLy8gUmV0dXJucyBhIHN1YnN0cmluZyBvZiBbc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKS4K KyAgICAgICAgLy8gSWYgc3RhcnQgKyBsZW5ndGggPiBzaXplKCksIHRoZW4gdGhlIHN1YnN0cmlu ZyBpcyBbc3RhcnQsIHNpemUoKSkuCisgICAgICAgIC8vIElmIHN0YXJ0ID4gc2l6ZSgpLCB0aGVu IHRoZSBzdWJzdHJpbmcgaXMgZW1wdHkuCisgICAgICAgIGF1dG8gc3Vic3RyKCBzaXplX3R5cGUg c3RhcnQsIHNpemVfdHlwZSBsZW5ndGggKSBjb25zdCBub2V4Y2VwdCAtPiBTdHJpbmdSZWY7CisK KyAgICAgICAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBzdGFydCBwb2ludGVyLiBNYXkgbm90IGJl IG51bGwtdGVybWluYXRlZC4KKyAgICAgICAgYXV0byBkYXRhKCkgY29uc3Qgbm9leGNlcHQgLT4g Y2hhciBjb25zdCo7CisKKyAgICAgICAgY29uc3RleHByIGF1dG8gaXNOdWxsVGVybWluYXRlZCgp IGNvbnN0IG5vZXhjZXB0IC0+IGJvb2wgeworICAgICAgICAgICAgcmV0dXJuIG1fc3RhcnRbbV9z aXplXSA9PSAnXDAnOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIGl0ZXJhdG9ycworICAg ICAgICBjb25zdGV4cHIgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtX3N0 YXJ0OyB9CisgICAgICAgIGNvbnN0ZXhwciBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJl dHVybiBtX3N0YXJ0ICsgbV9zaXplOyB9CisgICAgfTsKKworICAgIGF1dG8gb3BlcmF0b3IgKz0g KCBzdGQ6OnN0cmluZyYgbGhzLCBTdHJpbmdSZWYgY29uc3QmIHNyICkgLT4gc3RkOjpzdHJpbmcm OworICAgIGF1dG8gb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBTdHJpbmdSZWYgY29u c3QmIHNyICkgLT4gc3RkOjpvc3RyZWFtJjsKKworICAgIGNvbnN0ZXhwciBhdXRvIG9wZXJhdG9y ICIiIF9zciggY2hhciBjb25zdCogcmF3Q2hhcnMsIHN0ZDo6c2l6ZV90IHNpemUgKSBub2V4Y2Vw dCAtPiBTdHJpbmdSZWYgeworICAgICAgICByZXR1cm4gU3RyaW5nUmVmKCByYXdDaGFycywgc2l6 ZSApOworICAgIH0KK30gLy8gbmFtZXNwYWNlIENhdGNoCisKK2NvbnN0ZXhwciBhdXRvIG9wZXJh dG9yICIiIF9jYXRjaF9zciggY2hhciBjb25zdCogcmF3Q2hhcnMsIHN0ZDo6c2l6ZV90IHNpemUg KSBub2V4Y2VwdCAtPiBDYXRjaDo6U3RyaW5nUmVmIHsKKyAgICByZXR1cm4gQ2F0Y2g6OlN0cmlu Z1JlZiggcmF3Q2hhcnMsIHNpemUgKTsKK30KKworLy8gZW5kIGNhdGNoX3N0cmluZ3JlZi5oCisv LyBzdGFydCBjYXRjaF9wcmVwcm9jZXNzb3IuaHBwCisKKworI2RlZmluZSBDQVRDSF9SRUNVUlNJ T05fTEVWRUwwKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0FUQ0hfUkVDVVJTSU9OX0xFVkVM MSguLi4pIENBVENIX1JFQ1VSU0lPTl9MRVZFTDAoQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMMChDQVRD SF9SRUNVUlNJT05fTEVWRUwwKF9fVkFfQVJHU19fKSkpCisjZGVmaW5lIENBVENIX1JFQ1VSU0lP Tl9MRVZFTDIoLi4uKSBDQVRDSF9SRUNVUlNJT05fTEVWRUwxKENBVENIX1JFQ1VSU0lPTl9MRVZF TDEoQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMMShfX1ZBX0FSR1NfXykpKQorI2RlZmluZSBDQVRDSF9S RUNVUlNJT05fTEVWRUwzKC4uLikgQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMMihDQVRDSF9SRUNVUlNJ T05fTEVWRUwyKENBVENIX1JFQ1VSU0lPTl9MRVZFTDIoX19WQV9BUkdTX18pKSkKKyNkZWZpbmUg Q0FUQ0hfUkVDVVJTSU9OX0xFVkVMNCguLi4pIENBVENIX1JFQ1VSU0lPTl9MRVZFTDMoQ0FUQ0hf UkVDVVJTSU9OX0xFVkVMMyhDQVRDSF9SRUNVUlNJT05fTEVWRUwzKF9fVkFfQVJHU19fKSkpCisj ZGVmaW5lIENBVENIX1JFQ1VSU0lPTl9MRVZFTDUoLi4uKSBDQVRDSF9SRUNVUlNJT05fTEVWRUw0 KENBVENIX1JFQ1VSU0lPTl9MRVZFTDQoQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMNChfX1ZBX0FSR1Nf XykpKQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElPTkFMX01TVkNfUFJFUFJPQ0VTU09S CisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyguLi4pIF9fVkFfQVJHU19fCisv LyBNU1ZDIG5lZWRzIG1vcmUgZXZhbHVhdGlvbnMKKyNkZWZpbmUgQ0FUQ0hfUkVDVVJTSU9OX0xF VkVMNiguLi4pIENBVENIX1JFQ1VSU0lPTl9MRVZFTDUoQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMNShD QVRDSF9SRUNVUlNJT05fTEVWRUw1KF9fVkFfQVJHU19fKSkpCisjZGVmaW5lIENBVENIX1JFQ1VS U0UoLi4uKSAgQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMNihDQVRDSF9SRUNVUlNJT05fTEVWRUw2KF9f VkFfQVJHU19fKSkKKyNlbHNlCisjZGVmaW5lIENBVENIX1JFQ1VSU0UoLi4uKSAgQ0FUQ0hfUkVD VVJTSU9OX0xFVkVMNShfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX1JFQ19F TkQoLi4uKQorI2RlZmluZSBDQVRDSF9SRUNfT1VUCisKKyNkZWZpbmUgQ0FUQ0hfRU1QVFkoKQor I2RlZmluZSBDQVRDSF9ERUZFUihpZCkgaWQgQ0FUQ0hfRU1QVFkoKQorCisjZGVmaW5lIENBVENI X1JFQ19HRVRfRU5EMigpIDAsIENBVENIX1JFQ19FTkQKKyNkZWZpbmUgQ0FUQ0hfUkVDX0dFVF9F TkQxKC4uLikgQ0FUQ0hfUkVDX0dFVF9FTkQyCisjZGVmaW5lIENBVENIX1JFQ19HRVRfRU5EKC4u LikgQ0FUQ0hfUkVDX0dFVF9FTkQxCisjZGVmaW5lIENBVENIX1JFQ19ORVhUMCh0ZXN0LCBuZXh0 LCAuLi4pIG5leHQgQ0FUQ0hfUkVDX09VVAorI2RlZmluZSBDQVRDSF9SRUNfTkVYVDEodGVzdCwg bmV4dCkgQ0FUQ0hfREVGRVIgKCBDQVRDSF9SRUNfTkVYVDAgKSAoIHRlc3QsIG5leHQsIDApCisj ZGVmaW5lIENBVENIX1JFQ19ORVhUKHRlc3QsIG5leHQpICBDQVRDSF9SRUNfTkVYVDEoQ0FUQ0hf UkVDX0dFVF9FTkQgdGVzdCwgbmV4dCkKKworI2RlZmluZSBDQVRDSF9SRUNfTElTVDAoZiwgeCwg cGVlaywgLi4uKSAsIGYoeCkgQ0FUQ0hfREVGRVIgKCBDQVRDSF9SRUNfTkVYVChwZWVrLCBDQVRD SF9SRUNfTElTVDEpICkgKCBmLCBwZWVrLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX1JF Q19MSVNUMShmLCB4LCBwZWVrLCAuLi4pICwgZih4KSBDQVRDSF9ERUZFUiAoIENBVENIX1JFQ19O RVhUKHBlZWssIENBVENIX1JFQ19MSVNUMCkgKSAoIGYsIHBlZWssIF9fVkFfQVJHU19fICkKKyNk ZWZpbmUgQ0FUQ0hfUkVDX0xJU1QyKGYsIHgsIHBlZWssIC4uLikgICBmKHgpIENBVENIX0RFRkVS ICggQ0FUQ0hfUkVDX05FWFQocGVlaywgQ0FUQ0hfUkVDX0xJU1QxKSApICggZiwgcGVlaywgX19W QV9BUkdTX18gKQorCisjZGVmaW5lIENBVENIX1JFQ19MSVNUMF9VRChmLCB1c2VyZGF0YSwgeCwg cGVlaywgLi4uKSAsIGYodXNlcmRhdGEsIHgpIENBVENIX0RFRkVSICggQ0FUQ0hfUkVDX05FWFQo cGVlaywgQ0FUQ0hfUkVDX0xJU1QxX1VEKSApICggZiwgdXNlcmRhdGEsIHBlZWssIF9fVkFfQVJH U19fICkKKyNkZWZpbmUgQ0FUQ0hfUkVDX0xJU1QxX1VEKGYsIHVzZXJkYXRhLCB4LCBwZWVrLCAu Li4pICwgZih1c2VyZGF0YSwgeCkgQ0FUQ0hfREVGRVIgKCBDQVRDSF9SRUNfTkVYVChwZWVrLCBD QVRDSF9SRUNfTElTVDBfVUQpICkgKCBmLCB1c2VyZGF0YSwgcGVlaywgX19WQV9BUkdTX18gKQor I2RlZmluZSBDQVRDSF9SRUNfTElTVDJfVUQoZiwgdXNlcmRhdGEsIHgsIHBlZWssIC4uLikgICBm KHVzZXJkYXRhLCB4KSBDQVRDSF9ERUZFUiAoIENBVENIX1JFQ19ORVhUKHBlZWssIENBVENIX1JF Q19MSVNUMV9VRCkgKSAoIGYsIHVzZXJkYXRhLCBwZWVrLCBfX1ZBX0FSR1NfXyApCisKKy8vIEFw cGxpZXMgdGhlIGZ1bmN0aW9uIG1hY3JvIGBmYCB0byBlYWNoIG9mIHRoZSByZW1haW5pbmcgcGFy YW1ldGVycywgaW5zZXJ0cyBjb21tYXMgYmV0d2VlbiB0aGUgcmVzdWx0cywKKy8vIGFuZCBwYXNz ZXMgdXNlcmRhdGEgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byBlYWNoIGludm9jYXRpb24sCisv LyBlLmcuIENBVENIX1JFQ19MSVNUX1VEKGYsIHgsIGEsIGIsIGMpIGV2YWx1YXRlcyB0byBmKHgs IGEpLCBmKHgsIGIpLCBmKHgsIGMpCisjZGVmaW5lIENBVENIX1JFQ19MSVNUX1VEKGYsIHVzZXJk YXRhLCAuLi4pIENBVENIX1JFQ1VSU0UoQ0FUQ0hfUkVDX0xJU1QyX1VEKGYsIHVzZXJkYXRhLCBf X1ZBX0FSR1NfXywgKCkoKSgpLCAoKSgpKCksICgpKCkoKSwgMCkpCisKKyNkZWZpbmUgQ0FUQ0hf UkVDX0xJU1QoZiwgLi4uKSBDQVRDSF9SRUNVUlNFKENBVENIX1JFQ19MSVNUMihmLCBfX1ZBX0FS R1NfXywgKCkoKSgpLCAoKSgpKCksICgpKCkoKSwgMCkpCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FU Q0hfRVhQQU5EMShwYXJhbSkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EMihwYXJhbSkKKyNkZWZpbmUg SU5URVJOQUxfQ0FUQ0hfRVhQQU5EMiguLi4pIElOVEVSTkFMX0NBVENIX05PIyMgX19WQV9BUkdT X18KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfREVGKC4uLikgSU5URVJOQUxfQ0FUQ0hfREVGIF9f VkFfQVJHU19fCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX05PSU5URVJOQUxfQ0FUQ0hfREVGCisj ZGVmaW5lIElOVEVSTkFMX0NBVENIX1NUUklOR0laRSguLi4pIElOVEVSTkFMX0NBVENIX1NUUklO R0laRTIoX19WQV9BUkdTX18pCisjaWZuZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZD X1BSRVBST0NFU1NPUgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJWkUyKC4uLikgI19f VkFfQVJHU19fCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NUUklOR0laRV9XSVRIT1VUX1BBUkVO UyhwYXJhbSkgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpFKElOVEVSTkFMX0NBVENIX1JFTU9WRV9Q QVJFTlMocGFyYW0pKQorI2Vsc2UKKy8vIE1TVkMgaXMgYWRkaW5nIGV4dHJhIHNwYWNlIGFuZCBu ZWVkcyBhbm90aGVyIGluZGlyZWN0aW9uIHRvIGV4cGFuZCBJTlRFUk5BTF9DQVRDSF9OT0lOVEVS TkFMX0NBVENIX0RFRgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJWkUyKC4uLikgSU5U RVJOQUxfQ0FUQ0hfU1RSSU5HSVpFMyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSU5URVJOQUxfQ0FU Q0hfU1RSSU5HSVpFMyguLi4pICNfX1ZBX0FSR1NfXworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9T VFJJTkdJWkVfV0lUSE9VVF9QQVJFTlMocGFyYW0pIChJTlRFUk5BTF9DQVRDSF9TVFJJTkdJWkUo SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhwYXJhbSkpICsgMSkKKyNlbmRpZgorCisjZGVm aW5lIElOVEVSTkFMX0NBVENIX01BS0VfTkFNRVNQQUNFMiguLi4pIG5zXyMjX19WQV9BUkdTX18K KyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUFLRV9OQU1FU1BBQ0UobmFtZSkgSU5URVJOQUxfQ0FU Q0hfTUFLRV9OQU1FU1BBQ0UyKG5hbWUpCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZF X1BBUkVOUyguLi4pIElOVEVSTkFMX0NBVENIX0VYUEFORDEoSU5URVJOQUxfQ0FUQ0hfREVGIF9f VkFfQVJHU19fKQorCisjaWZuZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBS T0NFU1NPUgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NQUtFX1RZUEVfTElTVDIoLi4uKSBkZWNs dHlwZShnZXRfd3JhcHBlcjxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TX0dFTihfX1ZBX0FS R1NfXyk+KCkpCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX01BS0VfVFlQRV9MSVNUKC4uLikgSU5U RVJOQUxfQ0FUQ0hfTUFLRV9UWVBFX0xJU1QyKElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMo X19WQV9BUkdTX18pKQorI2Vsc2UKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUFLRV9UWVBFX0xJ U1QyKC4uLikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKGRlY2x0eXBlKGdldF93cmFwcGVy PElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfR0VOKF9fVkFfQVJHU19fKT4oKSkpCisjZGVm aW5lIElOVEVSTkFMX0NBVENIX01BS0VfVFlQRV9MSVNUKC4uLikgSU5URVJOQUxfQ0FUQ0hfRVhQ QU5EX1ZBUkdTKElOVEVSTkFMX0NBVENIX01BS0VfVFlQRV9MSVNUMihJTlRFUk5BTF9DQVRDSF9S RU1PVkVfUEFSRU5TKF9fVkFfQVJHU19fKSkpCisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5BTF9D QVRDSF9NQUtFX1RZUEVfTElTVFNfRlJPTV9UWVBFUyguLi4pXAorICAgIENBVENIX1JFQ19MSVNU KElOVEVSTkFMX0NBVENIX01BS0VfVFlQRV9MSVNULF9fVkFfQVJHU19fKQorCisjZGVmaW5lIElO VEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfMV9BUkcoXzApIElOVEVSTkFMX0NBVENIX1JFTU9W RV9QQVJFTlMoXzApCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfMl9BUkco XzAsIF8xKSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FUQ0hf UkVNT1ZFX1BBUkVOU18xX0FSRyhfMSkKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BB UkVOU18zX0FSRyhfMCwgXzEsIF8yKSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwg SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18yX0FSRyhfMSwgXzIpCisjZGVmaW5lIElOVEVS TkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfNF9BUkcoXzAsIF8xLCBfMiwgXzMpIElOVEVSTkFMX0NB VENIX1JFTU9WRV9QQVJFTlMoXzApLCBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzNfQVJH KF8xLCBfMiwgXzMpCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfNV9BUkco XzAsIF8xLCBfMiwgXzMsIF80KSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU180X0FSRyhfMSwgXzIsIF8zLCBfNCkKKyNkZWZpbmUg SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU182X0FSRyhfMCwgXzEsIF8yLCBfMywgXzQsIF81 KSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZF X1BBUkVOU181X0FSRyhfMSwgXzIsIF8zLCBfNCwgXzUpCisjZGVmaW5lIElOVEVSTkFMX0NBVENI X1JFTU9WRV9QQVJFTlNfN19BUkcoXzAsIF8xLCBfMiwgXzMsIF80LCBfNSwgXzYpIElOVEVSTkFM X0NBVENIX1JFTU9WRV9QQVJFTlMoXzApLCBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzZf QVJHKF8xLCBfMiwgXzMsIF80LCBfNSwgXzYpCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFTU9W RV9QQVJFTlNfOF9BUkcoXzAsIF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83KSBJTlRFUk5BTF9D QVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU183X0FS RyhfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNykKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVN T1ZFX1BBUkVOU185X0FSRyhfMCwgXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84KSBJTlRF Uk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVO U184X0FSRyhfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpCisjZGVmaW5lIElOVEVSTkFM X0NBVENIX1JFTU9WRV9QQVJFTlNfMTBfQVJHKF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBf NywgXzgsIF85KSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FU Q0hfUkVNT1ZFX1BBUkVOU185X0FSRyhfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85 KQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzExX0FSRyhfMCwgXzEsIF8y LCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwKSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVf UEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18xMF9BUkcoXzEsIF8yLCBf MywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwKQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENI X1ZBX05BUkdTX0lNUEwoXzAsIF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8x MCwgTiwgLi4uKSBOCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFlQRV9HRU5cCisgICAgdGVt cGxhdGU8dHlwZW5hbWUuLi4+IHN0cnVjdCBUeXBlTGlzdCB7fTtcCisgICAgdGVtcGxhdGU8dHlw ZW5hbWUuLi5Ucz5cCisgICAgY29uc3RleHByIGF1dG8gZ2V0X3dyYXBwZXIoKSBub2V4Y2VwdCAt PiBUeXBlTGlzdDxUcy4uLj4geyByZXR1cm4ge307IH1cCisgICAgdGVtcGxhdGU8dGVtcGxhdGU8 dHlwZW5hbWUuLi4+IGNsYXNzLi4uPiBzdHJ1Y3QgVGVtcGxhdGVUeXBlTGlzdHt9O1wKKyAgICB0 ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4gY2xhc3MuLi5Dcz5cCisgICAgY29uc3RleHBy IGF1dG8gZ2V0X3dyYXBwZXIoKSBub2V4Y2VwdCAtPiBUZW1wbGF0ZVR5cGVMaXN0PENzLi4uPiB7 IHJldHVybiB7fTsgfVwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj5cCisgICAgc3RydWN0IGFw cGVuZDtcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4+XAorICAgIHN0cnVjdCByZXdyYXA7XAor ICAgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcywgdHlwZW5hbWUuLi4+XAor ICAgIHN0cnVjdCBjcmVhdGU7XAorICAgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBj bGFzcywgdHlwZW5hbWU+XAorICAgIHN0cnVjdCBjb252ZXJ0O1wKKyAgICBcCisgICAgdGVtcGxh dGU8dHlwZW5hbWUgVD4gXAorICAgIHN0cnVjdCBhcHBlbmQ8VD4geyB1c2luZyB0eXBlID0gVDsg fTtcCisgICAgdGVtcGxhdGU8IHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcyBMMSwgdHlwZW5h bWUuLi5FMSwgdGVtcGxhdGU8dHlwZW5hbWUuLi4+IGNsYXNzIEwyLCB0eXBlbmFtZS4uLkUyLCB0 eXBlbmFtZS4uLlJlc3Q+XAorICAgIHN0cnVjdCBhcHBlbmQ8TDE8RTEuLi4+LCBMMjxFMi4uLj4s IFJlc3QuLi4+IHsgdXNpbmcgdHlwZSA9IHR5cGVuYW1lIGFwcGVuZDxMMTxFMS4uLixFMi4uLj4s IFJlc3QuLi4+Ojp0eXBlOyB9O1wKKyAgICB0ZW1wbGF0ZTwgdGVtcGxhdGU8dHlwZW5hbWUuLi4+ IGNsYXNzIEwxLCB0eXBlbmFtZS4uLkUxLCB0eXBlbmFtZS4uLlJlc3Q+XAorICAgIHN0cnVjdCBh cHBlbmQ8TDE8RTEuLi4+LCBUeXBlTGlzdDxtcGxfOjpuYT4sIFJlc3QuLi4+IHsgdXNpbmcgdHlw ZSA9IEwxPEUxLi4uPjsgfTtcCisgICAgXAorICAgIHRlbXBsYXRlPCB0ZW1wbGF0ZTx0eXBlbmFt ZS4uLj4gY2xhc3MgQ29udGFpbmVyLCB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4gY2xhc3MgTGlzdCwg dHlwZW5hbWUuLi5lbGVtcz5cCisgICAgc3RydWN0IHJld3JhcDxUZW1wbGF0ZVR5cGVMaXN0PENv bnRhaW5lcj4sIExpc3Q8ZWxlbXMuLi4+PiB7IHVzaW5nIHR5cGUgPSBUeXBlTGlzdDxDb250YWlu ZXI8ZWxlbXMuLi4+PjsgfTtcCisgICAgdGVtcGxhdGU8IHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBj bGFzcyBDb250YWluZXIsIHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcyBMaXN0LCBjbGFzcy4u LkVsZW1zLCB0eXBlbmFtZS4uLkVsZW1lbnRzPlwKKyAgICBzdHJ1Y3QgcmV3cmFwPFRlbXBsYXRl VHlwZUxpc3Q8Q29udGFpbmVyPiwgTGlzdDxFbGVtcy4uLj4sIEVsZW1lbnRzLi4uPiB7IHVzaW5n IHR5cGUgPSB0eXBlbmFtZSBhcHBlbmQ8VHlwZUxpc3Q8Q29udGFpbmVyPEVsZW1zLi4uPj4sIHR5 cGVuYW1lIHJld3JhcDxUZW1wbGF0ZVR5cGVMaXN0PENvbnRhaW5lcj4sIEVsZW1lbnRzLi4uPjo6 dHlwZT46OnR5cGU7IH07XAorICAgIFwKKyAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZSA8dHlwZW5hbWUu Li4+IGNsYXNzIEZpbmFsLCB0ZW1wbGF0ZTwgdHlwZW5hbWUuLi4+IGNsYXNzLi4uQ29udGFpbmVy cywgdHlwZW5hbWUuLi5UeXBlcz5cCisgICAgc3RydWN0IGNyZWF0ZTxGaW5hbCwgVGVtcGxhdGVU eXBlTGlzdDxDb250YWluZXJzLi4uPiwgVHlwZUxpc3Q8VHlwZXMuLi4+PiB7IHVzaW5nIHR5cGUg PSB0eXBlbmFtZSBhcHBlbmQ8RmluYWw8PiwgdHlwZW5hbWUgcmV3cmFwPFRlbXBsYXRlVHlwZUxp c3Q8Q29udGFpbmVycz4sIFR5cGVzLi4uPjo6dHlwZS4uLj46OnR5cGU7IH07XAorICAgIHRlbXBs YXRlPHRlbXBsYXRlIDx0eXBlbmFtZS4uLj4gY2xhc3MgRmluYWwsIHRlbXBsYXRlIDx0eXBlbmFt ZS4uLj4gY2xhc3MgTGlzdCwgdHlwZW5hbWUuLi5Ucz5cCisgICAgc3RydWN0IGNvbnZlcnQ8Rmlu YWwsIExpc3Q8VHMuLi4+PiB7IHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBhcHBlbmQ8RmluYWw8PixU eXBlTGlzdDxUcz4uLi4+Ojp0eXBlOyB9OworCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX05UVFBf MShzaWduYXR1cmUsIC4uLilcCisgICAgdGVtcGxhdGU8SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BB UkVOUyhzaWduYXR1cmUpPiBzdHJ1Y3QgTnR0cHt9O1wKKyAgICB0ZW1wbGF0ZTxJTlRFUk5BTF9D QVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+XAorICAgIGNvbnN0ZXhwciBhdXRvIGdldF93 cmFwcGVyKCkgbm9leGNlcHQgLT4gTnR0cDxfX1ZBX0FSR1NfXz4geyByZXR1cm4ge307IH0gXAor ICAgIHRlbXBsYXRlPHRlbXBsYXRlPElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoc2lnbmF0 dXJlKT4gY2xhc3MuLi4+IHN0cnVjdCBOdHRwVGVtcGxhdGVUeXBlTGlzdHt9O1wKKyAgICB0ZW1w bGF0ZTx0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+IGNs YXNzLi4uQ3M+XAorICAgIGNvbnN0ZXhwciBhdXRvIGdldF93cmFwcGVyKCkgbm9leGNlcHQgLT4g TnR0cFRlbXBsYXRlVHlwZUxpc3Q8Q3MuLi4+IHsgcmV0dXJuIHt9OyB9IFwKKyAgICBcCisgICAg dGVtcGxhdGU8IHRlbXBsYXRlPElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoc2lnbmF0dXJl KT4gY2xhc3MgQ29udGFpbmVyLCB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5T KHNpZ25hdHVyZSk+IGNsYXNzIExpc3QsIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoc2ln bmF0dXJlKT5cCisgICAgc3RydWN0IHJld3JhcDxOdHRwVGVtcGxhdGVUeXBlTGlzdDxDb250YWlu ZXI+LCBMaXN0PF9fVkFfQVJHU19fPj4geyB1c2luZyB0eXBlID0gVHlwZUxpc3Q8Q29udGFpbmVy PF9fVkFfQVJHU19fPj47IH07XAorICAgIHRlbXBsYXRlPCB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRD SF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+IGNsYXNzIENvbnRhaW5lciwgdGVtcGxhdGU8SU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhzaWduYXR1cmUpPiBjbGFzcyBMaXN0LCBJTlRFUk5B TF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSksIHR5cGVuYW1lLi4uRWxlbWVudHM+XAor ICAgIHN0cnVjdCByZXdyYXA8TnR0cFRlbXBsYXRlVHlwZUxpc3Q8Q29udGFpbmVyPiwgTGlzdDxf X1ZBX0FSR1NfXz4sIEVsZW1lbnRzLi4uPiB7IHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBhcHBlbmQ8 VHlwZUxpc3Q8Q29udGFpbmVyPF9fVkFfQVJHU19fPj4sIHR5cGVuYW1lIHJld3JhcDxOdHRwVGVt cGxhdGVUeXBlTGlzdDxDb250YWluZXI+LCBFbGVtZW50cy4uLj46OnR5cGU+Ojp0eXBlOyB9O1wK KyAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4+IGNsYXNzIEZpbmFsLCB0ZW1wbGF0 ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+IGNsYXNzLi4uQ29udGFp bmVycywgdHlwZW5hbWUuLi5UeXBlcz5cCisgICAgc3RydWN0IGNyZWF0ZTxGaW5hbCwgTnR0cFRl bXBsYXRlVHlwZUxpc3Q8Q29udGFpbmVycy4uLj4sIFR5cGVMaXN0PFR5cGVzLi4uPj4geyB1c2lu ZyB0eXBlID0gdHlwZW5hbWUgYXBwZW5kPEZpbmFsPD4sIHR5cGVuYW1lIHJld3JhcDxOdHRwVGVt cGxhdGVUeXBlTGlzdDxDb250YWluZXJzPiwgVHlwZXMuLi4+Ojp0eXBlLi4uPjo6dHlwZTsgfTsK KworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUMChUZXN0TmFtZSkKKyNk ZWZpbmUgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVDEoVGVzdE5hbWUsIHNpZ25hdHVy ZSlcCisgICAgdGVtcGxhdGU8SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhzaWduYXR1cmUp PlwKKyAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0RF Q0xBUkVfU0lHX1RFU1RfWChUZXN0TmFtZSwgc2lnbmF0dXJlLCAuLi4pXAorICAgIHRlbXBsYXRl PElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoc2lnbmF0dXJlKT5cCisgICAgc3RhdGljIHZv aWQgVGVzdE5hbWUoKQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVDAo VGVzdE5hbWUpCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVDEoVGVzdE5h bWUsIHNpZ25hdHVyZSlcCisgICAgdGVtcGxhdGU8SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVO UyhzaWduYXR1cmUpPlwKKyAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpCisjZGVmaW5lIElOVEVS TkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YKFRlc3ROYW1lLCBzaWduYXR1cmUsLi4uKVwKKyAg ICB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+XAorICAg IHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9OVFRQX1JF R0lTVEVSMChUZXN0RnVuYywgc2lnbmF0dXJlKVwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBl PlwKKyAgICB2b2lkIHJlZ190ZXN0KFR5cGVMaXN0PFR5cGU+LCBDYXRjaDo6TmFtZUFuZFRhZ3Mg bmFtZUFuZFRhZ3MpXAorICAgIHtcCisgICAgICAgIENhdGNoOjpBdXRvUmVnKCBDYXRjaDo6bWFr ZVRlc3RJbnZva2VyKCZUZXN0RnVuYzxUeXBlPiksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBD YXRjaDo6U3RyaW5nUmVmKCksIG5hbWVBbmRUYWdzKTtcCisgICAgfQorCisjZGVmaW5lIElOVEVS TkFMX0NBVENIX05UVFBfUkVHSVNURVIoVGVzdEZ1bmMsIHNpZ25hdHVyZSwgLi4uKVwKKyAgICB0 ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+XAorICAgIHZv aWQgcmVnX3Rlc3QoTnR0cDxfX1ZBX0FSR1NfXz4sIENhdGNoOjpOYW1lQW5kVGFncyBuYW1lQW5k VGFncylcCisgICAge1wKKyAgICAgICAgQ2F0Y2g6OkF1dG9SZWcoIENhdGNoOjptYWtlVGVzdElu dm9rZXIoJlRlc3RGdW5jPF9fVkFfQVJHU19fPiksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBD YXRjaDo6U3RyaW5nUmVmKCksIG5hbWVBbmRUYWdzKTtcCisgICAgfQorCisjZGVmaW5lIElOVEVS TkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9EMChUZXN0TmFtZSwgc2lnbmF0dXJlLCAuLi4p XAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+XAorICAgIHZvaWQgcmVnX3Rlc3QoVHlwZUxp c3Q8VHlwZT4sIENhdGNoOjpTdHJpbmdSZWYgY2xhc3NOYW1lLCBDYXRjaDo6TmFtZUFuZFRhZ3Mg bmFtZUFuZFRhZ3MpXAorICAgIHtcCisgICAgICAgIENhdGNoOjpBdXRvUmVnKCBDYXRjaDo6bWFr ZVRlc3RJbnZva2VyKCZUZXN0TmFtZTxUeXBlPjo6dGVzdCksIENBVENIX0lOVEVSTkFMX0xJTkVJ TkZPLCBjbGFzc05hbWUsIG5hbWVBbmRUYWdzKTtcCisgICAgfQorCisjZGVmaW5lIElOVEVSTkFM X0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9EKFRlc3ROYW1lLCBzaWduYXR1cmUsIC4uLilcCisg ICAgdGVtcGxhdGU8SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhzaWduYXR1cmUpPlwKKyAg ICB2b2lkIHJlZ190ZXN0KE50dHA8X19WQV9BUkdTX18+LCBDYXRjaDo6U3RyaW5nUmVmIGNsYXNz TmFtZSwgQ2F0Y2g6Ok5hbWVBbmRUYWdzIG5hbWVBbmRUYWdzKVwKKyAgICB7XAorICAgICAgICBD YXRjaDo6QXV0b1JlZyggQ2F0Y2g6Om1ha2VUZXN0SW52b2tlcigmVGVzdE5hbWU8X19WQV9BUkdT X18+Ojp0ZXN0KSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIGNsYXNzTmFtZSwgbmFtZUFuZFRh Z3MpO1wKKyAgICB9CisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9N RVRIT0QwKFRlc3ROYW1lLCBDbGFzc05hbWUpCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFQ0xB UkVfU0lHX1RFU1RfTUVUSE9EMShUZXN0TmFtZSwgQ2xhc3NOYW1lLCBzaWduYXR1cmUpXAorICAg IHRlbXBsYXRlPHR5cGVuYW1lIFRlc3RUeXBlPiBcCisgICAgc3RydWN0IFRlc3ROYW1lIDogSU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhDbGFzc05hbWUpPFRlc3RUeXBlPiB7IFwKKyAgICAg ICAgdm9pZCB0ZXN0KCk7XAorICAgIH0KKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9ERUNMQVJF X1NJR19URVNUX01FVEhPRF9YKFRlc3ROYW1lLCBDbGFzc05hbWUsIHNpZ25hdHVyZSwgLi4uKVwK KyAgICB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+IFwK KyAgICBzdHJ1Y3QgVGVzdE5hbWUgOiBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKENsYXNz TmFtZSk8X19WQV9BUkdTX18+IHsgXAorICAgICAgICB2b2lkIHRlc3QoKTtcCisgICAgfQorCisj ZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9NRVRIT0QwKFRlc3ROYW1lKQor I2RlZmluZSBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EMShUZXN0TmFtZSwg c2lnbmF0dXJlKVwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUZXN0VHlwZT4gXAorICAgIHZvaWQg SU5URVJOQUxfQ0FUQ0hfTUFLRV9OQU1FU1BBQ0UoVGVzdE5hbWUpOjpUZXN0TmFtZTxUZXN0VHlw ZT46OnRlc3QoKQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9E X1goVGVzdE5hbWUsIHNpZ25hdHVyZSwgLi4uKVwKKyAgICB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRD SF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+IFwKKyAgICB2b2lkIElOVEVSTkFMX0NBVENIX01B S0VfTkFNRVNQQUNFKFRlc3ROYW1lKTo6VGVzdE5hbWU8X19WQV9BUkdTX18+Ojp0ZXN0KCkKKwor I2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElUSU9OQUxfTVNWQ19QUkVQUk9DRVNTT1IKKyNkZWZp bmUgSU5URVJOQUxfQ0FUQ0hfTlRUUF8wCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX05UVFBfR0VO KC4uLikgSU5URVJOQUxfQ0FUQ0hfVkFfTkFSR1NfSU1QTChfX1ZBX0FSR1NfXywgSU5URVJOQUxf Q0FUQ0hfTlRUUF8xKF9fVkFfQVJHU19fKSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xKF9fVkFfQVJH U19fKSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xKF9fVkFfQVJHU19fKSwgSU5URVJOQUxfQ0FUQ0hf TlRUUF8xKF9fVkFfQVJHU19fKSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xKF9fVkFfQVJHU19fKSwg SU5URVJOQUxfQ0FUQ0hfTlRUUF8xKCBfX1ZBX0FSR1NfXyksIElOVEVSTkFMX0NBVENIX05UVFBf MSggX19WQV9BUkdTX18pLCBJTlRFUk5BTF9DQVRDSF9OVFRQXzEoIF9fVkFfQVJHU19fKSwgSU5U RVJOQUxfQ0FUQ0hfTlRUUF8xKCBfX1ZBX0FSR1NfXyksSU5URVJOQUxfQ0FUQ0hfTlRUUF8xKCBf X1ZBX0FSR1NfXyksIElOVEVSTkFMX0NBVENIX05UVFBfMCkKKyNkZWZpbmUgSU5URVJOQUxfQ0FU Q0hfREVGSU5FX1NJR19URVNUX01FVEhPRChUZXN0TmFtZSwgLi4uKSBJTlRFUk5BTF9DQVRDSF9W QV9OQVJHU19JTVBMKCAiZHVtbXkiLCBfX1ZBX0FSR1NfXywgSU5URVJOQUxfQ0FUQ0hfREVGSU5F X1NJR19URVNUX01FVEhPRF9YLElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9NRVRIT0Rf WCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRF9YLCBJTlRFUk5BTF9DQVRD SF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVT VF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRF9YLCBJTlRF Uk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EX1gsSU5URVJOQUxfQ0FUQ0hfREVGSU5F X1NJR19URVNUX01FVEhPRF9YLElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9NRVRIT0Rf WCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRDEsIElOVEVSTkFMX0NBVENI X0RFRklORV9TSUdfVEVTVF9NRVRIT0QwKShUZXN0TmFtZSwgX19WQV9BUkdTX18pCisjZGVmaW5l IElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EKFRlc3ROYW1lLCBDbGFzc05h bWUsIC4uLikgSU5URVJOQUxfQ0FUQ0hfVkFfTkFSR1NfSU1QTCggImR1bW15IiwgX19WQV9BUkdT X18sIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gsSU5URVJOQUxfQ0FU Q0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdf VEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0RfWCwg SU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hf REVDTEFSRV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVT VF9NRVRIT0RfWCxJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX01FVEhPRF9YLElOVEVS TkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xB UkVfU0lHX1RFU1RfTUVUSE9EMSwgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRI T0QwKShUZXN0TmFtZSwgQ2xhc3NOYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSU5URVJOQUxf Q0FUQ0hfTlRUUF9SRUdfTUVUSE9EX0dFTihUZXN0TmFtZSwgLi4uKSBJTlRFUk5BTF9DQVRDSF9W QV9OQVJHU19JTVBMKCAiZHVtbXkiLCBfX1ZBX0FSR1NfXywgSU5URVJOQUxfQ0FUQ0hfTlRUUF9S RUdJU1RFUl9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9ELCBJTlRF Uk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdJ U1RFUl9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9ELCBJTlRFUk5B TF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdJU1RF Ul9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9ELCBJTlRFUk5BTF9D QVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdJU1RFUl9N RVRIT0QwLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRDApKFRlc3ROYW1lLCBf X1ZBX0FSR1NfXykKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdfR0VOKFRlc3RGdW5j LCAuLi4pIElOVEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoICJkdW1teSIsIF9fVkFfQVJHU19f LCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lT VEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JF R0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQ X1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9O VFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRD SF9OVFRQX1JFR0lTVEVSMCwgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdJU1RFUjApKFRlc3RGdW5j LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUKFRl c3ROYW1lLCAuLi4pIElOVEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoICJkdW1teSIsIF9fVkFf QVJHU19fLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfWCwgSU5URVJOQUxfQ0FUQ0hf REVGSU5FX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YLCBJTlRF Uk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19U RVNUX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9E RUZJTkVfU0lHX1RFU1RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX1gsSU5URVJO QUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX1gsSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNU MSwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUMCkoVGVzdE5hbWUsIF9fVkFfQVJHU19f KQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUKFRlc3ROYW1lLCAuLi4p IElOVEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoICJkdW1teSIsIF9fVkFfQVJHU19fLCBJTlRF Uk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gsSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdf VEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENI X0RFQ0xBUkVfU0lHX1RFU1RfWCwgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9YLCBJ TlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9T SUdfVEVTVF9YLElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfWCxJTlRFUk5BTF9DQVRD SF9ERUNMQVJFX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1QxLCBJ TlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUMCkoVGVzdE5hbWUsIF9fVkFfQVJHU19fKQor I2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TX0dFTiguLi4pIElOVEVSTkFMX0NB VENIX1ZBX05BUkdTX0lNUEwoX19WQV9BUkdTX18sIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJF TlNfMTFfQVJHLElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfMTBfQVJHLElOVEVSTkFMX0NB VENIX1JFTU9WRV9QQVJFTlNfOV9BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU184X0FS RyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzdfQVJHLElOVEVSTkFMX0NBVENIX1JFTU9W RV9QQVJFTlNfNl9BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU181X0FSRyxJTlRFUk5B TF9DQVRDSF9SRU1PVkVfUEFSRU5TXzRfQVJHLElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNf M19BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18yX0FSRyxJTlRFUk5BTF9DQVRDSF9S RU1PVkVfUEFSRU5TXzFfQVJHKShfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIElOVEVSTkFM X0NBVENIX05UVFBfMChzaWduYXR1cmUpCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX05UVFBfR0VO KC4uLikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKElOVEVSTkFMX0NBVENIX1ZBX05BUkdT X0lNUEwoX19WQV9BUkdTX18sIElOVEVSTkFMX0NBVENIX05UVFBfMSwgSU5URVJOQUxfQ0FUQ0hf TlRUUF8xLCBJTlRFUk5BTF9DQVRDSF9OVFRQXzEsIElOVEVSTkFMX0NBVENIX05UVFBfMSwgSU5U RVJOQUxfQ0FUQ0hfTlRUUF8xLCBJTlRFUk5BTF9DQVRDSF9OVFRQXzEsIElOVEVSTkFMX0NBVENI X05UVFBfMSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xLCBJTlRFUk5BTF9DQVRDSF9OVFRQXzEsSU5U RVJOQUxfQ0FUQ0hfTlRUUF8xLCBJTlRFUk5BTF9DQVRDSF9OVFRQXzApKCBfX1ZBX0FSR1NfXykp CisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9NRVRIT0QoVGVzdE5hbWUs IC4uLikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKElOVEVSTkFMX0NBVENIX1ZBX05BUkdT X0lNUEwoICJkdW1teSIsIF9fVkFfQVJHU19fLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RF U1RfTUVUSE9EX1gsSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRF9YLCBJTlRF Uk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFMX0NBVENIX0RFRklO RV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhP RF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFMX0NB VENIX0RFRklORV9TSUdfVEVTVF9NRVRIT0RfWCxJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RF U1RfTUVUSE9EX1gsSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRF9YLCBJTlRF Uk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EMSwgSU5URVJOQUxfQ0FUQ0hfREVGSU5F X1NJR19URVNUX01FVEhPRDApKFRlc3ROYW1lLCBfX1ZBX0FSR1NfXykpCisjZGVmaW5lIElOVEVS TkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EKFRlc3ROYW1lLCBDbGFzc05hbWUsIC4u LikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKElOVEVSTkFMX0NBVENIX1ZBX05BUkdTX0lN UEwoICJkdW1teSIsIF9fVkFfQVJHU19fLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNU X01FVEhPRF9YLElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVS TkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xB UkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVU SE9EX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFM X0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gsSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9T SUdfVEVTVF9NRVRIT0RfWCxJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX01FVEhPRF9Y LCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX01FVEhPRDEsIElOVEVSTkFMX0NBVENI X0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EMCkoVGVzdE5hbWUsIENsYXNzTmFtZSwgX19WQV9BUkdT X18pKQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR19NRVRIT0RfR0VOKFRlc3ROYW1l LCAuLi4pIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyhJTlRFUk5BTF9DQVRDSF9WQV9OQVJH U19JTVBMKCAiZHVtbXkiLCBfX1ZBX0FSR1NfXywgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdJU1RF Ul9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9ELCBJTlRFUk5BTF9D QVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdJU1RFUl9N RVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9ELCBJTlRFUk5BTF9DQVRD SF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdJU1RFUl9NRVRI T0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9ELCBJTlRFUk5BTF9DQVRDSF9O VFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdJU1RFUl9NRVRIT0Qw LCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRDApKFRlc3ROYW1lLCBfX1ZBX0FS R1NfXykpCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX05UVFBfUkVHX0dFTihUZXN0RnVuYywgLi4u KSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoSU5URVJOQUxfQ0FUQ0hfVkFfTkFSR1NfSU1Q TCggImR1bW15IiwgX19WQV9BUkdTX18sIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElO VEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIs IElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNU RVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVH SVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBf UkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIwLCBJTlRFUk5BTF9DQVRDSF9O VFRQX1JFR0lTVEVSMCkoVGVzdEZ1bmMsIF9fVkFfQVJHU19fKSkKKyNkZWZpbmUgSU5URVJOQUxf Q0FUQ0hfREVGSU5FX1NJR19URVNUKFRlc3ROYW1lLCAuLi4pIElOVEVSTkFMX0NBVENIX0VYUEFO RF9WQVJHUyhJTlRFUk5BTF9DQVRDSF9WQV9OQVJHU19JTVBMKCAiZHVtbXkiLCBfX1ZBX0FSR1Nf XywgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFRklO RV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfWCwgSU5URVJOQUxf Q0FUQ0hfREVGSU5FX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9Y LCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5F X1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YLElOVEVSTkFMX0NB VENIX0RFRklORV9TSUdfVEVTVF9YLElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVDEsIElO VEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVDApKFRlc3ROYW1lLCBfX1ZBX0FSR1NfXykpCisj ZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1QoVGVzdE5hbWUsIC4uLikgSU5U RVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKElOVEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoICJk dW1teSIsIF9fVkFfQVJHU19fLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gsSU5U RVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJ R19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfWCwgSU5URVJOQUxfQ0FU Q0hfREVDTEFSRV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gs IElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YLElOVEVSTkFMX0NBVENIX0RFQ0xBUkVf U0lHX1RFU1RfWCxJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gsIElOVEVSTkFMX0NB VENIX0RFQ0xBUkVfU0lHX1RFU1QxLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUMCko VGVzdE5hbWUsIF9fVkFfQVJHU19fKSkKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BB UkVOU19HRU4oLi4uKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoSU5URVJOQUxfQ0FUQ0hf VkFfTkFSR1NfSU1QTChfX1ZBX0FSR1NfXywgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18x MV9BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18xMF9BUkcsSU5URVJOQUxfQ0FUQ0hf UkVNT1ZFX1BBUkVOU185X0FSRyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzhfQVJHLElO VEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfN19BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BB UkVOU182X0FSRyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzVfQVJHLElOVEVSTkFMX0NB VENIX1JFTU9WRV9QQVJFTlNfNF9BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18zX0FS RyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzJfQVJHLElOVEVSTkFMX0NBVENIX1JFTU9W RV9QQVJFTlNfMV9BUkcpKF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisvLyBlbmQgY2F0Y2hfcHJl cHJvY2Vzc29yLmhwcAorLy8gc3RhcnQgY2F0Y2hfbWV0YS5ocHAKKworCisjaW5jbHVkZSA8dHlw ZV90cmFpdHM+CisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4K KyAgICBzdHJ1Y3QgYWx3YXlzX2ZhbHNlIDogc3RkOjpmYWxzZV90eXBlIHt9OworCisgICAgdGVt cGxhdGUgPHR5cGVuYW1lPiBzdHJ1Y3QgdHJ1ZV9naXZlbiA6IHN0ZDo6dHJ1ZV90eXBlIHt9Owor ICAgIHN0cnVjdCBpc19jYWxsYWJsZV90ZXN0ZXIgeworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5h bWUgRnVuLCB0eXBlbmFtZS4uLiBBcmdzPgorICAgICAgICB0cnVlX2dpdmVuPGRlY2x0eXBlKHN0 ZDo6ZGVjbHZhbDxGdW4+KCkoc3RkOjpkZWNsdmFsPEFyZ3M+KCkuLi4pKT4gc3RhdGljIHRlc3Qo aW50KTsKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uPgorICAgICAgICBzdGQ6OmZhbHNl X3R5cGUgc3RhdGljIHRlc3QoLi4uKTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1l IFQ+CisgICAgc3RydWN0IGlzX2NhbGxhYmxlOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1 biwgdHlwZW5hbWUuLi4gQXJncz4KKyAgICBzdHJ1Y3QgaXNfY2FsbGFibGU8RnVuKEFyZ3MuLi4p PiA6IGRlY2x0eXBlKGlzX2NhbGxhYmxlX3Rlc3Rlcjo6dGVzdDxGdW4sIEFyZ3MuLi4+KDApKSB7 fTsKKworI2lmIGRlZmluZWQoX19jcHBfbGliX2lzX2ludm9jYWJsZSkgJiYgX19jcHBfbGliX2lz X2ludm9jYWJsZSA+PSAyMDE3MDMKKyAgICAvLyBzdGQ6OnJlc3VsdF9vZiBpcyBkZXByZWNhdGVk IGluIEMrKzE3IGFuZCByZW1vdmVkIGluIEMrKzIwLiBIZW5jZSwgaXQgaXMKKyAgICAvLyByZXBs YWNlZCB3aXRoIHN0ZDo6aW52b2tlX3Jlc3VsdCBoZXJlLgorICAgIHRlbXBsYXRlIDx0eXBlbmFt ZSBGdW5jLCB0eXBlbmFtZS4uLiBVPgorICAgIHVzaW5nIEZ1bmN0aW9uUmV0dXJuVHlwZSA9IHN0 ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjppbnZva2VfcmVzdWx0 X3Q8RnVuYywgVS4uLj4+PjsKKyNlbHNlCisgICAgLy8gS2VlcCA6OnR5cGUgaGVyZSBiZWNhdXNl IHdlIHN0aWxsIHN1cHBvcnQgQysrMTEKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlw ZW5hbWUuLi4gVT4KKyAgICB1c2luZyBGdW5jdGlvblJldHVyblR5cGUgPSB0eXBlbmFtZSBzdGQ6 OnJlbW92ZV9yZWZlcmVuY2U8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY3Y8dHlwZW5hbWUgc3RkOjpy ZXN1bHRfb2Y8RnVuYyhVLi4uKT46OnR5cGU+Ojp0eXBlPjo6dHlwZTsKKyNlbmRpZgorCit9IC8v IG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgbXBsX3sKKyAgICBzdHJ1Y3QgbmE7Cit9CisK Ky8vIGVuZCBjYXRjaF9tZXRhLmhwcAorbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlw ZW5hbWUgQz4KK2NsYXNzIFRlc3RJbnZva2VyQXNNZXRob2QgOiBwdWJsaWMgSVRlc3RJbnZva2Vy IHsKKyAgICB2b2lkIChDOjoqbV90ZXN0QXNNZXRob2QpKCk7CitwdWJsaWM6CisgICAgVGVzdElu dm9rZXJBc01ldGhvZCggdm9pZCAoQzo6KnRlc3RBc01ldGhvZCkoKSApIG5vZXhjZXB0IDogbV90 ZXN0QXNNZXRob2QoIHRlc3RBc01ldGhvZCApIHt9CisKKyAgICB2b2lkIGludm9rZSgpIGNvbnN0 IG92ZXJyaWRlIHsKKyAgICAgICAgQyBvYmo7CisgICAgICAgIChvYmouKm1fdGVzdEFzTWV0aG9k KSgpOworICAgIH0KK307CisKK2F1dG8gbWFrZVRlc3RJbnZva2VyKCB2b2lkKCp0ZXN0QXNGdW5j dGlvbikoKSApIG5vZXhjZXB0IC0+IElUZXN0SW52b2tlcio7CisKK3RlbXBsYXRlPHR5cGVuYW1l IEM+CithdXRvIG1ha2VUZXN0SW52b2tlciggdm9pZCAoQzo6KnRlc3RBc01ldGhvZCkoKSApIG5v ZXhjZXB0IC0+IElUZXN0SW52b2tlciogeworICAgIHJldHVybiBuZXcoc3RkOjpub3Rocm93KSBU ZXN0SW52b2tlckFzTWV0aG9kPEM+KCB0ZXN0QXNNZXRob2QgKTsKK30KKworc3RydWN0IE5hbWVB bmRUYWdzIHsKKyAgICBOYW1lQW5kVGFncyggU3RyaW5nUmVmIGNvbnN0JiBuYW1lXyA9IFN0cmlu Z1JlZigpLCBTdHJpbmdSZWYgY29uc3QmIHRhZ3NfID0gU3RyaW5nUmVmKCkgKSBub2V4Y2VwdDsK KyAgICBTdHJpbmdSZWYgbmFtZTsKKyAgICBTdHJpbmdSZWYgdGFnczsKK307CisKK3N0cnVjdCBB dXRvUmVnIDogTm9uQ29weWFibGUgeworICAgIEF1dG9SZWcoIElUZXN0SW52b2tlciogaW52b2tl ciwgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLCBTdHJpbmdSZWYgY29uc3QmIGNsYXNz T3JNZXRob2QsIE5hbWVBbmRUYWdzIGNvbnN0JiBuYW1lQW5kVGFncyApIG5vZXhjZXB0OworICAg IH5BdXRvUmVnKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmIGRlZmlu ZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEUpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNU Q0FTRV9OT19SRUdJU1RSQVRJT04oIFRlc3ROYW1lLCAuLi4gKSBcCisgICAgICAgIHN0YXRpYyB2 b2lkIFRlc3ROYW1lKCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFX01FVEhP RF9OT19SRUdJU1RSQVRJT04oIFRlc3ROYW1lLCBDbGFzc05hbWUsIC4uLiApIFwKKyAgICAgICAg bmFtZXNwYWNleyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0cnVjdCBU ZXN0TmFtZSA6IElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoQ2xhc3NOYW1lKSB7IFwKKyAg ICAgICAgICAgICAgICB2b2lkIHRlc3QoKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH07 ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdm9pZCBUZXN0TmFtZTo6dGVzdCgpCisgICAgI2Rl ZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTk9fUkVHSVNUUkFUSU9OXzIo IFRlc3ROYW1lLCBUZXN0RnVuYywgTmFtZSwgVGFncywgU2lnbmF0dXJlLCAuLi4gKSAgXAorICAg ICAgICBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1QoVGVzdEZ1bmMsIElOVEVSTkFMX0NB VENIX1JFTU9WRV9QQVJFTlMoU2lnbmF0dXJlKSkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENI X1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfTk9fUkVHSVNUUkFUSU9OXzIoIFRlc3ROYW1lQ2xh c3MsIFRlc3ROYW1lLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgLi4uICkgICAg XAorICAgICAgICBuYW1lc3BhY2V7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg ICAgIG5hbWVzcGFjZSBJTlRFUk5BTF9DQVRDSF9NQUtFX05BTUVTUEFDRShUZXN0TmFtZSkgeyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSU5URVJO QUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0QoVGVzdE5hbWUsIENsYXNzTmFtZSwgSU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUpKTtcCisgICAgICAgIH0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNU X01FVEhPRChUZXN0TmFtZSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUp KQorCisgICAgI2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElUSU9OQUxfTVNWQ19QUkVQUk9DRVNT T1IKKyAgICAgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTk9f UkVHSVNUUkFUSU9OKE5hbWUsIFRhZ3MsIC4uLikgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FU Q0hfVEVNUExBVEVfVEVTVF9DQVNFX05PX1JFR0lTVFJBVElPTl8yKCBJTlRFUk5BTF9DQVRDSF9V TklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApLCBJTlRFUk5B TF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UX0Zf VV9OX0NfICksIE5hbWUsIFRhZ3MsIHR5cGVuYW1lIFRlc3RUeXBlLCBfX1ZBX0FSR1NfXyApCisg ICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NB U0VfTk9fUkVHSVNUUkFUSU9OKE5hbWUsIFRhZ3MsIC4uLikgXAorICAgICAgICAgICAgSU5URVJO QUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0Vf Tk9fUkVHSVNUUkFUSU9OXzIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hf VF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICksIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBD X0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfRl9VX05fQ18gKSwgTmFtZSwgVGFncywg dHlwZW5hbWUgVGVzdFR5cGUsIF9fVkFfQVJHU19fICkgKQorICAgICNlbmRpZgorCisgICAgI2lm bmRlZiBDQVRDSF9DT05GSUdfVFJBRElUSU9OQUxfTVNWQ19QUkVQUk9DRVNTT1IKKyAgICAgICAg I2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfU0lHX05PX1JFR0lTVFJB VElPTihOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLikgXAorICAgICAgICAgICAgSU5URVJOQUxf Q0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX05PX1JFR0lTVFJBVElPTl8yKCBJTlRFUk5BTF9DQVRD SF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApLCBJTlRF Uk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19U X0ZfVV9OX0NfICksIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19WQV9BUkdTX18gKQorICAgICNl bHNlCisgICAgICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJ R19OT19SRUdJU1RSQVRJT04oTmFtZSwgVGFncywgU2lnbmF0dXJlLCAuLi4pIFwKKyAgICAgICAg ICAgIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVf VEVTVF9DQVNFX05PX1JFR0lTVFJBVElPTl8yKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSgg Q19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApLCBJTlRFUk5BTF9DQVRDSF9VTklR VUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UX0ZfVV9OX0NfICksIE5h bWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19WQV9BUkdTX18gKSApCisgICAgI2VuZGlmCisKKyAgICAj aWZuZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUgorICAgICAg ICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfTk9fUkVH SVNUUkFUSU9OKCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsLi4uICkgXAorICAgICAgICAgICAgSU5U RVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9OT19SRUdJU1RSQVRJT05fMigg SU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9F X1NfVF9DX0xfQV9TX1NfICksIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hf VF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICkgLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIHR5cGVu YW1lIFQsIF9fVkFfQVJHU19fICkKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIElOVEVSTkFM X0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfTk9fUkVHSVNUUkFUSU9OKCBDbGFzc05h bWUsIE5hbWUsIFRhZ3MsLi4uICkgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfRVhQQU5E X1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EX05PX1JFR0lT VFJBVElPTl8yKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1Bf TF9BX1RfRV9UX0VfU19UX0NfTF9BX1NfU18gKSwgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUo IENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF8gKSAsIENsYXNzTmFtZSwgTmFtZSwg VGFncywgdHlwZW5hbWUgVCwgX19WQV9BUkdTX18gKSApCisgICAgI2VuZGlmCisKKyAgICAjaWZu ZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUgorICAgICAgICAj ZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHX05PX1JF R0lTVFJBVElPTiggQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLiApIFwKKyAg ICAgICAgICAgIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfTk9fUkVH SVNUUkFUSU9OXzIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01f UF9MX0FfVF9FX1RfRV9TX1RfQ19MX0FfU19TXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFN RSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApICwgQ2xhc3NOYW1lLCBOYW1l LCBUYWdzLCBTaWduYXR1cmUsIF9fVkFfQVJHU19fICkKKyAgICAjZWxzZQorICAgICAgICAjZGVm aW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHX05PX1JFR0lT VFJBVElPTiggQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLiApIFwKKyAgICAg ICAgICAgIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExB VEVfVEVTVF9DQVNFX01FVEhPRF9OT19SRUdJU1RSQVRJT05fMiggSU5URVJOQUxfQ0FUQ0hfVU5J UVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9DX0xfQV9TX1NfICks IElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1Rf RV9TX1RfICkgLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19WQV9BUkdTX18g KSApCisgICAgI2VuZGlmCisjZW5kaWYKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAg ICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggVGVzdE5hbWUsIC4uLiApIFwKKyAg ICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9T VEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTiBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBS RVNTX0dMT0JBTFNfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVn IElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoIENhdGNoOjptYWtl VGVzdEludm9rZXIoICZUZXN0TmFtZSApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6 OlN0cmluZ1JlZigpLCBDYXRjaDo6TmFtZUFuZFRhZ3N7IF9fVkFfQVJHU19fIH0gKTsgfSAvKiBO T0xJTlQgKi8gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNT SU9OIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKQorICAgICNkZWZpbmUgSU5URVJO QUxfQ0FUQ0hfVEVTVENBU0UoIC4uLiApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVENB U0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9TX1RfICksIF9f VkFfQVJHU19fICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElO VEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIFF1YWxpZmllZE1ldGhvZCwgLi4uICkg XAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTiBcCisg ICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JBTFNfV0FSTklOR1MgXAorICAgICAg ICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBh dXRvUmVnaXN0cmFyICkoIENhdGNoOjptYWtlVGVzdEludm9rZXIoICZRdWFsaWZpZWRNZXRob2Qg KSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICImIiAjUXVhbGlmaWVkTWV0aG9kLCBDYXRjaDo6 TmFtZUFuZFRhZ3N7IF9fVkFfQVJHU19fIH0gKTsgfSAvKiBOT0xJTlQgKi8gXAorICAgICAgICBD QVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9OCisKKyAgICAvLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9E MiggVGVzdE5hbWUsIENsYXNzTmFtZSwgLi4uIClcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NU QVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJF U1NfR0xPQkFMU19XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgXAorICAgICAgICAgICAg c3RydWN0IFRlc3ROYW1lIDogSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhDbGFzc05hbWUp IHsgXAorICAgICAgICAgICAgICAgIHZvaWQgdGVzdCgpOyBcCisgICAgICAgICAgICB9OyBcCisg ICAgICAgICAgICBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0 b1JlZ2lzdHJhciApICggQ2F0Y2g6Om1ha2VUZXN0SW52b2tlciggJlRlc3ROYW1lOjp0ZXN0ICks IENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjQ2xhc3NOYW1lLCBDYXRjaDo6TmFtZUFuZFRhZ3N7 IF9fVkFfQVJHU19fIH0gKTsgLyogTk9MSU5UICovIFwKKyAgICAgICAgfSBcCisgICAgICAgIENB VENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJFU1NJT04gXAorICAgICAgICB2b2lkIFRl c3ROYW1lOjp0ZXN0KCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRI T0QoIENsYXNzTmFtZSwgLi4uICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0Vf TUVUSE9EMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfU19UXyAp LCBDbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8K KyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwg Li4uICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lP TiBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JBTFNfV0FSTklOR1MgXAor ICAgICAgICBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1Jl Z2lzdHJhciApKCBDYXRjaDo6bWFrZVRlc3RJbnZva2VyKCBGdW5jdGlvbiApLCBDQVRDSF9JTlRF Uk5BTF9MSU5FSU5GTywgQ2F0Y2g6OlN0cmluZ1JlZigpLCBDYXRjaDo6TmFtZUFuZFRhZ3N7IF9f VkFfQVJHU19fIH0gKTsgLyogTk9MSU5UICovIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1RP UF9XQVJOSU5HU19TVVBQUkVTU0lPTgorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAg ICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFXzIoVGVzdE5hbWUsIFRl c3RGdW5jLCBOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLiApXAorICAgICAgICBDQVRDSF9JTlRF Uk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTiBcCisgICAgICAgIENBVENIX0lOVEVSTkFM X1NVUFBSRVNTX0dMT0JBTFNfV0FSTklOR1MgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQ UkVTU19aRVJPX1ZBUklBRElDX1dBUk5JTkdTIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQ UFJFU1NfVU5VU0VEX1RFTVBMQVRFX1dBUk5JTkdTIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hf REVDTEFSRV9TSUdfVEVTVChUZXN0RnVuYywgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhT aWduYXR1cmUpKTtcCisgICAgICAgIG5hbWVzcGFjZSB7XAorICAgICAgICBuYW1lc3BhY2UgSU5U RVJOQUxfQ0FUQ0hfTUFLRV9OQU1FU1BBQ0UoVGVzdE5hbWUpe1wKKyAgICAgICAgICAgIElOVEVS TkFMX0NBVENIX1RZUEVfR0VOXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfTlRUUF9HRU4o SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUpKVwKKyAgICAgICAgICAgIElO VEVSTkFMX0NBVENIX05UVFBfUkVHX0dFTihUZXN0RnVuYyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVf UEFSRU5TKFNpZ25hdHVyZSkpXAorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi5UeXBl cz4gXAorICAgICAgICAgICAgc3RydWN0IFRlc3ROYW1le1wKKyAgICAgICAgICAgICAgICBUZXN0 TmFtZSgpe1wKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNvbnN0ZXhwciBj aGFyIGNvbnN0KiB0bXBsX3R5cGVzW10gPSB7Q0FUQ0hfUkVDX0xJU1QoSU5URVJOQUxfQ0FUQ0hf U1RSSU5HSVpFX1dJVEhPVVRfUEFSRU5TLCBfX1ZBX0FSR1NfXyl9O1wKKyAgICAgICAgICAgICAg ICAgICAgdXNpbmcgZXhwYW5kZXIgPSBpbnRbXTtcCisgICAgICAgICAgICAgICAgICAgICh2b2lk KWV4cGFuZGVyeyhyZWdfdGVzdChUeXBlc3t9LCBDYXRjaDo6TmFtZUFuZFRhZ3N7IE5hbWUgIiAt ICIgKyBzdGQ6OnN0cmluZyh0bXBsX3R5cGVzW2luZGV4XSksIFRhZ3MgfSApLCBpbmRleCsrKS4u LiB9Oy8qIE5PTElOVCAqLyBcCisgICAgICAgICAgICAgICAgfVwKKyAgICAgICAgICAgIH07XAor ICAgICAgICAgICAgc3RhdGljIGludCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggZ2xvYmFs UmVnaXN0cmFyICkgPSBbXSgpe1wKKyAgICAgICAgICAgIFRlc3ROYW1lPElOVEVSTkFMX0NBVENI X01BS0VfVFlQRV9MSVNUU19GUk9NX1RZUEVTKF9fVkFfQVJHU19fKT4oKTtcCisgICAgICAgICAg ICByZXR1cm4gMDtcCisgICAgICAgIH0oKTtcCisgICAgICAgIH1cCisgICAgICAgIH1cCisgICAg ICAgIENBVENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJFU1NJT04gXAorICAgICAgICBJ TlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1QoVGVzdEZ1bmMsSU5URVJOQUxfQ0FUQ0hfUkVN T1ZFX1BBUkVOUyhTaWduYXR1cmUpKQorCisjaWZuZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05B TF9NU1ZDX1BSRVBST0NFU1NPUgorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVf VEVTVF9DQVNFKE5hbWUsIFRhZ3MsIC4uLikgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URU1Q TEFURV9URVNUX0NBU0VfMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9U X0VfTV9QX0xfQV9UX0VfVF9FX1NfVF8gKSwgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENf QV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9GX1VfTl9DXyApLCBOYW1lLCBUYWdzLCB0 eXBlbmFtZSBUZXN0VHlwZSwgX19WQV9BUkdTX18gKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVS TkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRShOYW1lLCBUYWdzLCAuLi4pIFwKKyAgICAgICAg SU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNU X0NBU0VfMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xf QV9UX0VfVF9FX1NfVF8gKSwgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9U X0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9GX1VfTl9DXyApLCBOYW1lLCBUYWdzLCB0eXBlbmFtZSBU ZXN0VHlwZSwgX19WQV9BUkdTX18gKSApCisjZW5kaWYKKworI2lmbmRlZiBDQVRDSF9DT05GSUdf VFJBRElUSU9OQUxfTVNWQ19QUkVQUk9DRVNTT1IKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENI X1RFTVBMQVRFX1RFU1RfQ0FTRV9TSUcoTmFtZSwgVGFncywgU2lnbmF0dXJlLCAuLi4pIFwKKyAg ICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFXzIoIElOVEVSTkFMX0NBVENI X1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICksIElOVEVS TkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1Rf Rl9VX05fQ18gKSwgTmFtZSwgVGFncywgU2lnbmF0dXJlLCBfX1ZBX0FSR1NfXyApCisjZWxzZQor ICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJRyhOYW1lLCBU YWdzLCBTaWduYXR1cmUsIC4uLikgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFS R1MoIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV8yKCBJTlRFUk5BTF9DQVRDSF9V TklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApLCBJTlRFUk5B TF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UX0Zf VV9OX0NfICksIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19WQV9BUkdTX18gKSApCisjZW5kaWYK KworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0Uy KFRlc3ROYW1lLCBUZXN0RnVuY05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgVG1wbFR5cGVz LCBUeXBlc0xpc3QpIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1RBUlRfV0FSTklOR1NfU1VQ UFJFU1NJT04gICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9T VVBQUkVTU19HTE9CQUxTX1dBUk5JTkdTICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg Q0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfWkVST19WQVJJQURJQ19XQVJOSU5HUyAgICAgICAgICAg ICAgICBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1VOVVNFRF9URU1QTEFURV9X QVJOSU5HUyAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUZXN0VHlw ZT4gc3RhdGljIHZvaWQgVGVzdEZ1bmNOYW1lKCk7ICAgICAgIFwKKyAgICAgICAgbmFtZXNwYWNl IHtcCisgICAgICAgIG5hbWVzcGFjZSBJTlRFUk5BTF9DQVRDSF9NQUtFX05BTUVTUEFDRShUZXN0 TmFtZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAg ICBJTlRFUk5BTF9DQVRDSF9UWVBFX0dFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfTlRUUF9HRU4o SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUpKSAgICAgICAgIFwKKyAgICAg ICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFR5cGVzPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCisgICAgICAgICAgICBzdHJ1Y3QgVGVzdE5hbWUgeyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHZvaWQgcmVnX3Rlc3Rz KCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg ICAgICAgICAgICAgaW50IGluZGV4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIGV4cGFuZGVyID0gaW50W107ICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjb25zdGV4cHIgY2hh ciBjb25zdCogdG1wbF90eXBlc1tdID0ge0NBVENIX1JFQ19MSVNUKElOVEVSTkFMX0NBVENIX1NU UklOR0laRV9XSVRIT1VUX1BBUkVOUywgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhUbXBs VHlwZXMpKX07XAorICAgICAgICAgICAgICAgICAgICBjb25zdGV4cHIgY2hhciBjb25zdCogdHlw ZXNfbGlzdFtdID0ge0NBVENIX1JFQ19MSVNUKElOVEVSTkFMX0NBVENIX1NUUklOR0laRV9XSVRI T1VUX1BBUkVOUywgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhUeXBlc0xpc3QpKX07XAor ICAgICAgICAgICAgICAgICAgICBjb25zdGV4cHIgYXV0byBudW1fdHlwZXMgPSBzaXplb2YodHlw ZXNfbGlzdCkgLyBzaXplb2YodHlwZXNfbGlzdFswXSk7XAorICAgICAgICAgICAgICAgICAgICAo dm9pZClleHBhbmRlcnsoQ2F0Y2g6OkF1dG9SZWcoIENhdGNoOjptYWtlVGVzdEludm9rZXIoICZU ZXN0RnVuY05hbWU8VHlwZXM+ICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6U3Ry aW5nUmVmKCksIENhdGNoOjpOYW1lQW5kVGFnc3sgTmFtZSAiIC0gIiArIHN0ZDo6c3RyaW5nKHRt cGxfdHlwZXNbaW5kZXggLyBudW1fdHlwZXNdKSArICI8IiArIHN0ZDo6c3RyaW5nKHR5cGVzX2xp c3RbaW5kZXggJSBudW1fdHlwZXNdKSArICI+IiwgVGFncyB9ICksIGluZGV4KyspLi4uIH07Lyog Tk9MSU5UICovXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBz dGF0aWMgaW50IElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBnbG9iYWxSZWdpc3RyYXIgKSA9 IFtdKCl7IFwKKyAgICAgICAgICAgICAgICB1c2luZyBUZXN0SW5pdCA9IHR5cGVuYW1lIGNyZWF0 ZTxUZXN0TmFtZSwgZGVjbHR5cGUoZ2V0X3dyYXBwZXI8SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BB UkVOUyhUbXBsVHlwZXMpPigpKSwgVHlwZUxpc3Q8SU5URVJOQUxfQ0FUQ0hfTUFLRV9UWVBFX0xJ U1RTX0ZST01fVFlQRVMoSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhUeXBlc0xpc3QpKT4+ Ojp0eXBlOyBcCisgICAgICAgICAgICAgICAgVGVzdEluaXQgdDsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQucmVnX3Rlc3RzKCk7 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAg ICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgICAgICAgICB9KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg IENBVENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJFU1NJT04gICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGVzdFR5cGU+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3RGdW5jTmFt ZSgpCisKKyNpZm5kZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElPTkFMX01TVkNfUFJFUFJPQ0VTU09S CisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRShO YW1lLCBUYWdzLCAuLi4pXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNU X1RFU1RfQ0FTRTIoSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9Q X0xfQV9UX0VfVF9FX1NfVF8gKSwgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0Nf SF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9GX1VfTl9DXyApLCBOYW1lLCBUYWdzLCB0eXBlbmFt ZSBULF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBM QVRFX1BST0RVQ1RfVEVTVF9DQVNFKE5hbWUsIFRhZ3MsIC4uLilcCisgICAgICAgIElOVEVSTkFM X0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNU X0NBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9B X1RfRV9UX0VfU19UXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1Rf RV9NX1BfTF9BX1RfRV9UX0VfU19UX0ZfVV9OX0NfICksIE5hbWUsIFRhZ3MsIHR5cGVuYW1lIFQs IF9fVkFfQVJHU19fICkgKQorI2VuZGlmCisKKyNpZm5kZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElP TkFMX01TVkNfUFJFUFJPQ0VTU09SCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFU RV9QUk9EVUNUX1RFU1RfQ0FTRV9TSUcoTmFtZSwgVGFncywgU2lnbmF0dXJlLCAuLi4pXAorICAg ICAgICBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRTIoSU5URVJOQUxf Q0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF8gKSwg SU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9F X1NfVF9GX1VfTl9DXyApLCBOYW1lLCBUYWdzLCBTaWduYXR1cmUsIF9fVkFfQVJHU19fKQorI2Vs c2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNF X1NJRyhOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLilcCisgICAgICAgIElOVEVSTkFMX0NBVENI X0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0Uy KCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9U X0VfU19UXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1Bf TF9BX1RfRV9UX0VfU19UX0ZfVV9OX0NfICksIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19WQV9B UkdTX18gKSApCisjZW5kaWYKKworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVf TElTVF9URVNUX0NBU0VfMihUZXN0TmFtZSwgVGVzdEZ1bmMsIE5hbWUsIFRhZ3MsIFRtcGxMaXN0 KVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1RBUlRfV0FSTklOR1NfU1VQUFJFU1NJT04gXAor ICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dBUk5JTkdTIFwKKyAgICAg ICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfVU5VU0VEX1RFTVBMQVRFX1dBUk5JTkdTIFwKKyAg ICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGVzdFR5cGU+IHN0YXRpYyB2b2lkIFRlc3RGdW5jKCk7 ICAgICAgIFwKKyAgICAgICAgbmFtZXNwYWNlIHtcCisgICAgICAgIG5hbWVzcGFjZSBJTlRFUk5B TF9DQVRDSF9NQUtFX05BTUVTUEFDRShUZXN0TmFtZSl7XAorICAgICAgICBJTlRFUk5BTF9DQVRD SF9UWVBFX0dFTlwKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHlwZXM+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RydWN0IFRlc3ROYW1lIHsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZvaWQgcmVn X3Rlc3RzKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg ICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgICAgICAgICAgICAgICB1c2luZyBleHBhbmRlciA9IGludFtdOyAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAodm9pZClleHBhbmRlcnsoQ2F0 Y2g6OkF1dG9SZWcoIENhdGNoOjptYWtlVGVzdEludm9rZXIoICZUZXN0RnVuYzxUeXBlcz4gKSwg Q0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpTdHJpbmdSZWYoKSwgQ2F0Y2g6Ok5hbWVB bmRUYWdzeyBOYW1lICIgLSAiICsgc3RkOjpzdHJpbmcoSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpF KFRtcGxMaXN0KSkgKyAiIC0gIiArIHN0ZDo6dG9fc3RyaW5nKGluZGV4KSwgVGFncyB9ICksIGlu ZGV4KyspLi4uIH07LyogTk9MSU5UICovXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9O1wKKyAgICAg ICAgc3RhdGljIGludCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggZ2xvYmFsUmVnaXN0cmFy ICkgPSBbXSgpeyBcCisgICAgICAgICAgICAgICAgdXNpbmcgVGVzdEluaXQgPSB0eXBlbmFtZSBj b252ZXJ0PFRlc3ROYW1lLCBUbXBsTGlzdD46OnR5cGU7IFwKKyAgICAgICAgICAgICAgICBUZXN0 SW5pdCB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg ICAgICAgICAgICAgdC5yZWdfdGVzdHMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0oKTsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH19XAor ICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9OICAgICAgICAg ICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRlc3RUeXBlPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0 RnVuYygpCisKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX0xJU1RfVEVTVF9D QVNFKE5hbWUsIFRhZ3MsIFRtcGxMaXN0KSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFTVBM QVRFX0xJU1RfVEVTVF9DQVNFXzIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9D X0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICksIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1F KCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfRl9VX05fQ18gKSwgTmFtZSwgVGFn cywgVG1wbExpc3QgKQorCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNU X0NBU0VfTUVUSE9EXzIoIFRlc3ROYW1lQ2xhc3MsIFRlc3ROYW1lLCBDbGFzc05hbWUsIE5hbWUs IFRhZ3MsIFNpZ25hdHVyZSwgLi4uICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVEFSVF9X QVJOSU5HU19TVVBQUkVTU0lPTiBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dM T0JBTFNfV0FSTklOR1MgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19aRVJPX1ZB UklBRElDX1dBUk5JTkdTIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfVU5VU0VE X1RFTVBMQVRFX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNlIHtcCisgICAgICAgIG5hbWVz cGFjZSBJTlRFUk5BTF9DQVRDSF9NQUtFX05BTUVTUEFDRShUZXN0TmFtZSl7IFwKKyAgICAgICAg ICAgIElOVEVSTkFMX0NBVENIX1RZUEVfR0VOXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hf TlRUUF9HRU4oSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUpKVwKKyAgICAg ICAgICAgIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EKFRlc3ROYW1lLCBD bGFzc05hbWUsIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoU2lnbmF0dXJlKSk7XAorICAg ICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdfTUVUSE9EX0dFTihUZXN0TmFtZSwgSU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUpKVwKKyAgICAgICAgICAgIHRlbXBs YXRlPHR5cGVuYW1lLi4uVHlwZXM+IFwKKyAgICAgICAgICAgIHN0cnVjdCBUZXN0TmFtZUNsYXNz e1wKKyAgICAgICAgICAgICAgICBUZXN0TmFtZUNsYXNzKCl7XAorICAgICAgICAgICAgICAgICAg ICBpbnQgaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg ICAgICAgICAgICAgICAgICAgY29uc3RleHByIGNoYXIgY29uc3QqIHRtcGxfdHlwZXNbXSA9IHtD QVRDSF9SRUNfTElTVChJTlRFUk5BTF9DQVRDSF9TVFJJTkdJWkVfV0lUSE9VVF9QQVJFTlMsIF9f VkFfQVJHU19fKX07XAorICAgICAgICAgICAgICAgICAgICB1c2luZyBleHBhbmRlciA9IGludFtd O1wKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpZXhwYW5kZXJ7KHJlZ190ZXN0KFR5cGVze30s ICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kVGFnc3sgTmFtZSAiIC0gIiArIHN0ZDo6c3RyaW5n KHRtcGxfdHlwZXNbaW5kZXhdKSwgVGFncyB9ICksIGluZGV4KyspLi4uIH07LyogTk9MSU5UICov IFwKKyAgICAgICAgICAgICAgICB9XAorICAgICAgICAgICAgfTtcCisgICAgICAgICAgICBzdGF0 aWMgaW50IElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBnbG9iYWxSZWdpc3RyYXIgKSA9IFtd KCl7XAorICAgICAgICAgICAgICAgIFRlc3ROYW1lQ2xhc3M8SU5URVJOQUxfQ0FUQ0hfTUFLRV9U WVBFX0xJU1RTX0ZST01fVFlQRVMoX19WQV9BUkdTX18pPigpO1wKKyAgICAgICAgICAgICAgICBy ZXR1cm4gMDtcCisgICAgICAgIH0oKTtcCisgICAgICAgIH1cCisgICAgICAgIH1cCisgICAgICAg IENBVENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJFU1NJT04gXAorICAgICAgICBJTlRF Uk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EKFRlc3ROYW1lLCBJTlRFUk5BTF9DQVRD SF9SRU1PVkVfUEFSRU5TKFNpZ25hdHVyZSkpCisKKyNpZm5kZWYgQ0FUQ0hfQ09ORklHX1RSQURJ VElPTkFMX01TVkNfUFJFUFJPQ0VTU09SCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1Q TEFURV9URVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsLi4uICkgXAorICAg ICAgICBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EXzIoIElOVEVSTkFM X0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfQ19M X0FfU19TXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1Bf TF9BX1RfRV9UX0VfU19UXyApICwgQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCB0eXBlbmFtZSBULCBf X1ZBX0FSR1NfXyApCisjZWxzZQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVf VEVTVF9DQVNFX01FVEhPRCggQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLC4uLiApIFwKKyAgICAgICAg SU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNU X0NBU0VfTUVUSE9EXzIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9F X01fUF9MX0FfVF9FX1RfRV9TX1RfQ19MX0FfU19TXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVf TkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApICwgQ2xhc3NOYW1lLCBO YW1lLCBUYWdzLCB0eXBlbmFtZSBULCBfX1ZBX0FSR1NfXyApICkKKyNlbmRpZgorCisjaWZuZGVm IENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUgorICAgICNkZWZpbmUg SU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9TSUcoIENsYXNzTmFtZSwg TmFtZSwgVGFncywgU2lnbmF0dXJlLCAuLi4gKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RF TVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENf QV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9DX0xfQV9TX1NfICksIElOVEVSTkFMX0NB VENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICkgLCBD bGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19WQV9BUkdTX18gKQorI2Vsc2UKKyAg ICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBD bGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgLi4uICkgXAorICAgICAgICBJTlRFUk5B TF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9N RVRIT0RfMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xf QV9UX0VfVF9FX1NfVF9DX0xfQV9TX1NfICksIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBD X0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICkgLCBDbGFzc05hbWUsIE5hbWUsIFRh Z3MsIFNpZ25hdHVyZSwgX19WQV9BUkdTX18gKSApCisjZW5kaWYKKworICAgICNkZWZpbmUgSU5U RVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EXzIoVGVzdE5hbWVD bGFzcywgVGVzdE5hbWUsIENsYXNzTmFtZSwgTmFtZSwgVGFncywgU2lnbmF0dXJlLCBUbXBsVHlw ZXMsIFR5cGVzTGlzdClcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NUQVJUX1dBUk5JTkdTX1NV UFBSRVNTSU9OIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfR0xPQkFMU19XQVJO SU5HUyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1pFUk9fVkFSSUFESUNfV0FS TklOR1MgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19VTlVTRURfVEVNUExBVEVf V0FSTklOR1MgXAorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUZXN0VHlwZT4gXAorICAgICAg ICAgICAgc3RydWN0IFRlc3ROYW1lIDogSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhDbGFz c05hbWUgPFRlc3RUeXBlPikgeyBcCisgICAgICAgICAgICAgICAgdm9pZCB0ZXN0KCk7XAorICAg ICAgICAgICAgfTtcCisgICAgICAgIG5hbWVzcGFjZSB7XAorICAgICAgICBuYW1lc3BhY2UgSU5U RVJOQUxfQ0FUQ0hfTUFLRV9OQU1FU1BBQ0UoVGVzdE5hbWVDbGFzcykge1wKKyAgICAgICAgICAg IElOVEVSTkFMX0NBVENIX1RZUEVfR0VOICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAg SU5URVJOQUxfQ0FUQ0hfTlRUUF9HRU4oSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWdu YXR1cmUpKVwKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uVHlwZXM+XAorICAgICAg ICAgICAgc3RydWN0IFRlc3ROYW1lQ2xhc3N7XAorICAgICAgICAgICAgICAgIHZvaWQgcmVnX3Rl c3RzKCl7XAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwO1wKKyAgICAgICAgICAg ICAgICAgICAgdXNpbmcgZXhwYW5kZXIgPSBpbnRbXTtcCisgICAgICAgICAgICAgICAgICAgIGNv bnN0ZXhwciBjaGFyIGNvbnN0KiB0bXBsX3R5cGVzW10gPSB7Q0FUQ0hfUkVDX0xJU1QoSU5URVJO QUxfQ0FUQ0hfU1RSSU5HSVpFX1dJVEhPVVRfUEFSRU5TLCBJTlRFUk5BTF9DQVRDSF9SRU1PVkVf UEFSRU5TKFRtcGxUeXBlcykpfTtcCisgICAgICAgICAgICAgICAgICAgIGNvbnN0ZXhwciBjaGFy IGNvbnN0KiB0eXBlc19saXN0W10gPSB7Q0FUQ0hfUkVDX0xJU1QoSU5URVJOQUxfQ0FUQ0hfU1RS SU5HSVpFX1dJVEhPVVRfUEFSRU5TLCBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKFR5cGVz TGlzdCkpfTtcCisgICAgICAgICAgICAgICAgICAgIGNvbnN0ZXhwciBhdXRvIG51bV90eXBlcyA9 IHNpemVvZih0eXBlc19saXN0KSAvIHNpemVvZih0eXBlc19saXN0WzBdKTtcCisgICAgICAgICAg ICAgICAgICAgICh2b2lkKWV4cGFuZGVyeyhDYXRjaDo6QXV0b1JlZyggQ2F0Y2g6Om1ha2VUZXN0 SW52b2tlciggJlRlc3ROYW1lPFR5cGVzPjo6dGVzdCApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5G TywgI0NsYXNzTmFtZSwgQ2F0Y2g6Ok5hbWVBbmRUYWdzeyBOYW1lICIgLSAiICsgc3RkOjpzdHJp bmcodG1wbF90eXBlc1tpbmRleCAvIG51bV90eXBlc10pICsgIjwiICsgc3RkOjpzdHJpbmcodHlw ZXNfbGlzdFtpbmRleCAlIG51bV90eXBlc10pICsgIj4iLCBUYWdzIH0gKSwgaW5kZXgrKykuLi4g fTsvKiBOT0xJTlQgKi8gXAorICAgICAgICAgICAgICAgIH1cCisgICAgICAgICAgICB9O1wKKyAg ICAgICAgICAgIHN0YXRpYyBpbnQgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGdsb2JhbFJl Z2lzdHJhciApID0gW10oKXtcCisgICAgICAgICAgICAgICAgdXNpbmcgVGVzdEluaXQgPSB0eXBl bmFtZSBjcmVhdGU8VGVzdE5hbWVDbGFzcywgZGVjbHR5cGUoZ2V0X3dyYXBwZXI8SU5URVJOQUxf Q0FUQ0hfUkVNT1ZFX1BBUkVOUyhUbXBsVHlwZXMpPigpKSwgVHlwZUxpc3Q8SU5URVJOQUxfQ0FU Q0hfTUFLRV9UWVBFX0xJU1RTX0ZST01fVFlQRVMoSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVO UyhUeXBlc0xpc3QpKT4+Ojp0eXBlO1wKKyAgICAgICAgICAgICAgICBUZXN0SW5pdCB0O1wKKyAg ICAgICAgICAgICAgICB0LnJlZ190ZXN0cygpO1wKKyAgICAgICAgICAgICAgICByZXR1cm4gMDtc CisgICAgICAgICAgICB9KCk7IFwKKyAgICAgICAgfVwKKyAgICAgICAgfVwKKyAgICAgICAgQ0FU Q0hfSU5URVJOQUxfU1RPUF9XQVJOSU5HU19TVVBQUkVTU0lPTiBcCisgICAgICAgIHRlbXBsYXRl PHR5cGVuYW1lIFRlc3RUeXBlPiBcCisgICAgICAgIHZvaWQgVGVzdE5hbWU8VGVzdFR5cGU+Ojp0 ZXN0KCkKKworI2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElUSU9OQUxfTVNWQ19QUkVQUk9DRVNT T1IKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNF X01FVEhPRCggQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCAuLi4gKVwKKyAgICAgICAgSU5URVJOQUxf Q0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EXzIoIElOVEVSTkFMX0NBVENI X1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICksIElOVEVS TkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1Rf Rl9VX05fQ18gKSwgQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCB0eXBlbmFtZSBULCBfX1ZBX0FSR1Nf XyApCisjZWxzZQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9U RVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIC4uLiApXAorICAgICAgICBJ TlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1BST0RV Q1RfVEVTVF9DQVNFX01FVEhPRF8yKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1Rf Q19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFN RSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UX0ZfVV9OX0NfICksIENsYXNzTmFt ZSwgTmFtZSwgVGFncywgdHlwZW5hbWUgVCxfX1ZBX0FSR1NfXyApICkKKyNlbmRpZgorCisjaWZu ZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUgorICAgICNkZWZp bmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EX1NJRygg Q2xhc3NOYW1lLCBOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLiApXAorICAgICAgICBJTlRFUk5B TF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0RfMiggSU5URVJOQUxfQ0FU Q0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF8gKSwgSU5U RVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1Nf VF9GX1VfTl9DXyApLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19WQV9BUkdT X18gKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1BST0RVQ1Rf VEVTVF9DQVNFX01FVEhPRF9TSUcoIENsYXNzTmFtZSwgTmFtZSwgVGFncywgU2lnbmF0dXJlLCAu Li4gKVwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRD SF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0RfMiggSU5URVJOQUxfQ0FUQ0hfVU5J UVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF8gKSwgSU5URVJOQUxf Q0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9GX1Vf Tl9DXyApLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSxfX1ZBX0FSR1NfXyApICkK KyNlbmRpZgorCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9MSVNUX1RFU1Rf Q0FTRV9NRVRIT0RfMiggVGVzdE5hbWVDbGFzcywgVGVzdE5hbWUsIENsYXNzTmFtZSwgTmFtZSwg VGFncywgVG1wbExpc3QpIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1RBUlRfV0FSTklOR1Nf U1VQUFJFU1NJT04gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dB Uk5JTkdTIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfVU5VU0VEX1RFTVBMQVRF X1dBUk5JTkdTIFwKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGVzdFR5cGU+IFwKKyAgICAg ICAgc3RydWN0IFRlc3ROYW1lIDogSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhDbGFzc05h bWUgPFRlc3RUeXBlPikgeyBcCisgICAgICAgICAgICB2b2lkIHRlc3QoKTtcCisgICAgICAgIH07 XAorICAgICAgICBuYW1lc3BhY2Uge1wKKyAgICAgICAgbmFtZXNwYWNlIElOVEVSTkFMX0NBVENI X01BS0VfTkFNRVNQQUNFKFRlc3ROYW1lKXsgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hf VFlQRV9HRU5cCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLlR5cGVzPlwKKyAgICAg ICAgICAgIHN0cnVjdCBUZXN0TmFtZUNsYXNze1wKKyAgICAgICAgICAgICAgICB2b2lkIHJlZ190 ZXN0cygpe1wKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDtcCisgICAgICAgICAg ICAgICAgICAgIHVzaW5nIGV4cGFuZGVyID0gaW50W107XAorICAgICAgICAgICAgICAgICAgICAo dm9pZClleHBhbmRlcnsoQ2F0Y2g6OkF1dG9SZWcoIENhdGNoOjptYWtlVGVzdEludm9rZXIoICZU ZXN0TmFtZTxUeXBlcz46OnRlc3QgKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNDbGFzc05h bWUsIENhdGNoOjpOYW1lQW5kVGFnc3sgTmFtZSAiIC0gIiArIHN0ZDo6c3RyaW5nKElOVEVSTkFM X0NBVENIX1NUUklOR0laRShUbXBsTGlzdCkpICsgIiAtICIgKyBzdGQ6OnRvX3N0cmluZyhpbmRl eCksIFRhZ3MgfSApLCBpbmRleCsrKS4uLiB9Oy8qIE5PTElOVCAqLyBcCisgICAgICAgICAgICAg ICAgfVwKKyAgICAgICAgICAgIH07XAorICAgICAgICAgICAgc3RhdGljIGludCBJTlRFUk5BTF9D QVRDSF9VTklRVUVfTkFNRSggZ2xvYmFsUmVnaXN0cmFyICkgPSBbXSgpe1wKKyAgICAgICAgICAg ICAgICB1c2luZyBUZXN0SW5pdCA9IHR5cGVuYW1lIGNvbnZlcnQ8VGVzdE5hbWVDbGFzcywgVG1w bExpc3Q+Ojp0eXBlO1wKKyAgICAgICAgICAgICAgICBUZXN0SW5pdCB0O1wKKyAgICAgICAgICAg ICAgICB0LnJlZ190ZXN0cygpO1wKKyAgICAgICAgICAgICAgICByZXR1cm4gMDtcCisgICAgICAg ICAgICB9KCk7IFwKKyAgICAgICAgfX1cCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NUT1BfV0FS TklOR1NfU1VQUFJFU1NJT04gXAorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUZXN0VHlwZT4g XAorICAgICAgICB2b2lkIFRlc3ROYW1lPFRlc3RUeXBlPjo6dGVzdCgpCisKKyNkZWZpbmUgSU5U RVJOQUxfQ0FUQ0hfVEVNUExBVEVfTElTVF9URVNUX0NBU0VfTUVUSE9EKENsYXNzTmFtZSwgTmFt ZSwgVGFncywgVG1wbExpc3QpIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfTElT VF9URVNUX0NBU0VfTUVUSE9EXzIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9D X0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICksIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1F KCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfRl9VX05fQ18gKSwgQ2xhc3NOYW1l LCBOYW1lLCBUYWdzLCBUbXBsTGlzdCApCisKKy8vIGVuZCBjYXRjaF90ZXN0X3JlZ2lzdHJ5LmgK Ky8vIHN0YXJ0IGNhdGNoX2NhcHR1cmUuaHBwCisKKy8vIHN0YXJ0IGNhdGNoX2Fzc2VydGlvbmhh bmRsZXIuaAorCisvLyBzdGFydCBjYXRjaF9hc3NlcnRpb25pbmZvLmgKKworLy8gc3RhcnQgY2F0 Y2hfcmVzdWx0X3R5cGUuaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gUmVzdWx0V2Fz OjpPZlR5cGUgZW51bQorICAgIHN0cnVjdCBSZXN1bHRXYXMgeyBlbnVtIE9mVHlwZSB7CisgICAg ICAgIFVua25vd24gPSAtMSwKKyAgICAgICAgT2sgPSAwLAorICAgICAgICBJbmZvID0gMSwKKyAg ICAgICAgV2FybmluZyA9IDIsCisKKyAgICAgICAgRmFpbHVyZUJpdCA9IDB4MTAsCisKKyAgICAg ICAgRXhwcmVzc2lvbkZhaWxlZCA9IEZhaWx1cmVCaXQgfCAxLAorICAgICAgICBFeHBsaWNpdEZh aWx1cmUgPSBGYWlsdXJlQml0IHwgMiwKKworICAgICAgICBFeGNlcHRpb24gPSAweDEwMCB8IEZh aWx1cmVCaXQsCisKKyAgICAgICAgVGhyZXdFeGNlcHRpb24gPSBFeGNlcHRpb24gfCAxLAorICAg ICAgICBEaWRudFRocm93RXhjZXB0aW9uID0gRXhjZXB0aW9uIHwgMiwKKworICAgICAgICBGYXRh bEVycm9yQ29uZGl0aW9uID0gMHgyMDAgfCBGYWlsdXJlQml0CisKKyAgICB9OyB9OworCisgICAg Ym9vbCBpc09rKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICk7CisgICAgYm9vbCBpc0p1 c3RJbmZvKCBpbnQgZmxhZ3MgKTsKKworICAgIC8vIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBl bnVtCisgICAgc3RydWN0IFJlc3VsdERpc3Bvc2l0aW9uIHsgZW51bSBGbGFncyB7CisgICAgICAg IE5vcm1hbCA9IDB4MDEsCisKKyAgICAgICAgQ29udGludWVPbkZhaWx1cmUgPSAweDAyLCAgIC8v IEZhaWx1cmVzIGZhaWwgdGVzdCwgYnV0IGV4ZWN1dGlvbiBjb250aW51ZXMKKyAgICAgICAgRmFs c2VUZXN0ID0gMHgwNCwgICAgICAgICAgIC8vIFByZWZpeCBleHByZXNzaW9uIHdpdGggIQorICAg ICAgICBTdXBwcmVzc0ZhaWwgPSAweDA4ICAgICAgICAgLy8gRmFpbHVyZXMgYXJlIHJlcG9ydGVk IGJ1dCBkbyBub3QgZmFpbCB0aGUgdGVzdAorICAgIH07IH07CisKKyAgICBSZXN1bHREaXNwb3Np dGlvbjo6RmxhZ3Mgb3BlcmF0b3IgfCAoIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBsaHMsIFJl c3VsdERpc3Bvc2l0aW9uOjpGbGFncyByaHMgKTsKKworICAgIGJvb2wgc2hvdWxkQ29udGludWVP bkZhaWx1cmUoIGludCBmbGFncyApOworICAgIGlubGluZSBib29sIGlzRmFsc2VUZXN0KCBpbnQg ZmxhZ3MgKSB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCAp ICE9IDA7IH0KKyAgICBib29sIHNob3VsZFN1cHByZXNzRmFpbHVyZSggaW50IGZsYWdzICk7CisK K30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfcmVzdWx0X3R5cGUuaAor bmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBBc3NlcnRpb25JbmZvCisgICAgeworICAg ICAgICBTdHJpbmdSZWYgbWFjcm9OYW1lOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5m bzsKKyAgICAgICAgU3RyaW5nUmVmIGNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgUmVzdWx0 RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uOworCisgICAgICAgIC8vIFdlIHdh bnQgdG8gZGVsZXRlIHRoaXMgY29uc3RydWN0b3IgYnV0IGEgY29tcGlsZXIgYnVnIGluIDQuOCBt ZWFucworICAgICAgICAvLyB0aGUgc3RydWN0IGlzIHRoZW4gdHJlYXRlZCBhcyBub24tYWdncmVn YXRlCisgICAgICAgIC8vQXNzZXJ0aW9uSW5mbygpID0gZGVsZXRlOworICAgIH07CisKK30gLy8g ZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfYXNzZXJ0aW9uaW5mby5oCisvLyBz dGFydCBjYXRjaF9kZWNvbXBvc2VyLmgKKworLy8gc3RhcnQgY2F0Y2hfdG9zdHJpbmcuaAorCisj aW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dHlwZV90cmFp dHM+CisjaW5jbHVkZSA8c3RyaW5nPgorLy8gc3RhcnQgY2F0Y2hfc3RyZWFtLmgKKworI2luY2x1 ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPG9zdHJlYW0+CisKK25h bWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGQ6Om9zdHJlYW0mIGNvdXQoKTsKKyAgICBzdGQ6Om9z dHJlYW0mIGNlcnIoKTsKKyAgICBzdGQ6Om9zdHJlYW0mIGNsb2coKTsKKworICAgIGNsYXNzIFN0 cmluZ1JlZjsKKworICAgIHN0cnVjdCBJU3RyZWFtIHsKKyAgICAgICAgdmlydHVhbCB+SVN0cmVh bSgpOworICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgPSAwOwor ICAgIH07CisKKyAgICBhdXRvIG1ha2VTdHJlYW0oIFN0cmluZ1JlZiBjb25zdCAmZmlsZW5hbWUg KSAtPiBJU3RyZWFtIGNvbnN0KjsKKworICAgIGNsYXNzIFJldXNhYmxlU3RyaW5nU3RyZWFtIDog Tm9uQ29weWFibGUgeworICAgICAgICBzdGQ6OnNpemVfdCBtX2luZGV4OworICAgICAgICBzdGQ6 Om9zdHJlYW0qIG1fb3NzOworICAgIHB1YmxpYzoKKyAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJl YW0oKTsKKyAgICAgICAgflJldXNhYmxlU3RyaW5nU3RyZWFtKCk7CisKKyAgICAgICAgYXV0byBz dHIoKSBjb25zdCAtPiBzdGQ6OnN0cmluZzsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU PgorICAgICAgICBhdXRvIG9wZXJhdG9yIDw8ICggVCBjb25zdCYgdmFsdWUgKSAtPiBSZXVzYWJs ZVN0cmluZ1N0cmVhbSYgeworICAgICAgICAgICAgKm1fb3NzIDw8IHZhbHVlOworICAgICAgICAg ICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIGF1dG8gZ2V0KCkgLT4gc3RkOjpv c3RyZWFtJiB7IHJldHVybiAqbV9vc3M7IH0KKyAgICB9OworfQorCisvLyBlbmQgY2F0Y2hfc3Ry ZWFtLmgKKy8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfZW51bV92YWx1ZXNfcmVnaXN0cnkuaAor CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNl IERldGFpbCB7CisgICAgICAgIHN0cnVjdCBFbnVtSW5mbyB7CisgICAgICAgICAgICBTdHJpbmdS ZWYgbV9uYW1lOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgU3RyaW5n UmVmPj4gbV92YWx1ZXM7CisKKyAgICAgICAgICAgIH5FbnVtSW5mbygpOworCisgICAgICAgICAg ICBTdHJpbmdSZWYgbG9va3VwKCBpbnQgdmFsdWUgKSBjb25zdDsKKyAgICAgICAgfTsKKyAgICB9 IC8vIG5hbWVzcGFjZSBEZXRhaWwKKworICAgIHN0cnVjdCBJTXV0YWJsZUVudW1WYWx1ZXNSZWdp c3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklNdXRhYmxlRW51bVZhbHVlc1JlZ2lzdHJ5KCk7CisK KyAgICAgICAgdmlydHVhbCBEZXRhaWw6OkVudW1JbmZvIGNvbnN0JiByZWdpc3RlckVudW0oIFN0 cmluZ1JlZiBlbnVtTmFtZSwgU3RyaW5nUmVmIGFsbEVudW1zLCBzdGQ6OnZlY3RvcjxpbnQ+IGNv bnN0JiB2YWx1ZXMgKSA9IDA7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICAg ICAgRGV0YWlsOjpFbnVtSW5mbyBjb25zdCYgcmVnaXN0ZXJFbnVtKCBTdHJpbmdSZWYgZW51bU5h bWUsIFN0cmluZ1JlZiBhbGxFbnVtcywgc3RkOjppbml0aWFsaXplcl9saXN0PEU+IHZhbHVlcyAp IHsKKyAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludCkgPj0gc2l6ZW9mKEUpLCAi Q2Fubm90IHNlcmlhbGl6ZSBlbnVtIHRvIGludCIpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8 aW50PiBpbnRWYWx1ZXM7CisgICAgICAgICAgICBpbnRWYWx1ZXMucmVzZXJ2ZSggdmFsdWVzLnNp emUoKSApOworICAgICAgICAgICAgZm9yKCBhdXRvIGVudW1WYWx1ZSA6IHZhbHVlcyApCisgICAg ICAgICAgICAgICAgaW50VmFsdWVzLnB1c2hfYmFjayggc3RhdGljX2Nhc3Q8aW50PiggZW51bVZh bHVlICkgKTsKKyAgICAgICAgICAgIHJldHVybiByZWdpc3RlckVudW0oIGVudW1OYW1lLCBhbGxF bnVtcywgaW50VmFsdWVzICk7CisgICAgICAgIH0KKyAgICB9OworCit9IC8vIENhdGNoCisKKy8v IGVuZCBjYXRjaF9pbnRlcmZhY2VzX2VudW1fdmFsdWVzX3JlZ2lzdHJ5LmgKKworI2lmZGVmIENB VENIX0NPTkZJR19DUFAxN19TVFJJTkdfVklFVworI2luY2x1ZGUgPHN0cmluZ192aWV3PgorI2Vu ZGlmCisKKyNpZmRlZiBfX09CSkNfXworLy8gc3RhcnQgY2F0Y2hfb2JqY19hcmMuaHBwCisKKyNp bXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisjaWZkZWYgX19oYXNfZmVhdHVyZQor I2RlZmluZSBDQVRDSF9BUkNfRU5BQkxFRCBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQorI2Vsc2UK KyNkZWZpbmUgQ0FUQ0hfQVJDX0VOQUJMRUQgMAorI2VuZGlmCisKK3ZvaWQgYXJjU2FmZVJlbGVh c2UoIE5TT2JqZWN0KiBvYmogKTsKK2lkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmos IFNFTCBzZWwgKTsKKworI2lmICFDQVRDSF9BUkNfRU5BQkxFRAoraW5saW5lIHZvaWQgYXJjU2Fm ZVJlbGVhc2UoIE5TT2JqZWN0KiBvYmogKSB7CisgICAgW29iaiByZWxlYXNlXTsKK30KK2lubGlu ZSBpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICkgeworICAgIGlm KCBbb2JqIHJlc3BvbmRzVG9TZWxlY3Rvcjogc2VsXSApCisgICAgICAgIHJldHVybiBbb2JqIHBl cmZvcm1TZWxlY3Rvcjogc2VsXTsKKyAgICByZXR1cm4gbmlsOworfQorI2RlZmluZSBDQVRDSF9V TlNBRkVfVU5SRVRBSU5FRAorI2RlZmluZSBDQVRDSF9BUkNfU1RST05HCisjZWxzZQoraW5saW5l IHZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiApe30KK2lubGluZSBpZCBwZXJmb3JtT3B0 aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICkgeworI2lmZGVmIF9fY2xhbmdfXworI3By YWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25v cmVkICItV2FyYy1wZXJmb3JtU2VsZWN0b3ItbGVha3MiCisjZW5kaWYKKyAgICBpZiggW29iaiBy ZXNwb25kc1RvU2VsZWN0b3I6IHNlbF0gKQorICAgICAgICByZXR1cm4gW29iaiBwZXJmb3JtU2Vs ZWN0b3I6IHNlbF07CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMg cG9wCisjZW5kaWYKKyAgICByZXR1cm4gbmlsOworfQorI2RlZmluZSBDQVRDSF9VTlNBRkVfVU5S RVRBSU5FRCBfX3Vuc2FmZV91bnJldGFpbmVkCisjZGVmaW5lIENBVENIX0FSQ19TVFJPTkcgX19z dHJvbmcKKyNlbmRpZgorCisvLyBlbmQgY2F0Y2hfb2JqY19hcmMuaHBwCisjZW5kaWYKKworI2lm ZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNh YmxlOjQxODApIC8vIFdlIGF0dGVtcHQgdG8gc3RyZWFtIGEgZnVuY3Rpb24gKGFkZHJlc3MpIGJ5 IGNvbnN0Jiwgd2hpY2ggTVNWQyBjb21wbGFpbnMgYWJvdXQgYnV0IGlzIGhhcm1sZXNzCisjZW5k aWYKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBuYW1lc3BhY2UgRGV0YWlsIHsKKworICAgICAg ICBleHRlcm4gY29uc3Qgc3RkOjpzdHJpbmcgdW5wcmludGFibGVTdHJpbmc7CisKKyAgICAgICAg c3RkOjpzdHJpbmcgcmF3TWVtb3J5VG9TdHJpbmcoIGNvbnN0IHZvaWQgKm9iamVjdCwgc3RkOjpz aXplX3Qgc2l6ZSApOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0 ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCBUJiBvYmplY3QgKSB7CisgICAgICAg ICAgcmV0dXJuIHJhd01lbW9yeVRvU3RyaW5nKCAmb2JqZWN0LCBzaXplb2Yob2JqZWN0KSApOwor ICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgY2xhc3Mg SXNTdHJlYW1JbnNlcnRhYmxlIHsKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmVh bSwgdHlwZW5hbWUgVT4KKyAgICAgICAgICAgIHN0YXRpYyBhdXRvIHRlc3QoaW50KQorICAgICAg ICAgICAgICAgIC0+IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxTdHJlYW0mPigpIDw8IHN0ZDo6ZGVj bHZhbDxVPigpLCBzdGQ6OnRydWVfdHlwZSgpKTsKKworICAgICAgICAgICAgdGVtcGxhdGU8dHlw ZW5hbWUsIHR5cGVuYW1lPgorICAgICAgICAgICAgc3RhdGljIGF1dG8gdGVzdCguLi4pLT5zdGQ6 OmZhbHNlX3R5cGU7CisKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RhdGljIGNvbnN0 IGJvb2wgdmFsdWUgPSBkZWNsdHlwZSh0ZXN0PHN0ZDo6b3N0cmVhbSwgY29uc3QgVCY+KDApKTo6 dmFsdWU7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICAg ICAgc3RkOjpzdHJpbmcgY29udmVydFVua25vd25FbnVtVG9TdHJpbmcoIEUgZSApOworCisgICAg ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lm PAorICAgICAgICAgICAgIXN0ZDo6aXNfZW51bTxUPjo6dmFsdWUgJiYgIXN0ZDo6aXNfYmFzZV9v ZjxzdGQ6OmV4Y2VwdGlvbiwgVD46OnZhbHVlLAorICAgICAgICBzdGQ6OnN0cmluZz46OnR5cGUg Y29udmVydFVuc3RyZWFtYWJsZSggVCBjb25zdCYgKSB7CisgICAgICAgICAgICByZXR1cm4gRGV0 YWlsOjp1bnByaW50YWJsZVN0cmluZzsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZSBUPgorICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICFz dGQ6OmlzX2VudW08VD46OnZhbHVlICYmIHN0ZDo6aXNfYmFzZV9vZjxzdGQ6OmV4Y2VwdGlvbiwg VD46OnZhbHVlLAorICAgICAgICAgc3RkOjpzdHJpbmc+Ojp0eXBlIGNvbnZlcnRVbnN0cmVhbWFi bGUoVCBjb25zdCYgZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBleC53aGF0KCk7CisgICAgICAg IH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB0eXBlbmFtZSBzdGQ6 OmVuYWJsZV9pZjwKKyAgICAgICAgICAgIHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUKKyAgICAgICAg LCBzdGQ6OnN0cmluZz46OnR5cGUgY29udmVydFVuc3RyZWFtYWJsZSggVCBjb25zdCYgdmFsdWUg KSB7CisgICAgICAgICAgICByZXR1cm4gY29udmVydFVua25vd25FbnVtVG9TdHJpbmcoIHZhbHVl ICk7CisgICAgICAgIH0KKworI2lmIGRlZmluZWQoX01BTkFHRUQpCisgICAgICAgIC8vISBDb252 ZXJ0IGEgQ0xSIHN0cmluZyB0byBhIHV0Zjggc3RkOjpzdHJpbmcKKyAgICAgICAgdGVtcGxhdGU8 dHlwZW5hbWUgVD4KKyAgICAgICAgc3RkOjpzdHJpbmcgY2xyUmVmZXJlbmNlVG9TdHJpbmcoIFRe IHJlZiApIHsKKyAgICAgICAgICAgIGlmIChyZWYgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAg ICByZXR1cm4gc3RkOjpzdHJpbmcoIm51bGwiKTsKKyAgICAgICAgICAgIGF1dG8gYnl0ZXMgPSBT eXN0ZW06OlRleHQ6OkVuY29kaW5nOjpVVEY4LT5HZXRCeXRlcyhyZWYtPlRvU3RyaW5nKCkpOwor ICAgICAgICAgICAgY2xpOjpwaW5fcHRyPFN5c3RlbTo6Qnl0ZT4gcCA9ICZieXRlc1swXTsKKyAg ICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNoYXIgY29uc3Qg Kj4ocCksIGJ5dGVzLT5MZW5ndGgpOworICAgICAgICB9CisjZW5kaWYKKworICAgIH0gLy8gbmFt ZXNwYWNlIERldGFpbAorCisgICAgLy8gSWYgd2UgZGVjaWRlIGZvciBDKysxNCwgY2hhbmdlIHRo ZXNlIHRvIGVuYWJsZV9pZl90cworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9 IHZvaWQ+CisgICAgc3RydWN0IFN0cmluZ01ha2VyIHsKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVu YW1lIEZha2UgPSBUPgorICAgICAgICBzdGF0aWMKKyAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFi bGVfaWY8OjpDYXRjaDo6RGV0YWlsOjpJc1N0cmVhbUluc2VydGFibGU8RmFrZT46OnZhbHVlLCBz dGQ6OnN0cmluZz46OnR5cGUKKyAgICAgICAgICAgIGNvbnZlcnQoY29uc3QgRmFrZSYgdmFsdWUp IHsKKyAgICAgICAgICAgICAgICBSZXVzYWJsZVN0cmluZ1N0cmVhbSByc3M7CisgICAgICAgICAg ICAgICAgLy8gTkI6IGNhbGwgdXNpbmcgdGhlIGZ1bmN0aW9uLWxpa2Ugc3ludGF4IHRvIGF2b2lk IGFtYmlndWl0eSB3aXRoCisgICAgICAgICAgICAgICAgLy8gdXNlci1kZWZpbmVkIHRlbXBsYXRl ZCBvcGVyYXRvcjw8IHVuZGVyIGNsYW5nLgorICAgICAgICAgICAgICAgIHJzcy5vcGVyYXRvcjw8 KHZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcnNzLnN0cigpOworICAgICAgICB9CisK KyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZha2UgPSBUPgorICAgICAgICBzdGF0aWMKKyAg ICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ITo6Q2F0Y2g6OkRldGFpbDo6SXNTdHJlYW1J bnNlcnRhYmxlPEZha2U+Ojp2YWx1ZSwgc3RkOjpzdHJpbmc+Ojp0eXBlCisgICAgICAgICAgICBj b252ZXJ0KCBjb25zdCBGYWtlJiB2YWx1ZSApIHsKKyNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdf RkFMTEJBQ0tfU1RSSU5HSUZJRVIpCisgICAgICAgICAgICByZXR1cm4gRGV0YWlsOjpjb252ZXJ0 VW5zdHJlYW1hYmxlKHZhbHVlKTsKKyNlbHNlCisgICAgICAgICAgICByZXR1cm4gQ0FUQ0hfQ09O RklHX0ZBTExCQUNLX1NUUklOR0lGSUVSKHZhbHVlKTsKKyNlbmRpZgorICAgICAgICB9CisgICAg fTsKKworICAgIG5hbWVzcGFjZSBEZXRhaWwgeworCisgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24g ZGlzcGF0Y2hlcyBhbGwgc3RyaW5naWZpY2F0aW9uIHJlcXVlc3RzIGluc2lkZSBvZiBDYXRjaC4K KyAgICAgICAgLy8gU2hvdWxkIGJlIHByZWZlcmFibHkgY2FsbGVkIGZ1bGx5IHF1YWxpZmllZCwg bGlrZSA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeQorICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5h bWUgVD4KKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyaW5naWZ5KGNvbnN0IFQmIGUpIHsKKyAgICAg ICAgICAgIHJldHVybiA6OkNhdGNoOjpTdHJpbmdNYWtlcjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9j djx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+Ojp0eXBlPjo6Y29udmVy dChlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgICAg IHN0ZDo6c3RyaW5nIGNvbnZlcnRVbmtub3duRW51bVRvU3RyaW5nKCBFIGUgKSB7CisgICAgICAg ICAgICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoc3RhdGljX2Nhc3Q8dHlwZW5h bWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGU+KGUpKTsKKyAgICAgICAgfQorCisjaWYg ZGVmaW5lZChfTUFOQUdFRCkKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICAg IHN0ZDo6c3RyaW5nIHN0cmluZ2lmeSggVF4gZSApIHsKKyAgICAgICAgICAgIHJldHVybiA6OkNh dGNoOjpTdHJpbmdNYWtlcjxUXj46OmNvbnZlcnQoZSk7CisgICAgICAgIH0KKyNlbmRpZgorCisg ICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCisKKyAgICAvLyBTb21lIHByZWRlZmluZWQgc3BlY2lh bGl6YXRpb25zCisKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6 c3RyaW5nPiB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KGNvbnN0IHN0ZDo6 c3RyaW5nJiBzdHIpOworICAgIH07CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTdfU1RSSU5H X1ZJRVcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6c3RyaW5n X3ZpZXc+IHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoc3RkOjpzdHJpbmdf dmlldyBzdHIpOworICAgIH07CisjZW5kaWYKKworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3Qg U3RyaW5nTWFrZXI8Y2hhciBjb25zdCAqPiB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBj b252ZXJ0KGNoYXIgY29uc3QgKiBzdHIpOworICAgIH07CisgICAgdGVtcGxhdGU8PgorICAgIHN0 cnVjdCBTdHJpbmdNYWtlcjxjaGFyICo+IHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNv bnZlcnQoY2hhciAqIHN0cik7CisgICAgfTsKKworI2lmZGVmIENBVENIX0NPTkZJR19XQ0hBUgor ICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp3c3RyaW5nPiB7Cisg ICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KGNvbnN0IHN0ZDo6d3N0cmluZyYgd3N0 cik7CisgICAgfTsKKworIyBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTdfU1RSSU5HX1ZJRVcKKyAg ICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6d3N0cmluZ192aWV3PiB7 CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KHN0ZDo6d3N0cmluZ192aWV3IHN0 cik7CisgICAgfTsKKyMgZW5kaWYKKworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgU3RyaW5n TWFrZXI8d2NoYXJfdCBjb25zdCAqPiB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252 ZXJ0KHdjaGFyX3QgY29uc3QgKiBzdHIpOworICAgIH07CisgICAgdGVtcGxhdGU8PgorICAgIHN0 cnVjdCBTdHJpbmdNYWtlcjx3Y2hhcl90ICo+IHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5n IGNvbnZlcnQod2NoYXJfdCAqIHN0cik7CisgICAgfTsKKyNlbmRpZgorCisgICAgLy8gVEJEOiBT aG91bGQgd2UgdXNlIGBzdHJubGVuYCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBnbyBvdXQgb2Yg dGhlIGJ1ZmZlciwKKyAgICAvLyAgICAgIHdoaWxlIGtlZXBpbmcgc3RyaW5nIHNlbWFudGljcz8K KyAgICB0ZW1wbGF0ZTxpbnQgU1o+CisgICAgc3RydWN0IFN0cmluZ01ha2VyPGNoYXJbU1pdPiB7 CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KGNoYXIgY29uc3QqIHN0cikgewor ICAgICAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KHN0ZDo6c3RyaW5n eyBzdHIgfSk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPGludCBTWj4KKyAgICBz dHJ1Y3QgU3RyaW5nTWFrZXI8c2lnbmVkIGNoYXJbU1pdPiB7CisgICAgICAgIHN0YXRpYyBzdGQ6 OnN0cmluZyBjb252ZXJ0KHNpZ25lZCBjaGFyIGNvbnN0KiBzdHIpIHsKKyAgICAgICAgICAgIHJl dHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGQ6OnN0cmluZ3sgcmVpbnRlcnByZXRf Y2FzdDxjaGFyIGNvbnN0ICo+KHN0cikgfSk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBs YXRlPGludCBTWj4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8dW5zaWduZWQgY2hhcltTWl0+IHsK KyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQodW5zaWduZWQgY2hhciBjb25zdCog c3RyKSB7CisgICAgICAgICAgICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoc3Rk OjpzdHJpbmd7IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciBjb25zdCAqPihzdHIpIH0pOworICAgICAg ICB9CisgICAgfTsKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDE3X0JZVEUpCisgICAg dGVtcGxhdGU8PgorICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OmJ5dGU+IHsKKyAgICAgICAg c3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoc3RkOjpieXRlIHZhbHVlKTsKKyAgICB9OworI2Vu ZGlmIC8vIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDE3X0JZVEUpCisgICAgdGVtcGxhdGU8Pgor ICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxpbnQ+IHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5n IGNvbnZlcnQoaW50IHZhbHVlKTsKKyAgICB9OworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3Qg U3RyaW5nTWFrZXI8bG9uZz4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChs b25nIHZhbHVlKTsKKyAgICB9OworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFr ZXI8bG9uZyBsb25nPiB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KGxvbmcg bG9uZyB2YWx1ZSk7CisgICAgfTsKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IFN0cmluZ01h a2VyPHVuc2lnbmVkIGludD4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCh1 bnNpZ25lZCBpbnQgdmFsdWUpOworICAgIH07CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBT dHJpbmdNYWtlcjx1bnNpZ25lZCBsb25nPiB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBj b252ZXJ0KHVuc2lnbmVkIGxvbmcgdmFsdWUpOworICAgIH07CisgICAgdGVtcGxhdGU8PgorICAg IHN0cnVjdCBTdHJpbmdNYWtlcjx1bnNpZ25lZCBsb25nIGxvbmc+IHsKKyAgICAgICAgc3RhdGlj IHN0ZDo6c3RyaW5nIGNvbnZlcnQodW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKTsKKyAgICB9Owor CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxib29sPiB7CisgICAgICAg IHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KGJvb2wgYik7CisgICAgfTsKKworICAgIHRlbXBs YXRlPD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8Y2hhcj4geworICAgICAgICBzdGF0aWMgc3Rk OjpzdHJpbmcgY29udmVydChjaGFyIGMpOworICAgIH07CisgICAgdGVtcGxhdGU8PgorICAgIHN0 cnVjdCBTdHJpbmdNYWtlcjxzaWduZWQgY2hhcj4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJp bmcgY29udmVydChzaWduZWQgY2hhciBjKTsKKyAgICB9OworICAgIHRlbXBsYXRlPD4KKyAgICBz dHJ1Y3QgU3RyaW5nTWFrZXI8dW5zaWduZWQgY2hhcj4geworICAgICAgICBzdGF0aWMgc3RkOjpz dHJpbmcgY29udmVydCh1bnNpZ25lZCBjaGFyIGMpOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTw+ CisgICAgc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6bnVsbHB0cl90PiB7CisgICAgICAgIHN0YXRp YyBzdGQ6OnN0cmluZyBjb252ZXJ0KHN0ZDo6bnVsbHB0cl90KTsKKyAgICB9OworCisgICAgdGVt cGxhdGU8PgorICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxmbG9hdD4geworICAgICAgICBzdGF0aWMg c3RkOjpzdHJpbmcgY29udmVydChmbG9hdCB2YWx1ZSk7CisgICAgICAgIHN0YXRpYyBpbnQgcHJl Y2lzaW9uOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IFN0cmluZ01ha2Vy PGRvdWJsZT4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChkb3VibGUgdmFs dWUpOworICAgICAgICBzdGF0aWMgaW50IHByZWNpc2lvbjsKKyAgICB9OworCisgICAgdGVtcGxh dGUgPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IFN0cmluZ01ha2VyPFQqPiB7CisgICAgICAgIHRl bXBsYXRlIDx0eXBlbmFtZSBVPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChV KiBwKSB7CisgICAgICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgICAgIHJldHVybiA6OkNh dGNoOjpEZXRhaWw6OnJhd01lbW9yeVRvU3RyaW5nKHApOworICAgICAgICAgICAgfSBlbHNlIHsK KyAgICAgICAgICAgICAgICByZXR1cm4gIm51bGxwdHIiOworICAgICAgICAgICAgfQorICAgICAg ICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBDPgorICAg IHN0cnVjdCBTdHJpbmdNYWtlcjxSIEM6Oio+IHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5n IGNvbnZlcnQoUiBDOjoqIHApIHsKKyAgICAgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICAg ICAgcmV0dXJuIDo6Q2F0Y2g6OkRldGFpbDo6cmF3TWVtb3J5VG9TdHJpbmcocCk7CisgICAgICAg ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAibnVsbHB0ciI7CisgICAgICAg ICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisjaWYgZGVmaW5lZChfTUFOQUdFRCkKKyAgICB0 ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8VF4+IHsKKyAgICAg ICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFReIHJlZiApIHsKKyAgICAgICAgICAgIHJl dHVybiA6OkNhdGNoOjpEZXRhaWw6OmNsclJlZmVyZW5jZVRvU3RyaW5nKHJlZik7CisgICAgICAg IH0KKyAgICB9OworI2VuZGlmCisKKyAgICBuYW1lc3BhY2UgRGV0YWlsIHsKKyAgICAgICAgdGVt cGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgU2VudGluZWwgPSBJbnB1dEl0 ZXJhdG9yPgorICAgICAgICBzdGQ6OnN0cmluZyByYW5nZVRvU3RyaW5nKElucHV0SXRlcmF0b3Ig Zmlyc3QsIFNlbnRpbmVsIGxhc3QpIHsKKyAgICAgICAgICAgIFJldXNhYmxlU3RyaW5nU3RyZWFt IHJzczsKKyAgICAgICAgICAgIHJzcyA8PCAieyAiOworICAgICAgICAgICAgaWYgKGZpcnN0ICE9 IGxhc3QpIHsKKyAgICAgICAgICAgICAgICByc3MgPDwgOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdp ZnkoKmZpcnN0KTsKKyAgICAgICAgICAgICAgICBmb3IgKCsrZmlyc3Q7IGZpcnN0ICE9IGxhc3Q7 ICsrZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHJzcyA8PCAiLCAiIDw8IDo6Q2F0Y2g6OkRl dGFpbDo6c3RyaW5naWZ5KCpmaXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByc3Mg PDwgIiB9IjsKKyAgICAgICAgICAgIHJldHVybiByc3Muc3RyKCk7CisgICAgICAgIH0KKyAgICB9 CisKKyNpZmRlZiBfX09CSkNfXworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFr ZXI8TlNTdHJpbmcqPiB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KE5TU3Ry aW5nICogbnNzdHJpbmcpIHsKKyAgICAgICAgICAgIGlmICghbnNzdHJpbmcpCisgICAgICAgICAg ICAgICAgcmV0dXJuICJuaWwiOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJAIikg KyBbbnNzdHJpbmcgVVRGOFN0cmluZ107CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRl PD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8TlNPYmplY3QqPiB7CisgICAgICAgIHN0YXRpYyBz dGQ6OnN0cmluZyBjb252ZXJ0KE5TT2JqZWN0KiBuc09iamVjdCkgeworICAgICAgICAgICAgcmV0 dXJuIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KFtuc09iamVjdCBkZXNjcmlwdGlvbl0pOwor ICAgICAgICB9CisKKyAgICB9OworICAgIG5hbWVzcGFjZSBEZXRhaWwgeworICAgICAgICBpbmxp bmUgc3RkOjpzdHJpbmcgc3RyaW5naWZ5KCBOU1N0cmluZyogbnNzdHJpbmcgKSB7CisgICAgICAg ICAgICByZXR1cm4gU3RyaW5nTWFrZXI8TlNTdHJpbmcqPjo6Y29udmVydCggbnNzdHJpbmcgKTsK KyAgICAgICAgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCisjZW5kaWYgLy8gX19PQkpD X18KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTZXBhcmF0ZSBzdGQtbGliIHR5cGVzIHN0 cmluZ2lmaWNhdGlvbiwgc28gaXQgY2FuIGJlIHNlbGVjdGl2ZWx5IGVuYWJsZWQKKy8vIFRoaXMg bWVhbnMgdGhhdCB3ZSBkbyBub3QgYnJpbmcgaW4KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklH X0VOQUJMRV9BTExfU1RSSU5HTUFLRVJTKQorIyAgZGVmaW5lIENBVENIX0NPTkZJR19FTkFCTEVf UEFJUl9TVFJJTkdNQUtFUgorIyAgZGVmaW5lIENBVENIX0NPTkZJR19FTkFCTEVfVFVQTEVfU1RS SU5HTUFLRVIKKyMgIGRlZmluZSBDQVRDSF9DT05GSUdfRU5BQkxFX1ZBUklBTlRfU1RSSU5HTUFL RVIKKyMgIGRlZmluZSBDQVRDSF9DT05GSUdfRU5BQkxFX0NIUk9OT19TVFJJTkdNQUtFUgorIyAg ZGVmaW5lIENBVENIX0NPTkZJR19FTkFCTEVfT1BUSU9OQUxfU1RSSU5HTUFLRVIKKyNlbmRpZgor CisvLyBTZXBhcmF0ZSBzdGQ6OnBhaXIgc3BlY2lhbGl6YXRpb24KKyNpZiBkZWZpbmVkKENBVENI X0NPTkZJR19FTkFCTEVfUEFJUl9TVFJJTkdNQUtFUikKKyNpbmNsdWRlIDx1dGlsaXR5PgorbmFt ZXNwYWNlIENhdGNoIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cisg ICAgc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6cGFpcjxUMSwgVDI+ID4geworICAgICAgICBzdGF0 aWMgc3RkOjpzdHJpbmcgY29udmVydChjb25zdCBzdGQ6OnBhaXI8VDEsIFQyPiYgcGFpcikgewor ICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAgICAgICAgICAgcnNzIDw8 ICJ7ICIKKyAgICAgICAgICAgICAgICA8PCA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShwYWly LmZpcnN0KQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCA6OkNh dGNoOjpEZXRhaWw6OnN0cmluZ2lmeShwYWlyLnNlY29uZCkKKyAgICAgICAgICAgICAgICA8PCAi IH0iOworICAgICAgICAgICAgcmV0dXJuIHJzcy5zdHIoKTsKKyAgICAgICAgfQorICAgIH07Cit9 CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9QQUlSX1NUUklOR01BS0VSCisKKyNpZiBk ZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfT1BUSU9OQUxfU1RSSU5HTUFLRVIpICYmIGRlZmlu ZWQoQ0FUQ0hfQ09ORklHX0NQUDE3X09QVElPTkFMKQorI2luY2x1ZGUgPG9wdGlvbmFsPgorbmFt ZXNwYWNlIENhdGNoIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBTdHJp bmdNYWtlcjxzdGQ6Om9wdGlvbmFsPFQ+ID4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcg Y29udmVydChjb25zdCBzdGQ6Om9wdGlvbmFsPFQ+JiBvcHRpb25hbCkgeworICAgICAgICAgICAg UmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAgICAgICAgICAgaWYgKG9wdGlvbmFsLmhhc192 YWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgcnNzIDw8IDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5n aWZ5KCpvcHRpb25hbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJz cyA8PCAieyB9IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByc3Muc3RyKCk7 CisgICAgICAgIH0KKyAgICB9OworfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19FTkFCTEVfT1BU SU9OQUxfU1RSSU5HTUFLRVIKKworLy8gU2VwYXJhdGUgc3RkOjp0dXBsZSBzcGVjaWFsaXphdGlv bgorI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9UVVBMRV9TVFJJTkdNQUtFUikKKyNp bmNsdWRlIDx0dXBsZT4KK25hbWVzcGFjZSBDYXRjaCB7CisgICAgbmFtZXNwYWNlIERldGFpbCB7 CisgICAgICAgIHRlbXBsYXRlPAorICAgICAgICAgICAgdHlwZW5hbWUgVHVwbGUsCisgICAgICAg ICAgICBzdGQ6OnNpemVfdCBOID0gMCwKKyAgICAgICAgICAgIGJvb2wgPSAoTiA8IHN0ZDo6dHVw bGVfc2l6ZTxUdXBsZT46OnZhbHVlKQorICAgICAgICAgICAgPgorICAgICAgICAgICAgc3RydWN0 IFR1cGxlRWxlbWVudFByaW50ZXIgeworICAgICAgICAgICAgc3RhdGljIHZvaWQgcHJpbnQoY29u c3QgVHVwbGUmIHR1cGxlLCBzdGQ6Om9zdHJlYW0mIG9zKSB7CisgICAgICAgICAgICAgICAgb3Mg PDwgKE4gPyAiLCAiIDogIiAiKQorICAgICAgICAgICAgICAgICAgICA8PCA6OkNhdGNoOjpEZXRh aWw6OnN0cmluZ2lmeShzdGQ6OmdldDxOPih0dXBsZSkpOworICAgICAgICAgICAgICAgIFR1cGxl RWxlbWVudFByaW50ZXI8VHVwbGUsIE4gKyAxPjo6cHJpbnQodHVwbGUsIG9zKTsKKyAgICAgICAg ICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTwKKyAgICAgICAgICAgIHR5cGVu YW1lIFR1cGxlLAorICAgICAgICAgICAgc3RkOjpzaXplX3QgTgorICAgICAgICA+CisgICAgICAg ICAgICBzdHJ1Y3QgVHVwbGVFbGVtZW50UHJpbnRlcjxUdXBsZSwgTiwgZmFsc2U+IHsKKyAgICAg ICAgICAgIHN0YXRpYyB2b2lkIHByaW50KGNvbnN0IFR1cGxlJiwgc3RkOjpvc3RyZWFtJikge30K KyAgICAgICAgfTsKKworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLlR5cGVzPgor ICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OnR1cGxlPFR5cGVzLi4uPj4geworICAgICAgICBz dGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChjb25zdCBzdGQ6OnR1cGxlPFR5cGVzLi4uPiYgdHVw bGUpIHsKKyAgICAgICAgICAgIFJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKKyAgICAgICAgICAg IHJzcyA8PCAneyc7CisgICAgICAgICAgICBEZXRhaWw6OlR1cGxlRWxlbWVudFByaW50ZXI8c3Rk Ojp0dXBsZTxUeXBlcy4uLj4+OjpwcmludCh0dXBsZSwgcnNzLmdldCgpKTsKKyAgICAgICAgICAg IHJzcyA8PCAiIH0iOworICAgICAgICAgICAgcmV0dXJuIHJzcy5zdHIoKTsKKyAgICAgICAgfQor ICAgIH07Cit9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9UVVBMRV9TVFJJTkdNQUtF UgorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRU5BQkxFX1ZBUklBTlRfU1RSSU5HTUFLRVIp ICYmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDE3X1ZBUklBTlQpCisjaW5jbHVkZSA8dmFyaWFu dD4KK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBTdHJpbmdN YWtlcjxzdGQ6Om1vbm9zdGF0ZT4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVy dChjb25zdCBzdGQ6Om1vbm9zdGF0ZSYpIHsKKyAgICAgICAgICAgIHJldHVybiAieyB9IjsKKyAg ICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBFbGVtZW50cz4KKyAg ICBzdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp2YXJpYW50PEVsZW1lbnRzLi4uPj4geworICAgICAg ICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChjb25zdCBzdGQ6OnZhcmlhbnQ8RWxlbWVudHMu Li4+JiB2YXJpYW50KSB7CisgICAgICAgICAgICBpZiAodmFyaWFudC52YWx1ZWxlc3NfYnlfZXhj ZXB0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gInt2YWx1ZWxlc3MgdmFyaWFudH0i OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjp2aXNp dCgKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgYXV0byYgdmFsdWUpIHsKKyAgICAgICAg ICAgICAgICAgICAgICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeSh2YWx1ZSk7 CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQKKyAg ICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKK30KKyNl bmRpZiAvLyBDQVRDSF9DT05GSUdfRU5BQkxFX1ZBUklBTlRfU1RSSU5HTUFLRVIKKworbmFtZXNw YWNlIENhdGNoIHsKKyAgICAvLyBJbXBvcnQgYmVnaW4vIGVuZCBmcm9tIHN0ZCBoZXJlCisgICAg dXNpbmcgc3RkOjpiZWdpbjsKKyAgICB1c2luZyBzdGQ6OmVuZDsKKworICAgIG5hbWVzcGFjZSBk ZXRhaWwgeworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4+CisgICAgICAgIHN0cnVjdCB2 b2lkX3R5cGUgeworICAgICAgICAgICAgdXNpbmcgdHlwZSA9IHZvaWQ7CisgICAgICAgIH07CisK KyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdm9pZD4KKyAgICAgICAg c3RydWN0IGlzX3JhbmdlX2ltcGwgOiBzdGQ6OmZhbHNlX3R5cGUgeworICAgICAgICB9OworCisg ICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgaXNfcmFuZ2VfaW1w bDxULCB0eXBlbmFtZSB2b2lkX3R5cGU8ZGVjbHR5cGUoYmVnaW4oc3RkOjpkZWNsdmFsPFQ+KCkp KT46OnR5cGU+IDogc3RkOjp0cnVlX3R5cGUgeworICAgICAgICB9OworICAgIH0gLy8gbmFtZXNw YWNlIGRldGFpbAorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGlzX3Jh bmdlIDogZGV0YWlsOjppc19yYW5nZV9pbXBsPFQ+IHsKKyAgICB9OworCisjaWYgZGVmaW5lZChf TUFOQUdFRCkgLy8gTWFuYWdlZCB0eXBlcyBhcmUgbmV2ZXIgcmFuZ2VzCisgICAgdGVtcGxhdGUg PHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGlzX3JhbmdlPFRePiB7CisgICAgICAgIHN0YXRpYyBj b25zdCBib29sIHZhbHVlID0gZmFsc2U7CisgICAgfTsKKyNlbmRpZgorCisgICAgdGVtcGxhdGU8 dHlwZW5hbWUgUmFuZ2U+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggUmFuZ2UgY29u c3QmIHJhbmdlICkgeworICAgICAgICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpyYW5nZVRvU3Ry aW5nKCBiZWdpbiggcmFuZ2UgKSwgZW5kKCByYW5nZSApICk7CisgICAgfQorCisgICAgLy8gSGFu ZGxlIHZlY3Rvcjxib29sPiBzcGVjaWFsbHkKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0 b3I+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggc3RkOjp2ZWN0b3I8Ym9vbCwgQWxs b2NhdG9yPiBjb25zdCYgdiApIHsKKyAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOwor ICAgICAgICByc3MgPDwgInsgIjsKKyAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAg IGZvciggYm9vbCBiIDogdiApIHsKKyAgICAgICAgICAgIGlmKCBmaXJzdCApCisgICAgICAgICAg ICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBy c3MgPDwgIiwgIjsKKyAgICAgICAgICAgIHJzcyA8PCA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lm eSggYiApOworICAgICAgICB9CisgICAgICAgIHJzcyA8PCAiIH0iOworICAgICAgICByZXR1cm4g cnNzLnN0cigpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFI+CisgICAgc3RydWN0 IFN0cmluZ01ha2VyPFIsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX3JhbmdlPFI+Ojp2YWx1 ZSAmJiAhOjpDYXRjaDo6RGV0YWlsOjpJc1N0cmVhbUluc2VydGFibGU8Uj46OnZhbHVlPjo6dHlw ZT4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggUiBjb25zdCYgcmFuZ2Ug KSB7CisgICAgICAgICAgICByZXR1cm4gcmFuZ2VUb1N0cmluZyggcmFuZ2UgKTsKKyAgICAgICAg fQorICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IFNaPgorICAgIHN0cnVj dCBTdHJpbmdNYWtlcjxUW1NaXT4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVy dChUIGNvbnN0KCZhcnIpW1NaXSkgeworICAgICAgICAgICAgcmV0dXJuIHJhbmdlVG9TdHJpbmco YXJyKTsKKyAgICAgICAgfQorICAgIH07CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vIFNl cGFyYXRlIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbiBzcGVjaWFsaXphdGlvbgorI2lmIGRlZmluZWQo Q0FUQ0hfQ09ORklHX0VOQUJMRV9DSFJPTk9fU1RSSU5HTUFLRVIpCisjaW5jbHVkZSA8Y3RpbWU+ CisjaW5jbHVkZSA8cmF0aW8+CisjaW5jbHVkZSA8Y2hyb25vPgorCituYW1lc3BhY2UgQ2F0Y2gg eworCit0ZW1wbGF0ZSA8Y2xhc3MgUmF0aW8+CitzdHJ1Y3QgcmF0aW9fc3RyaW5nIHsKKyAgICBz dGF0aWMgc3RkOjpzdHJpbmcgc3ltYm9sKCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgUmF0aW8+ CitzdGQ6OnN0cmluZyByYXRpb19zdHJpbmc8UmF0aW8+OjpzeW1ib2woKSB7CisgICAgQ2F0Y2g6 OlJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKKyAgICByc3MgPDwgJ1snIDw8IFJhdGlvOjpudW0g PDwgJy8nCisgICAgICAgIDw8IFJhdGlvOjpkZW4gPDwgJ10nOworICAgIHJldHVybiByc3Muc3Ry KCk7Cit9Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IHJhdGlvX3N0cmluZzxzdGQ6OmF0dG8+IHsKKyAg ICBzdGF0aWMgc3RkOjpzdHJpbmcgc3ltYm9sKCk7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBy YXRpb19zdHJpbmc8c3RkOjpmZW10bz4geworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBzeW1ib2wo KTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IHJhdGlvX3N0cmluZzxzdGQ6OnBpY28+IHsKKyAg ICBzdGF0aWMgc3RkOjpzdHJpbmcgc3ltYm9sKCk7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBy YXRpb19zdHJpbmc8c3RkOjpuYW5vPiB7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHN5bWJvbCgp OworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgcmF0aW9fc3RyaW5nPHN0ZDo6bWljcm8+IHsKKyAg ICBzdGF0aWMgc3RkOjpzdHJpbmcgc3ltYm9sKCk7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBy YXRpb19zdHJpbmc8c3RkOjptaWxsaT4geworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBzeW1ib2wo KTsKK307CisKKyAgICAvLy8vLy8vLy8vLy8KKyAgICAvLyBzdGQ6OmNocm9ubzo6ZHVyYXRpb24g c3BlY2lhbGl6YXRpb25zCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIFJh dGlvPgorICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OmNocm9ubzo6ZHVyYXRpb248VmFsdWUs IFJhdGlvPj4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChzdGQ6OmNocm9u bzo6ZHVyYXRpb248VmFsdWUsIFJhdGlvPiBjb25zdCYgZHVyYXRpb24pIHsKKyAgICAgICAgICAg IFJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKKyAgICAgICAgICAgIHJzcyA8PCBkdXJhdGlvbi5j b3VudCgpIDw8ICcgJyA8PCByYXRpb19zdHJpbmc8UmF0aW8+OjpzeW1ib2woKSA8PCAncyc7Cisg ICAgICAgICAgICByZXR1cm4gcnNzLnN0cigpOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1w bGF0ZTx0eXBlbmFtZSBWYWx1ZT4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjpjaHJvbm86 OmR1cmF0aW9uPFZhbHVlLCBzdGQ6OnJhdGlvPDE+Pj4geworICAgICAgICBzdGF0aWMgc3RkOjpz dHJpbmcgY29udmVydChzdGQ6OmNocm9ubzo6ZHVyYXRpb248VmFsdWUsIHN0ZDo6cmF0aW88MT4+ IGNvbnN0JiBkdXJhdGlvbikgeworICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNz OworICAgICAgICAgICAgcnNzIDw8IGR1cmF0aW9uLmNvdW50KCkgPDwgIiBzIjsKKyAgICAgICAg ICAgIHJldHVybiByc3Muc3RyKCk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5 cGVuYW1lIFZhbHVlPgorICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OmNocm9ubzo6ZHVyYXRp b248VmFsdWUsIHN0ZDo6cmF0aW88NjA+Pj4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcg Y29udmVydChzdGQ6OmNocm9ubzo6ZHVyYXRpb248VmFsdWUsIHN0ZDo6cmF0aW88NjA+PiBjb25z dCYgZHVyYXRpb24pIHsKKyAgICAgICAgICAgIFJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKKyAg ICAgICAgICAgIHJzcyA8PCBkdXJhdGlvbi5jb3VudCgpIDw8ICIgbSI7CisgICAgICAgICAgICBy ZXR1cm4gcnNzLnN0cigpOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFt ZSBWYWx1ZT4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjpjaHJvbm86OmR1cmF0aW9uPFZh bHVlLCBzdGQ6OnJhdGlvPDM2MDA+Pj4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29u dmVydChzdGQ6OmNocm9ubzo6ZHVyYXRpb248VmFsdWUsIHN0ZDo6cmF0aW88MzYwMD4+IGNvbnN0 JiBkdXJhdGlvbikgeworICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAg ICAgICAgICAgcnNzIDw8IGR1cmF0aW9uLmNvdW50KCkgPDwgIiBoIjsKKyAgICAgICAgICAgIHJl dHVybiByc3Muc3RyKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vCisg ICAgLy8gc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQgc3BlY2lhbGl6YXRpb24KKyAgICAvLyBHZW5l cmljIHRpbWVfcG9pbnQgY2Fubm90IGJlIHNwZWNpYWxpemVkLCBvbmx5IHN0ZDo6Y2hyb25vOjp0 aW1lX3BvaW50PHN5c3RlbV9jbG9jaz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDbG9jaywgdHlw ZW5hbWUgRHVyYXRpb24+CisgICAgc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6Y2hyb25vOjp0aW1l X3BvaW50PENsb2NrLCBEdXJhdGlvbj4+IHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNv bnZlcnQoc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiBjb25zdCYgdGlt ZV9wb2ludCkgeworICAgICAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5 KHRpbWVfcG9pbnQudGltZV9zaW5jZV9lcG9jaCgpKSArICIgc2luY2UgZXBvY2giOworICAgICAg ICB9CisgICAgfTsKKyAgICAvLyBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzeXN0ZW1fY2xvY2s+ IHNwZWNpYWxpemF0aW9uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRHVyYXRpb24+CisgICAgc3Ry dWN0IFN0cmluZ01ha2VyPHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0 ZW1fY2xvY2ssIER1cmF0aW9uPj4geworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVy dChzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrLCBEdXJh dGlvbj4gY29uc3QmIHRpbWVfcG9pbnQpIHsKKyAgICAgICAgICAgIGF1dG8gY29udmVydGVkID0g c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KHRpbWVfcG9pbnQpOworCisjaWZk ZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHN0ZDo6dG0gdGltZUluZm8gPSB7fTsKKyAgICAgICAg ICAgIGdtdGltZV9zKCZ0aW1lSW5mbywgJmNvbnZlcnRlZCk7CisjZWxzZQorICAgICAgICAgICAg c3RkOjp0bSogdGltZUluZm8gPSBzdGQ6OmdtdGltZSgmY29udmVydGVkKTsKKyNlbmRpZgorCisg ICAgICAgICAgICBhdXRvIGNvbnN0IHRpbWVTdGFtcFNpemUgPSBzaXplb2YoIjIwMTctMDEtMTZU MTc6MDY6NDVaIik7CisgICAgICAgICAgICBjaGFyIHRpbWVTdGFtcFt0aW1lU3RhbXBTaXplXTsK KyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBmbXQgPSAiJVktJW0tJWRUJUg6JU06JVNa IjsKKworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFt cCwgdGltZVN0YW1wU2l6ZSwgZm10LCAmdGltZUluZm8pOworI2Vsc2UKKyAgICAgICAgICAgIHN0 ZDo6c3RyZnRpbWUodGltZVN0YW1wLCB0aW1lU3RhbXBTaXplLCBmbXQsIHRpbWVJbmZvKTsKKyNl bmRpZgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHRpbWVTdGFtcCk7CisgICAgICAg IH0KKyAgICB9OworfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19FTkFCTEVfQ0hST05PX1NUUklO R01BS0VSCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfRU5VTSggZW51bU5hbWUs IC4uLiApIFwKK25hbWVzcGFjZSBDYXRjaCB7IFwKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBTdHJp bmdNYWtlcjxlbnVtTmFtZT4geyBcCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0 KCBlbnVtTmFtZSB2YWx1ZSApIHsgXAorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGF1dG8mIGVu dW1JbmZvID0gOjpDYXRjaDo6Z2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkuZ2V0TXV0YWJsZUVudW1W YWx1ZXNSZWdpc3RyeSgpLnJlZ2lzdGVyRW51bSggI2VudW1OYW1lLCAjX19WQV9BUkdTX18sIHsg X19WQV9BUkdTX18gfSApOyBcCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjpz dHJpbmc+KGVudW1JbmZvLmxvb2t1cCggc3RhdGljX2Nhc3Q8aW50PiggdmFsdWUgKSApKTsgXAor ICAgICAgICB9IFwKKyAgICB9OyBcCit9CisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfRU5VTSgg ZW51bU5hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0VOVU0oIGVudW1OYW1lLCBf X1ZBX0FSR1NfXyApCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNl bmRpZgorCisvLyBlbmQgY2F0Y2hfdG9zdHJpbmcuaAorI2luY2x1ZGUgPGlvc2Z3ZD4KKworI2lm ZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNh YmxlOjQzODkpIC8vICc9PScgOiBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2gKKyNwcmFnbWEgd2Fy bmluZyhkaXNhYmxlOjQwMTgpIC8vIG1vcmUgInNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaCIKKyNw cmFnbWEgd2FybmluZyhkaXNhYmxlOjQzMTIpIC8vIENvbnZlcnRpbmcgaW50IHRvIFQqIHVzaW5n IHJlaW50ZXJwcmV0X2Nhc3QgKGlzc3VlIG9uIHg2NCBwbGF0Zm9ybSkKKyNwcmFnbWEgd2Fybmlu ZyhkaXNhYmxlOjQxODApIC8vIHF1YWxpZmllciBhcHBsaWVkIHRvIGZ1bmN0aW9uIHR5cGUgaGFz IG5vIG1lYW5pbmcKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ4MDApIC8vIEZvcmNpbmcgcmVz dWx0IHRvIHRydWUgb3IgZmFsc2UKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAg c3RydWN0IElUcmFuc2llbnRFeHByZXNzaW9uIHsKKyAgICAgICAgYXV0byBpc0JpbmFyeUV4cHJl c3Npb24oKSBjb25zdCAtPiBib29sIHsgcmV0dXJuIG1faXNCaW5hcnlFeHByZXNzaW9uOyB9Cisg ICAgICAgIGF1dG8gZ2V0UmVzdWx0KCkgY29uc3QgLT4gYm9vbCB7IHJldHVybiBtX3Jlc3VsdDsg fQorICAgICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtUmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oIHN0 ZDo6b3N0cmVhbSAmb3MgKSBjb25zdCA9IDA7CisKKyAgICAgICAgSVRyYW5zaWVudEV4cHJlc3Np b24oIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uLCBib29sIHJlc3VsdCApCisgICAgICAgIDogICBt X2lzQmluYXJ5RXhwcmVzc2lvbiggaXNCaW5hcnlFeHByZXNzaW9uICksCisgICAgICAgICAgICBt X3Jlc3VsdCggcmVzdWx0ICkKKyAgICAgICAge30KKworICAgICAgICAvLyBXZSBkb24ndCBhY3R1 YWxseSBuZWVkIGEgdmlydHVhbCBkZXN0cnVjdG9yLCBidXQgbWFueSBzdGF0aWMgYW5hbHlzZXJz CisgICAgICAgIC8vIGNvbXBsYWluIGlmIGl0J3Mgbm90IGhlcmUgOi0oCisgICAgICAgIHZpcnR1 YWwgfklUcmFuc2llbnRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgYm9vbCBtX2lzQmluYXJ5RXhw cmVzc2lvbjsKKyAgICAgICAgYm9vbCBtX3Jlc3VsdDsKKworICAgIH07CisKKyAgICB2b2lkIGZv cm1hdFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCBzdGQ6Om9zdHJlYW0gJm9zLCBzdGQ6OnN0cmlu ZyBjb25zdCYgbGhzLCBTdHJpbmdSZWYgb3AsIHN0ZDo6c3RyaW5nIGNvbnN0JiByaHMgKTsKKwor ICAgIHRlbXBsYXRlPHR5cGVuYW1lIExoc1QsIHR5cGVuYW1lIFJoc1Q+CisgICAgY2xhc3MgQmlu YXJ5RXhwciAgOiBwdWJsaWMgSVRyYW5zaWVudEV4cHJlc3Npb24geworICAgICAgICBMaHNUIG1f bGhzOworICAgICAgICBTdHJpbmdSZWYgbV9vcDsKKyAgICAgICAgUmhzVCBtX3JoczsKKworICAg ICAgICB2b2lkIHN0cmVhbVJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCBzdGQ6Om9zdHJlYW0gJm9z ICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgZm9ybWF0UmVjb25zdHJ1Y3RlZEV4cHJl c3Npb24KKyAgICAgICAgICAgICAgICAgICAgKCBvcywgQ2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5 KCBtX2xocyApLCBtX29wLCBDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoIG1fcmhzICkgKTsKKyAg ICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgICBCaW5hcnlFeHByKCBib29sIGNvbXBhcmlz b25SZXN1bHQsIExoc1QgbGhzLCBTdHJpbmdSZWYgb3AsIFJoc1QgcmhzICkKKyAgICAgICAgOiAg IElUcmFuc2llbnRFeHByZXNzaW9ueyB0cnVlLCBjb21wYXJpc29uUmVzdWx0IH0sCisgICAgICAg ICAgICBtX2xocyggbGhzICksCisgICAgICAgICAgICBtX29wKCBvcCApLAorICAgICAgICAgICAg bV9yaHMoIHJocyApCisgICAgICAgIHt9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4K KyAgICAgICAgYXV0byBvcGVyYXRvciAmJiAoIFQgKSBjb25zdCAtPiBCaW5hcnlFeHByPExoc1Qs IFJoc1QgY29uc3QmPiBjb25zdCB7CisgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KGFsd2F5c19m YWxzZTxUPjo6dmFsdWUsCisgICAgICAgICAgICAiY2hhaW5lZCBjb21wYXJpc29ucyBhcmUgbm90 IHN1cHBvcnRlZCBpbnNpZGUgYXNzZXJ0aW9ucywgIgorICAgICAgICAgICAgIndyYXAgdGhlIGV4 cHJlc3Npb24gaW5zaWRlIHBhcmVudGhlc2VzLCBvciBkZWNvbXBvc2UgaXQiKTsKKyAgICAgICAg fQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGF1dG8gb3BlcmF0b3Ig fHwgKCBUICkgY29uc3QgLT4gQmluYXJ5RXhwcjxMaHNULCBSaHNUIGNvbnN0Jj4gY29uc3Qgewor ICAgICAgICAgICAgc3RhdGljX2Fzc2VydChhbHdheXNfZmFsc2U8VD46OnZhbHVlLAorICAgICAg ICAgICAgImNoYWluZWQgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGFzc2Vy dGlvbnMsICIKKyAgICAgICAgICAgICJ3cmFwIHRoZSBleHByZXNzaW9uIGluc2lkZSBwYXJlbnRo ZXNlcywgb3IgZGVjb21wb3NlIGl0Iik7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0 eXBlbmFtZSBUPgorICAgICAgICBhdXRvIG9wZXJhdG9yID09ICggVCApIGNvbnN0IC0+IEJpbmFy eUV4cHI8TGhzVCwgUmhzVCBjb25zdCY+IGNvbnN0IHsKKyAgICAgICAgICAgIHN0YXRpY19hc3Nl cnQoYWx3YXlzX2ZhbHNlPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICJjaGFpbmVkIGNvbXBhcmlz b25zIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBhc3NlcnRpb25zLCAiCisgICAgICAgICAgICAi d3JhcCB0aGUgZXhwcmVzc2lvbiBpbnNpZGUgcGFyZW50aGVzZXMsIG9yIGRlY29tcG9zZSBpdCIp OworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgYXV0 byBvcGVyYXRvciAhPSAoIFQgKSBjb25zdCAtPiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3Qm PiBjb25zdCB7CisgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KGFsd2F5c19mYWxzZTxUPjo6dmFs dWUsCisgICAgICAgICAgICAiY2hhaW5lZCBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBp bnNpZGUgYXNzZXJ0aW9ucywgIgorICAgICAgICAgICAgIndyYXAgdGhlIGV4cHJlc3Npb24gaW5z aWRlIHBhcmVudGhlc2VzLCBvciBkZWNvbXBvc2UgaXQiKTsKKyAgICAgICAgfQorCisgICAgICAg IHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGF1dG8gb3BlcmF0b3IgPiAoIFQgKSBjb25z dCAtPiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7CisgICAgICAgICAgICBz dGF0aWNfYXNzZXJ0KGFsd2F5c19mYWxzZTxUPjo6dmFsdWUsCisgICAgICAgICAgICAiY2hhaW5l ZCBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBpbnNpZGUgYXNzZXJ0aW9ucywgIgorICAg ICAgICAgICAgIndyYXAgdGhlIGV4cHJlc3Npb24gaW5zaWRlIHBhcmVudGhlc2VzLCBvciBkZWNv bXBvc2UgaXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Cisg ICAgICAgIGF1dG8gb3BlcmF0b3IgPCAoIFQgKSBjb25zdCAtPiBCaW5hcnlFeHByPExoc1QsIFJo c1QgY29uc3QmPiBjb25zdCB7CisgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KGFsd2F5c19mYWxz ZTxUPjo6dmFsdWUsCisgICAgICAgICAgICAiY2hhaW5lZCBjb21wYXJpc29ucyBhcmUgbm90IHN1 cHBvcnRlZCBpbnNpZGUgYXNzZXJ0aW9ucywgIgorICAgICAgICAgICAgIndyYXAgdGhlIGV4cHJl c3Npb24gaW5zaWRlIHBhcmVudGhlc2VzLCBvciBkZWNvbXBvc2UgaXQiKTsKKyAgICAgICAgfQor CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGF1dG8gb3BlcmF0b3IgPj0g KCBUICkgY29uc3QgLT4gQmluYXJ5RXhwcjxMaHNULCBSaHNUIGNvbnN0Jj4gY29uc3QgeworICAg ICAgICAgICAgc3RhdGljX2Fzc2VydChhbHdheXNfZmFsc2U8VD46OnZhbHVlLAorICAgICAgICAg ICAgImNoYWluZWQgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGFzc2VydGlv bnMsICIKKyAgICAgICAgICAgICJ3cmFwIHRoZSBleHByZXNzaW9uIGluc2lkZSBwYXJlbnRoZXNl cywgb3IgZGVjb21wb3NlIGl0Iik7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZSBUPgorICAgICAgICBhdXRvIG9wZXJhdG9yIDw9ICggVCApIGNvbnN0IC0+IEJpbmFyeUV4 cHI8TGhzVCwgUmhzVCBjb25zdCY+IGNvbnN0IHsKKyAgICAgICAgICAgIHN0YXRpY19hc3NlcnQo YWx3YXlzX2ZhbHNlPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICJjaGFpbmVkIGNvbXBhcmlzb25z IGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBhc3NlcnRpb25zLCAiCisgICAgICAgICAgICAid3Jh cCB0aGUgZXhwcmVzc2lvbiBpbnNpZGUgcGFyZW50aGVzZXMsIG9yIGRlY29tcG9zZSBpdCIpOwor ICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExoc1Q+CisgICAgY2xh c3MgVW5hcnlFeHByIDogcHVibGljIElUcmFuc2llbnRFeHByZXNzaW9uIHsKKyAgICAgICAgTGhz VCBtX2xoczsKKworICAgICAgICB2b2lkIHN0cmVhbVJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCBz dGQ6Om9zdHJlYW0gJm9zICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgb3MgPDwgQ2F0 Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCBtX2xocyApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6 CisgICAgICAgIGV4cGxpY2l0IFVuYXJ5RXhwciggTGhzVCBsaHMgKQorICAgICAgICA6ICAgSVRy YW5zaWVudEV4cHJlc3Npb257IGZhbHNlLCBzdGF0aWNfY2FzdDxib29sPihsaHMpIH0sCisgICAg ICAgICAgICBtX2xocyggbGhzICkKKyAgICAgICAge30KKyAgICB9OworCisgICAgLy8gU3BlY2lh bGlzZWQgY29tcGFyaXNvbiBmdW5jdGlvbnMgdG8gaGFuZGxlIGVxdWFsaXR5IGNvbXBhcmlzb25z IGJldHdlZW4gaW50cyBhbmQgcG9pbnRlcnMgKE5VTEwgZGVkdWNlcyBhcyBhbiBpbnQpCisgICAg dGVtcGxhdGU8dHlwZW5hbWUgTGhzVCwgdHlwZW5hbWUgUmhzVD4KKyAgICBhdXRvIGNvbXBhcmVF cXVhbCggTGhzVCBjb25zdCYgbGhzLCBSaHNUIGNvbnN0JiByaHMgKSAtPiBib29sIHsgcmV0dXJu IHN0YXRpY19jYXN0PGJvb2w+KGxocyA9PSByaHMpOyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUg VD4KKyAgICBhdXRvIGNvbXBhcmVFcXVhbCggVCogY29uc3QmIGxocywgaW50IHJocyApIC0+IGJv b2wgeyByZXR1cm4gbGhzID09IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCBjb25zdCo+KCByaHMgKTsg fQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYXV0byBjb21wYXJlRXF1YWwoIFQqIGNv bnN0JiBsaHMsIGxvbmcgcmhzICkgLT4gYm9vbCB7IHJldHVybiBsaHMgPT0gcmVpbnRlcnByZXRf Y2FzdDx2b2lkIGNvbnN0Kj4oIHJocyApOyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAg ICBhdXRvIGNvbXBhcmVFcXVhbCggaW50IGxocywgVCogY29uc3QmIHJocyApIC0+IGJvb2wgeyBy ZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkIGNvbnN0Kj4oIGxocyApID09IHJoczsgfQorICAg IHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYXV0byBjb21wYXJlRXF1YWwoIGxvbmcgbGhzLCBU KiBjb25zdCYgcmhzICkgLT4gYm9vbCB7IHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgY29u c3QqPiggbGhzICkgPT0gcmhzOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNULCB0eXBl bmFtZSBSaHNUPgorICAgIGF1dG8gY29tcGFyZU5vdEVxdWFsKCBMaHNUIGNvbnN0JiBsaHMsIFJo c1QmJiByaHMgKSAtPiBib29sIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KGxocyAhPSByaHMp OyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBhdXRvIGNvbXBhcmVOb3RFcXVhbCgg VCogY29uc3QmIGxocywgaW50IHJocyApIC0+IGJvb2wgeyByZXR1cm4gbGhzICE9IHJlaW50ZXJw cmV0X2Nhc3Q8dm9pZCBjb25zdCo+KCByaHMgKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+ CisgICAgYXV0byBjb21wYXJlTm90RXF1YWwoIFQqIGNvbnN0JiBsaHMsIGxvbmcgcmhzICkgLT4g Ym9vbCB7IHJldHVybiBsaHMgIT0gcmVpbnRlcnByZXRfY2FzdDx2b2lkIGNvbnN0Kj4oIHJocyAp OyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBhdXRvIGNvbXBhcmVOb3RFcXVhbCgg aW50IGxocywgVCogY29uc3QmIHJocyApIC0+IGJvb2wgeyByZXR1cm4gcmVpbnRlcnByZXRfY2Fz dDx2b2lkIGNvbnN0Kj4oIGxocyApICE9IHJoczsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+ CisgICAgYXV0byBjb21wYXJlTm90RXF1YWwoIGxvbmcgbGhzLCBUKiBjb25zdCYgcmhzICkgLT4g Ym9vbCB7IHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgY29uc3QqPiggbGhzICkgIT0gcmhz OyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNUPgorICAgIGNsYXNzIEV4cHJMaHMgewor ICAgICAgICBMaHNUIG1fbGhzOworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgRXhwckxo cyggTGhzVCBsaHMgKSA6IG1fbGhzKCBsaHMgKSB7fQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVu YW1lIFJoc1Q+CisgICAgICAgIGF1dG8gb3BlcmF0b3IgPT0gKCBSaHNUIGNvbnN0JiByaHMgKSAt PiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7CisgICAgICAgICAgICByZXR1 cm4geyBjb21wYXJlRXF1YWwoIG1fbGhzLCByaHMgKSwgbV9saHMsICI9PSIsIHJocyB9OworICAg ICAgICB9CisgICAgICAgIGF1dG8gb3BlcmF0b3IgPT0gKCBib29sIHJocyApIC0+IEJpbmFyeUV4 cHI8TGhzVCwgYm9vbD4gY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHsgbV9saHMgPT0gcmhz LCBtX2xocywgIj09IiwgcmhzIH07CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZSBSaHNUPgorICAgICAgICBhdXRvIG9wZXJhdG9yICE9ICggUmhzVCBjb25zdCYgcmhzICkg LT4gQmluYXJ5RXhwcjxMaHNULCBSaHNUIGNvbnN0Jj4gY29uc3QgeworICAgICAgICAgICAgcmV0 dXJuIHsgY29tcGFyZU5vdEVxdWFsKCBtX2xocywgcmhzICksIG1fbGhzLCAiIT0iLCByaHMgfTsK KyAgICAgICAgfQorICAgICAgICBhdXRvIG9wZXJhdG9yICE9ICggYm9vbCByaHMgKSAtPiBCaW5h cnlFeHByPExoc1QsIGJvb2w+IGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiB7IG1fbGhzICE9 IHJocywgbV9saHMsICIhPSIsIHJocyB9OworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8 dHlwZW5hbWUgUmhzVD4KKyAgICAgICAgYXV0byBvcGVyYXRvciA+ICggUmhzVCBjb25zdCYgcmhz ICkgLT4gQmluYXJ5RXhwcjxMaHNULCBSaHNUIGNvbnN0Jj4gY29uc3QgeworICAgICAgICAgICAg cmV0dXJuIHsgc3RhdGljX2Nhc3Q8Ym9vbD4obV9saHMgPiByaHMpLCBtX2xocywgIj4iLCByaHMg fTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgICAgICBh dXRvIG9wZXJhdG9yIDwgKCBSaHNUIGNvbnN0JiByaHMgKSAtPiBCaW5hcnlFeHByPExoc1QsIFJo c1QgY29uc3QmPiBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4geyBzdGF0aWNfY2FzdDxib29s PihtX2xocyA8IHJocyksIG1fbGhzLCAiPCIsIHJocyB9OworICAgICAgICB9CisgICAgICAgIHRl bXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgICAgIGF1dG8gb3BlcmF0b3IgPj0gKCBSaHNUIGNv bnN0JiByaHMgKSAtPiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7CisgICAg ICAgICAgICByZXR1cm4geyBzdGF0aWNfY2FzdDxib29sPihtX2xocyA+PSByaHMpLCBtX2xocywg Ij49IiwgcmhzIH07CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4K KyAgICAgICAgYXV0byBvcGVyYXRvciA8PSAoIFJoc1QgY29uc3QmIHJocyApIC0+IEJpbmFyeUV4 cHI8TGhzVCwgUmhzVCBjb25zdCY+IGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiB7IHN0YXRp Y19jYXN0PGJvb2w+KG1fbGhzIDw9IHJocyksIG1fbGhzLCAiPD0iLCByaHMgfTsKKyAgICAgICAg fQorICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzVD4KKyAgICAgICAgYXV0byBvcGVyYXRv ciB8IChSaHNUIGNvbnN0JiByaHMpIC0+IEJpbmFyeUV4cHI8TGhzVCwgUmhzVCBjb25zdCY+IGNv bnN0IHsKKyAgICAgICAgICAgIHJldHVybiB7IHN0YXRpY19jYXN0PGJvb2w+KG1fbGhzIHwgcmhz KSwgbV9saHMsICJ8IiwgcmhzIH07CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGUgPHR5cGVu YW1lIFJoc1Q+CisgICAgICAgIGF1dG8gb3BlcmF0b3IgJiAoUmhzVCBjb25zdCYgcmhzKSAtPiBC aW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4g eyBzdGF0aWNfY2FzdDxib29sPihtX2xocyAmIHJocyksIG1fbGhzLCAiJiIsIHJocyB9OworICAg ICAgICB9CisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSaHNUPgorICAgICAgICBhdXRvIG9w ZXJhdG9yIF4gKFJoc1QgY29uc3QmIHJocykgLT4gQmluYXJ5RXhwcjxMaHNULCBSaHNUIGNvbnN0 Jj4gY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGljX2Nhc3Q8Ym9vbD4obV9saHMg XiByaHMpLCBtX2xocywgIl4iLCByaHMgfTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRl PHR5cGVuYW1lIFJoc1Q+CisgICAgICAgIGF1dG8gb3BlcmF0b3IgJiYgKCBSaHNUIGNvbnN0JiAp IC0+IEJpbmFyeUV4cHI8TGhzVCwgUmhzVCBjb25zdCY+IGNvbnN0IHsKKyAgICAgICAgICAgIHN0 YXRpY19hc3NlcnQoYWx3YXlzX2ZhbHNlPFJoc1Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICJvcGVy YXRvciYmIGlzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGFzc2VydGlvbnMsICIKKyAgICAgICAgICAg ICJ3cmFwIHRoZSBleHByZXNzaW9uIGluc2lkZSBwYXJlbnRoZXNlcywgb3IgZGVjb21wb3NlIGl0 Iik7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgICAg ICBhdXRvIG9wZXJhdG9yIHx8ICggUmhzVCBjb25zdCYgKSAtPiBCaW5hcnlFeHByPExoc1QsIFJo c1QgY29uc3QmPiBjb25zdCB7CisgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KGFsd2F5c19mYWxz ZTxSaHNUPjo6dmFsdWUsCisgICAgICAgICAgICAib3BlcmF0b3J8fCBpcyBub3Qgc3VwcG9ydGVk IGluc2lkZSBhc3NlcnRpb25zLCAiCisgICAgICAgICAgICAid3JhcCB0aGUgZXhwcmVzc2lvbiBp bnNpZGUgcGFyZW50aGVzZXMsIG9yIGRlY29tcG9zZSBpdCIpOworICAgICAgICB9CisKKyAgICAg ICAgYXV0byBtYWtlVW5hcnlFeHByKCkgY29uc3QgLT4gVW5hcnlFeHByPExoc1Q+IHsKKyAgICAg ICAgICAgIHJldHVybiBVbmFyeUV4cHI8TGhzVD57IG1fbGhzIH07CisgICAgICAgIH0KKyAgICB9 OworCisgICAgdm9pZCBoYW5kbGVFeHByZXNzaW9uKCBJVHJhbnNpZW50RXhwcmVzc2lvbiBjb25z dCYgZXhwciApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGhhbmRsZUV4 cHJlc3Npb24oIEV4cHJMaHM8VD4gY29uc3QmIGV4cHIgKSB7CisgICAgICAgIGhhbmRsZUV4cHJl c3Npb24oIGV4cHIubWFrZVVuYXJ5RXhwcigpICk7CisgICAgfQorCisgICAgc3RydWN0IERlY29t cG9zZXIgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBhdXRvIG9wZXJh dG9yIDw9ICggVCBjb25zdCYgbGhzICkgLT4gRXhwckxoczxUIGNvbnN0Jj4geworICAgICAgICAg ICAgcmV0dXJuIEV4cHJMaHM8VCBjb25zdCY+eyBsaHMgfTsKKyAgICAgICAgfQorCisgICAgICAg IGF1dG8gb3BlcmF0b3IgPD0oIGJvb2wgdmFsdWUgKSAtPiBFeHByTGhzPGJvb2w+IHsKKyAgICAg ICAgICAgIHJldHVybiBFeHByTGhzPGJvb2w+eyB2YWx1ZSB9OworICAgICAgICB9CisgICAgfTsK KworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3 YXJuaW5nKHBvcCkKKyNlbmRpZgorCisvLyBlbmQgY2F0Y2hfZGVjb21wb3Nlci5oCisvLyBzdGFy dCBjYXRjaF9pbnRlcmZhY2VzX2NhcHR1cmUuaAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1 ZGUgPGNocm9ubz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIEFzc2VydGlvblJl c3VsdDsKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbzsKKyAgICBzdHJ1Y3QgU2VjdGlvbkluZm87 CisgICAgc3RydWN0IFNlY3Rpb25FbmRJbmZvOworICAgIHN0cnVjdCBNZXNzYWdlSW5mbzsKKyAg ICBzdHJ1Y3QgTWVzc2FnZUJ1aWxkZXI7CisgICAgc3RydWN0IENvdW50czsKKyAgICBzdHJ1Y3Qg QXNzZXJ0aW9uUmVhY3Rpb247CisgICAgc3RydWN0IFNvdXJjZUxpbmVJbmZvOworCisgICAgc3Ry dWN0IElUcmFuc2llbnRFeHByZXNzaW9uOworICAgIHN0cnVjdCBJR2VuZXJhdG9yVHJhY2tlcjsK KworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcpCisgICAgc3Ry dWN0IEJlbmNobWFya0luZm87CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIER1cmF0aW9uID0gc3Rk OjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjpuYW5vPj4KKyAgICBzdHJ1Y3QgQmVuY2ht YXJrU3RhdHM7CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcKKwor ICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZSB7CisKKyAgICAgICAgdmlydHVhbCB+SVJlc3VsdENh cHR1cmUoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgc2VjdGlvblN0YXJ0ZWQoICAgIFNlY3Rp b25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBDb3VudHMmIGFzc2VydGlvbnMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9p ZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgPSAwOworICAg ICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkRWFybHkoIFNlY3Rpb25FbmRJbmZvIGNvbnN0 JiBlbmRJbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgYXV0byBhY3F1aXJlR2VuZXJhdG9y VHJhY2tlciggU3RyaW5nUmVmIGdlbmVyYXRvck5hbWUsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBs aW5lSW5mbyApIC0+IElHZW5lcmF0b3JUcmFja2VyJiA9IDA7CisKKyNpZiBkZWZpbmVkKENBVENI X0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HKQorICAgICAgICB2aXJ0dWFsIHZvaWQgYmVuY2ht YXJrUHJlcGFyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApID0gMDsKKyAgICAgICAgdmly dHVhbCB2b2lkIGJlbmNobWFya1N0YXJ0aW5nKCBCZW5jaG1hcmtJbmZvIGNvbnN0JiBpbmZvICkg PSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgYmVuY2htYXJrRW5kZWQoIEJlbmNobWFya1N0YXRz PD4gY29uc3QmIHN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgYmVuY2htYXJrRmFp bGVkKCBzdGQ6OnN0cmluZyBjb25zdCYgZXJyb3IgKSA9IDA7CisjZW5kaWYgLy8gQ0FUQ0hfQ09O RklHX0VOQUJMRV9CRU5DSE1BUktJTkcKKworICAgICAgICB2aXJ0dWFsIHZvaWQgcHVzaFNjb3Bl ZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgPSAwOworICAgICAgICB2aXJ0 dWFsIHZvaWQgcG9wU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSA9 IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGVtcGxhY2VVbnNjb3BlZE1lc3NhZ2UoIE1lc3Nh Z2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBo YW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBTdHJpbmdSZWYgbWVzc2FnZSApID0gMDsKKworICAg ICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXhwcgorICAgICAgICAgICAgICAgICggICBBc3NlcnRp b25JbmZvIGNvbnN0JiBpbmZvLAorICAgICAgICAgICAgICAgICAgICBJVHJhbnNpZW50RXhwcmVz c2lvbiBjb25zdCYgZXhwciwKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVhY3Rpb24m IHJlYWN0aW9uICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlTWVzc2FnZQorICAg ICAgICAgICAgICAgICggICBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLAorICAgICAgICAgICAg ICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAg ICBTdHJpbmdSZWYgY29uc3QmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIEFzc2VydGlv blJlYWN0aW9uJiByZWFjdGlvbiApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZVVu ZXhwZWN0ZWRFeGNlcHRpb25Ob3RUaHJvd24KKyAgICAgICAgICAgICAgICAoICAgQXNzZXJ0aW9u SW5mbyBjb25zdCYgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVhY3Rpb24m IHJlYWN0aW9uICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlVW5leHBlY3RlZElu ZmxpZ2h0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCAgIEFzc2VydGlvbkluZm8gY29uc3Qm IGluZm8sCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlLAor ICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25SZWFjdGlvbiYgcmVhY3Rpb24gKSA9IDA7Cisg ICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVJbmNvbXBsZXRlCisgICAgICAgICAgICAgICAgKCAg IEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBo YW5kbGVOb25FeHByCisgICAgICAgICAgICAgICAgKCAgIEFzc2VydGlvbkluZm8gY29uc3QgJmlu Zm8sCisgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUsCisg ICAgICAgICAgICAgICAgICAgIEFzc2VydGlvblJlYWN0aW9uICZyZWFjdGlvbiApID0gMDsKKwor ICAgICAgICB2aXJ0dWFsIGJvb2wgbGFzdEFzc2VydGlvblBhc3NlZCgpID0gMDsKKyAgICAgICAg dmlydHVhbCB2b2lkIGFzc2VydGlvblBhc3NlZCgpID0gMDsKKworICAgICAgICAvLyBEZXByZWNh dGVkLCBkbyBub3QgdXNlOgorICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRU ZXN0TmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBjb25zdCBBc3NlcnRpb25SZXN1 bHQqIGdldExhc3RSZXN1bHQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBleGNl cHRpb25FYXJseVJlcG9ydGVkKCkgPSAwOworICAgIH07CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYg Z2V0UmVzdWx0Q2FwdHVyZSgpOworfQorCisvLyBlbmQgY2F0Y2hfaW50ZXJmYWNlc19jYXB0dXJl LmgKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgVGVzdEZhaWx1cmVFeGNlcHRpb257 fTsKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uUmVzdWx0RGF0YTsKKyAgICBzdHJ1Y3QgSVJlc3VsdENh cHR1cmU7CisgICAgY2xhc3MgUnVuQ29udGV4dDsKKworICAgIGNsYXNzIExhenlFeHByZXNzaW9u IHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIEFzc2VydGlvbkhhbmRsZXI7CisgICAgICAgIGZyaWVu ZCBzdHJ1Y3QgQXNzZXJ0aW9uU3RhdHM7CisgICAgICAgIGZyaWVuZCBjbGFzcyBSdW5Db250ZXh0 OworCisgICAgICAgIElUcmFuc2llbnRFeHByZXNzaW9uIGNvbnN0KiBtX3RyYW5zaWVudEV4cHJl c3Npb24gPSBudWxscHRyOworICAgICAgICBib29sIG1faXNOZWdhdGVkOworICAgIHB1YmxpYzoK KyAgICAgICAgTGF6eUV4cHJlc3Npb24oIGJvb2wgaXNOZWdhdGVkICk7CisgICAgICAgIExhenlF eHByZXNzaW9uKCBMYXp5RXhwcmVzc2lvbiBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgTGF6eUV4 cHJlc3Npb24mIG9wZXJhdG9yID0gKCBMYXp5RXhwcmVzc2lvbiBjb25zdCYgKSA9IGRlbGV0ZTsK KworICAgICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Q7CisKKyAgICAgICAgZnJp ZW5kIGF1dG8gb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBMYXp5RXhwcmVzc2lvbiBj b25zdCYgbGF6eUV4cHIgKSAtPiBzdGQ6Om9zdHJlYW0mOworICAgIH07CisKKyAgICBzdHJ1Y3Qg QXNzZXJ0aW9uUmVhY3Rpb24geworICAgICAgICBib29sIHNob3VsZERlYnVnQnJlYWsgPSBmYWxz ZTsKKyAgICAgICAgYm9vbCBzaG91bGRUaHJvdyA9IGZhbHNlOworICAgIH07CisKKyAgICBjbGFz cyBBc3NlcnRpb25IYW5kbGVyIHsKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2Fzc2VydGlvbklu Zm87CisgICAgICAgIEFzc2VydGlvblJlYWN0aW9uIG1fcmVhY3Rpb247CisgICAgICAgIGJvb2wg bV9jb21wbGV0ZWQgPSBmYWxzZTsKKyAgICAgICAgSVJlc3VsdENhcHR1cmUmIG1fcmVzdWx0Q2Fw dHVyZTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgQXNzZXJ0aW9uSGFuZGxlcgorICAgICAgICAg ICAgKCAgIFN0cmluZ1JlZiBjb25zdCYgbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgIFNvdXJj ZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgICAgICBTdHJpbmdSZWYgY2Fw dHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFn cyByZXN1bHREaXNwb3NpdGlvbiApOworICAgICAgICB+QXNzZXJ0aW9uSGFuZGxlcigpIHsKKyAg ICAgICAgICAgIGlmICggIW1fY29tcGxldGVkICkgeworICAgICAgICAgICAgICAgIG1fcmVzdWx0 Q2FwdHVyZS5oYW5kbGVJbmNvbXBsZXRlKCBtX2Fzc2VydGlvbkluZm8gKTsKKyAgICAgICAgICAg IH0KKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZv aWQgaGFuZGxlRXhwciggRXhwckxoczxUPiBjb25zdCYgZXhwciApIHsKKyAgICAgICAgICAgIGhh bmRsZUV4cHIoIGV4cHIubWFrZVVuYXJ5RXhwcigpICk7CisgICAgICAgIH0KKyAgICAgICAgdm9p ZCBoYW5kbGVFeHByKCBJVHJhbnNpZW50RXhwcmVzc2lvbiBjb25zdCYgZXhwciApOworCisgICAg ICAgIHZvaWQgaGFuZGxlTWVzc2FnZShSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlLCBTdHJp bmdSZWYgY29uc3QmIG1lc3NhZ2UpOworCisgICAgICAgIHZvaWQgaGFuZGxlRXhjZXB0aW9uVGhy b3duQXNFeHBlY3RlZCgpOworICAgICAgICB2b2lkIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb25O b3RUaHJvd24oKTsKKyAgICAgICAgdm9pZCBoYW5kbGVFeGNlcHRpb25Ob3RUaHJvd25Bc0V4cGVj dGVkKCk7CisgICAgICAgIHZvaWQgaGFuZGxlVGhyb3dpbmdDYWxsU2tpcHBlZCgpOworICAgICAg ICB2b2lkIGhhbmRsZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2VwdGlvbigpOworCisgICAgICAgIHZv aWQgY29tcGxldGUoKTsKKyAgICAgICAgdm9pZCBzZXRDb21wbGV0ZWQoKTsKKworICAgICAgICAv LyBxdWVyeQorICAgICAgICBhdXRvIGFsbG93VGhyb3dzKCkgY29uc3QgLT4gYm9vbDsKKyAgICB9 OworCisgICAgdm9pZCBoYW5kbGVFeGNlcHRpb25NYXRjaEV4cHIoIEFzc2VydGlvbkhhbmRsZXIm IGhhbmRsZXIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIFN0cmluZ1JlZiBjb25zdCYgbWF0Y2hl clN0cmluZyApOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfYXNzZXJ0 aW9uaGFuZGxlci5oCisvLyBzdGFydCBjYXRjaF9tZXNzYWdlLmgKKworI2luY2x1ZGUgPHN0cmlu Zz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3Qg TWVzc2FnZUluZm8geworICAgICAgICBNZXNzYWdlSW5mbyggICAgU3RyaW5nUmVmIGNvbnN0JiBf bWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3Qm IF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIF90 eXBlICk7CisKKyAgICAgICAgU3RyaW5nUmVmIG1hY3JvTmFtZTsKKyAgICAgICAgc3RkOjpzdHJp bmcgbWVzc2FnZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIFJl c3VsdFdhczo6T2ZUeXBlIHR5cGU7CisgICAgICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwor ICAgICAgICBib29sIG9wZXJhdG9yID09ICggTWVzc2FnZUluZm8gY29uc3QmIG90aGVyICkgY29u c3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIE1lc3NhZ2VJbmZvIGNvbnN0JiBvdGhlciAp IGNvbnN0OworICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmFs Q291bnQ7CisgICAgfTsKKworICAgIHN0cnVjdCBNZXNzYWdlU3RyZWFtIHsKKworICAgICAgICB0 ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBNZXNzYWdlU3RyZWFtJiBvcGVyYXRvciA8PCAo IFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICAgICAgbV9zdHJlYW0gPDwgdmFsdWU7CisgICAg ICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBSZXVzYWJsZVN0cmlu Z1N0cmVhbSBtX3N0cmVhbTsKKyAgICB9OworCisgICAgc3RydWN0IE1lc3NhZ2VCdWlsZGVyIDog TWVzc2FnZVN0cmVhbSB7CisgICAgICAgIE1lc3NhZ2VCdWlsZGVyKCBTdHJpbmdSZWYgY29uc3Qm IG1hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0 JiBsaW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHR5 cGUgKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBNZXNzYWdlQnVp bGRlciYgb3BlcmF0b3IgPDwgKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgICAgIG1fc3Ry ZWFtIDw8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAg ICAgICAgTWVzc2FnZUluZm8gbV9pbmZvOworICAgIH07CisKKyAgICBjbGFzcyBTY29wZWRNZXNz YWdlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFNjb3BlZE1lc3NhZ2UoIE1lc3Nh Z2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICk7CisgICAgICAgIFNjb3BlZE1lc3NhZ2UoIFNjb3Bl ZE1lc3NhZ2UmIGR1cGxpY2F0ZSApID0gZGVsZXRlOworICAgICAgICBTY29wZWRNZXNzYWdlKCBT Y29wZWRNZXNzYWdlJiYgb2xkICk7CisgICAgICAgIH5TY29wZWRNZXNzYWdlKCk7CisKKyAgICAg ICAgTWVzc2FnZUluZm8gbV9pbmZvOworICAgICAgICBib29sIG1fbW92ZWQ7CisgICAgfTsKKwor ICAgIGNsYXNzIENhcHR1cmVyIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1f bWVzc2FnZXM7CisgICAgICAgIElSZXN1bHRDYXB0dXJlJiBtX3Jlc3VsdENhcHR1cmUgPSBnZXRS ZXN1bHRDYXB0dXJlKCk7CisgICAgICAgIHNpemVfdCBtX2NhcHR1cmVkID0gMDsKKyAgICBwdWJs aWM6CisgICAgICAgIENhcHR1cmVyKCBTdHJpbmdSZWYgbWFjcm9OYW1lLCBTb3VyY2VMaW5lSW5m byBjb25zdCYgbGluZUluZm8sIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUsIFN0cmluZ1Jl ZiBuYW1lcyApOworICAgICAgICB+Q2FwdHVyZXIoKTsKKworICAgICAgICB2b2lkIGNhcHR1cmVW YWx1ZSggc2l6ZV90IGluZGV4LCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKTsKKworICAgICAg ICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGNhcHR1cmVWYWx1ZXMoIHNpemVf dCBpbmRleCwgVCBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgICAgICBjYXB0dXJlVmFsdWUoIGlu ZGV4LCBDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoIHZhbHVlICkgKTsKKyAgICAgICAgfQorCisg ICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRzPgorICAgICAgICB2b2lk IGNhcHR1cmVWYWx1ZXMoIHNpemVfdCBpbmRleCwgVCBjb25zdCYgdmFsdWUsIFRzIGNvbnN0Ji4u LiB2YWx1ZXMgKSB7CisgICAgICAgICAgICBjYXB0dXJlVmFsdWUoIGluZGV4LCBDYXRjaDo6RGV0 YWlsOjpzdHJpbmdpZnkodmFsdWUpICk7CisgICAgICAgICAgICBjYXB0dXJlVmFsdWVzKCBpbmRl eCsxLCB2YWx1ZXMuLi4gKTsKKyAgICAgICAgfQorICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFj ZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfbWVzc2FnZS5oCisjaWYgIWRlZmluZWQoQ0FUQ0hfQ09O RklHX0RJU0FCTEUpCisKKyNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9TVFJJTkdJ RklDQVRJT04pCisgICNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1RSSU5HSUZZKC4uLikgI19fVkFf QVJHU19fCisjZWxzZQorICAjZGVmaW5lIENBVENIX0lOVEVSTkFMX1NUUklOR0lGWSguLi4pICJE aXNhYmxlZCBieSBDQVRDSF9DT05GSUdfRElTQUJMRV9TVFJJTkdJRklDQVRJT04iCisjZW5kaWYK KworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkgfHwgZGVmaW5lZChDQVRD SF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisv LyBBbm90aGVyIHdheSB0byBzcGVlZC11cCBjb21waWxhdGlvbiBpcyB0byBvbWl0IGxvY2FsIHRy eS1jYXRjaCBmb3IgUkVRVUlSRSoKKy8vIG1hY3Jvcy4KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hf VFJZCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0NBVENIKCBjYXB0dXJlciApCisKKyNlbHNlIC8v IENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUlkg dHJ5CisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0NBVENIKCBoYW5kbGVyICkgY2F0Y2goLi4uKSB7 IGhhbmRsZXIuaGFuZGxlVW5leHBlY3RlZEluZmxpZ2h0RXhjZXB0aW9uKCk7IH0KKworI2VuZGlm CisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIGhhbmRsZXIgKSBoYW5kbGVyLmNvbXBs ZXRlKCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hf VEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgLi4uICkgXAorICAgIGRvIHsgXAor ICAgICAgICBDQVRDSF9JTlRFUk5BTF9JR05PUkVfQlVUX1dBUk4oX19WQV9BUkdTX18pOyBcCisg ICAgICAgIENhdGNoOjpBc3NlcnRpb25IYW5kbGVyIGNhdGNoQXNzZXJ0aW9uSGFuZGxlciggbWFj cm9OYW1lIyNfY2F0Y2hfc3IsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDQVRDSF9JTlRFUk5B TF9TVFJJTkdJRlkoX19WQV9BUkdTX18pLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAg IElOVEVSTkFMX0NBVENIX1RSWSB7IFwKKyAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1NUQVJU X1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKKyAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBS RVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFu ZGxlci5oYW5kbGVFeHByKCBDYXRjaDo6RGVjb21wb3NlcigpIDw9IF9fVkFfQVJHU19fICk7IFwK KyAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJFU1NJT04gXAor ICAgICAgICB9IElOVEVSTkFMX0NBVENIX0NBVENIKCBjYXRjaEFzc2VydGlvbkhhbmRsZXIgKSBc CisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBjYXRjaEFzc2VydGlvbkhhbmRsZXIgKSBc CisgICAgfSB3aGlsZSggKHZvaWQpMCwgKGZhbHNlKSAmJiBzdGF0aWNfY2FzdDxib29sPiggISEo X19WQV9BUkdTX18pICkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVS TkFMX0NBVENIX0lGKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCAuLi4gKSBcCisgICAg SU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgX19WQV9B UkdTX18gKTsgXAorICAgIGlmKCBDYXRjaDo6Z2V0UmVzdWx0Q2FwdHVyZSgpLmxhc3RBc3NlcnRp b25QYXNzZWQoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxf Q0FUQ0hfRUxTRSggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgLi4uICkgXAorICAgIElO VEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIF9fVkFfQVJH U19fICk7IFwKKyAgICBpZiggIUNhdGNoOjpnZXRSZXN1bHRDYXB0dXJlKCkubGFzdEFzc2VydGlv blBhc3NlZCgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9D QVRDSF9OT19USFJPVyggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgLi4uICkgXAorICAg IGRvIHsgXAorICAgICAgICBDYXRjaDo6QXNzZXJ0aW9uSGFuZGxlciBjYXRjaEFzc2VydGlvbkhh bmRsZXIoIG1hY3JvTmFtZSMjX2NhdGNoX3NyLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ0FU Q0hfSU5URVJOQUxfU1RSSU5HSUZZKF9fVkFfQVJHU19fKSwgcmVzdWx0RGlzcG9zaXRpb24gKTsg XAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihfX1ZBX0FS R1NfXyk7IFwKKyAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRp b25Ob3RUaHJvd25Bc0V4cGVjdGVkKCk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGNhdGNoKCAu Li4gKSB7IFwKKyAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVVbmV4cGVj dGVkSW5mbGlnaHRFeGNlcHRpb24oKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxf Q0FUQ0hfUkVBQ1QoIGNhdGNoQXNzZXJ0aW9uSGFuZGxlciApIFwKKyAgICB9IHdoaWxlKCBmYWxz ZSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEhS T1dTKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCAuLi4gKSBcCisgICAgZG8geyBcCisg ICAgICAgIENhdGNoOjpBc3NlcnRpb25IYW5kbGVyIGNhdGNoQXNzZXJ0aW9uSGFuZGxlciggbWFj cm9OYW1lIyNfY2F0Y2hfc3IsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDQVRDSF9JTlRFUk5B TF9TVFJJTkdJRlkoX19WQV9BUkdTX18pLCByZXN1bHREaXNwb3NpdGlvbik7IFwKKyAgICAgICAg aWYoIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5hbGxvd1Rocm93cygpICkgXAorICAgICAgICAgICAg dHJ5IHsgXAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KF9fVkFfQVJHU19fKTsg XAorICAgICAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVVbmV4cGVjdGVk RXhjZXB0aW9uTm90VGhyb3duKCk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0 Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5k bGVFeGNlcHRpb25UaHJvd25Bc0V4cGVjdGVkKCk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAg ICBlbHNlIFwKKyAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVUaHJvd2lu Z0NhbGxTa2lwcGVkKCk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIGNhdGNoQXNz ZXJ0aW9uSGFuZGxlciApIFwKKyAgICB9IHdoaWxlKCBmYWxzZSApCisKKy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCBtYWNyb05hbWUsIGV4 Y2VwdGlvblR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAg ICAgICBDYXRjaDo6QXNzZXJ0aW9uSGFuZGxlciBjYXRjaEFzc2VydGlvbkhhbmRsZXIoIG1hY3Jv TmFtZSMjX2NhdGNoX3NyLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ0FUQ0hfSU5URVJOQUxf U1RSSU5HSUZZKGV4cHIpICIsICIgQ0FUQ0hfSU5URVJOQUxfU1RSSU5HSUZZKGV4Y2VwdGlvblR5 cGUpLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIGlmKCBjYXRjaEFzc2VydGlvbkhh bmRsZXIuYWxsb3dUaHJvd3MoKSApIFwKKyAgICAgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAg ICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgICAgIGNhdGNoQXNz ZXJ0aW9uSGFuZGxlci5oYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uTm90VGhyb3duKCk7IFwKKyAg ICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0Y2goIGV4Y2VwdGlvblR5cGUgY29uc3QmICkg eyBcCisgICAgICAgICAgICAgICAgY2F0Y2hBc3NlcnRpb25IYW5kbGVyLmhhbmRsZUV4Y2VwdGlv blRocm93bkFzRXhwZWN0ZWQoKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRj aCggLi4uICkgeyBcCisgICAgICAgICAgICAgICAgY2F0Y2hBc3NlcnRpb25IYW5kbGVyLmhhbmRs ZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2VwdGlvbigpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAg ICAgZWxzZSBcCisgICAgICAgICAgICBjYXRjaEFzc2VydGlvbkhhbmRsZXIuaGFuZGxlVGhyb3dp bmdDYWxsU2tpcHBlZCgpOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBjYXRjaEFz c2VydGlvbkhhbmRsZXIgKSBcCisgICAgfSB3aGlsZSggZmFsc2UgKQorCisvLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX01TRyggbWFjcm9OYW1lLCBtZXNzYWdl VHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIC4uLiApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0 Y2g6OkFzc2VydGlvbkhhbmRsZXIgY2F0Y2hBc3NlcnRpb25IYW5kbGVyKCBtYWNyb05hbWUjI19j YXRjaF9zciwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpTdHJpbmdSZWYoKSwgcmVz dWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBjYXRjaEFzc2VydGlvbkhhbmRsZXIuaGFuZGxl TWVzc2FnZSggbWVzc2FnZVR5cGUsICggQ2F0Y2g6Ok1lc3NhZ2VTdHJlYW0oKSA8PCBfX1ZBX0FS R1NfXyArIDo6Q2F0Y2g6OlN0cmVhbUVuZFN0b3AoKSApLm1fc3RyZWFtLnN0cigpICk7IFwKKyAg ICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIGNhdGNoQXNzZXJ0aW9uSGFuZGxlciApIFwKKyAg ICB9IHdoaWxlKCBmYWxzZSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5U RVJOQUxfQ0FUQ0hfQ0FQVFVSRSggdmFyTmFtZSwgbWFjcm9OYW1lLCAuLi4gKSBcCisgICAgYXV0 byB2YXJOYW1lID0gQ2F0Y2g6OkNhcHR1cmVyKCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJ TkVJTkZPLCBDYXRjaDo6UmVzdWx0V2FzOjpJbmZvLCAjX19WQV9BUkdTX18gKTsgXAorICAgIHZh ck5hbWUuY2FwdHVyZVZhbHVlcyggMCwgX19WQV9BUkdTX18gKQorCisvLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0lORk8oIG1hY3JvTmFtZSwgbG9nICkgXAor ICAgIENhdGNoOjpTY29wZWRNZXNzYWdlIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBzY29w ZWRNZXNzYWdlICkoIENhdGNoOjpNZXNzYWdlQnVpbGRlciggbWFjcm9OYW1lIyNfY2F0Y2hfc3Is IENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6UmVzdWx0V2FzOjpJbmZvICkgPDwgbG9n ICk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5T Q09QRURfSU5GTyggbWFjcm9OYW1lLCBsb2cgKSBcCisgICAgQ2F0Y2g6OmdldFJlc3VsdENhcHR1 cmUoKS5lbXBsYWNlVW5zY29wZWRNZXNzYWdlKCBDYXRjaDo6TWVzc2FnZUJ1aWxkZXIoIG1hY3Jv TmFtZSMjX2NhdGNoX3NyLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6OlJlc3VsdFdh czo6SW5mbyApIDw8IGxvZyApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFsdGhvdWdo IHRoaXMgaXMgbWF0Y2hlci1iYXNlZCwgaXQgY2FuIGJlIHVzZWQgd2l0aCBqdXN0IGEgc3RyaW5n CisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XU19TVFJfTUFUQ0hFUyggbWFjcm9OYW1lLCBy ZXN1bHREaXNwb3NpdGlvbiwgbWF0Y2hlciwgLi4uICkgXAorICAgIGRvIHsgXAorICAgICAgICBD YXRjaDo6QXNzZXJ0aW9uSGFuZGxlciBjYXRjaEFzc2VydGlvbkhhbmRsZXIoIG1hY3JvTmFtZSMj X2NhdGNoX3NyLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ0FUQ0hfSU5URVJOQUxfU1RSSU5H SUZZKF9fVkFfQVJHU19fKSAiLCAiIENBVENIX0lOVEVSTkFMX1NUUklOR0lGWShtYXRjaGVyKSwg cmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBpZiggY2F0Y2hBc3NlcnRpb25IYW5kbGVy LmFsbG93VGhyb3dzKCkgKSBcCisgICAgICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICAgICAg c3RhdGljX2Nhc3Q8dm9pZD4oX19WQV9BUkdTX18pOyBcCisgICAgICAgICAgICAgICAgY2F0Y2hB c3NlcnRpb25IYW5kbGVyLmhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb25Ob3RUaHJvd24oKTsgXAor ICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAg ICAgICAgQ2F0Y2g6OmhhbmRsZUV4Y2VwdGlvbk1hdGNoRXhwciggY2F0Y2hBc3NlcnRpb25IYW5k bGVyLCBtYXRjaGVyLCAjbWF0Y2hlciMjX2NhdGNoX3NyICk7IFwKKyAgICAgICAgICAgIH0gXAor ICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVU aHJvd2luZ0NhbGxTa2lwcGVkKCk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIGNh dGNoQXNzZXJ0aW9uSGFuZGxlciApIFwKKyAgICB9IHdoaWxlKCBmYWxzZSApCisKKyNlbmRpZiAv LyBDQVRDSF9DT05GSUdfRElTQUJMRQorCisvLyBlbmQgY2F0Y2hfY2FwdHVyZS5ocHAKKy8vIHN0 YXJ0IGNhdGNoX3NlY3Rpb24uaAorCisvLyBzdGFydCBjYXRjaF9zZWN0aW9uX2luZm8uaAorCisv LyBzdGFydCBjYXRjaF90b3RhbHMuaAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNl IENhdGNoIHsKKworICAgIHN0cnVjdCBDb3VudHMgeworICAgICAgICBDb3VudHMgb3BlcmF0b3Ig LSAoIENvdW50cyBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgQ291bnRzJiBvcGVyYXRv ciArPSAoIENvdW50cyBjb25zdCYgb3RoZXIgKTsKKworICAgICAgICBzdGQ6OnNpemVfdCB0b3Rh bCgpIGNvbnN0OworICAgICAgICBib29sIGFsbFBhc3NlZCgpIGNvbnN0OworICAgICAgICBib29s IGFsbE9rKCkgY29uc3Q7CisKKyAgICAgICAgc3RkOjpzaXplX3QgcGFzc2VkID0gMDsKKyAgICAg ICAgc3RkOjpzaXplX3QgZmFpbGVkID0gMDsKKyAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkQnV0 T2sgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgVG90YWxzIHsKKworICAgICAgICBUb3RhbHMg b3BlcmF0b3IgLSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgVG90YWxz JiBvcGVyYXRvciArPSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKTsKKworICAgICAgICBUb3RhbHMg ZGVsdGEoIFRvdGFscyBjb25zdCYgcHJldlRvdGFscyApIGNvbnN0OworCisgICAgICAgIGludCBl cnJvciA9IDA7CisgICAgICAgIENvdW50cyBhc3NlcnRpb25zOworICAgICAgICBDb3VudHMgdGVz dENhc2VzOworICAgIH07Cit9CisKKy8vIGVuZCBjYXRjaF90b3RhbHMuaAorI2luY2x1ZGUgPHN0 cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTZWN0aW9uSW5mbyB7Cisg ICAgICAgIFNlY3Rpb25JbmZvCisgICAgICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3Qm IF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKTsK KworICAgICAgICAvLyBEZXByZWNhdGVkCisgICAgICAgIFNlY3Rpb25JbmZvCisgICAgICAgICAg ICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICBz dGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29u c3QmICkgOiBTZWN0aW9uSW5mbyggX2xpbmVJbmZvLCBfbmFtZSApIHt9CisKKyAgICAgICAgc3Rk OjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247IC8vICFEZXBy ZWNhdGVkOiB0aGlzIHdpbGwgYWx3YXlzIGJlIGVtcHR5CisgICAgICAgIFNvdXJjZUxpbmVJbmZv IGxpbmVJbmZvOworICAgIH07CisKKyAgICBzdHJ1Y3QgU2VjdGlvbkVuZEluZm8geworICAgICAg ICBTZWN0aW9uSW5mbyBzZWN0aW9uSW5mbzsKKyAgICAgICAgQ291bnRzIHByZXZBc3NlcnRpb25z OworICAgICAgICBkb3VibGUgZHVyYXRpb25JblNlY29uZHM7CisgICAgfTsKKworfSAvLyBlbmQg bmFtZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF9zZWN0aW9uX2luZm8uaAorLy8gc3RhcnQg Y2F0Y2hfdGltZXIuaAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIENhdGNoIHsK KworICAgIGF1dG8gZ2V0Q3VycmVudE5hbm9zZWNvbmRzU2luY2VFcG9jaCgpIC0+IHVpbnQ2NF90 OworICAgIGF1dG8gZ2V0RXN0aW1hdGVkQ2xvY2tSZXNvbHV0aW9uKCkgLT4gdWludDY0X3Q7CisK KyAgICBjbGFzcyBUaW1lciB7CisgICAgICAgIHVpbnQ2NF90IG1fbmFub3NlY29uZHMgPSAwOwor ICAgIHB1YmxpYzoKKyAgICAgICAgdm9pZCBzdGFydCgpOworICAgICAgICBhdXRvIGdldEVsYXBz ZWROYW5vc2Vjb25kcygpIGNvbnN0IC0+IHVpbnQ2NF90OworICAgICAgICBhdXRvIGdldEVsYXBz ZWRNaWNyb3NlY29uZHMoKSBjb25zdCAtPiB1aW50NjRfdDsKKyAgICAgICAgYXV0byBnZXRFbGFw c2VkTWlsbGlzZWNvbmRzKCkgY29uc3QgLT4gdW5zaWduZWQgaW50OworICAgICAgICBhdXRvIGdl dEVsYXBzZWRTZWNvbmRzKCkgY29uc3QgLT4gZG91YmxlOworICAgIH07CisKK30gLy8gbmFtZXNw YWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF90aW1lci5oCisjaW5jbHVkZSA8c3RyaW5nPgorCitu YW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU2VjdGlvbiA6IE5vbkNvcHlhYmxlIHsKKyAg ICBwdWJsaWM6CisgICAgICAgIFNlY3Rpb24oIFNlY3Rpb25JbmZvIGNvbnN0JiBpbmZvICk7Cisg ICAgICAgIH5TZWN0aW9uKCk7CisKKyAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0 aGUgc2VjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90CisgICAgICAgIGV4cGxpY2l0IG9w ZXJhdG9yIGJvb2woKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNlY3Rpb25JbmZv IG1faW5mbzsKKworICAgICAgICBzdGQ6OnN0cmluZyBtX25hbWU7CisgICAgICAgIENvdW50cyBt X2Fzc2VydGlvbnM7CisgICAgICAgIGJvb2wgbV9zZWN0aW9uSW5jbHVkZWQ7CisgICAgICAgIFRp bWVyIG1fdGltZXI7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNkZWZp bmUgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggLi4uICkgXAorICAgIENBVENIX0lOVEVSTkFMX1NU QVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKKyAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19V TlVTRURfV0FSTklOR1MgXAorICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxf Q0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0 aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIF9fVkFfQVJHU19fICkgKSBcCisgICAg Q0FUQ0hfSU5URVJOQUxfU1RPUF9XQVJOSU5HU19TVVBQUkVTU0lPTgorCisjZGVmaW5lIElOVEVS TkFMX0NBVENIX0RZTkFNSUNfU0VDVElPTiggLi4uICkgXAorICAgIENBVENIX0lOVEVSTkFMX1NU QVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKKyAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19V TlVTRURfV0FSTklOR1MgXAorICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxf Q0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0 aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIChDYXRjaDo6UmV1c2FibGVTdHJpbmdT dHJlYW0oKSA8PCBfX1ZBX0FSR1NfXykuc3RyKCkgKSApIFwKKyAgICBDQVRDSF9JTlRFUk5BTF9T VE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9OCisKKy8vIGVuZCBjYXRjaF9zZWN0aW9uLmgKKy8vIHN0 YXJ0IGNhdGNoX2ludGVyZmFjZXNfZXhjZXB0aW9uLmgKKworLy8gc3RhcnQgY2F0Y2hfaW50ZXJm YWNlc19yZWdpc3RyeV9odWIuaAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1lbW9y eT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIHN0cnVj dCBJVGVzdENhc2VSZWdpc3RyeTsKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdp c3RyeTsKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3I7CisgICAgc3RydWN0IElSZXBv cnRlclJlZ2lzdHJ5OworICAgIHN0cnVjdCBJUmVwb3J0ZXJGYWN0b3J5OworICAgIHN0cnVjdCBJ VGFnQWxpYXNSZWdpc3RyeTsKKyAgICBzdHJ1Y3QgSU11dGFibGVFbnVtVmFsdWVzUmVnaXN0cnk7 CisKKyAgICBjbGFzcyBTdGFydHVwRXhjZXB0aW9uUmVnaXN0cnk7CisKKyAgICB1c2luZyBJUmVw b3J0ZXJGYWN0b3J5UHRyID0gc3RkOjpzaGFyZWRfcHRyPElSZXBvcnRlckZhY3Rvcnk+OworCisg ICAgc3RydWN0IElSZWdpc3RyeUh1YiB7CisgICAgICAgIHZpcnR1YWwgfklSZWdpc3RyeUh1Yigp OworCisgICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVy UmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRlc3RDYXNlUmVnaXN0cnkg Y29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwg SVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCA9IDA7 CisgICAgICAgIHZpcnR1YWwgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSBjb25zdCYgZ2V0 RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1 YWwgU3RhcnR1cEV4Y2VwdGlvblJlZ2lzdHJ5IGNvbnN0JiBnZXRTdGFydHVwRXhjZXB0aW9uUmVn aXN0cnkoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJTXV0YWJsZVJlZ2lzdHJ5 SHViIHsKKyAgICAgICAgdmlydHVhbCB+SU11dGFibGVSZWdpc3RyeUh1YigpOworICAgICAgICB2 aXJ0dWFsIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIElS ZXBvcnRlckZhY3RvcnlQdHIgY29uc3QmIGZhY3RvcnkgKSA9IDA7CisgICAgICAgIHZpcnR1YWwg dm9pZCByZWdpc3Rlckxpc3RlbmVyKCBJUmVwb3J0ZXJGYWN0b3J5UHRyIGNvbnN0JiBmYWN0b3J5 ICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25z dCYgdGVzdEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0 b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgPSAwOworICAgICAg ICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUYWdBbGlhcyggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFz LCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8g KSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclN0YXJ0dXBFeGNlcHRpb24oKSBu b2V4Y2VwdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSU11dGFibGVFbnVtVmFsdWVzUmVnaXN0cnkm IGdldE11dGFibGVFbnVtVmFsdWVzUmVnaXN0cnkoKSA9IDA7CisgICAgfTsKKworICAgIElSZWdp c3RyeUh1YiBjb25zdCYgZ2V0UmVnaXN0cnlIdWIoKTsKKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHVi JiBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKTsKKyAgICB2b2lkIGNsZWFuVXAoKTsKKyAgICBzdGQ6 OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKworfQorCisvLyBlbmQgY2F0Y2hf aW50ZXJmYWNlc19yZWdpc3RyeV9odWIuaAorI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FC TEUpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OX05PX1JF RyggdHJhbnNsYXRvck5hbWUsIHNpZ25hdHVyZSkgXAorICAgICAgICBzdGF0aWMgc3RkOjpzdHJp bmcgdHJhbnNsYXRvck5hbWUoIHNpZ25hdHVyZSApCisjZW5kaWYKKworI2luY2x1ZGUgPGV4Y2Vw dGlvbj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2Ug Q2F0Y2ggeworICAgIHVzaW5nIGV4Y2VwdGlvblRyYW5zbGF0ZUZ1bmN0aW9uID0gc3RkOjpzdHJp bmcoKikoKTsKKworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvcjsKKyAgICB1c2luZyBF eGNlcHRpb25UcmFuc2xhdG9ycyA9IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJRXhjZXB0 aW9uVHJhbnNsYXRvciBjb25zdD4+OworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9y IHsKKyAgICAgICAgdmlydHVhbCB+SUV4Y2VwdGlvblRyYW5zbGF0b3IoKTsKKyAgICAgICAgdmly dHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9p dGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kICkg Y29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdp c3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKTsK KworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigp IGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lz dHJhciB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGNsYXNzIEV4Y2Vw dGlvblRyYW5zbGF0b3IgOiBwdWJsaWMgSUV4Y2VwdGlvblRyYW5zbGF0b3IgeworICAgICAgICBw dWJsaWM6CisKKyAgICAgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3IoIHN0ZDo6c3RyaW5nKCp0 cmFuc2xhdGVGdW5jdGlvbikoIFQmICkgKQorICAgICAgICAgICAgOiBtX3RyYW5zbGF0ZUZ1bmN0 aW9uKCB0cmFuc2xhdGVGdW5jdGlvbiApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICBz dGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRv ciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kICkgY29uc3Qg b3ZlcnJpZGUgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfRVhDRVBUSU9OUykK KyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisjZWxzZQorICAgICAgICAgICAgICAgIHRyeSB7 CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBpdEVuZCApCisgICAgICAgICAgICAgICAg ICAgICAgICBzdGQ6OnJldGhyb3dfZXhjZXB0aW9uKHN0ZDo6Y3VycmVudF9leGNlcHRpb24oKSk7 CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy biAoKml0KS0+dHJhbnNsYXRlKCBpdCsxLCBpdEVuZCApOworICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgICBjYXRjaCggVCYgZXggKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVy biBtX3RyYW5zbGF0ZUZ1bmN0aW9uKCBleCApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgor ICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHN0ZDo6c3Ry aW5nKCptX3RyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKTsKKyAgICAgICAgfTsKKworICAgIHB1Ymxp YzoKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgRXhjZXB0aW9uVHJhbnNs YXRvclJlZ2lzdHJhciggc3RkOjpzdHJpbmcoKnRyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKSApIHsK KyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVHJhbnNsYXRvcgor ICAgICAgICAgICAgICAgICggbmV3IEV4Y2VwdGlvblRyYW5zbGF0b3I8VD4oIHRyYW5zbGF0ZUZ1 bmN0aW9uICkgKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTjIoIHRyYW5zbGF0 b3JOYW1lLCBzaWduYXR1cmUgKSBcCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRyYW5zbGF0b3JO YW1lKCBzaWduYXR1cmUgKTsgXAorICAgIENBVENIX0lOVEVSTkFMX1NUQVJUX1dBUk5JTkdTX1NV UFBSRVNTSU9OIFwKKyAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dBUk5JTkdT IFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cmFyIElO VEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9FeGNlcHRpb25SZWdpc3Ry YXIgKSggJnRyYW5zbGF0b3JOYW1lICk7IH0gXAorICAgIENBVENIX0lOVEVSTkFMX1NUT1BfV0FS TklOR1NfU1VQUFJFU1NJT04gXAorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0cmFuc2xhdG9yTmFt ZSggc2lnbmF0dXJlICkKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBU SU9OKCBzaWduYXR1cmUgKSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OMiggSU5U RVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX0V4Y2VwdGlvblRyYW5zbGF0 b3IgKSwgc2lnbmF0dXJlICkKKworLy8gZW5kIGNhdGNoX2ludGVyZmFjZXNfZXhjZXB0aW9uLmgK Ky8vIHN0YXJ0IGNhdGNoX2FwcHJveC5oCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFt ZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBEZXRhaWwgeworCisgICAgY2xhc3MgQXBwcm94IHsK KyAgICBwcml2YXRlOgorICAgICAgICBib29sIGVxdWFsaXR5Q29tcGFyaXNvbkltcGwoZG91Ymxl IG90aGVyKSBjb25zdDsKKyAgICAgICAgLy8gVmFsaWRhdGVzIHRoZSBuZXcgbWFyZ2luIChtYXJn aW4gPj0gMCkKKyAgICAgICAgLy8gb3V0LW9mLWxpbmUgdG8gYXZvaWQgaW5jbHVkaW5nIHN0ZGV4 Y2VwdCBpbiB0aGUgaGVhZGVyCisgICAgICAgIHZvaWQgc2V0TWFyZ2luKGRvdWJsZSBtYXJnaW4p OworICAgICAgICAvLyBWYWxpZGF0ZXMgdGhlIG5ldyBlcHNpbG9uICgwIDwgZXBzaWxvbiA8IDEp CisgICAgICAgIC8vIG91dC1vZi1saW5lIHRvIGF2b2lkIGluY2x1ZGluZyBzdGRleGNlcHQgaW4g dGhlIGhlYWRlcgorICAgICAgICB2b2lkIHNldEVwc2lsb24oZG91YmxlIGVwc2lsb24pOworCisg ICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBBcHByb3ggKCBkb3VibGUgdmFsdWUgKTsKKwor ICAgICAgICBzdGF0aWMgQXBwcm94IGN1c3RvbSgpOworCisgICAgICAgIEFwcHJveCBvcGVyYXRv ci0oKSBjb25zdDsKKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0 eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6 dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3ggb3BlcmF0b3IoKSggVCBjb25zdCYgdmFsdWUg KSBjb25zdCB7CisgICAgICAgICAgICBBcHByb3ggYXBwcm94KCBzdGF0aWNfY2FzdDxkb3VibGU+ KHZhbHVlKSApOworICAgICAgICAgICAgYXBwcm94Lm1fZXBzaWxvbiA9IG1fZXBzaWxvbjsKKyAg ICAgICAgICAgIGFwcHJveC5tX21hcmdpbiA9IG1fbWFyZ2luOworICAgICAgICAgICAgYXBwcm94 Lm1fc2NhbGUgPSBtX3NjYWxlOworICAgICAgICAgICAgcmV0dXJuIGFwcHJveDsKKyAgICAgICAg fQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0 ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5 cGU+CisgICAgICAgIGV4cGxpY2l0IEFwcHJveCggVCBjb25zdCYgdmFsdWUgKTogQXBwcm94KHN0 YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpKQorICAgICAgICB7fQorCisgICAgICAgIHRlbXBsYXRl IDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNf Y29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBi b29sIG9wZXJhdG9yID09ICggY29uc3QgVCYgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAg ICAgICAgICAgIGF1dG8gbGhzX3YgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGxocyk7CisgICAgICAg ICAgICByZXR1cm4gcmhzLmVxdWFsaXR5Q29tcGFyaXNvbkltcGwobGhzX3YpOworICAgICAgICB9 CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3Rk OjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlw ZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBBcHByb3ggY29uc3QmIGxocywg Y29uc3QgVCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oIHJocywgbGhz ICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUg PSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBU Pjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIFQgY29u c3QmIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJh dG9yPT0oIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5h bWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVj dGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVy YXRvciAhPSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAg ICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICB0 ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxz dGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBm cmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIFQgY29uc3QmIGxocywgQXBwcm94IGNvbnN0JiByaHMg KSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihsaHMpIDwgcmhzLm1f dmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBl bmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3Ry dWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9w ZXJhdG9yIDw9ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgY29uc3QmIHJocyApIHsKKyAgICAgICAg ICAgIHJldHVybiBsaHMubV92YWx1ZSA8IHN0YXRpY19jYXN0PGRvdWJsZT4ocmhzKSB8fCBsaHMg PT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVu YW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJs ZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBU IGNvbnN0JiBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIHN0 YXRpY19jYXN0PGRvdWJsZT4obGhzKSA+IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAg ICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFt ZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+ Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIEFwcHJveCBjb25zdCYg bGhzLCBUIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPiBz dGF0aWNfY2FzdDxkb3VibGU+KHJocykgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAg ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxl X2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAg ICAgIEFwcHJveCYgZXBzaWxvbiggVCBjb25zdCYgbmV3RXBzaWxvbiApIHsKKyAgICAgICAgICAg IGRvdWJsZSBlcHNpbG9uQXNEb3VibGUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KG5ld0Vwc2lsb24p OworICAgICAgICAgICAgc2V0RXBzaWxvbihlcHNpbG9uQXNEb3VibGUpOworICAgICAgICAgICAg cmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQs IHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxl PGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBtYXJnaW4oIFQgY29u c3QmIG5ld01hcmdpbiApIHsKKyAgICAgICAgICAgIGRvdWJsZSBtYXJnaW5Bc0RvdWJsZSA9IHN0 YXRpY19jYXN0PGRvdWJsZT4obmV3TWFyZ2luKTsKKyAgICAgICAgICAgIHNldE1hcmdpbihtYXJn aW5Bc0RvdWJsZSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAg ICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJs ZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAg ICAgICBBcHByb3gmIHNjYWxlKCBUIGNvbnN0JiBuZXdTY2FsZSApIHsKKyAgICAgICAgICAgIG1f c2NhbGUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KG5ld1NjYWxlKTsKKyAgICAgICAgICAgIHJldHVy biAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29u c3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBkb3VibGUgbV9lcHNpbG9uOworICAgICAgICBk b3VibGUgbV9tYXJnaW47CisgICAgICAgIGRvdWJsZSBtX3NjYWxlOworICAgICAgICBkb3VibGUg bV92YWx1ZTsKKyAgICB9OworfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCituYW1lc3BhY2Ug bGl0ZXJhbHMgeworICAgIERldGFpbDo6QXBwcm94IG9wZXJhdG9yICIiIF9hKGxvbmcgZG91Ymxl IHZhbCk7CisgICAgRGV0YWlsOjpBcHByb3ggb3BlcmF0b3IgIiIgX2EodW5zaWduZWQgbG9uZyBs b25nIHZhbCk7Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGl0ZXJhbHMKKwordGVtcGxhdGU8Pgorc3Ry dWN0IFN0cmluZ01ha2VyPENhdGNoOjpEZXRhaWw6OkFwcHJveD4geworICAgIHN0YXRpYyBzdGQ6 OnN0cmluZyBjb252ZXJ0KENhdGNoOjpEZXRhaWw6OkFwcHJveCBjb25zdCYgdmFsdWUpOworfTsK KworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF9hcHByb3guaAorLy8g c3RhcnQgY2F0Y2hfc3RyaW5nX21hbmlwLmgKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRl IDxpb3Nmd2Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAg Ym9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3Qm IHByZWZpeCApOworICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNo YXIgcHJlZml4ICk7CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0 ZDo6c3RyaW5nIGNvbnN0JiBzdWZmaXggKTsKKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmlu ZyBjb25zdCYgcywgY2hhciBzdWZmaXggKTsKKyAgICBib29sIGNvbnRhaW5zKCBzdGQ6OnN0cmlu ZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIGluZml4ICk7CisgICAgdm9pZCB0b0xvd2Vy SW5QbGFjZSggc3RkOjpzdHJpbmcmIHMgKTsKKyAgICBzdGQ6OnN0cmluZyB0b0xvd2VyKCBzdGQ6 OnN0cmluZyBjb25zdCYgcyApOworICAgIC8vISBSZXR1cm5zIGEgbmV3IHN0cmluZyB3aXRob3V0 IHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0L2VuZAorICAgIHN0ZDo6c3RyaW5nIHRyaW0oIHN0ZDo6 c3RyaW5nIGNvbnN0JiBzdHIgKTsKKyAgICAvLyEgUmV0dXJucyBhIHN1YnN0cmluZyBvZiB0aGUg b3JpZ2luYWwgcmVmIHdpdGhvdXQgd2hpdGVzcGFjZS4gQmV3YXJlIGxpZmV0aW1lcyEKKyAgICBT dHJpbmdSZWYgdHJpbShTdHJpbmdSZWYgcmVmKTsKKworICAgIC8vICEhISBCZSBhd2FyZSwgcmV0 dXJucyByZWZzIGludG8gb3JpZ2luYWwgc3RyaW5nIC0gbWFrZSBzdXJlIG9yaWdpbmFsIHN0cmlu ZyBvdXRsaXZlcyB0aGVtCisgICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBzcGxpdFN0cmluZ1Jl ZiggU3RyaW5nUmVmIHN0ciwgY2hhciBkZWxpbWl0ZXIgKTsKKyAgICBib29sIHJlcGxhY2VJblBs YWNlKCBzdGQ6OnN0cmluZyYgc3RyLCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwbGFjZVRoaXMsIHN0 ZDo6c3RyaW5nIGNvbnN0JiB3aXRoVGhpcyApOworCisgICAgc3RydWN0IHBsdXJhbGlzZSB7Cisg ICAgICAgIHBsdXJhbGlzZSggc3RkOjpzaXplX3QgY291bnQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBs YWJlbCApOworCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3Rk Ojpvc3RyZWFtJiBvcywgcGx1cmFsaXNlIGNvbnN0JiBwbHVyYWxpc2VyICk7CisKKyAgICAgICAg c3RkOjpzaXplX3QgbV9jb3VudDsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9sYWJlbDsKKyAgICB9 OworfQorCisvLyBlbmQgY2F0Y2hfc3RyaW5nX21hbmlwLmgKKyNpZm5kZWYgQ0FUQ0hfQ09ORklH X0RJU0FCTEVfTUFUQ0hFUlMKKy8vIHN0YXJ0IGNhdGNoX2NhcHR1cmVfbWF0Y2hlcnMuaAorCisv LyBzdGFydCBjYXRjaF9tYXRjaGVycy5oCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8 dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKyAgICBu YW1lc3BhY2UgSW1wbCB7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0 IE1hdGNoQWxsT2Y7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRj aEFueU9mOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hOb3RP ZjsKKworICAgICAgICBjbGFzcyBNYXRjaGVyVW50eXBlZEJhc2UgeworICAgICAgICBwdWJsaWM6 CisgICAgICAgICAgICBNYXRjaGVyVW50eXBlZEJhc2UoKSA9IGRlZmF1bHQ7CisgICAgICAgICAg ICBNYXRjaGVyVW50eXBlZEJhc2UgKCBNYXRjaGVyVW50eXBlZEJhc2UgY29uc3QmICkgPSBkZWZh dWx0OworICAgICAgICAgICAgTWF0Y2hlclVudHlwZWRCYXNlJiBvcGVyYXRvciA9ICggTWF0Y2hl clVudHlwZWRCYXNlIGNvbnN0JiApID0gZGVsZXRlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcg dG9TdHJpbmcoKSBjb25zdDsKKworICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICB2aXJ0 dWFsIH5NYXRjaGVyVW50eXBlZEJhc2UoKTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJp bmcgZGVzY3JpYmUoKSBjb25zdCA9IDA7CisgICAgICAgICAgICBtdXRhYmxlIHN0ZDo6c3RyaW5n IG1fY2FjaGVkVG9TdHJpbmc7CisgICAgICAgIH07CisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICAg cHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorIyAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3Rp YyBpZ25vcmVkICItV25vbi12aXJ0dWFsLWR0b3IiCisjZW5kaWYKKworICAgICAgICB0ZW1wbGF0 ZTx0eXBlbmFtZSBPYmplY3RUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlck1ldGhvZCB7CisgICAg ICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE9iamVjdFQgY29uc3QmIGFyZyApIGNvbnN0ID0g MDsKKyAgICAgICAgfTsKKworI2lmIGRlZmluZWQoX19PQkpDX18pCisgICAgICAgIC8vIEhhY2sg dG8gZml4IENhdGNoIEdIIGlzc3VlICMxNjYxLiBDb3VsZCB1c2UgaWQgZm9yIGdlbmVyaWMgT2Jq ZWN0IHN1cHBvcnQuCisgICAgICAgIC8vIHVzZSBvZiBjb25zdCBmb3IgT2JqZWN0IHBvaW50ZXJz IGlzIHZlcnkgdW5jb21tb24gYW5kIHVuZGVyIEFSQyBpdCBjYXVzZXMgc29tZSBraW5kIG9mIHNp Z25hdHVyZSBtaXNtYXRjaCB0aGF0IGJyZWFrcyBjb21waWxhdGlvbgorICAgICAgICB0ZW1wbGF0 ZTw+CisgICAgICAgIHN0cnVjdCBNYXRjaGVyTWV0aG9kPE5TU3RyaW5nKj4geworICAgICAgICAg ICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogYXJnICkgY29uc3QgPSAwOworICAgICAg ICB9OworI2VuZGlmCisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICAgcHJhZ21hIGNsYW5nIGRpYWdu b3N0aWMgcG9wCisjZW5kaWYKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAg ICBzdHJ1Y3QgTWF0Y2hlckJhc2UgOiBNYXRjaGVyVW50eXBlZEJhc2UsIE1hdGNoZXJNZXRob2Q8 VD4geworCisgICAgICAgICAgICBNYXRjaEFsbE9mPFQ+IG9wZXJhdG9yICYmICggTWF0Y2hlckJh c2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgICAgICBNYXRjaEFueU9mPFQ+IG9wZXJh dG9yIHx8ICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgICAgICBN YXRjaE5vdE9mPFQ+IG9wZXJhdG9yICEgKCkgY29uc3Q7CisgICAgICAgIH07CisKKyAgICAgICAg dGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoQWxsT2YgOiBNYXRj aGVyQmFzZTxBcmdUPiB7CisgICAgICAgICAgICBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcg KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgZm9yKCBhdXRvIG1hdGNoZXIgOiBt X21hdGNoZXJzICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXItPm1hdGNoKGFy ZykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAg ICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAg ICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAg ICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgZGVzY3JpcHRp b24ucmVzZXJ2ZSggNCArIG1fbWF0Y2hlcnMuc2l6ZSgpKjMyICk7CisgICAgICAgICAgICAgICAg ZGVzY3JpcHRpb24gKz0gIiggIjsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsK KyAgICAgICAgICAgICAgICBmb3IoIGF1dG8gbWF0Y2hlciA6IG1fbWF0Y2hlcnMgKSB7CisgICAg ICAgICAgICAgICAgICAgIGlmKCBmaXJzdCApCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJz dCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAg ICAgICBkZXNjcmlwdGlvbiArPSAiIGFuZCAiOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlw dGlvbiArPSBtYXRjaGVyLT50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgICAgICBkZXNjcmlwdGlvbiArPSAiICkiOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNj cmlwdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hBbGxPZjxBcmdUPiBv cGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAg ICAgICAgICBhdXRvIGNvcHkoKnRoaXMpOworICAgICAgICAgICAgICAgIGNvcHkubV9tYXRjaGVy cy5wdXNoX2JhY2soICZvdGhlciApOworICAgICAgICAgICAgICAgIHJldHVybiBjb3B5OworICAg ICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRjaGVyQmFzZTxBcmdUPiBj b25zdCo+IG1fbWF0Y2hlcnM7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1l IEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaEFueU9mIDogTWF0Y2hlckJhc2U8QXJnVD4gewor CisgICAgICAgICAgICBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBvdmVycmlk ZSB7CisgICAgICAgICAgICAgICAgZm9yKCBhdXRvIG1hdGNoZXIgOiBtX21hdGNoZXJzICkgewor ICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci0+bWF0Y2goYXJnKSkKKyAgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmlu ZyBkZXNjcmliZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmlu ZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXNlcnZlKCA0ICsg bV9tYXRjaGVycy5zaXplKCkqMzIgKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAi KCAiOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAg IGZvciggYXV0byBtYXRjaGVyIDogbV9tYXRjaGVycyApIHsKKyAgICAgICAgICAgICAgICAgICAg aWYoIGZpcnN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAg ICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9u ICs9ICIgb3IgIjsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbWF0Y2hlci0+ dG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzY3JpcHRp b24gKz0gIiApIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAg ICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoQW55T2Y8QXJnVD4gb3BlcmF0b3IgfHwgKCBNYXRj aGVyQmFzZTxBcmdUPiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgYXV0byBjb3B5 KCp0aGlzKTsKKyAgICAgICAgICAgICAgICBjb3B5Lm1fbWF0Y2hlcnMucHVzaF9iYWNrKCAmb3Ro ZXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29weTsKKyAgICAgICAgICAgIH0KKworICAg ICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckJhc2U8QXJnVD4gY29uc3QqPiBtX21hdGNoZXJz OworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAg IHN0cnVjdCBNYXRjaE5vdE9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworCisgICAgICAgICAgICBN YXRjaE5vdE9mKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgdW5kZXJseWluZ01hdGNoZXIgKSA6 IG1fdW5kZXJseWluZ01hdGNoZXIoIHVuZGVybHlpbmdNYXRjaGVyICkge30KKworICAgICAgICAg ICAgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAg ICAgICAgICAgIHJldHVybiAhbV91bmRlcmx5aW5nTWF0Y2hlci5tYXRjaCggYXJnICk7CisgICAg ICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3Zl cnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiAibm90ICIgKyBtX3VuZGVybHlpbmdNYXRj aGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNYXRjaGVyQmFzZTxB cmdUPiBjb25zdCYgbV91bmRlcmx5aW5nTWF0Y2hlcjsKKyAgICAgICAgfTsKKworICAgICAgICB0 ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBNYXRjaEFsbE9mPFQ+IE1hdGNoZXJCYXNlPFQ+ OjpvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAg ICAgICAgIHJldHVybiBNYXRjaEFsbE9mPFQ+KCkgJiYgKnRoaXMgJiYgb3RoZXI7CisgICAgICAg IH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgTWF0Y2hBbnlPZjxUPiBN YXRjaGVyQmFzZTxUPjo6b3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBj b25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hBbnlPZjxUPigpIHx8ICp0aGlzIHx8IG90 aGVyOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIE1h dGNoTm90T2Y8VD4gTWF0Y2hlckJhc2U8VD46Om9wZXJhdG9yICEgKCkgY29uc3QgeworICAgICAg ICAgICAgcmV0dXJuIE1hdGNoTm90T2Y8VD4oICp0aGlzICk7CisgICAgICAgIH0KKworICAgIH0g Ly8gbmFtZXNwYWNlIEltcGwKKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKKwordXNpbmcgbmFt ZXNwYWNlIE1hdGNoZXJzOwordXNpbmcgTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlOworCit9 IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfbWF0Y2hlcnMuaAorLy8gc3RhcnQg Y2F0Y2hfbWF0Y2hlcnNfZXhjZXB0aW9uLmhwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNw YWNlIE1hdGNoZXJzIHsKK25hbWVzcGFjZSBFeGNlcHRpb24geworCitjbGFzcyBFeGNlcHRpb25N ZXNzYWdlTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyQmFzZTxzdGQ6OmV4Y2VwdGlvbj4geworICAg IHN0ZDo6c3RyaW5nIG1fbWVzc2FnZTsKK3B1YmxpYzoKKworICAgIEV4Y2VwdGlvbk1lc3NhZ2VN YXRjaGVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlKToKKyAgICAgICAgbV9tZXNzYWdlKG1l c3NhZ2UpCisgICAge30KKworICAgIGJvb2wgbWF0Y2goc3RkOjpleGNlcHRpb24gY29uc3QmIGV4 KSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3Zl cnJpZGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBFeGNlcHRpb24KKworRXhjZXB0aW9uOjpFeGNl cHRpb25NZXNzYWdlTWF0Y2hlciBNZXNzYWdlKHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlKTsK KworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vIGVu ZCBjYXRjaF9tYXRjaGVyc19leGNlcHRpb24uaHBwCisvLyBzdGFydCBjYXRjaF9tYXRjaGVyc19m bG9hdGluZy5oCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisg ICAgbmFtZXNwYWNlIEZsb2F0aW5nIHsKKworICAgICAgICBlbnVtIGNsYXNzIEZsb2F0aW5nUG9p bnRLaW5kIDogdWludDhfdDsKKworICAgICAgICBzdHJ1Y3QgV2l0aGluQWJzTWF0Y2hlciA6IE1h dGNoZXJCYXNlPGRvdWJsZT4geworICAgICAgICAgICAgV2l0aGluQWJzTWF0Y2hlcihkb3VibGUg dGFyZ2V0LCBkb3VibGUgbWFyZ2luKTsKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goZG91YmxlIGNv bnN0JiBtYXRjaGVlKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRl c2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBk b3VibGUgbV90YXJnZXQ7CisgICAgICAgICAgICBkb3VibGUgbV9tYXJnaW47CisgICAgICAgIH07 CisKKyAgICAgICAgc3RydWN0IFdpdGhpblVscHNNYXRjaGVyIDogTWF0Y2hlckJhc2U8ZG91Ymxl PiB7CisgICAgICAgICAgICBXaXRoaW5VbHBzTWF0Y2hlcihkb3VibGUgdGFyZ2V0LCB1aW50NjRf dCB1bHBzLCBGbG9hdGluZ1BvaW50S2luZCBiYXNlVHlwZSk7CisgICAgICAgICAgICBib29sIG1h dGNoKGRvdWJsZSBjb25zdCYgbWF0Y2hlZSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICBz dGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBwcml2YXRlOgor ICAgICAgICAgICAgZG91YmxlIG1fdGFyZ2V0OworICAgICAgICAgICAgdWludDY0X3QgbV91bHBz OworICAgICAgICAgICAgRmxvYXRpbmdQb2ludEtpbmQgbV90eXBlOworICAgICAgICB9OworCisg ICAgICAgIC8vIEdpdmVuIElFRUUtNzU0IGZvcm1hdCBmb3IgZmxvYXRzIGFuZCBkb3VibGVzLCB3 ZSBjYW4gYXNzdW1lCisgICAgICAgIC8vIHRoYXQgZmxvYXQgLT4gZG91YmxlIHByb21vdGlvbiBp cyBsb3NzbGVzcy4gR2l2ZW4gdGhpcywgd2UgY2FuCisgICAgICAgIC8vIGFzc3VtZSB0aGF0IGlm IHdlIGRvIHRoZSBzdGFuZGFyZCByZWxhdGl2ZSBjb21wYXJpc29uIG9mCisgICAgICAgIC8vIHxs aHMgLSByaHN8IDw9IGVwc2lsb24gKiBtYXgoZmFicyhsaHMpLCBmYWJzKHJocykpLCB0aGVuIHdl IGdldAorICAgICAgICAvLyB0aGUgc2FtZSByZXN1bHQgaWYgd2UgZG8gdGhpcyBmb3IgZmxvYXRz LCBhcyBpZiB3ZSBkbyB0aGlzIGZvcgorICAgICAgICAvLyBkb3VibGVzIHRoYXQgd2VyZSBwcm9t b3RlZCBmcm9tIGZsb2F0cy4KKyAgICAgICAgc3RydWN0IFdpdGhpblJlbE1hdGNoZXIgOiBNYXRj aGVyQmFzZTxkb3VibGU+IHsKKyAgICAgICAgICAgIFdpdGhpblJlbE1hdGNoZXIoZG91YmxlIHRh cmdldCwgZG91YmxlIGVwc2lsb24pOworICAgICAgICAgICAgYm9vbCBtYXRjaChkb3VibGUgY29u c3QmIG1hdGNoZWUpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVz Y3JpYmUoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIGRv dWJsZSBtX3RhcmdldDsKKyAgICAgICAgICAgIGRvdWJsZSBtX2Vwc2lsb247CisgICAgICAgIH07 CisKKyAgICB9IC8vIG5hbWVzcGFjZSBGbG9hdGluZworCisgICAgLy8gVGhlIGZvbGxvd2luZyBm dW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMg YWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorICAgIEZsb2F0aW5nOjpXaXRoaW5VbHBz TWF0Y2hlciBXaXRoaW5VTFAoZG91YmxlIHRhcmdldCwgdWludDY0X3QgbWF4VWxwRGlmZik7Cisg ICAgRmxvYXRpbmc6OldpdGhpblVscHNNYXRjaGVyIFdpdGhpblVMUChmbG9hdCB0YXJnZXQsIHVp bnQ2NF90IG1heFVscERpZmYpOworICAgIEZsb2F0aW5nOjpXaXRoaW5BYnNNYXRjaGVyIFdpdGhp bkFicyhkb3VibGUgdGFyZ2V0LCBkb3VibGUgbWFyZ2luKTsKKyAgICBGbG9hdGluZzo6V2l0aGlu UmVsTWF0Y2hlciBXaXRoaW5SZWwoZG91YmxlIHRhcmdldCwgZG91YmxlIGVwcyk7CisgICAgLy8g ZGVmYXVsdHMgZXBzaWxvbiB0byAxMDAqbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigp CisgICAgRmxvYXRpbmc6OldpdGhpblJlbE1hdGNoZXIgV2l0aGluUmVsKGRvdWJsZSB0YXJnZXQp OworICAgIEZsb2F0aW5nOjpXaXRoaW5SZWxNYXRjaGVyIFdpdGhpblJlbChmbG9hdCB0YXJnZXQs IGZsb2F0IGVwcyk7CisgICAgLy8gZGVmYXVsdHMgZXBzaWxvbiB0byAxMDAqbnVtZXJpY19saW1p dHM8ZmxvYXQ+OjplcHNpbG9uKCkKKyAgICBGbG9hdGluZzo6V2l0aGluUmVsTWF0Y2hlciBXaXRo aW5SZWwoZmxvYXQgdGFyZ2V0KTsKKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFt ZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF9tYXRjaGVyc19mbG9hdGluZy5oCisvLyBzdGFy dCBjYXRjaF9tYXRjaGVyc19nZW5lcmljLmhwcAorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNp bmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMg eworbmFtZXNwYWNlIEdlbmVyaWMgeworCituYW1lc3BhY2UgRGV0YWlsIHsKKyAgICBzdGQ6OnN0 cmluZyBmaW5hbGl6ZURlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjKTsKK30KKwor dGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBQcmVkaWNhdGVNYXRjaGVyIDogcHVibGljIE1h dGNoZXJCYXNlPFQ+IHsKKyAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woVCBjb25zdCYpPiBtX3ByZWRp Y2F0ZTsKKyAgICBzdGQ6OnN0cmluZyBtX2Rlc2NyaXB0aW9uOworcHVibGljOgorCisgICAgUHJl ZGljYXRlTWF0Y2hlcihzdGQ6OmZ1bmN0aW9uPGJvb2woVCBjb25zdCYpPiBjb25zdCYgZWxlbSwg c3RkOjpzdHJpbmcgY29uc3QmIGRlc2NyKQorICAgICAgICA6bV9wcmVkaWNhdGUoc3RkOjptb3Zl KGVsZW0pKSwKKyAgICAgICAgbV9kZXNjcmlwdGlvbihEZXRhaWw6OmZpbmFsaXplRGVzY3JpcHRp b24oZGVzY3IpKQorICAgIHt9CisKKyAgICBib29sIG1hdGNoKCBUIGNvbnN0JiBpdGVtICkgY29u c3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbV9wcmVkaWNhdGUoaXRlbSk7CisgICAgfQor CisgICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJl dHVybiBtX2Rlc2NyaXB0aW9uOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIEdlbmVyaWMK KworICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSB0aGUgYWN0dWFsIG1hdGNo ZXIgb2JqZWN0cy4KKyAgICAvLyBUaGUgdXNlciBoYXMgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHR5 cGUgdG8gdGhlIGZ1bmN0aW9uLCBiZWNhdXNlCisgICAgLy8gaW5mZXJyaW5nIHN0ZDo6ZnVuY3Rp b248Ym9vbChUIGNvbnN0Jik+IGlzIGhhcmQgKGJ1dCBwb3NzaWJsZSkgYW5kCisgICAgLy8gcmVx dWlyZXMgYSBsb3Qgb2YgVE1QLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgR2VuZXJp Yzo6UHJlZGljYXRlTWF0Y2hlcjxUPiBQcmVkaWNhdGUoc3RkOjpmdW5jdGlvbjxib29sKFQgY29u c3QmKT4gY29uc3QmIHByZWRpY2F0ZSwgc3RkOjpzdHJpbmcgY29uc3QmIGRlc2NyaXB0aW9uID0g IiIpIHsKKyAgICAgICAgcmV0dXJuIEdlbmVyaWM6OlByZWRpY2F0ZU1hdGNoZXI8VD4ocHJlZGlj YXRlLCBkZXNjcmlwdGlvbik7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAv LyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX21hdGNoZXJzX2dlbmVyaWMuaHBwCisv LyBzdGFydCBjYXRjaF9tYXRjaGVyc19zdHJpbmcuaAorCisjaW5jbHVkZSA8c3RyaW5nPgorCitu YW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBT dGRTdHJpbmcgeworCisgICAgICAgIHN0cnVjdCBDYXNlZFN0cmluZworICAgICAgICB7CisgICAg ICAgICAgICBDYXNlZFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2 ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgYWRq dXN0U3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3Q7CisgICAgICAgICAgICBz dGQ6OnN0cmluZyBjYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKSBjb25zdDsKKworICAgICAgICAgICAg Q2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2aXR5OworICAgICAgICAgICAgc3Rk OjpzdHJpbmcgbV9zdHI7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IFN0cmluZ01hdGNo ZXJCYXNlIDogTWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IHsKKyAgICAgICAgICAgIFN0cmluZ01h dGNoZXJCYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0aW9uLCBDYXNlZFN0cmluZyBjb25z dCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25z dCBvdmVycmlkZTsKKworICAgICAgICAgICAgQ2FzZWRTdHJpbmcgbV9jb21wYXJhdG9yOworICAg ICAgICAgICAgc3RkOjpzdHJpbmcgbV9vcGVyYXRpb247CisgICAgICAgIH07CisKKyAgICAgICAg c3RydWN0IEVxdWFsc01hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBF cXVhbHNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAg ICAgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IG92ZXJyaWRl OworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgQ29udGFpbnNNYXRjaGVyIDogU3RyaW5nTWF0 Y2hlckJhc2UgeworICAgICAgICAgICAgQ29udGFpbnNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25z dCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29u c3QmIHNvdXJjZSApIGNvbnN0IG92ZXJyaWRlOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3Qg U3RhcnRzV2l0aE1hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBTdGFy dHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAg ICAgIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBvdmVycmlk ZTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IEVuZHNXaXRoTWF0Y2hlciA6IFN0cmluZ01h dGNoZXJCYXNlIHsKKyAgICAgICAgICAgIEVuZHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29u c3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNv bnN0JiBzb3VyY2UgKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1 Y3QgUmVnZXhNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IHsKKyAgICAgICAgICAg IFJlZ2V4TWF0Y2hlciggc3RkOjpzdHJpbmcgcmVnZXgsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBj YXNlU2Vuc2l0aXZpdHkgKTsKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNv bnN0JiBtYXRjaGVlICkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBk ZXNjcmliZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAg ICBzdGQ6OnN0cmluZyBtX3JlZ2V4OworICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNl IG1fY2FzZVNlbnNpdGl2aXR5OworICAgICAgICB9OworCisgICAgfSAvLyBuYW1lc3BhY2UgU3Rk U3RyaW5nCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVh bCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGlu ZmVycmVkCisKKyAgICBTdGRTdHJpbmc6OkVxdWFsc01hdGNoZXIgRXF1YWxzKCBzdGQ6OnN0cmlu ZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2Fz ZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIgQ29udGFp bnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vu c2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OkVuZHNXaXRo TWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6 Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0 cmluZzo6U3RhcnRzV2l0aE1hdGNoZXIgU3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0 ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6 OlllcyApOworICAgIFN0ZFN0cmluZzo6UmVnZXhNYXRjaGVyIE1hdGNoZXMoIHN0ZDo6c3RyaW5n IGNvbnN0JiByZWdleCwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENh c2VTZW5zaXRpdmU6OlllcyApOworCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1l c3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX21hdGNoZXJzX3N0cmluZy5oCisvLyBzdGFydCBj YXRjaF9tYXRjaGVyc192ZWN0b3IuaAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3Bh Y2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBWZWN0b3Ig eworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvYz4KKyAgICAgICAg c3RydWN0IENvbnRhaW5zRWxlbWVudE1hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxU LCBBbGxvYz4+IHsKKworICAgICAgICAgICAgQ29udGFpbnNFbGVtZW50TWF0Y2hlcihUIGNvbnN0 ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvcikge30KKworICAgICAgICAg ICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxULCBBbGxvYz4gY29uc3QgJnYpIGNvbnN0IG92ZXJy aWRlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QmIGVsIDogdikgeworICAgICAg ICAgICAgICAgICAgICBpZiAoZWwgPT0gbV9jb21wYXJhdG9yKSB7CisgICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAg ICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAg ICAgICAgICAgIHJldHVybiAiQ29udGFpbnM6ICIgKyA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lm eSggbV9jb21wYXJhdG9yICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFQgY29uc3Qm IG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU LCB0eXBlbmFtZSBBbGxvY0NvbXAsIHR5cGVuYW1lIEFsbG9jTWF0Y2g+CisgICAgICAgIHN0cnVj dCBDb250YWluc01hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxULCBBbGxvY01hdGNo Pj4geworCisgICAgICAgICAgICBDb250YWluc01hdGNoZXIoc3RkOjp2ZWN0b3I8VCwgQWxsb2ND b21wPiBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSB7fQor CisgICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9yPFQsIEFsbG9jTWF0Y2g+IGNvbnN0 ICZ2KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgLy8gIVRCRDogc2VlIG5vdGUg aW4gRXF1YWxzTWF0Y2hlcgorICAgICAgICAgICAgICAgIGlmIChtX2NvbXBhcmF0b3Iuc2l6ZSgp ID4gdi5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg ICAgICAgICBmb3IgKGF1dG8gY29uc3QmIGNvbXBhcmF0b3IgOiBtX2NvbXBhcmF0b3IpIHsKKyAg ICAgICAgICAgICAgICAgICAgYXV0byBwcmVzZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAg ICAgIGZvciAoY29uc3QgYXV0byYgZWwgOiB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBp ZiAoZWwgPT0gY29tcGFyYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNl bnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg ICAgIGlmICghcHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg ICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcg ZGVzY3JpYmUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJDb250 YWluczogIiArIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCBtX2NvbXBhcmF0b3IgKTsKKyAg ICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VCwgQWxsb2NDb21wPiBjb25z dCYgbV9jb21wYXJhdG9yOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1l IFQsIHR5cGVuYW1lIEFsbG9jQ29tcCwgdHlwZW5hbWUgQWxsb2NNYXRjaD4KKyAgICAgICAgc3Ry dWN0IEVxdWFsc01hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxULCBBbGxvY01hdGNo Pj4geworCisgICAgICAgICAgICBFcXVhbHNNYXRjaGVyKHN0ZDo6dmVjdG9yPFQsIEFsbG9jQ29t cD4gY29uc3QgJmNvbXBhcmF0b3IpIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yICkge30KKwor ICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxULCBBbGxvY01hdGNoPiBjb25zdCAm dikgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIC8vICFUQkQ6IFRoaXMgY3VycmVu dGx5IHdvcmtzIGlmIGFsbCBlbGVtZW50cyBjYW4gYmUgY29tcGFyZWQgdXNpbmcgIT0KKyAgICAg ICAgICAgICAgICAvLyAtIGEgbW9yZSBnZW5lcmFsIGFwcHJvYWNoIHdvdWxkIGJlIHZpYSBhIGNv bXBhcmUgdGVtcGxhdGUgdGhhdCBkZWZhdWx0cworICAgICAgICAgICAgICAgIC8vIHRvIHVzaW5n ICE9LiBidXQgY291bGQgYmUgc3BlY2lhbGlzZWQgZm9yLCBlLmcuIHN0ZDo6dmVjdG9yPFQsIEFs bG9jPiBldGMKKyAgICAgICAgICAgICAgICAvLyAtIHRoZW4ganVzdCBjYWxsIHRoYXQgZGlyZWN0 bHkKKyAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yLnNpemUoKSAhPSB2LnNpemUoKSkK KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAo c3RkOjpzaXplX3QgaSA9IDA7IGkgPCB2LnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAg ICBpZiAobV9jb21wYXJhdG9yW2ldICE9IHZbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9 CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAg ICAgICAgICAgICAgICByZXR1cm4gIkVxdWFsczogIiArIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5n aWZ5KCBtX2NvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6dmVj dG9yPFQsIEFsbG9jQ29tcD4gY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAg ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvY0NvbXAsIHR5cGVuYW1lIEFs bG9jTWF0Y2g+CisgICAgICAgIHN0cnVjdCBBcHByb3hNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3Rk Ojp2ZWN0b3I8VCwgQWxsb2NNYXRjaD4+IHsKKworICAgICAgICAgICAgQXBwcm94TWF0Y2hlcihz dGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+IGNvbnN0JiBjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRv ciggY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8 VCwgQWxsb2NNYXRjaD4gY29uc3QgJnYpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAg ICBpZiAobV9jb21wYXJhdG9yLnNpemUoKSAhPSB2LnNpemUoKSkKKyAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7 IGkgPCB2LnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9y W2ldICE9IGFwcHJveCh2W2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg ICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAg ICAgIHJldHVybiAiaXMgYXBwcm94OiAiICsgOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoIG1f Y29tcGFyYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVu YW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJs ZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgICAgIEFwcHJveE1hdGNoZXImIGVwc2lsb24o IFQgY29uc3QmIG5ld0Vwc2lsb24gKSB7CisgICAgICAgICAgICAgICAgYXBwcm94LmVwc2lsb24o bmV3RXBzaWxvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAg fQorICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVf aWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAg ICAgICAgIEFwcHJveE1hdGNoZXImIG1hcmdpbiggVCBjb25zdCYgbmV3TWFyZ2luICkgeworICAg ICAgICAgICAgICAgIGFwcHJveC5tYXJnaW4obmV3TWFyZ2luKTsKKyAgICAgICAgICAgICAgICBy ZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5h bWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91Ymxl LCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICAgICAgQXBwcm94TWF0Y2hlciYgc2NhbGUoIFQg Y29uc3QmIG5ld1NjYWxlICkgeworICAgICAgICAgICAgICAgIGFwcHJveC5zY2FsZShuZXdTY2Fs ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAg ICAgICAgICBzdGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+IGNvbnN0JiBtX2NvbXBhcmF0b3I7Cisg ICAgICAgICAgICBtdXRhYmxlIENhdGNoOjpEZXRhaWw6OkFwcHJveCBhcHByb3ggPSBDYXRjaDo6 RGV0YWlsOjpBcHByb3g6OmN1c3RvbSgpOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRl PHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jQ29tcCwgdHlwZW5hbWUgQWxsb2NNYXRjaD4KKyAg ICAgICAgc3RydWN0IFVub3JkZXJlZEVxdWFsc01hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZl Y3RvcjxULCBBbGxvY01hdGNoPj4geworICAgICAgICAgICAgVW5vcmRlcmVkRXF1YWxzTWF0Y2hl cihzdGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+IGNvbnN0JiB0YXJnZXQpIDogbV90YXJnZXQodGFy Z2V0KSB7fQorICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxULCBBbGxvY01hdGNo PiBjb25zdCYgdmVjKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgaWYgKG1fdGFy Z2V0LnNpemUoKSAhPSB2ZWMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBm YWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6aXNf cGVybXV0YXRpb24obV90YXJnZXQuYmVnaW4oKSwgbV90YXJnZXQuZW5kKCksIHZlYy5iZWdpbigp KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBj b25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbm9yZGVyZWRFcXVhbHM6 ICIgKyA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShtX3RhcmdldCk7CisgICAgICAgICAgICB9 CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+ IGNvbnN0JiBtX3RhcmdldDsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIFZlY3Rv cgorCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0 Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJl ZAorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2NDb21wID0gc3RkOjph bGxvY2F0b3I8VD4sIHR5cGVuYW1lIEFsbG9jTWF0Y2ggPSBBbGxvY0NvbXA+CisgICAgVmVjdG9y OjpDb250YWluc01hdGNoZXI8VCwgQWxsb2NDb21wLCBBbGxvY01hdGNoPiBDb250YWlucyggc3Rk Ojp2ZWN0b3I8VCwgQWxsb2NDb21wPiBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0 dXJuIFZlY3Rvcjo6Q29udGFpbnNNYXRjaGVyPFQsIEFsbG9jQ29tcCwgQWxsb2NNYXRjaD4oIGNv bXBhcmF0b3IgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBB bGxvYyA9IHN0ZDo6YWxsb2NhdG9yPFQ+PgorICAgIFZlY3Rvcjo6Q29udGFpbnNFbGVtZW50TWF0 Y2hlcjxULCBBbGxvYz4gVmVjdG9yQ29udGFpbnMoIFQgY29uc3QmIGNvbXBhcmF0b3IgKSB7Cisg ICAgICAgIHJldHVybiBWZWN0b3I6OkNvbnRhaW5zRWxlbWVudE1hdGNoZXI8VCwgQWxsb2M+KCBj b21wYXJhdG9yICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUg QWxsb2NDb21wID0gc3RkOjphbGxvY2F0b3I8VD4sIHR5cGVuYW1lIEFsbG9jTWF0Y2ggPSBBbGxv Y0NvbXA+CisgICAgVmVjdG9yOjpFcXVhbHNNYXRjaGVyPFQsIEFsbG9jQ29tcCwgQWxsb2NNYXRj aD4gRXF1YWxzKCBzdGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+IGNvbnN0JiBjb21wYXJhdG9yICkg eworICAgICAgICByZXR1cm4gVmVjdG9yOjpFcXVhbHNNYXRjaGVyPFQsIEFsbG9jQ29tcCwgQWxs b2NNYXRjaD4oIGNvbXBhcmF0b3IgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU LCB0eXBlbmFtZSBBbGxvY0NvbXAgPSBzdGQ6OmFsbG9jYXRvcjxUPiwgdHlwZW5hbWUgQWxsb2NN YXRjaCA9IEFsbG9jQ29tcD4KKyAgICBWZWN0b3I6OkFwcHJveE1hdGNoZXI8VCwgQWxsb2NDb21w LCBBbGxvY01hdGNoPiBBcHByb3goIHN0ZDo6dmVjdG9yPFQsIEFsbG9jQ29tcD4gY29uc3QmIGNv bXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkFwcHJveE1hdGNoZXI8VCwgQWxs b2NDb21wLCBBbGxvY01hdGNoPiggY29tcGFyYXRvciApOworICAgIH0KKworICAgIHRlbXBsYXRl PHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jQ29tcCA9IHN0ZDo6YWxsb2NhdG9yPFQ+LCB0eXBl bmFtZSBBbGxvY01hdGNoID0gQWxsb2NDb21wPgorICAgIFZlY3Rvcjo6VW5vcmRlcmVkRXF1YWxz TWF0Y2hlcjxULCBBbGxvY0NvbXAsIEFsbG9jTWF0Y2g+IFVub3JkZXJlZEVxdWFscyhzdGQ6OnZl Y3RvcjxULCBBbGxvY0NvbXA+IGNvbnN0JiB0YXJnZXQpIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rv cjo6VW5vcmRlcmVkRXF1YWxzTWF0Y2hlcjxULCBBbGxvY0NvbXAsIEFsbG9jTWF0Y2g+KCB0YXJn ZXQgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCit9IC8vIG5hbWVzcGFjZSBD YXRjaAorCisvLyBlbmQgY2F0Y2hfbWF0Y2hlcnNfdmVjdG9yLmgKK25hbWVzcGFjZSBDYXRjaCB7 CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZSBNYXRjaGVyVD4KKyAgICBj bGFzcyBNYXRjaEV4cHIgOiBwdWJsaWMgSVRyYW5zaWVudEV4cHJlc3Npb24geworICAgICAgICBB cmdUIGNvbnN0JiBtX2FyZzsKKyAgICAgICAgTWF0Y2hlclQgbV9tYXRjaGVyOworICAgICAgICBT dHJpbmdSZWYgbV9tYXRjaGVyU3RyaW5nOworICAgIHB1YmxpYzoKKyAgICAgICAgTWF0Y2hFeHBy KCBBcmdUIGNvbnN0JiBhcmcsIE1hdGNoZXJUIGNvbnN0JiBtYXRjaGVyLCBTdHJpbmdSZWYgY29u c3QmIG1hdGNoZXJTdHJpbmcgKQorICAgICAgICA6ICAgSVRyYW5zaWVudEV4cHJlc3Npb257IHRy dWUsIG1hdGNoZXIubWF0Y2goIGFyZyApIH0sCisgICAgICAgICAgICBtX2FyZyggYXJnICksCisg ICAgICAgICAgICBtX21hdGNoZXIoIG1hdGNoZXIgKSwKKyAgICAgICAgICAgIG1fbWF0Y2hlclN0 cmluZyggbWF0Y2hlclN0cmluZyApCisgICAgICAgIHt9CisKKyAgICAgICAgdm9pZCBzdHJlYW1S ZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiggc3RkOjpvc3RyZWFtICZvcyApIGNvbnN0IG92ZXJyaWRl IHsKKyAgICAgICAgICAgIGF1dG8gbWF0Y2hlckFzU3RyaW5nID0gbV9tYXRjaGVyLnRvU3RyaW5n KCk7CisgICAgICAgICAgICBvcyA8PCBDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoIG1fYXJnICkg PDwgJyAnOworICAgICAgICAgICAgaWYoIG1hdGNoZXJBc1N0cmluZyA9PSBEZXRhaWw6OnVucHJp bnRhYmxlU3RyaW5nICkKKyAgICAgICAgICAgICAgICBvcyA8PCBtX21hdGNoZXJTdHJpbmc7Cisg ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3MgPDwgbWF0Y2hlckFzU3RyaW5nOwor ICAgICAgICB9CisgICAgfTsKKworICAgIHVzaW5nIFN0cmluZ01hdGNoZXIgPSBNYXRjaGVyczo6 SW1wbDo6TWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+OworCisgICAgdm9pZCBoYW5kbGVFeGNlcHRp b25NYXRjaEV4cHIoIEFzc2VydGlvbkhhbmRsZXImIGhhbmRsZXIsIFN0cmluZ01hdGNoZXIgY29u c3QmIG1hdGNoZXIsIFN0cmluZ1JlZiBjb25zdCYgbWF0Y2hlclN0cmluZyAgKTsKKworICAgIHRl bXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorICAgIGF1dG8gbWFrZU1h dGNoRXhwciggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBjb25zdCYgbWF0Y2hlciwgU3RyaW5n UmVmIGNvbnN0JiBtYXRjaGVyU3RyaW5nICApIC0+IE1hdGNoRXhwcjxBcmdULCBNYXRjaGVyVD4g eworICAgICAgICByZXR1cm4gTWF0Y2hFeHByPEFyZ1QsIE1hdGNoZXJUPiggYXJnLCBtYXRjaGVy LCBtYXRjaGVyU3RyaW5nICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NIRUNLX1RIQVQoIG1hY3JvTmFt ZSwgbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24sIGFyZyApIFwKKyAgICBkbyB7IFwKKyAgICAg ICAgQ2F0Y2g6OkFzc2VydGlvbkhhbmRsZXIgY2F0Y2hBc3NlcnRpb25IYW5kbGVyKCBtYWNyb05h bWUjI19jYXRjaF9zciwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENBVENIX0lOVEVSTkFMX1NU UklOR0lGWShhcmcpICIsICIgQ0FUQ0hfSU5URVJOQUxfU1RSSU5HSUZZKG1hdGNoZXIpLCByZXN1 bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RSWSB7IFwKKyAgICAg ICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVFeHByKCBDYXRjaDo6bWFrZU1hdGNo RXhwciggYXJnLCBtYXRjaGVyLCAjbWF0Y2hlciMjX2NhdGNoX3NyICkgKTsgXAorICAgICAgICB9 IElOVEVSTkFMX0NBVENIX0NBVENIKCBjYXRjaEFzc2VydGlvbkhhbmRsZXIgKSBcCisgICAgICAg IElOVEVSTkFMX0NBVENIX1JFQUNUKCBjYXRjaEFzc2VydGlvbkhhbmRsZXIgKSBcCisgICAgfSB3 aGlsZSggZmFsc2UgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFM X0NBVENIX1RIUk9XU19NQVRDSEVTKCBtYWNyb05hbWUsIGV4Y2VwdGlvblR5cGUsIHJlc3VsdERp c3Bvc2l0aW9uLCBtYXRjaGVyLCAuLi4gKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpB c3NlcnRpb25IYW5kbGVyIGNhdGNoQXNzZXJ0aW9uSGFuZGxlciggbWFjcm9OYW1lIyNfY2F0Y2hf c3IsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDQVRDSF9JTlRFUk5BTF9TVFJJTkdJRlkoX19W QV9BUkdTX18pICIsICIgQ0FUQ0hfSU5URVJOQUxfU1RSSU5HSUZZKGV4Y2VwdGlvblR5cGUpICIs ICIgQ0FUQ0hfSU5URVJOQUxfU1RSSU5HSUZZKG1hdGNoZXIpLCByZXN1bHREaXNwb3NpdGlvbiAp OyBcCisgICAgICAgIGlmKCBjYXRjaEFzc2VydGlvbkhhbmRsZXIuYWxsb3dUaHJvd3MoKSApIFwK KyAgICAgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihf X1ZBX0FSR1NfXyApOyBcCisgICAgICAgICAgICAgICAgY2F0Y2hBc3NlcnRpb25IYW5kbGVyLmhh bmRsZVVuZXhwZWN0ZWRFeGNlcHRpb25Ob3RUaHJvd24oKTsgXAorICAgICAgICAgICAgfSBcCisg ICAgICAgICAgICBjYXRjaCggZXhjZXB0aW9uVHlwZSBjb25zdCYgZXggKSB7IFwKKyAgICAgICAg ICAgICAgICBjYXRjaEFzc2VydGlvbkhhbmRsZXIuaGFuZGxlRXhwciggQ2F0Y2g6Om1ha2VNYXRj aEV4cHIoIGV4LCBtYXRjaGVyLCAjbWF0Y2hlciMjX2NhdGNoX3NyICkgKTsgXAorICAgICAgICAg ICAgfSBcCisgICAgICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICAgICAgY2F0 Y2hBc3NlcnRpb25IYW5kbGVyLmhhbmRsZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2VwdGlvbigpOyBc CisgICAgICAgICAgICB9IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBjYXRjaEFzc2Vy dGlvbkhhbmRsZXIuaGFuZGxlVGhyb3dpbmdDYWxsU2tpcHBlZCgpOyBcCisgICAgICAgIElOVEVS TkFMX0NBVENIX1JFQUNUKCBjYXRjaEFzc2VydGlvbkhhbmRsZXIgKSBcCisgICAgfSB3aGlsZSgg ZmFsc2UgKQorCisvLyBlbmQgY2F0Y2hfY2FwdHVyZV9tYXRjaGVycy5oCisjZW5kaWYKKy8vIHN0 YXJ0IGNhdGNoX2dlbmVyYXRvcnMuaHBwCisKKy8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfZ2Vu ZXJhdG9ydHJhY2tlci5oCisKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIENhdGNo IHsKKworICAgIG5hbWVzcGFjZSBHZW5lcmF0b3JzIHsKKyAgICAgICAgY2xhc3MgR2VuZXJhdG9y VW50eXBlZEJhc2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBHZW5lcmF0b3JVbnR5 cGVkQmFzZSgpID0gZGVmYXVsdDsKKyAgICAgICAgICAgIHZpcnR1YWwgfkdlbmVyYXRvclVudHlw ZWRCYXNlKCk7CisgICAgICAgICAgICAvLyBBdHRlbXB0cyB0byBtb3ZlIHRoZSBnZW5lcmF0b3Ig dG8gdGhlIG5leHQgZWxlbWVudAorICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgLy8gUmV0 dXJucyB0cnVlIGlmZiB0aGUgbW92ZSBzdWNjZWVkZWQgKGFuZCBhIHZhbGlkIGVsZW1lbnQKKyAg ICAgICAgICAgICAvLyBjYW4gYmUgcmV0cmlldmVkKS4KKyAgICAgICAgICAgIHZpcnR1YWwgYm9v bCBuZXh0KCkgPSAwOworICAgICAgICB9OworICAgICAgICB1c2luZyBHZW5lcmF0b3JCYXNlUHRy ID0gc3RkOjp1bmlxdWVfcHRyPEdlbmVyYXRvclVudHlwZWRCYXNlPjsKKworICAgIH0gLy8gbmFt ZXNwYWNlIEdlbmVyYXRvcnMKKworICAgIHN0cnVjdCBJR2VuZXJhdG9yVHJhY2tlciB7CisgICAg ICAgIHZpcnR1YWwgfklHZW5lcmF0b3JUcmFja2VyKCk7CisgICAgICAgIHZpcnR1YWwgYXV0byBo YXNHZW5lcmF0b3IoKSBjb25zdCAtPiBib29sID0gMDsKKyAgICAgICAgdmlydHVhbCBhdXRvIGdl dEdlbmVyYXRvcigpIGNvbnN0IC0+IEdlbmVyYXRvcnM6OkdlbmVyYXRvckJhc2VQdHIgY29uc3Qm ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldEdlbmVyYXRvciggR2VuZXJhdG9yczo6R2Vu ZXJhdG9yQmFzZVB0ciYmIGdlbmVyYXRvciApID0gMDsKKyAgICB9OworCit9IC8vIG5hbWVzcGFj ZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfaW50ZXJmYWNlc19nZW5lcmF0b3J0cmFja2VyLmgKKy8v IHN0YXJ0IGNhdGNoX2VuZm9yY2UuaAorCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorCituYW1lc3Bh Y2UgQ2F0Y2ggeworI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFX0VYQ0VQVElPTlMp CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4PgorICAgIFtbbm9yZXR1cm5dXQorICAgIHZvaWQg dGhyb3dfZXhjZXB0aW9uKEV4IGNvbnN0JiBlKSB7CisgICAgICAgIHRocm93IGU7CisgICAgfQor I2Vsc2UgLy8gXl4gRXhjZXB0aW9ucyBhcmUgZW5hYmxlZCAvLyAgRXhjZXB0aW9ucyBhcmUgZGlz YWJsZWQgdnYKKyAgICBbW25vcmV0dXJuXV0KKyAgICB2b2lkIHRocm93X2V4Y2VwdGlvbihzdGQ6 OmV4Y2VwdGlvbiBjb25zdCYgZSk7CisjZW5kaWYKKworICAgIFtbbm9yZXR1cm5dXQorICAgIHZv aWQgdGhyb3dfbG9naWNfZXJyb3Ioc3RkOjpzdHJpbmcgY29uc3QmIG1zZyk7CisgICAgW1tub3Jl dHVybl1dCisgICAgdm9pZCB0aHJvd19kb21haW5fZXJyb3Ioc3RkOjpzdHJpbmcgY29uc3QmIG1z Zyk7CisgICAgW1tub3JldHVybl1dCisgICAgdm9pZCB0aHJvd19ydW50aW1lX2Vycm9yKHN0ZDo6 c3RyaW5nIGNvbnN0JiBtc2cpOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaDsKKworI2RlZmluZSBD QVRDSF9NQUtFX01TRyguLi4pIFwKKyAgICAoQ2F0Y2g6OlJldXNhYmxlU3RyaW5nU3RyZWFtKCkg PDwgX19WQV9BUkdTX18pLnN0cigpCisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfRVJST1IoLi4u KSBcCisgICAgQ2F0Y2g6OnRocm93X2xvZ2ljX2Vycm9yKENBVENIX01BS0VfTVNHKCBDQVRDSF9J TlRFUk5BTF9MSU5FSU5GTyA8PCAiOiBJbnRlcm5hbCBDYXRjaDIgZXJyb3I6ICIgPDwgX19WQV9B UkdTX18pKQorCisjZGVmaW5lIENBVENIX0VSUk9SKC4uLikgXAorICAgIENhdGNoOjp0aHJvd19k b21haW5fZXJyb3IoQ0FUQ0hfTUFLRV9NU0coIF9fVkFfQVJHU19fICkpCisKKyNkZWZpbmUgQ0FU Q0hfUlVOVElNRV9FUlJPUiguLi4pIFwKKyAgICBDYXRjaDo6dGhyb3dfcnVudGltZV9lcnJvcihD QVRDSF9NQUtFX01TRyggX19WQV9BUkdTX18gKSkKKworI2RlZmluZSBDQVRDSF9FTkZPUkNFKCBj b25kaXRpb24sIC4uLiApIFwKKyAgICBkb3sgaWYoICEoY29uZGl0aW9uKSApIENBVENIX0VSUk9S KCBfX1ZBX0FSR1NfXyApOyB9IHdoaWxlKGZhbHNlKQorCisvLyBlbmQgY2F0Y2hfZW5mb3JjZS5o CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjYXNzZXJ0 PgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxleGNlcHRpb24+CisKK25hbWVzcGFj ZSBDYXRjaCB7CisKK2NsYXNzIEdlbmVyYXRvckV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2Vw dGlvbiB7CisgICAgY29uc3QgY2hhciogY29uc3QgbV9tc2cgPSAiIjsKKworcHVibGljOgorICAg IEdlbmVyYXRvckV4Y2VwdGlvbihjb25zdCBjaGFyKiBtc2cpOgorICAgICAgICBtX21zZyhtc2cp CisgICAge30KKworICAgIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCBvdmVycmlk ZSBmaW5hbDsKK307CisKK25hbWVzcGFjZSBHZW5lcmF0b3JzIHsKKworICAgIC8vICFUQkQgbW92 ZSB0aGlzIGludG8gaXRzIG93biBsb2NhdGlvbj8KKyAgICBuYW1lc3BhY2UgcGZ7CisgICAgICAg IHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgICAgIHN0ZDo6dW5p cXVlX3B0cjxUPiBtYWtlX3VuaXF1ZSggQXJncyYmLi4uIGFyZ3MgKSB7CisgICAgICAgICAgICBy ZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFQ+KG5ldyBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4u LikpOworICAgICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBz dHJ1Y3QgSUdlbmVyYXRvciA6IEdlbmVyYXRvclVudHlwZWRCYXNlIHsKKyAgICAgICAgdmlydHVh bCB+SUdlbmVyYXRvcigpID0gZGVmYXVsdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBjdXJy ZW50IGVsZW1lbnQgb2YgdGhlIGdlbmVyYXRvcgorICAgICAgICAvLworICAgICAgICAvLyBcUHJl Y29uZGl0aW9uIFRoZSBnZW5lcmF0b3IgaXMgZWl0aGVyIGZyZXNobHkgY29uc3RydWN0ZWQsCisg ICAgICAgIC8vIG9yIHRoZSBsYXN0IGNhbGwgdG8gYG5leHQoKWAgcmV0dXJuZWQgdHJ1ZQorICAg ICAgICB2aXJ0dWFsIFQgY29uc3QmIGdldCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdXNpbmcgdHlw ZSA9IFQ7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgU2lu Z2xlVmFsdWVHZW5lcmF0b3IgZmluYWwgOiBwdWJsaWMgSUdlbmVyYXRvcjxUPiB7CisgICAgICAg IFQgbV92YWx1ZTsKKyAgICBwdWJsaWM6CisgICAgICAgIFNpbmdsZVZhbHVlR2VuZXJhdG9yKFQm JiB2YWx1ZSkgOiBtX3ZhbHVlKHN0ZDo6bW92ZSh2YWx1ZSkpIHt9CisKKyAgICAgICAgVCBjb25z dCYgZ2V0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWU7Cisg ICAgICAgIH0KKyAgICAgICAgYm9vbCBuZXh0KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0 dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+ CisgICAgY2xhc3MgRml4ZWRWYWx1ZXNHZW5lcmF0b3IgZmluYWwgOiBwdWJsaWMgSUdlbmVyYXRv cjxUPiB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxULCBib29sPjo6dmFs dWUsCisgICAgICAgICAgICAiRml4ZWRWYWx1ZXNHZW5lcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCBi b29scyBiZWNhdXNlIG9mIHN0ZDo6dmVjdG9yPGJvb2w+IgorICAgICAgICAgICAgInNwZWNpYWxp emF0aW9uLCB1c2UgU2luZ2xlVmFsdWUgR2VuZXJhdG9yIGluc3RlYWQuIik7CisgICAgICAgIHN0 ZDo6dmVjdG9yPFQ+IG1fdmFsdWVzOworICAgICAgICBzaXplX3QgbV9pZHggPSAwOworICAgIHB1 YmxpYzoKKyAgICAgICAgRml4ZWRWYWx1ZXNHZW5lcmF0b3IoIHN0ZDo6aW5pdGlhbGl6ZXJfbGlz dDxUPiB2YWx1ZXMgKSA6IG1fdmFsdWVzKCB2YWx1ZXMgKSB7fQorCisgICAgICAgIFQgY29uc3Qm IGdldCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlc1ttX2lk eF07CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBuZXh0KCkgb3ZlcnJpZGUgeworICAgICAgICAg ICAgKyttX2lkeDsKKyAgICAgICAgICAgIHJldHVybiBtX2lkeCA8IG1fdmFsdWVzLnNpemUoKTsK KyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBjbGFz cyBHZW5lcmF0b3JXcmFwcGVyIGZpbmFsIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElHZW5l cmF0b3I8VD4+IG1fZ2VuZXJhdG9yOworICAgIHB1YmxpYzoKKyAgICAgICAgR2VuZXJhdG9yV3Jh cHBlcihzdGQ6OnVuaXF1ZV9wdHI8SUdlbmVyYXRvcjxUPj4gZ2VuZXJhdG9yKToKKyAgICAgICAg ICAgIG1fZ2VuZXJhdG9yKHN0ZDo6bW92ZShnZW5lcmF0b3IpKQorICAgICAgICB7fQorICAgICAg ICBUIGNvbnN0JiBnZXQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9nZW5lcmF0b3It PmdldCgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgbmV4dCgpIHsKKyAgICAgICAgICAgIHJl dHVybiBtX2dlbmVyYXRvci0+bmV4dCgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBs YXRlIDx0eXBlbmFtZSBUPgorICAgIEdlbmVyYXRvcldyYXBwZXI8VD4gdmFsdWUoVCYmIHZhbHVl KSB7CisgICAgICAgIHJldHVybiBHZW5lcmF0b3JXcmFwcGVyPFQ+KHBmOjptYWtlX3VuaXF1ZTxT aW5nbGVWYWx1ZUdlbmVyYXRvcjxUPj4oc3RkOjpmb3J3YXJkPFQ+KHZhbHVlKSkpOworICAgIH0K KyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBHZW5lcmF0b3JXcmFwcGVyPFQ+IHZhbHVl cyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBHZW5l cmF0b3JXcmFwcGVyPFQ+KHBmOjptYWtlX3VuaXF1ZTxGaXhlZFZhbHVlc0dlbmVyYXRvcjxUPj4o dmFsdWVzKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBH ZW5lcmF0b3JzIDogcHVibGljIElHZW5lcmF0b3I8VD4geworICAgICAgICBzdGQ6OnZlY3RvcjxH ZW5lcmF0b3JXcmFwcGVyPFQ+PiBtX2dlbmVyYXRvcnM7CisgICAgICAgIHNpemVfdCBtX2N1cnJl bnQgPSAwOworCisgICAgICAgIHZvaWQgcG9wdWxhdGUoR2VuZXJhdG9yV3JhcHBlcjxUPiYmIGdl bmVyYXRvcikgeworICAgICAgICAgICAgbV9nZW5lcmF0b3JzLmVtcGxhY2VfYmFjayhzdGQ6Om1v dmUoZ2VuZXJhdG9yKSk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwb3B1bGF0ZShUJiYgdmFs KSB7CisgICAgICAgICAgICBtX2dlbmVyYXRvcnMuZW1wbGFjZV9iYWNrKHZhbHVlKHN0ZDo6Zm9y d2FyZDxUPih2YWwpKSk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4K KyAgICAgICAgdm9pZCBwb3B1bGF0ZShVJiYgdmFsKSB7CisgICAgICAgICAgICBwb3B1bGF0ZShU KHN0ZDo6Zm9yd2FyZDxVPih2YWwpKSk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlw ZW5hbWUgVSwgdHlwZW5hbWUuLi4gR3M+CisgICAgICAgIHZvaWQgcG9wdWxhdGUoVSYmIHZhbHVl T3JHZW5lcmF0b3IsIEdzICYmLi4uIG1vcmVHZW5lcmF0b3JzKSB7CisgICAgICAgICAgICBwb3B1 bGF0ZShzdGQ6OmZvcndhcmQ8VT4odmFsdWVPckdlbmVyYXRvcikpOworICAgICAgICAgICAgcG9w dWxhdGUoc3RkOjpmb3J3YXJkPEdzPihtb3JlR2VuZXJhdG9ycykuLi4pOworICAgICAgICB9CisK KyAgICBwdWJsaWM6CisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBHcz4KKyAgICAgICAg R2VuZXJhdG9ycyhHcyAmJi4uLiBtb3JlR2VuZXJhdG9ycykgeworICAgICAgICAgICAgbV9nZW5l cmF0b3JzLnJlc2VydmUoc2l6ZW9mLi4uKEdzKSk7CisgICAgICAgICAgICBwb3B1bGF0ZShzdGQ6 OmZvcndhcmQ8R3M+KG1vcmVHZW5lcmF0b3JzKS4uLik7CisgICAgICAgIH0KKworICAgICAgICBU IGNvbnN0JiBnZXQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICByZXR1cm4gbV9nZW5l cmF0b3JzW21fY3VycmVudF0uZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIG5leHQo KSBvdmVycmlkZSB7CisgICAgICAgICAgICBpZiAobV9jdXJyZW50ID49IG1fZ2VuZXJhdG9ycy5z aXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgICBjb25zdCBib29sIGN1cnJlbnRfc3RhdHVzID0gbV9nZW5lcmF0b3JzW21fY3Vy cmVudF0ubmV4dCgpOworICAgICAgICAgICAgaWYgKCFjdXJyZW50X3N0YXR1cykgeworICAgICAg ICAgICAgICAgICsrbV9jdXJyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJu IG1fY3VycmVudCA8IG1fZ2VuZXJhdG9ycy5zaXplKCk7CisgICAgICAgIH0KKyAgICB9OworCisg ICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+CisgICAgR2VuZXJhdG9yV3JhcHBlcjxzdGQ6OnR1 cGxlPFRzLi4uPj4gdGFibGUoIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnR1cGxlPHR5cGVu YW1lIHN0ZDo6ZGVjYXk8VHM+Ojp0eXBlLi4uPj4gdHVwbGVzICkgeworICAgICAgICByZXR1cm4g dmFsdWVzPHN0ZDo6dHVwbGU8VHMuLi4+PiggdHVwbGVzICk7CisgICAgfQorCisgICAgLy8gVGFn IHR5cGUgdG8gc2lnbmFsIHRoYXQgYSBnZW5lcmF0b3Igc2VxdWVuY2Ugc2hvdWxkIGNvbnZlcnQg YXJndW1lbnRzIHRvIGEgc3BlY2lmaWMgdHlwZQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgor ICAgIHN0cnVjdCBhcyB7fTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4u IEdzPgorICAgIGF1dG8gbWFrZUdlbmVyYXRvcnMoIEdlbmVyYXRvcldyYXBwZXI8VD4mJiBnZW5l cmF0b3IsIEdzICYmLi4uIG1vcmVHZW5lcmF0b3JzICkgLT4gR2VuZXJhdG9yczxUPiB7CisgICAg ICAgIHJldHVybiBHZW5lcmF0b3JzPFQ+KHN0ZDo6bW92ZShnZW5lcmF0b3IpLCBzdGQ6OmZvcndh cmQ8R3M+KG1vcmVHZW5lcmF0b3JzKS4uLik7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1l IFQ+CisgICAgYXV0byBtYWtlR2VuZXJhdG9ycyggR2VuZXJhdG9yV3JhcHBlcjxUPiYmIGdlbmVy YXRvciApIC0+IEdlbmVyYXRvcnM8VD4geworICAgICAgICByZXR1cm4gR2VuZXJhdG9yczxUPihz dGQ6Om1vdmUoZ2VuZXJhdG9yKSk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5 cGVuYW1lLi4uIEdzPgorICAgIGF1dG8gbWFrZUdlbmVyYXRvcnMoIFQmJiB2YWwsIEdzICYmLi4u IG1vcmVHZW5lcmF0b3JzICkgLT4gR2VuZXJhdG9yczxUPiB7CisgICAgICAgIHJldHVybiBtYWtl R2VuZXJhdG9ycyggdmFsdWUoIHN0ZDo6Zm9yd2FyZDxUPiggdmFsICkgKSwgc3RkOjpmb3J3YXJk PEdzPiggbW9yZUdlbmVyYXRvcnMgKS4uLiApOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFt ZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBHcz4KKyAgICBhdXRvIG1ha2VHZW5lcmF0b3Jz KCBhczxUPiwgVSYmIHZhbCwgR3MgJiYuLi4gbW9yZUdlbmVyYXRvcnMgKSAtPiBHZW5lcmF0b3Jz PFQ+IHsKKyAgICAgICAgcmV0dXJuIG1ha2VHZW5lcmF0b3JzKCB2YWx1ZSggVCggc3RkOjpmb3J3 YXJkPFU+KCB2YWwgKSApICksIHN0ZDo6Zm9yd2FyZDxHcz4oIG1vcmVHZW5lcmF0b3JzICkuLi4g KTsKKyAgICB9CisKKyAgICBhdXRvIGFjcXVpcmVHZW5lcmF0b3JUcmFja2VyKCBTdHJpbmdSZWYg Z2VuZXJhdG9yTmFtZSwgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgLT4gSUdlbmVy YXRvclRyYWNrZXImOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTD4KKyAgICAvLyBOb3RlOiBU aGUgdHlwZSBhZnRlciAtPiBpcyB3ZWlyZCwgYmVjYXVzZSBWUzIwMTUgY2Fubm90IHBhcnNlCisg ICAgLy8gICAgICAgdGhlIGV4cHJlc3Npb24gdXNlZCBpbiB0aGUgdHlwZWRlZiBpbnNpZGUsIHdo ZW4gaXQgaXMgaW4KKyAgICAvLyAgICAgICByZXR1cm4gdHlwZS4gWWVhaC4KKyAgICBhdXRvIGdl bmVyYXRlKCBTdHJpbmdSZWYgZ2VuZXJhdG9yTmFtZSwgU291cmNlTGluZUluZm8gY29uc3QmIGxp bmVJbmZvLCBMIGNvbnN0JiBnZW5lcmF0b3JFeHByZXNzaW9uICkgLT4gZGVjbHR5cGUoc3RkOjpk ZWNsdmFsPGRlY2x0eXBlKGdlbmVyYXRvckV4cHJlc3Npb24oKSk+KCkuZ2V0KCkpIHsKKyAgICAg ICAgdXNpbmcgVW5kZXJseWluZ1R5cGUgPSB0eXBlbmFtZSBkZWNsdHlwZShnZW5lcmF0b3JFeHBy ZXNzaW9uKCkpOjp0eXBlOworCisgICAgICAgIElHZW5lcmF0b3JUcmFja2VyJiB0cmFja2VyID0g YWNxdWlyZUdlbmVyYXRvclRyYWNrZXIoIGdlbmVyYXRvck5hbWUsIGxpbmVJbmZvICk7CisgICAg ICAgIGlmICghdHJhY2tlci5oYXNHZW5lcmF0b3IoKSkgeworICAgICAgICAgICAgdHJhY2tlci5z ZXRHZW5lcmF0b3IocGY6Om1ha2VfdW5pcXVlPEdlbmVyYXRvcnM8VW5kZXJseWluZ1R5cGU+Pihn ZW5lcmF0b3JFeHByZXNzaW9uKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gY29uc3Qm IGdlbmVyYXRvciA9IHN0YXRpY19jYXN0PElHZW5lcmF0b3I8VW5kZXJseWluZ1R5cGU+IGNvbnN0 Jj4oICp0cmFja2VyLmdldEdlbmVyYXRvcigpICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3Iu Z2V0KCk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBHZW5lcmF0b3JzCit9IC8vIG5hbWVzcGFj ZSBDYXRjaAorCisjZGVmaW5lIEdFTkVSQVRFKCAuLi4gKSBcCisgICAgQ2F0Y2g6OkdlbmVyYXRv cnM6OmdlbmVyYXRlKCBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJWkUoSU5URVJOQUxfQ0FUQ0hfVU5J UVVFX05BTUUoZ2VuZXJhdG9yKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBbIF17IHVzaW5nIG5hbWVzcGFjZSBDYXRjaDo6R2VuZXJhdG9yczsgcmV0dXJuIG1ha2VH ZW5lcmF0b3JzKCBfX1ZBX0FSR1NfXyApOyB9ICkgLy9OT0xJTlQoZ29vZ2xlLWJ1aWxkLXVzaW5n LW5hbWVzcGFjZSkKKyNkZWZpbmUgR0VORVJBVEVfQ09QWSggLi4uICkgXAorICAgIENhdGNoOjpH ZW5lcmF0b3JzOjpnZW5lcmF0ZSggSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpFKElOVEVSTkFMX0NB VENIX1VOSVFVRV9OQU1FKGdlbmVyYXRvcikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgXAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgWz1deyB1c2luZyBuYW1lc3BhY2UgQ2F0Y2g6OkdlbmVyYXRvcnM7IHJldHVy biBtYWtlR2VuZXJhdG9ycyggX19WQV9BUkdTX18gKTsgfSApIC8vTk9MSU5UKGdvb2dsZS1idWls ZC11c2luZy1uYW1lc3BhY2UpCisjZGVmaW5lIEdFTkVSQVRFX1JFRiggLi4uICkgXAorICAgIENh dGNoOjpHZW5lcmF0b3JzOjpnZW5lcmF0ZSggSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpFKElOVEVS TkFMX0NBVENIX1VOSVFVRV9OQU1FKGdlbmVyYXRvcikpLCBcCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgXAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgWyZdeyB1c2luZyBuYW1lc3BhY2UgQ2F0Y2g6OkdlbmVyYXRvcnM7 IHJldHVybiBtYWtlR2VuZXJhdG9ycyggX19WQV9BUkdTX18gKTsgfSApIC8vTk9MSU5UKGdvb2ds ZS1idWlsZC11c2luZy1uYW1lc3BhY2UpCisKKy8vIGVuZCBjYXRjaF9nZW5lcmF0b3JzLmhwcAor Ly8gc3RhcnQgY2F0Y2hfZ2VuZXJhdG9yc19nZW5lcmljLmhwcAorCituYW1lc3BhY2UgQ2F0Y2gg eworbmFtZXNwYWNlIEdlbmVyYXRvcnMgeworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cisg ICAgY2xhc3MgVGFrZUdlbmVyYXRvciA6IHB1YmxpYyBJR2VuZXJhdG9yPFQ+IHsKKyAgICAgICAg R2VuZXJhdG9yV3JhcHBlcjxUPiBtX2dlbmVyYXRvcjsKKyAgICAgICAgc2l6ZV90IG1fcmV0dXJu ZWQgPSAwOworICAgICAgICBzaXplX3QgbV90YXJnZXQ7CisgICAgcHVibGljOgorICAgICAgICBU YWtlR2VuZXJhdG9yKHNpemVfdCB0YXJnZXQsIEdlbmVyYXRvcldyYXBwZXI8VD4mJiBnZW5lcmF0 b3IpOgorICAgICAgICAgICAgbV9nZW5lcmF0b3Ioc3RkOjptb3ZlKGdlbmVyYXRvcikpLAorICAg ICAgICAgICAgbV90YXJnZXQodGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQo dGFyZ2V0ICE9IDAgJiYgIkVtcHR5IGdlbmVyYXRvcnMgYXJlIG5vdCBhbGxvd2VkIik7CisgICAg ICAgIH0KKyAgICAgICAgVCBjb25zdCYgZ2V0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAg ICAgcmV0dXJuIG1fZ2VuZXJhdG9yLmdldCgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgbmV4 dCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICsrbV9yZXR1cm5lZDsKKyAgICAgICAgICAgIGlm IChtX3JldHVybmVkID49IG1fdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBhdXRvIHN1Y2Nlc3MgPSBtX2dl bmVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAvLyBJZiB0aGUgdW5kZXJseWluZyBnZW5lcmF0 b3IgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggdmFsdWVzCisgICAgICAgICAgICAvLyB0aGVuIHdl IGN1dCBzaG9ydCBhcyB3ZWxsCisgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAg ICAgICAgICBtX3JldHVybmVkID0gbV90YXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAg ICByZXR1cm4gc3VjY2VzczsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8dHlw ZW5hbWUgVD4KKyAgICBHZW5lcmF0b3JXcmFwcGVyPFQ+IHRha2Uoc2l6ZV90IHRhcmdldCwgR2Vu ZXJhdG9yV3JhcHBlcjxUPiYmIGdlbmVyYXRvcikgeworICAgICAgICByZXR1cm4gR2VuZXJhdG9y V3JhcHBlcjxUPihwZjo6bWFrZV91bmlxdWU8VGFrZUdlbmVyYXRvcjxUPj4odGFyZ2V0LCBzdGQ6 Om1vdmUoZ2VuZXJhdG9yKSkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0 eXBlbmFtZSBQcmVkaWNhdGU+CisgICAgY2xhc3MgRmlsdGVyR2VuZXJhdG9yIDogcHVibGljIElH ZW5lcmF0b3I8VD4geworICAgICAgICBHZW5lcmF0b3JXcmFwcGVyPFQ+IG1fZ2VuZXJhdG9yOwor ICAgICAgICBQcmVkaWNhdGUgbV9wcmVkaWNhdGU7CisgICAgcHVibGljOgorICAgICAgICB0ZW1w bGF0ZSA8dHlwZW5hbWUgUCA9IFByZWRpY2F0ZT4KKyAgICAgICAgRmlsdGVyR2VuZXJhdG9yKFAm JiBwcmVkLCBHZW5lcmF0b3JXcmFwcGVyPFQ+JiYgZ2VuZXJhdG9yKToKKyAgICAgICAgICAgIG1f Z2VuZXJhdG9yKHN0ZDo6bW92ZShnZW5lcmF0b3IpKSwKKyAgICAgICAgICAgIG1fcHJlZGljYXRl KHN0ZDo6Zm9yd2FyZDxQPihwcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtX3By ZWRpY2F0ZShtX2dlbmVyYXRvci5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCBtaWdo dCBoYXBwZW4gdGhhdCB0aGVyZSBhcmUgbm8gdmFsdWVzIHRoYXQgcGFzcyB0aGUKKyAgICAgICAg ICAgICAgICAvLyBmaWx0ZXIuIEluIHRoYXQgY2FzZSB3ZSB0aHJvdyBhbiBleGNlcHRpb24uCisg ICAgICAgICAgICAgICAgYXV0byBoYXNfaW5pdGlhbF92YWx1ZSA9IG5leHRJbXBsKCk7CisgICAg ICAgICAgICAgICAgaWYgKCFoYXNfaW5pdGlhbF92YWx1ZSkgeworICAgICAgICAgICAgICAgICAg ICBDYXRjaDo6dGhyb3dfZXhjZXB0aW9uKEdlbmVyYXRvckV4Y2VwdGlvbigiTm8gdmFsaWQgdmFs dWUgZm91bmQgaW4gZmlsdGVyZWQgZ2VuZXJhdG9yIikpOworICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFQgY29uc3QmIGdldCgpIGNvbnN0IG92 ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBtX2dlbmVyYXRvci5nZXQoKTsKKyAgICAgICAg fQorCisgICAgICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBu ZXh0SW1wbCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBib29sIG5leHRJ bXBsKCkgeworICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gbV9nZW5lcmF0b3IubmV4dCgpOwor ICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl OworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKCFtX3ByZWRpY2F0ZShtX2dlbmVy YXRvci5nZXQoKSkgJiYgKHN1Y2Nlc3MgPSBtX2dlbmVyYXRvci5uZXh0KCkpID09IHRydWUpOwor ICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVt cGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFByZWRpY2F0ZT4KKyAgICBHZW5lcmF0b3JXcmFw cGVyPFQ+IGZpbHRlcihQcmVkaWNhdGUmJiBwcmVkLCBHZW5lcmF0b3JXcmFwcGVyPFQ+JiYgZ2Vu ZXJhdG9yKSB7CisgICAgICAgIHJldHVybiBHZW5lcmF0b3JXcmFwcGVyPFQ+KHN0ZDo6dW5pcXVl X3B0cjxJR2VuZXJhdG9yPFQ+PihwZjo6bWFrZV91bmlxdWU8RmlsdGVyR2VuZXJhdG9yPFQsIFBy ZWRpY2F0ZT4+KHN0ZDo6Zm9yd2FyZDxQcmVkaWNhdGU+KHByZWQpLCBzdGQ6Om1vdmUoZ2VuZXJh dG9yKSkpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBS ZXBlYXRHZW5lcmF0b3IgOiBwdWJsaWMgSUdlbmVyYXRvcjxUPiB7CisgICAgICAgIHN0YXRpY19h c3NlcnQoIXN0ZDo6aXNfc2FtZTxULCBib29sPjo6dmFsdWUsCisgICAgICAgICAgICAiUmVwZWF0 R2VuZXJhdG9yIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IGJvb2xzIgorICAgICAgICAgICAg ImJlY2F1c2Ugb2Ygc3RkOjp2ZWN0b3I8Ym9vbD4gc3BlY2lhbGl6YXRpb24iKTsKKyAgICAgICAg R2VuZXJhdG9yV3JhcHBlcjxUPiBtX2dlbmVyYXRvcjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6OnZl Y3RvcjxUPiBtX3JldHVybmVkOworICAgICAgICBzaXplX3QgbV90YXJnZXRfcmVwZWF0czsKKyAg ICAgICAgc2l6ZV90IG1fY3VycmVudF9yZXBlYXQgPSAwOworICAgICAgICBzaXplX3QgbV9yZXBl YXRfaW5kZXggPSAwOworICAgIHB1YmxpYzoKKyAgICAgICAgUmVwZWF0R2VuZXJhdG9yKHNpemVf dCByZXBlYXRzLCBHZW5lcmF0b3JXcmFwcGVyPFQ+JiYgZ2VuZXJhdG9yKToKKyAgICAgICAgICAg IG1fZ2VuZXJhdG9yKHN0ZDo6bW92ZShnZW5lcmF0b3IpKSwKKyAgICAgICAgICAgIG1fdGFyZ2V0 X3JlcGVhdHMocmVwZWF0cykKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KG1fdGFyZ2V0 X3JlcGVhdHMgPiAwICYmICJSZXBlYXQgZ2VuZXJhdG9yIG11c3QgcmVwZWF0IGF0IGxlYXN0IG9u Y2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIFQgY29uc3QmIGdldCgpIGNvbnN0IG92ZXJyaWRl IHsKKyAgICAgICAgICAgIGlmIChtX2N1cnJlbnRfcmVwZWF0ID09IDApIHsKKyAgICAgICAgICAg ICAgICBtX3JldHVybmVkLnB1c2hfYmFjayhtX2dlbmVyYXRvci5nZXQoKSk7CisgICAgICAgICAg ICAgICAgcmV0dXJuIG1fcmV0dXJuZWQuYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICAg ICAgcmV0dXJuIG1fcmV0dXJuZWRbbV9yZXBlYXRfaW5kZXhdOworICAgICAgICB9CisKKyAgICAg ICAgYm9vbCBuZXh0KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIDIgYmFz aWMgY2FzZXM6CisgICAgICAgICAgICAvLyAxKSBXZSBhcmUgc3RpbGwgcmVhZGluZyB0aGUgZ2Vu ZXJhdG9yCisgICAgICAgICAgICAvLyAyKSBXZSBhcmUgcmVhZGluZyBvdXIgb3duIGNhY2hlCisK KyAgICAgICAgICAgIC8vIEluIHRoZSBmaXJzdCBjYXNlLCB3ZSBuZWVkIHRvIHBva2UgdGhlIHVu ZGVybHlpbmcgZ2VuZXJhdG9yLgorICAgICAgICAgICAgLy8gSWYgaXQgaGFwcGlseSBtb3Zlcywg d2UgYXJlIGxlZnQgaW4gdGhhdCBzdGF0ZSwgb3RoZXJ3aXNlIGl0IGlzIHRpbWUgdG8gc3RhcnQg cmVhZGluZyBmcm9tIG91ciBjYWNoZQorICAgICAgICAgICAgaWYgKG1fY3VycmVudF9yZXBlYXQg PT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gc3VjY2VzcyA9IG1fZ2VuZXJhdG9y Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAg ICAgICAgKyttX2N1cnJlbnRfcmVwZWF0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg ICAgICByZXR1cm4gbV9jdXJyZW50X3JlcGVhdCA8IG1fdGFyZ2V0X3JlcGVhdHM7CisgICAgICAg ICAgICB9CisKKyAgICAgICAgICAgIC8vIEluIHRoZSBzZWNvbmQgY2FzZSwgd2UgbmVlZCB0byBt b3ZlIGluZGljZXMgZm9yd2FyZCBhbmQgY2hlY2sgdGhhdCB3ZSBoYXZlbid0IHJ1biB1cCBhZ2Fp bnN0IHRoZSBlbmQKKyAgICAgICAgICAgICsrbV9yZXBlYXRfaW5kZXg7CisgICAgICAgICAgICBp ZiAobV9yZXBlYXRfaW5kZXggPT0gbV9yZXR1cm5lZC5zaXplKCkpIHsKKyAgICAgICAgICAgICAg ICBtX3JlcGVhdF9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgKyttX2N1cnJlbnRfcmVwZWF0 OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1fY3VycmVudF9yZXBlYXQgPCBt X3RhcmdldF9yZXBlYXRzOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlIDx0eXBl bmFtZSBUPgorICAgIEdlbmVyYXRvcldyYXBwZXI8VD4gcmVwZWF0KHNpemVfdCByZXBlYXRzLCBH ZW5lcmF0b3JXcmFwcGVyPFQ+JiYgZ2VuZXJhdG9yKSB7CisgICAgICAgIHJldHVybiBHZW5lcmF0 b3JXcmFwcGVyPFQ+KHBmOjptYWtlX3VuaXF1ZTxSZXBlYXRHZW5lcmF0b3I8VD4+KHJlcGVhdHMs IHN0ZDo6bW92ZShnZW5lcmF0b3IpKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1l IFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEZ1bmM+CisgICAgY2xhc3MgTWFwR2VuZXJhdG9yIDog cHVibGljIElHZW5lcmF0b3I8VD4geworICAgICAgICAvLyBUQkQ6IHByb3ZpZGUgc3RhdGljIGFz c2VydCBmb3IgbWFwcGluZyBmdW5jdGlvbiwgZm9yIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UKKyAg ICAgICAgR2VuZXJhdG9yV3JhcHBlcjxVPiBtX2dlbmVyYXRvcjsKKyAgICAgICAgRnVuYyBtX2Z1 bmN0aW9uOworICAgICAgICAvLyBUbyBhdm9pZCByZXR1cm5pbmcgZGFuZ2xpbmcgcmVmZXJlbmNl LCB3ZSBoYXZlIHRvIHNhdmUgdGhlIHZhbHVlcworICAgICAgICBUIG1fY2FjaGU7CisgICAgcHVi bGljOgorICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRjIgPSBGdW5jPgorICAgICAgICBNYXBH ZW5lcmF0b3IoRjImJiBmdW5jdGlvbiwgR2VuZXJhdG9yV3JhcHBlcjxVPiYmIGdlbmVyYXRvcikg OgorICAgICAgICAgICAgbV9nZW5lcmF0b3Ioc3RkOjptb3ZlKGdlbmVyYXRvcikpLAorICAgICAg ICAgICAgbV9mdW5jdGlvbihzdGQ6OmZvcndhcmQ8RjI+KGZ1bmN0aW9uKSksCisgICAgICAgICAg ICBtX2NhY2hlKG1fZnVuY3Rpb24obV9nZW5lcmF0b3IuZ2V0KCkpKQorICAgICAgICB7fQorCisg ICAgICAgIFQgY29uc3QmIGdldCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVy biBtX2NhY2hlOworICAgICAgICB9CisgICAgICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsKKyAg ICAgICAgICAgIGNvbnN0IGF1dG8gc3VjY2VzcyA9IG1fZ2VuZXJhdG9yLm5leHQoKTsKKyAgICAg ICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgbV9jYWNoZSA9IG1fZnVuY3Rp b24obV9nZW5lcmF0b3IuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJu IHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1 bmMsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQgPSBGdW5jdGlvblJldHVyblR5cGU8RnVuYywgVT4+ CisgICAgR2VuZXJhdG9yV3JhcHBlcjxUPiBtYXAoRnVuYyYmIGZ1bmN0aW9uLCBHZW5lcmF0b3JX cmFwcGVyPFU+JiYgZ2VuZXJhdG9yKSB7CisgICAgICAgIHJldHVybiBHZW5lcmF0b3JXcmFwcGVy PFQ+KAorICAgICAgICAgICAgcGY6Om1ha2VfdW5pcXVlPE1hcEdlbmVyYXRvcjxULCBVLCBGdW5j Pj4oc3RkOjpmb3J3YXJkPEZ1bmM+KGZ1bmN0aW9uKSwgc3RkOjptb3ZlKGdlbmVyYXRvcikpCisg ICAgICAgICk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUs IHR5cGVuYW1lIEZ1bmM+CisgICAgR2VuZXJhdG9yV3JhcHBlcjxUPiBtYXAoRnVuYyYmIGZ1bmN0 aW9uLCBHZW5lcmF0b3JXcmFwcGVyPFU+JiYgZ2VuZXJhdG9yKSB7CisgICAgICAgIHJldHVybiBH ZW5lcmF0b3JXcmFwcGVyPFQ+KAorICAgICAgICAgICAgcGY6Om1ha2VfdW5pcXVlPE1hcEdlbmVy YXRvcjxULCBVLCBGdW5jPj4oc3RkOjpmb3J3YXJkPEZ1bmM+KGZ1bmN0aW9uKSwgc3RkOjptb3Zl KGdlbmVyYXRvcikpCisgICAgICAgICk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1l IFQ+CisgICAgY2xhc3MgQ2h1bmtHZW5lcmF0b3IgZmluYWwgOiBwdWJsaWMgSUdlbmVyYXRvcjxz dGQ6OnZlY3RvcjxUPj4geworICAgICAgICBzdGQ6OnZlY3RvcjxUPiBtX2NodW5rOworICAgICAg ICBzaXplX3QgbV9jaHVua19zaXplOworICAgICAgICBHZW5lcmF0b3JXcmFwcGVyPFQ+IG1fZ2Vu ZXJhdG9yOworICAgICAgICBib29sIG1fdXNlZF91cCA9IGZhbHNlOworICAgIHB1YmxpYzoKKyAg ICAgICAgQ2h1bmtHZW5lcmF0b3Ioc2l6ZV90IHNpemUsIEdlbmVyYXRvcldyYXBwZXI8VD4gZ2Vu ZXJhdG9yKSA6CisgICAgICAgICAgICBtX2NodW5rX3NpemUoc2l6ZSksIG1fZ2VuZXJhdG9yKHN0 ZDo6bW92ZShnZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICBtX2NodW5rLnJlc2Vy dmUobV9jaHVua19zaXplKTsKKyAgICAgICAgICAgIGlmIChtX2NodW5rX3NpemUgIT0gMCkgewor ICAgICAgICAgICAgICAgIG1fY2h1bmsucHVzaF9iYWNrKG1fZ2VuZXJhdG9yLmdldCgpKTsKKyAg ICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1fY2h1bmtfc2l6ZTsgKytpKSB7 CisgICAgICAgICAgICAgICAgICAgIGlmICghbV9nZW5lcmF0b3IubmV4dCgpKSB7CisgICAgICAg ICAgICAgICAgICAgICAgICBDYXRjaDo6dGhyb3dfZXhjZXB0aW9uKEdlbmVyYXRvckV4Y2VwdGlv bigiTm90IGVub3VnaCB2YWx1ZXMgdG8gaW5pdGlhbGl6ZSB0aGUgZmlyc3QgY2h1bmsiKSk7Cisg ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV9jaHVuay5wdXNoX2Jh Y2sobV9nZW5lcmF0b3IuZ2V0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K KyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgZ2V0KCkgY29uc3Qgb3Zl cnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIG1fY2h1bms7CisgICAgICAgIH0KKyAgICAgICAg Ym9vbCBuZXh0KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbV9jaHVuay5jbGVhcigpOworICAg ICAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgbV9jaHVua19zaXplOyArK2lkeCkg eworICAgICAgICAgICAgICAgIGlmICghbV9nZW5lcmF0b3IubmV4dCgpKSB7CisgICAgICAgICAg ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg ICAgbV9jaHVuay5wdXNoX2JhY2sobV9nZW5lcmF0b3IuZ2V0KCkpOworICAgICAgICAgICAgfQor ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxh dGUgPHR5cGVuYW1lIFQ+CisgICAgR2VuZXJhdG9yV3JhcHBlcjxzdGQ6OnZlY3RvcjxUPj4gY2h1 bmsoc2l6ZV90IHNpemUsIEdlbmVyYXRvcldyYXBwZXI8VD4mJiBnZW5lcmF0b3IpIHsKKyAgICAg ICAgcmV0dXJuIEdlbmVyYXRvcldyYXBwZXI8c3RkOjp2ZWN0b3I8VD4+KAorICAgICAgICAgICAg cGY6Om1ha2VfdW5pcXVlPENodW5rR2VuZXJhdG9yPFQ+PihzaXplLCBzdGQ6Om1vdmUoZ2VuZXJh dG9yKSkKKyAgICAgICAgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIEdlbmVyYXRvcnMKK30g Ly8gbmFtZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF9nZW5lcmF0b3JzX2dlbmVyaWMuaHBw CisvLyBzdGFydCBjYXRjaF9nZW5lcmF0b3JzX3NwZWNpZmljLmhwcAorCisvLyBzdGFydCBjYXRj aF9jb250ZXh0LmgKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIENhdGNoIHsKKwor ICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZTsKKyAgICBzdHJ1Y3QgSVJ1bm5lcjsKKyAgICBzdHJ1 Y3QgSUNvbmZpZzsKKyAgICBzdHJ1Y3QgSU11dGFibGVDb250ZXh0OworCisgICAgdXNpbmcgSUNv bmZpZ1B0ciA9IHN0ZDo6c2hhcmVkX3B0cjxJQ29uZmlnIGNvbnN0PjsKKworICAgIHN0cnVjdCBJ Q29udGV4dAorICAgIHsKKyAgICAgICAgdmlydHVhbCB+SUNvbnRleHQoKTsKKworICAgICAgICB2 aXJ0dWFsIElSZXN1bHRDYXB0dXJlKiBnZXRSZXN1bHRDYXB0dXJlKCkgPSAwOworICAgICAgICB2 aXJ0dWFsIElSdW5uZXIqIGdldFJ1bm5lcigpID0gMDsKKyAgICAgICAgdmlydHVhbCBJQ29uZmln UHRyIGNvbnN0JiBnZXRDb25maWcoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJ TXV0YWJsZUNvbnRleHQgOiBJQ29udGV4dAorICAgIHsKKyAgICAgICAgdmlydHVhbCB+SU11dGFi bGVDb250ZXh0KCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZXN1bHRDYXB0dXJlKCBJUmVz dWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNl dFJ1bm5lciggSVJ1bm5lciogcnVubmVyICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0 Q29uZmlnKCBJQ29uZmlnUHRyIGNvbnN0JiBjb25maWcgKSA9IDA7CisKKyAgICBwcml2YXRlOgor ICAgICAgICBzdGF0aWMgSU11dGFibGVDb250ZXh0ICpjdXJyZW50Q29udGV4dDsKKyAgICAgICAg ZnJpZW5kIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisgICAg ICAgIGZyaWVuZCB2b2lkIGNsZWFuVXBDb250ZXh0KCk7CisgICAgICAgIHN0YXRpYyB2b2lkIGNy ZWF0ZUNvbnRleHQoKTsKKyAgICB9OworCisgICAgaW5saW5lIElNdXRhYmxlQ29udGV4dCYgZ2V0 Q3VycmVudE11dGFibGVDb250ZXh0KCkKKyAgICB7CisgICAgICAgIGlmKCAhSU11dGFibGVDb250 ZXh0OjpjdXJyZW50Q29udGV4dCApCisgICAgICAgICAgICBJTXV0YWJsZUNvbnRleHQ6OmNyZWF0 ZUNvbnRleHQoKTsKKyAgICAgICAgLy8gTk9MSU5UTkVYVExJTkUoY2xhbmctYW5hbHl6ZXItY29y ZS51bmluaXRpYWxpemVkLlVuZGVmUmV0dXJuKQorICAgICAgICByZXR1cm4gKklNdXRhYmxlQ29u dGV4dDo6Y3VycmVudENvbnRleHQ7CisgICAgfQorCisgICAgaW5saW5lIElDb250ZXh0JiBnZXRD dXJyZW50Q29udGV4dCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q3VycmVudE11dGFibGVD b250ZXh0KCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhblVwQ29udGV4dCgpOworCisgICAgY2xh c3MgU2ltcGxlUGNnMzI7CisgICAgU2ltcGxlUGNnMzImIHJuZygpOworfQorCisvLyBlbmQgY2F0 Y2hfY29udGV4dC5oCisvLyBzdGFydCBjYXRjaF9pbnRlcmZhY2VzX2NvbmZpZy5oCisKKy8vIHN0 YXJ0IGNhdGNoX29wdGlvbi5ocHAKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIEFuIG9w dGlvbmFsIHR5cGUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIE9wdGlvbiB7 CisgICAgcHVibGljOgorICAgICAgICBPcHRpb24oKSA6IG51bGxhYmxlVmFsdWUoIG51bGxwdHIg KSB7fQorICAgICAgICBPcHRpb24oIFQgY29uc3QmIF92YWx1ZSApCisgICAgICAgIDogbnVsbGFi bGVWYWx1ZSggbmV3KCBzdG9yYWdlICkgVCggX3ZhbHVlICkgKQorICAgICAgICB7fQorICAgICAg ICBPcHRpb24oIE9wdGlvbiBjb25zdCYgX290aGVyICkKKyAgICAgICAgOiBudWxsYWJsZVZhbHVl KCBfb3RoZXIgPyBuZXcoIHN0b3JhZ2UgKSBUKCAqX290aGVyICkgOiBudWxscHRyICkKKyAgICAg ICAge30KKworICAgICAgICB+T3B0aW9uKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAg ICAgfQorCisgICAgICAgIE9wdGlvbiYgb3BlcmF0b3I9ICggT3B0aW9uIGNvbnN0JiBfb3RoZXIg KSB7CisgICAgICAgICAgICBpZiggJl9vdGhlciAhPSB0aGlzICkgeworICAgICAgICAgICAgICAg IHJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYoIF9vdGhlciApCisgICAgICAgICAgICAgICAg ICAgIG51bGxhYmxlVmFsdWUgPSBuZXcoIHN0b3JhZ2UgKSBUKCAqX290aGVyICk7CisgICAgICAg ICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgT3B0 aW9uJiBvcGVyYXRvciA9ICggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgcmVzZXQo KTsKKyAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBuZXcoIHN0b3JhZ2UgKSBUKCBfdmFsdWUg KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQg cmVzZXQoKSB7CisgICAgICAgICAgICBpZiggbnVsbGFibGVWYWx1ZSApCisgICAgICAgICAgICAg ICAgbnVsbGFibGVWYWx1ZS0+flQoKTsKKyAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBudWxs cHRyOworICAgICAgICB9CisKKyAgICAgICAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKm51bGxh YmxlVmFsdWU7IH0KKyAgICAgICAgVCBjb25zdCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4g Km51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIG51bGxh YmxlVmFsdWU7IH0KKyAgICAgICAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJu IG51bGxhYmxlVmFsdWU7IH0KKworICAgICAgICBUIHZhbHVlT3IoIFQgY29uc3QmIGRlZmF1bHRW YWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBudWxsYWJsZVZhbHVlID8gKm51bGxh YmxlVmFsdWUgOiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBib29sIHNvbWUo KSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlICE9IG51bGxwdHI7IH0KKyAgICAgICAgYm9v bCBub25lKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSA9PSBudWxscHRyOyB9CisKKyAg ICAgICAgYm9vbCBvcGVyYXRvciAhKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSA9PSBu dWxscHRyOyB9CisgICAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAg ICAgICAgICByZXR1cm4gc29tZSgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAg ICBUICpudWxsYWJsZVZhbHVlOworICAgICAgICBhbGlnbmFzKGFsaWdub2YoVCkpIGNoYXIgc3Rv cmFnZVtzaXplb2YoVCldOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisv LyBlbmQgY2F0Y2hfb3B0aW9uLmhwcAorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxpb3Nm d2Q+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtZW1v cnk+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBlbnVtIGNsYXNzIFZlcmJvc2l0eSB7Cisg ICAgICAgIFF1aWV0ID0gMCwKKyAgICAgICAgTm9ybWFsLAorICAgICAgICBIaWdoCisgICAgfTsK KworICAgIHN0cnVjdCBXYXJuQWJvdXQgeyBlbnVtIFdoYXQgeworICAgICAgICBOb3RoaW5nID0g MHgwMCwKKyAgICAgICAgTm9Bc3NlcnRpb25zID0gMHgwMSwKKyAgICAgICAgTm9UZXN0cyA9IDB4 MDIKKyAgICB9OyB9OworCisgICAgc3RydWN0IFNob3dEdXJhdGlvbnMgeyBlbnVtIE9yTm90IHsK KyAgICAgICAgRGVmYXVsdEZvclJlcG9ydGVyLAorICAgICAgICBBbHdheXMsCisgICAgICAgIE5l dmVyCisgICAgfTsgfTsKKyAgICBzdHJ1Y3QgUnVuVGVzdHMgeyBlbnVtIEluV2hhdE9yZGVyIHsK KyAgICAgICAgSW5EZWNsYXJhdGlvbk9yZGVyLAorICAgICAgICBJbkxleGljb2dyYXBoaWNhbE9y ZGVyLAorICAgICAgICBJblJhbmRvbU9yZGVyCisgICAgfTsgfTsKKyAgICBzdHJ1Y3QgVXNlQ29s b3VyIHsgZW51bSBZZXNPck5vIHsKKyAgICAgICAgQXV0bywKKyAgICAgICAgWWVzLAorICAgICAg ICBObworICAgIH07IH07CisgICAgc3RydWN0IFdhaXRGb3JLZXlwcmVzcyB7IGVudW0gV2hlbiB7 CisgICAgICAgIE5ldmVyLAorICAgICAgICBCZWZvcmVTdGFydCA9IDEsCisgICAgICAgIEJlZm9y ZUV4aXQgPSAyLAorICAgICAgICBCZWZvcmVTdGFydEFuZEV4aXQgPSBCZWZvcmVTdGFydCB8IEJl Zm9yZUV4aXQKKyAgICB9OyB9OworCisgICAgY2xhc3MgVGVzdFNwZWM7CisKKyAgICBzdHJ1Y3Qg SUNvbmZpZyA6IE5vbkNvcHlhYmxlIHsKKworICAgICAgICB2aXJ0dWFsIH5JQ29uZmlnKCk7CisK KyAgICAgICAgdmlydHVhbCBib29sIGFsbG93VGhyb3dzKCkgY29uc3QgPSAwOworICAgICAgICB2 aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFs IHN0ZDo6c3RyaW5nIG5hbWUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpbmNs dWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBz aG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgd2FybkFi b3V0TWlzc2luZ0Fzc2VydGlvbnMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCB3 YXJuQWJvdXROb1Rlc3RzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGludCBhYm9ydEFm dGVyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvd0ludmlzaWJsZXMoKSBj b25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgU2hvd0R1cmF0aW9uczo6T3JOb3Qgc2hvd0R1cmF0 aW9ucygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBkb3VibGUgbWluRHVyYXRpb24oKSBj b25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjKCkgY29u c3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzVGVzdEZpbHRlcnMoKSBjb25zdCA9IDA7 CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRUZXN0 c09yVGFncygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBSdW5UZXN0czo6SW5XaGF0T3Jk ZXIgcnVuT3JkZXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJu Z1NlZWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgVXNlQ29sb3VyOjpZZXNPck5vIHVz ZUNvbG91cigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0 cmluZz4gY29uc3QmIGdldFNlY3Rpb25zVG9SdW4oKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1 YWwgVmVyYm9zaXR5IHZlcmJvc2l0eSgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIGJv b2wgYmVuY2htYXJrTm9BbmFseXNpcygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQg YmVuY2htYXJrU2FtcGxlcygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBkb3VibGUgYmVu Y2htYXJrQ29uZmlkZW5jZUludGVydmFsKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHVu c2lnbmVkIGludCBiZW5jaG1hcmtSZXNhbXBsZXMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1 YWwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBiZW5jaG1hcmtXYXJtdXBUaW1lKCkgY29uc3Qg PSAwOworICAgIH07CisKKyAgICB1c2luZyBJQ29uZmlnUHRyID0gc3RkOjpzaGFyZWRfcHRyPElD b25maWcgY29uc3Q+OworfQorCisvLyBlbmQgY2F0Y2hfaW50ZXJmYWNlc19jb25maWcuaAorLy8g c3RhcnQgY2F0Y2hfcmFuZG9tX251bWJlcl9nZW5lcmF0b3IuaAorCisjaW5jbHVkZSA8Y3N0ZGlu dD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIFRoaXMgaXMgYSBzaW1wbGUgaW1wbGVt ZW50YXRpb24gb2YgQysrMTEgVW5pZm9ybSBSYW5kb20gTnVtYmVyCisgICAgLy8gR2VuZXJhdG9y LiBJdCBkb2VzIG5vdCBwcm92aWRlIGFsbCBvcGVyYXRvcnMsIGJlY2F1c2UgQ2F0Y2gyCisgICAg Ly8gZG9lcyBub3QgdXNlIGl0LCBidXQgaXQgc2hvdWxkIGJlaGF2ZSBhcyBleHBlY3RlZCBpbnNp ZGUgc3RkbGliJ3MKKyAgICAvLyBkaXN0cmlidXRpb25zLgorICAgIC8vIFRoZSBpbXBsZW1lbnRh dGlvbiBpcyBiYXNlZCBvbiB0aGUgUENHIGZhbWlseSAoaHR0cDovL3BjZy1yYW5kb20ub3JnKQor ICAgIGNsYXNzIFNpbXBsZVBjZzMyIHsKKyAgICAgICAgdXNpbmcgc3RhdGVfdHlwZSA9IHN0ZDo6 dWludDY0X3Q7CisgICAgcHVibGljOgorICAgICAgICB1c2luZyByZXN1bHRfdHlwZSA9IHN0ZDo6 dWludDMyX3Q7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgKG1pbikoKSB7 CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgY29uc3Rl eHByIHJlc3VsdF90eXBlIChtYXgpKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0 PHJlc3VsdF90eXBlPigtMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm92aWRlIHNvbWUg ZGVmYXVsdCBpbml0aWFsIHN0YXRlIGZvciB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAg ICBTaW1wbGVQY2czMigpOlNpbXBsZVBjZzMyKDB4ZWQ3NDNjYzRVKSB7fQorCisgICAgICAgIGV4 cGxpY2l0IFNpbXBsZVBjZzMyKHJlc3VsdF90eXBlIHNlZWRfKTsKKworICAgICAgICB2b2lkIHNl ZWQocmVzdWx0X3R5cGUgc2VlZF8pOworICAgICAgICB2b2lkIGRpc2NhcmQodWludDY0X3Qgc2tp cCk7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpOworCisgICAgcHJpdmF0ZToK KyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShTaW1wbGVQY2czMiBjb25zdCYgbGhzLCBT aW1wbGVQY2czMiBjb25zdCYgcmhzKTsKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShT aW1wbGVQY2czMiBjb25zdCYgbGhzLCBTaW1wbGVQY2czMiBjb25zdCYgcmhzKTsKKworICAgICAg ICAvLyBJbiB0aGVvcnkgd2UgYWxzbyBuZWVkIG9wZXJhdG9yPDwgYW5kIG9wZXJhdG9yPj4KKyAg ICAgICAgLy8gSW4gcHJhY3RpY2Ugd2UgZG8gbm90IHVzZSB0aGVtLCBzbyB3ZSB3aWxsIHNraXAg dGhlbSBmb3Igbm93CisKKyAgICAgICAgc3RkOjp1aW50NjRfdCBtX3N0YXRlOworICAgICAgICAv LyBUaGlzIHBhcnQgb2YgdGhlIHN0YXRlIGRldGVybWluZXMgd2hpY2ggInN0cmVhbSIgb2YgdGhl IG51bWJlcnMKKyAgICAgICAgLy8gaXMgY2hvc2VuIC0tIHdlIHRha2UgaXQgYXMgYSBjb25zdGFu dCBmb3IgQ2F0Y2gyLCBzbyB3ZSBvbmx5CisgICAgICAgIC8vIG5lZWQgdG8gZGVhbCB3aXRoIHNl ZWRpbmcgdGhlIG1haW4gc3RhdGUuCisgICAgICAgIC8vIFBpY2tlZCBieSByZWFkaW5nIDggYnl0 ZXMgZnJvbSBgL2Rldi9yYW5kb21gIDotKQorICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjp1aW50 NjRfdCBzX2luYyA9ICgweDEzZWQwY2M1M2Y5Mzk0NzZVTEwgPDwgMVVMTCkgfCAxVUxMOworICAg IH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfcmFuZG9tX251 bWJlcl9nZW5lcmF0b3IuaAorI2luY2x1ZGUgPHJhbmRvbT4KKworbmFtZXNwYWNlIENhdGNoIHsK K25hbWVzcGFjZSBHZW5lcmF0b3JzIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZsb2F0PgorY2xh c3MgUmFuZG9tRmxvYXRpbmdHZW5lcmF0b3IgZmluYWwgOiBwdWJsaWMgSUdlbmVyYXRvcjxGbG9h dD4geworICAgIENhdGNoOjpTaW1wbGVQY2czMiYgbV9ybmc7CisgICAgc3RkOjp1bmlmb3JtX3Jl YWxfZGlzdHJpYnV0aW9uPEZsb2F0PiBtX2Rpc3Q7CisgICAgRmxvYXQgbV9jdXJyZW50X251bWJl cjsKK3B1YmxpYzoKKworICAgIFJhbmRvbUZsb2F0aW5nR2VuZXJhdG9yKEZsb2F0IGEsIEZsb2F0 IGIpOgorICAgICAgICBtX3JuZyhybmcoKSksCisgICAgICAgIG1fZGlzdChhLCBiKSB7CisgICAg ICAgIHN0YXRpY19jYXN0PHZvaWQ+KG5leHQoKSk7CisgICAgfQorCisgICAgRmxvYXQgY29uc3Qm IGdldCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1fY3VycmVudF9udW1iZXI7 CisgICAgfQorICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbV9jdXJyZW50X251 bWJlciA9IG1fZGlzdChtX3JuZyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisK K3RlbXBsYXRlIDx0eXBlbmFtZSBJbnRlZ2VyPgorY2xhc3MgUmFuZG9tSW50ZWdlckdlbmVyYXRv ciBmaW5hbCA6IHB1YmxpYyBJR2VuZXJhdG9yPEludGVnZXI+IHsKKyAgICBDYXRjaDo6U2ltcGxl UGNnMzImIG1fcm5nOworICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPEludGVnZXI+ IG1fZGlzdDsKKyAgICBJbnRlZ2VyIG1fY3VycmVudF9udW1iZXI7CitwdWJsaWM6CisKKyAgICBS YW5kb21JbnRlZ2VyR2VuZXJhdG9yKEludGVnZXIgYSwgSW50ZWdlciBiKToKKyAgICAgICAgbV9y bmcocm5nKCkpLAorICAgICAgICBtX2Rpc3QoYSwgYikgeworICAgICAgICBzdGF0aWNfY2FzdDx2 b2lkPihuZXh0KCkpOworICAgIH0KKworICAgIEludGVnZXIgY29uc3QmIGdldCgpIGNvbnN0IG92 ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1fY3VycmVudF9udW1iZXI7CisgICAgfQorICAgIGJv b2wgbmV4dCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbV9jdXJyZW50X251bWJlciA9IG1fZGlzdCht X3JuZyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKKy8vIFRPRE86IElkZWFs bHkgdGhpcyB3b3VsZCBiZSBhbHNvIGNvbnN0cmFpbmVkIGFnYWluc3QgdGhlIHZhcmlvdXMgY2hh ciB0eXBlcywKKy8vICAgICAgIGJ1dCBJIGRvbid0IGV4cGVjdCB1c2VycyB0byBydW4gaW50byB0 aGF0IGluIHByYWN0aWNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVu YWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJiAhc3RkOjppc19zYW1lPFQsIGJv b2w+Ojp2YWx1ZSwKK0dlbmVyYXRvcldyYXBwZXI8VD4+Ojp0eXBlCityYW5kb20oVCBhLCBUIGIp IHsKKyAgICByZXR1cm4gR2VuZXJhdG9yV3JhcHBlcjxUPigKKyAgICAgICAgcGY6Om1ha2VfdW5p cXVlPFJhbmRvbUludGVnZXJHZW5lcmF0b3I8VD4+KGEsIGIpCisgICAgKTsKK30KKwordGVtcGxh dGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Zsb2F0aW5n X3BvaW50PFQ+Ojp2YWx1ZSwKK0dlbmVyYXRvcldyYXBwZXI8VD4+Ojp0eXBlCityYW5kb20oVCBh LCBUIGIpIHsKKyAgICByZXR1cm4gR2VuZXJhdG9yV3JhcHBlcjxUPigKKyAgICAgICAgcGY6Om1h a2VfdW5pcXVlPFJhbmRvbUZsb2F0aW5nR2VuZXJhdG9yPFQ+PihhLCBiKQorICAgICk7Cit9CisK K3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmFuZ2VHZW5lcmF0b3IgZmluYWwgOiBwdWJs aWMgSUdlbmVyYXRvcjxUPiB7CisgICAgVCBtX2N1cnJlbnQ7CisgICAgVCBtX2VuZDsKKyAgICBU IG1fc3RlcDsKKyAgICBib29sIG1fcG9zaXRpdmU7CisKK3B1YmxpYzoKKyAgICBSYW5nZUdlbmVy YXRvcihUIGNvbnN0JiBzdGFydCwgVCBjb25zdCYgZW5kLCBUIGNvbnN0JiBzdGVwKToKKyAgICAg ICAgbV9jdXJyZW50KHN0YXJ0KSwKKyAgICAgICAgbV9lbmQoZW5kKSwKKyAgICAgICAgbV9zdGVw KHN0ZXApLAorICAgICAgICBtX3Bvc2l0aXZlKG1fc3RlcCA+IFQoMCkpCisgICAgeworICAgICAg ICBhc3NlcnQobV9jdXJyZW50ICE9IG1fZW5kICYmICJSYW5nZSBzdGFydCBhbmQgZW5kIGNhbm5v dCBiZSBlcXVhbCIpOworICAgICAgICBhc3NlcnQobV9zdGVwICE9IFQoMCkgJiYgIlN0ZXAgc2l6 ZSBjYW5ub3QgYmUgemVybyIpOworICAgICAgICBhc3NlcnQoKChtX3Bvc2l0aXZlICYmIG1fY3Vy cmVudCA8PSBtX2VuZCkgfHwgKCFtX3Bvc2l0aXZlICYmIG1fY3VycmVudCA+PSBtX2VuZCkpICYm ICJTdGVwIG1vdmVzIGF3YXkgZnJvbSBlbmQiKTsKKyAgICB9CisKKyAgICBSYW5nZUdlbmVyYXRv cihUIGNvbnN0JiBzdGFydCwgVCBjb25zdCYgZW5kKToKKyAgICAgICAgUmFuZ2VHZW5lcmF0b3Io c3RhcnQsIGVuZCwgKHN0YXJ0IDwgZW5kKSA/IFQoMSkgOiBUKC0xKSkKKyAgICB7fQorCisgICAg VCBjb25zdCYgZ2V0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbV9jdXJyZW50 OworICAgIH0KKworICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbV9jdXJyZW50 ICs9IG1fc3RlcDsKKyAgICAgICAgcmV0dXJuIChtX3Bvc2l0aXZlKSA/IChtX2N1cnJlbnQgPCBt X2VuZCkgOiAobV9jdXJyZW50ID4gbV9lbmQpOworICAgIH0KK307CisKK3RlbXBsYXRlIDx0eXBl bmFtZSBUPgorR2VuZXJhdG9yV3JhcHBlcjxUPiByYW5nZShUIGNvbnN0JiBzdGFydCwgVCBjb25z dCYgZW5kLCBUIGNvbnN0JiBzdGVwKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2FyaXRo bWV0aWM8VD46OnZhbHVlICYmICFzdGQ6OmlzX3NhbWU8VCwgYm9vbD46OnZhbHVlLCAiVHlwZSBt dXN0IGJlIG51bWVyaWMiKTsKKyAgICByZXR1cm4gR2VuZXJhdG9yV3JhcHBlcjxUPihwZjo6bWFr ZV91bmlxdWU8UmFuZ2VHZW5lcmF0b3I8VD4+KHN0YXJ0LCBlbmQsIHN0ZXApKTsKK30KKwordGVt cGxhdGUgPHR5cGVuYW1lIFQ+CitHZW5lcmF0b3JXcmFwcGVyPFQ+IHJhbmdlKFQgY29uc3QmIHN0 YXJ0LCBUIGNvbnN0JiBlbmQpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8 VD46OnZhbHVlICYmICFzdGQ6OmlzX3NhbWU8VCwgYm9vbD46OnZhbHVlLCAiVHlwZSBtdXN0IGJl IGFuIGludGVnZXIiKTsKKyAgICByZXR1cm4gR2VuZXJhdG9yV3JhcHBlcjxUPihwZjo6bWFrZV91 bmlxdWU8UmFuZ2VHZW5lcmF0b3I8VD4+KHN0YXJ0LCBlbmQpKTsKK30KKwordGVtcGxhdGUgPHR5 cGVuYW1lIFQ+CitjbGFzcyBJdGVyYXRvckdlbmVyYXRvciBmaW5hbCA6IHB1YmxpYyBJR2VuZXJh dG9yPFQ+IHsKKyAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8VCwgYm9vbD46OnZhbHVl LAorICAgICAgICAiSXRlcmF0b3JHZW5lcmF0b3IgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQg Ym9vbHMiCisgICAgICAgICJiZWNhdXNlIG9mIHN0ZDo6dmVjdG9yPGJvb2w+IHNwZWNpYWxpemF0 aW9uIik7CisKKyAgICBzdGQ6OnZlY3RvcjxUPiBtX2VsZW1zOworICAgIHNpemVfdCBtX2N1cnJl bnQgPSAwOworcHVibGljOgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yLCB0 eXBlbmFtZSBJbnB1dFNlbnRpbmVsPgorICAgIEl0ZXJhdG9yR2VuZXJhdG9yKElucHV0SXRlcmF0 b3IgZmlyc3QsIElucHV0U2VudGluZWwgbGFzdCk6bV9lbGVtcyhmaXJzdCwgbGFzdCkgeworICAg ICAgICBpZiAobV9lbGVtcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDYXRjaDo6dGhyb3dfZXhj ZXB0aW9uKEdlbmVyYXRvckV4Y2VwdGlvbigiSXRlcmF0b3JHZW5lcmF0b3IgcmVjZWl2ZWQgbm8g dmFsaWQgdmFsdWVzIikpOworICAgICAgICB9CisgICAgfQorCisgICAgVCBjb25zdCYgZ2V0KCkg Y29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbV9lbGVtc1ttX2N1cnJlbnRdOworICAg IH0KKworICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsKKyAgICAgICAgKyttX2N1cnJlbnQ7Cisg ICAgICAgIHJldHVybiBtX2N1cnJlbnQgIT0gbV9lbGVtcy5zaXplKCk7CisgICAgfQorfTsKKwor dGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcmF0b3IsCisgICAgICAgICAgdHlwZW5hbWUgSW5w dXRTZW50aW5lbCwKKyAgICAgICAgICB0eXBlbmFtZSBSZXN1bHRUeXBlID0gdHlwZW5hbWUgc3Rk OjppdGVyYXRvcl90cmFpdHM8SW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitHZW5lcmF0b3JX cmFwcGVyPFJlc3VsdFR5cGU+IGZyb21fcmFuZ2UoSW5wdXRJdGVyYXRvciBmcm9tLCBJbnB1dFNl bnRpbmVsIHRvKSB7CisgICAgcmV0dXJuIEdlbmVyYXRvcldyYXBwZXI8UmVzdWx0VHlwZT4ocGY6 Om1ha2VfdW5pcXVlPEl0ZXJhdG9yR2VuZXJhdG9yPFJlc3VsdFR5cGU+Pihmcm9tLCB0bykpOwor fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyLAorICAgICAgICAgIHR5cGVuYW1lIFJl c3VsdFR5cGUgPSB0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+CitHZW5lcmF0b3JXcmFw cGVyPFJlc3VsdFR5cGU+IGZyb21fcmFuZ2UoQ29udGFpbmVyIGNvbnN0JiBjbnQpIHsKKyAgICBy ZXR1cm4gR2VuZXJhdG9yV3JhcHBlcjxSZXN1bHRUeXBlPihwZjo6bWFrZV91bmlxdWU8SXRlcmF0 b3JHZW5lcmF0b3I8UmVzdWx0VHlwZT4+KGNudC5iZWdpbigpLCBjbnQuZW5kKCkpKTsKK30KKwor fSAvLyBuYW1lc3BhY2UgR2VuZXJhdG9ycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gZW5k IGNhdGNoX2dlbmVyYXRvcnNfc3BlY2lmaWMuaHBwCisKKy8vIFRoZXNlIGZpbGVzIGFyZSBpbmNs dWRlZCBoZXJlIHNvIHRoZSBzaW5nbGVfaW5jbHVkZSBzY3JpcHQgZG9lc24ndCBwdXQgdGhlbQor Ly8gaW4gdGhlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgc2VjdGlvbnMKKy8vIHN0YXJ0IGNhdGNo X3Rlc3RfY2FzZV9pbmZvLmgKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+ CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRp YWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVk IgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSVRlc3RJbnZva2Vy OworCisgICAgc3RydWN0IFRlc3RDYXNlSW5mbyB7CisgICAgICAgIGVudW0gU3BlY2lhbFByb3Bl cnRpZXN7CisgICAgICAgICAgICBOb25lID0gMCwKKyAgICAgICAgICAgIElzSGlkZGVuID0gMSA8 PCAxLAorICAgICAgICAgICAgU2hvdWxkRmFpbCA9IDEgPDwgMiwKKyAgICAgICAgICAgIE1heUZh aWwgPSAxIDw8IDMsCisgICAgICAgICAgICBUaHJvd3MgPSAxIDw8IDQsCisgICAgICAgICAgICBO b25Qb3J0YWJsZSA9IDEgPDwgNSwKKyAgICAgICAgICAgIEJlbmNobWFyayA9IDEgPDwgNgorICAg ICAgICB9OworCisgICAgICAgIFRlc3RDYXNlSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX25h bWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NsYXNzTmFt ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRp b24sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29u c3QmIF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3Qm IF9saW5lSW5mbyApOworCisgICAgICAgIGZyaWVuZCB2b2lkIHNldFRhZ3MoIFRlc3RDYXNlSW5m byYgdGVzdENhc2VJbmZvLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGFncyApOworCisgICAg ICAgIGJvb2wgaXNIaWRkZW4oKSBjb25zdDsKKyAgICAgICAgYm9vbCB0aHJvd3MoKSBjb25zdDsK KyAgICAgICAgYm9vbCBva1RvRmFpbCgpIGNvbnN0OworICAgICAgICBib29sIGV4cGVjdGVkVG9G YWlsKCkgY29uc3Q7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnc0FzU3RyaW5nKCkgY29uc3Q7 CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NO YW1lOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgc3RkOjp2ZWN0 b3I8c3RkOjpzdHJpbmc+IHRhZ3M7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBs Y2FzZVRhZ3M7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBTcGVj aWFsUHJvcGVydGllcyBwcm9wZXJ0aWVzOworICAgIH07CisKKyAgICBjbGFzcyBUZXN0Q2FzZSA6 IHB1YmxpYyBUZXN0Q2FzZUluZm8geworICAgIHB1YmxpYzoKKworICAgICAgICBUZXN0Q2FzZSgg SVRlc3RJbnZva2VyKiB0ZXN0Q2FzZSwgVGVzdENhc2VJbmZvJiYgaW5mbyApOworCisgICAgICAg IFRlc3RDYXNlIHdpdGhOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX25ld05hbWUgKSBjb25zdDsK KworICAgICAgICB2b2lkIGludm9rZSgpIGNvbnN0OworCisgICAgICAgIFRlc3RDYXNlSW5mbyBj b25zdCYgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Q7CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9 PSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9y IDwgKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAg ICAgIHN0ZDo6c2hhcmVkX3B0cjxJVGVzdEludm9rZXI+IHRlc3Q7CisgICAgfTsKKworICAgIFRl c3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0SW52b2tlciogdGVzdENhc2UsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBOYW1lQW5kVGFncyBjb25zdCYgbmFtZUFuZFRhZ3MsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7 Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNl bmRpZgorCisvLyBlbmQgY2F0Y2hfdGVzdF9jYXNlX2luZm8uaAorLy8gc3RhcnQgY2F0Y2hfaW50 ZXJmYWNlc19ydW5uZXIuaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElSdW5u ZXIgeworICAgICAgICB2aXJ0dWFsIH5JUnVubmVyKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBh Ym9ydGluZygpIGNvbnN0ID0gMDsKKyAgICB9OworfQorCisvLyBlbmQgY2F0Y2hfaW50ZXJmYWNl c19ydW5uZXIuaAorCisjaWZkZWYgX19PQkpDX18KKy8vIHN0YXJ0IGNhdGNoX29iamMuaHBwCisK KyNpbXBvcnQgPG9iamMvcnVudGltZS5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBOQi4g QW55IGdlbmVyYWwgY2F0Y2ggaGVhZGVycyBpbmNsdWRlZCBoZXJlIG11c3QgYmUgaW5jbHVkZWQK Ky8vIGluIGNhdGNoLmhwcCBmaXJzdCB0byBtYWtlIHN1cmUgdGhleSBhcmUgaW5jbHVkZWQgYnkg dGhlIHNpbmdsZQorLy8gaGVhZGVyIGZvciBub24gb2JqLXVzYWdlCisKKy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8KKy8vIFRoaXMgcHJvdG9jb2wgaXMgcmVhbGx5IG9ubHkgaGVyZSBmb3IgKHNlbGYp IGRvY3VtZW50aW5nIHB1cnBvc2VzLCBzaW5jZQorLy8gYWxsIGl0cyBtZXRob2RzIGFyZSBvcHRp b25hbC4KK0Bwcm90b2NvbCBPY0ZpeHR1cmUKKworQG9wdGlvbmFsCisKKy0odm9pZCkgc2V0VXA7 CistKHZvaWQpIHRlYXJEb3duOworCitAZW5kCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBj bGFzcyBPY01ldGhvZCA6IHB1YmxpYyBJVGVzdEludm9rZXIgeworCisgICAgcHVibGljOgorICAg ICAgICBPY01ldGhvZCggQ2xhc3MgY2xzLCBTRUwgc2VsICkgOiBtX2NscyggY2xzICksIG1fc2Vs KCBzZWwgKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAg ICAgICAgICBpZCBvYmogPSBbW21fY2xzIGFsbG9jXSBpbml0XTsKKworICAgICAgICAgICAgcGVy Zm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgQHNlbGVjdG9yKHNldFVwKSAgKTsKKyAgICAgICAg ICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIG1fc2VsICk7CisgICAgICAgICAgICBw ZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBAc2VsZWN0b3IodGVhckRvd24pICApOworCisg ICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggb2JqICk7CisgICAgICAgIH0KKyAgICBwcml2YXRl OgorICAgICAgICB2aXJ0dWFsIH5PY01ldGhvZCgpIHt9CisKKyAgICAgICAgQ2xhc3MgbV9jbHM7 CisgICAgICAgIFNFTCBtX3NlbDsKKyAgICB9OworCisgICAgbmFtZXNwYWNlIERldGFpbHsKKwor ICAgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0QW5ub3RhdGlvbiggICBDbGFzcyBjbHMsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNv bnN0JiBhbm5vdGF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RDYXNlTmFtZSApIHsKKyAgICAgICAgICAg IE5TU3RyaW5nKiBzZWxTdHIgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEZvcm1hdDpAIkNh dGNoXyVzXyVzIiwgYW5ub3RhdGlvbk5hbWUuY19zdHIoKSwgdGVzdENhc2VOYW1lLmNfc3RyKCld OworICAgICAgICAgICAgU0VMIHNlbCA9IE5TU2VsZWN0b3JGcm9tU3RyaW5nKCBzZWxTdHIgKTsK KyAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBzZWxTdHIgKTsKKyAgICAgICAgICAgIGlkIHZh bHVlID0gcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGNscywgc2VsICk7CisgICAgICAgICAgICBp ZiggdmFsdWUgKQorICAgICAgICAgICAgICAgIHJldHVybiBbKE5TU3RyaW5nKil2YWx1ZSBVVEY4 U3RyaW5nXTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAg IGlubGluZSBzdGQ6OnNpemVfdCByZWdpc3RlclRlc3RNZXRob2RzKCkgeworICAgICAgICBzdGQ6 OnNpemVfdCBub1Rlc3RNZXRob2RzID0gMDsKKyAgICAgICAgaW50IG5vQ2xhc3NlcyA9IG9iamNf Z2V0Q2xhc3NMaXN0KCBudWxscHRyLCAwICk7CisKKyAgICAgICAgQ2xhc3MqIGNsYXNzZXMgPSAo Q0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQgQ2xhc3MgKiltYWxsb2MoIHNpemVvZihDbGFzcykgKiBu b0NsYXNzZXMpOworICAgICAgICBvYmpjX2dldENsYXNzTGlzdCggY2xhc3Nlcywgbm9DbGFzc2Vz ICk7CisKKyAgICAgICAgZm9yKCBpbnQgYyA9IDA7IGMgPCBub0NsYXNzZXM7IGMrKyApIHsKKyAg ICAgICAgICAgIENsYXNzIGNscyA9IGNsYXNzZXNbY107CisgICAgICAgICAgICB7CisgICAgICAg ICAgICAgICAgdV9pbnQgY291bnQ7CisgICAgICAgICAgICAgICAgTWV0aG9kKiBtZXRob2RzID0g Y2xhc3NfY29weU1ldGhvZExpc3QoIGNscywgJmNvdW50ICk7CisgICAgICAgICAgICAgICAgZm9y KCB1X2ludCBtID0gMDsgbSA8IGNvdW50IDsgbSsrICkgeworICAgICAgICAgICAgICAgICAgICBT RUwgc2VsZWN0b3IgPSBtZXRob2RfZ2V0TmFtZShtZXRob2RzW21dKTsKKyAgICAgICAgICAgICAg ICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kTmFtZSA9IHNlbF9nZXROYW1lKHNlbGVjdG9yKTsKKyAg ICAgICAgICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1ldGhvZE5hbWUsICJDYXRjaF9UZXN0 Q2FzZV8iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0Q2Fz ZU5hbWUgPSBtZXRob2ROYW1lLnN1YnN0ciggMTUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAg IHN0ZDo6c3RyaW5nIG5hbWUgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIk5hbWUiLCB0 ZXN0Q2FzZU5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2Mg PSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIkRlc2NyaXB0aW9uIiwgdGVzdENhc2VOYW1l ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc05hbWUgPSBjbGFz c19nZXROYW1lKCBjbHMgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TXV0YWJsZVJl Z2lzdHJ5SHViKCkucmVnaXN0ZXJUZXN0KCBtYWtlVGVzdENhc2UoIG5ldyBPY01ldGhvZCggY2xz LCBzZWxlY3RvciApLCBjbGFzc05hbWUsIE5hbWVBbmRUYWdzKCBuYW1lLmNfc3RyKCksIGRlc2Mu Y19zdHIoKSApLCBTb3VyY2VMaW5lSW5mbygiIiwwKSApICk7CisgICAgICAgICAgICAgICAgICAg ICAgICBub1Rlc3RNZXRob2RzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg ICAgICB9CisgICAgICAgICAgICAgICAgZnJlZShtZXRob2RzKTsKKyAgICAgICAgICAgIH0KKyAg ICAgICAgfQorICAgICAgICByZXR1cm4gbm9UZXN0TWV0aG9kczsKKyAgICB9CisKKyNpZiAhZGVm aW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUykKKworICAgIG5hbWVzcGFjZSBNYXRj aGVycyB7CisgICAgICAgIG5hbWVzcGFjZSBJbXBsIHsKKyAgICAgICAgbmFtZXNwYWNlIE5TU3Ry aW5nTWF0Y2hlcnMgeworCisgICAgICAgICAgICBzdHJ1Y3QgU3RyaW5nSG9sZGVyIDogTWF0Y2hl ckJhc2U8TlNTdHJpbmcqPnsKKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoIE5TU3RyaW5n KiBzdWJzdHIgKSA6IG1fc3Vic3RyKCBbc3Vic3RyIGNvcHldICl7fQorICAgICAgICAgICAgICAg IFN0cmluZ0hvbGRlciggU3RyaW5nSG9sZGVyIGNvbnN0JiBvdGhlciApIDogbV9zdWJzdHIoIFtv dGhlci5tX3N1YnN0ciBjb3B5XSApe30KKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoKSB7 CisgICAgICAgICAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBtX3N1YnN0ciApOworICAgICAg ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIg KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBOU1N0cmluZyogQ0FUQ0hfQVJDX1NU Uk9ORyBtX3N1YnN0cjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBFcXVh bHMgOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIEVxdWFscyggTlNTdHJpbmcqIHN1 YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICBib29s IG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAg ICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgW3N0ciBpc0VxdWFsVG9TdHJpbmc6bV9zdWJzdHJdOworICAg ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkg Y29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImVxdWFscyBzdHJp bmc6ICIgKyBDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoIG1fc3Vic3RyICk7CisgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IENvbnRhaW5zIDog U3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBDb250YWlucyggTlNTdHJpbmcqIHN1YnN0 ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICBib29sIG1h dGNoKCBOU1N0cmluZyogc3RyICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAg ICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiAh PSBOU05vdEZvdW5kOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0ZDo6 c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gImNvbnRhaW5zIHN0cmluZzogIiArIENhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeSggbV9z dWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAg ICBzdHJ1Y3QgU3RhcnRzV2l0aCA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgU3Rh cnRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisK KyAgICAgICAgICAgICAgICBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3Qgb3ZlcnJp ZGUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3Ry ID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3Ry aW5nOm1fc3Vic3RyXS5sb2NhdGlvbiA9PSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAg ICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAg ICAgICAgICAgICAgICByZXR1cm4gInN0YXJ0cyB3aXRoOiAiICsgQ2F0Y2g6OkRldGFpbDo6c3Ry aW5naWZ5KCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07Cisg ICAgICAgICAgICBzdHJ1Y3QgRW5kc1dpdGggOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAg ICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciAp e30KKworICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCBv dmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9z dWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIHJhbmdl T2ZTdHJpbmc6bV9zdWJzdHJdLmxvY2F0aW9uID09IFtzdHIgbGVuZ3RoXSAtIFttX3N1YnN0ciBs ZW5ndGhdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5n IGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4g ImVuZHMgd2l0aDogIiArIENhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeSggbV9zdWJzdHIgKTsKKyAg ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIH0gLy8gbmFtZXNwYWNl IE5TU3RyaW5nTWF0Y2hlcnMKKyAgICAgICAgfSAvLyBuYW1lc3BhY2UgSW1wbAorCisgICAgICAg IGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFcXVhbHMKKyAgICAgICAgICAgIEVxdWFs cyggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RXF1 YWxzKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJz OjpDb250YWlucworICAgICAgICAgICAgQ29udGFpbnMoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0 dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkNvbnRhaW5zKCBzdWJzdHIgKTsgfQorCisgICAg ICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpTdGFydHNXaXRoCisgICAgICAgICAg ICBTdGFydHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01h dGNoZXJzOjpTdGFydHNXaXRoKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpO U1N0cmluZ01hdGNoZXJzOjpFbmRzV2l0aAorICAgICAgICAgICAgRW5kc1dpdGgoIE5TU3RyaW5n KiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVuZHNXaXRoKCBzdWJz dHIgKTsgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKKworICAgIHVzaW5nIG5hbWVz cGFjZSBNYXRjaGVyczsKKworI2VuZGlmIC8vIENBVENIX0NPTkZJR19ESVNBQkxFX01BVENIRVJT CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZp bmUgT0NfTUFLRV9VTklRVUVfTkFNRSggcm9vdCwgdW5pcXVlU3VmZml4ICkgcm9vdCMjdW5pcXVl U3VmZml4CisjZGVmaW5lIE9DX1RFU1RfQ0FTRTIoIG5hbWUsIGRlc2MsIHVuaXF1ZVN1ZmZpeCAp IFwKKysoTlNTdHJpbmcqKSBPQ19NQUtFX1VOSVFVRV9OQU1FKCBDYXRjaF9OYW1lX3Rlc3RfLCB1 bmlxdWVTdWZmaXggKSBcCit7IFwKK3JldHVybiBAIG5hbWU7IFwKK30gXAorKyhOU1N0cmluZyop IE9DX01BS0VfVU5JUVVFX05BTUUoIENhdGNoX0Rlc2NyaXB0aW9uX3Rlc3RfLCB1bmlxdWVTdWZm aXggKSBcCit7IFwKK3JldHVybiBAIGRlc2M7IFwKK30gXAorLSh2b2lkKSBPQ19NQUtFX1VOSVFV RV9OQU1FKCBDYXRjaF9UZXN0Q2FzZV90ZXN0XywgdW5pcXVlU3VmZml4ICkKKworI2RlZmluZSBP Q19URVNUX0NBU0UoIG5hbWUsIGRlc2MgKSBPQ19URVNUX0NBU0UyKCBuYW1lLCBkZXNjLCBfX0xJ TkVfXyApCisKKy8vIGVuZCBjYXRjaF9vYmpjLmhwcAorI2VuZGlmCisKKy8vIEJlbmNobWFya2lu ZyBuZWVkcyB0aGUgZXh0ZXJuYWxseS1mYWNpbmcgcGFydHMgb2YgcmVwb3J0ZXJzIHRvIHdvcmsK KyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FWFRFUk5BTF9JTlRFUkZBQ0VTKSB8fCBkZWZpbmVk KENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HKQorLy8gc3RhcnQgY2F0Y2hfZXh0ZXJu YWxfaW50ZXJmYWNlcy5oCisKKy8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVyX2Jhc2VzLmhwcAorCisv LyBzdGFydCBjYXRjaF9pbnRlcmZhY2VzX3JlcG9ydGVyLmgKKworLy8gc3RhcnQgY2F0Y2hfY29u ZmlnLmhwcAorCisvLyBzdGFydCBjYXRjaF90ZXN0X3NwZWNfcGFyc2VyLmgKKworI2lmZGVmIF9f Y2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlh Z25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCisvLyBzdGFydCBjYXRjaF90ZXN0 X3NwZWMuaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVz aAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisK Ky8vIHN0YXJ0IGNhdGNoX3dpbGRjYXJkX3BhdHRlcm4uaAorCituYW1lc3BhY2UgQ2F0Y2gKK3sK KyAgICBjbGFzcyBXaWxkY2FyZFBhdHRlcm4geworICAgICAgICBlbnVtIFdpbGRjYXJkUG9zaXRp b24geworICAgICAgICAgICAgTm9XaWxkY2FyZCA9IDAsCisgICAgICAgICAgICBXaWxkY2FyZEF0 U3RhcnQgPSAxLAorICAgICAgICAgICAgV2lsZGNhcmRBdEVuZCA9IDIsCisgICAgICAgICAgICBX aWxkY2FyZEF0Qm90aEVuZHMgPSBXaWxkY2FyZEF0U3RhcnQgfCBXaWxkY2FyZEF0RW5kCisgICAg ICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgV2lsZGNhcmRQYXR0ZXJuKCBzdGQ6OnN0 cmluZyBjb25zdCYgcGF0dGVybiwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0 eSApOworICAgICAgICB2aXJ0dWFsIH5XaWxkY2FyZFBhdHRlcm4oKSA9IGRlZmF1bHQ7CisgICAg ICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3Q7 CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBub3JtYWxpc2VTdHJpbmcoIHN0 ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdDsKKyAgICAgICAgQ2FzZVNlbnNpdGl2ZTo6Q2hv aWNlIG1fY2FzZVNlbnNpdGl2aXR5OworICAgICAgICBXaWxkY2FyZFBvc2l0aW9uIG1fd2lsZGNh cmQgPSBOb1dpbGRjYXJkOworICAgICAgICBzdGQ6OnN0cmluZyBtX3BhdHRlcm47CisgICAgfTsK K30KKworLy8gZW5kIGNhdGNoX3dpbGRjYXJkX3BhdHRlcm4uaAorI2luY2x1ZGUgPHN0cmluZz4K KyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgQ2F0Y2gg eworCisgICAgc3RydWN0IElDb25maWc7CisKKyAgICBjbGFzcyBUZXN0U3BlYyB7CisgICAgICAg IGNsYXNzIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNpdCBQ YXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApOworICAgICAgICAgICAgdmlydHVhbCB+ UGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5m byBjb25zdCYgdGVzdENhc2UgKSBjb25zdCA9IDA7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBj b25zdCYgbmFtZSgpIGNvbnN0OworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjpz dHJpbmcgY29uc3QgbV9uYW1lOworICAgICAgICB9OworICAgICAgICB1c2luZyBQYXR0ZXJuUHRy ID0gc3RkOjpzaGFyZWRfcHRyPFBhdHRlcm4+OworCisgICAgICAgIGNsYXNzIE5hbWVQYXR0ZXJu IDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNp dCBOYW1lUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIHN0ZDo6c3RyaW5nIGNvbnN0 JiBmaWx0ZXJTdHJpbmcgKTsKKyAgICAgICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZv IGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBwcml2YXRlOgorICAg ICAgICAgICAgV2lsZGNhcmRQYXR0ZXJuIG1fd2lsZGNhcmRQYXR0ZXJuOworICAgICAgICB9Owor CisgICAgICAgIGNsYXNzIFRhZ1BhdHRlcm4gOiBwdWJsaWMgUGF0dGVybiB7CisgICAgICAgIHB1 YmxpYzoKKyAgICAgICAgICAgIGV4cGxpY2l0IFRhZ1BhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0 JiB0YWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWx0ZXJTdHJpbmcgKTsKKyAgICAgICAgICAgIGJv b2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IG92ZXJyaWRl OworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV90YWc7CisgICAg ICAgIH07CisKKyAgICAgICAgY2xhc3MgRXhjbHVkZWRQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4g eworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNpdCBFeGNsdWRlZFBhdHRlcm4o IFBhdHRlcm5QdHIgY29uc3QmIHVuZGVybHlpbmdQYXR0ZXJuICk7CisgICAgICAgICAgICBib29s IG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCBvdmVycmlkZTsK KyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFBhdHRlcm5QdHIgbV91bmRlcmx5aW5nUGF0 dGVybjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgRmlsdGVyIHsKKyAgICAgICAgICAg IHN0ZDo6dmVjdG9yPFBhdHRlcm5QdHI+IG1fcGF0dGVybnM7CisKKyAgICAgICAgICAgIGJvb2wg bWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0OworICAgICAgICAg ICAgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0OworICAgICAgICB9OworCisgICAgcHVibGljOgor ICAgICAgICBzdHJ1Y3QgRmlsdGVyTWF0Y2ggeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFt ZTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlIGNvbnN0Kj4gdGVzdHM7CisgICAg ICAgIH07CisgICAgICAgIHVzaW5nIE1hdGNoZXMgPSBzdGQ6OnZlY3RvcjxGaWx0ZXJNYXRjaD47 CisgICAgICAgIHVzaW5nIHZlY3RvclN0cmluZ3MgPSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz47 CisKKyAgICAgICAgYm9vbCBoYXNGaWx0ZXJzKCkgY29uc3Q7CisgICAgICAgIGJvb2wgbWF0Y2hl cyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0OworICAgICAgICBNYXRjaGVz IG1hdGNoZXNCeUZpbHRlciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0Q2FzZXMs IElDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0OworICAgICAgICBjb25zdCB2ZWN0b3JTdHJp bmdzICYgZ2V0SW52YWxpZEFyZ3MoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0 ZDo6dmVjdG9yPEZpbHRlcj4gbV9maWx0ZXJzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0 cmluZz4gbV9pbnZhbGlkQXJnczsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFRlc3RTcGVjUGFyc2Vy OworICAgIH07Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3Rp YyBwb3AKKyNlbmRpZgorCisvLyBlbmQgY2F0Y2hfdGVzdF9zcGVjLmgKKy8vIHN0YXJ0IGNhdGNo X2ludGVyZmFjZXNfdGFnX2FsaWFzX3JlZ2lzdHJ5LmgKKworI2luY2x1ZGUgPHN0cmluZz4KKwor bmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBUYWdBbGlhczsKKworICAgIHN0cnVjdCBJ VGFnQWxpYXNSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklUYWdBbGlhc1JlZ2lzdHJ5KCk7 CisgICAgICAgIC8vIE51bGxwdHIgaWYgbm90IHByZXNlbnQKKyAgICAgICAgdmlydHVhbCBUYWdB bGlhcyBjb25zdCogZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3QgPSAwOwor ICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNv bnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCA9IDA7CisKKyAgICAgICAgc3RhdGljIElU YWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXQoKTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3Bh Y2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX2ludGVyZmFjZXNfdGFnX2FsaWFzX3JlZ2lzdHJ5LmgK K25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0U3BlY1BhcnNlciB7CisgICAgICAg IGVudW0gTW9kZXsgTm9uZSwgTmFtZSwgUXVvdGVkTmFtZSwgVGFnLCBFc2NhcGVkTmFtZSB9Owor ICAgICAgICBNb2RlIG1fbW9kZSA9IE5vbmU7CisgICAgICAgIE1vZGUgbGFzdE1vZGUgPSBOb25l OworICAgICAgICBib29sIG1fZXhjbHVzaW9uID0gZmFsc2U7CisgICAgICAgIHN0ZDo6c2l6ZV90 IG1fcG9zID0gMDsKKyAgICAgICAgc3RkOjpzaXplX3QgbV9yZWFsUGF0dGVyblBvcyA9IDA7Cisg ICAgICAgIHN0ZDo6c3RyaW5nIG1fYXJnOworICAgICAgICBzdGQ6OnN0cmluZyBtX3N1YnN0cmlu ZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9wYXR0ZXJuTmFtZTsKKyAgICAgICAgc3RkOjp2ZWN0 b3I8c3RkOjpzaXplX3Q+IG1fZXNjYXBlQ2hhcnM7CisgICAgICAgIFRlc3RTcGVjOjpGaWx0ZXIg bV9jdXJyZW50RmlsdGVyOworICAgICAgICBUZXN0U3BlYyBtX3Rlc3RTcGVjOworICAgICAgICBJ VGFnQWxpYXNSZWdpc3RyeSBjb25zdCogbV90YWdBbGlhc2VzID0gbnVsbHB0cjsKKworICAgIHB1 YmxpYzoKKyAgICAgICAgVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiB0 YWdBbGlhc2VzICk7CisKKyAgICAgICAgVGVzdFNwZWNQYXJzZXImIHBhcnNlKCBzdGQ6OnN0cmlu ZyBjb25zdCYgYXJnICk7CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjKCk7CisKKyAgICBwcml2 YXRlOgorICAgICAgICBib29sIHZpc2l0Q2hhciggY2hhciBjICk7CisgICAgICAgIHZvaWQgc3Rh cnROZXdNb2RlKCBNb2RlIG1vZGUgKTsKKyAgICAgICAgYm9vbCBwcm9jZXNzTm9uZUNoYXIoIGNo YXIgYyApOworICAgICAgICB2b2lkIHByb2Nlc3NOYW1lQ2hhciggY2hhciBjICk7CisgICAgICAg IGJvb2wgcHJvY2Vzc090aGVyQ2hhciggY2hhciBjICk7CisgICAgICAgIHZvaWQgZW5kTW9kZSgp OworICAgICAgICB2b2lkIGVzY2FwZSgpOworICAgICAgICBib29sIGlzQ29udHJvbENoYXIoIGNo YXIgYyApIGNvbnN0OworICAgICAgICB2b2lkIHNhdmVMYXN0TW9kZSgpOworICAgICAgICB2b2lk IHJldmVydEJhY2tUb0xhc3RNb2RlKCk7CisgICAgICAgIHZvaWQgYWRkRmlsdGVyKCk7CisgICAg ICAgIGJvb2wgc2VwYXJhdGUoKTsKKworICAgICAgICAvLyBIYW5kbGVzIGNvbW1vbiBwcmVwcm9j ZXNzaW5nIG9mIHRoZSBwYXR0ZXJuIGZvciBuYW1lL3RhZyBwYXR0ZXJucworICAgICAgICBzdGQ6 OnN0cmluZyBwcmVwcm9jZXNzUGF0dGVybigpOworICAgICAgICAvLyBBZGRzIHRoZSBjdXJyZW50 IHBhdHRlcm4gYXMgYSB0ZXN0IG5hbWUKKyAgICAgICAgdm9pZCBhZGROYW1lUGF0dGVybigpOwor ICAgICAgICAvLyBBZGRzIHRoZSBjdXJyZW50IHBhdHRlcm4gYXMgYSB0YWcKKyAgICAgICAgdm9p ZCBhZGRUYWdQYXR0ZXJuKCk7CisKKyAgICAgICAgaW5saW5lIHZvaWQgYWRkQ2hhclRvUGF0dGVy bihjaGFyIGMpIHsKKyAgICAgICAgICAgIG1fc3Vic3RyaW5nICs9IGM7CisgICAgICAgICAgICBt X3BhdHRlcm5OYW1lICs9IGM7CisgICAgICAgICAgICBtX3JlYWxQYXR0ZXJuUG9zKys7CisgICAg ICAgIH0KKworICAgIH07CisgICAgVGVzdFNwZWMgcGFyc2VUZXN0U3BlYyggc3RkOjpzdHJpbmcg Y29uc3QmIGFyZyApOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19f CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworLy8gZW5kIGNhdGNoX3Rl c3Rfc3BlY19wYXJzZXIuaAorLy8gTGlic3RkYysrIGRvZXNuJ3QgbGlrZSBpbmNvbXBsZXRlIGNs YXNzZXMgZm9yIHVuaXF1ZV9wdHIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0 b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaWZuZGVmIENBVENIX0NPTkZJR19DT05TT0xFX1dJ RFRICisjZGVmaW5lIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIIDgwCisjZW5kaWYKKworbmFt ZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJU3RyZWFtOworCisgICAgc3RydWN0IENvbmZp Z0RhdGEgeworICAgICAgICBib29sIGxpc3RUZXN0cyA9IGZhbHNlOworICAgICAgICBib29sIGxp c3RUYWdzID0gZmFsc2U7CisgICAgICAgIGJvb2wgbGlzdFJlcG9ydGVycyA9IGZhbHNlOworICAg ICAgICBib29sIGxpc3RUZXN0TmFtZXNPbmx5ID0gZmFsc2U7CisKKyAgICAgICAgYm9vbCBzaG93 U3VjY2Vzc2Z1bFRlc3RzID0gZmFsc2U7CisgICAgICAgIGJvb2wgc2hvdWxkRGVidWdCcmVhayA9 IGZhbHNlOworICAgICAgICBib29sIG5vVGhyb3cgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBzaG93 SGVscCA9IGZhbHNlOworICAgICAgICBib29sIHNob3dJbnZpc2libGVzID0gZmFsc2U7CisgICAg ICAgIGJvb2wgZmlsZW5hbWVzQXNUYWdzID0gZmFsc2U7CisgICAgICAgIGJvb2wgbGliSWRlbnRp ZnkgPSBmYWxzZTsKKworICAgICAgICBpbnQgYWJvcnRBZnRlciA9IC0xOworICAgICAgICB1bnNp Z25lZCBpbnQgcm5nU2VlZCA9IDA7CisKKyAgICAgICAgYm9vbCBiZW5jaG1hcmtOb0FuYWx5c2lz ID0gZmFsc2U7CisgICAgICAgIHVuc2lnbmVkIGludCBiZW5jaG1hcmtTYW1wbGVzID0gMTAwOwor ICAgICAgICBkb3VibGUgYmVuY2htYXJrQ29uZmlkZW5jZUludGVydmFsID0gMC45NTsKKyAgICAg ICAgdW5zaWduZWQgaW50IGJlbmNobWFya1Jlc2FtcGxlcyA9IDEwMDAwMDsKKyAgICAgICAgc3Rk OjpjaHJvbm86Om1pbGxpc2Vjb25kczo6cmVwIGJlbmNobWFya1dhcm11cFRpbWUgPSAxMDA7CisK KyAgICAgICAgVmVyYm9zaXR5IHZlcmJvc2l0eSA9IFZlcmJvc2l0eTo6Tm9ybWFsOworICAgICAg ICBXYXJuQWJvdXQ6OldoYXQgd2FybmluZ3MgPSBXYXJuQWJvdXQ6Ok5vdGhpbmc7CisgICAgICAg IFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMgPSBTaG93RHVyYXRpb25zOjpEZWZh dWx0Rm9yUmVwb3J0ZXI7CisgICAgICAgIGRvdWJsZSBtaW5EdXJhdGlvbiA9IC0xOworICAgICAg ICBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXIgPSBSdW5UZXN0czo6SW5EZWNsYXJhdGlv bk9yZGVyOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gdXNlQ29sb3VyID0gVXNlQ29sb3Vy OjpBdXRvOworICAgICAgICBXYWl0Rm9yS2V5cHJlc3M6OldoZW4gd2FpdEZvcktleXByZXNzID0g V2FpdEZvcktleXByZXNzOjpOZXZlcjsKKworICAgICAgICBzdGQ6OnN0cmluZyBvdXRwdXRGaWxl bmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcHJv Y2Vzc05hbWU7CisjaWZuZGVmIENBVENIX0NPTkZJR19ERUZBVUxUX1JFUE9SVEVSCisjZGVmaW5l IENBVENIX0NPTkZJR19ERUZBVUxUX1JFUE9SVEVSICJjb25zb2xlIgorI2VuZGlmCisgICAgICAg IHN0ZDo6c3RyaW5nIHJlcG9ydGVyTmFtZSA9IENBVENIX0NPTkZJR19ERUZBVUxUX1JFUE9SVEVS OworI3VuZGVmIENBVENIX0NPTkZJR19ERUZBVUxUX1JFUE9SVEVSCisKKyAgICAgICAgc3RkOjp2 ZWN0b3I8c3RkOjpzdHJpbmc+IHRlc3RzT3JUYWdzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6 OnN0cmluZz4gc2VjdGlvbnNUb1J1bjsKKyAgICB9OworCisgICAgY2xhc3MgQ29uZmlnIDogcHVi bGljIElDb25maWcgeworICAgIHB1YmxpYzoKKworICAgICAgICBDb25maWcoKSA9IGRlZmF1bHQ7 CisgICAgICAgIENvbmZpZyggQ29uZmlnRGF0YSBjb25zdCYgZGF0YSApOworICAgICAgICB2aXJ0 dWFsIH5Db25maWcoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGdl dEZpbGVuYW1lKCkgY29uc3Q7CisKKyAgICAgICAgYm9vbCBsaXN0VGVzdHMoKSBjb25zdDsKKyAg ICAgICAgYm9vbCBsaXN0VGVzdE5hbWVzT25seSgpIGNvbnN0OworICAgICAgICBib29sIGxpc3RU YWdzKCkgY29uc3Q7CisgICAgICAgIGJvb2wgbGlzdFJlcG9ydGVycygpIGNvbnN0OworCisgICAg ICAgIHN0ZDo6c3RyaW5nIGdldFByb2Nlc3NOYW1lKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3Ry aW5nIGNvbnN0JiBnZXRSZXBvcnRlck5hbWUoKSBjb25zdDsKKworICAgICAgICBzdGQ6OnZlY3Rv cjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFRlc3RzT3JUYWdzKCkgY29uc3Qgb3ZlcnJpZGU7Cisg ICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZ2V0U2VjdGlvbnNUb1J1bigp IGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYygpIGNv bnN0IG92ZXJyaWRlOworICAgICAgICBib29sIGhhc1Rlc3RGaWx0ZXJzKCkgY29uc3Qgb3ZlcnJp ZGU7CisKKyAgICAgICAgYm9vbCBzaG93SGVscCgpIGNvbnN0OworCisgICAgICAgIC8vIElDb25m aWcgaW50ZXJmYWNlCisgICAgICAgIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdCBvdmVycmlkZTsK KyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAg c3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBib29sIGluY2x1ZGVT dWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBib29sIHdhcm5BYm91 dE1pc3NpbmdBc3NlcnRpb25zKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGJvb2wgd2FybkFi b3V0Tm9UZXN0cygpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBTaG93RHVyYXRpb25zOjpPck5v dCBzaG93RHVyYXRpb25zKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGRvdWJsZSBtaW5EdXJh dGlvbigpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVu T3JkZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSBj b25zdCBvdmVycmlkZTsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cigpIGNv bnN0IG92ZXJyaWRlOworICAgICAgICBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdCBvdmVy cmlkZTsKKyAgICAgICAgaW50IGFib3J0QWZ0ZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAg Ym9vbCBzaG93SW52aXNpYmxlcygpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBWZXJib3NpdHkg dmVyYm9zaXR5KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGJvb2wgYmVuY2htYXJrTm9BbmFs eXNpcygpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBpbnQgYmVuY2htYXJrU2FtcGxlcygpIGNv bnN0IG92ZXJyaWRlOworICAgICAgICBkb3VibGUgYmVuY2htYXJrQ29uZmlkZW5jZUludGVydmFs KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHVuc2lnbmVkIGludCBiZW5jaG1hcmtSZXNhbXBs ZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBi ZW5jaG1hcmtXYXJtdXBUaW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBwcml2YXRlOgorCisg ICAgICAgIElTdHJlYW0gY29uc3QqIG9wZW5TdHJlYW0oKTsKKyAgICAgICAgQ29uZmlnRGF0YSBt X2RhdGE7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElTdHJlYW0gY29uc3Q+IG1fc3RyZWFt OworICAgICAgICBUZXN0U3BlYyBtX3Rlc3RTcGVjOworICAgICAgICBib29sIG1faGFzVGVzdEZp bHRlcnMgPSBmYWxzZTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8g ZW5kIGNhdGNoX2NvbmZpZy5ocHAKKy8vIHN0YXJ0IGNhdGNoX2Fzc2VydGlvbnJlc3VsdC5oCisK KyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQXNz ZXJ0aW9uUmVzdWx0RGF0YQorICAgIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSgpID0g ZGVsZXRlOworCisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEoIFJlc3VsdFdhczo6T2ZUeXBl IF9yZXN1bHRUeXBlLCBMYXp5RXhwcmVzc2lvbiBjb25zdCYgX2xhenlFeHByZXNzaW9uICk7CisK KyAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgbXV0YWJsZSBzdGQ6OnN0cmlu ZyByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbjsKKyAgICAgICAgTGF6eUV4cHJlc3Npb24gbGF6eUV4 cHJlc3Npb247CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGU7CisKKyAgICAg ICAgc3RkOjpzdHJpbmcgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgfTsKKwor ICAgIGNsYXNzIEFzc2VydGlvblJlc3VsdCB7CisgICAgcHVibGljOgorICAgICAgICBBc3NlcnRp b25SZXN1bHQoKSA9IGRlbGV0ZTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25J bmZvIGNvbnN0JiBpbmZvLCBBc3NlcnRpb25SZXN1bHREYXRhIGNvbnN0JiBkYXRhICk7CisKKyAg ICAgICAgYm9vbCBpc09rKCkgY29uc3Q7CisgICAgICAgIGJvb2wgc3VjY2VlZGVkKCkgY29uc3Q7 CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIGdldFJlc3VsdFR5cGUoKSBjb25zdDsKKyAgICAg ICAgYm9vbCBoYXNFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaGFzTWVzc2FnZSgp IGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAg ICAgIHN0ZDo6c3RyaW5nIGdldEV4cHJlc3Npb25Jbk1hY3JvKCkgY29uc3Q7CisgICAgICAgIGJv b2wgaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdl dEV4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRNZXNz YWdlKCkgY29uc3Q7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGdldFNvdXJjZUluZm8oKSBjb25z dDsKKyAgICAgICAgU3RyaW5nUmVmIGdldFRlc3RNYWNyb05hbWUoKSBjb25zdDsKKworICAgIC8v cHJvdGVjdGVkOgorICAgICAgICBBc3NlcnRpb25JbmZvIG1faW5mbzsKKyAgICAgICAgQXNzZXJ0 aW9uUmVzdWx0RGF0YSBtX3Jlc3VsdERhdGE7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNl IENhdGNoCisKKy8vIGVuZCBjYXRjaF9hc3NlcnRpb25yZXN1bHQuaAorI2lmIGRlZmluZWQoQ0FU Q0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcpCisvLyBzdGFydCBjYXRjaF9lc3RpbWF0ZS5o cHAKKworIC8vIFN0YXRpc3RpY3MgZXN0aW1hdGVzCisKKworbmFtZXNwYWNlIENhdGNoIHsKKyAg ICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIER1cmF0 aW9uPgorICAgICAgICBzdHJ1Y3QgRXN0aW1hdGUgeworICAgICAgICAgICAgRHVyYXRpb24gcG9p bnQ7CisgICAgICAgICAgICBEdXJhdGlvbiBsb3dlcl9ib3VuZDsKKyAgICAgICAgICAgIER1cmF0 aW9uIHVwcGVyX2JvdW5kOworICAgICAgICAgICAgZG91YmxlIGNvbmZpZGVuY2VfaW50ZXJ2YWw7 CisKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEdXJhdGlvbjI+CisgICAgICAgICAg ICBvcGVyYXRvciBFc3RpbWF0ZTxEdXJhdGlvbjI+KCkgY29uc3QgeworICAgICAgICAgICAgICAg IHJldHVybiB7IHBvaW50LCBsb3dlcl9ib3VuZCwgdXBwZXJfYm91bmQsIGNvbmZpZGVuY2VfaW50 ZXJ2YWwgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9IC8vIG5hbWVzcGFjZSBC ZW5jaG1hcmsKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF9lc3RpbWF0ZS5o cHAKKy8vIHN0YXJ0IGNhdGNoX291dGxpZXJfY2xhc3NpZmljYXRpb24uaHBwCisKKy8vIE91dGxp ZXIgaW5mb3JtYXRpb24KKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBuYW1lc3BhY2UgQmVuY2ht YXJrIHsKKyAgICAgICAgc3RydWN0IE91dGxpZXJDbGFzc2lmaWNhdGlvbiB7CisgICAgICAgICAg ICBpbnQgc2FtcGxlc19zZWVuID0gMDsKKyAgICAgICAgICAgIGludCBsb3dfc2V2ZXJlID0gMDsg ICAgIC8vIG1vcmUgdGhhbiAzIHRpbWVzIElRUiBiZWxvdyBRMQorICAgICAgICAgICAgaW50IGxv d19taWxkID0gMDsgICAgICAgLy8gMS41IHRvIDMgdGltZXMgSVFSIGJlbG93IFExCisgICAgICAg ICAgICBpbnQgaGlnaF9taWxkID0gMDsgICAgICAvLyAxLjUgdG8gMyB0aW1lcyBJUVIgYWJvdmUg UTMKKyAgICAgICAgICAgIGludCBoaWdoX3NldmVyZSA9IDA7ICAgIC8vIG1vcmUgdGhhbiAzIHRp bWVzIElRUiBhYm92ZSBRMworCisgICAgICAgICAgICBpbnQgdG90YWwoKSBjb25zdCB7CisgICAg ICAgICAgICAgICAgcmV0dXJuIGxvd19zZXZlcmUgKyBsb3dfbWlsZCArIGhpZ2hfbWlsZCArIGhp Z2hfc2V2ZXJlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0gLy8gbmFtZXNwYWNl IEJlbmNobWFyaworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX291dGxpZXJf Y2xhc3NpZmljYXRpb24uaHBwCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNlbmRpZiAvLyBDQVRD SF9DT05GSUdfRU5BQkxFX0JFTkNITUFSS0lORworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1 ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1l bW9yeT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBz dHJ1Y3QgUmVwb3J0ZXJDb25maWcgeworICAgICAgICBleHBsaWNpdCBSZXBvcnRlckNvbmZpZygg SUNvbmZpZ1B0ciBjb25zdCYgX2Z1bGxDb25maWcgKTsKKworICAgICAgICBSZXBvcnRlckNvbmZp ZyggSUNvbmZpZ1B0ciBjb25zdCYgX2Z1bGxDb25maWcsIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSAp OworCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3Q7CisgICAgICAgIElDb25m aWdQdHIgZnVsbENvbmZpZygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpv c3RyZWFtKiBtX3N0cmVhbTsKKyAgICAgICAgSUNvbmZpZ1B0ciBtX2Z1bGxDb25maWc7CisgICAg fTsKKworICAgIHN0cnVjdCBSZXBvcnRlclByZWZlcmVuY2VzIHsKKyAgICAgICAgYm9vbCBzaG91 bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICBib29sIHNob3VsZFJlcG9ydEFsbEFz c2VydGlvbnMgPSBmYWxzZTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAg ICBzdHJ1Y3QgTGF6eVN0YXQgOiBPcHRpb248VD4geworICAgICAgICBMYXp5U3RhdCYgb3BlcmF0 b3I9KCBUIGNvbnN0JiBfdmFsdWUgKSB7CisgICAgICAgICAgICBPcHRpb248VD46Om9wZXJhdG9y PSggX3ZhbHVlICk7CisgICAgICAgICAgICB1c2VkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1 cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAg IE9wdGlvbjxUPjo6cmVzZXQoKTsKKyAgICAgICAgICAgIHVzZWQgPSBmYWxzZTsKKyAgICAgICAg fQorICAgICAgICBib29sIHVzZWQgPSBmYWxzZTsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RS dW5JbmZvIHsKKyAgICAgICAgVGVzdFJ1bkluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSAp OworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIH07CisgICAgc3RydWN0IEdyb3VwSW5m byB7CisgICAgICAgIEdyb3VwSW5mbyggIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAg ICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgX2dyb3VwSW5kZXgsCisgICAgICAgICAgICAgICAg ICAgIHN0ZDo6c2l6ZV90IF9ncm91cHNDb3VudCApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG5h bWU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXg7CisgICAgICAgIHN0ZDo6c2l6ZV90 IGdyb3Vwc0NvdW50czsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvblN0YXRzIHsKKyAg ICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgX2Fzc2VydGlvblJl c3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBj b25zdCYgX2luZm9NZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25z dCYgX3RvdGFscyApOworCisgICAgICAgIEFzc2VydGlvblN0YXRzKCBBc3NlcnRpb25TdGF0cyBj b25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cygg QXNzZXJ0aW9uU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAg QXNzZXJ0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSA9IGRl bGV0ZTsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25TdGF0 cyAmJiApICAgICA9IGRlbGV0ZTsKKyAgICAgICAgdmlydHVhbCB+QXNzZXJ0aW9uU3RhdHMoKTsK KworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0OworICAgICAgICBzdGQ6 OnZlY3RvcjxNZXNzYWdlSW5mbz4gaW5mb01lc3NhZ2VzOworICAgICAgICBUb3RhbHMgdG90YWxz OworICAgIH07CisKKyAgICBzdHJ1Y3QgU2VjdGlvblN0YXRzIHsKKyAgICAgICAgU2VjdGlvblN0 YXRzKCAgIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgICAg ICAgICAgICBDb3VudHMgY29uc3QmIF9hc3NlcnRpb25zLAorICAgICAgICAgICAgICAgICAgICAg ICAgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJv b2wgX21pc3NpbmdBc3NlcnRpb25zICk7CisgICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0 YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0 cyggU2VjdGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAg IFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyBjb25zdCYgKSA9IGRlZmF1 bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyAmJiAp ICAgICA9IGRlZmF1bHQ7CisgICAgICAgIHZpcnR1YWwgflNlY3Rpb25TdGF0cygpOworCisgICAg ICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOworICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsK KyAgICAgICAgZG91YmxlIGR1cmF0aW9uSW5TZWNvbmRzOworICAgICAgICBib29sIG1pc3NpbmdB c3NlcnRpb25zOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdENhc2VTdGF0cyB7CisgICAgICAg IFRlc3RDYXNlU3RhdHMoICBUZXN0Q2FzZUluZm8gY29uc3QmIF90ZXN0SW5mbywKKyAgICAgICAg ICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAg ICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RkT3V0LAorICAgICAgICAgICAgICAgICAgICAg ICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICBi b29sIF9hYm9ydGluZyApOworCisgICAgICAgIFRlc3RDYXNlU3RhdHMoIFRlc3RDYXNlU3RhdHMg Y29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cygg VGVzdENhc2VTdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBU ZXN0Q2FzZVN0YXRzJiBvcGVyYXRvciA9ICggVGVzdENhc2VTdGF0cyBjb25zdCYgKSA9IGRlZmF1 bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZVN0YXRzICYm ICkgICAgID0gZGVmYXVsdDsKKyAgICAgICAgdmlydHVhbCB+VGVzdENhc2VTdGF0cygpOworCisg ICAgICAgIFRlc3RDYXNlSW5mbyB0ZXN0SW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAg ICAgICAgc3RkOjpzdHJpbmcgc3RkT3V0OworICAgICAgICBzdGQ6OnN0cmluZyBzdGRFcnI7Cisg ICAgICAgIGJvb2wgYWJvcnRpbmc7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0R3JvdXBTdGF0 cyB7CisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBHcm91cEluZm8gY29uc3QmIF9ncm91cEluZm8s CisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAg ICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApOworICAgICAgICBUZXN0R3JvdXBTdGF0 cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvICk7CisKKyAgICAgICAgVGVzdEdyb3VwU3Rh dHMoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAg ICAgIFRlc3RHcm91cFN0YXRzKCBUZXN0R3JvdXBTdGF0cyAmJiApICAgICAgICAgICAgICAgICAg PSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RHcm91 cFN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMmIG9wZXJh dG9yID0gKCBUZXN0R3JvdXBTdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisgICAgICAgIHZpcnR1 YWwgflRlc3RHcm91cFN0YXRzKCk7CisKKyAgICAgICAgR3JvdXBJbmZvIGdyb3VwSW5mbzsKKyAg ICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisg ICAgc3RydWN0IFRlc3RSdW5TdGF0cyB7CisgICAgICAgIFRlc3RSdW5TdGF0cyggICBUZXN0UnVu SW5mbyBjb25zdCYgX3J1bkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29u c3QmIF90b3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApOwor CisgICAgICAgIFRlc3RSdW5TdGF0cyggVGVzdFJ1blN0YXRzIGNvbnN0JiApICAgICAgICAgICAg ICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RSdW5TdGF0cyggVGVzdFJ1blN0YXRzICYmICkgICAg ICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RSdW5TdGF0cyYgb3BlcmF0b3Ig PSAoIFRlc3RSdW5TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RSdW5TdGF0 cyYgb3BlcmF0b3IgPSAoIFRlc3RSdW5TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisgICAgICAg IHZpcnR1YWwgflRlc3RSdW5TdGF0cygpOworCisgICAgICAgIFRlc3RSdW5JbmZvIHJ1bkluZm87 CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgICAgIGJvb2wgYWJvcnRpbmc7CisgICAgfTsK KworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcpCisgICAgc3Ry dWN0IEJlbmNobWFya0luZm8geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBk b3VibGUgZXN0aW1hdGVkRHVyYXRpb247CisgICAgICAgIGludCBpdGVyYXRpb25zOworICAgICAg ICBpbnQgc2FtcGxlczsKKyAgICAgICAgdW5zaWduZWQgaW50IHJlc2FtcGxlczsKKyAgICAgICAg ZG91YmxlIGNsb2NrUmVzb2x1dGlvbjsKKyAgICAgICAgZG91YmxlIGNsb2NrQ29zdDsKKyAgICB9 OworCisgICAgdGVtcGxhdGUgPGNsYXNzIER1cmF0aW9uPgorICAgIHN0cnVjdCBCZW5jaG1hcmtT dGF0cyB7CisgICAgICAgIEJlbmNobWFya0luZm8gaW5mbzsKKworICAgICAgICBzdGQ6OnZlY3Rv cjxEdXJhdGlvbj4gc2FtcGxlczsKKyAgICAgICAgQmVuY2htYXJrOjpFc3RpbWF0ZTxEdXJhdGlv bj4gbWVhbjsKKyAgICAgICAgQmVuY2htYXJrOjpFc3RpbWF0ZTxEdXJhdGlvbj4gc3RhbmRhcmRE ZXZpYXRpb247CisgICAgICAgIEJlbmNobWFyazo6T3V0bGllckNsYXNzaWZpY2F0aW9uIG91dGxp ZXJzOworICAgICAgICBkb3VibGUgb3V0bGllclZhcmlhbmNlOworCisgICAgICAgIHRlbXBsYXRl IDx0eXBlbmFtZSBEdXJhdGlvbjI+CisgICAgICAgIG9wZXJhdG9yIEJlbmNobWFya1N0YXRzPER1 cmF0aW9uMj4oKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEdXJhdGlvbjI+IHNh bXBsZXMyOworICAgICAgICAgICAgc2FtcGxlczIucmVzZXJ2ZShzYW1wbGVzLnNpemUoKSk7Cisg ICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybShzYW1wbGVzLmJlZ2luKCksIHNhbXBsZXMuZW5kKCks IHN0ZDo6YmFja19pbnNlcnRlcihzYW1wbGVzMiksIFtdKER1cmF0aW9uIGQpIHsgcmV0dXJuIER1 cmF0aW9uMihkKTsgfSk7CisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgIGlu Zm8sCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHNhbXBsZXMyKSwKKyAgICAgICAgICAgICAg ICBtZWFuLAorICAgICAgICAgICAgICAgIHN0YW5kYXJkRGV2aWF0aW9uLAorICAgICAgICAgICAg ICAgIG91dGxpZXJzLAorICAgICAgICAgICAgICAgIG91dGxpZXJWYXJpYW5jZSwKKyAgICAgICAg ICAgIH07CisgICAgICAgIH0KKyAgICB9OworI2VuZGlmIC8vIENBVENIX0NPTkZJR19FTkFCTEVf QkVOQ0hNQVJLSU5HCisKKyAgICBzdHJ1Y3QgSVN0cmVhbWluZ1JlcG9ydGVyIHsKKyAgICAgICAg dmlydHVhbCB+SVN0cmVhbWluZ1JlcG9ydGVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIC8vIElt cGxlbWVudGluZyBjbGFzcyBtdXN0IGFsc28gcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBt ZXRob2RzOgorICAgICAgICAvLyBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsK KyAgICAgICAgLy8gc3RhdGljIHN0ZDo6c2V0PFZlcmJvc2l0eT4gZ2V0U3VwcG9ydGVkVmVyYm9z aXRpZXMoKQorCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJl bmNlcygpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RD YXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2 b2lkIHJlcG9ydEludmFsaWRBcmd1bWVudHMoc3RkOjpzdHJpbmcgY29uc3QmKSB7fQorCisgICAg ICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0 UnVuSW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBH cm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQg dGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKyAg ICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNl Y3Rpb25JbmZvICkgPSAwOworCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRU5BQkxFX0JFTkNI TUFSS0lORykKKyAgICAgICAgdmlydHVhbCB2b2lkIGJlbmNobWFya1ByZXBhcmluZyggc3RkOjpz dHJpbmcgY29uc3QmICkge30KKyAgICAgICAgdmlydHVhbCB2b2lkIGJlbmNobWFya1N0YXJ0aW5n KCBCZW5jaG1hcmtJbmZvIGNvbnN0JiApIHt9CisgICAgICAgIHZpcnR1YWwgdm9pZCBiZW5jaG1h cmtFbmRlZCggQmVuY2htYXJrU3RhdHM8PiBjb25zdCYgKSB7fQorICAgICAgICB2aXJ0dWFsIHZv aWQgYmVuY2htYXJrRmFpbGVkKCBzdGQ6OnN0cmluZyBjb25zdCYgKSB7fQorI2VuZGlmIC8vIENB VENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HCisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFz c2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiBhc3NlcnRpb25JbmZvICkgPSAw OworCisgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdl cyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRp b25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgPSAwOworCisg ICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2Vj dGlvblN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVz dENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2 b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMg KSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBj b25zdCYgdGVzdFJ1blN0YXRzICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVz dCggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKworICAgICAgICAvLyBEZWZh dWx0IGVtcHR5IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkCisgICAgICAgIHZpcnR1YWwgdm9pZCBm YXRhbEVycm9yRW5jb3VudGVyZWQoIFN0cmluZ1JlZiBuYW1lICk7CisKKyAgICAgICAgdmlydHVh bCBib29sIGlzTXVsdGkoKSBjb25zdDsKKyAgICB9OworICAgIHVzaW5nIElTdHJlYW1pbmdSZXBv cnRlclB0ciA9IHN0ZDo6dW5pcXVlX3B0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+OworCisgICAgc3Ry dWN0IElSZXBvcnRlckZhY3RvcnkgeworICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXJGYWN0b3J5 KCk7CisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyUHRyIGNyZWF0ZSggUmVwb3J0 ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6 OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0ID0gMDsKKyAgICB9OworICAgIHVzaW5nIElS ZXBvcnRlckZhY3RvcnlQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8SVJlcG9ydGVyRmFjdG9yeT47CisK KyAgICBzdHJ1Y3QgSVJlcG9ydGVyUmVnaXN0cnkgeworICAgICAgICB1c2luZyBGYWN0b3J5TWFw ID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIElSZXBvcnRlckZhY3RvcnlQdHI+OworICAgICAgICB1 c2luZyBMaXN0ZW5lcnMgPSBzdGQ6OnZlY3RvcjxJUmVwb3J0ZXJGYWN0b3J5UHRyPjsKKworICAg ICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXJSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIElTdHJl YW1pbmdSZXBvcnRlclB0ciBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBJQ29uZmln UHRyIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgRmFjdG9yeU1h cCBjb25zdCYgZ2V0RmFjdG9yaWVzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIExpc3Rl bmVycyBjb25zdCYgZ2V0TGlzdGVuZXJzKCkgY29uc3QgPSAwOworICAgIH07CisKK30gLy8gZW5k IG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfaW50ZXJmYWNlc19yZXBvcnRlci5oCisj aW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y2Zsb2F0 PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1lbW9y eT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHZvaWQgcHJl cGFyZUV4cGFuZGVkRXhwcmVzc2lvbihBc3NlcnRpb25SZXN1bHQmIHJlc3VsdCk7CisKKyAgICAv LyBSZXR1cm5zIGRvdWJsZSBmb3JtYXR0ZWQgYXMgJS4zZiAoZm9ybWF0IGV4cGVjdGVkIG9uIG91 dHB1dCkKKyAgICBzdGQ6OnN0cmluZyBnZXRGb3JtYXR0ZWREdXJhdGlvbiggZG91YmxlIGR1cmF0 aW9uICk7CisKKyAgICAvLyEgU2hvdWxkIHRoZSByZXBvcnRlciBzaG93CisgICAgYm9vbCBzaG91 bGRTaG93RHVyYXRpb24oIElDb25maWcgY29uc3QmIGNvbmZpZywgZG91YmxlIGR1cmF0aW9uICk7 CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0 cmluZz4gY29uc3QmIGNvbnRhaW5lciApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZl ZFQ+CisgICAgc3RydWN0IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSA6IElTdHJlYW1pbmdSZXBvcnRl ciB7CisKKyAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25z dCYgX2NvbmZpZyApCisgICAgICAgIDogICBtX2NvbmZpZyggX2NvbmZpZy5mdWxsQ29uZmlnKCkg KSwKKyAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJlYW0oKSApCisgICAgICAgIHsKKyAg ICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOwor ICAgICAgICAgICAgaWYoICFEZXJpdmVkVDo6Z2V0U3VwcG9ydGVkVmVyYm9zaXRpZXMoKS5jb3Vu dCggbV9jb25maWctPnZlcmJvc2l0eSgpICkgKQorICAgICAgICAgICAgICAgIENBVENIX0VSUk9S KCAiVmVyYm9zaXR5IGxldmVsIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyByZXBvcnRlciIgKTsKKyAg ICAgICAgfQorCisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBj b25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclByZWZzOworICAg ICAgICB9CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c2V0PFZlcmJvc2l0eT4gZ2V0U3VwcG9ydGVk VmVyYm9zaXRpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4geyBWZXJib3NpdHk6Ok5vcm1hbCB9 OworICAgICAgICB9CisKKyAgICAgICAgflN0cmVhbWluZ1JlcG9ydGVyQmFzZSgpIG92ZXJyaWRl ID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoc3RkOjpzdHJp bmcgY29uc3QmKSBvdmVycmlkZSB7fQorCisgICAgICAgIHZvaWQgcmVwb3J0SW52YWxpZEFyZ3Vt ZW50cyhzdGQ6OnN0cmluZyBjb25zdCYpIG92ZXJyaWRlIHt9CisKKyAgICAgICAgdm9pZCB0ZXN0 UnVuU3RhcnRpbmcoVGVzdFJ1bkluZm8gY29uc3QmIF90ZXN0UnVuSW5mbykgb3ZlcnJpZGUgewor ICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvID0gX3Rlc3RSdW5JbmZvOworICAgICAgICB9 CisKKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyhHcm91cEluZm8gY29uc3QmIF9ncm91 cEluZm8pIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8gPSBfZ3JvdXBJ bmZvOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKFRlc3RDYXNl SW5mbyBjb25zdCYgX3Rlc3RJbmZvKSBvdmVycmlkZSAgeworICAgICAgICAgICAgY3VycmVudFRl c3RDYXNlSW5mbyA9IF90ZXN0SW5mbzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNlY3Rpb25T dGFydGluZyhTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvKSBvdmVycmlkZSB7CisgICAg ICAgICAgICBtX3NlY3Rpb25TdGFjay5wdXNoX2JhY2soX3NlY3Rpb25JbmZvKTsKKyAgICAgICAg fQorCisgICAgICAgIHZvaWQgc2VjdGlvbkVuZGVkKFNlY3Rpb25TdGF0cyBjb25zdCYgLyogX3Nl Y3Rpb25TdGF0cyAqLykgb3ZlcnJpZGUgeworICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucG9w X2JhY2soKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHRlc3RDYXNlRW5kZWQoVGVzdENhc2VT dGF0cyBjb25zdCYgLyogX3Rlc3RDYXNlU3RhdHMgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgICAg IGN1cnJlbnRUZXN0Q2FzZUluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHRl c3RHcm91cEVuZGVkKFRlc3RHcm91cFN0YXRzIGNvbnN0JiAvKiBfdGVzdEdyb3VwU3RhdHMgKi8p IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8ucmVzZXQoKTsKKyAgICAg ICAgfQorICAgICAgICB2b2lkIHRlc3RSdW5FbmRlZChUZXN0UnVuU3RhdHMgY29uc3QmIC8qIF90 ZXN0UnVuU3RhdHMgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUlu Zm8ucmVzZXQoKTsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8ucmVzZXQoKTsKKyAgICAg ICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mby5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAg dm9pZCBza2lwVGVzdChUZXN0Q2FzZUluZm8gY29uc3QmKSBvdmVycmlkZSB7CisgICAgICAgICAg ICAvLyBEb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgYnkgZGVmYXVsdC4KKyAgICAgICAgICAg IC8vIEl0IGNhbiBvcHRpb25hbGx5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIGRlcml2ZWQgY2xhc3Mu CisgICAgICAgIH0KKworICAgICAgICBJQ29uZmlnUHRyIG1fY29uZmlnOworICAgICAgICBzdGQ6 Om9zdHJlYW0mIHN0cmVhbTsKKworICAgICAgICBMYXp5U3RhdDxUZXN0UnVuSW5mbz4gY3VycmVu dFRlc3RSdW5JbmZvOworICAgICAgICBMYXp5U3RhdDxHcm91cEluZm8+IGN1cnJlbnRHcm91cElu Zm87CisgICAgICAgIExhenlTdGF0PFRlc3RDYXNlSW5mbz4gY3VycmVudFRlc3RDYXNlSW5mbzsK KworICAgICAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uSW5mbz4gbV9zZWN0aW9uU3RhY2s7CisgICAg ICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgbV9yZXBvcnRlclByZWZzOworICAgIH07CisKKyAgICB0 ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkVD4KKyAgICBzdHJ1Y3QgQ3VtdWxhdGl2ZVJlcG9ydGVy QmFzZSA6IElTdHJlYW1pbmdSZXBvcnRlciB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQs IHR5cGVuYW1lIENoaWxkTm9kZVQ+CisgICAgICAgIHN0cnVjdCBOb2RlIHsKKyAgICAgICAgICAg IGV4cGxpY2l0IE5vZGUoIFQgY29uc3QmIF92YWx1ZSApIDogdmFsdWUoIF92YWx1ZSApIHt9Cisg ICAgICAgICAgICB2aXJ0dWFsIH5Ob2RlKCkge30KKworICAgICAgICAgICAgdXNpbmcgQ2hpbGRO b2RlcyA9IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDaGlsZE5vZGVUPj47CisgICAgICAg ICAgICBUIHZhbHVlOworICAgICAgICAgICAgQ2hpbGROb2RlcyBjaGlsZHJlbjsKKyAgICAgICAg fTsKKyAgICAgICAgc3RydWN0IFNlY3Rpb25Ob2RlIHsKKyAgICAgICAgICAgIGV4cGxpY2l0IFNl Y3Rpb25Ob2RlKFNlY3Rpb25TdGF0cyBjb25zdCYgX3N0YXRzKSA6IHN0YXRzKF9zdGF0cykge30K KyAgICAgICAgICAgIHZpcnR1YWwgflNlY3Rpb25Ob2RlKCkgPSBkZWZhdWx0OworCisgICAgICAg ICAgICBib29sIG9wZXJhdG9yID09IChTZWN0aW9uTm9kZSBjb25zdCYgb3RoZXIpIGNvbnN0IHsK KyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm8gPT0gb3Ro ZXIuc3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAg ICBib29sIG9wZXJhdG9yID09IChzdGQ6OnNoYXJlZF9wdHI8U2VjdGlvbk5vZGU+IGNvbnN0JiBv dGhlcikgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCpvdGhlcik7 CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyBzdGF0czsKKyAgICAg ICAgICAgIHVzaW5nIENoaWxkU2VjdGlvbnMgPSBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8 U2VjdGlvbk5vZGU+PjsKKyAgICAgICAgICAgIHVzaW5nIEFzc2VydGlvbnMgPSBzdGQ6OnZlY3Rv cjxBc3NlcnRpb25TdGF0cz47CisgICAgICAgICAgICBDaGlsZFNlY3Rpb25zIGNoaWxkU2VjdGlv bnM7CisgICAgICAgICAgICBBc3NlcnRpb25zIGFzc2VydGlvbnM7CisgICAgICAgICAgICBzdGQ6 OnN0cmluZyBzdGRPdXQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdGRFcnI7CisgICAgICAg IH07CisKKyAgICAgICAgc3RydWN0IEJ5U2VjdGlvbkluZm8geworICAgICAgICAgICAgQnlTZWN0 aW9uSW5mbyggU2VjdGlvbkluZm8gY29uc3QmIG90aGVyICkgOiBtX290aGVyKCBvdGhlciApIHt9 CisgICAgICAgICAgICBCeVNlY3Rpb25JbmZvKCBCeVNlY3Rpb25JbmZvIGNvbnN0JiBvdGhlciAp IDogbV9vdGhlciggb3RoZXIubV9vdGhlciApIHt9CisgICAgICAgICAgICBib29sIG9wZXJhdG9y KCkgKHN0ZDo6c2hhcmVkX3B0cjxTZWN0aW9uTm9kZT4gY29uc3QmIG5vZGUpIGNvbnN0IHsKKyAg ICAgICAgICAgICAgICByZXR1cm4gKChub2RlLT5zdGF0cy5zZWN0aW9uSW5mby5uYW1lID09IG1f b3RoZXIubmFtZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChub2RlLT5zdGF0cy5zZWN0 aW9uSW5mby5saW5lSW5mbyA9PSBtX290aGVyLmxpbmVJbmZvKSk7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgICB2b2lkIG9wZXJhdG9yPShCeVNlY3Rpb25JbmZvIGNvbnN0JikgPSBkZWxldGU7 CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIGNvbnN0JiBtX290 aGVyOworICAgICAgICB9OworCisgICAgICAgIHVzaW5nIFRlc3RDYXNlTm9kZSA9IE5vZGU8VGVz dENhc2VTdGF0cywgU2VjdGlvbk5vZGU+OworICAgICAgICB1c2luZyBUZXN0R3JvdXBOb2RlID0g Tm9kZTxUZXN0R3JvdXBTdGF0cywgVGVzdENhc2VOb2RlPjsKKyAgICAgICAgdXNpbmcgVGVzdFJ1 bk5vZGUgPSBOb2RlPFRlc3RSdW5TdGF0cywgVGVzdEdyb3VwTm9kZT47CisKKyAgICAgICAgQ3Vt dWxhdGl2ZVJlcG9ydGVyQmFzZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAg ICAgICA6ICAgbV9jb25maWcoIF9jb25maWcuZnVsbENvbmZpZygpICksCisgICAgICAgICAgICBz dHJlYW0oIF9jb25maWcuc3RyZWFtKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9y dGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmKCAh RGVyaXZlZFQ6OmdldFN1cHBvcnRlZFZlcmJvc2l0aWVzKCkuY291bnQoIG1fY29uZmlnLT52ZXJi b3NpdHkoKSApICkKKyAgICAgICAgICAgICAgICBDQVRDSF9FUlJPUiggIlZlcmJvc2l0eSBsZXZl bCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVwb3J0ZXIiICk7CisgICAgICAgIH0KKyAgICAgICAg fkN1bXVsYXRpdmVSZXBvcnRlckJhc2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAgICAg UmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAg ICAgICAgICAgIHJldHVybiBtX3JlcG9ydGVyUHJlZnM7CisgICAgICAgIH0KKworICAgICAgICBz dGF0aWMgc3RkOjpzZXQ8VmVyYm9zaXR5PiBnZXRTdXBwb3J0ZWRWZXJib3NpdGllcygpIHsKKyAg ICAgICAgICAgIHJldHVybiB7IFZlcmJvc2l0eTo6Tm9ybWFsIH07CisgICAgICAgIH0KKworICAg ICAgICB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmICkgb3ZlcnJpZGUg e30KKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiApIG92 ZXJyaWRlIHt9CisKKyAgICAgICAgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8g Y29uc3QmICkgb3ZlcnJpZGUge30KKworICAgICAgICB2b2lkIHNlY3Rpb25TdGFydGluZyggU2Vj dGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgU2Vj dGlvblN0YXRzIGluY29tcGxldGVTdGF0cyggc2VjdGlvbkluZm8sIENvdW50cygpLCAwLCBmYWxz ZSApOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlY3Rpb25Ob2RlPiBub2RlOworICAg ICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAg aWYoICFtX3Jvb3RTZWN0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgbV9yb290U2VjdGlvbiA9 IHN0ZDo6bWFrZV9zaGFyZWQ8U2VjdGlvbk5vZGU+KCBpbmNvbXBsZXRlU3RhdHMgKTsKKyAgICAg ICAgICAgICAgICBub2RlID0gbV9yb290U2VjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAg ICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBwYXJlbnROb2RlID0gKm1f c2VjdGlvblN0YWNrLmJhY2soKTsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0KKyAgICAgICAg ICAgICAgICAgICAgc3RkOjpmaW5kX2lmKCAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5iZWdp bigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGls ZFNlY3Rpb25zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlT ZWN0aW9uSW5mbyggc2VjdGlvbkluZm8gKSApOworICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBw YXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIG5v ZGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNlY3Rpb25Ob2RlPiggaW5jb21wbGV0ZVN0YXRzICk7Cisg ICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5wdXNoX2JhY2soIG5v ZGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAg ICAgICAgICAgICBub2RlID0gKml0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9zZWN0 aW9uU3RhY2sucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9u ID0gc3RkOjptb3ZlKG5vZGUpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhc3NlcnRpb25T dGFydGluZyhBc3NlcnRpb25JbmZvIGNvbnN0Jikgb3ZlcnJpZGUge30KKworICAgICAgICBib29s IGFzc2VydGlvbkVuZGVkKEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cykgb3Zl cnJpZGUgeworICAgICAgICAgICAgYXNzZXJ0KCFtX3NlY3Rpb25TdGFjay5lbXB0eSgpKTsKKyAg ICAgICAgICAgIC8vIEFzc2VydGlvblJlc3VsdCBob2xkcyBhIHBvaW50ZXIgdG8gYSB0ZW1wb3Jh cnkgRGVjb21wb3NlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAvLyB3aGljaCBnZXRFeHBhbmRl ZEV4cHJlc3Npb24oKSBjYWxscyB0byBidWlsZCB0aGUgZXhwcmVzc2lvbiBzdHJpbmcuCisgICAg ICAgICAgICAvLyBPdXIgc2VjdGlvbiBzdGFjayBjb3B5IG9mIHRoZSBhc3NlcnRpb25SZXN1bHQg d2lsbCBsaWtlbHkgb3V0bGl2ZSB0aGUKKyAgICAgICAgICAgIC8vIHRlbXBvcmFyeSwgc28gaXQg bXVzdCBiZSBleHBhbmRlZCBvciBkaXNjYXJkZWQgbm93IHRvIGF2b2lkIGNhbGxpbmcKKyAgICAg ICAgICAgIC8vIGEgZGVzdHJveWVkIG9iamVjdCBsYXRlci4KKyAgICAgICAgICAgIHByZXBhcmVF eHBhbmRlZEV4cHJlc3Npb24oY29uc3RfY2FzdDxBc3NlcnRpb25SZXN1bHQmPiggYXNzZXJ0aW9u U3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICkgKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBzZWN0 aW9uTm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICBzZWN0aW9uTm9k ZS5hc3NlcnRpb25zLnB1c2hfYmFjayhhc3NlcnRpb25TdGF0cyk7CisgICAgICAgICAgICByZXR1 cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNlY3Rpb25FbmRlZChTZWN0aW9uU3Rh dHMgY29uc3QmIHNlY3Rpb25TdGF0cykgb3ZlcnJpZGUgeworICAgICAgICAgICAgYXNzZXJ0KCFt X3NlY3Rpb25TdGFjay5lbXB0eSgpKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBub2RlID0g Km1fc2VjdGlvblN0YWNrLmJhY2soKTsKKyAgICAgICAgICAgIG5vZGUuc3RhdHMgPSBzZWN0aW9u U3RhdHM7CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICB9 CisgICAgICAgIHZvaWQgdGVzdENhc2VFbmRlZChUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2Fz ZVN0YXRzKSBvdmVycmlkZSB7CisgICAgICAgICAgICBhdXRvIG5vZGUgPSBzdGQ6Om1ha2Vfc2hh cmVkPFRlc3RDYXNlTm9kZT4odGVzdENhc2VTdGF0cyk7CisgICAgICAgICAgICBhc3NlcnQobV9z ZWN0aW9uU3RhY2suc2l6ZSgpID09IDApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4ucHVz aF9iYWNrKG1fcm9vdFNlY3Rpb24pOworICAgICAgICAgICAgbV90ZXN0Q2FzZXMucHVzaF9iYWNr KG5vZGUpOworICAgICAgICAgICAgbV9yb290U2VjdGlvbi5yZXNldCgpOworCisgICAgICAgICAg ICBhc3NlcnQobV9kZWVwZXN0U2VjdGlvbik7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9u LT5zdGRPdXQgPSB0ZXN0Q2FzZVN0YXRzLnN0ZE91dDsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNl Y3Rpb24tPnN0ZEVyciA9IHRlc3RDYXNlU3RhdHMuc3RkRXJyOworICAgICAgICB9CisgICAgICAg IHZvaWQgdGVzdEdyb3VwRW5kZWQoVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRz KSBvdmVycmlkZSB7CisgICAgICAgICAgICBhdXRvIG5vZGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRl c3RHcm91cE5vZGU+KHRlc3RHcm91cFN0YXRzKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVu LnN3YXAobV90ZXN0Q2FzZXMpOworICAgICAgICAgICAgbV90ZXN0R3JvdXBzLnB1c2hfYmFjayhu b2RlKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHRlc3RSdW5FbmRlZChUZXN0UnVuU3RhdHMg Y29uc3QmIHRlc3RSdW5TdGF0cykgb3ZlcnJpZGUgeworICAgICAgICAgICAgYXV0byBub2RlID0g c3RkOjptYWtlX3NoYXJlZDxUZXN0UnVuTm9kZT4odGVzdFJ1blN0YXRzKTsKKyAgICAgICAgICAg IG5vZGUtPmNoaWxkcmVuLnN3YXAobV90ZXN0R3JvdXBzKTsKKyAgICAgICAgICAgIG1fdGVzdFJ1 bnMucHVzaF9iYWNrKG5vZGUpOworICAgICAgICAgICAgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgp OworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWRDdW11bGF0aXZl KCkgPSAwOworCisgICAgICAgIHZvaWQgc2tpcFRlc3QoVGVzdENhc2VJbmZvIGNvbnN0Jikgb3Zl cnJpZGUge30KKworICAgICAgICBJQ29uZmlnUHRyIG1fY29uZmlnOworICAgICAgICBzdGQ6Om9z dHJlYW0mIHN0cmVhbTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXNzZXJ0aW9uU3RhdHM+IG1fYXNz ZXJ0aW9uczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRy PFNlY3Rpb25Ob2RlPj4+IG1fc2VjdGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hh cmVkX3B0cjxUZXN0Q2FzZU5vZGU+PiBtX3Rlc3RDYXNlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8 c3RkOjpzaGFyZWRfcHRyPFRlc3RHcm91cE5vZGU+PiBtX3Rlc3RHcm91cHM7CisKKyAgICAgICAg c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRlc3RSdW5Ob2RlPj4gbV90ZXN0UnVuczsKKwor ICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VjdGlvbk5vZGU+IG1fcm9vdFNlY3Rpb247CisgICAg ICAgIHN0ZDo6c2hhcmVkX3B0cjxTZWN0aW9uTm9kZT4gbV9kZWVwZXN0U2VjdGlvbjsKKyAgICAg ICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFNlY3Rpb25Ob2RlPj4gbV9zZWN0aW9uU3Rh Y2s7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgbV9yZXBvcnRlclByZWZzOworICAgIH07 CisKKyAgICB0ZW1wbGF0ZTxjaGFyIEM+CisgICAgY2hhciBjb25zdCogZ2V0TGluZU9mQ2hhcnMo KSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEhd ID0gezB9OworICAgICAgICBpZiggISpsaW5lICkgeworICAgICAgICAgICAgc3RkOjptZW1zZXQo IGxpbmUsIEMsIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKTsKKyAgICAgICAgICAgIGxp bmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMV0gPSAwOworICAgICAgICB9CisgICAgICAg IHJldHVybiBsaW5lOworICAgIH0KKworICAgIHN0cnVjdCBUZXN0RXZlbnRMaXN0ZW5lckJhc2Ug OiBTdHJlYW1pbmdSZXBvcnRlckJhc2U8VGVzdEV2ZW50TGlzdGVuZXJCYXNlPiB7CisgICAgICAg IFRlc3RFdmVudExpc3RlbmVyQmFzZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKTsK KworICAgICAgICBzdGF0aWMgc3RkOjpzZXQ8VmVyYm9zaXR5PiBnZXRTdXBwb3J0ZWRWZXJib3Np dGllcygpOworCisgICAgICAgIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoQXNzZXJ0aW9uSW5mbyBj b25zdCYpIG92ZXJyaWRlOworICAgICAgICBib29sIGFzc2VydGlvbkVuZGVkKEFzc2VydGlvblN0 YXRzIGNvbnN0Jikgb3ZlcnJpZGU7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNo CisKKy8vIGVuZCBjYXRjaF9yZXBvcnRlcl9iYXNlcy5ocHAKKy8vIHN0YXJ0IGNhdGNoX2NvbnNv bGVfY29sb3VyLmgKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb2xvdXIgewor ICAgICAgICBlbnVtIENvZGUgeworICAgICAgICAgICAgTm9uZSA9IDAsCisKKyAgICAgICAgICAg IFdoaXRlLAorICAgICAgICAgICAgUmVkLAorICAgICAgICAgICAgR3JlZW4sCisgICAgICAgICAg ICBCbHVlLAorICAgICAgICAgICAgQ3lhbiwKKyAgICAgICAgICAgIFllbGxvdywKKyAgICAgICAg ICAgIEdyZXksCisKKyAgICAgICAgICAgIEJyaWdodCA9IDB4MTAsCisKKyAgICAgICAgICAgIEJy aWdodFJlZCA9IEJyaWdodCB8IFJlZCwKKyAgICAgICAgICAgIEJyaWdodEdyZWVuID0gQnJpZ2h0 IHwgR3JlZW4sCisgICAgICAgICAgICBMaWdodEdyZXkgPSBCcmlnaHQgfCBHcmV5LAorICAgICAg ICAgICAgQnJpZ2h0V2hpdGUgPSBCcmlnaHQgfCBXaGl0ZSwKKyAgICAgICAgICAgIEJyaWdodFll bGxvdyA9IEJyaWdodCB8IFllbGxvdywKKworICAgICAgICAgICAgLy8gQnkgaW50ZW50aW9uCisg ICAgICAgICAgICBGaWxlTmFtZSA9IExpZ2h0R3JleSwKKyAgICAgICAgICAgIFdhcm5pbmcgPSBC cmlnaHRZZWxsb3csCisgICAgICAgICAgICBSZXN1bHRFcnJvciA9IEJyaWdodFJlZCwKKyAgICAg ICAgICAgIFJlc3VsdFN1Y2Nlc3MgPSBCcmlnaHRHcmVlbiwKKyAgICAgICAgICAgIFJlc3VsdEV4 cGVjdGVkRmFpbHVyZSA9IFdhcm5pbmcsCisKKyAgICAgICAgICAgIEVycm9yID0gQnJpZ2h0UmVk LAorICAgICAgICAgICAgU3VjY2VzcyA9IEdyZWVuLAorCisgICAgICAgICAgICBPcmlnaW5hbEV4 cHJlc3Npb24gPSBDeWFuLAorICAgICAgICAgICAgUmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBC cmlnaHRZZWxsb3csCisKKyAgICAgICAgICAgIFNlY29uZGFyeVRleHQgPSBMaWdodEdyZXksCisg ICAgICAgICAgICBIZWFkZXJzID0gV2hpdGUKKyAgICAgICAgfTsKKworICAgICAgICAvLyBVc2Ug Y29uc3RydWN0ZWQgb2JqZWN0IGZvciBSQUlJIGd1YXJkCisgICAgICAgIENvbG91ciggQ29kZSBf Y29sb3VyQ29kZSApOworICAgICAgICBDb2xvdXIoIENvbG91ciYmIG90aGVyICkgbm9leGNlcHQ7 CisgICAgICAgIENvbG91ciYgb3BlcmF0b3I9KCBDb2xvdXImJiBvdGhlciApIG5vZXhjZXB0Owor ICAgICAgICB+Q29sb3VyKCk7CisKKyAgICAgICAgLy8gVXNlIHN0YXRpYyBtZXRob2QgZm9yIG9u ZS1zaG90IGNoYW5nZXMKKyAgICAgICAgc3RhdGljIHZvaWQgdXNlKCBDb2RlIF9jb2xvdXJDb2Rl ICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBib29sIG1fbW92ZWQgPSBmYWxzZTsKKyAgICB9 OworCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIENv bG91ciBjb25zdCYgKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRj aF9jb25zb2xlX2NvbG91ci5oCisvLyBzdGFydCBjYXRjaF9yZXBvcnRlcl9yZWdpc3RyYXJzLmhw cAorCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAg IGNsYXNzIFJlcG9ydGVyUmVnaXN0cmFyIHsKKworICAgICAgICBjbGFzcyBSZXBvcnRlckZhY3Rv cnkgOiBwdWJsaWMgSVJlcG9ydGVyRmFjdG9yeSB7CisKKyAgICAgICAgICAgIElTdHJlYW1pbmdS ZXBvcnRlclB0ciBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCBv dmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxUPiggbmV3 IFQoIGNvbmZpZyApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5n IGdldERlc2NyaXB0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVy biBUOjpnZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAg cHVibGljOgorCisgICAgICAgIGV4cGxpY2l0IFJlcG9ydGVyUmVnaXN0cmFyKCBzdGQ6OnN0cmlu ZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJl Z2lzdGVyUmVwb3J0ZXIoIG5hbWUsIHN0ZDo6bWFrZV9zaGFyZWQ8UmVwb3J0ZXJGYWN0b3J5Pigp ICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBj bGFzcyBMaXN0ZW5lclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgTGlzdGVuZXJGYWN0b3J5 IDogcHVibGljIElSZXBvcnRlckZhY3RvcnkgeworCisgICAgICAgICAgICBJU3RyZWFtaW5nUmVw b3J0ZXJQdHIgY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3Qgb3Zl cnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VD4oIG5ldyBU KCBjb25maWcgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2V0 RGVzY3JpcHRpb24oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0 ZDo6c3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisK KyAgICAgICAgTGlzdGVuZXJSZWdpc3RyYXIoKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVn aXN0cnlIdWIoKS5yZWdpc3Rlckxpc3RlbmVyKCBzdGQ6Om1ha2Vfc2hhcmVkPExpc3RlbmVyRmFj dG9yeT4oKSApOworICAgICAgICB9CisgICAgfTsKK30KKworI2lmICFkZWZpbmVkKENBVENIX0NP TkZJR19ESVNBQkxFKQorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCBy ZXBvcnRlclR5cGUgKSBcCisgICAgQ0FUQ0hfSU5URVJOQUxfU1RBUlRfV0FSTklOR1NfU1VQUFJF U1NJT04gICAgICAgICBcCisgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfR0xPQkFMU19XQVJO SU5HUyAgICAgICAgICBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6UmVwb3J0ZXJSZWdpc3RyYXI8 cmVwb3J0ZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI3JlcG9ydGVyVHlwZSgg bmFtZSApOyB9IFwKKyAgICBDQVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9O CisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIoIGxpc3RlbmVyVHlwZSApIFwKKyAg ICBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTiAgIFwKKyAgICBDQVRD SF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dBUk5JTkdTICAgIFwKKyAgICBuYW1lc3BhY2V7 IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5cGU+IGNhdGNoX2ludGVybmFsX1Jl Z2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9IFwKKyAgICBDQVRDSF9JTlRFUk5BTF9TVE9QX1dB Uk5JTkdTX1NVUFBSRVNTSU9OCisjZWxzZSAvLyBDQVRDSF9DT05GSUdfRElTQUJMRQorCisjZGVm aW5lIENBVENIX1JFR0lTVEVSX1JFUE9SVEVSKG5hbWUsIHJlcG9ydGVyVHlwZSkKKyNkZWZpbmUg Q0FUQ0hfUkVHSVNURVJfTElTVEVORVIobGlzdGVuZXJUeXBlKQorCisjZW5kaWYgLy8gQ0FUQ0hf Q09ORklHX0RJU0FCTEUKKworLy8gZW5kIGNhdGNoX3JlcG9ydGVyX3JlZ2lzdHJhcnMuaHBwCisv LyBBbGxvdyB1c2VycyB0byBiYXNlIHRoZWlyIHdvcmsgb2ZmIGV4aXN0aW5nIHJlcG9ydGVycwor Ly8gc3RhcnQgY2F0Y2hfcmVwb3J0ZXJfY29tcGFjdC5oCisKK25hbWVzcGFjZSBDYXRjaCB7CisK KyAgICBzdHJ1Y3QgQ29tcGFjdFJlcG9ydGVyIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlPENvbXBh Y3RSZXBvcnRlcj4geworCisgICAgICAgIHVzaW5nIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6U3Ry ZWFtaW5nUmVwb3J0ZXJCYXNlOworCisgICAgICAgIH5Db21wYWN0UmVwb3J0ZXIoKSBvdmVycmlk ZTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKKworICAg ICAgICB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMpIG92 ZXJyaWRlOworCisgICAgICAgIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoQXNzZXJ0aW9uSW5mbyBj b25zdCYpIG92ZXJyaWRlOworCisgICAgICAgIGJvb2wgYXNzZXJ0aW9uRW5kZWQoQXNzZXJ0aW9u U3RhdHMgY29uc3QmIF9hc3NlcnRpb25TdGF0cykgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCBz ZWN0aW9uRW5kZWQoU2VjdGlvblN0YXRzIGNvbnN0JiBfc2VjdGlvblN0YXRzKSBvdmVycmlkZTsK KworICAgICAgICB2b2lkIHRlc3RSdW5FbmRlZChUZXN0UnVuU3RhdHMgY29uc3QmIF90ZXN0UnVu U3RhdHMpIG92ZXJyaWRlOworCisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisK Ky8vIGVuZCBjYXRjaF9yZXBvcnRlcl9jb21wYWN0LmgKKy8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVy X2NvbnNvbGUuaAorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNwcmFnbWEgd2FybmluZyhwdXNo KQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDA2MSkgLy8gTm90IGFsbCBsYWJlbHMgYXJlIEVY UExJQ0lUTFkgaGFuZGxlZCBpbiBzd2l0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IC8vIE5vdGUgdGhhdCA0MDYyIChub3QgYWxsIGxhYmVscyBhcmUgaGFuZGxlZAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRlZmF1bHQgaXMgbWlzc2luZykgaXMgZW5hYmxl ZAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgLy8gRndkIGRlY2xzCisgICAgc3Ry dWN0IFN1bW1hcnlDb2x1bW47CisgICAgY2xhc3MgVGFibGVQcmludGVyOworCisgICAgc3RydWN0 IENvbnNvbGVSZXBvcnRlciA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZTxDb25zb2xlUmVwb3J0ZXI+ IHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRhYmxlUHJpbnRlcj4gbV90YWJsZVByaW50ZXI7 CisKKyAgICAgICAgQ29uc29sZVJlcG9ydGVyKFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcp OworICAgICAgICB+Q29uc29sZVJlcG9ydGVyKCkgb3ZlcnJpZGU7CisgICAgICAgIHN0YXRpYyBz dGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisgICAgICAgIHZvaWQgbm9NYXRjaGluZ1Rl c3RDYXNlcyhzdGQ6OnN0cmluZyBjb25zdCYgc3BlYykgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9p ZCByZXBvcnRJbnZhbGlkQXJndW1lbnRzKHN0ZDo6c3RyaW5nIGNvbnN0JmFyZykgb3ZlcnJpZGU7 CisKKyAgICAgICAgdm9pZCBhc3NlcnRpb25TdGFydGluZyhBc3NlcnRpb25JbmZvIGNvbnN0Jikg b3ZlcnJpZGU7CisKKyAgICAgICAgYm9vbCBhc3NlcnRpb25FbmRlZChBc3NlcnRpb25TdGF0cyBj b25zdCYgX2Fzc2VydGlvblN0YXRzKSBvdmVycmlkZTsKKworICAgICAgICB2b2lkIHNlY3Rpb25T dGFydGluZyhTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvKSBvdmVycmlkZTsKKyAgICAg ICAgdm9pZCBzZWN0aW9uRW5kZWQoU2VjdGlvblN0YXRzIGNvbnN0JiBfc2VjdGlvblN0YXRzKSBv dmVycmlkZTsKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcp CisgICAgICAgIHZvaWQgYmVuY2htYXJrUHJlcGFyaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1l KSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBiZW5jaG1hcmtTdGFydGluZyhCZW5jaG1hcmtJbmZv IGNvbnN0JiBpbmZvKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBiZW5jaG1hcmtFbmRlZChCZW5j aG1hcmtTdGF0czw+IGNvbnN0JiBzdGF0cykgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgYmVuY2ht YXJrRmFpbGVkKHN0ZDo6c3RyaW5nIGNvbnN0JiBlcnJvcikgb3ZlcnJpZGU7CisjZW5kaWYgLy8g Q0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcKKworICAgICAgICB2b2lkIHRlc3RDYXNl RW5kZWQoVGVzdENhc2VTdGF0cyBjb25zdCYgX3Rlc3RDYXNlU3RhdHMpIG92ZXJyaWRlOworICAg ICAgICB2b2lkIHRlc3RHcm91cEVuZGVkKFRlc3RHcm91cFN0YXRzIGNvbnN0JiBfdGVzdEdyb3Vw U3RhdHMpIG92ZXJyaWRlOworICAgICAgICB2b2lkIHRlc3RSdW5FbmRlZChUZXN0UnVuU3RhdHMg Y29uc3QmIF90ZXN0UnVuU3RhdHMpIG92ZXJyaWRlOworICAgICAgICB2b2lkIHRlc3RSdW5TdGFy dGluZyhUZXN0UnVuSW5mbyBjb25zdCYgX3Rlc3RSdW5JbmZvKSBvdmVycmlkZTsKKyAgICBwcml2 YXRlOgorCisgICAgICAgIHZvaWQgbGF6eVByaW50KCk7CisKKyAgICAgICAgdm9pZCBsYXp5UHJp bnRXaXRob3V0Q2xvc2luZ0JlbmNobWFya1RhYmxlKCk7CisgICAgICAgIHZvaWQgbGF6eVByaW50 UnVuSW5mbygpOworICAgICAgICB2b2lkIGxhenlQcmludEdyb3VwSW5mbygpOworICAgICAgICB2 b2lkIHByaW50VGVzdENhc2VBbmRTZWN0aW9uSGVhZGVyKCk7CisKKyAgICAgICAgdm9pZCBwcmlu dENsb3NlZEhlYWRlcihzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUpOworICAgICAgICB2b2lkIHBy aW50T3BlbkhlYWRlcihzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUpOworCisgICAgICAgIC8vIGlm IHN0cmluZyBoYXMgYSA6IGluIGZpcnN0IGxpbmUgd2lsbCBzZXQgaW5kZW50IHRvIGZvbGxvdyBp dCBvbgorICAgICAgICAvLyBzdWJzZXF1ZW50IGxpbmVzCisgICAgICAgIHZvaWQgcHJpbnRIZWFk ZXJTdHJpbmcoc3RkOjpzdHJpbmcgY29uc3QmIF9zdHJpbmcsIHN0ZDo6c2l6ZV90IGluZGVudCA9 IDApOworCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHMoVG90YWxzIGNvbnN0JiB0b3RhbHMpOwor ICAgICAgICB2b2lkIHByaW50U3VtbWFyeVJvdyhzdGQ6OnN0cmluZyBjb25zdCYgbGFiZWwsIHN0 ZDo6dmVjdG9yPFN1bW1hcnlDb2x1bW4+IGNvbnN0JiBjb2xzLCBzdGQ6OnNpemVfdCByb3cpOwor CisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHNEaXZpZGVyKFRvdGFscyBjb25zdCYgdG90YWxzKTsK KyAgICAgICAgdm9pZCBwcmludFN1bW1hcnlEaXZpZGVyKCk7CisgICAgICAgIHZvaWQgcHJpbnRU ZXN0RmlsdGVycygpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBtX2hlYWRlclByaW50 ZWQgPSBmYWxzZTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmIGRl ZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKy8vIGVuZCBj YXRjaF9yZXBvcnRlcl9jb25zb2xlLmgKKy8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVyX2p1bml0LmgK KworLy8gc3RhcnQgY2F0Y2hfeG1sd3JpdGVyLmgKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFt ZXNwYWNlIENhdGNoIHsKKyAgICBlbnVtIGNsYXNzIFhtbEZvcm1hdHRpbmcgeworICAgICAgICBO b25lID0gMHgwMCwKKyAgICAgICAgSW5kZW50ID0gMHgwMSwKKyAgICAgICAgTmV3bGluZSA9IDB4 MDIsCisgICAgfTsKKworICAgIFhtbEZvcm1hdHRpbmcgb3BlcmF0b3IgfCAoWG1sRm9ybWF0dGlu ZyBsaHMsIFhtbEZvcm1hdHRpbmcgcmhzKTsKKyAgICBYbWxGb3JtYXR0aW5nIG9wZXJhdG9yICYg KFhtbEZvcm1hdHRpbmcgbGhzLCBYbWxGb3JtYXR0aW5nIHJocyk7CisKKyAgICBjbGFzcyBYbWxF bmNvZGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBGb3JXaGF0IHsgRm9yVGV4dE5vZGVz LCBGb3JBdHRyaWJ1dGVzIH07CisKKyAgICAgICAgWG1sRW5jb2RlKCBzdGQ6OnN0cmluZyBjb25z dCYgc3RyLCBGb3JXaGF0IGZvcldoYXQgPSBGb3JUZXh0Tm9kZXMgKTsKKworICAgICAgICB2b2lk IGVuY29kZVRvKCBzdGQ6Om9zdHJlYW0mIG9zICkgY29uc3Q7CisKKyAgICAgICAgZnJpZW5kIHN0 ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBYbWxFbmNvZGUgY29u c3QmIHhtbEVuY29kZSApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9z dHI7CisgICAgICAgIEZvcldoYXQgbV9mb3JXaGF0OworICAgIH07CisKKyAgICBjbGFzcyBYbWxX cml0ZXIgeworICAgIHB1YmxpYzoKKworICAgICAgICBjbGFzcyBTY29wZWRFbGVtZW50IHsKKyAg ICAgICAgcHVibGljOgorICAgICAgICAgICAgU2NvcGVkRWxlbWVudCggWG1sV3JpdGVyKiB3cml0 ZXIsIFhtbEZvcm1hdHRpbmcgZm10ICk7CisKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQoIFNj b3BlZEVsZW1lbnQmJiBvdGhlciApIG5vZXhjZXB0OworICAgICAgICAgICAgU2NvcGVkRWxlbWVu dCYgb3BlcmF0b3I9KCBTY29wZWRFbGVtZW50JiYgb3RoZXIgKSBub2V4Y2VwdDsKKworICAgICAg ICAgICAgflNjb3BlZEVsZW1lbnQoKTsKKworICAgICAgICAgICAgU2NvcGVkRWxlbWVudCYgd3Jp dGVUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCwgWG1sRm9ybWF0dGluZyBmbXQgPSBYbWxG b3JtYXR0aW5nOjpOZXdsaW5lIHwgWG1sRm9ybWF0dGluZzo6SW5kZW50ICk7CisKKyAgICAgICAg ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgICAgICBTY29wZWRFbGVtZW50JiB3cml0 ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFQgY29uc3QmIGF0dHJpYnV0ZSAp IHsKKyAgICAgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVBdHRyaWJ1dGUoIG5hbWUsIGF0dHJp YnV0ZSApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKwor ICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgbXV0YWJsZSBYbWxXcml0ZXIqIG1fd3JpdGVy ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIFhtbEZvcm1hdHRpbmcgbV9mbXQ7CisgICAgICAgIH07 CisKKyAgICAgICAgWG1sV3JpdGVyKCBzdGQ6Om9zdHJlYW0mIG9zID0gQ2F0Y2g6OmNvdXQoKSAp OworICAgICAgICB+WG1sV3JpdGVyKCk7CisKKyAgICAgICAgWG1sV3JpdGVyKCBYbWxXcml0ZXIg Y29uc3QmICkgPSBkZWxldGU7CisgICAgICAgIFhtbFdyaXRlciYgb3BlcmF0b3I9KCBYbWxXcml0 ZXIgY29uc3QmICkgPSBkZWxldGU7CisKKyAgICAgICAgWG1sV3JpdGVyJiBzdGFydEVsZW1lbnQo IHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBYbWxGb3JtYXR0aW5nIGZtdCA9IFhtbEZvcm1hdHRp bmc6Ok5ld2xpbmUgfCBYbWxGb3JtYXR0aW5nOjpJbmRlbnQpOworCisgICAgICAgIFNjb3BlZEVs ZW1lbnQgc2NvcGVkRWxlbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFhtbEZvcm1hdHRp bmcgZm10ID0gWG1sRm9ybWF0dGluZzo6TmV3bGluZSB8IFhtbEZvcm1hdHRpbmc6OkluZGVudCk7 CisKKyAgICAgICAgWG1sV3JpdGVyJiBlbmRFbGVtZW50KFhtbEZvcm1hdHRpbmcgZm10ID0gWG1s Rm9ybWF0dGluZzo6TmV3bGluZSB8IFhtbEZvcm1hdHRpbmc6OkluZGVudCk7CisKKyAgICAgICAg WG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIHN0ZDo6 c3RyaW5nIGNvbnN0JiBhdHRyaWJ1dGUgKTsKKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0 cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgYm9vbCBhdHRyaWJ1dGUgKTsKKworICAg ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmli dXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgVCBjb25zdCYgYXR0cmlidXRlICkgeworICAg ICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAgICAgICAgICAgcnNzIDw8IGF0 dHJpYnV0ZTsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZUF0dHJpYnV0ZSggbmFtZSwgcnNzLnN0 cigpICk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlVGV4dCggc3RkOjpz dHJpbmcgY29uc3QmIHRleHQsIFhtbEZvcm1hdHRpbmcgZm10ID0gWG1sRm9ybWF0dGluZzo6TmV3 bGluZSB8IFhtbEZvcm1hdHRpbmc6OkluZGVudCk7CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0 ZUNvbW1lbnQoc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIFhtbEZvcm1hdHRpbmcgZm10ID0gWG1s Rm9ybWF0dGluZzo6TmV3bGluZSB8IFhtbEZvcm1hdHRpbmc6OkluZGVudCk7CisKKyAgICAgICAg dm9pZCB3cml0ZVN0eWxlc2hlZXRSZWYoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1cmwgKTsKKworICAg ICAgICBYbWxXcml0ZXImIHdyaXRlQmxhbmtMaW5lKCk7CisKKyAgICAgICAgdm9pZCBlbnN1cmVU YWdDbG9zZWQoKTsKKworICAgIHByaXZhdGU6CisKKyAgICAgICAgdm9pZCBhcHBseUZvcm1hdHRp bmcoWG1sRm9ybWF0dGluZyBmbXQpOworCisgICAgICAgIHZvaWQgd3JpdGVEZWNsYXJhdGlvbigp OworCisgICAgICAgIHZvaWQgbmV3bGluZUlmTmVjZXNzYXJ5KCk7CisKKyAgICAgICAgYm9vbCBt X3RhZ0lzT3BlbiA9IGZhbHNlOworICAgICAgICBib29sIG1fbmVlZHNOZXdsaW5lID0gZmFsc2U7 CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtX3RhZ3M7CisgICAgICAgIHN0ZDo6 c3RyaW5nIG1faW5kZW50OworICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fb3M7CisgICAgfTsKKwor fQorCisvLyBlbmQgY2F0Y2hfeG1sd3JpdGVyLmgKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBj bGFzcyBKdW5pdFJlcG9ydGVyIDogcHVibGljIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U8SnVuaXRS ZXBvcnRlcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgSnVuaXRSZXBvcnRlcihSZXBvcnRlckNv bmZpZyBjb25zdCYgX2NvbmZpZyk7CisKKyAgICAgICAgfkp1bml0UmVwb3J0ZXIoKSBvdmVycmlk ZTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKKworICAg ICAgICB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoc3RkOjpzdHJpbmcgY29uc3QmIC8qc3BlYyov KSBvdmVycmlkZTsKKworICAgICAgICB2b2lkIHRlc3RSdW5TdGFydGluZyhUZXN0UnVuSW5mbyBj b25zdCYgcnVuSW5mbykgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGlu ZyhHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbykgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCB0 ZXN0Q2FzZVN0YXJ0aW5nKFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvKSBvdmVycmlk ZTsKKyAgICAgICAgYm9vbCBhc3NlcnRpb25FbmRlZChBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNz ZXJ0aW9uU3RhdHMpIG92ZXJyaWRlOworCisgICAgICAgIHZvaWQgdGVzdENhc2VFbmRlZChUZXN0 Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzKSBvdmVycmlkZTsKKworICAgICAgICB2b2lk IHRlc3RHcm91cEVuZGVkKFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cykgb3Zl cnJpZGU7CisKKyAgICAgICAgdm9pZCB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCkgb3ZlcnJpZGU7 CisKKyAgICAgICAgdm9pZCB3cml0ZUdyb3VwKFRlc3RHcm91cE5vZGUgY29uc3QmIGdyb3VwTm9k ZSwgZG91YmxlIHN1aXRlVGltZSk7CisKKyAgICAgICAgdm9pZCB3cml0ZVRlc3RDYXNlKFRlc3RD YXNlTm9kZSBjb25zdCYgdGVzdENhc2VOb2RlKTsKKworICAgICAgICB2b2lkIHdyaXRlU2VjdGlv biggc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiByb290TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9kZSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgIGJvb2wgdGVzdE9rVG9GYWlsICk7CisKKyAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlv bnMoU2VjdGlvbk5vZGUgY29uc3QmIHNlY3Rpb25Ob2RlKTsKKyAgICAgICAgdm9pZCB3cml0ZUFz c2VydGlvbihBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHMpOworCisgICAgICAgIFhtbFdyaXRl ciB4bWw7CisgICAgICAgIFRpbWVyIHN1aXRlVGltZXI7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0 ZE91dEZvclN1aXRlOworICAgICAgICBzdGQ6OnN0cmluZyBzdGRFcnJGb3JTdWl0ZTsKKyAgICAg ICAgdW5zaWduZWQgaW50IHVuZXhwZWN0ZWRFeGNlcHRpb25zID0gMDsKKyAgICAgICAgYm9vbCBt X29rVG9GYWlsID0gZmFsc2U7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisK Ky8vIGVuZCBjYXRjaF9yZXBvcnRlcl9qdW5pdC5oCisvLyBzdGFydCBjYXRjaF9yZXBvcnRlcl94 bWwuaAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFhtbFJlcG9ydGVyIDogcHVibGlj IFN0cmVhbWluZ1JlcG9ydGVyQmFzZTxYbWxSZXBvcnRlcj4geworICAgIHB1YmxpYzoKKyAgICAg ICAgWG1sUmVwb3J0ZXIoUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcpOworCisgICAgICAg IH5YbWxSZXBvcnRlcigpIG92ZXJyaWRlOworCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBn ZXREZXNjcmlwdGlvbigpOworCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0U3R5bGVz aGVldFJlZigpIGNvbnN0OworCisgICAgICAgIHZvaWQgd3JpdGVTb3VyY2VJbmZvKFNvdXJjZUxp bmVJbmZvIGNvbnN0JiBzb3VyY2VJbmZvKTsKKworICAgIHB1YmxpYzogLy8gU3RyZWFtaW5nUmVw b3J0ZXJCYXNlCisKKyAgICAgICAgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKHN0ZDo6c3RyaW5n IGNvbnN0JiBzKSBvdmVycmlkZTsKKworICAgICAgICB2b2lkIHRlc3RSdW5TdGFydGluZyhUZXN0 UnVuSW5mbyBjb25zdCYgdGVzdEluZm8pIG92ZXJyaWRlOworCisgICAgICAgIHZvaWQgdGVzdEdy b3VwU3RhcnRpbmcoR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8pIG92ZXJyaWRlOworCisgICAg ICAgIHZvaWQgdGVzdENhc2VTdGFydGluZyhUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvKSBv dmVycmlkZTsKKworICAgICAgICB2b2lkIHNlY3Rpb25TdGFydGluZyhTZWN0aW9uSW5mbyBjb25z dCYgc2VjdGlvbkluZm8pIG92ZXJyaWRlOworCisgICAgICAgIHZvaWQgYXNzZXJ0aW9uU3RhcnRp bmcoQXNzZXJ0aW9uSW5mbyBjb25zdCYpIG92ZXJyaWRlOworCisgICAgICAgIGJvb2wgYXNzZXJ0 aW9uRW5kZWQoQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzKSBvdmVycmlkZTsK KworICAgICAgICB2b2lkIHNlY3Rpb25FbmRlZChTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25T dGF0cykgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCB0ZXN0Q2FzZUVuZGVkKFRlc3RDYXNlU3Rh dHMgY29uc3QmIHRlc3RDYXNlU3RhdHMpIG92ZXJyaWRlOworCisgICAgICAgIHZvaWQgdGVzdEdy b3VwRW5kZWQoVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzKSBvdmVycmlkZTsK KworICAgICAgICB2b2lkIHRlc3RSdW5FbmRlZChUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5T dGF0cykgb3ZlcnJpZGU7CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hN QVJLSU5HKQorICAgICAgICB2b2lkIGJlbmNobWFya1ByZXBhcmluZyhzdGQ6OnN0cmluZyBjb25z dCYgbmFtZSkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgYmVuY2htYXJrU3RhcnRpbmcoQmVuY2ht YXJrSW5mbyBjb25zdCYpIG92ZXJyaWRlOworICAgICAgICB2b2lkIGJlbmNobWFya0VuZGVkKEJl bmNobWFya1N0YXRzPD4gY29uc3QmKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBiZW5jaG1hcmtG YWlsZWQoc3RkOjpzdHJpbmcgY29uc3QmKSBvdmVycmlkZTsKKyNlbmRpZiAvLyBDQVRDSF9DT05G SUdfRU5BQkxFX0JFTkNITUFSS0lORworCisgICAgcHJpdmF0ZToKKyAgICAgICAgVGltZXIgbV90 ZXN0Q2FzZVRpbWVyOworICAgICAgICBYbWxXcml0ZXIgbV94bWw7CisgICAgICAgIGludCBtX3Nl Y3Rpb25EZXB0aCA9IDA7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8v IGVuZCBjYXRjaF9yZXBvcnRlcl94bWwuaAorCisvLyBlbmQgY2F0Y2hfZXh0ZXJuYWxfaW50ZXJm YWNlcy5oCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1B UktJTkcpCisvLyBzdGFydCBjYXRjaF9iZW5jaG1hcmtpbmdfYWxsLmhwcAorCisvLyBBIHByb3h5 IGhlYWRlciB0aGF0IGluY2x1ZGVzIGFsbCBvZiB0aGUgYmVuY2htYXJraW5nIGhlYWRlcnMgdG8g YWxsb3cKKy8vIGNvbmNpc2UgaW5jbHVkZSBvZiB0aGUgYmVuY2htYXJraW5nIGZlYXR1cmVzLiBZ b3Ugc2hvdWxkIHByZWZlciB0aGUKKy8vIGluZGl2aWR1YWwgaW5jbHVkZXMgaW4gc3RhbmRhcmQg dXNlLgorCisvLyBzdGFydCBjYXRjaF9iZW5jaG1hcmsuaHBwCisKKyAvLyBCZW5jaG1hcmsKKwor Ly8gc3RhcnQgY2F0Y2hfY2hyb25vbWV0ZXIuaHBwCisKKy8vIFVzZXItZmFjaW5nIGNocm9ub21l dGVyCisKKworLy8gc3RhcnQgY2F0Y2hfY2xvY2suaHBwCisKKy8vIENsb2NrcworCisKKyNpbmNs dWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8cmF0aW8+CisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAg bmFtZXNwYWNlIEJlbmNobWFyayB7CisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jaz4K KyAgICAgICAgdXNpbmcgQ2xvY2tEdXJhdGlvbiA9IHR5cGVuYW1lIENsb2NrOjpkdXJhdGlvbjsK KyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrPgorICAgICAgICB1c2luZyBGbG9hdER1 cmF0aW9uID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgdHlwZW5hbWUgQ2xvY2s6OnBl cmlvZD47CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrPgorICAgICAgICB1c2lu ZyBUaW1lUG9pbnQgPSB0eXBlbmFtZSBDbG9jazo6dGltZV9wb2ludDsKKworICAgICAgICB1c2lu ZyBkZWZhdWx0X2Nsb2NrID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazsKKworICAgICAgICB0 ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2s+CisgICAgICAgIHN0cnVjdCBub3cgeworICAgICAgICAg ICAgVGltZVBvaW50PENsb2NrPiBvcGVyYXRvcigpKCkgY29uc3QgeworICAgICAgICAgICAgICAg IHJldHVybiBDbG9jazo6bm93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAg ICAgdXNpbmcgZnBfc2Vjb25kcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6 cmF0aW88MT4+OworICAgIH0gLy8gbmFtZXNwYWNlIEJlbmNobWFyaworfSAvLyBuYW1lc3BhY2Ug Q2F0Y2gKKworLy8gZW5kIGNhdGNoX2Nsb2NrLmhwcAorLy8gc3RhcnQgY2F0Y2hfb3B0aW1pemVy LmhwcAorCisgLy8gSGludGluZyB0aGUgb3B0aW1pemVyCisKKworI2lmIGRlZmluZWQoX01TQ19W RVIpCisjICAgaW5jbHVkZSA8YXRvbWljPiAvLyBhdG9taWNfdGhyZWFkX2ZlbmNlCisjZW5kaWYK KworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKKyNpZiBkZWZp bmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKyAgICAgICAgdGVtcGxhdGUgPHR5 cGVuYW1lIFQ+CisgICAgICAgIGlubGluZSB2b2lkIGtlZXBfbWVtb3J5KFQqIHApIHsKKyAgICAg ICAgICAgIGFzbSB2b2xhdGlsZSgiIiA6IDogImciKHApIDogIm1lbW9yeSIpOworICAgICAgICB9 CisgICAgICAgIGlubGluZSB2b2lkIGtlZXBfbWVtb3J5KCkgeworICAgICAgICAgICAgYXNtIHZv bGF0aWxlKCIiIDogOiA6ICJtZW1vcnkiKTsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWVzcGFj ZSBEZXRhaWwgeworICAgICAgICAgICAgaW5saW5lIHZvaWQgb3B0aW1pemVyX2JhcnJpZXIoKSB7 IGtlZXBfbWVtb3J5KCk7IH0KKyAgICAgICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCisjZWxpZiBk ZWZpbmVkKF9NU0NfVkVSKQorCisjcHJhZ21hIG9wdGltaXplKCIiLCBvZmYpCisgICAgICAgIHRl bXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICBpbmxpbmUgdm9pZCBrZWVwX21lbW9yeShUKiBw KSB7CisgICAgICAgICAgICAvLyB0aGFua3MgQG1pbGxlbml1bWJ1ZworICAgICAgICAgICAgKnJl aW50ZXJwcmV0X2Nhc3Q8Y2hhciB2b2xhdGlsZSo+KHApID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y2hh ciBjb25zdCB2b2xhdGlsZSo+KHApOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gZXF1aXZh bGVudCBrZWVwX21lbW9yeSgpCisjcHJhZ21hIG9wdGltaXplKCIiLCBvbikKKworICAgICAgICBu YW1lc3BhY2UgRGV0YWlsIHsKKyAgICAgICAgICAgIGlubGluZSB2b2lkIG9wdGltaXplcl9iYXJy aWVyKCkgeworICAgICAgICAgICAgICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1l bW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBuYW1lc3Bh Y2UgRGV0YWlsCisKKyNlbmRpZgorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAg ICAgICBpbmxpbmUgdm9pZCBkZW9wdGltaXplX3ZhbHVlKFQmJiB4KSB7CisgICAgICAgICAgICBr ZWVwX21lbW9yeSgmeCk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUg Rm4sIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgICAgIGlubGluZSBhdXRvIGludm9rZV9kZW9wdGlt aXplZChGbiYmIGZuLCBBcmdzJiYuLi4gYXJncykgLT4gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8 IXN0ZDo6aXNfc2FtZTx2b2lkLCBkZWNsdHlwZShmbihhcmdzLi4uKSk+Ojp2YWx1ZT46OnR5cGUg eworICAgICAgICAgICAgZGVvcHRpbWl6ZV92YWx1ZShzdGQ6OmZvcndhcmQ8Rm4+KGZuKSAoc3Rk Ojpmb3J3YXJkPEFyZ3MuLi4+KGFyZ3MuLi4pKSk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1w bGF0ZSA8dHlwZW5hbWUgRm4sIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgICAgIGlubGluZSBhdXRv IGludm9rZV9kZW9wdGltaXplZChGbiYmIGZuLCBBcmdzJiYuLi4gYXJncykgLT4gdHlwZW5hbWUg c3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPHZvaWQsIGRlY2x0eXBlKGZuKGFyZ3MuLi4pKT46 OnZhbHVlPjo6dHlwZSB7CisgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8Rm4+KGZuKSAoc3RkOjpm b3J3YXJkPEFyZ3MuLi4+KGFyZ3MuLi4pKTsKKyAgICAgICAgfQorICAgIH0gLy8gbmFtZXNwYWNl IEJlbmNobWFyaworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX29wdGltaXpl ci5ocHAKKy8vIHN0YXJ0IGNhdGNoX2NvbXBsZXRlX2ludm9rZS5ocHAKKworLy8gSW52b2tlIHdp dGggYSBzcGVjaWFsIGNhc2UgZm9yIHZvaWQKKworCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+Cisj aW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBuYW1lc3BhY2UgQmVu Y2htYXJrIHsKKyAgICAgICAgbmFtZXNwYWNlIERldGFpbCB7CisgICAgICAgICAgICB0ZW1wbGF0 ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHN0cnVjdCBDb21wbGV0ZVR5cGUgeyB1c2luZyB0 eXBlID0gVDsgfTsKKyAgICAgICAgICAgIHRlbXBsYXRlIDw+CisgICAgICAgICAgICBzdHJ1Y3Qg Q29tcGxldGVUeXBlPHZvaWQ+IHsgc3RydWN0IHR5cGUge307IH07CisKKyAgICAgICAgICAgIHRl bXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICAgICAgdXNpbmcgQ29tcGxldGVUeXBlX3QgPSB0 eXBlbmFtZSBDb21wbGV0ZVR5cGU8VD46OnR5cGU7CisKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0 eXBlbmFtZSBSZXN1bHQ+CisgICAgICAgICAgICBzdHJ1Y3QgQ29tcGxldGVJbnZva2VyIHsKKyAg ICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuLCB0eXBlbmFtZS4uLiBBcmdzPgor ICAgICAgICAgICAgICAgIHN0YXRpYyBSZXN1bHQgaW52b2tlKEZ1biYmIGZ1biwgQXJncyYmLi4u IGFyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxGdW4+KGZ1 bikoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICAgICAgICAgICAgICB9CisgICAg ICAgICAgICB9OworICAgICAgICAgICAgdGVtcGxhdGUgPD4KKyAgICAgICAgICAgIHN0cnVjdCBD b21wbGV0ZUludm9rZXI8dm9pZD4geworICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFt ZSBGdW4sIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgICAgICAgICAgICAgc3RhdGljIENvbXBsZXRl VHlwZV90PHZvaWQ+IGludm9rZShGdW4mJiBmdW4sIEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgICAg ICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxGdW4+KGZ1bikoc3RkOjpmb3J3YXJkPEFyZ3M+KGFy Z3MpLi4uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIGludm9rZSBhbmQgbm90IHJldHVy biB2b2lkIDooCisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuLCB0eXBlbmFtZS4u LiBBcmdzPgorICAgICAgICAgICAgQ29tcGxldGVUeXBlX3Q8RnVuY3Rpb25SZXR1cm5UeXBlPEZ1 biwgQXJncy4uLj4+IGNvbXBsZXRlX2ludm9rZShGdW4mJiBmdW4sIEFyZ3MmJi4uLiBhcmdzKSB7 CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbXBsZXRlSW52b2tlcjxGdW5jdGlvblJldHVyblR5 cGU8RnVuLCBBcmdzLi4uPj46Omludm9rZShzdGQ6OmZvcndhcmQ8RnVuPihmdW4pLCBzdGQ6OmZv cndhcmQ8QXJncz4oYXJncykuLi4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25z dCBzdGQ6OnN0cmluZyBiZW5jaG1hcmtFcnJvck1zZyA9ICJhIGJlbmNobWFyayBmYWlsZWQgdG8g cnVuIHN1Y2Nlc3NmdWxseSI7CisgICAgICAgIH0gLy8gbmFtZXNwYWNlIERldGFpbAorCisgICAg ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW4+CisgICAgICAgIERldGFpbDo6Q29tcGxldGVUeXBl X3Q8RnVuY3Rpb25SZXR1cm5UeXBlPEZ1bj4+IHVzZXJfY29kZShGdW4mJiBmdW4pIHsKKyAgICAg ICAgICAgIENBVENIX1RSWXsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV0YWlsOjpjb21wbGV0 ZV9pbnZva2Uoc3RkOjpmb3J3YXJkPEZ1bj4oZnVuKSk7CisgICAgICAgICAgICB9IENBVENIX0NB VENIX0FMTHsKKyAgICAgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYmVuY2htYXJrRmFp bGVkKHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgICAgICBDQVRDSF9S VU5USU1FX0VSUk9SKERldGFpbDo6YmVuY2htYXJrRXJyb3JNc2cpOworICAgICAgICAgICAgfQor ICAgICAgICB9CisgICAgfSAvLyBuYW1lc3BhY2UgQmVuY2htYXJrCit9IC8vIG5hbWVzcGFjZSBD YXRjaAorCisvLyBlbmQgY2F0Y2hfY29tcGxldGVfaW52b2tlLmhwcAorbmFtZXNwYWNlIENhdGNo IHsKKyAgICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKKyAgICAgICAgbmFtZXNwYWNlIERldGFpbCB7 CisgICAgICAgICAgICBzdHJ1Y3QgQ2hyb25vbWV0ZXJDb25jZXB0IHsKKyAgICAgICAgICAgICAg ICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CisgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lk IGZpbmlzaCgpID0gMDsKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIH5DaHJvbm9tZXRlckNvbmNl cHQoKSA9IGRlZmF1bHQ7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGVtcGxhdGUgPHR5 cGVuYW1lIENsb2NrPgorICAgICAgICAgICAgc3RydWN0IENocm9ub21ldGVyTW9kZWwgZmluYWwg OiBwdWJsaWMgQ2hyb25vbWV0ZXJDb25jZXB0IHsKKyAgICAgICAgICAgICAgICB2b2lkIHN0YXJ0 KCkgb3ZlcnJpZGUgeyBzdGFydGVkID0gQ2xvY2s6Om5vdygpOyB9CisgICAgICAgICAgICAgICAg dm9pZCBmaW5pc2goKSBvdmVycmlkZSB7IGZpbmlzaGVkID0gQ2xvY2s6Om5vdygpOyB9CisKKyAg ICAgICAgICAgICAgICBDbG9ja0R1cmF0aW9uPENsb2NrPiBlbGFwc2VkKCkgY29uc3QgeyByZXR1 cm4gZmluaXNoZWQgLSBzdGFydGVkOyB9CisKKyAgICAgICAgICAgICAgICBUaW1lUG9pbnQ8Q2xv Y2s+IHN0YXJ0ZWQ7CisgICAgICAgICAgICAgICAgVGltZVBvaW50PENsb2NrPiBmaW5pc2hlZDsK KyAgICAgICAgICAgIH07CisgICAgICAgIH0gLy8gbmFtZXNwYWNlIERldGFpbAorCisgICAgICAg IHN0cnVjdCBDaHJvbm9tZXRlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHRlbXBs YXRlIDx0eXBlbmFtZSBGdW4+CisgICAgICAgICAgICB2b2lkIG1lYXN1cmUoRnVuJiYgZnVuKSB7 IG1lYXN1cmUoc3RkOjpmb3J3YXJkPEZ1bj4oZnVuKSwgaXNfY2FsbGFibGU8RnVuKGludCk+KCkp OyB9CisKKyAgICAgICAgICAgIGludCBydW5zKCkgY29uc3QgeyByZXR1cm4gazsgfQorCisgICAg ICAgICAgICBDaHJvbm9tZXRlcihEZXRhaWw6OkNocm9ub21ldGVyQ29uY2VwdCYgbWV0ZXIsIGlu dCBrKQorICAgICAgICAgICAgICAgIDogaW1wbCgmbWV0ZXIpCisgICAgICAgICAgICAgICAgLCBr KGspIHt9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFt ZSBGdW4+CisgICAgICAgICAgICB2b2lkIG1lYXN1cmUoRnVuJiYgZnVuLCBzdGQ6OmZhbHNlX3R5 cGUpIHsKKyAgICAgICAgICAgICAgICBtZWFzdXJlKFsmZnVuXShpbnQpIHsgcmV0dXJuIGZ1bigp OyB9LCBzdGQ6OnRydWVfdHlwZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVt cGxhdGUgPHR5cGVuYW1lIEZ1bj4KKyAgICAgICAgICAgIHZvaWQgbWVhc3VyZShGdW4mJiBmdW4s IHN0ZDo6dHJ1ZV90eXBlKSB7CisgICAgICAgICAgICAgICAgRGV0YWlsOjpvcHRpbWl6ZXJfYmFy cmllcigpOworICAgICAgICAgICAgICAgIGltcGwtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAg Zm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIGludm9rZV9kZW9wdGltaXplZChmdW4sIGkpOwor ICAgICAgICAgICAgICAgIGltcGwtPmZpbmlzaCgpOworICAgICAgICAgICAgICAgIERldGFpbDo6 b3B0aW1pemVyX2JhcnJpZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGV0YWls OjpDaHJvbm9tZXRlckNvbmNlcHQqIGltcGw7CisgICAgICAgICAgICBpbnQgazsKKyAgICAgICAg fTsKKyAgICB9IC8vIG5hbWVzcGFjZSBCZW5jaG1hcmsKK30gLy8gbmFtZXNwYWNlIENhdGNoCisK Ky8vIGVuZCBjYXRjaF9jaHJvbm9tZXRlci5ocHAKKy8vIHN0YXJ0IGNhdGNoX2Vudmlyb25tZW50 LmhwcAorCisvLyBFbnZpcm9ubWVudCBpbmZvcm1hdGlvbgorCisKK25hbWVzcGFjZSBDYXRjaCB7 CisgICAgbmFtZXNwYWNlIEJlbmNobWFyayB7CisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBE dXJhdGlvbj4KKyAgICAgICAgc3RydWN0IEVudmlyb25tZW50RXN0aW1hdGUgeworICAgICAgICAg ICAgRHVyYXRpb24gbWVhbjsKKyAgICAgICAgICAgIE91dGxpZXJDbGFzc2lmaWNhdGlvbiBvdXRs aWVyczsKKworICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIER1cmF0aW9uMj4KKyAgICAg ICAgICAgIG9wZXJhdG9yIEVudmlyb25tZW50RXN0aW1hdGU8RHVyYXRpb24yPigpIGNvbnN0IHsK KyAgICAgICAgICAgICAgICByZXR1cm4geyBtZWFuLCBvdXRsaWVycyB9OworICAgICAgICAgICAg fQorICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2s+CisgICAgICAg IHN0cnVjdCBFbnZpcm9ubWVudCB7CisgICAgICAgICAgICB1c2luZyBjbG9ja190eXBlID0gQ2xv Y2s7CisgICAgICAgICAgICBFbnZpcm9ubWVudEVzdGltYXRlPEZsb2F0RHVyYXRpb248Q2xvY2s+ PiBjbG9ja19yZXNvbHV0aW9uOworICAgICAgICAgICAgRW52aXJvbm1lbnRFc3RpbWF0ZTxGbG9h dER1cmF0aW9uPENsb2NrPj4gY2xvY2tfY29zdDsKKyAgICAgICAgfTsKKyAgICB9IC8vIG5hbWVz cGFjZSBCZW5jaG1hcmsKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF9lbnZp cm9ubWVudC5ocHAKKy8vIHN0YXJ0IGNhdGNoX2V4ZWN1dGlvbl9wbGFuLmhwcAorCisgLy8gRXhl Y3V0aW9uIHBsYW4KKworCisvLyBzdGFydCBjYXRjaF9iZW5jaG1hcmtfZnVuY3Rpb24uaHBwCisK KyAvLyBEdW1iIHN0ZDo6ZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gZm9yIGNvbnNpc3RlbnQgY2Fs bCBvdmVyaGVhZAorCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRz PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgQ2F0 Y2ggeworICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgeworICAgICAgICBuYW1lc3BhY2UgRGV0YWls IHsKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICAgICAgdXNpbmcg RGVjYXkgPSB0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlOworICAgICAgICAgICAgdGVtcGxh dGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgICAgICAgICAgICBzdHJ1Y3QgaXNfcmVsYXRl ZAorICAgICAgICAgICAgICAgIDogc3RkOjppc19zYW1lPERlY2F5PFQ+LCBEZWNheTxVPj4ge307 CisKKyAgICAgICAgICAgIC8vLyBXZSBuZWVkIHRvIHJlaW52ZW50IHN0ZDo6ZnVuY3Rpb24gYmVj YXVzZSBldmVyeSBwaWVjZSBvZiBjb2RlIHRoYXQgbWlnaHQgYWRkIG92ZXJoZWFkCisgICAgICAg ICAgICAvLy8gaW4gYSBtZWFzdXJlbWVudCBjb250ZXh0IG5lZWRzIHRvIGhhdmUgY29uc2lzdGVu dCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgc28gdGhhdCB3ZQorICAgICAgICAgICAgLy8v IGNhbiBhY2NvdW50IGZvciBpdCBpbiB0aGUgbWVhc3VyZW1lbnQuCisgICAgICAgICAgICAvLy8g SW1wbGVtZW50YXRpb25zIG9mIHN0ZDo6ZnVuY3Rpb24gd2l0aCBvcHRpbWl6YXRpb25zIHRoYXQg YXJlbid0IGFsd2F5cyBhcHBsaWNhYmxlLCBsaWtlCisgICAgICAgICAgICAvLy8gc21hbGwgYnVm ZmVyIG9wdGltaXphdGlvbnMsIGFyZSBub3QgdW5jb21tb24uCisgICAgICAgICAgICAvLy8gVGhp cyBpcyBlZmZlY3RpdmVseSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6OmZ1bmN0aW9uIHdpdGhv dXQgYW55IHN1Y2ggb3B0aW1pemF0aW9uczsKKyAgICAgICAgICAgIC8vLyBpdCBtYXkgYmUgc2xv dywgYnV0IGl0IGlzIGNvbnNpc3RlbnRseSBzbG93LgorICAgICAgICAgICAgc3RydWN0IEJlbmNo bWFya0Z1bmN0aW9uIHsKKyAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgc3Ry dWN0IGNhbGxhYmxlIHsKKyAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGNhbGwoQ2hy b25vbWV0ZXIgbWV0ZXIpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBj YWxsYWJsZSogY2xvbmUoKSBjb25zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwg fmNhbGxhYmxlKCkgPSBkZWZhdWx0OworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAg ICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bj4KKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbW9kZWwg OiBwdWJsaWMgY2FsbGFibGUgeworICAgICAgICAgICAgICAgICAgICBtb2RlbChGdW4mJiBmdW4p IDogZnVuKHN0ZDo6bW92ZShmdW4pKSB7fQorICAgICAgICAgICAgICAgICAgICBtb2RlbChGdW4g Y29uc3QmIGZ1bikgOiBmdW4oZnVuKSB7fQorCisgICAgICAgICAgICAgICAgICAgIG1vZGVsPEZ1 bj4qIGNsb25lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IG1vZGVsPEZ1bj4oKnRoaXMp OyB9CisKKyAgICAgICAgICAgICAgICAgICAgdm9pZCBjYWxsKENocm9ub21ldGVyIG1ldGVyKSBj b25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsKG1ldGVyLCBpc19j YWxsYWJsZTxGdW4oQ2hyb25vbWV0ZXIpPigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgICAgICAgICB2b2lkIGNhbGwoQ2hyb25vbWV0ZXIgbWV0ZXIsIHN0ZDo6dHJ1ZV90 eXBlKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdW4obWV0ZXIpOworICAgICAg ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZvaWQgY2FsbChDaHJvbm9tZXRl ciBtZXRlciwgc3RkOjpmYWxzZV90eXBlKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAg ICBtZXRlci5tZWFzdXJlKGZ1bik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg ICAgICAgICAgICBGdW4gZnVuOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAg ICBzdHJ1Y3QgZG9fbm90aGluZyB7IHZvaWQgb3BlcmF0b3IoKSgpIGNvbnN0IHt9IH07CisKKyAg ICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgICAgICBCZW5j aG1hcmtGdW5jdGlvbihtb2RlbDxUPiogYykgOiBmKGMpIHt9CisKKyAgICAgICAgICAgIHB1Ymxp YzoKKyAgICAgICAgICAgICAgICBCZW5jaG1hcmtGdW5jdGlvbigpCisgICAgICAgICAgICAgICAg ICAgIDogZihuZXcgbW9kZWw8ZG9fbm90aGluZz57IHt9IH0pIHt9CisKKyAgICAgICAgICAgICAg ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuLAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBz dGQ6OmVuYWJsZV9pZjwhaXNfcmVsYXRlZDxGdW4sIEJlbmNobWFya0Z1bmN0aW9uPjo6dmFsdWUs IGludD46OnR5cGUgPSAwPgorICAgICAgICAgICAgICAgICAgICBCZW5jaG1hcmtGdW5jdGlvbihG dW4mJiBmdW4pCisgICAgICAgICAgICAgICAgICAgIDogZihuZXcgbW9kZWw8dHlwZW5hbWUgc3Rk OjpkZWNheTxGdW4+Ojp0eXBlPihzdGQ6OmZvcndhcmQ8RnVuPihmdW4pKSkge30KKworICAgICAg ICAgICAgICAgIEJlbmNobWFya0Z1bmN0aW9uKEJlbmNobWFya0Z1bmN0aW9uJiYgdGhhdCkKKyAg ICAgICAgICAgICAgICAgICAgOiBmKHN0ZDo6bW92ZSh0aGF0LmYpKSB7fQorCisgICAgICAgICAg ICAgICAgQmVuY2htYXJrRnVuY3Rpb24oQmVuY2htYXJrRnVuY3Rpb24gY29uc3QmIHRoYXQpCisg ICAgICAgICAgICAgICAgICAgIDogZih0aGF0LmYtPmNsb25lKCkpIHt9CisKKyAgICAgICAgICAg ICAgICBCZW5jaG1hcmtGdW5jdGlvbiYgb3BlcmF0b3I9KEJlbmNobWFya0Z1bmN0aW9uJiYgdGhh dCkgeworICAgICAgICAgICAgICAgICAgICBmID0gc3RkOjptb3ZlKHRoYXQuZik7CisgICAgICAg ICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg ICAgICAgICBCZW5jaG1hcmtGdW5jdGlvbiYgb3BlcmF0b3I9KEJlbmNobWFya0Z1bmN0aW9uIGNv bnN0JiB0aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGYucmVzZXQodGhhdC5mLT5jbG9uZSgp KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgICAgIH0K KworICAgICAgICAgICAgICAgIHZvaWQgb3BlcmF0b3IoKShDaHJvbm9tZXRlciBtZXRlcikgY29u c3QgeyBmLT5jYWxsKG1ldGVyKTsgfQorCisgICAgICAgICAgICBwcml2YXRlOgorICAgICAgICAg ICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjYWxsYWJsZT4gZjsKKyAgICAgICAgICAgIH07CisgICAg ICAgIH0gLy8gbmFtZXNwYWNlIERldGFpbAorICAgIH0gLy8gbmFtZXNwYWNlIEJlbmNobWFyawor fSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX2JlbmNobWFya19mdW5jdGlvbi5o cHAKKy8vIHN0YXJ0IGNhdGNoX3JlcGVhdC5ocHAKKworLy8gcmVwZWF0IGFsZ29yaXRobQorCisK KyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2Ug Q2F0Y2ggeworICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgeworICAgICAgICBuYW1lc3BhY2UgRGV0 YWlsIHsKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW4+CisgICAgICAgICAgICBz dHJ1Y3QgcmVwZWF0ZXIgeworICAgICAgICAgICAgICAgIHZvaWQgb3BlcmF0b3IoKShpbnQgaykg Y29uc3QgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkg eworICAgICAgICAgICAgICAgICAgICAgICAgZnVuKCk7CisgICAgICAgICAgICAgICAgICAgIH0K KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRnVuIGZ1bjsKKyAgICAgICAgICAg IH07CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuPgorICAgICAgICAgICAgcmVw ZWF0ZXI8dHlwZW5hbWUgc3RkOjpkZWNheTxGdW4+Ojp0eXBlPiByZXBlYXQoRnVuJiYgZnVuKSB7 CisgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RkOjpmb3J3YXJkPEZ1bj4oZnVuKSB9OworICAg ICAgICAgICAgfQorICAgICAgICB9IC8vIG5hbWVzcGFjZSBEZXRhaWwKKyAgICB9IC8vIG5hbWVz cGFjZSBCZW5jaG1hcmsKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF9yZXBl YXQuaHBwCisvLyBzdGFydCBjYXRjaF9ydW5fZm9yX2F0X2xlYXN0LmhwcAorCisvLyBSdW4gYSBm dW5jdGlvbiBmb3IgYSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lCisKKworLy8gc3RhcnQgY2F0Y2hf bWVhc3VyZS5ocHAKKworLy8gTWVhc3VyZQorCisKKy8vIHN0YXJ0IGNhdGNoX3RpbWluZy5ocHAK KworLy8gVGltaW5nCisKKworI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRz PgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgeworICAgICAg ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHVyYXRpb24sIHR5cGVuYW1lIFJlc3VsdD4KKyAgICAgICAg c3RydWN0IFRpbWluZyB7CisgICAgICAgICAgICBEdXJhdGlvbiBlbGFwc2VkOworICAgICAgICAg ICAgUmVzdWx0IHJlc3VsdDsKKyAgICAgICAgICAgIGludCBpdGVyYXRpb25zOworICAgICAgICB9 OworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2ssIHR5cGVuYW1lIEZ1bmMsIHR5cGVu YW1lLi4uIEFyZ3M+CisgICAgICAgIHVzaW5nIFRpbWluZ09mID0gVGltaW5nPENsb2NrRHVyYXRp b248Q2xvY2s+LCBEZXRhaWw6OkNvbXBsZXRlVHlwZV90PEZ1bmN0aW9uUmV0dXJuVHlwZTxGdW5j LCBBcmdzLi4uPj4+OworICAgIH0gLy8gbmFtZXNwYWNlIEJlbmNobWFyaworfSAvLyBuYW1lc3Bh Y2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX3RpbWluZy5ocHAKKyNpbmNsdWRlIDx1dGlsaXR5Pgor CituYW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgeworICAgICAgICBu YW1lc3BhY2UgRGV0YWlsIHsKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jaywg dHlwZW5hbWUgRnVuLCB0eXBlbmFtZS4uLiBBcmdzPgorICAgICAgICAgICAgVGltaW5nT2Y8Q2xv Y2ssIEZ1biwgQXJncy4uLj4gbWVhc3VyZShGdW4mJiBmdW4sIEFyZ3MmJi4uLiBhcmdzKSB7Cisg ICAgICAgICAgICAgICAgYXV0byBzdGFydCA9IENsb2NrOjpub3coKTsKKyAgICAgICAgICAgICAg ICBhdXRvJiYgciA9IERldGFpbDo6Y29tcGxldGVfaW52b2tlKGZ1biwgc3RkOjpmb3J3YXJkPEFy Z3M+KGFyZ3MpLi4uKTsKKyAgICAgICAgICAgICAgICBhdXRvIGVuZCA9IENsb2NrOjpub3coKTsK KyAgICAgICAgICAgICAgICBhdXRvIGRlbHRhID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICAg ICAgcmV0dXJuIHsgZGVsdGEsIHN0ZDo6Zm9yd2FyZDxkZWNsdHlwZShyKT4ociksIDEgfTsKKyAg ICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCisgICAgfSAvLyBuYW1l c3BhY2UgQmVuY2htYXJrCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfbWVh c3VyZS5ocHAKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCitu YW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgeworICAgICAgICBuYW1l c3BhY2UgRGV0YWlsIHsKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jaywgdHlw ZW5hbWUgRnVuPgorICAgICAgICAgICAgVGltaW5nT2Y8Q2xvY2ssIEZ1biwgaW50PiBtZWFzdXJl X29uZShGdW4mJiBmdW4sIGludCBpdGVycywgc3RkOjpmYWxzZV90eXBlKSB7CisgICAgICAgICAg ICAgICAgcmV0dXJuIERldGFpbDo6bWVhc3VyZTxDbG9jaz4oZnVuLCBpdGVycyk7CisgICAgICAg ICAgICB9CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2ssIHR5cGVuYW1lIEZ1 bj4KKyAgICAgICAgICAgIFRpbWluZ09mPENsb2NrLCBGdW4sIENocm9ub21ldGVyPiBtZWFzdXJl X29uZShGdW4mJiBmdW4sIGludCBpdGVycywgc3RkOjp0cnVlX3R5cGUpIHsKKyAgICAgICAgICAg ICAgICBEZXRhaWw6OkNocm9ub21ldGVyTW9kZWw8Q2xvY2s+IG1ldGVyOworICAgICAgICAgICAg ICAgIGF1dG8mJiByZXN1bHQgPSBEZXRhaWw6OmNvbXBsZXRlX2ludm9rZShmdW4sIENocm9ub21l dGVyKG1ldGVyLCBpdGVycykpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHsgbWV0ZXIuZWxh cHNlZCgpLCBzdGQ6Om1vdmUocmVzdWx0KSwgaXRlcnMgfTsKKyAgICAgICAgICAgIH0KKworICAg ICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrLCB0eXBlbmFtZSBGdW4+CisgICAgICAg ICAgICB1c2luZyBydW5fZm9yX2F0X2xlYXN0X2FyZ3VtZW50X3QgPSB0eXBlbmFtZSBzdGQ6OmNv bmRpdGlvbmFsPGlzX2NhbGxhYmxlPEZ1bihDaHJvbm9tZXRlcik+Ojp2YWx1ZSwgQ2hyb25vbWV0 ZXIsIGludD46OnR5cGU7CisKKyAgICAgICAgICAgIHN0cnVjdCBvcHRpbWl6ZWRfYXdheV9lcnJv ciA6IHN0ZDo6ZXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB3aGF0KCkg Y29uc3Qgbm9leGNlcHQgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNv dWxkIG5vdCBtZWFzdXJlIGJlbmNobWFyaywgbWF5YmUgaXQgd2FzIG9wdGltaXplZCBhd2F5IjsK KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0ZW1wbGF0 ZSA8dHlwZW5hbWUgQ2xvY2ssIHR5cGVuYW1lIEZ1bj4KKyAgICAgICAgICAgIFRpbWluZ09mPENs b2NrLCBGdW4sIHJ1bl9mb3JfYXRfbGVhc3RfYXJndW1lbnRfdDxDbG9jaywgRnVuPj4gcnVuX2Zv cl9hdF9sZWFzdChDbG9ja0R1cmF0aW9uPENsb2NrPiBob3dfbG9uZywgaW50IHNlZWQsIEZ1biYm IGZ1bikgeworICAgICAgICAgICAgICAgIGF1dG8gaXRlcnMgPSBzZWVkOworICAgICAgICAgICAg ICAgIHdoaWxlIChpdGVycyA8ICgxIDw8IDMwKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRv JiYgVGltaW5nID0gbWVhc3VyZV9vbmU8Q2xvY2s+KGZ1biwgaXRlcnMsIGlzX2NhbGxhYmxlPEZ1 bihDaHJvbm9tZXRlcik+KCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChUaW1pbmcuZWxh cHNlZCA+PSBob3dfbG9uZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgVGlt aW5nLmVsYXBzZWQsIHN0ZDo6bW92ZShUaW1pbmcucmVzdWx0KSwgaXRlcnMgfTsKKyAgICAgICAg ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpdGVycyAqPSAyOworICAgICAgICAg ICAgICAgIH0KKyAgICAgICAgICAgICAgICBDYXRjaDo6dGhyb3dfZXhjZXB0aW9uKG9wdGltaXpl ZF9hd2F5X2Vycm9ye30pOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIG5hbWVzcGFjZSBE ZXRhaWwKKyAgICB9IC8vIG5hbWVzcGFjZSBCZW5jaG1hcmsKK30gLy8gbmFtZXNwYWNlIENhdGNo CisKKy8vIGVuZCBjYXRjaF9ydW5fZm9yX2F0X2xlYXN0LmhwcAorI2luY2x1ZGUgPGFsZ29yaXRo bT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBuYW1lc3Bh Y2UgQmVuY2htYXJrIHsKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIER1cmF0aW9uPgorICAg ICAgICBzdHJ1Y3QgRXhlY3V0aW9uUGxhbiB7CisgICAgICAgICAgICBpbnQgaXRlcmF0aW9uc19w ZXJfc2FtcGxlOworICAgICAgICAgICAgRHVyYXRpb24gZXN0aW1hdGVkX2R1cmF0aW9uOworICAg ICAgICAgICAgRGV0YWlsOjpCZW5jaG1hcmtGdW5jdGlvbiBiZW5jaG1hcms7CisgICAgICAgICAg ICBEdXJhdGlvbiB3YXJtdXBfdGltZTsKKyAgICAgICAgICAgIGludCB3YXJtdXBfaXRlcmF0aW9u czsKKworICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIER1cmF0aW9uMj4KKyAgICAgICAg ICAgIG9wZXJhdG9yIEV4ZWN1dGlvblBsYW48RHVyYXRpb24yPigpIGNvbnN0IHsKKyAgICAgICAg ICAgICAgICByZXR1cm4geyBpdGVyYXRpb25zX3Blcl9zYW1wbGUsIGVzdGltYXRlZF9kdXJhdGlv biwgYmVuY2htYXJrLCB3YXJtdXBfdGltZSwgd2FybXVwX2l0ZXJhdGlvbnMgfTsKKyAgICAgICAg ICAgIH0KKworICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrPgorICAgICAgICAg ICAgc3RkOjp2ZWN0b3I8RmxvYXREdXJhdGlvbjxDbG9jaz4+IHJ1bihjb25zdCBJQ29uZmlnICZj ZmcsIEVudmlyb25tZW50PEZsb2F0RHVyYXRpb248Q2xvY2s+PiBlbnYpIGNvbnN0IHsKKyAgICAg ICAgICAgICAgICAvLyB3YXJtdXAgYSBiaXQKKyAgICAgICAgICAgICAgICBEZXRhaWw6OnJ1bl9m b3JfYXRfbGVhc3Q8Q2xvY2s+KHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PENsb2NrRHVyYXRp b248Q2xvY2s+Pih3YXJtdXBfdGltZSksIHdhcm11cF9pdGVyYXRpb25zLCBEZXRhaWw6OnJlcGVh dChub3c8Q2xvY2s+e30pKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZsb2F0RHVy YXRpb248Q2xvY2s+PiB0aW1lczsKKyAgICAgICAgICAgICAgICB0aW1lcy5yZXNlcnZlKGNmZy5i ZW5jaG1hcmtTYW1wbGVzKCkpOworICAgICAgICAgICAgICAgIHN0ZDo6Z2VuZXJhdGVfbihzdGQ6 OmJhY2tfaW5zZXJ0ZXIodGltZXMpLCBjZmcuYmVuY2htYXJrU2FtcGxlcygpLCBbdGhpcywgZW52 XSB7CisgICAgICAgICAgICAgICAgICAgIERldGFpbDo6Q2hyb25vbWV0ZXJNb2RlbDxDbG9jaz4g bW9kZWw7CisgICAgICAgICAgICAgICAgICAgIHRoaXMtPmJlbmNobWFyayhDaHJvbm9tZXRlciht b2RlbCwgaXRlcmF0aW9uc19wZXJfc2FtcGxlKSk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8g c2FtcGxlX3RpbWUgPSBtb2RlbC5lbGFwc2VkKCkgLSBlbnYuY2xvY2tfY29zdC5tZWFuOworICAg ICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlX3RpbWUgPCBGbG9hdER1cmF0aW9uPENsb2NrPjo6 emVybygpKSBzYW1wbGVfdGltZSA9IEZsb2F0RHVyYXRpb248Q2xvY2s+Ojp6ZXJvKCk7CisgICAg ICAgICAgICAgICAgICAgIHJldHVybiBzYW1wbGVfdGltZSAvIGl0ZXJhdGlvbnNfcGVyX3NhbXBs ZTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGltZXM7Cisg ICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfSAvLyBuYW1lc3BhY2UgQmVuY2htYXJrCit9 IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfZXhlY3V0aW9uX3BsYW4uaHBwCisv LyBzdGFydCBjYXRjaF9lc3RpbWF0ZV9jbG9jay5ocHAKKworIC8vIEVudmlyb25tZW50IG1lYXN1 cmVtZW50CisKKworLy8gc3RhcnQgY2F0Y2hfc3RhdHMuaHBwCisKKy8vIFN0YXRpc3RpY2FsIGFu YWx5c2lzIHRvb2xzCisKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlv bmFsPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxu dW1lcmljPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHV0 aWxpdHk+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxyYW5kb20+CisKK25hbWVzcGFj ZSBDYXRjaCB7CisgICAgbmFtZXNwYWNlIEJlbmNobWFyayB7CisgICAgICAgIG5hbWVzcGFjZSBE ZXRhaWwgeworICAgICAgICAgICAgdXNpbmcgc2FtcGxlID0gc3RkOjp2ZWN0b3I8ZG91YmxlPjsK KworICAgICAgICAgICAgZG91YmxlIHdlaWdodGVkX2F2ZXJhZ2VfcXVhbnRpbGUoaW50IGssIGlu dCBxLCBzdGQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvciBmaXJzdCwgc3RkOjp2ZWN0b3I8ZG91 YmxlPjo6aXRlcmF0b3IgbGFzdCk7CisKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJ dGVyYXRvcj4KKyAgICAgICAgICAgIE91dGxpZXJDbGFzc2lmaWNhdGlvbiBjbGFzc2lmeV9vdXRs aWVycyhJdGVyYXRvciBmaXJzdCwgSXRlcmF0b3IgbGFzdCkgeworICAgICAgICAgICAgICAgIHN0 ZDo6dmVjdG9yPGRvdWJsZT4gY29weShmaXJzdCwgbGFzdCk7CisKKyAgICAgICAgICAgICAgICBh dXRvIHExID0gd2VpZ2h0ZWRfYXZlcmFnZV9xdWFudGlsZSgxLCA0LCBjb3B5LmJlZ2luKCksIGNv cHkuZW5kKCkpOworICAgICAgICAgICAgICAgIGF1dG8gcTMgPSB3ZWlnaHRlZF9hdmVyYWdlX3F1 YW50aWxlKDMsIDQsIGNvcHkuYmVnaW4oKSwgY29weS5lbmQoKSk7CisgICAgICAgICAgICAgICAg YXV0byBpcXIgPSBxMyAtIHExOworICAgICAgICAgICAgICAgIGF1dG8gbG9zID0gcTEgLSAoaXFy ICogMy4pOworICAgICAgICAgICAgICAgIGF1dG8gbG9tID0gcTEgLSAoaXFyICogMS41KTsKKyAg ICAgICAgICAgICAgICBhdXRvIGhpbSA9IHEzICsgKGlxciAqIDEuNSk7CisgICAgICAgICAgICAg ICAgYXV0byBoaXMgPSBxMyArIChpcXIgKiAzLik7CisKKyAgICAgICAgICAgICAgICBPdXRsaWVy Q2xhc3NpZmljYXRpb24gbzsKKyAgICAgICAgICAgICAgICBmb3IgKDsgZmlyc3QgIT0gbGFzdDsg KytmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvJiYgdCA9ICpmaXJzdDsKKyAgICAg ICAgICAgICAgICAgICAgaWYgKHQgPCBsb3MpICsrby5sb3dfc2V2ZXJlOworICAgICAgICAgICAg ICAgICAgICBlbHNlIGlmICh0IDwgbG9tKSArK28ubG93X21pbGQ7CisgICAgICAgICAgICAgICAg ICAgIGVsc2UgaWYgKHQgPiBoaXMpICsrby5oaWdoX3NldmVyZTsKKyAgICAgICAgICAgICAgICAg ICAgZWxzZSBpZiAodCA+IGhpbSkgKytvLmhpZ2hfbWlsZDsKKyAgICAgICAgICAgICAgICAgICAg KytvLnNhbXBsZXNfc2VlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0 dXJuIG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJ dGVyYXRvcj4KKyAgICAgICAgICAgIGRvdWJsZSBtZWFuKEl0ZXJhdG9yIGZpcnN0LCBJdGVyYXRv ciBsYXN0KSB7CisgICAgICAgICAgICAgICAgYXV0byBjb3VudCA9IGxhc3QgLSBmaXJzdDsKKyAg ICAgICAgICAgICAgICBkb3VibGUgc3VtID0gc3RkOjphY2N1bXVsYXRlKGZpcnN0LCBsYXN0LCAw Lik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1bSAvIGNvdW50OworICAgICAgICAgICAgfQor CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVVJuZywgdHlwZW5hbWUgSXRlcmF0b3Is IHR5cGVuYW1lIEVzdGltYXRvcj4KKyAgICAgICAgICAgIHNhbXBsZSByZXNhbXBsZShVUm5nJiBy bmcsIGludCByZXNhbXBsZXMsIEl0ZXJhdG9yIGZpcnN0LCBJdGVyYXRvciBsYXN0LCBFc3RpbWF0 b3ImIGVzdGltYXRvcikgeworICAgICAgICAgICAgICAgIGF1dG8gbiA9IGxhc3QgLSBmaXJzdDsK KyAgICAgICAgICAgICAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxkZWNsdHlwZShu KT4gZGlzdCgwLCBuIC0gMSk7CisKKyAgICAgICAgICAgICAgICBzYW1wbGUgb3V0OworICAgICAg ICAgICAgICAgIG91dC5yZXNlcnZlKHJlc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgc3RkOjpn ZW5lcmF0ZV9uKHN0ZDo6YmFja19pbnNlcnRlcihvdXQpLCByZXNhbXBsZXMsIFtuLCBmaXJzdCwg JmVzdGltYXRvciwgJmRpc3QsICZybmddIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0 b3I8ZG91YmxlPiByZXNhbXBsZWQ7CisgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlZC5yZXNl cnZlKG4pOworICAgICAgICAgICAgICAgICAgICBzdGQ6OmdlbmVyYXRlX24oc3RkOjpiYWNrX2lu c2VydGVyKHJlc2FtcGxlZCksIG4sIFtmaXJzdCwgJmRpc3QsICZybmddIHsgcmV0dXJuIGZpcnN0 W2Rpc3Qocm5nKV07IH0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXN0aW1hdG9yKHJl c2FtcGxlZC5iZWdpbigpLCByZXNhbXBsZWQuZW5kKCkpOworICAgICAgICAgICAgICAgIH0pOwor ICAgICAgICAgICAgICAgIHN0ZDo6c29ydChvdXQuYmVnaW4oKSwgb3V0LmVuZCgpKTsKKyAgICAg ICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1w bGF0ZSA8dHlwZW5hbWUgRXN0aW1hdG9yLCB0eXBlbmFtZSBJdGVyYXRvcj4KKyAgICAgICAgICAg IHNhbXBsZSBqYWNra25pZmUoRXN0aW1hdG9yJiYgZXN0aW1hdG9yLCBJdGVyYXRvciBmaXJzdCwg SXRlcmF0b3IgbGFzdCkgeworICAgICAgICAgICAgICAgIGF1dG8gbiA9IGxhc3QgLSBmaXJzdDsK KyAgICAgICAgICAgICAgICBhdXRvIHNlY29uZCA9IHN0ZDo6bmV4dChmaXJzdCk7CisgICAgICAg ICAgICAgICAgc2FtcGxlIHJlc3VsdHM7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5yZXNlcnZl KG4pOworCisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZmlyc3Q7IGl0ICE9IGxhc3Q7 ICsraXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjppdGVyX3N3YXAoaXQsIGZpcnN0KTsK KyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soZXN0aW1hdG9yKHNlY29uZCwg bGFzdCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiByZXN1 bHRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmxpbmUgZG91YmxlIG5vcm1hbF9j ZGYoZG91YmxlIHgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjplcmZjKC14IC8gc3Rk OjpzcXJ0KDIuMCkpIC8gMi4wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkb3VibGUg ZXJmY19pbnYoZG91YmxlIHgpOworCisgICAgICAgICAgICBkb3VibGUgbm9ybWFsX3F1YW50aWxl KGRvdWJsZSBwKTsKKworICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yLCB0 eXBlbmFtZSBFc3RpbWF0b3I+CisgICAgICAgICAgICBFc3RpbWF0ZTxkb3VibGU+IGJvb3RzdHJh cChkb3VibGUgY29uZmlkZW5jZV9sZXZlbCwgSXRlcmF0b3IgZmlyc3QsIEl0ZXJhdG9yIGxhc3Qs IHNhbXBsZSBjb25zdCYgcmVzYW1wbGUsIEVzdGltYXRvciYmIGVzdGltYXRvcikgeworICAgICAg ICAgICAgICAgIGF1dG8gbl9zYW1wbGVzID0gbGFzdCAtIGZpcnN0OworCisgICAgICAgICAgICAg ICAgZG91YmxlIHBvaW50ID0gZXN0aW1hdG9yKGZpcnN0LCBsYXN0KTsKKyAgICAgICAgICAgICAg ICAvLyBEZWdlbmVyYXRlIGNhc2Ugd2l0aCBhIHNpbmdsZSBzYW1wbGUKKyAgICAgICAgICAgICAg ICBpZiAobl9zYW1wbGVzID09IDEpIHJldHVybiB7IHBvaW50LCBwb2ludCwgcG9pbnQsIGNvbmZp ZGVuY2VfbGV2ZWwgfTsKKworICAgICAgICAgICAgICAgIHNhbXBsZSBqYWNrID0gamFja2tuaWZl KGVzdGltYXRvciwgZmlyc3QsIGxhc3QpOworICAgICAgICAgICAgICAgIGRvdWJsZSBqYWNrX21l YW4gPSBtZWFuKGphY2suYmVnaW4oKSwgamFjay5lbmQoKSk7CisgICAgICAgICAgICAgICAgZG91 YmxlIHN1bV9zcXVhcmVzLCBzdW1fY3ViZXM7CisgICAgICAgICAgICAgICAgc3RkOjp0aWUoc3Vt X3NxdWFyZXMsIHN1bV9jdWJlcykgPSBzdGQ6OmFjY3VtdWxhdGUoamFjay5iZWdpbigpLCBqYWNr LmVuZCgpLCBzdGQ6Om1ha2VfcGFpcigwLiwgMC4pLCBbamFja19tZWFuXShzdGQ6OnBhaXI8ZG91 YmxlLCBkb3VibGU+IHNxY2IsIGRvdWJsZSB4KSAtPiBzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+ IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBkID0gamFja19tZWFuIC0geDsKKyAgICAgICAg ICAgICAgICAgICAgYXV0byBkMiA9IGQgKiBkOworICAgICAgICAgICAgICAgICAgICBhdXRvIGQz ID0gZDIgKiBkOworICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzcWNiLmZpcnN0ICsgZDIs IHNxY2Iuc2Vjb25kICsgZDMgfTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAg ICAgIGRvdWJsZSBhY2NlbCA9IHN1bV9jdWJlcyAvICg2ICogc3RkOjpwb3coc3VtX3NxdWFyZXMs IDEuNSkpOworICAgICAgICAgICAgICAgIGludCBuID0gc3RhdGljX2Nhc3Q8aW50PihyZXNhbXBs ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIGRvdWJsZSBwcm9iX24gPSBzdGQ6OmNvdW50X2lm KHJlc2FtcGxlLmJlZ2luKCksIHJlc2FtcGxlLmVuZCgpLCBbcG9pbnRdKGRvdWJsZSB4KSB7IHJl dHVybiB4IDwgcG9pbnQ7IH0pIC8gKGRvdWJsZSluOworICAgICAgICAgICAgICAgIC8vIGRlZ2Vu ZXJhdGUgY2FzZSB3aXRoIHVuaWZvcm0gc2FtcGxlcworICAgICAgICAgICAgICAgIGlmIChwcm9i X24gPT0gMCkgcmV0dXJuIHsgcG9pbnQsIHBvaW50LCBwb2ludCwgY29uZmlkZW5jZV9sZXZlbCB9 OworCisgICAgICAgICAgICAgICAgZG91YmxlIGJpYXMgPSBub3JtYWxfcXVhbnRpbGUocHJvYl9u KTsKKyAgICAgICAgICAgICAgICBkb3VibGUgejEgPSBub3JtYWxfcXVhbnRpbGUoKDEuIC0gY29u ZmlkZW5jZV9sZXZlbCkgLyAyLik7CisKKyAgICAgICAgICAgICAgICBhdXRvIGN1bW4gPSBbbl0o ZG91YmxlIHgpIC0+IGludCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Omxyb3Vu ZChub3JtYWxfY2RmKHgpICogbik7IH07CisgICAgICAgICAgICAgICAgYXV0byBhID0gW2JpYXMs IGFjY2VsXShkb3VibGUgYikgeyByZXR1cm4gYmlhcyArIGIgLyAoMS4gLSBhY2NlbCAqIGIpOyB9 OworICAgICAgICAgICAgICAgIGRvdWJsZSBiMSA9IGJpYXMgKyB6MTsKKyAgICAgICAgICAgICAg ICBkb3VibGUgYjIgPSBiaWFzIC0gejE7CisgICAgICAgICAgICAgICAgZG91YmxlIGExID0gYShi MSk7CisgICAgICAgICAgICAgICAgZG91YmxlIGEyID0gYShiMik7CisgICAgICAgICAgICAgICAg YXV0byBsbyA9IChzdGQ6Om1heCkoY3VtbihhMSksIDApOworICAgICAgICAgICAgICAgIGF1dG8g aGkgPSAoc3RkOjptaW4pKGN1bW4oYTIpLCBuIC0gMSk7CisKKyAgICAgICAgICAgICAgICByZXR1 cm4geyBwb2ludCwgcmVzYW1wbGVbbG9dLCByZXNhbXBsZVtoaV0sIGNvbmZpZGVuY2VfbGV2ZWwg fTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZG91YmxlIG91dGxpZXJfdmFyaWFuY2Uo RXN0aW1hdGU8ZG91YmxlPiBtZWFuLCBFc3RpbWF0ZTxkb3VibGU+IHN0ZGRldiwgaW50IG4pOwor CisgICAgICAgICAgICBzdHJ1Y3QgYm9vdHN0cmFwX2FuYWx5c2lzIHsKKyAgICAgICAgICAgICAg ICBFc3RpbWF0ZTxkb3VibGU+IG1lYW47CisgICAgICAgICAgICAgICAgRXN0aW1hdGU8ZG91Ymxl PiBzdGFuZGFyZF9kZXZpYXRpb247CisgICAgICAgICAgICAgICAgZG91YmxlIG91dGxpZXJfdmFy aWFuY2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBib290c3RyYXBfYW5hbHlzaXMg YW5hbHlzZV9zYW1wbGVzKGRvdWJsZSBjb25maWRlbmNlX2xldmVsLCBpbnQgbl9yZXNhbXBsZXMs IHN0ZDo6dmVjdG9yPGRvdWJsZT46Oml0ZXJhdG9yIGZpcnN0LCBzdGQ6OnZlY3Rvcjxkb3VibGU+ OjppdGVyYXRvciBsYXN0KTsKKyAgICAgICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCisgICAgfSAv LyBuYW1lc3BhY2UgQmVuY2htYXJrCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0 Y2hfc3RhdHMuaHBwCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgor I2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjbWF0aD4KKwor bmFtZXNwYWNlIENhdGNoIHsKKyAgICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKKyAgICAgICAgbmFt ZXNwYWNlIERldGFpbCB7CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2s+Cisg ICAgICAgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHJlc29sdXRpb24oaW50IGspIHsKKyAgICAg ICAgICAgICAgICBzdGQ6OnZlY3RvcjxUaW1lUG9pbnQ8Q2xvY2s+PiB0aW1lczsKKyAgICAgICAg ICAgICAgICB0aW1lcy5yZXNlcnZlKGsgKyAxKTsKKyAgICAgICAgICAgICAgICBzdGQ6OmdlbmVy YXRlX24oc3RkOjpiYWNrX2luc2VydGVyKHRpbWVzKSwgayArIDEsIG5vdzxDbG9jaz57fSk7CisK KyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IGRlbHRhczsKKyAgICAgICAgICAg ICAgICBkZWx0YXMucmVzZXJ2ZShrKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybShz dGQ6Om5leHQodGltZXMuYmVnaW4oKSksIHRpbWVzLmVuZCgpLCB0aW1lcy5iZWdpbigpLAorICAg ICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZGVsdGFzKSwKKyAgICAgICAgICAg ICAgICAgICAgW10oVGltZVBvaW50PENsb2NrPiBhLCBUaW1lUG9pbnQ8Q2xvY2s+IGIpIHsgcmV0 dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oKGEgLSBiKS5jb3VudCgpKTsgfSk7CisKKyAgICAgICAg ICAgICAgICByZXR1cm4gZGVsdGFzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25z dCBhdXRvIHdhcm11cF9pdGVyYXRpb25zID0gMTAwMDA7CisgICAgICAgICAgICBjb25zdCBhdXRv IHdhcm11cF90aW1lID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApOworICAgICAgICAg ICAgY29uc3QgYXV0byBtaW5pbXVtX3RpY2tzID0gMTAwMDsKKyAgICAgICAgICAgIGNvbnN0IGF1 dG8gd2FybXVwX3NlZWQgPSAxMDAwMDsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gY2xvY2tfcmVz b2x1dGlvbl9lc3RpbWF0aW9uX3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDUwMCk7 CisgICAgICAgICAgICBjb25zdCBhdXRvIGNsb2NrX2Nvc3RfZXN0aW1hdGlvbl90aW1lX2xpbWl0 ID0gc3RkOjpjaHJvbm86OnNlY29uZHMoMSk7CisgICAgICAgICAgICBjb25zdCBhdXRvIGNsb2Nr X2Nvc3RfZXN0aW1hdGlvbl90aWNrX2xpbWl0ID0gMTAwMDAwOworICAgICAgICAgICAgY29uc3Qg YXV0byBjbG9ja19jb3N0X2VzdGltYXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29u ZHMoMTApOworICAgICAgICAgICAgY29uc3QgYXV0byBjbG9ja19jb3N0X2VzdGltYXRpb25faXRl cmF0aW9ucyA9IDEwMDAwOworCisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2s+ CisgICAgICAgICAgICBpbnQgd2FybXVwKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBydW5f Zm9yX2F0X2xlYXN0PENsb2NrPihzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxDbG9ja0R1cmF0 aW9uPENsb2NrPj4od2FybXVwX3RpbWUpLCB3YXJtdXBfc2VlZCwgJnJlc29sdXRpb248Q2xvY2s+ KQorICAgICAgICAgICAgICAgICAgICAuaXRlcmF0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAg ICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jaz4KKyAgICAgICAgICAgIEVudmlyb25tZW50 RXN0aW1hdGU8RmxvYXREdXJhdGlvbjxDbG9jaz4+IGVzdGltYXRlX2Nsb2NrX3Jlc29sdXRpb24o aW50IGl0ZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHIgPSBydW5fZm9yX2F0X2xl YXN0PENsb2NrPihzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxDbG9ja0R1cmF0aW9uPENsb2Nr Pj4oY2xvY2tfcmVzb2x1dGlvbl9lc3RpbWF0aW9uX3RpbWUpLCBpdGVyYXRpb25zLCAmcmVzb2x1 dGlvbjxDbG9jaz4pCisgICAgICAgICAgICAgICAgICAgIC5yZXN1bHQ7CisgICAgICAgICAgICAg ICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgRmxvYXREdXJhdGlvbjxDbG9jaz4obWVh bihyLmJlZ2luKCksIHIuZW5kKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NpZnlfb3V0 bGllcnMoci5iZWdpbigpLCByLmVuZCgpKSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAg ICAgfQorICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrPgorICAgICAgICAgICAg RW52aXJvbm1lbnRFc3RpbWF0ZTxGbG9hdER1cmF0aW9uPENsb2NrPj4gZXN0aW1hdGVfY2xvY2tf Y29zdChGbG9hdER1cmF0aW9uPENsb2NrPiByZXNvbHV0aW9uKSB7CisgICAgICAgICAgICAgICAg YXV0byB0aW1lX2xpbWl0ID0gKHN0ZDo6bWluKSgKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x1 dGlvbiAqIGNsb2NrX2Nvc3RfZXN0aW1hdGlvbl90aWNrX2xpbWl0LAorICAgICAgICAgICAgICAg ICAgICBGbG9hdER1cmF0aW9uPENsb2NrPihjbG9ja19jb3N0X2VzdGltYXRpb25fdGltZV9saW1p dCkpOworICAgICAgICAgICAgICAgIGF1dG8gdGltZV9jbG9jayA9IFtdKGludCBrKSB7CisgICAg ICAgICAgICAgICAgICAgIHJldHVybiBEZXRhaWw6Om1lYXN1cmU8Q2xvY2s+KFtrXSB7CisgICAg ICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgeworICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGF1dG8gaWdub3JlZCA9IENsb2NrOjpub3co KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClpZ25vcmVkOworICAgICAgICAg ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KS5lbGFwc2VkOworICAgICAg ICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdGltZV9jbG9jaygxKTsKKyAgICAgICAgICAg ICAgICBpbnQgaXRlcnMgPSBjbG9ja19jb3N0X2VzdGltYXRpb25faXRlcmF0aW9uczsKKyAgICAg ICAgICAgICAgICBhdXRvJiYgciA9IHJ1bl9mb3JfYXRfbGVhc3Q8Q2xvY2s+KHN0ZDo6Y2hyb25v OjpkdXJhdGlvbl9jYXN0PENsb2NrRHVyYXRpb248Q2xvY2s+PihjbG9ja19jb3N0X2VzdGltYXRp b25fdGltZSksIGl0ZXJzLCB0aW1lX2Nsb2NrKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rv cjxkb3VibGU+IHRpbWVzOworICAgICAgICAgICAgICAgIGludCBuc2FtcGxlcyA9IHN0YXRpY19j YXN0PGludD4oc3RkOjpjZWlsKHRpbWVfbGltaXQgLyByLmVsYXBzZWQpKTsKKyAgICAgICAgICAg ICAgICB0aW1lcy5yZXNlcnZlKG5zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OmdlbmVy YXRlX24oc3RkOjpiYWNrX2luc2VydGVyKHRpbWVzKSwgbnNhbXBsZXMsIFt0aW1lX2Nsb2NrLCAm cl0geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPigodGlt ZV9jbG9jayhyLml0ZXJhdGlvbnMpIC8gci5pdGVyYXRpb25zKS5jb3VudCgpKTsKKyAgICAgICAg ICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAg ICBGbG9hdER1cmF0aW9uPENsb2NrPihtZWFuKHRpbWVzLmJlZ2luKCksIHRpbWVzLmVuZCgpKSks CisgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZ5X291dGxpZXJzKHRpbWVzLmJlZ2luKCksIHRp bWVzLmVuZCgpKSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorCisgICAgICAg ICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2s+CisgICAgICAgICAgICBFbnZpcm9ubWVudDxG bG9hdER1cmF0aW9uPENsb2NrPj4gbWVhc3VyZV9lbnZpcm9ubWVudCgpIHsKKyAgICAgICAgICAg ICAgICBzdGF0aWMgRW52aXJvbm1lbnQ8RmxvYXREdXJhdGlvbjxDbG9jaz4+KiBlbnYgPSBudWxs cHRyOworICAgICAgICAgICAgICAgIGlmIChlbnYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0 dXJuICplbnY7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byBpdGVy cyA9IERldGFpbDo6d2FybXVwPENsb2NrPigpOworICAgICAgICAgICAgICAgIGF1dG8gcmVzb2x1 dGlvbiA9IERldGFpbDo6ZXN0aW1hdGVfY2xvY2tfcmVzb2x1dGlvbjxDbG9jaz4oaXRlcnMpOwor ICAgICAgICAgICAgICAgIGF1dG8gY29zdCA9IERldGFpbDo6ZXN0aW1hdGVfY2xvY2tfY29zdDxD bG9jaz4ocmVzb2x1dGlvbi5tZWFuKTsKKworICAgICAgICAgICAgICAgIGVudiA9IG5ldyBFbnZp cm9ubWVudDxGbG9hdER1cmF0aW9uPENsb2NrPj57IHJlc29sdXRpb24sIGNvc3QgfTsKKyAgICAg ICAgICAgICAgICByZXR1cm4gKmVudjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBuYW1l c3BhY2UgRGV0YWlsCisgICAgfSAvLyBuYW1lc3BhY2UgQmVuY2htYXJrCit9IC8vIG5hbWVzcGFj ZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfZXN0aW1hdGVfY2xvY2suaHBwCisvLyBzdGFydCBjYXRj aF9hbmFseXNlLmhwcAorCisgLy8gUnVuIGFuZCBhbmFseXNlIG9uZSBiZW5jaG1hcmsKKworCisv LyBzdGFydCBjYXRjaF9zYW1wbGVfYW5hbHlzaXMuaHBwCisKKy8vIEJlbmNobWFyayByZXN1bHRz CisKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8 c3RyaW5nPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIG5h bWVzcGFjZSBCZW5jaG1hcmsgeworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHVyYXRpb24+ CisgICAgICAgIHN0cnVjdCBTYW1wbGVBbmFseXNpcyB7CisgICAgICAgICAgICBzdGQ6OnZlY3Rv cjxEdXJhdGlvbj4gc2FtcGxlczsKKyAgICAgICAgICAgIEVzdGltYXRlPER1cmF0aW9uPiBtZWFu OworICAgICAgICAgICAgRXN0aW1hdGU8RHVyYXRpb24+IHN0YW5kYXJkX2RldmlhdGlvbjsKKyAg ICAgICAgICAgIE91dGxpZXJDbGFzc2lmaWNhdGlvbiBvdXRsaWVyczsKKyAgICAgICAgICAgIGRv dWJsZSBvdXRsaWVyX3ZhcmlhbmNlOworCisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUg RHVyYXRpb24yPgorICAgICAgICAgICAgb3BlcmF0b3IgU2FtcGxlQW5hbHlzaXM8RHVyYXRpb24y PigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEdXJhdGlvbjI+IHNhbXBs ZXMyOworICAgICAgICAgICAgICAgIHNhbXBsZXMyLnJlc2VydmUoc2FtcGxlcy5zaXplKCkpOwor ICAgICAgICAgICAgICAgIHN0ZDo6dHJhbnNmb3JtKHNhbXBsZXMuYmVnaW4oKSwgc2FtcGxlcy5l bmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHNhbXBsZXMyKSwgW10oRHVyYXRpb24gZCkgeyByZXR1 cm4gRHVyYXRpb24yKGQpOyB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAg ICAgICAgICAgICBzdGQ6Om1vdmUoc2FtcGxlczIpLAorICAgICAgICAgICAgICAgICAgICBtZWFu LAorICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZF9kZXZpYXRpb24sCisgICAgICAgICAgICAg ICAgICAgIG91dGxpZXJzLAorICAgICAgICAgICAgICAgICAgICBvdXRsaWVyX3ZhcmlhbmNlLAor ICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfSAvLyBu YW1lc3BhY2UgQmVuY2htYXJrCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hf c2FtcGxlX2FuYWx5c2lzLmhwcAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVy YXRvcj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgbmFtZXNw YWNlIEJlbmNobWFyayB7CisgICAgICAgIG5hbWVzcGFjZSBEZXRhaWwgeworICAgICAgICAgICAg dGVtcGxhdGUgPHR5cGVuYW1lIER1cmF0aW9uLCB0eXBlbmFtZSBJdGVyYXRvcj4KKyAgICAgICAg ICAgIFNhbXBsZUFuYWx5c2lzPER1cmF0aW9uPiBhbmFseXNlKGNvbnN0IElDb25maWcgJmNmZywg RW52aXJvbm1lbnQ8RHVyYXRpb24+LCBJdGVyYXRvciBmaXJzdCwgSXRlcmF0b3IgbGFzdCkgewor ICAgICAgICAgICAgICAgIGlmICghY2ZnLmJlbmNobWFya05vQW5hbHlzaXMoKSkgeworICAgICAg ICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHNhbXBsZXM7CisgICAgICAgICAgICAg ICAgICAgIHNhbXBsZXMucmVzZXJ2ZShsYXN0IC0gZmlyc3QpOworICAgICAgICAgICAgICAgICAg ICBzdGQ6OnRyYW5zZm9ybShmaXJzdCwgbGFzdCwgc3RkOjpiYWNrX2luc2VydGVyKHNhbXBsZXMp LCBbXShEdXJhdGlvbiBkKSB7IHJldHVybiBkLmNvdW50KCk7IH0pOworCisgICAgICAgICAgICAg ICAgICAgIGF1dG8gYW5hbHlzaXMgPSBDYXRjaDo6QmVuY2htYXJrOjpEZXRhaWw6OmFuYWx5c2Vf c2FtcGxlcyhjZmcuYmVuY2htYXJrQ29uZmlkZW5jZUludGVydmFsKCksIGNmZy5iZW5jaG1hcmtS ZXNhbXBsZXMoKSwgc2FtcGxlcy5iZWdpbigpLCBzYW1wbGVzLmVuZCgpKTsKKyAgICAgICAgICAg ICAgICAgICAgYXV0byBvdXRsaWVycyA9IENhdGNoOjpCZW5jaG1hcms6OkRldGFpbDo6Y2xhc3Np Znlfb3V0bGllcnMoc2FtcGxlcy5iZWdpbigpLCBzYW1wbGVzLmVuZCgpKTsKKworICAgICAgICAg ICAgICAgICAgICBhdXRvIHdyYXBfZXN0aW1hdGUgPSBbXShFc3RpbWF0ZTxkb3VibGU+IGUpIHsK KyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFc3RpbWF0ZTxEdXJhdGlvbj4geworICAg ICAgICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uKGUucG9pbnQpLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbihlLmxvd2VyX2JvdW5kKSwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24oZS51cHBlcl9ib3VuZCksCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGUuY29uZmlkZW5jZV9pbnRlcnZhbCwKKyAgICAgICAgICAg ICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAg ICAgIHN0ZDo6dmVjdG9yPER1cmF0aW9uPiBzYW1wbGVzMjsKKyAgICAgICAgICAgICAgICAgICAg c2FtcGxlczIucmVzZXJ2ZShzYW1wbGVzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0 ZDo6dHJhbnNmb3JtKHNhbXBsZXMuYmVnaW4oKSwgc2FtcGxlcy5lbmQoKSwgc3RkOjpiYWNrX2lu c2VydGVyKHNhbXBsZXMyKSwgW10oZG91YmxlIGQpIHsgcmV0dXJuIER1cmF0aW9uKGQpOyB9KTsK KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0 ZDo6bW92ZShzYW1wbGVzMiksCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX2VzdGltYXRl KGFuYWx5c2lzLm1lYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF9lc3RpbWF0ZShh bmFseXNpcy5zdGFuZGFyZF9kZXZpYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0 bGllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNpcy5vdXRsaWVyX3ZhcmlhbmNl LAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAg ICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPER1cmF0aW9uPiBzYW1wbGVzOworICAgICAgICAg ICAgICAgICAgICBzYW1wbGVzLnJlc2VydmUobGFzdCAtIGZpcnN0KTsKKworICAgICAgICAgICAg ICAgICAgICBEdXJhdGlvbiBtZWFuID0gRHVyYXRpb24oMCk7CisgICAgICAgICAgICAgICAgICAg IGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZmlyc3Q7IGl0 IDwgbGFzdDsgKytpdCwgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLnB1 c2hfYmFjayhEdXJhdGlvbigqaXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gKz0g RHVyYXRpb24oKml0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg ICBtZWFuIC89IGk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAg ICAgICAgICAgICAgIHN0ZDo6bW92ZShzYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAg IEVzdGltYXRlPER1cmF0aW9uPnttZWFuLCBtZWFuLCBtZWFuLCAwLjB9LAorICAgICAgICAgICAg ICAgICAgICAgICAgRXN0aW1hdGU8RHVyYXRpb24+e0R1cmF0aW9uKDApLCBEdXJhdGlvbigwKSwg RHVyYXRpb24oMCksIDAuMH0sCisgICAgICAgICAgICAgICAgICAgICAgICBPdXRsaWVyQ2xhc3Np ZmljYXRpb257fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMAorICAgICAgICAgICAgICAg ICAgICB9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBu YW1lc3BhY2UgRGV0YWlsCisgICAgfSAvLyBuYW1lc3BhY2UgQmVuY2htYXJrCit9IC8vIG5hbWVz cGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfYW5hbHlzZS5ocHAKKyNpbmNsdWRlIDxhbGdvcml0 aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8 dmVjdG9yPgorI2luY2x1ZGUgPGNtYXRoPgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVz cGFjZSBCZW5jaG1hcmsgeworICAgICAgICBzdHJ1Y3QgQmVuY2htYXJrIHsKKyAgICAgICAgICAg IEJlbmNobWFyayhzdGQ6OnN0cmluZyAmJm5hbWUpCisgICAgICAgICAgICAgICAgOiBuYW1lKHN0 ZDo6bW92ZShuYW1lKSkge30KKworICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEZVTj4KKyAg ICAgICAgICAgIEJlbmNobWFyayhzdGQ6OnN0cmluZyAmJm5hbWUsIEZVTiAmJmZ1bmMpCisgICAg ICAgICAgICAgICAgOiBmdW4oc3RkOjptb3ZlKGZ1bmMpKSwgbmFtZShzdGQ6Om1vdmUobmFtZSkp IHt9CisKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jaz4KKyAgICAgICAgICAg IEV4ZWN1dGlvblBsYW48RmxvYXREdXJhdGlvbjxDbG9jaz4+IHByZXBhcmUoY29uc3QgSUNvbmZp ZyAmY2ZnLCBFbnZpcm9ubWVudDxGbG9hdER1cmF0aW9uPENsb2NrPj4gZW52KSBjb25zdCB7Cisg ICAgICAgICAgICAgICAgYXV0byBtaW5fdGltZSA9IGVudi5jbG9ja19yZXNvbHV0aW9uLm1lYW4g KiBEZXRhaWw6Om1pbmltdW1fdGlja3M7CisgICAgICAgICAgICAgICAgYXV0byBydW5fdGltZSA9 IHN0ZDo6bWF4KG1pbl90aW1lLCBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxkZWNsdHlwZSht aW5fdGltZSk+KGNmZy5iZW5jaG1hcmtXYXJtdXBUaW1lKCkpKTsKKyAgICAgICAgICAgICAgICBh dXRvJiYgdGVzdCA9IERldGFpbDo6cnVuX2Zvcl9hdF9sZWFzdDxDbG9jaz4oc3RkOjpjaHJvbm86 OmR1cmF0aW9uX2Nhc3Q8Q2xvY2tEdXJhdGlvbjxDbG9jaz4+KHJ1bl90aW1lKSwgMSwgZnVuKTsK KyAgICAgICAgICAgICAgICBpbnQgbmV3X2l0ZXJzID0gc3RhdGljX2Nhc3Q8aW50PihzdGQ6OmNl aWwobWluX3RpbWUgKiB0ZXN0Lml0ZXJhdGlvbnMgLyB0ZXN0LmVsYXBzZWQpKTsKKyAgICAgICAg ICAgICAgICByZXR1cm4geyBuZXdfaXRlcnMsIHRlc3QuZWxhcHNlZCAvIHRlc3QuaXRlcmF0aW9u cyAqIG5ld19pdGVycyAqIGNmZy5iZW5jaG1hcmtTYW1wbGVzKCksIGZ1biwgc3RkOjpjaHJvbm86 OmR1cmF0aW9uX2Nhc3Q8RmxvYXREdXJhdGlvbjxDbG9jaz4+KGNmZy5iZW5jaG1hcmtXYXJtdXBU aW1lKCkpLCBEZXRhaWw6Ondhcm11cF9pdGVyYXRpb25zIH07CisgICAgICAgICAgICB9CisKKyAg ICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jayA9IGRlZmF1bHRfY2xvY2s+CisgICAg ICAgICAgICB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBJQ29uZmlnUHRyIGNmZyA9IGdl dEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCk7CisKKyAgICAgICAgICAgICAgICBhdXRvIGVu diA9IERldGFpbDo6bWVhc3VyZV9lbnZpcm9ubWVudDxDbG9jaz4oKTsKKworICAgICAgICAgICAg ICAgIGdldFJlc3VsdENhcHR1cmUoKS5iZW5jaG1hcmtQcmVwYXJpbmcobmFtZSk7CisgICAgICAg ICAgICAgICAgQ0FUQ0hfVFJZeworICAgICAgICAgICAgICAgICAgICBhdXRvIHBsYW4gPSB1c2Vy X2NvZGUoWyZdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVwYXJlPENsb2Nr PigqY2ZnLCBlbnYpOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAg ICAgICBCZW5jaG1hcmtJbmZvIGluZm8geworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwK KyAgICAgICAgICAgICAgICAgICAgICAgIHBsYW4uZXN0aW1hdGVkX2R1cmF0aW9uLmNvdW50KCks CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFuLml0ZXJhdGlvbnNfcGVyX3NhbXBsZSwKKyAg ICAgICAgICAgICAgICAgICAgICAgIGNmZy0+YmVuY2htYXJrU2FtcGxlcygpLAorICAgICAgICAg ICAgICAgICAgICAgICAgY2ZnLT5iZW5jaG1hcmtSZXNhbXBsZXMoKSwKKyAgICAgICAgICAgICAg ICAgICAgICAgIGVudi5jbG9ja19yZXNvbHV0aW9uLm1lYW4uY291bnQoKSwKKyAgICAgICAgICAg ICAgICAgICAgICAgIGVudi5jbG9ja19jb3N0Lm1lYW4uY291bnQoKQorICAgICAgICAgICAgICAg ICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5iZW5jaG1h cmtTdGFydGluZyhpbmZvKTsKKworICAgICAgICAgICAgICAgICAgICBhdXRvIHNhbXBsZXMgPSB1 c2VyX2NvZGUoWyZdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFuLnRlbXBs YXRlIHJ1bjxDbG9jaz4oKmNmZywgZW52KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAg ICAgICAgICAgICAgICAgICAgYXV0byBhbmFseXNpcyA9IERldGFpbDo6YW5hbHlzZSgqY2ZnLCBl bnYsIHNhbXBsZXMuYmVnaW4oKSwgc2FtcGxlcy5lbmQoKSk7CisgICAgICAgICAgICAgICAgICAg IEJlbmNobWFya1N0YXRzPEZsb2F0RHVyYXRpb248Q2xvY2s+PiBzdGF0c3sgaW5mbywgYW5hbHlz aXMuc2FtcGxlcywgYW5hbHlzaXMubWVhbiwgYW5hbHlzaXMuc3RhbmRhcmRfZGV2aWF0aW9uLCBh bmFseXNpcy5vdXRsaWVycywgYW5hbHlzaXMub3V0bGllcl92YXJpYW5jZSB9OworICAgICAgICAg ICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYmVuY2htYXJrRW5kZWQoc3RhdHMpOworCisg ICAgICAgICAgICAgICAgfSBDQVRDSF9DQVRDSF9BTEx7CisgICAgICAgICAgICAgICAgICAgIGlm ICh0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSAhPSBEZXRhaWw6OmJlbmNobWFya0Vycm9yTXNn KSAvLyBiZW5jaG1hcmsgZXJyb3JzIGhhdmUgYmVlbiByZXBvcnRlZCwgb3RoZXJ3aXNlIHJldGhy b3cuCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJldGhyb3dfZXhjZXB0aW9uKHN0ZDo6 Y3VycmVudF9leGNlcHRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor CisgICAgICAgICAgICAvLyBzZXRzIGxhbWJkYSB0byBiZSB1c2VkIGluIGZ1biAqYW5kKiBleGVj dXRlcyBiZW5jaG1hcmshCisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuLAorICAg ICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFEZXRhaWw6OmlzX3JlbGF0ZWQ8 RnVuLCBCZW5jaG1hcms+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+CisgICAgICAgICAgICAgICAg QmVuY2htYXJrICYgb3BlcmF0b3I9KEZ1biBmdW5jKSB7CisgICAgICAgICAgICAgICAgZnVuID0g RGV0YWlsOjpCZW5jaG1hcmtGdW5jdGlvbihmdW5jKTsKKyAgICAgICAgICAgICAgICBydW4oKTsK KyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAg ICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRy dWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIERldGFp bDo6QmVuY2htYXJrRnVuY3Rpb24gZnVuOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsK KyAgICAgICAgfTsKKyAgICB9Cit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjZGVmaW5lIElOVEVS TkFMX0NBVENIX0dFVF8xX0FSRyhhcmcxLCBhcmcyLCAuLi4pIGFyZzEKKyNkZWZpbmUgSU5URVJO QUxfQ0FUQ0hfR0VUXzJfQVJHKGFyZzEsIGFyZzIsIC4uLikgYXJnMgorCisjZGVmaW5lIElOVEVS TkFMX0NBVENIX0JFTkNITUFSSyhCZW5jaG1hcmtOYW1lLCBuYW1lLCBiZW5jaG1hcmtJbmRleClc CisgICAgaWYoIENhdGNoOjpCZW5jaG1hcms6OkJlbmNobWFyayBCZW5jaG1hcmtOYW1le25hbWV9 ICkgXAorICAgICAgICBCZW5jaG1hcmtOYW1lID0gWyZdKGludCBiZW5jaG1hcmtJbmRleCkKKwor I2RlZmluZSBJTlRFUk5BTF9DQVRDSF9CRU5DSE1BUktfQURWQU5DRUQoQmVuY2htYXJrTmFtZSwg bmFtZSlcCisgICAgaWYoIENhdGNoOjpCZW5jaG1hcms6OkJlbmNobWFyayBCZW5jaG1hcmtOYW1l e25hbWV9ICkgXAorICAgICAgICBCZW5jaG1hcmtOYW1lID0gWyZdCisKKy8vIGVuZCBjYXRjaF9i ZW5jaG1hcmsuaHBwCisvLyBzdGFydCBjYXRjaF9jb25zdHJ1Y3Rvci5ocHAKKworLy8gQ29uc3Ry dWN0b3IgYW5kIGRlc3RydWN0b3IgaGVscGVycworCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4K KworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKKyAgICAgICAg bmFtZXNwYWNlIERldGFpbCB7CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9v bCBEZXN0cnVjdD4KKyAgICAgICAgICAgIHN0cnVjdCBPYmplY3RTdG9yYWdlCisgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgdXNpbmcgVFN0b3JhZ2UgPSB0eXBlbmFtZSBzdGQ6OmFsaWdu ZWRfc3RvcmFnZTxzaXplb2YoVCksIHN0ZDo6YWxpZ25tZW50X29mPFQ+Ojp2YWx1ZT46OnR5cGU7 CisKKyAgICAgICAgICAgICAgICBPYmplY3RTdG9yYWdlKCkgOiBkYXRhKCkge30KKworICAgICAg ICAgICAgICAgIE9iamVjdFN0b3JhZ2UoY29uc3QgT2JqZWN0U3RvcmFnZSYgb3RoZXIpCisgICAg ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXcoJmRhdGEpIFQob3RoZXIuc3Rv cmVkX29iamVjdCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBPYmpl Y3RTdG9yYWdlKE9iamVjdFN0b3JhZ2UmJiBvdGhlcikKKyAgICAgICAgICAgICAgICB7CisgICAg ICAgICAgICAgICAgICAgIG5ldygmZGF0YSkgVChzdGQ6Om1vdmUob3RoZXIuc3RvcmVkX29iamVj dCgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfk9iamVjdFN0b3Jh Z2UoKSB7IGRlc3RydWN0X29uX2V4aXQ8VD4oKTsgfQorCisgICAgICAgICAgICAgICAgdGVtcGxh dGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgICAgICAgICAgICAgdm9pZCBjb25zdHJ1Y3QoQXJn cyYmLi4uIGFyZ3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXcg KCZkYXRhKSBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgICAgICAgICAgICAg fQorCisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPGJvb2wgQWxsb3dNYW51YWxEZXN0cnVjdGlv biA9ICFEZXN0cnVjdD4KKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxB bGxvd01hbnVhbERlc3RydWN0aW9uPjo6dHlwZSBkZXN0cnVjdCgpCisgICAgICAgICAgICAgICAg eworICAgICAgICAgICAgICAgICAgICBzdG9yZWRfb2JqZWN0KCkuflQoKTsKKyAgICAgICAgICAg ICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgLy8gSWYgdGhp cyBpcyBhIGNvbnN0cnVjdG9yIGJlbmNobWFyaywgZGVzdHJ1Y3QgdGhlIHVuZGVybHlpbmcgb2Jq ZWN0CisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgICAgICAgICAgICAg ICAgdm9pZCBkZXN0cnVjdF9vbl9leGl0KHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPERlc3RydWN0 LCBVPjo6dHlwZSogPSAwKSB7IGRlc3RydWN0PHRydWU+KCk7IH0KKyAgICAgICAgICAgICAgICAv LyBPdGhlcndpc2UsIGRvbid0CisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+ CisgICAgICAgICAgICAgICAgdm9pZCBkZXN0cnVjdF9vbl9leGl0KHR5cGVuYW1lIHN0ZDo6ZW5h YmxlX2lmPCFEZXN0cnVjdCwgVT46OnR5cGUqID0gMCkgeyB9CisKKyAgICAgICAgICAgICAgICBU JiBzdG9yZWRfb2JqZWN0KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnN0YXRpY19j YXN0PFQqPihzdGF0aWNfY2FzdDx2b2lkKj4oJmRhdGEpKTsKKyAgICAgICAgICAgICAgICB9CisK KyAgICAgICAgICAgICAgICBUIGNvbnN0JiBzdG9yZWRfb2JqZWN0KCkgY29uc3QgeworICAgICAg ICAgICAgICAgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PFQqPihzdGF0aWNfY2FzdDx2b2lkKj4o JmRhdGEpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUU3RvcmFnZSBk YXRhOworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBl bmFtZSBUPgorICAgICAgICB1c2luZyBzdG9yYWdlX2ZvciA9IERldGFpbDo6T2JqZWN0U3RvcmFn ZTxULCB0cnVlPjsKKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgdXNp bmcgZGVzdHJ1Y3RhYmxlX29iamVjdCA9IERldGFpbDo6T2JqZWN0U3RvcmFnZTxULCBmYWxzZT47 CisgICAgfQorfQorCisvLyBlbmQgY2F0Y2hfY29uc3RydWN0b3IuaHBwCisvLyBlbmQgY2F0Y2hf YmVuY2htYXJraW5nX2FsbC5ocHAKKyNlbmRpZgorCisjZW5kaWYgLy8gISBDQVRDSF9DT05GSUdf SU1QTF9PTkxZCisKKyNpZmRlZiBDQVRDSF9JTVBMCisvLyBzdGFydCBjYXRjaF9pbXBsLmhwcAor CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdt YSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xd2Vhay12dGFibGVzIgorI2VuZGlmCisKKy8v IEtlZXAgdGhlc2UgaGVyZSBmb3IgZXh0ZXJuYWwgcmVwb3J0ZXJzCisvLyBzdGFydCBjYXRjaF90 ZXN0X2Nhc2VfdHJhY2tlci5oCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9y PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBUZXN0 Q2FzZVRyYWNraW5nIHsKKworICAgIHN0cnVjdCBOYW1lQW5kTG9jYXRpb24geworICAgICAgICBz dGQ6OnN0cmluZyBuYW1lOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsb2NhdGlvbjsKKworICAg ICAgICBOYW1lQW5kTG9jYXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwgU291cmNlTGlu ZUluZm8gY29uc3QmIF9sb2NhdGlvbiApOworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09 KE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbGhzLCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIHJocykg eworICAgICAgICAgICAgcmV0dXJuIGxocy5uYW1lID09IHJocy5uYW1lCisgICAgICAgICAgICAg ICAgJiYgbGhzLmxvY2F0aW9uID09IHJocy5sb2NhdGlvbjsKKyAgICAgICAgfQorICAgIH07CisK KyAgICBjbGFzcyBJVHJhY2tlcjsKKworICAgIHVzaW5nIElUcmFja2VyUHRyID0gc3RkOjpzaGFy ZWRfcHRyPElUcmFja2VyPjsKKworICAgIGNsYXNzICBJVHJhY2tlciB7CisgICAgICAgIE5hbWVB bmRMb2NhdGlvbiBtX25hbWVBbmRMb2NhdGlvbjsKKworICAgIHB1YmxpYzoKKyAgICAgICAgSVRy YWNrZXIoTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jKSA6CisgICAgICAgICAgICBt X25hbWVBbmRMb2NhdGlvbihuYW1lQW5kTG9jKQorICAgICAgICB7fQorCisgICAgICAgIC8vIHN0 YXRpYyBxdWVyaWVzCisgICAgICAgIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0 aW9uKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fbmFtZUFuZExvY2F0aW9uOworICAg ICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+SVRyYWNrZXIoKTsKKworICAgICAgICAvLyBkeW5h bWljIHF1ZXJpZXMKKyAgICAgICAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdCA9IDA7 IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb3IgZmFpbGVkCisgICAgICAgIHZpcnR1YWwgYm9v bCBpc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBi b29sIGlzT3BlbigpIGNvbnN0ID0gMDsgLy8gU3RhcnRlZCBidXQgbm90IGNvbXBsZXRlCisgICAg ICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVh bCBib29sIGhhc1N0YXJ0ZWQoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBJVHJhY2tl ciYgcGFyZW50KCkgPSAwOworCisgICAgICAgIC8vIGFjdGlvbnMKKyAgICAgICAgdmlydHVhbCB2 b2lkIGNsb3NlKCkgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGUKKyAgICAgICAgdmlydHVh bCB2b2lkIGZhaWwoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBtYXJrQXNOZWVkaW5nQW5v dGhlclJ1bigpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoIElUcmFja2Vy UHRyIGNvbnN0JiBjaGlsZCApID0gMDsKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlclB0ciBmaW5k Q2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgPSAwOworICAg ICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgPSAwOworCisgICAgICAgIC8vIERlYnVnLyBj aGVja2luZworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0ID0g MDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzR2VuZXJhdG9yVHJhY2tlcigpIGNvbnN0ID0gMDsK KyAgICB9OworCisgICAgY2xhc3MgVHJhY2tlckNvbnRleHQgeworCisgICAgICAgIGVudW0gUnVu U3RhdGUgeworICAgICAgICAgICAgTm90U3RhcnRlZCwKKyAgICAgICAgICAgIEV4ZWN1dGluZywK KyAgICAgICAgICAgIENvbXBsZXRlZEN5Y2xlCisgICAgICAgIH07CisKKyAgICAgICAgSVRyYWNr ZXJQdHIgbV9yb290VHJhY2tlcjsKKyAgICAgICAgSVRyYWNrZXIqIG1fY3VycmVudFRyYWNrZXIg PSBudWxscHRyOworICAgICAgICBSdW5TdGF0ZSBtX3J1blN0YXRlID0gTm90U3RhcnRlZDsKKwor ICAgIHB1YmxpYzoKKworICAgICAgICBJVHJhY2tlciYgc3RhcnRSdW4oKTsKKyAgICAgICAgdm9p ZCBlbmRSdW4oKTsKKworICAgICAgICB2b2lkIHN0YXJ0Q3ljbGUoKTsKKyAgICAgICAgdm9pZCBj b21wbGV0ZUN5Y2xlKCk7CisKKyAgICAgICAgYm9vbCBjb21wbGV0ZWRDeWNsZSgpIGNvbnN0Owor ICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIoKTsKKyAgICAgICAgdm9pZCBzZXRDdXJy ZW50VHJhY2tlciggSVRyYWNrZXIqIHRyYWNrZXIgKTsKKyAgICB9OworCisgICAgY2xhc3MgVHJh Y2tlckJhc2UgOiBwdWJsaWMgSVRyYWNrZXIgeworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZW51 bSBDeWNsZVN0YXRlIHsKKyAgICAgICAgICAgIE5vdFN0YXJ0ZWQsCisgICAgICAgICAgICBFeGVj dXRpbmcsCisgICAgICAgICAgICBFeGVjdXRpbmdDaGlsZHJlbiwKKyAgICAgICAgICAgIE5lZWRz QW5vdGhlclJ1biwKKyAgICAgICAgICAgIENvbXBsZXRlZFN1Y2Nlc3NmdWxseSwKKyAgICAgICAg ICAgIEZhaWxlZAorICAgICAgICB9OworCisgICAgICAgIHVzaW5nIENoaWxkcmVuID0gc3RkOjp2 ZWN0b3I8SVRyYWNrZXJQdHI+OworICAgICAgICBUcmFja2VyQ29udGV4dCYgbV9jdHg7CisgICAg ICAgIElUcmFja2VyKiBtX3BhcmVudDsKKyAgICAgICAgQ2hpbGRyZW4gbV9jaGlsZHJlbjsKKyAg ICAgICAgQ3ljbGVTdGF0ZSBtX3J1blN0YXRlID0gTm90U3RhcnRlZDsKKworICAgIHB1YmxpYzoK KyAgICAgICAgVHJhY2tlckJhc2UoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0 aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50ICk7CisKKyAgICAgICAg Ym9vbCBpc0NvbXBsZXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGJvb2wgaXNTdWNjZXNz ZnVsbHlDb21wbGV0ZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYm9vbCBpc09wZW4oKSBj b25zdCBvdmVycmlkZTsKKyAgICAgICAgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0IG92ZXJyaWRl OworICAgICAgICBib29sIGhhc1N0YXJ0ZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAg ICByZXR1cm4gbV9ydW5TdGF0ZSAhPSBOb3RTdGFydGVkOworICAgICAgICB9CisKKyAgICAgICAg dm9pZCBhZGRDaGlsZCggSVRyYWNrZXJQdHIgY29uc3QmIGNoaWxkICkgb3ZlcnJpZGU7CisKKyAg ICAgICAgSVRyYWNrZXJQdHIgZmluZENoaWxkKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVB bmRMb2NhdGlvbiApIG92ZXJyaWRlOworICAgICAgICBJVHJhY2tlciYgcGFyZW50KCkgb3ZlcnJp ZGU7CisKKyAgICAgICAgdm9pZCBvcGVuQ2hpbGQoKSBvdmVycmlkZTsKKworICAgICAgICBib29s IGlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYm9vbCBpc0dlbmVy YXRvclRyYWNrZXIoKSBjb25zdCBvdmVycmlkZTsKKworICAgICAgICB2b2lkIG9wZW4oKTsKKwor ICAgICAgICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgZmFpbCgpIG92ZXJy aWRlOworICAgICAgICB2b2lkIG1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCkgb3ZlcnJpZGU7CisK KyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG1vdmVUb1BhcmVudCgpOworICAgICAgICB2b2lk IG1vdmVUb1RoaXMoKTsKKyAgICB9OworCisgICAgY2xhc3MgU2VjdGlvblRyYWNrZXIgOiBwdWJs aWMgVHJhY2tlckJhc2UgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9maWx0 ZXJzOworICAgICAgICBzdGQ6OnN0cmluZyBtX3RyaW1tZWRfbmFtZTsKKyAgICBwdWJsaWM6Cisg ICAgICAgIFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2Nh dGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCApOworCisgICAgICAg IGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIGJvb2wg aXNDb21wbGV0ZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIHN0YXRpYyBTZWN0aW9uVHJh Y2tlciYgYWNxdWlyZSggVHJhY2tlckNvbnRleHQmIGN0eCwgTmFtZUFuZExvY2F0aW9uIGNvbnN0 JiBuYW1lQW5kTG9jYXRpb24gKTsKKworICAgICAgICB2b2lkIHRyeU9wZW4oKTsKKworICAgICAg ICB2b2lkIGFkZEluaXRpYWxGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3Qm IGZpbHRlcnMgKTsKKyAgICAgICAgdm9pZCBhZGROZXh0RmlsdGVycyggc3RkOjp2ZWN0b3I8c3Rk OjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICk7CisgICAgICAgIC8vISBSZXR1cm5zIGZpbHRlcnMg YWN0aXZlIGluIHRoaXMgdHJhY2tlcgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4g Y29uc3QmIGdldEZpbHRlcnMoKSBjb25zdDsKKyAgICAgICAgLy8hIFJldHVybnMgd2hpdGVzcGFj ZS10cmltbWVkIG5hbWUgb2YgdGhlIHRyYWNrZWQgc2VjdGlvbgorICAgICAgICBzdGQ6OnN0cmlu ZyBjb25zdCYgdHJpbW1lZE5hbWUoKSBjb25zdDsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBU ZXN0Q2FzZVRyYWNraW5nCisKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OklUcmFja2VyOwordXNp bmcgVGVzdENhc2VUcmFja2luZzo6VHJhY2tlckNvbnRleHQ7Cit1c2luZyBUZXN0Q2FzZVRyYWNr aW5nOjpTZWN0aW9uVHJhY2tlcjsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNh dGNoX3Rlc3RfY2FzZV90cmFja2VyLmgKKworLy8gc3RhcnQgY2F0Y2hfbGVha19kZXRlY3Rvci5o CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgTGVha0RldGVjdG9yIHsKKyAgICAg ICAgTGVha0RldGVjdG9yKCk7CisgICAgICAgIH5MZWFrRGV0ZWN0b3IoKTsKKyAgICB9OworCit9 CisvLyBlbmQgY2F0Y2hfbGVha19kZXRlY3Rvci5oCisvLyBDcHAgZmlsZXMgd2lsbCBiZSBpbmNs dWRlZCBpbiB0aGUgc2luZ2xlLWhlYWRlciBmaWxlIGhlcmUKKy8vIHN0YXJ0IGNhdGNoX3N0YXRz LmNwcAorCisvLyBTdGF0aXN0aWNhbCBhbmFseXNpcyB0b29scworCisjaWYgZGVmaW5lZChDQVRD SF9DT05GSUdfRU5BQkxFX0JFTkNITUFSS0lORykKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5j bHVkZSA8cmFuZG9tPgorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfVVNFX0FTWU5DKQorI2lu Y2x1ZGUgPGZ1dHVyZT4KKyNlbmRpZgorCituYW1lc3BhY2UgeworICAgIGRvdWJsZSBlcmZfaW52 KGRvdWJsZSB4KSB7CisgICAgICAgIC8vIENvZGUgYWNjb21wYW55aW5nIHRoZSBhcnRpY2xlICJB cHByb3hpbWF0aW5nIHRoZSBlcmZpbnYgZnVuY3Rpb24iIGluIEdQVSBDb21wdXRpbmcgR2Vtcywg Vm9sdW1lIDIKKyAgICAgICAgZG91YmxlIHcsIHA7CisKKyAgICAgICAgdyA9IC1sb2coKDEuMCAt IHgpICogKDEuMCArIHgpKTsKKworICAgICAgICBpZiAodyA8IDYuMjUwMDAwKSB7CisgICAgICAg ICAgICB3ID0gdyAtIDMuMTI1MDAwOworICAgICAgICAgICAgcCA9IC0zLjY0NDQxMjA2NDAxNzgx OTY5OTZlLTIxOworICAgICAgICAgICAgcCA9IC0xLjY4NTA1OTEzODE4MjAxNjU4OWUtMTkgKyBw ICogdzsKKyAgICAgICAgICAgIHAgPSAxLjI4NTg0ODA3MTUyNTY0MDAxNjdlLTE4ICsgcCAqIHc7 CisgICAgICAgICAgICBwID0gMS4xMTU3ODc3Njc4MDI1MTgwOTZlLTE3ICsgcCAqIHc7CisgICAg ICAgICAgICBwID0gLTEuMzMzMTcxNjYyODU0NjIwOTA2ZS0xNiArIHAgKiB3OworICAgICAgICAg ICAgcCA9IDIuMDk3Mjc2Nzg3NTk2ODU2MTYzN2UtMTcgKyBwICogdzsKKyAgICAgICAgICAgIHAg PSA2LjYzNzYzODEzNDM1ODMyMzgzMjVlLTE1ICsgcCAqIHc7CisgICAgICAgICAgICBwID0gLTQu MDU0NTY2MjcyOTc1MjA2ODYzOWUtMTQgKyBwICogdzsKKyAgICAgICAgICAgIHAgPSAtOC4xNTE5 MzQxOTc2MDU0NzIxNTIyZS0xNCArIHAgKiB3OworICAgICAgICAgICAgcCA9IDIuNjMzNTA5MzE1 MzA4MjMyMjk3N2UtMTIgKyBwICogdzsKKyAgICAgICAgICAgIHAgPSAtMS4yOTc1MTMzMjUzNDUz NTMyNDk4ZS0xMSArIHAgKiB3OworICAgICAgICAgICAgcCA9IC01LjQxNTQxMjA1NDI5NDYyNzkz MTdlLTExICsgcCAqIHc7CisgICAgICAgICAgICBwID0gMS4wNTEyMTIyNzMzMjE1MzIyODVlLTA5 ICsgcCAqIHc7CisgICAgICAgICAgICBwID0gLTQuMTEyNjMzOTgwMzQ2OTgzNjk3NmUtMDkgKyBw ICogdzsKKyAgICAgICAgICAgIHAgPSAtMi45MDcwMzY5OTU3ODgyMDA1MDg2ZS0wOCArIHAgKiB3 OworICAgICAgICAgICAgcCA9IDQuMjM0Nzg3NzgyNzkzMjQwMzUxOGUtMDcgKyBwICogdzsKKyAg ICAgICAgICAgIHAgPSAtMS4zNjU0NjkyMDAwODM0Njc4NjQ1ZS0wNiArIHAgKiB3OworICAgICAg ICAgICAgcCA9IC0xLjM4ODI1MjMzNjI3ODY0Njg3MTllLTA1ICsgcCAqIHc7CisgICAgICAgICAg ICBwID0gMC4wMDAxODY3MzQyMDgwMzQwNTcxMzUyICsgcCAqIHc7CisgICAgICAgICAgICBwID0g LTAuMDAwNzQwNzAyNTM0MTY2MjY2OTc1MTIgKyBwICogdzsKKyAgICAgICAgICAgIHAgPSAtMC4w MDYwMzM2NzA4NzE0MzAxNDkwNTMzICsgcCAqIHc7CisgICAgICAgICAgICBwID0gMC4yNDAxNTgx ODI0MjU1ODk2MTY5MyArIHAgKiB3OworICAgICAgICAgICAgcCA9IDEuNjUzNjU0NTYyNjgzMTAy NzM1NiArIHAgKiB3OworICAgICAgICB9IGVsc2UgaWYgKHcgPCAxNi4wMDAwMDApIHsKKyAgICAg ICAgICAgIHcgPSBzcXJ0KHcpIC0gMy4yNTAwMDA7CisgICAgICAgICAgICBwID0gMi4yMTM3Mzc2 OTIxNzc1Nzg3MDQ5ZS0wOTsKKyAgICAgICAgICAgIHAgPSA5LjA3NTY1NjE5Mzg4ODUzOTA5Nzll LTA4ICsgcCAqIHc7CisgICAgICAgICAgICBwID0gLTIuNzUxNzQwNjI5NzA2NDU0NTQyOGUtMDcg KyBwICogdzsKKyAgICAgICAgICAgIHAgPSAxLjgyMzk2MjkyMTQzODkyMjc3NTVlLTA4ICsgcCAq IHc7CisgICAgICAgICAgICBwID0gMS41MDI3NDAzOTY4OTA5ODI3NjI3ZS0wNiArIHAgKiB3Owor ICAgICAgICAgICAgcCA9IC00LjAxMzg2NzUyNjk4MTU0NTk2OWUtMDYgKyBwICogdzsKKyAgICAg ICAgICAgIHAgPSAyLjkyMzQ0NDkwODk5NTU0NDYwNDRlLTA2ICsgcCAqIHc7CisgICAgICAgICAg ICBwID0gMS4yNDc1MzA0NDgxNjcxNzc4NzIzZS0wNSArIHAgKiB3OworICAgICAgICAgICAgcCA9 IC00LjczMTgyMjkwMDkwNTU3MzM5ODFlLTA1ICsgcCAqIHc7CisgICAgICAgICAgICBwID0gNi44 Mjg0ODUxNDU5NTczMTc1NDQ4ZS0wNSArIHAgKiB3OworICAgICAgICAgICAgcCA9IDIuNDAzMTEx MDM4NzA5Nzg5Mzk5OWUtMDUgKyBwICogdzsKKyAgICAgICAgICAgIHAgPSAtMC4wMDAzNTUwMzc1 MjAzNjI4NDc0Nzk2ICsgcCAqIHc7CisgICAgICAgICAgICBwID0gMC4wMDA5NTMyODkzNzk3Mzcz ODA0OTcwMyArIHAgKiB3OworICAgICAgICAgICAgcCA9IC0wLjAwMTY4ODI3NTU1NjAyMzUwNDcz MTMgKyBwICogdzsKKyAgICAgICAgICAgIHAgPSAwLjAwMjQ5MTQ0MjA5NjEwNzg1MDgwNjYgKyBw ICogdzsKKyAgICAgICAgICAgIHAgPSAtMC4wMDM3NTEyMDg1MDc1NjkyNDEyMTA3ICsgcCAqIHc7 CisgICAgICAgICAgICBwID0gMC4wMDUzNzA5MTQ1NTM1OTAwNjM2MTcgKyBwICogdzsKKyAgICAg ICAgICAgIHAgPSAxLjAwNTI1ODk2NzY5NDE1OTIzMzQgKyBwICogdzsKKyAgICAgICAgICAgIHAg PSAzLjA4Mzg4NTYxMDQ5MjIyMDc2MzUgKyBwICogdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg ICAgICAgIHcgPSBzcXJ0KHcpIC0gNS4wMDAwMDA7CisgICAgICAgICAgICBwID0gLTIuNzEwOTky MDYxNjQzODU3MzI0M2UtMTE7CisgICAgICAgICAgICBwID0gLTIuNTU1NjQxODE2OTk2NTI1MjA1 NWUtMTAgKyBwICogdzsKKyAgICAgICAgICAgIHAgPSAxLjUwNzY1NzI2OTM1MDA1NDgwODNlLTA5 ICsgcCAqIHc7CisgICAgICAgICAgICBwID0gLTMuNzg5NDY1NDQwMTI2NzM2OTkzN2UtMDkgKyBw ICogdzsKKyAgICAgICAgICAgIHAgPSA3LjYxNTcwMTIwODA3ODMzOTM4MDRlLTA5ICsgcCAqIHc7 CisgICAgICAgICAgICBwID0gLTEuNDk2MDAyNjYyNzE0OTI0MDQ3OGUtMDggKyBwICogdzsKKyAg ICAgICAgICAgIHAgPSAyLjkxNDc5NTM0NTA5MDEwODA4MjZlLTA4ICsgcCAqIHc7CisgICAgICAg ICAgICBwID0gLTYuNzcxMTk5Nzc1ODQ1MjMzOTQ5OGUtMDggKyBwICogdzsKKyAgICAgICAgICAg IHAgPSAyLjI5MDA0ODIyMjgwMjY2NTQ3MTdlLTA3ICsgcCAqIHc7CisgICAgICAgICAgICBwID0g LTkuOTI5ODI3Mjk0MjMxNzAwMjUzOWUtMDcgKyBwICogdzsKKyAgICAgICAgICAgIHAgPSA0LjUy NjA2MjU5NzIyMzE1MzcwMzllLTA2ICsgcCAqIHc7CisgICAgICAgICAgICBwID0gLTEuOTY4MTc3 ODEwNTUzMTY3MDU2N2UtMDUgKyBwICogdzsKKyAgICAgICAgICAgIHAgPSA3LjU5OTUyNzcwMzAw MTc3NjExMzllLTA1ICsgcCAqIHc7CisgICAgICAgICAgICBwID0gLTAuMDAwMjE1MDMwMTE5MzAw NDQ0NzczNDcgKyBwICogdzsKKyAgICAgICAgICAgIHAgPSAtMC4wMDAxMzg3MTkzMTgzMzYyMzEy MjAyNiArIHAgKiB3OworICAgICAgICAgICAgcCA9IDEuMDEwMzAwNDY0ODY0NTM0Mzk3NyArIHAg KiB3OworICAgICAgICAgICAgcCA9IDQuODQ5OTA2NDAxNDA4NTg0NDIyMSArIHAgKiB3OworICAg ICAgICB9CisgICAgICAgIHJldHVybiBwICogeDsKKyAgICB9CisKKyAgICBkb3VibGUgc3RhbmRh cmRfZGV2aWF0aW9uKHN0ZDo6dmVjdG9yPGRvdWJsZT46Oml0ZXJhdG9yIGZpcnN0LCBzdGQ6OnZl Y3Rvcjxkb3VibGU+OjppdGVyYXRvciBsYXN0KSB7CisgICAgICAgIGF1dG8gbSA9IENhdGNoOjpC ZW5jaG1hcms6OkRldGFpbDo6bWVhbihmaXJzdCwgbGFzdCk7CisgICAgICAgIGRvdWJsZSB2YXJp YW5jZSA9IHN0ZDo6YWNjdW11bGF0ZShmaXJzdCwgbGFzdCwgMC4sIFttXShkb3VibGUgYSwgZG91 YmxlIGIpIHsKKyAgICAgICAgICAgIGRvdWJsZSBkaWZmID0gYiAtIG07CisgICAgICAgICAgICBy ZXR1cm4gYSArIGRpZmYgKiBkaWZmOworICAgICAgICAgICAgfSkgLyAobGFzdCAtIGZpcnN0KTsK KyAgICAgICAgICAgIHJldHVybiBzdGQ6OnNxcnQodmFyaWFuY2UpOworICAgIH0KKworfQorCitu YW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgeworICAgICAgICBuYW1l c3BhY2UgRGV0YWlsIHsKKworICAgICAgICAgICAgZG91YmxlIHdlaWdodGVkX2F2ZXJhZ2VfcXVh bnRpbGUoaW50IGssIGludCBxLCBzdGQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvciBmaXJzdCwg c3RkOjp2ZWN0b3I8ZG91YmxlPjo6aXRlcmF0b3IgbGFzdCkgeworICAgICAgICAgICAgICAgIGF1 dG8gY291bnQgPSBsYXN0IC0gZmlyc3Q7CisgICAgICAgICAgICAgICAgZG91YmxlIGlkeCA9IChj b3VudCAtIDEpICogayAvIHN0YXRpY19jYXN0PGRvdWJsZT4ocSk7CisgICAgICAgICAgICAgICAg aW50IGogPSBzdGF0aWNfY2FzdDxpbnQ+KGlkeCk7CisgICAgICAgICAgICAgICAgZG91YmxlIGcg PSBpZHggLSBqOworICAgICAgICAgICAgICAgIHN0ZDo6bnRoX2VsZW1lbnQoZmlyc3QsIGZpcnN0 ICsgaiwgbGFzdCk7CisgICAgICAgICAgICAgICAgYXV0byB4aiA9IGZpcnN0W2pdOworICAgICAg ICAgICAgICAgIGlmIChnID09IDApIHJldHVybiB4ajsKKworICAgICAgICAgICAgICAgIGF1dG8g eGoxID0gKnN0ZDo6bWluX2VsZW1lbnQoZmlyc3QgKyAoaiArIDEpLCBsYXN0KTsKKyAgICAgICAg ICAgICAgICByZXR1cm4geGogKyBnICogKHhqMSAtIHhqKTsKKyAgICAgICAgICAgIH0KKworICAg ICAgICAgICAgZG91YmxlIGVyZmNfaW52KGRvdWJsZSB4KSB7CisgICAgICAgICAgICAgICAgcmV0 dXJuIGVyZl9pbnYoMS4wIC0geCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvdWJs ZSBub3JtYWxfcXVhbnRpbGUoZG91YmxlIHApIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29u c3QgZG91YmxlIFJPT1RfVFdPID0gc3RkOjpzcXJ0KDIuMCk7CisKKyAgICAgICAgICAgICAgICBk b3VibGUgcmVzdWx0ID0gMC4wOworICAgICAgICAgICAgICAgIGFzc2VydChwID49IDAgJiYgcCA8 PSAxKTsKKyAgICAgICAgICAgICAgICBpZiAocCA8IDAgfHwgcCA+IDEpIHsKKyAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg ICAgICByZXN1bHQgPSAtZXJmY19pbnYoMi4wICogcCk7CisgICAgICAgICAgICAgICAgLy8gcmVz dWx0ICo9IG5vcm1hbCBkaXN0cmlidXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICgxLjApICogc3Fy dCgyKQorICAgICAgICAgICAgICAgIHJlc3VsdCAqPSAvKnNkICogKi8gUk9PVF9UV087CisgICAg ICAgICAgICAgICAgLy8gcmVzdWx0ICs9IG5vcm1hbCBkaXN0dHJpYnV0aW9uIG1lYW4gKDApCisg ICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg ICAgZG91YmxlIG91dGxpZXJfdmFyaWFuY2UoRXN0aW1hdGU8ZG91YmxlPiBtZWFuLCBFc3RpbWF0 ZTxkb3VibGU+IHN0ZGRldiwgaW50IG4pIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2IgPSBz dGRkZXYucG9pbnQ7CisgICAgICAgICAgICAgICAgZG91YmxlIG1uID0gbWVhbi5wb2ludCAvIG47 CisgICAgICAgICAgICAgICAgZG91YmxlIG1nX21pbiA9IG1uIC8gMi47CisgICAgICAgICAgICAg ICAgZG91YmxlIHNnID0gKHN0ZDo6bWluKShtZ19taW4gLyA0Liwgc2IgLyBzdGQ6OnNxcnQobikp OworICAgICAgICAgICAgICAgIGRvdWJsZSBzZzIgPSBzZyAqIHNnOworICAgICAgICAgICAgICAg IGRvdWJsZSBzYjIgPSBzYiAqIHNiOworCisgICAgICAgICAgICAgICAgYXV0byBjX21heCA9IFtu LCBtbiwgc2IyLCBzZzJdKGRvdWJsZSB4KSAtPiBkb3VibGUgeworICAgICAgICAgICAgICAgICAg ICBkb3VibGUgayA9IG1uIC0geDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQgPSBrICog azsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIG5kID0gbiAqIGQ7CisgICAgICAgICAgICAg ICAgICAgIGRvdWJsZSBrMCA9IC1uICogbmQ7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBr MSA9IHNiMiAtIG4gKiBzZzIgKyBuZDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRldCA9 IGsxICogazEgLSA0ICogc2cyICogazA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW50 KSgtMi4gKiBrMCAvIChrMSArIHN0ZDo6c3FydChkZXQpKSk7CisgICAgICAgICAgICAgICAgfTsK KworICAgICAgICAgICAgICAgIGF1dG8gdmFyX291dCA9IFtuLCBzYjIsIHNnMl0oZG91YmxlIGMp IHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIG5jID0gbiAtIGM7CisgICAgICAgICAgICAg ICAgICAgIHJldHVybiAobmMgLyBuKSAqIChzYjIgLSBuYyAqIHNnMik7CisgICAgICAgICAgICAg ICAgfTsKKworICAgICAgICAgICAgICAgIHJldHVybiAoc3RkOjptaW4pKHZhcl9vdXQoMSksIHZh cl9vdXQoKHN0ZDo6bWluKShjX21heCgwLiksIGNfbWF4KG1nX21pbikpKSkgLyBzYjI7CisgICAg ICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb3RzdHJhcF9hbmFseXNpcyBhbmFseXNlX3NhbXBs ZXMoZG91YmxlIGNvbmZpZGVuY2VfbGV2ZWwsIGludCBuX3Jlc2FtcGxlcywgc3RkOjp2ZWN0b3I8 ZG91YmxlPjo6aXRlcmF0b3IgZmlyc3QsIHN0ZDo6dmVjdG9yPGRvdWJsZT46Oml0ZXJhdG9yIGxh c3QpIHsKKyAgICAgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQ UkVTU0lPTgorICAgICAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JBTFNf V0FSTklOR1MKKyAgICAgICAgICAgICAgICBzdGF0aWMgc3RkOjpyYW5kb21fZGV2aWNlIGVudHJv cHk7CisgICAgICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1RPUF9XQVJOSU5HU19TVVBQUkVT U0lPTgorCisgICAgICAgICAgICAgICAgYXV0byBuID0gc3RhdGljX2Nhc3Q8aW50PihsYXN0IC0g Zmlyc3QpOyAvLyBzZXJpb3VzbHksIG9uZSBjYW4ndCB1c2UgaW50ZWdyYWwgdHlwZXMgd2l0aG91 dCBoZWxsIGluIEMrKworCisgICAgICAgICAgICAgICAgYXV0byBtZWFuID0gJkRldGFpbDo6bWVh bjxzdGQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvcj47CisgICAgICAgICAgICAgICAgYXV0byBz dGRkZXYgPSAmc3RhbmRhcmRfZGV2aWF0aW9uOworCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdf VVNFX0FTWU5DKQorICAgICAgICAgICAgICAgIGF1dG8gRXN0aW1hdGUgPSBbPV0oZG91YmxlKCpm KShzdGQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvciwgc3RkOjp2ZWN0b3I8ZG91YmxlPjo6aXRl cmF0b3IpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gc2VlZCA9IGVudHJvcHkoKTsKKyAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBb PV0geworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptdDE5OTM3IHJuZyhzZWVkKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzYW1wbGVkID0gcmVzYW1wbGUocm5nLCBuX3Jl c2FtcGxlcywgZmlyc3QsIGxhc3QsIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu IGJvb3RzdHJhcChjb25maWRlbmNlX2xldmVsLCBmaXJzdCwgbGFzdCwgcmVzYW1wbGVkLCBmKTsK KyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAg ICAgICAgIGF1dG8gbWVhbl9mdXR1cmUgPSBFc3RpbWF0ZShtZWFuKTsKKyAgICAgICAgICAgICAg ICBhdXRvIHN0ZGRldl9mdXR1cmUgPSBFc3RpbWF0ZShzdGRkZXYpOworCisgICAgICAgICAgICAg ICAgYXV0byBtZWFuX2VzdGltYXRlID0gbWVhbl9mdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICAg ICAgYXV0byBzdGRkZXZfZXN0aW1hdGUgPSBzdGRkZXZfZnV0dXJlLmdldCgpOworI2Vsc2UKKyAg ICAgICAgICAgICAgICBhdXRvIEVzdGltYXRlID0gWz1dKGRvdWJsZSgqZikoc3RkOjp2ZWN0b3I8 ZG91YmxlPjo6aXRlcmF0b3IsIHN0ZDo6dmVjdG9yPGRvdWJsZT46Oml0ZXJhdG9yKSkgeworICAg ICAgICAgICAgICAgICAgICBhdXRvIHNlZWQgPSBlbnRyb3B5KCk7CisgICAgICAgICAgICAgICAg ICAgIHN0ZDo6bXQxOTkzNyBybmcoc2VlZCk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVz YW1wbGVkID0gcmVzYW1wbGUocm5nLCBuX3Jlc2FtcGxlcywgZmlyc3QsIGxhc3QsIGYpOworICAg ICAgICAgICAgICAgICAgICByZXR1cm4gYm9vdHN0cmFwKGNvbmZpZGVuY2VfbGV2ZWwsIGZpcnN0 LCBsYXN0LCByZXNhbXBsZWQsIGYpOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAg ICAgICBhdXRvIG1lYW5fZXN0aW1hdGUgPSBFc3RpbWF0ZShtZWFuKTsKKyAgICAgICAgICAgICAg ICBhdXRvIHN0ZGRldl9lc3RpbWF0ZSA9IEVzdGltYXRlKHN0ZGRldik7CisjZW5kaWYgLy8gQ0FU Q0hfVVNFX0FTWU5DCisKKyAgICAgICAgICAgICAgICBkb3VibGUgb3V0bGllcl92YXJpYW5jZSA9 IERldGFpbDo6b3V0bGllcl92YXJpYW5jZShtZWFuX2VzdGltYXRlLCBzdGRkZXZfZXN0aW1hdGUs IG4pOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHsgbWVhbl9lc3RpbWF0ZSwgc3RkZGV2X2Vz dGltYXRlLCBvdXRsaWVyX3ZhcmlhbmNlIH07CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy8g bmFtZXNwYWNlIERldGFpbAorICAgIH0gLy8gbmFtZXNwYWNlIEJlbmNobWFyaworfSAvLyBuYW1l c3BhY2UgQ2F0Y2gKKworI2VuZGlmIC8vIENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5H CisvLyBlbmQgY2F0Y2hfc3RhdHMuY3BwCisvLyBzdGFydCBjYXRjaF9hcHByb3guY3BwCisKKyNp bmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSB7CisKKy8vIFBl cmZvcm1zIGVxdWl2YWxlbnQgY2hlY2sgb2Ygc3RkOjpmYWJzKGxocyAtIHJocykgPD0gbWFyZ2lu CisvLyBCdXQgd2l0aG91dCB0aGUgc3VidHJhY3Rpb24gdG8gYWxsb3cgZm9yIElORklOSVRZIGlu IGNvbXBhcmlzb24KK2Jvb2wgbWFyZ2luQ29tcGFyaXNvbihkb3VibGUgbGhzLCBkb3VibGUgcmhz LCBkb3VibGUgbWFyZ2luKSB7CisgICAgcmV0dXJuIChsaHMgKyBtYXJnaW4gPj0gcmhzKSAmJiAo cmhzICsgbWFyZ2luID49IGxocyk7Cit9CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVz cGFjZSBEZXRhaWwgeworCisgICAgQXBwcm94OjpBcHByb3ggKCBkb3VibGUgdmFsdWUgKQorICAg IDogICBtX2Vwc2lsb24oIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjplcHNpbG9uKCkqMTAw ICksCisgICAgICAgIG1fbWFyZ2luKCAwLjAgKSwKKyAgICAgICAgbV9zY2FsZSggMC4wICksCisg ICAgICAgIG1fdmFsdWUoIHZhbHVlICkKKyAgICB7fQorCisgICAgQXBwcm94IEFwcHJveDo6Y3Vz dG9tKCkgeworICAgICAgICByZXR1cm4gQXBwcm94KCAwICk7CisgICAgfQorCisgICAgQXBwcm94 IEFwcHJveDo6b3BlcmF0b3ItKCkgY29uc3QgeworICAgICAgICBhdXRvIHRlbXAoKnRoaXMpOwor ICAgICAgICB0ZW1wLm1fdmFsdWUgPSAtdGVtcC5tX3ZhbHVlOworICAgICAgICByZXR1cm4gdGVt cDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBcHByb3g6OnRvU3RyaW5nKCkgY29uc3Qgewor ICAgICAgICBSZXVzYWJsZVN0cmluZ1N0cmVhbSByc3M7CisgICAgICAgIHJzcyA8PCAiQXBwcm94 KCAiIDw8IDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCBtX3ZhbHVlICkgPDwgIiApIjsKKyAg ICAgICAgcmV0dXJuIHJzcy5zdHIoKTsKKyAgICB9CisKKyAgICBib29sIEFwcHJveDo6ZXF1YWxp dHlDb21wYXJpc29uSW1wbChjb25zdCBkb3VibGUgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgLy8g Rmlyc3QgdHJ5IHdpdGggZml4ZWQgbWFyZ2luLCB0aGVuIGNvbXB1dGUgbWFyZ2luIGJhc2VkIG9u IGVwc2lsb24sIHNjYWxlIGFuZCBBcHByb3gncyB2YWx1ZQorICAgICAgICAvLyBUaGFua3MgdG8g UmljaGFyZCBIYXJyaXMgZm9yIGhpcyBoZWxwIHJlZmluaW5nIHRoZSBzY2FsZWQgbWFyZ2luIHZh bHVlCisgICAgICAgIHJldHVybiBtYXJnaW5Db21wYXJpc29uKG1fdmFsdWUsIG90aGVyLCBtX21h cmdpbikKKyAgICAgICAgICAgIHx8IG1hcmdpbkNvbXBhcmlzb24obV92YWx1ZSwgb3RoZXIsIG1f ZXBzaWxvbiAqIChtX3NjYWxlICsgc3RkOjpmYWJzKHN0ZDo6aXNpbmYobV92YWx1ZSk/IDAgOiBt X3ZhbHVlKSkpOworICAgIH0KKworICAgIHZvaWQgQXBwcm94OjpzZXRNYXJnaW4oZG91YmxlIG5l d01hcmdpbikgeworICAgICAgICBDQVRDSF9FTkZPUkNFKG5ld01hcmdpbiA+PSAwLAorICAgICAg ICAgICAgIkludmFsaWQgQXBwcm94OjptYXJnaW46ICIgPDwgbmV3TWFyZ2luIDw8ICcuJworICAg ICAgICAgICAgPDwgIiBBcHByb3g6Ok1hcmdpbiBoYXMgdG8gYmUgbm9uLW5lZ2F0aXZlLiIpOwor ICAgICAgICBtX21hcmdpbiA9IG5ld01hcmdpbjsKKyAgICB9CisKKyAgICB2b2lkIEFwcHJveDo6 c2V0RXBzaWxvbihkb3VibGUgbmV3RXBzaWxvbikgeworICAgICAgICBDQVRDSF9FTkZPUkNFKG5l d0Vwc2lsb24gPj0gMCAmJiBuZXdFcHNpbG9uIDw9IDEuMCwKKyAgICAgICAgICAgICJJbnZhbGlk IEFwcHJveDo6ZXBzaWxvbjogIiA8PCBuZXdFcHNpbG9uIDw8ICcuJworICAgICAgICAgICAgPDwg IiBBcHByb3g6OmVwc2lsb24gaGFzIHRvIGJlIGluIFswLCAxXSIpOworICAgICAgICBtX2Vwc2ls b24gPSBuZXdFcHNpbG9uOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCitu YW1lc3BhY2UgbGl0ZXJhbHMgeworICAgIERldGFpbDo6QXBwcm94IG9wZXJhdG9yICIiIF9hKGxv bmcgZG91YmxlIHZhbCkgeworICAgICAgICByZXR1cm4gRGV0YWlsOjpBcHByb3godmFsKTsKKyAg ICB9CisgICAgRGV0YWlsOjpBcHByb3ggb3BlcmF0b3IgIiIgX2EodW5zaWduZWQgbG9uZyBsb25n IHZhbCkgeworICAgICAgICByZXR1cm4gRGV0YWlsOjpBcHByb3godmFsKTsKKyAgICB9Cit9IC8v IGVuZCBuYW1lc3BhY2UgbGl0ZXJhbHMKKworc3RkOjpzdHJpbmcgU3RyaW5nTWFrZXI8Q2F0Y2g6 OkRldGFpbDo6QXBwcm94Pjo6Y29udmVydChDYXRjaDo6RGV0YWlsOjpBcHByb3ggY29uc3QmIHZh bHVlKSB7CisgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Cit9CisKK30gLy8gZW5kIG5hbWVz cGFjZSBDYXRjaAorLy8gZW5kIGNhdGNoX2FwcHJveC5jcHAKKy8vIHN0YXJ0IGNhdGNoX2Fzc2Vy dGlvbmhhbmRsZXIuY3BwCisKKy8vIHN0YXJ0IGNhdGNoX2RlYnVnZ2VyLmgKKworbmFtZXNwYWNl IENhdGNoIHsKKyAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKTsKK30KKworI2lmZGVmIENBVENI X1BMQVRGT1JNX01BQworCisgICAgI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194 ODZfNjRfXykKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgX19hc21fXygiaW50ICQzXG4i IDogOiApIC8qIE5PTElOVCAqLworICAgICNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCisgICAg ICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpICBfX2FzbV9fKCIuaW5zdCAweGQ0MjAwMDAwIikKKyAg ICAjZW5kaWYKKworI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9JUEhPTkUpCisKKyAgICAv LyB1c2UgaW5saW5lIGFzc2VtYmxlcgorICAgICNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZp bmVkKF9feDg2XzY0X18pCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpICBfX2FzbV9fKCJp bnQgJDMiKQorICAgICNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCisgICAgICAgICNkZWZpbmUg Q0FUQ0hfVFJBUCgpICBfX2FzbV9fKCIuaW5zdCAweGQ0MjAwMDAwIikKKyAgICAjZWxpZiBkZWZp bmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKKyAgICAgICAgI2RlZmluZSBDQVRD SF9UUkFQKCkgIF9fYXNtX18oIi5pbnN0IDB4ZTdmMDAxZjAiKQorICAgICNlbGlmIGRlZmluZWQo X19hcm1fXykgJiYgIGRlZmluZWQoX190aHVtYl9fKQorICAgICAgICAjZGVmaW5lIENBVENIX1RS QVAoKSAgX19hc21fXygiLmluc3QgMHhkZTAxIikKKyAgICAjZW5kaWYKKworI2VsaWYgZGVmaW5l ZChDQVRDSF9QTEFURk9STV9MSU5VWCkKKyAgICAvLyBJZiB3ZSBjYW4gdXNlIGlubGluZSBhc3Nl bWJsZXIsIGRvIGl0IGJlY2F1c2UgdGhpcyBhbGxvd3MgdXMgdG8gYnJlYWsKKyAgICAvLyBkaXJl Y3RseSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGZhaWxpbmcgY2hlY2sgaW5zdGVhZCBvZiBicmVh a2luZyBpbnNpZGUKKyAgICAvLyByYWlzZSgpIGNhbGxlZCBmcm9tIGl0LCBpLmUuIG9uZSBzdGFj ayBmcmFtZSBiZWxvdy4KKyAgICAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19p Mzg2KSB8fCBkZWZpbmVkKF9feDg2XzY0KSkKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkg YXNtIHZvbGF0aWxlICgiaW50ICQzIikgLyogTk9MSU5UICovCisgICAgI2Vsc2UgLy8gRmFsbCBi YWNrIHRvIHRoZSBnZW5lcmljIHdheS4KKyAgICAgICAgI2luY2x1ZGUgPHNpZ25hbC5oPgorCisg ICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIHJhaXNlKFNJR1RSQVApCisgICAgI2VuZGlmCisj ZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIF9fZGVidWdi cmVhaygpCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAgIGV4dGVybiAiQyIgX19kZWNs c3BlYyhkbGxpbXBvcnQpIHZvaWQgX19zdGRjYWxsIERlYnVnQnJlYWsoKTsKKyAgICAjZGVmaW5l IENBVENIX1RSQVAoKSBEZWJ1Z0JyZWFrKCkKKyNlbmRpZgorCisjaWZuZGVmIENBVENIX0JSRUFL X0lOVE9fREVCVUdHRVIKKyAgICAjaWZkZWYgQ0FUQ0hfVFJBUAorICAgICAgICAjZGVmaW5lIENB VENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKSBbXXsgaWYoIENhdGNoOjppc0RlYnVnZ2VyQWN0aXZl KCkgKSB7IENBVENIX1RSQVAoKTsgfSB9KCkKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIENB VENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKSBbXXt9KCkKKyAgICAjZW5kaWYKKyNlbmRpZgorCisv LyBlbmQgY2F0Y2hfZGVidWdnZXIuaAorLy8gc3RhcnQgY2F0Y2hfcnVuX2NvbnRleHQuaAorCisv LyBzdGFydCBjYXRjaF9mYXRhbF9jb25kaXRpb24uaAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKwor bmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIFdyYXBwZXIgZm9yIHBsYXRmb3JtLXNwZWNpZmlj IGZhdGFsIGVycm9yIChzaWduYWxzL1NFSCkgaGFuZGxlcnMKKyAgICAvLworICAgIC8vIFRyaWVz IHRvIGJlIGNvb3BlcmF0aXZlIHdpdGggb3RoZXIgaGFuZGxlcnMsIGFuZCBub3Qgc3RlcCBvdmVy CisgICAgLy8gb3RoZXIgaGFuZGxlcnMuIFRoaXMgbWVhbnMgdGhhdCB1bmtub3duIHN0cnVjdHVy ZWQgZXhjZXB0aW9ucworICAgIC8vIGFyZSBwYXNzZWQgb24sIHByZXZpb3VzIHNpZ25hbCBoYW5k bGVycyBhcmUgY2FsbGVkLCBhbmQgc28gb24uCisgICAgLy8KKyAgICAvLyBDYW4gb25seSBiZSBp bnN0YW50aWF0ZWQgb25jZSwgYW5kIGFzc3VtZXMgdGhhdCBvbmNlIGEgc2lnbmFsCisgICAgLy8g aXMgY2F1Z2h0LCB0aGUgYmluYXJ5IHdpbGwgZW5kIHVwIHRlcm1pbmF0aW5nLiBUaHVzLCB0aGVy ZQorICAgIGNsYXNzIEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisgICAgICAgIGJvb2wgbV9zdGFy dGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gSW5zdGFsbC9kaXNlbmdhZ2UgaW1wbGVtZW50YXRp b24gZm9yIHNwZWNpZmljIHBsYXRmb3JtLgorICAgICAgICAvLyBTaG91bGQgYmUgaWYtZGVmZWQg dG8gd29yayBvbiBjdXJyZW50IHBsYXRmb3JtLCBjYW4gYXNzdW1lCisgICAgICAgIC8vIGVuZ2Fn ZS1kaXNlbmdhZ2UgMToxIHBhaXJpbmcuCisgICAgICAgIHZvaWQgZW5nYWdlX3BsYXRmb3JtKCk7 CisgICAgICAgIHZvaWQgZGlzZW5nYWdlX3BsYXRmb3JtKCk7CisgICAgcHVibGljOgorICAgICAg ICAvLyBTaG91bGQgYWxzbyBoYXZlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBh cyBuZWVkZWQKKyAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyKCk7CisgICAgICAgIH5GYXRh bENvbmRpdGlvbkhhbmRsZXIoKTsKKworICAgICAgICB2b2lkIGVuZ2FnZSgpIHsKKyAgICAgICAg ICAgIGFzc2VydCghbV9zdGFydGVkICYmICJIYW5kbGVyIGNhbm5vdCBiZSBpbnN0YWxsZWQgdHdp Y2UuIik7CisgICAgICAgICAgICBtX3N0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgZW5nYWdl X3BsYXRmb3JtKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRpc2VuZ2FnZSgpIHsKKyAg ICAgICAgICAgIGFzc2VydChtX3N0YXJ0ZWQgJiYgIkhhbmRsZXIgY2Fubm90IGJlIHVuaW5zdGFs bGVkIHdpdGhvdXQgYmVpbmcgaW5zdGFsbGVkIGZpcnN0Iik7CisgICAgICAgICAgICBtX3N0YXJ0 ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGRpc2VuZ2FnZV9wbGF0Zm9ybSgpOworICAgICAgICB9 CisgICAgfTsKKworICAgIC8vISBTaW1wbGUgUkFJSSBndWFyZCBmb3IgKGRpcyllbmdhZ2luZyB0 aGUgRmF0YWxDb25kaXRpb25IYW5kbGVyCisgICAgY2xhc3MgRmF0YWxDb25kaXRpb25IYW5kbGVy R3VhcmQgeworICAgICAgICBGYXRhbENvbmRpdGlvbkhhbmRsZXIqIG1faGFuZGxlcjsKKyAgICBw dWJsaWM6CisgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlckd1YXJkKEZhdGFsQ29uZGl0aW9u SGFuZGxlciogaGFuZGxlcik6CisgICAgICAgICAgICBtX2hhbmRsZXIoaGFuZGxlcikgeworICAg ICAgICAgICAgbV9oYW5kbGVyLT5lbmdhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICB+RmF0YWxD b25kaXRpb25IYW5kbGVyR3VhcmQoKSB7CisgICAgICAgICAgICBtX2hhbmRsZXItPmRpc2VuZ2Fn ZSgpOworICAgICAgICB9CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8v IGVuZCBjYXRjaF9mYXRhbF9jb25kaXRpb24uaAorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNw YWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJTXV0YWJsZUNvbnRleHQ7CisKKyAgICAvLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8KKworICAgIGNsYXNzIFJ1bkNvbnRleHQgOiBwdWJsaWMgSVJlc3VsdENhcHR1 cmUsIHB1YmxpYyBJUnVubmVyIHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgUnVuQ29udGV4dCgg UnVuQ29udGV4dCBjb25zdCYgKSA9IGRlbGV0ZTsKKyAgICAgICAgUnVuQ29udGV4dCYgb3BlcmF0 b3IgPSggUnVuQ29udGV4dCBjb25zdCYgKSA9IGRlbGV0ZTsKKworICAgICAgICBleHBsaWNpdCBS dW5Db250ZXh0KCBJQ29uZmlnUHRyIGNvbnN0JiBfY29uZmlnLCBJU3RyZWFtaW5nUmVwb3J0ZXJQ dHImJiByZXBvcnRlciApOworCisgICAgICAgIH5SdW5Db250ZXh0KCkgb3ZlcnJpZGU7CisKKyAg ICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVj LCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCApOworICAg ICAgICB2b2lkIHRlc3RHcm91cEVuZGVkKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdFNwZWMsIFRv dGFscyBjb25zdCYgdG90YWxzLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBn cm91cHNDb3VudCApOworCisgICAgICAgIFRvdGFscyBydW5UZXN0KFRlc3RDYXNlIGNvbnN0JiB0 ZXN0Q2FzZSk7CisKKyAgICAgICAgSUNvbmZpZ1B0ciBjb25maWcoKSBjb25zdDsKKyAgICAgICAg SVN0cmVhbWluZ1JlcG9ydGVyJiByZXBvcnRlcigpIGNvbnN0OworCisgICAgcHVibGljOiAvLyBJ UmVzdWx0Q2FwdHVyZQorCisgICAgICAgIC8vIEFzc2VydGlvbiBoYW5kbGVycworICAgICAgICB2 b2lkIGhhbmRsZUV4cHIKKyAgICAgICAgICAgICAgICAoICAgQXNzZXJ0aW9uSW5mbyBjb25zdCYg aW5mbywKKyAgICAgICAgICAgICAgICAgICAgSVRyYW5zaWVudEV4cHJlc3Npb24gY29uc3QmIGV4 cHIsCisgICAgICAgICAgICAgICAgICAgIEFzc2VydGlvblJlYWN0aW9uJiByZWFjdGlvbiApIG92 ZXJyaWRlOworICAgICAgICB2b2lkIGhhbmRsZU1lc3NhZ2UKKyAgICAgICAgICAgICAgICAoICAg QXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2Fz OjpPZlR5cGUgcmVzdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIGNvbnN0 JiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25SZWFjdGlvbiYgcmVhY3Rp b24gKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uTm90 VGhyb3duCisgICAgICAgICAgICAgICAgKCAgIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sCisg ICAgICAgICAgICAgICAgICAgIEFzc2VydGlvblJlYWN0aW9uJiByZWFjdGlvbiApIG92ZXJyaWRl OworICAgICAgICB2b2lkIGhhbmRsZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2VwdGlvbgorICAgICAg ICAgICAgICAgICggICBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLAorICAgICAgICAgICAgICAg ICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgQXNz ZXJ0aW9uUmVhY3Rpb24mIHJlYWN0aW9uICkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgaGFuZGxl SW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICggICBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZv ICkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgaGFuZGxlTm9uRXhwcgorICAgICAgICAgICAgICAg ICggICBBc3NlcnRpb25JbmZvIGNvbnN0ICZpbmZvLAorICAgICAgICAgICAgICAgICAgICBSZXN1 bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25S ZWFjdGlvbiAmcmVhY3Rpb24gKSBvdmVycmlkZTsKKworICAgICAgICBib29sIHNlY3Rpb25TdGFy dGVkKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8sIENvdW50cyYgYXNzZXJ0aW9ucyAp IG92ZXJyaWRlOworCisgICAgICAgIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uRW5kSW5mbyBj b25zdCYgZW5kSW5mbyApIG92ZXJyaWRlOworICAgICAgICB2b2lkIHNlY3Rpb25FbmRlZEVhcmx5 KCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApIG92ZXJyaWRlOworCisgICAgICAgIGF1 dG8gYWNxdWlyZUdlbmVyYXRvclRyYWNrZXIoIFN0cmluZ1JlZiBnZW5lcmF0b3JOYW1lLCBTb3Vy Y2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSAtPiBJR2VuZXJhdG9yVHJhY2tlciYgb3ZlcnJp ZGU7CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HKQorICAg ICAgICB2b2lkIGJlbmNobWFya1ByZXBhcmluZyggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSBv dmVycmlkZTsKKyAgICAgICAgdm9pZCBiZW5jaG1hcmtTdGFydGluZyggQmVuY2htYXJrSW5mbyBj b25zdCYgaW5mbyApIG92ZXJyaWRlOworICAgICAgICB2b2lkIGJlbmNobWFya0VuZGVkKCBCZW5j aG1hcmtTdGF0czw+IGNvbnN0JiBzdGF0cyApIG92ZXJyaWRlOworICAgICAgICB2b2lkIGJlbmNo bWFya0ZhaWxlZCggc3RkOjpzdHJpbmcgY29uc3QmIGVycm9yICkgb3ZlcnJpZGU7CisjZW5kaWYg Ly8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcKKworICAgICAgICB2b2lkIHB1c2hT Y29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApIG92ZXJyaWRlOworICAg ICAgICB2b2lkIHBvcFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkg b3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCBlbXBsYWNlVW5zY29wZWRNZXNzYWdlKCBNZXNzYWdl QnVpbGRlciBjb25zdCYgYnVpbGRlciApIG92ZXJyaWRlOworCisgICAgICAgIHN0ZDo6c3RyaW5n IGdldEN1cnJlbnRUZXN0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIGNvbnN0IEFz c2VydGlvblJlc3VsdCogZ2V0TGFzdFJlc3VsdCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAg IHZvaWQgZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpIG92ZXJyaWRlOworCisgICAgICAgIHZvaWQg aGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggU3RyaW5nUmVmIG1lc3NhZ2UgKSBvdmVycmlkZTsK KworICAgICAgICBib29sIGxhc3RBc3NlcnRpb25QYXNzZWQoKSBvdmVycmlkZTsKKworICAgICAg ICB2b2lkIGFzc2VydGlvblBhc3NlZCgpIG92ZXJyaWRlOworCisgICAgcHVibGljOgorICAgICAg ICAvLyAhVEJEIFdlIG5lZWQgdG8gZG8gdGhpcyBhbm90aGVyIHdheSEKKyAgICAgICAgYm9vbCBh Ym9ydGluZygpIGNvbnN0IGZpbmFsOworCisgICAgcHJpdmF0ZToKKworICAgICAgICB2b2lkIHJ1 bkN1cnJlbnRUZXN0KCBzdGQ6OnN0cmluZyYgcmVkaXJlY3RlZENvdXQsIHN0ZDo6c3RyaW5nJiBy ZWRpcmVjdGVkQ2VyciApOworICAgICAgICB2b2lkIGludm9rZUFjdGl2ZVRlc3RDYXNlKCk7CisK KyAgICAgICAgdm9pZCByZXNldEFzc2VydGlvbkluZm8oKTsKKyAgICAgICAgYm9vbCB0ZXN0Rm9y TWlzc2luZ0Fzc2VydGlvbnMoIENvdW50cyYgYXNzZXJ0aW9ucyApOworCisgICAgICAgIHZvaWQg YXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICk7CisgICAgICAg IHZvaWQgcmVwb3J0RXhwcgorICAgICAgICAgICAgICAgICggICBBc3NlcnRpb25JbmZvIGNvbnN0 ICZpbmZvLAorICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBl LAorICAgICAgICAgICAgICAgICAgICBJVHJhbnNpZW50RXhwcmVzc2lvbiBjb25zdCAqZXhwciwK KyAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWdhdGVkICk7CisKKyAgICAgICAgdm9pZCBwb3B1 bGF0ZVJlYWN0aW9uKCBBc3NlcnRpb25SZWFjdGlvbiYgcmVhY3Rpb24gKTsKKworICAgIHByaXZh dGU6CisKKyAgICAgICAgdm9pZCBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKTsKKworICAgICAg ICBUZXN0UnVuSW5mbyBtX3J1bkluZm87CisgICAgICAgIElNdXRhYmxlQ29udGV4dCYgbV9jb250 ZXh0OworICAgICAgICBUZXN0Q2FzZSBjb25zdCogbV9hY3RpdmVUZXN0Q2FzZSA9IG51bGxwdHI7 CisgICAgICAgIElUcmFja2VyKiBtX3Rlc3RDYXNlVHJhY2tlciA9IG51bGxwdHI7CisgICAgICAg IE9wdGlvbjxBc3NlcnRpb25SZXN1bHQ+IG1fbGFzdFJlc3VsdDsKKworICAgICAgICBJQ29uZmln UHRyIG1fY29uZmlnOworICAgICAgICBUb3RhbHMgbV90b3RhbHM7CisgICAgICAgIElTdHJlYW1p bmdSZXBvcnRlclB0ciBtX3JlcG9ydGVyOworICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5m bz4gbV9tZXNzYWdlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2NvcGVkTWVzc2FnZT4gbV9tZXNz YWdlU2NvcGVzOyAvKiBLZWVwcyBvd25lcnMgb2Ygc28tY2FsbGVkIHVuc2NvcGVkIG1lc3NhZ2Vz LiAqLworICAgICAgICBBc3NlcnRpb25JbmZvIG1fbGFzdEFzc2VydGlvbkluZm87CisgICAgICAg IHN0ZDo6dmVjdG9yPFNlY3Rpb25FbmRJbmZvPiBtX3VuZmluaXNoZWRTZWN0aW9uczsKKyAgICAg ICAgc3RkOjp2ZWN0b3I8SVRyYWNrZXIqPiBtX2FjdGl2ZVNlY3Rpb25zOworICAgICAgICBUcmFj a2VyQ29udGV4dCBtX3RyYWNrZXJDb250ZXh0OworICAgICAgICBGYXRhbENvbmRpdGlvbkhhbmRs ZXIgbV9mYXRhbENvbmRpdGlvbmhhbmRsZXI7CisgICAgICAgIGJvb2wgbV9sYXN0QXNzZXJ0aW9u UGFzc2VkID0gZmFsc2U7CisgICAgICAgIGJvb2wgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkID0g dHJ1ZTsKKyAgICAgICAgYm9vbCBtX2luY2x1ZGVTdWNjZXNzZnVsUmVzdWx0czsKKyAgICB9Owor CisgICAgdm9pZCBzZWVkUm5nKElDb25maWcgY29uc3QmIGNvbmZpZyk7CisgICAgdW5zaWduZWQg aW50IHJuZ1NlZWQoKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hf cnVuX2NvbnRleHQuaAorbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAg ICAgIGF1dG8gb3BlcmF0b3IgPDwoIHN0ZDo6b3N0cmVhbSYgb3MsIElUcmFuc2llbnRFeHByZXNz aW9uIGNvbnN0JiBleHByICkgLT4gc3RkOjpvc3RyZWFtJiB7CisgICAgICAgICAgICBleHByLnN0 cmVhbVJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCBvcyApOworICAgICAgICAgICAgcmV0dXJuIG9z OworICAgICAgICB9CisgICAgfQorCisgICAgTGF6eUV4cHJlc3Npb246OkxhenlFeHByZXNzaW9u KCBib29sIGlzTmVnYXRlZCApCisgICAgOiAgIG1faXNOZWdhdGVkKCBpc05lZ2F0ZWQgKQorICAg IHt9CisKKyAgICBMYXp5RXhwcmVzc2lvbjo6TGF6eUV4cHJlc3Npb24oIExhenlFeHByZXNzaW9u IGNvbnN0JiBvdGhlciApIDogbV9pc05lZ2F0ZWQoIG90aGVyLm1faXNOZWdhdGVkICkge30KKwor ICAgIExhenlFeHByZXNzaW9uOjpvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1 cm4gbV90cmFuc2llbnRFeHByZXNzaW9uICE9IG51bGxwdHI7CisgICAgfQorCisgICAgYXV0byBv cGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIExhenlFeHByZXNzaW9uIGNvbnN0JiBsYXp5 RXhwciApIC0+IHN0ZDo6b3N0cmVhbSYgeworICAgICAgICBpZiggbGF6eUV4cHIubV9pc05lZ2F0 ZWQgKQorICAgICAgICAgICAgb3MgPDwgIiEiOworCisgICAgICAgIGlmKCBsYXp5RXhwciApIHsK KyAgICAgICAgICAgIGlmKCBsYXp5RXhwci5tX2lzTmVnYXRlZCAmJiBsYXp5RXhwci5tX3RyYW5z aWVudEV4cHJlc3Npb24tPmlzQmluYXJ5RXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgICAgICBv cyA8PCAiKCIgPDwgKmxhenlFeHByLm1fdHJhbnNpZW50RXhwcmVzc2lvbiA8PCAiKSI7CisgICAg ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3MgPDwgKmxhenlFeHByLm1fdHJhbnNpZW50 RXhwcmVzc2lvbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG9zIDw8 ICJ7KiogZXJyb3IgLSB1bmNoZWNrZWQgZW1wdHkgZXhwcmVzc2lvbiByZXF1ZXN0ZWQgKip9IjsK KyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgQXNzZXJ0aW9uSGFu ZGxlcjo6QXNzZXJ0aW9uSGFuZGxlcgorICAgICAgICAoICAgU3RyaW5nUmVmIGNvbnN0JiBtYWNy b05hbWUsCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAg ICAgICAgICBTdHJpbmdSZWYgY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgUmVzdWx0 RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uICkKKyAgICA6ICAgbV9hc3NlcnRp b25JbmZveyBtYWNyb05hbWUsIGxpbmVJbmZvLCBjYXB0dXJlZEV4cHJlc3Npb24sIHJlc3VsdERp c3Bvc2l0aW9uIH0sCisgICAgICAgIG1fcmVzdWx0Q2FwdHVyZSggZ2V0UmVzdWx0Q2FwdHVyZSgp ICkKKyAgICB7fQorCisgICAgdm9pZCBBc3NlcnRpb25IYW5kbGVyOjpoYW5kbGVFeHByKCBJVHJh bnNpZW50RXhwcmVzc2lvbiBjb25zdCYgZXhwciApIHsKKyAgICAgICAgbV9yZXN1bHRDYXB0dXJl LmhhbmRsZUV4cHIoIG1fYXNzZXJ0aW9uSW5mbywgZXhwciwgbV9yZWFjdGlvbiApOworICAgIH0K KyAgICB2b2lkIEFzc2VydGlvbkhhbmRsZXI6OmhhbmRsZU1lc3NhZ2UoUmVzdWx0V2FzOjpPZlR5 cGUgcmVzdWx0VHlwZSwgU3RyaW5nUmVmIGNvbnN0JiBtZXNzYWdlKSB7CisgICAgICAgIG1fcmVz dWx0Q2FwdHVyZS5oYW5kbGVNZXNzYWdlKCBtX2Fzc2VydGlvbkluZm8sIHJlc3VsdFR5cGUsIG1l c3NhZ2UsIG1fcmVhY3Rpb24gKTsKKyAgICB9CisKKyAgICBhdXRvIEFzc2VydGlvbkhhbmRsZXI6 OmFsbG93VGhyb3dzKCkgY29uc3QgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiBnZXRDdXJyZW50 Q29udGV4dCgpLmdldENvbmZpZygpLT5hbGxvd1Rocm93cygpOworICAgIH0KKworICAgIHZvaWQg QXNzZXJ0aW9uSGFuZGxlcjo6Y29tcGxldGUoKSB7CisgICAgICAgIHNldENvbXBsZXRlZCgpOwor ICAgICAgICBpZiggbV9yZWFjdGlvbi5zaG91bGREZWJ1Z0JyZWFrICkgeworCisgICAgICAgICAg ICAvLyBJZiB5b3UgZmluZCB5b3VyIGRlYnVnZ2VyIHN0b3BwaW5nIHlvdSBoZXJlIHRoZW4gZ28g b25lIGxldmVsIHVwIG9uIHRoZQorICAgICAgICAgICAgLy8gY2FsbC1zdGFjayBmb3IgdGhlIGNv ZGUgdGhhdCBjYXVzZWQgaXQgKHR5cGljYWxseSBhIGZhaWxlZCBhc3NlcnRpb24pCisKKyAgICAg ICAgICAgIC8vIChUbyBnbyBiYWNrIHRvIHRoZSB0ZXN0IGFuZCBjaGFuZ2UgZXhlY3V0aW9uLCBq dW1wIG92ZXIgdGhlIHRocm93LCBuZXh0KQorICAgICAgICAgICAgQ0FUQ0hfQlJFQUtfSU5UT19E RUJVR0dFUigpOworICAgICAgICB9CisgICAgICAgIGlmIChtX3JlYWN0aW9uLnNob3VsZFRocm93 KSB7CisjaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfRVhDRVBUSU9OUykKKyAgICAg ICAgICAgIHRocm93IENhdGNoOjpUZXN0RmFpbHVyZUV4Y2VwdGlvbigpOworI2Vsc2UKKyAgICAg ICAgICAgIENBVENIX0VSUk9SKCAiVGVzdCBmYWlsdXJlIHJlcXVpcmVzIGFib3J0aW5nIHRlc3Qh IiApOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBBc3NlcnRpb25IYW5kbGVy OjpzZXRDb21wbGV0ZWQoKSB7CisgICAgICAgIG1fY29tcGxldGVkID0gdHJ1ZTsKKyAgICB9CisK KyAgICB2b2lkIEFzc2VydGlvbkhhbmRsZXI6OmhhbmRsZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2Vw dGlvbigpIHsKKyAgICAgICAgbV9yZXN1bHRDYXB0dXJlLmhhbmRsZVVuZXhwZWN0ZWRJbmZsaWdo dEV4Y2VwdGlvbiggbV9hc3NlcnRpb25JbmZvLCBDYXRjaDo6dHJhbnNsYXRlQWN0aXZlRXhjZXB0 aW9uKCksIG1fcmVhY3Rpb24gKTsKKyAgICB9CisKKyAgICB2b2lkIEFzc2VydGlvbkhhbmRsZXI6 OmhhbmRsZUV4Y2VwdGlvblRocm93bkFzRXhwZWN0ZWQoKSB7CisgICAgICAgIG1fcmVzdWx0Q2Fw dHVyZS5oYW5kbGVOb25FeHByKG1fYXNzZXJ0aW9uSW5mbywgUmVzdWx0V2FzOjpPaywgbV9yZWFj dGlvbik7CisgICAgfQorICAgIHZvaWQgQXNzZXJ0aW9uSGFuZGxlcjo6aGFuZGxlRXhjZXB0aW9u Tm90VGhyb3duQXNFeHBlY3RlZCgpIHsKKyAgICAgICAgbV9yZXN1bHRDYXB0dXJlLmhhbmRsZU5v bkV4cHIobV9hc3NlcnRpb25JbmZvLCBSZXN1bHRXYXM6Ok9rLCBtX3JlYWN0aW9uKTsKKyAgICB9 CisKKyAgICB2b2lkIEFzc2VydGlvbkhhbmRsZXI6OmhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb25O b3RUaHJvd24oKSB7CisgICAgICAgIG1fcmVzdWx0Q2FwdHVyZS5oYW5kbGVVbmV4cGVjdGVkRXhj ZXB0aW9uTm90VGhyb3duKCBtX2Fzc2VydGlvbkluZm8sIG1fcmVhY3Rpb24gKTsKKyAgICB9CisK KyAgICB2b2lkIEFzc2VydGlvbkhhbmRsZXI6OmhhbmRsZVRocm93aW5nQ2FsbFNraXBwZWQoKSB7 CisgICAgICAgIG1fcmVzdWx0Q2FwdHVyZS5oYW5kbGVOb25FeHByKG1fYXNzZXJ0aW9uSW5mbywg UmVzdWx0V2FzOjpPaywgbV9yZWFjdGlvbik7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB0aGUg b3ZlcmxvYWQgdGhhdCB0YWtlcyBhIHN0cmluZyBhbmQgaW5mZXJzIHRoZSBFcXVhbHMgbWF0Y2hl ciBmcm9tIGl0CisgICAgLy8gVGhlIG1vcmUgZ2VuZXJhbCBvdmVybG9hZCwgdGhhdCB0YWtlcyBh bnkgc3RyaW5nIG1hdGNoZXIsIGlzIGluIGNhdGNoX2NhcHR1cmVfbWF0Y2hlcnMuY3BwCisgICAg dm9pZCBoYW5kbGVFeGNlcHRpb25NYXRjaEV4cHIoIEFzc2VydGlvbkhhbmRsZXImIGhhbmRsZXIs IHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIFN0cmluZ1JlZiBjb25zdCYgbWF0Y2hlclN0cmluZyAg KSB7CisgICAgICAgIGhhbmRsZUV4Y2VwdGlvbk1hdGNoRXhwciggaGFuZGxlciwgTWF0Y2hlcnM6 OkVxdWFscyggc3RyICksIG1hdGNoZXJTdHJpbmcgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNl IENhdGNoCisvLyBlbmQgY2F0Y2hfYXNzZXJ0aW9uaGFuZGxlci5jcHAKKy8vIHN0YXJ0IGNhdGNo X2Fzc2VydGlvbnJlc3VsdC5jcHAKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBBc3NlcnRpb25S ZXN1bHREYXRhOjpBc3NlcnRpb25SZXN1bHREYXRhKFJlc3VsdFdhczo6T2ZUeXBlIF9yZXN1bHRU eXBlLCBMYXp5RXhwcmVzc2lvbiBjb25zdCAmIF9sYXp5RXhwcmVzc2lvbik6CisgICAgICAgIGxh enlFeHByZXNzaW9uKF9sYXp5RXhwcmVzc2lvbiksCisgICAgICAgIHJlc3VsdFR5cGUoX3Jlc3Vs dFR5cGUpIHt9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHREYXRhOjpyZWNvbnN0 cnVjdEV4cHJlc3Npb24oKSBjb25zdCB7CisKKyAgICAgICAgaWYoIHJlY29uc3RydWN0ZWRFeHBy ZXNzaW9uLmVtcHR5KCkgKSB7CisgICAgICAgICAgICBpZiggbGF6eUV4cHJlc3Npb24gKSB7Cisg ICAgICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAgICAgICAgICAgICAg IHJzcyA8PCBsYXp5RXhwcmVzc2lvbjsKKyAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkRXhw cmVzc2lvbiA9IHJzcy5zdHIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBy ZXR1cm4gcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb247CisgICAgfQorCisgICAgQXNzZXJ0aW9uUmVz dWx0OjpBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sIEFzc2VydGlv blJlc3VsdERhdGEgY29uc3QmIGRhdGEgKQorICAgIDogICBtX2luZm8oIGluZm8gKSwKKyAgICAg ICAgbV9yZXN1bHREYXRhKCBkYXRhICkKKyAgICB7fQorCisgICAgLy8gUmVzdWx0IHdhcyBhIHN1 Y2Nlc3MKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6c3VjY2VlZGVkKCkgY29uc3QgeworICAg ICAgICByZXR1cm4gQ2F0Y2g6OmlzT2soIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlICk7CisgICAg fQorCisgICAgLy8gUmVzdWx0IHdhcyBhIHN1Y2Nlc3MsIG9yIGZhaWx1cmUgaXMgc3VwcHJlc3Nl ZAorICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0Ojppc09rKCkgY29uc3QgeworICAgICAgICByZXR1 cm4gQ2F0Y2g6OmlzT2soIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlICkgfHwgc2hvdWxkU3VwcHJl c3NGYWlsdXJlKCBtX2luZm8ucmVzdWx0RGlzcG9zaXRpb24gKTsKKyAgICB9CisKKyAgICBSZXN1 bHRXYXM6Ok9mVHlwZSBBc3NlcnRpb25SZXN1bHQ6OmdldFJlc3VsdFR5cGUoKSBjb25zdCB7Cisg ICAgICAgIHJldHVybiBtX3Jlc3VsdERhdGEucmVzdWx0VHlwZTsKKyAgICB9CisKKyAgICBib29s IEFzc2VydGlvblJlc3VsdDo6aGFzRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJu ICFtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uLmVtcHR5KCk7CisgICAgfQorCisgICAgYm9vbCBB c3NlcnRpb25SZXN1bHQ6Omhhc01lc3NhZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhbV9y ZXN1bHREYXRhLm1lc3NhZ2UuZW1wdHkoKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3Nl cnRpb25SZXN1bHQ6OmdldEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIC8vIFBvc3NpYmx5 IG92ZXJhbGxvY2F0aW5nIGJ5IDMgY2hhcmFjdGVycyBzaG91bGQgYmUgYmFzaWNhbGx5IGZyZWUK KyAgICAgICAgc3RkOjpzdHJpbmcgZXhwcjsgZXhwci5yZXNlcnZlKG1faW5mby5jYXB0dXJlZEV4 cHJlc3Npb24uc2l6ZSgpICsgMyk7CisgICAgICAgIGlmIChpc0ZhbHNlVGVzdChtX2luZm8ucmVz dWx0RGlzcG9zaXRpb24pKSB7CisgICAgICAgICAgICBleHByICs9ICIhKCI7CisgICAgICAgIH0K KyAgICAgICAgZXhwciArPSBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgICAgICBpZiAo aXNGYWxzZVRlc3QobV9pbmZvLnJlc3VsdERpc3Bvc2l0aW9uKSkgeworICAgICAgICAgICAgZXhw ciArPSAnKSc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4cHI7CisgICAgfQorCisgICAg c3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHByZXNzaW9uSW5NYWNybygpIGNvbnN0 IHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXhwcjsKKyAgICAgICAgaWYoIG1faW5mby5tYWNyb05h bWUuZW1wdHkoKSApCisgICAgICAgICAgICBleHByID0gc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc+ KG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg IGV4cHIucmVzZXJ2ZSggbV9pbmZvLm1hY3JvTmFtZS5zaXplKCkgKyBtX2luZm8uY2FwdHVyZWRF eHByZXNzaW9uLnNpemUoKSArIDQgKTsKKyAgICAgICAgICAgIGV4cHIgKz0gbV9pbmZvLm1hY3Jv TmFtZTsKKyAgICAgICAgICAgIGV4cHIgKz0gIiggIjsKKyAgICAgICAgICAgIGV4cHIgKz0gbV9p bmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgICAgIGV4cHIgKz0gIiApIjsKKyAgICAg ICAgfQorICAgICAgICByZXR1cm4gZXhwcjsKKyAgICB9CisKKyAgICBib29sIEFzc2VydGlvblJl c3VsdDo6aGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaGFz RXhwcmVzc2lvbigpICYmIGdldEV4cGFuZGVkRXhwcmVzc2lvbigpICE9IGdldEV4cHJlc3Npb24o KTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldEV4cGFuZGVk RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXhwciA9IG1fcmVzdWx0 RGF0YS5yZWNvbnN0cnVjdEV4cHJlc3Npb24oKTsKKyAgICAgICAgcmV0dXJuIGV4cHIuZW1wdHko KQorICAgICAgICAgICAgICAgID8gZ2V0RXhwcmVzc2lvbigpCisgICAgICAgICAgICAgICAgOiBl eHByOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0TWVzc2Fn ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5tZXNzYWdlOworICAgIH0K KyAgICBTb3VyY2VMaW5lSW5mbyBBc3NlcnRpb25SZXN1bHQ6OmdldFNvdXJjZUluZm8oKSBjb25z dCB7CisgICAgICAgIHJldHVybiBtX2luZm8ubGluZUluZm87CisgICAgfQorCisgICAgU3RyaW5n UmVmIEFzc2VydGlvblJlc3VsdDo6Z2V0VGVzdE1hY3JvTmFtZSgpIGNvbnN0IHsKKyAgICAgICAg cmV0dXJuIG1faW5mby5tYWNyb05hbWU7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0 Y2gKKy8vIGVuZCBjYXRjaF9hc3NlcnRpb25yZXN1bHQuY3BwCisvLyBzdGFydCBjYXRjaF9jYXB0 dXJlX21hdGNoZXJzLmNwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdXNpbmcgU3RyaW5n TWF0Y2hlciA9IE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFzZTxzdGQ6OnN0cmluZz47CisKKyAg ICAvLyBUaGlzIGlzIHRoZSBnZW5lcmFsIG92ZXJsb2FkIHRoYXQgdGFrZXMgYSBhbnkgc3RyaW5n IG1hdGNoZXIKKyAgICAvLyBUaGVyZSBpcyBhbm90aGVyIG92ZXJsb2FkLCBpbiBjYXRjaF9hc3Nl cnRpb25oYW5kbGVyLmgvLmNwcCwgdGhhdCBvbmx5IHRha2VzIGEgc3RyaW5nIGFuZCBpbmZlcnMK KyAgICAvLyB0aGUgRXF1YWxzIG1hdGNoZXIgKHNvIHRoZSBoZWFkZXIgZG9lcyBub3QgbWVudGlv biBtYXRjaGVycykKKyAgICB2b2lkIGhhbmRsZUV4Y2VwdGlvbk1hdGNoRXhwciggQXNzZXJ0aW9u SGFuZGxlciYgaGFuZGxlciwgU3RyaW5nTWF0Y2hlciBjb25zdCYgbWF0Y2hlciwgU3RyaW5nUmVm IGNvbnN0JiBtYXRjaGVyU3RyaW5nICApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXhjZXB0aW9u TWVzc2FnZSA9IENhdGNoOjp0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgTWF0 Y2hFeHByPHN0ZDo6c3RyaW5nLCBTdHJpbmdNYXRjaGVyIGNvbnN0Jj4gZXhwciggZXhjZXB0aW9u TWVzc2FnZSwgbWF0Y2hlciwgbWF0Y2hlclN0cmluZyApOworICAgICAgICBoYW5kbGVyLmhhbmRs ZUV4cHIoIGV4cHIgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisvLyBlbmQgY2F0 Y2hfY2FwdHVyZV9tYXRjaGVycy5jcHAKKy8vIHN0YXJ0IGNhdGNoX2NvbW1hbmRsaW5lLmNwcAor CisvLyBzdGFydCBjYXRjaF9jb21tYW5kbGluZS5oCisKKy8vIHN0YXJ0IGNhdGNoX2NsYXJhLmgK KworLy8gVXNlIENhdGNoJ3MgdmFsdWUgZm9yIGNvbnNvbGUgd2lkdGggKHN0b3JlIENsYXJhJ3Mg b2ZmIHRvIHRoZSBzaWRlLCBpZiBwcmVzZW50KQorI2lmZGVmIENMQVJBX0NPTkZJR19DT05TT0xF X1dJRFRICisjZGVmaW5lIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0FU Q0hfQ0xBUkFfVEVYVEZMT1dfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyN1bmRlZiBDQVRDSF9DTEFS QV9URVhURkxPV19DT05GSUdfQ09OU09MRV9XSURUSAorI2VuZGlmCisjZGVmaW5lIENBVENIX0NM QVJBX1RFWFRGTE9XX0NPTkZJR19DT05TT0xFX1dJRFRIIENBVENIX0NPTkZJR19DT05TT0xFX1dJ RFRILTEKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gK KyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3dlYWstdnRhYmxlcyIKKyNwcmFn bWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2V4aXQtdGltZS1kZXN0cnVjdG9ycyIKKyNw cmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3NoYWRvdyIKKyNlbmRpZgorCisvLyBz dGFydCBjbGFyYS5ocHAKKy8vIENvcHlyaWdodCAyMDE3IFR3byBCbHVlIEN1YmVzIEx0ZC4gQWxs IHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29m dHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCisvLyBmaWxlIExJ Q0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8w LnR4dCkKKy8vCisvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3BoaWxzcXVhcmVkL0NsYXJhIGZv ciBtb3JlIGRldGFpbHMKKworLy8gQ2xhcmEgdjEuMS41CisKKworI2lmbmRlZiBDQVRDSF9DTEFS QV9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDQVRDSF9DTEFSQV9DT05GSUdfQ09OU09M RV9XSURUSCA4MAorI2VuZGlmCisKKyNpZm5kZWYgQ0FUQ0hfQ0xBUkFfVEVYVEZMT1dfQ09ORklH X0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0FUQ0hfQ0xBUkFfVEVYVEZMT1dfQ09ORklHX0NPTlNP TEVfV0lEVEggQ0FUQ0hfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNlbmRpZgorCisjaWZu ZGVmIENMQVJBX0NPTkZJR19PUFRJT05BTF9UWVBFCisjaWZkZWYgX19oYXNfaW5jbHVkZQorI2lm IF9faGFzX2luY2x1ZGUoPG9wdGlvbmFsPikgJiYgX19jcGx1c3BsdXMgPj0gMjAxNzAzTAorI2lu Y2x1ZGUgPG9wdGlvbmFsPgorI2RlZmluZSBDTEFSQV9DT05GSUdfT1BUSU9OQUxfVFlQRSBzdGQ6 Om9wdGlvbmFsCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tICNpbmNs dWRlZCBmcm9tIGNsYXJhX3RleHRmbG93LmhwcCAtLS0tLS0tLS0tLQorCisvLyBUZXh0Rmxvd0Nw cAorLy8KKy8vIEEgc2luZ2xlLWhlYWRlciBsaWJyYXJ5IGZvciB3cmFwcGluZyBhbmQgbGF5aW5n IG91dCBiYXNpYyB0ZXh0LCBieSBQaGlsIE5hc2gKKy8vCisvLyBEaXN0cmlidXRlZCB1bmRlciB0 aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5n CisvLyBmaWxlIExJQ0VOU0UudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElD RU5TRV8xXzAudHh0KQorLy8KKy8vIFRoaXMgcHJvamVjdCBpcyBob3N0ZWQgYXQgaHR0cHM6Ly9n aXRodWIuY29tL3BoaWxzcXVhcmVkL3RleHRmbG93Y3BwCisKKworI2luY2x1ZGUgPGNhc3NlcnQ+ CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rv cj4KKworI2lmbmRlZiBDQVRDSF9DTEFSQV9URVhURkxPV19DT05GSUdfQ09OU09MRV9XSURUSAor I2RlZmluZSBDQVRDSF9DTEFSQV9URVhURkxPV19DT05GSUdfQ09OU09MRV9XSURUSCA4MAorI2Vu ZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgY2xhcmEgeworbmFtZXNwYWNlIFRl eHRGbG93IHsKKworaW5saW5lIGF1dG8gaXNXaGl0ZXNwYWNlKGNoYXIgYykgLT4gYm9vbCB7CisJ c3RhdGljIHN0ZDo6c3RyaW5nIGNoYXJzID0gIiBcdFxuXHIiOworCXJldHVybiBjaGFycy5maW5k KGMpICE9IHN0ZDo6c3RyaW5nOjpucG9zOworfQoraW5saW5lIGF1dG8gaXNCcmVha2FibGVCZWZv cmUoY2hhciBjKSAtPiBib29sIHsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgY2hhcnMgPSAiWyh7PHwi OworCXJldHVybiBjaGFycy5maW5kKGMpICE9IHN0ZDo6c3RyaW5nOjpucG9zOworfQoraW5saW5l IGF1dG8gaXNCcmVha2FibGVBZnRlcihjaGFyIGMpIC0+IGJvb2wgeworCXN0YXRpYyBzdGQ6OnN0 cmluZyBjaGFycyA9ICJdKX0+Liw6OyorLT0mL1xcIjsKKwlyZXR1cm4gY2hhcnMuZmluZChjKSAh PSBzdGQ6OnN0cmluZzo6bnBvczsKK30KKworY2xhc3MgQ29sdW1uczsKKworY2xhc3MgQ29sdW1u IHsKKwlzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9zdHJpbmdzOworCXNpemVfdCBtX3dpZHRo ID0gQ0FUQ0hfQ0xBUkFfVEVYVEZMT1dfQ09ORklHX0NPTlNPTEVfV0lEVEg7CisJc2l6ZV90IG1f aW5kZW50ID0gMDsKKwlzaXplX3QgbV9pbml0aWFsSW5kZW50ID0gc3RkOjpzdHJpbmc6Om5wb3M7 CisKK3B1YmxpYzoKKwljbGFzcyBpdGVyYXRvciB7CisJCWZyaWVuZCBDb2x1bW47CisKKwkJQ29s dW1uIGNvbnN0JiBtX2NvbHVtbjsKKwkJc2l6ZV90IG1fc3RyaW5nSW5kZXggPSAwOworCQlzaXpl X3QgbV9wb3MgPSAwOworCisJCXNpemVfdCBtX2xlbiA9IDA7CisJCXNpemVfdCBtX2VuZCA9IDA7 CisJCWJvb2wgbV9zdWZmaXggPSBmYWxzZTsKKworCQlpdGVyYXRvcihDb2x1bW4gY29uc3QmIGNv bHVtbiwgc2l6ZV90IHN0cmluZ0luZGV4KQorCQkJOiBtX2NvbHVtbihjb2x1bW4pLAorCQkJbV9z dHJpbmdJbmRleChzdHJpbmdJbmRleCkge30KKworCQlhdXRvIGxpbmUoKSBjb25zdCAtPiBzdGQ6 OnN0cmluZyBjb25zdCYgeyByZXR1cm4gbV9jb2x1bW4ubV9zdHJpbmdzW21fc3RyaW5nSW5kZXhd OyB9CisKKwkJYXV0byBpc0JvdW5kYXJ5KHNpemVfdCBhdCkgY29uc3QgLT4gYm9vbCB7CisJCQlh c3NlcnQoYXQgPiAwKTsKKwkJCWFzc2VydChhdCA8PSBsaW5lKCkuc2l6ZSgpKTsKKworCQkJcmV0 dXJuIGF0ID09IGxpbmUoKS5zaXplKCkgfHwKKwkJCQkoaXNXaGl0ZXNwYWNlKGxpbmUoKVthdF0p ICYmICFpc1doaXRlc3BhY2UobGluZSgpW2F0IC0gMV0pKSB8fAorCQkJCWlzQnJlYWthYmxlQmVm b3JlKGxpbmUoKVthdF0pIHx8CisJCQkJaXNCcmVha2FibGVBZnRlcihsaW5lKClbYXQgLSAxXSk7 CisJCX0KKworCQl2b2lkIGNhbGNMZW5ndGgoKSB7CisJCQlhc3NlcnQobV9zdHJpbmdJbmRleCA8 IG1fY29sdW1uLm1fc3RyaW5ncy5zaXplKCkpOworCisJCQltX3N1ZmZpeCA9IGZhbHNlOworCQkJ YXV0byB3aWR0aCA9IG1fY29sdW1uLm1fd2lkdGggLSBpbmRlbnQoKTsKKwkJCW1fZW5kID0gbV9w b3M7CisJCQlpZiAobGluZSgpW21fcG9zXSA9PSAnXG4nKSB7CisJCQkJKyttX2VuZDsKKwkJCX0K KwkJCXdoaWxlIChtX2VuZCA8IGxpbmUoKS5zaXplKCkgJiYgbGluZSgpW21fZW5kXSAhPSAnXG4n KQorCQkJCSsrbV9lbmQ7CisKKwkJCWlmIChtX2VuZCA8IG1fcG9zICsgd2lkdGgpIHsKKwkJCQlt X2xlbiA9IG1fZW5kIC0gbV9wb3M7CisJCQl9IGVsc2UgeworCQkJCXNpemVfdCBsZW4gPSB3aWR0 aDsKKwkJCQl3aGlsZSAobGVuID4gMCAmJiAhaXNCb3VuZGFyeShtX3BvcyArIGxlbikpCisJCQkJ CS0tbGVuOworCQkJCXdoaWxlIChsZW4gPiAwICYmIGlzV2hpdGVzcGFjZShsaW5lKClbbV9wb3Mg KyBsZW4gLSAxXSkpCisJCQkJCS0tbGVuOworCisJCQkJaWYgKGxlbiA+IDApIHsKKwkJCQkJbV9s ZW4gPSBsZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJbV9zdWZmaXggPSB0cnVlOworCQkJCQltX2xl biA9IHdpZHRoIC0gMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlhdXRvIGluZGVudCgpIGNvbnN0 IC0+IHNpemVfdCB7CisJCQlhdXRvIGluaXRpYWwgPSBtX3BvcyA9PSAwICYmIG1fc3RyaW5nSW5k ZXggPT0gMCA/IG1fY29sdW1uLm1faW5pdGlhbEluZGVudCA6IHN0ZDo6c3RyaW5nOjpucG9zOwor CQkJcmV0dXJuIGluaXRpYWwgPT0gc3RkOjpzdHJpbmc6Om5wb3MgPyBtX2NvbHVtbi5tX2luZGVu dCA6IGluaXRpYWw7CisJCX0KKworCQlhdXRvIGFkZEluZGVudEFuZFN1ZmZpeChzdGQ6OnN0cmlu ZyBjb25zdCAmcGxhaW4pIGNvbnN0IC0+IHN0ZDo6c3RyaW5nIHsKKwkJCXJldHVybiBzdGQ6OnN0 cmluZyhpbmRlbnQoKSwgJyAnKSArIChtX3N1ZmZpeCA/IHBsYWluICsgIi0iIDogcGxhaW4pOwor CQl9CisKKwlwdWJsaWM6CisJCXVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHN0ZDo6cHRyZGlmZl90 OworCQl1c2luZyB2YWx1ZV90eXBlID0gc3RkOjpzdHJpbmc7CisJCXVzaW5nIHBvaW50ZXIgPSB2 YWx1ZV90eXBlICogOworCQl1c2luZyByZWZlcmVuY2UgPSB2YWx1ZV90eXBlICYgOworCQl1c2lu ZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisKKwkJZXhw bGljaXQgaXRlcmF0b3IoQ29sdW1uIGNvbnN0JiBjb2x1bW4pIDogbV9jb2x1bW4oY29sdW1uKSB7 CisJCQlhc3NlcnQobV9jb2x1bW4ubV93aWR0aCA+IG1fY29sdW1uLm1faW5kZW50KTsKKwkJCWFz c2VydChtX2NvbHVtbi5tX2luaXRpYWxJbmRlbnQgPT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwgbV9j b2x1bW4ubV93aWR0aCA+IG1fY29sdW1uLm1faW5pdGlhbEluZGVudCk7CisJCQljYWxjTGVuZ3Ro KCk7CisJCQlpZiAobV9sZW4gPT0gMCkKKwkJCQltX3N0cmluZ0luZGV4Kys7IC8vIEVtcHR5IHN0 cmluZworCQl9CisKKwkJYXV0byBvcGVyYXRvciAqKCkgY29uc3QgLT4gc3RkOjpzdHJpbmcgewor CQkJYXNzZXJ0KG1fc3RyaW5nSW5kZXggPCBtX2NvbHVtbi5tX3N0cmluZ3Muc2l6ZSgpKTsKKwkJ CWFzc2VydChtX3BvcyA8PSBtX2VuZCk7CisJCQlyZXR1cm4gYWRkSW5kZW50QW5kU3VmZml4KGxp bmUoKS5zdWJzdHIobV9wb3MsIG1fbGVuKSk7CisJCX0KKworCQlhdXRvIG9wZXJhdG9yICsrKCkg LT4gaXRlcmF0b3ImIHsKKwkJCW1fcG9zICs9IG1fbGVuOworCQkJaWYgKG1fcG9zIDwgbGluZSgp LnNpemUoKSAmJiBsaW5lKClbbV9wb3NdID09ICdcbicpCisJCQkJbV9wb3MgKz0gMTsKKwkJCWVs c2UKKwkJCQl3aGlsZSAobV9wb3MgPCBsaW5lKCkuc2l6ZSgpICYmIGlzV2hpdGVzcGFjZShsaW5l KClbbV9wb3NdKSkKKwkJCQkJKyttX3BvczsKKworCQkJaWYgKG1fcG9zID09IGxpbmUoKS5zaXpl KCkpIHsKKwkJCQltX3BvcyA9IDA7CisJCQkJKyttX3N0cmluZ0luZGV4OworCQkJfQorCQkJaWYg KG1fc3RyaW5nSW5kZXggPCBtX2NvbHVtbi5tX3N0cmluZ3Muc2l6ZSgpKQorCQkJCWNhbGNMZW5n dGgoKTsKKwkJCXJldHVybiAqdGhpczsKKwkJfQorCQlhdXRvIG9wZXJhdG9yICsrKGludCkgLT4g aXRlcmF0b3IgeworCQkJaXRlcmF0b3IgcHJldigqdGhpcyk7CisJCQlvcGVyYXRvcisrKCk7CisJ CQlyZXR1cm4gcHJldjsKKwkJfQorCisJCWF1dG8gb3BlcmF0b3IgPT0oaXRlcmF0b3IgY29uc3Qm IG90aGVyKSBjb25zdCAtPiBib29sIHsKKwkJCXJldHVybgorCQkJCW1fcG9zID09IG90aGVyLm1f cG9zICYmCisJCQkJbV9zdHJpbmdJbmRleCA9PSBvdGhlci5tX3N0cmluZ0luZGV4ICYmCisJCQkJ Jm1fY29sdW1uID09ICZvdGhlci5tX2NvbHVtbjsKKwkJfQorCQlhdXRvIG9wZXJhdG9yICE9KGl0 ZXJhdG9yIGNvbnN0JiBvdGhlcikgY29uc3QgLT4gYm9vbCB7CisJCQlyZXR1cm4gIW9wZXJhdG9y PT0ob3RoZXIpOworCQl9CisJfTsKKwl1c2luZyBjb25zdF9pdGVyYXRvciA9IGl0ZXJhdG9yOwor CisJZXhwbGljaXQgQ29sdW1uKHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0KSB7IG1fc3RyaW5ncy5w dXNoX2JhY2sodGV4dCk7IH0KKworCWF1dG8gd2lkdGgoc2l6ZV90IG5ld1dpZHRoKSAtPiBDb2x1 bW4mIHsKKwkJYXNzZXJ0KG5ld1dpZHRoID4gMCk7CisJCW1fd2lkdGggPSBuZXdXaWR0aDsKKwkJ cmV0dXJuICp0aGlzOworCX0KKwlhdXRvIGluZGVudChzaXplX3QgbmV3SW5kZW50KSAtPiBDb2x1 bW4mIHsKKwkJbV9pbmRlbnQgPSBuZXdJbmRlbnQ7CisJCXJldHVybiAqdGhpczsKKwl9CisJYXV0 byBpbml0aWFsSW5kZW50KHNpemVfdCBuZXdJbmRlbnQpIC0+IENvbHVtbiYgeworCQltX2luaXRp YWxJbmRlbnQgPSBuZXdJbmRlbnQ7CisJCXJldHVybiAqdGhpczsKKwl9CisKKwlhdXRvIHdpZHRo KCkgY29uc3QgLT4gc2l6ZV90IHsgcmV0dXJuIG1fd2lkdGg7IH0KKwlhdXRvIGJlZ2luKCkgY29u c3QgLT4gaXRlcmF0b3IgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMpOyB9CisJYXV0byBlbmQoKSBj b25zdCAtPiBpdGVyYXRvciB7IHJldHVybiB7ICp0aGlzLCBtX3N0cmluZ3Muc2l6ZSgpIH07IH0K KworCWlubGluZSBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFt JiBvcywgQ29sdW1uIGNvbnN0JiBjb2wpIHsKKwkJYm9vbCBmaXJzdCA9IHRydWU7CisJCWZvciAo YXV0byBsaW5lIDogY29sKSB7CisJCQlpZiAoZmlyc3QpCisJCQkJZmlyc3QgPSBmYWxzZTsKKwkJ CWVsc2UKKwkJCQlvcyA8PCAiXG4iOworCQkJb3MgPDwgbGluZTsKKwkJfQorCQlyZXR1cm4gb3M7 CisJfQorCisJYXV0byBvcGVyYXRvciArIChDb2x1bW4gY29uc3QmIG90aGVyKS0+Q29sdW1uczsK KworCWF1dG8gdG9TdHJpbmcoKSBjb25zdCAtPiBzdGQ6OnN0cmluZyB7CisJCXN0ZDo6b3N0cmlu Z3N0cmVhbSBvc3M7CisJCW9zcyA8PCAqdGhpczsKKwkJcmV0dXJuIG9zcy5zdHIoKTsKKwl9Cit9 OworCitjbGFzcyBTcGFjZXIgOiBwdWJsaWMgQ29sdW1uIHsKKworcHVibGljOgorCWV4cGxpY2l0 IFNwYWNlcihzaXplX3Qgc3BhY2VXaWR0aCkgOiBDb2x1bW4oIiIpIHsKKwkJd2lkdGgoc3BhY2VX aWR0aCk7CisJfQorfTsKKworY2xhc3MgQ29sdW1ucyB7CisJc3RkOjp2ZWN0b3I8Q29sdW1uPiBt X2NvbHVtbnM7CisKK3B1YmxpYzoKKworCWNsYXNzIGl0ZXJhdG9yIHsKKwkJZnJpZW5kIENvbHVt bnM7CisJCXN0cnVjdCBFbmRUYWcge307CisKKwkJc3RkOjp2ZWN0b3I8Q29sdW1uPiBjb25zdCYg bV9jb2x1bW5zOworCQlzdGQ6OnZlY3RvcjxDb2x1bW46Oml0ZXJhdG9yPiBtX2l0ZXJhdG9yczsK KwkJc2l6ZV90IG1fYWN0aXZlSXRlcmF0b3JzOworCisJCWl0ZXJhdG9yKENvbHVtbnMgY29uc3Qm IGNvbHVtbnMsIEVuZFRhZykKKwkJCTogbV9jb2x1bW5zKGNvbHVtbnMubV9jb2x1bW5zKSwKKwkJ CW1fYWN0aXZlSXRlcmF0b3JzKDApIHsKKwkJCW1faXRlcmF0b3JzLnJlc2VydmUobV9jb2x1bW5z LnNpemUoKSk7CisKKwkJCWZvciAoYXV0byBjb25zdCYgY29sIDogbV9jb2x1bW5zKQorCQkJCW1f aXRlcmF0b3JzLnB1c2hfYmFjayhjb2wuZW5kKCkpOworCQl9CisKKwlwdWJsaWM6CisJCXVzaW5n IGRpZmZlcmVuY2VfdHlwZSA9IHN0ZDo6cHRyZGlmZl90OworCQl1c2luZyB2YWx1ZV90eXBlID0g c3RkOjpzdHJpbmc7CisJCXVzaW5nIHBvaW50ZXIgPSB2YWx1ZV90eXBlICogOworCQl1c2luZyBy ZWZlcmVuY2UgPSB2YWx1ZV90eXBlICYgOworCQl1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0 ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisKKwkJZXhwbGljaXQgaXRlcmF0b3IoQ29sdW1ucyBj b25zdCYgY29sdW1ucykKKwkJCTogbV9jb2x1bW5zKGNvbHVtbnMubV9jb2x1bW5zKSwKKwkJCW1f YWN0aXZlSXRlcmF0b3JzKG1fY29sdW1ucy5zaXplKCkpIHsKKwkJCW1faXRlcmF0b3JzLnJlc2Vy dmUobV9jb2x1bW5zLnNpemUoKSk7CisKKwkJCWZvciAoYXV0byBjb25zdCYgY29sIDogbV9jb2x1 bW5zKQorCQkJCW1faXRlcmF0b3JzLnB1c2hfYmFjayhjb2wuYmVnaW4oKSk7CisJCX0KKworCQlh dXRvIG9wZXJhdG9yID09KGl0ZXJhdG9yIGNvbnN0JiBvdGhlcikgY29uc3QgLT4gYm9vbCB7CisJ CQlyZXR1cm4gbV9pdGVyYXRvcnMgPT0gb3RoZXIubV9pdGVyYXRvcnM7CisJCX0KKwkJYXV0byBv cGVyYXRvciAhPShpdGVyYXRvciBjb25zdCYgb3RoZXIpIGNvbnN0IC0+IGJvb2wgeworCQkJcmV0 dXJuIG1faXRlcmF0b3JzICE9IG90aGVyLm1faXRlcmF0b3JzOworCQl9CisJCWF1dG8gb3BlcmF0 b3IgKigpIGNvbnN0IC0+IHN0ZDo6c3RyaW5nIHsKKwkJCXN0ZDo6c3RyaW5nIHJvdywgcGFkZGlu ZzsKKworCQkJZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2NvbHVtbnMuc2l6ZSgpOyArK2kpIHsK KwkJCQlhdXRvIHdpZHRoID0gbV9jb2x1bW5zW2ldLndpZHRoKCk7CisJCQkJaWYgKG1faXRlcmF0 b3JzW2ldICE9IG1fY29sdW1uc1tpXS5lbmQoKSkgeworCQkJCQlzdGQ6OnN0cmluZyBjb2wgPSAq bV9pdGVyYXRvcnNbaV07CisJCQkJCXJvdyArPSBwYWRkaW5nICsgY29sOworCQkJCQlpZiAoY29s LnNpemUoKSA8IHdpZHRoKQorCQkJCQkJcGFkZGluZyA9IHN0ZDo6c3RyaW5nKHdpZHRoIC0gY29s LnNpemUoKSwgJyAnKTsKKwkJCQkJZWxzZQorCQkJCQkJcGFkZGluZyA9ICIiOworCQkJCX0gZWxz ZSB7CisJCQkJCXBhZGRpbmcgKz0gc3RkOjpzdHJpbmcod2lkdGgsICcgJyk7CisJCQkJfQorCQkJ fQorCQkJcmV0dXJuIHJvdzsKKwkJfQorCQlhdXRvIG9wZXJhdG9yICsrKCkgLT4gaXRlcmF0b3Im IHsKKwkJCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jb2x1bW5zLnNpemUoKTsgKytpKSB7CisJ CQkJaWYgKG1faXRlcmF0b3JzW2ldICE9IG1fY29sdW1uc1tpXS5lbmQoKSkKKwkJCQkJKyttX2l0 ZXJhdG9yc1tpXTsKKwkJCX0KKwkJCXJldHVybiAqdGhpczsKKwkJfQorCQlhdXRvIG9wZXJhdG9y ICsrKGludCkgLT4gaXRlcmF0b3IgeworCQkJaXRlcmF0b3IgcHJldigqdGhpcyk7CisJCQlvcGVy YXRvcisrKCk7CisJCQlyZXR1cm4gcHJldjsKKwkJfQorCX07CisJdXNpbmcgY29uc3RfaXRlcmF0 b3IgPSBpdGVyYXRvcjsKKworCWF1dG8gYmVnaW4oKSBjb25zdCAtPiBpdGVyYXRvciB7IHJldHVy biBpdGVyYXRvcigqdGhpcyk7IH0KKwlhdXRvIGVuZCgpIGNvbnN0IC0+IGl0ZXJhdG9yIHsgcmV0 dXJuIHsgKnRoaXMsIGl0ZXJhdG9yOjpFbmRUYWcoKSB9OyB9CisKKwlhdXRvIG9wZXJhdG9yICs9 IChDb2x1bW4gY29uc3QmIGNvbCkgLT4gQ29sdW1ucyYgeworCQltX2NvbHVtbnMucHVzaF9iYWNr KGNvbCk7CisJCXJldHVybiAqdGhpczsKKwl9CisJYXV0byBvcGVyYXRvciArIChDb2x1bW4gY29u c3QmIGNvbCkgLT4gQ29sdW1ucyB7CisJCUNvbHVtbnMgY29tYmluZWQgPSAqdGhpczsKKwkJY29t YmluZWQgKz0gY29sOworCQlyZXR1cm4gY29tYmluZWQ7CisJfQorCisJaW5saW5lIGZyaWVuZCBz dGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mIG9zLCBDb2x1bW5zIGNvbnN0 JiBjb2xzKSB7CisKKwkJYm9vbCBmaXJzdCA9IHRydWU7CisJCWZvciAoYXV0byBsaW5lIDogY29s cykgeworCQkJaWYgKGZpcnN0KQorCQkJCWZpcnN0ID0gZmFsc2U7CisJCQllbHNlCisJCQkJb3Mg PDwgIlxuIjsKKwkJCW9zIDw8IGxpbmU7CisJCX0KKwkJcmV0dXJuIG9zOworCX0KKworCWF1dG8g dG9TdHJpbmcoKSBjb25zdCAtPiBzdGQ6OnN0cmluZyB7CisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBv c3M7CisJCW9zcyA8PCAqdGhpczsKKwkJcmV0dXJuIG9zcy5zdHIoKTsKKwl9Cit9OworCitpbmxp bmUgYXV0byBDb2x1bW46Om9wZXJhdG9yICsgKENvbHVtbiBjb25zdCYgb3RoZXIpIC0+IENvbHVt bnMgeworCUNvbHVtbnMgY29sczsKKwljb2xzICs9ICp0aGlzOworCWNvbHMgKz0gb3RoZXI7CisJ cmV0dXJuIGNvbHM7Cit9Cit9CisKK30KK30KKworLy8gLS0tLS0tLS0tLS0gZW5kIG9mICNpbmNs dWRlIGZyb20gY2xhcmFfdGV4dGZsb3cuaHBwIC0tLS0tLS0tLS0tCisvLyAuLi4uLi4uLi4uLiBi YWNrIGluIGNsYXJhLmhwcAorCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPHN0cmluZz4K KyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4K KworI2lmICFkZWZpbmVkKENBVENIX1BMQVRGT1JNX1dJTkRPV1MpICYmICggZGVmaW5lZChXSU4z MikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9N U0NfVkVSKSApCisjZGVmaW5lIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyNlbmRpZgorCituYW1l c3BhY2UgQ2F0Y2ggeyBuYW1lc3BhY2UgY2xhcmEgeworbmFtZXNwYWNlIGRldGFpbCB7CisKKyAg ICAvLyBUcmFpdHMgZm9yIGV4dHJhY3RpbmcgYXJnIGFuZCByZXR1cm4gdHlwZSBvZiBsYW1iZGFz IChmb3Igc2luZ2xlIGFyZ3VtZW50IGxhbWJkYXMpCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTD4K KyAgICBzdHJ1Y3QgVW5hcnlMYW1iZGFUcmFpdHMgOiBVbmFyeUxhbWJkYVRyYWl0czxkZWNsdHlw ZSggJkw6Om9wZXJhdG9yKCkgKT4ge307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDbGFzc1Qs IHR5cGVuYW1lIFJldHVyblQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgc3RydWN0IFVuYXJ5TGFt YmRhVHJhaXRzPFJldHVyblQoIENsYXNzVDo6KiApKCBBcmdzLi4uICkgY29uc3Q+IHsKKyAgICAg ICAgc3RhdGljIGNvbnN0IGJvb2wgaXNWYWxpZCA9IGZhbHNlOworICAgIH07CisKKyAgICB0ZW1w bGF0ZTx0eXBlbmFtZSBDbGFzc1QsIHR5cGVuYW1lIFJldHVyblQsIHR5cGVuYW1lIEFyZ1Q+Cisg ICAgc3RydWN0IFVuYXJ5TGFtYmRhVHJhaXRzPFJldHVyblQoIENsYXNzVDo6KiApKCBBcmdUICkg Y29uc3Q+IHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNWYWxpZCA9IHRydWU7CisgICAg ICAgIHVzaW5nIEFyZ1R5cGUgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBz dGQ6OnJlbW92ZV9yZWZlcmVuY2U8QXJnVD46OnR5cGU+Ojp0eXBlOworICAgICAgICB1c2luZyBS ZXR1cm5UeXBlID0gUmV0dXJuVDsKKyAgICB9OworCisgICAgY2xhc3MgVG9rZW5TdHJlYW07CisK KyAgICAvLyBUcmFuc3BvcnQgZm9yIHJhdyBhcmdzIChjb3BpZWQgZnJvbSBtYWluIGFyZ3MsIG9y IHN1cHBsaWVkIHZpYSBpbml0IGxpc3QgZm9yIHRlc3RpbmcpCisgICAgY2xhc3MgQXJncyB7Cisg ICAgICAgIGZyaWVuZCBUb2tlblN0cmVhbTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9leGVOYW1l OworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9hcmdzOworCisgICAgcHVibGlj OgorICAgICAgICBBcmdzKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGFyZ3YgKQorICAg ICAgICAgICAgOiBtX2V4ZU5hbWUoYXJndlswXSksCisgICAgICAgICAgICAgIG1fYXJncyhhcmd2 ICsgMSwgYXJndiArIGFyZ2MpIHt9CisKKyAgICAgICAgQXJncyggc3RkOjppbml0aWFsaXplcl9s aXN0PHN0ZDo6c3RyaW5nPiBhcmdzICkKKyAgICAgICAgOiAgIG1fZXhlTmFtZSggKmFyZ3MuYmVn aW4oKSApLAorICAgICAgICAgICAgbV9hcmdzKCBhcmdzLmJlZ2luKCkrMSwgYXJncy5lbmQoKSAp CisgICAgICAgIHt9CisKKyAgICAgICAgYXV0byBleGVOYW1lKCkgY29uc3QgLT4gc3RkOjpzdHJp bmcgeworICAgICAgICAgICAgcmV0dXJuIG1fZXhlTmFtZTsKKyAgICAgICAgfQorICAgIH07CisK KyAgICAvLyBXcmFwcyBhIHRva2VuIGNvbWluZyBmcm9tIGEgdG9rZW4gc3RyZWFtLiBUaGVzZSBt YXkgbm90IGRpcmVjdGx5IGNvcnJlc3BvbmQgdG8gc3RyaW5ncyBhcyBhIHNpbmdsZSBzdHJpbmcK KyAgICAvLyBtYXkgZW5jb2RlIGFuIG9wdGlvbiArIGl0cyBhcmd1bWVudCBpZiB0aGUgOiBvciA9 IGZvcm0gaXMgdXNlZAorICAgIGVudW0gY2xhc3MgVG9rZW5UeXBlIHsKKyAgICAgICAgT3B0aW9u LCBBcmd1bWVudAorICAgIH07CisgICAgc3RydWN0IFRva2VuIHsKKyAgICAgICAgVG9rZW5UeXBl IHR5cGU7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRva2VuOworICAgIH07CisKKyAgICBpbmxpbmUg YXV0byBpc09wdFByZWZpeCggY2hhciBjICkgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiBjID09 ICctJworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyAgICAgICAgICAgIHx8IGMgPT0g Jy8nCisjZW5kaWYKKyAgICAgICAgOworICAgIH0KKworICAgIC8vIEFic3RyYWN0cyBpdGVyYXRv cnMgaW50byBhcmdzIGFzIGEgc3RyZWFtIG9mIHRva2Vucywgd2l0aCBvcHRpb24gYXJndW1lbnRz IHVuaWZvcm1seSBoYW5kbGVkCisgICAgY2xhc3MgVG9rZW5TdHJlYW0geworICAgICAgICB1c2lu ZyBJdGVyYXRvciA9IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3I7Cisg ICAgICAgIEl0ZXJhdG9yIGl0OworICAgICAgICBJdGVyYXRvciBpdEVuZDsKKyAgICAgICAgc3Rk Ojp2ZWN0b3I8VG9rZW4+IG1fdG9rZW5CdWZmZXI7CisKKyAgICAgICAgdm9pZCBsb2FkQnVmZmVy KCkgeworICAgICAgICAgICAgbV90b2tlbkJ1ZmZlci5yZXNpemUoIDAgKTsKKworICAgICAgICAg ICAgLy8gU2tpcCBhbnkgZW1wdHkgc3RyaW5ncworICAgICAgICAgICAgd2hpbGUoIGl0ICE9IGl0 RW5kICYmIGl0LT5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICArK2l0OworCisgICAgICAgICAg ICBpZiggaXQgIT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgYXV0byBjb25zdCAmbmV4dCA9 ICppdDsKKyAgICAgICAgICAgICAgICBpZiggaXNPcHRQcmVmaXgoIG5leHRbMF0gKSApIHsKKyAg ICAgICAgICAgICAgICAgICAgYXV0byBkZWxpbWl0ZXJQb3MgPSBuZXh0LmZpbmRfZmlyc3Rfb2Yo ICIgOj0iICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBkZWxpbWl0ZXJQb3MgIT0gc3RkOjpz dHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3Rva2VuQnVmZmVyLnB1 c2hfYmFjayggeyBUb2tlblR5cGU6Ok9wdGlvbiwgbmV4dC5zdWJzdHIoIDAsIGRlbGltaXRlclBv cyApIH0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdG9rZW5CdWZmZXIucHVzaF9iYWNr KCB7IFRva2VuVHlwZTo6QXJndW1lbnQsIG5leHQuc3Vic3RyKCBkZWxpbWl0ZXJQb3MgKyAxICkg fSApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAg ICAgaWYoIG5leHRbMV0gIT0gJy0nICYmIG5leHQuc2l6ZSgpID4gMiApIHsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcHQgPSAiLSAiOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGZvciggc2l6ZV90IGkgPSAxOyBpIDwgbmV4dC5zaXplKCk7ICsraSApIHsK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0WzFdID0gbmV4dFtpXTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90b2tlbkJ1ZmZlci5wdXNoX2JhY2soIHsgVG9r ZW5UeXBlOjpPcHRpb24sIG9wdCB9ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICBtX3Rva2VuQnVmZmVyLnB1c2hfYmFjayggeyBUb2tlblR5cGU6Ok9wdGlvbiwgbmV4dCB9 ICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtX3Rva2VuQnVmZmVy LnB1c2hfYmFjayggeyBUb2tlblR5cGU6OkFyZ3VtZW50LCBuZXh0IH0gKTsKKyAgICAgICAgICAg ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgICAg ZXhwbGljaXQgVG9rZW5TdHJlYW0oIEFyZ3MgY29uc3QgJmFyZ3MgKSA6IFRva2VuU3RyZWFtKCBh cmdzLm1fYXJncy5iZWdpbigpLCBhcmdzLm1fYXJncy5lbmQoKSApIHt9CisKKyAgICAgICAgVG9r ZW5TdHJlYW0oIEl0ZXJhdG9yIGl0LCBJdGVyYXRvciBpdEVuZCApIDogaXQoIGl0ICksIGl0RW5k KCBpdEVuZCApIHsKKyAgICAgICAgICAgIGxvYWRCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAg ICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4g IW1fdG9rZW5CdWZmZXIuZW1wdHkoKSB8fCBpdCAhPSBpdEVuZDsKKyAgICAgICAgfQorCisgICAg ICAgIGF1dG8gY291bnQoKSBjb25zdCAtPiBzaXplX3QgeyByZXR1cm4gbV90b2tlbkJ1ZmZlci5z aXplKCkgKyAoaXRFbmQgLSBpdCk7IH0KKworICAgICAgICBhdXRvIG9wZXJhdG9yKigpIGNvbnN0 IC0+IFRva2VuIHsKKyAgICAgICAgICAgIGFzc2VydCggIW1fdG9rZW5CdWZmZXIuZW1wdHkoKSAp OworICAgICAgICAgICAgcmV0dXJuIG1fdG9rZW5CdWZmZXIuZnJvbnQoKTsKKyAgICAgICAgfQor CisgICAgICAgIGF1dG8gb3BlcmF0b3ItPigpIGNvbnN0IC0+IFRva2VuIGNvbnN0ICogeworICAg ICAgICAgICAgYXNzZXJ0KCAhbV90b2tlbkJ1ZmZlci5lbXB0eSgpICk7CisgICAgICAgICAgICBy ZXR1cm4gJm1fdG9rZW5CdWZmZXIuZnJvbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8g b3BlcmF0b3IrKygpIC0+IFRva2VuU3RyZWFtICYgeworICAgICAgICAgICAgaWYoIG1fdG9rZW5C dWZmZXIuc2l6ZSgpID49IDIgKSB7CisgICAgICAgICAgICAgICAgbV90b2tlbkJ1ZmZlci5lcmFz ZSggbV90b2tlbkJ1ZmZlci5iZWdpbigpICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg ICAgICAgICAgIGlmKCBpdCAhPSBpdEVuZCApCisgICAgICAgICAgICAgICAgICAgICsraXQ7Cisg ICAgICAgICAgICAgICAgbG9hZEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg cmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIFJlc3VsdEJhc2Ug eworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBUeXBlIHsKKyAgICAgICAgICAgIE9rLCBMb2dp Y0Vycm9yLCBSdW50aW1lRXJyb3IKKyAgICAgICAgfTsKKworICAgIHByb3RlY3RlZDoKKyAgICAg ICAgUmVzdWx0QmFzZSggVHlwZSB0eXBlICkgOiBtX3R5cGUoIHR5cGUgKSB7fQorICAgICAgICB2 aXJ0dWFsIH5SZXN1bHRCYXNlKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZpcnR1YWwgdm9pZCBl bmZvcmNlT2soKSBjb25zdCA9IDA7CisKKyAgICAgICAgVHlwZSBtX3R5cGU7CisgICAgfTsKKwor ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgUmVzdWx0VmFsdWVCYXNlIDogcHVi bGljIFJlc3VsdEJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgYXV0byB2YWx1ZSgpIGNvbnN0 IC0+IFQgY29uc3QgJiB7CisgICAgICAgICAgICBlbmZvcmNlT2soKTsKKyAgICAgICAgICAgIHJl dHVybiBtX3ZhbHVlOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIFJlc3Vs dFZhbHVlQmFzZSggVHlwZSB0eXBlICkgOiBSZXN1bHRCYXNlKCB0eXBlICkge30KKworICAgICAg ICBSZXN1bHRWYWx1ZUJhc2UoIFJlc3VsdFZhbHVlQmFzZSBjb25zdCAmb3RoZXIgKSA6IFJlc3Vs dEJhc2UoIG90aGVyICkgeworICAgICAgICAgICAgaWYoIG1fdHlwZSA9PSBSZXN1bHRCYXNlOjpP ayApCisgICAgICAgICAgICAgICAgbmV3KCAmbV92YWx1ZSApIFQoIG90aGVyLm1fdmFsdWUgKTsK KyAgICAgICAgfQorCisgICAgICAgIFJlc3VsdFZhbHVlQmFzZSggVHlwZSwgVCBjb25zdCAmdmFs dWUgKSA6IFJlc3VsdEJhc2UoIE9rICkgeworICAgICAgICAgICAgbmV3KCAmbV92YWx1ZSApIFQo IHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIG9wZXJhdG9yPSggUmVzdWx0VmFs dWVCYXNlIGNvbnN0ICZvdGhlciApIC0+IFJlc3VsdFZhbHVlQmFzZSAmIHsKKyAgICAgICAgICAg IGlmKCBtX3R5cGUgPT0gUmVzdWx0QmFzZTo6T2sgKQorICAgICAgICAgICAgICAgIG1fdmFsdWUu flQoKTsKKyAgICAgICAgICAgIFJlc3VsdEJhc2U6Om9wZXJhdG9yPShvdGhlcik7CisgICAgICAg ICAgICBpZiggbV90eXBlID09IFJlc3VsdEJhc2U6Ok9rICkKKyAgICAgICAgICAgICAgICBuZXco ICZtX3ZhbHVlICkgVCggb3RoZXIubV92YWx1ZSApOworICAgICAgICAgICAgcmV0dXJuICp0aGlz OworICAgICAgICB9CisKKyAgICAgICAgflJlc3VsdFZhbHVlQmFzZSgpIG92ZXJyaWRlIHsKKyAg ICAgICAgICAgIGlmKCBtX3R5cGUgPT0gT2sgKQorICAgICAgICAgICAgICAgIG1fdmFsdWUuflQo KTsKKyAgICAgICAgfQorCisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIFQgbV92YWx1ZTsK KyAgICAgICAgfTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8PgorICAgIGNsYXNzIFJlc3VsdFZh bHVlQmFzZTx2b2lkPiA6IHB1YmxpYyBSZXN1bHRCYXNlIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAg ICAgIHVzaW5nIFJlc3VsdEJhc2U6OlJlc3VsdEJhc2U7CisgICAgfTsKKworICAgIHRlbXBsYXRl PHR5cGVuYW1lIFQgPSB2b2lkPgorICAgIGNsYXNzIEJhc2ljUmVzdWx0IDogcHVibGljIFJlc3Vs dFZhbHVlQmFzZTxUPiB7CisgICAgcHVibGljOgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBV PgorICAgICAgICBleHBsaWNpdCBCYXNpY1Jlc3VsdCggQmFzaWNSZXN1bHQ8VT4gY29uc3QgJm90 aGVyICkKKyAgICAgICAgOiAgIFJlc3VsdFZhbHVlQmFzZTxUPiggb3RoZXIudHlwZSgpICksCisg ICAgICAgICAgICBtX2Vycm9yTWVzc2FnZSggb3RoZXIuZXJyb3JNZXNzYWdlKCkgKQorICAgICAg ICB7CisgICAgICAgICAgICBhc3NlcnQoIHR5cGUoKSAhPSBSZXN1bHRCYXNlOjpPayApOworICAg ICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICAgICAgc3RhdGljIGF1 dG8gb2soIFUgY29uc3QgJnZhbHVlICkgLT4gQmFzaWNSZXN1bHQgeyByZXR1cm4geyBSZXN1bHRC YXNlOjpPaywgdmFsdWUgfTsgfQorICAgICAgICBzdGF0aWMgYXV0byBvaygpIC0+IEJhc2ljUmVz dWx0IHsgcmV0dXJuIHsgUmVzdWx0QmFzZTo6T2sgfTsgfQorICAgICAgICBzdGF0aWMgYXV0byBs b2dpY0Vycm9yKCBzdGQ6OnN0cmluZyBjb25zdCAmbWVzc2FnZSApIC0+IEJhc2ljUmVzdWx0IHsg cmV0dXJuIHsgUmVzdWx0QmFzZTo6TG9naWNFcnJvciwgbWVzc2FnZSB9OyB9CisgICAgICAgIHN0 YXRpYyBhdXRvIHJ1bnRpbWVFcnJvciggc3RkOjpzdHJpbmcgY29uc3QgJm1lc3NhZ2UgKSAtPiBC YXNpY1Jlc3VsdCB7IHJldHVybiB7IFJlc3VsdEJhc2U6OlJ1bnRpbWVFcnJvciwgbWVzc2FnZSB9 OyB9CisKKyAgICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1f dHlwZSA9PSBSZXN1bHRCYXNlOjpPazsgfQorICAgICAgICBhdXRvIHR5cGUoKSBjb25zdCAtPiBS ZXN1bHRCYXNlOjpUeXBlIHsgcmV0dXJuIG1fdHlwZTsgfQorICAgICAgICBhdXRvIGVycm9yTWVz c2FnZSgpIGNvbnN0IC0+IHN0ZDo6c3RyaW5nIHsgcmV0dXJuIG1fZXJyb3JNZXNzYWdlOyB9CisK KyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZvaWQgZW5mb3JjZU9rKCkgY29uc3Qgb3ZlcnJpZGUg eworCisgICAgICAgICAgICAvLyBFcnJvcnMgc2hvdWxkbid0IHJlYWNoIHRoaXMgcG9pbnQsIGJ1 dCBpZiB0aGV5IGRvCisgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIGVycm9yIG1lc3NhZ2Ugd2ls bCBiZSBpbiBtX2Vycm9yTWVzc2FnZQorICAgICAgICAgICAgYXNzZXJ0KCBtX3R5cGUgIT0gUmVz dWx0QmFzZTo6TG9naWNFcnJvciApOworICAgICAgICAgICAgYXNzZXJ0KCBtX3R5cGUgIT0gUmVz dWx0QmFzZTo6UnVudGltZUVycm9yICk7CisgICAgICAgICAgICBpZiggbV90eXBlICE9IFJlc3Vs dEJhc2U6Ok9rICkKKyAgICAgICAgICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICAgIH0KKwor ICAgICAgICBzdGQ6OnN0cmluZyBtX2Vycm9yTWVzc2FnZTsgLy8gT25seSBwb3B1bGF0ZWQgaWYg cmVzdWx0VHlwZSBpcyBhbiBlcnJvcgorCisgICAgICAgIEJhc2ljUmVzdWx0KCBSZXN1bHRCYXNl OjpUeXBlIHR5cGUsIHN0ZDo6c3RyaW5nIGNvbnN0ICZtZXNzYWdlICkKKyAgICAgICAgOiAgIFJl c3VsdFZhbHVlQmFzZTxUPih0eXBlKSwKKyAgICAgICAgICAgIG1fZXJyb3JNZXNzYWdlKG1lc3Nh Z2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCggbV90eXBlICE9IFJlc3VsdEJhc2U6 Ok9rICk7CisgICAgICAgIH0KKworICAgICAgICB1c2luZyBSZXN1bHRWYWx1ZUJhc2U8VD46OlJl c3VsdFZhbHVlQmFzZTsKKyAgICAgICAgdXNpbmcgUmVzdWx0QmFzZTo6bV90eXBlOworICAgIH07 CisKKyAgICBlbnVtIGNsYXNzIFBhcnNlUmVzdWx0VHlwZSB7CisgICAgICAgIE1hdGNoZWQsIE5v TWF0Y2gsIFNob3J0Q2lyY3VpdEFsbCwgU2hvcnRDaXJjdWl0U2FtZQorICAgIH07CisKKyAgICBj bGFzcyBQYXJzZVN0YXRlIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgUGFyc2VTdGF0ZSggUGFy c2VSZXN1bHRUeXBlIHR5cGUsIFRva2VuU3RyZWFtIGNvbnN0ICZyZW1haW5pbmdUb2tlbnMgKQor ICAgICAgICA6IG1fdHlwZSh0eXBlKSwKKyAgICAgICAgICBtX3JlbWFpbmluZ1Rva2VucyggcmVt YWluaW5nVG9rZW5zICkKKyAgICAgICAge30KKworICAgICAgICBhdXRvIHR5cGUoKSBjb25zdCAt PiBQYXJzZVJlc3VsdFR5cGUgeyByZXR1cm4gbV90eXBlOyB9CisgICAgICAgIGF1dG8gcmVtYWlu aW5nVG9rZW5zKCkgY29uc3QgLT4gVG9rZW5TdHJlYW0geyByZXR1cm4gbV9yZW1haW5pbmdUb2tl bnM7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFBhcnNlUmVzdWx0VHlwZSBtX3R5cGU7Cisg ICAgICAgIFRva2VuU3RyZWFtIG1fcmVtYWluaW5nVG9rZW5zOworICAgIH07CisKKyAgICB1c2lu ZyBSZXN1bHQgPSBCYXNpY1Jlc3VsdDx2b2lkPjsKKyAgICB1c2luZyBQYXJzZXJSZXN1bHQgPSBC YXNpY1Jlc3VsdDxQYXJzZVJlc3VsdFR5cGU+OworICAgIHVzaW5nIEludGVybmFsUGFyc2VSZXN1 bHQgPSBCYXNpY1Jlc3VsdDxQYXJzZVN0YXRlPjsKKworICAgIHN0cnVjdCBIZWxwQ29sdW1ucyB7 CisgICAgICAgIHN0ZDo6c3RyaW5nIGxlZnQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJpZ2h0Owor ICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBhdXRvIGNvbnZl cnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCAmc291cmNlLCBUJiB0YXJnZXQgKSAtPiBQYXJzZXJS ZXN1bHQgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgc3MgPDwgc291 cmNlOworICAgICAgICBzcyA+PiB0YXJnZXQ7CisgICAgICAgIGlmKCBzcy5mYWlsKCkgKQorICAg ICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6cnVudGltZUVycm9yKCAiVW5hYmxlIHRvIGNv bnZlcnQgJyIgKyBzb3VyY2UgKyAiJyB0byBkZXN0aW5hdGlvbiB0eXBlIiApOworICAgICAgICBl bHNlCisgICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0OjpvayggUGFyc2VSZXN1bHRUeXBl OjpNYXRjaGVkICk7CisgICAgfQorICAgIGlubGluZSBhdXRvIGNvbnZlcnRJbnRvKCBzdGQ6OnN0 cmluZyBjb25zdCAmc291cmNlLCBzdGQ6OnN0cmluZyYgdGFyZ2V0ICkgLT4gUGFyc2VyUmVzdWx0 IHsKKyAgICAgICAgdGFyZ2V0ID0gc291cmNlOworICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0 OjpvayggUGFyc2VSZXN1bHRUeXBlOjpNYXRjaGVkICk7CisgICAgfQorICAgIGlubGluZSBhdXRv IGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCAmc291cmNlLCBib29sICZ0YXJnZXQgKSAt PiBQYXJzZXJSZXN1bHQgeworICAgICAgICBzdGQ6OnN0cmluZyBzcmNMQyA9IHNvdXJjZTsKKyAg ICAgICAgc3RkOjp0cmFuc2Zvcm0oIHNyY0xDLmJlZ2luKCksIHNyY0xDLmVuZCgpLCBzcmNMQy5i ZWdpbigpLCBbXSggdW5zaWduZWQgY2hhciBjICkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4o IHN0ZDo6dG9sb3dlcihjKSApOyB9ICk7CisgICAgICAgIGlmIChzcmNMQyA9PSAieSIgfHwgc3Jj TEMgPT0gIjEiIHx8IHNyY0xDID09ICJ0cnVlIiB8fCBzcmNMQyA9PSAieWVzIiB8fCBzcmNMQyA9 PSAib24iKQorICAgICAgICAgICAgdGFyZ2V0ID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoc3Jj TEMgPT0gIm4iIHx8IHNyY0xDID09ICIwIiB8fCBzcmNMQyA9PSAiZmFsc2UiIHx8IHNyY0xDID09 ICJubyIgfHwgc3JjTEMgPT0gIm9mZiIpCisgICAgICAgICAgICB0YXJnZXQgPSBmYWxzZTsKKyAg ICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6cnVudGltZUVycm9y KCAiRXhwZWN0ZWQgYSBib29sZWFuIHZhbHVlIGJ1dCBkaWQgbm90IHJlY29nbmlzZTogJyIgKyBz b3VyY2UgKyAiJyIgKTsKKyAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6b2soIFBhcnNlUmVz dWx0VHlwZTo6TWF0Y2hlZCApOworICAgIH0KKyNpZmRlZiBDTEFSQV9DT05GSUdfT1BUSU9OQUxf VFlQRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIGF1dG8gY29udmVydElu dG8oIHN0ZDo6c3RyaW5nIGNvbnN0ICZzb3VyY2UsIENMQVJBX0NPTkZJR19PUFRJT05BTF9UWVBF PFQ+JiB0YXJnZXQgKSAtPiBQYXJzZXJSZXN1bHQgeworICAgICAgICBUIHRlbXA7CisgICAgICAg IGF1dG8gcmVzdWx0ID0gY29udmVydEludG8oIHNvdXJjZSwgdGVtcCApOworICAgICAgICBpZigg cmVzdWx0ICkKKyAgICAgICAgICAgIHRhcmdldCA9IHN0ZDo6bW92ZSh0ZW1wKTsKKyAgICAgICAg cmV0dXJuIHJlc3VsdDsKKyAgICB9CisjZW5kaWYgLy8gQ0xBUkFfQ09ORklHX09QVElPTkFMX1RZ UEUKKworICAgIHN0cnVjdCBOb25Db3B5YWJsZSB7CisgICAgICAgIE5vbkNvcHlhYmxlKCkgPSBk ZWZhdWx0OworICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgY29uc3QgJiApID0gZGVs ZXRlOworICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgJiYgKSA9IGRlbGV0ZTsKKyAg ICAgICAgTm9uQ29weWFibGUgJm9wZXJhdG9yPSggTm9uQ29weWFibGUgY29uc3QgJiApID0gZGVs ZXRlOworICAgICAgICBOb25Db3B5YWJsZSAmb3BlcmF0b3I9KCBOb25Db3B5YWJsZSAmJiApID0g ZGVsZXRlOworICAgIH07CisKKyAgICBzdHJ1Y3QgQm91bmRSZWYgOiBOb25Db3B5YWJsZSB7Cisg ICAgICAgIHZpcnR1YWwgfkJvdW5kUmVmKCkgPSBkZWZhdWx0OworICAgICAgICB2aXJ0dWFsIGF1 dG8gaXNDb250YWluZXIoKSBjb25zdCAtPiBib29sIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAg IHZpcnR1YWwgYXV0byBpc0ZsYWcoKSBjb25zdCAtPiBib29sIHsgcmV0dXJuIGZhbHNlOyB9Cisg ICAgfTsKKyAgICBzdHJ1Y3QgQm91bmRWYWx1ZVJlZkJhc2UgOiBCb3VuZFJlZiB7CisgICAgICAg IHZpcnR1YWwgYXV0byBzZXRWYWx1ZSggc3RkOjpzdHJpbmcgY29uc3QgJmFyZyApIC0+IFBhcnNl clJlc3VsdCA9IDA7CisgICAgfTsKKyAgICBzdHJ1Y3QgQm91bmRGbGFnUmVmQmFzZSA6IEJvdW5k UmVmIHsKKyAgICAgICAgdmlydHVhbCBhdXRvIHNldEZsYWcoIGJvb2wgZmxhZyApIC0+IFBhcnNl clJlc3VsdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYXV0byBpc0ZsYWcoKSBjb25zdCAtPiBib29s IHsgcmV0dXJuIHRydWU7IH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAg ICBzdHJ1Y3QgQm91bmRWYWx1ZVJlZiA6IEJvdW5kVmFsdWVSZWZCYXNlIHsKKyAgICAgICAgVCAm bV9yZWY7CisKKyAgICAgICAgZXhwbGljaXQgQm91bmRWYWx1ZVJlZiggVCAmcmVmICkgOiBtX3Jl ZiggcmVmICkge30KKworICAgICAgICBhdXRvIHNldFZhbHVlKCBzdGQ6OnN0cmluZyBjb25zdCAm YXJnICkgLT4gUGFyc2VyUmVzdWx0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBjb252 ZXJ0SW50byggYXJnLCBtX3JlZiApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRl PHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEJvdW5kVmFsdWVSZWY8c3RkOjp2ZWN0b3I8VD4+IDog Qm91bmRWYWx1ZVJlZkJhc2UgeworICAgICAgICBzdGQ6OnZlY3RvcjxUPiAmbV9yZWY7CisKKyAg ICAgICAgZXhwbGljaXQgQm91bmRWYWx1ZVJlZiggc3RkOjp2ZWN0b3I8VD4gJnJlZiApIDogbV9y ZWYoIHJlZiApIHt9CisKKyAgICAgICAgYXV0byBpc0NvbnRhaW5lcigpIGNvbnN0IC0+IGJvb2wg b3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIGF1dG8gc2V0VmFsdWUoIHN0ZDo6 c3RyaW5nIGNvbnN0ICZhcmcgKSAtPiBQYXJzZXJSZXN1bHQgb3ZlcnJpZGUgeworICAgICAgICAg ICAgVCB0ZW1wOworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0SW50byggYXJnLCB0 ZW1wICk7CisgICAgICAgICAgICBpZiggcmVzdWx0ICkKKyAgICAgICAgICAgICAgICBtX3JlZi5w dXNoX2JhY2soIHRlbXAgKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0K KyAgICB9OworCisgICAgc3RydWN0IEJvdW5kRmxhZ1JlZiA6IEJvdW5kRmxhZ1JlZkJhc2Ugewor ICAgICAgICBib29sICZtX3JlZjsKKworICAgICAgICBleHBsaWNpdCBCb3VuZEZsYWdSZWYoIGJv b2wgJnJlZiApIDogbV9yZWYoIHJlZiApIHt9CisKKyAgICAgICAgYXV0byBzZXRGbGFnKCBib29s IGZsYWcgKSAtPiBQYXJzZXJSZXN1bHQgb3ZlcnJpZGUgeworICAgICAgICAgICAgbV9yZWYgPSBm bGFnOworICAgICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6b2soIFBhcnNlUmVzdWx0VHlw ZTo6TWF0Y2hlZCApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1l IFJldHVyblR5cGU+CisgICAgc3RydWN0IExhbWJkYUludm9rZXIgeworICAgICAgICBzdGF0aWNf YXNzZXJ0KCBzdGQ6OmlzX3NhbWU8UmV0dXJuVHlwZSwgUGFyc2VyUmVzdWx0Pjo6dmFsdWUsICJM YW1iZGEgbXVzdCByZXR1cm4gdm9pZCBvciBjbGFyYTo6UGFyc2VyUmVzdWx0IiApOworCisgICAg ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEwsIHR5cGVuYW1lIEFyZ1R5cGU+CisgICAgICAgIHN0YXRp YyBhdXRvIGludm9rZSggTCBjb25zdCAmbGFtYmRhLCBBcmdUeXBlIGNvbnN0ICZhcmcgKSAtPiBQ YXJzZXJSZXN1bHQgeworICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSggYXJnICk7CisgICAgICAg IH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBMYW1iZGFJbnZva2VyPHZv aWQ+IHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTCwgdHlwZW5hbWUgQXJnVHlwZT4KKyAg ICAgICAgc3RhdGljIGF1dG8gaW52b2tlKCBMIGNvbnN0ICZsYW1iZGEsIEFyZ1R5cGUgY29uc3Qg JmFyZyApIC0+IFBhcnNlclJlc3VsdCB7CisgICAgICAgICAgICBsYW1iZGEoIGFyZyApOworICAg ICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6b2soIFBhcnNlUmVzdWx0VHlwZTo6TWF0Y2hl ZCApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGUs IHR5cGVuYW1lIEw+CisgICAgaW5saW5lIGF1dG8gaW52b2tlTGFtYmRhKCBMIGNvbnN0ICZsYW1i ZGEsIHN0ZDo6c3RyaW5nIGNvbnN0ICZhcmcgKSAtPiBQYXJzZXJSZXN1bHQgeworICAgICAgICBB cmdUeXBlIHRlbXB7fTsKKyAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0SW50byggYXJnLCB0 ZW1wICk7CisgICAgICAgIHJldHVybiAhcmVzdWx0CisgICAgICAgICAgID8gcmVzdWx0CisgICAg ICAgICAgIDogTGFtYmRhSW52b2tlcjx0eXBlbmFtZSBVbmFyeUxhbWJkYVRyYWl0czxMPjo6UmV0 dXJuVHlwZT46Omludm9rZSggbGFtYmRhLCB0ZW1wICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8 dHlwZW5hbWUgTD4KKyAgICBzdHJ1Y3QgQm91bmRMYW1iZGEgOiBCb3VuZFZhbHVlUmVmQmFzZSB7 CisgICAgICAgIEwgbV9sYW1iZGE7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydCggVW5hcnlMYW1i ZGFUcmFpdHM8TD46OmlzVmFsaWQsICJTdXBwbGllZCBsYW1iZGEgbXVzdCB0YWtlIGV4YWN0bHkg b25lIGFyZ3VtZW50IiApOworICAgICAgICBleHBsaWNpdCBCb3VuZExhbWJkYSggTCBjb25zdCAm bGFtYmRhICkgOiBtX2xhbWJkYSggbGFtYmRhICkge30KKworICAgICAgICBhdXRvIHNldFZhbHVl KCBzdGQ6OnN0cmluZyBjb25zdCAmYXJnICkgLT4gUGFyc2VyUmVzdWx0IG92ZXJyaWRlIHsKKyAg ICAgICAgICAgIHJldHVybiBpbnZva2VMYW1iZGE8dHlwZW5hbWUgVW5hcnlMYW1iZGFUcmFpdHM8 TD46OkFyZ1R5cGU+KCBtX2xhbWJkYSwgYXJnICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAg dGVtcGxhdGU8dHlwZW5hbWUgTD4KKyAgICBzdHJ1Y3QgQm91bmRGbGFnTGFtYmRhIDogQm91bmRG bGFnUmVmQmFzZSB7CisgICAgICAgIEwgbV9sYW1iZGE7CisKKyAgICAgICAgc3RhdGljX2Fzc2Vy dCggVW5hcnlMYW1iZGFUcmFpdHM8TD46OmlzVmFsaWQsICJTdXBwbGllZCBsYW1iZGEgbXVzdCB0 YWtlIGV4YWN0bHkgb25lIGFyZ3VtZW50IiApOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCBzdGQ6 OmlzX3NhbWU8dHlwZW5hbWUgVW5hcnlMYW1iZGFUcmFpdHM8TD46OkFyZ1R5cGUsIGJvb2w+Ojp2 YWx1ZSwgImZsYWdzIG11c3QgYmUgYm9vbGVhbiIgKTsKKworICAgICAgICBleHBsaWNpdCBCb3Vu ZEZsYWdMYW1iZGEoIEwgY29uc3QgJmxhbWJkYSApIDogbV9sYW1iZGEoIGxhbWJkYSApIHt9CisK KyAgICAgICAgYXV0byBzZXRGbGFnKCBib29sIGZsYWcgKSAtPiBQYXJzZXJSZXN1bHQgb3ZlcnJp ZGUgeworICAgICAgICAgICAgcmV0dXJuIExhbWJkYUludm9rZXI8dHlwZW5hbWUgVW5hcnlMYW1i ZGFUcmFpdHM8TD46OlJldHVyblR5cGU+OjppbnZva2UoIG1fbGFtYmRhLCBmbGFnICk7CisgICAg ICAgIH0KKyAgICB9OworCisgICAgZW51bSBjbGFzcyBPcHRpb25hbGl0eSB7IE9wdGlvbmFsLCBS ZXF1aXJlZCB9OworCisgICAgc3RydWN0IFBhcnNlcjsKKworICAgIGNsYXNzIFBhcnNlckJhc2Ug eworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+UGFyc2VyQmFzZSgpID0gZGVmYXVsdDsK KyAgICAgICAgdmlydHVhbCBhdXRvIHZhbGlkYXRlKCkgY29uc3QgLT4gUmVzdWx0IHsgcmV0dXJu IFJlc3VsdDo6b2soKTsgfQorICAgICAgICB2aXJ0dWFsIGF1dG8gcGFyc2UoIHN0ZDo6c3RyaW5n IGNvbnN0JiBleGVOYW1lLCBUb2tlblN0cmVhbSBjb25zdCAmdG9rZW5zKSBjb25zdCAtPiBJbnRl cm5hbFBhcnNlUmVzdWx0ICA9IDA7CisgICAgICAgIHZpcnR1YWwgYXV0byBjYXJkaW5hbGl0eSgp IGNvbnN0IC0+IHNpemVfdCB7IHJldHVybiAxOyB9CisKKyAgICAgICAgYXV0byBwYXJzZSggQXJn cyBjb25zdCAmYXJncyApIGNvbnN0IC0+IEludGVybmFsUGFyc2VSZXN1bHQgeworICAgICAgICAg ICAgcmV0dXJuIHBhcnNlKCBhcmdzLmV4ZU5hbWUoKSwgVG9rZW5TdHJlYW0oIGFyZ3MgKSApOwor ICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWRUPgorICAg IGNsYXNzIENvbXBvc2FibGVQYXJzZXJJbXBsIDogcHVibGljIFBhcnNlckJhc2UgeworICAgIHB1 YmxpYzoKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgYXV0byBvcGVyYXRv cnwoIFQgY29uc3QgJm90aGVyICkgY29uc3QgLT4gUGFyc2VyOworCisJCXRlbXBsYXRlPHR5cGVu YW1lIFQ+CisgICAgICAgIGF1dG8gb3BlcmF0b3IrKCBUIGNvbnN0ICZvdGhlciApIGNvbnN0IC0+ IFBhcnNlcjsKKyAgICB9OworCisgICAgLy8gQ29tbW9uIGNvZGUgYW5kIHN0YXRlIGZvciBBcmdz IGFuZCBPcHRzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZFQ+CisgICAgY2xhc3MgUGFy c2VyUmVmSW1wbCA6IHB1YmxpYyBDb21wb3NhYmxlUGFyc2VySW1wbDxEZXJpdmVkVD4geworICAg IHByb3RlY3RlZDoKKyAgICAgICAgT3B0aW9uYWxpdHkgbV9vcHRpb25hbGl0eSA9IE9wdGlvbmFs aXR5OjpPcHRpb25hbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJvdW5kUmVmPiBtX3JlZjsK KyAgICAgICAgc3RkOjpzdHJpbmcgbV9oaW50OworICAgICAgICBzdGQ6OnN0cmluZyBtX2Rlc2Ny aXB0aW9uOworCisgICAgICAgIGV4cGxpY2l0IFBhcnNlclJlZkltcGwoIHN0ZDo6c2hhcmVkX3B0 cjxCb3VuZFJlZj4gY29uc3QgJnJlZiApIDogbV9yZWYoIHJlZiApIHt9CisKKyAgICBwdWJsaWM6 CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFBhcnNlclJlZkltcGwoIFQg JnJlZiwgc3RkOjpzdHJpbmcgY29uc3QgJmhpbnQgKQorICAgICAgICA6ICAgbV9yZWYoIHN0ZDo6 bWFrZV9zaGFyZWQ8Qm91bmRWYWx1ZVJlZjxUPj4oIHJlZiApICksCisgICAgICAgICAgICBtX2hp bnQoIGhpbnQgKQorICAgICAgICB7fQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIExhbWJk YVQ+CisgICAgICAgIFBhcnNlclJlZkltcGwoIExhbWJkYVQgY29uc3QgJnJlZiwgc3RkOjpzdHJp bmcgY29uc3QgJmhpbnQgKQorICAgICAgICA6ICAgbV9yZWYoIHN0ZDo6bWFrZV9zaGFyZWQ8Qm91 bmRMYW1iZGE8TGFtYmRhVD4+KCByZWYgKSApLAorICAgICAgICAgICAgbV9oaW50KGhpbnQpCisg ICAgICAgIHt9CisKKyAgICAgICAgYXV0byBvcGVyYXRvcigpKCBzdGQ6OnN0cmluZyBjb25zdCAm ZGVzY3JpcHRpb24gKSAtPiBEZXJpdmVkVCAmIHsKKyAgICAgICAgICAgIG1fZGVzY3JpcHRpb24g PSBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAm PiggKnRoaXMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gb3B0aW9uYWwoKSAtPiBEZXJp dmVkVCAmIHsKKyAgICAgICAgICAgIG1fb3B0aW9uYWxpdHkgPSBPcHRpb25hbGl0eTo6T3B0aW9u YWw7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZFQgJj4oICp0aGlzICk7 CisgICAgICAgIH07CisKKyAgICAgICAgYXV0byByZXF1aXJlZCgpIC0+IERlcml2ZWRUICYgewor ICAgICAgICAgICAgbV9vcHRpb25hbGl0eSA9IE9wdGlvbmFsaXR5OjpSZXF1aXJlZDsKKyAgICAg ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAmPiggKnRoaXMgKTsKKyAgICAgICAg fTsKKworICAgICAgICBhdXRvIGlzT3B0aW9uYWwoKSBjb25zdCAtPiBib29sIHsKKyAgICAgICAg ICAgIHJldHVybiBtX29wdGlvbmFsaXR5ID09IE9wdGlvbmFsaXR5OjpPcHRpb25hbDsKKyAgICAg ICAgfQorCisgICAgICAgIGF1dG8gY2FyZGluYWxpdHkoKSBjb25zdCAtPiBzaXplX3Qgb3ZlcnJp ZGUgeworICAgICAgICAgICAgaWYoIG1fcmVmLT5pc0NvbnRhaW5lcigpICkKKyAgICAgICAgICAg ICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4g MTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaGludCgpIGNvbnN0IC0+IHN0ZDo6c3RyaW5n IHsgcmV0dXJuIG1faGludDsgfQorICAgIH07CisKKyAgICBjbGFzcyBFeGVOYW1lIDogcHVibGlj IENvbXBvc2FibGVQYXJzZXJJbXBsPEV4ZU5hbWU+IHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRy PHN0ZDo6c3RyaW5nPiBtX25hbWU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCb3VuZFZhbHVl UmVmQmFzZT4gbV9yZWY7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTGFtYmRhVD4KKyAg ICAgICAgc3RhdGljIGF1dG8gbWFrZVJlZihMYW1iZGFUIGNvbnN0ICZsYW1iZGEpIC0+IHN0ZDo6 c2hhcmVkX3B0cjxCb3VuZFZhbHVlUmVmQmFzZT4geworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6 bWFrZV9zaGFyZWQ8Qm91bmRMYW1iZGE8TGFtYmRhVD4+KCBsYW1iZGEpIDsKKyAgICAgICAgfQor CisgICAgcHVibGljOgorICAgICAgICBFeGVOYW1lKCkgOiBtX25hbWUoIHN0ZDo6bWFrZV9zaGFy ZWQ8c3RkOjpzdHJpbmc+KCAiPGV4ZWN1dGFibGU+IiApICkge30KKworICAgICAgICBleHBsaWNp dCBFeGVOYW1lKCBzdGQ6OnN0cmluZyAmcmVmICkgOiBFeGVOYW1lKCkgeworICAgICAgICAgICAg bV9yZWYgPSBzdGQ6Om1ha2Vfc2hhcmVkPEJvdW5kVmFsdWVSZWY8c3RkOjpzdHJpbmc+PiggcmVm ICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMYW1iZGFUPgorICAg ICAgICBleHBsaWNpdCBFeGVOYW1lKCBMYW1iZGFUIGNvbnN0JiBsYW1iZGEgKSA6IEV4ZU5hbWUo KSB7CisgICAgICAgICAgICBtX3JlZiA9IHN0ZDo6bWFrZV9zaGFyZWQ8Qm91bmRMYW1iZGE8TGFt YmRhVD4+KCBsYW1iZGEgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBleGUgbmFtZSBp cyBub3QgcGFyc2VkIG91dCBvZiB0aGUgbm9ybWFsIHRva2VucywgYnV0IGlzIGhhbmRsZWQgc3Bl Y2lhbGx5CisgICAgICAgIGF1dG8gcGFyc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiwgVG9rZW5TdHJl YW0gY29uc3QgJnRva2VucyApIGNvbnN0IC0+IEludGVybmFsUGFyc2VSZXN1bHQgb3ZlcnJpZGUg eworICAgICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VSZXN1bHQ6Om9rKCBQYXJzZVN0YXRl KCBQYXJzZVJlc3VsdFR5cGU6Ok5vTWF0Y2gsIHRva2VucyApICk7CisgICAgICAgIH0KKworICAg ICAgICBhdXRvIG5hbWUoKSBjb25zdCAtPiBzdGQ6OnN0cmluZyB7IHJldHVybiAqbV9uYW1lOyB9 CisgICAgICAgIGF1dG8gc2V0KCBzdGQ6OnN0cmluZyBjb25zdCYgbmV3TmFtZSApIC0+IFBhcnNl clJlc3VsdCB7CisKKyAgICAgICAgICAgIGF1dG8gbGFzdFNsYXNoID0gbmV3TmFtZS5maW5kX2xh c3Rfb2YoICJcXC8iICk7CisgICAgICAgICAgICBhdXRvIGZpbGVuYW1lID0gKCBsYXN0U2xhc2gg PT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgICAgICA/IG5ld05hbWUKKyAg ICAgICAgICAgICAgICAgICAgOiBuZXdOYW1lLnN1YnN0ciggbGFzdFNsYXNoKzEgKTsKKworICAg ICAgICAgICAgKm1fbmFtZSA9IGZpbGVuYW1lOworICAgICAgICAgICAgaWYoIG1fcmVmICkKKyAg ICAgICAgICAgICAgICByZXR1cm4gbV9yZWYtPnNldFZhbHVlKCBmaWxlbmFtZSApOworICAgICAg ICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZXJSZXN1bHQ6Om9rKCBQYXJz ZVJlc3VsdFR5cGU6Ok1hdGNoZWQgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBB cmcgOiBwdWJsaWMgUGFyc2VyUmVmSW1wbDxBcmc+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHVz aW5nIFBhcnNlclJlZkltcGw6OlBhcnNlclJlZkltcGw7CisKKyAgICAgICAgYXV0byBwYXJzZSgg c3RkOjpzdHJpbmcgY29uc3QgJiwgVG9rZW5TdHJlYW0gY29uc3QgJnRva2VucyApIGNvbnN0IC0+ IEludGVybmFsUGFyc2VSZXN1bHQgb3ZlcnJpZGUgeworICAgICAgICAgICAgYXV0byB2YWxpZGF0 aW9uUmVzdWx0ID0gdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIGlmKCAhdmFsaWRhdGlvblJlc3Vs dCApCisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VSZXN1bHQoIHZhbGlkYXRp b25SZXN1bHQgKTsKKworICAgICAgICAgICAgYXV0byByZW1haW5pbmdUb2tlbnMgPSB0b2tlbnM7 CisgICAgICAgICAgICBhdXRvIGNvbnN0ICZ0b2tlbiA9ICpyZW1haW5pbmdUb2tlbnM7CisgICAg ICAgICAgICBpZiggdG9rZW4udHlwZSAhPSBUb2tlblR5cGU6OkFyZ3VtZW50ICkKKyAgICAgICAg ICAgICAgICByZXR1cm4gSW50ZXJuYWxQYXJzZVJlc3VsdDo6b2soIFBhcnNlU3RhdGUoIFBhcnNl UmVzdWx0VHlwZTo6Tm9NYXRjaCwgcmVtYWluaW5nVG9rZW5zICkgKTsKKworICAgICAgICAgICAg YXNzZXJ0KCAhbV9yZWYtPmlzRmxhZygpICk7CisgICAgICAgICAgICBhdXRvIHZhbHVlUmVmID0g c3RhdGljX2Nhc3Q8ZGV0YWlsOjpCb3VuZFZhbHVlUmVmQmFzZSo+KCBtX3JlZi5nZXQoKSApOwor CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IHZhbHVlUmVmLT5zZXRWYWx1ZSggcmVtYWluaW5n VG9rZW5zLT50b2tlbiApOworICAgICAgICAgICAgaWYoICFyZXN1bHQgKQorICAgICAgICAgICAg ICAgIHJldHVybiBJbnRlcm5hbFBhcnNlUmVzdWx0KCByZXN1bHQgKTsKKyAgICAgICAgICAgIGVs c2UKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxQYXJzZVJlc3VsdDo6b2soIFBhcnNl U3RhdGUoIFBhcnNlUmVzdWx0VHlwZTo6TWF0Y2hlZCwgKytyZW1haW5pbmdUb2tlbnMgKSApOwor ICAgICAgICB9CisgICAgfTsKKworICAgIGlubGluZSBhdXRvIG5vcm1hbGlzZU9wdCggc3RkOjpz dHJpbmcgY29uc3QgJm9wdE5hbWUgKSAtPiBzdGQ6OnN0cmluZyB7CisjaWZkZWYgQ0FUQ0hfUExB VEZPUk1fV0lORE9XUworICAgICAgICBpZiggb3B0TmFtZVswXSA9PSAnLycgKQorICAgICAgICAg ICAgcmV0dXJuICItIiArIG9wdE5hbWUuc3Vic3RyKCAxICk7CisgICAgICAgIGVsc2UKKyNlbmRp ZgorICAgICAgICAgICAgcmV0dXJuIG9wdE5hbWU7CisgICAgfQorCisgICAgY2xhc3MgT3B0IDog cHVibGljIFBhcnNlclJlZkltcGw8T3B0PiB7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6 OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9vcHROYW1lczsKKworICAgIHB1YmxpYzoKKyAgICAgICAg dGVtcGxhdGU8dHlwZW5hbWUgTGFtYmRhVD4KKyAgICAgICAgZXhwbGljaXQgT3B0KCBMYW1iZGFU IGNvbnN0ICZyZWYgKSA6IFBhcnNlclJlZkltcGwoIHN0ZDo6bWFrZV9zaGFyZWQ8Qm91bmRGbGFn TGFtYmRhPExhbWJkYVQ+PiggcmVmICkgKSB7fQorCisgICAgICAgIGV4cGxpY2l0IE9wdCggYm9v bCAmcmVmICkgOiBQYXJzZXJSZWZJbXBsKCBzdGQ6Om1ha2Vfc2hhcmVkPEJvdW5kRmxhZ1JlZj4o IHJlZiApICkge30KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMYW1iZGFUPgorICAgICAg ICBPcHQoIExhbWJkYVQgY29uc3QgJnJlZiwgc3RkOjpzdHJpbmcgY29uc3QgJmhpbnQgKSA6IFBh cnNlclJlZkltcGwoIHJlZiwgaGludCApIHt9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUg VD4KKyAgICAgICAgT3B0KCBUICZyZWYsIHN0ZDo6c3RyaW5nIGNvbnN0ICZoaW50ICkgOiBQYXJz ZXJSZWZJbXBsKCByZWYsIGhpbnQgKSB7fQorCisgICAgICAgIGF1dG8gb3BlcmF0b3JbXSggc3Rk OjpzdHJpbmcgY29uc3QgJm9wdE5hbWUgKSAtPiBPcHQgJiB7CisgICAgICAgICAgICBtX29wdE5h bWVzLnB1c2hfYmFjayggb3B0TmFtZSApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAg ICAgICB9CisKKyAgICAgICAgYXV0byBnZXRIZWxwQ29sdW1ucygpIGNvbnN0IC0+IHN0ZDo6dmVj dG9yPEhlbHBDb2x1bW5zPiB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwor ICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3IoIGF1dG8gY29u c3QgJm9wdCA6IG1fb3B0TmFtZXMgKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAg ICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGVsc2UKKyAg ICAgICAgICAgICAgICAgICAgb3NzIDw8ICIsICI7CisgICAgICAgICAgICAgICAgb3NzIDw8IG9w dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhbV9oaW50LmVtcHR5KCkgKQorICAg ICAgICAgICAgICAgIG9zcyA8PCAiIDwiIDw8IG1faGludCA8PCAiPiI7CisgICAgICAgICAgICBy ZXR1cm4geyB7IG9zcy5zdHIoKSwgbV9kZXNjcmlwdGlvbiB9IH07CisgICAgICAgIH0KKworICAg ICAgICBhdXRvIGlzTWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0ICZvcHRUb2tlbiApIGNvbnN0IC0+ IGJvb2wgeworICAgICAgICAgICAgYXV0byBub3JtYWxpc2VkVG9rZW4gPSBub3JtYWxpc2VPcHQo IG9wdFRva2VuICk7CisgICAgICAgICAgICBmb3IoIGF1dG8gY29uc3QgJm5hbWUgOiBtX29wdE5h bWVzICkgeworICAgICAgICAgICAgICAgIGlmKCBub3JtYWxpc2VPcHQoIG5hbWUgKSA9PSBub3Jt YWxpc2VkVG9rZW4gKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHVz aW5nIFBhcnNlckJhc2U6OnBhcnNlOworCisgICAgICAgIGF1dG8gcGFyc2UoIHN0ZDo6c3RyaW5n IGNvbnN0JiwgVG9rZW5TdHJlYW0gY29uc3QgJnRva2VucyApIGNvbnN0IC0+IEludGVybmFsUGFy c2VSZXN1bHQgb3ZlcnJpZGUgeworICAgICAgICAgICAgYXV0byB2YWxpZGF0aW9uUmVzdWx0ID0g dmFsaWRhdGUoKTsKKyAgICAgICAgICAgIGlmKCAhdmFsaWRhdGlvblJlc3VsdCApCisgICAgICAg ICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VSZXN1bHQoIHZhbGlkYXRpb25SZXN1bHQgKTsK KworICAgICAgICAgICAgYXV0byByZW1haW5pbmdUb2tlbnMgPSB0b2tlbnM7CisgICAgICAgICAg ICBpZiggcmVtYWluaW5nVG9rZW5zICYmIHJlbWFpbmluZ1Rva2Vucy0+dHlwZSA9PSBUb2tlblR5 cGU6Ok9wdGlvbiApIHsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnN0ICZ0b2tlbiA9ICpyZW1h aW5pbmdUb2tlbnM7CisgICAgICAgICAgICAgICAgaWYoIGlzTWF0Y2godG9rZW4udG9rZW4gKSAp IHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG1fcmVmLT5pc0ZsYWcoKSApIHsKKyAgICAgICAg ICAgICAgICAgICAgICAgIGF1dG8gZmxhZ1JlZiA9IHN0YXRpY19jYXN0PGRldGFpbDo6Qm91bmRG bGFnUmVmQmFzZSo+KCBtX3JlZi5nZXQoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0 byByZXN1bHQgPSBmbGFnUmVmLT5zZXRGbGFnKCB0cnVlICk7CisgICAgICAgICAgICAgICAgICAg ICAgICBpZiggIXJlc3VsdCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElu dGVybmFsUGFyc2VSZXN1bHQoIHJlc3VsdCApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYo IHJlc3VsdC52YWx1ZSgpID09IFBhcnNlUmVzdWx0VHlwZTo6U2hvcnRDaXJjdWl0QWxsICkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxQYXJzZVJlc3VsdDo6b2so IFBhcnNlU3RhdGUoIHJlc3VsdC52YWx1ZSgpLCByZW1haW5pbmdUb2tlbnMgKSApOworICAgICAg ICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byB2YWx1 ZVJlZiA9IHN0YXRpY19jYXN0PGRldGFpbDo6Qm91bmRWYWx1ZVJlZkJhc2UqPiggbV9yZWYuZ2V0 KCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrcmVtYWluaW5nVG9rZW5zOworICAgICAg ICAgICAgICAgICAgICAgICAgaWYoICFyZW1haW5pbmdUb2tlbnMgKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiBJbnRlcm5hbFBhcnNlUmVzdWx0OjpydW50aW1lRXJyb3IoICJF eHBlY3RlZCBhcmd1bWVudCBmb2xsb3dpbmcgIiArIHRva2VuLnRva2VuICk7CisgICAgICAgICAg ICAgICAgICAgICAgICBhdXRvIGNvbnN0ICZhcmdUb2tlbiA9ICpyZW1haW5pbmdUb2tlbnM7Cisg ICAgICAgICAgICAgICAgICAgICAgICBpZiggYXJnVG9rZW4udHlwZSAhPSBUb2tlblR5cGU6OkFy Z3VtZW50ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxQYXJz ZVJlc3VsdDo6cnVudGltZUVycm9yKCAiRXhwZWN0ZWQgYXJndW1lbnQgZm9sbG93aW5nICIgKyB0 b2tlbi50b2tlbiApOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSB2YWx1 ZVJlZi0+c2V0VmFsdWUoIGFyZ1Rva2VuLnRva2VuICk7CisgICAgICAgICAgICAgICAgICAgICAg ICBpZiggIXJlc3VsdCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVy bmFsUGFyc2VSZXN1bHQoIHJlc3VsdCApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJl c3VsdC52YWx1ZSgpID09IFBhcnNlUmVzdWx0VHlwZTo6U2hvcnRDaXJjdWl0QWxsICkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxQYXJzZVJlc3VsdDo6b2soIFBh cnNlU3RhdGUoIHJlc3VsdC52YWx1ZSgpLCByZW1haW5pbmdUb2tlbnMgKSApOworICAgICAgICAg ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlcm5hbFBhcnNlUmVz dWx0OjpvayggUGFyc2VTdGF0ZSggUGFyc2VSZXN1bHRUeXBlOjpNYXRjaGVkLCArK3JlbWFpbmlu Z1Rva2VucyApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg ICAgcmV0dXJuIEludGVybmFsUGFyc2VSZXN1bHQ6Om9rKCBQYXJzZVN0YXRlKCBQYXJzZVJlc3Vs dFR5cGU6Ok5vTWF0Y2gsIHJlbWFpbmluZ1Rva2VucyApICk7CisgICAgICAgIH0KKworICAgICAg ICBhdXRvIHZhbGlkYXRlKCkgY29uc3QgLT4gUmVzdWx0IG92ZXJyaWRlIHsKKyAgICAgICAgICAg IGlmKCBtX29wdE5hbWVzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ6 OmxvZ2ljRXJyb3IoICJObyBvcHRpb25zIHN1cHBsaWVkIHRvIE9wdCIgKTsKKyAgICAgICAgICAg IGZvciggYXV0byBjb25zdCAmbmFtZSA6IG1fb3B0TmFtZXMgKSB7CisgICAgICAgICAgICAgICAg aWYoIG5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ6Omxv Z2ljRXJyb3IoICJPcHRpb24gbmFtZSBjYW5ub3QgYmUgZW1wdHkiICk7CisjaWZkZWYgQ0FUQ0hf UExBVEZPUk1fV0lORE9XUworICAgICAgICAgICAgICAgIGlmKCBuYW1lWzBdICE9ICctJyAmJiBu YW1lWzBdICE9ICcvJyApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ6OmxvZ2lj RXJyb3IoICJPcHRpb24gbmFtZSBtdXN0IGJlZ2luIHdpdGggJy0nIG9yICcvJyIgKTsKKyNlbHNl CisgICAgICAgICAgICAgICAgaWYoIG5hbWVbMF0gIT0gJy0nICkKKyAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIFJlc3VsdDo6bG9naWNFcnJvciggIk9wdGlvbiBuYW1lIG11c3QgYmVnaW4gd2l0 aCAnLSciICk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBQYXJz ZXJSZWZJbXBsOjp2YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0cnVjdCBI ZWxwIDogT3B0IHsKKyAgICAgICAgSGVscCggYm9vbCAmc2hvd0hlbHBGbGFnICkKKyAgICAgICAg OiAgIE9wdChbJl0oIGJvb2wgZmxhZyApIHsKKyAgICAgICAgICAgICAgICBzaG93SGVscEZsYWcg PSBmbGFnOworICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZXJSZXN1bHQ6Om9rKCBQYXJzZVJl c3VsdFR5cGU6OlNob3J0Q2lyY3VpdEFsbCApOworICAgICAgICAgICAgfSkKKyAgICAgICAgewor ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T3B0ICY+KCAqdGhpcyApCisgICAgICAgICAgICAgICAg ICAgICgiZGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbiIpCisgICAgICAgICAgICAgICAgICAgIFsi LT8iXVsiLWgiXVsiLS1oZWxwIl0KKyAgICAgICAgICAgICAgICAgICAgLm9wdGlvbmFsKCk7Cisg ICAgICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IFBhcnNlciA6IFBhcnNlckJhc2UgeworCisg ICAgICAgIG11dGFibGUgRXhlTmFtZSBtX2V4ZU5hbWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPE9w dD4gbV9vcHRpb25zOworICAgICAgICBzdGQ6OnZlY3RvcjxBcmc+IG1fYXJnczsKKworICAgICAg ICBhdXRvIG9wZXJhdG9yfD0oIEV4ZU5hbWUgY29uc3QgJmV4ZU5hbWUgKSAtPiBQYXJzZXIgJiB7 CisgICAgICAgICAgICBtX2V4ZU5hbWUgPSBleGVOYW1lOworICAgICAgICAgICAgcmV0dXJuICp0 aGlzOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBvcGVyYXRvcnw9KCBBcmcgY29uc3QgJmFy ZyApIC0+IFBhcnNlciAmIHsKKyAgICAgICAgICAgIG1fYXJncy5wdXNoX2JhY2soYXJnKTsKKyAg ICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gb3BlcmF0 b3J8PSggT3B0IGNvbnN0ICZvcHQgKSAtPiBQYXJzZXIgJiB7CisgICAgICAgICAgICBtX29wdGlv bnMucHVzaF9iYWNrKG9wdCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0K KworICAgICAgICBhdXRvIG9wZXJhdG9yfD0oIFBhcnNlciBjb25zdCAmb3RoZXIgKSAtPiBQYXJz ZXIgJiB7CisgICAgICAgICAgICBtX29wdGlvbnMuaW5zZXJ0KG1fb3B0aW9ucy5lbmQoKSwgb3Ro ZXIubV9vcHRpb25zLmJlZ2luKCksIG90aGVyLm1fb3B0aW9ucy5lbmQoKSk7CisgICAgICAgICAg ICBtX2FyZ3MuaW5zZXJ0KG1fYXJncy5lbmQoKSwgb3RoZXIubV9hcmdzLmJlZ2luKCksIG90aGVy Lm1fYXJncy5lbmQoKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKwor ICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBhdXRvIG9wZXJhdG9yfCggVCBj b25zdCAmb3RoZXIgKSBjb25zdCAtPiBQYXJzZXIgeworICAgICAgICAgICAgcmV0dXJuIFBhcnNl ciggKnRoaXMgKSB8PSBvdGhlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcndhcmQgZGVw cmVjYXRlZCBpbnRlcmZhY2Ugd2l0aCAnKycgaW5zdGVhZCBvZiAnfCcKKyAgICAgICAgdGVtcGxh dGU8dHlwZW5hbWUgVD4KKyAgICAgICAgYXV0byBvcGVyYXRvcis9KCBUIGNvbnN0ICZvdGhlciAp IC0+IFBhcnNlciAmIHsgcmV0dXJuIG9wZXJhdG9yfD0oIG90aGVyICk7IH0KKyAgICAgICAgdGVt cGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgYXV0byBvcGVyYXRvcisoIFQgY29uc3QgJm90aGVy ICkgY29uc3QgLT4gUGFyc2VyIHsgcmV0dXJuIG9wZXJhdG9yfCggb3RoZXIgKTsgfQorCisgICAg ICAgIGF1dG8gZ2V0SGVscENvbHVtbnMoKSBjb25zdCAtPiBzdGQ6OnZlY3RvcjxIZWxwQ29sdW1u cz4geworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SGVscENvbHVtbnM+IGNvbHM7CisgICAgICAg ICAgICBmb3IgKGF1dG8gY29uc3QgJm8gOiBtX29wdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBh dXRvIGNoaWxkQ29scyA9IG8uZ2V0SGVscENvbHVtbnMoKTsKKyAgICAgICAgICAgICAgICBjb2xz Lmluc2VydCggY29scy5lbmQoKSwgY2hpbGRDb2xzLmJlZ2luKCksIGNoaWxkQ29scy5lbmQoKSAp OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbHM7CisgICAgICAgIH0KKwor ICAgICAgICB2b2lkIHdyaXRlVG9TdHJlYW0oIHN0ZDo6b3N0cmVhbSAmb3MgKSBjb25zdCB7Cisg ICAgICAgICAgICBpZiAoIW1fZXhlTmFtZS5uYW1lKCkuZW1wdHkoKSkgeworICAgICAgICAgICAg ICAgIG9zIDw8ICJ1c2FnZTpcbiIgPDwgIiAgIiA8PCBtX2V4ZU5hbWUubmFtZSgpIDw8ICIgIjsK KyAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVkID0gdHJ1ZSwgZmlyc3QgPSB0cnVlOworICAg ICAgICAgICAgICAgIGZvciggYXV0byBjb25zdCAmYXJnIDogbV9hcmdzICkgeworICAgICAgICAg ICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZh bHNlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBv cyA8PCAiICI7CisgICAgICAgICAgICAgICAgICAgIGlmKCBhcmcuaXNPcHRpb25hbCgpICYmIHJl cXVpcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIlsiOworICAgICAgICAg ICAgICAgICAgICAgICAgcmVxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgICAgICAgICBvcyA8PCAiPCIgPDwgYXJnLmhpbnQoKSA8PCAiPiI7CisgICAg ICAgICAgICAgICAgICAgIGlmKCBhcmcuY2FyZGluYWxpdHkoKSA9PSAwICkKKyAgICAgICAgICAg ICAgICAgICAgICAgIG9zIDw8ICIgLi4uICI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg ICAgICAgIGlmKCAhcmVxdWlyZWQgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiXSI7Cisg ICAgICAgICAgICAgICAgaWYoICFtX29wdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAg ICAgIG9zIDw8ICIgb3B0aW9ucyI7CisgICAgICAgICAgICAgICAgb3MgPDwgIlxuXG53aGVyZSBv cHRpb25zIGFyZToiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg YXV0byByb3dzID0gZ2V0SGVscENvbHVtbnMoKTsKKyAgICAgICAgICAgIHNpemVfdCBjb25zb2xl V2lkdGggPSBDQVRDSF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSDsKKyAgICAgICAgICAgIHNp emVfdCBvcHRXaWR0aCA9IDA7CisgICAgICAgICAgICBmb3IoIGF1dG8gY29uc3QgJmNvbHMgOiBy b3dzICkKKyAgICAgICAgICAgICAgICBvcHRXaWR0aCA9IChzdGQ6Om1heCkob3B0V2lkdGgsIGNv bHMubGVmdC5zaXplKCkgKyAyKTsKKworICAgICAgICAgICAgb3B0V2lkdGggPSAoc3RkOjptaW4p KG9wdFdpZHRoLCBjb25zb2xlV2lkdGgvMik7CisKKyAgICAgICAgICAgIGZvciggYXV0byBjb25z dCAmY29scyA6IHJvd3MgKSB7CisgICAgICAgICAgICAgICAgYXV0byByb3cgPQorICAgICAgICAg ICAgICAgICAgICAgICAgVGV4dEZsb3c6OkNvbHVtbiggY29scy5sZWZ0ICkud2lkdGgoIG9wdFdp ZHRoICkuaW5kZW50KCAyICkgKworICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEZsb3c6OlNw YWNlcig0KSArCisgICAgICAgICAgICAgICAgICAgICAgICBUZXh0Rmxvdzo6Q29sdW1uKCBjb2xz LnJpZ2h0ICkud2lkdGgoIGNvbnNvbGVXaWR0aCAtIDcgLSBvcHRXaWR0aCApOworICAgICAgICAg ICAgICAgIG9zIDw8IHJvdyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0K KworICAgICAgICBmcmllbmQgYXV0byBvcGVyYXRvcjw8KCBzdGQ6Om9zdHJlYW0gJm9zLCBQYXJz ZXIgY29uc3QgJnBhcnNlciApIC0+IHN0ZDo6b3N0cmVhbSYgeworICAgICAgICAgICAgcGFyc2Vy LndyaXRlVG9TdHJlYW0oIG9zICk7CisgICAgICAgICAgICByZXR1cm4gb3M7CisgICAgICAgIH0K KworICAgICAgICBhdXRvIHZhbGlkYXRlKCkgY29uc3QgLT4gUmVzdWx0IG92ZXJyaWRlIHsKKyAg ICAgICAgICAgIGZvciggYXV0byBjb25zdCAmb3B0IDogbV9vcHRpb25zICkgeworICAgICAgICAg ICAgICAgIGF1dG8gcmVzdWx0ID0gb3B0LnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgaWYo ICFyZXN1bHQgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAg ICAgfQorICAgICAgICAgICAgZm9yKCBhdXRvIGNvbnN0ICZhcmcgOiBtX2FyZ3MgKSB7CisgICAg ICAgICAgICAgICAgYXV0byByZXN1bHQgPSBhcmcudmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAg ICBpZiggIXJlc3VsdCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg ICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OjpvaygpOworICAgICAgICB9CisK KyAgICAgICAgdXNpbmcgUGFyc2VyQmFzZTo6cGFyc2U7CisKKyAgICAgICAgYXV0byBwYXJzZSgg c3RkOjpzdHJpbmcgY29uc3QmIGV4ZU5hbWUsIFRva2VuU3RyZWFtIGNvbnN0ICZ0b2tlbnMgKSBj b25zdCAtPiBJbnRlcm5hbFBhcnNlUmVzdWx0IG92ZXJyaWRlIHsKKworICAgICAgICAgICAgc3Ry dWN0IFBhcnNlckluZm8geworICAgICAgICAgICAgICAgIFBhcnNlckJhc2UgY29uc3QqIHBhcnNl ciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gMDsKKyAgICAgICAg ICAgIH07CisgICAgICAgICAgICBjb25zdCBzaXplX3QgdG90YWxQYXJzZXJzID0gbV9vcHRpb25z LnNpemUoKSArIG1fYXJncy5zaXplKCk7CisgICAgICAgICAgICBhc3NlcnQoIHRvdGFsUGFyc2Vy cyA8IDUxMiApOworICAgICAgICAgICAgLy8gUGFyc2VySW5mbyBwYXJzZUluZm9zW3RvdGFsUGFy c2Vyc107IC8vIDwtLSB0aGlzIGlzIHdoYXQgd2UgcmVhbGx5IHdhbnQgdG8gZG8KKyAgICAgICAg ICAgIFBhcnNlckluZm8gcGFyc2VJbmZvc1s1MTJdOworCisgICAgICAgICAgICB7CisgICAgICAg ICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCAm b3B0IDogbV9vcHRpb25zKSBwYXJzZUluZm9zW2krK10ucGFyc2VyID0gJm9wdDsKKyAgICAgICAg ICAgICAgICBmb3IgKGF1dG8gY29uc3QgJmFyZyA6IG1fYXJncykgcGFyc2VJbmZvc1tpKytdLnBh cnNlciA9ICZhcmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1fZXhlTmFtZS5zZXQo IGV4ZU5hbWUgKTsKKworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBJbnRlcm5hbFBhcnNlUmVz dWx0OjpvayggUGFyc2VTdGF0ZSggUGFyc2VSZXN1bHRUeXBlOjpOb01hdGNoLCB0b2tlbnMgKSAp OworICAgICAgICAgICAgd2hpbGUoIHJlc3VsdC52YWx1ZSgpLnJlbWFpbmluZ1Rva2VucygpICkg eworICAgICAgICAgICAgICAgIGJvb2wgdG9rZW5QYXJzZWQgPSBmYWxzZTsKKworICAgICAgICAg ICAgICAgIGZvciggc2l6ZV90IGkgPSAwOyBpIDwgdG90YWxQYXJzZXJzOyArK2kgKSB7CisgICAg ICAgICAgICAgICAgICAgIGF1dG8mICBwYXJzZUluZm8gPSBwYXJzZUluZm9zW2ldOworICAgICAg ICAgICAgICAgICAgICBpZiggcGFyc2VJbmZvLnBhcnNlci0+Y2FyZGluYWxpdHkoKSA9PSAwIHx8 IHBhcnNlSW5mby5jb3VudCA8IHBhcnNlSW5mby5wYXJzZXItPmNhcmRpbmFsaXR5KCkgKSB7Cisg ICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJzZUluZm8ucGFyc2VyLT5wYXJzZShl eGVOYW1lLCByZXN1bHQudmFsdWUoKS5yZW1haW5pbmdUb2tlbnMoKSk7CisgICAgICAgICAgICAg ICAgICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1 cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSgpLnR5 cGUoKSAhPSBQYXJzZVJlc3VsdFR5cGU6Ok5vTWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICB0b2tlblBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg KytwYXJzZUluZm8uY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0LnZhbHVlKCkudHlwZSgpID09 IFBhcnNlUmVzdWx0VHlwZTo6U2hvcnRDaXJjdWl0QWxsICkKKyAgICAgICAgICAgICAgICAgICAg cmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBpZiggIXRva2VuUGFyc2VkICkKKyAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VSZXN1bHQ6OnJ1bnRpbWVFcnJvcigg IlVucmVjb2duaXNlZCB0b2tlbjogIiArIHJlc3VsdC52YWx1ZSgpLnJlbWFpbmluZ1Rva2Vucygp LT50b2tlbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gIVRCRCBDaGVjayBtaXNz aW5nIHJlcXVpcmVkIG9wdGlvbnMKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAg IH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZFQ+CisgICAgdGVtcGxh dGU8dHlwZW5hbWUgVD4KKyAgICBhdXRvIENvbXBvc2FibGVQYXJzZXJJbXBsPERlcml2ZWRUPjo6 b3BlcmF0b3J8KCBUIGNvbnN0ICZvdGhlciApIGNvbnN0IC0+IFBhcnNlciB7CisgICAgICAgIHJl dHVybiBQYXJzZXIoKSB8IHN0YXRpY19jYXN0PERlcml2ZWRUIGNvbnN0ICY+KCAqdGhpcyApIHwg b3RoZXI7CisgICAgfQorfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKy8vIEEgQ29tYmluZWQgcGFy c2VyCit1c2luZyBkZXRhaWw6OlBhcnNlcjsKKworLy8gQSBwYXJzZXIgZm9yIG9wdGlvbnMKK3Vz aW5nIGRldGFpbDo6T3B0OworCisvLyBBIHBhcnNlciBmb3IgYXJndW1lbnRzCit1c2luZyBkZXRh aWw6OkFyZzsKKworLy8gV3JhcHBlciBmb3IgYXJnYywgYXJndiBmcm9tIG1haW4oKQordXNpbmcg ZGV0YWlsOjpBcmdzOworCisvLyBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUK K3VzaW5nIGRldGFpbDo6RXhlTmFtZTsKKworLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBmb3Igb3B0 aW9uIHBhcnNlciB0aGF0IHNwZWNpZmllcyB0aGUgaGVscCBvcHRpb24KK3VzaW5nIGRldGFpbDo6 SGVscDsKKworLy8gZW51bSBvZiByZXN1bHQgdHlwZXMgZnJvbSBhIHBhcnNlCit1c2luZyBkZXRh aWw6OlBhcnNlUmVzdWx0VHlwZTsKKworLy8gUmVzdWx0IHR5cGUgZm9yIHBhcnNlciBvcGVyYXRp b24KK3VzaW5nIGRldGFpbDo6UGFyc2VyUmVzdWx0OworCit9fSAvLyBuYW1lc3BhY2UgQ2F0Y2g6 OmNsYXJhCisKKy8vIGVuZCBjbGFyYS5ocHAKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xh bmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisvLyBSZXN0b3JlIENsYXJhJ3MgdmFsdWUgZm9y IGNvbnNvbGUgd2lkdGgsIGlmIHByZXNlbnQKKyNpZmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJ R19DT05TT0xFX1dJRFRICisjZGVmaW5lIENBVENIX0NMQVJBX1RFWFRGTE9XX0NPTkZJR19DT05T T0xFX1dJRFRIIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyN1bmRlZiBD QVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZW5kaWYKKworLy8gZW5kIGNh dGNoX2NsYXJhLmgKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFyYTo6UGFyc2VyIG1ha2VD b21tYW5kTGluZVBhcnNlciggQ29uZmlnRGF0YSYgY29uZmlnICk7CisKK30gLy8gZW5kIG5hbWVz cGFjZSBDYXRjaAorCisvLyBlbmQgY2F0Y2hfY29tbWFuZGxpbmUuaAorI2luY2x1ZGUgPGZzdHJl YW0+CisjaW5jbHVkZSA8Y3RpbWU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFyYTo6 UGFyc2VyIG1ha2VDb21tYW5kTGluZVBhcnNlciggQ29uZmlnRGF0YSYgY29uZmlnICkgeworCisg ICAgICAgIHVzaW5nIG5hbWVzcGFjZSBjbGFyYTsKKworICAgICAgICBhdXRvIGNvbnN0IHNldFdh cm5pbmcgPSBbJl0oIHN0ZDo6c3RyaW5nIGNvbnN0JiB3YXJuaW5nICkgeworICAgICAgICAgICAg ICAgIGF1dG8gd2FybmluZ1NldCA9IFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHdh cm5pbmcgPT0gIk5vQXNzZXJ0aW9ucyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu IFdhcm5BYm91dDo6Tm9Bc3NlcnRpb25zOworCisgICAgICAgICAgICAgICAgICAgIGlmICggd2Fy bmluZyA9PSAiTm9UZXN0cyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdhcm5B Ym91dDo6Tm9UZXN0czsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2FybkFib3V0OjpO b3RoaW5nOworICAgICAgICAgICAgICAgIH0oKTsKKworICAgICAgICAgICAgICAgIGlmICh3YXJu aW5nU2V0ID09IFdhcm5BYm91dDo6Tm90aGluZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu IFBhcnNlclJlc3VsdDo6cnVudGltZUVycm9yKCAiVW5yZWNvZ25pc2VkIHdhcm5pbmc6ICciICsg d2FybmluZyArICInIiApOworICAgICAgICAgICAgICAgIGNvbmZpZy53YXJuaW5ncyA9IHN0YXRp Y19jYXN0PFdhcm5BYm91dDo6V2hhdD4oIGNvbmZpZy53YXJuaW5ncyB8IHdhcm5pbmdTZXQgKTsK KyAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0OjpvayggUGFyc2VSZXN1bHRUeXBl OjpNYXRjaGVkICk7CisgICAgICAgICAgICB9OworICAgICAgICBhdXRvIGNvbnN0IGxvYWRUZXN0 TmFtZXNGcm9tRmlsZSA9IFsmXSggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVuYW1lICkgeworICAg ICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gZiggZmlsZW5hbWUuY19zdHIoKSApOworICAgICAg ICAgICAgICAgIGlmKCAhZi5pc19vcGVuKCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g UGFyc2VyUmVzdWx0OjpydW50aW1lRXJyb3IoICJVbmFibGUgdG8gbG9hZCBpbnB1dCBmaWxlOiAn IiArIGZpbGVuYW1lICsgIiciICk7CisKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsaW5l OworICAgICAgICAgICAgICAgIHdoaWxlKCBzdGQ6OmdldGxpbmUoIGYsIGxpbmUgKSApIHsKKyAg ICAgICAgICAgICAgICAgICAgbGluZSA9IHRyaW0obGluZSk7CisgICAgICAgICAgICAgICAgICAg IGlmKCAhbGluZS5lbXB0eSgpICYmICFzdGFydHNXaXRoKCBsaW5lLCAnIycgKSApIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgIGlmKCAhc3RhcnRzV2l0aCggbGluZSwgJyInICkgKQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnIicgKyBsaW5lICsgJyInOworICAgICAgICAg ICAgICAgICAgICAgICAgY29uZmlnLnRlc3RzT3JUYWdzLnB1c2hfYmFjayggbGluZSApOworICAg ICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRlc3RzT3JUYWdzLmVtcGxhY2VfYmFjayggIiwi ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg ICAgICAgLy9SZW1vdmUgY29tbWEgaW4gdGhlIGVuZAorICAgICAgICAgICAgICAgIGlmKCFjb25m aWcudGVzdHNPclRhZ3MuZW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRlc3Rz T3JUYWdzLmVyYXNlKCBjb25maWcudGVzdHNPclRhZ3MuZW5kKCktMSApOworCisgICAgICAgICAg ICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6b2soIFBhcnNlUmVzdWx0VHlwZTo6TWF0Y2hlZCAp OworICAgICAgICAgICAgfTsKKyAgICAgICAgYXV0byBjb25zdCBzZXRUZXN0T3JkZXIgPSBbJl0o IHN0ZDo6c3RyaW5nIGNvbnN0JiBvcmRlciApIHsKKyAgICAgICAgICAgICAgICBpZiggc3RhcnRz V2l0aCggImRlY2xhcmVkIiwgb3JkZXIgKSApCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5y dW5PcmRlciA9IFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXI7CisgICAgICAgICAgICAgICAg ZWxzZSBpZiggc3RhcnRzV2l0aCggImxleGljYWwiLCBvcmRlciApICkKKyAgICAgICAgICAgICAg ICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluTGV4aWNvZ3JhcGhpY2FsT3JkZXI7 CisgICAgICAgICAgICAgICAgZWxzZSBpZiggc3RhcnRzV2l0aCggInJhbmRvbSIsIG9yZGVyICkg KQorICAgICAgICAgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5SYW5k b21PcmRlcjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVy biBjbGFyYTo6UGFyc2VyUmVzdWx0OjpydW50aW1lRXJyb3IoICJVbnJlY29nbmlzZWQgb3JkZXJp bmc6ICciICsgb3JkZXIgKyAiJyIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVz dWx0OjpvayggUGFyc2VSZXN1bHRUeXBlOjpNYXRjaGVkICk7CisgICAgICAgICAgICB9OworICAg ICAgICBhdXRvIGNvbnN0IHNldFJuZ1NlZWQgPSBbJl0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWVk ICkgeworICAgICAgICAgICAgICAgIGlmKCBzZWVkICE9ICJ0aW1lIiApCisgICAgICAgICAgICAg ICAgICAgIHJldHVybiBjbGFyYTo6ZGV0YWlsOjpjb252ZXJ0SW50byggc2VlZCwgY29uZmlnLnJu Z1NlZWQgKTsKKyAgICAgICAgICAgICAgICBjb25maWcucm5nU2VlZCA9IHN0YXRpY19jYXN0PHVu c2lnbmVkIGludD4oIHN0ZDo6dGltZShudWxscHRyKSApOworICAgICAgICAgICAgICAgIHJldHVy biBQYXJzZXJSZXN1bHQ6Om9rKCBQYXJzZVJlc3VsdFR5cGU6Ok1hdGNoZWQgKTsKKyAgICAgICAg ICAgIH07CisgICAgICAgIGF1dG8gY29uc3Qgc2V0Q29sb3VyVXNhZ2UgPSBbJl0oIHN0ZDo6c3Ry aW5nIGNvbnN0JiB1c2VDb2xvdXIgKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gbW9kZSA9 IHRvTG93ZXIoIHVzZUNvbG91ciApOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBtb2RlID09 ICJ5ZXMiICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VD b2xvdXI6OlllczsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbW9kZSA9PSAibm8iICkK KyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6Ok5v OworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBtb2RlID09ICJhdXRvIiApCisgICAgICAg ICAgICAgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpBdXRvOworICAg ICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFy c2VyUmVzdWx0OjpydW50aW1lRXJyb3IoICJjb2xvdXIgbW9kZSBtdXN0IGJlIG9uZSBvZjogYXV0 bywgeWVzIG9yIG5vLiAnIiArIHVzZUNvbG91ciArICInIG5vdCByZWNvZ25pc2VkIiApOworICAg ICAgICAgICAgICAgIHJldHVybiBQYXJzZXJSZXN1bHQ6Om9rKCBQYXJzZVJlc3VsdFR5cGU6Ok1h dGNoZWQgKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIGF1dG8gY29uc3Qgc2V0V2FpdEZvcktl eXByZXNzID0gWyZdKCBzdGQ6OnN0cmluZyBjb25zdCYga2V5cHJlc3MgKSB7CisgICAgICAgICAg ICAgICAgYXV0byBrZXlwcmVzc0xjID0gdG9Mb3dlcigga2V5cHJlc3MgKTsKKyAgICAgICAgICAg ICAgICBpZiAoa2V5cHJlc3NMYyA9PSAibmV2ZXIiKQorICAgICAgICAgICAgICAgICAgICBjb25m aWcud2FpdEZvcktleXByZXNzID0gV2FpdEZvcktleXByZXNzOjpOZXZlcjsKKyAgICAgICAgICAg ICAgICBlbHNlIGlmKCBrZXlwcmVzc0xjID09ICJzdGFydCIgKQorICAgICAgICAgICAgICAgICAg ICBjb25maWcud2FpdEZvcktleXByZXNzID0gV2FpdEZvcktleXByZXNzOjpCZWZvcmVTdGFydDsK KyAgICAgICAgICAgICAgICBlbHNlIGlmKCBrZXlwcmVzc0xjID09ICJleGl0IiApCisgICAgICAg ICAgICAgICAgICAgIGNvbmZpZy53YWl0Rm9yS2V5cHJlc3MgPSBXYWl0Rm9yS2V5cHJlc3M6OkJl Zm9yZUV4aXQ7CisgICAgICAgICAgICAgICAgZWxzZSBpZigga2V5cHJlc3NMYyA9PSAiYm90aCIg KQorICAgICAgICAgICAgICAgICAgICBjb25maWcud2FpdEZvcktleXByZXNzID0gV2FpdEZvcktl eXByZXNzOjpCZWZvcmVTdGFydEFuZEV4aXQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAg ICAgICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0OjpydW50aW1lRXJyb3IoICJrZXlwcmVz cyBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZjogbmV2ZXIsIHN0YXJ0LCBleGl0IG9yIGJvdGguICci ICsga2V5cHJlc3MgKyAiJyBub3QgcmVjb2duaXNlZCIgKTsKKyAgICAgICAgICAgIHJldHVybiBQ YXJzZXJSZXN1bHQ6Om9rKCBQYXJzZVJlc3VsdFR5cGU6Ok1hdGNoZWQgKTsKKyAgICAgICAgICAg IH07CisgICAgICAgIGF1dG8gY29uc3Qgc2V0VmVyYm9zaXR5ID0gWyZdKCBzdGQ6OnN0cmluZyBj b25zdCYgdmVyYm9zaXR5ICkgeworICAgICAgICAgICAgYXV0byBsY1ZlcmJvc2l0eSA9IHRvTG93 ZXIoIHZlcmJvc2l0eSApOworICAgICAgICAgICAgaWYoIGxjVmVyYm9zaXR5ID09ICJxdWlldCIg KQorICAgICAgICAgICAgICAgIGNvbmZpZy52ZXJib3NpdHkgPSBWZXJib3NpdHk6OlF1aWV0Owor ICAgICAgICAgICAgZWxzZSBpZiggbGNWZXJib3NpdHkgPT0gIm5vcm1hbCIgKQorICAgICAgICAg ICAgICAgIGNvbmZpZy52ZXJib3NpdHkgPSBWZXJib3NpdHk6Ok5vcm1hbDsKKyAgICAgICAgICAg IGVsc2UgaWYoIGxjVmVyYm9zaXR5ID09ICJoaWdoIiApCisgICAgICAgICAgICAgICAgY29uZmln LnZlcmJvc2l0eSA9IFZlcmJvc2l0eTo6SGlnaDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg ICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0OjpydW50aW1lRXJyb3IoICJVbnJlY29nbmlzZWQg dmVyYm9zaXR5LCAnIiArIHZlcmJvc2l0eSArICInIiApOworICAgICAgICAgICAgcmV0dXJuIFBh cnNlclJlc3VsdDo6b2soIFBhcnNlUmVzdWx0VHlwZTo6TWF0Y2hlZCApOworICAgICAgICB9Owor ICAgICAgICBhdXRvIGNvbnN0IHNldFJlcG9ydGVyID0gWyZdKCBzdGQ6OnN0cmluZyBjb25zdCYg cmVwb3J0ZXIgKSB7CisgICAgICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6RmFjdG9yeU1hcCBj b25zdCYgZmFjdG9yaWVzID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCku Z2V0RmFjdG9yaWVzKCk7CisKKyAgICAgICAgICAgIGF1dG8gbGNSZXBvcnRlciA9IHRvTG93ZXIo IHJlcG9ydGVyICk7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGZhY3Rvcmllcy5maW5kKCBs Y1JlcG9ydGVyICk7CisKKyAgICAgICAgICAgIGlmKCBmYWN0b3JpZXMuZW5kKCkgIT0gcmVzdWx0 ICkKKyAgICAgICAgICAgICAgICBjb25maWcucmVwb3J0ZXJOYW1lID0gbGNSZXBvcnRlcjsKKyAg ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0OjpydW50 aW1lRXJyb3IoICJVbnJlY29nbml6ZWQgcmVwb3J0ZXIsICciICsgcmVwb3J0ZXIgKyAiJy4gQ2hl Y2sgYXZhaWxhYmxlIHdpdGggLS1saXN0LXJlcG9ydGVycyIgKTsKKyAgICAgICAgICAgIHJldHVy biBQYXJzZXJSZXN1bHQ6Om9rKCBQYXJzZVJlc3VsdFR5cGU6Ok1hdGNoZWQgKTsKKyAgICAgICAg fTsKKworICAgICAgICBhdXRvIGNsaQorICAgICAgICAgICAgPSBFeGVOYW1lKCBjb25maWcucHJv Y2Vzc05hbWUgKQorICAgICAgICAgICAgfCBIZWxwKCBjb25maWcuc2hvd0hlbHAgKQorICAgICAg ICAgICAgfCBPcHQoIGNvbmZpZy5saXN0VGVzdHMgKQorICAgICAgICAgICAgICAgIFsiLWwiXVsi LS1saXN0LXRlc3RzIl0KKyAgICAgICAgICAgICAgICAoICJsaXN0IGFsbC9tYXRjaGluZyB0ZXN0 IGNhc2VzIiApCisgICAgICAgICAgICB8IE9wdCggY29uZmlnLmxpc3RUYWdzICkKKyAgICAgICAg ICAgICAgICBbIi10Il1bIi0tbGlzdC10YWdzIl0KKyAgICAgICAgICAgICAgICAoICJsaXN0IGFs bC9tYXRjaGluZyB0YWdzIiApCisgICAgICAgICAgICB8IE9wdCggY29uZmlnLnNob3dTdWNjZXNz ZnVsVGVzdHMgKQorICAgICAgICAgICAgICAgIFsiLXMiXVsiLS1zdWNjZXNzIl0KKyAgICAgICAg ICAgICAgICAoICJpbmNsdWRlIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gb3V0cHV0IiApCisgICAgICAg ICAgICB8IE9wdCggY29uZmlnLnNob3VsZERlYnVnQnJlYWsgKQorICAgICAgICAgICAgICAgIFsi LWIiXVsiLS1icmVhayJdCisgICAgICAgICAgICAgICAgKCAiYnJlYWsgaW50byBkZWJ1Z2dlciBv biBmYWlsdXJlIiApCisgICAgICAgICAgICB8IE9wdCggY29uZmlnLm5vVGhyb3cgKQorICAgICAg ICAgICAgICAgIFsiLWUiXVsiLS1ub3Rocm93Il0KKyAgICAgICAgICAgICAgICAoICJza2lwIGV4 Y2VwdGlvbiB0ZXN0cyIgKQorICAgICAgICAgICAgfCBPcHQoIGNvbmZpZy5zaG93SW52aXNpYmxl cyApCisgICAgICAgICAgICAgICAgWyItaSJdWyItLWludmlzaWJsZXMiXQorICAgICAgICAgICAg ICAgICggInNob3cgaW52aXNpYmxlcyAodGFicywgbmV3bGluZXMpIiApCisgICAgICAgICAgICB8 IE9wdCggY29uZmlnLm91dHB1dEZpbGVuYW1lLCAiZmlsZW5hbWUiICkKKyAgICAgICAgICAgICAg ICBbIi1vIl1bIi0tb3V0Il0KKyAgICAgICAgICAgICAgICAoICJvdXRwdXQgZmlsZW5hbWUiICkK KyAgICAgICAgICAgIHwgT3B0KCBzZXRSZXBvcnRlciwgIm5hbWUiICkKKyAgICAgICAgICAgICAg ICBbIi1yIl1bIi0tcmVwb3J0ZXIiXQorICAgICAgICAgICAgICAgICggInJlcG9ydGVyIHRvIHVz ZSAoZGVmYXVsdHMgdG8gY29uc29sZSkiICkKKyAgICAgICAgICAgIHwgT3B0KCBjb25maWcubmFt ZSwgIm5hbWUiICkKKyAgICAgICAgICAgICAgICBbIi1uIl1bIi0tbmFtZSJdCisgICAgICAgICAg ICAgICAgKCAic3VpdGUgbmFtZSIgKQorICAgICAgICAgICAgfCBPcHQoIFsmXSggYm9vbCApeyBj b25maWcuYWJvcnRBZnRlciA9IDE7IH0gKQorICAgICAgICAgICAgICAgIFsiLWEiXVsiLS1hYm9y dCJdCisgICAgICAgICAgICAgICAgKCAiYWJvcnQgYXQgZmlyc3QgZmFpbHVyZSIgKQorICAgICAg ICAgICAgfCBPcHQoIFsmXSggaW50IHggKXsgY29uZmlnLmFib3J0QWZ0ZXIgPSB4OyB9LCAibm8u IGZhaWx1cmVzIiApCisgICAgICAgICAgICAgICAgWyIteCJdWyItLWFib3J0eCJdCisgICAgICAg ICAgICAgICAgKCAiYWJvcnQgYWZ0ZXIgeCBmYWlsdXJlcyIgKQorICAgICAgICAgICAgfCBPcHQo IHNldFdhcm5pbmcsICJ3YXJuaW5nIG5hbWUiICkKKyAgICAgICAgICAgICAgICBbIi13Il1bIi0t d2FybiJdCisgICAgICAgICAgICAgICAgKCAiZW5hYmxlIHdhcm5pbmdzIiApCisgICAgICAgICAg ICB8IE9wdCggWyZdKCBib29sIGZsYWcgKSB7IGNvbmZpZy5zaG93RHVyYXRpb25zID0gZmxhZyA/ IFNob3dEdXJhdGlvbnM6OkFsd2F5cyA6IFNob3dEdXJhdGlvbnM6Ok5ldmVyOyB9LCAieWVzfG5v IiApCisgICAgICAgICAgICAgICAgWyItZCJdWyItLWR1cmF0aW9ucyJdCisgICAgICAgICAgICAg ICAgKCAic2hvdyB0ZXN0IGR1cmF0aW9ucyIgKQorICAgICAgICAgICAgfCBPcHQoIGNvbmZpZy5t aW5EdXJhdGlvbiwgInNlY29uZHMiICkKKyAgICAgICAgICAgICAgICBbIi1EIl1bIi0tbWluLWR1 cmF0aW9uIl0KKyAgICAgICAgICAgICAgICAoICJzaG93IHRlc3QgZHVyYXRpb25zIGZvciB0ZXN0 cyB0YWtpbmcgYXQgbGVhc3QgdGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzIiApCisgICAgICAg ICAgICB8IE9wdCggbG9hZFRlc3ROYW1lc0Zyb21GaWxlLCAiZmlsZW5hbWUiICkKKyAgICAgICAg ICAgICAgICBbIi1mIl1bIi0taW5wdXQtZmlsZSJdCisgICAgICAgICAgICAgICAgKCAibG9hZCB0 ZXN0IG5hbWVzIHRvIHJ1biBmcm9tIGEgZmlsZSIgKQorICAgICAgICAgICAgfCBPcHQoIGNvbmZp Zy5maWxlbmFtZXNBc1RhZ3MgKQorICAgICAgICAgICAgICAgIFsiLSMiXVsiLS1maWxlbmFtZXMt YXMtdGFncyJdCisgICAgICAgICAgICAgICAgKCAiYWRkcyBhIHRhZyBmb3IgdGhlIGZpbGVuYW1l IiApCisgICAgICAgICAgICB8IE9wdCggY29uZmlnLnNlY3Rpb25zVG9SdW4sICJzZWN0aW9uIG5h bWUiICkKKyAgICAgICAgICAgICAgICBbIi1jIl1bIi0tc2VjdGlvbiJdCisgICAgICAgICAgICAg ICAgKCAic3BlY2lmeSBzZWN0aW9uIHRvIHJ1biIgKQorICAgICAgICAgICAgfCBPcHQoIHNldFZl cmJvc2l0eSwgInF1aWV0fG5vcm1hbHxoaWdoIiApCisgICAgICAgICAgICAgICAgWyItdiJdWyIt LXZlcmJvc2l0eSJdCisgICAgICAgICAgICAgICAgKCAic2V0IG91dHB1dCB2ZXJib3NpdHkiICkK KyAgICAgICAgICAgIHwgT3B0KCBjb25maWcubGlzdFRlc3ROYW1lc09ubHkgKQorICAgICAgICAg ICAgICAgIFsiLS1saXN0LXRlc3QtbmFtZXMtb25seSJdCisgICAgICAgICAgICAgICAgKCAibGlz dCBhbGwvbWF0Y2hpbmcgdGVzdCBjYXNlcyBuYW1lcyBvbmx5IiApCisgICAgICAgICAgICB8IE9w dCggY29uZmlnLmxpc3RSZXBvcnRlcnMgKQorICAgICAgICAgICAgICAgIFsiLS1saXN0LXJlcG9y dGVycyJdCisgICAgICAgICAgICAgICAgKCAibGlzdCBhbGwgcmVwb3J0ZXJzIiApCisgICAgICAg ICAgICB8IE9wdCggc2V0VGVzdE9yZGVyLCAiZGVjbHxsZXh8cmFuZCIgKQorICAgICAgICAgICAg ICAgIFsiLS1vcmRlciJdCisgICAgICAgICAgICAgICAgKCAidGVzdCBjYXNlIG9yZGVyIChkZWZh dWx0cyB0byBkZWNsKSIgKQorICAgICAgICAgICAgfCBPcHQoIHNldFJuZ1NlZWQsICIndGltZSd8 bnVtYmVyIiApCisgICAgICAgICAgICAgICAgWyItLXJuZy1zZWVkIl0KKyAgICAgICAgICAgICAg ICAoICJzZXQgYSBzcGVjaWZpYyBzZWVkIGZvciByYW5kb20gbnVtYmVycyIgKQorICAgICAgICAg ICAgfCBPcHQoIHNldENvbG91clVzYWdlLCAieWVzfG5vIiApCisgICAgICAgICAgICAgICAgWyIt LXVzZS1jb2xvdXIiXQorICAgICAgICAgICAgICAgICggInNob3VsZCBvdXRwdXQgYmUgY29sb3Vy aXNlZCIgKQorICAgICAgICAgICAgfCBPcHQoIGNvbmZpZy5saWJJZGVudGlmeSApCisgICAgICAg ICAgICAgICAgWyItLWxpYmlkZW50aWZ5Il0KKyAgICAgICAgICAgICAgICAoICJyZXBvcnQgbmFt ZSBhbmQgdmVyc2lvbiBhY2NvcmRpbmcgdG8gbGliaWRlbnRpZnkgc3RhbmRhcmQiICkKKyAgICAg ICAgICAgIHwgT3B0KCBzZXRXYWl0Rm9yS2V5cHJlc3MsICJuZXZlcnxzdGFydHxleGl0fGJvdGgi ICkKKyAgICAgICAgICAgICAgICBbIi0td2FpdC1mb3Ita2V5cHJlc3MiXQorICAgICAgICAgICAg ICAgICggIndhaXRzIGZvciBhIGtleXByZXNzIGJlZm9yZSBleGl0aW5nIiApCisgICAgICAgICAg ICB8IE9wdCggY29uZmlnLmJlbmNobWFya1NhbXBsZXMsICJzYW1wbGVzIiApCisgICAgICAgICAg ICAgICAgWyItLWJlbmNobWFyay1zYW1wbGVzIl0KKyAgICAgICAgICAgICAgICAoICJudW1iZXIg b2Ygc2FtcGxlcyB0byBjb2xsZWN0IChkZWZhdWx0OiAxMDApIiApCisgICAgICAgICAgICB8IE9w dCggY29uZmlnLmJlbmNobWFya1Jlc2FtcGxlcywgInJlc2FtcGxlcyIgKQorICAgICAgICAgICAg ICAgIFsiLS1iZW5jaG1hcmstcmVzYW1wbGVzIl0KKyAgICAgICAgICAgICAgICAoICJudW1iZXIg b2YgcmVzYW1wbGVzIGZvciB0aGUgYm9vdHN0cmFwIChkZWZhdWx0OiAxMDAwMDApIiApCisgICAg ICAgICAgICB8IE9wdCggY29uZmlnLmJlbmNobWFya0NvbmZpZGVuY2VJbnRlcnZhbCwgImNvbmZp ZGVuY2UgaW50ZXJ2YWwiICkKKyAgICAgICAgICAgICAgICBbIi0tYmVuY2htYXJrLWNvbmZpZGVu Y2UtaW50ZXJ2YWwiXQorICAgICAgICAgICAgICAgICggImNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9y IHRoZSBib290c3RyYXAgKGJldHdlZW4gMCBhbmQgMSwgZGVmYXVsdDogMC45NSkiICkKKyAgICAg ICAgICAgIHwgT3B0KCBjb25maWcuYmVuY2htYXJrTm9BbmFseXNpcyApCisgICAgICAgICAgICAg ICAgWyItLWJlbmNobWFyay1uby1hbmFseXNpcyJdCisgICAgICAgICAgICAgICAgKCAicGVyZm9y bSBvbmx5IG1lYXN1cmVtZW50czsgZG8gbm90IHBlcmZvcm0gYW55IGFuYWx5c2lzIiApCisgICAg ICAgICAgICB8IE9wdCggY29uZmlnLmJlbmNobWFya1dhcm11cFRpbWUsICJiZW5jaG1hcmtXYXJt dXBUaW1lIiApCisgICAgICAgICAgICAgICAgWyItLWJlbmNobWFyay13YXJtdXAtdGltZSJdCisg ICAgICAgICAgICAgICAgKCAiYW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNwZW50IG9u IHdhcm1pbmcgdXAgZWFjaCB0ZXN0IChkZWZhdWx0OiAxMDApIiApCisgICAgICAgICAgICB8IEFy ZyggY29uZmlnLnRlc3RzT3JUYWdzLCAidGVzdCBuYW1lfHBhdHRlcm58dGFncyIgKQorICAgICAg ICAgICAgICAgICggIndoaWNoIHRlc3Qgb3IgdGVzdHMgdG8gdXNlIiApOworCisgICAgICAgIHJl dHVybiBjbGk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKy8vIGVuZCBjYXRj aF9jb21tYW5kbGluZS5jcHAKKy8vIHN0YXJ0IGNhdGNoX2NvbW1vbi5jcHAKKworI2luY2x1ZGUg PGNzdHJpbmc+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAg IGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yID09ICggU291cmNlTGluZUluZm8gY29uc3Qm IG90aGVyICkgY29uc3Qgbm9leGNlcHQgeworICAgICAgICByZXR1cm4gbGluZSA9PSBvdGhlci5s aW5lICYmIChmaWxlID09IG90aGVyLmZpbGUgfHwgc3RkOjpzdHJjbXAoZmlsZSwgb3RoZXIuZmls ZSkgPT0gMCk7CisgICAgfQorICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yIDwgKCBT b3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCBub2V4Y2VwdCB7CisgICAgICAgIC8v IFdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgc2FtZSBmaWxlIHdpbGwgdXN1YWxseSBoYXZlIHRoZSBz YW1lIHBvaW50ZXIuCisgICAgICAgIC8vIFRodXMsIGlmIHRoZSBwb2ludGVycyBhcmUgdGhlIHNh bWUsIHRoZXJlIGlzIG5vIHBvaW50IGluIGNhbGxpbmcgdGhlIHN0cmNtcAorICAgICAgICByZXR1 cm4gbGluZSA8IG90aGVyLmxpbmUgfHwgKCBsaW5lID09IG90aGVyLmxpbmUgJiYgZmlsZSAhPSBv dGhlci5maWxlICYmIChzdGQ6OnN0cmNtcChmaWxlLCBvdGhlci5maWxlKSA8IDApKTsKKyAgICB9 CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291 cmNlTGluZUluZm8gY29uc3QmIGluZm8gKSB7CisjaWZuZGVmIF9fR05VR19fCisgICAgICAgIG9z IDw8IGluZm8uZmlsZSA8PCAnKCcgPDwgaW5mby5saW5lIDw8ICcpJzsKKyNlbHNlCisgICAgICAg IG9zIDw8IGluZm8uZmlsZSA8PCAnOicgPDwgaW5mby5saW5lOworI2VuZGlmCisgICAgICAgIHJl dHVybiBvczsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBTdHJlYW1FbmRTdG9wOjpvcGVyYXRv cisoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIH0KKworICAg IE5vbkNvcHlhYmxlOjpOb25Db3B5YWJsZSgpID0gZGVmYXVsdDsKKyAgICBOb25Db3B5YWJsZTo6 fk5vbkNvcHlhYmxlKCkgPSBkZWZhdWx0OworCit9CisvLyBlbmQgY2F0Y2hfY29tbW9uLmNwcAor Ly8gc3RhcnQgY2F0Y2hfY29uZmlnLmNwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgQ29u ZmlnOjpDb25maWcoIENvbmZpZ0RhdGEgY29uc3QmIGRhdGEgKQorICAgIDogICBtX2RhdGEoIGRh dGEgKSwKKyAgICAgICAgbV9zdHJlYW0oIG9wZW5TdHJlYW0oKSApCisgICAgeworICAgICAgICAv LyBXZSBuZWVkIHRvIHRyaW0gZmlsdGVyIHNwZWNzIHRvIGF2b2lkIHRyb3VibGUgd2l0aCBzdXBl cmZsdW91cworICAgICAgICAvLyB3aGl0ZXNwYWNlIChlc3AuIGltcG9ydGFudCBmb3IgYmRkIG1h Y3JvcywgYXMgdGhvc2UgYXJlIG1hbnVhbGx5CisgICAgICAgIC8vIGFsaWduZWQgd2l0aCB3aGl0 ZXNwYWNlKS4KKworICAgICAgICBmb3IgKGF1dG8mIGVsZW0gOiBtX2RhdGEudGVzdHNPclRhZ3Mp IHsKKyAgICAgICAgICAgIGVsZW0gPSB0cmltKGVsZW0pOworICAgICAgICB9CisgICAgICAgIGZv ciAoYXV0byYgZWxlbSA6IG1fZGF0YS5zZWN0aW9uc1RvUnVuKSB7CisgICAgICAgICAgICBlbGVt ID0gdHJpbShlbGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RTcGVjUGFyc2VyIHBhcnNl cihJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkpOworICAgICAgICBpZiAoIW1fZGF0YS50ZXN0c09y VGFncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtX2hhc1Rlc3RGaWx0ZXJzID0gdHJ1ZTsKKyAg ICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgdGVzdE9yVGFncyA6IG1fZGF0YS50ZXN0c09yVGFn cykgeworICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZSh0ZXN0T3JUYWdzKTsKKyAgICAgICAg ICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX3Rlc3RTcGVjID0gcGFyc2VyLnRlc3RTcGVjKCk7 CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIENvbmZpZzo6Z2V0RmlsZW5hbWUoKSBj b25zdCB7CisgICAgICAgIHJldHVybiBtX2RhdGEub3V0cHV0RmlsZW5hbWUgOworICAgIH0KKwor ICAgIGJvb2wgQ29uZmlnOjpsaXN0VGVzdHMoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBtX2Rh dGEubGlzdFRlc3RzOyB9CisgICAgYm9vbCBDb25maWc6Omxpc3RUZXN0TmFtZXNPbmx5KCkgY29u c3QgIHsgcmV0dXJuIG1fZGF0YS5saXN0VGVzdE5hbWVzT25seTsgfQorICAgIGJvb2wgQ29uZmln OjpsaXN0VGFncygpIGNvbnN0ICAgICAgICAgICB7IHJldHVybiBtX2RhdGEubGlzdFRhZ3M7IH0K KyAgICBib29sIENvbmZpZzo6bGlzdFJlcG9ydGVycygpIGNvbnN0ICAgICAgeyByZXR1cm4gbV9k YXRhLmxpc3RSZXBvcnRlcnM7IH0KKworICAgIHN0ZDo6c3RyaW5nIENvbmZpZzo6Z2V0UHJvY2Vz c05hbWUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEucHJvY2Vzc05hbWU7IH0KKyAgICBzdGQ6OnN0 cmluZyBjb25zdCYgQ29uZmlnOjpnZXRSZXBvcnRlck5hbWUoKSBjb25zdCB7IHJldHVybiBtX2Rh dGEucmVwb3J0ZXJOYW1lOyB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3Qm IENvbmZpZzo6Z2V0VGVzdHNPclRhZ3MoKSBjb25zdCB7IHJldHVybiBtX2RhdGEudGVzdHNPclRh Z3M7IH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIENvbmZpZzo6Z2V0U2Vj dGlvbnNUb1J1bigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5zZWN0aW9uc1RvUnVuOyB9CisKKyAg ICBUZXN0U3BlYyBjb25zdCYgQ29uZmlnOjp0ZXN0U3BlYygpIGNvbnN0IHsgcmV0dXJuIG1fdGVz dFNwZWM7IH0KKyAgICBib29sIENvbmZpZzo6aGFzVGVzdEZpbHRlcnMoKSBjb25zdCB7IHJldHVy biBtX2hhc1Rlc3RGaWx0ZXJzOyB9CisKKyAgICBib29sIENvbmZpZzo6c2hvd0hlbHAoKSBjb25z dCB7IHJldHVybiBtX2RhdGEuc2hvd0hlbHA7IH0KKworICAgIC8vIElDb25maWcgaW50ZXJmYWNl CisgICAgYm9vbCBDb25maWc6OmFsbG93VGhyb3dzKCkgY29uc3QgICAgICAgICAgICAgICAgICAg eyByZXR1cm4gIW1fZGF0YS5ub1Rocm93OyB9CisgICAgc3RkOjpvc3RyZWFtJiBDb25maWc6OnN0 cmVhbSgpIGNvbnN0ICAgICAgICAgICAgICAgeyByZXR1cm4gbV9zdHJlYW0tPnN0cmVhbSgpOyB9 CisgICAgc3RkOjpzdHJpbmcgQ29uZmlnOjpuYW1lKCkgY29uc3QgICAgICAgICAgICAgICAgICAg eyByZXR1cm4gbV9kYXRhLm5hbWUuZW1wdHkoKSA/IG1fZGF0YS5wcm9jZXNzTmFtZSA6IG1fZGF0 YS5uYW1lOyB9CisgICAgYm9vbCBDb25maWc6OmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNv bnN0ICAgICAgeyByZXR1cm4gbV9kYXRhLnNob3dTdWNjZXNzZnVsVGVzdHM7IH0KKyAgICBib29s IENvbmZpZzo6d2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSBjb25zdCAgICB7IHJldHVybiAh IShtX2RhdGEud2FybmluZ3MgJiBXYXJuQWJvdXQ6Ok5vQXNzZXJ0aW9ucyk7IH0KKyAgICBib29s IENvbmZpZzo6d2FybkFib3V0Tm9UZXN0cygpIGNvbnN0ICAgICAgICAgICAgICB7IHJldHVybiAh IShtX2RhdGEud2FybmluZ3MgJiBXYXJuQWJvdXQ6Ok5vVGVzdHMpOyB9CisgICAgU2hvd0R1cmF0 aW9uczo6T3JOb3QgQ29uZmlnOjpzaG93RHVyYXRpb25zKCkgY29uc3QgeyByZXR1cm4gbV9kYXRh LnNob3dEdXJhdGlvbnM7IH0KKyAgICBkb3VibGUgQ29uZmlnOjptaW5EdXJhdGlvbigpIGNvbnN0 ICAgICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEubWluRHVyYXRpb247IH0KKyAgICBSdW5U ZXN0czo6SW5XaGF0T3JkZXIgQ29uZmlnOjpydW5PcmRlcigpIGNvbnN0ICAgICB7IHJldHVybiBt X2RhdGEucnVuT3JkZXI7IH0KKyAgICB1bnNpZ25lZCBpbnQgQ29uZmlnOjpybmdTZWVkKCkgY29u c3QgICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEucm5nU2VlZDsgfQorICAgIFVzZUNvbG91 cjo6WWVzT3JObyBDb25maWc6OnVzZUNvbG91cigpIGNvbnN0ICAgICAgIHsgcmV0dXJuIG1fZGF0 YS51c2VDb2xvdXI7IH0KKyAgICBib29sIENvbmZpZzo6c2hvdWxkRGVidWdCcmVhaygpIGNvbnN0 ICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEuc2hvdWxkRGVidWdCcmVhazsgfQorICAgIGlu dCBDb25maWc6OmFib3J0QWZ0ZXIoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJu IG1fZGF0YS5hYm9ydEFmdGVyOyB9CisgICAgYm9vbCBDb25maWc6OnNob3dJbnZpc2libGVzKCkg Y29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9kYXRhLnNob3dJbnZpc2libGVzOyB9Cisg ICAgVmVyYm9zaXR5IENvbmZpZzo6dmVyYm9zaXR5KCkgY29uc3QgICAgICAgICAgICAgICAgeyBy ZXR1cm4gbV9kYXRhLnZlcmJvc2l0eTsgfQorCisgICAgYm9vbCBDb25maWc6OmJlbmNobWFya05v QW5hbHlzaXMoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEuYmVu Y2htYXJrTm9BbmFseXNpczsgfQorICAgIGludCBDb25maWc6OmJlbmNobWFya1NhbXBsZXMoKSBj b25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9kYXRhLmJlbmNobWFya1Nh bXBsZXM7IH0KKyAgICBkb3VibGUgQ29uZmlnOjpiZW5jaG1hcmtDb25maWRlbmNlSW50ZXJ2YWwo KSBjb25zdCAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5iZW5jaG1hcmtDb25maWRlbmNlSW50 ZXJ2YWw7IH0KKyAgICB1bnNpZ25lZCBpbnQgQ29uZmlnOjpiZW5jaG1hcmtSZXNhbXBsZXMoKSBj b25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5iZW5jaG1hcmtSZXNhbXBsZXM7IH0K KyAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIENvbmZpZzo6YmVuY2htYXJrV2FybXVwVGlt ZSgpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMobV9kYXRhLmJlbmNo bWFya1dhcm11cFRpbWUpOyB9CisKKyAgICBJU3RyZWFtIGNvbnN0KiBDb25maWc6Om9wZW5TdHJl YW0oKSB7CisgICAgICAgIHJldHVybiBDYXRjaDo6bWFrZVN0cmVhbShtX2RhdGEub3V0cHV0Rmls ZW5hbWUpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisvLyBlbmQgY2F0Y2hf Y29uZmlnLmNwcAorLy8gc3RhcnQgY2F0Y2hfY29uc29sZV9jb2xvdXIuY3BwCisKKyNpZiBkZWZp bmVkKF9fY2xhbmdfXykKKyMgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorIyAgICBw cmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2V4aXQtdGltZS1kZXN0cnVjdG9ycyIK KyNlbmRpZgorCisvLyBzdGFydCBjYXRjaF9lcnJub19ndWFyZC5oCisKK25hbWVzcGFjZSBDYXRj aCB7CisKKyAgICBjbGFzcyBFcnJub0d1YXJkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVycm5v R3VhcmQoKTsKKyAgICAgICAgfkVycm5vR3VhcmQoKTsKKyAgICBwcml2YXRlOgorICAgICAgICBp bnQgbV9vbGRFcnJubzsKKyAgICB9OworCit9CisKKy8vIGVuZCBjYXRjaF9lcnJub19ndWFyZC5o CisvLyBzdGFydCBjYXRjaF93aW5kb3dzX2hfcHJveHkuaAorCisKKyNpZiBkZWZpbmVkKENBVENI X1BMQVRGT1JNX1dJTkRPV1MpCisKKyNpZiAhZGVmaW5lZChOT01JTk1BWCkgJiYgIWRlZmluZWQo Q0FUQ0hfQ09ORklHX05PX05PTUlOTUFYKQorIyAgZGVmaW5lIENBVENIX0RFRklORURfTk9NSU5N QVgKKyMgIGRlZmluZSBOT01JTk1BWAorI2VuZGlmCisjaWYgIWRlZmluZWQoV0lOMzJfTEVBTl9B TkRfTUVBTikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dJTjMyX0xFQU5fQU5EX01FQU4p CisjICBkZWZpbmUgQ0FUQ0hfREVGSU5FRF9XSU4zMl9MRUFOX0FORF9NRUFOCisjICBkZWZpbmUg V0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisKKyNpZmRlZiBfX0FGWERMTAorI2luY2x1ZGUg PEFmeFdpbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmZGVm IENBVENIX0RFRklORURfTk9NSU5NQVgKKyMgIHVuZGVmIE5PTUlOTUFYCisjZW5kaWYKKyNpZmRl ZiBDQVRDSF9ERUZJTkVEX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIHVuZGVmIFdJTjMyX0xFQU5f QU5EX01FQU4KKyNlbmRpZgorCisjZW5kaWYgLy8gZGVmaW5lZChDQVRDSF9QTEFURk9STV9XSU5E T1dTKQorCisvLyBlbmQgY2F0Y2hfd2luZG93c19oX3Byb3h5LmgKKyNpbmNsdWRlIDxzc3RyZWFt PgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVzcGFjZSB7CisKKyAgICAgICAgc3RydWN0 IElDb2xvdXJJbXBsIHsKKyAgICAgICAgICAgIHZpcnR1YWwgfklDb2xvdXJJbXBsKCkgPSBkZWZh dWx0OworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJD b2RlICkgPSAwOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBOb0NvbG91ckltcGwgOiBJ Q29sb3VySW1wbCB7CisgICAgICAgICAgICB2b2lkIHVzZSggQ29sb3VyOjpDb2RlICkgb3ZlcnJp ZGUge30KKworICAgICAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbnN0YW5jZSgpIHsKKyAg ICAgICAgICAgICAgICBzdGF0aWMgTm9Db2xvdXJJbXBsIHNfaW5zdGFuY2U7CisgICAgICAgICAg ICAgICAgcmV0dXJuICZzX2luc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisg ICAgfSAvLyBhbm9uIG5hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmICFkZWZp bmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX05PTkUgKSAmJiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklH X0NPTE9VUl9XSU5ET1dTICkgJiYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSSAp CisjICAgaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworIyAgICAgICBkZWZpbmUgQ0FUQ0hf Q09ORklHX0NPTE9VUl9XSU5ET1dTCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09O RklHX0NPTE9VUl9BTlNJCisjICAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoIENBVENI X0NPTkZJR19DT0xPVVJfV0lORE9XUyApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgeworCisgICAgY2xhc3Mg V2luMzJDb2xvdXJJbXBsIDogcHVibGljIElDb2xvdXJJbXBsIHsKKyAgICBwdWJsaWM6CisgICAg ICAgIFdpbjMyQ29sb3VySW1wbCgpIDogc3Rkb3V0SGFuZGxlKCBHZXRTdGRIYW5kbGUoU1REX09V VFBVVF9IQU5ETEUpICkKKyAgICAgICAgeworICAgICAgICAgICAgQ09OU09MRV9TQ1JFRU5fQlVG RkVSX0lORk8gY3NiaUluZm87CisgICAgICAgICAgICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5m byggc3Rkb3V0SGFuZGxlLCAmY3NiaUluZm8gKTsKKyAgICAgICAgICAgIG9yaWdpbmFsRm9yZWdy b3VuZEF0dHJpYnV0ZXMgPSBjc2JpSW5mby53QXR0cmlidXRlcyAmIH4oIEJBQ0tHUk9VTkRfR1JF RU4gfCBCQUNLR1JPVU5EX1JFRCB8IEJBQ0tHUk9VTkRfQkxVRSB8IEJBQ0tHUk9VTkRfSU5URU5T SVRZICk7CisgICAgICAgICAgICBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzID0gY3NiaUlu Zm8ud0F0dHJpYnV0ZXMgJiB+KCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBG T1JFR1JPVU5EX0JMVUUgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICB9CisKKyAg ICAgICAgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApIG92ZXJyaWRlIHsKKyAg ICAgICAgICAgIHN3aXRjaCggX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBD b2xvdXI6Ok5vbmU6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIG9yaWdpbmFsRm9yZWdy b3VuZEF0dHJpYnV0ZXMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAg ICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRf UkVEIHwgRk9SRUdST1VORF9CTFVFICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlJl ZDogICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfUkVEICk7CisgICAg ICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1 dGUoIEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1 ZTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9CTFVFICk7CisgICAg ICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkN5YW46ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1 dGUoIEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAg ICBjYXNlIENvbG91cjo6WWVsbG93OiAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdS T1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xv dXI6OkdyZXk6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIDAgKTsKKworICAgICAgICAg ICAgICAgIGNhc2UgQ29sb3VyOjpMaWdodEdyZXk6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0 ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6 QnJpZ2h0UmVkOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5T SVRZIHwgRk9SRUdST1VORF9SRUQgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJp Z2h0R3JlZW46ICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZ IHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmln aHRXaGl0ZTogICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkg fCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgKTsK KyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0WWVsbG93OiAgcmV0dXJuIHNldFRl eHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9SRUQgfCBGT1JF R1JPVU5EX0dSRUVOICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0OiBD QVRDSF9JTlRFUk5BTF9FUlJPUiggIm5vdCBhIGNvbG91ciIgKTsKKworICAgICAgICAgICAgICAg IGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIENBVENIX0VSUk9SKCAiVW5rbm93biBjb2xv dXIgcmVxdWVzdGVkIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRl OgorICAgICAgICB2b2lkIHNldFRleHRBdHRyaWJ1dGUoIFdPUkQgX3RleHRBdHRyaWJ1dGUgKSB7 CisgICAgICAgICAgICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZSggc3Rkb3V0SGFuZGxlLCBfdGV4 dEF0dHJpYnV0ZSB8IG9yaWdpbmFsQmFja2dyb3VuZEF0dHJpYnV0ZXMgKTsKKyAgICAgICAgfQor ICAgICAgICBIQU5ETEUgc3Rkb3V0SGFuZGxlOworICAgICAgICBXT1JEIG9yaWdpbmFsRm9yZWdy b3VuZEF0dHJpYnV0ZXM7CisgICAgICAgIFdPUkQgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRl czsKKyAgICB9OworCisgICAgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7 CisgICAgICAgIHN0YXRpYyBXaW4zMkNvbG91ckltcGwgc19pbnN0YW5jZTsKKworICAgICAgICBJ Q29uZmlnUHRyIGNvbmZpZyA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCk7CisgICAg ICAgIFVzZUNvbG91cjo6WWVzT3JObyBjb2xvdXJNb2RlID0gY29uZmlnCisgICAgICAgICAgICA/ IGNvbmZpZy0+dXNlQ29sb3VyKCkKKyAgICAgICAgICAgIDogVXNlQ29sb3VyOjpBdXRvOworICAg ICAgICBpZiggY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OkF1dG8gKQorICAgICAgICAgICAgY29s b3VyTW9kZSA9IFVzZUNvbG91cjo6WWVzOworICAgICAgICByZXR1cm4gY29sb3VyTW9kZSA9PSBV c2VDb2xvdXI6OlllcworICAgICAgICAgICAgPyAmc19pbnN0YW5jZQorICAgICAgICAgICAgOiBO b0NvbG91ckltcGw6Omluc3RhbmNlKCk7CisgICAgfQorCit9IC8vIGVuZCBhbm9uIG5hbWVzcGFj ZQorfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbGlmIGRlZmluZWQoIENBVENIX0NPTkZJ R19DT0xPVVJfQU5TSSApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisK KyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSB7CisK KyAgICAvLyB1c2UgUE9TSVgvIEFOU0kgY29uc29sZSB0ZXJtaW5hbCBjb2RlcworICAgIC8vIFRo YW5rcyB0byBBZGFtIFN0cnplbGVja2kgZm9yIG9yaWdpbmFsIGNvbnRyaWJ1dGlvbgorICAgIC8v IChodHRwOi8vZ2l0aHViLmNvbS9uYW5vYW50KQorICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9w aGlsc3F1YXJlZC9DYXRjaC9wdWxsLzEzMQorICAgIGNsYXNzIFBvc2l4Q29sb3VySW1wbCA6IHB1 YmxpYyBJQ29sb3VySW1wbCB7CisgICAgcHVibGljOgorICAgICAgICB2b2lkIHVzZSggQ29sb3Vy OjpDb2RlIF9jb2xvdXJDb2RlICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3dpdGNoKCBfY29s b3VyQ29kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Tm9uZToKKyAgICAgICAg ICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzBtIiAp OworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpSZWQ6ICAgICAgIHJldHVybiBzZXRDb2xv dXIoICJbMDszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAg cmV0dXJuIHNldENvbG91ciggIlswOzMybSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91 cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzRtIiApOworICAgICAgICAgICAg ICAgIGNhc2UgQ29sb3VyOjpDeWFuOiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszNm0iICk7 CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlllbGxvdzogICAgcmV0dXJuIHNldENvbG91 ciggIlswOzMzbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JleTogICAgICBy ZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzBtIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xv dXI6OkxpZ2h0R3JleTogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszN20iICk7CisgICAgICAg ICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFJlZDogICAgIHJldHVybiBzZXRDb2xvdXIoICJb MTszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodEdyZWVuOiAgIHJl dHVybiBzZXRDb2xvdXIoICJbMTszMm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6 OkJyaWdodFdoaXRlOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszN20iICk7CisgICAgICAgICAg ICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFllbGxvdzogIHJldHVybiBzZXRDb2xvdXIoICJbMTsz M20iICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0OiBDQVRDSF9JTlRF Uk5BTF9FUlJPUiggIm5vdCBhIGNvbG91ciIgKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBD QVRDSF9JTlRFUk5BTF9FUlJPUiggIlVua25vd24gY29sb3VyIHJlcXVlc3RlZCIgKTsKKyAgICAg ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgSUNvbG91ckltcGwqIGluc3RhbmNl KCkgeworICAgICAgICAgICAgc3RhdGljIFBvc2l4Q29sb3VySW1wbCBzX2luc3RhbmNlOworICAg ICAgICAgICAgcmV0dXJuICZzX2luc3RhbmNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgor ICAgICAgICB2b2lkIHNldENvbG91ciggY29uc3QgY2hhciogX2VzY2FwZUNvZGUgKSB7CisgICAg ICAgICAgICBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5zdHJlYW0oKQorICAgICAg ICAgICAgICAgIDw8ICdcMDMzJyA8PCBfZXNjYXBlQ29kZTsKKyAgICAgICAgfQorICAgIH07CisK KyAgICBib29sIHVzZUNvbG91ck9uUGxhdGZvcm0oKSB7CisgICAgICAgIHJldHVybgorI2lmIGRl ZmluZWQoQ0FUQ0hfUExBVEZPUk1fTUFDKSB8fCBkZWZpbmVkKENBVENIX1BMQVRGT1JNX0lQSE9O RSkKKyAgICAgICAgICAgICFpc0RlYnVnZ2VyQWN0aXZlKCkgJiYKKyNlbmRpZgorI2lmICEoZGVm aW5lZChfX0RKR1BQX18pICYmIGRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSkKKyAgICAgICAgICAg IGlzYXR0eShTVERPVVRfRklMRU5PKQorI2Vsc2UKKyAgICAgICAgICAgIGZhbHNlCisjZW5kaWYK KyAgICAgICAgICAgIDsKKyAgICB9CisgICAgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5z dGFuY2UoKSB7CisgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisgICAgICAgIElDb25maWdQdHIg Y29uZmlnID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKTsKKyAgICAgICAgVXNlQ29s b3VyOjpZZXNPck5vIGNvbG91ck1vZGUgPSBjb25maWcKKyAgICAgICAgICAgID8gY29uZmlnLT51 c2VDb2xvdXIoKQorICAgICAgICAgICAgOiBVc2VDb2xvdXI6OkF1dG87CisgICAgICAgIGlmKCBj b2xvdXJNb2RlID09IFVzZUNvbG91cjo6QXV0byApCisgICAgICAgICAgICBjb2xvdXJNb2RlID0g dXNlQ29sb3VyT25QbGF0Zm9ybSgpCisgICAgICAgICAgICAgICAgPyBVc2VDb2xvdXI6Olllcwor ICAgICAgICAgICAgICAgIDogVXNlQ29sb3VyOjpObzsKKyAgICAgICAgcmV0dXJuIGNvbG91ck1v ZGUgPT0gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgID8gUG9zaXhDb2xvdXJJbXBsOjppbnN0 YW5jZSgpCisgICAgICAgICAgICA6IE5vQ29sb3VySW1wbDo6aW5zdGFuY2UoKTsKKyAgICB9CisK K30gLy8gZW5kIGFub24gbmFtZXNwYWNlCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2Vs c2UgIC8vIG5vdCBXaW5kb3dzIG9yIEFOU0kgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0YXRpYyBJQ29s b3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsgcmV0dXJuIE5vQ29sb3VySW1wbDo6 aW5zdGFuY2UoKTsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2VuZGlmIC8vIFdp bmRvd3MvIEFOU0kvIE5vbmUKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIENvbG91cjo6Q29s b3VyKCBDb2RlIF9jb2xvdXJDb2RlICkgeyB1c2UoIF9jb2xvdXJDb2RlICk7IH0KKyAgICBDb2xv dXI6OkNvbG91ciggQ29sb3VyJiYgb3RoZXIgKSBub2V4Y2VwdCB7CisgICAgICAgIG1fbW92ZWQg PSBvdGhlci5tX21vdmVkOworICAgICAgICBvdGhlci5tX21vdmVkID0gdHJ1ZTsKKyAgICB9Cisg ICAgQ29sb3VyJiBDb2xvdXI6Om9wZXJhdG9yPSggQ29sb3VyJiYgb3RoZXIgKSBub2V4Y2VwdCB7 CisgICAgICAgIG1fbW92ZWQgPSBvdGhlci5tX21vdmVkOworICAgICAgICBvdGhlci5tX21vdmVk ICA9IHRydWU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb2xvdXI6On5D b2xvdXIoKXsgaWYoICFtX21vdmVkICkgdXNlKCBOb25lICk7IH0KKworICAgIHZvaWQgQ29sb3Vy Ojp1c2UoIENvZGUgX2NvbG91ckNvZGUgKSB7CisgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCog aW1wbCA9IHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKTsKKyAgICAgICAgLy8gU3RyaWN0bHkgc3Bl YWtpbmcsIHRoaXMgY2Fubm90IHBvc3NpYmx5IGhhcHBlbi4KKyAgICAgICAgLy8gSG93ZXZlciwg dW5kZXIgc29tZSBjb25kaXRpb25zIGl0IGRvZXMgaGFwcGVuIChzZWUgIzE2MjYpLAorICAgICAg ICAvLyBhbmQgdGhpcyBjaGFuZ2UgaXMgc21hbGwgZW5vdWdoIHRoYXQgd2UgY2FuIGxldCBwcmFj dGljYWxpdHkKKyAgICAgICAgLy8gdHJpdW1waCBvdmVyIHB1cml0eSBpbiB0aGlzIGNhc2UuCisg ICAgICAgIGlmIChpbXBsICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGltcGwtPnVzZSggX2Nv bG91ckNvZGUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0 b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBDb2xvdXIgY29uc3QmICkgeworICAgICAgICByZXR1 cm4gb3M7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmIGRlZmluZWQo X19jbGFuZ19fKQorIyAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisv LyBlbmQgY2F0Y2hfY29uc29sZV9jb2xvdXIuY3BwCisvLyBzdGFydCBjYXRjaF9jb250ZXh0LmNw cAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgQ29udGV4dCA6IHB1YmxpYyBJTXV0 YWJsZUNvbnRleHQsIE5vbkNvcHlhYmxlIHsKKworICAgIHB1YmxpYzogLy8gSUNvbnRleHQKKyAg ICAgICAgSVJlc3VsdENhcHR1cmUqIGdldFJlc3VsdENhcHR1cmUoKSBvdmVycmlkZSB7CisgICAg ICAgICAgICByZXR1cm4gbV9yZXN1bHRDYXB0dXJlOworICAgICAgICB9CisgICAgICAgIElSdW5u ZXIqIGdldFJ1bm5lcigpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1bm5lcjsK KyAgICAgICAgfQorCisgICAgICAgIElDb25maWdQdHIgY29uc3QmIGdldENvbmZpZygpIGNvbnN0 IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbmZpZzsKKyAgICAgICAgfQorCisg ICAgICAgIH5Db250ZXh0KCkgb3ZlcnJpZGU7CisKKyAgICBwdWJsaWM6IC8vIElNdXRhYmxlQ29u dGV4dAorICAgICAgICB2b2lkIHNldFJlc3VsdENhcHR1cmUoIElSZXN1bHRDYXB0dXJlKiByZXN1 bHRDYXB0dXJlICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbV9yZXN1bHRDYXB0dXJlID0gcmVz dWx0Q2FwdHVyZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldFJ1bm5lciggSVJ1bm5lciog cnVubmVyICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbV9ydW5uZXIgPSBydW5uZXI7CisgICAg ICAgIH0KKyAgICAgICAgdm9pZCBzZXRDb25maWcoIElDb25maWdQdHIgY29uc3QmIGNvbmZpZyAp IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1fY29uZmlnID0gY29uZmlnOworICAgICAgICB9CisK KyAgICAgICAgZnJpZW5kIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0 KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBJQ29uZmlnUHRyIG1fY29uZmlnOworICAgICAg ICBJUnVubmVyKiBtX3J1bm5lciA9IG51bGxwdHI7CisgICAgICAgIElSZXN1bHRDYXB0dXJlKiBt X3Jlc3VsdENhcHR1cmUgPSBudWxscHRyOworICAgIH07CisKKyAgICBJTXV0YWJsZUNvbnRleHQg KklNdXRhYmxlQ29udGV4dDo6Y3VycmVudENvbnRleHQgPSBudWxscHRyOworCisgICAgdm9pZCBJ TXV0YWJsZUNvbnRleHQ6OmNyZWF0ZUNvbnRleHQoKQorICAgIHsKKyAgICAgICAgY3VycmVudENv bnRleHQgPSBuZXcgQ29udGV4dCgpOworICAgIH0KKworICAgIHZvaWQgY2xlYW5VcENvbnRleHQo KSB7CisgICAgICAgIGRlbGV0ZSBJTXV0YWJsZUNvbnRleHQ6OmN1cnJlbnRDb250ZXh0OworICAg ICAgICBJTXV0YWJsZUNvbnRleHQ6OmN1cnJlbnRDb250ZXh0ID0gbnVsbHB0cjsKKyAgICB9Cisg ICAgSUNvbnRleHQ6On5JQ29udGV4dCgpID0gZGVmYXVsdDsKKyAgICBJTXV0YWJsZUNvbnRleHQ6 On5JTXV0YWJsZUNvbnRleHQoKSA9IGRlZmF1bHQ7CisgICAgQ29udGV4dDo6fkNvbnRleHQoKSA9 IGRlZmF1bHQ7CisKKyAgICBTaW1wbGVQY2czMiYgcm5nKCkgeworICAgICAgICBzdGF0aWMgU2lt cGxlUGNnMzIgc19ybmc7CisgICAgICAgIHJldHVybiBzX3JuZzsKKyAgICB9CisKK30KKy8vIGVu ZCBjYXRjaF9jb250ZXh0LmNwcAorLy8gc3RhcnQgY2F0Y2hfZGVidWdfY29uc29sZS5jcHAKKwor Ly8gc3RhcnQgY2F0Y2hfZGVidWdfY29uc29sZS5oCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25h bWVzcGFjZSBDYXRjaCB7CisgICAgdm9pZCB3cml0ZVRvRGVidWdDb25zb2xlKCBzdGQ6OnN0cmlu ZyBjb25zdCYgdGV4dCApOworfQorCisvLyBlbmQgY2F0Y2hfZGVidWdfY29uc29sZS5oCisjaWYg ZGVmaW5lZChDQVRDSF9DT05GSUdfQU5EUk9JRF9MT0dXUklURSkKKyNpbmNsdWRlIDxhbmRyb2lk L2xvZy5oPgorCisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgdm9pZCB3cml0ZVRvRGVi dWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsKKyAgICAgICAgICAgIF9fYW5k cm9pZF9sb2dfd3JpdGUoIEFORFJPSURfTE9HX0RFQlVHLCAiQ2F0Y2giLCB0ZXh0LmNfc3RyKCkg KTsKKyAgICAgICAgfQorICAgIH0KKworI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9XSU5E T1dTKQorCisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgdm9pZCB3cml0ZVRvRGVidWdD b25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsKKyAgICAgICAgICAgIDo6T3V0cHV0 RGVidWdTdHJpbmdBKCB0ZXh0LmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworI2Vsc2UK KworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29s ZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICAvLyAhVEJEOiBOZWVk IGEgdmVyc2lvbiBmb3IgTWFjLyBYQ29kZSBhbmQgb3RoZXIgSURFcworICAgICAgICAgICAgQ2F0 Y2g6OmNvdXQoKSA8PCB0ZXh0OworICAgICAgICB9CisgICAgfQorCisjZW5kaWYgLy8gUGxhdGZv cm0KKy8vIGVuZCBjYXRjaF9kZWJ1Z19jb25zb2xlLmNwcAorLy8gc3RhcnQgY2F0Y2hfZGVidWdn ZXIuY3BwCisKKyNpZiBkZWZpbmVkKENBVENIX1BMQVRGT1JNX01BQykgfHwgZGVmaW5lZChDQVRD SF9QTEFURk9STV9JUEhPTkUpCisKKyMgIGluY2x1ZGUgPGNhc3NlcnQ+CisjICBpbmNsdWRlIDxz eXMvdHlwZXMuaD4KKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyAgaW5jbHVkZSA8Y3N0ZGRlZj4K KyMgIGluY2x1ZGUgPG9zdHJlYW0+CisKKyNpZmRlZiBfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXwor ICAgIC8vIFRoZXNlIGhlYWRlcnMgd2lsbCBvbmx5IGNvbXBpbGUgd2l0aCBBcHBsZUNsYW5nIChY Q29kZSkKKyAgICAvLyBGb3Igb3RoZXIgY29tcGlsZXJzIChDbGFuZywgR0NDLCAuLi4gKSB3ZSBu ZWVkIHRvIGV4Y2x1ZGUgdGhlbQorIyAgaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2VuZGlmCisK KyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICAjaWZkZWYgX19hcHBsZV9idWlsZF92ZXJz aW9uX18KKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyB0YWtlbiBkaXJlY3Rs eSBmcm9tIHRoZSBmb2xsb3dpbmcgdGVjaG5pY2FsIG5vdGU6CisgICAgICAgIC8vIGh0dHBzOi8v ZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L2FyY2hpdmUvcWEvcWExMzYxL19pbmRleC5odG1s CisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYmVp bmcgZGVidWdnZWQgKGVpdGhlcgorICAgICAgICAvLyBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dl ciBvciBoYXMgYSBkZWJ1Z2dlciBhdHRhY2hlZCBwb3N0IGZhY3RvKS4KKyAgICAgICAgYm9vbCBp c0RlYnVnZ2VyQWN0aXZlKCl7CisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1pYls0 XTsKKyAgICAgICAgICAgIHN0cnVjdCBraW5mb19wcm9jICAgaW5mbzsKKyAgICAgICAgICAgIHN0 ZDo6c2l6ZV90ICAgICAgICAgc2l6ZTsKKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUg ZmxhZ3Mgc28gdGhhdCwgaWYgc3lzY3RsIGZhaWxzIGZvciBzb21lIGJpemFycmUKKyAgICAgICAg ICAgIC8vIHJlYXNvbiwgd2UgZ2V0IGEgcHJlZGljdGFibGUgcmVzdWx0LgorCisgICAgICAgICAg ICBpbmZvLmtwX3Byb2MucF9mbGFnID0gMDsKKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBt aWIsIHdoaWNoIHRlbGxzIHN5c2N0bCB0aGUgaW5mbyB3ZSB3YW50LCBpbiB0aGlzIGNhc2UKKyAg ICAgICAgICAgIC8vIHdlJ3JlIGxvb2tpbmcgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lm aWMgcHJvY2VzcyBJRC4KKworICAgICAgICAgICAgbWliWzBdID0gQ1RMX0tFUk47CisgICAgICAg ICAgICBtaWJbMV0gPSBLRVJOX1BST0M7CisgICAgICAgICAgICBtaWJbMl0gPSBLRVJOX1BST0Nf UElEOworICAgICAgICAgICAgbWliWzNdID0gZ2V0cGlkKCk7CisKKyAgICAgICAgICAgIC8vIENh bGwgc3lzY3RsLgorCisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGluZm8pOworICAgICAgICAg ICAgaWYoIHN5c2N0bChtaWIsIHNpemVvZihtaWIpIC8gc2l6ZW9mKCptaWIpLCAmaW5mbywgJnNp emUsIG51bGxwdHIsIDApICE9IDAgKSB7CisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8 PCAiXG4qKiBDYWxsIHRvIHN5c2N0bCBmYWlsZWQgLSB1bmFibGUgdG8gZGV0ZXJtaW5lIGlmIGRl YnVnZ2VyIGlzIGFjdGl2ZSAqKlxuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgcmV0 dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSdyZSBiZWluZyBk ZWJ1Z2dlZCBpZiB0aGUgUF9UUkFDRUQgZmxhZyBpcyBzZXQuCisKKyAgICAgICAgICAgIHJldHVy biAoIChpbmZvLmtwX3Byb2MucF9mbGFnICYgUF9UUkFDRUQpICE9IDAgKTsKKyAgICAgICAgfQor ICAgICAgICAjZWxzZQorICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKSB7CisgICAgICAg ICAgICAvLyBXZSBuZWVkIHRvIGZpbmQgYW5vdGhlciB3YXkgdG8gZGV0ZXJtaW5lIHRoaXMgZm9y IG5vbi1hcHBsZWNsYW5nIGNvbXBpbGVycyBvbiBtYWNPUworICAgICAgICAgICAgcmV0dXJuIGZh bHNlOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgIH0gLy8gbmFtZXNwYWNlIENhdGNo CisKKyNlbGlmIGRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fTElOVVgpCisgICAgI2luY2x1ZGUgPGZz dHJlYW0+CisgICAgI2luY2x1ZGUgPHN0cmluZz4KKworICAgIG5hbWVzcGFjZSBDYXRjaHsKKyAg ICAgICAgLy8gVGhlIHN0YW5kYXJkIFBPU0lYIHdheSBvZiBkZXRlY3RpbmcgYSBkZWJ1Z2dlciBp cyB0byBhdHRlbXB0IHRvCisgICAgICAgIC8vIHB0cmFjZSgpIHRoZSBwcm9jZXNzLCBidXQgdGhp cyBuZWVkcyB0byBiZSBkb25lIGZyb20gYSBjaGlsZCBhbmQgbm90CisgICAgICAgIC8vIHRoaXMg cHJvY2VzcyBpdHNlbGYgdG8gc3RpbGwgYWxsb3cgYXR0YWNoaW5nIHRvIHRoaXMgcHJvY2VzcyBs YXRlcgorICAgICAgICAvLyBpZiB3YW50ZWQsIHNvIGlzIHJhdGhlciBoZWF2eS4gVW5kZXIgTGlu dXggd2UgaGF2ZSB0aGUgUElEIG9mIHRoZQorICAgICAgICAvLyAiZGVidWdnZXIiICh3aGljaCBk b2Vzbid0IG5lZWQgdG8gYmUgZ2RiLCBvZiBjb3Vyc2UsIGl0IGNvdWxkIGFsc28KKyAgICAgICAg Ly8gYmUgc3RyYWNlLCBmb3IgZXhhbXBsZSkgaW4gL3Byb2MvJFBJRC9zdGF0dXMsIHNvIGp1c3Qg Z2V0IGl0IGZyb20KKyAgICAgICAgLy8gdGhlcmUgaW5zdGVhZC4KKyAgICAgICAgYm9vbCBpc0Rl YnVnZ2VyQWN0aXZlKCl7CisgICAgICAgICAgICAvLyBMaWJzdGRjKysgaGFzIGEgYnVnLCB3aGVy ZSBzdGQ6Omlmc3RyZWFtIHNldHMgZXJybm8gdG8gMAorICAgICAgICAgICAgLy8gVGhpcyB3YXkg b3VyIHVzZXJzIGNhbiBwcm9wZXJseSBhc3NlcnQgb3ZlciBlcnJubyB2YWx1ZXMKKyAgICAgICAg ICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtIGluKCIvcHJv Yy9zZWxmL3N0YXR1cyIpOworICAgICAgICAgICAgZm9yKCBzdGQ6OnN0cmluZyBsaW5lOyBzdGQ6 OmdldGxpbmUoaW4sIGxpbmUpOyApIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50 IFBSRUZJWF9MRU4gPSAxMTsKKyAgICAgICAgICAgICAgICBpZiggbGluZS5jb21wYXJlKDAsIFBS RUZJWF9MRU4sICJUcmFjZXJQaWQ6XHQiKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAv LyBXZSdyZSB0cmFjZWQgaWYgdGhlIFBJRCBpcyBub3QgMCBhbmQgbm8gb3RoZXIgUElEIHN0YXJ0 cworICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIDAgZGlnaXQsIHNvIGl0J3MgZW5vdWdoIHRv IGNoZWNrIGZvciBqdXN0IGEgc2luZ2xlCisgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3Rl ci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCkgPiBQUkVGSVhfTEVO ICYmIGxpbmVbUFJFRklYX0xFTl0gIT0gJzAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSAvLyBu YW1lc3BhY2UgQ2F0Y2gKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgZXh0ZXJuICJDIiBf X2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IF9fc3RkY2FsbCBJc0RlYnVnZ2VyUHJlc2VudCgpOwor ICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsK KyAgICAgICAgICAgIHJldHVybiBJc0RlYnVnZ2VyUHJlc2VudCgpICE9IDA7CisgICAgICAgIH0K KyAgICB9CisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAgIGV4dGVybiAiQyIgX19kZWNs c3BlYyhkbGxpbXBvcnQpIGludCBfX3N0ZGNhbGwgSXNEZWJ1Z2dlclByZXNlbnQoKTsKKyAgICBu YW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKSB7CisgICAg ICAgICAgICByZXR1cm4gSXNEZWJ1Z2dlclByZXNlbnQoKSAhPSAwOworICAgICAgICB9CisgICAg fQorI2Vsc2UKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFj dGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfQorI2VuZGlmIC8vIFBsYXRmb3JtCisvLyBl bmQgY2F0Y2hfZGVidWdnZXIuY3BwCisvLyBzdGFydCBjYXRjaF9kZWNvbXBvc2VyLmNwcAorCitu YW1lc3BhY2UgQ2F0Y2ggeworCisgICAgSVRyYW5zaWVudEV4cHJlc3Npb246On5JVHJhbnNpZW50 RXhwcmVzc2lvbigpID0gZGVmYXVsdDsKKworICAgIHZvaWQgZm9ybWF0UmVjb25zdHJ1Y3RlZEV4 cHJlc3Npb24oIHN0ZDo6b3N0cmVhbSAmb3MsIHN0ZDo6c3RyaW5nIGNvbnN0JiBsaHMsIFN0cmlu Z1JlZiBvcCwgc3RkOjpzdHJpbmcgY29uc3QmIHJocyApIHsKKyAgICAgICAgaWYoIGxocy5zaXpl KCkgKyByaHMuc2l6ZSgpIDwgNDAgJiYKKyAgICAgICAgICAgICAgICBsaHMuZmluZCgnXG4nKSA9 PSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICAgICAgICAgIHJocy5maW5kKCdcbicpID09 IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgIG9zIDw8IGxocyA8PCAiICIgPDwgb3Ag PDwgIiAiIDw8IHJoczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3MgPDwgbGhzIDw8ICJc biIgPDwgb3AgPDwgIlxuIiA8PCByaHM7CisgICAgfQorfQorLy8gZW5kIGNhdGNoX2RlY29tcG9z ZXIuY3BwCisvLyBzdGFydCBjYXRjaF9lbmZvcmNlLmNwcAorCisjaW5jbHVkZSA8c3RkZXhjZXB0 PgorCituYW1lc3BhY2UgQ2F0Y2ggeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVf RVhDRVBUSU9OUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfRVhDRVBUSU9OU19D VVNUT01fSEFORExFUikKKyAgICBbW25vcmV0dXJuXV0KKyAgICB2b2lkIHRocm93X2V4Y2VwdGlv bihzdGQ6OmV4Y2VwdGlvbiBjb25zdCYgZSkgeworICAgICAgICBDYXRjaDo6Y2VycigpIDw8ICJD YXRjaCB3aWxsIHRlcm1pbmF0ZSBiZWNhdXNlIGl0IG5lZWRlZCB0byB0aHJvdyBhbiBleGNlcHRp b24uXG4iCisgICAgICAgICAgICAgICAgICAgICAgPDwgIlRoZSBtZXNzYWdlIHdhczogIiA8PCBl LndoYXQoKSA8PCAnXG4nOworICAgICAgICBzdGQ6OnRlcm1pbmF0ZSgpOworICAgIH0KKyNlbmRp ZgorCisgICAgW1tub3JldHVybl1dCisgICAgdm9pZCB0aHJvd19sb2dpY19lcnJvcihzdGQ6OnN0 cmluZyBjb25zdCYgbXNnKSB7CisgICAgICAgIHRocm93X2V4Y2VwdGlvbihzdGQ6OmxvZ2ljX2Vy cm9yKG1zZykpOworICAgIH0KKworICAgIFtbbm9yZXR1cm5dXQorICAgIHZvaWQgdGhyb3dfZG9t YWluX2Vycm9yKHN0ZDo6c3RyaW5nIGNvbnN0JiBtc2cpIHsKKyAgICAgICAgdGhyb3dfZXhjZXB0 aW9uKHN0ZDo6ZG9tYWluX2Vycm9yKG1zZykpOworICAgIH0KKworICAgIFtbbm9yZXR1cm5dXQor ICAgIHZvaWQgdGhyb3dfcnVudGltZV9lcnJvcihzdGQ6OnN0cmluZyBjb25zdCYgbXNnKSB7Cisg ICAgICAgIHRocm93X2V4Y2VwdGlvbihzdGQ6OnJ1bnRpbWVfZXJyb3IobXNnKSk7CisgICAgfQor Cit9IC8vIG5hbWVzcGFjZSBDYXRjaDsKKy8vIGVuZCBjYXRjaF9lbmZvcmNlLmNwcAorLy8gc3Rh cnQgY2F0Y2hfZW51bV92YWx1ZXNfcmVnaXN0cnkuY3BwCisvLyBzdGFydCBjYXRjaF9lbnVtX3Zh bHVlc19yZWdpc3RyeS5oCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWVtb3J5Pgor CituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICAgICAg c3RkOjp1bmlxdWVfcHRyPEVudW1JbmZvPiBtYWtlRW51bUluZm8oIFN0cmluZ1JlZiBlbnVtTmFt ZSwgU3RyaW5nUmVmIGFsbFZhbHVlTmFtZXMsIHN0ZDo6dmVjdG9yPGludD4gY29uc3QmIHZhbHVl cyApOworCisgICAgICAgIGNsYXNzIEVudW1WYWx1ZXNSZWdpc3RyeSA6IHB1YmxpYyBJTXV0YWJs ZUVudW1WYWx1ZXNSZWdpc3RyeSB7CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5p cXVlX3B0cjxFbnVtSW5mbz4+IG1fZW51bUluZm9zOworCisgICAgICAgICAgICBFbnVtSW5mbyBj b25zdCYgcmVnaXN0ZXJFbnVtKCBTdHJpbmdSZWYgZW51bU5hbWUsIFN0cmluZ1JlZiBhbGxFbnVt cywgc3RkOjp2ZWN0b3I8aW50PiBjb25zdCYgdmFsdWVzKSBvdmVycmlkZTsKKyAgICAgICAgfTsK KworICAgICAgICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IHBhcnNlRW51bXMoIFN0cmluZ1JlZiBl bnVtcyApOworCisgICAgfSAvLyBEZXRhaWwKKworfSAvLyBDYXRjaAorCisvLyBlbmQgY2F0Y2hf ZW51bV92YWx1ZXNfcmVnaXN0cnkuaAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGNhc3Nl cnQ+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBJTXV0YWJsZUVudW1WYWx1ZXNSZWdpc3Ry eTo6fklNdXRhYmxlRW51bVZhbHVlc1JlZ2lzdHJ5KCkge30KKworICAgIG5hbWVzcGFjZSBEZXRh aWwgeworCisgICAgICAgIG5hbWVzcGFjZSB7CisgICAgICAgICAgICAvLyBFeHRyYWN0cyB0aGUg YWN0dWFsIG5hbWUgcGFydCBvZiBhbiBlbnVtIGluc3RhbmNlCisgICAgICAgICAgICAvLyBJbiBv dGhlciB3b3JkcywgaXQgcmV0dXJucyB0aGUgQmx1ZSBwYXJ0IG9mIEJpa2VzaGVkOjpDb2xvdXI6 OkJsdWUKKyAgICAgICAgICAgIFN0cmluZ1JlZiBleHRyYWN0SW5zdGFuY2VOYW1lKFN0cmluZ1Jl ZiBlbnVtSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBGaW5kIGxhc3Qgb2NjdXJyZW5j ZSBvZiAiOiIKKyAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9zdGFydCA9IGVudW1JbnN0YW5j ZS5zaXplKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5hbWVfc3RhcnQgPiAwICYmIGVudW1J bnN0YW5jZVtuYW1lX3N0YXJ0IC0gMV0gIT0gJzonKSB7CisgICAgICAgICAgICAgICAgICAgIC0t bmFtZV9zdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVu dW1JbnN0YW5jZS5zdWJzdHIobmFtZV9zdGFydCwgZW51bUluc3RhbmNlLnNpemUoKSAtIG5hbWVf c3RhcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8 U3RyaW5nUmVmPiBwYXJzZUVudW1zKCBTdHJpbmdSZWYgZW51bXMgKSB7CisgICAgICAgICAgICBh dXRvIGVudW1WYWx1ZXMgPSBzcGxpdFN0cmluZ1JlZiggZW51bXMsICcsJyApOworICAgICAgICAg ICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBwYXJzZWQ7CisgICAgICAgICAgICBwYXJzZWQucmVz ZXJ2ZSggZW51bVZhbHVlcy5zaXplKCkgKTsKKyAgICAgICAgICAgIGZvciggYXV0byBjb25zdCYg ZW51bVZhbHVlIDogZW51bVZhbHVlcyApIHsKKyAgICAgICAgICAgICAgICBwYXJzZWQucHVzaF9i YWNrKHRyaW0oZXh0cmFjdEluc3RhbmNlTmFtZShlbnVtVmFsdWUpKSk7CisgICAgICAgICAgICB9 CisgICAgICAgICAgICByZXR1cm4gcGFyc2VkOworICAgICAgICB9CisKKyAgICAgICAgRW51bUlu Zm86On5FbnVtSW5mbygpIHt9CisKKyAgICAgICAgU3RyaW5nUmVmIEVudW1JbmZvOjpsb29rdXAo IGludCB2YWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgIGZvciggYXV0byBjb25zdCYgdmFsdWVU b05hbWUgOiBtX3ZhbHVlcyApIHsKKyAgICAgICAgICAgICAgICBpZiggdmFsdWVUb05hbWUuZmly c3QgPT0gdmFsdWUgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVUb05hbWUuc2Vj b25kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJ7KiogdW5leHBlY3RlZCBl bnVtIHZhbHVlICoqfSJfc3I7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8 RW51bUluZm8+IG1ha2VFbnVtSW5mbyggU3RyaW5nUmVmIGVudW1OYW1lLCBTdHJpbmdSZWYgYWxs VmFsdWVOYW1lcywgc3RkOjp2ZWN0b3I8aW50PiBjb25zdCYgdmFsdWVzICkgeworICAgICAgICAg ICAgc3RkOjp1bmlxdWVfcHRyPEVudW1JbmZvPiBlbnVtSW5mbyggbmV3IEVudW1JbmZvICk7Cisg ICAgICAgICAgICBlbnVtSW5mby0+bV9uYW1lID0gZW51bU5hbWU7CisgICAgICAgICAgICBlbnVt SW5mby0+bV92YWx1ZXMucmVzZXJ2ZSggdmFsdWVzLnNpemUoKSApOworCisgICAgICAgICAgICBj b25zdCBhdXRvIHZhbHVlTmFtZXMgPSBDYXRjaDo6RGV0YWlsOjpwYXJzZUVudW1zKCBhbGxWYWx1 ZU5hbWVzICk7CisgICAgICAgICAgICBhc3NlcnQoIHZhbHVlTmFtZXMuc2l6ZSgpID09IHZhbHVl cy5zaXplKCkgKTsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGkgPSAwOworICAgICAgICAgICAg Zm9yKCBhdXRvIHZhbHVlIDogdmFsdWVzICkKKyAgICAgICAgICAgICAgICBlbnVtSW5mby0+bV92 YWx1ZXMuZW1wbGFjZV9iYWNrKHZhbHVlLCB2YWx1ZU5hbWVzW2krK10pOworCisgICAgICAgICAg ICByZXR1cm4gZW51bUluZm87CisgICAgICAgIH0KKworICAgICAgICBFbnVtSW5mbyBjb25zdCYg RW51bVZhbHVlc1JlZ2lzdHJ5OjpyZWdpc3RlckVudW0oIFN0cmluZ1JlZiBlbnVtTmFtZSwgU3Ry aW5nUmVmIGFsbFZhbHVlTmFtZXMsIHN0ZDo6dmVjdG9yPGludD4gY29uc3QmIHZhbHVlcyApIHsK KyAgICAgICAgICAgIG1fZW51bUluZm9zLnB1c2hfYmFjayhtYWtlRW51bUluZm8oZW51bU5hbWUs IGFsbFZhbHVlTmFtZXMsIHZhbHVlcykpOworICAgICAgICAgICAgcmV0dXJuICptX2VudW1JbmZv cy5iYWNrKCk7CisgICAgICAgIH0KKworICAgIH0gLy8gRGV0YWlsCit9IC8vIENhdGNoCisKKy8v IGVuZCBjYXRjaF9lbnVtX3ZhbHVlc19yZWdpc3RyeS5jcHAKKy8vIHN0YXJ0IGNhdGNoX2Vycm5v X2d1YXJkLmNwcAorCisjaW5jbHVkZSA8Y2Vycm5vPgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAg ICAgICBFcnJub0d1YXJkOjpFcnJub0d1YXJkKCk6bV9vbGRFcnJubyhlcnJubyl7fQorICAgICAg ICBFcnJub0d1YXJkOjp+RXJybm9HdWFyZCgpIHsgZXJybm8gPSBtX29sZEVycm5vOyB9Cit9Cisv LyBlbmQgY2F0Y2hfZXJybm9fZ3VhcmQuY3BwCisvLyBzdGFydCBjYXRjaF9leGNlcHRpb25fdHJh bnNsYXRvcl9yZWdpc3RyeS5jcHAKKworLy8gc3RhcnQgY2F0Y2hfZXhjZXB0aW9uX3RyYW5zbGF0 b3JfcmVnaXN0cnkuaAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNp bmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBFeGNlcHRp b25UcmFuc2xhdG9yUmVnaXN0cnkgOiBwdWJsaWMgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3Ry eSB7CisgICAgcHVibGljOgorICAgICAgICB+RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCk7 CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRp b25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRyYW5zbGF0 ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBzdGQ6OnN0cmluZyB0 cnlUcmFuc2xhdG9ycygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0 b3I8c3RkOjp1bmlxdWVfcHRyPElFeGNlcHRpb25UcmFuc2xhdG9yIGNvbnN0Pj4gbV90cmFuc2xh dG9yczsKKyAgICB9OworfQorCisvLyBlbmQgY2F0Y2hfZXhjZXB0aW9uX3RyYW5zbGF0b3JfcmVn aXN0cnkuaAorI2lmZGVmIF9fT0JKQ19fCisjaW1wb3J0ICJGb3VuZGF0aW9uL0ZvdW5kYXRpb24u aCIKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgRXhjZXB0aW9uVHJhbnNsYXRv clJlZ2lzdHJ5Ojp+RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgeworICAgIH0KKworICAg IHZvaWQgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OjpyZWdpc3RlclRyYW5zbGF0b3IoIGNv bnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgeworICAgICAgICBtX3RyYW5z bGF0b3JzLnB1c2hfYmFjayggc3RkOjp1bmlxdWVfcHRyPGNvbnN0IElFeGNlcHRpb25UcmFuc2xh dG9yPiggdHJhbnNsYXRvciApICk7CisgICAgfQorCisjaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklH X0RJU0FCTEVfRVhDRVBUSU9OUykKKyAgICBzdGQ6OnN0cmluZyBFeGNlcHRpb25UcmFuc2xhdG9y UmVnaXN0cnk6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgdHJ5 IHsKKyNpZmRlZiBfX09CSkNfXworICAgICAgICAgICAgLy8gSW4gT2JqZWN0aXZlLUMgdHJ5IG9i amVjdGl2ZS1jIGV4Y2VwdGlvbnMgZmlyc3QKKyAgICAgICAgICAgIEB0cnkgeworICAgICAgICAg ICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworICAgICAgICAgICAgfQorICAgICAgICAg ICAgQGNhdGNoIChOU0V4Y2VwdGlvbiAqZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0 dXJuIENhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeSggW2V4Y2VwdGlvbiBkZXNjcmlwdGlvbl0gKTsK KyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAvLyBDb21waWxpbmcgYSBtaXhlZCBt b2RlIHByb2plY3Qgd2l0aCBNU1ZDIG1lYW5zIHRoYXQgQ0xSCisgICAgICAgICAgICAvLyBleGNl cHRpb25zIHdpbGwgYmUgY2F1Z2h0IGluICguLi4pIGFzIHdlbGwuIEhvd2V2ZXIsIHRoZXNlCisg ICAgICAgICAgICAvLyBkbyBub3QgZmlsbC1pbiBzdGQ6OmN1cnJlbnRfZXhjZXB0aW9uIGFuZCB0 aHVzIGxlYWQgdG8gY3Jhc2gKKyAgICAgICAgICAgIC8vIHdoZW4gYXR0ZW1wdGluZyByZXRocm93 LgorICAgICAgICAgICAgLy8gL0VIYSBzd2l0Y2ggYWxzbyBjYXVzZXMgc3RydWN0dXJlZCBleGNl cHRpb25zIHRvIGJlIGNhdWdodAorICAgICAgICAgICAgLy8gaGVyZSwgYnV0IHRoZXkgZmlsbC1p biBjdXJyZW50X2V4Y2VwdGlvbiBwcm9wZXJseSwgc28KKyAgICAgICAgICAgIC8vIGF0IHdvcnN0 IHRoZSBvdXRwdXQgc2hvdWxkIGJlIGEgbGl0dGxlIHdlaXJkLCBpbnN0ZWFkIG9mCisgICAgICAg ICAgICAvLyBjYXVzaW5nIGEgY3Jhc2guCisgICAgICAgICAgICBpZiAoc3RkOjpjdXJyZW50X2V4 Y2VwdGlvbigpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIk5vbiBDKysg ZXhjZXB0aW9uLiBQb3NzaWJseSBhIENMUiBleGNlcHRpb24uIjsKKyAgICAgICAgICAgIH0KKyAg ICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworI2VuZGlmCisgICAgICAgIH0KKyAg ICAgICAgY2F0Y2goIFRlc3RGYWlsdXJlRXhjZXB0aW9uJiApIHsKKyAgICAgICAgICAgIHN0ZDo6 cmV0aHJvd19leGNlcHRpb24oc3RkOjpjdXJyZW50X2V4Y2VwdGlvbigpKTsKKyAgICAgICAgfQor ICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgcmV0dXJu IGV4LndoYXQoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggc3RkOjpzdHJpbmcmIG1zZyAp IHsKKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGNv bnN0IGNoYXIqIG1zZyApIHsKKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0KKyAg ICAgICAgY2F0Y2goLi4uKSB7CisgICAgICAgICAgICByZXR1cm4gIlVua25vd24gZXhjZXB0aW9u IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEV4Y2VwdGlvblRyYW5zbGF0 b3JSZWdpc3RyeTo6dHJ5VHJhbnNsYXRvcnMoKSBjb25zdCB7CisgICAgICAgIGlmIChtX3RyYW5z bGF0b3JzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0ZDo6cmV0aHJvd19leGNlcHRpb24oc3Rk OjpjdXJyZW50X2V4Y2VwdGlvbigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJl dHVybiBtX3RyYW5zbGF0b3JzWzBdLT50cmFuc2xhdGUobV90cmFuc2xhdG9ycy5iZWdpbigpICsg MSwgbV90cmFuc2xhdG9ycy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyNlbHNlIC8vIF5e IEV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgLy8gRXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQgdnYKKyAg ICBzdGQ6OnN0cmluZyBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk6OnRyYW5zbGF0ZUFjdGl2 ZUV4Y2VwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfRVJST1IoIkF0dGVt cHRlZCB0byB0cmFuc2xhdGUgYWN0aXZlIGV4Y2VwdGlvbiB1bmRlciBDQVRDSF9DT05GSUdfRElT QUJMRV9FWENFUFRJT05TISIpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEV4Y2VwdGlvblRy YW5zbGF0b3JSZWdpc3RyeTo6dHJ5VHJhbnNsYXRvcnMoKSBjb25zdCB7CisgICAgICAgIENBVENI X0lOVEVSTkFMX0VSUk9SKCJBdHRlbXB0ZWQgdG8gdXNlIGV4Y2VwdGlvbiB0cmFuc2xhdG9ycyB1 bmRlciBDQVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TISIpOworICAgIH0KKyNlbmRpZgor Cit9CisvLyBlbmQgY2F0Y2hfZXhjZXB0aW9uX3RyYW5zbGF0b3JfcmVnaXN0cnkuY3BwCisvLyBz dGFydCBjYXRjaF9mYXRhbF9jb25kaXRpb24uY3BwCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisK KyNpZiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIICkgJiYgIWRlZmluZWQoIENB VENIX0NPTkZJR19QT1NJWF9TSUdOQUxTICkKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8v IElmIG5laXRoZXIgU0VIIG5vciBzaWduYWwgaGFuZGxpbmcgaXMgcmVxdWlyZWQsIHRoZSBoYW5k bGVyIGltcGxzCisgICAgLy8gZG8gbm90IGhhdmUgdG8gZG8gYW55dGhpbmcsIGFuZCBjYW4gYmUg ZW1wdHkuCisgICAgdm9pZCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmVuZ2FnZV9wbGF0Zm9ybSgp IHt9CisgICAgdm9pZCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmRpc2VuZ2FnZV9wbGF0Zm9ybSgp IHt9CisgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpGYXRhbENvbmRpdGlvbkhhbmRsZXIoKSA9 IGRlZmF1bHQ7CisgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyOjp+RmF0YWxDb25kaXRpb25IYW5k bGVyKCkgPSBkZWZhdWx0OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2VuZGlmIC8v ICFDQVRDSF9DT05GSUdfV0lORE9XU19TRUggJiYgIUNBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxT CisKKyNpZiBkZWZpbmVkKCBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggKSAmJiBkZWZpbmVkKCBD QVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyApCisjZXJyb3IgIkluY29uc2lzdGVudCBjb25maWd1 cmF0aW9uOiBXaW5kb3dzJyBTRUggaGFuZGxpbmcgYW5kIFBPU0lYIHNpZ25hbHMgY2Fubm90IGJl IGVuYWJsZWQgYXQgdGhlIHNhbWUgdGltZSIKKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfV0lORE9X U19TRUggJiYgQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMKKworI2lmIGRlZmluZWQoIENBVENI X0NPTkZJR19XSU5ET1dTX1NFSCApIHx8IGRlZmluZWQoIENBVENIX0NPTkZJR19QT1NJWF9TSUdO QUxTICkKKworbmFtZXNwYWNlIHsKKyAgICAvLyEgU2lnbmFscyBmYXRhbCBlcnJvciBtZXNzYWdl IHRvIHRoZSBydW4gY29udGV4dAorICAgIHZvaWQgcmVwb3J0RmF0YWwoIGNoYXIgY29uc3QgKiBj b25zdCBtZXNzYWdlICkgeworICAgICAgICBDYXRjaDo6Z2V0Q3VycmVudENvbnRleHQoKS5nZXRS ZXN1bHRDYXB0dXJlKCktPmhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIG1lc3NhZ2UgKTsKKyAg ICB9CisKKyAgICAvLyEgTWluaW1hbCBzaXplIENhdGNoMiBuZWVkcyBmb3IgaXRzIG93biBmYXRh bCBlcnJvciBoYW5kbGluZy4KKyAgICAvLyEgUGlja2VkIGFuZWNkb3RhbGx5LCBzbyBpdCBtaWdo dCBub3QgYmUgc3VmZmljaWVudCBvbiBhbGwKKyAgICAvLyEgcGxhdGZvcm1zLCBhbmQgZm9yIGFs bCBjb25maWd1cmF0aW9ucy4KKyAgICBjb25zdGV4cHIgc3RkOjpzaXplX3QgbWluU3RhY2tTaXpl Rm9yRXJyb3JzID0gMzIgKiAxMDI0OworfSAvLyBlbmQgdW5uYW1lZCBuYW1lc3BhY2UKKworI2Vu ZGlmIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCB8fCBDQVRDSF9DT05GSUdfUE9TSVhfU0lH TkFMUworCisjaWYgZGVmaW5lZCggQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIICkKKworbmFtZXNw YWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTaWduYWxEZWZzIHsgRFdPUkQgaWQ7IGNvbnN0IGNo YXIqIG5hbWU7IH07CisKKyAgICAvLyBUaGVyZSBpcyBubyAxLTEgbWFwcGluZyBiZXR3ZWVuIHNp Z25hbHMgYW5kIHdpbmRvd3MgZXhjZXB0aW9ucy4KKyAgICAvLyBXaW5kb3dzIGNhbiBlYXNpbHkg ZGlzdGluZ3Vpc2ggYmV0d2VlbiBTTyBhbmQgU2lnU2VnViwKKyAgICAvLyBidXQgU2lnSW50LCBT aWdUZXJtLCBldGMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuCisgICAgc3RhdGljIFNpZ25hbERl ZnMgc2lnbmFsRGVmc1tdID0geworICAgICAgICB7IHN0YXRpY19jYXN0PERXT1JEPihFWENFUFRJ T05fSUxMRUdBTF9JTlNUUlVDVElPTiksICAiU0lHSUxMIC0gSWxsZWdhbCBpbnN0cnVjdGlvbiBz aWduYWwiIH0sCisgICAgICAgIHsgc3RhdGljX2Nhc3Q8RFdPUkQ+KEVYQ0VQVElPTl9TVEFDS19P VkVSRkxPVyksICJTSUdTRUdWIC0gU3RhY2sgb3ZlcmZsb3ciIH0sCisgICAgICAgIHsgc3RhdGlj X2Nhc3Q8RFdPUkQ+KEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OKSwgIlNJR1NFR1YgLSBTZWdt ZW50YXRpb24gdmlvbGF0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgeyBzdGF0aWNfY2FzdDxEV09S RD4oRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTyksICJEaXZpZGUgYnkgemVybyBlcnJvciIg fSwKKyAgICB9OworCisgICAgc3RhdGljIExPTkcgQ0FMTEJBQ0sgaGFuZGxlVmVjdG9yZWRFeGNl cHRpb24oUEVYQ0VQVElPTl9QT0lOVEVSUyBFeGNlcHRpb25JbmZvKSB7CisgICAgICAgIGZvciAo YXV0byBjb25zdCYgZGVmIDogc2lnbmFsRGVmcykgeworICAgICAgICAgICAgaWYgKEV4Y2VwdGlv bkluZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZSA9PSBkZWYuaWQpIHsKKyAgICAg ICAgICAgICAgICByZXBvcnRGYXRhbChkZWYubmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAg IH0KKyAgICAgICAgLy8gSWYgaXRzIG5vdCBhbiBleGNlcHRpb24gd2UgY2FyZSBhYm91dCwgcGFz cyBpdCBhbG9uZy4KKyAgICAgICAgLy8gVGhpcyBzdG9wcyB1cyBmcm9tIGVhdGluZyBkZWJ1Z2dl ciBicmVha3MgZXRjLgorICAgICAgICByZXR1cm4gRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsK KyAgICB9CisKKyAgICAvLyBTaW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBpbnN0YW50 aWF0aW9ucywgd2UgcHV0IHRoZXNlCisgICAgLy8gaW50byBnbG9iYWwgdmFyaWFibGVzIGFuZCBy ZWx5IG9uIGNsZWFuaW5nIHRoZW0gdXAgaW4gb3V0bGluZWQKKyAgICAvLyBjb25zdHJ1Y3RvcnMv ZGVzdHJ1Y3RvcnMKKyAgICBzdGF0aWMgUFZPSUQgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IG51 bGxwdHI7CisKKyAgICAvLyBGb3IgTVNWQywgd2UgcmVzZXJ2ZSBwYXJ0IG9mIHRoZSBzdGFjayBt ZW1vcnkgZm9yIGhhbmRsaW5nCisgICAgLy8gbWVtb3J5IG92ZXJmbG93IHN0cnVjdHVyZWQgZXhj ZXB0aW9uLgorICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6RmF0YWxDb25kaXRpb25IYW5kbGVy KCkgeworICAgICAgICBVTE9ORyBndWFyYW50ZWVTaXplID0gc3RhdGljX2Nhc3Q8VUxPTkc+KG1p blN0YWNrU2l6ZUZvckVycm9ycyk7CisgICAgICAgIGlmICghU2V0VGhyZWFkU3RhY2tHdWFyYW50 ZWUoJmd1YXJhbnRlZVNpemUpKSB7CisgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBm dWxseSBlcnJvciBvdXQsIGJlY2F1c2UgbmVlZGluZworICAgICAgICAgICAgLy8gdGhlIHN0YWNr IHJlc2VydmUgc2hvdWxkIGJlIHJhcmUgZW5vdWdoIGFueXdheS4KKyAgICAgICAgICAgIENhdGNo OjpjZXJyKCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlc2VydmUgcGllY2Ugb2Yg c3RhY2suIgorICAgICAgICAgICAgICAgIDw8ICIgU3RhY2sgb3ZlcmZsb3dzIHdpbGwgbm90IGJl IHJlcG9ydGVkIHN1Y2Nlc3NmdWxseS4iOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2Ug ZG8gbm90IGF0dGVtcHQgdG8gdW5zZXQgdGhlIHN0YWNrIGd1YXJhbnRlZSwgYmVjYXVzZQorICAg IC8vIFdpbmRvd3MgZG9lcyBub3Qgc3VwcG9ydCBsb3dlcmluZyB0aGUgc3RhY2sgc2l6ZSBndWFy YW50ZWUuCisgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyOjp+RmF0YWxDb25kaXRpb25IYW5kbGVy KCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmVuZ2FnZV9w bGF0Zm9ybSgpIHsKKyAgICAgICAgLy8gUmVnaXN0ZXIgYXMgZmlyc3QgaGFuZGxlciBpbiBjdXJy ZW50IGNoYWluCisgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBBZGRWZWN0b3JlZEV4 Y2VwdGlvbkhhbmRsZXIoMSwgaGFuZGxlVmVjdG9yZWRFeGNlcHRpb24pOworICAgICAgICBpZiAo IWV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUpIHsKKyAgICAgICAgICAgIENBVENIX1JVTlRJTUVfRVJS T1IoIkNvdWxkIG5vdCByZWdpc3RlciB2ZWN0b3JlZCBleGNlcHRpb24gaGFuZGxlciIpOworICAg ICAgICB9CisgICAgfQorCisgICAgdm9pZCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmRpc2VuZ2Fn ZV9wbGF0Zm9ybSgpIHsKKyAgICAgICAgaWYgKCFSZW1vdmVWZWN0b3JlZEV4Y2VwdGlvbkhhbmRs ZXIoZXhjZXB0aW9uSGFuZGxlckhhbmRsZSkpIHsKKyAgICAgICAgICAgIENBVENIX1JVTlRJTUVf RVJST1IoIkNvdWxkIG5vdCB1bnJlZ2lzdGVyIHZlY3RvcmVkIGV4Y2VwdGlvbiBoYW5kbGVyIik7 CisgICAgICAgIH0KKyAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IG51bGxwdHI7Cisg ICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2VuZGlmIC8vIENBVENIX0NPTkZJ R19XSU5ET1dTX1NFSAorCisjaWYgZGVmaW5lZCggQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMg KQorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1 Y3QgU2lnbmFsRGVmcyB7CisgICAgICAgIGludCBpZDsKKyAgICAgICAgY29uc3QgY2hhciogbmFt ZTsKKyAgICB9OworCisgICAgc3RhdGljIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0geworICAg ICAgICB7IFNJR0lOVCwgICJTSUdJTlQgLSBUZXJtaW5hbCBpbnRlcnJ1cHQgc2lnbmFsIiB9LAor ICAgICAgICB7IFNJR0lMTCwgICJTSUdJTEwgLSBJbGxlZ2FsIGluc3RydWN0aW9uIHNpZ25hbCIg fSwKKyAgICAgICAgeyBTSUdGUEUsICAiU0lHRlBFIC0gRmxvYXRpbmcgcG9pbnQgZXJyb3Igc2ln bmFsIiB9LAorICAgICAgICB7IFNJR1NFR1YsICJTSUdTRUdWIC0gU2VnbWVudGF0aW9uIHZpb2xh dGlvbiBzaWduYWwiIH0sCisgICAgICAgIHsgU0lHVEVSTSwgIlNJR1RFUk0gLSBUZXJtaW5hdGlv biByZXF1ZXN0IHNpZ25hbCIgfSwKKyAgICAgICAgeyBTSUdBQlJULCAiU0lHQUJSVCAtIEFib3J0 IChhYm5vcm1hbCB0ZXJtaW5hdGlvbikgc2lnbmFsIiB9CisgICAgfTsKKworLy8gT2xkZXIgR0ND cyB0cmlnZ2VyIC1XbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgZm9yIFQgZm9vID0ge30KKy8v IHdoaWNoIGlzIHplcm8gaW5pdGlhbGl6YXRpb24sIGJ1dCBub3QgZXhwbGljaXQuIFdlIHdhbnQg dG8gYXZvaWQKKy8vIHRoYXQuCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgICAgcHJhZ21hIEdD QyBkaWFnbm9zdGljIHB1c2gKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1X bWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiCisjZW5kaWYKKworICAgIHN0YXRpYyBjaGFyKiBh bHRTdGFja01lbSA9IG51bGxwdHI7CisgICAgc3RhdGljIHN0ZDo6c2l6ZV90IGFsdFN0YWNrU2l6 ZSA9IDA7CisgICAgc3RhdGljIHN0YWNrX3Qgb2xkU2lnU3RhY2t7fTsKKyAgICBzdGF0aWMgc3Ry dWN0IHNpZ2FjdGlvbiBvbGRTaWdBY3Rpb25zW3NpemVvZihzaWduYWxEZWZzKSAvIHNpemVvZihT aWduYWxEZWZzKV17fTsKKworICAgIHN0YXRpYyB2b2lkIHJlc3RvcmVQcmV2aW91c1NpZ25hbEhh bmRsZXJzKCkgeworICAgICAgICAvLyBXZSBzZXQgc2lnbmFsIGhhbmRsZXJzIGJhY2sgdG8gdGhl IHByZXZpb3VzIG9uZXMuIEhvcGVmdWxseQorICAgICAgICAvLyBub2JvZHkgb3Zlcndyb3RlIHRo ZW0gaW4gdGhlIG1lYW50aW1lLCBhbmQgZG9lc24ndCBleHBlY3QKKyAgICAgICAgLy8gdGhlaXIg c2lnbmFsIGhhbmRsZXJzIHRvIGxpdmUgcGFzdCBvdXJzIGdpdmVuIHRoYXQgdGhleQorICAgICAg ICAvLyBpbnN0YWxsZWQgdGhlbSBhZnRlciBvdXJzLi4KKyAgICAgICAgZm9yIChzdGQ6OnNpemVf dCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKSAvIHNpemVvZihTaWduYWxEZWZzKTsgKytp KSB7CisgICAgICAgICAgICBzaWdhY3Rpb24oc2lnbmFsRGVmc1tpXS5pZCwgJm9sZFNpZ0FjdGlv bnNbaV0sIG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIC8vIFJldHVybiB0aGUgb2xkIHN0 YWNrCisgICAgICAgIHNpZ2FsdHN0YWNrKCZvbGRTaWdTdGFjaywgbnVsbHB0cik7CisgICAgfQor CisgICAgc3RhdGljIHZvaWQgaGFuZGxlU2lnbmFsKCBpbnQgc2lnICkgeworICAgICAgICBjaGFy IGNvbnN0ICogbmFtZSA9ICI8dW5rbm93biBzaWduYWw+IjsKKyAgICAgICAgZm9yIChhdXRvIGNv bnN0JiBkZWYgOiBzaWduYWxEZWZzKSB7CisgICAgICAgICAgICBpZiAoc2lnID09IGRlZi5pZCkg eworICAgICAgICAgICAgICAgIG5hbWUgPSBkZWYubmFtZTsKKyAgICAgICAgICAgICAgICBicmVh azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBXZSBuZWVkIHRvIHJlc3Rv cmUgcHJldmlvdXMgc2lnbmFsIGhhbmRsZXJzIGFuZCBsZXQgdGhlbSBkbworICAgICAgICAvLyB0 aGVpciB0aGluZywgc28gdGhhdCB0aGUgdXNlcnMgY2FuIGhhdmUgdGhlIGRlYnVnZ2VyIGJyZWFr CisgICAgICAgIC8vIHdoZW4gYSBzaWduYWwgaXMgcmFpc2VkLCBhbmQgc28gb24uCisgICAgICAg IHJlc3RvcmVQcmV2aW91c1NpZ25hbEhhbmRsZXJzKCk7CisgICAgICAgIHJlcG9ydEZhdGFsKCBu YW1lICk7CisgICAgICAgIHJhaXNlKCBzaWcgKTsKKyAgICB9CisKKyAgICBGYXRhbENvbmRpdGlv bkhhbmRsZXI6OkZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgYXNzZXJ0KCFhbHRT dGFja01lbSAmJiAiQ2Fubm90IGluaXRpYWxpemUgUE9TSVggc2lnbmFsIGhhbmRsZXIgd2hlbiBv bmUgYWxyZWFkeSBleGlzdHMiKTsKKyAgICAgICAgaWYgKGFsdFN0YWNrU2l6ZSA9PSAwKSB7Cisg ICAgICAgICAgICBhbHRTdGFja1NpemUgPSBzdGQ6Om1heChzdGF0aWNfY2FzdDxzaXplX3Q+KFNJ R1NUS1NaKSwgbWluU3RhY2tTaXplRm9yRXJyb3JzKTsKKyAgICAgICAgfQorICAgICAgICBhbHRT dGFja01lbSA9IG5ldyBjaGFyW2FsdFN0YWNrU2l6ZV0oKTsKKyAgICB9CisKKyAgICBGYXRhbENv bmRpdGlvbkhhbmRsZXI6On5GYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgIGRlbGV0 ZVtdIGFsdFN0YWNrTWVtOworICAgICAgICAvLyBXZSBzaWduYWwgdGhhdCBhbm90aGVyIGluc3Rh bmNlIGNhbiBiZSBjb25zdHJ1Y3RlZCBieSB6ZXJvaW5nCisgICAgICAgIC8vIG91dCB0aGUgcG9p bnRlci4KKyAgICAgICAgYWx0U3RhY2tNZW0gPSBudWxscHRyOworICAgIH0KKworICAgIHZvaWQg RmF0YWxDb25kaXRpb25IYW5kbGVyOjplbmdhZ2VfcGxhdGZvcm0oKSB7CisgICAgICAgIHN0YWNr X3Qgc2lnU3RhY2s7CisgICAgICAgIHNpZ1N0YWNrLnNzX3NwID0gYWx0U3RhY2tNZW07CisgICAg ICAgIHNpZ1N0YWNrLnNzX3NpemUgPSBhbHRTdGFja1NpemU7CisgICAgICAgIHNpZ1N0YWNrLnNz X2ZsYWdzID0gMDsKKyAgICAgICAgc2lnYWx0c3RhY2soJnNpZ1N0YWNrLCAmb2xkU2lnU3RhY2sp OworICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhID0geyB9OworCisgICAgICAgIHNhLnNhX2hh bmRsZXIgPSBoYW5kbGVTaWduYWw7CisgICAgICAgIHNhLnNhX2ZsYWdzID0gU0FfT05TVEFDSzsK KyAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKS9z aXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgc2lnYWN0aW9uKHNpZ25hbERl ZnNbaV0uaWQsICZzYSwgJm9sZFNpZ0FjdGlvbnNbaV0pOworICAgICAgICB9CisgICAgfQorCisj aWYgZGVmaW5lZChfX0dOVUNfXykKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2Vu ZGlmCisKKyAgICB2b2lkIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6ZGlzZW5nYWdlX3BsYXRmb3Jt KCkgeworICAgICAgICByZXN0b3JlUHJldmlvdXNTaWduYWxIYW5kbGVycygpOworICAgIH0KKwor fSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfUE9TSVhf U0lHTkFMUworLy8gZW5kIGNhdGNoX2ZhdGFsX2NvbmRpdGlvbi5jcHAKKy8vIHN0YXJ0IGNhdGNo X2dlbmVyYXRvcnMuY3BwCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c2V0PgorCitu YW1lc3BhY2UgQ2F0Y2ggeworCitJR2VuZXJhdG9yVHJhY2tlcjo6fklHZW5lcmF0b3JUcmFja2Vy KCkge30KKworY29uc3QgY2hhciogR2VuZXJhdG9yRXhjZXB0aW9uOjp3aGF0KCkgY29uc3Qgbm9l eGNlcHQgeworICAgIHJldHVybiBtX21zZzsKK30KKworbmFtZXNwYWNlIEdlbmVyYXRvcnMgewor CisgICAgR2VuZXJhdG9yVW50eXBlZEJhc2U6On5HZW5lcmF0b3JVbnR5cGVkQmFzZSgpIHt9CisK KyAgICBhdXRvIGFjcXVpcmVHZW5lcmF0b3JUcmFja2VyKCBTdHJpbmdSZWYgZ2VuZXJhdG9yTmFt ZSwgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgLT4gSUdlbmVyYXRvclRyYWNrZXIm IHsKKyAgICAgICAgcmV0dXJuIGdldFJlc3VsdENhcHR1cmUoKS5hY3F1aXJlR2VuZXJhdG9yVHJh Y2tlciggZ2VuZXJhdG9yTmFtZSwgbGluZUluZm8gKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNl IEdlbmVyYXRvcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisvLyBlbmQgY2F0Y2hfZ2VuZXJhdG9y cy5jcHAKKy8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfY2FwdHVyZS5jcHAKKworbmFtZXNwYWNl IENhdGNoIHsKKyAgICBJUmVzdWx0Q2FwdHVyZTo6fklSZXN1bHRDYXB0dXJlKCkgPSBkZWZhdWx0 OworfQorLy8gZW5kIGNhdGNoX2ludGVyZmFjZXNfY2FwdHVyZS5jcHAKKy8vIHN0YXJ0IGNhdGNo X2ludGVyZmFjZXNfY29uZmlnLmNwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIElDb25maWc6 On5JQ29uZmlnKCkgPSBkZWZhdWx0OworfQorLy8gZW5kIGNhdGNoX2ludGVyZmFjZXNfY29uZmln LmNwcAorLy8gc3RhcnQgY2F0Y2hfaW50ZXJmYWNlc19leGNlcHRpb24uY3BwCisKK25hbWVzcGFj ZSBDYXRjaCB7CisgICAgSUV4Y2VwdGlvblRyYW5zbGF0b3I6On5JRXhjZXB0aW9uVHJhbnNsYXRv cigpID0gZGVmYXVsdDsKKyAgICBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5Ojp+SUV4Y2Vw dGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpID0gZGVmYXVsdDsKK30KKy8vIGVuZCBjYXRjaF9pbnRl cmZhY2VzX2V4Y2VwdGlvbi5jcHAKKy8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfcmVnaXN0cnlf aHViLmNwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIElSZWdpc3RyeUh1Yjo6fklSZWdpc3Ry eUh1YigpID0gZGVmYXVsdDsKKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViOjp+SU11dGFibGVSZWdp c3RyeUh1YigpID0gZGVmYXVsdDsKK30KKy8vIGVuZCBjYXRjaF9pbnRlcmZhY2VzX3JlZ2lzdHJ5 X2h1Yi5jcHAKKy8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfcmVwb3J0ZXIuY3BwCisKKy8vIHN0 YXJ0IGNhdGNoX3JlcG9ydGVyX2xpc3RlbmluZy5oCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAg ICBjbGFzcyBMaXN0ZW5pbmdSZXBvcnRlciA6IHB1YmxpYyBJU3RyZWFtaW5nUmVwb3J0ZXIgewor ICAgICAgICB1c2luZyBSZXBvcnRlcnMgPSBzdGQ6OnZlY3RvcjxJU3RyZWFtaW5nUmVwb3J0ZXJQ dHI+OworICAgICAgICBSZXBvcnRlcnMgbV9saXN0ZW5lcnM7CisgICAgICAgIElTdHJlYW1pbmdS ZXBvcnRlclB0ciBtX3JlcG9ydGVyID0gbnVsbHB0cjsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJl bmNlcyBtX3ByZWZlcmVuY2VzOworCisgICAgcHVibGljOgorICAgICAgICBMaXN0ZW5pbmdSZXBv cnRlcigpOworCisgICAgICAgIHZvaWQgYWRkTGlzdGVuZXIoIElTdHJlYW1pbmdSZXBvcnRlclB0 ciYmIGxpc3RlbmVyICk7CisgICAgICAgIHZvaWQgYWRkUmVwb3J0ZXIoIElTdHJlYW1pbmdSZXBv cnRlclB0ciYmIHJlcG9ydGVyICk7CisKKyAgICBwdWJsaWM6IC8vIElTdHJlYW1pbmdSZXBvcnRl cgorCisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBv dmVycmlkZTsKKworICAgICAgICB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5n IGNvbnN0JiBzcGVjICkgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCByZXBvcnRJbnZhbGlkQXJn dW1lbnRzKHN0ZDo6c3RyaW5nIGNvbnN0JmFyZykgb3ZlcnJpZGU7CisKKyAgICAgICAgc3RhdGlj IHN0ZDo6c2V0PFZlcmJvc2l0eT4gZ2V0U3VwcG9ydGVkVmVyYm9zaXRpZXMoKTsKKworI2lmIGRl ZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcpCisgICAgICAgIHZvaWQgYmVu Y2htYXJrUHJlcGFyaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKSBvdmVycmlkZTsKKyAgICAg ICAgdm9pZCBiZW5jaG1hcmtTdGFydGluZyggQmVuY2htYXJrSW5mbyBjb25zdCYgYmVuY2htYXJr SW5mbyApIG92ZXJyaWRlOworICAgICAgICB2b2lkIGJlbmNobWFya0VuZGVkKCBCZW5jaG1hcmtT dGF0czw+IGNvbnN0JiBiZW5jaG1hcmtTdGF0cyApIG92ZXJyaWRlOworICAgICAgICB2b2lkIGJl bmNobWFya0ZhaWxlZChzdGQ6OnN0cmluZyBjb25zdCYpIG92ZXJyaWRlOworI2VuZGlmIC8vIENB VENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HCisKKyAgICAgICAgdm9pZCB0ZXN0UnVuU3Rh cnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5mbyApIG92ZXJyaWRlOworICAgICAg ICB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIG92 ZXJyaWRlOworICAgICAgICB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25z dCYgdGVzdEluZm8gKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNl Y3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIG92ZXJyaWRlOworICAgICAgICB2b2lkIGFz c2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiBhc3NlcnRpb25JbmZvICkgb3Zl cnJpZGU7CisKKyAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgdGhlIG1l c3NhZ2VzIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZDoKKyAgICAgICAgYm9vbCBhc3NlcnRpb25F bmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgb3ZlcnJpZGU7Cisg ICAgICAgIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0 cyApIG92ZXJyaWRlOworICAgICAgICB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMg Y29uc3QmIHRlc3RDYXNlU3RhdHMgKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBF bmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgb3ZlcnJpZGU7Cisg ICAgICAgIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0 cyApIG92ZXJyaWRlOworCisgICAgICAgIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25z dCYgdGVzdEluZm8gKSBvdmVycmlkZTsKKyAgICAgICAgYm9vbCBpc011bHRpKCkgY29uc3Qgb3Zl cnJpZGU7CisKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNh dGNoX3JlcG9ydGVyX2xpc3RlbmluZy5oCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgUmVwb3J0 ZXJDb25maWc6OlJlcG9ydGVyQ29uZmlnKCBJQ29uZmlnUHRyIGNvbnN0JiBfZnVsbENvbmZpZyAp CisgICAgOiAgIG1fc3RyZWFtKCAmX2Z1bGxDb25maWctPnN0cmVhbSgpICksIG1fZnVsbENvbmZp ZyggX2Z1bGxDb25maWcgKSB7fQorCisgICAgUmVwb3J0ZXJDb25maWc6OlJlcG9ydGVyQ29uZmln KCBJQ29uZmlnUHRyIGNvbnN0JiBfZnVsbENvbmZpZywgc3RkOjpvc3RyZWFtJiBfc3RyZWFtICkK KyAgICA6ICAgbV9zdHJlYW0oICZfc3RyZWFtICksIG1fZnVsbENvbmZpZyggX2Z1bGxDb25maWcg KSB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBSZXBvcnRlckNvbmZpZzo6c3RyZWFtKCkgY29uc3Qg eyByZXR1cm4gKm1fc3RyZWFtOyB9CisgICAgSUNvbmZpZ1B0ciBSZXBvcnRlckNvbmZpZzo6ZnVs bENvbmZpZygpIGNvbnN0IHsgcmV0dXJuIG1fZnVsbENvbmZpZzsgfQorCisgICAgVGVzdFJ1bklu Zm86OlRlc3RSdW5JbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKSA6IG5hbWUoIF9uYW1l ICkge30KKworICAgIEdyb3VwSW5mbzo6R3JvdXBJbmZvKCAgc3RkOjpzdHJpbmcgY29uc3QmIF9u YW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgX2dyb3VwSW5kZXgs CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBfZ3JvdXBzQ291bnQgKQor ICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICBncm91cEluZGV4KCBfZ3JvdXBJbmRleCAp LAorICAgICAgICBncm91cHNDb3VudHMoIF9ncm91cHNDb3VudCApCisgICAge30KKworICAgICBB c3NlcnRpb25TdGF0czo6QXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgX2Fz c2VydGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6 OnZlY3RvcjxNZXNzYWdlSW5mbz4gY29uc3QmIF9pbmZvTWVzc2FnZXMsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzICkKKyAgICA6ICAg YXNzZXJ0aW9uUmVzdWx0KCBfYXNzZXJ0aW9uUmVzdWx0ICksCisgICAgICAgIGluZm9NZXNzYWdl cyggX2luZm9NZXNzYWdlcyApLAorICAgICAgICB0b3RhbHMoIF90b3RhbHMgKQorICAgIHsKKyAg ICAgICAgYXNzZXJ0aW9uUmVzdWx0Lm1fcmVzdWx0RGF0YS5sYXp5RXhwcmVzc2lvbi5tX3RyYW5z aWVudEV4cHJlc3Npb24gPSBfYXNzZXJ0aW9uUmVzdWx0Lm1fcmVzdWx0RGF0YS5sYXp5RXhwcmVz c2lvbi5tX3RyYW5zaWVudEV4cHJlc3Npb247CisKKyAgICAgICAgaWYoIGFzc2VydGlvblJlc3Vs dC5oYXNNZXNzYWdlKCkgKSB7CisgICAgICAgICAgICAvLyBDb3B5IG1lc3NhZ2UgaW50byBtZXNz YWdlcyBsaXN0LgorICAgICAgICAgICAgLy8gIVRCRCBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZG9u ZSBlYXJsaWVyLCBzb21ld2hlcmUKKyAgICAgICAgICAgIE1lc3NhZ2VCdWlsZGVyIGJ1aWxkZXIo IGFzc2VydGlvblJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCksIGFzc2VydGlvblJlc3VsdC5nZXRT b3VyY2VJbmZvKCksIGFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKTsKKyAgICAgICAg ICAgIGJ1aWxkZXIgPDwgYXNzZXJ0aW9uUmVzdWx0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAg IGJ1aWxkZXIubV9pbmZvLm1lc3NhZ2UgPSBidWlsZGVyLm1fc3RyZWFtLnN0cigpOworCisgICAg ICAgICAgICBpbmZvTWVzc2FnZXMucHVzaF9iYWNrKCBidWlsZGVyLm1faW5mbyApOworICAgICAg ICB9CisgICAgfQorCisgICAgIEFzc2VydGlvblN0YXRzOjp+QXNzZXJ0aW9uU3RhdHMoKSA9IGRl ZmF1bHQ7CisKKyAgICBTZWN0aW9uU3RhdHM6OlNlY3Rpb25TdGF0cyggIFNlY3Rpb25JbmZvIGNv bnN0JiBfc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3Vu dHMgY29uc3QmIF9hc3NlcnRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGJvb2wgX21pc3NpbmdBc3NlcnRpb25zICkKKyAgICA6ICAgc2VjdGlvbkluZm8oIF9zZWN0 aW9uSW5mbyApLAorICAgICAgICBhc3NlcnRpb25zKCBfYXNzZXJ0aW9ucyApLAorICAgICAgICBk dXJhdGlvbkluU2Vjb25kcyggX2R1cmF0aW9uSW5TZWNvbmRzICksCisgICAgICAgIG1pc3NpbmdB c3NlcnRpb25zKCBfbWlzc2luZ0Fzc2VydGlvbnMgKQorICAgIHt9CisKKyAgICBTZWN0aW9uU3Rh dHM6On5TZWN0aW9uU3RhdHMoKSA9IGRlZmF1bHQ7CisKKyAgICBUZXN0Q2FzZVN0YXRzOjpUZXN0 Q2FzZVN0YXRzKCAgVGVzdENhc2VJbmZvIGNvbnN0JiBfdGVzdEluZm8sCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRPdXQsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RkRXJy LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisg ICAgOiB0ZXN0SW5mbyggX3Rlc3RJbmZvICksCisgICAgICAgIHRvdGFscyggX3RvdGFscyApLAor ICAgICAgICBzdGRPdXQoIF9zdGRPdXQgKSwKKyAgICAgICAgc3RkRXJyKCBfc3RkRXJyICksCisg ICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQorICAgIHt9CisKKyAgICBUZXN0Q2FzZVN0YXRz Ojp+VGVzdENhc2VTdGF0cygpID0gZGVmYXVsdDsKKworICAgIFRlc3RHcm91cFN0YXRzOjpUZXN0 R3JvdXBTdGF0cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfYWJvcnRpbmcgKQorICAgIDogICBncm91cElu Zm8oIF9ncm91cEluZm8gKSwKKyAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgIGFi b3J0aW5nKCBfYWJvcnRpbmcgKQorICAgIHt9CisKKyAgICBUZXN0R3JvdXBTdGF0czo6VGVzdEdy b3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbyApCisgICAgOiAgIGdyb3VwSW5m byggX2dyb3VwSW5mbyApLAorICAgICAgICBhYm9ydGluZyggZmFsc2UgKQorICAgIHt9CisKKyAg ICBUZXN0R3JvdXBTdGF0czo6flRlc3RHcm91cFN0YXRzKCkgPSBkZWZhdWx0OworCisgICAgVGVz dFJ1blN0YXRzOjpUZXN0UnVuU3RhdHMoICAgVGVzdFJ1bkluZm8gY29uc3QmIF9ydW5JbmZvLAor ICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAgICAgICAg ICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICA6ICAgcnVuSW5mbyggX3J1bkluZm8gKSwKKyAg ICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQor ICAgIHt9CisKKyAgICBUZXN0UnVuU3RhdHM6On5UZXN0UnVuU3RhdHMoKSA9IGRlZmF1bHQ7CisK KyAgICB2b2lkIElTdHJlYW1pbmdSZXBvcnRlcjo6ZmF0YWxFcnJvckVuY291bnRlcmVkKCBTdHJp bmdSZWYgKSB7fQorICAgIGJvb2wgSVN0cmVhbWluZ1JlcG9ydGVyOjppc011bHRpKCkgY29uc3Qg eyByZXR1cm4gZmFsc2U7IH0KKworICAgIElSZXBvcnRlckZhY3Rvcnk6On5JUmVwb3J0ZXJGYWN0 b3J5KCkgPSBkZWZhdWx0OworICAgIElSZXBvcnRlclJlZ2lzdHJ5Ojp+SVJlcG9ydGVyUmVnaXN0 cnkoKSA9IGRlZmF1bHQ7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorLy8gZW5kIGNhdGNo X2ludGVyZmFjZXNfcmVwb3J0ZXIuY3BwCisvLyBzdGFydCBjYXRjaF9pbnRlcmZhY2VzX3J1bm5l ci5jcHAKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBJUnVubmVyOjp+SVJ1bm5lcigpID0gZGVm YXVsdDsKK30KKy8vIGVuZCBjYXRjaF9pbnRlcmZhY2VzX3J1bm5lci5jcHAKKy8vIHN0YXJ0IGNh dGNoX2ludGVyZmFjZXNfdGVzdGNhc2UuY3BwCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgSVRl c3RJbnZva2VyOjp+SVRlc3RJbnZva2VyKCkgPSBkZWZhdWx0OworICAgIElUZXN0Q2FzZVJlZ2lz dHJ5Ojp+SVRlc3RDYXNlUmVnaXN0cnkoKSA9IGRlZmF1bHQ7Cit9CisvLyBlbmQgY2F0Y2hfaW50 ZXJmYWNlc190ZXN0Y2FzZS5jcHAKKy8vIHN0YXJ0IGNhdGNoX2xlYWtfZGV0ZWN0b3IuY3BwCisK KyNpZmRlZiBDQVRDSF9DT05GSUdfV0lORE9XU19DUlREQkcKKyNpbmNsdWRlIDxjcnRkYmcuaD4K KworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIExlYWtEZXRlY3Rvcjo6TGVha0RldGVjdG9yKCkg eworICAgICAgICBpbnQgZmxhZyA9IF9DcnRTZXREYmdGbGFnKF9DUlREQkdfUkVQT1JUX0ZMQUcp OworICAgICAgICBmbGFnIHw9IF9DUlREQkdfTEVBS19DSEVDS19ERjsKKyAgICAgICAgZmxhZyB8 PSBfQ1JUREJHX0FMTE9DX01FTV9ERjsKKyAgICAgICAgX0NydFNldERiZ0ZsYWcoZmxhZyk7Cisg ICAgICAgIF9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfV0FSTiwgX0NSVERCR19NT0RFX0ZJTEUgfCBf Q1JUREJHX01PREVfREVCVUcpOworICAgICAgICBfQ3J0U2V0UmVwb3J0RmlsZShfQ1JUX1dBUk4s IF9DUlREQkdfRklMRV9TVERFUlIpOworICAgICAgICAvLyBDaGFuZ2UgdGhpcyB0byBsZWFraW5n IGFsbG9jYXRpb24ncyBudW1iZXIgdG8gYnJlYWsgdGhlcmUKKyAgICAgICAgX0NydFNldEJyZWFr QWxsb2MoLTEpOworICAgIH0KK30KKworI2Vsc2UKKworICAgIENhdGNoOjpMZWFrRGV0ZWN0b3I6 OkxlYWtEZXRlY3RvcigpIHt9CisKKyNlbmRpZgorCitDYXRjaDo6TGVha0RldGVjdG9yOjp+TGVh a0RldGVjdG9yKCkgeworICAgIENhdGNoOjpjbGVhblVwKCk7Cit9CisvLyBlbmQgY2F0Y2hfbGVh a19kZXRlY3Rvci5jcHAKKy8vIHN0YXJ0IGNhdGNoX2xpc3QuY3BwCisKKy8vIHN0YXJ0IGNhdGNo X2xpc3QuaAorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3Rk OjpzaXplX3QgbGlzdFRlc3RzKCBDb25maWcgY29uc3QmIGNvbmZpZyApOworCisgICAgc3RkOjpz aXplX3QgbGlzdFRlc3RzTmFtZXNPbmx5KCBDb25maWcgY29uc3QmIGNvbmZpZyApOworCisgICAg c3RydWN0IFRhZ0luZm8geworICAgICAgICB2b2lkIGFkZCggc3RkOjpzdHJpbmcgY29uc3QmIHNw ZWxsaW5nICk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGFsbCgpIGNvbnN0OworCisgICAgICAgIHN0 ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzcGVsbGluZ3M7CisgICAgICAgIHN0ZDo6c2l6ZV90IGNvdW50 ID0gMDsKKyAgICB9OworCisgICAgc3RkOjpzaXplX3QgbGlzdFRhZ3MoIENvbmZpZyBjb25zdCYg Y29uZmlnICk7CisKKyAgICBzdGQ6OnNpemVfdCBsaXN0UmVwb3J0ZXJzKCk7CisKKyAgICBPcHRp b248c3RkOjpzaXplX3Q+IGxpc3QoIHN0ZDo6c2hhcmVkX3B0cjxDb25maWc+IGNvbnN0JiBjb25m aWcgKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF9saXN0LmgK Ky8vIHN0YXJ0IGNhdGNoX3RleHQuaAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHVzaW5nIG5h bWVzcGFjZSBjbGFyYTo6VGV4dEZsb3c7Cit9CisKKy8vIGVuZCBjYXRjaF90ZXh0LmgKKyNpbmNs dWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisK K25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGQ6OnNpemVfdCBsaXN0VGVzdHMoIENvbmZpZyBj b25zdCYgY29uZmlnICkgeworICAgICAgICBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMgPSBjb25m aWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoIGNvbmZpZy5oYXNUZXN0RmlsdGVycygpICkKKyAg ICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIk1hdGNoaW5nIHRlc3QgY2FzZXM6XG4iOworICAg ICAgICBlbHNlIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkFsbCBhdmFpbGFibGUg dGVzdCBjYXNlczpcbiI7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIG1hdGNoZWRUZXN0Q2Fz ZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNw ZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIGF1dG8gY29uc3QmIHRlc3RDYXNlSW5mbyA6IG1h dGNoZWRUZXN0Q2FzZXMgKSB7CisgICAgICAgICAgICBDb2xvdXI6OkNvZGUgY29sb3VyID0gdGVz dENhc2VJbmZvLmlzSGlkZGVuKCkKKyAgICAgICAgICAgICAgICA/IENvbG91cjo6U2Vjb25kYXJ5 VGV4dAorICAgICAgICAgICAgICAgIDogQ29sb3VyOjpOb25lOworICAgICAgICAgICAgQ29sb3Vy IGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBD b2x1bW4oIHRlc3RDYXNlSW5mby5uYW1lICkuaW5pdGlhbEluZGVudCggMiApLmluZGVudCggNCAp IDw8ICJcbiI7CisgICAgICAgICAgICBpZiggY29uZmlnLnZlcmJvc2l0eSgpID49IFZlcmJvc2l0 eTo6SGlnaCApIHsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IENvbHVtbiggQ2F0 Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCB0ZXN0Q2FzZUluZm8ubGluZUluZm8gKSApLmluZGVudCg0 KSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb24g PSB0ZXN0Q2FzZUluZm8uZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgaWYoIGRlc2NyaXB0 aW9uLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICIoTk8gREVT Q1JJUFRJT04pIjsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IENvbHVtbiggZGVz Y3JpcHRpb24gKS5pbmRlbnQoNCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAg ICAgICAgaWYoICF0ZXN0Q2FzZUluZm8udGFncy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBD YXRjaDo6Y291dCgpIDw8IENvbHVtbiggdGVzdENhc2VJbmZvLnRhZ3NBc1N0cmluZygpICkuaW5k ZW50KCA2ICkgPDwgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhY29uZmlnLmhhc1Rl c3RGaWx0ZXJzKCkgKQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIG1h dGNoZWRUZXN0Q2FzZXMuc2l6ZSgpLCAidGVzdCBjYXNlIiApIDw8ICdcbicgPDwgc3RkOjplbmRs OworICAgICAgICBlbHNlCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHBsdXJhbGlzZSgg bWF0Y2hlZFRlc3RDYXNlcy5zaXplKCksICJtYXRjaGluZyB0ZXN0IGNhc2UiICkgPDwgJ1xuJyA8 PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBtYXRjaGVkVGVzdENhc2VzLnNpemUoKTsKKyAg ICB9CisKKyAgICBzdGQ6OnNpemVfdCBsaXN0VGVzdHNOYW1lc09ubHkoIENvbmZpZyBjb25zdCYg Y29uZmlnICkgeworICAgICAgICBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMgPSBjb25maWcudGVz dFNwZWMoKTsKKyAgICAgICAgc3RkOjpzaXplX3QgbWF0Y2hlZFRlc3RzID0gMDsKKyAgICAgICAg c3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0 QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAg ICBmb3IoIGF1dG8gY29uc3QmIHRlc3RDYXNlSW5mbyA6IG1hdGNoZWRUZXN0Q2FzZXMgKSB7Cisg ICAgICAgICAgICBtYXRjaGVkVGVzdHMrKzsKKyAgICAgICAgICAgIGlmKCBzdGFydHNXaXRoKCB0 ZXN0Q2FzZUluZm8ubmFtZSwgJyMnICkgKQorICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8 PCAnIicgPDwgdGVzdENhc2VJbmZvLm5hbWUgPDwgJyInOworICAgICAgICAgICAgZWxzZQorICAg ICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXN0Q2FzZUluZm8ubmFtZTsKKyAgICAgICAg ICAgIGlmICggY29uZmlnLnZlcmJvc2l0eSgpID49IFZlcmJvc2l0eTo6SGlnaCApCisgICAgICAg ICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiXHRAIiA8PCB0ZXN0Q2FzZUluZm8ubGluZUluZm87 CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAg ICAgICByZXR1cm4gbWF0Y2hlZFRlc3RzOworICAgIH0KKworICAgIHZvaWQgVGFnSW5mbzo6YWRk KCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlbGxpbmcgKSB7CisgICAgICAgICsrY291bnQ7CisgICAg ICAgIHNwZWxsaW5ncy5pbnNlcnQoIHNwZWxsaW5nICk7CisgICAgfQorCisgICAgc3RkOjpzdHJp bmcgVGFnSW5mbzo6YWxsKCkgY29uc3QgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAg ICAgIGZvciAoYXV0byBjb25zdCYgc3BlbGxpbmcgOiBzcGVsbGluZ3MpIHsKKyAgICAgICAgICAg IC8vIEFkZCAyIGZvciB0aGUgYnJhY2tlcworICAgICAgICAgICAgc2l6ZSArPSBzcGVsbGluZy5z aXplKCkgKyAyOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgb3V0OyBvdXQucmVz ZXJ2ZShzaXplKTsKKyAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBzcGVsbGluZyA6IHNwZWxsaW5n cykgeworICAgICAgICAgICAgb3V0ICs9ICdbJzsKKyAgICAgICAgICAgIG91dCArPSBzcGVsbGlu ZzsKKyAgICAgICAgICAgIG91dCArPSAnXSc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91 dDsKKyAgICB9CisKKyAgICBzdGQ6OnNpemVfdCBsaXN0VGFncyggQ29uZmlnIGNvbnN0JiBjb25m aWcgKSB7CisgICAgICAgIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3Bl YygpOworICAgICAgICBpZiggY29uZmlnLmhhc1Rlc3RGaWx0ZXJzKCkgKQorICAgICAgICAgICAg Q2F0Y2g6OmNvdXQoKSA8PCAiVGFncyBmb3IgbWF0Y2hpbmcgdGVzdCBjYXNlczpcbiI7CisgICAg ICAgIGVsc2UgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiQWxsIGF2YWlsYWJsZSB0 YWdzOlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJ bmZvPiB0YWdDb3VudHM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRU ZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwg dGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIGF1dG8gY29uc3QmIHRlc3RDYXNlIDog bWF0Y2hlZFRlc3RDYXNlcyApIHsKKyAgICAgICAgICAgIGZvciggYXV0byBjb25zdCYgdGFnTmFt ZSA6IHRlc3RDYXNlLmdldFRlc3RDYXNlSW5mbygpLnRhZ3MgKSB7CisgICAgICAgICAgICAgICAg c3RkOjpzdHJpbmcgbGNhc2VUYWdOYW1lID0gdG9Mb3dlciggdGFnTmFtZSApOworICAgICAgICAg ICAgICAgIGF1dG8gY291bnRJdCA9IHRhZ0NvdW50cy5maW5kKCBsY2FzZVRhZ05hbWUgKTsKKyAg ICAgICAgICAgICAgICBpZiggY291bnRJdCA9PSB0YWdDb3VudHMuZW5kKCkgKQorICAgICAgICAg ICAgICAgICAgICBjb3VudEl0ID0gdGFnQ291bnRzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIGxj YXNlVGFnTmFtZSwgVGFnSW5mbygpICkgKS5maXJzdDsKKyAgICAgICAgICAgICAgICBjb3VudEl0 LT5zZWNvbmQuYWRkKCB0YWdOYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAg ICAgICBmb3IoIGF1dG8gY29uc3QmIHRhZ0NvdW50IDogdGFnQ291bnRzICkgeworICAgICAgICAg ICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAgICAgICAgICAgcnNzIDw8ICIgICIgPDwg c3RkOjpzZXR3KDIpIDw8IHRhZ0NvdW50LnNlY29uZC5jb3VudCA8PCAiICAiOworICAgICAgICAg ICAgYXV0byBzdHIgPSByc3Muc3RyKCk7CisgICAgICAgICAgICBhdXRvIHdyYXBwZXIgPSBDb2x1 bW4oIHRhZ0NvdW50LnNlY29uZC5hbGwoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRpYWxJbmRlbnQoIDAgKQorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRlbnQoIHN0ci5zaXpl KCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IC53aWR0aCggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMTAgKTsKKyAgICAgICAgICAgIENh dGNoOjpjb3V0KCkgPDwgc3RyIDw8IHdyYXBwZXIgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAg ICBDYXRjaDo6Y291dCgpIDw8IHBsdXJhbGlzZSggdGFnQ291bnRzLnNpemUoKSwgInRhZyIgKSA8 PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIHRhZ0NvdW50cy5zaXplKCk7Cisg ICAgfQorCisgICAgc3RkOjpzaXplX3QgbGlzdFJlcG9ydGVycygpIHsKKyAgICAgICAgQ2F0Y2g6 OmNvdXQoKSA8PCAiQXZhaWxhYmxlIHJlcG9ydGVyczpcbiI7CisgICAgICAgIElSZXBvcnRlclJl Z2lzdHJ5OjpGYWN0b3J5TWFwIGNvbnN0JiBmYWN0b3JpZXMgPSBnZXRSZWdpc3RyeUh1YigpLmdl dFJlcG9ydGVyUmVnaXN0cnkoKS5nZXRGYWN0b3JpZXMoKTsKKyAgICAgICAgc3RkOjpzaXplX3Qg bWF4TmFtZUxlbiA9IDA7CisgICAgICAgIGZvciggYXV0byBjb25zdCYgZmFjdG9yeUt2cCA6IGZh Y3RvcmllcyApCisgICAgICAgICAgICBtYXhOYW1lTGVuID0gKHN0ZDo6bWF4KSggbWF4TmFtZUxl biwgZmFjdG9yeUt2cC5maXJzdC5zaXplKCkgKTsKKworICAgICAgICBmb3IoIGF1dG8gY29uc3Qm IGZhY3RvcnlLdnAgOiBmYWN0b3JpZXMgKSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpCisg ICAgICAgICAgICAgICAgICAgIDw8IENvbHVtbiggZmFjdG9yeUt2cC5maXJzdCArICI6IiApCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGVudCgyKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC53aWR0aCggNSttYXhOYW1lTGVuICkKKyAgICAgICAgICAgICAgICAgICAgKyAg Q29sdW1uKCBmYWN0b3J5S3ZwLnNlY29uZC0+Z2V0RGVzY3JpcHRpb24oKSApCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgLmluaXRpYWxJbmRlbnQoMCkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAuaW5kZW50KDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpZHRoKCBD QVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAtIG1heE5hbWVMZW4tOCApCisgICAgICAgICAgICAg ICAgICAgIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBzdGQ6 OmVuZGw7CisgICAgICAgIHJldHVybiBmYWN0b3JpZXMuc2l6ZSgpOworICAgIH0KKworICAgIE9w dGlvbjxzdGQ6OnNpemVfdD4gbGlzdCggc3RkOjpzaGFyZWRfcHRyPENvbmZpZz4gY29uc3QmIGNv bmZpZyApIHsKKyAgICAgICAgT3B0aW9uPHN0ZDo6c2l6ZV90PiBsaXN0ZWRDb3VudDsKKyAgICAg ICAgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkuc2V0Q29uZmlnKCBjb25maWcgKTsKKyAgICAg ICAgaWYoIGNvbmZpZy0+bGlzdFRlc3RzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBs aXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRlc3RzKCAqY29uZmlnICk7CisgICAgICAgIGlm KCBjb25maWctPmxpc3RUZXN0TmFtZXNPbmx5KCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQg PSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRlc3RzTmFtZXNPbmx5KCAqY29uZmlnICk7 CisgICAgICAgIGlmKCBjb25maWctPmxpc3RUYWdzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291 bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRhZ3MoICpjb25maWcgKTsKKyAgICAg ICAgaWYoIGNvbmZpZy0+bGlzdFJlcG9ydGVycygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50 ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RSZXBvcnRlcnMoKTsKKyAgICAgICAgcmV0 dXJuIGxpc3RlZENvdW50OworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisvLyBl bmQgY2F0Y2hfbGlzdC5jcHAKKy8vIHN0YXJ0IGNhdGNoX21hdGNoZXJzLmNwcAorCituYW1lc3Bh Y2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKyAgICBuYW1lc3BhY2UgSW1wbCB7CisK KyAgICAgICAgc3RkOjpzdHJpbmcgTWF0Y2hlclVudHlwZWRCYXNlOjp0b1N0cmluZygpIGNvbnN0 IHsKKyAgICAgICAgICAgIGlmKCBtX2NhY2hlZFRvU3RyaW5nLmVtcHR5KCkgKQorICAgICAgICAg ICAgICAgIG1fY2FjaGVkVG9TdHJpbmcgPSBkZXNjcmliZSgpOworICAgICAgICAgICAgcmV0dXJu IG1fY2FjaGVkVG9TdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICBNYXRjaGVyVW50eXBlZEJh c2U6On5NYXRjaGVyVW50eXBlZEJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgICB9IC8vIG5hbWVzcGFj ZSBJbXBsCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworCit1c2luZyBuYW1lc3BhY2UgTWF0Y2hl cnM7Cit1c2luZyBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U7CisKK30gLy8gbmFtZXNwYWNl IENhdGNoCisvLyBlbmQgY2F0Y2hfbWF0Y2hlcnMuY3BwCisvLyBzdGFydCBjYXRjaF9tYXRjaGVy c19leGNlcHRpb24uY3BwCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMg eworbmFtZXNwYWNlIEV4Y2VwdGlvbiB7CisKK2Jvb2wgRXhjZXB0aW9uTWVzc2FnZU1hdGNoZXI6 Om1hdGNoKHN0ZDo6ZXhjZXB0aW9uIGNvbnN0JiBleCkgY29uc3QgeworICAgIHJldHVybiBleC53 aGF0KCkgPT0gbV9tZXNzYWdlOworfQorCitzdGQ6OnN0cmluZyBFeGNlcHRpb25NZXNzYWdlTWF0 Y2hlcjo6ZGVzY3JpYmUoKSBjb25zdCB7CisgICAgcmV0dXJuICJleGNlcHRpb24gbWVzc2FnZSBt YXRjaGVzIFwiIiArIG1fbWVzc2FnZSArICJcIiI7Cit9CisKK30KK0V4Y2VwdGlvbjo6RXhjZXB0 aW9uTWVzc2FnZU1hdGNoZXIgTWVzc2FnZShzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSkgewor ICAgIHJldHVybiBFeGNlcHRpb246OkV4Y2VwdGlvbk1lc3NhZ2VNYXRjaGVyKG1lc3NhZ2UpOwor fQorCisvLyBuYW1lc3BhY2UgRXhjZXB0aW9uCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAv LyBuYW1lc3BhY2UgQ2F0Y2gKKy8vIGVuZCBjYXRjaF9tYXRjaGVyc19leGNlcHRpb24uY3BwCisv LyBzdGFydCBjYXRjaF9tYXRjaGVyc19mbG9hdGluZy5jcHAKKworLy8gc3RhcnQgY2F0Y2hfcG9s eWZpbGxzLmhwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGJvb2wgaXNuYW4oZmxvYXQgZik7 CisgICAgYm9vbCBpc25hbihkb3VibGUgZCk7Cit9CisKKy8vIGVuZCBjYXRjaF9wb2x5ZmlsbHMu aHBwCisvLyBzdGFydCBjYXRjaF90b19zdHJpbmcuaHBwCisKKyNpbmNsdWRlIDxzdHJpbmc+CisK K25hbWVzcGFjZSBDYXRjaCB7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RkOjpz dHJpbmcgdG9fc3RyaW5nKFQgY29uc3QmIHQpIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19D UFAxMV9UT19TVFJJTkcpCisgICAgICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyh0KTsKKyNlbHNl CisgICAgICAgIFJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKKyAgICAgICAgcnNzIDw8IHQ7Cisg ICAgICAgIHJldHVybiByc3Muc3RyKCk7CisjZW5kaWYKKyAgICB9Cit9IC8vIGVuZCBuYW1lc3Bh Y2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX3RvX3N0cmluZy5ocHAKKyNpbmNsdWRlIDxhbGdvcml0 aG0+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3Rk aW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx0 eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFt ZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSB7CisKKyAgICBpbnQzMl90IGNvbnZlcnQoZmxvYXQg ZikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihmbG9hdCkgPT0gc2l6ZW9mKGludDMy X3QpLCAiSW1wb3J0YW50IFVMUCBtYXRjaGVyIGFzc3VtcHRpb24gdmlvbGF0ZWQiKTsKKyAgICAg ICAgaW50MzJfdCBpOworICAgICAgICBzdGQ6Om1lbWNweSgmaSwgJmYsIHNpemVvZihmKSk7Cisg ICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIGludDY0X3QgY29udmVydChkb3VibGUgZCkg eworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZihpbnQ2NF90 KSwgIkltcG9ydGFudCBVTFAgbWF0Y2hlciBhc3N1bXB0aW9uIHZpb2xhdGVkIik7CisgICAgICAg IGludDY0X3QgaTsKKyAgICAgICAgc3RkOjptZW1jcHkoJmksICZkLCBzaXplb2YoZCkpOworICAg ICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRlA+CisgICAg Ym9vbCBhbG1vc3RFcXVhbFVscHMoRlAgbGhzLCBGUCByaHMsIHVpbnQ2NF90IG1heFVscERpZmYp IHsKKyAgICAgICAgLy8gQ29tcGFyaXNvbiB3aXRoIE5hTiBzaG91bGQgYWx3YXlzIGJlIGZhbHNl LgorICAgICAgICAvLyBUaGlzIHdheSB3ZSBjYW4gcnVsZSBpdCBvdXQgYmVmb3JlIGdldHRpbmcg aW50byB0aGUgdWdseSBkZXRhaWxzCisgICAgICAgIGlmIChDYXRjaDo6aXNuYW4obGhzKSB8fCBD YXRjaDo6aXNuYW4ocmhzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9 CisKKyAgICAgICAgYXV0byBsYyA9IGNvbnZlcnQobGhzKTsKKyAgICAgICAgYXV0byByYyA9IGNv bnZlcnQocmhzKTsKKworICAgICAgICBpZiAoKGxjIDwgMCkgIT0gKHJjIDwgMCkpIHsKKyAgICAg ICAgICAgIC8vIFBvdGVudGlhbGx5IHdlIGNhbiBoYXZlICswIGFuZCAtMAorICAgICAgICAgICAg cmV0dXJuIGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICAvLyBzdGF0aWMgY2FzdCBh cyBhIHdvcmthcm91bmQgZm9yIElCTSBYTEMKKyAgICAgICAgYXV0byB1bHBEaWZmID0gc3RkOjph YnMoc3RhdGljX2Nhc3Q8RlA+KGxjIC0gcmMpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0 PHVpbnQ2NF90Pih1bHBEaWZmKSA8PSBtYXhVbHBEaWZmOworICAgIH0KKworI2lmIGRlZmluZWQo Q0FUQ0hfQ09ORklHX0dMT0JBTF9ORVhUQUZURVIpCisKKyAgICBmbG9hdCBuZXh0YWZ0ZXIoZmxv YXQgeCwgZmxvYXQgeSkgeworICAgICAgICByZXR1cm4gOjpuZXh0YWZ0ZXJmKHgsIHkpOworICAg IH0KKworICAgIGRvdWJsZSBuZXh0YWZ0ZXIoZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgICAgICAg IHJldHVybiA6Om5leHRhZnRlcih4LCB5KTsKKyAgICB9CisKKyNlbmRpZiAvLyBeXl4gQ0FUQ0hf Q09ORklHX0dMT0JBTF9ORVhUQUZURVIgXl5eCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGUD4KK0ZQ IHN0ZXAoRlAgc3RhcnQsIEZQIGRpcmVjdGlvbiwgdWludDY0X3Qgc3RlcHMpIHsKKyAgICBmb3Ig KHVpbnQ2NF90IGkgPSAwOyBpIDwgc3RlcHM7ICsraSkgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09O RklHX0dMT0JBTF9ORVhUQUZURVIpCisgICAgICAgIHN0YXJ0ID0gQ2F0Y2g6Om5leHRhZnRlcihz dGFydCwgZGlyZWN0aW9uKTsKKyNlbHNlCisgICAgICAgIHN0YXJ0ID0gc3RkOjpuZXh0YWZ0ZXIo c3RhcnQsIGRpcmVjdGlvbik7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIHN0YXJ0OworfQor CisvLyBQZXJmb3JtcyBlcXVpdmFsZW50IGNoZWNrIG9mIHN0ZDo6ZmFicyhsaHMgLSByaHMpIDw9 IG1hcmdpbgorLy8gQnV0IHdpdGhvdXQgdGhlIHN1YnRyYWN0aW9uIHRvIGFsbG93IGZvciBJTkZJ TklUWSBpbiBjb21wYXJpc29uCitib29sIG1hcmdpbkNvbXBhcmlzb24oZG91YmxlIGxocywgZG91 YmxlIHJocywgZG91YmxlIG1hcmdpbikgeworICAgIHJldHVybiAobGhzICsgbWFyZ2luID49IHJo cykgJiYgKHJocyArIG1hcmdpbiA+PSBsaHMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmxv YXRpbmdQb2ludD4KK3ZvaWQgd3JpdGUoc3RkOjpvc3RyZWFtJiBvdXQsIEZsb2F0aW5nUG9pbnQg bnVtKSB7CisgICAgb3V0IDw8IHN0ZDo6c2NpZW50aWZpYworICAgICAgICA8PCBzdGQ6OnNldHBy ZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPEZsb2F0aW5nUG9pbnQ+OjptYXhfZGlnaXRzMTAg LSAxKQorICAgICAgICA8PCBudW07Cit9CisKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UK KworbmFtZXNwYWNlIE1hdGNoZXJzIHsKK25hbWVzcGFjZSBGbG9hdGluZyB7CisKKyAgICBlbnVt IGNsYXNzIEZsb2F0aW5nUG9pbnRLaW5kIDogdWludDhfdCB7CisgICAgICAgIEZsb2F0LAorICAg ICAgICBEb3VibGUKKyAgICB9OworCisgICAgV2l0aGluQWJzTWF0Y2hlcjo6V2l0aGluQWJzTWF0 Y2hlcihkb3VibGUgdGFyZ2V0LCBkb3VibGUgbWFyZ2luKQorICAgICAgICA6bV90YXJnZXR7IHRh cmdldCB9LCBtX21hcmdpbnsgbWFyZ2luIH0geworICAgICAgICBDQVRDSF9FTkZPUkNFKG1hcmdp biA+PSAwLCAiSW52YWxpZCBtYXJnaW46ICIgPDwgbWFyZ2luIDw8ICcuJworICAgICAgICAgICAg PDwgIiBNYXJnaW4gaGFzIHRvIGJlIG5vbi1uZWdhdGl2ZS4iKTsKKyAgICB9CisKKyAgICAvLyBQ ZXJmb3JtcyBlcXVpdmFsZW50IGNoZWNrIG9mIHN0ZDo6ZmFicyhsaHMgLSByaHMpIDw9IG1hcmdp bgorICAgIC8vIEJ1dCB3aXRob3V0IHRoZSBzdWJ0cmFjdGlvbiB0byBhbGxvdyBmb3IgSU5GSU5J VFkgaW4gY29tcGFyaXNvbgorICAgIGJvb2wgV2l0aGluQWJzTWF0Y2hlcjo6bWF0Y2goZG91Ymxl IGNvbnN0JiBtYXRjaGVlKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobWF0Y2hlZSArIG1fbWFy Z2luID49IG1fdGFyZ2V0KSAmJiAobV90YXJnZXQgKyBtX21hcmdpbiA+PSBtYXRjaGVlKTsKKyAg ICB9CisKKyAgICBzdGQ6OnN0cmluZyBXaXRoaW5BYnNNYXRjaGVyOjpkZXNjcmliZSgpIGNvbnN0 IHsKKyAgICAgICAgcmV0dXJuICJpcyB3aXRoaW4gIiArIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5n aWZ5KG1fbWFyZ2luKSArICIgb2YgIiArIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KG1fdGFy Z2V0KTsKKyAgICB9CisKKyAgICBXaXRoaW5VbHBzTWF0Y2hlcjo6V2l0aGluVWxwc01hdGNoZXIo ZG91YmxlIHRhcmdldCwgdWludDY0X3QgdWxwcywgRmxvYXRpbmdQb2ludEtpbmQgYmFzZVR5cGUp CisgICAgICAgIDptX3RhcmdldHsgdGFyZ2V0IH0sIG1fdWxwc3sgdWxwcyB9LCBtX3R5cGV7IGJh c2VUeXBlIH0geworICAgICAgICBDQVRDSF9FTkZPUkNFKG1fdHlwZSA9PSBGbG9hdGluZ1BvaW50 S2luZDo6RG91YmxlCisgICAgICAgICAgICAgICAgICAgfHwgbV91bHBzIDwgKHN0ZDo6bnVtZXJp Y19saW1pdHM8dWludDMyX3Q+OjptYXgpKCksCisgICAgICAgICAgICAiUHJvdmlkZWQgVUxQIGlz IGltcG9zc2libHkgbGFyZ2UgZm9yIGEgZmxvYXQgY29tcGFyaXNvbi4iKTsKKyAgICB9CisKKyNp ZiBkZWZpbmVkKF9fY2xhbmdfXykKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisvLyBD bGFuZyA8My41IHJlcG9ydHMgb24gdGhlIGRlZmF1bHQgYnJhbmNoIGluIHRoZSBzd2l0Y2ggYmVs b3cKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VucmVhY2hhYmxlLWNvZGUi CisjZW5kaWYKKworICAgIGJvb2wgV2l0aGluVWxwc01hdGNoZXI6Om1hdGNoKGRvdWJsZSBjb25z dCYgbWF0Y2hlZSkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgICAgICBj YXNlIEZsb2F0aW5nUG9pbnRLaW5kOjpGbG9hdDoKKyAgICAgICAgICAgIHJldHVybiBhbG1vc3RF cXVhbFVscHM8ZmxvYXQ+KHN0YXRpY19jYXN0PGZsb2F0PihtYXRjaGVlKSwgc3RhdGljX2Nhc3Q8 ZmxvYXQ+KG1fdGFyZ2V0KSwgbV91bHBzKTsKKyAgICAgICAgY2FzZSBGbG9hdGluZ1BvaW50S2lu ZDo6RG91YmxlOgorICAgICAgICAgICAgcmV0dXJuIGFsbW9zdEVxdWFsVWxwczxkb3VibGU+KG1h dGNoZWUsIG1fdGFyZ2V0LCBtX3VscHMpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg Q0FUQ0hfSU5URVJOQUxfRVJST1IoICJVbmtub3duIEZsb2F0aW5nUG9pbnRLaW5kIHZhbHVlIiAp OworICAgICAgICB9CisgICAgfQorCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjcHJhZ21hIGNs YW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworICAgIHN0ZDo6c3RyaW5nIFdpdGhpblVscHNN YXRjaGVyOjpkZXNjcmliZSgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmV0 OworCisgICAgICAgIHJldCA8PCAiaXMgd2l0aGluICIgPDwgbV91bHBzIDw8ICIgVUxQcyBvZiAi OworCisgICAgICAgIGlmIChtX3R5cGUgPT0gRmxvYXRpbmdQb2ludEtpbmQ6OkZsb2F0KSB7Cisg ICAgICAgICAgICB3cml0ZShyZXQsIHN0YXRpY19jYXN0PGZsb2F0PihtX3RhcmdldCkpOworICAg ICAgICAgICAgcmV0IDw8ICdmJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRl KHJldCwgbV90YXJnZXQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0IDw8ICIgKFsiOworICAg ICAgICBpZiAobV90eXBlID09IEZsb2F0aW5nUG9pbnRLaW5kOjpEb3VibGUpIHsKKyAgICAgICAg ICAgIHdyaXRlKHJldCwgc3RlcChtX3RhcmdldCwgc3RhdGljX2Nhc3Q8ZG91YmxlPigtSU5GSU5J VFkpLCBtX3VscHMpKTsKKyAgICAgICAgICAgIHJldCA8PCAiLCAiOworICAgICAgICAgICAgd3Jp dGUocmV0LCBzdGVwKG1fdGFyZ2V0LCBzdGF0aWNfY2FzdDxkb3VibGU+KCBJTkZJTklUWSksIG1f dWxwcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBjYXN0 IElORklOSVRZIHRvIGZsb2F0IGJlY2F1c2Ugb2YgTWluR1csIHNlZSAjMTc4MgorICAgICAgICAg ICAgd3JpdGUocmV0LCBzdGVwKHN0YXRpY19jYXN0PGZsb2F0PihtX3RhcmdldCksIHN0YXRpY19j YXN0PGZsb2F0PigtSU5GSU5JVFkpLCBtX3VscHMpKTsKKyAgICAgICAgICAgIHJldCA8PCAiLCAi OworICAgICAgICAgICAgd3JpdGUocmV0LCBzdGVwKHN0YXRpY19jYXN0PGZsb2F0PihtX3Rhcmdl dCksIHN0YXRpY19jYXN0PGZsb2F0PiggSU5GSU5JVFkpLCBtX3VscHMpKTsKKyAgICAgICAgfQor ICAgICAgICByZXQgPDwgIl0pIjsKKworICAgICAgICByZXR1cm4gcmV0LnN0cigpOworICAgIH0K KworICAgIFdpdGhpblJlbE1hdGNoZXI6OldpdGhpblJlbE1hdGNoZXIoZG91YmxlIHRhcmdldCwg ZG91YmxlIGVwc2lsb24pOgorICAgICAgICBtX3RhcmdldCh0YXJnZXQpLAorICAgICAgICBtX2Vw c2lsb24oZXBzaWxvbil7CisgICAgICAgIENBVENIX0VORk9SQ0UobV9lcHNpbG9uID49IDAuLCAi UmVsYXRpdmUgY29tcGFyaXNvbiB3aXRoIGVwc2lsb24gPCAgMCBkb2VzIG5vdCBtYWtlIHNlbnNl LiIpOworICAgICAgICBDQVRDSF9FTkZPUkNFKG1fZXBzaWxvbiAgPCAxLiwgIlJlbGF0aXZlIGNv bXBhcmlzb24gd2l0aCBlcHNpbG9uID49IDEgZG9lcyBub3QgbWFrZSBzZW5zZS4iKTsKKyAgICB9 CisKKyAgICBib29sIFdpdGhpblJlbE1hdGNoZXI6Om1hdGNoKGRvdWJsZSBjb25zdCYgbWF0Y2hl ZSkgY29uc3QgeworICAgICAgICBjb25zdCBhdXRvIHJlbE1hcmdpbiA9IG1fZXBzaWxvbiAqIChz dGQ6Om1heCkoc3RkOjpmYWJzKG1hdGNoZWUpLCBzdGQ6OmZhYnMobV90YXJnZXQpKTsKKyAgICAg ICAgcmV0dXJuIG1hcmdpbkNvbXBhcmlzb24obWF0Y2hlZSwgbV90YXJnZXQsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNpbmYocmVsTWFyZ2luKT8gMCA6IHJlbE1hcmdp bik7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgV2l0aGluUmVsTWF0Y2hlcjo6ZGVzY3JpYmUo KSBjb25zdCB7CisgICAgICAgIENhdGNoOjpSZXVzYWJsZVN0cmluZ1N0cmVhbSBzc3RyOworICAg ICAgICBzc3RyIDw8ICJhbmQgIiA8PCBtX3RhcmdldCA8PCAiIGFyZSB3aXRoaW4gIiA8PCBtX2Vw c2lsb24gKiAxMDAuIDw8ICIlIG9mIGVhY2ggb3RoZXIiOworICAgICAgICByZXR1cm4gc3N0ci5z dHIoKTsKKyAgICB9CisKK30vLyBuYW1lc3BhY2UgRmxvYXRpbmcKKworRmxvYXRpbmc6OldpdGhp blVscHNNYXRjaGVyIFdpdGhpblVMUChkb3VibGUgdGFyZ2V0LCB1aW50NjRfdCBtYXhVbHBEaWZm KSB7CisgICAgcmV0dXJuIEZsb2F0aW5nOjpXaXRoaW5VbHBzTWF0Y2hlcih0YXJnZXQsIG1heFVs cERpZmYsIEZsb2F0aW5nOjpGbG9hdGluZ1BvaW50S2luZDo6RG91YmxlKTsKK30KKworRmxvYXRp bmc6OldpdGhpblVscHNNYXRjaGVyIFdpdGhpblVMUChmbG9hdCB0YXJnZXQsIHVpbnQ2NF90IG1h eFVscERpZmYpIHsKKyAgICByZXR1cm4gRmxvYXRpbmc6OldpdGhpblVscHNNYXRjaGVyKHRhcmdl dCwgbWF4VWxwRGlmZiwgRmxvYXRpbmc6OkZsb2F0aW5nUG9pbnRLaW5kOjpGbG9hdCk7Cit9CisK K0Zsb2F0aW5nOjpXaXRoaW5BYnNNYXRjaGVyIFdpdGhpbkFicyhkb3VibGUgdGFyZ2V0LCBkb3Vi bGUgbWFyZ2luKSB7CisgICAgcmV0dXJuIEZsb2F0aW5nOjpXaXRoaW5BYnNNYXRjaGVyKHRhcmdl dCwgbWFyZ2luKTsKK30KKworRmxvYXRpbmc6OldpdGhpblJlbE1hdGNoZXIgV2l0aGluUmVsKGRv dWJsZSB0YXJnZXQsIGRvdWJsZSBlcHMpIHsKKyAgICByZXR1cm4gRmxvYXRpbmc6OldpdGhpblJl bE1hdGNoZXIodGFyZ2V0LCBlcHMpOworfQorCitGbG9hdGluZzo6V2l0aGluUmVsTWF0Y2hlciBX aXRoaW5SZWwoZG91YmxlIHRhcmdldCkgeworICAgIHJldHVybiBGbG9hdGluZzo6V2l0aGluUmVs TWF0Y2hlcih0YXJnZXQsIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpICog MTAwKTsKK30KKworRmxvYXRpbmc6OldpdGhpblJlbE1hdGNoZXIgV2l0aGluUmVsKGZsb2F0IHRh cmdldCwgZmxvYXQgZXBzKSB7CisgICAgcmV0dXJuIEZsb2F0aW5nOjpXaXRoaW5SZWxNYXRjaGVy KHRhcmdldCwgZXBzKTsKK30KKworRmxvYXRpbmc6OldpdGhpblJlbE1hdGNoZXIgV2l0aGluUmVs KGZsb2F0IHRhcmdldCkgeworICAgIHJldHVybiBGbG9hdGluZzo6V2l0aGluUmVsTWF0Y2hlcih0 YXJnZXQsIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjplcHNpbG9uKCkgKiAxMDApOworfQor Cit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKy8vIGVuZCBj YXRjaF9tYXRjaGVyc19mbG9hdGluZy5jcHAKKy8vIHN0YXJ0IGNhdGNoX21hdGNoZXJzX2dlbmVy aWMuY3BwCisKK3N0ZDo6c3RyaW5nIENhdGNoOjpNYXRjaGVyczo6R2VuZXJpYzo6RGV0YWlsOjpm aW5hbGl6ZURlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjKSB7CisgICAgaWYgKGRl c2MuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gIm1hdGNoZXMgdW5kZXNjcmliZWQgcHJlZGlj YXRlIjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIm1hdGNoZXMgcHJlZGljYXRlOiBc IiIgKyBkZXNjICsgJyInOworICAgIH0KK30KKy8vIGVuZCBjYXRjaF9tYXRjaGVyc19nZW5lcmlj LmNwcAorLy8gc3RhcnQgY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmNwcAorCisjaW5jbHVkZSA8cmVn ZXg+CisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisgICAgbmFt ZXNwYWNlIFN0ZFN0cmluZyB7CisKKyAgICAgICAgQ2FzZWRTdHJpbmc6OkNhc2VkU3RyaW5nKCBz dGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2 aXR5ICkKKyAgICAgICAgOiAgIG1fY2FzZVNlbnNpdGl2aXR5KCBjYXNlU2Vuc2l0aXZpdHkgKSwK KyAgICAgICAgICAgIG1fc3RyKCBhZGp1c3RTdHJpbmcoIHN0ciApICkKKyAgICAgICAge30KKyAg ICAgICAgc3RkOjpzdHJpbmcgQ2FzZWRTdHJpbmc6OmFkanVzdFN0cmluZyggc3RkOjpzdHJpbmcg Y29uc3QmIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Nhc2VTZW5zaXRpdml0 eSA9PSBDYXNlU2Vuc2l0aXZlOjpObworICAgICAgICAgICAgICAgICAgID8gdG9Mb3dlciggc3Ry ICkKKyAgICAgICAgICAgICAgICAgICA6IHN0cjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0 cmluZyBDYXNlZFN0cmluZzo6Y2FzZVNlbnNpdGl2aXR5U3VmZml4KCkgY29uc3QgeworICAgICAg ICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vCisgICAg ICAgICAgICAgICAgICAgPyAiIChjYXNlIGluc2Vuc2l0aXZlKSIKKyAgICAgICAgICAgICAgICAg ICA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdNYXRjaGVyQmFz ZTo6U3RyaW5nTWF0Y2hlckJhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRpb24sIENhc2Vk U3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkKKyAgICAgICAgOiBtX2NvbXBhcmF0b3IoIGNvbXBh cmF0b3IgKSwKKyAgICAgICAgICBtX29wZXJhdGlvbiggb3BlcmF0aW9uICkgeworICAgICAgICB9 CisKKyAgICAgICAgc3RkOjpzdHJpbmcgU3RyaW5nTWF0Y2hlckJhc2U6OmRlc2NyaWJlKCkgY29u c3QgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICBk ZXNjcmlwdGlvbi5yZXNlcnZlKDUgKyBtX29wZXJhdGlvbi5zaXplKCkgKyBtX2NvbXBhcmF0b3Iu bV9zdHIuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt X2NvbXBhcmF0b3IuY2FzZVNlbnNpdGl2aXR5U3VmZml4KCkuc2l6ZSgpKTsKKyAgICAgICAgICAg IGRlc2NyaXB0aW9uICs9IG1fb3BlcmF0aW9uOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0g IjogXCIiOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9jb21wYXJhdG9yLm1fc3RyOwor ICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIlwiIjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9u ICs9IG1fY29tcGFyYXRvci5jYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKTsKKyAgICAgICAgICAgIHJl dHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEVxdWFsc01hdGNoZXI6OkVx dWFsc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRj aGVyQmFzZSggImVxdWFscyIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgRXF1YWxz TWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAg ICAgICAgICByZXR1cm4gbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICkgPT0gbV9j b21wYXJhdG9yLm1fc3RyOworICAgICAgICB9CisKKyAgICAgICAgQ29udGFpbnNNYXRjaGVyOjpD b250YWluc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdN YXRjaGVyQmFzZSggImNvbnRhaW5zIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBD b250YWluc01hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3Qg eworICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5n KCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgICAgICBT dGFydHNXaXRoTWF0Y2hlcjo6U3RhcnRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBj b21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggInN0YXJ0cyB3aXRoIiwgY29tcGFyYXRv ciApIHt9CisKKyAgICAgICAgYm9vbCBTdGFydHNXaXRoTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3Ry aW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRzV2l0 aCggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICksIG1fY29tcGFyYXRvci5tX3N0 ciApOworICAgICAgICB9CisKKyAgICAgICAgRW5kc1dpdGhNYXRjaGVyOjpFbmRzV2l0aE1hdGNo ZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSgg ImVuZHMgd2l0aCIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgRW5kc1dpdGhNYXRj aGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAg ICAgIHJldHVybiBlbmRzV2l0aCggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICks IG1fY29tcGFyYXRvci5tX3N0ciApOworICAgICAgICB9CisKKyAgICAgICAgUmVnZXhNYXRjaGVy OjpSZWdleE1hdGNoZXIoc3RkOjpzdHJpbmcgcmVnZXgsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBj YXNlU2Vuc2l0aXZpdHkpOiBtX3JlZ2V4KHN0ZDo6bW92ZShyZWdleCkpLCBtX2Nhc2VTZW5zaXRp dml0eShjYXNlU2Vuc2l0aXZpdHkpIHt9CisKKyAgICAgICAgYm9vbCBSZWdleE1hdGNoZXI6Om1h dGNoKHN0ZDo6c3RyaW5nIGNvbnN0JiBtYXRjaGVlKSBjb25zdCB7CisgICAgICAgICAgICBhdXRv IGZsYWdzID0gc3RkOjpyZWdleDo6RUNNQVNjcmlwdDsgLy8gRUNNQVNjcmlwdCBpcyB0aGUgZGVm YXVsdCBzeW50YXggb3B0aW9uIGFueXdheQorICAgICAgICAgICAgaWYgKG1fY2FzZVNlbnNpdGl2 aXR5ID09IENhc2VTZW5zaXRpdmU6OkNob2ljZTo6Tm8pIHsKKyAgICAgICAgICAgICAgICBmbGFn cyB8PSBzdGQ6OnJlZ2V4OjppY2FzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8g cmVnID0gc3RkOjpyZWdleChtX3JlZ2V4LCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gc3Rk OjpyZWdleF9tYXRjaChtYXRjaGVlLCByZWcpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpz dHJpbmcgUmVnZXhNYXRjaGVyOjpkZXNjcmliZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVy biAibWF0Y2hlcyAiICsgOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkobV9yZWdleCkgKyAoKG1f Y2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6OkNob2ljZTo6WWVzKT8gIiBjYXNlIHNl bnNpdGl2ZWx5IiA6ICIgY2FzZSBpbnNlbnNpdGl2ZWx5Iik7CisgICAgICAgIH0KKworICAgIH0g Ly8gbmFtZXNwYWNlIFN0ZFN0cmluZworCisgICAgU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyIEVx dWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VT ZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6RXF1YWxzTWF0Y2hlcigg U3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQor ICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25z dCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAg ICByZXR1cm4gU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJp bmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OkVuZHNX aXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2 ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6 RW5kc1dpdGhNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRp dml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciBTdGFydHNX aXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNl bnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hl ciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAg fQorCisgICAgU3RkU3RyaW5nOjpSZWdleE1hdGNoZXIgTWF0Y2hlcyhzdGQ6OnN0cmluZyBjb25z dCYgcmVnZXgsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkpIHsKKyAgICAg ICAgcmV0dXJuIFN0ZFN0cmluZzo6UmVnZXhNYXRjaGVyKHJlZ2V4LCBjYXNlU2Vuc2l0aXZpdHkp OworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNo CisvLyBlbmQgY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmNwcAorLy8gc3RhcnQgY2F0Y2hfbWVzc2Fn ZS5jcHAKKworLy8gc3RhcnQgY2F0Y2hfdW5jYXVnaHRfZXhjZXB0aW9ucy5oCisKK25hbWVzcGFj ZSBDYXRjaCB7CisgICAgYm9vbCB1bmNhdWdodF9leGNlcHRpb25zKCk7Cit9IC8vIGVuZCBuYW1l c3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX3VuY2F1Z2h0X2V4Y2VwdGlvbnMuaAorI2luY2x1 ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RhY2s+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAg ICBNZXNzYWdlSW5mbzo6TWVzc2FnZUluZm8oICAgU3RyaW5nUmVmIGNvbnN0JiBfbWFjcm9OYW1l LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYg X2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9m VHlwZSBfdHlwZSApCisgICAgOiAgIG1hY3JvTmFtZSggX21hY3JvTmFtZSApLAorICAgICAgICBs aW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIHR5cGUoIF90eXBlICksCisgICAgICAgIHNl cXVlbmNlKCArK2dsb2JhbENvdW50ICkKKyAgICB7fQorCisgICAgYm9vbCBNZXNzYWdlSW5mbzo6 b3BlcmF0b3I9PSggTWVzc2FnZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICBy ZXR1cm4gc2VxdWVuY2UgPT0gb3RoZXIuc2VxdWVuY2U7CisgICAgfQorCisgICAgYm9vbCBNZXNz YWdlSW5mbzo6b3BlcmF0b3I8KCBNZXNzYWdlSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7Cisg ICAgICAgIHJldHVybiBzZXF1ZW5jZSA8IG90aGVyLnNlcXVlbmNlOworICAgIH0KKworICAgIC8v IFRoaXMgbWF5IG5lZWQgcHJvdGVjdGluZyBpZiB0aHJlYWRpbmcgc3VwcG9ydCBpcyBhZGRlZAor ICAgIHVuc2lnbmVkIGludCBNZXNzYWdlSW5mbzo6Z2xvYmFsQ291bnQgPSAwOworCisgICAgLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLworCisgICAgQ2F0Y2g6Ok1lc3NhZ2VCdWlsZGVyOjpNZXNzYWdlQnVp bGRlciggU3RyaW5nUmVmIGNvbnN0JiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBl IHR5cGUgKQorICAgICAgICA6bV9pbmZvKG1hY3JvTmFtZSwgbGluZUluZm8sIHR5cGUpIHt9CisK KyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBTY29wZWRNZXNzYWdlOjpTY29wZWRNZXNz YWdlKCBNZXNzYWdlQnVpbGRlciBjb25zdCYgYnVpbGRlciApCisgICAgOiBtX2luZm8oIGJ1aWxk ZXIubV9pbmZvICksIG1fbW92ZWQoKQorICAgIHsKKyAgICAgICAgbV9pbmZvLm1lc3NhZ2UgPSBi dWlsZGVyLm1fc3RyZWFtLnN0cigpOworICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkucHVzaFNj b3BlZE1lc3NhZ2UoIG1faW5mbyApOworICAgIH0KKworICAgIFNjb3BlZE1lc3NhZ2U6OlNjb3Bl ZE1lc3NhZ2UoIFNjb3BlZE1lc3NhZ2UmJiBvbGQgKQorICAgIDogbV9pbmZvKCBvbGQubV9pbmZv ICksIG1fbW92ZWQoKQorICAgIHsKKyAgICAgICAgb2xkLm1fbW92ZWQgPSB0cnVlOworICAgIH0K KworICAgIFNjb3BlZE1lc3NhZ2U6On5TY29wZWRNZXNzYWdlKCkgeworICAgICAgICBpZiAoICF1 bmNhdWdodF9leGNlcHRpb25zKCkgJiYgIW1fbW92ZWQgKXsKKyAgICAgICAgICAgIGdldFJlc3Vs dENhcHR1cmUoKS5wb3BTY29wZWRNZXNzYWdlKG1faW5mbyk7CisgICAgICAgIH0KKyAgICB9CisK KyAgICBDYXB0dXJlcjo6Q2FwdHVyZXIoIFN0cmluZ1JlZiBtYWNyb05hbWUsIFNvdXJjZUxpbmVJ bmZvIGNvbnN0JiBsaW5lSW5mbywgUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSwgU3RyaW5n UmVmIG5hbWVzICkgeworICAgICAgICBhdXRvIHRyaW1tZWQgPSBbJl0gKHNpemVfdCBzdGFydCwg c2l6ZV90IGVuZCkgeworICAgICAgICAgICAgd2hpbGUgKG5hbWVzW3N0YXJ0XSA9PSAnLCcgfHwg aXNzcGFjZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihuYW1lc1tzdGFydF0pKSkgeworICAg ICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAo bmFtZXNbZW5kXSA9PSAnLCcgfHwgaXNzcGFjZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihu YW1lc1tlbmRdKSkpIHsKKyAgICAgICAgICAgICAgICAtLWVuZDsKKyAgICAgICAgICAgIH0KKyAg ICAgICAgICAgIHJldHVybiBuYW1lcy5zdWJzdHIoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7Cisg ICAgICAgIH07CisgICAgICAgIGF1dG8gc2tpcHEgPSBbJl0gKHNpemVfdCBzdGFydCwgY2hhciBx dW90ZSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBzdGFydCArIDE7IGkgPCBuYW1lcy5z aXplKCkgOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZXNbaV0gPT0gcXVvdGUpCisg ICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIGlmIChuYW1lc1tp XSA9PSAnXFwnKQorICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAg ICAgICAgICBDQVRDSF9JTlRFUk5BTF9FUlJPUigiQ0FQVFVSRSBwYXJzaW5nIGVuY291bnRlcmVk IHVubWF0Y2hlZCBxdW90ZSIpOworICAgICAgICB9OworCisgICAgICAgIHNpemVfdCBzdGFydCA9 IDA7CisgICAgICAgIHN0ZDo6c3RhY2s8Y2hhcj4gb3BlbmluZ3M7CisgICAgICAgIGZvciAoc2l6 ZV90IHBvcyA9IDA7IHBvcyA8IG5hbWVzLnNpemUoKTsgKytwb3MpIHsKKyAgICAgICAgICAgIGNo YXIgYyA9IG5hbWVzW3Bvc107CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAg IGNhc2UgJ1snOgorICAgICAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICBjYXNlICcoJzoK KyAgICAgICAgICAgIC8vIEl0IGlzIGJhc2ljYWxseSBpbXBvc3NpYmxlIHRvIGRpc2FtYmlndWF0 ZSBiZXR3ZWVuCisgICAgICAgICAgICAvLyBjb21wYXJpc29uIGFuZCBzdGFydCBvZiB0ZW1wbGF0 ZSBhcmdzIGluIHRoaXMgY29udGV4dAorLy8gICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAg ICAgICAgICBvcGVuaW5ncy5wdXNoKGMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg ICAgICAgY2FzZSAnXSc6CisgICAgICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgIGNhc2Ug JyknOgorLy8gICAgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICAgICAgIG9wZW5pbmdzLnBv cCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIic6CisgICAg ICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgICAgcG9zID0gc2tpcHEocG9zLCBjKTsK KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAg ICAgICAgIGlmIChzdGFydCAhPSBwb3MgJiYgb3BlbmluZ3MuZW1wdHkoKSkgeworICAgICAgICAg ICAgICAgICAgICBtX21lc3NhZ2VzLmVtcGxhY2VfYmFjayhtYWNyb05hbWUsIGxpbmVJbmZvLCBy ZXN1bHRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgbV9tZXNzYWdlcy5iYWNrKCkubWVzc2Fn ZSA9IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nPih0cmltbWVkKHN0YXJ0LCBwb3MpKTsKKyAgICAg ICAgICAgICAgICAgICAgbV9tZXNzYWdlcy5iYWNrKCkubWVzc2FnZSArPSAiIDo9ICI7CisgICAg ICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnQob3BlbmluZ3MuZW1wdHkoKSAmJiAiTWlz bWF0Y2hlZCBvcGVuaW5ncyIpOworICAgICAgICBtX21lc3NhZ2VzLmVtcGxhY2VfYmFjayhtYWNy b05hbWUsIGxpbmVJbmZvLCByZXN1bHRUeXBlKTsKKyAgICAgICAgbV9tZXNzYWdlcy5iYWNrKCku bWVzc2FnZSA9IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nPih0cmltbWVkKHN0YXJ0LCBuYW1lcy5z aXplKCkgLSAxKSk7CisgICAgICAgIG1fbWVzc2FnZXMuYmFjaygpLm1lc3NhZ2UgKz0gIiA6PSAi OworICAgIH0KKyAgICBDYXB0dXJlcjo6fkNhcHR1cmVyKCkgeworICAgICAgICBpZiAoICF1bmNh dWdodF9leGNlcHRpb25zKCkgKXsKKyAgICAgICAgICAgIGFzc2VydCggbV9jYXB0dXJlZCA9PSBt X21lc3NhZ2VzLnNpemUoKSApOworICAgICAgICAgICAgZm9yKCBzaXplX3QgaSA9IDA7IGkgPCBt X2NhcHR1cmVkOyArK2kgICkKKyAgICAgICAgICAgICAgICBtX3Jlc3VsdENhcHR1cmUucG9wU2Nv cGVkTWVzc2FnZSggbV9tZXNzYWdlc1tpXSApOworICAgICAgICB9CisgICAgfQorCisgICAgdm9p ZCBDYXB0dXJlcjo6Y2FwdHVyZVZhbHVlKCBzaXplX3QgaW5kZXgsIHN0ZDo6c3RyaW5nIGNvbnN0 JiB2YWx1ZSApIHsKKyAgICAgICAgYXNzZXJ0KCBpbmRleCA8IG1fbWVzc2FnZXMuc2l6ZSgpICk7 CisgICAgICAgIG1fbWVzc2FnZXNbaW5kZXhdLm1lc3NhZ2UgKz0gdmFsdWU7CisgICAgICAgIG1f cmVzdWx0Q2FwdHVyZS5wdXNoU2NvcGVkTWVzc2FnZSggbV9tZXNzYWdlc1tpbmRleF0gKTsKKyAg ICAgICAgbV9jYXB0dXJlZCsrOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisv LyBlbmQgY2F0Y2hfbWVzc2FnZS5jcHAKKy8vIHN0YXJ0IGNhdGNoX291dHB1dF9yZWRpcmVjdC5j cHAKKworLy8gc3RhcnQgY2F0Y2hfb3V0cHV0X3JlZGlyZWN0LmgKKyNpZm5kZWYgVFdPQkxVRUNV QkVTX0NBVENIX09VVFBVVF9SRURJUkVDVF9ICisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9P VVRQVVRfUkVESVJFQ1RfSAorCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGlvc2Z3ZD4K KyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBSZWRp cmVjdGVkU3RyZWFtIHsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBtX29yaWdpbmFsU3RyZWFtOwor ICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fcmVkaXJlY3Rpb25TdHJlYW07CisgICAgICAgIHN0ZDo6 c3RyZWFtYnVmKiBtX3ByZXZCdWY7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFJlZGlyZWN0ZWRT dHJlYW0oIHN0ZDo6b3N0cmVhbSYgb3JpZ2luYWxTdHJlYW0sIHN0ZDo6b3N0cmVhbSYgcmVkaXJl Y3Rpb25TdHJlYW0gKTsKKyAgICAgICAgflJlZGlyZWN0ZWRTdHJlYW0oKTsKKyAgICB9OworCisg ICAgY2xhc3MgUmVkaXJlY3RlZFN0ZE91dCB7CisgICAgICAgIFJldXNhYmxlU3RyaW5nU3RyZWFt IG1fcnNzOworICAgICAgICBSZWRpcmVjdGVkU3RyZWFtIG1fY291dDsKKyAgICBwdWJsaWM6Cisg ICAgICAgIFJlZGlyZWN0ZWRTdGRPdXQoKTsKKyAgICAgICAgYXV0byBzdHIoKSBjb25zdCAtPiBz dGQ6OnN0cmluZzsKKyAgICB9OworCisgICAgLy8gU3RkRXJyIGhhcyB0d28gY29uc3RpdHVlbnQg c3RyZWFtcyBpbiBDKyssIHN0ZDo6Y2VyciBhbmQgc3RkOjpjbG9nCisgICAgLy8gVGhpcyBtZWFu cyB0aGF0IHdlIG5lZWQgdG8gcmVkaXJlY3QgMiBzdHJlYW1zIGludG8gMSB0byBrZWVwIHByb3Bl cgorICAgIC8vIG9yZGVyIG9mIHdyaXRlcworICAgIGNsYXNzIFJlZGlyZWN0ZWRTdGRFcnIgewor ICAgICAgICBSZXVzYWJsZVN0cmluZ1N0cmVhbSBtX3JzczsKKyAgICAgICAgUmVkaXJlY3RlZFN0 cmVhbSBtX2NlcnI7CisgICAgICAgIFJlZGlyZWN0ZWRTdHJlYW0gbV9jbG9nOworICAgIHB1Ymxp YzoKKyAgICAgICAgUmVkaXJlY3RlZFN0ZEVycigpOworICAgICAgICBhdXRvIHN0cigpIGNvbnN0 IC0+IHN0ZDo6c3RyaW5nOworICAgIH07CisKKyAgICBjbGFzcyBSZWRpcmVjdGVkU3RyZWFtcyB7 CisgICAgcHVibGljOgorICAgICAgICBSZWRpcmVjdGVkU3RyZWFtcyhSZWRpcmVjdGVkU3RyZWFt cyBjb25zdCYpID0gZGVsZXRlOworICAgICAgICBSZWRpcmVjdGVkU3RyZWFtcyYgb3BlcmF0b3I9 KFJlZGlyZWN0ZWRTdHJlYW1zIGNvbnN0JikgPSBkZWxldGU7CisgICAgICAgIFJlZGlyZWN0ZWRT dHJlYW1zKFJlZGlyZWN0ZWRTdHJlYW1zJiYpID0gZGVsZXRlOworICAgICAgICBSZWRpcmVjdGVk U3RyZWFtcyYgb3BlcmF0b3I9KFJlZGlyZWN0ZWRTdHJlYW1zJiYpID0gZGVsZXRlOworCisgICAg ICAgIFJlZGlyZWN0ZWRTdHJlYW1zKHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ291dCwgc3RkOjpz dHJpbmcmIHJlZGlyZWN0ZWRDZXJyKTsKKyAgICAgICAgflJlZGlyZWN0ZWRTdHJlYW1zKCk7Cisg ICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcmIG1fcmVkaXJlY3RlZENvdXQ7CisgICAg ICAgIHN0ZDo6c3RyaW5nJiBtX3JlZGlyZWN0ZWRDZXJyOworICAgICAgICBSZWRpcmVjdGVkU3Rk T3V0IG1fcmVkaXJlY3RlZFN0ZE91dDsKKyAgICAgICAgUmVkaXJlY3RlZFN0ZEVyciBtX3JlZGly ZWN0ZWRTdGRFcnI7CisgICAgfTsKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX05FV19DQVBU VVJFKQorCisgICAgLy8gV2luZG93cydzIGltcGxlbWVudGF0aW9uIG9mIHN0ZDo6dG1wZmlsZSBp cyB0ZXJyaWJsZSAoaXQgdHJpZXMKKyAgICAvLyB0byBjcmVhdGUgYSBmaWxlIGluc2lkZSBzeXN0 ZW0gZm9sZGVyLCB0aHVzIHJlcXVpcmluZyBlbGV2YXRlZAorICAgIC8vIHByaXZpbGVnZXMgZm9y IHRoZSBiaW5hcnkpLCBzbyB3ZSBoYXZlIHRvIHVzZSB0bXBuYW0oX3MpIGFuZAorICAgIC8vIGNy ZWF0ZSB0aGUgZmlsZSBvdXJzZWx2ZXMgdGhlcmUuCisgICAgY2xhc3MgVGVtcEZpbGUgeworICAg IHB1YmxpYzoKKyAgICAgICAgVGVtcEZpbGUoVGVtcEZpbGUgY29uc3QmKSA9IGRlbGV0ZTsKKyAg ICAgICAgVGVtcEZpbGUmIG9wZXJhdG9yPShUZW1wRmlsZSBjb25zdCYpID0gZGVsZXRlOworICAg ICAgICBUZW1wRmlsZShUZW1wRmlsZSYmKSA9IGRlbGV0ZTsKKyAgICAgICAgVGVtcEZpbGUmIG9w ZXJhdG9yPShUZW1wRmlsZSYmKSA9IGRlbGV0ZTsKKworICAgICAgICBUZW1wRmlsZSgpOworICAg ICAgICB+VGVtcEZpbGUoKTsKKworICAgICAgICBzdGQ6OkZJTEUqIGdldEZpbGUoKTsKKyAgICAg ICAgc3RkOjpzdHJpbmcgZ2V0Q29udGVudHMoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0 ZDo6RklMRSogbV9maWxlID0gbnVsbHB0cjsKKyAgICAjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAg ICAgICAgY2hhciBtX2J1ZmZlcltMX3RtcG5hbV0gPSB7IDAgfTsKKyAgICAjZW5kaWYKKyAgICB9 OworCisgICAgY2xhc3MgT3V0cHV0UmVkaXJlY3QgeworICAgIHB1YmxpYzoKKyAgICAgICAgT3V0 cHV0UmVkaXJlY3QoT3V0cHV0UmVkaXJlY3QgY29uc3QmKSA9IGRlbGV0ZTsKKyAgICAgICAgT3V0 cHV0UmVkaXJlY3QmIG9wZXJhdG9yPShPdXRwdXRSZWRpcmVjdCBjb25zdCYpID0gZGVsZXRlOwor ICAgICAgICBPdXRwdXRSZWRpcmVjdChPdXRwdXRSZWRpcmVjdCYmKSA9IGRlbGV0ZTsKKyAgICAg ICAgT3V0cHV0UmVkaXJlY3QmIG9wZXJhdG9yPShPdXRwdXRSZWRpcmVjdCYmKSA9IGRlbGV0ZTsK KworICAgICAgICBPdXRwdXRSZWRpcmVjdChzdGQ6OnN0cmluZyYgc3Rkb3V0X2Rlc3QsIHN0ZDo6 c3RyaW5nJiBzdGRlcnJfZGVzdCk7CisgICAgICAgIH5PdXRwdXRSZWRpcmVjdCgpOworCisgICAg cHJpdmF0ZToKKyAgICAgICAgaW50IG1fb3JpZ2luYWxTdGRvdXQgPSAtMTsKKyAgICAgICAgaW50 IG1fb3JpZ2luYWxTdGRlcnIgPSAtMTsKKyAgICAgICAgVGVtcEZpbGUgbV9zdGRvdXRGaWxlOwor ICAgICAgICBUZW1wRmlsZSBtX3N0ZGVyckZpbGU7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBtX3N0 ZG91dERlc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBtX3N0ZGVyckRlc3Q7CisgICAgfTsKKwor I2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZW5kaWYgLy8gVFdPQkxVRUNV QkVTX0NBVENIX09VVFBVVF9SRURJUkVDVF9ICisvLyBlbmQgY2F0Y2hfb3V0cHV0X3JlZGlyZWN0 LmgKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxmc3Ry ZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaWYgZGVm aW5lZChDQVRDSF9DT05GSUdfTkVXX0NBUFRVUkUpCisgICAgI2lmIGRlZmluZWQoX01TQ19WRVIp CisgICAgI2luY2x1ZGUgPGlvLmg+ICAgICAgLy9fZHVwIGFuZCBfZHVwMgorICAgICNkZWZpbmUg ZHVwIF9kdXAKKyAgICAjZGVmaW5lIGR1cDIgX2R1cDIKKyAgICAjZGVmaW5lIGZpbGVubyBfZmls ZW5vCisgICAgI2Vsc2UKKyAgICAjaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBkdXAgYW5kIGR1cDIK KyAgICAjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgUmVkaXJlY3Rl ZFN0cmVhbTo6UmVkaXJlY3RlZFN0cmVhbSggc3RkOjpvc3RyZWFtJiBvcmlnaW5hbFN0cmVhbSwg c3RkOjpvc3RyZWFtJiByZWRpcmVjdGlvblN0cmVhbSApCisgICAgOiAgIG1fb3JpZ2luYWxTdHJl YW0oIG9yaWdpbmFsU3RyZWFtICksCisgICAgICAgIG1fcmVkaXJlY3Rpb25TdHJlYW0oIHJlZGly ZWN0aW9uU3RyZWFtICksCisgICAgICAgIG1fcHJldkJ1ZiggbV9vcmlnaW5hbFN0cmVhbS5yZGJ1 ZigpICkKKyAgICB7CisgICAgICAgIG1fb3JpZ2luYWxTdHJlYW0ucmRidWYoIG1fcmVkaXJlY3Rp b25TdHJlYW0ucmRidWYoKSApOworICAgIH0KKworICAgIFJlZGlyZWN0ZWRTdHJlYW06On5SZWRp cmVjdGVkU3RyZWFtKCkgeworICAgICAgICBtX29yaWdpbmFsU3RyZWFtLnJkYnVmKCBtX3ByZXZC dWYgKTsKKyAgICB9CisKKyAgICBSZWRpcmVjdGVkU3RkT3V0OjpSZWRpcmVjdGVkU3RkT3V0KCkg OiBtX2NvdXQoIENhdGNoOjpjb3V0KCksIG1fcnNzLmdldCgpICkge30KKyAgICBhdXRvIFJlZGly ZWN0ZWRTdGRPdXQ6OnN0cigpIGNvbnN0IC0+IHN0ZDo6c3RyaW5nIHsgcmV0dXJuIG1fcnNzLnN0 cigpOyB9CisKKyAgICBSZWRpcmVjdGVkU3RkRXJyOjpSZWRpcmVjdGVkU3RkRXJyKCkKKyAgICA6 ICAgbV9jZXJyKCBDYXRjaDo6Y2VycigpLCBtX3Jzcy5nZXQoKSApLAorICAgICAgICBtX2Nsb2co IENhdGNoOjpjbG9nKCksIG1fcnNzLmdldCgpICkKKyAgICB7fQorICAgIGF1dG8gUmVkaXJlY3Rl ZFN0ZEVycjo6c3RyKCkgY29uc3QgLT4gc3RkOjpzdHJpbmcgeyByZXR1cm4gbV9yc3Muc3RyKCk7 IH0KKworICAgIFJlZGlyZWN0ZWRTdHJlYW1zOjpSZWRpcmVjdGVkU3RyZWFtcyhzdGQ6OnN0cmlu ZyYgcmVkaXJlY3RlZENvdXQsIHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ2VycikKKyAgICA6ICAg bV9yZWRpcmVjdGVkQ291dChyZWRpcmVjdGVkQ291dCksCisgICAgICAgIG1fcmVkaXJlY3RlZENl cnIocmVkaXJlY3RlZENlcnIpCisgICAge30KKworICAgIFJlZGlyZWN0ZWRTdHJlYW1zOjp+UmVk aXJlY3RlZFN0cmVhbXMoKSB7CisgICAgICAgIG1fcmVkaXJlY3RlZENvdXQgKz0gbV9yZWRpcmVj dGVkU3RkT3V0LnN0cigpOworICAgICAgICBtX3JlZGlyZWN0ZWRDZXJyICs9IG1fcmVkaXJlY3Rl ZFN0ZEVyci5zdHIoKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19ORVdfQ0FQ VFVSRSkKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisgICAgVGVtcEZpbGU6OlRlbXBGaWxlKCkg eworICAgICAgICBpZiAodG1wbmFtX3MobV9idWZmZXIpKSB7CisgICAgICAgICAgICBDQVRDSF9S VU5USU1FX0VSUk9SKCJDb3VsZCBub3QgZ2V0IGEgdGVtcCBmaWxlbmFtZSIpOworICAgICAgICB9 CisgICAgICAgIGlmIChmb3Blbl9zKCZtX2ZpbGUsIG1fYnVmZmVyLCAidysiKSkgeworICAgICAg ICAgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICAgICAgICAgIGlmIChzdHJlcnJvcl9zKGJ1ZmZl ciwgZXJybm8pKSB7CisgICAgICAgICAgICAgICAgQ0FUQ0hfUlVOVElNRV9FUlJPUigiQ291bGQg bm90IHRyYW5zbGF0ZSBlcnJubyB0byBhIHN0cmluZyIpOworICAgICAgICAgICAgfQorICAgICAg ICAgICAgQ0FUQ0hfUlVOVElNRV9FUlJPUigiQ291bGQgbm90IG9wZW4gdGhlIHRlbXAgZmlsZTog JyIgPDwgbV9idWZmZXIgPDwgIicgYmVjYXVzZTogIiA8PCBidWZmZXIpOworICAgICAgICB9Cisg ICAgfQorI2Vsc2UKKyAgICBUZW1wRmlsZTo6VGVtcEZpbGUoKSB7CisgICAgICAgIG1fZmlsZSA9 IHN0ZDo6dG1wZmlsZSgpOworICAgICAgICBpZiAoIW1fZmlsZSkgeworICAgICAgICAgICAgQ0FU Q0hfUlVOVElNRV9FUlJPUigiQ291bGQgbm90IGNyZWF0ZSBhIHRlbXAgZmlsZS4iKTsKKyAgICAg ICAgfQorICAgIH0KKworI2VuZGlmCisKKyAgICBUZW1wRmlsZTo6flRlbXBGaWxlKCkgeworICAg ICAgICAgLy8gVEJEOiBXaGF0IHRvIGRvIGFib3V0IGVycm9ycyBoZXJlPworICAgICAgICAgc3Rk OjpmY2xvc2UobV9maWxlKTsKKyAgICAgICAgIC8vIFdlIG1hbnVhbGx5IGNyZWF0ZSB0aGUgZmls ZSBvbiBXaW5kb3dzIG9ubHksIG9uIExpbnV4CisgICAgICAgICAvLyBpdCB3aWxsIGJlIGF1dG9k ZWxldGVkCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICAgICAgIHN0ZDo6cmVtb3ZlKG1fYnVm ZmVyKTsKKyNlbmRpZgorICAgIH0KKworICAgIEZJTEUqIFRlbXBGaWxlOjpnZXRGaWxlKCkgewor ICAgICAgICByZXR1cm4gbV9maWxlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIFRlbXBGaWxl OjpnZXRDb250ZW50cygpIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3N0cjsKKyAgICAg ICAgY2hhciBidWZmZXJbMTAwXSA9IHt9OworICAgICAgICBzdGQ6OnJld2luZChtX2ZpbGUpOwor ICAgICAgICB3aGlsZSAoc3RkOjpmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBtX2ZpbGUp KSB7CisgICAgICAgICAgICBzc3RyIDw8IGJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1 cm4gc3N0ci5zdHIoKTsKKyAgICB9CisKKyAgICBPdXRwdXRSZWRpcmVjdDo6T3V0cHV0UmVkaXJl Y3Qoc3RkOjpzdHJpbmcmIHN0ZG91dF9kZXN0LCBzdGQ6OnN0cmluZyYgc3RkZXJyX2Rlc3QpIDoK KyAgICAgICAgbV9vcmlnaW5hbFN0ZG91dChkdXAoMSkpLAorICAgICAgICBtX29yaWdpbmFsU3Rk ZXJyKGR1cCgyKSksCisgICAgICAgIG1fc3Rkb3V0RGVzdChzdGRvdXRfZGVzdCksCisgICAgICAg IG1fc3RkZXJyRGVzdChzdGRlcnJfZGVzdCkgeworICAgICAgICBkdXAyKGZpbGVubyhtX3N0ZG91 dEZpbGUuZ2V0RmlsZSgpKSwgMSk7CisgICAgICAgIGR1cDIoZmlsZW5vKG1fc3RkZXJyRmlsZS5n ZXRGaWxlKCkpLCAyKTsKKyAgICB9CisKKyAgICBPdXRwdXRSZWRpcmVjdDo6fk91dHB1dFJlZGly ZWN0KCkgeworICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHN0ZDo6Zmx1c2g7CisgICAgICAgIGZm bHVzaChzdGRvdXQpOworICAgICAgICAvLyBTaW5jZSB3ZSBzdXBwb3J0IG92ZXJyaWRpbmcgdGhl c2Ugc3RyZWFtcywgd2UgZmx1c2ggY2VycgorICAgICAgICAvLyBldmVuIHRob3VnaCBzdGQ6OmNl cnIgaXMgdW5idWZmZXJlZAorICAgICAgICBDYXRjaDo6Y2VycigpIDw8IHN0ZDo6Zmx1c2g7Cisg ICAgICAgIENhdGNoOjpjbG9nKCkgPDwgc3RkOjpmbHVzaDsKKyAgICAgICAgZmZsdXNoKHN0ZGVy cik7CisKKyAgICAgICAgZHVwMihtX29yaWdpbmFsU3Rkb3V0LCAxKTsKKyAgICAgICAgZHVwMiht X29yaWdpbmFsU3RkZXJyLCAyKTsKKworICAgICAgICBtX3N0ZG91dERlc3QgKz0gbV9zdGRvdXRG aWxlLmdldENvbnRlbnRzKCk7CisgICAgICAgIG1fc3RkZXJyRGVzdCArPSBtX3N0ZGVyckZpbGUu Z2V0Q29udGVudHMoKTsKKyAgICB9CisKKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfTkVXX0NBUFRV UkUKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX05F V19DQVBUVVJFKQorICAgICNpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgICN1bmRlZiBkdXAKKyAg ICAjdW5kZWYgZHVwMgorICAgICN1bmRlZiBmaWxlbm8KKyAgICAjZW5kaWYKKyNlbmRpZgorLy8g ZW5kIGNhdGNoX291dHB1dF9yZWRpcmVjdC5jcHAKKy8vIHN0YXJ0IGNhdGNoX3BvbHlmaWxscy5j cHAKKworI2luY2x1ZGUgPGNtYXRoPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisjaWYgIWRlZmlu ZWQoQ0FUQ0hfQ09ORklHX1BPTFlGSUxMX0lTTkFOKQorICAgIGJvb2wgaXNuYW4oZmxvYXQgZikg eworICAgICAgICByZXR1cm4gc3RkOjppc25hbihmKTsKKyAgICB9CisgICAgYm9vbCBpc25hbihk b3VibGUgZCkgeworICAgICAgICByZXR1cm4gc3RkOjppc25hbihkKTsKKyAgICB9CisjZWxzZQor ICAgIC8vIEZvciBub3cgd2Ugb25seSB1c2UgdGhpcyBmb3IgZW1iYXJjYWRlcm8KKyAgICBib29s IGlzbmFuKGZsb2F0IGYpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6X2lzbmFuKGYpOworICAgIH0K KyAgICBib29sIGlzbmFuKGRvdWJsZSBkKSB7CisgICAgICAgIHJldHVybiBzdGQ6Ol9pc25hbihk KTsKKyAgICB9CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisvLyBlbmQgY2F0 Y2hfcG9seWZpbGxzLmNwcAorLy8gc3RhcnQgY2F0Y2hfcmFuZG9tX251bWJlcl9nZW5lcmF0b3Iu Y3BwCisKK25hbWVzcGFjZSBDYXRjaCB7CisKK25hbWVzcGFjZSB7CisKKyNpZiBkZWZpbmVkKF9N U0NfVkVSKQorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0 MTQ2KSAvLyB3ZSBuZWdhdGUgdWludDMyIGR1cmluZyB0aGUgcm90YXRlCisjZW5kaWYKKyAgICAg ICAgLy8gU2FmZSByb3RyIGltcGxlbWVudGF0aW9uIHRoYW5rcyB0byBKb2huIFJlZ2VocgorICAg ICAgICB1aW50MzJfdCByb3RhdGVfcmlnaHQodWludDMyX3QgdmFsLCB1aW50MzJfdCBjb3VudCkg eworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWFzayA9IDMxOworICAgICAgICAgICAgY291 bnQgJj0gbWFzazsKKyAgICAgICAgICAgIHJldHVybiAodmFsID4+IGNvdW50KSB8ICh2YWwgPDwg KC1jb3VudCAmIG1hc2spKTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNw cmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworfQorCisgICAgU2ltcGxlUGNnMzI6OlNpbXBs ZVBjZzMyKHJlc3VsdF90eXBlIHNlZWRfKSB7CisgICAgICAgIHNlZWQoc2VlZF8pOworICAgIH0K KworICAgIHZvaWQgU2ltcGxlUGNnMzI6OnNlZWQocmVzdWx0X3R5cGUgc2VlZF8pIHsKKyAgICAg ICAgbV9zdGF0ZSA9IDA7CisgICAgICAgICgqdGhpcykoKTsKKyAgICAgICAgbV9zdGF0ZSArPSBz ZWVkXzsKKyAgICAgICAgKCp0aGlzKSgpOworICAgIH0KKworICAgIHZvaWQgU2ltcGxlUGNnMzI6 OmRpc2NhcmQodWludDY0X3Qgc2tpcCkgeworICAgICAgICAvLyBXZSBjb3VsZCBpbXBsZW1lbnQg dGhpcyB0byBydW4gaW4gTyhsb2cgbikgc3RlcHMsIGJ1dCB0aGlzCisgICAgICAgIC8vIHNob3Vs ZCBzdWZmaWNlIGZvciBvdXIgdXNlIGNhc2UuCisgICAgICAgIGZvciAodWludDY0X3QgcyA9IDA7 IHMgPCBza2lwOyArK3MpIHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KCgqdGhpcyko KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTaW1wbGVQY2czMjo6cmVzdWx0X3R5cGUgU2lt cGxlUGNnMzI6Om9wZXJhdG9yKCkoKSB7CisgICAgICAgIC8vIHByZXBhcmUgdGhlIG91dHB1dCB2 YWx1ZQorICAgICAgICBjb25zdCB1aW50MzJfdCB4b3JzaGlmdGVkID0gc3RhdGljX2Nhc3Q8dWlu dDMyX3Q+KCgobV9zdGF0ZSA+PiAxOHUpIF4gbV9zdGF0ZSkgPj4gMjd1KTsKKyAgICAgICAgY29u c3QgYXV0byBvdXRwdXQgPSByb3RhdGVfcmlnaHQoeG9yc2hpZnRlZCwgbV9zdGF0ZSA+PiA1OXUp OworCisgICAgICAgIC8vIGFkdmFuY2Ugc3RhdGUKKyAgICAgICAgbV9zdGF0ZSA9IG1fc3RhdGUg KiA2MzY0MTM2MjIzODQ2NzkzMDA1VUxMICsgc19pbmM7CisKKyAgICAgICAgcmV0dXJuIG91dHB1 dDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oU2ltcGxlUGNnMzIgY29uc3QmIGxocywg U2ltcGxlUGNnMzIgY29uc3QmIHJocykgeworICAgICAgICByZXR1cm4gbGhzLm1fc3RhdGUgPT0g cmhzLm1fc3RhdGU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KFNpbXBsZVBjZzMyIGNv bnN0JiBsaHMsIFNpbXBsZVBjZzMyIGNvbnN0JiByaHMpIHsKKyAgICAgICAgcmV0dXJuIGxocy5t X3N0YXRlICE9IHJocy5tX3N0YXRlOworICAgIH0KK30KKy8vIGVuZCBjYXRjaF9yYW5kb21fbnVt YmVyX2dlbmVyYXRvci5jcHAKKy8vIHN0YXJ0IGNhdGNoX3JlZ2lzdHJ5X2h1Yi5jcHAKKworLy8g c3RhcnQgY2F0Y2hfdGVzdF9jYXNlX3JlZ2lzdHJ5X2ltcGwuaAorCisjaW5jbHVkZSA8dmVjdG9y PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zPgor CituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgc3RydWN0IElD b25maWc7CisKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gc29ydFRlc3RzKCBJQ29uZmlnIGNv bnN0JiBjb25maWcsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdW5zb3J0ZWRUZXN0Q2Fz ZXMgKTsKKworICAgIGJvb2wgaXNUaHJvd1NhZmUoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSwg SUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgYm9vbCBtYXRjaFRlc3QoIFRlc3RDYXNlIGNv bnN0JiB0ZXN0Q2FzZSwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBj b25maWcgKTsKKworICAgIHZvaWQgZW5mb3JjZU5vRHVwbGljYXRlVGVzdENhc2VzKCBzdGQ6OnZl Y3RvcjxUZXN0Q2FzZT4gY29uc3QmIGZ1bmN0aW9ucyApOworCisgICAgc3RkOjp2ZWN0b3I8VGVz dENhc2U+IGZpbHRlclRlc3RzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RDYXNl cywgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAg ICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggSUNv bmZpZyBjb25zdCYgY29uZmlnICk7CisKKyAgICBjbGFzcyBUZXN0UmVnaXN0cnkgOiBwdWJsaWMg SVRlc3RDYXNlUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VGVzdFJl Z2lzdHJ5KCkgPSBkZWZhdWx0OworCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3Qo IFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSApOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RD YXNlPiBjb25zdCYgZ2V0QWxsVGVzdHMoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgc3RkOjp2 ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0c1NvcnRlZCggSUNvbmZpZyBjb25zdCYg Y29uZmlnICkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZl Y3RvcjxUZXN0Q2FzZT4gbV9mdW5jdGlvbnM7CisgICAgICAgIG11dGFibGUgUnVuVGVzdHM6Oklu V2hhdE9yZGVyIG1fY3VycmVudFNvcnRPcmRlciA9IFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3Jk ZXI7CisgICAgICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1fc29ydGVkRnVuY3Rp b25zOworICAgICAgICBzdGQ6OnNpemVfdCBtX3VubmFtZWRDb3VudCA9IDA7CisgICAgICAgIHN0 ZDo6aW9zX2Jhc2U6OkluaXQgbV9vc3RyZWFtSW5pdDsgLy8gRm9yY2VzIGNvdXQvIGNlcnIgdG8g YmUgaW5pdGlhbGlzZWQKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBj bGFzcyBUZXN0SW52b2tlckFzRnVuY3Rpb24gOiBwdWJsaWMgSVRlc3RJbnZva2VyIHsKKyAgICAg ICAgdm9pZCgqbV90ZXN0QXNGdW5jdGlvbikoKTsKKyAgICBwdWJsaWM6CisgICAgICAgIFRlc3RJ bnZva2VyQXNGdW5jdGlvbiggdm9pZCgqdGVzdEFzRnVuY3Rpb24pKCkgKSBub2V4Y2VwdDsKKwor ICAgICAgICB2b2lkIGludm9rZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIH07CisKKyAgICBzdGQ6 OnN0cmluZyBleHRyYWN0Q2xhc3NOYW1lKCBTdHJpbmdSZWYgY29uc3QmIGNsYXNzT3JRdWFsaWZp ZWRNZXRob2ROYW1lICk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworfSAvLyBlbmQgbmFt ZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF90ZXN0X2Nhc2VfcmVnaXN0cnlfaW1wbC5oCisv LyBzdGFydCBjYXRjaF9yZXBvcnRlcl9yZWdpc3RyeS5oCisKKyNpbmNsdWRlIDxtYXA+CisKK25h bWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBSZXBvcnRlclJlZ2lzdHJ5IDogcHVibGljIElS ZXBvcnRlclJlZ2lzdHJ5IHsKKworICAgIHB1YmxpYzoKKworICAgICAgICB+UmVwb3J0ZXJSZWdp c3RyeSgpIG92ZXJyaWRlOworCisgICAgICAgIElTdHJlYW1pbmdSZXBvcnRlclB0ciBjcmVhdGUo IHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBJQ29uZmlnUHRyIGNvbnN0JiBjb25maWcgKSBjb25z dCBvdmVycmlkZTsKKworICAgICAgICB2b2lkIHJlZ2lzdGVyUmVwb3J0ZXIoIHN0ZDo6c3RyaW5n IGNvbnN0JiBuYW1lLCBJUmVwb3J0ZXJGYWN0b3J5UHRyIGNvbnN0JiBmYWN0b3J5ICk7CisgICAg ICAgIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggSVJlcG9ydGVyRmFjdG9yeVB0ciBjb25zdCYgZmFj dG9yeSApOworCisgICAgICAgIEZhY3RvcnlNYXAgY29uc3QmIGdldEZhY3RvcmllcygpIGNvbnN0 IG92ZXJyaWRlOworICAgICAgICBMaXN0ZW5lcnMgY29uc3QmIGdldExpc3RlbmVycygpIGNvbnN0 IG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgRmFjdG9yeU1hcCBtX2ZhY3Rvcmll czsKKyAgICAgICAgTGlzdGVuZXJzIG1fbGlzdGVuZXJzOworICAgIH07Cit9CisKKy8vIGVuZCBj YXRjaF9yZXBvcnRlcl9yZWdpc3RyeS5oCisvLyBzdGFydCBjYXRjaF90YWdfYWxpYXNfcmVnaXN0 cnkuaAorCisvLyBzdGFydCBjYXRjaF90YWdfYWxpYXMuaAorCisjaW5jbHVkZSA8c3RyaW5nPgor CituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFRhZ0FsaWFzIHsKKyAgICAgICAgVGFn QWxpYXMoc3RkOjpzdHJpbmcgY29uc3QmIF90YWcsIFNvdXJjZUxpbmVJbmZvIF9saW5lSW5mbyk7 CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5l SW5mbzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNo X3RhZ19hbGlhcy5oCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAg Y2xhc3MgVGFnQWxpYXNSZWdpc3RyeSA6IHB1YmxpYyBJVGFnQWxpYXNSZWdpc3RyeSB7CisgICAg cHVibGljOgorICAgICAgICB+VGFnQWxpYXNSZWdpc3RyeSgpIG92ZXJyaWRlOworICAgICAgICBU YWdBbGlhcyBjb25zdCogZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3Qgb3Zl cnJpZGU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNv bnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBh ZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291 cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBz dGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnQWxpYXM+IG1fcmVnaXN0cnk7CisgICAgfTsKKworfSAv LyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF90YWdfYWxpYXNfcmVnaXN0cnku aAorLy8gc3RhcnQgY2F0Y2hfc3RhcnR1cF9leGNlcHRpb25fcmVnaXN0cnkuaAorCisjaW5jbHVk ZSA8dmVjdG9yPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKworbmFtZXNwYWNlIENhdGNoIHsKKwor ICAgIGNsYXNzIFN0YXJ0dXBFeGNlcHRpb25SZWdpc3RyeSB7CisjaWYgIWRlZmluZWQoQ0FUQ0hf Q09ORklHX0RJU0FCTEVfRVhDRVBUSU9OUykKKyAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgYWRk KHN0ZDo6ZXhjZXB0aW9uX3B0ciBjb25zdCYgZXhjZXB0aW9uKSBub2V4Y2VwdDsKKyAgICAgICAg c3RkOjp2ZWN0b3I8c3RkOjpleGNlcHRpb25fcHRyPiBjb25zdCYgZ2V0RXhjZXB0aW9ucygpIGNv bnN0IG5vZXhjZXB0OworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6ZXhj ZXB0aW9uX3B0cj4gbV9leGNlcHRpb25zOworI2VuZGlmCisgICAgfTsKKworfSAvLyBlbmQgbmFt ZXNwYWNlIENhdGNoCisKKy8vIGVuZCBjYXRjaF9zdGFydHVwX2V4Y2VwdGlvbl9yZWdpc3RyeS5o CisvLyBzdGFydCBjYXRjaF9zaW5nbGV0b25zLmhwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisg ICAgc3RydWN0IElTaW5nbGV0b24geworICAgICAgICB2aXJ0dWFsIH5JU2luZ2xldG9uKCk7Cisg ICAgfTsKKworICAgIHZvaWQgYWRkU2luZ2xldG9uKCBJU2luZ2xldG9uKiBzaW5nbGV0b24gKTsK KyAgICB2b2lkIGNsZWFudXBTaW5nbGV0b25zKCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBT aW5nbGV0b25JbXBsVCwgdHlwZW5hbWUgSW50ZXJmYWNlVCA9IFNpbmdsZXRvbkltcGxULCB0eXBl bmFtZSBNdXRhYmxlSW50ZXJmYWNlVCA9IEludGVyZmFjZVQ+CisgICAgY2xhc3MgU2luZ2xldG9u IDogU2luZ2xldG9uSW1wbFQsIHB1YmxpYyBJU2luZ2xldG9uIHsKKworICAgICAgICBzdGF0aWMg YXV0byBnZXRJbnRlcm5hbCgpIC0+IFNpbmdsZXRvbiogeworICAgICAgICAgICAgc3RhdGljIFNp bmdsZXRvbiogc19pbnN0YW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiggIXNfaW5zdGFu Y2UgKSB7CisgICAgICAgICAgICAgICAgc19pbnN0YW5jZSA9IG5ldyBTaW5nbGV0b247CisgICAg ICAgICAgICAgICAgYWRkU2luZ2xldG9uKCBzX2luc3RhbmNlICk7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgICByZXR1cm4gc19pbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgcHVibGljOgor ICAgICAgICBzdGF0aWMgYXV0byBnZXQoKSAtPiBJbnRlcmZhY2VUIGNvbnN0JiB7CisgICAgICAg ICAgICByZXR1cm4gKmdldEludGVybmFsKCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIGF1 dG8gZ2V0TXV0YWJsZSgpIC0+IE11dGFibGVJbnRlcmZhY2VUJiB7CisgICAgICAgICAgICByZXR1 cm4gKmdldEludGVybmFsKCk7CisgICAgICAgIH0KKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBD YXRjaAorCisvLyBlbmQgY2F0Y2hfc2luZ2xldG9ucy5ocHAKK25hbWVzcGFjZSBDYXRjaCB7CisK KyAgICBuYW1lc3BhY2UgeworCisgICAgICAgIGNsYXNzIFJlZ2lzdHJ5SHViIDogcHVibGljIElS ZWdpc3RyeUh1YiwgcHVibGljIElNdXRhYmxlUmVnaXN0cnlIdWIsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcHJpdmF0ZSBOb25Db3B5YWJsZSB7CisKKyAgICAgICAgcHVibGljOiAvLyBJ UmVnaXN0cnlIdWIKKyAgICAgICAgICAgIFJlZ2lzdHJ5SHViKCkgPSBkZWZhdWx0OworICAgICAg ICAgICAgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25z dCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJSZWdpc3RyeTsK KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElUZXN0Q2FzZVJlZ2lzdHJ5IGNvbnN0JiBnZXRU ZXN0Q2FzZVJlZ2lzdHJ5KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVy biBtX3Rlc3RDYXNlUmVnaXN0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJRXhjZXB0 aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IGNvbnN0JiBnZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0 cnkoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZXhjZXB0aW9u VHJhbnNsYXRvclJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgSVRhZ0FsaWFz UmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCBvdmVycmlkZSB7Cisg ICAgICAgICAgICAgICAgcmV0dXJuIG1fdGFnQWxpYXNSZWdpc3RyeTsKKyAgICAgICAgICAgIH0K KyAgICAgICAgICAgIFN0YXJ0dXBFeGNlcHRpb25SZWdpc3RyeSBjb25zdCYgZ2V0U3RhcnR1cEV4 Y2VwdGlvblJlZ2lzdHJ5KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVy biBtX2V4Y2VwdGlvblJlZ2lzdHJ5OworICAgICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYzog Ly8gSU11dGFibGVSZWdpc3RyeUh1YgorICAgICAgICAgICAgdm9pZCByZWdpc3RlclJlcG9ydGVy KCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgSVJlcG9ydGVyRmFjdG9yeVB0ciBjb25zdCYgZmFj dG9yeSApIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBtX3JlcG9ydGVyUmVnaXN0cnkucmVn aXN0ZXJSZXBvcnRlciggbmFtZSwgZmFjdG9yeSApOworICAgICAgICAgICAgfQorICAgICAgICAg ICAgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBJUmVwb3J0ZXJGYWN0b3J5UHRyIGNvbnN0JiBmYWN0 b3J5ICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG1fcmVwb3J0ZXJSZWdpc3RyeS5yZWdp c3Rlckxpc3RlbmVyKCBmYWN0b3J5ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lk IHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RJbmZvICkgb3ZlcnJpZGUgeworICAg ICAgICAgICAgICAgIG1fdGVzdENhc2VSZWdpc3RyeS5yZWdpc3RlclRlc3QoIHRlc3RJbmZvICk7 CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHJlZ2lzdGVyVHJhbnNsYXRvciggY29u c3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3IgKSBvdmVycmlkZSB7CisgICAgICAg ICAgICAgICAgbV9leGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkucmVnaXN0ZXJUcmFuc2xhdG9y KCB0cmFuc2xhdG9yICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHJlZ2lzdGVy VGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRh ZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgb3ZlcnJpZGUgeworICAgICAgICAg ICAgICAgIG1fdGFnQWxpYXNSZWdpc3RyeS5hZGQoIGFsaWFzLCB0YWcsIGxpbmVJbmZvICk7Cisg ICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU3RhcnR1cEV4Y2VwdGlvbigp IG5vZXhjZXB0IG92ZXJyaWRlIHsKKyNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9F WENFUFRJT05TKQorICAgICAgICAgICAgICAgIG1fZXhjZXB0aW9uUmVnaXN0cnkuYWRkKHN0ZDo6 Y3VycmVudF9leGNlcHRpb24oKSk7CisjZWxzZQorICAgICAgICAgICAgICAgIENBVENIX0lOVEVS TkFMX0VSUk9SKCJBdHRlbXB0ZWQgdG8gcmVnaXN0ZXIgYWN0aXZlIGV4Y2VwdGlvbiB1bmRlciBD QVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TISIpOworI2VuZGlmCisgICAgICAgICAgICB9 CisgICAgICAgICAgICBJTXV0YWJsZUVudW1WYWx1ZXNSZWdpc3RyeSYgZ2V0TXV0YWJsZUVudW1W YWx1ZXNSZWdpc3RyeSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9lbnVt VmFsdWVzUmVnaXN0cnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAg ICAgICAgIFRlc3RSZWdpc3RyeSBtX3Rlc3RDYXNlUmVnaXN0cnk7CisgICAgICAgICAgICBSZXBv cnRlclJlZ2lzdHJ5IG1fcmVwb3J0ZXJSZWdpc3RyeTsKKyAgICAgICAgICAgIEV4Y2VwdGlvblRy YW5zbGF0b3JSZWdpc3RyeSBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICAgICAg ICAgIFRhZ0FsaWFzUmVnaXN0cnkgbV90YWdBbGlhc1JlZ2lzdHJ5OworICAgICAgICAgICAgU3Rh cnR1cEV4Y2VwdGlvblJlZ2lzdHJ5IG1fZXhjZXB0aW9uUmVnaXN0cnk7CisgICAgICAgICAgICBE ZXRhaWw6OkVudW1WYWx1ZXNSZWdpc3RyeSBtX2VudW1WYWx1ZXNSZWdpc3RyeTsKKyAgICAgICAg fTsKKyAgICB9CisKKyAgICB1c2luZyBSZWdpc3RyeUh1YlNpbmdsZXRvbiA9IFNpbmdsZXRvbjxS ZWdpc3RyeUh1YiwgSVJlZ2lzdHJ5SHViLCBJTXV0YWJsZVJlZ2lzdHJ5SHViPjsKKworICAgIElS ZWdpc3RyeUh1YiBjb25zdCYgZ2V0UmVnaXN0cnlIdWIoKSB7CisgICAgICAgIHJldHVybiBSZWdp c3RyeUh1YlNpbmdsZXRvbjo6Z2V0KCk7CisgICAgfQorICAgIElNdXRhYmxlUmVnaXN0cnlIdWIm IGdldE11dGFibGVSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgcmV0dXJuIFJlZ2lzdHJ5SHViU2lu Z2xldG9uOjpnZXRNdXRhYmxlKCk7CisgICAgfQorICAgIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAg ICAgY2xlYW51cFNpbmdsZXRvbnMoKTsKKyAgICAgICAgY2xlYW5VcENvbnRleHQoKTsKKyAgICB9 CisgICAgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCkgeworICAgICAgICBy ZXR1cm4gZ2V0UmVnaXN0cnlIdWIoKS5nZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKS50 cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBD YXRjaAorLy8gZW5kIGNhdGNoX3JlZ2lzdHJ5X2h1Yi5jcHAKKy8vIHN0YXJ0IGNhdGNoX3JlcG9y dGVyX3JlZ2lzdHJ5LmNwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgUmVwb3J0ZXJSZWdp c3RyeTo6flJlcG9ydGVyUmVnaXN0cnkoKSA9IGRlZmF1bHQ7CisKKyAgICBJU3RyZWFtaW5nUmVw b3J0ZXJQdHIgUmVwb3J0ZXJSZWdpc3RyeTo6Y3JlYXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFt ZSwgSUNvbmZpZ1B0ciBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0g IG1fZmFjdG9yaWVzLmZpbmQoIG5hbWUgKTsKKyAgICAgICAgaWYoIGl0ID09IG1fZmFjdG9yaWVz LmVuZCgpICkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gaXQt PnNlY29uZC0+Y3JlYXRlKCBSZXBvcnRlckNvbmZpZyggY29uZmlnICkgKTsKKyAgICB9CisKKyAg ICB2b2lkIFJlcG9ydGVyUmVnaXN0cnk6OnJlZ2lzdGVyUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNv bnN0JiBuYW1lLCBJUmVwb3J0ZXJGYWN0b3J5UHRyIGNvbnN0JiBmYWN0b3J5ICkgeworICAgICAg ICBtX2ZhY3Rvcmllcy5lbXBsYWNlKG5hbWUsIGZhY3RvcnkpOworICAgIH0KKyAgICB2b2lkIFJl cG9ydGVyUmVnaXN0cnk6OnJlZ2lzdGVyTGlzdGVuZXIoIElSZXBvcnRlckZhY3RvcnlQdHIgY29u c3QmIGZhY3RvcnkgKSB7CisgICAgICAgIG1fbGlzdGVuZXJzLnB1c2hfYmFjayggZmFjdG9yeSAp OworICAgIH0KKworICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpGYWN0b3J5TWFwIGNvbnN0JiBSZXBv cnRlclJlZ2lzdHJ5OjpnZXRGYWN0b3JpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2Zh Y3RvcmllczsKKyAgICB9CisgICAgSVJlcG9ydGVyUmVnaXN0cnk6Okxpc3RlbmVycyBjb25zdCYg UmVwb3J0ZXJSZWdpc3RyeTo6Z2V0TGlzdGVuZXJzKCkgY29uc3QgeworICAgICAgICByZXR1cm4g bV9saXN0ZW5lcnM7CisgICAgfQorCit9CisvLyBlbmQgY2F0Y2hfcmVwb3J0ZXJfcmVnaXN0cnku Y3BwCisvLyBzdGFydCBjYXRjaF9yZXN1bHRfdHlwZS5jcHAKKworbmFtZXNwYWNlIENhdGNoIHsK KworICAgIGJvb2wgaXNPayggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApIHsKKyAgICAg ICAgcmV0dXJuICggcmVzdWx0VHlwZSAmIFJlc3VsdFdhczo6RmFpbHVyZUJpdCApID09IDA7Cisg ICAgfQorICAgIGJvb2wgaXNKdXN0SW5mbyggaW50IGZsYWdzICkgeworICAgICAgICByZXR1cm4g ZmxhZ3MgPT0gUmVzdWx0V2FzOjpJbmZvOworICAgIH0KKworICAgIFJlc3VsdERpc3Bvc2l0aW9u OjpGbGFncyBvcGVyYXRvciB8ICggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIGxocywgUmVzdWx0 RGlzcG9zaXRpb246OkZsYWdzIHJocyApIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJl c3VsdERpc3Bvc2l0aW9uOjpGbGFncz4oIHN0YXRpY19jYXN0PGludD4oIGxocyApIHwgc3RhdGlj X2Nhc3Q8aW50PiggcmhzICkgKTsKKyAgICB9CisKKyAgICBib29sIHNob3VsZENvbnRpbnVlT25G YWlsdXJlKCBpbnQgZmxhZ3MgKSAgICB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRp b246OkNvbnRpbnVlT25GYWlsdXJlICkgIT0gMDsgfQorICAgIGJvb2wgc2hvdWxkU3VwcHJlc3NG YWlsdXJlKCBpbnQgZmxhZ3MgKSAgICAgIHsgcmV0dXJuICggZmxhZ3MgJiBSZXN1bHREaXNwb3Np dGlvbjo6U3VwcHJlc3NGYWlsICkgIT0gMDsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gK Ky8vIGVuZCBjYXRjaF9yZXN1bHRfdHlwZS5jcHAKKy8vIHN0YXJ0IGNhdGNoX3J1bl9jb250ZXh0 LmNwcAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVk ZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSBHZW5lcmF0 b3JzIHsKKyAgICAgICAgc3RydWN0IEdlbmVyYXRvclRyYWNrZXIgOiBUZXN0Q2FzZVRyYWNraW5n OjpUcmFja2VyQmFzZSwgSUdlbmVyYXRvclRyYWNrZXIgeworICAgICAgICAgICAgR2VuZXJhdG9y QmFzZVB0ciBtX2dlbmVyYXRvcjsKKworICAgICAgICAgICAgR2VuZXJhdG9yVHJhY2tlciggVGVz dENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRy YWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQgKQorICAgICAgICAgICAgOiAgIFRy YWNrZXJCYXNlKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgcGFyZW50ICkKKyAgICAgICAgICAgIHt9 CisgICAgICAgICAgICB+R2VuZXJhdG9yVHJhY2tlcigpOworCisgICAgICAgICAgICBzdGF0aWMg R2VuZXJhdG9yVHJhY2tlciYgYWNxdWlyZSggVHJhY2tlckNvbnRleHQmIGN0eCwgVGVzdENhc2VU cmFja2luZzo6TmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSB7CisgICAg ICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEdlbmVyYXRvclRyYWNrZXI+IHRyYWNrZXI7CisK KyAgICAgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIgPSBjdHguY3VycmVudFRy YWNrZXIoKTsKKyAgICAgICAgICAgICAgICAvLyBVbmRlciBzcGVjaWZpYyBjaXJjdW1zdGFuY2Vz LCB0aGUgZ2VuZXJhdG9yIHdlIHdhbnQKKyAgICAgICAgICAgICAgICAvLyB0byBhY3F1aXJlIGlz IGFsc28gdGhlIGN1cnJlbnQgdHJhY2tlci4gSWYgdGhpcyBpcworICAgICAgICAgICAgICAgIC8v IHRoZSBjYXNlLCB3ZSBoYXZlIHRvIGF2b2lkIGxvb2tpbmcgdGhyb3VnaCBjdXJyZW50CisgICAg ICAgICAgICAgICAgLy8gdHJhY2tlcidzIGNoaWxkcmVuLCBhbmQgaW5zdGVhZCByZXR1cm4gdGhl IGN1cnJlbnQKKyAgICAgICAgICAgICAgICAvLyB0cmFja2VyLgorICAgICAgICAgICAgICAgIC8v IEEgY2FzZSB3aGVyZSB0aGlzIGNoZWNrIGlzIGltcG9ydGFudCBpcyBlLmcuCisgICAgICAgICAg ICAgICAgLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgICAgICAgICAg ICAgLy8gICAgICAgICBpbnQgbiA9IEdFTkVSQVRFKDEsIDIpOworICAgICAgICAgICAgICAgIC8v ICAgICB9CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGl0 LCB0aGUgY29kZSBhYm92ZSBjcmVhdGVzIDUgbmVzdGVkIGdlbmVyYXRvcnMuCisgICAgICAgICAg ICAgICAgaWYgKGN1cnJlbnRUcmFja2VyLm5hbWVBbmRMb2NhdGlvbigpID09IG5hbWVBbmRMb2Nh dGlvbikgeworICAgICAgICAgICAgICAgICAgICBhdXRvIHRoaXNUcmFja2VyID0gY3VycmVudFRy YWNrZXIucGFyZW50KCkuZmluZENoaWxkKG5hbWVBbmRMb2NhdGlvbik7CisgICAgICAgICAgICAg ICAgICAgIGFzc2VydCh0aGlzVHJhY2tlcik7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh0 aGlzVHJhY2tlci0+aXNHZW5lcmF0b3JUcmFja2VyKCkpOworICAgICAgICAgICAgICAgICAgICB0 cmFja2VyID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEdlbmVyYXRvclRyYWNrZXI+KHRoaXNU cmFja2VyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBUZXN0Q2FzZVRyYWNraW5nOjpJ VHJhY2tlclB0ciBjaGlsZFRyYWNrZXIgPSBjdXJyZW50VHJhY2tlci5maW5kQ2hpbGQoIG5hbWVB bmRMb2NhdGlvbiApICkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tl ciApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlci0+aXNHZW5lcmF0 b3JUcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlciA9IHN0ZDo6c3RhdGlj X3BvaW50ZXJfY2FzdDxHZW5lcmF0b3JUcmFja2VyPiggY2hpbGRUcmFja2VyICk7CisgICAgICAg ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlciA9IHN0ZDo6bWFr ZV9zaGFyZWQ8R2VuZXJhdG9yVHJhY2tlcj4oIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCAmY3VycmVu dFRyYWNrZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQo IHRyYWNrZXIgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggIXRy YWNrZXItPmlzQ29tcGxldGUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+b3Bl bigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAqdHJhY2tl cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVHJhY2tlckJhc2UgaW50ZXJmYWNl CisgICAgICAgICAgICBib29sIGlzR2VuZXJhdG9yVHJhY2tlcigpIGNvbnN0IG92ZXJyaWRlIHsg cmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIGF1dG8gaGFzR2VuZXJhdG9yKCkgY29uc3QgLT4g Ym9vbCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEhbV9nZW5lcmF0b3I7Cisg ICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGUgeworICAgICAg ICAgICAgICAgIFRyYWNrZXJCYXNlOjpjbG9zZSgpOworICAgICAgICAgICAgICAgIC8vIElmIGEg Z2VuZXJhdG9yIGhhcyBhIGNoaWxkIChpdCBpcyBmb2xsb3dlZCBieSBhIHNlY3Rpb24pCisgICAg ICAgICAgICAgICAgLy8gYW5kIG5vbmUgb2YgaXRzIGNoaWxkcmVuIGhhdmUgc3RhcnRlZCwgdGhl biB3ZSBtdXN0IHdhaXQKKyAgICAgICAgICAgICAgICAvLyB1bnRpbCBsYXRlciB0byBzdGFydCBj b25zdW1pbmcgaXRzIHZhbHVlcy4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNhdGNoZXMgY2Fz ZXMgd2hlcmUgYEdFTkVSQVRFYCBpcyBwbGFjZWQgYmV0d2VlbiB0d28KKyAgICAgICAgICAgICAg ICAvLyBgU0VDVElPTmBzLgorICAgICAgICAgICAgICAgIC8vICoqVGhlIGNoZWNrIGZvciBtX2No aWxkcmVuLmVtcHR5IGNhbm5vdCBiZSByZW1vdmVkKiouCisgICAgICAgICAgICAgICAgLy8gZG9p bmcgc28gd291bGQgYnJlYWsgYEdFTkVSQVRFYCBfbm90XyBmb2xsb3dlZCBieSBgU0VDVElPTmBz LgorICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc2hvdWxkX3dhaXRfZm9yX2NoaWxkID0gWyZd KCkgeworICAgICAgICAgICAgICAgICAgICAvLyBObyBjaGlsZHJlbiAtPiBub2JvZHkgdG8gd2Fp dCBmb3IKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBtX2NoaWxkcmVuLmVtcHR5KCkgKSB7Cisg ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgYXQgbGVhc3Qgb25lIGNoaWxkIHN0YXJ0ZWQg ZXhlY3V0aW5nLCBkb24ndCB3YWl0CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RkOjpmaW5k X2lmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NoaWxkcmVuLmJlZ2luKCksCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY2hpbGRyZW4uZW5kKCksCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFtdKCBUZXN0Q2FzZVRyYWNraW5nOjpJVHJhY2tlclB0ciB0cmFj a2VyICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIt Pmhhc1N0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApICE9IG1fY2hp bGRyZW4uZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg ICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBObyBjaGlsZHJl biBoYXZlIHN0YXJ0ZWQuIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhleSBfY2FuXworICAgICAgICAg ICAgICAgICAgICAvLyBzdGFydCwgYW5kIHRodXMgd2Ugc2hvdWxkIHdhaXQgZm9yIHRoZW0sIG9y IHRoZXkgY2Fubm90CisgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IChkdWUgdG8gZmlsdGVy cyksIGFuZCB3ZSBzaG91bGRuJ3Qgd2FpdCBmb3IgdGhlbQorICAgICAgICAgICAgICAgICAgICBh dXRvKiBwYXJlbnQgPSBtX3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBz YWZlOiB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIHNlY3Rpb24KKyAgICAgICAgICAgICAg ICAgICAgLy8gdHJhY2tlciBpbiBhIHRlc3QgY2FzZSB0cmFja2luZyB0cmVlCisgICAgICAgICAg ICAgICAgICAgIHdoaWxlICggIXBhcmVudC0+aXNTZWN0aW9uVHJhY2tlcigpICkgeworICAgICAg ICAgICAgICAgICAgICAgICAgcGFyZW50ID0gJiggcGFyZW50LT5wYXJlbnQoKSApOworICAgICAg ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggcGFyZW50ICYmCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3Npbmcgcm9vdCAodGVzdCBjYXNlKSBsZXZl bCBzZWN0aW9uIiApOworCisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29uc3QmIHBhcmVudFNl Y3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2VjdGlvblRyYWNr ZXImPiggKnBhcmVudCApOworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvbnN0JiBmaWx0ZXJz ID0gcGFyZW50U2VjdGlvbi5nZXRGaWx0ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIE5v IGZpbHRlcnMgLT4gbm8gcmVzdHJpY3Rpb25zIG9uIHJ1bm5pbmcgc2VjdGlvbnMKKyAgICAgICAg ICAgICAgICAgICAgaWYgKCBmaWx0ZXJzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg ICAgICAgIGZvciAoIGF1dG8gY29uc3QmIGNoaWxkIDogbV9jaGlsZHJlbiApIHsKKyAgICAgICAg ICAgICAgICAgICAgICAgIGlmICggY2hpbGQtPmlzU2VjdGlvblRyYWNrZXIoKSAmJgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZpbmQoIGZpbHRlcnMuYmVnaW4oKSwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzLmVuZCgpLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNlY3Rpb25UcmFj a2VyJj4oICpjaGlsZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC50cmltbWVkTmFtZSgpICkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGZpbHRlcnMuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRy dWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0oKTsKKwor ICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgYSBiaXQgdHJpY2t5LCBiZWNhdXNlIG1f Z2VuZXJhdG9yLT5uZXh0KCkKKyAgICAgICAgICAgICAgICAvLyBoYXMgYSBzaWRlLWVmZmVjdCwg d2hlcmUgaXQgY29uc3VtZXMgZ2VuZXJhdG9yJ3MgY3VycmVudAorICAgICAgICAgICAgICAgIC8v IHZhbHVlLCBidXQgd2UgZG8gbm90IHdhbnQgdG8gaW52b2tlIHRoZSBzaWRlLWVmZmVjdCBpZgor ICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VuZXJhdG9yIGlzIHN0aWxsIHdhaXRpbmcgZm9yIGFu eSBjaGlsZCB0byBzdGFydC4KKyAgICAgICAgICAgICAgICBpZiAoIHNob3VsZF93YWl0X2Zvcl9j aGlsZCB8fAorICAgICAgICAgICAgICAgICAgICAgKCBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1 Y2Nlc3NmdWxseSAmJgorICAgICAgICAgICAgICAgICAgICAgICBtX2dlbmVyYXRvci0+bmV4dCgp ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIG1fY2hpbGRyZW4uY2xlYXIoKTsKKyAgICAgICAg ICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgICAgICAgICB9Cisg ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElHZW5lcmF0b3JUcmFja2VyIGludGVyZmFj ZQorICAgICAgICAgICAgYXV0byBnZXRHZW5lcmF0b3IoKSBjb25zdCAtPiBHZW5lcmF0b3JCYXNl UHRyIGNvbnN0JiBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZ2VuZXJhdG9y OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBzZXRHZW5lcmF0b3IoIEdlbmVyYXRv ckJhc2VQdHImJiBnZW5lcmF0b3IgKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgbV9nZW5l cmF0b3IgPSBzdGQ6Om1vdmUoIGdlbmVyYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICB9 OworICAgICAgICBHZW5lcmF0b3JUcmFja2VyOjp+R2VuZXJhdG9yVHJhY2tlcigpIHt9CisgICAg fQorCisgICAgUnVuQ29udGV4dDo6UnVuQ29udGV4dChJQ29uZmlnUHRyIGNvbnN0JiBfY29uZmln LCBJU3RyZWFtaW5nUmVwb3J0ZXJQdHImJiByZXBvcnRlcikKKyAgICA6ICAgbV9ydW5JbmZvKF9j b25maWctPm5hbWUoKSksCisgICAgICAgIG1fY29udGV4dChnZXRDdXJyZW50TXV0YWJsZUNvbnRl eHQoKSksCisgICAgICAgIG1fY29uZmlnKF9jb25maWcpLAorICAgICAgICBtX3JlcG9ydGVyKHN0 ZDo6bW92ZShyZXBvcnRlcikpLAorICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZveyBTdHJpbmdS ZWYoKSwgU291cmNlTGluZUluZm8oIiIsMCksIFN0cmluZ1JlZigpLCBSZXN1bHREaXNwb3NpdGlv bjo6Tm9ybWFsIH0sCisgICAgICAgIG1faW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCBtX2NvbmZp Zy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgfHwgbV9yZXBvcnRlci0+Z2V0UHJlZmVyZW5j ZXMoKS5zaG91bGRSZXBvcnRBbGxBc3NlcnRpb25zICkKKyAgICB7CisgICAgICAgIG1fY29udGV4 dC5zZXRSdW5uZXIodGhpcyk7CisgICAgICAgIG1fY29udGV4dC5zZXRDb25maWcobV9jb25maWcp OworICAgICAgICBtX2NvbnRleHQuc2V0UmVzdWx0Q2FwdHVyZSh0aGlzKTsKKyAgICAgICAgbV9y ZXBvcnRlci0+dGVzdFJ1blN0YXJ0aW5nKG1fcnVuSW5mbyk7CisgICAgfQorCisgICAgUnVuQ29u dGV4dDo6flJ1bkNvbnRleHQoKSB7CisgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RSdW5FbmRlZChU ZXN0UnVuU3RhdHMobV9ydW5JbmZvLCBtX3RvdGFscywgYWJvcnRpbmcoKSkpOworICAgIH0KKwor ICAgIHZvaWQgUnVuQ29udGV4dDo6dGVzdEdyb3VwU3RhcnRpbmcoc3RkOjpzdHJpbmcgY29uc3Qm IHRlc3RTcGVjLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3Vu dCkgeworICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBTdGFydGluZyhHcm91cEluZm8odGVz dFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50KSk7CisgICAgfQorCisgICAgdm9pZCBSdW5D b250ZXh0Ojp0ZXN0R3JvdXBFbmRlZChzdGQ6OnN0cmluZyBjb25zdCYgdGVzdFNwZWMsIFRvdGFs cyBjb25zdCYgdG90YWxzLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91 cHNDb3VudCkgeworICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBFbmRlZChUZXN0R3JvdXBT dGF0cyhHcm91cEluZm8odGVzdFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50KSwgdG90YWxz LCBhYm9ydGluZygpKSk7CisgICAgfQorCisgICAgVG90YWxzIFJ1bkNvbnRleHQ6OnJ1blRlc3Qo VGVzdENhc2UgY29uc3QmIHRlc3RDYXNlKSB7CisgICAgICAgIFRvdGFscyBwcmV2VG90YWxzID0g bV90b3RhbHM7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgcmVkaXJlY3RlZENvdXQ7CisgICAgICAg IHN0ZDo6c3RyaW5nIHJlZGlyZWN0ZWRDZXJyOworCisgICAgICAgIGF1dG8gY29uc3QmIHRlc3RJ bmZvID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCk7CisKKyAgICAgICAgbV9yZXBvcnRlci0+ dGVzdENhc2VTdGFydGluZyh0ZXN0SW5mbyk7CisKKyAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSA9 ICZ0ZXN0Q2FzZTsKKworICAgICAgICBJVHJhY2tlciYgcm9vdFRyYWNrZXIgPSBtX3RyYWNrZXJD b250ZXh0LnN0YXJ0UnVuKCk7CisgICAgICAgIGFzc2VydChyb290VHJhY2tlci5pc1NlY3Rpb25U cmFja2VyKCkpOworICAgICAgICBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlciY+KHJvb3RUcmFj a2VyKS5hZGRJbml0aWFsRmlsdGVycyhtX2NvbmZpZy0+Z2V0U2VjdGlvbnNUb1J1bigpKTsKKyAg ICAgICAgZG8geworICAgICAgICAgICAgbV90cmFja2VyQ29udGV4dC5zdGFydEN5Y2xlKCk7Cisg ICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlciA9ICZTZWN0aW9uVHJhY2tlcjo6YWNxdWlyZSht X3RyYWNrZXJDb250ZXh0LCBUZXN0Q2FzZVRyYWNraW5nOjpOYW1lQW5kTG9jYXRpb24odGVzdElu Zm8ubmFtZSwgdGVzdEluZm8ubGluZUluZm8pKTsKKyAgICAgICAgICAgIHJ1bkN1cnJlbnRUZXN0 KHJlZGlyZWN0ZWRDb3V0LCByZWRpcmVjdGVkQ2Vycik7CisgICAgICAgIH0gd2hpbGUgKCFtX3Rl c3RDYXNlVHJhY2tlci0+aXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSAmJiAhYWJvcnRpbmcoKSk7 CisKKyAgICAgICAgVG90YWxzIGRlbHRhVG90YWxzID0gbV90b3RhbHMuZGVsdGEocHJldlRvdGFs cyk7CisgICAgICAgIGlmICh0ZXN0SW5mby5leHBlY3RlZFRvRmFpbCgpICYmIGRlbHRhVG90YWxz LnRlc3RDYXNlcy5wYXNzZWQgPiAwKSB7CisgICAgICAgICAgICBkZWx0YVRvdGFscy5hc3NlcnRp b25zLmZhaWxlZCsrOworICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLnBhc3NlZC0t OworICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLmZhaWxlZCsrOworICAgICAgICB9 CisgICAgICAgIG1fdG90YWxzLnRlc3RDYXNlcyArPSBkZWx0YVRvdGFscy50ZXN0Q2FzZXM7Cisg ICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlRW5kZWQoVGVzdENhc2VTdGF0cyh0ZXN0SW5mbywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVRvdGFscywKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkQ291dCwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkQ2VyciwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBhYm9ydGluZygpKSk7CisKKyAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSA9 IG51bGxwdHI7CisgICAgICAgIG1fdGVzdENhc2VUcmFja2VyID0gbnVsbHB0cjsKKworICAgICAg ICByZXR1cm4gZGVsdGFUb3RhbHM7CisgICAgfQorCisgICAgSUNvbmZpZ1B0ciBSdW5Db250ZXh0 Ojpjb25maWcoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2NvbmZpZzsKKyAgICB9CisKKyAg ICBJU3RyZWFtaW5nUmVwb3J0ZXImIFJ1bkNvbnRleHQ6OnJlcG9ydGVyKCkgY29uc3QgeworICAg ICAgICByZXR1cm4gKm1fcmVwb3J0ZXI7CisgICAgfQorCisgICAgdm9pZCBSdW5Db250ZXh0Ojph c3NlcnRpb25FbmRlZChBc3NlcnRpb25SZXN1bHQgY29uc3QgJiByZXN1bHQpIHsKKyAgICAgICAg aWYgKHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgPT0gUmVzdWx0V2FzOjpPaykgeworICAgICAgICAg ICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQrKzsKKyAgICAgICAgICAgIG1fbGFzdEFzc2Vy dGlvblBhc3NlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdC5pc09rKCkpIHsK KyAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvblBhc3NlZCA9IGZhbHNlOworICAgICAgICAgICAg aWYoIG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpLm9rVG9GYWlsKCkgKQorICAg ICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2srKzsKKyAgICAgICAg ICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOwor ICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uUGFz c2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGhhdmUgbm8gdXNlIGZvciB0 aGUgcmV0dXJuIHZhbHVlICh3aGV0aGVyIG1lc3NhZ2VzIHNob3VsZCBiZSBjbGVhcmVkKSwgYmVj YXVzZSBtZXNzYWdlcyB3ZXJlIG1hZGUgc2NvcGVkCisgICAgICAgIC8vIGFuZCBzaG91bGQgYmUg bGV0IHRvIGNsZWFyIHRoZW1zZWx2ZXMgb3V0LgorICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPiht X3JlcG9ydGVyLT5hc3NlcnRpb25FbmRlZChBc3NlcnRpb25TdGF0cyhyZXN1bHQsIG1fbWVzc2Fn ZXMsIG1fdG90YWxzKSkpOworCisgICAgICAgIGlmIChyZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9 IFJlc3VsdFdhczo6V2FybmluZykKKyAgICAgICAgICAgIG1fbWVzc2FnZVNjb3Blcy5jbGVhcigp OworCisgICAgICAgIC8vIFJlc2V0IHdvcmtpbmcgc3RhdGUKKyAgICAgICAgcmVzZXRBc3NlcnRp b25JbmZvKCk7CisgICAgICAgIG1fbGFzdFJlc3VsdCA9IHJlc3VsdDsKKyAgICB9CisgICAgdm9p ZCBSdW5Db250ZXh0OjpyZXNldEFzc2VydGlvbkluZm8oKSB7CisgICAgICAgIG1fbGFzdEFzc2Vy dGlvbkluZm8ubWFjcm9OYW1lID0gU3RyaW5nUmVmKCk7CisgICAgICAgIG1fbGFzdEFzc2VydGlv bkluZm8uY2FwdHVyZWRFeHByZXNzaW9uID0gIntVbmtub3duIGV4cHJlc3Npb24gYWZ0ZXIgdGhl IHJlcG9ydGVkIGxpbmV9Il9zcjsKKyAgICB9CisKKyAgICBib29sIFJ1bkNvbnRleHQ6OnNlY3Rp b25TdGFydGVkKFNlY3Rpb25JbmZvIGNvbnN0ICYgc2VjdGlvbkluZm8sIENvdW50cyAmIGFzc2Vy dGlvbnMpIHsKKyAgICAgICAgSVRyYWNrZXImIHNlY3Rpb25UcmFja2VyID0gU2VjdGlvblRyYWNr ZXI6OmFjcXVpcmUobV90cmFja2VyQ29udGV4dCwgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExv Y2F0aW9uKHNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25JbmZvLmxpbmVJbmZvKSk7CisgICAgICAg IGlmICghc2VjdGlvblRyYWNrZXIuaXNPcGVuKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7 CisgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucHVzaF9iYWNrKCZzZWN0aW9uVHJhY2tlcik7CisK KyAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbyA9IHNlY3Rpb25JbmZvLmxpbmVJ bmZvOworCisgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25TdGFydGluZyhzZWN0aW9uSW5mbyk7 CisKKyAgICAgICAgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnM7CisKKyAgICAgICAg cmV0dXJuIHRydWU7CisgICAgfQorICAgIGF1dG8gUnVuQ29udGV4dDo6YWNxdWlyZUdlbmVyYXRv clRyYWNrZXIoIFN0cmluZ1JlZiBnZW5lcmF0b3JOYW1lLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYg bGluZUluZm8gKSAtPiBJR2VuZXJhdG9yVHJhY2tlciYgeworICAgICAgICB1c2luZyBuYW1lc3Bh Y2UgR2VuZXJhdG9yczsKKyAgICAgICAgR2VuZXJhdG9yVHJhY2tlciYgdHJhY2tlciA9IEdlbmVy YXRvclRyYWNrZXI6OmFjcXVpcmUobV90cmFja2VyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENhc2VUcmFj a2luZzo6TmFtZUFuZExvY2F0aW9uKCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4oZ2VuZXJhdG9y TmFtZSksIGxpbmVJbmZvICkgKTsKKyAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5m byA9IGxpbmVJbmZvOworICAgICAgICByZXR1cm4gdHJhY2tlcjsKKyAgICB9CisKKyAgICBib29s IFJ1bkNvbnRleHQ6OnRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyhDb3VudHMmIGFzc2VydGlvbnMp IHsKKyAgICAgICAgaWYgKGFzc2VydGlvbnMudG90YWwoKSAhPSAwKQorICAgICAgICAgICAgcmV0 dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1fY29uZmlnLT53YXJuQWJvdXRNaXNzaW5nQXNzZXJ0 aW9ucygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobV90cmFja2Vy Q29udGV4dC5jdXJyZW50VHJhY2tlcigpLmhhc0NoaWxkcmVuKCkpCisgICAgICAgICAgICByZXR1 cm4gZmFsc2U7CisgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAg IGFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg IHZvaWQgUnVuQ29udGV4dDo6c2VjdGlvbkVuZGVkKFNlY3Rpb25FbmRJbmZvIGNvbnN0ICYgZW5k SW5mbykgeworICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnMg LSBlbmRJbmZvLnByZXZBc3NlcnRpb25zOworICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25z ID0gdGVzdEZvck1pc3NpbmdBc3NlcnRpb25zKGFzc2VydGlvbnMpOworCisgICAgICAgIGlmICgh bV9hY3RpdmVTZWN0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25z LmJhY2soKS0+Y2xvc2UoKTsKKyAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucG9wX2JhY2so KTsKKyAgICAgICAgfQorCisgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZChTZWN0aW9u U3RhdHMoZW5kSW5mby5zZWN0aW9uSW5mbywgYXNzZXJ0aW9ucywgZW5kSW5mby5kdXJhdGlvbklu U2Vjb25kcywgbWlzc2luZ0Fzc2VydGlvbnMpKTsKKyAgICAgICAgbV9tZXNzYWdlcy5jbGVhcigp OworICAgICAgICBtX21lc3NhZ2VTY29wZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIFJ1 bkNvbnRleHQ6OnNlY3Rpb25FbmRlZEVhcmx5KFNlY3Rpb25FbmRJbmZvIGNvbnN0ICYgZW5kSW5m bykgeworICAgICAgICBpZiAobV91bmZpbmlzaGVkU2VjdGlvbnMuZW1wdHkoKSkKKyAgICAgICAg ICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5mYWlsKCk7CisgICAgICAgIGVsc2UKKyAgICAg ICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5jbG9zZSgpOworICAgICAgICBtX2FjdGl2 ZVNlY3Rpb25zLnBvcF9iYWNrKCk7CisKKyAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlvbnMucHVz aF9iYWNrKGVuZEluZm8pOworICAgIH0KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJM RV9CRU5DSE1BUktJTkcpCisgICAgdm9pZCBSdW5Db250ZXh0OjpiZW5jaG1hcmtQcmVwYXJpbmco c3RkOjpzdHJpbmcgY29uc3QmIG5hbWUpIHsKKyAgICAgICAgbV9yZXBvcnRlci0+YmVuY2htYXJr UHJlcGFyaW5nKG5hbWUpOworICAgIH0KKyAgICB2b2lkIFJ1bkNvbnRleHQ6OmJlbmNobWFya1N0 YXJ0aW5nKCBCZW5jaG1hcmtJbmZvIGNvbnN0JiBpbmZvICkgeworICAgICAgICBtX3JlcG9ydGVy LT5iZW5jaG1hcmtTdGFydGluZyggaW5mbyApOworICAgIH0KKyAgICB2b2lkIFJ1bkNvbnRleHQ6 OmJlbmNobWFya0VuZGVkKCBCZW5jaG1hcmtTdGF0czw+IGNvbnN0JiBzdGF0cyApIHsKKyAgICAg ICAgbV9yZXBvcnRlci0+YmVuY2htYXJrRW5kZWQoIHN0YXRzICk7CisgICAgfQorICAgIHZvaWQg UnVuQ29udGV4dDo6YmVuY2htYXJrRmFpbGVkKHN0ZDo6c3RyaW5nIGNvbnN0ICYgZXJyb3IpIHsK KyAgICAgICAgbV9yZXBvcnRlci0+YmVuY2htYXJrRmFpbGVkKGVycm9yKTsKKyAgICB9CisjZW5k aWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcKKworICAgIHZvaWQgUnVuQ29u dGV4dDo6cHVzaFNjb3BlZE1lc3NhZ2UoTWVzc2FnZUluZm8gY29uc3QgJiBtZXNzYWdlKSB7Cisg ICAgICAgIG1fbWVzc2FnZXMucHVzaF9iYWNrKG1lc3NhZ2UpOworICAgIH0KKworICAgIHZvaWQg UnVuQ29udGV4dDo6cG9wU2NvcGVkTWVzc2FnZShNZXNzYWdlSW5mbyBjb25zdCAmIG1lc3NhZ2Up IHsKKyAgICAgICAgbV9tZXNzYWdlcy5lcmFzZShzdGQ6OnJlbW92ZShtX21lc3NhZ2VzLmJlZ2lu KCksIG1fbWVzc2FnZXMuZW5kKCksIG1lc3NhZ2UpLCBtX21lc3NhZ2VzLmVuZCgpKTsKKyAgICB9 CisKKyAgICB2b2lkIFJ1bkNvbnRleHQ6OmVtcGxhY2VVbnNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VC dWlsZGVyIGNvbnN0JiBidWlsZGVyICkgeworICAgICAgICBtX21lc3NhZ2VTY29wZXMuZW1wbGFj ZV9iYWNrKCBidWlsZGVyICk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgUnVuQ29udGV4dDo6 Z2V0Q3VycmVudFRlc3ROYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9hY3RpdmVUZXN0 Q2FzZQorICAgICAgICAgICAgPyBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKS5u YW1lCisgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgY29uc3QgQXNz ZXJ0aW9uUmVzdWx0ICogUnVuQ29udGV4dDo6Z2V0TGFzdFJlc3VsdCgpIGNvbnN0IHsKKyAgICAg ICAgcmV0dXJuICYoKm1fbGFzdFJlc3VsdCk7CisgICAgfQorCisgICAgdm9pZCBSdW5Db250ZXh0 OjpleGNlcHRpb25FYXJseVJlcG9ydGVkKCkgeworICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhw ZWN0ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIFJ1bkNvbnRleHQ6OmhhbmRsZUZhdGFs RXJyb3JDb25kaXRpb24oIFN0cmluZ1JlZiBtZXNzYWdlICkgeworICAgICAgICAvLyBGaXJzdCBu b3RpZnkgcmVwb3J0ZXIgdGhhdCBiYWQgdGhpbmdzIGhhcHBlbmVkCisgICAgICAgIG1fcmVwb3J0 ZXItPmZhdGFsRXJyb3JFbmNvdW50ZXJlZChtZXNzYWdlKTsKKworICAgICAgICAvLyBEb24ndCBy ZWJ1aWxkIHRoZSByZXN1bHQgLS0gdGhlIHN0cmluZ2lmaWNhdGlvbiBpdHNlbGYgY2FuIGNhdXNl IG1vcmUgZmF0YWwgZXJyb3JzCisgICAgICAgIC8vIEluc3RlYWQsIGZha2UgYSByZXN1bHQgZGF0 YS4KKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSB0ZW1wUmVzdWx0KCBSZXN1bHRXYXM6OkZh dGFsRXJyb3JDb25kaXRpb24sIHsgZmFsc2UgfSApOworICAgICAgICB0ZW1wUmVzdWx0Lm1lc3Nh Z2UgPSBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4obWVzc2FnZSk7CisgICAgICAgIEFzc2VydGlv blJlc3VsdCByZXN1bHQobV9sYXN0QXNzZXJ0aW9uSW5mbywgdGVtcFJlc3VsdCk7CisKKyAgICAg ICAgYXNzZXJ0aW9uRW5kZWQocmVzdWx0KTsKKworICAgICAgICBoYW5kbGVVbmZpbmlzaGVkU2Vj dGlvbnMoKTsKKworICAgICAgICAvLyBSZWNyZWF0ZSBzZWN0aW9uIGZvciB0ZXN0IGNhc2UgKGFz IHdlIHdpbGwgbG9zZSB0aGUgb25lIHRoYXQgd2FzIGluIHNjb3BlKQorICAgICAgICBhdXRvIGNv bnN0JiB0ZXN0Q2FzZUluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsK KyAgICAgICAgU2VjdGlvbkluZm8gdGVzdENhc2VTZWN0aW9uKHRlc3RDYXNlSW5mby5saW5lSW5m bywgdGVzdENhc2VJbmZvLm5hbWUpOworCisgICAgICAgIENvdW50cyBhc3NlcnRpb25zOworICAg ICAgICBhc3NlcnRpb25zLmZhaWxlZCA9IDE7CisgICAgICAgIFNlY3Rpb25TdGF0cyB0ZXN0Q2Fz ZVNlY3Rpb25TdGF0cyh0ZXN0Q2FzZVNlY3Rpb24sIGFzc2VydGlvbnMsIDAsIGZhbHNlKTsKKyAg ICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKHRlc3RDYXNlU2VjdGlvblN0YXRzKTsKKwor ICAgICAgICBhdXRvIGNvbnN0JiB0ZXN0SW5mbyA9IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RD YXNlSW5mbygpOworCisgICAgICAgIFRvdGFscyBkZWx0YVRvdGFsczsKKyAgICAgICAgZGVsdGFU b3RhbHMudGVzdENhc2VzLmZhaWxlZCA9IDE7CisgICAgICAgIGRlbHRhVG90YWxzLmFzc2VydGlv bnMuZmFpbGVkID0gMTsKKyAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VFbmRlZChUZXN0Q2Fz ZVN0YXRzKHRlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRh VG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCks CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKSwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworICAgICAgICBtX3RvdGFscy50 ZXN0Q2FzZXMuZmFpbGVkKys7CisgICAgICAgIHRlc3RHcm91cEVuZGVkKHN0ZDo6c3RyaW5nKCks IG1fdG90YWxzLCAxLCAxKTsKKyAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKFRlc3RS dW5TdGF0cyhtX3J1bkluZm8sIG1fdG90YWxzLCBmYWxzZSkpOworICAgIH0KKworICAgIGJvb2wg UnVuQ29udGV4dDo6bGFzdEFzc2VydGlvblBhc3NlZCgpIHsKKyAgICAgICAgIHJldHVybiBtX2xh c3RBc3NlcnRpb25QYXNzZWQ7CisgICAgfQorCisgICAgdm9pZCBSdW5Db250ZXh0Ojphc3NlcnRp b25QYXNzZWQoKSB7CisgICAgICAgIG1fbGFzdEFzc2VydGlvblBhc3NlZCA9IHRydWU7CisgICAg ICAgICsrbV90b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQ7CisgICAgICAgIHJlc2V0QXNzZXJ0aW9u SW5mbygpOworICAgICAgICBtX21lc3NhZ2VTY29wZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBi b29sIFJ1bkNvbnRleHQ6OmFib3J0aW5nKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV90b3Rh bHMuYXNzZXJ0aW9ucy5mYWlsZWQgPj0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KG1fY29uZmln LT5hYm9ydEFmdGVyKCkpOworICAgIH0KKworICAgIHZvaWQgUnVuQ29udGV4dDo6cnVuQ3VycmVu dFRlc3Qoc3RkOjpzdHJpbmcgJiByZWRpcmVjdGVkQ291dCwgc3RkOjpzdHJpbmcgJiByZWRpcmVj dGVkQ2VycikgeworICAgICAgICBhdXRvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBtX2FjdGl2ZVRl c3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgU2VjdGlvbkluZm8gdGVzdENhc2VT ZWN0aW9uKHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENhc2VJbmZvLm5hbWUpOworICAgICAg ICBtX3JlcG9ydGVyLT5zZWN0aW9uU3RhcnRpbmcodGVzdENhc2VTZWN0aW9uKTsKKyAgICAgICAg Q291bnRzIHByZXZBc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9uczsKKyAgICAgICAgZG91 YmxlIGR1cmF0aW9uID0gMDsKKyAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkID0gdHJ1 ZTsKKyAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IHsgIlRFU1RfQ0FTRSJfc3IsIHRlc3RD YXNlSW5mby5saW5lSW5mbywgU3RyaW5nUmVmKCksIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwg fTsKKworICAgICAgICBzZWVkUm5nKCptX2NvbmZpZyk7CisKKyAgICAgICAgVGltZXIgdGltZXI7 CisgICAgICAgIENBVENIX1RSWSB7CisgICAgICAgICAgICBpZiAobV9yZXBvcnRlci0+Z2V0UHJl ZmVyZW5jZXMoKS5zaG91bGRSZWRpcmVjdFN0ZE91dCkgeworI2lmICFkZWZpbmVkKENBVENIX0NP TkZJR19FWFBFUklNRU5UQUxfUkVESVJFQ1QpCisgICAgICAgICAgICAgICAgUmVkaXJlY3RlZFN0 cmVhbXMgcmVkaXJlY3RlZFN0cmVhbXMocmVkaXJlY3RlZENvdXQsIHJlZGlyZWN0ZWRDZXJyKTsK KworICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgaW52b2tl QWN0aXZlVGVzdENhc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgT3V0cHV0UmVkaXJlY3Qg cihyZWRpcmVjdGVkQ291dCwgcmVkaXJlY3RlZENlcnIpOworICAgICAgICAgICAgICAgIHRpbWVy LnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgaW52b2tlQWN0aXZlVGVzdENhc2UoKTsKKyNlbmRp ZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aW1lci5zdGFydCgpOwor ICAgICAgICAgICAgICAgIGludm9rZUFjdGl2ZVRlc3RDYXNlKCk7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgICBkdXJhdGlvbiA9IHRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCk7CisgICAgICAg IH0gQ0FUQ0hfQ0FUQ0hfQU5PTiAoVGVzdEZhaWx1cmVFeGNlcHRpb24mKSB7CisgICAgICAgICAg ICAvLyBUaGlzIGp1c3QgbWVhbnMgdGhlIHRlc3Qgd2FzIGFib3J0ZWQgZHVlIHRvIGZhaWx1cmUK KyAgICAgICAgfSBDQVRDSF9DQVRDSF9BTEwgeworICAgICAgICAgICAgLy8gVW5kZXIgQ0FUQ0hf Q09ORklHX0ZBU1RfQ09NUElMRSwgdW5leHBlY3RlZCBleGNlcHRpb25zIHVuZGVyIFJFUVVJUkUg YXNzZXJ0aW9ucworICAgICAgICAgICAgLy8gYXJlIHJlcG9ydGVkIHdpdGhvdXQgdHJhbnNsYXRp b24gYXQgdGhlIHBvaW50IG9mIG9yaWdpbi4KKyAgICAgICAgICAgIGlmKCBtX3Nob3VsZFJlcG9y dFVuZXhwZWN0ZWQgKSB7CisgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVhY3Rpb24gZHVtbXlS ZWFjdGlvbjsKKyAgICAgICAgICAgICAgICBoYW5kbGVVbmV4cGVjdGVkSW5mbGlnaHRFeGNlcHRp b24oIG1fbGFzdEFzc2VydGlvbkluZm8sIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpLCBkdW1t eVJlYWN0aW9uICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ291bnRzIGFz c2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zIC0gcHJldkFzc2VydGlvbnM7CisgICAgICAg IGJvb2wgbWlzc2luZ0Fzc2VydGlvbnMgPSB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoYXNzZXJ0 aW9ucyk7CisKKyAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXItPmNsb3NlKCk7CisgICAgICAgIGhh bmRsZVVuZmluaXNoZWRTZWN0aW9ucygpOworICAgICAgICBtX21lc3NhZ2VzLmNsZWFyKCk7Cisg ICAgICAgIG1fbWVzc2FnZVNjb3Blcy5jbGVhcigpOworCisgICAgICAgIFNlY3Rpb25TdGF0cyB0 ZXN0Q2FzZVNlY3Rpb25TdGF0cyh0ZXN0Q2FzZVNlY3Rpb24sIGFzc2VydGlvbnMsIGR1cmF0aW9u LCBtaXNzaW5nQXNzZXJ0aW9ucyk7CisgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCh0 ZXN0Q2FzZVNlY3Rpb25TdGF0cyk7CisgICAgfQorCisgICAgdm9pZCBSdW5Db250ZXh0OjppbnZv a2VBY3RpdmVUZXN0Q2FzZSgpIHsKKyAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyR3VhcmQg XygmbV9mYXRhbENvbmRpdGlvbmhhbmRsZXIpOworICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlLT5p bnZva2UoKTsKKyAgICB9CisKKyAgICB2b2lkIFJ1bkNvbnRleHQ6OmhhbmRsZVVuZmluaXNoZWRT ZWN0aW9ucygpIHsKKyAgICAgICAgLy8gSWYgc2VjdGlvbnMgZW5kZWQgcHJlbWF0dXJlbHkgZHVl IHRvIGFuIGV4Y2VwdGlvbiB3ZSBzdG9yZWQgdGhlaXIKKyAgICAgICAgLy8gaW5mb3MgaGVyZSBz byB3ZSBjYW4gdGVhciB0aGVtIGRvd24gb3V0c2lkZSB0aGUgdW53aW5kIHByb2Nlc3MuCisgICAg ICAgIGZvciAoYXV0byBpdCA9IG1fdW5maW5pc2hlZFNlY3Rpb25zLnJiZWdpbigpLAorICAgICAg ICAgICAgIGl0RW5kID0gbV91bmZpbmlzaGVkU2VjdGlvbnMucmVuZCgpOworICAgICAgICAgICAg IGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICsraXQpCisgICAgICAgICAgICBzZWN0aW9uRW5k ZWQoKml0KTsKKyAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlvbnMuY2xlYXIoKTsKKyAgICB9CisK KyAgICB2b2lkIFJ1bkNvbnRleHQ6OmhhbmRsZUV4cHIoCisgICAgICAgIEFzc2VydGlvbkluZm8g Y29uc3QmIGluZm8sCisgICAgICAgIElUcmFuc2llbnRFeHByZXNzaW9uIGNvbnN0JiBleHByLAor ICAgICAgICBBc3NlcnRpb25SZWFjdGlvbiYgcmVhY3Rpb24KKyAgICApIHsKKyAgICAgICAgbV9y ZXBvcnRlci0+YXNzZXJ0aW9uU3RhcnRpbmcoIGluZm8gKTsKKworICAgICAgICBib29sIG5lZ2F0 ZWQgPSBpc0ZhbHNlVGVzdCggaW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgICAgICBib29s IHJlc3VsdCA9IGV4cHIuZ2V0UmVzdWx0KCkgIT0gbmVnYXRlZDsKKworICAgICAgICBpZiggcmVz dWx0ICkgeworICAgICAgICAgICAgaWYgKCFtX2luY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cykgewor ICAgICAgICAgICAgICAgIGFzc2VydGlvblBhc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAg ICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwb3J0RXhwcihpbmZvLCBSZXN1bHRXYXM6 Ok9rLCAmZXhwciwgbmVnYXRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAg ZWxzZSB7CisgICAgICAgICAgICByZXBvcnRFeHByKGluZm8sIFJlc3VsdFdhczo6RXhwcmVzc2lv bkZhaWxlZCwgJmV4cHIsIG5lZ2F0ZWQgKTsKKyAgICAgICAgICAgIHBvcHVsYXRlUmVhY3Rpb24o IHJlYWN0aW9uICk7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBSdW5Db250ZXh0OjpyZXBv cnRFeHByKAorICAgICAgICAgICAgQXNzZXJ0aW9uSW5mbyBjb25zdCAmaW5mbywKKyAgICAgICAg ICAgIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUsCisgICAgICAgICAgICBJVHJhbnNpZW50 RXhwcmVzc2lvbiBjb25zdCAqZXhwciwKKyAgICAgICAgICAgIGJvb2wgbmVnYXRlZCApIHsKKwor ICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gaW5mbzsKKyAgICAgICAgQXNzZXJ0aW9uUmVz dWx0RGF0YSBkYXRhKCByZXN1bHRUeXBlLCBMYXp5RXhwcmVzc2lvbiggbmVnYXRlZCApICk7CisK KyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdHsgaW5mbywgZGF0YSB9Owor ICAgICAgICBhc3NlcnRpb25SZXN1bHQubV9yZXN1bHREYXRhLmxhenlFeHByZXNzaW9uLm1fdHJh bnNpZW50RXhwcmVzc2lvbiA9IGV4cHI7CisKKyAgICAgICAgYXNzZXJ0aW9uRW5kZWQoIGFzc2Vy dGlvblJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUnVuQ29udGV4dDo6aGFuZGxlTWVzc2Fn ZSgKKyAgICAgICAgICAgIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sCisgICAgICAgICAgICBS ZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlLAorICAgICAgICAgICAgU3RyaW5nUmVmIGNvbnN0 JiBtZXNzYWdlLAorICAgICAgICAgICAgQXNzZXJ0aW9uUmVhY3Rpb24mIHJlYWN0aW9uCisgICAg KSB7CisgICAgICAgIG1fcmVwb3J0ZXItPmFzc2VydGlvblN0YXJ0aW5nKCBpbmZvICk7CisKKyAg ICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IGluZm87CisKKyAgICAgICAgQXNzZXJ0aW9uUmVz dWx0RGF0YSBkYXRhKCByZXN1bHRUeXBlLCBMYXp5RXhwcmVzc2lvbiggZmFsc2UgKSApOworICAg ICAgICBkYXRhLm1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4obWVzc2FnZSk7Cisg ICAgICAgIEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHR7IG1fbGFzdEFzc2VydGlvbklu Zm8sIGRhdGEgfTsKKyAgICAgICAgYXNzZXJ0aW9uRW5kZWQoIGFzc2VydGlvblJlc3VsdCApOwor ICAgICAgICBpZiggIWFzc2VydGlvblJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgcG9wdWxh dGVSZWFjdGlvbiggcmVhY3Rpb24gKTsKKyAgICB9CisgICAgdm9pZCBSdW5Db250ZXh0OjpoYW5k bGVVbmV4cGVjdGVkRXhjZXB0aW9uTm90VGhyb3duKAorICAgICAgICAgICAgQXNzZXJ0aW9uSW5m byBjb25zdCYgaW5mbywKKyAgICAgICAgICAgIEFzc2VydGlvblJlYWN0aW9uJiByZWFjdGlvbgor ICAgICkgeworICAgICAgICBoYW5kbGVOb25FeHByKGluZm8sIENhdGNoOjpSZXN1bHRXYXM6OkRp ZG50VGhyb3dFeGNlcHRpb24sIHJlYWN0aW9uKTsKKyAgICB9CisKKyAgICB2b2lkIFJ1bkNvbnRl eHQ6OmhhbmRsZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2VwdGlvbigKKyAgICAgICAgICAgIEFzc2Vy dGlvbkluZm8gY29uc3QmIGluZm8sCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbWVz c2FnZSwKKyAgICAgICAgICAgIEFzc2VydGlvblJlYWN0aW9uJiByZWFjdGlvbgorICAgICkgewor ICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gaW5mbzsKKworICAgICAgICBBc3NlcnRpb25S ZXN1bHREYXRhIGRhdGEoIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24sIExhenlFeHByZXNzaW9u KCBmYWxzZSApICk7CisgICAgICAgIGRhdGEubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIEFz c2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHR7IGluZm8sIGRhdGEgfTsKKyAgICAgICAgYXNz ZXJ0aW9uRW5kZWQoIGFzc2VydGlvblJlc3VsdCApOworICAgICAgICBwb3B1bGF0ZVJlYWN0aW9u KCByZWFjdGlvbiApOworICAgIH0KKworICAgIHZvaWQgUnVuQ29udGV4dDo6cG9wdWxhdGVSZWFj dGlvbiggQXNzZXJ0aW9uUmVhY3Rpb24mIHJlYWN0aW9uICkgeworICAgICAgICByZWFjdGlvbi5z aG91bGREZWJ1Z0JyZWFrID0gbV9jb25maWctPnNob3VsZERlYnVnQnJlYWsoKTsKKyAgICAgICAg cmVhY3Rpb24uc2hvdWxkVGhyb3cgPSBhYm9ydGluZygpIHx8IChtX2xhc3RBc3NlcnRpb25JbmZv LnJlc3VsdERpc3Bvc2l0aW9uICYgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCk7CisgICAgfQor CisgICAgdm9pZCBSdW5Db250ZXh0OjpoYW5kbGVJbmNvbXBsZXRlKAorICAgICAgICAgICAgQXNz ZXJ0aW9uSW5mbyBjb25zdCYgaW5mbworICAgICkgeworICAgICAgICBtX2xhc3RBc3NlcnRpb25J bmZvID0gaW5mbzsKKworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIGRhdGEoIFJlc3VsdFdh czo6VGhyZXdFeGNlcHRpb24sIExhenlFeHByZXNzaW9uKCBmYWxzZSApICk7CisgICAgICAgIGRh dGEubWVzc2FnZSA9ICJFeGNlcHRpb24gdHJhbnNsYXRpb24gd2FzIGRpc2FibGVkIGJ5IENBVENI X0NPTkZJR19GQVNUX0NPTVBJTEUiOworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9u UmVzdWx0eyBpbmZvLCBkYXRhIH07CisgICAgICAgIGFzc2VydGlvbkVuZGVkKCBhc3NlcnRpb25S ZXN1bHQgKTsKKyAgICB9CisgICAgdm9pZCBSdW5Db250ZXh0OjpoYW5kbGVOb25FeHByKAorICAg ICAgICAgICAgQXNzZXJ0aW9uSW5mbyBjb25zdCAmaW5mbywKKyAgICAgICAgICAgIFJlc3VsdFdh czo6T2ZUeXBlIHJlc3VsdFR5cGUsCisgICAgICAgICAgICBBc3NlcnRpb25SZWFjdGlvbiAmcmVh Y3Rpb24KKyAgICApIHsKKyAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IGluZm87CisKKyAg ICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhKCByZXN1bHRUeXBlLCBMYXp5RXhwcmVzc2lv biggZmFsc2UgKSApOworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0eyBp bmZvLCBkYXRhIH07CisgICAgICAgIGFzc2VydGlvbkVuZGVkKCBhc3NlcnRpb25SZXN1bHQgKTsK KworICAgICAgICBpZiggIWFzc2VydGlvblJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgcG9w dWxhdGVSZWFjdGlvbiggcmVhY3Rpb24gKTsKKyAgICB9CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYg Z2V0UmVzdWx0Q2FwdHVyZSgpIHsKKyAgICAgICAgaWYgKGF1dG8qIGNhcHR1cmUgPSBnZXRDdXJy ZW50Q29udGV4dCgpLmdldFJlc3VsdENhcHR1cmUoKSkKKyAgICAgICAgICAgIHJldHVybiAqY2Fw dHVyZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfRVJST1IoIk5v IHJlc3VsdCBjYXB0dXJlIGluc3RhbmNlIik7CisgICAgfQorCisgICAgdm9pZCBzZWVkUm5nKElD b25maWcgY29uc3QmIGNvbmZpZykgeworICAgICAgICBpZiAoY29uZmlnLnJuZ1NlZWQoKSAhPSAw KSB7CisgICAgICAgICAgICBzdGQ6OnNyYW5kKGNvbmZpZy5ybmdTZWVkKCkpOworICAgICAgICAg ICAgcm5nKCkuc2VlZChjb25maWcucm5nU2VlZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAg IHVuc2lnbmVkIGludCBybmdTZWVkKCkgeworICAgICAgICByZXR1cm4gZ2V0Q3VycmVudENvbnRl eHQoKS5nZXRDb25maWcoKS0+cm5nU2VlZCgpOworICAgIH0KKworfQorLy8gZW5kIGNhdGNoX3J1 bl9jb250ZXh0LmNwcAorLy8gc3RhcnQgY2F0Y2hfc2VjdGlvbi5jcHAKKworbmFtZXNwYWNlIENh dGNoIHsKKworICAgIFNlY3Rpb246OlNlY3Rpb24oIFNlY3Rpb25JbmZvIGNvbnN0JiBpbmZvICkK KyAgICA6ICAgbV9pbmZvKCBpbmZvICksCisgICAgICAgIG1fc2VjdGlvbkluY2x1ZGVkKCBnZXRS ZXN1bHRDYXB0dXJlKCkuc2VjdGlvblN0YXJ0ZWQoIG1faW5mbywgbV9hc3NlcnRpb25zICkgKQor ICAgIHsKKyAgICAgICAgbV90aW1lci5zdGFydCgpOworICAgIH0KKworICAgIFNlY3Rpb246On5T ZWN0aW9uKCkgeworICAgICAgICBpZiggbV9zZWN0aW9uSW5jbHVkZWQgKSB7CisgICAgICAgICAg ICBTZWN0aW9uRW5kSW5mbyBlbmRJbmZveyBtX2luZm8sIG1fYXNzZXJ0aW9ucywgbV90aW1lci5n ZXRFbGFwc2VkU2Vjb25kcygpIH07CisgICAgICAgICAgICBpZiggdW5jYXVnaHRfZXhjZXB0aW9u cygpICkKKyAgICAgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvbkVuZGVkRWFy bHkoIGVuZEluZm8gKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZXRSZXN1 bHRDYXB0dXJlKCkuc2VjdGlvbkVuZGVkKCBlbmRJbmZvICk7CisgICAgICAgIH0KKyAgICB9CisK KyAgICAvLyBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBleGVj dXRlZCBvciBub3QKKyAgICBTZWN0aW9uOjpvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAg ICByZXR1cm4gbV9zZWN0aW9uSW5jbHVkZWQ7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ug Q2F0Y2gKKy8vIGVuZCBjYXRjaF9zZWN0aW9uLmNwcAorLy8gc3RhcnQgY2F0Y2hfc2VjdGlvbl9p bmZvLmNwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgU2VjdGlvbkluZm86OlNlY3Rpb25J bmZvCisgICAgICAgICggICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAg ICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkKKyAgICA6ICAgbmFtZSggX25hbWUgKSwK KyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApCisgICAge30KKworfSAvLyBlbmQgbmFtZXNw YWNlIENhdGNoCisvLyBlbmQgY2F0Y2hfc2VjdGlvbl9pbmZvLmNwcAorLy8gc3RhcnQgY2F0Y2hf c2Vzc2lvbi5jcHAKKworLy8gc3RhcnQgY2F0Y2hfc2Vzc2lvbi5oCisKKyNpbmNsdWRlIDxtZW1v cnk+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBTZXNzaW9uIDogTm9uQ29weWFi bGUgeworICAgIHB1YmxpYzoKKworICAgICAgICBTZXNzaW9uKCk7CisgICAgICAgIH5TZXNzaW9u KCkgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCBzaG93SGVscCgpIGNvbnN0OworICAgICAgICB2 b2lkIGxpYklkZW50aWZ5KCk7CisKKyAgICAgICAgaW50IGFwcGx5Q29tbWFuZExpbmUoIGludCBh cmdjLCBjaGFyIGNvbnN0ICogY29uc3QgKiBhcmd2ICk7CisgICAgI2lmIGRlZmluZWQoQ0FUQ0hf Q09ORklHX1dDSEFSKSAmJiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChVTklDT0RFKQorICAg ICAgICBpbnQgYXBwbHlDb21tYW5kTGluZSggaW50IGFyZ2MsIHdjaGFyX3QgY29uc3QgKiBjb25z dCAqIGFyZ3YgKTsKKyAgICAjZW5kaWYKKworICAgICAgICB2b2lkIHVzZUNvbmZpZ0RhdGEoIENv bmZpZ0RhdGEgY29uc3QmIGNvbmZpZ0RhdGEgKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFt ZSBDaGFyVD4KKyAgICAgICAgaW50IHJ1bihpbnQgYXJnYywgQ2hhclQgY29uc3QgKiBjb25zdCBh cmd2W10pIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXJ0dXBFeGNlcHRpb25zKQorICAgICAgICAg ICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBhcHBseUNvbW1h bmRMaW5lKGFyZ2MsIGFyZ3YpOworICAgICAgICAgICAgaWYgKHJldHVybkNvZGUgPT0gMCkKKyAg ICAgICAgICAgICAgICByZXR1cm5Db2RlID0gcnVuKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0 dXJuQ29kZTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBydW4oKTsKKworICAgICAgICBjbGFy YTo6UGFyc2VyIGNvbnN0JiBjbGkoKSBjb25zdDsKKyAgICAgICAgdm9pZCBjbGkoIGNsYXJhOjpQ YXJzZXIgY29uc3QmIG5ld1BhcnNlciApOworICAgICAgICBDb25maWdEYXRhJiBjb25maWdEYXRh KCk7CisgICAgICAgIENvbmZpZyYgY29uZmlnKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50 IHJ1bkludGVybmFsKCk7CisKKyAgICAgICAgY2xhcmE6OlBhcnNlciBtX2NsaTsKKyAgICAgICAg Q29uZmlnRGF0YSBtX2NvbmZpZ0RhdGE7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb25maWc+ IG1fY29uZmlnOworICAgICAgICBib29sIG1fc3RhcnR1cEV4Y2VwdGlvbnMgPSBmYWxzZTsKKyAg ICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gZW5kIGNhdGNoX3Nlc3Npb24u aAorLy8gc3RhcnQgY2F0Y2hfdmVyc2lvbi5oCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisKK25hbWVz cGFjZSBDYXRjaCB7CisKKyAgICAvLyBWZXJzaW9uaW5nIGluZm9ybWF0aW9uCisgICAgc3RydWN0 IFZlcnNpb24geworICAgICAgICBWZXJzaW9uKCBWZXJzaW9uIGNvbnN0JiApID0gZGVsZXRlOwor ICAgICAgICBWZXJzaW9uJiBvcGVyYXRvcj0oIFZlcnNpb24gY29uc3QmICkgPSBkZWxldGU7Cisg ICAgICAgIFZlcnNpb24oICAgIHVuc2lnbmVkIGludCBfbWFqb3JWZXJzaW9uLAorICAgICAgICAg ICAgICAgICAgICB1bnNpZ25lZCBpbnQgX21pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAg ICAgdW5zaWduZWQgaW50IF9wYXRjaE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgY2hhciBj b25zdCAqIGNvbnN0IF9icmFuY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBp bnQgX2J1aWxkTnVtYmVyICk7CisKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG1ham9yVmVy c2lvbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG1pbm9yVmVyc2lvbjsKKyAgICAgICAg dW5zaWduZWQgaW50IGNvbnN0IHBhdGNoTnVtYmVyOworCisgICAgICAgIC8vIGJ1aWxkTnVtYmVy IGlzIG9ubHkgdXNlZCBpZiBicmFuY2hOYW1lIGlzIG5vdCBudWxsCisgICAgICAgIGNoYXIgY29u c3QgKiBjb25zdCBicmFuY2hOYW1lOworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgYnVpbGRO dW1iZXI7CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6 Om9zdHJlYW0mIG9zLCBWZXJzaW9uIGNvbnN0JiB2ZXJzaW9uICk7CisgICAgfTsKKworICAgIFZl cnNpb24gY29uc3QmIGxpYnJhcnlWZXJzaW9uKCk7Cit9CisKKy8vIGVuZCBjYXRjaF92ZXJzaW9u LmgKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c2V0 PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNw YWNlIHsKKyAgICAgICAgY29uc3QgaW50IE1heEV4aXRDb2RlID0gMjU1OworCisgICAgICAgIElT dHJlYW1pbmdSZXBvcnRlclB0ciBjcmVhdGVSZXBvcnRlcihzdGQ6OnN0cmluZyBjb25zdCYgcmVw b3J0ZXJOYW1lLCBJQ29uZmlnUHRyIGNvbnN0JiBjb25maWcpIHsKKyAgICAgICAgICAgIGF1dG8g cmVwb3J0ZXIgPSBDYXRjaDo6Z2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCku Y3JlYXRlKHJlcG9ydGVyTmFtZSwgY29uZmlnKTsKKyAgICAgICAgICAgIENBVENIX0VORk9SQ0Uo cmVwb3J0ZXIsICJObyByZXBvcnRlciByZWdpc3RlcmVkIHdpdGggbmFtZTogJyIgPDwgcmVwb3J0 ZXJOYW1lIDw8ICInIik7CisKKyAgICAgICAgICAgIHJldHVybiByZXBvcnRlcjsKKyAgICAgICAg fQorCisgICAgICAgIElTdHJlYW1pbmdSZXBvcnRlclB0ciBtYWtlUmVwb3J0ZXIoc3RkOjpzaGFy ZWRfcHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZykgeworICAgICAgICAgICAgaWYgKENhdGNoOjpn ZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnkoKS5nZXRMaXN0ZW5lcnMoKS5lbXB0 eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcG9ydGVyKGNvbmZpZy0+Z2V0 UmVwb3J0ZXJOYW1lKCksIGNvbmZpZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8v IE9uIG9sZGVyIHBsYXRmb3JtcywgcmV0dXJuaW5nIHN0ZDo6dW5pcXVlX3B0cjxMaXN0ZW5pbmdS ZXBvcnRlcj4KKyAgICAgICAgICAgIC8vIHdoZW4gdGhlIHJldHVybiB0eXBlIGlzIHN0ZDo6dW5p cXVlX3B0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+CisgICAgICAgICAgICAvLyBkb2Vzbid0IGNvbXBp bGUgd2l0aG91dCBhIHN0ZDo6bW92ZSBjYWxsLiBIb3dldmVyLCB0aGlzIGNhdXNlcworICAgICAg ICAgICAgLy8gYSB3YXJuaW5nIG9uIG5ld2VyIHBsYXRmb3Jtcy4gVGh1cywgd2UgaGF2ZSB0byB3 b3JrIGFyb3VuZAorICAgICAgICAgICAgLy8gaXQgYSBiaXQgYW5kIGRvd25jYXN0IHRoZSBwb2lu dGVyIG1hbnVhbGx5LgorICAgICAgICAgICAgYXV0byByZXQgPSBzdGQ6OnVuaXF1ZV9wdHI8SVN0 cmVhbWluZ1JlcG9ydGVyPihuZXcgTGlzdGVuaW5nUmVwb3J0ZXIpOworICAgICAgICAgICAgYXV0 byYgbXVsdGkgPSBzdGF0aWNfY2FzdDxMaXN0ZW5pbmdSZXBvcnRlciY+KCpyZXQpOworICAgICAg ICAgICAgYXV0byBjb25zdCYgbGlzdGVuZXJzID0gQ2F0Y2g6OmdldFJlZ2lzdHJ5SHViKCkuZ2V0 UmVwb3J0ZXJSZWdpc3RyeSgpLmdldExpc3RlbmVycygpOworICAgICAgICAgICAgZm9yIChhdXRv IGNvbnN0JiBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIG11bHRpLmFk ZExpc3RlbmVyKGxpc3RlbmVyLT5jcmVhdGUoQ2F0Y2g6OlJlcG9ydGVyQ29uZmlnKGNvbmZpZykp KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG11bHRpLmFkZFJlcG9ydGVyKGNyZWF0ZVJl cG9ydGVyKGNvbmZpZy0+Z2V0UmVwb3J0ZXJOYW1lKCksIGNvbmZpZykpOworICAgICAgICAgICAg cmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFRlc3RHcm91cCB7CisgICAg ICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGV4cGxpY2l0IFRlc3RHcm91cChzdGQ6OnNoYXJlZF9w dHI8Q29uZmlnPiBjb25zdCYgY29uZmlnKQorICAgICAgICAgICAgOiBtX2NvbmZpZ3tjb25maWd9 CisgICAgICAgICAgICAsIG1fY29udGV4dHtjb25maWcsIG1ha2VSZXBvcnRlcihjb25maWcpfQor ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF1dG8gY29uc3QmIGFsbFRlc3RDYXNlcyA9 IGdldEFsbFRlc3RDYXNlc1NvcnRlZCgqbV9jb25maWcpOworICAgICAgICAgICAgICAgIG1fbWF0 Y2hlcyA9IG1fY29uZmlnLT50ZXN0U3BlYygpLm1hdGNoZXNCeUZpbHRlcihhbGxUZXN0Q2FzZXMs ICptX2NvbmZpZyk7CisgICAgICAgICAgICAgICAgYXV0byBjb25zdCYgaW52YWxpZEFyZ3MgPSBt X2NvbmZpZy0+dGVzdFNwZWMoKS5nZXRJbnZhbGlkQXJncygpOworCisgICAgICAgICAgICAgICAg aWYgKG1fbWF0Y2hlcy5lbXB0eSgpICYmIGludmFsaWRBcmdzLmVtcHR5KCkpIHsKKyAgICAgICAg ICAgICAgICAgICAgZm9yIChhdXRvIGNvbnN0JiB0ZXN0IDogYWxsVGVzdENhc2VzKQorICAgICAg ICAgICAgICAgICAgICAgICAgaWYgKCF0ZXN0LmlzSGlkZGVuKCkpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbV90ZXN0cy5lbXBsYWNlKCZ0ZXN0KTsKKyAgICAgICAgICAgICAgICB9IGVs c2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QmIG1hdGNoIDogbV9tYXRj aGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgbV90ZXN0cy5pbnNlcnQobWF0Y2gudGVzdHMu YmVnaW4oKSwgbWF0Y2gudGVzdHMuZW5kKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgIH0KKworICAgICAgICAgICAgVG90YWxzIGV4ZWN1dGUoKSB7CisgICAgICAgICAgICAgICAg YXV0byBjb25zdCYgaW52YWxpZEFyZ3MgPSBtX2NvbmZpZy0+dGVzdFNwZWMoKS5nZXRJbnZhbGlk QXJncygpOworICAgICAgICAgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgICAgICAgICAgICAg bV9jb250ZXh0LnRlc3RHcm91cFN0YXJ0aW5nKG1fY29uZmlnLT5uYW1lKCksIDEsIDEpOworICAg ICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgdGVzdENhc2UgOiBtX3Rlc3RzKSB7CisgICAg ICAgICAgICAgICAgICAgIGlmICghbV9jb250ZXh0LmFib3J0aW5nKCkpCisgICAgICAgICAgICAg ICAgICAgICAgICB0b3RhbHMgKz0gbV9jb250ZXh0LnJ1blRlc3QoKnRlc3RDYXNlKTsKKyAgICAg ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbV9jb250ZXh0LnJl cG9ydGVyKCkuc2tpcFRlc3QoKnRlc3RDYXNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg ICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QmIG1hdGNoIDogbV9tYXRjaGVzKSB7CisgICAgICAg ICAgICAgICAgICAgIGlmIChtYXRjaC50ZXN0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAg ICAgICAgICBtX2NvbnRleHQucmVwb3J0ZXIoKS5ub01hdGNoaW5nVGVzdENhc2VzKG1hdGNoLm5h bWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxzLmVycm9yID0gLTE7CisgICAgICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAo IWludmFsaWRBcmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGNv bnN0JiBpbnZhbGlkQXJnOiBpbnZhbGlkQXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgICBt X2NvbnRleHQucmVwb3J0ZXIoKS5yZXBvcnRJbnZhbGlkQXJndW1lbnRzKGludmFsaWRBcmcpOwor ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1fY29udGV4dC50ZXN0R3JvdXBF bmRlZChtX2NvbmZpZy0+bmFtZSgpLCB0b3RhbHMsIDEsIDEpOworICAgICAgICAgICAgICAgIHJl dHVybiB0b3RhbHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAg ICAgIHVzaW5nIFRlc3RzID0gc3RkOjpzZXQ8VGVzdENhc2UgY29uc3QqPjsKKworICAgICAgICAg ICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZz4gbV9jb25maWc7CisgICAgICAgICAgICBSdW5Db250 ZXh0IG1fY29udGV4dDsKKyAgICAgICAgICAgIFRlc3RzIG1fdGVzdHM7CisgICAgICAgICAgICBU ZXN0U3BlYzo6TWF0Y2hlcyBtX21hdGNoZXM7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBh cHBseUZpbGVuYW1lc0FzVGFncyhDYXRjaDo6SUNvbmZpZyBjb25zdCYgY29uZmlnKSB7CisgICAg ICAgICAgICBhdXRvJiB0ZXN0cyA9IGNvbnN0X2Nhc3Q8c3RkOjp2ZWN0b3I8VGVzdENhc2U+Jj4o Z2V0QWxsVGVzdENhc2VzU29ydGVkKGNvbmZpZykpOworICAgICAgICAgICAgZm9yIChhdXRvJiB0 ZXN0Q2FzZSA6IHRlc3RzKSB7CisgICAgICAgICAgICAgICAgYXV0byB0YWdzID0gdGVzdENhc2Uu dGFnczsKKworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gdGVzdENhc2Uu bGluZUluZm8uZmlsZTsKKyAgICAgICAgICAgICAgICBhdXRvIGxhc3RTbGFzaCA9IGZpbGVuYW1l LmZpbmRfbGFzdF9vZigiXFwvIik7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCAhPSBz dGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZS5lcmFzZSgw LCBsYXN0U2xhc2gpOworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZVswXSA9ICcjJzsKKyAg ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdXRvIGxhc3REb3QgPSBmaWxlbmFt ZS5maW5kX2xhc3Rfb2YoJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdERvdCAhPSBzdGQ6 OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZS5lcmFzZShsYXN0 RG90KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0YWdzLnB1c2hfYmFj ayhzdGQ6Om1vdmUoZmlsZW5hbWUpKTsKKyAgICAgICAgICAgICAgICBzZXRUYWdzKHRlc3RDYXNl LCB0YWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSAvLyBhbm9uIG5hbWVz cGFjZQorCisgICAgU2Vzc2lvbjo6U2Vzc2lvbigpIHsKKyAgICAgICAgc3RhdGljIGJvb2wgYWxy ZWFkeUluc3RhbnRpYXRlZCA9IGZhbHNlOworICAgICAgICBpZiggYWxyZWFkeUluc3RhbnRpYXRl ZCApIHsKKyAgICAgICAgICAgIENBVENIX1RSWSB7IENBVENIX0lOVEVSTkFMX0VSUk9SKCAiT25s eSBvbmUgaW5zdGFuY2Ugb2YgQ2F0Y2g6OlNlc3Npb24gY2FuIGV2ZXIgYmUgdXNlZCIgKTsgfQor ICAgICAgICAgICAgQ0FUQ0hfQ0FUQ0hfQUxMIHsgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVn aXN0ZXJTdGFydHVwRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXJl IGNhbm5vdCBiZSBleGNlcHRpb25zIGF0IHN0YXJ0dXAgaW4gbm8tZXhjZXB0aW9uIG1vZGUuCisj aWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfRVhDRVBUSU9OUykKKyAgICAgICAgY29u c3QgYXV0byYgZXhjZXB0aW9ucyA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0U3RhcnR1cEV4Y2VwdGlv blJlZ2lzdHJ5KCkuZ2V0RXhjZXB0aW9ucygpOworICAgICAgICBpZiAoICFleGNlcHRpb25zLmVt cHR5KCkgKSB7CisgICAgICAgICAgICBjb25maWcoKTsKKyAgICAgICAgICAgIGdldEN1cnJlbnRN dXRhYmxlQ29udGV4dCgpLnNldENvbmZpZyhtX2NvbmZpZyk7CisKKyAgICAgICAgICAgIG1fc3Rh cnR1cEV4Y2VwdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBD b2xvdXI6OlJlZCApOworICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCAiRXJyb3JzIG9jY3Vy cmVkIGR1cmluZyBzdGFydHVwISIgPDwgJ1xuJzsKKyAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3Zl ciBhbGwgZXhjZXB0aW9ucyBhbmQgbm90aWZ5IHVzZXIKKyAgICAgICAgICAgIGZvciAoIGNvbnN0 IGF1dG8mIGV4X3B0ciA6IGV4Y2VwdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAg ICAgICAgICAgICAgICAgICAgc3RkOjpyZXRocm93X2V4Y2VwdGlvbihleF9wdHIpOworICAgICAg ICAgICAgICAgIH0gY2F0Y2ggKCBzdGQ6OmV4Y2VwdGlvbiBjb25zdCYgZXggKSB7CisgICAgICAg ICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgQ29sdW1uKCBleC53aGF0KCkgKS5pbmRlbnQo MikgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K KyNlbmRpZgorCisgICAgICAgIGFscmVhZHlJbnN0YW50aWF0ZWQgPSB0cnVlOworICAgICAgICBt X2NsaSA9IG1ha2VDb21tYW5kTGluZVBhcnNlciggbV9jb25maWdEYXRhICk7CisgICAgfQorICAg IFNlc3Npb246On5TZXNzaW9uKCkgeworICAgICAgICBDYXRjaDo6Y2xlYW5VcCgpOworICAgIH0K KworICAgIHZvaWQgU2Vzc2lvbjo6c2hvd0hlbHAoKSBjb25zdCB7CisgICAgICAgIENhdGNoOjpj b3V0KCkKKyAgICAgICAgICAgICAgICA8PCAiXG5DYXRjaCB2IiA8PCBsaWJyYXJ5VmVyc2lvbigp IDw8ICJcbiIKKyAgICAgICAgICAgICAgICA8PCBtX2NsaSA8PCBzdGQ6OmVuZGwKKyAgICAgICAg ICAgICAgICA8PCAiRm9yIG1vcmUgZGV0YWlsZWQgdXNhZ2UgcGxlYXNlIHNlZSB0aGUgcHJvamVj dCBkb2NzXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgICAgdm9pZCBTZXNzaW9uOjpsaWJJZGVu dGlmeSgpIHsKKyAgICAgICAgQ2F0Y2g6OmNvdXQoKQorICAgICAgICAgICAgICAgIDw8IHN0ZDo6 bGVmdCA8PCBzdGQ6OnNldHcoMTYpIDw8ICJkZXNjcmlwdGlvbjogIiA8PCAiQSBDYXRjaDIgdGVz dCBleGVjdXRhYmxlXG4iCisgICAgICAgICAgICAgICAgPDwgc3RkOjpsZWZ0IDw8IHN0ZDo6c2V0 dygxNikgPDwgImNhdGVnb3J5OiAiIDw8ICJ0ZXN0ZnJhbWV3b3JrXG4iCisgICAgICAgICAgICAg ICAgPDwgc3RkOjpsZWZ0IDw8IHN0ZDo6c2V0dygxNikgPDwgImZyYW1ld29yazogIiA8PCAiQ2F0 Y2ggVGVzdFxuIgorICAgICAgICAgICAgICAgIDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoMTYp IDw8ICJ2ZXJzaW9uOiAiIDw8IGxpYnJhcnlWZXJzaW9uKCkgPDwgc3RkOjplbmRsOworICAgIH0K KworICAgIGludCBTZXNzaW9uOjphcHBseUNvbW1hbmRMaW5lKCBpbnQgYXJnYywgY2hhciBjb25z dCAqIGNvbnN0ICogYXJndiApIHsKKyAgICAgICAgaWYoIG1fc3RhcnR1cEV4Y2VwdGlvbnMgKQor ICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgYXV0byByZXN1bHQgPSBtX2NsaS5wYXJz ZSggY2xhcmE6OkFyZ3MoIGFyZ2MsIGFyZ3YgKSApOworICAgICAgICBpZiggIXJlc3VsdCApIHsK KyAgICAgICAgICAgIGNvbmZpZygpOworICAgICAgICAgICAgZ2V0Q3VycmVudE11dGFibGVDb250 ZXh0KCkuc2V0Q29uZmlnKG1fY29uZmlnKTsKKyAgICAgICAgICAgIENhdGNoOjpjZXJyKCkKKyAg ICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkKKyAgICAgICAgICAgICAgICA8 PCAiXG5FcnJvcihzKSBpbiBpbnB1dDpcbiIKKyAgICAgICAgICAgICAgICA8PCBDb2x1bW4oIHJl c3VsdC5lcnJvck1lc3NhZ2UoKSApLmluZGVudCggMiApCisgICAgICAgICAgICAgICAgPDwgIlxu XG4iOworICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCAiUnVuIHdpdGggLT8gZm9yIHVzYWdl XG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHJldHVybiBNYXhFeGl0Q29kZTsKKyAgICAg ICAgfQorCisgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuc2hvd0hlbHAgKQorICAgICAgICAgICAg c2hvd0hlbHAoKTsKKyAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5saWJJZGVudGlmeSApCisgICAg ICAgICAgICBsaWJJZGVudGlmeSgpOworICAgICAgICBtX2NvbmZpZy5yZXNldCgpOworICAgICAg ICByZXR1cm4gMDsKKyAgICB9CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19XQ0hBUikgJiYg ZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoVU5JQ09ERSkKKyAgICBpbnQgU2Vzc2lvbjo6YXBw bHlDb21tYW5kTGluZSggaW50IGFyZ2MsIHdjaGFyX3QgY29uc3QgKiBjb25zdCAqIGFyZ3YgKSB7 CisKKyAgICAgICAgY2hhciAqKnV0ZjhBcmd2ID0gbmV3IGNoYXIgKlsgYXJnYyBdOworCisgICAg ICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSApIHsKKyAgICAgICAgICAgIGludCBi dWZTaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZSggQ1BfVVRGOCwgMCwgYXJndltpXSwgLTEsIG51 bGxwdHIsIDAsIG51bGxwdHIsIG51bGxwdHIgKTsKKworICAgICAgICAgICAgdXRmOEFyZ3ZbIGkg XSA9IG5ldyBjaGFyWyBidWZTaXplIF07CisKKyAgICAgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5 dGUoIENQX1VURjgsIDAsIGFyZ3ZbaV0sIC0xLCB1dGY4QXJndltpXSwgYnVmU2l6ZSwgbnVsbHB0 ciwgbnVsbHB0ciApOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJldHVybkNvZGUgPSBhcHBs eUNvbW1hbmRMaW5lKCBhcmdjLCB1dGY4QXJndiApOworCisgICAgICAgIGZvciAoIGludCBpID0g MDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICBkZWxldGUgW10gdXRmOEFyZ3ZbIGkgXTsK KworICAgICAgICBkZWxldGUgW10gdXRmOEFyZ3Y7CisKKyAgICAgICAgcmV0dXJuIHJldHVybkNv ZGU7CisgICAgfQorI2VuZGlmCisKKyAgICB2b2lkIFNlc3Npb246OnVzZUNvbmZpZ0RhdGEoIENv bmZpZ0RhdGEgY29uc3QmIGNvbmZpZ0RhdGEgKSB7CisgICAgICAgIG1fY29uZmlnRGF0YSA9IGNv bmZpZ0RhdGE7CisgICAgICAgIG1fY29uZmlnLnJlc2V0KCk7CisgICAgfQorCisgICAgaW50IFNl c3Npb246OnJ1bigpIHsKKyAgICAgICAgaWYoICggbV9jb25maWdEYXRhLndhaXRGb3JLZXlwcmVz cyAmIFdhaXRGb3JLZXlwcmVzczo6QmVmb3JlU3RhcnQgKSAhPSAwICkgeworICAgICAgICAgICAg Q2F0Y2g6OmNvdXQoKSA8PCAiLi4ud2FpdGluZyBmb3IgZW50ZXIvIHJldHVybiBiZWZvcmUgc3Rh cnRpbmciIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KHN0ZDo6 Z2V0Y2hhcigpKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZXhpdENvZGUgPSBydW5JbnRlcm5h bCgpOworICAgICAgICBpZiggKCBtX2NvbmZpZ0RhdGEud2FpdEZvcktleXByZXNzICYgV2FpdEZv cktleXByZXNzOjpCZWZvcmVFeGl0ICkgIT0gMCApIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0 KCkgPDwgIi4uLndhaXRpbmcgZm9yIGVudGVyLyByZXR1cm4gYmVmb3JlIGV4aXRpbmcsIHdpdGgg Y29kZTogIiA8PCBleGl0Q29kZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBzdGF0aWNfY2Fz dDx2b2lkPihzdGQ6OmdldGNoYXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4aXRD b2RlOworICAgIH0KKworICAgIGNsYXJhOjpQYXJzZXIgY29uc3QmIFNlc3Npb246OmNsaSgpIGNv bnN0IHsKKyAgICAgICAgcmV0dXJuIG1fY2xpOworICAgIH0KKyAgICB2b2lkIFNlc3Npb246OmNs aSggY2xhcmE6OlBhcnNlciBjb25zdCYgbmV3UGFyc2VyICkgeworICAgICAgICBtX2NsaSA9IG5l d1BhcnNlcjsKKyAgICB9CisgICAgQ29uZmlnRGF0YSYgU2Vzc2lvbjo6Y29uZmlnRGF0YSgpIHsK KyAgICAgICAgcmV0dXJuIG1fY29uZmlnRGF0YTsKKyAgICB9CisgICAgQ29uZmlnJiBTZXNzaW9u Ojpjb25maWcoKSB7CisgICAgICAgIGlmKCAhbV9jb25maWcgKQorICAgICAgICAgICAgbV9jb25m aWcgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbmZpZz4oIG1fY29uZmlnRGF0YSApOworICAgICAgICBy ZXR1cm4gKm1fY29uZmlnOworICAgIH0KKworICAgIGludCBTZXNzaW9uOjpydW5JbnRlcm5hbCgp IHsKKyAgICAgICAgaWYoIG1fc3RhcnR1cEV4Y2VwdGlvbnMgKQorICAgICAgICAgICAgcmV0dXJu IDE7CisKKyAgICAgICAgaWYgKG1fY29uZmlnRGF0YS5zaG93SGVscCB8fCBtX2NvbmZpZ0RhdGEu bGliSWRlbnRpZnkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAg ICAgQ0FUQ0hfVFJZIHsKKyAgICAgICAgICAgIGNvbmZpZygpOyAvLyBGb3JjZSBjb25maWcgdG8g YmUgY29uc3RydWN0ZWQKKworICAgICAgICAgICAgc2VlZFJuZyggKm1fY29uZmlnICk7CisKKyAg ICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuZmlsZW5hbWVzQXNUYWdzICkKKyAgICAgICAgICAg ICAgICBhcHBseUZpbGVuYW1lc0FzVGFncyggKm1fY29uZmlnICk7CisKKyAgICAgICAgICAgIC8v IEhhbmRsZSBsaXN0IHJlcXVlc3QKKyAgICAgICAgICAgIGlmKCBPcHRpb248c3RkOjpzaXplX3Q+ IGxpc3RlZCA9IGxpc3QoIG1fY29uZmlnICkgKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0 aWNfY2FzdDxpbnQ+KCAqbGlzdGVkICk7CisKKyAgICAgICAgICAgIFRlc3RHcm91cCB0ZXN0cyB7 IG1fY29uZmlnIH07CisgICAgICAgICAgICBhdXRvIGNvbnN0IHRvdGFscyA9IHRlc3RzLmV4ZWN1 dGUoKTsKKworICAgICAgICAgICAgaWYoIG1fY29uZmlnLT53YXJuQWJvdXROb1Rlc3RzKCkgJiYg dG90YWxzLmVycm9yID09IC0xICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKworICAgICAg ICAgICAgLy8gTm90ZSB0aGF0IG9uIHVuaWNlcyBvbmx5IHRoZSBsb3dlciA4IGJpdHMgYXJlIHVz dWFsbHkgdXNlZCwgY2xhbXBpbmcKKyAgICAgICAgICAgIC8vIHRoZSByZXR1cm4gdmFsdWUgdG8g MjU1IHByZXZlbnRzIGZhbHNlIG5lZ2F0aXZlIHdoZW4gc29tZSBtdWx0aXBsZQorICAgICAgICAg ICAgLy8gb2YgMjU2IHRlc3RzIGhhcyBmYWlsZWQKKyAgICAgICAgICAgIHJldHVybiAoc3RkOjpt aW4pIChNYXhFeGl0Q29kZSwgKHN0ZDo6bWF4KSAodG90YWxzLmVycm9yLCBzdGF0aWNfY2FzdDxp bnQ+KHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCkpKTsKKyAgICAgICAgfQorI2lmICFkZWZpbmVk KENBVENIX0NPTkZJR19ESVNBQkxFX0VYQ0VQVElPTlMpCisgICAgICAgIGNhdGNoKCBzdGQ6OmV4 Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICBDYXRjaDo6Y2VycigpIDw8IGV4LndoYXQoKSA8 PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICByZXR1cm4gTWF4RXhpdENvZGU7CisgICAgICAgIH0K KyNlbmRpZgorICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisvLyBlbmQgY2F0Y2hf c2Vzc2lvbi5jcHAKKy8vIHN0YXJ0IGNhdGNoX3NpbmdsZXRvbnMuY3BwCisKKyNpbmNsdWRlIDx2 ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBz dGF0aWMgYXV0byBnZXRTaW5nbGV0b25zKCkgLT4gc3RkOjp2ZWN0b3I8SVNpbmdsZXRvbio+KiYg eworICAgICAgICAgICAgc3RhdGljIHN0ZDo6dmVjdG9yPElTaW5nbGV0b24qPiogZ19zaW5nbGV0 b25zID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmKCAhZ19zaW5nbGV0b25zICkKKyAgICAgICAg ICAgICAgICBnX3NpbmdsZXRvbnMgPSBuZXcgc3RkOjp2ZWN0b3I8SVNpbmdsZXRvbio+KCk7Cisg ICAgICAgICAgICByZXR1cm4gZ19zaW5nbGV0b25zOworICAgICAgICB9CisgICAgfQorCisgICAg SVNpbmdsZXRvbjo6fklTaW5nbGV0b24oKSB7fQorCisgICAgdm9pZCBhZGRTaW5nbGV0b24oSVNp bmdsZXRvbiogc2luZ2xldG9uICkgeworICAgICAgICBnZXRTaW5nbGV0b25zKCktPnB1c2hfYmFj ayggc2luZ2xldG9uICk7CisgICAgfQorICAgIHZvaWQgY2xlYW51cFNpbmdsZXRvbnMoKSB7Cisg ICAgICAgIGF1dG8mIHNpbmdsZXRvbnMgPSBnZXRTaW5nbGV0b25zKCk7CisgICAgICAgIGZvcigg YXV0byBzaW5nbGV0b24gOiAqc2luZ2xldG9ucyApCisgICAgICAgICAgICBkZWxldGUgc2luZ2xl dG9uOworICAgICAgICBkZWxldGUgc2luZ2xldG9uczsKKyAgICAgICAgc2luZ2xldG9ucyA9IG51 bGxwdHI7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorLy8gZW5kIGNhdGNoX3Npbmds ZXRvbnMuY3BwCisvLyBzdGFydCBjYXRjaF9zdGFydHVwX2V4Y2VwdGlvbl9yZWdpc3RyeS5jcHAK KworI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFX0VYQ0VQVElPTlMpCituYW1lc3Bh Y2UgQ2F0Y2ggewordm9pZCBTdGFydHVwRXhjZXB0aW9uUmVnaXN0cnk6OmFkZCggc3RkOjpleGNl cHRpb25fcHRyIGNvbnN0JiBleGNlcHRpb24gKSBub2V4Y2VwdCB7CisgICAgICAgIENBVENIX1RS WSB7CisgICAgICAgICAgICBtX2V4Y2VwdGlvbnMucHVzaF9iYWNrKGV4Y2VwdGlvbik7CisgICAg ICAgIH0gQ0FUQ0hfQ0FUQ0hfQUxMIHsKKyAgICAgICAgICAgIC8vIElmIHdlIHJ1biBvdXQgb2Yg bWVtb3J5IGR1cmluZyBzdGFydC11cCB0aGVyZSdzIHJlYWxseSBub3QgYSBsb3QgbW9yZSB3ZSBj YW4gZG8gYWJvdXQgaXQKKyAgICAgICAgICAgIHN0ZDo6dGVybWluYXRlKCk7CisgICAgICAgIH0K KyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmV4Y2VwdGlvbl9wdHI+IGNvbnN0JiBTdGFy dHVwRXhjZXB0aW9uUmVnaXN0cnk6OmdldEV4Y2VwdGlvbnMoKSBjb25zdCBub2V4Y2VwdCB7Cisg ICAgICAgIHJldHVybiBtX2V4Y2VwdGlvbnM7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ug Q2F0Y2gKKyNlbmRpZgorLy8gZW5kIGNhdGNoX3N0YXJ0dXBfZXhjZXB0aW9uX3JlZ2lzdHJ5LmNw cAorLy8gc3RhcnQgY2F0Y2hfc3RyZWFtLmNwcAorCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1 ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNp bmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgQ2F0Y2ggewor CisgICAgQ2F0Y2g6OklTdHJlYW06On5JU3RyZWFtKCkgPSBkZWZhdWx0OworCisgICAgbmFtZXNw YWNlIERldGFpbCB7IG5hbWVzcGFjZSB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFdyaXRl ckYsIHN0ZDo6c2l6ZV90IGJ1ZmZlclNpemU9MjU2PgorICAgICAgICBjbGFzcyBTdHJlYW1CdWZJ bXBsIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmIHsKKyAgICAgICAgICAgIGNoYXIgZGF0YVtidWZm ZXJTaXplXTsKKyAgICAgICAgICAgIFdyaXRlckYgbV93cml0ZXI7CisKKyAgICAgICAgcHVibGlj OgorICAgICAgICAgICAgU3RyZWFtQnVmSW1wbCgpIHsKKyAgICAgICAgICAgICAgICBzZXRwKCBk YXRhLCBkYXRhICsgc2l6ZW9mKGRhdGEpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg IH5TdHJlYW1CdWZJbXBsKCkgbm9leGNlcHQgeworICAgICAgICAgICAgICAgIFN0cmVhbUJ1Zklt cGw6OnN5bmMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAg ICAgaW50IG92ZXJmbG93KCBpbnQgYyApIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBzeW5j KCk7CisKKyAgICAgICAgICAgICAgICBpZiggYyAhPSBFT0YgKSB7CisgICAgICAgICAgICAgICAg ICAgIGlmKCBwYmFzZSgpID09IGVwcHRyKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgbV93 cml0ZXIoIHN0ZDo6c3RyaW5nKCAxLCBzdGF0aWNfY2FzdDxjaGFyPiggYyApICkgKTsKKyAgICAg ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3B1dGMoIHN0YXRp Y19jYXN0PGNoYXI+KCBjICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg cmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBzeW5jKCkgb3ZlcnJp ZGUgeworICAgICAgICAgICAgICAgIGlmKCBwYmFzZSgpICE9IHBwdHIoKSApIHsKKyAgICAgICAg ICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCBwYmFzZSgpLCBzdGF0aWNfY2FzdDxz dGQ6OnN0cmluZzo6c2l6ZV90eXBlPiggcHB0cigpIC0gcGJhc2UoKSApICkgKTsKKyAgICAgICAg ICAgICAgICAgICAgc2V0cCggcGJhc2UoKSwgZXBwdHIoKSApOworICAgICAgICAgICAgICAgIH0K KyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKwor ICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBzdHJ1Y3QgT3V0cHV0RGVidWdX cml0ZXIgeworCisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yKCkoIHN0ZDo6c3RyaW5nIGNvbnN0 JnN0ciApIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRvRGVidWdDb25zb2xlKCBzdHIgKTsKKyAg ICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwor ICAgICAgICBjbGFzcyBGaWxlU3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICAgICAg bXV0YWJsZSBzdGQ6Om9mc3RyZWFtIG1fb2ZzOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAg ICBGaWxlU3RyZWFtKCBTdHJpbmdSZWYgZmlsZW5hbWUgKSB7CisgICAgICAgICAgICAgICAgbV9v ZnMub3BlbiggZmlsZW5hbWUuY19zdHIoKSApOworICAgICAgICAgICAgICAgIENBVENIX0VORk9S Q0UoICFtX29mcy5mYWlsKCksICJVbmFibGUgdG8gb3BlbiBmaWxlOiAnIiA8PCBmaWxlbmFtZSA8 PCAiJyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH5GaWxlU3RyZWFtKCkgb3ZlcnJp ZGUgPSBkZWZhdWx0OworICAgICAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgICAgIHN0 ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJl dHVybiBtX29mczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8KKworICAgICAgICBjbGFzcyBDb3V0U3RyZWFtIDogcHVibGljIElTdHJlYW0g eworICAgICAgICAgICAgbXV0YWJsZSBzdGQ6Om9zdHJlYW0gbV9vczsKKyAgICAgICAgcHVibGlj OgorICAgICAgICAgICAgLy8gU3RvcmUgdGhlIHN0cmVhbWJ1ZiBmcm9tIGNvdXQgdXAtZnJvbnQg YmVjYXVzZQorICAgICAgICAgICAgLy8gY291dCBtYXkgZ2V0IHJlZGlyZWN0ZWQgd2hlbiBydW5u aW5nIHRlc3RzCisgICAgICAgICAgICBDb3V0U3RyZWFtKCkgOiBtX29zKCBDYXRjaDo6Y291dCgp LnJkYnVmKCkgKSB7fQorICAgICAgICAgICAgfkNvdXRTdHJlYW0oKSBvdmVycmlkZSA9IGRlZmF1 bHQ7CisKKyAgICAgICAgcHVibGljOiAvLyBJU3RyZWFtCisgICAgICAgICAgICBzdGQ6Om9zdHJl YW0mIHN0cmVhbSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fb3M7IH0KKyAgICAgICAgfTsK KworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBjbGFzcyBEZWJ1Z091dFN0 cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdHJl YW1CdWZJbXBsPE91dHB1dERlYnVnV3JpdGVyPj4gbV9zdHJlYW1CdWY7CisgICAgICAgICAgICBt dXRhYmxlIHN0ZDo6b3N0cmVhbSBtX29zOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBE ZWJ1Z091dFN0cmVhbSgpCisgICAgICAgICAgICA6ICAgbV9zdHJlYW1CdWYoIG5ldyBTdHJlYW1C dWZJbXBsPE91dHB1dERlYnVnV3JpdGVyPigpICksCisgICAgICAgICAgICAgICAgbV9vcyggbV9z dHJlYW1CdWYuZ2V0KCkgKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgfkRlYnVnT3V0 U3RyZWFtKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgICAgIHB1YmxpYzogLy8gSVN0cmVh bQorICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBvdmVycmlkZSB7IHJl dHVybiBtX29zOyB9CisgICAgICAgIH07CisKKyAgICB9fSAvLyBuYW1lc3BhY2UgYW5vbjo6ZGV0 YWlsCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGF1dG8gbWFrZVN0cmVhbSggU3Ry aW5nUmVmIGNvbnN0ICZmaWxlbmFtZSApIC0+IElTdHJlYW0gY29uc3QqIHsKKyAgICAgICAgaWYo IGZpbGVuYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXRhaWw6OkNvdXRT dHJlYW0oKTsKKyAgICAgICAgZWxzZSBpZiggZmlsZW5hbWVbMF0gPT0gJyUnICkgeworICAgICAg ICAgICAgaWYoIGZpbGVuYW1lID09ICIlZGVidWciICkKKyAgICAgICAgICAgICAgICByZXR1cm4g bmV3IERldGFpbDo6RGVidWdPdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg ICAgICAgICBDQVRDSF9FUlJPUiggIlVucmVjb2duaXNlZCBzdHJlYW06ICciIDw8IGZpbGVuYW1l IDw8ICInIiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBu ZXcgRGV0YWlsOjpGaWxlU3RyZWFtKCBmaWxlbmFtZSApOworICAgIH0KKworICAgIC8vIFRoaXMg Y2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBpZGVhIG9mIGEgcG9vbCBvZiBvc3RyaW5nc3RyZWFtcyB0 aGF0IGNhbiBiZSByZXVzZWQuCisgICAgc3RydWN0IFN0cmluZ1N0cmVhbXMgeworICAgICAgICBz dGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpvc3RyaW5nc3RyZWFtPj4gbV9zdHJlYW1z OworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gbV91bnVzZWQ7CisgICAgICAgIHN0 ZDo6b3N0cmluZ3N0cmVhbSBtX3JlZmVyZW5jZVN0cmVhbTsgLy8gVXNlZCBmb3IgY29weSBzdGF0 ZS8gZmxhZ3MgZnJvbQorCisgICAgICAgIGF1dG8gYWRkKCkgLT4gc3RkOjpzaXplX3QgeworICAg ICAgICAgICAgaWYoIG1fdW51c2VkLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV9zdHJl YW1zLnB1c2hfYmFjayggc3RkOjp1bmlxdWVfcHRyPHN0ZDo6b3N0cmluZ3N0cmVhbT4oIG5ldyBz dGQ6Om9zdHJpbmdzdHJlYW0gKSApOworICAgICAgICAgICAgICAgIHJldHVybiBtX3N0cmVhbXMu c2l6ZSgpLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg ICAgICBhdXRvIGluZGV4ID0gbV91bnVzZWQuYmFjaygpOworICAgICAgICAgICAgICAgIG1fdW51 c2VkLnBvcF9iYWNrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICAg ICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZWxlYXNlKCBzdGQ6OnNpemVfdCBpbmRl eCApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtc1tpbmRleF0tPmNvcHlmbXQoIG1fcmVmZXJlbmNl U3RyZWFtICk7IC8vIFJlc3RvcmUgaW5pdGlhbCBmbGFncyBhbmQgb3RoZXIgc3RhdGUKKyAgICAg ICAgICAgIG1fdW51c2VkLnB1c2hfYmFjayhpbmRleCk7CisgICAgICAgIH0KKyAgICB9OworCisg ICAgUmV1c2FibGVTdHJpbmdTdHJlYW06OlJldXNhYmxlU3RyaW5nU3RyZWFtKCkKKyAgICA6ICAg bV9pbmRleCggU2luZ2xldG9uPFN0cmluZ1N0cmVhbXM+OjpnZXRNdXRhYmxlKCkuYWRkKCkgKSwK KyAgICAgICAgbV9vc3MoIFNpbmdsZXRvbjxTdHJpbmdTdHJlYW1zPjo6Z2V0TXV0YWJsZSgpLm1f c3RyZWFtc1ttX2luZGV4XS5nZXQoKSApCisgICAge30KKworICAgIFJldXNhYmxlU3RyaW5nU3Ry ZWFtOjp+UmV1c2FibGVTdHJpbmdTdHJlYW0oKSB7CisgICAgICAgIHN0YXRpY19jYXN0PHN0ZDo6 b3N0cmluZ3N0cmVhbSo+KCBtX29zcyApLT5zdHIoIiIpOworICAgICAgICBtX29zcy0+Y2xlYXIo KTsKKyAgICAgICAgU2luZ2xldG9uPFN0cmluZ1N0cmVhbXM+OjpnZXRNdXRhYmxlKCkucmVsZWFz ZSggbV9pbmRleCApOworICAgIH0KKworICAgIGF1dG8gUmV1c2FibGVTdHJpbmdTdHJlYW06OnN0 cigpIGNvbnN0IC0+IHN0ZDo6c3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0 ZDo6b3N0cmluZ3N0cmVhbSo+KCBtX29zcyApLT5zdHIoKTsKKyAgICB9CisKKyAgICAvLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8KKworI2lmbmRlZiBDQVRDSF9DT05GSUdfTk9TVERPVVQgLy8gSWYgeW91ICNk ZWZpbmUgdGhpcyB5b3UgbXVzdCBpbXBsZW1lbnQgdGhlc2UgZnVuY3Rpb25zCisgICAgc3RkOjpv c3RyZWFtJiBjb3V0KCkgeyByZXR1cm4gc3RkOjpjb3V0OyB9CisgICAgc3RkOjpvc3RyZWFtJiBj ZXJyKCkgeyByZXR1cm4gc3RkOjpjZXJyOyB9CisgICAgc3RkOjpvc3RyZWFtJiBjbG9nKCkgeyBy ZXR1cm4gc3RkOjpjbG9nOyB9CisjZW5kaWYKK30KKy8vIGVuZCBjYXRjaF9zdHJlYW0uY3BwCisv LyBzdGFydCBjYXRjaF9zdHJpbmdfbWFuaXAuY3BwCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+Cisj aW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNjdHlwZT4K KyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2Ug eworICAgICAgICBjaGFyIHRvTG93ZXJDaChjaGFyIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBz dGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFy PihjKSApICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6 c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICkgeworICAgICAgICBy ZXR1cm4gcy5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJiBzdGQ6OmVxdWFsKHByZWZpeC5iZWdp bigpLCBwcmVmaXguZW5kKCksIHMuYmVnaW4oKSk7CisgICAgfQorICAgIGJvb2wgc3RhcnRzV2l0 aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgcHJlZml4ICkgeworICAgICAgICByZXR1cm4g IXMuZW1wdHkoKSAmJiBzWzBdID09IHByZWZpeDsKKyAgICB9CisgICAgYm9vbCBlbmRzV2l0aCgg c3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdWZmaXggKSB7CisgICAg ICAgIHJldHVybiBzLnNpemUoKSA+PSBzdWZmaXguc2l6ZSgpICYmIHN0ZDo6ZXF1YWwoc3VmZml4 LnJiZWdpbigpLCBzdWZmaXgucmVuZCgpLCBzLnJiZWdpbigpKTsKKyAgICB9CisgICAgYm9vbCBl bmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgc3VmZml4ICkgeworICAgICAgICBy ZXR1cm4gIXMuZW1wdHkoKSAmJiBzW3Muc2l6ZSgpLTFdID09IHN1ZmZpeDsKKyAgICB9CisgICAg Ym9vbCBjb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBp bmZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuZmluZCggaW5maXggKSAhPSBzdGQ6OnN0cmluZzo6 bnBvczsKKyAgICB9CisgICAgdm9pZCB0b0xvd2VySW5QbGFjZSggc3RkOjpzdHJpbmcmIHMgKSB7 CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKCBzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwg dG9Mb3dlckNoICk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvTG93ZXIoIHN0ZDo6c3RyaW5n IGNvbnN0JiBzICkgeworICAgICAgICBzdGQ6OnN0cmluZyBsYyA9IHM7CisgICAgICAgIHRvTG93 ZXJJblBsYWNlKCBsYyApOworICAgICAgICByZXR1cm4gbGM7CisgICAgfQorICAgIHN0ZDo6c3Ry aW5nIHRyaW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSB7CisgICAgICAgIHN0YXRpYyBjaGFy IGNvbnN0KiB3aGl0ZXNwYWNlQ2hhcnMgPSAiXG5cclx0ICI7CisgICAgICAgIHN0ZDo6c3RyaW5n OjpzaXplX3R5cGUgc3RhcnQgPSBzdHIuZmluZF9maXJzdF9ub3Rfb2YoIHdoaXRlc3BhY2VDaGFy cyApOworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGVuZCA9IHN0ci5maW5kX2xhc3Rf bm90X29mKCB3aGl0ZXNwYWNlQ2hhcnMgKTsKKworICAgICAgICByZXR1cm4gc3RhcnQgIT0gc3Rk OjpzdHJpbmc6Om5wb3MgPyBzdHIuc3Vic3RyKCBzdGFydCwgMStlbmQtc3RhcnQgKSA6IHN0ZDo6 c3RyaW5nKCk7CisgICAgfQorCisgICAgU3RyaW5nUmVmIHRyaW0oU3RyaW5nUmVmIHJlZikgewor ICAgICAgICBjb25zdCBhdXRvIGlzX3dzID0gW10oY2hhciBjKSB7CisgICAgICAgICAgICByZXR1 cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccic7CisgICAg ICAgIH07CisgICAgICAgIHNpemVfdCByZWFsX2JlZ2luID0gMDsKKyAgICAgICAgd2hpbGUgKHJl YWxfYmVnaW4gPCByZWYuc2l6ZSgpICYmIGlzX3dzKHJlZltyZWFsX2JlZ2luXSkpIHsgKytyZWFs X2JlZ2luOyB9CisgICAgICAgIHNpemVfdCByZWFsX2VuZCA9IHJlZi5zaXplKCk7CisgICAgICAg IHdoaWxlIChyZWFsX2VuZCA+IHJlYWxfYmVnaW4gJiYgaXNfd3MocmVmW3JlYWxfZW5kIC0gMV0p KSB7IC0tcmVhbF9lbmQ7IH0KKworICAgICAgICByZXR1cm4gcmVmLnN1YnN0cihyZWFsX2JlZ2lu LCByZWFsX2VuZCAtIHJlYWxfYmVnaW4pOworICAgIH0KKworICAgIGJvb2wgcmVwbGFjZUluUGxh Y2UoIHN0ZDo6c3RyaW5nJiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBsYWNlVGhpcywgc3Rk OjpzdHJpbmcgY29uc3QmIHdpdGhUaGlzICkgeworICAgICAgICBib29sIHJlcGxhY2VkID0gZmFs c2U7CisgICAgICAgIHN0ZDo6c2l6ZV90IGkgPSBzdHIuZmluZCggcmVwbGFjZVRoaXMgKTsKKyAg ICAgICAgd2hpbGUoIGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICByZXBs YWNlZCA9IHRydWU7CisgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKCAwLCBpICkgKyB3aXRo VGhpcyArIHN0ci5zdWJzdHIoIGkrcmVwbGFjZVRoaXMuc2l6ZSgpICk7CisgICAgICAgICAgICBp ZiggaSA8IHN0ci5zaXplKCktd2l0aFRoaXMuc2l6ZSgpICkKKyAgICAgICAgICAgICAgICBpID0g c3RyLmZpbmQoIHJlcGxhY2VUaGlzLCBpK3dpdGhUaGlzLnNpemUoKSApOworICAgICAgICAgICAg ZWxzZQorICAgICAgICAgICAgICAgIGkgPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgfQor ICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8U3RyaW5n UmVmPiBzcGxpdFN0cmluZ1JlZiggU3RyaW5nUmVmIHN0ciwgY2hhciBkZWxpbWl0ZXIgKSB7Cisg ICAgICAgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gc3ViU3RyaW5nczsKKyAgICAgICAgc3RkOjpz aXplX3Qgc3RhcnQgPSAwOworICAgICAgICBmb3Ioc3RkOjpzaXplX3QgcG9zID0gMDsgcG9zIDwg c3RyLnNpemUoKTsgKytwb3MgKSB7CisgICAgICAgICAgICBpZiggc3RyW3Bvc10gPT0gZGVsaW1p dGVyICkgeworICAgICAgICAgICAgICAgIGlmKCBwb3MgLSBzdGFydCA+IDEgKQorICAgICAgICAg ICAgICAgICAgICBzdWJTdHJpbmdzLnB1c2hfYmFjayggc3RyLnN1YnN0ciggc3RhcnQsIHBvcy1z dGFydCApICk7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBwb3MrMTsKKyAgICAgICAgICAgIH0K KyAgICAgICAgfQorICAgICAgICBpZiggc3RhcnQgPCBzdHIuc2l6ZSgpICkKKyAgICAgICAgICAg IHN1YlN0cmluZ3MucHVzaF9iYWNrKCBzdHIuc3Vic3RyKCBzdGFydCwgc3RyLnNpemUoKS1zdGFy dCApICk7CisgICAgICAgIHJldHVybiBzdWJTdHJpbmdzOworICAgIH0KKworICAgIHBsdXJhbGlz ZTo6cGx1cmFsaXNlKCBzdGQ6OnNpemVfdCBjb3VudCwgc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVs ICkKKyAgICA6ICAgbV9jb3VudCggY291bnQgKSwKKyAgICAgICAgbV9sYWJlbCggbGFiZWwgKQor ICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBv cywgcGx1cmFsaXNlIGNvbnN0JiBwbHVyYWxpc2VyICkgeworICAgICAgICBvcyA8PCBwbHVyYWxp c2VyLm1fY291bnQgPDwgJyAnIDw8IHBsdXJhbGlzZXIubV9sYWJlbDsKKyAgICAgICAgaWYoIHBs dXJhbGlzZXIubV9jb3VudCAhPSAxICkKKyAgICAgICAgICAgIG9zIDw8ICdzJzsKKyAgICAgICAg cmV0dXJuIG9zOworICAgIH0KKworfQorLy8gZW5kIGNhdGNoX3N0cmluZ19tYW5pcC5jcHAKKy8v IHN0YXJ0IGNhdGNoX3N0cmluZ3JlZi5jcHAKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNs dWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGludD4KKwor bmFtZXNwYWNlIENhdGNoIHsKKyAgICBTdHJpbmdSZWY6OlN0cmluZ1JlZiggY2hhciBjb25zdCog cmF3Q2hhcnMgKSBub2V4Y2VwdAorICAgIDogU3RyaW5nUmVmKCByYXdDaGFycywgc3RhdGljX2Nh c3Q8U3RyaW5nUmVmOjpzaXplX3R5cGU+KHN0ZDo6c3RybGVuKHJhd0NoYXJzKSApICkKKyAgICB7 fQorCisgICAgYXV0byBTdHJpbmdSZWY6OmNfc3RyKCkgY29uc3QgLT4gY2hhciBjb25zdCogewor ICAgICAgICBDQVRDSF9FTkZPUkNFKGlzTnVsbFRlcm1pbmF0ZWQoKSwgIkNhbGxlZCBTdHJpbmdS ZWY6OmNfc3RyKCkgb24gYSBub24tbnVsbC10ZXJtaW5hdGVkIGluc3RhbmNlIik7CisgICAgICAg IHJldHVybiBtX3N0YXJ0OworICAgIH0KKyAgICBhdXRvIFN0cmluZ1JlZjo6ZGF0YSgpIGNvbnN0 IG5vZXhjZXB0IC0+IGNoYXIgY29uc3QqIHsKKyAgICAgICAgcmV0dXJuIG1fc3RhcnQ7CisgICAg fQorCisgICAgYXV0byBTdHJpbmdSZWY6OnN1YnN0ciggc2l6ZV90eXBlIHN0YXJ0LCBzaXplX3R5 cGUgc2l6ZSApIGNvbnN0IG5vZXhjZXB0IC0+IFN0cmluZ1JlZiB7CisgICAgICAgIGlmIChzdGFy dCA8IG1fc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1JlZihtX3N0YXJ0ICsgc3Rh cnQsIChzdGQ6Om1pbikobV9zaXplIC0gc3RhcnQsIHNpemUpKTsKKyAgICAgICAgfSBlbHNlIHsK KyAgICAgICAgICAgIHJldHVybiBTdHJpbmdSZWYoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBh dXRvIFN0cmluZ1JlZjo6b3BlcmF0b3IgPT0gKCBTdHJpbmdSZWYgY29uc3QmIG90aGVyICkgY29u c3Qgbm9leGNlcHQgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiBtX3NpemUgPT0gb3RoZXIubV9z aXplCisgICAgICAgICAgICAmJiAoc3RkOjptZW1jbXAoIG1fc3RhcnQsIG90aGVyLm1fc3RhcnQs IG1fc2l6ZSApID09IDApOworICAgIH0KKworICAgIGF1dG8gb3BlcmF0b3IgPDwgKCBzdGQ6Om9z dHJlYW0mIG9zLCBTdHJpbmdSZWYgY29uc3QmIHN0ciApIC0+IHN0ZDo6b3N0cmVhbSYgeworICAg ICAgICByZXR1cm4gb3Mud3JpdGUoc3RyLmRhdGEoKSwgc3RyLnNpemUoKSk7CisgICAgfQorCisg ICAgYXV0byBvcGVyYXRvcis9KCBzdGQ6OnN0cmluZyYgbGhzLCBTdHJpbmdSZWYgY29uc3QmIHJo cyApIC0+IHN0ZDo6c3RyaW5nJiB7CisgICAgICAgIGxocy5hcHBlbmQocmhzLmRhdGEoKSwgcmhz LnNpemUoKSk7CisgICAgICAgIHJldHVybiBsaHM7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBD YXRjaAorLy8gZW5kIGNhdGNoX3N0cmluZ3JlZi5jcHAKKy8vIHN0YXJ0IGNhdGNoX3RhZ19hbGlh cy5jcHAKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBUYWdBbGlhczo6VGFnQWxpYXMoc3RkOjpz dHJpbmcgY29uc3QgJiBfdGFnLCBTb3VyY2VMaW5lSW5mbyBfbGluZUluZm8pOiB0YWcoX3RhZyks IGxpbmVJbmZvKF9saW5lSW5mbykge30KK30KKy8vIGVuZCBjYXRjaF90YWdfYWxpYXMuY3BwCisv LyBzdGFydCBjYXRjaF90YWdfYWxpYXNfYXV0b3JlZ2lzdHJhci5jcHAKKworbmFtZXNwYWNlIENh dGNoIHsKKworICAgIFJlZ2lzdHJhckZvclRhZ0FsaWFzZXM6OlJlZ2lzdHJhckZvclRhZ0FsaWFz ZXMoY2hhciBjb25zdCogYWxpYXMsIGNoYXIgY29uc3QqIHRhZywgU291cmNlTGluZUluZm8gY29u c3QmIGxpbmVJbmZvKSB7CisgICAgICAgIENBVENIX1RSWSB7CisgICAgICAgICAgICBnZXRNdXRh YmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRhZ0FsaWFzKGFsaWFzLCB0YWcsIGxpbmVJbmZvKTsK KyAgICAgICAgfSBDQVRDSF9DQVRDSF9BTEwgeworICAgICAgICAgICAgLy8gRG8gbm90IHRocm93 IHdoZW4gY29uc3RydWN0aW5nIGdsb2JhbCBvYmplY3RzLCBpbnN0ZWFkIHJlZ2lzdGVyIHRoZSBl eGNlcHRpb24gdG8gYmUgcHJvY2Vzc2VkIGxhdGVyCisgICAgICAgICAgICBnZXRNdXRhYmxlUmVn aXN0cnlIdWIoKS5yZWdpc3RlclN0YXJ0dXBFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0K KworfQorLy8gZW5kIGNhdGNoX3RhZ19hbGlhc19hdXRvcmVnaXN0cmFyLmNwcAorLy8gc3RhcnQg Y2F0Y2hfdGFnX2FsaWFzX3JlZ2lzdHJ5LmNwcAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFt ZXNwYWNlIENhdGNoIHsKKworICAgIFRhZ0FsaWFzUmVnaXN0cnk6On5UYWdBbGlhc1JlZ2lzdHJ5 KCkge30KKworICAgIFRhZ0FsaWFzIGNvbnN0KiBUYWdBbGlhc1JlZ2lzdHJ5OjpmaW5kKCBzdGQ6 OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtX3JlZ2lz dHJ5LmZpbmQoIGFsaWFzICk7CisgICAgICAgIGlmKCBpdCAhPSBtX3JlZ2lzdHJ5LmVuZCgpICkK KyAgICAgICAgICAgIHJldHVybiAmKGl0LT5zZWNvbmQpOworICAgICAgICBlbHNlCisgICAgICAg ICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBUYWdBbGlhc1Jl Z2lzdHJ5OjpleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RT cGVjICkgY29uc3QgeworICAgICAgICBzdGQ6OnN0cmluZyBleHBhbmRlZFRlc3RTcGVjID0gdW5l eHBhbmRlZFRlc3RTcGVjOworICAgICAgICBmb3IoIGF1dG8gY29uc3QmIHJlZ2lzdHJ5S3ZwIDog bV9yZWdpc3RyeSApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IGV4cGFuZGVkVGVz dFNwZWMuZmluZCggcmVnaXN0cnlLdnAuZmlyc3QgKTsKKyAgICAgICAgICAgIGlmKCBwb3MgIT0g c3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgZXhwYW5kZWRUZXN0U3BlYyA9 ICBleHBhbmRlZFRlc3RTcGVjLnN1YnN0ciggMCwgcG9zICkgKworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVnaXN0cnlLdnAuc2Vjb25kLnRhZyArCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZFRlc3RTcGVjLnN1YnN0ciggcG9zICsgcmVn aXN0cnlLdnAuZmlyc3Quc2l6ZSgpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg ICAgcmV0dXJuIGV4cGFuZGVkVGVzdFNwZWM7CisgICAgfQorCisgICAgdm9pZCBUYWdBbGlhc1Jl Z2lzdHJ5OjphZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3Qm IHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworICAgICAgICBDQVRDSF9F TkZPUkNFKCBzdGFydHNXaXRoKGFsaWFzLCAiW0AiKSAmJiBlbmRzV2l0aChhbGlhcywgJ10nKSwK KyAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6IHRhZyBhbGlhcywgJyIgPDwgYWxpYXMgPDwg IicgaXMgbm90IG9mIHRoZSBmb3JtIFtAYWxpYXMgbmFtZV0uXG4iIDw8IGxpbmVJbmZvICk7CisK KyAgICAgICAgQ0FUQ0hfRU5GT1JDRSggbV9yZWdpc3RyeS5pbnNlcnQoc3RkOjptYWtlX3BhaXIo YWxpYXMsIFRhZ0FsaWFzKHRhZywgbGluZUluZm8pKSkuc2Vjb25kLAorICAgICAgICAgICAgICAg ICAgICAgICJlcnJvcjogdGFnIGFsaWFzLCAnIiA8PCBhbGlhcyA8PCAiJyBhbHJlYWR5IHJlZ2lz dGVyZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgPDwgIlx0Rmlyc3Qgc2VlbiBhdDogIiA8 PCBmaW5kKGFsaWFzKS0+bGluZUluZm8gPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAgIDw8 ICJcdFJlZGVmaW5lZCBhdDogIiA8PCBsaW5lSW5mbyApOworICAgIH0KKworICAgIElUYWdBbGlh c1JlZ2lzdHJ5Ojp+SVRhZ0FsaWFzUmVnaXN0cnkoKSB7fQorCisgICAgSVRhZ0FsaWFzUmVnaXN0 cnkgY29uc3QmIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSB7CisgICAgICAgIHJldHVybiBnZXRS ZWdpc3RyeUh1YigpLmdldFRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICB9CisKK30gLy8gZW5kIG5h bWVzcGFjZSBDYXRjaAorLy8gZW5kIGNhdGNoX3RhZ19hbGlhc19yZWdpc3RyeS5jcHAKKy8vIHN0 YXJ0IGNhdGNoX3Rlc3RfY2FzZV9pbmZvLmNwcAorCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1 ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4K KworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIFRlc3RDYXNl SW5mbzo6U3BlY2lhbFByb3BlcnRpZXMgcGFyc2VTcGVjaWFsVGFnKCBzdGQ6OnN0cmluZyBjb25z dCYgdGFnICkgeworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRhZywgJy4nICkgfHwKKyAg ICAgICAgICAgICAgICB0YWcgPT0gIiFoaWRlIiApCisgICAgICAgICAgICAgICAgcmV0dXJuIFRl c3RDYXNlSW5mbzo6SXNIaWRkZW47CisgICAgICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiF0aHJv d3MiICkKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpUaHJvd3M7CisgICAg ICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFzaG91bGRmYWlsIiApCisgICAgICAgICAgICAgICAg cmV0dXJuIFRlc3RDYXNlSW5mbzo6U2hvdWxkRmFpbDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHRh ZyA9PSAiIW1heWZhaWwiICkKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpN YXlGYWlsOworICAgICAgICAgICAgZWxzZSBpZiggdGFnID09ICIhbm9ucG9ydGFibGUiICkKKyAg ICAgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpOb25Qb3J0YWJsZTsKKyAgICAgICAg ICAgIGVsc2UgaWYoIHRhZyA9PSAiIWJlbmNobWFyayIgKQorICAgICAgICAgICAgICAgIHJldHVy biBzdGF0aWNfY2FzdDxUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzPiggVGVzdENhc2VJ bmZvOjpCZW5jaG1hcmsgfCBUZXN0Q2FzZUluZm86OklzSGlkZGVuICk7CisgICAgICAgICAgICBl bHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6Tm9uZTsKKyAgICAgICAg fQorICAgICAgICBib29sIGlzUmVzZXJ2ZWRUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSB7 CisgICAgICAgICAgICByZXR1cm4gcGFyc2VTcGVjaWFsVGFnKCB0YWcgKSA9PSBUZXN0Q2FzZUlu Zm86Ok5vbmUgJiYgdGFnLnNpemUoKSA+IDAgJiYgIXN0ZDo6aXNhbG51bSggc3RhdGljX2Nhc3Q8 dW5zaWduZWQgY2hhcj4odGFnWzBdKSApOworICAgICAgICB9CisgICAgICAgIHZvaWQgZW5mb3Jj ZU5vdFJlc2VydmVkVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBj b25zdCYgX2xpbmVJbmZvICkgeworICAgICAgICAgICAgQ0FUQ0hfRU5GT1JDRSggIWlzUmVzZXJ2 ZWRUYWcodGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhZyBuYW1lOiBbIiA8PCB0 YWcgPDwgIl0gaXMgbm90IGFsbG93ZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8 ICJUYWcgbmFtZXMgc3RhcnRpbmcgd2l0aCBub24gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJl IHJlc2VydmVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IF9saW5lSW5mbyApOwor ICAgICAgICB9CisgICAgfQorCisgICAgVGVzdENhc2UgbWFrZVRlc3RDYXNlKCAgSVRlc3RJbnZv a2VyKiBfdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcg Y29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUFuZFRh Z3MgY29uc3QmIG5hbWVBbmRUYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJj ZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKQorICAgIHsKKyAgICAgICAgYm9vbCBpc0hpZGRl biA9IGZhbHNlOworCisgICAgICAgIC8vIFBhcnNlIG91dCB0YWdzCisgICAgICAgIHN0ZDo6dmVj dG9yPHN0ZDo6c3RyaW5nPiB0YWdzOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjLCB0YWc7Cisg ICAgICAgIGJvb2wgaW5UYWcgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjaGFyIGMgOiBuYW1lQW5k VGFncy50YWdzKSB7CisgICAgICAgICAgICBpZiggIWluVGFnICkgeworICAgICAgICAgICAgICAg IGlmKCBjID09ICdbJyApCisgICAgICAgICAgICAgICAgICAgIGluVGFnID0gdHJ1ZTsKKyAgICAg ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRlc2MgKz0gYzsKKyAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCBjID09ICddJyAp IHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcyBw cm9wID0gcGFyc2VTcGVjaWFsVGFnKCB0YWcgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoICgg cHJvcCAmIFRlc3RDYXNlSW5mbzo6SXNIaWRkZW4gKSAhPSAwICkKKyAgICAgICAgICAgICAgICAg ICAgICAgIGlzSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcHJv cCA9PSBUZXN0Q2FzZUluZm86Ok5vbmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3Jj ZU5vdFJlc2VydmVkVGFnKCB0YWcsIF9saW5lSW5mbyApOworCisgICAgICAgICAgICAgICAgICAg IC8vIE1lcmdlZCBoaWRlIHRhZ3MgbGlrZSBgWy5hcHByb3ZhbHNdYCBzaG91bGQgYmUgYWRkZWQg YXMKKyAgICAgICAgICAgICAgICAgICAgLy8gYFsuXVthcHByb3ZhbHNdYC4gVGhlIGBbLl1gIGlz IGFkZGVkIGF0IGxhdGVyIHBvaW50LCBzbworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5 IHN0cmlwIHRoZSBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0c1dpdGgodGFn LCAnLicpICYmIHRhZy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWcu ZXJhc2UoMCwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg dGFncy5wdXNoX2JhY2soIHRhZyApOworICAgICAgICAgICAgICAgICAgICB0YWcuY2xlYXIoKTsK KyAgICAgICAgICAgICAgICAgICAgaW5UYWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9Cisg ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0YWcgKz0gYzsKKyAgICAg ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggaXNIaWRkZW4gKSB7CisgICAgICAgICAg ICAvLyBBZGQgYWxsICJoaWRkZW4iIHRhZ3MgdG8gbWFrZSB0aGVtIGJlaGF2ZSBpZGVudGljYWxs eQorICAgICAgICAgICAgdGFncy5pbnNlcnQoIHRhZ3MuZW5kKCksIHsgIi4iLCAiIWhpZGUiIH0g KTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RDYXNlSW5mbyBpbmZvKCBzdGF0aWNfY2FzdDxz dGQ6OnN0cmluZz4obmFtZUFuZFRhZ3MubmFtZSksIF9jbGFzc05hbWUsIGRlc2MsIHRhZ3MsIF9s aW5lSW5mbyApOworICAgICAgICByZXR1cm4gVGVzdENhc2UoIF90ZXN0Q2FzZSwgc3RkOjptb3Zl KGluZm8pICk7CisgICAgfQorCisgICAgdm9pZCBzZXRUYWdzKCBUZXN0Q2FzZUluZm8mIHRlc3RD YXNlSW5mbywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRhZ3MgKSB7CisgICAgICAgIHN0ZDo6 c29ydChiZWdpbih0YWdzKSwgZW5kKHRhZ3MpKTsKKyAgICAgICAgdGFncy5lcmFzZShzdGQ6OnVu aXF1ZShiZWdpbih0YWdzKSwgZW5kKHRhZ3MpKSwgZW5kKHRhZ3MpKTsKKyAgICAgICAgdGVzdENh c2VJbmZvLmxjYXNlVGFncy5jbGVhcigpOworCisgICAgICAgIGZvciggYXV0byBjb25zdCYgdGFn IDogdGFncyApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxjYXNlVGFnID0gdG9Mb3dlcigg dGFnICk7CisgICAgICAgICAgICB0ZXN0Q2FzZUluZm8ucHJvcGVydGllcyA9IHN0YXRpY19jYXN0 PFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXM+KCB0ZXN0Q2FzZUluZm8ucHJvcGVydGll cyB8IHBhcnNlU3BlY2lhbFRhZyggbGNhc2VUYWcgKSApOworICAgICAgICAgICAgdGVzdENhc2VJ bmZvLmxjYXNlVGFncy5wdXNoX2JhY2soIGxjYXNlVGFnICk7CisgICAgICAgIH0KKyAgICAgICAg dGVzdENhc2VJbmZvLnRhZ3MgPSBzdGQ6Om1vdmUodGFncyk7CisgICAgfQorCisgICAgVGVzdENh c2VJbmZvOjpUZXN0Q2FzZUluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3Jp cHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6 c3RyaW5nPiBjb25zdCYgX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNv dXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKQorICAgIDogICBuYW1lKCBfbmFtZSApLAor ICAgICAgICBjbGFzc05hbWUoIF9jbGFzc05hbWUgKSwKKyAgICAgICAgZGVzY3JpcHRpb24oIF9k ZXNjcmlwdGlvbiApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIHBy b3BlcnRpZXMoIE5vbmUgKQorICAgIHsKKyAgICAgICAgc2V0VGFncyggKnRoaXMsIF90YWdzICk7 CisgICAgfQorCisgICAgYm9vbCBUZXN0Q2FzZUluZm86OmlzSGlkZGVuKCkgY29uc3QgeworICAg ICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgSXNIaWRkZW4gKSAhPSAwOworICAgIH0KKyAgICBi b29sIFRlc3RDYXNlSW5mbzo6dGhyb3dzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9w ZXJ0aWVzICYgVGhyb3dzICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86Om9r VG9GYWlsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgKFNob3VsZEZh aWwgfCBNYXlGYWlsICkgKSAhPSAwOworICAgIH0KKyAgICBib29sIFRlc3RDYXNlSW5mbzo6ZXhw ZWN0ZWRUb0ZhaWwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiAoU2hv dWxkRmFpbCApICkgIT0gMDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBUZXN0Q2FzZUluZm86 OnRhZ3NBc1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmV0OworICAgICAg ICAvLyAnWycgYW5kICddJyBwZXIgdGFnCisgICAgICAgIHN0ZDo6c2l6ZV90IGZ1bGxfc2l6ZSA9 IDIgKiB0YWdzLnNpemUoKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0YWcgOiB0YWdzKSB7 CisgICAgICAgICAgICBmdWxsX3NpemUgKz0gdGFnLnNpemUoKTsKKyAgICAgICAgfQorICAgICAg ICByZXQucmVzZXJ2ZShmdWxsX3NpemUpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRhZyA6 IHRhZ3MpIHsKKyAgICAgICAgICAgIHJldC5wdXNoX2JhY2soJ1snKTsKKyAgICAgICAgICAgIHJl dC5hcHBlbmQodGFnKTsKKyAgICAgICAgICAgIHJldC5wdXNoX2JhY2soJ10nKTsKKyAgICAgICAg fQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgVGVzdENhc2U6OlRlc3RDYXNl KCBJVGVzdEludm9rZXIqIHRlc3RDYXNlLCBUZXN0Q2FzZUluZm8mJiBpbmZvICkgOiBUZXN0Q2Fz ZUluZm8oIHN0ZDo6bW92ZShpbmZvKSApLCB0ZXN0KCB0ZXN0Q2FzZSApIHt9CisKKyAgICBUZXN0 Q2FzZSBUZXN0Q2FzZTo6d2l0aE5hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmV3TmFtZSApIGNv bnN0IHsKKyAgICAgICAgVGVzdENhc2Ugb3RoZXIoICp0aGlzICk7CisgICAgICAgIG90aGVyLm5h bWUgPSBfbmV3TmFtZTsKKyAgICAgICAgcmV0dXJuIG90aGVyOworICAgIH0KKworICAgIHZvaWQg VGVzdENhc2U6Omludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgdGVzdC0+aW52b2tlKCk7CisgICAg fQorCisgICAgYm9vbCBUZXN0Q2FzZTo6b3BlcmF0b3IgPT0gKCBUZXN0Q2FzZSBjb25zdCYgb3Ro ZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiAgdGVzdC5nZXQoKSA9PSBvdGhlci50ZXN0Lmdl dCgpICYmCisgICAgICAgICAgICAgICAgbmFtZSA9PSBvdGhlci5uYW1lICYmCisgICAgICAgICAg ICAgICAgY2xhc3NOYW1lID09IG90aGVyLmNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBib29sIFRl c3RDYXNlOjpvcGVyYXRvciA8ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAg ICAgICByZXR1cm4gbmFtZSA8IG90aGVyLm5hbWU7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZv IGNvbnN0JiBUZXN0Q2FzZTo6Z2V0VGVzdENhc2VJbmZvKCkgY29uc3QKKyAgICB7CisgICAgICAg IHJldHVybiAqdGhpczsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorLy8gZW5k IGNhdGNoX3Rlc3RfY2FzZV9pbmZvLmNwcAorLy8gc3RhcnQgY2F0Y2hfdGVzdF9jYXNlX3JlZ2lz dHJ5X2ltcGwuY3BwCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4K KworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIHN0cnVjdCBU ZXN0SGFzaGVyIHsKKyAgICAgICAgICAgIHVzaW5nIGhhc2hfdCA9IHVpbnQ2NF90OworCisgICAg ICAgICAgICBleHBsaWNpdCBUZXN0SGFzaGVyKCBoYXNoX3QgaGFzaFN1ZmZpeCApOgorICAgICAg ICAgICAgICAgIG1faGFzaFN1ZmZpeHsgaGFzaFN1ZmZpeCB9IHt9CisKKyAgICAgICAgICAgIHVp bnQzMl90IG9wZXJhdG9yKCkoIFRlc3RDYXNlIGNvbnN0JiB0ICkgY29uc3QgeworICAgICAgICAg ICAgICAgIC8vIEZOVi0xYSBoYXNoIHdpdGggbXVsdGlwbGljYXRpb24gZm9sZC4KKyAgICAgICAg ICAgICAgICBjb25zdCBoYXNoX3QgcHJpbWUgPSAxMDk5NTExNjI4MjExdTsKKyAgICAgICAgICAg ICAgICBoYXNoX3QgaGFzaCA9IDE0Njk1OTgxMDM5MzQ2NjU2MDM3dTsKKyAgICAgICAgICAgICAg ICBmb3IgKCBjb25zdCBjaGFyIGMgOiB0Lm5hbWUgKSB7CisgICAgICAgICAgICAgICAgICAgIGhh c2ggXj0gYzsKKyAgICAgICAgICAgICAgICAgICAgaGFzaCAqPSBwcmltZTsKKyAgICAgICAgICAg ICAgICB9CisgICAgICAgICAgICAgICAgaGFzaCBePSBtX2hhc2hTdWZmaXg7CisgICAgICAgICAg ICAgICAgaGFzaCAqPSBwcmltZTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBsb3d7 IHN0YXRpY19jYXN0PHVpbnQzMl90PiggaGFzaCApIH07CisgICAgICAgICAgICAgICAgY29uc3Qg dWludDMyX3QgaGlnaHsgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KCBoYXNoID4+IDMyICkgfTsKKyAg ICAgICAgICAgICAgICByZXR1cm4gbG93ICogaGlnaDsKKyAgICAgICAgICAgIH0KKworICAgICAg ICBwcml2YXRlOgorICAgICAgICAgICAgaGFzaF90IG1faGFzaFN1ZmZpeDsKKyAgICAgICAgfTsK KyAgICB9IC8vIGVuZCB1bm5hbWVkIG5hbWVzcGFjZQorCisgICAgc3RkOjp2ZWN0b3I8VGVzdENh c2U+IHNvcnRUZXN0cyggSUNvbmZpZyBjb25zdCYgY29uZmlnLCBzdGQ6OnZlY3RvcjxUZXN0Q2Fz ZT4gY29uc3QmIHVuc29ydGVkVGVzdENhc2VzICkgeworICAgICAgICBzd2l0Y2goIGNvbmZpZy5y dW5PcmRlcigpICkgeworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9y ZGVyOgorICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaW4gZGVjbGFyYXRpb24gb3JkZXIKKyAg ICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5MZXhp Y29ncmFwaGljYWxPcmRlcjogeworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNl PiBzb3J0ZWQgPSB1bnNvcnRlZFRlc3RDYXNlczsKKyAgICAgICAgICAgICAgICBzdGQ6OnNvcnQo IHNvcnRlZC5iZWdpbigpLCBzb3J0ZWQuZW5kKCkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g c29ydGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJblJh bmRvbU9yZGVyOiB7CisgICAgICAgICAgICAgICAgc2VlZFJuZyggY29uZmlnICk7CisgICAgICAg ICAgICAgICAgVGVzdEhhc2hlciBoeyBjb25maWcucm5nU2VlZCgpIH07CisKKyAgICAgICAgICAg ICAgICB1c2luZyBoYXNoZWRUZXN0ID0gc3RkOjpwYWlyPFRlc3RIYXNoZXI6Omhhc2hfdCwgVGVz dENhc2UgY29uc3QqPjsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxoYXNoZWRUZXN0PiBp bmRleGVkX3Rlc3RzOworICAgICAgICAgICAgICAgIGluZGV4ZWRfdGVzdHMucmVzZXJ2ZSggdW5z b3J0ZWRUZXN0Q2FzZXMuc2l6ZSgpICk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gY29u c3QmIHRlc3RDYXNlIDogdW5zb3J0ZWRUZXN0Q2FzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAg aW5kZXhlZF90ZXN0cy5lbXBsYWNlX2JhY2soaCh0ZXN0Q2FzZSksICZ0ZXN0Q2FzZSk7CisgICAg ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RkOjpzb3J0KGluZGV4ZWRfdGVzdHMu YmVnaW4oKSwgaW5kZXhlZF90ZXN0cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg W10oaGFzaGVkVGVzdCBjb25zdCYgbGhzLCBoYXNoZWRUZXN0IGNvbnN0JiByaHMpIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgaWYgKGxocy5maXJzdCA9PSByaHMuZmlyc3QpIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMuc2Vjb25kLT5uYW1lIDwgcmhzLnNl Y29uZC0+bmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gbGhzLmZpcnN0IDwgcmhzLmZpcnN0OworICAgICAgICAgICAgICAg IH0pOworCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHNvcnRlZDsKKyAg ICAgICAgICAgICAgICBzb3J0ZWQucmVzZXJ2ZSggaW5kZXhlZF90ZXN0cy5zaXplKCkgKTsKKwor ICAgICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgaGFzaGVkIDogaW5kZXhlZF90ZXN0cykg eworICAgICAgICAgICAgICAgICAgICBzb3J0ZWQuZW1wbGFjZV9iYWNrKCpoYXNoZWQuc2Vjb25k KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc29ydGVkOwor ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB1bnNvcnRlZFRlc3RDYXNl czsKKyAgICB9CisKKyAgICBib29sIGlzVGhyb3dTYWZlKCBUZXN0Q2FzZSBjb25zdCYgdGVzdENh c2UsIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgcmV0dXJuICF0ZXN0Q2FzZS50 aHJvd3MoKSB8fCBjb25maWcuYWxsb3dUaHJvd3MoKTsKKyAgICB9CisKKyAgICBib29sIG1hdGNo VGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMs IElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgcmV0dXJuIHRlc3RTcGVjLm1hdGNo ZXMoIHRlc3RDYXNlICkgJiYgaXNUaHJvd1NhZmUoIHRlc3RDYXNlLCBjb25maWcgKTsKKyAgICB9 CisKKyAgICB2b2lkIGVuZm9yY2VOb0R1cGxpY2F0ZVRlc3RDYXNlcyggc3RkOjp2ZWN0b3I8VGVz dENhc2U+IGNvbnN0JiBmdW5jdGlvbnMgKSB7CisgICAgICAgIHN0ZDo6c2V0PFRlc3RDYXNlPiBz ZWVuRnVuY3Rpb25zOworICAgICAgICBmb3IoIGF1dG8gY29uc3QmIGZ1bmN0aW9uIDogZnVuY3Rp b25zICkgeworICAgICAgICAgICAgYXV0byBwcmV2ID0gc2VlbkZ1bmN0aW9ucy5pbnNlcnQoIGZ1 bmN0aW9uICk7CisgICAgICAgICAgICBDQVRDSF9FTkZPUkNFKCBwcmV2LnNlY29uZCwKKyAgICAg ICAgICAgICAgICAgICAgImVycm9yOiBURVNUX0NBU0UoIFwiIiA8PCBmdW5jdGlvbi5uYW1lIDw8 ICJcIiApIGFscmVhZHkgZGVmaW5lZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlx0Rmly c3Qgc2VlbiBhdCAiIDw8IHByZXYuZmlyc3QtPmdldFRlc3RDYXNlSW5mbygpLmxpbmVJbmZvIDw8 ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlx0UmVkZWZpbmVkIGF0ICIgPDwgZnVuY3Rp b24uZ2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gKTsKKyAgICAgICAgfQorICAgIH0KKworICAg IHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJUZXN0cyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+ IGNvbnN0JiB0ZXN0Q2FzZXMsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25z dCYgY29uZmlnICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyZWQ7Cisg ICAgICAgIGZpbHRlcmVkLnJlc2VydmUoIHRlc3RDYXNlcy5zaXplKCkgKTsKKyAgICAgICAgZm9y IChhdXRvIGNvbnN0JiB0ZXN0Q2FzZSA6IHRlc3RDYXNlcykgeworICAgICAgICAgICAgaWYgKCgh dGVzdFNwZWMuaGFzRmlsdGVycygpICYmICF0ZXN0Q2FzZS5pc0hpZGRlbigpKSB8fAorICAgICAg ICAgICAgICAgICh0ZXN0U3BlYy5oYXNGaWx0ZXJzKCkgJiYgbWF0Y2hUZXN0KHRlc3RDYXNlLCB0 ZXN0U3BlYywgY29uZmlnKSkpIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5wdXNoX2JhY2so dGVzdENhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWx0 ZXJlZDsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0 Q2FzZXNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgcmV0dXJuIGdl dFJlZ2lzdHJ5SHViKCkuZ2V0VGVzdENhc2VSZWdpc3RyeSgpLmdldEFsbFRlc3RzU29ydGVkKCBj b25maWcgKTsKKyAgICB9CisKKyAgICB2b2lkIFRlc3RSZWdpc3RyeTo6cmVnaXN0ZXJUZXN0KCBU ZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSB0 ZXN0Q2FzZS5nZXRUZXN0Q2FzZUluZm8oKS5uYW1lOworICAgICAgICBpZiggbmFtZS5lbXB0eSgp ICkgeworICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAgICAgICAgICAg cnNzIDw8ICJBbm9ueW1vdXMgdGVzdCBjYXNlICIgPDwgKyttX3VubmFtZWRDb3VudDsKKyAgICAg ICAgICAgIHJldHVybiByZWdpc3RlclRlc3QoIHRlc3RDYXNlLndpdGhOYW1lKCByc3Muc3RyKCkg KSApOworICAgICAgICB9CisgICAgICAgIG1fZnVuY3Rpb25zLnB1c2hfYmFjayggdGVzdENhc2Ug KTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIFRlc3RSZWdpc3Ry eTo6Z2V0QWxsVGVzdHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2Z1bmN0aW9uczsKKyAg ICB9CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBUZXN0UmVnaXN0cnk6OmdldEFs bFRlc3RzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgIGlm KCBtX3NvcnRlZEZ1bmN0aW9ucy5lbXB0eSgpICkKKyAgICAgICAgICAgIGVuZm9yY2VOb0R1cGxp Y2F0ZVRlc3RDYXNlcyggbV9mdW5jdGlvbnMgKTsKKworICAgICAgICBpZiggIG1fY3VycmVudFNv cnRPcmRlciAhPSBjb25maWcucnVuT3JkZXIoKSB8fCBtX3NvcnRlZEZ1bmN0aW9ucy5lbXB0eSgp ICkgeworICAgICAgICAgICAgbV9zb3J0ZWRGdW5jdGlvbnMgPSBzb3J0VGVzdHMoIGNvbmZpZywg bV9mdW5jdGlvbnMgKTsKKyAgICAgICAgICAgIG1fY3VycmVudFNvcnRPcmRlciA9IGNvbmZpZy5y dW5PcmRlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtX3NvcnRlZEZ1bmN0aW9uczsK KyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBUZXN0SW52b2tlckFzRnVuY3Rp b246OlRlc3RJbnZva2VyQXNGdW5jdGlvbiggdm9pZCgqdGVzdEFzRnVuY3Rpb24pKCkgKSBub2V4 Y2VwdCA6IG1fdGVzdEFzRnVuY3Rpb24oIHRlc3RBc0Z1bmN0aW9uICkge30KKworICAgIHZvaWQg VGVzdEludm9rZXJBc0Z1bmN0aW9uOjppbnZva2UoKSBjb25zdCB7CisgICAgICAgIG1fdGVzdEFz RnVuY3Rpb24oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBleHRyYWN0Q2xhc3NOYW1lKCBT dHJpbmdSZWYgY29uc3QmIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lICkgeworICAgICAgICBz dGQ6OnN0cmluZyBjbGFzc05hbWUoY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUpOworICAgICAg ICBpZiggc3RhcnRzV2l0aCggY2xhc3NOYW1lLCAnJicgKSApCisgICAgICAgIHsKKyAgICAgICAg ICAgIHN0ZDo6c2l6ZV90IGxhc3RDb2xvbnMgPSBjbGFzc05hbWUucmZpbmQoICI6OiIgKTsKKyAg ICAgICAgICAgIHN0ZDo6c2l6ZV90IHBlbnVsdGltYXRlQ29sb25zID0gY2xhc3NOYW1lLnJmaW5k KCAiOjoiLCBsYXN0Q29sb25zLTEgKTsKKyAgICAgICAgICAgIGlmKCBwZW51bHRpbWF0ZUNvbG9u cyA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcGVudWx0aW1hdGVDb2xv bnMgPSAxOworICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0ciggcGVudWx0 aW1hdGVDb2xvbnMsIGxhc3RDb2xvbnMtcGVudWx0aW1hdGVDb2xvbnMgKTsKKyAgICAgICAgfQor ICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENh dGNoCisvLyBlbmQgY2F0Y2hfdGVzdF9jYXNlX3JlZ2lzdHJ5X2ltcGwuY3BwCisvLyBzdGFydCBj YXRjaF90ZXN0X2Nhc2VfdHJhY2tlci5jcHAKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNs dWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxtZW1vcnk+Cisj aW5jbHVkZSA8c3N0cmVhbT4KKworI2lmIGRlZmluZWQoX19jbGFuZ19fKQorIyAgICBwcmFnbWEg Y2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9y ZWQgIi1XZXhpdC10aW1lLWRlc3RydWN0b3JzIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7 CituYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZyB7CisKKyAgICBOYW1lQW5kTG9jYXRpb246Ok5h bWVBbmRMb2NhdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLCBTb3VyY2VMaW5lSW5mbyBj b25zdCYgX2xvY2F0aW9uICkKKyAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgbG9jYXRp b24oIF9sb2NhdGlvbiApCisgICAge30KKworICAgIElUcmFja2VyOjp+SVRyYWNrZXIoKSA9IGRl ZmF1bHQ7CisKKyAgICBJVHJhY2tlciYgVHJhY2tlckNvbnRleHQ6OnN0YXJ0UnVuKCkgeworICAg ICAgICBtX3Jvb3RUcmFja2VyID0gc3RkOjptYWtlX3NoYXJlZDxTZWN0aW9uVHJhY2tlcj4oIE5h bWVBbmRMb2NhdGlvbiggIntyb290fSIsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICksICp0aGlz LCBudWxscHRyICk7CisgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBudWxscHRyOworICAgICAg ICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICByZXR1cm4gKm1fcm9vdFRyYWNrZXI7 CisgICAgfQorCisgICAgdm9pZCBUcmFja2VyQ29udGV4dDo6ZW5kUnVuKCkgeworICAgICAgICBt X3Jvb3RUcmFja2VyLnJlc2V0KCk7CisgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBudWxscHRy OworICAgICAgICBtX3J1blN0YXRlID0gTm90U3RhcnRlZDsKKyAgICB9CisKKyAgICB2b2lkIFRy YWNrZXJDb250ZXh0OjpzdGFydEN5Y2xlKCkgeworICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0g bV9yb290VHJhY2tlci5nZXQoKTsKKyAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAg ICB9CisgICAgdm9pZCBUcmFja2VyQ29udGV4dDo6Y29tcGxldGVDeWNsZSgpIHsKKyAgICAgICAg bV9ydW5TdGF0ZSA9IENvbXBsZXRlZEN5Y2xlOworICAgIH0KKworICAgIGJvb2wgVHJhY2tlckNv bnRleHQ6OmNvbXBsZXRlZEN5Y2xlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9ydW5TdGF0 ZSA9PSBDb21wbGV0ZWRDeWNsZTsKKyAgICB9CisgICAgSVRyYWNrZXImIFRyYWNrZXJDb250ZXh0 OjpjdXJyZW50VHJhY2tlcigpIHsKKyAgICAgICAgcmV0dXJuICptX2N1cnJlbnRUcmFja2VyOwor ICAgIH0KKyAgICB2b2lkIFRyYWNrZXJDb250ZXh0OjpzZXRDdXJyZW50VHJhY2tlciggSVRyYWNr ZXIqIHRyYWNrZXIgKSB7CisgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSB0cmFja2VyOworICAg IH0KKworICAgIFRyYWNrZXJCYXNlOjpUcmFja2VyQmFzZSggTmFtZUFuZExvY2F0aW9uIGNvbnN0 JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQg KToKKyAgICAgICAgSVRyYWNrZXIobmFtZUFuZExvY2F0aW9uKSwKKyAgICAgICAgbV9jdHgoIGN0 eCApLAorICAgICAgICBtX3BhcmVudCggcGFyZW50ICkKKyAgICB7fQorCisgICAgYm9vbCBUcmFj a2VyQmFzZTo6aXNDb21wbGV0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUg PT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5IHx8IG1fcnVuU3RhdGUgPT0gRmFpbGVkOworICAgIH0K KyAgICBib29sIFRyYWNrZXJCYXNlOjppc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpIGNvbnN0IHsK KyAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAg IH0KKyAgICBib29sIFRyYWNrZXJCYXNlOjppc09wZW4oKSBjb25zdCB7CisgICAgICAgIHJldHVy biBtX3J1blN0YXRlICE9IE5vdFN0YXJ0ZWQgJiYgIWlzQ29tcGxldGUoKTsKKyAgICB9CisgICAg Ym9vbCBUcmFja2VyQmFzZTo6aGFzQ2hpbGRyZW4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiAh bV9jaGlsZHJlbi5lbXB0eSgpOworICAgIH0KKworICAgIHZvaWQgVHJhY2tlckJhc2U6OmFkZENo aWxkKCBJVHJhY2tlclB0ciBjb25zdCYgY2hpbGQgKSB7CisgICAgICAgIG1fY2hpbGRyZW4ucHVz aF9iYWNrKCBjaGlsZCApOworICAgIH0KKworICAgIElUcmFja2VyUHRyIFRyYWNrZXJCYXNlOjpm aW5kQ2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgeworICAg ICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKCBtX2NoaWxkcmVuLmJlZ2luKCksIG1fY2hpbGRy ZW4uZW5kKCksCisgICAgICAgICAgICBbJm5hbWVBbmRMb2NhdGlvbl0oIElUcmFja2VyUHRyIGNv bnN0JiB0cmFja2VyICl7CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAg ICAgIHRyYWNrZXItPm5hbWVBbmRMb2NhdGlvbigpLmxvY2F0aW9uID09IG5hbWVBbmRMb2NhdGlv bi5sb2NhdGlvbiAmJgorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5uYW1lQW5kTG9jYXRp b24oKS5uYW1lID09IG5hbWVBbmRMb2NhdGlvbi5uYW1lOworICAgICAgICAgICAgfSApOworICAg ICAgICByZXR1cm4oIGl0ICE9IG1fY2hpbGRyZW4uZW5kKCkgKQorICAgICAgICAgICAgPyAqaXQK KyAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgICB9CisgICAgSVRyYWNrZXImIFRyYWNrZXJCYXNl OjpwYXJlbnQoKSB7CisgICAgICAgIGFzc2VydCggbV9wYXJlbnQgKTsgLy8gU2hvdWxkIGFsd2F5 cyBiZSBub24tbnVsbCBleGNlcHQgZm9yIHJvb3QKKyAgICAgICAgcmV0dXJuICptX3BhcmVudDsK KyAgICB9CisKKyAgICB2b2lkIFRyYWNrZXJCYXNlOjpvcGVuQ2hpbGQoKSB7CisgICAgICAgIGlm KCBtX3J1blN0YXRlICE9IEV4ZWN1dGluZ0NoaWxkcmVuICkgeworICAgICAgICAgICAgbV9ydW5T dGF0ZSA9IEV4ZWN1dGluZ0NoaWxkcmVuOworICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAg ICAgICAgICAgICAgICBtX3BhcmVudC0+b3BlbkNoaWxkKCk7CisgICAgICAgIH0KKyAgICB9CisK KyAgICBib29sIFRyYWNrZXJCYXNlOjppc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgeyByZXR1cm4g ZmFsc2U7IH0KKyAgICBib29sIFRyYWNrZXJCYXNlOjppc0dlbmVyYXRvclRyYWNrZXIoKSBjb25z dCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCBUcmFja2VyQmFzZTo6b3BlbigpIHsKKyAg ICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgbW92ZVRvVGhpcygpOworICAg ICAgICBpZiggbV9wYXJlbnQgKQorICAgICAgICAgICAgbV9wYXJlbnQtPm9wZW5DaGlsZCgpOwor ICAgIH0KKworICAgIHZvaWQgVHJhY2tlckJhc2U6OmNsb3NlKCkgeworCisgICAgICAgIC8vIENs b3NlIGFueSBzdGlsbCBvcGVuIGNoaWxkcmVuIChlLmcuIGdlbmVyYXRvcnMpCisgICAgICAgIHdo aWxlKCAmbV9jdHguY3VycmVudFRyYWNrZXIoKSAhPSB0aGlzICkKKyAgICAgICAgICAgIG1fY3R4 LmN1cnJlbnRUcmFja2VyKCkuY2xvc2UoKTsKKworICAgICAgICBzd2l0Y2goIG1fcnVuU3RhdGUg KSB7CisgICAgICAgICAgICBjYXNlIE5lZWRzQW5vdGhlclJ1bjoKKyAgICAgICAgICAgICAgICBi cmVhazsKKworICAgICAgICAgICAgY2FzZSBFeGVjdXRpbmc6CisgICAgICAgICAgICAgICAgbV9y dW5TdGF0ZSA9IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICBicmVhazsK KyAgICAgICAgICAgIGNhc2UgRXhlY3V0aW5nQ2hpbGRyZW46CisgICAgICAgICAgICAgICAgaWYo IHN0ZDo6YWxsX29mKG1fY2hpbGRyZW4uYmVnaW4oKSwgbV9jaGlsZHJlbi5lbmQoKSwgW10oSVRy YWNrZXJQdHIgY29uc3QmIHQpeyByZXR1cm4gdC0+aXNDb21wbGV0ZSgpOyB9KSApCisgICAgICAg ICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAg ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTm90U3RhcnRlZDoKKyAgICAgICAg ICAgIGNhc2UgQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OgorICAgICAgICAgICAgY2FzZSBGYWlsZWQ6 CisgICAgICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfRVJST1IoICJJbGxvZ2ljYWwgc3RhdGU6 ICIgPDwgbV9ydW5TdGF0ZSApOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg ICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCAiVW5rbm93biBzdGF0ZTogIiA8PCBtX3J1blN0YXRl ICk7CisgICAgICAgIH0KKyAgICAgICAgbW92ZVRvUGFyZW50KCk7CisgICAgICAgIG1fY3R4LmNv bXBsZXRlQ3ljbGUoKTsKKyAgICB9CisgICAgdm9pZCBUcmFja2VyQmFzZTo6ZmFpbCgpIHsKKyAg ICAgICAgbV9ydW5TdGF0ZSA9IEZhaWxlZDsKKyAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAg ICAgICAgIG1fcGFyZW50LT5tYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpOworICAgICAgICBtb3Zl VG9QYXJlbnQoKTsKKyAgICAgICAgbV9jdHguY29tcGxldGVDeWNsZSgpOworICAgIH0KKyAgICB2 b2lkIFRyYWNrZXJCYXNlOjptYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpIHsKKyAgICAgICAgbV9y dW5TdGF0ZSA9IE5lZWRzQW5vdGhlclJ1bjsKKyAgICB9CisKKyAgICB2b2lkIFRyYWNrZXJCYXNl Ojptb3ZlVG9QYXJlbnQoKSB7CisgICAgICAgIGFzc2VydCggbV9wYXJlbnQgKTsKKyAgICAgICAg bV9jdHguc2V0Q3VycmVudFRyYWNrZXIoIG1fcGFyZW50ICk7CisgICAgfQorICAgIHZvaWQgVHJh Y2tlckJhc2U6Om1vdmVUb1RoaXMoKSB7CisgICAgICAgIG1fY3R4LnNldEN1cnJlbnRUcmFja2Vy KCB0aGlzICk7CisgICAgfQorCisgICAgU2VjdGlvblRyYWNrZXI6OlNlY3Rpb25UcmFja2VyKCBO YW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0 eCwgSVRyYWNrZXIqIHBhcmVudCApCisgICAgOiAgIFRyYWNrZXJCYXNlKCBuYW1lQW5kTG9jYXRp b24sIGN0eCwgcGFyZW50ICksCisgICAgICAgIG1fdHJpbW1lZF9uYW1lKHRyaW0obmFtZUFuZExv Y2F0aW9uLm5hbWUpKQorICAgIHsKKyAgICAgICAgaWYoIHBhcmVudCApIHsKKyAgICAgICAgICAg IHdoaWxlKCAhcGFyZW50LT5pc1NlY3Rpb25UcmFja2VyKCkgKQorICAgICAgICAgICAgICAgIHBh cmVudCA9ICZwYXJlbnQtPnBhcmVudCgpOworCisgICAgICAgICAgICBTZWN0aW9uVHJhY2tlciYg cGFyZW50U2VjdGlvbiA9IHN0YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyJj4oICpwYXJlbnQgKTsK KyAgICAgICAgICAgIGFkZE5leHRGaWx0ZXJzKCBwYXJlbnRTZWN0aW9uLm1fZmlsdGVycyApOwor ICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBTZWN0aW9uVHJhY2tlcjo6aXNDb21wbGV0ZSgp IGNvbnN0IHsKKyAgICAgICAgYm9vbCBjb21wbGV0ZSA9IHRydWU7CisKKyAgICAgICAgaWYgKG1f ZmlsdGVycy5lbXB0eSgpCisgICAgICAgICAgICB8fCBtX2ZpbHRlcnNbMF0gPT0gIiIKKyAgICAg ICAgICAgIHx8IHN0ZDo6ZmluZChtX2ZpbHRlcnMuYmVnaW4oKSwgbV9maWx0ZXJzLmVuZCgpLCBt X3RyaW1tZWRfbmFtZSkgIT0gbV9maWx0ZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBjb21wbGV0 ZSA9IFRyYWNrZXJCYXNlOjppc0NvbXBsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu IGNvbXBsZXRlOworICAgIH0KKworICAgIGJvb2wgU2VjdGlvblRyYWNrZXI6OmlzU2VjdGlvblRy YWNrZXIoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICBTZWN0aW9uVHJhY2tlciYgU2Vj dGlvblRyYWNrZXI6OmFjcXVpcmUoIFRyYWNrZXJDb250ZXh0JiBjdHgsIE5hbWVBbmRMb2NhdGlv biBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2Vj dGlvblRyYWNrZXI+IHNlY3Rpb247CisKKyAgICAgICAgSVRyYWNrZXImIGN1cnJlbnRUcmFja2Vy ID0gY3R4LmN1cnJlbnRUcmFja2VyKCk7CisgICAgICAgIGlmKCBJVHJhY2tlclB0ciBjaGlsZFRy YWNrZXIgPSBjdXJyZW50VHJhY2tlci5maW5kQ2hpbGQoIG5hbWVBbmRMb2NhdGlvbiApICkgewor ICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgIGFzc2VydCgg Y2hpbGRUcmFja2VyLT5pc1NlY3Rpb25UcmFja2VyKCkgKTsKKyAgICAgICAgICAgIHNlY3Rpb24g PSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8U2VjdGlvblRyYWNrZXI+KCBjaGlsZFRyYWNrZXIg KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlY3Rpb24gPSBzdGQ6 Om1ha2Vfc2hhcmVkPFNlY3Rpb25UcmFja2VyPiggbmFtZUFuZExvY2F0aW9uLCBjdHgsICZjdXJy ZW50VHJhY2tlciApOworICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQoIHNlY3Rp b24gKTsKKyAgICAgICAgfQorICAgICAgICBpZiggIWN0eC5jb21wbGV0ZWRDeWNsZSgpICkKKyAg ICAgICAgICAgIHNlY3Rpb24tPnRyeU9wZW4oKTsKKyAgICAgICAgcmV0dXJuICpzZWN0aW9uOwor ICAgIH0KKworICAgIHZvaWQgU2VjdGlvblRyYWNrZXI6OnRyeU9wZW4oKSB7CisgICAgICAgIGlm KCAhaXNDb21wbGV0ZSgpICkKKyAgICAgICAgICAgIG9wZW4oKTsKKyAgICB9CisKKyAgICB2b2lk IFNlY3Rpb25UcmFja2VyOjphZGRJbml0aWFsRmlsdGVycyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJp bmc+IGNvbnN0JiBmaWx0ZXJzICkgeworICAgICAgICBpZiggIWZpbHRlcnMuZW1wdHkoKSApIHsK KyAgICAgICAgICAgIG1fZmlsdGVycy5yZXNlcnZlKCBtX2ZpbHRlcnMuc2l6ZSgpICsgZmlsdGVy cy5zaXplKCkgKyAyICk7CisgICAgICAgICAgICBtX2ZpbHRlcnMuZW1wbGFjZV9iYWNrKCIiKTsg Ly8gUm9vdCAtIHNob3VsZCBuZXZlciBiZSBjb25zdWx0ZWQKKyAgICAgICAgICAgIG1fZmlsdGVy cy5lbXBsYWNlX2JhY2soIiIpOyAvLyBUZXN0IENhc2UgLSBub3QgYSBzZWN0aW9uIGZpbHRlcgor ICAgICAgICAgICAgbV9maWx0ZXJzLmluc2VydCggbV9maWx0ZXJzLmVuZCgpLCBmaWx0ZXJzLmJl Z2luKCksIGZpbHRlcnMuZW5kKCkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIFNlY3Rp b25UcmFja2VyOjphZGROZXh0RmlsdGVycyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0 JiBmaWx0ZXJzICkgeworICAgICAgICBpZiggZmlsdGVycy5zaXplKCkgPiAxICkKKyAgICAgICAg ICAgIG1fZmlsdGVycy5pbnNlcnQoIG1fZmlsdGVycy5lbmQoKSwgZmlsdGVycy5iZWdpbigpKzEs IGZpbHRlcnMuZW5kKCkgKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4g Y29uc3QmIFNlY3Rpb25UcmFja2VyOjpnZXRGaWx0ZXJzKCkgY29uc3QgeworICAgICAgICByZXR1 cm4gbV9maWx0ZXJzOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBTZWN0aW9uVHJh Y2tlcjo6dHJpbW1lZE5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3RyaW1tZWRfbmFt ZTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIFRlc3RDYXNlVHJhY2tpbmcKKwordXNpbmcgVGVz dENhc2VUcmFja2luZzo6SVRyYWNrZXI7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpUcmFja2Vy Q29udGV4dDsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OlNlY3Rpb25UcmFja2VyOworCit9IC8v IG5hbWVzcGFjZSBDYXRjaAorCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjICAgIHByYWdtYSBj bGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisvLyBlbmQgY2F0Y2hfdGVzdF9jYXNlX3RyYWNr ZXIuY3BwCisvLyBzdGFydCBjYXRjaF90ZXN0X3JlZ2lzdHJ5LmNwcAorCituYW1lc3BhY2UgQ2F0 Y2ggeworCisgICAgYXV0byBtYWtlVGVzdEludm9rZXIoIHZvaWQoKnRlc3RBc0Z1bmN0aW9uKSgp ICkgbm9leGNlcHQgLT4gSVRlc3RJbnZva2VyKiB7CisgICAgICAgIHJldHVybiBuZXcoc3RkOjpu b3Rocm93KSBUZXN0SW52b2tlckFzRnVuY3Rpb24oIHRlc3RBc0Z1bmN0aW9uICk7CisgICAgfQor CisgICAgTmFtZUFuZFRhZ3M6Ok5hbWVBbmRUYWdzKCBTdHJpbmdSZWYgY29uc3QmIG5hbWVfICwg U3RyaW5nUmVmIGNvbnN0JiB0YWdzXyApIG5vZXhjZXB0IDogbmFtZSggbmFtZV8gKSwgdGFncygg dGFnc18gKSB7fQorCisgICAgQXV0b1JlZzo6QXV0b1JlZyggSVRlc3RJbnZva2VyKiBpbnZva2Vy LCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sIFN0cmluZ1JlZiBjb25zdCYgY2xhc3NP ck1ldGhvZCwgTmFtZUFuZFRhZ3MgY29uc3QmIG5hbWVBbmRUYWdzICkgbm9leGNlcHQgeworICAg ICAgICBDQVRDSF9UUlkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkKKyAg ICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyVGVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAg IG1ha2VUZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VyLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RDbGFzc05hbWUoIGNsYXNzT3JNZXRob2Qg KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lQW5kVGFncywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICBsaW5lSW5mbykpOworICAgICAgICB9IENBVENIX0NBVENIX0FMTCB7 CisgICAgICAgICAgICAvLyBEbyBub3QgdGhyb3cgd2hlbiBjb25zdHJ1Y3RpbmcgZ2xvYmFsIG9i amVjdHMsIGluc3RlYWQgcmVnaXN0ZXIgdGhlIGV4Y2VwdGlvbiB0byBiZSBwcm9jZXNzZWQgbGF0 ZXIKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyU3RhcnR1cEV4 Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQXV0b1JlZzo6fkF1dG9SZWcoKSA9 IGRlZmF1bHQ7Cit9CisvLyBlbmQgY2F0Y2hfdGVzdF9yZWdpc3RyeS5jcHAKKy8vIHN0YXJ0IGNh dGNoX3Rlc3Rfc3BlYy5jcHAKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJp bmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIENh dGNoIHsKKworICAgIFRlc3RTcGVjOjpQYXR0ZXJuOjpQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25z dCYgbmFtZSApCisgICAgOiBtX25hbWUoIG5hbWUgKQorICAgIHt9CisKKyAgICBUZXN0U3BlYzo6 UGF0dGVybjo6flBhdHRlcm4oKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYg VGVzdFNwZWM6OlBhdHRlcm46Om5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX25hbWU7 CisgICAgfQorCisgICAgVGVzdFNwZWM6Ok5hbWVQYXR0ZXJuOjpOYW1lUGF0dGVybiggc3RkOjpz dHJpbmcgY29uc3QmIG5hbWUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWx0ZXJTdHJpbmcgKQorICAg IDogUGF0dGVybiggZmlsdGVyU3RyaW5nICkKKyAgICAsIG1fd2lsZGNhcmRQYXR0ZXJuKCB0b0xv d2VyKCBuYW1lICksIENhc2VTZW5zaXRpdmU6Ok5vICkKKyAgICB7fQorCisgICAgYm9vbCBUZXN0 U3BlYzo6TmFtZVBhdHRlcm46Om1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2Ug KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3dpbGRjYXJkUGF0dGVybi5tYXRjaGVzKCB0ZXN0 Q2FzZS5uYW1lICk7CisgICAgfQorCisgICAgVGVzdFNwZWM6OlRhZ1BhdHRlcm46OlRhZ1BhdHRl cm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWx0ZXJTdHJp bmcgKQorICAgIDogUGF0dGVybiggZmlsdGVyU3RyaW5nICkKKyAgICAsIG1fdGFnKCB0b0xvd2Vy KCB0YWcgKSApCisgICAge30KKworICAgIGJvb2wgVGVzdFNwZWM6OlRhZ1BhdHRlcm46Om1hdGNo ZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgIHJldHVy biBzdGQ6OmZpbmQoYmVnaW4odGVzdENhc2UubGNhc2VUYWdzKSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICBlbmQodGVzdENhc2UubGNhc2VUYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICBtX3RhZykgIT0gZW5kKHRlc3RDYXNlLmxjYXNlVGFncyk7CisgICAgfQorCisgICAgVGVzdFNw ZWM6OkV4Y2x1ZGVkUGF0dGVybjo6RXhjbHVkZWRQYXR0ZXJuKCBQYXR0ZXJuUHRyIGNvbnN0JiB1 bmRlcmx5aW5nUGF0dGVybiApCisgICAgOiBQYXR0ZXJuKCB1bmRlcmx5aW5nUGF0dGVybi0+bmFt ZSgpICkKKyAgICAsIG1fdW5kZXJseWluZ1BhdHRlcm4oIHVuZGVybHlpbmdQYXR0ZXJuICkKKyAg ICB7fQorCisgICAgYm9vbCBUZXN0U3BlYzo6RXhjbHVkZWRQYXR0ZXJuOjptYXRjaGVzKCBUZXN0 Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICByZXR1cm4gIW1fdW5k ZXJseWluZ1BhdHRlcm4tPm1hdGNoZXMoIHRlc3RDYXNlICk7CisgICAgfQorCisgICAgYm9vbCBU ZXN0U3BlYzo6RmlsdGVyOjptYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkg Y29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjphbGxfb2YoIG1fcGF0dGVybnMuYmVnaW4oKSwg bV9wYXR0ZXJucy5lbmQoKSwgWyZdKCBQYXR0ZXJuUHRyIGNvbnN0JiBwICl7IHJldHVybiBwLT5t YXRjaGVzKCB0ZXN0Q2FzZSApOyB9ICk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgVGVzdFNw ZWM6OkZpbHRlcjo6bmFtZSgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAg ICAgICAgZm9yKCBhdXRvIGNvbnN0JiBwIDogbV9wYXR0ZXJucyApCisgICAgICAgICAgICBuYW1l ICs9IHAtPm5hbWUoKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgYm9vbCBU ZXN0U3BlYzo6aGFzRmlsdGVycygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFtX2ZpbHRlcnMu ZW1wdHkoKTsKKyAgICB9CisKKyAgICBib29sIFRlc3RTcGVjOjptYXRjaGVzKCBUZXN0Q2FzZUlu Zm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjphbnlfb2Yo IG1fZmlsdGVycy5iZWdpbigpLCBtX2ZpbHRlcnMuZW5kKCksIFsmXSggRmlsdGVyIGNvbnN0JiBm ICl7IHJldHVybiBmLm1hdGNoZXMoIHRlc3RDYXNlICk7IH0gKTsKKyAgICB9CisKKyAgICBUZXN0 U3BlYzo6TWF0Y2hlcyBUZXN0U3BlYzo6bWF0Y2hlc0J5RmlsdGVyKCBzdGQ6OnZlY3RvcjxUZXN0 Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QKKyAg ICB7CisgICAgICAgIE1hdGNoZXMgbWF0Y2hlcyggbV9maWx0ZXJzLnNpemUoKSApOworICAgICAg ICBzdGQ6OnRyYW5zZm9ybSggbV9maWx0ZXJzLmJlZ2luKCksIG1fZmlsdGVycy5lbmQoKSwgbWF0 Y2hlcy5iZWdpbigpLCBbJl0oIEZpbHRlciBjb25zdCYgZmlsdGVyICl7CisgICAgICAgICAgICBz dGQ6OnZlY3RvcjxUZXN0Q2FzZSBjb25zdCo+IGN1cnJlbnRNYXRjaGVzOworICAgICAgICAgICAg Zm9yKCBhdXRvIGNvbnN0JiB0ZXN0IDogdGVzdENhc2VzICkKKyAgICAgICAgICAgICAgICBpZigg aXNUaHJvd1NhZmUoIHRlc3QsIGNvbmZpZyApICYmIGZpbHRlci5tYXRjaGVzKCB0ZXN0ICkgKQor ICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWF0Y2hlcy5lbXBsYWNlX2JhY2soICZ0ZXN0ICk7 CisgICAgICAgICAgICByZXR1cm4gRmlsdGVyTWF0Y2h7IGZpbHRlci5uYW1lKCksIGN1cnJlbnRN YXRjaGVzIH07CisgICAgICAgIH0gKTsKKyAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfQor CisgICAgY29uc3QgVGVzdFNwZWM6OnZlY3RvclN0cmluZ3MmIFRlc3RTcGVjOjpnZXRJbnZhbGlk QXJncygpIGNvbnN0eworICAgICAgICByZXR1cm4gIChtX2ludmFsaWRBcmdzKTsKKyAgICB9CisK K30KKy8vIGVuZCBjYXRjaF90ZXN0X3NwZWMuY3BwCisvLyBzdGFydCBjYXRjaF90ZXN0X3NwZWNf cGFyc2VyLmNwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgVGVzdFNwZWNQYXJzZXI6OlRl c3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgdGFnQWxpYXNlcyApIDogbV90 YWdBbGlhc2VzKCAmdGFnQWxpYXNlcyApIHt9CisKKyAgICBUZXN0U3BlY1BhcnNlciYgVGVzdFNw ZWNQYXJzZXI6OnBhcnNlKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnICkgeworICAgICAgICBtX21v ZGUgPSBOb25lOworICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICBtX2FyZyA9 IG1fdGFnQWxpYXNlcy0+ZXhwYW5kQWxpYXNlcyggYXJnICk7CisgICAgICAgIG1fZXNjYXBlQ2hh cnMuY2xlYXIoKTsKKyAgICAgICAgbV9zdWJzdHJpbmcucmVzZXJ2ZShtX2FyZy5zaXplKCkpOwor ICAgICAgICBtX3BhdHRlcm5OYW1lLnJlc2VydmUobV9hcmcuc2l6ZSgpKTsKKyAgICAgICAgbV9y ZWFsUGF0dGVyblBvcyA9IDA7CisKKyAgICAgICAgZm9yKCBtX3BvcyA9IDA7IG1fcG9zIDwgbV9h cmcuc2l6ZSgpOyArK21fcG9zICkKKyAgICAgICAgICAvL2lmIHZpc2l0Q2hhciBmYWlscworICAg ICAgICAgICBpZiggIXZpc2l0Q2hhciggbV9hcmdbbV9wb3NdICkgKXsKKyAgICAgICAgICAgICAg IG1fdGVzdFNwZWMubV9pbnZhbGlkQXJncy5wdXNoX2JhY2soYXJnKTsKKyAgICAgICAgICAgICAg IGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgIGVuZE1vZGUoKTsKKyAgICAgICAgcmV0dXJu ICp0aGlzOworICAgIH0KKyAgICBUZXN0U3BlYyBUZXN0U3BlY1BhcnNlcjo6dGVzdFNwZWMoKSB7 CisgICAgICAgIGFkZEZpbHRlcigpOworICAgICAgICByZXR1cm4gbV90ZXN0U3BlYzsKKyAgICB9 CisgICAgYm9vbCBUZXN0U3BlY1BhcnNlcjo6dmlzaXRDaGFyKCBjaGFyIGMgKSB7CisgICAgICAg IGlmKCAobV9tb2RlICE9IEVzY2FwZWROYW1lKSAmJiAoYyA9PSAnXFwnKSApIHsKKyAgICAgICAg ICAgIGVzY2FwZSgpOworICAgICAgICAgICAgYWRkQ2hhclRvUGF0dGVybihjKTsKKyAgICAgICAg ICAgIHJldHVybiB0cnVlOworICAgICAgICB9ZWxzZSBpZigobV9tb2RlICE9IEVzY2FwZWROYW1l KSAmJiAoYyA9PSAnLCcpICkgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXBhcmF0ZSgpOworICAg ICAgICB9CisKKyAgICAgICAgc3dpdGNoKCBtX21vZGUgKSB7CisgICAgICAgIGNhc2UgTm9uZToK KyAgICAgICAgICAgIGlmKCBwcm9jZXNzTm9uZUNoYXIoIGMgKSApCisgICAgICAgICAgICAgICAg cmV0dXJuIHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOYW1lOgorICAg ICAgICAgICAgcHJvY2Vzc05hbWVDaGFyKCBjICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg ICAgY2FzZSBFc2NhcGVkTmFtZToKKyAgICAgICAgICAgIGVuZE1vZGUoKTsKKyAgICAgICAgICAg IGFkZENoYXJUb1BhdHRlcm4oYyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg ZGVmYXVsdDoKKyAgICAgICAgY2FzZSBUYWc6CisgICAgICAgIGNhc2UgUXVvdGVkTmFtZToKKyAg ICAgICAgICAgIGlmKCBwcm9jZXNzT3RoZXJDaGFyKCBjICkgKQorICAgICAgICAgICAgICAgIHJl dHVybiB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtX3N1 YnN0cmluZyArPSBjOworICAgICAgICBpZiggIWlzQ29udHJvbENoYXIoIGMgKSApIHsKKyAgICAg ICAgICAgIG1fcGF0dGVybk5hbWUgKz0gYzsKKyAgICAgICAgICAgIG1fcmVhbFBhdHRlcm5Qb3Mr KzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gVHdvIG9m IHRoZSBwcm9jZXNzaW5nIG1ldGhvZHMgcmV0dXJuIHRydWUgdG8gc2lnbmFsIHRoZSBjYWxsZXIg dG8gcmV0dXJuCisgICAgLy8gd2l0aG91dCBhZGRpbmcgdGhlIGdpdmVuIGNoYXJhY3RlciB0byB0 aGUgY3VycmVudCBwYXR0ZXJuIHN0cmluZ3MKKyAgICBib29sIFRlc3RTcGVjUGFyc2VyOjpwcm9j ZXNzTm9uZUNoYXIoIGNoYXIgYyApIHsKKyAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICBj YXNlICcgJzoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlICd+JzoKKyAg ICAgICAgICAgIG1fZXhjbHVzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK KyAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICBzdGFydE5ld01vZGUoIFRhZyApOworICAg ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIHN0 YXJ0TmV3TW9kZSggUXVvdGVkTmFtZSApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhcnROZXdNb2RlKCBOYW1lICk7CisgICAgICAg ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBUZXN0U3BlY1Bh cnNlcjo6cHJvY2Vzc05hbWVDaGFyKCBjaGFyIGMgKSB7CisgICAgICAgIGlmKCBjID09ICdbJyAp IHsKKyAgICAgICAgICAgIGlmKCBtX3N1YnN0cmluZyA9PSAiZXhjbHVkZToiICkKKyAgICAgICAg ICAgICAgICBtX2V4Y2x1c2lvbiA9IHRydWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg ICAgICAgZW5kTW9kZSgpOworICAgICAgICAgICAgc3RhcnROZXdNb2RlKCBUYWcgKTsKKyAgICAg ICAgfQorICAgIH0KKyAgICBib29sIFRlc3RTcGVjUGFyc2VyOjpwcm9jZXNzT3RoZXJDaGFyKCBj aGFyIGMgKSB7CisgICAgICAgIGlmKCAhaXNDb250cm9sQ2hhciggYyApICkKKyAgICAgICAgICAg IHJldHVybiBmYWxzZTsKKyAgICAgICAgbV9zdWJzdHJpbmcgKz0gYzsKKyAgICAgICAgZW5kTW9k ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdm9pZCBUZXN0U3BlY1BhcnNl cjo6c3RhcnROZXdNb2RlKCBNb2RlIG1vZGUgKSB7CisgICAgICAgIG1fbW9kZSA9IG1vZGU7Cisg ICAgfQorICAgIHZvaWQgVGVzdFNwZWNQYXJzZXI6OmVuZE1vZGUoKSB7CisgICAgICAgIHN3aXRj aCggbV9tb2RlICkgeworICAgICAgICBjYXNlIE5hbWU6CisgICAgICAgIGNhc2UgUXVvdGVkTmFt ZToKKyAgICAgICAgICAgIHJldHVybiBhZGROYW1lUGF0dGVybigpOworICAgICAgICBjYXNlIFRh ZzoKKyAgICAgICAgICAgIHJldHVybiBhZGRUYWdQYXR0ZXJuKCk7CisgICAgICAgIGNhc2UgRXNj YXBlZE5hbWU6CisgICAgICAgICAgICByZXZlcnRCYWNrVG9MYXN0TW9kZSgpOworICAgICAgICAg ICAgcmV0dXJuOworICAgICAgICBjYXNlIE5vbmU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg ICAgICByZXR1cm4gc3RhcnROZXdNb2RlKCBOb25lICk7CisgICAgICAgIH0KKyAgICB9CisgICAg dm9pZCBUZXN0U3BlY1BhcnNlcjo6ZXNjYXBlKCkgeworICAgICAgICBzYXZlTGFzdE1vZGUoKTsK KyAgICAgICAgbV9tb2RlID0gRXNjYXBlZE5hbWU7CisgICAgICAgIG1fZXNjYXBlQ2hhcnMucHVz aF9iYWNrKG1fcmVhbFBhdHRlcm5Qb3MpOworICAgIH0KKyAgICBib29sIFRlc3RTcGVjUGFyc2Vy Ojppc0NvbnRyb2xDaGFyKCBjaGFyIGMgKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCggbV9tb2Rl ICkgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7 CisgICAgICAgICAgICBjYXNlIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGMgPT0gJ34n OworICAgICAgICAgICAgY2FzZSBOYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBjID09ICdb JzsKKyAgICAgICAgICAgIGNhc2UgRXNjYXBlZE5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJu IHRydWU7CisgICAgICAgICAgICBjYXNlIFF1b3RlZE5hbWU6CisgICAgICAgICAgICAgICAgcmV0 dXJuIGMgPT0gJyInOworICAgICAgICAgICAgY2FzZSBUYWc6CisgICAgICAgICAgICAgICAgcmV0 dXJuIGMgPT0gJ1snIHx8IGMgPT0gJ10nOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBU ZXN0U3BlY1BhcnNlcjo6YWRkRmlsdGVyKCkgeworICAgICAgICBpZiggIW1fY3VycmVudEZpbHRl ci5tX3BhdHRlcm5zLmVtcHR5KCkgKSB7CisgICAgICAgICAgICBtX3Rlc3RTcGVjLm1fZmlsdGVy cy5wdXNoX2JhY2soIG1fY3VycmVudEZpbHRlciApOworICAgICAgICAgICAgbV9jdXJyZW50Rmls dGVyID0gVGVzdFNwZWM6OkZpbHRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBU ZXN0U3BlY1BhcnNlcjo6c2F2ZUxhc3RNb2RlKCkgeworICAgICAgbGFzdE1vZGUgPSBtX21vZGU7 CisgICAgfQorCisgICAgdm9pZCBUZXN0U3BlY1BhcnNlcjo6cmV2ZXJ0QmFja1RvTGFzdE1vZGUo KSB7CisgICAgICBtX21vZGUgPSBsYXN0TW9kZTsKKyAgICB9CisKKyAgICBib29sIFRlc3RTcGVj UGFyc2VyOjpzZXBhcmF0ZSgpIHsKKyAgICAgIGlmKCAobV9tb2RlPT1RdW90ZWROYW1lKSB8fCAo bV9tb2RlPT1UYWcpICl7CisgICAgICAgICAvL2ludmFsaWQgYXJndW1lbnQsIHNpZ25hbCBmYWls dXJlIHRvIHByZXZpb3VzIHNjb3BlLgorICAgICAgICAgbV9tb2RlID0gTm9uZTsKKyAgICAgICAg IG1fcG9zID0gbV9hcmcuc2l6ZSgpOworICAgICAgICAgbV9zdWJzdHJpbmcuY2xlYXIoKTsKKyAg ICAgICAgIG1fcGF0dGVybk5hbWUuY2xlYXIoKTsKKyAgICAgICAgIG1fcmVhbFBhdHRlcm5Qb3Mg PSAwOworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgZW5kTW9kZSgpOwor ICAgICAgYWRkRmlsdGVyKCk7CisgICAgICByZXR1cm4gdHJ1ZTsgLy9zdWNjZXNzCisgICAgfQor CisgICAgc3RkOjpzdHJpbmcgVGVzdFNwZWNQYXJzZXI6OnByZXByb2Nlc3NQYXR0ZXJuKCkgewor ICAgICAgICBzdGQ6OnN0cmluZyB0b2tlbiA9IG1fcGF0dGVybk5hbWU7CisgICAgICAgIGZvciAo c3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX2VzY2FwZUNoYXJzLnNpemUoKTsgKytpKQorICAgICAg ICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoMCwgbV9lc2NhcGVDaGFyc1tpXSAtIGkpICsgdG9r ZW4uc3Vic3RyKG1fZXNjYXBlQ2hhcnNbaV0gLSBpICsgMSk7CisgICAgICAgIG1fZXNjYXBlQ2hh cnMuY2xlYXIoKTsKKyAgICAgICAgaWYgKHN0YXJ0c1dpdGgodG9rZW4sICJleGNsdWRlOiIpKSB7 CisgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IHRydWU7CisgICAgICAgICAgICB0b2tlbiA9IHRv a2VuLnN1YnN0cig4KTsKKyAgICAgICAgfQorCisgICAgICAgIG1fcGF0dGVybk5hbWUuY2xlYXIo KTsKKyAgICAgICAgbV9yZWFsUGF0dGVyblBvcyA9IDA7CisKKyAgICAgICAgcmV0dXJuIHRva2Vu OworICAgIH0KKworICAgIHZvaWQgVGVzdFNwZWNQYXJzZXI6OmFkZE5hbWVQYXR0ZXJuKCkgewor ICAgICAgICBhdXRvIHRva2VuID0gcHJlcHJvY2Vzc1BhdHRlcm4oKTsKKworICAgICAgICBpZiAo IXRva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIFRlc3RTcGVjOjpQYXR0ZXJuUHRyIHBhdHRl cm4gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4odG9rZW4sIG1fc3Vi c3RyaW5nKTsKKyAgICAgICAgICAgIGlmIChtX2V4Y2x1c2lvbikKKyAgICAgICAgICAgICAgICBw YXR0ZXJuID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0U3BlYzo6RXhjbHVkZWRQYXR0ZXJuPihwYXR0 ZXJuKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZpbHRlci5tX3BhdHRlcm5zLnB1c2hfYmFjayhw YXR0ZXJuKTsKKyAgICAgICAgfQorICAgICAgICBtX3N1YnN0cmluZy5jbGVhcigpOworICAgICAg ICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICBtX21vZGUgPSBOb25lOworICAgIH0KKwor ICAgIHZvaWQgVGVzdFNwZWNQYXJzZXI6OmFkZFRhZ1BhdHRlcm4oKSB7CisgICAgICAgIGF1dG8g dG9rZW4gPSBwcmVwcm9jZXNzUGF0dGVybigpOworCisgICAgICAgIGlmICghdG9rZW4uZW1wdHko KSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHRhZyBwYXR0ZXJuIGlzIHRoZSAiaGlkZSBhbmQg dGFnIiBzaG9ydGhhbmQgKGUuZy4gWy5mb29dKQorICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBj cmVhdGUgYSBzZXBhcmF0ZSBoaWRlIHRhZyBhbmQgc2hvcnRlbiB0aGUgcmVhbCBvbmUKKyAgICAg ICAgICAgIGlmICh0b2tlbi5zaXplKCkgPiAxICYmIHRva2VuWzBdID09ICcuJykgeworICAgICAg ICAgICAgICAgIHRva2VuLmVyYXNlKHRva2VuLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIFRl c3RTcGVjOjpQYXR0ZXJuUHRyIHBhdHRlcm4gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RTcGVjOjpU YWdQYXR0ZXJuPigiLiIsIG1fc3Vic3RyaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAobV9leGNs dXNpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IHN0ZDo6bWFrZV9zaGFyZWQ8 VGVzdFNwZWM6OkV4Y2x1ZGVkUGF0dGVybj4ocGF0dGVybik7CisgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgICAgIG1fY3VycmVudEZpbHRlci5tX3BhdHRlcm5zLnB1c2hfYmFjayhwYXR0 ZXJuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGVzdFNwZWM6OlBhdHRlcm5QdHIg cGF0dGVybiA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdFNwZWM6OlRhZ1BhdHRlcm4+KHRva2VuLCBt X3N1YnN0cmluZyk7CisKKyAgICAgICAgICAgIGlmIChtX2V4Y2x1c2lvbikgeworICAgICAgICAg ICAgICAgIHBhdHRlcm4gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RTcGVjOjpFeGNsdWRlZFBhdHRl cm4+KHBhdHRlcm4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9jdXJyZW50RmlsdGVy Lm1fcGF0dGVybnMucHVzaF9iYWNrKHBhdHRlcm4pOworICAgICAgICB9CisgICAgICAgIG1fc3Vi c3RyaW5nLmNsZWFyKCk7CisgICAgICAgIG1fZXhjbHVzaW9uID0gZmFsc2U7CisgICAgICAgIG1f bW9kZSA9IE5vbmU7CisgICAgfQorCisgICAgVGVzdFNwZWMgcGFyc2VUZXN0U3BlYyggc3RkOjpz dHJpbmcgY29uc3QmIGFyZyApIHsKKyAgICAgICAgcmV0dXJuIFRlc3RTcGVjUGFyc2VyKCBJVGFn QWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggYXJnICkudGVzdFNwZWMoKTsKKyAgICB9CisK K30gLy8gbmFtZXNwYWNlIENhdGNoCisvLyBlbmQgY2F0Y2hfdGVzdF9zcGVjX3BhcnNlci5jcHAK Ky8vIHN0YXJ0IGNhdGNoX3RpbWVyLmNwcAorCisjaW5jbHVkZSA8Y2hyb25vPgorCitzdGF0aWMg Y29uc3QgdWludDY0X3QgbmFub3NlY29uZHNJblNlY29uZCA9IDEwMDAwMDAwMDA7CisKK25hbWVz cGFjZSBDYXRjaCB7CisKKyAgICBhdXRvIGdldEN1cnJlbnROYW5vc2Vjb25kc1NpbmNlRXBvY2go KSAtPiB1aW50NjRfdCB7CisgICAgICAgIHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2Fz dDxzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM+KCBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9u X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkgKS5jb3VudCgpOworICAgIH0KKworICAg IG5hbWVzcGFjZSB7CisgICAgICAgIGF1dG8gZXN0aW1hdGVDbG9ja1Jlc29sdXRpb24oKSAtPiB1 aW50NjRfdCB7CisgICAgICAgICAgICB1aW50NjRfdCBzdW0gPSAwOworICAgICAgICAgICAgc3Rh dGljIGNvbnN0IHVpbnQ2NF90IGl0ZXJhdGlvbnMgPSAxMDAwMDAwOworCisgICAgICAgICAgICBh dXRvIHN0YXJ0VGltZSA9IGdldEN1cnJlbnROYW5vc2Vjb25kc1NpbmNlRXBvY2goKTsKKworICAg ICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7ICsraSApIHsK KworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpY2tzOworICAgICAgICAgICAgICAgIHVpbnQ2 NF90IGJhc2VUaWNrcyA9IGdldEN1cnJlbnROYW5vc2Vjb25kc1NpbmNlRXBvY2goKTsKKyAgICAg ICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHRpY2tzID0gZ2V0Q3VycmVudE5h bm9zZWNvbmRzU2luY2VFcG9jaCgpOworICAgICAgICAgICAgICAgIH0gd2hpbGUoIHRpY2tzID09 IGJhc2VUaWNrcyApOworCisgICAgICAgICAgICAgICAgYXV0byBkZWx0YSA9IHRpY2tzIC0gYmFz ZVRpY2tzOworICAgICAgICAgICAgICAgIHN1bSArPSBkZWx0YTsKKworICAgICAgICAgICAgICAg IC8vIElmIHdlIGhhdmUgYmVlbiBjYWxpYnJhdGluZyBmb3Igb3ZlciAzIHNlY29uZHMgLS0gdGhl IGNsb2NrCisgICAgICAgICAgICAgICAgLy8gaXMgdGVycmlibGUgYW5kIHdlIHNob3VsZCBtb3Zl IG9uLgorICAgICAgICAgICAgICAgIC8vIFRCRDogSG93IHRvIHNpZ25hbCB0aGF0IHRoZSBtZWFz dXJlZCByZXNvbHV0aW9uIGlzIHByb2JhYmx5IHdyb25nPworICAgICAgICAgICAgICAgIGlmICh0 aWNrcyA+IHN0YXJ0VGltZSArIDMgKiBuYW5vc2Vjb25kc0luU2Vjb25kKSB7CisgICAgICAgICAg ICAgICAgICAgIHJldHVybiBzdW0gLyAoIGkgKyAxdSApOworICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UncmUganVzdCB0YWtpbmcgdGhlIG1lYW4s IGhlcmUuIFRvIGRvIGJldHRlciB3ZSBjb3VsZCB0YWtlIHRoZSBzdGQuIGRldiBhbmQgZXhjbHVk ZSBvdXRsaWVycworICAgICAgICAgICAgLy8gLSBhbmQgcG90ZW50aWFsbHkgZG8gbW9yZSBpdGVy YXRpb25zIGlmIHRoZXJlJ3MgYSBoaWdoIHZhcmlhbmNlLgorICAgICAgICAgICAgcmV0dXJuIHN1 bS9pdGVyYXRpb25zOworICAgICAgICB9CisgICAgfQorICAgIGF1dG8gZ2V0RXN0aW1hdGVkQ2xv Y2tSZXNvbHV0aW9uKCkgLT4gdWludDY0X3QgeworICAgICAgICBzdGF0aWMgYXV0byBzX3Jlc29s dXRpb24gPSBlc3RpbWF0ZUNsb2NrUmVzb2x1dGlvbigpOworICAgICAgICByZXR1cm4gc19yZXNv bHV0aW9uOworICAgIH0KKworICAgIHZvaWQgVGltZXI6OnN0YXJ0KCkgeworICAgICAgIG1fbmFu b3NlY29uZHMgPSBnZXRDdXJyZW50TmFub3NlY29uZHNTaW5jZUVwb2NoKCk7CisgICAgfQorICAg IGF1dG8gVGltZXI6OmdldEVsYXBzZWROYW5vc2Vjb25kcygpIGNvbnN0IC0+IHVpbnQ2NF90IHsK KyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnROYW5vc2Vjb25kc1NpbmNlRXBvY2goKSAtIG1fbmFu b3NlY29uZHM7CisgICAgfQorICAgIGF1dG8gVGltZXI6OmdldEVsYXBzZWRNaWNyb3NlY29uZHMo KSBjb25zdCAtPiB1aW50NjRfdCB7CisgICAgICAgIHJldHVybiBnZXRFbGFwc2VkTmFub3NlY29u ZHMoKS8xMDAwOworICAgIH0KKyAgICBhdXRvIFRpbWVyOjpnZXRFbGFwc2VkTWlsbGlzZWNvbmRz KCkgY29uc3QgLT4gdW5zaWduZWQgaW50IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVu c2lnbmVkIGludD4oZ2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpLzEwMDApOworICAgIH0KKyAgICBh dXRvIFRpbWVyOjpnZXRFbGFwc2VkU2Vjb25kcygpIGNvbnN0IC0+IGRvdWJsZSB7CisgICAgICAg IHJldHVybiBnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAwMDAwMC4wOworICAgIH0KKworfSAv LyBuYW1lc3BhY2UgQ2F0Y2gKKy8vIGVuZCBjYXRjaF90aW1lci5jcHAKKy8vIHN0YXJ0IGNhdGNo X3Rvc3RyaW5nLmNwcAorCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjICAgIHByYWdtYSBjbGFu ZyBkaWFnbm9zdGljIHB1c2gKKyMgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAi LVdleGl0LXRpbWUtZGVzdHJ1Y3RvcnMiCisjICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGln bm9yZWQgIi1XZ2xvYmFsLWNvbnN0cnVjdG9ycyIKKyNlbmRpZgorCisvLyBFbmFibGUgc3BlY2lm aWMgZGVjbHMgbG9jYWxseQorI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQ0hST05P X1NUUklOR01BS0VSKQorI2RlZmluZSBDQVRDSF9DT05GSUdfRU5BQkxFX0NIUk9OT19TVFJJTkdN QUtFUgorI2VuZGlmCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxpb21hbmlwPgorCitu YW1lc3BhY2UgQ2F0Y2ggeworCituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGNvbnN0IHN0ZDo6 c3RyaW5nIHVucHJpbnRhYmxlU3RyaW5nID0gIns/fSI7CisKKyAgICBuYW1lc3BhY2UgeworICAg ICAgICBjb25zdCBpbnQgaGV4VGhyZXNob2xkID0gMjU1OworCisgICAgICAgIHN0cnVjdCBFbmRp YW5uZXNzIHsKKyAgICAgICAgICAgIGVudW0gQXJjaCB7IEJpZywgTGl0dGxlIH07CisKKyAgICAg ICAgICAgIHN0YXRpYyBBcmNoIHdoaWNoKCkgeworICAgICAgICAgICAgICAgIGludCBvbmUgPSAx OworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsb3dlc3QgYnl0ZSB3ZSByZWFkIGlzIG5vbi16 ZXJvLCB3ZSBjYW4gYXNzdW1lCisgICAgICAgICAgICAgICAgLy8gdGhhdCBsaXR0bGUgZW5kaWFu IGZvcm1hdCBpcyB1c2VkLgorICAgICAgICAgICAgICAgIGF1dG8gdmFsdWUgPSAqcmVpbnRlcnBy ZXRfY2FzdDxjaGFyKj4oJm9uZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID8gTGl0 dGxlIDogQmlnOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHN0ZDo6 c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCB2b2lkICpvYmplY3QsIHN0ZDo6c2l6ZV90 IHNpemUgKSB7CisgICAgICAgIC8vIFJldmVyc2Ugb3JkZXIgZm9yIGxpdHRsZSBlbmRpYW4gYXJj aGl0ZWN0dXJlcworICAgICAgICBpbnQgaSA9IDAsIGVuZCA9IHN0YXRpY19jYXN0PGludD4oIHNp emUgKSwgaW5jID0gMTsKKyAgICAgICAgaWYoIEVuZGlhbm5lc3M6OndoaWNoKCkgPT0gRW5kaWFu bmVzczo6TGl0dGxlICkgeworICAgICAgICAgICAgaSA9IGVuZC0xOworICAgICAgICAgICAgZW5k ID0gaW5jID0gLTE7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpi eXRlcyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIgY29uc3QgKj4ob2JqZWN0KTsKKyAgICAg ICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAgICAgICByc3MgPDwgIjB4IiA8PCBzdGQ6 OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleDsKKyAgICAgICAgZm9yKCA7IGkgIT0gZW5kOyBpICs9 IGluYyApCisgICAgICAgICAgICAgcnNzIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGF0aWNfY2FzdDx1 bnNpZ25lZD4oYnl0ZXNbaV0pOworICAgICAgIHJldHVybiByc3Muc3RyKCk7CisgICAgfQorfQor Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgZnBUb1N0cmluZyggVCB2YWx1ZSwg aW50IHByZWNpc2lvbiApIHsKKyAgICBpZiAoQ2F0Y2g6OmlzbmFuKHZhbHVlKSkgeworICAgICAg ICByZXR1cm4gIm5hbiI7CisgICAgfQorCisgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOwor ICAgIHJzcyA8PCBzdGQ6OnNldHByZWNpc2lvbiggcHJlY2lzaW9uICkKKyAgICAgICAgPDwgc3Rk OjpmaXhlZAorICAgICAgICA8PCB2YWx1ZTsKKyAgICBzdGQ6OnN0cmluZyBkID0gcnNzLnN0cigp OworICAgIHN0ZDo6c2l6ZV90IGkgPSBkLmZpbmRfbGFzdF9ub3Rfb2YoICcwJyApOworICAgIGlm KCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGkgIT0gZC5zaXplKCktMSApIHsKKyAgICAgICAg aWYoIGRbaV0gPT0gJy4nICkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgZCA9IGQuc3Vic3Ry KCAwLCBpKzEgKTsKKyAgICB9CisgICAgcmV0dXJuIGQ7Cit9CisKKy8vLy8gPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLy8vCisvLworLy8g ICBPdXQtb2YtbGluZSBkZWZzIGZvciBmdWxsIHNwZWNpYWxpemF0aW9uIG9mIFN0cmluZ01ha2Vy CisvLworLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09IC8vLy8KKworc3RkOjpzdHJpbmcgU3RyaW5nTWFrZXI8c3RkOjpzdHJpbmc+Ojpj b252ZXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBpZiAoIWdldEN1cnJlbnRDb250 ZXh0KCkuZ2V0Q29uZmlnKCktPnNob3dJbnZpc2libGVzKCkpIHsKKyAgICAgICAgcmV0dXJuICci JyArIHN0ciArICciJzsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzKCJcIiIpOworICAgIGZv ciAoY2hhciBjIDogc3RyKSB7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdc bic6CisgICAgICAgICAgICBzLmFwcGVuZCgiXFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAg ICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgcy5hcHBlbmQoIlxcdCIpOworICAgICAgICAg ICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzLnB1c2hfYmFjayhjKTsK KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHMuYXBwZW5kKCJcIiIp OworICAgIHJldHVybiBzOworfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDE3X1NUUklOR19W SUVXCitzdGQ6OnN0cmluZyBTdHJpbmdNYWtlcjxzdGQ6OnN0cmluZ192aWV3Pjo6Y29udmVydChz dGQ6OnN0cmluZ192aWV3IHN0cikgeworICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmlu Z2lmeShzdGQ6OnN0cmluZ3sgc3RyIH0pOworfQorI2VuZGlmCisKK3N0ZDo6c3RyaW5nIFN0cmlu Z01ha2VyPGNoYXIgY29uc3QqPjo6Y29udmVydChjaGFyIGNvbnN0KiBzdHIpIHsKKyAgICBpZiAo c3RyKSB7CisgICAgICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGQ6OnN0 cmluZ3sgc3RyIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybnsgIntudWxsIHN0cmlu Z30iIH07CisgICAgfQorfQorc3RkOjpzdHJpbmcgU3RyaW5nTWFrZXI8Y2hhcio+Ojpjb252ZXJ0 KGNoYXIqIHN0cikgeworICAgIGlmIChzdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OkRl dGFpbDo6c3RyaW5naWZ5KHN0ZDo6c3RyaW5neyBzdHIgfSk7CisgICAgfSBlbHNlIHsKKyAgICAg ICAgcmV0dXJueyAie251bGwgc3RyaW5nfSIgfTsKKyAgICB9Cit9CisKKyNpZmRlZiBDQVRDSF9D T05GSUdfV0NIQVIKK3N0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPHN0ZDo6d3N0cmluZz46OmNvbnZl cnQoY29uc3Qgc3RkOjp3c3RyaW5nJiB3c3RyKSB7CisgICAgc3RkOjpzdHJpbmcgczsKKyAgICBz LnJlc2VydmUod3N0ci5zaXplKCkpOworICAgIGZvciAoYXV0byBjIDogd3N0cikgeworICAgICAg ICBzICs9IChjIDw9IDB4ZmYpID8gc3RhdGljX2Nhc3Q8Y2hhcj4oYykgOiAnPyc7CisgICAgfQor ICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzKTsKK30KKworIyBpZmRlZiBD QVRDSF9DT05GSUdfQ1BQMTdfU1RSSU5HX1ZJRVcKK3N0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPHN0 ZDo6d3N0cmluZ192aWV3Pjo6Y29udmVydChzdGQ6OndzdHJpbmdfdmlldyBzdHIpIHsKKyAgICBy ZXR1cm4gU3RyaW5nTWFrZXI8c3RkOjp3c3RyaW5nPjo6Y29udmVydChzdGQ6OndzdHJpbmcoc3Ry KSk7Cit9CisjIGVuZGlmCisKK3N0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPHdjaGFyX3QgY29uc3Qq Pjo6Y29udmVydCh3Y2hhcl90IGNvbnN0ICogc3RyKSB7CisgICAgaWYgKHN0cikgeworICAgICAg ICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoc3RkOjp3c3RyaW5neyBzdHIgfSk7 CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJueyAie251bGwgc3RyaW5nfSIgfTsKKyAgICB9 Cit9CitzdGQ6OnN0cmluZyBTdHJpbmdNYWtlcjx3Y2hhcl90ICo+Ojpjb252ZXJ0KHdjaGFyX3Qg KiBzdHIpIHsKKyAgICBpZiAoc3RyKSB7CisgICAgICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6 OnN0cmluZ2lmeShzdGQ6OndzdHJpbmd7IHN0ciB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBy ZXR1cm57ICJ7bnVsbCBzdHJpbmd9IiB9OworICAgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5l ZChDQVRDSF9DT05GSUdfQ1BQMTdfQllURSkKKyNpbmNsdWRlIDxjc3RkZGVmPgorc3RkOjpzdHJp bmcgU3RyaW5nTWFrZXI8c3RkOjpieXRlPjo6Y29udmVydChzdGQ6OmJ5dGUgdmFsdWUpIHsKKyAg ICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoc3RkOjp0b19pbnRlZ2VyPHVuc2ln bmVkIGxvbmcgbG9uZz4odmFsdWUpKTsKK30KKyNlbmRpZiAvLyBkZWZpbmVkKENBVENIX0NPTkZJ R19DUFAxN19CWVRFKQorCitzdGQ6OnN0cmluZyBTdHJpbmdNYWtlcjxpbnQ+Ojpjb252ZXJ0KGlu dCB2YWx1ZSkgeworICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGF0aWNf Y2FzdDxsb25nIGxvbmc+KHZhbHVlKSk7Cit9CitzdGQ6OnN0cmluZyBTdHJpbmdNYWtlcjxsb25n Pjo6Y29udmVydChsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIDo6Q2F0Y2g6OkRldGFpbDo6c3Ry aW5naWZ5KHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odmFsdWUpKTsKK30KK3N0ZDo6c3RyaW5nIFN0 cmluZ01ha2VyPGxvbmcgbG9uZz46OmNvbnZlcnQobG9uZyBsb25nIHZhbHVlKSB7CisgICAgUmV1 c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAgIHJzcyA8PCB2YWx1ZTsKKyAgICBpZiAodmFsdWUg PiBEZXRhaWw6OmhleFRocmVzaG9sZCkgeworICAgICAgICByc3MgPDwgIiAoMHgiIDw8IHN0ZDo6 aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICB9CisgICAgcmV0dXJuIHJzcy5zdHIoKTsKK30KKwor c3RkOjpzdHJpbmcgU3RyaW5nTWFrZXI8dW5zaWduZWQgaW50Pjo6Y29udmVydCh1bnNpZ25lZCBp bnQgdmFsdWUpIHsKKyAgICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoc3RhdGlj X2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPih2YWx1ZSkpOworfQorc3RkOjpzdHJpbmcgU3RyaW5n TWFrZXI8dW5zaWduZWQgbG9uZz46OmNvbnZlcnQodW5zaWduZWQgbG9uZyB2YWx1ZSkgeworICAg IHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGF0aWNfY2FzdDx1bnNpZ25lZCBs b25nIGxvbmc+KHZhbHVlKSk7Cit9CitzdGQ6OnN0cmluZyBTdHJpbmdNYWtlcjx1bnNpZ25lZCBs b25nIGxvbmc+Ojpjb252ZXJ0KHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSkgeworICAgIFJldXNh YmxlU3RyaW5nU3RyZWFtIHJzczsKKyAgICByc3MgPDwgdmFsdWU7CisgICAgaWYgKHZhbHVlID4g RGV0YWlsOjpoZXhUaHJlc2hvbGQpIHsKKyAgICAgICAgcnNzIDw8ICIgKDB4IiA8PCBzdGQ6Omhl eCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgfQorICAgIHJldHVybiByc3Muc3RyKCk7Cit9CisKK3N0 ZDo6c3RyaW5nIFN0cmluZ01ha2VyPGJvb2w+Ojpjb252ZXJ0KGJvb2wgYikgeworICAgIHJldHVy biBiID8gInRydWUiIDogImZhbHNlIjsKK30KKworc3RkOjpzdHJpbmcgU3RyaW5nTWFrZXI8c2ln bmVkIGNoYXI+Ojpjb252ZXJ0KHNpZ25lZCBjaGFyIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlID09 ICdccicpIHsKKyAgICAgICAgcmV0dXJuICInXFxyJyI7CisgICAgfSBlbHNlIGlmICh2YWx1ZSA9 PSAnXGYnKSB7CisgICAgICAgIHJldHVybiAiJ1xcZiciOworICAgIH0gZWxzZSBpZiAodmFsdWUg PT0gJ1xuJykgeworICAgICAgICByZXR1cm4gIidcXG4nIjsKKyAgICB9IGVsc2UgaWYgKHZhbHVl ID09ICdcdCcpIHsKKyAgICAgICAgcmV0dXJuICInXFx0JyI7CisgICAgfSBlbHNlIGlmICgnXDAn IDw9IHZhbHVlICYmIHZhbHVlIDwgJyAnKSB7CisgICAgICAgIHJldHVybiA6OkNhdGNoOjpEZXRh aWw6OnN0cmluZ2lmeShzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHZhbHVlKSk7CisgICAgfSBl bHNlIHsKKyAgICAgICAgY2hhciBjaHN0cltdID0gIicgJyI7CisgICAgICAgIGNoc3RyWzFdID0g dmFsdWU7CisgICAgICAgIHJldHVybiBjaHN0cjsKKyAgICB9Cit9CitzdGQ6OnN0cmluZyBTdHJp bmdNYWtlcjxjaGFyPjo6Y29udmVydChjaGFyIGMpIHsKKyAgICByZXR1cm4gOjpDYXRjaDo6RGV0 YWlsOjpzdHJpbmdpZnkoc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KGMpKTsKK30KK3N0ZDo6c3Ry aW5nIFN0cmluZ01ha2VyPHVuc2lnbmVkIGNoYXI+Ojpjb252ZXJ0KHVuc2lnbmVkIGNoYXIgYykg eworICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGF0aWNfY2FzdDxjaGFy PihjKSk7Cit9CisKK3N0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPHN0ZDo6bnVsbHB0cl90Pjo6Y29u dmVydChzdGQ6Om51bGxwdHJfdCkgeworICAgIHJldHVybiAibnVsbHB0ciI7Cit9CisKK2ludCBT dHJpbmdNYWtlcjxmbG9hdD46OnByZWNpc2lvbiA9IDU7CisKK3N0ZDo6c3RyaW5nIFN0cmluZ01h a2VyPGZsb2F0Pjo6Y29udmVydChmbG9hdCB2YWx1ZSkgeworICAgIHJldHVybiBmcFRvU3RyaW5n KHZhbHVlLCBwcmVjaXNpb24pICsgJ2YnOworfQorCitpbnQgU3RyaW5nTWFrZXI8ZG91YmxlPjo6 cHJlY2lzaW9uID0gMTA7CisKK3N0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPGRvdWJsZT46OmNvbnZl cnQoZG91YmxlIHZhbHVlKSB7CisgICAgcmV0dXJuIGZwVG9TdHJpbmcodmFsdWUsIHByZWNpc2lv bik7Cit9CisKK3N0ZDo6c3RyaW5nIHJhdGlvX3N0cmluZzxzdGQ6OmF0dG8+OjpzeW1ib2woKSB7 IHJldHVybiAiYSI7IH0KK3N0ZDo6c3RyaW5nIHJhdGlvX3N0cmluZzxzdGQ6OmZlbXRvPjo6c3lt Ym9sKCkgeyByZXR1cm4gImYiOyB9CitzdGQ6OnN0cmluZyByYXRpb19zdHJpbmc8c3RkOjpwaWNv Pjo6c3ltYm9sKCkgeyByZXR1cm4gInAiOyB9CitzdGQ6OnN0cmluZyByYXRpb19zdHJpbmc8c3Rk OjpuYW5vPjo6c3ltYm9sKCkgeyByZXR1cm4gIm4iOyB9CitzdGQ6OnN0cmluZyByYXRpb19zdHJp bmc8c3RkOjptaWNybz46OnN5bWJvbCgpIHsgcmV0dXJuICJ1IjsgfQorc3RkOjpzdHJpbmcgcmF0 aW9fc3RyaW5nPHN0ZDo6bWlsbGk+OjpzeW1ib2woKSB7IHJldHVybiAibSI7IH0KKworfSAvLyBl bmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyMgICAgcHJhZ21h IGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworLy8gZW5kIGNhdGNoX3Rvc3RyaW5nLmNw cAorLy8gc3RhcnQgY2F0Y2hfdG90YWxzLmNwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAg Q291bnRzIENvdW50czo6b3BlcmF0b3IgLSAoIENvdW50cyBjb25zdCYgb3RoZXIgKSBjb25zdCB7 CisgICAgICAgIENvdW50cyBkaWZmOworICAgICAgICBkaWZmLnBhc3NlZCA9IHBhc3NlZCAtIG90 aGVyLnBhc3NlZDsKKyAgICAgICAgZGlmZi5mYWlsZWQgPSBmYWlsZWQgLSBvdGhlci5mYWlsZWQ7 CisgICAgICAgIGRpZmYuZmFpbGVkQnV0T2sgPSBmYWlsZWRCdXRPayAtIG90aGVyLmZhaWxlZEJ1 dE9rOworICAgICAgICByZXR1cm4gZGlmZjsKKyAgICB9CisKKyAgICBDb3VudHMmIENvdW50czo6 b3BlcmF0b3IgKz0gKCBDb3VudHMgY29uc3QmIG90aGVyICkgeworICAgICAgICBwYXNzZWQgKz0g b3RoZXIucGFzc2VkOworICAgICAgICBmYWlsZWQgKz0gb3RoZXIuZmFpbGVkOworICAgICAgICBm YWlsZWRCdXRPayArPSBvdGhlci5mYWlsZWRCdXRPazsKKyAgICAgICAgcmV0dXJuICp0aGlzOwor ICAgIH0KKworICAgIHN0ZDo6c2l6ZV90IENvdW50czo6dG90YWwoKSBjb25zdCB7CisgICAgICAg IHJldHVybiBwYXNzZWQgKyBmYWlsZWQgKyBmYWlsZWRCdXRPazsKKyAgICB9CisgICAgYm9vbCBD b3VudHM6OmFsbFBhc3NlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGZhaWxlZCA9PSAwICYm IGZhaWxlZEJ1dE9rID09IDA7CisgICAgfQorICAgIGJvb2wgQ291bnRzOjphbGxPaygpIGNvbnN0 IHsKKyAgICAgICAgcmV0dXJuIGZhaWxlZCA9PSAwOworICAgIH0KKworICAgIFRvdGFscyBUb3Rh bHM6Om9wZXJhdG9yIC0gKCBUb3RhbHMgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICBU b3RhbHMgZGlmZjsKKyAgICAgICAgZGlmZi5hc3NlcnRpb25zID0gYXNzZXJ0aW9ucyAtIG90aGVy LmFzc2VydGlvbnM7CisgICAgICAgIGRpZmYudGVzdENhc2VzID0gdGVzdENhc2VzIC0gb3RoZXIu dGVzdENhc2VzOworICAgICAgICByZXR1cm4gZGlmZjsKKyAgICB9CisKKyAgICBUb3RhbHMmIFRv dGFsczo6b3BlcmF0b3IgKz0gKCBUb3RhbHMgY29uc3QmIG90aGVyICkgeworICAgICAgICBhc3Nl cnRpb25zICs9IG90aGVyLmFzc2VydGlvbnM7CisgICAgICAgIHRlc3RDYXNlcyArPSBvdGhlci50 ZXN0Q2FzZXM7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBUb3RhbHMgVG90 YWxzOjpkZWx0YSggVG90YWxzIGNvbnN0JiBwcmV2VG90YWxzICkgY29uc3QgeworICAgICAgICBU b3RhbHMgZGlmZiA9ICp0aGlzIC0gcHJldlRvdGFsczsKKyAgICAgICAgaWYoIGRpZmYuYXNzZXJ0 aW9ucy5mYWlsZWQgPiAwICkKKyAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMuZmFpbGVkOwor ICAgICAgICBlbHNlIGlmKCBkaWZmLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgPiAwICkKKyAgICAg ICAgICAgICsrZGlmZi50ZXN0Q2FzZXMuZmFpbGVkQnV0T2s7CisgICAgICAgIGVsc2UKKyAgICAg ICAgICAgICsrZGlmZi50ZXN0Q2FzZXMucGFzc2VkOworICAgICAgICByZXR1cm4gZGlmZjsKKyAg ICB9CisKK30KKy8vIGVuZCBjYXRjaF90b3RhbHMuY3BwCisvLyBzdGFydCBjYXRjaF91bmNhdWdo dF9leGNlcHRpb25zLmNwcAorCisvLyBzdGFydCBjYXRjaF9jb25maWdfdW5jYXVnaHRfZXhjZXB0 aW9ucy5ocHAKKworLy8gICAgICAgICAgICAgIENvcHlyaWdodCBDYXRjaDIgQXV0aG9ycworLy8g RGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4w LgorLy8gICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0 CisvLyAgICAgICAgaHR0cHM6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTTC0xLjAKKworI2lmbmRlZiBDQVRDSF9DT05GSUdf VU5DQVVHSFRfRVhDRVBUSU9OU19IUFAKKyNkZWZpbmUgQ0FUQ0hfQ09ORklHX1VOQ0FVR0hUX0VY Q0VQVElPTlNfSFBQCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgaWYgX01TQ19WRVIgPj0g MTkwMCAvLyBWaXN1YWwgU3R1ZGlvIDIwMTUgb3IgbmV3ZXIKKyMgICAgZGVmaW5lIENBVENIX0lO VEVSTkFMX0NPTkZJR19DUFAxN19VTkNBVUdIVF9FWENFUFRJT05TCisjICBlbmRpZgorI2VuZGlm CisKKyNpbmNsdWRlIDxleGNlcHRpb24+CisKKyNpZiBkZWZpbmVkKF9fY3BwX2xpYl91bmNhdWdo dF9leGNlcHRpb25zKSBcCisgICAgJiYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQ UDE3X1VOQ0FVR0hUX0VYQ0VQVElPTlMpCisKKyMgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05G SUdfQ1BQMTdfVU5DQVVHSFRfRVhDRVBUSU9OUworI2VuZGlmIC8vIF9fY3BwX2xpYl91bmNhdWdo dF9leGNlcHRpb25zCisKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxN19V TkNBVUdIVF9FWENFUFRJT05TKSBcCisgICAgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQ UDE3X1VOQ0FVR0hUX0VYQ0VQVElPTlMpIFwKKyAgICAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdf Q1BQMTdfVU5DQVVHSFRfRVhDRVBUSU9OUykKKworIyAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAx N19VTkNBVUdIVF9FWENFUFRJT05TCisjZW5kaWYKKworI2VuZGlmIC8vIENBVENIX0NPTkZJR19V TkNBVUdIVF9FWENFUFRJT05TX0hQUAorLy8gZW5kIGNhdGNoX2NvbmZpZ191bmNhdWdodF9leGNl cHRpb25zLmhwcAorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKworbmFtZXNwYWNlIENhdGNoIHsKKyAg ICBib29sIHVuY2F1Z2h0X2V4Y2VwdGlvbnMoKSB7CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdf RElTQUJMRV9FWENFUFRJT05TKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZWxpZiBkZWZpbmVk KENBVENIX0NPTkZJR19DUFAxN19VTkNBVUdIVF9FWENFUFRJT05TKQorICAgICAgICByZXR1cm4g c3RkOjp1bmNhdWdodF9leGNlcHRpb25zKCkgPiAwOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIHN0 ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCk7CisjZW5kaWYKKyAgfQorfSAvLyBlbmQgbmFtZXNwYWNl IENhdGNoCisvLyBlbmQgY2F0Y2hfdW5jYXVnaHRfZXhjZXB0aW9ucy5jcHAKKy8vIHN0YXJ0IGNh dGNoX3ZlcnNpb24uY3BwCisKKyNpbmNsdWRlIDxvc3RyZWFtPgorCituYW1lc3BhY2UgQ2F0Y2gg eworCisgICAgVmVyc2lvbjo6VmVyc2lvbgorICAgICAgICAoICAgdW5zaWduZWQgaW50IF9tYWpv clZlcnNpb24sCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX21pbm9yVmVyc2lvbiwKKyAgICAg ICAgICAgIHVuc2lnbmVkIGludCBfcGF0Y2hOdW1iZXIsCisgICAgICAgICAgICBjaGFyIGNvbnN0 ICogY29uc3QgX2JyYW5jaE5hbWUsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX2J1aWxkTnVt YmVyICkKKyAgICA6ICAgbWFqb3JWZXJzaW9uKCBfbWFqb3JWZXJzaW9uICksCisgICAgICAgIG1p bm9yVmVyc2lvbiggX21pbm9yVmVyc2lvbiApLAorICAgICAgICBwYXRjaE51bWJlciggX3BhdGNo TnVtYmVyICksCisgICAgICAgIGJyYW5jaE5hbWUoIF9icmFuY2hOYW1lICksCisgICAgICAgIGJ1 aWxkTnVtYmVyKCBfYnVpbGROdW1iZXIgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9w ZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgVmVyc2lvbiBjb25zdCYgdmVyc2lvbiApIHsK KyAgICAgICAgb3MgIDw8IHZlcnNpb24ubWFqb3JWZXJzaW9uIDw8ICcuJworICAgICAgICAgICAg PDwgdmVyc2lvbi5taW5vclZlcnNpb24gPDwgJy4nCisgICAgICAgICAgICA8PCB2ZXJzaW9uLnBh dGNoTnVtYmVyOworICAgICAgICAvLyBicmFuY2hOYW1lIGlzIG5ldmVyIG51bGwgLT4gMHRoIGNo YXIgaXMgXDAgaWYgaXQgaXMgZW1wdHkKKyAgICAgICAgaWYgKHZlcnNpb24uYnJhbmNoTmFtZVsw XSkgeworICAgICAgICAgICAgb3MgPDwgJy0nIDw8IHZlcnNpb24uYnJhbmNoTmFtZQorICAgICAg ICAgICAgICAgPDwgJy4nIDw8IHZlcnNpb24uYnVpbGROdW1iZXI7CisgICAgICAgIH0KKyAgICAg ICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIFZlcnNpb24gY29uc3QmIGxpYnJhcnlWZXJzaW9u KCkgeworICAgICAgICBzdGF0aWMgVmVyc2lvbiB2ZXJzaW9uKCAyLCAxMywgOCwgIiIsIDAgKTsK KyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCit9CisvLyBlbmQgY2F0Y2hfdmVyc2lv bi5jcHAKKy8vIHN0YXJ0IGNhdGNoX3dpbGRjYXJkX3BhdHRlcm4uY3BwCisKK25hbWVzcGFjZSBD YXRjaCB7CisKKyAgICBXaWxkY2FyZFBhdHRlcm46OldpbGRjYXJkUGF0dGVybiggc3RkOjpzdHJp bmcgY29uc3QmIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKQorICAgIDogICBtX2Nhc2VT ZW5zaXRpdml0eSggY2FzZVNlbnNpdGl2aXR5ICksCisgICAgICAgIG1fcGF0dGVybiggbm9ybWFs aXNlU3RyaW5nKCBwYXR0ZXJuICkgKQorICAgIHsKKyAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1f cGF0dGVybiwgJyonICkgKSB7CisgICAgICAgICAgICBtX3BhdHRlcm4gPSBtX3BhdHRlcm4uc3Vi c3RyKCAxICk7CisgICAgICAgICAgICBtX3dpbGRjYXJkID0gV2lsZGNhcmRBdFN0YXJ0OworICAg ICAgICB9CisgICAgICAgIGlmKCBlbmRzV2l0aCggbV9wYXR0ZXJuLCAnKicgKSApIHsKKyAgICAg ICAgICAgIG1fcGF0dGVybiA9IG1fcGF0dGVybi5zdWJzdHIoIDAsIG1fcGF0dGVybi5zaXplKCkt MSApOworICAgICAgICAgICAgbV93aWxkY2FyZCA9IHN0YXRpY19jYXN0PFdpbGRjYXJkUG9zaXRp b24+KCBtX3dpbGRjYXJkIHwgV2lsZGNhcmRBdEVuZCApOworICAgICAgICB9CisgICAgfQorCisg ICAgYm9vbCBXaWxkY2FyZFBhdHRlcm46Om1hdGNoZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIg KSBjb25zdCB7CisgICAgICAgIHN3aXRjaCggbV93aWxkY2FyZCApIHsKKyAgICAgICAgICAgIGNh c2UgTm9XaWxkY2FyZDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wYXR0ZXJuID09IG5vcm1h bGlzZVN0cmluZyggc3RyICk7CisgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRTdGFydDoKKyAg ICAgICAgICAgICAgICByZXR1cm4gZW5kc1dpdGgoIG5vcm1hbGlzZVN0cmluZyggc3RyICksIG1f cGF0dGVybiApOworICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0RW5kOgorICAgICAgICAgICAg ICAgIHJldHVybiBzdGFydHNXaXRoKCBub3JtYWxpc2VTdHJpbmcoIHN0ciApLCBtX3BhdHRlcm4g KTsKKyAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdEJvdGhFbmRzOgorICAgICAgICAgICAgICAg IHJldHVybiBjb250YWlucyggbm9ybWFsaXNlU3RyaW5nKCBzdHIgKSwgbV9wYXR0ZXJuICk7Cisg ICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9S KCAiVW5rbm93biBlbnVtIiApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcg V2lsZGNhcmRQYXR0ZXJuOjpub3JtYWxpc2VTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIg KSBjb25zdCB7CisgICAgICAgIHJldHVybiB0cmltKCBtX2Nhc2VTZW5zaXRpdml0eSA9PSBDYXNl U2Vuc2l0aXZlOjpObyA/IHRvTG93ZXIoIHN0ciApIDogc3RyICk7CisgICAgfQorfQorLy8gZW5k IGNhdGNoX3dpbGRjYXJkX3BhdHRlcm4uY3BwCisvLyBzdGFydCBjYXRjaF94bWx3cml0ZXIuY3Bw CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3Bh Y2UgQ2F0Y2ggeworCituYW1lc3BhY2UgeworCisgICAgc2l6ZV90IHRyYWlsaW5nQnl0ZXModW5z aWduZWQgY2hhciBjKSB7CisgICAgICAgIGlmICgoYyAmIDB4RTApID09IDB4QzApIHsKKyAgICAg ICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIGlmICgoYyAmIDB4RjApID09IDB4 RTApIHsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9CisgICAgICAgIGlmICgoYyAm IDB4RjgpID09IDB4RjApIHsKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICB9CisgICAg ICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCJJbnZhbGlkIG11bHRpYnl0ZSB1dGYtOCBzdGFydCBi eXRlIGVuY291bnRlcmVkIik7CisgICAgfQorCisgICAgdWludDMyX3QgaGVhZGVyVmFsdWUodW5z aWduZWQgY2hhciBjKSB7CisgICAgICAgIGlmICgoYyAmIDB4RTApID09IDB4QzApIHsKKyAgICAg ICAgICAgIHJldHVybiBjICYgMHgxRjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGMgJiAweEYw KSA9PSAweEUwKSB7CisgICAgICAgICAgICByZXR1cm4gYyAmIDB4MEY7CisgICAgICAgIH0KKyAg ICAgICAgaWYgKChjICYgMHhGOCkgPT0gMHhGMCkgeworICAgICAgICAgICAgcmV0dXJuIGMgJiAw eDA3OworICAgICAgICB9CisgICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCJJbnZhbGlkIG11 bHRpYnl0ZSB1dGYtOCBzdGFydCBieXRlIGVuY291bnRlcmVkIik7CisgICAgfQorCisgICAgdm9p ZCBoZXhFc2NhcGVDaGFyKHN0ZDo6b3N0cmVhbSYgb3MsIHVuc2lnbmVkIGNoYXIgYykgeworICAg ICAgICBzdGQ6Omlvc19iYXNlOjpmbXRmbGFncyBmKG9zLmZsYWdzKCkpOworICAgICAgICBvcyA8 PCAiXFx4IgorICAgICAgICAgICAgPDwgc3RkOjp1cHBlcmNhc2UgPDwgc3RkOjpoZXggPDwgc3Rk OjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpCisgICAgICAgICAgICA8PCBzdGF0aWNfY2Fz dDxpbnQ+KGMpOworICAgICAgICBvcy5mbGFncyhmKTsKKyAgICB9CisKKyAgICBib29sIHNob3Vs ZE5ld2xpbmUoWG1sRm9ybWF0dGluZyBmbXQpIHsKKyAgICAgICAgcmV0dXJuICEhKHN0YXRpY19j YXN0PHN0ZDo6dW5kZXJseWluZ190eXBlPFhtbEZvcm1hdHRpbmc+Ojp0eXBlPihmbXQgJiBYbWxG b3JtYXR0aW5nOjpOZXdsaW5lKSk7CisgICAgfQorCisgICAgYm9vbCBzaG91bGRJbmRlbnQoWG1s Rm9ybWF0dGluZyBmbXQpIHsKKyAgICAgICAgcmV0dXJuICEhKHN0YXRpY19jYXN0PHN0ZDo6dW5k ZXJseWluZ190eXBlPFhtbEZvcm1hdHRpbmc+Ojp0eXBlPihmbXQgJiBYbWxGb3JtYXR0aW5nOjpJ bmRlbnQpKTsKKyAgICB9CisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisgICAgWG1sRm9y bWF0dGluZyBvcGVyYXRvciB8IChYbWxGb3JtYXR0aW5nIGxocywgWG1sRm9ybWF0dGluZyByaHMp IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFhtbEZvcm1hdHRpbmc+KAorICAgICAgICAg ICAgc3RhdGljX2Nhc3Q8c3RkOjp1bmRlcmx5aW5nX3R5cGU8WG1sRm9ybWF0dGluZz46OnR5cGU+ KGxocykgfAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3RkOjp1bmRlcmx5aW5nX3R5cGU8WG1s Rm9ybWF0dGluZz46OnR5cGU+KHJocykKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBYbWxGb3Jt YXR0aW5nIG9wZXJhdG9yICYgKFhtbEZvcm1hdHRpbmcgbGhzLCBYbWxGb3JtYXR0aW5nIHJocykg eworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8WG1sRm9ybWF0dGluZz4oCisgICAgICAgICAg ICBzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZTxYbWxGb3JtYXR0aW5nPjo6dHlwZT4o bGhzKSAmCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZTxYbWxG b3JtYXR0aW5nPjo6dHlwZT4ocmhzKQorICAgICAgICApOworICAgIH0KKworICAgIFhtbEVuY29k ZTo6WG1sRW5jb2RlKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBGb3JXaGF0IGZvcldoYXQgKQor ICAgIDogICBtX3N0ciggc3RyICksCisgICAgICAgIG1fZm9yV2hhdCggZm9yV2hhdCApCisgICAg e30KKworICAgIHZvaWQgWG1sRW5jb2RlOjplbmNvZGVUbyggc3RkOjpvc3RyZWFtJiBvcyApIGNv bnN0IHsKKyAgICAgICAgLy8gQXBvc3Ryb3BoZSBlc2NhcGluZyBub3QgbmVjZXNzYXJ5IGlmIHdl IGFsd2F5cyB1c2UgIiB0byB3cml0ZSBhdHRyaWJ1dGVzCisgICAgICAgIC8vIChzZWU6IGh0dHA6 Ly93d3cudzMub3JnL1RSL3htbC8jc3ludGF4KQorCisgICAgICAgIGZvciggc3RkOjpzaXplX3Qg aWR4ID0gMDsgaWR4IDwgbV9zdHIuc2l6ZSgpOyArKyBpZHggKSB7CisgICAgICAgICAgICB1bnNp Z25lZCBjaGFyIGMgPSBtX3N0cltpZHhdOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAg ICAgICAgICBjYXNlICc8JzogICBvcyA8PCAiJmx0OyI7IGJyZWFrOworICAgICAgICAgICAgY2Fz ZSAnJic6ICAgb3MgPDwgIiZhbXA7IjsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJz4nOgor ICAgICAgICAgICAgICAgIC8vIFNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNzeW50YXgK KyAgICAgICAgICAgICAgICBpZiAoaWR4ID4gMiAmJiBtX3N0cltpZHggLSAxXSA9PSAnXScgJiYg bV9zdHJbaWR4IC0gMl0gPT0gJ10nKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiJmd0OyI7 CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvcyA8PCBjOworICAg ICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAg ICAgICAgaWYgKG1fZm9yV2hhdCA9PSBGb3JBdHRyaWJ1dGVzKQorICAgICAgICAgICAgICAgICAg ICBvcyA8PCAiJnF1b3Q7IjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg ICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1 bHQ6CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQg aW52YWxpZCB1dGYtOAorCisgICAgICAgICAgICAgICAgLy8gRXNjYXBlIGNvbnRyb2wgY2hhcmFj dGVycyBpbiBzdGFuZGFyZCBhc2NpaQorICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vc3Rh Y2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwNDEwNy93aHktYXJlLWNvbnRyb2wtY2hhcmFjdGVy cy1pbGxlZ2FsLWluLXhtbC0xLTAKKyAgICAgICAgICAgICAgICBpZiAoYyA8IDB4MDkgfHwgKGMg PiAweDBEICYmIGMgPCAweDIwKSB8fCBjID09IDB4N0YpIHsKKyAgICAgICAgICAgICAgICAgICAg aGV4RXNjYXBlQ2hhcihvcywgYyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFBsYWluIEFTQ0lJOiBXcml0ZSBpdCB0 byBzdHJlYW0KKyAgICAgICAgICAgICAgICBpZiAoYyA8IDB4N0YpIHsKKyAgICAgICAgICAgICAg ICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg ICAgfQorCisgICAgICAgICAgICAgICAgLy8gVVRGLTggdGVycml0b3J5CisgICAgICAgICAgICAg ICAgLy8gQ2hlY2sgaWYgdGhlIGVuY29kaW5nIGlzIHZhbGlkIGFuZCBpZiBpdCBpcyBub3QsIGhl eCBlc2NhcGUgYnl0ZXMuCisgICAgICAgICAgICAgICAgLy8gSW1wb3J0YW50OiBXZSBkbyBub3Qg Y2hlY2sgdGhlIGV4YWN0IGRlY29kZWQgdmFsdWVzIGZvciB2YWxpZGl0eSwgb25seSB0aGUgZW5j b2RpbmcgZm9ybWF0CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhhdCB0aGlzIGJ5 dGVzIGlzIGEgdmFsaWQgbGVhZCBieXRlOgorICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMg dGhhdCBpdCBpcyBub3QgZW5jb2RlZCBhcyAxMTExIDFYWFgKKyAgICAgICAgICAgICAgICAvLyBP ciBhcyAxMFhYIFhYWFgKKyAgICAgICAgICAgICAgICBpZiAoYyA8ICAweEMwIHx8CisgICAgICAg ICAgICAgICAgICAgIGMgPj0gMHhGOCkgeworICAgICAgICAgICAgICAgICAgICBoZXhFc2NhcGVD aGFyKG9zLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg fQorCisgICAgICAgICAgICAgICAgYXV0byBlbmNCeXRlcyA9IHRyYWlsaW5nQnl0ZXMoYyk7Cisg ICAgICAgICAgICAgICAgLy8gQXJlIHRoZXJlIGVub3VnaCBieXRlcyBsZWZ0IHRvIGF2b2lkIGFj Y2Vzc2luZyBvdXQtb2YtYm91bmRzIG1lbW9yeT8KKyAgICAgICAgICAgICAgICBpZiAoaWR4ICsg ZW5jQnl0ZXMgLSAxID49IG1fc3RyLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBoZXhF c2NhcGVDaGFyKG9zLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRoZSBoZWFkZXIgaXMgdmFsaWQsIGNoZWNrIGRh dGEKKyAgICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBlbmNCeXRlcyBieXRlcyBtdXN0IHRvZ2V0 aGVyIGJlIGEgdmFsaWQgdXRmLTgKKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zOiBiaXRw YXR0ZXJuIDEwWFggWFhYWCBhbmQgdGhlIGV4dHJhY3RlZCB2YWx1ZSBpcyBzYW5lIChpc2gpCisg ICAgICAgICAgICAgICAgYm9vbCB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdWludDMy X3QgdmFsdWUgPSBoZWFkZXJWYWx1ZShjKTsKKyAgICAgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6 ZV90IG4gPSAxOyBuIDwgZW5jQnl0ZXM7ICsrbikgeworICAgICAgICAgICAgICAgICAgICB1bnNp Z25lZCBjaGFyIG5jID0gbV9zdHJbaWR4ICsgbl07CisgICAgICAgICAgICAgICAgICAgIHZhbGlk ICY9ICgobmMgJiAweEMwKSA9PSAweDgwKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAo dmFsdWUgPDwgNikgfCAobmMgJiAweDNGKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg ICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIC8vIFdyb25nIGJpdCBwYXR0ZXJuIG9m IGZvbGxvd2luZyBieXRlcworICAgICAgICAgICAgICAgICAgICAoIXZhbGlkKSB8fAorICAgICAg ICAgICAgICAgICAgICAvLyBPdmVybG9uZyBlbmNvZGluZ3MKKyAgICAgICAgICAgICAgICAgICAg KHZhbHVlIDwgMHg4MCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKDB4ODAgPD0gdmFsdWUgJiYg dmFsdWUgPCAweDgwMCAgICYmIGVuY0J5dGVzID4gMikgfHwKKyAgICAgICAgICAgICAgICAgICAg KDB4ODAwIDwgdmFsdWUgJiYgdmFsdWUgPCAweDEwMDAwICYmIGVuY0J5dGVzID4gMykgfHwKKyAg ICAgICAgICAgICAgICAgICAgLy8gRW5jb2RlZCB2YWx1ZSBvdXQgb2YgcmFuZ2UKKyAgICAgICAg ICAgICAgICAgICAgKHZhbHVlID49IDB4MTEwMDAwKQorICAgICAgICAgICAgICAgICAgICApIHsK KyAgICAgICAgICAgICAgICAgICAgaGV4RXNjYXBlQ2hhcihvcywgYyk7CisgICAgICAgICAgICAg ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElm IHdlIGdvdCBoZXJlLCB0aGlzIGlzIGluIGZhY3QgYSB2YWxpZChpc2gpIHV0Zi04IHNlcXVlbmNl CisgICAgICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBuID0gMDsgbiA8IGVuY0J5dGVzOyAr K24pIHsKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgbV9zdHJbaWR4ICsgbl07CisgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlkeCArPSBlbmNCeXRlcyAtIDE7CisgICAgICAg ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBz dGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgWG1sRW5jb2RlIGNv bnN0JiB4bWxFbmNvZGUgKSB7CisgICAgICAgIHhtbEVuY29kZS5lbmNvZGVUbyggb3MgKTsKKyAg ICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudDo6 U2NvcGVkRWxlbWVudCggWG1sV3JpdGVyKiB3cml0ZXIsIFhtbEZvcm1hdHRpbmcgZm10ICkKKyAg ICA6ICAgbV93cml0ZXIoIHdyaXRlciApLAorICAgICAgICBtX2ZtdChmbXQpCisgICAge30KKwor ICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudDo6U2NvcGVkRWxlbWVudCggU2NvcGVkRWxlbWVu dCYmIG90aGVyICkgbm9leGNlcHQKKyAgICA6ICAgbV93cml0ZXIoIG90aGVyLm1fd3JpdGVyICks CisgICAgICAgIG1fZm10KG90aGVyLm1fZm10KQorICAgIHsKKyAgICAgICAgb3RoZXIubV93cml0 ZXIgPSBudWxscHRyOworICAgICAgICBvdGhlci5tX2ZtdCA9IFhtbEZvcm1hdHRpbmc6Ok5vbmU7 CisgICAgfQorICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCYgWG1sV3JpdGVyOjpTY29wZWRF bGVtZW50OjpvcGVyYXRvcj0oIFNjb3BlZEVsZW1lbnQmJiBvdGhlciApIG5vZXhjZXB0IHsKKyAg ICAgICAgaWYgKCBtX3dyaXRlciApIHsKKyAgICAgICAgICAgIG1fd3JpdGVyLT5lbmRFbGVtZW50 KCk7CisgICAgICAgIH0KKyAgICAgICAgbV93cml0ZXIgPSBvdGhlci5tX3dyaXRlcjsKKyAgICAg ICAgb3RoZXIubV93cml0ZXIgPSBudWxscHRyOworICAgICAgICBtX2ZtdCA9IG90aGVyLm1fZm10 OworICAgICAgICBvdGhlci5tX2ZtdCA9IFhtbEZvcm1hdHRpbmc6Ok5vbmU7CisgICAgICAgIHJl dHVybiAqdGhpczsKKyAgICB9CisKKyAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQ6On5TY29w ZWRFbGVtZW50KCkgeworICAgICAgICBpZiAobV93cml0ZXIpIHsKKyAgICAgICAgICAgIG1fd3Jp dGVyLT5lbmRFbGVtZW50KG1fZm10KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFhtbFdyaXRl cjo6U2NvcGVkRWxlbWVudCYgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50Ojp3cml0ZVRleHQoIHN0 ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBYbWxGb3JtYXR0aW5nIGZtdCApIHsKKyAgICAgICAgbV93 cml0ZXItPndyaXRlVGV4dCggdGV4dCwgZm10ICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAg ICB9CisKKyAgICBYbWxXcml0ZXI6OlhtbFdyaXRlciggc3RkOjpvc3RyZWFtJiBvcyApIDogbV9v cyggb3MgKQorICAgIHsKKyAgICAgICAgd3JpdGVEZWNsYXJhdGlvbigpOworICAgIH0KKworICAg IFhtbFdyaXRlcjo6flhtbFdyaXRlcigpIHsKKyAgICAgICAgd2hpbGUgKCFtX3RhZ3MuZW1wdHko KSkgeworICAgICAgICAgICAgZW5kRWxlbWVudCgpOworICAgICAgICB9CisgICAgICAgIG5ld2xp bmVJZk5lY2Vzc2FyeSgpOworICAgIH0KKworICAgIFhtbFdyaXRlciYgWG1sV3JpdGVyOjpzdGFy dEVsZW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBYbWxGb3JtYXR0aW5nIGZtdCApIHsK KyAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgIG5ld2xpbmVJZk5lY2Vzc2FyeSgp OworICAgICAgICBpZiAoc2hvdWxkSW5kZW50KGZtdCkpIHsKKyAgICAgICAgICAgIG1fb3MgPDwg bV9pbmRlbnQ7CisgICAgICAgICAgICBtX2luZGVudCArPSAiICAiOworICAgICAgICB9CisgICAg ICAgIG1fb3MgPDwgJzwnIDw8IG5hbWU7CisgICAgICAgIG1fdGFncy5wdXNoX2JhY2soIG5hbWUg KTsKKyAgICAgICAgbV90YWdJc09wZW4gPSB0cnVlOworICAgICAgICBhcHBseUZvcm1hdHRpbmco Zm10KTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFhtbFdyaXRlcjo6U2Nv cGVkRWxlbWVudCBYbWxXcml0ZXI6OnNjb3BlZEVsZW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBu YW1lLCBYbWxGb3JtYXR0aW5nIGZtdCApIHsKKyAgICAgICAgU2NvcGVkRWxlbWVudCBzY29wZWQo IHRoaXMsIGZtdCApOworICAgICAgICBzdGFydEVsZW1lbnQoIG5hbWUsIGZtdCApOworICAgICAg ICByZXR1cm4gc2NvcGVkOworICAgIH0KKworICAgIFhtbFdyaXRlciYgWG1sV3JpdGVyOjplbmRF bGVtZW50KFhtbEZvcm1hdHRpbmcgZm10KSB7CisgICAgICAgIG1faW5kZW50ID0gbV9pbmRlbnQu c3Vic3RyKDAsIG1faW5kZW50LnNpemUoKSAtIDIpOworCisgICAgICAgIGlmKCBtX3RhZ0lzT3Bl biApIHsKKyAgICAgICAgICAgIG1fb3MgPDwgIi8+IjsKKyAgICAgICAgICAgIG1fdGFnSXNPcGVu ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdsaW5lSWZOZWNlc3Nh cnkoKTsKKyAgICAgICAgICAgIGlmIChzaG91bGRJbmRlbnQoZm10KSkgeworICAgICAgICAgICAg ICAgIG1fb3MgPDwgbV9pbmRlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX29zIDw8 ICI8LyIgPDwgbV90YWdzLmJhY2soKSA8PCAiPiI7CisgICAgICAgIH0KKyAgICAgICAgbV9vcyA8 PCBzdGQ6OmZsdXNoOworICAgICAgICBhcHBseUZvcm1hdHRpbmcoZm10KTsKKyAgICAgICAgbV90 YWdzLnBvcF9iYWNrKCk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBYbWxX cml0ZXImIFhtbFdyaXRlcjo6d3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1l LCBzdGQ6OnN0cmluZyBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICBpZiggIW5hbWUuZW1w dHkoKSAmJiAhYXR0cmlidXRlLmVtcHR5KCkgKQorICAgICAgICAgICAgbV9vcyA8PCAnICcgPDwg bmFtZSA8PCAiPVwiIiA8PCBYbWxFbmNvZGUoIGF0dHJpYnV0ZSwgWG1sRW5jb2RlOjpGb3JBdHRy aWJ1dGVzICkgPDwgJyInOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgWG1s V3JpdGVyJiBYbWxXcml0ZXI6OndyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFt ZSwgYm9vbCBhdHRyaWJ1dGUgKSB7CisgICAgICAgIG1fb3MgPDwgJyAnIDw8IG5hbWUgPDwgIj1c IiIgPDwgKCBhdHRyaWJ1dGUgPyAidHJ1ZSIgOiAiZmFsc2UiICkgPDwgJyInOworICAgICAgICBy ZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgWG1sV3JpdGVyJiBYbWxXcml0ZXI6OndyaXRlVGV4 dCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIFhtbEZvcm1hdHRpbmcgZm10KSB7CisgICAgICAg IGlmKCAhdGV4dC5lbXB0eSgpICl7CisgICAgICAgICAgICBib29sIHRhZ1dhc09wZW4gPSBtX3Rh Z0lzT3BlbjsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgaWYg KHRhZ1dhc09wZW4gJiYgc2hvdWxkSW5kZW50KGZtdCkpIHsKKyAgICAgICAgICAgICAgICBtX29z IDw8IG1faW5kZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9vcyA8PCBYbWxFbmNv ZGUoIHRleHQgKTsKKyAgICAgICAgICAgIGFwcGx5Rm9ybWF0dGluZyhmbXQpOworICAgICAgICB9 CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBYbWxXcml0ZXImIFhtbFdyaXRl cjo6d3JpdGVDb21tZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCwgWG1sRm9ybWF0dGluZyBm bXQpIHsKKyAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgIGlmIChzaG91bGRJbmRl bnQoZm10KSkgeworICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudDsKKyAgICAgICAgfQorICAg ICAgICBtX29zIDw8ICI8IS0tIiA8PCB0ZXh0IDw8ICItLT4iOworICAgICAgICBhcHBseUZvcm1h dHRpbmcoZm10KTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQgWG1s V3JpdGVyOjp3cml0ZVN0eWxlc2hlZXRSZWYoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1cmwgKSB7Cisg ICAgICAgIG1fb3MgPDwgIjw/eG1sLXN0eWxlc2hlZXQgdHlwZT1cInRleHQveHNsXCIgaHJlZj1c IiIgPDwgdXJsIDw8ICJcIj8+XG4iOworICAgIH0KKworICAgIFhtbFdyaXRlciYgWG1sV3JpdGVy Ojp3cml0ZUJsYW5rTGluZSgpIHsKKyAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAg IG1fb3MgPDwgJ1xuJzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQg WG1sV3JpdGVyOjplbnN1cmVUYWdDbG9zZWQoKSB7CisgICAgICAgIGlmKCBtX3RhZ0lzT3BlbiAp IHsKKyAgICAgICAgICAgIG1fb3MgPDwgJz4nIDw8IHN0ZDo6Zmx1c2g7CisgICAgICAgICAgICBu ZXdsaW5lSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gZmFsc2U7Cisg ICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFhtbFdyaXRlcjo6YXBwbHlGb3JtYXR0aW5nKFht bEZvcm1hdHRpbmcgZm10KSB7CisgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gc2hvdWxkTmV3bGlu ZShmbXQpOworICAgIH0KKworICAgIHZvaWQgWG1sV3JpdGVyOjp3cml0ZURlY2xhcmF0aW9uKCkg eworICAgICAgICBtX29zIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYt OFwiPz5cbiI7CisgICAgfQorCisgICAgdm9pZCBYbWxXcml0ZXI6Om5ld2xpbmVJZk5lY2Vzc2Fy eSgpIHsKKyAgICAgICAgaWYoIG1fbmVlZHNOZXdsaW5lICkgeworICAgICAgICAgICAgbV9vcyA8 PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IGZhbHNlOworICAgICAg ICB9CisgICAgfQorfQorLy8gZW5kIGNhdGNoX3htbHdyaXRlci5jcHAKKy8vIHN0YXJ0IGNhdGNo X3JlcG9ydGVyX2Jhc2VzLmNwcAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjZmxv YXQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWVt b3J5PgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHZvaWQgcHJlcGFyZUV4cGFuZGVkRXhwcmVz c2lvbihBc3NlcnRpb25SZXN1bHQmIHJlc3VsdCkgeworICAgICAgICByZXN1bHQuZ2V0RXhwYW5k ZWRFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgLy8gQmVjYXVzZSBmb3JtYXR0aW5nIHVzaW5n IGMrKyBzdHJlYW1zIGlzIHN0YXRlZnVsLCBkcm9wIGRvd24gdG8gQyBpcyByZXF1aXJlZAorICAg IC8vIEFsdGVybmF0aXZlbHkgd2UgY291bGQgdXNlIHN0cmluZ3N0cmVhbSwgYnV0IGl0cyBwZXJm b3JtYW5jZSBpcy4uLiBub3QgZ29vZC4KKyAgICBzdGQ6OnN0cmluZyBnZXRGb3JtYXR0ZWREdXJh dGlvbiggZG91YmxlIGR1cmF0aW9uICkgeworICAgICAgICAvLyBNYXggZXhwb25lbnQgKyAxIGlz IHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgd2hvbGUgcGFydAorICAgICAgICAvLyArIDEgZm9y IGRlY2ltYWwgcG9pbnQKKyAgICAgICAgLy8gKyAzIGZvciB0aGUgMyBkZWNpbWFsIHBsYWNlcwor ICAgICAgICAvLyArIDEgZm9yIG51bGwgdGVybWluYXRvcgorICAgICAgICBjb25zdCBzdGQ6OnNp emVfdCBtYXhEb3VibGVTaXplID0gREJMX01BWF8xMF9FWFAgKyAxICsgMSArIDMgKyAxOworICAg ICAgICBjaGFyIGJ1ZmZlclttYXhEb3VibGVTaXplXTsKKworICAgICAgICAvLyBTYXZlIHByZXZp b3VzIGVycm5vLCB0byBwcmV2ZW50IHNwcmludGYgZnJvbSBvdmVyd3JpdGluZyBpdAorICAgICAg ICBFcnJub0d1YXJkIGd1YXJkOworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgIHNwcmludGZfcyhi dWZmZXIsICIlLjNmIiwgZHVyYXRpb24pOworI2Vsc2UKKyAgICAgICAgc3RkOjpzcHJpbnRmKGJ1 ZmZlciwgIiUuM2YiLCBkdXJhdGlvbik7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3Ry aW5nKGJ1ZmZlcik7CisgICAgfQorCisgICAgYm9vbCBzaG91bGRTaG93RHVyYXRpb24oIElDb25m aWcgY29uc3QmIGNvbmZpZywgZG91YmxlIGR1cmF0aW9uICkgeworICAgICAgICBpZiAoIGNvbmZp Zy5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkgeworICAgICAgICAg ICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBjb25maWcuc2hvd0R1cmF0 aW9ucygpID09IFNob3dEdXJhdGlvbnM6Ok5ldmVyICkgeworICAgICAgICAgICAgcmV0dXJuIGZh bHNlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGRvdWJsZSBtaW4gPSBjb25maWcubWluRHVy YXRpb24oKTsKKyAgICAgICAgcmV0dXJuIG1pbiA+PSAwICYmIGR1cmF0aW9uID49IG1pbjsKKyAg ICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6 OnN0cmluZz4gY29uc3QmIGNvbnRhaW5lciApIHsKKyAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJl YW0gb3NzOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChhdXRvJiYg ZmlsdGVyIDogY29udGFpbmVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KQor ICAgICAgICAgICAgICAgIG9zcyA8PCAnICc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg ICAgICAgZmlyc3QgPSBmYWxzZTsKKworICAgICAgICAgICAgb3NzIDw8IGZpbHRlcjsKKyAgICAg ICAgfQorICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgIH0KKworICAgIFRlc3RFdmVudExp c3RlbmVyQmFzZTo6VGVzdEV2ZW50TGlzdGVuZXJCYXNlKFJlcG9ydGVyQ29uZmlnIGNvbnN0ICYg X2NvbmZpZykKKyAgICAgICAgOlN0cmVhbWluZ1JlcG9ydGVyQmFzZShfY29uZmlnKSB7fQorCisg ICAgc3RkOjpzZXQ8VmVyYm9zaXR5PiBUZXN0RXZlbnRMaXN0ZW5lckJhc2U6OmdldFN1cHBvcnRl ZFZlcmJvc2l0aWVzKCkgeworICAgICAgICByZXR1cm4geyBWZXJib3NpdHk6OlF1aWV0LCBWZXJi b3NpdHk6Ok5vcm1hbCwgVmVyYm9zaXR5OjpIaWdoIH07CisgICAgfQorCisgICAgdm9pZCBUZXN0 RXZlbnRMaXN0ZW5lckJhc2U6OmFzc2VydGlvblN0YXJ0aW5nKEFzc2VydGlvbkluZm8gY29uc3Qg Jikge30KKworICAgIGJvb2wgVGVzdEV2ZW50TGlzdGVuZXJCYXNlOjphc3NlcnRpb25FbmRlZChB c3NlcnRpb25TdGF0cyBjb25zdCAmKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK K30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorLy8gZW5kIGNhdGNoX3JlcG9ydGVyX2Jhc2VzLmNw cAorLy8gc3RhcnQgY2F0Y2hfcmVwb3J0ZXJfY29tcGFjdC5jcHAKKworbmFtZXNwYWNlIHsKKwor I2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworICAgIGNvbnN0IGNoYXIqIGZhaWxlZFN0cmluZygp IHsgcmV0dXJuICJGQUlMRUQiOyB9CisgICAgY29uc3QgY2hhciogcGFzc2VkU3RyaW5nKCkgeyBy ZXR1cm4gIlBBU1NFRCI7IH0KKyNlbHNlCisgICAgY29uc3QgY2hhciogZmFpbGVkU3RyaW5nKCkg eyByZXR1cm4gImZhaWxlZCI7IH0KKyAgICBjb25zdCBjaGFyKiBwYXNzZWRTdHJpbmcoKSB7IHJl dHVybiAicGFzc2VkIjsgfQorI2VuZGlmCisKKyAgICAvLyBDb2xvdXI6OkxpZ2h0R3JleQorICAg IENhdGNoOjpDb2xvdXI6OkNvZGUgZGltQ29sb3VyKCkgeyByZXR1cm4gQ2F0Y2g6OkNvbG91cjo6 RmlsZU5hbWU7IH0KKworICAgIHN0ZDo6c3RyaW5nIGJvdGhPckFsbCggc3RkOjpzaXplX3QgY291 bnQgKSB7CisgICAgICAgIHJldHVybiBjb3VudCA9PSAxID8gc3RkOjpzdHJpbmcoKSA6CisgICAg ICAgICAgICAgICBjb3VudCA9PSAyID8gImJvdGggIiA6ICJhbGwgIiA7CisgICAgfQorCit9IC8v IGFub24gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgeworLy8gQ29s b3VyLCBtZXNzYWdlIHZhcmlhbnRzOgorLy8gLSB3aGl0ZTogTm8gdGVzdHMgcmFuLgorLy8gLSAg IHJlZDogRmFpbGVkIFtib3RoL2FsbF0gTiB0ZXN0IGNhc2VzLCBmYWlsZWQgW2JvdGgvYWxsXSBN IGFzc2VydGlvbnMuCisvLyAtIHdoaXRlOiBQYXNzZWQgW2JvdGgvYWxsXSBOIHRlc3QgY2FzZXMg KG5vIGFzc2VydGlvbnMpLgorLy8gLSAgIHJlZDogRmFpbGVkIE4gdGVzdHMgY2FzZXMsIGZhaWxl ZCBNIGFzc2VydGlvbnMuCisvLyAtIGdyZWVuOiBQYXNzZWQgW2JvdGgvYWxsXSBOIHRlc3RzIGNh c2VzIHdpdGggTSBhc3NlcnRpb25zLgordm9pZCBwcmludFRvdGFscyhzdGQ6Om9zdHJlYW0mIG91 dCwgY29uc3QgVG90YWxzJiB0b3RhbHMpIHsKKyAgICBpZiAodG90YWxzLnRlc3RDYXNlcy50b3Rh bCgpID09IDApIHsKKyAgICAgICAgb3V0IDw8ICJObyB0ZXN0cyByYW4uIjsKKyAgICB9IGVsc2Ug aWYgKHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkID09IHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSkg eworICAgICAgICBDb2xvdXIgY29sb3VyKENvbG91cjo6UmVzdWx0RXJyb3IpOworICAgICAgICBj b25zdCBzdGQ6OnN0cmluZyBxdWFsaWZ5X2Fzc2VydGlvbnNfZmFpbGVkID0KKyAgICAgICAgICAg IHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID8K KyAgICAgICAgICAgIGJvdGhPckFsbCh0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQpIDogc3RkOjpz dHJpbmcoKTsKKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgICAiRmFpbGVkICIgPDwgYm90aE9y QWxsKHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkKQorICAgICAgICAgICAgPDwgcGx1cmFsaXNlKHRv dGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIikgPDwgIiwgIgorICAgICAgICAgICAg ImZhaWxlZCAiIDw8IHF1YWxpZnlfYXNzZXJ0aW9uc19mYWlsZWQgPDwKKyAgICAgICAgICAgIHBs dXJhbGlzZSh0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQsICJhc3NlcnRpb24iKSA8PCAnLic7Cisg ICAgfSBlbHNlIGlmICh0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID09IDApIHsKKyAgICAgICAg b3V0IDw8CisgICAgICAgICAgICAiUGFzc2VkICIgPDwgYm90aE9yQWxsKHRvdGFscy50ZXN0Q2Fz ZXMudG90YWwoKSkKKyAgICAgICAgICAgIDw8IHBsdXJhbGlzZSh0b3RhbHMudGVzdENhc2VzLnRv dGFsKCksICJ0ZXN0IGNhc2UiKQorICAgICAgICAgICAgPDwgIiAobm8gYXNzZXJ0aW9ucykuIjsK KyAgICB9IGVsc2UgaWYgKHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCkgeworICAgICAgICBDb2xv dXIgY29sb3VyKENvbG91cjo6UmVzdWx0RXJyb3IpOworICAgICAgICBvdXQgPDwKKyAgICAgICAg ICAgICJGYWlsZWQgIiA8PCBwbHVyYWxpc2UodG90YWxzLnRlc3RDYXNlcy5mYWlsZWQsICJ0ZXN0 IGNhc2UiKSA8PCAiLCAiCisgICAgICAgICAgICAiZmFpbGVkICIgPDwgcGx1cmFsaXNlKHRvdGFs cy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIpIDw8ICcuJzsKKyAgICB9IGVsc2Ugewor ICAgICAgICBDb2xvdXIgY29sb3VyKENvbG91cjo6UmVzdWx0U3VjY2Vzcyk7CisgICAgICAgIG91 dCA8PAorICAgICAgICAgICAgIlBhc3NlZCAiIDw8IGJvdGhPckFsbCh0b3RhbHMudGVzdENhc2Vz LnBhc3NlZCkKKyAgICAgICAgICAgIDw8IHBsdXJhbGlzZSh0b3RhbHMudGVzdENhc2VzLnBhc3Nl ZCwgInRlc3QgY2FzZSIpIDw8CisgICAgICAgICAgICAiIHdpdGggIiA8PCBwbHVyYWxpc2UodG90 YWxzLmFzc2VydGlvbnMucGFzc2VkLCAiYXNzZXJ0aW9uIikgPDwgJy4nOworICAgIH0KK30KKwor Ly8gSW1wbGVtZW50YXRpb24gb2YgQ29tcGFjdFJlcG9ydGVyIGZvcm1hdHRpbmcKK2NsYXNzIEFz c2VydGlvblByaW50ZXIgeworcHVibGljOgorICAgIEFzc2VydGlvblByaW50ZXImIG9wZXJhdG9y PSAoQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYpID0gZGVsZXRlOworICAgIEFzc2VydGlvblByaW50 ZXIoQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYpID0gZGVsZXRlOworICAgIEFzc2VydGlvblByaW50 ZXIoc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX3N0YXRzLCBi b29sIF9wcmludEluZm9NZXNzYWdlcykKKyAgICAgICAgOiBzdHJlYW0oX3N0cmVhbSkKKyAgICAg ICAgLCByZXN1bHQoX3N0YXRzLmFzc2VydGlvblJlc3VsdCkKKyAgICAgICAgLCBtZXNzYWdlcyhf c3RhdHMuaW5mb01lc3NhZ2VzKQorICAgICAgICAsIGl0TWVzc2FnZShfc3RhdHMuaW5mb01lc3Nh Z2VzLmJlZ2luKCkpCisgICAgICAgICwgcHJpbnRJbmZvTWVzc2FnZXMoX3ByaW50SW5mb01lc3Nh Z2VzKSB7fQorCisgICAgdm9pZCBwcmludCgpIHsKKyAgICAgICAgcHJpbnRTb3VyY2VJbmZvKCk7 CisKKyAgICAgICAgaXRNZXNzYWdlID0gbWVzc2FnZXMuYmVnaW4oKTsKKworICAgICAgICBzd2l0 Y2ggKHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9r OgorICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKENvbG91cjo6UmVzdWx0U3VjY2VzcywgcGFz c2VkU3RyaW5nKCkpOworICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAg ICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgIGlm ICghcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSkKKyAgICAgICAgICAgICAgICBwcmludFJlbWFpbmlu Z01lc3NhZ2VzKENvbG91cjo6Tm9uZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg ICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg IGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgaWYgKHJlc3Vs dC5pc09rKCkpCisgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKENvbG91cjo6UmVzdWx0 U3VjY2VzcywgZmFpbGVkU3RyaW5nKCkgKyBzdGQ6OnN0cmluZygiIC0gYnV0IHdhcyBvayIpKTsK KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoQ29sb3Vy OjpFcnJvciwgZmFpbGVkU3RyaW5nKCkpOworICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJl c3Npb24oKTsKKyAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAg ICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICBwcmlu dFJlc3VsdFR5cGUoQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkpOworICAgICAgICAgICAg cHJpbnRJc3N1ZSgidW5leHBlY3RlZCBleGNlcHRpb24gd2l0aCBtZXNzYWdlOiIpOworICAgICAg ICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsK KyAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgIGJyZWFr OworICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAg ICAgIHByaW50UmVzdWx0VHlwZShDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSk7CisgICAg ICAgICAgICBwcmludElzc3VlKCJmYXRhbCBlcnJvciBjb25kaXRpb24gd2l0aCBtZXNzYWdlOiIp OworICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICBwcmludEV4cHJlc3Np b25XYXMoKTsKKyAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAg ICAgIGJyZWFrOworICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoK KyAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZShDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmco KSk7CisgICAgICAgICAgICBwcmludElzc3VlKCJleHBlY3RlZCBleGNlcHRpb24sIGdvdCBub25l Iik7CisgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgIHByaW50 UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJl c3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZShDb2xvdXI6Ok5vbmUs ICJpbmZvIik7CisgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHByaW50 UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJl c3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZShDb2xvdXI6Ok5v bmUsICJ3YXJuaW5nIik7CisgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAg IHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj YXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgcHJpbnRSZXN1bHRU eXBlKENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpKTsKKyAgICAgICAgICAgIHByaW50SXNz dWUoImV4cGxpY2l0bHkiKTsKKyAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoQ29s b3VyOjpOb25lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gVGhlc2UgY2Fz ZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncworICAgICAgICBjYXNlIFJl c3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6Cisg ICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICBwcmludFJlc3Vs dFR5cGUoQ29sb3VyOjpFcnJvciwgIioqIGludGVybmFsIGVycm9yICoqIik7CisgICAgICAgICAg ICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHByaW50U291 cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKENvbG91cjo6Rmls ZU5hbWUpOworICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKSA8PCAnOic7 CisgICAgfQorCisgICAgdm9pZCBwcmludFJlc3VsdFR5cGUoQ29sb3VyOjpDb2RlIGNvbG91ciwg c3RkOjpzdHJpbmcgY29uc3QmIHBhc3NPckZhaWwpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFwYXNz T3JGYWlsLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIg Y29sb3VyR3VhcmQoY29sb3VyKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IHBh c3NPckZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgJzonOworICAg ICAgICB9CisgICAgfQorCisgICAgdm9pZCBwcmludElzc3VlKHN0ZDo6c3RyaW5nIGNvbnN0JiBp c3N1ZSkgY29uc3QgeworICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IGlzc3VlOworICAgIH0KKwor ICAgIHZvaWQgcHJpbnRFeHByZXNzaW9uV2FzKCkgeworICAgICAgICBpZiAocmVzdWx0Lmhhc0V4 cHJlc3Npb24oKSkgeworICAgICAgICAgICAgc3RyZWFtIDw8ICc7JzsKKyAgICAgICAgICAgIHsK KyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKGRpbUNvbG91cigpKTsKKyAgICAgICAgICAg ICAgICBzdHJlYW0gPDwgIiBleHByZXNzaW9uIHdhczoiOworICAgICAgICAgICAgfQorICAgICAg ICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAg IHZvaWQgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIGlmIChyZXN1 bHQuaGFzRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IHJlc3Vs dC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHByaW50UmVj b25zdHJ1Y3RlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIGlmIChyZXN1bHQuaGFzRXhw YW5kZWRFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2xv dXIgY29sb3VyKGRpbUNvbG91cigpKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBmb3I6 ICI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldEV4cGFu ZGVkRXhwcmVzc2lvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwcmludE1lc3Nh Z2UoKSB7CisgICAgICAgIGlmIChpdE1lc3NhZ2UgIT0gbWVzc2FnZXMuZW5kKCkpIHsKKyAgICAg ICAgICAgIHN0cmVhbSA8PCAiICciIDw8IGl0TWVzc2FnZS0+bWVzc2FnZSA8PCAnXCcnOworICAg ICAgICAgICAgKytpdE1lc3NhZ2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHByaW50 UmVtYWluaW5nTWVzc2FnZXMoQ29sb3VyOjpDb2RlIGNvbG91ciA9IGRpbUNvbG91cigpKSB7Cisg ICAgICAgIGlmIChpdE1lc3NhZ2UgPT0gbWVzc2FnZXMuZW5kKCkpCisgICAgICAgICAgICByZXR1 cm47CisKKyAgICAgICAgY29uc3QgYXV0byBpdEVuZCA9IG1lc3NhZ2VzLmNlbmQoKTsKKyAgICAg ICAgY29uc3QgYXV0byBOID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHN0ZDo6ZGlzdGFuY2Uo aXRNZXNzYWdlLCBpdEVuZCkpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbG91ciBjb2xv dXJHdWFyZChjb2xvdXIpOworICAgICAgICAgICAgc3RyZWFtIDw8ICIgd2l0aCAiIDw8IHBsdXJh bGlzZShOLCAibWVzc2FnZSIpIDw8ICc6JzsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChp dE1lc3NhZ2UgIT0gaXRFbmQpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzZXJ0aW9uIGlz IGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMKKyAgICAgICAgICAgIGlmIChwcmlu dEluZm9NZXNzYWdlcyB8fCBpdE1lc3NhZ2UtPnR5cGUgIT0gUmVzdWx0V2FzOjpJbmZvKSB7Cisg ICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgaWYgKGl0TWVz c2FnZSAhPSBpdEVuZCkgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQo ZGltQ29sb3VyKCkpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBhbmQiOworICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0K KyAgICAgICAgICAgICsraXRNZXNzYWdlOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgor ICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVz dWx0OworICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtZXNzYWdlczsKKyAgICBzdGQ6OnZl Y3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0TWVzc2FnZTsKKyAgICBib29sIHBy aW50SW5mb01lc3NhZ2VzOworfTsKKworfSAvLyBhbm9uIG5hbWVzcGFjZQorCisgICAgICAgIHN0 ZDo6c3RyaW5nIENvbXBhY3RSZXBvcnRlcjo6Z2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAg ICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIG9uIGEgc2luZ2xlIGxpbmUsIHN1aXRhYmxl IGZvciBJREVzIjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgQ29tcGFjdFJlcG9ydGVyOjpu b01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIHsKKyAgICAgICAg ICAgIHN0cmVhbSA8PCAiTm8gdGVzdCBjYXNlcyBtYXRjaGVkICciIDw8IHNwZWMgPDwgJ1wnJyA8 PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIENvbXBhY3RSZXBvcnRlcjo6 YXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkge30KKworICAgICAgICBi b29sIENvbXBhY3RSZXBvcnRlcjo6YXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0 JiBfYXNzZXJ0aW9uU3RhdHMgKSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3Qm IHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisKKyAgICAgICAgICAg IGJvb2wgcHJpbnRJbmZvTWVzc2FnZXMgPSB0cnVlOworCisgICAgICAgICAgICAvLyBEcm9wIG91 dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYW5kIHdlJ3JlIG5vdCBwcmludGluZyB0aG9zZQor ICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgJiYg cmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmdldFJlc3VsdFR5 cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g ZmFsc2U7CisgICAgICAgICAgICAgICAgcHJpbnRJbmZvTWVzc2FnZXMgPSBmYWxzZTsKKyAgICAg ICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciBwcmludGVyKCBzdHJlYW0s IF9hc3NlcnRpb25TdGF0cywgcHJpbnRJbmZvTWVzc2FnZXMgKTsKKyAgICAgICAgICAgIHByaW50 ZXIucHJpbnQoKTsKKworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAg ICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBDb21wYWN0UmVwb3J0 ZXI6OnNlY3Rpb25FbmRlZChTZWN0aW9uU3RhdHMgY29uc3QmIF9zZWN0aW9uU3RhdHMpIHsKKyAg ICAgICAgICAgIGRvdWJsZSBkdXIgPSBfc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzOwor ICAgICAgICAgICAgaWYgKCBzaG91bGRTaG93RHVyYXRpb24oICptX2NvbmZpZywgZHVyICkgKSB7 CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldEZvcm1hdHRlZER1cmF0aW9uKCBkdXIgKSA8 PCAiIHM6ICIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsK KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgQ29tcGFjdFJlcG9ydGVy Ojp0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgX3Rlc3RSdW5TdGF0cyApIHsKKyAg ICAgICAgICAgIHByaW50VG90YWxzKCBzdHJlYW0sIF90ZXN0UnVuU3RhdHMudG90YWxzICk7Cisg ICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBTdHJl YW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggX3Rlc3RSdW5TdGF0cyApOworICAgICAg ICB9CisKKyAgICAgICAgQ29tcGFjdFJlcG9ydGVyOjp+Q29tcGFjdFJlcG9ydGVyKCkge30KKwor ICAgIENBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAiY29tcGFjdCIsIENvbXBhY3RSZXBvcnRlciAp CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorLy8gZW5kIGNhdGNoX3JlcG9ydGVyX2NvbXBh Y3QuY3BwCisvLyBzdGFydCBjYXRjaF9yZXBvcnRlcl9jb25zb2xlLmNwcAorCisjaW5jbHVkZSA8 Y2Zsb2F0PgorI2luY2x1ZGUgPGNzdGRpbz4KKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjcHJh Z21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwNjEpIC8vIE5vdCBh bGwgbGFiZWxzIGFyZSBFWFBMSUNJVExZIGhhbmRsZWQgaW4gc3dpdGNoCisgLy8gTm90ZSB0aGF0 IDQwNjIgKG5vdCBhbGwgbGFiZWxzIGFyZSBoYW5kbGVkIGFuZCBkZWZhdWx0IGlzIG1pc3Npbmcp IGlzIGVuYWJsZWQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjICBwcmFnbWEg Y2xhbmcgZGlhZ25vc3RpYyBwdXNoCisvLyBGb3Igc2ltcGxpY2l0eSwgYmVuY2htYXJraW5nLW9u bHkgaGVscGVycyBhcmUgYWx3YXlzIGVuYWJsZWQKKyMgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGlj IGlnbm9yZWQgIi1XdW51c2VkLWZ1bmN0aW9uIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7 CisKK25hbWVzcGFjZSB7CisKKy8vIEZvcm1hdHRlciBpbXBsIGZvciBDb25zb2xlUmVwb3J0ZXIK K2NsYXNzIENvbnNvbGVBc3NlcnRpb25QcmludGVyIHsKK3B1YmxpYzoKKyAgICBDb25zb2xlQXNz ZXJ0aW9uUHJpbnRlciYgb3BlcmF0b3I9IChDb25zb2xlQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYp ID0gZGVsZXRlOworICAgIENvbnNvbGVBc3NlcnRpb25QcmludGVyKENvbnNvbGVBc3NlcnRpb25Q cmludGVyIGNvbnN0JikgPSBkZWxldGU7CisgICAgQ29uc29sZUFzc2VydGlvblByaW50ZXIoc3Rk Ojpvc3RyZWFtJiBfc3RyZWFtLCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX3N0YXRzLCBib29sIF9w cmludEluZm9NZXNzYWdlcykKKyAgICAgICAgOiBzdHJlYW0oX3N0cmVhbSksCisgICAgICAgIHN0 YXRzKF9zdGF0cyksCisgICAgICAgIHJlc3VsdChfc3RhdHMuYXNzZXJ0aW9uUmVzdWx0KSwKKyAg ICAgICAgY29sb3VyKENvbG91cjo6Tm9uZSksCisgICAgICAgIG1lc3NhZ2UocmVzdWx0LmdldE1l c3NhZ2UoKSksCisgICAgICAgIG1lc3NhZ2VzKF9zdGF0cy5pbmZvTWVzc2FnZXMpLAorICAgICAg ICBwcmludEluZm9NZXNzYWdlcyhfcHJpbnRJbmZvTWVzc2FnZXMpIHsKKyAgICAgICAgc3dpdGNo IChyZXN1bHQuZ2V0UmVzdWx0VHlwZSgpKSB7CisgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoK KyAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6U3VjY2VzczsKKyAgICAgICAgICAgIHBhc3NP ckZhaWwgPSAiUEFTU0VEIjsKKyAgICAgICAgICAgIC8vaWYoIHJlc3VsdC5oYXNNZXNzYWdlKCkg KQorICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEpCisgICAg ICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZSI7CisgICAgICAgICAgICBp ZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgIG1lc3Nh Z2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj YXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgIGlmIChyZXN1bHQu aXNPaygpKSB7CisgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpTdWNjZXNzOworICAg ICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIC0gYnV0IHdhcyBvayI7CisgICAgICAg ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7Cisg ICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgfQorICAg ICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEpCisgICAgICAgICAg ICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZSI7CisgICAgICAgICAgICBpZiAoX3N0 YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJl bCA9ICJ3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJl c3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVy cm9yOworICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgbWVz c2FnZUxhYmVsID0gImR1ZSB0byB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aXRoICI7CisgICAgICAg ICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAg ICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2UiOworICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZv TWVzc2FnZXMuc2l6ZSgpID4gMSkKKyAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1l c3NhZ2VzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0 YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7Cisg ICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICBtZXNzYWdlTGFi ZWwgPSAiZHVlIHRvIGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIjsKKyAgICAgICAgICAgIGJyZWFr OworICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoKKyAgICAgICAg ICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZB SUxFRCI7CisgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiYmVjYXVzZSBubyBleGNlcHRpb24g d2FzIHRocm93biB3aGVyZSBvbmUgd2FzIGV4cGVjdGVkIjsKKyAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9 ICJpbmZvIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2Fy bmluZzoKKyAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3YXJuaW5nIjsKKyAgICAgICAgICAg IGJyZWFrOworICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAg ICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgY29sb3VyID0gQ29sb3Vy OjpFcnJvcjsKKyAgICAgICAgICAgIGlmIChfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAx KQorICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJleHBsaWNpdGx5IHdpdGggbWVzc2Fn ZSI7CisgICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxKQorICAg ICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJleHBsaWNpdGx5IHdpdGggbWVzc2FnZXMiOwor ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBhcmUgaGVyZSB0 byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzCisgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtu b3duOgorICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgY2FzZSBS ZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiKiogaW50ZXJu YWwgZXJyb3IgKioiOworICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAg ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwcmludCgpIGNvbnN0 IHsKKyAgICAgICAgcHJpbnRTb3VyY2VJbmZvKCk7CisgICAgICAgIGlmIChzdGF0cy50b3RhbHMu YXNzZXJ0aW9ucy50b3RhbCgpID4gMCkgeworICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCk7 CisgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgcHJp bnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg ICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRNZXNzYWdlKCk7Cisg ICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgcHJpbnRSZXN1bHRUeXBlKCkgY29uc3QgeworICAg ICAgICBpZiAoIXBhc3NPckZhaWwuZW1wdHkoKSkgeworICAgICAgICAgICAgQ29sb3VyIGNvbG91 ckd1YXJkKGNvbG91cik7CisgICAgICAgICAgICBzdHJlYW0gPDwgcGFzc09yRmFpbCA8PCAiOlxu IjsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCkg Y29uc3QgeworICAgICAgICBpZiAocmVzdWx0Lmhhc0V4cHJlc3Npb24oKSkgeworICAgICAgICAg ICAgQ29sb3VyIGNvbG91ckd1YXJkKENvbG91cjo6T3JpZ2luYWxFeHByZXNzaW9uKTsKKyAgICAg ICAgICAgIHN0cmVhbSA8PCAiICAiOworICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRF eHByZXNzaW9uSW5NYWNybygpOworICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAg IH0KKyAgICB9CisgICAgdm9pZCBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCkgY29uc3Qg eworICAgICAgICBpZiAocmVzdWx0Lmhhc0V4cGFuZGVkRXhwcmVzc2lvbigpKSB7CisgICAgICAg ICAgICBzdHJlYW0gPDwgIndpdGggZXhwYW5zaW9uOlxuIjsKKyAgICAgICAgICAgIENvbG91ciBj b2xvdXJHdWFyZChDb2xvdXI6OlJlY29uc3RydWN0ZWRFeHByZXNzaW9uKTsKKyAgICAgICAgICAg IHN0cmVhbSA8PCBDb2x1bW4ocmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpKS5pbmRlbnQo MikgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHByaW50TWVzc2FnZSgpIGNv bnN0IHsKKyAgICAgICAgaWYgKCFtZXNzYWdlTGFiZWwuZW1wdHkoKSkKKyAgICAgICAgICAgIHN0 cmVhbSA8PCBtZXNzYWdlTGFiZWwgPDwgJzonIDw8ICdcbic7CisgICAgICAgIGZvciAoYXV0byBj b25zdCYgbXNnIDogbWVzc2FnZXMpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzZXJ0aW9u IGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMKKyAgICAgICAgICAgIGlmIChw cmludEluZm9NZXNzYWdlcyB8fCBtc2cudHlwZSAhPSBSZXN1bHRXYXM6OkluZm8pCisgICAgICAg ICAgICAgICAgc3RyZWFtIDw8IENvbHVtbihtc2cubWVzc2FnZSkuaW5kZW50KDIpIDw8ICdcbic7 CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBwcmludFNvdXJjZUluZm8oKSBjb25zdCB7Cisg ICAgICAgIENvbG91ciBjb2xvdXJHdWFyZChDb2xvdXI6OkZpbGVOYW1lKTsKKyAgICAgICAgc3Ry ZWFtIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgPDwgIjogIjsKKyAgICB9CisKKyAgICBzdGQ6 Om9zdHJlYW0mIHN0cmVhbTsKKyAgICBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHM7CisgICAg QXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQ7CisgICAgQ29sb3VyOjpDb2RlIGNvbG91cjsK KyAgICBzdGQ6OnN0cmluZyBwYXNzT3JGYWlsOworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VMYWJl bDsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZv PiBtZXNzYWdlczsKKyAgICBib29sIHByaW50SW5mb01lc3NhZ2VzOworfTsKKworc3RkOjpzaXpl X3QgbWFrZVJhdGlvKHN0ZDo6c2l6ZV90IG51bWJlciwgc3RkOjpzaXplX3QgdG90YWwpIHsKKyAg ICBzdGQ6OnNpemVfdCByYXRpbyA9IHRvdGFsID4gMCA/IENBVENIX0NPTkZJR19DT05TT0xFX1dJ RFRIICogbnVtYmVyIC8gdG90YWwgOiAwOworICAgIHJldHVybiAocmF0aW8gPT0gMCAmJiBudW1i ZXIgPiAwKSA/IDEgOiByYXRpbzsKK30KKworc3RkOjpzaXplX3QmIGZpbmRNYXgoc3RkOjpzaXpl X3QmIGksIHN0ZDo6c2l6ZV90JiBqLCBzdGQ6OnNpemVfdCYgaykgeworICAgIGlmIChpID4gaiAm JiBpID4gaykKKyAgICAgICAgcmV0dXJuIGk7CisgICAgZWxzZSBpZiAoaiA+IGspCisgICAgICAg IHJldHVybiBqOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGs7Cit9CisKK3N0cnVjdCBDb2x1 bW5JbmZvIHsKKyAgICBlbnVtIEp1c3RpZmljYXRpb24geyBMZWZ0LCBSaWdodCB9OworICAgIHN0 ZDo6c3RyaW5nIG5hbWU7CisgICAgaW50IHdpZHRoOworICAgIEp1c3RpZmljYXRpb24ganVzdGlm aWNhdGlvbjsKK307CitzdHJ1Y3QgQ29sdW1uQnJlYWsge307CitzdHJ1Y3QgUm93QnJlYWsge307 CisKK2NsYXNzIER1cmF0aW9uIHsKKyAgICBlbnVtIGNsYXNzIFVuaXQgeworICAgICAgICBBdXRv LAorICAgICAgICBOYW5vc2Vjb25kcywKKyAgICAgICAgTWljcm9zZWNvbmRzLAorICAgICAgICBN aWxsaXNlY29uZHMsCisgICAgICAgIFNlY29uZHMsCisgICAgICAgIE1pbnV0ZXMKKyAgICB9Owor ICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBzX25hbm9zZWNvbmRzSW5BTWljcm9zZWNvbmQgPSAx MDAwOworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBzX25hbm9zZWNvbmRzSW5BTWlsbGlzZWNv bmQgPSAxMDAwICogc19uYW5vc2Vjb25kc0luQU1pY3Jvc2Vjb25kOworICAgIHN0YXRpYyBjb25z dCB1aW50NjRfdCBzX25hbm9zZWNvbmRzSW5BU2Vjb25kID0gMTAwMCAqIHNfbmFub3NlY29uZHNJ bkFNaWxsaXNlY29uZDsKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qgc19uYW5vc2Vjb25kc0lu QU1pbnV0ZSA9IDYwICogc19uYW5vc2Vjb25kc0luQVNlY29uZDsKKworICAgIGRvdWJsZSBtX2lu TmFub3NlY29uZHM7CisgICAgVW5pdCBtX3VuaXRzOworCitwdWJsaWM6CisgICAgZXhwbGljaXQg RHVyYXRpb24oZG91YmxlIGluTmFub3NlY29uZHMsIFVuaXQgdW5pdHMgPSBVbml0OjpBdXRvKQor ICAgICAgICA6IG1faW5OYW5vc2Vjb25kcyhpbk5hbm9zZWNvbmRzKSwKKyAgICAgICAgbV91bml0 cyh1bml0cykgeworICAgICAgICBpZiAobV91bml0cyA9PSBVbml0OjpBdXRvKSB7CisgICAgICAg ICAgICBpZiAobV9pbk5hbm9zZWNvbmRzIDwgc19uYW5vc2Vjb25kc0luQU1pY3Jvc2Vjb25kKQor ICAgICAgICAgICAgICAgIG1fdW5pdHMgPSBVbml0OjpOYW5vc2Vjb25kczsKKyAgICAgICAgICAg IGVsc2UgaWYgKG1faW5OYW5vc2Vjb25kcyA8IHNfbmFub3NlY29uZHNJbkFNaWxsaXNlY29uZCkK KyAgICAgICAgICAgICAgICBtX3VuaXRzID0gVW5pdDo6TWljcm9zZWNvbmRzOworICAgICAgICAg ICAgZWxzZSBpZiAobV9pbk5hbm9zZWNvbmRzIDwgc19uYW5vc2Vjb25kc0luQVNlY29uZCkKKyAg ICAgICAgICAgICAgICBtX3VuaXRzID0gVW5pdDo6TWlsbGlzZWNvbmRzOworICAgICAgICAgICAg ZWxzZSBpZiAobV9pbk5hbm9zZWNvbmRzIDwgc19uYW5vc2Vjb25kc0luQU1pbnV0ZSkKKyAgICAg ICAgICAgICAgICBtX3VuaXRzID0gVW5pdDo6U2Vjb25kczsKKyAgICAgICAgICAgIGVsc2UKKyAg ICAgICAgICAgICAgICBtX3VuaXRzID0gVW5pdDo6TWludXRlczsKKyAgICAgICAgfQorCisgICAg fQorCisgICAgYXV0byB2YWx1ZSgpIGNvbnN0IC0+IGRvdWJsZSB7CisgICAgICAgIHN3aXRjaCAo bV91bml0cykgeworICAgICAgICBjYXNlIFVuaXQ6Ok1pY3Jvc2Vjb25kczoKKyAgICAgICAgICAg IHJldHVybiBtX2luTmFub3NlY29uZHMgLyBzdGF0aWNfY2FzdDxkb3VibGU+KHNfbmFub3NlY29u ZHNJbkFNaWNyb3NlY29uZCk7CisgICAgICAgIGNhc2UgVW5pdDo6TWlsbGlzZWNvbmRzOgorICAg ICAgICAgICAgcmV0dXJuIG1faW5OYW5vc2Vjb25kcyAvIHN0YXRpY19jYXN0PGRvdWJsZT4oc19u YW5vc2Vjb25kc0luQU1pbGxpc2Vjb25kKTsKKyAgICAgICAgY2FzZSBVbml0OjpTZWNvbmRzOgor ICAgICAgICAgICAgcmV0dXJuIG1faW5OYW5vc2Vjb25kcyAvIHN0YXRpY19jYXN0PGRvdWJsZT4o c19uYW5vc2Vjb25kc0luQVNlY29uZCk7CisgICAgICAgIGNhc2UgVW5pdDo6TWludXRlczoKKyAg ICAgICAgICAgIHJldHVybiBtX2luTmFub3NlY29uZHMgLyBzdGF0aWNfY2FzdDxkb3VibGU+KHNf bmFub3NlY29uZHNJbkFNaW51dGUpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0 dXJuIG1faW5OYW5vc2Vjb25kczsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdXRvIHVuaXRzQXNT dHJpbmcoKSBjb25zdCAtPiBzdGQ6OnN0cmluZyB7CisgICAgICAgIHN3aXRjaCAobV91bml0cykg eworICAgICAgICBjYXNlIFVuaXQ6Ok5hbm9zZWNvbmRzOgorICAgICAgICAgICAgcmV0dXJuICJu cyI7CisgICAgICAgIGNhc2UgVW5pdDo6TWljcm9zZWNvbmRzOgorICAgICAgICAgICAgcmV0dXJu ICJ1cyI7CisgICAgICAgIGNhc2UgVW5pdDo6TWlsbGlzZWNvbmRzOgorICAgICAgICAgICAgcmV0 dXJuICJtcyI7CisgICAgICAgIGNhc2UgVW5pdDo6U2Vjb25kczoKKyAgICAgICAgICAgIHJldHVy biAicyI7CisgICAgICAgIGNhc2UgVW5pdDo6TWludXRlczoKKyAgICAgICAgICAgIHJldHVybiAi bSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIioqIGludGVybmFsIGVy cm9yICoqIjsKKyAgICAgICAgfQorCisgICAgfQorICAgIGZyaWVuZCBhdXRvIG9wZXJhdG9yIDw8 IChzdGQ6Om9zdHJlYW0mIG9zLCBEdXJhdGlvbiBjb25zdCYgZHVyYXRpb24pIC0+IHN0ZDo6b3N0 cmVhbSYgeworICAgICAgICByZXR1cm4gb3MgPDwgZHVyYXRpb24udmFsdWUoKSA8PCAnICcgPDwg ZHVyYXRpb24udW5pdHNBc1N0cmluZygpOworICAgIH0KK307Cit9IC8vIGVuZCBhbm9uIG5hbWVz cGFjZQorCitjbGFzcyBUYWJsZVByaW50ZXIgeworICAgIHN0ZDo6b3N0cmVhbSYgbV9vczsKKyAg ICBzdGQ6OnZlY3RvcjxDb2x1bW5JbmZvPiBtX2NvbHVtbkluZm9zOworICAgIHN0ZDo6b3N0cmlu Z3N0cmVhbSBtX29zczsKKyAgICBpbnQgbV9jdXJyZW50Q29sdW1uID0gLTE7CisgICAgYm9vbCBt X2lzT3BlbiA9IGZhbHNlOworCitwdWJsaWM6CisgICAgVGFibGVQcmludGVyKCBzdGQ6Om9zdHJl YW0mIG9zLCBzdGQ6OnZlY3RvcjxDb2x1bW5JbmZvPiBjb2x1bW5JbmZvcyApCisgICAgOiAgIG1f b3MoIG9zICksCisgICAgICAgIG1fY29sdW1uSW5mb3MoIHN0ZDo6bW92ZSggY29sdW1uSW5mb3Mg KSApIHt9CisKKyAgICBhdXRvIGNvbHVtbkluZm9zKCkgY29uc3QgLT4gc3RkOjp2ZWN0b3I8Q29s dW1uSW5mbz4gY29uc3QmIHsKKyAgICAgICAgcmV0dXJuIG1fY29sdW1uSW5mb3M7CisgICAgfQor CisgICAgdm9pZCBvcGVuKCkgeworICAgICAgICBpZiAoIW1faXNPcGVuKSB7CisgICAgICAgICAg ICBtX2lzT3BlbiA9IHRydWU7CisgICAgICAgICAgICAqdGhpcyA8PCBSb3dCcmVhaygpOworCisJ CQlDb2x1bW5zIGhlYWRlckNvbHM7CisJCQlTcGFjZXIgc3BhY2VyKDIpOworCQkJZm9yIChhdXRv IGNvbnN0JiBpbmZvIDogbV9jb2x1bW5JbmZvcykgeworCQkJCWhlYWRlckNvbHMgKz0gQ29sdW1u KGluZm8ubmFtZSkud2lkdGgoc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KGluZm8ud2lkdGggLSAy KSk7CisJCQkJaGVhZGVyQ29scyArPSBzcGFjZXI7CisJCQl9CisJCQltX29zIDw8IGhlYWRlckNv bHMgPDwgJ1xuJzsKKworICAgICAgICAgICAgbV9vcyA8PCBDYXRjaDo6Z2V0TGluZU9mQ2hhcnM8 Jy0nPigpIDw8ICdcbic7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBjbG9zZSgpIHsKKyAg ICAgICAgaWYgKG1faXNPcGVuKSB7CisgICAgICAgICAgICAqdGhpcyA8PCBSb3dCcmVhaygpOwor ICAgICAgICAgICAgbV9vcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBtX2lzT3BlbiA9IGZh bHNlOworICAgICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBm cmllbmQgVGFibGVQcmludGVyJiBvcGVyYXRvciA8PCAoVGFibGVQcmludGVyJiB0cCwgVCBjb25z dCYgdmFsdWUpIHsKKyAgICAgICAgdHAubV9vc3MgPDwgdmFsdWU7CisgICAgICAgIHJldHVybiB0 cDsKKyAgICB9CisKKyAgICBmcmllbmQgVGFibGVQcmludGVyJiBvcGVyYXRvciA8PCAoVGFibGVQ cmludGVyJiB0cCwgQ29sdW1uQnJlYWspIHsKKyAgICAgICAgYXV0byBjb2xTdHIgPSB0cC5tX29z cy5zdHIoKTsKKyAgICAgICAgY29uc3QgYXV0byBzdHJTaXplID0gY29sU3RyLnNpemUoKTsKKyAg ICAgICAgdHAubV9vc3Muc3RyKCIiKTsKKyAgICAgICAgdHAub3BlbigpOworICAgICAgICBpZiAo dHAubV9jdXJyZW50Q29sdW1uID09IHN0YXRpY19jYXN0PGludD4odHAubV9jb2x1bW5JbmZvcy5z aXplKCkgLSAxKSkgeworICAgICAgICAgICAgdHAubV9jdXJyZW50Q29sdW1uID0gLTE7CisgICAg ICAgICAgICB0cC5tX29zIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgdHAubV9jdXJyZW50 Q29sdW1uKys7CisKKyAgICAgICAgYXV0byBjb2xJbmZvID0gdHAubV9jb2x1bW5JbmZvc1t0cC5t X2N1cnJlbnRDb2x1bW5dOworICAgICAgICBhdXRvIHBhZGRpbmcgPSAoc3RyU2l6ZSArIDEgPCBz dGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oY29sSW5mby53aWR0aCkpCisgICAgICAgICAgICA/IHN0 ZDo6c3RyaW5nKGNvbEluZm8ud2lkdGggLSAoc3RyU2l6ZSArIDEpLCAnICcpCisgICAgICAgICAg ICA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIGlmIChjb2xJbmZvLmp1c3RpZmljYXRpb24gPT0g Q29sdW1uSW5mbzo6TGVmdCkKKyAgICAgICAgICAgIHRwLm1fb3MgPDwgY29sU3RyIDw8IHBhZGRp bmcgPDwgJyAnOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0cC5tX29zIDw8IHBhZGRpbmcg PDwgY29sU3RyIDw8ICcgJzsKKyAgICAgICAgcmV0dXJuIHRwOworICAgIH0KKworICAgIGZyaWVu ZCBUYWJsZVByaW50ZXImIG9wZXJhdG9yIDw8IChUYWJsZVByaW50ZXImIHRwLCBSb3dCcmVhaykg eworICAgICAgICBpZiAodHAubV9jdXJyZW50Q29sdW1uID4gMCkgeworICAgICAgICAgICAgdHAu bV9vcyA8PCAnXG4nOworICAgICAgICAgICAgdHAubV9jdXJyZW50Q29sdW1uID0gLTE7CisgICAg ICAgIH0KKyAgICAgICAgcmV0dXJuIHRwOworICAgIH0KK307CisKK0NvbnNvbGVSZXBvcnRlcjo6 Q29uc29sZVJlcG9ydGVyKFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcpCisgICAgOiBTdHJl YW1pbmdSZXBvcnRlckJhc2UoY29uZmlnKSwKKyAgICBtX3RhYmxlUHJpbnRlcihuZXcgVGFibGVQ cmludGVyKGNvbmZpZy5zdHJlYW0oKSwKKyAgICAgICAgWyZjb25maWddKCkgLT4gc3RkOjp2ZWN0 b3I8Q29sdW1uSW5mbz4geworICAgICAgICBpZiAoY29uZmlnLmZ1bGxDb25maWcoKS0+YmVuY2ht YXJrTm9BbmFseXNpcygpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm57CisgICAgICAg ICAgICAgICAgeyAiYmVuY2htYXJrIG5hbWUiLCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAt IDQzLCBDb2x1bW5JbmZvOjpMZWZ0IH0sCisgICAgICAgICAgICAgICAgeyAiICAgICBzYW1wbGVz IiwgMTQsIENvbHVtbkluZm86OlJpZ2h0IH0sCisgICAgICAgICAgICAgICAgeyAiICBpdGVyYXRp b25zIiwgMTQsIENvbHVtbkluZm86OlJpZ2h0IH0sCisgICAgICAgICAgICAgICAgeyAiICAgICAg ICBtZWFuIiwgMTQsIENvbHVtbkluZm86OlJpZ2h0IH0KKyAgICAgICAgICAgIH07CisgICAgICAg IH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm57CisgICAgICAg ICAgICAgICAgeyAiYmVuY2htYXJrIG5hbWUiLCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAt IDQzLCBDb2x1bW5JbmZvOjpMZWZ0IH0sCisgICAgICAgICAgICAgICAgeyAic2FtcGxlcyAgICAg IG1lYW4gICAgICAgc3RkIGRldiIsIDE0LCBDb2x1bW5JbmZvOjpSaWdodCB9LAorICAgICAgICAg ICAgICAgIHsgIml0ZXJhdGlvbnMgICBsb3cgbWVhbiAgIGxvdyBzdGQgZGV2IiwgMTQsIENvbHVt bkluZm86OlJpZ2h0IH0sCisgICAgICAgICAgICAgICAgeyAiZXN0aW1hdGVkICAgIGhpZ2ggbWVh biAgaGlnaCBzdGQgZGV2IiwgMTQsIENvbHVtbkluZm86OlJpZ2h0IH0KKyAgICAgICAgICAgIH07 CisgICAgICAgIH0KKyAgICB9KCkpKSB7fQorQ29uc29sZVJlcG9ydGVyOjp+Q29uc29sZVJlcG9y dGVyKCkgPSBkZWZhdWx0OworCitzdGQ6OnN0cmluZyBDb25zb2xlUmVwb3J0ZXI6OmdldERlc2Ny aXB0aW9uKCkgeworICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgYXMgcGxhaW4gbGlu ZXMgb2YgdGV4dCI7Cit9CisKK3ZvaWQgQ29uc29sZVJlcG9ydGVyOjpub01hdGNoaW5nVGVzdENh c2VzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjKSB7CisgICAgc3RyZWFtIDw8ICJObyB0ZXN0IGNh c2VzIG1hdGNoZWQgJyIgPDwgc3BlYyA8PCAnXCcnIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBD b25zb2xlUmVwb3J0ZXI6OnJlcG9ydEludmFsaWRBcmd1bWVudHMoc3RkOjpzdHJpbmcgY29uc3Qm YXJnKXsKKyAgICBzdHJlYW0gPDwgIkludmFsaWQgRmlsdGVyOiAiIDw8IGFyZyA8PCBzdGQ6OmVu ZGw7Cit9CisKK3ZvaWQgQ29uc29sZVJlcG9ydGVyOjphc3NlcnRpb25TdGFydGluZyhBc3NlcnRp b25JbmZvIGNvbnN0Jikge30KKworYm9vbCBDb25zb2xlUmVwb3J0ZXI6OmFzc2VydGlvbkVuZGVk KEFzc2VydGlvblN0YXRzIGNvbnN0JiBfYXNzZXJ0aW9uU3RhdHMpIHsKKyAgICBBc3NlcnRpb25S ZXN1bHQgY29uc3QmIHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisK KyAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVz dWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOworCisgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdh cyBzdWNjZXNzZnVsIGJ1dCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhlbS4KKyAgICBpZiAoIWluY2x1 ZGVSZXN1bHRzICYmIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpXYXJuaW5n KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBsYXp5UHJpbnQoKTsKKworICAgIENvbnNv bGVBc3NlcnRpb25QcmludGVyIHByaW50ZXIoc3RyZWFtLCBfYXNzZXJ0aW9uU3RhdHMsIGluY2x1 ZGVSZXN1bHRzKTsKKyAgICBwcmludGVyLnByaW50KCk7CisgICAgc3RyZWFtIDw8IHN0ZDo6ZW5k bDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb25zb2xlUmVwb3J0ZXI6OnNlY3Rpb25T dGFydGluZyhTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvKSB7CisgICAgbV90YWJsZVBy aW50ZXItPmNsb3NlKCk7CisgICAgbV9oZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgU3RyZWFt aW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uU3RhcnRpbmcoX3NlY3Rpb25JbmZvKTsKK30KK3ZvaWQg Q29uc29sZVJlcG9ydGVyOjpzZWN0aW9uRW5kZWQoU2VjdGlvblN0YXRzIGNvbnN0JiBfc2VjdGlv blN0YXRzKSB7CisgICAgbV90YWJsZVByaW50ZXItPmNsb3NlKCk7CisgICAgaWYgKF9zZWN0aW9u U3RhdHMubWlzc2luZ0Fzc2VydGlvbnMpIHsKKyAgICAgICAgbGF6eVByaW50KCk7CisgICAgICAg IENvbG91ciBjb2xvdXIoQ29sb3VyOjpSZXN1bHRFcnJvcik7CisgICAgICAgIGlmIChtX3NlY3Rp b25TdGFjay5zaXplKCkgPiAxKQorICAgICAgICAgICAgc3RyZWFtIDw8ICJcbk5vIGFzc2VydGlv bnMgaW4gc2VjdGlvbiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmVhbSA8PCAiXG5O byBhc3NlcnRpb25zIGluIHRlc3QgY2FzZSI7CisgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IF9z ZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCAiJ1xuIiA8PCBzdGQ6OmVuZGw7CisgICAg fQorICAgIGRvdWJsZSBkdXIgPSBfc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzOworICAg IGlmIChzaG91bGRTaG93RHVyYXRpb24oKm1fY29uZmlnLCBkdXIpKSB7CisgICAgICAgIHN0cmVh bSA8PCBnZXRGb3JtYXR0ZWREdXJhdGlvbihkdXIpIDw8ICIgczogIiA8PCBfc2VjdGlvblN0YXRz LnNlY3Rpb25JbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBpZiAobV9oZWFkZXJQ cmludGVkKSB7CisgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgIH0KKyAgICBT dHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25FbmRlZChfc2VjdGlvblN0YXRzKTsKK30KKwor I2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcpCit2b2lkIENvbnNv bGVSZXBvcnRlcjo6YmVuY2htYXJrUHJlcGFyaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKSB7 CisJbGF6eVByaW50V2l0aG91dENsb3NpbmdCZW5jaG1hcmtUYWJsZSgpOworCisJYXV0byBuYW1l Q29sID0gQ29sdW1uKG5hbWUpLndpZHRoKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihtX3RhYmxl UHJpbnRlci0+Y29sdW1uSW5mb3MoKVswXS53aWR0aCAtIDIpKTsKKworCWJvb2wgZmlyc3RMaW5l ID0gdHJ1ZTsKKwlmb3IgKGF1dG8gbGluZSA6IG5hbWVDb2wpIHsKKwkJaWYgKCFmaXJzdExpbmUp CisJCQkoKm1fdGFibGVQcmludGVyKSA8PCBDb2x1bW5CcmVhaygpIDw8IENvbHVtbkJyZWFrKCkg PDwgQ29sdW1uQnJlYWsoKTsKKwkJZWxzZQorCQkJZmlyc3RMaW5lID0gZmFsc2U7CisKKwkJKCpt X3RhYmxlUHJpbnRlcikgPDwgbGluZSA8PCBDb2x1bW5CcmVhaygpOworCX0KK30KKwordm9pZCBD b25zb2xlUmVwb3J0ZXI6OmJlbmNobWFya1N0YXJ0aW5nKEJlbmNobWFya0luZm8gY29uc3QmIGlu Zm8pIHsKKyAgICAoKm1fdGFibGVQcmludGVyKSA8PCBpbmZvLnNhbXBsZXMgPDwgQ29sdW1uQnJl YWsoKQorICAgICAgICA8PCBpbmZvLml0ZXJhdGlvbnMgPDwgQ29sdW1uQnJlYWsoKTsKKyAgICBp ZiAoIW1fY29uZmlnLT5iZW5jaG1hcmtOb0FuYWx5c2lzKCkpCisgICAgICAgICgqbV90YWJsZVBy aW50ZXIpIDw8IER1cmF0aW9uKGluZm8uZXN0aW1hdGVkRHVyYXRpb24pIDw8IENvbHVtbkJyZWFr KCk7Cit9Cit2b2lkIENvbnNvbGVSZXBvcnRlcjo6YmVuY2htYXJrRW5kZWQoQmVuY2htYXJrU3Rh dHM8PiBjb25zdCYgc3RhdHMpIHsKKyAgICBpZiAobV9jb25maWctPmJlbmNobWFya05vQW5hbHlz aXMoKSkKKyAgICB7CisgICAgICAgICgqbV90YWJsZVByaW50ZXIpIDw8IER1cmF0aW9uKHN0YXRz Lm1lYW4ucG9pbnQuY291bnQoKSkgPDwgQ29sdW1uQnJlYWsoKTsKKyAgICB9CisgICAgZWxzZQor ICAgIHsKKyAgICAgICAgKCptX3RhYmxlUHJpbnRlcikgPDwgQ29sdW1uQnJlYWsoKQorICAgICAg ICAgICAgPDwgRHVyYXRpb24oc3RhdHMubWVhbi5wb2ludC5jb3VudCgpKSA8PCBDb2x1bW5CcmVh aygpCisgICAgICAgICAgICA8PCBEdXJhdGlvbihzdGF0cy5tZWFuLmxvd2VyX2JvdW5kLmNvdW50 KCkpIDw8IENvbHVtbkJyZWFrKCkKKyAgICAgICAgICAgIDw8IER1cmF0aW9uKHN0YXRzLm1lYW4u dXBwZXJfYm91bmQuY291bnQoKSkgPDwgQ29sdW1uQnJlYWsoKSA8PCBDb2x1bW5CcmVhaygpCisg ICAgICAgICAgICA8PCBEdXJhdGlvbihzdGF0cy5zdGFuZGFyZERldmlhdGlvbi5wb2ludC5jb3Vu dCgpKSA8PCBDb2x1bW5CcmVhaygpCisgICAgICAgICAgICA8PCBEdXJhdGlvbihzdGF0cy5zdGFu ZGFyZERldmlhdGlvbi5sb3dlcl9ib3VuZC5jb3VudCgpKSA8PCBDb2x1bW5CcmVhaygpCisgICAg ICAgICAgICA8PCBEdXJhdGlvbihzdGF0cy5zdGFuZGFyZERldmlhdGlvbi51cHBlcl9ib3VuZC5j b3VudCgpKSA8PCBDb2x1bW5CcmVhaygpIDw8IENvbHVtbkJyZWFrKCkgPDwgQ29sdW1uQnJlYWso KSA8PCBDb2x1bW5CcmVhaygpIDw8IENvbHVtbkJyZWFrKCk7CisgICAgfQorfQorCit2b2lkIENv bnNvbGVSZXBvcnRlcjo6YmVuY2htYXJrRmFpbGVkKHN0ZDo6c3RyaW5nIGNvbnN0JiBlcnJvcikg eworCUNvbG91ciBjb2xvdXIoQ29sb3VyOjpSZWQpOworICAgICgqbV90YWJsZVByaW50ZXIpCisg ICAgICAgIDw8ICJCZW5jaG1hcmsgZmFpbGVkICgiIDw8IGVycm9yIDw8ICcpJworICAgICAgICA8 PCBDb2x1bW5CcmVhaygpIDw8IFJvd0JyZWFrKCk7Cit9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklH X0VOQUJMRV9CRU5DSE1BUktJTkcKKwordm9pZCBDb25zb2xlUmVwb3J0ZXI6OnRlc3RDYXNlRW5k ZWQoVGVzdENhc2VTdGF0cyBjb25zdCYgX3Rlc3RDYXNlU3RhdHMpIHsKKyAgICBtX3RhYmxlUHJp bnRlci0+Y2xvc2UoKTsKKyAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQo X3Rlc3RDYXNlU3RhdHMpOworICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworfQordm9pZCBD b25zb2xlUmVwb3J0ZXI6OnRlc3RHcm91cEVuZGVkKFRlc3RHcm91cFN0YXRzIGNvbnN0JiBfdGVz dEdyb3VwU3RhdHMpIHsKKyAgICBpZiAoY3VycmVudEdyb3VwSW5mby51c2VkKSB7CisgICAgICAg IHByaW50U3VtbWFyeURpdmlkZXIoKTsKKyAgICAgICAgc3RyZWFtIDw8ICJTdW1tYXJ5IGZvciBn cm91cCAnIiA8PCBfdGVzdEdyb3VwU3RhdHMuZ3JvdXBJbmZvLm5hbWUgPDwgIic6XG4iOworICAg ICAgICBwcmludFRvdGFscyhfdGVzdEdyb3VwU3RhdHMudG90YWxzKTsKKyAgICAgICAgc3RyZWFt IDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6 OnRlc3RHcm91cEVuZGVkKF90ZXN0R3JvdXBTdGF0cyk7Cit9Cit2b2lkIENvbnNvbGVSZXBvcnRl cjo6dGVzdFJ1bkVuZGVkKFRlc3RSdW5TdGF0cyBjb25zdCYgX3Rlc3RSdW5TdGF0cykgeworICAg IHByaW50VG90YWxzRGl2aWRlcihfdGVzdFJ1blN0YXRzLnRvdGFscyk7CisgICAgcHJpbnRUb3Rh bHMoX3Rlc3RSdW5TdGF0cy50b3RhbHMpOworICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAg U3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoX3Rlc3RSdW5TdGF0cyk7Cit9Cit2 b2lkIENvbnNvbGVSZXBvcnRlcjo6dGVzdFJ1blN0YXJ0aW5nKFRlc3RSdW5JbmZvIGNvbnN0JiBf dGVzdEluZm8pIHsKKyAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5TdGFydGluZyhf dGVzdEluZm8pOworICAgIHByaW50VGVzdEZpbHRlcnMoKTsKK30KKwordm9pZCBDb25zb2xlUmVw b3J0ZXI6OmxhenlQcmludCgpIHsKKworICAgIG1fdGFibGVQcmludGVyLT5jbG9zZSgpOworICAg IGxhenlQcmludFdpdGhvdXRDbG9zaW5nQmVuY2htYXJrVGFibGUoKTsKK30KKwordm9pZCBDb25z b2xlUmVwb3J0ZXI6OmxhenlQcmludFdpdGhvdXRDbG9zaW5nQmVuY2htYXJrVGFibGUoKSB7CisK KyAgICBpZiAoIWN1cnJlbnRUZXN0UnVuSW5mby51c2VkKQorICAgICAgICBsYXp5UHJpbnRSdW5J bmZvKCk7CisgICAgaWYgKCFjdXJyZW50R3JvdXBJbmZvLnVzZWQpCisgICAgICAgIGxhenlQcmlu dEdyb3VwSW5mbygpOworCisgICAgaWYgKCFtX2hlYWRlclByaW50ZWQpIHsKKyAgICAgICAgcHJp bnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKTsKKyAgICAgICAgbV9oZWFkZXJQcmludGVkID0g dHJ1ZTsKKyAgICB9Cit9Cit2b2lkIENvbnNvbGVSZXBvcnRlcjo6bGF6eVByaW50UnVuSW5mbygp IHsKKyAgICBzdHJlYW0gPDwgJ1xuJyA8PCBnZXRMaW5lT2ZDaGFyczwnfic+KCkgPDwgJ1xuJzsK KyAgICBDb2xvdXIgY29sb3VyKENvbG91cjo6U2Vjb25kYXJ5VGV4dCk7CisgICAgc3RyZWFtIDw8 IGN1cnJlbnRUZXN0UnVuSW5mby0+bmFtZQorICAgICAgICA8PCAiIGlzIGEgQ2F0Y2ggdiIgPDwg bGlicmFyeVZlcnNpb24oKSA8PCAiIGhvc3QgYXBwbGljYXRpb24uXG4iCisgICAgICAgIDw8ICJS dW4gd2l0aCAtPyBmb3Igb3B0aW9uc1xuXG4iOworCisgICAgaWYgKG1fY29uZmlnLT5ybmdTZWVk KCkgIT0gMCkKKyAgICAgICAgc3RyZWFtIDw8ICJSYW5kb21uZXNzIHNlZWRlZCB0bzogIiA8PCBt X2NvbmZpZy0+cm5nU2VlZCgpIDw8ICJcblxuIjsKKworICAgIGN1cnJlbnRUZXN0UnVuSW5mby51 c2VkID0gdHJ1ZTsKK30KK3ZvaWQgQ29uc29sZVJlcG9ydGVyOjpsYXp5UHJpbnRHcm91cEluZm8o KSB7CisgICAgaWYgKCFjdXJyZW50R3JvdXBJbmZvLT5uYW1lLmVtcHR5KCkgJiYgY3VycmVudEdy b3VwSW5mby0+Z3JvdXBzQ291bnRzID4gMSkgeworICAgICAgICBwcmludENsb3NlZEhlYWRlcigi R3JvdXA6ICIgKyBjdXJyZW50R3JvdXBJbmZvLT5uYW1lKTsKKyAgICAgICAgY3VycmVudEdyb3Vw SW5mby51c2VkID0gdHJ1ZTsKKyAgICB9Cit9Cit2b2lkIENvbnNvbGVSZXBvcnRlcjo6cHJpbnRU ZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKSB7CisgICAgYXNzZXJ0KCFtX3NlY3Rpb25TdGFjay5l bXB0eSgpKTsKKyAgICBwcmludE9wZW5IZWFkZXIoY3VycmVudFRlc3RDYXNlSW5mby0+bmFtZSk7 CisKKyAgICBpZiAobV9zZWN0aW9uU3RhY2suc2l6ZSgpID4gMSkgeworICAgICAgICBDb2xvdXIg Y29sb3VyR3VhcmQoQ29sb3VyOjpIZWFkZXJzKTsKKworICAgICAgICBhdXRvCisgICAgICAgICAg ICBpdCA9IG1fc2VjdGlvblN0YWNrLmJlZ2luKCkgKyAxLCAvLyBTa2lwIGZpcnN0IHNlY3Rpb24g KHRlc3QgY2FzZSkKKyAgICAgICAgICAgIGl0RW5kID0gbV9zZWN0aW9uU3RhY2suZW5kKCk7Cisg ICAgICAgIGZvciAoOyBpdCAhPSBpdEVuZDsgKytpdCkKKyAgICAgICAgICAgIHByaW50SGVhZGVy U3RyaW5nKGl0LT5uYW1lLCAyKTsKKyAgICB9CisKKyAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5m byA9IG1fc2VjdGlvblN0YWNrLmJhY2soKS5saW5lSW5mbzsKKworICAgIHN0cmVhbSA8PCBnZXRM aW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICBDb2xvdXIgY29sb3VyR3VhcmQoQ29sb3Vy OjpGaWxlTmFtZSk7CisgICAgc3RyZWFtIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgc3RyZWFt IDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9p ZCBDb25zb2xlUmVwb3J0ZXI6OnByaW50Q2xvc2VkSGVhZGVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBf bmFtZSkgeworICAgIHByaW50T3BlbkhlYWRlcihfbmFtZSk7CisgICAgc3RyZWFtIDw8IGdldExp bmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nOworfQordm9pZCBDb25zb2xlUmVwb3J0ZXI6OnByaW50 T3BlbkhlYWRlcihzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUpIHsKKyAgICBzdHJlYW0gPDwgZ2V0 TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgeworICAgICAgICBDb2xvdXIgY29sb3Vy R3VhcmQoQ29sb3VyOjpIZWFkZXJzKTsKKyAgICAgICAgcHJpbnRIZWFkZXJTdHJpbmcoX25hbWUp OworICAgIH0KK30KKworLy8gaWYgc3RyaW5nIGhhcyBhIDogaW4gZmlyc3QgbGluZSB3aWxsIHNl dCBpbmRlbnQgdG8gZm9sbG93IGl0IG9uCisvLyBzdWJzZXF1ZW50IGxpbmVzCit2b2lkIENvbnNv bGVSZXBvcnRlcjo6cHJpbnRIZWFkZXJTdHJpbmcoc3RkOjpzdHJpbmcgY29uc3QmIF9zdHJpbmcs IHN0ZDo6c2l6ZV90IGluZGVudCkgeworICAgIHN0ZDo6c2l6ZV90IGkgPSBfc3RyaW5nLmZpbmQo IjogIik7CisgICAgaWYgKGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIGkgKz0gMjsK KyAgICBlbHNlCisgICAgICAgIGkgPSAwOworICAgIHN0cmVhbSA8PCBDb2x1bW4oX3N0cmluZyku aW5kZW50KGluZGVudCArIGkpLmluaXRpYWxJbmRlbnQoaW5kZW50KSA8PCAnXG4nOworfQorCitz dHJ1Y3QgU3VtbWFyeUNvbHVtbiB7CisKKyAgICBTdW1tYXJ5Q29sdW1uKCBzdGQ6OnN0cmluZyBf bGFiZWwsIENvbG91cjo6Q29kZSBfY29sb3VyICkKKyAgICA6ICAgbGFiZWwoIHN0ZDo6bW92ZSgg X2xhYmVsICkgKSwKKyAgICAgICAgY29sb3VyKCBfY29sb3VyICkge30KKyAgICBTdW1tYXJ5Q29s dW1uIGFkZFJvdyggc3RkOjpzaXplX3QgY291bnQgKSB7CisgICAgICAgIFJldXNhYmxlU3RyaW5n U3RyZWFtIHJzczsKKyAgICAgICAgcnNzIDw8IGNvdW50OworICAgICAgICBzdGQ6OnN0cmluZyBy b3cgPSByc3Muc3RyKCk7CisgICAgICAgIGZvciAoYXV0byYgb2xkUm93IDogcm93cykgeworICAg ICAgICAgICAgd2hpbGUgKG9sZFJvdy5zaXplKCkgPCByb3cuc2l6ZSgpKQorICAgICAgICAgICAg ICAgIG9sZFJvdyA9ICcgJyArIG9sZFJvdzsKKyAgICAgICAgICAgIHdoaWxlIChvbGRSb3cuc2l6 ZSgpID4gcm93LnNpemUoKSkKKyAgICAgICAgICAgICAgICByb3cgPSAnICcgKyByb3c7CisgICAg ICAgIH0KKyAgICAgICAgcm93cy5wdXNoX2JhY2socm93KTsKKyAgICAgICAgcmV0dXJuICp0aGlz OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGxhYmVsOworICAgIENvbG91cjo6Q29kZSBjb2xv dXI7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJvd3M7CisKK307CisKK3ZvaWQgQ29u c29sZVJlcG9ydGVyOjpwcmludFRvdGFscyggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSB7CisgICAg aWYgKHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA9PSAwKSB7CisgICAgICAgIHN0cmVhbSA8PCBD b2xvdXIoQ29sb3VyOjpXYXJuaW5nKSA8PCAiTm8gdGVzdHMgcmFuXG4iOworICAgIH0gZWxzZSBp ZiAodG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA+IDAgJiYgdG90YWxzLnRlc3RDYXNlcy5hbGxQ YXNzZWQoKSkgeworICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKENvbG91cjo6UmVzdWx0U3VjY2Vz cykgPDwgIkFsbCB0ZXN0cyBwYXNzZWQiOworICAgICAgICBzdHJlYW0gPDwgIiAoIgorICAgICAg ICAgICAgPDwgcGx1cmFsaXNlKHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCwgImFzc2VydGlvbiIp IDw8ICIgaW4gIgorICAgICAgICAgICAgPDwgcGx1cmFsaXNlKHRvdGFscy50ZXN0Q2FzZXMucGFz c2VkLCAidGVzdCBjYXNlIikgPDwgJyknCisgICAgICAgICAgICA8PCAnXG4nOworICAgIH0gZWxz ZSB7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29sdW1uczsKKyAgICAg ICAgY29sdW1ucy5wdXNoX2JhY2soU3VtbWFyeUNvbHVtbigiIiwgQ29sb3VyOjpOb25lKQorICAg ICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyh0b3RhbHMuYXNzZXJ0aW9ucy50b3Rh bCgpKSk7CisgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKFN1bW1hcnlDb2x1bW4oInBhc3NlZCIs IENvbG91cjo6U3VjY2VzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyh0b3Rh bHMudGVzdENhc2VzLnBhc3NlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyh0 b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQpKTsKKyAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soU3Vt bWFyeUNvbHVtbigiZmFpbGVkIiwgQ29sb3VyOjpSZXN1bHRFcnJvcikKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgLmFkZFJvdyh0b3RhbHMudGVzdENhc2VzLmZhaWxlZCkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgLmFkZFJvdyh0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQpKTsKKyAgICAg ICAgY29sdW1ucy5wdXNoX2JhY2soU3VtbWFyeUNvbHVtbigiZmFpbGVkIGFzIGV4cGVjdGVkIiwg Q29sb3VyOjpSZXN1bHRFeHBlY3RlZEZhaWx1cmUpCisgICAgICAgICAgICAgICAgICAgICAgICAg IC5hZGRSb3codG90YWxzLnRlc3RDYXNlcy5mYWlsZWRCdXRPaykKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgLmFkZFJvdyh0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPaykpOworCisgICAg ICAgIHByaW50U3VtbWFyeVJvdygidGVzdCBjYXNlcyIsIGNvbHVtbnMsIDApOworICAgICAgICBw cmludFN1bW1hcnlSb3coImFzc2VydGlvbnMiLCBjb2x1bW5zLCAxKTsKKyAgICB9Cit9Cit2b2lk IENvbnNvbGVSZXBvcnRlcjo6cHJpbnRTdW1tYXJ5Um93KHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJl bCwgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29uc3QmIGNvbHMsIHN0ZDo6c2l6ZV90IHJv dykgeworICAgIGZvciAoYXV0byBjb2wgOiBjb2xzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZh bHVlID0gY29sLnJvd3Nbcm93XTsKKyAgICAgICAgaWYgKGNvbC5sYWJlbC5lbXB0eSgpKSB7Cisg ICAgICAgICAgICBzdHJlYW0gPDwgbGFiZWwgPDwgIjogIjsKKyAgICAgICAgICAgIGlmICh2YWx1 ZSAhPSAiMCIpCisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHZhbHVlOworICAgICAgICAgICAg ZWxzZQorICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoQ29sb3VyOjpXYXJuaW5nKSA8 PCAiLSBub25lIC0iOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9ICIwIikgeworICAgICAg ICAgICAgc3RyZWFtIDw8IENvbG91cihDb2xvdXI6OkxpZ2h0R3JleSkgPDwgIiB8ICI7CisgICAg ICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKGNvbC5jb2xvdXIpCisgICAgICAgICAgICAgICAgPDwg dmFsdWUgPDwgJyAnIDw8IGNvbC5sYWJlbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdHJlYW0g PDwgJ1xuJzsKK30KKwordm9pZCBDb25zb2xlUmVwb3J0ZXI6OnByaW50VG90YWxzRGl2aWRlcihU b3RhbHMgY29uc3QmIHRvdGFscykgeworICAgIGlmICh0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkg PiAwKSB7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZFJhdGlvID0gbWFrZVJhdGlvKHRvdGFs cy50ZXN0Q2FzZXMuZmFpbGVkLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkpOworICAgICAgICBz dGQ6OnNpemVfdCBmYWlsZWRCdXRPa1JhdGlvID0gbWFrZVJhdGlvKHRvdGFscy50ZXN0Q2FzZXMu ZmFpbGVkQnV0T2ssIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSk7CisgICAgICAgIHN0ZDo6c2l6 ZV90IHBhc3NlZFJhdGlvID0gbWFrZVJhdGlvKHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCB0b3Rh bHMudGVzdENhc2VzLnRvdGFsKCkpOworICAgICAgICB3aGlsZSAoZmFpbGVkUmF0aW8gKyBmYWls ZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAt IDEpCisgICAgICAgICAgICBmaW5kTWF4KGZhaWxlZFJhdGlvLCBmYWlsZWRCdXRPa1JhdGlvLCBw YXNzZWRSYXRpbykrKzsKKyAgICAgICAgd2hpbGUgKGZhaWxlZFJhdGlvICsgZmFpbGVkQnV0T2tS YXRpbyArIHBhc3NlZFJhdGlvID4gQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggLSAxKQorICAg ICAgICAgICAgZmluZE1heChmYWlsZWRSYXRpbywgZmFpbGVkQnV0T2tSYXRpbywgcGFzc2VkUmF0 aW8pLS07CisKKyAgICAgICAgc3RyZWFtIDw8IENvbG91cihDb2xvdXI6OkVycm9yKSA8PCBzdGQ6 OnN0cmluZyhmYWlsZWRSYXRpbywgJz0nKTsKKyAgICAgICAgc3RyZWFtIDw8IENvbG91cihDb2xv dXI6OlJlc3VsdEV4cGVjdGVkRmFpbHVyZSkgPDwgc3RkOjpzdHJpbmcoZmFpbGVkQnV0T2tSYXRp bywgJz0nKTsKKyAgICAgICAgaWYgKHRvdGFscy50ZXN0Q2FzZXMuYWxsUGFzc2VkKCkpCisgICAg ICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKENvbG91cjo6UmVzdWx0U3VjY2VzcykgPDwgc3RkOjpz dHJpbmcocGFzc2VkUmF0aW8sICc9Jyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmVh bSA8PCBDb2xvdXIoQ29sb3VyOjpTdWNjZXNzKSA8PCBzdGQ6OnN0cmluZyhwYXNzZWRSYXRpbywg Jz0nKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKENvbG91cjo6V2Fy bmluZykgPDwgc3RkOjpzdHJpbmcoQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggLSAxLCAnPScp OworICAgIH0KKyAgICBzdHJlYW0gPDwgJ1xuJzsKK30KK3ZvaWQgQ29uc29sZVJlcG9ydGVyOjpw cmludFN1bW1hcnlEaXZpZGVyKCkgeworICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+ KCkgPDwgJ1xuJzsKK30KKwordm9pZCBDb25zb2xlUmVwb3J0ZXI6OnByaW50VGVzdEZpbHRlcnMo KSB7CisgICAgaWYgKG1fY29uZmlnLT50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSkgeworICAgICAg ICBDb2xvdXIgZ3VhcmQoQ29sb3VyOjpCcmlnaHRZZWxsb3cpOworICAgICAgICBzdHJlYW0gPDwg IkZpbHRlcnM6ICIgPDwgc2VyaWFsaXplRmlsdGVycyhtX2NvbmZpZy0+Z2V0VGVzdHNPclRhZ3Mo KSkgPDwgJ1xuJzsKKyAgICB9Cit9CisKK0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCJjb25zb2xl IiwgQ29uc29sZVJlcG9ydGVyKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmIGRl ZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKyNpZiBkZWZp bmVkKF9fY2xhbmdfXykKKyMgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisv LyBlbmQgY2F0Y2hfcmVwb3J0ZXJfY29uc29sZS5jcHAKKy8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVy X2p1bml0LmNwcAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2lu Y2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb21hbmlwPgor CituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgc3RkOjpzdHJp bmcgZ2V0Q3VycmVudFRpbWVzdGFtcCgpIHsKKyAgICAgICAgICAgIC8vIEJld2FyZSwgdGhpcyBp cyBub3QgcmVlbnRyYW50IGJlY2F1c2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZXMK KyAgICAgICAgICAgIC8vIEFsc28sIFVUQyBvbmx5LCBhZ2FpbiBiZWNhdXNlIG9mIGJhY2t3YXJk IGNvbXBhdGliaWxpdHkgKCV6IGlzIEMrKzExKQorICAgICAgICAgICAgdGltZV90IHJhd3RpbWU7 CisgICAgICAgICAgICBzdGQ6OnRpbWUoJnJhd3RpbWUpOworICAgICAgICAgICAgYXV0byBjb25z dCB0aW1lU3RhbXBTaXplID0gc2l6ZW9mKCIyMDE3LTAxLTE2VDE3OjA2OjQ1WiIpOworCisjaWZk ZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHN0ZDo6dG0gdGltZUluZm8gPSB7fTsKKyAgICAgICAg ICAgIGdtdGltZV9zKCZ0aW1lSW5mbywgJnJhd3RpbWUpOworI2Vsc2UKKyAgICAgICAgICAgIHN0 ZDo6dG0qIHRpbWVJbmZvOworICAgICAgICAgICAgdGltZUluZm8gPSBzdGQ6OmdtdGltZSgmcmF3 dGltZSk7CisjZW5kaWYKKworICAgICAgICAgICAgY2hhciB0aW1lU3RhbXBbdGltZVN0YW1wU2l6 ZV07CisgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgZm10ID0gIiVZLSVtLSVkVCVIOiVN OiVTWiI7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3RkOjpzdHJmdGltZSh0aW1l U3RhbXAsIHRpbWVTdGFtcFNpemUsIGZtdCwgJnRpbWVJbmZvKTsKKyNlbHNlCisgICAgICAgICAg ICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1wU2l6ZSwgZm10LCB0aW1lSW5mbyk7 CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyh0aW1lU3RhbXAsIHRpbWVT dGFtcFNpemUtMSk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlTmFtZVRh Zyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnRhZ3MpIHsKKyAgICAgICAgICAgIGF1 dG8gaXQgPSBzdGQ6OmZpbmRfaWYoYmVnaW4odGFncyksCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGVuZCh0YWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgW10gKHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcpIHtyZXR1cm4gdGFnLmZyb250KCkgPT0gJyMn OyB9KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSB0YWdzLmVuZCgpKQorICAgICAgICAgICAgICAg IHJldHVybiBpdC0+c3Vic3RyKDEpOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7 CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3JtYXRzIHRoZSBkdXJhdGlvbiBpbiBzZWNvbmRz IHRvIDMgZGVjaW1hbCBwbGFjZXMuCisgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHNv bWUgZ2VuaXVzIGRlZmluZWQgTWF2ZW4gU3VyZWZpcmUgc2NoZW1hCisgICAgICAgIC8vIGluIGEg d2F5IHRoYXQgb25seSBhY2NlcHRzIDMgZGVjaW1hbCBwbGFjZXMsIGFuZCB0b29scyBsaWtlCisg ICAgICAgIC8vIEplbmtpbnMgdXNlIHRoYXQgc2NoZW1hIGZvciB2YWxpZGF0aW9uIEpVbml0IHJl cG9ydGVyIG91dHB1dC4KKyAgICAgICAgc3RkOjpzdHJpbmcgZm9ybWF0RHVyYXRpb24oIGRvdWJs ZSBzZWNvbmRzICkgeworICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOworICAg ICAgICAgICAgcnNzIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oIDMgKSA8PCBz ZWNvbmRzOworICAgICAgICAgICAgcmV0dXJuIHJzcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAg fSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKyAgICBKdW5pdFJlcG9ydGVyOjpKdW5pdFJlcG9y dGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBDdW11bGF0 aXZlUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICB4bWwoIF9jb25maWcuc3Ry ZWFtKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVk aXJlY3RTdGRPdXQgPSB0cnVlOworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJl cG9ydEFsbEFzc2VydGlvbnMgPSB0cnVlOworICAgICAgICB9CisKKyAgICBKdW5pdFJlcG9ydGVy Ojp+SnVuaXRSZXBvcnRlcigpIHt9CisKKyAgICBzdGQ6OnN0cmluZyBKdW5pdFJlcG9ydGVyOjpn ZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBp biBhbiBYTUwgZm9ybWF0IHRoYXQgbG9va3MgbGlrZSBBbnQncyBqdW5pdHJlcG9ydCB0YXJnZXQi OworICAgIH0KKworICAgIHZvaWQgSnVuaXRSZXBvcnRlcjo6bm9NYXRjaGluZ1Rlc3RDYXNlcygg c3RkOjpzdHJpbmcgY29uc3QmIC8qc3BlYyovICkge30KKworICAgIHZvaWQgSnVuaXRSZXBvcnRl cjo6dGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgcnVuSW5mbyApICB7CisgICAg ICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RSdW5TdGFydGluZyggcnVuSW5mbyApOwor ICAgICAgICB4bWwuc3RhcnRFbGVtZW50KCAidGVzdHN1aXRlcyIgKTsKKyAgICB9CisKKyAgICB2 b2lkIEp1bml0UmVwb3J0ZXI6OnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdy b3VwSW5mbyApIHsKKyAgICAgICAgc3VpdGVUaW1lci5zdGFydCgpOworICAgICAgICBzdGRPdXRG b3JTdWl0ZS5jbGVhcigpOworICAgICAgICBzdGRFcnJGb3JTdWl0ZS5jbGVhcigpOworICAgICAg ICB1bmV4cGVjdGVkRXhjZXB0aW9ucyA9IDA7CisgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJh c2U6OnRlc3RHcm91cFN0YXJ0aW5nKCBncm91cEluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIEp1 bml0UmVwb3J0ZXI6OnRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENh c2VJbmZvICkgeworICAgICAgICBtX29rVG9GYWlsID0gdGVzdENhc2VJbmZvLm9rVG9GYWlsKCk7 CisgICAgfQorCisgICAgYm9vbCBKdW5pdFJlcG9ydGVyOjphc3NlcnRpb25FbmRlZCggQXNzZXJ0 aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgeworICAgICAgICBpZiggYXNzZXJ0aW9u U3RhdHMuYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSA9PSBSZXN1bHRXYXM6OlRocmV3 RXhjZXB0aW9uICYmICFtX29rVG9GYWlsICkKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRp b25zKys7CisgICAgICAgIHJldHVybiBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjphc3NlcnRpb25F bmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICB9CisKKyAgICB2b2lkIEp1bml0UmVwb3J0ZXI6 OnRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSB7Cisg ICAgICAgIHN0ZE91dEZvclN1aXRlICs9IHRlc3RDYXNlU3RhdHMuc3RkT3V0OworICAgICAgICBz dGRFcnJGb3JTdWl0ZSArPSB0ZXN0Q2FzZVN0YXRzLnN0ZEVycjsKKyAgICAgICAgQ3VtdWxhdGl2 ZVJlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgIH0KKwor ICAgIHZvaWQgSnVuaXRSZXBvcnRlcjo6dGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNv bnN0JiB0ZXN0R3JvdXBTdGF0cyApIHsKKyAgICAgICAgZG91YmxlIHN1aXRlVGltZSA9IHN1aXRl VGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKTsKKyAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFz ZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgIHdyaXRlR3JvdXAo ICptX3Rlc3RHcm91cHMuYmFjaygpLCBzdWl0ZVRpbWUgKTsKKyAgICB9CisKKyAgICB2b2lkIEp1 bml0UmVwb3J0ZXI6OnRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKSB7CisgICAgICAgIHhtbC5lbmRF bGVtZW50KCk7CisgICAgfQorCisgICAgdm9pZCBKdW5pdFJlcG9ydGVyOjp3cml0ZUdyb3VwKCBU ZXN0R3JvdXBOb2RlIGNvbnN0JiBncm91cE5vZGUsIGRvdWJsZSBzdWl0ZVRpbWUgKSB7CisgICAg ICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoICJ0ZXN0 c3VpdGUiICk7CisKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMgY29uc3QmIHN0YXRzID0gZ3JvdXBO b2RlLnZhbHVlOworICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgc3RhdHMuZ3Jv dXBJbmZvLm5hbWUgKTsKKyAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiZXJyb3JzIiwgdW5l eHBlY3RlZEV4Y2VwdGlvbnMgKTsKKyAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiZmFpbHVy ZXMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQtdW5leHBlY3RlZEV4Y2VwdGlvbnMg KTsKKyAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGVzdHMiLCBzdGF0cy50b3RhbHMuYXNz ZXJ0aW9ucy50b3RhbCgpICk7CisgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImhvc3RuYW1l IiwgInRiZCIgKTsgLy8gIVRCRAorICAgICAgICBpZiggbV9jb25maWctPnNob3dEdXJhdGlvbnMo KSA9PSBTaG93RHVyYXRpb25zOjpOZXZlciApCisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1 dGUoICJ0aW1lIiwgIiIgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeG1sLndyaXRlQXR0 cmlidXRlKCAidGltZSIsIGZvcm1hdER1cmF0aW9uKCBzdWl0ZVRpbWUgKSApOworICAgICAgICB4 bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lc3RhbXAiLCBnZXRDdXJyZW50VGltZXN0YW1wKCkgKTsK KworICAgICAgICAvLyBXcml0ZSBwcm9wZXJ0aWVzIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAgICAg aWYgKG1fY29uZmlnLT5oYXNUZXN0RmlsdGVycygpIHx8IG1fY29uZmlnLT5ybmdTZWVkKCkgIT0g MCkgeworICAgICAgICAgICAgYXV0byBwcm9wZXJ0aWVzID0geG1sLnNjb3BlZEVsZW1lbnQoInBy b3BlcnRpZXMiKTsKKyAgICAgICAgICAgIGlmIChtX2NvbmZpZy0+aGFzVGVzdEZpbHRlcnMoKSkg eworICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCJwcm9wZXJ0eSIpCisgICAgICAg ICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSgibmFtZSIsICJmaWx0ZXJzIikKKyAgICAgICAg ICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJ2YWx1ZSIsIHNlcmlhbGl6ZUZpbHRlcnMobV9j b25maWctPmdldFRlc3RzT3JUYWdzKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm IChtX2NvbmZpZy0+cm5nU2VlZCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB4bWwuc2NvcGVk RWxlbWVudCgicHJvcGVydHkiKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUo Im5hbWUiLCAicmFuZG9tLXNlZWQiKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1 dGUoInZhbHVlIiwgbV9jb25maWctPnJuZ1NlZWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAg IH0KKworICAgICAgICAvLyBXcml0ZSB0ZXN0IGNhc2VzCisgICAgICAgIGZvciggYXV0byBjb25z dCYgY2hpbGQgOiBncm91cE5vZGUuY2hpbGRyZW4gKQorICAgICAgICAgICAgd3JpdGVUZXN0Q2Fz ZSggKmNoaWxkICk7CisKKyAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tb3V0IiAp LndyaXRlVGV4dCggdHJpbSggc3RkT3V0Rm9yU3VpdGUgKSwgWG1sRm9ybWF0dGluZzo6TmV3bGlu ZSApOworICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1lcnIiICkud3JpdGVUZXh0 KCB0cmltKCBzdGRFcnJGb3JTdWl0ZSApLCBYbWxGb3JtYXR0aW5nOjpOZXdsaW5lICk7CisgICAg fQorCisgICAgdm9pZCBKdW5pdFJlcG9ydGVyOjp3cml0ZVRlc3RDYXNlKCBUZXN0Q2FzZU5vZGUg Y29uc3QmIHRlc3RDYXNlTm9kZSApIHsKKyAgICAgICAgVGVzdENhc2VTdGF0cyBjb25zdCYgc3Rh dHMgPSB0ZXN0Q2FzZU5vZGUudmFsdWU7CisKKyAgICAgICAgLy8gQWxsIHRlc3QgY2FzZXMgaGF2 ZSBleGFjdGx5IG9uZSBzZWN0aW9uIC0gd2hpY2ggcmVwcmVzZW50cyB0aGUKKyAgICAgICAgLy8g dGVzdCBjYXNlIGl0c2VsZi4gVGhhdCBzZWN0aW9uIG1heSBoYXZlIDAtbiBuZXN0ZWQgc2VjdGlv bnMKKyAgICAgICAgYXNzZXJ0KCB0ZXN0Q2FzZU5vZGUuY2hpbGRyZW4uc2l6ZSgpID09IDEgKTsK KyAgICAgICAgU2VjdGlvbk5vZGUgY29uc3QmIHJvb3RTZWN0aW9uID0gKnRlc3RDYXNlTm9kZS5j aGlsZHJlbi5mcm9udCgpOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZSA9IHN0YXRz LnRlc3RJbmZvLmNsYXNzTmFtZTsKKworICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKSB7 CisgICAgICAgICAgICBjbGFzc05hbWUgPSBmaWxlTmFtZVRhZyhzdGF0cy50ZXN0SW5mby50YWdz KTsKKyAgICAgICAgICAgIGlmICggY2xhc3NOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAg IGNsYXNzTmFtZSA9ICJnbG9iYWwiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhbV9jb25m aWctPm5hbWUoKS5lbXB0eSgpICkKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IG1fY29uZmlnLT5u YW1lKCkgKyAiLiIgKyBjbGFzc05hbWU7CisKKyAgICAgICAgd3JpdGVTZWN0aW9uKCBjbGFzc05h bWUsICIiLCByb290U2VjdGlvbiwgc3RhdHMudGVzdEluZm8ub2tUb0ZhaWwoKSApOworICAgIH0K KworICAgIHZvaWQgSnVuaXRSZXBvcnRlcjo6d3JpdGVTZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25z dCYgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6 OnN0cmluZyBjb25zdCYgcm9vdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9kZSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXN0T2tUb0ZhaWwpIHsKKyAgICAgICAgc3RkOjpz dHJpbmcgbmFtZSA9IHRyaW0oIHNlY3Rpb25Ob2RlLnN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgKTsK KyAgICAgICAgaWYoICFyb290TmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgIG5hbWUgPSByb290 TmFtZSArICcvJyArIG5hbWU7CisKKyAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5hc3NlcnRpb25z LmVtcHR5KCkgfHwKKyAgICAgICAgICAgICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1wdHkoKSB8fAor ICAgICAgICAgICAgIXNlY3Rpb25Ob2RlLnN0ZEVyci5lbXB0eSgpICkgeworICAgICAgICAgICAg WG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggInRlc3RjYXNl IiApOworICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAg ICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImNsYXNzbmFtZSIsIG5hbWUgKTsKKyAgICAgICAgICAg ICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgInJvb3QiICk7CisgICAgICAgICAgICB9 CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUo ICJjbGFzc25hbWUiLCBjbGFzc05hbWUgKTsKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRy aWJ1dGUoICJuYW1lIiwgbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeG1sLndy aXRlQXR0cmlidXRlKCAidGltZSIsIGZvcm1hdER1cmF0aW9uKCBzZWN0aW9uTm9kZS5zdGF0cy5k dXJhdGlvbkluU2Vjb25kcyApICk7CisgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBpZGVhbCwg YnV0IGl0IHNob3VsZCBiZSBlbm91Z2ggdG8gbWltaWMgZ3Rlc3QncworICAgICAgICAgICAgLy8g anVuaXQgb3V0cHV0LgorICAgICAgICAgICAgLy8gSWRlYWxseSB0aGUgSlVuaXQgcmVwb3J0ZXIg d291bGQgYWxzbyBoYW5kbGUgYHNraXBUZXN0YAorICAgICAgICAgICAgLy8gZXZlbnRzIGFuZCB3 cml0ZSB0aG9zZSBvdXQgYXBwcm9wcmlhdGVseS4KKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJp YnV0ZSggInN0YXR1cyIsICJydW4iICk7CisKKyAgICAgICAgICAgIGlmIChzZWN0aW9uTm9kZS5z dGF0cy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rKSB7CisgICAgICAgICAgICAgICAgeG1sLnNjb3Bl ZEVsZW1lbnQoInNraXBwZWQiKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUo Im1lc3NhZ2UiLCAiVEVTVF9DQVNFIHRhZ2dlZCB3aXRoICFtYXlmYWlsIik7CisgICAgICAgICAg ICB9CisKKyAgICAgICAgICAgIHdyaXRlQXNzZXJ0aW9ucyggc2VjdGlvbk5vZGUgKTsKKworICAg ICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1wdHkoKSApCisgICAgICAgICAgICAg ICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tb3V0IiApLndyaXRlVGV4dCggdHJpbSggc2Vj dGlvbk5vZGUuc3RkT3V0ICksIFhtbEZvcm1hdHRpbmc6Ok5ld2xpbmUgKTsKKyAgICAgICAgICAg IGlmKCAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHhtbC5z Y29wZWRFbGVtZW50KCAic3lzdGVtLWVyciIgKS53cml0ZVRleHQoIHRyaW0oIHNlY3Rpb25Ob2Rl LnN0ZEVyciApLCBYbWxGb3JtYXR0aW5nOjpOZXdsaW5lICk7CisgICAgICAgIH0KKyAgICAgICAg Zm9yKCBhdXRvIGNvbnN0JiBjaGlsZE5vZGUgOiBzZWN0aW9uTm9kZS5jaGlsZFNlY3Rpb25zICkK KyAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgd3Jp dGVTZWN0aW9uKCBuYW1lLCAiIiwgKmNoaWxkTm9kZSwgdGVzdE9rVG9GYWlsICk7CisgICAgICAg ICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JpdGVTZWN0aW9uKCBjbGFzc05hbWUsIG5hbWUs ICpjaGlsZE5vZGUsIHRlc3RPa1RvRmFpbCApOworICAgIH0KKworICAgIHZvaWQgSnVuaXRSZXBv cnRlcjo6d3JpdGVBc3NlcnRpb25zKCBTZWN0aW9uTm9kZSBjb25zdCYgc2VjdGlvbk5vZGUgKSB7 CisgICAgICAgIGZvciggYXV0byBjb25zdCYgYXNzZXJ0aW9uIDogc2VjdGlvbk5vZGUuYXNzZXJ0 aW9ucyApCisgICAgICAgICAgICB3cml0ZUFzc2VydGlvbiggYXNzZXJ0aW9uICk7CisgICAgfQor CisgICAgdm9pZCBKdW5pdFJlcG9ydGVyOjp3cml0ZUFzc2VydGlvbiggQXNzZXJ0aW9uU3RhdHMg Y29uc3QmIHN0YXRzICkgeworICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9 IHN0YXRzLmFzc2VydGlvblJlc3VsdDsKKyAgICAgICAgaWYoICFyZXN1bHQuaXNPaygpICkgewor ICAgICAgICAgICAgc3RkOjpzdHJpbmcgZWxlbWVudE5hbWU7CisgICAgICAgICAgICBzd2l0Y2go IHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRX YXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRh bEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJlcnJv ciI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVz dWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6 OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkRpZG50 VGhyb3dFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1 cmUiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIFdl IHNob3VsZCBuZXZlciBzZWUgdGhlc2UgaGVyZToKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3Vs dFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAg ICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6T2s6CisgICAgICAgICAgICAgICAgY2FzZSBS ZXN1bHRXYXM6OlVua25vd246CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1 cmVCaXQ6CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAg ICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiaW50ZXJuYWxFcnJvciI7CisgICAgICAgICAg ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBYbWxXcml0ZXI6 OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCBlbGVtZW50TmFtZSApOworCisg ICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJtZXNzYWdlIiwgcmVzdWx0LmdldEV4cHJl c3Npb24oKSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidHlwZSIsIHJlc3Vs dC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKKworICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJl YW0gcnNzOworICAgICAgICAgICAgaWYgKHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkg PiAwKSB7CisgICAgICAgICAgICAgICAgcnNzIDw8ICJGQUlMRUQiIDw8ICI6XG4iOworICAgICAg ICAgICAgICAgIGlmIChyZXN1bHQuaGFzRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAg ICAgIHJzcyA8PCAiICAiOworICAgICAgICAgICAgICAgICAgICByc3MgPDwgcmVzdWx0LmdldEV4 cHJlc3Npb25Jbk1hY3JvKCk7CisgICAgICAgICAgICAgICAgICAgIHJzcyA8PCAnXG4nOworICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmhhc0V4cGFuZGVkRXhw cmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHJzcyA8PCAid2l0aCBleHBhbnNpb246 XG4iOworICAgICAgICAgICAgICAgICAgICByc3MgPDwgQ29sdW1uKHJlc3VsdC5nZXRFeHBhbmRl ZEV4cHJlc3Npb24oKSkuaW5kZW50KDIpIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByc3MgPDwgJ1xuJzsKKyAgICAgICAg ICAgIH0KKworICAgICAgICAgICAgaWYoICFyZXN1bHQuZ2V0TWVzc2FnZSgpLmVtcHR5KCkgKQor ICAgICAgICAgICAgICAgIHJzcyA8PCByZXN1bHQuZ2V0TWVzc2FnZSgpIDw8ICdcbic7CisgICAg ICAgICAgICBmb3IoIGF1dG8gY29uc3QmIG1zZyA6IHN0YXRzLmluZm9NZXNzYWdlcyApCisgICAg ICAgICAgICAgICAgaWYoIG1zZy50eXBlID09IFJlc3VsdFdhczo6SW5mbyApCisgICAgICAgICAg ICAgICAgICAgIHJzcyA8PCBtc2cubWVzc2FnZSA8PCAnXG4nOworCisgICAgICAgICAgICByc3Mg PDwgImF0ICIgPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKTsKKyAgICAgICAgICAgIHhtbC53cml0 ZVRleHQoIHJzcy5zdHIoKSwgWG1sRm9ybWF0dGluZzo6TmV3bGluZSApOworICAgICAgICB9Cisg ICAgfQorCisgICAgQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJqdW5pdCIsIEp1bml0UmVwb3J0 ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKy8vIGVuZCBjYXRjaF9yZXBvcnRlcl9q dW5pdC5jcHAKKy8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVyX2xpc3RlbmluZy5jcHAKKworI2luY2x1 ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBMaXN0ZW5pbmdSZXBvcnRl cjo6TGlzdGVuaW5nUmVwb3J0ZXIoKSB7CisgICAgICAgIC8vIFdlIHdpbGwgYXNzdW1lIHRoYXQg bGlzdGVuZXJzIHdpbGwgYWx3YXlzIHdhbnQgYWxsIGFzc2VydGlvbnMKKyAgICAgICAgbV9wcmVm ZXJlbmNlcy5zaG91bGRSZXBvcnRBbGxBc3NlcnRpb25zID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2 b2lkIExpc3RlbmluZ1JlcG9ydGVyOjphZGRMaXN0ZW5lciggSVN0cmVhbWluZ1JlcG9ydGVyUHRy JiYgbGlzdGVuZXIgKSB7CisgICAgICAgIG1fbGlzdGVuZXJzLnB1c2hfYmFjayggc3RkOjptb3Zl KCBsaXN0ZW5lciApICk7CisgICAgfQorCisgICAgdm9pZCBMaXN0ZW5pbmdSZXBvcnRlcjo6YWRk UmVwb3J0ZXIoSVN0cmVhbWluZ1JlcG9ydGVyUHRyJiYgcmVwb3J0ZXIpIHsKKyAgICAgICAgYXNz ZXJ0KCFtX3JlcG9ydGVyICYmICJMaXN0ZW5pbmcgcmVwb3J0ZXIgY2FuIHdyYXAgb25seSAxIHJl YWwgcmVwb3J0ZXIiKTsKKyAgICAgICAgbV9yZXBvcnRlciA9IHN0ZDo6bW92ZSggcmVwb3J0ZXIg KTsKKyAgICAgICAgbV9wcmVmZXJlbmNlcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IG1fcmVwb3J0 ZXItPmdldFByZWZlcmVuY2VzKCkuc2hvdWxkUmVkaXJlY3RTdGRPdXQ7CisgICAgfQorCisgICAg UmVwb3J0ZXJQcmVmZXJlbmNlcyBMaXN0ZW5pbmdSZXBvcnRlcjo6Z2V0UHJlZmVyZW5jZXMoKSBj b25zdCB7CisgICAgICAgIHJldHVybiBtX3ByZWZlcmVuY2VzOworICAgIH0KKworICAgIHN0ZDo6 c2V0PFZlcmJvc2l0eT4gTGlzdGVuaW5nUmVwb3J0ZXI6OmdldFN1cHBvcnRlZFZlcmJvc2l0aWVz KCkgeworICAgICAgICByZXR1cm4gc3RkOjpzZXQ8VmVyYm9zaXR5PnsgfTsKKyAgICB9CisKKyAg ICB2b2lkIExpc3RlbmluZ1JlcG9ydGVyOjpub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmlu ZyBjb25zdCYgc3BlYyApIHsKKyAgICAgICAgZm9yICggYXV0byBjb25zdCYgbGlzdGVuZXIgOiBt X2xpc3RlbmVycyApIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5ub01hdGNoaW5nVGVzdENhc2Vz KCBzcGVjICk7CisgICAgICAgIH0KKyAgICAgICAgbV9yZXBvcnRlci0+bm9NYXRjaGluZ1Rlc3RD YXNlcyggc3BlYyApOworICAgIH0KKworICAgIHZvaWQgTGlzdGVuaW5nUmVwb3J0ZXI6OnJlcG9y dEludmFsaWRBcmd1bWVudHMoc3RkOjpzdHJpbmcgY29uc3QmYXJnKXsKKyAgICAgICAgZm9yICgg YXV0byBjb25zdCYgbGlzdGVuZXIgOiBtX2xpc3RlbmVycyApIHsKKyAgICAgICAgICAgIGxpc3Rl bmVyLT5yZXBvcnRJbnZhbGlkQXJndW1lbnRzKCBhcmcgKTsKKyAgICAgICAgfQorICAgICAgICBt X3JlcG9ydGVyLT5yZXBvcnRJbnZhbGlkQXJndW1lbnRzKCBhcmcgKTsKKyAgICB9CisKKyNpZiBk ZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HKQorICAgIHZvaWQgTGlzdGVu aW5nUmVwb3J0ZXI6OmJlbmNobWFya1ByZXBhcmluZyggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUg KSB7CisJCWZvciAoYXV0byBjb25zdCYgbGlzdGVuZXIgOiBtX2xpc3RlbmVycykgeworCQkJbGlz dGVuZXItPmJlbmNobWFya1ByZXBhcmluZyhuYW1lKTsKKwkJfQorCQltX3JlcG9ydGVyLT5iZW5j aG1hcmtQcmVwYXJpbmcobmFtZSk7CisJfQorICAgIHZvaWQgTGlzdGVuaW5nUmVwb3J0ZXI6OmJl bmNobWFya1N0YXJ0aW5nKCBCZW5jaG1hcmtJbmZvIGNvbnN0JiBiZW5jaG1hcmtJbmZvICkgewor ICAgICAgICBmb3IgKCBhdXRvIGNvbnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgeworICAg ICAgICAgICAgbGlzdGVuZXItPmJlbmNobWFya1N0YXJ0aW5nKCBiZW5jaG1hcmtJbmZvICk7Cisg ICAgICAgIH0KKyAgICAgICAgbV9yZXBvcnRlci0+YmVuY2htYXJrU3RhcnRpbmcoIGJlbmNobWFy a0luZm8gKTsKKyAgICB9CisgICAgdm9pZCBMaXN0ZW5pbmdSZXBvcnRlcjo6YmVuY2htYXJrRW5k ZWQoIEJlbmNobWFya1N0YXRzPD4gY29uc3QmIGJlbmNobWFya1N0YXRzICkgeworICAgICAgICBm b3IgKCBhdXRvIGNvbnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgeworICAgICAgICAgICAg bGlzdGVuZXItPmJlbmNobWFya0VuZGVkKCBiZW5jaG1hcmtTdGF0cyApOworICAgICAgICB9Cisg ICAgICAgIG1fcmVwb3J0ZXItPmJlbmNobWFya0VuZGVkKCBiZW5jaG1hcmtTdGF0cyApOworICAg IH0KKworCXZvaWQgTGlzdGVuaW5nUmVwb3J0ZXI6OmJlbmNobWFya0ZhaWxlZCggc3RkOjpzdHJp bmcgY29uc3QmIGVycm9yICkgeworCQlmb3IgKGF1dG8gY29uc3QmIGxpc3RlbmVyIDogbV9saXN0 ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLT5iZW5jaG1hcmtGYWlsZWQoZXJyb3IpOworCQl9CisJCW1f cmVwb3J0ZXItPmJlbmNobWFya0ZhaWxlZChlcnJvcik7CisJfQorI2VuZGlmIC8vIENBVENIX0NP TkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HCisKKyAgICB2b2lkIExpc3RlbmluZ1JlcG9ydGVyOjp0 ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5mbyApIHsKKyAgICAg ICAgZm9yICggYXV0byBjb25zdCYgbGlzdGVuZXIgOiBtX2xpc3RlbmVycyApIHsKKyAgICAgICAg ICAgIGxpc3RlbmVyLT50ZXN0UnVuU3RhcnRpbmcoIHRlc3RSdW5JbmZvICk7CisgICAgICAgIH0K KyAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1blN0YXJ0aW5nKCB0ZXN0UnVuSW5mbyApOworICAg IH0KKworICAgIHZvaWQgTGlzdGVuaW5nUmVwb3J0ZXI6OnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91 cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIHsKKyAgICAgICAgZm9yICggYXV0byBjb25zdCYgbGlz dGVuZXIgOiBtX2xpc3RlbmVycyApIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT50ZXN0R3JvdXBT dGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgICAgIH0KKyAgICAgICAgbV9yZXBvcnRlci0+dGVz dEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgIH0KKworICAgIHZvaWQgTGlzdGVuaW5n UmVwb3J0ZXI6OnRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8g KSB7CisgICAgICAgIGZvciAoIGF1dG8gY29uc3QmIGxpc3RlbmVyIDogbV9saXN0ZW5lcnMgKSB7 CisgICAgICAgICAgICBsaXN0ZW5lci0+dGVzdENhc2VTdGFydGluZyggdGVzdEluZm8gKTsKKyAg ICAgICAgfQorICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZVN0YXJ0aW5nKCB0ZXN0SW5mbyAp OworICAgIH0KKworICAgIHZvaWQgTGlzdGVuaW5nUmVwb3J0ZXI6OnNlY3Rpb25TdGFydGluZygg U2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgeworICAgICAgICBmb3IgKCBhdXRvIGNv bnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgeworICAgICAgICAgICAgbGlzdGVuZXItPnNl Y3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKKyAgICAgICAgfQorICAgICAgICBtX3JlcG9y dGVyLT5zZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7CisgICAgfQorCisgICAgdm9pZCBM aXN0ZW5pbmdSZXBvcnRlcjo6YXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3Qm IGFzc2VydGlvbkluZm8gKSB7CisgICAgICAgIGZvciAoIGF1dG8gY29uc3QmIGxpc3RlbmVyIDog bV9saXN0ZW5lcnMgKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+YXNzZXJ0aW9uU3RhcnRpbmco IGFzc2VydGlvbkluZm8gKTsKKyAgICAgICAgfQorICAgICAgICBtX3JlcG9ydGVyLT5hc3NlcnRp b25TdGFydGluZyggYXNzZXJ0aW9uSW5mbyApOworICAgIH0KKworICAgIC8vIFRoZSByZXR1cm4g dmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6 CisgICAgYm9vbCBMaXN0ZW5pbmdSZXBvcnRlcjo6YXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0 YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIHsKKyAgICAgICAgZm9yKCBhdXRvIGNvbnN0JiBs aXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgeworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4o IGxpc3RlbmVyLT5hc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKSApOworICAgICAgICB9 CisgICAgICAgIHJldHVybiBtX3JlcG9ydGVyLT5hc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3Rh dHMgKTsKKyAgICB9CisKKyAgICB2b2lkIExpc3RlbmluZ1JlcG9ydGVyOjpzZWN0aW9uRW5kZWQo IFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgeworICAgICAgICBmb3IgKCBhdXRv IGNvbnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgeworICAgICAgICAgICAgbGlzdGVuZXIt PnNlY3Rpb25FbmRlZCggc2VjdGlvblN0YXRzICk7CisgICAgICAgIH0KKyAgICAgICAgbV9yZXBv cnRlci0+c2VjdGlvbkVuZGVkKCBzZWN0aW9uU3RhdHMgKTsKKyAgICB9CisKKyAgICB2b2lkIExp c3RlbmluZ1JlcG9ydGVyOjp0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0 Q2FzZVN0YXRzICkgeworICAgICAgICBmb3IgKCBhdXRvIGNvbnN0JiBsaXN0ZW5lciA6IG1fbGlz dGVuZXJzICkgeworICAgICAgICAgICAgbGlzdGVuZXItPnRlc3RDYXNlRW5kZWQoIHRlc3RDYXNl U3RhdHMgKTsKKyAgICAgICAgfQorICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZUVuZGVkKCB0 ZXN0Q2FzZVN0YXRzICk7CisgICAgfQorCisgICAgdm9pZCBMaXN0ZW5pbmdSZXBvcnRlcjo6dGVz dEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIHsKKyAg ICAgICAgZm9yICggYXV0byBjb25zdCYgbGlzdGVuZXIgOiBtX2xpc3RlbmVycyApIHsKKyAgICAg ICAgICAgIGxpc3RlbmVyLT50ZXN0R3JvdXBFbmRlZCggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAg ICAgfQorICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBFbmRlZCggdGVzdEdyb3VwU3RhdHMg KTsKKyAgICB9CisKKyAgICB2b2lkIExpc3RlbmluZ1JlcG9ydGVyOjp0ZXN0UnVuRW5kZWQoIFRl c3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgeworICAgICAgICBmb3IgKCBhdXRvIGNv bnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgeworICAgICAgICAgICAgbGlzdGVuZXItPnRl c3RSdW5FbmRlZCggdGVzdFJ1blN0YXRzICk7CisgICAgICAgIH0KKyAgICAgICAgbV9yZXBvcnRl ci0+dGVzdFJ1bkVuZGVkKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICB9CisKKyAgICB2b2lkIExpc3Rl bmluZ1JlcG9ydGVyOjpza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIHsK KyAgICAgICAgZm9yICggYXV0byBjb25zdCYgbGlzdGVuZXIgOiBtX2xpc3RlbmVycyApIHsKKyAg ICAgICAgICAgIGxpc3RlbmVyLT5za2lwVGVzdCggdGVzdEluZm8gKTsKKyAgICAgICAgfQorICAg ICAgICBtX3JlcG9ydGVyLT5za2lwVGVzdCggdGVzdEluZm8gKTsKKyAgICB9CisKKyAgICBib29s IExpc3RlbmluZ1JlcG9ydGVyOjppc011bHRpKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdHJ1 ZTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorLy8gZW5kIGNhdGNoX3JlcG9y dGVyX2xpc3RlbmluZy5jcHAKKy8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVyX3htbC5jcHAKKworI2lm IGRlZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2Fybmlu ZyhkaXNhYmxlOjQwNjEpIC8vIE5vdCBhbGwgbGFiZWxzIGFyZSBFWFBMSUNJVExZIGhhbmRsZWQg aW4gc3dpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgNDA2 MiAobm90IGFsbCBsYWJlbHMgYXJlIGhhbmRsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC8vIGFuZCBkZWZhdWx0IGlzIG1pc3NpbmcpIGlzIGVuYWJsZWQKKyNlbmRpZgorCituYW1l c3BhY2UgQ2F0Y2ggeworICAgIFhtbFJlcG9ydGVyOjpYbWxSZXBvcnRlciggUmVwb3J0ZXJDb25m aWcgY29uc3QmIF9jb25maWcgKQorICAgIDogICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIF9jb25m aWcgKSwKKyAgICAgICAgbV94bWwoX2NvbmZpZy5zdHJlYW0oKSkKKyAgICB7CisgICAgICAgIG1f cmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IHRydWU7CisgICAgICAgIG1fcmVw b3J0ZXJQcmVmcy5zaG91bGRSZXBvcnRBbGxBc3NlcnRpb25zID0gdHJ1ZTsKKyAgICB9CisKKyAg ICBYbWxSZXBvcnRlcjo6flhtbFJlcG9ydGVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzdHJp bmcgWG1sUmVwb3J0ZXI6OmdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gIlJlcG9y dHMgdGVzdCByZXN1bHRzIGFzIGFuIFhNTCBkb2N1bWVudCI7CisgICAgfQorCisgICAgc3RkOjpz dHJpbmcgWG1sUmVwb3J0ZXI6OmdldFN0eWxlc2hlZXRSZWYoKSBjb25zdCB7CisgICAgICAgIHJl dHVybiBzdGQ6OnN0cmluZygpOworICAgIH0KKworICAgIHZvaWQgWG1sUmVwb3J0ZXI6OndyaXRl U291cmNlSW5mbyggU291cmNlTGluZUluZm8gY29uc3QmIHNvdXJjZUluZm8gKSB7CisgICAgICAg IG1feG1sCisgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmaWxlbmFtZSIsIHNvdXJjZUlu Zm8uZmlsZSApCisgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJsaW5lIiwgc291cmNlSW5m by5saW5lICk7CisgICAgfQorCisgICAgdm9pZCBYbWxSZXBvcnRlcjo6bm9NYXRjaGluZ1Rlc3RD YXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHMgKSB7CisgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVy QmFzZTo6bm9NYXRjaGluZ1Rlc3RDYXNlcyggcyApOworICAgIH0KKworICAgIHZvaWQgWG1sUmVw b3J0ZXI6OnRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RJbmZvICkgewor ICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5TdGFydGluZyggdGVzdEluZm8g KTsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3R5bGVzaGVldFJlZiA9IGdldFN0eWxlc2hlZXRSZWYo KTsKKyAgICAgICAgaWYoICFzdHlsZXNoZWV0UmVmLmVtcHR5KCkgKQorICAgICAgICAgICAgbV94 bWwud3JpdGVTdHlsZXNoZWV0UmVmKCBzdHlsZXNoZWV0UmVmICk7CisgICAgICAgIG1feG1sLnN0 YXJ0RWxlbWVudCggIkNhdGNoIiApOworICAgICAgICBpZiggIW1fY29uZmlnLT5uYW1lKCkuZW1w dHkoKSApCisgICAgICAgICAgICBtX3htbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBtX2NvbmZp Zy0+bmFtZSgpICk7CisgICAgICAgIGlmIChtX2NvbmZpZy0+dGVzdFNwZWMoKS5oYXNGaWx0ZXJz KCkpCisgICAgICAgICAgICBtX3htbC53cml0ZUF0dHJpYnV0ZSggImZpbHRlcnMiLCBzZXJpYWxp emVGaWx0ZXJzKCBtX2NvbmZpZy0+Z2V0VGVzdHNPclRhZ3MoKSApICk7CisgICAgICAgIGlmKCBt X2NvbmZpZy0+cm5nU2VlZCgpICE9IDAgKQorICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVu dCggIlJhbmRvbW5lc3MiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzZWVk IiwgbV9jb25maWctPnJuZ1NlZWQoKSApOworICAgIH0KKworICAgIHZvaWQgWG1sUmVwb3J0ZXI6 OnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIHsKKyAgICAg ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7 CisgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkdyb3VwIiApCisgICAgICAgICAgICAud3Jp dGVBdHRyaWJ1dGUoICJuYW1lIiwgZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICB9CisKKyAgICB2b2lk IFhtbFJlcG9ydGVyOjp0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJ bmZvICkgeworICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlU3RhcnRpbmco dGVzdEluZm8pOworICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJUZXN0Q2FzZSIgKQorICAg ICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHRyaW0oIHRlc3RJbmZvLm5hbWUgKSAp CisgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJkZXNjcmlwdGlvbiIsIHRlc3RJbmZvLmRl c2NyaXB0aW9uICkKKyAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInRhZ3MiLCB0ZXN0SW5m by50YWdzQXNTdHJpbmcoKSApOworCisgICAgICAgIHdyaXRlU291cmNlSW5mbyggdGVzdEluZm8u bGluZUluZm8gKTsKKworICAgICAgICBpZiAoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0g U2hvd0R1cmF0aW9uczo6QWx3YXlzICkKKyAgICAgICAgICAgIG1fdGVzdENhc2VUaW1lci5zdGFy dCgpOworICAgICAgICBtX3htbC5lbnN1cmVUYWdDbG9zZWQoKTsKKyAgICB9CisKKyAgICB2b2lk IFhtbFJlcG9ydGVyOjpzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9u SW5mbyApIHsKKyAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uU3RhcnRpbmco IHNlY3Rpb25JbmZvICk7CisgICAgICAgIGlmKCBtX3NlY3Rpb25EZXB0aCsrID4gMCApIHsKKyAg ICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIlNlY3Rpb24iICkKKyAgICAgICAgICAgICAg ICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgdHJpbSggc2VjdGlvbkluZm8ubmFtZSApICk7Cisg ICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHNlY3Rpb25JbmZvLmxpbmVJbmZvICk7CisgICAg ICAgICAgICBtX3htbC5lbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAg IHZvaWQgWG1sUmVwb3J0ZXI6OmFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0 JiApIHsgfQorCisgICAgYm9vbCBYbWxSZXBvcnRlcjo6YXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlv blN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIHsKKworICAgICAgICBBc3NlcnRpb25SZXN1 bHQgY29uc3QmIHJlc3VsdCA9IGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAg ICAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVz dWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOworCisgICAgICAgIGlmKCBpbmNsdWRlUmVzdWx0cyB8 fCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpID09IFJlc3VsdFdhczo6V2FybmluZyApIHsKKyAgICAg ICAgICAgIC8vIFByaW50IGFueSBpbmZvIG1lc3NhZ2VzIGluIDxJbmZvPiB0YWdzLgorICAgICAg ICAgICAgZm9yKCBhdXRvIGNvbnN0JiBtc2cgOiBhc3NlcnRpb25TdGF0cy5pbmZvTWVzc2FnZXMg KSB7CisgICAgICAgICAgICAgICAgaWYoIG1zZy50eXBlID09IFJlc3VsdFdhczo6SW5mbyAmJiBp bmNsdWRlUmVzdWx0cyApIHsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVu dCggIkluZm8iICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCBtc2cu bWVzc2FnZSApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1zZy50eXBlID09IFJlc3Vs dFdhczo6V2FybmluZyApIHsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVu dCggIldhcm5pbmciICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCBt c2cubWVzc2FnZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg fQorCisgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBidXQgd2Un cmUgbm90IHByaW50aW5nIHRoZW0uCisgICAgICAgIGlmKCAhaW5jbHVkZVJlc3VsdHMgJiYgcmVz dWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAg cmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gUHJpbnQgdGhlIGV4cHJlc3Npb24gaWYgdGhlcmUg aXMgb25lLgorICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAg ICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkV4cHJlc3Npb24iICkKKyAgICAgICAgICAgICAgICAu d3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgcmVzdWx0LnN1Y2NlZWRlZCgpICkKKyAgICAgICAg ICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJ0eXBlIiwgcmVzdWx0LmdldFRlc3RNYWNyb05hbWUo KSApOworCisgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZv KCkgKTsKKworICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk9yaWdpbmFsIiApCisg ICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cHJlc3Npb24oKSApOworICAg ICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkV4cGFuZGVkIiApCisgICAgICAgICAgICAg ICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpICk7CisgICAgICAg IH0KKworICAgICAgICAvLyBBbmQuLi4gUHJpbnQgYSByZXN1bHQgYXBwbGljYWJsZSB0byBlYWNo IHJlc3VsdCB0eXBlLgorICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7 CisgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAg ICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRXhjZXB0aW9uIiApOworICAgICAgICAgICAgICAg IHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworICAgICAgICAgICAg ICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAg ICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg ICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAg IG1feG1sLnN0YXJ0RWxlbWVudCggIkZhdGFsRXJyb3JDb25kaXRpb24iICk7CisgICAgICAgICAg ICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAg ICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAg ICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg ICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgbV94bWwuc2Nv cGVkRWxlbWVudCggIkluZm8iICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVz dWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg Y2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgLy8gV2FybmluZyB3aWxs IGFscmVhZHkgaGF2ZSBiZWVuIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg ICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAg bV94bWwuc3RhcnRFbGVtZW50KCAiRmFpbHVyZSIgKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNv dXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKyAgICAgICAgICAgICAgICBtX3ht bC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICBtX3ht bC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZh dWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHJl c3VsdC5oYXNFeHByZXNzaW9uKCkgKQorICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOwor CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgWG1sUmVwb3J0ZXI6OnNl Y3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSB7CisgICAgICAg IFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvbkVuZGVkKCBzZWN0aW9uU3RhdHMgKTsKKyAg ICAgICAgaWYoIC0tbV9zZWN0aW9uRGVwdGggPiAwICkgeworICAgICAgICAgICAgWG1sV3JpdGVy OjpTY29wZWRFbGVtZW50IGUgPSBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHMi ICk7CisgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgc2VjdGlvblN0 YXRzLmFzc2VydGlvbnMucGFzc2VkICk7CisgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAi ZmFpbHVyZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAg IGUud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgc2VjdGlvblN0YXRzLmFzc2Vy dGlvbnMuZmFpbGVkQnV0T2sgKTsKKworICAgICAgICAgICAgaWYgKCBtX2NvbmZpZy0+c2hvd0R1 cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApCisgICAgICAgICAgICAgICAgZS53 cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgc2VjdGlvblN0YXRzLmR1cmF0aW9u SW5TZWNvbmRzICk7CisKKyAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAg fQorICAgIH0KKworICAgIHZvaWQgWG1sUmVwb3J0ZXI6OnRlc3RDYXNlRW5kZWQoIFRlc3RDYXNl U3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSB7CisgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVy QmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgICAgICBYbWxXcml0ZXI6 OlNjb3BlZEVsZW1lbnQgZSA9IG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0IiAp OworICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAic3VjY2VzcyIsIHRlc3RDYXNlU3RhdHMudG90 YWxzLmFzc2VydGlvbnMuYWxsT2soKSApOworCisgICAgICAgIGlmICggbV9jb25maWctPnNob3dE dXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgZS53cml0 ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgbV90ZXN0Q2FzZVRpbWVyLmdldEVsYXBz ZWRTZWNvbmRzKCkgKTsKKworICAgICAgICBpZiggIXRlc3RDYXNlU3RhdHMuc3RkT3V0LmVtcHR5 KCkgKQorICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIlN0ZE91dCIgKS53cml0ZVRl eHQoIHRyaW0oIHRlc3RDYXNlU3RhdHMuc3RkT3V0ICksIFhtbEZvcm1hdHRpbmc6Ok5ld2xpbmUg KTsKKyAgICAgICAgaWYoICF0ZXN0Q2FzZVN0YXRzLnN0ZEVyci5lbXB0eSgpICkKKyAgICAgICAg ICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJTdGRFcnIiICkud3JpdGVUZXh0KCB0cmltKCB0ZXN0 Q2FzZVN0YXRzLnN0ZEVyciApLCBYbWxGb3JtYXR0aW5nOjpOZXdsaW5lICk7CisKKyAgICAgICAg bV94bWwuZW5kRWxlbWVudCgpOworICAgIH0KKworICAgIHZvaWQgWG1sUmVwb3J0ZXI6OnRlc3RH cm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSB7CisgICAg ICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRz ICk7CisgICAgICAgIC8vIFRPRE86IENoZWNrIHRlc3RHcm91cFN0YXRzLmFib3J0aW5nIGFuZCBh Y3QgYWNjb3JkaW5nbHkuCisgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVz dWx0cyIgKQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgdGVzdEdy b3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkKKyAgICAgICAgICAgIC53cml0ZUF0 dHJpYnV0ZSggImZhaWx1cmVzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFp bGVkICkKKyAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImV4cGVjdGVkRmFpbHVyZXMiLCB0 ZXN0R3JvdXBTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworICAgICAgICBt X3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHNDYXNlcyIpCisgICAgICAgICAgICAu d3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMudGVzdENh c2VzLnBhc3NlZCApCisgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHRl c3RHcm91cFN0YXRzLnRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkICkKKyAgICAgICAgICAgIC53cml0 ZUF0dHJpYnV0ZSggImV4cGVjdGVkRmFpbHVyZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMudGVz dENhc2VzLmZhaWxlZEJ1dE9rICk7CisgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICB9 CisKKyAgICB2b2lkIFhtbFJlcG9ydGVyOjp0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25z dCYgdGVzdFJ1blN0YXRzICkgeworICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RS dW5FbmRlZCggdGVzdFJ1blN0YXRzICk7CisgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJP dmVyYWxsUmVzdWx0cyIgKQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2Vz IiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApCisgICAgICAgICAgICAu d3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9u cy5mYWlsZWQgKQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJl cyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworICAgICAg ICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHNDYXNlcyIpCisgICAgICAgICAg ICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCB0ZXN0UnVuU3RhdHMudG90YWxzLnRlc3RD YXNlcy5wYXNzZWQgKQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCB0 ZXN0UnVuU3RhdHMudG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgKQorICAgICAgICAgICAgLndyaXRl QXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMudGVzdENh c2VzLmZhaWxlZEJ1dE9rICk7CisgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICB9CisK KyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HKQorICAgIHZvaWQg WG1sUmVwb3J0ZXI6OmJlbmNobWFya1ByZXBhcmluZyhzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSkg eworICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoIkJlbmNobWFya1Jlc3VsdHMiKQorICAgICAg ICAgICAgLndyaXRlQXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7CisgICAgfQorCisgICAgdm9pZCBY bWxSZXBvcnRlcjo6YmVuY2htYXJrU3RhcnRpbmcoQmVuY2htYXJrSW5mbyBjb25zdCAmaW5mbykg eworICAgICAgICBtX3htbC53cml0ZUF0dHJpYnV0ZSgic2FtcGxlcyIsIGluZm8uc2FtcGxlcykK KyAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSgicmVzYW1wbGVzIiwgaW5mby5yZXNhbXBsZXMp CisgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoIml0ZXJhdGlvbnMiLCBpbmZvLml0ZXJhdGlv bnMpCisgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoImNsb2NrUmVzb2x1dGlvbiIsIGluZm8u Y2xvY2tSZXNvbHV0aW9uKQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJlc3RpbWF0ZWRE dXJhdGlvbiIsIGluZm8uZXN0aW1hdGVkRHVyYXRpb24pCisgICAgICAgICAgICAud3JpdGVDb21t ZW50KCJBbGwgdmFsdWVzIGluIG5hbm8gc2Vjb25kcyIpOworICAgIH0KKworICAgIHZvaWQgWG1s UmVwb3J0ZXI6OmJlbmNobWFya0VuZGVkKEJlbmNobWFya1N0YXRzPD4gY29uc3QmIGJlbmNobWFy a1N0YXRzKSB7CisgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCgibWVhbiIpCisgICAgICAgICAg ICAud3JpdGVBdHRyaWJ1dGUoInZhbHVlIiwgYmVuY2htYXJrU3RhdHMubWVhbi5wb2ludC5jb3Vu dCgpKQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJsb3dlckJvdW5kIiwgYmVuY2htYXJr U3RhdHMubWVhbi5sb3dlcl9ib3VuZC5jb3VudCgpKQorICAgICAgICAgICAgLndyaXRlQXR0cmli dXRlKCJ1cHBlckJvdW5kIiwgYmVuY2htYXJrU3RhdHMubWVhbi51cHBlcl9ib3VuZC5jb3VudCgp KQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJjaSIsIGJlbmNobWFya1N0YXRzLm1lYW4u Y29uZmlkZW5jZV9pbnRlcnZhbCk7CisgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAg ICAgbV94bWwuc3RhcnRFbGVtZW50KCJzdGFuZGFyZERldmlhdGlvbiIpCisgICAgICAgICAgICAu d3JpdGVBdHRyaWJ1dGUoInZhbHVlIiwgYmVuY2htYXJrU3RhdHMuc3RhbmRhcmREZXZpYXRpb24u cG9pbnQuY291bnQoKSkKKyAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSgibG93ZXJCb3VuZCIs IGJlbmNobWFya1N0YXRzLnN0YW5kYXJkRGV2aWF0aW9uLmxvd2VyX2JvdW5kLmNvdW50KCkpCisg ICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoInVwcGVyQm91bmQiLCBiZW5jaG1hcmtTdGF0cy5z dGFuZGFyZERldmlhdGlvbi51cHBlcl9ib3VuZC5jb3VudCgpKQorICAgICAgICAgICAgLndyaXRl QXR0cmlidXRlKCJjaSIsIGJlbmNobWFya1N0YXRzLnN0YW5kYXJkRGV2aWF0aW9uLmNvbmZpZGVu Y2VfaW50ZXJ2YWwpOworICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIG1feG1s LnN0YXJ0RWxlbWVudCgib3V0bGllcnMiKQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJ2 YXJpYW5jZSIsIGJlbmNobWFya1N0YXRzLm91dGxpZXJWYXJpYW5jZSkKKyAgICAgICAgICAgIC53 cml0ZUF0dHJpYnV0ZSgibG93TWlsZCIsIGJlbmNobWFya1N0YXRzLm91dGxpZXJzLmxvd19taWxk KQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJsb3dTZXZlcmUiLCBiZW5jaG1hcmtTdGF0 cy5vdXRsaWVycy5sb3dfc2V2ZXJlKQorICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJoaWdo TWlsZCIsIGJlbmNobWFya1N0YXRzLm91dGxpZXJzLmhpZ2hfbWlsZCkKKyAgICAgICAgICAgIC53 cml0ZUF0dHJpYnV0ZSgiaGlnaFNldmVyZSIsIGJlbmNobWFya1N0YXRzLm91dGxpZXJzLmhpZ2hf c2V2ZXJlKTsKKyAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICBtX3htbC5lbmRF bGVtZW50KCk7CisgICAgfQorCisgICAgdm9pZCBYbWxSZXBvcnRlcjo6YmVuY2htYXJrRmFpbGVk KHN0ZDo6c3RyaW5nIGNvbnN0ICZlcnJvcikgeworICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50 KCJmYWlsZWQiKS4KKyAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJtZXNzYWdlIiwgZXJyb3Ip OworICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgfQorI2VuZGlmIC8vIENBVENIX0NP TkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HCisKKyAgICBDQVRDSF9SRUdJU1RFUl9SRVBPUlRFUigg InhtbCIsIFhtbFJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZiBk ZWZpbmVkKF9NU0NfVkVSKQorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorLy8gZW5kIGNh dGNoX3JlcG9ydGVyX3htbC5jcHAKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBMZWFrRGV0ZWN0 b3IgbGVha0RldGVjdG9yOworfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRp YWdub3N0aWMgcG9wCisjZW5kaWYKKworLy8gZW5kIGNhdGNoX2ltcGwuaHBwCisjZW5kaWYKKwor I2lmZGVmIENBVENIX0NPTkZJR19NQUlOCisvLyBzdGFydCBjYXRjaF9kZWZhdWx0X21haW4uaHBw CisKKyNpZm5kZWYgX19PQkpDX18KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX1dDSEFSKSAm JiBkZWZpbmVkKENBVENIX1BMQVRGT1JNX1dJTkRPV1MpICYmIGRlZmluZWQoX1VOSUNPREUpICYm ICFkZWZpbmVkKERPX05PVF9VU0VfV01BSU4pCisvLyBTdGFuZGFyZCBDL0MrKyBXaW4zMiBVbmlj b2RlIHdtYWluIGVudHJ5IHBvaW50CitleHRlcm4gIkMiIGludCB3bWFpbiAoaW50IGFyZ2MsIHdj aGFyX3QgKiBhcmd2W10sIHdjaGFyX3QgKiBbXSkgeworI2Vsc2UKKy8vIFN0YW5kYXJkIEMvQysr IG1haW4gZW50cnkgcG9pbnQKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkgewor I2VuZGlmCisKKyAgICByZXR1cm4gQ2F0Y2g6OlNlc3Npb24oKS5ydW4oIGFyZ2MsIGFyZ3YgKTsK K30KKworI2Vsc2UgLy8gX19PQkpDX18KKworLy8gT2JqZWN0aXZlLUMgZW50cnkgcG9pbnQKK2lu dCBtYWluIChpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkgeworI2lmICFDQVRDSF9BUkNf RU5BQkxFRAorICAgIE5TQXV0b3JlbGVhc2VQb29sICogcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBv b2wgYWxsb2NdIGluaXRdOworI2VuZGlmCisKKyAgICBDYXRjaDo6cmVnaXN0ZXJUZXN0TWV0aG9k cygpOworICAgIGludCByZXN1bHQgPSBDYXRjaDo6U2Vzc2lvbigpLnJ1biggYXJnYywgKGNoYXIq Kilhcmd2ICk7CisKKyNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQKKyAgICBbcG9vbCBkcmFpbl07Cisj ZW5kaWYKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZiAvLyBfX09CSkNfXworCisv LyBlbmQgY2F0Y2hfZGVmYXVsdF9tYWluLmhwcAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDQVRD SF9DT05GSUdfSU1QTF9PTkxZKQorCisjaWZkZWYgQ0xBUkFfQ09ORklHX01BSU5fTk9UX0RFRklO RUQKKyMgIHVuZGVmIENMQVJBX0NPTkZJR19NQUlOCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENB VENIX0NPTkZJR19ESVNBQkxFKQorLy8vLy8vCisvLyBJZiB0aGlzIGNvbmZpZyBpZGVudGlmaWVy IGlzIGRlZmluZWQgdGhlbiBhbGwgQ0FUQ0ggbWFjcm9zIGFyZSBwcmVmaXhlZCB3aXRoIENBVENI XworI2lmZGVmIENBVENIX0NPTkZJR19QUkVGSVhfQUxMCisKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlS RSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX1JFUVVJUkUiLCBDYXRjaDo6UmVz dWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9SRVFV SVJFX0ZBTFNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfUkVRVUlSRV9GQUxT RSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bv c2l0aW9uOjpGYWxzZVRlc3QsIF9fVkFfQVJHU19fICkKKworI2RlZmluZSBDQVRDSF9SRVFVSVJF X1RIUk9XUyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfUkVRVUlSRV9USFJP V1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQorI2Rl ZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVS TkFMX0NBVENIX1RIUk9XU19BUyggIkNBVENIX1JFUVVJUkVfVEhST1dTX0FTIiwgZXhjZXB0aW9u VHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBD QVRDSF9SRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hf VEhST1dTX1NUUl9NQVRDSEVTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpS ZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKKyNpZiAhZGVmaW5lZChD QVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUykKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJP V1NfTUFUQ0hFUyggZXhwciwgZXhjZXB0aW9uVHlwZSwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENI X1RIUk9XU19NQVRDSEVTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1NfTUFUQ0hFUyIsIGV4Y2VwdGlv blR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkK KyNlbmRpZi8vIENBVENIX0NPTkZJR19ESVNBQkxFX01BVENIRVJTCisjZGVmaW5lIENBVENIX1JF UVVJUkVfTk9USFJPVyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDQVRDSF9SRVFV SVJFX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdT X18gKQorCisjZGVmaW5lIENBVENIX0NIRUNLKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAi Q0FUQ0hfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJl LCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX0NIRUNLX0ZBTFNFKCAuLi4gKSBJTlRFUk5B TF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0tfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRp b246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRl c3QsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tFRF9JRiggLi4uICkgSU5URVJO QUxfQ0FUQ0hfSUYoICJDQVRDSF9DSEVDS0VEX0lGIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9u OjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9DSEVDS0VE X0VMU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX0VMU0UoICJDQVRDSF9DSEVDS0VEX0VMU0UiLCBD YXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyAp CisjZGVmaW5lIENBVENIX0NIRUNLX05PRkFJTCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCgg IkNBVENIX0NIRUNLX05PRkFJTCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVP bkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCwgX19WQV9B UkdTX18gKQorCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XUyggLi4uICkgIElOVEVSTkFMX0NB VENIX1RIUk9XUyggIkNBVENIX0NIRUNLX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlv bjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tf VEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FT KCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERp c3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNL X1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX1NUUl9N QVRDSEVTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRp b246OkNvbnRpbnVlT25GYWlsdXJlLCBtYXRjaGVyLCBleHByICkKKyNpZiAhZGVmaW5lZChDQVRD SF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUykKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTX01B VENIRVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJP V1NfTUFUQ0hFUyggIkNBVENIX0NIRUNLX1RIUk9XU19NQVRDSEVTIiwgZXhjZXB0aW9uVHlwZSwg Q2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbWF0Y2hlciwgZXhw ciApCisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMKKyNkZWZpbmUgQ0FU Q0hfQ0hFQ0tfTk9USFJPVyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDQVRDSF9D SEVDS19OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVy ZSwgX19WQV9BUkdTX18gKQorCisjaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFU Q0hFUlMpCisjZGVmaW5lIENBVENIX0NIRUNLX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFM X0NIRUNLX1RIQVQoICJDQVRDSF9DSEVDS19USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERp c3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgYXJnICkKKworI2RlZmluZSBDQVRDSF9SRVFV SVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDQVRDSF9SRVFV SVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJn ICkKKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUworCisjZGVmaW5lIENB VENIX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9JTkZPIiwgbXNnICkK KyNkZWZpbmUgQ0FUQ0hfVU5TQ09QRURfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfVU5TQ09Q RURfSU5GTyggIkNBVENIX1VOU0NPUEVEX0lORk8iLCBtc2cgKQorI2RlZmluZSBDQVRDSF9XQVJO KCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9XQVJOIiwgQ2F0Y2g6OlJlc3VsdFdh czo6V2FybmluZywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwg bXNnICkKKyNkZWZpbmUgQ0FUQ0hfQ0FQVFVSRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfQ0FQVFVS RSggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoY2FwdHVyZXIpLCAiQ0FUQ0hfQ0FQVFVSRSIs X19WQV9BUkdTX18gKQorCisjZGVmaW5lIENBVENIX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxf Q0FUQ0hfVEVTVENBU0UoIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFX01F VEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBj bGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FT RSggbWV0aG9kLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRo b2QsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEVTVF9DQVNFKCBGdW5j dGlvbiwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBf X1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX1NFQ1RJT04oIC4uLiApIElOVEVSTkFMX0NBVENI X1NFQ1RJT04oIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfRFlOQU1JQ19TRUNUSU9OKCAu Li4gKSBJTlRFUk5BTF9DQVRDSF9EWU5BTUlDX1NFQ1RJT04oIF9fVkFfQVJHU19fICkKKyNkZWZp bmUgQ0FUQ0hfRkFJTCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTCIsIENh dGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9u OjpOb3JtYWwsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfRkFJTF9DSEVDSyggLi4uICkg SU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6 OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFp bHVyZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9TVUNDRUVEKCAuLi4gKSBJTlRFUk5B TF9DQVRDSF9NU0coICJDQVRDSF9TVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNo OjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKwor I2RlZmluZSBDQVRDSF9BTk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCkK KworI2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElUSU9OQUxfTVNWQ19QUkVQUk9DRVNTT1IKKyNk ZWZpbmUgQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URU1Q TEFURV9URVNUX0NBU0UoIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfVEVT VF9DQVNFX1NJRyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJRygg X19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EKCBj bGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0Qo IGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9URU1QTEFURV9URVNUX0NB U0VfTUVUSE9EX1NJRyggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9U RVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENB VENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URU1Q TEFURV9QUk9EVUNUX1RFU1RfQ0FTRSggX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9URU1Q TEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9TSUcoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFTVBMQVRF X1BST0RVQ1RfVEVTVF9DQVNFX1NJRyggX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9URU1Q TEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxf Q0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFf QVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9E X1NJRyggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RF U1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVm aW5lIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5E X1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0UoIF9fVkFfQVJHU19fICkg KQorI2RlZmluZSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0VfU0lHKCAuLi4gKSBJTlRFUk5BTF9D QVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9TSUco IF9fVkFfQVJHU19fICkgKQorI2RlZmluZSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9E KCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxf Q0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyAp ICkKKyNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9TSUcoIGNsYXNzTmFt ZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1Q TEFURV9URVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApICkKKyNk ZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NB VENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NB U0UoIF9fVkFfQVJHU19fICkgKQorI2RlZmluZSBDQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1Rf Q0FTRV9TSUcoIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FU Q0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfU0lHKCBfX1ZBX0FSR1NfXyApICkKKyNkZWZp bmUgQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4u LiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVf UFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkgKQorI2Rl ZmluZSBDQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05h bWUsIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVN UExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1lLCBfX1ZBX0FSR1Nf XyApICkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1JVTlRJTUVfU1RBVElD X1JFUVVJUkUpCisjZGVmaW5lIENBVENIX1NUQVRJQ19SRVFVSVJFKCAuLi4gKSAgICAgICBzdGF0 aWNfYXNzZXJ0KCAgIF9fVkFfQVJHU19fICwgICAgICAjX19WQV9BUkdTX18gKTsgICAgIENBVENI X1NVQ0NFRUQoICNfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX1NUQVRJQ19SRVFVSVJFX0ZB TFNFKCAuLi4gKSBzdGF0aWNfYXNzZXJ0KCAhKF9fVkFfQVJHU19fKSwgIiEoIiAjX19WQV9BUkdT X18gIikiICk7IENBVENIX1NVQ0NFRUQoICNfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBD QVRDSF9TVEFUSUNfUkVRVUlSRSggLi4uICkgICAgICAgQ0FUQ0hfUkVRVUlSRSggX19WQV9BUkdT X18gKQorI2RlZmluZSBDQVRDSF9TVEFUSUNfUkVRVUlSRV9GQUxTRSggLi4uICkgQ0FUQ0hfUkVR VUlSRV9GQUxTRSggX19WQV9BUkdTX18gKQorI2VuZGlmCisKKy8vICJCREQtc3R5bGUiIGNvbnZl bmllbmNlIHdyYXBwZXJzCisjZGVmaW5lIENBVENIX1NDRU5BUklPKCAuLi4gKSBDQVRDSF9URVNU X0NBU0UoICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX1NDRU5BUklP X01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9E KCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX0dJ VkVOKCBkZXNjICkgICAgIElOVEVSTkFMX0NBVENIX0RZTkFNSUNfU0VDVElPTiggIiAgICBHaXZl bjogIiA8PCBkZXNjICkKKyNkZWZpbmUgQ0FUQ0hfQU5EX0dJVkVOKCBkZXNjICkgSU5URVJOQUxf Q0FUQ0hfRFlOQU1JQ19TRUNUSU9OKCAiQW5kIGdpdmVuOiAiIDw8IGRlc2MgKQorI2RlZmluZSBD QVRDSF9XSEVOKCBkZXNjICkgICAgICBJTlRFUk5BTF9DQVRDSF9EWU5BTUlDX1NFQ1RJT04oICIg ICAgIFdoZW46ICIgPDwgZGVzYyApCisjZGVmaW5lIENBVENIX0FORF9XSEVOKCBkZXNjICkgIElO VEVSTkFMX0NBVENIX0RZTkFNSUNfU0VDVElPTiggIiBBbmQgd2hlbjogIiA8PCBkZXNjICkKKyNk ZWZpbmUgQ0FUQ0hfVEhFTiggZGVzYyApICAgICAgSU5URVJOQUxfQ0FUQ0hfRFlOQU1JQ19TRUNU SU9OKCAiICAgICBUaGVuOiAiIDw8IGRlc2MgKQorI2RlZmluZSBDQVRDSF9BTkRfVEhFTiggZGVz YyApICBJTlRFUk5BTF9DQVRDSF9EWU5BTUlDX1NFQ1RJT04oICIgICAgICBBbmQ6ICIgPDwgZGVz YyApCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HKQorI2Rl ZmluZSBDQVRDSF9CRU5DSE1BUksoLi4uKSBcCisgICAgSU5URVJOQUxfQ0FUQ0hfQkVOQ0hNQVJL KElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKENfQV9UX0NfSF9CX0VfTl9DX0hfKSwgSU5URVJO QUxfQ0FUQ0hfR0VUXzFfQVJHKF9fVkFfQVJHU19fLCwpLCBJTlRFUk5BTF9DQVRDSF9HRVRfMl9B UkcoX19WQV9BUkdTX18sLCkpCisjZGVmaW5lIENBVENIX0JFTkNITUFSS19BRFZBTkNFRChuYW1l KSBcCisgICAgSU5URVJOQUxfQ0FUQ0hfQkVOQ0hNQVJLX0FEVkFOQ0VEKElOVEVSTkFMX0NBVENI X1VOSVFVRV9OQU1FKENfQV9UX0NfSF9CX0VfTl9DX0hfKSwgbmFtZSkKKyNlbmRpZiAvLyBDQVRD SF9DT05GSUdfRU5BQkxFX0JFTkNITUFSS0lORworCisvLyBJZiBDQVRDSF9DT05GSUdfUFJFRklY X0FMTCBpcyBub3QgZGVmaW5lZCB0aGVuIHRoZSBDQVRDSF8gcHJlZml4IGlzIG5vdCByZXF1aXJl ZAorI2Vsc2UKKworI2RlZmluZSBSRVFVSVJFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAi UkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBfX1ZBX0FSR1NfXyAg KQorI2RlZmluZSBSRVFVSVJFX0ZBTFNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiUkVR VUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJl c3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIF9fVkFfQVJHU19fICkKKworI2RlZmluZSBSRVFV SVJFX1RIUk9XUyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiUkVRVUlSRV9USFJPV1Mi LCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQorI2RlZmlu ZSBSRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENI X1RIUk9XU19BUyggIlJFUVVJUkVfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJl c3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX1RIUk9XU19X SVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX1NUUl9NQVRDSEVTKCAi UkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBt YXRjaGVyLCBleHByICkKKyNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVS UykKKyNkZWZpbmUgUkVRVUlSRV9USFJPV1NfTUFUQ0hFUyggZXhwciwgZXhjZXB0aW9uVHlwZSwg bWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XU19NQVRDSEVTKCAiUkVRVUlSRV9USFJPV1Nf TUFUQ0hFUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFs LCBtYXRjaGVyLCBleHByICkKKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVS UworI2RlZmluZSBSRVFVSVJFX05PVEhST1coIC4uLiApIElOVEVSTkFMX0NBVENIX05PX1RIUk9X KCAiUkVRVUlSRV9OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIF9f VkFfQVJHU19fICkKKworI2RlZmluZSBDSEVDSyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCgg IkNIRUNLIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19W QV9BUkdTX18gKQorI2RlZmluZSBDSEVDS19GQUxTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVT VCggIkNIRUNLX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFp bHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBfX1ZBX0FSR1NfXyAp CisjZGVmaW5lIENIRUNLRURfSUYoIC4uLiApIElOVEVSTkFMX0NBVENIX0lGKCAiQ0hFQ0tFRF9J RiIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJH U19fICkKKyNkZWZpbmUgQ0hFQ0tFRF9FTFNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9FTFNFKCAi Q0hFQ0tFRF9FTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVy ZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBDSEVDS19OT0ZBSUwoIC4uLiApIElOVEVSTkFMX0NB VENIX1RFU1QoICJDSEVDS19OT0ZBSUwiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRp bnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwsIF9f VkFfQVJHU19fICkKKworI2RlZmluZSBDSEVDS19USFJPV1MoIC4uLiApICBJTlRFUk5BTF9DQVRD SF9USFJPV1MoICJDSEVDS19USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRp bnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENIRUNLX1RIUk9XU19BUyggZXhw ciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNIRUNLX1RIUk9X U19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVP bkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS19USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hl ciApIElOVEVSTkFMX0NBVENIX1RIUk9XU19TVFJfTUFUQ0hFUyggIkNIRUNLX1RIUk9XU19XSVRI IiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbWF0Y2hlciwg ZXhwciApCisjaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMpCisjZGVm aW5lIENIRUNLX1RIUk9XU19NQVRDSEVTKCBleHByLCBleGNlcHRpb25UeXBlLCBtYXRjaGVyICkg SU5URVJOQUxfQ0FUQ0hfVEhST1dTX01BVENIRVMoICJDSEVDS19USFJPV1NfTUFUQ0hFUyIsIGV4 Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUs IG1hdGNoZXIsIGV4cHIgKQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19ESVNBQkxFX01BVENIRVJT CisjZGVmaW5lIENIRUNLX05PVEhST1coIC4uLiApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAi Q0hFQ0tfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1 cmUsIF9fVkFfQVJHU19fICkKKworI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFX01B VENIRVJTKQorI2RlZmluZSBDSEVDS19USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVD S19USEFUKCAiQ0hFQ0tfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6 Q29udGludWVPbkZhaWx1cmUsIGFyZyApCisKKyNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1h dGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0 Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZW5kaWYgLy8gQ0FUQ0hfQ09O RklHX0RJU0FCTEVfTUFUQ0hFUlMKKworI2RlZmluZSBJTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRD SF9JTkZPKCAiSU5GTyIsIG1zZyApCisjZGVmaW5lIFVOU0NPUEVEX0lORk8oIG1zZyApIElOVEVS TkFMX0NBVENIX1VOU0NPUEVEX0lORk8oICJVTlNDT1BFRF9JTkZPIiwgbXNnICkKKyNkZWZpbmUg V0FSTiggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiV0FSTiIsIENhdGNoOjpSZXN1bHRXYXM6 Oldhcm5pbmcsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1z ZyApCisjZGVmaW5lIENBUFRVUkUoIC4uLiApIElOVEVSTkFMX0NBVENIX0NBUFRVUkUoIElOVEVS TkFMX0NBVENIX1VOSVFVRV9OQU1FKGNhcHR1cmVyKSwgIkNBUFRVUkUiLF9fVkFfQVJHU19fICkK KworI2RlZmluZSBURVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBfX1ZB X0FSR1NfXyApCisjZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5U RVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisj ZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgLi4uICkgSU5URVJOQUxfQ0FUQ0hf TUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFJFR0lT VEVSX1RFU1RfQ0FTRSggRnVuY3Rpb24sIC4uLiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RF U1RDQVNFKCBGdW5jdGlvbiwgX19WQV9BUkdTX18gKQorI2RlZmluZSBTRUNUSU9OKCAuLi4gKSBJ TlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIERZTkFNSUNfU0VD VElPTiggLi4uICkgSU5URVJOQUxfQ0FUQ0hfRFlOQU1JQ19TRUNUSU9OKCBfX1ZBX0FSR1NfXyAp CisjZGVmaW5lIEZBSUwoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUwiLCBDYXRjaDo6 UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9y bWFsLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEZBSUxfQ0hFQ0soIC4uLiApIElOVEVSTkFMX0NB VENIX01TRyggIkZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUs IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19f ICkKKyNkZWZpbmUgU1VDQ0VFRCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiU1VDQ0VFRCIs IENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVl T25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEFOT05fVEVTVF9DQVNFKCkgSU5URVJO QUxfQ0FUQ0hfVEVTVENBU0UoKQorCisjaWZuZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9N U1ZDX1BSRVBST0NFU1NPUgorI2RlZmluZSBURU1QTEFURV9URVNUX0NBU0UoIC4uLiApIElOVEVS TkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRSggX19WQV9BUkdTX18gKQorI2RlZmluZSBURU1Q TEFURV9URVNUX0NBU0VfU0lHKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NB U0VfU0lHKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0Qo IGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhP RCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FTRV9N RVRIT0RfU0lHKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1Rf Q0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgVEVNUExB VEVfUFJPRFVDVF9URVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1BST0RV Q1RfVEVTVF9DQVNFKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFRFTVBMQVRFX1BST0RVQ1RfVEVT VF9DQVNFX1NJRyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NB U0VfU0lHKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFRFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNF X01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNU X1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBURU1Q TEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIC4uLiApIElOVEVS TkFMX0NBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX01FVEhPRF9TSUcoIGNsYXNzTmFt ZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBURU1QTEFURV9MSVNUX1RFU1RfQ0FTRSggLi4uICkg SU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfTElTVF9URVNUX0NBU0UoX19WQV9BUkdTX18pCisjZGVm aW5lIFRFTVBMQVRFX0xJU1RfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRF Uk5BTF9DQVRDSF9URU1QTEFURV9MSVNUX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19W QV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgVEVNUExBVEVfVEVTVF9DQVNFKCAuLi4gKSBJTlRF Uk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FT RSggX19WQV9BUkdTX18gKSApCisjZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FTRV9TSUcoIC4uLiAp IElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVT VF9DQVNFX1NJRyggX19WQV9BUkdTX18gKSApCisjZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FTRV9N RVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRF Uk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJH U19fICkgKQorI2RlZmluZSBURU1QTEFURV9URVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1l LCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBM QVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkgKQorI2Rl ZmluZSBURU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQ QU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRSggX19W QV9BUkdTX18gKSApCisjZGVmaW5lIFRFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX1NJRyggLi4u ICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9Q Uk9EVUNUX1RFU1RfQ0FTRV9TSUcoIF9fVkFfQVJHU19fICkgKQorI2RlZmluZSBURU1QTEFURV9Q Uk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hf RVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9N RVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKSApCisjZGVmaW5lIFRFTVBMQVRFX1BST0RV Q1RfVEVTVF9DQVNFX01FVEhPRF9TSUcoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hf RVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9N RVRIT0RfU0lHKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkgKQorI2RlZmluZSBURU1QTEFURV9M SVNUX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5B TF9DQVRDSF9URU1QTEFURV9MSVNUX1RFU1RfQ0FTRSggX19WQV9BUkdTX18gKSApCisjZGVmaW5l IFRFTVBMQVRFX0xJU1RfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5B TF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX0xJU1RfVEVTVF9D QVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApICkKKyNlbmRpZgorCisjaWYgIWRl ZmluZWQoQ0FUQ0hfQ09ORklHX1JVTlRJTUVfU1RBVElDX1JFUVVJUkUpCisjZGVmaW5lIFNUQVRJ Q19SRVFVSVJFKCAuLi4gKSAgICAgICBzdGF0aWNfYXNzZXJ0KCAgIF9fVkFfQVJHU19fLCAgI19f VkFfQVJHU19fICk7IFNVQ0NFRUQoICNfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFNUQVRJQ19SRVFV SVJFX0ZBTFNFKCAuLi4gKSBzdGF0aWNfYXNzZXJ0KCAhKF9fVkFfQVJHU19fKSwgIiEoIiAjX19W QV9BUkdTX18gIikiICk7IFNVQ0NFRUQoICIhKCIgI19fVkFfQVJHU19fICIpIiApCisjZWxzZQor I2RlZmluZSBTVEFUSUNfUkVRVUlSRSggLi4uICkgICAgICAgUkVRVUlSRSggX19WQV9BUkdTX18g KQorI2RlZmluZSBTVEFUSUNfUkVRVUlSRV9GQUxTRSggLi4uICkgUkVRVUlSRV9GQUxTRSggX19W QV9BUkdTX18gKQorI2VuZGlmCisKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX1RSQU5TTEFURV9F WENFUFRJT04oIHNpZ25hdHVyZSApIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04o IHNpZ25hdHVyZSApCisKKy8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCisjZGVm aW5lIFNDRU5BUklPKCAuLi4gKSBURVNUX0NBU0UoICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyAp CisjZGVmaW5lIFNDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRD SF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyAp CisKKyNkZWZpbmUgR0lWRU4oIGRlc2MgKSAgICAgSU5URVJOQUxfQ0FUQ0hfRFlOQU1JQ19TRUNU SU9OKCAiICAgIEdpdmVuOiAiIDw8IGRlc2MgKQorI2RlZmluZSBBTkRfR0lWRU4oIGRlc2MgKSBJ TlRFUk5BTF9DQVRDSF9EWU5BTUlDX1NFQ1RJT04oICJBbmQgZ2l2ZW46ICIgPDwgZGVzYyApCisj ZGVmaW5lIFdIRU4oIGRlc2MgKSAgICAgIElOVEVSTkFMX0NBVENIX0RZTkFNSUNfU0VDVElPTigg IiAgICAgV2hlbjogIiA8PCBkZXNjICkKKyNkZWZpbmUgQU5EX1dIRU4oIGRlc2MgKSAgSU5URVJO QUxfQ0FUQ0hfRFlOQU1JQ19TRUNUSU9OKCAiIEFuZCB3aGVuOiAiIDw8IGRlc2MgKQorI2RlZmlu ZSBUSEVOKCBkZXNjICkgICAgICBJTlRFUk5BTF9DQVRDSF9EWU5BTUlDX1NFQ1RJT04oICIgICAg IFRoZW46ICIgPDwgZGVzYyApCisjZGVmaW5lIEFORF9USEVOKCBkZXNjICkgIElOVEVSTkFMX0NB VENIX0RZTkFNSUNfU0VDVElPTiggIiAgICAgIEFuZDogIiA8PCBkZXNjICkKKworI2lmIGRlZmlu ZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcpCisjZGVmaW5lIEJFTkNITUFSSygu Li4pIFwKKyAgICBJTlRFUk5BTF9DQVRDSF9CRU5DSE1BUksoSU5URVJOQUxfQ0FUQ0hfVU5JUVVF X05BTUUoQ19BX1RfQ19IX0JfRV9OX0NfSF8pLCBJTlRFUk5BTF9DQVRDSF9HRVRfMV9BUkcoX19W QV9BUkdTX18sLCksIElOVEVSTkFMX0NBVENIX0dFVF8yX0FSRyhfX1ZBX0FSR1NfXywsKSkKKyNk ZWZpbmUgQkVOQ0hNQVJLX0FEVkFOQ0VEKG5hbWUpIFwKKyAgICBJTlRFUk5BTF9DQVRDSF9CRU5D SE1BUktfQURWQU5DRUQoSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoQ19BX1RfQ19IX0JfRV9O X0NfSF8pLCBuYW1lKQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5H CisKK3VzaW5nIENhdGNoOjpEZXRhaWw6OkFwcHJveDsKKworI2Vsc2UgLy8gQ0FUQ0hfQ09ORklH X0RJU0FCTEUKKworLy8vLy8vCisvLyBJZiB0aGlzIGNvbmZpZyBpZGVudGlmaWVyIGlzIGRlZmlu ZWQgdGhlbiBhbGwgQ0FUQ0ggbWFjcm9zIGFyZSBwcmVmaXhlZCB3aXRoIENBVENIXworI2lmZGVm IENBVENIX0NPTkZJR19QUkVGSVhfQUxMCisKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggLi4uICkg ICAgICAgICh2b2lkKSgwKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX0ZBTFNFKCAuLi4gKSAgKHZv aWQpKDApCisKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1MoIC4uLiApICh2b2lkKSgwKQor I2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApICh2 b2lkKSgwKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVy ICkgICAgICh2b2lkKSgwKQorI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFX01BVENI RVJTKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19NQVRDSEVTKCBleHByLCBleGNlcHRp b25UeXBlLCBtYXRjaGVyICkgKHZvaWQpKDApCisjZW5kaWYvLyBDQVRDSF9DT05GSUdfRElTQUJM RV9NQVRDSEVSUworI2RlZmluZSBDQVRDSF9SRVFVSVJFX05PVEhST1coIC4uLiApICh2b2lkKSgw KQorCisjZGVmaW5lIENBVENIX0NIRUNLKCAuLi4gKSAgICAgICAgICh2b2lkKSgwKQorI2RlZmlu ZSBDQVRDSF9DSEVDS19GQUxTRSggLi4uICkgICAodm9pZCkoMCkKKyNkZWZpbmUgQ0FUQ0hfQ0hF Q0tFRF9JRiggLi4uICkgICAgaWYgKF9fVkFfQVJHU19fKQorI2RlZmluZSBDQVRDSF9DSEVDS0VE X0VMU0UoIC4uLiApICBpZiAoIShfX1ZBX0FSR1NfXykpCisjZGVmaW5lIENBVENIX0NIRUNLX05P RkFJTCggLi4uICkgICh2b2lkKSgwKQorCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XUyggLi4u ICkgICh2b2lkKSgwKQorI2RlZmluZSBDQVRDSF9DSEVDS19USFJPV1NfQVMoIGV4cHIsIGV4Y2Vw dGlvblR5cGUgKSAodm9pZCkoMCkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTX1dJVEgoIGV4 cHIsIG1hdGNoZXIgKSAgICAgKHZvaWQpKDApCisjaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJ U0FCTEVfTUFUQ0hFUlMpCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XU19NQVRDSEVTKCBleHBy LCBleGNlcHRpb25UeXBlLCBtYXRjaGVyICkgKHZvaWQpKDApCisjZW5kaWYgLy8gQ0FUQ0hfQ09O RklHX0RJU0FCTEVfTUFUQ0hFUlMKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfTk9USFJPVyggLi4uICkg KHZvaWQpKDApCisKKyNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUykK KyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhBVCggYXJnLCBtYXRjaGVyICkgICAodm9pZCkoMCkKKwor I2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApICh2b2lkKSgwKQorI2Vu ZGlmIC8vIENBVENIX0NPTkZJR19ESVNBQkxFX01BVENIRVJTCisKKyNkZWZpbmUgQ0FUQ0hfSU5G TyggbXNnICkgICAgICAgICAgKHZvaWQpKDApCisjZGVmaW5lIENBVENIX1VOU0NPUEVEX0lORk8o IG1zZyApICh2b2lkKSgwKQorI2RlZmluZSBDQVRDSF9XQVJOKCBtc2cgKSAgICAgICAgICAodm9p ZCkoMCkKKyNkZWZpbmUgQ0FUQ0hfQ0FQVFVSRSggbXNnICkgICAgICAgKHZvaWQpKDApCisKKyNk ZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRV9OT19S RUdJU1RSQVRJT04oSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfU19U XyApKQorI2RlZmluZSBDQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElO VEVSTkFMX0NBVENIX1RFU1RDQVNFX05PX1JFR0lTVFJBVElPTihJTlRFUk5BTF9DQVRDSF9VTklR VUVfTkFNRSggQ19BX1RfQ19IX1RfRV9TX1RfICkpCisjZGVmaW5lIENBVENIX01FVEhPRF9BU19U RVNUX0NBU0UoIG1ldGhvZCwgLi4uICkKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEVTVF9DQVNF KCBGdW5jdGlvbiwgLi4uICkgKHZvaWQpKDApCisjZGVmaW5lIENBVENIX1NFQ1RJT04oIC4uLiAp CisjZGVmaW5lIENBVENIX0RZTkFNSUNfU0VDVElPTiggLi4uICkKKyNkZWZpbmUgQ0FUQ0hfRkFJ TCggLi4uICkgKHZvaWQpKDApCisjZGVmaW5lIENBVENIX0ZBSUxfQ0hFQ0soIC4uLiApICh2b2lk KSgwKQorI2RlZmluZSBDQVRDSF9TVUNDRUVEKCAuLi4gKSAodm9pZCkoMCkKKworI2RlZmluZSBD QVRDSF9BTk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFX05PX1JFR0lTVFJB VElPTihJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9TX1RfICkpCisK KyNpZm5kZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElPTkFMX01TVkNfUFJFUFJPQ0VTU09SCisjZGVm aW5lIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExB VEVfVEVTVF9DQVNFX05PX1JFR0lTVFJBVElPTihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ0FUQ0hf VEVNUExBVEVfVEVTVF9DQVNFX1NJRyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVT VF9DQVNFX1NJR19OT19SRUdJU1RSQVRJT04oX19WQV9BUkdTX18pCisjZGVmaW5lIENBVENIX1RF TVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hf VEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9OT19SRUdJU1RSQVRJT04oY2xhc3NOYW1lLCBfX1ZB X0FSR1NfXykKKyNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9TSUcoIGNs YXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9T SUdfTk9fUkVHSVNUUkFUSU9OKGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRD SF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRSggLi4uICkgQ0FUQ0hfVEVNUExBVEVfVEVTVF9D QVNFKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9D QVNFX1NJRyggLi4uICkgQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFKCBfX1ZBX0FSR1NfXyApCisj ZGVmaW5lIENBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1l LCAuLi4gKSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFf QVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9E X1NJRyggY2xhc3NOYW1lLCAuLi4gKSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EKCBj bGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIENBVENIX1RFTVBMQVRFX1RF U1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRD SF9URU1QTEFURV9URVNUX0NBU0VfTk9fUkVHSVNUUkFUSU9OKF9fVkFfQVJHU19fKSApCisjZGVm aW5lIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9TSUcoIC4uLiApIElOVEVSTkFMX0NBVENIX0VY UEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJR19OT19SRUdJ U1RSQVRJT04oX19WQV9BUkdTX18pICkKKyNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNF X01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElO VEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfTk9fUkVHSVNUUkFUSU9OKGNs YXNzTmFtZSwgX19WQV9BUkdTX18gKSApCisjZGVmaW5lIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FT RV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJH UyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9TSUdfTk9fUkVHSVNU UkFUSU9OKGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKSApCisjZGVmaW5lIENBVENIX1RFTVBMQVRF X1BST0RVQ1RfVEVTVF9DQVNFKCAuLi4gKSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0UoIF9fVkFf QVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfU0lHKCAu Li4gKSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0UoIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FU Q0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIENB VENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQor I2RlZmluZSBDQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFz c05hbWUsIC4uLiApIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwg X19WQV9BUkdTX18gKQorI2VuZGlmCisKKy8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBw ZXJzCisjZGVmaW5lIENBVENIX1NDRU5BUklPKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FT RV9OT19SRUdJU1RSQVRJT04oSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9U X0VfU19UXyApKQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgLi4u ICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0VfTUVUSE9EX05PX1JFR0lTVFJBVElPTihJTlRFUk5B TF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9TX1RfICksIGNsYXNzTmFtZSApCisj ZGVmaW5lIENBVENIX0dJVkVOKCBkZXNjICkKKyNkZWZpbmUgQ0FUQ0hfQU5EX0dJVkVOKCBkZXNj ICkKKyNkZWZpbmUgQ0FUQ0hfV0hFTiggZGVzYyApCisjZGVmaW5lIENBVENIX0FORF9XSEVOKCBk ZXNjICkKKyNkZWZpbmUgQ0FUQ0hfVEhFTiggZGVzYyApCisjZGVmaW5lIENBVENIX0FORF9USEVO KCBkZXNjICkKKworI2RlZmluZSBDQVRDSF9TVEFUSUNfUkVRVUlSRSggLi4uICkgICAgICAgKHZv aWQpKDApCisjZGVmaW5lIENBVENIX1NUQVRJQ19SRVFVSVJFX0ZBTFNFKCAuLi4gKSAodm9pZCko MCkKKworLy8gSWYgQ0FUQ0hfQ09ORklHX1BSRUZJWF9BTEwgaXMgbm90IGRlZmluZWQgdGhlbiB0 aGUgQ0FUQ0hfIHByZWZpeCBpcyBub3QgcmVxdWlyZWQKKyNlbHNlCisKKyNkZWZpbmUgUkVRVUlS RSggLi4uICkgICAgICAgKHZvaWQpKDApCisjZGVmaW5lIFJFUVVJUkVfRkFMU0UoIC4uLiApICh2 b2lkKSgwKQorCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTKCAuLi4gKSAodm9pZCkoMCkKKyNkZWZp bmUgUkVRVUlSRV9USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSAodm9pZCkoMCkKKyNk ZWZpbmUgUkVRVUlSRV9USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApICh2b2lkKSgwKQorI2lm ICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFX01BVENIRVJTKQorI2RlZmluZSBSRVFVSVJF X1RIUk9XU19NQVRDSEVTKCBleHByLCBleGNlcHRpb25UeXBlLCBtYXRjaGVyICkgKHZvaWQpKDAp CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMKKyNkZWZpbmUgUkVRVUlS RV9OT1RIUk9XKCAuLi4gKSAodm9pZCkoMCkKKworI2RlZmluZSBDSEVDSyggLi4uICkgKHZvaWQp KDApCisjZGVmaW5lIENIRUNLX0ZBTFNFKCAuLi4gKSAodm9pZCkoMCkKKyNkZWZpbmUgQ0hFQ0tF RF9JRiggLi4uICkgaWYgKF9fVkFfQVJHU19fKQorI2RlZmluZSBDSEVDS0VEX0VMU0UoIC4uLiAp IGlmICghKF9fVkFfQVJHU19fKSkKKyNkZWZpbmUgQ0hFQ0tfTk9GQUlMKCAuLi4gKSAodm9pZCko MCkKKworI2RlZmluZSBDSEVDS19USFJPV1MoIC4uLiApICAodm9pZCkoMCkKKyNkZWZpbmUgQ0hF Q0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgKHZvaWQpKDApCisjZGVmaW5lIENI RUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgKHZvaWQpKDApCisjaWYgIWRlZmluZWQo Q0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMpCisjZGVmaW5lIENIRUNLX1RIUk9XU19NQVRD SEVTKCBleHByLCBleGNlcHRpb25UeXBlLCBtYXRjaGVyICkgKHZvaWQpKDApCisjZW5kaWYgLy8g Q0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMKKyNkZWZpbmUgQ0hFQ0tfTk9USFJPVyggLi4u ICkgKHZvaWQpKDApCisKKyNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVS UykKKyNkZWZpbmUgQ0hFQ0tfVEhBVCggYXJnLCBtYXRjaGVyICkgKHZvaWQpKDApCisKKyNkZWZp bmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSAodm9pZCkoMCkKKyNlbmRpZiAvLyBDQVRD SF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUworCisjZGVmaW5lIElORk8oIG1zZyApICh2b2lkKSgw KQorI2RlZmluZSBVTlNDT1BFRF9JTkZPKCBtc2cgKSAodm9pZCkoMCkKKyNkZWZpbmUgV0FSTigg bXNnICkgKHZvaWQpKDApCisjZGVmaW5lIENBUFRVUkUoIG1zZyApICh2b2lkKSgwKQorCisjZGVm aW5lIFRFU1RfQ0FTRSggLi4uICkgIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFX05PX1JFR0lTVFJB VElPTihJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9TX1RfICkpCisj ZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hf VEVTVENBU0VfTk9fUkVHSVNUUkFUSU9OKElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0Ff VF9DX0hfVF9FX1NfVF8gKSkKKyNkZWZpbmUgTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCAu Li4gKQorI2RlZmluZSBSRUdJU1RFUl9URVNUX0NBU0UoIEZ1bmN0aW9uLCAuLi4gKSAodm9pZCko MCkKKyNkZWZpbmUgU0VDVElPTiggLi4uICkKKyNkZWZpbmUgRFlOQU1JQ19TRUNUSU9OKCAuLi4g KQorI2RlZmluZSBGQUlMKCAuLi4gKSAodm9pZCkoMCkKKyNkZWZpbmUgRkFJTF9DSEVDSyggLi4u ICkgKHZvaWQpKDApCisjZGVmaW5lIFNVQ0NFRUQoIC4uLiApICh2b2lkKSgwKQorI2RlZmluZSBB Tk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFX05PX1JFR0lTVFJBVElPTihJ TlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9TX1RfICkpCisKKyNpZm5k ZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElPTkFMX01TVkNfUFJFUFJPQ0VTU09SCisjZGVmaW5lIFRF TVBMQVRFX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNF X05PX1JFR0lTVFJBVElPTihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVEVNUExBVEVfVEVTVF9DQVNF X1NJRyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJR19OT19SRUdJ U1RSQVRJT04oX19WQV9BUkdTX18pCisjZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0Qo IGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhP RF9OT19SRUdJU1RSQVRJT04oY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVEVNUExB VEVfVEVTVF9DQVNFX01FVEhPRF9TSUcoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hf VEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9TSUdfTk9fUkVHSVNUUkFUSU9OKGNsYXNzTmFtZSwg X19WQV9BUkdTX18gKQorI2RlZmluZSBURU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRSggLi4uICkg VEVNUExBVEVfVEVTVF9DQVNFKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFRFTVBMQVRFX1BST0RV Q1RfVEVTVF9DQVNFX1NJRyggLi4uICkgVEVNUExBVEVfVEVTVF9DQVNFKCBfX1ZBX0FSR1NfXyAp CisjZGVmaW5lIFRFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAu Li4gKSBURU1QTEFURV9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkK KyNkZWZpbmUgVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1l LCAuLi4gKSBURU1QTEFURV9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19f ICkKKyNlbHNlCisjZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FU Q0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTk9fUkVH SVNUUkFUSU9OKF9fVkFfQVJHU19fKSApCisjZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FTRV9TSUco IC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExB VEVfVEVTVF9DQVNFX1NJR19OT19SRUdJU1RSQVRJT04oX19WQV9BUkdTX18pICkKKyNkZWZpbmUg VEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRD SF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0Rf Tk9fUkVHSVNUUkFUSU9OKGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKSApCisjZGVmaW5lIFRFTVBM QVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENI X0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9T SUdfTk9fUkVHSVNUUkFUSU9OKGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKSApCisjZGVmaW5lIFRF TVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFKCAuLi4gKSBURU1QTEFURV9URVNUX0NBU0UoIF9fVkFf QVJHU19fICkKKyNkZWZpbmUgVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfU0lHKCAuLi4gKSBU RU1QTEFURV9URVNUX0NBU0UoIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgVEVNUExBVEVfUFJPRFVD VF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIFRFTVBMQVRFX1RFU1RfQ0FTRV9N RVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBURU1QTEFURV9QUk9EVUNU X1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIC4uLiApIFRFTVBMQVRFX1RFU1RfQ0FT RV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorI2VuZGlmCisKKyNkZWZpbmUgU1RB VElDX1JFUVVJUkUoIC4uLiApICAgICAgICh2b2lkKSgwKQorI2RlZmluZSBTVEFUSUNfUkVRVUlS RV9GQUxTRSggLi4uICkgKHZvaWQpKDApCisKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX1RSQU5T TEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENF UFRJT05fTk9fUkVHKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxf RXhjZXB0aW9uVHJhbnNsYXRvciApLCBzaWduYXR1cmUgKQorCisvLyAiQkRELXN0eWxlIiBjb252 ZW5pZW5jZSB3cmFwcGVycworI2RlZmluZSBTQ0VOQVJJTyggLi4uICkgSU5URVJOQUxfQ0FUQ0hf VEVTVENBU0VfTk9fUkVHSVNUUkFUSU9OKElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0Ff VF9DX0hfVF9FX1NfVF8gKSApCisjZGVmaW5lIFNDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCAu Li4gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRV9NRVRIT0RfTk9fUkVHSVNUUkFUSU9OKElOVEVS TkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX1NfVF8gKSwgY2xhc3NOYW1lICkK KworI2RlZmluZSBHSVZFTiggZGVzYyApCisjZGVmaW5lIEFORF9HSVZFTiggZGVzYyApCisjZGVm aW5lIFdIRU4oIGRlc2MgKQorI2RlZmluZSBBTkRfV0hFTiggZGVzYyApCisjZGVmaW5lIFRIRU4o IGRlc2MgKQorI2RlZmluZSBBTkRfVEhFTiggZGVzYyApCisKK3VzaW5nIENhdGNoOjpEZXRhaWw6 OkFwcHJveDsKKworI2VuZGlmCisKKyNlbmRpZiAvLyAhIENBVENIX0NPTkZJR19JTVBMX09OTFkK KworLy8gc3RhcnQgY2F0Y2hfcmVlbmFibGVfd2FybmluZ3MuaAorCisKKyNpZmRlZiBfX2NsYW5n X18KKyMgICAgaWZkZWYgX19JQ0MgLy8gaWNwYyBkZWZpbmVzIHRoZSBfX2NsYW5nX18gbWFjcm8K KyMgICAgICAgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgICAgZWxzZQorIyAgICAgICAgcHJhZ21h IGNsYW5nIGRpYWdub3N0aWMgcG9wCisjICAgIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fR05VQ19f CisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisvLyBlbmQgY2F0Y2hf cmVlbmFibGVfd2FybmluZ3MuaAorLy8gZW5kIGNhdGNoLmhwcAorI2VuZGlmIC8vIFRXT0JMVUVD VUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKwoKZGlmZiAtLWdpdCBhL2Nv bmZpZy1sYXlvdXQtcmVkaGF0LnBhdGNoIGIvY29uZmlnLWxheW91dC1yZWRoYXQucGF0Y2gKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1OTlkNwotLS0gL2Rldi9udWxsCisr KyBiL2NvbmZpZy1sYXlvdXQtcmVkaGF0LnBhdGNoCkBAIC0wLDAgKzEsMzAgQEAKKy0tLSBjb25m aWcubGF5b3V0CisrKysgY29uZmlnLmxheW91dAorQEAgLTIxOSw2ICsyMTksMjcgQEAKKyAgICAg Y2FjaGVkaXI6ICAgICAgL3Zhci9jYWNoZSsKKyA8L0xheW91dD4KKyAKKysjICAgRmVkb3JhL0Nl bnRPUy9SSEVMIFRyYWZmaWNTZXJ2ZXIgcGF0aCBsYXlvdXQuCisrPExheW91dCBSZWRIYXQ+Cisr ICAgIHByZWZpeDogICAgICAgIC91c3IKKysgICAgZXhlY19wcmVmaXg6ICAgJHtwcmVmaXh9Cisr ICAgIGJpbmRpcjogICAgICAgICR7ZXhlY19wcmVmaXh9L2JpbgorKyAgICBzYmluZGlyOiAgICAg ICAke2V4ZWNfcHJlZml4fS9zYmluCisrICAgIGxpYmRpcjogICAgICAgICR7ZXhlY19wcmVmaXh9 L2xpYjY0KworKyAgICBsaWJleGVjZGlyOiAgICAke2xpYmRpcn0vcGx1Z2lucworKyAgICBpbmZv ZGlyOiAgICAgICAke3ByZWZpeH0vc2hhcmUvaW5mbworKyAgICBtYW5kaXI6ICAgICAgICAke3By ZWZpeH0vc2hhcmUvbWFuCisrICAgIHN5c2NvbmZkaXI6ICAgIC9ldGMrCisrICAgIGRhdGFkaXI6 ICAgICAgICR7cHJlZml4fS9zaGFyZSsKKysgICAgZG9jZGlyOiAgICAgICAgJHtwcmVmaXh9L3No YXJlL2RvYysKKysgICAgaW5zdGFsbGJ1aWxkZGlyOiAke2RhdGFkaXJ9L2J1aWxkCisrICAgIGlu Y2x1ZGVkaXI6ICAgICR7cHJlZml4fS9pbmNsdWRlKworKyAgICBsb2NhbHN0YXRlZGlyOiAvdmFy KworKyAgICBydW50aW1lZGlyOiAgICAvcnVuKworKyAgICBsb2dkaXI6ICAgICAgICAvdmFyL2xv ZysKKysgICAgY2FjaGVkaXI6ICAgICAgL3Zhci9jYWNoZSsKKys8L0xheW91dD4KKysKKyAjICAg T3BlbkJTRCBwYXRoIGxheW91dC4KKyA8TGF5b3V0IE9wZW5CU0Q+CisgICAgIHByZWZpeDogICAg ICAgIC91c3IvbG9jYWwKCmRpZmYgLS1naXQgYS9nY2MxMi1jc3RyaW5nLnBhdGNoIGIvZ2NjMTIt Y3N0cmluZy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzNkZDNm Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjMTItY3N0cmluZy5wYXRjaApAQCAtMCwwICsxLDIwIEBA CistLS0gcGx1Z2lucy9leHBlcmltZW50YWwvaWNhcC9pY2FwX3BsdWdpbi5jYy5vcmlnCTIwMjIt MDQtMTEgMDI6MTM6MDkuNjI0ODk2NTgxICswMDAwCisrKysgcGx1Z2lucy9leHBlcmltZW50YWwv aWNhcC9pY2FwX3BsdWdpbi5jYwkyMDIyLTA0LTExIDAyOjE0OjE2LjMyNjI3Mzg2NyArMDAwMAor QEAgLTI2LDYgKzI2LDcgQEAKKyAqLworIAorICNpbmNsdWRlIDxzdHJpbmc+CisrI2luY2x1ZGUg PGNzdHJpbmc+CisgI2luY2x1ZGUgPHJlZ2V4PgorIAorICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ CistLS0gcGx1Z2lucy9leHBlcmltZW50YWwvcmVkb19jYWNoZV9sb29rdXAvcmVkb19jYWNoZV9s b29rdXAuY2Mub3JpZwkyMDIyLTA0LTExIDAyOjE3OjAwLjUyODQzMjE0MyArMDAwMAorKysrIHBs dWdpbnMvZXhwZXJpbWVudGFsL3JlZG9fY2FjaGVfbG9va3VwL3JlZG9fY2FjaGVfbG9va3VwLmNj CTIwMjItMDQtMTEgMDI6MTc6MTguNjYyOTAzNDY0ICswMDAwCitAQCAtMjMsNiArMjMsNyBAQAor IAorICNpbmNsdWRlIDxpb3N0cmVhbT4KKyAjaW5jbHVkZSA8cmVnZXg+CisrI2luY2x1ZGUgPGNz dHJpbmc+CisgI2luY2x1ZGUgPHNldD4KKyAjaW5jbHVkZSA8c3N0cmVhbT4KKyAjaW5jbHVkZSA8 Z2V0b3B0Lmg+CgpkaWZmIC0tZ2l0IGEvc291cmNlcyBiL3NvdXJjZXMKaW5kZXggNjQyNTczYy4u Mzc1MzM2ZiAxMDA2NDQKLS0tIGEvc291cmNlcworKysgYi9zb3VyY2VzCkBAIC0xLDIgKzEgQEAK LWZlMjRjZjJkNDRlY2NjODRjNzUzMzc2ZjBlOGMzYmU2ICB0cmFmZmljc2VydmVyLTUuMy4wLnRh ci5iejIKLTdmODE0M2ZmY2JiNjljNDhmZmNkZWU5MTZmZjhkYjM1ICB0cmFmZmljc2VydmVyLTUu My4wLnRhci5iejIuYXNjCitTSEE1MTIgKHRyYWZmaWNzZXJ2ZXItOS4xLjIudGFyLmJ6MikgPSAw NWVjMTEwY2QyNWY5Mzg2MWExNjA5NjA4ZGQ4MjAzMGVkOWIyMWNjNTYxZmIxYTY2Yzc2YzA2MzE3 YmMxNjIzNWQ3OTM4OWE3ZmZjNzYyMTg1MjdkN2I1MjQ1ODU0NzM4OTdiZWU2ZTAxNTI5ZjFjOGY0 ZjFiODQ0Y2RlNDM1OQoKZGlmZiAtLWdpdCBhL3N0cmluZy1pbmRleC1vb2IucGF0Y2ggYi9zdHJp bmctaW5kZXgtb29iLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1 OWZkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zdHJpbmctaW5kZXgtb29iLnBhdGNoCkBAIC0wLDAg KzEsNTIgQEAKKy0tLSBwcm94eS9oZHJzL01JTUUuY2MKKysrKyBwcm94eS9oZHJzL01JTUUuY2MK K0BAIC0yMjgyLDIwICsyMjgyLDE1IEBAIE1JTUVIZHI6OmdldF9ob3N0X3BvcnRfdmFsdWVzKGNv bnN0IGNoYXIgKipob3N0X3B0ciwgLy8vPCBQb2ludGVyIHRvIGhvc3QuCisgICAgIGlmIChiKSB7 CisgICAgICAgaWYgKCdbJyA9PSAqYikgeworICAgICAgICAgYXV0byBpZHggPSBiLmZpbmQoJ10n KTsKKy0gICAgICAgIGlmIChpZHggPD0gYi5zaXplKCkgJiYgYltpZHggKyAxXSA9PSAnOicpIHsK KysgICAgICAgIGlmIChpZHggPCBiLnNpemUoKSAtIDEgJiYgYltpZHggKyAxXSA9PSAnOicpIHsK KyAgICAgICAgICAgaG9zdCA9IGIudGFrZV9wcmVmaXhfYXQoaWR4ICsgMSk7CisgICAgICAgICAg IHBvcnQgPSBiOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgaG9zdCA9IGI7CisgICAg ICAgICB9CisgICAgICAgfSBlbHNlIHsKKy0gICAgICAgIGF1dG8geCA9IGIuc3BsaXRfcHJlZml4 X2F0KCc6Jyk7CistICAgICAgICBpZiAoeCkgeworLSAgICAgICAgICBob3N0ID0geDsKKy0gICAg ICAgICAgcG9ydCA9IGI7CistICAgICAgICB9IGVsc2UgeworLSAgICAgICAgICBob3N0ID0gYjsK Ky0gICAgICAgIH0KKysgICAgICAgIGhvc3QgPSBiLnRha2VfcHJlZml4X2F0KCc6Jyk7CisrICAg ICAgICBwb3J0ID0gYjsKKyAgICAgICB9CisgCisgICAgICAgaWYgKGhvc3QpIHsKKy0tLSBzcmMv dHNjcHAvdXRpbC91bml0X3Rlc3RzL3Rlc3RfVGV4dFZpZXcuY2MKKysrKyBzcmMvdHNjcHAvdXRp bC91bml0X3Rlc3RzL3Rlc3RfVGV4dFZpZXcuY2MKK0BAIC0yNzUsMjAgKzI3NSwxNSBAQCBURVNU X0NBU0UoIlRleHRWaWV3IEFmZml4ZXMiLCAiW2xpYnRzXVtUZXh0Vmlld10iKQorICAgYXV0byBm X2hvc3QgPSBbXShUZXh0VmlldyBiLCBUZXh0VmlldyAmaG9zdCwgVGV4dFZpZXcgJnBvcnQpIC0+ IHZvaWQgeworICAgICBpZiAoJ1snID09ICpiKSB7CisgICAgICAgYXV0byBpZHggPSBiLmZpbmQo J10nKTsKKy0gICAgICBpZiAoaWR4IDw9IGIuc2l6ZSgpICYmIGJbaWR4ICsgMV0gPT0gJzonKSB7 CisrICAgICAgaWYgKGlkeCA8IGIuc2l6ZSgpIC0gMSAmJiBiW2lkeCArIDFdID09ICc6Jykgewor ICAgICAgICAgaG9zdCA9IGIudGFrZV9wcmVmaXhfYXQoaWR4ICsgMSk7CisgICAgICAgICBwb3J0 ID0gYjsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgaG9zdCA9IGI7CisgICAgICAgfQorICAg ICB9IGVsc2UgeworLSAgICAgIGF1dG8geCA9IGIuc3BsaXRfcHJlZml4X2F0KCc6Jyk7CistICAg ICAgaWYgKHgpIHsKKy0gICAgICAgIGhvc3QgPSB4OworLSAgICAgICAgcG9ydCA9IGI7CistICAg ICAgfSBlbHNlIHsKKy0gICAgICAgIGhvc3QgPSBiOworLSAgICAgIH0KKysgICAgICBob3N0ID0g Yi50YWtlX3ByZWZpeF9hdCgnOicpOworKyAgICAgIHBvcnQgPSBiOworICAgICB9CisgICB9Owor IAoKZGlmZiAtLWdpdCBhL3RyYWZmaWNzZXJ2ZXItOS4xLjIudGFyLmJ6Mi5hc2MgYi90cmFmZmlj c2VydmVyLTkuMS4yLnRhci5iejIuYXNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLmNjNzg5NjQKLS0tIC9kZXYvbnVsbAorKysgYi90cmFmZmljc2VydmVyLTkuMS4yLnRhci5i ejIuYXNjCkBAIC0wLDAgKzEsMTggQEAKKy0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tCisK K2lRS1RCQUFCQ2dCOUZpRUVlckZlWDk0WlZhVU5xWVlGVXozdkZWMTd2Rm9GQW1JbVpVNWZGSUFB QUFBQUxnQW8KK2FYTnpkV1Z5TFdad2NrQnViM1JoZEdsdmJuTXViM0JsYm5CbmNDNW1hV1owYUdo dmNuTmxiV0Z1TG01bGREZEIKK1FqRTFSVFZHUkVVeE9UVTFRVFV3UkVFNU9EWXdOVFV6TTBSRlJq RTFOVVEzUWtKRE5VRUFDZ2tRVXozdkZWMTcKK3ZGckpzeEFBb2xDaWcyMUVDTTM5YzRwSUhCdjdE eHlXNkRHTEM3VWhobXJvS05vRmJha0NSUHN1eS9jWG40S2cKKys4ai9EeGVkRDNQVkhTbE9zMHla OXBIQjhQZVRXaE5RbGZ3YjZhTnF2dG1jbWdPTndtZUlQejBzMUM0cC9UYlkKK1Q5UE5yVUF0emg1 R1VVdC94aXZYYkNJZUlWanZkTUpFcVpHYWNwUW42TEtsK1lrcUUwWTVLNWVSQlBzY0s5MDUKK0Ft KzA2c2crNFRJdkh3NTVzSnY0U1kwVVlnaCt6Y1FicTFJS3IvaTVBVHAxbk5VNVl6dERVSTAvR1Rz YkdlREMKK3NJRXZkTDJtL25PNCtnVVpPMWpzb3o2M0FhdWRlU2YxTS9yVGM1OEZwZDN6OUxsTmpG UnZBVk9wemxUNSt5TFgKK3NDWEMxRi9Ub1p1TjNoNDA0Skg3bXF2YlZYaWNUM1p5ZEFwTzRaUGFJ S00rWTlrc1ZBU005Sm9qaG9NQzhUOW8KK1ExQlJKaHFBU3NjbG1LWGNzbVJnRCt3VjZYVU5GTEI0 QzRBWVNoRllLNU9ET2F4UVhVdk1aTndoem92MGl2WlgKKzRzYk8wYVY5Z1JndjVMQndkcmV2Q2ZC NloxbTBBbVdvNFNFSzA0dnJkVVo2bnpPMDNNaVZvRHM1REZqblNlcjgKK0lITHIwTmFVbm45T2RW M2xCK2tWS2k4UnAxelRHZVJvVnBEOHBVaGlJVStOUEN2YzJlOFhLbGkvQ29GT05yNmoKK1RLZmJq Qm82dm0zZ3p0aXpXWjBzWG55VVp5WVAwWXk1ZmpTVlhLa3huakxEa1oyWWxqU0gzODI1bVN4ZGpB YVoKK2JKR1pIRVprVXJSOE5remhkM2RlampYbmtsVmpXSnhvbFNwczVMeDh3ZEZBTGhaOFVHbz0K Kz1wUWROCistLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS0KCmRpZmYgLS1naXQgYS90cmFmZmlj c2VydmVyLWNyeXB0by1wb2xpY3kucGF0Y2ggYi90cmFmZmljc2VydmVyLWNyeXB0by1wb2xpY3ku cGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwNzYyNwotLS0gL2Rl di9udWxsCisrKyBiL3RyYWZmaWNzZXJ2ZXItY3J5cHRvLXBvbGljeS5wYXRjaApAQCAtMCwwICsx LDE1IEBACistLS0gbWdtdC9SZWNvcmRzQ29uZmlnLmNjLm9yaWcJMjAyMi0wNC0wOCAyMzo0MTox NS41MTY5ODk3MDUgKzAwMDAKKysrKyBtZ210L1JlY29yZHNDb25maWcuY2MJMjAyMi0wNC0wOCAy Mzo0NjowNy40NTQyOTkzNzkgKzAwMDAKK0BAIC0xMDkxLDEwICsxMDkxLDEwIEBACisgICAsCisg ICB7UkVDVF9DT05GSUcsICJwcm94eS5jb25maWcuc3NsLmNsaWVudC5UTFN2MV8zIiwgUkVDRF9J TlQsICIxIiwgUkVDVV9SRVNUQVJUX1RTLCBSUl9OVUxMLCBSRUNDX0lOVCwgIlswLTFdIiwgUkVD QV9OVUxMfQorICAgLAorLSAge1JFQ1RfQ09ORklHLCAicHJveHkuY29uZmlnLnNzbC5zZXJ2ZXIu Y2lwaGVyX3N1aXRlIiwgUkVDRF9TVFJJTkcsICJFQ0RIRS1FQ0RTQS1BRVMyNTYtR0NNLVNIQTM4 NDpFQ0RIRS1FQ0RTQS1BRVMxMjgtR0NNLVNIQTI1NjpFQ0RIRS1FQ0RTQS1BRVMyNTYtQ0NNOkVD REhFLUVDRFNBLUFFUzEyOC1DQ006RUNESEUtRUNEU0EtQUVTMjU2LUNDTTg6RUNESEUtRUNEU0Et QUVTMTI4LUNDTTg6RUNESEUtRUNEU0EtQ0hBQ0hBMjAtUE9MWTEzMDU6RUNESEUtRUNEU0EtQUVT MjU2LVNIQTM4NDpFQ0RIRS1FQ0RTQS1BRVMxMjgtU0hBMjU2OkVDREhFLVJTQS1BRVMyNTYtR0NN LVNIQTM4NDpFQ0RIRS1SU0EtQUVTMTI4LUdDTS1TSEEyNTY6RUNESEUtUlNBLUNIQUNIQTIwLVBP TFkxMzA1OkVDREhFLVJTQS1BRVMyNTYtU0hBMzg0OkVDREhFLVJTQS1BRVMxMjgtU0hBMjU2OkRI RS1SU0EtQUVTMjU2LUdDTS1TSEEzODQ6REhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NjpESEUtUlNB LUFFUzI1Ni1DQ004OkRIRS1SU0EtQUVTMTI4LUNDTTg6REhFLVJTQS1BRVMyNTYtQ0NNOkRIRS1S U0EtQUVTMTI4LUNDTTpESEUtUlNBLUFFUzI1Ni1TSEEyNTY6REhFLVJTQS1BRVMxMjgtU0hBMjU2 OkFFUzI1Ni1HQ00tU0hBMzg0OkFFUzEyOC1HQ00tU0hBMjU2OkFFUzI1Ni1DQ004OkFFUzEyOC1D Q004OkFFUzI1Ni1DQ006QUVTMTI4LUNDTTpBRVMyNTYtU0hBMjU2OkFFUzEyOC1TSEEyIiwgUkVD VV9SRVNUQVJUX1RTLCBSUl9OVUxMLCBSRUNDX05VTEwsIG51bGxwdHIsIFJFQ0FfTlVMTH0KKysg IHtSRUNUX0NPTkZJRywgInByb3h5LmNvbmZpZy5zc2wuc2VydmVyLmNpcGhlcl9zdWl0ZSIsIFJF Q0RfU1RSSU5HLCAiUFJPRklMRT1TWVNURU0iLCBSRUNVX1JFU1RBUlRfVFMsIFJSX05VTEwsIFJF Q0NfTlVMTCwgbnVsbHB0ciwgUkVDQV9OVUxMfQorICAgLAorICAgLy8gQ29tcHV0ZWQgZnJvbSBv cGVuc3NsIGNpcGhlcnMgJ0FMTDohYU5VTEw6IWFESDohYUVDREg6IWFQU0s6IWFTUlA6IWVOVUxM OiFrU1JQOiFTU0x2MjohU1NMdjM6IVRMU3YxOiFUTFN2MS4xOkBTVFJFTkdUSCcKKy0gIHtSRUNU X0NPTkZJRywgInByb3h5LmNvbmZpZy5zc2wuY2xpZW50LmNpcGhlcl9zdWl0ZSIsIFJFQ0RfU1RS SU5HLCAiRUNESEUtRUNEU0EtQUVTMjU2LUdDTS1TSEEzODQ6RUNESEUtUlNBLUFFUzI1Ni1HQ00t U0hBMzg0OkRIRS1EU1MtQUVTMjU2LUdDTS1TSEEzODQ6REhFLVJTQS1BRVMyNTYtR0NNLVNIQTM4 NDpFQ0RIRS1FQ0RTQS1BRVMyNTYtQ0NNODpFQ0RIRS1FQ0RTQS1BRVMyNTYtQ0NNOkRIRS1SU0Et QUVTMjU2LUNDTTg6REhFLVJTQS1BRVMyNTYtQ0NNOkVDREhFLUVDRFNBLUNIQUNIQTIwLVBPTFkx MzA1OkVDREhFLVJTQS1DSEFDSEEyMC1QT0xZMTMwNTpESEUtUlNBLUNIQUNIQTIwLVBPTFkxMzA1 OkVDREhFLUVDRFNBLUFSSUEyNTYtR0NNLVNIQTM4NDpFQ0RIRS1BUklBMjU2LUdDTS1TSEEzODQ6 REhFLURTUy1BUklBMjU2LUdDTS1TSEEzODQ6REhFLVJTQS1BUklBMjU2LUdDTS1TSEEzODQ6RUNE SEUtRUNEU0EtQUVTMjU2LVNIQTM4NDpFQ0RIRS1SU0EtQUVTMjU2LVNIQTM4NDpESEUtUlNBLUFF UzI1Ni1TSEEyNTY6REhFLURTUy1BRVMyNTYtU0hBMjU2OkVDREhFLUVDRFNBLUNBTUVMTElBMjU2 LVNIQTM4NDpFQ0RIRS1SU0EtQ0FNRUxMSUEyNTYtU0hBMzg0OkRIRS1SU0EtQ0FNRUxMSUEyNTYt U0hBMjU2OkRIRS1EU1MtQ0FNRUxMSUEyNTYtU0hBMjU2OlJTQS1QU0stQUVTMjU2LUdDTS1TSEEz ODQ6UlNBLVBTSy1DSEFDSEEyMC1QT0xZMTMwNTpSU0EtUFNLLUFSSUEyNTYtR0NNLVNIQTM4NDpB RVMyNTYtR0NNLVNIQTM4NDpBRVMyNTYtQ0NNODpBRVMyNTYtQ0NNOkFSSUEyNTYtR0NNLVNIQTM4 NDpBRVMyNTYtU0hBMjU2OkNBTUVMTElBMjU2LVNIQTI1NjpFQ0RIRS1FQ0RTQS1BRVMxMjgtR0NN LVNIQTI1NjpFQ0RIRS1SU0EtQUVTMTI4LUdDTS1TSEEyNTY6REhFLURTUy1BRVMxMjgtR0NNLVNI QTI1NjpESEUtUlNBLUFFUzEyOC1HQ00tU0hBMjU2OkVDREhFLUVDRFNBLUFFUzEyOC1DQ004OkVD REhFLUVDRFNBLUFFUzEyOC1DQ006REhFLVJTQS1BRVMxMjgtQ0NNODpESEUtUlNBLUFFUzEyOC1D Q006RUNESEUtRUNEU0EtQVJJQTEyOC1HQ00tU0hBMjU2OkVDREhFLUFSSUExMjgtR0NNLVNIQTI1 NjpESEUtRFNTLUFSSUExMjgtR0NNLVNIQTI1NjpESEUtUlNBLUFSSUExMjgtR0NNLVNIQTI1NjpF Q0RIRS1FQ0RTQS1BRVMxMjgtU0hBMjU2OkVDREhFLVJTQS1BRVMxMjgtU0hBMjU2OkRIRS1SU0Et QUVTMTI4LVNIQTI1NjpESEUtRFNTLUFFUzEyOC1TSEEyNTY6RUNESEUtRUNEU0EtQ0FNRUxMSUEx MjgtU0hBMjU2OkVDREhFLVJTQS1DQU1FTExJQTEyOC1TSEEyNTY6REhFLVJTQS1DQU1FTExJQTEy OC1TSEEyNTY6REhFLURTUy1DQU1FTExJQTEyOC1TSEEyNTY6UlNBLVBTSy1BRVMxMjgtR0NNLVNI QTI1NjpSU0EtUFNLLUFSSUExMjgtR0NNLVNIQTI1NjpBRVMxMjgtR0NNLVNIQTI1NjpBRVMxMjgt Q0NNODpBRVMxMjgtQ0NNOkFSSUExMjgtR0NNLVNIQTI1NjpBRVMxMjgtU0hBMjU2OkNBTUVMTElB MTI4LVNIQTI1NiIsIFJFQ1VfUkVTVEFSVF9UUywgUlJfTlVMTCwgUkVDQ19OVUxMLCBudWxscHRy LCBSRUNBX05VTEx9CisrICB7UkVDVF9DT05GSUcsICJwcm94eS5jb25maWcuc3NsLmNsaWVudC5j aXBoZXJfc3VpdGUiLCBSRUNEX1NUUklORywgIlBST0ZJTEU9U1lTVEVNIiwgUkVDVV9SRVNUQVJU X1RTLCBSUl9OVUxMLCBSRUNDX05VTEwsIG51bGxwdHIsIFJFQ0FfTlVMTH0KKyAgICwKKyAgIHtS RUNUX0NPTkZJRywgInByb3h5LmNvbmZpZy5zc2wuc2VydmVyLmhvbm9yX2NpcGhlcl9vcmRlciIs IFJFQ0RfSU5ULCAiMSIsIFJFQ1VfUkVTVEFSVF9UUywgUlJfTlVMTCwgUkVDQ19JTlQsICJbMC0x XSIsIFJFQ0FfTlVMTH0KKyAgICwKCmRpZmYgLS1naXQgYS90cmFmZmljc2VydmVyLWluaXRfc2Ny aXB0cy5wYXRjaCBiL3RyYWZmaWNzZXJ2ZXItaW5pdF9zY3JpcHRzLnBhdGNoCmRlbGV0ZWQgZmls ZSBtb2RlIDEwMDY0NAppbmRleCBhOWE4MjUzLi4wMDAwMDAwCi0tLSBhL3RyYWZmaWNzZXJ2ZXIt aW5pdF9zY3JpcHRzLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLS0tIHRy YWZmaWNzZXJ2ZXItNC4wLjEvcmMvdHJhZmZpY3NlcnZlci5pbi5vcmdpbmFsCTIwMTItMDYtMjMg MTU6MDI6MjUuNzY4NDA1OTI1ICswMjAwCi0rKysgdHJhZmZpY3NlcnZlci00LjAuMS9yYy90cmFm Zmljc2VydmVyLmluCTIwMTItMDYtMjMgMTU6MDc6MTYuNTA3MTkzMjY4ICswMjAwCi1AQCAtMjks NyArMjksNyBAQAotICMgUHJvdmlkZXM6ICAgICAgICAgIFRyYWZmaWMgU2VydmVyCi0gIyBSZXF1 aXJlZC1TdGFydDogICAgJGxvY2FsX2ZzICRyZW1vdGVfZnMKLSAjIFJlcXVpcmVkLVN0b3A6ICAg ICAkbG9jYWxfZnMgJHJlbW90ZV9mcwotLSMgRGVmYXVsdC1TdGFydDogICAgIDIgMyA0IDUKLSsj IERlZmF1bHQtU3RhcnQ6ICAgICAtCi0gIyBEZWZhdWx0LVN0b3A6ICAgICAgUyAwIDEgNgotICMg U2hvcnQtRGVzY3JpcHRpb246IFN0YXJ0dXAvc2h1dGRvd24gc2NyaXB0IGZvciB0aGUgQXBhY2hl IFRyYWZmaWMgU2VydmVyCi0gIyBEZXNjcmlwdGlvbjogICAgICAgQXBhY2hlIFRyYWZmaWMgU2Vy dmVyIGlzIGZhc3QsIHNjYWxhYmxlIGFuZCBleHRlbnNpYmxlCi0KCmRpZmYgLS1naXQgYS90cmFm Zmljc2VydmVyLXJlbW92ZWx1YWppdC5wYXRjaCBiL3RyYWZmaWNzZXJ2ZXItcmVtb3ZlbHVhaml0 LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTA5NDk4Li4wMDAwMDAwCi0t LSBhL3RyYWZmaWNzZXJ2ZXItcmVtb3ZlbHVhaml0LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEs MjkgKzAsMCBAQAotLS0tIHRyYWZmaWNzZXJ2ZXItNS4zLjAvbGliL01ha2VmaWxlLmFtLm9yaWcJ MjAxNS0wNi0yMiAwMToxNDowOC41MjMwNTkwOTEgKzAxMDAKLSsrKyB0cmFmZmljc2VydmVyLTUu My4wL2xpYi9NYWtlZmlsZS5hbQkyMDE1LTA2LTIyIDAxOjE0OjIyLjQ5ODMyMjAzOSArMDEwMAot QEAgLTMxLDI2ICszMSwzIEBACi0gZW5kaWYKLSAKLSBESVNUX1NVQkRJUlMgPSAkKFNVQkRJUlMp Ci0tCi0tIyBTb21lIHNwZWNpYWwgaGFja3MgYXJvdW5kIGJ1aWxkaW5nIHRoZSBsdWFqaXQuCi0t IwotLSMgIC0gQ29weSB0aGUgbHVhaml0IHNvdXJjZSB0cmVlIGlmIHdlJ3JlIGRvaW5nIG91dC1v Zi1zb3VyY2UgYnVpbGRzCi0tIyAgLSBVcG9uIGNsZWFuLCByZW1vdmUgdGhlIGx1YWppdCB0cmVl IGZyb20gdGhlIG91dC1vZi1zb3VyY2UgYnVpbGQgdHJlZQotLSMKLS0jIE5vdGU6IFRoZSBMVUFf TERGTEFHUyBpcyBhIGJpdCBvZiBhIGhhY2ssIHNpbmNlIEx1YUpJVCBvbiBPbW5pT1MgbmVlZHMK LS0jICAgICAgIHRoZSAtbTY0IGZsYWcuIFNlZSBjb25maWd1cmUuYWMuCi0tIwotLWlmIEJVSUxE X0xVQUpJVAotLUxVQV9DRkxBR1M9JChDRkxBR1MpICQoTFVBSklUX0NGTEFHUykgLURMVUFfQ09N UEFUX0FMTCAtRExVQV9VU0VfUE9TSVggLURMVUFfVVNFX0RMT1BFTgotLQotLWFsbC1sb2NhbDoK LS0JQGVjaG8gIk1ha2luZyBhbGwgaW4gbHVhaml0IgotLQl0ZXN0IC1kICIkKHRvcF9zcmNkaXIp LyQoc3ViZGlyKS9sdWFqaXQvc3JjIiB8fCAoY2QgIiQodG9wX3NyY2RpcikiICYmIGdpdCBzdWJt b2R1bGUgdXBkYXRlIC0taW5pdCkKLS0JdGVzdCAtZCAiJCh0b3BfYnVpbGRkaXIpLyQoc3ViZGly KS9sdWFqaXQvc3JjIiB8fCBjcCAtcmYgIiQoc3JjZGlyKS9sdWFqaXQiICIkKHRvcF9idWlsZGRp cikvJChzdWJkaXIpLyIKLS0JY2QgbHVhaml0ICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEJV SUxETU9ERT0ic3RhdGljIiBQUkVGSVg9IiQocHJlZml4KSIgQ0M9IiQoQ0MpIiBcCi0tCSAgICAg ICAgICAgICAgICAgICAgIENGTEFHUz0iJChMVUFfQ0ZMQUdTKSIgTERGTEFHUz0iQExVQV9MREZM QUdTQCIKLS0KLS1jbGVhbi1sb2NhbDoKLS0JdGVzdCAiJCh0b3Bfc3JjZGlyKSIgIT0gIiQodG9w X2J1aWxkZGlyKSIgfHwgKGNkICIkKHRvcF9idWlsZGRpcikvJChzdWJkaXIpL2x1YWppdCIgJiYg JChNQUtFKSBjbGVhbikKLS0JdGVzdCAiJCh0b3Bfc3JjZGlyKSIgPSAiJCh0b3BfYnVpbGRkaXIp IiB8fCBybSAtcmYgIiQodG9wX2J1aWxkZGlyKS8kKHN1YmRpcikvbHVhaml0IgotLWVuZGlmCgpk aWZmIC0tZ2l0IGEvdHJhZmZpY3NlcnZlci5mYyBiL3RyYWZmaWNzZXJ2ZXIuZmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjNDc0MAotLS0gL2Rldi9udWxsCisrKyBiL3Ry YWZmaWNzZXJ2ZXIuZmMKQEAgLTAsMCArMSwyNyBAQAorL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0v dHJhZmZpY3NlcnZlci5zZXJ2aWNlICAtLSAgICAgZ2VuX2NvbnRleHQoc3lzdGVtX3U6b2JqZWN0 X3I6dHJhZmZpY3NlcnZlcl91bml0X2ZpbGVfdCxzMCkKKworL2V0Yy90cmFmZmljc2VydmVyKC8u Kik/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2NvbnRleHQoc3lzdGVtX3U6b2Jq ZWN0X3I6dHJhZmZpY3NlcnZlcl9ldGNfdCxzMCkKKworL3Vzci9iaW4vdHJhZmZpY19tYW5hZ2Vy ICAgICAgICAgICAgICAgICAgICAgICAtLSAgICAgZ2VuX2NvbnRleHQoc3lzdGVtX3U6b2JqZWN0 X3I6dHJhZmZpY3NlcnZlcl9leGVjX3QsczApCisvdXNyL2Jpbi90cmFmZmljX3NlcnZlciAgICAg ICAgICAgICAgICAgICAgICAgIC0tICAgICBnZW5fY29udGV4dChzeXN0ZW1fdTpvYmplY3Rfcjp0 cmFmZmljc2VydmVyX2V4ZWNfdCxzMCkKKworIyBIZWxwZXIgYXBwbGljYXRpb25zCisvdXNyL2Jp bi90cmFmZmljX2NhY2hlX3Rvb2wJCSAgICAgICAtLSAgICAgZ2VuX2NvbnRleHQoc3lzdGVtX3U6 b2JqZWN0X3I6dHJhZmZpY3NlcnZlcl9leGVjX3QsczApCisvdXNyL2Jpbi90cmFmZmljX2NyYXNo bG9nCQkgICAgICAgLS0gICAgIGdlbl9jb250ZXh0KHN5c3RlbV91Om9iamVjdF9yOnRyYWZmaWNz ZXJ2ZXJfZXhlY190LHMwKQorL3Vzci9iaW4vdHJhZmZpY19jdGwJCQkgICAgICAgLS0gICAgIGdl bl9jb250ZXh0KHN5c3RlbV91Om9iamVjdF9yOnRyYWZmaWNzZXJ2ZXJfZXhlY190LHMwKQorL3Vz ci9iaW4vdHJhZmZpY19sYXlvdXQJCQkgICAgICAgLS0gICAgIGdlbl9jb250ZXh0KHN5c3RlbV91 Om9iamVjdF9yOnRyYWZmaWNzZXJ2ZXJfZXhlY190LHMwKQorL3Vzci9iaW4vdHJhZmZpY19sb2dj YXQJCQkgICAgICAgLS0gICAgIGdlbl9jb250ZXh0KHN5c3RlbV91Om9iamVjdF9yOnRyYWZmaWNz ZXJ2ZXJfZXhlY190LHMwKQorL3Vzci9iaW4vdHJhZmZpY19sb2dzdGF0cwkJICAgICAgIC0tICAg ICBnZW5fY29udGV4dChzeXN0ZW1fdTpvYmplY3Rfcjp0cmFmZmljc2VydmVyX2V4ZWNfdCxzMCkK Ky91c3IvYmluL3RyYWZmaWNfdG9wCQkJICAgICAgIC0tICAgICBnZW5fY29udGV4dChzeXN0ZW1f dTpvYmplY3Rfcjp0cmFmZmljc2VydmVyX2V4ZWNfdCxzMCkKKy91c3IvYmluL3RyYWZmaWNfdmlh CQkJICAgICAgIC0tICAgICBnZW5fY29udGV4dChzeXN0ZW1fdTpvYmplY3Rfcjp0cmFmZmljc2Vy dmVyX2V4ZWNfdCxzMCkKKy91c3IvYmluL3RzcHVzaAkJCQkgICAgICAgLS0gICAgIGdlbl9jb250 ZXh0KHN5c3RlbV91Om9iamVjdF9yOnRyYWZmaWNzZXJ2ZXJfZXhlY190LHMwKQorCisjIFBsdWdp bnMgY2FuIGRvIGFueXRoaW5nIHRoZSBtYWluIGFwcCBtaWdodCBkbyAobGlzdGVuLCBjb25uZWN0 LCByZWFkL3dyaXRlIGRhdGEsIGV0Yy4pCisjIEJlY2F1c2Ugb2YgdGhpcywgdGhlcmUncyBubyBz ZW5zZSBpbiBkZWZpbmluZyBhIHNlcGFyYXRlIHBsdWdpbiBmaWxlIGNvbnRleHQKKy91c3IvbGli NjQvdHJhZmZpY3NlcnZlci9wbHVnaW5zKC8uKik/CQkgICAgICBnZW5fY29udGV4dChzeXN0ZW1f dTpvYmplY3Rfcjp0cmFmZmljc2VydmVyX2V4ZWNfdCxzMCkKKworL3Zhci9sb2cvdHJhZmZpY3Nl cnZlcigvLiopPyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2NvbnRleHQoc3lzdGVtX3U6 b2JqZWN0X3I6dHJhZmZpY3NlcnZlcl9sb2dfdCxzMCkKKworL3Zhci9ydW4vdHJhZmZpY3NlcnZl cigvLiopPyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2NvbnRleHQoc3lzdGVtX3U6b2Jq ZWN0X3I6dHJhZmZpY3NlcnZlcl9ydW5fdCxzMCkKKworL3Zhci9jYWNoZS90cmFmZmljc2VydmVy KC8uKik/ICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2NvbnRleHQoc3lzdGVtX3U6b2JqZWN0 X3I6dHJhZmZpY3NlcnZlcl9jYWNoZV90LHMwKQoKZGlmZiAtLWdpdCBhL3RyYWZmaWNzZXJ2ZXIu aWYgYi90cmFmZmljc2VydmVyLmlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LmE1NWRhYzgKLS0tIC9kZXYvbnVsbAorKysgYi90cmFmZmljc2VydmVyLmlmCkBAIC0wLDAgKzEs MTIzIEBACisKKyMjIDxzdW1tYXJ5PnBvbGljeSBmb3IgdHJhZmZpY3NlcnZlcjwvc3VtbWFyeT4K KworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgPHN1bW1hcnk+ CisjIwlFeGVjdXRlIHRyYWZmaWNzZXJ2ZXJfZXhlY190IGluIHRoZSB0cmFmZmljc2VydmVyIGRv bWFpbi4KKyMjIDwvc3VtbWFyeT4KKyMjIDxwYXJhbSBuYW1lPSJkb21haW4iPgorIyMgPHN1bW1h cnk+CisjIwlEb21haW4gYWxsb3dlZCB0byB0cmFuc2l0aW9uLgorIyMgPC9zdW1tYXJ5PgorIyMg PC9wYXJhbT4KKyMKK2ludGVyZmFjZShgdHJhZmZpY3NlcnZlcl9kb210cmFucycsYAorCWdlbl9y ZXF1aXJlKGAKKwkJdHlwZSB0cmFmZmljc2VydmVyX3QsIHRyYWZmaWNzZXJ2ZXJfZXhlY190Owor CScpCisKKwljb3JlY21kX3NlYXJjaF9iaW4oJDEpCisJZG9tdHJhbnNfcGF0dGVybigkMSwgdHJh ZmZpY3NlcnZlcl9leGVjX3QsIHRyYWZmaWNzZXJ2ZXJfdCkKKycpCisKKworIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgPHN1bW1hcnk+CisjIyAgICAgIEFsbG93 IHRoZSBzcGVjaWZpZWQgZG9tYWluIHRvIHJlYWQKKyMjICAgICAgdHJhZmZpY3NlcnZlciBjb25m aWd1cmF0aW9uIGZpbGVzLgorIyMgPC9zdW1tYXJ5PgorIyMgPHBhcmFtIG5hbWU9ImRvbWFpbiI+ CisjIyAgICAgIDxzdW1tYXJ5PgorIyMgICAgICBEb21haW4gYWxsb3dlZCBhY2Nlc3MuCisjIyAg ICAgIDwvc3VtbWFyeT4KKyMjIDwvcGFyYW0+CisjIyA8cm9sZWNhcC8+CisjCitpbnRlcmZhY2Uo YHRyYWZmaWNzZXJ2ZXJfcmVhZF9jb25maWcnLGAKKyAgICAgICAgZ2VuX3JlcXVpcmUoYAorICAg ICAgICAgICAgICAgIHR5cGUgdHJhZmZpY3NlcnZlcl9ldGNfdDsKKyAgICAgICAgJykKKworICAg ICAgICBmaWxlc19zZWFyY2hfZXRjKCQxKQorICAgICAgICBsaXN0X2RpcnNfcGF0dGVybigkMSwg dHJhZmZpY3NlcnZlcl9ldGNfdCwgdHJhZmZpY3NlcnZlcl9ldGNfdCkKKyAgICAgICAgcmVhZF9m aWxlc19wYXR0ZXJuKCQxLCB0cmFmZmljc2VydmVyX2V0Y190LCB0cmFmZmljc2VydmVyX2V0Y190 KQorJykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyA8 c3VtbWFyeT4KKyMjCVJlYWQgdHJhZmZpY3NlcnZlcidzIGxvZyBmaWxlcy4KKyMjIDwvc3VtbWFy eT4KKyMjIDxwYXJhbSBuYW1lPSJkb21haW4iPgorIyMJPHN1bW1hcnk+CisjIwlEb21haW4gYWxs b3dlZCBhY2Nlc3MuCisjIwk8L3N1bW1hcnk+CisjIyA8L3BhcmFtPgorIyMgPHJvbGVjYXAvPgor IworaW50ZXJmYWNlKGB0cmFmZmljc2VydmVyX3JlYWRfbG9nJyxgCisJZ2VuX3JlcXVpcmUoYAor CQl0eXBlIHRyYWZmaWNzZXJ2ZXJfbG9nX3Q7CisJJykKKworCWxvZ2dpbmdfc2VhcmNoX2xvZ3Mo JDEpCisJcmVhZF9maWxlc19wYXR0ZXJuKCQxLCB0cmFmZmljc2VydmVyX2xvZ190LCB0cmFmZmlj c2VydmVyX2xvZ190KQorJykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIworIyMgPHN1bW1hcnk+CisjIwlBcHBlbmQgdG8gdHJhZmZpY3NlcnZlciBsb2cgZmlsZXMu CisjIyA8L3N1bW1hcnk+CisjIyA8cGFyYW0gbmFtZT0iZG9tYWluIj4KKyMjCTxzdW1tYXJ5Pgor IyMJRG9tYWluIGFsbG93ZWQgYWNjZXNzLgorIyMJPC9zdW1tYXJ5PgorIyMgPC9wYXJhbT4KKyMK K2ludGVyZmFjZShgdHJhZmZpY3NlcnZlcl9hcHBlbmRfbG9nJyxgCisJZ2VuX3JlcXVpcmUoYAor CQl0eXBlIHRyYWZmaWNzZXJ2ZXJfbG9nX3Q7CisJJykKKworCWxvZ2dpbmdfc2VhcmNoX2xvZ3Mo JDEpCisJYXBwZW5kX2ZpbGVzX3BhdHRlcm4oJDEsIHRyYWZmaWNzZXJ2ZXJfbG9nX3QsIHRyYWZm aWNzZXJ2ZXJfbG9nX3QpCisnKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjCisjIyA8c3VtbWFyeT4KKyMjCU1hbmFnZSB0cmFmZmljc2VydmVyIGxvZyBmaWxlcwor IyMgPC9zdW1tYXJ5PgorIyMgPHBhcmFtIG5hbWU9ImRvbWFpbiI+CisjIwk8c3VtbWFyeT4KKyMj CURvbWFpbiBhbGxvd2VkIGFjY2Vzcy4KKyMjCTwvc3VtbWFyeT4KKyMjIDwvcGFyYW0+CisjCitp bnRlcmZhY2UoYHRyYWZmaWNzZXJ2ZXJfbWFuYWdlX2xvZycsYAorCWdlbl9yZXF1aXJlKGAKKwkJ dHlwZSB0cmFmZmljc2VydmVyX2xvZ190OworCScpCisKKwlsb2dnaW5nX3NlYXJjaF9sb2dzKCQx KQorCW1hbmFnZV9kaXJzX3BhdHRlcm4oJDEsIHRyYWZmaWNzZXJ2ZXJfbG9nX3QsIHRyYWZmaWNz ZXJ2ZXJfbG9nX3QpCisJbWFuYWdlX2ZpbGVzX3BhdHRlcm4oJDEsIHRyYWZmaWNzZXJ2ZXJfbG9n X3QsIHRyYWZmaWNzZXJ2ZXJfbG9nX3QpCisJbWFuYWdlX2xua19maWxlc19wYXR0ZXJuKCQxLCB0 cmFmZmljc2VydmVyX2xvZ190LCB0cmFmZmljc2VydmVyX2xvZ190KQorJykKKworIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgPHN1bW1hcnk+CisjIwlDb25uZWN0 IHRvIHRyYWZmaWNzZXJ2ZXIgbWFuYWdlbWVudCBzb2NrZXRzCisjIyA8L3N1bW1hcnk+CisjIyA8 cGFyYW0gbmFtZT0iZG9tYWluIj4KKyMjCTxzdW1tYXJ5PgorIyMJRG9tYWluIGFsbG93ZWQgYWNj ZXNzLgorIyMJPC9zdW1tYXJ5PgorIyMgPC9wYXJhbT4KKyMKK2ludGVyZmFjZShgdHJhZmZpY3Nl cnZlcl9jb25uZWN0X3NvY2snLGAKKwlnZW5fcmVxdWlyZShgCisJCXR5cGUgdHJhZmZpY3NlcnZl cl9ydW5fdDsKKwknKQorCisJcndfc29ja19maWxlc19wYXR0ZXJuKCQxLCB0cmFmZmljc2VydmVy X3J1bl90LCB0cmFmZmljc2VydmVyX3J1bl90KQorJykKCmRpZmYgLS1naXQgYS90cmFmZmljc2Vy dmVyLmtleXJpbmcgYi90cmFmZmljc2VydmVyLmtleXJpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IGRiNDM5M2IuLjAwMDAwMDAKQmluYXJ5IGZpbGVzIGEvdHJhZmZpY3NlcnZlci5r ZXlyaW5nIGFuZCAvZGV2L251bGwgZGlmZmVyCgpkaWZmIC0tZ2l0IGEvdHJhZmZpY3NlcnZlci5z ZXJ2aWNlIGIvdHJhZmZpY3NlcnZlci5zZXJ2aWNlCmluZGV4IDJlNmE1NTQuLmJhZWVmZWQgMTAw NjQ0Ci0tLSBhL3RyYWZmaWNzZXJ2ZXIuc2VydmljZQorKysgYi90cmFmZmljc2VydmVyLnNlcnZp Y2UKQEAgLTEsMTIgKzEsMjIgQEAKIFtVbml0XQogRGVzY3JpcHRpb249QXBhY2hlIFRyYWZmaWMg U2VydmVyIGlzIGEgZmFzdCwgc2NhbGFibGUgYW5kIGV4dGVuc2libGUgY2FjaGluZyBwcm94eSBz ZXJ2ZXIuCi1BZnRlcj1zeXNsb2cudGFyZ2V0IG5ldHdvcmsudGFyZ2V0CitEb2N1bWVudGF0aW9u PW1hbjp0cmFmZmljX3NlcnZlcig4KQorQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CiAKIFtT ZXJ2aWNlXQogVHlwZT1zaW1wbGUKK1VzZXI9dHJhZmZpY3NlcnZlcgorQW1iaWVudENhcGFiaWxp dGllcz1DQVBfTkVUX0JJTkRfU0VSVklDRQogRW52aXJvbm1lbnRGaWxlPS0vZXRjL3N5c2NvbmZp Zy90cmFmZmljc2VydmVyCi1FeGVjU3RhcnQ9L3Vzci9iaW4vdHJhZmZpY19jb3AgJFRDX0RBRU1P Tl9BUkdTCi1FeGVjUmVsb2FkPS91c3IvYmluL3RyYWZmaWNfbGluZSAteAorRXhlY1N0YXJ0PS91 c3IvYmluL3RyYWZmaWNfbWFuYWdlciAkVE1fREFFTU9OX0FSR1MKK0V4ZWNSZWxvYWQ9L3Vzci9i aW4vdHJhZmZpY19jdGwgY29uZmlnIHJlbG9hZAorU3VjY2Vzc0V4aXRTdGF0dXM9MTUKK1Jlc3Rh cnQ9b24tZmFpbHVyZQorCisjIEZyb20gdXBzdHJlYW0KK1Jlc3RhcnRTZWM9NXMKK1RpbWVvdXRT dG9wU2VjPTVzCitMaW1pdE5PRklMRT0xMDAwMDAwCiAKIFtJbnN0YWxsXQogV2FudGVkQnk9bXVs dGktdXNlci50YXJnZXQKCmRpZmYgLS1naXQgYS90cmFmZmljc2VydmVyLnNwZWMgYi90cmFmZmlj c2VydmVyLnNwZWMKaW5kZXggOThkYjlmZi4uOTUzYTg4ZCAxMDA2NDQKLS0tIGEvdHJhZmZpY3Nl cnZlci5zcGVjCisrKyBiL3RyYWZmaWNzZXJ2ZXIuc3BlYwpAQCAtMSwyMjcgKzEsNDUyIEBACi0j IGh0dHBzOi8vZmVkb3JhcHJvamVjdC5vcmcvd2lraS9QYWNrYWdpbmc6R3VpZGVsaW5lcyNQSUUK LSVkZWZpbmUgX2hhcmRlbmVkX2J1aWxkIDEKLQotU3VtbWFyeToJRmFzdCwgc2NhbGFibGUgYW5k IGV4dGVuc2libGUgSFRUUC8xLjEgY29tcGxpYW50IGNhY2hpbmcgcHJveHkgc2VydmVyCi1OYW1l OgkJdHJhZmZpY3NlcnZlcgotVmVyc2lvbjoJNS4zLjAKLVJlbGVhc2U6CTElez9kaXN0fQotTGlj ZW5zZToJQVNMIDIuMAotR3JvdXA6CQlTeXN0ZW0gRW52aXJvbm1lbnQvRGFlbW9ucwotVVJMOgkJ aHR0cDovL3RyYWZmaWNzZXJ2ZXIuYXBhY2hlLm9yZy9pbmRleC5odG1sCi0KLVNvdXJjZTA6CWh0 dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0LyV7bmFtZX0vJXtuYW1lfS0le3ZlcnNpb259LnRhci5i ejIKLVNvdXJjZTE6CWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0LyV7bmFtZX0vJXtuYW1lfS0l e3ZlcnNpb259LnRhci5iejIuYXNjCi1Tb3VyY2UyOgl0cmFmZmljc2VydmVyLmtleXJpbmcKLVNv dXJjZTM6CXRyYWZmaWNzZXJ2ZXIuc3lzY29uZgotU291cmNlNDoJdHJhZmZpY3NlcnZlci5zZXJ2 aWNlCi1Tb3VyY2U1Ogl0cmFmZmljc2VydmVyLnRtcGZpbGVzZAotUGF0Y2gxOgkJdHJhZmZpY3Nl cnZlci1pbml0X3NjcmlwdHMucGF0Y2gKLVBhdGNoMjoJCXRyYWZmaWNzZXJ2ZXItcmVtb3ZlbHVh aml0LnBhdGNoCi0KLSMgQnVpbGRSb290IGlzIG9ubHkgbmVlZGVkIGZvciBFUEVMNToKLUJ1aWxk Um9vdDoJJShta3RlbXAgLXVkICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0le3JlbGVh c2V9LVhYWFhYWCkKLSMgZmFpbHMgb24gQVJNdjcgYXRtIChuZWVkcyBpbnZlc3RpZ2F0aW9uKSwg czM5MCB1bnN1cHBvcnRlZAotRXhjbHVkZUFyY2g6CSV7YXJtfSBzMzkwIHMzOTB4Ci0KLUJ1aWxk UmVxdWlyZXM6CWJvb3N0LWRldmVsCi1CdWlsZFJlcXVpcmVzOglleHBhdC1kZXZlbAotQnVpbGRS ZXF1aXJlczoJZ2NjLWMrKwotQnVpbGRSZXF1aXJlczoJZ251cGcKLUJ1aWxkUmVxdWlyZXM6CWh3 bG9jLWRldmVsCi1CdWlsZFJlcXVpcmVzOglvcGVuc3NsLWRldmVsCi1CdWlsZFJlcXVpcmVzOglw Y3JlLWRldmVsCi1CdWlsZFJlcXVpcmVzOglwZXJsLUV4dFV0aWxzLU1ha2VNYWtlcgotQnVpbGRS ZXF1aXJlczoJdGNsLWRldmVsCi1CdWlsZFJlcXVpcmVzOgl6bGliLWRldmVsCi1CdWlsZFJlcXVp cmVzOgl4ei1kZXZlbAotQnVpbGRSZXF1aXJlczoJYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbAot Ci1SZXF1aXJlczogaW5pdHNjcmlwdHMKLSVpZiAlez9mZWRvcmF9MCA+IDE0MCB8fCAlez9yaGVs fTAgPiA2MAotIyBGb3Igc3lzdGVtZC5tYWNyb3MKLUJ1aWxkUmVxdWlyZXM6IHN5c3RlbWQKLVJl cXVpcmVzOiBzeXN0ZW1kCislZ2xvYmFsIHdpdGhfc2VsaW51eCAxCislZ2xvYmFsIG1vZHVsZW5h bWUgdHJhZmZpY3NlcnZlcgorJWdsb2JhbCBzZWxpbnV4dHlwZSB0YXJnZXRlZAorCitOYW1lOiAg ICAgICAgICAgdHJhZmZpY3NlcnZlcgorVmVyc2lvbjogICAgICAgIDkuMS4yCitSZWxlYXNlOiAg ICAgICAgNyV7P2Rpc3R9CitTdW1tYXJ5OiAgICAgICAgRmFzdCwgc2NhbGFibGUgYW5kIGV4dGVu c2libGUgSFRUUC8xLjEgYW5kIEhUVFAvMiBjYWNoaW5nIHByb3h5IHNlcnZlcgorCitMaWNlbnNl OiAgICAgICAgQVNMIDIuMAorVVJMOiAgICAgICAgICAgIGh0dHBzOi8vdHJhZmZpY3NlcnZlci5h cGFjaGUub3JnLworU291cmNlMDogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0LyV7 bmFtZX0vJXtuYW1lfS0le3ZlcnNpb259LnRhci5iejIKK1NvdXJjZTE6ICAgICAgICBodHRwOi8v d3d3LmFwYWNoZS5vcmcvZGlzdC8le25hbWV9LyV7bmFtZX0tJXt2ZXJzaW9ufS50YXIuYnoyLmFz YworU291cmNlMjogICAgICAgIGh0dHBzOi8vZG93bmxvYWRzLmFwYWNoZS5vcmcvdHJhZmZpY3Nl cnZlci9LRVlTCisjIE1JTlNJR1NUS1NaIGlzIG5vIGxvbmdlciBjb25zdCBhcyBvZiBnbGliYyAy LjMzLCB3aGljaCBicmVha3MgdGhlIHVuaXQgdGVzdCBzb2Z0d2FyZQorIyBVcGRhdGUgdG8gdGhl IG5ld2VzdCB2ZXJzaW9uIG9mIHRoZSB1bml0IHRlc3QgZnJhbWV3b3JrCitTb3VyY2UzOiAgICAg ICAgaHR0cHM6Ly9naXRodWIuY29tL2NhdGNob3JnL0NhdGNoMi9yZWxlYXNlcy9kb3dubG9hZC92 Mi4xMy44L2NhdGNoLmhwcAorU291cmNlNDogICAgICAgICV7bmFtZX0uc2VydmljZQorU291cmNl NTogICAgICAgICV7bmFtZX0uc3lzdXNlcnMKK1NvdXJjZTY6ICAgICAgICAle25hbWV9LnN5c2Nv bmYKK1NvdXJjZTc6ICAgICAgICAle25hbWV9LnRtcGZpbGVzZAorU291cmNlODogICAgICAgICV7 bW9kdWxlbmFtZX0udGUKK1NvdXJjZTk6ICAgICAgICAle21vZHVsZW5hbWV9LmlmCitTb3VyY2Ux MDogICAgICAgJXttb2R1bGVuYW1lfS5mYworCisjIFRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgdGVz dCBmcmFtZXdvcmsgY2hhbmdlcyBzb21lIHN5bWJvbHMgbmVlZGVkIGZvciB0aGUgdGVzdHMKK1Bh dGNoMDogICAgICAgICB1bml0X3Rlc3RzLnBhdGNoCitQYXRjaDE6ICAgICAgICAgdHJhZmZpY3Nl cnZlci1jcnlwdG8tcG9saWN5LnBhdGNoCisjIGZjMzYgdXBncmFkZXMgdG8gZ2NjIDEyLCB3aGlj aCBubyBsb25nZXIgaGFzIGNzdHJpbmcgY29tcGF0YmlsaXR5IGluIHN0cmluZworIyBVcHN0ZWFt IFBSOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RyYWZmaWNzZXJ2ZXIvcHVsbC84Nzg2CitQ YXRjaDI6ICAgICAgICAgZ2NjMTItY3N0cmluZy5wYXRjaAorIyBGZW5jZXBvc3QgZXJyb3Igd2hl biBwYXJzaW5nIGJyYWNrZXRlZCBJUCBhZGRyZXNzIHdpdGggbm8gcG9ydDsgT09CIHN0cmluZ192 aWV3IGFjY2VzcworIyBVcHN0cmVhbSBQUjogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90cmFm Zmljc2VydmVyL3B1bGwvODQ2OCAKK1BhdGNoMzogICAgICAgICBzdHJpbmctaW5kZXgtb29iLnBh dGNoCisjIERlZmluZSBzdGFuZGFyZCBjb25maWcgbGF5b3V0IGZvciBGZWRvcmEvUkhFTCBzeXN0 ZW1zCisjIFVwc3RyZWFtIFBSOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RyYWZmaWNzZXJ2 ZXIvcHVsbC84ODE1CitQYXRjaDQ6ICAgICAgICAgY29uZmlnLWxheW91dC1yZWRoYXQucGF0Y2gK KworIyBVcHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IDMyLWJpdCBhcmNoaXRlY3R1cmVzOgorIyBo dHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RyYWZmaWNzZXJ2ZXIvaXNzdWVzLzQ0MzIKKyMgczM5 MHggaXMgYWxzbyBub3QgYSBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIGFuZCBkb2VzIG5vdCBidWls ZAorRXhjbHVkZUFyY2g6ICAgICV7YXJtfSAle2l4ODZ9IHMzOTB4CisKK0J1aWxkUmVxdWlyZXM6 ICBleHBhdC1kZXZlbCBod2xvYy1kZXZlbCBwY3JlLWRldmVsIHpsaWItZGV2ZWwgeHotZGV2ZWwK K0J1aWxkUmVxdWlyZXM6ICBsaWJjdXJsLWRldmVsIG5jdXJzZXMtZGV2ZWwgZ251cGcgcHl0aG9u MworQnVpbGRSZXF1aXJlczogIGdjYyBnY2MtYysrIHBlcmwtRXh0VXRpbHMtTWFrZU1ha2VyCitC dWlsZFJlcXVpcmVzOiAgbGliY2FwLWRldmVsCitCdWlsZFJlcXVpcmVzOiAgc3lzdGVtZC1ycG0t bWFjcm9zCisjIHRyYWZmaWNzZXJ2ZXIgZG9lcyBub3Qgd29yayBwcm9wZXJseSB3aXRoIE9wZW5T U0wgMy4wLjIgeWV0CisjIFVwc3RyZWFtIElzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hl L3RyYWZmaWNzZXJ2ZXIvaXNzdWVzLzczNDEKKyVpZiAwJXs/ZmVkb3JhfSA+PSAzNgorQnVpbGRS ZXF1aXJlczogIG9wZW5zc2wxLjEtZGV2ZWwKKyVlbHNlCitCdWlsZFJlcXVpcmVzOiAgb3BlbnNz bC1kZXZlbAorJWVuZGlmCisjIEdDQyA1IG9yIGhpZ2hlciBpcyByZXF1aXJlZCAoYysrMTcpCisl aWYgMCV7P3JoZWx9ICYmIDAlez9yaGVsfSA8PSA3CitCdWlsZFJlcXVpcmVzOiAgZGV2dG9vbHNl dC04CislZW5kaWYKKworUmVxdWlyZXM6ICAgICAgIGV4cGF0IGh3bG9jIHBjcmUgeHogbmN1cnNl cyBwa2djb25maWcKKyVpZiAwJXs/ZmVkb3JhfSA+PSAzNgorUmVxdWlyZXM6ICBvcGVuc3NsMS4x CislZWxzZQorUmVxdWlyZXM6ICBvcGVuc3NsCisjIFJlcXVpcmUgYW4gT3BlblNTTCB3aGljaCBz dXBwb3J0cyBQUk9GSUxFPVNZU1RFTQorQ29uZmxpY3RzOiAgICAgIG9wZW5zc2wtbGlicyA8IDE6 MS4wLjFoLTQKKyVlbmRpZgorCisjIENsZWFuIHN0YXJ0IGZvciBjdXJyZW50IEZlZG9yYS9SSEVM LCBzbyBzeXN0ZW1kIHVuaXRzIG9ubHkKK1JlcXVpcmVzOiAgICAgICBzeXN0ZW1kCiBSZXF1aXJl cyhwb3N0dW4pOiBzeXN0ZW1kCisKKyVpZiAwJXs/d2l0aF9zZWxpbnV4fQorJWlmIDAlez9mZWRv cmF9ID49IDM1IHx8IDAlez9yaGVsfSA+PSA4CisjIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSAqLXNl bGludXggcGFja2FnZSBhbmQgYWxsIGl04oCZcyBkZXBlbmRlbmNpZXMgYXJlIG5vdCBwdWxsZWQK KyMgaW50byBjb250YWluZXJzIGFuZCBvdGhlciBzeXN0ZW1zIHRoYXQgZG8gbm90IHVzZSBTRUxp bnV4CitSZXF1aXJlczogICAgICAgICgle25hbWV9LXNlbGludXggPSAle3ZlcnNpb259LSV7cmVs ZWFzZX0gaWYgc2VsaW51eC1wb2xpY3ktJXtzZWxpbnV4dHlwZX0pCiAlZWxzZQotUmVxdWlyZXMo cG9zdCk6IGNoa2NvbmZpZwotUmVxdWlyZXMocHJldW4pOiBjaGtjb25maWcgaW5pdHNjcmlwdHMK LVJlcXVpcmVzKHBvc3R1bik6IGluaXRzY3JpcHRzCitSZXF1aXJlczogICAgICAgICV7bmFtZX0t c2VsaW51eCA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorJWVuZGlmCiAlZW5kaWYKIAogJWRlc2Ny aXB0aW9uCi1BcGFjaGUgVHJhZmZpYyBTZXJ2ZXIgaXMgYSBmYXN0LCBzY2FsYWJsZSBhbmQgZXh0 ZW5zaWJsZSBIVFRQLzEuMSBjb21wbGlhbnQKLWNhY2hpbmcgcHJveHkgc2VydmVyLgorVHJhZmZp YyBTZXJ2ZXIgaXMgYSBoaWdoLXBlcmZvcm1hbmNlIGJ1aWxkaW5nIGJsb2NrIGZvciBjbG91ZCBz ZXJ2aWNlcy4KK0l0J3MgbW9yZSB0aGFuIGp1c3QgYSBjYWNoaW5nIHByb3h5IHNlcnZlcjsgaXQg YWxzbyBoYXMgc3VwcG9ydCBmb3IKK3BsdWdpbnMgdG8gYnVpbGQgbGFyZ2Ugc2NhbGUgd2ViIGFw cGxpY2F0aW9ucy4gIEtleSBmZWF0dXJlczoKKworQ2FjaGluZyAtIEltcHJvdmUgeW91ciByZXNw b25zZSB0aW1lLCB3aGlsZSByZWR1Y2luZyBzZXJ2ZXIgbG9hZCBhbmQKK2JhbmR3aWR0aCBuZWVk cyBieSBjYWNoaW5nIGFuZCByZXVzaW5nIGZyZXF1ZW50bHktcmVxdWVzdGVkIHdlYiBwYWdlcywK K2ltYWdlcywgYW5kIHdlYiBzZXJ2aWNlIGNhbGxzLgorCitQcm94eWluZyAtIEVhc2lseSBhZGQg a2VlcC1hbGl2ZSwgZmlsdGVyIG9yIGFub255bWl6ZSBjb250ZW50CityZXF1ZXN0cywgb3IgYWRk IGxvYWQgYmFsYW5jaW5nIGJ5IGFkZGluZyBhIHByb3h5IGxheWVyLgorCitGYXN0IC0gU2NhbGVz IHdlbGwgb24gbW9kZXJuIFNNUCBoYXJkd2FyZSwgaGFuZGxpbmcgMTBzIG9mIHRob3VzYW5kcwor b2YgcmVxdWVzdHMgcGVyIHNlY29uZC4KKworRXh0ZW5zaWJsZSAtIEFQSXMgdG8gd3JpdGUgeW91 ciBvd24gcGx1Zy1pbnMgdG8gZG8gYW55dGhpbmcgZnJvbQorbW9kaWZ5aW5nIEhUVFAgaGVhZGVy cyB0byBoYW5kbGluZyBFU0kgcmVxdWVzdHMgdG8gd3JpdGluZyB5b3VyIG93bgorY2FjaGUgYWxn b3JpdGhtLgorCitQcm92ZW4gLSBIYW5kbGluZyBvdmVyIDQwMFRCIGEgZGF5IGF0IFlhaG9vISBi b3RoIGFzIGZvcndhcmQgYW5kCityZXZlcnNlIHByb3hpZXMsIEFwYWNoZSBUcmFmZmljIFNlcnZl ciBpcyBiYXR0bGUgaGFyZGVuZWQuCisKKworJWlmIDAlez93aXRoX3NlbGludXh9CisjIFNFTGlu dXggc3VicGFja2FnZQorJXBhY2thZ2Ugc2VsaW51eAorU3VtbWFyeTogICAgICAgICAgICAgdHJh ZmZpY3NlcnZlciBTRUxpbnV4IHBvbGljeQorQnVpbGRBcmNoOiAgICAgICAgICAgbm9hcmNoCitS ZXF1aXJlczogICAgICAgICAgICBzZWxpbnV4LXBvbGljeS0le3NlbGludXh0eXBlfQorUmVxdWly ZXMocG9zdCk6ICAgICAgc2VsaW51eC1wb2xpY3ktJXtzZWxpbnV4dHlwZX0KK0J1aWxkUmVxdWly ZXM6ICAgICAgIHNlbGludXgtcG9saWN5LWRldmVsCislez9zZWxpbnV4X3JlcXVpcmVzfQorCisl ZGVzY3JpcHRpb24gc2VsaW51eAorVHJhZmZpY3NlcnZlciBTRUxpbnV4IHBvbGljeSBtb2R1bGUK KyVlbmRpZgorCiAKICVwYWNrYWdlIGRldmVsCi1TdW1tYXJ5OiBBcGFjaGUgVHJhZmZpYyBTZXJ2 ZXIgZGV2ZWxvcG1lbnQgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMKLUdyb3VwOiBEZXZlbG9w bWVudC9MaWJyYXJpZXMKLVJlcXVpcmVzOiB0cmFmZmljc2VydmVyID0gJXt2ZXJzaW9ufS0le3Jl bGVhc2V9CitTdW1tYXJ5OiBEZXZlbG9wbWVudCBmaWxlcyBmb3IgQXBhY2hlIFRyYWZmaWMgU2Vy dmVyIHBsdWdpbnMKK0J1aWxkQXJjaDogICAgICAgICAgIG5vYXJjaAorUmVxdWlyZXM6ICV7bmFt ZX0gPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KIAogJWRlc2NyaXB0aW9uIGRldmVsCi1UaGUgdHJh ZmZpY3NlcnZlci1kZXZlbCBwYWNrYWdlIGluY2x1ZGUgcGx1Zy1pbiBkZXZlbG9wbWVudCBsaWJy YXJpZXMgYW5kCi1oZWFkZXIgZmlsZXMsIGFuZCBBcGFjaGUgaHR0cGQgc3R5bGUgbW9kdWxlIGJ1 aWxkIHN5c3RlbS4KK1RoZSBoZWFkZXIgZmlsZXMgZm9yIGRldmVsb3BpbmcgcGx1Z2lucyBmb3Ig QXBhY2hlIFRyYWZmaWMgU2VydmVyCisKK0FwYWNoZSBUcmFmZmljIFNlcnZlciBwbHVnaW5zIGNh biBkbyBhbnl0aGluZyBmcm9tIG1vZGlmeWluZyBIVFRQIGhlYWRlcnMgdG8KK2hhZGxpbmcgRVNJ IHJlcXVlc3RzIHRvIHByb3ZpZGluZyBhIGRpZmZlcmVudCBjYWNoaW5nIGFsZ29yaXRobS4gCisK IAogJXBhY2thZ2UgcGVybAotU3VtbWFyeTogQXBhY2hlIFRyYWZmaWMgU2VydmVyIGJpbmRpbmdz IGZvciBwZXJsCi1Hcm91cDogRGV2ZWxvcG1lbnQvTGlicmFyaWVzCi1SZXF1aXJlczogdHJhZmZp Y3NlcnZlciA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorU3VtbWFyeTogUGVybCBiaW5kaW5ncyBm b3IgQXBhY2hlIFRyYWZmaWMgU2VydmVyIG1hbmFnZW1lbnQKK0J1aWxkQXJjaDogICAgICAgICAg IG5vYXJjaAorQnVpbGRSZXF1aXJlczogICAgICAgcGVybC1nZW5lcmF0b3JzCitSZXF1aXJlczog JXtuYW1lfSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorUmVxdWlyZXM6IHBlcmwoOk1PRFVMRV9D T01QQVRfJShldmFsICJgJXtfX3Blcmx9IC1WOnZlcnNpb25gIjsgZWNobyAkdmVyc2lvbikpCiAK ICVkZXNjcmlwdGlvbiBwZXJsCi1UaGUgdHJhZmZpY3NlcnZlci1wZXJsIHBhY2thZ2UgY29udGFp bnMgcGVybCBiaW5kaW5ncy4KK0EgY29sbGVjdGlvbiBvZiBQZXJsIGludGVyZmFjZXMgdG8gbWFu YWdlIEFwYWNoZSBUcmFmZmljIFNlcnZlcgoraW5zdGFsbGF0aW9ucy4KIAotJXByZXAKLSNncGd2 IC0taG9tZWRpciAvdG1wIC0ta2V5cmluZyAle1NPVVJDRTJ9IC0tc3RhdHVzLWZkPTEgJXtTT1VS Q0UxfSAle1NPVVJDRTB9IHwgZ3JlcCAtcSAnXlxbR05VUEc6XF0gR09PRFNJRycKIAotJXNldHVw IC1xCislcHJlcAorJXtncGd2ZXJpZnl9IC0ta2V5cmluZz0nJXtTT1VSQ0UyfScgLS1zaWduYXR1 cmU9JyV7U09VUkNFMX0nIC0tZGF0YT0nJXtTT1VSQ0UwfScKIAotJXBhdGNoMSAtcDEgLWIgLmlu aXQKLSMgTHVhaml0IGlzIGp1c3QgdXNlZCBmb3IgYW4gZXhwZXJpbWVudGFsIHBsdWdpbiwgd2hp Y2ggd2UgZG9uJ3QgYnVpbGQKLSVwYXRjaDIgLXAxIC1iIC5sdWFqaXQKLXJtIC1yZiBsaWIvbHVh aml0CislYXV0b3NldHVwIC1wMAorIyBSZXBsYWNlIHRoZSBDYXRjaDIgdGVzdGluZyBoZWFkZXIg d2l0aCB0aGUgbW9yZSByZWNlbnQgdmVyc2lvbiB1c2VkIHVwc3RyZWFtCitjcCAle1NPVVJDRTN9 IHRlc3RzL2luY2x1ZGUvCiAKICVidWlsZAotTk9DT05GSUdVUkU9MSBhdXRvcmVjb25mIC12aWYK LSVjb25maWd1cmUgXAotICAtLWVuYWJsZS1sYXlvdXQ9R2VudG9vIFwKLSAgLS1saWJkaXI9JXtf bGliZGlyfS90cmFmZmljc2VydmVyIFwKLSAgLS1saWJleGVjZGlyPSV7X2xpYmRpcn0vdHJhZmZp Y3NlcnZlci9wbHVnaW5zIFwKLSAgLS1zeXNjb25mZGlyPSV7X3N5c2NvbmZkaXJ9L3RyYWZmaWNz ZXJ2ZXIgXAotICAtLXdpdGgtdGNsPSV7X2xpYmRpcn0gXAotICAtLWRpc2FibGUtbHVhaml0IFwK LSAgLS13aXRoLXVzZXI9YXRzIC0td2l0aC1ncm91cD1hdHMgXAotICAtLWRpc2FibGUtc2lsZW50 LXJ1bGVzCiAKLW1ha2UgJXs/X3NtcF9tZmxhZ3N9IFY9MQorJWlmIDAlez9yaGVsfSAmJiAwJXs/ cmhlbH0gPD0gNworc291cmNlIC9vcHQvcmgvZGV2dG9vbHNldC04L2VuYWJsZQorJWVuZGlmCiAK LSVpbnN0YWxsCi1ybSAtcmYgJXtidWlsZHJvb3R9Ci1tYWtlIERFU1RESVI9JXtidWlsZHJvb3R9 IGluc3RhbGwKKyMgU3RyYW5nZSBsaWJleGVjZGlyIGlzIGJlY2F1c2UgdXBzdHJlYW0gcHV0cyBw bHVnaW5zIGluIGxpYmV4ZWMsIHdoaWNoIGlzbid0CisjIHJpZ2h0IHNpbmNlIHRoZXkgYXJlIGxp YnJhcmllcyBhbmQgbm90IGhlbHBlciBhcHBsaWNhdGlvbnMuCisjIFVwc3RyZWFtIElzc3VlOiBo dHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RyYWZmaWNzZXJ2ZXIvaXNzdWVzLzg4MjMKKyVjb25m aWd1cmUgXAorICAtLWVuYWJsZS1sYXlvdXQ9UmVkSGF0IFwKKyAgLS1zeXNjb25mZGlyPSV7X3N5 c2NvbmZkaXJ9LyV7bmFtZX0gXAorICAtLWxpYmRpcj0le19saWJkaXJ9LyV7bmFtZX0gXAorICAt LWxpYmV4ZWNkaXI9JXtfbGliZGlyfS8le25hbWV9L3BsdWdpbnMgXAorICAtLWVuYWJsZS1leHBl cmltZW50YWwtcGx1Z2lucyBcCisgIC0td2l0aC11c2VyPXRyYWZmaWNzZXJ2ZXIgLS13aXRoLWdy b3VwPXRyYWZmaWNzZXJ2ZXIKKyVtYWtlX2J1aWxkCisKKyVpZiAwJXs/d2l0aF9zZWxpbnV4fQor bWtkaXIgc2VsaW51eAorY3AgLXAgJXtTT1VSQ0U4fSBzZWxpbnV4LworY3AgLXAgJXtTT1VSQ0U5 fSBzZWxpbnV4LworY3AgLXAgJXtTT1VSQ0UxMH0gc2VsaW51eC8KKworbWFrZSAtZiAle19kYXRh ZGlyfS9zZWxpbnV4L2RldmVsL01ha2VmaWxlICV7bW9kdWxlbmFtZX0ucHAKK2J6aXAyIC05ICV7 bW9kdWxlbmFtZX0ucHAKKyVlbmRpZgogCi0jIFJlbW92ZSBkdXBsaWNhdGUgbWFuLXBhZ2VzOgot cm0gLXJmICV7YnVpbGRyb290fSV7X2RvY2Rpcn0vdHJhZmZpY3NlcnZlcgorJWluc3RhbGwKKyVt YWtlX2luc3RhbGwKIAotbWtkaXIgLXAgJXtidWlsZHJvb3R9JXtfc3lzY29uZmRpcn0vc3lzY29u ZmlnCi1pbnN0YWxsIC1tIDY0NCAtcCAle1NPVVJDRTN9IFwKLSAgICV7YnVpbGRyb290fSV7X3N5 c2NvbmZkaXJ9L3N5c2NvbmZpZy90cmFmZmljc2VydmVyCislY2hlY2sKIAotJWlmICV7P2ZlZG9y YX0wID4gMTQwIHx8ICV7P3JoZWx9MCA+IDYwCi1pbnN0YWxsIC1EIC1tIDA2NDQgLXAgJXtTT1VS Q0U0fSBcCi0gICAle2J1aWxkcm9vdH0vbGliL3N5c3RlbWQvc3lzdGVtL3RyYWZmaWNzZXJ2ZXIu c2VydmljZQotaW5zdGFsbCAtRCAtbSAwNjQ0IC1wICV7U09VUkNFNX0gXAotICAgJXtidWlsZHJv b3R9JXtfc3lzY29uZmRpcn0vdG1wZmlsZXMuZC90cmFmZmljc2VydmVyLmNvbmYKLSVlbHNlCi1t a2RpciAtcCAle2J1aWxkcm9vdH0vZXRjL2luaXQuZC8KLW12ICV7YnVpbGRyb290fS91c3IvYmlu L3RyYWZmaWNzZXJ2ZXIgJXtidWlsZHJvb3R9L2V0Yy9pbml0LmQKKyVpZiAwJXs/cmhlbH0gJiYg MCV7P3JoZWx9IDw9IDcKK3NvdXJjZSAvb3B0L3JoL2RldnRvb2xzZXQtOC9lbmFibGUKICVlbmRp ZgogCi0jIFJlbW92ZSBsaWJ0b29sIGFyY2hpdmVzIGFuZCBzdGF0aWMgbGlicwotZmluZCAle2J1 aWxkcm9vdH0gLXR5cGUgZiAtbmFtZSAiKi5sYSIgLWRlbGV0ZQotZmluZCAle2J1aWxkcm9vdH0g LXR5cGUgZiAtbmFtZSAiKi5hIiAtZGVsZXRlCittYWtlIGNoZWNrCiAKLXJtIC1mICV7YnVpbGRy b290fS8le19saWJkaXJ9L3Blcmw1L3Blcmxsb2NhbC5wb2QKLXJtIC1mICV7YnVpbGRyb290fS8l e19saWJkaXJ9L3Blcmw1L2F1dG8vQXBhY2hlL1RTLy5wYWNrbGlzdAorJWlmIDAlez93aXRoX3Nl bGludXh9CitpbnN0YWxsIC1EIC1tIDA2NDQgJXttb2R1bGVuYW1lfS5wcC5iejIgJXtidWlsZHJv b3R9JXtfZGF0YWRpcn0vc2VsaW51eC9wYWNrYWdlcy8le3NlbGludXh0eXBlfS8le21vZHVsZW5h bWV9LnBwLmJ6MgoraW5zdGFsbCAtRCAtcCAtbSAwNjQ0IHNlbGludXgvJXttb2R1bGVuYW1lfS5p ZiAle2J1aWxkcm9vdH0le19kYXRhZGlyfS9zZWxpbnV4L2RldmVsL2luY2x1ZGUvZGlzdHJpYnV0 ZWQvJXttb2R1bGVuYW1lfS5pZgorJWVuZGlmCiAKLSMKLXBlcmwgLXBpIC1lICdzL15DT05GSUcu KnByb3h5LmNvbmZpZy5wcm94eV9uYW1lIFNUUklORy4qJC9DT05GSUcgcHJveHkuY29uZmlnLnBy b3h5X25hbWUgU1RSSU5HIEZJWE1FLmV4YW1wbGUuY29tLycgXAotCSV7YnVpbGRyb290fS9ldGMv dHJhZmZpY3NlcnZlci9yZWNvcmRzLmNvbmZpZwotcGVybCAtcGkgLWUgJ3MvXkNPTkZJRy4qcHJv eHkuY29uZmlnLnNzbC5zZXJ2ZXIuY2VydC5wYXRoLiokL0NPTkZJRyBwcm94eS5jb25maWcuc3Ns LnNlcnZlci5jZXJ0LnBhdGggU1RSSU5HIFwvZXRjXC9wa2lcL3Rsc1wvY2VydHNcLy8nIFwKLQkl e2J1aWxkcm9vdH0vZXRjL3RyYWZmaWNzZXJ2ZXIvcmVjb3Jkcy5jb25maWcKLXBlcmwgLXBpIC1l ICdzL15DT05GSUcuKnByb3h5LmNvbmZpZy5zc2wuc2VydmVyLnByaXZhdGVfa2V5LnBhdGguKiQv Q09ORklHIHByb3h5LmNvbmZpZy5zc2wuc2VydmVyLnByaXZhdGVfa2V5LnBhdGggU1RSSU5HIFwv ZXRjXC9wa2lcL3Rsc1wvcHJpdmF0ZVwvLycgXAotCSV7YnVpbGRyb290fS9ldGMvdHJhZmZpY3Nl cnZlci9yZWNvcmRzLmNvbmZpZworIyBpbnN0YWxsIHN5c3RlbWQgdW5pdCwgZXRjLgoraW5zdGFs bCAtRCAtbSAwNjQ0IC1wICV7U09VUkNFNH0gJXtidWlsZHJvb3R9JXtfdW5pdGRpcn0vJXtuYW1l fS5zZXJ2aWNlCitpbnN0YWxsIC1EIC1tIDA2NDQgLXAgJXtTT1VSQ0U1fSAle2J1aWxkcm9vdH0l e19zeXN1c2Vyc2Rpcn0vJXtuYW1lfS5jb25mCitpbnN0YWxsIC1EIC1tIDA2NDQgLXAgJXtTT1VS Q0U2fSAle2J1aWxkcm9vdH0le19zeXNjb25mZGlyfS9zeXNjb25maWcvJXtuYW1lfQoraW5zdGFs bCAtRCAtbSAwNjQ0ICV7U09VUkNFN30gJXtidWlsZHJvb3R9JXtfdG1wZmlsZXNkaXJ9LyV7bmFt ZX0uY29uZgoraW5zdGFsbCAtZCAtbSAwNzU1ICV7YnVpbGRyb290fS9ydW4vJXtuYW1lfS8KIAot bWtkaXIgLXAgJXtidWlsZHJvb3R9L3Zhci9ydW4vdHJhZmZpY3NlcnZlcgorIyBEaXNjYXJkIHRo ZSBpbml0LmQgc2NyaXB0CitybSAtZiAle2J1aWxkcm9vdH0le19iaW5kaXJ9L3RyYWZmaWNzZXJ2 ZXIKIAotJWNoZWNrCi0laWZuYXJjaCBwcGM2NAotbWFrZSBjaGVjayAlez9fc21wX21mbGFnc30g Vj0xCi0lZW5kaWYKKyMgUmVtb3ZlIGxpYnRvb2wgYXJjaGl2ZXMgYW5kIHN0YXRpYyBsaWJzLCB0 ZXN0aW5nIHBsdWdpbnMKK2ZpbmQgJXtidWlsZHJvb3R9IC10eXBlIGYgLW5hbWUgIioubGEiIC1k ZWxldGUKK2ZpbmQgJXtidWlsZHJvb3R9IC10eXBlIGYgLW5hbWUgIiouYSIgLWRlbGV0ZQorcm0g LWYgJXtidWlsZHJvb3R9JXtfbGliZGlyfS8le25hbWV9L3BsdWdpbl8qLnNvCitybSAtZiAle2J1 aWxkcm9vdH0vdXNyL2xpYi9kZWJ1ZyV7X2xpYmRpcn0vJXtuYW1lfS9wbHVnaW5fKi5kZWJ1Zwog Ci0jIFRoZSBjbGVhbiBzZWN0aW9uICBpcyBvbmx5IG5lZWRlZCBmb3IgRVBFTCBhbmQgRmVkb3Jh IDwgMTMKLSMgaHR0cDovL2ZlZG9yYXByb2plY3Qub3JnL3dpa2kvUGFja2FnaW5nR3VpZGVsaW5l cyMuMjVjbGVhbgotJWNsZWFuCi1ybSAtcmYgJXtidWlsZHJvb3R9CisjIFJlZ2VuZXJhdGUgdGhl IEAjJEAhIGRlYnVnaW5mbyBtYW5pZmVzdHMgb24gZWw3CislaWYgMCV7P3JoZWx9ICYmIDAlez9y aGVsfSA8PSA3Cislez9fX2RlYnVnX3BhY2thZ2U6JXtfX2RlYnVnX2luc3RhbGxfcG9zdH19Cisl ZW5kaWYKIAorIyBXaHkgaXMgdGhlIFBlcmwgc3R1ZmYgZW5kaW5nIHVwIGluIHRoZSB3cm9uZyBw bGFjZSA/PworbWtkaXIgLXAgJXtidWlsZHJvb3R9JXtwZXJsX3ZlbmRvcmxpYn0KK212ICV7YnVp bGRyb290fS91c3IvbGliL3Blcmw1L0FwYWNoZSAle2J1aWxkcm9vdH0le3BlcmxfdmVuZG9ybGli fQorcm0gLXJmICV7YnVpbGRyb290fS91c3IvbGliL3Blcmw1CiAKLSVwb3N0Ci0vc2Jpbi9sZGNv bmZpZwotJWlmICV7P2ZlZG9yYX0wID4gMTcwIHx8ICV7P3JoZWx9MCA+IDYwCi0gICVzeXN0ZW1k X3Bvc3QgdHJhZmZpY3NlcnZlci5zZXJ2aWNlCi0lZWxzZQotICBpZiBbICQxIC1lcSAxIF0gOyB0 aGVuCi0gICVpZiAlez9mZWRvcmF9MCA+IDE0MAotICAgIC9iaW4vc3lzdGVtY3RsIGRhZW1vbi1y ZWxvYWQgPi9kZXYvbnVsbCAyPiYxIHx8IDoKLSAgJWVsc2UKLSAgICAvc2Jpbi9jaGtjb25maWcg LS1hZGQgJXtuYW1lfQotICAlZW5kaWYKLSAgZmkKLSVlbmRpZgoraW5zdGFsbCAtRCAtbSAwNjQ0 IC1wICV7YnVpbGRyb290fSV7X2xpYmRpcn0vJXtuYW1lfS9wa2djb25maWcvJXtuYW1lfS5wYyAl e2J1aWxkcm9vdH0le19saWJkaXJ9L3BrZ2NvbmZpZy8le25hbWV9LnBjCitybSAtcmYgJXtidWls ZHJvb3R9JXtfbGliZGlyfS8le25hbWV9L3BrZ2NvbmZpZwogCiAlcHJlCi1nZXRlbnQgZ3JvdXAg YXRzID4vZGV2L251bGwgfHwgZ3JvdXBhZGQgLXIgYXRzIC1nIDE3NiAmPi9kZXYvbnVsbAotZ2V0 ZW50IHBhc3N3ZCBhdHMgPi9kZXYvbnVsbCB8fCBcCi11c2VyYWRkIC1yIC11IDE3NiAtZyBhdHMg LWQgLyAtcyAvc2Jpbi9ub2xvZ2luIFwKLQktYyAiQXBhY2hlIFRyYWZmaWMgU2VydmVyIiBhdHMg Jj4vZGV2L251bGwKKyVzeXN1c2Vyc19jcmVhdGVfY29tcGF0ICV7U09VUkNFNX0KKworJXBvc3QK KyU/bGRjb25maWcKKyVzeXN0ZW1kX3Bvc3QgJXtuYW1lfS5zZXJ2aWNlCisldG1wZmlsZXNfY3Jl YXRlICV7X3RtcGZpbGVzZGlyfS8le25hbWV9LmNvbmYKIAogJXByZXVuCi0laWYgJXs/ZmVkb3Jh fTAgPiAxNzAgfHwgJXs/cmhlbH0wID4gNjAKLSAgJXN5c3RlbWRfcHJldW4gdHJhZmZpY3NlcnZl ci5zZXJ2aWNlCi0lZWxzZQotaWYgWyAkMSAtZXEgMCBdIDsgdGhlbgotICAvc2Jpbi9zZXJ2aWNl ICV7bmFtZX0gc3RvcCA+IC9kZXYvbnVsbCAyPiYxCi0gIC9zYmluL2Noa2NvbmZpZyAtLWRlbCAl e25hbWV9Ci1maQotJWVuZGlmCislc3lzdGVtZF9wcmV1biAle25hbWV9LnNlcnZpY2UKIAogJXBv c3R1bgotL3NiaW4vbGRjb25maWcKLQotJWlmICV7P2ZlZG9yYX0wID4gMTcwIHx8ICV7P3JoZWx9 MCA+IDYwCi0gICVzeXN0ZW1kX3Bvc3R1bl93aXRoX3Jlc3RhcnQgdHJhZmZpY3NlcnZlci5zZXJ2 aWNlCi0lZWxzZQotaWYgWyAkMSAtZXEgMSBdIDsgdGhlbgotICAvc2Jpbi9zZXJ2aWNlIHRyYWZm aWNzZXJ2ZXIgY29uZHJlc3RhcnQgJj4vZGV2L251bGwgfHwgOgorJT9sZGNvbmZpZworJXN5c3Rl bWRfcG9zdHVuX3dpdGhfcmVzdGFydCAle25hbWV9LnNlcnZpY2UKKworJWlmIDAlez93aXRoX3Nl bGludXh9CisjIFNFTGludXggY29udGV4dHMgYXJlIHNhdmVkIHNvIHRoYXQgb25seSBhZmZlY3Rl ZCBmaWxlcyBjYW4gYmUKKyMgcmVsYWJlbGVkIGFmdGVyIHRoZSBwb2xpY3kgbW9kdWxlIGluc3Rh bGxhdGlvbgorJXByZSBzZWxpbnV4Cislc2VsaW51eF9yZWxhYmVsX3ByZSAtcyAle3NlbGludXh0 eXBlfQorCislcG9zdCBzZWxpbnV4Cislc2VsaW51eF9tb2R1bGVzX2luc3RhbGwgLXMgJXtzZWxp bnV4dHlwZX0gJXtfZGF0YWRpcn0vc2VsaW51eC9wYWNrYWdlcy8le3NlbGludXh0eXBlfS8le21v ZHVsZW5hbWV9LnBwLmJ6MgorJXNlbGludXhfcmVsYWJlbF9wb3N0IC1zICV7c2VsaW51eHR5cGV9 CisKKyVwb3N0dW4gc2VsaW51eAoraWYgWyAkMSAtZXEgMCBdOyB0aGVuCisgICAgJXNlbGludXhf bW9kdWxlc191bmluc3RhbGwgLXMgJXtzZWxpbnV4dHlwZX0gJXttb2R1bGVuYW1lfQorICAgICVz ZWxpbnV4X3JlbGFiZWxfcG9zdCAtcyAle3NlbGludXh0eXBlfQogZmkKICVlbmRpZgogCiAlZmls ZXMKLSVkZWZhdHRyKC0sIGF0cywgYXRzLCAtKQotJXshP19saWNlbnNlZGlyOiVnbG9iYWwgbGlj ZW5zZSAlJWRvY30KICVsaWNlbnNlIExJQ0VOU0UKLSVkb2MgUkVBRE1FIENIQU5HRVMgTk9USUNF Ci0lYXR0cigwNzU1LCBhdHMsIGF0cykgJWRpciAvZXRjL3RyYWZmaWNzZXJ2ZXIKLSVjb25maWco bm9yZXBsYWNlKSAvZXRjL3RyYWZmaWNzZXJ2ZXIvKgotJWNvbmZpZyhub3JlcGxhY2UpICV7X3N5 c2NvbmZkaXJ9L3N5c2NvbmZpZy90cmFmZmljc2VydmVyCi0le19iaW5kaXJ9L3RyYWZmaWMqCisl ZG9jIFJFQURNRSBDSEFOR0VMT0cqIE5PVElDRSBTVEFUVVMKKworJWF0dHIoMDc1MCwgdHJhZmZp Y3NlcnZlciwgdHJhZmZpY3NlcnZlcikgJWRpciAle19zeXNjb25mZGlyfS8le25hbWV9CislYXR0 cigtLCB0cmFmZmljc2VydmVyLCB0cmFmZmljc2VydmVyKSAlY29uZmlnKG5vcmVwbGFjZSkgJXtf c3lzY29uZmRpcn0vJXtuYW1lfS9ib2R5X2ZhY3RvcnkKKyVhdHRyKC0sIHRyYWZmaWNzZXJ2ZXIs IHRyYWZmaWNzZXJ2ZXIpICVjb25maWcobm9yZXBsYWNlKSAle19zeXNjb25mZGlyfS8le25hbWV9 LyouY29uZmlnCislYXR0cigtLCB0cmFmZmljc2VydmVyLCB0cmFmZmljc2VydmVyKSAlY29uZmln KG5vcmVwbGFjZSkgJXtfc3lzY29uZmRpcn0vJXtuYW1lfS8qLnlhbWwKKyVhdHRyKC0sIHRyYWZm aWNzZXJ2ZXIsIHRyYWZmaWNzZXJ2ZXIpICV7X3N5c2NvbmZkaXJ9LyV7bmFtZX0vdHJhZmZpY3Nl cnZlci1yZWxlYXNlCisKKyVjb25maWcobm9yZXBsYWNlKSAle19zeXNjb25mZGlyfS9zeXNjb25m aWcvJXtuYW1lfQorCisle191bml0ZGlyfS8le25hbWV9LnNlcnZpY2UKKyV7X3N5c3VzZXJzZGly fS8le25hbWV9LmNvbmYKKyV7X3RtcGZpbGVzZGlyfS8le25hbWV9LmNvbmYKKworJXtfYmluZGly fS90cmFmZmljX2NhY2hlX3Rvb2wKKyV7X2JpbmRpcn0vdHJhZmZpY19jcmFzaGxvZworJXtfYmlu ZGlyfS90cmFmZmljX2N0bAorJXtfYmluZGlyfS90cmFmZmljX2xheW91dAorJXtfYmluZGlyfS90 cmFmZmljX2xvZ2NhdAorJXtfYmluZGlyfS90cmFmZmljX2xvZ3N0YXRzCisle19iaW5kaXJ9L3Ry YWZmaWNfbWFuYWdlcgorJXtfYmluZGlyfS90cmFmZmljX3NlcnZlcgorJXtfYmluZGlyfS90cmFm ZmljX3RvcAorJXtfYmluZGlyfS90cmFmZmljX3ZpYQogJXtfYmluZGlyfS90c3B1c2gKLSVkaXIg JXtfbGliZGlyfS90cmFmZmljc2VydmVyCi0lZGlyICV7X2xpYmRpcn0vdHJhZmZpY3NlcnZlci9w bHVnaW5zCi0le19saWJkaXJ9L3RyYWZmaWNzZXJ2ZXIvbGlidHMqLnNvLjUqCi0le19saWJkaXJ9 L3RyYWZmaWNzZXJ2ZXIvcGx1Z2lucy8qLnNvCi0laWYgJXs/ZmVkb3JhfTAgPiAxNDAgfHwgJXs/ cmhlbH0wID4gNjAKLS9saWIvc3lzdGVtZC9zeXN0ZW0vdHJhZmZpY3NlcnZlci5zZXJ2aWNlCi0l Y29uZmlnKG5vcmVwbGFjZSkgJXtfc3lzY29uZmRpcn0vdG1wZmlsZXMuZC90cmFmZmljc2VydmVy LmNvbmYKLSVlbHNlCi0vZXRjL2luaXQuZC90cmFmZmljc2VydmVyCisKKyVkaXIgJXtfbGliZGly fS8le25hbWV9CislZGlyICV7X2xpYmRpcn0vJXtuYW1lfS9wbHVnaW5zCisle19saWJkaXJ9LyV7 bmFtZX0vbGlidHMqLnNvKgorJXtfbGliZGlyfS8le25hbWV9L3BsdWdpbnMvKi5zbworCislYXR0 cigwNzUwLCB0cmFmZmljc2VydmVyLCB0cmFmZmljc2VydmVyKSAlZGlyIC92YXIvbG9nLyV7bmFt ZX0KKyVhdHRyKDA3NTAsIHRyYWZmaWNzZXJ2ZXIsIHRyYWZmaWNzZXJ2ZXIpICVkaXIgL3J1bi8l e25hbWV9CislYXR0cigwNzUwLCB0cmFmZmljc2VydmVyLCB0cmFmZmljc2VydmVyKSAlZGlyIC92 YXIvY2FjaGUvJXtuYW1lfQorCislaWYgMCV7P3dpdGhfc2VsaW51eH0KKyVmaWxlcyBzZWxpbnV4 Cisle19kYXRhZGlyfS9zZWxpbnV4L3BhY2thZ2VzLyV7c2VsaW51eHR5cGV9LyV7bW9kdWxlbmFt ZX0ucHAuKgorJXtfZGF0YWRpcn0vc2VsaW51eC9kZXZlbC9pbmNsdWRlL2Rpc3RyaWJ1dGVkLyV7 bW9kdWxlbmFtZX0uaWYKKyVnaG9zdCAldmVyaWZ5KG5vdCBtZDUgc2l6ZSBtb2RlIG10aW1lKSAl e19zaGFyZWRzdGF0ZWRpcn0vc2VsaW51eC8le3NlbGludXh0eXBlfS9hY3RpdmUvbW9kdWxlcy8y MDAvJXttb2R1bGVuYW1lfQogJWVuZGlmCi0lZGlyIC92YXIvbG9nL3RyYWZmaWNzZXJ2ZXIKLSVk aXIgL3Zhci9ydW4vdHJhZmZpY3NlcnZlcgotJWRpciAvdmFyL2NhY2hlL3RyYWZmaWNzZXJ2ZXIK IAogJWZpbGVzIHBlcmwKLSVkZWZhdHRyKC0scm9vdCxyb290LC0pCi0le19tYW5kaXJ9L21hbjMv KgotJXtfZGF0YWRpcn0vcGVybDUvQXBhY2hlL1RTLnBtLmluCi0le19kYXRhZGlyfS9wZXJsNS9B cGFjaGUvVFMucG0KLSV7X2RhdGFkaXJ9L3Blcmw1L0FwYWNoZS9UUy8qCisle19tYW5kaXJ9L21h bjMvQXBhY2hlOjpUUy4zcG0uZ3oKKyV7X21hbmRpcn0vbWFuMy9BcGFjaGU6OlRTOjpBZG1pbkNs aWVudC4zcG0uZ3oKKyV7X21hbmRpcn0vbWFuMy9BcGFjaGU6OlRTOjpDb25maWc6OlJlY29yZHMu M3BtLmd6CislZGlyICV7cGVybF92ZW5kb3JsaWJ9L0FwYWNoZQorJXtwZXJsX3ZlbmRvcmxpYn0v QXBhY2hlLyoKKwogCiAlZmlsZXMgZGV2ZWwKLSVkZWZhdHRyKC0scm9vdCxyb290LC0pCiAle19i aW5kaXJ9L3RzeHMKICV7X2luY2x1ZGVkaXJ9L3RzCi0le19saWJkaXJ9L3RyYWZmaWNzZXJ2ZXIv Ki5zbwotJXtfbGliZGlyfS90cmFmZmljc2VydmVyL3BrZ2NvbmZpZy90cmFmZmljc2VydmVyLnBj CislZGlyICV7X2luY2x1ZGVkaXJ9L3RzY3BwCisle19pbmNsdWRlZGlyfS90c2NwcC9hcGkKKyV7 X2luY2x1ZGVkaXJ9L3RzY3BwL3V0aWwvCisle19saWJkaXJ9L3BrZ2NvbmZpZy8le25hbWV9LnBj CisKIAogJWNoYW5nZWxvZworKiBUdWUgSnVuIDA3IDIwMjIgSmVyZWQgRmxveWQgPGplcmVkQHJl ZGhhdC5jb20+IDkuMS4yLTcKKy0gRXhjbHVkZSBzMzkweCBhcmNoaXRlY3R1cmUgLS0gbm90IHN1 cHBvcnRlZCB1cHN0cmVhbQorCisqIFRodSBNYXkgMTIgMjAyMiBKZXJlZCBGbG95ZCA8amVyZWRA cmVkaGF0LmNvbT4gOS4xLjItNgorLSBGdXJ0aGVyIGNoYW5nZXMgYmFzZWQgb24gcGFja2FnZSBy ZXZpZXc7IHBlcmwgZGVwZW5kZW5jaWVzLCBwYXRocworCisqIFRodSBNYXkgNSAyMDIyIEplcmVk IEZsb3lkIDxqZXJlZEByZWRoYXQuY29tPiA5LjEuMi01CistIENoYW5nZXMgYmFzZWQgb24gc3Bl YyByZXZpZXc7IGNoYW5nZSAiUmVkSGF0IiBjYXBpdGFsaXphdGlvbiwKKyAgYW5kIGFkZCBsaW5r IHRvIHVwc3RyZWFtIGZpbGUgbGF5b3V0IGRpc2N1c3Npb24KKworKiBNb24gTWF5IDIgMjAyMiBK ZXJlZCBGbG95ZCA8amVyZWRAcmVkaGF0LmNvbT4gOS4xLjItNAorLSBDaGFuZ2VzIGJhc2VkIG9u IHNwZWMgcmV2aWV3CisKKyogTW9uIEFwciAyNSAyMDIyIEplcmVkIEZsb3lkIDxqZXJlZEByZWRo YXQuY29tPiA5LjEuMi0zCistIEFsbG93IHNlbGY6cHJvY2VzcyBzZXRzY2hlZCwgcmVxdWVzdGVk IG9uIEVMOAorCisqIE1vbiBBcHIgMTggMjAyMiBKZXJlZCBGbG95ZCA8amVyZWRAcmVkaGF0LmNv bT4gOS4xLjItMgorLSBTZXQgU0VMaW51eCBwb2xpY3kgdG8gYmUgbW9yZSByZXN0cmljdGl2ZSBv biBwcml2aWxlZ2VkIFVEUCBwb3J0cworCisqIFRodSBBcHIgMDcgMjAyMiBKZXJlZCBGbG95ZCA8 amVyZWRAcmVkaGF0LmNvbT4gOS4xLjItMQorLSBJbml0aWFsIHJldmlzaW9uCistIEFkYXB0IHRv IG1vZGVybiBycG0gY29udmVudGlvbnMKKy0gQWRkIGRyYWZ0IFNFTGludXggcG9saWN5CistIERv bid0IHJ1biBhcyByb290LCBqdXN0IGNsYWltIENBUF9ORVRfQklORF9TRVJWSUNFIGZvcgorICBw cml2aWxlZ2VkIHBvcnRzCistIE1lcmdlIGFuZCBjbGVhbnVwIG9mIHVwc3RyZWFtIC5zcGVjIGZp bGUgYWxvbmcgd2l0aCBDb3ByIHZlcnNpb24KKyAgbWFpbnRhaW5lZCBieSBIaXJvYWtpIE5ha2Ft dXJhIDxobmFrYW11ckBnbWFpbC5jb20+LCBiYXNlZCBvbgorICBsb25nLW9waGFuZWQgcGFja2Fn ZS4gIENoYW5nZUxvZyBpbmNsdWRlZCBiZWxvdyBmb3IgcmVmZXJlbmNlLgorICAKKyogV2VkIE5v diAgMyAyMDIxIEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVyQGdtYWlsLmNvbT4gOS4xLjEtMQor LSBVcGRhdGUgdG8gOS4xLjEKKworKiBXZWQgU2VwICA4IDIwMjEgSGlyb2FraSBOYWthbXVyYSA8 aG5ha2FtdXJAZ21haWwuY29tPiA5LjEuMC0xCistIFVwZGF0ZSB0byA5LjEuMAorLSBEaXNhYmxl IG1pbWUtc2FuaXR5LWNoZWNrIHdoaWNoIGlzIHVzYWJsZSBvbmx5IGluIGRlYnVnIGJ1aWxkCisK KyogVHVlIEp1biAyOSAyMDIxIEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVyQGdtYWlsLmNvbT4g OS4wLjItMQorLSBVcGRhdGUgdG8gOS4wLjIKKy0gVXNlIHlhbWwtY3BwIHZlbmRvcmVkIGluIGxp Yi95YW1sY3BwCisKKyogVHVlIEp1biAyOSAyMDIxIEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVy QGdtYWlsLmNvbT4gOC4xLjItMQorLSBVcGRhdGUgdG8gOC4xLjIKKworKiBGcmkgU2VwIDEzIDIw MTkgSGlyb2FraSBOYWthbXVyYSA8aG5ha2FtdXJAZ21haWwuY29tPiA4LjAuNS0xCistIFVwZGF0 ZSB0byA4LjAuNSBMVFMgcmVsZWFzZQorCisqIEZyaSBTZXAgMTMgMjAxOSBIaXJvYWtpIE5ha2Ft dXJhIDxobmFrYW11ckBnbWFpbC5jb20+IDcuMS44LTEKKy0gVXBkYXRlIHRvIDcuMS44IExUUyBy ZWxlYXNlCisKKyogTW9uIEZlYiAyNSAyMDE5IEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVyQGdt YWlsLmNvbT4gNy4xLjYtMQorLSBVcGRhdGUgdG8gNy4xLjYgTFRTIHJlbGVhc2UKKy0gUmV0dXJu IHN0YWxlIGNhY2hlIHdpdGggcy1tYXhhZ2Ugb25seSBpZgorICBjYWNoZV9yZXF1aXJlZF9oZWFk ZXJzIGlzIDk5CisKKyogRnJpIEFwciAyMCAyMDE4IEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVy QGdtYWlsLmNvbT4gNy4xLjMtMQorLSBVcGRhdGUgdG8gNy4xLjMgTFRTIHJlbGVhc2UKKworKiBN b24gTWFyIDI2IDIwMTggSGlyb2FraSBOYWthbXVyYSA8aG5ha2FtdXJAZ21haWwuY29tPiA3LjEu Mi0xCistIFVwZGF0ZSB0byA3LjEuMiBMVFMgcmVsZWFzZQorCisqIFR1ZSBPY3QgMjQgMjAxNyBI aXJvYWtpIE5ha2FtdXJhIDxobmFrYW11ckBnbWFpbC5jb20+IDcuMS4xLTEKKy0gVXBkYXRlIHRv IDcuMS4xIExUUyByZWxlYXNlCisKKyogVGh1IEF1ZyAgMyAyMDE3IEhpcm9ha2kgTmFrYW11cmEg PGhuYWthbXVyQGdtYWlsLmNvbT4gNy4xLjAtMQorLSBVcGRhdGUgdG8gNy4xLjAgTFRTIHJlbGVh c2UKKworKiBXZWQgTm92IDE2IDIwMTYgSGlyb2FraSBOYWthbXVyYSA8aG5ha2FtdXJAZ21haWwu Y29tPiA3LjAuMC0yCistIFJlbW92ZSBleHBhdC1kZXZlbCBmcm9tIGJ1aWxkIGRlcGVuZGVuY2ll cworCisqIFdlZCBOb3YgMTYgMjAxNiBIaXJvYWtpIE5ha2FtdXJhIDxobmFrYW11ckBnbWFpbC5j b20+IDcuMC4wLTEKKy0gVXBkYXRlIHRvIDcuMC4wIExUUyByZWxlYXNlCisKKyogRnJpIFNlcCAz MCAyMDE2IEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVyQGdtYWlsLmNvbT4gNi4yLjAtMgorLSBS ZXR1cm4gc3RhbGUgY2FjaGUgZXZlbiBpZiB0aGUgb3JpZ2luIHNlcnZlciByZXNwb25zZSBoYXMK KyAgIkNhY2hlLUNvbnRyb2w6IHMtbWF4YWdlIiBoZWFkZXIuCisKKyogV2VkIEp1bCAyNyAyMDE2 IEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVyQGdtYWlsLmNvbT4gNi4yLjAtMQorLSBVcGRhdGUg dG8gNi4yLjAgTFRTIHJlbGVhc2UKKworKiBGcmkgTWF5IDIwIDIwMTYgSGlyb2FraSBOYWthbXVy YSA8aG5ha2FtdXJAZ21haWwuY29tPiA2LjEuMS0xMAorLSBBZGQgcGF0Y2ggdG8gYWRkIG5ldyB2 YWx1ZSB0byBwcm94eS5jb25maWcuaHR0cC5jYWNoZS5yZXF1aXJlZF9oZWFkZXJzCisgIHRvIHJl cXVpcmUgcy1tYXhhZ2UgZm9yIGNvbnRlbnRzIHRvIGJlIGNhY2hlZC4KKy0gUmVtb3ZlIHBhdGNo IHRvIGNvbmNhdGVuYXRlIG11bHRpcGxlIGhlYWRlciB2YWx1ZXMgb2YKKyAgdGhlIHNhbWUgbmFt ZSBpbiBUU0x1YS4KKworKiBXZWQgTWF5IDExIDIwMTYgSGlyb2FraSBOYWthbXVyYSA8aG5ha2Ft dXJAZ21haWwuY29tPiA2LjEuMS05CistIEZpeCBidWcgaW4gcGF0Y2ggdG8gY29uY2F0ZW5hdGUg bXVsdGlwbGUgaGVhZGVyIHZhbHVlcyBvZgorICB0aGUgc2FtZSBuYW1lIGluIFRTTHVhLgorCisq IFR1ZSBNYXkgMTAgMjAxNiBIaXJvYWtpIE5ha2FtdXJhIDxobmFrYW11ckBnbWFpbC5jb20+IDYu MS4xLTgKKy0gQ29uY2F0ZW5hdGUgbXVsdGlwbGUgaGVhZGVyIHZhbHVlcyBvZiB0aGUgc2FtZSBu YW1lIGluIFRTTHVhLgorCisqIFdlZCBBcHIgMjcgMjAxNiBIaXJvYWtpIE5ha2FtdXJhIDxobmFr YW11ckBnbWFpbC5jb20+IDYuMS4xLTcKKy0gUmVtb3ZlIHBhdGNoIHRvIGFkZCBwcm94eS5jb25m aWcuaHR0cC5jYWNoZS5pZ25vcmVfZXhwaXJlcyBhbmQKKyAgcHJveHkuY29uZmlnLmh0dHAuY2Fj aGUuaWdub3JlX3NlcnZlcl9jY19tYXhfYWdlLgorCisqIFR1ZSBBcHIgMjYgMjAxNiBIaXJvYWtp IE5ha2FtdXJhIDxobmFrYW11ckBnbWFpbC5jb20+IDYuMS4xLTYKKy0gQXBwbHkgcGF0Y2ggdG8g YWRkIHByb3h5LmNvbmZpZy5odHRwLmNhY2hlLmlnbm9yZV9leHBpcmVzIGFuZAorICBwcm94eS5j b25maWcuaHR0cC5jYWNoZS5pZ25vcmVfc2VydmVyX2NjX21heF9hZ2UuCisKKyogV2VkIE1hciAg OSAyMDE2IEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVyQGdtYWlsLmNvbT4gNi4xLjEtNQorLSBE aXNhYmxlIHBhdGNoIHRvIGVuYWJsZSB1bml4IGRvbWFpbiBzb2NrZXQuCisKKyogTW9uIE1hciAg NyAyMDE2IEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVyQGdtYWlsLmNvbT4gNi4xLjEtNAorLSBB cHBseSBwYXRjaCB0byBlbmFibGUgdW5peCBkb21haW4gc29ja2V0LgorCisqIFN1biBGZWIgMTQg MjAxNiBIaXJvYWtpIE5ha2FtdXJhIDxobmFrYW11ckBnbWFpbC5jb20+IDYuMS4xLTMKKy0gRW5h YmxlIGx1YWppdAorCisqIFN1biBGZWIgMTQgMjAxNiBIaXJvYWtpIE5ha2FtdXJhIDxobmFrYW11 ckBnbWFpbC5jb20+IDYuMS4xLTIKKy0gU2V0IHByZWZpeCB0byAvb3B0L3RyYWZmaWNzZXJ2ZXIg YW5kIHVzZSByZWxhdGl2ZSBkaXJlY3RvcmllcworCisqIFR1ZSBGZWIgIDkgMjAxNiBIaXJvYWtp IE5ha2FtdXJhIDxobmFrYW11ckBnbWFpbC5jb20+IDYuMS4xLTEKKy0gVXBkYXRlIHRvIDYuMS4x IExUUyByZWxlYXNlCisKKyogV2VkIEZlYiAgMyAyMDE2IEhpcm9ha2kgTmFrYW11cmEgPGhuYWth bXVyQGdtYWlsLmNvbT4gNi4xLjAtMQorLSBVcGRhdGUgdG8gNi4xLjAgTFRTIHJlbGVhc2UKKwor KiBXZWQgSmFuIDEzIDIwMTYgSGlyb2FraSBOYWthbXVyYSA8aG5ha2FtdXJAZ21haWwuY29tPiA2 LjAuMC0zCistIEJ1aWxkIGV4cGVyaW1lbnRhbCBwbHVnaW5zCisKKyogRnJpIEphbiAgMSAyMDE2 IEhpcm9ha2kgTmFrYW11cmEgPGhuYWthbXVyQGdtYWlsLmNvbT4gNi4wLjAtMgorLSBKdXN0IHVz ZSBjb25maWd1cmUgLS1kaXNhYmxlLWx1YWppdCB3aXRob3V0IGEgcGF0Y2ggb3IgZGVsZXRpbmcg ZmlsZXMKKworKiBGcmkgSmFuICAxIDIwMTYgSGlyb2FraSBOYWthbXVyYSA8aG5ha2FtdXJAZ21h aWwuY29tPiA2LjAuMC0xCistIFVwZGF0ZSB0byA2LjAuMCBMVFMgcmVsZWFzZQorCisqIEZyaSBK YW4gIDEgMjAxNiBIaXJvYWtpIE5ha2FtdXJhIDxobmFrYW11ckBnbWFpbC5jb20+IDUuMy4wLTIK Ky0gQWRkIHBhdGNoIHRvIGNhY2hlX2luc2VwZWN0b3IgdG8gc3BsaXQgbXVsdGlsaW5lIFVSTHMg Y29ycmVjdGx5CisKICogU3VuIEp1biAyMSAyMDE1IFBldGVyIFJvYmluc29uIDxwYnJvYmluc29u QGZlZG9yYXByb2plY3Qub3JnPiA1LjMuMC0xCiAtIFVwZGF0ZSB0byA1LjMuMCBMVFMgcmVsZWFz ZQogLSBCdWlsZCBvbiBhYXJjaDY0IGFuZCBwb3dlcjY0CkBAIC0zMTUsMjQgKzU0MCwyNCBAQCBm aQogCiAgICAgVGhlIGZvbGxvd2luZyByZWNvcmRzLmNvbmZpZyBwYXJhbWV0ZXJzIHNob3VsZCBi ZSByZW1vdmVkOgogCi0JQ09ORklHIHByb3h5LmNvbmZpZy5iYW5kd2lkdGhfbWdtdC5maWxlbmFt ZSBTVFJJTkcgIiIKLQlDT05GSUcgcHJveHkuY29uZmlnLmFkbWluLmF1dG9jb25mLndwYWRfZmls ZW5hbWUgU1RSSU5HICIiCi0JQ09ORklHIHByb3h5LmNvbmZpZy51c2VybmFtZS5jYWNoZS5lbmFi bGVkIElOVCAwCi0JQ09ORklHIHByb3h5LmNvbmZpZy51c2VybmFtZS5jYWNoZS5maWxlbmFtZSBT VFJJTkcgIiIKLQlDT05GSUcgcHJveHkuY29uZmlnLnVzZXJuYW1lLmNhY2hlLnNpemUgSU5UIDAK LQlDT05GSUcgcHJveHkuY29uZmlnLnVzZXJuYW1lLmNhY2hlLnN0b3JhZ2VfcGF0aCBTVFJJTkcg IiIKLQlDT05GSUcgcHJveHkuY29uZmlnLnVzZXJuYW1lLmNhY2hlLnN0b3JhZ2Vfc2l6ZSBJTlQg MAotCUNPTkZJRyBwcm94eS5jb25maWcuaHR0cC53dXRzX2VuYWJsZWQgSU5UIDAKLQlDT05GSUcg cHJveHkuY29uZmlnLmh0dHAubG9nX3NwaWRlcl9jb2RlcyBJTlQgMAotCUNPTkZJRyBwcm94eS5j b25maWcuaHR0cC5hY2NlcHRfZW5jb2RpbmdfZmlsdGVyX2VuYWJsZWQgSU5UIDAKLQlDT05GSUcg cHJveHkuY29uZmlnLmh0dHAuYWNjZXB0X2VuY29kaW5nX2ZpbHRlci5maWxlbmFtZSBTVFJJTkcg IiIKLQlDT05GSUcgcHJveHkuY29uZmlnLm5ldC50aHJvdHRsZV9lbmFibGVkIElOVCAwCi0JQ09O RklHIHByb3h5LmNvbmZpZy5uZXQuYWNjZXB0X3Rocm90dGxlIElOVCAwCi0JQ09ORklHIHByb3h5 LmNvbmZpZy5jbHVzdGVyLm51bV9vZl9jbHVzdGVyX2Nvbm5lY3Rpb25zIElOVCAwCi0JQ09ORklH IHByb3h5LmNvbmZpZy5jYWNoZS51cmxfaGFzaF9tZXRob2QgSU5UIDAKLQlDT05GSUcgcHJveHku Y29uZmlnLnBsdWdpbi5leHRlbnNpb25zX2RpciBTVFJJTkcgIiIKLQlDT05GSUcgcHJveHkubG9j YWwuaHR0cC5wYXJlbnRfcHJveHkuZGlzYWJsZV9jb25uZWN0X3R1bm5lbGluZyBJTlQgMAotCUNP TkZJRyBwcm94eS5jb25maWcucmVtYXAudXNlX3JlbWFwX3Byb2Nlc3NvciBJTlQgMAorICAgICAg ICBDT05GSUcgcHJveHkuY29uZmlnLmJhbmR3aWR0aF9tZ210LmZpbGVuYW1lIFNUUklORyAiIgor ICAgICAgICBDT05GSUcgcHJveHkuY29uZmlnLmFkbWluLmF1dG9jb25mLndwYWRfZmlsZW5hbWUg U1RSSU5HICIiCisgICAgICAgIENPTkZJRyBwcm94eS5jb25maWcudXNlcm5hbWUuY2FjaGUuZW5h YmxlZCBJTlQgMAorICAgICAgICBDT05GSUcgcHJveHkuY29uZmlnLnVzZXJuYW1lLmNhY2hlLmZp bGVuYW1lIFNUUklORyAiIgorICAgICAgICBDT05GSUcgcHJveHkuY29uZmlnLnVzZXJuYW1lLmNh Y2hlLnNpemUgSU5UIDAKKyAgICAgICAgQ09ORklHIHByb3h5LmNvbmZpZy51c2VybmFtZS5jYWNo ZS5zdG9yYWdlX3BhdGggU1RSSU5HICIiCisgICAgICAgIENPTkZJRyBwcm94eS5jb25maWcudXNl cm5hbWUuY2FjaGUuc3RvcmFnZV9zaXplIElOVCAwCisgICAgICAgIENPTkZJRyBwcm94eS5jb25m aWcuaHR0cC53dXRzX2VuYWJsZWQgSU5UIDAKKyAgICAgICAgQ09ORklHIHByb3h5LmNvbmZpZy5o dHRwLmxvZ19zcGlkZXJfY29kZXMgSU5UIDAKKyAgICAgICAgQ09ORklHIHByb3h5LmNvbmZpZy5o dHRwLmFjY2VwdF9lbmNvZGluZ19maWx0ZXJfZW5hYmxlZCBJTlQgMAorICAgICAgICBDT05GSUcg cHJveHkuY29uZmlnLmh0dHAuYWNjZXB0X2VuY29kaW5nX2ZpbHRlci5maWxlbmFtZSBTVFJJTkcg IiIKKyAgICAgICAgQ09ORklHIHByb3h5LmNvbmZpZy5uZXQudGhyb3R0bGVfZW5hYmxlZCBJTlQg MAorICAgICAgICBDT05GSUcgcHJveHkuY29uZmlnLm5ldC5hY2NlcHRfdGhyb3R0bGUgSU5UIDAK KyAgICAgICAgQ09ORklHIHByb3h5LmNvbmZpZy5jbHVzdGVyLm51bV9vZl9jbHVzdGVyX2Nvbm5l Y3Rpb25zIElOVCAwCisgICAgICAgIENPTkZJRyBwcm94eS5jb25maWcuY2FjaGUudXJsX2hhc2hf bWV0aG9kIElOVCAwCisgICAgICAgIENPTkZJRyBwcm94eS5jb25maWcucGx1Z2luLmV4dGVuc2lv bnNfZGlyIFNUUklORyAiIgorICAgICAgICBDT05GSUcgcHJveHkubG9jYWwuaHR0cC5wYXJlbnRf cHJveHkuZGlzYWJsZV9jb25uZWN0X3R1bm5lbGluZyBJTlQgMAorICAgICAgICBDT05GSUcgcHJv eHkuY29uZmlnLnJlbWFwLnVzZV9yZW1hcF9wcm9jZXNzb3IgSU5UIDAKIAogKiBTdW4gQXVnIDI1 IDIwMTMgSmFuLUZyb2RlIE15a2xlYnVzdCA8amFuZnJvZGVAdGFuc28ubmV0PiAtIDMuMi41LTMK IC0gYnojOTk0MjI0IFVzZSBycG0gY29uZmlndXJlIG1hY3JvLCBpbnN0ZWFkIG9mIGNhbGxpbmcg Y29uZmlndXJlCkBAIC00OTAsMyArNzE1LDUgQEAgZmkKICogVGh1IE5vdiAxOCAyMDEwIDx5b25n aGFvQHRhb2Jhby5jb20+IC0gMi4xLjQKIC0gaW5pdGlhbCByZWxlYXNlIGZvciBwdWJsaWMKIC0g b3JpZ2luYWwgc3BlYyBmaWxlIGlzIGZyb20gbmVvbWFub250aGV3YXlAZ21haWwuY29tCisKKwoK ZGlmZiAtLWdpdCBhL3RyYWZmaWNzZXJ2ZXIuc3lzY29uZiBiL3RyYWZmaWNzZXJ2ZXIuc3lzY29u ZgppbmRleCBmZmY4ZjFmLi44MDQ3Njc2IDEwMDY0NAotLS0gYS90cmFmZmljc2VydmVyLnN5c2Nv bmYKKysrIGIvdHJhZmZpY3NlcnZlci5zeXNjb25mCkBAIC0xLDUgKzEsMyBAQAotIyBDb25maWcg ZmlsZSBmb3IgL2V0Yy9pbml0LmQvdHJhZmZpY3NlcnZlcgotIwogIyBUcmFmZmljIENvcCBhcmdz OgogIyBkZWZhdWx0IGlzIGVtcHR5IAogI1RDX0RBRU1PTl9BUkdTPScnCgpkaWZmIC0tZ2l0IGEv dHJhZmZpY3NlcnZlci5zeXN1c2VycyBiL3RyYWZmaWNzZXJ2ZXIuc3lzdXNlcnMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4OGEyOAotLS0gL2Rldi9udWxsCisrKyBiL3Ry YWZmaWNzZXJ2ZXIuc3lzdXNlcnMKQEAgLTAsMCArMSwyIEBACisjT2xkIHNwZWMgZmlsZSBoYXJk Y29kZWQgdWlkL2dpZCAxNzYgLS0gdmVyaWZ5IHRoaXMgd29ya3MKK3UgICAgIHRyYWZmaWNzZXJ2 ZXIgIC0gICAiQXBhY2hlIFRyYWZmaWMgU2VydmVyIiAgL3J1bi90cmFmZmljc2VydmVyICAgICAg L3NiaW4vbm9sb2dpbgoKZGlmZiAtLWdpdCBhL3RyYWZmaWNzZXJ2ZXIudGUgYi90cmFmZmljc2Vy dmVyLnRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTE2ZjIKLS0tIC9k ZXYvbnVsbAorKysgYi90cmFmZmljc2VydmVyLnRlCkBAIC0wLDAgKzEsMTIwIEBACitwb2xpY3lf bW9kdWxlKHRyYWZmaWNzZXJ2ZXIsIDEuMC4wKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCisjCisjIERlY2xhcmF0aW9ucworIworCisjIyA8ZGVzYz4KKyMjIDxw PgorIyMgQWxsb3cgdHJhZmZpY3NlcnZlciB0byBiaW5kIHRvIGFsbCBwb3J0cworIyMgPC9wPgor IyMgPC9kZXNjPgorZ2VuX3R1bmFibGUodHJhZmZpY3NlcnZlcl9jYW5fYmluZF9hbGwsIGZhbHNl KQorCisjIyA8ZGVzYz4KKyMjIDxwPgorIyMgQWxsb3cgdHJhZmZpY3NlcnZlciB0byBjb25uZWN0 IHRvIGFsbCBwb3J0cworIyMgPC9wPgorIyMgPC9kZXNjPgorZ2VuX3R1bmFibGUodHJhZmZpY3Nl cnZlcl9jYW5fY29ubmVjdF9hbGwsIGZhbHNlKQorCisjIERlZmluZSBvdXIgdHlwZXMgJiBhdHRh Y2ggZmlsZSBhdHRyaWJ1dGVzCit0eXBlIHRyYWZmaWNzZXJ2ZXJfdDsKK3R5cGUgdHJhZmZpY3Nl cnZlcl9leGVjX3Q7Citpbml0X2RhZW1vbl9kb21haW4odHJhZmZpY3NlcnZlcl90LCB0cmFmZmlj c2VydmVyX2V4ZWNfdCkKKwordHlwZSB0cmFmZmljc2VydmVyX2NhY2hlX3Q7CitmaWxlc190eXBl KHRyYWZmaWNzZXJ2ZXJfY2FjaGVfdCkKKwordHlwZSB0cmFmZmljc2VydmVyX2V0Y190OworZmls ZXNfY29uZmlnX2ZpbGUodHJhZmZpY3NlcnZlcl9ldGNfdCkKKwordHlwZSB0cmFmZmljc2VydmVy X2xvZ190OworbG9nZ2luZ19sb2dfZmlsZSh0cmFmZmljc2VydmVyX2xvZ190KQorCit0eXBlIHRy YWZmaWNzZXJ2ZXJfcnVuX3Q7CitmaWxlc190eXBlKHRyYWZmaWNzZXJ2ZXJfcnVuX3QpCisKK3R5 cGUgdHJhZmZpY3NlcnZlcl91bml0X2ZpbGVfdDsKK3N5c3RlbWRfdW5pdF9maWxlKHRyYWZmaWNz ZXJ2ZXJfdW5pdF9maWxlX3QpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKKyMKKyMgdHJhZmZpY3NlcnZlciBsb2NhbCBwb2xpY3kKKyMKKworIyBXZSBydW4gYXMg dGhlIHRyYWZmaWNzZXJ2ZXIgdXNlciBhbmQgdXNlIGNhcGFiaWxpdGllcyB0byBiaW5kIHByaXZp bGVnZWQgcG9ydHMsCisjIHNvIHRoaXMgcGVybWlzc2lvbiBpcyBub3QgcmVxdWlyZWQgYW5kIHNo b3VsZCBub3QgYmUgZ3JhbnRlZCEKKyMgYWxsb3cgdHJhZmZpY3NlcnZlcl90IHNlbGY6Y2FwYWJp bGl0eSB7IHNldGdpZCBzZXR1aWQgfTsKKworYWxsb3cgdHJhZmZpY3NlcnZlcl90IHNlbGY6cHJv Y2VzcyB7IGV4ZWNtZW0gZm9yayBzZXRjYXAgc2V0cmxpbWl0IHNpZ25hbF9wZXJtcyBzZXRzY2hl ZCB9OworYWxsb3cgdHJhZmZpY3NlcnZlcl90IHNlbGY6Zmlmb19maWxlIHJ3X2ZpZm9fZmlsZV9w ZXJtczsKK2FsbG93IHRyYWZmaWNzZXJ2ZXJfdCBzZWxmOnRjcF9zb2NrZXQgY3JlYXRlX3N0cmVh bV9zb2NrZXRfcGVybXM7CithbGxvdyB0cmFmZmljc2VydmVyX3Qgc2VsZjp1bml4X3N0cmVhbV9z b2NrZXQgeyBjcmVhdGVfc3RyZWFtX3NvY2tldF9wZXJtcyBjb25uZWN0dG8gfTsKKworYWxsb3cg dHJhZmZpY3NlcnZlcl90IHRyYWZmaWNzZXJ2ZXJfZXhlY190OmZpbGUgZXhlY3V0ZV9ub190cmFu czsKKworIyBldGMgZmlsZXMgYXJlIHJlYWQtb25seSB0byB0cmFmZmljc2VydmVyCitsaXN0X2Rp cnNfcGF0dGVybih0cmFmZmljc2VydmVyX3QsIHRyYWZmaWNzZXJ2ZXJfZXRjX3QsIHRyYWZmaWNz ZXJ2ZXJfZXRjX3QpCityZWFkX2ZpbGVzX3BhdHRlcm4odHJhZmZpY3NlcnZlcl90LCB0cmFmZmlj c2VydmVyX2V0Y190LCB0cmFmZmljc2VydmVyX2V0Y190KQorcmVhZF9sbmtfZmlsZXNfcGF0dGVy bih0cmFmZmljc2VydmVyX3QsIHRyYWZmaWNzZXJ2ZXJfZXRjX3QsIHRyYWZmaWNzZXJ2ZXJfZXRj X3QpCisKKyMgdHJhZmZpY3NlcnZlciBoYXMgZnJlZSByZWluIG92ZXIgY2FjaGUKK21hbmFnZV9k aXJzX3BhdHRlcm4odHJhZmZpY3NlcnZlcl90LCB0cmFmZmljc2VydmVyX2NhY2hlX3QsIHRyYWZm aWNzZXJ2ZXJfY2FjaGVfdCkKK21hbmFnZV9maWxlc19wYXR0ZXJuKHRyYWZmaWNzZXJ2ZXJfdCwg dHJhZmZpY3NlcnZlcl9jYWNoZV90LCB0cmFmZmljc2VydmVyX2NhY2hlX3QpCisKKyMgdHJhZmZp Y3NlcnZlciBkb2VzIGl0cyBvd24gbG9nIG1hbmFnZW1lbnQsIHJvdGF0aW9uLCBldGMKK21hbmFn ZV9kaXJzX3BhdHRlcm4odHJhZmZpY3NlcnZlcl90LCB0cmFmZmljc2VydmVyX2xvZ190LCB0cmFm Zmljc2VydmVyX2xvZ190KQorbWFuYWdlX2ZpbGVzX3BhdHRlcm4odHJhZmZpY3NlcnZlcl90LCB0 cmFmZmljc2VydmVyX2xvZ190LCB0cmFmZmljc2VydmVyX2xvZ190KQorbWFuYWdlX2xua19maWxl c19wYXR0ZXJuKHRyYWZmaWNzZXJ2ZXJfdCwgdHJhZmZpY3NlcnZlcl9sb2dfdCwgdHJhZmZpY3Nl cnZlcl9sb2dfdCkKK2xvZ2dpbmdfbG9nX2ZpbGV0cmFucyh0cmFmZmljc2VydmVyX3QsIHRyYWZm aWNzZXJ2ZXJfbG9nX3QsIHsgZGlyIGZpbGUgbG5rX2ZpbGUgfSkKKworIyBydW4gLSBjb21tdW5p Y2F0aW9ucyBzb2NrZXRzIGFuZCBsb2NrZmlsZXMsIHJ1bnRpbWUgY29waWVzIG9mIHBsdWdpbnMK K21hbmFnZV9kaXJzX3BhdHRlcm4odHJhZmZpY3NlcnZlcl90LCB0cmFmZmljc2VydmVyX3J1bl90 LCB0cmFmZmljc2VydmVyX3J1bl90KQorbW1hcF9leGVjX2ZpbGVzX3BhdHRlcm4odHJhZmZpY3Nl cnZlcl90LCB0cmFmZmljc2VydmVyX3J1bl90LCB0cmFmZmljc2VydmVyX3J1bl90KQorbWFuYWdl X2ZpbGVzX3BhdHRlcm4odHJhZmZpY3NlcnZlcl90LCB0cmFmZmljc2VydmVyX3J1bl90LCB0cmFm Zmljc2VydmVyX3J1bl90KQorbWFuYWdlX3NvY2tfZmlsZXNfcGF0dGVybih0cmFmZmljc2VydmVy X3QsIHRyYWZmaWNzZXJ2ZXJfcnVuX3QsIHRyYWZmaWNzZXJ2ZXJfcnVuX3QpCisKKyMgaHdsb2Mg cmVhZHMgYSBidW5jaCBvZiBzeXN0ZW0gZmlsZXMKK2Rldl9saXN0X3N5c2ZzKHRyYWZmaWNzZXJ2 ZXJfdCkKK2Rldl9yZWFkX3N5c2ZzKHRyYWZmaWNzZXJ2ZXJfdCkKKworZnNfZ2V0YXR0cl94YXR0 cl9mcyh0cmFmZmljc2VydmVyX3QpCitmc19yZWFkX2Nncm91cF9maWxlcyh0cmFmZmljc2VydmVy X3QpCitmc19zZWFyY2hfY2dyb3VwX2RpcnModHJhZmZpY3NlcnZlcl90KQorCitrZXJuZWxfcmVh ZF9mc19zeXNjdGxzKHRyYWZmaWNzZXJ2ZXJfdCkKK2tlcm5lbF9yZWFkX25ldF9zeXNjdGxzKHRy YWZmaWNzZXJ2ZXJfdCkKK2tlcm5lbF9zZWFyY2hfbmV0d29ya19zeXNjdGwodHJhZmZpY3NlcnZl cl90KQora2VybmVsX3JlYWRfc3lzdGVtX3N0YXRlKHRyYWZmaWNzZXJ2ZXJfdCkKKworbG9nZ2lu Z19zZW5kX3N5c2xvZ19tc2codHJhZmZpY3NlcnZlcl90KQorCittaXNjZmlsZXNfcmVhZF9nZW5l cmljX2NlcnRzKHRyYWZmaWNzZXJ2ZXJfdCkKKworc3lzbmV0X2Ruc19uYW1lX3Jlc29sdmUodHJh ZmZpY3NlcnZlcl90KQorCisjIEJ5IGRlZmF1bHQgd2UgY2FuIG9ubHkgY29ubmVjdCB0byB0aGUg c3RhbmRhcmQgaHR0cCBhbmQgaHR0cF9jYWNoZSBwb3J0cworIyBVRFAgaXMgdXNlZCBmb3IgUVVJ QworY29yZW5ldF90Y3BfYmluZF9nZW5lcmljX25vZGUodHJhZmZpY3NlcnZlcl90KQorY29yZW5l dF91ZHBfYmluZF9nZW5lcmljX25vZGUodHJhZmZpY3NlcnZlcl90KQorY29yZW5ldF90Y3BfYmlu ZF9odHRwX3BvcnQodHJhZmZpY3NlcnZlcl90KQorY29yZW5ldF91ZHBfYmluZF9odHRwX3BvcnQo dHJhZmZpY3NlcnZlcl90KQorY29yZW5ldF90Y3BfYmluZF9odHRwX2NhY2hlX3BvcnQodHJhZmZp Y3NlcnZlcl90KQorY29yZW5ldF91ZHBfYmluZF9odHRwX2NhY2hlX3BvcnQodHJhZmZpY3NlcnZl cl90KQorY29yZW5ldF90Y3BfY29ubmVjdF9odHRwX3BvcnQodHJhZmZpY3NlcnZlcl90KQorY29y ZW5ldF90Y3BfY29ubmVjdF9odHRwX2NhY2hlX3BvcnQodHJhZmZpY3NlcnZlcl90KQorCisjIElu dGVybmFsIEROUyByZXNvbHZlciBiaW5kcyBhIHJhbmRvbSBwb3J0Citjb3JlbmV0X3VkcF9iaW5k X2FsbF91bnJlc2VydmVkX3BvcnRzKHRyYWZmaWNzZXJ2ZXJfdCkKKwordHVuYWJsZV9wb2xpY3ko YHRyYWZmaWNzZXJ2ZXJfY2FuX2JpbmRfYWxsJyxgCisJY29yZW5ldF90Y3BfYmluZF9hbGxfcG9y dHModHJhZmZpY3NlcnZlcl90KQorCWNvcmVuZXRfdWRwX2JpbmRfYWxsX3BvcnRzKHRyYWZmaWNz ZXJ2ZXJfdCkKKycpCisKK3R1bmFibGVfcG9saWN5KGB0cmFmZmljc2VydmVyX2Nhbl9jb25uZWN0 X2FsbCcsYAorCWNvcmVuZXRfdGNwX2Nvbm5lY3RfYWxsX3BvcnRzKHRyYWZmaWNzZXJ2ZXJfdCkK KycpCisKCmRpZmYgLS1naXQgYS90cmFmZmljc2VydmVyLnRtcGZpbGVzZCBiL3RyYWZmaWNzZXJ2 ZXIudG1wZmlsZXNkCmluZGV4IDRlODEzMjIuLjRlYTg4MjkgMTAwNjQ0Ci0tLSBhL3RyYWZmaWNz ZXJ2ZXIudG1wZmlsZXNkCisrKyBiL3RyYWZmaWNzZXJ2ZXIudG1wZmlsZXNkCkBAIC0xICsxIEBA Ci1kIC92YXIvcnVuL3RyYWZmaWNzZXJ2ZXIgMDc1NSBhdHMgYXRzIC0KK2QgL3J1bi90cmFmZmlj c2VydmVyIDA3NTUgdHJhZmZpY3NlcnZlciB0cmFmZmljc2VydmVyIC0KCmRpZmYgLS1naXQgYS91 bml0X3Rlc3RzLnBhdGNoIGIvdW5pdF90ZXN0cy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi45MjAxMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pdF90ZXN0cy5wYXRj aApAQCAtMCwwICsxLDQxIEBACistLS0gc3JjL3RzY29yZS91bml0X3Rlc3RzL3Rlc3RfSGlzdG9y eS5jYy5vcmlnCTIwMjItMDQtMDggMTQ6Mzk6NTQuNTQ5MTkzMDkwICswMDAwCisrKysgc3JjL3Rz Y29yZS91bml0X3Rlc3RzL3Rlc3RfSGlzdG9yeS5jYwkyMDIyLTA0LTA4IDE0OjQ2OjQyLjEwNTk2 NjgwMyArMDAwMAorQEAgLTU5LDEwICs1OSwxMCBAQAorICAgUkVRVUlSRShoaXN0b3J5WzJdLnJl ZW50cmFuY3kgPT0gc3RhdGljX2Nhc3Q8c2hvcnQ+KE5PX1JFRU5UUkFOVCkpOworIAorICAgaGlz dG9yeVswXS5sb2NhdGlvbi5zdHIoYnVmLCBzaXplb2YoYnVmKSk7CistICBSRVFVSVJFKHN0cmlu Z192aWV3e2J1Zn0gPT0gInRlc3RfSGlzdG9yeS5jYzo0OCAoX19fX0NfQV9UX0NfSF9fX19UX0Vf U19UX19fXzApIik7CisrICBSRVFVSVJFKHN0cmluZ192aWV3e2J1Zn0gPT0gInRlc3RfSGlzdG9y eS5jYzo0OCAoQ19BX1RfQ19IX1RfRV9TX1RfMCkiKTsKKyAKKyAgIGhpc3RvcnlbMV0ubG9jYXRp b24uc3RyKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworLSAgUkVRVUlSRShzdHJpbmdfdmlld3tidWZ9ID09 ICJ0ZXN0X0hpc3RvcnkuY2M6NDkgKF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18wKSIpOwor KyAgUkVRVUlSRShzdHJpbmdfdmlld3tidWZ9ID09ICJ0ZXN0X0hpc3RvcnkuY2M6NDkgKENfQV9U X0NfSF9UX0VfU19UXzApIik7CisgCisgICB0czo6TG9jYWxCdWZmZXJXcml0ZXI8MTI4PiB3Owor ICAgU008SElTVE9SWV9ERUZBVUxUX1NJWkU+ICpzbSA9IG5ldyBTTTxISVNUT1JZX0RFRkFVTFRf U0laRT47CitAQCAtNzEsMTAgKzcxLDEwIEBACisgICBTTV9SRU1FTUJFUihzbSwgMywgTk9fUkVF TlRSQU5UKTsKKyAKKyAgIHcucHJpbnQoInt9Iiwgc20tPmhpc3RvcnlbMF0ubG9jYXRpb24pOwor LSAgUkVRVUlSRSh3LnZpZXcoKSA9PSAidGVzdF9IaXN0b3J5LmNjOjY5IChfX19fQ19BX1RfQ19I X19fX1RfRV9TX1RfX19fMCkiKTsKKysgIFJFUVVJUkUody52aWV3KCkgPT0gInRlc3RfSGlzdG9y eS5jYzo2OSAoQ19BX1RfQ19IX1RfRV9TX1RfMCkiKTsKKyAKKyAgIHcucmVzZXQoKS5wcmludCgi e30iLCBzbS0+aGlzdG9yeVsxXS5sb2NhdGlvbik7CistICBSRVFVSVJFKHcudmlldygpID09ICJ0 ZXN0X0hpc3RvcnkuY2M6NzAgKF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18wKSIpOworKyAg UkVRVUlSRSh3LnZpZXcoKSA9PSAidGVzdF9IaXN0b3J5LmNjOjcwIChDX0FfVF9DX0hfVF9FX1Nf VF8wKSIpOworIAorICAgUkVRVUlSRShzbS0+aGlzdG9yeVswXS5ldmVudCA9PSAxKTsKKyAgIFJF UVVJUkUoc20tPmhpc3RvcnlbMF0ucmVlbnRyYW5jeSA9PSAxKTsKK0BAIC0xMDYsMTAgKzEwNiwx MCBAQAorICAgUkVRVUlSRShzbTItPmhpc3Rvcnkub3ZlcmZsb3dlZCgpID09IHRydWUpOworIAor ICAgdy5yZXNldCgpLnByaW50KCJ7fSIsIHNtMi0+aGlzdG9yeVswXS5sb2NhdGlvbik7CistICBS RVFVSVJFKHcudmlldygpID09ICJ0ZXN0X0hpc3RvcnkuY2M6MTAzIChfX19fQ19BX1RfQ19IX19f X1RfRV9TX1RfX19fMCkiKTsKKysgIFJFUVVJUkUody52aWV3KCkgPT0gInRlc3RfSGlzdG9yeS5j YzoxMDMgKENfQV9UX0NfSF9UX0VfU19UXzApIik7CisgCisgICB3LnJlc2V0KCkucHJpbnQoInt9 Iiwgc20yLT5oaXN0b3J5WzFdLmxvY2F0aW9uKTsKKy0gIFJFUVVJUkUody52aWV3KCkgPT0gInRl c3RfSGlzdG9yeS5jYzo5OCAoX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXzApIik7CisrICBS RVFVSVJFKHcudmlldygpID09ICJ0ZXN0X0hpc3RvcnkuY2M6OTggKENfQV9UX0NfSF9UX0VfU19U XzApIik7CisgCisgICBzbTItPmhpc3RvcnkuY2xlYXIoKTsKKyAgIFJFUVVJUkUoc20yLT5oaXN0 b3J5LnNpemUoKSA9PSAwKTsK