UNPKG

web-demuxer

Version:

Demux media files in the browser using WebAssembly, designed for WebCodecs

1 lines 121 kB
(function(X,d){typeof exports=="object"&&typeof module<"u"?d(exports):typeof define=="function"&&define.amd?define(["exports"],d):(X=typeof globalThis<"u"?globalThis:X||self,d(X["web-demuxer"]={}))})(this,function(X){"use strict";var F=Object.defineProperty;var N=(X,d,I)=>d in X?F(X,d,{enumerable:!0,configurable:!0,writable:!0,value:I}):X[d]=I;var Y=(X,d,I)=>(N(X,typeof d!="symbol"?d+"":d,I),I);var d=(l=>(l[l.AVMEDIA_TYPE_UNKNOWN=-1]="AVMEDIA_TYPE_UNKNOWN",l[l.AVMEDIA_TYPE_VIDEO=0]="AVMEDIA_TYPE_VIDEO",l[l.AVMEDIA_TYPE_AUDIO=1]="AVMEDIA_TYPE_AUDIO",l[l.AVMEDIA_TYPE_DATA=2]="AVMEDIA_TYPE_DATA",l[l.AVMEDIA_TYPE_SUBTITLE=3]="AVMEDIA_TYPE_SUBTITLE",l[l.AVMEDIA_TYPE_ATTACHMENT=4]="AVMEDIA_TYPE_ATTACHMENT",l[l.AVMEDIA_TYPE_NB=5]="AVMEDIA_TYPE_NB",l))(d||{}),I=(l=>(l[l.AV_LOG_QUIET=-8]="AV_LOG_QUIET",l[l.AV_LOG_PANIC=0]="AV_LOG_PANIC",l[l.AV_LOG_FATAL=8]="AV_LOG_FATAL",l[l.AV_LOG_ERROR=16]="AV_LOG_ERROR",l[l.AV_LOG_WARNING=24]="AV_LOG_WARNING",l[l.AV_LOG_INFO=32]="AV_LOG_INFO",l[l.AV_LOG_VERBOSE=40]="AV_LOG_VERBOSE",l[l.AV_LOG_DEBUG=48]="AV_LOG_DEBUG",l[l.AV_LOG_TRACE=56]="AV_LOG_TRACE",l))(I||{}),L=(l=>(l[l.AVSEEK_FLAG_BACKWARD=1]="AVSEEK_FLAG_BACKWARD",l[l.AVSEEK_FLAG_BYTE=2]="AVSEEK_FLAG_BYTE",l[l.AVSEEK_FLAG_ANY=4]="AVSEEK_FLAG_ANY",l[l.AVSEEK_FLAG_FRAME=8]="AVSEEK_FLAG_FRAME",l))(L||{}),G=(l=>(l.WasmWorkerLoaded="WasmWorkerLoaded",l.WASMRuntimeInitialized="WASMRuntimeInitialized",l.LoadWASM="LoadWASM",l.GetAVPacket="GetAVPacket",l.GetAVPackets="GetAVPackets",l.GetAVStream="GetAVStream",l.GetAVStreams="GetAVStreams",l.GetMediaInfo="GetMediaInfo",l.ReadAVPacket="ReadAVPacket",l.AVPacketStream="AVPacketStream",l.ReadNextAVPacket="ReadNextAVPacket",l.StopReadAVPacket="StopReadAVPacket",l.SetAVLogLevel="SetAVLogLevel",l))(G||{});const S="video",R="audio",H="subtitle",x={VIDEO:S,AUDIO:R,SUBTITLE:H},K={[S]:d.AVMEDIA_TYPE_VIDEO,[R]:d.AVMEDIA_TYPE_AUDIO,[H]:d.AVMEDIA_TYPE_SUBTITLE},J="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciAkZT0oaz0+KGtbay5BVk1FRElBX1RZUEVfVU5LTk9XTj0tMV09IkFWTUVESUFfVFlQRV9VTktOT1dOIixrW2suQVZNRURJQV9UWVBFX1ZJREVPPTBdPSJBVk1FRElBX1RZUEVfVklERU8iLGtbay5BVk1FRElBX1RZUEVfQVVESU89MV09IkFWTUVESUFfVFlQRV9BVURJTyIsa1trLkFWTUVESUFfVFlQRV9EQVRBPTJdPSJBVk1FRElBX1RZUEVfREFUQSIsa1trLkFWTUVESUFfVFlQRV9TVUJUSVRMRT0zXT0iQVZNRURJQV9UWVBFX1NVQlRJVExFIixrW2suQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ9NF09IkFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UIixrW2suQVZNRURJQV9UWVBFX05CPTVdPSJBVk1FRElBX1RZUEVfTkIiLGspKSgkZXx8e30pLFg9KGs9PihrLldhc21Xb3JrZXJMb2FkZWQ9Ildhc21Xb3JrZXJMb2FkZWQiLGsuV0FTTVJ1bnRpbWVJbml0aWFsaXplZD0iV0FTTVJ1bnRpbWVJbml0aWFsaXplZCIsay5Mb2FkV0FTTT0iTG9hZFdBU00iLGsuR2V0QVZQYWNrZXQ9IkdldEFWUGFja2V0IixrLkdldEFWUGFja2V0cz0iR2V0QVZQYWNrZXRzIixrLkdldEFWU3RyZWFtPSJHZXRBVlN0cmVhbSIsay5HZXRBVlN0cmVhbXM9IkdldEFWU3RyZWFtcyIsay5HZXRNZWRpYUluZm89IkdldE1lZGlhSW5mbyIsay5SZWFkQVZQYWNrZXQ9IlJlYWRBVlBhY2tldCIsay5BVlBhY2tldFN0cmVhbT0iQVZQYWNrZXRTdHJlYW0iLGsuUmVhZE5leHRBVlBhY2tldD0iUmVhZE5leHRBVlBhY2tldCIsay5TdG9wUmVhZEFWUGFja2V0PSJTdG9wUmVhZEFWUGFja2V0IixrLlNldEFWTG9nTGV2ZWw9IlNldEFWTG9nTGV2ZWwiLGspKShYfHx7fSk7InZpZGVvIisiIiwkZS5BVk1FRElBX1RZUEVfVklERU8sImF1ZGlvIisiIiwkZS5BVk1FRElBX1RZUEVfQVVESU8sInN1YnRpdGxlIisiIiwkZS5BVk1FRElBX1RZUEVfU1VCVElUTEU7dmFyIGd0PSgoKT0+e3ZhciBrPXNlbGYubG9jYXRpb24uaHJlZjtyZXR1cm4gZnVuY3Rpb24oTz17fSl7dmFyICQsdT1PYmplY3QuYXNzaWduKHt9LE8pLGosVyxpZT1uZXcgUHJvbWlzZSgoZSxyKT0+e2o9ZSxXPXJ9KSxvZT0hMCxUZT1PYmplY3QuYXNzaWduKHt9LHUpLGdyPSIuL3RoaXMucHJvZ3JhbSIsWGU9KGUscik9Pnt0aHJvdyByfSxLPSIiO2Z1bmN0aW9uIFN0KGUpe3JldHVybiB1LmxvY2F0ZUZpbGU/dS5sb2NhdGVGaWxlKGUsSyk6SytlfXZhciBLZSx3cixKZTtLPXNlbGYubG9jYXRpb24uaHJlZixrJiYoSz1rKSxLLnN0YXJ0c1dpdGgoImJsb2I6Iik/Sz0iIjpLPUsuc3Vic3RyKDAsSy5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpLEtlPWU9Pnt2YXIgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHIub3BlbigiR0VUIixlLCExKSxyLnNlbmQobnVsbCksci5yZXNwb25zZVRleHR9LEplPWU9Pnt2YXIgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHIub3BlbigiR0VUIixlLCExKSxyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHIuc2VuZChudWxsKSxuZXcgVWludDhBcnJheShyLnJlc3BvbnNlKX0sd3I9KGUscix0KT0+e3ZhciBuPW5ldyBYTUxIdHRwUmVxdWVzdDtuLm9wZW4oIkdFVCIsZSwhMCksbi5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixuLm9ubG9hZD0oKT0+e2lmKG4uc3RhdHVzPT0yMDB8fG4uc3RhdHVzPT0wJiZuLnJlc3BvbnNlKXtyKG4ucmVzcG9uc2UpO3JldHVybn10KCl9LG4ub25lcnJvcj10LG4uc2VuZChudWxsKX07dmFyIFplPXUucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksbmU9dS5wcmludEVycnx8Y29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpO09iamVjdC5hc3NpZ24odSxUZSksVGU9bnVsbCx1LmFyZ3VtZW50cyYmdS5hcmd1bWVudHMsdS50aGlzUHJvZ3JhbSYmKGdyPXUudGhpc1Byb2dyYW0pLHUucXVpdCYmKFhlPXUucXVpdCk7dmFyIGdlO3Uud2FzbUJpbmFyeSYmKGdlPXUud2FzbUJpbmFyeSk7dmFyIEZlLHNlPSExLHdlO2Z1bmN0aW9uIEVyKGUscil7ZXx8SihyKX12YXIgTCxOLEcsUmUseSxDLGtyLGJyO2Z1bmN0aW9uIFByKCl7dmFyIGU9RmUuYnVmZmVyO3UuSEVBUDg9TD1uZXcgSW50OEFycmF5KGUpLHUuSEVBUDE2PUc9bmV3IEludDE2QXJyYXkoZSksdS5IRUFQVTg9Tj1uZXcgVWludDhBcnJheShlKSx1LkhFQVBVMTY9UmU9bmV3IFVpbnQxNkFycmF5KGUpLHUuSEVBUDMyPXk9bmV3IEludDMyQXJyYXkoZSksdS5IRUFQVTMyPUM9bmV3IFVpbnQzMkFycmF5KGUpLHUuSEVBUEYzMj1rcj1uZXcgRmxvYXQzMkFycmF5KGUpLHUuSEVBUEY2ND1icj1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBDcj1bXSxBcj1bXSxEcj1bXTtmdW5jdGlvbiAkdCgpe2lmKHUucHJlUnVuKWZvcih0eXBlb2YgdS5wcmVSdW49PSJmdW5jdGlvbiImJih1LnByZVJ1bj1bdS5wcmVSdW5dKTt1LnByZVJ1bi5sZW5ndGg7KVJ0KHUucHJlUnVuLnNoaWZ0KCkpO2VyKENyKX1mdW5jdGlvbiBUdCgpeyF1Lm5vRlNJbml0JiYhaS5pbml0LmluaXRpYWxpemVkJiZpLmluaXQoKSxpLmlnbm9yZVBlcm1pc3Npb25zPSExLGVyKEFyKX1mdW5jdGlvbiBGdCgpe2lmKHUucG9zdFJ1bilmb3IodHlwZW9mIHUucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKHUucG9zdFJ1bj1bdS5wb3N0UnVuXSk7dS5wb3N0UnVuLmxlbmd0aDspSXQodS5wb3N0UnVuLnNoaWZ0KCkpO2VyKERyKX1mdW5jdGlvbiBSdChlKXtDci51bnNoaWZ0KGUpfWZ1bmN0aW9uIE10KGUpe0FyLnVuc2hpZnQoZSl9ZnVuY3Rpb24gSXQoZSl7RHIudW5zaGlmdChlKX12YXIgbGU9MCxFZT1udWxsO2Z1bmN0aW9uIHZpKGUpe3JldHVybiBlfWZ1bmN0aW9uIFFlKGUpe3ZhciByO2xlKyssKHI9dS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8ci5jYWxsKHUsbGUpfWZ1bmN0aW9uIE1lKGUpe3ZhciB0O2lmKGxlLS0sKHQ9dS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8dC5jYWxsKHUsbGUpLGxlPT0wJiZFZSl7dmFyIHI9RWU7RWU9bnVsbCxyKCl9fWZ1bmN0aW9uIEooZSl7dmFyIHQ7KHQ9dS5vbkFib3J0KT09bnVsbHx8dC5jYWxsKHUsZSksZT0iQWJvcnRlZCgiK2UrIikiLG5lKGUpLHNlPSEwLHdlPTEsZSs9Ii4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iO3ZhciByPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoZSk7dGhyb3cgVyhyKSxyfXZhciBPdD0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIsU3I9ZT0+ZS5zdGFydHNXaXRoKE90KTtmdW5jdGlvbiBWdCgpe2lmKHUubG9jYXRlRmlsZSl7dmFyIGU9IndlYi1kZW11eGVyLndhc20iO3JldHVybiBTcihlKT9lOlN0KGUpfXJldHVybiBuZXcgVVJMKCJ3ZWItZGVtdXhlci53YXNtIixzZWxmLmxvY2F0aW9uLmhyZWYpLmhyZWZ9dmFyIEllO2Z1bmN0aW9uICRyKGUpe2lmKGU9PUllJiZnZSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZ2UpO2lmKEplKXJldHVybiBKZShlKTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24gTHQoZSl7cmV0dXJuIWdlJiZvZSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKHI9PntpZighci5vayl0aHJvd2BmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICcke2V9J2A7cmV0dXJuIHIuYXJyYXlCdWZmZXIoKX0pLmNhdGNoKCgpPT4kcihlKSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+JHIoZSkpfWZ1bmN0aW9uIFRyKGUscix0KXtyZXR1cm4gTHQoZSkudGhlbihuPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShuLHIpKS50aGVuKHQsbj0+e25lKGBmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAke259YCksSihuKX0pfWZ1bmN0aW9uIFV0KGUscix0LG4pe3JldHVybiFlJiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PSJmdW5jdGlvbiImJiFTcihyKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGE9Pnt2YXIgbz1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhhLHQpO3JldHVybiBvLnRoZW4obixmdW5jdGlvbihzKXtyZXR1cm4gbmUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3N9YCksbmUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksVHIocix0LG4pfSl9KTpUcihyLHQsbil9ZnVuY3Rpb24geHQoKXtyZXR1cm57YTpRYX19ZnVuY3Rpb24ganQoKXt2YXIgZT14dCgpO2Z1bmN0aW9uIHIobixhKXtyZXR1cm4gdz1uLmV4cG9ydHMsdz1iLmluc3RydW1lbnRXYXNtRXhwb3J0cyh3KSxGZT13LmZhLFByKCksdy5pYSxNdCh3LmdhKSxNZSgpLHd9UWUoKTtmdW5jdGlvbiB0KG4pe3Iobi5pbnN0YW5jZSl9aWYodS5pbnN0YW50aWF0ZVdhc20pdHJ5e3JldHVybiB1Lmluc3RhbnRpYXRlV2FzbShlLHIpfWNhdGNoKG4pe25lKGBNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAke259YCksVyhuKX1yZXR1cm4gSWV8fChJZT1WdCgpKSxVdChnZSxJZSxlLHQpLmNhdGNoKFcpLHt9fXZhciBnLFM7ZnVuY3Rpb24gRnIoZSl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9YFByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoJHtlfSlgLHRoaXMuc3RhdHVzPWV9dmFyIGVyPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKSh1KX0senQ9dS5ub0V4aXRSdW50aW1lfHwhMCxScj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxjZT0oZSxyLHQpPT57Zm9yKHZhciBuPXIrdCxhPXI7ZVthXSYmIShhPj1uKTspKythO2lmKGEtcj4xNiYmZS5idWZmZXImJlJyKXJldHVybiBSci5kZWNvZGUoZS5zdWJhcnJheShyLGEpKTtmb3IodmFyIG89IiI7cjxhOyl7dmFyIHM9ZVtyKytdO2lmKCEocyYxMjgpKXtvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2NvbnRpbnVlfXZhciBsPWVbcisrXSY2MztpZigocyYyMjQpPT0xOTIpe28rPVN0cmluZy5mcm9tQ2hhckNvZGUoKHMmMzEpPDw2fGwpO2NvbnRpbnVlfXZhciBmPWVbcisrXSY2MztpZigocyYyNDApPT0yMjQ/cz0ocyYxNSk8PDEyfGw8PDZ8ZjpzPShzJjcpPDwxOHxsPDwxMnxmPDw2fGVbcisrXSY2MyxzPDY1NTM2KW8rPVN0cmluZy5mcm9tQ2hhckNvZGUocyk7ZWxzZXt2YXIgZD1zLTY1NTM2O28rPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8ZD4+MTAsNTYzMjB8ZCYxMDIzKX19cmV0dXJuIG99LHVlPShlLHIpPT5lP2NlKE4sZSxyKToiIixOdD0oZSxyLHQsbik9PntKKGBBc3NlcnRpb24gZmFpbGVkOiAke3VlKGUpfSwgYXQ6IGArW3I/dWUocik6InVua25vd24gZmlsZW5hbWUiLHQsbj91ZShuKToidW5rbm93biBmdW5jdGlvbiJdKX07Y2xhc3MgV3R7Y29uc3RydWN0b3Iocil7dGhpcy5leGNQdHI9cix0aGlzLnB0cj1yLTI0fXNldF90eXBlKHIpe0NbdGhpcy5wdHIrND4+Ml09cn1nZXRfdHlwZSgpe3JldHVybiBDW3RoaXMucHRyKzQ+PjJdfXNldF9kZXN0cnVjdG9yKHIpe0NbdGhpcy5wdHIrOD4+Ml09cn1nZXRfZGVzdHJ1Y3Rvcigpe3JldHVybiBDW3RoaXMucHRyKzg+PjJdfXNldF9jYXVnaHQocil7cj1yPzE6MCxMW3RoaXMucHRyKzEyXT1yfWdldF9jYXVnaHQoKXtyZXR1cm4gTFt0aGlzLnB0cisxMl0hPTB9c2V0X3JldGhyb3duKHIpe3I9cj8xOjAsTFt0aGlzLnB0cisxM109cn1nZXRfcmV0aHJvd24oKXtyZXR1cm4gTFt0aGlzLnB0cisxM10hPTB9aW5pdChyLHQpe3RoaXMuc2V0X2FkanVzdGVkX3B0cigwKSx0aGlzLnNldF90eXBlKHIpLHRoaXMuc2V0X2Rlc3RydWN0b3IodCl9c2V0X2FkanVzdGVkX3B0cihyKXtDW3RoaXMucHRyKzE2Pj4yXT1yfWdldF9hZGp1c3RlZF9wdHIoKXtyZXR1cm4gQ1t0aGlzLnB0cisxNj4+Ml19Z2V0X2V4Y2VwdGlvbl9wdHIoKXt2YXIgcj1mdCh0aGlzLmdldF90eXBlKCkpO2lmKHIpcmV0dXJuIENbdGhpcy5leGNQdHI+PjJdO3ZhciB0PXRoaXMuZ2V0X2FkanVzdGVkX3B0cigpO3JldHVybiB0IT09MD90OnRoaXMuZXhjUHRyfX12YXIgTXI9MCxIdD0oZSxyLHQpPT57dmFyIG49bmV3IFd0KGUpO3Rocm93IG4uaW5pdChyLHQpLE1yPWUsTXJ9LFI9e2lzQWJzOmU9PmUuY2hhckF0KDApPT09Ii8iLHNwbGl0UGF0aDplPT57dmFyIHI9L14oXC8/fCkoW1xzXFNdKj8pKCg/OlwuezEsMn18W15cL10rP3wpKFwuW14uXC9dKnwpKSg/OltcL10qKSQvO3JldHVybiByLmV4ZWMoZSkuc2xpY2UoMSl9LG5vcm1hbGl6ZUFycmF5OihlLHIpPT57Zm9yKHZhciB0PTAsbj1lLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgYT1lW25dO2E9PT0iLiI/ZS5zcGxpY2UobiwxKTphPT09Ii4uIj8oZS5zcGxpY2UobiwxKSx0KyspOnQmJihlLnNwbGljZShuLDEpLHQtLSl9aWYocilmb3IoO3Q7dC0tKWUudW5zaGlmdCgiLi4iKTtyZXR1cm4gZX0sbm9ybWFsaXplOmU9Pnt2YXIgcj1SLmlzQWJzKGUpLHQ9ZS5zdWJzdHIoLTEpPT09Ii8iO3JldHVybiBlPVIubm9ybWFsaXplQXJyYXkoZS5zcGxpdCgiLyIpLmZpbHRlcihuPT4hIW4pLCFyKS5qb2luKCIvIiksIWUmJiFyJiYoZT0iLiIpLGUmJnQmJihlKz0iLyIpLChyPyIvIjoiIikrZX0sZGlybmFtZTplPT57dmFyIHI9Ui5zcGxpdFBhdGgoZSksdD1yWzBdLG49clsxXTtyZXR1cm4hdCYmIW4/Ii4iOihuJiYobj1uLnN1YnN0cigwLG4ubGVuZ3RoLTEpKSx0K24pfSxiYXNlbmFtZTplPT57aWYoZT09PSIvIilyZXR1cm4iLyI7ZT1SLm5vcm1hbGl6ZShlKSxlPWUucmVwbGFjZSgvXC8kLywiIik7dmFyIHI9ZS5sYXN0SW5kZXhPZigiLyIpO3JldHVybiByPT09LTE/ZTplLnN1YnN0cihyKzEpfSxqb2luOiguLi5lKT0+Ui5ub3JtYWxpemUoZS5qb2luKCIvIikpLGpvaW4yOihlLHIpPT5SLm5vcm1hbGl6ZShlKyIvIityKX0sQnQ9KCk9PntpZih0eXBlb2YgY3J5cHRvPT0ib2JqZWN0IiYmdHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiIpcmV0dXJuIGU9PmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoZSk7SigiaW5pdFJhbmRvbURldmljZSIpfSxJcj1lPT4oSXI9QnQoKSkoZSksWj17cmVzb2x2ZTooLi4uZSk9Pntmb3IodmFyIHI9IiIsdD0hMSxuPWUubGVuZ3RoLTE7bj49LTEmJiF0O24tLSl7dmFyIGE9bj49MD9lW25dOmkuY3dkKCk7aWYodHlwZW9mIGEhPSJzdHJpbmciKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzIik7aWYoIWEpcmV0dXJuIiI7cj1hKyIvIityLHQ9Ui5pc0FicyhhKX1yZXR1cm4gcj1SLm5vcm1hbGl6ZUFycmF5KHIuc3BsaXQoIi8iKS5maWx0ZXIobz0+ISFvKSwhdCkuam9pbigiLyIpLCh0PyIvIjoiIikrcnx8Ii4ifSxyZWxhdGl2ZTooZSxyKT0+e2U9Wi5yZXNvbHZlKGUpLnN1YnN0cigxKSxyPVoucmVzb2x2ZShyKS5zdWJzdHIoMSk7ZnVuY3Rpb24gdChkKXtmb3IodmFyIGM9MDtjPGQubGVuZ3RoJiZkW2NdPT09IiI7YysrKTtmb3IodmFyIGg9ZC5sZW5ndGgtMTtoPj0wJiZkW2hdPT09IiI7aC0tKTtyZXR1cm4gYz5oP1tdOmQuc2xpY2UoYyxoLWMrMSl9Zm9yKHZhciBuPXQoZS5zcGxpdCgiLyIpKSxhPXQoci5zcGxpdCgiLyIpKSxvPU1hdGgubWluKG4ubGVuZ3RoLGEubGVuZ3RoKSxzPW8sbD0wO2w8bztsKyspaWYobltsXSE9PWFbbF0pe3M9bDticmVha31mb3IodmFyIGY9W10sbD1zO2w8bi5sZW5ndGg7bCsrKWYucHVzaCgiLi4iKTtyZXR1cm4gZj1mLmNvbmNhdChhLnNsaWNlKHMpKSxmLmpvaW4oIi8iKX19LHJyPVtdLHRyPWU9Pntmb3IodmFyIHI9MCx0PTA7dDxlLmxlbmd0aDsrK3Qpe3ZhciBuPWUuY2hhckNvZGVBdCh0KTtuPD0xMjc/cisrOm48PTIwNDc/cis9MjpuPj01NTI5NiYmbjw9NTczNDM/KHIrPTQsKyt0KTpyKz0zfXJldHVybiByfSxucj0oZSxyLHQsbik9PntpZighKG4+MCkpcmV0dXJuIDA7Zm9yKHZhciBhPXQsbz10K24tMSxzPTA7czxlLmxlbmd0aDsrK3Mpe3ZhciBsPWUuY2hhckNvZGVBdChzKTtpZihsPj01NTI5NiYmbDw9NTczNDMpe3ZhciBmPWUuY2hhckNvZGVBdCgrK3MpO2w9NjU1MzYrKChsJjEwMjMpPDwxMCl8ZiYxMDIzfWlmKGw8PTEyNyl7aWYodD49bylicmVhaztyW3QrK109bH1lbHNlIGlmKGw8PTIwNDcpe2lmKHQrMT49bylicmVhaztyW3QrK109MTkyfGw+PjYsclt0KytdPTEyOHxsJjYzfWVsc2UgaWYobDw9NjU1MzUpe2lmKHQrMj49bylicmVhaztyW3QrK109MjI0fGw+PjEyLHJbdCsrXT0xMjh8bD4+NiY2MyxyW3QrK109MTI4fGwmNjN9ZWxzZXtpZih0KzM+PW8pYnJlYWs7clt0KytdPTI0MHxsPj4xOCxyW3QrK109MTI4fGw+PjEyJjYzLHJbdCsrXT0xMjh8bD4+NiY2MyxyW3QrK109MTI4fGwmNjN9fXJldHVybiByW3RdPTAsdC1hfTtmdW5jdGlvbiBPZShlLHIsdCl7dmFyIG49dHIoZSkrMSxhPW5ldyBBcnJheShuKSxvPW5yKGUsYSwwLGEubGVuZ3RoKTtyZXR1cm4gciYmKGEubGVuZ3RoPW8pLGF9dmFyIFl0PSgpPT57aWYoIXJyLmxlbmd0aCl7dmFyIGU9bnVsbDtpZighZSlyZXR1cm4gbnVsbDtycj1PZShlLCEwKX1yZXR1cm4gcnIuc2hpZnQoKX0sZmU9e3R0eXM6W10saW5pdCgpe30sc2h1dGRvd24oKXt9LHJlZ2lzdGVyKGUscil7ZmUudHR5c1tlXT17aW5wdXQ6W10sb3V0cHV0OltdLG9wczpyfSxpLnJlZ2lzdGVyRGV2aWNlKGUsZmUuc3RyZWFtX29wcyl9LHN0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHI9ZmUudHR5c1tlLm5vZGUucmRldl07aWYoIXIpdGhyb3cgbmV3IGkuRXJybm9FcnJvcig0Myk7ZS50dHk9cixlLnNlZWthYmxlPSExfSxjbG9zZShlKXtlLnR0eS5vcHMuZnN5bmMoZS50dHkpfSxmc3luYyhlKXtlLnR0eS5vcHMuZnN5bmMoZS50dHkpfSxyZWFkKGUscix0LG4sYSl7aWYoIWUudHR5fHwhZS50dHkub3BzLmdldF9jaGFyKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNjApO2Zvcih2YXIgbz0wLHM9MDtzPG47cysrKXt2YXIgbDt0cnl7bD1lLnR0eS5vcHMuZ2V0X2NoYXIoZS50dHkpfWNhdGNoe3Rocm93IG5ldyBpLkVycm5vRXJyb3IoMjkpfWlmKGw9PT12b2lkIDAmJm89PT0wKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNik7aWYobD09bnVsbClicmVhaztvKyssclt0K3NdPWx9cmV0dXJuIG8mJihlLm5vZGUudGltZXN0YW1wPURhdGUubm93KCkpLG99LHdyaXRlKGUscix0LG4sYSl7aWYoIWUudHR5fHwhZS50dHkub3BzLnB1dF9jaGFyKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNjApO3RyeXtmb3IodmFyIG89MDtvPG47bysrKWUudHR5Lm9wcy5wdXRfY2hhcihlLnR0eSxyW3Qrb10pfWNhdGNoe3Rocm93IG5ldyBpLkVycm5vRXJyb3IoMjkpfXJldHVybiBuJiYoZS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxvfX0sZGVmYXVsdF90dHlfb3BzOntnZXRfY2hhcihlKXtyZXR1cm4gWXQoKX0scHV0X2NoYXIoZSxyKXtyPT09bnVsbHx8cj09PTEwPyhaZShjZShlLm91dHB1dCwwKSksZS5vdXRwdXQ9W10pOnIhPTAmJmUub3V0cHV0LnB1c2gocil9LGZzeW5jKGUpe2Uub3V0cHV0JiZlLm91dHB1dC5sZW5ndGg+MCYmKFplKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSl9LGlvY3RsX3RjZ2V0cyhlKXtyZXR1cm57Y19pZmxhZzoyNTg1NixjX29mbGFnOjUsY19jZmxhZzoxOTEsY19sZmxhZzozNTM4NyxjX2NjOlszLDI4LDEyNywyMSw0LDAsMSwwLDE3LDE5LDI2LDAsMTgsMTUsMjMsMjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF19fSxpb2N0bF90Y3NldHMoZSxyLHQpe3JldHVybiAwfSxpb2N0bF90aW9jZ3dpbnN6KGUpe3JldHVyblsyNCw4MF19fSxkZWZhdWx0X3R0eTFfb3BzOntwdXRfY2hhcihlLHIpe3I9PT1udWxsfHxyPT09MTA/KG5lKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSk6ciE9MCYmZS5vdXRwdXQucHVzaChyKX0sZnN5bmMoZSl7ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aD4wJiYobmUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKX19fSxPcj1lPT57SigpfSxQPXtvcHNfdGFibGU6bnVsbCxtb3VudChlKXtyZXR1cm4gUC5jcmVhdGVOb2RlKG51bGwsIi8iLDE2ODk1LDApfSxjcmVhdGVOb2RlKGUscix0LG4pe2lmKGkuaXNCbGtkZXYodCl8fGkuaXNGSUZPKHQpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNjMpO1Aub3BzX3RhYmxlfHwoUC5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpQLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpQLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOlAubm9kZV9vcHMubG9va3VwLG1rbm9kOlAubm9kZV9vcHMubWtub2QscmVuYW1lOlAubm9kZV9vcHMucmVuYW1lLHVubGluazpQLm5vZGVfb3BzLnVubGluayxybWRpcjpQLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6UC5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6UC5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpQLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpQLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpQLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOlAuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpQLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpQLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6UC5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6UC5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6UC5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpQLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpQLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6UC5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6UC5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6UC5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06aS5jaHJkZXZfc3RyZWFtX29wc319KTt2YXIgYT1pLmNyZWF0ZU5vZGUoZSxyLHQsbik7cmV0dXJuIGkuaXNEaXIoYS5tb2RlKT8oYS5ub2RlX29wcz1QLm9wc190YWJsZS5kaXIubm9kZSxhLnN0cmVhbV9vcHM9UC5vcHNfdGFibGUuZGlyLnN0cmVhbSxhLmNvbnRlbnRzPXt9KTppLmlzRmlsZShhLm1vZGUpPyhhLm5vZGVfb3BzPVAub3BzX3RhYmxlLmZpbGUubm9kZSxhLnN0cmVhbV9vcHM9UC5vcHNfdGFibGUuZmlsZS5zdHJlYW0sYS51c2VkQnl0ZXM9MCxhLmNvbnRlbnRzPW51bGwpOmkuaXNMaW5rKGEubW9kZSk/KGEubm9kZV9vcHM9UC5vcHNfdGFibGUubGluay5ub2RlLGEuc3RyZWFtX29wcz1QLm9wc190YWJsZS5saW5rLnN0cmVhbSk6aS5pc0NocmRldihhLm1vZGUpJiYoYS5ub2RlX29wcz1QLm9wc190YWJsZS5jaHJkZXYubm9kZSxhLnN0cmVhbV9vcHM9UC5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSksYS50aW1lc3RhbXA9RGF0ZS5ub3coKSxlJiYoZS5jb250ZW50c1tyXT1hLGUudGltZXN0YW1wPWEudGltZXN0YW1wKSxhfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShlKXtyZXR1cm4gZS5jb250ZW50cz9lLmNvbnRlbnRzLnN1YmFycmF5P2UuY29udGVudHMuc3ViYXJyYXkoMCxlLnVzZWRCeXRlcyk6bmV3IFVpbnQ4QXJyYXkoZS5jb250ZW50cyk6bmV3IFVpbnQ4QXJyYXkoMCl9LGV4cGFuZEZpbGVTdG9yYWdlKGUscil7dmFyIHQ9ZS5jb250ZW50cz9lLmNvbnRlbnRzLmxlbmd0aDowO2lmKCEodD49cikpe3ZhciBuPTEwMjQqMTAyNDtyPU1hdGgubWF4KHIsdCoodDxuPzI6MS4xMjUpPj4+MCksdCE9MCYmKHI9TWF0aC5tYXgociwyNTYpKTt2YXIgYT1lLmNvbnRlbnRzO2UuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkociksZS51c2VkQnl0ZXM+MCYmZS5jb250ZW50cy5zZXQoYS5zdWJhcnJheSgwLGUudXNlZEJ5dGVzKSwwKX19LHJlc2l6ZUZpbGVTdG9yYWdlKGUscil7aWYoZS51c2VkQnl0ZXMhPXIpaWYocj09MCllLmNvbnRlbnRzPW51bGwsZS51c2VkQnl0ZXM9MDtlbHNle3ZhciB0PWUuY29udGVudHM7ZS5jb250ZW50cz1uZXcgVWludDhBcnJheShyKSx0JiZlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsTWF0aC5taW4ocixlLnVzZWRCeXRlcykpKSxlLnVzZWRCeXRlcz1yfX0sbm9kZV9vcHM6e2dldGF0dHIoZSl7dmFyIHI9e307cmV0dXJuIHIuZGV2PWkuaXNDaHJkZXYoZS5tb2RlKT9lLmlkOjEsci5pbm89ZS5pZCxyLm1vZGU9ZS5tb2RlLHIubmxpbms9MSxyLnVpZD0wLHIuZ2lkPTAsci5yZGV2PWUucmRldixpLmlzRGlyKGUubW9kZSk/ci5zaXplPTQwOTY6aS5pc0ZpbGUoZS5tb2RlKT9yLnNpemU9ZS51c2VkQnl0ZXM6aS5pc0xpbmsoZS5tb2RlKT9yLnNpemU9ZS5saW5rLmxlbmd0aDpyLnNpemU9MCxyLmF0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLm10aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmN0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmJsa3NpemU9NDA5NixyLmJsb2Nrcz1NYXRoLmNlaWwoci5zaXplL3IuYmxrc2l6ZSkscn0sc2V0YXR0cihlLHIpe3IubW9kZSE9PXZvaWQgMCYmKGUubW9kZT1yLm1vZGUpLHIudGltZXN0YW1wIT09dm9pZCAwJiYoZS50aW1lc3RhbXA9ci50aW1lc3RhbXApLHIuc2l6ZSE9PXZvaWQgMCYmUC5yZXNpemVGaWxlU3RvcmFnZShlLHIuc2l6ZSl9LGxvb2t1cChlLHIpe3Rocm93IGkuZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kKGUscix0LG4pe3JldHVybiBQLmNyZWF0ZU5vZGUoZSxyLHQsbil9LHJlbmFtZShlLHIsdCl7aWYoaS5pc0RpcihlLm1vZGUpKXt2YXIgbjt0cnl7bj1pLmxvb2t1cE5vZGUocix0KX1jYXRjaHt9aWYobilmb3IodmFyIGEgaW4gbi5jb250ZW50cyl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDU1KX1kZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSxlLnBhcmVudC50aW1lc3RhbXA9RGF0ZS5ub3coKSxlLm5hbWU9dCxyLmNvbnRlbnRzW3RdPWUsci50aW1lc3RhbXA9ZS5wYXJlbnQudGltZXN0YW1wLGUucGFyZW50PXJ9LHVubGluayhlLHIpe2RlbGV0ZSBlLmNvbnRlbnRzW3JdLGUudGltZXN0YW1wPURhdGUubm93KCl9LHJtZGlyKGUscil7dmFyIHQ9aS5sb29rdXBOb2RlKGUscik7Zm9yKHZhciBuIGluIHQuY29udGVudHMpdGhyb3cgbmV3IGkuRXJybm9FcnJvcig1NSk7ZGVsZXRlIGUuY29udGVudHNbcl0sZS50aW1lc3RhbXA9RGF0ZS5ub3coKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3ZhciBuPVAuY3JlYXRlTm9kZShlLHIsNDE0NzEsMCk7cmV0dXJuIG4ubGluaz10LG59LHJlYWRsaW5rKGUpe2lmKCFpLmlzTGluayhlLm1vZGUpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoMjgpO3JldHVybiBlLmxpbmt9fSxzdHJlYW1fb3BzOntyZWFkKGUscix0LG4sYSl7dmFyIG89ZS5ub2RlLmNvbnRlbnRzO2lmKGE+PWUubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHM9TWF0aC5taW4oZS5ub2RlLnVzZWRCeXRlcy1hLG4pO2lmKHM+OCYmby5zdWJhcnJheSlyLnNldChvLnN1YmFycmF5KGEsYStzKSx0KTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspclt0K2xdPW9bYStsXTtyZXR1cm4gc30sd3JpdGUoZSxyLHQsbixhLG8pe2lmKHIuYnVmZmVyPT09TC5idWZmZXImJihvPSExKSwhbilyZXR1cm4gMDt2YXIgcz1lLm5vZGU7aWYocy50aW1lc3RhbXA9RGF0ZS5ub3coKSxyLnN1YmFycmF5JiYoIXMuY29udGVudHN8fHMuY29udGVudHMuc3ViYXJyYXkpKXtpZihvKXJldHVybiBzLmNvbnRlbnRzPXIuc3ViYXJyYXkodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihzLnVzZWRCeXRlcz09PTAmJmE9PT0wKXJldHVybiBzLmNvbnRlbnRzPXIuc2xpY2UodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihhK248PXMudXNlZEJ5dGVzKXJldHVybiBzLmNvbnRlbnRzLnNldChyLnN1YmFycmF5KHQsdCtuKSxhKSxufWlmKFAuZXhwYW5kRmlsZVN0b3JhZ2UocyxhK24pLHMuY29udGVudHMuc3ViYXJyYXkmJnIuc3ViYXJyYXkpcy5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LHQrbiksYSk7ZWxzZSBmb3IodmFyIGw9MDtsPG47bCsrKXMuY29udGVudHNbYStsXT1yW3QrbF07cmV0dXJuIHMudXNlZEJ5dGVzPU1hdGgubWF4KHMudXNlZEJ5dGVzLGErbiksbn0sbGxzZWVrKGUscix0KXt2YXIgbj1yO2lmKHQ9PT0xP24rPWUucG9zaXRpb246dD09PTImJmkuaXNGaWxlKGUubm9kZS5tb2RlKSYmKG4rPWUubm9kZS51c2VkQnl0ZXMpLG48MCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn0sYWxsb2NhdGUoZSxyLHQpe1AuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLHIrdCksZS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChlLm5vZGUudXNlZEJ5dGVzLHIrdCl9LG1tYXAoZSxyLHQsbixhKXtpZighaS5pc0ZpbGUoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNDMpO3ZhciBvLHMsbD1lLm5vZGUuY29udGVudHM7aWYoIShhJjIpJiZsLmJ1ZmZlcj09PUwuYnVmZmVyKXM9ITEsbz1sLmJ5dGVPZmZzZXQ7ZWxzZXtpZigodD4wfHx0K3I8bC5sZW5ndGgpJiYobC5zdWJhcnJheT9sPWwuc3ViYXJyYXkodCx0K3IpOmw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobCx0LHQrcikpLHM9ITAsbz1PcigpLCFvKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNDgpO0wuc2V0KGwsbyl9cmV0dXJue3B0cjpvLGFsbG9jYXRlZDpzfX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gUC5zdHJlYW1fb3BzLndyaXRlKGUsciwwLG4sdCwhMSksMH19fSxHdD0oZSxyLHQsbik9Pnt2YXIgYT1gYWwgJHtlfWA7d3IoZSxvPT57cihuZXcgVWludDhBcnJheShvKSksYSYmTWUoKX0sbz0+e2lmKHQpdCgpO2Vsc2UgdGhyb3dgTG9hZGluZyBkYXRhIGZpbGUgIiR7ZX0iIGZhaWxlZC5gfSksYSYmUWUoKX0scXQ9KGUscix0LG4sYSxvKT0+e2kuY3JlYXRlRGF0YUZpbGUoZSxyLHQsbixhLG8pfSxYdD11LnByZWxvYWRQbHVnaW5zfHxbXSxLdD0oZSxyLHQsbik9Pnt0eXBlb2YgQnJvd3NlcjwidSImJkJyb3dzZXIuaW5pdCgpO3ZhciBhPSExO3JldHVybiBYdC5mb3JFYWNoKG89PnthfHxvLmNhbkhhbmRsZShyKSYmKG8uaGFuZGxlKGUscix0LG4pLGE9ITApfSksYX0sSnQ9KGUscix0LG4sYSxvLHMsbCxmLGQpPT57dmFyIGM9cj9aLnJlc29sdmUoUi5qb2luMihlLHIpKTplO2Z1bmN0aW9uIGgobSl7ZnVuY3Rpb24gcChFKXtkPT1udWxsfHxkKCksbHx8cXQoZSxyLEUsbixhLGYpLG89PW51bGx8fG8oKSxNZSgpfUt0KG0sYyxwLCgpPT57cz09bnVsbHx8cygpLE1lKCl9KXx8cChtKX1RZSgpLHR5cGVvZiB0PT0ic3RyaW5nIj9HdCh0LGgscyk6aCh0KX0sWnQ9ZT0+e3ZhciByPXtyOjAsInIrIjoyLHc6NTc3LCJ3KyI6NTc4LGE6MTA4OSwiYSsiOjEwOTB9LHQ9cltlXTtpZih0eXBlb2YgdD4idSIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke2V9YCk7cmV0dXJuIHR9LGFyPShlLHIpPT57dmFyIHQ9MDtyZXR1cm4gZSYmKHR8PTM2NSksciYmKHR8PTE0NiksdH0seD17RElSX01PREU6MTY4OTUsRklMRV9NT0RFOjMzMjc5LHJlYWRlcjpudWxsLG1vdW50KGUpe0VyKG9lKSx4LnJlYWRlcnx8KHgucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYyk7dmFyIHI9eC5jcmVhdGVOb2RlKG51bGwsIi8iLHguRElSX01PREUsMCksdD17fTtmdW5jdGlvbiBuKG8pe2Zvcih2YXIgcz1vLnNwbGl0KCIvIiksbD1yLGY9MDtmPHMubGVuZ3RoLTE7ZisrKXt2YXIgZD1zLnNsaWNlKDAsZisxKS5qb2luKCIvIik7dFtkXXx8KHRbZF09eC5jcmVhdGVOb2RlKGwsc1tmXSx4LkRJUl9NT0RFLDApKSxsPXRbZF19cmV0dXJuIGx9ZnVuY3Rpb24gYShvKXt2YXIgcz1vLnNwbGl0KCIvIik7cmV0dXJuIHNbcy5sZW5ndGgtMV19cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5vcHRzLmZpbGVzfHxbXSxmdW5jdGlvbihvKXt4LmNyZWF0ZU5vZGUobihvLm5hbWUpLGEoby5uYW1lKSx4LkZJTEVfTU9ERSwwLG8sby5sYXN0TW9kaWZpZWREYXRlKX0pLChlLm9wdHMuYmxvYnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe3guY3JlYXRlTm9kZShuKG8ubmFtZSksYShvLm5hbWUpLHguRklMRV9NT0RFLDAsby5kYXRhKX0pLChlLm9wdHMucGFja2FnZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe28ubWV0YWRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgbD1zLmZpbGVuYW1lLnN1YnN0cigxKTt4LmNyZWF0ZU5vZGUobihsKSxhKGwpLHguRklMRV9NT0RFLDAsby5ibG9iLnNsaWNlKHMuc3RhcnQscy5lbmQpKX0pfSkscn0sY3JlYXRlTm9kZShlLHIsdCxuLGEsbyl7dmFyIHM9aS5jcmVhdGVOb2RlKGUscix0KTtyZXR1cm4gcy5tb2RlPXQscy5ub2RlX29wcz14Lm5vZGVfb3BzLHMuc3RyZWFtX29wcz14LnN0cmVhbV9vcHMscy50aW1lc3RhbXA9KG98fG5ldyBEYXRlKS5nZXRUaW1lKCksRXIoeC5GSUxFX01PREUhPT14LkRJUl9NT0RFKSx0PT09eC5GSUxFX01PREU/KHMuc2l6ZT1hLnNpemUscy5jb250ZW50cz1hKToocy5zaXplPTQwOTYscy5jb250ZW50cz17fSksZSYmKGUuY29udGVudHNbcl09cyksc30sbm9kZV9vcHM6e2dldGF0dHIoZSl7cmV0dXJue2RldjoxLGlubzplLmlkLG1vZGU6ZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjowLHNpemU6ZS5zaXplLGF0aW1lOm5ldyBEYXRlKGUudGltZXN0YW1wKSxtdGltZTpuZXcgRGF0ZShlLnRpbWVzdGFtcCksY3RpbWU6bmV3IERhdGUoZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKGUuc2l6ZS80MDk2KX19LHNldGF0dHIoZSxyKXtyLm1vZGUhPT12b2lkIDAmJihlLm1vZGU9ci5tb2RlKSxyLnRpbWVzdGFtcCE9PXZvaWQgMCYmKGUudGltZXN0YW1wPXIudGltZXN0YW1wKX0sbG9va3VwKGUscil7dGhyb3cgbmV3IGkuRXJybm9FcnJvcig0NCl9LG1rbm9kKGUscix0LG4pe3Rocm93IG5ldyBpLkVycm5vRXJyb3IoNjMpfSxyZW5hbWUoZSxyLHQpe3Rocm93IG5ldyBpLkVycm5vRXJyb3IoNjMpfSx1bmxpbmsoZSxyKXt0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYzKX0scm1kaXIoZSxyKXt0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYzKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3Rocm93IG5ldyBpLkVycm5vRXJyb3IoNjMpfX0sc3RyZWFtX29wczp7cmVhZChlLHIsdCxuLGEpe2lmKGE+PWUubm9kZS5zaXplKXJldHVybiAwO3ZhciBvPWUubm9kZS5jb250ZW50cy5zbGljZShhLGErbikscz14LnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihvKTtyZXR1cm4gci5zZXQobmV3IFVpbnQ4QXJyYXkocyksdCksby5zaXplfSx3cml0ZShlLHIsdCxuLGEpe3Rocm93IG5ldyBpLkVycm5vRXJyb3IoMjkpfSxsbHNlZWsoZSxyLHQpe3ZhciBuPXI7aWYodD09PTE/bis9ZS5wb3NpdGlvbjp0PT09MiYmaS5pc0ZpbGUoZS5ub2RlLm1vZGUpJiYobis9ZS5ub2RlLnNpemUpLG48MCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn19fSxpPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6e30sc3RyZWFtczpbXSxuZXh0SW5vZGU6MSxuYW1lVGFibGU6bnVsbCxjdXJyZW50UGF0aDoiLyIsaW5pdGlhbGl6ZWQ6ITEsaWdub3JlUGVybWlzc2lvbnM6ITAsRXJybm9FcnJvcjpjbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9IkVycm5vRXJyb3IiLHRoaXMuZXJybm89ZX19LGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxzeW5jRlNSZXF1ZXN0czowLEZTU3RyZWFtOmNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFyZWQ9e319Z2V0IG9iamVjdCgpe3JldHVybiB0aGlzLm5vZGV9c2V0IG9iamVjdChlKXt0aGlzLm5vZGU9ZX1nZXQgaXNSZWFkKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfWdldCBpc1dyaXRlKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfWdldCBpc0FwcGVuZCgpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9Z2V0IGZsYWdzKCl7cmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzfXNldCBmbGFncyhlKXt0aGlzLnNoYXJlZC5mbGFncz1lfWdldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbn1zZXQgcG9zaXRpb24oZSl7dGhpcy5zaGFyZWQucG9zaXRpb249ZX19LEZTTm9kZTpjbGFzc3tjb25zdHJ1Y3RvcihlLHIsdCxuKXtlfHwoZT10aGlzKSx0aGlzLnBhcmVudD1lLHRoaXMubW91bnQ9ZS5tb3VudCx0aGlzLm1vdW50ZWQ9bnVsbCx0aGlzLmlkPWkubmV4dElub2RlKyssdGhpcy5uYW1lPXIsdGhpcy5tb2RlPXQsdGhpcy5ub2RlX29wcz17fSx0aGlzLnN0cmVhbV9vcHM9e30sdGhpcy5yZGV2PW4sdGhpcy5yZWFkTW9kZT0zNjUsdGhpcy53cml0ZU1vZGU9MTQ2fWdldCByZWFkKCl7cmV0dXJuKHRoaXMubW9kZSZ0aGlzLnJlYWRNb2RlKT09PXRoaXMucmVhZE1vZGV9c2V0IHJlYWQoZSl7ZT90aGlzLm1vZGV8PXRoaXMucmVhZE1vZGU6dGhpcy5tb2RlJj1+dGhpcy5yZWFkTW9kZX1nZXQgd3JpdGUoKXtyZXR1cm4odGhpcy5tb2RlJnRoaXMud3JpdGVNb2RlKT09PXRoaXMud3JpdGVNb2RlfXNldCB3cml0ZShlKXtlP3RoaXMubW9kZXw9dGhpcy53cml0ZU1vZGU6dGhpcy5tb2RlJj1+dGhpcy53cml0ZU1vZGV9Z2V0IGlzRm9sZGVyKCl7cmV0dXJuIGkuaXNEaXIodGhpcy5tb2RlKX1nZXQgaXNEZXZpY2UoKXtyZXR1cm4gaS5pc0NocmRldih0aGlzLm1vZGUpfX0sbG9va3VwUGF0aChlLHI9e30pe2lmKGU9Wi5yZXNvbHZlKGUpLCFlKXJldHVybntwYXRoOiIiLG5vZGU6bnVsbH07dmFyIHQ9e2ZvbGxvd19tb3VudDohMCxyZWN1cnNlX2NvdW50OjB9O2lmKHI9T2JqZWN0LmFzc2lnbih0LHIpLHIucmVjdXJzZV9jb3VudD44KXRocm93IG5ldyBpLkVycm5vRXJyb3IoMzIpO2Zvcih2YXIgbj1lLnNwbGl0KCIvIikuZmlsdGVyKGg9PiEhaCksYT1pLnJvb3Qsbz0iLyIscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbD1zPT09bi5sZW5ndGgtMTtpZihsJiZyLnBhcmVudClicmVhaztpZihhPWkubG9va3VwTm9kZShhLG5bc10pLG89Ui5qb2luMihvLG5bc10pLGkuaXNNb3VudHBvaW50KGEpJiYoIWx8fGwmJnIuZm9sbG93X21vdW50KSYmKGE9YS5tb3VudGVkLnJvb3QpLCFsfHxyLmZvbGxvdylmb3IodmFyIGY9MDtpLmlzTGluayhhLm1vZGUpOyl7dmFyIGQ9aS5yZWFkbGluayhvKTtvPVoucmVzb2x2ZShSLmRpcm5hbWUobyksZCk7dmFyIGM9aS5sb29rdXBQYXRoKG8se3JlY3Vyc2VfY291bnQ6ci5yZWN1cnNlX2NvdW50KzF9KTtpZihhPWMubm9kZSxmKys+NDApdGhyb3cgbmV3IGkuRXJybm9FcnJvcigzMil9fXJldHVybntwYXRoOm8sbm9kZTphfX0sZ2V0UGF0aChlKXtmb3IodmFyIHI7Oyl7aWYoaS5pc1Jvb3QoZSkpe3ZhciB0PWUubW91bnQubW91bnRwb2ludDtyZXR1cm4gcj90W3QubGVuZ3RoLTFdIT09Ii8iP2Ake3R9LyR7cn1gOnQrcjp0fXI9cj9gJHtlLm5hbWV9LyR7cn1gOmUubmFtZSxlPWUucGFyZW50fX0saGFzaE5hbWUoZSxyKXtmb3IodmFyIHQ9MCxuPTA7bjxyLmxlbmd0aDtuKyspdD0odDw8NSktdCtyLmNoYXJDb2RlQXQobil8MDtyZXR1cm4oZSt0Pj4+MCklaS5uYW1lVGFibGUubGVuZ3RofSxoYXNoQWRkTm9kZShlKXt2YXIgcj1pLmhhc2hOYW1lKGUucGFyZW50LmlkLGUubmFtZSk7ZS5uYW1lX25leHQ9aS5uYW1lVGFibGVbcl0saS5uYW1lVGFibGVbcl09ZX0saGFzaFJlbW92ZU5vZGUoZSl7dmFyIHI9aS5oYXNoTmFtZShlLnBhcmVudC5pZCxlLm5hbWUpO2lmKGkubmFtZVRhYmxlW3JdPT09ZSlpLm5hbWVUYWJsZVtyXT1lLm5hbWVfbmV4dDtlbHNlIGZvcih2YXIgdD1pLm5hbWVUYWJsZVtyXTt0Oyl7aWYodC5uYW1lX25leHQ9PT1lKXt0Lm5hbWVfbmV4dD1lLm5hbWVfbmV4dDticmVha310PXQubmFtZV9uZXh0fX0sbG9va3VwTm9kZShlLHIpe3ZhciB0PWkubWF5TG9va3VwKGUpO2lmKHQpdGhyb3cgbmV3IGkuRXJybm9FcnJvcih0KTtmb3IodmFyIG49aS5oYXNoTmFtZShlLmlkLHIpLGE9aS5uYW1lVGFibGVbbl07YTthPWEubmFtZV9uZXh0KXt2YXIgbz1hLm5hbWU7aWYoYS5wYXJlbnQuaWQ9PT1lLmlkJiZvPT09cilyZXR1cm4gYX1yZXR1cm4gaS5sb29rdXAoZSxyKX0sY3JlYXRlTm9kZShlLHIsdCxuKXt2YXIgYT1uZXcgaS5GU05vZGUoZSxyLHQsbik7cmV0dXJuIGkuaGFzaEFkZE5vZGUoYSksYX0sZGVzdHJveU5vZGUoZSl7aS5oYXNoUmVtb3ZlTm9kZShlKX0saXNSb290KGUpe3JldHVybiBlPT09ZS5wYXJlbnR9LGlzTW91bnRwb2ludChlKXtyZXR1cm4hIWUubW91bnRlZH0saXNGaWxlKGUpe3JldHVybihlJjYxNDQwKT09PTMyNzY4fSxpc0RpcihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0xNjM4NH0saXNMaW5rKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTYwfSxpc0NocmRldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT04MTkyfSxpc0Jsa2RldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0yNDU3Nn0saXNGSUZPKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTZ9LGlzU29ja2V0KGUpe3JldHVybihlJjQ5MTUyKT09PTQ5MTUyfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZyhlKXt2YXIgcj1bInIiLCJ3IiwicnciXVtlJjNdO3JldHVybiBlJjUxMiYmKHIrPSJ3Iikscn0sbm9kZVBlcm1pc3Npb25zKGUscil7cmV0dXJuIGkuaWdub3JlUGVybWlzc2lvbnM/MDpyLmluY2x1ZGVzKCJyIikmJiEoZS5tb2RlJjI5Mil8fHIuaW5jbHVkZXMoInciKSYmIShlLm1vZGUmMTQ2KXx8ci5pbmNsdWRlcygieCIpJiYhKGUubW9kZSY3Myk/MjowfSxtYXlMb29rdXAoZSl7aWYoIWkuaXNEaXIoZS5tb2RlKSlyZXR1cm4gNTQ7dmFyIHI9aS5ub2RlUGVybWlzc2lvbnMoZSwieCIpO3JldHVybiByfHwoZS5ub2RlX29wcy5sb29rdXA/MDoyKX0sbWF5Q3JlYXRlKGUscil7dHJ5e3ZhciB0PWkubG9va3VwTm9kZShlLHIpO3JldHVybiAyMH1jYXRjaHt9cmV0dXJuIGkubm9kZVBlcm1pc3Npb25zKGUsInd4Iil9LG1heURlbGV0ZShlLHIsdCl7dmFyIG47dHJ5e249aS5sb29rdXBOb2RlKGUscil9Y2F0Y2gobyl7cmV0dXJuIG8uZXJybm99dmFyIGE9aS5ub2RlUGVybWlzc2lvbnMoZSwid3giKTtpZihhKXJldHVybiBhO2lmKHQpe2lmKCFpLmlzRGlyKG4ubW9kZSkpcmV0dXJuIDU0O2lmKGkuaXNSb290KG4pfHxpLmdldFBhdGgobik9PT1pLmN3ZCgpKXJldHVybiAxMH1lbHNlIGlmKGkuaXNEaXIobi5tb2RlKSlyZXR1cm4gMzE7cmV0dXJuIDB9LG1heU9wZW4oZSxyKXtyZXR1cm4gZT9pLmlzTGluayhlLm1vZGUpPzMyOmkuaXNEaXIoZS5tb2RlKSYmKGkuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikhPT0iciJ8fHImNTEyKT8zMTppLm5vZGVQZXJtaXNzaW9ucyhlLGkuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikpOjQ0fSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQoKXtmb3IodmFyIGU9MDtlPD1pLk1BWF9PUEVOX0ZEUztlKyspaWYoIWkuc3RyZWFtc1tlXSlyZXR1cm4gZTt0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtQ2hlY2tlZChlKXt2YXIgcj1pLmdldFN0cmVhbShlKTtpZighcil0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDgpO3JldHVybiByfSxnZXRTdHJlYW06ZT0+aS5zdHJlYW1zW2VdLGNyZWF0ZVN0cmVhbShlLHI9LTEpe3JldHVybiBlPU9iamVjdC5hc3NpZ24obmV3IGkuRlNTdHJlYW0sZSkscj09LTEmJihyPWkubmV4dGZkKCkpLGUuZmQ9cixpLnN0cmVhbXNbcl09ZSxlfSxjbG9zZVN0cmVhbShlKXtpLnN0cmVhbXNbZV09bnVsbH0sZHVwU3RyZWFtKGUscj0tMSl7dmFyIG4sYTt2YXIgdD1pLmNyZWF0ZVN0cmVhbShlLHIpO3JldHVybihhPShuPXQuc3RyZWFtX29wcyk9PW51bGw/dm9pZCAwOm4uZHVwKT09bnVsbHx8YS5jYWxsKG4sdCksdH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHQsbjt2YXIgcj1pLmdldERldmljZShlLm5vZGUucmRldik7ZS5zdHJlYW1fb3BzPXIuc3RyZWFtX29wcywobj0odD1lLnN0cmVhbV9vcHMpLm9wZW4pPT1udWxsfHxuLmNhbGwodCxlKX0sbGxzZWVrKCl7dGhyb3cgbmV3IGkuRXJybm9FcnJvcig3MCl9fSxtYWpvcjplPT5lPj44LG1pbm9yOmU9PmUmMjU1LG1ha2VkZXY6KGUscik9PmU8PDh8cixyZWdpc3RlckRldmljZShlLHIpe2kuZGV2aWNlc1tlXT17c3RyZWFtX29wczpyfX0sZ2V0RGV2aWNlOmU9PmkuZGV2aWNlc1tlXSxnZXRNb3VudHMoZSl7Zm9yKHZhciByPVtdLHQ9W2VdO3QubGVuZ3RoOyl7dmFyIG49dC5wb3AoKTtyLnB1c2gobiksdC5wdXNoKC4uLm4ubW91bnRzKX1yZXR1cm4gcn0sc3luY2ZzKGUscil7dHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT0hMSksaS5zeW5jRlNSZXF1ZXN0cysrLGkuc3luY0ZTUmVxdWVzdHM+MSYmbmUoYHdhcm5pbmc6ICR7aS5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApO3ZhciB0PWkuZ2V0TW91bnRzKGkucm9vdC5tb3VudCksbj0wO2Z1bmN0aW9uIGEocyl7cmV0dXJuIGkuc3luY0ZTUmVxdWVzdHMtLSxyKHMpfWZ1bmN0aW9uIG8ocyl7aWYocylyZXR1cm4gby5lcnJvcmVkP3ZvaWQgMDooby5lcnJvcmVkPSEwLGEocykpOysrbj49dC5sZW5ndGgmJmEobnVsbCl9dC5mb3JFYWNoKHM9PntpZighcy50eXBlLnN5bmNmcylyZXR1cm4gbyhudWxsKTtzLnR5cGUuc3luY2ZzKHMsZSxvKX0pfSxtb3VudChlLHIsdCl7dmFyIG49dD09PSIvIixhPSF0LG87aWYobiYmaS5yb290KXRocm93IG5ldyBpLkVycm5vRXJyb3IoMTApO2lmKCFuJiYhYSl7dmFyIHM9aS5sb29rdXBQYXRoKHQse2ZvbGxvd19tb3VudDohMX0pO2lmKHQ9cy5wYXRoLG89cy5ub2RlLGkuaXNNb3VudHBvaW50KG8pKXRocm93IG5ldyBpLkVycm5vRXJyb3IoMTApO2lmKCFpLmlzRGlyKG8ubW9kZSkpdGhyb3cgbmV3IGkuRXJybm9FcnJvcig1NCl9dmFyIGw9e3R5cGU6ZSxvcHRzOnIsbW91bnRwb2ludDp0LG1vdW50czpbXX0sZj1lLm1vdW50KGwpO3JldHVybiBmLm1vdW50PWwsbC5yb290PWYsbj9pLnJvb3Q9ZjpvJiYoby5tb3VudGVkPWwsby5tb3VudCYmby5tb3VudC5tb3VudHMucHVzaChsKSksZn0sdW5tb3VudChlKXt2YXIgcj1pLmxvb2t1cFBhdGgoZSx7Zm9sbG93X21vdW50OiExfSk7aWYoIWkuaXNNb3VudHBvaW50KHIubm9kZSkpdGhyb3cgbmV3IGkuRXJybm9FcnJvcigyOCk7dmFyIHQ9ci5ub2RlLG49dC5tb3VudGVkLGE9aS5nZXRNb3VudHMobik7T2JqZWN0LmtleXMoaS5uYW1lVGFibGUpLmZvckVhY2gocz0+e2Zvcih2YXIgbD1pLm5hbWVUYWJsZVtzXTtsOyl7dmFyIGY9bC5uYW1lX25leHQ7YS5pbmNsdWRlcyhsLm1vdW50KSYmaS5kZXN0cm95Tm9kZShsKSxsPWZ9fSksdC5tb3VudGVkPW51bGw7dmFyIG89dC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTt0Lm1vdW50Lm1vdW50cy5zcGxpY2UobywxKX0sbG9va3VwKGUscil7cmV0dXJuIGUubm9kZV9vcHMubG9va3VwKGUscil9LG1rbm9kKGUscix0KXt2YXIgbj1pLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksYT1uLm5vZGUsbz1SLmJhc2VuYW1lKGUpO2lmKCFvfHxvPT09Ii4ifHxvPT09Ii4uIil0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTt2YXIgcz1pLm1heUNyZWF0ZShhLG8pO2lmKHMpdGhyb3cgbmV3IGkuRXJybm9FcnJvcihzKTtpZighYS5ub2RlX29wcy5ta25vZCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYzKTtyZXR1cm4gYS5ub2RlX29wcy5ta25vZChhLG8scix0KX0sY3JlYXRlKGUscil7cmV0dXJuIHI9ciE9PXZvaWQgMD9yOjQzOCxyJj00MDk1LHJ8PTMyNzY4LGkubWtub2QoZSxyLDApfSxta2RpcihlLHIpe3JldHVybiByPXIhPT12b2lkIDA/cjo1MTEsciY9MTAyMyxyfD0xNjM4NCxpLm1rbm9kKGUsciwwKX0sbWtkaXJUcmVlKGUscil7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPSIiLGE9MDthPHQubGVuZ3RoOysrYSlpZih0W2FdKXtuKz0iLyIrdFthXTt0cnl7aS5ta2RpcihuLHIpfWNhdGNoKG8pe2lmKG8uZXJybm8hPTIwKXRocm93IG99fX0sbWtkZXYoZSxyLHQpe3JldHVybiB0eXBlb2YgdD4idSImJih0PXIscj00MzgpLHJ8PTgxOTIsaS5ta25vZChlLHIsdCl9LHN5bWxpbmsoZSxyKXtpZighWi5yZXNvbHZlKGUpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNDQpO3ZhciB0PWkubG9va3VwUGF0aChyLHtwYXJlbnQ6ITB9KSxuPXQubm9kZTtpZighbil0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDQ0KTt2YXIgYT1SLmJhc2VuYW1lKHIpLG89aS5tYXlDcmVhdGUobixhKTtpZihvKXRocm93IG5ldyBpLkVycm5vRXJyb3Iobyk7aWYoIW4ubm9kZV9vcHMuc3ltbGluayl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5zeW1saW5rKG4sYSxlKX0scmVuYW1lKGUscil7dmFyIHQ9Ui5kaXJuYW1lKGUpLG49Ui5kaXJuYW1lKHIpLGE9Ui5iYXNlbmFtZShlKSxvPVIuYmFzZW5hbWUocikscyxsLGY7aWYocz1pLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksbD1zLm5vZGUscz1pLmxvb2t1cFBhdGgocix7cGFyZW50OiEwfSksZj1zLm5vZGUsIWx8fCFmKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNDQpO2lmKGwubW91bnQhPT1mLm1vdW50KXRocm93IG5ldyBpLkVycm5vRXJyb3IoNzUpO3ZhciBkPWkubG9va3VwTm9kZShsLGEpLGM9Wi5yZWxhdGl2ZShlLG4pO2lmKGMuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBpLkVycm5vRXJyb3IoMjgpO2lmKGM9Wi5yZWxhdGl2ZShyLHQpLGMuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNTUpO3ZhciBoO3RyeXtoPWkubG9va3VwTm9kZShmLG8pfWNhdGNoe31pZihkIT09aCl7dmFyIG09aS5pc0RpcihkLm1vZGUpLHA9aS5tYXlEZWxldGUobCxhLG0pO2lmKHApdGhyb3cgbmV3IGkuRXJybm9FcnJvcihwKTtpZihwPWg/aS5tYXlEZWxldGUoZixvLG0pOmkubWF5Q3JlYXRlKGYsbykscCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKHApO2lmKCFsLm5vZGVfb3BzLnJlbmFtZSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYzKTtpZihpLmlzTW91bnRwb2ludChkKXx8aCYmaS5pc01vdW50cG9pbnQoaCkpdGhyb3cgbmV3IGkuRXJybm9FcnJvcigxMCk7aWYoZiE9PWwmJihwPWkubm9kZVBlcm1pc3Npb25zKGwsInciKSxwKSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKHApO2kuaGFzaFJlbW92ZU5vZGUoZCk7dHJ5e2wubm9kZV9vcHMucmVuYW1lKGQsZixvKX1jYXRjaChFKXt0aHJvdyBFfWZpbmFsbHl7aS5oYXNoQWRkTm9kZShkKX19fSxybWRpcihlKXt2YXIgcj1pLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksdD1yLm5vZGUsbj1SLmJhc2VuYW1lKGUpLGE9aS5sb29rdXBOb2RlKHQsbiksbz1pLm1heURlbGV0ZSh0LG4sITApO2lmKG8pdGhyb3cgbmV3IGkuRXJybm9FcnJvcihvKTtpZighdC5ub2RlX29wcy5ybWRpcil0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYzKTtpZihpLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnJtZGlyKHQsbiksaS5kZXN0cm95Tm9kZShhKX0scmVhZGRpcihlKXt2YXIgcj1pLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSksdD1yLm5vZGU7aWYoIXQubm9kZV9vcHMucmVhZGRpcil0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDU0KTtyZXR1cm4gdC5ub2RlX29wcy5yZWFkZGlyKHQpfSx1bmxpbmsoZSl7dmFyIHI9aS5sb29rdXBQYXRoKGUse3BhcmVudDohMH0pLHQ9ci5ub2RlO2lmKCF0KXRocm93IG5ldyBpLkVycm5vRXJyb3IoNDQpO3ZhciBuPVIuYmFzZW5hbWUoZSksYT1pLmxvb2t1cE5vZGUodCxuKSxvPWkubWF5RGVsZXRlKHQsbiwhMSk7aWYobyl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKG8pO2lmKCF0Lm5vZGVfb3BzLnVubGluayl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYzKTtpZihpLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnVubGluayh0LG4pLGkuZGVzdHJveU5vZGUoYSl9LHJlYWRsaW5rKGUpe3ZhciByPWkubG9va3VwUGF0aChlKSx0PXIubm9kZTtpZighdCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDQ0KTtpZighdC5ub2RlX29wcy5yZWFkbGluayl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTtyZXR1cm4gWi5yZXNvbHZlKGkuZ2V0UGF0aCh0LnBhcmVudCksdC5ub2RlX29wcy5yZWFkbGluayh0KSl9LHN0YXQoZSxyKXt2YXIgdD1pLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiFyfSksbj10Lm5vZGU7aWYoIW4pdGhyb3cgbmV3IGkuRXJybm9FcnJvcig0NCk7aWYoIW4ubm9kZV9vcHMuZ2V0YXR0cil0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5nZXRhdHRyKG4pfSxsc3RhdChlKXtyZXR1cm4gaS5zdGF0KGUsITApfSxjaG1vZChlLHIsdCl7dmFyIG47aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgYT1pLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiF0fSk7bj1hLm5vZGV9ZWxzZSBuPWU7aWYoIW4ubm9kZV9vcHMuc2V0YXR0cil0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYzKTtuLm5vZGVfb3BzLnNldGF0dHIobix7bW9kZTpyJjQwOTV8bi5tb2RlJi00MDk2LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9LGxjaG1vZChlLHIpe2kuY2htb2QoZSxyLCEwKX0sZmNobW9kKGUscil7dmFyIHQ9aS5nZXRTdHJlYW1DaGVja2VkKGUpO2kuY2htb2QodC5ub2RlLHIpfSxjaG93bihlLHIsdCxuKXt2YXIgYTtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBvPWkubG9va3VwUGF0aChlLHtmb2xsb3c6IW59KTthPW8ubm9kZX1lbHNlIGE9ZTtpZighYS5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNjMpO2Eubm9kZV9vcHMuc2V0YXR0cihhLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd24oZSxyLHQpe2kuY2hvd24oZSxyLHQsITApfSxmY2hvd24oZSxyLHQpe3ZhciBuPWkuZ2V0U3RyZWFtQ2hlY2tlZChlKTtpLmNob3duKG4ubm9kZSxyLHQpfSx0cnVuY2F0ZShlLHIpe2lmKHI8MCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTt2YXIgdDtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBuPWkubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KTt0PW4ubm9kZX1lbHNlIHQ9ZTtpZighdC5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNjMpO2lmKGkuaXNEaXIodC5tb2RlKSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDMxKTtpZighaS5pc0ZpbGUodC5tb2RlKSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTt2YXIgYT1pLm5vZGVQZXJtaXNzaW9ucyh0LCJ3Iik7aWYoYSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKGEpO3Qubm9kZV9vcHMuc2V0YXR0cih0LHtzaXplOnIsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sZnRydW5jYXRlKGUscil7dmFyIHQ9aS5nZXRTdHJlYW1DaGVja2VkKGUpO2lmKCEodC5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTtpLnRydW5jYXRlKHQubm9kZSxyKX0sdXRpbWUoZSxyLHQpe3ZhciBuPWkubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KSxhPW4ubm9kZTthLm5vZGVfb3BzLnNldGF0dHIoYSx7dGltZXN0YW1wOk1hdGgubWF4KHIsdCl9KX0sb3BlbihlLHIsdCl7aWYoZT09PSIiKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNDQpO3I9dHlwZW9mIHI9PSJzdHJpbmciP1p0KHIpOnIsciY2ND8odD10eXBlb2YgdD4idSI/NDM4OnQsdD10JjQwOTV8MzI3NjgpOnQ9MDt2YXIgbjtpZih0eXBlb2YgZT09Im9iamVjdCIpbj1lO2Vsc2V7ZT1SLm5vcm1hbGl6ZShlKTt0cnl7dmFyIGE9aS5sb29rdXBQYXRoKGUse2ZvbGxvdzohKHImMTMxMDcyKX0pO249YS5ub2RlfWNhdGNoe319dmFyIG89ITE7aWYociY2NClpZihuKXtpZihyJjEyOCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDIwKX1lbHNlIG49aS5ta25vZChlLHQsMCksbz0hMDtpZighbil0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDQ0KTtpZihpLmlzQ2hyZGV2KG4ubW9kZSkmJihyJj0tNTEzKSxyJjY1NTM2JiYhaS5pc0RpcihuLm1vZGUpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNTQpO2lmKCFvKXt2YXIgcz1pLm1heU9wZW4obixyKTtpZihzKXRocm93IG5ldyBpLkVycm5vRXJyb3Iocyl9ciY1MTImJiFvJiZpLnRydW5jYXRlKG4sMCksciY9LTEzMTcxMzt2YXIgbD1pLmNyZWF0ZVN0cmVhbSh7bm9kZTpuLHBhdGg6aS5nZXRQYXRoKG4pLGZsYWdzOnIsc2Vla2FibGU6ITAscG9zaXRpb246MCxzdHJlYW1fb3BzOm4uc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjohMX0pO3JldHVybiBsLnN0cmVhbV9vcHMub3BlbiYmbC5zdHJlYW1fb3BzLm9wZW4obCksdS5sb2dSZWFkRmlsZXMmJiEociYxKSYmKGkucmVhZEZpbGVzfHwoaS5yZWFkRmlsZXM9e30pLGUgaW4gaS5yZWFkRmlsZXN8fChpLnJlYWRGaWxlc1tlXT0xKSksbH0sY2xvc2UoZSl7aWYoaS5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDgpO2UuZ2V0ZGVudHMmJihlLmdldGRlbnRzPW51bGwpO3RyeXtlLnN0cmVhbV9vcHMuY2xvc2UmJmUuc3RyZWFtX29wcy5jbG9zZShlKX1jYXRjaChyKXt0aHJvdyByfWZpbmFsbHl7aS5jbG9zZVN0cmVhbShlLmZkKX1lLmZkPW51bGx9LGlzQ2xvc2VkKGUpe3JldHVybiBlLmZkPT09bnVsbH0sbGxzZWVrKGUscix0KXtpZihpLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoOCk7aWYoIWUuc2Vla2FibGV8fCFlLnN0cmVhbV9vcHMubGxzZWVrKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNzApO2lmKHQhPTAmJnQhPTEmJnQhPTIpdGhyb3cgbmV3IGkuRXJybm9FcnJvcigyOCk7cmV0dXJuIGUucG9zaXRpb249ZS5zdHJlYW1fb3BzLmxsc2VlayhlLHIsdCksZS51bmdvdHRlbj1bXSxlLnBvc2l0aW9ufSxyZWFkKGUscix0LG4sYSl7aWYobjwwfHxhPDApdGhyb3cgbmV3IGkuRXJybm9FcnJvcigyOCk7aWYoaS5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDgpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDgpO2lmKGkuaXNEaXIoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoMzEpO2lmKCFlLnN0cmVhbV9vcHMucmVhZCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTt2YXIgbz10eXBlb2YgYTwidSI7aWYoIW8pYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IGkuRXJybm9FcnJvcig3MCk7dmFyIHM9ZS5zdHJlYW1fb3BzLnJlYWQoZSxyLHQsbixhKTtyZXR1cm4gb3x8KGUucG9zaXRpb24rPXMpLHN9LHdyaXRlKGUscix0LG4sYSxvKXtpZihuPDB8fGE8MCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTtpZihpLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoOCk7aWYoIShlLmZsYWdzJjIwOTcxNTUpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoOCk7aWYoaS5pc0RpcihlLm5vZGUubW9kZSkpdGhyb3cgbmV3IGkuRXJybm9FcnJvcigzMSk7aWYoIWUuc3RyZWFtX29wcy53cml0ZSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI4KTtlLnNlZWthYmxlJiZlLmZsYWdzJjEwMjQmJmkubGxzZWVrKGUsMCwyKTt2YXIgcz10eXBlb2YgYTwidSI7aWYoIXMpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IGkuRXJybm9FcnJvcig3MCk7dmFyIGw9ZS5zdHJlYW1fb3BzLndyaXRlKGUscix0LG4sYSxvKTtyZXR1cm4gc3x8KGUucG9zaXRpb24rPWwpLGx9LGFsbG9jYXRlKGUscix0KXtpZihpLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBpLkVycm5vRXJyb3IoOCk7aWYocjwwfHx0PD0wKXRocm93IG5ldyBpLkVycm5vRXJyb3IoMjgpO2lmKCEoZS5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDgpO2lmKCFpLmlzRmlsZShlLm5vZGUubW9kZSkmJiFpLmlzRGlyKGUubm9kZS5tb2RlKSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDQzKTtpZighZS5zdHJlYW1fb3BzLmFsbG9jYXRlKXRocm93IG5ldyBpLkVycm5vRXJyb3IoMTM4KTtlLnN0cmVhbV9vcHMuYWxsb2NhdGUoZSxyLHQpfSxtbWFwKGUscix0LG4sYSl7aWYobiYyJiYhKGEmMikmJihlLmZsYWdzJjIwOTcxNTUpIT09Mil0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDIpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDIpO2lmKCFlLnN0cmVhbV9vcHMubW1hcCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDQzKTtyZXR1cm4gZS5zdHJlYW1fb3BzLm1tYXAoZSxyLHQsbixhKX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gZS5zdHJlYW1fb3BzLm1zeW5jP2Uuc3RyZWFtX29wcy5tc3luYyhlLHIsdCxuLGEpOjB9LGlvY3RsKGUscix0KXtpZighZS5zdHJlYW1fb3BzLmlvY3RsKXRocm93IG5ldyBpLkVycm5vRXJyb3IoNTkpO3JldHVybiBlLnN0cmVhbV9vcHMuaW9jdGwoZSxyLHQpfSxyZWFkRmlsZShlLHI9e30pe2lmKHIuZmxhZ3M9ci5mbGFnc3x8MCxyLmVuY29kaW5nPXIuZW5jb2Rpbmd8fCJiaW5hcnkiLHIuZW5jb2RpbmchPT0idXRmOCImJnIuZW5jb2RpbmchPT0iYmluYXJ5Iil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2RpbmcgdHlwZSAiJHtyLmVuY29kaW5nfSJgKTt2YXIgdCxuPWkub3BlbihlLHIuZmxhZ3MpLGE9aS5zdGF0KGUpLG89YS5zaXplLHM9bmV3IFVpbnQ4QXJyYXkobyk7cmV0dXJuIGkucmVhZChuLHMsMCxvLDApLHIuZW5jb2Rpbmc9PT0idXRmOCI/dD1jZShzLDApOnIuZW5jb2Rpbmc9PT0iYmluYXJ5IiYmKHQ9cyksaS5jbG9zZShuKSx0fSx3cml0ZUZpbGUoZSxyLHQ9e30pe3QuZmxhZ3M9dC5mbGFnc3x8NTc3O3ZhciBuPWkub3BlbihlLHQuZmxhZ3MsdC5tb2RlKTtpZih0eXBlb2Ygcj09InN0cmluZyIpe3ZhciBhPW5ldyBVaW50OEFycmF5KHRyKHIpKzEpLG89bnIocixhLDAsYS5sZW5ndGgpO2kud3JpdGUobixhLDAsbyx2b2lkIDAsdC5jYW5Pd24pfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKWkud3JpdGUobixyLDAsci5ieXRlTGVuZ3RoLHZvaWQgMCx0LmNhbk93bik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO2kuY2xvc2Uobil9LGN3ZDooKT0+aS5jdXJyZW50UGF0aCxjaGRpcihlKXt2YXIgcj1pLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSk7aWYoci5ub2RlPT09bnVsbCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDQ0KTtpZighaS5pc0RpcihyLm5vZGUubW9kZSkpdGhyb3cgbmV3IGkuRXJybm9FcnJvcig1NCk7dmFyIHQ9aS5ub2RlUGVybWlzc2lvbnMoci5ub2RlLCJ4Iik7aWYodCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKHQpO2kuY3VycmVudFBhdGg9ci5wYXRofSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKXtpLm1rZGlyKCIvdG1wIiksaS5ta2RpcigiL2hvbWUiKSxpLm1rZGlyKCIvaG9tZS93ZWJfdXNlciIpfSxjcmVhdGVEZWZhdWx0RGV2aWNlcygpe2kubWtkaXIoIi9kZXYiKSxpLnJlZ2lzdGVyRGV2aWNlKGkubWFrZWRldigxLDMpLHtyZWFkOigpPT4wLHdyaXRlOihuLGEsbyxzLGwpPT5zfSksaS5ta2RldigiL2Rldi9udWxsIixpLm1ha2VkZXYoMSwzKSksZmUucmVnaXN0ZXIoaS5tYWtlZGV2KDUsMCksZmUuZGVmYXVsdF90dHlfb3BzKSxmZS5yZWdpc3RlcihpLm1ha2VkZXYoNiwwKSxmZS5kZWZhdWx0X3R0eTFfb3BzKSxpLm1rZGV2KCIvZGV2L3R0eSIsaS5tYWtlZGV2KDUsMCkpLGkubWtkZXYoIi9kZXYvdHR5MSIsaS5tYWtlZGV2KDYsMCkpO3ZhciBlPW5ldyBVaW50OEFycmF5KDEwMjQpLHI9MCx0PSgpPT4ocj09PTAmJihyPUlyKGUpLmJ5dGVMZW5ndGgpLGVbLS1yXSk7aS5jcmVhdGVEZXZpY2UoIi9kZXYiLCJyYW5kb20iLHQpLGkuY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIsdCksaS5ta2RpcigiL2Rldi9zaG0iKSxpLm1rZGlyKCIvZGV2L3NobS90bXAiKX0sY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCl7aS5ta2RpcigiL3Byb2MiKTt2YXIgZT1pLm1rZGlyKCIvcHJvYy9zZWxmIik7aS5ta2RpcigiL3Byb2Mvc2VsZi9mZCIpLGkubW91bnQoe21vdW50KCl7dmFyIHI9aS5jcmVhdGVOb2RlKGUsImZkIiwxNjg5NSw3Myk7cmV0dXJuIHIubm9kZV9vcHM9e2xvb2t1cCh0LG4pe3ZhciBhPStuLG89aS5nZXRTdHJlYW1DaGVja2VkKGEpLHM9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOigpPT5vLnBhdGh9fTtyZXR1cm4gcy5wYXJlbnQ9cyxzfX0scn19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpe3Uuc3RkaW4/aS5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsdS5zdGRpbik6aS5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKSx1LnN0ZG91dD9pLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCx1LnN0ZG91dCk6aS5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0IiksdS5zdGRlcnI/aS5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsdS5zdGRlcnIpOmkuc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKSxpLm9wZW4oIi9kZXYvc3RkaW4iLDApLGkub3BlbigiL2Rldi9zdGRvdXQiLDEpLGkub3BlbigiL2Rldi9zdGRlcnIiLDEpfSxzdGF0aWNJbml0KCl7WzQ0XS5mb3JFYWNoKGU9PntpLmdlbmVyaWNFcnJvcnNbZV09bmV3IGkuRXJybm9FcnJvcihlKSxpLmdlbmVyaWNFcnJvcnNbZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSksaS5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpLGkubW91bnQoUCx7fSwiLyIpLGkuY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCksaS5jcmVhdGVEZWZhdWx0RGV2aWNlcygpLGkuY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksaS5maWxlc3lzdGVtcz17TUVNRlM6UCxXT1JLRVJGUzp4fX0saW5pdChlLHIsdCl7aS5pbml0LmluaXRpYWxpemVkPSEwLHUuc3RkaW49ZXx8dS5zdGRpbix1LnN0ZG91dD1yfHx1LnN0ZG91dCx1LnN0ZGVycj10fHx1LnN0ZGVycixpLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0KCl7aS5pbml0LmluaXRpYWxpemVkPSExO2Zvcih2YXIgZT0wO2U8aS5zdHJlYW1zLmxlbmd0aDtlKyspe3ZhciByPWkuc3RyZWFtc1tlXTtyJiZpLmNsb3NlKHIpfX0sZmluZE9iamVjdChlLHIpe3ZhciB0PWkuYW5hbHl6ZVBhdGgoZSxyKTtyZXR1cm4gdC5leGlzdHM/dC5vYmplY3Q6bnVsbH0sYW5hbHl6ZVBhdGgoZSxyKXt0cnl7dmFyIHQ9aS5sb29rdXBQYXRoKGUse2ZvbGxvdzohcn0pO2U9dC5wYXRofWNhdGNoe312YXIgbj17aXNSb290OiExLGV4aXN0czohMSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOiExLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciB0PWkubG9va3VwUGF0aChlLHtwYXJlbnQ6ITB9KTtuLnBhcmVudEV4aXN0cz0hMCxuLnBhcmVudFBhdGg9dC5wYXRoLG4ucGFyZW50T2JqZWN0PXQubm9kZSxuLm5hbWU9Ui5iYXNlbmFtZShlKSx0PWkubG9va3VwUGF0aChlLHtmb2xsb3c6IXJ9KSxuLmV4aXN0cz0hMCxuLnBhdGg9dC5wYXRoLG4ub2JqZWN0PXQubm9kZSxuLm5hbWU9dC5ub2RlLm5hbWUsbi5pc1Jvb3Q9dC5wYXRoPT09Ii8ifWNhdGNoKGEpe24uZXJyb3I9YS5lcnJub31yZXR1cm4gbn0sY3JlYXRlUGF0aChlLHIsdCxuKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOmkuZ2V0UGF0aChlKTtmb3IodmFyIGE9ci5zcGxpdCgiLyIpLnJldmVyc2UoKTthLmxlbmd0aDspe3ZhciBvPWEucG9wKCk7aWYobyl7dmFyIHM9Ui5qb2luMihlLG8pO3RyeXtpLm1rZGlyKHMpfWNhdGNoe31lPXN9fXJldHVybiBzfSxjcmVhdGVGaWxlKGUscix0LG4sYSl7dmFyIG89Ui5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTppLmdldFBhdGgoZSkscikscz1hcihuLGEpO3JldHVybiBpLmNyZWF0ZShvLHMpfSxjcmVhdGVEYXRhRmlsZShlLHIsdCxuLGEsbyl7dmFyIHM9cjtlJiYoZT10eXBlb2YgZT09InN0cmluZyI/ZTppLmdldFBhdGgoZSkscz1yP1Iuam9pbjIoZSxyKTplKTt2YXIgbD1hcihuLGEpLGY9aS5jcmVhdGUocyxsKTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2Zvcih2YXIgZD1uZXcgQXJyYXkodC5sZW5ndGgpLGM9MCxoPXQubGVuZ3RoO2M8aDsrK2MpZFtjXT10LmNoYXJDb2RlQXQoYyk7dD1kfWkuY2htb2QoZixsfDE0Nik7dmFyIG09aS5vcGVuKGYsNTc3KTtpLndyaXRlKG0sdCwwLHQubGVuZ3RoLDAsbyksaS5jbG9zZShtKSxpLmNobW9kKGYsbCl9fSxjcmVhdGVEZXZpY2UoZSxyLHQsbil7dmFyIGE9Ui5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTppLmdldFBhdGgoZSksciksbz1hcighIXQsISFuKTtpLmNyZWF0ZURldmljZS5tYWpvcnx8KGkuY3JlYXRlRGV2aWNlLm1ham9yPTY0KTt2YXIgcz1pLm1ha2VkZXYoaS5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtyZXR1cm4gaS5yZWdpc3RlckRldmljZShzLHtvcGVuKGwpe2wuc2Vla2FibGU9ITF9LGNsb3NlKGwpe3ZhciBmOyhmPW49PW51bGw/dm9pZCAwOm4uYnVmZmVyKSE9bnVsbCYmZi5sZW5ndGgmJm4oMTApfSxyZWFkKGwsZixkLGMsaCl7Zm9yKHZhciBtPTAscD0wO3A8YztwKyspe3ZhciBFO3RyeXtFPXQoKX1jYXRjaHt0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI5KX1pZihFPT09dm9pZCAwJiZtPT09MCl0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDYpO2lmKEU9PW51bGwpYnJlYWs7bSsrLGZbZCtwXT1FfXJldHVybiBtJiYobC5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxtfSx3cml0ZShsLGYsZCxjLGgpe2Zvcih2YXIgbT0wO208YzttKyspdHJ5e24oZltkK21dKX1jYXRjaHt0aHJvdyBuZXcgaS5FcnJub0Vycm9yKDI5KX1yZXR1cm4gYyYmKGwubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksbX19KSxpLm1rZGV2KGEsbyxzKX0sZm9yY2VMb2FkRmlsZShlKXtpZihlLmlzRGV2aWNlfHxlLmlzRm9sZGVyfHxlLmxpbmt8fGUuY29udGVudHMpcmV0dXJuITA7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpO2lmKEtlKXRyeXtlLmNvbnRlbnRzPU9lKEtlKGUudXJsKSwhMCksZS51c2VkQnl0ZXM9ZS5jb250ZW50cy5sZW5ndGh9Y2F0Y2h7dGhyb3cgbmV3IGkuRXJybm9FcnJvcigyOSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfSxjcmVhdGVMYXp5RmlsZShlLHIsdCxuLGEpe2NsYXNzIG97Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aEtub3duPSExLHRoaXMuY2h1bmtzPVtdfWdldChwKXtpZighKHA+dGhpcy5sZW5ndGgtMXx8cDwwKSl7dmFyIEU9cCV0aGlzLmNodW5rU2l6ZSxNPXAvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoTSlbRV19fXNldERhdGFHZXR0ZXIocCl7dGhpcy5nZXR0ZXI9cH1jYWNoZUxlbmd0aCgpe3ZhciBwPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihwLm9wZW4oIkhFQUQiLHQsITEpLHAuc2VuZChudWxsKSwhKHAuc3RhdHVzPj0yMDAmJnAuc3RhdHVzPDMwMHx8cC5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK3Auc3RhdHVzKTt2YXIgRT1OdW1iZXIocC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSksTSxJPShNPXAuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJk09PT0iYnl0ZXMiLFQ9KE09cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSYmTT09PSJnemlwIix2PTEwMjQqMTAyNDtJfHwodj1FKTt2YXIgXz0oRixCKT0+e2lmKEY+Qil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIrRisiLCAiK0IrIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKEI+RS0xKXRocm93IG5ldyBFcnJvcigib25seSAiK0UrIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIFY9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKFYub3BlbigiR0VUIix0LCExKSxFIT09diYmVi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrRisiL