REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 203.12 KB
Close
/opt/alt/python37/lib64/python3.7/site-packages/numpy/ma/__pycache__/core.cpython-37.pyc
Text
Base64
Qg0NCgAAAADB2EZkt+MDAOMAAAAAAAAAAAAAAAC1AAAAQAAAAHMmDwAAZABaAGQBZAJsAW0CWgJtA1oDbQRaBAEAZAFkA2wFWgVkAWQDbAZaBmQBZANsB1oHZAFkBGwIbQlaCQEAZQVqCmQBGQBkBWsFclRkAWQDbAtaC24IZAFkA2wMWgtkAWQDbA1aDmQBZANsD20QAgABAG0RWhEBAGQBZANsEm0QAgABAG0TWhQBAGQBZAZsDW0VWhVtFloWbRdaF20YWhhtGVoZbRpaGgEAZAFkB2wNbRtaHAEAZAFkCGwdbR5aHgEAZAFkCWwfbSBaIG0hWiFtIloibSNaI20kWiRtJVolAQBkAWQKbA1tJlonAQBkAWQLbChtKVopAQBkAWQMbCptK1orAQBlBWoKZAEZAGQFawWQAXIeZAFkA2wsWixuCGQBZANsLVosZA1kDmQPZBBkEWQSZBNkFGQVZBZkF2QYZBlkGmQbZBxkHWQeZB9kIGQhZCJkI2QkZCVkJmQnZChkKWQqZCtkLGQtZC5kL2QwZDFkMmQzZDRkNWQ2ZDdkOGQ5ZDpkO2Q8ZD1kPmQ/ZEBkQWRCZENkRGRFZEZkR2RIZElkSmRLZExkTWROZE9kUGRRZFJkU2RUZFVkVmRXZFhkWWRaZFtkXGRdZF5kX2RgZGFkYmRjZGRkZWRmZGdkaGRpZGpka2RsZG1kbmRvZHBkcWRyZHNkdGR1ZHZkd2R4ZHlkemR7ZHxkfWR+ZH9kgGSBZIJkg2SEZIVkhmSHZIhkiWSKZItkjGSNZI5kj2SQZJFkkmSTZJRklWSWZJdkmGSZZJpkm2ScZJ1knmSfZKBkoWSiZKNkpGSlZKZkp2SoZKlkqmSrZKxkrWSuZK9ksGSxZLJks2S0ZLVktmS3ZLhkuWS6ZLtkvGS9ZL5kv2TAZMFntVouZQ5qGVovZS9kAYMBWjBHAGTCZMOEAGTDZTGDA1oyZMRkxYQAWjNkxmTHhABaNGTIZMmEAFo1RwBkymQNhABkDWU2gwNaN0cAZMtkDoQAZA5lN4MDWjhkzGTNZM5kz2TQZNFkz2TSZNNk1JwJWjl4PmTVRABdNlo6ZQ6gO2TWZTqhAmU5ZNdlOhcAZNgXADwAZQ6gPGTWZTqhAmU5ZNllOhcAZNgXADwAkANxCFcAZRRqPVo+ZT6gP2TaZNuEAGUOakBlDmpBZwJEAIMBoQEBAGUUakJaQ2VDoD9k3GTbhABlDmpAZQ5qQWcCRACDAaEBAQBk3WUUakRrBpADcr5lPqA/ZQ5qRWUOakYLAGYCZwGhAQEAZUOgP2UOakVlDmpGCgBmAmcBoQEBAGTeZEKEAFpHZN9k4IQAWkhk4WSQhABaSWTiZIyEAFpKZONk5IQAWktk5WTmhABaTGTnZOiEAFpNZOlkq4QAWk5k6mTrhABaT2TsZDWEAFpQkAFkgWTtZE+EAVpRZO5k74QAWlKQAWSCZPBkWYQBWlNlU1pUZTBkzGQDZgNk8WRQhAFaVWkAWlZpAFpXRwBk8mTzhABk84MCWlhHAGT0ZPWEAGT1gwJaWUcAZPZk94QAZPeDAlpaRwBk+GT5hABk+YMCWltHAGT6ZPuEAGT7gwJaXEcAZPxk/YQAZP2DAlpdRwBk/mT/hABk/4MCWl5HAJABZACQAWQBhACQAWQBgwJaX2VdZRFqYIMBWmBlXWURamGDAVphZV1lEWpigwFaYmVdZRFqY4MBWmNlXWURamSDAVpkZV1lEWplgwFaZWVdZRFqZoMBWmZlXWURameDAVpnZV1lEWpogwFaaGVdZRFqaYMBWmllXWURamqDAQQAWmtaamVdZR6DAVoeZV1lEWpsgwFabGVdZRFqbYMBWm1lXWURam6DAVpuZV1lEWpvgwFab2VdZQ5qcIMBWnFlXWURanKDAVpyZV1lEWpzkAFkAmVckAFkAoMBgwNac2VdZRFqdJABZANlW5ABZAKDAYMDWnRlXWURanWQAWQDZVuQAWQCgwGDA1p1ZV1lEWp2kAFkA2VbkAFkAoMBgwNadmVdZRFqZJABZAJlWZABZASDAYMDWmRlXWURaneQAWQCZViQAWQFkAFkA4MCgwNad2VdZRFqeJABZAJlWJABZAWQAWQDgwKDA1p4ZV1lEWp5kAFkA2VckAFkA4MBgwNaeWVdZRFqepABZAJlWJABZAaQAWQHgwKDA1p6ZV5lEWp7gwFae2VeZRFqfIMBWnxlXmURan2QAWQIkAFkCIMDWn1lXmURan6QAWQCkAFkA4MDWn5lXmURan+DAVp/ZANlf18JZV5lEWqAgwFagGQDZYBfCWVeZRFqgYMBWoFkA2WBXwllXmURaoKDAVqCZANlgl8JZV5lEWqDgwFag2QDZYNfCWVeZRFqhIMBWoRkA2WEXwllXmURaoWDAVqFZV5lEWqFkAFkCJABZAiDA2oJWoZlXmURaoeDAVqHZYdqCVqIZV5lEWqJgwFaiWVeZRFqioMBWoplXmURaouDAVqLZV5lEWqMgwFajGVeZRFqjYMBWo1lX2URao5lWoMAZAGQAWQIgwRajmVfZRFqj2VagwBkAZABZAiDBFqPZV9lEWqQZVqDAGQBkAFkCIMEWpBlX2URapFlWoMAZAGQAWQIgwRakWVfZRFqkmVagwBkAZABZAiDBFqSZV9lEWqTZVqDAGQBkAFkCIMEWpOQAWQJkAFkCoQAWpSQAWQLkAFkDIQAWpWQAWQNZHeEAFqWkAFkDmRahABal2WXWpiQAWQPZFuEAFqZkAFkEGRnhABampABZBFkzGUvZgOQAWQSZHaEAVqbkAFkg5ABZBNkeIQBWpyQAWSEkAFkFGR5hAFanZABZBVkUYQAWp5lDmoaZgGQAWQWkAFkF4QBWp+QAWSFkAFkGGSJhAFaoJABZIaQAWQZZH2EAVqhkAFkh5ABZBpkfoQBWqKQAWSIkAFkG2SBhAFao5ABZImQAWQcZIKEAVqkkAFkipABZB1kg4QBWqWQAWSLkAFkHmR8hAFappABZIyQAWQfZH+EAVqnkAFkjZABZCBkhYQBWqiQAWSOkAFkIWSEhAFaqZABZI+QAWQkZIiEAVqqkAFkkJABZCVkgIQBWqtHAJABZCaQAWQnhACQAWQngwJarGWskAFkKIMBWq2QAWQpkAFkKoQAWq5lr5ABZCuQAWQskAFkLZABZC6QAWQvjQRasJABZDCQAWQxhABasZABZDJkUoQAWrKQAWSRkAFkM5ABZDSEAVqzRwCQAWQ1kAFkNoQAkAFkNmW0gwNatUcAkAFkN2QQhABkEGUVgwNatpABZDiQAWQ5hABat0cAkAFkOmSThABkk2W2gwNauJABZDtkZoQAWrlluVq6Zblau0cAkAFkPJABZD2EAJABZD1ltoMDWrxlvIMABABavVq+ZbZav2QDkAFkEWQDZTBkA2TMkAFkEWTMZMxkAWYKkAFkPmQrhAFaG2W/agBlG18AkAFkP2RohABawEcAkAFkQJABZEGEAJABZEFltIMDWsFkA2QDZANlDmoaZgSQAWRCZI6EAVrCZbZqwmoAZcJfAGQDZANkA2UOahpmBJABZENkioQBWsNltmrDagBlw18AkAFkkpABZERkn4QBWsRltmrEagBlxF8ARwCQAWRFkAFkRoQAkAFkRoMCWsVlxWQUgwFaxmXFZBuDAQQAWsdayGXFZB2DAVrJZcVkNmTMkAFkR40CWsplxWRAgwFay2XFZEGDAVrMZcVkO4MBWs1lxWREgwFazmXFZF6DAVrPZcVkYYMBWtBlwWURatFlhGVKgwNa0WXFZI2DAVrSZcFlEWrTZYNlSYMDWtNlxWSXgwFa1GXFZJ2DAVrVZcVknYMBWtZlxWSjgwFa12XFZKWDAVrYZcWQAWRIgwFa2WXFZLCDAVraZcVktYMBWttlxWS3gwFa3GXFZLiDAVrdZcVkvIMBWt5lxWS/gwFa32XFZD+DAVrgkAFkk5ABZEpkuYQBWuGQAWSUkAFkS2SchAFa4mXFZCiDAVrjZcVkJ4MBWuRlDmoakAFkTGQDZMxkA2YFkAFkTWQphAFa5WW2auVqAGXlXwCQAWSVkAFkT2SyhAFa5mW2auZqAGXmXwCQAWRQZDeEAFrnkAFklpABZFFkOIQBWuiQAWSXkAFkUmRDhAFa6ZABZFNkTYQAWiaQAWRUZGqEAFrqkAFkVWSohABa65ABZJiQAWRWZKCEAVrskAFkV2ShhABa7ZABZJmQAWRYZL2EAVrukAFkmpABZFpkpoQBWu+QAWRbZKeEAFrwkAFkXGSihABa8WUOavFqAGXxXwCQAWRdZJSEAFryZQ5q8moAZfJfAJABZF5krIQAWvNlDmrzagBl818AkAFkm5ABZF9kr4QBWvRlDmr0agBl9F8AZRplGmYCkAFkYGTAhAFa9ZABZJyQAWRhZDOEAVr2kAFknZABZGJkqoQBWnBlcFr3kAFknpABZGOQAWRkhAFa+JABZJ+QAWRlkAFkZoQBWvmQAWRnZGOEAFr6ZTRlDmr6agCQAWRogwJl+l8AZfpa+5ABZGlkmoQAWvxlNGUOavxqAJABZGiDAmX8XwBl/Fr9kAFkapABZGuEAFr+kAFkoJABZG1kPIQBWv+QAWShkAFkb2Q6hAGQAVoAkAFkopABZHBkFoQBkAFaAZABZKOQAWRxZBWEAZABWgKQAWSkkAFkcmQthAGQAVoDkAFkpZABZHNkLIQBkAFaBJABZHRkR4QAkAFaBZABZHVkSIQAkAFaBpABZHZkbYQAkAFaB5ABZHdkboQAkAFaCJABZQmQAWROkAFkeGYDkAFkeZABZHqEAZABWgqQAWR7ZFeEAJABWgtHAJABZHyQAWR9hACQAWR9gwKQAVoMkAFlDGQfZa9kA5ABZBGQAWR+jQKQAWR/jQKQAVoNZQ6QAWoOkAFaDmUOkAFqD5ABWg+QAWUMZEllr2QDkAFkEZABZH6NApABZH+NApABWhCQAWUMZEqDAZABWhGQAWUMZFaDAZABWhKQAWUMZFiDAZABWhOQAWUMZGBlr2QDkAFkEZABZH6NApABZH+NApABWhRlDpABahWQAVoVkAFlDGSZZa9kA5ABZBGQAWR+jQKQAWR/jQKQAVoWZQ6QAWoXkAFaF2UOkAFqGJABWhiQAWUMZMFlr2QDkAFkEZABZH6NApABZH+NApABWhllDpABahqQAVoakAFkppABZIBkHoQBkAFaG2QDUwAopwEAAGH6AgAACm51bXB5Lm1hIDogYSBwYWNrYWdlIHRvIGhhbmRsZSBtaXNzaW5nIG9yIGludmFsaWQgdmFsdWVzLgoKVGhpcyBwYWNrYWdlIHdhcyBpbml0aWFsbHkgd3JpdHRlbiBmb3IgbnVtYXJyYXkgYnkgUGF1bCBGLiBEdWJvaXMKYXQgTGF3cmVuY2UgTGl2ZXJtb3JlIE5hdGlvbmFsIExhYm9yYXRvcnkuCkluIDIwMDYsIHRoZSBwYWNrYWdlIHdhcyBjb21wbGV0ZWx5IHJld3JpdHRlbiBieSBQaWVycmUgR2VyYXJkLU1hcmNoYW50CihVbml2ZXJzaXR5IG9mIEdlb3JnaWEpIHRvIG1ha2UgdGhlIE1hc2tlZEFycmF5IGNsYXNzIGEgc3ViY2xhc3Mgb2YgbmRhcnJheSwKYW5kIHRvIGltcHJvdmUgc3VwcG9ydCBvZiBzdHJ1Y3R1cmVkIGFycmF5cy4KCgpDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuClJlbGVhc2VkIGZvciB1bmxpbWl0ZWQgcmVkaXN0cmlidXRpb24uCgoqIEFkYXB0ZWQgZm9yIG51bXB5X2NvcmUgMjAwNSBieSBUcmF2aXMgT2xpcGhhbnQgYW5kIChtYWlubHkpIFBhdWwgRHVib2lzLgoqIFN1YmNsYXNzaW5nIG9mIHRoZSBiYXNlIGBuZGFycmF5YCAyMDA2IGJ5IFBpZXJyZSBHZXJhcmQtTWFyY2hhbnQKICAocGdtZGV2bGlzdF9BVF9nbWFpbF9ET1RfY29tKQoqIEltcHJvdmVtZW50cyBzdWdnZXN0ZWQgYnkgUmVnZ2llIER1Z2FyZCAocmVnZ2llX0FUX21lcmZpbmxsY19ET1RfY29tKQoKLi4gbW9kdWxlYXV0aG9yOjogUGllcnJlIEdlcmFyZC1NYXJjaGFudAoK6QAAAAApA9oIZGl2aXNpb27aD2Fic29sdXRlX2ltcG9ydNoOcHJpbnRfZnVuY3Rpb25OKQHaBnJlZHVjZekDAAAAKQbaB25kYXJyYXnaBGFtYXjaBGFtaW7aDGlzY29tcGxleG9iatoFYm9vbF/aCF9Ob1ZhbHVlKQHaBWFycmF5KQHaBWFuZ2xlKQbaCmdldGFyZ3NwZWPaDWZvcm1hdGFyZ3NwZWPaBGxvbmfaCmJhc2VzdHJpbmfaB3VuaWNvZGXaBWJ5dGVzKQHaC2V4cGFuZF9kaW1zKQHaFG5vcm1hbGl6ZV9heGlzX2luZGV4KQHaFG5vcm1hbGl6ZV9heGlzX3R1cGxl2gdNQUVycm9y2glNYXNrRXJyb3LaCE1hc2tUeXBl2gtNYXNrZWRBcnJhedoDYWJz2ghhYnNvbHV0ZdoDYWRk2gNhbGzaCGFsbGNsb3Nl2ghhbGxlcXVhbNoHYWxsdHJ1ZXIIAAAAcgkAAAByDgAAANoEYW5vbdoJYW5vbWFsaWVz2gNhbnnaBmFwcGVuZNoGYXJhbmdl2gZhcmNjb3PaB2FyY2Nvc2jaBmFyY3NpbtoHYXJjc2luaNoGYXJjdGFu2gdhcmN0YW4y2gdhcmN0YW5o2gZhcmdtYXjaBmFyZ21pbtoHYXJnc29ydNoGYXJvdW5kcg0AAADaCmFzYW55YXJyYXnaB2FzYXJyYXnaC2JpdHdpc2VfYW5k2gpiaXR3aXNlX29y2gtiaXR3aXNlX3hvcnILAAAA2gRjZWls2gZjaG9vc2XaBGNsaXDaEWNvbW1vbl9maWxsX3ZhbHVl2ghjb21wcmVzc9oKY29tcHJlc3NlZNoLY29uY2F0ZW5hdGXaCWNvbmp1Z2F0ZdoIY29udm9sdmXaBGNvcHnaCWNvcnJlbGF0ZdoDY29z2gRjb3No2gVjb3VudNoHY3VtcHJvZNoGY3Vtc3Vt2hJkZWZhdWx0X2ZpbGxfdmFsdWXaBGRpYWfaCGRpYWdvbmFs2gRkaWZm2gZkaXZpZGXaBGR1bXDaBWR1bXBz2gVlbXB0edoKZW1wdHlfbGlrZdoFZXF1YWzaA2V4cHIVAAAA2gRmYWJz2gZmaWxsZWTaC2ZpeF9pbnZhbGlk2gxmbGF0dGVuX21hc2vaGGZsYXR0ZW5fc3RydWN0dXJlZF9hcnJhedoFZmxvb3LaDGZsb29yX2RpdmlkZdoEZm1vZNoKZnJvbWJ1ZmZlctoIZnJvbWZsZXjaDGZyb21mdW5jdGlvbtoHZ2V0ZGF0YdoHZ2V0bWFza9oMZ2V0bWFza2FycmF52gdncmVhdGVy2g1ncmVhdGVyX2VxdWFs2gtoYXJkZW5fbWFza9oFaHlwb3TaCGlkZW50aXR52gNpZHPaB2luZGljZXPaBWlubmVy2gxpbm5lcnByb2R1Y3TaBGlzTUHaDWlzTWFza2VkQXJyYXnaB2lzX21hc2vaCWlzX21hc2tlZNoHaXNhcnJhedoKbGVmdF9zaGlmdNoEbGVzc9oKbGVzc19lcXVhbNoEbG9hZNoFbG9hZHPaA2xvZ9oFbG9nMTDaBGxvZzLaC2xvZ2ljYWxfYW5k2gtsb2dpY2FsX25vdNoKbG9naWNhbF9vctoLbG9naWNhbF94b3LaCW1ha2VfbWFza9oPbWFrZV9tYXNrX2Rlc2Ny2g5tYWtlX21hc2tfbm9uZdoHbWFza19vctoGbWFza2Vk2gxtYXNrZWRfYXJyYXnaDG1hc2tlZF9lcXVhbNoObWFza2VkX2dyZWF0ZXLaFG1hc2tlZF9ncmVhdGVyX2VxdWFs2g1tYXNrZWRfaW5zaWRl2g5tYXNrZWRfaW52YWxpZNoLbWFza2VkX2xlc3PaEW1hc2tlZF9sZXNzX2VxdWFs2hBtYXNrZWRfbm90X2VxdWFs2g1tYXNrZWRfb2JqZWN02g5tYXNrZWRfb3V0c2lkZdoTbWFza2VkX3ByaW50X29wdGlvbtoQbWFza2VkX3NpbmdsZXRvbtoNbWFza2VkX3ZhbHVlc9oMbWFza2VkX3doZXJl2gNtYXjaB21heGltdW3aEm1heGltdW1fZmlsbF92YWx1ZdoEbWVhbtoDbWlu2gdtaW5pbXVt2hJtaW5pbXVtX2ZpbGxfdmFsdWXaA21vZNoIbXVsdGlwbHnaBW12b2lk2gRuZGlt2ghuZWdhdGl2ZdoGbm9tYXNr2gdub256ZXJv2glub3RfZXF1YWzaBG9uZXPaBW91dGVy2gxvdXRlcnByb2R1Y3TaBXBvd2Vy2gRwcm9k2gdwcm9kdWN02gNwdHDaA3B1dNoHcHV0bWFza9oEcmFua9oFcmF2ZWzaCXJlbWFpbmRlctoGcmVwZWF02gdyZXNoYXBl2gZyZXNpemXaC3JpZ2h0X3NoaWZ02gVyb3VuZNoGcm91bmRf2g5zZXRfZmlsbF92YWx1ZdoFc2hhcGXaA3NpbtoEc2luaNoEc2l6ZdoLc29mdGVuX21hc2vaCHNvbWV0cnVl2gRzb3J02gRzcXJ02gdzcXVlZXpl2gNzdGTaCHN1YnRyYWN02gNzdW3aCHN3YXBheGVz2gR0YWtl2gN0YW7aBHRhbmjaBXRyYWNl2gl0cmFuc3Bvc2XaC3RydWVfZGl2aWRl2gN2YXLaBXdoZXJl2gV6ZXJvc2MAAAAAAAAAAAAAAAABAAAAQAAAAHMMAAAAZQBaAWQAWgJkAVMAKQLaGE1hc2tlZEFycmF5RnV0dXJlV2FybmluZ04pA9oIX19uYW1lX1/aCl9fbW9kdWxlX1/aDF9fcXVhbG5hbWVfX6kAcssAAAByywAAAPpAL29wdC9hbHQvcHl0aG9uMzcvbGliNjQvcHl0aG9uMy43L3NpdGUtcGFja2FnZXMvbnVtcHkvbWEvY29yZS5weXLHAAAAXQAAAHMCAAAACAFyxwAAAGMBAAAAAAAAAAEAAAAFAAAAQwAAAHMmAAAAfABqAGQBawFyDmQCUwB0AWoCZAN0A2QEZAWNAwEAZAZTAGQGUwApB2GpAQAACiAgICBBZGp1c3QgdGhlIGF4aXMgcGFzc2VkIHRvIGFyZ3NvcnQsIHdhcm5pbmcgaWYgbmVjZXNzYXJ5CgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYXJyCiAgICAgICAgVGhlIGFycmF5IHdoaWNoIGFyZ3NvcnQgd2FzIGNhbGxlZCBvbgoKICAgIG5wLm1hLmFyZ3NvcnQgaGFzIGEgbG9uZy10ZXJtIGJ1ZyB3aGVyZSB0aGUgZGVmYXVsdCBvZiB0aGUgYXhpcyBhcmd1bWVudAog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bCBmb3IgY2FsY3VsYXRpbmcgYSBmaWxsIHZhbHVlIHN1aXRhYmxlIGZvcgogICAgdGFraW5nIHRoZSBtaW5pbXVtIG9mIGFuIGFycmF5IHdpdGggYSBnaXZlbiBkdHlwZS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBvYmogOiBuZGFycmF5IG9yIGR0eXBlCiAgICAgICAgQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHF1ZXJpZWQgZm9yIGl0J3MgbnVtZXJpYyB0eXBlLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHZhbCA6IHNjYWxhcgogICAgICAgIFRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgdmFsdWUuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIFR5cGVFcnJvcgogICAgICAgIElmIGBvYmpgIGlzbid0IGEgc3VpdGFibGUgbnVtZXJpYyB0eXBlLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbWF4aW11bV9maWxsX3ZhbHVlIDogVGhlIGludmVyc2UgZnVuY3Rpb24uCiAgICBzZXRfZmlsbF92YWx1ZSA6IFNldCB0aGUgZmlsbGluZyB2YWx1ZSBvZiBhIG1hc2tlZCBhcnJheS4KICAgIE1hc2tlZEFycmF5LmZpbGxfdmFsdWUgOiBSZXR1cm4gY3VycmVudCBmaWxsIHZhbHVlLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGltcG9ydCBudW1weS5tYSBhcyBtYQogICAgPj4+IGEgPSBucC5pbnQ4KCkKICAgID4+PiBtYS5taW5pbXVtX2ZpbGxfdmFsdWUoYSkKICAgIDEyNwogICAgPj4+IGEgPSBucC5pbnQzMigpCiAgICA+Pj4gbWEubWluaW11bV9maWxsX3ZhbHVlKGEpCiAgICAyMTQ3NDgzNjQ3CgogICAgQW4gYXJyYXkgb2YgbnVtZXJpYyBkYXRhIGNhbiBhbHNvIGJlIHBhc3NlZC4KCiAgICA+Pj4gYSA9IG5wLmFycmF5KFsxLCAyLCAzXSwgZHR5cGU9bnAuaW50OCkKICAgID4+PiBtYS5taW5pbXVtX2ZpbGxfdmFsdWUoYSkK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AAAAAgAAAAMAAABDAAAAcxgAAAB0AHwAdAGDAnIUfACgAnwBoQEBAGQBUwApAmHEBQAACiAgICBTZXQgdGhlIGZpbGxpbmcgdmFsdWUgb2YgYSwgaWYgYSBpcyBhIG1hc2tlZCBhcnJheS4KCiAgICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGZpbGwgdmFsdWUgb2YgdGhlIG1hc2tlZCBhcnJheSBgYWAgaW4gcGxhY2UuCiAgICBJZiBgYWAgaXMgbm90IGEgbWFza2VkIGFycmF5LCB0aGUgZnVuY3Rpb24gcmV0dXJucyBzaWxlbnRseSwgd2l0aG91dAogICAgZG9pbmcgYW55dGhpbmcuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheS4KICAgIGZpbGxfdmFsdWUgOiBkdHlwZQogICAgICAgIEZpbGxpbmcgdmFsdWUuIEEgY29uc2lzdGVuY3kgdGVzdCBpcyBwZXJmb3JtZWQgdG8gbWFrZSBzdXJlCiAgICAgICAgdGhlIHZhbHVlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZHR5cGUgb2YgYGFgLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIE5vbmUKICAgICAgICBOb3RoaW5nIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBtYXhpbXVtX2ZpbGxfdmFsdWUgOiBSZXR1cm4gdGhlIGRlZmF1bHQgZmlsbCB2YWx1ZSBmb3IgYSBkdHlwZS4KICAgIE1hc2tlZEFycmF5LmZpbGxfdmFsdWUgOiBSZXR1cm4gY3VycmVudCBmaWxsIHZhbHVlLgogICAgTWFza2VkQXJyYXkuc2V0X2ZpbGxfdmFsdWUgOiBFcXVpdmFsZW50IG1ldGhvZC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBpbXBvcnQgbnVtcHkubWEgYXMgbWEKICAgID4+PiBhID0gbnAuYXJhbmdlKDUpCiAgICA+Pj4gYQogICAgYXJyYXkoWzAsIDEsIDIsIDMsIDRdKQogICAgPj4+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dWUuCgogICAgSWYgYGFgIGlzIG5vdCBhIGBNYXNrZWRBcnJheWAsIGBhYCBpdHNlbGYgaXMgcmV0dXJuZWQuCiAgICBJZiBgYWAgaXMgYSBgTWFza2VkQXJyYXlgIGFuZCBgZmlsbF92YWx1ZWAgaXMgTm9uZSwgYGZpbGxfdmFsdWVgIGlzIHNldCB0bwogICAgYGBhLmZpbGxfdmFsdWVgYC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogTWFza2VkQXJyYXkgb3IgYXJyYXlfbGlrZQogICAgICAgIEFuIGlucHV0IG9iamVjdC4KICAgIGZpbGxfdmFsdWUgOiBzY2FsYXIsIG9wdGlvbmFsCiAgICAgICAgRmlsbGluZyB2YWx1ZS4gRGVmYXVsdCBpcyBOb25lLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGEgOiBuZGFycmF5CiAgICAgICAgVGhlIGZpbGxlZCBhcnJheS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGNvbXByZXNzZWQKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAubWEuYXJyYXkobnAuYXJhbmdlKDkpLnJlc2hhcGUoMywgMyksIG1hc2s9W1sxLCAwLCAwXSwKICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLCAwLCAwXSwKICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwLCAwXV0pCiAgICA+Pj4geC5maWxsZWQoKQogICAgYXJyYXkoW1s5OTk5OTksICAgICAgMSwgICAgICAyXSwKICAgICAgICAgICBbOTk5OTk5LCAgICAgIDQsICAgICAgNV0sCiAgICAgICAgICAgWyAgICAgNiwgICAgICA3LCAgICAgIDhdXSkKCiAgICByVAAAAHLgAAAATikHcvoAAAByVAAAAHL8AAAAcgcAAADaBGRpY3Ry8gAAAHINAAAAKQJyJQEAAHIjAQAAcssAAAByywAAAHLMAAAAclQAAAB1AgAAcw4AAAAAIwoBCgEKAgQBCgEMAmMAAAAAAAAAAAUAAAAEAAAARwAAAHOIAAAAdAB8AIMBZAFrAnIufABkAhkAfQF0AXwBdAKDAnIodAN8AYMBfQJxdnQCfQJuSGQDZASEAHwARACDAX0DfANkAhkAfQJ0BHwCdAKDAnNSdAJ9AngifANkAWQFhQIZAEQAXRJ9BHQEfAR8AoMCcmB8BH0CcWBXAHwCagVkBmsCcoR0AlMAfAJTACkHeo0KICAgIFJldHVybiB0aGUgeW91bmdlc3Qgc3ViY2xhc3Mgb2YgTWFza2VkQXJyYXkgZnJvbSBhIGxpc3Qgb2YgKG1hc2tlZCkgYXJyYXlzLgoKICAgIEluIGNhc2Ugb2Ygc2libGluZ3MsIHRoZSBmaXJzdCBsaXN0ZWQgdGFrZXMgb3Zlci4KCiAgICByzQAAAHIBAAAAYwEAAAAAAAAAAgAAAAQAAABTAAAAcxQAAABnAHwAXQx9AXQAfAGDAZECcQRTAHLLAAAAKQHaBHR5cGUpAnL0AAAAciUBAAByywAAAHLLAAAAcswAAABy9gAAALECAABzAgAAAAYAeidnZXRfbWFza2VkX3N1YmNsYXNzLjxsb2NhbHM+LjxsaXN0Y29tcD5O2g5NYXNrZWRDb25zdGFudCkGchYBAABy/AAAAHIbAAAAcisBAADaCmlzc3ViY2xhc3NyyAAAACkF2gZhcnJheXNy0gAAANoEcmNsc1oGYXJyY2xz2gNjbHNyywAAAHLLAAAAcswAAADaE2dldF9tYXNrZWRfc3ViY2xhc3OjAgAAcx4AAAAABwwBCAEKAQoCBgIOAQgBCgEEARIBCgEIAgoBBAFyMQEAAGMCAAAAAAAAAAMAAAAIAAAAQwAAAHNCAAAAeQp8AGoAfQJXAG4kBAB0AWsKci4BAAEAAQB0AmoDfABkAXwBZAKNA30CWQBuAlgAfAFzPnwCoAR0BaEBUwB8AlMAKQNhRQQAAAogICAgUmV0dXJuIHRoZSBkYXRhIG9mIGEgbWFza2VkIGFycmF5IGFzIGFuIG5kYXJyYXkuCgogICAgUmV0dXJuIHRoZSBkYXRhIG9mIGBhYCAoaWYgYW55KSBhcyBhbiBuZGFycmF5IGlmIGBhYCBpcyBhIGBgTWFza2VkQXJyYXlgYCwKICAgIGVsc2UgcmV0dXJuIGBhYCBhcyBhIG5kYXJyYXkgb3Igc3ViY2xhc3MgKGRlcGVuZGluZyBvbiBgc3Vib2tgKSBpZiBub3QuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBgYE1hc2tlZEFycmF5YGAsIGFsdGVybmF0aXZlbHkgYSBuZGFycmF5IG9yIGEgc3ViY2xhc3MgdGhlcmVvZi4KICAgIHN1Ym9rIDogYm9vbAogICAgICAgIFdoZXRoZXIgdG8gZm9yY2UgdGhlIG91dHB1dCB0byBiZSBhIGBwdXJlYCBuZGFycmF5IChGYWxzZSkgb3IgdG8KICAgICAgICByZXR1cm4gYSBzdWJjbGFzcyBvZiBuZGFycmF5IGlmIGFwcHJvcHJpYXRlIChUcnVlLCBkZWZhdWx0KS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGdldG1hc2sgOiBSZXR1cm4gdGhlIG1hc2sgb2YgYSBtYXNrZWQgYXJyYXksIG9yIG5vbWFzay4KICAgIGdldG1hc2thcnJheSA6IFJldHVybiB0aGUgbWFzayBvZiBhIG1hc2tlZCBhcnJheSwgb3IgZnVsbCBhcnJheSBvZiBGYWxzZS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBpbXBvcnQgbnVtcHkubWEgYXMgbWEKICAgID4+PiBhID0gbWEubWFza2VkX2VxdWFsKFtbMSwyXSxbMyw0XV0sIDIpCiAgICA+Pj4gYQogICAgbWFza2VkX2FycmF5KGRhdGEgPQogICAgIFtbMSAtLV0KICAgICBbMyA0XV0sCiAgICAgICAgICBtYXNrID0KICAgICBbW0ZhbHNlICBUcnVlXQogICAgIFtGYWxzZSBGYWxzZV1dLAogICAgICAgICAgZmlsbF92YWx1ZT05OTk5OTkpCiAgICA+Pj4gbWEuZ2V0ZGF0YShhKQogICAgYXJyYXkoW1sxLCAyXSwKICAgICAgICAgICBbMywgNF1dKQoKICAgIEVxdWl2YWxlbnRseSB1c2UgdGhlIGBgTWFza2VkQXJyYXlgYCBgZGF0YWAgYXR0cmlidXRlLgoKICAgID4+PiBhLmRhdGEKICAgIGFycmF5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ICAgICAgSW5wdXQgYE1hc2tlZEFycmF5YCBmb3Igd2hpY2ggdGhlIG1hc2sgaXMgcmVxdWlyZWQuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBnZXRkYXRhIDogUmV0dXJuIHRoZSBkYXRhIG9mIGEgbWFza2VkIGFycmF5IGFzIGFuIG5kYXJyYXkuCiAgICBnZXRtYXNrYXJyYXkgOiBSZXR1cm4gdGhlIG1hc2sgb2YgYSBtYXNrZWQgYXJyYXksIG9yIGZ1bGwgYXJyYXkgb2YgRmFsc2UuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gaW1wb3J0IG51bXB5Lm1hIGFzIG1hCiAgICA+Pj4gYSA9IG1hLm1hc2tlZF9lcXVhbChbWzEsMl0sWzMsNF1dLCAyKQogICAgPj4+IGEKICAgIG1hc2tlZF9hcnJheShkYXRhID0KICAgICBbWzEgLS1dCiAgICAgWzMgNF1dLAogICAgICAgICAgbWFzayA9CiAgICAgW1tGYWxzZSAgVHJ1ZV0KICAgICBbRmFsc2UgRmFsc2VdXSwKICAgICAgICAgIGZpbGxfdmFsdWU9OTk5OTk5KQogICAgPj4+IG1hLmdldG1hc2soYSkKICAgIGFycmF5KFtbRmFsc2UsICBUcnVlXSwKICAgICAgICAgICBbRmFsc2UsIEZhbHNlXV0sIGR0eXBlPWJvb2wpCgogICAgRXF1aXZhbGVudGx5IHVzZSB0aGUgYE1hc2tlZEFycmF5YCBgbWFza2AgYXR0cmlidXRlLgoKICAgID4+PiBhLm1hc2sKICAgIGFycmF5KFtbRmFsc2UsICBUcnVlXSwKICAgICAgICAgICBbRmFsc2UsIEZhbHNlXV0sIGR0eXBlPWJvb2wpCgogICAgUmVzdWx0IHdoZW4gbWFzayA9PSBgbm9tYXNrYAoKICAgID4+PiBiID0gbWEubWFza2VkX2FycmF5KFtbMSwyXSxbMyw0XV0pCiAgICA+Pj4gYgogICAgbWFza2VkX2FycmF5KGRhdGEgPQogICAgIFtbMSAyXQogICAgIFszIDRdXSwKICAgICAgICAgIG1hc2sgPQogICAgIEZhbHNlLAogICAgICAgICAgZmlsbF92YWx1ZT05OTk5OTkp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cnMKICAgIC0tLS0tLS0tLS0KICAgIG0gOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgdG8gdGVzdC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICByZXN1bHQgOiBib29sCiAgICAgICAgVHJ1ZSBpZiBgbS5kdHlwZS50eXBlYCBpcyBNYXNrVHlwZSwgRmFsc2Ugb3RoZXJ3aXNlLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgaXNNYXNrZWRBcnJheSA6IFRlc3Qgd2hldGhlciBpbnB1dCBpcyBhbiBpbnN0YW5jZSBvZiBNYXNrZWRBcnJheS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBpbXBvcnQgbnVtcHkubWEgYXMgbWEKICAgID4+PiBtID0gbWEubWFza2VkX2VxdWFsKFswLCAxLCAwLCAyLCAzXSwgMCkKICAgID4+PiBtCiAgICBtYXNrZWRfYXJyYXkoZGF0YSA9IFstLSAxIC0tIDIgM10sCiAgICAgICAgICBtYXNrID0gWyBUcnVlIEZhbHNlICBUcnVlIEZhbHNlIEZhbHNlXSwKICAgICAgICAgIGZpbGxfdmFsdWU9OTk5OTk5KQogICAgPj4+IG1hLmlzX21hc2sobSkKICAgIEZhbHNlCiAgICA+Pj4gbWEuaXNfbWFzayhtLm1hc2spCiAgICBUcnVlCgogICAgSW5wdXQgbXVzdCBiZSBhbiBuZGFycmF5IChvciBoYXZlIHNpbWlsYXIgYXR0cmlidXRlcykKICAgIGZvciBpdCB0byBiZSBjb25zaWRlcmVkIGEgdmFsaWQgbWFzay4KCiAgICA+Pj4gbSA9IFtGYWxzZSwgVHJ1ZSwgRmFsc2VdCiAgICA+Pj4gbWEuaXNfbWFzayhtKQogICAgRmFsc2UKICAgID4+PiBtID0gbnAuYXJyYXkoW0ZhbHNlLCBUcnVlLCBGYWxzZV0pCiAgICA+Pj4gbQogICAgYXJyYXkoW0ZhbHNlLCAgVHJ1ZSwgRmFsc2VdLCBkdHlwZT1ib29sKQogICAgPj4+IG1hLmlzX21hc2sobSkKICAgIFRydWUKCiAgICBBcnJheXMgd2l0aCBjb21wbGV4IGR0eXBlcyBkb24ndCByZXR1cm4gVHJ1ZS4KCiAgICA+Pj4gZHR5cGUgPSBucC5kdHlwZSh7J25hbWVzJzpbJ21vbnR5JywgJ3BpdGhvbiddLAogICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtYXRzJzpbbnAuYm9vbCwgbnAuYm9vbF19KQogICAgPj4+IGR0eXBlCiAgICBkdHlwZShbKCdtb250eScsICd8YjEnKSwgKCdwaXRob24nLCAnfGIxJyldKQogICAgPj4+IG0gPSBucC5hcnJheShbKFRydWUsIEZhbHNlKSwgKEZhbHNlLCBUcnVlKSwgKFRydWUsIEZhbHNlKV0sCiAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWR0eXBlKQogICAgPj4+IG0KICAgIGFycmF5KFsoVHJ1ZSwgRmFsc2UpLCAoRmFsc2UsIFRydWUpLCAoVHJ1ZSwgRmFsc2UpXSwKICAgICAgICAgIGR0eXBlPVsoJ21vbnR5JywgJ3xiMScpLCAoJ3BpdGhvbicsICd8YjEnKV0pCiAgICA+Pj4gbWEuaXNfbWFzayhtKQogICAgRmFsc2UKCiAgICBGTikEcvgAAAByKwEAAHIaAAAAcjQBAAApAXLqAAAAcssAAAByywAAAHLMAAAAcmwAAADrBQAAcwgAAAAAPgIBDAEOAUZjBAAAAAAAAAAFAAAABgAAAEMAAABzTAAAAHwAdABrCHIMdABTAHQBfAODAX0DdAJqA3QEfABkAYMCfAF8A2QBZAKNBH0EfAJyRHwEagVqBnNEfASgB6EAc0R0AFMAfARTAGQDUwApBGG5CAAACiAgICBDcmVhdGUgYSBib29sZWFuIG1hc2sgZnJvbSBhbiBhcnJheS4KCiAgICBSZXR1cm4gYG1gIGFzIGEgYm9vbGVhbiBtYXNrLCBjcmVhdGluZyBhIGNvcHkgaWYgbmVjZXNzYXJ5IG9yIHJlcXVlc3RlZC4KICAgIFRoZSBmdW5jdGlvbiBjYW4gYWNjZXB0IGFueSBzZXF1ZW5jZSB0aGF0IGlzIGNvbnZlcnRpYmxlIHRvIGludGVnZXJzLAogICAgb3IgYGBub21hc2tgYC4gIERvZXMgbm90IHJlcXVpcmUgdGhhdCBjb250ZW50cyBtdXN0IGJlIDBzIGFuZCAxcywgdmFsdWVzCiAgICBvZiAwIGFyZSBpbnRlcmVwcmV0ZWQgYXMgRmFsc2UsIGV2ZXJ5dGhpbmcgZWxzZSBhcyBUcnVlLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIG0gOiBhcnJheV9saWtlCiAgICAgICAgUG90ZW50aWFsIG1hc2suCiAgICBjb3B5IDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBXaGV0aGVyIHRvIHJldHVybiBhIGNvcHkgb2YgYG1gIChUcnVlKSBvciBgbWAgaXRzZWxmIChGYWxzZSkuCiAgICBzaHJpbmsgOiBib29sLCBvcHRpb25hbAogICAgICAgIFdoZXRoZXIgdG8gc2hyaW5rIGBtYCB0byBgYG5vbWFza2BgIGlmIGFsbCBpdHMgdmFsdWVzIGFyZSBGYWxzZS4KICAgIGR0eXBlIDogZHR5cGUsIG9wdGlvbmFsCiAgICAgICAgRGF0YS10eXBlIG9mIHRoZSBvdXRwdXQgbWFzay4gQnkgZGVmYXVsdCwgdGhlIG91dHB1dCBtYXNrIGhhcyBhCiAgICAgICAgZHR5cGUgb2YgTWFza1R5cGUgKGJvb2wpLiBJZiB0aGUgZHR5cGUgaXMgZmxleGlibGUsIGVhY2ggZmllbGQgaGFzCiAgICAgICAgYSBib29sZWFuIGR0eXBlLiBUaGlzIGlzIGlnbm9yZWQgd2hlbiBgbWAgaXMgYGBub21hc2tgYCwgaW4gd2hpY2gKICAgICAgICBjYXNlIGBgbm9tYXNrYGAgaXMgYWx3YXlzIHJldHVybmVkLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHJlc3VsdCA6IG5kYXJyYXkKICAgICAgICBBIGJvb2xlYW4gbWFzayBkZXJpdmVkIGZyb20gYG1gLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGltcG9ydCBudW1weS5tYSBhcyBtYQogICAgPj4+IG0gPSBbVHJ1ZSwgRmFsc2UsIFRydWUsIFRydWVdCiAgICA+Pj4gbWEubWFrZV9tYXNrKG0pCiAgICBhcnJheShbIFRydWUsIEZhbHNlLCAgVHJ1ZSwgIFRydWVdLCBkdHlwZT1ib29sKQogICAgPj4+IG0gPSBbMSwgMCwgMSwgMV0KICAgID4+PiBtYS5tYWtlX21hc2sobSkKICAgIGFycmF5KFsgVHJ1ZSwgRmFsc2UsICBUcnVlLCAgVHJ1ZV0sIGR0eXBlPWJvb2wpCiAgICA+Pj4gbSA9IFsxLCAwLCAyLCAtM10KICAgID4+PiBtYS5tYWtlX21hc2sobSkKICAgIGFycmF5KFsgVHJ1ZSwgRmFsc2UsICBUcnVlLCAgVHJ1ZV0sIGR0eXBlPWJvb2wpCgogICAgRWZmZWN0IG9mIHRoZSBgc2hyaW5rYCBwYXJhbWV0ZXIuCgogICAgPj4+IG0gPSBucC56ZXJvcyg0KQogICAgPj4+IG0KICAgIGFycmF5KFsgMC4sICAwLiwgIDAuLCAgMC5dKQogICAgPj4+IG1hLm1ha2VfbWFzayhtKQogICAgRmFsc2UKICAgID4+PiBtYS5tYWtlX21hc2sobSwgc2hyaW5rPUZhbHNlKQogICAgYXJyYXkoW0ZhbHNlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwgZHR5cGU9Ym9vbCkKCiAgICBVc2luZyBhIGZsZXhpYmxlIGBkdHlwZWAuCgogICAgPj4+IG0gPSBbMSwgMCwgMSwgMV0KICAgID4+PiBuID0gWzAsIDEsIDAsIDBdCiAgICA+Pj4gYXJyID0gW10KICAgID4+PiBmb3IgbWFuLCBtb3VzZSBpbiB6aXAobSwgbik6CiAgICAuLi4gICAgIGFyci5hcHBlbmQoKG1hbiwgbW91c2UpKQogICAgPj4+IGFycgogICAgWygxLCAwKSwgKDAsIDEpLCAoMSwgMCksICgxLCAwKV0KICAgID4+PiBkdHlwZSA9IG5wLmR0eXBlKHsnbmFtZXMnOlsnbWFuJywgJ21vdXNlJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHMnOltucC5pbnQsIG5wLmludF19KQogICAgPj4+IGFyciA9IG5wLmFycmF5KGFyciwgZHR5cGU9ZHR5cGUpCiAgICA+Pj4gYXJyCiAgICBhcnJheShbKDEsIDApLCAoMCwgMSksICgxLCAwKSwgKDEsIDApXSwKICAgICAgICAgIGR0eXBlPVsoJ21hbicsICc8aTQnKSwgKCdtb3VzZScsICc8aTQnKV0pCiAgICA+Pj4gbWEu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ICAgICAgICBgYWAgaW4gcGxhY2UgYW5kIHJldHVybiBhIHZpZXcuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgcmVzdWx0IDogTWFza2VkQXJyYXkKICAgICAgICBUaGUgcmVzdWx0IG9mIG1hc2tpbmcgYGFgIHdoZXJlIGBjb25kaXRpb25gIGlzIFRydWUuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBtYXNrZWRfdmFsdWVzIDogTWFzayB1c2luZyBmbG9hdGluZyBwb2ludCBlcXVhbGl0eS4KICAgIG1hc2tlZF9lcXVhbCA6IE1hc2sgd2hlcmUgZXF1YWwgdG8gYSBnaXZlbiB2YWx1ZS4KICAgIG1hc2tlZF9ub3RfZXF1YWwgOiBNYXNrIHdoZXJlIGBub3RgIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUuCiAgICBtYXNrZWRfbGVzc19lcXVhbCA6IE1hc2sgd2hlcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUuCiAgICBtYXNrZWRfZ3JlYXRlcl9lcXVhbCA6IE1hc2sgd2hlcmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUuCiAgICBtYXNrZWRfbGVzcyA6IE1hc2sgd2hlcmUgbGVzcyB0aGFuIGEgZ2l2ZW4gdmFsdWUuCiAgICBtYXNrZWRfZ3JlYXRlciA6IE1hc2sgd2hlcmUgZ3JlYXRlciB0aGFuIGEgZ2l2ZW4gdmFsdWUuCiAgICBtYXNrZWRfaW5zaWRlIDogTWFzayBpbnNpZGUgYSBnaXZlbiBpbnRlcnZhbC4KICAgIG1hc2tlZF9vdXRzaWRlIDogTWFzayBvdXRzaWRlIGEgZ2l2ZW4gaW50ZXJ2YWwuCiAgICBtYXNrZWRfaW52YWxpZCA6IE1hc2sgaW52YWxpZCB2YWx1ZXMgKE5hTnMgb3IgaW5mcykuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gaW1wb3J0IG51bXB5Lm1hIGFzIG1hCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSg0KQogICAgPj4+IGEKICAgIGFycmF5KFswLCAxLCAyLCAzXSkKICAgID4+PiBtYS5tYXNrZWRfd2hlcmUoYSA8PSAyLCBhKQogICAgbWFza2VkX2FycmF5KGRhdGEgPSBbLS0gLS0gLS0gM10sCiAgICAgICAgICBtYXNrID0gWyBUcnVlICBUcnVlICBUcnVlIEZhbHNlXSwKICAgICAgICAgIGZpbGxfdmFsdWU9OTk5OTk5KQoKICAgIE1hc2sgYXJyYXkgYGJgIGNvbmRpdGlvbmFsIG9uIGBhYC4KCiAgICA+Pj4gYiA9IFsnYScsICdiJywgJ2MnLCAnZCddCiAgICA+Pj4gbWEubWFza2VkX3doZXJlKGEgPT0gMiwgYikKICAgIG1hc2tlZF9hcnJheShkYXRhID0gW2EgYiAtLSBkXSwKICAgICAgICAgIG1hc2sgPSBbRmFsc2UgRmFsc2UgIFRydWUgRmFsc2VdLAogICAgICAgICAgZmlsbF92YWx1ZT1OL0EpCgogICAgRWZmZWN0IG9mIHRoZSBgY29weWAgYXJndW1lbnQuCgogICAgPj4+IGMgPSBtYS5tYXNrZWRfd2hlcmUoYSA8PSAyLCBhKQogICAgPj4+IGMKICAgIG1hc2tlZF9hcnJheShkYXRhID0gWy0tIC0tIC0tIDNdLAogICAgICAgICAgbWFzayA9IFsgVHJ1ZSAgVHJ1ZSAgVHJ1ZSBGYWxzZV0sCiAgICAgICAgICBmaWxsX3ZhbHVlPTk5OTk5OSkKICAgID4+PiBjWzBdID0gOTkKICAgID4+PiBjCiAgICBtYXNrZWRfYXJyYXkoZGF0YSA9IFs5OSAtLSAtLSAzXSwKICAgICAgICAgIG1hc2sgPSBbRmFsc2UgIFRydWUgIFRydWUgRmFsc2VdLAogICAgICAgICAgZmlsbF92YWx1ZT05OTk5OTkpCiAgICA+Pj4gYQogICAgYXJyYXkoWzAsIDEsIDIsIDNdKQogICAgPj4+IGMgPSBtYS5tYXNrZWRfd2hlcmUoYSA8PSAyLCBhLCBjb3B5PUZhbHNlKQogICAgPj4+IGNbMF0gPSA5OQogICAgPj4+IGMKICAgIG1hc2tlZF9hcnJheShkYXRhID0gWzk5IC0tIC0tIDNdLAogICAgICAgICAgbWFzayA9IFtGYWxzZSAgVHJ1ZSAgVHJ1ZSBGYWxzZV0sCiAgICAgICAgICBmaWxsX3Zh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ICAgIEFycmF5IHRvIG1hc2sKICAgIHZhbHVlIDogb2JqZWN0CiAgICAgICAgQ29tcGFyaXNvbiB2YWx1ZQogICAgY29weSA6IHtUcnVlLCBGYWxzZX0sIG9wdGlvbmFsCiAgICAgICAgV2hldGhlciB0byByZXR1cm4gYSBjb3B5IG9mIGB4YC4KICAgIHNocmluayA6IHtUcnVlLCBGYWxzZX0sIG9wdGlvbmFsCiAgICAgICAgV2hldGhlciB0byBjb2xsYXBzZSBhIG1hc2sgZnVsbCBvZiBGYWxzZSB0byBub21hc2sKCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICByZXN1bHQgOiBNYXNrZWRBcnJheQogICAgICAgIFRoZSByZXN1bHQgb2YgbWFza2luZyBgeGAgd2hlcmUgZXF1YWwgdG8gYHZhbHVlYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG1hc2tlZF93aGVyZSA6IE1hc2sgd2hlcmUgYSBjb25kaXRpb24gaXMgbWV0LgogICAgbWFza2VkX2VxdWFsIDogTWFzayB3aGVyZSBlcXVhbCB0byBhIGdpdmVuIHZhbHVlIChpbnRlZ2VycykuCiAgICBtYXNrZWRfdmFsdWVzIDogTWFzayB1c2luZyBmbG9hdGluZyBwb2ludCBlcXVhbGl0eS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBpbXBvcnQgbnVtcHkubWEgYXMgbWEKICAgID4+PiBmb29kID0gbnAuYXJyYXkoWydncmVlbl9lZ2dzJywgJ2hhbSddLCBkdHlwZT1vYmplY3QpCiAgICA+Pj4gIyBkb24ndCBlYXQgc3BvaWxlZCBmb29kCiAgICA+Pj4gZWF0ID0gbWEubWFza2VkX29iamVjdChmb29kLCAnZ3JlZW5fZWdncycpCiAgICA+Pj4gcHJpbnQoZWF0KQogICAgWy0tIGhhbV0KICAgID4+PiAjIHBsYWluIG9sYCBoYW0gaXMgYm9yaW5nCiAgICA+Pj4gZnJlc2hfZm9vZCA9IG5wLmFycmF5KFsnY2hlZXNlJywgJ2hhbScsICdwaW5lYXBwbGUnXSwgZHR5cGU9b2JqZWN0KQogICAgPj4+IGVhdCA9IG1hLm1hc2tlZF9vYmplY3QoZnJlc2hfZm9vZCwgJ2dyZWVuX2VnZ3MnKQogICAgPj4+IHByaW50KGVhdCkKICAgIFtjaGVlc2UgaGFtIHBpbmVhcHBsZV0KCiAgICBOb3RlIHRoYXQgYG1hc2tgIGlzIHNldCB0byBgYG5vbWFza2BgIGlmIHBvc3NpYmxlLgoKICAgID4+PiBlYXQKICAgIG1hc2tlZF9hcnJheShkYXRhID0gW2NoZWVzZSBoYW0gcGluZWFwcGxlXSwKICAgICAgICAgIG1hc2sgPSBGYWxzZSwKICAgICAgICAgIGZpbGxfdmFsdWU9PykKCiAgICApAXJuAQAAKQNyNwEAAHJBAAAAciMBAAApC3JrAAAAckABAAByUQAAAHIzAQAAcjkBAABy8gAAAHI0AAAAcpsAAAByfgAAAHJ7AAAAcoAAAAApBnJBAQAAcoABAAByQQAAAHJuAQAAcn4BAAByNwEAAHLLAAAAcssAAAByzAAAAHKJAAAAoggAAHMOAAAAADMIAQ4BCAISAQQBEgHn8WjjiLX45D7nOoww4o55RT5jBgAAAAAAAAAKAAAABwAAAEMAAABzgAAAAHQAagF9BnQCfAB8AYMCfQd0A3wHagRqBXQGageDAnJKdACgCHwGfAd8ARgAgwF8A3wCfAZ8AYMBFAAXAKECfQh0CXwAgwF9CW4QdACgCnwHfAGhAn0IdAt9CXQMfAl0DXwIfAVkAY0CfAVkAY0DfQl0DnwHfAl8BHwBZAKNBFMAKQNhigcAAAogICAgTWFzayB1c2luZyBmbG9hdGluZyBwb2ludCBlcXVhbGl0eS4KCiAgICBSZXR1cm4gYSBNYXNrZWRBcnJheSwgbWFza2VkIHdoZXJlIHRoZSBkYXRhIGluIGFycmF5IGB4YCBhcmUgYXBwcm94aW1hdGVseQogICAgZXF1YWwgdG8gYHZhbHVlYCwgaS5lLiB3aGVyZSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBpcyBUcnVlCgogICAgKGFicyh4IC0gdmFsdWUpIDw9IGF0b2wrcnRvbCphYnModmFsdWUpKQoKICAgIFRoZSBmaWxsX3ZhbHVlIGlzIHNldCB0byBgdmFsdWVgIGFuZCB0aGUgbWFzayBpcyBzZXQgdG8gYGBub21hc2tgYCBpZgogICAgcG9zc2libGUuICBGb3IgaW50ZWdlcnMsIGNvbnNpZGVyIHVzaW5nIGBgbWFza2VkX2VxdWFsYGAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSB0byBtYXNrLgogICAgdmFsdWUgOiBmbG9hdAogICAgICAgIE1hc2tpbmcgdmFsdWUuCiAgICBydG9sIDogZmxvYXQsIG9wdGlvbmFsCiAgICAgICAgVG9sZXJhbmNlIHBhcmFtZXRlci4KICAgIGF0b2wgOiBmbG9hdCwgb3B0aW9uYWwKICAgICAgICBUb2xlcmFuY2UgcGFyYW1ldGVyICgxZS04KS4KICAgIGNvcHkgOiBib29sLCBvcHRpb25hbAogICAgICAgIFdoZXRoZXIgdG8gcmV0dXJuIGEgY29weSBvZiBgeGAuCiAgICBzaHJpbmsgOiBib29sLCBvcHRpb25hbAogICAgICAgIFdoZXRoZXIgdG8gY29sbGFwc2UgYSBtYXNrIGZ1bGwgb2YgRmFsc2UgdG8gYGBub21hc2tgYC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICByZXN1bHQgOiBNYXNrZWRBcnJheQogICAgICAgIFRoZSByZXN1bHQgb2YgbWFza2luZyBgeGAgd2hlcmUgYXBwcm94aW1hdGVseSBlcXVhbCB0byBgdmFsdWVgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbWFza2VkX3doZXJlIDogTWFzayB3aGVyZSBhIGNvbmRpdGlvbiBpcyBtZXQuCiAgICBtYXNrZWRfZXF1YWwgOiBNYXNrIHdoZXJlIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUgKGludGVnZXJzKS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBpbXBvcnQgbnVtcHkubWEgYXMgbWEKICAgID4+PiB4ID0gbnAuYXJyYXkoWzEsIDEuMSwgMiwgMS4xLCAzXSkKICAgID4+PiBtYS5tYXNrZWRfdmFsdWVzKHgsIDEuMSkKICAgIG1hc2tlZF9hcnJheShkYXRhID0gWzEuMCAtLSAyLjAgLS0gMy4wXSwKICAgICAg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IFN0b3BJdGVyYXRpb24uCgogICAgICAgIEV4YW1wbGVzCiAgICAgICAgLS0tLS0tLS0KICAgICAgICA+Pj4geCA9IG5wLm1hLmFycmF5KFszLCAyXSwgbWFzaz1bMCwgMV0pCiAgICAgICAgPj4+IGZsID0geC5mbGF0CiAgICAgICAgPj4+IGZsLm5leHQoKQogICAgICAgIDMKICAgICAgICA+Pj4gZmwubmV4dCgpCiAgICAgICAgbWFza2VkX2FycmF5KGRhdGEgPSAtLSwKICAgICAgICAgICAgICAgICAgICAgbWFzayA9IFRydWUsCiAgICAgICAgICAgICAgIGZpbGxfdmFsdWUgPSAxZSsyMCkKICAgICAgICA+Pj4gZmwubmV4dCgpCiAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgICAgICAgIEZpbGUgIi9ob21lL3JhbGYvcHl0aG9uL251bXB5L251bXB5L21hL2NvcmUucHkiLCBsaW5lIDIyNDMsIGluIG5leHQKICAgICAgICAgICAgZCA9IHNlbGYuZGF0YWl0ZXIubmV4dCgpCiAgICAgICAgU3RvcEl0ZXJhdGlvbgoKICAgICAgICBOKQJyNwEAAHKqAQAAKQraBG5leHRyqAEAAHKpAQAAcvwAAABy8gAAAHIeAQAAcpgAAAByXgEAAHKsAQAAcn8AAAApA3I8AQAAclQBAABy6gAAAHLLAAAAcssAAAByzAAAANoIX19uZXh0X1+JCgAAcxAAAAAAFgoBCgEKAQwBEgEEAQQBehdNYXNrZWRJdGVyYXRvci5fX25leHRfX04pCnLIAAAAcskAAAByygAAAHLaAAAAcj0BAABydgEAAHKrAQAAcq8BAABysQEAAHKwAQAAcssAAAByywAAAHLLAAAAcswAAABypgEAADkKAABzDgAAAAguBAIICQgDCA8IBQgfcqYBAABjAAAAAAAAAAAAAAAACwAAAAAAAABzNAUAAGUAWgFkAFoCZAFaA2QCWgRlBVoGZANaB2UIWglkBFoKZAVaC2QGZQVkBmQDZAdkCGQGZAdkBmQHZAZmC2QJZAqEAVoMZAtkDIQAWg1kDWQOhABaDmTpZA9kEIQBWg9k6mQRZBKEAVoQZQhqEGoDZRBfA2QTZBSEAFoRZBVkFoQAWhJkF2QYhABaE4cAZgFkGWQahAhaFGTrZBtkHIQBWhVlFVoWZB1kHoQAWhdlGGUXZRVkH2QgjQNaGWQhZCKEAFoaZCNkJIQAWhtlGGUaZCWNAVocZCZkJ4QAWh1kKGQphABaHmUYZCpkK4QAZCxkLY0CWh9kLmQvhABaIGUYZDBkK4QAZDFkLY0CWiFkMmQzhABaImUYZDRkK4QAZDVkLY0CWiNkNmQ3hABaJGUYZSRkJY0BWiVlGGUkZCWNAVomZDhkOYQAWidkOmQ7hABaKGUYZSdlKGQ8ZCCNA1opZD1kPoQAWipk7GQ/ZECEAVorZRhlKmUrZEFkII0DWixk7WRCZEOEAVotZERkRYQAWi5k7mRGZEeEAVovZEhkSYQAWjBkSmRLhABaMWRMZE2EAFoyZE5kT4QAWjNkUGRRhABaNGRSZFOEAFo1ZFRkVYQAWjZkVmRXhABaN2RYZFmEAFo4ZFpkW4QAWjlkXGRdhABaOmReZF+EAFo7ZGBkYYQAWjxkYmRjhABaPWRkZGWEAFo+ZGZkZ4QAWj9kaGRphABaQGRqZGuEAFpBZGxkbYQAWkJkbmRvhABaQ2RwZHGEAFpEZHJkc4QAWkVkdGR1hABaRmR2ZHeEAFpHZHhkeYQAWkhkemR7hABaSWR8ZH2EAFpKZH5kf4QAWktkgGSBhABaTGUYZUxkgmQtjQJaTWSDZISEAFpOZRhlTmSFZC2NAlpPZAZlUGpRZgJkhmSHhAFaUmVTZIiDAVpUZO9kimSLhAFaVWVTZIyDAVpWZI1kjoQAWldk8GSPZJCEAVpYZPFkkmSThAFaWWSUZJWEAFpaZJZkl4QAWltkBmQGZVBqUWYDZJhkmYQBWlxkBmQGZVBqUWYDZJpkm4QBWl1knGSdhABaXmTyhwBmAWSfZKCECVpfZQhqX2oDZV9fA2TzZKFkooQBWmBkBmQGZAZlUGpRZgRko2SkhAFaYWT0ZKVkpoQBWmJkBmQGZAZlUGpRZgRkp2SohAFaY2VjWmRk9WSpZKqEAVplZAZkBmQGZVBqUWYEhwBmAWSrZKyECVpmZPZkrWSuhAFaZ2QGZAZkBmQIZVBqUWYFhwBmAWSvZLCECVpoZVBqaGoDZWhfA2QGZAZkBmQIZVBqUWYFZLFksoQBWmlk92SzZLSEAVpqZVBqUWS1ZAZkB2QGZgVktmS3hAFaa2T4ZLhkuYQBWmxk+WS6ZLuEAVptZPpkvWS+hAFabmQGZAZkBmVQalFmBGS/ZMCEAVpvZPtkwWTChAFacGQGZAZkBmVQalFmBGTDZMSEAVpxZPxkxWTGhAFacocAZgFkx2TIhAhac4cAZgFkyWTKhAhadGT9ZMtkzIQBWnVlU2TNgwFadmVTZM6DAVp3ZVNkz4MBWnhlGGTQZCuEAGQljQFaeWVTZNGDAVp6ZVNk0mQDZNONAlp7ZVNkzYMBWnZlU2TUgwFafGT+ZNVk1oQBWn1k/2TXZNiEAVp+kAFkAGTZZNqEAVp/kAFkAWTdZN6EAVqAZN9k4IQAWoFlgVqChwBmAWThZOKECFqDhwBmAWTjZOSECFqEZOVk5oQAWoWQAWQCZOdk6IQBWoaHAAQAWodTACgDAQAAchsAAABhGQkAAAogICAgQW4gYXJyYXkgY2xhc3Mgd2l0aCBwb3NzaWJseSBtYXNrZWQgdmFsdWVzLgoKICAgIE1hc2tlZCB2YWx1ZXMgb2YgVHJ1ZSBleGNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZnJvbSBhbnkKICAgIGNvbXB1dGF0aW9uLgoKICAgIENvbnN0cnVjdGlvbjo6CgogICAgICB4ID0gTWFza2VkQXJyYXkoZGF0YSwgbWFzaz1ub21hc2ssIGR0eXBlPU5vbmUsIGNvcHk9RmFsc2UsIHN1Ym9rPVRydWUsCiAgICAgICAgICAgICAgICAgICAgICBuZG1pbj0wLCBmaWxsX3ZhbHVlPU5vbmUsIGtlZXBfbWFzaz1UcnVlLCBoYXJkX21hc2s9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgIHNocmluaz1UcnVlLCBvcmRlcj1Ob25lKQoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGRhdGEgOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgZGF0YS4KICAgIG1hc2sgOiBzZXF1ZW5jZSwgb3B0aW9uYWwKICAgICAgICBNYXNrLiBNdXN0IGJlIGNvbnZlcnRpYmxlIHRvIGFuIGFycmF5IG9mIGJvb2xlYW5zIHdpdGggdGhlIHNhbWUKICAgICAgICBzaGFwZSBhcyBgZGF0YWAuIFRydWUgaW5kaWNhdGVzIGEgbWFza2VkIChpLmUuIGludmFsaWQpIGRhdGEuCiAgICBkdHlwZSA6IGR0eXBlLCBvcHRpb25hbAogICAgICAgIERhdGEgdHlwZSBvZiB0aGUgb3V0cHV0LgogICAgICAgIElmIGBkdHlwZWAgaXMgTm9uZSwgdGhlIHR5cGUgb2YgdGhlIGRhdGEgYXJndW1lbnQgKGBgZGF0YS5kdHlwZWBgKQogICAgICAgIGlzIHVzZWQuIElmIGBkdHlwZWAgaXMgbm90IE5vbmUgYW5kIGRpZmZlcmVudCBmcm9tIGBgZGF0YS5kdHlwZWBgLAogICAgICAgIGEgY29weSBpcyBwZXJmb3JtZWQuCiAgICBjb3B5IDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBXaGV0aGVyIHRvIGNvcHkgdGhlIGlucHV0IGRhdGEgKFRydWUpLCBvciB0byB1c2UgYSByZWZlcmVuY2UgaW5zdGVhZC4KICAgICAgICBEZWZhdWx0IGlzIEZhbHNlLgogICAgc3Vib2sgOiBib29sLCBvcHRpb25hbAogICAgICAgIFdoZXRoZXIgdG8gcmV0dXJuIGEgc3ViY2xhc3Mgb2YgYE1hc2tlZEFycmF5YCBpZiBwb3NzaWJsZSAoVHJ1ZSkgb3IgYQogICAgICAgIHBsYWluIGBNYXNrZWRBcnJheWAuIERlZmF1bHQgaXMgVHJ1ZS4KICAgIG5kbWluIDogaW50LCBvcHRpb25hbAogICAgICAgIE1pbmltdW0gbnVtYmVyIG9mIGRpbWVuc2lvbnMuIERlZmF1bHQgaXMgMC4KICAgIGZpbGxfdmFsdWUgOiBzY2FsYXIsIG9wdGlvbmFsCiAgICAgICAgVmFsdWUgdXNlZCB0byBmaWxsIGluIHRoZSBtYXNrZWQgdmFsdWVzIHdoZW4gbmVjZXNzYXJ5LgogICAgICAgIElmIE5vbmUsIGEgZGVmYXVsdCBiYXNlZCBvbiB0aGUgZGF0YS10eXBlIGlzIHVzZWQuCiAgICBrZWVwX21hc2sgOiBib29sLCBvcHRpb25hbAogICAgICAgIFdoZXRoZXIgdG8gY29tYmluZSBgbWFza2Agd2l0aCB0aGUgbWFzayBvZiB0aGUgaW5wdXQgZGF0YSwgaWYgYW55CiAgICAgICAgKFRydWUpLCBvciB0byB1c2Ugb25seSBgbWFza2AgZm9yIHRoZSBvdXRwdXQgKEZhbHNlKS4gRGVmYXVsdCBpcyBUcnVlLgogICAgaGFyZF9tYXNrIDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBXaGV0aGVyIHRvIHVzZSBhIGhhcmQgbWFzayBvciBub3QuIFdpdGggYSBoYXJkIG1hc2ssIG1hc2tlZCB2YWx1ZXMKICAgICAgICBjYW5ub3QgYmUgdW5tYXNrZWQuIERlZmF1bHQgaXMgRmFsc2UuCiAgICBzaHJpbmsgOiBib29sLCBvcHRpb25hbAogICAgICAgIFdoZXRoZXIgdG8gZm9yY2UgY29tcHJlc3Npb24gb2YgYW4gZW1wdHkgbWFzay4gRGVmYXVsdCBpcyBUcnVlLgogICAgb3JkZXIgOiB7J0MnLCAnRicsICdBJ30sIG9wdGlvbmFsCiAgICAgICAgU3BlY2lmeSB0aGUgb3JkZXIgb2YgdGhlIGFycmF5LiAgSWYgb3JkZXIgaXMgJ0MnLCB0aGVuIHRoZSBhcnJheQogICAgICAgIHdpbGwgYmUgaW4gQy1jb250aWd1b3VzIG9yZGVyIChsYXN0LWluZGV4IHZhcmllcyB0aGUgZmFzdGVzdCkuCiAgICAgICAgSWYgb3JkZXIgaXMgJ0YnLCB0aGVuIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIGluCiAgICAgICAgRm9ydHJhbi1jb250aWd1b3VzIG9yZGVyIChmaXJzdC1pbmRleCB2YXJpZXMgdGhlIGZhc3Rlc3QpLgogICAgICAgIElmIG9yZGVyIGlzICdBJyAoZGVmYXVsdCksIHRoZW4gdGhlIHJldHVybmVkIGFycmF5IG1heSBiZQogICAgICAgIGluIGFueSBvcmRlciAoZWl0aGVyIEMtLCBGb3J0cmFuLWNvbnRpZ3VvdXMsIG9yIGV2ZW4gZGlzY29udGlndW91cyksCiAgICAgICAgdW5sZXNzIGEgY29weSBpcyByZXF1aXJlZCwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIEMtY29udGlndW91cy4KCiAgICDpDwAAAEbpZAAAAGncBQAATlRyAQAAAGMMAAAAAAAAABQAAAAIAAAACwAAAHNGAwAAdABqAXwBfAN8BHwLZAF8BmQCjQZ9DXQCfAFkA3QDfA2DAYMDfQ50BHwBdAWDAnJAfAFqBnwNagZrA3JAZAF9BHQEfAF8AIMCcmp8BXJqdAR8AXQHgwJzanQIoAl8DXQDfAGDAaECfQ1uDHQIoAl8DXwAoQJ9DXQKfAFkBIMCcpZ0BHwBdAiDAnOWfAFqC3wNXwtkAX0PfA1qDGoNcKBkBX0QfBBysnQOfA1qDIMBiQFuBHQPiQF8AnQQawiQAXKKfAhz5HwKctB0EHwNXwtuEnQAahF8DWoGiAFkBo0CfA1fC26idAR8AXQSdBNmAoMCkAFyTnkcdABqAWQHZAiEAHwBRACDAYgBZAaNAn0CVwBuGgQAdBRrCpABcioBAAEAAQB0EH0CWQBuAlgAiAF0D2sCkAFyhnwCoBWhAJABcoZ8AnwNXwtkCXwNXxZuOHwEkAFygHwNagugF6EAfA1fC2QJfA1fFnQYfAGDAXQQawmQAXKGfAFqBnwBagtfBm4GZAF8DV8WkAFuZHwCZAFrCJABcrCIAXQPawKQAXKwdABqGXwNagaIAWQGjQJ9Am5ufAJkCWsIkAFy1ogBdA9rApABctZ0AGoRfA1qBogBZAaNAn0Cbkh5FHQAagF8AnwEiAFkCo0DfQJXAG4yBAB0GmsKkAJyHAEAAQABAHQAagGHAWYBZAtkCIQIfAJEAIMBiAFkBo0CfQJZAG4CWAB8AmoGfA1qBmsDkAJyhnwNaht8AmobAgB9EX0SfBJkDGsCkAJyVHQAoBx8AnwNagahAn0Cbi58EnwRawKQAnJudACgHXwCfA1qBqECfQJuFGQNfRN0HnwTfBF8EmYCFgCDAYIBZAF9BHwNagt0EGsIkAJyonwCfA1fC3wEDAB8DV8Wbkx8CJACc7h8AnwNXwt8BAwAfA1fFm42fBCQAnLYhwBmAWQOZA+ECIkAiAB8DWoLfAKDAgEAbhB0AKAffAJ8DWoLoQJ8DV8LZAl8DV8WfAdkEGsIkANyBHQCfAFkEWQQgwN9B3wHZBBrCZADchx0IHwHfA1qDIMCfA1fIXwJZBBrCJADcjZ0AnwBZBJkCYMDfA1fIm4GfAl8DV8ifA58DV8jfA1TACkTeqIKICAgICAg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AAEAAQB0AKABfAB8AaECfQRZAHGQWABuDnQAoAF8AHwBfAKhA30EdAR8BIMBdAVrCXKofARqBqABoQB8BF8GdAd8BGQCZAGDA2QBawly2HwDZAFrCHLSfAFkAWsIcspx2GQBfARfCG4GfAN8BF8JfARTACkDYcUIAAAKICAgICAgICBSZXR1cm4gYSB2aWV3IG9mIHRoZSBNYXNrZWRBcnJheSBkYXRhCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgZHR5cGUgOiBkYXRhLXR5cGUgb3IgbmRhcnJheSBzdWItY2xhc3MsIG9wdGlvbmFsCiAgICAgICAgICAgIERhdGEtdHlwZSBkZXNjcmlwdG9yIG9mIHRoZSByZXR1cm5lZCB2aWV3LCBlLmcuLCBmbG9hdDMyIG9yIGludDE2LgogICAgICAgICAgICBUaGUgZGVmYXVsdCwgTm9uZSwgcmVzdWx0cyBpbiB0aGUgdmlldyBoYXZpbmcgdGhlIHNhbWUgZGF0YS10eXBlCiAgICAgICAgICAgIGFzIGBhYC4gQXMgd2l0aCBgYG5kYXJyYXkudmlld2BgLCBkdHlwZSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXMKICAgICAgICAgICAgYW4gbmRhcnJheSBzdWItY2xhc3MsIHdoaWNoIHRoZW4gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZQogICAgICAgICAgICByZXR1cm5lZCBvYmplY3QgKHRoaXMgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZSBgYHR5cGVgYAogICAgICAgICAgICBwYXJhbWV0ZXIpLgogICAgICAgIHR5cGUgOiBQeXRob24gdHlwZSwgb3B0aW9uYWwKICAgICAgICAgICAgVHlwZSBvZiB0aGUgcmV0dXJuZWQgdmlldywgZS5nLiwgbmRhcnJheSBvciBtYXRyaXguICBBZ2FpbiwgdGhlCiAgICAgICAgICAgIGRlZmF1bHQgTm9uZSByZXN1bHRzIGluIHR5cGUgcHJlc2VydmF0aW9uLgoKICAgICAgICBOb3RlcwogICAgICAgIC0tLS0tCgogICAgICAgIGBgYS52aWV3KClgYCBpcyB1c2VkIHR3byBkaWZmZXJlbnQgd2F5czoKCiAgICAgICAgYGBhLnZpZXcoc29tZV9kdHlwZSlgYCBvciBgYGEudmlldyhkdHlwZT1zb21lX2R0eXBlKWBgIGNvbnN0cnVjdHMgYSB2aWV3CiAgICAgICAgb2YgdGhlIGFycmF5J3MgbWVtb3J5IHdpdGggYSBkaWZmZXJlbnQgZGF0YS10eXBlLiAgVGhpcyBjYW4gY2F1c2UgYQogICAgICAgIHJlaW50ZXJwcmV0YXRpb24gb2YgdGhlIGJ5dGVzIG9mIG1lbW9yeS4KCiAgICAgICAgYGBhLnZpZXcobmRhcnJheV9zdWJjbGFzcylgYCBvciBgYGEudmlldyh0eXBlPW5kYXJyYXlfc3ViY2xhc3MpYGAganVzdAogICAgICAgIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYG5kYXJyYXlfc3ViY2xhc3NgIHRoYXQgbG9va3MgYXQgdGhlIHNhbWUgYXJyYXkKICAgICAgICAoc2FtZSBzaGFwZSwgZHR5cGUsIGV0Yy4pICBUaGlzIGRvZXMgbm90IGNhdXNlIGEgcmVpbnRlcnByZXRhdGlvbiBvZiB0aGUKICAgICAgICBtZW1vcnkuCgogICAgICAgIElmIGBmaWxsX3ZhbHVlYCBpcyBub3Qgc3BlY2lmaWVkLCBidXQgYGR0eXBlYCBpcyBzcGVjaWZpZWQgKGFuZCBpcyBub3QKICAgICAgICBhbiBuZGFycmF5IHN1Yi1jbGFzcyksIHRoZSBgZmlsbF92YWx1ZWAgb2YgdGhlIE1hc2tlZEFycmF5IHdpbGwgYmUKICAgICAgICByZXNldC4gSWYgbmVpdGhlciBgZmlsbF92YWx1ZWAgbm9yIGBkdHlwZWAgYXJlIHNwZWNpZmllZCAob3IgaWYKICAgICAgICBgZHR5cGVgIGlzIGFuIG5kYXJyYXkgc3ViLWNsYXNzKSwgdGhlbiB0aGUgZmlsbCB2YWx1ZSBpcyBwcmVzZXJ2ZWQuCiAgICAgICAgRmluYWxseSwgaWYgYGZpbGxfdmFsdWVgIGlzIHNwZWNpZmllZCwgYnV0IGBkdHlwZWAgaXMgbm90LCB0aGUgZmlsbAogICAgICAgIHZhbHVlIGlzIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgoK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IGlzIG5vdCBzaGFyZWQuCiAgICAgICAgQSBjb3B5IG9mIHRoZSBtYXNrIGlzIG9ubHkgbWFkZSBpZiBpdCB3YXMgc2hhcmVkLgoKICAgICAgICBTZWUgQWxzbwogICAgICAgIC0tLS0tLS0tCiAgICAgICAgc2hhcmVkbWFzawoKICAgICAgICBGKQNyuwEAAHI5AQAAckEAAAApAXI8AQAAcssAAAByywAAAHLMAAAActkBAADuDQAAcwgAAAAADQYBDAEGAXoYTWFza2VkQXJyYXkudW5zaGFyZV9tYXNrYwEAAAAAAAAAAQAAAAEAAABDAAAAcwYAAAB8AGoAUwApAU4pAXK7AQAAKQFyPAEAAHLLAAAAcssAAAByzAAAAHLmAQAAAA4AAHLnAQAAeiVTaGFyZSBzdGF0dXMgb2YgdGhlIG1hc2sgKHJlYWQtb25seSkuYwEAAAAAAAAAAgAAAAIAAABDAAAAcx4AAAB8AGoAfQF8AWoBchp8AaACoQBzGnQDfABfAHwAUwApAWGTAQAACiAgICAgICAgUmVkdWNlIGEgbWFzayB0byBub21hc2sgd2hlbiBwb3NzaWJsZS4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBOb25lCgogICAgICAgIFJldHVybnMKICAgICAgICAtLS0tLS0tCiAgICAgICAgTm9uZQoKICAgICAgICBFeGFtcGxlcwogICAgICAgIC0tLS0tLS0tCiAgICAgICAgPj4+IHggPSBucC5tYS5hcnJheShbWzEsMiBdLCBbMywgNF1dLCBtYXNrPVswXSo0KQogICAgICAgID4+PiB4Lm1hc2sKICAgICAgICBhcnJheShbW0ZhbHNlLCBGYWxzZV0sCiAgICAgICAgICAgICAgIFtGYWxzZSwgRmFsc2VdXSwgZHR5cGU9Ym9vbCkKICAgICAgICA+Pj4geC5zaHJpbmtfbWFzaygpCiAgICAgICAgPj4+IHgubWFzawogICAgICAgIEZhbHNlCgogICAgICAgICkEcjkBAABymQAAAHIlAAAAcpsAAAApAnI8AQAAcuoAAAByywAAAHLLAAAAcswAAADaC3Nocmlua19tYXNrAw4AAHMIAAAAABcGAQ4BBgF6F01hc2tlZEFycmF5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bCBiZQogICAgICAgIHJldHVybmVkIGluc3RlYWQgYXMgYW4gbmRhcnJheS4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBmaWxsX3ZhbHVlIDogc2NhbGFyLCBvcHRpb25hbAogICAgICAgICAgICBUaGUgdmFsdWUgdG8gdXNlIGZvciBpbnZhbGlkIGVudHJpZXMgKE5vbmUgYnkgZGVmYXVsdCkuCiAgICAgICAgICAgIElmIE5vbmUsIHRoZSBgZmlsbF92YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBhcnJheSBpcyB1c2VkIGluc3RlYWQuCgogICAgICAgIFJldHVybnMKICAgICAgICAtLS0tLS0tCiAgICAgICAgZmlsbGVkX2FycmF5IDogbmRhcnJheQogICAgICAgICAgICBBIGNvcHkgb2YgYGBzZWxmYGAgd2l0aCBpbnZhbGlkIGVudHJpZXMgcmVwbGFjZWQgYnkgKmZpbGxfdmFsdWUqCiAgICAgICAgICAgIChiZSBpdCB0aGUgZnVuY3Rpb24gYXJndW1lbnQgb3IgdGhlIGF0dHJpYnV0ZSBvZiBgYHNlbGZgYCksIG9yCiAgICAgICAgICAgIGBgc2VsZmBgIGl0c2VsZiBhcyBhbiBuZGFycmF5IGlmIHRoZXJlIGFyZSBubyBpbnZhbGlkIGVudHJpZXMgdG8KICAgICAgICAgICAgYmUgcmVwbGFjZWQuCgogICAgICAgIE5vdGVzCiAgICAgICAgLS0tLS0KICAgICAgICBUaGUgcmVzdWx0IGlzICoqbm90KiogYSBNYXNrZWRBcnJheSEKCiAgICAgICAgRXhhbXBsZXMKICAgICAgICAtLS0tLS0tLQogICAgICAgID4+PiB4ID0gbnAubWEuYXJyYXkoWzEsMiwzLDQsNV0sIG1hc2s9WzAsMCwxLDAsMV0sIGZpbGxfdmFsdWU9LTk5OSkKICAgICAgICA+Pj4geC5maWxsZWQoKQogICAgICAgIGFycmF5KFsxLCAyLCAtOTk5LCA0LCAtOTk5XSkKICAgICAgICA+Pj4gdHlwZSh4LmZpbGxlZCgpKQogICAgICAgIDx0eXBlICdudW1weS5uZGFycmF5Jz4KCiAgICAgICAg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OiB7Tm9uZSwgaW50fSwgb3B0aW9uYWwKICAgICAgICAgICAgQXhpcyBhbG9uZyB3aGljaCB0aGUgb3BlcmF0aW9uIG11c3QgYmUgcGVyZm9ybWVkLgogICAgICAgIG91dCA6IHtOb25lLCBuZGFycmF5fSwgb3B0aW9uYWwKICAgICAgICAgICAgQWx0ZXJuYXRpdmUgb3V0cHV0IGFycmF5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSByZXN1bHQuIEl0IG11c3QgaGF2ZQogICAgICAgICAgICB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgZXhwZWN0ZWQgb3V0cHV0IGJ1dCB0aGUgdHlwZSB3aWxsIGJlIGNhc3QgaWYKICAgICAgICAgICAgbmVjZXNzYXJ5LgoKICAgICAgICBSZXR1cm5zCiAgICAgICAgLS0tLS0tLQogICAgICAgIHJlc3VsdCA6IE1hc2tlZEFycmF5CiAgICAgICAgICAgIEEgOmNsYXNzOmBNYXNrZWRBcnJheWAgb2JqZWN0LgoKICAgICAgICBOb3RlcwogICAgICAgIC0tLS0tCiAgICAgICAgUGxlYXNlIG5vdGUgdGhlIGRpZmZlcmVuY2Ugd2l0aCA6bWV0aDpgY29tcHJlc3NlZGAgIQogICAgICAgIFRoZSBvdXRwdXQgb2YgOm1ldGg6YGNvbXByZXNzYCBoYXMgYSBtYXNrLCB0aGUgb3V0cHV0IG9mCiAgICAgICAgOm1ldGg6YGNvbXByZXNzZWRgIGRvZXMgbm90LgoKICAgICAgICBFeGFtcGxlcwogICAgICAgIC0tLS0tLS0tCiAgICAgICAgPj4+IHggPSBucC5tYS5hcnJheShbWzEsMiwzXSxbNCw1LDZdLFs3LDgsOV1dLCBtYXNrPVswXSArIFsxLDBdKjQpCiAgICAgICAgPj4+IHByaW50KHgpCiAgICAgICAgW1sxIC0tIDNdCiAgICAgICAgIFstLSA1IC0tXQogICAgICAgICBbNyAtLSA5XV0KICAgICAgICA+Pj4geC5jb21wcmVzcyhbMSwgMCwgMV0pCiAgICAgICAgbWFza2VkX2FycmF5KGRhdGEgPSBbMSAzXSwKICAgICAgICAgICAgICBtYXNrID0gW0ZhbHNlIEZhbHNlXSwKICAg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bWFza2VkLCB0aGUgcmVzdWx0IGlzIG1hc2tlZCBhcyB3ZWxsLAogICAgICAgIGJ1dCB0aGUgdW5kZXJseWluZyBib29sZWFuIGRhdGEgYXJlIHN0aWxsIHNldCwgd2l0aCBzZWxmIGFuZCBvdGhlcgogICAgICAgIGNvbnNpZGVyZWQgZXF1YWwgaWYgYm90aCBhcmUgbWFza2VkLCBhbmQgdW5lcXVhbCBvdGhlcndpc2UuCgogICAgICAgIEZvciBzdHJ1Y3R1cmVkIGFycmF5cywgYWxsIGZpZWxkcyBhcmUgY29tYmluZWQsIHdpdGggbWFza2VkIHZhbHVlcwogICAgICAgIGlnbm9yZWQuIFRoZSByZXN1bHQgaXMgbWFza2VkIGlmIGFsbCBmaWVsZHMgd2VyZSBtYXNrZWQsIHdpdGggc2VsZgogICAgICAgIGFuZCBvdGhlciBjb25zaWRlcmVkIGVxdWFsIG9ubHkgaWYgYm90aCB3ZXJlIGZ1bGx5IG1hc2tlZC4KICAgICAgICApA3IFAgAA2ghvcGVyYXRvctoCZXEpAnI8AQAAcgACAAByywAAAHLLAAAAcswAAADaBl9fZXFfX7wPAABzAgAAAAALehJNYXNrZWRBcnJheS5fX2VxX19jAgAAAAAAAAACAAAABAAAAEMAAABzDgAAAHwAoAB8AXQBagKhAlMAKQFh9AEAAENoZWNrIHdoZXRoZXIgb3RoZXIgZG9lcyBub3QgZXF1YWwgc2VsZiBlbGVtZW50d2lzZS4KCiAgICAgICAgV2hlbiBlaXRoZXIgb2YgdGhlIGVsZW1lbnRzIGlzIG1hc2tlZCwgdGhlIHJlc3VsdCBpcyBtYXNrZWQgYXMgd2VsbCwKICAgICAgICBidXQgdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBkYXRhIGFyZSBzdGlsbCBzZXQsIHdpdGggc2VsZiBhbmQgb3RoZXIKICAgICAgICBjb25zaWRlcmVkIGVxdWFsIGlmIGJvdGggYXJlIG1hc2tlZCwgYW5kIHVuZXF1YWwgb3RoZXJ3aXNlLgoKICAgICAgICBGb3Igc3RydWN0dXJlZCBhcnJheXMsIGFsbCBmaWVsZHMgYXJlIGNvbWJpbmVkLCB3aXRoIG1hc2tlZCB2YWx1ZXMKICAgICAgICBp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ICAgICAgICAgIHdoaWNoIGNhc2UgaXQgY291bnRzIGZyb20gdGhlIGxhc3QgdG8gdGhlIGZpcnN0IGF4aXMuCgogICAgICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEwLjAKCiAgICAgICAgICAgIElmIHRoaXMgaXMgYSB0dXBsZSBvZiBpbnRzLCB0aGUgY291bnQgaXMgcGVyZm9ybWVkIG9uIG11bHRpcGxlCiAgICAgICAgICAgIGF4ZXMsIGluc3RlYWQgb2YgYSBzaW5nbGUgYXhpcyBvciBhbGwgdGhlIGF4ZXMgYXMgYmVmb3JlLgogICAgICAgIGtlZXBkaW1zIDogYm9vbCwgb3B0aW9uYWwKICAgICAgICAgICAgSWYgdGhpcyBpcyBzZXQgdG8gVHJ1ZSwgdGhlIGF4ZXMgd2hpY2ggYXJlIHJlZHVjZWQgYXJlIGxlZnQKICAgICAgICAgICAgaW4gdGhlIHJlc3VsdCBhcyBkaW1lbnNpb25zIHdpdGggc2l6ZSBvbmUuIFdpdGggdGhpcyBvcHRpb24sCiAgICAgICAgICAgIHRoZSByZXN1bHQgd2lsbCBicm9hZGNhc3QgY29ycmVjdGx5IGFnYWluc3QgdGhlIGFycmF5LgoKICAgICAgICBSZXR1cm5zCiAgICAgICAgLS0tLS0tLQogICAgICAgIHJlc3VsdCA6IG5kYXJyYXkgb3Igc2NhbGFyCiAgICAgICAgICAgIEFuIGFycmF5IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGlucHV0IGFycmF5LCB3aXRoIHRoZSBzcGVjaWZpZWQKICAgICAgICAgICAgYXhpcyByZW1vdmVkLiBJZiB0aGUgYXJyYXkgaXMgYSAwLWQgYXJyYXksIG9yIGlmIGBheGlzYCBpcyBOb25lLCBhCiAgICAgICAgICAgIHNjYWxhciBpcyByZXR1cm5lZC4KCiAgICAgICAgU2VlIEFsc28KICAgICAgICAtLS0tLS0tLQogICAgICAgIGNvdW50X21hc2tlZCA6IENvdW50IG1hc2tlZCBlbGVtZW50cyBpbiBhcnJheSBvciBhbG9uZyBhIGdpdmVuIGF4aXMuCgogICAgICAgIEV4YW1wbGVzCiAgICAgICAgLS0tLS0tLS0K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ICAgICBSZXR1cm5zCiAgICAgICAgLS0tLS0tLQogICAgICAgIHJlc2hhcGVkX2FycmF5IDogYXJyYXkKICAgICAgICAgICAgQSBuZXcgdmlldyBvbiB0aGUgYXJyYXkuCgogICAgICAgIFNlZSBBbHNvCiAgICAgICAgLS0tLS0tLS0KICAgICAgICByZXNoYXBlIDogRXF1aXZhbGVudCBmdW5jdGlvbiBpbiB0aGUgbWFza2VkIGFycmF5IG1vZHVsZS4KICAgICAgICBudW1weS5uZGFycmF5LnJlc2hhcGUgOiBFcXVpdmFsZW50IG1ldGhvZCBvbiBuZGFycmF5IG9iamVjdC4KICAgICAgICBudW1weS5yZXNoYXBlIDogRXF1aXZhbGVudCBmdW5jdGlvbiBpbiB0aGUgTnVtUHkgbW9kdWxlLgoKICAgICAgICBOb3RlcwogICAgICAgIC0tLS0tCiAgICAgICAgVGhlIHJlc2hhcGluZyBvcGVyYXRpb24gY2Fubm90IGd1YXJhbnRlZSB0aGF0IGEgY29weSB3aWxsIG5vdCBiZSBtYWRlLAogICAgICAgIHRvIG1vZGlmeSB0aGUgc2hhcGUgaW4gcGxhY2UsIHVzZSBgYGEuc2hhcGUgPSBzYGAKCiAgICAgICAgRXhhbXBsZXMKICAgICAgICAtLS0tLS0tLQogICAgICAgID4+PiB4ID0gbnAubWEuYXJyYXkoW1sxLDJdLFszLDRdXSwgbWFzaz1bMSwwLDAsMV0pCiAgICAgICAgPj4+IHByaW50KHgpCiAgICAgICAgW1stLSAyXQogICAgICAgICBbMyAtLV1dCiAgICAgICAgPj4+IHggPSB4LnJlc2hhcGUoKDQsMSkpCiAgICAgICAgPj4+IHByaW50KHgpCiAgICAgICAgW1stLV0KICAgICAgICAgWzJdCiAgICAgICAgIFszXQogICAgICAgICBbLS1dXQoKICAgICAgICBytAEAAHIwAgAAKQFytAEAACkJcsYBAABy/wAAAHIzAQAAcqsAAAByNQEAAHIrAQAAclEBAAByOQEAAHKbAAAAKQVyPAEAAHLrAAAAclMBAAByJgEAAHI3AQAAcssAAAByywAAAHLMAAAAcqsAAACwEQAAcw4AAAAAMBQBGAEKAQYBCAEOAXoTTWFza2VkQXJyYXkucmVzaGFwZWMEAAAAAAAAAAUAAAACAAAAQwAAAHMQAAAAZAF9BHQAfASDAYIBZAJTACkDYXYBAAAKICAgICAgICAuLiB3YXJuaW5nOjoKCiAgICAgICAgICAgIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZywgZXhjZXB0IHJhaXNlIGEgVmFsdWVFcnJvciBleGNlcHRpb24uIEEKICAgICAgICAgICAgbWFza2VkIGFycmF5IGRvZXMgbm90IG93biBpdHMgZGF0YSBhbmQgdGhlcmVmb3JlIGNhbm5vdCBzYWZlbHkgYmUKICAgICAgICAgICAgcmVzaXplZCBpbiBwbGFjZS4gVXNlIHRoZSBgbnVtcHkubWEucmVzaXplYCBmdW5jdGlvbiBpbnN0ZWFkLgoKICAgICAgICBUaGlzIG1ldGhvZCBpcyBkaWZmaWN1bHQgdG8gaW1wbGVtZW50IHNhZmVseSBhbmQgbWF5IGJlIGRlcHJlY2F0ZWQgaW4KICAgICAgICBmdXR1cmUgcmVsZWFzZXMgb2YgTnVtUHkuCgogICAgICAgIHpvQSBtYXNrZWQgYXJyYXkgZG9lcyBub3Qgb3duIGl0cyBkYXRhIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIHJlc2l6ZWQuClVzZSB0aGUgbnVtcHkubWEucmVzaXplIGZ1bmN0aW9uIGluc3RlYWQuTikBch8BAAApBXI8AQAAcm8BAABaCHJlZmNoZWNrcrQBAAByEgEAAHLLAAAAcssAAAByzAAAAHKsAAAA6BEAAHMEAAAAAA0EA3oSTWFza2VkQXJyYXkucmVzaXpl2gVyYWlzZWMEAAAAAAAAAAYAAAAFAAAAQwAAAHPUAAAAfABqAHJUfABqAXQCawlyVHwAagF8ARkAfQR0A3wBZAFkAo0CfQF0A3wCZAFkA2QEjQN9AnwCoAR8AWoFoQEBAHwBfAQPABkAfQF8AnwEDwAZAH0CfABqBmoHfAF8AnwDZAWNAwEAfABqAXQCawhygHQIfAKDAXQCawhygGQGUwB0CXwAgwGgCqEAfQV0CHwCgwF0AmsIcqp8BWoHfAFkAXwDZAWNAwEAbhJ8BWoHfAF8AmoBfANkBY0DAQB0C3wFZAFkA2QHjQN9BXwFfABfAWQGUwApCGEEBQAACiAgICAgICAgU2V0IHN0b3JhZ2UtaW5kZXhlZCBsb2NhdGlvbnMgdG8gY29ycmVzcG9uZGluZyB2YWx1ZXMuCgogICAgICAgIFNldHMgc2VsZi5fZGF0YS5mbGF0W25dID0gdmFsdWVzW25dIGZvciBlYWNoIG4gaW4gaW5kaWNlcy4KICAgICAgICBJZiBgdmFsdWVzYCBpcyBzaG9ydGVyIHRoYW4gYGluZGljZXNgIHRoZW4gaXQgd2lsbCByZXBlYXQuCiAgICAgICAgSWYgYHZhbHVlc2AgaGFzIHNvbWUgbWFza2VkIHZhbHVlcywgdGhlIGluaXRpYWwgbWFzayBpcyB1cGRhdGVkCiAgICAgICAgaW4gY29uc2VxdWVuY2UsIGVsc2UgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGFyZSB1bm1hc2tlZC4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBpbmRpY2VzIDogMS1EIGFycmF5X2xpa2UKICAgICAgICAgICAgVGFyZ2V0IGluZGljZXMsIGludGVycHJldGVkIGFzIGludGVnZXJzLgogICAgICAgIHZhbHVlcyA6IGFycmF5X2xpa2UKICAgICAgICAgICAgVmFsdWVzIHRvIHBsYWNlIGluIHNlbGYuX2RhdGEgY29weSBhdCB0YXJnZXQgaW5kaWNlcy4KICAgICAgICBtb2RlIDogeydyYWlzZScsICd3cmFwJywgJ2NsaXAnfSwgb3B0aW9uYWwKICAgICAgICAgICAgU3BlY2lmaWVzIGhvdyBvdXQtb2YtYm91bmRzIGluZGljZXMgd2lsbCBiZWhhdmUuCiAgICAgICAgICAgICdyYWlzZScgOiByYWlzZSBhbiBlcnJvci4KICAgICAgICAgICAgJ3dyYXAnIDogd3JhcCBhcm91bmQuCiAgICAgICAgICAgICdjbGlwJyA6IGNsaXAgdG8gdGhlIHJhbmdlLgoKICAgICAgICBOb3RlcwogICAgICAgIC0tLS0tCiAgICAgICAgYHZhbHVlc2AgY2FuIGJlIGEgc2NhbGFyIG9yIGxlbmd0aCAxIGFycmF5LgoKICAgICAgICBFeGFtcGxlcwogICAgICAgIC0tLS0tLS0tCiAgICAgICAgPj4+IHggPSBucC5tYS5hcnJheShbWzEsMiwzXSxbNCw1LDZdLFs3LDgsOV1dLCBtYXNrPVswXSArIFsxLDBdKjQpCiAgICAgICAgPj4+IHByaW50KHgpCiAgICAgICAgW1sxIC0tIDNdCiAgICAgICAgIFstLSA1IC0tXQogICAgICAgICBbNyAtLSA5XV0KICAgICAgICA+Pj4geC5wdXQoWzAsNCw4XSxbMTAsMjAsMzBdKQogICAgICAgID4+PiBwcmludCh4KQogICAgICAgIFtbMTAgLS0gM10KICAgICAgICAgWy0tIDIwIC0tXQogICAgICAgICBbNyAtLSAzMF1dCgogICAgICAgID4+PiB4LnB1dCg0LDk5OSkKICAgICAgICA+Pj4gcHJpbnQoeCkKICAgICAgICBbWzEwIC0tIDNdCiAgICAgICAgIFstLSA5OTkgLS1dCiAgICAgICAgIFs3IC0tIDMwXV0KCiAgICAgICAgRikBckEAAABUKQJyQQAAAHIyAQAAKQHaBG1vZGVOKQJyQQAAAHJuAQAAKQxyrAEAAHI5AQAAcpsAAABy7gEAAHKsAAAAcrEAAAByMwEAAHKlAAAAcl8AAAByYAAAAHJBAAAAcnsAAAApBnI8AQAAcmcAAADaBnZhbHVlc3IzAgAAcjcBAABy6gAAAHLLAAAAcssAAAByzAAAAHKlAAAA+hEAAHMiAAAAAC4QAQoBDAEOAQwBCgEKAhIDFgEEAgwCDAESAhIBDgEGAXoPTWFza2VkQXJyYXkucHV0YwEAAAAAAAAAAQAAAAMAAABDAAAAcywAAAB8AGoAdAFrCHIafABqAmoDdAR0AYMBZgJTAHwAagJqA3wAagBqAmoDZgJTACkBYewBAAAKICAgICAgICBSZXR1cm4gdGhlIGFkZHJlc3NlcyBvZiB0aGUgZGF0YSBhbmQgbWFzayBhcmVhcy4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBOb25lCgogICAgICAgIEV4YW1wbGVzCiAgICAgICAgLS0tLS0tLS0KICAgICAgICA+Pj4geCA9IG5wLm1hLmFycmF5KFsxLCAyLCAzXSwgbWFzaz1bMCwgMSwgMV0pCiAgICAgICAgPj4+IHguaWRzKCkKICAgICAgICAoMTY2NjcwNjQwLCAxNjY2NTk4MzIpCgogICAgICAgIElmIHRoZSBhcnJheSBoYXMgbm8gbWFzaywgdGhlIGFkZHJlc3Mgb2YgYG5vbWFza2AgaXMgcmV0dXJuZWQuIFRoaXMgYWRkcmVzcwogICAgICAgIGlzIHR5cGljYWxseSBub3QgY2xvc2UgdG8gdGhlIGRhdGEgaW4gbWVtb3J5OgoKICAgICAgICA+Pj4geCA9IG5wLm1hLmFycmF5KFsxLCAyLCAzXSkKICAgICAgICA+Pj4geC5pZHMoKQogICAgICAgICgxNjY2OTEwODAsIDMwODMxNjkyODRMKQoKICAgICAgICApBXI5AQAAcpsAAADaBmN0eXBlc3I2AQAA2gJpZCkBcjwBAAByywAAAHLLAAAAcswAAAByZgAAAEASAABzBgAAAAAWCgEQAXoPTWFza2VkQXJyYXkuaWRzYwEAAAAAAAAAAQAAAAIAAABDAAAAcwoAAAB8AGoAZAEZAFMAKQJh+gEAAAogICAgICAgIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkYXRhIGlzIGNvbnRpZ3VvdXMuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgTm9uZQoKICAgICAgICBFeGFtcGxlcwogICAgICAgIC0tLS0tLS0tCiAgICAgICAgPj4+IHggPSBucC5tYS5hcnJheShbMSwgMiwgM10pCiAgICAgICAgPj4+IHguaXNjb250aWd1b3VzKCkKICAgICAgICBUcnVlCgogICAgICAgIGBpc2NvbnRpZ3VvdXNgIHJldHVybnMgb25lIG9mIHRoZSBmbGFncyBvZiB0aGUgbWFza2VkIGFycmF5OgoKICAgICAgICA+Pj4geC5mbGFncwogICAgICAgICAgQ19DT05USUdVT1VTIDogVHJ1ZQogICAgICAgICAgRl9DT05USUdVT1VTIDogVHJ1ZQogICAgICAgICAgT1dOREFUQSA6IEZhbHNlCiAgICAgICAgICBXUklURUFCTEUgOiBUcnVlCiAgICAgICAgICBBTElHTkVEIDogVHJ1ZQogICAgICAgICAgVVBEQVRFSUZDT1BZIDogRmFsc2UK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ICAgICAgICAgICAgRnVuY3Rpb24gb3BlcmF0aW5nIG9uIG5kYXJyYXlzLgogICAgICAgIGZsYXRub256ZXJvIDoKICAgICAgICAgICAgUmV0dXJuIGluZGljZXMgdGhhdCBhcmUgbm9uLXplcm8gaW4gdGhlIGZsYXR0ZW5lZCB2ZXJzaW9uIG9mIHRoZSBpbnB1dAogICAgICAgICAgICBhcnJheS4KICAgICAgICBuZGFycmF5Lm5vbnplcm8gOgogICAgICAgICAgICBFcXVpdmFsZW50IG5kYXJyYXkgbWV0aG9kLgogICAgICAgIGNvdW50X25vbnplcm8gOgogICAgICAgICAgICBDb3VudHMgdGhlIG51bWJlciBvZiBub24temVybyBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuCgogICAgICAgIEV4YW1wbGVzCiAgICAgICAgLS0tLS0tLS0KICAgICAgICA+Pj4gaW1wb3J0IG51bXB5Lm1hIGFzIG1hCiAgICAgICAgPj4+IHggPSBtYS5hcnJheShucC5leWUoMykpCiAgICAgICAgPj4+IHgKICAgICAgICBtYXNrZWRfYXJyYXkoZGF0YSA9CiAgICAgICAgIFtbIDEuICAwLiAgMC5dCiAgICAgICAgIFsgMC4gIDEuICAwLl0KICAgICAgICAgWyAwLiAgMC4gIDEuXV0sCiAgICAgICAgICAgICAgbWFzayA9CiAgICAgICAgIEZhbHNlLAogICAgICAgICAgICAgIGZpbGxfdmFsdWU9MWUrMjApCiAgICAgICAgPj4+IHgubm9uemVybygpCiAgICAgICAgKGFycmF5KFswLCAxLCAyXSksIGFycmF5KFswLCAxLCAyXSkpCgogICAgICAgIE1hc2tlZCBlbGVtZW50cyBhcmUgaWdub3JlZC4KCiAgICAgICAgPj4+IHhbMSwgMV0gPSBtYS5tYXNrZWQKICAgICAgICA+Pj4geAogICAgICAgIG1hc2tlZF9hcnJheShkYXRhID0KICAgICAgICAgW1sxLjAgMC4wIDAuMF0KICAgICAgICAgWzAuMCAtLSAwLjBdCiAgICAgICAgIFswLjAgMC4wIDEuMF1dLAogICAgICAgICAgICAgIG1hc2sgPQogICAgICAgICBbW0ZhbHNlIEZhbHNlIEZhbHNlXQogICAgICAgICBbRmFsc2UgIFRydWUgRmFsc2VdCiAgICAgICAgIFtGYWxzZSBGYWxzZSBGYWxzZV1dLAogICAgICAgICAgICAgIGZpbGxfdmFsdWU9MWUrMjApCiAgICAgICAgPj4+IHgubm9uemVybygpCiAgICAgICAgKGFycmF5KFswLCAyXSksIGFycmF5KFswLCAyXSkpCgogICAgICAgIEluZGljZXMgY2FuIGFsc28gYmUgZ3JvdXBlZCBieSBlbGVtZW50LgoKICAgICAgICA+Pj4gbnAudHJhbnNwb3NlKHgubm9uemVybygpKQogICAgICAgIGFycmF5KFtbMCwgMF0sCiAgICAgICAgICAgICAgIFsyLCAyXV0pCgogICAgICAgIEEgY29tbW9uIHVzZSBmb3IgYGBub256ZXJvYGAgaXMgdG8gZmluZCB0aGUgaW5kaWNlcyBvZiBhbiBhcnJheSwgd2hlcmUKICAgICAgICBhIGNvbmRpdGlvbiBpcyBUcnVlLiAgR2l2ZW4gYW4gYXJyYXkgYGFgLCB0aGUgY29uZGl0aW9uIGBhYCA+IDMgaXMgYQogICAgICAgIGJvb2xlYW4gYXJyYXkgYW5kIHNpbmNlIEZhbHNlIGlzIGludGVycHJldGVkIGFzIDAsIG1hLm5vbnplcm8oYSA+IDMpCiAgICAgICAgeWllbGRzIHRoZSBpbmRpY2VzIG9mIHRoZSBgYWAgd2hlcmUgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgoKICAgICAgICA+Pj4gYSA9IG1hLmFycmF5KFtbMSwyLDNdLFs0LDUsNl0sWzcsOCw5XV0pCiAgICAgICAgPj4+IGEgPiAzCiAgICAgICAgbWFza2VkX2FycmF5KGRhdGEgPQogICAgICAgICBbW0ZhbHNlIEZhbHNlIEZhbHNlXQogICAgICAgICBbIFRydWUgIFRydWUgIFRydWVdCiAgICAgICAgIFsgVHJ1ZSAgVHJ1ZSAgVHJ1ZV1dLAogICAgICAgICAgICAgIG1hc2sgPQogICAgICAgICBGYWxzZSwKICAgICAgICAgICAgICBmaWxsX3ZhbHVlPTk5OTk5OSkKICAgICAgICA+Pj4gbWEubm9uemVybyhhID4gMykKICAgICAgICAoYXJyYXkoWzEsIDEsIDEsIDIsIDIsIDJdKSwgYXJyYXkoWzAsIDEsIDIsIDAsIDEsIDJdKSkKCiAgICAgICAgVGhlIGBgbm9uemVyb2BgIG1ldGhvZCBvZiB0aGUgY29uZGl0aW9uIGFycmF5IGNhbiBhbHNvIGJlIGNhbGxlZC4KCiAgICAgICAgPj4+IChhID4gMykubm9uemVybygpCiAgICAgICAgKGFycmF5KFsxLCAxLCAxLCAyLCAyLCAyXSksIGFycmF5KFswLCAxLCAyLCAwLCAxLCAyXSkpCgogICAgICAgIHIBAAAARikBckEAAAApA3LuAQAAclQAAABynAAAACkBcjwBAAByywAAAHLLAAAAcswAAABynAAAALsSAABzAgAAAABjehNNYXNrZWRBcnJheS5ub256ZXJvcs0AAABjBgAAAAAAAAAJAAAABgAAAAMAAABzXgAAAHwAagB9BnwGdAFrCHIwdAJ0A3wAgwJqBHwBfAJ8A3wFZAGNBH0HfAegBXwEoQFTAHwAagZ8AXwCfANkAo0DfQh8CKAFfAShAaAHZAOhAWoIZAR8BWQFjQJTAGQEUwApBno4CiAgICAgICAgKHRoaXMgZG9jc3RyaW5nIHNob3VsZCBiZSBvdmVyd3JpdHRlbikKICAgICAgICApBNoGb2Zmc2V02gVheGlzMdoFYXhpczJynwEAACkDcjgCAAByOQIAAHI6AgAAcgEAAABOKQJyYQEAAHKfAQAAKQlyOQEAAHKbAAAActsBAAByGwAAAHLBAAAActABAABySgAAAHJUAAAAcrwAAAApCXI8AQAAcjgCAAByOQIAAHI6AgAAcvgAAABynwEAAHLqAAAAciYBAABy6AAAACkBct4BAAByywAAAHLMAAAAcsEAAAAgEwAAcw4AAAAABQYBCAEOAQoBCgIQAXoRTWFza2VkQXJyYXkudHJhY2VjBAAAAAAAAAAEAAAABgAAAEMAAABzEAAAAHQAfAB8AXwCfANkAY0EUwApAmGABQAACiAgICAgICAgYS5kb3QoYiwgb3V0PU5vbmUpCgogICAgICAgIE1hc2tlZCBkb3QgcHJvZHVjdCBvZiB0d28gYXJyYXlzLiBOb3RlIHRoYXQgYG91dGAgYW5kIGBzdHJpY3RgIGFyZQogICAgICAgIGxvY2F0ZWQgaW4gZGlmZmVyZW50IHBvc2l0aW9ucyB0aGFuIGluIGBtYS5kb3RgLiBJbiBvcmRlciB0bwogICAgICAgIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgZnVuY3Rpb25hbCB2ZXJzaW9uLCBpdCBpcwogICAgICAgIHJlY29tbWVuZGVkIHRoYXQgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBiZSB0cmVhdGVkIGFzIGtleXdvcmQgb25seS4KICAgICAgICBBdCBzb21lIHBvaW50IHRoYXQgbWF5IGJlIG1hbmRhdG9yeS4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xMC4wCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgYiA6IG1hc2tlZF9hcnJheV9saWtlCiAgICAgICAgICAgIElucHV0cyBhcnJheS4KICAgICAgICBvdXQgOiBtYXNrZWRfYXJyYXksIG9wdGlvbmFsCiAgICAgICAgICAgIE91dHB1dCBhcmd1bWVudC4gVGhpcyBtdXN0IGhhdmUgdGhlIGV4YWN0IGtpbmQgdGhhdCB3b3VsZCBiZQogICAgICAgICAgICByZXR1cm5lZCBpZiBpdCB3YXMgbm90IHVzZWQuIEluIHBhcnRpY3VsYXIsIGl0IG11c3QgaGF2ZSB0aGUKICAgICAgICAgICAgcmlnaHQgdHlwZSwgbXVzdCBiZSBDLWNvbnRpZ3VvdXMsIGFuZCBpdHMgZHR5cGUgbXVzdCBiZSB0aGUKICAgICAgICAgICAgZHR5cGUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBmb3IgYG1hLmRvdChhLGIpYC4gVGhpcyBpcyBhCiAgICAgICAgICAgIHBlcmZvcm1hbmNlIGZlYXR1cmUuIFRoZXJlZm9yZSwgaWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90CiAgICAgICAgICAgIG1ldCwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCwgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIHRvIGJlCiAgICAgICAgICAgIGZsZXhpYmxlLgogICAgICAgIHN0cmljdCA6IGJvb2wsIG9wdGlvbmFsCiAgICAg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IGludCwgb3B0aW9uYWwKICAgICAgICAgICAgQXhpcyBhbG9uZyB3aGljaCB0byBzb3J0LiBJZiBOb25lLCB0aGUgZGVmYXVsdCwgdGhlIGZsYXR0ZW5lZCBhcnJheQogICAgICAgICAgICBpcyB1c2VkLgoKICAgICAgICAgICAgLi4gIHZlcnNpb25jaGFuZ2VkOjogMS4xMy4wCiAgICAgICAgICAgICAgICBQcmV2aW91c2x5LCB0aGUgZGVmYXVsdCB3YXMgZG9jdW1lbnRlZCB0byBiZSAtMSwgYnV0IHRoYXQgd2FzCiAgICAgICAgICAgICAgICBpbiBlcnJvci4gQXQgc29tZSBmdXR1cmUgZGF0ZSwgdGhlIGRlZmF1bHQgd2lsbCBjaGFuZ2UgdG8gLTEsIGFzCiAgICAgICAgICAgICAgICBvcmlnaW5hbGx5IGludGVuZGVkLgogICAgICAgICAgICAgICAgVW50aWwgdGhlbiwgdGhlIGF4aXMgc2hvdWxkIGJlIGdpdmVuIGV4cGxpY2l0bHkgd2hlbgogICAgICAgICAgICAgICAgYGBhcnIubmRpbSA+IDFgYCwgdG8gYXZvaWQgYSBGdXR1cmVXYXJuaW5nLgogICAgICAgIGtpbmQgOiB7J3F1aWNrc29ydCcsICdtZXJnZXNvcnQnLCAnaGVhcHNvcnQnfSwgb3B0aW9uYWwKICAgICAgICAgICAgU29ydGluZyBhbGdvcml0aG0uCiAgICAgICAgb3JkZXIgOiBsaXN0LCBvcHRpb25hbAogICAgICAgICAgICBXaGVuIGBhYCBpcyBhbiBhcnJheSB3aXRoIGZpZWxkcyBkZWZpbmVkLCB0aGlzIGFyZ3VtZW50IHNwZWNpZmllcwogICAgICAgICAgICB3aGljaCBmaWVsZHMgdG8gY29tcGFyZSBmaXJzdCwgc2Vjb25kLCBldGMuICBOb3QgYWxsIGZpZWxkcyBuZWVkIGJlCiAgICAgICAgICAgIHNwZWNpZmllZC4KICAgICAgICBlbmR3aXRoIDoge1RydWUsIEZhbHNlfSwgb3B0aW9uYWwKICAgICAgICAgICAgV2hldGhlciBtaXNzaW5nIHZhbHVlcyAoaWYgYW55KSBzaG91bGQgYmUgdHJlYXRlZCBhcyB0aGUgbGFyZ2VzdCB2YWx1ZXMKICAgICAgICAgICAgKFRydWUpIG9yIHRoZSBzbWFsbGVzdCB2YWx1ZXMgKEZhbHNlKQogICAgICAgICAgICBXaGVuIHRoZSBhcnJheSBjb250YWlucyB1bm1hc2tlZCB2YWx1ZXMgYXQgdGhlIHNhbWUgZXh0cmVtZXMgb2YgdGhlCiAgICAgICAgICAgIGRhdGF0eXBlLCB0aGUgb3JkZXJpbmcgb2YgdGhlc2UgdmFsdWVzIGFuZCB0aGUgbWFza2VkIHZhbHVlcyBpcwogICAgICAgICAgICB1bmRlZmluZWQuCiAgICAgICAgZmlsbF92YWx1ZSA6IHt2YXJ9LCBvcHRpb25hbAogICAgICAgICAgICBWYWx1ZSB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBtYXNrZWQgdmFsdWVzLgogICAgICAgICAgICBJZiBgYGZpbGxfdmFsdWVgYCBpcyBub3QgTm9uZSwgaXQgc3VwZXJzZWRlcyBgYGVuZHdpdGhgYC4KCiAgICAgICAgUmV0dXJucwogICAgICAgIC0tLS0tLS0KICAgICAgICBpbmRleF9hcnJheSA6IG5kYXJyYXksIGludAogICAgICAgICAgICBBcnJheSBvZiBpbmRpY2VzIHRoYXQgc29ydCBgYWAgYWxvbmcgdGhlIHNwZWNpZmllZCBheGlzLgogICAgICAgICAgICBJbiBvdGhlciB3b3JkcywgYGBhW2luZGV4X2FycmF5XWBgIHlpZWxkcyBhIHNvcnRlZCBgYWAuCgogICAgICAgIFNlZSBBbHNvCiAgICAgICAgLS0tLS0tLS0KICAgICAgICBNYXNrZWRBcnJheS5zb3J0IDogRGVzY3JpYmVzIHNvcnRpbmcgYWxnb3JpdGhtcyB1c2VkLgogICAgICAgIGxleHNvcnQgOiBJbmRpcmVjdCBzdGFibGUgc29ydCB3aXRoIG11bHRpcGxlIGtleXMuCiAgICAgICAgbmRhcnJheS5zb3J0IDogSW5wbGFjZSBzb3J0LgoKICAgICAgICBOb3RlcwogICAgICAgIC0tLS0tCiAgICAgICAgU2VlIGBzb3J0YCBmb3Igbm90ZXMgb24gdGhlIGRpZmZlcmVudCBzb3J0aW5nIGFsZ29yaXRobXMu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ICAgICAgIFNvcnRpbmcgYWxnb3JpdGhtLiBEZWZhdWx0IGlzICdxdWlja3NvcnQnLgogICAgICAgIG9yZGVyIDogbGlzdCwgb3B0aW9uYWwKICAgICAgICAgICAgV2hlbiBgYWAgaXMgYSBzdHJ1Y3R1cmVkIGFycmF5LCB0aGlzIGFyZ3VtZW50IHNwZWNpZmllcyB3aGljaCBmaWVsZHMKICAgICAgICAgICAgdG8gY29tcGFyZSBmaXJzdCwgc2Vjb25kLCBhbmQgc28gb24uICBUaGlzIGxpc3QgZG9lcyBub3QgbmVlZCB0bwogICAgICAgICAgICBpbmNsdWRlIGFsbCBvZiB0aGUgZmllbGRzLgogICAgICAgIGVuZHdpdGggOiB7VHJ1ZSwgRmFsc2V9LCBvcHRpb25hbAogICAgICAgICAgICBXaGV0aGVyIG1pc3NpbmcgdmFsdWVzIChpZiBhbnkpIHNob3VsZCBiZSB0cmVhdGVkIGFzIHRoZSBsYXJnZXN0IHZhbHVlcwogICAgICAgICAgICAoVHJ1ZSkgb3IgdGhlIHNtYWxsZXN0IHZhbHVlcyAoRmFsc2UpCiAgICAgICAgICAgIFdoZW4gdGhlIGFycmF5IGNvbnRhaW5zIHVubWFza2VkIHZhbHVlcyBhdCB0aGUgc2FtZSBleHRyZW1lcyBvZiB0aGUKICAgICAgICAgICAgZGF0YXR5cGUsIHRoZSBvcmRlcmluZyBvZiB0aGVzZSB2YWx1ZXMgYW5kIHRoZSBtYXNrZWQgdmFsdWVzIGlzCiAgICAgICAgICAgIHVuZGVmaW5lZC4KICAgICAgICBmaWxsX3ZhbHVlIDoge3Zhcn0sIG9wdGlvbmFsCiAgICAgICAgICAgIFZhbHVlIHVzZWQgaW50ZXJuYWxseSBmb3IgdGhlIG1hc2tlZCB2YWx1ZXMuCiAgICAgICAgICAgIElmIGBgZmlsbF92YWx1ZWBgIGlzIG5vdCBOb25lLCBpdCBzdXBlcnNlZGVzIGBgZW5kd2l0aGBgLgoKICAgICAgICBSZXR1cm5zCiAgICAgICAgLS0tLS0tLQogICAgICAgIHNvcnRlZF9hcnJheSA6IG5kYXJyYXkKICAgICAgICAgICAgQXJyYXkgb2YgdGhlIHNhbWUgdHlwZSBhbmQgc2hhcGUgYXMgYGFgLgoKICAgICAgICBTZWUgQWxzbwogICAgICAgIC0tLS0tLS0tCiAgICAgICAgbmRhcnJheS5zb3J0IDogTWV0aG9kIHRvIHNvcnQgYW4gYXJyYXkgaW4tcGxhY2UuCiAgICAgICAgYXJnc29ydCA6IEluZGlyZWN0IHNvcnQuCiAgICAgICAgbGV4c29ydCA6IEluZGlyZWN0IHN0YWJsZSBzb3J0IG9uIG11bHRpcGxlIGtleXMuCiAgICAgICAgc2VhcmNoc29ydGVkIDogRmluZCBlbGVtZW50cyBpbiBhIHNvcnRlZCBhcnJheS4KCiAgICAgICAgTm90ZXMKICAgICAgICAtLS0tLQogICAgICAgIFNlZSBgYHNvcnRgYCBmb3Igbm90ZXMgb24gdGhlIGRpZmZlcmVudCBzb3J0aW5nIGFsZ29yaXRobXMuCgogICAgICAgIEV4YW1wbGVzCiAgICAgICAgLS0tLS0tLS0KICAgICAgICA+Pj4gYSA9IG1hLmFycmF5KFsxLCAyLCA1LCA0LCAzXSxtYXNrPVswLCAxLCAwLCAxLCAwXSkKICAgICAgICA+Pj4gIyBEZWZhdWx0CiAgICAgICAgPj4+IGEuc29ydCgpCiAgICAgICAgPj4+IHByaW50KGEpCiAgICAgICAgWzEgMyA1IC0tIC0tXQoKICAgICAgICA+Pj4gYSA9IG1hLmFycmF5KFsxLCAyLCA1LCA0LCAzXSxtYXNrPVswLCAxLCAwLCAxLCAwXSkKICAgICAgICA+Pj4gIyBQdXQgbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGZyb250CiAgICAgICAgPj4+IGEuc29ydChlbmR3aXRoPUZhbHNlKQogICAgICAgID4+PiBwcmludChhKQogICAgICAgIFstLSAtLSAxIDMgNV0KCiAgICAgICAgPj4+IGEgPSBtYS5hcnJheShbMSwgMiwgNSwgNCwgM10sbWFzaz1bMCwgMSwgMCwgMSwgMF0pCiAgICAgICAgPj4+ICMgZmlsbF92YWx1ZSB0YWtlcyBvdmVyIGVuZHdpdGgKICAgICAgICA+Pj4gYS5zb3J0KGVuZHdpdGg9RmFsc2UsIGZpbGxfdmFsdWU9MykKICAgICAgICA+Pj4gcHJpbnQoYSkKICAg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aGVyd2lzZSwgaWYgYGF4aXNgIGlzCiAgICAgICAgICAgIGdpdmVuIGFuZCB0aGUgYXJyYXkgaXMgYXQgbGVhc3QgMi1ELCB0aGUgcmVzdWx0IGlzIGEgbWFza2VkIGFycmF5IHdpdGgKICAgICAgICAgICAgZGltZW5zaW9uIG9uZSBzbWFsbGVyIHRoYW4gdGhlIGFycmF5IG9uIHdoaWNoIGBtaW5pYCBpcyBjYWxsZWQuCgogICAgICAgIEV4YW1wbGVzCiAgICAgICAgLS0tLS0tLS0KICAgICAgICA+Pj4geCA9IG5wLm1hLmFycmF5KG5wLmFyYW5nZSg2KSwgbWFzaz1bMCAsMSwgMCwgMCwgMCAsMV0pLnJlc2hhcGUoMywgMikKICAgICAgICA+Pj4gcHJpbnQoeCkKICAgICAgICBbWzAgLS1dCiAgICAgICAgIFsyIDNdCiAgICAgICAgIFs0IC0tXV0KICAgICAgICA+Pj4geC5taW5pKCkKICAgICAgICAwCiAgICAgICAgPj4+IHgubWluaShheGlzPTApCiAgICAgICAgbWFza2VkX2FycmF5KGRhdGEgPSBbMCAzXSwKICAgICAgICAgICAgICAgICAgICAgbWFzayA9IFtGYWxzZSBGYWxzZV0sCiAgICAgICAgICAgICAgIGZpbGxfdmFsdWUgPSA5OTk5OTkpCiAgICAgICAgPj4+IHByaW50KHgubWluaShheGlzPTEpKQogICAgICAgIFswIDIgNF0KCiAgICAgICAgVGhlcmUgaXMgYSBzbWFsbCBkaWZmZXJlbmNlIGJldHdlZW4gYG1pbmlgIGFuZCBgbWluYDoKCiAgICAgICAgPj4+IHhbOiwxXS5taW5pKGF4aXM9MCkKICAgICAgICBtYXNrZWRfYXJyYXkoZGF0YSA9IC0tLAogICAgICAgICAgICAgICAgICAgICBtYXNrID0gVHJ1ZSwKICAgICAgICAgICAgICAgZmlsbF92YWx1ZSA9IDk5OTk5OSkKICAgICAgICA+Pj4geFs6LDFdLm1pbihheGlzPTApCiAgICAgICAgbWFza2VkCiAgICAgICAgekxgbWluaWAgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSBgbWluYCBtZXRob2Qgb3IgYG5wLm1hLm1pbmlt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aXNgIHBhcmFtZXRlci4gVGhpcyBmdW5jdGlvbiBiZWhhdmVzIHRoZSBzYW1lIGFzCiAgICBgbnVtcHkuZXhwYW5kX2RpbXNgIGJ1dCBwcmVzZXJ2ZXMgbWFza2VkIGVsZW1lbnRzLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuZXhwYW5kX2RpbXMgOiBFcXVpdmFsZW50IGZ1bmN0aW9uIGluIHRvcC1sZXZlbCBOdW1QeSBtb2R1bGUuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gaW1wb3J0IG51bXB5Lm1hIGFzIG1hCiAgICA+Pj4geCA9IG1hLmFycmF5KFsxLCAyLCA0XSkKICAgID4+PiB4WzFdID0gbWEubWFza2VkCiAgICA+Pj4geAogICAgbWFza2VkX2FycmF5KGRhdGEgPSBbMSAtLSA0XSwKICAgICAgICAgICAgICAgICBtYXNrID0gW0ZhbHNlICBUcnVlIEZhbHNlXSwKICAgICAgICAgICBmaWxsX3ZhbHVlID0gOTk5OTk5KQogICAgPj4+IG5wLmV4cGFuZF9kaW1zKHgsIGF4aXM9MCkKICAgIGFycmF5KFtbMSwgMiwgNF1dKQogICAgPj4+IG1hLmV4cGFuZF9kaW1zKHgsIGF4aXM9MCkKICAgIG1hc2tlZF9hcnJheShkYXRhID0KICAgICBbWzEgLS0gNF1dLAogICAgICAgICAgICAgICAgIG1hc2sgPQogICAgIFtbRmFsc2UgIFRydWUgRmFsc2VdXSwKICAgICAgICAgICBmaWxsX3ZhbHVlID0gOTk5OTk5KQoKICAgIFRoZSBzYW1lIHJlc3VsdCBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgc2xpY2luZyBzeW50YXggd2l0aCBgbnAubmV3YXhpc2AuCgogICAgPj4+IHhbbnAubmV3YXhpcywgOl0KICAgIG1hc2tlZF9hcnJheShkYXRhID0KICAgICBbWzEgLS0gNF1dLAogICAgICAgICAgICAgICAgIG1hc2sgPQogICAgIFtbRmFsc2UgIFRydWUgRmFsc2VdXSwKICAgICAgICAgICBmaWxsX3ZhbHVlID0gOTk5OTk5KQoKICAgICkH2g1uX2V4cGFuZF9k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IHdpdGggcmVwZWF0ZWQgY29waWVzIG9mIGB4YCAoaW4gdGhlIG9yZGVyIHRoYXQgdGhlCiAgICBkYXRhIGFyZSBzdG9yZWQgaW4gbWVtb3J5KS4gSWYgYHhgIGlzIG1hc2tlZCwgdGhlIG5ldyBhcnJheSB3aWxsIGJlCiAgICBtYXNrZWQsIGFuZCB0aGUgbmV3IG1hc2sgd2lsbCBiZSBhIHJlcGV0aXRpb24gb2YgdGhlIG9sZCBvbmUuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5yZXNpemUgOiBFcXVpdmFsZW50IGZ1bmN0aW9uIGluIHRoZSB0b3AgbGV2ZWwgTnVtUHkgbW9kdWxlLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGltcG9ydCBudW1weS5tYSBhcyBtYQogICAgPj4+IGEgPSBtYS5hcnJheShbWzEsIDJdICxbMywgNF1dKQogICAgPj4+IGFbMCwgMV0gPSBtYS5tYXNrZWQKICAgID4+PiBhCiAgICBtYXNrZWRfYXJyYXkoZGF0YSA9CiAgICAgW1sxIC0tXQogICAgIFszIDRdXSwKICAgICAgICAgICAgICAgICBtYXNrID0KICAgICBbW0ZhbHNlICBUcnVlXQogICAgIFtGYWxzZSBGYWxzZV1dLAogICAgICAgICAgIGZpbGxfdmFsdWUgPSA5OTk5OTkpCiAgICA+Pj4gbnAucmVzaXplKGEsICgzLCAzKSkKICAgIGFycmF5KFtbMSwgMiwgM10sCiAgICAgICAgICAgWzQsIDEsIDJdLAogICAgICAgICAgIFszLCA0LCAxXV0pCiAgICA+Pj4gbWEucmVzaXplKGEsICgzLCAzKSkKICAgIG1hc2tlZF9hcnJheShkYXRhID0KICAgICBbWzEgLS0gM10KICAgICBbNCAxIC0tXQogICAgIFszIDQgMV1dLAogICAgICAgICAgICAgICAgIG1hc2sgPQogICAgIFtbRmFsc2UgIFRydWUgRmFsc2VdCiAgICAgW0ZhbHNlIEZhbHNlICBUcnVlXQogICAgIFtGYWxzZSBGYWxzZSBGYWxzZV1dLAogICAgICAgICAgIGZpbGxfdmFsdWUgPSA5OTk5OTkpCgogICAg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ZSAodGhlIHJlc3VsdCBvZgogICAgYGBjb25kaXRpb24ubm9uemVybygpYGApLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGNvbmRpdGlvbiA6IGFycmF5X2xpa2UsIGJvb2wKICAgICAgICBUaGUgY29uZGl0aW9uIHRvIG1lZXQuIEZvciBlYWNoIFRydWUgZWxlbWVudCwgeWllbGQgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICBlbGVtZW50IGZyb20gYHhgLCBvdGhlcndpc2UgZnJvbSBgeWAuCiAgICB4LCB5IDogYXJyYXlfbGlrZSwgb3B0aW9uYWwKICAgICAgICBWYWx1ZXMgZnJvbSB3aGljaCB0byBjaG9vc2UuIGB4YCwgYHlgIGFuZCBgY29uZGl0aW9uYCBuZWVkIHRvIGJlCiAgICAgICAgYnJvYWRjYXN0YWJsZSB0byBzb21lIHNoYXBlLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IE1hc2tlZEFycmF5IG9yIHR1cGxlIG9mIG5kYXJyYXlzCiAgICAgICAgVGhlIHJlc3VsdGluZyBtYXNrZWQgYXJyYXkgaWYgYHhgIGFuZCBgeWAgd2VyZSBnaXZlbiwgb3RoZXJ3aXNlCiAgICAgICAgdGhlIHJlc3VsdCBvZiBgYGNvbmRpdGlvbi5ub256ZXJvKClgYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LndoZXJlIDogRXF1aXZhbGVudCBmdW5jdGlvbiBpbiB0aGUgdG9wLWxldmVsIE51bVB5IG1vZHVsZS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAubWEuYXJyYXkobnAuYXJhbmdlKDkuKS5yZXNoYXBlKDMsIDMpLCBtYXNrPVtbMCwgMSwgMF0sCiAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsIDAsIDFdLAogICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAxLCAwXV0pCiAgICA+Pj4gcHJpbnQoeCkKICAgIFtbMC4wIC0tIDIuMF0KICAgICBbLS0gNC4wIC0tXQogICAgIFs2LjAgLS0gOC4wXV0KICAgID4+PiBucC5tYS53aGVyZSh4ID4gNSkgICAgIyByZXR1cm4gdGhlIGluZGljZXMgd2hlcmUgeCA+IDUKICAgIChhcnJheShbMiwgMl0pLCBhcnJheShbMCwgMl0pKQoKICAgID4+PiBwcmludChucC5tYS53aGVyZSh4ID4gNSwgeCwgLTMuMTQxNikpCiAgICBbWy0zLjE0MTYgLS0gLTMuMTQxNl0KICAgICBbLS0gLTMuMTQxNiAtLV0KICAgICBbNi4wIC0tIDguMF1dCgogICAgVHLNAAAAeilNdXN0IHByb3ZpZGUgYm90aCAneCcgYW5kICd5JyBvciBuZWl0aGVyLnLKAQAARnLLAAAAKQFy+AAAACkBcjcBAAApEXIMAAAAckUAAAByHwEAAHKcAAAAclQAAAByXgAAAHJgAAAAcn8AAABy8gAAAHLGAAAAcvgAAAByngAAAHLFAAAAcgsAAAByJQAAAHKbAAAAcoAAAAApDHJ+AQAAckEBAABy6wEAANoHbWlzc2luZ3JVAgAAWgJ4ZFoCeWTaAmNtWgJ4bVoCeW1yNgEAAHI3AQAAcssAAAByywAAAHLMAAAAcsUAAACQGwAAcy4AAAAAMRYBCAEIAQgBCAMKAQgBCAMIAQgBCAQQARABEgEQARABEAIOAQ4BGgMYAQQCYwQAAAAAAAAACQAAAAYAAAADAAAAc6wAAABkAWQChACJAGQDZASEAIkBdAB8AGQFgwJ9BIcBZgFkBmQHhAh8AUQAgwF9BYcAZgFkCGQHhAh8AUQAgwF9BnQBagJ8BHwFfANkCY0DfQd0A3QEfAd0BXwAgwGDAmQFZApkC40DfQd0AWoCfAR8BnwDfAJkDI0EoAZ0B6EBfQh8AmQNawlynnQIfAJ0B4MCcpp8AqAJfAehAQEAfAJTAHwIoAl8B6EBAQB8CFMAKQ5hNgUAAAogICAgVXNlIGFuIGluZGV4IGFycmF5IHRvIGNvbnN0cnVjdCBhIG5ldyBhcnJheSBmcm9tIGEgc2V0IG9mIGNob2ljZXMuCgogICAgR2l2ZW4gYW4gYXJyYXkgb2YgaW50ZWdlcnMgYW5kIGEgc2V0IG9mIG4gY2hvaWNlIGFycmF5cywgdGhpcyBtZXRob2QKICAgIHdpbGwgY3JlYXRlIGEgbmV3IGFycmF5IHRoYXQgbWVyZ2VzIGVhY2ggb2YgdGhlIGNob2ljZSBhcnJheXMuICBXaGVyZSBhCiAgICB2YWx1ZSBpbiBgYWAgaXMgaSwgdGhlIG5ldyBhcnJheSB3aWxsIGhhdmUgdGhlIHZhbHVlIHRoYXQgY2hvaWNlc1tpXQogICAgY29udGFpbnMgaW4gdGhlIHNhbWUgcGxhY2UuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IG5kYXJyYXkgb2YgaW50cwogICAgICAgIFRoaXMgYXJyYXkgbXVzdCBjb250YWluIGludGVnZXJzIGluIGBgWzAsIG4tMV1gYCwgd2hlcmUgbiBpcyB0aGUKICAgICAgICBudW1iZXIgb2YgY2hvaWNlcy4KICAgIGNob2ljZXMgOiBzZXF1ZW5jZSBvZiBhcnJheXMKICAgICAgICBDaG9pY2UgYXJyYXlzLiBUaGUgaW5kZXggYXJyYXkgYW5kIGFsbCBvZiB0aGUgY2hvaWNlcyBzaG91bGQgYmUKICAgICAgICBicm9hZGNhc3RhYmxlIHRvIHRoZSBzYW1lIHNoYXBlLgogICAgb3V0IDogYXJyYXksIG9wdGlvbmFsCiAgICAgICAgSWYgcHJvdmlkZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoaXMgYXJyYXkuIEl0IHNob3VsZAogICAgICAgIGJlIG9mIHRoZSBhcHByb3ByaWF0ZSBzaGFwZSBhbmQgYGR0eXBlYC4KICAgIG1vZGUgOiB7J3JhaXNlJywgJ3dyYXAnLCAnY2xpcCd9LCBvcHRpb25hbAogICAgICAgIFNwZWNpZmllcyBob3cgb3V0LW9mLWJvdW5kcyBpbmRpY2VzIHdpbGwgYmVoYXZlLgoKICAgICAgICAqICdyYWlzZScgOiByYWlzZSBhbiBlcnJvcgogICAgICAgICogJ3dyYXAnIDogd3JhcCBhcm91bmQKICAgICAgICAqICdjbGlwJyA6IGNsaXAgdG8gdGhlIHJhbmdlCgogICAgUmV0dXJucwogICAgLS0tLS0tLQog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bWVudHMgYXJlIG1hc2tlZCkuICBUaGUgcmVzdWx0IGlzIGEgTWFza2VkQXJyYXkgd2l0aCBgbWFza2Agc2V0CiAgICAgICAgdG8gYG5vbWFza2AgKEZhbHNlKS4gTXVzdCBiZSBhIDJEIGFycmF5LgogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBBeGlzIGFsb25nIHdoaWNoIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi4gSWYgTm9uZSwgYXBwbGllcyB0byBhCiAgICAgICAgZmxhdHRlbmVkIHZlcnNpb24gb2YgdGhlIGFycmF5LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGEgOiBNYXNrZWRBcnJheQogICAgICAgIEEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgYXJyYXksIG1hc2tlZCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlCiAgICAgICAgb2YgdGhlIGBheGlzYCBwYXJhbWV0ZXIuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICBJZiBpbnB1dCBhcnJheSBgYWAgaXMgbm90IDJELgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbWFza19yb3dzIDogTWFzayByb3dzIG9mIGEgMkQgYXJyYXkgdGhhdCBjb250YWluIG1hc2tlZCB2YWx1ZXMuCiAgICBtYXNrX2NvbHMgOiBNYXNrIGNvbHMgb2YgYSAyRCBhcnJheSB0aGF0IGNvbnRhaW4gbWFza2VkIHZhbHVlcy4KICAgIG1hc2tlZF93aGVyZSA6IE1hc2sgd2hlcmUgYSBjb25kaXRpb24gaXMgbWV0LgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhlIGlucHV0IGFycmF5J3MgbWFzayBpcyBtb2RpZmllZCBieSB0aGlzIGZ1bmN0aW9uLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGltcG9ydCBudW1weS5tYSBhcyBtYQogICAgPj4+IGEgPSBucC56ZXJvcygoMywgMyksIGR0eXBlPW5wLmludCkKICAgID4+PiBhWzEsIDFdID0gMQogICAgPj4+IGEKICAgIGFycmF5KFtbMCwgMCwgMF0sCiAgICAgICAgICAgWzAsIDEsIDBdLAogICAgICAgICAgIFswLCAwLCAwXV0pCiAgICA+Pj4gYSA9IG1hLm1hc2tlZF9lcXVhbChhLCAxKQogICAgPj4+IGEKICAgIG1hc2tlZF9hcnJheShkYXRhID0KICAgICBbWzAgMCAwXQogICAgIFswIC0tIDBdCiAgICAgWzAgMCAwXV0sCiAgICAgICAgICBtYXNrID0KICAgICBbW0ZhbHNlIEZhbHNlIEZhbHNlXQogICAgIFtGYWxzZSAgVHJ1ZSBGYWxzZV0KICAgICBbRmFsc2UgRmFsc2UgRmFsc2VdXSwKICAgICAgICAgIGZpbGxfdmFsdWU9OTk5OTk5KQogICAgPj4+IG1hLm1hc2tfcm93Y29scyhhKQogICAgbWFza2VkX2FycmF5KGRhdGEgPQogICAgIFtbMCAtLSAwXQogICAgIFstLSAtLSAtLV0KICAgICBbMCAtLSAwXV0sCiAgICAgICAgICBtYXNrID0KICAgICBbW0ZhbHNlICBUcnVlIEZhbHNlXQogICAgIFsgVHJ1ZSAgVHJ1ZSAgVHJ1ZV0KICAgICBbRmFsc2UgIFRydWUgRmFsc2VdXSwKICAgICAgICAgIGZpbGxfdmFsdWU9OTk5OTk5KQoKICAgIEYpAXIyAQAAcsoBAAB6Jm1hc2tfcm93Y29scyB3b3JrcyBmb3IgMkQgYXJyYXlzIG9ubHkucgEAAAApA05yzQAAAHLOAAAATnLNAAAAKQxyDQAAAHKZAAAActoBAAByXwAAAHKbAAAAciUAAABynAAAAHI5AQAAckEAAAByfwAAAHLyAAAA2gZ1bmlxdWUpBHIlAQAAcmEBAABy6gAAAFoJbWFza2VkdmFscssAAAByywAAAHLMAAAA2gxtYXNrX3Jvd2NvbHNUHAAAcxoAAAAASwwBCgEIAQgCEAEEAQgBDAEEARIBCAEaAXKBAgAAYwQAAAAAAAAACQAAAAYAAABDAAAAcwIBAAB8AnIsfABqAGQBawJyLHwBagBkAWsCcix0AXwAZAKDAn0AdAF8AWQDgwJ9AXQCfACDAQ8AfQR0AnwBgwEPAH0FfANkBGsIcqB0A6AEdAV8AGQCgwJ0BXwBZAKDAqECfQZ0A6AEfAR8BaECDwB9B3wGagBkAmsCcoJ0A6AGfAahAX0GfAagB3QIfAB8AYMCoQF9CHwIoAl8B6EBAQB8CFMAdAOgBHQFfABkAoMCdAV8AWQCgwJ8A2oKoQN9BnwDagtqDHwGagxrA3LadAOgDXwGagx0DqECfANfD3QDoAR8BHwFfANqD6EDAQB0A6AQfANqD3wDag+hAgEAfANTAGQEUwApBWGZBwAACiAgICBSZXR1cm4gdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBhcnJheXMuCgogICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgZXF1aXZhbGVudCBvZiBgbnVtcHkuZG90YCB0aGF0IHRha2VzIG1hc2tlZCB2YWx1ZXMKICAgIGludG8gYWNjb3VudC4gTm90ZSB0aGF0IGBzdHJpY3RgIGFuZCBgb3V0YCBhcmUgaW4gZGlmZmVyZW50IHBvc2l0aW9uCiAgICB0aGFuIGluIHRoZSBtZXRob2QgdmVyc2lvbi4gSW4gb3JkZXIgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIHRoZQogICAgY29ycmVzcG9uZGluZyBtZXRob2QsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBiZQogICAgdHJlYXRlZCBhcyBrZXl3b3JkIG9ubHkuICBBdCBzb21lIHBvaW50IHRoYXQgbWF5IGJlIG1hbmRhdG9yeS4KCiAgICAuLiBub3RlOjoKICAgICAgV29ya3Mgb25seSB3aXRoIDItRCBhcnJheXMgYXQgdGhlIG1vbWVudC4KCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSwgYiA6IG1hc2tlZF9hcnJheV9saWtlCiAgICAgICAgSW5wdXRzIGFycmF5cy4KICAgIHN0cmljdCA6IGJvb2wsIG9wdGlvbmFsCiAgICAgICAgV2hldGhlciBtYXNrZWQgZGF0YSBhcmUgcHJvcGFnYXRlZCAoVHJ1ZSkgb3Igc2V0IHRvIDAgKEZhbHNlKSBmb3IKICAgICAgICB0aGUgY29tcHV0YXRpb24uIERlZmF1bHQgaXMgRmFsc2UuICBQcm9wYWdhdGluZyB0aGUgbWFzayBtZWFucyB0aGF0CiAgICAgICAgaWYgYSBtYXNrZWQgdmFsdWUgYXBwZWFycyBpbiBhIHJvdyBvciBjb2x1bW4sIHRoZSB3aG9sZSByb3cgb3IKICAgICAgICBjb2x1bW4gaXMgY29uc2lkZXJlZCBtYXNrZWQuCiAgICBvdXQgOiBtYXNrZWRfYXJyYXksIG9wdGlvbmFsCiAgICAgICAgT3V0cHV0IGFyZ3VtZW50LiBUaGlzIG11c3QgaGF2ZSB0aGUgZXhhY3Qga2luZCB0aGF0IHdvdWxkIGJlIHJldHVybmVkCiAgICAgICAgaWYgaXQgd2FzIG5vdCB1c2VkLiBJbiBwYXJ0aWN1bGFyLCBpdCBtdXN0IGhhdmUgdGhlIHJpZ2h0IHR5cGUsIG11c3QgYmUKICAgICAgICBDLWNvbnRpZ3VvdXMsIGFuZCBpdHMgZHR5cGUgbXVzdCBiZSB0aGUgZHR5cGUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZAogICAgICAgIGZvciBgZG90KGEsYilgLiBUaGlzIGlzIGEgcGVyZm9ybWFuY2UgZmVhdHVyZS4gVGhlcmVmb3JlLCBpZiB0aGVzZQogICAgICAgIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQsIGluc3RlYWQgb2YgYXR0ZW1wdGluZwogICAgICAgIHRvIGJlIGZsZXhpYmxlLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEwLjIKCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmRvdCA6IEVxdWl2YWxlbnQgZnVuY3Rpb24gZm9yIG5kYXJyYXlzLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBtYS5hcnJheShbWzEsIDIsIDNdLCBbNCwgNSwgNl1dLCBtYXNrPVtbMSwgMCwgMF0sIFswLCAwLCAwXV0pCiAgICA+Pj4gYiA9IG1hLmFycmF5KFtbMSwgMl0sIFszLCA0XSwgWzUsIDZdXSwgbWFzaz1bWzEsIDBdLCBbMCwgMF0sIFswLCAwXV0pCiAgICA+Pj4gbnAubWEuZG90KGEsIGIpCiAgICBtYXNrZWRfYXJyYXkoZGF0YSA9CiAg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YWwsIGRlcGVuZGluZyBvbiB0aGUgYG1hc2tlZF9lcXVhbGAKICAgIGFyZ3VtZW50LgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEsIGIgOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXlzIHRvIGNvbXBhcmUuCiAgICBtYXNrZWRfZXF1YWwgOiBib29sLCBvcHRpb25hbAogICAgICAgIFdoZXRoZXIgbWFza2VkIHZhbHVlcyBpbiBgYWAgYW5kIGBiYCBhcmUgY29uc2lkZXJlZCBlcXVhbCAoVHJ1ZSkgb3Igbm90CiAgICAgICAgKEZhbHNlKS4gVGhleSBhcmUgY29uc2lkZXJlZCBlcXVhbCBieSBkZWZhdWx0LgogICAgcnRvbCA6IGZsb2F0LCBvcHRpb25hbAogICAgICAgIFJlbGF0aXZlIHRvbGVyYW5jZS4gVGhlIHJlbGF0aXZlIGRpZmZlcmVuY2UgaXMgZXF1YWwgdG8gYGBydG9sICogYmBgLgogICAgICAgIERlZmF1bHQgaXMgMWUtNS4KICAgIGF0b2wgOiBmbG9hdCwgb3B0aW9uYWwKICAgICAgICBBYnNvbHV0ZSB0b2xlcmFuY2UuIFRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGlzIGVxdWFsIHRvIGBhdG9sYC4KICAgICAgICBEZWZhdWx0IGlzIDFlLTguCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgeSA6IGJvb2wKICAgICAgICBSZXR1cm5zIFRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIGVxdWFsIHdpdGhpbiB0aGUgZ2l2ZW4KICAgICAgICB0b2xlcmFuY2UsIEZhbHNlIG90aGVyd2lzZS4gSWYgZWl0aGVyIGFycmF5IGNvbnRhaW5zIE5hTiwgdGhlbgogICAgICAgIEZhbHNlIGlzIHJldHVybmVkLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgYWxsLCBhbnkKICAgIG51bXB5LmFsbGNsb3NlIDogdGhlIG5vbi1tYXNrZWQgYGFsbGNsb3NlYC4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIElmIHRoZSBmb2xsb3dpbmcgZXF1YXRpb24gaXMgZWxlbWVudC13aXNlIFRydWUsIHRoZW4gYGFsbGNsb3NlYCByZXR1cm5zCiAgICBUcnVlOjoKCiAgICAgIGFic29sdXRlKGBhYCAtIGBiYCkgPD0gKGBhdG9sYCArIGBydG9sYCAqIGFic29sdXRlKGBiYCkpCgogICAgUmV0dXJuIFRydWUgaWYgYWxsIGVsZW1lbnRzIG9mIGBhYCBhbmQgYGJgIGFyZSBlcXVhbCBzdWJqZWN0IHRvCiAgICBnaXZlbiB0b2xlcmFuY2VzLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBtYS5hcnJheShbMWUxMCwgMWUtNywgNDIuMF0sIG1hc2s9WzAsIDAsIDFdKQogICAgPj4+IGEKICAgIG1hc2tlZF9hcnJheShkYXRhID0gWzEwMDAwMDAwMDAwLjAgMWUtMDcgLS1dLAogICAgICAgICAgICAgICAgIG1hc2sgPSBbRmFsc2UgRmFsc2UgIFRydWVdLAogICAgICAgICAgIGZpbGxfdmFsdWUgPSAxZSsyMCkKICAgID4+PiBiID0gbWEuYXJyYXkoWzFlMTAsIDFlLTgsIC00Mi4wXSwgbWFzaz1bMCwgMCwgMV0pCiAgICA+Pj4gbWEuYWxsY2xvc2UoYSwgYikKICAgIEZhbHNlCgogICAgPj4+IGEgPSBtYS5hcnJheShbMWUxMCwgMWUtOCwgNDIuMF0sIG1hc2s9WzAsIDAsIDFdKQogICAgPj4+IGIgPSBtYS5hcnJheShbMS4wMDAwMWUxMCwgMWUtOSwgLTQyLjBdLCBtYXNrPVswLCAwLCAxXSkKICAgID4+PiBtYS5hbGxjbG9zZShhLCBiKQogICAgVHJ1ZQogICAgPj4+IG1hLmFsbGNsb3NlKGEsIGIsIG1hc2tlZF9lcXVhbD1GYWxzZSkKICAgIEZhbHNlCgogICAgTWFza2VkIHZhbHVlcyBhcmUgbm90IGNvbXBhcmVkIGRpcmVjdGx5LgoKICAgID4+PiBhID0gbWEuYXJyYXkoWzFlMTAsIDFlLTgsIDQyLjBdLCBtYXNrPVswLCAwLCAxXSkKICAgID4+PiBiID0gbWEuYXJyYXkoWzEuMDAwMDFlMTAsIDFlLTksIDQyLjBdLCBtYXNrPVswLCAw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ZC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICByZXN1bHQgOiBNYXNrZWRBcnJheQogICAgICAgIFRoZSBjb25zdHJ1Y3RlZCBtYXNrZWQgYXJyYXkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBNYXNrZWRBcnJheS50b2ZsZXggOiBCdWlsZCBhIGZsZXhpYmxlLXR5cGUgYXJyYXkgZnJvbSBhIG1hc2tlZCBhcnJheS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAubWEuYXJyYXkobnAuYXJhbmdlKDkpLnJlc2hhcGUoMywgMyksIG1hc2s9WzBdICsgWzEsIDBdICogNCkKICAgID4+PiByZWMgPSB4LnRvZmxleCgpCiAgICA+Pj4gcmVjCiAgICBhcnJheShbWygwLCBGYWxzZSksICgxLCBUcnVlKSwgKDIsIEZhbHNlKV0sCiAgICAgICAgICAgWygzLCBUcnVlKSwgKDQsIEZhbHNlKSwgKDUsIFRydWUpXSwKICAgICAgICAgICBbKDYsIEZhbHNlKSwgKDcsIFRydWUpLCAoOCwgRmFsc2UpXV0sCiAgICAgICAgICBkdHlwZT1bKCdfZGF0YScsICc8aTQnKSwgKCdfbWFzaycsICd8YjEnKV0pCiAgICA+Pj4geDIgPSBucC5tYS5mcm9tZmxleChyZWMpCiAgICA+Pj4geDIKICAgIG1hc2tlZF9hcnJheShkYXRhID0KICAgICBbWzAgLS0gMl0KICAgICBbLS0gNCAtLV0KICAgICBbNiAtLSA4XV0sCiAgICAgICAgICAgICAgICAgbWFzayA9CiAgICAgW1tGYWxzZSAgVHJ1ZSBGYWxzZV0KICAgICBbIFRydWUgRmFsc2UgIFRydWVdCiAgICAgW0ZhbHNlICBUcnVlIEZhbHNlXV0sCiAgICAgICAgICAgZmlsbF92YWx1ZSA9IDk5OTk5OSkKCiAgICBFeHRyYSBmaWVsZHMgY2FuIGJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZWQgYXJyYXkgYnV0IGFyZSBkaXNjYXJkZWQ6CgogICAgPj4+IGR0ID0gWygnX2RhdGEnLCAnPGk0JyksICgnX21hc2snLCAnfGIx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ICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgVmFsdWVzIGFyZSBhcHBlbmRlZCB0byBhIGNvcHkgb2YgdGhpcyBhcnJheS4KICAgIGIgOiBhcnJheV9saWtlCiAgICAgICAgVGhlc2UgdmFsdWVzIGFyZSBhcHBlbmRlZCB0byBhIGNvcHkgb2YgYGFgLiAgSXQgbXVzdCBiZSBvZiB0aGUKICAgICAgICBjb3JyZWN0IHNoYXBlICh0aGUgc2FtZSBzaGFwZSBhcyBgYWAsIGV4Y2x1ZGluZyBgYXhpc2ApLiAgSWYgYGF4aXNgCiAgICAgICAgaXMgbm90IHNwZWNpZmllZCwgYGJgIGNhbiBiZSBhbnkgc2hhcGUgYW5kIHdpbGwgYmUgZmxhdHRlbmVkCiAgICAgICAgYmVmb3JlIHVzZS4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgVGhlIGF4aXMgYWxvbmcgd2hpY2ggYHZgIGFyZSBhcHBlbmRlZC4gIElmIGBheGlzYCBpcyBub3QgZ2l2ZW4sCiAgICAgICAgYm90aCBgYWAgYW5kIGBiYCBhcmUgZmxhdHRlbmVkIGJlZm9yZSB1c2UuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgYXBwZW5kIDogTWFza2VkQXJyYXkKICAgICAgICBBIGNvcHkgb2YgYGFgIHdpdGggYGJgIGFwcGVuZGVkIHRvIGBheGlzYC4gIE5vdGUgdGhhdCBgYXBwZW5kYAogICAgICAgIGRvZXMgbm90IG9jY3VyIGluLXBsYWNlOiBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgYW5kIGZpbGxlZC4gIElmCiAgICAgICAgYGF4aXNgIGlzIE5vbmUsIHRoZSByZXN1bHQgaXMgYSBmbGF0dGVuZWQgYXJyYXkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5hcHBlbmQgOiBFcXVpdmFsZW50IGZ1bmN0aW9uIGluIHRoZSB0b3AtbGV2ZWwgTnVtUHkgbW9kdWxlLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGltcG9ydCBudW1weS5tYSBhcyBtYQogICAgPj4+IGEgPSBtYS5tYXNr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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 9
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
bench.cpython-37.pyc
3.88 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
core.cpython-37.pyc
203.12 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
extras.cpython-37.pyc
48.40 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
mrecords.cpython-37.pyc
22.00 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
setup.cpython-37.pyc
616 B
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
testutils.cpython-37.pyc
8.15 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
timer_comparison.cpython-37.pyc
10.96 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
version.cpython-37.pyc
648 B
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
1.61 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).