IyBDb3B5cmlnaHQgKGMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQojIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKIyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAojIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQojIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKIyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KIyBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiMgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCiMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCiMgbGlidmEgcGFja2FnZSB2ZXJzaW9uIG51bWJlciwgKGFzIGRpc3RpbmN0IGZyb20gc2hhcmVkIGxpYnJhcnkgdmVyc2lvbikKbTRfZGVmaW5lKFtsaWJ2YV9tYWpvcl92ZXJzaW9uXSwgWzBdKQptNF9kZWZpbmUoW2xpYnZhX21pbm9yX3ZlcnNpb25dLCBbMzJdKQptNF9kZWZpbmUoW2xpYnZhX21pY3JvX3ZlcnNpb25dLCBbMF0pCgptNF9kZWZpbmUoW2xpYnZhX3ZlcnNpb25dLAogICAgICAgICAgW2xpYnZhX21ham9yX3ZlcnNpb24ubGlidmFfbWlub3JfdmVyc2lvbi5saWJ2YV9taWNyb192ZXJzaW9uXSkKCiMgaWYgdGhlIGxpYnJhcnkgc291cmNlIGNvZGUgaGFzIGNoYW5nZWQsIGluY3JlbWVudCByZXZpc2lvbgptNF9kZWZpbmUoW2xpYnZhX2x0X3JldmlzaW9uXSwgWzE0XSkKIyBpZiBhbnkgaW50ZXJmYWNlIHdhcyBhZGRlZC9yZW1vdmVkL2NoYW5nZWQsIHRoZW4gaW5jIGN1cnJlbnQsIHJlc2V0IHJldmlzaW9uCm00X2RlZmluZShbbGlidmFfbHRfY3VycmVudF0sIFsxXSkKIyBpZiBhbnkgaW50ZXJmYWNlIHdhcyBhZGRlZCBzaW5jZSBsYXN0IHB1YmxpYyByZWxlYXNlLCB0aGVuIGluY3JlbWVudCBhZ2UKIyBpZiBhbnkgaW50ZXJmYWNlIHdhcyByZW1vdmVkIHNpbmNlIGxhc3QgcHVibGljIHJlbGVhc2UsIHRoZW4gc2V0IGFnZSB0byAwCm00X2RlZmluZShbbGlidmFfbHRfYWdlXSwgWzBdKQoKQUNfUFJFUkVRKDIuNTcpCkFDX0lOSVQoW2xpYnZhXSwgW2xpYnZhX3ZlcnNpb25dLCBbd2FsZG8uYmFzdGlhbkBpbnRlbC5jb21dLCBsaWJ2YSkKQUNfQ09ORklHX1NSQ0RJUihbTWFrZWZpbGUuYW1dKQpBTV9JTklUX0FVVE9NQUtFKFtkaXN0LWJ6aXAyXSkKCkFNX0NPTkZJR19IRUFERVIoW2NvbmZpZy5oXSkKbTRfaWZkZWYoW0FNX1NJTEVOVF9SVUxFU10sIFtBTV9TSUxFTlRfUlVMRVMoW3llc10pXSkKCkxJQlZBX01BSk9SX1ZFUlNJT049bGlidmFfbWFqb3JfdmVyc2lvbgpMSUJWQV9NSU5PUl9WRVJTSU9OPWxpYnZhX21pbm9yX3ZlcnNpb24KTElCVkFfTUlDUk9fVkVSU0lPTj1saWJ2YV9taWNyb192ZXJzaW9uCkxJQlZBX1ZFUlNJT049bGlidmFfdmVyc2lvbgpBQ19TVUJTVChMSUJWQV9NQUpPUl9WRVJTSU9OKQpBQ19TVUJTVChMSUJWQV9NSU5PUl9WRVJTSU9OKQpBQ19TVUJTVChMSUJWQV9NSUNST19WRVJTSU9OKQpBQ19TVUJTVChMSUJWQV9WRVJTSU9OKQoKTElCVkFfTFRfQ1VSUkVOVD1saWJ2YV9sdF9jdXJyZW50CkxJQlZBX0xUX1JFVj1saWJ2YV9sdF9yZXZpc2lvbgpMSUJWQV9MVF9BR0U9bGlidmFfbHRfYWdlCkxJQlZBX0xUX1ZFUlNJT049IiRMSUJWQV9MVF9DVVJSRU5UOiRMSUJWQV9MVF9SRVY6JExJQlZBX0xUX0FHRSIKTElCVkFfTFRfTERGTEFHUz0iLXZlcnNpb24taW5mbyAkTElCVkFfTFRfVkVSU0lPTiIKQUNfU1VCU1QoTElCVkFfTFRfVkVSU0lPTikKQUNfU1VCU1QoTElCVkFfTFRfTERGTEFHUykKCkFDX0FSR19FTkFCTEUoZ2x4LAogICAgICAgICAgICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZ2x4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1aWxkIHdpdGggT3BlbkdMIGZvciBYMTEgc3VwcG9ydF0pXSwKICAgICAgICAgICAgICBbXSwgW2VuYWJsZV9nbHg9eWVzXSkKCkFDX0FSR19FTkFCTEUoZHVtbXktZHJpdmVyLAogICAgICAgICAgICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZHVtbXktZHJpdmVyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1aWxkIGR1bW15IHZpZGVvIGRyaXZlcl0pXSwKICAgICAgICAgICAgICBbXSwgW2VuYWJsZV9kdW1teV9kcml2ZXI9eWVzXSkKQU1fQ09ORElUSU9OQUwoQlVJTERfRFVNTVlfRFJJVkVSLCB0ZXN0IHgkZW5hYmxlX2R1bW15X2RyaXZlciA9IHh5ZXMpCgpBQ19BUkdfRU5BQkxFKGR1bW15LWJhY2tlbmQsCiAgICAgICAgICAgICAgW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kdW1teS1iYWNrZW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1aWxkIGR1bW15IGxpYnZhIGJhY2tlbmRdKV0sCiAgICAgICAgICAgICAgW10sIFtlbmFibGVfZHVtbXlfYmFja2VuZD1ub10pCgpBQ19BUkdfRU5BQkxFKGk5NjUtZHJpdmVyLAogICAgICAgICAgICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtaTk2NS1kcml2ZXJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYnVpbGQgaTk2NSB2aWRlbyBkcml2ZXJdKV0sCiAgICAgICAgICAgICAgW10sIFtlbmFibGVfaTk2NV9kcml2ZXI9bm9dKQoKQUNfQVJHX1dJVEgoZHJpdmVycy1wYXRoLAoJICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLWRyaXZlcnMtcGF0aD1bW3BhdGhdXV0sIFtkcml2ZXJzIHBhdGhdKV0sLAoJICAgIFt3aXRoX2RyaXZlcnNfcGF0aD0iJGxpYmRpci9kcmkiXSkKCkxJQlZBX0RSSVZFUlNfUEFUSD0iJHdpdGhfZHJpdmVyc19wYXRoIgpBQ19TVUJTVChMSUJWQV9EUklWRVJTX1BBVEgpCgpBQ19ESVNBQkxFX1NUQVRJQwpBQ19QUk9HX0xJQlRPT0wKQUNfUFJPR19DQwpBQ19QUk9HX0NYWAoKQUNfSEVBREVSX1NUREMKQUNfU1lTX0xBUkdFRklMRQoKUEtHX0NIRUNLX01PRFVMRVMoW1gxMV0sIFt4MTFdKQpQS0dfQ0hFQ0tfTU9EVUxFUyhbWEVYVF0sW3hleHRdKQpQS0dfQ0hFQ0tfTU9EVUxFUyhbWEZJWEVTXSwgW3hmaXhlc10pClBLR19DSEVDS19NT0RVTEVTKFtEUk1dLCBbbGliZHJtXSkKClBLR19DSEVDS19NT0RVTEVTKEdFTjRBU00sIFtpbnRlbC1nZW40YXNtID49IDEuMV0sIFtnZW40YXNtPXllc10sIFtnZW40YXNtPW5vXSkKQU1fQ09ORElUSU9OQUwoSEFWRV9HRU40QVNNLCB0ZXN0IHgkZ2VuNGFzbSA9IHh5ZXMpCgojIENoZWNrIGZvciBsaWJkcm0gPj0gMi40LjIzIChuZWVkZWQgZm9yIGk5NjVfZHJ2X3ZpZGVvLnNvKQppZiB0ZXN0IHgkZW5hYmxlX2k5NjVfZHJpdmVyID0geHllcyAmJiAhICRQS0dfQ09ORklHIC0tYXRsZWFzdC12ZXJzaW9uPTIuNC4yMyBsaWJkcm07IHRoZW4KICAgIEFDX01TR19XQVJOKFtsaWJkcm0gPCAyLjQuMjMgZm91bmQsIGRpc2FibGluZyBidWlsZCBvZiBpOTY1IHZpZGVvIGRyaXZlcl0pCiAgICBlbmFibGVfaTk2NV9kcml2ZXI9bm8KZmkKQU1fQ09ORElUSU9OQUwoQlVJTERfSTk2NV9EUklWRVIsIHRlc3QgeCRlbmFibGVfaTk2NV9kcml2ZXIgPSB4eWVzKQoKaWYgdGVzdCB4JGVuYWJsZV9kdW1teV9iYWNrZW5kID0geHllczsgdGhlbgogICAgUEtHX0NIRUNLX01PRFVMRVMoW1VERVZdLCBbbGlidWRldl0sIFtsaWJ1ZGV2PXllc10sIFtsaWJ1ZGV2PW5vXSkKZmkKaWYgdGVzdCB4JGxpYnVkZXYgPSB4bm87IHRoZW4KICAgZW5hYmxlX2R1bW15X2JhY2tlbmQ9bm8KZmkKQU1fQ09ORElUSU9OQUwoQlVJTERfRFVNTVlfQkFDS0VORCwgdGVzdCB4JGVuYWJsZV9kdW1teV9iYWNrZW5kID0geHllcykKCiMgQ2hlY2sgZm9yIE9wZW5HTCAoWDExKQpVU0VfR0xYPSJubyIKR0xfREVQU19DRkxBR1M9IiIKR0xfREVQU19MSUJTPSIiCmlmIHRlc3QgeCRlbmFibGVfZ2x4ID0geHllczsgdGhlbgogICAgQUNfQ0hFQ0tfSEVBREVSUyhbR0wvZ2wuaF0pCiAgICBBQ19DSEVDS19IRUFERVJTKFtHTC9nbHguaF0pCiAgICBBQ19DSEVDS19MSUIoR0wsIGdsWENyZWF0ZUNvbnRleHQsIFsKICAgICAgICBVU0VfR0xYPSJ5ZXMiCiAgICAgICAgR0xfREVQU19MSUJTPSItbFgxMSAtbEdMIgogICAgXSkKZmkKQUNfU1VCU1QoR0xfREVQU19DRkxBR1MpCkFDX1NVQlNUKEdMX0RFUFNfTElCUykKQU1fQ09ORElUSU9OQUwoVVNFX0dMWCwgdGVzdCAiJFVTRV9HTFgiID0gInllcyIpCgojIFRCRDogQ2hlY2sgZm9yIEVHTApVU0VfRUdMPSJ5ZXMiCkFNX0NPTkRJVElPTkFMKFVTRV9FR0wsIHRlc3QgIiRVU0VfRUdMIiA9ICJ5ZXMiKQoKCiMgTWFrZSBzdXJlIGRyaXZlcnMgdXNlIHRoZSBjb3JyZWN0bHkgdmVyc2lvbmVkIF9fdmFEcml2ZXJJbml0KigpIGZ1bmN0aW9uIG5hbWUKVkFfRFJJVkVSX0lOSVRfRlVOQz0iX192YURyaXZlckluaXRfJHtMSUJWQV9NQUpPUl9WRVJTSU9OfV8ke0xJQlZBX01JTk9SX1ZFUlNJT059IgpBQ19ERUZJTkVfVU5RVU9URUQoW1ZBX0RSSVZFUl9JTklUX0ZVTkNdLCBbJFZBX0RSSVZFUl9JTklUX0ZVTkNdLAogICAgW0RlZmluZWQgdG8gdGhlIHZlcnNpb25lZCBfX3ZhRHJpdmVySW5pdCBmdW5jdGlvbiBuYW1lXSkKQUNfREVGSU5FX1VOUVVPVEVEKFtWQV9EUklWRVJfSU5JVF9GVU5DX1NdLCBbIiRWQV9EUklWRVJfSU5JVF9GVU5DIl0sCiAgICBbRGVmaW5lZCB0byB0aGUgdmVyc2lvbmVkIF9fdmFEcml2ZXJJbml0IGZ1bmN0aW9uIG5hbWUgKGluIHN0cmluZyBmb3JtKV0pCgojIFdlIG9ubHkgbmVlZCB0aGUgaGVhZGVycywgd2UgZG9uJ3QgbGluayBhZ2FpbnN0IHRoZSBEUk0gbGlicmFyaWVzCkxJQlZBX0NGTEFHUz0iJERSTV9DRkxBR1MiCkFDX1NVQlNUKExJQlZBX0NGTEFHUykKQUNfU1VCU1QoTElCVkFfTElCUykKCnBrZ2NvbmZpZ2Rpcj0ke2xpYmRpcn0vcGtnY29uZmlnCkFDX1NVQlNUKHBrZ2NvbmZpZ2RpcikKCkxJQlZBX0RJU1BMQVk9eDExCmxpYnZhY29yZWxpYj1saWJ2YS5sYQpsaWJ2YWJhY2tlbmRsaWI9bGlidmEtJExJQlZBX0RJU1BMQVkubGEKQUNfU1VCU1QoW2xpYnZhY29yZWxpYl0pCkFDX1NVQlNUKFtsaWJ2YWJhY2tlbmRsaWJdKQoKQUNfT1VUUFVUKFsKCU1ha2VmaWxlCgl2YS9NYWtlZmlsZQoJdmEvdmFfdmVyc2lvbi5oCgl2YS94MTEvTWFrZWZpbGUKCXZhL2dseC9NYWtlZmlsZQoJdmEvZWdsL01ha2VmaWxlCgl2YS9kdW1teS9NYWtlZmlsZQoJZHVtbXlfZHJ2X3ZpZGVvL01ha2VmaWxlCglpOTY1X2Rydl92aWRlby9NYWtlZmlsZQoJaTk2NV9kcnZfdmlkZW8vc2hhZGVycy9NYWtlZmlsZQoJaTk2NV9kcnZfdmlkZW8vc2hhZGVycy9oMjY0L01ha2VmaWxlCglpOTY1X2Rydl92aWRlby9zaGFkZXJzL2gyNjQvbWMvTWFrZWZpbGUKCWk5NjVfZHJ2X3ZpZGVvL3NoYWRlcnMvbXBlZzIvTWFrZWZpbGUKCWk5NjVfZHJ2X3ZpZGVvL3NoYWRlcnMvbXBlZzIvdmxkL01ha2VmaWxlCglpOTY1X2Rydl92aWRlby9zaGFkZXJzL3JlbmRlci9NYWtlZmlsZQoJaTk2NV9kcnZfdmlkZW8vc2hhZGVycy9wb3N0X3Byb2Nlc3NpbmcvTWFrZWZpbGUKCWk5NjVfZHJ2X3ZpZGVvL3NoYWRlcnMvdm1lL01ha2VmaWxlCgl0ZXN0L01ha2VmaWxlCgl0ZXN0L2Jhc2ljL01ha2VmaWxlCgl0ZXN0L2RlY29kZS9NYWtlZmlsZQoJdGVzdC9wdXRzdXJmYWNlL01ha2VmaWxlCgl0ZXN0L2VuY29kZS9NYWtlZmlsZQoJdGVzdC92YWluZm8vTWFrZWZpbGUKCWxpYnZhLnBjCglsaWJ2YS14MTEucGMKCWxpYnZhLWdseC5wYwoJbGlidmEtZWdsLnBjCglsaWJ2YS10cGkucGMKXSkKCiMgUHJpbnQgYSBzbWFsbCBzdW1tYXJ5CgplY2hvICIiCmVjaG8gImxpYnZhIC0gJHtMSUJWQV9WRVJTSU9OfSIKZWNobyAiIgoKZWNobyAiIJUgR2xvYmFsIDoiCmVjaG8gIiAgICAgUHJlZml4OiAke3ByZWZpeH0iCmVjaG8gIiIKCkFTX0lGKFt0ZXN0IHgkZW5hYmxlX2k5NjVfZHJpdmVyID0geHllc10sIFtEUklWRVJTPSJpOTY1ICREUklWRVJTIl0pIApBU19JRihbdGVzdCB4JGVuYWJsZV9kdW1teV9kcml2ZXIgPSB4eWVzXSwgW0RSSVZFUlM9ImR1bW15ICREUklWRVJTIl0pCgplY2hvICIglSBEcml2ZXJzOiAke0RSSVZFUlN9IgoKQVNfSUYoW3Rlc3QgeCRVU0VfR0xYID0geHllc10sIFtCQUNLRU5EUz0iZ2x4ICRCQUNLRU5EUyJdKQpBU19JRihbdGVzdCB4JFVTRV9FR0wgPSB4eWVzXSwgW0JBQ0tFTkRTPSJlZ2wgJEJBQ0tFTkRTIl0pCgpCQUNLRU5EUz0ieDExICRCQUNLRU5EUyIKQVNfSUYoW3Rlc3QgeCRlbmFibGVfZHVtbXlfYmFja2VuZCA9IHh5ZXNdLCBbQkFDS0VORFM9ImR1bW15IAokQkFDS0VORFMiXSkKCmVjaG8gIiCVIFdpbnN5cyA6ICR7QkFDS0VORFN9IgoK