From a3900d62ca88f7af15768c9d1b4bd53fa6d71d7e Mon Sep 17 00:00:00 2001 From: Griffin Allen <40434025+griffinallen@users.noreply.github.com> Date: Thu, 21 May 2026 08:29:49 -0400 Subject: [PATCH 1/5] Fixing refresh loop on video load A user reported that every second, the video attempts to reload. A likely cause of this is the fact that we are catching network errors in the readStream and returning "successful" responses. These responses are not what the client expects and it attempts to refetch, causing a loop. Removing this catch should solve this issue. --- resources/brave-yt-sabr-fix.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/resources/brave-yt-sabr-fix.js b/resources/brave-yt-sabr-fix.js index 435381c8..0184db31 100644 --- a/resources/brave-yt-sabr-fix.js +++ b/resources/brave-yt-sabr-fix.js @@ -103,9 +103,6 @@ Object.defineProperty(out, 'type', { value: response.type, configurable: true }); } catch(e) {} return out; - }).catch(function(e) { - // If anything goes wrong during streaming/patching, bail out and pass through the original response - return new Response(pass, reinit); }); }); } From 77444f3d8c0cf8e3ac5b3177c1a2d08a9e30a67b Mon Sep 17 00:00:00 2001 From: Griffin Allen <40434025+griffinallen@users.noreply.github.com> Date: Thu, 21 May 2026 08:30:56 -0400 Subject: [PATCH 2/5] fix build --- dist/resources.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/resources.json b/dist/resources.json index 1ed11463..f96680c4 100644 --- a/dist/resources.json +++ b/dist/resources.json @@ -1 +1 @@ -[{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-auto-pip.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBicmF2ZS1hdXRvLXBpcCDigJQgYXV0b21hdGljIFBpY3R1cmUtaW4tUGljdHVyZSB0b2dnbGUgZm9yIEhUTUw1IDx2aWRlbz4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBXaGF0IGl0IGRvZXMKICogLS0tLS0tLS0tLS0tCiAqICAgMS4gRm9yY2UtZW5hYmxlcyBQaVAgb24gdmlkZW9zIHRoYXQgZXhwbGljaXRseSBkaXNhYmxlIGl0IChOZXRmbGl4LAogKiAgICAgIGNlcnRhaW4gRFJNIHBsYXllcnMpIGJ5IGNsZWFyaW5nIGBkaXNhYmxlUGljdHVyZUluUGljdHVyZWAgYW5kCiAqICAgICAgd2F0Y2hpbmcgZm9yIHNpdGVzIHRoYXQgdHJ5IHRvIHJlLXNldCBpdC4KICogICAyLiBXaXJlcyBgbWVkaWFTZXNzaW9uLnNldEFjdGlvbkhhbmRsZXIoImVudGVycGljdHVyZWlucGljdHVyZSIpYCBzbwogKiAgICAgIGJyb3dzZXJzIC8gT1NlcyB0aGF0IGZpcmUgaXQgKGF1dG8tUGlQIG9uIHRhYiBzd2l0Y2gpIGp1c3Qgd29yay4KICogICAzLiBBZGRzIGEgY2xpY2thYmxlIFBpUCBjb250cm9sOgogKiAgICAgICAgLSBOYXRpdmUgaW5qZWN0aW9uIG9uIFlvdVR1YmUgLyBUd2l0Y2ggLyBOZXRmbGl4IChtYXRjaGVzIGVhY2gKICogICAgICAgICAgc2l0ZSdzIGV4aXN0aW5nIGNvbnRyb2xzIGJhcikuCiAqICAgICAgICAtIE90aGVyd2lzZSBhIEZpcmVmb3gtc3R5bGUgIlBvcCBvdXQgdGhpcyB2aWRlbyIgaG92ZXIgcGlsbAogKiAgICAgICAgICB0aGF0IGZsb2F0cyBvdmVyIHRoZSB2aWRlbywgZmFkZXMgaW4gb24gaG92ZXIsIGZhZGVzIG91dAogKiAgICAgICAgICBhZnRlciBhIHNtYWxsIGdyYWNlIHBlcmlvZCwgYW5kIHNocmlua3MgdG8gaWNvbi1vbmx5IGFmdGVyCiAqICAgICAgICAgIHRoZSBmaXJzdCBjbGljay4KICogICA0LiBIYW5kbGVzIG1hbnkgdmlkZW9zIG9uIHRoZSBzYW1lIHBhZ2UgKGZlZWRzLCBjb21tZW50IGVtYmVkcywKICogICAgICBtb2RhbCBwbGF5ZXJzKSBhbmQgdHJhY2tzIGFkZC9yZW1vdmUgdmlhIE11dGF0aW9uT2JzZXJ2ZXIuCiAqCiAqIENvbmZpZ3VyYXRpb24gKHBlci1vcmlnaW4gbG9jYWxTdG9yYWdlKQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogICBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAKICogICAgIHVuc2V0IC8gIjEiIC8gInRydWUiIC8gInllcyIgLyAib24iICAgLT4gZ2VuZXJpYyBvdmVybGF5IHBpbGwgKGRlZmF1bHQpCiAqICAgICAiMCIgICAvICJmYWxzZSIgLyAibm8iICAgLyAib2ZmIiAgICAgIC0+IHVzZSBzaXRlLXNwZWNpZmljIG5hdGl2ZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gKFlvdVR1YmUvVHdpdGNoL05ldGZsaXgpCiAqCiAqICAgU2V0IHZpYSBEZXZUb29scyBjb25zb2xlIG9uIHRoZSBkZXNpcmVkIG9yaWdpbiwgdGhlbiByZWxvYWQgdGhlIHRhYi4KICoKICogQnJvd3NlciBzdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLQogKiAgIC0gQ2hyb21pdW0gKEJyYXZlLCBDaHJvbWUsIEVkZ2UpOiBmdWxsIHN1cHBvcnQsIGFsbCBmZWF0dXJlcy4KICogICAtIEZpcmVmb3g6IFBpUCB3b3JrcywgYnV0IEZpcmVmb3ggYWxyZWFkeSBzaGlwcyBhIGJ1aWx0LWluICJQb3Agb3V0CiAqICAgICB0aGlzIHZpZGVvIiB0b2dnbGUgc28gdGhlIHNjcmlwdCdzIHBpbGwgaXMgcmVkdW5kYW50IHRoZXJlLgogKiAgIC0gU2FmYXJpIChpT1MgMTQrKTogZmFsbHMgYmFjayB0byBgd2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZWAuIFRoZQogKiAgICAgaG92ZXIgcGlsbCBzd2l0Y2hlcyB0byBhIHRhcC10by1yZXZlYWwgcGlsbCAoMyBzIGF1dG8taGlkZSkuCiAqICAgLSBPdGhlciAvIG9sZGVyOiBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbm8gUGlQIEFQSSBpcwogKiAgICAgcHJlc2VudCBhdCBhbGwuCiAqCiAqIEFyY2hpdGVjdHVyZQogKiAtLS0tLS0tLS0tLS0KICogICAqIE9uZSBzaGFyZWQgbW91c2Vtb3ZlIC8gdG91Y2hzdGFydCAvIHNjcm9sbCAvIHJlc2l6ZSAvIGZ1bGxzY3JlZW4KICogICAgIGxpc3RlbmVyIHNldCwgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB2aWRlb3MgYXJlIG9uIHRoZSBwYWdlCiAqICAgICAoYG92ZXJsYXlzYCByZWdpc3RyeSArIGBhcm1HbG9iYWxzKClgIC8gYG1heWJlRGlzYXJtR2xvYmFscygpYCkuCiAqICAgKiBPZmYtc2NyZWVuIHZpZGVvcyBhcmUgZ2F0ZWQgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBhIHNpbmdsZQogKiAgICAgYEludGVyc2VjdGlvbk9ic2VydmVyYCAoYHZpc2libGVPdmVybGF5c2Agc3Vic2V0KS4KICogICAqIEV2ZXJ5IHBlci12aWRlbyByZWdpc3RyYXRpb24gcmVjb3JkcyBhIHRlYXJkb3duIGZ1bmN0aW9uIGluCiAqICAgICBgdmlkZW9DbGVhbnVwc2Agc28gdGhlIGxpc3RlbmVycywgb2JzZXJ2ZXJzLCBhbmQgcGlsbCBidXR0b24gYXJlCiAqICAgICBhbGwgcmVtb3ZlZCBpZiB0aGUgcGFnZSBkcm9wcyB0aGUgdmlkZW8gZWxlbWVudC4KICoKICogU291cmNlIG9mIG9yaWdpbmFsIGF1dG8tUGlQIGJlaGF2aW91cjoKICogICBodHRwczovL29sZC5yZWRkaXQuY29tL3IvYnJhdmVfYnJvd3Nlci9jb21tZW50cy8xcjhlZGc0LwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCihmdW5jdGlvbigpIHsKICBjb25zdCBWRVJTSU9OID0gInYwLjQyLXl0LWF1dG9waXAtdGFyZ2V0K2NvbmRpdGlvbmFsLXJlc3VtZSI7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFR1bmFibGVzCiAgLy8KICAvLyBDb2xsZWN0ZWQgaGVyZSBzbyBhIHVzZXIgLyBtYWludGFpbmVyIGNhbiBhZGp1c3Qgc3BhY2luZywgdGltaW5nIGFuZAogIC8vIHZpZXdwb3J0IGJlaGF2aW91ciB3aXRob3V0IGh1bnRpbmcgdGhyb3VnaCB0aGUgZmlsZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBjb25zdCBDT05GSUcgPSB7CiAgICAvLyBWZXJ0aWNhbCBvZmZzZXQgYWRkZWQgdG8gdGhlIHBpbGwncyBjZW50cmVkLW1pZC1yaWdodCBwb3NpdGlvbgogICAgLy8gKHBvc2l0aXZlID0gZG93bikuIEVtcGlyaWNhbGx5IHR1bmVkIHNvIHRoZSBwaWxsIHNpdHMgYmVsb3cgdGhlCiAgICAvLyB0eXBpY2FsIHNpdGUgY29udHJvbCBiYXIgaW5zdGVhZCBvZiBvdmVybGFwcGluZyBpdC4KICAgIFBJTExfT0ZGU0VUX1k6IDQwLAogICAgLy8gSG9yaXpvbnRhbCBnYXAgZnJvbSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdmlzaWJsZSB2aWRlbyB0byB0aGUgcGlsbC4KICAgIFBJTExfUklHSFRfTUFSR0lOOiAxMiwKICAgIC8vIE1pbmltdW0gZ2FwIGJldHdlZW4gdGhlIHBpbGwgYW5kIGFueSB2aWV3cG9ydCBlZGdlLgogICAgVklFV1BPUlRfUEFEOiA4LAogICAgLy8gRGVsYXkgYmV0d2VlbiB0aGUgY3Vyc29yIGxlYXZpbmcgdGhlIHZpZGVvL3BpbGwgcmVnaW9uIGFuZCB0aGUKICAgIC8vIHBpbGwgZmFkaW5nIG91dCDigJQgcHJvdGVjdHMgYWdhaW5zdCBmbGlja2VyIHdoZW4gdGhlIGN1cnNvcgogICAgLy8gY3Jvc3NlcyB0aGUgZ2FwIGZyb20gdmlkZW8gdG8gcGlsbC4KICAgIEhPVkVSX0dSQUNFX01TOiAxNTAsCiAgICAvLyBIb3cgbG9uZyB0aGUgcGlsbCBzdGF5cyByZXZlYWxlZCBhZnRlciBhIHRhcCBvbiBhIHRvdWNoIGRldmljZS4KICAgIFRPVUNIX1JFVkVBTF9NUzogMzAwMCwKICAgIC8vIE1heGltdW0gdGltZSB3ZSB3YWl0IGZvciBgbG9hZGVkbWV0YWRhdGFgIGJlZm9yZSBpc3N1aW5nIFBpUC4KICAgIE1FVEFEQVRBX1dBSVRfTVM6IDMwMDAsCiAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBidWZmZXIgc28gdGhlIHBpbGwgaXMgaW4gcGxhY2UgYmVmb3JlIHRoZQogICAgLy8gdmlkZW8gZnVsbHkgc2Nyb2xscyBpbnRvIHZpZXcuCiAgICBJT19ST09UX01BUkdJTjogIjEwMHB4IiwKICAgIC8vIEdyYWNlIHdpbmRvdyBhZnRlciBhIFlvdVR1YmUgU1BBIG5hdmlnYXRpb24gZHVyaW5nIHdoaWNoIHRoZSBwaWxsCiAgICAvLyBzdGF5cyBzdXBwcmVzc2VkIGV2ZW4gaWYgdGhlIG5ldyBVUkwgd291bGQgb3RoZXJ3aXNlIGJlIGVsaWdpYmxlLgogICAgLy8gTGV0cyB0aGUgd2F0Y2gtcGFnZSBwbGF5ZXIgbW91bnQgYW5kIGF2b2lkcyBhIGJyaWVmIGZsYXNoIHdoZW4gdGhlCiAgICAvLyBjdXJzb3IgaXMgc3RpbGwgYXQgdGhlIHByZXZpb3VzIGhvdmVyIHRhcmdldCdzIGNvb3JkaW5hdGVzLgogICAgWVRfTkFWX0dSQUNFX01TOiA1MDAsCiAgICAvLyBJZiBhIG5hdGl2ZSBpbmplY3RvciAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpIGtlZXBzIHJldHVybmluZwogICAgLy8gZmFsc2UgZm9yIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIGdpdmUgdXAKICAgIC8vIG9uIG5hdGl2ZSBpbmplY3Rpb24gYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQuCiAgICAvLyBHZW5lcm91cyBvbiBwdXJwb3NlIOKAlCBzbG93IHBsYXllciBtb3VudHMgKG5ldHdvcmstc3RhbGxlZCBpZnJhbWVzLAogICAgLy8gbG9uZy1ydW5uaW5nIFJlYWN0IGh5ZHJhdGlvbikgc2hvdWxkbid0IHRyaXAgdGhlIGZhbGxiYWNrLgogICAgTkFUSVZFX0ZBTExCQUNLX01TOiAxMDAwMCwKICB9OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNb2R1bGUtbGV2ZWwgc3RhdGUKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gdmlkZW8gZWxlbWVudCAtPiBjbGVhbnVwIGZ1bmN0aW9uLiBQb3B1bGF0ZWQgd2hlbiBhIHZpZGVvIGlzIHdpcmVkCiAgLy8gdXA7IGNhbGxlZCBmcm9tIHRoZSBkaXNjb3ZlcnkgTXV0YXRpb25PYnNlcnZlciB3aGVuIGEgdHJhY2tlZCB2aWRlbwogIC8vIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB3ZSBjYW4gcmVsZWFzZSBldmVyeSBsaXN0ZW5lciBhbmQgdGhlCiAgLy8gcGlsbCBET00gbm9kZSBpdCBvd25zLgogIGNvbnN0IHZpZGVvQ2xlYW51cHMgPSBuZXcgV2Vha01hcCgpOwoKICAvLyBZb3VUdWJlLXNwZWNpZmljIHN0YXRlIGZvciB0aGUgVVJMLWdhdGUgKyBTUEEtbmF2LWdyYWNlIGxvZ2ljIGluCiAgLy8gdXBkYXRlKCkuIEhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHNvIHVwZGF0ZSgpIGRvZXNuJ3QgcmUtdGVzdCB0aGUKICAvLyBob3N0IHJlZ2V4IGV2ZXJ5IHRpY2sg4oCUIGhvc3RuYW1lIGlzIGludmFyaWFudCBmb3IgdGhlIHBhZ2UgbGlmZXRpbWUsCiAgLy8gYW5kIHRoZSBwYXRobmFtZSByZWdleCBvbmx5IHJlLXJ1bnMgb24gYWN0dWFsIFNQQSBwYXRoIGNoYW5nZXMuCiAgLy8gV2h5IHRoaXMgZXhpc3RzOiBZb3VUdWJlJ3MgaG9tZXBhZ2UgLyBmZWVkIC8gc2VhcmNoIC8gY2hhbm5lbCBwYWdlcwogIC8vIHJldXNlIHRoZSBzYW1lIGBodG1sNS12aWRlby1jb250YWluZXJgIDx2aWRlbz4gZWxlbWVudCBhcyB0aGUgd2F0Y2gKICAvLyBwYWdlIGZvciBob3Zlci10aHVtYm5haWwgcHJldmlld3MsIHJlcG9zaXRpb25pbmcgaXQgb3ZlciB3aGljaGV2ZXIKICAvLyB0aHVtYm5haWwgdGhlIGN1cnNvciBpcyBvbi4gRE9NLWxldmVsIHNpZ25hbHMgKHNpemUsIG11dGVkLCBsb29wLAogIC8vIHBhcmVudCBjbGFzcykgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHByZXZpZXcgYW5kIHdhdGNoLCBzbyB0aGUgVVJMIGlzCiAgLy8gdGhlIG9ubHkgcmVsaWFibGUgZGlzdGluZ3Vpc2hlci4KICBjb25zdCBfeXRIb3N0ID0gLyg/Ol58XC4pKD86eW91dHViZVwuY29tfHlvdXR1YmUtbm9jb29raWVcLmNvbSkkL2kudGVzdChsb2NhdGlvbi5ob3N0bmFtZSk7CiAgY29uc3QgX3l0V2F0Y2hQYXRoID0gL15cLyg/OndhdGNofGVtYmVkfGxpdmV8c2hvcnRzKS87CiAgbGV0IF95dExhc3RQYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgbGV0IF95dFByZXZpZXdBcmVhID0gX3l0SG9zdCAmJiAhX3l0V2F0Y2hQYXRoLnRlc3QoX3l0TGFzdFBhdGgpOwogIGxldCBfeXROYXZBdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE92ZXJsYXkgcmVnaXN0cnkgKyB2aWV3cG9ydCBnYXRpbmcKICAvLwogIC8vIEdvYWw6IE8oMSkgZG9jdW1lbnQvd2luZG93IGxpc3RlbmVycyByZWdhcmRsZXNzIG9mIHZpZGVvIGNvdW50LCBhbmQKICAvLyBPKHZpc2libGUpIChub3QgTyh0b3RhbCkpIHdvcmsgcGVyIHNjcm9sbC9tb3VzZW1vdmUgdGljay4gQSBzaW5nbGUKICAvLyBzaGFyZWQgbGlzdGVuZXIgc2V0IHdhbGtzIHRoZSByZWdpc3RyeTsgYW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIKICAvLyBuYXJyb3dzIGl0ZXJhdGlvbiB0byB0aGUgdmlkZW9zIGFjdHVhbGx5IG9uIHNjcmVlbi4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gRXZlcnkgb3ZlcmxheSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgKGxpZmV0aW1lIHJlZ2lzdHJ5KS4KICBjb25zdCBvdmVybGF5cyA9IG5ldyBTZXQoKTsKICAvLyBTdWJzZXQgb2YgYG92ZXJsYXlzYCB3aG9zZSB2aWRlbyBpcyBjdXJyZW50bHkgaW50ZXJzZWN0aW5nIHRoZQogIC8vIHZpZXdwb3J0LiBIb3QtcGF0aCBpdGVyYXRpb24gdXNlcyB0aGlzIHNldCBzbyBvZmYtc2NyZWVuIHZpZGVvcyBpbgogIC8vIGxvbmcgZmVlZHMgZG9uJ3QgcGF5IGxheW91dCBjb3N0cyBvbiBldmVyeSBzY3JvbGwgZnJhbWUuCiAgY29uc3QgdmlzaWJsZU92ZXJsYXlzID0gbmV3IFNldCgpOwogIC8vIFJldmVyc2UgbG9va3VwIGZvciB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sgKGVudHJ5LnRhcmdldAogIC8vIGlzIHRoZSB2aWRlbyBlbGVtZW50KS4KICBjb25zdCB2aWRlb1RvT3ZlcmxheSA9IG5ldyBXZWFrTWFwKCk7CiAgbGV0IGludGVyc2VjdGlvbk9ic2VydmVyID0gbnVsbDsKICBmdW5jdGlvbiBnZXRJTygpIHsKICAgIGlmIChpbnRlcnNlY3Rpb25PYnNlcnZlcikgcmV0dXJuIGludGVyc2VjdGlvbk9ic2VydmVyOwogICAgaWYgKHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgZSA9IGVudHJpZXNbaV07CiAgICAgICAgY29uc3QgaW5zdCA9IHZpZGVvVG9PdmVybGF5LmdldChlLnRhcmdldCk7CiAgICAgICAgaWYgKCFpbnN0KSBjb250aW51ZTsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmFkZChpbnN0KTsKICAgICAgICB9IGVsc2UgaWYgKHZpc2libGVPdmVybGF5cy5kZWxldGUoaW5zdCkpIHsKICAgICAgICAgIC8vIEZvcmNlIGEgZmluYWwgdXBkYXRlIHNvIGFueSB2aXNpYmxlIHBpbGwgaGlkZXMgY2xlYW5seS4KICAgICAgICAgIGluc3QudXBkYXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7IHJvb3RNYXJnaW46IENPTkZJRy5JT19ST09UX01BUkdJTiB9KTsKICAgIHJldHVybiBpbnRlcnNlY3Rpb25PYnNlcnZlcjsKICB9CiAgLy8gTGFzdCBrbm93biBwb2ludGVyIHBvc2l0aW9uIChudW1iZXJzLCBuZXZlciB0aGUgTW91c2VFdmVudCDigJQga2VlcGluZwogIC8vIHRoZSBldmVudCBhbGl2ZSBhY3Jvc3MgckFGIHRpY2tzIHBpbnMgZXh0cmEgRE9NIHJlZmVyZW5jZXMgaW4gVjgncwogIC8vIGNsb3N1cmUgZW52aXJvbm1lbnQpLgogIGxldCBtbVggPSAwLCBtbVkgPSAwOwogIC8vIENvYWxlc2NpbmcgZmxhZ3Mg4oCUIGNvbGxhcHNlIGJ1cnN0cyBvZiBtb3VzZW1vdmUgLyBzY3JvbGwgLyBldGMuIGludG8KICAvLyBhIHNpbmdsZSBwZXItZnJhbWUgdGljayBpbnN0ZWFkIG9mIG9uZSB0aWNrIHBlciBldmVudC4KICBsZXQgbW1UaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IHVwZFRpY2tTY2hlZHVsZWQgPSBmYWxzZTsKICAvLyBUcnVlIHdoZW4gZ2xvYmFsIGxpc3RlbmVycyBhcmUgY3VycmVudGx5IGF0dGFjaGVkLiBSZWZlcmVuY2UtY291bnRlZAogIC8vIGJ5IGBvdmVybGF5cy5zaXplYCBzbyB3ZSBvbmx5IGxpc3RlbiB3aGlsZSBhdCBsZWFzdCBvbmUgb3ZlcmxheSBpcyBsaXZlLgogIGxldCBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gX21tVGljaygpIHsKICAgIG1tVGlja1NjaGVkdWxlZCA9IGZhbHNlOwogICAgY29uc3QgeCA9IG1tWCwgeSA9IG1tWTsKICAgIC8vIEl0ZXJhdGUgb25seSB0aGUgdmlzaWJsZSBzdWJzZXQ7IG9mZi1zY3JlZW4gdmlkZW9zIGNhbid0IGJlIGhvdmVyZWQuCiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC5oYW5kbGVQb2ludGVyKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX29uRG9jTW91c2VNb3ZlKGUpIHsKICAgIG1tWCA9IGUuY2xpZW50WDsKICAgIG1tWSA9IGUuY2xpZW50WTsKICAgIGlmIChtbVRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIG1tVGlja1NjaGVkdWxlZCA9IHRydWU7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX21tVGljayk7CiAgfQogIGZ1bmN0aW9uIF9vbkRvY1RvdWNoU3RhcnQoZSkgewogICAgY29uc3QgdCA9IChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB8fCAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKTsKICAgIGlmICghdCkgcmV0dXJuOwogICAgY29uc3QgeCA9IHQuY2xpZW50WCwgeSA9IHQuY2xpZW50WTsKICAgIHZpc2libGVPdmVybGF5cy5mb3JFYWNoKChpbnN0KSA9PiBpbnN0LmhhbmRsZVRvdWNoKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX3NjaGVkdWxlVXBkYXRlQWxsKCkgewogICAgaWYgKHVwZFRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIHVwZFRpY2tTY2hlZHVsZWQgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF91cGRhdGVBbGxUaWNrKTsKICB9CiAgZnVuY3Rpb24gX3VwZGF0ZUFsbFRpY2soKSB7CiAgICB1cGRUaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC51cGRhdGUoKSk7CiAgfQoKICBmdW5jdGlvbiBhcm1HbG9iYWxzKCkgewogICAgaWYgKGdsb2JhbHNBcm1lZCkgcmV0dXJuOwogICAgZ2xvYmFsc0FybWVkID0gdHJ1ZTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIGFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlRGlzYXJtR2xvYmFscygpIHsKICAgIGlmICghZ2xvYmFsc0FybWVkIHx8IG92ZXJsYXlzLnNpemUgPiAwKSByZXR1cm47CiAgICBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICAvLyBUZWFyIGRvd24gdGhlIEludGVyc2VjdGlvbk9ic2VydmVyIHRvbyDigJQgaXQncyB0aWVkIHRvIHRoZSBzYW1lCiAgICAvLyBvdmVybGF5IGxpZmVjeWNsZSBhcyB0aGUgZ2xvYmFsIGxpc3RlbmVycy4gUmUtY3JlYXRlZCBsYXppbHkgYnkKICAgIC8vIGdldElPKCkgaWYgYSBmdXR1cmUgb3ZlcmxheSByZWdpc3RlcnMuCiAgICBpZiAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHsKICAgICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICBpbnRlcnNlY3Rpb25PYnNlcnZlciA9IG51bGw7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDYXBhYmlsaXR5ICsgZW52aXJvbm1lbnQgZGV0ZWN0aW9uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBpUCBhdmFpbGFiaWxpdHkgYWNyb3NzIGJyb3dzZXJzOgogIC8vICAgSEFTX1NUQU5EQVJEX1BJUCDigJQgYHJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlYCAoQ2hyb21pdW0gLyBGaXJlZm94IC8gaU9TIDE0KykuCiAgLy8gICBIQVNfV0VCS0lUX1BJUCAgIOKAlCBvbGRlciBpT1MgU2FmYXJpJ3MgYHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGVgLgogIC8vIFRoZSBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbmVpdGhlciBpcyBwcmVzZW50LgogIGNvbnN0IEhBU19TVEFOREFSRF9QSVAgPSAhIWRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbmFibGVkOwogIGNvbnN0IEhBU19XRUJLSVRfUElQID0gIndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUiIGluIEhUTUxWaWRlb0VsZW1lbnQucHJvdG90eXBlOwogIGNvbnN0IFBJUF9TVVBQT1JURUQgPSBIQVNfU1RBTkRBUkRfUElQIHx8IEhBU19XRUJLSVRfUElQOwoKICAvLyBUb3VjaCBjYXBhYmlsaXR5IOKAlCBzd2l0Y2hlcyB0aGUgb3ZlcmxheSBmcm9tIGhvdmVyLWRyaXZlbiB0bwogIC8vIHRhcC10by1yZXZlYWwgb24gaU9TIC8gQW5kcm9pZC4KICBjb25zdCBJU19UT1VDSCA9ICJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwOwoKICAvLyBDb21iaW5lZCBmdWxsc2NyZWVuIGNoZWNrIGFjcm9zcyB0aGUgdGhyZWUgdmVuZG9yIHZhcmlhbnRzOgogIC8vICAgLSBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAgICAgICAoc3RhbmRhcmQpCiAgLy8gICAtIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IChvbGRlciBDaHJvbWl1bSAvIFNhZmFyaSBkZXNrdG9wKQogIC8vICAgLSB2aWRlby53ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbiAoaU9TIG5hdGl2ZSB2aWRlbyBmdWxsc2NyZWVuLAogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggbmV2ZXIgc2V0cyBkb2N1bWVudC4qKQogIGZ1bmN0aW9uIGlzRnVsbHNjcmVlbih2aWRlbykgewogICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICBpZiAodmlkZW8gJiYgdmlkZW8ud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW4pIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gQ29uc29sZSBvdXRwdXQuIGBsb2dgIGZvciBvbmUtbGluZSBzdWNjZXNzIG1lc3NhZ2VzIG9uIGluamVjdGlvbiwKICAvLyBgd2FybmAgZm9yIGZhaWx1cmVzIChrZXB0IHF1aWV0IGJ5IGRlZmF1bHQpLgogIGNvbnN0IFRBRyA9ICJbYnJhdmUtYXV0by1waXAgIiArIFZFUlNJT04gKyAiXSI7CiAgY29uc3QgbG9nID0gKC4uLmEpID0+IGNvbnNvbGUubG9nKFRBRywgLi4uYSk7CiAgY29uc3Qgd2FybiA9ICguLi5hKSA9PiBjb25zb2xlLndhcm4oVEFHLCAuLi5hKTsKCiAgLy8gUGljayB0aGUgYmVzdCA8dmlkZW8+IGZvciBhbiBhdXRvLVBpUCBpbnRlbnQgZmlyZWQgYnkgdGhlIE9TIC8KICAvLyBicm93c2VyLiBVc2VkIGJ5IHRoZSBnbG9iYWwgYG1lZGlhU2Vzc2lvbmAgYWN0aW9uIGhhbmRsZXIgc28gdGhlCiAgLy8gKmxhc3QqIHJlZ2lzdGVyZWQgdmlkZW8gZG9lc24ndCBnZXQgUGlQJ2QgYnkgZGVmYXVsdCDigJQgc2VlIGNvbW1lbnQKICAvLyBhdCB0aGUgcmVnaXN0cmF0aW9uIHNpdGUgZm9yIHRoZSBZb3VUdWJlIGJsYWNrLXNjcmVlbiByYXRpb25hbGUuCiAgZnVuY3Rpb24gcGlja0F1dG9QaXBUYXJnZXQoKSB7CiAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHJldHVybiBkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudDsKICAgIGNvbnN0IHZpZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgIGxldCBiZXN0UGxheWluZyA9IG51bGwsIGJlc3RQbGF5aW5nQXJlYSA9IDA7CiAgICBsZXQgYmVzdFJlYWR5ID0gbnVsbCwgYmVzdFJlYWR5QXJlYSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZHMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgdiA9IHZpZHNbaV07CiAgICAgIGlmICh2LmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKSBjb250aW51ZTsKICAgICAgY29uc3QgciA9IHYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGEgPSBNYXRoLm1heCgwLCByLndpZHRoKSAqIE1hdGgubWF4KDAsIHIuaGVpZ2h0KTsKICAgICAgaWYgKGEgPD0gMCkgY29udGludWU7CiAgICAgIGlmICghdi5wYXVzZWQgJiYgIXYuZW5kZWQgJiYgdi5yZWFkeVN0YXRlID49IDIgJiYgYSA+IGJlc3RQbGF5aW5nQXJlYSkgewogICAgICAgIGJlc3RQbGF5aW5nID0gdjsgYmVzdFBsYXlpbmdBcmVhID0gYTsKICAgICAgfQogICAgICBpZiAodi5yZWFkeVN0YXRlID49IDEgJiYgYSA+IGJlc3RSZWFkeUFyZWEpIHsKICAgICAgICBiZXN0UmVhZHkgPSB2OyBiZXN0UmVhZHlBcmVhID0gYTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJlc3RQbGF5aW5nIHx8IGJlc3RSZWFkeTsKICB9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFBpUCBpY29uIGZhY3RvcnkKICAvLwogIC8vIEJ1aWx0IHdpdGggY3JlYXRlRWxlbWVudE5TIGluc3RlYWQgb2YgaW5uZXJIVE1MIHRvIGF2b2lkIFRydXN0ZWRUeXBlcwogIC8vIC8gQ1NQIGByZXF1aXJlVHJ1c3RlZFR5cGVzRm9yICdzY3JpcHQnYCB2aW9sYXRpb25zIG9uIFlvdVR1YmUgZXRjLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERlZmVuc2UtaW4tZGVwdGggaGVscGVyIHVzZWQgd2hlbiBjbG9uaW5nIHRoaXJkLXBhcnR5IHdyYXBwZXIKICAvLyBlbGVtZW50cyAoTmV0ZmxpeCdzIC5tZWRpdW0gaWNvbiB3cmFwcGVyLCBUd2l0Y2gncyByaWdodC1jb250cm9scwogIC8vIHdyYXBwZXIpLiBjbG9uZU5vZGUoZmFsc2UpIGNhcnJpZXMgZm9yd2FyZCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMKICAvLyBhbmQgdGhlIGBzdHlsZWAgYXR0cmlidXRlIOKAlCB3ZSBzdHJpcDoKICAvLyAgIC0gYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIGBvbipgICh3b3VsZCByZS1maXJlIHRoZSBzaXRlJ3MKICAvLyAgICAgaW5saW5lIGV2ZW50IGhhbmRsZXJzIG9uIG91ciBjbG9uZSksIGFuZAogIC8vICAgLSB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgaXRzZWxmIChjb3VsZCBjYXJyeSBhIGB1cmwoLi4uKWAgdG9rZW4KICAvLyAgICAgdGhhdCB0cmlnZ2VycyBhIG5ldHdvcmsgZmV0Y2ggd2hlbiB0aGUgY2xvbmUgaXMgcGFyZW50ZWQpLCBhbmQKICAvLyAgIC0gdGhlIGBpZGAgYXR0cmlidXRlIChjbG9uaW5nIHByb2R1Y2VzIGEgZHVwbGljYXRlLCB3aGljaCB3b3VsZAogIC8vICAgICBicmVhayB0aGUgc2l0ZSdzIG93biBnZXRFbGVtZW50QnlJZCAvIENTUyAjaWQgc2VsZWN0b3JzKS4KICAvLyBXZSByZWx5IG9uIHRoZSBjbG9uZWQgZWxlbWVudCdzIGNsYXNzIGxpc3QgZm9yIHNpemluZy9zcGFjaW5nLAogIC8vIHdoaWNoIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHZpYSB0aGUgc2l0ZSdzIGV4dGVybmFsIHN0eWxlc2hlZXQuCiAgZnVuY3Rpb24gc3RyaXBJbmxpbmVIYW5kbGVycyhlbCkgewogICAgY29uc3QgYXR0cnMgPSBlbC5hdHRyaWJ1dGVzOwogICAgZm9yIChsZXQgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBhdHRyc1tpXS5uYW1lOwogICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJvbiIpIHx8IG5hbWUgPT09ICJzdHlsZSIgfHwgbmFtZSA9PT0gImlkIikgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogIH0KCiAgY29uc3QgUElQX1NWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgZnVuY3Rpb24gbWFrZVBpcFN2ZyhzaXplKSB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoUElQX1NWR19OUywgInN2ZyIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgidmlld0JveCIsICIwIDAgMjQgMjQiKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgc2l6ZSk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBzaXplKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgImN1cnJlbnRDb2xvciIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjIiKTsKICAgIGNvbnN0IHIxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMS5zZXRBdHRyaWJ1dGUoIngiLCAiMyIpOyByMS5zZXRBdHRyaWJ1dGUoInkiLCAiNSIpOwogICAgcjEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsICIxOCIpOyByMS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsICIxNCIpOyByMS5zZXRBdHRyaWJ1dGUoInJ4IiwgIjIiKTsKICAgIGNvbnN0IHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIngiLCAiMTIiKTsgcjIuc2V0QXR0cmlidXRlKCJ5IiwgIjExIik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgIjciKTsgcjIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCAiNiIpOyByMi5zZXRBdHRyaWJ1dGUoInJ4IiwgIjEiKTsKICAgIHIyLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJjdXJyZW50Q29sb3IiKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChyMSk7IHN2Zy5hcHBlbmRDaGlsZChyMik7CiAgICByZXR1cm4gc3ZnOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGlQIHRvZ2dsZSBlbnRyeSBwb2ludAogIC8vCiAgLy8gU2luZ2xlIGFzeW5jIGZ1bmN0aW9uIHNoYXJlZCBieSBldmVyeSBjbGljayBoYW5kbGVyLiBXYWxrcyB0aGUKICAvLyBhdmFpbGFibGUgQVBJcyBpbiBwcmlvcml0eSBvcmRlciBhbmQgaXMgcm9idXN0IHRvIGEgY2xpY2sgdGhhdCBsYW5kcwogIC8vIGJlZm9yZSB0aGUgdmlkZW8gaGFzIGxvYWRlZCBlbm91Z2ggbWV0YWRhdGEgKHdhaXRzIHVwIHRvIDMgcykuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlUGlwKHZpZGVvKSB7CiAgICB0cnkgewogICAgICAvLyBpT1MgU2FmYXJpIHBhdGgg4oCUIHdlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUgdG9nZ2xlcyBiZXR3ZWVuCiAgICAgIC8vICJpbmxpbmUiLCAicGljdHVyZS1pbi1waWN0dXJlIiBhbmQgImZ1bGxzY3JlZW4iLgogICAgICBpZiAoIUhBU19TVEFOREFSRF9QSVAgJiYgSEFTX1dFQktJVF9QSVAgJiYKICAgICAgICAgIHR5cGVvZiB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdmlkZW8ud2Via2l0UHJlc2VudGF0aW9uTW9kZSA9PT0gInBpY3R1cmUtaW4tcGljdHVyZSIKICAgICAgICAgID8gImlubGluZSIgOiAicGljdHVyZS1pbi1waWN0dXJlIjsKICAgICAgICB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlKHRhcmdldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIFN0YW5kYXJkIEFQSSBwYXRoLgogICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQgPT09IHZpZGVvKSB7CiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZXhpdFBpY3R1cmVJblBpY3R1cmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCAxKSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7IHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSk7IHJlc29sdmUoKTsgfTsKICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgc2V0VGltZW91dChkb25lLCBDT05GSUcuTUVUQURBVEFfV0FJVF9NUyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB2aWRlby5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGF3YWl0IHZpZGVvLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIExhc3QtcmVzb3J0IGlPUyBmYWxsYmFjayBldmVuIGlmIEhBU19TVEFOREFSRF9QSVAgd2FzIGNsYWltZWQuCiAgICAgIGlmICh0eXBlb2YgdmlkZW8ud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUoInBpY3R1cmUtaW4tcGljdHVyZSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB3YXJuKCJQaVAgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTsKICAgIH0gY2F0Y2ggKGVycikgeyB3YXJuKCJQaVAgcmVxdWVzdCBmYWlsZWQ6IiwgZXJyLm1lc3NhZ2UgfHwgZXJyKTsgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gU2l0ZS1zcGVjaWZpYyBuYXRpdmUgaW5qZWN0b3JzCiAgLy8KICAvLyBFYWNoIGluamVjdG9yIGlzIGlkZW1wb3RlbnQgKHNhZmUgdG8gcmUtcnVuIHdoZW4gdGhlIHNpdGUncyBSZWFjdAogIC8vIHJvb3QgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIpIGFuZCByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAvIGZhbHNlCiAgLy8gd2hlbiB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpc24ndCBpbiB0aGUgRE9NIHlldC4gVGhleSdyZSBkcml2ZW4gYnkKICAvLyBhIHBlcnNpc3RlbnQgTXV0YXRpb25PYnNlcnZlciBpbiBgdHJ5TmF0aXZlKClgIHNvIHJlLXJlbmRlcnMgZG9uJ3QKICAvLyBwZXJtYW5lbnRseSBsb3NlIHRoZSBidXR0b24uCiAgLy8KICAvLyBTdHJhdGVneSBhY3Jvc3Mgc2l0ZXM6CiAgLy8gICAtIFlvdVR1YmU6IGluc2VydCBhIDxidXR0b24gY2xhc3M9Inl0cC1idXR0b24iPiBhbG9uZ3NpZGUgdGhlCiAgLy8gICAgIGV4aXN0aW5nIHNldHRpbmdzL21pbmlwbGF5ZXIvc2l6ZSBpY29ucy4gSW5oZXJpdHMgWW91VHViZSdzCiAgLy8gICAgIGF1dG8tZmFkZSAvIGhvdmVyIGJlaGF2aW91ciBmb3IgZnJlZS4KICAvLyAgIC0gVHdpdGNoOiBjbG9uZSB0aGUgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgcmlnaHQtc2lkZSBjb250cm9sCiAgLy8gICAgIGJ1dHRvbiAoc2V0dGluZ3MvZnVsbHNjcmVlbi90aGVhdHJlKSBhbmQgcGxhY2Ugb3VyIGJ1dHRvbiBpbnNpZGUsCiAgLy8gICAgIHNvIHdlIGluaGVyaXQgVHdpdGNoJ3MgZmxleCBzcGFjaW5nIGNsYXNzZXMuCiAgLy8gICAtIE5ldGZsaXg6IGNsb25lIHRoZSAubWVkaXVtIGljb24gd3JhcHBlciAqYW5kKiB0aGUgM3JlbSBzcGFjZXIKICAvLyAgICAgdGhhdCBzaXRzIGJldHdlZW4gc2libGluZ3MsIHNvIHRoZSByaHl0aG0gb2YgdGhlIGljb24gcm93IGlzCiAgLy8gICAgIHByZXNlcnZlZCBhbmQgZnVsbHNjcmVlbiBzdGF5cyBpbiBpdHMgcm93LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGFkZFlvdVR1YmVCdXR0b24odmlkZW8pIHsKICAgIGlmIChfc2l0ZURpc2FibGVkKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCByaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi55dHAtcmlnaHQtY29udHJvbHMiKTsKICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTsKICAgIGlmIChyaWdodC5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgYnRuLmNsYXNzTmFtZSA9ICJ5dHAtYnV0dG9uIGJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjp0b3A7Y29sb3I6I2ZmZjsiOwogICAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDM2KTsKICAgICAgc3ZnLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTpibG9jazsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwoKICAgICAgY29uc3QgYW5jaG9yID0gcmlnaHQucXVlcnlTZWxlY3RvcigiLnl0cC1taW5pcGxheWVyLWJ1dHRvbiwgLnl0cC1zZXR0aW5ncy1idXR0b24sIC55dHAtc2l6ZS1idXR0b24iKTsKICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IucGFyZW50Tm9kZSkgewogICAgICAgIGFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShidG4sIGFuY2hvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmlnaHQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgfQogICAgICBsb2coImluamVjdGVkIG9uIFlvdVR1YmUiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgd2FybigiWW91VHViZSBpbmplY3QgZmFpbGVkOiIsIGVyci5tZXNzYWdlIHx8IGVycik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIFR3aXRjaDogY2xvbmUgdGhlIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHJpZ2h0LXNpZGUgY29udHJvbCBidXR0b24KICAvLyAoc2V0dGluZ3Mgb3IgZnVsbHNjcmVlbikgYW5kIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUgaXQsIHRoZW4gaW5zZXJ0IGF0CiAgLy8gdGhlIHNhbWUgRE9NIGxldmVsIHNvIHNwYWNpbmcvc2l6aW5nIG1hdGNoLgogIGxldCB0d2l0Y2hJbmplY3RDb3VudCA9IDA7CiAgZnVuY3Rpb24gYWRkVHdpdGNoQnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgLy8gQW5jaG9yIG9uIHRoZSBmdWxsc2NyZWVuIC8gdGhlYXRyZSByb3cgc28gd2UgbGFuZCBhbG9uZ3NpZGUgY2FzdCwKICAgIC8vIHRoZWF0cmUgYW5kIGZ1bGxzY3JlZW4g4oCUIHNldHRpbmdzIG9mdGVuIGxpdmVzIGluIGEgc2VwYXJhdGUgcm93IGluCiAgICAvLyB0aGUgcG9wb3V0IHBsYXllciBsYXlvdXQuCiAgICBjb25zdCBQRUVSX1NFTCA9CiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWZ1bGxzY3JlZW4tYnV0dG9uIl0sJyArCiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLXRoZWF0cmUtbW9kZS1idXR0b24iXSwnICsKICAgICAgJ1tkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItc2V0dGluZ3MtYnV0dG9uIl0nOwogICAgY29uc3QgYW5jaG9yQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihQRUVSX1NFTCk7CiAgICBpZiAoIWFuY2hvckJ0bikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFdhbGsgdXAgdG8gdGhlIHJvdyBjb250YWluZXIuIFR3byBzdG9wIHNpZ25hbHMsIGluIHByaW9yaXR5IG9yZGVyOgogICAgLy8gICAxLiBTdHJvbmc6IGEgcGFyZW50IHRoYXQgaGFzIG11bHRpcGxlIGNoaWxkcmVuIEFORCBjb250YWlucyBhCiAgICAvLyAgICAgIHBlZXIgY29udHJvbCBvdXRzaWRlIG91ciBjdXJyZW50IHN1YnRyZWUg4oCUIHRoYXQncyBhbG1vc3QKICAgIC8vICAgICAgY2VydGFpbmx5IHRoZSBhY3R1YWwgY29udHJvbCByb3cuCiAgICAvLyAgIDIuIFdlYWsgKGZhbGxiYWNrKTogdGhlIGZpcnN0IHBhcmVudCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuIHdlCiAgICAvLyAgICAgIHBhc3NlZCBkdXJpbmcgdGhlIHdhbGsuIFVzZWQgd2hlbiB0aGUgc3Ryb25nIHNpZ25hbCBuZXZlcgogICAgLy8gICAgICBmaXJlcywgc28gbGF5b3V0cyB0aGF0IGRvbid0IGV4cG9zZSBwZWVyIGNvbnRyb2xzIGF0IHRoZQogICAgLy8gICAgICBzYW1lIGxldmVsIHN0aWxsIHdvcmsuCiAgICAvLyBDb21iaW5lZCwgdGhpcyBhZGRyZXNzZXMgdGhlIHJldmlldyBjb25jZXJuIGFib3V0IG5vbi1jb250cm9sCiAgICAvLyBzaWJsaW5ncyBoaWphY2tpbmcgdGhlIHN0cnVjdHVyYWwgd2FsayB3aGlsZSBrZWVwaW5nIHRoZSBvcmlnaW5hbAogICAgLy8gYmVoYXZpb3VyIGFzIGEgc2FmZXR5IG5ldC4KICAgIGxldCBhbmNob3JXcmFwcGVyID0gYW5jaG9yQnRuOwogICAgbGV0IHN0cnVjdHVyYWxGYWxsYmFjayA9IG51bGw7CiAgICB3aGlsZSAoYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlICYmIGFuY2hvcldyYXBwZXIucGFyZW50Tm9kZS50YWdOYW1lICE9PSAiQk9EWSIpIHsKICAgICAgY29uc3QgcGFyZW50ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50LmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgICBjb25zdCBwZWVycyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFBFRVJfU0VMKTsKICAgICAgICBsZXQgaGFzT3V0c2lkZVBlZXIgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIWFuY2hvcldyYXBwZXIuY29udGFpbnMocGVlcnNbaV0pKSB7IGhhc091dHNpZGVQZWVyID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc091dHNpZGVQZWVyKSBicmVhazsKICAgICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgc3RydWN0dXJhbEZhbGxiYWNrID0gYW5jaG9yV3JhcHBlcjsKICAgICAgfQogICAgICBhbmNob3JXcmFwcGVyID0gcGFyZW50OwogICAgfQogICAgaWYgKCFhbmNob3JXcmFwcGVyLnBhcmVudE5vZGUgfHwgYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlLnRhZ05hbWUgPT09ICJCT0RZIikgewogICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgcmV0dXJuIGZhbHNlOwogICAgICBhbmNob3JXcmFwcGVyID0gc3RydWN0dXJhbEZhbGxiYWNrOwogICAgfQogICAgY29uc3Qgcm93ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKICAgIGlmIChyb3cucXVlcnlTZWxlY3RvcigiLmJyYXZlLXBpcC1idG4iKSkgcmV0dXJuIHRydWU7CiAgICAvLyBTYW5pdHkgY2hlY2s6IGEgaGVhbHRoeSBUd2l0Y2ggcmlnaHQtY29udHJvbHMgcm93IGNvbnRhaW5zIGF0CiAgICAvLyBsZWFzdCB0d28gb2YgdGhlIHBlZXIgYnV0dG9ucyAoc2V0dGluZ3MgKyB0aGVhdHJlICsgZnVsbHNjcmVlbikuCiAgICAvLyBJZiBvbmx5IG9uZSBpcyBwcmVzZW50LCB0aGUgd2FsayBsYW5kZWQgb24gYSBkZWdlbmVyYXRlIHJvdwogICAgLy8gKHBvcG91dCAvIGRldGFjaGVkIHBsYXllciAvIGZ1dHVyZSByZWRlc2lnbikgYW5kIHdlIHNob3VsZCBiYWlsCiAgICAvLyByYXRoZXIgdGhhbiBtaXMtdGFyZ2V0LiBDaGVhcCDigJQgb25lIHF1ZXJ5U2VsZWN0b3JBbGwsIG5vIHdhbGtpbmcuCiAgICBpZiAocm93LnF1ZXJ5U2VsZWN0b3JBbGwoUEVFUl9TRUwpLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTsKCiAgICB0cnkgewogICAgICAvLyBDbG9uZSB0aGUgYW5jaG9yJ3Mgb3V0ZXIgd3JhcHBlciAoc2hhbGxvdykgc28gd2UgaW5oZXJpdCBUd2l0Y2gncwogICAgICAvLyBzcGFjaW5nL2ZsZXggY2xhc3NlcywgdGhlbiBkcm9wIG91ciBvd24gYnV0dG9uIGluc2lkZS4KICAgICAgY29uc3Qgd3JhcHBlciA9IGFuY2hvcldyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hLXRhcmdldCIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpOwogICAgICBzdHJpcElubGluZUhhbmRsZXJzKHdyYXBwZXIpOwoKICAgICAgLy8gU2l6ZSBmcm9tIHRoZSByZW5kZXJlZCBTVkcgZ2x5cGggKHZpc3VhbGx5IGFjY3VyYXRlKS4gRmxvb3IgYXQgMjQKICAgICAgLy8gYmVjYXVzZSBUd2l0Y2gncyB1bmRlcmx5aW5nIFNWRyBlbGVtZW50IGlzIHNvbWV0aW1lcyBzbWFsbGVyIHRoYW4KICAgICAgLy8gdGhlIHZpc3VhbCBpY29uIChDU1Mgc2NhbGVzIGl0IHVwKS4KICAgICAgY29uc3QgcmVmU3ZnID0gYW5jaG9yQnRuLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpOwogICAgICBjb25zdCByZWZTdmdSZWN0ID0gcmVmU3ZnID8gcmVmU3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDsKICAgICAgY29uc3QgcmVmQnRuUmVjdCA9IGFuY2hvckJ0bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgbWVhc3VyZWQgPSByZWZTdmdSZWN0ICYmIHJlZlN2Z1JlY3Qud2lkdGggPiAwCiAgICAgICAgPyBNYXRoLm1pbihyZWZTdmdSZWN0LndpZHRoLCByZWZTdmdSZWN0LmhlaWdodCkKICAgICAgICA6IE1hdGgubWluKHJlZkJ0blJlY3Qud2lkdGgsIHJlZkJ0blJlY3QuaGVpZ2h0KSAqIDAuNzsKICAgICAgY29uc3QgaWNvblNpemUgPSBNYXRoLm1heCgyNCwgTWF0aC5yb3VuZChtZWFzdXJlZCkpOwogICAgICBjb25zdCBib3hTaXplID0gTWF0aC5tYXgoMzAsIE1hdGgucm91bmQocmVmQnRuUmVjdC53aWR0aCB8fCAzMCkpOwoKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgIGJ0bi5jbGFzc05hbWUgPSAiYnJhdmUtcGlwLWJ0biI7CiAgICAgIGJ0bi50eXBlID0gImJ1dHRvbiI7CiAgICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgICBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlBpY3R1cmUtaW4tUGljdHVyZSIpOwogICAgICBidG4uc3R5bGUuY3NzVGV4dCA9CiAgICAgICAgImJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7cGFkZGluZzowO21hcmdpbjowOyIgKwogICAgICAgICJjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyIgKwogICAgICAgICJ3aWR0aDoiICsgYm94U2l6ZSArICJweDtoZWlnaHQ6IiArIGJveFNpemUgKyAicHg7IjsKICAgICAgY29uc3Qgc3ZnID0gbWFrZVBpcFN2ZyhpY29uU2l6ZSk7CiAgICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7Y29sb3I6I2ZmZjsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwogICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGJ0bik7CgogICAgICByb3cuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIGFuY2hvcldyYXBwZXIpOwoKICAgICAgdHdpdGNoSW5qZWN0Q291bnQrKzsKICAgICAgaWYgKHR3aXRjaEluamVjdENvdW50ID09PSAxKSBsb2coImluamVjdGVkIG9uIFR3aXRjaCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICB3YXJuKCJUd2l0Y2ggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyBOZXRmbGl4OiBpbnNlcnQgaW50byB0aGUgc3RhbmRhcmQgY29udHJvbHMgYmFyLCBiZWZvcmUgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uLgogIC8vIE5ldGZsaXggcmFuZG9taXplcyBjbGFzcyBuYW1lcyBidXQgaWNvbnMgZm9sbG93IGEgY29uc2lzdGVudCBwYXR0ZXJuOgogIC8vICAgPGZsZXgtcm93PgogIC8vICAgICA8c3BhY2VyIC4xbnBxeXdyPiAuLi4gPHdyYXBwZXIgLm1lZGl1bT4gPGljb24tYnV0dG9uPiA8L3dyYXBwZXI+CiAgLy8gICAgIDxzcGFjZXIgLjFucHF5d3I+ICAgICA8d3JhcHBlciAubWVkaXVtPiA8aWNvbi1idXR0b24+IDwvd3JhcHBlcj4KICAvLyAgICAgPHNwYWNlciAuMW5wcXl3cj4gICAgIDx3cmFwcGVyIC5tZWRpdW0+IDxpY29uLWJ1dHRvbiBkYXRhLXVpYT0iY29udHJvbC1mdWxsc2NyZWVuLS4uLiI+IDwvd3JhcHBlcj4KICAvLyBXZSBjbG9uZSB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyIChhbmQgdGhlIHNwYWNlciBpbiBmcm9udCBvZiBpdCkgc28gb3VyCiAgLy8gYnV0dG9uIGdldHMgdGhlIHNhbWUgc3R5bGluZyBhbmQgcmh5dGhtIGFzIG5hdGl2ZSBpY29ucy4KICBsZXQgbmZseEluamVjdENvdW50ID0gMDsKICBmdW5jdGlvbiBhZGROZXRmbGl4QnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJyk7CiAgICBpZiAoIWJhcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGJhci5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBmcyA9IGJhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1lbnRlciJdLCBbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1leGl0Il0nKTsKICAgICAgaWYgKCFmcykgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRmluZCBOZXRmbGl4J3MgaWNvbiB3cmFwcGVyIGFyb3VuZCBmdWxsc2NyZWVuIOKAlCB0aGUgLm1lZGl1bSBjbGFzcwogICAgICAvLyBpcyB0aGUgc3RhYmxlIHNpZ25hbDsgZmFsbCBiYWNrIHRvIHRoZSBjbG9zZXN0IGRpdi4KICAgICAgY29uc3QgZnNXcmFwcGVyID0gZnMuY2xvc2VzdCgiLm1lZGl1bSIpIHx8IGZzLmNsb3Nlc3QoImRpdiIpIHx8IGZzOwogICAgICBjb25zdCByb3cgPSBmc1dyYXBwZXIucGFyZW50Tm9kZTsKICAgICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFNpemUgZnJvbSB0aGUgaW5uZXIgc3ZnIG9mIGZ1bGxzY3JlZW4ncyBidXR0b24gc28gd2UgdmlzdWFsbHkgbWF0Y2guCiAgICAgIGNvbnN0IHJlZlN2ZyA9IGZzLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpIHx8IChmcy5jbG9zZXN0KCJidXR0b24iKSB8fCBmcykucXVlcnlTZWxlY3Rvcigic3ZnIik7CiAgICAgIGNvbnN0IHJlZlN2Z1JlY3QgPSByZWZTdmcgPyByZWZTdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsOwogICAgICBjb25zdCBpY29uU2l6ZSA9IHJlZlN2Z1JlY3QgJiYgcmVmU3ZnUmVjdC53aWR0aCA+IDAKICAgICAgICA/IE1hdGgucm91bmQoTWF0aC5taW4ocmVmU3ZnUmVjdC53aWR0aCwgcmVmU3ZnUmVjdC5oZWlnaHQpKQogICAgICAgIDogMjg7CgogICAgICAvLyBDbG9uZSB0aGUgd3JhcHBlciAoc2hhbGxvdyDigJQgcHJlc2VydmVzIGNsYXNzZXMvaW5saW5lIHN0eWxlcykgYW5kCiAgICAgIC8vIGVtcHR5IGl0LCB0aGVuIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUuCiAgICAgIGNvbnN0IHdyYXBwZXIgPSBmc1dyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS11aWEiKTsKICAgICAgc3RyaXBJbmxpbmVIYW5kbGVycyh3cmFwcGVyKTsKCiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidG4uY2xhc3NOYW1lID0gImJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPQogICAgICAgICJiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO3BhZGRpbmc6MDttYXJnaW46MDsiICsKICAgICAgICAid2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyI7CiAgICAgIGNvbnN0IHN2ZyA9IG1ha2VQaXBTdmcoaWNvblNpemUpOwogICAgICBzdmcuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OmJsb2NrOyI7CiAgICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZVBpcCh2aWRlbyk7IH0pOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBfb25OYXRpdmVCdG5Db250ZXh0TWVudSk7CiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYnRuKTsKCiAgICAgIC8vIENsb25lIHRoZSBzcGFjZXIgdGhhdCBwcmVjZWRlcyB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyLCBzbyBzcGFjaW5nCiAgICAgIC8vIGJldHdlZW4gb3VyIGJ1dHRvbiBhbmQgZnVsbHNjcmVlbiBtYXRjaGVzIHRoZSByaHl0aG0gYmV0d2VlbgogICAgICAvLyBleGlzdGluZyBpY29ucy4KICAgICAgY29uc3QgcHJldlNwYWNlciA9IGZzV3JhcHBlci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwogICAgICBjb25zdCBzcGFjZXJDbG9uZSA9IChwcmV2U3BhY2VyICYmIHByZXZTcGFjZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKQogICAgICAgID8gcHJldlNwYWNlci5jbG9uZU5vZGUoZmFsc2UpCiAgICAgICAgOiBudWxsOwoKICAgICAgcm93Lmluc2VydEJlZm9yZSh3cmFwcGVyLCBmc1dyYXBwZXIpOwogICAgICBpZiAoc3BhY2VyQ2xvbmUpIHJvdy5pbnNlcnRCZWZvcmUoc3BhY2VyQ2xvbmUsIGZzV3JhcHBlcik7CgogICAgICBuZmx4SW5qZWN0Q291bnQrKzsKICAgICAgaWYgKG5mbHhJbmplY3RDb3VudCA9PT0gMSkgbG9nKCJpbmplY3RlZCBvbiBOZXRmbGl4Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHdhcm4oIk5ldGZsaXggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBHZW5lcmljIEZpcmVmb3gtc3R5bGUgb3ZlcmxheQogIC8vCiAgLy8gVXNlZCBvbiBldmVyeSBzaXRlIGJ5IGRlZmF1bHQgKHVubGVzcyBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAgaXMKICAvLyBleHBsaWNpdGx5IHNldCB0byAiMCIpLiBNaW1pY3MgRmlyZWZveCdzICJQb3Agb3V0IHRoaXMgdmlkZW8iIHRvZ2dsZToKICAvLyBhIGRhcmsgcGlsbCBhbmNob3JlZCBtaWQtcmlnaHQgb2YgdGhlIHZpZGVvIHRoYXQgZmFkZXMgaW4gb24gaG92ZXIKICAvLyBhbmQgZmFkZXMgb3V0IGFmdGVyIHRoZSBjdXJzb3IgbGVhdmVzLiBBZnRlciB0aGUgdXNlciBjbGlja3Mgb25jZSBpdAogIC8vIHNocmlua3MgdG8gaWNvbi1vbmx5IGZvciB0aGUgcmVzdCBvZiB0aGUgc2Vzc2lvbiDigJQgbGVzcyB2aXN1YWwgbm9pc2UKICAvLyBvbiBzdWJzZXF1ZW50IGhvdmVycy4KICAvLwogIC8vIEhvdmVyIGRldGVjdGlvbiBydW5zIHRocm91Z2ggdGhlIHNoYXJlZCBgX29uRG9jTW91c2VNb3ZlYCBoYW5kbGVyCiAgLy8gKHNlZSB0b3Agb2YgZmlsZSkgaW5zdGVhZCBvZiBgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIpYCwKICAvLyBiZWNhdXNlIG1hbnkgcGxheWVycyAoTmV0ZmxpeCwgY3VzdG9tKSBsYXllciB0aGVpciBVSSBvbiB0b3Agb2YgdGhlCiAgLy8gPHZpZGVvPiBhbmQgYWJzb3JiIG1vdXNlIGV2ZW50cyBiZWZvcmUgdGhleSByZWFjaCBpdC4gQSBnbG9iYWwKICAvLyBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIGJ5cGFzc2VzIHRoYXQuCiAgLy8KICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSBwaWxsIGlzIHRhcC10by1yZXZlYWwgKDMgcyBhdXRvLWZhZGUpIGluc3RlYWQuCiAgLy8KICAvLyBgdGVhcmRvd25zYCBpcyBhbiBhcnJheSB0aGUgY2FsbGVyIChgYXR0YWNoVG9WaWRlb2ApIGhhbmRzIGluOyB3ZQogIC8vIHB1c2ggY2xlYW51cCBjbG9zdXJlcyBvbnRvIGl0IHNvIGEgbGF0ZXIgY2xlYW51cCBvZiB0aGlzIHZpZGVvCiAgLy8gcmVsZWFzZXMgZXZlcnkgbGlzdGVuZXIgLyBvYnNlcnZlciAvIERPTSBub2RlIHdlIGNyZWF0ZWQgaGVyZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIFJlYWNoaW5nIGhlcmUgbWVhbnMgYGF0dGFjaFRvVmlkZW9gJ3MgYHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKWAKICAgIC8vIGd1YXJkIGFscmVhZHkgc2hvcnQtY2lyY3VpdGVkIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zLCBzbyBubwogICAgLy8gc2VwYXJhdGUgZGF0YXNldCBtYXJrZXIgaXMgbmVlZGVkLgogICAgLy8gUGVyLW9yaWdpbiBvcHQtb3V0OiBza2lwIGJ1aWxkaW5nIGFueXRoaW5nIGlmIHRoZSB1c2VyIHByZXZpb3VzbHkKICAgIC8vIGRpc2FibGVkIHRoZSBwaWxsIG9uIHRoaXMgc2l0ZSB2aWEgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuCiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuOwogICAgY29uc3QgUEFERElOR19GVUxMID0gIjhweCAxNHB4IDhweCAxMHB4IjsKICAgIGNvbnN0IFBBRERJTkdfSUNPTiA9ICI4cHgiOwoKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgYnRuLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0KICAgICAgInBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDsiICsKICAgICAgInBhZGRpbmc6IiArIFBBRERJTkdfRlVMTCArICI7IiArCiAgICAgICJib3JkZXI6MDtib3JkZXItcmFkaXVzOjhweDsiICsKICAgICAgImJhY2tncm91bmQ6cmdiYSgyOCwyOCwzMCwwLjkyKTtjb2xvcjojZmZmOyIgKwogICAgICAiZm9udDo2MDAgMTNweC8xIHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxzYW5zLXNlcmlmOyIgKwogICAgICAiY3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiYm94LXNoYWRvdzowIDJweCA4cHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAib3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAwLjE1cyBlYXNlOyIgKwogICAgICAicG9pbnRlci1ldmVudHM6YXV0bzt1c2VyLXNlbGVjdDpub25lOyI7CiAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDE4KTsKICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7IjsKICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICJQb3Agb3V0IHRoaXMgdmlkZW8iOwogICAgYnRuLmFwcGVuZENoaWxkKGxhYmVsKTsKCiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCAoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNob3dEaXNhYmxlTWVudShlLmNsaWVudFgsIGUuY2xpZW50WSk7CiAgICB9KTsKCiAgICBsZXQgY2xpY2tlZCA9IGZhbHNlOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBpZiAoIWNsaWNrZWQpIHsKICAgICAgICBjbGlja2VkID0gdHJ1ZTsKICAgICAgICAvLyBTdXBwcmVzcyBmYWRlIHNvIHRoZSBpY29uLW9ubHkgcGlsbCBpcyBpbiBpdHMgZmluYWwgcG9zaXRpb24KICAgICAgICAvLyBiZWZvcmUgdGhlIHVzZXIgbm90aWNlcyB0aGUgY2hhbmdlLgogICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gYnRuLnN0eWxlLnRyYW5zaXRpb247CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSAibm9uZSI7CiAgICAgICAgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9IFBBRERJTkdfSUNPTjsKICAgICAgICBidG4uc3R5bGUuZ2FwID0gIjAiOwogICAgICAgIHVwZGF0ZSgpOyAvLyBzeW5jaHJvbm91cyByZXBvc2l0aW9uIGZvciB0aGUgbmV3IChzbWFsbGVyKSBib3gKICAgICAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyB0aGUgbmV4dCBzdHlsZSBjaGFuZ2UgaXMgY29tbWl0dGVkIHdpdGhvdXQKICAgICAgICAvLyBhIHRyYW5zaXRpb24sIHRoZW4gcmVzdG9yZSB0aGUgZmFkZSB0cmFuc2l0aW9uLgogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMKICAgICAgICBidG4ub2Zmc2V0V2lkdGg7CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsKICAgICAgfQogICAgICB0b2dnbGVQaXAodmlkZW8pOwogICAgfSk7CiAgICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGJ0bik7CgogICAgbGV0IGhvdmVyID0gZmFsc2U7CiAgICBsZXQgaG92ZXJUaW1lciA9IG51bGw7CiAgICBsZXQgbGFzdFJlY3QgPSBudWxsOwogICAgbGV0IHRvdWNoSGlkZVRpbWVyID0gbnVsbDsKICAgIGZ1bmN0aW9uIHNldEhvdmVyKHYpIHsKICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICBpZiAodikgeyBob3ZlciA9IHRydWU7IHVwZGF0ZSgpOyB9CiAgICAgIGVsc2UgICB7IGhvdmVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgaG92ZXIgPSBmYWxzZTsgdXBkYXRlKCk7IH0sIENPTkZJRy5IT1ZFUl9HUkFDRV9NUyk7IH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0OwogICAgICBpZiAoIXIpIHJldHVybjsKICAgICAgY29uc3Qgb3ZlclZpZGVvID0KICAgICAgICB4ID49IHIubGVmdCAmJiB4IDw9IHIucmlnaHQgJiYKICAgICAgICB5ID49IHIudG9wICAmJiB5IDw9IHIuYm90dG9tOwogICAgICBsZXQgb3ZlckJ0biA9IGZhbHNlOwogICAgICBpZiAoYnRuLnN0eWxlLmRpc3BsYXkgIT09ICJub25lIikgewogICAgICAgIGNvbnN0IGJSZWN0ID0gYnRuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIG92ZXJCdG4gPQogICAgICAgICAgeCA+PSBiUmVjdC5sZWZ0ICYmIHggPD0gYlJlY3QucmlnaHQgJiYKICAgICAgICAgIHkgPj0gYlJlY3QudG9wICAmJiB5IDw9IGJSZWN0LmJvdHRvbTsKICAgICAgfQogICAgICBpZiAob3ZlclZpZGVvIHx8IG92ZXJCdG4pIHsgaWYgKCFob3Zlcikgc2V0SG92ZXIodHJ1ZSk7IH0KICAgICAgZWxzZSBpZiAoaG92ZXIpIHNldEhvdmVyKGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0IHx8IHZpZGVvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBsYXN0UmVjdCA9IHI7CiAgICAgIGNvbnN0IG92ZXJWaWRlbyA9CiAgICAgICAgeCA+PSByLmxlZnQgJiYgeCA8PSByLnJpZ2h0ICYmCiAgICAgICAgeSA+PSByLnRvcCAgJiYgeSA8PSByLmJvdHRvbTsKICAgICAgaWYgKCFvdmVyVmlkZW8pIHJldHVybjsKICAgICAgc2V0SG92ZXIodHJ1ZSk7CiAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgY2xlYXJUaW1lb3V0KHRvdWNoSGlkZVRpbWVyKTsKICAgICAgdG91Y2hIaWRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0b3VjaEhpZGVUaW1lciA9IG51bGw7CiAgICAgICAgc2V0SG92ZXIoZmFsc2UpOwogICAgICB9LCBDT05GSUcuVE9VQ0hfUkVWRUFMX01TKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgIC8vIE1hdGNoIEZpcmVmb3g6IHNob3cgb24gaG92ZXIgcmVnYXJkbGVzcyBvZiBwYXVzZWQgc3RhdGUuIE9ubHkKICAgICAgLy8gcmVxdWlyZSB0aGF0IHRoZSB2aWRlbyBoYXMgbWV0YWRhdGEgbG9hZGVkIChzbyBQaVAgaXMgdXNhYmxlKSwKICAgICAgLy8gaXMgdmlzaWJsZSwgYW5kIHdlJ3JlIG5vdCBpbiBmdWxsc2NyZWVuIChpbmNsLiBpT1Mgd2Via2l0IEZTKS4KICAgICAgLy8gQWxzbyBob25vdXIgYSBtaWQtc2Vzc2lvbiBkaXNhYmxlIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUKICAgICAgLy8gKGNhY2hlZCBgX3NpdGVEaXNhYmxlZGAgZmxhZyDigJQgbm8gbG9jYWxTdG9yYWdlIGhpdCBwZXIgdGljaykuCiAgICAgIGlmIChfc2l0ZURpc2FibGVkKSB7CiAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlYWR5ID0gdmlkZW8ucmVhZHlTdGF0ZSA+PSAxOwogICAgICBjb25zdCBmcyA9IGlzRnVsbHNjcmVlbih2aWRlbyk7CiAgICAgIGNvbnN0IHIgPSB2aWRlby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbGFzdFJlY3QgPSByOwogICAgICBjb25zdCBvblNjcmVlbiA9IHIud2lkdGggPiAwICYmIHIuaGVpZ2h0ID4gMCAmJiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCBpbm5lckhlaWdodDsKICAgICAgLy8gWW91VHViZSBVUkwgZ2F0ZSArIFNQQS1uYXYtZ3JhY2UuIFJlZnJlc2ggdGhlIGNhY2hlZCBwcmV2aWV3LWFyZWEKICAgICAgLy8gZmxhZyBhbmQgc3RhbXAgYSBuYXZpZ2F0aW9uIHRpbWVzdGFtcCBvbiBwYXRoIGNoYW5nZSwgdGhlbgogICAgICAvLyBzdXBwcmVzcyBlbGlnaWJpbGl0eSB3aGlsZSB3ZSdyZSBlaXRoZXIgb24gYSBub24td2F0Y2ggVVJMIG9yCiAgICAgIC8vIGluc2lkZSB0aGUgcG9zdC1uYXYgZ3JhY2Ugd2luZG93IChhYnNvcmJzIHRoZSBicmllZiBmbGFzaCB3aGVuCiAgICAgIC8vIGEgaG9tZXBhZ2UgdGh1bWJuYWlsIGNsaWNrIGxhbmRzIHRoZSBjdXJzb3Igb24gdGhlIG5ldyBwbGF5ZXIpLgogICAgICBpZiAoX3l0SG9zdCAmJiBfeXRMYXN0UGF0aCAhPT0gbG9jYXRpb24ucGF0aG5hbWUpIHsKICAgICAgICBfeXRMYXN0UGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgIF95dFByZXZpZXdBcmVhID0gIV95dFdhdGNoUGF0aC50ZXN0KF95dExhc3RQYXRoKTsKICAgICAgICBfeXROYXZBdCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICAgIGNvbnN0IF9pbk5hdkdyYWNlID0gX3l0TmF2QXQgJiYgKHBlcmZvcm1hbmNlLm5vdygpIC0gX3l0TmF2QXQpIDwgQ09ORklHLllUX05BVl9HUkFDRV9NUzsKICAgICAgY29uc3QgZWxpZ2libGUgPSByZWFkeSAmJiAhZnMgJiYgb25TY3JlZW4gJiYgIV95dFByZXZpZXdBcmVhICYmICFfaW5OYXZHcmFjZTsKICAgICAgaWYgKCFlbGlnaWJsZSkgewogICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gIm5vbmUiOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtZmxleCI7CiAgICAgIGNvbnN0IHcgPSBidG4ub2Zmc2V0V2lkdGggfHwgMTcwOwogICAgICBjb25zdCBoID0gYnRuLm9mZnNldEhlaWdodCB8fCAzNjsKCiAgICAgIC8vIENvbXB1dGUgbWlkLXJpZ2h0IG9mIHRoZSAqdmlzaWJsZSogcG9ydGlvbiBvZiB0aGUgdmlkZW8gKHRoZQogICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgaXRzIHJlY3Qgd2l0aCB0aGUgdmlld3BvcnQpLiBOZXRmbGl4J3MgPHZpZGVvPgogICAgICAvLyBjYW4gYmUgbXVjaCB0YWxsZXIgdGhhbiB0aGUgdmlld3BvcnQuCiAgICAgIGNvbnN0IHZpc1RvcCA9IE1hdGgubWF4KHIudG9wLCAwKTsKICAgICAgY29uc3QgdmlzQm90dG9tID0gTWF0aC5taW4oci5ib3R0b20sIGlubmVySGVpZ2h0KTsKICAgICAgY29uc3QgdmlzUmlnaHQgPSBNYXRoLm1pbihyLnJpZ2h0LCBpbm5lcldpZHRoKTsKICAgICAgbGV0IHRvcCA9IE1hdGgucm91bmQodmlzVG9wICsgKHZpc0JvdHRvbSAtIHZpc1RvcCAtIGgpIC8gMikgKyBDT05GSUcuUElMTF9PRkZTRVRfWTsKICAgICAgbGV0IGxlZnQgPSBNYXRoLnJvdW5kKHZpc1JpZ2h0IC0gdyAtIENPTkZJRy5QSUxMX1JJR0hUX01BUkdJTik7CiAgICAgIC8vIEZpbmFsIHZpZXdwb3J0IGNsYW1wLgogICAgICB0b3AgPSBNYXRoLm1heChDT05GSUcuVklFV1BPUlRfUEFELCBNYXRoLm1pbih0b3AsIGlubmVySGVpZ2h0IC0gaCAtIENPTkZJRy5WSUVXUE9SVF9QQUQpKTsKICAgICAgbGVmdCA9IE1hdGgubWF4KENPTkZJRy5WSUVXUE9SVF9QQUQsIE1hdGgubWluKGxlZnQsIGlubmVyV2lkdGggLSB3IC0gQ09ORklHLlZJRVdQT1JUX1BBRCkpOwoKICAgICAgYnRuLnN0eWxlLnRvcCA9IHRvcCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gaG92ZXIgPyAiMSIgOiAiMCI7CiAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gaG92ZXIgPyAiYXV0byIgOiAibm9uZSI7CiAgICB9CgogICAgY29uc3Qgb25CdG5FbnRlciA9ICgpID0+IHNldEhvdmVyKHRydWUpOwogICAgY29uc3Qgb25CdG5MZWF2ZSA9ICgpID0+IHNldEhvdmVyKGZhbHNlKTsKCiAgICAvLyBQZXItdmlkZW8gbGlzdGVuZXJzIHN0YXkgb24gdGhlIHZpZGVvIGVsZW1lbnQuIERvY3VtZW50L3dpbmRvdwogICAgLy8gbGlzdGVuZXJzIGFyZSBzaGFyZWQgdmlhIHRoZSBtb2R1bGUtbGV2ZWwgYG92ZXJsYXlzYCByZWdpc3RyeQogICAgLy8gKG9uZSBzZXQgb2YgZ2xvYmFscyByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHZpZGVvcyBhcmUgb24gdGhlIHBhZ2UpLgogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgb25CdG5MZWF2ZSk7CiAgICBjb25zdCBWSURFT19FVkVOVFMgPSBbInBsYXkiLCJwbGF5aW5nIiwicGF1c2UiLCJlbmRlZCIsImVtcHRpZWQiLCJsb2FkZWRkYXRhIl07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFZJREVPX0VWRU5UUy5sZW5ndGg7IGkrKykgewogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIH0KICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGJlZ2luZnVsbHNjcmVlbiIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICByby5vYnNlcnZlKHZpZGVvKTsKCiAgICBjb25zdCBpbnN0YW5jZSA9IHsgdXBkYXRlLCBoYW5kbGVQb2ludGVyLCBoYW5kbGVUb3VjaCB9OwogICAgb3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIHZpZGVvVG9PdmVybGF5LnNldCh2aWRlbywgaW5zdGFuY2UpOwogICAgY29uc3QgaW8gPSBnZXRJTygpOwogICAgaWYgKGlvKSB7CiAgICAgIGlvLm9ic2VydmUodmlkZW8pOwogICAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBmaXJlcyBhIGNhbGxiYWNrIHN5bmNocm9ub3VzbHkgYWZ0ZXIKICAgICAgLy8gb2JzZXJ2ZSgpIGluIGEgbWljcm90YXNrLiBVbnRpbCB0aGVuIGFzc3VtZSB0aGUgdmlkZW8gaXMKICAgICAgLy8gdmlzaWJsZSBzbyB0aGUgdmVyeSBmaXJzdCB1cGRhdGUoKSBydW5zLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIElPIHN1cHBvcnQg4oCUIGZhbGwgYmFjayB0byAiYWx3YXlzIHZpc2libGUiLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0KICAgIGFybUdsb2JhbHMoKTsKICAgIHVwZGF0ZSgpOwoKICAgIGlmICh0ZWFyZG93bnMpIHsKICAgICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICAgIG92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgaWYgKGludGVyc2VjdGlvbk9ic2VydmVyKSBpbnRlcnNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUodmlkZW8pOwogICAgICAgIHZpZGVvVG9PdmVybGF5LmRlbGV0ZSh2aWRlbyk7CiAgICAgICAgYnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgICAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIG9uQnRuTGVhdmUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVklERU9fRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB9CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2Via2l0YmVnaW5mdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICByby5kaXNjb25uZWN0KCk7CiAgICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgeyBjbGVhclRpbWVvdXQodG91Y2hIaWRlVGltZXIpOyB0b3VjaEhpZGVUaW1lciA9IG51bGw7IH0KICAgICAgICBidG4ucmVtb3ZlKCk7CiAgICAgICAgbWF5YmVEaXNhcm1HbG9iYWxzKCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29uZmlndXJhdGlvbiAmIGRpc3BhdGNoCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBlci1vcmlnaW4gYGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcGAgZmxhZy4KICAvLyBEZWZhdWx0IGlzIE9OOiBldmVyeSBzaXRlIHVzZXMgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIHVubGVzcyB0aGUKICAvLyB1c2VyIGhhcyBleHBsaWNpdGx5IG9wdGVkIGludG8gbmF0aXZlIGluamVjdGlvbiAoc2V0IHRoZSBmbGFnIHRvCiAgLy8gIjAiIC8gImZhbHNlIiAvICJubyIgLyAib2ZmIikuIFdyYXBwZWQgaW4gdHJ5L2NhdGNoIGJlY2F1c2UKICAvLyBsb2NhbFN0b3JhZ2UgYWNjZXNzIHRocm93cyBpbiBwcml2YXRlIC8gc2FuZGJveGVkIGNvbnRleHRzLgogIC8vCiAgLy8gRXhjZXB0aW9uOiB3d3cueW91dHViZS5jb20sIHd3dy50d2l0Y2gudHYgYW5kIHd3dy5uZXRmbGl4LmNvbQogIC8vIGRlZmF1bHQgdG8gT0ZGIChuYXRpdmUgaW5qZWN0aW9uKSBiZWNhdXNlIHRoZWlyIHBsYXllcnMgYWxyZWFkeQogIC8vIGhhdmUgZmlyc3QtY2xhc3MgY29udHJvbCBiYXJzIHdoZXJlIGEgbmF0aXZlIGJ1dHRvbiBsb29rcyBhdCBob21lLgogIC8vIE9ubHkgdGhlIGV4YWN0IGRlc2t0b3AgaG9zdG5hbWVzIGFyZSB0YXJnZXRlZCDigJQgbS4vbXVzaWMuL21vYmlsZQogIC8vIHN1YmRvbWFpbnMga2VlcCB0aGUgZ2VuZXJpYy1waWxsIGRlZmF1bHQuIFRoZSB1c2VyIGNhbiBmbGlwIHRoZQogIC8vIGZsYWcgZXhwbGljaXRseSBwZXIgb3JpZ2luIHRvIG92ZXJyaWRlLgogIC8vCiAgLy8gUmVhZCBsYXppbHkgb24gZmlyc3QgdXNlIChub3QgYXQgSUlGRSBpbml0KSBzbyB0aGF0IHVzZXJzY3JpcHQKICAvLyBtYW5hZ2VycyBvciBwb2x5ZmlsbCBzaGltcyB0aGF0IHJlcGxhY2UgYGxvY2FsU3RvcmFnZWAgc2xpZ2h0bHkKICAvLyBhZnRlciBvdXIgc2NyaXB0IGxvYWRzIHN0aWxsIHNlZSBhIGNvbnNpc3RlbnQgdmFsdWUuIEFmdGVyIHRoZQogIC8vIGZpcnN0IHJlYWQgaXQncyBjYWNoZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwYWdlIGxpZmV0aW1lIOKAlCB0aGUKICAvLyB2YWx1ZSBjYW4ndCBjaGFuZ2Ugd2l0aG91dCBhIHJlbG9hZC4KICBjb25zdCBOQVRJVkVfREVGQVVMVF9IT1NUUyA9IG5ldyBTZXQoWyJ3d3cueW91dHViZS5jb20iLCAid3d3LnR3aXRjaC50diIsICJ3d3cubmV0ZmxpeC5jb20iXSk7CiAgZnVuY3Rpb24gX2RlZmF1bHRHZW5lcmljRm9ySG9zdCgpIHsKICAgIHJldHVybiAhTkFUSVZFX0RFRkFVTFRfSE9TVFMuaGFzKGxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiByZWFkR2VuZXJpY1BpcEZvcmNlZCgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlZ2VuZXJpY19waXAiKTsKICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsKICAgICAgY29uc3QgcyA9IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKICAgICAgaWYgKHMgPT09ICIwIiB8fCBzID09PSAiZmFsc2UiIHx8IHMgPT09ICJubyIgfHwgcyA9PT0gIm9mZiIpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIHsgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsgfQogIH0KICBsZXQgX2dlbmVyaWNQaXBGb3JjZWRDYWNoZSA9IG51bGw7IC8vIG51bGwgPSBub3QgeWV0IHJlYWQKICBmdW5jdGlvbiBnZW5lcmljUGlwRm9yY2VkQ2FjaGVkKCkgewogICAgaWYgKF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPT09IG51bGwpIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPSByZWFkR2VuZXJpY1BpcEZvcmNlZCgpOwogICAgcmV0dXJuIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGU7CiAgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IHdoZW4gdHJ1dGh5LCB0aGUgZ2VuZXJpYyBvdmVybGF5IHBpbGwgaXMKICAvLyBzdXBwcmVzc2VkIG9uIHRoaXMgc2l0ZS4gU2V0IHZpYSB0aGUgcmlnaHQtY2xpY2sgbWVudSBvbiB0aGUgcGlsbDsKICAvLyBjbGVhcmVkIGZyb20gRGV2VG9vbHMgd2l0aCBgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImJyYXZlX3BpcF9kaXNhYmxlZCIpYC4KICAvLwogIC8vIFRoZSBmbGFnIGlzIGNhY2hlZCBpbiBgX3NpdGVEaXNhYmxlZGAgYWZ0ZXIgdGhlIGluaXRpYWwgYmFpbC1vdXQKICAvLyBjaGVjayBzbyB0aGUgaG90IHBhdGhzICh1cGRhdGUoKSBydW5zIHBlciB2aXNpYmxlIHZpZGVvIHBlcgogIC8vIGFuaW1hdGlvbiBmcmFtZSkgZG9uJ3QgaGF2ZSB0byBoaXQgbG9jYWxTdG9yYWdlIGV2ZXJ5IHRpY2suIFRoZQogIC8vIG1lbnUncyBjbGljayBoYW5kbGVyIGZsaXBzIHRoZSBjYWNoZWQgdmFsdWUgd2hlbiB0aGUgdXNlciBkaXNhYmxlcwogIC8vIG1pZC1zZXNzaW9uLgogIGNvbnN0IERJU0FCTEVfS0VZID0gImJyYXZlX3BpcF9kaXNhYmxlZCI7CiAgZnVuY3Rpb24gcmVhZFNpdGVEaXNhYmxlZCgpIHsKICAgIHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShESVNBQkxFX0tFWSkgPT09ICIxIjsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfQogIH0KICBmdW5jdGlvbiBzZXRTaXRlRGlzYWJsZWQoKSB7CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShESVNBQkxFX0tFWSwgIjEiKTsgfSBjYXRjaCB7fQogIH0KICAvLyBDYWNoZWQgZmxhZyDigJQgdXBkYXRlZCBvbiBpbml0IGFuZCBvbiBtaWQtc2Vzc2lvbiBkaXNhYmxlLgogIGxldCBfc2l0ZURpc2FibGVkID0gZmFsc2U7CgogIC8vIFNoYXJlZCByaWdodC1jbGljayBoYW5kbGVyIGF0dGFjaGVkIHRvIGV2ZXJ5IG5hdGl2ZSBpbmplY3RlZCBidXR0b24KICAvLyAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpLiBNaXJyb3JzIHRoZSBnZW5lcmljIHBpbGwncyBjb250ZXh0bWVudQogIC8vIHdpcmluZyBzbyB1c2VycyBjYW4gZGlzYWJsZSBQaVAgb24gdGhlIGhvc3Qgc2l0ZSBmcm9tIGFueSBvZiBvdXIgVUlzLgogIGZ1bmN0aW9uIF9vbk5hdGl2ZUJ0bkNvbnRleHRNZW51KGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzaG93RGlzYWJsZU1lbnUoZS5jbGllbnRYLCBlLmNsaWVudFkpOwogIH0KCiAgLy8gUmVtb3ZlcyBhbnkgb2Ygb3VyIGluamVjdGVkIERPTSAobmF0aXZlIGJ1dHRvbnMgKyBjbG9uZWQgd3JhcHBlcnMpLgogIC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIHBpY2tzICJEaXNhYmxlIFBpUCBpY29uIG9uIDxzaXRlPiIgZnJvbSB0aGUKICAvLyByaWdodC1jbGljayBtZW51IHNvIHRoZSBwYWdlIHJldHVybnMgdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS4KICBmdW5jdGlvbiBfcmVtb3ZlTmF0aXZlQnV0dG9ucygpIHsKICAgIGNvbnN0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJyYXZlLXBpcC1idG4sIC5icmF2ZS1waXAtd3JhcHBlciIpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgbm9kZXNbaV0ucmVtb3ZlKCk7CiAgfQoKICAvLyBTaW5nbGUtaW5zdGFuY2UgY3VzdG9tIGNvbnRleHQgbWVudSBzaG93biBvbiByaWdodC1jbGljayBvZiB0aGUKICAvLyBnZW5lcmljIHBpbGwgb3IgYW55IG5hdGl2ZSBpbmplY3RlZCBidXR0b24uIFdlIGNhbid0IGN1c3RvbWlzZSB0aGUKICAvLyBicm93c2VyJ3MgbmF0aXZlIGNvbnRleHQgbWVudSB3aXRob3V0IGFuIGV4dGVuc2lvbiwgc28gd2UgY2FuY2VsIGl0CiAgLy8gKGBwcmV2ZW50RGVmYXVsdGApIGFuZCByZW5kZXIgb3VyIG93biBET00uIEF1dG8tZGlzbWlzc2VzIG9uCiAgLy8gY2xpY2stb3V0c2lkZSwgRXNjYXBlLCBvciBzY3JvbGwuCiAgbGV0IGFjdGl2ZU1lbnUgPSBudWxsOwogIC8vIFRpbWVzdGFtcCB3aGVuIHRoZSBhY3RpdmUgbWVudSB3YXMgb3BlbmVkLiBPdXRzaWRlLWNsaWNrcyB3aXRoaW4gYQogIC8vIHNob3J0IHdpbmRvdyAofjE1MCBtcykgb2Ygb3BlbmluZyBhcmUgaWdub3JlZCDigJQgZGVmZW5kcyBhZ2FpbnN0IGEKICAvLyBzeW50aGV0aWMgc2FtZS1mcmFtZSBjbGljayBieXBhc3NpbmcgdGhlIHNldFRpbWVvdXQoMCkgaGFuZG9mZi4KICBsZXQgYWN0aXZlTWVudU9wZW5lZEF0ID0gMDsKICBjb25zdCBNRU5VX09QRU5fR1VBUkRfTVMgPSAxNTA7CiAgZnVuY3Rpb24gY2xvc2VNZW51KCkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBhY3RpdmVNZW51LnJlbW92ZSgpOwogICAgYWN0aXZlTWVudSA9IG51bGw7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgX29uTWVudUtleSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgY2xvc2VNZW51LCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGNsb3NlTWVudSk7CiAgfQogIGZ1bmN0aW9uIF9vbk1lbnVLZXkoZSkgeyBpZiAoZS5rZXkgPT09ICJFc2NhcGUiKSBjbG9zZU1lbnUoKTsgfQogIGZ1bmN0aW9uIF9vbk1lbnVDbGlja091dHNpZGUoZSkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBpZiAoZS50aW1lU3RhbXAgLSBhY3RpdmVNZW51T3BlbmVkQXQgPCBNRU5VX09QRU5fR1VBUkRfTVMpIHJldHVybjsKICAgIGlmICghYWN0aXZlTWVudS5jb250YWlucyhlLnRhcmdldCkpIGNsb3NlTWVudSgpOwogIH0KICBmdW5jdGlvbiBzaG93RGlzYWJsZU1lbnUoeCwgeSkgewogICAgY2xvc2VNZW51KCk7CiAgICBjb25zdCBtZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBtZW51LnN0eWxlLmNzc1RleHQgPQogICAgICAicG9zaXRpb246Zml4ZWQ7bGVmdDoiICsgeCArICJweDt0b3A6IiArIHkgKyAicHg7IiArCiAgICAgICJiYWNrZ3JvdW5kOnJnYmEoMjgsMjgsMzAsMC45Nik7Y29sb3I6I2ZmZjsiICsKICAgICAgImJvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NHB4IDA7IiArCiAgICAgICJib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAiei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiZm9udDo1MDAgMTNweC8xLjQgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sU2Vnb2UgVUksUm9ib3RvLHNhbnMtc2VyaWY7IiArCiAgICAgICJ1c2VyLXNlbGVjdDpub25lO3BvaW50ZXItZXZlbnRzOmF1dG87bWluLXdpZHRoOjE4MHB4OyI7CgogICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaXRlbS50ZXh0Q29udGVudCA9ICJEaXNhYmxlIFBpUCBpY29uIG9uICIgKyBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjhweCAxNHB4O2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcDsiOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjEyKSI7IH0pOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAiIjsgfSk7CiAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBzZXRTaXRlRGlzYWJsZWQoKTsKICAgICAgX3NpdGVEaXNhYmxlZCA9IHRydWU7CiAgICAgIC8vIEhpZGUgZXZlcnkgYWN0aXZlIGdlbmVyaWMgcGlsbCBvbiB0aGlzIHBhZ2UgaW1tZWRpYXRlbHkuIFRoZQogICAgICAvLyBuZXh0IGB1cGRhdGUoKWAgdGljayB3aWxsIHNlZSB0aGUgY2FjaGVkIGZsYWcgYW5kIGtlZXAgdGhlbQogICAgICAvLyBoaWRkZW4uIE5hdGl2ZSBpbmplY3RlZCBidXR0b25zIChZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeCkKICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGRpcmVjdGx5IOKAlCB0aGVpciBwZXJzaXN0ZW50IG9ic2VydmVycwogICAgICAvLyB3aWxsIHNlZSBgX3NpdGVEaXNhYmxlZGAgYW5kIHN0b3AgcmUtaW5qZWN0aW5nLgogICAgICBfc2NoZWR1bGVVcGRhdGVBbGwoKTsKICAgICAgX3JlbW92ZU5hdGl2ZUJ1dHRvbnMoKTsKICAgICAgbG9nKCJkaXNhYmxlZCBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUpOwogICAgICBjbG9zZU1lbnUoKTsKICAgIH0pOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgYWN0aXZlTWVudSA9IG1lbnU7CiAgICBhY3RpdmVNZW51T3BlbmVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKCiAgICAvLyBJZiB0aGUgbWVudSB3b3VsZCBvdmVyZmxvdyB0aGUgdmlld3BvcnQsIG51ZGdlIGl0IGJhY2sgaW4uCiAgICBjb25zdCByID0gbWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmIChyLnJpZ2h0ID4gaW5uZXJXaWR0aCkgIG1lbnUuc3R5bGUubGVmdCA9IChpbm5lcldpZHRoICAtIHIud2lkdGggIC0gOCkgKyAicHgiOwogICAgaWYgKHIuYm90dG9tID4gaW5uZXJIZWlnaHQpIG1lbnUuc3R5bGUudG9wICA9IChpbm5lckhlaWdodCAtIHIuaGVpZ2h0IC0gOCkgKyAicHgiOwoKICAgIC8vIERlZmVyIGxpc3RlbmVyIGF0dGFjaCB0byB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gdGhlIGNsaWNrIHRoYXQKICAgIC8vIG9wZW5lZCB0aGUgbWVudSBkb2Vzbid0IGltbWVkaWF0ZWx5IGRpc21pc3MgaXQuCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIF9vbk1lbnVLZXksIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBjbG9zZU1lbnUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBjbG9zZU1lbnUpOwogICAgfSwgMCk7CiAgfQoKICAvLyBOYXRpdmUtc2l0ZSBhZGFwdGVyIHRhYmxlLiBFYWNoIGVudHJ5IGRlc2NyaWJlcyBvbmUgc2l0ZSB3aG9zZQogIC8vIHBsYXllciBjaHJvbWUgd2Uga25vdyBob3cgdG8gaW5qZWN0IGludG8uIERldGVjdGlvbiBpcyBob3N0bmFtZS0KICAvLyBmaXJzdCAoaGFuZGxlcyByZWd1bGFyIHBhZ2VzKSB3aXRoIGEgRE9NLXNpZ25hbCBmYWxsYmFjayAoaGFuZGxlcwogIC8vIGFib3V0OmJsYW5rIHNhbWUtb3JpZ2luIGlmcmFtZXMgd2hlcmUgbG9jYXRpb24uaG9zdG5hbWUgaXMgIiIpLgogIC8vCiAgLy8gVG8gc3VwcG9ydCBhIG5ldyBzaXRlLCBhZGQgYSByZWNvcmQgaGVyZSBhbmQgd3JpdGUgYSBtYXRjaGluZwogIC8vIGBhZGQ8TmFtZT5CdXR0b24odmlkZW8pYCBpbmplY3RvciDigJQgbm8gb3RoZXIgY2hhbmdlIHJlcXVpcmVkLgogIGNvbnN0IE5BVElWRV9TSVRFUyA9IFsKICAgIHsKICAgICAgbmFtZTogIllvdVR1YmUiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoInlvdXR1YmUuY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5odG1sNS12aWRlby1wbGF5ZXIsIC55dHAtcmlnaHQtY29udHJvbHMiKSwKICAgICAgaW5qZWN0OiBhZGRZb3VUdWJlQnV0dG9uLAogICAgICBzY29wZTogIi5odG1sNS12aWRlby1wbGF5ZXIiLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlR3aXRjaCIsCiAgICAgIG1hdGNoOiAoaG9zdCkgPT4gaG9zdC5lbmRzV2l0aCgidHdpdGNoLnR2IikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXIsIFtkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItY29udHJvbHMiXScpLAogICAgICBpbmplY3Q6IGFkZFR3aXRjaEJ1dHRvbiwKICAgICAgc2NvcGU6ICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWNvbnRyb2xzIl0sIC52aWRlby1wbGF5ZXInLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIk5ldGZsaXgiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoIm5ldGZsaXguY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVpYT0iY29udHJvbHMtc3RhbmRhcmQiXSwgW2RhdGEtdWlhPSJ2aWRlby1jYW52YXMiXScpLAogICAgICBpbmplY3Q6IGFkZE5ldGZsaXhCdXR0b24sCiAgICAgIHNjb3BlOiAnW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJywKICAgIH0sCiAgXTsKCiAgLy8gUnVuIGFuIGluamVjdG9yIG9uY2Ugbm93IGFuZCBhZ2FpbiBvbiBldmVyeSByZWxldmFudCBET00gbXV0YXRpb24sCiAgLy8gc28gdGhlIGJ1dHRvbiByZWFwcGVhcnMgYWZ0ZXIgUmVhY3QgKE5ldGZsaXggLyBUd2l0Y2gpIHRlYXJzIGRvd24KICAvLyBhbmQgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIuIFRoZSBvYnNlcnZlciBzdGFydHMgb24gPGh0bWw+IGlmCiAgLy8gdGhlIHNjb3BlZCBjb250YWluZXIgaXNuJ3QgaW4gdGhlIERPTSB5ZXQsIHRoZW4gInByb21vdGVzIiBpdHNlbGYKICAvLyB0byB0aGUgc21hbGxlciBzdWJ0cmVlIGFzIHNvb24gYXMgaXQgYXBwZWFycyDigJQgbWluaW1pc2luZyBjaHVybi4KICAvLwogIC8vIFJlc2lsaWVuY2UgdG8gaG9zdCByZWRlc2lnbnM6IGlmIHRoZSBpbmplY3RvciBrZWVwcyByZXR1cm5pbmcgZmFsc2UKICAvLyBmb3IgYE5BVElWRV9GQUxMQkFDS19NU2AgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIHdlIGRpc2Nvbm5lY3QgdGhlCiAgLy8gb2JzZXJ2ZXIgYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQg4oCUIHNvIHVzZXJzCiAgLy8gYWx3YXlzIGdldCAqc29tZSogUGlQIGNvbnRyb2wgZXZlbiBpZiBZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeAogIC8vIGNoYW5nZXMgaXRzIERPTSBpbiBhIHdheSB0aGF0IGJyZWFrcyBvdXIgc2VsZWN0b3JzLiBUaGUgZmFsbGJhY2sgaXMKICAvLyBhcm1lZCBvbmx5IG9uY2UgcGVyIHZpZGVvIGFuZCBvbmx5IHRyaWdnZXJzIGlmIHRoZSBpbmplY3RvciBoYXMKICAvLyAqbmV2ZXIqIHN1Y2NlZWRlZDsgaW50ZXJtaXR0ZW50IGZhaWx1cmVzIGR1cmluZyBhIHJlLW1vdW50IGRvbid0CiAgLy8gY291bnQuCiAgZnVuY3Rpb24gdHJ5TmF0aXZlKHZpZGVvLCBpbmplY3Rvciwgc2NvcGVTZWxlY3RvciwgdGVhcmRvd25zKSB7CiAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGxldCBldmVyU3VjY2VlZGVkID0gISFpbmplY3Rvcih2aWRlbyk7CiAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgICBsZXQgZmVsbEJhY2sgPSBmYWxzZTsKICAgIC8vIEFsd2F5cyBvYnNlcnZlIGF0IGRvY3VtZW50IGxldmVsLiBXZSB0cmllZCBwcm9tb3RpbmcgdG8gYSBzY29wZWQKICAgIC8vIHN1YnRyZWUgKGFuZCB0byB0aGUgc2NvcGVkIHRhcmdldCdzIHBhcmVudCkgZm9yIGxvd2VyIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIGJ1dCBOZXRmbGl4IHJlLW1vdW50cyB3aG9sZSBwbGF5ZXIgc3VidHJlZXMgb24gdmlzaWJpbGl0eQogICAgLy8gY2hhbmdlcyDigJQgbGVhdmluZyBhbnkgbmFycm93ZXIgb2JzZXJ2ZXIgYXR0YWNoZWQgdG8gYSBkZXRhY2hlZAogICAgLy8gbm9kZSwgd2l0aCBubyB3YXkgdG8gZGV0ZWN0IGRldGFjaG1lbnQgYmVjYXVzZSBubyBtdXRhdGlvbnMgZmlyZQogICAgLy8gb24gdGhlIGRldGFjaGVkIG5vZGUuIFRoZSByQUYtY29hbGVzY2VkIGNhbGxiYWNrIGJlbG93IGNhcHMgd29yawogICAgLy8gYXQgb25lIGluamVjdG9yIGNhbGwgcGVyIGFuaW1hdGlvbiBmcmFtZSByZWdhcmRsZXNzIG9mIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIHNvIGRvY3VtZW50LWxldmVsIG9ic2VydmF0aW9uIHN0YXlzIGJvdW5kZWQuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgIGlmIChzY2hlZHVsZWQgfHwgZmVsbEJhY2spIHJldHVybjsKICAgICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICBpZiAoZmVsbEJhY2spIHJldHVybjsKICAgICAgICBpZiAoaW5qZWN0b3IodmlkZW8pKSB7CiAgICAgICAgICBldmVyU3VjY2VlZGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFldmVyU3VjY2VlZGVkICYmCiAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCA+PSBDT05GSUcuTkFUSVZFX0ZBTExCQUNLX01TKSB7CiAgICAgICAgICBmZWxsQmFjayA9IHRydWU7CiAgICAgICAgICBvYnMuZGlzY29ubmVjdCgpOwogICAgICAgICAgd2FybigibmF0aXZlIGluamVjdGlvbiB1bmF2YWlsYWJsZSBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUgKwogICAgICAgICAgICAgICAiOyBmYWxsaW5nIGJhY2sgdG8gZ2VuZXJpYyBwaWxsIik7CiAgICAgICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIG9icy5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICBpZiAodGVhcmRvd25zKSB0ZWFyZG93bnMucHVzaCgoKSA9PiBvYnMuZGlzY29ubmVjdCgpKTsKICB9CgogIC8vIERlY2lkZXMgd2hpY2ggVUkgdG8gYWRkIGZvciBhIGdpdmVuIHZpZGVvIGFuZCB3aXJlcyBpdCB1cC4gQ2FsbGVkCiAgLy8gZXhhY3RseSBvbmNlIHBlciB2aWRlbyBieSBgYXR0YWNoVG9WaWRlb2AuIFRoZSBgdGVhcmRvd25zYCBhcnJheSBpcwogIC8vIHBvcHVsYXRlZCB3aXRoIGNsZWFudXAgY2xvc3VyZXMgdGhhdCB0aGUgZGlzY292ZXJ5IG9ic2VydmVyJ3MKICAvLyByZW1vdmVkLW5vZGVzIHBhdGggd2lsbCBydW4uCiAgZnVuY3Rpb24gYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIEdlbmVyaWMgb3ZlcmxheSBpcyB0aGUgZGVmYXVsdC4gU2V0IGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcD0iMCIKICAgIC8vIChvciBmYWxzZS9uby9vZmYpIHBlci1vcmlnaW4gdG8gb3B0IGJhY2sgaW50byBuYXRpdmUgaW5qZWN0aW9uLgogICAgaWYgKGdlbmVyaWNQaXBGb3JjZWRDYWNoZWQoKSkgewogICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICBsb2coImluamVjdGVkIG92ZXJsYXkiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGhvc3QgPSBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTkFUSVZFX1NJVEVTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHNpdGUgPSBOQVRJVkVfU0lURVNbaV07CiAgICAgIGlmIChzaXRlLm1hdGNoKGhvc3QpKSB7CiAgICAgICAgdHJ5TmF0aXZlKHZpZGVvLCBzaXRlLmluamVjdCwgc2l0ZS5zY29wZSwgdGVhcmRvd25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAvLyBVbnJlY29nbmlzZWQgc2l0ZSAoYW5kIHVzZXIgb3B0ZWQgb3V0IG9mIGdlbmVyaWMgdmlhIGxvY2FsU3RvcmFnZSk6CiAgICAvLyBzdGlsbCBpbnN0YWxsIHRoZSBvdmVybGF5IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyBuYXRpdmUgdG8gYW5jaG9yIHRvLgogICAgYWRkT3ZlcmxheUJ1dHRvbih2aWRlbywgdGVhcmRvd25zKTsKICAgIGxvZygiaW5qZWN0ZWQgb3ZlcmxheSIpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGVyLXZpZGVvIHNldHVwICsgdGVhcmRvd24KICAvLwogIC8vIFJ1bnMgb25jZSBwZXIgPHZpZGVvPiBlbGVtZW50LiBUaGUgYHRlYXJkb3duc2AgYXJyYXkgaXMgdGhlIHNpbmdsZQogIC8vIHBsYWNlIGV2ZXJ5IGxpc3RlbmVyIC8gb2JzZXJ2ZXIgLyBET00gbm9kZSB3ZSBhZGQgZm9yIHRoaXMgdmlkZW8gaXMKICAvLyByZWNvcmRlZDsgdGhlIGRpc2NvdmVyeSBvYnNlcnZlciBiZWxvdyBjYWxscyB0aGVtIHdoZW4gdGhlIHZpZGVvIGlzCiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRoZSBzY3JpcHQgZG9lc24ndCBsZWFrIG9uIGxvbmctbGl2ZWQgU1BBCiAgLy8gcGFnZXMgd2l0aCBpbmZpbml0ZSBzY3JvbGwuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gYXR0YWNoVG9WaWRlbyh2aWRlbykgewogICAgaWYgKHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKSkgcmV0dXJuOwoKICAgIC8vIFNvbWUgc2l0ZXMgKE5ldGZsaXgsIGNlcnRhaW4gRFJNIHBsYXllcnMpIGV4cGxpY2l0bHkgZGlzYWJsZSBQaVAuCiAgICAvLyBDbGVhciBpdCBub3cgYW5kIHdhdGNoIChiZWxvdykgZm9yIHRoZSBwYWdlIHJlLXNldHRpbmcgaXQuCiAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgdmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgPSBmYWxzZTsKICAgICAgdmlkZW8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScpOwogICAgfQogICAgLy8gV2lyZSBhdXRvbWF0aWMtUGlQIGludGVudCAoYnJvd3NlcnMgd2l0aCBhdXRvLVBpUCBmZWF0dXJlLCBlLmcuCiAgICAvLyBDaHJvbWUgZmxhZywgZmlyZSB0aGlzIG9uIHRhYiBzd2l0Y2gpLiBUaGUgaGFuZGxlciBpcyBnbG9iYWwgcGVyCiAgICAvLyBkb2N1bWVudCDigJQgbGFzdCByZWdpc3RyYXRpb24gd2lucyDigJQgc28gb24gcGFnZXMgd2l0aCBtdWx0aXBsZQogICAgLy8gPHZpZGVvPiBlbGVtZW50cyAoWW91VHViZSB3YXRjaDogbWFpbiBwbGF5ZXIgKyBob3Zlci10aHVtYm5haWwKICAgIC8vIHByZXZpZXdzICsgYWQgcHJlLXJvbGwpIHRoZSAqbGFzdCogbW91bnRlZCB2aWRlbyB3b3VsZCBiZSBQaVAnZCwKICAgIC8vIHdoaWNoIGlzIGZyZXF1ZW50bHkgYSBoaWRkZW4vZW1wdHkgcHJldmlldyDihpIgYmxhY2sgUGlQIHdpbmRvdwogICAgLy8gd2l0aCBubyBjb250cm9scyBhbmQgYSBkZXN5bmNlZCBkdXJhdGlvbi4KICAgIC8vIFBpY2sgdGhlIG1vc3QgcGxhdXNpYmxlICJhY3RpdmUiIHZpZGVvIGF0IGZpcmUgdGltZSBpbnN0ZWFkOgogICAgLy8gdGhlIG9uZSBjdXJyZW50bHkgaW4gUGlQICh0b2dnbGluZyBvdXQpLCBlbHNlIHRoZSBsYXJnZXN0IHBsYXlpbmcKICAgIC8vIHZpZGVvLCBlbHNlIHRoZSBsYXJnZXN0IHZpZGVvIHdpdGggbWV0YWRhdGEuIE5vLW9wIG9uIGJyb3dzZXJzCiAgICAvLyB0aGF0IGRvbid0IHN1cHBvcnQgaXQ7IHRoZSB0cnkvY2F0Y2ggZ3VhcmRzIGlPUyAvIG9sZGVyIGJyb3dzZXJzLgogICAgdHJ5IHsKICAgICAgbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKCJlbnRlcnBpY3R1cmVpbnBpY3R1cmUiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgdiA9IHBpY2tBdXRvUGlwVGFyZ2V0KCkgfHwgdmlkZW87CiAgICAgICAgdHJ5IHsgYXdhaXQgdi5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpOyB9IGNhdGNoIChlKSB7IHdhcm4oImF1dG8tUGlQIGZhaWxlZDoiLCBlLm1lc3NhZ2UgfHwgZSk7IH0KICAgICAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciAqLyB9CgogICAgY29uc3QgdGVhcmRvd25zID0gW107CgogICAgYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwoKICAgIC8vIE9ubHkgcmVzdW1lIG9uIGVudGVyaW5nIFBpUCBpZiB0aGUgdmlkZW8gd2FzIGFjdHVhbGx5IHBsYXlpbmcgd2hlbgogICAgLy8gdGhlIHRyYW5zaXRpb24gZmlyZWQuIFRoZSBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGB2aWRlby5wbGF5KClgCiAgICAvLyBvdmVycm9kZSB1c2VyLWluaXRpYXRlZCBwYXVzZXMgKGUuZy4gWW91VHViZSBhdXRvLVBpUCBvbiB0YWItc3dpdGNoCiAgICAvLyB3b3VsZCB1bi1wYXVzZSBhIHBhdXNlZCB2aWRlbykuIENhcHR1cmUgc3RhdGUgYXQgaGFuZGxlciBhdHRhY2gKICAgIC8vIHRpbWUgYW5kIHJlZnJlc2ggb24gcGxheS9wYXVzZSBldmVudHMuCiAgICBsZXQgd2FzUGxheWluZyA9ICF2aWRlby5wYXVzZWQgJiYgIXZpZGVvLmVuZGVkOwogICAgY29uc3Qgb25QbGF5U3RhdGUgPSAoKSA9PiB7IHdhc1BsYXlpbmcgPSAhdmlkZW8ucGF1c2VkICYmICF2aWRlby5lbmRlZDsgfTsKICAgIGNvbnN0IFBMQVlfRVZFTlRTID0gWyJwbGF5IiwgInBsYXlpbmciLCAicGF1c2UiLCAiZW5kZWQiXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUExBWV9FVkVOVFMubGVuZ3RoOyBpKyspIHsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgfQogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFBMQVlfRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCBvbkVudGVyUGlwID0gKCkgPT4gewogICAgICBpZiAoIXdhc1BsYXlpbmcpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh3YXNQbGF5aW5nICYmIHZpZGVvLnBhdXNlZCkgdmlkZW8ucGxheSgpOyB9LCAyNTApOwogICAgfTsKICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImVudGVycGljdHVyZWlucGljdHVyZSIsIG9uRW50ZXJQaXApOwogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW50ZXJwaWN0dXJlaW5waWN0dXJlIiwgb25FbnRlclBpcCkpOwoKICAgIC8vIFdhdGNoIGZvciBzaXRlcyAoZS5nLiBOZXRmbGl4KSByZS1hZGRpbmcgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUuCiAgICBjb25zdCBkcGlwT2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgICB2aWRlby5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IGZhbHNlOwogICAgICAgIHZpZGVvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnKTsKICAgICAgfQogICAgfSk7CiAgICBkcGlwT2JzLm9ic2VydmUodmlkZW8sIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJ10gfSk7CiAgICB0ZWFyZG93bnMucHVzaCgoKSA9PiBkcGlwT2JzLmRpc2Nvbm5lY3QoKSk7CgogICAgdmlkZW9DbGVhbnVwcy5zZXQodmlkZW8sICgpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZWFyZG93bnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgeyB0ZWFyZG93bnNbaV0oKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSBpbmRpdmlkdWFsIHRlYXJkb3duIGVycm9ycyAqLyB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG9wLWxldmVsIHNldHVwICsgZGlzY292ZXJ5IG9ic2VydmVyCiAgLy8KICAvLyBPbmUgcGVyc2lzdGVudCBNdXRhdGlvbk9ic2VydmVyIHRyYWNrcyA8dmlkZW8+IGVsZW1lbnRzIGJlaW5nIGFkZGVkCiAgLy8gdG8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSBvdmVyIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEFkZCDihpIgd2lyZSB1cC4KICAvLyBSZW1vdmUg4oaSIHJ1biB0aGUgcmVnaXN0ZXJlZCB0ZWFyZG93biBjbG9zdXJlIGZvciB0aGF0IHZpZGVvLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUoKSB7CiAgICAvLyBBdHRhY2ggdG8gZXZlcnkgPHZpZGVvPiBjdXJyZW50bHkgb24gdGhlIHBhZ2UuCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpLmZvckVhY2goYXR0YWNoVG9WaWRlbyk7CgogICAgLy8gS2VlcCB3YXRjaGluZyBmb3IgdmlkZW9zIGFkZGVkIGxhdGVyIChsYXp5LWxvYWRlZCBmZWVkcywgU1BBIHJvdXRlCiAgICAvLyBjaGFuZ2VzLCBlbWJlZGRlZCBwbGF5ZXJzIHRoYXQgbW91bnQgYWZ0ZXIgZmlyc3QgcGFpbnQsIGV0Yy4pLgogICAgLy8gSW5kZXhlZCBsb29wcyArIG5vZGVUeXBlIGNoZWNrIGFyZSBmcmllbmRsaWVyIHRvIFY4J3MgaW5saW5lCiAgICAvLyBjYWNoZXMgdGhhbiBmb3Itb2YgKyBpbnN0YW5jZW9mIG9uIGhvdCBET00tbXV0YXRpb24gcGF0aHMuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihfb25Eb21NdXRhdGlvbnMpOwogICAgb2JzLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIF9ydW5DbGVhbnVwKHZpZGVvKSB7CiAgICBjb25zdCBmbiA9IHZpZGVvQ2xlYW51cHMuZ2V0KHZpZGVvKTsKICAgIGlmICghZm4pIHJldHVybjsKICAgIHZpZGVvQ2xlYW51cHMuZGVsZXRlKHZpZGVvKTsKICAgIHRyeSB7IGZuKCk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgZnVuY3Rpb24gX29uRG9tTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7CiAgICAgIGNvbnN0IG11ID0gbXV0YXRpb25zW2ldOwoKICAgICAgY29uc3QgYWRkZWQgPSBtdS5hZGRlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgYWxlbiA9IGFkZGVkLmxlbmd0aDsgaiA8IGFsZW47IGorKykgewogICAgICAgIGNvbnN0IG5vZGUgPSBhZGRlZFtqXTsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgY29udGludWU7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICJWSURFTyIpIHsKICAgICAgICAgIGF0dGFjaFRvVmlkZW8obm9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7CiAgICAgICAgICBjb25zdCB2aWRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCB2bGVuID0gdmlkcy5sZW5ndGg7IGsgPCB2bGVuOyBrKyspIGF0dGFjaFRvVmlkZW8odmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdCByZW1vdmVkID0gbXUucmVtb3ZlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgcmxlbiA9IHJlbW92ZWQubGVuZ3RoOyBqIDwgcmxlbjsgaisrKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IHJlbW92ZWRbal07CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIGNvbnRpbnVlOwogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAiVklERU8iKSB7CiAgICAgICAgICBfcnVuQ2xlYW51cChub2RlKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKICAgICAgICAgIGNvbnN0IHZpZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwogICAgICAgICAgZm9yIChsZXQgayA9IDAsIHZsZW4gPSB2aWRzLmxlbmd0aDsgayA8IHZsZW47IGsrKykgX3J1bkNsZWFudXAodmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBCb290CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIEJhaWwgb3V0IGVhcmx5IG9uIGJyb3dzZXJzIHdpdGggbm8gUGlQIEFQSSBhdCBhbGwgKGV4dHJlbWVseSBvbGQgb3IKICAvLyBleG90aWMpLiBBdm9pZHMgcmVnaXN0ZXJpbmcgbGlzdGVuZXJzIHdlJ2QgbmV2ZXIgdXNlLgogIGlmICghUElQX1NVUFBPUlRFRCkgcmV0dXJuOwoKICAvLyBTY29wZTogb25seSBydW4gaW4gdGhlIHRvcC1sZXZlbCBmcmFtZS4gRW1iZWRkZWQgcGxheWVycyAoZS5nLgogIC8vIHd3dy55b3V0dWJlLmNvbS9lbWJlZC88aWQ+IGlmcmFtZXMgaW5zaWRlIHRoaXJkLXBhcnR5IHBhZ2VzKSBnZXQKICAvLyBuZWl0aGVyIG5hdGl2ZSBpbmplY3Rpb24gbm9yIHRoZSBnZW5lcmljLXBpbGwgZmFsbGJhY2sg4oCUIHRoZSBob3N0CiAgLy8gc2l0ZSBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBQaVAgVVggaW5zaWRlIGlmcmFtZXMuIFRoaXMga2VlcHMKICAvLyB0aGUgc2NyaXB0IGZvY3VzZWQgb24gY2Fub25pY2FsIGRlc2t0b3Agc2Vzc2lvbnMgYW5kIGF2b2lkcwogIC8vIGRvdWJsZS1pbmplY3Rpb24gd2hlbiBib3RoIHRoZSBwYXJlbnQgZnJhbWUgYW5kIHRoZSBlbWJlZCBtYXRjaAogIC8vIGEgdXNlcidzIGZpbHRlciBydWxlLgogIHRyeSB7IGlmICh3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZikgcmV0dXJuOyB9IGNhdGNoIChlKSB7IHJldHVybjsgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IGlmIHRoZSB1c2VyIHByZXZpb3VzbHkgc2VsZWN0ZWQgIkRpc2FibGUgUGlQIGljb24KICAvLyBvbiA8c2l0ZT4iIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUsIHRoaXMgZmxhZyBwZXJzaXN0cyBpbgogIC8vIGxvY2FsU3RvcmFnZS4gQmFpbCBiZWZvcmUgYW55IHNldHVwIHNvIHRoZSBzY3JpcHQgaXMgYSB0cnVlIG5vLW9wCiAgLy8gZm9yIHRoYXQgb3JpZ2luIOKAlCBubyBvYnNlcnZlcnMsIG5vIGxpc3RlbmVycywgbm8gd29yay4gT3RoZXIKICAvLyBvcmlnaW5zIGFyZSB1bmFmZmVjdGVkIGJlY2F1c2UgbG9jYWxTdG9yYWdlIGlzIHBhcnRpdGlvbmVkIHBlci1vcmlnaW4uCiAgLy8gV2UgYWxzbyBzZWVkIHRoZSBjYWNoZWQgYF9zaXRlRGlzYWJsZWRgIGZsYWcgaGVyZSAoaXJyZWxldmFudCBpZiB3ZQogIC8vIHJldHVybiwgYnV0IGtlZXBzIHRoZSBjYWNoZSBsaXZlIGluIHRoZSBub3QteWV0LWRpc2FibGVkIGNhc2UpLgogIF9zaXRlRGlzYWJsZWQgPSByZWFkU2l0ZURpc2FibGVkKCk7CiAgaWYgKF9zaXRlRGlzYWJsZWQpIHJldHVybjsKCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCiAgICAgIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgc2V0dXBBdXRvUGljdHVyZUluUGljdHVyZSgpOwogIH0KfSkoKTs="},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUKCmNvbnN0IHNwb29mQnJhbmRzID0gKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgaWYgKGl0ZW0/LmJyYW5kPy50b0xvd2VyQ2FzZSgpID09PSAnYnJhdmUnKSB7CiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGJyYW5kOiAnR29vZ2xlIENocm9tZScgfTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0pOwp9OwoKY29uc3Qgb3JpZ2luYWxCcmFuZHMgPSBuYXZpZ2F0b3I/LnVzZXJBZ2VudERhdGE/LmJyYW5kczsKaWYgKG9yaWdpbmFsQnJhbmRzKSB7CiAgY29uc3Qgc3Bvb2ZlZEJyYW5kcyA9IHNwb29mQnJhbmRzKG9yaWdpbmFsQnJhbmRzKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF2aWdhdG9yVUFEYXRhLnByb3RvdHlwZSwgJ2JyYW5kcycsIHsKICAgIHZhbHVlOiBzcG9vZmVkQnJhbmRzCiAgfSk7Cn0KCmNvbnN0IG9yaWdpbmFsR2V0SGlnaEVudHJvcHlWYWx1ZXMgPQogIE5hdmlnYXRvclVBRGF0YT8ucHJvdG90eXBlPy5nZXRIaWdoRW50cm9weVZhbHVlczsKCmlmIChvcmlnaW5hbEdldEhpZ2hFbnRyb3B5VmFsdWVzKSB7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdmlnYXRvclVBRGF0YS5wcm90b3R5cGUsICdnZXRIaWdoRW50cm9weVZhbHVlcycsIHsKICAgIHZhbHVlOiBhc3luYyBmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcyhoaW50cykgewogICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgb3JpZ2luYWxHZXRIaWdoRW50cm9weVZhbHVlcy5jYWxsKAogICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnREYXRhLAogICAgICAgIGhpbnRzCiAgICAgICk7CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdHMpKSB7CiAgICAgICAgaWYgKGtleSA9PT0gJ2JyYW5kcycgfHwga2V5ID09PSAnZnVsbFZlcnNpb25MaXN0JykgewogICAgICAgICAgcmVzdWx0c1trZXldID0gc3Bvb2ZCcmFuZHMocmVzdWx0c1trZXldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfSk7Cn0KCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICBOYXZpZ2F0b3JVQURhdGEucHJvdG90eXBlLmdldEhpZ2hFbnRyb3B5VmFsdWVzLCAndG9TdHJpbmcnLCB7CiAgdmFsdWU6ICgpID0+ICdmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcygpIHsgW25hdGl2ZSBjb2RlXSB9Jwp9KTsK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play-update.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXktdXBkYXRlLmpzCi8vIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpIHsKICBjb25zdCBob3N0ID0gbG9jYXRpb24uaG9zdG5hbWU7CiAgY29uc3QgSVNfWU9VVFVCRSA9IC8oPzpefC4rXC4peW91dHViZSg/Oi1ub2Nvb2tpZSk/XC5jb20kLy50ZXN0KGhvc3QpOwogIGNvbnN0IElTX1ZJTUVPID0gLyg/Ol58LitcLil2aW1lb1wuY29tJC8udGVzdChob3N0KTsKCiAgLy8gUGFnZSBWaXNpYmlsaXR5IEFQSQogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnaGlkZGVuJywgewogICAgICBnZXQoKSB7IHJldHVybiBmYWxzZTsgfSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgZ2V0KCkgeyByZXR1cm4gJ3Zpc2libGUnOyB9LAogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnb252aXNpYmlsaXR5Y2hhbmdlJywgewogICAgICBnZXQoKSB7IHJldHVybiBudWxsOyB9LAogICAgICBzZXQoKSB7fSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gQmxvY2sgZXZlbnQgZGVsaXZlcnkgKGNhcHR1cmU9dHJ1ZSB0byBpbnRlcmNlcHQgZWFybHkpCiAgY29uc3Qgc3RvcCA9IChlKSA9PiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogIGNvbnN0IElTX0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8CiAgICAgICAgICAgICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICB0cnkgewogICAgLy8gU2tpcCB2aXNpYmlsaXR5Y2hhbmdlIGJsb2NraW5nIG9uIGlPUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1lZGlhIGJhY2tncm91bmRpbmcKICAgIGlmICghSVNfSU9TKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBzdG9wLCB0cnVlKTsKICAgIH0KICB9IGNhdGNoIChlKSB7fQoKICAvLyBGdWxsc2NyZWVuIEFQSSAoVmltZW8pCiAgaWYgKElTX1ZJTUVPKSB7CiAgICB0cnkgewogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHN0b3AsIHRydWUpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIC8vIFlvdVR1YmUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzCiAgaWYgKElTX1lPVVRVQkUpIHsKICAgIC8vIFVzZXIgYWN0aXZpdHkgdHJhY2tpbmcKICAgIGNvbnN0IExBQ1RfUkVGUkVTSCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWluCiAgICB3YWl0Rm9yTGFjdCgoKSA9PiByZWZyZXNoTGFjdCgpLCBMQUNUX1JFRlJFU0gpOwoKICAgIGZ1bmN0aW9uIGdldFZpZGVvKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigneXRkLXBsYXllciB2aWRlbywgI21vdmllX3BsYXllciB2aWRlbywgdmlkZW8nKTsKICAgIH0KCiAgICBsZXQgbGFzdFVzZXJJbnB1dCA9IDA7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CgogICAgLy8gTWVkaWEga2V5cyBnbyB0aHJvdWdoIE1lZGlhU2Vzc2lvbiwgbm90IGtleWRvd24uIFBhdGNoIHRoZSBwcm90b3R5cGUKICAgIC8vIHNvIHBhdXNlL3BsYXkgaGFuZGxlcnMgdXBkYXRlIGxhc3RVc2VySW5wdXQuCiAgICB0cnkgewogICAgICBjb25zdCBvcmlnU2V0ID0gTWVkaWFTZXNzaW9uLnByb3RvdHlwZS5zZXRBY3Rpb25IYW5kbGVyOwogICAgICBNZWRpYVNlc3Npb24ucHJvdG90eXBlLnNldEFjdGlvbkhhbmRsZXIgPSBmdW5jdGlvbihhY3QsIGgpIHsKICAgICAgICByZXR1cm4gb3JpZ1NldC5jYWxsKHRoaXMsIGFjdCwgKGFjdCAhPT0gJ3BhdXNlJyAmJiBhY3QgIT09ICdwbGF5JykgPyBoIDogZnVuY3Rpb24oLi4uYSkgewogICAgICAgICAgbGFzdFVzZXJJbnB1dCA9IERhdGUubm93KCk7CiAgICAgICAgICBpZiAodHlwZW9mIGggPT09ICdmdW5jdGlvbicpIHJldHVybiBoLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICBpZiAodikgYWN0ID09PSAncGF1c2UnID8gdi5wYXVzZSgpIDogdi5wbGF5KCkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBbJ3BhdXNlJywgJ3BsYXknXS5mb3JFYWNoKGEgPT4gbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKGEsIG51bGwpKTsKICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgZnVuY3Rpb24gb25WaWRlb05hdmlnYXRpb24oKSB7CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICAgIGlmIChJU19JT1MpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkZW8gPSBnZXRWaWRlbygpOwogICAgICAgIGlmICghdmlkZW8pIHJldHVybjsKICAgICAgICBpZiAodmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlcikgewogICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB2aWRlby5fYmdQbGF5UGF1c2VIYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHsKICAgICAgICAgIC8vIElmIHVzZXIgY2xpY2tlZCBvciBwcmVzc2VkIGEga2V5IHdpdGhpbiAzcyBiZWZvcmUgdGhlIHBhdXNlLCBpdCdzIGludGVudGlvbmFsCiAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RVc2VySW5wdXQgPCAzMDAwKSByZXR1cm47CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICAgIGlmICh2ICYmIHYucGF1c2VkICYmICF2LmVuZGVkICYmIHYucmVhZHlTdGF0ZSA+PSAyKSB2LnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICB9LCA4MDApOwogICAgICAgIH07CiAgICAgICAgdmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlciA9IGhhbmRsZXI7CiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVyKTsKICAgICAgfSwgMTUwMCk7CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3l0LW5hdmlnYXRlLWZpbmlzaCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1wYWdlLWRhdGEtdXBkYXRlZCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKCiAgICAvLyBTaW11bGF0ZSB1c2VyIGludGVyYWN0aW9uIHRvIHByZXZlbnQgIkFyZSB5b3Ugc3RpbGwgd2F0Y2hpbmc/IgogICAgY29uc3QgSU5URVJBQ1RJT05fSU5URVJWQUwgPSAxMCAqIDYwICogMTAwMDsgLy8gMTAgbWluCiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgaWYgKHBsYXllcikgewogICAgICAgIHBsYXllci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW1vdmUnLCB7IGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICB9CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICB9LCBJTlRFUkFDVElPTl9JTlRFUlZBTCk7CgogICAgLy8gS2VlcCBwbGF5ZXIgc3RhdGUgdXBkYXRlZAogICAgY29uc3QgUExBWUVSX1NUQVRFX0lOVEVSVkFMID0gNjAgKiAxMDAwOyAvLyAxIG1pbgogICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBjb25zdCB2aWRlbyA9IGdldFZpZGVvKCk7CiAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8ucGF1c2VkKSB7CiAgICAgICAgdmlkZW8uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3RpbWV1cGRhdGUnKSk7CiAgICAgIH0KICAgIH0sIFBMQVlFUl9TVEFURV9JTlRFUlZBTCk7CiAgfQoKICBmdW5jdGlvbiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIGRlbGF5ID0gMTAwMCkgewogICAgY29uc3QgbWF4RGVsYXkgPSA2MCAqIDEwMDA7IC8vIGNhcCBhdCA2MHMKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCAnX2xhY3QnKSkgewogICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dCgKICAgICAgICAoKSA9PiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIE1hdGgubWluKGRlbGF5ICogMiwgbWF4RGVsYXkpKSwKICAgICAgICBkZWxheQogICAgICApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaExhY3QoKSB7CiAgICB0cnkgewogICAgICBpZiAod2luZG93Ll9sYWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"brave-yt-sabr-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gWW91VHViZSdzIFNBQlIgKFNlcnZlciBBZGFwdGl2ZSBCaXRyYXRlKSBwcm90b2NvbCBzZW5kcyBhIGJhY2tvZmZUaW1lTXMKLy8gdmFsdWUgdGVsbGluZyB0aGUgcGxheWVyIHRvIHdhaXQgYmVmb3JlIHJlcXVlc3RpbmcgdmlkZW8gZGF0YS4gVGhpcwovLyBjb3ZlcnMgdGhlIGFkIHNsb3QgZHVyYXRpb24uIFdpdGhvdXQgYW4gYWRibG9ja2VyIHRoZSBhZCBmaWxscyB0aGUgd2FpdCwKLy8gc28gdGhlIHVzZXIgbmV2ZXIgbm90aWNlcy4gV2l0aCBhbiBhZGJsb2NrZXIsIHRoZSBhZCBpcyBibG9ja2VkIGJ1dCB0aGUKLy8gYmFja29mZiByZW1haW5zLCBjYXVzaW5nIGEgNC0xNiBzZWNvbmQgc3Bpbm5lci4KLy8gRnJvbTogaHR0cHM6Ly9pdGVyLmNhL3Bvc3QveXQtYWRibG9jay8KLy8KLy8gVHdvLXByb25nZWQgZml4OgovLwovLyAxLiBTUEEgbmF2aWdhdGlvbjogV2hlbiBjbGlja2luZyBiZXR3ZWVuIHZpZGVvcyB3aXRob3V0IGEgcGFnZSByZWxvYWQsCi8vICAgIHRoZSBwbGF5ZXIgcmV1c2VzIHRoZSBvbGQgU0FCUiBzZXNzaW9uICh3aGljaCBtYXkgYWxyZWFkeSBoYXZlIGEKLy8gICAgYmFja29mZikuIE9uIHl0LW5hdmlnYXRlLWZpbmlzaCwgd2Ugc2V0IGlzSW5saW5lUGxheWJhY2tOb0FkIG9uIHRoZQovLyAgICBwbGF5ZXIncyB2aWRlbyBkYXRhICh0ZWxsaW5nIGl0IHRoZXJlJ3Mgbm8gYWQgc2xvdCksIHRoZW4gY2FsbAovLyAgICBjYW5jZWxQbGF5YmFjaygpICsgbG9hZFZpZGVvQnlJZCgpIHRvIGZvcmNlIGEgbmV3IFNBQlIgc2Vzc2lvbi4KLy8KLy8gMi4gU0FCUiByZXNwb25zZSBwYXRjaGluZyAoZnVsbCBwYWdlIGxvYWRzKTogSW50ZXJjZXB0IFNBQlIgc3RyZWFtaW5nCi8vICAgIHJlc3BvbnNlcyBhbmQgcmV3cml0ZSBiYWNrb2ZmVGltZU1zIGluIHRoZSBwcm90b2J1Zi4gVGhpcyBoYW5kbGVzCi8vICAgIHBhZ2UgcmVsb2FkcyBhbmQgZGlyZWN0IG5hdmlnYXRpb25zIHdoZXJlIHRoZSBTQUJSIHNlc3Npb24gd2FzCi8vICAgIGFscmVhZHkgZXN0YWJsaXNoZWQgYmVmb3JlIHRoZSBzY3JpcHRsZXQgY291bGQgaW50ZXJ2ZW5lLgovLwovLyBUbyB1c2UgdGhpcyBzY3JpcHRsZXQ6Ci8vIDEuIEdvIHRvIGJyYXZlOi8vc2V0dGluZ3Mvc2hpZWxkcy9maWx0ZXJzCi8vIDIuIEVuYWJsZSBEZXZlbG9wZXIgbW9kZQovLyAzLiBDbGljayBvbiBjcmVhdGUgbmV3IHNjcmlwdGxldAovLyA0LiBBZGQgdGhpcyBjb250ZW50IGFuZCBuYW1lIGl0IGB1c2VyLXl0LXNhYnItZml4LmpzYAovLyA1LiBBZGQgYSBjdXN0b20gZmlsdGVyOiBgd3d3LnlvdXR1YmUuY29tIyMranModXNlci15dC1zYWJyLWZpeC5qcylgCi8vIDYuIEdvIHRvIFlvdVR1YmUgYW5kIHRlc3QKCihmdW5jdGlvbigpIHsKICAgIGNvbnN0IERFQlVHID0gZmFsc2U7CiAgICBjb25zdCBMT0dfUFJFRklYID0gJ1t5dC1zYWJyLWZpeF0nOwogICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IGVsYXBzZWQgPSAoKSA9PiAoKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMCkudG9GaXhlZCgyKSArICdzJzsKICAgIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7IGlmIChERUJVRykgY29uc29sZS5sb2coTE9HX1BSRUZJWCwgZWxhcHNlZCgpLCAuLi5hcmdzKTsgfTsKCiAgICAvLyBQcmVtaXVtIGFjY291bnRzIGhhdmUgbm8gYWRzIGFuZCBubyBiYWNrb2ZmLCBub3RoaW5nIHRvIGRvLgogICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EjbG9nb1t0aXRsZSo9IlByZW1pdW0iIGldJykpIHJldHVybjsKCiAgICAvLyBQcm9uZyAxOiBPbiBTUEEgbmF2aWdhdGlvbiwgZm9yY2UgYSBuZXcgYWQtZnJlZSBTQUJSIHNlc3Npb24uCiAgICAvLyBTZXQgaXNJbmxpbmVQbGF5YmFja05vQWQgb24gdGhlIHZpZGVvIGRhdGEgc28gdGhlIG5ldyBzZXNzaW9uCiAgICAvLyBkb2Vzbid0IGdldCBhbiBhZCBzbG90LCB0aGVuIHRlYXIgZG93biB0aGUgb2xkIHNlc3Npb24gYW5kIHN0YXJ0IGZyZXNoLgogICAgLy8gSW5pdGlhbGl6ZSB0byB0aGUgY3VycmVudCB2aWQgc28gdGhlIGluaXRpYWwgeXQtbmF2aWdhdGUtZmluaXNoCiAgICAvLyAod2hpY2ggZmlyZXMgb24gcGFnZSBsb2FkIGNvbXBsZXRpb24sIG5vdCBqdXN0IFNQQSBuYXYpIGlzIHRyZWF0ZWQKICAgIC8vIGFzIGEgZHVwbGljYXRlIGFuZCBza2lwcGVkLiBBdm9pZHMgdGVhcmluZyBkb3duIHBsYXliYWNrIG9uIHJlZnJlc2guCiAgICAvLyBXZSBza2lwIHRlYXJkb3duIHdoZW4gdGhlcmUncyBubyBwcmlvciBzZXNzaW9uIHRvIGNsZWFyLgogICAgbGV0IGxhc3RSZWxvYWRlZFZpZCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKSB8fCAnJzsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1uYXZpZ2F0ZS1maW5pc2gnLCAoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkIHx8IHZpZCA9PT0gbGFzdFJlbG9hZGVkVmlkKSByZXR1cm47CiAgICAgICAgY29uc3QgaGFkUHJpb3JTZXNzaW9uID0gbGFzdFJlbG9hZGVkVmlkICE9PSAnJzsKICAgICAgICBsYXN0UmVsb2FkZWRWaWQgPSB2aWQ7CiAgICAgICAgaWYgKCFoYWRQcmlvclNlc3Npb24pIHJldHVybjsKCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgICAgICAgaWYgKCFwbGF5ZXI/LmNhbmNlbFBsYXliYWNrIHx8ICFwbGF5ZXI/LmxvYWRWaWRlb0J5SWQpIHJldHVybjsKCiAgICAgICAgICAgIC8vIFNldCB0aGUgbm8tYWQgZmxhZyBiZWZvcmUgcmVsb2FkaW5nIHNvIHRoZSBuZXcgc2Vzc2lvbiBwaWNrcyBpdCB1cAogICAgICAgICAgICBjb25zdCB2ZCA9IHBsYXllci5nZXRWaWRlb0RhdGE/LigpOwogICAgICAgICAgICBpZiAodmQpIHZkLmlzSW5saW5lUGxheWJhY2tOb0FkID0gdHJ1ZTsKCiAgICAgICAgICAgIHBsYXllci5jYW5jZWxQbGF5YmFjaygpOwogICAgICAgICAgICBwbGF5ZXIubG9hZFZpZGVvQnlJZCh2aWQpOwogICAgICAgICAgICBsb2coJ2ZvcmNlZCBuZXcgU0FCUiBzZXNzaW9uIGZvcicsIHZpZCk7CiAgICAgICAgfSwgMTAwKTsKICAgIH0pOwoKICAgIC8vIFByb25nIDI6IEludGVyY2VwdCBTQUJSIHJlc3BvbnNlcyBhbmQgcGF0Y2ggYmFja29mZlRpbWVNcy4KICAgIC8vIFRlZSB0aGUgYm9keSBzbyBtZWRpYSBjaHVua3MgKD49MTAwMCBieXRlcykgcGFzcyB0aHJvdWdoIHVudG91Y2hlZAogICAgLy8g4oCUIG9ubHkgdGhlIHNtYWxsIGNvbnRyb2wgbWVzc2FnZXMgY2FycnlpbmcgdGhlIGJhY2tvZmYgZmllbGQgZ2V0CiAgICAvLyBidWZmZXJlZCBhbmQgcmUtZW1pdHRlZCBhcyBhIHN5bnRoZXNpemVkIFJlc3BvbnNlLgogICAgY29uc3QgcmVhbEZldGNoID0gd2luZG93LmZldGNoOwoKICAgIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uKHJlc291cmNlLCBpbml0KSB7CiAgICAgICAgY29uc3QgdXJsID0gdHlwZW9mIHJlc291cmNlID09PSAnc3RyaW5nJyA/IHJlc291cmNlIDogKHJlc291cmNlPy51cmwgfHwgJycpOwoKICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdnb29nbGV2aWRlby5jb20nKSAmJiB1cmwuaW5jbHVkZXMoJ3NhYnI9MScpKSB7CiAgICAgICAgICAgIGxldCBybiA9ICcnOwogICAgICAgICAgICB0cnkgeyBybiA9IG5ldyBVUkwodXJsKS5zZWFyY2hQYXJhbXMuZ2V0KCdybicpIHx8ICcnOyB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgIGxvZygnU0FCUiBmZXRjaCBybj0nICsgcm4pOwoKICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgIXJlc3BvbnNlLmJvZHkpIHJldHVybiByZXNwb25zZTsKICAgICAgICAgICAgICAgIC8vIFRlZSBkZWZlbnNpdmVseTogaWYgaXQgdGhyb3dzIChsb2NrZWQgc3RyZWFtLCBicm93c2VyIHF1aXJrKSwKICAgICAgICAgICAgICAgIC8vIGhhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGJhY2sgdG8gYXZvaWQgYnJlYWtpbmcgdGhlIHZpZGVvIGVudGlyZWx5LgogICAgICAgICAgICAgICAgbGV0IHBhc3MsIHNjYW4sIHJlaW5pdDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgW3Bhc3MsIHNjYW5dID0gcmVzcG9uc2UuYm9keS50ZWUoKTsKICAgICAgICAgICAgICAgICAgICByZWluaXQgPSB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LCBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzIH07CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0oc2Nhbi5nZXRSZWFkZXIoKSwgMTAwMCkudGhlbihmdW5jdGlvbihieXRlcykgewogICAgICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1NBQlIgZG9uZSBybj0nICsgcm4pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHBhc3MsIHJlaW5pdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvZygnc21hbGwgcmVzcG9uc2Ugcm49JyArIHJuLCAnc2l6ZT0nICsgYnl0ZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBwYXRjaEJhY2tvZmZGaWVsZChieXRlcywgcm4pOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IG5ldyBSZXNwb25zZShieXRlcywgcmVpbml0KTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2UudXJsLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvdXQsICd0eXBlJywgeyB2YWx1ZTogcmVzcG9uc2UudHlwZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkge30KICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIC8vIElmIGFueXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIHN0cmVhbWluZy9wYXRjaGluZywgYmFpbCBvdXQgYW5kIHBhc3MgdGhyb3VnaCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHBhc3MsIHJlaW5pdCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwoKICAgIC8vIFJlYWQgYSBzdHJlYW0gaW50byBhIFVpbnQ4QXJyYXkuIElmIGVhcmx5RXhpdFRocmVzaG9sZCBpcyBzZXQgYW5kIHRoZQogICAgLy8gYWNjdW11bGF0ZWQgYnl0ZXMgY3Jvc3MgaXQsIGNhbmNlbCB0aGUgcmVhZGVyIGFuZCByZXR1cm4gbnVsbCDigJQgdXNlZAogICAgLy8gdG8gYmFpbCBvdXQgb2YgYnVmZmVyaW5nIHdoZW4gdGhlIHJlc3BvbnNlIGlzIGNsZWFybHkgYSBtZWRpYSBjaHVuawogICAgLy8gYW5kIHNob3VsZCBzdHJlYW0gc3RyYWlnaHQgdG8gdGhlIHBsYXllciBpbnN0ZWFkLgogICAgZnVuY3Rpb24gcmVhZFN0cmVhbShyZWFkZXIsIGVhcmx5RXhpdFRocmVzaG9sZCkgewogICAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiBwdW1wKHJlc3VsdCkgewogICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IG5ldyBVaW50OEFycmF5KHRvdGFsKTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmYgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgb2ZmICs9IGNodW5rc1tpXS5sZW5ndGgsIGkrKykKICAgICAgICAgICAgICAgICAgICBtZXJnZWQuc2V0KGNodW5rc1tpXSwgb2ZmKTsKICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2h1bmtzLnB1c2gocmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgdG90YWwgKz0gcmVzdWx0LnZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGVhcmx5RXhpdFRocmVzaG9sZCAmJiB0b3RhbCA+PSBlYXJseUV4aXRUaHJlc2hvbGQpIHsKICAgICAgICAgICAgICAgIHRyeSB7IHJlYWRlci5jYW5jZWwoKTsgfSBjYXRjaChlKSB7fQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCkudGhlbihwdW1wKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvLyBTY2FuIGZvciBwcm90b2J1ZiBmaWVsZCA0IChiYWNrb2ZmVGltZU1zKSBhbmQgcmV3cml0ZSB2YWx1ZXMgPiA1MDBtcwogICAgLy8gdG8gYSBzbWFsbCByYW5kb20gdmFsdWUgKDUwLTE1MG1zLCBsb29rcyBsaWtlIG5hdHVyYWwgYmFja29mZiBub2lzZQogICAgLy8gcmF0aGVyIHRoYW4gYSBjbGVhbiB6ZXJvKS4gUHJvdG9idWYgd2lyZSBmb3JtYXQ6IGZpZWxkIDQsIHdpcmUgdHlwZQogICAgLy8gMCAodmFyaW50KSA9IHRhZyBieXRlIDB4MjAgKGZpZWxkX251bWJlciA8PCAzIHwgd2lyZV90eXBlID0gNCA8PCAzCiAgICAvLyB8IDApLiBUaGUgdmFyaW50IHVzZXMgNyBiaXRzIHBlciBieXRlIHdpdGggMHg4MCBhcyBjb250aW51YXRpb24KICAgIC8vIGZsYWcuIFdlIHJld3JpdGUgdGhlIHZhcmludCBpbiBwbGFjZSwga2VlcGluZyB0aGUgc2FtZSBieXRlIGNvdW50CiAgICAvLyBzbyB0aGUgbWVzc2FnZSBzdHJ1Y3R1cmUgc3RheXMgdmFsaWQuCiAgICBmdW5jdGlvbiBwYXRjaEJhY2tvZmZGaWVsZChieXRlcywgcm4pIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aCAtIDI7IGkrKykgewogICAgICAgICAgICBpZiAoYnl0ZXNbaV0gIT09IDB4MjApIGNvbnRpbnVlOwogICAgICAgICAgICBsZXQgdmFsID0gMCwgc2hpZnQgPSAwLCBlbmQgPSBpICsgMTsKICAgICAgICAgICAgd2hpbGUgKGVuZCA8IGJ5dGVzLmxlbmd0aCAmJiBzaGlmdCA8IDM1KSB7CiAgICAgICAgICAgICAgICB2YWwgfD0gKGJ5dGVzW2VuZF0gJiAweDdmKSA8PCBzaGlmdDsKICAgICAgICAgICAgICAgIGlmICghKGJ5dGVzW2VuZF0gJiAweDgwKSkgeyBlbmQrKzsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7CiAgICAgICAgICAgICAgICBlbmQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFsID4gNTAwICYmIHZhbCA8IDEwMDAwMCkgewogICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gNTAgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDApOwogICAgICAgICAgICAgICAgbG9nKCdQQVRDSCBiYWNrb2ZmPScgKyB2YWwgKyAnbXMg4oaSICcgKyB0YXJnZXQgKyAnbXMgYXQgb2Zmc2V0PScgKyBpLCAncm49JyArIHJuKTsKICAgICAgICAgICAgICAgIGxldCBwb3MgPSBpICsgMSwgcmVtYWluaW5nID0gdGFyZ2V0OwogICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGVuZCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBieXRlc1twb3MrK10gPSAocmVtYWluaW5nICYgMHg3ZikgfCAweDgwOwogICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA+Pj49IDc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBieXRlc1twb3NdID0gcmVtYWluaW5nICYgMHg3ZjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoREVCVUcpIHsKICAgICAgICBsZXQgbGFzdFJTID0gLTE7CiAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICBpZiAoIXYpIHJldHVybjsKICAgICAgICAgICAgaWYgKHYucmVhZHlTdGF0ZSAhPT0gbGFzdFJTKSB7CiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2LmJ1ZmZlcmVkLmxlbmd0aCA+IDAgPyB2LmJ1ZmZlcmVkLmVuZCgwKS50b0ZpeGVkKDEpIDogJzAnOwogICAgICAgICAgICAgICAgbG9nKCdWSURFTyBycz0nICsgdi5yZWFkeVN0YXRlLCAnY3Q9JyArIHYuY3VycmVudFRpbWUudG9GaXhlZCgxKSwgJ2J1Zj0nICsgYnVmLCB2LnBhdXNlZCA/ICdwYXVzZWQnIDogJ3BsYXlpbmcnKTsKICAgICAgICAgICAgICAgIGxhc3RSUyA9IHYucmVhZHlTdGF0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDIwMCk7CiAgICB9CgogICAgbG9nKCdsb2FkZWQnKTsKfSkoKTsKCg=="},{"name":"brave-youtube-playback-speed-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXlvdXR1YmUtcGxheWJhY2stc3BlZWQtZml4LmpzCi8vIFRoaXMgc2NyaXB0IGlzIGluamVjdGVkIGludG8gWW91VHViZSBwYWdlcyB0byB3b3JrIGFyb3VuZCBhIFlvdVR1YmUgYnVnIHdoZXJlCi8vIHRoZSBwbGF5YmFjayBzcGVlZCB3aWxsIG9ubHkgc2F2ZSBmb3IgZnV0dXJlIHZpZGVvcyB3aGVuIHVzaW5nIHRoZSBzbGlkZXIgY29udHJvbHMuCi8vIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHBsYXliYWNrIHNwZWVkIHVzaW5nIHRoZSBidXR0b25zLCB0aGUgbmV3IHNwZWVkIHdpbGwgbm90IGJlIHNhdmVkLgovLyBUaGlzIGNyZWF0ZWQgaXNzdWVzIHdoZXJlLCBpZiB0aGUgdXNlciBhZGp1c3RlZCB0aGUgc2xpZGVyLCBhbmQgdGhlbiBjbGlja2VkIHRoZSAxeCBidXR0b24gdG8KLy8gcmVzZXQgdGhlIHNwZWVkLCB0aGUgc3BlZWQgd291bGQgYmUgcmVzZXQgdG8gMXgsIGJ1dCB0aGVuIGFsbCBmdXR1cmUgdmlkZW9zIHdvdWxkIHBsYXkgYXQgdGhlCi8vIHByZXZpb3VzbHkgc2V0IHNwZWVkLiBUaGUgc2NyaXB0IHdvcmtzIGFyb3VuZCB0aGlzIGJ5IHNhdmluZyB0aGUgcGxheWJhY2sgc3BlZWQgdG8gc2Vzc2lvblN0b3JhZ2UKLy8gd2hlbmV2ZXIgaXQgY2hhbmdlcywgaW5zdGVhZCBvZiByZWx5aW5nIG9uIFlvdVR1YmUncyBkZWZhdWx0IGJlaGF2aW9yLgooZnVuY3Rpb24gKCkgewogIGNvbnN0IEtFWSA9ICd5dC1wbGF5ZXItcGxheWJhY2stcmF0ZSc7CiAgZnVuY3Rpb24gYXR0YWNoKHBsYXllcikgewogICAgaWYgKCFwbGF5ZXIgfHwgIXBsYXllci5hZGRFdmVudExpc3RlbmVyIHx8IHBsYXllci5fX3JhdGVIb29rZWQpIHJldHVybiBmYWxzZTsKICAgIHBsYXllci5fX3JhdGVIb29rZWQgPSB0cnVlOwogICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ29uUGxheWJhY2tSYXRlQ2hhbmdlJywgZnVuY3Rpb24gKHJhdGUpIHsKICAgICAgY29uc3QgdiA9ICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpID8gcmF0ZSA6IChyYXRlICYmIHJhdGUuZGF0YSkgPz8gcmF0ZTsKICAgICAgdHJ5IHsKICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKEtFWSwgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgZGF0YTogU3RyaW5nKHYpLAogICAgICAgICAgY3JlYXRpb246IERhdGUubm93KCkKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoIWF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICBjb25zdCBvbk5hdkZpbmlzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogIH0KfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIHZhZnQKICAgIC8vIGluc3RhbmNlIHRoYXQgZmlnaHRzIGZvciBwbGF5ZXIgY29udHJvbC4gT25seSB0aGUgdG9wIGZyYW1lIGhvc3RzIHRoZSBwbGF5ZXIgb24KICAgIC8vIHR3aXRjaC50di9DSEFOTkVMOyBuZXN0ZWQgYXV4aWxpYXJ5IGZyYW1lcyBhcmUgbm9pc2UuCiAgICAvLyBBbGxvdy1saXN0IGZvciBuZXN0ZWQtZnJhbWUgaW5qZWN0aW9uOiBUd2l0Y2gncyB0aHJlZSBkb2N1bWVudGVkIGVtYmVkIGNvbnRleHRzCiAgICAvLyAoaHR0cHM6Ly9kZXYudHdpdGNoLnR2L2RvY3MvZW1iZWQvdmlkZW8tYW5kLWNsaXBzLykg4oCUIHByZXNlcnZlcyBUd2l0Y2ggc3RyZWFtcwogICAgLy8gZW1iZWRkZWQgb24gdGhpcmQtcGFydHkgc2l0ZXMgd2hlcmUgdmFmdCBydW5zIGluIGFuIGlmcmFtZSB3aG9zZSBwYXJlbnQgaXMgb24KICAgIC8vIGEgZGlmZmVyZW50IG9yaWdpbi4KICAgIC8vIFVzZSB3aW5kb3cuZnJhbWVFbGVtZW50IHRvIGRldGVjdCBuZXN0ZWQgZnJhbWVzIOKAlCBudWxsIG9uIHRvcCBmcmFtZSwgdGhlIGlmcmFtZQogICAgLy8gZWxlbWVudCBvbiBhIHNhbWUtb3JpZ2luIG5lc3RlZCBmcmFtZSwgdGhyb3dzIG9uIGEgY3Jvc3Mtb3JpZ2luIG5lc3RlZCBmcmFtZS4KICAgIC8vIE1vcmUgcmVsaWFibGUgdGhhbiAnd2luZG93ICE9PSB3aW5kb3cudG9wJyBiZWNhdXNlIFRhbXBlcm1vbmtleSB3cmFwcyB3aW5kb3cgaW4gYQogICAgLy8gcHJveHkgd2hlcmUgdGhlIHN0cmljdCBjb21wYXJpc29uIGNhbiByZXR1cm4gdHJ1ZSBldmVuIG9uIHRoZSB0b3AgZnJhbWUuCiAgICBsZXQgX2lzTmVzdGVkID0gZmFsc2U7CiAgICB0cnkgeyBfaXNOZXN0ZWQgPSB3aW5kb3cuZnJhbWVFbGVtZW50ICE9PSBudWxsOyB9IGNhdGNoIChfZSkgeyBfaXNOZXN0ZWQgPSB0cnVlOyB9CiAgICBpZiAoX2lzTmVzdGVkKSB7CiAgICAgICAgY29uc3QgX2hvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfaXNFbWJlZENvbnRleHQgPSBfaG9zdCA9PT0gJ3BsYXllci50d2l0Y2gudHYnIHx8IF9ob3N0ID09PSAnZW1iZWQudHdpdGNoLnR2JyB8fCBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvZW1iZWQvJyk7CiAgICAgICAgaWYgKCFfaXNFbWJlZENvbnRleHQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmFmdCBza2lwcGVkIOKAlCBuZXN0ZWQgZnJhbWUgb24gJyArIF9ob3N0ICsgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgKyAnIChub3QgYSBUd2l0Y2ggZW1iZWQpLiBJZiB5b3Ugc2VlIHRoaXMgb24gdHdpdGNoLnR2L0NIQU5ORUwgdG9wIGZyYW1lLCBwbGVhc2UgcmVwb3J0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJ3VzZSBzdHJpY3QnOwogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gNTg7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2YWZ0IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZhZnQgdicgKyBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnIHNraXBwZWQg4oCUIGFub3RoZXIgc2NyaXB0IGFscmVhZHkgYWN0aXZlICh2JyArIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnKS4gUmVtb3ZlIGR1cGxpY2F0ZSBzY3JpcHRzLicpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb247CiAgICAvLyBDb25maWd1cmF0aW9uIGFuZCBzdGF0ZSBzaGFyZWQgYmV0d2VlbiB3aW5kb3cgYW5kIHdvcmtlciBzY29wZXMKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guIFRoZSBzcGVjaWZpYyB0d2l0Y2gtc3RpdGNoZWQtYWQgREFURVJBTkdFCiAgICAgICAgLy8gbWFya2VyIGlzIGEgc3Vic2V0IG9mIHRoaXMgcHJlZml4LgogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVycyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIiddOwogICAgICAgIHNjb3BlLkFkU2VnbWVudFVSTFBhdHRlcm5zID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24g4oCUIGZvcgogICAgICAgIC8vIGEgMTAwLWxpbmUgbTN1OCBhdCB+MiBwb2xscy9zZWMgZHVyaW5nIGFuIGFkIGJyZWFrLCBob2lzdGluZyB0aGUgVVJMCiAgICAgICAgLy8gcmV3cml0ZSBhbG9uZSBzYXZlcyB+MjAwIHJlZ2V4IGNvbXBpbGF0aW9ucyBwZXIgc2Vjb25kLgogICAgICAgIHNjb3BlLlR3aXRjaEFkVXJsUmV3cml0ZVJlZ2V4ID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVXJpQXR0cmlidXRlUmVnZXggPSAvVVJJPSIoW14iXSspIi87CiAgICAgICAgc2NvcGUuQ2xpZW50SUQgPSAna2ltbmU3OGt4M25jeDZicmdvNG12NndraTVoMWtvJzsKICAgICAgICBzY29wZS5CYWNrdXBQbGF5ZXJUeXBlcyA9IFsKICAgICAgICAgICAgLy8gT3JkZXIgbWF0dGVyczogZmlyc3QgY2xlYW4gdHlwZSB3aW5zLiAnZW1iZWQnIG1vdmVkIHRvIGVuZCDigJQgZmllbGQtb2JzZXJ2ZWQKICAgICAgICAgICAgLy8gVHdpdGNoIHJldHVybnMgR1FMICdzZXJ2ZXIgZXJyb3InIGZvciBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuIG9uIGVtYmVkIHdoZW4KICAgICAgICAgICAgLy8gcmVxdWVzdGVkIGZyb20gdHdpdGNoLnR2IG9yaWdpbiwgd2FzdGluZyB+MjAwLTQwMG1zIHBlciBicmVhayBhcyBmaXJzdC10cnkuCiAgICAgICAgICAgIC8vIEtlcHQgaW4gY2FzZSBpdCBldmVyIHN1Y2NlZWRzIG9uIHNvbWUgY2hhbm5lbC91c2VyIGNvbWJvLgogICAgICAgICAgICAnc2l0ZScsLy9Tb3VyY2UKICAgICAgICAgICAgJ3BvcG91dCcsLy9Tb3VyY2UKICAgICAgICAgICAgJ21vYmlsZV93ZWInLC8vTW9iaWxlCiAgICAgICAgICAgICdlbWJlZCcsLy9Tb3VyY2UgKHVucmVsaWFibGUg4oCUIHNlZSBub3RlIGFib3ZlKQogICAgICAgICAgICAvLyAnYXV0b3BsYXknICgzNjBwKSByZW1vdmVkOiB3aGVuIGNvbW1pdHRlZCBhcyBjeWNsZSBiYWNrdXAsIHRoZSBwbGF5ZXIgZ2V0cyBzdHVjawogICAgICAgICAgICAvLyBpbiBhbiBlbmRsZXNzIGxvYWRpbmcgY2lyY2xlIGFmdGVyIHRoZSBDU0FJLW9ubHkgcGF0aCByZWxlYXNlcyB0aGUgYmFja3VwIOKAlAogICAgICAgICAgICAvLyBhdXRvcGxheSB2YXJpYW50cyBkb24ndCB0cmFuc2l0aW9uIGNsZWFubHkgYmFjayB0byBtYWluIHN0cmVhbSB2YXJpYW50cy4KICAgICAgICAgICAgLy8ncGljdHVyZS1ieS1waWN0dXJlLUNBQ0hFRCcvLzM2MHAgKC1DQUNIRUQgaXMgYW4gaW50ZXJuYWwgc3VmZml4IGFuZCBpcyByZW1vdmVkKQogICAgICAgIF07CiAgICAgICAgc2NvcGUuRmFsbGJhY2tQbGF5ZXJUeXBlID0gJ3NpdGUnOy8vIHdhcyAnZW1iZWQnIOKAlCBzaXRlIGlzIG1vcmUgcmVsaWFibGUgd2hlbiBhbGwgU291cmNlIHR5cGVzIGVuZCB1cCBhZC1sYWRlbgogICAgICAgIHNjb3BlLkZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJ3BvcG91dCc7CiAgICAgICAgc2NvcGUuUHJlZmVyTG93UXVhbGl0eUJhY2t1cCA9IHRydWU7Ly8gSHlicmlkIHNhZmV0eSBuZXQgZm9yIFNTQUktaGVhdnkgYnJlYWtzOiBzdGlja3kgZXNjYXBlIGhhdGNoIChmaXJlcyBhZnRlciB+OHMgc3R1Y2sgaW4gYWxsLXN0cmlwcGVkIHN0YXRlKSArIGF1dG9wbGF5ICgzNjBwKSBhcyBsYXN0LXJlc29ydCBiYWNrdXAgd2hlbiBhbGwgU291cmNlIHR5cGVzIGFyZSBhZC1sYWRlbi4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX3ByZWZlckxvd1F1YWxpdHlCYWNrdXA9ZmFsc2UgdG8gZGlzYWJsZS4KICAgICAgICBzY29wZS5CYWNrdXBTd2FwRmlyc3QgPSB0cnVlOy8vIE9uIGFkIGRldGVjdCwgaW1tZWRpYXRlbHkgc3dhcCB0byBhIGJhY2t1cCBwbGF5ZXItdHlwZSBtM3U4IChUVFYtQUItc3R5bGUpLiBBdm9pZHMgTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkg4oCUIGZld2VyIGxvYWRpbmcgY2lyY2xlcyBpbiBmaWVsZC4gQ29zdDogZXh0cmEgZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhay4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX2JhY2t1cFN3YXBGaXJzdD1mYWxzZSB0byBkaXNhYmxlLgogICAgICAgIHNjb3BlLlNraXBQbGF5ZXJSZWxvYWRPbkhldmMgPSBmYWxzZTsvLyBJZiB0cnVlIHRoaXMgd2lsbCBza2lwIHBsYXllciByZWxvYWQgb24gc3RyZWFtcyB3aGljaCBoYXZlIDJrLzRrIHF1YWxpdHkgKGlmIHlvdSBlbmFibGUgdGhpcyBhbmQgeW91IHVzZSB0aGUgMmsvNGsgcXVhbGl0eSBzZXR0aW5nIHlvdSdsbCBnZXQgZXJyb3IgIzQwMDAgLyAjMzAwMCAvIHNwaW5uaW5nIHdoZWVsIG9uIGNocm9tZSBiYXNlZCBicm93c2VycykKICAgICAgICBzY29wZS5BbHdheXNSZWxvYWRQbGF5ZXJPbkFkID0gZmFsc2U7Ly8gQWx3YXlzIHBhdXNlL3BsYXkgd2hlbiBlbnRlcmluZy9sZWF2aW5nIGFkcwogICAgICAgIHNjb3BlLlJlbG9hZFBsYXllckFmdGVyQWQgPSB0cnVlOy8vIEFmdGVyIHRoZSBhZCBmaW5pc2hlcyBkbyBhIHBsYXllciByZWxvYWQgaW5zdGVhZCBvZiBwYXVzZS9wbGF5CiAgICAgICAgc2NvcGUuUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gMzA7Ly8gTWluaW11bSBzZWNvbmRzIGJldHdlZW4gcmVsb2FkcyDigJQgYnJlYWtzIENTQUkgY2FzY2FkZXMgdHJpZ2dlcmVkIGJ5IHJlbG9hZAogICAgICAgIHNjb3BlLkRpc2FibGVSZWxvYWRDYXAgPSBmYWxzZTsvLyBJZiB0cnVlLCBidWZmZXIgbW9uaXRvciByZWxvYWRzIHVubGltaXRlZCB0aW1lcyAocHJlLXY0NyBiZWhhdmlvciwgcmlzayBvZiBjYXNjYWRlKQogICAgICAgIHNjb3BlLkRyaWZ0Q29ycmVjdGlvblJhdGUgPSAxLjE7Ly8gUGxheWJhY2sgcmF0ZSBmb3IgY2F0Y2hpbmcgdXAgdG8gbGl2ZSBlZGdlIGFmdGVyIHJlbG9hZCAoMCA9IGRpc2FibGUgZHJpZnQgY29ycmVjdGlvbikKICAgICAgICBzY29wZS5FYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSA1Oy8vIE51bWJlciBvZiBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIHRyaWdnZXJpbmcgZWFybHkgcmVsb2FkIChlYWNoIHBvbGwgfjJzLCBzbyA1ID0gfjEwcywgMyA9IH42cywgMTAgPSB+MjBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gdHJ1ZTsvLyBSZW1lbWJlciB3aGljaCBiYWNrdXAgcGxheWVyIHR5cGUgd29ya2VkIGFuZCB0cnkgaXQgZmlyc3Qgb24gbmV4dCBhZCBicmVhawogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1RpbWUgPSAxNTAwOwogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1BsYXllckluZGV4ID0gMjsvL2F1dG9wbGF5CiAgICAgICAgc2NvcGUuSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3MgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHNjb3BlLlN0cmVhbUluZm9zQnlVcmwgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHNjb3BlLkdRTERldmljZUlEID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRWZXJzaW9uID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRTZXNzaW9uID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBudWxsOwogICAgICAgIHNjb3BlLkF1dGhvcml6YXRpb25IZWFkZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgc2NvcGUuU2ltdWxhdGVkQWRzRGVwdGggPSAwOwogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ0ZpeCA9IHRydWU7Ly8gSWYgdHJ1ZSB0aGlzIHdpbGwgcGF1c2UvcGxheSB0aGUgcGxheWVyIHdoZW4gaXQgZ2V0cyBzdHVjayBidWZmZXJpbmcKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEZWxheSA9IDYwMDsvLyBIb3cgb2Z0ZW4gc2hvdWxkIHdlIGNoZWNrIHRoZSBwbGF5ZXIgc3RhdGUgKGluIG1pbGxpc2Vjb25kcykKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdTYW1lU3RhdGVDb3VudCA9IDM7Ly8gSG93IG1hbnkgdGltZXMgb2Ygc2VlaW5nIHRoZSBzYW1lIHBsYXllciBzdGF0ZSB1bnRpbCB3ZSB0cmlnZ2VyIHBhdXNlL3BsYXkgKGl0IHdpbGwgb25seSB0cmlnZ2VyIGl0IG9uZSB0aW1lIHVudGlsIHRoZSBwbGF5ZXIgc3RhdGUgY2hhbmdlcyBhZ2FpbikKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEYW5nZXJab25lID0gMTsvLyBUaGUgYnVmZmVyaW5nIHRpbWUgbGVmdCAoaW4gc2Vjb25kcykgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBwbGF5ZXJzIHBsYXliYWNrIHBvc2l0aW9uIGluIHRoZSBwbGF5ZXIgc3RhdGUgY2hlY2sKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZCA9IGZhbHNlOy8vIElmIHRydWUgdGhpcyB3aWxsIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkgKHBsYXllciByZWxvYWRpbmcgaXMgYmV0dGVyIGF0IGZpeGluZyB0aGUgcGxheWJhY2sgaXNzdWVzIGJ1dCBpdCB0YWtlcyBzbGlnaHRseSBsb25nZXIpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgPSA4MDAwOy8vIE1pbmltdW0gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmV0d2VlbiBlYWNoIHBhdXNlL3BsYXkgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlciBwcmVzc2luZyBwYXVzZS9wbGF5IHdoZW4gdGhlcmUgYXJlIGdlbnVpbmUgYnVmZmVyaW5nIHByb2JsZW1zKQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgPSBmYWxzZTsvLyBFbmFibGUgdGhpcyBpZiB5b3UncmUgZ2V0dGluZyBhbiBpbW1lZGlhdGUgcGF1c2UvcGxheS9yZWxvYWQgYXMgeW91IG9wZW4gYSBzdHJlYW0gKHdoaWNoIGlzIGNhdXNpbmcgdGhlIHN0cmVhbSB0byB0YWtlIGxvbmdlciB0byBsb2FkKS4gT25lIHByb2JsZW0gd2l0aCB0aGlzIGJlaW5nIHRydWUgaXMgdGhhdCBpdCBjYW4gY2F1c2UgdGhlIHBsYXllciB0byBnZXQgc3R1Y2sgaW4gc29tZSBpbnN0YW5jZXMgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIHByZXNzIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQgPSA1Oy8vIEhvdyBmYXIgdGhlIHN0cmVhbSBuZWVkIHRvIG1vdmUgYmVmb3JlIGRvaW5nIHRoZSBidWZmZXJpbmcgbWl0aWdhdGlvbiAoZGVwZW5kcyBvbiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tFbmFibGVkIGJlaW5nIHRydWUpCiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb01heEFnZU1zID0gMzAgKiA2MCAqIDEwMDA7CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgaW4gc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVsZXRlIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBFbmNvZGluZ3NNM1U4OiBlbmNvZGluZ3NNM3U4LAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgICAgIFJlc29sdXRpb25MaXN0OiBbXSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIE1vZGlmaWVkTTNVODogbnVsbCwKICAgICAgICAgICAgSXNVc2luZ01vZGlmaWVkTTNVODogZmFsc2UsCiAgICAgICAgICAgIElzU2hvd2luZ0FkOiBmYWxzZSwKICAgICAgICAgICAgSXNNaWRyb2xsOiBmYWxzZSwKICAgICAgICAgICAgQWRCcmVha1N0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgUG9kTGVuZ3RoOiAxLAogICAgICAgICAgICBIYXNDb25maXJtZWRBZEF0dHJzOiBmYWxzZSwKICAgICAgICAgICAgQ2xlYW5QbGF5bGlzdENvdW50OiAwLAogICAgICAgICAgICBDb25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrczogMCwKICAgICAgICAgICAgQ3NhaU9ubHlUaGlzQnJlYWs6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIEZyZWV6ZVN0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBUb3RhbEFsbFN0cmlwcGVkUG9sbHM6IDAsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZU0zVTg6IG51bGwsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQ6IDAsCiAgICAgICAgICAgIEJhY2t1cEVuY29kaW5nc00zVThDYWNoZTogW10sCiAgICAgICAgICAgIEFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IG51bGwsCiAgICAgICAgICAgIFBpbm5lZEJhY2t1cFBsYXllclR5cGU6IG51bGwsCiAgICAgICAgICAgIExhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBGYWlsZWRCYWNrdXBQbGF5ZXJUeXBlczogbmV3IE1hcCgpLAogICAgICAgICAgICBMb2dnZWRCYWNrdXBBZHNCeVR5cGU6IG51bGwsCiAgICAgICAgICAgIEN5Y2xlUmVzY3VlZFRoaXNCcmVhazogZmFsc2UsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQ291bnQ6IDAsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQXRQb2xsOiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZFRyaWdnZXJlZDogZmFsc2UsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQ6IGZhbHNlLAogICAgICAgICAgICBFc2NhcGVIYXRjaEZpcmVkOiBmYWxzZSwKICAgICAgICAgICAgTGFzdFBsYXllclJlbG9hZDogMCwKICAgICAgICAgICAgUmVsb2FkVGltZXN0YW1wczogW10sCiAgICAgICAgICAgIEhhc0NoZWNrZWRVbmtub3duVGFnczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gbWFza0FzTmF0aXZlKGZuLCBuYW1lKSB7CiAgICAgICAgZm4udG9TdHJpbmcgPSAoKSA9PiAnZnVuY3Rpb24gJyArIG5hbWUgKyAnKCkgeyBbbmF0aXZlIGNvZGVdIH0nOwogICAgICAgIHJldHVybiBmbjsKICAgIH0KICAgIGNvbnN0IGxvZ2dlZENzYWlUeXBlcyA9IG5ldyBTZXQoKTsKICAgIGxldCBpc0FjdGl2ZWx5U3RyaXBwaW5nQWRzID0gZmFsc2U7CiAgICBsZXQgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IGZhbHNlOwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgbGV0IGNhY2hlZFJvb3ROb2RlID0gbnVsbDsvLyBDYWNoZWQgI3Jvb3QgRE9NIGVsZW1lbnQgKG5ldmVyIGNoYW5nZXMgaW4gUmVhY3QgU1BBcykKICAgIGxldCBjYWNoZWRQbGF5ZXJSb290RGl2ID0gbnVsbDsvLyBDYWNoZWQgLnZpZGVvLXBsYXllciBlbGVtZW50CiAgICAvLyBPbmUtc2hvdCBmbGFncyBmb3Igb3ZlcmxheS1oaWRlIGxvZ3MuIFR3aXRjaCdzIFJlYWN0IHRyZWUgcmUtbW91bnRzIFNEQQogICAgLy8gd3JhcHBlcnMgYW5kIGFkLWJyZWFrIGNhcmRzIGNvbnN0YW50bHkgZHVyaW5nIGFuIGFkIGJyZWFrLCBzbyB0aGUKICAgIC8vIGhpZGUtYW5kLWxvZyBmaXJlcyBodW5kcmVkcyBvZiB0aW1lcy4gTG9nIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKICAgIC8vIGhpZGUgdHlwZSBwZXIgcGFnZSBsb2FkLCB0aGVuIHN0YXkgc2lsZW50IOKAlCB0aGUgaGlkZSBpdHNlbGYgc3RpbGwgcnVucwogICAgLy8gb24gZXZlcnkgdGljayB2aWEgZGF0YXNldC1iYXNlZCBkZWR1cC4KICAgIGxldCBsb2dnZWRTZGFIaWRlID0gZmFsc2U7CiAgICAvLyBTdHJpbmdzIHVzZWQgdG8gZGV0ZWN0IGFuZCBoYW5kbGUgY29uZmxpY3RpbmcgVHdpdGNoIHdvcmtlciBvdmVycmlkZXMgKGUuZy4gVHdpdGNoTm9TdWIpCiAgICBjb25zdCB3b3JrZXJTdHJpbmdDb25mbGljdHMgPSBbCiAgICAgICAgJ3R3aXRjaCcsCiAgICAgICAgJ2lzVmFyaWFudEEnLy8gVHdpdGNoTm9TdWIKICAgIF07CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICAvLyBXYWxrIHRoZSBXb3JrZXIgcHJvdG90eXBlIGNoYWluIGFuZCByZW1vdmUgY29uZmxpY3Rpbmcgb3ZlcnJpZGVzCiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocGFyZW50LCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOwogICAgICAgICAgICBwYXJlbnQgPSByZWluc2VydFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVmFsaWRXb3JrZXIod29ya2VyKSB7CiAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gd29ya2VyLnRvU3RyaW5nKCk7CiAgICAgICAgY29uc3QgaGFzQ29uZmxpY3QgPSB3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBjb25zdCBoYXNSZWluc2VydCA9IHdvcmtlclN0cmluZ1JlaW5zZXJ0LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgaWYgKGhhc0NvbmZsaWN0ICYmICFoYXNSZWluc2VydCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgcmVqZWN0ZWQg4oCUIGNvbmZsaWN0IHN0cmluZyBmb3VuZDogJyArIHdvcmtlclN0cmluZ0NvbmZsaWN0cy5maWx0ZXIoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkuam9pbignLCAnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhaGFzQ29uZmxpY3QgfHwgaGFzUmVpbnNlcnQ7CiAgICB9CiAgICAvLyBSZXBsYWNlIHdpbmRvdy5Xb3JrZXIgdG8gaW50ZXJjZXB0IFR3aXRjaCdzIHZpZGVvIHdvcmtlciBhbmQgaW5qZWN0IGFkLWJsb2NraW5nIGxvZ2ljCiAgICBsZXQgaW5qZWN0ZWRCbG9iVXJsID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgLy8gUHJldmVudCBUd2l0Y2ggZnJvbSByZXZva2luZyBvdXIgaW5qZWN0ZWQgd29ya2VyIGJsb2IgVVJMCiAgICAgICAgaWYgKCFVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkKSB7CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gVVJMLnJldm9rZU9iamVjdFVSTDsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwgPT09IGluamVjdGVkQmxvYlVybCkgcmV0dXJuOwogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMLmNhbGwodGhpcywgdXJsKTsKICAgICAgICAgICAgfSwgJ3Jldm9rZU9iamVjdFVSTCcpOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVpbnNlcnQgPSBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod2luZG93Lldvcmtlcik7CiAgICAgICAgY29uc3QgY2xlYW5Xb3JrZXIgPSBnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIGNsZWFuV29ya2VyIHsKICAgICAgICAgICAgY29uc3RydWN0b3IodHdpdGNoQmxvYlVybCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgbGV0IGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gbmV3IFVSTCh0d2l0Y2hCbG9iVXJsKS5vcmlnaW4uZW5kc1dpdGgoJy50d2l0Y2gudHYnKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghaXNUd2l0Y2hXb3JrZXIpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBOb24tVHdpdGNoIHdvcmtlciBza2lwcGVkOiAnICsgdHdpdGNoQmxvYlVybCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUHJlLWNoZWNrOiB2ZXJpZnkgd2UgY2FuIGZldGNoIHRoZSB3b3JrZXIgSlMgYmVmb3JlIGluamVjdGluZwogICAgICAgICAgICAgICAgbGV0IHByZWZldGNoZWRXb3JrZXJKcyA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgeyBwcmVmZXRjaGVkV29ya2VySnMgPSBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghcHJlZmV0Y2hlZFdvcmtlckpzKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFpbGVkIHRvIGZldGNoIHdvcmtlciBKUyDigJQgZmFsbGluZyBiYWNrIHRvIHVubW9kaWZpZWQgd29ya2VyJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGludGVyY2VwdGVkIOKAlCBpbmplY3RpbmcgYWQtYmxvY2sgaG9va3MnKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ0ZldGNoUmVxdWVzdHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgJHtoYXNBZFRhZ3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldE1hdGNoZWRBZFNpZ25pZmllcnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3N0cmlwQWRTZWdtZW50cy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJvY2Vzc00zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2hvb2tXb3JrZXJGZXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7ZGVjbGFyZU9wdGlvbnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldEFjY2Vzc1Rva2VuLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtncWxSZXF1ZXN0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwYXJzZUF0dHJpYnV0ZXMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFdhc21Xb3JrZXJKcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U2VydmVyVGltZUZyb21NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtyZXBsYWNlU2VydmVyVGltZUluTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJ1bmVTdHJlYW1JbmZvcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Y3JlYXRlU3RyZWFtSW5mby50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IGdldFdhc21Xb3JrZXJKcygnJHt0d2l0Y2hCbG9iVXJsLnJlcGxhY2VBbGwoIiciLCAiJTI3Iil9Jyk7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZU9wdGlvbnMoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCA9IHNldEludGVydmFsKHBydW5lU3RyZWFtSW5mb3MsIDUgKiA2MCAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJHtSZWxvYWRQbGF5ZXJBZnRlckFkfTsKICAgICAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSAke1JlbG9hZENvb2xkb3duU2Vjb25kc307CiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9ICR7RGlzYWJsZVJlbG9hZENhcH07CiAgICAgICAgICAgICAgICAgICAgRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gJHtFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGR9OwogICAgICAgICAgICAgICAgICAgIFBpbkJhY2t1cFBsYXllclR5cGUgPSAke1BpbkJhY2t1cFBsYXllclR5cGV9OwogICAgICAgICAgICAgICAgICAgIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPSAke1ByZWZlckxvd1F1YWxpdHlCYWNrdXB9OwogICAgICAgICAgICAgICAgICAgIEJhY2t1cFN3YXBGaXJzdCA9ICR7QmFja3VwU3dhcEZpcnN0fTsKICAgICAgICAgICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9ICcke0ZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlfSc7CiAgICAgICAgICAgICAgICAgICAgR1FMRGV2aWNlSUQgPSAke0dRTERldmljZUlEID8gIiciICsgR1FMRGV2aWNlSUQgKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uSGVhZGVyID0gJHtBdXRob3JpemF0aW9uSGVhZGVyID8gIiciICsgQXV0aG9yaXphdGlvbkhlYWRlciArICInIiA6IHVuZGVmaW5lZH07CiAgICAgICAgICAgICAgICAgICAgQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gJHtDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAiJyIgKyBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gJHtDbGllbnRWZXJzaW9uID8gIiciICsgQ2xpZW50VmVyc2lvbiArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIENsaWVudFNlc3Npb24gPSAke0NsaWVudFNlc3Npb24gPyAiJyIgKyBDbGllbnRTZXNzaW9uICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50VmVyc2lvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFZlcnNpb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50U2Vzc2lvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFNlc3Npb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50SWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJRCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVEZXZpY2VJZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdGZXRjaFJlc3BvbnNlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXNwb25zZURhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIHRpbWVvdXRJZCB9ID0gcGVuZGluZ0ZldGNoUmVxdWVzdHMuZ2V0KHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHJlc3BvbnNlRGF0YS5lcnJvcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSByZXNwb25zZSBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IHRha2VzIHN0YXR1cy9zdGF0dXNUZXh0L2hlYWRlcnMg4oCUIHVybC9yZWRpcmVjdGVkL3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZS4gSVZTIFdBU00gdmFsaWRhdGVzIHRoZXNlIChTcGFkZS90cmFja2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cykgYW5kIHRocm93cyBOZXR3b3JrRXJyb3IgaWYgdGhleSdyZSBtaXNzaW5nIOKAlCBUVFYtQUIgdjYuMy41IGZpeC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VEYXRhLmJvZHksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VEYXRhLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlRGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VEYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICd1cmwnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudXJsIHx8ICcnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICdyZWRpcmVjdGVkJywgeyB2YWx1ZTogISFyZXNwb25zZURhdGEucmVkaXJlY3RlZCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlRGF0YS50eXBlIHx8ICdiYXNpYycsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVHJpZ2dlcmVkUGxheWVyUmVsb2FkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdTaW11bGF0ZUFkcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRlZEFkc0RlcHRoID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpbXVsYXRlZEFkc0RlcHRoOiAnICsgU2ltdWxhdGVkQWRzRGVwdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyA9ICFBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOiAnICsgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGhvb2tXb3JrZXJGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgIGV2YWwod29ya2VyU3RyaW5nKTsKICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICAgICAgICBpbmplY3RlZEJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuZXdCbG9iU3RyXSkpOwogICAgICAgICAgICAgICAgc3VwZXIoaW5qZWN0ZWRCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUFkQmxvY2tCYW5uZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXIoZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgYmFja3VwIHN0cmVhbSBzd2l0Y2hlcyAoc3RhcnQgYW5kIGVuZCBvZiBhZCBicmVhaykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5oYXNBZHMgIT09ICEhcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QmFja3VwU3dpdGNoQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgcG9zaXRpb24gdHJhY2tpbmcgb24gYWQtZW5kIHNvIHRoZSBzdHJlYW0gc3dpdGNoIGdhcCBpc24ndCBkZXRlY3RlZCBhcyBhIGp1bXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5kYXRhLmhhc0FkcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pbkFkQnJlYWsgPSAhIWUuZGF0YS5oYXNBZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGRyaWZ0IGNhdGNoLXVwIHdoZW4gYWRzIHN0YXJ0IOKAlCBkb24ndCBydW4gMS4xeCBkdXJpbmcgYWQgaGFuZGxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5oYXNBZHMgJiYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsIHx8IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKS5wbGF5YmFja1JhdGUgPSAxLjA7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUGF1c2VSZXN1bWVQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdSZWxvYWRQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgZS5kYXRhLmtpbmQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYXN5bmMgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmtleSA9PSAnRmV0Y2hSZXF1ZXN0JykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFJlcXVlc3QgPSBldmVudC5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCBoYW5kbGVXb3JrZXJGZXRjaFJlcXVlc3QoZmV0Y2hSZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlc3BvbnNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZURhdGEKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBXb3JrZXIgY3Jhc2ggcmVjb3Zlcnkg4oCUIElWUyBXQVNNIHdvcmtlciBjYW4gZmlyZSBSdW50aW1lRXJyb3IKICAgICAgICAgICAgICAgIC8vIChlLmcuICJpbmRleCBvdXQgb2YgYm91bmRzIikgYW5kIGRpZS4gQSBzaW5nbGUgY3Jhc2ggZmlyZXMgbXVsdGlwbGUKICAgICAgICAgICAgICAgIC8vIGVycm9yIGV2ZW50czsgZGVkdXBlIHZpYSBhIGxvY2FsIGZsYWcuIE9uIGZpcnN0IGVycm9yLCB0cmlnZ2VyIGEKICAgICAgICAgICAgICAgIC8vIGhhcmQgcmVsb2FkIHZpYSB0aGUgbWFpbiByZWxvYWQgcGF0aCDigJQgVHdpdGNoIHJlLXNwYXducyB0aGUgd29ya2VyCiAgICAgICAgICAgICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBuZXcgcGxheWVyIGluc3RhbmNlLCBhbmQgZXhpc3RpbmcgcmVsb2FkIGNvb2xkb3duCiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50cyBydW5hd2F5IHJlc3RhcnQgbG9vcHMuCiAgICAgICAgICAgICAgICBsZXQgY3Jhc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyYXNoZWQpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBJVlMgV0FTTSB3b3JrZXIgY3Jhc2hlZDogJyArICgoZSAmJiBlLm1lc3NhZ2UpIHx8ICd1bmtub3duIGVycm9yJykgKyAnIOKAlCB0cmlnZ2VyaW5nIGhhcmQgcmVsb2FkIHRvIHJlY292ZXInKTsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUsICdlYXJseScpOyB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGNyYXNoIHJlY292ZXJ5IGZhaWxlZDogJyArIGVyci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbGV0IHdvcmtlckluc3RhbmNlID0gcmVpbnNlcnRXb3JrZXJzKG5ld1dvcmtlciwgcmVpbnNlcnQpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdXb3JrZXInLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VySW5zdGFuY2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkV29ya2VyKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdvcmtlckluc3RhbmNlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIHNldCB0d2l0Y2ggd29ya2VyIGRlbmllZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCkgewogICAgICAgIGlmICghZ2V0V2FzbVdvcmtlckpzLmNhY2hlKSB7CiAgICAgICAgICAgIGdldFdhc21Xb3JrZXJKcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0pIHsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc21Xb3JrZXJKcy5jYWNoZVt0d2l0Y2hCbG9iVXJsXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICBjb25zdCB0ZXh0ID0gcmVxLnJlc3BvbnNlVGV4dDsKICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0gPSB0ZXh0OwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgLy8gSG9vayBmZXRjaCgpIGluIHRoZSB3b3JrZXIgc2NvcGUgdG8gaW50ZXJjZXB0IG0zdTggcGxheWxpc3QgcmVxdWVzdHMgYW5kIGFkIHNlZ21lbnRzCiAgICBmdW5jdGlvbiBob29rV29ya2VyRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2hvb2tXb3JrZXJGZXRjaCAodmFmdCknKTsKICAgICAgICBjb25zdCBCTEFOS19NUDQgPSBuZXcgQmxvYihbVWludDhBcnJheS5mcm9tKGF0b2IoJ0FBQUFLR1owZVhCdGNEUXlBQUFBQVdsemIyMXRjRFF5WkdGemFHRjJZekZwYzI4MmFHeHpaZ0FBQkVsdGIyOTJBQUFBYkcxMmFHUUFBQUFBQUFBQUFBQUFBQUFBQVlhZ0FBQUFBQUFCQUFBQkFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUFCcUhSeVlXc0FBQUJjZEd0b1pBQUFBQU1BQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQVVSdFpHbGhBQUFBSUcxa2FHUUFBQUFBQUFBQUFBQUFBQUFBQUx1QUFBQUFBRlhFQUFBQUFBQXRhR1JzY2dBQUFBQUFBQUFBYzI5MWJnQUFBQUFBQUFBQUFBQUFBRk52ZFc1a1NHRnVaR3hsY2dBQUFBRHZiV2x1WmdBQUFCQnpiV2hrQUFBQUFBQUFBQUFBQUFBa1pHbHVaZ0FBQUJ4a2NtVm1BQUFBQUFBQUFBRUFBQUFNZFhKc0lBQUFBQUVBQUFDemMzUmliQUFBQUdkemRITmtBQUFBQUFBQUFBRUFBQUJYYlhBMFlRQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFnQVFBQUFBQUx1QUFBQUFBQUF6WlhOa2N3QUFBQUFEZ0lDQUlnQUJBQVNBZ0lBVVFCVUFBQUFBQUFBQUFBQUFBQVdBZ0lBQ0VaQUdnSUNBQVFJQUFBQVFjM1IwY3dBQUFBQUFBQUFBQUFBQUVITjBjMk1BQUFBQUFBQUFBQUFBQUJSemRITjZBQUFBQUFBQUFBQUFBQUFBQUFBQUVITjBZMjhBQUFBQUFBQUFBQUFBQWVWMGNtRnJBQUFBWEhScmFHUUFBQUFEQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQW9BQUFBRm9BQUFBQUFHQmJXUnBZUUFBQUNCdFpHaGtBQUFBQUFBQUFBQUFBQUFBQUE5Q1FBQUFBQUJWeEFBQUFBQUFMV2hrYkhJQUFBQUFBQUFBQUhacFpHVUFBQUFBQUFBQUFBQUFBQUJXYVdSbGIwaGhibVJzWlhJQUFBQUJMRzFwYm1ZQUFBQVVkbTFvWkFBQUFBRUFBQUFBQUFBQUFBQUFBQ1JrYVc1bUFBQUFIR1J5WldZQUFBQUFBQUFBQVFBQUFBeDFjbXdnQUFBQUFRQUFBT3h6ZEdKc0FBQUFvSE4wYzJRQUFBQUFBQUFBQVFBQUFKQmhkbU14QUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0FCYUFCSUFBQUFTQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdQLy9BQUFBT21GMlkwTUJUVUFlLytFQUkyZE5RQjZXVW9GQVgvTGdMVUJBUUZBQUFENkFBQTZtRGdBQUhvUUFBOUNXN3k0S0FRQUVhT3VQSUFBQUFCQnpkSFJ6QUFBQUFBQUFBQUFBQUFBUWMzUnpZd0FBQUFBQUFBQUFBQUFBRkhOMGMzb0FBQUFBQUFBQUFBQUFBQUFBQUFBUWMzUmpid0FBQUFBQUFBQUFBQUFBU0cxMlpYZ0FBQUFnZEhKbGVBQUFBQUFBQUFBQkFBQUFBUUFBQUM0QUFBQUFBb0FBQUFBQUFDQjBjbVY0QUFBQUFBQUFBQUlBQUFBQkFBQ0NOUUFBQUFBQ1FBQUEnKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpXSwge3R5cGU6ICd2aWRlby9tcDQnfSk7CiAgICAgICAgY29uc3QgcmVhbEZldGNoID0gZmV0Y2g7CiAgICAgICAgZmV0Y2ggPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuaGFzKHVybCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEJMQU5LX01QNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgnbTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSBhc3luYyBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYXdhaXQgcHJvY2Vzc00zVTgodXJsLCBhd2FpdCByZXNwb25zZS50ZXh0KCksIHJlYWxGZXRjaCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcnNlZFVybC5wYXRobmFtZS5tYXRjaCgvKFteXC9dKykoPz1cLlx3KyQpLyk/LlswXTsKICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ3BhcmVudF9kb21haW5zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlZFVybC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyVGltZSA9IGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCAhPSBudWxsICYmIChhd2FpdCByZWFsRmV0Y2goc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Lm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF0pKS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGVuY29kaW5ncyBhcmUgZGVhZCAodGhlIHN0cmVhbSBwcm9iYWJseSByZXN0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHJlbG9hZC1wZW5kaW5nIGZsYWcgZnJvbSBhIHByaW9yIHN0cmVhbSBzZXNzaW9uIOKAlCB3aXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVsb2FkIHRyaWdnZXJlZCBvbiB0aGUgcHJldmlvdXMgY2hhbm5lbCBibGVlZHMgaW50byB0aGUgbmV3IGNoYW5uZWwncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29sZG93biBjYWxjdWxhdGlvbiwgYmxvY2tpbmcgbGVnaXRpbWF0ZSBlbmQtb2YtYnJlYWsgcmVsb2Fkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5ldyBzdHJlYW0gc2Vzc2lvbiDigJQgY2hhbm5lbDogJyArIGNoYW5uZWxOYW1lICsgJywgQVBJOiAnICsgKFYyQVBJID8gJ3YyJyA6ICd2MScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdID0gc3RyZWFtSW5mbyA9IGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHBhcnNlZFVybC5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBsaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmF0ZTogYXR0cmlidXRlc1snRlJBTUUtUkFURSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNzOiBhdHRyaWJ1dGVzWydDT0RFQ1MnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVybDogbGluZXNbaSArIDFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJsc1tsaW5lc1tpICsgMV1dID0gcmVzb2x1dGlvbkluZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QucHVzaChyZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zQnlVcmxbbGluZXNbaSArIDFdXSA9IHN0cmVhbUluZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBObyByZXNvbHV0aW9ucyBwYXJzZWQgZnJvbSBlbmNvZGluZ3MgbTN1OCDigJQgVHdpdGNoIG1heSBoYXZlIGNoYW5nZWQgdGhlIGZvcm1hdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vbkhldmNSZXNvbHV0aW9uTGlzdCA9IHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QuZmlsdGVyKChlbGVtZW50KSA9PiBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdhdmMnKSB8fCBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdhdjAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHdheXNSZWxvYWRQbGF5ZXJPbkFkIHx8IChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCAmJiBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LnNvbWUoKGVsZW1lbnQpID0+IGVsZW1lbnQuQ29kZWNzLnN0YXJ0c1dpdGgoJ2hldicpIHx8IGVsZW1lbnQuQ29kZWNzLnN0YXJ0c1dpdGgoJ2h2YycpKSAmJiAhU2tpcFBsYXllclJlbG9hZE9uSGV2YykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXS5zdWJzdHJpbmcobGluZXNbaV0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkUmVzb2x1dGlvbiA9IHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gb2xkUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEFyZWEgPSB0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UmVzb2x1dGlvbkluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZXN0RGlmZiA9IEluZmluaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vbkhldmNSZXNvbHV0aW9uTGlzdFtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3N0cmVhbVdpZHRoLCBzdHJlYW1IZWlnaHRdID0gY2FuZGlkYXRlLlJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKChzdHJlYW1XaWR0aCAqIHN0cmVhbUhlaWdodCkgLSB0YXJnZXRBcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpZmYgPSBkaWZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVzb2x1dGlvbkluZm8gPSBjYW5kaWRhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZGlmaWVkTTNVOCBzd2FwICcgKyByZXNTZXR0aW5nc1tjb2RlY3NLZXldICsgJyB0byAnICsgbmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzICsgJyBvbGRSZXM6JyArIG9sZFJlc29sdXRpb24gKyAnIG5ld1JlczonICsgbmV3UmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzfSJgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpICsgMV0gPSBuZXdSZXNvbHV0aW9uSW5mby5VcmwgKyAnICcucmVwZWF0KGkgKyAxKTsvLyBUaGUgc3RyZWFtIGRvZXNuJ3QgbG9hZCB1bmxlc3MgZWFjaCB1cmwgbGluZSBpcyB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCB8fCBBbHdheXNSZWxvYWRQbGF5ZXJPbkFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggPSBsaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZG8gTk9UIHNldCBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgaGVyZS4gSXQgd2FzIHByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdW5jb25kaXRpb25hbGx5IG9uIG5ldyBzdHJlYW0gc2Vzc2lvbiBjcmVhdGlvbiwgd2hpY2ggY2F1c2VkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVuZC1vZi1icmVhayByZWxvYWQgb2YgZXZlcnkgbmV3IGNoYW5uZWwgdG8gYmUgYmxvY2tlZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb2xkb3duIOKAlCB0aGUgY29vbGRvd24gY2hlY2sgdHJlYXRlZCB0aGUgc2Vzc2lvbi1jcmVhdGlvbiB0aW1lc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHJlY2VudCByZWxvYWQsIGV2ZW4gdGhvdWdoIG5vIHJlbG9hZCBoYWQgYWN0dWFsbHkgb2NjdXJyZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID8gc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggOiBzdHJlYW1JbmZvLkVuY29kaW5nc00zVTgsIHNlcnZlclRpbWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXIocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC8jRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKFteIl0rKSIvKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAxID8gbWF0Y2hlc1sxXSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC9TRVJWRVItVElNRT0iKFswLTkuXSspIi8pOwogICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gcmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoZW5jb2RpbmdzTTN1OCwgbmV3U2VydmVyVGltZSkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKCNFWFQtWC1TRVNTSU9OLURBVEE6REFUQS1JRD0iU0VSVkVSLVRJTUUiLFZBTFVFPSIpW14iXSsoIikvLCBgJDEke25ld1NlcnZlclRpbWV9JDJgKSA6IGVuY29kaW5nc00zdTg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTZXJ2ZXJUaW1lID8gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKC8oU0VSVkVSLVRJTUU9IilbMC05Ll0rIi8sIGBTRVJWRVItVElNRT0iJHtuZXdTZXJ2ZXJUaW1lfSJgKSA6IGVuY29kaW5nc00zdTg7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBZFNpZ25pZmllcnMuc29tZSgocykgPT4gdGV4dFN0ci5pbmNsdWRlcyhzKSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpIHsKICAgICAgICByZXR1cm4gQWRTaWduaWZpZXJzLmZpbHRlcigocykgPT4gdGV4dFN0ci5pbmNsdWRlcyhzKSk7CiAgICB9CiAgICAvLyBSZW1vdmUgYWQgc2VnbWVudHMgZnJvbSBhbiBtM3U4IHBsYXlsaXN0IGFuZCBjYWNoZSB0aGVpciBVUkxzIGZvciByZXBsYWNlbWVudAogICAgZnVuY3Rpb24gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIHN0cmlwQWxsU2VnbWVudHMsIHN0cmVhbUluZm8pIHsKICAgICAgICBsZXQgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgbGV0IGluQ3VlT3V0ID0gZmFsc2U7CiAgICAgICAgY29uc3QgbGl2ZVNlZ21lbnRzID0gW107CiAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgIGNvbnN0IG5ld0FkVXJsID0gJ2h0dHBzOi8vdHdpdGNoLnR2JzsKICAgICAgICAvLyBMb2cgYWQgdHJhY2tpbmcgYXR0cmlidXRlIG5hbWVzIG9uY2UgcGVyIHN0cmVhbSAoaGVscHMgaWRlbnRpZnkgbmV3IGJlYWNvbnMpCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcykgewogICAgICAgICAgICBjb25zdCBhZEF0dHJzID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQURbQS1aLV0qKD89PSIpL2cpOwogICAgICAgICAgICBpZiAoYWRBdHRycyAmJiBhZEF0dHJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkQWRBdHRyaWJ1dGVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHRyYWNraW5nIGF0dHJpYnV0ZXMgc2VlbjogJyArIFsuLi5uZXcgU2V0KGFkQXR0cnMpXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2cgcG90ZW50aWFsIGFkIG1hcmtlcnMgdGhhdCBhcmVuJ3QgaW4gQWRTaWduaWZpZXJzIChjYW5kaWRhdGVzIGZvciBmdXR1cmUgaW5jbHVzaW9uKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycykgewogICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gbmV3IFNldCgpOwogICAgICAgICAgICBsZXQgc207CiAgICAgICAgICAgIGNvbnN0IGNsYXNzUmUgPSAvRVhULVgtREFURVJBTkdFOlteXG5dKkNMQVNTPSIodHdpdGNoLVteIl0rKSIvZzsKICAgICAgICAgICAgd2hpbGUgKChzbSA9IGNsYXNzUmUuZXhlYyh0ZXh0U3RyKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKCdFWFQtWC1EQVRFUkFOR0U6Q0xBU1M9IicgKyBzbVsxXSArICciJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdGFnUmUgPSAvKFNDVEUzNS1bQS1aLV0rfEVYVC1YLUNVRS1bQS1aLV0rKS9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gdGFnUmUuZXhlYyh0ZXh0U3RyKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKHNtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTdWJzdHJpbmcgY2hlY2sgKG5vdCBleGFjdCk6IGEgY2FuZGlkYXRlIGlzICJrbm93biIgaWYgYW55IEFkU2lnbmlmaWVyCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4gIUFkU2lnbmlmaWVycy5zb21lKHMgPT4gYy5pbmNsdWRlcyhzKSkpOwogICAgICAgICAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBvdGVudGlhbCBhZCBtYXJrZXJzIHNlZW4gYnV0IG5vdCBpbiBBZFNpZ25pZmllcnM6ICcgKyB1bmtub3duLmpvaW4oJywgJykgKyAnIChjYW5kaWRhdGVzIGZvciBmdXR1cmUgaW5jbHVzaW9uKScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgLy8gVHJhY2sgU0NURS0zNSBDVUUtT1VUL0NVRS1JTiBhZCBib3VuZGFyaWVzCiAgICAgICAgICAgIGlmIChsaW5lLmluY2x1ZGVzKCdFWFQtWC1DVUUtT1VUJykpIHsKICAgICAgICAgICAgICAgIGlmICghaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1PVVQg4oCUIGFkIGJvdW5kYXJ5IGVudGVyZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluQ3VlT3V0ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCdFWFQtWC1DVUUtSU4nKSkgewogICAgICAgICAgICAgICAgaWYgKGluQ3VlT3V0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU0NURS0zNSBDVUUtSU4g4oCUIGFkIGJvdW5kYXJ5IGV4aXRlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZW1vdmUgdHJhY2tpbmcgdXJscyB3aGljaCBhcHBlYXIgaW4gdGhlIG92ZXJsYXkgVUkKICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lLnJlcGxhY2VBbGwoVHdpdGNoQWRVcmxSZXdyaXRlUmVnZXgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgY29uc3QgaXNMaXZlU2VnbWVudCA9IGxpbmUuaW5jbHVkZXMoJyxsaXZlJyk7CiAgICAgICAgICAgIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAoIWlzTGl2ZVNlZ21lbnQgfHwgc3RyaXBBbGxTZWdtZW50cyB8fCBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgfHwgaW5DdWVPdXQpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50VXJsID0gbGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgaWYgKCFBZFNlZ21lbnRDYWNoZS5oYXMoc2VnbWVudFVybCkpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KHNlZ21lbnRVcmwsIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBBZFNlZ21lbnRVUkxQYXR0ZXJucy5zb21lKChwKSA9PiBsaW5lc1tpICsgMV0uaW5jbHVkZXMocCkpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBzZWdtZW50IGRldGVjdGVkIHZpYSBVUkwgcGF0dGVybjogJyArIGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQobGluZXNbaSArIDFdLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cysrOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIGlzTGl2ZVNlZ21lbnQpIHsKICAgICAgICAgICAgICAgIGxpdmVTZWdtZW50cy5wdXNoKHsgZXh0aW5mOiBsaW5lLCB1cmw6IGxpbmVzW2kgKyAxXSB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFQtWC1QQVJUOicpKSB7CiAgICAgICAgICAgICAgICAvLyBMTC1ITFMgcGFydDogVVJJIGlzIGlubGluZSBhcyBhbiBhdHRyaWJ1dGUuIFN0cmlwIGlmIGl0IG1hdGNoZXMgYSBrbm93bgogICAgICAgICAgICAgICAgLy8gYWQgVVJMIChhbHJlYWR5IGluIGNhY2hlIGZyb20gYSBwYXJhbGxlbCBFWFRJTkYgc3RyaXAsIG9yIG1hdGNoZXMgYSBVUkwgcGF0dGVybikuCiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIHRoZSBwbGF5ZXIgbWF5IHVzZSB0aGUgcGFydHMgcGF0aCB0byBmZXRjaCBhZCBtZWRpYSB2aWEgbG93LWxhdGVuY3kuCiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpTWF0Y2ggPSBsaW5lLm1hdGNoKFVyaUF0dHJpYnV0ZVJlZ2V4KTsKICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmkgPSBwYXJ0VXJpTWF0Y2ggPyBwYXJ0VXJpTWF0Y2hbMV0gOiAnJzsKICAgICAgICAgICAgICAgIGlmIChwYXJ0VXJpICYmIChBZFNlZ21lbnRDYWNoZS5oYXMocGFydFVyaSkgfHwgQWRTZWdtZW50VVJMUGF0dGVybnMuc29tZSgocCkgPT4gcGFydFVyaS5pbmNsdWRlcyhwKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KHBhcnRVcmksIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6JykgfHwgbGluZS5zdGFydHNXaXRoKCcjRVhULVgtUFJFTE9BRC1ISU5UOicpKSB7CiAgICAgICAgICAgICAgICAvLyBMTC1ITFMgcHJlZmV0Y2gvcHJlbG9hZCBoaW50cyBjYW4gcG9pbnQgYXQgdXBjb21pbmcgYWQgc2VnbWVudHMgYmVmb3JlIGFueQogICAgICAgICAgICAgICAgLy8gRVhUSU5GIGxpbmUgb3IgYWQgc2lnbmlmaWVyIGhhcyBtYXRlcmlhbGl6ZWQgaW4gdGhlIHBsYXlsaXN0LiBJZiB3ZSBvbmx5CiAgICAgICAgICAgICAgICAvLyBzdHJpcCBwcmVmZXRjaCBoaW50cyBBRlRFUiBoYXNTdHJpcHBlZEFkU2VnbWVudHMgaXMgc2V0LCB0aGUgZmlyc3QgcG9sbCBvZgogICAgICAgICAgICAgICAgLy8gYW4gYWQgYnJlYWsgY2FuIGxlYWsgYSBwcmVmZXRjaCBoaW50IHBvaW50aW5nIGF0IGFuIGFkIFVSTCDigJQgdGhlIHBsYXllcgogICAgICAgICAgICAgICAgLy8gdGhlbiBwcmUtZmV0Y2hlcyBhZCBtZWRpYSB2aWEgdGhlIExMLUhMUyBwYXRoIGJlZm9yZSBvdXIgdXN1YWwgc3RyaXAgY2F0Y2hlcwogICAgICAgICAgICAgICAgLy8gdXAsIHByb2R1Y2luZyBhbiBhZCBmbGFzaC4gRGV0ZWN0IHRoZSBhZCBVUkwgaGVyZSBzbyBoYXNTdHJpcHBlZEFkU2VnbWVudHMKICAgICAgICAgICAgICAgIC8vIGZsaXBzIG9uIHRoZSBmaXJzdCBwb2xsIGFuZCB0aGUgcG9zdC1sb29wIHVuY29uZGl0aW9uYWwgcHJlZmV0Y2ggc3RyaXAgZmlyZXMuCiAgICAgICAgICAgICAgICAvLyBQb3J0ZWQgZnJvbSBUVFYtQUIgNTJiNDFiNC4KICAgICAgICAgICAgICAgIC8vIEZvcm1hdDogJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6aHR0cHM6Ly91cmwvaGVyZS50cycgKHJhdyBVUkwgYWZ0ZXIgdGhlIGNvbG9uKQogICAgICAgICAgICAgICAgLy8gICAgIG9yOiAnI0VYVC1YLVBSRUxPQUQtSElOVDpUWVBFPVBBUlQsVVJJPSJ1cmwiJyAoVVJJIGF0dHJpYnV0ZSkKICAgICAgICAgICAgICAgIGxldCBoaW50VXJsID0gJyc7CiAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpKSB7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGxpbmUuc3Vic3RyaW5nKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicubGVuZ3RoKS50cmltKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpbnRNYXRjaCA9IGxpbmUubWF0Y2goL1VSST0iKFteIl0rKSIvKTsKICAgICAgICAgICAgICAgICAgICBoaW50VXJsID0gaGludE1hdGNoID8gaGludE1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGludFVybCAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKGhpbnRVcmwpIHx8IEFkU2VnbWVudFVSTFBhdHRlcm5zLnNvbWUoKHApID0+IGhpbnRVcmwuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChoaW50VXJsLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIE1vdmVkIG91dCBvZiB0aGUgcGVyLWxpbmUgbG9vcDogYSBwZXItbGluZSBzY2FuIGZvciBhbnkgc2lnbmlmaWVyIGlzCiAgICAgICAgLy8gc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgZnVsbC10ZXh0IHNjYW4sIHNpbmNlIHRoZSBjaGVjayBoYXMKICAgICAgICAvLyBubyBsaW5lLWxldmVsIHN0YXRlIOKAlCBpdCBqdXN0IGZsaXBzIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWUgb24gZmlyc3QKICAgICAgICAvLyBtYXRjaC4gT25lIHNjYW4gaW5zdGVhZCBvZiBOX2xpbmVzICogTl9zaWduaWZpZXJzIHNjYW5zICh+MTAweCBmZXdlcgogICAgICAgIC8vIGluY2x1ZGVzKCkgY2FsbHMgb24gYSB0eXBpY2FsIDEwMC1saW5lIG0zdTgpLgogICAgICAgIGlmICghaGFzU3RyaXBwZWRBZFNlZ21lbnRzICYmIEFkU2lnbmlmaWVycy5zb21lKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKSkgewogICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoaGFzU3RyaXBwZWRBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIE5vIGxvdyBsYXRlbmN5IGR1cmluZyBhZHMgKG90aGVyd2lzZSBpdCdzIHBvc3NpYmxlIGZvciB0aGUgcGxheWVyIHRvIHByZWZldGNoIGFuZCBkaXNwbGF5IGFkIHNlZ21lbnRzKQogICAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6JykgfHwgbGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9IDA7CiAgICAgICAgfQogICAgICAgIC8vIENhY2hlIGxpdmUgc2VnbWVudHMgZm9yIHJlY292ZXJ5IChwbHVzIHRoZSBNRURJQS1TRVFVRU5DRSBvZiB0aGUgb2xkZXN0IGNhY2hlZCBzZWdtZW50LAogICAgICAgIC8vIHNvIHRoZSBwbGF5ZXIgYWNjZXB0cyBpbmplY3RlZCByZWNvdmVyeSBzZWdtZW50cyBhcyB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtKQogICAgICAgIGlmIChsaXZlU2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMgPSBsaXZlU2VnbWVudHMuc2xpY2UoLTYpOwogICAgICAgICAgICBjb25zdCBzZXEgPSBwYXJzZUludCgodGV4dFN0ci5tYXRjaCgvI0VYVC1YLU1FRElBLVNFUVVFTkNFOihcZCspLykgfHwgW10pWzFdKTsKICAgICAgICAgICAgaWYgKCFpc05hTihzZXEpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXEgPSBzZXEgKyBNYXRoLm1heCgwLCBsaXZlU2VnbWVudHMubGVuZ3RoIC0gc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSWYgYWxsIHNlZ21lbnRzIHdlcmUgc3RyaXBwZWQsIHRyeSB0byBwcmV2ZW50IGJsYWNrIHNjcmVlbiB2aWEgcmVjb3ZlcnkgY29udGVudC4KICAgICAgICAvLyBQcmVmZXIgdGhlIGZ1bGwtcGxheWxpc3Qgc25hcHNob3QgZnJvbSBhIHJlY2VudCBub24tYWQgcG9sbCAobWlycm9ycyBUVFYtQUIKICAgICAgICAvLyBMYXN0Q2xlYW5OYXRpdmVNM1U4IGFwcHJvYWNoKSDigJQgZ2l2ZXMgdGhlIHBsYXllciA0LTYgbGl2ZSBzZWdtZW50cyB3b3J0aCBvZgogICAgICAgIC8vIGNvbnRlbnQgdnMgdGhlIHRoaW4gcGVyLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUuIEZhbGxzIGJhY2sgdG8gdGhlIHBlci1zZWdtZW50CiAgICAgICAgLy8gY2FjaGUgaWYgdGhlIHNuYXBzaG90IGlzIHN0YWxlIG9yIG1pc3NpbmcuCiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApICsgMTsKICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgKyAxOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0KSBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIC8vIFByaW1hcnk6IGZyZXNoIGZ1bGwtcGxheWxpc3Qgc25hcHNob3QgKDwgMS41cyBvbGQsIG11c3Qgbm90IGl0c2VsZiBjb250YWluIGFkIG1hcmtlcnMpCiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90QWdlID0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0ID8gKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQpIDogSW5maW5pdHk7CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggJiYgc25hcHNob3RBZ2UgPD0gMTUwMCAmJiAhaGFzQWRUYWdzKHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcmV1c2luZyBsYXN0IGNsZWFuIG5hdGl2ZSBwbGF5bGlzdCAoJyArIHNuYXBzaG90QWdlICsgJ21zIG9sZCknKTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gaGFzU3RyaXBwZWRBZFNlZ21lbnRzOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVODsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGYWxsYmFjazogcGVyLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUgKGV4aXN0aW5nIGJlaGF2aW9yKQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzICYmIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJlc3RvcmluZyAnICsgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCArICcgcmVjb3Zlcnkgc2VnbWVudHMnKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXEgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbal0gPSAnI0VYVC1YLU1FRElBLVNFUVVFTkNFOicgKyBzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0uZXh0aW5mKTsKICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50c1tqXS51cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChsaXZlU2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAvLyBSZXNldCBmcmVlemUgY291bnRlciB3aGVuIGxpdmUgc2VnbWVudHMgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gaGFzU3RyaXBwZWRBZFNlZ21lbnRzOwogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgLy8gVGhyb3R0bGUgY2FjaGUgcHJ1bmUgdG8gb25jZSBwZXIgNjBzLiBUaGUgMTIwcyBUVEwgZ2l2ZXMgcGxlbnR5IG9mIGhlYWRyb29tCiAgICAgICAgLy8gYW5kIHNjYW5uaW5nIHRoZSBmdWxsIGNhY2hlIG9uIGV2ZXJ5IG0zdTggcG9sbCBhZGRzIHVwIGR1cmluZyBoZWF2eSBhZCBicmVhawogICAgICAgIC8vIHNlcXVlbmNlcyAoTEwtSExTIGNhbiBwb2xsIG11bHRpcGxlIHRpbWVzIHBlciBzZWNvbmQpLiBQb3J0ZWQgZnJvbSBUVFYtQUIuCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCB8fCBub3cgLSBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA+IDYwMDAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0ID0gbm93OwogICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5LCBtYXApID0+IHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IG5vdyAtIDEyMDAwMCkgewogICAgICAgICAgICAgICAgICAgIG1hcC5kZWxldGUoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIERpYWdub3N0aWM6IGxvZyBvbmNlIHBlciBzdHJlYW1JbmZvIHdoZW4gdGhlIGNhY2hlIGNyb3NzZXMgMTAwMCBlbnRyaWVzLAogICAgICAgICAgICAvLyBzbyBjYWNoZSBibG9hdCBmcm9tIGEgZnV0dXJlIFRUTC9wcnVuZSBidWcgd291bGQgc3VyZmFjZSBpbiB1c2VyIHJlcG9ydHMKICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBzdGF5aW5nIGludmlzaWJsZS4KICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLnNpemUgPiAxMDAwICYmICFzdHJlYW1JbmZvLkxvZ2dlZEFkQ2FjaGVTaXplMWspIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxayA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZFNlZ21lbnRDYWNoZSBjcm9zc2VkIDEwMDAgZW50cmllcyAobm93ICcgKyBBZFNlZ21lbnRDYWNoZS5zaXplICsgJykg4oCUIHBvc3NpYmxlIGNhY2hlIGJsb2F0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xuJyk7CiAgICB9CiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG1hdGNoaW5nIHN0cmVhbSBVUkwgZm9yIGEgZ2l2ZW4gcmVzb2x1dGlvbiBmcm9tIGEgbWFzdGVyIG0zdTgKICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBjb25zdCBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgIGxldCBtYXRjaGVkUmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IG1hdGNoZWRGcmFtZVJhdGUgPSBmYWxzZTsKICAgICAgICBsZXQgY2xvc2VzdFJlc29sdXRpb25VcmwgPSBudWxsOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBJbmZpbml0eTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kaW5nc0xpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICAvLyBBY2NlcHQgdjIgQVBJIHZhcmlhbnQgVVJMcyB3aGljaCBhcmUgcmF3IENETiBVUkxzIHdpdGhvdXQgJy5tM3U4JyBpbiB0aGUgcGF0aC4KICAgICAgICAgICAgLy8gdjEgQVBJOiBuZXh0IGxpbmUgaXMgJy4uLmluZGV4LTxyZXNvbHV0aW9uPi5tM3U4Py4uLicKICAgICAgICAgICAgLy8gdjIgQVBJOiBuZXh0IGxpbmUgaXMgYSByYXcgQ0ROIFVSTCBsaWtlICdodHRwczovL3ZpZGVvLWVkZ2UtLi4ubmV0L3YxLy4uLi9jaHVua2VkLy4uLicKICAgICAgICAgICAgLy8gd2l0aG91dCAnLm0zdTgnLiBNYXRjaGluZyBvbmx5IG9uICcubTN1OCcgd291bGQgc2tpcCB2MiB2YXJpYW50cyBlbnRpcmVseSwKICAgICAgICAgICAgLy8gY2F1c2luZyBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uIHRvIHJldHVybiBudWxsIGFuZCBiYWNrdXAgc2VsZWN0aW9uIHRvIGZhaWwuCiAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lID0gZW5jb2RpbmdzTGluZXNbaSArIDFdPy50cmltKCk7CiAgICAgICAgICAgIGlmIChlbmNvZGluZ3NMaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpICYmIG5leHRMaW5lICYmICFuZXh0TGluZS5zdGFydHNXaXRoKCcjJykgJiYgKG5leHRMaW5lLmluY2x1ZGVzKCcubTN1OCcpIHx8IG5leHRMaW5lLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoZW5jb2RpbmdzTGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbiAmJiAoIW1hdGNoZWRSZXNvbHV0aW9uVXJsIHx8ICghbWF0Y2hlZEZyYW1lUmF0ZSAmJiBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlc29sdXRpb25VcmwgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGcmFtZVJhdGUgPSBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25Vcmw7CiAgICB9CiAgICAvLyBDb3JlIGFkLWJsb2NraW5nIGxvZ2ljOiBkZXRlY3QgYWRzIGluIG0zdTgsIGZldGNoIGJhY2t1cCBzdHJlYW1zLCBzdHJpcCBhZCBzZWdtZW50cwogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBpZiAoSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkKSB7CiAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgdW5rbm93bkFkVGFncyA9IHRleHRTdHIubWF0Y2goLyNFWFRbXjpcbl0qKD86YWR8Y3VlfHNjdGV8c3BvbnNvcilbXjpcbl0qL2dpKTsKICAgICAgICAgICAgaWYgKHVua25vd25BZFRhZ3MpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSB1bmtub3duQWRUYWdzLmZpbHRlcih0ID0+ICFBZFNpZ25pZmllcnMuc29tZShzID0+IHQuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVbmtub3duIGFkLXJlbGF0ZWQgdGFncyBmb3VuZDogJyArIFsuLi5uZXcgU2V0KHVua25vd24pXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBoYXZlQWRUYWdzID0gaGFzQWRUYWdzKHRleHRTdHIpIHx8IFNpbXVsYXRlZEFkc0RlcHRoID4gMDsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB0byBjaGV3IG9uIHZzIHRoZSAxLTIgY2FjaGVkIGluZGl2aWR1YWwgc2VnbWVudHMuCiAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgc3JjL21vZHVsZXMvcHJvY2Vzc29yLnRzOjczMy03MzYuCiAgICAgICAgaWYgKCFoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzU2hvd2luZ0FkICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoaGF2ZUFkVGFncykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNaWRyb2xsID0gdGV4dFN0ci5pbmNsdWRlcygnIk1JRFJPTEwiJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnIm1pZHJvbGwiJyk7CiAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkQnJlYWtTdGFydGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgY29uc3QgcG9kTGVuZ3RoTWF0Y2ggPSB0ZXh0U3RyLm1hdGNoKC9YLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIPSIoXGQrKSIvKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aCA9IHBvZExlbmd0aE1hdGNoID8gcGFyc2VJbnQocG9kTGVuZ3RoTWF0Y2hbMV0sIDEwKSA6IDE7CiAgICAgICAgICAgICAgICAvLyBSZXNldCBlYXJseS1yZWxvYWQgc3RhdGUgZm9yIG5ldyBhZCBicmVhazsgYWxsb3cgdXAgdG8gb25lIGVhcmx5IHJlbG9hZCBwZXIgYWQgaW4gcG9kCiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBvZExlbmd0aCA9IHBvZExlbmd0aDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gMDsKICAgICAgICAgICAgICAgIC8vIFRyYWNrIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzIHRvIGRpc3Rpbmd1aXNoIHJlYWwgYWRzIGZyb20gZmFsc2UtcG9zaXRpdmUgc2lnbmlmaWVyIG1hdGNoZXMKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycyA9IHRleHRTdHIuaW5jbHVkZXMoJ1gtVFYtVFdJVENILUFELUFELVNFU1NJT04tSUQnKSB8fCB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1SQURTLVRPS0VOJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkN5Y2xlUmVzY3VlZFRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSA9IG51bGw7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNzYWlPbmx5VGhpc0JyZWFrID0gZmFsc2U7Ly8gUmVzZXQgc3RpY2t5IENTQUkgZmxhZyBmb3IgbmV3IGJyZWFrCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBkZXRlY3RlZCDigJQgdHlwZTogJyArIChzdHJlYW1JbmZvLklzTWlkcm9sbCA/ICdtaWRyb2xsJyA6ICdwcmVyb2xsJykgKyAnLCBjaGFubmVsOiAnICsgc3RyZWFtSW5mby5DaGFubmVsTmFtZSArICcsIHBvZDogJyArIHBvZExlbmd0aCArICcgYWQocykgKH4nICsgKHBvZExlbmd0aCAqIDMwKSArICdzIGV4cGVjdGVkKSwgc2lnbmlmaWVyczogJyArIGdldE1hdGNoZWRBZFNpZ25pZmllcnModGV4dFN0cikuam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnVXBkYXRlQWRCbG9ja0Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLklzTWlkcm9sbCkgewogICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKCcsbGl2ZScpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXF1ZXN0IG9uZSAudHMgZmlsZSBwZXIgLm0zdTggcmVxdWVzdCB0byBhdm9pZCBtYWtpbmcgdG9vIG1hbnkgcmVxdWVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0ZldGNoIGFkIC50cyBmaWxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5hZGQobGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoKGxpbmVzW2kgKyAxXSkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJsb2IoKSkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY3VycmVudFJlc29sdXRpb24gPSBzdHJlYW1JbmZvLlVybHNbdXJsXTsKICAgICAgICAgICAgaWYgKCFjdXJyZW50UmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkcyB3aWxsIGxlYWsgZHVlIHRvIG1pc3NpbmcgcmVzb2x1dGlvbiBpbmZvIGZvciAnICsgdXJsKTsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgZmFsc2UsIHN0cmVhbUluZm8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGlzSGV2YyA9IGN1cnJlbnRSZXNvbHV0aW9uLkNvZGVjcy5zdGFydHNXaXRoKCdoZXYnKSB8fCBjdXJyZW50UmVzb2x1dGlvbi5Db2RlY3Muc3RhcnRzV2l0aCgnaHZjJyk7CiAgICAgICAgICAgIGlmICgoKGlzSGV2YyAmJiAhU2tpcFBsYXllclJlbG9hZE9uSGV2YykgfHwgQWx3YXlzUmVsb2FkUGxheWVyT25BZCkgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggJiYgIXN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnUmVsb2FkUGxheWVyJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3RpY2t5IENTQUkgZmFzdCBwYXRoOiBpZiBhIHByaW9yIHBvbGwgaW4gVEhJUyBicmVhayBhbHJlYWR5IGNvbmZpcm1lZCB0aGUgYnJlYWsKICAgICAgICAgICAgLy8gaXMgQ1NBSS1vbmx5IChhbGwgc2VnbWVudHMgbGl2ZSBvbiBwb2xsIDEpLCBzdGF5IG9uIHRoZSBmYXN0IHBhdGggZm9yIHRoZSByZXN0CiAgICAgICAgICAgIC8vIG9mIHRoZSBicmVhay4gc3RyaXBBZFNlZ21lbnRzIHN0aWxsIGhhbmRsZXMgYW55IHJlYWwgRVhUSU5GIGFkIHNlZ21lbnRzIHRoYXQKICAgICAgICAgICAgLy8gc2hvdyB1cCBvbiBsYXRlciBwb2xscyAodGhleSBnZXQgY2FjaGVkIGFuZCB0aGUgZmV0Y2ggaG9vayByZXR1cm5zIEJMQU5LX01QNCksCiAgICAgICAgICAgIC8vIHNvIGFkcyBhcmUgYmxvY2tlZCBldmVuIHdpdGhvdXQgdGhlIGJhY2t1cCBzd2l0Y2guIFNraXBwaW5nIGJhY2t1cCBzZWFyY2ggZm9yCiAgICAgICAgICAgIC8vIHRoZSB3aG9sZSBDU0FJIGJyZWFrIHNhdmVzIH4yMCB3YXN0ZWQgZmV0Y2hlcyBwZXIgYnJlYWsg4oCUIHRoZSBiYWNrdXAgd291bGRuJ3QKICAgICAgICAgICAgLy8gaGVscCBhbnl3YXkgc2luY2UgZXZlcnkgcGxheWVyIHR5cGUgaGFzIHRoZSBzYW1lIENTQUkgYWRzLiBGbGFnIGlzIGNsZWFyZWQKICAgICAgICAgICAgLy8gb25seSBhdCBicmVhayBlbmQgKElzU2hvd2luZ0FkPWZhbHNlIHBhdGgpLgogICAgICAgICAgICAvLyBTdGlja3kgQ1NBSSBlc2NhcGUgaGF0Y2ggKFByZWZlckxvd1F1YWxpdHlCYWNrdXApOiBhZnRlciB+OHMgc3R1Y2ssIGZhbGwgdGhyb3VnaCB0byBiYWNrdXAgc2VhcmNoLgogICAgICAgICAgICBpZiAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCAmJiBzdHJlYW1JbmZvLkNzYWlPbmx5VGhpc0JyZWFrICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSA0KSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHVja1BvbGxzID0gc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWNvdmVyeUNhY2hlU2l6ZSA9IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDA7CiAgICAgICAgICAgICAgICBjb25zdCBlYXJseVJlbG9hZEluZm8gPSAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApICsgJy8nICsgTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTdGlja3kgQ1NBSSBlc2NhcGUgaGF0Y2gg4oCUIHN0dWNrICcgKyBzdHVja1BvbGxzICsgJyBwb2xscyAoficgKyAoc3R1Y2tQb2xscyAqIDIpICsgJ3MpLCBFYXJseVJlbG9hZENvdW50PScgKyBlYXJseVJlbG9hZEluZm8gKyAnLCByZWNvdmVyeSBjYWNoZT0nICsgcmVjb3ZlcnlDYWNoZVNpemUgKyAnIHNlZ21lbnRzLCBmYWxsaW5nIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayAmJiAhc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4KSB7CiAgICAgICAgICAgICAgICBpZiAoSXNBZFN0cmlwcGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEVhcmx5IHJlbG9hZCBkdXJpbmcgcHJvbG9uZ2VkIGZyZWV6ZSDigJQgbWlycm9ycyB0aGUgY2hlY2sgaW4gdGhlIG5vcm1hbAogICAgICAgICAgICAgICAgLy8gYmFja3VwLXNlYXJjaCBwYXRoIHdoaWNoIHdlJ2Qgb3RoZXJ3aXNlIHNraXAgZW50aXJlbHkgYnkgcmV0dXJuaW5nIGVhcmx5CiAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBzdGlja3kgcGF0aC4gV2l0aG91dCB0aGlzLCBoZWF2eSBTU0FJIGJyZWFrcyBvbiBDU0FJLWNvbmZpcm1lZAogICAgICAgICAgICAgICAgLy8gc3RyZWFtcyBsZWF2ZSB0aGUgcGxheWVyIHJlcGxheWluZyB0aGUgdGhpbiByZWNvdmVyeSBjYWNoZSBmb3IgdGhlIGZ1bGwKICAgICAgICAgICAgICAgIC8vIGJyZWFrIGR1cmF0aW9uIChvYnNlcnZlZDogMzUuOXMgZnJlZXplIG9uIHBvZC0xIGJyZWFrLCAzIGFsbC1zdHJpcHBlZAogICAgICAgICAgICAgICAgLy8gcG9sbHMsIDEtc2VnbWVudCByZWNvdmVyeSBjYWNoZSkuCiAgICAgICAgICAgICAgICAvLyBCb3VuZGVkIHRvIG1heEVhcmx5UmVsb2FkcyBwZXIgYWQgaW4gcG9kIHNvIHJlbG9hZCBsb29wcyBhcmUgaW1wb3NzaWJsZS4KICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0IChzdGlja3kgcGF0aCk6IHN0aWxsIGFkcyDigJQgY29udGludWluZyByZWNvdmVyeSBsb29wJyk7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5UmVjb3ZlcnlUaGluID0gKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApIDwgMzsKICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreU1heEVhcmx5UmVsb2FkcyA9IHN0aWNreVJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgICAgICBjb25zdCBzdGlja3lFZmZlY3RpdmVUaHJlc2hvbGQgPSBzdGlja3lSZWNvdmVyeVRoaW4gPyAxIDogRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkOwogICAgICAgICAgICAgICAgaWYgKEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA+IDAgJiYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApID49IHN0aWNreUVmZmVjdGl2ZVRocmVzaG9sZCAmJiAhc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCAmJiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApIDwgc3RpY2t5TWF4RWFybHlSZWxvYWRzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgPSAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5UmVhc29uID0gc3RpY2t5UmVjb3ZlcnlUaGluID8gJyAodGhpbiByZWNvdmVyeSBjYWNoZTogJyArIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSArICcgc2VnbWVudHMpJyA6ICcnOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCB0cmlnZ2VyZWQgKHN0aWNreSBwYXRoKSDigJQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzICsgJyBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMnICsgc3RpY2t5UmVhc29uICsgJyBbJyArIHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCArICcvJyArIHN0aWNreU1heEVhcmx5UmVsb2FkcyArICddJyk7CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyBrZXk6ICdSZWxvYWRQbGF5ZXInLCBraW5kOiAnZWFybHknIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgbnVtU3RyaXBwZWRBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cywKICAgICAgICAgICAgICAgICAgICBhY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBudWxsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENTQUkgZmFzdCBwYXRoOiBpZiBhbGwgc2VnbWVudHMgaW4gdGhlIG1haW4gc3RyZWFtIGFyZSBsaXZlLCBza2lwIGJhY2t1cCBzZWFyY2guCiAgICAgICAgICAgIC8vIENTQUkgYWRzIGFyZSBkZWxpdmVyZWQgb3V0c2lkZSB0aGUgbTN1OCDigJQgdGhlIG1haW4gc3RyZWFtIHNlZ21lbnRzIGFyZSBjbGVhbi4KICAgICAgICAgICAgLy8gSnVzdCBzdHJpcCB0cmFja2luZyBVUkxzIGFuZCByZXR1cm4gdGhlIG1haW4gc3RyZWFtIGRpcmVjdGx5LCBhdm9pZGluZyB0aGUKICAgICAgICAgICAgLy8gYmFja3VwIHN0cmVhbSBzd2l0Y2ggdGhhdCBjYXVzZXMgYSAyMC00MHMgcmVidWZmZXIgZ2FwLgogICAgICAgICAgICBjb25zdCBtYWluU3RyZWFtTGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICBsZXQgaGFzTm9uTGl2ZVNlZ21lbnQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWluU3RyZWFtTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtYWluU3RyZWFtTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVElORicpICYmICFtYWluU3RyZWFtTGluZXNbaV0uaW5jbHVkZXMoJyxsaXZlJykpIHsKICAgICAgICAgICAgICAgICAgICBoYXNOb25MaXZlU2VnbWVudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmFja3VwU3dhcEZpcnN0IChvcHQtaW4pOiBza2lwIHN0aWNreSBDU0FJIHBhdGggZW50aXJlbHksIGFsd2F5cyBmYWxsIHRocm91Z2ggdG8KICAgICAgICAgICAgLy8gYmFja3VwIHNlYXJjaCBvbiBhZCBkZXRlY3QuIE1pbWljcyBUVFYtQUIncyBiYWNrdXAtc3dhcC1maXJzdCBmbG93IOKAlCBhdm9pZHMKICAgICAgICAgICAgLy8gTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkgKG5vIEJMQU5LX01QNCBpbmplY3Rpb24sIG5vIHJlY292ZXJ5CiAgICAgICAgICAgIC8vIHNlZ21lbnQgcmVwbGF5KSwgd2hpY2ggdXNlcnMgcmVwb3J0IHByb2R1Y2VzIGZld2VyIGxvYWRpbmcgY2lyY2xlcy4gQ29zdDogZXh0cmEKICAgICAgICAgICAgLy8gZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhayAodG9rZW4gcmVxdWVzdHMgZm9yIGVhY2ggYmFja3VwIHR5cGUgdHJpZWQpLgogICAgICAgICAgICBpZiAoIWhhc05vbkxpdmVTZWdtZW50ICYmICFzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggJiYgIUJhY2t1cFN3YXBGaXJzdCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IHRydWU7Ly8gTWFyayBicmVhayBhcyBjb25maXJtZWQgQ1NBSSBzbyBzdWJzZXF1ZW50IHBvbGxzIHN0YXkgb24gdGhlIGZhc3QgcGF0aAogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBmYXN0IHBhdGgg4oCUIGFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoJyk7CiAgICAgICAgICAgICAgICBpZiAoSXNBZFN0cmlwcGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICAgICAgICAgIGhhc0Fkczogc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCwKICAgICAgICAgICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBiYWNrdXBTZWFyY2hTdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIGxldCBiYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2t1cE0zdTggPSBudWxsOwogICAgICAgICAgICBsZXQgZmFsbGJhY2tNM3U4ID0gbnVsbDsKICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwOwogICAgICAgICAgICBsZXQgaXNEb2luZ01pbmltYWxSZXF1ZXN0cyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID4gRGF0ZS5ub3coKSAtIFBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1RpbWUpIHsKICAgICAgICAgICAgICAgIC8vIFdoZW4gZG9pbmcgcGxheWVyIHJlbG9hZCB0aGVyZSBhcmUgYSBsb3Qgb2YgcmVxdWVzdHMgd2hpY2ggY2F1c2VzIHRoZSBiYWNrdXAgc3RyZWFtIHRvIGxvYWQgaW4gc2xvdy4gQnJpZWZseSBwcmVmZXIgdXNpbmcgYSBzaW5nbGUgdmVyc2lvbiB0byBwcmV2ZW50IGxvbmcgZGVsYXlzCiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gUGxheWVyUmVsb2FkTWluaW1hbFJlcXVlc3RzUGxheWVySW5kZXg7CiAgICAgICAgICAgICAgICBpc0RvaW5nTWluaW1hbFJlcXVlc3RzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUcnkgcGlubmVkIGJhY2t1cCBwbGF5ZXIgdHlwZSBmaXJzdCBpZiBhdmFpbGFibGUKICAgICAgICAgICAgY29uc3QgcGxheWVyVHlwZXNUb1RyeSA9IFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPyBbLi4uQmFja3VwUGxheWVyVHlwZXMsICdhdXRvcGxheSddIDogWy4uLkJhY2t1cFBsYXllclR5cGVzXTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgY29uc3QgcGlubmVkSW5kZXggPSBwbGF5ZXJUeXBlc1RvVHJ5LmluZGV4T2Yoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIGlmIChwaW5uZWRJbmRleCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlc1RvVHJ5LnNwbGljZShwaW5uZWRJbmRleCwgMSk7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS51bnNoaWZ0KHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgcGxheWVyVHlwZUluZGV4ID0gc3RhcnRJbmRleDsgIWJhY2t1cE0zdTggJiYgcGxheWVyVHlwZUluZGV4IDwgcGxheWVyVHlwZXNUb1RyeS5sZW5ndGg7IHBsYXllclR5cGVJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJUeXBlID0gcGxheWVyVHlwZXNUb1RyeVtwbGF5ZXJUeXBlSW5kZXhdOwogICAgICAgICAgICAgICAgY29uc3QgcmVhbFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlLnJlcGxhY2UoJy1DQUNIRUQnLCAnJyk7CiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRBdCA9IHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuZ2V0KHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIGlmIChmYWlsZWRBdCAmJiAoRGF0ZS5ub3coKSAtIGZhaWxlZEF0KSA8IDE1MDAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBpc0Z1bGx5Q2FjaGVkUGxheWVyVHlwZSA9IHBsYXllclR5cGUgIT0gcmVhbFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FjaGVzIHRoZSBtM3U4IGlmIGl0IGRvZXNuJ3QgaGF2ZSBhZHMuIElmIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGhhcyBhZHMgaXQgZmV0Y2hlcyBhIG5ldyB2ZXJzaW9uIChzZWNvbmQgbG9vcCkKICAgICAgICAgICAgICAgICAgICBsZXQgaXNGcmVzaE0zdTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RpbmdzTTN1OCA9IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdOwogICAgICAgICAgICAgICAgICAgIGlmICghZW5jb2RpbmdzTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICBpc0ZyZXNoTTN1OCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcmVhbFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IChmbGF0dGVyLCBvYnNlcnZlZCBmb3IgJ2VtYmVkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNwYXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCBzcGF0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXSA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVXNoZXIgSFRUUCAnICsgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyByZWFsUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JCb2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXJyb3JCb2R5ID0gJyDigJQgJyArIChhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLnRleHQoKSkuc3Vic3RyaW5nKDAsIDIwMCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBY2Nlc3MgdG9rZW4gSFRUUCAnICsgYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgKyAnIGZvciAnICsgcmVhbFBsYXllclR5cGUgKyAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDQwMyA/ICcgKGludGVncml0eTogJyArIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAncHJlc2VudCcgOiAnbWlzc2luZycpICsgJyknIDogJycpICsgZXJyb3JCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLnNldChyZWFsUGxheWVyVHlwZSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWNjZXNzIHRva2VuIGZhaWxlZCBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJzogJyArIGVyci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuc2V0KHJlYWxQbGF5ZXJUeXBlLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFVybCA9IGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbTN1OFRleHQgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtM3U4VGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyVHlwZSA9PSBGYWxsYmFja1BsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0FkVGFncyhtM3U4VGV4dCkgJiYgKFNpbXVsYXRlZEFkc0RlcHRoID09IDAgfHwgcGxheWVyVHlwZUluZGV4ID49IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSkpIHx8ICghZmFsbGJhY2tNM3U4ICYmIHBsYXllclR5cGVJbmRleCA+PSBwbGF5ZXJUeXBlc1RvVHJ5Lmxlbmd0aCAtIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApID49IDEgJiYgIWhhc0FkVGFncyhtM3U4VGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2VHlwZSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZUeXBlICYmIHByZXZUeXBlICE9PSBwbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEN5Y2xlIHN3aXRjaGVkIHRvIGRpZmZlcmVudCBjbGVhbiB0eXBlICgnICsgcGxheWVyVHlwZSArICcsIHdhcyAnICsgcHJldlR5cGUgKyAnKSBkdXJpbmcgZnJlZXplIOKAlCByZWNvdmVyZWQgd2l0aG91dCByZWxvYWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBtYXJrIGFzIGN5Y2xlLXJlc2N1ZWQgd2hlbiB3ZSBBQ1RVQUxMWSBzd2l0Y2hlZCBwbGF5ZXIgdHlwZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdHVyYWwgcmVjb3ZlcnkgKHNhbWUgdHlwZSBiZWNhbWUgY2xlYW4pIHN0aWxsIG5lZWRzIHRoZSBlbmQtb2YtYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIHRvIHJlZnJlc2ggdGhlIHBsYXllciBidWZmZXIg4oCUIHNraXBwaW5nIGl0IGxlYXZlcyB0aGUgcGxheWVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0dWNrIHdpdGggbG93IGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBtb25pdG9yIHVuYWJsZSB0byByZWNvdmVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkN5Y2xlUmVzY3VlZFRoaXNCcmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU2FtZSBiYWNrdXAgdHlwZSAoJyArIHBsYXllclR5cGUgKyAnKSBiZWNhbWUgY2xlYW4gZHVyaW5nIGZyZWV6ZSDigJQgbmF0dXJhbCByZWNvdmVyeScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0FkVGFncyhtM3U4VGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUpIHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5oYXMocGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5hZGQocGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSAoJyArIHBsYXllclR5cGUgKyAnKSBhbHNvIGhhcyBhZHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdWxseUNhY2hlZFBsYXllclR5cGUgfHwgaXNEb2luZ01pbmltYWxSZXF1ZXN0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IHBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDeWNsZSB0aHJvdWdoIGFsbCBwbGF5ZXIgdHlwZXMgbG9va2luZyBmb3IgYSBjbGVhbiBiYWNrdXAuIE9ubHkgY29tbWl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGFkLWxhZGVuIGJhY2t1cCBhcyBhIGxhc3QgcmVzb3J0IHdoZW4gd2UndmUgZXhoYXVzdGVkIGFsbCBvcHRpb25zLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQUiAjODkgcHJldmlvdXNseSBjb21taXR0ZWQgdGhlIGZpcnN0IGFkLWxhZGVuIHR5cGUgaW1tZWRpYXRlbHkg4oCUIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSB2NTggZnJlZXplIHJlZ3Jlc3Npb24gKGlzc3VlICMxMTIpIGJlY2F1c2UgdGhlIHN0cmlwK3JlY292ZXJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3Agd291bGQgZW5nYWdlIGV2ZW4gd2hlbiBhIGNsZWFuIGFsdGVybmF0ZSB3YXMgYXZhaWxhYmxlIG9uIGFub3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxheWVyIHR5cGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3MobTN1OFRleHQpICYmIHBsYXllclR5cGVJbmRleCA+PSBwbGF5ZXJUeXBlc1RvVHJ5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBiYWNrdXAgcGxheWVyIHR5cGVzIGFkLWxhZGVuIOKAlCB0YWtpbmcgJyArIHBsYXllclR5cGUgKyAnIGFzIGxhc3QtcmVzb3J0IGZhbGxiYWNrIChzdHJpcCtyZWNvdmVyeSBwYXRoIHdpbGwgZW5nYWdlKScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IHBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSBmZXRjaCBmYWlsZWQgZm9yICcgKyBwbGF5ZXJUeXBlICsgJyAoc3RhdHVzICcgKyBzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGVycm9yIGZvciAnICsgcGxheWVyVHlwZSArICc6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NNM1U4Q2FjaGVbcGxheWVyVHlwZV0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0ZyZXNoTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFiYWNrdXBNM3U4ICYmIGZhbGxiYWNrTTN1OCkgewogICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IEZhbGxiYWNrUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgIGJhY2t1cE0zdTggPSBmYWxsYmFja00zdTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3RhbGUtY29tbWl0IGd1YXJkOiBtdWx0aXBsZSBwcm9jZXNzTTNVOCBjYWxscyBjYW4gYmUgaW4gZmxpZ2h0IGNvbmN1cnJlbnRseSBmb3IKICAgICAgICAgICAgLy8gdGhlIHNhbWUgc3RyZWFtSW5mbyAob25lIHBlciBtM3U4IHBvbGwpLiBJZiB0aGlzIGJhY2t1cCBzZWFyY2ggc3RhcnRlZCBkdXJpbmcgdGhlCiAgICAgICAgICAgIC8vIGFkIGJyZWFrIGJ1dCBjb21wbGV0ZWQgQUZURVIgYSBsYXRlciBwb2xsIGFscmVhZHkgcmFuIHRoZSBlbmQtb2YtYnJlYWsgcmVzZXQKICAgICAgICAgICAgLy8gKElzU2hvd2luZ0FkID0gZmFsc2UsIEFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBudWxsKSwgY29tbWl0dGluZyB0aGUgYmFja3VwIGhlcmUKICAgICAgICAgICAgLy8gd291bGQgb3ZlcndyaXRlIHRoZSBjbGVhcmVkIHN0YXRlIGFuZCBmZWVkIHN0YWxlIHBsYXlsaXN0IGRhdGEgdG8gdGhlIHBsYXllciwKICAgICAgICAgICAgLy8gY2F1c2luZyBidWZmZXIgcmVjb25jaWxpYXRpb24gZmFpbHVyZXMgYW5kIGEgZm9yY2VkIHJlbG9hZC4gQ2hlY2sgSXNTaG93aW5nQWQKICAgICAgICAgICAgLy8gaGVyZSB0byBkaXNjYXJkIHN0YWxlIHJlc3VsdHMuCiAgICAgICAgICAgIGlmIChiYWNrdXBNM3U4ICYmIHN0cmVhbUluZm8uSXNTaG93aW5nQWQpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBiYWNrdXBNM3U4OwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSA9IGJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlICE9IGJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBiYWNrdXBQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVF1YWxpdHlUeXBlcyA9IFsnZW1iZWQnLCAnc2l0ZScsICdwb3BvdXQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoUGluQmFja3VwUGxheWVyVHlwZSB8fCBzb3VyY2VRdWFsaXR5VHlwZXMuaW5jbHVkZXMoYmFja3VwUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEJsb2NraW5nJHsoc3RyZWFtSW5mby5Jc01pZHJvbGwgPyAnIG1pZHJvbGwgJyA6ICcgJyl9YWRzICgke2JhY2t1cFBsYXllclR5cGV9KSDigJQgYmFja3VwIGZvdW5kIGluICR7RGF0ZS5ub3coKSAtIGJhY2t1cFNlYXJjaFN0YXJ0fW1zYCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5VGllciA9IGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgPyAnMzYwcCcgOiAnU291cmNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1lc2NhcGUgYmFja3VwOiAnICsgYmFja3VwUGxheWVyVHlwZSArICcgKCcgKyBxdWFsaXR5VGllciArICcpIOKAlCByZWNvdmVyZWQgZnJvbSBzdGlja3ktcGF0aCBmcmVlemUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgJiYgUHJlZmVyTG93UXVhbGl0eUJhY2t1cCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvcGxheSBiYWNrdXAgY29tbWl0dGVkIOKAlCAzNjBwIGZhbGxiYWNrIGFmdGVyIFNvdXJjZSB0eXBlcyBhZC1sYWRlbiAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFja3VwTTN1OCAmJiAhc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRGlzY2FyZGVkIHN0YWxlIGJhY2t1cCBjb21taXQgKCcgKyBiYWNrdXBQbGF5ZXJUeXBlICsgJywgJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zKSDigJQgYnJlYWsgZW5kZWQgZHVyaW5nIHNlYXJjaCcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIOKAlCBhZHMgbWF5IGxlYWsuIFRyaWVkOiAnICsgcGxheWVyVHlwZXNUb1RyeS5zbGljZShzdGFydEluZGV4KS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPOiBJbXByb3ZlIGhldmMgc3RyaXBwaW5nLiBJdCBzaG91bGQgYWx3YXlzIHN0cmlwIHdoZW4gdGhlcmUgaXMgYSBjb2RlYyBtaXNtYXRjaCAoYm90aCB3YXlzKQogICAgICAgICAgICBjb25zdCBzdHJpcEhldmMgPSBpc0hldmMgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTg7CiAgICAgICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCB8fCBzdHJpcEhldmMpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgc3RyaXBIZXZjLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghYmFja3VwTTN1OCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc3RyaXBwaW5nIGRpc2FibGVkIGFuZCBubyBiYWNrdXAg4oCUIGFkcyBXSUxMIHNob3cnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBMb2cgcmVsb2FkIG91dGNvbWUgb24gdGhlIHBvbGwgYWZ0ZXIgZWFybHkgcmVsb2FkIHRyaWdnZXJlZAogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpICYmIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdDogcGFydGlhbCDigJQgc29tZSBsaXZlIHNlZ21lbnRzIHJldHVybmVkJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCByZXN1bHQ6IGNsZWFuIOKAlCBmcmVlemUgZW5kZWQnKTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0cmlnZ2VyIGZsYWcgc28gc3Vic2VxdWVudCBmcmVlemVzIHdpdGhpbiB0aGUgc2FtZSBwb2QgY2FuIHJlLWZpcmUgKGJvdW5kZWQgYnkgRWFybHlSZWxvYWRDb3VudC9Qb2RMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0OiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemU6IGlmIHdlJ3ZlIGJlZW4gbG9vcGluZyByZWNvdmVyeSBzZWdtZW50cwogICAgICAgICAgICAvLyBmb3IgTisgcG9sbHMgKH5OeDJzKSwgdHJpZ2dlciBhIHJlbG9hZCB0byBhdHRlbXB0IGZyZXNoIGNvbnRlbnQuIEJvdW5kZWQgdG8gb25lCiAgICAgICAgICAgIC8vIHJlbG9hZCBwZXIgYWQgaW4gdGhlIHBvZCAoZS5nLiAyLWFkIHBvZCA9IHVwIHRvIDIgZWFybHkgcmVsb2FkcykuCiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IG1heEVhcmx5UmVsb2FkcyA9IHJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IG1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24gKyAnIFsnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ICsgJy8nICsgbWF4RWFybHlSZWxvYWRzICsgJ10nKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCsrOwogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBwbGF5bGlzdCBoYXMgbGl2ZSBzZWdtZW50cyDigJQgaWYgbm90LCBiYWNrdXAgc3RyZWFtIGlzIGRlYWQKICAgICAgICAgICAgY29uc3QgaGFzTGl2ZVNlZ21lbnRzID0gdGV4dFN0ci5pbmNsdWRlcygnLGxpdmUnKTsKICAgICAgICAgICAgY29uc3QgY2xlYW5UaHJlc2hvbGQgPSBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9PT0gMCA/IDEgOiAyOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gY2xlYW5UaHJlc2hvbGQgfHwgIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgaWYgKCFoYXNMaXZlU2VnbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGhhcyBubyBsaXZlIHNlZ21lbnRzIOKAlCBmb3JjaW5nIGltbWVkaWF0ZSByZWxvYWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGFkQnJlYWtEdXJhdGlvblNlYyA9IHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCkgLyAxMDAwKS50b0ZpeGVkKDEpIDogJz8nOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZpbmlzaGVkIGJsb2NraW5nIGFkcyDigJQgc3RyaXBwZWQgJyArIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzICsgJyBhZCBzZWdtZW50cywgZHVyYXRpb246ICcgKyBhZEJyZWFrRHVyYXRpb25TZWMgKyAncycpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZEluZm8gPSBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID8gJywgZWFybHkgcmVsb2FkIGF0IHBvbGwgJyArIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgOiAnJzsKICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWxsQ2xvY2tGcmVlemUgPSBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0KSAvIDEwMDApLnRvRml4ZWQoMSkgKyAncyB3YWxsLWNsb2NrJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBicmVhayBzdGF0czogJyArIHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzICsgJyBhbGwtc3RyaXBwZWQgcG9sbHMsIGZyZWV6ZSBkdXJhdGlvbjogJyArIHdhbGxDbG9ja0ZyZWV6ZSArIHJlbG9hZEluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaGFkU3RyaXBwZWRTZWdtZW50cyA9IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMDsKICAgICAgICAgICAgICAgIC8vIE9ubHkgY291bnQgdG93YXJkIGZhbHNlLXBvc2l0aXZlIGd1YXJkIGlmIHRoZSBtM3U4IGxhY2tlZCBoaWdoLWNvbmZpZGVuY2UgYWQgbWFya2Vycy4KICAgICAgICAgICAgICAgIC8vIENvbmZpcm1lZCBhZHMgKHdpdGggWC1UVi1UV0lUQ0gtQUQtQUQtU0VTU0lPTi1JRCBldGMuKSB0aGF0IHByb2R1Y2UgMCBzdHJpcHMgYXJlIHJlYWwgYWRzCiAgICAgICAgICAgICAgICAvLyB3ZSBzdWNjZXNzZnVsbHkgYXZvaWRlZCB2aWEgY2xlYW4gYmFja3VwIOKAlCBub3QgZmFsc2UgcG9zaXRpdmVzLgogICAgICAgICAgICAgICAgaWYgKCFoYWRTdHJpcHBlZFNlZ21lbnRzICYmICFzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPj0gMykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXYXJuaW5nOiAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyArICcgY29uc2VjdXRpdmUgdW5jb25maXJtZWQgYWQgYnJlYWtzIHdpdGggMCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcG9zc2libGUgZmFsc2UgcG9zaXRpdmUgZnJvbSBhZCBzaWduaWZpZXJzJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYWRTdHJpcHBlZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU2hvd2luZ0FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUpIHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gQ1NBSS1vbmx5IGFkIGJyZWFrOiBubyBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkIOKAlCBza2lwIHJlbG9hZCBlbnRpcmVseS4KICAgICAgICAgICAgICAgIGlmICghaGFkU3RyaXBwZWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUktb25seSBhZCBicmVhayAoc3RyaXBwZWQgMCkg4oCUIGNsZWFyaW5nIGJhY2t1cCB3aXRob3V0IHBsYXllciBhY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb246IGlmIEFOWSBiYWNrdXAgd2FzIGNvbW1pdHRlZCBkdXJpbmcgdGhpcyBicmVhayAoZXNjYXBlIGhhdGNoCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgY3ljbGUgcmVzY3VlIHRoYXQgZGlkbid0IG1lZXQgY3ljbGVSZXNjdWVkQ2xlYW5seSBjcml0ZXJpYSksIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIGJ1ZmZlciBoYXMgYWNjdW11bGF0ZWQgbWl4ZWQtc291cmNlIHNlZ21lbnRzIChiYWNrdXAtZmV0Y2hlZAogICAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbHRlcm5hdGUgcGxheWVyLXR5cGUgYWNjZXNzIHRva2VuICsgbmF0aXZlLWZldGNoZWQpLiBNaXhpbmcgY2FuCiAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgYXVkaW8vdmlkZW8gdHJhY2sgdGltZXN0YW1wcyB0byBkaXZlcmdlLCBhbmQgd2l0aG91dCBhIHJlbG9hZCB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBkcmlmdCBjb21wb3VuZHMgYWNyb3NzIHN1YnNlcXVlbnQgZXNjYXBlLWhhdGNoIGJyZWFrcy4gRm9yY2UgYSBoYXJkIHJlbG9hZAogICAgICAgICAgICAgICAgICAgIC8vIHRvIGZsdXNoIHRoZSBNZWRpYVNvdXJjZSBidWZmZXIgKyByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9wbGF5ICgzNjBwKSBzcGVjaWZpY2FsbHksIHRoZSByZWxvYWQgYWxzbyByZXN0b3JlcyBTb3VyY2UKICAgICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IChhdXRvcGxheS1zY29wZWQgdG9rZW4gb25seSBzZXJ2ZXMgMzYwcCB2YXJpYW50IGxhZGRlcikuCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBdXRvcGxheSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGlzQXV0b3BsYXkgPyAnYXV0b3BsYXkgKDM2MHApIOKAlCByZXN0b3JpbmcgU291cmNlIHF1YWxpdHknIDogc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSArICcg4oCUIGZsdXNoaW5nIE1lZGlhU291cmNlIHRvIHByZXZlbnQgQS9WIGRlc3luYyBhY2N1bXVsYXRpb24nOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LWVzY2FwZSByZWxvYWQ6ICcgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcykgc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5wdXNoKERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7IGtleTogJ1JlbG9hZFBsYXllcicsIGtpbmQ6ICdlYXJseScgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEF1dG8tZXNjYWxhdGUgY29vbGRvd246IGlmIDMrIHJlbG9hZHMgaW4gbGFzdCA1IG1pbiwgdHJpcGxlIHRoZSBjb29sZG93bgogICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMpIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzID0gc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzLmZpbHRlcih0ID0+IERhdGUubm93KCkgLSB0IDwgMzAwMDAwKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlY2VudFJlbG9hZHMgPSBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMuZmlsdGVyKHQgPT4gRGF0ZS5ub3coKSAtIHQgPCAzMDAwMDApLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUNvb2xkb3duID0gcmVjZW50UmVsb2FkcyA+PSAzID8gUmVsb2FkQ29vbGRvd25TZWNvbmRzICogMyA6IFJlbG9hZENvb2xkb3duU2Vjb25kczsKICAgICAgICAgICAgICAgIGNvbnN0IHRvb1Nvb25TaW5jZUxhc3RSZWxvYWQgPSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgJiYgKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQpIDwgKGVmZmVjdGl2ZUNvb2xkb3duICogMTAwMCk7CiAgICAgICAgICAgICAgICAvLyBTa2lwIGVuZC1vZi1icmVhayByZWxvYWQgd2hlbiBjeWNsZSByZXNjdWUgaGFuZGxlZCB0aGUgYnJlYWsgY2xlYW5seToKICAgICAgICAgICAgICAgIC8vIGEgZnJlZXplIG9mIOKJpDIgcG9sbHMgKH40cykgd2FzIHJlc29sdmVkIGJ5IHN3aXRjaGluZyB0byBhIGNsZWFuIGJhY2t1cCwKICAgICAgICAgICAgICAgIC8vIGFuZCBubyBlYXJseSByZWxvYWQgd2FzIG5lZWRlZC4gVGhlIHBsYXllciBpcyBvbiBhIGhlYWx0aHkgYmFja3VwIHN0cmVhbQogICAgICAgICAgICAgICAgLy8g4oCUIHJlbG9hZGluZyBqdXN0IHRvIHJldHVybiB0byB0aGUgY2Fub25pY2FsIHBsYXllciB0eXBlIGNhdXNlcyBhbiB1bm5lY2Vzc2FyeQogICAgICAgICAgICAgICAgLy8gfjEtMnMgbG9hZGluZyBjaXJjbGUuCiAgICAgICAgICAgICAgICBjb25zdCBjeWNsZVJlc2N1ZWRDbGVhbmx5ID0gc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgJiYKICAgICAgICAgICAgICAgICAgICAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgPD0gMiAmJgogICAgICAgICAgICAgICAgICAgIChzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgfHwgMCkgPT09IDA7CiAgICAgICAgICAgICAgICBpZiAoY3ljbGVSZXNjdWVkQ2xlYW5seSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEN5Y2xlIHJlc2N1ZSBoYW5kbGVkIHRoZSBicmVhayBjbGVhbmx5IOKAlCBza2lwcGluZyBlbmQtb2YtYnJlYWsgcmVsb2FkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBQb3N0LWFkIHJlbG9hZCBieXBhc3NlcyBjb29sZG93bjogaXQncyBhIGJ1ZmZlciBmbHVzaCB0aWVkIHRvIG5hdHVyYWwgYnJlYWsKICAgICAgICAgICAgICAgIC8vIGVuZCwgbm90IGEgY2FzY2FkZS1yaXNrIHJldHJ5LiBUaGUgYWQgYnJlYWsgY3ljbGUgaXRzZWxmIHJhdGUtbGltaXRzIHRoaXMKICAgICAgICAgICAgICAgIC8vIHBhdGggKG9uY2UgcGVyIGJyZWFrKS4gQ29vbGRvd24gc3RpbGwgZ2F0ZXMgYnVmZmVyLW1vbml0b3IgYW5kIG90aGVyCiAgICAgICAgICAgICAgICAvLyBjYXNjYWRlLXJpc2sgcGF0aHMgdGhhdCBjYW4gZmlyZSByZXBlYXRlZGx5IGluLWJyZWFrLgogICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVsb2FkID0gc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4IHx8IChSZWxvYWRQbGF5ZXJBZnRlckFkICYmIGhhZFN0cmlwcGVkU2VnbWVudHMgJiYgIWN5Y2xlUmVzY3VlZENsZWFubHkpOwogICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlbG9hZCkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5wdXNoKERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdSZWxvYWRQbGF5ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnZWFybHknCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0b29Tb29uU2luY2VMYXN0UmVsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNraXBwaW5nIHJlbG9hZCDigJQgbGFzdCByZWxvYWQgd2FzICcgKyAoKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQpIC8gMTAwMCkudG9GaXhlZCgwKSArICdzIGFnbyAoY29vbGRvd246ICcgKyBlZmZlY3RpdmVDb29sZG93biArICdzJyArIChyZWNlbnRSZWxvYWRzID49IDMgPyAnLCBhdXRvLWVzY2FsYXRlZCBmcm9tICcgKyByZWNlbnRSZWxvYWRzICsgJyByZWxvYWRzIGluIDVtaW4nIDogJycpICsgJyknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdQYXVzZVJlc3VtZVBsYXllcicKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0vLyBlbmQgZWxzZSAobm9uLUNTQUkgcGF0aCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IHN0cmVhbUluZm8uQWN0aXZlQmFja3VwUGxheWVyVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGVzKHN0cikgewogICAgICAgIGlmICghc3RyKSByZXR1cm4ge307CiAgICAgICAgLy8gTm9ybWFsaXplOiBhbHdheXMgcGFzcyBvbmx5IGF0dHJpYnV0ZSBzZWN0aW9uCiAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KDApID09PSAzNSkgeyAvLyAnIycKICAgICAgICAgICAgY29uc3QgaWR4ID0gc3RyLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHN0ciA9IHN0ci5zbGljZShpZHggKyAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcygKICAgICAgICAgICAgc3RyLnNwbGl0KC8oPzpefCwpKCg/OltePV0qKT0oPzoiW14iXSoifFteLF0qKSkvKQogICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB4LmluZGV4T2YoJz0nKTsKICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHguc3Vic3RyaW5nKDAsIGlkeCk7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArIDEpOwogICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBOdW1iZXIuaXNOYU4obnVtKSA/IHZhbHVlLnN0YXJ0c1dpdGgoJyInKSA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWUgOiBudW1dOwogICAgICAgICAgICB9KSk7CiAgICB9CiAgICAvLyBSZXF1ZXN0IGEgcGxheWJhY2sgYWNjZXNzIHRva2VuIGZyb20gVHdpdGNoIEdRTCB1c2luZyB0aGUgZ2l2ZW4gcGxheWVyIHR5cGUKICAgIGZ1bmN0aW9uIGdldEFjY2Vzc1Rva2VuKGNoYW5uZWxOYW1lLCBwbGF5ZXJUeXBlKSB7CiAgICAgICAgY29uc3QgYm9keSA9IHsKICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1BsYXliYWNrQWNjZXNzVG9rZW4nLAogICAgICAgICAgICB2YXJpYWJsZXM6IHsKICAgICAgICAgICAgICAgIGlzTGl2ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGxvZ2luOiBjaGFubmVsTmFtZSwKICAgICAgICAgICAgICAgIGlzVm9kOiBmYWxzZSwKICAgICAgICAgICAgICAgIHZvZElEOiAiIiwKICAgICAgICAgICAgICAgIHBsYXllclR5cGU6IHBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogcGxheWVyVHlwZSA9PSAnYXV0b3BsYXknID8gJ2FuZHJvaWQnIDogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSk7CiAgICB9CiAgICAvLyBTZW5kIGEgR1FMIHJlcXVlc3QgdG8gVHdpdGNoIHZpYSB0aGUgbWFpbiB0aHJlYWQgKHdvcmtlcnMgY2FuJ3QgbWFrZSBjcmVkZW50aWFsZWQgcmVxdWVzdHMpCiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHksIHBsYXllclR5cGUpIHsKICAgICAgICBpZiAoIUdRTERldmljZUlEKSB7CiAgICAgICAgICAgIEdRTERldmljZUlEID0gJyc7CiAgICAgICAgICAgIGNvbnN0IGRjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7CiAgICAgICAgICAgIGNvbnN0IGRjaGFyYWN0ZXJzTGVuZ3RoID0gZGNoYXJhY3RlcnMubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHsKICAgICAgICAgICAgICAgIEdRTERldmljZUlEICs9IGRjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBkY2hhcmFjdGVyc0xlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlEJzogQ2xpZW50SUQsCiAgICAgICAgICAgICdYLURldmljZS1JZCc6IEdRTERldmljZUlELAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSksCiAgICAgICAgICAgIC4uLihDbGllbnRWZXJzaW9uICYmIHsnQ2xpZW50LVZlcnNpb24nOiBDbGllbnRWZXJzaW9ufSksCiAgICAgICAgICAgIC4uLihDbGllbnRTZXNzaW9uICYmIHsnQ2xpZW50LVNlc3Npb24tSWQnOiBDbGllbnRTZXNzaW9ufSkKICAgICAgICB9OwogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGxldCBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgIGxldCBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7CiAgICBsZXQgZHJpZnRDYXRjaFVwVGltZW91dCA9IG51bGw7CiAgICBmdW5jdGlvbiBzdGFydERyaWZ0Q29ycmVjdGlvbih2aWRlb0VsZW1lbnQpIHsKICAgICAgICBpZiAoRHJpZnRDb3JyZWN0aW9uUmF0ZSA8PSAxKSByZXR1cm47CiAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICBpZiAoZHJpZnRDYXRjaFVwVGltZW91dCkgeyBjbGVhclRpbWVvdXQoZHJpZnRDYXRjaFVwVGltZW91dCk7IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOyB9CiAgICAgICAgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IERyaWZ0Q29ycmVjdGlvblJhdGU7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRHJpZnQgY29ycmVjdGlvbjogY2F0Y2hpbmcgdXAgYXQgJyArIERyaWZ0Q29ycmVjdGlvblJhdGUgKyAneCcpOwogICAgICAgIGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgdmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsKICAgICAgICAgICAgICAgIGlmICh2aWQgJiYgdmlkLmJ1ZmZlcmVkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmlkLmJ1ZmZlcmVkLmVuZCh2aWQuYnVmZmVyZWQubGVuZ3RoIC0gMSkgLSB2aWQuY3VycmVudFRpbWUgPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICB2aWQucGxheWJhY2tSYXRlID0gMS4wOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEcmlmdCBjb3JyZWN0aW9uIGNvbXBsZXRlIOKAlCByZXN1bWVkIG5vcm1hbCBwbGF5YmFjayBzcGVlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwVGltZW91dCkgeyBjbGVhclRpbWVvdXQoZHJpZnRDYXRjaFVwVGltZW91dCk7IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOyB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgIH0sIDUwMCk7CiAgICAgICAgZHJpZnRDYXRjaFVwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0cnkgeyB2aWRlb0VsZW1lbnQucGxheWJhY2tSYXRlID0gMS4wOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIGlmIChkcmlmdENhdGNoVXBJbnRlcnZhbCkgeyBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOyB9CiAgICAgICAgICAgIGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOwogICAgICAgIH0sIDMwMDAwKTsKICAgIH0KICAgIGNvbnN0IHBsYXllckJ1ZmZlclN0YXRlID0gewogICAgICAgIGNoYW5uZWxOYW1lOiBudWxsLAogICAgICAgIGhhc1N0cmVhbVN0YXJ0ZWQ6IGZhbHNlLAogICAgICAgIHBvc2l0aW9uOiAwLAogICAgICAgIGJ1ZmZlcmVkUG9zaXRpb246IDAsCiAgICAgICAgYnVmZmVyRHVyYXRpb246IDAsCiAgICAgICAgbnVtU2FtZTogMCwKICAgICAgICBmaXhBdHRlbXB0czogMCwKICAgICAgICBsYXN0Rml4VGltZTogMCwKICAgICAgICBpc0xpdmU6IHRydWUsCiAgICAgICAgbGFzdEJhY2t1cFN3aXRjaEF0OiAwLAogICAgICAgIGxhc3RSZWxvYWRBdDogMCwKICAgICAgICByZWNvdmVyeVJlbG9hZFVzZWQ6IGZhbHNlLAogICAgICAgIHVzZXJQYXVzZUludGVudDogZmFsc2UsCiAgICAgICAgbG9nZ2VkUGF1c2VJbnRlbnQ6IGZhbHNlLAogICAgICAgIHdlSnVzdFBhdXNlZDogMCwKICAgICAgICBpbkFkQnJlYWs6IGZhbHNlCiAgICB9OwogICAgLy8gUG9sbCB0aGUgcGxheWVyIHN0YXRlIHRvIGRldGVjdCBhbmQgZml4IGJ1ZmZlcmluZyBjYXVzZWQgYnkgYWQgc3RyZWFtIHN3aXRjaGluZwogICAgZnVuY3Rpb24gbW9uaXRvclBsYXllckJ1ZmZlcmluZygpIHsKICAgICAgICAvLyBGcmVzaCBwbGF5ZXIgbG9va3VwIGV2ZXJ5IHRpY2sgKGF2b2lkcyBzdGFsZSByZWYgd2hlbiBUd2l0Y2ggcmVzdGFydHMgaXRzIG93biBwbGF5ZXIpCiAgICAgICAgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgICAgIGlmIChwbGF5ZXJBbmRTdGF0ZSAmJiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIgJiYgcGxheWVyQW5kU3RhdGUuc3RhdGUpIHsKICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBsYXllckFuZFN0YXRlLnN0YXRlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgIXZpZGVvLl9fdGFzSW50ZW50SG9va2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uX190YXNJbnRlbnRIb29rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCB8fCAoRGF0ZS5ub3coKSAtIHBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCkgPiAyMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudXNlclBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcucGxheWVyOwogICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnN0YXRlOwogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXIuY29yZSkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnICYmICFwbGF5ZXIuaXNQYXVzZWQoKSAmJiAhcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKT8uZW5kZWQgJiYgKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50KCk/LnJlYWR5U3RhdGUgPz8gMCkgPj0gMSAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA8PSBEYXRlLm5vdygpIC0gUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgJiYgIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdFJlbG9hZEF0ID49IDE1MDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThVcmwgPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG0zdThVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaCA9IG0zdThVcmwubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RhcnQgPSBtM3U4VXJsLmluZGV4T2YoJz8nLCBsYXN0U2xhc2gpOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBtM3U4VXJsLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxLCBxdWVyeVN0YXJ0ICE9PSAtMSA/IHF1ZXJ5U3RhcnQgOiB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lPy5lbmRzV2l0aCgnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gZmlsZU5hbWUuc2xpY2UoMCwgLTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSAhPSBjaGFubmVsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnQ2hhbm5lbCBjaGFuZ2VkIHRvICcgKyBjaGFubmVsTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLmdldFN0YXRlKCkgPT09ICdQbGF5aW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkUG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LmJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyRHVyYXRpb24gPSBwbGF5ZXIuZ2V0QnVmZmVyRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBidWZmZXJlZFBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncG9zaXRpb246JyArIHBvc2l0aW9uICsgJyBidWZmZXJEdXJhdGlvbjonICsgYnVmZmVyRHVyYXRpb24gKyAnIGJ1ZmZlclBvc2l0aW9uOicgKyBidWZmZXJlZFBvc2l0aW9uICsgJyBzdGF0ZTogJyArIHBsYXllci5jb3JlPy5zdGF0ZT8uc3RhdGUgKyAnIHN0YXJ0ZWQ6ICcgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBjb3VsZCBiZSBpbXByb3ZlZC4gSXQgY3VycmVudGx5IGxldHMgdGhlIHBsYXllciBmdWxseSBlYXQgdGhlIGZ1bGwgYnVmZmVyIGJlZm9yZSBpdCB0cmlnZ2VycyBwYXVzZS9wbGF5CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgfHwgcG9zaXRpb24gPiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPT0gcG9zaXRpb24gfHwgYnVmZmVyRHVyYXRpb24gPCBQbGF5ZXJCdWZmZXJpbmdEYW5nZXJab25lKSAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlcmVkUG9zaXRpb24gPT0gYnVmZmVyZWRQb3NpdGlvbiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gPj0gYnVmZmVyRHVyYXRpb24gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3NpdGlvbiAhPSAwIHx8IGJ1ZmZlcmVkUG9zaXRpb24gIT0gMCB8fCBidWZmZXJEdXJhdGlvbiAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID09IFBsYXllckJ1ZmZlcmluZ1NhbWVTdGF0ZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXA6IGF0IG1vc3QgT05FIHJlbG9hZCBwZXIgcmVjb3Zlcnkgd2luZG93LiBBZnRlciByZWxvYWRpbmcgb25jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF5IG9uIHBhdXNlL3BsYXkgdW50aWwgcGxheWJhY2sgcmVjb3ZlcnMuIFByZXZlbnRzIHJlbG9hZCBjYXNjYWRlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3VsZEVzY2FsYXRlID0gcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMgPj0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0ZVRvUmVsb2FkID0gd291bGRFc2NhbGF0ZSAmJiAoRGlzYWJsZVJlbG9hZENhcCB8fCAhcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxvYWRDYXBOb3RlID0gd291bGRFc2NhbGF0ZSAmJiAhZXNjYWxhdGVUb1JlbG9hZCA/ICcgKHJlbG9hZCBjYXAgcmVhY2hlZCwgcGF1c2UvcGxheSBvbmx5IOKAlCBzZXQgdHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcD10cnVlIHRvIGJ5cGFzcyknIDogKGVzY2FsYXRlVG9SZWxvYWQgPyAnIChlc2NhbGF0aW5nIHRvIHJlbG9hZCknIDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIGZpeCBidWZmZXJpbmcgcG9zaXRpb246JyArIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uICsgJyBidWZmZXJlZFBvc2l0aW9uOicgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5idWZmZXJlZFBvc2l0aW9uICsgJyBidWZmZXJEdXJhdGlvbjonICsgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gKyByZWxvYWRDYXBOb3RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVrIHBhc3QgYnVmZmVyIGdhcCBpbnN0ZWFkIG9mIHN0YWxsaW5nICsgZHJpZnQgdG8gcmVjb3ZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQ/LigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5idWZmZXJlZC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGJpID0gMDsgYmkgPCB2aWRlby5idWZmZXJlZC5sZW5ndGg7IGJpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby5idWZmZXJlZC5zdGFydChiaSkgPiB2aWRlby5jdXJyZW50VGltZSArIDAuNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNlZWtpbmcgcGFzdCAnICsgKHZpZGVvLmJ1ZmZlcmVkLnN0YXJ0KGJpKSAtIHZpZGVvLmN1cnJlbnRUaW1lKS50b0ZpeGVkKDEpICsgJ3MgYnVmZmVyIGdhcCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdmlkZW8uYnVmZmVyZWQuc3RhcnQoYmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHZpZGVvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVmlkZW8gc3RhdGU6IHJlYWR5U3RhdGU9JyArIHZpZGVvLnJlYWR5U3RhdGUgKyAnIG5ldHdvcmtTdGF0ZT0nICsgdmlkZW8ubmV0d29ya1N0YXRlICsgJyBidWZmZXJlZD0nICsgKHZpZGVvLmJ1ZmZlcmVkLmxlbmd0aCA+IDAgPyB2aWRlby5idWZmZXJlZC5lbmQodmlkZW8uYnVmZmVyZWQubGVuZ3RoIC0gMSkudG9GaXhlZCgxKSA6IDApICsgJyBjdXJyZW50VGltZT0nICsgdmlkZW8uY3VycmVudFRpbWUudG9GaXhlZCgxKSArICcgcGF1c2VkPScgKyB2aWRlby5wYXVzZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1BhdXNlUGxheSA9IGVzY2FsYXRlVG9SZWxvYWQgPyBmYWxzZSA6ICFQbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1JlbG9hZCA9IGVzY2FsYXRlVG9SZWxvYWQgPyB0cnVlIDogUGxheWVyQnVmZmVyaW5nRG9QbGF5ZXJSZWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Ud2l0Y2hQbGF5ZXJUYXNrKGlzUGF1c2VQbGF5LCBpc1JlbG9hZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEZpeFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0ZVRvUmVsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBwb3NpdGlvbiBqdW1wIChuYXRpdmUgZ2FwIHJlY292ZXJ5KSDigJQgZHJpZnQgdG8gY2F0Y2ggdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBkdXJpbmcgYWQgYnJlYWtzIGFuZCAxMHMgYWZ0ZXI6IGJhY2t1cCBzdHJlYW0gc3dpdGNoaW5nIGNhdXNlcyBidWZmZXIgZ2FwcyB0aGF0IHRyaWdnZXIgZmFsc2UganVtcHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID4gMCAmJiBwb3NpdGlvbiAtIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID4gNSAmJiAhcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrICYmICghcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0IHx8IERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QmFja3VwU3dpdGNoQXQgPj0gMTAwMDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3NpdGlvbiBqdW1wZWQgJyArIChwb3NpdGlvbiAtIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uKS50b0ZpeGVkKDEpICsgJ3Mg4oCUIHN0YXJ0aW5nIGRyaWZ0IGNvcnJlY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiA9IGJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID0gYnVmZmVyRHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIHdoZW4gbW9uaXRvcmluZyBwbGF5ZXIgZm9yIGJ1ZmZlcmluZzogJyArIGVycik7CiAgICAgICAgICAgICAgICBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2FkaW5nLWNpcmNsZSBoZWFsdGggY2hlY2s6IGR1cmluZyBhbiBhZCBzdHJpcCtyZWNvdmVyeSBsb29wIHRoZSBub3JtYWwgYnVmZmVyIG1vbml0b3IKICAgICAgICAvLyBpcyBnYXRlZCBvZmYgKGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMpLCBzbyBhIHZpc2libHkgc3RhbGxlZCBwbGF5ZXIgd291bGQgb3RoZXJ3aXNlIHdhaXQKICAgICAgICAvLyBmb3IgdGhlIHdvcmtlcidzIHBvbGwtYmFzZWQgZWFybHkgcmVsb2FkICh+MTBzKS4gVGhpcyBjYXRjaGVzIHRoZSB2aXNpYmxlIHN0YWxsIH4zcyBhZnRlcgogICAgICAgIC8vIGl0IHN0YXJ0cyBhbmQgdHJpZ2dlcnMgYSByZWxvYWQgZGlyZWN0bHksIGVsaW1pbmF0aW5nIG1vc3Qgb2YgdGhlIGxvYWRpbmctY2lyY2xlIHdpbmRvdy4KICAgICAgICBpZiAoaXNBY3RpdmVseVN0cmlwcGluZ0FkcyAmJiBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnBsYXllcjsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyPy5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8uZW5kZWQgJiYgIXBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIHBsYXllciBoYXMgZXZlciBoYWQgZGF0YSDigJQgZGlzdGluZ3Vpc2hlcyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAvLyAoaGFkIGRhdGEsIGxvc3QgZGF0YSkgZnJvbSBpbml0aWFsIHBsYXllciBpbml0IChuZXZlciBoYWQgZGF0YSB5ZXQpLgogICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgZnJlc2ggcGFnZSBsb2FkICsgcHJlcm9sbCBjYXVzZXMgUFIgIzk2IHRvIG1pc2ZpcmUgcmVwZWF0ZWRseQogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVhZHlTdGF0ZT0wIGlzIG5vcm1hbCBkdXJpbmcgaW5pdC4KICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1N0YWxsZWQgPSB2aWRlby5yZWFkeVN0YXRlIDwgMyAmJiAodmlkZW8ucGF1c2VkIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gMik7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhbGxSZWxvYWRDb29sZG93biA9IDE1MDAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb2xkb3duRXhwaXJlZCA9ICFwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QWRTdGFsbFJlbG9hZEF0IHx8IChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCkgPiBzdGFsbFJlbG9hZENvb2xkb3duOwogICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGZpcmUgbG9hZGluZy1jaXJjbGUgcmVsb2FkIGlmIEFOWSByZWxvYWQgaGFwcGVuZWQgcmVjZW50bHkg4oCUIHJlYWR5U3RhdGU9MAogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBleHBlY3RlZCB0cmFuc2llbnQgc3RhdGUgZHVyaW5nIGEgcmVsb2FkJ3MgTWVkaWFTb3VyY2UgdGVhcmRvd24uIFdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLCBhbiBlYXJseS1yZWxvYWQgaW4gZmxpZ2h0IGNhbiB0cmlnZ2VyIGEgcmVkdW5kYW50IGxvYWRpbmctY2lyY2xlIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWQgPSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQpIDwgc3RhbGxSZWxvYWRDb29sZG93bjsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGFsbGVkICYmIGNvb2xkb3duRXhwaXJlZCAmJiAhcmVjZW50UmVsb2FkICYmIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpID4gMzAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTG9hZGluZyBjaXJjbGUgZGV0ZWN0ZWQgZHVyaW5nIGFkIGJyZWFrICgnICsgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHN0YWxsLCByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJykg4oCUIGVhcmx5IHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkIHJlbG9hZDogYSBzdHVjayBtZWRpYSBwbGF5ZXIgbmVlZHMgaXRzIE1lZGlhU291cmNlIHJlYnVpbHQsIG5vdCBqdXN0IGFuIG0zdTggcmVmZXRjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgJ2Vhcmx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1N0YWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0gZWxzZSBpZiAoIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIHsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc0xpdmUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUuaXNMaXZlICYmICFpc0xpdmUpIHsKICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcih7CiAgICAgICAgICAgICAgICBoYXNBZHM6IGZhbHNlCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pc0xpdmUgPSBpc0xpdmU7CiAgICAgICAgLy8gRm9yY2UgaW1tZWRpYXRlIHRpY2sgd2hlbiB0YWIgYmVjb21lcyB2aXNpYmxlIHNvIHN0YWxscyBhcmUgY2F1Z2h0IGZhc3Qgb24gcmV0dXJuCiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcudmlzaWJpbGl0eUhvb2tlZCkgewogICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnZpc2liaWxpdHlIb29rZWQgPSB0cnVlOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcucGVuZGluZ1RpY2spIHsKICAgICAgICAgICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnBlbmRpbmdUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9uaXRvclBsYXllckJ1ZmZlcmluZy5wZW5kaW5nVGljayA9IGZhbHNlOyBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7IH0sIDEwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBDYXRjaCBwZXJzaXN0ZW50IGFkLWJyZWFrIG92ZXJsYXlzIChlLmcuICJ0YWtpbmcgYW4gYWQgYnJlYWsgLyBzdGljayBhcm91bmQiKQogICAgICAgIC8vIGV2ZW4gYWZ0ZXIgaGFzQWRzIGhhcyB0cmFuc2l0aW9uZWQgdG8gZmFsc2UuIHVwZGF0ZUFkYmxvY2tCYW5uZXIgb25seSBjYWxscwogICAgICAgIC8vIGhpZGVUd2l0Y2hBZE92ZXJsYXlzIGR1cmluZyB0aGUgYWN0aXZlIGFkIGJyZWFrOyBzb21lIG92ZXJsYXlzIGhhdmUgdGhlaXIgb3duCiAgICAgICAgLy8gbGlmZWN5Y2xlIGFuZCBzdGF5IHZpc2libGUgYWZ0ZXJ3YXJkcy4gUnVubmluZyBoZXJlIG9uIGV2ZXJ5IG1vbml0b3IgdGljawogICAgICAgIC8vICgxLTNzIGNhZGVuY2UpIGtlZXBzIHRoZW0gaGlkZGVuIHdpdGhvdXQgYSBkZWRpY2F0ZWQgaW50ZXJ2YWwuCiAgICAgICAgdHJ5IHsgaGlkZVR3aXRjaEFkT3ZlcmxheXMoKTsgfSBjYXRjaCB7fQogICAgICAgIC8vIFZpc2liaWxpdHktYXdhcmUgYmFja29mZjogcG9sbCAzeCBzbG93ZXIgd2hlbiB0YWIgaXMgaGlkZGVuIChidXQgTk9UIGR1cmluZyBQaVAg4oCUIHVzZXIgaXMgc3RpbGwgd2F0Y2hpbmcpCiAgICAgICAgY29uc3Qgc2hvdWxkVGhyb3R0bGUgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmhpZGRlbiAmJiAhZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQ7CiAgICAgICAgY29uc3QgbmV4dERlbGF5ID0gc2hvdWxkVGhyb3R0bGUgPyBQbGF5ZXJCdWZmZXJpbmdEZWxheSAqIDMgOiBQbGF5ZXJCdWZmZXJpbmdEZWxheTsKICAgICAgICBzZXRUaW1lb3V0KG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcsIG5leHREZWxheSk7CiAgICB9CiAgICAvLyBIaWRlIFR3aXRjaCdzIGFkIGJyZWFrIC8gVHVyYm8gcHJvbW8gLyBzdHJlYW0gZGlzcGxheSBhZCBvdmVybGF5cyB3aGVuIHdlJ3JlIGFscmVhZHkgYmxvY2tpbmcgYWRzCiAgICBmdW5jdGlvbiBoaWRlVHdpdGNoQWRPdmVybGF5cygpIHsKICAgICAgICBpZiAoIWNhY2hlZFBsYXllclJvb3REaXYgfHwgIWNhY2hlZFBsYXllclJvb3REaXYuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgICAgICAvLyBIaWRlIHN0cmVhbSBkaXNwbGF5IGFkIChTREEpIHdyYXBwZXIKICAgICAgICBjb25zdCBzZGFFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRlc3Qtc2VsZWN0b3I9InNkYS13cmFwcGVyIl0nKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNkYUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghc2RhRWxlbWVudHNbaV0uZGF0YXNldC50YXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIHNkYUVsZW1lbnRzW2ldLmRhdGFzZXQudGFzSGlkZGVuID0gJyc7CiAgICAgICAgICAgICAgICBzZGFFbGVtZW50c1tpXS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRTZGFIaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VkU2RhSGlkZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSGlkZGVuIFR3aXRjaCBzdHJlYW0gZGlzcGxheSBhZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgaWYgKCFjYWNoZWRQbGF5ZXJSb290RGl2IHx8ICFjYWNoZWRQbGF5ZXJSb290RGl2LmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIGNhY2hlZFBsYXllclJvb3REaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tcGxheWVyJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllclJvb3REaXYgPSBjYWNoZWRQbGF5ZXJSb290RGl2OwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgPSBkYXRhLmlzU3RyaXBwaW5nQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIHBsYXllckJ1ZmZlclN0YXRlLmlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuaGFzQWRzKSB7CiAgICAgICAgICAgICAgICBoaWRlVHdpdGNoQWRPdmVybGF5cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gVHJhdmVyc2UgUmVhY3QncyBmaWJlciB0cmVlIHRvIGZpbmQgVHdpdGNoJ3MgcGxheWVyIGFuZCBwbGF5ZXIgc3RhdGUgaW5zdGFuY2VzCiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgaWYgKCFjYWNoZWRSb290Tm9kZSkgewogICAgICAgICAgICAgICAgY2FjaGVkUm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gY2FjaGVkUm9vdE5vZGU7CiAgICAgICAgICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdCAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCkgewogICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZWFjdFJvb3ROb2RlID09IG51bGwgJiYgcm9vdE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IE9iamVjdC5rZXlzKHJvb3ROb2RlKS5maW5kKHggPT4geC5zdGFydHNXaXRoKCdfX3JlYWN0Q29udGFpbmVyJykgfHwgeC5zdGFydHNXaXRoKCdfX3JlYWN0RmliZXInKSk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlW2NvbnRhaW5lck5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFjdFJvb3ROb2RlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWFjdFJvb3ROb2RlID0gZmluZFJlYWN0Um9vdE5vZGUoKTsKICAgICAgICBpZiAoIXJlYWN0Um9vdE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGxldCBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRQbGF5ZXJBY3RpdmUgJiYgbm9kZS5wcm9wcyAmJiBub2RlLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UpOwogICAgICAgIHBsYXllciA9IHBsYXllciAmJiBwbGF5ZXIucHJvcHMgJiYgcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgPyBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgaWYgKHBsYXllcj8ucGxheWVySW5zdGFuY2UpIHsKICAgICAgICAgICAgcGxheWVyID0gcGxheWVyLnBsYXllckluc3RhbmNlOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCBpZiBUd2l0Y2ggb2JmdXNjYXRlcyBwcm9wZXJ0eSBuYW1lcwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQgJiYgbm9kZS5nZXRCdWZmZXJEdXJhdGlvbiAmJiBub2RlLmNvcmU/LnN0YXRlKTsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2gg4oCUIHNldFNyYyBleGlzdHMgYnV0IHNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzIHdhcyByZW5hbWVkCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjayA9ICFwbGF5ZXJTdGF0ZSA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldFN0cmVhbU1hbmFnZXJOb2RlICYmICFub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQpIDogbnVsbDsKICAgICAgICAvLyBGYWxsYmFjayAyOiBUVFYtQUIncyBhcHByb2FjaCDigJQgdmlkZW9QbGF5ZXJJbnN0YW5jZSB3aXRoIHBsYXllck1vZGUKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMiA9ICFwbGF5ZXJTdGF0ZSAmJiAhcGxheWVyU3RhdGVGYWxsYmFjayA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlPy5wbGF5ZXJNb2RlICE9PSB1bmRlZmluZWQpPy5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgY29uc3QgZmluYWxQbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlIHx8IHBsYXllclN0YXRlRmFsbGJhY2sgfHwgcGxheWVyU3RhdGVGYWxsYmFjazI7CiAgICAgICAgLy8gR3JhY2UgcGVyaW9kIGJlZm9yZSBsb2dnaW5nICJub3QgZm91bmQiIHdhcm5pbmdzLiBUaGUgYnVmZmVyIG1vbml0b3IgY2FuIHRpY2sKICAgICAgICAvLyBiZWZvcmUgUmVhY3QgaGFzIGZpbmlzaGVkIG1vdW50aW5nIHRoZSBwbGF5ZXIsIGxlYWRpbmcgdG8gYSBmYWxzZS1wb3NpdGl2ZQogICAgICAgIC8vIGxvZyB0aGF0IGZpcmVzIG9uY2Ugb24gZXZlcnkgcGFnZSBsb2FkLiBPbmx5IGxvZyBpZiB0aGUgbnVsbCBzdGF0ZSBwZXJzaXN0cwogICAgICAgIC8vIGZvciAxMCsgc2Vjb25kcyDigJQgYnkgdGhlbiBSZWFjdCBpcyBkZWZpbml0ZWx5IG1vdW50ZWQgYW5kIGEgcGVyc2lzdGVudCBudWxsCiAgICAgICAgLy8gaW5kaWNhdGVzIHJlYWwgQVBJIGRyaWZ0IChUd2l0Y2ggcmVuYW1lZCBzZXRQbGF5ZXJBY3RpdmUvc2V0U3JjL2V0YykuCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgaWYgKCFnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCkgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyICYmIChEYXRlLm5vdygpIC0gZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQpID4gMTAwMDApIHsKICAgICAgICAgICAgICAgIGdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFBsYXllckFjdGl2ZS9tZWRpYVBsYXllckluc3RhbmNlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIGlmICghZmluYWxQbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQpIGdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vU3RhdGUgJiYgKERhdGUubm93KCkgLSBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFN0YXRlTnVsbEF0KSA+IDEwMDAwKSB7CiAgICAgICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5sb2dnZWROb1N0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBzdGF0ZSBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFNyYy9zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncycpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RTdGF0ZU51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgLy8gUGF1c2UvcGxheSBvciBmdWxseSByZWxvYWQgdGhlIFR3aXRjaCBwbGF5ZXIsIHByZXNlcnZpbmcgcXVhbGl0eS92b2x1bWUgc2V0dGluZ3MKICAgIGZ1bmN0aW9uIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQsIHJlbG9hZEtpbmQpIHsKICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgaWYgKCFwbGF5ZXJBbmRTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcmVhY3Qgcm9vdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckFuZFN0YXRlLnBsYXllcjsKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IHBsYXllckFuZFN0YXRlLnN0YXRlOwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXInKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXBsYXllclN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXIgc3RhdGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB3YXNQYXVzZWQgPSBwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkOwogICAgICAgIGlmICh3YXNQYXVzZWQpIHsKICAgICAgICAgICAgLy8gVXNlciBkZWxpYmVyYXRlbHkgcGF1c2VkIOKAlCByZXNwZWN0IHRoZWlyIGludGVudCwgZG9uJ3QgYXV0by1yZXN1bWUKICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZXNwZWN0aW5nIHVzZXIgcGF1c2UgaW50ZW50IOKAlCBza2lwcGluZyBhdXRvLXJlc3VtZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIFdFIHJlY2VudGx5IGNhbGxlZCBwYXVzZS9wbGF5IGFuZCBwbGF5ZXIgaXMgc3RpbGwgcGF1c2VkLCByZXRyeSBwbGF5IChzdHVjayBmcm9tIGF1dG9wbGF5IHBvbGljeSBvciBhZC1zdGF0ZSBpbnRlcmZlcmVuY2UpCiAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQpIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXdhc1BhdXNlZCkgewogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgPSAwOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQgJiYgZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQpIHsKICAgICAgICAgICAgLy8gU2tpcCByZWxvYWQgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IGhlYWx0aHkg4oCUIGF2b2lkcyBkaXNydXB0aW5nIHNtb290aCBwbGF5YmFjay4KICAgICAgICAgICAgLy8gQnV0IGlmIHdlJ3JlIHdheSBiZWhpbmQgbGl2ZSBlZGdlIChlLmcuIGFmdGVyIGEgbG9uZyBhZCBicmVhayksIHByb2NlZWQgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeS4KICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5yZWFkeVN0YXRlID49IDMgJiYgIXZpZGVvLnBhdXNlZCAmJiAhdmlkZW8uZW5kZWQpIHsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5U2VjID0gMDsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5S25vd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLnNlZWthYmxlICYmIHZpZGVvLnNlZWthYmxlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vla2FibGVFbmQgPSB2aWRlby5zZWVrYWJsZS5lbmQodmlkZW8uc2Vla2FibGUubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoc2Vla2FibGVFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxjID0gTWF0aC5tYXgoMCwgc2Vla2FibGVFbmQgLSB2aWRlby5jdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2FwOiB2YWx1ZXMgPjFoIGluZGljYXRlIGdhcmJhZ2UgZnJvbSB0aGUgTWVkaWEgU291cmNlIEFQSQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHNlZW4gcmlnaHQgYWZ0ZXIgYSByZWxvYWQgd2hpbGUgdGhlIHNlZWthYmxlIHJhbmdlIGlzIGluIGEgdHJhbnNpZW50IHN0YXRlKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxjIDwgMzYwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lTZWMgPSBjYWxjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lLbm93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgaWYgKCFsYXRlbmN5S25vd24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBMYXRlbmN5IHVua25vd24gKHNlZWthYmxlIHVuYXZhaWxhYmxlKSDigJQgcHJvY2VlZGluZyB3aXRoIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXRlbmN5U2VjID4gNykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBwbGF5aW5nIGJ1dCAnICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kIGxpdmUg4oCUIHByb2NlZWRpbmcgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeScpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIHBsYXllciBoZWFsdGh5IChyZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJywgcGxheWluZywgbGF0ZW5jeT0nICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MpJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1JlbG9hZCkgewogICAgICAgICAgICBjb25zdCBsc0tleVF1YWxpdHkgPSAndmlkZW8tcXVhbGl0eSc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5TXV0ZWQgPSAndmlkZW8tbXV0ZWQnOwogICAgICAgICAgICBjb25zdCBsc0tleVZvbHVtZSA9ICd2b2x1bWUnOwogICAgICAgICAgICBsZXQgY3VycmVudFF1YWxpdHlMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50TXV0ZWRMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50Vm9sdW1lTFMgPSBudWxsOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY3VycmVudFF1YWxpdHlMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5UXVhbGl0eSk7CiAgICAgICAgICAgICAgICBjdXJyZW50TXV0ZWRMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TXV0ZWQpOwogICAgICAgICAgICAgICAgY3VycmVudFZvbHVtZUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlWb2x1bWUpOwogICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgJiYgcGxheWVyPy5jb3JlPy5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBwbGF5ZXIuY29yZS5zdGF0ZS52b2x1bWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlRdWFsaXR5LCBKU09OLnN0cmluZ2lmeSh7ZGVmYXVsdDpwbGF5ZXIuY29yZS5zdGF0ZS5xdWFsaXR5Lmdyb3VwfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmFkU3RhbGxTdGFydEF0ID0gMDsvLyBjbGVhciBzdGFsZSBzdGFsbCB0aW1lciBzbyBwb3N0LXJlbG9hZCByZWFkeVN0YXRlPTAgaXNuJ3QgYXR0cmlidXRlZCB0byBwcmUtcmVsb2FkIHN0YWxsCiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCA9IGZhbHNlOwogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCA9IGZhbHNlOwogICAgICAgICAgICAvLyBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nIHJlLWFjcXVpcmVkIGZyZXNoIGV2ZXJ5IHRpY2sg4oCUIG5vIG1hbnVhbCBpbnZhbGlkYXRpb24gbmVlZGVkCiAgICAgICAgICAgIC8vIEhhcmQgcmVsb2FkIGZvciAnZWFybHknIChtaWQtYnJlYWsgZXNjYXBlIOKAlCBmcmVzaCBzZXNzaW9uIGdldHMgbmV3IGFkLWRlY2lzaW9uIGJ1Y2tldCkuCiAgICAgICAgICAgIC8vIFNvZnQgcmVsb2FkIGZvciAncG9zdC1hZCcgKHNtb290aCB0cmFuc2l0aW9uLCBubyBibGFjayBzY3JlZW4gdGVhcmRvd24pLgogICAgICAgICAgICBjb25zdCBoYXJkUmVsb2FkID0gcmVsb2FkS2luZCA9PT0gJ2Vhcmx5JzsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlbG9hZGluZyBUd2l0Y2ggcGxheWVyJyArIChoYXJkUmVsb2FkID8gJyAoaGFyZCknIDogJyAoc29mdCknKSk7CiAgICAgICAgICAgIHBsYXllclN0YXRlLnNldFNyYyh7IGlzTmV3TWVkaWFQbGF5ZXJJbnN0YW5jZTogaGFyZFJlbG9hZCwgcmVmcmVzaEFjY2Vzc1Rva2VuOiBoYXJkUmVsb2FkIH0pOwogICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVHJpZ2dlcmVkUGxheWVyUmVsb2FkJyk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICAvLyBBbHdheXMgcmVzdG9yZSBtdXRlZC92b2x1bWUgc3RhdGUgYWZ0ZXIgcmVsb2FkIOKAlCBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBmb3JjZSBtdXRlZC4KICAgICAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgICAgICAvLyBjbGVhcmVkIGNhY2hlKSwgdGhlIHZpZGVvIHN0aWxsIG5lZWRzIHVubXV0ZSBhZnRlciBDaHJvbWUncyBhdXRvcGxheSBtdXRlIG9uIHJlbG9hZC4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWFsaXR5TFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNdXRlZExTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWVMUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCB3cml0ZXMgdmlkZW8tbXV0ZWQgYXMgJ3siZGVmYXVsdCI6dHJ1ZX0nIHdoZW4gdXNlciBtdXRlZCB2aWEgVUk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENocm9tZSBhdXRvcGxheSBwb2xpY3kgY2FuIG11dGUgZXZlbiBpZiB1c2VyIGRpZG4ndCAobm8gTFMgc2lnbmFsKS4KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLm11dGVkICYmICF1c2VySW50ZW5kZWRNdXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0ubXV0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IGxpdmUgZHJpZnQgYWZ0ZXIgcmVsb2FkLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgaGFyZCByZWxvYWQgd2l0aCBsYXJnZSBkcmlmdCAoPjVzKSwgaGFyZC1zZWVrIHRvIGxpdmUgZWRnZSB0byBmbHVzaAogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgQS9WIHRpbWVzdGFtcCBkZXN5bmMgZnJvbSBzdHJpcCtCTEFOS19NUDQrcmVjb3ZlcnkgYWN0aXZpdHkuIERyaWZ0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Rpb24gYXQgMS4xeCB3b3VsZCB0YWtlIG1pbnV0ZXMgdG8gY2F0Y2ggdXAgMzAtNjBzIG9mIGRyaWZ0LgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igc29mdCByZWxvYWQgb3Igc21hbGwgZHJpZnQsIHVzZSBleGlzdGluZyBncmFkdWFsIGNhdGNoLXVwLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLmJ1ZmZlcmVkLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLnJlYWR5U3RhdGUgPj0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGl2ZUVkZ2UgPSB2aWRlb3NbMF0uYnVmZmVyZWQuZW5kKHZpZGVvc1swXS5idWZmZXJlZC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyaWZ0ID0gbGl2ZUVkZ2UgLSB2aWRlb3NbMF0uY3VycmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFyZFJlbG9hZCAmJiBkcmlmdCA+IDUgJiYgTnVtYmVyLmlzRmluaXRlKGxpdmVFZGdlKSAmJiBsaXZlRWRnZSA8IDM2MDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LWhhcmQtcmVsb2FkIHNlZWsgdG8gbGl2ZSDigJQgJyArIGRyaWZ0LnRvRml4ZWQoMSkgKyAncyBiZWhpbmQsIGp1bXBpbmcgdG8gbGl2ZSBlZGdlIHRvIGZsdXNoIEEvViBkcmlmdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5jdXJyZW50VGltZSA9IGxpdmVFZGdlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkcmlmdCA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LXJlbG9hZCBsaXZlIGRyaWZ0IGNvcnJlY3Rpb246ICcgKyBkcmlmdC50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREcmlmdENvcnJlY3Rpb24odmlkZW9zWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIH0sIDMwMDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gKCkgPT4gewogICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSk7CiAgICB9OwogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCBmZXRjaFJlcXVlc3Qub3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICAvLyBIb29rIGZldGNoKCkgaW4gdGhlIHdpbmRvdyBzY29wZSB0byBjYXB0dXJlIGF1dGggaGVhZGVycyBhbmQgbW9kaWZ5IHBsYXllciB0eXBlIHJlcXVlc3RzCiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0LCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBHUUxEZXZpY2VJRCAhPSBkZXZpY2VJZCkgewogICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlRGV2aWNlSWQnLCBHUUxEZXZpY2VJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1WZXJzaW9uJ10gIT09IENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uID0gaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXSAhPT0gQ2xpZW50U2Vzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50U2Vzc2lvbicsIENsaWVudFNlc3Npb24gPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSAhPT0gQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInLCBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddICE9PSBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWRIZWFkZXJzICYmIEdRTERldmljZUlEICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChHUUxEZXZpY2VJRCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VkUGxheWVyVHlwZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gSlNPTi5wYXJzZShpbml0LmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdCb2R5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVwbGFjZWQgJyR7cmVwbGFjZWRQbGF5ZXJUeXBlfScgcGxheWVyIHR5cGUgd2l0aCAnJHtGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZX0nIHBsYXllciB0eXBlYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NhaVR5cGUgPSB1cmwuaW5jbHVkZXMoJ2JwPW1pZHJvbGwnKSA/ICdtaWRyb2xsJyA6IHVybC5pbmNsdWRlcygnYnA9cHJlcm9sbCcpID8gJ3ByZXJvbGwnIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyhjc2FpVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZChjc2FpVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgYWQgcmVxdWVzdCBkZXRlY3RlZCDigJQgdHlwZTogJyArIGNzYWlUeXBlICsgJyAoY2xpZW50LXNpZGUgYWQgaW5zZXJ0aW9uLCBub3QgYmxvY2thYmxlIHZpYSBtM3U4KScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwgJ2ZldGNoJyk7CiAgICB9CiAgICAvLyBTZXQgdXAgdmlzaWJpbGl0eSBvdmVycmlkZXMgYW5kIGxvY2FsU3RvcmFnZSBob29rcyB0byBwcmVzZXJ2ZSBwbGF5ZXIgc3RhdGUgYWNyb3NzIHJlbG9hZHMKICAgIGZ1bmN0aW9uIG9uQ29udGVudExvYWRlZCgpIHsKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldmVudHYtZXh0ZW5zaW9uJykpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2FybmluZzogN1RWIGV4dGVuc2lvbiBkZXRlY3RlZCDigJQgbWF5IGNhdXNlIGJsYWNrIHNjcmVlbiBvciBidWZmZXJpbmcgaXNzdWVzLiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcywgdHJ5IGRpc2FibGluZyA3VFYuJyk7CiAgICAgICAgfQogICAgICAgIC8vIFRoaXMgc3RvcHMgVHdpdGNoIGZyb20gcGF1c2luZyB0aGUgcGxheWVyIHdoZW4gaW4gYW5vdGhlciB0YWIgYW5kIGFuIGFkIHNob3dzLgogICAgICAgIC8vIFRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhdWNldHR2L1ZpZGVvQWRCbG9ja0ZvclR3aXRjaC9ibG9iL2NlZmNlOWQyYjU2NTc2OWM3N2UzNjY2YWM4MjM0YzNhY2ZlMjBkODMvY2hyb21lL2NvbnRlbnQuanMjTDMwCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAndmlzaWJpbGl0eVN0YXRlJywgewogICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAndmlzaWJsZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgbGV0IGhpZGRlbiA9IGRvY3VtZW50Ll9fbG9va3VwR2V0dGVyX18oJ2hpZGRlbicpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2hpZGRlbicsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgY29uc3QgYmxvY2sgPSBlID0+IHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIH07CiAgICAgICAgbGV0IHdhc1ZpZGVvUGxheWluZyA9IHRydWU7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eUNoYW5nZSA9IGUgPT4gewogICAgICAgICAgICBjb25zdCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoaGlkZGVuICYmIGhpZGRlbi5hcHBseShkb2N1bWVudCkgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICB3YXNWaWRlb1BsYXlpbmcgPSAhdmlkZW9zWzBdLnBhdXNlZCAmJiAhdmlkZW9zWzBdLmVuZGVkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnVGFiIGZvY3VzZWQuIFN0cmVhbSBzaG91bGQgYmUgYWN0aXZlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0ucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmxvY2soZSk7CiAgICAgICAgfTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgdHJ5IHsgZG9jdW1lbnQuaGFzRm9jdXMgPSAoKSA9PiB0cnVlOyB9IGNhdGNoe30KICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBkZWNsYXJlT3B0aW9ucyh3aW5kb3cpOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBsc1JlbG9hZEFmdGVyQWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkUGxheWVyQWZ0ZXJBZCcpOwogICAgICAgIGlmIChsc1JlbG9hZEFmdGVyQWQgIT09IG51bGwpIHsKICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IGxzUmVsb2FkQWZ0ZXJBZCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc1JlbG9hZENvb2xkb3duID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZENvb2xkb3duU2Vjb25kcycpKTsKICAgICAgICBpZiAoIWlzTmFOKGxzUmVsb2FkQ29vbGRvd24pICYmIGxzUmVsb2FkQ29vbGRvd24gPj0gMCkgewogICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSBsc1JlbG9hZENvb2xkb3duOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVSZWxvYWRDYXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcCcpOwogICAgICAgIGlmIChsc0Rpc2FibGVSZWxvYWRDYXAgIT09IG51bGwpIHsKICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9IGxzRGlzYWJsZVJlbG9hZENhcCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0RyaWZ0UmF0ZSA9IHBhcnNlRmxvYXQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2RyaWZ0Q29ycmVjdGlvblJhdGUnKSk7CiAgICAgICAgaWYgKCFpc05hTihsc0RyaWZ0UmF0ZSkgJiYgbHNEcmlmdFJhdGUgPj0gMCkgewogICAgICAgICAgICBEcmlmdENvcnJlY3Rpb25SYXRlID0gbHNEcmlmdFJhdGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGxheWVyVHlwZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19wbGF5ZXJUeXBlJyk7CiAgICAgICAgaWYgKGxzUGxheWVyVHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9IGxzUGxheWVyVHlwZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQaW5CYWNrdXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcGluQmFja3VwUGxheWVyVHlwZScpOwogICAgICAgIGlmIChsc1BpbkJhY2t1cCAhPT0gbnVsbCkgewogICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gbHNQaW5CYWNrdXAgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQcmVmZXJMb3cgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcHJlZmVyTG93UXVhbGl0eUJhY2t1cCcpOwogICAgICAgIGlmIChsc1ByZWZlckxvdyA9PT0gJ2ZhbHNlJykgewogICAgICAgICAgICBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgc3RpY2t5IENTQUkgcGF0aCBvbmx5LCBubyBhdXRvcGxheSBmYWxsYmFjayBvciBlc2NhcGUgaGF0Y2gnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNCYWNrdXBTd2FwRmlyc3QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfYmFja3VwU3dhcEZpcnN0Jyk7CiAgICAgICAgaWYgKGxzQmFja3VwU3dhcEZpcnN0ID09PSAnZmFsc2UnKSB7CiAgICAgICAgICAgIEJhY2t1cFN3YXBGaXJzdCA9IGZhbHNlOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXBTd2FwRmlyc3QgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgdXNpbmcgc3RpY2t5IENTQUkgcGF0aCAoc3RyaXAgb24gbmF0aXZlIHN0cmVhbSknKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNIaWRlQWRPdmVybGF5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2hpZGVBZE92ZXJsYXknKTsKICAgICAgICBpZiAobHNIaWRlQWRPdmVybGF5ID09PSAndHJ1ZScpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9ICcudGFzLWFkYmxvY2stb3ZlcmxheSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSc7CiAgICAgICAgICAgIChkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgIH0KICAgIH0gY2F0Y2gge30KICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENvbmZpZzogUmVsb2FkUGxheWVyQWZ0ZXJBZCA9ICcgKyBSZWxvYWRQbGF5ZXJBZnRlckFkICsgJywgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgPSAnICsgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIGlmIChQbGF5ZXJCdWZmZXJpbmdGaXgpIHsKICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7CiAgICB9CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbWV0ZXIgcmVxdWlyZWQgKDAgPSBubyBzaW11bGF0ZWQgYWQsIDErID0gdXNlIGJhY2t1cCBwbGF5ZXIgZm9yIGdpdmVuIGRlcHRoKScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdTaW11bGF0ZUFkcycsIGRlcHRoKTsKICAgIH07CiAgICB3aW5kb3cuYWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gKCkgPT4gewogICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMnKTsKICAgIH07Cn0pKCk7Cg=="},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIGluc3RhbmNlCiAgICAvLyB0aGF0IGZpZ2h0cyBmb3IgcGxheWVyIGNvbnRyb2wuIE9ubHkgdGhlIHRvcCBmcmFtZSBob3N0cyB0aGUgcGxheWVyIG9uIHR3aXRjaC50di9DSEFOTkVMOwogICAgLy8gbmVzdGVkIGF1eGlsaWFyeSBmcmFtZXMgYXJlIG5vaXNlLgogICAgLy8gQWxsb3ctbGlzdCBmb3IgbmVzdGVkLWZyYW1lIGluamVjdGlvbjogVHdpdGNoJ3MgdGhyZWUgZG9jdW1lbnRlZCBlbWJlZCBjb250ZXh0cwogICAgLy8gKGh0dHBzOi8vZGV2LnR3aXRjaC50di9kb2NzL2VtYmVkL3ZpZGVvLWFuZC1jbGlwcy8pIOKAlCBwcmVzZXJ2ZXMgVHdpdGNoIHN0cmVhbXMKICAgIC8vIGVtYmVkZGVkIG9uIHRoaXJkLXBhcnR5IHNpdGVzIHdoZXJlIHRoZSBzY3JpcHQgcnVucyBpbiBhbiBpZnJhbWUgd2hvc2UgcGFyZW50CiAgICAvLyBpcyBvbiBhIGRpZmZlcmVudCBvcmlnaW4uCiAgICAvLyBVc2Ugd2luZG93LmZyYW1lRWxlbWVudCB0byBkZXRlY3QgbmVzdGVkIGZyYW1lcyDigJQgbnVsbCBvbiB0b3AgZnJhbWUsIHRoZSBpZnJhbWUKICAgIC8vIGVsZW1lbnQgb24gYSBzYW1lLW9yaWdpbiBuZXN0ZWQgZnJhbWUsIHRocm93cyBvbiBhIGNyb3NzLW9yaWdpbiBuZXN0ZWQgZnJhbWUuCiAgICAvLyBNb3JlIHJlbGlhYmxlIHRoYW4gJ3dpbmRvdyAhPT0gd2luZG93LnRvcCcgYmVjYXVzZSBUYW1wZXJtb25rZXkgd3JhcHMgd2luZG93IGluIGEKICAgIC8vIHByb3h5IHdoZXJlIHRoZSBzdHJpY3QgY29tcGFyaXNvbiBjYW4gcmV0dXJuIHRydWUgZXZlbiBvbiB0aGUgdG9wIGZyYW1lLgogICAgbGV0IF9pc05lc3RlZCA9IGZhbHNlOwogICAgdHJ5IHsgX2lzTmVzdGVkID0gd2luZG93LmZyYW1lRWxlbWVudCAhPT0gbnVsbDsgfSBjYXRjaCAoX2UpIHsgX2lzTmVzdGVkID0gdHJ1ZTsgfQogICAgaWYgKF9pc05lc3RlZCkgewogICAgICAgIGNvbnN0IF9ob3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2lzRW1iZWRDb250ZXh0ID0gX2hvc3QgPT09ICdwbGF5ZXIudHdpdGNoLnR2JyB8fCBfaG9zdCA9PT0gJ2VtYmVkLnR3aXRjaC50dicgfHwgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2VtYmVkLycpOwogICAgICAgIGlmICghX2lzRW1iZWRDb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZpZGVvLXN3YXAtbmV3IHNraXBwZWQg4oCUIG5lc3RlZCBmcmFtZSBvbiAnICsgX2hvc3QgKyBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSArICcgKG5vdCBhIFR3aXRjaCBlbWJlZCkuIElmIHlvdSBzZWUgdGhpcyBvbiB0d2l0Y2gudHYvQ0hBTk5FTCB0b3AgZnJhbWUsIHBsZWFzZSByZXBvcnQuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSA0NzsvLyBVc2VkIHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3V0ZGF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNjcmlwdHMKICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFR3aXRjaEFkU29sdXRpb25zIHZpZGVvLXN3YXAtbmV3IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZpZGVvLXN3YXAtbmV3IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBza2lwcGVkIOKAlCBhbm90aGVyIHNjcmlwdCBhbHJlYWR5IGFjdGl2ZSAodicgKyB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJykuIFJlbW92ZSBkdXBsaWNhdGUgc2NyaXB0cy4nKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uOwogICAgZnVuY3Rpb24gZGVjbGFyZU9wdGlvbnMoc2NvcGUpIHsKICAgICAgICAvLyBPcHRpb25zIC8gZ2xvYmFscwogICAgICAgIC8vICdlbWJlZCcgbW92ZWQgdG8gZW5kIOKAlCBmaWVsZC1vYnNlcnZlZCBUd2l0Y2ggcmV0dXJucyBHUUwgJ3NlcnZlciBlcnJvcicgZm9yCiAgICAgICAgLy8gc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBvbiBlbWJlZCB3aGVuIHJlcXVlc3RlZCBmcm9tIHR3aXRjaC50diBvcmlnaW4uCiAgICAgICAgc2NvcGUuT1BUX0JBQ0tVUF9QTEFZRVJfVFlQRVMgPSBbICdwb3BvdXQnLCAnbW9iaWxlX3dlYicsICdlbWJlZCcgXTsKICAgICAgICBzY29wZS5PUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFID0gJ3BvcG91dCc7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guCiAgICAgICAgc2NvcGUuQURfU0lHTklGSUVSUyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIiddOwogICAgICAgIHNjb3BlLkFEX1NFR01FTlRfVVJMX1BBVFRFUk5TID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24uCiAgICAgICAgc2NvcGUuVFdJVENIX0FEX1VSTF9SRVdSSVRFX1JFR0VYID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVVJJX0FUVFJJQlVURV9SRUdFWCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5MSVZFX1NJR05JRklFUiA9ICcsbGl2ZSc7CiAgICAgICAgc2NvcGUuQ0xJRU5UX0lEID0gJ2tpbW5lNzhreDNuY3g2YnJnbzRtdjZ3a2k1aDFrbyc7CiAgICAgICAgLy8gVGhlc2UgYXJlIG9ubHkgcmVhbGx5IGZvciBXb3JrZXIgc2NvcGUuLi4KICAgICAgICBzY29wZS5TdHJlYW1JbmZvcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3NCeVVybCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgLy8gTmVlZCB0aGlzIGluIGJvdGggc2NvcGVzLiBXaW5kb3cgc2NvcGUgbmVlZHMgdG8gdXBkYXRlIHRoaXMgdG8gd29ya2VyIHNjb3BlLgogICAgICAgIHNjb3BlLmdxbF9kZXZpY2VfaWQgPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudEludGVncml0eUhlYWRlciA9IG51bGw7CiAgICAgICAgc2NvcGUuQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZDsKICAgICAgICBzY29wZS5TaW11bGF0ZWRBZHNEZXB0aCA9IDA7CiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IHRydWU7Ly8gQWZ0ZXIgdGhlIGFkIGZpbmlzaGVzIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5SZWxvYWRDb29sZG93blNlY29uZHMgPSAzMDsvLyBNaW5pbXVtIHNlY29uZHMgYmV0d2VlbiByZWxvYWRzIOKAlCBicmVha3MgQ1NBSSBjYXNjYWRlcyB0cmlnZ2VyZWQgYnkgcmVsb2FkCiAgICAgICAgc2NvcGUuRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gNTsvLyBBbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIGVhcmx5IHJlbG9hZCAofjJzIGVhY2gsIHNvIDUgPSB+MTBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gZmFsc2U7Ly8gSWYgdHJ1ZSwgcmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvTWF4QWdlTXMgPSAzMCAqIDYwICogMTAwMDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIEVuY29kaW5nczogbnVsbCwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzOiBudWxsLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NTdGF0dXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4OiAtMSwKICAgICAgICAgICAgUGlubmVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgSGFzQ2hlY2tlZFVua25vd25UYWdzOiBmYWxzZSwKICAgICAgICAgICAgSGFzQ29uZmlybWVkQWRBdHRyczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICAgICAgSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3M6IGZhbHNlLAogICAgICAgICAgICBJc01pZHJvbGw6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIENsZWFuUGxheWxpc3RDb3VudDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3M6IDAsCiAgICAgICAgICAgIFVzZUZhbGxiYWNrU3RyZWFtOiBmYWxzZSwKICAgICAgICAgICAgTGFzdENsZWFuTmF0aXZlTTNVODogbnVsbCwKICAgICAgICAgICAgTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZFRyaWdnZXJlZDogZmFsc2UsCiAgICAgICAgICAgIExhc3RQbGF5ZXJSZWxvYWQ6IDAsCiAgICAgICAgICAgIFJlbG9hZFRpbWVzdGFtcHM6IFtdLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBtYXNrQXNOYXRpdmUoZm4sIG5hbWUpIHsKICAgICAgICBmbi50b1N0cmluZyA9ICgpID0+ICdmdW5jdGlvbiAnICsgbmFtZSArICcoKSB7IFtuYXRpdmUgY29kZV0gfSc7CiAgICAgICAgcmV0dXJuIGZuOwogICAgfQogICAgZnVuY3Rpb24gcHJ1bmVTdHJlYW1JbmZvcygpIHsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIGZvciAoY29uc3QgY2hhbm5lbE5hbWUgaW4gU3RyZWFtSW5mb3MpIHsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLkxhc3RTZWVuQXQgfHwgKG5vdyAtIHN0cmVhbUluZm8uTGFzdFNlZW5BdCkgPiBTdHJlYW1JbmZvTWF4QWdlTXMpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvICYmIHN0cmVhbUluZm8uVXJscykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJscy5mb3JFYWNoKChfLCB1cmwpID0+IHsgZGVsZXRlIFN0cmVhbUluZm9zQnlVcmxbdXJsXTsgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWxldGUgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY29uc3QgbG9nZ2VkQ3NhaVR5cGVzID0gbmV3IFNldCgpOwogICAgbGV0IHR3aXRjaFBsYXllckFuZFN0YXRlID0gbnVsbDsKICAgIGxldCBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gZmFsc2U7CiAgICBsZXQgbGFzdFJlbG9hZFRpbWVzdGFtcCA9IDA7CiAgICBsZXQgcmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgbGV0IEVzY2FsYXRlZEZyb21Db29sZG93biA9IG51bGw7Ly8gdHJhY2tzIHByZS1lc2NhbGF0aW9uIHZhbHVlIHNvIHdlIGNhbiByZXZlcnQgd2hlbiB0aGUgYnVyc3Qgc3Vic2lkZXMKICAgIGNvbnN0IHR3aXRjaFdvcmtlcnMgPSBbXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0NvbmZsaWN0cyA9IFsKICAgICAgICAndHdpdGNoJywKICAgICAgICAnaXNWYXJpYW50QScvLyBUd2l0Y2hOb1N1YgogICAgXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0FsbG93ID0gW107CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkgJiYgIXdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocGFyZW50LCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOwogICAgICAgICAgICBwYXJlbnQgPSByZWluc2VydFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVmFsaWRXb3JrZXIod29ya2VyKSB7CiAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gd29ya2VyLnRvU3RyaW5nKCk7CiAgICAgICAgY29uc3QgaGFzQ29uZmxpY3QgPSB3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBjb25zdCBoYXNBbGxvdyA9IHdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgY29uc3QgaGFzUmVpbnNlcnQgPSB3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGlmIChoYXNDb25mbGljdCAmJiAhaGFzQWxsb3cgJiYgIWhhc1JlaW5zZXJ0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciByZWplY3RlZCDigJQgY29uZmxpY3Qgc3RyaW5nIGZvdW5kOiAnICsgd29ya2VyU3RyaW5nQ29uZmxpY3RzLmZpbHRlcigoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKS5qb2luKCcsICcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFoYXNDb25mbGljdCB8fCBoYXNBbGxvdyB8fCBoYXNSZWluc2VydDsKICAgIH0KICAgIGxldCBpbmplY3RlZEJsb2JVcmwgPSBudWxsOwogICAgZnVuY3Rpb24gaG9va1dpbmRvd1dvcmtlcigpIHsKICAgICAgICAvLyBQcmV2ZW50IFR3aXRjaCBmcm9tIHJldm9raW5nIG91ciBpbmplY3RlZCB3b3JrZXIgYmxvYiBVUkwKICAgICAgICBpZiAoIVVSTC5yZXZva2VPYmplY3RVUkwuX190YXNNYXNrZWQpIHsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwgPSBVUkwucmV2b2tlT2JqZWN0VVJMOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICAgICAgaWYgKHVybCA9PT0gaW5qZWN0ZWRCbG9iVXJsKSByZXR1cm47CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxSZXZva2VPYmplY3RVUkwuY2FsbCh0aGlzLCB1cmwpOwogICAgICAgICAgICB9LCAncmV2b2tlT2JqZWN0VVJMJyk7CiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwuX190YXNNYXNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWluc2VydCA9IGdldFdvcmtlcnNGb3JSZWluc2VydCh3aW5kb3cuV29ya2VyKTsKICAgICAgICBjb25zdCBuZXdXb3JrZXIgPSBjbGFzcyBXb3JrZXIgZXh0ZW5kcyAoZ2V0Q2xlYW5Xb3JrZXIod2luZG93LldvcmtlcikgfHwgd2luZG93LldvcmtlcikgewogICAgICAgICAgICBjb25zdHJ1Y3Rvcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBsZXQgaXNUd2l0Y2hXb3JrZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaXNUd2l0Y2hXb3JrZXIgPSBuZXcgVVJMKHR3aXRjaEJsb2JVcmwpLm9yaWdpbi5lbmRzV2l0aCgnLnR3aXRjaC50dicpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFpc1R3aXRjaFdvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5vbi1Ud2l0Y2ggd29ya2VyIHNraXBwZWQ6ICcgKyB0d2l0Y2hCbG9iVXJsKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBQcmUtY2hlY2s6IHZlcmlmeSB3ZSBjYW4gZmV0Y2ggdGhlIHdvcmtlciBKUyBiZWZvcmUgaW5qZWN0aW5nCiAgICAgICAgICAgICAgICBsZXQgcHJlZmV0Y2hlZFdvcmtlckpzID0gbnVsbDsKICAgICAgICAgICAgICAgIHRyeSB7IHByZWZldGNoZWRXb3JrZXJKcyA9IGdldFdhc21Xb3JrZXJKcyh0d2l0Y2hCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFwcmVmZXRjaGVkV29ya2VySnMpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYWlsZWQgdG8gZmV0Y2ggd29ya2VyIEpTIOKAlCBmYWxsaW5nIGJhY2sgdG8gdW5tb2RpZmllZCB3b3JrZXInKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgaW50ZXJjZXB0ZWQg4oCUIGluamVjdGluZyBhZC1ibG9jayBob29rcycpOwogICAgICAgICAgICAgICAgY29uc3QgbmV3QmxvYlN0ciA9IGAKICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nRmV0Y2hSZXF1ZXN0cyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICAke2hhc0FkVGFncy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0TWF0Y2hlZEFkU2lnbmlmaWVycy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c3RyaXBBZFNlZ21lbnRzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwcm9jZXNzTTNVOC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7aG9va1dvcmtlckZldGNoLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtkZWNsYXJlT3B0aW9ucy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0QWNjZXNzVG9rZW4udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dxbFJlcXVlc3QudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3BhcnNlQXR0cmlidXRlcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c2V0U3RyZWFtSW5mb1VybHMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke29uRm91bmRBZC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0V2FzbVdvcmtlckpzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3JlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHt1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwcnVuZVN0cmVhbUluZm9zLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtjcmVhdGVTdHJlYW1JbmZvLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gZ2V0V2FzbVdvcmtlckpzKCcke3R3aXRjaEJsb2JVcmwucmVwbGFjZUFsbCgiJyIsICIlMjciKX0nKTsKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlT3B0aW9ucyhzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuX190YXNQcnVuZUludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX190YXNQcnVuZUludGVydmFsID0gc2V0SW50ZXJ2YWwocHJ1bmVTdHJlYW1JbmZvcywgNSAqIDYwICogMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSAke1JlbG9hZFBsYXllckFmdGVyQWR9OwogICAgICAgICAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9ICR7UmVsb2FkQ29vbGRvd25TZWNvbmRzfTsKICAgICAgICAgICAgICAgICAgICBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSAke0Vhcmx5UmVsb2FkUG9sbFRocmVzaG9sZH07CiAgICAgICAgICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9ICR7UGluQmFja3VwUGxheWVyVHlwZX07CiAgICAgICAgICAgICAgICAgICAgT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSA9ICcke09QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEV9JzsKICAgICAgICAgICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gJHtncWxfZGV2aWNlX2lkID8gIiciICsgZ3FsX2RldmljZV9pZCArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSAke0F1dGhvcml6YXRpb25IZWFkZXIgPyAiJyIgKyBBdXRob3JpemF0aW9uSGVhZGVyICsgIiciIDogdW5kZWZpbmVkfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSAke0NsaWVudEludGVncml0eUhlYWRlciA/ICInIiArIENsaWVudEludGVncml0eUhlYWRlciArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1VwZGF0ZURldmljZUlkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRmV0Y2hSZXNwb25zZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVzcG9uc2VEYXRhLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCB0aW1lb3V0SWQgfSA9IHBlbmRpbmdGZXRjaFJlcXVlc3RzLmdldChyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXNwb25zZURhdGEuZXJyb3IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcmVzcG9uc2UgZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSB0YWtlcyBzdGF0dXMvc3RhdHVzVGV4dC9oZWFkZXJzIOKAlCB1cmwvcmVkaXJlY3RlZC90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UuIElWUyBXQVNNIHZhbGlkYXRlcyB0aGVzZSAoU3BhZGUvdHJhY2tpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMpIGFuZCB0aHJvd3MgTmV0d29ya0Vycm9yIGlmIHRoZXkncmUgbWlzc2luZyDigJQgVFRWLUFCIHY2LjMuNSBmaXguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHJlc3BvbnNlRGF0YS5ib2R5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlRGF0YS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZURhdGEuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlRGF0YS5oZWFkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2VEYXRhLnVybCB8fCAnJywgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAncmVkaXJlY3RlZCcsIHsgdmFsdWU6ICEhcmVzcG9uc2VEYXRhLnJlZGlyZWN0ZWQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNwb25zZSwgJ3R5cGUnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudHlwZSB8fCAnYmFzaWMnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1NpbXVsYXRlQWRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltdWxhdGVkQWRzRGVwdGggPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU2ltdWxhdGVkQWRzRGVwdGg6ICcgKyBTaW11bGF0ZWRBZHNEZXB0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gIUFsbFNlZ21lbnRzQXJlQWRTZWdtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM6ICcgKyBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaG9va1dvcmtlckZldGNoKCk7CiAgICAgICAgICAgICAgICAgICAgZXZhbCh3b3JrZXJTdHJpbmcpOwogICAgICAgICAgICAgICAgYAogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVYm9VcGRhdGVBZEJhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcihlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUGF1c2VSZXN1bWVQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9hZFR3aXRjaFBsYXllcih0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5rZXkgPT0gJ0ZldGNoUmVxdWVzdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hSZXF1ZXN0ID0gZXZlbnQuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gV29ya2VyIGNyYXNoIHJlY292ZXJ5IOKAlCBJVlMgV0FTTSB3b3JrZXIgY2FuIGZpcmUgUnVudGltZUVycm9yCiAgICAgICAgICAgICAgICAvLyAoZS5nLiAiaW5kZXggb3V0IG9mIGJvdW5kcyIpIGFuZCBkaWUuIEEgc2luZ2xlIGNyYXNoIGZpcmVzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAvLyBlcnJvciBldmVudHM7IGRlZHVwZSB2aWEgYSBsb2NhbCBmbGFnLiBPbiBmaXJzdCBlcnJvciwgdHJpZ2dlciBhCiAgICAgICAgICAgICAgICAvLyBwbGF5ZXIgcmVsb2FkIOKAlCBUd2l0Y2ggcmUtc3Bhd25zIHRoZSB3b3JrZXIgYXMgcGFydCBvZiB0aGUgbmV3CiAgICAgICAgICAgICAgICAvLyBwbGF5ZXIgaW5zdGFuY2UsIGFuZCBleGlzdGluZyByZWxvYWQgY29vbGRvd24gcHJldmVudHMgcmVzdGFydCBsb29wcy4KICAgICAgICAgICAgICAgIGxldCBjcmFzaGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3Jhc2hlZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNyYXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIElWUyBXQVNNIHdvcmtlciBjcmFzaGVkOiAnICsgKChlICYmIGUubWVzc2FnZSkgfHwgJ3Vua25vd24gZXJyb3InKSArICcg4oCUIHRyaWdnZXJpbmcgcGxheWVyIHJlbG9hZCB0byByZWNvdmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmVsb2FkVHdpdGNoUGxheWVyKGZhbHNlKTsgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBjcmFzaCByZWNvdmVyeSBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHdvcmtlckluc3RhbmNlID0gcmVpbnNlcnRXb3JrZXJzKG5ld1dvcmtlciwgcmVpbnNlcnQpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdXb3JrZXInLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VySW5zdGFuY2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkV29ya2VyKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdvcmtlckluc3RhbmNlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIHNldCB0d2l0Y2ggd29ya2VyIGRlbmllZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCkgewogICAgICAgIGlmICghZ2V0V2FzbVdvcmtlckpzLmNhY2hlKSB7CiAgICAgICAgICAgIGdldFdhc21Xb3JrZXJKcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0pIHsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc21Xb3JrZXJKcy5jYWNoZVt0d2l0Y2hCbG9iVXJsXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICBjb25zdCB0ZXh0ID0gcmVxLnJlc3BvbnNlVGV4dDsKICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0gPSB0ZXh0OwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFtSW5mb1VybHMoc3RyZWFtSW5mbywgZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGNvbnN0IGxpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIHYyIEFQSSB2YXJpYW50IFVSTHMgYXJlIHJhdyBDRE4gVVJMcyB3aXRob3V0ICcubTN1OCcgaW4gdGhlIHBhdGguCiAgICAgICAgICAgIC8vIEFjY2VwdCBhYnNvbHV0ZSBVUkxzIChjb250YWluaW5nICc6Ly8nKSBhbG9uZ3NpZGUgJy5tM3U4JyBVUkxzLgogICAgICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZXNbaV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKHRyaW1tZWQgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aCgnIycpICYmICh0cmltbWVkLmluY2x1ZGVzKCcubTN1OCcpIHx8IHRyaW1tZWQuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NCeVVybFtsaW5lc1tpXS50cmltRW5kKCldID0gc3RyZWFtSW5mbzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuZXh0TGluZSA9IGxpbmVzW2kgKyAxXT8udHJpbSgpOwogICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBuZXh0TGluZSAmJiAhbmV4dExpbmUuc3RhcnRzV2l0aCgnIycpICYmIChuZXh0TGluZS5pbmNsdWRlcygnLm0zdTgnKSB8fCBuZXh0TGluZS5pbmNsdWRlcygnOi8vJykpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBhdHRyaWJ1dGVzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHV0aW9uOiByZXNvbHV0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBGcmFtZVJhdGU6IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgVXJsOiBsaW5lc1tpICsgMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJscy5zZXQobGluZXNbaSArIDFdLnRyaW1FbmQoKSwgcmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKSB7CiAgICAgICAgY29uc3QgaXNTaG93aW5nQWQgPSAhIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzOwogICAgICAgIGlmICghaXNTaG93aW5nQWQgJiYgKHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzIHx8IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBmYWxzZTsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIGtleTogJ1Vib1VwZGF0ZUFkQmFubmVyJywKICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgaGFzQWRzOiBpc1Nob3dpbmdBZCwKICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cywKICAgICAgICAgICAgbnVtU3RyaXBwZWRBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cywKICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXggPj0gMCA/IE9QVF9CQUNLVVBfUExBWUVSX1RZUEVTW3N0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4XSA6IG51bGwKICAgICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCByZWxvYWRQbGF5ZXIsIHJlYWxGZXRjaCwgdXJsLCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGxldCByZXN1bHQgPSB0ZXh0U3RyOwogICAgICAgIHN0cmVhbUluZm8uSXNNaWRyb2xsID0gdGV4dFN0ci5pbmNsdWRlcygnIk1JRFJPTEwiJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnIm1pZHJvbGwiJyk7CiAgICAgICAgLy8gVHJhY2sgaGlnaC1jb25maWRlbmNlIGFkIG1hcmtlcnMgdG8gZGlzdGluZ3Vpc2ggcmVhbCBhZHMgZnJvbSBmYWxzZS1wb3NpdGl2ZSBzaWduaWZpZXIgbWF0Y2hlcy4KICAgICAgICAvLyBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50IG9uIGV2ZXJ5IHJlYWwgVHdpdGNoIGFkIGFuZCBhYnNlbnQgZnJvbSBhbnl0aGluZyB0aGF0IGNvdWxkCiAgICAgICAgLy8gZmFsc2UtcG9zaXRpdmUgKGUuZy4gbWV0YWRhdGEgY29udGFpbmluZyB0aGUgd29yZCAnc3RpdGNoZWQnKS4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMgPSB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTicpOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGF5ZXJUeXBlcyA9IFsuLi5PUFRfQkFDS1VQX1BMQVlFUl9UWVBFU107CiAgICAgICAgLy8gVHJ5IHBpbm5lZCBiYWNrdXAgcGxheWVyIHR5cGUgZmlyc3QgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgKFBpbkJhY2t1cFBsYXllclR5cGUgJiYgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gcGxheWVyVHlwZXMuaW5kZXhPZihzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICBpZiAocGlubmVkSW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlcy5zcGxpY2UocGlubmVkSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgcGxheWVyVHlwZXMudW5zaGlmdChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5zaXplID49IHBsYXllclR5cGVzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzICYmICFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncy5pbmNsdWRlcyh1cmwpKSB7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYmFja3VwU2VhcmNoU3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgIGxldCBiYWNrdXBQbGF5ZXJUeXBlSW5mbyA9ICcnOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxheWVyVHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgcGxheWVyVHlwZSA9IHBsYXllclR5cGVzW2ldOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmhhcyhwbGF5ZXJUeXBlKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2UgIT0gbnVsbCAmJiBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvckJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXJyb3JCb2R5ID0gJyDigJQgJyArIChhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLnRleHQoKSkuc3Vic3RyaW5nKDAsIDIwMCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWNjZXNzIHRva2VuIEhUVFAgJyArIGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHBsYXllclR5cGUgKyAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDQwMyA/ICcgKGludGVncml0eTogJyArIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAncHJlc2VudCcgOiAnbWlzc2luZycpICsgJyknIDogJycpICsgZXJyb3JCb2R5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2UgIT0gbnVsbCAmJiBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB7IGRhdGE6IHsgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjogey4uLn0gfSB9IChtb3N0IHBsYXllciB0eXBlcykKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB7IHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW46IHsuLi59IH0gKGZsYXR0ZXIsIG9ic2VydmVkIGZvciAnZW1iZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGF0ID0gYWNjZXNzVG9rZW4/LmRhdGE/LnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gfHwgYWNjZXNzVG9rZW4/LnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3BhdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCByZXNwb25zZSBtaXNzaW5nIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gZm9yICcgKyBwbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmxJbmZvLnNlYXJjaFBhcmFtcy5zZXQoJ3NpZycsIHNwYXQuc2lnbmF0dXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIHNwYXQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVXNoZXIgSFRUUCAnICsgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyBwbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlICE9IG51bGwgJiYgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RpbmdzTTN1OCA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja1RleHRTdHIgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0FkVGFncyhiYWNrVGV4dFN0cikgJiYgKFNpbXVsYXRlZEFkc0RlcHRoID09IDAgfHwgaSA+PSBTaW11bGF0ZWRBZHNEZXB0aCAtIDEpKSB8fCBpID49IHBsYXllclR5cGVzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmFja1RleHRTdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGVJbmZvID0gJyAoJyArIHBsYXllclR5cGUgKyAnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNldChwbGF5ZXJUeXBlLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGluQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gcGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FbmNvZGluZ3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG93IHJlc29sdXRpb24gc3RyZWFtcyB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHJlc29sdXRpb25zIGluIHRoZSBVSS4gVG8gZml4IHRoaXMgd2UgbWVyZ2UgdGhlIGxvdyByZXMgVVJMcyBpbnRvIHRoZSBtYWluIG0zdTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbEVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkVuY29kaW5nczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbExpbmVzID0gbm9ybWFsRW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9ybWFsTGluZXMubGVuZ3RoIC0gMTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbExpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobm9ybWFsTGluZXNbal0uc3Vic3RyaW5nKG5vcm1hbExpbmVzW2pdLmluZGV4T2YoJzonKSArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzVXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCBzdHJlYW1JbmZvLlVybHMuZ2V0KG5vcm1hbExpbmVzW2ogKyAxXS50cmltRW5kKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzSW5mID0gZW5jb2RpbmdzTTN1OC5tYXRjaChuZXcgUmVnRXhwKGBeLiooPz1cbi4qJHtsb3dSZXNVcmx9KWAsICdtJykpPy5bMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG93UmVzSW5mKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobG93UmVzSW5mLnN1YnN0cmluZyhsb3dSZXNJbmYuaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtYXAgJyArIHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ10gKyAnIHRvICcgKyBsb3dSZXNTZXR0aW5nc1snUkVTT0xVVElPTiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzU2V0dGluZ3NbY29kZWNzS2V5XSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0gPT09ICdzdHJpbmcnICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNTZXR0aW5nc1tjb2RlY3NLZXldLmxlbmd0aCA+PSAzICYmIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0ubGVuZ3RoID49IDMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2hldicpIHx8IHJlc1NldHRpbmdzW2NvZGVjc0tleV0uc3RhcnRzV2l0aCgnaHZjJykpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN1YnN0cmluZygwLCAzKSAhPT0gbG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdWJzdHJpbmcoMCwgMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3dhcCAnICsgcmVzU2V0dGluZ3NbY29kZWNzS2V5XSArICcgdG8gJyArIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTGluZXNbal0gPSBub3JtYWxMaW5lc1tqXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XX0iYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhub3JtYWxMaW5lc1tqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTGluZXNbaiArIDFdID0gbG93UmVzVXJsICsgJyAnLnJlcGVhdChqICsgMSk7Ly8gVGhlIHN0cmVhbSBkb2Vzbid0IGxvYWQgdW5sZXNzIGVhY2ggdXJsIGxpbmUgaXMgdW5pcXVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzTTN1OCA9IG5vcm1hbExpbmVzLmpvaW4oJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPSBlbmNvZGluZ3NNM3U4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyB9CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuZ2V0KHBsYXllclR5cGUpID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNldChwbGF5ZXJUeXBlLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zb2xlLmxvZygnRm91bmQgYWRzLCBzd2l0Y2ggdG8gYmFja3VwJyArIGJhY2t1cFBsYXllclR5cGVJbmZvICsgJyBpbiAnICsgKERhdGUubm93KCkgLSBiYWNrdXBTZWFyY2hTdGFydCkgKyAnbXMg4oCUIHNpZ25pZmllcnM6ICcgKyBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpLmpvaW4oJywgJykpOwogICAgICAgIGlmIChyZWxvYWRQbGF5ZXIpIHsKICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBRF9TSUdOSUZJRVJTLnNvbWUoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFEX1NJR05JRklFUlMuZmlsdGVyKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFEX1NJR05JRklFUlMgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzKSB7CiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIGxldCBzbTsKICAgICAgICAgICAgY29uc3QgY2xhc3NSZSA9IC9FWFQtWC1EQVRFUkFOR0U6W15cbl0qQ0xBU1M9Iih0d2l0Y2gtW14iXSspIi9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gY2xhc3NSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0iJyArIHNtWzFdICsgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB0YWdSZSA9IC8oU0NURTM1LVtBLVotXSt8RVhULVgtQ1VFLVtBLVotXSspL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSB0YWdSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoc21bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN1YnN0cmluZyBjaGVjayAobm90IGV4YWN0KTogYSBjYW5kaWRhdGUgaXMgImtub3duIiBpZiBhbnkgQURfU0lHTklGSUVSCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4gIUFEX1NJR05JRklFUlMuc29tZShzID0+IGMuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQURfU0lHTklGSUVSUzogJyArIHVua25vd24uam9pbignLCAnKSArICcgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAvLyBUcmFjayBTQ1RFLTM1IENVRS1PVVQvQ1VFLUlOIGFkIGJvdW5kYXJpZXMKICAgICAgICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1PVVQnKSkgewogICAgICAgICAgICAgICAgaWYgKCFpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLU9VVCDigJQgYWQgYm91bmRhcnkgZW50ZXJlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1JTicpKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1JTiDigJQgYWQgYm91bmRhcnkgZXhpdGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmFja2luZyB1cmxzIHdoaWNoIGFwcGVhciBpbiB0aGUgb3ZlcmxheSBVSQogICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmUucmVwbGFjZUFsbChUV0lUQ0hfQURfVVJMX1JFV1JJVEVfUkVHRVgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmICghbGluZS5pbmNsdWRlcygnLGxpdmUnKSB8fCBzdHJpcEFsbFNlZ21lbnRzIHx8IEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyB8fCBpbkN1ZU91dCkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRVcmwgPSBsaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICBpZiAoIUFkU2VnbWVudENhY2hlLmhhcyhzZWdtZW50VXJsKSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoc2VnbWVudFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IGxpbmVzW2kgKyAxXS5pbmNsdWRlcyhwKSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHNlZ21lbnQgZGV0ZWN0ZWQgdmlhIFVSTCBwYXR0ZXJuOiAnICsgbGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChsaW5lc1tpICsgMV0sIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZS5pbmNsdWRlcygnLGxpdmUnKSkgewogICAgICAgICAgICAgICAgbGl2ZVNlZ21lbnRzLnB1c2goeyBleHRpbmY6IGxpbmUsIHVybDogbGluZXNbaSArIDFdIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBBUlQ6JykpIHsKICAgICAgICAgICAgICAgIC8vIExMLUhMUyBwYXJ0OiBVUkkgaXMgaW5saW5lIGFzIGFuIGF0dHJpYnV0ZS4gU3RyaXAgaWYgaXQgbWF0Y2hlcyBhIGtub3duCiAgICAgICAgICAgICAgICAvLyBhZCBVUkwgKGFscmVhZHkgaW4gY2FjaGUgZnJvbSBhIHBhcmFsbGVsIEVYVElORiBzdHJpcCwgb3IgbWF0Y2hlcyBhIFVSTCBwYXR0ZXJuKS4KICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllciBtYXkgdXNlIHRoZSBwYXJ0cyBwYXRoIHRvIGZldGNoIGFkIG1lZGlhIHZpYSBsb3ctbGF0ZW5jeS4KICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmlNYXRjaCA9IGxpbmUubWF0Y2goVVJJX0FUVFJJQlVURV9SRUdFWCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBRF9TRUdNRU5UX1VSTF9QQVRURVJOUy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBBRF9TSUdOSUZJRVJTLnNvbWUoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpKSB7CiAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLy8gTm8gbG93IGxhdGVuY3kgZHVyaW5nIGFkcyAob3RoZXJ3aXNlIGl0J3MgcG9zc2libGUgZm9yIHRoZSBwbGF5ZXIgdG8gcHJlZmV0Y2ggYW5kIGRpc3BsYXkgYWQgc2VnbWVudHMpCiAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSB8fCBsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtUFJFTE9BRC1ISU5UOicpKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID0gMDsKICAgICAgICB9CiAgICAgICAgLy8gQ2FjaGUgbGl2ZSBzZWdtZW50cyBmb3IgcmVjb3ZlcnkgKHBsdXMgdGhlIE1FRElBLVNFUVVFTkNFIG9mIHRoZSBvbGRlc3QgY2FjaGVkIHNlZ21lbnQsCiAgICAgICAgLy8gc28gdGhlIHBsYXllciBhY2NlcHRzIGluamVjdGVkIHJlY292ZXJ5IHNlZ21lbnRzIGFzIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0pCiAgICAgICAgaWYgKGxpdmVTZWdtZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyA9IGxpdmVTZWdtZW50cy5zbGljZSgtNik7CiAgICAgICAgICAgIGNvbnN0IHNlcSA9IHBhcnNlSW50KCh0ZXh0U3RyLm1hdGNoKC8jRVhULVgtTUVESUEtU0VRVUVOQ0U6KFxkKykvKSB8fCBbXSlbMV0pOwogICAgICAgICAgICBpZiAoIWlzTmFOKHNlcSkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcSA9IHNlcSArIE1hdGgubWF4KDAsIGxpdmVTZWdtZW50cy5sZW5ndGggLSBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiBhbGwgc2VnbWVudHMgd2VyZSBzdHJpcHBlZCwgdHJ5IHRvIHByZXZlbnQgYmxhY2sgc2NyZWVuIHZpYSByZWNvdmVyeSBjb250ZW50LgogICAgICAgIC8vIFByZWZlciB0aGUgZnVsbC1wbGF5bGlzdCBzbmFwc2hvdCBmcm9tIGEgcmVjZW50IG5vbi1hZCBwb2xsIChtaXJyb3JzIFRUVi1BQgogICAgICAgIC8vIExhc3RDbGVhbk5hdGl2ZU0zVTggYXBwcm9hY2gpIOKAlCBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIHdvcnRoIG9mCiAgICAgICAgLy8gY29udGVudCB2cyB0aGUgdGhpbiBwZXItc2VnbWVudCByZWNvdmVyeSBjYWNoZS4gRmFsbHMgYmFjayB0byB0aGUgcGVyLXNlZ21lbnQKICAgICAgICAvLyBjYWNoZSBpZiB0aGUgc25hcHNob3QgaXMgc3RhbGUgb3IgbWlzc2luZy4KICAgICAgICBpZiAoaGFzU3RyaXBwZWRBZFNlZ21lbnRzICYmIGxpdmVTZWdtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgPSAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgKyAxOwogICAgICAgICAgICBjb25zdCByZWNvdmVyeVRoaW4gPSAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzPy5sZW5ndGggfHwgMCkgPCAzOwogICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVUaHJlc2hvbGQgPSByZWNvdmVyeVRoaW4gPyAxIDogRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkOwogICAgICAgICAgICBpZiAoRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID4gMCAmJiBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc3QgcmVhc29uID0gcmVjb3ZlcnlUaGluID8gJyAodGhpbiByZWNvdmVyeSBjYWNoZTogJyArIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSArICcgc2VnbWVudHMpJyA6ICcnOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHRyaWdnZXJlZCDigJQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzICsgJyBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMnICsgcmVhc29uKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnVWJvUmVsb2FkUGxheWVyJyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBQcmltYXJ5OiBmcmVzaCBmdWxsLXBsYXlsaXN0IHNuYXBzaG90ICg8IDEuNXMgb2xkLCBtdXN0IG5vdCBpdHNlbGYgY29udGFpbiBhZCBtYXJrZXJzKQogICAgICAgICAgICBjb25zdCBzbmFwc2hvdEFnZSA9IHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA/IChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0KSA6IEluZmluaXR5OwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4ICYmIHNuYXBzaG90QWdlIDw9IDE1MDAgJiYgIWhhc0FkVGFncyhzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTgpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJldXNpbmcgbGFzdCBjbGVhbiBuYXRpdmUgcGxheWxpc3QgKCcgKyBzbmFwc2hvdEFnZSArICdtcyBvbGQpJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlIChleGlzdGluZyBiZWhhdmlvcikKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyAmJiBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXN0b3JpbmcgJyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggKyAnIHJlY292ZXJ5IHNlZ21lbnRzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKCcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2pdID0gJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonICsgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLmV4dGluZik7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0udXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIC8vIFRocm90dGxlIGNhY2hlIHBydW5lIHRvIG9uY2UgcGVyIDYwcy4gVGhlIDEyMHMgVFRMIGdpdmVzIHBsZW50eSBvZiBoZWFkcm9vbQogICAgICAgIC8vIGFuZCBzY2FubmluZyB0aGUgZnVsbCBjYWNoZSBvbiBldmVyeSBtM3U4IHBvbGwgYWRkcyB1cCBkdXJpbmcgaGVhdnkgYWQgYnJlYWsKICAgICAgICAvLyBzZXF1ZW5jZXMgKExMLUhMUyBjYW4gcG9sbCBtdWx0aXBsZSB0aW1lcyBwZXIgc2Vjb25kKS4gUG9ydGVkIGZyb20gVFRWLUFCLgogICAgICAgIGlmICghc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgfHwgbm93IC0gc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPiA2MDAwMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA9IG5vdzsKICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSwgbWFwKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBub3cgLSAxMjAwMDApIHsKICAgICAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBEaWFnbm9zdGljOiBsb2cgb25jZSBwZXIgc3RyZWFtSW5mbyB3aGVuIHRoZSBjYWNoZSBjcm9zc2VzIDEwMDAgZW50cmllcywKICAgICAgICAgICAgLy8gc28gY2FjaGUgYmxvYXQgZnJvbSBhIGZ1dHVyZSBUVEwvcHJ1bmUgYnVnIHdvdWxkIHN1cmZhY2UgaW4gdXNlciByZXBvcnRzCiAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc3RheWluZyBpbnZpc2libGUuCiAgICAgICAgICAgIGlmIChBZFNlZ21lbnRDYWNoZS5zaXplID4gMTAwMCAmJiAhc3RyZWFtSW5mby5Mb2dnZWRBZENhY2hlU2l6ZTFrKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEFkQ2FjaGVTaXplMWsgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTZWdtZW50Q2FjaGUgY3Jvc3NlZCAxMDAwIGVudHJpZXMgKG5vdyAnICsgQWRTZWdtZW50Q2FjaGUuc2l6ZSArICcpIOKAlCBwb3NzaWJsZSBjYWNoZSBibG9hdCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcbicpOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBjb25zdCBjdXJyZW50UmVzb2x1dGlvbiA9IHN0cmVhbUluZm8uVXJscy5nZXQodXJsKTsKICAgICAgICBpZiAoIWN1cnJlbnRSZXNvbHV0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgdW5rbm93bkFkVGFncyA9IHRleHRTdHIubWF0Y2goLyNFWFRbXjpcbl0qKD86YWR8Y3VlfHNjdGV8c3BvbnNvcilbXjpcbl0qL2dpKTsKICAgICAgICAgICAgaWYgKHVua25vd25BZFRhZ3MpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSB1bmtub3duQWRUYWdzLmZpbHRlcih0ID0+ICFBRF9TSUdOSUZJRVJTLnNvbWUocyA9PiB0LmluY2x1ZGVzKHMpKSk7CiAgICAgICAgICAgICAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVW5rbm93biBhZC1yZWxhdGVkIHRhZ3MgZm91bmQ6ICcgKyBbLi4ubmV3IFNldCh1bmtub3duKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgaGF2ZUFkVGFncyA9IGhhc0FkVGFncyh0ZXh0U3RyKSB8fCAoU2ltdWxhdGVkQWRzRGVwdGggPiAwICYmICghc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgfHwgIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLmluY2x1ZGVzKHVybCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggLSAxID4gc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXgpKTsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB2cyB0aGUgMS0yIGNhY2hlZCBpbmRpdmlkdWFsIHNlZ21lbnRzLgogICAgICAgIC8vIE1pcnJvcnMgVFRWLUFCIHNyYy9tb2R1bGVzL3Byb2Nlc3Nvci50czo3MzMtNzM2LgogICAgICAgIGlmICghaGF2ZUFkVGFncyAmJiAhc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgJiYgdGV4dFN0ci5pbmRleE9mKCcjRVhUSU5GJykgIT09IC0xKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCA9IHRleHRTdHI7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA9IERhdGUubm93KCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gc3RyZWFtSW5mby5FbmNvZGluZ3MubWF0Y2goL15odHRwczouKlwubTN1OCQvbSk/LlswXTsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdTggPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdTggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGlmICghaGFzQWRUYWdzKHN0cmVhbU0zdTgpICYmIFNpbXVsYXRlZEFkc0RlcHRoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGxheWxpc3QgaGFzIGxpdmUgc2VnbWVudHMg4oCUIGlmIG5vdCwgYmFja3VwIHN0cmVhbSBpcyBkZWFkCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0xpdmVTZWdtZW50cyA9IHRleHRTdHIuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gMiB8fCAhaGFzTGl2ZVNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gaGFzIG5vIGxpdmUgc2VnbWVudHMg4oCUIGZvcmNpbmcgaW1tZWRpYXRlIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIG1vcmUgYWRzIG9uIG1haW4gc3RyZWFtLiBTdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLiAnICsgKFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVHJpZ2dlcmluZyBwbGF5ZXIgcmVsb2FkIHRvIGdvIGJhY2sgdG8gbWFpbiBzdHJlYW0uLi4nIDogJ1Jlc3VtaW5nIHBsYXliYWNrLi4uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRzIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPT09IDAgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbU0zdTguaW5jbHVkZXMoJyJNSURST0xMIicpICYmICFzdHJlYW1NM3U4LmluY2x1ZGVzKCcibWlkcm9sbCInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBzdHJlYW1NM3U4LnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKExJVkVfU0lHTklGSUVSKSAmJiAhc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuaGFzKGxpbmVzW2kgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVxdWVzdCBvbmUgLnRzIGZpbGUgcGVyIC5tM3U4IHJlcXVlc3QgdG8gYXZvaWQgbWFraW5nIHRvbyBtYW55IHJlcXVlc3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdGZXRjaCBhZCAudHMgZmlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuYWRkKGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ibG9iKCkpLmNhdGNoKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyAmJiBoYXZlQWRUYWdzKSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUsIHJlYWxGZXRjaCwgdXJsLCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGhhdmVBZFRhZ3MgJiYgIXN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MpIHsKICAgICAgICAgICAgLy8gQ1NBSSBmYXN0IHBhdGg6IGlmIGFsbCBzZWdtZW50cyBpbiB0aGUgbWFpbiBzdHJlYW0gYXJlIGxpdmUsIHNraXAgYmFja3VwIHNlYXJjaC4KICAgICAgICAgICAgLy8gQ1NBSSBhZHMgYXJlIGRlbGl2ZXJlZCBvdXRzaWRlIHRoZSBtM3U4IOKAlCB0aGUgbWFpbiBzdHJlYW0gc2VnbWVudHMgYXJlIGNsZWFuLgogICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1haW4gc3RyZWFtIGRpcmVjdGx5LCBhdm9pZGluZyB0aGUgYmFja3VwIHN0cmVhbSBzd2l0Y2ggdGhhdCBjYXVzZXMKICAgICAgICAgICAgLy8gYSAyMC00MHMgcmVidWZmZXIgZ2FwLgogICAgICAgICAgICBjb25zdCBtYWluU3RyZWFtTGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICBsZXQgaGFzTm9uTGl2ZVNlZ21lbnQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWluU3RyZWFtTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtYWluU3RyZWFtTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVElORicpICYmICFtYWluU3RyZWFtTGluZXNbaV0uaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzTm9uTGl2ZVNlZ21lbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFzTm9uTGl2ZVNlZ21lbnQpIHsKICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBmYXN0IHBhdGgg4oCUIGFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUsIHJlYWxGZXRjaCwgdXJsLCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgZmFsc2UsIHN0cmVhbUluZm8pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pOwogICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgfQogICAgZnVuY3Rpb24gaG9va1dvcmtlckZldGNoKCkgewogICAgICAgIGNvbnNvbGUubG9nKCdob29rV29ya2VyRmV0Y2ggKHZpZGVvLXN3YXAtbmV3KScpOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IGZldGNoOwogICAgICAgIGZldGNoID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLmhhcyh1cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2goJ2RhdGE6dmlkZW8vbXA0O2Jhc2U2NCxBQUFBS0daMGVYQnRjRFF5QUFBQUFXbHpiMjF0Y0RReVpHRnphR0YyWXpGcGMyODJhR3h6WmdBQUJFbHRiMjkyQUFBQWJHMTJhR1FBQUFBQUFBQUFBQUFBQUFBQUFZYWdBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQUFBQnFIUnlZV3NBQUFCY2RHdG9aQUFBQUFNQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFVUnRaR2xoQUFBQUlHMWthR1FBQUFBQUFBQUFBQUFBQUFBQUFMdUFBQUFBQUZYRUFBQUFBQUF0YUdSc2NnQUFBQUFBQUFBQWMyOTFiZ0FBQUFBQUFBQUFBQUFBQUZOdmRXNWtTR0Z1Wkd4bGNnQUFBQUR2YldsdVpnQUFBQkJ6Yldoa0FBQUFBQUFBQUFBQUFBQWtaR2x1WmdBQUFCeGtjbVZtQUFBQUFBQUFBQUVBQUFBTWRYSnNJQUFBQUFFQUFBQ3pjM1JpYkFBQUFHZHpkSE5rQUFBQUFBQUFBQUVBQUFCWGJYQTBZUUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FRQUFBQUFMdUFBQUFBQUFBelpYTmtjd0FBQUFBRGdJQ0FJZ0FCQUFTQWdJQVVRQlVBQUFBQUFBQUFBQUFBQUFXQWdJQUNFWkFHZ0lDQUFRSUFBQUFRYzNSMGN3QUFBQUFBQUFBQUFBQUFFSE4wYzJNQUFBQUFBQUFBQUFBQUFCUnpkSE42QUFBQUFBQUFBQUFBQUFBQUFBQUFFSE4wWTI4QUFBQUFBQUFBQUFBQUFlVjBjbUZyQUFBQVhIUnJhR1FBQUFBREFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFvQUFBQUZvQUFBQUFBR0JiV1JwWVFBQUFDQnRaR2hrQUFBQUFBQUFBQUFBQUFBQUFBOUNRQUFBQUFCVnhBQUFBQUFBTFdoa2JISUFBQUFBQUFBQUFIWnBaR1VBQUFBQUFBQUFBQUFBQUFCV2FXUmxiMGhoYm1Sc1pYSUFBQUFCTEcxcGJtWUFBQUFVZG0xb1pBQUFBQUVBQUFBQUFBQUFBQUFBQUNSa2FXNW1BQUFBSEdSeVpXWUFBQUFBQUFBQUFRQUFBQXgxY213Z0FBQUFBUUFBQU94emRHSnNBQUFBb0hOMGMyUUFBQUFBQUFBQUFRQUFBSkJoZG1NeEFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW9BQmFBQklBQUFBU0FBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHUC8vQUFBQU9tRjJZME1CVFVBZS8rRUFJMmROUUI2V1VvRkFYL0xnTFVCQVFGQUFBRDZBQUE2bURnQUFIb1FBQTlDVzd5NEtBUUFFYU91UElBQUFBQkJ6ZEhSekFBQUFBQUFBQUFBQUFBQVFjM1J6WXdBQUFBQUFBQUFBQUFBQUZITjBjM29BQUFBQUFBQUFBQUFBQUFBQUFBQVFjM1JqYndBQUFBQUFBQUFBQUFBQVNHMTJaWGdBQUFBZ2RISmxlQUFBQUFBQUFBQUJBQUFBQVFBQUFDNEFBQUFBQW9BQUFBQUFBQ0IwY21WNEFBQUFBQUFBQUFJQUFBQUJBQUNDTlFBQUFBQUNRQUFBJywgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXJsID0gdXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0ciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gU3RyaW5nKGVycj8ubWVzc2FnZSB8fCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj8ubmFtZSAhPT0gJ0Fib3J0RXJyb3InICYmICEvY2FuY2VsfGFib3J0L2kudGVzdChlcnJNc2cpKSBjb25zb2xlLmxvZygnZmV0Y2ggaG9vayBlcnIgJyArIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gKG5ldyBVUkwodXJsKSkucGF0aG5hbWUubWF0Y2goLyhbXlwvXSspKD89XC5cdyskKS8pPy5bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdwYXJlbnRfZG9tYWlucycpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB0ZW1wVXJsLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBGaXJzdCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggd2l0aCB0aGUgdmlkZW8gZW5jb2RpbmdzICgzNjBwLDQ4MHAsNzIwcCxldGMpLgogICAgICAgICAgICAgICAgICAgICAgICAvLyAtIFNlY29uZCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBvYnRhaW5lZCBpbiB0aGUgZmlyc3QgcmVxdWVzdC4gQXQgdGhpcyBwb2ludCB3ZSB3aWxsIGtub3cgaWYgdGhlcmUncyBhZHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzICE9IG51bGwgJiYgKGF3YWl0IHJlYWxGZXRjaChzdHJlYW1JbmZvLkVuY29kaW5ncy5tYXRjaCgvXmh0dHBzOi4qXC5tM3U4JC9tKT8uWzBdKSkuc3RhdHVzICE9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgZW5jb2RpbmdzIGFyZSBkZWFkICh0aGUgc3RyZWFtIHByb2JhYmx5IHJlc3RhcnRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZXJUaW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCB8fCBzdHJlYW1JbmZvLkVuY29kaW5ncyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0gY3JlYXRlU3RyZWFtSW5mbyhjaGFubmVsTmFtZSwgKG5ldyBVUkwodXJsKSkuc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gc3RyZWFtSW5mby5VcmxzLnZhbHVlcygpLm5leHQoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2gocmVzb2x1dGlvbkluZm8uVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OCA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3Moc3RyZWFtTTN1OCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbkZvdW5kQWQoc3RyZWFtSW5mbywgc3RyZWFtTTN1OCwgZmFsc2UsIHJlYWxGZXRjaCwgcmVzb2x1dGlvbkluZm8uVXJsLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0cmVhbU0zdThSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW5jb2RpbmdzTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2ZXJUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPyBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA6IHN0cmVhbUluZm8uRW5jb2RpbmdzLCBzZXJ2ZXJUaW1lKSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgoZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvI0VYVC1YLVNFU1NJT04tREFUQTpEQVRBLUlEPSJTRVJWRVItVElNRSIsVkFMVUU9IihbXiJdKykiLyk7CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgnU0VSVkVSLVRJTUU9IihbMC05Ll0rKSInKTsKICAgICAgICByZXR1cm4gbWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDEgPyBtYXRjaGVzWzFdIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4KGVuY29kaW5nc00zdTgsIG5ld1NlcnZlclRpbWUpIHsKICAgICAgICBpZiAoVjJBUEkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ld1NlcnZlclRpbWUgPyBlbmNvZGluZ3NNM3U4LnJlcGxhY2UoLygjRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKVteIl0rKCIpLywgYCQxJHtuZXdTZXJ2ZXJUaW1lfSQyYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZShuZXcgUmVnRXhwKCcoU0VSVkVSLVRJTUU9IilbMC05Ll0rIicpLCBgU0VSVkVSLVRJTUU9IiR7bmV3U2VydmVyVGltZX0iYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgfQogICAgZnVuY3Rpb24gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGNvbnN0IGVuY29kaW5nc0xpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBbdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodF0gPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uLnNwbGl0KCd4JykubWFwKE51bWJlcik7CiAgICAgICAgbGV0IG1hdGNoZWRSZXNvbHV0aW9uVXJsID0gbnVsbDsKICAgICAgICBsZXQgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZhbHNlOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IGNsb3Nlc3RSZXNvbHV0aW9uRGlmZmVyZW5jZSA9IEluZmluaXR5OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RpbmdzTGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIC8vIEFjY2VwdCB2MiBBUEkgdmFyaWFudCBVUkxzIChyYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnKS4KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGVuY29kaW5nc0xpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhlbmNvZGluZ3NMaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgY29uc3QgZnJhbWVSYXRlID0gYXR0cmlidXRlc1snRlJBTUUtUkFURSddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbiA9PSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uICYmICghbWF0Y2hlZFJlc29sdXRpb25VcmwgfHwgKCFtYXRjaGVkRnJhbWVSYXRlICYmIGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRnJhbWVSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oY2hhbm5lbE5hbWUsIHBsYXllclR5cGUpIHsKICAgICAgICBjb25zdCByZWFsUGxheWVyVHlwZSA9IHBsYXllclR5cGUucmVwbGFjZSgnLUFMVCcsICcnKTsKICAgICAgICBjb25zdCBib2R5ID0gewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUGxheWJhY2tBY2Nlc3NUb2tlbicsCiAgICAgICAgICAgIHZhcmlhYmxlczogewogICAgICAgICAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgbG9naW46IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgaXNWb2Q6IGZhbHNlLAogICAgICAgICAgICAgICAgdm9kSUQ6ICIiLAogICAgICAgICAgICAgICAgcGxheWVyVHlwZTogcmVhbFBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSk7CiAgICB9CiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHksIHBsYXllclR5cGUpIHsKICAgICAgICBpZiAoIWdxbF9kZXZpY2VfaWQpIHsKICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9ICcnOwogICAgICAgICAgICBjb25zdCBjaGFycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlkJzogQ0xJRU5UX0lELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkLAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSkKICAgICAgICB9OwogICAgICAgIGlmIChwbGF5ZXJUeXBlLmluY2x1ZGVzKCctQUxUJykpIHsKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgICdDbGllbnQtSWQnOiBDTElFTlRfSUQsCiAgICAgICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0geC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArMSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXQogICAgICAgICAgICAgICAgfSkpOwogICAgfQogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCBmZXRjaFJlcXVlc3Qub3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0LCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBncWxfZGV2aWNlX2lkICE9IGRldmljZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgPSBkZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1Vib1VwZGF0ZURldmljZUlkJywgZ3FsX2RldmljZV9pZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddICE9PSBDbGllbnRJbnRlZ3JpdHlIZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicsIENsaWVudEludGVncml0eUhlYWRlciA9IGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9PT0gJ3N0cmluZycgJiYgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gIT09IEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUF1dGhvcml6YXRpb25IZWFkZXInLCBBdXRob3JpemF0aW9uSGVhZGVyID0gaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEhlYWRlcnMgJiYgZ3FsX2RldmljZV9pZCAmJiBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xvZ2dlZEhlYWRlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBHUUwgaGVhZGVycyBjYXB0dXJlZCDigJQgRGV2aWNlSWQ6ICcgKyAoZ3FsX2RldmljZV9pZCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZWRQbGF5ZXJUeXBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0JvZHkgPSBKU09OLnBhcnNlKGluaXQuYm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0JvZHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0JvZHkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keVtpXT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9keS52YXJpYWJsZXMucGxheWVyVHlwZSA9IE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlcGxhY2VkICcke3JlcGxhY2VkUGxheWVyVHlwZX0nIHBsYXllciB0eXBlIHdpdGggJyR7T1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRX0nIHBsYXllciB0eXBlYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NhaVR5cGUgPSB1cmwuaW5jbHVkZXMoJ2JwPW1pZHJvbGwnKSA/ICdtaWRyb2xsJyA6IHVybC5pbmNsdWRlcygnYnA9cHJlcm9sbCcpID8gJ3ByZXJvbGwnIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyhjc2FpVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZChjc2FpVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgYWQgcmVxdWVzdCBkZXRlY3RlZCDigJQgdHlwZTogJyArIGNzYWlUeXBlICsgJyAoY2xpZW50LXNpZGUgYWQgaW5zZXJ0aW9uLCBub3QgYmxvY2thYmxlIHZpYSBtM3U4KScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwgJ2ZldGNoJyk7CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVBZGJsb2NrQmFubmVyKGRhdGEpIHsKICAgICAgICBjb25zdCBwbGF5ZXJSb290RGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLXBsYXllcicpOwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICghdHdpdGNoUGxheWVyQW5kU3RhdGU/LnBsYXllcj8uY29yZSB8fCAhdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgdHdpdGNoUGxheWVyQW5kU3RhdGUgPSBnZXRQbGF5ZXJBbmRTdGF0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaXNMaXZlID0gdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlPy5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QLnRleHRDb250ZW50ID0gJ0Jsb2NraW5nJyArIChkYXRhLmlzTWlkcm9sbCA/ICcgbWlkcm9sbCcgOiAnJykgKyAnIGFkcycgKyAoZGF0YS5pc1N0cmlwcGluZ0FkU2VnbWVudHMgPyAnIChzdHJpcHBpbmcpJyA6ICcnKSArIChkYXRhLmFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPyAnICgnICsgZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlICsgJyknIDogJycpOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gZGF0YS5oYXNBZHMgJiYgaXNMaXZlID8gJ2Jsb2NrJyA6ICdub25lJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG1vbml0b3JMaXZlU3RhdHVzKCkgewogICAgICAgIGlmICghdHdpdGNoUGxheWVyQW5kU3RhdGU/LnBsYXllcj8uY29yZSB8fCAhdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlKSB7CiAgICAgICAgICAgIHR3aXRjaFBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaXNMaXZlID0gdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlPy5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnOwogICAgICAgIGlmICghaXNMaXZlKSB7CiAgICAgICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXIoewogICAgICAgICAgICAgICAgaGFzQWRzOiBmYWxzZQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dChtb25pdG9yTGl2ZVN0YXR1cywgMTAwMCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lciAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVhY3RSb290Tm9kZSA9PSBudWxsICYmIHJvb3ROb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBPYmplY3Qua2V5cyhyb290Tm9kZSkuZmluZCh4ID0+IHguc3RhcnRzV2l0aCgnX19yZWFjdENvbnRhaW5lcicpIHx8IHguc3RhcnRzV2l0aCgnX19yZWFjdEZpYmVyJykpOwogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZVtjb250YWluZXJOYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhY3RSb290Tm9kZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVhY3RSb290Tm9kZSA9IGZpbmRSZWFjdFJvb3ROb2RlKCk7CiAgICAgICAgaWYgKCFyZWFjdFJvb3ROb2RlKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBQcmltYXJ5OiBuYW1lZCBwcm9wZXJ0eSBsb29rdXAKICAgICAgICBsZXQgcGxheWVyID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0UGxheWVyQWN0aXZlICYmIG5vZGUucHJvcHMgJiYgbm9kZS5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlKTsKICAgICAgICBwbGF5ZXIgPSBwbGF5ZXIgJiYgcGxheWVyLnByb3BzICYmIHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlID8gcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgIGlmIChwbGF5ZXI/LnBsYXllckluc3RhbmNlKSB7CiAgICAgICAgICAgIHBsYXllciA9IHBsYXllci5wbGF5ZXJJbnN0YW5jZTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2ggaWYgVHdpdGNoIG9iZnVzY2F0ZXMgcHJvcGVydHkgbmFtZXMKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5nZXRIVE1MVmlkZW9FbGVtZW50ICYmIG5vZGUuZ2V0QnVmZmVyRHVyYXRpb24gJiYgbm9kZS5jb3JlPy5zdGF0ZSk7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGNvbnN0IHBsYXllclN0YXRlID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0U3JjICYmIG5vZGUuc2V0SW5pdGlhbFBsYXliYWNrU2V0dGluZ3MpOwogICAgICAgIC8vIEZhbGxiYWNrOiBzdHJ1Y3R1cmFsIG1hdGNoIOKAlCBzZXRTcmMgZXhpc3RzIGJ1dCBzZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyB3YXMgcmVuYW1lZAogICAgICAgIGNvbnN0IHBsYXllclN0YXRlRmFsbGJhY2sgPSAhcGxheWVyU3RhdGUgPyBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRTdHJlYW1NYW5hZ2VyTm9kZSAmJiAhbm9kZS5nZXRIVE1MVmlkZW9FbGVtZW50KSA6IG51bGw7CiAgICAgICAgLy8gRmFsbGJhY2sgMjogVFRWLUFCJ3MgYXBwcm9hY2gg4oCUIHZpZGVvUGxheWVySW5zdGFuY2Ugd2l0aCBwbGF5ZXJNb2RlCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjazIgPSAhcGxheWVyU3RhdGUgJiYgIXBsYXllclN0YXRlRmFsbGJhY2sgPyBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZT8ucGxheWVyTW9kZSAhPT0gdW5kZWZpbmVkKT8uc3RhdGU/LnZpZGVvUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgIGNvbnN0IGZpbmFsUGxheWVyU3RhdGUgPSBwbGF5ZXJTdGF0ZSB8fCBwbGF5ZXJTdGF0ZUZhbGxiYWNrIHx8IHBsYXllclN0YXRlRmFsbGJhY2syOwogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVsb2FkVHdpdGNoUGxheWVyKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgY29uc3QgcGxheWVyQW5kU3RhdGUgPSBnZXRQbGF5ZXJBbmRTdGF0ZSgpOwogICAgICAgIGlmICghcGxheWVyQW5kU3RhdGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHJlYWN0IHJvb3QnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXI7CiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBwbGF5ZXJBbmRTdGF0ZS5zdGF0ZTsKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCFwbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyIHN0YXRlJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllci5pc1BhdXNlZCgpIHx8IHBsYXllci5jb3JlPy5wYXVzZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzUGF1c2VQbGF5ICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA+IDApIHsKICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY29uc3QgY29vbGRvd25NcyA9IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDEwMDA7CiAgICAgICAgICAgIGlmIChsYXN0UmVsb2FkVGltZXN0YW1wICYmIG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXAgPCBjb29sZG93bk1zKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIGNvb2xkb3duIGFjdGl2ZSAoJyArIE1hdGgucm91bmQoKGNvb2xkb3duTXMgLSAobm93IC0gbGFzdFJlbG9hZFRpbWVzdGFtcCkpIC8gMTAwMCkgKyAncyByZW1haW5pbmcpJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVsb2FkVGltZXN0YW1wcy5wdXNoKG5vdyk7CiAgICAgICAgICAgIGNvbnN0IGZpdmVNaW5BZ28gPSBub3cgLSAzMDAwMDA7CiAgICAgICAgICAgIHdoaWxlIChyZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA+IDAgJiYgcmVsb2FkVGltZXN0YW1wc1swXSA8IGZpdmVNaW5BZ28pIHsgcmVsb2FkVGltZXN0YW1wcy5zaGlmdCgpOyB9CiAgICAgICAgICAgIGlmIChyZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA+PSAzICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA8IDkwKSB7CiAgICAgICAgICAgICAgICBFc2NhbGF0ZWRGcm9tQ29vbGRvd24gPSBSZWxvYWRDb29sZG93blNlY29uZHM7CiAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSA5MDsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEF1dG8tZXNjYWxhdGVkIHJlbG9hZCBjb29sZG93biB0byA5MHMgKDMrIHJlbG9hZHMgaW4gNSBtaW51dGVzKScpOwogICAgICAgICAgICB9IGVsc2UgaWYgKEVzY2FsYXRlZEZyb21Db29sZG93biAhPT0gbnVsbCAmJiByZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA8IDMpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIERlLWVzY2FsYXRlZCByZWxvYWQgY29vbGRvd24gYmFjayB0byAnICsgRXNjYWxhdGVkRnJvbUNvb2xkb3duICsgJ3MgKGJ1cnN0IHN1YnNpZGVkKScpOwogICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gRXNjYWxhdGVkRnJvbUNvb2xkb3duOwogICAgICAgICAgICAgICAgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0UmVsb2FkVGltZXN0YW1wID0gbm93OwogICAgICAgIH0KICAgICAgICBpZiAoaXNQYXVzZVBsYXkpIHsKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudCkgewogICAgICAgICAgICAvLyBEb3duZ3JhZGUgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAg4oCUIHNldFNyYyBleGl0cyBQaVAKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEb3duZ3JhZGVkIHJlbG9hZCB0byBwYXVzZS9wbGF5IHRvIHByZXNlcnZlIFBpUCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzS2V5UXVhbGl0eSA9ICd2aWRlby1xdWFsaXR5JzsKICAgICAgICBjb25zdCBsc0tleU11dGVkID0gJ3ZpZGVvLW11dGVkJzsKICAgICAgICBjb25zdCBsc0tleVZvbHVtZSA9ICd2b2x1bWUnOwogICAgICAgIGxldCBjdXJyZW50UXVhbGl0eUxTID0gbnVsbDsKICAgICAgICBsZXQgY3VycmVudE11dGVkTFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50Vm9sdW1lTFMgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGN1cnJlbnRRdWFsaXR5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVF1YWxpdHkpOwogICAgICAgICAgICBjdXJyZW50TXV0ZWRMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TXV0ZWQpOwogICAgICAgICAgICBjdXJyZW50Vm9sdW1lTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVZvbHVtZSk7CiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIHBsYXllci5jb3JlLnN0YXRlLnZvbHVtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLnF1YWxpdHkuZ3JvdXB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgcGxheWVyLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgIC8vIGNsZWFyZWQgY2FjaGUpLCB0aGUgdmlkZW8gc3RpbGwgbmVlZHMgdW5tdXRlIGFmdGVyIENocm9tZSdzIGF1dG9wbGF5IG11dGUgb24gcmVsb2FkLgogICAgICAgIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHdyaXRlcyB2aWRlby1tdXRlZCBhcyAneyJkZWZhdWx0Ijp0cnVlfScgd2hlbiB1c2VyIG11dGVkIHZpYSBVSTsKICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID4gMCAmJiB2aWRlb3NbMF0ubXV0ZWQgJiYgIXVzZXJJbnRlbmRlZE11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRlbnRMb2FkZWQoKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXZlbnR2LWV4dGVuc2lvbicpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6IDdUViBleHRlbnNpb24gZGV0ZWN0ZWQg4oCUIG1heSBjYXVzZSBibGFjayBzY3JlZW4gb3IgYnVmZmVyaW5nIGlzc3Vlcy4gSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMsIHRyeSBkaXNhYmxpbmcgN1RWLicpOwogICAgICAgIH0KICAgICAgICAvLyBUaGlzIHN0b3BzIFR3aXRjaCBmcm9tIHBhdXNpbmcgdGhlIHBsYXllciB3aGVuIGluIGFub3RoZXIgdGFiIGFuZCBhbiBhZCBzaG93cy4KICAgICAgICAvLyBUYWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXVjZXR0di9WaWRlb0FkQmxvY2tGb3JUd2l0Y2gvYmxvYi9jZWZjZTlkMmI1NjU3NjljNzdlMzY2NmFjODIzNGMzYWNmZTIwZDgzL2Nocm9tZS9jb250ZW50LmpzI0wzMAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Zpc2libGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9Y2F0Y2h7fQogICAgICAgIGxldCBoaWRkZW4gPSBkb2N1bWVudC5fX2xvb2t1cEdldHRlcl9fKCdoaWRkZW4nKTsKICAgICAgICBsZXQgd2Via2l0SGlkZGVuID0gZG9jdW1lbnQuX19sb29rdXBHZXR0ZXJfXygnd2Via2l0SGlkZGVuJyk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnaGlkZGVuJywgewogICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfWNhdGNoe30KICAgICAgICBjb25zdCBibG9jayA9IGUgPT4gewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgfTsKICAgICAgICBsZXQgd2FzVmlkZW9QbGF5aW5nID0gdHJ1ZTsKICAgICAgICBjb25zdCB2aXNpYmlsaXR5Q2hhbmdlID0gZSA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hyb21lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuLmFwcGx5KGRvY3VtZW50KSA9PT0gdHJ1ZSB8fCAod2Via2l0SGlkZGVuICYmIHdlYmtpdEhpZGRlbi5hcHBseShkb2N1bWVudCkgPT09IHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhc1ZpZGVvUGxheWluZyA9ICF2aWRlb3NbMF0ucGF1c2VkICYmICF2aWRlb3NbMF0uZW5kZWQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YXNWaWRlb1BsYXlpbmcgJiYgIXZpZGVvc1swXS5lbmRlZCAmJiB2aWRlb3NbMF0ucGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBibG9jayhlKTsKICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96dmlzaWJpbGl0eWNoYW5nZScsIHZpc2liaWxpdHlDaGFuZ2UsIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc0ZvY3VzJywgYmxvY2ssIHRydWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICgvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnbW96SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnd2Via2l0SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfWNhdGNoe30KICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gcmVsb2FkVHdpdGNoUGxheWVyOwogICAgZGVjbGFyZU9wdGlvbnMod2luZG93KTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgbHNSZWxvYWRBZnRlckFkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZFBsYXllckFmdGVyQWQnKTsKICAgICAgICBpZiAobHNSZWxvYWRBZnRlckFkICE9PSBudWxsKSB7CiAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSBsc1JlbG9hZEFmdGVyQWQgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQbGF5ZXJUeXBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQbGF5ZXJUeXBlICE9PSBudWxsKSB7CiAgICAgICAgICAgIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgPSBsc1BsYXllclR5cGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGluQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BpbkJhY2t1cFBsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQaW5CYWNrdXAgIT09IG51bGwpIHsKICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9IGxzUGluQmFja3VwID09PSAndHJ1ZSc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzQ29vbGRvd24gPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkQ29vbGRvd25TZWNvbmRzJykpOwogICAgICAgIGlmICghaXNOYU4obHNDb29sZG93bikgJiYgbHNDb29sZG93biA+PSAwKSB7CiAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IGxzQ29vbGRvd247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzSGlkZUFkT3ZlcmxheSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19oaWRlQWRPdmVybGF5Jyk7CiAgICAgICAgaWYgKGxzSGlkZUFkT3ZlcmxheSA9PT0gJ3RydWUnKSB7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAnLnRhcy1hZGJsb2NrLW92ZXJsYXkgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0nOwogICAgICAgICAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDb25maWc6IFJlbG9hZFBsYXllckFmdGVyQWQgPSAnICsgUmVsb2FkUGxheWVyQWZ0ZXJBZCArICcsIEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJyArIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIG1vbml0b3JMaXZlU3RhdHVzKCk7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"}] \ No newline at end of file +[{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-auto-pip.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBicmF2ZS1hdXRvLXBpcCDigJQgYXV0b21hdGljIFBpY3R1cmUtaW4tUGljdHVyZSB0b2dnbGUgZm9yIEhUTUw1IDx2aWRlbz4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBXaGF0IGl0IGRvZXMKICogLS0tLS0tLS0tLS0tCiAqICAgMS4gRm9yY2UtZW5hYmxlcyBQaVAgb24gdmlkZW9zIHRoYXQgZXhwbGljaXRseSBkaXNhYmxlIGl0IChOZXRmbGl4LAogKiAgICAgIGNlcnRhaW4gRFJNIHBsYXllcnMpIGJ5IGNsZWFyaW5nIGBkaXNhYmxlUGljdHVyZUluUGljdHVyZWAgYW5kCiAqICAgICAgd2F0Y2hpbmcgZm9yIHNpdGVzIHRoYXQgdHJ5IHRvIHJlLXNldCBpdC4KICogICAyLiBXaXJlcyBgbWVkaWFTZXNzaW9uLnNldEFjdGlvbkhhbmRsZXIoImVudGVycGljdHVyZWlucGljdHVyZSIpYCBzbwogKiAgICAgIGJyb3dzZXJzIC8gT1NlcyB0aGF0IGZpcmUgaXQgKGF1dG8tUGlQIG9uIHRhYiBzd2l0Y2gpIGp1c3Qgd29yay4KICogICAzLiBBZGRzIGEgY2xpY2thYmxlIFBpUCBjb250cm9sOgogKiAgICAgICAgLSBOYXRpdmUgaW5qZWN0aW9uIG9uIFlvdVR1YmUgLyBUd2l0Y2ggLyBOZXRmbGl4IChtYXRjaGVzIGVhY2gKICogICAgICAgICAgc2l0ZSdzIGV4aXN0aW5nIGNvbnRyb2xzIGJhcikuCiAqICAgICAgICAtIE90aGVyd2lzZSBhIEZpcmVmb3gtc3R5bGUgIlBvcCBvdXQgdGhpcyB2aWRlbyIgaG92ZXIgcGlsbAogKiAgICAgICAgICB0aGF0IGZsb2F0cyBvdmVyIHRoZSB2aWRlbywgZmFkZXMgaW4gb24gaG92ZXIsIGZhZGVzIG91dAogKiAgICAgICAgICBhZnRlciBhIHNtYWxsIGdyYWNlIHBlcmlvZCwgYW5kIHNocmlua3MgdG8gaWNvbi1vbmx5IGFmdGVyCiAqICAgICAgICAgIHRoZSBmaXJzdCBjbGljay4KICogICA0LiBIYW5kbGVzIG1hbnkgdmlkZW9zIG9uIHRoZSBzYW1lIHBhZ2UgKGZlZWRzLCBjb21tZW50IGVtYmVkcywKICogICAgICBtb2RhbCBwbGF5ZXJzKSBhbmQgdHJhY2tzIGFkZC9yZW1vdmUgdmlhIE11dGF0aW9uT2JzZXJ2ZXIuCiAqCiAqIENvbmZpZ3VyYXRpb24gKHBlci1vcmlnaW4gbG9jYWxTdG9yYWdlKQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogICBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAKICogICAgIHVuc2V0IC8gIjEiIC8gInRydWUiIC8gInllcyIgLyAib24iICAgLT4gZ2VuZXJpYyBvdmVybGF5IHBpbGwgKGRlZmF1bHQpCiAqICAgICAiMCIgICAvICJmYWxzZSIgLyAibm8iICAgLyAib2ZmIiAgICAgIC0+IHVzZSBzaXRlLXNwZWNpZmljIG5hdGl2ZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gKFlvdVR1YmUvVHdpdGNoL05ldGZsaXgpCiAqCiAqICAgU2V0IHZpYSBEZXZUb29scyBjb25zb2xlIG9uIHRoZSBkZXNpcmVkIG9yaWdpbiwgdGhlbiByZWxvYWQgdGhlIHRhYi4KICoKICogQnJvd3NlciBzdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLQogKiAgIC0gQ2hyb21pdW0gKEJyYXZlLCBDaHJvbWUsIEVkZ2UpOiBmdWxsIHN1cHBvcnQsIGFsbCBmZWF0dXJlcy4KICogICAtIEZpcmVmb3g6IFBpUCB3b3JrcywgYnV0IEZpcmVmb3ggYWxyZWFkeSBzaGlwcyBhIGJ1aWx0LWluICJQb3Agb3V0CiAqICAgICB0aGlzIHZpZGVvIiB0b2dnbGUgc28gdGhlIHNjcmlwdCdzIHBpbGwgaXMgcmVkdW5kYW50IHRoZXJlLgogKiAgIC0gU2FmYXJpIChpT1MgMTQrKTogZmFsbHMgYmFjayB0byBgd2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZWAuIFRoZQogKiAgICAgaG92ZXIgcGlsbCBzd2l0Y2hlcyB0byBhIHRhcC10by1yZXZlYWwgcGlsbCAoMyBzIGF1dG8taGlkZSkuCiAqICAgLSBPdGhlciAvIG9sZGVyOiBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbm8gUGlQIEFQSSBpcwogKiAgICAgcHJlc2VudCBhdCBhbGwuCiAqCiAqIEFyY2hpdGVjdHVyZQogKiAtLS0tLS0tLS0tLS0KICogICAqIE9uZSBzaGFyZWQgbW91c2Vtb3ZlIC8gdG91Y2hzdGFydCAvIHNjcm9sbCAvIHJlc2l6ZSAvIGZ1bGxzY3JlZW4KICogICAgIGxpc3RlbmVyIHNldCwgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB2aWRlb3MgYXJlIG9uIHRoZSBwYWdlCiAqICAgICAoYG92ZXJsYXlzYCByZWdpc3RyeSArIGBhcm1HbG9iYWxzKClgIC8gYG1heWJlRGlzYXJtR2xvYmFscygpYCkuCiAqICAgKiBPZmYtc2NyZWVuIHZpZGVvcyBhcmUgZ2F0ZWQgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBhIHNpbmdsZQogKiAgICAgYEludGVyc2VjdGlvbk9ic2VydmVyYCAoYHZpc2libGVPdmVybGF5c2Agc3Vic2V0KS4KICogICAqIEV2ZXJ5IHBlci12aWRlbyByZWdpc3RyYXRpb24gcmVjb3JkcyBhIHRlYXJkb3duIGZ1bmN0aW9uIGluCiAqICAgICBgdmlkZW9DbGVhbnVwc2Agc28gdGhlIGxpc3RlbmVycywgb2JzZXJ2ZXJzLCBhbmQgcGlsbCBidXR0b24gYXJlCiAqICAgICBhbGwgcmVtb3ZlZCBpZiB0aGUgcGFnZSBkcm9wcyB0aGUgdmlkZW8gZWxlbWVudC4KICoKICogU291cmNlIG9mIG9yaWdpbmFsIGF1dG8tUGlQIGJlaGF2aW91cjoKICogICBodHRwczovL29sZC5yZWRkaXQuY29tL3IvYnJhdmVfYnJvd3Nlci9jb21tZW50cy8xcjhlZGc0LwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCihmdW5jdGlvbigpIHsKICBjb25zdCBWRVJTSU9OID0gInYwLjQyLXl0LWF1dG9waXAtdGFyZ2V0K2NvbmRpdGlvbmFsLXJlc3VtZSI7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFR1bmFibGVzCiAgLy8KICAvLyBDb2xsZWN0ZWQgaGVyZSBzbyBhIHVzZXIgLyBtYWludGFpbmVyIGNhbiBhZGp1c3Qgc3BhY2luZywgdGltaW5nIGFuZAogIC8vIHZpZXdwb3J0IGJlaGF2aW91ciB3aXRob3V0IGh1bnRpbmcgdGhyb3VnaCB0aGUgZmlsZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBjb25zdCBDT05GSUcgPSB7CiAgICAvLyBWZXJ0aWNhbCBvZmZzZXQgYWRkZWQgdG8gdGhlIHBpbGwncyBjZW50cmVkLW1pZC1yaWdodCBwb3NpdGlvbgogICAgLy8gKHBvc2l0aXZlID0gZG93bikuIEVtcGlyaWNhbGx5IHR1bmVkIHNvIHRoZSBwaWxsIHNpdHMgYmVsb3cgdGhlCiAgICAvLyB0eXBpY2FsIHNpdGUgY29udHJvbCBiYXIgaW5zdGVhZCBvZiBvdmVybGFwcGluZyBpdC4KICAgIFBJTExfT0ZGU0VUX1k6IDQwLAogICAgLy8gSG9yaXpvbnRhbCBnYXAgZnJvbSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdmlzaWJsZSB2aWRlbyB0byB0aGUgcGlsbC4KICAgIFBJTExfUklHSFRfTUFSR0lOOiAxMiwKICAgIC8vIE1pbmltdW0gZ2FwIGJldHdlZW4gdGhlIHBpbGwgYW5kIGFueSB2aWV3cG9ydCBlZGdlLgogICAgVklFV1BPUlRfUEFEOiA4LAogICAgLy8gRGVsYXkgYmV0d2VlbiB0aGUgY3Vyc29yIGxlYXZpbmcgdGhlIHZpZGVvL3BpbGwgcmVnaW9uIGFuZCB0aGUKICAgIC8vIHBpbGwgZmFkaW5nIG91dCDigJQgcHJvdGVjdHMgYWdhaW5zdCBmbGlja2VyIHdoZW4gdGhlIGN1cnNvcgogICAgLy8gY3Jvc3NlcyB0aGUgZ2FwIGZyb20gdmlkZW8gdG8gcGlsbC4KICAgIEhPVkVSX0dSQUNFX01TOiAxNTAsCiAgICAvLyBIb3cgbG9uZyB0aGUgcGlsbCBzdGF5cyByZXZlYWxlZCBhZnRlciBhIHRhcCBvbiBhIHRvdWNoIGRldmljZS4KICAgIFRPVUNIX1JFVkVBTF9NUzogMzAwMCwKICAgIC8vIE1heGltdW0gdGltZSB3ZSB3YWl0IGZvciBgbG9hZGVkbWV0YWRhdGFgIGJlZm9yZSBpc3N1aW5nIFBpUC4KICAgIE1FVEFEQVRBX1dBSVRfTVM6IDMwMDAsCiAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBidWZmZXIgc28gdGhlIHBpbGwgaXMgaW4gcGxhY2UgYmVmb3JlIHRoZQogICAgLy8gdmlkZW8gZnVsbHkgc2Nyb2xscyBpbnRvIHZpZXcuCiAgICBJT19ST09UX01BUkdJTjogIjEwMHB4IiwKICAgIC8vIEdyYWNlIHdpbmRvdyBhZnRlciBhIFlvdVR1YmUgU1BBIG5hdmlnYXRpb24gZHVyaW5nIHdoaWNoIHRoZSBwaWxsCiAgICAvLyBzdGF5cyBzdXBwcmVzc2VkIGV2ZW4gaWYgdGhlIG5ldyBVUkwgd291bGQgb3RoZXJ3aXNlIGJlIGVsaWdpYmxlLgogICAgLy8gTGV0cyB0aGUgd2F0Y2gtcGFnZSBwbGF5ZXIgbW91bnQgYW5kIGF2b2lkcyBhIGJyaWVmIGZsYXNoIHdoZW4gdGhlCiAgICAvLyBjdXJzb3IgaXMgc3RpbGwgYXQgdGhlIHByZXZpb3VzIGhvdmVyIHRhcmdldCdzIGNvb3JkaW5hdGVzLgogICAgWVRfTkFWX0dSQUNFX01TOiA1MDAsCiAgICAvLyBJZiBhIG5hdGl2ZSBpbmplY3RvciAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpIGtlZXBzIHJldHVybmluZwogICAgLy8gZmFsc2UgZm9yIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIGdpdmUgdXAKICAgIC8vIG9uIG5hdGl2ZSBpbmplY3Rpb24gYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQuCiAgICAvLyBHZW5lcm91cyBvbiBwdXJwb3NlIOKAlCBzbG93IHBsYXllciBtb3VudHMgKG5ldHdvcmstc3RhbGxlZCBpZnJhbWVzLAogICAgLy8gbG9uZy1ydW5uaW5nIFJlYWN0IGh5ZHJhdGlvbikgc2hvdWxkbid0IHRyaXAgdGhlIGZhbGxiYWNrLgogICAgTkFUSVZFX0ZBTExCQUNLX01TOiAxMDAwMCwKICB9OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNb2R1bGUtbGV2ZWwgc3RhdGUKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gdmlkZW8gZWxlbWVudCAtPiBjbGVhbnVwIGZ1bmN0aW9uLiBQb3B1bGF0ZWQgd2hlbiBhIHZpZGVvIGlzIHdpcmVkCiAgLy8gdXA7IGNhbGxlZCBmcm9tIHRoZSBkaXNjb3ZlcnkgTXV0YXRpb25PYnNlcnZlciB3aGVuIGEgdHJhY2tlZCB2aWRlbwogIC8vIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB3ZSBjYW4gcmVsZWFzZSBldmVyeSBsaXN0ZW5lciBhbmQgdGhlCiAgLy8gcGlsbCBET00gbm9kZSBpdCBvd25zLgogIGNvbnN0IHZpZGVvQ2xlYW51cHMgPSBuZXcgV2Vha01hcCgpOwoKICAvLyBZb3VUdWJlLXNwZWNpZmljIHN0YXRlIGZvciB0aGUgVVJMLWdhdGUgKyBTUEEtbmF2LWdyYWNlIGxvZ2ljIGluCiAgLy8gdXBkYXRlKCkuIEhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHNvIHVwZGF0ZSgpIGRvZXNuJ3QgcmUtdGVzdCB0aGUKICAvLyBob3N0IHJlZ2V4IGV2ZXJ5IHRpY2sg4oCUIGhvc3RuYW1lIGlzIGludmFyaWFudCBmb3IgdGhlIHBhZ2UgbGlmZXRpbWUsCiAgLy8gYW5kIHRoZSBwYXRobmFtZSByZWdleCBvbmx5IHJlLXJ1bnMgb24gYWN0dWFsIFNQQSBwYXRoIGNoYW5nZXMuCiAgLy8gV2h5IHRoaXMgZXhpc3RzOiBZb3VUdWJlJ3MgaG9tZXBhZ2UgLyBmZWVkIC8gc2VhcmNoIC8gY2hhbm5lbCBwYWdlcwogIC8vIHJldXNlIHRoZSBzYW1lIGBodG1sNS12aWRlby1jb250YWluZXJgIDx2aWRlbz4gZWxlbWVudCBhcyB0aGUgd2F0Y2gKICAvLyBwYWdlIGZvciBob3Zlci10aHVtYm5haWwgcHJldmlld3MsIHJlcG9zaXRpb25pbmcgaXQgb3ZlciB3aGljaGV2ZXIKICAvLyB0aHVtYm5haWwgdGhlIGN1cnNvciBpcyBvbi4gRE9NLWxldmVsIHNpZ25hbHMgKHNpemUsIG11dGVkLCBsb29wLAogIC8vIHBhcmVudCBjbGFzcykgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHByZXZpZXcgYW5kIHdhdGNoLCBzbyB0aGUgVVJMIGlzCiAgLy8gdGhlIG9ubHkgcmVsaWFibGUgZGlzdGluZ3Vpc2hlci4KICBjb25zdCBfeXRIb3N0ID0gLyg/Ol58XC4pKD86eW91dHViZVwuY29tfHlvdXR1YmUtbm9jb29raWVcLmNvbSkkL2kudGVzdChsb2NhdGlvbi5ob3N0bmFtZSk7CiAgY29uc3QgX3l0V2F0Y2hQYXRoID0gL15cLyg/OndhdGNofGVtYmVkfGxpdmV8c2hvcnRzKS87CiAgbGV0IF95dExhc3RQYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgbGV0IF95dFByZXZpZXdBcmVhID0gX3l0SG9zdCAmJiAhX3l0V2F0Y2hQYXRoLnRlc3QoX3l0TGFzdFBhdGgpOwogIGxldCBfeXROYXZBdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE92ZXJsYXkgcmVnaXN0cnkgKyB2aWV3cG9ydCBnYXRpbmcKICAvLwogIC8vIEdvYWw6IE8oMSkgZG9jdW1lbnQvd2luZG93IGxpc3RlbmVycyByZWdhcmRsZXNzIG9mIHZpZGVvIGNvdW50LCBhbmQKICAvLyBPKHZpc2libGUpIChub3QgTyh0b3RhbCkpIHdvcmsgcGVyIHNjcm9sbC9tb3VzZW1vdmUgdGljay4gQSBzaW5nbGUKICAvLyBzaGFyZWQgbGlzdGVuZXIgc2V0IHdhbGtzIHRoZSByZWdpc3RyeTsgYW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIKICAvLyBuYXJyb3dzIGl0ZXJhdGlvbiB0byB0aGUgdmlkZW9zIGFjdHVhbGx5IG9uIHNjcmVlbi4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gRXZlcnkgb3ZlcmxheSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgKGxpZmV0aW1lIHJlZ2lzdHJ5KS4KICBjb25zdCBvdmVybGF5cyA9IG5ldyBTZXQoKTsKICAvLyBTdWJzZXQgb2YgYG92ZXJsYXlzYCB3aG9zZSB2aWRlbyBpcyBjdXJyZW50bHkgaW50ZXJzZWN0aW5nIHRoZQogIC8vIHZpZXdwb3J0LiBIb3QtcGF0aCBpdGVyYXRpb24gdXNlcyB0aGlzIHNldCBzbyBvZmYtc2NyZWVuIHZpZGVvcyBpbgogIC8vIGxvbmcgZmVlZHMgZG9uJ3QgcGF5IGxheW91dCBjb3N0cyBvbiBldmVyeSBzY3JvbGwgZnJhbWUuCiAgY29uc3QgdmlzaWJsZU92ZXJsYXlzID0gbmV3IFNldCgpOwogIC8vIFJldmVyc2UgbG9va3VwIGZvciB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sgKGVudHJ5LnRhcmdldAogIC8vIGlzIHRoZSB2aWRlbyBlbGVtZW50KS4KICBjb25zdCB2aWRlb1RvT3ZlcmxheSA9IG5ldyBXZWFrTWFwKCk7CiAgbGV0IGludGVyc2VjdGlvbk9ic2VydmVyID0gbnVsbDsKICBmdW5jdGlvbiBnZXRJTygpIHsKICAgIGlmIChpbnRlcnNlY3Rpb25PYnNlcnZlcikgcmV0dXJuIGludGVyc2VjdGlvbk9ic2VydmVyOwogICAgaWYgKHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgZSA9IGVudHJpZXNbaV07CiAgICAgICAgY29uc3QgaW5zdCA9IHZpZGVvVG9PdmVybGF5LmdldChlLnRhcmdldCk7CiAgICAgICAgaWYgKCFpbnN0KSBjb250aW51ZTsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmFkZChpbnN0KTsKICAgICAgICB9IGVsc2UgaWYgKHZpc2libGVPdmVybGF5cy5kZWxldGUoaW5zdCkpIHsKICAgICAgICAgIC8vIEZvcmNlIGEgZmluYWwgdXBkYXRlIHNvIGFueSB2aXNpYmxlIHBpbGwgaGlkZXMgY2xlYW5seS4KICAgICAgICAgIGluc3QudXBkYXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7IHJvb3RNYXJnaW46IENPTkZJRy5JT19ST09UX01BUkdJTiB9KTsKICAgIHJldHVybiBpbnRlcnNlY3Rpb25PYnNlcnZlcjsKICB9CiAgLy8gTGFzdCBrbm93biBwb2ludGVyIHBvc2l0aW9uIChudW1iZXJzLCBuZXZlciB0aGUgTW91c2VFdmVudCDigJQga2VlcGluZwogIC8vIHRoZSBldmVudCBhbGl2ZSBhY3Jvc3MgckFGIHRpY2tzIHBpbnMgZXh0cmEgRE9NIHJlZmVyZW5jZXMgaW4gVjgncwogIC8vIGNsb3N1cmUgZW52aXJvbm1lbnQpLgogIGxldCBtbVggPSAwLCBtbVkgPSAwOwogIC8vIENvYWxlc2NpbmcgZmxhZ3Mg4oCUIGNvbGxhcHNlIGJ1cnN0cyBvZiBtb3VzZW1vdmUgLyBzY3JvbGwgLyBldGMuIGludG8KICAvLyBhIHNpbmdsZSBwZXItZnJhbWUgdGljayBpbnN0ZWFkIG9mIG9uZSB0aWNrIHBlciBldmVudC4KICBsZXQgbW1UaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IHVwZFRpY2tTY2hlZHVsZWQgPSBmYWxzZTsKICAvLyBUcnVlIHdoZW4gZ2xvYmFsIGxpc3RlbmVycyBhcmUgY3VycmVudGx5IGF0dGFjaGVkLiBSZWZlcmVuY2UtY291bnRlZAogIC8vIGJ5IGBvdmVybGF5cy5zaXplYCBzbyB3ZSBvbmx5IGxpc3RlbiB3aGlsZSBhdCBsZWFzdCBvbmUgb3ZlcmxheSBpcyBsaXZlLgogIGxldCBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gX21tVGljaygpIHsKICAgIG1tVGlja1NjaGVkdWxlZCA9IGZhbHNlOwogICAgY29uc3QgeCA9IG1tWCwgeSA9IG1tWTsKICAgIC8vIEl0ZXJhdGUgb25seSB0aGUgdmlzaWJsZSBzdWJzZXQ7IG9mZi1zY3JlZW4gdmlkZW9zIGNhbid0IGJlIGhvdmVyZWQuCiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC5oYW5kbGVQb2ludGVyKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX29uRG9jTW91c2VNb3ZlKGUpIHsKICAgIG1tWCA9IGUuY2xpZW50WDsKICAgIG1tWSA9IGUuY2xpZW50WTsKICAgIGlmIChtbVRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIG1tVGlja1NjaGVkdWxlZCA9IHRydWU7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX21tVGljayk7CiAgfQogIGZ1bmN0aW9uIF9vbkRvY1RvdWNoU3RhcnQoZSkgewogICAgY29uc3QgdCA9IChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB8fCAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKTsKICAgIGlmICghdCkgcmV0dXJuOwogICAgY29uc3QgeCA9IHQuY2xpZW50WCwgeSA9IHQuY2xpZW50WTsKICAgIHZpc2libGVPdmVybGF5cy5mb3JFYWNoKChpbnN0KSA9PiBpbnN0LmhhbmRsZVRvdWNoKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX3NjaGVkdWxlVXBkYXRlQWxsKCkgewogICAgaWYgKHVwZFRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIHVwZFRpY2tTY2hlZHVsZWQgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF91cGRhdGVBbGxUaWNrKTsKICB9CiAgZnVuY3Rpb24gX3VwZGF0ZUFsbFRpY2soKSB7CiAgICB1cGRUaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC51cGRhdGUoKSk7CiAgfQoKICBmdW5jdGlvbiBhcm1HbG9iYWxzKCkgewogICAgaWYgKGdsb2JhbHNBcm1lZCkgcmV0dXJuOwogICAgZ2xvYmFsc0FybWVkID0gdHJ1ZTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIGFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlRGlzYXJtR2xvYmFscygpIHsKICAgIGlmICghZ2xvYmFsc0FybWVkIHx8IG92ZXJsYXlzLnNpemUgPiAwKSByZXR1cm47CiAgICBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICAvLyBUZWFyIGRvd24gdGhlIEludGVyc2VjdGlvbk9ic2VydmVyIHRvbyDigJQgaXQncyB0aWVkIHRvIHRoZSBzYW1lCiAgICAvLyBvdmVybGF5IGxpZmVjeWNsZSBhcyB0aGUgZ2xvYmFsIGxpc3RlbmVycy4gUmUtY3JlYXRlZCBsYXppbHkgYnkKICAgIC8vIGdldElPKCkgaWYgYSBmdXR1cmUgb3ZlcmxheSByZWdpc3RlcnMuCiAgICBpZiAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHsKICAgICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICBpbnRlcnNlY3Rpb25PYnNlcnZlciA9IG51bGw7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDYXBhYmlsaXR5ICsgZW52aXJvbm1lbnQgZGV0ZWN0aW9uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBpUCBhdmFpbGFiaWxpdHkgYWNyb3NzIGJyb3dzZXJzOgogIC8vICAgSEFTX1NUQU5EQVJEX1BJUCDigJQgYHJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlYCAoQ2hyb21pdW0gLyBGaXJlZm94IC8gaU9TIDE0KykuCiAgLy8gICBIQVNfV0VCS0lUX1BJUCAgIOKAlCBvbGRlciBpT1MgU2FmYXJpJ3MgYHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGVgLgogIC8vIFRoZSBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbmVpdGhlciBpcyBwcmVzZW50LgogIGNvbnN0IEhBU19TVEFOREFSRF9QSVAgPSAhIWRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbmFibGVkOwogIGNvbnN0IEhBU19XRUJLSVRfUElQID0gIndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUiIGluIEhUTUxWaWRlb0VsZW1lbnQucHJvdG90eXBlOwogIGNvbnN0IFBJUF9TVVBQT1JURUQgPSBIQVNfU1RBTkRBUkRfUElQIHx8IEhBU19XRUJLSVRfUElQOwoKICAvLyBUb3VjaCBjYXBhYmlsaXR5IOKAlCBzd2l0Y2hlcyB0aGUgb3ZlcmxheSBmcm9tIGhvdmVyLWRyaXZlbiB0bwogIC8vIHRhcC10by1yZXZlYWwgb24gaU9TIC8gQW5kcm9pZC4KICBjb25zdCBJU19UT1VDSCA9ICJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwOwoKICAvLyBDb21iaW5lZCBmdWxsc2NyZWVuIGNoZWNrIGFjcm9zcyB0aGUgdGhyZWUgdmVuZG9yIHZhcmlhbnRzOgogIC8vICAgLSBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAgICAgICAoc3RhbmRhcmQpCiAgLy8gICAtIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IChvbGRlciBDaHJvbWl1bSAvIFNhZmFyaSBkZXNrdG9wKQogIC8vICAgLSB2aWRlby53ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbiAoaU9TIG5hdGl2ZSB2aWRlbyBmdWxsc2NyZWVuLAogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggbmV2ZXIgc2V0cyBkb2N1bWVudC4qKQogIGZ1bmN0aW9uIGlzRnVsbHNjcmVlbih2aWRlbykgewogICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICBpZiAodmlkZW8gJiYgdmlkZW8ud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW4pIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gQ29uc29sZSBvdXRwdXQuIGBsb2dgIGZvciBvbmUtbGluZSBzdWNjZXNzIG1lc3NhZ2VzIG9uIGluamVjdGlvbiwKICAvLyBgd2FybmAgZm9yIGZhaWx1cmVzIChrZXB0IHF1aWV0IGJ5IGRlZmF1bHQpLgogIGNvbnN0IFRBRyA9ICJbYnJhdmUtYXV0by1waXAgIiArIFZFUlNJT04gKyAiXSI7CiAgY29uc3QgbG9nID0gKC4uLmEpID0+IGNvbnNvbGUubG9nKFRBRywgLi4uYSk7CiAgY29uc3Qgd2FybiA9ICguLi5hKSA9PiBjb25zb2xlLndhcm4oVEFHLCAuLi5hKTsKCiAgLy8gUGljayB0aGUgYmVzdCA8dmlkZW8+IGZvciBhbiBhdXRvLVBpUCBpbnRlbnQgZmlyZWQgYnkgdGhlIE9TIC8KICAvLyBicm93c2VyLiBVc2VkIGJ5IHRoZSBnbG9iYWwgYG1lZGlhU2Vzc2lvbmAgYWN0aW9uIGhhbmRsZXIgc28gdGhlCiAgLy8gKmxhc3QqIHJlZ2lzdGVyZWQgdmlkZW8gZG9lc24ndCBnZXQgUGlQJ2QgYnkgZGVmYXVsdCDigJQgc2VlIGNvbW1lbnQKICAvLyBhdCB0aGUgcmVnaXN0cmF0aW9uIHNpdGUgZm9yIHRoZSBZb3VUdWJlIGJsYWNrLXNjcmVlbiByYXRpb25hbGUuCiAgZnVuY3Rpb24gcGlja0F1dG9QaXBUYXJnZXQoKSB7CiAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHJldHVybiBkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudDsKICAgIGNvbnN0IHZpZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgIGxldCBiZXN0UGxheWluZyA9IG51bGwsIGJlc3RQbGF5aW5nQXJlYSA9IDA7CiAgICBsZXQgYmVzdFJlYWR5ID0gbnVsbCwgYmVzdFJlYWR5QXJlYSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZHMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgdiA9IHZpZHNbaV07CiAgICAgIGlmICh2LmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKSBjb250aW51ZTsKICAgICAgY29uc3QgciA9IHYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGEgPSBNYXRoLm1heCgwLCByLndpZHRoKSAqIE1hdGgubWF4KDAsIHIuaGVpZ2h0KTsKICAgICAgaWYgKGEgPD0gMCkgY29udGludWU7CiAgICAgIGlmICghdi5wYXVzZWQgJiYgIXYuZW5kZWQgJiYgdi5yZWFkeVN0YXRlID49IDIgJiYgYSA+IGJlc3RQbGF5aW5nQXJlYSkgewogICAgICAgIGJlc3RQbGF5aW5nID0gdjsgYmVzdFBsYXlpbmdBcmVhID0gYTsKICAgICAgfQogICAgICBpZiAodi5yZWFkeVN0YXRlID49IDEgJiYgYSA+IGJlc3RSZWFkeUFyZWEpIHsKICAgICAgICBiZXN0UmVhZHkgPSB2OyBiZXN0UmVhZHlBcmVhID0gYTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJlc3RQbGF5aW5nIHx8IGJlc3RSZWFkeTsKICB9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFBpUCBpY29uIGZhY3RvcnkKICAvLwogIC8vIEJ1aWx0IHdpdGggY3JlYXRlRWxlbWVudE5TIGluc3RlYWQgb2YgaW5uZXJIVE1MIHRvIGF2b2lkIFRydXN0ZWRUeXBlcwogIC8vIC8gQ1NQIGByZXF1aXJlVHJ1c3RlZFR5cGVzRm9yICdzY3JpcHQnYCB2aW9sYXRpb25zIG9uIFlvdVR1YmUgZXRjLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERlZmVuc2UtaW4tZGVwdGggaGVscGVyIHVzZWQgd2hlbiBjbG9uaW5nIHRoaXJkLXBhcnR5IHdyYXBwZXIKICAvLyBlbGVtZW50cyAoTmV0ZmxpeCdzIC5tZWRpdW0gaWNvbiB3cmFwcGVyLCBUd2l0Y2gncyByaWdodC1jb250cm9scwogIC8vIHdyYXBwZXIpLiBjbG9uZU5vZGUoZmFsc2UpIGNhcnJpZXMgZm9yd2FyZCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMKICAvLyBhbmQgdGhlIGBzdHlsZWAgYXR0cmlidXRlIOKAlCB3ZSBzdHJpcDoKICAvLyAgIC0gYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIGBvbipgICh3b3VsZCByZS1maXJlIHRoZSBzaXRlJ3MKICAvLyAgICAgaW5saW5lIGV2ZW50IGhhbmRsZXJzIG9uIG91ciBjbG9uZSksIGFuZAogIC8vICAgLSB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgaXRzZWxmIChjb3VsZCBjYXJyeSBhIGB1cmwoLi4uKWAgdG9rZW4KICAvLyAgICAgdGhhdCB0cmlnZ2VycyBhIG5ldHdvcmsgZmV0Y2ggd2hlbiB0aGUgY2xvbmUgaXMgcGFyZW50ZWQpLCBhbmQKICAvLyAgIC0gdGhlIGBpZGAgYXR0cmlidXRlIChjbG9uaW5nIHByb2R1Y2VzIGEgZHVwbGljYXRlLCB3aGljaCB3b3VsZAogIC8vICAgICBicmVhayB0aGUgc2l0ZSdzIG93biBnZXRFbGVtZW50QnlJZCAvIENTUyAjaWQgc2VsZWN0b3JzKS4KICAvLyBXZSByZWx5IG9uIHRoZSBjbG9uZWQgZWxlbWVudCdzIGNsYXNzIGxpc3QgZm9yIHNpemluZy9zcGFjaW5nLAogIC8vIHdoaWNoIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHZpYSB0aGUgc2l0ZSdzIGV4dGVybmFsIHN0eWxlc2hlZXQuCiAgZnVuY3Rpb24gc3RyaXBJbmxpbmVIYW5kbGVycyhlbCkgewogICAgY29uc3QgYXR0cnMgPSBlbC5hdHRyaWJ1dGVzOwogICAgZm9yIChsZXQgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBhdHRyc1tpXS5uYW1lOwogICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJvbiIpIHx8IG5hbWUgPT09ICJzdHlsZSIgfHwgbmFtZSA9PT0gImlkIikgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogIH0KCiAgY29uc3QgUElQX1NWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgZnVuY3Rpb24gbWFrZVBpcFN2ZyhzaXplKSB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoUElQX1NWR19OUywgInN2ZyIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgidmlld0JveCIsICIwIDAgMjQgMjQiKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgc2l6ZSk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBzaXplKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgImN1cnJlbnRDb2xvciIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjIiKTsKICAgIGNvbnN0IHIxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMS5zZXRBdHRyaWJ1dGUoIngiLCAiMyIpOyByMS5zZXRBdHRyaWJ1dGUoInkiLCAiNSIpOwogICAgcjEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsICIxOCIpOyByMS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsICIxNCIpOyByMS5zZXRBdHRyaWJ1dGUoInJ4IiwgIjIiKTsKICAgIGNvbnN0IHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIngiLCAiMTIiKTsgcjIuc2V0QXR0cmlidXRlKCJ5IiwgIjExIik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgIjciKTsgcjIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCAiNiIpOyByMi5zZXRBdHRyaWJ1dGUoInJ4IiwgIjEiKTsKICAgIHIyLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJjdXJyZW50Q29sb3IiKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChyMSk7IHN2Zy5hcHBlbmRDaGlsZChyMik7CiAgICByZXR1cm4gc3ZnOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGlQIHRvZ2dsZSBlbnRyeSBwb2ludAogIC8vCiAgLy8gU2luZ2xlIGFzeW5jIGZ1bmN0aW9uIHNoYXJlZCBieSBldmVyeSBjbGljayBoYW5kbGVyLiBXYWxrcyB0aGUKICAvLyBhdmFpbGFibGUgQVBJcyBpbiBwcmlvcml0eSBvcmRlciBhbmQgaXMgcm9idXN0IHRvIGEgY2xpY2sgdGhhdCBsYW5kcwogIC8vIGJlZm9yZSB0aGUgdmlkZW8gaGFzIGxvYWRlZCBlbm91Z2ggbWV0YWRhdGEgKHdhaXRzIHVwIHRvIDMgcykuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlUGlwKHZpZGVvKSB7CiAgICB0cnkgewogICAgICAvLyBpT1MgU2FmYXJpIHBhdGgg4oCUIHdlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUgdG9nZ2xlcyBiZXR3ZWVuCiAgICAgIC8vICJpbmxpbmUiLCAicGljdHVyZS1pbi1waWN0dXJlIiBhbmQgImZ1bGxzY3JlZW4iLgogICAgICBpZiAoIUhBU19TVEFOREFSRF9QSVAgJiYgSEFTX1dFQktJVF9QSVAgJiYKICAgICAgICAgIHR5cGVvZiB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdmlkZW8ud2Via2l0UHJlc2VudGF0aW9uTW9kZSA9PT0gInBpY3R1cmUtaW4tcGljdHVyZSIKICAgICAgICAgID8gImlubGluZSIgOiAicGljdHVyZS1pbi1waWN0dXJlIjsKICAgICAgICB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlKHRhcmdldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIFN0YW5kYXJkIEFQSSBwYXRoLgogICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQgPT09IHZpZGVvKSB7CiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZXhpdFBpY3R1cmVJblBpY3R1cmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCAxKSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7IHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSk7IHJlc29sdmUoKTsgfTsKICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgc2V0VGltZW91dChkb25lLCBDT05GSUcuTUVUQURBVEFfV0FJVF9NUyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB2aWRlby5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGF3YWl0IHZpZGVvLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIExhc3QtcmVzb3J0IGlPUyBmYWxsYmFjayBldmVuIGlmIEhBU19TVEFOREFSRF9QSVAgd2FzIGNsYWltZWQuCiAgICAgIGlmICh0eXBlb2YgdmlkZW8ud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUoInBpY3R1cmUtaW4tcGljdHVyZSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB3YXJuKCJQaVAgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTsKICAgIH0gY2F0Y2ggKGVycikgeyB3YXJuKCJQaVAgcmVxdWVzdCBmYWlsZWQ6IiwgZXJyLm1lc3NhZ2UgfHwgZXJyKTsgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gU2l0ZS1zcGVjaWZpYyBuYXRpdmUgaW5qZWN0b3JzCiAgLy8KICAvLyBFYWNoIGluamVjdG9yIGlzIGlkZW1wb3RlbnQgKHNhZmUgdG8gcmUtcnVuIHdoZW4gdGhlIHNpdGUncyBSZWFjdAogIC8vIHJvb3QgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIpIGFuZCByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAvIGZhbHNlCiAgLy8gd2hlbiB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpc24ndCBpbiB0aGUgRE9NIHlldC4gVGhleSdyZSBkcml2ZW4gYnkKICAvLyBhIHBlcnNpc3RlbnQgTXV0YXRpb25PYnNlcnZlciBpbiBgdHJ5TmF0aXZlKClgIHNvIHJlLXJlbmRlcnMgZG9uJ3QKICAvLyBwZXJtYW5lbnRseSBsb3NlIHRoZSBidXR0b24uCiAgLy8KICAvLyBTdHJhdGVneSBhY3Jvc3Mgc2l0ZXM6CiAgLy8gICAtIFlvdVR1YmU6IGluc2VydCBhIDxidXR0b24gY2xhc3M9Inl0cC1idXR0b24iPiBhbG9uZ3NpZGUgdGhlCiAgLy8gICAgIGV4aXN0aW5nIHNldHRpbmdzL21pbmlwbGF5ZXIvc2l6ZSBpY29ucy4gSW5oZXJpdHMgWW91VHViZSdzCiAgLy8gICAgIGF1dG8tZmFkZSAvIGhvdmVyIGJlaGF2aW91ciBmb3IgZnJlZS4KICAvLyAgIC0gVHdpdGNoOiBjbG9uZSB0aGUgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgcmlnaHQtc2lkZSBjb250cm9sCiAgLy8gICAgIGJ1dHRvbiAoc2V0dGluZ3MvZnVsbHNjcmVlbi90aGVhdHJlKSBhbmQgcGxhY2Ugb3VyIGJ1dHRvbiBpbnNpZGUsCiAgLy8gICAgIHNvIHdlIGluaGVyaXQgVHdpdGNoJ3MgZmxleCBzcGFjaW5nIGNsYXNzZXMuCiAgLy8gICAtIE5ldGZsaXg6IGNsb25lIHRoZSAubWVkaXVtIGljb24gd3JhcHBlciAqYW5kKiB0aGUgM3JlbSBzcGFjZXIKICAvLyAgICAgdGhhdCBzaXRzIGJldHdlZW4gc2libGluZ3MsIHNvIHRoZSByaHl0aG0gb2YgdGhlIGljb24gcm93IGlzCiAgLy8gICAgIHByZXNlcnZlZCBhbmQgZnVsbHNjcmVlbiBzdGF5cyBpbiBpdHMgcm93LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGFkZFlvdVR1YmVCdXR0b24odmlkZW8pIHsKICAgIGlmIChfc2l0ZURpc2FibGVkKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCByaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi55dHAtcmlnaHQtY29udHJvbHMiKTsKICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTsKICAgIGlmIChyaWdodC5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgYnRuLmNsYXNzTmFtZSA9ICJ5dHAtYnV0dG9uIGJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjp0b3A7Y29sb3I6I2ZmZjsiOwogICAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDM2KTsKICAgICAgc3ZnLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTpibG9jazsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwoKICAgICAgY29uc3QgYW5jaG9yID0gcmlnaHQucXVlcnlTZWxlY3RvcigiLnl0cC1taW5pcGxheWVyLWJ1dHRvbiwgLnl0cC1zZXR0aW5ncy1idXR0b24sIC55dHAtc2l6ZS1idXR0b24iKTsKICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IucGFyZW50Tm9kZSkgewogICAgICAgIGFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShidG4sIGFuY2hvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmlnaHQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgfQogICAgICBsb2coImluamVjdGVkIG9uIFlvdVR1YmUiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgd2FybigiWW91VHViZSBpbmplY3QgZmFpbGVkOiIsIGVyci5tZXNzYWdlIHx8IGVycik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIFR3aXRjaDogY2xvbmUgdGhlIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHJpZ2h0LXNpZGUgY29udHJvbCBidXR0b24KICAvLyAoc2V0dGluZ3Mgb3IgZnVsbHNjcmVlbikgYW5kIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUgaXQsIHRoZW4gaW5zZXJ0IGF0CiAgLy8gdGhlIHNhbWUgRE9NIGxldmVsIHNvIHNwYWNpbmcvc2l6aW5nIG1hdGNoLgogIGxldCB0d2l0Y2hJbmplY3RDb3VudCA9IDA7CiAgZnVuY3Rpb24gYWRkVHdpdGNoQnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgLy8gQW5jaG9yIG9uIHRoZSBmdWxsc2NyZWVuIC8gdGhlYXRyZSByb3cgc28gd2UgbGFuZCBhbG9uZ3NpZGUgY2FzdCwKICAgIC8vIHRoZWF0cmUgYW5kIGZ1bGxzY3JlZW4g4oCUIHNldHRpbmdzIG9mdGVuIGxpdmVzIGluIGEgc2VwYXJhdGUgcm93IGluCiAgICAvLyB0aGUgcG9wb3V0IHBsYXllciBsYXlvdXQuCiAgICBjb25zdCBQRUVSX1NFTCA9CiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWZ1bGxzY3JlZW4tYnV0dG9uIl0sJyArCiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLXRoZWF0cmUtbW9kZS1idXR0b24iXSwnICsKICAgICAgJ1tkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItc2V0dGluZ3MtYnV0dG9uIl0nOwogICAgY29uc3QgYW5jaG9yQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihQRUVSX1NFTCk7CiAgICBpZiAoIWFuY2hvckJ0bikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFdhbGsgdXAgdG8gdGhlIHJvdyBjb250YWluZXIuIFR3byBzdG9wIHNpZ25hbHMsIGluIHByaW9yaXR5IG9yZGVyOgogICAgLy8gICAxLiBTdHJvbmc6IGEgcGFyZW50IHRoYXQgaGFzIG11bHRpcGxlIGNoaWxkcmVuIEFORCBjb250YWlucyBhCiAgICAvLyAgICAgIHBlZXIgY29udHJvbCBvdXRzaWRlIG91ciBjdXJyZW50IHN1YnRyZWUg4oCUIHRoYXQncyBhbG1vc3QKICAgIC8vICAgICAgY2VydGFpbmx5IHRoZSBhY3R1YWwgY29udHJvbCByb3cuCiAgICAvLyAgIDIuIFdlYWsgKGZhbGxiYWNrKTogdGhlIGZpcnN0IHBhcmVudCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuIHdlCiAgICAvLyAgICAgIHBhc3NlZCBkdXJpbmcgdGhlIHdhbGsuIFVzZWQgd2hlbiB0aGUgc3Ryb25nIHNpZ25hbCBuZXZlcgogICAgLy8gICAgICBmaXJlcywgc28gbGF5b3V0cyB0aGF0IGRvbid0IGV4cG9zZSBwZWVyIGNvbnRyb2xzIGF0IHRoZQogICAgLy8gICAgICBzYW1lIGxldmVsIHN0aWxsIHdvcmsuCiAgICAvLyBDb21iaW5lZCwgdGhpcyBhZGRyZXNzZXMgdGhlIHJldmlldyBjb25jZXJuIGFib3V0IG5vbi1jb250cm9sCiAgICAvLyBzaWJsaW5ncyBoaWphY2tpbmcgdGhlIHN0cnVjdHVyYWwgd2FsayB3aGlsZSBrZWVwaW5nIHRoZSBvcmlnaW5hbAogICAgLy8gYmVoYXZpb3VyIGFzIGEgc2FmZXR5IG5ldC4KICAgIGxldCBhbmNob3JXcmFwcGVyID0gYW5jaG9yQnRuOwogICAgbGV0IHN0cnVjdHVyYWxGYWxsYmFjayA9IG51bGw7CiAgICB3aGlsZSAoYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlICYmIGFuY2hvcldyYXBwZXIucGFyZW50Tm9kZS50YWdOYW1lICE9PSAiQk9EWSIpIHsKICAgICAgY29uc3QgcGFyZW50ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50LmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgICBjb25zdCBwZWVycyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFBFRVJfU0VMKTsKICAgICAgICBsZXQgaGFzT3V0c2lkZVBlZXIgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIWFuY2hvcldyYXBwZXIuY29udGFpbnMocGVlcnNbaV0pKSB7IGhhc091dHNpZGVQZWVyID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc091dHNpZGVQZWVyKSBicmVhazsKICAgICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgc3RydWN0dXJhbEZhbGxiYWNrID0gYW5jaG9yV3JhcHBlcjsKICAgICAgfQogICAgICBhbmNob3JXcmFwcGVyID0gcGFyZW50OwogICAgfQogICAgaWYgKCFhbmNob3JXcmFwcGVyLnBhcmVudE5vZGUgfHwgYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlLnRhZ05hbWUgPT09ICJCT0RZIikgewogICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgcmV0dXJuIGZhbHNlOwogICAgICBhbmNob3JXcmFwcGVyID0gc3RydWN0dXJhbEZhbGxiYWNrOwogICAgfQogICAgY29uc3Qgcm93ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKICAgIGlmIChyb3cucXVlcnlTZWxlY3RvcigiLmJyYXZlLXBpcC1idG4iKSkgcmV0dXJuIHRydWU7CiAgICAvLyBTYW5pdHkgY2hlY2s6IGEgaGVhbHRoeSBUd2l0Y2ggcmlnaHQtY29udHJvbHMgcm93IGNvbnRhaW5zIGF0CiAgICAvLyBsZWFzdCB0d28gb2YgdGhlIHBlZXIgYnV0dG9ucyAoc2V0dGluZ3MgKyB0aGVhdHJlICsgZnVsbHNjcmVlbikuCiAgICAvLyBJZiBvbmx5IG9uZSBpcyBwcmVzZW50LCB0aGUgd2FsayBsYW5kZWQgb24gYSBkZWdlbmVyYXRlIHJvdwogICAgLy8gKHBvcG91dCAvIGRldGFjaGVkIHBsYXllciAvIGZ1dHVyZSByZWRlc2lnbikgYW5kIHdlIHNob3VsZCBiYWlsCiAgICAvLyByYXRoZXIgdGhhbiBtaXMtdGFyZ2V0LiBDaGVhcCDigJQgb25lIHF1ZXJ5U2VsZWN0b3JBbGwsIG5vIHdhbGtpbmcuCiAgICBpZiAocm93LnF1ZXJ5U2VsZWN0b3JBbGwoUEVFUl9TRUwpLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTsKCiAgICB0cnkgewogICAgICAvLyBDbG9uZSB0aGUgYW5jaG9yJ3Mgb3V0ZXIgd3JhcHBlciAoc2hhbGxvdykgc28gd2UgaW5oZXJpdCBUd2l0Y2gncwogICAgICAvLyBzcGFjaW5nL2ZsZXggY2xhc3NlcywgdGhlbiBkcm9wIG91ciBvd24gYnV0dG9uIGluc2lkZS4KICAgICAgY29uc3Qgd3JhcHBlciA9IGFuY2hvcldyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hLXRhcmdldCIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpOwogICAgICBzdHJpcElubGluZUhhbmRsZXJzKHdyYXBwZXIpOwoKICAgICAgLy8gU2l6ZSBmcm9tIHRoZSByZW5kZXJlZCBTVkcgZ2x5cGggKHZpc3VhbGx5IGFjY3VyYXRlKS4gRmxvb3IgYXQgMjQKICAgICAgLy8gYmVjYXVzZSBUd2l0Y2gncyB1bmRlcmx5aW5nIFNWRyBlbGVtZW50IGlzIHNvbWV0aW1lcyBzbWFsbGVyIHRoYW4KICAgICAgLy8gdGhlIHZpc3VhbCBpY29uIChDU1Mgc2NhbGVzIGl0IHVwKS4KICAgICAgY29uc3QgcmVmU3ZnID0gYW5jaG9yQnRuLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpOwogICAgICBjb25zdCByZWZTdmdSZWN0ID0gcmVmU3ZnID8gcmVmU3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDsKICAgICAgY29uc3QgcmVmQnRuUmVjdCA9IGFuY2hvckJ0bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgbWVhc3VyZWQgPSByZWZTdmdSZWN0ICYmIHJlZlN2Z1JlY3Qud2lkdGggPiAwCiAgICAgICAgPyBNYXRoLm1pbihyZWZTdmdSZWN0LndpZHRoLCByZWZTdmdSZWN0LmhlaWdodCkKICAgICAgICA6IE1hdGgubWluKHJlZkJ0blJlY3Qud2lkdGgsIHJlZkJ0blJlY3QuaGVpZ2h0KSAqIDAuNzsKICAgICAgY29uc3QgaWNvblNpemUgPSBNYXRoLm1heCgyNCwgTWF0aC5yb3VuZChtZWFzdXJlZCkpOwogICAgICBjb25zdCBib3hTaXplID0gTWF0aC5tYXgoMzAsIE1hdGgucm91bmQocmVmQnRuUmVjdC53aWR0aCB8fCAzMCkpOwoKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgIGJ0bi5jbGFzc05hbWUgPSAiYnJhdmUtcGlwLWJ0biI7CiAgICAgIGJ0bi50eXBlID0gImJ1dHRvbiI7CiAgICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgICBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlBpY3R1cmUtaW4tUGljdHVyZSIpOwogICAgICBidG4uc3R5bGUuY3NzVGV4dCA9CiAgICAgICAgImJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7cGFkZGluZzowO21hcmdpbjowOyIgKwogICAgICAgICJjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyIgKwogICAgICAgICJ3aWR0aDoiICsgYm94U2l6ZSArICJweDtoZWlnaHQ6IiArIGJveFNpemUgKyAicHg7IjsKICAgICAgY29uc3Qgc3ZnID0gbWFrZVBpcFN2ZyhpY29uU2l6ZSk7CiAgICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7Y29sb3I6I2ZmZjsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwogICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGJ0bik7CgogICAgICByb3cuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIGFuY2hvcldyYXBwZXIpOwoKICAgICAgdHdpdGNoSW5qZWN0Q291bnQrKzsKICAgICAgaWYgKHR3aXRjaEluamVjdENvdW50ID09PSAxKSBsb2coImluamVjdGVkIG9uIFR3aXRjaCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICB3YXJuKCJUd2l0Y2ggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyBOZXRmbGl4OiBpbnNlcnQgaW50byB0aGUgc3RhbmRhcmQgY29udHJvbHMgYmFyLCBiZWZvcmUgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uLgogIC8vIE5ldGZsaXggcmFuZG9taXplcyBjbGFzcyBuYW1lcyBidXQgaWNvbnMgZm9sbG93IGEgY29uc2lzdGVudCBwYXR0ZXJuOgogIC8vICAgPGZsZXgtcm93PgogIC8vICAgICA8c3BhY2VyIC4xbnBxeXdyPiAuLi4gPHdyYXBwZXIgLm1lZGl1bT4gPGljb24tYnV0dG9uPiA8L3dyYXBwZXI+CiAgLy8gICAgIDxzcGFjZXIgLjFucHF5d3I+ICAgICA8d3JhcHBlciAubWVkaXVtPiA8aWNvbi1idXR0b24+IDwvd3JhcHBlcj4KICAvLyAgICAgPHNwYWNlciAuMW5wcXl3cj4gICAgIDx3cmFwcGVyIC5tZWRpdW0+IDxpY29uLWJ1dHRvbiBkYXRhLXVpYT0iY29udHJvbC1mdWxsc2NyZWVuLS4uLiI+IDwvd3JhcHBlcj4KICAvLyBXZSBjbG9uZSB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyIChhbmQgdGhlIHNwYWNlciBpbiBmcm9udCBvZiBpdCkgc28gb3VyCiAgLy8gYnV0dG9uIGdldHMgdGhlIHNhbWUgc3R5bGluZyBhbmQgcmh5dGhtIGFzIG5hdGl2ZSBpY29ucy4KICBsZXQgbmZseEluamVjdENvdW50ID0gMDsKICBmdW5jdGlvbiBhZGROZXRmbGl4QnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJyk7CiAgICBpZiAoIWJhcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGJhci5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBmcyA9IGJhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1lbnRlciJdLCBbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1leGl0Il0nKTsKICAgICAgaWYgKCFmcykgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRmluZCBOZXRmbGl4J3MgaWNvbiB3cmFwcGVyIGFyb3VuZCBmdWxsc2NyZWVuIOKAlCB0aGUgLm1lZGl1bSBjbGFzcwogICAgICAvLyBpcyB0aGUgc3RhYmxlIHNpZ25hbDsgZmFsbCBiYWNrIHRvIHRoZSBjbG9zZXN0IGRpdi4KICAgICAgY29uc3QgZnNXcmFwcGVyID0gZnMuY2xvc2VzdCgiLm1lZGl1bSIpIHx8IGZzLmNsb3Nlc3QoImRpdiIpIHx8IGZzOwogICAgICBjb25zdCByb3cgPSBmc1dyYXBwZXIucGFyZW50Tm9kZTsKICAgICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFNpemUgZnJvbSB0aGUgaW5uZXIgc3ZnIG9mIGZ1bGxzY3JlZW4ncyBidXR0b24gc28gd2UgdmlzdWFsbHkgbWF0Y2guCiAgICAgIGNvbnN0IHJlZlN2ZyA9IGZzLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpIHx8IChmcy5jbG9zZXN0KCJidXR0b24iKSB8fCBmcykucXVlcnlTZWxlY3Rvcigic3ZnIik7CiAgICAgIGNvbnN0IHJlZlN2Z1JlY3QgPSByZWZTdmcgPyByZWZTdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsOwogICAgICBjb25zdCBpY29uU2l6ZSA9IHJlZlN2Z1JlY3QgJiYgcmVmU3ZnUmVjdC53aWR0aCA+IDAKICAgICAgICA/IE1hdGgucm91bmQoTWF0aC5taW4ocmVmU3ZnUmVjdC53aWR0aCwgcmVmU3ZnUmVjdC5oZWlnaHQpKQogICAgICAgIDogMjg7CgogICAgICAvLyBDbG9uZSB0aGUgd3JhcHBlciAoc2hhbGxvdyDigJQgcHJlc2VydmVzIGNsYXNzZXMvaW5saW5lIHN0eWxlcykgYW5kCiAgICAgIC8vIGVtcHR5IGl0LCB0aGVuIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUuCiAgICAgIGNvbnN0IHdyYXBwZXIgPSBmc1dyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS11aWEiKTsKICAgICAgc3RyaXBJbmxpbmVIYW5kbGVycyh3cmFwcGVyKTsKCiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidG4uY2xhc3NOYW1lID0gImJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPQogICAgICAgICJiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO3BhZGRpbmc6MDttYXJnaW46MDsiICsKICAgICAgICAid2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyI7CiAgICAgIGNvbnN0IHN2ZyA9IG1ha2VQaXBTdmcoaWNvblNpemUpOwogICAgICBzdmcuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OmJsb2NrOyI7CiAgICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZVBpcCh2aWRlbyk7IH0pOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBfb25OYXRpdmVCdG5Db250ZXh0TWVudSk7CiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYnRuKTsKCiAgICAgIC8vIENsb25lIHRoZSBzcGFjZXIgdGhhdCBwcmVjZWRlcyB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyLCBzbyBzcGFjaW5nCiAgICAgIC8vIGJldHdlZW4gb3VyIGJ1dHRvbiBhbmQgZnVsbHNjcmVlbiBtYXRjaGVzIHRoZSByaHl0aG0gYmV0d2VlbgogICAgICAvLyBleGlzdGluZyBpY29ucy4KICAgICAgY29uc3QgcHJldlNwYWNlciA9IGZzV3JhcHBlci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwogICAgICBjb25zdCBzcGFjZXJDbG9uZSA9IChwcmV2U3BhY2VyICYmIHByZXZTcGFjZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKQogICAgICAgID8gcHJldlNwYWNlci5jbG9uZU5vZGUoZmFsc2UpCiAgICAgICAgOiBudWxsOwoKICAgICAgcm93Lmluc2VydEJlZm9yZSh3cmFwcGVyLCBmc1dyYXBwZXIpOwogICAgICBpZiAoc3BhY2VyQ2xvbmUpIHJvdy5pbnNlcnRCZWZvcmUoc3BhY2VyQ2xvbmUsIGZzV3JhcHBlcik7CgogICAgICBuZmx4SW5qZWN0Q291bnQrKzsKICAgICAgaWYgKG5mbHhJbmplY3RDb3VudCA9PT0gMSkgbG9nKCJpbmplY3RlZCBvbiBOZXRmbGl4Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHdhcm4oIk5ldGZsaXggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBHZW5lcmljIEZpcmVmb3gtc3R5bGUgb3ZlcmxheQogIC8vCiAgLy8gVXNlZCBvbiBldmVyeSBzaXRlIGJ5IGRlZmF1bHQgKHVubGVzcyBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAgaXMKICAvLyBleHBsaWNpdGx5IHNldCB0byAiMCIpLiBNaW1pY3MgRmlyZWZveCdzICJQb3Agb3V0IHRoaXMgdmlkZW8iIHRvZ2dsZToKICAvLyBhIGRhcmsgcGlsbCBhbmNob3JlZCBtaWQtcmlnaHQgb2YgdGhlIHZpZGVvIHRoYXQgZmFkZXMgaW4gb24gaG92ZXIKICAvLyBhbmQgZmFkZXMgb3V0IGFmdGVyIHRoZSBjdXJzb3IgbGVhdmVzLiBBZnRlciB0aGUgdXNlciBjbGlja3Mgb25jZSBpdAogIC8vIHNocmlua3MgdG8gaWNvbi1vbmx5IGZvciB0aGUgcmVzdCBvZiB0aGUgc2Vzc2lvbiDigJQgbGVzcyB2aXN1YWwgbm9pc2UKICAvLyBvbiBzdWJzZXF1ZW50IGhvdmVycy4KICAvLwogIC8vIEhvdmVyIGRldGVjdGlvbiBydW5zIHRocm91Z2ggdGhlIHNoYXJlZCBgX29uRG9jTW91c2VNb3ZlYCBoYW5kbGVyCiAgLy8gKHNlZSB0b3Agb2YgZmlsZSkgaW5zdGVhZCBvZiBgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIpYCwKICAvLyBiZWNhdXNlIG1hbnkgcGxheWVycyAoTmV0ZmxpeCwgY3VzdG9tKSBsYXllciB0aGVpciBVSSBvbiB0b3Agb2YgdGhlCiAgLy8gPHZpZGVvPiBhbmQgYWJzb3JiIG1vdXNlIGV2ZW50cyBiZWZvcmUgdGhleSByZWFjaCBpdC4gQSBnbG9iYWwKICAvLyBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIGJ5cGFzc2VzIHRoYXQuCiAgLy8KICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSBwaWxsIGlzIHRhcC10by1yZXZlYWwgKDMgcyBhdXRvLWZhZGUpIGluc3RlYWQuCiAgLy8KICAvLyBgdGVhcmRvd25zYCBpcyBhbiBhcnJheSB0aGUgY2FsbGVyIChgYXR0YWNoVG9WaWRlb2ApIGhhbmRzIGluOyB3ZQogIC8vIHB1c2ggY2xlYW51cCBjbG9zdXJlcyBvbnRvIGl0IHNvIGEgbGF0ZXIgY2xlYW51cCBvZiB0aGlzIHZpZGVvCiAgLy8gcmVsZWFzZXMgZXZlcnkgbGlzdGVuZXIgLyBvYnNlcnZlciAvIERPTSBub2RlIHdlIGNyZWF0ZWQgaGVyZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIFJlYWNoaW5nIGhlcmUgbWVhbnMgYGF0dGFjaFRvVmlkZW9gJ3MgYHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKWAKICAgIC8vIGd1YXJkIGFscmVhZHkgc2hvcnQtY2lyY3VpdGVkIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zLCBzbyBubwogICAgLy8gc2VwYXJhdGUgZGF0YXNldCBtYXJrZXIgaXMgbmVlZGVkLgogICAgLy8gUGVyLW9yaWdpbiBvcHQtb3V0OiBza2lwIGJ1aWxkaW5nIGFueXRoaW5nIGlmIHRoZSB1c2VyIHByZXZpb3VzbHkKICAgIC8vIGRpc2FibGVkIHRoZSBwaWxsIG9uIHRoaXMgc2l0ZSB2aWEgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuCiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuOwogICAgY29uc3QgUEFERElOR19GVUxMID0gIjhweCAxNHB4IDhweCAxMHB4IjsKICAgIGNvbnN0IFBBRERJTkdfSUNPTiA9ICI4cHgiOwoKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgYnRuLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0KICAgICAgInBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDsiICsKICAgICAgInBhZGRpbmc6IiArIFBBRERJTkdfRlVMTCArICI7IiArCiAgICAgICJib3JkZXI6MDtib3JkZXItcmFkaXVzOjhweDsiICsKICAgICAgImJhY2tncm91bmQ6cmdiYSgyOCwyOCwzMCwwLjkyKTtjb2xvcjojZmZmOyIgKwogICAgICAiZm9udDo2MDAgMTNweC8xIHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxzYW5zLXNlcmlmOyIgKwogICAgICAiY3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiYm94LXNoYWRvdzowIDJweCA4cHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAib3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAwLjE1cyBlYXNlOyIgKwogICAgICAicG9pbnRlci1ldmVudHM6YXV0bzt1c2VyLXNlbGVjdDpub25lOyI7CiAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDE4KTsKICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7IjsKICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICJQb3Agb3V0IHRoaXMgdmlkZW8iOwogICAgYnRuLmFwcGVuZENoaWxkKGxhYmVsKTsKCiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCAoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNob3dEaXNhYmxlTWVudShlLmNsaWVudFgsIGUuY2xpZW50WSk7CiAgICB9KTsKCiAgICBsZXQgY2xpY2tlZCA9IGZhbHNlOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBpZiAoIWNsaWNrZWQpIHsKICAgICAgICBjbGlja2VkID0gdHJ1ZTsKICAgICAgICAvLyBTdXBwcmVzcyBmYWRlIHNvIHRoZSBpY29uLW9ubHkgcGlsbCBpcyBpbiBpdHMgZmluYWwgcG9zaXRpb24KICAgICAgICAvLyBiZWZvcmUgdGhlIHVzZXIgbm90aWNlcyB0aGUgY2hhbmdlLgogICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gYnRuLnN0eWxlLnRyYW5zaXRpb247CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSAibm9uZSI7CiAgICAgICAgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9IFBBRERJTkdfSUNPTjsKICAgICAgICBidG4uc3R5bGUuZ2FwID0gIjAiOwogICAgICAgIHVwZGF0ZSgpOyAvLyBzeW5jaHJvbm91cyByZXBvc2l0aW9uIGZvciB0aGUgbmV3IChzbWFsbGVyKSBib3gKICAgICAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyB0aGUgbmV4dCBzdHlsZSBjaGFuZ2UgaXMgY29tbWl0dGVkIHdpdGhvdXQKICAgICAgICAvLyBhIHRyYW5zaXRpb24sIHRoZW4gcmVzdG9yZSB0aGUgZmFkZSB0cmFuc2l0aW9uLgogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMKICAgICAgICBidG4ub2Zmc2V0V2lkdGg7CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsKICAgICAgfQogICAgICB0b2dnbGVQaXAodmlkZW8pOwogICAgfSk7CiAgICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGJ0bik7CgogICAgbGV0IGhvdmVyID0gZmFsc2U7CiAgICBsZXQgaG92ZXJUaW1lciA9IG51bGw7CiAgICBsZXQgbGFzdFJlY3QgPSBudWxsOwogICAgbGV0IHRvdWNoSGlkZVRpbWVyID0gbnVsbDsKICAgIGZ1bmN0aW9uIHNldEhvdmVyKHYpIHsKICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICBpZiAodikgeyBob3ZlciA9IHRydWU7IHVwZGF0ZSgpOyB9CiAgICAgIGVsc2UgICB7IGhvdmVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgaG92ZXIgPSBmYWxzZTsgdXBkYXRlKCk7IH0sIENPTkZJRy5IT1ZFUl9HUkFDRV9NUyk7IH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0OwogICAgICBpZiAoIXIpIHJldHVybjsKICAgICAgY29uc3Qgb3ZlclZpZGVvID0KICAgICAgICB4ID49IHIubGVmdCAmJiB4IDw9IHIucmlnaHQgJiYKICAgICAgICB5ID49IHIudG9wICAmJiB5IDw9IHIuYm90dG9tOwogICAgICBsZXQgb3ZlckJ0biA9IGZhbHNlOwogICAgICBpZiAoYnRuLnN0eWxlLmRpc3BsYXkgIT09ICJub25lIikgewogICAgICAgIGNvbnN0IGJSZWN0ID0gYnRuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIG92ZXJCdG4gPQogICAgICAgICAgeCA+PSBiUmVjdC5sZWZ0ICYmIHggPD0gYlJlY3QucmlnaHQgJiYKICAgICAgICAgIHkgPj0gYlJlY3QudG9wICAmJiB5IDw9IGJSZWN0LmJvdHRvbTsKICAgICAgfQogICAgICBpZiAob3ZlclZpZGVvIHx8IG92ZXJCdG4pIHsgaWYgKCFob3Zlcikgc2V0SG92ZXIodHJ1ZSk7IH0KICAgICAgZWxzZSBpZiAoaG92ZXIpIHNldEhvdmVyKGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0IHx8IHZpZGVvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBsYXN0UmVjdCA9IHI7CiAgICAgIGNvbnN0IG92ZXJWaWRlbyA9CiAgICAgICAgeCA+PSByLmxlZnQgJiYgeCA8PSByLnJpZ2h0ICYmCiAgICAgICAgeSA+PSByLnRvcCAgJiYgeSA8PSByLmJvdHRvbTsKICAgICAgaWYgKCFvdmVyVmlkZW8pIHJldHVybjsKICAgICAgc2V0SG92ZXIodHJ1ZSk7CiAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgY2xlYXJUaW1lb3V0KHRvdWNoSGlkZVRpbWVyKTsKICAgICAgdG91Y2hIaWRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0b3VjaEhpZGVUaW1lciA9IG51bGw7CiAgICAgICAgc2V0SG92ZXIoZmFsc2UpOwogICAgICB9LCBDT05GSUcuVE9VQ0hfUkVWRUFMX01TKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgIC8vIE1hdGNoIEZpcmVmb3g6IHNob3cgb24gaG92ZXIgcmVnYXJkbGVzcyBvZiBwYXVzZWQgc3RhdGUuIE9ubHkKICAgICAgLy8gcmVxdWlyZSB0aGF0IHRoZSB2aWRlbyBoYXMgbWV0YWRhdGEgbG9hZGVkIChzbyBQaVAgaXMgdXNhYmxlKSwKICAgICAgLy8gaXMgdmlzaWJsZSwgYW5kIHdlJ3JlIG5vdCBpbiBmdWxsc2NyZWVuIChpbmNsLiBpT1Mgd2Via2l0IEZTKS4KICAgICAgLy8gQWxzbyBob25vdXIgYSBtaWQtc2Vzc2lvbiBkaXNhYmxlIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUKICAgICAgLy8gKGNhY2hlZCBgX3NpdGVEaXNhYmxlZGAgZmxhZyDigJQgbm8gbG9jYWxTdG9yYWdlIGhpdCBwZXIgdGljaykuCiAgICAgIGlmIChfc2l0ZURpc2FibGVkKSB7CiAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlYWR5ID0gdmlkZW8ucmVhZHlTdGF0ZSA+PSAxOwogICAgICBjb25zdCBmcyA9IGlzRnVsbHNjcmVlbih2aWRlbyk7CiAgICAgIGNvbnN0IHIgPSB2aWRlby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbGFzdFJlY3QgPSByOwogICAgICBjb25zdCBvblNjcmVlbiA9IHIud2lkdGggPiAwICYmIHIuaGVpZ2h0ID4gMCAmJiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCBpbm5lckhlaWdodDsKICAgICAgLy8gWW91VHViZSBVUkwgZ2F0ZSArIFNQQS1uYXYtZ3JhY2UuIFJlZnJlc2ggdGhlIGNhY2hlZCBwcmV2aWV3LWFyZWEKICAgICAgLy8gZmxhZyBhbmQgc3RhbXAgYSBuYXZpZ2F0aW9uIHRpbWVzdGFtcCBvbiBwYXRoIGNoYW5nZSwgdGhlbgogICAgICAvLyBzdXBwcmVzcyBlbGlnaWJpbGl0eSB3aGlsZSB3ZSdyZSBlaXRoZXIgb24gYSBub24td2F0Y2ggVVJMIG9yCiAgICAgIC8vIGluc2lkZSB0aGUgcG9zdC1uYXYgZ3JhY2Ugd2luZG93IChhYnNvcmJzIHRoZSBicmllZiBmbGFzaCB3aGVuCiAgICAgIC8vIGEgaG9tZXBhZ2UgdGh1bWJuYWlsIGNsaWNrIGxhbmRzIHRoZSBjdXJzb3Igb24gdGhlIG5ldyBwbGF5ZXIpLgogICAgICBpZiAoX3l0SG9zdCAmJiBfeXRMYXN0UGF0aCAhPT0gbG9jYXRpb24ucGF0aG5hbWUpIHsKICAgICAgICBfeXRMYXN0UGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgIF95dFByZXZpZXdBcmVhID0gIV95dFdhdGNoUGF0aC50ZXN0KF95dExhc3RQYXRoKTsKICAgICAgICBfeXROYXZBdCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICAgIGNvbnN0IF9pbk5hdkdyYWNlID0gX3l0TmF2QXQgJiYgKHBlcmZvcm1hbmNlLm5vdygpIC0gX3l0TmF2QXQpIDwgQ09ORklHLllUX05BVl9HUkFDRV9NUzsKICAgICAgY29uc3QgZWxpZ2libGUgPSByZWFkeSAmJiAhZnMgJiYgb25TY3JlZW4gJiYgIV95dFByZXZpZXdBcmVhICYmICFfaW5OYXZHcmFjZTsKICAgICAgaWYgKCFlbGlnaWJsZSkgewogICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gIm5vbmUiOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtZmxleCI7CiAgICAgIGNvbnN0IHcgPSBidG4ub2Zmc2V0V2lkdGggfHwgMTcwOwogICAgICBjb25zdCBoID0gYnRuLm9mZnNldEhlaWdodCB8fCAzNjsKCiAgICAgIC8vIENvbXB1dGUgbWlkLXJpZ2h0IG9mIHRoZSAqdmlzaWJsZSogcG9ydGlvbiBvZiB0aGUgdmlkZW8gKHRoZQogICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgaXRzIHJlY3Qgd2l0aCB0aGUgdmlld3BvcnQpLiBOZXRmbGl4J3MgPHZpZGVvPgogICAgICAvLyBjYW4gYmUgbXVjaCB0YWxsZXIgdGhhbiB0aGUgdmlld3BvcnQuCiAgICAgIGNvbnN0IHZpc1RvcCA9IE1hdGgubWF4KHIudG9wLCAwKTsKICAgICAgY29uc3QgdmlzQm90dG9tID0gTWF0aC5taW4oci5ib3R0b20sIGlubmVySGVpZ2h0KTsKICAgICAgY29uc3QgdmlzUmlnaHQgPSBNYXRoLm1pbihyLnJpZ2h0LCBpbm5lcldpZHRoKTsKICAgICAgbGV0IHRvcCA9IE1hdGgucm91bmQodmlzVG9wICsgKHZpc0JvdHRvbSAtIHZpc1RvcCAtIGgpIC8gMikgKyBDT05GSUcuUElMTF9PRkZTRVRfWTsKICAgICAgbGV0IGxlZnQgPSBNYXRoLnJvdW5kKHZpc1JpZ2h0IC0gdyAtIENPTkZJRy5QSUxMX1JJR0hUX01BUkdJTik7CiAgICAgIC8vIEZpbmFsIHZpZXdwb3J0IGNsYW1wLgogICAgICB0b3AgPSBNYXRoLm1heChDT05GSUcuVklFV1BPUlRfUEFELCBNYXRoLm1pbih0b3AsIGlubmVySGVpZ2h0IC0gaCAtIENPTkZJRy5WSUVXUE9SVF9QQUQpKTsKICAgICAgbGVmdCA9IE1hdGgubWF4KENPTkZJRy5WSUVXUE9SVF9QQUQsIE1hdGgubWluKGxlZnQsIGlubmVyV2lkdGggLSB3IC0gQ09ORklHLlZJRVdQT1JUX1BBRCkpOwoKICAgICAgYnRuLnN0eWxlLnRvcCA9IHRvcCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gaG92ZXIgPyAiMSIgOiAiMCI7CiAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gaG92ZXIgPyAiYXV0byIgOiAibm9uZSI7CiAgICB9CgogICAgY29uc3Qgb25CdG5FbnRlciA9ICgpID0+IHNldEhvdmVyKHRydWUpOwogICAgY29uc3Qgb25CdG5MZWF2ZSA9ICgpID0+IHNldEhvdmVyKGZhbHNlKTsKCiAgICAvLyBQZXItdmlkZW8gbGlzdGVuZXJzIHN0YXkgb24gdGhlIHZpZGVvIGVsZW1lbnQuIERvY3VtZW50L3dpbmRvdwogICAgLy8gbGlzdGVuZXJzIGFyZSBzaGFyZWQgdmlhIHRoZSBtb2R1bGUtbGV2ZWwgYG92ZXJsYXlzYCByZWdpc3RyeQogICAgLy8gKG9uZSBzZXQgb2YgZ2xvYmFscyByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHZpZGVvcyBhcmUgb24gdGhlIHBhZ2UpLgogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgb25CdG5MZWF2ZSk7CiAgICBjb25zdCBWSURFT19FVkVOVFMgPSBbInBsYXkiLCJwbGF5aW5nIiwicGF1c2UiLCJlbmRlZCIsImVtcHRpZWQiLCJsb2FkZWRkYXRhIl07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFZJREVPX0VWRU5UUy5sZW5ndGg7IGkrKykgewogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIH0KICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGJlZ2luZnVsbHNjcmVlbiIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICByby5vYnNlcnZlKHZpZGVvKTsKCiAgICBjb25zdCBpbnN0YW5jZSA9IHsgdXBkYXRlLCBoYW5kbGVQb2ludGVyLCBoYW5kbGVUb3VjaCB9OwogICAgb3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIHZpZGVvVG9PdmVybGF5LnNldCh2aWRlbywgaW5zdGFuY2UpOwogICAgY29uc3QgaW8gPSBnZXRJTygpOwogICAgaWYgKGlvKSB7CiAgICAgIGlvLm9ic2VydmUodmlkZW8pOwogICAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBmaXJlcyBhIGNhbGxiYWNrIHN5bmNocm9ub3VzbHkgYWZ0ZXIKICAgICAgLy8gb2JzZXJ2ZSgpIGluIGEgbWljcm90YXNrLiBVbnRpbCB0aGVuIGFzc3VtZSB0aGUgdmlkZW8gaXMKICAgICAgLy8gdmlzaWJsZSBzbyB0aGUgdmVyeSBmaXJzdCB1cGRhdGUoKSBydW5zLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIElPIHN1cHBvcnQg4oCUIGZhbGwgYmFjayB0byAiYWx3YXlzIHZpc2libGUiLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0KICAgIGFybUdsb2JhbHMoKTsKICAgIHVwZGF0ZSgpOwoKICAgIGlmICh0ZWFyZG93bnMpIHsKICAgICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICAgIG92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgaWYgKGludGVyc2VjdGlvbk9ic2VydmVyKSBpbnRlcnNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUodmlkZW8pOwogICAgICAgIHZpZGVvVG9PdmVybGF5LmRlbGV0ZSh2aWRlbyk7CiAgICAgICAgYnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgICAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIG9uQnRuTGVhdmUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVklERU9fRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB9CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2Via2l0YmVnaW5mdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICByby5kaXNjb25uZWN0KCk7CiAgICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgeyBjbGVhclRpbWVvdXQodG91Y2hIaWRlVGltZXIpOyB0b3VjaEhpZGVUaW1lciA9IG51bGw7IH0KICAgICAgICBidG4ucmVtb3ZlKCk7CiAgICAgICAgbWF5YmVEaXNhcm1HbG9iYWxzKCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29uZmlndXJhdGlvbiAmIGRpc3BhdGNoCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBlci1vcmlnaW4gYGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcGAgZmxhZy4KICAvLyBEZWZhdWx0IGlzIE9OOiBldmVyeSBzaXRlIHVzZXMgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIHVubGVzcyB0aGUKICAvLyB1c2VyIGhhcyBleHBsaWNpdGx5IG9wdGVkIGludG8gbmF0aXZlIGluamVjdGlvbiAoc2V0IHRoZSBmbGFnIHRvCiAgLy8gIjAiIC8gImZhbHNlIiAvICJubyIgLyAib2ZmIikuIFdyYXBwZWQgaW4gdHJ5L2NhdGNoIGJlY2F1c2UKICAvLyBsb2NhbFN0b3JhZ2UgYWNjZXNzIHRocm93cyBpbiBwcml2YXRlIC8gc2FuZGJveGVkIGNvbnRleHRzLgogIC8vCiAgLy8gRXhjZXB0aW9uOiB3d3cueW91dHViZS5jb20sIHd3dy50d2l0Y2gudHYgYW5kIHd3dy5uZXRmbGl4LmNvbQogIC8vIGRlZmF1bHQgdG8gT0ZGIChuYXRpdmUgaW5qZWN0aW9uKSBiZWNhdXNlIHRoZWlyIHBsYXllcnMgYWxyZWFkeQogIC8vIGhhdmUgZmlyc3QtY2xhc3MgY29udHJvbCBiYXJzIHdoZXJlIGEgbmF0aXZlIGJ1dHRvbiBsb29rcyBhdCBob21lLgogIC8vIE9ubHkgdGhlIGV4YWN0IGRlc2t0b3AgaG9zdG5hbWVzIGFyZSB0YXJnZXRlZCDigJQgbS4vbXVzaWMuL21vYmlsZQogIC8vIHN1YmRvbWFpbnMga2VlcCB0aGUgZ2VuZXJpYy1waWxsIGRlZmF1bHQuIFRoZSB1c2VyIGNhbiBmbGlwIHRoZQogIC8vIGZsYWcgZXhwbGljaXRseSBwZXIgb3JpZ2luIHRvIG92ZXJyaWRlLgogIC8vCiAgLy8gUmVhZCBsYXppbHkgb24gZmlyc3QgdXNlIChub3QgYXQgSUlGRSBpbml0KSBzbyB0aGF0IHVzZXJzY3JpcHQKICAvLyBtYW5hZ2VycyBvciBwb2x5ZmlsbCBzaGltcyB0aGF0IHJlcGxhY2UgYGxvY2FsU3RvcmFnZWAgc2xpZ2h0bHkKICAvLyBhZnRlciBvdXIgc2NyaXB0IGxvYWRzIHN0aWxsIHNlZSBhIGNvbnNpc3RlbnQgdmFsdWUuIEFmdGVyIHRoZQogIC8vIGZpcnN0IHJlYWQgaXQncyBjYWNoZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwYWdlIGxpZmV0aW1lIOKAlCB0aGUKICAvLyB2YWx1ZSBjYW4ndCBjaGFuZ2Ugd2l0aG91dCBhIHJlbG9hZC4KICBjb25zdCBOQVRJVkVfREVGQVVMVF9IT1NUUyA9IG5ldyBTZXQoWyJ3d3cueW91dHViZS5jb20iLCAid3d3LnR3aXRjaC50diIsICJ3d3cubmV0ZmxpeC5jb20iXSk7CiAgZnVuY3Rpb24gX2RlZmF1bHRHZW5lcmljRm9ySG9zdCgpIHsKICAgIHJldHVybiAhTkFUSVZFX0RFRkFVTFRfSE9TVFMuaGFzKGxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiByZWFkR2VuZXJpY1BpcEZvcmNlZCgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlZ2VuZXJpY19waXAiKTsKICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsKICAgICAgY29uc3QgcyA9IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKICAgICAgaWYgKHMgPT09ICIwIiB8fCBzID09PSAiZmFsc2UiIHx8IHMgPT09ICJubyIgfHwgcyA9PT0gIm9mZiIpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIHsgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsgfQogIH0KICBsZXQgX2dlbmVyaWNQaXBGb3JjZWRDYWNoZSA9IG51bGw7IC8vIG51bGwgPSBub3QgeWV0IHJlYWQKICBmdW5jdGlvbiBnZW5lcmljUGlwRm9yY2VkQ2FjaGVkKCkgewogICAgaWYgKF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPT09IG51bGwpIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPSByZWFkR2VuZXJpY1BpcEZvcmNlZCgpOwogICAgcmV0dXJuIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGU7CiAgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IHdoZW4gdHJ1dGh5LCB0aGUgZ2VuZXJpYyBvdmVybGF5IHBpbGwgaXMKICAvLyBzdXBwcmVzc2VkIG9uIHRoaXMgc2l0ZS4gU2V0IHZpYSB0aGUgcmlnaHQtY2xpY2sgbWVudSBvbiB0aGUgcGlsbDsKICAvLyBjbGVhcmVkIGZyb20gRGV2VG9vbHMgd2l0aCBgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImJyYXZlX3BpcF9kaXNhYmxlZCIpYC4KICAvLwogIC8vIFRoZSBmbGFnIGlzIGNhY2hlZCBpbiBgX3NpdGVEaXNhYmxlZGAgYWZ0ZXIgdGhlIGluaXRpYWwgYmFpbC1vdXQKICAvLyBjaGVjayBzbyB0aGUgaG90IHBhdGhzICh1cGRhdGUoKSBydW5zIHBlciB2aXNpYmxlIHZpZGVvIHBlcgogIC8vIGFuaW1hdGlvbiBmcmFtZSkgZG9uJ3QgaGF2ZSB0byBoaXQgbG9jYWxTdG9yYWdlIGV2ZXJ5IHRpY2suIFRoZQogIC8vIG1lbnUncyBjbGljayBoYW5kbGVyIGZsaXBzIHRoZSBjYWNoZWQgdmFsdWUgd2hlbiB0aGUgdXNlciBkaXNhYmxlcwogIC8vIG1pZC1zZXNzaW9uLgogIGNvbnN0IERJU0FCTEVfS0VZID0gImJyYXZlX3BpcF9kaXNhYmxlZCI7CiAgZnVuY3Rpb24gcmVhZFNpdGVEaXNhYmxlZCgpIHsKICAgIHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShESVNBQkxFX0tFWSkgPT09ICIxIjsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfQogIH0KICBmdW5jdGlvbiBzZXRTaXRlRGlzYWJsZWQoKSB7CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShESVNBQkxFX0tFWSwgIjEiKTsgfSBjYXRjaCB7fQogIH0KICAvLyBDYWNoZWQgZmxhZyDigJQgdXBkYXRlZCBvbiBpbml0IGFuZCBvbiBtaWQtc2Vzc2lvbiBkaXNhYmxlLgogIGxldCBfc2l0ZURpc2FibGVkID0gZmFsc2U7CgogIC8vIFNoYXJlZCByaWdodC1jbGljayBoYW5kbGVyIGF0dGFjaGVkIHRvIGV2ZXJ5IG5hdGl2ZSBpbmplY3RlZCBidXR0b24KICAvLyAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpLiBNaXJyb3JzIHRoZSBnZW5lcmljIHBpbGwncyBjb250ZXh0bWVudQogIC8vIHdpcmluZyBzbyB1c2VycyBjYW4gZGlzYWJsZSBQaVAgb24gdGhlIGhvc3Qgc2l0ZSBmcm9tIGFueSBvZiBvdXIgVUlzLgogIGZ1bmN0aW9uIF9vbk5hdGl2ZUJ0bkNvbnRleHRNZW51KGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzaG93RGlzYWJsZU1lbnUoZS5jbGllbnRYLCBlLmNsaWVudFkpOwogIH0KCiAgLy8gUmVtb3ZlcyBhbnkgb2Ygb3VyIGluamVjdGVkIERPTSAobmF0aXZlIGJ1dHRvbnMgKyBjbG9uZWQgd3JhcHBlcnMpLgogIC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIHBpY2tzICJEaXNhYmxlIFBpUCBpY29uIG9uIDxzaXRlPiIgZnJvbSB0aGUKICAvLyByaWdodC1jbGljayBtZW51IHNvIHRoZSBwYWdlIHJldHVybnMgdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS4KICBmdW5jdGlvbiBfcmVtb3ZlTmF0aXZlQnV0dG9ucygpIHsKICAgIGNvbnN0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJyYXZlLXBpcC1idG4sIC5icmF2ZS1waXAtd3JhcHBlciIpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgbm9kZXNbaV0ucmVtb3ZlKCk7CiAgfQoKICAvLyBTaW5nbGUtaW5zdGFuY2UgY3VzdG9tIGNvbnRleHQgbWVudSBzaG93biBvbiByaWdodC1jbGljayBvZiB0aGUKICAvLyBnZW5lcmljIHBpbGwgb3IgYW55IG5hdGl2ZSBpbmplY3RlZCBidXR0b24uIFdlIGNhbid0IGN1c3RvbWlzZSB0aGUKICAvLyBicm93c2VyJ3MgbmF0aXZlIGNvbnRleHQgbWVudSB3aXRob3V0IGFuIGV4dGVuc2lvbiwgc28gd2UgY2FuY2VsIGl0CiAgLy8gKGBwcmV2ZW50RGVmYXVsdGApIGFuZCByZW5kZXIgb3VyIG93biBET00uIEF1dG8tZGlzbWlzc2VzIG9uCiAgLy8gY2xpY2stb3V0c2lkZSwgRXNjYXBlLCBvciBzY3JvbGwuCiAgbGV0IGFjdGl2ZU1lbnUgPSBudWxsOwogIC8vIFRpbWVzdGFtcCB3aGVuIHRoZSBhY3RpdmUgbWVudSB3YXMgb3BlbmVkLiBPdXRzaWRlLWNsaWNrcyB3aXRoaW4gYQogIC8vIHNob3J0IHdpbmRvdyAofjE1MCBtcykgb2Ygb3BlbmluZyBhcmUgaWdub3JlZCDigJQgZGVmZW5kcyBhZ2FpbnN0IGEKICAvLyBzeW50aGV0aWMgc2FtZS1mcmFtZSBjbGljayBieXBhc3NpbmcgdGhlIHNldFRpbWVvdXQoMCkgaGFuZG9mZi4KICBsZXQgYWN0aXZlTWVudU9wZW5lZEF0ID0gMDsKICBjb25zdCBNRU5VX09QRU5fR1VBUkRfTVMgPSAxNTA7CiAgZnVuY3Rpb24gY2xvc2VNZW51KCkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBhY3RpdmVNZW51LnJlbW92ZSgpOwogICAgYWN0aXZlTWVudSA9IG51bGw7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgX29uTWVudUtleSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgY2xvc2VNZW51LCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGNsb3NlTWVudSk7CiAgfQogIGZ1bmN0aW9uIF9vbk1lbnVLZXkoZSkgeyBpZiAoZS5rZXkgPT09ICJFc2NhcGUiKSBjbG9zZU1lbnUoKTsgfQogIGZ1bmN0aW9uIF9vbk1lbnVDbGlja091dHNpZGUoZSkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBpZiAoZS50aW1lU3RhbXAgLSBhY3RpdmVNZW51T3BlbmVkQXQgPCBNRU5VX09QRU5fR1VBUkRfTVMpIHJldHVybjsKICAgIGlmICghYWN0aXZlTWVudS5jb250YWlucyhlLnRhcmdldCkpIGNsb3NlTWVudSgpOwogIH0KICBmdW5jdGlvbiBzaG93RGlzYWJsZU1lbnUoeCwgeSkgewogICAgY2xvc2VNZW51KCk7CiAgICBjb25zdCBtZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBtZW51LnN0eWxlLmNzc1RleHQgPQogICAgICAicG9zaXRpb246Zml4ZWQ7bGVmdDoiICsgeCArICJweDt0b3A6IiArIHkgKyAicHg7IiArCiAgICAgICJiYWNrZ3JvdW5kOnJnYmEoMjgsMjgsMzAsMC45Nik7Y29sb3I6I2ZmZjsiICsKICAgICAgImJvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NHB4IDA7IiArCiAgICAgICJib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAiei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiZm9udDo1MDAgMTNweC8xLjQgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sU2Vnb2UgVUksUm9ib3RvLHNhbnMtc2VyaWY7IiArCiAgICAgICJ1c2VyLXNlbGVjdDpub25lO3BvaW50ZXItZXZlbnRzOmF1dG87bWluLXdpZHRoOjE4MHB4OyI7CgogICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaXRlbS50ZXh0Q29udGVudCA9ICJEaXNhYmxlIFBpUCBpY29uIG9uICIgKyBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjhweCAxNHB4O2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcDsiOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjEyKSI7IH0pOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAiIjsgfSk7CiAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBzZXRTaXRlRGlzYWJsZWQoKTsKICAgICAgX3NpdGVEaXNhYmxlZCA9IHRydWU7CiAgICAgIC8vIEhpZGUgZXZlcnkgYWN0aXZlIGdlbmVyaWMgcGlsbCBvbiB0aGlzIHBhZ2UgaW1tZWRpYXRlbHkuIFRoZQogICAgICAvLyBuZXh0IGB1cGRhdGUoKWAgdGljayB3aWxsIHNlZSB0aGUgY2FjaGVkIGZsYWcgYW5kIGtlZXAgdGhlbQogICAgICAvLyBoaWRkZW4uIE5hdGl2ZSBpbmplY3RlZCBidXR0b25zIChZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeCkKICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGRpcmVjdGx5IOKAlCB0aGVpciBwZXJzaXN0ZW50IG9ic2VydmVycwogICAgICAvLyB3aWxsIHNlZSBgX3NpdGVEaXNhYmxlZGAgYW5kIHN0b3AgcmUtaW5qZWN0aW5nLgogICAgICBfc2NoZWR1bGVVcGRhdGVBbGwoKTsKICAgICAgX3JlbW92ZU5hdGl2ZUJ1dHRvbnMoKTsKICAgICAgbG9nKCJkaXNhYmxlZCBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUpOwogICAgICBjbG9zZU1lbnUoKTsKICAgIH0pOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgYWN0aXZlTWVudSA9IG1lbnU7CiAgICBhY3RpdmVNZW51T3BlbmVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKCiAgICAvLyBJZiB0aGUgbWVudSB3b3VsZCBvdmVyZmxvdyB0aGUgdmlld3BvcnQsIG51ZGdlIGl0IGJhY2sgaW4uCiAgICBjb25zdCByID0gbWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmIChyLnJpZ2h0ID4gaW5uZXJXaWR0aCkgIG1lbnUuc3R5bGUubGVmdCA9IChpbm5lcldpZHRoICAtIHIud2lkdGggIC0gOCkgKyAicHgiOwogICAgaWYgKHIuYm90dG9tID4gaW5uZXJIZWlnaHQpIG1lbnUuc3R5bGUudG9wICA9IChpbm5lckhlaWdodCAtIHIuaGVpZ2h0IC0gOCkgKyAicHgiOwoKICAgIC8vIERlZmVyIGxpc3RlbmVyIGF0dGFjaCB0byB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gdGhlIGNsaWNrIHRoYXQKICAgIC8vIG9wZW5lZCB0aGUgbWVudSBkb2Vzbid0IGltbWVkaWF0ZWx5IGRpc21pc3MgaXQuCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIF9vbk1lbnVLZXksIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBjbG9zZU1lbnUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBjbG9zZU1lbnUpOwogICAgfSwgMCk7CiAgfQoKICAvLyBOYXRpdmUtc2l0ZSBhZGFwdGVyIHRhYmxlLiBFYWNoIGVudHJ5IGRlc2NyaWJlcyBvbmUgc2l0ZSB3aG9zZQogIC8vIHBsYXllciBjaHJvbWUgd2Uga25vdyBob3cgdG8gaW5qZWN0IGludG8uIERldGVjdGlvbiBpcyBob3N0bmFtZS0KICAvLyBmaXJzdCAoaGFuZGxlcyByZWd1bGFyIHBhZ2VzKSB3aXRoIGEgRE9NLXNpZ25hbCBmYWxsYmFjayAoaGFuZGxlcwogIC8vIGFib3V0OmJsYW5rIHNhbWUtb3JpZ2luIGlmcmFtZXMgd2hlcmUgbG9jYXRpb24uaG9zdG5hbWUgaXMgIiIpLgogIC8vCiAgLy8gVG8gc3VwcG9ydCBhIG5ldyBzaXRlLCBhZGQgYSByZWNvcmQgaGVyZSBhbmQgd3JpdGUgYSBtYXRjaGluZwogIC8vIGBhZGQ8TmFtZT5CdXR0b24odmlkZW8pYCBpbmplY3RvciDigJQgbm8gb3RoZXIgY2hhbmdlIHJlcXVpcmVkLgogIGNvbnN0IE5BVElWRV9TSVRFUyA9IFsKICAgIHsKICAgICAgbmFtZTogIllvdVR1YmUiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoInlvdXR1YmUuY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5odG1sNS12aWRlby1wbGF5ZXIsIC55dHAtcmlnaHQtY29udHJvbHMiKSwKICAgICAgaW5qZWN0OiBhZGRZb3VUdWJlQnV0dG9uLAogICAgICBzY29wZTogIi5odG1sNS12aWRlby1wbGF5ZXIiLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlR3aXRjaCIsCiAgICAgIG1hdGNoOiAoaG9zdCkgPT4gaG9zdC5lbmRzV2l0aCgidHdpdGNoLnR2IikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXIsIFtkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItY29udHJvbHMiXScpLAogICAgICBpbmplY3Q6IGFkZFR3aXRjaEJ1dHRvbiwKICAgICAgc2NvcGU6ICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWNvbnRyb2xzIl0sIC52aWRlby1wbGF5ZXInLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIk5ldGZsaXgiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoIm5ldGZsaXguY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVpYT0iY29udHJvbHMtc3RhbmRhcmQiXSwgW2RhdGEtdWlhPSJ2aWRlby1jYW52YXMiXScpLAogICAgICBpbmplY3Q6IGFkZE5ldGZsaXhCdXR0b24sCiAgICAgIHNjb3BlOiAnW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJywKICAgIH0sCiAgXTsKCiAgLy8gUnVuIGFuIGluamVjdG9yIG9uY2Ugbm93IGFuZCBhZ2FpbiBvbiBldmVyeSByZWxldmFudCBET00gbXV0YXRpb24sCiAgLy8gc28gdGhlIGJ1dHRvbiByZWFwcGVhcnMgYWZ0ZXIgUmVhY3QgKE5ldGZsaXggLyBUd2l0Y2gpIHRlYXJzIGRvd24KICAvLyBhbmQgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIuIFRoZSBvYnNlcnZlciBzdGFydHMgb24gPGh0bWw+IGlmCiAgLy8gdGhlIHNjb3BlZCBjb250YWluZXIgaXNuJ3QgaW4gdGhlIERPTSB5ZXQsIHRoZW4gInByb21vdGVzIiBpdHNlbGYKICAvLyB0byB0aGUgc21hbGxlciBzdWJ0cmVlIGFzIHNvb24gYXMgaXQgYXBwZWFycyDigJQgbWluaW1pc2luZyBjaHVybi4KICAvLwogIC8vIFJlc2lsaWVuY2UgdG8gaG9zdCByZWRlc2lnbnM6IGlmIHRoZSBpbmplY3RvciBrZWVwcyByZXR1cm5pbmcgZmFsc2UKICAvLyBmb3IgYE5BVElWRV9GQUxMQkFDS19NU2AgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIHdlIGRpc2Nvbm5lY3QgdGhlCiAgLy8gb2JzZXJ2ZXIgYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQg4oCUIHNvIHVzZXJzCiAgLy8gYWx3YXlzIGdldCAqc29tZSogUGlQIGNvbnRyb2wgZXZlbiBpZiBZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeAogIC8vIGNoYW5nZXMgaXRzIERPTSBpbiBhIHdheSB0aGF0IGJyZWFrcyBvdXIgc2VsZWN0b3JzLiBUaGUgZmFsbGJhY2sgaXMKICAvLyBhcm1lZCBvbmx5IG9uY2UgcGVyIHZpZGVvIGFuZCBvbmx5IHRyaWdnZXJzIGlmIHRoZSBpbmplY3RvciBoYXMKICAvLyAqbmV2ZXIqIHN1Y2NlZWRlZDsgaW50ZXJtaXR0ZW50IGZhaWx1cmVzIGR1cmluZyBhIHJlLW1vdW50IGRvbid0CiAgLy8gY291bnQuCiAgZnVuY3Rpb24gdHJ5TmF0aXZlKHZpZGVvLCBpbmplY3Rvciwgc2NvcGVTZWxlY3RvciwgdGVhcmRvd25zKSB7CiAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGxldCBldmVyU3VjY2VlZGVkID0gISFpbmplY3Rvcih2aWRlbyk7CiAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgICBsZXQgZmVsbEJhY2sgPSBmYWxzZTsKICAgIC8vIEFsd2F5cyBvYnNlcnZlIGF0IGRvY3VtZW50IGxldmVsLiBXZSB0cmllZCBwcm9tb3RpbmcgdG8gYSBzY29wZWQKICAgIC8vIHN1YnRyZWUgKGFuZCB0byB0aGUgc2NvcGVkIHRhcmdldCdzIHBhcmVudCkgZm9yIGxvd2VyIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIGJ1dCBOZXRmbGl4IHJlLW1vdW50cyB3aG9sZSBwbGF5ZXIgc3VidHJlZXMgb24gdmlzaWJpbGl0eQogICAgLy8gY2hhbmdlcyDigJQgbGVhdmluZyBhbnkgbmFycm93ZXIgb2JzZXJ2ZXIgYXR0YWNoZWQgdG8gYSBkZXRhY2hlZAogICAgLy8gbm9kZSwgd2l0aCBubyB3YXkgdG8gZGV0ZWN0IGRldGFjaG1lbnQgYmVjYXVzZSBubyBtdXRhdGlvbnMgZmlyZQogICAgLy8gb24gdGhlIGRldGFjaGVkIG5vZGUuIFRoZSByQUYtY29hbGVzY2VkIGNhbGxiYWNrIGJlbG93IGNhcHMgd29yawogICAgLy8gYXQgb25lIGluamVjdG9yIGNhbGwgcGVyIGFuaW1hdGlvbiBmcmFtZSByZWdhcmRsZXNzIG9mIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIHNvIGRvY3VtZW50LWxldmVsIG9ic2VydmF0aW9uIHN0YXlzIGJvdW5kZWQuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgIGlmIChzY2hlZHVsZWQgfHwgZmVsbEJhY2spIHJldHVybjsKICAgICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICBpZiAoZmVsbEJhY2spIHJldHVybjsKICAgICAgICBpZiAoaW5qZWN0b3IodmlkZW8pKSB7CiAgICAgICAgICBldmVyU3VjY2VlZGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFldmVyU3VjY2VlZGVkICYmCiAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCA+PSBDT05GSUcuTkFUSVZFX0ZBTExCQUNLX01TKSB7CiAgICAgICAgICBmZWxsQmFjayA9IHRydWU7CiAgICAgICAgICBvYnMuZGlzY29ubmVjdCgpOwogICAgICAgICAgd2FybigibmF0aXZlIGluamVjdGlvbiB1bmF2YWlsYWJsZSBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUgKwogICAgICAgICAgICAgICAiOyBmYWxsaW5nIGJhY2sgdG8gZ2VuZXJpYyBwaWxsIik7CiAgICAgICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIG9icy5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICBpZiAodGVhcmRvd25zKSB0ZWFyZG93bnMucHVzaCgoKSA9PiBvYnMuZGlzY29ubmVjdCgpKTsKICB9CgogIC8vIERlY2lkZXMgd2hpY2ggVUkgdG8gYWRkIGZvciBhIGdpdmVuIHZpZGVvIGFuZCB3aXJlcyBpdCB1cC4gQ2FsbGVkCiAgLy8gZXhhY3RseSBvbmNlIHBlciB2aWRlbyBieSBgYXR0YWNoVG9WaWRlb2AuIFRoZSBgdGVhcmRvd25zYCBhcnJheSBpcwogIC8vIHBvcHVsYXRlZCB3aXRoIGNsZWFudXAgY2xvc3VyZXMgdGhhdCB0aGUgZGlzY292ZXJ5IG9ic2VydmVyJ3MKICAvLyByZW1vdmVkLW5vZGVzIHBhdGggd2lsbCBydW4uCiAgZnVuY3Rpb24gYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIEdlbmVyaWMgb3ZlcmxheSBpcyB0aGUgZGVmYXVsdC4gU2V0IGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcD0iMCIKICAgIC8vIChvciBmYWxzZS9uby9vZmYpIHBlci1vcmlnaW4gdG8gb3B0IGJhY2sgaW50byBuYXRpdmUgaW5qZWN0aW9uLgogICAgaWYgKGdlbmVyaWNQaXBGb3JjZWRDYWNoZWQoKSkgewogICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICBsb2coImluamVjdGVkIG92ZXJsYXkiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGhvc3QgPSBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTkFUSVZFX1NJVEVTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHNpdGUgPSBOQVRJVkVfU0lURVNbaV07CiAgICAgIGlmIChzaXRlLm1hdGNoKGhvc3QpKSB7CiAgICAgICAgdHJ5TmF0aXZlKHZpZGVvLCBzaXRlLmluamVjdCwgc2l0ZS5zY29wZSwgdGVhcmRvd25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAvLyBVbnJlY29nbmlzZWQgc2l0ZSAoYW5kIHVzZXIgb3B0ZWQgb3V0IG9mIGdlbmVyaWMgdmlhIGxvY2FsU3RvcmFnZSk6CiAgICAvLyBzdGlsbCBpbnN0YWxsIHRoZSBvdmVybGF5IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyBuYXRpdmUgdG8gYW5jaG9yIHRvLgogICAgYWRkT3ZlcmxheUJ1dHRvbih2aWRlbywgdGVhcmRvd25zKTsKICAgIGxvZygiaW5qZWN0ZWQgb3ZlcmxheSIpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGVyLXZpZGVvIHNldHVwICsgdGVhcmRvd24KICAvLwogIC8vIFJ1bnMgb25jZSBwZXIgPHZpZGVvPiBlbGVtZW50LiBUaGUgYHRlYXJkb3duc2AgYXJyYXkgaXMgdGhlIHNpbmdsZQogIC8vIHBsYWNlIGV2ZXJ5IGxpc3RlbmVyIC8gb2JzZXJ2ZXIgLyBET00gbm9kZSB3ZSBhZGQgZm9yIHRoaXMgdmlkZW8gaXMKICAvLyByZWNvcmRlZDsgdGhlIGRpc2NvdmVyeSBvYnNlcnZlciBiZWxvdyBjYWxscyB0aGVtIHdoZW4gdGhlIHZpZGVvIGlzCiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRoZSBzY3JpcHQgZG9lc24ndCBsZWFrIG9uIGxvbmctbGl2ZWQgU1BBCiAgLy8gcGFnZXMgd2l0aCBpbmZpbml0ZSBzY3JvbGwuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gYXR0YWNoVG9WaWRlbyh2aWRlbykgewogICAgaWYgKHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKSkgcmV0dXJuOwoKICAgIC8vIFNvbWUgc2l0ZXMgKE5ldGZsaXgsIGNlcnRhaW4gRFJNIHBsYXllcnMpIGV4cGxpY2l0bHkgZGlzYWJsZSBQaVAuCiAgICAvLyBDbGVhciBpdCBub3cgYW5kIHdhdGNoIChiZWxvdykgZm9yIHRoZSBwYWdlIHJlLXNldHRpbmcgaXQuCiAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgdmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgPSBmYWxzZTsKICAgICAgdmlkZW8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScpOwogICAgfQogICAgLy8gV2lyZSBhdXRvbWF0aWMtUGlQIGludGVudCAoYnJvd3NlcnMgd2l0aCBhdXRvLVBpUCBmZWF0dXJlLCBlLmcuCiAgICAvLyBDaHJvbWUgZmxhZywgZmlyZSB0aGlzIG9uIHRhYiBzd2l0Y2gpLiBUaGUgaGFuZGxlciBpcyBnbG9iYWwgcGVyCiAgICAvLyBkb2N1bWVudCDigJQgbGFzdCByZWdpc3RyYXRpb24gd2lucyDigJQgc28gb24gcGFnZXMgd2l0aCBtdWx0aXBsZQogICAgLy8gPHZpZGVvPiBlbGVtZW50cyAoWW91VHViZSB3YXRjaDogbWFpbiBwbGF5ZXIgKyBob3Zlci10aHVtYm5haWwKICAgIC8vIHByZXZpZXdzICsgYWQgcHJlLXJvbGwpIHRoZSAqbGFzdCogbW91bnRlZCB2aWRlbyB3b3VsZCBiZSBQaVAnZCwKICAgIC8vIHdoaWNoIGlzIGZyZXF1ZW50bHkgYSBoaWRkZW4vZW1wdHkgcHJldmlldyDihpIgYmxhY2sgUGlQIHdpbmRvdwogICAgLy8gd2l0aCBubyBjb250cm9scyBhbmQgYSBkZXN5bmNlZCBkdXJhdGlvbi4KICAgIC8vIFBpY2sgdGhlIG1vc3QgcGxhdXNpYmxlICJhY3RpdmUiIHZpZGVvIGF0IGZpcmUgdGltZSBpbnN0ZWFkOgogICAgLy8gdGhlIG9uZSBjdXJyZW50bHkgaW4gUGlQICh0b2dnbGluZyBvdXQpLCBlbHNlIHRoZSBsYXJnZXN0IHBsYXlpbmcKICAgIC8vIHZpZGVvLCBlbHNlIHRoZSBsYXJnZXN0IHZpZGVvIHdpdGggbWV0YWRhdGEuIE5vLW9wIG9uIGJyb3dzZXJzCiAgICAvLyB0aGF0IGRvbid0IHN1cHBvcnQgaXQ7IHRoZSB0cnkvY2F0Y2ggZ3VhcmRzIGlPUyAvIG9sZGVyIGJyb3dzZXJzLgogICAgdHJ5IHsKICAgICAgbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKCJlbnRlcnBpY3R1cmVpbnBpY3R1cmUiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgdiA9IHBpY2tBdXRvUGlwVGFyZ2V0KCkgfHwgdmlkZW87CiAgICAgICAgdHJ5IHsgYXdhaXQgdi5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpOyB9IGNhdGNoIChlKSB7IHdhcm4oImF1dG8tUGlQIGZhaWxlZDoiLCBlLm1lc3NhZ2UgfHwgZSk7IH0KICAgICAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciAqLyB9CgogICAgY29uc3QgdGVhcmRvd25zID0gW107CgogICAgYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwoKICAgIC8vIE9ubHkgcmVzdW1lIG9uIGVudGVyaW5nIFBpUCBpZiB0aGUgdmlkZW8gd2FzIGFjdHVhbGx5IHBsYXlpbmcgd2hlbgogICAgLy8gdGhlIHRyYW5zaXRpb24gZmlyZWQuIFRoZSBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGB2aWRlby5wbGF5KClgCiAgICAvLyBvdmVycm9kZSB1c2VyLWluaXRpYXRlZCBwYXVzZXMgKGUuZy4gWW91VHViZSBhdXRvLVBpUCBvbiB0YWItc3dpdGNoCiAgICAvLyB3b3VsZCB1bi1wYXVzZSBhIHBhdXNlZCB2aWRlbykuIENhcHR1cmUgc3RhdGUgYXQgaGFuZGxlciBhdHRhY2gKICAgIC8vIHRpbWUgYW5kIHJlZnJlc2ggb24gcGxheS9wYXVzZSBldmVudHMuCiAgICBsZXQgd2FzUGxheWluZyA9ICF2aWRlby5wYXVzZWQgJiYgIXZpZGVvLmVuZGVkOwogICAgY29uc3Qgb25QbGF5U3RhdGUgPSAoKSA9PiB7IHdhc1BsYXlpbmcgPSAhdmlkZW8ucGF1c2VkICYmICF2aWRlby5lbmRlZDsgfTsKICAgIGNvbnN0IFBMQVlfRVZFTlRTID0gWyJwbGF5IiwgInBsYXlpbmciLCAicGF1c2UiLCAiZW5kZWQiXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUExBWV9FVkVOVFMubGVuZ3RoOyBpKyspIHsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgfQogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFBMQVlfRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCBvbkVudGVyUGlwID0gKCkgPT4gewogICAgICBpZiAoIXdhc1BsYXlpbmcpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh3YXNQbGF5aW5nICYmIHZpZGVvLnBhdXNlZCkgdmlkZW8ucGxheSgpOyB9LCAyNTApOwogICAgfTsKICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImVudGVycGljdHVyZWlucGljdHVyZSIsIG9uRW50ZXJQaXApOwogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW50ZXJwaWN0dXJlaW5waWN0dXJlIiwgb25FbnRlclBpcCkpOwoKICAgIC8vIFdhdGNoIGZvciBzaXRlcyAoZS5nLiBOZXRmbGl4KSByZS1hZGRpbmcgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUuCiAgICBjb25zdCBkcGlwT2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgICB2aWRlby5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IGZhbHNlOwogICAgICAgIHZpZGVvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnKTsKICAgICAgfQogICAgfSk7CiAgICBkcGlwT2JzLm9ic2VydmUodmlkZW8sIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJ10gfSk7CiAgICB0ZWFyZG93bnMucHVzaCgoKSA9PiBkcGlwT2JzLmRpc2Nvbm5lY3QoKSk7CgogICAgdmlkZW9DbGVhbnVwcy5zZXQodmlkZW8sICgpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZWFyZG93bnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgeyB0ZWFyZG93bnNbaV0oKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSBpbmRpdmlkdWFsIHRlYXJkb3duIGVycm9ycyAqLyB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG9wLWxldmVsIHNldHVwICsgZGlzY292ZXJ5IG9ic2VydmVyCiAgLy8KICAvLyBPbmUgcGVyc2lzdGVudCBNdXRhdGlvbk9ic2VydmVyIHRyYWNrcyA8dmlkZW8+IGVsZW1lbnRzIGJlaW5nIGFkZGVkCiAgLy8gdG8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSBvdmVyIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEFkZCDihpIgd2lyZSB1cC4KICAvLyBSZW1vdmUg4oaSIHJ1biB0aGUgcmVnaXN0ZXJlZCB0ZWFyZG93biBjbG9zdXJlIGZvciB0aGF0IHZpZGVvLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUoKSB7CiAgICAvLyBBdHRhY2ggdG8gZXZlcnkgPHZpZGVvPiBjdXJyZW50bHkgb24gdGhlIHBhZ2UuCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpLmZvckVhY2goYXR0YWNoVG9WaWRlbyk7CgogICAgLy8gS2VlcCB3YXRjaGluZyBmb3IgdmlkZW9zIGFkZGVkIGxhdGVyIChsYXp5LWxvYWRlZCBmZWVkcywgU1BBIHJvdXRlCiAgICAvLyBjaGFuZ2VzLCBlbWJlZGRlZCBwbGF5ZXJzIHRoYXQgbW91bnQgYWZ0ZXIgZmlyc3QgcGFpbnQsIGV0Yy4pLgogICAgLy8gSW5kZXhlZCBsb29wcyArIG5vZGVUeXBlIGNoZWNrIGFyZSBmcmllbmRsaWVyIHRvIFY4J3MgaW5saW5lCiAgICAvLyBjYWNoZXMgdGhhbiBmb3Itb2YgKyBpbnN0YW5jZW9mIG9uIGhvdCBET00tbXV0YXRpb24gcGF0aHMuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihfb25Eb21NdXRhdGlvbnMpOwogICAgb2JzLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIF9ydW5DbGVhbnVwKHZpZGVvKSB7CiAgICBjb25zdCBmbiA9IHZpZGVvQ2xlYW51cHMuZ2V0KHZpZGVvKTsKICAgIGlmICghZm4pIHJldHVybjsKICAgIHZpZGVvQ2xlYW51cHMuZGVsZXRlKHZpZGVvKTsKICAgIHRyeSB7IGZuKCk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgZnVuY3Rpb24gX29uRG9tTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7CiAgICAgIGNvbnN0IG11ID0gbXV0YXRpb25zW2ldOwoKICAgICAgY29uc3QgYWRkZWQgPSBtdS5hZGRlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgYWxlbiA9IGFkZGVkLmxlbmd0aDsgaiA8IGFsZW47IGorKykgewogICAgICAgIGNvbnN0IG5vZGUgPSBhZGRlZFtqXTsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgY29udGludWU7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICJWSURFTyIpIHsKICAgICAgICAgIGF0dGFjaFRvVmlkZW8obm9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7CiAgICAgICAgICBjb25zdCB2aWRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCB2bGVuID0gdmlkcy5sZW5ndGg7IGsgPCB2bGVuOyBrKyspIGF0dGFjaFRvVmlkZW8odmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdCByZW1vdmVkID0gbXUucmVtb3ZlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgcmxlbiA9IHJlbW92ZWQubGVuZ3RoOyBqIDwgcmxlbjsgaisrKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IHJlbW92ZWRbal07CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIGNvbnRpbnVlOwogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAiVklERU8iKSB7CiAgICAgICAgICBfcnVuQ2xlYW51cChub2RlKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKICAgICAgICAgIGNvbnN0IHZpZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwogICAgICAgICAgZm9yIChsZXQgayA9IDAsIHZsZW4gPSB2aWRzLmxlbmd0aDsgayA8IHZsZW47IGsrKykgX3J1bkNsZWFudXAodmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBCb290CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIEJhaWwgb3V0IGVhcmx5IG9uIGJyb3dzZXJzIHdpdGggbm8gUGlQIEFQSSBhdCBhbGwgKGV4dHJlbWVseSBvbGQgb3IKICAvLyBleG90aWMpLiBBdm9pZHMgcmVnaXN0ZXJpbmcgbGlzdGVuZXJzIHdlJ2QgbmV2ZXIgdXNlLgogIGlmICghUElQX1NVUFBPUlRFRCkgcmV0dXJuOwoKICAvLyBTY29wZTogb25seSBydW4gaW4gdGhlIHRvcC1sZXZlbCBmcmFtZS4gRW1iZWRkZWQgcGxheWVycyAoZS5nLgogIC8vIHd3dy55b3V0dWJlLmNvbS9lbWJlZC88aWQ+IGlmcmFtZXMgaW5zaWRlIHRoaXJkLXBhcnR5IHBhZ2VzKSBnZXQKICAvLyBuZWl0aGVyIG5hdGl2ZSBpbmplY3Rpb24gbm9yIHRoZSBnZW5lcmljLXBpbGwgZmFsbGJhY2sg4oCUIHRoZSBob3N0CiAgLy8gc2l0ZSBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBQaVAgVVggaW5zaWRlIGlmcmFtZXMuIFRoaXMga2VlcHMKICAvLyB0aGUgc2NyaXB0IGZvY3VzZWQgb24gY2Fub25pY2FsIGRlc2t0b3Agc2Vzc2lvbnMgYW5kIGF2b2lkcwogIC8vIGRvdWJsZS1pbmplY3Rpb24gd2hlbiBib3RoIHRoZSBwYXJlbnQgZnJhbWUgYW5kIHRoZSBlbWJlZCBtYXRjaAogIC8vIGEgdXNlcidzIGZpbHRlciBydWxlLgogIHRyeSB7IGlmICh3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZikgcmV0dXJuOyB9IGNhdGNoIChlKSB7IHJldHVybjsgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IGlmIHRoZSB1c2VyIHByZXZpb3VzbHkgc2VsZWN0ZWQgIkRpc2FibGUgUGlQIGljb24KICAvLyBvbiA8c2l0ZT4iIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUsIHRoaXMgZmxhZyBwZXJzaXN0cyBpbgogIC8vIGxvY2FsU3RvcmFnZS4gQmFpbCBiZWZvcmUgYW55IHNldHVwIHNvIHRoZSBzY3JpcHQgaXMgYSB0cnVlIG5vLW9wCiAgLy8gZm9yIHRoYXQgb3JpZ2luIOKAlCBubyBvYnNlcnZlcnMsIG5vIGxpc3RlbmVycywgbm8gd29yay4gT3RoZXIKICAvLyBvcmlnaW5zIGFyZSB1bmFmZmVjdGVkIGJlY2F1c2UgbG9jYWxTdG9yYWdlIGlzIHBhcnRpdGlvbmVkIHBlci1vcmlnaW4uCiAgLy8gV2UgYWxzbyBzZWVkIHRoZSBjYWNoZWQgYF9zaXRlRGlzYWJsZWRgIGZsYWcgaGVyZSAoaXJyZWxldmFudCBpZiB3ZQogIC8vIHJldHVybiwgYnV0IGtlZXBzIHRoZSBjYWNoZSBsaXZlIGluIHRoZSBub3QteWV0LWRpc2FibGVkIGNhc2UpLgogIF9zaXRlRGlzYWJsZWQgPSByZWFkU2l0ZURpc2FibGVkKCk7CiAgaWYgKF9zaXRlRGlzYWJsZWQpIHJldHVybjsKCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCiAgICAgIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgc2V0dXBBdXRvUGljdHVyZUluUGljdHVyZSgpOwogIH0KfSkoKTs="},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUKCmNvbnN0IHNwb29mQnJhbmRzID0gKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgaWYgKGl0ZW0/LmJyYW5kPy50b0xvd2VyQ2FzZSgpID09PSAnYnJhdmUnKSB7CiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGJyYW5kOiAnR29vZ2xlIENocm9tZScgfTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0pOwp9OwoKY29uc3Qgb3JpZ2luYWxCcmFuZHMgPSBuYXZpZ2F0b3I/LnVzZXJBZ2VudERhdGE/LmJyYW5kczsKaWYgKG9yaWdpbmFsQnJhbmRzKSB7CiAgY29uc3Qgc3Bvb2ZlZEJyYW5kcyA9IHNwb29mQnJhbmRzKG9yaWdpbmFsQnJhbmRzKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF2aWdhdG9yVUFEYXRhLnByb3RvdHlwZSwgJ2JyYW5kcycsIHsKICAgIHZhbHVlOiBzcG9vZmVkQnJhbmRzCiAgfSk7Cn0KCmNvbnN0IG9yaWdpbmFsR2V0SGlnaEVudHJvcHlWYWx1ZXMgPQogIE5hdmlnYXRvclVBRGF0YT8ucHJvdG90eXBlPy5nZXRIaWdoRW50cm9weVZhbHVlczsKCmlmIChvcmlnaW5hbEdldEhpZ2hFbnRyb3B5VmFsdWVzKSB7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdmlnYXRvclVBRGF0YS5wcm90b3R5cGUsICdnZXRIaWdoRW50cm9weVZhbHVlcycsIHsKICAgIHZhbHVlOiBhc3luYyBmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcyhoaW50cykgewogICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgb3JpZ2luYWxHZXRIaWdoRW50cm9weVZhbHVlcy5jYWxsKAogICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnREYXRhLAogICAgICAgIGhpbnRzCiAgICAgICk7CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdHMpKSB7CiAgICAgICAgaWYgKGtleSA9PT0gJ2JyYW5kcycgfHwga2V5ID09PSAnZnVsbFZlcnNpb25MaXN0JykgewogICAgICAgICAgcmVzdWx0c1trZXldID0gc3Bvb2ZCcmFuZHMocmVzdWx0c1trZXldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfSk7Cn0KCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICBOYXZpZ2F0b3JVQURhdGEucHJvdG90eXBlLmdldEhpZ2hFbnRyb3B5VmFsdWVzLCAndG9TdHJpbmcnLCB7CiAgdmFsdWU6ICgpID0+ICdmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcygpIHsgW25hdGl2ZSBjb2RlXSB9Jwp9KTsK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play-update.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXktdXBkYXRlLmpzCi8vIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpIHsKICBjb25zdCBob3N0ID0gbG9jYXRpb24uaG9zdG5hbWU7CiAgY29uc3QgSVNfWU9VVFVCRSA9IC8oPzpefC4rXC4peW91dHViZSg/Oi1ub2Nvb2tpZSk/XC5jb20kLy50ZXN0KGhvc3QpOwogIGNvbnN0IElTX1ZJTUVPID0gLyg/Ol58LitcLil2aW1lb1wuY29tJC8udGVzdChob3N0KTsKCiAgLy8gUGFnZSBWaXNpYmlsaXR5IEFQSQogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnaGlkZGVuJywgewogICAgICBnZXQoKSB7IHJldHVybiBmYWxzZTsgfSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgZ2V0KCkgeyByZXR1cm4gJ3Zpc2libGUnOyB9LAogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnb252aXNpYmlsaXR5Y2hhbmdlJywgewogICAgICBnZXQoKSB7IHJldHVybiBudWxsOyB9LAogICAgICBzZXQoKSB7fSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gQmxvY2sgZXZlbnQgZGVsaXZlcnkgKGNhcHR1cmU9dHJ1ZSB0byBpbnRlcmNlcHQgZWFybHkpCiAgY29uc3Qgc3RvcCA9IChlKSA9PiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogIGNvbnN0IElTX0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8CiAgICAgICAgICAgICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICB0cnkgewogICAgLy8gU2tpcCB2aXNpYmlsaXR5Y2hhbmdlIGJsb2NraW5nIG9uIGlPUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1lZGlhIGJhY2tncm91bmRpbmcKICAgIGlmICghSVNfSU9TKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBzdG9wLCB0cnVlKTsKICAgIH0KICB9IGNhdGNoIChlKSB7fQoKICAvLyBGdWxsc2NyZWVuIEFQSSAoVmltZW8pCiAgaWYgKElTX1ZJTUVPKSB7CiAgICB0cnkgewogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHN0b3AsIHRydWUpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIC8vIFlvdVR1YmUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzCiAgaWYgKElTX1lPVVRVQkUpIHsKICAgIC8vIFVzZXIgYWN0aXZpdHkgdHJhY2tpbmcKICAgIGNvbnN0IExBQ1RfUkVGUkVTSCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWluCiAgICB3YWl0Rm9yTGFjdCgoKSA9PiByZWZyZXNoTGFjdCgpLCBMQUNUX1JFRlJFU0gpOwoKICAgIGZ1bmN0aW9uIGdldFZpZGVvKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigneXRkLXBsYXllciB2aWRlbywgI21vdmllX3BsYXllciB2aWRlbywgdmlkZW8nKTsKICAgIH0KCiAgICBsZXQgbGFzdFVzZXJJbnB1dCA9IDA7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CgogICAgLy8gTWVkaWEga2V5cyBnbyB0aHJvdWdoIE1lZGlhU2Vzc2lvbiwgbm90IGtleWRvd24uIFBhdGNoIHRoZSBwcm90b3R5cGUKICAgIC8vIHNvIHBhdXNlL3BsYXkgaGFuZGxlcnMgdXBkYXRlIGxhc3RVc2VySW5wdXQuCiAgICB0cnkgewogICAgICBjb25zdCBvcmlnU2V0ID0gTWVkaWFTZXNzaW9uLnByb3RvdHlwZS5zZXRBY3Rpb25IYW5kbGVyOwogICAgICBNZWRpYVNlc3Npb24ucHJvdG90eXBlLnNldEFjdGlvbkhhbmRsZXIgPSBmdW5jdGlvbihhY3QsIGgpIHsKICAgICAgICByZXR1cm4gb3JpZ1NldC5jYWxsKHRoaXMsIGFjdCwgKGFjdCAhPT0gJ3BhdXNlJyAmJiBhY3QgIT09ICdwbGF5JykgPyBoIDogZnVuY3Rpb24oLi4uYSkgewogICAgICAgICAgbGFzdFVzZXJJbnB1dCA9IERhdGUubm93KCk7CiAgICAgICAgICBpZiAodHlwZW9mIGggPT09ICdmdW5jdGlvbicpIHJldHVybiBoLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICBpZiAodikgYWN0ID09PSAncGF1c2UnID8gdi5wYXVzZSgpIDogdi5wbGF5KCkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBbJ3BhdXNlJywgJ3BsYXknXS5mb3JFYWNoKGEgPT4gbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKGEsIG51bGwpKTsKICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgZnVuY3Rpb24gb25WaWRlb05hdmlnYXRpb24oKSB7CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICAgIGlmIChJU19JT1MpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkZW8gPSBnZXRWaWRlbygpOwogICAgICAgIGlmICghdmlkZW8pIHJldHVybjsKICAgICAgICBpZiAodmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlcikgewogICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB2aWRlby5fYmdQbGF5UGF1c2VIYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHsKICAgICAgICAgIC8vIElmIHVzZXIgY2xpY2tlZCBvciBwcmVzc2VkIGEga2V5IHdpdGhpbiAzcyBiZWZvcmUgdGhlIHBhdXNlLCBpdCdzIGludGVudGlvbmFsCiAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RVc2VySW5wdXQgPCAzMDAwKSByZXR1cm47CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICAgIGlmICh2ICYmIHYucGF1c2VkICYmICF2LmVuZGVkICYmIHYucmVhZHlTdGF0ZSA+PSAyKSB2LnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICB9LCA4MDApOwogICAgICAgIH07CiAgICAgICAgdmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlciA9IGhhbmRsZXI7CiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVyKTsKICAgICAgfSwgMTUwMCk7CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3l0LW5hdmlnYXRlLWZpbmlzaCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1wYWdlLWRhdGEtdXBkYXRlZCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKCiAgICAvLyBTaW11bGF0ZSB1c2VyIGludGVyYWN0aW9uIHRvIHByZXZlbnQgIkFyZSB5b3Ugc3RpbGwgd2F0Y2hpbmc/IgogICAgY29uc3QgSU5URVJBQ1RJT05fSU5URVJWQUwgPSAxMCAqIDYwICogMTAwMDsgLy8gMTAgbWluCiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgaWYgKHBsYXllcikgewogICAgICAgIHBsYXllci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW1vdmUnLCB7IGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICB9CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICB9LCBJTlRFUkFDVElPTl9JTlRFUlZBTCk7CgogICAgLy8gS2VlcCBwbGF5ZXIgc3RhdGUgdXBkYXRlZAogICAgY29uc3QgUExBWUVSX1NUQVRFX0lOVEVSVkFMID0gNjAgKiAxMDAwOyAvLyAxIG1pbgogICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBjb25zdCB2aWRlbyA9IGdldFZpZGVvKCk7CiAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8ucGF1c2VkKSB7CiAgICAgICAgdmlkZW8uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3RpbWV1cGRhdGUnKSk7CiAgICAgIH0KICAgIH0sIFBMQVlFUl9TVEFURV9JTlRFUlZBTCk7CiAgfQoKICBmdW5jdGlvbiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIGRlbGF5ID0gMTAwMCkgewogICAgY29uc3QgbWF4RGVsYXkgPSA2MCAqIDEwMDA7IC8vIGNhcCBhdCA2MHMKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCAnX2xhY3QnKSkgewogICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dCgKICAgICAgICAoKSA9PiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIE1hdGgubWluKGRlbGF5ICogMiwgbWF4RGVsYXkpKSwKICAgICAgICBkZWxheQogICAgICApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaExhY3QoKSB7CiAgICB0cnkgewogICAgICBpZiAod2luZG93Ll9sYWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"brave-yt-sabr-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gWW91VHViZSdzIFNBQlIgKFNlcnZlciBBZGFwdGl2ZSBCaXRyYXRlKSBwcm90b2NvbCBzZW5kcyBhIGJhY2tvZmZUaW1lTXMKLy8gdmFsdWUgdGVsbGluZyB0aGUgcGxheWVyIHRvIHdhaXQgYmVmb3JlIHJlcXVlc3RpbmcgdmlkZW8gZGF0YS4gVGhpcwovLyBjb3ZlcnMgdGhlIGFkIHNsb3QgZHVyYXRpb24uIFdpdGhvdXQgYW4gYWRibG9ja2VyIHRoZSBhZCBmaWxscyB0aGUgd2FpdCwKLy8gc28gdGhlIHVzZXIgbmV2ZXIgbm90aWNlcy4gV2l0aCBhbiBhZGJsb2NrZXIsIHRoZSBhZCBpcyBibG9ja2VkIGJ1dCB0aGUKLy8gYmFja29mZiByZW1haW5zLCBjYXVzaW5nIGEgNC0xNiBzZWNvbmQgc3Bpbm5lci4KLy8gRnJvbTogaHR0cHM6Ly9pdGVyLmNhL3Bvc3QveXQtYWRibG9jay8KLy8KLy8gVHdvLXByb25nZWQgZml4OgovLwovLyAxLiBTUEEgbmF2aWdhdGlvbjogV2hlbiBjbGlja2luZyBiZXR3ZWVuIHZpZGVvcyB3aXRob3V0IGEgcGFnZSByZWxvYWQsCi8vICAgIHRoZSBwbGF5ZXIgcmV1c2VzIHRoZSBvbGQgU0FCUiBzZXNzaW9uICh3aGljaCBtYXkgYWxyZWFkeSBoYXZlIGEKLy8gICAgYmFja29mZikuIE9uIHl0LW5hdmlnYXRlLWZpbmlzaCwgd2Ugc2V0IGlzSW5saW5lUGxheWJhY2tOb0FkIG9uIHRoZQovLyAgICBwbGF5ZXIncyB2aWRlbyBkYXRhICh0ZWxsaW5nIGl0IHRoZXJlJ3Mgbm8gYWQgc2xvdCksIHRoZW4gY2FsbAovLyAgICBjYW5jZWxQbGF5YmFjaygpICsgbG9hZFZpZGVvQnlJZCgpIHRvIGZvcmNlIGEgbmV3IFNBQlIgc2Vzc2lvbi4KLy8KLy8gMi4gU0FCUiByZXNwb25zZSBwYXRjaGluZyAoZnVsbCBwYWdlIGxvYWRzKTogSW50ZXJjZXB0IFNBQlIgc3RyZWFtaW5nCi8vICAgIHJlc3BvbnNlcyBhbmQgcmV3cml0ZSBiYWNrb2ZmVGltZU1zIGluIHRoZSBwcm90b2J1Zi4gVGhpcyBoYW5kbGVzCi8vICAgIHBhZ2UgcmVsb2FkcyBhbmQgZGlyZWN0IG5hdmlnYXRpb25zIHdoZXJlIHRoZSBTQUJSIHNlc3Npb24gd2FzCi8vICAgIGFscmVhZHkgZXN0YWJsaXNoZWQgYmVmb3JlIHRoZSBzY3JpcHRsZXQgY291bGQgaW50ZXJ2ZW5lLgovLwovLyBUbyB1c2UgdGhpcyBzY3JpcHRsZXQ6Ci8vIDEuIEdvIHRvIGJyYXZlOi8vc2V0dGluZ3Mvc2hpZWxkcy9maWx0ZXJzCi8vIDIuIEVuYWJsZSBEZXZlbG9wZXIgbW9kZQovLyAzLiBDbGljayBvbiBjcmVhdGUgbmV3IHNjcmlwdGxldAovLyA0LiBBZGQgdGhpcyBjb250ZW50IGFuZCBuYW1lIGl0IGB1c2VyLXl0LXNhYnItZml4LmpzYAovLyA1LiBBZGQgYSBjdXN0b20gZmlsdGVyOiBgd3d3LnlvdXR1YmUuY29tIyMranModXNlci15dC1zYWJyLWZpeC5qcylgCi8vIDYuIEdvIHRvIFlvdVR1YmUgYW5kIHRlc3QKCihmdW5jdGlvbigpIHsKICAgIGNvbnN0IERFQlVHID0gZmFsc2U7CiAgICBjb25zdCBMT0dfUFJFRklYID0gJ1t5dC1zYWJyLWZpeF0nOwogICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IGVsYXBzZWQgPSAoKSA9PiAoKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMCkudG9GaXhlZCgyKSArICdzJzsKICAgIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7IGlmIChERUJVRykgY29uc29sZS5sb2coTE9HX1BSRUZJWCwgZWxhcHNlZCgpLCAuLi5hcmdzKTsgfTsKCiAgICAvLyBQcmVtaXVtIGFjY291bnRzIGhhdmUgbm8gYWRzIGFuZCBubyBiYWNrb2ZmLCBub3RoaW5nIHRvIGRvLgogICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EjbG9nb1t0aXRsZSo9IlByZW1pdW0iIGldJykpIHJldHVybjsKCiAgICAvLyBQcm9uZyAxOiBPbiBTUEEgbmF2aWdhdGlvbiwgZm9yY2UgYSBuZXcgYWQtZnJlZSBTQUJSIHNlc3Npb24uCiAgICAvLyBTZXQgaXNJbmxpbmVQbGF5YmFja05vQWQgb24gdGhlIHZpZGVvIGRhdGEgc28gdGhlIG5ldyBzZXNzaW9uCiAgICAvLyBkb2Vzbid0IGdldCBhbiBhZCBzbG90LCB0aGVuIHRlYXIgZG93biB0aGUgb2xkIHNlc3Npb24gYW5kIHN0YXJ0IGZyZXNoLgogICAgLy8gSW5pdGlhbGl6ZSB0byB0aGUgY3VycmVudCB2aWQgc28gdGhlIGluaXRpYWwgeXQtbmF2aWdhdGUtZmluaXNoCiAgICAvLyAod2hpY2ggZmlyZXMgb24gcGFnZSBsb2FkIGNvbXBsZXRpb24sIG5vdCBqdXN0IFNQQSBuYXYpIGlzIHRyZWF0ZWQKICAgIC8vIGFzIGEgZHVwbGljYXRlIGFuZCBza2lwcGVkLiBBdm9pZHMgdGVhcmluZyBkb3duIHBsYXliYWNrIG9uIHJlZnJlc2guCiAgICAvLyBXZSBza2lwIHRlYXJkb3duIHdoZW4gdGhlcmUncyBubyBwcmlvciBzZXNzaW9uIHRvIGNsZWFyLgogICAgbGV0IGxhc3RSZWxvYWRlZFZpZCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKSB8fCAnJzsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1uYXZpZ2F0ZS1maW5pc2gnLCAoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkIHx8IHZpZCA9PT0gbGFzdFJlbG9hZGVkVmlkKSByZXR1cm47CiAgICAgICAgY29uc3QgaGFkUHJpb3JTZXNzaW9uID0gbGFzdFJlbG9hZGVkVmlkICE9PSAnJzsKICAgICAgICBsYXN0UmVsb2FkZWRWaWQgPSB2aWQ7CiAgICAgICAgaWYgKCFoYWRQcmlvclNlc3Npb24pIHJldHVybjsKCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgICAgICAgaWYgKCFwbGF5ZXI/LmNhbmNlbFBsYXliYWNrIHx8ICFwbGF5ZXI/LmxvYWRWaWRlb0J5SWQpIHJldHVybjsKCiAgICAgICAgICAgIC8vIFNldCB0aGUgbm8tYWQgZmxhZyBiZWZvcmUgcmVsb2FkaW5nIHNvIHRoZSBuZXcgc2Vzc2lvbiBwaWNrcyBpdCB1cAogICAgICAgICAgICBjb25zdCB2ZCA9IHBsYXllci5nZXRWaWRlb0RhdGE/LigpOwogICAgICAgICAgICBpZiAodmQpIHZkLmlzSW5saW5lUGxheWJhY2tOb0FkID0gdHJ1ZTsKCiAgICAgICAgICAgIHBsYXllci5jYW5jZWxQbGF5YmFjaygpOwogICAgICAgICAgICBwbGF5ZXIubG9hZFZpZGVvQnlJZCh2aWQpOwogICAgICAgICAgICBsb2coJ2ZvcmNlZCBuZXcgU0FCUiBzZXNzaW9uIGZvcicsIHZpZCk7CiAgICAgICAgfSwgMTAwKTsKICAgIH0pOwoKICAgIC8vIFByb25nIDI6IEludGVyY2VwdCBTQUJSIHJlc3BvbnNlcyBhbmQgcGF0Y2ggYmFja29mZlRpbWVNcy4KICAgIC8vIFRlZSB0aGUgYm9keSBzbyBtZWRpYSBjaHVua3MgKD49MTAwMCBieXRlcykgcGFzcyB0aHJvdWdoIHVudG91Y2hlZAogICAgLy8g4oCUIG9ubHkgdGhlIHNtYWxsIGNvbnRyb2wgbWVzc2FnZXMgY2FycnlpbmcgdGhlIGJhY2tvZmYgZmllbGQgZ2V0CiAgICAvLyBidWZmZXJlZCBhbmQgcmUtZW1pdHRlZCBhcyBhIHN5bnRoZXNpemVkIFJlc3BvbnNlLgogICAgY29uc3QgcmVhbEZldGNoID0gd2luZG93LmZldGNoOwoKICAgIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uKHJlc291cmNlLCBpbml0KSB7CiAgICAgICAgY29uc3QgdXJsID0gdHlwZW9mIHJlc291cmNlID09PSAnc3RyaW5nJyA/IHJlc291cmNlIDogKHJlc291cmNlPy51cmwgfHwgJycpOwoKICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdnb29nbGV2aWRlby5jb20nKSAmJiB1cmwuaW5jbHVkZXMoJ3NhYnI9MScpKSB7CiAgICAgICAgICAgIGxldCBybiA9ICcnOwogICAgICAgICAgICB0cnkgeyBybiA9IG5ldyBVUkwodXJsKS5zZWFyY2hQYXJhbXMuZ2V0KCdybicpIHx8ICcnOyB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgIGxvZygnU0FCUiBmZXRjaCBybj0nICsgcm4pOwoKICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgIXJlc3BvbnNlLmJvZHkpIHJldHVybiByZXNwb25zZTsKICAgICAgICAgICAgICAgIC8vIFRlZSBkZWZlbnNpdmVseTogaWYgaXQgdGhyb3dzIChsb2NrZWQgc3RyZWFtLCBicm93c2VyIHF1aXJrKSwKICAgICAgICAgICAgICAgIC8vIGhhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGJhY2sgdG8gYXZvaWQgYnJlYWtpbmcgdGhlIHZpZGVvIGVudGlyZWx5LgogICAgICAgICAgICAgICAgbGV0IHBhc3MsIHNjYW4sIHJlaW5pdDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgW3Bhc3MsIHNjYW5dID0gcmVzcG9uc2UuYm9keS50ZWUoKTsKICAgICAgICAgICAgICAgICAgICByZWluaXQgPSB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LCBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzIH07CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0oc2Nhbi5nZXRSZWFkZXIoKSwgMTAwMCkudGhlbihmdW5jdGlvbihieXRlcykgewogICAgICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1NBQlIgZG9uZSBybj0nICsgcm4pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHBhc3MsIHJlaW5pdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvZygnc21hbGwgcmVzcG9uc2Ugcm49JyArIHJuLCAnc2l6ZT0nICsgYnl0ZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBwYXRjaEJhY2tvZmZGaWVsZChieXRlcywgcm4pOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IG5ldyBSZXNwb25zZShieXRlcywgcmVpbml0KTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2UudXJsLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvdXQsICd0eXBlJywgeyB2YWx1ZTogcmVzcG9uc2UudHlwZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkge30KICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLyBSZWFkIGEgc3RyZWFtIGludG8gYSBVaW50OEFycmF5LiBJZiBlYXJseUV4aXRUaHJlc2hvbGQgaXMgc2V0IGFuZCB0aGUKICAgIC8vIGFjY3VtdWxhdGVkIGJ5dGVzIGNyb3NzIGl0LCBjYW5jZWwgdGhlIHJlYWRlciBhbmQgcmV0dXJuIG51bGwg4oCUIHVzZWQKICAgIC8vIHRvIGJhaWwgb3V0IG9mIGJ1ZmZlcmluZyB3aGVuIHRoZSByZXNwb25zZSBpcyBjbGVhcmx5IGEgbWVkaWEgY2h1bmsKICAgIC8vIGFuZCBzaG91bGQgc3RyZWFtIHN0cmFpZ2h0IHRvIHRoZSBwbGF5ZXIgaW5zdGVhZC4KICAgIGZ1bmN0aW9uIHJlYWRTdHJlYW0ocmVhZGVyLCBlYXJseUV4aXRUaHJlc2hvbGQpIHsKICAgICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gcHVtcChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBuZXcgVWludDhBcnJheSh0b3RhbCk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IG9mZiArPSBjaHVua3NbaV0ubGVuZ3RoLCBpKyspCiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkLnNldChjaHVua3NbaV0sIG9mZik7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2VkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNodW5rcy5wdXNoKHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICAgIHRvdGFsICs9IHJlc3VsdC52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIGlmIChlYXJseUV4aXRUaHJlc2hvbGQgJiYgdG90YWwgPj0gZWFybHlFeGl0VGhyZXNob2xkKSB7CiAgICAgICAgICAgICAgICB0cnkgeyByZWFkZXIuY2FuY2VsKCk7IH0gY2F0Y2goZSkge30KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpLnRoZW4ocHVtcCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gU2NhbiBmb3IgcHJvdG9idWYgZmllbGQgNCAoYmFja29mZlRpbWVNcykgYW5kIHJld3JpdGUgdmFsdWVzID4gNTAwbXMKICAgIC8vIHRvIGEgc21hbGwgcmFuZG9tIHZhbHVlICg1MC0xNTBtcywgbG9va3MgbGlrZSBuYXR1cmFsIGJhY2tvZmYgbm9pc2UKICAgIC8vIHJhdGhlciB0aGFuIGEgY2xlYW4gemVybykuIFByb3RvYnVmIHdpcmUgZm9ybWF0OiBmaWVsZCA0LCB3aXJlIHR5cGUKICAgIC8vIDAgKHZhcmludCkgPSB0YWcgYnl0ZSAweDIwIChmaWVsZF9udW1iZXIgPDwgMyB8IHdpcmVfdHlwZSA9IDQgPDwgMwogICAgLy8gfCAwKS4gVGhlIHZhcmludCB1c2VzIDcgYml0cyBwZXIgYnl0ZSB3aXRoIDB4ODAgYXMgY29udGludWF0aW9uCiAgICAvLyBmbGFnLiBXZSByZXdyaXRlIHRoZSB2YXJpbnQgaW4gcGxhY2UsIGtlZXBpbmcgdGhlIHNhbWUgYnl0ZSBjb3VudAogICAgLy8gc28gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlIHN0YXlzIHZhbGlkLgogICAgZnVuY3Rpb24gcGF0Y2hCYWNrb2ZmRmllbGQoYnl0ZXMsIHJuKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgaWYgKGJ5dGVzW2ldICE9PSAweDIwKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IHZhbCA9IDAsIHNoaWZ0ID0gMCwgZW5kID0gaSArIDE7CiAgICAgICAgICAgIHdoaWxlIChlbmQgPCBieXRlcy5sZW5ndGggJiYgc2hpZnQgPCAzNSkgewogICAgICAgICAgICAgICAgdmFsIHw9IChieXRlc1tlbmRdICYgMHg3ZikgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgICBpZiAoIShieXRlc1tlbmRdICYgMHg4MCkpIHsgZW5kKys7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBzaGlmdCArPSA3OwogICAgICAgICAgICAgICAgZW5kKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbCA+IDUwMCAmJiB2YWwgPCAxMDAwMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IDUwICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKTsKICAgICAgICAgICAgICAgIGxvZygnUEFUQ0ggYmFja29mZj0nICsgdmFsICsgJ21zIOKGkiAnICsgdGFyZ2V0ICsgJ21zIGF0IG9mZnNldD0nICsgaSwgJ3JuPScgKyBybik7CiAgICAgICAgICAgICAgICBsZXQgcG9zID0gaSArIDEsIHJlbWFpbmluZyA9IHRhcmdldDsKICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnl0ZXNbcG9zKytdID0gKHJlbWFpbmluZyAmIDB4N2YpIHwgMHg4MDsKICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPj4+PSA3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnl0ZXNbcG9zXSA9IHJlbWFpbmluZyAmIDB4N2Y7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKERFQlVHKSB7CiAgICAgICAgbGV0IGxhc3RSUyA9IC0xOwogICAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCB2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsKICAgICAgICAgICAgaWYgKCF2KSByZXR1cm47CiAgICAgICAgICAgIGlmICh2LnJlYWR5U3RhdGUgIT09IGxhc3RSUykgewogICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdi5idWZmZXJlZC5sZW5ndGggPiAwID8gdi5idWZmZXJlZC5lbmQoMCkudG9GaXhlZCgxKSA6ICcwJzsKICAgICAgICAgICAgICAgIGxvZygnVklERU8gcnM9JyArIHYucmVhZHlTdGF0ZSwgJ2N0PScgKyB2LmN1cnJlbnRUaW1lLnRvRml4ZWQoMSksICdidWY9JyArIGJ1Ziwgdi5wYXVzZWQgPyAncGF1c2VkJyA6ICdwbGF5aW5nJyk7CiAgICAgICAgICAgICAgICBsYXN0UlMgPSB2LnJlYWR5U3RhdGU7CiAgICAgICAgICAgIH0KICAgICAgICB9LCAyMDApOwogICAgfQoKICAgIGxvZygnbG9hZGVkJyk7Cn0pKCk7Cgo="},{"name":"brave-youtube-playback-speed-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXlvdXR1YmUtcGxheWJhY2stc3BlZWQtZml4LmpzCi8vIFRoaXMgc2NyaXB0IGlzIGluamVjdGVkIGludG8gWW91VHViZSBwYWdlcyB0byB3b3JrIGFyb3VuZCBhIFlvdVR1YmUgYnVnIHdoZXJlCi8vIHRoZSBwbGF5YmFjayBzcGVlZCB3aWxsIG9ubHkgc2F2ZSBmb3IgZnV0dXJlIHZpZGVvcyB3aGVuIHVzaW5nIHRoZSBzbGlkZXIgY29udHJvbHMuCi8vIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHBsYXliYWNrIHNwZWVkIHVzaW5nIHRoZSBidXR0b25zLCB0aGUgbmV3IHNwZWVkIHdpbGwgbm90IGJlIHNhdmVkLgovLyBUaGlzIGNyZWF0ZWQgaXNzdWVzIHdoZXJlLCBpZiB0aGUgdXNlciBhZGp1c3RlZCB0aGUgc2xpZGVyLCBhbmQgdGhlbiBjbGlja2VkIHRoZSAxeCBidXR0b24gdG8KLy8gcmVzZXQgdGhlIHNwZWVkLCB0aGUgc3BlZWQgd291bGQgYmUgcmVzZXQgdG8gMXgsIGJ1dCB0aGVuIGFsbCBmdXR1cmUgdmlkZW9zIHdvdWxkIHBsYXkgYXQgdGhlCi8vIHByZXZpb3VzbHkgc2V0IHNwZWVkLiBUaGUgc2NyaXB0IHdvcmtzIGFyb3VuZCB0aGlzIGJ5IHNhdmluZyB0aGUgcGxheWJhY2sgc3BlZWQgdG8gc2Vzc2lvblN0b3JhZ2UKLy8gd2hlbmV2ZXIgaXQgY2hhbmdlcywgaW5zdGVhZCBvZiByZWx5aW5nIG9uIFlvdVR1YmUncyBkZWZhdWx0IGJlaGF2aW9yLgooZnVuY3Rpb24gKCkgewogIGNvbnN0IEtFWSA9ICd5dC1wbGF5ZXItcGxheWJhY2stcmF0ZSc7CiAgZnVuY3Rpb24gYXR0YWNoKHBsYXllcikgewogICAgaWYgKCFwbGF5ZXIgfHwgIXBsYXllci5hZGRFdmVudExpc3RlbmVyIHx8IHBsYXllci5fX3JhdGVIb29rZWQpIHJldHVybiBmYWxzZTsKICAgIHBsYXllci5fX3JhdGVIb29rZWQgPSB0cnVlOwogICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ29uUGxheWJhY2tSYXRlQ2hhbmdlJywgZnVuY3Rpb24gKHJhdGUpIHsKICAgICAgY29uc3QgdiA9ICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpID8gcmF0ZSA6IChyYXRlICYmIHJhdGUuZGF0YSkgPz8gcmF0ZTsKICAgICAgdHJ5IHsKICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKEtFWSwgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgZGF0YTogU3RyaW5nKHYpLAogICAgICAgICAgY3JlYXRpb246IERhdGUubm93KCkKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoIWF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICBjb25zdCBvbk5hdkZpbmlzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogIH0KfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIHZhZnQKICAgIC8vIGluc3RhbmNlIHRoYXQgZmlnaHRzIGZvciBwbGF5ZXIgY29udHJvbC4gT25seSB0aGUgdG9wIGZyYW1lIGhvc3RzIHRoZSBwbGF5ZXIgb24KICAgIC8vIHR3aXRjaC50di9DSEFOTkVMOyBuZXN0ZWQgYXV4aWxpYXJ5IGZyYW1lcyBhcmUgbm9pc2UuCiAgICAvLyBBbGxvdy1saXN0IGZvciBuZXN0ZWQtZnJhbWUgaW5qZWN0aW9uOiBUd2l0Y2gncyB0aHJlZSBkb2N1bWVudGVkIGVtYmVkIGNvbnRleHRzCiAgICAvLyAoaHR0cHM6Ly9kZXYudHdpdGNoLnR2L2RvY3MvZW1iZWQvdmlkZW8tYW5kLWNsaXBzLykg4oCUIHByZXNlcnZlcyBUd2l0Y2ggc3RyZWFtcwogICAgLy8gZW1iZWRkZWQgb24gdGhpcmQtcGFydHkgc2l0ZXMgd2hlcmUgdmFmdCBydW5zIGluIGFuIGlmcmFtZSB3aG9zZSBwYXJlbnQgaXMgb24KICAgIC8vIGEgZGlmZmVyZW50IG9yaWdpbi4KICAgIC8vIFVzZSB3aW5kb3cuZnJhbWVFbGVtZW50IHRvIGRldGVjdCBuZXN0ZWQgZnJhbWVzIOKAlCBudWxsIG9uIHRvcCBmcmFtZSwgdGhlIGlmcmFtZQogICAgLy8gZWxlbWVudCBvbiBhIHNhbWUtb3JpZ2luIG5lc3RlZCBmcmFtZSwgdGhyb3dzIG9uIGEgY3Jvc3Mtb3JpZ2luIG5lc3RlZCBmcmFtZS4KICAgIC8vIE1vcmUgcmVsaWFibGUgdGhhbiAnd2luZG93ICE9PSB3aW5kb3cudG9wJyBiZWNhdXNlIFRhbXBlcm1vbmtleSB3cmFwcyB3aW5kb3cgaW4gYQogICAgLy8gcHJveHkgd2hlcmUgdGhlIHN0cmljdCBjb21wYXJpc29uIGNhbiByZXR1cm4gdHJ1ZSBldmVuIG9uIHRoZSB0b3AgZnJhbWUuCiAgICBsZXQgX2lzTmVzdGVkID0gZmFsc2U7CiAgICB0cnkgeyBfaXNOZXN0ZWQgPSB3aW5kb3cuZnJhbWVFbGVtZW50ICE9PSBudWxsOyB9IGNhdGNoIChfZSkgeyBfaXNOZXN0ZWQgPSB0cnVlOyB9CiAgICBpZiAoX2lzTmVzdGVkKSB7CiAgICAgICAgY29uc3QgX2hvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfaXNFbWJlZENvbnRleHQgPSBfaG9zdCA9PT0gJ3BsYXllci50d2l0Y2gudHYnIHx8IF9ob3N0ID09PSAnZW1iZWQudHdpdGNoLnR2JyB8fCBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvZW1iZWQvJyk7CiAgICAgICAgaWYgKCFfaXNFbWJlZENvbnRleHQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmFmdCBza2lwcGVkIOKAlCBuZXN0ZWQgZnJhbWUgb24gJyArIF9ob3N0ICsgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgKyAnIChub3QgYSBUd2l0Y2ggZW1iZWQpLiBJZiB5b3Ugc2VlIHRoaXMgb24gdHdpdGNoLnR2L0NIQU5ORUwgdG9wIGZyYW1lLCBwbGVhc2UgcmVwb3J0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJ3VzZSBzdHJpY3QnOwogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gNTg7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2YWZ0IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZhZnQgdicgKyBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnIHNraXBwZWQg4oCUIGFub3RoZXIgc2NyaXB0IGFscmVhZHkgYWN0aXZlICh2JyArIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnKS4gUmVtb3ZlIGR1cGxpY2F0ZSBzY3JpcHRzLicpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb247CiAgICAvLyBDb25maWd1cmF0aW9uIGFuZCBzdGF0ZSBzaGFyZWQgYmV0d2VlbiB3aW5kb3cgYW5kIHdvcmtlciBzY29wZXMKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guIFRoZSBzcGVjaWZpYyB0d2l0Y2gtc3RpdGNoZWQtYWQgREFURVJBTkdFCiAgICAgICAgLy8gbWFya2VyIGlzIGEgc3Vic2V0IG9mIHRoaXMgcHJlZml4LgogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVycyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIiddOwogICAgICAgIHNjb3BlLkFkU2VnbWVudFVSTFBhdHRlcm5zID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24g4oCUIGZvcgogICAgICAgIC8vIGEgMTAwLWxpbmUgbTN1OCBhdCB+MiBwb2xscy9zZWMgZHVyaW5nIGFuIGFkIGJyZWFrLCBob2lzdGluZyB0aGUgVVJMCiAgICAgICAgLy8gcmV3cml0ZSBhbG9uZSBzYXZlcyB+MjAwIHJlZ2V4IGNvbXBpbGF0aW9ucyBwZXIgc2Vjb25kLgogICAgICAgIHNjb3BlLlR3aXRjaEFkVXJsUmV3cml0ZVJlZ2V4ID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVXJpQXR0cmlidXRlUmVnZXggPSAvVVJJPSIoW14iXSspIi87CiAgICAgICAgc2NvcGUuQ2xpZW50SUQgPSAna2ltbmU3OGt4M25jeDZicmdvNG12NndraTVoMWtvJzsKICAgICAgICBzY29wZS5CYWNrdXBQbGF5ZXJUeXBlcyA9IFsKICAgICAgICAgICAgLy8gT3JkZXIgbWF0dGVyczogZmlyc3QgY2xlYW4gdHlwZSB3aW5zLiAnZW1iZWQnIG1vdmVkIHRvIGVuZCDigJQgZmllbGQtb2JzZXJ2ZWQKICAgICAgICAgICAgLy8gVHdpdGNoIHJldHVybnMgR1FMICdzZXJ2ZXIgZXJyb3InIGZvciBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuIG9uIGVtYmVkIHdoZW4KICAgICAgICAgICAgLy8gcmVxdWVzdGVkIGZyb20gdHdpdGNoLnR2IG9yaWdpbiwgd2FzdGluZyB+MjAwLTQwMG1zIHBlciBicmVhayBhcyBmaXJzdC10cnkuCiAgICAgICAgICAgIC8vIEtlcHQgaW4gY2FzZSBpdCBldmVyIHN1Y2NlZWRzIG9uIHNvbWUgY2hhbm5lbC91c2VyIGNvbWJvLgogICAgICAgICAgICAnc2l0ZScsLy9Tb3VyY2UKICAgICAgICAgICAgJ3BvcG91dCcsLy9Tb3VyY2UKICAgICAgICAgICAgJ21vYmlsZV93ZWInLC8vTW9iaWxlCiAgICAgICAgICAgICdlbWJlZCcsLy9Tb3VyY2UgKHVucmVsaWFibGUg4oCUIHNlZSBub3RlIGFib3ZlKQogICAgICAgICAgICAvLyAnYXV0b3BsYXknICgzNjBwKSByZW1vdmVkOiB3aGVuIGNvbW1pdHRlZCBhcyBjeWNsZSBiYWNrdXAsIHRoZSBwbGF5ZXIgZ2V0cyBzdHVjawogICAgICAgICAgICAvLyBpbiBhbiBlbmRsZXNzIGxvYWRpbmcgY2lyY2xlIGFmdGVyIHRoZSBDU0FJLW9ubHkgcGF0aCByZWxlYXNlcyB0aGUgYmFja3VwIOKAlAogICAgICAgICAgICAvLyBhdXRvcGxheSB2YXJpYW50cyBkb24ndCB0cmFuc2l0aW9uIGNsZWFubHkgYmFjayB0byBtYWluIHN0cmVhbSB2YXJpYW50cy4KICAgICAgICAgICAgLy8ncGljdHVyZS1ieS1waWN0dXJlLUNBQ0hFRCcvLzM2MHAgKC1DQUNIRUQgaXMgYW4gaW50ZXJuYWwgc3VmZml4IGFuZCBpcyByZW1vdmVkKQogICAgICAgIF07CiAgICAgICAgc2NvcGUuRmFsbGJhY2tQbGF5ZXJUeXBlID0gJ3NpdGUnOy8vIHdhcyAnZW1iZWQnIOKAlCBzaXRlIGlzIG1vcmUgcmVsaWFibGUgd2hlbiBhbGwgU291cmNlIHR5cGVzIGVuZCB1cCBhZC1sYWRlbgogICAgICAgIHNjb3BlLkZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJ3BvcG91dCc7CiAgICAgICAgc2NvcGUuUHJlZmVyTG93UXVhbGl0eUJhY2t1cCA9IHRydWU7Ly8gSHlicmlkIHNhZmV0eSBuZXQgZm9yIFNTQUktaGVhdnkgYnJlYWtzOiBzdGlja3kgZXNjYXBlIGhhdGNoIChmaXJlcyBhZnRlciB+OHMgc3R1Y2sgaW4gYWxsLXN0cmlwcGVkIHN0YXRlKSArIGF1dG9wbGF5ICgzNjBwKSBhcyBsYXN0LXJlc29ydCBiYWNrdXAgd2hlbiBhbGwgU291cmNlIHR5cGVzIGFyZSBhZC1sYWRlbi4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX3ByZWZlckxvd1F1YWxpdHlCYWNrdXA9ZmFsc2UgdG8gZGlzYWJsZS4KICAgICAgICBzY29wZS5CYWNrdXBTd2FwRmlyc3QgPSB0cnVlOy8vIE9uIGFkIGRldGVjdCwgaW1tZWRpYXRlbHkgc3dhcCB0byBhIGJhY2t1cCBwbGF5ZXItdHlwZSBtM3U4IChUVFYtQUItc3R5bGUpLiBBdm9pZHMgTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkg4oCUIGZld2VyIGxvYWRpbmcgY2lyY2xlcyBpbiBmaWVsZC4gQ29zdDogZXh0cmEgZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhay4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX2JhY2t1cFN3YXBGaXJzdD1mYWxzZSB0byBkaXNhYmxlLgogICAgICAgIHNjb3BlLlNraXBQbGF5ZXJSZWxvYWRPbkhldmMgPSBmYWxzZTsvLyBJZiB0cnVlIHRoaXMgd2lsbCBza2lwIHBsYXllciByZWxvYWQgb24gc3RyZWFtcyB3aGljaCBoYXZlIDJrLzRrIHF1YWxpdHkgKGlmIHlvdSBlbmFibGUgdGhpcyBhbmQgeW91IHVzZSB0aGUgMmsvNGsgcXVhbGl0eSBzZXR0aW5nIHlvdSdsbCBnZXQgZXJyb3IgIzQwMDAgLyAjMzAwMCAvIHNwaW5uaW5nIHdoZWVsIG9uIGNocm9tZSBiYXNlZCBicm93c2VycykKICAgICAgICBzY29wZS5BbHdheXNSZWxvYWRQbGF5ZXJPbkFkID0gZmFsc2U7Ly8gQWx3YXlzIHBhdXNlL3BsYXkgd2hlbiBlbnRlcmluZy9sZWF2aW5nIGFkcwogICAgICAgIHNjb3BlLlJlbG9hZFBsYXllckFmdGVyQWQgPSB0cnVlOy8vIEFmdGVyIHRoZSBhZCBmaW5pc2hlcyBkbyBhIHBsYXllciByZWxvYWQgaW5zdGVhZCBvZiBwYXVzZS9wbGF5CiAgICAgICAgc2NvcGUuUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gMzA7Ly8gTWluaW11bSBzZWNvbmRzIGJldHdlZW4gcmVsb2FkcyDigJQgYnJlYWtzIENTQUkgY2FzY2FkZXMgdHJpZ2dlcmVkIGJ5IHJlbG9hZAogICAgICAgIHNjb3BlLkRpc2FibGVSZWxvYWRDYXAgPSBmYWxzZTsvLyBJZiB0cnVlLCBidWZmZXIgbW9uaXRvciByZWxvYWRzIHVubGltaXRlZCB0aW1lcyAocHJlLXY0NyBiZWhhdmlvciwgcmlzayBvZiBjYXNjYWRlKQogICAgICAgIHNjb3BlLkRyaWZ0Q29ycmVjdGlvblJhdGUgPSAxLjE7Ly8gUGxheWJhY2sgcmF0ZSBmb3IgY2F0Y2hpbmcgdXAgdG8gbGl2ZSBlZGdlIGFmdGVyIHJlbG9hZCAoMCA9IGRpc2FibGUgZHJpZnQgY29ycmVjdGlvbikKICAgICAgICBzY29wZS5FYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSA1Oy8vIE51bWJlciBvZiBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIHRyaWdnZXJpbmcgZWFybHkgcmVsb2FkIChlYWNoIHBvbGwgfjJzLCBzbyA1ID0gfjEwcywgMyA9IH42cywgMTAgPSB+MjBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gdHJ1ZTsvLyBSZW1lbWJlciB3aGljaCBiYWNrdXAgcGxheWVyIHR5cGUgd29ya2VkIGFuZCB0cnkgaXQgZmlyc3Qgb24gbmV4dCBhZCBicmVhawogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1RpbWUgPSAxNTAwOwogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1BsYXllckluZGV4ID0gMjsvL2F1dG9wbGF5CiAgICAgICAgc2NvcGUuSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3MgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHNjb3BlLlN0cmVhbUluZm9zQnlVcmwgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHNjb3BlLkdRTERldmljZUlEID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRWZXJzaW9uID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRTZXNzaW9uID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBudWxsOwogICAgICAgIHNjb3BlLkF1dGhvcml6YXRpb25IZWFkZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgc2NvcGUuU2ltdWxhdGVkQWRzRGVwdGggPSAwOwogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ0ZpeCA9IHRydWU7Ly8gSWYgdHJ1ZSB0aGlzIHdpbGwgcGF1c2UvcGxheSB0aGUgcGxheWVyIHdoZW4gaXQgZ2V0cyBzdHVjayBidWZmZXJpbmcKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEZWxheSA9IDYwMDsvLyBIb3cgb2Z0ZW4gc2hvdWxkIHdlIGNoZWNrIHRoZSBwbGF5ZXIgc3RhdGUgKGluIG1pbGxpc2Vjb25kcykKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdTYW1lU3RhdGVDb3VudCA9IDM7Ly8gSG93IG1hbnkgdGltZXMgb2Ygc2VlaW5nIHRoZSBzYW1lIHBsYXllciBzdGF0ZSB1bnRpbCB3ZSB0cmlnZ2VyIHBhdXNlL3BsYXkgKGl0IHdpbGwgb25seSB0cmlnZ2VyIGl0IG9uZSB0aW1lIHVudGlsIHRoZSBwbGF5ZXIgc3RhdGUgY2hhbmdlcyBhZ2FpbikKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEYW5nZXJab25lID0gMTsvLyBUaGUgYnVmZmVyaW5nIHRpbWUgbGVmdCAoaW4gc2Vjb25kcykgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBwbGF5ZXJzIHBsYXliYWNrIHBvc2l0aW9uIGluIHRoZSBwbGF5ZXIgc3RhdGUgY2hlY2sKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZCA9IGZhbHNlOy8vIElmIHRydWUgdGhpcyB3aWxsIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkgKHBsYXllciByZWxvYWRpbmcgaXMgYmV0dGVyIGF0IGZpeGluZyB0aGUgcGxheWJhY2sgaXNzdWVzIGJ1dCBpdCB0YWtlcyBzbGlnaHRseSBsb25nZXIpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgPSA4MDAwOy8vIE1pbmltdW0gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmV0d2VlbiBlYWNoIHBhdXNlL3BsYXkgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlciBwcmVzc2luZyBwYXVzZS9wbGF5IHdoZW4gdGhlcmUgYXJlIGdlbnVpbmUgYnVmZmVyaW5nIHByb2JsZW1zKQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgPSBmYWxzZTsvLyBFbmFibGUgdGhpcyBpZiB5b3UncmUgZ2V0dGluZyBhbiBpbW1lZGlhdGUgcGF1c2UvcGxheS9yZWxvYWQgYXMgeW91IG9wZW4gYSBzdHJlYW0gKHdoaWNoIGlzIGNhdXNpbmcgdGhlIHN0cmVhbSB0byB0YWtlIGxvbmdlciB0byBsb2FkKS4gT25lIHByb2JsZW0gd2l0aCB0aGlzIGJlaW5nIHRydWUgaXMgdGhhdCBpdCBjYW4gY2F1c2UgdGhlIHBsYXllciB0byBnZXQgc3R1Y2sgaW4gc29tZSBpbnN0YW5jZXMgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIHByZXNzIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQgPSA1Oy8vIEhvdyBmYXIgdGhlIHN0cmVhbSBuZWVkIHRvIG1vdmUgYmVmb3JlIGRvaW5nIHRoZSBidWZmZXJpbmcgbWl0aWdhdGlvbiAoZGVwZW5kcyBvbiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tFbmFibGVkIGJlaW5nIHRydWUpCiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb01heEFnZU1zID0gMzAgKiA2MCAqIDEwMDA7CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgaW4gc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVsZXRlIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBFbmNvZGluZ3NNM1U4OiBlbmNvZGluZ3NNM3U4LAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgICAgIFJlc29sdXRpb25MaXN0OiBbXSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIE1vZGlmaWVkTTNVODogbnVsbCwKICAgICAgICAgICAgSXNVc2luZ01vZGlmaWVkTTNVODogZmFsc2UsCiAgICAgICAgICAgIElzU2hvd2luZ0FkOiBmYWxzZSwKICAgICAgICAgICAgSXNNaWRyb2xsOiBmYWxzZSwKICAgICAgICAgICAgQWRCcmVha1N0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgUG9kTGVuZ3RoOiAxLAogICAgICAgICAgICBIYXNDb25maXJtZWRBZEF0dHJzOiBmYWxzZSwKICAgICAgICAgICAgQ2xlYW5QbGF5bGlzdENvdW50OiAwLAogICAgICAgICAgICBDb25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrczogMCwKICAgICAgICAgICAgQ3NhaU9ubHlUaGlzQnJlYWs6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIEZyZWV6ZVN0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBUb3RhbEFsbFN0cmlwcGVkUG9sbHM6IDAsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZU0zVTg6IG51bGwsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQ6IDAsCiAgICAgICAgICAgIEJhY2t1cEVuY29kaW5nc00zVThDYWNoZTogW10sCiAgICAgICAgICAgIEFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IG51bGwsCiAgICAgICAgICAgIFBpbm5lZEJhY2t1cFBsYXllclR5cGU6IG51bGwsCiAgICAgICAgICAgIExhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBGYWlsZWRCYWNrdXBQbGF5ZXJUeXBlczogbmV3IE1hcCgpLAogICAgICAgICAgICBMb2dnZWRCYWNrdXBBZHNCeVR5cGU6IG51bGwsCiAgICAgICAgICAgIEN5Y2xlUmVzY3VlZFRoaXNCcmVhazogZmFsc2UsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQ291bnQ6IDAsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQXRQb2xsOiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZFRyaWdnZXJlZDogZmFsc2UsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQ6IGZhbHNlLAogICAgICAgICAgICBFc2NhcGVIYXRjaEZpcmVkOiBmYWxzZSwKICAgICAgICAgICAgTGFzdFBsYXllclJlbG9hZDogMCwKICAgICAgICAgICAgUmVsb2FkVGltZXN0YW1wczogW10sCiAgICAgICAgICAgIEhhc0NoZWNrZWRVbmtub3duVGFnczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gbWFza0FzTmF0aXZlKGZuLCBuYW1lKSB7CiAgICAgICAgZm4udG9TdHJpbmcgPSAoKSA9PiAnZnVuY3Rpb24gJyArIG5hbWUgKyAnKCkgeyBbbmF0aXZlIGNvZGVdIH0nOwogICAgICAgIHJldHVybiBmbjsKICAgIH0KICAgIGNvbnN0IGxvZ2dlZENzYWlUeXBlcyA9IG5ldyBTZXQoKTsKICAgIGxldCBpc0FjdGl2ZWx5U3RyaXBwaW5nQWRzID0gZmFsc2U7CiAgICBsZXQgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IGZhbHNlOwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgbGV0IGNhY2hlZFJvb3ROb2RlID0gbnVsbDsvLyBDYWNoZWQgI3Jvb3QgRE9NIGVsZW1lbnQgKG5ldmVyIGNoYW5nZXMgaW4gUmVhY3QgU1BBcykKICAgIGxldCBjYWNoZWRQbGF5ZXJSb290RGl2ID0gbnVsbDsvLyBDYWNoZWQgLnZpZGVvLXBsYXllciBlbGVtZW50CiAgICAvLyBPbmUtc2hvdCBmbGFncyBmb3Igb3ZlcmxheS1oaWRlIGxvZ3MuIFR3aXRjaCdzIFJlYWN0IHRyZWUgcmUtbW91bnRzIFNEQQogICAgLy8gd3JhcHBlcnMgYW5kIGFkLWJyZWFrIGNhcmRzIGNvbnN0YW50bHkgZHVyaW5nIGFuIGFkIGJyZWFrLCBzbyB0aGUKICAgIC8vIGhpZGUtYW5kLWxvZyBmaXJlcyBodW5kcmVkcyBvZiB0aW1lcy4gTG9nIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKICAgIC8vIGhpZGUgdHlwZSBwZXIgcGFnZSBsb2FkLCB0aGVuIHN0YXkgc2lsZW50IOKAlCB0aGUgaGlkZSBpdHNlbGYgc3RpbGwgcnVucwogICAgLy8gb24gZXZlcnkgdGljayB2aWEgZGF0YXNldC1iYXNlZCBkZWR1cC4KICAgIGxldCBsb2dnZWRTZGFIaWRlID0gZmFsc2U7CiAgICAvLyBTdHJpbmdzIHVzZWQgdG8gZGV0ZWN0IGFuZCBoYW5kbGUgY29uZmxpY3RpbmcgVHdpdGNoIHdvcmtlciBvdmVycmlkZXMgKGUuZy4gVHdpdGNoTm9TdWIpCiAgICBjb25zdCB3b3JrZXJTdHJpbmdDb25mbGljdHMgPSBbCiAgICAgICAgJ3R3aXRjaCcsCiAgICAgICAgJ2lzVmFyaWFudEEnLy8gVHdpdGNoTm9TdWIKICAgIF07CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICAvLyBXYWxrIHRoZSBXb3JrZXIgcHJvdG90eXBlIGNoYWluIGFuZCByZW1vdmUgY29uZmxpY3Rpbmcgb3ZlcnJpZGVzCiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocGFyZW50LCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOwogICAgICAgICAgICBwYXJlbnQgPSByZWluc2VydFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVmFsaWRXb3JrZXIod29ya2VyKSB7CiAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gd29ya2VyLnRvU3RyaW5nKCk7CiAgICAgICAgY29uc3QgaGFzQ29uZmxpY3QgPSB3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBjb25zdCBoYXNSZWluc2VydCA9IHdvcmtlclN0cmluZ1JlaW5zZXJ0LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgaWYgKGhhc0NvbmZsaWN0ICYmICFoYXNSZWluc2VydCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgcmVqZWN0ZWQg4oCUIGNvbmZsaWN0IHN0cmluZyBmb3VuZDogJyArIHdvcmtlclN0cmluZ0NvbmZsaWN0cy5maWx0ZXIoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkuam9pbignLCAnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhaGFzQ29uZmxpY3QgfHwgaGFzUmVpbnNlcnQ7CiAgICB9CiAgICAvLyBSZXBsYWNlIHdpbmRvdy5Xb3JrZXIgdG8gaW50ZXJjZXB0IFR3aXRjaCdzIHZpZGVvIHdvcmtlciBhbmQgaW5qZWN0IGFkLWJsb2NraW5nIGxvZ2ljCiAgICBsZXQgaW5qZWN0ZWRCbG9iVXJsID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgLy8gUHJldmVudCBUd2l0Y2ggZnJvbSByZXZva2luZyBvdXIgaW5qZWN0ZWQgd29ya2VyIGJsb2IgVVJMCiAgICAgICAgaWYgKCFVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkKSB7CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gVVJMLnJldm9rZU9iamVjdFVSTDsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwgPT09IGluamVjdGVkQmxvYlVybCkgcmV0dXJuOwogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMLmNhbGwodGhpcywgdXJsKTsKICAgICAgICAgICAgfSwgJ3Jldm9rZU9iamVjdFVSTCcpOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVpbnNlcnQgPSBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod2luZG93Lldvcmtlcik7CiAgICAgICAgY29uc3QgY2xlYW5Xb3JrZXIgPSBnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIGNsZWFuV29ya2VyIHsKICAgICAgICAgICAgY29uc3RydWN0b3IodHdpdGNoQmxvYlVybCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgbGV0IGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gbmV3IFVSTCh0d2l0Y2hCbG9iVXJsKS5vcmlnaW4uZW5kc1dpdGgoJy50d2l0Y2gudHYnKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghaXNUd2l0Y2hXb3JrZXIpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBOb24tVHdpdGNoIHdvcmtlciBza2lwcGVkOiAnICsgdHdpdGNoQmxvYlVybCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUHJlLWNoZWNrOiB2ZXJpZnkgd2UgY2FuIGZldGNoIHRoZSB3b3JrZXIgSlMgYmVmb3JlIGluamVjdGluZwogICAgICAgICAgICAgICAgbGV0IHByZWZldGNoZWRXb3JrZXJKcyA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgeyBwcmVmZXRjaGVkV29ya2VySnMgPSBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghcHJlZmV0Y2hlZFdvcmtlckpzKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFpbGVkIHRvIGZldGNoIHdvcmtlciBKUyDigJQgZmFsbGluZyBiYWNrIHRvIHVubW9kaWZpZWQgd29ya2VyJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGludGVyY2VwdGVkIOKAlCBpbmplY3RpbmcgYWQtYmxvY2sgaG9va3MnKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ0ZldGNoUmVxdWVzdHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgJHtoYXNBZFRhZ3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldE1hdGNoZWRBZFNpZ25pZmllcnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3N0cmlwQWRTZWdtZW50cy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJvY2Vzc00zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2hvb2tXb3JrZXJGZXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7ZGVjbGFyZU9wdGlvbnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldEFjY2Vzc1Rva2VuLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtncWxSZXF1ZXN0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwYXJzZUF0dHJpYnV0ZXMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFdhc21Xb3JrZXJKcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U2VydmVyVGltZUZyb21NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtyZXBsYWNlU2VydmVyVGltZUluTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJ1bmVTdHJlYW1JbmZvcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Y3JlYXRlU3RyZWFtSW5mby50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IGdldFdhc21Xb3JrZXJKcygnJHt0d2l0Y2hCbG9iVXJsLnJlcGxhY2VBbGwoIiciLCAiJTI3Iil9Jyk7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZU9wdGlvbnMoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCA9IHNldEludGVydmFsKHBydW5lU3RyZWFtSW5mb3MsIDUgKiA2MCAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJHtSZWxvYWRQbGF5ZXJBZnRlckFkfTsKICAgICAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSAke1JlbG9hZENvb2xkb3duU2Vjb25kc307CiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9ICR7RGlzYWJsZVJlbG9hZENhcH07CiAgICAgICAgICAgICAgICAgICAgRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gJHtFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGR9OwogICAgICAgICAgICAgICAgICAgIFBpbkJhY2t1cFBsYXllclR5cGUgPSAke1BpbkJhY2t1cFBsYXllclR5cGV9OwogICAgICAgICAgICAgICAgICAgIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPSAke1ByZWZlckxvd1F1YWxpdHlCYWNrdXB9OwogICAgICAgICAgICAgICAgICAgIEJhY2t1cFN3YXBGaXJzdCA9ICR7QmFja3VwU3dhcEZpcnN0fTsKICAgICAgICAgICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9ICcke0ZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlfSc7CiAgICAgICAgICAgICAgICAgICAgR1FMRGV2aWNlSUQgPSAke0dRTERldmljZUlEID8gIiciICsgR1FMRGV2aWNlSUQgKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uSGVhZGVyID0gJHtBdXRob3JpemF0aW9uSGVhZGVyID8gIiciICsgQXV0aG9yaXphdGlvbkhlYWRlciArICInIiA6IHVuZGVmaW5lZH07CiAgICAgICAgICAgICAgICAgICAgQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gJHtDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAiJyIgKyBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gJHtDbGllbnRWZXJzaW9uID8gIiciICsgQ2xpZW50VmVyc2lvbiArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIENsaWVudFNlc3Npb24gPSAke0NsaWVudFNlc3Npb24gPyAiJyIgKyBDbGllbnRTZXNzaW9uICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50VmVyc2lvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFZlcnNpb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50U2Vzc2lvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFNlc3Npb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50SWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJRCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVEZXZpY2VJZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdGZXRjaFJlc3BvbnNlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXNwb25zZURhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIHRpbWVvdXRJZCB9ID0gcGVuZGluZ0ZldGNoUmVxdWVzdHMuZ2V0KHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHJlc3BvbnNlRGF0YS5lcnJvcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSByZXNwb25zZSBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IHRha2VzIHN0YXR1cy9zdGF0dXNUZXh0L2hlYWRlcnMg4oCUIHVybC9yZWRpcmVjdGVkL3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZS4gSVZTIFdBU00gdmFsaWRhdGVzIHRoZXNlIChTcGFkZS90cmFja2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cykgYW5kIHRocm93cyBOZXR3b3JrRXJyb3IgaWYgdGhleSdyZSBtaXNzaW5nIOKAlCBUVFYtQUIgdjYuMy41IGZpeC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VEYXRhLmJvZHksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VEYXRhLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlRGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VEYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICd1cmwnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudXJsIHx8ICcnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICdyZWRpcmVjdGVkJywgeyB2YWx1ZTogISFyZXNwb25zZURhdGEucmVkaXJlY3RlZCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlRGF0YS50eXBlIHx8ICdiYXNpYycsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVHJpZ2dlcmVkUGxheWVyUmVsb2FkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdTaW11bGF0ZUFkcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRlZEFkc0RlcHRoID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpbXVsYXRlZEFkc0RlcHRoOiAnICsgU2ltdWxhdGVkQWRzRGVwdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyA9ICFBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOiAnICsgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGhvb2tXb3JrZXJGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgIGV2YWwod29ya2VyU3RyaW5nKTsKICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICAgICAgICBpbmplY3RlZEJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuZXdCbG9iU3RyXSkpOwogICAgICAgICAgICAgICAgc3VwZXIoaW5qZWN0ZWRCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUFkQmxvY2tCYW5uZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXIoZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgYmFja3VwIHN0cmVhbSBzd2l0Y2hlcyAoc3RhcnQgYW5kIGVuZCBvZiBhZCBicmVhaykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5oYXNBZHMgIT09ICEhcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QmFja3VwU3dpdGNoQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgcG9zaXRpb24gdHJhY2tpbmcgb24gYWQtZW5kIHNvIHRoZSBzdHJlYW0gc3dpdGNoIGdhcCBpc24ndCBkZXRlY3RlZCBhcyBhIGp1bXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5kYXRhLmhhc0FkcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pbkFkQnJlYWsgPSAhIWUuZGF0YS5oYXNBZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGRyaWZ0IGNhdGNoLXVwIHdoZW4gYWRzIHN0YXJ0IOKAlCBkb24ndCBydW4gMS4xeCBkdXJpbmcgYWQgaGFuZGxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5oYXNBZHMgJiYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsIHx8IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKS5wbGF5YmFja1JhdGUgPSAxLjA7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUGF1c2VSZXN1bWVQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdSZWxvYWRQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgZS5kYXRhLmtpbmQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYXN5bmMgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmtleSA9PSAnRmV0Y2hSZXF1ZXN0JykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFJlcXVlc3QgPSBldmVudC5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCBoYW5kbGVXb3JrZXJGZXRjaFJlcXVlc3QoZmV0Y2hSZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlc3BvbnNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZURhdGEKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBXb3JrZXIgY3Jhc2ggcmVjb3Zlcnkg4oCUIElWUyBXQVNNIHdvcmtlciBjYW4gZmlyZSBSdW50aW1lRXJyb3IKICAgICAgICAgICAgICAgIC8vIChlLmcuICJpbmRleCBvdXQgb2YgYm91bmRzIikgYW5kIGRpZS4gQSBzaW5nbGUgY3Jhc2ggZmlyZXMgbXVsdGlwbGUKICAgICAgICAgICAgICAgIC8vIGVycm9yIGV2ZW50czsgZGVkdXBlIHZpYSBhIGxvY2FsIGZsYWcuIE9uIGZpcnN0IGVycm9yLCB0cmlnZ2VyIGEKICAgICAgICAgICAgICAgIC8vIGhhcmQgcmVsb2FkIHZpYSB0aGUgbWFpbiByZWxvYWQgcGF0aCDigJQgVHdpdGNoIHJlLXNwYXducyB0aGUgd29ya2VyCiAgICAgICAgICAgICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBuZXcgcGxheWVyIGluc3RhbmNlLCBhbmQgZXhpc3RpbmcgcmVsb2FkIGNvb2xkb3duCiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50cyBydW5hd2F5IHJlc3RhcnQgbG9vcHMuCiAgICAgICAgICAgICAgICBsZXQgY3Jhc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyYXNoZWQpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBJVlMgV0FTTSB3b3JrZXIgY3Jhc2hlZDogJyArICgoZSAmJiBlLm1lc3NhZ2UpIHx8ICd1bmtub3duIGVycm9yJykgKyAnIOKAlCB0cmlnZ2VyaW5nIGhhcmQgcmVsb2FkIHRvIHJlY292ZXInKTsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUsICdlYXJseScpOyB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGNyYXNoIHJlY292ZXJ5IGZhaWxlZDogJyArIGVyci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbGV0IHdvcmtlckluc3RhbmNlID0gcmVpbnNlcnRXb3JrZXJzKG5ld1dvcmtlciwgcmVpbnNlcnQpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdXb3JrZXInLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VySW5zdGFuY2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkV29ya2VyKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdvcmtlckluc3RhbmNlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIHNldCB0d2l0Y2ggd29ya2VyIGRlbmllZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCkgewogICAgICAgIGlmICghZ2V0V2FzbVdvcmtlckpzLmNhY2hlKSB7CiAgICAgICAgICAgIGdldFdhc21Xb3JrZXJKcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0pIHsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc21Xb3JrZXJKcy5jYWNoZVt0d2l0Y2hCbG9iVXJsXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICBjb25zdCB0ZXh0ID0gcmVxLnJlc3BvbnNlVGV4dDsKICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0gPSB0ZXh0OwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgLy8gSG9vayBmZXRjaCgpIGluIHRoZSB3b3JrZXIgc2NvcGUgdG8gaW50ZXJjZXB0IG0zdTggcGxheWxpc3QgcmVxdWVzdHMgYW5kIGFkIHNlZ21lbnRzCiAgICBmdW5jdGlvbiBob29rV29ya2VyRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2hvb2tXb3JrZXJGZXRjaCAodmFmdCknKTsKICAgICAgICBjb25zdCBCTEFOS19NUDQgPSBuZXcgQmxvYihbVWludDhBcnJheS5mcm9tKGF0b2IoJ0FBQUFLR1owZVhCdGNEUXlBQUFBQVdsemIyMXRjRFF5WkdGemFHRjJZekZwYzI4MmFHeHpaZ0FBQkVsdGIyOTJBQUFBYkcxMmFHUUFBQUFBQUFBQUFBQUFBQUFBQVlhZ0FBQUFBQUFCQUFBQkFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUFCcUhSeVlXc0FBQUJjZEd0b1pBQUFBQU1BQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQVVSdFpHbGhBQUFBSUcxa2FHUUFBQUFBQUFBQUFBQUFBQUFBQUx1QUFBQUFBRlhFQUFBQUFBQXRhR1JzY2dBQUFBQUFBQUFBYzI5MWJnQUFBQUFBQUFBQUFBQUFBRk52ZFc1a1NHRnVaR3hsY2dBQUFBRHZiV2x1WmdBQUFCQnpiV2hrQUFBQUFBQUFBQUFBQUFBa1pHbHVaZ0FBQUJ4a2NtVm1BQUFBQUFBQUFBRUFBQUFNZFhKc0lBQUFBQUVBQUFDemMzUmliQUFBQUdkemRITmtBQUFBQUFBQUFBRUFBQUJYYlhBMFlRQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFnQVFBQUFBQUx1QUFBQUFBQUF6WlhOa2N3QUFBQUFEZ0lDQUlnQUJBQVNBZ0lBVVFCVUFBQUFBQUFBQUFBQUFBQVdBZ0lBQ0VaQUdnSUNBQVFJQUFBQVFjM1IwY3dBQUFBQUFBQUFBQUFBQUVITjBjMk1BQUFBQUFBQUFBQUFBQUJSemRITjZBQUFBQUFBQUFBQUFBQUFBQUFBQUVITjBZMjhBQUFBQUFBQUFBQUFBQWVWMGNtRnJBQUFBWEhScmFHUUFBQUFEQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQW9BQUFBRm9BQUFBQUFHQmJXUnBZUUFBQUNCdFpHaGtBQUFBQUFBQUFBQUFBQUFBQUE5Q1FBQUFBQUJWeEFBQUFBQUFMV2hrYkhJQUFBQUFBQUFBQUhacFpHVUFBQUFBQUFBQUFBQUFBQUJXYVdSbGIwaGhibVJzWlhJQUFBQUJMRzFwYm1ZQUFBQVVkbTFvWkFBQUFBRUFBQUFBQUFBQUFBQUFBQ1JrYVc1bUFBQUFIR1J5WldZQUFBQUFBQUFBQVFBQUFBeDFjbXdnQUFBQUFRQUFBT3h6ZEdKc0FBQUFvSE4wYzJRQUFBQUFBQUFBQVFBQUFKQmhkbU14QUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0FCYUFCSUFBQUFTQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdQLy9BQUFBT21GMlkwTUJUVUFlLytFQUkyZE5RQjZXVW9GQVgvTGdMVUJBUUZBQUFENkFBQTZtRGdBQUhvUUFBOUNXN3k0S0FRQUVhT3VQSUFBQUFCQnpkSFJ6QUFBQUFBQUFBQUFBQUFBUWMzUnpZd0FBQUFBQUFBQUFBQUFBRkhOMGMzb0FBQUFBQUFBQUFBQUFBQUFBQUFBUWMzUmpid0FBQUFBQUFBQUFBQUFBU0cxMlpYZ0FBQUFnZEhKbGVBQUFBQUFBQUFBQkFBQUFBUUFBQUM0QUFBQUFBb0FBQUFBQUFDQjBjbVY0QUFBQUFBQUFBQUlBQUFBQkFBQ0NOUUFBQUFBQ1FBQUEnKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpXSwge3R5cGU6ICd2aWRlby9tcDQnfSk7CiAgICAgICAgY29uc3QgcmVhbEZldGNoID0gZmV0Y2g7CiAgICAgICAgZmV0Y2ggPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuaGFzKHVybCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEJMQU5LX01QNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgnbTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSBhc3luYyBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYXdhaXQgcHJvY2Vzc00zVTgodXJsLCBhd2FpdCByZXNwb25zZS50ZXh0KCksIHJlYWxGZXRjaCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcnNlZFVybC5wYXRobmFtZS5tYXRjaCgvKFteXC9dKykoPz1cLlx3KyQpLyk/LlswXTsKICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ3BhcmVudF9kb21haW5zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlZFVybC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyVGltZSA9IGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCAhPSBudWxsICYmIChhd2FpdCByZWFsRmV0Y2goc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Lm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF0pKS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGVuY29kaW5ncyBhcmUgZGVhZCAodGhlIHN0cmVhbSBwcm9iYWJseSByZXN0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHJlbG9hZC1wZW5kaW5nIGZsYWcgZnJvbSBhIHByaW9yIHN0cmVhbSBzZXNzaW9uIOKAlCB3aXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVsb2FkIHRyaWdnZXJlZCBvbiB0aGUgcHJldmlvdXMgY2hhbm5lbCBibGVlZHMgaW50byB0aGUgbmV3IGNoYW5uZWwncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29sZG93biBjYWxjdWxhdGlvbiwgYmxvY2tpbmcgbGVnaXRpbWF0ZSBlbmQtb2YtYnJlYWsgcmVsb2Fkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5ldyBzdHJlYW0gc2Vzc2lvbiDigJQgY2hhbm5lbDogJyArIGNoYW5uZWxOYW1lICsgJywgQVBJOiAnICsgKFYyQVBJID8gJ3YyJyA6ICd2MScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdID0gc3RyZWFtSW5mbyA9IGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHBhcnNlZFVybC5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBsaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmF0ZTogYXR0cmlidXRlc1snRlJBTUUtUkFURSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNzOiBhdHRyaWJ1dGVzWydDT0RFQ1MnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVybDogbGluZXNbaSArIDFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJsc1tsaW5lc1tpICsgMV1dID0gcmVzb2x1dGlvbkluZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QucHVzaChyZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zQnlVcmxbbGluZXNbaSArIDFdXSA9IHN0cmVhbUluZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBObyByZXNvbHV0aW9ucyBwYXJzZWQgZnJvbSBlbmNvZGluZ3MgbTN1OCDigJQgVHdpdGNoIG1heSBoYXZlIGNoYW5nZWQgdGhlIGZvcm1hdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vbkhldmNSZXNvbHV0aW9uTGlzdCA9IHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QuZmlsdGVyKChlbGVtZW50KSA9PiBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdhdmMnKSB8fCBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdhdjAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHdheXNSZWxvYWRQbGF5ZXJPbkFkIHx8IChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCAmJiBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LnNvbWUoKGVsZW1lbnQpID0+IGVsZW1lbnQuQ29kZWNzLnN0YXJ0c1dpdGgoJ2hldicpIHx8IGVsZW1lbnQuQ29kZWNzLnN0YXJ0c1dpdGgoJ2h2YycpKSAmJiAhU2tpcFBsYXllclJlbG9hZE9uSGV2YykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXS5zdWJzdHJpbmcobGluZXNbaV0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkUmVzb2x1dGlvbiA9IHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gb2xkUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEFyZWEgPSB0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UmVzb2x1dGlvbkluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZXN0RGlmZiA9IEluZmluaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vbkhldmNSZXNvbHV0aW9uTGlzdFtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3N0cmVhbVdpZHRoLCBzdHJlYW1IZWlnaHRdID0gY2FuZGlkYXRlLlJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKChzdHJlYW1XaWR0aCAqIHN0cmVhbUhlaWdodCkgLSB0YXJnZXRBcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpZmYgPSBkaWZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVzb2x1dGlvbkluZm8gPSBjYW5kaWRhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZGlmaWVkTTNVOCBzd2FwICcgKyByZXNTZXR0aW5nc1tjb2RlY3NLZXldICsgJyB0byAnICsgbmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzICsgJyBvbGRSZXM6JyArIG9sZFJlc29sdXRpb24gKyAnIG5ld1JlczonICsgbmV3UmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzfSJgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpICsgMV0gPSBuZXdSZXNvbHV0aW9uSW5mby5VcmwgKyAnICcucmVwZWF0KGkgKyAxKTsvLyBUaGUgc3RyZWFtIGRvZXNuJ3QgbG9hZCB1bmxlc3MgZWFjaCB1cmwgbGluZSBpcyB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCB8fCBBbHdheXNSZWxvYWRQbGF5ZXJPbkFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggPSBsaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZG8gTk9UIHNldCBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgaGVyZS4gSXQgd2FzIHByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdW5jb25kaXRpb25hbGx5IG9uIG5ldyBzdHJlYW0gc2Vzc2lvbiBjcmVhdGlvbiwgd2hpY2ggY2F1c2VkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVuZC1vZi1icmVhayByZWxvYWQgb2YgZXZlcnkgbmV3IGNoYW5uZWwgdG8gYmUgYmxvY2tlZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb2xkb3duIOKAlCB0aGUgY29vbGRvd24gY2hlY2sgdHJlYXRlZCB0aGUgc2Vzc2lvbi1jcmVhdGlvbiB0aW1lc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHJlY2VudCByZWxvYWQsIGV2ZW4gdGhvdWdoIG5vIHJlbG9hZCBoYWQgYWN0dWFsbHkgb2NjdXJyZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID8gc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggOiBzdHJlYW1JbmZvLkVuY29kaW5nc00zVTgsIHNlcnZlclRpbWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXIocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC8jRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKFteIl0rKSIvKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAxID8gbWF0Y2hlc1sxXSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC9TRVJWRVItVElNRT0iKFswLTkuXSspIi8pOwogICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gcmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoZW5jb2RpbmdzTTN1OCwgbmV3U2VydmVyVGltZSkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKCNFWFQtWC1TRVNTSU9OLURBVEE6REFUQS1JRD0iU0VSVkVSLVRJTUUiLFZBTFVFPSIpW14iXSsoIikvLCBgJDEke25ld1NlcnZlclRpbWV9JDJgKSA6IGVuY29kaW5nc00zdTg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTZXJ2ZXJUaW1lID8gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKC8oU0VSVkVSLVRJTUU9IilbMC05Ll0rIi8sIGBTRVJWRVItVElNRT0iJHtuZXdTZXJ2ZXJUaW1lfSJgKSA6IGVuY29kaW5nc00zdTg7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBZFNpZ25pZmllcnMuc29tZSgocykgPT4gdGV4dFN0ci5pbmNsdWRlcyhzKSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpIHsKICAgICAgICByZXR1cm4gQWRTaWduaWZpZXJzLmZpbHRlcigocykgPT4gdGV4dFN0ci5pbmNsdWRlcyhzKSk7CiAgICB9CiAgICAvLyBSZW1vdmUgYWQgc2VnbWVudHMgZnJvbSBhbiBtM3U4IHBsYXlsaXN0IGFuZCBjYWNoZSB0aGVpciBVUkxzIGZvciByZXBsYWNlbWVudAogICAgZnVuY3Rpb24gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIHN0cmlwQWxsU2VnbWVudHMsIHN0cmVhbUluZm8pIHsKICAgICAgICBsZXQgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgbGV0IGluQ3VlT3V0ID0gZmFsc2U7CiAgICAgICAgY29uc3QgbGl2ZVNlZ21lbnRzID0gW107CiAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgIGNvbnN0IG5ld0FkVXJsID0gJ2h0dHBzOi8vdHdpdGNoLnR2JzsKICAgICAgICAvLyBMb2cgYWQgdHJhY2tpbmcgYXR0cmlidXRlIG5hbWVzIG9uY2UgcGVyIHN0cmVhbSAoaGVscHMgaWRlbnRpZnkgbmV3IGJlYWNvbnMpCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcykgewogICAgICAgICAgICBjb25zdCBhZEF0dHJzID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQURbQS1aLV0qKD89PSIpL2cpOwogICAgICAgICAgICBpZiAoYWRBdHRycyAmJiBhZEF0dHJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkQWRBdHRyaWJ1dGVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHRyYWNraW5nIGF0dHJpYnV0ZXMgc2VlbjogJyArIFsuLi5uZXcgU2V0KGFkQXR0cnMpXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2cgcG90ZW50aWFsIGFkIG1hcmtlcnMgdGhhdCBhcmVuJ3QgaW4gQWRTaWduaWZpZXJzIChjYW5kaWRhdGVzIGZvciBmdXR1cmUgaW5jbHVzaW9uKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycykgewogICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gbmV3IFNldCgpOwogICAgICAgICAgICBsZXQgc207CiAgICAgICAgICAgIGNvbnN0IGNsYXNzUmUgPSAvRVhULVgtREFURVJBTkdFOlteXG5dKkNMQVNTPSIodHdpdGNoLVteIl0rKSIvZzsKICAgICAgICAgICAgd2hpbGUgKChzbSA9IGNsYXNzUmUuZXhlYyh0ZXh0U3RyKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKCdFWFQtWC1EQVRFUkFOR0U6Q0xBU1M9IicgKyBzbVsxXSArICciJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdGFnUmUgPSAvKFNDVEUzNS1bQS1aLV0rfEVYVC1YLUNVRS1bQS1aLV0rKS9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gdGFnUmUuZXhlYyh0ZXh0U3RyKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKHNtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTdWJzdHJpbmcgY2hlY2sgKG5vdCBleGFjdCk6IGEgY2FuZGlkYXRlIGlzICJrbm93biIgaWYgYW55IEFkU2lnbmlmaWVyCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4gIUFkU2lnbmlmaWVycy5zb21lKHMgPT4gYy5pbmNsdWRlcyhzKSkpOwogICAgICAgICAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBvdGVudGlhbCBhZCBtYXJrZXJzIHNlZW4gYnV0IG5vdCBpbiBBZFNpZ25pZmllcnM6ICcgKyB1bmtub3duLmpvaW4oJywgJykgKyAnIChjYW5kaWRhdGVzIGZvciBmdXR1cmUgaW5jbHVzaW9uKScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgLy8gVHJhY2sgU0NURS0zNSBDVUUtT1VUL0NVRS1JTiBhZCBib3VuZGFyaWVzCiAgICAgICAgICAgIGlmIChsaW5lLmluY2x1ZGVzKCdFWFQtWC1DVUUtT1VUJykpIHsKICAgICAgICAgICAgICAgIGlmICghaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1PVVQg4oCUIGFkIGJvdW5kYXJ5IGVudGVyZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluQ3VlT3V0ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCdFWFQtWC1DVUUtSU4nKSkgewogICAgICAgICAgICAgICAgaWYgKGluQ3VlT3V0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU0NURS0zNSBDVUUtSU4g4oCUIGFkIGJvdW5kYXJ5IGV4aXRlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZW1vdmUgdHJhY2tpbmcgdXJscyB3aGljaCBhcHBlYXIgaW4gdGhlIG92ZXJsYXkgVUkKICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lLnJlcGxhY2VBbGwoVHdpdGNoQWRVcmxSZXdyaXRlUmVnZXgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgY29uc3QgaXNMaXZlU2VnbWVudCA9IGxpbmUuaW5jbHVkZXMoJyxsaXZlJyk7CiAgICAgICAgICAgIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAoIWlzTGl2ZVNlZ21lbnQgfHwgc3RyaXBBbGxTZWdtZW50cyB8fCBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgfHwgaW5DdWVPdXQpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50VXJsID0gbGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgaWYgKCFBZFNlZ21lbnRDYWNoZS5oYXMoc2VnbWVudFVybCkpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KHNlZ21lbnRVcmwsIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBBZFNlZ21lbnRVUkxQYXR0ZXJucy5zb21lKChwKSA9PiBsaW5lc1tpICsgMV0uaW5jbHVkZXMocCkpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBzZWdtZW50IGRldGVjdGVkIHZpYSBVUkwgcGF0dGVybjogJyArIGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQobGluZXNbaSArIDFdLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cysrOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIGlzTGl2ZVNlZ21lbnQpIHsKICAgICAgICAgICAgICAgIGxpdmVTZWdtZW50cy5wdXNoKHsgZXh0aW5mOiBsaW5lLCB1cmw6IGxpbmVzW2kgKyAxXSB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFQtWC1QQVJUOicpKSB7CiAgICAgICAgICAgICAgICAvLyBMTC1ITFMgcGFydDogVVJJIGlzIGlubGluZSBhcyBhbiBhdHRyaWJ1dGUuIFN0cmlwIGlmIGl0IG1hdGNoZXMgYSBrbm93bgogICAgICAgICAgICAgICAgLy8gYWQgVVJMIChhbHJlYWR5IGluIGNhY2hlIGZyb20gYSBwYXJhbGxlbCBFWFRJTkYgc3RyaXAsIG9yIG1hdGNoZXMgYSBVUkwgcGF0dGVybikuCiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIHRoZSBwbGF5ZXIgbWF5IHVzZSB0aGUgcGFydHMgcGF0aCB0byBmZXRjaCBhZCBtZWRpYSB2aWEgbG93LWxhdGVuY3kuCiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpTWF0Y2ggPSBsaW5lLm1hdGNoKFVyaUF0dHJpYnV0ZVJlZ2V4KTsKICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmkgPSBwYXJ0VXJpTWF0Y2ggPyBwYXJ0VXJpTWF0Y2hbMV0gOiAnJzsKICAgICAgICAgICAgICAgIGlmIChwYXJ0VXJpICYmIChBZFNlZ21lbnRDYWNoZS5oYXMocGFydFVyaSkgfHwgQWRTZWdtZW50VVJMUGF0dGVybnMuc29tZSgocCkgPT4gcGFydFVyaS5pbmNsdWRlcyhwKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KHBhcnRVcmksIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6JykgfHwgbGluZS5zdGFydHNXaXRoKCcjRVhULVgtUFJFTE9BRC1ISU5UOicpKSB7CiAgICAgICAgICAgICAgICAvLyBMTC1ITFMgcHJlZmV0Y2gvcHJlbG9hZCBoaW50cyBjYW4gcG9pbnQgYXQgdXBjb21pbmcgYWQgc2VnbWVudHMgYmVmb3JlIGFueQogICAgICAgICAgICAgICAgLy8gRVhUSU5GIGxpbmUgb3IgYWQgc2lnbmlmaWVyIGhhcyBtYXRlcmlhbGl6ZWQgaW4gdGhlIHBsYXlsaXN0LiBJZiB3ZSBvbmx5CiAgICAgICAgICAgICAgICAvLyBzdHJpcCBwcmVmZXRjaCBoaW50cyBBRlRFUiBoYXNTdHJpcHBlZEFkU2VnbWVudHMgaXMgc2V0LCB0aGUgZmlyc3QgcG9sbCBvZgogICAgICAgICAgICAgICAgLy8gYW4gYWQgYnJlYWsgY2FuIGxlYWsgYSBwcmVmZXRjaCBoaW50IHBvaW50aW5nIGF0IGFuIGFkIFVSTCDigJQgdGhlIHBsYXllcgogICAgICAgICAgICAgICAgLy8gdGhlbiBwcmUtZmV0Y2hlcyBhZCBtZWRpYSB2aWEgdGhlIExMLUhMUyBwYXRoIGJlZm9yZSBvdXIgdXN1YWwgc3RyaXAgY2F0Y2hlcwogICAgICAgICAgICAgICAgLy8gdXAsIHByb2R1Y2luZyBhbiBhZCBmbGFzaC4gRGV0ZWN0IHRoZSBhZCBVUkwgaGVyZSBzbyBoYXNTdHJpcHBlZEFkU2VnbWVudHMKICAgICAgICAgICAgICAgIC8vIGZsaXBzIG9uIHRoZSBmaXJzdCBwb2xsIGFuZCB0aGUgcG9zdC1sb29wIHVuY29uZGl0aW9uYWwgcHJlZmV0Y2ggc3RyaXAgZmlyZXMuCiAgICAgICAgICAgICAgICAvLyBQb3J0ZWQgZnJvbSBUVFYtQUIgNTJiNDFiNC4KICAgICAgICAgICAgICAgIC8vIEZvcm1hdDogJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6aHR0cHM6Ly91cmwvaGVyZS50cycgKHJhdyBVUkwgYWZ0ZXIgdGhlIGNvbG9uKQogICAgICAgICAgICAgICAgLy8gICAgIG9yOiAnI0VYVC1YLVBSRUxPQUQtSElOVDpUWVBFPVBBUlQsVVJJPSJ1cmwiJyAoVVJJIGF0dHJpYnV0ZSkKICAgICAgICAgICAgICAgIGxldCBoaW50VXJsID0gJyc7CiAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpKSB7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGxpbmUuc3Vic3RyaW5nKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicubGVuZ3RoKS50cmltKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpbnRNYXRjaCA9IGxpbmUubWF0Y2goL1VSST0iKFteIl0rKSIvKTsKICAgICAgICAgICAgICAgICAgICBoaW50VXJsID0gaGludE1hdGNoID8gaGludE1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGludFVybCAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKGhpbnRVcmwpIHx8IEFkU2VnbWVudFVSTFBhdHRlcm5zLnNvbWUoKHApID0+IGhpbnRVcmwuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChoaW50VXJsLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIE1vdmVkIG91dCBvZiB0aGUgcGVyLWxpbmUgbG9vcDogYSBwZXItbGluZSBzY2FuIGZvciBhbnkgc2lnbmlmaWVyIGlzCiAgICAgICAgLy8gc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgZnVsbC10ZXh0IHNjYW4sIHNpbmNlIHRoZSBjaGVjayBoYXMKICAgICAgICAvLyBubyBsaW5lLWxldmVsIHN0YXRlIOKAlCBpdCBqdXN0IGZsaXBzIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWUgb24gZmlyc3QKICAgICAgICAvLyBtYXRjaC4gT25lIHNjYW4gaW5zdGVhZCBvZiBOX2xpbmVzICogTl9zaWduaWZpZXJzIHNjYW5zICh+MTAweCBmZXdlcgogICAgICAgIC8vIGluY2x1ZGVzKCkgY2FsbHMgb24gYSB0eXBpY2FsIDEwMC1saW5lIG0zdTgpLgogICAgICAgIGlmICghaGFzU3RyaXBwZWRBZFNlZ21lbnRzICYmIEFkU2lnbmlmaWVycy5zb21lKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKSkgewogICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoaGFzU3RyaXBwZWRBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIE5vIGxvdyBsYXRlbmN5IGR1cmluZyBhZHMgKG90aGVyd2lzZSBpdCdzIHBvc3NpYmxlIGZvciB0aGUgcGxheWVyIHRvIHByZWZldGNoIGFuZCBkaXNwbGF5IGFkIHNlZ21lbnRzKQogICAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6JykgfHwgbGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9IDA7CiAgICAgICAgfQogICAgICAgIC8vIENhY2hlIGxpdmUgc2VnbWVudHMgZm9yIHJlY292ZXJ5IChwbHVzIHRoZSBNRURJQS1TRVFVRU5DRSBvZiB0aGUgb2xkZXN0IGNhY2hlZCBzZWdtZW50LAogICAgICAgIC8vIHNvIHRoZSBwbGF5ZXIgYWNjZXB0cyBpbmplY3RlZCByZWNvdmVyeSBzZWdtZW50cyBhcyB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtKQogICAgICAgIGlmIChsaXZlU2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMgPSBsaXZlU2VnbWVudHMuc2xpY2UoLTYpOwogICAgICAgICAgICBjb25zdCBzZXEgPSBwYXJzZUludCgodGV4dFN0ci5tYXRjaCgvI0VYVC1YLU1FRElBLVNFUVVFTkNFOihcZCspLykgfHwgW10pWzFdKTsKICAgICAgICAgICAgaWYgKCFpc05hTihzZXEpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXEgPSBzZXEgKyBNYXRoLm1heCgwLCBsaXZlU2VnbWVudHMubGVuZ3RoIC0gc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSWYgYWxsIHNlZ21lbnRzIHdlcmUgc3RyaXBwZWQsIHRyeSB0byBwcmV2ZW50IGJsYWNrIHNjcmVlbiB2aWEgcmVjb3ZlcnkgY29udGVudC4KICAgICAgICAvLyBQcmVmZXIgdGhlIGZ1bGwtcGxheWxpc3Qgc25hcHNob3QgZnJvbSBhIHJlY2VudCBub24tYWQgcG9sbCAobWlycm9ycyBUVFYtQUIKICAgICAgICAvLyBMYXN0Q2xlYW5OYXRpdmVNM1U4IGFwcHJvYWNoKSDigJQgZ2l2ZXMgdGhlIHBsYXllciA0LTYgbGl2ZSBzZWdtZW50cyB3b3J0aCBvZgogICAgICAgIC8vIGNvbnRlbnQgdnMgdGhlIHRoaW4gcGVyLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUuIEZhbGxzIGJhY2sgdG8gdGhlIHBlci1zZWdtZW50CiAgICAgICAgLy8gY2FjaGUgaWYgdGhlIHNuYXBzaG90IGlzIHN0YWxlIG9yIG1pc3NpbmcuCiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApICsgMTsKICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgKyAxOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0KSBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIC8vIFByaW1hcnk6IGZyZXNoIGZ1bGwtcGxheWxpc3Qgc25hcHNob3QgKDwgMS41cyBvbGQsIG11c3Qgbm90IGl0c2VsZiBjb250YWluIGFkIG1hcmtlcnMpCiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90QWdlID0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0ID8gKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQpIDogSW5maW5pdHk7CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggJiYgc25hcHNob3RBZ2UgPD0gMTUwMCAmJiAhaGFzQWRUYWdzKHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcmV1c2luZyBsYXN0IGNsZWFuIG5hdGl2ZSBwbGF5bGlzdCAoJyArIHNuYXBzaG90QWdlICsgJ21zIG9sZCknKTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gaGFzU3RyaXBwZWRBZFNlZ21lbnRzOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVODsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGYWxsYmFjazogcGVyLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUgKGV4aXN0aW5nIGJlaGF2aW9yKQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzICYmIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJlc3RvcmluZyAnICsgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCArICcgcmVjb3Zlcnkgc2VnbWVudHMnKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXEgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbal0gPSAnI0VYVC1YLU1FRElBLVNFUVVFTkNFOicgKyBzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0uZXh0aW5mKTsKICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50c1tqXS51cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChsaXZlU2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAvLyBSZXNldCBmcmVlemUgY291bnRlciB3aGVuIGxpdmUgc2VnbWVudHMgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gaGFzU3RyaXBwZWRBZFNlZ21lbnRzOwogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgLy8gVGhyb3R0bGUgY2FjaGUgcHJ1bmUgdG8gb25jZSBwZXIgNjBzLiBUaGUgMTIwcyBUVEwgZ2l2ZXMgcGxlbnR5IG9mIGhlYWRyb29tCiAgICAgICAgLy8gYW5kIHNjYW5uaW5nIHRoZSBmdWxsIGNhY2hlIG9uIGV2ZXJ5IG0zdTggcG9sbCBhZGRzIHVwIGR1cmluZyBoZWF2eSBhZCBicmVhawogICAgICAgIC8vIHNlcXVlbmNlcyAoTEwtSExTIGNhbiBwb2xsIG11bHRpcGxlIHRpbWVzIHBlciBzZWNvbmQpLiBQb3J0ZWQgZnJvbSBUVFYtQUIuCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCB8fCBub3cgLSBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA+IDYwMDAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0ID0gbm93OwogICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5LCBtYXApID0+IHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IG5vdyAtIDEyMDAwMCkgewogICAgICAgICAgICAgICAgICAgIG1hcC5kZWxldGUoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIERpYWdub3N0aWM6IGxvZyBvbmNlIHBlciBzdHJlYW1JbmZvIHdoZW4gdGhlIGNhY2hlIGNyb3NzZXMgMTAwMCBlbnRyaWVzLAogICAgICAgICAgICAvLyBzbyBjYWNoZSBibG9hdCBmcm9tIGEgZnV0dXJlIFRUTC9wcnVuZSBidWcgd291bGQgc3VyZmFjZSBpbiB1c2VyIHJlcG9ydHMKICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBzdGF5aW5nIGludmlzaWJsZS4KICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLnNpemUgPiAxMDAwICYmICFzdHJlYW1JbmZvLkxvZ2dlZEFkQ2FjaGVTaXplMWspIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxayA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZFNlZ21lbnRDYWNoZSBjcm9zc2VkIDEwMDAgZW50cmllcyAobm93ICcgKyBBZFNlZ21lbnRDYWNoZS5zaXplICsgJykg4oCUIHBvc3NpYmxlIGNhY2hlIGJsb2F0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xuJyk7CiAgICB9CiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG1hdGNoaW5nIHN0cmVhbSBVUkwgZm9yIGEgZ2l2ZW4gcmVzb2x1dGlvbiBmcm9tIGEgbWFzdGVyIG0zdTgKICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBjb25zdCBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgIGxldCBtYXRjaGVkUmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IG1hdGNoZWRGcmFtZVJhdGUgPSBmYWxzZTsKICAgICAgICBsZXQgY2xvc2VzdFJlc29sdXRpb25VcmwgPSBudWxsOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBJbmZpbml0eTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kaW5nc0xpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICAvLyBBY2NlcHQgdjIgQVBJIHZhcmlhbnQgVVJMcyB3aGljaCBhcmUgcmF3IENETiBVUkxzIHdpdGhvdXQgJy5tM3U4JyBpbiB0aGUgcGF0aC4KICAgICAgICAgICAgLy8gdjEgQVBJOiBuZXh0IGxpbmUgaXMgJy4uLmluZGV4LTxyZXNvbHV0aW9uPi5tM3U4Py4uLicKICAgICAgICAgICAgLy8gdjIgQVBJOiBuZXh0IGxpbmUgaXMgYSByYXcgQ0ROIFVSTCBsaWtlICdodHRwczovL3ZpZGVvLWVkZ2UtLi4ubmV0L3YxLy4uLi9jaHVua2VkLy4uLicKICAgICAgICAgICAgLy8gd2l0aG91dCAnLm0zdTgnLiBNYXRjaGluZyBvbmx5IG9uICcubTN1OCcgd291bGQgc2tpcCB2MiB2YXJpYW50cyBlbnRpcmVseSwKICAgICAgICAgICAgLy8gY2F1c2luZyBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uIHRvIHJldHVybiBudWxsIGFuZCBiYWNrdXAgc2VsZWN0aW9uIHRvIGZhaWwuCiAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lID0gZW5jb2RpbmdzTGluZXNbaSArIDFdPy50cmltKCk7CiAgICAgICAgICAgIGlmIChlbmNvZGluZ3NMaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpICYmIG5leHRMaW5lICYmICFuZXh0TGluZS5zdGFydHNXaXRoKCcjJykgJiYgKG5leHRMaW5lLmluY2x1ZGVzKCcubTN1OCcpIHx8IG5leHRMaW5lLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoZW5jb2RpbmdzTGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbiAmJiAoIW1hdGNoZWRSZXNvbHV0aW9uVXJsIHx8ICghbWF0Y2hlZEZyYW1lUmF0ZSAmJiBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlc29sdXRpb25VcmwgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGcmFtZVJhdGUgPSBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25Vcmw7CiAgICB9CiAgICAvLyBDb3JlIGFkLWJsb2NraW5nIGxvZ2ljOiBkZXRlY3QgYWRzIGluIG0zdTgsIGZldGNoIGJhY2t1cCBzdHJlYW1zLCBzdHJpcCBhZCBzZWdtZW50cwogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBpZiAoSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkKSB7CiAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgdW5rbm93bkFkVGFncyA9IHRleHRTdHIubWF0Y2goLyNFWFRbXjpcbl0qKD86YWR8Y3VlfHNjdGV8c3BvbnNvcilbXjpcbl0qL2dpKTsKICAgICAgICAgICAgaWYgKHVua25vd25BZFRhZ3MpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSB1bmtub3duQWRUYWdzLmZpbHRlcih0ID0+ICFBZFNpZ25pZmllcnMuc29tZShzID0+IHQuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVbmtub3duIGFkLXJlbGF0ZWQgdGFncyBmb3VuZDogJyArIFsuLi5uZXcgU2V0KHVua25vd24pXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBoYXZlQWRUYWdzID0gaGFzQWRUYWdzKHRleHRTdHIpIHx8IFNpbXVsYXRlZEFkc0RlcHRoID4gMDsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB0byBjaGV3IG9uIHZzIHRoZSAxLTIgY2FjaGVkIGluZGl2aWR1YWwgc2VnbWVudHMuCiAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgc3JjL21vZHVsZXMvcHJvY2Vzc29yLnRzOjczMy03MzYuCiAgICAgICAgaWYgKCFoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzU2hvd2luZ0FkICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoaGF2ZUFkVGFncykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNaWRyb2xsID0gdGV4dFN0ci5pbmNsdWRlcygnIk1JRFJPTEwiJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnIm1pZHJvbGwiJyk7CiAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkQnJlYWtTdGFydGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgY29uc3QgcG9kTGVuZ3RoTWF0Y2ggPSB0ZXh0U3RyLm1hdGNoKC9YLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIPSIoXGQrKSIvKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aCA9IHBvZExlbmd0aE1hdGNoID8gcGFyc2VJbnQocG9kTGVuZ3RoTWF0Y2hbMV0sIDEwKSA6IDE7CiAgICAgICAgICAgICAgICAvLyBSZXNldCBlYXJseS1yZWxvYWQgc3RhdGUgZm9yIG5ldyBhZCBicmVhazsgYWxsb3cgdXAgdG8gb25lIGVhcmx5IHJlbG9hZCBwZXIgYWQgaW4gcG9kCiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBvZExlbmd0aCA9IHBvZExlbmd0aDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gMDsKICAgICAgICAgICAgICAgIC8vIFRyYWNrIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzIHRvIGRpc3Rpbmd1aXNoIHJlYWwgYWRzIGZyb20gZmFsc2UtcG9zaXRpdmUgc2lnbmlmaWVyIG1hdGNoZXMKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycyA9IHRleHRTdHIuaW5jbHVkZXMoJ1gtVFYtVFdJVENILUFELUFELVNFU1NJT04tSUQnKSB8fCB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1SQURTLVRPS0VOJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkN5Y2xlUmVzY3VlZFRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSA9IG51bGw7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNzYWlPbmx5VGhpc0JyZWFrID0gZmFsc2U7Ly8gUmVzZXQgc3RpY2t5IENTQUkgZmxhZyBmb3IgbmV3IGJyZWFrCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBkZXRlY3RlZCDigJQgdHlwZTogJyArIChzdHJlYW1JbmZvLklzTWlkcm9sbCA/ICdtaWRyb2xsJyA6ICdwcmVyb2xsJykgKyAnLCBjaGFubmVsOiAnICsgc3RyZWFtSW5mby5DaGFubmVsTmFtZSArICcsIHBvZDogJyArIHBvZExlbmd0aCArICcgYWQocykgKH4nICsgKHBvZExlbmd0aCAqIDMwKSArICdzIGV4cGVjdGVkKSwgc2lnbmlmaWVyczogJyArIGdldE1hdGNoZWRBZFNpZ25pZmllcnModGV4dFN0cikuam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnVXBkYXRlQWRCbG9ja0Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLklzTWlkcm9sbCkgewogICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKCcsbGl2ZScpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXF1ZXN0IG9uZSAudHMgZmlsZSBwZXIgLm0zdTggcmVxdWVzdCB0byBhdm9pZCBtYWtpbmcgdG9vIG1hbnkgcmVxdWVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0ZldGNoIGFkIC50cyBmaWxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5hZGQobGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoKGxpbmVzW2kgKyAxXSkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJsb2IoKSkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY3VycmVudFJlc29sdXRpb24gPSBzdHJlYW1JbmZvLlVybHNbdXJsXTsKICAgICAgICAgICAgaWYgKCFjdXJyZW50UmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkcyB3aWxsIGxlYWsgZHVlIHRvIG1pc3NpbmcgcmVzb2x1dGlvbiBpbmZvIGZvciAnICsgdXJsKTsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgZmFsc2UsIHN0cmVhbUluZm8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGlzSGV2YyA9IGN1cnJlbnRSZXNvbHV0aW9uLkNvZGVjcy5zdGFydHNXaXRoKCdoZXYnKSB8fCBjdXJyZW50UmVzb2x1dGlvbi5Db2RlY3Muc3RhcnRzV2l0aCgnaHZjJyk7CiAgICAgICAgICAgIGlmICgoKGlzSGV2YyAmJiAhU2tpcFBsYXllclJlbG9hZE9uSGV2YykgfHwgQWx3YXlzUmVsb2FkUGxheWVyT25BZCkgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggJiYgIXN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnUmVsb2FkUGxheWVyJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3RpY2t5IENTQUkgZmFzdCBwYXRoOiBpZiBhIHByaW9yIHBvbGwgaW4gVEhJUyBicmVhayBhbHJlYWR5IGNvbmZpcm1lZCB0aGUgYnJlYWsKICAgICAgICAgICAgLy8gaXMgQ1NBSS1vbmx5IChhbGwgc2VnbWVudHMgbGl2ZSBvbiBwb2xsIDEpLCBzdGF5IG9uIHRoZSBmYXN0IHBhdGggZm9yIHRoZSByZXN0CiAgICAgICAgICAgIC8vIG9mIHRoZSBicmVhay4gc3RyaXBBZFNlZ21lbnRzIHN0aWxsIGhhbmRsZXMgYW55IHJlYWwgRVhUSU5GIGFkIHNlZ21lbnRzIHRoYXQKICAgICAgICAgICAgLy8gc2hvdyB1cCBvbiBsYXRlciBwb2xscyAodGhleSBnZXQgY2FjaGVkIGFuZCB0aGUgZmV0Y2ggaG9vayByZXR1cm5zIEJMQU5LX01QNCksCiAgICAgICAgICAgIC8vIHNvIGFkcyBhcmUgYmxvY2tlZCBldmVuIHdpdGhvdXQgdGhlIGJhY2t1cCBzd2l0Y2guIFNraXBwaW5nIGJhY2t1cCBzZWFyY2ggZm9yCiAgICAgICAgICAgIC8vIHRoZSB3aG9sZSBDU0FJIGJyZWFrIHNhdmVzIH4yMCB3YXN0ZWQgZmV0Y2hlcyBwZXIgYnJlYWsg4oCUIHRoZSBiYWNrdXAgd291bGRuJ3QKICAgICAgICAgICAgLy8gaGVscCBhbnl3YXkgc2luY2UgZXZlcnkgcGxheWVyIHR5cGUgaGFzIHRoZSBzYW1lIENTQUkgYWRzLiBGbGFnIGlzIGNsZWFyZWQKICAgICAgICAgICAgLy8gb25seSBhdCBicmVhayBlbmQgKElzU2hvd2luZ0FkPWZhbHNlIHBhdGgpLgogICAgICAgICAgICAvLyBTdGlja3kgQ1NBSSBlc2NhcGUgaGF0Y2ggKFByZWZlckxvd1F1YWxpdHlCYWNrdXApOiBhZnRlciB+OHMgc3R1Y2ssIGZhbGwgdGhyb3VnaCB0byBiYWNrdXAgc2VhcmNoLgogICAgICAgICAgICBpZiAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCAmJiBzdHJlYW1JbmZvLkNzYWlPbmx5VGhpc0JyZWFrICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSA0KSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHVja1BvbGxzID0gc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWNvdmVyeUNhY2hlU2l6ZSA9IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDA7CiAgICAgICAgICAgICAgICBjb25zdCBlYXJseVJlbG9hZEluZm8gPSAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApICsgJy8nICsgTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTdGlja3kgQ1NBSSBlc2NhcGUgaGF0Y2gg4oCUIHN0dWNrICcgKyBzdHVja1BvbGxzICsgJyBwb2xscyAoficgKyAoc3R1Y2tQb2xscyAqIDIpICsgJ3MpLCBFYXJseVJlbG9hZENvdW50PScgKyBlYXJseVJlbG9hZEluZm8gKyAnLCByZWNvdmVyeSBjYWNoZT0nICsgcmVjb3ZlcnlDYWNoZVNpemUgKyAnIHNlZ21lbnRzLCBmYWxsaW5nIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayAmJiAhc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4KSB7CiAgICAgICAgICAgICAgICBpZiAoSXNBZFN0cmlwcGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEVhcmx5IHJlbG9hZCBkdXJpbmcgcHJvbG9uZ2VkIGZyZWV6ZSDigJQgbWlycm9ycyB0aGUgY2hlY2sgaW4gdGhlIG5vcm1hbAogICAgICAgICAgICAgICAgLy8gYmFja3VwLXNlYXJjaCBwYXRoIHdoaWNoIHdlJ2Qgb3RoZXJ3aXNlIHNraXAgZW50aXJlbHkgYnkgcmV0dXJuaW5nIGVhcmx5CiAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBzdGlja3kgcGF0aC4gV2l0aG91dCB0aGlzLCBoZWF2eSBTU0FJIGJyZWFrcyBvbiBDU0FJLWNvbmZpcm1lZAogICAgICAgICAgICAgICAgLy8gc3RyZWFtcyBsZWF2ZSB0aGUgcGxheWVyIHJlcGxheWluZyB0aGUgdGhpbiByZWNvdmVyeSBjYWNoZSBmb3IgdGhlIGZ1bGwKICAgICAgICAgICAgICAgIC8vIGJyZWFrIGR1cmF0aW9uIChvYnNlcnZlZDogMzUuOXMgZnJlZXplIG9uIHBvZC0xIGJyZWFrLCAzIGFsbC1zdHJpcHBlZAogICAgICAgICAgICAgICAgLy8gcG9sbHMsIDEtc2VnbWVudCByZWNvdmVyeSBjYWNoZSkuCiAgICAgICAgICAgICAgICAvLyBCb3VuZGVkIHRvIG1heEVhcmx5UmVsb2FkcyBwZXIgYWQgaW4gcG9kIHNvIHJlbG9hZCBsb29wcyBhcmUgaW1wb3NzaWJsZS4KICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0IChzdGlja3kgcGF0aCk6IHN0aWxsIGFkcyDigJQgY29udGludWluZyByZWNvdmVyeSBsb29wJyk7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5UmVjb3ZlcnlUaGluID0gKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApIDwgMzsKICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreU1heEVhcmx5UmVsb2FkcyA9IHN0aWNreVJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgICAgICBjb25zdCBzdGlja3lFZmZlY3RpdmVUaHJlc2hvbGQgPSBzdGlja3lSZWNvdmVyeVRoaW4gPyAxIDogRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkOwogICAgICAgICAgICAgICAgaWYgKEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA+IDAgJiYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApID49IHN0aWNreUVmZmVjdGl2ZVRocmVzaG9sZCAmJiAhc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCAmJiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApIDwgc3RpY2t5TWF4RWFybHlSZWxvYWRzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgPSAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5UmVhc29uID0gc3RpY2t5UmVjb3ZlcnlUaGluID8gJyAodGhpbiByZWNvdmVyeSBjYWNoZTogJyArIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSArICcgc2VnbWVudHMpJyA6ICcnOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCB0cmlnZ2VyZWQgKHN0aWNreSBwYXRoKSDigJQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzICsgJyBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMnICsgc3RpY2t5UmVhc29uICsgJyBbJyArIHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCArICcvJyArIHN0aWNreU1heEVhcmx5UmVsb2FkcyArICddJyk7CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyBrZXk6ICdSZWxvYWRQbGF5ZXInLCBraW5kOiAnZWFybHknIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgbnVtU3RyaXBwZWRBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cywKICAgICAgICAgICAgICAgICAgICBhY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBudWxsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENTQUkgZmFzdCBwYXRoOiBpZiBhbGwgc2VnbWVudHMgaW4gdGhlIG1haW4gc3RyZWFtIGFyZSBsaXZlLCBza2lwIGJhY2t1cCBzZWFyY2guCiAgICAgICAgICAgIC8vIENTQUkgYWRzIGFyZSBkZWxpdmVyZWQgb3V0c2lkZSB0aGUgbTN1OCDigJQgdGhlIG1haW4gc3RyZWFtIHNlZ21lbnRzIGFyZSBjbGVhbi4KICAgICAgICAgICAgLy8gSnVzdCBzdHJpcCB0cmFja2luZyBVUkxzIGFuZCByZXR1cm4gdGhlIG1haW4gc3RyZWFtIGRpcmVjdGx5LCBhdm9pZGluZyB0aGUKICAgICAgICAgICAgLy8gYmFja3VwIHN0cmVhbSBzd2l0Y2ggdGhhdCBjYXVzZXMgYSAyMC00MHMgcmVidWZmZXIgZ2FwLgogICAgICAgICAgICBjb25zdCBtYWluU3RyZWFtTGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICBsZXQgaGFzTm9uTGl2ZVNlZ21lbnQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWluU3RyZWFtTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtYWluU3RyZWFtTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVElORicpICYmICFtYWluU3RyZWFtTGluZXNbaV0uaW5jbHVkZXMoJyxsaXZlJykpIHsKICAgICAgICAgICAgICAgICAgICBoYXNOb25MaXZlU2VnbWVudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmFja3VwU3dhcEZpcnN0IChvcHQtaW4pOiBza2lwIHN0aWNreSBDU0FJIHBhdGggZW50aXJlbHksIGFsd2F5cyBmYWxsIHRocm91Z2ggdG8KICAgICAgICAgICAgLy8gYmFja3VwIHNlYXJjaCBvbiBhZCBkZXRlY3QuIE1pbWljcyBUVFYtQUIncyBiYWNrdXAtc3dhcC1maXJzdCBmbG93IOKAlCBhdm9pZHMKICAgICAgICAgICAgLy8gTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkgKG5vIEJMQU5LX01QNCBpbmplY3Rpb24sIG5vIHJlY292ZXJ5CiAgICAgICAgICAgIC8vIHNlZ21lbnQgcmVwbGF5KSwgd2hpY2ggdXNlcnMgcmVwb3J0IHByb2R1Y2VzIGZld2VyIGxvYWRpbmcgY2lyY2xlcy4gQ29zdDogZXh0cmEKICAgICAgICAgICAgLy8gZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhayAodG9rZW4gcmVxdWVzdHMgZm9yIGVhY2ggYmFja3VwIHR5cGUgdHJpZWQpLgogICAgICAgICAgICBpZiAoIWhhc05vbkxpdmVTZWdtZW50ICYmICFzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggJiYgIUJhY2t1cFN3YXBGaXJzdCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IHRydWU7Ly8gTWFyayBicmVhayBhcyBjb25maXJtZWQgQ1NBSSBzbyBzdWJzZXF1ZW50IHBvbGxzIHN0YXkgb24gdGhlIGZhc3QgcGF0aAogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBmYXN0IHBhdGgg4oCUIGFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoJyk7CiAgICAgICAgICAgICAgICBpZiAoSXNBZFN0cmlwcGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICAgICAgICAgIGhhc0Fkczogc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCwKICAgICAgICAgICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBiYWNrdXBTZWFyY2hTdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIGxldCBiYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2t1cE0zdTggPSBudWxsOwogICAgICAgICAgICBsZXQgZmFsbGJhY2tNM3U4ID0gbnVsbDsKICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwOwogICAgICAgICAgICBsZXQgaXNEb2luZ01pbmltYWxSZXF1ZXN0cyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID4gRGF0ZS5ub3coKSAtIFBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1RpbWUpIHsKICAgICAgICAgICAgICAgIC8vIFdoZW4gZG9pbmcgcGxheWVyIHJlbG9hZCB0aGVyZSBhcmUgYSBsb3Qgb2YgcmVxdWVzdHMgd2hpY2ggY2F1c2VzIHRoZSBiYWNrdXAgc3RyZWFtIHRvIGxvYWQgaW4gc2xvdy4gQnJpZWZseSBwcmVmZXIgdXNpbmcgYSBzaW5nbGUgdmVyc2lvbiB0byBwcmV2ZW50IGxvbmcgZGVsYXlzCiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gUGxheWVyUmVsb2FkTWluaW1hbFJlcXVlc3RzUGxheWVySW5kZXg7CiAgICAgICAgICAgICAgICBpc0RvaW5nTWluaW1hbFJlcXVlc3RzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUcnkgcGlubmVkIGJhY2t1cCBwbGF5ZXIgdHlwZSBmaXJzdCBpZiBhdmFpbGFibGUKICAgICAgICAgICAgY29uc3QgcGxheWVyVHlwZXNUb1RyeSA9IFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPyBbLi4uQmFja3VwUGxheWVyVHlwZXMsICdhdXRvcGxheSddIDogWy4uLkJhY2t1cFBsYXllclR5cGVzXTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgY29uc3QgcGlubmVkSW5kZXggPSBwbGF5ZXJUeXBlc1RvVHJ5LmluZGV4T2Yoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIGlmIChwaW5uZWRJbmRleCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlc1RvVHJ5LnNwbGljZShwaW5uZWRJbmRleCwgMSk7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS51bnNoaWZ0KHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgcGxheWVyVHlwZUluZGV4ID0gc3RhcnRJbmRleDsgIWJhY2t1cE0zdTggJiYgcGxheWVyVHlwZUluZGV4IDwgcGxheWVyVHlwZXNUb1RyeS5sZW5ndGg7IHBsYXllclR5cGVJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJUeXBlID0gcGxheWVyVHlwZXNUb1RyeVtwbGF5ZXJUeXBlSW5kZXhdOwogICAgICAgICAgICAgICAgY29uc3QgcmVhbFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlLnJlcGxhY2UoJy1DQUNIRUQnLCAnJyk7CiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRBdCA9IHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuZ2V0KHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIGlmIChmYWlsZWRBdCAmJiAoRGF0ZS5ub3coKSAtIGZhaWxlZEF0KSA8IDE1MDAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBpc0Z1bGx5Q2FjaGVkUGxheWVyVHlwZSA9IHBsYXllclR5cGUgIT0gcmVhbFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FjaGVzIHRoZSBtM3U4IGlmIGl0IGRvZXNuJ3QgaGF2ZSBhZHMuIElmIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGhhcyBhZHMgaXQgZmV0Y2hlcyBhIG5ldyB2ZXJzaW9uIChzZWNvbmQgbG9vcCkKICAgICAgICAgICAgICAgICAgICBsZXQgaXNGcmVzaE0zdTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RpbmdzTTN1OCA9IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdOwogICAgICAgICAgICAgICAgICAgIGlmICghZW5jb2RpbmdzTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICBpc0ZyZXNoTTN1OCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcmVhbFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IChmbGF0dGVyLCBvYnNlcnZlZCBmb3IgJ2VtYmVkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNwYXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCBzcGF0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXSA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVXNoZXIgSFRUUCAnICsgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyByZWFsUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JCb2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXJyb3JCb2R5ID0gJyDigJQgJyArIChhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLnRleHQoKSkuc3Vic3RyaW5nKDAsIDIwMCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBY2Nlc3MgdG9rZW4gSFRUUCAnICsgYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgKyAnIGZvciAnICsgcmVhbFBsYXllclR5cGUgKyAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDQwMyA/ICcgKGludGVncml0eTogJyArIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAncHJlc2VudCcgOiAnbWlzc2luZycpICsgJyknIDogJycpICsgZXJyb3JCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLnNldChyZWFsUGxheWVyVHlwZSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWNjZXNzIHRva2VuIGZhaWxlZCBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJzogJyArIGVyci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuc2V0KHJlYWxQbGF5ZXJUeXBlLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFVybCA9IGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbTN1OFRleHQgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtM3U4VGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyVHlwZSA9PSBGYWxsYmFja1BsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0FkVGFncyhtM3U4VGV4dCkgJiYgKFNpbXVsYXRlZEFkc0RlcHRoID09IDAgfHwgcGxheWVyVHlwZUluZGV4ID49IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSkpIHx8ICghZmFsbGJhY2tNM3U4ICYmIHBsYXllclR5cGVJbmRleCA+PSBwbGF5ZXJUeXBlc1RvVHJ5Lmxlbmd0aCAtIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApID49IDEgJiYgIWhhc0FkVGFncyhtM3U4VGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2VHlwZSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZUeXBlICYmIHByZXZUeXBlICE9PSBwbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEN5Y2xlIHN3aXRjaGVkIHRvIGRpZmZlcmVudCBjbGVhbiB0eXBlICgnICsgcGxheWVyVHlwZSArICcsIHdhcyAnICsgcHJldlR5cGUgKyAnKSBkdXJpbmcgZnJlZXplIOKAlCByZWNvdmVyZWQgd2l0aG91dCByZWxvYWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBtYXJrIGFzIGN5Y2xlLXJlc2N1ZWQgd2hlbiB3ZSBBQ1RVQUxMWSBzd2l0Y2hlZCBwbGF5ZXIgdHlwZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdHVyYWwgcmVjb3ZlcnkgKHNhbWUgdHlwZSBiZWNhbWUgY2xlYW4pIHN0aWxsIG5lZWRzIHRoZSBlbmQtb2YtYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIHRvIHJlZnJlc2ggdGhlIHBsYXllciBidWZmZXIg4oCUIHNraXBwaW5nIGl0IGxlYXZlcyB0aGUgcGxheWVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0dWNrIHdpdGggbG93IGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBtb25pdG9yIHVuYWJsZSB0byByZWNvdmVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkN5Y2xlUmVzY3VlZFRoaXNCcmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU2FtZSBiYWNrdXAgdHlwZSAoJyArIHBsYXllclR5cGUgKyAnKSBiZWNhbWUgY2xlYW4gZHVyaW5nIGZyZWV6ZSDigJQgbmF0dXJhbCByZWNvdmVyeScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0FkVGFncyhtM3U4VGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUpIHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5oYXMocGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5hZGQocGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSAoJyArIHBsYXllclR5cGUgKyAnKSBhbHNvIGhhcyBhZHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdWxseUNhY2hlZFBsYXllclR5cGUgfHwgaXNEb2luZ01pbmltYWxSZXF1ZXN0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IHBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDeWNsZSB0aHJvdWdoIGFsbCBwbGF5ZXIgdHlwZXMgbG9va2luZyBmb3IgYSBjbGVhbiBiYWNrdXAuIE9ubHkgY29tbWl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGFkLWxhZGVuIGJhY2t1cCBhcyBhIGxhc3QgcmVzb3J0IHdoZW4gd2UndmUgZXhoYXVzdGVkIGFsbCBvcHRpb25zLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQUiAjODkgcHJldmlvdXNseSBjb21taXR0ZWQgdGhlIGZpcnN0IGFkLWxhZGVuIHR5cGUgaW1tZWRpYXRlbHkg4oCUIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSB2NTggZnJlZXplIHJlZ3Jlc3Npb24gKGlzc3VlICMxMTIpIGJlY2F1c2UgdGhlIHN0cmlwK3JlY292ZXJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3Agd291bGQgZW5nYWdlIGV2ZW4gd2hlbiBhIGNsZWFuIGFsdGVybmF0ZSB3YXMgYXZhaWxhYmxlIG9uIGFub3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxheWVyIHR5cGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3MobTN1OFRleHQpICYmIHBsYXllclR5cGVJbmRleCA+PSBwbGF5ZXJUeXBlc1RvVHJ5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBiYWNrdXAgcGxheWVyIHR5cGVzIGFkLWxhZGVuIOKAlCB0YWtpbmcgJyArIHBsYXllclR5cGUgKyAnIGFzIGxhc3QtcmVzb3J0IGZhbGxiYWNrIChzdHJpcCtyZWNvdmVyeSBwYXRoIHdpbGwgZW5nYWdlKScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IHBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSBmZXRjaCBmYWlsZWQgZm9yICcgKyBwbGF5ZXJUeXBlICsgJyAoc3RhdHVzICcgKyBzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGVycm9yIGZvciAnICsgcGxheWVyVHlwZSArICc6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NNM1U4Q2FjaGVbcGxheWVyVHlwZV0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0ZyZXNoTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFiYWNrdXBNM3U4ICYmIGZhbGxiYWNrTTN1OCkgewogICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IEZhbGxiYWNrUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgIGJhY2t1cE0zdTggPSBmYWxsYmFja00zdTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3RhbGUtY29tbWl0IGd1YXJkOiBtdWx0aXBsZSBwcm9jZXNzTTNVOCBjYWxscyBjYW4gYmUgaW4gZmxpZ2h0IGNvbmN1cnJlbnRseSBmb3IKICAgICAgICAgICAgLy8gdGhlIHNhbWUgc3RyZWFtSW5mbyAob25lIHBlciBtM3U4IHBvbGwpLiBJZiB0aGlzIGJhY2t1cCBzZWFyY2ggc3RhcnRlZCBkdXJpbmcgdGhlCiAgICAgICAgICAgIC8vIGFkIGJyZWFrIGJ1dCBjb21wbGV0ZWQgQUZURVIgYSBsYXRlciBwb2xsIGFscmVhZHkgcmFuIHRoZSBlbmQtb2YtYnJlYWsgcmVzZXQKICAgICAgICAgICAgLy8gKElzU2hvd2luZ0FkID0gZmFsc2UsIEFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBudWxsKSwgY29tbWl0dGluZyB0aGUgYmFja3VwIGhlcmUKICAgICAgICAgICAgLy8gd291bGQgb3ZlcndyaXRlIHRoZSBjbGVhcmVkIHN0YXRlIGFuZCBmZWVkIHN0YWxlIHBsYXlsaXN0IGRhdGEgdG8gdGhlIHBsYXllciwKICAgICAgICAgICAgLy8gY2F1c2luZyBidWZmZXIgcmVjb25jaWxpYXRpb24gZmFpbHVyZXMgYW5kIGEgZm9yY2VkIHJlbG9hZC4gQ2hlY2sgSXNTaG93aW5nQWQKICAgICAgICAgICAgLy8gaGVyZSB0byBkaXNjYXJkIHN0YWxlIHJlc3VsdHMuCiAgICAgICAgICAgIGlmIChiYWNrdXBNM3U4ICYmIHN0cmVhbUluZm8uSXNTaG93aW5nQWQpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBiYWNrdXBNM3U4OwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSA9IGJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlICE9IGJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBiYWNrdXBQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVF1YWxpdHlUeXBlcyA9IFsnZW1iZWQnLCAnc2l0ZScsICdwb3BvdXQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoUGluQmFja3VwUGxheWVyVHlwZSB8fCBzb3VyY2VRdWFsaXR5VHlwZXMuaW5jbHVkZXMoYmFja3VwUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEJsb2NraW5nJHsoc3RyZWFtSW5mby5Jc01pZHJvbGwgPyAnIG1pZHJvbGwgJyA6ICcgJyl9YWRzICgke2JhY2t1cFBsYXllclR5cGV9KSDigJQgYmFja3VwIGZvdW5kIGluICR7RGF0ZS5ub3coKSAtIGJhY2t1cFNlYXJjaFN0YXJ0fW1zYCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5VGllciA9IGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgPyAnMzYwcCcgOiAnU291cmNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1lc2NhcGUgYmFja3VwOiAnICsgYmFja3VwUGxheWVyVHlwZSArICcgKCcgKyBxdWFsaXR5VGllciArICcpIOKAlCByZWNvdmVyZWQgZnJvbSBzdGlja3ktcGF0aCBmcmVlemUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgJiYgUHJlZmVyTG93UXVhbGl0eUJhY2t1cCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvcGxheSBiYWNrdXAgY29tbWl0dGVkIOKAlCAzNjBwIGZhbGxiYWNrIGFmdGVyIFNvdXJjZSB0eXBlcyBhZC1sYWRlbiAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFja3VwTTN1OCAmJiAhc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRGlzY2FyZGVkIHN0YWxlIGJhY2t1cCBjb21taXQgKCcgKyBiYWNrdXBQbGF5ZXJUeXBlICsgJywgJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zKSDigJQgYnJlYWsgZW5kZWQgZHVyaW5nIHNlYXJjaCcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIOKAlCBhZHMgbWF5IGxlYWsuIFRyaWVkOiAnICsgcGxheWVyVHlwZXNUb1RyeS5zbGljZShzdGFydEluZGV4KS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPOiBJbXByb3ZlIGhldmMgc3RyaXBwaW5nLiBJdCBzaG91bGQgYWx3YXlzIHN0cmlwIHdoZW4gdGhlcmUgaXMgYSBjb2RlYyBtaXNtYXRjaCAoYm90aCB3YXlzKQogICAgICAgICAgICBjb25zdCBzdHJpcEhldmMgPSBpc0hldmMgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTg7CiAgICAgICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCB8fCBzdHJpcEhldmMpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgc3RyaXBIZXZjLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghYmFja3VwTTN1OCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc3RyaXBwaW5nIGRpc2FibGVkIGFuZCBubyBiYWNrdXAg4oCUIGFkcyBXSUxMIHNob3cnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBMb2cgcmVsb2FkIG91dGNvbWUgb24gdGhlIHBvbGwgYWZ0ZXIgZWFybHkgcmVsb2FkIHRyaWdnZXJlZAogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpICYmIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdDogcGFydGlhbCDigJQgc29tZSBsaXZlIHNlZ21lbnRzIHJldHVybmVkJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCByZXN1bHQ6IGNsZWFuIOKAlCBmcmVlemUgZW5kZWQnKTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0cmlnZ2VyIGZsYWcgc28gc3Vic2VxdWVudCBmcmVlemVzIHdpdGhpbiB0aGUgc2FtZSBwb2QgY2FuIHJlLWZpcmUgKGJvdW5kZWQgYnkgRWFybHlSZWxvYWRDb3VudC9Qb2RMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0OiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemU6IGlmIHdlJ3ZlIGJlZW4gbG9vcGluZyByZWNvdmVyeSBzZWdtZW50cwogICAgICAgICAgICAvLyBmb3IgTisgcG9sbHMgKH5OeDJzKSwgdHJpZ2dlciBhIHJlbG9hZCB0byBhdHRlbXB0IGZyZXNoIGNvbnRlbnQuIEJvdW5kZWQgdG8gb25lCiAgICAgICAgICAgIC8vIHJlbG9hZCBwZXIgYWQgaW4gdGhlIHBvZCAoZS5nLiAyLWFkIHBvZCA9IHVwIHRvIDIgZWFybHkgcmVsb2FkcykuCiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IG1heEVhcmx5UmVsb2FkcyA9IHJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IG1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24gKyAnIFsnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ICsgJy8nICsgbWF4RWFybHlSZWxvYWRzICsgJ10nKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCsrOwogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBwbGF5bGlzdCBoYXMgbGl2ZSBzZWdtZW50cyDigJQgaWYgbm90LCBiYWNrdXAgc3RyZWFtIGlzIGRlYWQKICAgICAgICAgICAgY29uc3QgaGFzTGl2ZVNlZ21lbnRzID0gdGV4dFN0ci5pbmNsdWRlcygnLGxpdmUnKTsKICAgICAgICAgICAgY29uc3QgY2xlYW5UaHJlc2hvbGQgPSBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9PT0gMCA/IDEgOiAyOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gY2xlYW5UaHJlc2hvbGQgfHwgIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgaWYgKCFoYXNMaXZlU2VnbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGhhcyBubyBsaXZlIHNlZ21lbnRzIOKAlCBmb3JjaW5nIGltbWVkaWF0ZSByZWxvYWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGFkQnJlYWtEdXJhdGlvblNlYyA9IHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCkgLyAxMDAwKS50b0ZpeGVkKDEpIDogJz8nOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZpbmlzaGVkIGJsb2NraW5nIGFkcyDigJQgc3RyaXBwZWQgJyArIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzICsgJyBhZCBzZWdtZW50cywgZHVyYXRpb246ICcgKyBhZEJyZWFrRHVyYXRpb25TZWMgKyAncycpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZEluZm8gPSBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID8gJywgZWFybHkgcmVsb2FkIGF0IHBvbGwgJyArIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgOiAnJzsKICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWxsQ2xvY2tGcmVlemUgPSBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0KSAvIDEwMDApLnRvRml4ZWQoMSkgKyAncyB3YWxsLWNsb2NrJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBicmVhayBzdGF0czogJyArIHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzICsgJyBhbGwtc3RyaXBwZWQgcG9sbHMsIGZyZWV6ZSBkdXJhdGlvbjogJyArIHdhbGxDbG9ja0ZyZWV6ZSArIHJlbG9hZEluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaGFkU3RyaXBwZWRTZWdtZW50cyA9IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMDsKICAgICAgICAgICAgICAgIC8vIE9ubHkgY291bnQgdG93YXJkIGZhbHNlLXBvc2l0aXZlIGd1YXJkIGlmIHRoZSBtM3U4IGxhY2tlZCBoaWdoLWNvbmZpZGVuY2UgYWQgbWFya2Vycy4KICAgICAgICAgICAgICAgIC8vIENvbmZpcm1lZCBhZHMgKHdpdGggWC1UVi1UV0lUQ0gtQUQtQUQtU0VTU0lPTi1JRCBldGMuKSB0aGF0IHByb2R1Y2UgMCBzdHJpcHMgYXJlIHJlYWwgYWRzCiAgICAgICAgICAgICAgICAvLyB3ZSBzdWNjZXNzZnVsbHkgYXZvaWRlZCB2aWEgY2xlYW4gYmFja3VwIOKAlCBub3QgZmFsc2UgcG9zaXRpdmVzLgogICAgICAgICAgICAgICAgaWYgKCFoYWRTdHJpcHBlZFNlZ21lbnRzICYmICFzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPj0gMykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXYXJuaW5nOiAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyArICcgY29uc2VjdXRpdmUgdW5jb25maXJtZWQgYWQgYnJlYWtzIHdpdGggMCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcG9zc2libGUgZmFsc2UgcG9zaXRpdmUgZnJvbSBhZCBzaWduaWZpZXJzJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYWRTdHJpcHBlZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU2hvd2luZ0FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUpIHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gQ1NBSS1vbmx5IGFkIGJyZWFrOiBubyBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkIOKAlCBza2lwIHJlbG9hZCBlbnRpcmVseS4KICAgICAgICAgICAgICAgIGlmICghaGFkU3RyaXBwZWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUktb25seSBhZCBicmVhayAoc3RyaXBwZWQgMCkg4oCUIGNsZWFyaW5nIGJhY2t1cCB3aXRob3V0IHBsYXllciBhY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb246IGlmIEFOWSBiYWNrdXAgd2FzIGNvbW1pdHRlZCBkdXJpbmcgdGhpcyBicmVhayAoZXNjYXBlIGhhdGNoCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgY3ljbGUgcmVzY3VlIHRoYXQgZGlkbid0IG1lZXQgY3ljbGVSZXNjdWVkQ2xlYW5seSBjcml0ZXJpYSksIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIGJ1ZmZlciBoYXMgYWNjdW11bGF0ZWQgbWl4ZWQtc291cmNlIHNlZ21lbnRzIChiYWNrdXAtZmV0Y2hlZAogICAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbHRlcm5hdGUgcGxheWVyLXR5cGUgYWNjZXNzIHRva2VuICsgbmF0aXZlLWZldGNoZWQpLiBNaXhpbmcgY2FuCiAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgYXVkaW8vdmlkZW8gdHJhY2sgdGltZXN0YW1wcyB0byBkaXZlcmdlLCBhbmQgd2l0aG91dCBhIHJlbG9hZCB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBkcmlmdCBjb21wb3VuZHMgYWNyb3NzIHN1YnNlcXVlbnQgZXNjYXBlLWhhdGNoIGJyZWFrcy4gRm9yY2UgYSBoYXJkIHJlbG9hZAogICAgICAgICAgICAgICAgICAgIC8vIHRvIGZsdXNoIHRoZSBNZWRpYVNvdXJjZSBidWZmZXIgKyByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9wbGF5ICgzNjBwKSBzcGVjaWZpY2FsbHksIHRoZSByZWxvYWQgYWxzbyByZXN0b3JlcyBTb3VyY2UKICAgICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IChhdXRvcGxheS1zY29wZWQgdG9rZW4gb25seSBzZXJ2ZXMgMzYwcCB2YXJpYW50IGxhZGRlcikuCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBdXRvcGxheSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGlzQXV0b3BsYXkgPyAnYXV0b3BsYXkgKDM2MHApIOKAlCByZXN0b3JpbmcgU291cmNlIHF1YWxpdHknIDogc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSArICcg4oCUIGZsdXNoaW5nIE1lZGlhU291cmNlIHRvIHByZXZlbnQgQS9WIGRlc3luYyBhY2N1bXVsYXRpb24nOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LWVzY2FwZSByZWxvYWQ6ICcgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcykgc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5wdXNoKERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7IGtleTogJ1JlbG9hZFBsYXllcicsIGtpbmQ6ICdlYXJseScgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEF1dG8tZXNjYWxhdGUgY29vbGRvd246IGlmIDMrIHJlbG9hZHMgaW4gbGFzdCA1IG1pbiwgdHJpcGxlIHRoZSBjb29sZG93bgogICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMpIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzID0gc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzLmZpbHRlcih0ID0+IERhdGUubm93KCkgLSB0IDwgMzAwMDAwKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlY2VudFJlbG9hZHMgPSBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMuZmlsdGVyKHQgPT4gRGF0ZS5ub3coKSAtIHQgPCAzMDAwMDApLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUNvb2xkb3duID0gcmVjZW50UmVsb2FkcyA+PSAzID8gUmVsb2FkQ29vbGRvd25TZWNvbmRzICogMyA6IFJlbG9hZENvb2xkb3duU2Vjb25kczsKICAgICAgICAgICAgICAgIGNvbnN0IHRvb1Nvb25TaW5jZUxhc3RSZWxvYWQgPSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgJiYgKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQpIDwgKGVmZmVjdGl2ZUNvb2xkb3duICogMTAwMCk7CiAgICAgICAgICAgICAgICAvLyBTa2lwIGVuZC1vZi1icmVhayByZWxvYWQgd2hlbiBjeWNsZSByZXNjdWUgaGFuZGxlZCB0aGUgYnJlYWsgY2xlYW5seToKICAgICAgICAgICAgICAgIC8vIGEgZnJlZXplIG9mIOKJpDIgcG9sbHMgKH40cykgd2FzIHJlc29sdmVkIGJ5IHN3aXRjaGluZyB0byBhIGNsZWFuIGJhY2t1cCwKICAgICAgICAgICAgICAgIC8vIGFuZCBubyBlYXJseSByZWxvYWQgd2FzIG5lZWRlZC4gVGhlIHBsYXllciBpcyBvbiBhIGhlYWx0aHkgYmFja3VwIHN0cmVhbQogICAgICAgICAgICAgICAgLy8g4oCUIHJlbG9hZGluZyBqdXN0IHRvIHJldHVybiB0byB0aGUgY2Fub25pY2FsIHBsYXllciB0eXBlIGNhdXNlcyBhbiB1bm5lY2Vzc2FyeQogICAgICAgICAgICAgICAgLy8gfjEtMnMgbG9hZGluZyBjaXJjbGUuCiAgICAgICAgICAgICAgICBjb25zdCBjeWNsZVJlc2N1ZWRDbGVhbmx5ID0gc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgJiYKICAgICAgICAgICAgICAgICAgICAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgPD0gMiAmJgogICAgICAgICAgICAgICAgICAgIChzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgfHwgMCkgPT09IDA7CiAgICAgICAgICAgICAgICBpZiAoY3ljbGVSZXNjdWVkQ2xlYW5seSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEN5Y2xlIHJlc2N1ZSBoYW5kbGVkIHRoZSBicmVhayBjbGVhbmx5IOKAlCBza2lwcGluZyBlbmQtb2YtYnJlYWsgcmVsb2FkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBQb3N0LWFkIHJlbG9hZCBieXBhc3NlcyBjb29sZG93bjogaXQncyBhIGJ1ZmZlciBmbHVzaCB0aWVkIHRvIG5hdHVyYWwgYnJlYWsKICAgICAgICAgICAgICAgIC8vIGVuZCwgbm90IGEgY2FzY2FkZS1yaXNrIHJldHJ5LiBUaGUgYWQgYnJlYWsgY3ljbGUgaXRzZWxmIHJhdGUtbGltaXRzIHRoaXMKICAgICAgICAgICAgICAgIC8vIHBhdGggKG9uY2UgcGVyIGJyZWFrKS4gQ29vbGRvd24gc3RpbGwgZ2F0ZXMgYnVmZmVyLW1vbml0b3IgYW5kIG90aGVyCiAgICAgICAgICAgICAgICAvLyBjYXNjYWRlLXJpc2sgcGF0aHMgdGhhdCBjYW4gZmlyZSByZXBlYXRlZGx5IGluLWJyZWFrLgogICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVsb2FkID0gc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4IHx8IChSZWxvYWRQbGF5ZXJBZnRlckFkICYmIGhhZFN0cmlwcGVkU2VnbWVudHMgJiYgIWN5Y2xlUmVzY3VlZENsZWFubHkpOwogICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlbG9hZCkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5wdXNoKERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdSZWxvYWRQbGF5ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnZWFybHknCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0b29Tb29uU2luY2VMYXN0UmVsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNraXBwaW5nIHJlbG9hZCDigJQgbGFzdCByZWxvYWQgd2FzICcgKyAoKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQpIC8gMTAwMCkudG9GaXhlZCgwKSArICdzIGFnbyAoY29vbGRvd246ICcgKyBlZmZlY3RpdmVDb29sZG93biArICdzJyArIChyZWNlbnRSZWxvYWRzID49IDMgPyAnLCBhdXRvLWVzY2FsYXRlZCBmcm9tICcgKyByZWNlbnRSZWxvYWRzICsgJyByZWxvYWRzIGluIDVtaW4nIDogJycpICsgJyknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdQYXVzZVJlc3VtZVBsYXllcicKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0vLyBlbmQgZWxzZSAobm9uLUNTQUkgcGF0aCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IHN0cmVhbUluZm8uQWN0aXZlQmFja3VwUGxheWVyVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGVzKHN0cikgewogICAgICAgIGlmICghc3RyKSByZXR1cm4ge307CiAgICAgICAgLy8gTm9ybWFsaXplOiBhbHdheXMgcGFzcyBvbmx5IGF0dHJpYnV0ZSBzZWN0aW9uCiAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KDApID09PSAzNSkgeyAvLyAnIycKICAgICAgICAgICAgY29uc3QgaWR4ID0gc3RyLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHN0ciA9IHN0ci5zbGljZShpZHggKyAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcygKICAgICAgICAgICAgc3RyLnNwbGl0KC8oPzpefCwpKCg/OltePV0qKT0oPzoiW14iXSoifFteLF0qKSkvKQogICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB4LmluZGV4T2YoJz0nKTsKICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHguc3Vic3RyaW5nKDAsIGlkeCk7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArIDEpOwogICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBOdW1iZXIuaXNOYU4obnVtKSA/IHZhbHVlLnN0YXJ0c1dpdGgoJyInKSA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWUgOiBudW1dOwogICAgICAgICAgICB9KSk7CiAgICB9CiAgICAvLyBSZXF1ZXN0IGEgcGxheWJhY2sgYWNjZXNzIHRva2VuIGZyb20gVHdpdGNoIEdRTCB1c2luZyB0aGUgZ2l2ZW4gcGxheWVyIHR5cGUKICAgIGZ1bmN0aW9uIGdldEFjY2Vzc1Rva2VuKGNoYW5uZWxOYW1lLCBwbGF5ZXJUeXBlKSB7CiAgICAgICAgY29uc3QgYm9keSA9IHsKICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1BsYXliYWNrQWNjZXNzVG9rZW4nLAogICAgICAgICAgICB2YXJpYWJsZXM6IHsKICAgICAgICAgICAgICAgIGlzTGl2ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGxvZ2luOiBjaGFubmVsTmFtZSwKICAgICAgICAgICAgICAgIGlzVm9kOiBmYWxzZSwKICAgICAgICAgICAgICAgIHZvZElEOiAiIiwKICAgICAgICAgICAgICAgIHBsYXllclR5cGU6IHBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogcGxheWVyVHlwZSA9PSAnYXV0b3BsYXknID8gJ2FuZHJvaWQnIDogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSk7CiAgICB9CiAgICAvLyBTZW5kIGEgR1FMIHJlcXVlc3QgdG8gVHdpdGNoIHZpYSB0aGUgbWFpbiB0aHJlYWQgKHdvcmtlcnMgY2FuJ3QgbWFrZSBjcmVkZW50aWFsZWQgcmVxdWVzdHMpCiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHksIHBsYXllclR5cGUpIHsKICAgICAgICBpZiAoIUdRTERldmljZUlEKSB7CiAgICAgICAgICAgIEdRTERldmljZUlEID0gJyc7CiAgICAgICAgICAgIGNvbnN0IGRjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7CiAgICAgICAgICAgIGNvbnN0IGRjaGFyYWN0ZXJzTGVuZ3RoID0gZGNoYXJhY3RlcnMubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHsKICAgICAgICAgICAgICAgIEdRTERldmljZUlEICs9IGRjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBkY2hhcmFjdGVyc0xlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlEJzogQ2xpZW50SUQsCiAgICAgICAgICAgICdYLURldmljZS1JZCc6IEdRTERldmljZUlELAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSksCiAgICAgICAgICAgIC4uLihDbGllbnRWZXJzaW9uICYmIHsnQ2xpZW50LVZlcnNpb24nOiBDbGllbnRWZXJzaW9ufSksCiAgICAgICAgICAgIC4uLihDbGllbnRTZXNzaW9uICYmIHsnQ2xpZW50LVNlc3Npb24tSWQnOiBDbGllbnRTZXNzaW9ufSkKICAgICAgICB9OwogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGxldCBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgIGxldCBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7CiAgICBsZXQgZHJpZnRDYXRjaFVwVGltZW91dCA9IG51bGw7CiAgICBmdW5jdGlvbiBzdGFydERyaWZ0Q29ycmVjdGlvbih2aWRlb0VsZW1lbnQpIHsKICAgICAgICBpZiAoRHJpZnRDb3JyZWN0aW9uUmF0ZSA8PSAxKSByZXR1cm47CiAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICBpZiAoZHJpZnRDYXRjaFVwVGltZW91dCkgeyBjbGVhclRpbWVvdXQoZHJpZnRDYXRjaFVwVGltZW91dCk7IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOyB9CiAgICAgICAgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IERyaWZ0Q29ycmVjdGlvblJhdGU7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRHJpZnQgY29ycmVjdGlvbjogY2F0Y2hpbmcgdXAgYXQgJyArIERyaWZ0Q29ycmVjdGlvblJhdGUgKyAneCcpOwogICAgICAgIGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgdmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsKICAgICAgICAgICAgICAgIGlmICh2aWQgJiYgdmlkLmJ1ZmZlcmVkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmlkLmJ1ZmZlcmVkLmVuZCh2aWQuYnVmZmVyZWQubGVuZ3RoIC0gMSkgLSB2aWQuY3VycmVudFRpbWUgPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICB2aWQucGxheWJhY2tSYXRlID0gMS4wOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEcmlmdCBjb3JyZWN0aW9uIGNvbXBsZXRlIOKAlCByZXN1bWVkIG5vcm1hbCBwbGF5YmFjayBzcGVlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwVGltZW91dCkgeyBjbGVhclRpbWVvdXQoZHJpZnRDYXRjaFVwVGltZW91dCk7IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOyB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgIH0sIDUwMCk7CiAgICAgICAgZHJpZnRDYXRjaFVwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0cnkgeyB2aWRlb0VsZW1lbnQucGxheWJhY2tSYXRlID0gMS4wOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIGlmIChkcmlmdENhdGNoVXBJbnRlcnZhbCkgeyBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOyB9CiAgICAgICAgICAgIGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOwogICAgICAgIH0sIDMwMDAwKTsKICAgIH0KICAgIGNvbnN0IHBsYXllckJ1ZmZlclN0YXRlID0gewogICAgICAgIGNoYW5uZWxOYW1lOiBudWxsLAogICAgICAgIGhhc1N0cmVhbVN0YXJ0ZWQ6IGZhbHNlLAogICAgICAgIHBvc2l0aW9uOiAwLAogICAgICAgIGJ1ZmZlcmVkUG9zaXRpb246IDAsCiAgICAgICAgYnVmZmVyRHVyYXRpb246IDAsCiAgICAgICAgbnVtU2FtZTogMCwKICAgICAgICBmaXhBdHRlbXB0czogMCwKICAgICAgICBsYXN0Rml4VGltZTogMCwKICAgICAgICBpc0xpdmU6IHRydWUsCiAgICAgICAgbGFzdEJhY2t1cFN3aXRjaEF0OiAwLAogICAgICAgIGxhc3RSZWxvYWRBdDogMCwKICAgICAgICByZWNvdmVyeVJlbG9hZFVzZWQ6IGZhbHNlLAogICAgICAgIHVzZXJQYXVzZUludGVudDogZmFsc2UsCiAgICAgICAgbG9nZ2VkUGF1c2VJbnRlbnQ6IGZhbHNlLAogICAgICAgIHdlSnVzdFBhdXNlZDogMCwKICAgICAgICBpbkFkQnJlYWs6IGZhbHNlCiAgICB9OwogICAgLy8gUG9sbCB0aGUgcGxheWVyIHN0YXRlIHRvIGRldGVjdCBhbmQgZml4IGJ1ZmZlcmluZyBjYXVzZWQgYnkgYWQgc3RyZWFtIHN3aXRjaGluZwogICAgZnVuY3Rpb24gbW9uaXRvclBsYXllckJ1ZmZlcmluZygpIHsKICAgICAgICAvLyBGcmVzaCBwbGF5ZXIgbG9va3VwIGV2ZXJ5IHRpY2sgKGF2b2lkcyBzdGFsZSByZWYgd2hlbiBUd2l0Y2ggcmVzdGFydHMgaXRzIG93biBwbGF5ZXIpCiAgICAgICAgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgICAgIGlmIChwbGF5ZXJBbmRTdGF0ZSAmJiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIgJiYgcGxheWVyQW5kU3RhdGUuc3RhdGUpIHsKICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBsYXllckFuZFN0YXRlLnN0YXRlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgIXZpZGVvLl9fdGFzSW50ZW50SG9va2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uX190YXNJbnRlbnRIb29rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCB8fCAoRGF0ZS5ub3coKSAtIHBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCkgPiAyMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudXNlclBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcucGxheWVyOwogICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnN0YXRlOwogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXIuY29yZSkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnICYmICFwbGF5ZXIuaXNQYXVzZWQoKSAmJiAhcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKT8uZW5kZWQgJiYgKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50KCk/LnJlYWR5U3RhdGUgPz8gMCkgPj0gMSAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA8PSBEYXRlLm5vdygpIC0gUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgJiYgIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdFJlbG9hZEF0ID49IDE1MDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThVcmwgPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG0zdThVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaCA9IG0zdThVcmwubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RhcnQgPSBtM3U4VXJsLmluZGV4T2YoJz8nLCBsYXN0U2xhc2gpOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBtM3U4VXJsLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxLCBxdWVyeVN0YXJ0ICE9PSAtMSA/IHF1ZXJ5U3RhcnQgOiB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lPy5lbmRzV2l0aCgnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gZmlsZU5hbWUuc2xpY2UoMCwgLTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSAhPSBjaGFubmVsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnQ2hhbm5lbCBjaGFuZ2VkIHRvICcgKyBjaGFubmVsTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLmdldFN0YXRlKCkgPT09ICdQbGF5aW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkUG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LmJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyRHVyYXRpb24gPSBwbGF5ZXIuZ2V0QnVmZmVyRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBidWZmZXJlZFBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncG9zaXRpb246JyArIHBvc2l0aW9uICsgJyBidWZmZXJEdXJhdGlvbjonICsgYnVmZmVyRHVyYXRpb24gKyAnIGJ1ZmZlclBvc2l0aW9uOicgKyBidWZmZXJlZFBvc2l0aW9uICsgJyBzdGF0ZTogJyArIHBsYXllci5jb3JlPy5zdGF0ZT8uc3RhdGUgKyAnIHN0YXJ0ZWQ6ICcgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBjb3VsZCBiZSBpbXByb3ZlZC4gSXQgY3VycmVudGx5IGxldHMgdGhlIHBsYXllciBmdWxseSBlYXQgdGhlIGZ1bGwgYnVmZmVyIGJlZm9yZSBpdCB0cmlnZ2VycyBwYXVzZS9wbGF5CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgfHwgcG9zaXRpb24gPiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPT0gcG9zaXRpb24gfHwgYnVmZmVyRHVyYXRpb24gPCBQbGF5ZXJCdWZmZXJpbmdEYW5nZXJab25lKSAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlcmVkUG9zaXRpb24gPT0gYnVmZmVyZWRQb3NpdGlvbiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gPj0gYnVmZmVyRHVyYXRpb24gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3NpdGlvbiAhPSAwIHx8IGJ1ZmZlcmVkUG9zaXRpb24gIT0gMCB8fCBidWZmZXJEdXJhdGlvbiAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID09IFBsYXllckJ1ZmZlcmluZ1NhbWVTdGF0ZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXA6IGF0IG1vc3QgT05FIHJlbG9hZCBwZXIgcmVjb3Zlcnkgd2luZG93LiBBZnRlciByZWxvYWRpbmcgb25jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF5IG9uIHBhdXNlL3BsYXkgdW50aWwgcGxheWJhY2sgcmVjb3ZlcnMuIFByZXZlbnRzIHJlbG9hZCBjYXNjYWRlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3VsZEVzY2FsYXRlID0gcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMgPj0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0ZVRvUmVsb2FkID0gd291bGRFc2NhbGF0ZSAmJiAoRGlzYWJsZVJlbG9hZENhcCB8fCAhcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxvYWRDYXBOb3RlID0gd291bGRFc2NhbGF0ZSAmJiAhZXNjYWxhdGVUb1JlbG9hZCA/ICcgKHJlbG9hZCBjYXAgcmVhY2hlZCwgcGF1c2UvcGxheSBvbmx5IOKAlCBzZXQgdHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcD10cnVlIHRvIGJ5cGFzcyknIDogKGVzY2FsYXRlVG9SZWxvYWQgPyAnIChlc2NhbGF0aW5nIHRvIHJlbG9hZCknIDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIGZpeCBidWZmZXJpbmcgcG9zaXRpb246JyArIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uICsgJyBidWZmZXJlZFBvc2l0aW9uOicgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5idWZmZXJlZFBvc2l0aW9uICsgJyBidWZmZXJEdXJhdGlvbjonICsgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gKyByZWxvYWRDYXBOb3RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVrIHBhc3QgYnVmZmVyIGdhcCBpbnN0ZWFkIG9mIHN0YWxsaW5nICsgZHJpZnQgdG8gcmVjb3ZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQ/LigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5idWZmZXJlZC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGJpID0gMDsgYmkgPCB2aWRlby5idWZmZXJlZC5sZW5ndGg7IGJpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby5idWZmZXJlZC5zdGFydChiaSkgPiB2aWRlby5jdXJyZW50VGltZSArIDAuNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNlZWtpbmcgcGFzdCAnICsgKHZpZGVvLmJ1ZmZlcmVkLnN0YXJ0KGJpKSAtIHZpZGVvLmN1cnJlbnRUaW1lKS50b0ZpeGVkKDEpICsgJ3MgYnVmZmVyIGdhcCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdmlkZW8uYnVmZmVyZWQuc3RhcnQoYmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHZpZGVvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVmlkZW8gc3RhdGU6IHJlYWR5U3RhdGU9JyArIHZpZGVvLnJlYWR5U3RhdGUgKyAnIG5ldHdvcmtTdGF0ZT0nICsgdmlkZW8ubmV0d29ya1N0YXRlICsgJyBidWZmZXJlZD0nICsgKHZpZGVvLmJ1ZmZlcmVkLmxlbmd0aCA+IDAgPyB2aWRlby5idWZmZXJlZC5lbmQodmlkZW8uYnVmZmVyZWQubGVuZ3RoIC0gMSkudG9GaXhlZCgxKSA6IDApICsgJyBjdXJyZW50VGltZT0nICsgdmlkZW8uY3VycmVudFRpbWUudG9GaXhlZCgxKSArICcgcGF1c2VkPScgKyB2aWRlby5wYXVzZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1BhdXNlUGxheSA9IGVzY2FsYXRlVG9SZWxvYWQgPyBmYWxzZSA6ICFQbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1JlbG9hZCA9IGVzY2FsYXRlVG9SZWxvYWQgPyB0cnVlIDogUGxheWVyQnVmZmVyaW5nRG9QbGF5ZXJSZWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Ud2l0Y2hQbGF5ZXJUYXNrKGlzUGF1c2VQbGF5LCBpc1JlbG9hZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEZpeFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0ZVRvUmVsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBwb3NpdGlvbiBqdW1wIChuYXRpdmUgZ2FwIHJlY292ZXJ5KSDigJQgZHJpZnQgdG8gY2F0Y2ggdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBkdXJpbmcgYWQgYnJlYWtzIGFuZCAxMHMgYWZ0ZXI6IGJhY2t1cCBzdHJlYW0gc3dpdGNoaW5nIGNhdXNlcyBidWZmZXIgZ2FwcyB0aGF0IHRyaWdnZXIgZmFsc2UganVtcHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID4gMCAmJiBwb3NpdGlvbiAtIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID4gNSAmJiAhcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrICYmICghcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0IHx8IERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QmFja3VwU3dpdGNoQXQgPj0gMTAwMDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3NpdGlvbiBqdW1wZWQgJyArIChwb3NpdGlvbiAtIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uKS50b0ZpeGVkKDEpICsgJ3Mg4oCUIHN0YXJ0aW5nIGRyaWZ0IGNvcnJlY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiA9IGJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID0gYnVmZmVyRHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIHdoZW4gbW9uaXRvcmluZyBwbGF5ZXIgZm9yIGJ1ZmZlcmluZzogJyArIGVycik7CiAgICAgICAgICAgICAgICBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2FkaW5nLWNpcmNsZSBoZWFsdGggY2hlY2s6IGR1cmluZyBhbiBhZCBzdHJpcCtyZWNvdmVyeSBsb29wIHRoZSBub3JtYWwgYnVmZmVyIG1vbml0b3IKICAgICAgICAvLyBpcyBnYXRlZCBvZmYgKGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMpLCBzbyBhIHZpc2libHkgc3RhbGxlZCBwbGF5ZXIgd291bGQgb3RoZXJ3aXNlIHdhaXQKICAgICAgICAvLyBmb3IgdGhlIHdvcmtlcidzIHBvbGwtYmFzZWQgZWFybHkgcmVsb2FkICh+MTBzKS4gVGhpcyBjYXRjaGVzIHRoZSB2aXNpYmxlIHN0YWxsIH4zcyBhZnRlcgogICAgICAgIC8vIGl0IHN0YXJ0cyBhbmQgdHJpZ2dlcnMgYSByZWxvYWQgZGlyZWN0bHksIGVsaW1pbmF0aW5nIG1vc3Qgb2YgdGhlIGxvYWRpbmctY2lyY2xlIHdpbmRvdy4KICAgICAgICBpZiAoaXNBY3RpdmVseVN0cmlwcGluZ0FkcyAmJiBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnBsYXllcjsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyPy5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8uZW5kZWQgJiYgIXBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIHBsYXllciBoYXMgZXZlciBoYWQgZGF0YSDigJQgZGlzdGluZ3Vpc2hlcyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAvLyAoaGFkIGRhdGEsIGxvc3QgZGF0YSkgZnJvbSBpbml0aWFsIHBsYXllciBpbml0IChuZXZlciBoYWQgZGF0YSB5ZXQpLgogICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgZnJlc2ggcGFnZSBsb2FkICsgcHJlcm9sbCBjYXVzZXMgUFIgIzk2IHRvIG1pc2ZpcmUgcmVwZWF0ZWRseQogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVhZHlTdGF0ZT0wIGlzIG5vcm1hbCBkdXJpbmcgaW5pdC4KICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1N0YWxsZWQgPSB2aWRlby5yZWFkeVN0YXRlIDwgMyAmJiAodmlkZW8ucGF1c2VkIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gMik7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhbGxSZWxvYWRDb29sZG93biA9IDE1MDAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb2xkb3duRXhwaXJlZCA9ICFwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QWRTdGFsbFJlbG9hZEF0IHx8IChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCkgPiBzdGFsbFJlbG9hZENvb2xkb3duOwogICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGZpcmUgbG9hZGluZy1jaXJjbGUgcmVsb2FkIGlmIEFOWSByZWxvYWQgaGFwcGVuZWQgcmVjZW50bHkg4oCUIHJlYWR5U3RhdGU9MAogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBleHBlY3RlZCB0cmFuc2llbnQgc3RhdGUgZHVyaW5nIGEgcmVsb2FkJ3MgTWVkaWFTb3VyY2UgdGVhcmRvd24uIFdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLCBhbiBlYXJseS1yZWxvYWQgaW4gZmxpZ2h0IGNhbiB0cmlnZ2VyIGEgcmVkdW5kYW50IGxvYWRpbmctY2lyY2xlIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWQgPSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQpIDwgc3RhbGxSZWxvYWRDb29sZG93bjsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGFsbGVkICYmIGNvb2xkb3duRXhwaXJlZCAmJiAhcmVjZW50UmVsb2FkICYmIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpID4gMzAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTG9hZGluZyBjaXJjbGUgZGV0ZWN0ZWQgZHVyaW5nIGFkIGJyZWFrICgnICsgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHN0YWxsLCByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJykg4oCUIGVhcmx5IHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkIHJlbG9hZDogYSBzdHVjayBtZWRpYSBwbGF5ZXIgbmVlZHMgaXRzIE1lZGlhU291cmNlIHJlYnVpbHQsIG5vdCBqdXN0IGFuIG0zdTggcmVmZXRjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgJ2Vhcmx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1N0YWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0gZWxzZSBpZiAoIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIHsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc0xpdmUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUuaXNMaXZlICYmICFpc0xpdmUpIHsKICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcih7CiAgICAgICAgICAgICAgICBoYXNBZHM6IGZhbHNlCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pc0xpdmUgPSBpc0xpdmU7CiAgICAgICAgLy8gRm9yY2UgaW1tZWRpYXRlIHRpY2sgd2hlbiB0YWIgYmVjb21lcyB2aXNpYmxlIHNvIHN0YWxscyBhcmUgY2F1Z2h0IGZhc3Qgb24gcmV0dXJuCiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcudmlzaWJpbGl0eUhvb2tlZCkgewogICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnZpc2liaWxpdHlIb29rZWQgPSB0cnVlOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcucGVuZGluZ1RpY2spIHsKICAgICAgICAgICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnBlbmRpbmdUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9uaXRvclBsYXllckJ1ZmZlcmluZy5wZW5kaW5nVGljayA9IGZhbHNlOyBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7IH0sIDEwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBDYXRjaCBwZXJzaXN0ZW50IGFkLWJyZWFrIG92ZXJsYXlzIChlLmcuICJ0YWtpbmcgYW4gYWQgYnJlYWsgLyBzdGljayBhcm91bmQiKQogICAgICAgIC8vIGV2ZW4gYWZ0ZXIgaGFzQWRzIGhhcyB0cmFuc2l0aW9uZWQgdG8gZmFsc2UuIHVwZGF0ZUFkYmxvY2tCYW5uZXIgb25seSBjYWxscwogICAgICAgIC8vIGhpZGVUd2l0Y2hBZE92ZXJsYXlzIGR1cmluZyB0aGUgYWN0aXZlIGFkIGJyZWFrOyBzb21lIG92ZXJsYXlzIGhhdmUgdGhlaXIgb3duCiAgICAgICAgLy8gbGlmZWN5Y2xlIGFuZCBzdGF5IHZpc2libGUgYWZ0ZXJ3YXJkcy4gUnVubmluZyBoZXJlIG9uIGV2ZXJ5IG1vbml0b3IgdGljawogICAgICAgIC8vICgxLTNzIGNhZGVuY2UpIGtlZXBzIHRoZW0gaGlkZGVuIHdpdGhvdXQgYSBkZWRpY2F0ZWQgaW50ZXJ2YWwuCiAgICAgICAgdHJ5IHsgaGlkZVR3aXRjaEFkT3ZlcmxheXMoKTsgfSBjYXRjaCB7fQogICAgICAgIC8vIFZpc2liaWxpdHktYXdhcmUgYmFja29mZjogcG9sbCAzeCBzbG93ZXIgd2hlbiB0YWIgaXMgaGlkZGVuIChidXQgTk9UIGR1cmluZyBQaVAg4oCUIHVzZXIgaXMgc3RpbGwgd2F0Y2hpbmcpCiAgICAgICAgY29uc3Qgc2hvdWxkVGhyb3R0bGUgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmhpZGRlbiAmJiAhZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQ7CiAgICAgICAgY29uc3QgbmV4dERlbGF5ID0gc2hvdWxkVGhyb3R0bGUgPyBQbGF5ZXJCdWZmZXJpbmdEZWxheSAqIDMgOiBQbGF5ZXJCdWZmZXJpbmdEZWxheTsKICAgICAgICBzZXRUaW1lb3V0KG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcsIG5leHREZWxheSk7CiAgICB9CiAgICAvLyBIaWRlIFR3aXRjaCdzIGFkIGJyZWFrIC8gVHVyYm8gcHJvbW8gLyBzdHJlYW0gZGlzcGxheSBhZCBvdmVybGF5cyB3aGVuIHdlJ3JlIGFscmVhZHkgYmxvY2tpbmcgYWRzCiAgICBmdW5jdGlvbiBoaWRlVHdpdGNoQWRPdmVybGF5cygpIHsKICAgICAgICBpZiAoIWNhY2hlZFBsYXllclJvb3REaXYgfHwgIWNhY2hlZFBsYXllclJvb3REaXYuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgICAgICAvLyBIaWRlIHN0cmVhbSBkaXNwbGF5IGFkIChTREEpIHdyYXBwZXIKICAgICAgICBjb25zdCBzZGFFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRlc3Qtc2VsZWN0b3I9InNkYS13cmFwcGVyIl0nKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNkYUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghc2RhRWxlbWVudHNbaV0uZGF0YXNldC50YXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIHNkYUVsZW1lbnRzW2ldLmRhdGFzZXQudGFzSGlkZGVuID0gJyc7CiAgICAgICAgICAgICAgICBzZGFFbGVtZW50c1tpXS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRTZGFIaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VkU2RhSGlkZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSGlkZGVuIFR3aXRjaCBzdHJlYW0gZGlzcGxheSBhZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgaWYgKCFjYWNoZWRQbGF5ZXJSb290RGl2IHx8ICFjYWNoZWRQbGF5ZXJSb290RGl2LmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIGNhY2hlZFBsYXllclJvb3REaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tcGxheWVyJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllclJvb3REaXYgPSBjYWNoZWRQbGF5ZXJSb290RGl2OwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgPSBkYXRhLmlzU3RyaXBwaW5nQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIHBsYXllckJ1ZmZlclN0YXRlLmlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuaGFzQWRzKSB7CiAgICAgICAgICAgICAgICBoaWRlVHdpdGNoQWRPdmVybGF5cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gVHJhdmVyc2UgUmVhY3QncyBmaWJlciB0cmVlIHRvIGZpbmQgVHdpdGNoJ3MgcGxheWVyIGFuZCBwbGF5ZXIgc3RhdGUgaW5zdGFuY2VzCiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgaWYgKCFjYWNoZWRSb290Tm9kZSkgewogICAgICAgICAgICAgICAgY2FjaGVkUm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gY2FjaGVkUm9vdE5vZGU7CiAgICAgICAgICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdCAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCkgewogICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZWFjdFJvb3ROb2RlID09IG51bGwgJiYgcm9vdE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IE9iamVjdC5rZXlzKHJvb3ROb2RlKS5maW5kKHggPT4geC5zdGFydHNXaXRoKCdfX3JlYWN0Q29udGFpbmVyJykgfHwgeC5zdGFydHNXaXRoKCdfX3JlYWN0RmliZXInKSk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlW2NvbnRhaW5lck5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFjdFJvb3ROb2RlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWFjdFJvb3ROb2RlID0gZmluZFJlYWN0Um9vdE5vZGUoKTsKICAgICAgICBpZiAoIXJlYWN0Um9vdE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGxldCBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRQbGF5ZXJBY3RpdmUgJiYgbm9kZS5wcm9wcyAmJiBub2RlLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UpOwogICAgICAgIHBsYXllciA9IHBsYXllciAmJiBwbGF5ZXIucHJvcHMgJiYgcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgPyBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgaWYgKHBsYXllcj8ucGxheWVySW5zdGFuY2UpIHsKICAgICAgICAgICAgcGxheWVyID0gcGxheWVyLnBsYXllckluc3RhbmNlOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCBpZiBUd2l0Y2ggb2JmdXNjYXRlcyBwcm9wZXJ0eSBuYW1lcwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQgJiYgbm9kZS5nZXRCdWZmZXJEdXJhdGlvbiAmJiBub2RlLmNvcmU/LnN0YXRlKTsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2gg4oCUIHNldFNyYyBleGlzdHMgYnV0IHNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzIHdhcyByZW5hbWVkCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjayA9ICFwbGF5ZXJTdGF0ZSA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldFN0cmVhbU1hbmFnZXJOb2RlICYmICFub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQpIDogbnVsbDsKICAgICAgICAvLyBGYWxsYmFjayAyOiBUVFYtQUIncyBhcHByb2FjaCDigJQgdmlkZW9QbGF5ZXJJbnN0YW5jZSB3aXRoIHBsYXllck1vZGUKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMiA9ICFwbGF5ZXJTdGF0ZSAmJiAhcGxheWVyU3RhdGVGYWxsYmFjayA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlPy5wbGF5ZXJNb2RlICE9PSB1bmRlZmluZWQpPy5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgY29uc3QgZmluYWxQbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlIHx8IHBsYXllclN0YXRlRmFsbGJhY2sgfHwgcGxheWVyU3RhdGVGYWxsYmFjazI7CiAgICAgICAgLy8gR3JhY2UgcGVyaW9kIGJlZm9yZSBsb2dnaW5nICJub3QgZm91bmQiIHdhcm5pbmdzLiBUaGUgYnVmZmVyIG1vbml0b3IgY2FuIHRpY2sKICAgICAgICAvLyBiZWZvcmUgUmVhY3QgaGFzIGZpbmlzaGVkIG1vdW50aW5nIHRoZSBwbGF5ZXIsIGxlYWRpbmcgdG8gYSBmYWxzZS1wb3NpdGl2ZQogICAgICAgIC8vIGxvZyB0aGF0IGZpcmVzIG9uY2Ugb24gZXZlcnkgcGFnZSBsb2FkLiBPbmx5IGxvZyBpZiB0aGUgbnVsbCBzdGF0ZSBwZXJzaXN0cwogICAgICAgIC8vIGZvciAxMCsgc2Vjb25kcyDigJQgYnkgdGhlbiBSZWFjdCBpcyBkZWZpbml0ZWx5IG1vdW50ZWQgYW5kIGEgcGVyc2lzdGVudCBudWxsCiAgICAgICAgLy8gaW5kaWNhdGVzIHJlYWwgQVBJIGRyaWZ0IChUd2l0Y2ggcmVuYW1lZCBzZXRQbGF5ZXJBY3RpdmUvc2V0U3JjL2V0YykuCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgaWYgKCFnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCkgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyICYmIChEYXRlLm5vdygpIC0gZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQpID4gMTAwMDApIHsKICAgICAgICAgICAgICAgIGdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFBsYXllckFjdGl2ZS9tZWRpYVBsYXllckluc3RhbmNlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIGlmICghZmluYWxQbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQpIGdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vU3RhdGUgJiYgKERhdGUubm93KCkgLSBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFN0YXRlTnVsbEF0KSA+IDEwMDAwKSB7CiAgICAgICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5sb2dnZWROb1N0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBzdGF0ZSBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFNyYy9zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncycpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RTdGF0ZU51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgLy8gUGF1c2UvcGxheSBvciBmdWxseSByZWxvYWQgdGhlIFR3aXRjaCBwbGF5ZXIsIHByZXNlcnZpbmcgcXVhbGl0eS92b2x1bWUgc2V0dGluZ3MKICAgIGZ1bmN0aW9uIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQsIHJlbG9hZEtpbmQpIHsKICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgaWYgKCFwbGF5ZXJBbmRTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcmVhY3Qgcm9vdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckFuZFN0YXRlLnBsYXllcjsKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IHBsYXllckFuZFN0YXRlLnN0YXRlOwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXInKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXBsYXllclN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXIgc3RhdGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB3YXNQYXVzZWQgPSBwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkOwogICAgICAgIGlmICh3YXNQYXVzZWQpIHsKICAgICAgICAgICAgLy8gVXNlciBkZWxpYmVyYXRlbHkgcGF1c2VkIOKAlCByZXNwZWN0IHRoZWlyIGludGVudCwgZG9uJ3QgYXV0by1yZXN1bWUKICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZXNwZWN0aW5nIHVzZXIgcGF1c2UgaW50ZW50IOKAlCBza2lwcGluZyBhdXRvLXJlc3VtZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIFdFIHJlY2VudGx5IGNhbGxlZCBwYXVzZS9wbGF5IGFuZCBwbGF5ZXIgaXMgc3RpbGwgcGF1c2VkLCByZXRyeSBwbGF5IChzdHVjayBmcm9tIGF1dG9wbGF5IHBvbGljeSBvciBhZC1zdGF0ZSBpbnRlcmZlcmVuY2UpCiAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQpIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXdhc1BhdXNlZCkgewogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgPSAwOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQgJiYgZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQpIHsKICAgICAgICAgICAgLy8gU2tpcCByZWxvYWQgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IGhlYWx0aHkg4oCUIGF2b2lkcyBkaXNydXB0aW5nIHNtb290aCBwbGF5YmFjay4KICAgICAgICAgICAgLy8gQnV0IGlmIHdlJ3JlIHdheSBiZWhpbmQgbGl2ZSBlZGdlIChlLmcuIGFmdGVyIGEgbG9uZyBhZCBicmVhayksIHByb2NlZWQgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeS4KICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5yZWFkeVN0YXRlID49IDMgJiYgIXZpZGVvLnBhdXNlZCAmJiAhdmlkZW8uZW5kZWQpIHsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5U2VjID0gMDsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5S25vd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLnNlZWthYmxlICYmIHZpZGVvLnNlZWthYmxlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vla2FibGVFbmQgPSB2aWRlby5zZWVrYWJsZS5lbmQodmlkZW8uc2Vla2FibGUubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoc2Vla2FibGVFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxjID0gTWF0aC5tYXgoMCwgc2Vla2FibGVFbmQgLSB2aWRlby5jdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2FwOiB2YWx1ZXMgPjFoIGluZGljYXRlIGdhcmJhZ2UgZnJvbSB0aGUgTWVkaWEgU291cmNlIEFQSQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHNlZW4gcmlnaHQgYWZ0ZXIgYSByZWxvYWQgd2hpbGUgdGhlIHNlZWthYmxlIHJhbmdlIGlzIGluIGEgdHJhbnNpZW50IHN0YXRlKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxjIDwgMzYwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lTZWMgPSBjYWxjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lLbm93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgaWYgKCFsYXRlbmN5S25vd24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBMYXRlbmN5IHVua25vd24gKHNlZWthYmxlIHVuYXZhaWxhYmxlKSDigJQgcHJvY2VlZGluZyB3aXRoIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXRlbmN5U2VjID4gNykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBwbGF5aW5nIGJ1dCAnICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kIGxpdmUg4oCUIHByb2NlZWRpbmcgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeScpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIHBsYXllciBoZWFsdGh5IChyZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJywgcGxheWluZywgbGF0ZW5jeT0nICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MpJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1JlbG9hZCkgewogICAgICAgICAgICBjb25zdCBsc0tleVF1YWxpdHkgPSAndmlkZW8tcXVhbGl0eSc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5TXV0ZWQgPSAndmlkZW8tbXV0ZWQnOwogICAgICAgICAgICBjb25zdCBsc0tleVZvbHVtZSA9ICd2b2x1bWUnOwogICAgICAgICAgICBsZXQgY3VycmVudFF1YWxpdHlMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50TXV0ZWRMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50Vm9sdW1lTFMgPSBudWxsOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY3VycmVudFF1YWxpdHlMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5UXVhbGl0eSk7CiAgICAgICAgICAgICAgICBjdXJyZW50TXV0ZWRMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TXV0ZWQpOwogICAgICAgICAgICAgICAgY3VycmVudFZvbHVtZUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlWb2x1bWUpOwogICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgJiYgcGxheWVyPy5jb3JlPy5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBwbGF5ZXIuY29yZS5zdGF0ZS52b2x1bWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlRdWFsaXR5LCBKU09OLnN0cmluZ2lmeSh7ZGVmYXVsdDpwbGF5ZXIuY29yZS5zdGF0ZS5xdWFsaXR5Lmdyb3VwfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmFkU3RhbGxTdGFydEF0ID0gMDsvLyBjbGVhciBzdGFsZSBzdGFsbCB0aW1lciBzbyBwb3N0LXJlbG9hZCByZWFkeVN0YXRlPTAgaXNuJ3QgYXR0cmlidXRlZCB0byBwcmUtcmVsb2FkIHN0YWxsCiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCA9IGZhbHNlOwogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCA9IGZhbHNlOwogICAgICAgICAgICAvLyBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nIHJlLWFjcXVpcmVkIGZyZXNoIGV2ZXJ5IHRpY2sg4oCUIG5vIG1hbnVhbCBpbnZhbGlkYXRpb24gbmVlZGVkCiAgICAgICAgICAgIC8vIEhhcmQgcmVsb2FkIGZvciAnZWFybHknIChtaWQtYnJlYWsgZXNjYXBlIOKAlCBmcmVzaCBzZXNzaW9uIGdldHMgbmV3IGFkLWRlY2lzaW9uIGJ1Y2tldCkuCiAgICAgICAgICAgIC8vIFNvZnQgcmVsb2FkIGZvciAncG9zdC1hZCcgKHNtb290aCB0cmFuc2l0aW9uLCBubyBibGFjayBzY3JlZW4gdGVhcmRvd24pLgogICAgICAgICAgICBjb25zdCBoYXJkUmVsb2FkID0gcmVsb2FkS2luZCA9PT0gJ2Vhcmx5JzsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlbG9hZGluZyBUd2l0Y2ggcGxheWVyJyArIChoYXJkUmVsb2FkID8gJyAoaGFyZCknIDogJyAoc29mdCknKSk7CiAgICAgICAgICAgIHBsYXllclN0YXRlLnNldFNyYyh7IGlzTmV3TWVkaWFQbGF5ZXJJbnN0YW5jZTogaGFyZFJlbG9hZCwgcmVmcmVzaEFjY2Vzc1Rva2VuOiBoYXJkUmVsb2FkIH0pOwogICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVHJpZ2dlcmVkUGxheWVyUmVsb2FkJyk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICAvLyBBbHdheXMgcmVzdG9yZSBtdXRlZC92b2x1bWUgc3RhdGUgYWZ0ZXIgcmVsb2FkIOKAlCBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBmb3JjZSBtdXRlZC4KICAgICAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgICAgICAvLyBjbGVhcmVkIGNhY2hlKSwgdGhlIHZpZGVvIHN0aWxsIG5lZWRzIHVubXV0ZSBhZnRlciBDaHJvbWUncyBhdXRvcGxheSBtdXRlIG9uIHJlbG9hZC4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWFsaXR5TFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNdXRlZExTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWVMUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCB3cml0ZXMgdmlkZW8tbXV0ZWQgYXMgJ3siZGVmYXVsdCI6dHJ1ZX0nIHdoZW4gdXNlciBtdXRlZCB2aWEgVUk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENocm9tZSBhdXRvcGxheSBwb2xpY3kgY2FuIG11dGUgZXZlbiBpZiB1c2VyIGRpZG4ndCAobm8gTFMgc2lnbmFsKS4KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLm11dGVkICYmICF1c2VySW50ZW5kZWRNdXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0ubXV0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IGxpdmUgZHJpZnQgYWZ0ZXIgcmVsb2FkLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgaGFyZCByZWxvYWQgd2l0aCBsYXJnZSBkcmlmdCAoPjVzKSwgaGFyZC1zZWVrIHRvIGxpdmUgZWRnZSB0byBmbHVzaAogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgQS9WIHRpbWVzdGFtcCBkZXN5bmMgZnJvbSBzdHJpcCtCTEFOS19NUDQrcmVjb3ZlcnkgYWN0aXZpdHkuIERyaWZ0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Rpb24gYXQgMS4xeCB3b3VsZCB0YWtlIG1pbnV0ZXMgdG8gY2F0Y2ggdXAgMzAtNjBzIG9mIGRyaWZ0LgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igc29mdCByZWxvYWQgb3Igc21hbGwgZHJpZnQsIHVzZSBleGlzdGluZyBncmFkdWFsIGNhdGNoLXVwLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLmJ1ZmZlcmVkLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLnJlYWR5U3RhdGUgPj0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGl2ZUVkZ2UgPSB2aWRlb3NbMF0uYnVmZmVyZWQuZW5kKHZpZGVvc1swXS5idWZmZXJlZC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyaWZ0ID0gbGl2ZUVkZ2UgLSB2aWRlb3NbMF0uY3VycmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFyZFJlbG9hZCAmJiBkcmlmdCA+IDUgJiYgTnVtYmVyLmlzRmluaXRlKGxpdmVFZGdlKSAmJiBsaXZlRWRnZSA8IDM2MDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LWhhcmQtcmVsb2FkIHNlZWsgdG8gbGl2ZSDigJQgJyArIGRyaWZ0LnRvRml4ZWQoMSkgKyAncyBiZWhpbmQsIGp1bXBpbmcgdG8gbGl2ZSBlZGdlIHRvIGZsdXNoIEEvViBkcmlmdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5jdXJyZW50VGltZSA9IGxpdmVFZGdlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkcmlmdCA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LXJlbG9hZCBsaXZlIGRyaWZ0IGNvcnJlY3Rpb246ICcgKyBkcmlmdC50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREcmlmdENvcnJlY3Rpb24odmlkZW9zWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIH0sIDMwMDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gKCkgPT4gewogICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSk7CiAgICB9OwogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCBmZXRjaFJlcXVlc3Qub3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICAvLyBIb29rIGZldGNoKCkgaW4gdGhlIHdpbmRvdyBzY29wZSB0byBjYXB0dXJlIGF1dGggaGVhZGVycyBhbmQgbW9kaWZ5IHBsYXllciB0eXBlIHJlcXVlc3RzCiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0LCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBHUUxEZXZpY2VJRCAhPSBkZXZpY2VJZCkgewogICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlRGV2aWNlSWQnLCBHUUxEZXZpY2VJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1WZXJzaW9uJ10gIT09IENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uID0gaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXSAhPT0gQ2xpZW50U2Vzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50U2Vzc2lvbicsIENsaWVudFNlc3Npb24gPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSAhPT0gQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInLCBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddICE9PSBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWRIZWFkZXJzICYmIEdRTERldmljZUlEICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChHUUxEZXZpY2VJRCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VkUGxheWVyVHlwZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gSlNPTi5wYXJzZShpbml0LmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdCb2R5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVwbGFjZWQgJyR7cmVwbGFjZWRQbGF5ZXJUeXBlfScgcGxheWVyIHR5cGUgd2l0aCAnJHtGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZX0nIHBsYXllciB0eXBlYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NhaVR5cGUgPSB1cmwuaW5jbHVkZXMoJ2JwPW1pZHJvbGwnKSA/ICdtaWRyb2xsJyA6IHVybC5pbmNsdWRlcygnYnA9cHJlcm9sbCcpID8gJ3ByZXJvbGwnIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyhjc2FpVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZChjc2FpVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgYWQgcmVxdWVzdCBkZXRlY3RlZCDigJQgdHlwZTogJyArIGNzYWlUeXBlICsgJyAoY2xpZW50LXNpZGUgYWQgaW5zZXJ0aW9uLCBub3QgYmxvY2thYmxlIHZpYSBtM3U4KScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwgJ2ZldGNoJyk7CiAgICB9CiAgICAvLyBTZXQgdXAgdmlzaWJpbGl0eSBvdmVycmlkZXMgYW5kIGxvY2FsU3RvcmFnZSBob29rcyB0byBwcmVzZXJ2ZSBwbGF5ZXIgc3RhdGUgYWNyb3NzIHJlbG9hZHMKICAgIGZ1bmN0aW9uIG9uQ29udGVudExvYWRlZCgpIHsKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldmVudHYtZXh0ZW5zaW9uJykpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2FybmluZzogN1RWIGV4dGVuc2lvbiBkZXRlY3RlZCDigJQgbWF5IGNhdXNlIGJsYWNrIHNjcmVlbiBvciBidWZmZXJpbmcgaXNzdWVzLiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcywgdHJ5IGRpc2FibGluZyA3VFYuJyk7CiAgICAgICAgfQogICAgICAgIC8vIFRoaXMgc3RvcHMgVHdpdGNoIGZyb20gcGF1c2luZyB0aGUgcGxheWVyIHdoZW4gaW4gYW5vdGhlciB0YWIgYW5kIGFuIGFkIHNob3dzLgogICAgICAgIC8vIFRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhdWNldHR2L1ZpZGVvQWRCbG9ja0ZvclR3aXRjaC9ibG9iL2NlZmNlOWQyYjU2NTc2OWM3N2UzNjY2YWM4MjM0YzNhY2ZlMjBkODMvY2hyb21lL2NvbnRlbnQuanMjTDMwCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAndmlzaWJpbGl0eVN0YXRlJywgewogICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAndmlzaWJsZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgbGV0IGhpZGRlbiA9IGRvY3VtZW50Ll9fbG9va3VwR2V0dGVyX18oJ2hpZGRlbicpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2hpZGRlbicsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgY29uc3QgYmxvY2sgPSBlID0+IHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIH07CiAgICAgICAgbGV0IHdhc1ZpZGVvUGxheWluZyA9IHRydWU7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eUNoYW5nZSA9IGUgPT4gewogICAgICAgICAgICBjb25zdCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoaGlkZGVuICYmIGhpZGRlbi5hcHBseShkb2N1bWVudCkgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICB3YXNWaWRlb1BsYXlpbmcgPSAhdmlkZW9zWzBdLnBhdXNlZCAmJiAhdmlkZW9zWzBdLmVuZGVkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnVGFiIGZvY3VzZWQuIFN0cmVhbSBzaG91bGQgYmUgYWN0aXZlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0ucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmxvY2soZSk7CiAgICAgICAgfTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgdHJ5IHsgZG9jdW1lbnQuaGFzRm9jdXMgPSAoKSA9PiB0cnVlOyB9IGNhdGNoe30KICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBkZWNsYXJlT3B0aW9ucyh3aW5kb3cpOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBsc1JlbG9hZEFmdGVyQWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkUGxheWVyQWZ0ZXJBZCcpOwogICAgICAgIGlmIChsc1JlbG9hZEFmdGVyQWQgIT09IG51bGwpIHsKICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IGxzUmVsb2FkQWZ0ZXJBZCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc1JlbG9hZENvb2xkb3duID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZENvb2xkb3duU2Vjb25kcycpKTsKICAgICAgICBpZiAoIWlzTmFOKGxzUmVsb2FkQ29vbGRvd24pICYmIGxzUmVsb2FkQ29vbGRvd24gPj0gMCkgewogICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSBsc1JlbG9hZENvb2xkb3duOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVSZWxvYWRDYXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcCcpOwogICAgICAgIGlmIChsc0Rpc2FibGVSZWxvYWRDYXAgIT09IG51bGwpIHsKICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9IGxzRGlzYWJsZVJlbG9hZENhcCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0RyaWZ0UmF0ZSA9IHBhcnNlRmxvYXQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2RyaWZ0Q29ycmVjdGlvblJhdGUnKSk7CiAgICAgICAgaWYgKCFpc05hTihsc0RyaWZ0UmF0ZSkgJiYgbHNEcmlmdFJhdGUgPj0gMCkgewogICAgICAgICAgICBEcmlmdENvcnJlY3Rpb25SYXRlID0gbHNEcmlmdFJhdGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGxheWVyVHlwZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19wbGF5ZXJUeXBlJyk7CiAgICAgICAgaWYgKGxzUGxheWVyVHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9IGxzUGxheWVyVHlwZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQaW5CYWNrdXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcGluQmFja3VwUGxheWVyVHlwZScpOwogICAgICAgIGlmIChsc1BpbkJhY2t1cCAhPT0gbnVsbCkgewogICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gbHNQaW5CYWNrdXAgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQcmVmZXJMb3cgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcHJlZmVyTG93UXVhbGl0eUJhY2t1cCcpOwogICAgICAgIGlmIChsc1ByZWZlckxvdyA9PT0gJ2ZhbHNlJykgewogICAgICAgICAgICBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgc3RpY2t5IENTQUkgcGF0aCBvbmx5LCBubyBhdXRvcGxheSBmYWxsYmFjayBvciBlc2NhcGUgaGF0Y2gnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNCYWNrdXBTd2FwRmlyc3QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfYmFja3VwU3dhcEZpcnN0Jyk7CiAgICAgICAgaWYgKGxzQmFja3VwU3dhcEZpcnN0ID09PSAnZmFsc2UnKSB7CiAgICAgICAgICAgIEJhY2t1cFN3YXBGaXJzdCA9IGZhbHNlOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXBTd2FwRmlyc3QgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgdXNpbmcgc3RpY2t5IENTQUkgcGF0aCAoc3RyaXAgb24gbmF0aXZlIHN0cmVhbSknKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNIaWRlQWRPdmVybGF5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2hpZGVBZE92ZXJsYXknKTsKICAgICAgICBpZiAobHNIaWRlQWRPdmVybGF5ID09PSAndHJ1ZScpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9ICcudGFzLWFkYmxvY2stb3ZlcmxheSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSc7CiAgICAgICAgICAgIChkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgIH0KICAgIH0gY2F0Y2gge30KICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENvbmZpZzogUmVsb2FkUGxheWVyQWZ0ZXJBZCA9ICcgKyBSZWxvYWRQbGF5ZXJBZnRlckFkICsgJywgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgPSAnICsgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIGlmIChQbGF5ZXJCdWZmZXJpbmdGaXgpIHsKICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7CiAgICB9CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbWV0ZXIgcmVxdWlyZWQgKDAgPSBubyBzaW11bGF0ZWQgYWQsIDErID0gdXNlIGJhY2t1cCBwbGF5ZXIgZm9yIGdpdmVuIGRlcHRoKScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdTaW11bGF0ZUFkcycsIGRlcHRoKTsKICAgIH07CiAgICB3aW5kb3cuYWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gKCkgPT4gewogICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMnKTsKICAgIH07Cn0pKCk7Cg=="},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIGluc3RhbmNlCiAgICAvLyB0aGF0IGZpZ2h0cyBmb3IgcGxheWVyIGNvbnRyb2wuIE9ubHkgdGhlIHRvcCBmcmFtZSBob3N0cyB0aGUgcGxheWVyIG9uIHR3aXRjaC50di9DSEFOTkVMOwogICAgLy8gbmVzdGVkIGF1eGlsaWFyeSBmcmFtZXMgYXJlIG5vaXNlLgogICAgLy8gQWxsb3ctbGlzdCBmb3IgbmVzdGVkLWZyYW1lIGluamVjdGlvbjogVHdpdGNoJ3MgdGhyZWUgZG9jdW1lbnRlZCBlbWJlZCBjb250ZXh0cwogICAgLy8gKGh0dHBzOi8vZGV2LnR3aXRjaC50di9kb2NzL2VtYmVkL3ZpZGVvLWFuZC1jbGlwcy8pIOKAlCBwcmVzZXJ2ZXMgVHdpdGNoIHN0cmVhbXMKICAgIC8vIGVtYmVkZGVkIG9uIHRoaXJkLXBhcnR5IHNpdGVzIHdoZXJlIHRoZSBzY3JpcHQgcnVucyBpbiBhbiBpZnJhbWUgd2hvc2UgcGFyZW50CiAgICAvLyBpcyBvbiBhIGRpZmZlcmVudCBvcmlnaW4uCiAgICAvLyBVc2Ugd2luZG93LmZyYW1lRWxlbWVudCB0byBkZXRlY3QgbmVzdGVkIGZyYW1lcyDigJQgbnVsbCBvbiB0b3AgZnJhbWUsIHRoZSBpZnJhbWUKICAgIC8vIGVsZW1lbnQgb24gYSBzYW1lLW9yaWdpbiBuZXN0ZWQgZnJhbWUsIHRocm93cyBvbiBhIGNyb3NzLW9yaWdpbiBuZXN0ZWQgZnJhbWUuCiAgICAvLyBNb3JlIHJlbGlhYmxlIHRoYW4gJ3dpbmRvdyAhPT0gd2luZG93LnRvcCcgYmVjYXVzZSBUYW1wZXJtb25rZXkgd3JhcHMgd2luZG93IGluIGEKICAgIC8vIHByb3h5IHdoZXJlIHRoZSBzdHJpY3QgY29tcGFyaXNvbiBjYW4gcmV0dXJuIHRydWUgZXZlbiBvbiB0aGUgdG9wIGZyYW1lLgogICAgbGV0IF9pc05lc3RlZCA9IGZhbHNlOwogICAgdHJ5IHsgX2lzTmVzdGVkID0gd2luZG93LmZyYW1lRWxlbWVudCAhPT0gbnVsbDsgfSBjYXRjaCAoX2UpIHsgX2lzTmVzdGVkID0gdHJ1ZTsgfQogICAgaWYgKF9pc05lc3RlZCkgewogICAgICAgIGNvbnN0IF9ob3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2lzRW1iZWRDb250ZXh0ID0gX2hvc3QgPT09ICdwbGF5ZXIudHdpdGNoLnR2JyB8fCBfaG9zdCA9PT0gJ2VtYmVkLnR3aXRjaC50dicgfHwgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2VtYmVkLycpOwogICAgICAgIGlmICghX2lzRW1iZWRDb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZpZGVvLXN3YXAtbmV3IHNraXBwZWQg4oCUIG5lc3RlZCBmcmFtZSBvbiAnICsgX2hvc3QgKyBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSArICcgKG5vdCBhIFR3aXRjaCBlbWJlZCkuIElmIHlvdSBzZWUgdGhpcyBvbiB0d2l0Y2gudHYvQ0hBTk5FTCB0b3AgZnJhbWUsIHBsZWFzZSByZXBvcnQuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSA0NzsvLyBVc2VkIHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3V0ZGF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNjcmlwdHMKICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFR3aXRjaEFkU29sdXRpb25zIHZpZGVvLXN3YXAtbmV3IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZpZGVvLXN3YXAtbmV3IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBza2lwcGVkIOKAlCBhbm90aGVyIHNjcmlwdCBhbHJlYWR5IGFjdGl2ZSAodicgKyB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJykuIFJlbW92ZSBkdXBsaWNhdGUgc2NyaXB0cy4nKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uOwogICAgZnVuY3Rpb24gZGVjbGFyZU9wdGlvbnMoc2NvcGUpIHsKICAgICAgICAvLyBPcHRpb25zIC8gZ2xvYmFscwogICAgICAgIC8vICdlbWJlZCcgbW92ZWQgdG8gZW5kIOKAlCBmaWVsZC1vYnNlcnZlZCBUd2l0Y2ggcmV0dXJucyBHUUwgJ3NlcnZlciBlcnJvcicgZm9yCiAgICAgICAgLy8gc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBvbiBlbWJlZCB3aGVuIHJlcXVlc3RlZCBmcm9tIHR3aXRjaC50diBvcmlnaW4uCiAgICAgICAgc2NvcGUuT1BUX0JBQ0tVUF9QTEFZRVJfVFlQRVMgPSBbICdwb3BvdXQnLCAnbW9iaWxlX3dlYicsICdlbWJlZCcgXTsKICAgICAgICBzY29wZS5PUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFID0gJ3BvcG91dCc7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guCiAgICAgICAgc2NvcGUuQURfU0lHTklGSUVSUyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIiddOwogICAgICAgIHNjb3BlLkFEX1NFR01FTlRfVVJMX1BBVFRFUk5TID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24uCiAgICAgICAgc2NvcGUuVFdJVENIX0FEX1VSTF9SRVdSSVRFX1JFR0VYID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVVJJX0FUVFJJQlVURV9SRUdFWCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5MSVZFX1NJR05JRklFUiA9ICcsbGl2ZSc7CiAgICAgICAgc2NvcGUuQ0xJRU5UX0lEID0gJ2tpbW5lNzhreDNuY3g2YnJnbzRtdjZ3a2k1aDFrbyc7CiAgICAgICAgLy8gVGhlc2UgYXJlIG9ubHkgcmVhbGx5IGZvciBXb3JrZXIgc2NvcGUuLi4KICAgICAgICBzY29wZS5TdHJlYW1JbmZvcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3NCeVVybCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgLy8gTmVlZCB0aGlzIGluIGJvdGggc2NvcGVzLiBXaW5kb3cgc2NvcGUgbmVlZHMgdG8gdXBkYXRlIHRoaXMgdG8gd29ya2VyIHNjb3BlLgogICAgICAgIHNjb3BlLmdxbF9kZXZpY2VfaWQgPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudEludGVncml0eUhlYWRlciA9IG51bGw7CiAgICAgICAgc2NvcGUuQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZDsKICAgICAgICBzY29wZS5TaW11bGF0ZWRBZHNEZXB0aCA9IDA7CiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IHRydWU7Ly8gQWZ0ZXIgdGhlIGFkIGZpbmlzaGVzIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5SZWxvYWRDb29sZG93blNlY29uZHMgPSAzMDsvLyBNaW5pbXVtIHNlY29uZHMgYmV0d2VlbiByZWxvYWRzIOKAlCBicmVha3MgQ1NBSSBjYXNjYWRlcyB0cmlnZ2VyZWQgYnkgcmVsb2FkCiAgICAgICAgc2NvcGUuRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gNTsvLyBBbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIGVhcmx5IHJlbG9hZCAofjJzIGVhY2gsIHNvIDUgPSB+MTBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gZmFsc2U7Ly8gSWYgdHJ1ZSwgcmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvTWF4QWdlTXMgPSAzMCAqIDYwICogMTAwMDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIEVuY29kaW5nczogbnVsbCwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzOiBudWxsLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NTdGF0dXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4OiAtMSwKICAgICAgICAgICAgUGlubmVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgSGFzQ2hlY2tlZFVua25vd25UYWdzOiBmYWxzZSwKICAgICAgICAgICAgSGFzQ29uZmlybWVkQWRBdHRyczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICAgICAgSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3M6IGZhbHNlLAogICAgICAgICAgICBJc01pZHJvbGw6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIENsZWFuUGxheWxpc3RDb3VudDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3M6IDAsCiAgICAgICAgICAgIFVzZUZhbGxiYWNrU3RyZWFtOiBmYWxzZSwKICAgICAgICAgICAgTGFzdENsZWFuTmF0aXZlTTNVODogbnVsbCwKICAgICAgICAgICAgTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZFRyaWdnZXJlZDogZmFsc2UsCiAgICAgICAgICAgIExhc3RQbGF5ZXJSZWxvYWQ6IDAsCiAgICAgICAgICAgIFJlbG9hZFRpbWVzdGFtcHM6IFtdLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBtYXNrQXNOYXRpdmUoZm4sIG5hbWUpIHsKICAgICAgICBmbi50b1N0cmluZyA9ICgpID0+ICdmdW5jdGlvbiAnICsgbmFtZSArICcoKSB7IFtuYXRpdmUgY29kZV0gfSc7CiAgICAgICAgcmV0dXJuIGZuOwogICAgfQogICAgZnVuY3Rpb24gcHJ1bmVTdHJlYW1JbmZvcygpIHsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIGZvciAoY29uc3QgY2hhbm5lbE5hbWUgaW4gU3RyZWFtSW5mb3MpIHsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLkxhc3RTZWVuQXQgfHwgKG5vdyAtIHN0cmVhbUluZm8uTGFzdFNlZW5BdCkgPiBTdHJlYW1JbmZvTWF4QWdlTXMpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvICYmIHN0cmVhbUluZm8uVXJscykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJscy5mb3JFYWNoKChfLCB1cmwpID0+IHsgZGVsZXRlIFN0cmVhbUluZm9zQnlVcmxbdXJsXTsgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWxldGUgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY29uc3QgbG9nZ2VkQ3NhaVR5cGVzID0gbmV3IFNldCgpOwogICAgbGV0IHR3aXRjaFBsYXllckFuZFN0YXRlID0gbnVsbDsKICAgIGxldCBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gZmFsc2U7CiAgICBsZXQgbGFzdFJlbG9hZFRpbWVzdGFtcCA9IDA7CiAgICBsZXQgcmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgbGV0IEVzY2FsYXRlZEZyb21Db29sZG93biA9IG51bGw7Ly8gdHJhY2tzIHByZS1lc2NhbGF0aW9uIHZhbHVlIHNvIHdlIGNhbiByZXZlcnQgd2hlbiB0aGUgYnVyc3Qgc3Vic2lkZXMKICAgIGNvbnN0IHR3aXRjaFdvcmtlcnMgPSBbXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0NvbmZsaWN0cyA9IFsKICAgICAgICAndHdpdGNoJywKICAgICAgICAnaXNWYXJpYW50QScvLyBUd2l0Y2hOb1N1YgogICAgXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0FsbG93ID0gW107CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkgJiYgIXdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocGFyZW50LCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOwogICAgICAgICAgICBwYXJlbnQgPSByZWluc2VydFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVmFsaWRXb3JrZXIod29ya2VyKSB7CiAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gd29ya2VyLnRvU3RyaW5nKCk7CiAgICAgICAgY29uc3QgaGFzQ29uZmxpY3QgPSB3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBjb25zdCBoYXNBbGxvdyA9IHdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgY29uc3QgaGFzUmVpbnNlcnQgPSB3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGlmIChoYXNDb25mbGljdCAmJiAhaGFzQWxsb3cgJiYgIWhhc1JlaW5zZXJ0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciByZWplY3RlZCDigJQgY29uZmxpY3Qgc3RyaW5nIGZvdW5kOiAnICsgd29ya2VyU3RyaW5nQ29uZmxpY3RzLmZpbHRlcigoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKS5qb2luKCcsICcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFoYXNDb25mbGljdCB8fCBoYXNBbGxvdyB8fCBoYXNSZWluc2VydDsKICAgIH0KICAgIGxldCBpbmplY3RlZEJsb2JVcmwgPSBudWxsOwogICAgZnVuY3Rpb24gaG9va1dpbmRvd1dvcmtlcigpIHsKICAgICAgICAvLyBQcmV2ZW50IFR3aXRjaCBmcm9tIHJldm9raW5nIG91ciBpbmplY3RlZCB3b3JrZXIgYmxvYiBVUkwKICAgICAgICBpZiAoIVVSTC5yZXZva2VPYmplY3RVUkwuX190YXNNYXNrZWQpIHsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwgPSBVUkwucmV2b2tlT2JqZWN0VVJMOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICAgICAgaWYgKHVybCA9PT0gaW5qZWN0ZWRCbG9iVXJsKSByZXR1cm47CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxSZXZva2VPYmplY3RVUkwuY2FsbCh0aGlzLCB1cmwpOwogICAgICAgICAgICB9LCAncmV2b2tlT2JqZWN0VVJMJyk7CiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwuX190YXNNYXNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWluc2VydCA9IGdldFdvcmtlcnNGb3JSZWluc2VydCh3aW5kb3cuV29ya2VyKTsKICAgICAgICBjb25zdCBuZXdXb3JrZXIgPSBjbGFzcyBXb3JrZXIgZXh0ZW5kcyAoZ2V0Q2xlYW5Xb3JrZXIod2luZG93LldvcmtlcikgfHwgd2luZG93LldvcmtlcikgewogICAgICAgICAgICBjb25zdHJ1Y3Rvcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBsZXQgaXNUd2l0Y2hXb3JrZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaXNUd2l0Y2hXb3JrZXIgPSBuZXcgVVJMKHR3aXRjaEJsb2JVcmwpLm9yaWdpbi5lbmRzV2l0aCgnLnR3aXRjaC50dicpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFpc1R3aXRjaFdvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5vbi1Ud2l0Y2ggd29ya2VyIHNraXBwZWQ6ICcgKyB0d2l0Y2hCbG9iVXJsKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBQcmUtY2hlY2s6IHZlcmlmeSB3ZSBjYW4gZmV0Y2ggdGhlIHdvcmtlciBKUyBiZWZvcmUgaW5qZWN0aW5nCiAgICAgICAgICAgICAgICBsZXQgcHJlZmV0Y2hlZFdvcmtlckpzID0gbnVsbDsKICAgICAgICAgICAgICAgIHRyeSB7IHByZWZldGNoZWRXb3JrZXJKcyA9IGdldFdhc21Xb3JrZXJKcyh0d2l0Y2hCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFwcmVmZXRjaGVkV29ya2VySnMpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYWlsZWQgdG8gZmV0Y2ggd29ya2VyIEpTIOKAlCBmYWxsaW5nIGJhY2sgdG8gdW5tb2RpZmllZCB3b3JrZXInKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgaW50ZXJjZXB0ZWQg4oCUIGluamVjdGluZyBhZC1ibG9jayBob29rcycpOwogICAgICAgICAgICAgICAgY29uc3QgbmV3QmxvYlN0ciA9IGAKICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nRmV0Y2hSZXF1ZXN0cyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICAke2hhc0FkVGFncy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0TWF0Y2hlZEFkU2lnbmlmaWVycy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c3RyaXBBZFNlZ21lbnRzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwcm9jZXNzTTNVOC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7aG9va1dvcmtlckZldGNoLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtkZWNsYXJlT3B0aW9ucy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0QWNjZXNzVG9rZW4udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dxbFJlcXVlc3QudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3BhcnNlQXR0cmlidXRlcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c2V0U3RyZWFtSW5mb1VybHMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke29uRm91bmRBZC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0V2FzbVdvcmtlckpzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3JlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHt1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwcnVuZVN0cmVhbUluZm9zLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtjcmVhdGVTdHJlYW1JbmZvLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gZ2V0V2FzbVdvcmtlckpzKCcke3R3aXRjaEJsb2JVcmwucmVwbGFjZUFsbCgiJyIsICIlMjciKX0nKTsKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlT3B0aW9ucyhzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuX190YXNQcnVuZUludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX190YXNQcnVuZUludGVydmFsID0gc2V0SW50ZXJ2YWwocHJ1bmVTdHJlYW1JbmZvcywgNSAqIDYwICogMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSAke1JlbG9hZFBsYXllckFmdGVyQWR9OwogICAgICAgICAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9ICR7UmVsb2FkQ29vbGRvd25TZWNvbmRzfTsKICAgICAgICAgICAgICAgICAgICBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSAke0Vhcmx5UmVsb2FkUG9sbFRocmVzaG9sZH07CiAgICAgICAgICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9ICR7UGluQmFja3VwUGxheWVyVHlwZX07CiAgICAgICAgICAgICAgICAgICAgT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSA9ICcke09QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEV9JzsKICAgICAgICAgICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gJHtncWxfZGV2aWNlX2lkID8gIiciICsgZ3FsX2RldmljZV9pZCArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSAke0F1dGhvcml6YXRpb25IZWFkZXIgPyAiJyIgKyBBdXRob3JpemF0aW9uSGVhZGVyICsgIiciIDogdW5kZWZpbmVkfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSAke0NsaWVudEludGVncml0eUhlYWRlciA/ICInIiArIENsaWVudEludGVncml0eUhlYWRlciArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1VwZGF0ZURldmljZUlkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRmV0Y2hSZXNwb25zZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVzcG9uc2VEYXRhLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCB0aW1lb3V0SWQgfSA9IHBlbmRpbmdGZXRjaFJlcXVlc3RzLmdldChyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXNwb25zZURhdGEuZXJyb3IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcmVzcG9uc2UgZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSB0YWtlcyBzdGF0dXMvc3RhdHVzVGV4dC9oZWFkZXJzIOKAlCB1cmwvcmVkaXJlY3RlZC90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UuIElWUyBXQVNNIHZhbGlkYXRlcyB0aGVzZSAoU3BhZGUvdHJhY2tpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMpIGFuZCB0aHJvd3MgTmV0d29ya0Vycm9yIGlmIHRoZXkncmUgbWlzc2luZyDigJQgVFRWLUFCIHY2LjMuNSBmaXguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHJlc3BvbnNlRGF0YS5ib2R5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlRGF0YS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZURhdGEuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlRGF0YS5oZWFkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2VEYXRhLnVybCB8fCAnJywgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAncmVkaXJlY3RlZCcsIHsgdmFsdWU6ICEhcmVzcG9uc2VEYXRhLnJlZGlyZWN0ZWQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNwb25zZSwgJ3R5cGUnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudHlwZSB8fCAnYmFzaWMnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1NpbXVsYXRlQWRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltdWxhdGVkQWRzRGVwdGggPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU2ltdWxhdGVkQWRzRGVwdGg6ICcgKyBTaW11bGF0ZWRBZHNEZXB0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gIUFsbFNlZ21lbnRzQXJlQWRTZWdtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM6ICcgKyBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaG9va1dvcmtlckZldGNoKCk7CiAgICAgICAgICAgICAgICAgICAgZXZhbCh3b3JrZXJTdHJpbmcpOwogICAgICAgICAgICAgICAgYAogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVYm9VcGRhdGVBZEJhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcihlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUGF1c2VSZXN1bWVQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9hZFR3aXRjaFBsYXllcih0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5rZXkgPT0gJ0ZldGNoUmVxdWVzdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hSZXF1ZXN0ID0gZXZlbnQuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gV29ya2VyIGNyYXNoIHJlY292ZXJ5IOKAlCBJVlMgV0FTTSB3b3JrZXIgY2FuIGZpcmUgUnVudGltZUVycm9yCiAgICAgICAgICAgICAgICAvLyAoZS5nLiAiaW5kZXggb3V0IG9mIGJvdW5kcyIpIGFuZCBkaWUuIEEgc2luZ2xlIGNyYXNoIGZpcmVzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAvLyBlcnJvciBldmVudHM7IGRlZHVwZSB2aWEgYSBsb2NhbCBmbGFnLiBPbiBmaXJzdCBlcnJvciwgdHJpZ2dlciBhCiAgICAgICAgICAgICAgICAvLyBwbGF5ZXIgcmVsb2FkIOKAlCBUd2l0Y2ggcmUtc3Bhd25zIHRoZSB3b3JrZXIgYXMgcGFydCBvZiB0aGUgbmV3CiAgICAgICAgICAgICAgICAvLyBwbGF5ZXIgaW5zdGFuY2UsIGFuZCBleGlzdGluZyByZWxvYWQgY29vbGRvd24gcHJldmVudHMgcmVzdGFydCBsb29wcy4KICAgICAgICAgICAgICAgIGxldCBjcmFzaGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3Jhc2hlZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNyYXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIElWUyBXQVNNIHdvcmtlciBjcmFzaGVkOiAnICsgKChlICYmIGUubWVzc2FnZSkgfHwgJ3Vua25vd24gZXJyb3InKSArICcg4oCUIHRyaWdnZXJpbmcgcGxheWVyIHJlbG9hZCB0byByZWNvdmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmVsb2FkVHdpdGNoUGxheWVyKGZhbHNlKTsgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBjcmFzaCByZWNvdmVyeSBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHdvcmtlckluc3RhbmNlID0gcmVpbnNlcnRXb3JrZXJzKG5ld1dvcmtlciwgcmVpbnNlcnQpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdXb3JrZXInLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VySW5zdGFuY2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkV29ya2VyKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdvcmtlckluc3RhbmNlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIHNldCB0d2l0Y2ggd29ya2VyIGRlbmllZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCkgewogICAgICAgIGlmICghZ2V0V2FzbVdvcmtlckpzLmNhY2hlKSB7CiAgICAgICAgICAgIGdldFdhc21Xb3JrZXJKcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0pIHsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc21Xb3JrZXJKcy5jYWNoZVt0d2l0Y2hCbG9iVXJsXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICBjb25zdCB0ZXh0ID0gcmVxLnJlc3BvbnNlVGV4dDsKICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0gPSB0ZXh0OwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFtSW5mb1VybHMoc3RyZWFtSW5mbywgZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGNvbnN0IGxpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIHYyIEFQSSB2YXJpYW50IFVSTHMgYXJlIHJhdyBDRE4gVVJMcyB3aXRob3V0ICcubTN1OCcgaW4gdGhlIHBhdGguCiAgICAgICAgICAgIC8vIEFjY2VwdCBhYnNvbHV0ZSBVUkxzIChjb250YWluaW5nICc6Ly8nKSBhbG9uZ3NpZGUgJy5tM3U4JyBVUkxzLgogICAgICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZXNbaV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKHRyaW1tZWQgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aCgnIycpICYmICh0cmltbWVkLmluY2x1ZGVzKCcubTN1OCcpIHx8IHRyaW1tZWQuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NCeVVybFtsaW5lc1tpXS50cmltRW5kKCldID0gc3RyZWFtSW5mbzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuZXh0TGluZSA9IGxpbmVzW2kgKyAxXT8udHJpbSgpOwogICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBuZXh0TGluZSAmJiAhbmV4dExpbmUuc3RhcnRzV2l0aCgnIycpICYmIChuZXh0TGluZS5pbmNsdWRlcygnLm0zdTgnKSB8fCBuZXh0TGluZS5pbmNsdWRlcygnOi8vJykpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBhdHRyaWJ1dGVzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHV0aW9uOiByZXNvbHV0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBGcmFtZVJhdGU6IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgVXJsOiBsaW5lc1tpICsgMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJscy5zZXQobGluZXNbaSArIDFdLnRyaW1FbmQoKSwgcmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKSB7CiAgICAgICAgY29uc3QgaXNTaG93aW5nQWQgPSAhIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzOwogICAgICAgIGlmICghaXNTaG93aW5nQWQgJiYgKHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzIHx8IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBmYWxzZTsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIGtleTogJ1Vib1VwZGF0ZUFkQmFubmVyJywKICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgaGFzQWRzOiBpc1Nob3dpbmdBZCwKICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cywKICAgICAgICAgICAgbnVtU3RyaXBwZWRBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cywKICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXggPj0gMCA/IE9QVF9CQUNLVVBfUExBWUVSX1RZUEVTW3N0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4XSA6IG51bGwKICAgICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCByZWxvYWRQbGF5ZXIsIHJlYWxGZXRjaCwgdXJsLCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGxldCByZXN1bHQgPSB0ZXh0U3RyOwogICAgICAgIHN0cmVhbUluZm8uSXNNaWRyb2xsID0gdGV4dFN0ci5pbmNsdWRlcygnIk1JRFJPTEwiJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnIm1pZHJvbGwiJyk7CiAgICAgICAgLy8gVHJhY2sgaGlnaC1jb25maWRlbmNlIGFkIG1hcmtlcnMgdG8gZGlzdGluZ3Vpc2ggcmVhbCBhZHMgZnJvbSBmYWxzZS1wb3NpdGl2ZSBzaWduaWZpZXIgbWF0Y2hlcy4KICAgICAgICAvLyBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50IG9uIGV2ZXJ5IHJlYWwgVHdpdGNoIGFkIGFuZCBhYnNlbnQgZnJvbSBhbnl0aGluZyB0aGF0IGNvdWxkCiAgICAgICAgLy8gZmFsc2UtcG9zaXRpdmUgKGUuZy4gbWV0YWRhdGEgY29udGFpbmluZyB0aGUgd29yZCAnc3RpdGNoZWQnKS4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMgPSB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTicpOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGF5ZXJUeXBlcyA9IFsuLi5PUFRfQkFDS1VQX1BMQVlFUl9UWVBFU107CiAgICAgICAgLy8gVHJ5IHBpbm5lZCBiYWNrdXAgcGxheWVyIHR5cGUgZmlyc3QgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgKFBpbkJhY2t1cFBsYXllclR5cGUgJiYgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gcGxheWVyVHlwZXMuaW5kZXhPZihzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICBpZiAocGlubmVkSW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlcy5zcGxpY2UocGlubmVkSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgcGxheWVyVHlwZXMudW5zaGlmdChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5zaXplID49IHBsYXllclR5cGVzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzICYmICFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncy5pbmNsdWRlcyh1cmwpKSB7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYmFja3VwU2VhcmNoU3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgIGxldCBiYWNrdXBQbGF5ZXJUeXBlSW5mbyA9ICcnOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxheWVyVHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgcGxheWVyVHlwZSA9IHBsYXllclR5cGVzW2ldOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmhhcyhwbGF5ZXJUeXBlKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2UgIT0gbnVsbCAmJiBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvckJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXJyb3JCb2R5ID0gJyDigJQgJyArIChhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLnRleHQoKSkuc3Vic3RyaW5nKDAsIDIwMCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWNjZXNzIHRva2VuIEhUVFAgJyArIGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHBsYXllclR5cGUgKyAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDQwMyA/ICcgKGludGVncml0eTogJyArIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAncHJlc2VudCcgOiAnbWlzc2luZycpICsgJyknIDogJycpICsgZXJyb3JCb2R5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2UgIT0gbnVsbCAmJiBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB7IGRhdGE6IHsgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjogey4uLn0gfSB9IChtb3N0IHBsYXllciB0eXBlcykKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB7IHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW46IHsuLi59IH0gKGZsYXR0ZXIsIG9ic2VydmVkIGZvciAnZW1iZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGF0ID0gYWNjZXNzVG9rZW4/LmRhdGE/LnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gfHwgYWNjZXNzVG9rZW4/LnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3BhdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCByZXNwb25zZSBtaXNzaW5nIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gZm9yICcgKyBwbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmxJbmZvLnNlYXJjaFBhcmFtcy5zZXQoJ3NpZycsIHNwYXQuc2lnbmF0dXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIHNwYXQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVXNoZXIgSFRUUCAnICsgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyBwbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlICE9IG51bGwgJiYgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RpbmdzTTN1OCA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja1RleHRTdHIgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0FkVGFncyhiYWNrVGV4dFN0cikgJiYgKFNpbXVsYXRlZEFkc0RlcHRoID09IDAgfHwgaSA+PSBTaW11bGF0ZWRBZHNEZXB0aCAtIDEpKSB8fCBpID49IHBsYXllclR5cGVzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmFja1RleHRTdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGVJbmZvID0gJyAoJyArIHBsYXllclR5cGUgKyAnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNldChwbGF5ZXJUeXBlLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGluQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gcGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FbmNvZGluZ3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG93IHJlc29sdXRpb24gc3RyZWFtcyB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHJlc29sdXRpb25zIGluIHRoZSBVSS4gVG8gZml4IHRoaXMgd2UgbWVyZ2UgdGhlIGxvdyByZXMgVVJMcyBpbnRvIHRoZSBtYWluIG0zdTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbEVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkVuY29kaW5nczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbExpbmVzID0gbm9ybWFsRW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9ybWFsTGluZXMubGVuZ3RoIC0gMTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbExpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobm9ybWFsTGluZXNbal0uc3Vic3RyaW5nKG5vcm1hbExpbmVzW2pdLmluZGV4T2YoJzonKSArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzVXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCBzdHJlYW1JbmZvLlVybHMuZ2V0KG5vcm1hbExpbmVzW2ogKyAxXS50cmltRW5kKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzSW5mID0gZW5jb2RpbmdzTTN1OC5tYXRjaChuZXcgUmVnRXhwKGBeLiooPz1cbi4qJHtsb3dSZXNVcmx9KWAsICdtJykpPy5bMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG93UmVzSW5mKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobG93UmVzSW5mLnN1YnN0cmluZyhsb3dSZXNJbmYuaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtYXAgJyArIHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ10gKyAnIHRvICcgKyBsb3dSZXNTZXR0aW5nc1snUkVTT0xVVElPTiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzU2V0dGluZ3NbY29kZWNzS2V5XSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0gPT09ICdzdHJpbmcnICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNTZXR0aW5nc1tjb2RlY3NLZXldLmxlbmd0aCA+PSAzICYmIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0ubGVuZ3RoID49IDMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2hldicpIHx8IHJlc1NldHRpbmdzW2NvZGVjc0tleV0uc3RhcnRzV2l0aCgnaHZjJykpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN1YnN0cmluZygwLCAzKSAhPT0gbG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdWJzdHJpbmcoMCwgMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3dhcCAnICsgcmVzU2V0dGluZ3NbY29kZWNzS2V5XSArICcgdG8gJyArIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTGluZXNbal0gPSBub3JtYWxMaW5lc1tqXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XX0iYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhub3JtYWxMaW5lc1tqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTGluZXNbaiArIDFdID0gbG93UmVzVXJsICsgJyAnLnJlcGVhdChqICsgMSk7Ly8gVGhlIHN0cmVhbSBkb2Vzbid0IGxvYWQgdW5sZXNzIGVhY2ggdXJsIGxpbmUgaXMgdW5pcXVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzTTN1OCA9IG5vcm1hbExpbmVzLmpvaW4oJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPSBlbmNvZGluZ3NNM3U4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyB9CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuZ2V0KHBsYXllclR5cGUpID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNldChwbGF5ZXJUeXBlLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zb2xlLmxvZygnRm91bmQgYWRzLCBzd2l0Y2ggdG8gYmFja3VwJyArIGJhY2t1cFBsYXllclR5cGVJbmZvICsgJyBpbiAnICsgKERhdGUubm93KCkgLSBiYWNrdXBTZWFyY2hTdGFydCkgKyAnbXMg4oCUIHNpZ25pZmllcnM6ICcgKyBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpLmpvaW4oJywgJykpOwogICAgICAgIGlmIChyZWxvYWRQbGF5ZXIpIHsKICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBRF9TSUdOSUZJRVJTLnNvbWUoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFEX1NJR05JRklFUlMuZmlsdGVyKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFEX1NJR05JRklFUlMgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzKSB7CiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIGxldCBzbTsKICAgICAgICAgICAgY29uc3QgY2xhc3NSZSA9IC9FWFQtWC1EQVRFUkFOR0U6W15cbl0qQ0xBU1M9Iih0d2l0Y2gtW14iXSspIi9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gY2xhc3NSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0iJyArIHNtWzFdICsgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB0YWdSZSA9IC8oU0NURTM1LVtBLVotXSt8RVhULVgtQ1VFLVtBLVotXSspL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSB0YWdSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoc21bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN1YnN0cmluZyBjaGVjayAobm90IGV4YWN0KTogYSBjYW5kaWRhdGUgaXMgImtub3duIiBpZiBhbnkgQURfU0lHTklGSUVSCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4gIUFEX1NJR05JRklFUlMuc29tZShzID0+IGMuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQURfU0lHTklGSUVSUzogJyArIHVua25vd24uam9pbignLCAnKSArICcgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAvLyBUcmFjayBTQ1RFLTM1IENVRS1PVVQvQ1VFLUlOIGFkIGJvdW5kYXJpZXMKICAgICAgICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1PVVQnKSkgewogICAgICAgICAgICAgICAgaWYgKCFpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLU9VVCDigJQgYWQgYm91bmRhcnkgZW50ZXJlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1JTicpKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1JTiDigJQgYWQgYm91bmRhcnkgZXhpdGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmFja2luZyB1cmxzIHdoaWNoIGFwcGVhciBpbiB0aGUgb3ZlcmxheSBVSQogICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmUucmVwbGFjZUFsbChUV0lUQ0hfQURfVVJMX1JFV1JJVEVfUkVHRVgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmICghbGluZS5pbmNsdWRlcygnLGxpdmUnKSB8fCBzdHJpcEFsbFNlZ21lbnRzIHx8IEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyB8fCBpbkN1ZU91dCkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRVcmwgPSBsaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICBpZiAoIUFkU2VnbWVudENhY2hlLmhhcyhzZWdtZW50VXJsKSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoc2VnbWVudFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IGxpbmVzW2kgKyAxXS5pbmNsdWRlcyhwKSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHNlZ21lbnQgZGV0ZWN0ZWQgdmlhIFVSTCBwYXR0ZXJuOiAnICsgbGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChsaW5lc1tpICsgMV0sIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZS5pbmNsdWRlcygnLGxpdmUnKSkgewogICAgICAgICAgICAgICAgbGl2ZVNlZ21lbnRzLnB1c2goeyBleHRpbmY6IGxpbmUsIHVybDogbGluZXNbaSArIDFdIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBBUlQ6JykpIHsKICAgICAgICAgICAgICAgIC8vIExMLUhMUyBwYXJ0OiBVUkkgaXMgaW5saW5lIGFzIGFuIGF0dHJpYnV0ZS4gU3RyaXAgaWYgaXQgbWF0Y2hlcyBhIGtub3duCiAgICAgICAgICAgICAgICAvLyBhZCBVUkwgKGFscmVhZHkgaW4gY2FjaGUgZnJvbSBhIHBhcmFsbGVsIEVYVElORiBzdHJpcCwgb3IgbWF0Y2hlcyBhIFVSTCBwYXR0ZXJuKS4KICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllciBtYXkgdXNlIHRoZSBwYXJ0cyBwYXRoIHRvIGZldGNoIGFkIG1lZGlhIHZpYSBsb3ctbGF0ZW5jeS4KICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmlNYXRjaCA9IGxpbmUubWF0Y2goVVJJX0FUVFJJQlVURV9SRUdFWCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBRF9TRUdNRU5UX1VSTF9QQVRURVJOUy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBBRF9TSUdOSUZJRVJTLnNvbWUoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpKSB7CiAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLy8gTm8gbG93IGxhdGVuY3kgZHVyaW5nIGFkcyAob3RoZXJ3aXNlIGl0J3MgcG9zc2libGUgZm9yIHRoZSBwbGF5ZXIgdG8gcHJlZmV0Y2ggYW5kIGRpc3BsYXkgYWQgc2VnbWVudHMpCiAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSB8fCBsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtUFJFTE9BRC1ISU5UOicpKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID0gMDsKICAgICAgICB9CiAgICAgICAgLy8gQ2FjaGUgbGl2ZSBzZWdtZW50cyBmb3IgcmVjb3ZlcnkgKHBsdXMgdGhlIE1FRElBLVNFUVVFTkNFIG9mIHRoZSBvbGRlc3QgY2FjaGVkIHNlZ21lbnQsCiAgICAgICAgLy8gc28gdGhlIHBsYXllciBhY2NlcHRzIGluamVjdGVkIHJlY292ZXJ5IHNlZ21lbnRzIGFzIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0pCiAgICAgICAgaWYgKGxpdmVTZWdtZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyA9IGxpdmVTZWdtZW50cy5zbGljZSgtNik7CiAgICAgICAgICAgIGNvbnN0IHNlcSA9IHBhcnNlSW50KCh0ZXh0U3RyLm1hdGNoKC8jRVhULVgtTUVESUEtU0VRVUVOQ0U6KFxkKykvKSB8fCBbXSlbMV0pOwogICAgICAgICAgICBpZiAoIWlzTmFOKHNlcSkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcSA9IHNlcSArIE1hdGgubWF4KDAsIGxpdmVTZWdtZW50cy5sZW5ndGggLSBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiBhbGwgc2VnbWVudHMgd2VyZSBzdHJpcHBlZCwgdHJ5IHRvIHByZXZlbnQgYmxhY2sgc2NyZWVuIHZpYSByZWNvdmVyeSBjb250ZW50LgogICAgICAgIC8vIFByZWZlciB0aGUgZnVsbC1wbGF5bGlzdCBzbmFwc2hvdCBmcm9tIGEgcmVjZW50IG5vbi1hZCBwb2xsIChtaXJyb3JzIFRUVi1BQgogICAgICAgIC8vIExhc3RDbGVhbk5hdGl2ZU0zVTggYXBwcm9hY2gpIOKAlCBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIHdvcnRoIG9mCiAgICAgICAgLy8gY29udGVudCB2cyB0aGUgdGhpbiBwZXItc2VnbWVudCByZWNvdmVyeSBjYWNoZS4gRmFsbHMgYmFjayB0byB0aGUgcGVyLXNlZ21lbnQKICAgICAgICAvLyBjYWNoZSBpZiB0aGUgc25hcHNob3QgaXMgc3RhbGUgb3IgbWlzc2luZy4KICAgICAgICBpZiAoaGFzU3RyaXBwZWRBZFNlZ21lbnRzICYmIGxpdmVTZWdtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgPSAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgKyAxOwogICAgICAgICAgICBjb25zdCByZWNvdmVyeVRoaW4gPSAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzPy5sZW5ndGggfHwgMCkgPCAzOwogICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVUaHJlc2hvbGQgPSByZWNvdmVyeVRoaW4gPyAxIDogRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkOwogICAgICAgICAgICBpZiAoRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID4gMCAmJiBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc3QgcmVhc29uID0gcmVjb3ZlcnlUaGluID8gJyAodGhpbiByZWNvdmVyeSBjYWNoZTogJyArIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSArICcgc2VnbWVudHMpJyA6ICcnOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHRyaWdnZXJlZCDigJQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzICsgJyBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMnICsgcmVhc29uKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnVWJvUmVsb2FkUGxheWVyJyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBQcmltYXJ5OiBmcmVzaCBmdWxsLXBsYXlsaXN0IHNuYXBzaG90ICg8IDEuNXMgb2xkLCBtdXN0IG5vdCBpdHNlbGYgY29udGFpbiBhZCBtYXJrZXJzKQogICAgICAgICAgICBjb25zdCBzbmFwc2hvdEFnZSA9IHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA/IChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0KSA6IEluZmluaXR5OwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4ICYmIHNuYXBzaG90QWdlIDw9IDE1MDAgJiYgIWhhc0FkVGFncyhzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTgpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJldXNpbmcgbGFzdCBjbGVhbiBuYXRpdmUgcGxheWxpc3QgKCcgKyBzbmFwc2hvdEFnZSArICdtcyBvbGQpJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlIChleGlzdGluZyBiZWhhdmlvcikKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyAmJiBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXN0b3JpbmcgJyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggKyAnIHJlY292ZXJ5IHNlZ21lbnRzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKCcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2pdID0gJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonICsgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLmV4dGluZik7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0udXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIC8vIFRocm90dGxlIGNhY2hlIHBydW5lIHRvIG9uY2UgcGVyIDYwcy4gVGhlIDEyMHMgVFRMIGdpdmVzIHBsZW50eSBvZiBoZWFkcm9vbQogICAgICAgIC8vIGFuZCBzY2FubmluZyB0aGUgZnVsbCBjYWNoZSBvbiBldmVyeSBtM3U4IHBvbGwgYWRkcyB1cCBkdXJpbmcgaGVhdnkgYWQgYnJlYWsKICAgICAgICAvLyBzZXF1ZW5jZXMgKExMLUhMUyBjYW4gcG9sbCBtdWx0aXBsZSB0aW1lcyBwZXIgc2Vjb25kKS4gUG9ydGVkIGZyb20gVFRWLUFCLgogICAgICAgIGlmICghc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgfHwgbm93IC0gc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPiA2MDAwMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA9IG5vdzsKICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSwgbWFwKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBub3cgLSAxMjAwMDApIHsKICAgICAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBEaWFnbm9zdGljOiBsb2cgb25jZSBwZXIgc3RyZWFtSW5mbyB3aGVuIHRoZSBjYWNoZSBjcm9zc2VzIDEwMDAgZW50cmllcywKICAgICAgICAgICAgLy8gc28gY2FjaGUgYmxvYXQgZnJvbSBhIGZ1dHVyZSBUVEwvcHJ1bmUgYnVnIHdvdWxkIHN1cmZhY2UgaW4gdXNlciByZXBvcnRzCiAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc3RheWluZyBpbnZpc2libGUuCiAgICAgICAgICAgIGlmIChBZFNlZ21lbnRDYWNoZS5zaXplID4gMTAwMCAmJiAhc3RyZWFtSW5mby5Mb2dnZWRBZENhY2hlU2l6ZTFrKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEFkQ2FjaGVTaXplMWsgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTZWdtZW50Q2FjaGUgY3Jvc3NlZCAxMDAwIGVudHJpZXMgKG5vdyAnICsgQWRTZWdtZW50Q2FjaGUuc2l6ZSArICcpIOKAlCBwb3NzaWJsZSBjYWNoZSBibG9hdCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcbicpOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBjb25zdCBjdXJyZW50UmVzb2x1dGlvbiA9IHN0cmVhbUluZm8uVXJscy5nZXQodXJsKTsKICAgICAgICBpZiAoIWN1cnJlbnRSZXNvbHV0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgdW5rbm93bkFkVGFncyA9IHRleHRTdHIubWF0Y2goLyNFWFRbXjpcbl0qKD86YWR8Y3VlfHNjdGV8c3BvbnNvcilbXjpcbl0qL2dpKTsKICAgICAgICAgICAgaWYgKHVua25vd25BZFRhZ3MpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSB1bmtub3duQWRUYWdzLmZpbHRlcih0ID0+ICFBRF9TSUdOSUZJRVJTLnNvbWUocyA9PiB0LmluY2x1ZGVzKHMpKSk7CiAgICAgICAgICAgICAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVW5rbm93biBhZC1yZWxhdGVkIHRhZ3MgZm91bmQ6ICcgKyBbLi4ubmV3IFNldCh1bmtub3duKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgaGF2ZUFkVGFncyA9IGhhc0FkVGFncyh0ZXh0U3RyKSB8fCAoU2ltdWxhdGVkQWRzRGVwdGggPiAwICYmICghc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgfHwgIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLmluY2x1ZGVzKHVybCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggLSAxID4gc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXgpKTsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB2cyB0aGUgMS0yIGNhY2hlZCBpbmRpdmlkdWFsIHNlZ21lbnRzLgogICAgICAgIC8vIE1pcnJvcnMgVFRWLUFCIHNyYy9tb2R1bGVzL3Byb2Nlc3Nvci50czo3MzMtNzM2LgogICAgICAgIGlmICghaGF2ZUFkVGFncyAmJiAhc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgJiYgdGV4dFN0ci5pbmRleE9mKCcjRVhUSU5GJykgIT09IC0xKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCA9IHRleHRTdHI7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA9IERhdGUubm93KCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gc3RyZWFtSW5mby5FbmNvZGluZ3MubWF0Y2goL15odHRwczouKlwubTN1OCQvbSk/LlswXTsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdTggPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdTggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGlmICghaGFzQWRUYWdzKHN0cmVhbU0zdTgpICYmIFNpbXVsYXRlZEFkc0RlcHRoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGxheWxpc3QgaGFzIGxpdmUgc2VnbWVudHMg4oCUIGlmIG5vdCwgYmFja3VwIHN0cmVhbSBpcyBkZWFkCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0xpdmVTZWdtZW50cyA9IHRleHRTdHIuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gMiB8fCAhaGFzTGl2ZVNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gaGFzIG5vIGxpdmUgc2VnbWVudHMg4oCUIGZvcmNpbmcgaW1tZWRpYXRlIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIG1vcmUgYWRzIG9uIG1haW4gc3RyZWFtLiBTdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLiAnICsgKFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVHJpZ2dlcmluZyBwbGF5ZXIgcmVsb2FkIHRvIGdvIGJhY2sgdG8gbWFpbiBzdHJlYW0uLi4nIDogJ1Jlc3VtaW5nIHBsYXliYWNrLi4uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRzIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPT09IDAgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbU0zdTguaW5jbHVkZXMoJyJNSURST0xMIicpICYmICFzdHJlYW1NM3U4LmluY2x1ZGVzKCcibWlkcm9sbCInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBzdHJlYW1NM3U4LnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKExJVkVfU0lHTklGSUVSKSAmJiAhc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuaGFzKGxpbmVzW2kgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVxdWVzdCBvbmUgLnRzIGZpbGUgcGVyIC5tM3U4IHJlcXVlc3QgdG8gYXZvaWQgbWFraW5nIHRvbyBtYW55IHJlcXVlc3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdGZXRjaCBhZCAudHMgZmlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuYWRkKGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ibG9iKCkpLmNhdGNoKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyAmJiBoYXZlQWRUYWdzKSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUsIHJlYWxGZXRjaCwgdXJsLCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGhhdmVBZFRhZ3MgJiYgIXN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MpIHsKICAgICAgICAgICAgLy8gQ1NBSSBmYXN0IHBhdGg6IGlmIGFsbCBzZWdtZW50cyBpbiB0aGUgbWFpbiBzdHJlYW0gYXJlIGxpdmUsIHNraXAgYmFja3VwIHNlYXJjaC4KICAgICAgICAgICAgLy8gQ1NBSSBhZHMgYXJlIGRlbGl2ZXJlZCBvdXRzaWRlIHRoZSBtM3U4IOKAlCB0aGUgbWFpbiBzdHJlYW0gc2VnbWVudHMgYXJlIGNsZWFuLgogICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1haW4gc3RyZWFtIGRpcmVjdGx5LCBhdm9pZGluZyB0aGUgYmFja3VwIHN0cmVhbSBzd2l0Y2ggdGhhdCBjYXVzZXMKICAgICAgICAgICAgLy8gYSAyMC00MHMgcmVidWZmZXIgZ2FwLgogICAgICAgICAgICBjb25zdCBtYWluU3RyZWFtTGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICBsZXQgaGFzTm9uTGl2ZVNlZ21lbnQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWluU3RyZWFtTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtYWluU3RyZWFtTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVElORicpICYmICFtYWluU3RyZWFtTGluZXNbaV0uaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzTm9uTGl2ZVNlZ21lbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFzTm9uTGl2ZVNlZ21lbnQpIHsKICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBmYXN0IHBhdGgg4oCUIGFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUsIHJlYWxGZXRjaCwgdXJsLCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgZmFsc2UsIHN0cmVhbUluZm8pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pOwogICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgfQogICAgZnVuY3Rpb24gaG9va1dvcmtlckZldGNoKCkgewogICAgICAgIGNvbnNvbGUubG9nKCdob29rV29ya2VyRmV0Y2ggKHZpZGVvLXN3YXAtbmV3KScpOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IGZldGNoOwogICAgICAgIGZldGNoID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLmhhcyh1cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2goJ2RhdGE6dmlkZW8vbXA0O2Jhc2U2NCxBQUFBS0daMGVYQnRjRFF5QUFBQUFXbHpiMjF0Y0RReVpHRnphR0YyWXpGcGMyODJhR3h6WmdBQUJFbHRiMjkyQUFBQWJHMTJhR1FBQUFBQUFBQUFBQUFBQUFBQUFZYWdBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQUFBQnFIUnlZV3NBQUFCY2RHdG9aQUFBQUFNQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFVUnRaR2xoQUFBQUlHMWthR1FBQUFBQUFBQUFBQUFBQUFBQUFMdUFBQUFBQUZYRUFBQUFBQUF0YUdSc2NnQUFBQUFBQUFBQWMyOTFiZ0FBQUFBQUFBQUFBQUFBQUZOdmRXNWtTR0Z1Wkd4bGNnQUFBQUR2YldsdVpnQUFBQkJ6Yldoa0FBQUFBQUFBQUFBQUFBQWtaR2x1WmdBQUFCeGtjbVZtQUFBQUFBQUFBQUVBQUFBTWRYSnNJQUFBQUFFQUFBQ3pjM1JpYkFBQUFHZHpkSE5rQUFBQUFBQUFBQUVBQUFCWGJYQTBZUUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FRQUFBQUFMdUFBQUFBQUFBelpYTmtjd0FBQUFBRGdJQ0FJZ0FCQUFTQWdJQVVRQlVBQUFBQUFBQUFBQUFBQUFXQWdJQUNFWkFHZ0lDQUFRSUFBQUFRYzNSMGN3QUFBQUFBQUFBQUFBQUFFSE4wYzJNQUFBQUFBQUFBQUFBQUFCUnpkSE42QUFBQUFBQUFBQUFBQUFBQUFBQUFFSE4wWTI4QUFBQUFBQUFBQUFBQUFlVjBjbUZyQUFBQVhIUnJhR1FBQUFBREFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFvQUFBQUZvQUFBQUFBR0JiV1JwWVFBQUFDQnRaR2hrQUFBQUFBQUFBQUFBQUFBQUFBOUNRQUFBQUFCVnhBQUFBQUFBTFdoa2JISUFBQUFBQUFBQUFIWnBaR1VBQUFBQUFBQUFBQUFBQUFCV2FXUmxiMGhoYm1Sc1pYSUFBQUFCTEcxcGJtWUFBQUFVZG0xb1pBQUFBQUVBQUFBQUFBQUFBQUFBQUNSa2FXNW1BQUFBSEdSeVpXWUFBQUFBQUFBQUFRQUFBQXgxY213Z0FBQUFBUUFBQU94emRHSnNBQUFBb0hOMGMyUUFBQUFBQUFBQUFRQUFBSkJoZG1NeEFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW9BQmFBQklBQUFBU0FBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHUC8vQUFBQU9tRjJZME1CVFVBZS8rRUFJMmROUUI2V1VvRkFYL0xnTFVCQVFGQUFBRDZBQUE2bURnQUFIb1FBQTlDVzd5NEtBUUFFYU91UElBQUFBQkJ6ZEhSekFBQUFBQUFBQUFBQUFBQVFjM1J6WXdBQUFBQUFBQUFBQUFBQUZITjBjM29BQUFBQUFBQUFBQUFBQUFBQUFBQVFjM1JqYndBQUFBQUFBQUFBQUFBQVNHMTJaWGdBQUFBZ2RISmxlQUFBQUFBQUFBQUJBQUFBQVFBQUFDNEFBQUFBQW9BQUFBQUFBQ0IwY21WNEFBQUFBQUFBQUFJQUFBQUJBQUNDTlFBQUFBQUNRQUFBJywgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXJsID0gdXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0ciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gU3RyaW5nKGVycj8ubWVzc2FnZSB8fCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj8ubmFtZSAhPT0gJ0Fib3J0RXJyb3InICYmICEvY2FuY2VsfGFib3J0L2kudGVzdChlcnJNc2cpKSBjb25zb2xlLmxvZygnZmV0Y2ggaG9vayBlcnIgJyArIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gKG5ldyBVUkwodXJsKSkucGF0aG5hbWUubWF0Y2goLyhbXlwvXSspKD89XC5cdyskKS8pPy5bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdwYXJlbnRfZG9tYWlucycpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB0ZW1wVXJsLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBGaXJzdCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggd2l0aCB0aGUgdmlkZW8gZW5jb2RpbmdzICgzNjBwLDQ4MHAsNzIwcCxldGMpLgogICAgICAgICAgICAgICAgICAgICAgICAvLyAtIFNlY29uZCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBvYnRhaW5lZCBpbiB0aGUgZmlyc3QgcmVxdWVzdC4gQXQgdGhpcyBwb2ludCB3ZSB3aWxsIGtub3cgaWYgdGhlcmUncyBhZHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzICE9IG51bGwgJiYgKGF3YWl0IHJlYWxGZXRjaChzdHJlYW1JbmZvLkVuY29kaW5ncy5tYXRjaCgvXmh0dHBzOi4qXC5tM3U4JC9tKT8uWzBdKSkuc3RhdHVzICE9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgZW5jb2RpbmdzIGFyZSBkZWFkICh0aGUgc3RyZWFtIHByb2JhYmx5IHJlc3RhcnRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZXJUaW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCB8fCBzdHJlYW1JbmZvLkVuY29kaW5ncyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0gY3JlYXRlU3RyZWFtSW5mbyhjaGFubmVsTmFtZSwgKG5ldyBVUkwodXJsKSkuc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gc3RyZWFtSW5mby5VcmxzLnZhbHVlcygpLm5leHQoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2gocmVzb2x1dGlvbkluZm8uVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OCA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3Moc3RyZWFtTTN1OCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbkZvdW5kQWQoc3RyZWFtSW5mbywgc3RyZWFtTTN1OCwgZmFsc2UsIHJlYWxGZXRjaCwgcmVzb2x1dGlvbkluZm8uVXJsLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0cmVhbU0zdThSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW5jb2RpbmdzTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2ZXJUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPyBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA6IHN0cmVhbUluZm8uRW5jb2RpbmdzLCBzZXJ2ZXJUaW1lKSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgoZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvI0VYVC1YLVNFU1NJT04tREFUQTpEQVRBLUlEPSJTRVJWRVItVElNRSIsVkFMVUU9IihbXiJdKykiLyk7CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgnU0VSVkVSLVRJTUU9IihbMC05Ll0rKSInKTsKICAgICAgICByZXR1cm4gbWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDEgPyBtYXRjaGVzWzFdIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4KGVuY29kaW5nc00zdTgsIG5ld1NlcnZlclRpbWUpIHsKICAgICAgICBpZiAoVjJBUEkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ld1NlcnZlclRpbWUgPyBlbmNvZGluZ3NNM3U4LnJlcGxhY2UoLygjRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKVteIl0rKCIpLywgYCQxJHtuZXdTZXJ2ZXJUaW1lfSQyYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZShuZXcgUmVnRXhwKCcoU0VSVkVSLVRJTUU9IilbMC05Ll0rIicpLCBgU0VSVkVSLVRJTUU9IiR7bmV3U2VydmVyVGltZX0iYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgfQogICAgZnVuY3Rpb24gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGNvbnN0IGVuY29kaW5nc0xpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBbdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodF0gPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uLnNwbGl0KCd4JykubWFwKE51bWJlcik7CiAgICAgICAgbGV0IG1hdGNoZWRSZXNvbHV0aW9uVXJsID0gbnVsbDsKICAgICAgICBsZXQgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZhbHNlOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IGNsb3Nlc3RSZXNvbHV0aW9uRGlmZmVyZW5jZSA9IEluZmluaXR5OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RpbmdzTGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIC8vIEFjY2VwdCB2MiBBUEkgdmFyaWFudCBVUkxzIChyYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnKS4KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGVuY29kaW5nc0xpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhlbmNvZGluZ3NMaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgY29uc3QgZnJhbWVSYXRlID0gYXR0cmlidXRlc1snRlJBTUUtUkFURSddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbiA9PSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uICYmICghbWF0Y2hlZFJlc29sdXRpb25VcmwgfHwgKCFtYXRjaGVkRnJhbWVSYXRlICYmIGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRnJhbWVSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oY2hhbm5lbE5hbWUsIHBsYXllclR5cGUpIHsKICAgICAgICBjb25zdCByZWFsUGxheWVyVHlwZSA9IHBsYXllclR5cGUucmVwbGFjZSgnLUFMVCcsICcnKTsKICAgICAgICBjb25zdCBib2R5ID0gewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUGxheWJhY2tBY2Nlc3NUb2tlbicsCiAgICAgICAgICAgIHZhcmlhYmxlczogewogICAgICAgICAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgbG9naW46IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgaXNWb2Q6IGZhbHNlLAogICAgICAgICAgICAgICAgdm9kSUQ6ICIiLAogICAgICAgICAgICAgICAgcGxheWVyVHlwZTogcmVhbFBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSk7CiAgICB9CiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHksIHBsYXllclR5cGUpIHsKICAgICAgICBpZiAoIWdxbF9kZXZpY2VfaWQpIHsKICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9ICcnOwogICAgICAgICAgICBjb25zdCBjaGFycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlkJzogQ0xJRU5UX0lELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkLAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSkKICAgICAgICB9OwogICAgICAgIGlmIChwbGF5ZXJUeXBlLmluY2x1ZGVzKCctQUxUJykpIHsKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgICdDbGllbnQtSWQnOiBDTElFTlRfSUQsCiAgICAgICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0geC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArMSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXQogICAgICAgICAgICAgICAgfSkpOwogICAgfQogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCBmZXRjaFJlcXVlc3Qub3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0LCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBncWxfZGV2aWNlX2lkICE9IGRldmljZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgPSBkZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1Vib1VwZGF0ZURldmljZUlkJywgZ3FsX2RldmljZV9pZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddICE9PSBDbGllbnRJbnRlZ3JpdHlIZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicsIENsaWVudEludGVncml0eUhlYWRlciA9IGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9PT0gJ3N0cmluZycgJiYgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gIT09IEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUF1dGhvcml6YXRpb25IZWFkZXInLCBBdXRob3JpemF0aW9uSGVhZGVyID0gaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEhlYWRlcnMgJiYgZ3FsX2RldmljZV9pZCAmJiBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xvZ2dlZEhlYWRlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBHUUwgaGVhZGVycyBjYXB0dXJlZCDigJQgRGV2aWNlSWQ6ICcgKyAoZ3FsX2RldmljZV9pZCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZWRQbGF5ZXJUeXBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0JvZHkgPSBKU09OLnBhcnNlKGluaXQuYm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0JvZHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0JvZHkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keVtpXT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9keS52YXJpYWJsZXMucGxheWVyVHlwZSA9IE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlcGxhY2VkICcke3JlcGxhY2VkUGxheWVyVHlwZX0nIHBsYXllciB0eXBlIHdpdGggJyR7T1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRX0nIHBsYXllciB0eXBlYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NhaVR5cGUgPSB1cmwuaW5jbHVkZXMoJ2JwPW1pZHJvbGwnKSA/ICdtaWRyb2xsJyA6IHVybC5pbmNsdWRlcygnYnA9cHJlcm9sbCcpID8gJ3ByZXJvbGwnIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyhjc2FpVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZChjc2FpVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgYWQgcmVxdWVzdCBkZXRlY3RlZCDigJQgdHlwZTogJyArIGNzYWlUeXBlICsgJyAoY2xpZW50LXNpZGUgYWQgaW5zZXJ0aW9uLCBub3QgYmxvY2thYmxlIHZpYSBtM3U4KScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwgJ2ZldGNoJyk7CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVBZGJsb2NrQmFubmVyKGRhdGEpIHsKICAgICAgICBjb25zdCBwbGF5ZXJSb290RGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLXBsYXllcicpOwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICghdHdpdGNoUGxheWVyQW5kU3RhdGU/LnBsYXllcj8uY29yZSB8fCAhdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgdHdpdGNoUGxheWVyQW5kU3RhdGUgPSBnZXRQbGF5ZXJBbmRTdGF0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaXNMaXZlID0gdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlPy5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QLnRleHRDb250ZW50ID0gJ0Jsb2NraW5nJyArIChkYXRhLmlzTWlkcm9sbCA/ICcgbWlkcm9sbCcgOiAnJykgKyAnIGFkcycgKyAoZGF0YS5pc1N0cmlwcGluZ0FkU2VnbWVudHMgPyAnIChzdHJpcHBpbmcpJyA6ICcnKSArIChkYXRhLmFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPyAnICgnICsgZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlICsgJyknIDogJycpOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gZGF0YS5oYXNBZHMgJiYgaXNMaXZlID8gJ2Jsb2NrJyA6ICdub25lJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG1vbml0b3JMaXZlU3RhdHVzKCkgewogICAgICAgIGlmICghdHdpdGNoUGxheWVyQW5kU3RhdGU/LnBsYXllcj8uY29yZSB8fCAhdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlKSB7CiAgICAgICAgICAgIHR3aXRjaFBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaXNMaXZlID0gdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlPy5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnOwogICAgICAgIGlmICghaXNMaXZlKSB7CiAgICAgICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXIoewogICAgICAgICAgICAgICAgaGFzQWRzOiBmYWxzZQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dChtb25pdG9yTGl2ZVN0YXR1cywgMTAwMCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lciAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVhY3RSb290Tm9kZSA9PSBudWxsICYmIHJvb3ROb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBPYmplY3Qua2V5cyhyb290Tm9kZSkuZmluZCh4ID0+IHguc3RhcnRzV2l0aCgnX19yZWFjdENvbnRhaW5lcicpIHx8IHguc3RhcnRzV2l0aCgnX19yZWFjdEZpYmVyJykpOwogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZVtjb250YWluZXJOYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhY3RSb290Tm9kZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVhY3RSb290Tm9kZSA9IGZpbmRSZWFjdFJvb3ROb2RlKCk7CiAgICAgICAgaWYgKCFyZWFjdFJvb3ROb2RlKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBQcmltYXJ5OiBuYW1lZCBwcm9wZXJ0eSBsb29rdXAKICAgICAgICBsZXQgcGxheWVyID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0UGxheWVyQWN0aXZlICYmIG5vZGUucHJvcHMgJiYgbm9kZS5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlKTsKICAgICAgICBwbGF5ZXIgPSBwbGF5ZXIgJiYgcGxheWVyLnByb3BzICYmIHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlID8gcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgIGlmIChwbGF5ZXI/LnBsYXllckluc3RhbmNlKSB7CiAgICAgICAgICAgIHBsYXllciA9IHBsYXllci5wbGF5ZXJJbnN0YW5jZTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2ggaWYgVHdpdGNoIG9iZnVzY2F0ZXMgcHJvcGVydHkgbmFtZXMKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5nZXRIVE1MVmlkZW9FbGVtZW50ICYmIG5vZGUuZ2V0QnVmZmVyRHVyYXRpb24gJiYgbm9kZS5jb3JlPy5zdGF0ZSk7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGNvbnN0IHBsYXllclN0YXRlID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0U3JjICYmIG5vZGUuc2V0SW5pdGlhbFBsYXliYWNrU2V0dGluZ3MpOwogICAgICAgIC8vIEZhbGxiYWNrOiBzdHJ1Y3R1cmFsIG1hdGNoIOKAlCBzZXRTcmMgZXhpc3RzIGJ1dCBzZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyB3YXMgcmVuYW1lZAogICAgICAgIGNvbnN0IHBsYXllclN0YXRlRmFsbGJhY2sgPSAhcGxheWVyU3RhdGUgPyBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRTdHJlYW1NYW5hZ2VyTm9kZSAmJiAhbm9kZS5nZXRIVE1MVmlkZW9FbGVtZW50KSA6IG51bGw7CiAgICAgICAgLy8gRmFsbGJhY2sgMjogVFRWLUFCJ3MgYXBwcm9hY2gg4oCUIHZpZGVvUGxheWVySW5zdGFuY2Ugd2l0aCBwbGF5ZXJNb2RlCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjazIgPSAhcGxheWVyU3RhdGUgJiYgIXBsYXllclN0YXRlRmFsbGJhY2sgPyBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZT8ucGxheWVyTW9kZSAhPT0gdW5kZWZpbmVkKT8uc3RhdGU/LnZpZGVvUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgIGNvbnN0IGZpbmFsUGxheWVyU3RhdGUgPSBwbGF5ZXJTdGF0ZSB8fCBwbGF5ZXJTdGF0ZUZhbGxiYWNrIHx8IHBsYXllclN0YXRlRmFsbGJhY2syOwogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVsb2FkVHdpdGNoUGxheWVyKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgY29uc3QgcGxheWVyQW5kU3RhdGUgPSBnZXRQbGF5ZXJBbmRTdGF0ZSgpOwogICAgICAgIGlmICghcGxheWVyQW5kU3RhdGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHJlYWN0IHJvb3QnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXI7CiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBwbGF5ZXJBbmRTdGF0ZS5zdGF0ZTsKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCFwbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyIHN0YXRlJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllci5pc1BhdXNlZCgpIHx8IHBsYXllci5jb3JlPy5wYXVzZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzUGF1c2VQbGF5ICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA+IDApIHsKICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY29uc3QgY29vbGRvd25NcyA9IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDEwMDA7CiAgICAgICAgICAgIGlmIChsYXN0UmVsb2FkVGltZXN0YW1wICYmIG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXAgPCBjb29sZG93bk1zKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIGNvb2xkb3duIGFjdGl2ZSAoJyArIE1hdGgucm91bmQoKGNvb2xkb3duTXMgLSAobm93IC0gbGFzdFJlbG9hZFRpbWVzdGFtcCkpIC8gMTAwMCkgKyAncyByZW1haW5pbmcpJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVsb2FkVGltZXN0YW1wcy5wdXNoKG5vdyk7CiAgICAgICAgICAgIGNvbnN0IGZpdmVNaW5BZ28gPSBub3cgLSAzMDAwMDA7CiAgICAgICAgICAgIHdoaWxlIChyZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA+IDAgJiYgcmVsb2FkVGltZXN0YW1wc1swXSA8IGZpdmVNaW5BZ28pIHsgcmVsb2FkVGltZXN0YW1wcy5zaGlmdCgpOyB9CiAgICAgICAgICAgIGlmIChyZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA+PSAzICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA8IDkwKSB7CiAgICAgICAgICAgICAgICBFc2NhbGF0ZWRGcm9tQ29vbGRvd24gPSBSZWxvYWRDb29sZG93blNlY29uZHM7CiAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSA5MDsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEF1dG8tZXNjYWxhdGVkIHJlbG9hZCBjb29sZG93biB0byA5MHMgKDMrIHJlbG9hZHMgaW4gNSBtaW51dGVzKScpOwogICAgICAgICAgICB9IGVsc2UgaWYgKEVzY2FsYXRlZEZyb21Db29sZG93biAhPT0gbnVsbCAmJiByZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA8IDMpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIERlLWVzY2FsYXRlZCByZWxvYWQgY29vbGRvd24gYmFjayB0byAnICsgRXNjYWxhdGVkRnJvbUNvb2xkb3duICsgJ3MgKGJ1cnN0IHN1YnNpZGVkKScpOwogICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gRXNjYWxhdGVkRnJvbUNvb2xkb3duOwogICAgICAgICAgICAgICAgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0UmVsb2FkVGltZXN0YW1wID0gbm93OwogICAgICAgIH0KICAgICAgICBpZiAoaXNQYXVzZVBsYXkpIHsKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudCkgewogICAgICAgICAgICAvLyBEb3duZ3JhZGUgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAg4oCUIHNldFNyYyBleGl0cyBQaVAKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEb3duZ3JhZGVkIHJlbG9hZCB0byBwYXVzZS9wbGF5IHRvIHByZXNlcnZlIFBpUCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzS2V5UXVhbGl0eSA9ICd2aWRlby1xdWFsaXR5JzsKICAgICAgICBjb25zdCBsc0tleU11dGVkID0gJ3ZpZGVvLW11dGVkJzsKICAgICAgICBjb25zdCBsc0tleVZvbHVtZSA9ICd2b2x1bWUnOwogICAgICAgIGxldCBjdXJyZW50UXVhbGl0eUxTID0gbnVsbDsKICAgICAgICBsZXQgY3VycmVudE11dGVkTFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50Vm9sdW1lTFMgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGN1cnJlbnRRdWFsaXR5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVF1YWxpdHkpOwogICAgICAgICAgICBjdXJyZW50TXV0ZWRMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TXV0ZWQpOwogICAgICAgICAgICBjdXJyZW50Vm9sdW1lTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVZvbHVtZSk7CiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIHBsYXllci5jb3JlLnN0YXRlLnZvbHVtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLnF1YWxpdHkuZ3JvdXB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgcGxheWVyLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgIC8vIGNsZWFyZWQgY2FjaGUpLCB0aGUgdmlkZW8gc3RpbGwgbmVlZHMgdW5tdXRlIGFmdGVyIENocm9tZSdzIGF1dG9wbGF5IG11dGUgb24gcmVsb2FkLgogICAgICAgIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHdyaXRlcyB2aWRlby1tdXRlZCBhcyAneyJkZWZhdWx0Ijp0cnVlfScgd2hlbiB1c2VyIG11dGVkIHZpYSBVSTsKICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID4gMCAmJiB2aWRlb3NbMF0ubXV0ZWQgJiYgIXVzZXJJbnRlbmRlZE11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRlbnRMb2FkZWQoKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXZlbnR2LWV4dGVuc2lvbicpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6IDdUViBleHRlbnNpb24gZGV0ZWN0ZWQg4oCUIG1heSBjYXVzZSBibGFjayBzY3JlZW4gb3IgYnVmZmVyaW5nIGlzc3Vlcy4gSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMsIHRyeSBkaXNhYmxpbmcgN1RWLicpOwogICAgICAgIH0KICAgICAgICAvLyBUaGlzIHN0b3BzIFR3aXRjaCBmcm9tIHBhdXNpbmcgdGhlIHBsYXllciB3aGVuIGluIGFub3RoZXIgdGFiIGFuZCBhbiBhZCBzaG93cy4KICAgICAgICAvLyBUYWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXVjZXR0di9WaWRlb0FkQmxvY2tGb3JUd2l0Y2gvYmxvYi9jZWZjZTlkMmI1NjU3NjljNzdlMzY2NmFjODIzNGMzYWNmZTIwZDgzL2Nocm9tZS9jb250ZW50LmpzI0wzMAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Zpc2libGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9Y2F0Y2h7fQogICAgICAgIGxldCBoaWRkZW4gPSBkb2N1bWVudC5fX2xvb2t1cEdldHRlcl9fKCdoaWRkZW4nKTsKICAgICAgICBsZXQgd2Via2l0SGlkZGVuID0gZG9jdW1lbnQuX19sb29rdXBHZXR0ZXJfXygnd2Via2l0SGlkZGVuJyk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnaGlkZGVuJywgewogICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfWNhdGNoe30KICAgICAgICBjb25zdCBibG9jayA9IGUgPT4gewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgfTsKICAgICAgICBsZXQgd2FzVmlkZW9QbGF5aW5nID0gdHJ1ZTsKICAgICAgICBjb25zdCB2aXNpYmlsaXR5Q2hhbmdlID0gZSA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hyb21lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuLmFwcGx5KGRvY3VtZW50KSA9PT0gdHJ1ZSB8fCAod2Via2l0SGlkZGVuICYmIHdlYmtpdEhpZGRlbi5hcHBseShkb2N1bWVudCkgPT09IHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhc1ZpZGVvUGxheWluZyA9ICF2aWRlb3NbMF0ucGF1c2VkICYmICF2aWRlb3NbMF0uZW5kZWQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YXNWaWRlb1BsYXlpbmcgJiYgIXZpZGVvc1swXS5lbmRlZCAmJiB2aWRlb3NbMF0ucGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBibG9jayhlKTsKICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96dmlzaWJpbGl0eWNoYW5nZScsIHZpc2liaWxpdHlDaGFuZ2UsIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc0ZvY3VzJywgYmxvY2ssIHRydWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICgvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnbW96SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnd2Via2l0SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfWNhdGNoe30KICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gcmVsb2FkVHdpdGNoUGxheWVyOwogICAgZGVjbGFyZU9wdGlvbnMod2luZG93KTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgbHNSZWxvYWRBZnRlckFkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZFBsYXllckFmdGVyQWQnKTsKICAgICAgICBpZiAobHNSZWxvYWRBZnRlckFkICE9PSBudWxsKSB7CiAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSBsc1JlbG9hZEFmdGVyQWQgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQbGF5ZXJUeXBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQbGF5ZXJUeXBlICE9PSBudWxsKSB7CiAgICAgICAgICAgIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgPSBsc1BsYXllclR5cGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGluQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BpbkJhY2t1cFBsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQaW5CYWNrdXAgIT09IG51bGwpIHsKICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9IGxzUGluQmFja3VwID09PSAndHJ1ZSc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzQ29vbGRvd24gPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkQ29vbGRvd25TZWNvbmRzJykpOwogICAgICAgIGlmICghaXNOYU4obHNDb29sZG93bikgJiYgbHNDb29sZG93biA+PSAwKSB7CiAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IGxzQ29vbGRvd247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzSGlkZUFkT3ZlcmxheSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19oaWRlQWRPdmVybGF5Jyk7CiAgICAgICAgaWYgKGxzSGlkZUFkT3ZlcmxheSA9PT0gJ3RydWUnKSB7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAnLnRhcy1hZGJsb2NrLW92ZXJsYXkgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0nOwogICAgICAgICAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDb25maWc6IFJlbG9hZFBsYXllckFmdGVyQWQgPSAnICsgUmVsb2FkUGxheWVyQWZ0ZXJBZCArICcsIEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJyArIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIG1vbml0b3JMaXZlU3RhdHVzKCk7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"}] \ No newline at end of file From a7313a14d4cbb93ff74e4d69160978fcee67a1c8 Mon Sep 17 00:00:00 2001 From: Griffin Allen <40434025+griffinallen@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:24:09 -0400 Subject: [PATCH 3/5] Cold load fix In response to an issue found with this solution by the AdGuard team. Youtube seems to be enforcing a server-side ad-slot delay. The way to get around this is to force a fresh session the first (and only first) time we find a real backoff from Youtube. --- dist/resources.json | 2 +- resources/brave-yt-sabr-fix.js | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/dist/resources.json b/dist/resources.json index f96680c4..f0f4ee32 100644 --- a/dist/resources.json +++ b/dist/resources.json @@ -1 +1 @@ -[{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-auto-pip.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBicmF2ZS1hdXRvLXBpcCDigJQgYXV0b21hdGljIFBpY3R1cmUtaW4tUGljdHVyZSB0b2dnbGUgZm9yIEhUTUw1IDx2aWRlbz4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBXaGF0IGl0IGRvZXMKICogLS0tLS0tLS0tLS0tCiAqICAgMS4gRm9yY2UtZW5hYmxlcyBQaVAgb24gdmlkZW9zIHRoYXQgZXhwbGljaXRseSBkaXNhYmxlIGl0IChOZXRmbGl4LAogKiAgICAgIGNlcnRhaW4gRFJNIHBsYXllcnMpIGJ5IGNsZWFyaW5nIGBkaXNhYmxlUGljdHVyZUluUGljdHVyZWAgYW5kCiAqICAgICAgd2F0Y2hpbmcgZm9yIHNpdGVzIHRoYXQgdHJ5IHRvIHJlLXNldCBpdC4KICogICAyLiBXaXJlcyBgbWVkaWFTZXNzaW9uLnNldEFjdGlvbkhhbmRsZXIoImVudGVycGljdHVyZWlucGljdHVyZSIpYCBzbwogKiAgICAgIGJyb3dzZXJzIC8gT1NlcyB0aGF0IGZpcmUgaXQgKGF1dG8tUGlQIG9uIHRhYiBzd2l0Y2gpIGp1c3Qgd29yay4KICogICAzLiBBZGRzIGEgY2xpY2thYmxlIFBpUCBjb250cm9sOgogKiAgICAgICAgLSBOYXRpdmUgaW5qZWN0aW9uIG9uIFlvdVR1YmUgLyBUd2l0Y2ggLyBOZXRmbGl4IChtYXRjaGVzIGVhY2gKICogICAgICAgICAgc2l0ZSdzIGV4aXN0aW5nIGNvbnRyb2xzIGJhcikuCiAqICAgICAgICAtIE90aGVyd2lzZSBhIEZpcmVmb3gtc3R5bGUgIlBvcCBvdXQgdGhpcyB2aWRlbyIgaG92ZXIgcGlsbAogKiAgICAgICAgICB0aGF0IGZsb2F0cyBvdmVyIHRoZSB2aWRlbywgZmFkZXMgaW4gb24gaG92ZXIsIGZhZGVzIG91dAogKiAgICAgICAgICBhZnRlciBhIHNtYWxsIGdyYWNlIHBlcmlvZCwgYW5kIHNocmlua3MgdG8gaWNvbi1vbmx5IGFmdGVyCiAqICAgICAgICAgIHRoZSBmaXJzdCBjbGljay4KICogICA0LiBIYW5kbGVzIG1hbnkgdmlkZW9zIG9uIHRoZSBzYW1lIHBhZ2UgKGZlZWRzLCBjb21tZW50IGVtYmVkcywKICogICAgICBtb2RhbCBwbGF5ZXJzKSBhbmQgdHJhY2tzIGFkZC9yZW1vdmUgdmlhIE11dGF0aW9uT2JzZXJ2ZXIuCiAqCiAqIENvbmZpZ3VyYXRpb24gKHBlci1vcmlnaW4gbG9jYWxTdG9yYWdlKQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogICBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAKICogICAgIHVuc2V0IC8gIjEiIC8gInRydWUiIC8gInllcyIgLyAib24iICAgLT4gZ2VuZXJpYyBvdmVybGF5IHBpbGwgKGRlZmF1bHQpCiAqICAgICAiMCIgICAvICJmYWxzZSIgLyAibm8iICAgLyAib2ZmIiAgICAgIC0+IHVzZSBzaXRlLXNwZWNpZmljIG5hdGl2ZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gKFlvdVR1YmUvVHdpdGNoL05ldGZsaXgpCiAqCiAqICAgU2V0IHZpYSBEZXZUb29scyBjb25zb2xlIG9uIHRoZSBkZXNpcmVkIG9yaWdpbiwgdGhlbiByZWxvYWQgdGhlIHRhYi4KICoKICogQnJvd3NlciBzdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLQogKiAgIC0gQ2hyb21pdW0gKEJyYXZlLCBDaHJvbWUsIEVkZ2UpOiBmdWxsIHN1cHBvcnQsIGFsbCBmZWF0dXJlcy4KICogICAtIEZpcmVmb3g6IFBpUCB3b3JrcywgYnV0IEZpcmVmb3ggYWxyZWFkeSBzaGlwcyBhIGJ1aWx0LWluICJQb3Agb3V0CiAqICAgICB0aGlzIHZpZGVvIiB0b2dnbGUgc28gdGhlIHNjcmlwdCdzIHBpbGwgaXMgcmVkdW5kYW50IHRoZXJlLgogKiAgIC0gU2FmYXJpIChpT1MgMTQrKTogZmFsbHMgYmFjayB0byBgd2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZWAuIFRoZQogKiAgICAgaG92ZXIgcGlsbCBzd2l0Y2hlcyB0byBhIHRhcC10by1yZXZlYWwgcGlsbCAoMyBzIGF1dG8taGlkZSkuCiAqICAgLSBPdGhlciAvIG9sZGVyOiBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbm8gUGlQIEFQSSBpcwogKiAgICAgcHJlc2VudCBhdCBhbGwuCiAqCiAqIEFyY2hpdGVjdHVyZQogKiAtLS0tLS0tLS0tLS0KICogICAqIE9uZSBzaGFyZWQgbW91c2Vtb3ZlIC8gdG91Y2hzdGFydCAvIHNjcm9sbCAvIHJlc2l6ZSAvIGZ1bGxzY3JlZW4KICogICAgIGxpc3RlbmVyIHNldCwgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB2aWRlb3MgYXJlIG9uIHRoZSBwYWdlCiAqICAgICAoYG92ZXJsYXlzYCByZWdpc3RyeSArIGBhcm1HbG9iYWxzKClgIC8gYG1heWJlRGlzYXJtR2xvYmFscygpYCkuCiAqICAgKiBPZmYtc2NyZWVuIHZpZGVvcyBhcmUgZ2F0ZWQgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBhIHNpbmdsZQogKiAgICAgYEludGVyc2VjdGlvbk9ic2VydmVyYCAoYHZpc2libGVPdmVybGF5c2Agc3Vic2V0KS4KICogICAqIEV2ZXJ5IHBlci12aWRlbyByZWdpc3RyYXRpb24gcmVjb3JkcyBhIHRlYXJkb3duIGZ1bmN0aW9uIGluCiAqICAgICBgdmlkZW9DbGVhbnVwc2Agc28gdGhlIGxpc3RlbmVycywgb2JzZXJ2ZXJzLCBhbmQgcGlsbCBidXR0b24gYXJlCiAqICAgICBhbGwgcmVtb3ZlZCBpZiB0aGUgcGFnZSBkcm9wcyB0aGUgdmlkZW8gZWxlbWVudC4KICoKICogU291cmNlIG9mIG9yaWdpbmFsIGF1dG8tUGlQIGJlaGF2aW91cjoKICogICBodHRwczovL29sZC5yZWRkaXQuY29tL3IvYnJhdmVfYnJvd3Nlci9jb21tZW50cy8xcjhlZGc0LwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCihmdW5jdGlvbigpIHsKICBjb25zdCBWRVJTSU9OID0gInYwLjQyLXl0LWF1dG9waXAtdGFyZ2V0K2NvbmRpdGlvbmFsLXJlc3VtZSI7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFR1bmFibGVzCiAgLy8KICAvLyBDb2xsZWN0ZWQgaGVyZSBzbyBhIHVzZXIgLyBtYWludGFpbmVyIGNhbiBhZGp1c3Qgc3BhY2luZywgdGltaW5nIGFuZAogIC8vIHZpZXdwb3J0IGJlaGF2aW91ciB3aXRob3V0IGh1bnRpbmcgdGhyb3VnaCB0aGUgZmlsZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBjb25zdCBDT05GSUcgPSB7CiAgICAvLyBWZXJ0aWNhbCBvZmZzZXQgYWRkZWQgdG8gdGhlIHBpbGwncyBjZW50cmVkLW1pZC1yaWdodCBwb3NpdGlvbgogICAgLy8gKHBvc2l0aXZlID0gZG93bikuIEVtcGlyaWNhbGx5IHR1bmVkIHNvIHRoZSBwaWxsIHNpdHMgYmVsb3cgdGhlCiAgICAvLyB0eXBpY2FsIHNpdGUgY29udHJvbCBiYXIgaW5zdGVhZCBvZiBvdmVybGFwcGluZyBpdC4KICAgIFBJTExfT0ZGU0VUX1k6IDQwLAogICAgLy8gSG9yaXpvbnRhbCBnYXAgZnJvbSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdmlzaWJsZSB2aWRlbyB0byB0aGUgcGlsbC4KICAgIFBJTExfUklHSFRfTUFSR0lOOiAxMiwKICAgIC8vIE1pbmltdW0gZ2FwIGJldHdlZW4gdGhlIHBpbGwgYW5kIGFueSB2aWV3cG9ydCBlZGdlLgogICAgVklFV1BPUlRfUEFEOiA4LAogICAgLy8gRGVsYXkgYmV0d2VlbiB0aGUgY3Vyc29yIGxlYXZpbmcgdGhlIHZpZGVvL3BpbGwgcmVnaW9uIGFuZCB0aGUKICAgIC8vIHBpbGwgZmFkaW5nIG91dCDigJQgcHJvdGVjdHMgYWdhaW5zdCBmbGlja2VyIHdoZW4gdGhlIGN1cnNvcgogICAgLy8gY3Jvc3NlcyB0aGUgZ2FwIGZyb20gdmlkZW8gdG8gcGlsbC4KICAgIEhPVkVSX0dSQUNFX01TOiAxNTAsCiAgICAvLyBIb3cgbG9uZyB0aGUgcGlsbCBzdGF5cyByZXZlYWxlZCBhZnRlciBhIHRhcCBvbiBhIHRvdWNoIGRldmljZS4KICAgIFRPVUNIX1JFVkVBTF9NUzogMzAwMCwKICAgIC8vIE1heGltdW0gdGltZSB3ZSB3YWl0IGZvciBgbG9hZGVkbWV0YWRhdGFgIGJlZm9yZSBpc3N1aW5nIFBpUC4KICAgIE1FVEFEQVRBX1dBSVRfTVM6IDMwMDAsCiAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBidWZmZXIgc28gdGhlIHBpbGwgaXMgaW4gcGxhY2UgYmVmb3JlIHRoZQogICAgLy8gdmlkZW8gZnVsbHkgc2Nyb2xscyBpbnRvIHZpZXcuCiAgICBJT19ST09UX01BUkdJTjogIjEwMHB4IiwKICAgIC8vIEdyYWNlIHdpbmRvdyBhZnRlciBhIFlvdVR1YmUgU1BBIG5hdmlnYXRpb24gZHVyaW5nIHdoaWNoIHRoZSBwaWxsCiAgICAvLyBzdGF5cyBzdXBwcmVzc2VkIGV2ZW4gaWYgdGhlIG5ldyBVUkwgd291bGQgb3RoZXJ3aXNlIGJlIGVsaWdpYmxlLgogICAgLy8gTGV0cyB0aGUgd2F0Y2gtcGFnZSBwbGF5ZXIgbW91bnQgYW5kIGF2b2lkcyBhIGJyaWVmIGZsYXNoIHdoZW4gdGhlCiAgICAvLyBjdXJzb3IgaXMgc3RpbGwgYXQgdGhlIHByZXZpb3VzIGhvdmVyIHRhcmdldCdzIGNvb3JkaW5hdGVzLgogICAgWVRfTkFWX0dSQUNFX01TOiA1MDAsCiAgICAvLyBJZiBhIG5hdGl2ZSBpbmplY3RvciAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpIGtlZXBzIHJldHVybmluZwogICAgLy8gZmFsc2UgZm9yIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIGdpdmUgdXAKICAgIC8vIG9uIG5hdGl2ZSBpbmplY3Rpb24gYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQuCiAgICAvLyBHZW5lcm91cyBvbiBwdXJwb3NlIOKAlCBzbG93IHBsYXllciBtb3VudHMgKG5ldHdvcmstc3RhbGxlZCBpZnJhbWVzLAogICAgLy8gbG9uZy1ydW5uaW5nIFJlYWN0IGh5ZHJhdGlvbikgc2hvdWxkbid0IHRyaXAgdGhlIGZhbGxiYWNrLgogICAgTkFUSVZFX0ZBTExCQUNLX01TOiAxMDAwMCwKICB9OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNb2R1bGUtbGV2ZWwgc3RhdGUKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gdmlkZW8gZWxlbWVudCAtPiBjbGVhbnVwIGZ1bmN0aW9uLiBQb3B1bGF0ZWQgd2hlbiBhIHZpZGVvIGlzIHdpcmVkCiAgLy8gdXA7IGNhbGxlZCBmcm9tIHRoZSBkaXNjb3ZlcnkgTXV0YXRpb25PYnNlcnZlciB3aGVuIGEgdHJhY2tlZCB2aWRlbwogIC8vIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB3ZSBjYW4gcmVsZWFzZSBldmVyeSBsaXN0ZW5lciBhbmQgdGhlCiAgLy8gcGlsbCBET00gbm9kZSBpdCBvd25zLgogIGNvbnN0IHZpZGVvQ2xlYW51cHMgPSBuZXcgV2Vha01hcCgpOwoKICAvLyBZb3VUdWJlLXNwZWNpZmljIHN0YXRlIGZvciB0aGUgVVJMLWdhdGUgKyBTUEEtbmF2LWdyYWNlIGxvZ2ljIGluCiAgLy8gdXBkYXRlKCkuIEhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHNvIHVwZGF0ZSgpIGRvZXNuJ3QgcmUtdGVzdCB0aGUKICAvLyBob3N0IHJlZ2V4IGV2ZXJ5IHRpY2sg4oCUIGhvc3RuYW1lIGlzIGludmFyaWFudCBmb3IgdGhlIHBhZ2UgbGlmZXRpbWUsCiAgLy8gYW5kIHRoZSBwYXRobmFtZSByZWdleCBvbmx5IHJlLXJ1bnMgb24gYWN0dWFsIFNQQSBwYXRoIGNoYW5nZXMuCiAgLy8gV2h5IHRoaXMgZXhpc3RzOiBZb3VUdWJlJ3MgaG9tZXBhZ2UgLyBmZWVkIC8gc2VhcmNoIC8gY2hhbm5lbCBwYWdlcwogIC8vIHJldXNlIHRoZSBzYW1lIGBodG1sNS12aWRlby1jb250YWluZXJgIDx2aWRlbz4gZWxlbWVudCBhcyB0aGUgd2F0Y2gKICAvLyBwYWdlIGZvciBob3Zlci10aHVtYm5haWwgcHJldmlld3MsIHJlcG9zaXRpb25pbmcgaXQgb3ZlciB3aGljaGV2ZXIKICAvLyB0aHVtYm5haWwgdGhlIGN1cnNvciBpcyBvbi4gRE9NLWxldmVsIHNpZ25hbHMgKHNpemUsIG11dGVkLCBsb29wLAogIC8vIHBhcmVudCBjbGFzcykgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHByZXZpZXcgYW5kIHdhdGNoLCBzbyB0aGUgVVJMIGlzCiAgLy8gdGhlIG9ubHkgcmVsaWFibGUgZGlzdGluZ3Vpc2hlci4KICBjb25zdCBfeXRIb3N0ID0gLyg/Ol58XC4pKD86eW91dHViZVwuY29tfHlvdXR1YmUtbm9jb29raWVcLmNvbSkkL2kudGVzdChsb2NhdGlvbi5ob3N0bmFtZSk7CiAgY29uc3QgX3l0V2F0Y2hQYXRoID0gL15cLyg/OndhdGNofGVtYmVkfGxpdmV8c2hvcnRzKS87CiAgbGV0IF95dExhc3RQYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgbGV0IF95dFByZXZpZXdBcmVhID0gX3l0SG9zdCAmJiAhX3l0V2F0Y2hQYXRoLnRlc3QoX3l0TGFzdFBhdGgpOwogIGxldCBfeXROYXZBdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE92ZXJsYXkgcmVnaXN0cnkgKyB2aWV3cG9ydCBnYXRpbmcKICAvLwogIC8vIEdvYWw6IE8oMSkgZG9jdW1lbnQvd2luZG93IGxpc3RlbmVycyByZWdhcmRsZXNzIG9mIHZpZGVvIGNvdW50LCBhbmQKICAvLyBPKHZpc2libGUpIChub3QgTyh0b3RhbCkpIHdvcmsgcGVyIHNjcm9sbC9tb3VzZW1vdmUgdGljay4gQSBzaW5nbGUKICAvLyBzaGFyZWQgbGlzdGVuZXIgc2V0IHdhbGtzIHRoZSByZWdpc3RyeTsgYW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIKICAvLyBuYXJyb3dzIGl0ZXJhdGlvbiB0byB0aGUgdmlkZW9zIGFjdHVhbGx5IG9uIHNjcmVlbi4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gRXZlcnkgb3ZlcmxheSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgKGxpZmV0aW1lIHJlZ2lzdHJ5KS4KICBjb25zdCBvdmVybGF5cyA9IG5ldyBTZXQoKTsKICAvLyBTdWJzZXQgb2YgYG92ZXJsYXlzYCB3aG9zZSB2aWRlbyBpcyBjdXJyZW50bHkgaW50ZXJzZWN0aW5nIHRoZQogIC8vIHZpZXdwb3J0LiBIb3QtcGF0aCBpdGVyYXRpb24gdXNlcyB0aGlzIHNldCBzbyBvZmYtc2NyZWVuIHZpZGVvcyBpbgogIC8vIGxvbmcgZmVlZHMgZG9uJ3QgcGF5IGxheW91dCBjb3N0cyBvbiBldmVyeSBzY3JvbGwgZnJhbWUuCiAgY29uc3QgdmlzaWJsZU92ZXJsYXlzID0gbmV3IFNldCgpOwogIC8vIFJldmVyc2UgbG9va3VwIGZvciB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sgKGVudHJ5LnRhcmdldAogIC8vIGlzIHRoZSB2aWRlbyBlbGVtZW50KS4KICBjb25zdCB2aWRlb1RvT3ZlcmxheSA9IG5ldyBXZWFrTWFwKCk7CiAgbGV0IGludGVyc2VjdGlvbk9ic2VydmVyID0gbnVsbDsKICBmdW5jdGlvbiBnZXRJTygpIHsKICAgIGlmIChpbnRlcnNlY3Rpb25PYnNlcnZlcikgcmV0dXJuIGludGVyc2VjdGlvbk9ic2VydmVyOwogICAgaWYgKHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgZSA9IGVudHJpZXNbaV07CiAgICAgICAgY29uc3QgaW5zdCA9IHZpZGVvVG9PdmVybGF5LmdldChlLnRhcmdldCk7CiAgICAgICAgaWYgKCFpbnN0KSBjb250aW51ZTsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmFkZChpbnN0KTsKICAgICAgICB9IGVsc2UgaWYgKHZpc2libGVPdmVybGF5cy5kZWxldGUoaW5zdCkpIHsKICAgICAgICAgIC8vIEZvcmNlIGEgZmluYWwgdXBkYXRlIHNvIGFueSB2aXNpYmxlIHBpbGwgaGlkZXMgY2xlYW5seS4KICAgICAgICAgIGluc3QudXBkYXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7IHJvb3RNYXJnaW46IENPTkZJRy5JT19ST09UX01BUkdJTiB9KTsKICAgIHJldHVybiBpbnRlcnNlY3Rpb25PYnNlcnZlcjsKICB9CiAgLy8gTGFzdCBrbm93biBwb2ludGVyIHBvc2l0aW9uIChudW1iZXJzLCBuZXZlciB0aGUgTW91c2VFdmVudCDigJQga2VlcGluZwogIC8vIHRoZSBldmVudCBhbGl2ZSBhY3Jvc3MgckFGIHRpY2tzIHBpbnMgZXh0cmEgRE9NIHJlZmVyZW5jZXMgaW4gVjgncwogIC8vIGNsb3N1cmUgZW52aXJvbm1lbnQpLgogIGxldCBtbVggPSAwLCBtbVkgPSAwOwogIC8vIENvYWxlc2NpbmcgZmxhZ3Mg4oCUIGNvbGxhcHNlIGJ1cnN0cyBvZiBtb3VzZW1vdmUgLyBzY3JvbGwgLyBldGMuIGludG8KICAvLyBhIHNpbmdsZSBwZXItZnJhbWUgdGljayBpbnN0ZWFkIG9mIG9uZSB0aWNrIHBlciBldmVudC4KICBsZXQgbW1UaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IHVwZFRpY2tTY2hlZHVsZWQgPSBmYWxzZTsKICAvLyBUcnVlIHdoZW4gZ2xvYmFsIGxpc3RlbmVycyBhcmUgY3VycmVudGx5IGF0dGFjaGVkLiBSZWZlcmVuY2UtY291bnRlZAogIC8vIGJ5IGBvdmVybGF5cy5zaXplYCBzbyB3ZSBvbmx5IGxpc3RlbiB3aGlsZSBhdCBsZWFzdCBvbmUgb3ZlcmxheSBpcyBsaXZlLgogIGxldCBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gX21tVGljaygpIHsKICAgIG1tVGlja1NjaGVkdWxlZCA9IGZhbHNlOwogICAgY29uc3QgeCA9IG1tWCwgeSA9IG1tWTsKICAgIC8vIEl0ZXJhdGUgb25seSB0aGUgdmlzaWJsZSBzdWJzZXQ7IG9mZi1zY3JlZW4gdmlkZW9zIGNhbid0IGJlIGhvdmVyZWQuCiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC5oYW5kbGVQb2ludGVyKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX29uRG9jTW91c2VNb3ZlKGUpIHsKICAgIG1tWCA9IGUuY2xpZW50WDsKICAgIG1tWSA9IGUuY2xpZW50WTsKICAgIGlmIChtbVRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIG1tVGlja1NjaGVkdWxlZCA9IHRydWU7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX21tVGljayk7CiAgfQogIGZ1bmN0aW9uIF9vbkRvY1RvdWNoU3RhcnQoZSkgewogICAgY29uc3QgdCA9IChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB8fCAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKTsKICAgIGlmICghdCkgcmV0dXJuOwogICAgY29uc3QgeCA9IHQuY2xpZW50WCwgeSA9IHQuY2xpZW50WTsKICAgIHZpc2libGVPdmVybGF5cy5mb3JFYWNoKChpbnN0KSA9PiBpbnN0LmhhbmRsZVRvdWNoKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX3NjaGVkdWxlVXBkYXRlQWxsKCkgewogICAgaWYgKHVwZFRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIHVwZFRpY2tTY2hlZHVsZWQgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF91cGRhdGVBbGxUaWNrKTsKICB9CiAgZnVuY3Rpb24gX3VwZGF0ZUFsbFRpY2soKSB7CiAgICB1cGRUaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC51cGRhdGUoKSk7CiAgfQoKICBmdW5jdGlvbiBhcm1HbG9iYWxzKCkgewogICAgaWYgKGdsb2JhbHNBcm1lZCkgcmV0dXJuOwogICAgZ2xvYmFsc0FybWVkID0gdHJ1ZTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIGFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlRGlzYXJtR2xvYmFscygpIHsKICAgIGlmICghZ2xvYmFsc0FybWVkIHx8IG92ZXJsYXlzLnNpemUgPiAwKSByZXR1cm47CiAgICBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICAvLyBUZWFyIGRvd24gdGhlIEludGVyc2VjdGlvbk9ic2VydmVyIHRvbyDigJQgaXQncyB0aWVkIHRvIHRoZSBzYW1lCiAgICAvLyBvdmVybGF5IGxpZmVjeWNsZSBhcyB0aGUgZ2xvYmFsIGxpc3RlbmVycy4gUmUtY3JlYXRlZCBsYXppbHkgYnkKICAgIC8vIGdldElPKCkgaWYgYSBmdXR1cmUgb3ZlcmxheSByZWdpc3RlcnMuCiAgICBpZiAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHsKICAgICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICBpbnRlcnNlY3Rpb25PYnNlcnZlciA9IG51bGw7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDYXBhYmlsaXR5ICsgZW52aXJvbm1lbnQgZGV0ZWN0aW9uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBpUCBhdmFpbGFiaWxpdHkgYWNyb3NzIGJyb3dzZXJzOgogIC8vICAgSEFTX1NUQU5EQVJEX1BJUCDigJQgYHJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlYCAoQ2hyb21pdW0gLyBGaXJlZm94IC8gaU9TIDE0KykuCiAgLy8gICBIQVNfV0VCS0lUX1BJUCAgIOKAlCBvbGRlciBpT1MgU2FmYXJpJ3MgYHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGVgLgogIC8vIFRoZSBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbmVpdGhlciBpcyBwcmVzZW50LgogIGNvbnN0IEhBU19TVEFOREFSRF9QSVAgPSAhIWRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbmFibGVkOwogIGNvbnN0IEhBU19XRUJLSVRfUElQID0gIndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUiIGluIEhUTUxWaWRlb0VsZW1lbnQucHJvdG90eXBlOwogIGNvbnN0IFBJUF9TVVBQT1JURUQgPSBIQVNfU1RBTkRBUkRfUElQIHx8IEhBU19XRUJLSVRfUElQOwoKICAvLyBUb3VjaCBjYXBhYmlsaXR5IOKAlCBzd2l0Y2hlcyB0aGUgb3ZlcmxheSBmcm9tIGhvdmVyLWRyaXZlbiB0bwogIC8vIHRhcC10by1yZXZlYWwgb24gaU9TIC8gQW5kcm9pZC4KICBjb25zdCBJU19UT1VDSCA9ICJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwOwoKICAvLyBDb21iaW5lZCBmdWxsc2NyZWVuIGNoZWNrIGFjcm9zcyB0aGUgdGhyZWUgdmVuZG9yIHZhcmlhbnRzOgogIC8vICAgLSBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAgICAgICAoc3RhbmRhcmQpCiAgLy8gICAtIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IChvbGRlciBDaHJvbWl1bSAvIFNhZmFyaSBkZXNrdG9wKQogIC8vICAgLSB2aWRlby53ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbiAoaU9TIG5hdGl2ZSB2aWRlbyBmdWxsc2NyZWVuLAogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggbmV2ZXIgc2V0cyBkb2N1bWVudC4qKQogIGZ1bmN0aW9uIGlzRnVsbHNjcmVlbih2aWRlbykgewogICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICBpZiAodmlkZW8gJiYgdmlkZW8ud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW4pIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gQ29uc29sZSBvdXRwdXQuIGBsb2dgIGZvciBvbmUtbGluZSBzdWNjZXNzIG1lc3NhZ2VzIG9uIGluamVjdGlvbiwKICAvLyBgd2FybmAgZm9yIGZhaWx1cmVzIChrZXB0IHF1aWV0IGJ5IGRlZmF1bHQpLgogIGNvbnN0IFRBRyA9ICJbYnJhdmUtYXV0by1waXAgIiArIFZFUlNJT04gKyAiXSI7CiAgY29uc3QgbG9nID0gKC4uLmEpID0+IGNvbnNvbGUubG9nKFRBRywgLi4uYSk7CiAgY29uc3Qgd2FybiA9ICguLi5hKSA9PiBjb25zb2xlLndhcm4oVEFHLCAuLi5hKTsKCiAgLy8gUGljayB0aGUgYmVzdCA8dmlkZW8+IGZvciBhbiBhdXRvLVBpUCBpbnRlbnQgZmlyZWQgYnkgdGhlIE9TIC8KICAvLyBicm93c2VyLiBVc2VkIGJ5IHRoZSBnbG9iYWwgYG1lZGlhU2Vzc2lvbmAgYWN0aW9uIGhhbmRsZXIgc28gdGhlCiAgLy8gKmxhc3QqIHJlZ2lzdGVyZWQgdmlkZW8gZG9lc24ndCBnZXQgUGlQJ2QgYnkgZGVmYXVsdCDigJQgc2VlIGNvbW1lbnQKICAvLyBhdCB0aGUgcmVnaXN0cmF0aW9uIHNpdGUgZm9yIHRoZSBZb3VUdWJlIGJsYWNrLXNjcmVlbiByYXRpb25hbGUuCiAgZnVuY3Rpb24gcGlja0F1dG9QaXBUYXJnZXQoKSB7CiAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHJldHVybiBkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudDsKICAgIGNvbnN0IHZpZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgIGxldCBiZXN0UGxheWluZyA9IG51bGwsIGJlc3RQbGF5aW5nQXJlYSA9IDA7CiAgICBsZXQgYmVzdFJlYWR5ID0gbnVsbCwgYmVzdFJlYWR5QXJlYSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZHMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgdiA9IHZpZHNbaV07CiAgICAgIGlmICh2LmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKSBjb250aW51ZTsKICAgICAgY29uc3QgciA9IHYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGEgPSBNYXRoLm1heCgwLCByLndpZHRoKSAqIE1hdGgubWF4KDAsIHIuaGVpZ2h0KTsKICAgICAgaWYgKGEgPD0gMCkgY29udGludWU7CiAgICAgIGlmICghdi5wYXVzZWQgJiYgIXYuZW5kZWQgJiYgdi5yZWFkeVN0YXRlID49IDIgJiYgYSA+IGJlc3RQbGF5aW5nQXJlYSkgewogICAgICAgIGJlc3RQbGF5aW5nID0gdjsgYmVzdFBsYXlpbmdBcmVhID0gYTsKICAgICAgfQogICAgICBpZiAodi5yZWFkeVN0YXRlID49IDEgJiYgYSA+IGJlc3RSZWFkeUFyZWEpIHsKICAgICAgICBiZXN0UmVhZHkgPSB2OyBiZXN0UmVhZHlBcmVhID0gYTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJlc3RQbGF5aW5nIHx8IGJlc3RSZWFkeTsKICB9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFBpUCBpY29uIGZhY3RvcnkKICAvLwogIC8vIEJ1aWx0IHdpdGggY3JlYXRlRWxlbWVudE5TIGluc3RlYWQgb2YgaW5uZXJIVE1MIHRvIGF2b2lkIFRydXN0ZWRUeXBlcwogIC8vIC8gQ1NQIGByZXF1aXJlVHJ1c3RlZFR5cGVzRm9yICdzY3JpcHQnYCB2aW9sYXRpb25zIG9uIFlvdVR1YmUgZXRjLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERlZmVuc2UtaW4tZGVwdGggaGVscGVyIHVzZWQgd2hlbiBjbG9uaW5nIHRoaXJkLXBhcnR5IHdyYXBwZXIKICAvLyBlbGVtZW50cyAoTmV0ZmxpeCdzIC5tZWRpdW0gaWNvbiB3cmFwcGVyLCBUd2l0Y2gncyByaWdodC1jb250cm9scwogIC8vIHdyYXBwZXIpLiBjbG9uZU5vZGUoZmFsc2UpIGNhcnJpZXMgZm9yd2FyZCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMKICAvLyBhbmQgdGhlIGBzdHlsZWAgYXR0cmlidXRlIOKAlCB3ZSBzdHJpcDoKICAvLyAgIC0gYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIGBvbipgICh3b3VsZCByZS1maXJlIHRoZSBzaXRlJ3MKICAvLyAgICAgaW5saW5lIGV2ZW50IGhhbmRsZXJzIG9uIG91ciBjbG9uZSksIGFuZAogIC8vICAgLSB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgaXRzZWxmIChjb3VsZCBjYXJyeSBhIGB1cmwoLi4uKWAgdG9rZW4KICAvLyAgICAgdGhhdCB0cmlnZ2VycyBhIG5ldHdvcmsgZmV0Y2ggd2hlbiB0aGUgY2xvbmUgaXMgcGFyZW50ZWQpLCBhbmQKICAvLyAgIC0gdGhlIGBpZGAgYXR0cmlidXRlIChjbG9uaW5nIHByb2R1Y2VzIGEgZHVwbGljYXRlLCB3aGljaCB3b3VsZAogIC8vICAgICBicmVhayB0aGUgc2l0ZSdzIG93biBnZXRFbGVtZW50QnlJZCAvIENTUyAjaWQgc2VsZWN0b3JzKS4KICAvLyBXZSByZWx5IG9uIHRoZSBjbG9uZWQgZWxlbWVudCdzIGNsYXNzIGxpc3QgZm9yIHNpemluZy9zcGFjaW5nLAogIC8vIHdoaWNoIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHZpYSB0aGUgc2l0ZSdzIGV4dGVybmFsIHN0eWxlc2hlZXQuCiAgZnVuY3Rpb24gc3RyaXBJbmxpbmVIYW5kbGVycyhlbCkgewogICAgY29uc3QgYXR0cnMgPSBlbC5hdHRyaWJ1dGVzOwogICAgZm9yIChsZXQgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBhdHRyc1tpXS5uYW1lOwogICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJvbiIpIHx8IG5hbWUgPT09ICJzdHlsZSIgfHwgbmFtZSA9PT0gImlkIikgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogIH0KCiAgY29uc3QgUElQX1NWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgZnVuY3Rpb24gbWFrZVBpcFN2ZyhzaXplKSB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoUElQX1NWR19OUywgInN2ZyIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgidmlld0JveCIsICIwIDAgMjQgMjQiKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgc2l6ZSk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBzaXplKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgImN1cnJlbnRDb2xvciIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjIiKTsKICAgIGNvbnN0IHIxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMS5zZXRBdHRyaWJ1dGUoIngiLCAiMyIpOyByMS5zZXRBdHRyaWJ1dGUoInkiLCAiNSIpOwogICAgcjEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsICIxOCIpOyByMS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsICIxNCIpOyByMS5zZXRBdHRyaWJ1dGUoInJ4IiwgIjIiKTsKICAgIGNvbnN0IHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIngiLCAiMTIiKTsgcjIuc2V0QXR0cmlidXRlKCJ5IiwgIjExIik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgIjciKTsgcjIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCAiNiIpOyByMi5zZXRBdHRyaWJ1dGUoInJ4IiwgIjEiKTsKICAgIHIyLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJjdXJyZW50Q29sb3IiKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChyMSk7IHN2Zy5hcHBlbmRDaGlsZChyMik7CiAgICByZXR1cm4gc3ZnOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGlQIHRvZ2dsZSBlbnRyeSBwb2ludAogIC8vCiAgLy8gU2luZ2xlIGFzeW5jIGZ1bmN0aW9uIHNoYXJlZCBieSBldmVyeSBjbGljayBoYW5kbGVyLiBXYWxrcyB0aGUKICAvLyBhdmFpbGFibGUgQVBJcyBpbiBwcmlvcml0eSBvcmRlciBhbmQgaXMgcm9idXN0IHRvIGEgY2xpY2sgdGhhdCBsYW5kcwogIC8vIGJlZm9yZSB0aGUgdmlkZW8gaGFzIGxvYWRlZCBlbm91Z2ggbWV0YWRhdGEgKHdhaXRzIHVwIHRvIDMgcykuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlUGlwKHZpZGVvKSB7CiAgICB0cnkgewogICAgICAvLyBpT1MgU2FmYXJpIHBhdGgg4oCUIHdlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUgdG9nZ2xlcyBiZXR3ZWVuCiAgICAgIC8vICJpbmxpbmUiLCAicGljdHVyZS1pbi1waWN0dXJlIiBhbmQgImZ1bGxzY3JlZW4iLgogICAgICBpZiAoIUhBU19TVEFOREFSRF9QSVAgJiYgSEFTX1dFQktJVF9QSVAgJiYKICAgICAgICAgIHR5cGVvZiB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdmlkZW8ud2Via2l0UHJlc2VudGF0aW9uTW9kZSA9PT0gInBpY3R1cmUtaW4tcGljdHVyZSIKICAgICAgICAgID8gImlubGluZSIgOiAicGljdHVyZS1pbi1waWN0dXJlIjsKICAgICAgICB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlKHRhcmdldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIFN0YW5kYXJkIEFQSSBwYXRoLgogICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQgPT09IHZpZGVvKSB7CiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZXhpdFBpY3R1cmVJblBpY3R1cmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCAxKSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7IHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSk7IHJlc29sdmUoKTsgfTsKICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgc2V0VGltZW91dChkb25lLCBDT05GSUcuTUVUQURBVEFfV0FJVF9NUyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB2aWRlby5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGF3YWl0IHZpZGVvLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIExhc3QtcmVzb3J0IGlPUyBmYWxsYmFjayBldmVuIGlmIEhBU19TVEFOREFSRF9QSVAgd2FzIGNsYWltZWQuCiAgICAgIGlmICh0eXBlb2YgdmlkZW8ud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUoInBpY3R1cmUtaW4tcGljdHVyZSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB3YXJuKCJQaVAgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTsKICAgIH0gY2F0Y2ggKGVycikgeyB3YXJuKCJQaVAgcmVxdWVzdCBmYWlsZWQ6IiwgZXJyLm1lc3NhZ2UgfHwgZXJyKTsgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gU2l0ZS1zcGVjaWZpYyBuYXRpdmUgaW5qZWN0b3JzCiAgLy8KICAvLyBFYWNoIGluamVjdG9yIGlzIGlkZW1wb3RlbnQgKHNhZmUgdG8gcmUtcnVuIHdoZW4gdGhlIHNpdGUncyBSZWFjdAogIC8vIHJvb3QgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIpIGFuZCByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAvIGZhbHNlCiAgLy8gd2hlbiB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpc24ndCBpbiB0aGUgRE9NIHlldC4gVGhleSdyZSBkcml2ZW4gYnkKICAvLyBhIHBlcnNpc3RlbnQgTXV0YXRpb25PYnNlcnZlciBpbiBgdHJ5TmF0aXZlKClgIHNvIHJlLXJlbmRlcnMgZG9uJ3QKICAvLyBwZXJtYW5lbnRseSBsb3NlIHRoZSBidXR0b24uCiAgLy8KICAvLyBTdHJhdGVneSBhY3Jvc3Mgc2l0ZXM6CiAgLy8gICAtIFlvdVR1YmU6IGluc2VydCBhIDxidXR0b24gY2xhc3M9Inl0cC1idXR0b24iPiBhbG9uZ3NpZGUgdGhlCiAgLy8gICAgIGV4aXN0aW5nIHNldHRpbmdzL21pbmlwbGF5ZXIvc2l6ZSBpY29ucy4gSW5oZXJpdHMgWW91VHViZSdzCiAgLy8gICAgIGF1dG8tZmFkZSAvIGhvdmVyIGJlaGF2aW91ciBmb3IgZnJlZS4KICAvLyAgIC0gVHdpdGNoOiBjbG9uZSB0aGUgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgcmlnaHQtc2lkZSBjb250cm9sCiAgLy8gICAgIGJ1dHRvbiAoc2V0dGluZ3MvZnVsbHNjcmVlbi90aGVhdHJlKSBhbmQgcGxhY2Ugb3VyIGJ1dHRvbiBpbnNpZGUsCiAgLy8gICAgIHNvIHdlIGluaGVyaXQgVHdpdGNoJ3MgZmxleCBzcGFjaW5nIGNsYXNzZXMuCiAgLy8gICAtIE5ldGZsaXg6IGNsb25lIHRoZSAubWVkaXVtIGljb24gd3JhcHBlciAqYW5kKiB0aGUgM3JlbSBzcGFjZXIKICAvLyAgICAgdGhhdCBzaXRzIGJldHdlZW4gc2libGluZ3MsIHNvIHRoZSByaHl0aG0gb2YgdGhlIGljb24gcm93IGlzCiAgLy8gICAgIHByZXNlcnZlZCBhbmQgZnVsbHNjcmVlbiBzdGF5cyBpbiBpdHMgcm93LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGFkZFlvdVR1YmVCdXR0b24odmlkZW8pIHsKICAgIGlmIChfc2l0ZURpc2FibGVkKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCByaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi55dHAtcmlnaHQtY29udHJvbHMiKTsKICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTsKICAgIGlmIChyaWdodC5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgYnRuLmNsYXNzTmFtZSA9ICJ5dHAtYnV0dG9uIGJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjp0b3A7Y29sb3I6I2ZmZjsiOwogICAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDM2KTsKICAgICAgc3ZnLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTpibG9jazsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwoKICAgICAgY29uc3QgYW5jaG9yID0gcmlnaHQucXVlcnlTZWxlY3RvcigiLnl0cC1taW5pcGxheWVyLWJ1dHRvbiwgLnl0cC1zZXR0aW5ncy1idXR0b24sIC55dHAtc2l6ZS1idXR0b24iKTsKICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IucGFyZW50Tm9kZSkgewogICAgICAgIGFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShidG4sIGFuY2hvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmlnaHQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgfQogICAgICBsb2coImluamVjdGVkIG9uIFlvdVR1YmUiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgd2FybigiWW91VHViZSBpbmplY3QgZmFpbGVkOiIsIGVyci5tZXNzYWdlIHx8IGVycik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIFR3aXRjaDogY2xvbmUgdGhlIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHJpZ2h0LXNpZGUgY29udHJvbCBidXR0b24KICAvLyAoc2V0dGluZ3Mgb3IgZnVsbHNjcmVlbikgYW5kIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUgaXQsIHRoZW4gaW5zZXJ0IGF0CiAgLy8gdGhlIHNhbWUgRE9NIGxldmVsIHNvIHNwYWNpbmcvc2l6aW5nIG1hdGNoLgogIGxldCB0d2l0Y2hJbmplY3RDb3VudCA9IDA7CiAgZnVuY3Rpb24gYWRkVHdpdGNoQnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgLy8gQW5jaG9yIG9uIHRoZSBmdWxsc2NyZWVuIC8gdGhlYXRyZSByb3cgc28gd2UgbGFuZCBhbG9uZ3NpZGUgY2FzdCwKICAgIC8vIHRoZWF0cmUgYW5kIGZ1bGxzY3JlZW4g4oCUIHNldHRpbmdzIG9mdGVuIGxpdmVzIGluIGEgc2VwYXJhdGUgcm93IGluCiAgICAvLyB0aGUgcG9wb3V0IHBsYXllciBsYXlvdXQuCiAgICBjb25zdCBQRUVSX1NFTCA9CiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWZ1bGxzY3JlZW4tYnV0dG9uIl0sJyArCiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLXRoZWF0cmUtbW9kZS1idXR0b24iXSwnICsKICAgICAgJ1tkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItc2V0dGluZ3MtYnV0dG9uIl0nOwogICAgY29uc3QgYW5jaG9yQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihQRUVSX1NFTCk7CiAgICBpZiAoIWFuY2hvckJ0bikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFdhbGsgdXAgdG8gdGhlIHJvdyBjb250YWluZXIuIFR3byBzdG9wIHNpZ25hbHMsIGluIHByaW9yaXR5IG9yZGVyOgogICAgLy8gICAxLiBTdHJvbmc6IGEgcGFyZW50IHRoYXQgaGFzIG11bHRpcGxlIGNoaWxkcmVuIEFORCBjb250YWlucyBhCiAgICAvLyAgICAgIHBlZXIgY29udHJvbCBvdXRzaWRlIG91ciBjdXJyZW50IHN1YnRyZWUg4oCUIHRoYXQncyBhbG1vc3QKICAgIC8vICAgICAgY2VydGFpbmx5IHRoZSBhY3R1YWwgY29udHJvbCByb3cuCiAgICAvLyAgIDIuIFdlYWsgKGZhbGxiYWNrKTogdGhlIGZpcnN0IHBhcmVudCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuIHdlCiAgICAvLyAgICAgIHBhc3NlZCBkdXJpbmcgdGhlIHdhbGsuIFVzZWQgd2hlbiB0aGUgc3Ryb25nIHNpZ25hbCBuZXZlcgogICAgLy8gICAgICBmaXJlcywgc28gbGF5b3V0cyB0aGF0IGRvbid0IGV4cG9zZSBwZWVyIGNvbnRyb2xzIGF0IHRoZQogICAgLy8gICAgICBzYW1lIGxldmVsIHN0aWxsIHdvcmsuCiAgICAvLyBDb21iaW5lZCwgdGhpcyBhZGRyZXNzZXMgdGhlIHJldmlldyBjb25jZXJuIGFib3V0IG5vbi1jb250cm9sCiAgICAvLyBzaWJsaW5ncyBoaWphY2tpbmcgdGhlIHN0cnVjdHVyYWwgd2FsayB3aGlsZSBrZWVwaW5nIHRoZSBvcmlnaW5hbAogICAgLy8gYmVoYXZpb3VyIGFzIGEgc2FmZXR5IG5ldC4KICAgIGxldCBhbmNob3JXcmFwcGVyID0gYW5jaG9yQnRuOwogICAgbGV0IHN0cnVjdHVyYWxGYWxsYmFjayA9IG51bGw7CiAgICB3aGlsZSAoYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlICYmIGFuY2hvcldyYXBwZXIucGFyZW50Tm9kZS50YWdOYW1lICE9PSAiQk9EWSIpIHsKICAgICAgY29uc3QgcGFyZW50ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50LmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgICBjb25zdCBwZWVycyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFBFRVJfU0VMKTsKICAgICAgICBsZXQgaGFzT3V0c2lkZVBlZXIgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIWFuY2hvcldyYXBwZXIuY29udGFpbnMocGVlcnNbaV0pKSB7IGhhc091dHNpZGVQZWVyID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc091dHNpZGVQZWVyKSBicmVhazsKICAgICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgc3RydWN0dXJhbEZhbGxiYWNrID0gYW5jaG9yV3JhcHBlcjsKICAgICAgfQogICAgICBhbmNob3JXcmFwcGVyID0gcGFyZW50OwogICAgfQogICAgaWYgKCFhbmNob3JXcmFwcGVyLnBhcmVudE5vZGUgfHwgYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlLnRhZ05hbWUgPT09ICJCT0RZIikgewogICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgcmV0dXJuIGZhbHNlOwogICAgICBhbmNob3JXcmFwcGVyID0gc3RydWN0dXJhbEZhbGxiYWNrOwogICAgfQogICAgY29uc3Qgcm93ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKICAgIGlmIChyb3cucXVlcnlTZWxlY3RvcigiLmJyYXZlLXBpcC1idG4iKSkgcmV0dXJuIHRydWU7CiAgICAvLyBTYW5pdHkgY2hlY2s6IGEgaGVhbHRoeSBUd2l0Y2ggcmlnaHQtY29udHJvbHMgcm93IGNvbnRhaW5zIGF0CiAgICAvLyBsZWFzdCB0d28gb2YgdGhlIHBlZXIgYnV0dG9ucyAoc2V0dGluZ3MgKyB0aGVhdHJlICsgZnVsbHNjcmVlbikuCiAgICAvLyBJZiBvbmx5IG9uZSBpcyBwcmVzZW50LCB0aGUgd2FsayBsYW5kZWQgb24gYSBkZWdlbmVyYXRlIHJvdwogICAgLy8gKHBvcG91dCAvIGRldGFjaGVkIHBsYXllciAvIGZ1dHVyZSByZWRlc2lnbikgYW5kIHdlIHNob3VsZCBiYWlsCiAgICAvLyByYXRoZXIgdGhhbiBtaXMtdGFyZ2V0LiBDaGVhcCDigJQgb25lIHF1ZXJ5U2VsZWN0b3JBbGwsIG5vIHdhbGtpbmcuCiAgICBpZiAocm93LnF1ZXJ5U2VsZWN0b3JBbGwoUEVFUl9TRUwpLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTsKCiAgICB0cnkgewogICAgICAvLyBDbG9uZSB0aGUgYW5jaG9yJ3Mgb3V0ZXIgd3JhcHBlciAoc2hhbGxvdykgc28gd2UgaW5oZXJpdCBUd2l0Y2gncwogICAgICAvLyBzcGFjaW5nL2ZsZXggY2xhc3NlcywgdGhlbiBkcm9wIG91ciBvd24gYnV0dG9uIGluc2lkZS4KICAgICAgY29uc3Qgd3JhcHBlciA9IGFuY2hvcldyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hLXRhcmdldCIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpOwogICAgICBzdHJpcElubGluZUhhbmRsZXJzKHdyYXBwZXIpOwoKICAgICAgLy8gU2l6ZSBmcm9tIHRoZSByZW5kZXJlZCBTVkcgZ2x5cGggKHZpc3VhbGx5IGFjY3VyYXRlKS4gRmxvb3IgYXQgMjQKICAgICAgLy8gYmVjYXVzZSBUd2l0Y2gncyB1bmRlcmx5aW5nIFNWRyBlbGVtZW50IGlzIHNvbWV0aW1lcyBzbWFsbGVyIHRoYW4KICAgICAgLy8gdGhlIHZpc3VhbCBpY29uIChDU1Mgc2NhbGVzIGl0IHVwKS4KICAgICAgY29uc3QgcmVmU3ZnID0gYW5jaG9yQnRuLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpOwogICAgICBjb25zdCByZWZTdmdSZWN0ID0gcmVmU3ZnID8gcmVmU3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDsKICAgICAgY29uc3QgcmVmQnRuUmVjdCA9IGFuY2hvckJ0bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgbWVhc3VyZWQgPSByZWZTdmdSZWN0ICYmIHJlZlN2Z1JlY3Qud2lkdGggPiAwCiAgICAgICAgPyBNYXRoLm1pbihyZWZTdmdSZWN0LndpZHRoLCByZWZTdmdSZWN0LmhlaWdodCkKICAgICAgICA6IE1hdGgubWluKHJlZkJ0blJlY3Qud2lkdGgsIHJlZkJ0blJlY3QuaGVpZ2h0KSAqIDAuNzsKICAgICAgY29uc3QgaWNvblNpemUgPSBNYXRoLm1heCgyNCwgTWF0aC5yb3VuZChtZWFzdXJlZCkpOwogICAgICBjb25zdCBib3hTaXplID0gTWF0aC5tYXgoMzAsIE1hdGgucm91bmQocmVmQnRuUmVjdC53aWR0aCB8fCAzMCkpOwoKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgIGJ0bi5jbGFzc05hbWUgPSAiYnJhdmUtcGlwLWJ0biI7CiAgICAgIGJ0bi50eXBlID0gImJ1dHRvbiI7CiAgICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgICBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlBpY3R1cmUtaW4tUGljdHVyZSIpOwogICAgICBidG4uc3R5bGUuY3NzVGV4dCA9CiAgICAgICAgImJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7cGFkZGluZzowO21hcmdpbjowOyIgKwogICAgICAgICJjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyIgKwogICAgICAgICJ3aWR0aDoiICsgYm94U2l6ZSArICJweDtoZWlnaHQ6IiArIGJveFNpemUgKyAicHg7IjsKICAgICAgY29uc3Qgc3ZnID0gbWFrZVBpcFN2ZyhpY29uU2l6ZSk7CiAgICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7Y29sb3I6I2ZmZjsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwogICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGJ0bik7CgogICAgICByb3cuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIGFuY2hvcldyYXBwZXIpOwoKICAgICAgdHdpdGNoSW5qZWN0Q291bnQrKzsKICAgICAgaWYgKHR3aXRjaEluamVjdENvdW50ID09PSAxKSBsb2coImluamVjdGVkIG9uIFR3aXRjaCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICB3YXJuKCJUd2l0Y2ggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyBOZXRmbGl4OiBpbnNlcnQgaW50byB0aGUgc3RhbmRhcmQgY29udHJvbHMgYmFyLCBiZWZvcmUgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uLgogIC8vIE5ldGZsaXggcmFuZG9taXplcyBjbGFzcyBuYW1lcyBidXQgaWNvbnMgZm9sbG93IGEgY29uc2lzdGVudCBwYXR0ZXJuOgogIC8vICAgPGZsZXgtcm93PgogIC8vICAgICA8c3BhY2VyIC4xbnBxeXdyPiAuLi4gPHdyYXBwZXIgLm1lZGl1bT4gPGljb24tYnV0dG9uPiA8L3dyYXBwZXI+CiAgLy8gICAgIDxzcGFjZXIgLjFucHF5d3I+ICAgICA8d3JhcHBlciAubWVkaXVtPiA8aWNvbi1idXR0b24+IDwvd3JhcHBlcj4KICAvLyAgICAgPHNwYWNlciAuMW5wcXl3cj4gICAgIDx3cmFwcGVyIC5tZWRpdW0+IDxpY29uLWJ1dHRvbiBkYXRhLXVpYT0iY29udHJvbC1mdWxsc2NyZWVuLS4uLiI+IDwvd3JhcHBlcj4KICAvLyBXZSBjbG9uZSB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyIChhbmQgdGhlIHNwYWNlciBpbiBmcm9udCBvZiBpdCkgc28gb3VyCiAgLy8gYnV0dG9uIGdldHMgdGhlIHNhbWUgc3R5bGluZyBhbmQgcmh5dGhtIGFzIG5hdGl2ZSBpY29ucy4KICBsZXQgbmZseEluamVjdENvdW50ID0gMDsKICBmdW5jdGlvbiBhZGROZXRmbGl4QnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJyk7CiAgICBpZiAoIWJhcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGJhci5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBmcyA9IGJhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1lbnRlciJdLCBbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1leGl0Il0nKTsKICAgICAgaWYgKCFmcykgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRmluZCBOZXRmbGl4J3MgaWNvbiB3cmFwcGVyIGFyb3VuZCBmdWxsc2NyZWVuIOKAlCB0aGUgLm1lZGl1bSBjbGFzcwogICAgICAvLyBpcyB0aGUgc3RhYmxlIHNpZ25hbDsgZmFsbCBiYWNrIHRvIHRoZSBjbG9zZXN0IGRpdi4KICAgICAgY29uc3QgZnNXcmFwcGVyID0gZnMuY2xvc2VzdCgiLm1lZGl1bSIpIHx8IGZzLmNsb3Nlc3QoImRpdiIpIHx8IGZzOwogICAgICBjb25zdCByb3cgPSBmc1dyYXBwZXIucGFyZW50Tm9kZTsKICAgICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFNpemUgZnJvbSB0aGUgaW5uZXIgc3ZnIG9mIGZ1bGxzY3JlZW4ncyBidXR0b24gc28gd2UgdmlzdWFsbHkgbWF0Y2guCiAgICAgIGNvbnN0IHJlZlN2ZyA9IGZzLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpIHx8IChmcy5jbG9zZXN0KCJidXR0b24iKSB8fCBmcykucXVlcnlTZWxlY3Rvcigic3ZnIik7CiAgICAgIGNvbnN0IHJlZlN2Z1JlY3QgPSByZWZTdmcgPyByZWZTdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsOwogICAgICBjb25zdCBpY29uU2l6ZSA9IHJlZlN2Z1JlY3QgJiYgcmVmU3ZnUmVjdC53aWR0aCA+IDAKICAgICAgICA/IE1hdGgucm91bmQoTWF0aC5taW4ocmVmU3ZnUmVjdC53aWR0aCwgcmVmU3ZnUmVjdC5oZWlnaHQpKQogICAgICAgIDogMjg7CgogICAgICAvLyBDbG9uZSB0aGUgd3JhcHBlciAoc2hhbGxvdyDigJQgcHJlc2VydmVzIGNsYXNzZXMvaW5saW5lIHN0eWxlcykgYW5kCiAgICAgIC8vIGVtcHR5IGl0LCB0aGVuIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUuCiAgICAgIGNvbnN0IHdyYXBwZXIgPSBmc1dyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS11aWEiKTsKICAgICAgc3RyaXBJbmxpbmVIYW5kbGVycyh3cmFwcGVyKTsKCiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidG4uY2xhc3NOYW1lID0gImJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPQogICAgICAgICJiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO3BhZGRpbmc6MDttYXJnaW46MDsiICsKICAgICAgICAid2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyI7CiAgICAgIGNvbnN0IHN2ZyA9IG1ha2VQaXBTdmcoaWNvblNpemUpOwogICAgICBzdmcuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OmJsb2NrOyI7CiAgICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZVBpcCh2aWRlbyk7IH0pOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBfb25OYXRpdmVCdG5Db250ZXh0TWVudSk7CiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYnRuKTsKCiAgICAgIC8vIENsb25lIHRoZSBzcGFjZXIgdGhhdCBwcmVjZWRlcyB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyLCBzbyBzcGFjaW5nCiAgICAgIC8vIGJldHdlZW4gb3VyIGJ1dHRvbiBhbmQgZnVsbHNjcmVlbiBtYXRjaGVzIHRoZSByaHl0aG0gYmV0d2VlbgogICAgICAvLyBleGlzdGluZyBpY29ucy4KICAgICAgY29uc3QgcHJldlNwYWNlciA9IGZzV3JhcHBlci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwogICAgICBjb25zdCBzcGFjZXJDbG9uZSA9IChwcmV2U3BhY2VyICYmIHByZXZTcGFjZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKQogICAgICAgID8gcHJldlNwYWNlci5jbG9uZU5vZGUoZmFsc2UpCiAgICAgICAgOiBudWxsOwoKICAgICAgcm93Lmluc2VydEJlZm9yZSh3cmFwcGVyLCBmc1dyYXBwZXIpOwogICAgICBpZiAoc3BhY2VyQ2xvbmUpIHJvdy5pbnNlcnRCZWZvcmUoc3BhY2VyQ2xvbmUsIGZzV3JhcHBlcik7CgogICAgICBuZmx4SW5qZWN0Q291bnQrKzsKICAgICAgaWYgKG5mbHhJbmplY3RDb3VudCA9PT0gMSkgbG9nKCJpbmplY3RlZCBvbiBOZXRmbGl4Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHdhcm4oIk5ldGZsaXggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBHZW5lcmljIEZpcmVmb3gtc3R5bGUgb3ZlcmxheQogIC8vCiAgLy8gVXNlZCBvbiBldmVyeSBzaXRlIGJ5IGRlZmF1bHQgKHVubGVzcyBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAgaXMKICAvLyBleHBsaWNpdGx5IHNldCB0byAiMCIpLiBNaW1pY3MgRmlyZWZveCdzICJQb3Agb3V0IHRoaXMgdmlkZW8iIHRvZ2dsZToKICAvLyBhIGRhcmsgcGlsbCBhbmNob3JlZCBtaWQtcmlnaHQgb2YgdGhlIHZpZGVvIHRoYXQgZmFkZXMgaW4gb24gaG92ZXIKICAvLyBhbmQgZmFkZXMgb3V0IGFmdGVyIHRoZSBjdXJzb3IgbGVhdmVzLiBBZnRlciB0aGUgdXNlciBjbGlja3Mgb25jZSBpdAogIC8vIHNocmlua3MgdG8gaWNvbi1vbmx5IGZvciB0aGUgcmVzdCBvZiB0aGUgc2Vzc2lvbiDigJQgbGVzcyB2aXN1YWwgbm9pc2UKICAvLyBvbiBzdWJzZXF1ZW50IGhvdmVycy4KICAvLwogIC8vIEhvdmVyIGRldGVjdGlvbiBydW5zIHRocm91Z2ggdGhlIHNoYXJlZCBgX29uRG9jTW91c2VNb3ZlYCBoYW5kbGVyCiAgLy8gKHNlZSB0b3Agb2YgZmlsZSkgaW5zdGVhZCBvZiBgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIpYCwKICAvLyBiZWNhdXNlIG1hbnkgcGxheWVycyAoTmV0ZmxpeCwgY3VzdG9tKSBsYXllciB0aGVpciBVSSBvbiB0b3Agb2YgdGhlCiAgLy8gPHZpZGVvPiBhbmQgYWJzb3JiIG1vdXNlIGV2ZW50cyBiZWZvcmUgdGhleSByZWFjaCBpdC4gQSBnbG9iYWwKICAvLyBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIGJ5cGFzc2VzIHRoYXQuCiAgLy8KICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSBwaWxsIGlzIHRhcC10by1yZXZlYWwgKDMgcyBhdXRvLWZhZGUpIGluc3RlYWQuCiAgLy8KICAvLyBgdGVhcmRvd25zYCBpcyBhbiBhcnJheSB0aGUgY2FsbGVyIChgYXR0YWNoVG9WaWRlb2ApIGhhbmRzIGluOyB3ZQogIC8vIHB1c2ggY2xlYW51cCBjbG9zdXJlcyBvbnRvIGl0IHNvIGEgbGF0ZXIgY2xlYW51cCBvZiB0aGlzIHZpZGVvCiAgLy8gcmVsZWFzZXMgZXZlcnkgbGlzdGVuZXIgLyBvYnNlcnZlciAvIERPTSBub2RlIHdlIGNyZWF0ZWQgaGVyZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIFJlYWNoaW5nIGhlcmUgbWVhbnMgYGF0dGFjaFRvVmlkZW9gJ3MgYHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKWAKICAgIC8vIGd1YXJkIGFscmVhZHkgc2hvcnQtY2lyY3VpdGVkIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zLCBzbyBubwogICAgLy8gc2VwYXJhdGUgZGF0YXNldCBtYXJrZXIgaXMgbmVlZGVkLgogICAgLy8gUGVyLW9yaWdpbiBvcHQtb3V0OiBza2lwIGJ1aWxkaW5nIGFueXRoaW5nIGlmIHRoZSB1c2VyIHByZXZpb3VzbHkKICAgIC8vIGRpc2FibGVkIHRoZSBwaWxsIG9uIHRoaXMgc2l0ZSB2aWEgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuCiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuOwogICAgY29uc3QgUEFERElOR19GVUxMID0gIjhweCAxNHB4IDhweCAxMHB4IjsKICAgIGNvbnN0IFBBRERJTkdfSUNPTiA9ICI4cHgiOwoKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgYnRuLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0KICAgICAgInBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDsiICsKICAgICAgInBhZGRpbmc6IiArIFBBRERJTkdfRlVMTCArICI7IiArCiAgICAgICJib3JkZXI6MDtib3JkZXItcmFkaXVzOjhweDsiICsKICAgICAgImJhY2tncm91bmQ6cmdiYSgyOCwyOCwzMCwwLjkyKTtjb2xvcjojZmZmOyIgKwogICAgICAiZm9udDo2MDAgMTNweC8xIHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxzYW5zLXNlcmlmOyIgKwogICAgICAiY3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiYm94LXNoYWRvdzowIDJweCA4cHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAib3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAwLjE1cyBlYXNlOyIgKwogICAgICAicG9pbnRlci1ldmVudHM6YXV0bzt1c2VyLXNlbGVjdDpub25lOyI7CiAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDE4KTsKICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7IjsKICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICJQb3Agb3V0IHRoaXMgdmlkZW8iOwogICAgYnRuLmFwcGVuZENoaWxkKGxhYmVsKTsKCiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCAoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNob3dEaXNhYmxlTWVudShlLmNsaWVudFgsIGUuY2xpZW50WSk7CiAgICB9KTsKCiAgICBsZXQgY2xpY2tlZCA9IGZhbHNlOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBpZiAoIWNsaWNrZWQpIHsKICAgICAgICBjbGlja2VkID0gdHJ1ZTsKICAgICAgICAvLyBTdXBwcmVzcyBmYWRlIHNvIHRoZSBpY29uLW9ubHkgcGlsbCBpcyBpbiBpdHMgZmluYWwgcG9zaXRpb24KICAgICAgICAvLyBiZWZvcmUgdGhlIHVzZXIgbm90aWNlcyB0aGUgY2hhbmdlLgogICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gYnRuLnN0eWxlLnRyYW5zaXRpb247CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSAibm9uZSI7CiAgICAgICAgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9IFBBRERJTkdfSUNPTjsKICAgICAgICBidG4uc3R5bGUuZ2FwID0gIjAiOwogICAgICAgIHVwZGF0ZSgpOyAvLyBzeW5jaHJvbm91cyByZXBvc2l0aW9uIGZvciB0aGUgbmV3IChzbWFsbGVyKSBib3gKICAgICAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyB0aGUgbmV4dCBzdHlsZSBjaGFuZ2UgaXMgY29tbWl0dGVkIHdpdGhvdXQKICAgICAgICAvLyBhIHRyYW5zaXRpb24sIHRoZW4gcmVzdG9yZSB0aGUgZmFkZSB0cmFuc2l0aW9uLgogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMKICAgICAgICBidG4ub2Zmc2V0V2lkdGg7CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsKICAgICAgfQogICAgICB0b2dnbGVQaXAodmlkZW8pOwogICAgfSk7CiAgICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGJ0bik7CgogICAgbGV0IGhvdmVyID0gZmFsc2U7CiAgICBsZXQgaG92ZXJUaW1lciA9IG51bGw7CiAgICBsZXQgbGFzdFJlY3QgPSBudWxsOwogICAgbGV0IHRvdWNoSGlkZVRpbWVyID0gbnVsbDsKICAgIGZ1bmN0aW9uIHNldEhvdmVyKHYpIHsKICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICBpZiAodikgeyBob3ZlciA9IHRydWU7IHVwZGF0ZSgpOyB9CiAgICAgIGVsc2UgICB7IGhvdmVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgaG92ZXIgPSBmYWxzZTsgdXBkYXRlKCk7IH0sIENPTkZJRy5IT1ZFUl9HUkFDRV9NUyk7IH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0OwogICAgICBpZiAoIXIpIHJldHVybjsKICAgICAgY29uc3Qgb3ZlclZpZGVvID0KICAgICAgICB4ID49IHIubGVmdCAmJiB4IDw9IHIucmlnaHQgJiYKICAgICAgICB5ID49IHIudG9wICAmJiB5IDw9IHIuYm90dG9tOwogICAgICBsZXQgb3ZlckJ0biA9IGZhbHNlOwogICAgICBpZiAoYnRuLnN0eWxlLmRpc3BsYXkgIT09ICJub25lIikgewogICAgICAgIGNvbnN0IGJSZWN0ID0gYnRuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIG92ZXJCdG4gPQogICAgICAgICAgeCA+PSBiUmVjdC5sZWZ0ICYmIHggPD0gYlJlY3QucmlnaHQgJiYKICAgICAgICAgIHkgPj0gYlJlY3QudG9wICAmJiB5IDw9IGJSZWN0LmJvdHRvbTsKICAgICAgfQogICAgICBpZiAob3ZlclZpZGVvIHx8IG92ZXJCdG4pIHsgaWYgKCFob3Zlcikgc2V0SG92ZXIodHJ1ZSk7IH0KICAgICAgZWxzZSBpZiAoaG92ZXIpIHNldEhvdmVyKGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0IHx8IHZpZGVvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBsYXN0UmVjdCA9IHI7CiAgICAgIGNvbnN0IG92ZXJWaWRlbyA9CiAgICAgICAgeCA+PSByLmxlZnQgJiYgeCA8PSByLnJpZ2h0ICYmCiAgICAgICAgeSA+PSByLnRvcCAgJiYgeSA8PSByLmJvdHRvbTsKICAgICAgaWYgKCFvdmVyVmlkZW8pIHJldHVybjsKICAgICAgc2V0SG92ZXIodHJ1ZSk7CiAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgY2xlYXJUaW1lb3V0KHRvdWNoSGlkZVRpbWVyKTsKICAgICAgdG91Y2hIaWRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0b3VjaEhpZGVUaW1lciA9IG51bGw7CiAgICAgICAgc2V0SG92ZXIoZmFsc2UpOwogICAgICB9LCBDT05GSUcuVE9VQ0hfUkVWRUFMX01TKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgIC8vIE1hdGNoIEZpcmVmb3g6IHNob3cgb24gaG92ZXIgcmVnYXJkbGVzcyBvZiBwYXVzZWQgc3RhdGUuIE9ubHkKICAgICAgLy8gcmVxdWlyZSB0aGF0IHRoZSB2aWRlbyBoYXMgbWV0YWRhdGEgbG9hZGVkIChzbyBQaVAgaXMgdXNhYmxlKSwKICAgICAgLy8gaXMgdmlzaWJsZSwgYW5kIHdlJ3JlIG5vdCBpbiBmdWxsc2NyZWVuIChpbmNsLiBpT1Mgd2Via2l0IEZTKS4KICAgICAgLy8gQWxzbyBob25vdXIgYSBtaWQtc2Vzc2lvbiBkaXNhYmxlIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUKICAgICAgLy8gKGNhY2hlZCBgX3NpdGVEaXNhYmxlZGAgZmxhZyDigJQgbm8gbG9jYWxTdG9yYWdlIGhpdCBwZXIgdGljaykuCiAgICAgIGlmIChfc2l0ZURpc2FibGVkKSB7CiAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlYWR5ID0gdmlkZW8ucmVhZHlTdGF0ZSA+PSAxOwogICAgICBjb25zdCBmcyA9IGlzRnVsbHNjcmVlbih2aWRlbyk7CiAgICAgIGNvbnN0IHIgPSB2aWRlby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbGFzdFJlY3QgPSByOwogICAgICBjb25zdCBvblNjcmVlbiA9IHIud2lkdGggPiAwICYmIHIuaGVpZ2h0ID4gMCAmJiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCBpbm5lckhlaWdodDsKICAgICAgLy8gWW91VHViZSBVUkwgZ2F0ZSArIFNQQS1uYXYtZ3JhY2UuIFJlZnJlc2ggdGhlIGNhY2hlZCBwcmV2aWV3LWFyZWEKICAgICAgLy8gZmxhZyBhbmQgc3RhbXAgYSBuYXZpZ2F0aW9uIHRpbWVzdGFtcCBvbiBwYXRoIGNoYW5nZSwgdGhlbgogICAgICAvLyBzdXBwcmVzcyBlbGlnaWJpbGl0eSB3aGlsZSB3ZSdyZSBlaXRoZXIgb24gYSBub24td2F0Y2ggVVJMIG9yCiAgICAgIC8vIGluc2lkZSB0aGUgcG9zdC1uYXYgZ3JhY2Ugd2luZG93IChhYnNvcmJzIHRoZSBicmllZiBmbGFzaCB3aGVuCiAgICAgIC8vIGEgaG9tZXBhZ2UgdGh1bWJuYWlsIGNsaWNrIGxhbmRzIHRoZSBjdXJzb3Igb24gdGhlIG5ldyBwbGF5ZXIpLgogICAgICBpZiAoX3l0SG9zdCAmJiBfeXRMYXN0UGF0aCAhPT0gbG9jYXRpb24ucGF0aG5hbWUpIHsKICAgICAgICBfeXRMYXN0UGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgIF95dFByZXZpZXdBcmVhID0gIV95dFdhdGNoUGF0aC50ZXN0KF95dExhc3RQYXRoKTsKICAgICAgICBfeXROYXZBdCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICAgIGNvbnN0IF9pbk5hdkdyYWNlID0gX3l0TmF2QXQgJiYgKHBlcmZvcm1hbmNlLm5vdygpIC0gX3l0TmF2QXQpIDwgQ09ORklHLllUX05BVl9HUkFDRV9NUzsKICAgICAgY29uc3QgZWxpZ2libGUgPSByZWFkeSAmJiAhZnMgJiYgb25TY3JlZW4gJiYgIV95dFByZXZpZXdBcmVhICYmICFfaW5OYXZHcmFjZTsKICAgICAgaWYgKCFlbGlnaWJsZSkgewogICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gIm5vbmUiOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtZmxleCI7CiAgICAgIGNvbnN0IHcgPSBidG4ub2Zmc2V0V2lkdGggfHwgMTcwOwogICAgICBjb25zdCBoID0gYnRuLm9mZnNldEhlaWdodCB8fCAzNjsKCiAgICAgIC8vIENvbXB1dGUgbWlkLXJpZ2h0IG9mIHRoZSAqdmlzaWJsZSogcG9ydGlvbiBvZiB0aGUgdmlkZW8gKHRoZQogICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgaXRzIHJlY3Qgd2l0aCB0aGUgdmlld3BvcnQpLiBOZXRmbGl4J3MgPHZpZGVvPgogICAgICAvLyBjYW4gYmUgbXVjaCB0YWxsZXIgdGhhbiB0aGUgdmlld3BvcnQuCiAgICAgIGNvbnN0IHZpc1RvcCA9IE1hdGgubWF4KHIudG9wLCAwKTsKICAgICAgY29uc3QgdmlzQm90dG9tID0gTWF0aC5taW4oci5ib3R0b20sIGlubmVySGVpZ2h0KTsKICAgICAgY29uc3QgdmlzUmlnaHQgPSBNYXRoLm1pbihyLnJpZ2h0LCBpbm5lcldpZHRoKTsKICAgICAgbGV0IHRvcCA9IE1hdGgucm91bmQodmlzVG9wICsgKHZpc0JvdHRvbSAtIHZpc1RvcCAtIGgpIC8gMikgKyBDT05GSUcuUElMTF9PRkZTRVRfWTsKICAgICAgbGV0IGxlZnQgPSBNYXRoLnJvdW5kKHZpc1JpZ2h0IC0gdyAtIENPTkZJRy5QSUxMX1JJR0hUX01BUkdJTik7CiAgICAgIC8vIEZpbmFsIHZpZXdwb3J0IGNsYW1wLgogICAgICB0b3AgPSBNYXRoLm1heChDT05GSUcuVklFV1BPUlRfUEFELCBNYXRoLm1pbih0b3AsIGlubmVySGVpZ2h0IC0gaCAtIENPTkZJRy5WSUVXUE9SVF9QQUQpKTsKICAgICAgbGVmdCA9IE1hdGgubWF4KENPTkZJRy5WSUVXUE9SVF9QQUQsIE1hdGgubWluKGxlZnQsIGlubmVyV2lkdGggLSB3IC0gQ09ORklHLlZJRVdQT1JUX1BBRCkpOwoKICAgICAgYnRuLnN0eWxlLnRvcCA9IHRvcCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gaG92ZXIgPyAiMSIgOiAiMCI7CiAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gaG92ZXIgPyAiYXV0byIgOiAibm9uZSI7CiAgICB9CgogICAgY29uc3Qgb25CdG5FbnRlciA9ICgpID0+IHNldEhvdmVyKHRydWUpOwogICAgY29uc3Qgb25CdG5MZWF2ZSA9ICgpID0+IHNldEhvdmVyKGZhbHNlKTsKCiAgICAvLyBQZXItdmlkZW8gbGlzdGVuZXJzIHN0YXkgb24gdGhlIHZpZGVvIGVsZW1lbnQuIERvY3VtZW50L3dpbmRvdwogICAgLy8gbGlzdGVuZXJzIGFyZSBzaGFyZWQgdmlhIHRoZSBtb2R1bGUtbGV2ZWwgYG92ZXJsYXlzYCByZWdpc3RyeQogICAgLy8gKG9uZSBzZXQgb2YgZ2xvYmFscyByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHZpZGVvcyBhcmUgb24gdGhlIHBhZ2UpLgogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgb25CdG5MZWF2ZSk7CiAgICBjb25zdCBWSURFT19FVkVOVFMgPSBbInBsYXkiLCJwbGF5aW5nIiwicGF1c2UiLCJlbmRlZCIsImVtcHRpZWQiLCJsb2FkZWRkYXRhIl07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFZJREVPX0VWRU5UUy5sZW5ndGg7IGkrKykgewogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIH0KICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGJlZ2luZnVsbHNjcmVlbiIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICByby5vYnNlcnZlKHZpZGVvKTsKCiAgICBjb25zdCBpbnN0YW5jZSA9IHsgdXBkYXRlLCBoYW5kbGVQb2ludGVyLCBoYW5kbGVUb3VjaCB9OwogICAgb3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIHZpZGVvVG9PdmVybGF5LnNldCh2aWRlbywgaW5zdGFuY2UpOwogICAgY29uc3QgaW8gPSBnZXRJTygpOwogICAgaWYgKGlvKSB7CiAgICAgIGlvLm9ic2VydmUodmlkZW8pOwogICAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBmaXJlcyBhIGNhbGxiYWNrIHN5bmNocm9ub3VzbHkgYWZ0ZXIKICAgICAgLy8gb2JzZXJ2ZSgpIGluIGEgbWljcm90YXNrLiBVbnRpbCB0aGVuIGFzc3VtZSB0aGUgdmlkZW8gaXMKICAgICAgLy8gdmlzaWJsZSBzbyB0aGUgdmVyeSBmaXJzdCB1cGRhdGUoKSBydW5zLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIElPIHN1cHBvcnQg4oCUIGZhbGwgYmFjayB0byAiYWx3YXlzIHZpc2libGUiLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0KICAgIGFybUdsb2JhbHMoKTsKICAgIHVwZGF0ZSgpOwoKICAgIGlmICh0ZWFyZG93bnMpIHsKICAgICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICAgIG92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgaWYgKGludGVyc2VjdGlvbk9ic2VydmVyKSBpbnRlcnNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUodmlkZW8pOwogICAgICAgIHZpZGVvVG9PdmVybGF5LmRlbGV0ZSh2aWRlbyk7CiAgICAgICAgYnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgICAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIG9uQnRuTGVhdmUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVklERU9fRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB9CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2Via2l0YmVnaW5mdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICByby5kaXNjb25uZWN0KCk7CiAgICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgeyBjbGVhclRpbWVvdXQodG91Y2hIaWRlVGltZXIpOyB0b3VjaEhpZGVUaW1lciA9IG51bGw7IH0KICAgICAgICBidG4ucmVtb3ZlKCk7CiAgICAgICAgbWF5YmVEaXNhcm1HbG9iYWxzKCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29uZmlndXJhdGlvbiAmIGRpc3BhdGNoCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBlci1vcmlnaW4gYGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcGAgZmxhZy4KICAvLyBEZWZhdWx0IGlzIE9OOiBldmVyeSBzaXRlIHVzZXMgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIHVubGVzcyB0aGUKICAvLyB1c2VyIGhhcyBleHBsaWNpdGx5IG9wdGVkIGludG8gbmF0aXZlIGluamVjdGlvbiAoc2V0IHRoZSBmbGFnIHRvCiAgLy8gIjAiIC8gImZhbHNlIiAvICJubyIgLyAib2ZmIikuIFdyYXBwZWQgaW4gdHJ5L2NhdGNoIGJlY2F1c2UKICAvLyBsb2NhbFN0b3JhZ2UgYWNjZXNzIHRocm93cyBpbiBwcml2YXRlIC8gc2FuZGJveGVkIGNvbnRleHRzLgogIC8vCiAgLy8gRXhjZXB0aW9uOiB3d3cueW91dHViZS5jb20sIHd3dy50d2l0Y2gudHYgYW5kIHd3dy5uZXRmbGl4LmNvbQogIC8vIGRlZmF1bHQgdG8gT0ZGIChuYXRpdmUgaW5qZWN0aW9uKSBiZWNhdXNlIHRoZWlyIHBsYXllcnMgYWxyZWFkeQogIC8vIGhhdmUgZmlyc3QtY2xhc3MgY29udHJvbCBiYXJzIHdoZXJlIGEgbmF0aXZlIGJ1dHRvbiBsb29rcyBhdCBob21lLgogIC8vIE9ubHkgdGhlIGV4YWN0IGRlc2t0b3AgaG9zdG5hbWVzIGFyZSB0YXJnZXRlZCDigJQgbS4vbXVzaWMuL21vYmlsZQogIC8vIHN1YmRvbWFpbnMga2VlcCB0aGUgZ2VuZXJpYy1waWxsIGRlZmF1bHQuIFRoZSB1c2VyIGNhbiBmbGlwIHRoZQogIC8vIGZsYWcgZXhwbGljaXRseSBwZXIgb3JpZ2luIHRvIG92ZXJyaWRlLgogIC8vCiAgLy8gUmVhZCBsYXppbHkgb24gZmlyc3QgdXNlIChub3QgYXQgSUlGRSBpbml0KSBzbyB0aGF0IHVzZXJzY3JpcHQKICAvLyBtYW5hZ2VycyBvciBwb2x5ZmlsbCBzaGltcyB0aGF0IHJlcGxhY2UgYGxvY2FsU3RvcmFnZWAgc2xpZ2h0bHkKICAvLyBhZnRlciBvdXIgc2NyaXB0IGxvYWRzIHN0aWxsIHNlZSBhIGNvbnNpc3RlbnQgdmFsdWUuIEFmdGVyIHRoZQogIC8vIGZpcnN0IHJlYWQgaXQncyBjYWNoZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwYWdlIGxpZmV0aW1lIOKAlCB0aGUKICAvLyB2YWx1ZSBjYW4ndCBjaGFuZ2Ugd2l0aG91dCBhIHJlbG9hZC4KICBjb25zdCBOQVRJVkVfREVGQVVMVF9IT1NUUyA9IG5ldyBTZXQoWyJ3d3cueW91dHViZS5jb20iLCAid3d3LnR3aXRjaC50diIsICJ3d3cubmV0ZmxpeC5jb20iXSk7CiAgZnVuY3Rpb24gX2RlZmF1bHRHZW5lcmljRm9ySG9zdCgpIHsKICAgIHJldHVybiAhTkFUSVZFX0RFRkFVTFRfSE9TVFMuaGFzKGxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiByZWFkR2VuZXJpY1BpcEZvcmNlZCgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlZ2VuZXJpY19waXAiKTsKICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsKICAgICAgY29uc3QgcyA9IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKICAgICAgaWYgKHMgPT09ICIwIiB8fCBzID09PSAiZmFsc2UiIHx8IHMgPT09ICJubyIgfHwgcyA9PT0gIm9mZiIpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIHsgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsgfQogIH0KICBsZXQgX2dlbmVyaWNQaXBGb3JjZWRDYWNoZSA9IG51bGw7IC8vIG51bGwgPSBub3QgeWV0IHJlYWQKICBmdW5jdGlvbiBnZW5lcmljUGlwRm9yY2VkQ2FjaGVkKCkgewogICAgaWYgKF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPT09IG51bGwpIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPSByZWFkR2VuZXJpY1BpcEZvcmNlZCgpOwogICAgcmV0dXJuIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGU7CiAgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IHdoZW4gdHJ1dGh5LCB0aGUgZ2VuZXJpYyBvdmVybGF5IHBpbGwgaXMKICAvLyBzdXBwcmVzc2VkIG9uIHRoaXMgc2l0ZS4gU2V0IHZpYSB0aGUgcmlnaHQtY2xpY2sgbWVudSBvbiB0aGUgcGlsbDsKICAvLyBjbGVhcmVkIGZyb20gRGV2VG9vbHMgd2l0aCBgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImJyYXZlX3BpcF9kaXNhYmxlZCIpYC4KICAvLwogIC8vIFRoZSBmbGFnIGlzIGNhY2hlZCBpbiBgX3NpdGVEaXNhYmxlZGAgYWZ0ZXIgdGhlIGluaXRpYWwgYmFpbC1vdXQKICAvLyBjaGVjayBzbyB0aGUgaG90IHBhdGhzICh1cGRhdGUoKSBydW5zIHBlciB2aXNpYmxlIHZpZGVvIHBlcgogIC8vIGFuaW1hdGlvbiBmcmFtZSkgZG9uJ3QgaGF2ZSB0byBoaXQgbG9jYWxTdG9yYWdlIGV2ZXJ5IHRpY2suIFRoZQogIC8vIG1lbnUncyBjbGljayBoYW5kbGVyIGZsaXBzIHRoZSBjYWNoZWQgdmFsdWUgd2hlbiB0aGUgdXNlciBkaXNhYmxlcwogIC8vIG1pZC1zZXNzaW9uLgogIGNvbnN0IERJU0FCTEVfS0VZID0gImJyYXZlX3BpcF9kaXNhYmxlZCI7CiAgZnVuY3Rpb24gcmVhZFNpdGVEaXNhYmxlZCgpIHsKICAgIHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShESVNBQkxFX0tFWSkgPT09ICIxIjsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfQogIH0KICBmdW5jdGlvbiBzZXRTaXRlRGlzYWJsZWQoKSB7CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShESVNBQkxFX0tFWSwgIjEiKTsgfSBjYXRjaCB7fQogIH0KICAvLyBDYWNoZWQgZmxhZyDigJQgdXBkYXRlZCBvbiBpbml0IGFuZCBvbiBtaWQtc2Vzc2lvbiBkaXNhYmxlLgogIGxldCBfc2l0ZURpc2FibGVkID0gZmFsc2U7CgogIC8vIFNoYXJlZCByaWdodC1jbGljayBoYW5kbGVyIGF0dGFjaGVkIHRvIGV2ZXJ5IG5hdGl2ZSBpbmplY3RlZCBidXR0b24KICAvLyAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpLiBNaXJyb3JzIHRoZSBnZW5lcmljIHBpbGwncyBjb250ZXh0bWVudQogIC8vIHdpcmluZyBzbyB1c2VycyBjYW4gZGlzYWJsZSBQaVAgb24gdGhlIGhvc3Qgc2l0ZSBmcm9tIGFueSBvZiBvdXIgVUlzLgogIGZ1bmN0aW9uIF9vbk5hdGl2ZUJ0bkNvbnRleHRNZW51KGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzaG93RGlzYWJsZU1lbnUoZS5jbGllbnRYLCBlLmNsaWVudFkpOwogIH0KCiAgLy8gUmVtb3ZlcyBhbnkgb2Ygb3VyIGluamVjdGVkIERPTSAobmF0aXZlIGJ1dHRvbnMgKyBjbG9uZWQgd3JhcHBlcnMpLgogIC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIHBpY2tzICJEaXNhYmxlIFBpUCBpY29uIG9uIDxzaXRlPiIgZnJvbSB0aGUKICAvLyByaWdodC1jbGljayBtZW51IHNvIHRoZSBwYWdlIHJldHVybnMgdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS4KICBmdW5jdGlvbiBfcmVtb3ZlTmF0aXZlQnV0dG9ucygpIHsKICAgIGNvbnN0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJyYXZlLXBpcC1idG4sIC5icmF2ZS1waXAtd3JhcHBlciIpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgbm9kZXNbaV0ucmVtb3ZlKCk7CiAgfQoKICAvLyBTaW5nbGUtaW5zdGFuY2UgY3VzdG9tIGNvbnRleHQgbWVudSBzaG93biBvbiByaWdodC1jbGljayBvZiB0aGUKICAvLyBnZW5lcmljIHBpbGwgb3IgYW55IG5hdGl2ZSBpbmplY3RlZCBidXR0b24uIFdlIGNhbid0IGN1c3RvbWlzZSB0aGUKICAvLyBicm93c2VyJ3MgbmF0aXZlIGNvbnRleHQgbWVudSB3aXRob3V0IGFuIGV4dGVuc2lvbiwgc28gd2UgY2FuY2VsIGl0CiAgLy8gKGBwcmV2ZW50RGVmYXVsdGApIGFuZCByZW5kZXIgb3VyIG93biBET00uIEF1dG8tZGlzbWlzc2VzIG9uCiAgLy8gY2xpY2stb3V0c2lkZSwgRXNjYXBlLCBvciBzY3JvbGwuCiAgbGV0IGFjdGl2ZU1lbnUgPSBudWxsOwogIC8vIFRpbWVzdGFtcCB3aGVuIHRoZSBhY3RpdmUgbWVudSB3YXMgb3BlbmVkLiBPdXRzaWRlLWNsaWNrcyB3aXRoaW4gYQogIC8vIHNob3J0IHdpbmRvdyAofjE1MCBtcykgb2Ygb3BlbmluZyBhcmUgaWdub3JlZCDigJQgZGVmZW5kcyBhZ2FpbnN0IGEKICAvLyBzeW50aGV0aWMgc2FtZS1mcmFtZSBjbGljayBieXBhc3NpbmcgdGhlIHNldFRpbWVvdXQoMCkgaGFuZG9mZi4KICBsZXQgYWN0aXZlTWVudU9wZW5lZEF0ID0gMDsKICBjb25zdCBNRU5VX09QRU5fR1VBUkRfTVMgPSAxNTA7CiAgZnVuY3Rpb24gY2xvc2VNZW51KCkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBhY3RpdmVNZW51LnJlbW92ZSgpOwogICAgYWN0aXZlTWVudSA9IG51bGw7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgX29uTWVudUtleSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgY2xvc2VNZW51LCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGNsb3NlTWVudSk7CiAgfQogIGZ1bmN0aW9uIF9vbk1lbnVLZXkoZSkgeyBpZiAoZS5rZXkgPT09ICJFc2NhcGUiKSBjbG9zZU1lbnUoKTsgfQogIGZ1bmN0aW9uIF9vbk1lbnVDbGlja091dHNpZGUoZSkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBpZiAoZS50aW1lU3RhbXAgLSBhY3RpdmVNZW51T3BlbmVkQXQgPCBNRU5VX09QRU5fR1VBUkRfTVMpIHJldHVybjsKICAgIGlmICghYWN0aXZlTWVudS5jb250YWlucyhlLnRhcmdldCkpIGNsb3NlTWVudSgpOwogIH0KICBmdW5jdGlvbiBzaG93RGlzYWJsZU1lbnUoeCwgeSkgewogICAgY2xvc2VNZW51KCk7CiAgICBjb25zdCBtZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBtZW51LnN0eWxlLmNzc1RleHQgPQogICAgICAicG9zaXRpb246Zml4ZWQ7bGVmdDoiICsgeCArICJweDt0b3A6IiArIHkgKyAicHg7IiArCiAgICAgICJiYWNrZ3JvdW5kOnJnYmEoMjgsMjgsMzAsMC45Nik7Y29sb3I6I2ZmZjsiICsKICAgICAgImJvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NHB4IDA7IiArCiAgICAgICJib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAiei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiZm9udDo1MDAgMTNweC8xLjQgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sU2Vnb2UgVUksUm9ib3RvLHNhbnMtc2VyaWY7IiArCiAgICAgICJ1c2VyLXNlbGVjdDpub25lO3BvaW50ZXItZXZlbnRzOmF1dG87bWluLXdpZHRoOjE4MHB4OyI7CgogICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaXRlbS50ZXh0Q29udGVudCA9ICJEaXNhYmxlIFBpUCBpY29uIG9uICIgKyBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjhweCAxNHB4O2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcDsiOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjEyKSI7IH0pOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAiIjsgfSk7CiAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBzZXRTaXRlRGlzYWJsZWQoKTsKICAgICAgX3NpdGVEaXNhYmxlZCA9IHRydWU7CiAgICAgIC8vIEhpZGUgZXZlcnkgYWN0aXZlIGdlbmVyaWMgcGlsbCBvbiB0aGlzIHBhZ2UgaW1tZWRpYXRlbHkuIFRoZQogICAgICAvLyBuZXh0IGB1cGRhdGUoKWAgdGljayB3aWxsIHNlZSB0aGUgY2FjaGVkIGZsYWcgYW5kIGtlZXAgdGhlbQogICAgICAvLyBoaWRkZW4uIE5hdGl2ZSBpbmplY3RlZCBidXR0b25zIChZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeCkKICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGRpcmVjdGx5IOKAlCB0aGVpciBwZXJzaXN0ZW50IG9ic2VydmVycwogICAgICAvLyB3aWxsIHNlZSBgX3NpdGVEaXNhYmxlZGAgYW5kIHN0b3AgcmUtaW5qZWN0aW5nLgogICAgICBfc2NoZWR1bGVVcGRhdGVBbGwoKTsKICAgICAgX3JlbW92ZU5hdGl2ZUJ1dHRvbnMoKTsKICAgICAgbG9nKCJkaXNhYmxlZCBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUpOwogICAgICBjbG9zZU1lbnUoKTsKICAgIH0pOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgYWN0aXZlTWVudSA9IG1lbnU7CiAgICBhY3RpdmVNZW51T3BlbmVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKCiAgICAvLyBJZiB0aGUgbWVudSB3b3VsZCBvdmVyZmxvdyB0aGUgdmlld3BvcnQsIG51ZGdlIGl0IGJhY2sgaW4uCiAgICBjb25zdCByID0gbWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmIChyLnJpZ2h0ID4gaW5uZXJXaWR0aCkgIG1lbnUuc3R5bGUubGVmdCA9IChpbm5lcldpZHRoICAtIHIud2lkdGggIC0gOCkgKyAicHgiOwogICAgaWYgKHIuYm90dG9tID4gaW5uZXJIZWlnaHQpIG1lbnUuc3R5bGUudG9wICA9IChpbm5lckhlaWdodCAtIHIuaGVpZ2h0IC0gOCkgKyAicHgiOwoKICAgIC8vIERlZmVyIGxpc3RlbmVyIGF0dGFjaCB0byB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gdGhlIGNsaWNrIHRoYXQKICAgIC8vIG9wZW5lZCB0aGUgbWVudSBkb2Vzbid0IGltbWVkaWF0ZWx5IGRpc21pc3MgaXQuCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIF9vbk1lbnVLZXksIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBjbG9zZU1lbnUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBjbG9zZU1lbnUpOwogICAgfSwgMCk7CiAgfQoKICAvLyBOYXRpdmUtc2l0ZSBhZGFwdGVyIHRhYmxlLiBFYWNoIGVudHJ5IGRlc2NyaWJlcyBvbmUgc2l0ZSB3aG9zZQogIC8vIHBsYXllciBjaHJvbWUgd2Uga25vdyBob3cgdG8gaW5qZWN0IGludG8uIERldGVjdGlvbiBpcyBob3N0bmFtZS0KICAvLyBmaXJzdCAoaGFuZGxlcyByZWd1bGFyIHBhZ2VzKSB3aXRoIGEgRE9NLXNpZ25hbCBmYWxsYmFjayAoaGFuZGxlcwogIC8vIGFib3V0OmJsYW5rIHNhbWUtb3JpZ2luIGlmcmFtZXMgd2hlcmUgbG9jYXRpb24uaG9zdG5hbWUgaXMgIiIpLgogIC8vCiAgLy8gVG8gc3VwcG9ydCBhIG5ldyBzaXRlLCBhZGQgYSByZWNvcmQgaGVyZSBhbmQgd3JpdGUgYSBtYXRjaGluZwogIC8vIGBhZGQ8TmFtZT5CdXR0b24odmlkZW8pYCBpbmplY3RvciDigJQgbm8gb3RoZXIgY2hhbmdlIHJlcXVpcmVkLgogIGNvbnN0IE5BVElWRV9TSVRFUyA9IFsKICAgIHsKICAgICAgbmFtZTogIllvdVR1YmUiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoInlvdXR1YmUuY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5odG1sNS12aWRlby1wbGF5ZXIsIC55dHAtcmlnaHQtY29udHJvbHMiKSwKICAgICAgaW5qZWN0OiBhZGRZb3VUdWJlQnV0dG9uLAogICAgICBzY29wZTogIi5odG1sNS12aWRlby1wbGF5ZXIiLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlR3aXRjaCIsCiAgICAgIG1hdGNoOiAoaG9zdCkgPT4gaG9zdC5lbmRzV2l0aCgidHdpdGNoLnR2IikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXIsIFtkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItY29udHJvbHMiXScpLAogICAgICBpbmplY3Q6IGFkZFR3aXRjaEJ1dHRvbiwKICAgICAgc2NvcGU6ICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWNvbnRyb2xzIl0sIC52aWRlby1wbGF5ZXInLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIk5ldGZsaXgiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoIm5ldGZsaXguY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVpYT0iY29udHJvbHMtc3RhbmRhcmQiXSwgW2RhdGEtdWlhPSJ2aWRlby1jYW52YXMiXScpLAogICAgICBpbmplY3Q6IGFkZE5ldGZsaXhCdXR0b24sCiAgICAgIHNjb3BlOiAnW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJywKICAgIH0sCiAgXTsKCiAgLy8gUnVuIGFuIGluamVjdG9yIG9uY2Ugbm93IGFuZCBhZ2FpbiBvbiBldmVyeSByZWxldmFudCBET00gbXV0YXRpb24sCiAgLy8gc28gdGhlIGJ1dHRvbiByZWFwcGVhcnMgYWZ0ZXIgUmVhY3QgKE5ldGZsaXggLyBUd2l0Y2gpIHRlYXJzIGRvd24KICAvLyBhbmQgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIuIFRoZSBvYnNlcnZlciBzdGFydHMgb24gPGh0bWw+IGlmCiAgLy8gdGhlIHNjb3BlZCBjb250YWluZXIgaXNuJ3QgaW4gdGhlIERPTSB5ZXQsIHRoZW4gInByb21vdGVzIiBpdHNlbGYKICAvLyB0byB0aGUgc21hbGxlciBzdWJ0cmVlIGFzIHNvb24gYXMgaXQgYXBwZWFycyDigJQgbWluaW1pc2luZyBjaHVybi4KICAvLwogIC8vIFJlc2lsaWVuY2UgdG8gaG9zdCByZWRlc2lnbnM6IGlmIHRoZSBpbmplY3RvciBrZWVwcyByZXR1cm5pbmcgZmFsc2UKICAvLyBmb3IgYE5BVElWRV9GQUxMQkFDS19NU2AgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIHdlIGRpc2Nvbm5lY3QgdGhlCiAgLy8gb2JzZXJ2ZXIgYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQg4oCUIHNvIHVzZXJzCiAgLy8gYWx3YXlzIGdldCAqc29tZSogUGlQIGNvbnRyb2wgZXZlbiBpZiBZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeAogIC8vIGNoYW5nZXMgaXRzIERPTSBpbiBhIHdheSB0aGF0IGJyZWFrcyBvdXIgc2VsZWN0b3JzLiBUaGUgZmFsbGJhY2sgaXMKICAvLyBhcm1lZCBvbmx5IG9uY2UgcGVyIHZpZGVvIGFuZCBvbmx5IHRyaWdnZXJzIGlmIHRoZSBpbmplY3RvciBoYXMKICAvLyAqbmV2ZXIqIHN1Y2NlZWRlZDsgaW50ZXJtaXR0ZW50IGZhaWx1cmVzIGR1cmluZyBhIHJlLW1vdW50IGRvbid0CiAgLy8gY291bnQuCiAgZnVuY3Rpb24gdHJ5TmF0aXZlKHZpZGVvLCBpbmplY3Rvciwgc2NvcGVTZWxlY3RvciwgdGVhcmRvd25zKSB7CiAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGxldCBldmVyU3VjY2VlZGVkID0gISFpbmplY3Rvcih2aWRlbyk7CiAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgICBsZXQgZmVsbEJhY2sgPSBmYWxzZTsKICAgIC8vIEFsd2F5cyBvYnNlcnZlIGF0IGRvY3VtZW50IGxldmVsLiBXZSB0cmllZCBwcm9tb3RpbmcgdG8gYSBzY29wZWQKICAgIC8vIHN1YnRyZWUgKGFuZCB0byB0aGUgc2NvcGVkIHRhcmdldCdzIHBhcmVudCkgZm9yIGxvd2VyIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIGJ1dCBOZXRmbGl4IHJlLW1vdW50cyB3aG9sZSBwbGF5ZXIgc3VidHJlZXMgb24gdmlzaWJpbGl0eQogICAgLy8gY2hhbmdlcyDigJQgbGVhdmluZyBhbnkgbmFycm93ZXIgb2JzZXJ2ZXIgYXR0YWNoZWQgdG8gYSBkZXRhY2hlZAogICAgLy8gbm9kZSwgd2l0aCBubyB3YXkgdG8gZGV0ZWN0IGRldGFjaG1lbnQgYmVjYXVzZSBubyBtdXRhdGlvbnMgZmlyZQogICAgLy8gb24gdGhlIGRldGFjaGVkIG5vZGUuIFRoZSByQUYtY29hbGVzY2VkIGNhbGxiYWNrIGJlbG93IGNhcHMgd29yawogICAgLy8gYXQgb25lIGluamVjdG9yIGNhbGwgcGVyIGFuaW1hdGlvbiBmcmFtZSByZWdhcmRsZXNzIG9mIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIHNvIGRvY3VtZW50LWxldmVsIG9ic2VydmF0aW9uIHN0YXlzIGJvdW5kZWQuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgIGlmIChzY2hlZHVsZWQgfHwgZmVsbEJhY2spIHJldHVybjsKICAgICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICBpZiAoZmVsbEJhY2spIHJldHVybjsKICAgICAgICBpZiAoaW5qZWN0b3IodmlkZW8pKSB7CiAgICAgICAgICBldmVyU3VjY2VlZGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFldmVyU3VjY2VlZGVkICYmCiAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCA+PSBDT05GSUcuTkFUSVZFX0ZBTExCQUNLX01TKSB7CiAgICAgICAgICBmZWxsQmFjayA9IHRydWU7CiAgICAgICAgICBvYnMuZGlzY29ubmVjdCgpOwogICAgICAgICAgd2FybigibmF0aXZlIGluamVjdGlvbiB1bmF2YWlsYWJsZSBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUgKwogICAgICAgICAgICAgICAiOyBmYWxsaW5nIGJhY2sgdG8gZ2VuZXJpYyBwaWxsIik7CiAgICAgICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIG9icy5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICBpZiAodGVhcmRvd25zKSB0ZWFyZG93bnMucHVzaCgoKSA9PiBvYnMuZGlzY29ubmVjdCgpKTsKICB9CgogIC8vIERlY2lkZXMgd2hpY2ggVUkgdG8gYWRkIGZvciBhIGdpdmVuIHZpZGVvIGFuZCB3aXJlcyBpdCB1cC4gQ2FsbGVkCiAgLy8gZXhhY3RseSBvbmNlIHBlciB2aWRlbyBieSBgYXR0YWNoVG9WaWRlb2AuIFRoZSBgdGVhcmRvd25zYCBhcnJheSBpcwogIC8vIHBvcHVsYXRlZCB3aXRoIGNsZWFudXAgY2xvc3VyZXMgdGhhdCB0aGUgZGlzY292ZXJ5IG9ic2VydmVyJ3MKICAvLyByZW1vdmVkLW5vZGVzIHBhdGggd2lsbCBydW4uCiAgZnVuY3Rpb24gYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIEdlbmVyaWMgb3ZlcmxheSBpcyB0aGUgZGVmYXVsdC4gU2V0IGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcD0iMCIKICAgIC8vIChvciBmYWxzZS9uby9vZmYpIHBlci1vcmlnaW4gdG8gb3B0IGJhY2sgaW50byBuYXRpdmUgaW5qZWN0aW9uLgogICAgaWYgKGdlbmVyaWNQaXBGb3JjZWRDYWNoZWQoKSkgewogICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICBsb2coImluamVjdGVkIG92ZXJsYXkiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGhvc3QgPSBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTkFUSVZFX1NJVEVTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHNpdGUgPSBOQVRJVkVfU0lURVNbaV07CiAgICAgIGlmIChzaXRlLm1hdGNoKGhvc3QpKSB7CiAgICAgICAgdHJ5TmF0aXZlKHZpZGVvLCBzaXRlLmluamVjdCwgc2l0ZS5zY29wZSwgdGVhcmRvd25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAvLyBVbnJlY29nbmlzZWQgc2l0ZSAoYW5kIHVzZXIgb3B0ZWQgb3V0IG9mIGdlbmVyaWMgdmlhIGxvY2FsU3RvcmFnZSk6CiAgICAvLyBzdGlsbCBpbnN0YWxsIHRoZSBvdmVybGF5IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyBuYXRpdmUgdG8gYW5jaG9yIHRvLgogICAgYWRkT3ZlcmxheUJ1dHRvbih2aWRlbywgdGVhcmRvd25zKTsKICAgIGxvZygiaW5qZWN0ZWQgb3ZlcmxheSIpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGVyLXZpZGVvIHNldHVwICsgdGVhcmRvd24KICAvLwogIC8vIFJ1bnMgb25jZSBwZXIgPHZpZGVvPiBlbGVtZW50LiBUaGUgYHRlYXJkb3duc2AgYXJyYXkgaXMgdGhlIHNpbmdsZQogIC8vIHBsYWNlIGV2ZXJ5IGxpc3RlbmVyIC8gb2JzZXJ2ZXIgLyBET00gbm9kZSB3ZSBhZGQgZm9yIHRoaXMgdmlkZW8gaXMKICAvLyByZWNvcmRlZDsgdGhlIGRpc2NvdmVyeSBvYnNlcnZlciBiZWxvdyBjYWxscyB0aGVtIHdoZW4gdGhlIHZpZGVvIGlzCiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRoZSBzY3JpcHQgZG9lc24ndCBsZWFrIG9uIGxvbmctbGl2ZWQgU1BBCiAgLy8gcGFnZXMgd2l0aCBpbmZpbml0ZSBzY3JvbGwuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gYXR0YWNoVG9WaWRlbyh2aWRlbykgewogICAgaWYgKHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKSkgcmV0dXJuOwoKICAgIC8vIFNvbWUgc2l0ZXMgKE5ldGZsaXgsIGNlcnRhaW4gRFJNIHBsYXllcnMpIGV4cGxpY2l0bHkgZGlzYWJsZSBQaVAuCiAgICAvLyBDbGVhciBpdCBub3cgYW5kIHdhdGNoIChiZWxvdykgZm9yIHRoZSBwYWdlIHJlLXNldHRpbmcgaXQuCiAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgdmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgPSBmYWxzZTsKICAgICAgdmlkZW8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScpOwogICAgfQogICAgLy8gV2lyZSBhdXRvbWF0aWMtUGlQIGludGVudCAoYnJvd3NlcnMgd2l0aCBhdXRvLVBpUCBmZWF0dXJlLCBlLmcuCiAgICAvLyBDaHJvbWUgZmxhZywgZmlyZSB0aGlzIG9uIHRhYiBzd2l0Y2gpLiBUaGUgaGFuZGxlciBpcyBnbG9iYWwgcGVyCiAgICAvLyBkb2N1bWVudCDigJQgbGFzdCByZWdpc3RyYXRpb24gd2lucyDigJQgc28gb24gcGFnZXMgd2l0aCBtdWx0aXBsZQogICAgLy8gPHZpZGVvPiBlbGVtZW50cyAoWW91VHViZSB3YXRjaDogbWFpbiBwbGF5ZXIgKyBob3Zlci10aHVtYm5haWwKICAgIC8vIHByZXZpZXdzICsgYWQgcHJlLXJvbGwpIHRoZSAqbGFzdCogbW91bnRlZCB2aWRlbyB3b3VsZCBiZSBQaVAnZCwKICAgIC8vIHdoaWNoIGlzIGZyZXF1ZW50bHkgYSBoaWRkZW4vZW1wdHkgcHJldmlldyDihpIgYmxhY2sgUGlQIHdpbmRvdwogICAgLy8gd2l0aCBubyBjb250cm9scyBhbmQgYSBkZXN5bmNlZCBkdXJhdGlvbi4KICAgIC8vIFBpY2sgdGhlIG1vc3QgcGxhdXNpYmxlICJhY3RpdmUiIHZpZGVvIGF0IGZpcmUgdGltZSBpbnN0ZWFkOgogICAgLy8gdGhlIG9uZSBjdXJyZW50bHkgaW4gUGlQICh0b2dnbGluZyBvdXQpLCBlbHNlIHRoZSBsYXJnZXN0IHBsYXlpbmcKICAgIC8vIHZpZGVvLCBlbHNlIHRoZSBsYXJnZXN0IHZpZGVvIHdpdGggbWV0YWRhdGEuIE5vLW9wIG9uIGJyb3dzZXJzCiAgICAvLyB0aGF0IGRvbid0IHN1cHBvcnQgaXQ7IHRoZSB0cnkvY2F0Y2ggZ3VhcmRzIGlPUyAvIG9sZGVyIGJyb3dzZXJzLgogICAgdHJ5IHsKICAgICAgbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKCJlbnRlcnBpY3R1cmVpbnBpY3R1cmUiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgdiA9IHBpY2tBdXRvUGlwVGFyZ2V0KCkgfHwgdmlkZW87CiAgICAgICAgdHJ5IHsgYXdhaXQgdi5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpOyB9IGNhdGNoIChlKSB7IHdhcm4oImF1dG8tUGlQIGZhaWxlZDoiLCBlLm1lc3NhZ2UgfHwgZSk7IH0KICAgICAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciAqLyB9CgogICAgY29uc3QgdGVhcmRvd25zID0gW107CgogICAgYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwoKICAgIC8vIE9ubHkgcmVzdW1lIG9uIGVudGVyaW5nIFBpUCBpZiB0aGUgdmlkZW8gd2FzIGFjdHVhbGx5IHBsYXlpbmcgd2hlbgogICAgLy8gdGhlIHRyYW5zaXRpb24gZmlyZWQuIFRoZSBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGB2aWRlby5wbGF5KClgCiAgICAvLyBvdmVycm9kZSB1c2VyLWluaXRpYXRlZCBwYXVzZXMgKGUuZy4gWW91VHViZSBhdXRvLVBpUCBvbiB0YWItc3dpdGNoCiAgICAvLyB3b3VsZCB1bi1wYXVzZSBhIHBhdXNlZCB2aWRlbykuIENhcHR1cmUgc3RhdGUgYXQgaGFuZGxlciBhdHRhY2gKICAgIC8vIHRpbWUgYW5kIHJlZnJlc2ggb24gcGxheS9wYXVzZSBldmVudHMuCiAgICBsZXQgd2FzUGxheWluZyA9ICF2aWRlby5wYXVzZWQgJiYgIXZpZGVvLmVuZGVkOwogICAgY29uc3Qgb25QbGF5U3RhdGUgPSAoKSA9PiB7IHdhc1BsYXlpbmcgPSAhdmlkZW8ucGF1c2VkICYmICF2aWRlby5lbmRlZDsgfTsKICAgIGNvbnN0IFBMQVlfRVZFTlRTID0gWyJwbGF5IiwgInBsYXlpbmciLCAicGF1c2UiLCAiZW5kZWQiXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUExBWV9FVkVOVFMubGVuZ3RoOyBpKyspIHsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgfQogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFBMQVlfRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCBvbkVudGVyUGlwID0gKCkgPT4gewogICAgICBpZiAoIXdhc1BsYXlpbmcpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh3YXNQbGF5aW5nICYmIHZpZGVvLnBhdXNlZCkgdmlkZW8ucGxheSgpOyB9LCAyNTApOwogICAgfTsKICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImVudGVycGljdHVyZWlucGljdHVyZSIsIG9uRW50ZXJQaXApOwogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW50ZXJwaWN0dXJlaW5waWN0dXJlIiwgb25FbnRlclBpcCkpOwoKICAgIC8vIFdhdGNoIGZvciBzaXRlcyAoZS5nLiBOZXRmbGl4KSByZS1hZGRpbmcgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUuCiAgICBjb25zdCBkcGlwT2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgICB2aWRlby5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IGZhbHNlOwogICAgICAgIHZpZGVvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnKTsKICAgICAgfQogICAgfSk7CiAgICBkcGlwT2JzLm9ic2VydmUodmlkZW8sIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJ10gfSk7CiAgICB0ZWFyZG93bnMucHVzaCgoKSA9PiBkcGlwT2JzLmRpc2Nvbm5lY3QoKSk7CgogICAgdmlkZW9DbGVhbnVwcy5zZXQodmlkZW8sICgpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZWFyZG93bnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgeyB0ZWFyZG93bnNbaV0oKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSBpbmRpdmlkdWFsIHRlYXJkb3duIGVycm9ycyAqLyB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG9wLWxldmVsIHNldHVwICsgZGlzY292ZXJ5IG9ic2VydmVyCiAgLy8KICAvLyBPbmUgcGVyc2lzdGVudCBNdXRhdGlvbk9ic2VydmVyIHRyYWNrcyA8dmlkZW8+IGVsZW1lbnRzIGJlaW5nIGFkZGVkCiAgLy8gdG8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSBvdmVyIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEFkZCDihpIgd2lyZSB1cC4KICAvLyBSZW1vdmUg4oaSIHJ1biB0aGUgcmVnaXN0ZXJlZCB0ZWFyZG93biBjbG9zdXJlIGZvciB0aGF0IHZpZGVvLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUoKSB7CiAgICAvLyBBdHRhY2ggdG8gZXZlcnkgPHZpZGVvPiBjdXJyZW50bHkgb24gdGhlIHBhZ2UuCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpLmZvckVhY2goYXR0YWNoVG9WaWRlbyk7CgogICAgLy8gS2VlcCB3YXRjaGluZyBmb3IgdmlkZW9zIGFkZGVkIGxhdGVyIChsYXp5LWxvYWRlZCBmZWVkcywgU1BBIHJvdXRlCiAgICAvLyBjaGFuZ2VzLCBlbWJlZGRlZCBwbGF5ZXJzIHRoYXQgbW91bnQgYWZ0ZXIgZmlyc3QgcGFpbnQsIGV0Yy4pLgogICAgLy8gSW5kZXhlZCBsb29wcyArIG5vZGVUeXBlIGNoZWNrIGFyZSBmcmllbmRsaWVyIHRvIFY4J3MgaW5saW5lCiAgICAvLyBjYWNoZXMgdGhhbiBmb3Itb2YgKyBpbnN0YW5jZW9mIG9uIGhvdCBET00tbXV0YXRpb24gcGF0aHMuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihfb25Eb21NdXRhdGlvbnMpOwogICAgb2JzLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIF9ydW5DbGVhbnVwKHZpZGVvKSB7CiAgICBjb25zdCBmbiA9IHZpZGVvQ2xlYW51cHMuZ2V0KHZpZGVvKTsKICAgIGlmICghZm4pIHJldHVybjsKICAgIHZpZGVvQ2xlYW51cHMuZGVsZXRlKHZpZGVvKTsKICAgIHRyeSB7IGZuKCk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgZnVuY3Rpb24gX29uRG9tTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7CiAgICAgIGNvbnN0IG11ID0gbXV0YXRpb25zW2ldOwoKICAgICAgY29uc3QgYWRkZWQgPSBtdS5hZGRlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgYWxlbiA9IGFkZGVkLmxlbmd0aDsgaiA8IGFsZW47IGorKykgewogICAgICAgIGNvbnN0IG5vZGUgPSBhZGRlZFtqXTsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgY29udGludWU7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICJWSURFTyIpIHsKICAgICAgICAgIGF0dGFjaFRvVmlkZW8obm9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7CiAgICAgICAgICBjb25zdCB2aWRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCB2bGVuID0gdmlkcy5sZW5ndGg7IGsgPCB2bGVuOyBrKyspIGF0dGFjaFRvVmlkZW8odmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdCByZW1vdmVkID0gbXUucmVtb3ZlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgcmxlbiA9IHJlbW92ZWQubGVuZ3RoOyBqIDwgcmxlbjsgaisrKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IHJlbW92ZWRbal07CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIGNvbnRpbnVlOwogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAiVklERU8iKSB7CiAgICAgICAgICBfcnVuQ2xlYW51cChub2RlKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKICAgICAgICAgIGNvbnN0IHZpZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwogICAgICAgICAgZm9yIChsZXQgayA9IDAsIHZsZW4gPSB2aWRzLmxlbmd0aDsgayA8IHZsZW47IGsrKykgX3J1bkNsZWFudXAodmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBCb290CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIEJhaWwgb3V0IGVhcmx5IG9uIGJyb3dzZXJzIHdpdGggbm8gUGlQIEFQSSBhdCBhbGwgKGV4dHJlbWVseSBvbGQgb3IKICAvLyBleG90aWMpLiBBdm9pZHMgcmVnaXN0ZXJpbmcgbGlzdGVuZXJzIHdlJ2QgbmV2ZXIgdXNlLgogIGlmICghUElQX1NVUFBPUlRFRCkgcmV0dXJuOwoKICAvLyBTY29wZTogb25seSBydW4gaW4gdGhlIHRvcC1sZXZlbCBmcmFtZS4gRW1iZWRkZWQgcGxheWVycyAoZS5nLgogIC8vIHd3dy55b3V0dWJlLmNvbS9lbWJlZC88aWQ+IGlmcmFtZXMgaW5zaWRlIHRoaXJkLXBhcnR5IHBhZ2VzKSBnZXQKICAvLyBuZWl0aGVyIG5hdGl2ZSBpbmplY3Rpb24gbm9yIHRoZSBnZW5lcmljLXBpbGwgZmFsbGJhY2sg4oCUIHRoZSBob3N0CiAgLy8gc2l0ZSBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBQaVAgVVggaW5zaWRlIGlmcmFtZXMuIFRoaXMga2VlcHMKICAvLyB0aGUgc2NyaXB0IGZvY3VzZWQgb24gY2Fub25pY2FsIGRlc2t0b3Agc2Vzc2lvbnMgYW5kIGF2b2lkcwogIC8vIGRvdWJsZS1pbmplY3Rpb24gd2hlbiBib3RoIHRoZSBwYXJlbnQgZnJhbWUgYW5kIHRoZSBlbWJlZCBtYXRjaAogIC8vIGEgdXNlcidzIGZpbHRlciBydWxlLgogIHRyeSB7IGlmICh3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZikgcmV0dXJuOyB9IGNhdGNoIChlKSB7IHJldHVybjsgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IGlmIHRoZSB1c2VyIHByZXZpb3VzbHkgc2VsZWN0ZWQgIkRpc2FibGUgUGlQIGljb24KICAvLyBvbiA8c2l0ZT4iIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUsIHRoaXMgZmxhZyBwZXJzaXN0cyBpbgogIC8vIGxvY2FsU3RvcmFnZS4gQmFpbCBiZWZvcmUgYW55IHNldHVwIHNvIHRoZSBzY3JpcHQgaXMgYSB0cnVlIG5vLW9wCiAgLy8gZm9yIHRoYXQgb3JpZ2luIOKAlCBubyBvYnNlcnZlcnMsIG5vIGxpc3RlbmVycywgbm8gd29yay4gT3RoZXIKICAvLyBvcmlnaW5zIGFyZSB1bmFmZmVjdGVkIGJlY2F1c2UgbG9jYWxTdG9yYWdlIGlzIHBhcnRpdGlvbmVkIHBlci1vcmlnaW4uCiAgLy8gV2UgYWxzbyBzZWVkIHRoZSBjYWNoZWQgYF9zaXRlRGlzYWJsZWRgIGZsYWcgaGVyZSAoaXJyZWxldmFudCBpZiB3ZQogIC8vIHJldHVybiwgYnV0IGtlZXBzIHRoZSBjYWNoZSBsaXZlIGluIHRoZSBub3QteWV0LWRpc2FibGVkIGNhc2UpLgogIF9zaXRlRGlzYWJsZWQgPSByZWFkU2l0ZURpc2FibGVkKCk7CiAgaWYgKF9zaXRlRGlzYWJsZWQpIHJldHVybjsKCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCiAgICAgIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgc2V0dXBBdXRvUGljdHVyZUluUGljdHVyZSgpOwogIH0KfSkoKTs="},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUKCmNvbnN0IHNwb29mQnJhbmRzID0gKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgaWYgKGl0ZW0/LmJyYW5kPy50b0xvd2VyQ2FzZSgpID09PSAnYnJhdmUnKSB7CiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGJyYW5kOiAnR29vZ2xlIENocm9tZScgfTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0pOwp9OwoKY29uc3Qgb3JpZ2luYWxCcmFuZHMgPSBuYXZpZ2F0b3I/LnVzZXJBZ2VudERhdGE/LmJyYW5kczsKaWYgKG9yaWdpbmFsQnJhbmRzKSB7CiAgY29uc3Qgc3Bvb2ZlZEJyYW5kcyA9IHNwb29mQnJhbmRzKG9yaWdpbmFsQnJhbmRzKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF2aWdhdG9yVUFEYXRhLnByb3RvdHlwZSwgJ2JyYW5kcycsIHsKICAgIHZhbHVlOiBzcG9vZmVkQnJhbmRzCiAgfSk7Cn0KCmNvbnN0IG9yaWdpbmFsR2V0SGlnaEVudHJvcHlWYWx1ZXMgPQogIE5hdmlnYXRvclVBRGF0YT8ucHJvdG90eXBlPy5nZXRIaWdoRW50cm9weVZhbHVlczsKCmlmIChvcmlnaW5hbEdldEhpZ2hFbnRyb3B5VmFsdWVzKSB7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdmlnYXRvclVBRGF0YS5wcm90b3R5cGUsICdnZXRIaWdoRW50cm9weVZhbHVlcycsIHsKICAgIHZhbHVlOiBhc3luYyBmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcyhoaW50cykgewogICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgb3JpZ2luYWxHZXRIaWdoRW50cm9weVZhbHVlcy5jYWxsKAogICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnREYXRhLAogICAgICAgIGhpbnRzCiAgICAgICk7CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdHMpKSB7CiAgICAgICAgaWYgKGtleSA9PT0gJ2JyYW5kcycgfHwga2V5ID09PSAnZnVsbFZlcnNpb25MaXN0JykgewogICAgICAgICAgcmVzdWx0c1trZXldID0gc3Bvb2ZCcmFuZHMocmVzdWx0c1trZXldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfSk7Cn0KCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICBOYXZpZ2F0b3JVQURhdGEucHJvdG90eXBlLmdldEhpZ2hFbnRyb3B5VmFsdWVzLCAndG9TdHJpbmcnLCB7CiAgdmFsdWU6ICgpID0+ICdmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcygpIHsgW25hdGl2ZSBjb2RlXSB9Jwp9KTsK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play-update.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXktdXBkYXRlLmpzCi8vIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpIHsKICBjb25zdCBob3N0ID0gbG9jYXRpb24uaG9zdG5hbWU7CiAgY29uc3QgSVNfWU9VVFVCRSA9IC8oPzpefC4rXC4peW91dHViZSg/Oi1ub2Nvb2tpZSk/XC5jb20kLy50ZXN0KGhvc3QpOwogIGNvbnN0IElTX1ZJTUVPID0gLyg/Ol58LitcLil2aW1lb1wuY29tJC8udGVzdChob3N0KTsKCiAgLy8gUGFnZSBWaXNpYmlsaXR5IEFQSQogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnaGlkZGVuJywgewogICAgICBnZXQoKSB7IHJldHVybiBmYWxzZTsgfSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgZ2V0KCkgeyByZXR1cm4gJ3Zpc2libGUnOyB9LAogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnb252aXNpYmlsaXR5Y2hhbmdlJywgewogICAgICBnZXQoKSB7IHJldHVybiBudWxsOyB9LAogICAgICBzZXQoKSB7fSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gQmxvY2sgZXZlbnQgZGVsaXZlcnkgKGNhcHR1cmU9dHJ1ZSB0byBpbnRlcmNlcHQgZWFybHkpCiAgY29uc3Qgc3RvcCA9IChlKSA9PiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogIGNvbnN0IElTX0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8CiAgICAgICAgICAgICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICB0cnkgewogICAgLy8gU2tpcCB2aXNpYmlsaXR5Y2hhbmdlIGJsb2NraW5nIG9uIGlPUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1lZGlhIGJhY2tncm91bmRpbmcKICAgIGlmICghSVNfSU9TKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBzdG9wLCB0cnVlKTsKICAgIH0KICB9IGNhdGNoIChlKSB7fQoKICAvLyBGdWxsc2NyZWVuIEFQSSAoVmltZW8pCiAgaWYgKElTX1ZJTUVPKSB7CiAgICB0cnkgewogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHN0b3AsIHRydWUpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIC8vIFlvdVR1YmUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzCiAgaWYgKElTX1lPVVRVQkUpIHsKICAgIC8vIFVzZXIgYWN0aXZpdHkgdHJhY2tpbmcKICAgIGNvbnN0IExBQ1RfUkVGUkVTSCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWluCiAgICB3YWl0Rm9yTGFjdCgoKSA9PiByZWZyZXNoTGFjdCgpLCBMQUNUX1JFRlJFU0gpOwoKICAgIGZ1bmN0aW9uIGdldFZpZGVvKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigneXRkLXBsYXllciB2aWRlbywgI21vdmllX3BsYXllciB2aWRlbywgdmlkZW8nKTsKICAgIH0KCiAgICBsZXQgbGFzdFVzZXJJbnB1dCA9IDA7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CgogICAgLy8gTWVkaWEga2V5cyBnbyB0aHJvdWdoIE1lZGlhU2Vzc2lvbiwgbm90IGtleWRvd24uIFBhdGNoIHRoZSBwcm90b3R5cGUKICAgIC8vIHNvIHBhdXNlL3BsYXkgaGFuZGxlcnMgdXBkYXRlIGxhc3RVc2VySW5wdXQuCiAgICB0cnkgewogICAgICBjb25zdCBvcmlnU2V0ID0gTWVkaWFTZXNzaW9uLnByb3RvdHlwZS5zZXRBY3Rpb25IYW5kbGVyOwogICAgICBNZWRpYVNlc3Npb24ucHJvdG90eXBlLnNldEFjdGlvbkhhbmRsZXIgPSBmdW5jdGlvbihhY3QsIGgpIHsKICAgICAgICByZXR1cm4gb3JpZ1NldC5jYWxsKHRoaXMsIGFjdCwgKGFjdCAhPT0gJ3BhdXNlJyAmJiBhY3QgIT09ICdwbGF5JykgPyBoIDogZnVuY3Rpb24oLi4uYSkgewogICAgICAgICAgbGFzdFVzZXJJbnB1dCA9IERhdGUubm93KCk7CiAgICAgICAgICBpZiAodHlwZW9mIGggPT09ICdmdW5jdGlvbicpIHJldHVybiBoLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICBpZiAodikgYWN0ID09PSAncGF1c2UnID8gdi5wYXVzZSgpIDogdi5wbGF5KCkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBbJ3BhdXNlJywgJ3BsYXknXS5mb3JFYWNoKGEgPT4gbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKGEsIG51bGwpKTsKICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgZnVuY3Rpb24gb25WaWRlb05hdmlnYXRpb24oKSB7CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICAgIGlmIChJU19JT1MpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkZW8gPSBnZXRWaWRlbygpOwogICAgICAgIGlmICghdmlkZW8pIHJldHVybjsKICAgICAgICBpZiAodmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlcikgewogICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB2aWRlby5fYmdQbGF5UGF1c2VIYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHsKICAgICAgICAgIC8vIElmIHVzZXIgY2xpY2tlZCBvciBwcmVzc2VkIGEga2V5IHdpdGhpbiAzcyBiZWZvcmUgdGhlIHBhdXNlLCBpdCdzIGludGVudGlvbmFsCiAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RVc2VySW5wdXQgPCAzMDAwKSByZXR1cm47CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICAgIGlmICh2ICYmIHYucGF1c2VkICYmICF2LmVuZGVkICYmIHYucmVhZHlTdGF0ZSA+PSAyKSB2LnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICB9LCA4MDApOwogICAgICAgIH07CiAgICAgICAgdmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlciA9IGhhbmRsZXI7CiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVyKTsKICAgICAgfSwgMTUwMCk7CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3l0LW5hdmlnYXRlLWZpbmlzaCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1wYWdlLWRhdGEtdXBkYXRlZCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKCiAgICAvLyBTaW11bGF0ZSB1c2VyIGludGVyYWN0aW9uIHRvIHByZXZlbnQgIkFyZSB5b3Ugc3RpbGwgd2F0Y2hpbmc/IgogICAgY29uc3QgSU5URVJBQ1RJT05fSU5URVJWQUwgPSAxMCAqIDYwICogMTAwMDsgLy8gMTAgbWluCiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgaWYgKHBsYXllcikgewogICAgICAgIHBsYXllci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW1vdmUnLCB7IGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICB9CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICB9LCBJTlRFUkFDVElPTl9JTlRFUlZBTCk7CgogICAgLy8gS2VlcCBwbGF5ZXIgc3RhdGUgdXBkYXRlZAogICAgY29uc3QgUExBWUVSX1NUQVRFX0lOVEVSVkFMID0gNjAgKiAxMDAwOyAvLyAxIG1pbgogICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBjb25zdCB2aWRlbyA9IGdldFZpZGVvKCk7CiAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8ucGF1c2VkKSB7CiAgICAgICAgdmlkZW8uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3RpbWV1cGRhdGUnKSk7CiAgICAgIH0KICAgIH0sIFBMQVlFUl9TVEFURV9JTlRFUlZBTCk7CiAgfQoKICBmdW5jdGlvbiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIGRlbGF5ID0gMTAwMCkgewogICAgY29uc3QgbWF4RGVsYXkgPSA2MCAqIDEwMDA7IC8vIGNhcCBhdCA2MHMKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCAnX2xhY3QnKSkgewogICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dCgKICAgICAgICAoKSA9PiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIE1hdGgubWluKGRlbGF5ICogMiwgbWF4RGVsYXkpKSwKICAgICAgICBkZWxheQogICAgICApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaExhY3QoKSB7CiAgICB0cnkgewogICAgICBpZiAod2luZG93Ll9sYWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"brave-yt-sabr-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gWW91VHViZSdzIFNBQlIgKFNlcnZlciBBZGFwdGl2ZSBCaXRyYXRlKSBwcm90b2NvbCBzZW5kcyBhIGJhY2tvZmZUaW1lTXMKLy8gdmFsdWUgdGVsbGluZyB0aGUgcGxheWVyIHRvIHdhaXQgYmVmb3JlIHJlcXVlc3RpbmcgdmlkZW8gZGF0YS4gVGhpcwovLyBjb3ZlcnMgdGhlIGFkIHNsb3QgZHVyYXRpb24uIFdpdGhvdXQgYW4gYWRibG9ja2VyIHRoZSBhZCBmaWxscyB0aGUgd2FpdCwKLy8gc28gdGhlIHVzZXIgbmV2ZXIgbm90aWNlcy4gV2l0aCBhbiBhZGJsb2NrZXIsIHRoZSBhZCBpcyBibG9ja2VkIGJ1dCB0aGUKLy8gYmFja29mZiByZW1haW5zLCBjYXVzaW5nIGEgNC0xNiBzZWNvbmQgc3Bpbm5lci4KLy8gRnJvbTogaHR0cHM6Ly9pdGVyLmNhL3Bvc3QveXQtYWRibG9jay8KLy8KLy8gVHdvLXByb25nZWQgZml4OgovLwovLyAxLiBTUEEgbmF2aWdhdGlvbjogV2hlbiBjbGlja2luZyBiZXR3ZWVuIHZpZGVvcyB3aXRob3V0IGEgcGFnZSByZWxvYWQsCi8vICAgIHRoZSBwbGF5ZXIgcmV1c2VzIHRoZSBvbGQgU0FCUiBzZXNzaW9uICh3aGljaCBtYXkgYWxyZWFkeSBoYXZlIGEKLy8gICAgYmFja29mZikuIE9uIHl0LW5hdmlnYXRlLWZpbmlzaCwgd2Ugc2V0IGlzSW5saW5lUGxheWJhY2tOb0FkIG9uIHRoZQovLyAgICBwbGF5ZXIncyB2aWRlbyBkYXRhICh0ZWxsaW5nIGl0IHRoZXJlJ3Mgbm8gYWQgc2xvdCksIHRoZW4gY2FsbAovLyAgICBjYW5jZWxQbGF5YmFjaygpICsgbG9hZFZpZGVvQnlJZCgpIHRvIGZvcmNlIGEgbmV3IFNBQlIgc2Vzc2lvbi4KLy8KLy8gMi4gU0FCUiByZXNwb25zZSBwYXRjaGluZyAoZnVsbCBwYWdlIGxvYWRzKTogSW50ZXJjZXB0IFNBQlIgc3RyZWFtaW5nCi8vICAgIHJlc3BvbnNlcyBhbmQgcmV3cml0ZSBiYWNrb2ZmVGltZU1zIGluIHRoZSBwcm90b2J1Zi4gVGhpcyBoYW5kbGVzCi8vICAgIHBhZ2UgcmVsb2FkcyBhbmQgZGlyZWN0IG5hdmlnYXRpb25zIHdoZXJlIHRoZSBTQUJSIHNlc3Npb24gd2FzCi8vICAgIGFscmVhZHkgZXN0YWJsaXNoZWQgYmVmb3JlIHRoZSBzY3JpcHRsZXQgY291bGQgaW50ZXJ2ZW5lLgovLwovLyBUbyB1c2UgdGhpcyBzY3JpcHRsZXQ6Ci8vIDEuIEdvIHRvIGJyYXZlOi8vc2V0dGluZ3Mvc2hpZWxkcy9maWx0ZXJzCi8vIDIuIEVuYWJsZSBEZXZlbG9wZXIgbW9kZQovLyAzLiBDbGljayBvbiBjcmVhdGUgbmV3IHNjcmlwdGxldAovLyA0LiBBZGQgdGhpcyBjb250ZW50IGFuZCBuYW1lIGl0IGB1c2VyLXl0LXNhYnItZml4LmpzYAovLyA1LiBBZGQgYSBjdXN0b20gZmlsdGVyOiBgd3d3LnlvdXR1YmUuY29tIyMranModXNlci15dC1zYWJyLWZpeC5qcylgCi8vIDYuIEdvIHRvIFlvdVR1YmUgYW5kIHRlc3QKCihmdW5jdGlvbigpIHsKICAgIGNvbnN0IERFQlVHID0gZmFsc2U7CiAgICBjb25zdCBMT0dfUFJFRklYID0gJ1t5dC1zYWJyLWZpeF0nOwogICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IGVsYXBzZWQgPSAoKSA9PiAoKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMCkudG9GaXhlZCgyKSArICdzJzsKICAgIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7IGlmIChERUJVRykgY29uc29sZS5sb2coTE9HX1BSRUZJWCwgZWxhcHNlZCgpLCAuLi5hcmdzKTsgfTsKCiAgICAvLyBQcmVtaXVtIGFjY291bnRzIGhhdmUgbm8gYWRzIGFuZCBubyBiYWNrb2ZmLCBub3RoaW5nIHRvIGRvLgogICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EjbG9nb1t0aXRsZSo9IlByZW1pdW0iIGldJykpIHJldHVybjsKCiAgICAvLyBQcm9uZyAxOiBPbiBTUEEgbmF2aWdhdGlvbiwgZm9yY2UgYSBuZXcgYWQtZnJlZSBTQUJSIHNlc3Npb24uCiAgICAvLyBTZXQgaXNJbmxpbmVQbGF5YmFja05vQWQgb24gdGhlIHZpZGVvIGRhdGEgc28gdGhlIG5ldyBzZXNzaW9uCiAgICAvLyBkb2Vzbid0IGdldCBhbiBhZCBzbG90LCB0aGVuIHRlYXIgZG93biB0aGUgb2xkIHNlc3Npb24gYW5kIHN0YXJ0IGZyZXNoLgogICAgLy8gSW5pdGlhbGl6ZSB0byB0aGUgY3VycmVudCB2aWQgc28gdGhlIGluaXRpYWwgeXQtbmF2aWdhdGUtZmluaXNoCiAgICAvLyAod2hpY2ggZmlyZXMgb24gcGFnZSBsb2FkIGNvbXBsZXRpb24sIG5vdCBqdXN0IFNQQSBuYXYpIGlzIHRyZWF0ZWQKICAgIC8vIGFzIGEgZHVwbGljYXRlIGFuZCBza2lwcGVkLiBBdm9pZHMgdGVhcmluZyBkb3duIHBsYXliYWNrIG9uIHJlZnJlc2guCiAgICAvLyBXZSBza2lwIHRlYXJkb3duIHdoZW4gdGhlcmUncyBubyBwcmlvciBzZXNzaW9uIHRvIGNsZWFyLgogICAgbGV0IGxhc3RSZWxvYWRlZFZpZCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKSB8fCAnJzsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1uYXZpZ2F0ZS1maW5pc2gnLCAoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkIHx8IHZpZCA9PT0gbGFzdFJlbG9hZGVkVmlkKSByZXR1cm47CiAgICAgICAgY29uc3QgaGFkUHJpb3JTZXNzaW9uID0gbGFzdFJlbG9hZGVkVmlkICE9PSAnJzsKICAgICAgICBsYXN0UmVsb2FkZWRWaWQgPSB2aWQ7CiAgICAgICAgaWYgKCFoYWRQcmlvclNlc3Npb24pIHJldHVybjsKCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgICAgICAgaWYgKCFwbGF5ZXI/LmNhbmNlbFBsYXliYWNrIHx8ICFwbGF5ZXI/LmxvYWRWaWRlb0J5SWQpIHJldHVybjsKCiAgICAgICAgICAgIC8vIFNldCB0aGUgbm8tYWQgZmxhZyBiZWZvcmUgcmVsb2FkaW5nIHNvIHRoZSBuZXcgc2Vzc2lvbiBwaWNrcyBpdCB1cAogICAgICAgICAgICBjb25zdCB2ZCA9IHBsYXllci5nZXRWaWRlb0RhdGE/LigpOwogICAgICAgICAgICBpZiAodmQpIHZkLmlzSW5saW5lUGxheWJhY2tOb0FkID0gdHJ1ZTsKCiAgICAgICAgICAgIHBsYXllci5jYW5jZWxQbGF5YmFjaygpOwogICAgICAgICAgICBwbGF5ZXIubG9hZFZpZGVvQnlJZCh2aWQpOwogICAgICAgICAgICBsb2coJ2ZvcmNlZCBuZXcgU0FCUiBzZXNzaW9uIGZvcicsIHZpZCk7CiAgICAgICAgfSwgMTAwKTsKICAgIH0pOwoKICAgIC8vIFByb25nIDI6IEludGVyY2VwdCBTQUJSIHJlc3BvbnNlcyBhbmQgcGF0Y2ggYmFja29mZlRpbWVNcy4KICAgIC8vIFRlZSB0aGUgYm9keSBzbyBtZWRpYSBjaHVua3MgKD49MTAwMCBieXRlcykgcGFzcyB0aHJvdWdoIHVudG91Y2hlZAogICAgLy8g4oCUIG9ubHkgdGhlIHNtYWxsIGNvbnRyb2wgbWVzc2FnZXMgY2FycnlpbmcgdGhlIGJhY2tvZmYgZmllbGQgZ2V0CiAgICAvLyBidWZmZXJlZCBhbmQgcmUtZW1pdHRlZCBhcyBhIHN5bnRoZXNpemVkIFJlc3BvbnNlLgogICAgY29uc3QgcmVhbEZldGNoID0gd2luZG93LmZldGNoOwoKICAgIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uKHJlc291cmNlLCBpbml0KSB7CiAgICAgICAgY29uc3QgdXJsID0gdHlwZW9mIHJlc291cmNlID09PSAnc3RyaW5nJyA/IHJlc291cmNlIDogKHJlc291cmNlPy51cmwgfHwgJycpOwoKICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdnb29nbGV2aWRlby5jb20nKSAmJiB1cmwuaW5jbHVkZXMoJ3NhYnI9MScpKSB7CiAgICAgICAgICAgIGxldCBybiA9ICcnOwogICAgICAgICAgICB0cnkgeyBybiA9IG5ldyBVUkwodXJsKS5zZWFyY2hQYXJhbXMuZ2V0KCdybicpIHx8ICcnOyB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgIGxvZygnU0FCUiBmZXRjaCBybj0nICsgcm4pOwoKICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgIXJlc3BvbnNlLmJvZHkpIHJldHVybiByZXNwb25zZTsKICAgICAgICAgICAgICAgIC8vIFRlZSBkZWZlbnNpdmVseTogaWYgaXQgdGhyb3dzIChsb2NrZWQgc3RyZWFtLCBicm93c2VyIHF1aXJrKSwKICAgICAgICAgICAgICAgIC8vIGhhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGJhY2sgdG8gYXZvaWQgYnJlYWtpbmcgdGhlIHZpZGVvIGVudGlyZWx5LgogICAgICAgICAgICAgICAgbGV0IHBhc3MsIHNjYW4sIHJlaW5pdDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgW3Bhc3MsIHNjYW5dID0gcmVzcG9uc2UuYm9keS50ZWUoKTsKICAgICAgICAgICAgICAgICAgICByZWluaXQgPSB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LCBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzIH07CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0oc2Nhbi5nZXRSZWFkZXIoKSwgMTAwMCkudGhlbihmdW5jdGlvbihieXRlcykgewogICAgICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1NBQlIgZG9uZSBybj0nICsgcm4pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHBhc3MsIHJlaW5pdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvZygnc21hbGwgcmVzcG9uc2Ugcm49JyArIHJuLCAnc2l6ZT0nICsgYnl0ZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBwYXRjaEJhY2tvZmZGaWVsZChieXRlcywgcm4pOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IG5ldyBSZXNwb25zZShieXRlcywgcmVpbml0KTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2UudXJsLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvdXQsICd0eXBlJywgeyB2YWx1ZTogcmVzcG9uc2UudHlwZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkge30KICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLyBSZWFkIGEgc3RyZWFtIGludG8gYSBVaW50OEFycmF5LiBJZiBlYXJseUV4aXRUaHJlc2hvbGQgaXMgc2V0IGFuZCB0aGUKICAgIC8vIGFjY3VtdWxhdGVkIGJ5dGVzIGNyb3NzIGl0LCBjYW5jZWwgdGhlIHJlYWRlciBhbmQgcmV0dXJuIG51bGwg4oCUIHVzZWQKICAgIC8vIHRvIGJhaWwgb3V0IG9mIGJ1ZmZlcmluZyB3aGVuIHRoZSByZXNwb25zZSBpcyBjbGVhcmx5IGEgbWVkaWEgY2h1bmsKICAgIC8vIGFuZCBzaG91bGQgc3RyZWFtIHN0cmFpZ2h0IHRvIHRoZSBwbGF5ZXIgaW5zdGVhZC4KICAgIGZ1bmN0aW9uIHJlYWRTdHJlYW0ocmVhZGVyLCBlYXJseUV4aXRUaHJlc2hvbGQpIHsKICAgICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gcHVtcChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBuZXcgVWludDhBcnJheSh0b3RhbCk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IG9mZiArPSBjaHVua3NbaV0ubGVuZ3RoLCBpKyspCiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkLnNldChjaHVua3NbaV0sIG9mZik7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2VkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNodW5rcy5wdXNoKHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICAgIHRvdGFsICs9IHJlc3VsdC52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIGlmIChlYXJseUV4aXRUaHJlc2hvbGQgJiYgdG90YWwgPj0gZWFybHlFeGl0VGhyZXNob2xkKSB7CiAgICAgICAgICAgICAgICB0cnkgeyByZWFkZXIuY2FuY2VsKCk7IH0gY2F0Y2goZSkge30KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpLnRoZW4ocHVtcCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gU2NhbiBmb3IgcHJvdG9idWYgZmllbGQgNCAoYmFja29mZlRpbWVNcykgYW5kIHJld3JpdGUgdmFsdWVzID4gNTAwbXMKICAgIC8vIHRvIGEgc21hbGwgcmFuZG9tIHZhbHVlICg1MC0xNTBtcywgbG9va3MgbGlrZSBuYXR1cmFsIGJhY2tvZmYgbm9pc2UKICAgIC8vIHJhdGhlciB0aGFuIGEgY2xlYW4gemVybykuIFByb3RvYnVmIHdpcmUgZm9ybWF0OiBmaWVsZCA0LCB3aXJlIHR5cGUKICAgIC8vIDAgKHZhcmludCkgPSB0YWcgYnl0ZSAweDIwIChmaWVsZF9udW1iZXIgPDwgMyB8IHdpcmVfdHlwZSA9IDQgPDwgMwogICAgLy8gfCAwKS4gVGhlIHZhcmludCB1c2VzIDcgYml0cyBwZXIgYnl0ZSB3aXRoIDB4ODAgYXMgY29udGludWF0aW9uCiAgICAvLyBmbGFnLiBXZSByZXdyaXRlIHRoZSB2YXJpbnQgaW4gcGxhY2UsIGtlZXBpbmcgdGhlIHNhbWUgYnl0ZSBjb3VudAogICAgLy8gc28gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlIHN0YXlzIHZhbGlkLgogICAgZnVuY3Rpb24gcGF0Y2hCYWNrb2ZmRmllbGQoYnl0ZXMsIHJuKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgaWYgKGJ5dGVzW2ldICE9PSAweDIwKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IHZhbCA9IDAsIHNoaWZ0ID0gMCwgZW5kID0gaSArIDE7CiAgICAgICAgICAgIHdoaWxlIChlbmQgPCBieXRlcy5sZW5ndGggJiYgc2hpZnQgPCAzNSkgewogICAgICAgICAgICAgICAgdmFsIHw9IChieXRlc1tlbmRdICYgMHg3ZikgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgICBpZiAoIShieXRlc1tlbmRdICYgMHg4MCkpIHsgZW5kKys7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBzaGlmdCArPSA3OwogICAgICAgICAgICAgICAgZW5kKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbCA+IDUwMCAmJiB2YWwgPCAxMDAwMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IDUwICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKTsKICAgICAgICAgICAgICAgIGxvZygnUEFUQ0ggYmFja29mZj0nICsgdmFsICsgJ21zIOKGkiAnICsgdGFyZ2V0ICsgJ21zIGF0IG9mZnNldD0nICsgaSwgJ3JuPScgKyBybik7CiAgICAgICAgICAgICAgICBsZXQgcG9zID0gaSArIDEsIHJlbWFpbmluZyA9IHRhcmdldDsKICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnl0ZXNbcG9zKytdID0gKHJlbWFpbmluZyAmIDB4N2YpIHwgMHg4MDsKICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPj4+PSA3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnl0ZXNbcG9zXSA9IHJlbWFpbmluZyAmIDB4N2Y7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKERFQlVHKSB7CiAgICAgICAgbGV0IGxhc3RSUyA9IC0xOwogICAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCB2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsKICAgICAgICAgICAgaWYgKCF2KSByZXR1cm47CiAgICAgICAgICAgIGlmICh2LnJlYWR5U3RhdGUgIT09IGxhc3RSUykgewogICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdi5idWZmZXJlZC5sZW5ndGggPiAwID8gdi5idWZmZXJlZC5lbmQoMCkudG9GaXhlZCgxKSA6ICcwJzsKICAgICAgICAgICAgICAgIGxvZygnVklERU8gcnM9JyArIHYucmVhZHlTdGF0ZSwgJ2N0PScgKyB2LmN1cnJlbnRUaW1lLnRvRml4ZWQoMSksICdidWY9JyArIGJ1Ziwgdi5wYXVzZWQgPyAncGF1c2VkJyA6ICdwbGF5aW5nJyk7CiAgICAgICAgICAgICAgICBsYXN0UlMgPSB2LnJlYWR5U3RhdGU7CiAgICAgICAgICAgIH0KICAgICAgICB9LCAyMDApOwogICAgfQoKICAgIGxvZygnbG9hZGVkJyk7Cn0pKCk7Cgo="},{"name":"brave-youtube-playback-speed-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXlvdXR1YmUtcGxheWJhY2stc3BlZWQtZml4LmpzCi8vIFRoaXMgc2NyaXB0IGlzIGluamVjdGVkIGludG8gWW91VHViZSBwYWdlcyB0byB3b3JrIGFyb3VuZCBhIFlvdVR1YmUgYnVnIHdoZXJlCi8vIHRoZSBwbGF5YmFjayBzcGVlZCB3aWxsIG9ubHkgc2F2ZSBmb3IgZnV0dXJlIHZpZGVvcyB3aGVuIHVzaW5nIHRoZSBzbGlkZXIgY29udHJvbHMuCi8vIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHBsYXliYWNrIHNwZWVkIHVzaW5nIHRoZSBidXR0b25zLCB0aGUgbmV3IHNwZWVkIHdpbGwgbm90IGJlIHNhdmVkLgovLyBUaGlzIGNyZWF0ZWQgaXNzdWVzIHdoZXJlLCBpZiB0aGUgdXNlciBhZGp1c3RlZCB0aGUgc2xpZGVyLCBhbmQgdGhlbiBjbGlja2VkIHRoZSAxeCBidXR0b24gdG8KLy8gcmVzZXQgdGhlIHNwZWVkLCB0aGUgc3BlZWQgd291bGQgYmUgcmVzZXQgdG8gMXgsIGJ1dCB0aGVuIGFsbCBmdXR1cmUgdmlkZW9zIHdvdWxkIHBsYXkgYXQgdGhlCi8vIHByZXZpb3VzbHkgc2V0IHNwZWVkLiBUaGUgc2NyaXB0IHdvcmtzIGFyb3VuZCB0aGlzIGJ5IHNhdmluZyB0aGUgcGxheWJhY2sgc3BlZWQgdG8gc2Vzc2lvblN0b3JhZ2UKLy8gd2hlbmV2ZXIgaXQgY2hhbmdlcywgaW5zdGVhZCBvZiByZWx5aW5nIG9uIFlvdVR1YmUncyBkZWZhdWx0IGJlaGF2aW9yLgooZnVuY3Rpb24gKCkgewogIGNvbnN0IEtFWSA9ICd5dC1wbGF5ZXItcGxheWJhY2stcmF0ZSc7CiAgZnVuY3Rpb24gYXR0YWNoKHBsYXllcikgewogICAgaWYgKCFwbGF5ZXIgfHwgIXBsYXllci5hZGRFdmVudExpc3RlbmVyIHx8IHBsYXllci5fX3JhdGVIb29rZWQpIHJldHVybiBmYWxzZTsKICAgIHBsYXllci5fX3JhdGVIb29rZWQgPSB0cnVlOwogICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ29uUGxheWJhY2tSYXRlQ2hhbmdlJywgZnVuY3Rpb24gKHJhdGUpIHsKICAgICAgY29uc3QgdiA9ICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpID8gcmF0ZSA6IChyYXRlICYmIHJhdGUuZGF0YSkgPz8gcmF0ZTsKICAgICAgdHJ5IHsKICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKEtFWSwgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgZGF0YTogU3RyaW5nKHYpLAogICAgICAgICAgY3JlYXRpb246IERhdGUubm93KCkKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoIWF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICBjb25zdCBvbk5hdkZpbmlzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogIH0KfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIHZhZnQKICAgIC8vIGluc3RhbmNlIHRoYXQgZmlnaHRzIGZvciBwbGF5ZXIgY29udHJvbC4gT25seSB0aGUgdG9wIGZyYW1lIGhvc3RzIHRoZSBwbGF5ZXIgb24KICAgIC8vIHR3aXRjaC50di9DSEFOTkVMOyBuZXN0ZWQgYXV4aWxpYXJ5IGZyYW1lcyBhcmUgbm9pc2UuCiAgICAvLyBBbGxvdy1saXN0IGZvciBuZXN0ZWQtZnJhbWUgaW5qZWN0aW9uOiBUd2l0Y2gncyB0aHJlZSBkb2N1bWVudGVkIGVtYmVkIGNvbnRleHRzCiAgICAvLyAoaHR0cHM6Ly9kZXYudHdpdGNoLnR2L2RvY3MvZW1iZWQvdmlkZW8tYW5kLWNsaXBzLykg4oCUIHByZXNlcnZlcyBUd2l0Y2ggc3RyZWFtcwogICAgLy8gZW1iZWRkZWQgb24gdGhpcmQtcGFydHkgc2l0ZXMgd2hlcmUgdmFmdCBydW5zIGluIGFuIGlmcmFtZSB3aG9zZSBwYXJlbnQgaXMgb24KICAgIC8vIGEgZGlmZmVyZW50IG9yaWdpbi4KICAgIC8vIFVzZSB3aW5kb3cuZnJhbWVFbGVtZW50IHRvIGRldGVjdCBuZXN0ZWQgZnJhbWVzIOKAlCBudWxsIG9uIHRvcCBmcmFtZSwgdGhlIGlmcmFtZQogICAgLy8gZWxlbWVudCBvbiBhIHNhbWUtb3JpZ2luIG5lc3RlZCBmcmFtZSwgdGhyb3dzIG9uIGEgY3Jvc3Mtb3JpZ2luIG5lc3RlZCBmcmFtZS4KICAgIC8vIE1vcmUgcmVsaWFibGUgdGhhbiAnd2luZG93ICE9PSB3aW5kb3cudG9wJyBiZWNhdXNlIFRhbXBlcm1vbmtleSB3cmFwcyB3aW5kb3cgaW4gYQogICAgLy8gcHJveHkgd2hlcmUgdGhlIHN0cmljdCBjb21wYXJpc29uIGNhbiByZXR1cm4gdHJ1ZSBldmVuIG9uIHRoZSB0b3AgZnJhbWUuCiAgICBsZXQgX2lzTmVzdGVkID0gZmFsc2U7CiAgICB0cnkgeyBfaXNOZXN0ZWQgPSB3aW5kb3cuZnJhbWVFbGVtZW50ICE9PSBudWxsOyB9IGNhdGNoIChfZSkgeyBfaXNOZXN0ZWQgPSB0cnVlOyB9CiAgICBpZiAoX2lzTmVzdGVkKSB7CiAgICAgICAgY29uc3QgX2hvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfaXNFbWJlZENvbnRleHQgPSBfaG9zdCA9PT0gJ3BsYXllci50d2l0Y2gudHYnIHx8IF9ob3N0ID09PSAnZW1iZWQudHdpdGNoLnR2JyB8fCBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvZW1iZWQvJyk7CiAgICAgICAgaWYgKCFfaXNFbWJlZENvbnRleHQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmFmdCBza2lwcGVkIOKAlCBuZXN0ZWQgZnJhbWUgb24gJyArIF9ob3N0ICsgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgKyAnIChub3QgYSBUd2l0Y2ggZW1iZWQpLiBJZiB5b3Ugc2VlIHRoaXMgb24gdHdpdGNoLnR2L0NIQU5ORUwgdG9wIGZyYW1lLCBwbGVhc2UgcmVwb3J0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJ3VzZSBzdHJpY3QnOwogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gNTg7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2YWZ0IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZhZnQgdicgKyBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnIHNraXBwZWQg4oCUIGFub3RoZXIgc2NyaXB0IGFscmVhZHkgYWN0aXZlICh2JyArIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnKS4gUmVtb3ZlIGR1cGxpY2F0ZSBzY3JpcHRzLicpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb247CiAgICAvLyBDb25maWd1cmF0aW9uIGFuZCBzdGF0ZSBzaGFyZWQgYmV0d2VlbiB3aW5kb3cgYW5kIHdvcmtlciBzY29wZXMKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guIFRoZSBzcGVjaWZpYyB0d2l0Y2gtc3RpdGNoZWQtYWQgREFURVJBTkdFCiAgICAgICAgLy8gbWFya2VyIGlzIGEgc3Vic2V0IG9mIHRoaXMgcHJlZml4LgogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVycyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIiddOwogICAgICAgIHNjb3BlLkFkU2VnbWVudFVSTFBhdHRlcm5zID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24g4oCUIGZvcgogICAgICAgIC8vIGEgMTAwLWxpbmUgbTN1OCBhdCB+MiBwb2xscy9zZWMgZHVyaW5nIGFuIGFkIGJyZWFrLCBob2lzdGluZyB0aGUgVVJMCiAgICAgICAgLy8gcmV3cml0ZSBhbG9uZSBzYXZlcyB+MjAwIHJlZ2V4IGNvbXBpbGF0aW9ucyBwZXIgc2Vjb25kLgogICAgICAgIHNjb3BlLlR3aXRjaEFkVXJsUmV3cml0ZVJlZ2V4ID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVXJpQXR0cmlidXRlUmVnZXggPSAvVVJJPSIoW14iXSspIi87CiAgICAgICAgc2NvcGUuQ2xpZW50SUQgPSAna2ltbmU3OGt4M25jeDZicmdvNG12NndraTVoMWtvJzsKICAgICAgICBzY29wZS5CYWNrdXBQbGF5ZXJUeXBlcyA9IFsKICAgICAgICAgICAgLy8gT3JkZXIgbWF0dGVyczogZmlyc3QgY2xlYW4gdHlwZSB3aW5zLiAnZW1iZWQnIG1vdmVkIHRvIGVuZCDigJQgZmllbGQtb2JzZXJ2ZWQKICAgICAgICAgICAgLy8gVHdpdGNoIHJldHVybnMgR1FMICdzZXJ2ZXIgZXJyb3InIGZvciBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuIG9uIGVtYmVkIHdoZW4KICAgICAgICAgICAgLy8gcmVxdWVzdGVkIGZyb20gdHdpdGNoLnR2IG9yaWdpbiwgd2FzdGluZyB+MjAwLTQwMG1zIHBlciBicmVhayBhcyBmaXJzdC10cnkuCiAgICAgICAgICAgIC8vIEtlcHQgaW4gY2FzZSBpdCBldmVyIHN1Y2NlZWRzIG9uIHNvbWUgY2hhbm5lbC91c2VyIGNvbWJvLgogICAgICAgICAgICAnc2l0ZScsLy9Tb3VyY2UKICAgICAgICAgICAgJ3BvcG91dCcsLy9Tb3VyY2UKICAgICAgICAgICAgJ21vYmlsZV93ZWInLC8vTW9iaWxlCiAgICAgICAgICAgICdlbWJlZCcsLy9Tb3VyY2UgKHVucmVsaWFibGUg4oCUIHNlZSBub3RlIGFib3ZlKQogICAgICAgICAgICAvLyAnYXV0b3BsYXknICgzNjBwKSByZW1vdmVkOiB3aGVuIGNvbW1pdHRlZCBhcyBjeWNsZSBiYWNrdXAsIHRoZSBwbGF5ZXIgZ2V0cyBzdHVjawogICAgICAgICAgICAvLyBpbiBhbiBlbmRsZXNzIGxvYWRpbmcgY2lyY2xlIGFmdGVyIHRoZSBDU0FJLW9ubHkgcGF0aCByZWxlYXNlcyB0aGUgYmFja3VwIOKAlAogICAgICAgICAgICAvLyBhdXRvcGxheSB2YXJpYW50cyBkb24ndCB0cmFuc2l0aW9uIGNsZWFubHkgYmFjayB0byBtYWluIHN0cmVhbSB2YXJpYW50cy4KICAgICAgICAgICAgLy8ncGljdHVyZS1ieS1waWN0dXJlLUNBQ0hFRCcvLzM2MHAgKC1DQUNIRUQgaXMgYW4gaW50ZXJuYWwgc3VmZml4IGFuZCBpcyByZW1vdmVkKQogICAgICAgIF07CiAgICAgICAgc2NvcGUuRmFsbGJhY2tQbGF5ZXJUeXBlID0gJ3NpdGUnOy8vIHdhcyAnZW1iZWQnIOKAlCBzaXRlIGlzIG1vcmUgcmVsaWFibGUgd2hlbiBhbGwgU291cmNlIHR5cGVzIGVuZCB1cCBhZC1sYWRlbgogICAgICAgIHNjb3BlLkZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJ3BvcG91dCc7CiAgICAgICAgc2NvcGUuUHJlZmVyTG93UXVhbGl0eUJhY2t1cCA9IHRydWU7Ly8gSHlicmlkIHNhZmV0eSBuZXQgZm9yIFNTQUktaGVhdnkgYnJlYWtzOiBzdGlja3kgZXNjYXBlIGhhdGNoIChmaXJlcyBhZnRlciB+OHMgc3R1Y2sgaW4gYWxsLXN0cmlwcGVkIHN0YXRlKSArIGF1dG9wbGF5ICgzNjBwKSBhcyBsYXN0LXJlc29ydCBiYWNrdXAgd2hlbiBhbGwgU291cmNlIHR5cGVzIGFyZSBhZC1sYWRlbi4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX3ByZWZlckxvd1F1YWxpdHlCYWNrdXA9ZmFsc2UgdG8gZGlzYWJsZS4KICAgICAgICBzY29wZS5CYWNrdXBTd2FwRmlyc3QgPSB0cnVlOy8vIE9uIGFkIGRldGVjdCwgaW1tZWRpYXRlbHkgc3dhcCB0byBhIGJhY2t1cCBwbGF5ZXItdHlwZSBtM3U4IChUVFYtQUItc3R5bGUpLiBBdm9pZHMgTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkg4oCUIGZld2VyIGxvYWRpbmcgY2lyY2xlcyBpbiBmaWVsZC4gQ29zdDogZXh0cmEgZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhay4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX2JhY2t1cFN3YXBGaXJzdD1mYWxzZSB0byBkaXNhYmxlLgogICAgICAgIHNjb3BlLlNraXBQbGF5ZXJSZWxvYWRPbkhldmMgPSBmYWxzZTsvLyBJZiB0cnVlIHRoaXMgd2lsbCBza2lwIHBsYXllciByZWxvYWQgb24gc3RyZWFtcyB3aGljaCBoYXZlIDJrLzRrIHF1YWxpdHkgKGlmIHlvdSBlbmFibGUgdGhpcyBhbmQgeW91IHVzZSB0aGUgMmsvNGsgcXVhbGl0eSBzZXR0aW5nIHlvdSdsbCBnZXQgZXJyb3IgIzQwMDAgLyAjMzAwMCAvIHNwaW5uaW5nIHdoZWVsIG9uIGNocm9tZSBiYXNlZCBicm93c2VycykKICAgICAgICBzY29wZS5BbHdheXNSZWxvYWRQbGF5ZXJPbkFkID0gZmFsc2U7Ly8gQWx3YXlzIHBhdXNlL3BsYXkgd2hlbiBlbnRlcmluZy9sZWF2aW5nIGFkcwogICAgICAgIHNjb3BlLlJlbG9hZFBsYXllckFmdGVyQWQgPSB0cnVlOy8vIEFmdGVyIHRoZSBhZCBmaW5pc2hlcyBkbyBhIHBsYXllciByZWxvYWQgaW5zdGVhZCBvZiBwYXVzZS9wbGF5CiAgICAgICAgc2NvcGUuUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gMzA7Ly8gTWluaW11bSBzZWNvbmRzIGJldHdlZW4gcmVsb2FkcyDigJQgYnJlYWtzIENTQUkgY2FzY2FkZXMgdHJpZ2dlcmVkIGJ5IHJlbG9hZAogICAgICAgIHNjb3BlLkRpc2FibGVSZWxvYWRDYXAgPSBmYWxzZTsvLyBJZiB0cnVlLCBidWZmZXIgbW9uaXRvciByZWxvYWRzIHVubGltaXRlZCB0aW1lcyAocHJlLXY0NyBiZWhhdmlvciwgcmlzayBvZiBjYXNjYWRlKQogICAgICAgIHNjb3BlLkRyaWZ0Q29ycmVjdGlvblJhdGUgPSAxLjE7Ly8gUGxheWJhY2sgcmF0ZSBmb3IgY2F0Y2hpbmcgdXAgdG8gbGl2ZSBlZGdlIGFmdGVyIHJlbG9hZCAoMCA9IGRpc2FibGUgZHJpZnQgY29ycmVjdGlvbikKICAgICAgICBzY29wZS5FYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSA1Oy8vIE51bWJlciBvZiBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIHRyaWdnZXJpbmcgZWFybHkgcmVsb2FkIChlYWNoIHBvbGwgfjJzLCBzbyA1ID0gfjEwcywgMyA9IH42cywgMTAgPSB+MjBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gdHJ1ZTsvLyBSZW1lbWJlciB3aGljaCBiYWNrdXAgcGxheWVyIHR5cGUgd29ya2VkIGFuZCB0cnkgaXQgZmlyc3Qgb24gbmV4dCBhZCBicmVhawogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1RpbWUgPSAxNTAwOwogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1BsYXllckluZGV4ID0gMjsvL2F1dG9wbGF5CiAgICAgICAgc2NvcGUuSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3MgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHNjb3BlLlN0cmVhbUluZm9zQnlVcmwgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHNjb3BlLkdRTERldmljZUlEID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRWZXJzaW9uID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRTZXNzaW9uID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBudWxsOwogICAgICAgIHNjb3BlLkF1dGhvcml6YXRpb25IZWFkZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgc2NvcGUuU2ltdWxhdGVkQWRzRGVwdGggPSAwOwogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ0ZpeCA9IHRydWU7Ly8gSWYgdHJ1ZSB0aGlzIHdpbGwgcGF1c2UvcGxheSB0aGUgcGxheWVyIHdoZW4gaXQgZ2V0cyBzdHVjayBidWZmZXJpbmcKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEZWxheSA9IDYwMDsvLyBIb3cgb2Z0ZW4gc2hvdWxkIHdlIGNoZWNrIHRoZSBwbGF5ZXIgc3RhdGUgKGluIG1pbGxpc2Vjb25kcykKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdTYW1lU3RhdGVDb3VudCA9IDM7Ly8gSG93IG1hbnkgdGltZXMgb2Ygc2VlaW5nIHRoZSBzYW1lIHBsYXllciBzdGF0ZSB1bnRpbCB3ZSB0cmlnZ2VyIHBhdXNlL3BsYXkgKGl0IHdpbGwgb25seSB0cmlnZ2VyIGl0IG9uZSB0aW1lIHVudGlsIHRoZSBwbGF5ZXIgc3RhdGUgY2hhbmdlcyBhZ2FpbikKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEYW5nZXJab25lID0gMTsvLyBUaGUgYnVmZmVyaW5nIHRpbWUgbGVmdCAoaW4gc2Vjb25kcykgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBwbGF5ZXJzIHBsYXliYWNrIHBvc2l0aW9uIGluIHRoZSBwbGF5ZXIgc3RhdGUgY2hlY2sKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZCA9IGZhbHNlOy8vIElmIHRydWUgdGhpcyB3aWxsIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkgKHBsYXllciByZWxvYWRpbmcgaXMgYmV0dGVyIGF0IGZpeGluZyB0aGUgcGxheWJhY2sgaXNzdWVzIGJ1dCBpdCB0YWtlcyBzbGlnaHRseSBsb25nZXIpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgPSA4MDAwOy8vIE1pbmltdW0gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmV0d2VlbiBlYWNoIHBhdXNlL3BsYXkgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlciBwcmVzc2luZyBwYXVzZS9wbGF5IHdoZW4gdGhlcmUgYXJlIGdlbnVpbmUgYnVmZmVyaW5nIHByb2JsZW1zKQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgPSBmYWxzZTsvLyBFbmFibGUgdGhpcyBpZiB5b3UncmUgZ2V0dGluZyBhbiBpbW1lZGlhdGUgcGF1c2UvcGxheS9yZWxvYWQgYXMgeW91IG9wZW4gYSBzdHJlYW0gKHdoaWNoIGlzIGNhdXNpbmcgdGhlIHN0cmVhbSB0byB0YWtlIGxvbmdlciB0byBsb2FkKS4gT25lIHByb2JsZW0gd2l0aCB0aGlzIGJlaW5nIHRydWUgaXMgdGhhdCBpdCBjYW4gY2F1c2UgdGhlIHBsYXllciB0byBnZXQgc3R1Y2sgaW4gc29tZSBpbnN0YW5jZXMgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIHByZXNzIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQgPSA1Oy8vIEhvdyBmYXIgdGhlIHN0cmVhbSBuZWVkIHRvIG1vdmUgYmVmb3JlIGRvaW5nIHRoZSBidWZmZXJpbmcgbWl0aWdhdGlvbiAoZGVwZW5kcyBvbiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tFbmFibGVkIGJlaW5nIHRydWUpCiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb01heEFnZU1zID0gMzAgKiA2MCAqIDEwMDA7CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgaW4gc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVsZXRlIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBFbmNvZGluZ3NNM1U4OiBlbmNvZGluZ3NNM3U4LAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgICAgIFJlc29sdXRpb25MaXN0OiBbXSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIE1vZGlmaWVkTTNVODogbnVsbCwKICAgICAgICAgICAgSXNVc2luZ01vZGlmaWVkTTNVODogZmFsc2UsCiAgICAgICAgICAgIElzU2hvd2luZ0FkOiBmYWxzZSwKICAgICAgICAgICAgSXNNaWRyb2xsOiBmYWxzZSwKICAgICAgICAgICAgQWRCcmVha1N0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgUG9kTGVuZ3RoOiAxLAogICAgICAgICAgICBIYXNDb25maXJtZWRBZEF0dHJzOiBmYWxzZSwKICAgICAgICAgICAgQ2xlYW5QbGF5bGlzdENvdW50OiAwLAogICAgICAgICAgICBDb25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrczogMCwKICAgICAgICAgICAgQ3NhaU9ubHlUaGlzQnJlYWs6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIEZyZWV6ZVN0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBUb3RhbEFsbFN0cmlwcGVkUG9sbHM6IDAsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZU0zVTg6IG51bGwsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQ6IDAsCiAgICAgICAgICAgIEJhY2t1cEVuY29kaW5nc00zVThDYWNoZTogW10sCiAgICAgICAgICAgIEFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IG51bGwsCiAgICAgICAgICAgIFBpbm5lZEJhY2t1cFBsYXllclR5cGU6IG51bGwsCiAgICAgICAgICAgIExhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBGYWlsZWRCYWNrdXBQbGF5ZXJUeXBlczogbmV3IE1hcCgpLAogICAgICAgICAgICBMb2dnZWRCYWNrdXBBZHNCeVR5cGU6IG51bGwsCiAgICAgICAgICAgIEN5Y2xlUmVzY3VlZFRoaXNCcmVhazogZmFsc2UsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQ291bnQ6IDAsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQXRQb2xsOiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZFRyaWdnZXJlZDogZmFsc2UsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQ6IGZhbHNlLAogICAgICAgICAgICBFc2NhcGVIYXRjaEZpcmVkOiBmYWxzZSwKICAgICAgICAgICAgTGFzdFBsYXllclJlbG9hZDogMCwKICAgICAgICAgICAgUmVsb2FkVGltZXN0YW1wczogW10sCiAgICAgICAgICAgIEhhc0NoZWNrZWRVbmtub3duVGFnczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gbWFza0FzTmF0aXZlKGZuLCBuYW1lKSB7CiAgICAgICAgZm4udG9TdHJpbmcgPSAoKSA9PiAnZnVuY3Rpb24gJyArIG5hbWUgKyAnKCkgeyBbbmF0aXZlIGNvZGVdIH0nOwogICAgICAgIHJldHVybiBmbjsKICAgIH0KICAgIGNvbnN0IGxvZ2dlZENzYWlUeXBlcyA9IG5ldyBTZXQoKTsKICAgIGxldCBpc0FjdGl2ZWx5U3RyaXBwaW5nQWRzID0gZmFsc2U7CiAgICBsZXQgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IGZhbHNlOwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgbGV0IGNhY2hlZFJvb3ROb2RlID0gbnVsbDsvLyBDYWNoZWQgI3Jvb3QgRE9NIGVsZW1lbnQgKG5ldmVyIGNoYW5nZXMgaW4gUmVhY3QgU1BBcykKICAgIGxldCBjYWNoZWRQbGF5ZXJSb290RGl2ID0gbnVsbDsvLyBDYWNoZWQgLnZpZGVvLXBsYXllciBlbGVtZW50CiAgICAvLyBPbmUtc2hvdCBmbGFncyBmb3Igb3ZlcmxheS1oaWRlIGxvZ3MuIFR3aXRjaCdzIFJlYWN0IHRyZWUgcmUtbW91bnRzIFNEQQogICAgLy8gd3JhcHBlcnMgYW5kIGFkLWJyZWFrIGNhcmRzIGNvbnN0YW50bHkgZHVyaW5nIGFuIGFkIGJyZWFrLCBzbyB0aGUKICAgIC8vIGhpZGUtYW5kLWxvZyBmaXJlcyBodW5kcmVkcyBvZiB0aW1lcy4gTG9nIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKICAgIC8vIGhpZGUgdHlwZSBwZXIgcGFnZSBsb2FkLCB0aGVuIHN0YXkgc2lsZW50IOKAlCB0aGUgaGlkZSBpdHNlbGYgc3RpbGwgcnVucwogICAgLy8gb24gZXZlcnkgdGljayB2aWEgZGF0YXNldC1iYXNlZCBkZWR1cC4KICAgIGxldCBsb2dnZWRTZGFIaWRlID0gZmFsc2U7CiAgICAvLyBTdHJpbmdzIHVzZWQgdG8gZGV0ZWN0IGFuZCBoYW5kbGUgY29uZmxpY3RpbmcgVHdpdGNoIHdvcmtlciBvdmVycmlkZXMgKGUuZy4gVHdpdGNoTm9TdWIpCiAgICBjb25zdCB3b3JrZXJTdHJpbmdDb25mbGljdHMgPSBbCiAgICAgICAgJ3R3aXRjaCcsCiAgICAgICAgJ2lzVmFyaWFudEEnLy8gVHdpdGNoTm9TdWIKICAgIF07CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICAvLyBXYWxrIHRoZSBXb3JrZXIgcHJvdG90eXBlIGNoYWluIGFuZCByZW1vdmUgY29uZmxpY3Rpbmcgb3ZlcnJpZGVzCiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocGFyZW50LCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOwogICAgICAgICAgICBwYXJlbnQgPSByZWluc2VydFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVmFsaWRXb3JrZXIod29ya2VyKSB7CiAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gd29ya2VyLnRvU3RyaW5nKCk7CiAgICAgICAgY29uc3QgaGFzQ29uZmxpY3QgPSB3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBjb25zdCBoYXNSZWluc2VydCA9IHdvcmtlclN0cmluZ1JlaW5zZXJ0LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgaWYgKGhhc0NvbmZsaWN0ICYmICFoYXNSZWluc2VydCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgcmVqZWN0ZWQg4oCUIGNvbmZsaWN0IHN0cmluZyBmb3VuZDogJyArIHdvcmtlclN0cmluZ0NvbmZsaWN0cy5maWx0ZXIoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkuam9pbignLCAnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhaGFzQ29uZmxpY3QgfHwgaGFzUmVpbnNlcnQ7CiAgICB9CiAgICAvLyBSZXBsYWNlIHdpbmRvdy5Xb3JrZXIgdG8gaW50ZXJjZXB0IFR3aXRjaCdzIHZpZGVvIHdvcmtlciBhbmQgaW5qZWN0IGFkLWJsb2NraW5nIGxvZ2ljCiAgICBsZXQgaW5qZWN0ZWRCbG9iVXJsID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgLy8gUHJldmVudCBUd2l0Y2ggZnJvbSByZXZva2luZyBvdXIgaW5qZWN0ZWQgd29ya2VyIGJsb2IgVVJMCiAgICAgICAgaWYgKCFVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkKSB7CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gVVJMLnJldm9rZU9iamVjdFVSTDsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwgPT09IGluamVjdGVkQmxvYlVybCkgcmV0dXJuOwogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMLmNhbGwodGhpcywgdXJsKTsKICAgICAgICAgICAgfSwgJ3Jldm9rZU9iamVjdFVSTCcpOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVpbnNlcnQgPSBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod2luZG93Lldvcmtlcik7CiAgICAgICAgY29uc3QgY2xlYW5Xb3JrZXIgPSBnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIGNsZWFuV29ya2VyIHsKICAgICAgICAgICAgY29uc3RydWN0b3IodHdpdGNoQmxvYlVybCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgbGV0IGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gbmV3IFVSTCh0d2l0Y2hCbG9iVXJsKS5vcmlnaW4uZW5kc1dpdGgoJy50d2l0Y2gudHYnKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghaXNUd2l0Y2hXb3JrZXIpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBOb24tVHdpdGNoIHdvcmtlciBza2lwcGVkOiAnICsgdHdpdGNoQmxvYlVybCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUHJlLWNoZWNrOiB2ZXJpZnkgd2UgY2FuIGZldGNoIHRoZSB3b3JrZXIgSlMgYmVmb3JlIGluamVjdGluZwogICAgICAgICAgICAgICAgbGV0IHByZWZldGNoZWRXb3JrZXJKcyA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgeyBwcmVmZXRjaGVkV29ya2VySnMgPSBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghcHJlZmV0Y2hlZFdvcmtlckpzKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFpbGVkIHRvIGZldGNoIHdvcmtlciBKUyDigJQgZmFsbGluZyBiYWNrIHRvIHVubW9kaWZpZWQgd29ya2VyJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGludGVyY2VwdGVkIOKAlCBpbmplY3RpbmcgYWQtYmxvY2sgaG9va3MnKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ0ZldGNoUmVxdWVzdHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgJHtoYXNBZFRhZ3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldE1hdGNoZWRBZFNpZ25pZmllcnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3N0cmlwQWRTZWdtZW50cy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJvY2Vzc00zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2hvb2tXb3JrZXJGZXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7ZGVjbGFyZU9wdGlvbnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldEFjY2Vzc1Rva2VuLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtncWxSZXF1ZXN0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwYXJzZUF0dHJpYnV0ZXMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFdhc21Xb3JrZXJKcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U2VydmVyVGltZUZyb21NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtyZXBsYWNlU2VydmVyVGltZUluTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJ1bmVTdHJlYW1JbmZvcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Y3JlYXRlU3RyZWFtSW5mby50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IGdldFdhc21Xb3JrZXJKcygnJHt0d2l0Y2hCbG9iVXJsLnJlcGxhY2VBbGwoIiciLCAiJTI3Iil9Jyk7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZU9wdGlvbnMoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCA9IHNldEludGVydmFsKHBydW5lU3RyZWFtSW5mb3MsIDUgKiA2MCAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJHtSZWxvYWRQbGF5ZXJBZnRlckFkfTsKICAgICAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSAke1JlbG9hZENvb2xkb3duU2Vjb25kc307CiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9ICR7RGlzYWJsZVJlbG9hZENhcH07CiAgICAgICAgICAgICAgICAgICAgRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gJHtFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGR9OwogICAgICAgICAgICAgICAgICAgIFBpbkJhY2t1cFBsYXllclR5cGUgPSAke1BpbkJhY2t1cFBsYXllclR5cGV9OwogICAgICAgICAgICAgICAgICAgIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPSAke1ByZWZlckxvd1F1YWxpdHlCYWNrdXB9OwogICAgICAgICAgICAgICAgICAgIEJhY2t1cFN3YXBGaXJzdCA9ICR7QmFja3VwU3dhcEZpcnN0fTsKICAgICAgICAgICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9ICcke0ZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlfSc7CiAgICAgICAgICAgICAgICAgICAgR1FMRGV2aWNlSUQgPSAke0dRTERldmljZUlEID8gIiciICsgR1FMRGV2aWNlSUQgKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uSGVhZGVyID0gJHtBdXRob3JpemF0aW9uSGVhZGVyID8gIiciICsgQXV0aG9yaXphdGlvbkhlYWRlciArICInIiA6IHVuZGVmaW5lZH07CiAgICAgICAgICAgICAgICAgICAgQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gJHtDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAiJyIgKyBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gJHtDbGllbnRWZXJzaW9uID8gIiciICsgQ2xpZW50VmVyc2lvbiArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIENsaWVudFNlc3Npb24gPSAke0NsaWVudFNlc3Npb24gPyAiJyIgKyBDbGllbnRTZXNzaW9uICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50VmVyc2lvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFZlcnNpb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50U2Vzc2lvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFNlc3Npb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50SWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJRCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVEZXZpY2VJZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdGZXRjaFJlc3BvbnNlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXNwb25zZURhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIHRpbWVvdXRJZCB9ID0gcGVuZGluZ0ZldGNoUmVxdWVzdHMuZ2V0KHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHJlc3BvbnNlRGF0YS5lcnJvcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSByZXNwb25zZSBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IHRha2VzIHN0YXR1cy9zdGF0dXNUZXh0L2hlYWRlcnMg4oCUIHVybC9yZWRpcmVjdGVkL3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZS4gSVZTIFdBU00gdmFsaWRhdGVzIHRoZXNlIChTcGFkZS90cmFja2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cykgYW5kIHRocm93cyBOZXR3b3JrRXJyb3IgaWYgdGhleSdyZSBtaXNzaW5nIOKAlCBUVFYtQUIgdjYuMy41IGZpeC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VEYXRhLmJvZHksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VEYXRhLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlRGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VEYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICd1cmwnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudXJsIHx8ICcnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICdyZWRpcmVjdGVkJywgeyB2YWx1ZTogISFyZXNwb25zZURhdGEucmVkaXJlY3RlZCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlRGF0YS50eXBlIHx8ICdiYXNpYycsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVHJpZ2dlcmVkUGxheWVyUmVsb2FkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdTaW11bGF0ZUFkcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRlZEFkc0RlcHRoID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpbXVsYXRlZEFkc0RlcHRoOiAnICsgU2ltdWxhdGVkQWRzRGVwdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyA9ICFBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOiAnICsgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGhvb2tXb3JrZXJGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgIGV2YWwod29ya2VyU3RyaW5nKTsKICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICAgICAgICBpbmplY3RlZEJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuZXdCbG9iU3RyXSkpOwogICAgICAgICAgICAgICAgc3VwZXIoaW5qZWN0ZWRCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUFkQmxvY2tCYW5uZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXIoZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgYmFja3VwIHN0cmVhbSBzd2l0Y2hlcyAoc3RhcnQgYW5kIGVuZCBvZiBhZCBicmVhaykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5oYXNBZHMgIT09ICEhcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QmFja3VwU3dpdGNoQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgcG9zaXRpb24gdHJhY2tpbmcgb24gYWQtZW5kIHNvIHRoZSBzdHJlYW0gc3dpdGNoIGdhcCBpc24ndCBkZXRlY3RlZCBhcyBhIGp1bXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5kYXRhLmhhc0FkcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pbkFkQnJlYWsgPSAhIWUuZGF0YS5oYXNBZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGRyaWZ0IGNhdGNoLXVwIHdoZW4gYWRzIHN0YXJ0IOKAlCBkb24ndCBydW4gMS4xeCBkdXJpbmcgYWQgaGFuZGxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5oYXNBZHMgJiYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsIHx8IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKS5wbGF5YmFja1JhdGUgPSAxLjA7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUGF1c2VSZXN1bWVQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdSZWxvYWRQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgZS5kYXRhLmtpbmQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYXN5bmMgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmtleSA9PSAnRmV0Y2hSZXF1ZXN0JykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFJlcXVlc3QgPSBldmVudC5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCBoYW5kbGVXb3JrZXJGZXRjaFJlcXVlc3QoZmV0Y2hSZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlc3BvbnNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZURhdGEKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBXb3JrZXIgY3Jhc2ggcmVjb3Zlcnkg4oCUIElWUyBXQVNNIHdvcmtlciBjYW4gZmlyZSBSdW50aW1lRXJyb3IKICAgICAgICAgICAgICAgIC8vIChlLmcuICJpbmRleCBvdXQgb2YgYm91bmRzIikgYW5kIGRpZS4gQSBzaW5nbGUgY3Jhc2ggZmlyZXMgbXVsdGlwbGUKICAgICAgICAgICAgICAgIC8vIGVycm9yIGV2ZW50czsgZGVkdXBlIHZpYSBhIGxvY2FsIGZsYWcuIE9uIGZpcnN0IGVycm9yLCB0cmlnZ2VyIGEKICAgICAgICAgICAgICAgIC8vIGhhcmQgcmVsb2FkIHZpYSB0aGUgbWFpbiByZWxvYWQgcGF0aCDigJQgVHdpdGNoIHJlLXNwYXducyB0aGUgd29ya2VyCiAgICAgICAgICAgICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBuZXcgcGxheWVyIGluc3RhbmNlLCBhbmQgZXhpc3RpbmcgcmVsb2FkIGNvb2xkb3duCiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50cyBydW5hd2F5IHJlc3RhcnQgbG9vcHMuCiAgICAgICAgICAgICAgICBsZXQgY3Jhc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyYXNoZWQpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBJVlMgV0FTTSB3b3JrZXIgY3Jhc2hlZDogJyArICgoZSAmJiBlLm1lc3NhZ2UpIHx8ICd1bmtub3duIGVycm9yJykgKyAnIOKAlCB0cmlnZ2VyaW5nIGhhcmQgcmVsb2FkIHRvIHJlY292ZXInKTsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUsICdlYXJseScpOyB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGNyYXNoIHJlY292ZXJ5IGZhaWxlZDogJyArIGVyci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbGV0IHdvcmtlckluc3RhbmNlID0gcmVpbnNlcnRXb3JrZXJzKG5ld1dvcmtlciwgcmVpbnNlcnQpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdXb3JrZXInLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VySW5zdGFuY2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkV29ya2VyKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdvcmtlckluc3RhbmNlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIHNldCB0d2l0Y2ggd29ya2VyIGRlbmllZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCkgewogICAgICAgIGlmICghZ2V0V2FzbVdvcmtlckpzLmNhY2hlKSB7CiAgICAgICAgICAgIGdldFdhc21Xb3JrZXJKcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0pIHsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc21Xb3JrZXJKcy5jYWNoZVt0d2l0Y2hCbG9iVXJsXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICBjb25zdCB0ZXh0ID0gcmVxLnJlc3BvbnNlVGV4dDsKICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0gPSB0ZXh0OwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgLy8gSG9vayBmZXRjaCgpIGluIHRoZSB3b3JrZXIgc2NvcGUgdG8gaW50ZXJjZXB0IG0zdTggcGxheWxpc3QgcmVxdWVzdHMgYW5kIGFkIHNlZ21lbnRzCiAgICBmdW5jdGlvbiBob29rV29ya2VyRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2hvb2tXb3JrZXJGZXRjaCAodmFmdCknKTsKICAgICAgICBjb25zdCBCTEFOS19NUDQgPSBuZXcgQmxvYihbVWludDhBcnJheS5mcm9tKGF0b2IoJ0FBQUFLR1owZVhCdGNEUXlBQUFBQVdsemIyMXRjRFF5WkdGemFHRjJZekZwYzI4MmFHeHpaZ0FBQkVsdGIyOTJBQUFBYkcxMmFHUUFBQUFBQUFBQUFBQUFBQUFBQVlhZ0FBQUFBQUFCQUFBQkFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUFCcUhSeVlXc0FBQUJjZEd0b1pBQUFBQU1BQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQVVSdFpHbGhBQUFBSUcxa2FHUUFBQUFBQUFBQUFBQUFBQUFBQUx1QUFBQUFBRlhFQUFBQUFBQXRhR1JzY2dBQUFBQUFBQUFBYzI5MWJnQUFBQUFBQUFBQUFBQUFBRk52ZFc1a1NHRnVaR3hsY2dBQUFBRHZiV2x1WmdBQUFCQnpiV2hrQUFBQUFBQUFBQUFBQUFBa1pHbHVaZ0FBQUJ4a2NtVm1BQUFBQUFBQUFBRUFBQUFNZFhKc0lBQUFBQUVBQUFDemMzUmliQUFBQUdkemRITmtBQUFBQUFBQUFBRUFBQUJYYlhBMFlRQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFnQVFBQUFBQUx1QUFBQUFBQUF6WlhOa2N3QUFBQUFEZ0lDQUlnQUJBQVNBZ0lBVVFCVUFBQUFBQUFBQUFBQUFBQVdBZ0lBQ0VaQUdnSUNBQVFJQUFBQVFjM1IwY3dBQUFBQUFBQUFBQUFBQUVITjBjMk1BQUFBQUFBQUFBQUFBQUJSemRITjZBQUFBQUFBQUFBQUFBQUFBQUFBQUVITjBZMjhBQUFBQUFBQUFBQUFBQWVWMGNtRnJBQUFBWEhScmFHUUFBQUFEQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQW9BQUFBRm9BQUFBQUFHQmJXUnBZUUFBQUNCdFpHaGtBQUFBQUFBQUFBQUFBQUFBQUE5Q1FBQUFBQUJWeEFBQUFBQUFMV2hrYkhJQUFBQUFBQUFBQUhacFpHVUFBQUFBQUFBQUFBQUFBQUJXYVdSbGIwaGhibVJzWlhJQUFBQUJMRzFwYm1ZQUFBQVVkbTFvWkFBQUFBRUFBQUFBQUFBQUFBQUFBQ1JrYVc1bUFBQUFIR1J5WldZQUFBQUFBQUFBQVFBQUFBeDFjbXdnQUFBQUFRQUFBT3h6ZEdKc0FBQUFvSE4wYzJRQUFBQUFBQUFBQVFBQUFKQmhkbU14QUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0FCYUFCSUFBQUFTQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdQLy9BQUFBT21GMlkwTUJUVUFlLytFQUkyZE5RQjZXVW9GQVgvTGdMVUJBUUZBQUFENkFBQTZtRGdBQUhvUUFBOUNXN3k0S0FRQUVhT3VQSUFBQUFCQnpkSFJ6QUFBQUFBQUFBQUFBQUFBUWMzUnpZd0FBQUFBQUFBQUFBQUFBRkhOMGMzb0FBQUFBQUFBQUFBQUFBQUFBQUFBUWMzUmpid0FBQUFBQUFBQUFBQUFBU0cxMlpYZ0FBQUFnZEhKbGVBQUFBQUFBQUFBQkFBQUFBUUFBQUM0QUFBQUFBb0FBQUFBQUFDQjBjbVY0QUFBQUFBQUFBQUlBQUFBQkFBQ0NOUUFBQUFBQ1FBQUEnKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpXSwge3R5cGU6ICd2aWRlby9tcDQnfSk7CiAgICAgICAgY29uc3QgcmVhbEZldGNoID0gZmV0Y2g7CiAgICAgICAgZmV0Y2ggPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuaGFzKHVybCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEJMQU5LX01QNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgnbTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSBhc3luYyBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYXdhaXQgcHJvY2Vzc00zVTgodXJsLCBhd2FpdCByZXNwb25zZS50ZXh0KCksIHJlYWxGZXRjaCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcnNlZFVybC5wYXRobmFtZS5tYXRjaCgvKFteXC9dKykoPz1cLlx3KyQpLyk/LlswXTsKICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ3BhcmVudF9kb21haW5zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlZFVybC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyVGltZSA9IGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCAhPSBudWxsICYmIChhd2FpdCByZWFsRmV0Y2goc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Lm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF0pKS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGVuY29kaW5ncyBhcmUgZGVhZCAodGhlIHN0cmVhbSBwcm9iYWJseSByZXN0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHJlbG9hZC1wZW5kaW5nIGZsYWcgZnJvbSBhIHByaW9yIHN0cmVhbSBzZXNzaW9uIOKAlCB3aXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVsb2FkIHRyaWdnZXJlZCBvbiB0aGUgcHJldmlvdXMgY2hhbm5lbCBibGVlZHMgaW50byB0aGUgbmV3IGNoYW5uZWwncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29sZG93biBjYWxjdWxhdGlvbiwgYmxvY2tpbmcgbGVnaXRpbWF0ZSBlbmQtb2YtYnJlYWsgcmVsb2Fkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5ldyBzdHJlYW0gc2Vzc2lvbiDigJQgY2hhbm5lbDogJyArIGNoYW5uZWxOYW1lICsgJywgQVBJOiAnICsgKFYyQVBJID8gJ3YyJyA6ICd2MScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdID0gc3RyZWFtSW5mbyA9IGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHBhcnNlZFVybC5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBsaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmF0ZTogYXR0cmlidXRlc1snRlJBTUUtUkFURSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNzOiBhdHRyaWJ1dGVzWydDT0RFQ1MnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVybDogbGluZXNbaSArIDFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJsc1tsaW5lc1tpICsgMV1dID0gcmVzb2x1dGlvbkluZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QucHVzaChyZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zQnlVcmxbbGluZXNbaSArIDFdXSA9IHN0cmVhbUluZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBObyByZXNvbHV0aW9ucyBwYXJzZWQgZnJvbSBlbmNvZGluZ3MgbTN1OCDigJQgVHdpdGNoIG1heSBoYXZlIGNoYW5nZWQgdGhlIGZvcm1hdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vbkhldmNSZXNvbHV0aW9uTGlzdCA9IHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QuZmlsdGVyKChlbGVtZW50KSA9PiBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdhdmMnKSB8fCBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdhdjAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHdheXNSZWxvYWRQbGF5ZXJPbkFkIHx8IChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCAmJiBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LnNvbWUoKGVsZW1lbnQpID0+IGVsZW1lbnQuQ29kZWNzLnN0YXJ0c1dpdGgoJ2hldicpIHx8IGVsZW1lbnQuQ29kZWNzLnN0YXJ0c1dpdGgoJ2h2YycpKSAmJiAhU2tpcFBsYXllclJlbG9hZE9uSGV2YykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXS5zdWJzdHJpbmcobGluZXNbaV0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkUmVzb2x1dGlvbiA9IHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gb2xkUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEFyZWEgPSB0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UmVzb2x1dGlvbkluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZXN0RGlmZiA9IEluZmluaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vbkhldmNSZXNvbHV0aW9uTGlzdFtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3N0cmVhbVdpZHRoLCBzdHJlYW1IZWlnaHRdID0gY2FuZGlkYXRlLlJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKChzdHJlYW1XaWR0aCAqIHN0cmVhbUhlaWdodCkgLSB0YXJnZXRBcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpZmYgPSBkaWZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVzb2x1dGlvbkluZm8gPSBjYW5kaWRhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZGlmaWVkTTNVOCBzd2FwICcgKyByZXNTZXR0aW5nc1tjb2RlY3NLZXldICsgJyB0byAnICsgbmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzICsgJyBvbGRSZXM6JyArIG9sZFJlc29sdXRpb24gKyAnIG5ld1JlczonICsgbmV3UmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzfSJgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpICsgMV0gPSBuZXdSZXNvbHV0aW9uSW5mby5VcmwgKyAnICcucmVwZWF0KGkgKyAxKTsvLyBUaGUgc3RyZWFtIGRvZXNuJ3QgbG9hZCB1bmxlc3MgZWFjaCB1cmwgbGluZSBpcyB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCB8fCBBbHdheXNSZWxvYWRQbGF5ZXJPbkFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggPSBsaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZG8gTk9UIHNldCBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgaGVyZS4gSXQgd2FzIHByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdW5jb25kaXRpb25hbGx5IG9uIG5ldyBzdHJlYW0gc2Vzc2lvbiBjcmVhdGlvbiwgd2hpY2ggY2F1c2VkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVuZC1vZi1icmVhayByZWxvYWQgb2YgZXZlcnkgbmV3IGNoYW5uZWwgdG8gYmUgYmxvY2tlZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb2xkb3duIOKAlCB0aGUgY29vbGRvd24gY2hlY2sgdHJlYXRlZCB0aGUgc2Vzc2lvbi1jcmVhdGlvbiB0aW1lc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHJlY2VudCByZWxvYWQsIGV2ZW4gdGhvdWdoIG5vIHJlbG9hZCBoYWQgYWN0dWFsbHkgb2NjdXJyZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID8gc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggOiBzdHJlYW1JbmZvLkVuY29kaW5nc00zVTgsIHNlcnZlclRpbWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXIocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC8jRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKFteIl0rKSIvKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAxID8gbWF0Y2hlc1sxXSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC9TRVJWRVItVElNRT0iKFswLTkuXSspIi8pOwogICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gcmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoZW5jb2RpbmdzTTN1OCwgbmV3U2VydmVyVGltZSkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKCNFWFQtWC1TRVNTSU9OLURBVEE6REFUQS1JRD0iU0VSVkVSLVRJTUUiLFZBTFVFPSIpW14iXSsoIikvLCBgJDEke25ld1NlcnZlclRpbWV9JDJgKSA6IGVuY29kaW5nc00zdTg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTZXJ2ZXJUaW1lID8gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKC8oU0VSVkVSLVRJTUU9IilbMC05Ll0rIi8sIGBTRVJWRVItVElNRT0iJHtuZXdTZXJ2ZXJUaW1lfSJgKSA6IGVuY29kaW5nc00zdTg7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBZFNpZ25pZmllcnMuc29tZSgocykgPT4gdGV4dFN0ci5pbmNsdWRlcyhzKSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpIHsKICAgICAgICByZXR1cm4gQWRTaWduaWZpZXJzLmZpbHRlcigocykgPT4gdGV4dFN0ci5pbmNsdWRlcyhzKSk7CiAgICB9CiAgICAvLyBSZW1vdmUgYWQgc2VnbWVudHMgZnJvbSBhbiBtM3U4IHBsYXlsaXN0IGFuZCBjYWNoZSB0aGVpciBVUkxzIGZvciByZXBsYWNlbWVudAogICAgZnVuY3Rpb24gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIHN0cmlwQWxsU2VnbWVudHMsIHN0cmVhbUluZm8pIHsKICAgICAgICBsZXQgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgbGV0IGluQ3VlT3V0ID0gZmFsc2U7CiAgICAgICAgY29uc3QgbGl2ZVNlZ21lbnRzID0gW107CiAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgIGNvbnN0IG5ld0FkVXJsID0gJ2h0dHBzOi8vdHdpdGNoLnR2JzsKICAgICAgICAvLyBMb2cgYWQgdHJhY2tpbmcgYXR0cmlidXRlIG5hbWVzIG9uY2UgcGVyIHN0cmVhbSAoaGVscHMgaWRlbnRpZnkgbmV3IGJlYWNvbnMpCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcykgewogICAgICAgICAgICBjb25zdCBhZEF0dHJzID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQURbQS1aLV0qKD89PSIpL2cpOwogICAgICAgICAgICBpZiAoYWRBdHRycyAmJiBhZEF0dHJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkQWRBdHRyaWJ1dGVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHRyYWNraW5nIGF0dHJpYnV0ZXMgc2VlbjogJyArIFsuLi5uZXcgU2V0KGFkQXR0cnMpXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2cgcG90ZW50aWFsIGFkIG1hcmtlcnMgdGhhdCBhcmVuJ3QgaW4gQWRTaWduaWZpZXJzIChjYW5kaWRhdGVzIGZvciBmdXR1cmUgaW5jbHVzaW9uKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycykgewogICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gbmV3IFNldCgpOwogICAgICAgICAgICBsZXQgc207CiAgICAgICAgICAgIGNvbnN0IGNsYXNzUmUgPSAvRVhULVgtREFURVJBTkdFOlteXG5dKkNMQVNTPSIodHdpdGNoLVteIl0rKSIvZzsKICAgICAgICAgICAgd2hpbGUgKChzbSA9IGNsYXNzUmUuZXhlYyh0ZXh0U3RyKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKCdFWFQtWC1EQVRFUkFOR0U6Q0xBU1M9IicgKyBzbVsxXSArICciJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdGFnUmUgPSAvKFNDVEUzNS1bQS1aLV0rfEVYVC1YLUNVRS1bQS1aLV0rKS9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gdGFnUmUuZXhlYyh0ZXh0U3RyKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKHNtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTdWJzdHJpbmcgY2hlY2sgKG5vdCBleGFjdCk6IGEgY2FuZGlkYXRlIGlzICJrbm93biIgaWYgYW55IEFkU2lnbmlmaWVyCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4gIUFkU2lnbmlmaWVycy5zb21lKHMgPT4gYy5pbmNsdWRlcyhzKSkpOwogICAgICAgICAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBvdGVudGlhbCBhZCBtYXJrZXJzIHNlZW4gYnV0IG5vdCBpbiBBZFNpZ25pZmllcnM6ICcgKyB1bmtub3duLmpvaW4oJywgJykgKyAnIChjYW5kaWRhdGVzIGZvciBmdXR1cmUgaW5jbHVzaW9uKScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgLy8gVHJhY2sgU0NURS0zNSBDVUUtT1VUL0NVRS1JTiBhZCBib3VuZGFyaWVzCiAgICAgICAgICAgIGlmIChsaW5lLmluY2x1ZGVzKCdFWFQtWC1DVUUtT1VUJykpIHsKICAgICAgICAgICAgICAgIGlmICghaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1PVVQg4oCUIGFkIGJvdW5kYXJ5IGVudGVyZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluQ3VlT3V0ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCdFWFQtWC1DVUUtSU4nKSkgewogICAgICAgICAgICAgICAgaWYgKGluQ3VlT3V0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU0NURS0zNSBDVUUtSU4g4oCUIGFkIGJvdW5kYXJ5IGV4aXRlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZW1vdmUgdHJhY2tpbmcgdXJscyB3aGljaCBhcHBlYXIgaW4gdGhlIG92ZXJsYXkgVUkKICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lLnJlcGxhY2VBbGwoVHdpdGNoQWRVcmxSZXdyaXRlUmVnZXgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgY29uc3QgaXNMaXZlU2VnbWVudCA9IGxpbmUuaW5jbHVkZXMoJyxsaXZlJyk7CiAgICAgICAgICAgIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAoIWlzTGl2ZVNlZ21lbnQgfHwgc3RyaXBBbGxTZWdtZW50cyB8fCBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgfHwgaW5DdWVPdXQpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50VXJsID0gbGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgaWYgKCFBZFNlZ21lbnRDYWNoZS5oYXMoc2VnbWVudFVybCkpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KHNlZ21lbnRVcmwsIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBBZFNlZ21lbnRVUkxQYXR0ZXJucy5zb21lKChwKSA9PiBsaW5lc1tpICsgMV0uaW5jbHVkZXMocCkpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBzZWdtZW50IGRldGVjdGVkIHZpYSBVUkwgcGF0dGVybjogJyArIGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQobGluZXNbaSArIDFdLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cysrOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIGlzTGl2ZVNlZ21lbnQpIHsKICAgICAgICAgICAgICAgIGxpdmVTZWdtZW50cy5wdXNoKHsgZXh0aW5mOiBsaW5lLCB1cmw6IGxpbmVzW2kgKyAxXSB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFQtWC1QQVJUOicpKSB7CiAgICAgICAgICAgICAgICAvLyBMTC1ITFMgcGFydDogVVJJIGlzIGlubGluZSBhcyBhbiBhdHRyaWJ1dGUuIFN0cmlwIGlmIGl0IG1hdGNoZXMgYSBrbm93bgogICAgICAgICAgICAgICAgLy8gYWQgVVJMIChhbHJlYWR5IGluIGNhY2hlIGZyb20gYSBwYXJhbGxlbCBFWFRJTkYgc3RyaXAsIG9yIG1hdGNoZXMgYSBVUkwgcGF0dGVybikuCiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIHRoZSBwbGF5ZXIgbWF5IHVzZSB0aGUgcGFydHMgcGF0aCB0byBmZXRjaCBhZCBtZWRpYSB2aWEgbG93LWxhdGVuY3kuCiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpTWF0Y2ggPSBsaW5lLm1hdGNoKFVyaUF0dHJpYnV0ZVJlZ2V4KTsKICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmkgPSBwYXJ0VXJpTWF0Y2ggPyBwYXJ0VXJpTWF0Y2hbMV0gOiAnJzsKICAgICAgICAgICAgICAgIGlmIChwYXJ0VXJpICYmIChBZFNlZ21lbnRDYWNoZS5oYXMocGFydFVyaSkgfHwgQWRTZWdtZW50VVJMUGF0dGVybnMuc29tZSgocCkgPT4gcGFydFVyaS5pbmNsdWRlcyhwKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KHBhcnRVcmksIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6JykgfHwgbGluZS5zdGFydHNXaXRoKCcjRVhULVgtUFJFTE9BRC1ISU5UOicpKSB7CiAgICAgICAgICAgICAgICAvLyBMTC1ITFMgcHJlZmV0Y2gvcHJlbG9hZCBoaW50cyBjYW4gcG9pbnQgYXQgdXBjb21pbmcgYWQgc2VnbWVudHMgYmVmb3JlIGFueQogICAgICAgICAgICAgICAgLy8gRVhUSU5GIGxpbmUgb3IgYWQgc2lnbmlmaWVyIGhhcyBtYXRlcmlhbGl6ZWQgaW4gdGhlIHBsYXlsaXN0LiBJZiB3ZSBvbmx5CiAgICAgICAgICAgICAgICAvLyBzdHJpcCBwcmVmZXRjaCBoaW50cyBBRlRFUiBoYXNTdHJpcHBlZEFkU2VnbWVudHMgaXMgc2V0LCB0aGUgZmlyc3QgcG9sbCBvZgogICAgICAgICAgICAgICAgLy8gYW4gYWQgYnJlYWsgY2FuIGxlYWsgYSBwcmVmZXRjaCBoaW50IHBvaW50aW5nIGF0IGFuIGFkIFVSTCDigJQgdGhlIHBsYXllcgogICAgICAgICAgICAgICAgLy8gdGhlbiBwcmUtZmV0Y2hlcyBhZCBtZWRpYSB2aWEgdGhlIExMLUhMUyBwYXRoIGJlZm9yZSBvdXIgdXN1YWwgc3RyaXAgY2F0Y2hlcwogICAgICAgICAgICAgICAgLy8gdXAsIHByb2R1Y2luZyBhbiBhZCBmbGFzaC4gRGV0ZWN0IHRoZSBhZCBVUkwgaGVyZSBzbyBoYXNTdHJpcHBlZEFkU2VnbWVudHMKICAgICAgICAgICAgICAgIC8vIGZsaXBzIG9uIHRoZSBmaXJzdCBwb2xsIGFuZCB0aGUgcG9zdC1sb29wIHVuY29uZGl0aW9uYWwgcHJlZmV0Y2ggc3RyaXAgZmlyZXMuCiAgICAgICAgICAgICAgICAvLyBQb3J0ZWQgZnJvbSBUVFYtQUIgNTJiNDFiNC4KICAgICAgICAgICAgICAgIC8vIEZvcm1hdDogJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6aHR0cHM6Ly91cmwvaGVyZS50cycgKHJhdyBVUkwgYWZ0ZXIgdGhlIGNvbG9uKQogICAgICAgICAgICAgICAgLy8gICAgIG9yOiAnI0VYVC1YLVBSRUxPQUQtSElOVDpUWVBFPVBBUlQsVVJJPSJ1cmwiJyAoVVJJIGF0dHJpYnV0ZSkKICAgICAgICAgICAgICAgIGxldCBoaW50VXJsID0gJyc7CiAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpKSB7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGxpbmUuc3Vic3RyaW5nKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicubGVuZ3RoKS50cmltKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpbnRNYXRjaCA9IGxpbmUubWF0Y2goL1VSST0iKFteIl0rKSIvKTsKICAgICAgICAgICAgICAgICAgICBoaW50VXJsID0gaGludE1hdGNoID8gaGludE1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGludFVybCAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKGhpbnRVcmwpIHx8IEFkU2VnbWVudFVSTFBhdHRlcm5zLnNvbWUoKHApID0+IGhpbnRVcmwuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChoaW50VXJsLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIE1vdmVkIG91dCBvZiB0aGUgcGVyLWxpbmUgbG9vcDogYSBwZXItbGluZSBzY2FuIGZvciBhbnkgc2lnbmlmaWVyIGlzCiAgICAgICAgLy8gc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgZnVsbC10ZXh0IHNjYW4sIHNpbmNlIHRoZSBjaGVjayBoYXMKICAgICAgICAvLyBubyBsaW5lLWxldmVsIHN0YXRlIOKAlCBpdCBqdXN0IGZsaXBzIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWUgb24gZmlyc3QKICAgICAgICAvLyBtYXRjaC4gT25lIHNjYW4gaW5zdGVhZCBvZiBOX2xpbmVzICogTl9zaWduaWZpZXJzIHNjYW5zICh+MTAweCBmZXdlcgogICAgICAgIC8vIGluY2x1ZGVzKCkgY2FsbHMgb24gYSB0eXBpY2FsIDEwMC1saW5lIG0zdTgpLgogICAgICAgIGlmICghaGFzU3RyaXBwZWRBZFNlZ21lbnRzICYmIEFkU2lnbmlmaWVycy5zb21lKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKSkgewogICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoaGFzU3RyaXBwZWRBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIE5vIGxvdyBsYXRlbmN5IGR1cmluZyBhZHMgKG90aGVyd2lzZSBpdCdzIHBvc3NpYmxlIGZvciB0aGUgcGxheWVyIHRvIHByZWZldGNoIGFuZCBkaXNwbGF5IGFkIHNlZ21lbnRzKQogICAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6JykgfHwgbGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9IDA7CiAgICAgICAgfQogICAgICAgIC8vIENhY2hlIGxpdmUgc2VnbWVudHMgZm9yIHJlY292ZXJ5IChwbHVzIHRoZSBNRURJQS1TRVFVRU5DRSBvZiB0aGUgb2xkZXN0IGNhY2hlZCBzZWdtZW50LAogICAgICAgIC8vIHNvIHRoZSBwbGF5ZXIgYWNjZXB0cyBpbmplY3RlZCByZWNvdmVyeSBzZWdtZW50cyBhcyB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtKQogICAgICAgIGlmIChsaXZlU2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMgPSBsaXZlU2VnbWVudHMuc2xpY2UoLTYpOwogICAgICAgICAgICBjb25zdCBzZXEgPSBwYXJzZUludCgodGV4dFN0ci5tYXRjaCgvI0VYVC1YLU1FRElBLVNFUVVFTkNFOihcZCspLykgfHwgW10pWzFdKTsKICAgICAgICAgICAgaWYgKCFpc05hTihzZXEpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXEgPSBzZXEgKyBNYXRoLm1heCgwLCBsaXZlU2VnbWVudHMubGVuZ3RoIC0gc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSWYgYWxsIHNlZ21lbnRzIHdlcmUgc3RyaXBwZWQsIHRyeSB0byBwcmV2ZW50IGJsYWNrIHNjcmVlbiB2aWEgcmVjb3ZlcnkgY29udGVudC4KICAgICAgICAvLyBQcmVmZXIgdGhlIGZ1bGwtcGxheWxpc3Qgc25hcHNob3QgZnJvbSBhIHJlY2VudCBub24tYWQgcG9sbCAobWlycm9ycyBUVFYtQUIKICAgICAgICAvLyBMYXN0Q2xlYW5OYXRpdmVNM1U4IGFwcHJvYWNoKSDigJQgZ2l2ZXMgdGhlIHBsYXllciA0LTYgbGl2ZSBzZWdtZW50cyB3b3J0aCBvZgogICAgICAgIC8vIGNvbnRlbnQgdnMgdGhlIHRoaW4gcGVyLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUuIEZhbGxzIGJhY2sgdG8gdGhlIHBlci1zZWdtZW50CiAgICAgICAgLy8gY2FjaGUgaWYgdGhlIHNuYXBzaG90IGlzIHN0YWxlIG9yIG1pc3NpbmcuCiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApICsgMTsKICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgKyAxOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0KSBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIC8vIFByaW1hcnk6IGZyZXNoIGZ1bGwtcGxheWxpc3Qgc25hcHNob3QgKDwgMS41cyBvbGQsIG11c3Qgbm90IGl0c2VsZiBjb250YWluIGFkIG1hcmtlcnMpCiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90QWdlID0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0ID8gKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQpIDogSW5maW5pdHk7CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggJiYgc25hcHNob3RBZ2UgPD0gMTUwMCAmJiAhaGFzQWRUYWdzKHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcmV1c2luZyBsYXN0IGNsZWFuIG5hdGl2ZSBwbGF5bGlzdCAoJyArIHNuYXBzaG90QWdlICsgJ21zIG9sZCknKTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gaGFzU3RyaXBwZWRBZFNlZ21lbnRzOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVODsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGYWxsYmFjazogcGVyLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUgKGV4aXN0aW5nIGJlaGF2aW9yKQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzICYmIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJlc3RvcmluZyAnICsgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCArICcgcmVjb3Zlcnkgc2VnbWVudHMnKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXEgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbal0gPSAnI0VYVC1YLU1FRElBLVNFUVVFTkNFOicgKyBzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0uZXh0aW5mKTsKICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50c1tqXS51cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChsaXZlU2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAvLyBSZXNldCBmcmVlemUgY291bnRlciB3aGVuIGxpdmUgc2VnbWVudHMgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gaGFzU3RyaXBwZWRBZFNlZ21lbnRzOwogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgLy8gVGhyb3R0bGUgY2FjaGUgcHJ1bmUgdG8gb25jZSBwZXIgNjBzLiBUaGUgMTIwcyBUVEwgZ2l2ZXMgcGxlbnR5IG9mIGhlYWRyb29tCiAgICAgICAgLy8gYW5kIHNjYW5uaW5nIHRoZSBmdWxsIGNhY2hlIG9uIGV2ZXJ5IG0zdTggcG9sbCBhZGRzIHVwIGR1cmluZyBoZWF2eSBhZCBicmVhawogICAgICAgIC8vIHNlcXVlbmNlcyAoTEwtSExTIGNhbiBwb2xsIG11bHRpcGxlIHRpbWVzIHBlciBzZWNvbmQpLiBQb3J0ZWQgZnJvbSBUVFYtQUIuCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCB8fCBub3cgLSBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA+IDYwMDAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0ID0gbm93OwogICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5LCBtYXApID0+IHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IG5vdyAtIDEyMDAwMCkgewogICAgICAgICAgICAgICAgICAgIG1hcC5kZWxldGUoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIERpYWdub3N0aWM6IGxvZyBvbmNlIHBlciBzdHJlYW1JbmZvIHdoZW4gdGhlIGNhY2hlIGNyb3NzZXMgMTAwMCBlbnRyaWVzLAogICAgICAgICAgICAvLyBzbyBjYWNoZSBibG9hdCBmcm9tIGEgZnV0dXJlIFRUTC9wcnVuZSBidWcgd291bGQgc3VyZmFjZSBpbiB1c2VyIHJlcG9ydHMKICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBzdGF5aW5nIGludmlzaWJsZS4KICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLnNpemUgPiAxMDAwICYmICFzdHJlYW1JbmZvLkxvZ2dlZEFkQ2FjaGVTaXplMWspIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxayA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZFNlZ21lbnRDYWNoZSBjcm9zc2VkIDEwMDAgZW50cmllcyAobm93ICcgKyBBZFNlZ21lbnRDYWNoZS5zaXplICsgJykg4oCUIHBvc3NpYmxlIGNhY2hlIGJsb2F0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xuJyk7CiAgICB9CiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG1hdGNoaW5nIHN0cmVhbSBVUkwgZm9yIGEgZ2l2ZW4gcmVzb2x1dGlvbiBmcm9tIGEgbWFzdGVyIG0zdTgKICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBjb25zdCBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgIGxldCBtYXRjaGVkUmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IG1hdGNoZWRGcmFtZVJhdGUgPSBmYWxzZTsKICAgICAgICBsZXQgY2xvc2VzdFJlc29sdXRpb25VcmwgPSBudWxsOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBJbmZpbml0eTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kaW5nc0xpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICAvLyBBY2NlcHQgdjIgQVBJIHZhcmlhbnQgVVJMcyB3aGljaCBhcmUgcmF3IENETiBVUkxzIHdpdGhvdXQgJy5tM3U4JyBpbiB0aGUgcGF0aC4KICAgICAgICAgICAgLy8gdjEgQVBJOiBuZXh0IGxpbmUgaXMgJy4uLmluZGV4LTxyZXNvbHV0aW9uPi5tM3U4Py4uLicKICAgICAgICAgICAgLy8gdjIgQVBJOiBuZXh0IGxpbmUgaXMgYSByYXcgQ0ROIFVSTCBsaWtlICdodHRwczovL3ZpZGVvLWVkZ2UtLi4ubmV0L3YxLy4uLi9jaHVua2VkLy4uLicKICAgICAgICAgICAgLy8gd2l0aG91dCAnLm0zdTgnLiBNYXRjaGluZyBvbmx5IG9uICcubTN1OCcgd291bGQgc2tpcCB2MiB2YXJpYW50cyBlbnRpcmVseSwKICAgICAgICAgICAgLy8gY2F1c2luZyBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uIHRvIHJldHVybiBudWxsIGFuZCBiYWNrdXAgc2VsZWN0aW9uIHRvIGZhaWwuCiAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lID0gZW5jb2RpbmdzTGluZXNbaSArIDFdPy50cmltKCk7CiAgICAgICAgICAgIGlmIChlbmNvZGluZ3NMaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpICYmIG5leHRMaW5lICYmICFuZXh0TGluZS5zdGFydHNXaXRoKCcjJykgJiYgKG5leHRMaW5lLmluY2x1ZGVzKCcubTN1OCcpIHx8IG5leHRMaW5lLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoZW5jb2RpbmdzTGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbiAmJiAoIW1hdGNoZWRSZXNvbHV0aW9uVXJsIHx8ICghbWF0Y2hlZEZyYW1lUmF0ZSAmJiBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlc29sdXRpb25VcmwgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGcmFtZVJhdGUgPSBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25Vcmw7CiAgICB9CiAgICAvLyBDb3JlIGFkLWJsb2NraW5nIGxvZ2ljOiBkZXRlY3QgYWRzIGluIG0zdTgsIGZldGNoIGJhY2t1cCBzdHJlYW1zLCBzdHJpcCBhZCBzZWdtZW50cwogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBpZiAoSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkKSB7CiAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgdW5rbm93bkFkVGFncyA9IHRleHRTdHIubWF0Y2goLyNFWFRbXjpcbl0qKD86YWR8Y3VlfHNjdGV8c3BvbnNvcilbXjpcbl0qL2dpKTsKICAgICAgICAgICAgaWYgKHVua25vd25BZFRhZ3MpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSB1bmtub3duQWRUYWdzLmZpbHRlcih0ID0+ICFBZFNpZ25pZmllcnMuc29tZShzID0+IHQuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVbmtub3duIGFkLXJlbGF0ZWQgdGFncyBmb3VuZDogJyArIFsuLi5uZXcgU2V0KHVua25vd24pXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBoYXZlQWRUYWdzID0gaGFzQWRUYWdzKHRleHRTdHIpIHx8IFNpbXVsYXRlZEFkc0RlcHRoID4gMDsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB0byBjaGV3IG9uIHZzIHRoZSAxLTIgY2FjaGVkIGluZGl2aWR1YWwgc2VnbWVudHMuCiAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgc3JjL21vZHVsZXMvcHJvY2Vzc29yLnRzOjczMy03MzYuCiAgICAgICAgaWYgKCFoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzU2hvd2luZ0FkICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoaGF2ZUFkVGFncykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNaWRyb2xsID0gdGV4dFN0ci5pbmNsdWRlcygnIk1JRFJPTEwiJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnIm1pZHJvbGwiJyk7CiAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkQnJlYWtTdGFydGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgY29uc3QgcG9kTGVuZ3RoTWF0Y2ggPSB0ZXh0U3RyLm1hdGNoKC9YLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIPSIoXGQrKSIvKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aCA9IHBvZExlbmd0aE1hdGNoID8gcGFyc2VJbnQocG9kTGVuZ3RoTWF0Y2hbMV0sIDEwKSA6IDE7CiAgICAgICAgICAgICAgICAvLyBSZXNldCBlYXJseS1yZWxvYWQgc3RhdGUgZm9yIG5ldyBhZCBicmVhazsgYWxsb3cgdXAgdG8gb25lIGVhcmx5IHJlbG9hZCBwZXIgYWQgaW4gcG9kCiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBvZExlbmd0aCA9IHBvZExlbmd0aDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gMDsKICAgICAgICAgICAgICAgIC8vIFRyYWNrIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzIHRvIGRpc3Rpbmd1aXNoIHJlYWwgYWRzIGZyb20gZmFsc2UtcG9zaXRpdmUgc2lnbmlmaWVyIG1hdGNoZXMKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycyA9IHRleHRTdHIuaW5jbHVkZXMoJ1gtVFYtVFdJVENILUFELUFELVNFU1NJT04tSUQnKSB8fCB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1SQURTLVRPS0VOJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkN5Y2xlUmVzY3VlZFRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSA9IG51bGw7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNzYWlPbmx5VGhpc0JyZWFrID0gZmFsc2U7Ly8gUmVzZXQgc3RpY2t5IENTQUkgZmxhZyBmb3IgbmV3IGJyZWFrCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBkZXRlY3RlZCDigJQgdHlwZTogJyArIChzdHJlYW1JbmZvLklzTWlkcm9sbCA/ICdtaWRyb2xsJyA6ICdwcmVyb2xsJykgKyAnLCBjaGFubmVsOiAnICsgc3RyZWFtSW5mby5DaGFubmVsTmFtZSArICcsIHBvZDogJyArIHBvZExlbmd0aCArICcgYWQocykgKH4nICsgKHBvZExlbmd0aCAqIDMwKSArICdzIGV4cGVjdGVkKSwgc2lnbmlmaWVyczogJyArIGdldE1hdGNoZWRBZFNpZ25pZmllcnModGV4dFN0cikuam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnVXBkYXRlQWRCbG9ja0Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLklzTWlkcm9sbCkgewogICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKCcsbGl2ZScpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXF1ZXN0IG9uZSAudHMgZmlsZSBwZXIgLm0zdTggcmVxdWVzdCB0byBhdm9pZCBtYWtpbmcgdG9vIG1hbnkgcmVxdWVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0ZldGNoIGFkIC50cyBmaWxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5hZGQobGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoKGxpbmVzW2kgKyAxXSkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJsb2IoKSkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY3VycmVudFJlc29sdXRpb24gPSBzdHJlYW1JbmZvLlVybHNbdXJsXTsKICAgICAgICAgICAgaWYgKCFjdXJyZW50UmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkcyB3aWxsIGxlYWsgZHVlIHRvIG1pc3NpbmcgcmVzb2x1dGlvbiBpbmZvIGZvciAnICsgdXJsKTsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgZmFsc2UsIHN0cmVhbUluZm8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGlzSGV2YyA9IGN1cnJlbnRSZXNvbHV0aW9uLkNvZGVjcy5zdGFydHNXaXRoKCdoZXYnKSB8fCBjdXJyZW50UmVzb2x1dGlvbi5Db2RlY3Muc3RhcnRzV2l0aCgnaHZjJyk7CiAgICAgICAgICAgIGlmICgoKGlzSGV2YyAmJiAhU2tpcFBsYXllclJlbG9hZE9uSGV2YykgfHwgQWx3YXlzUmVsb2FkUGxheWVyT25BZCkgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggJiYgIXN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnUmVsb2FkUGxheWVyJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3RpY2t5IENTQUkgZmFzdCBwYXRoOiBpZiBhIHByaW9yIHBvbGwgaW4gVEhJUyBicmVhayBhbHJlYWR5IGNvbmZpcm1lZCB0aGUgYnJlYWsKICAgICAgICAgICAgLy8gaXMgQ1NBSS1vbmx5IChhbGwgc2VnbWVudHMgbGl2ZSBvbiBwb2xsIDEpLCBzdGF5IG9uIHRoZSBmYXN0IHBhdGggZm9yIHRoZSByZXN0CiAgICAgICAgICAgIC8vIG9mIHRoZSBicmVhay4gc3RyaXBBZFNlZ21lbnRzIHN0aWxsIGhhbmRsZXMgYW55IHJlYWwgRVhUSU5GIGFkIHNlZ21lbnRzIHRoYXQKICAgICAgICAgICAgLy8gc2hvdyB1cCBvbiBsYXRlciBwb2xscyAodGhleSBnZXQgY2FjaGVkIGFuZCB0aGUgZmV0Y2ggaG9vayByZXR1cm5zIEJMQU5LX01QNCksCiAgICAgICAgICAgIC8vIHNvIGFkcyBhcmUgYmxvY2tlZCBldmVuIHdpdGhvdXQgdGhlIGJhY2t1cCBzd2l0Y2guIFNraXBwaW5nIGJhY2t1cCBzZWFyY2ggZm9yCiAgICAgICAgICAgIC8vIHRoZSB3aG9sZSBDU0FJIGJyZWFrIHNhdmVzIH4yMCB3YXN0ZWQgZmV0Y2hlcyBwZXIgYnJlYWsg4oCUIHRoZSBiYWNrdXAgd291bGRuJ3QKICAgICAgICAgICAgLy8gaGVscCBhbnl3YXkgc2luY2UgZXZlcnkgcGxheWVyIHR5cGUgaGFzIHRoZSBzYW1lIENTQUkgYWRzLiBGbGFnIGlzIGNsZWFyZWQKICAgICAgICAgICAgLy8gb25seSBhdCBicmVhayBlbmQgKElzU2hvd2luZ0FkPWZhbHNlIHBhdGgpLgogICAgICAgICAgICAvLyBTdGlja3kgQ1NBSSBlc2NhcGUgaGF0Y2ggKFByZWZlckxvd1F1YWxpdHlCYWNrdXApOiBhZnRlciB+OHMgc3R1Y2ssIGZhbGwgdGhyb3VnaCB0byBiYWNrdXAgc2VhcmNoLgogICAgICAgICAgICBpZiAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCAmJiBzdHJlYW1JbmZvLkNzYWlPbmx5VGhpc0JyZWFrICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSA0KSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHVja1BvbGxzID0gc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWNvdmVyeUNhY2hlU2l6ZSA9IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDA7CiAgICAgICAgICAgICAgICBjb25zdCBlYXJseVJlbG9hZEluZm8gPSAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApICsgJy8nICsgTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTdGlja3kgQ1NBSSBlc2NhcGUgaGF0Y2gg4oCUIHN0dWNrICcgKyBzdHVja1BvbGxzICsgJyBwb2xscyAoficgKyAoc3R1Y2tQb2xscyAqIDIpICsgJ3MpLCBFYXJseVJlbG9hZENvdW50PScgKyBlYXJseVJlbG9hZEluZm8gKyAnLCByZWNvdmVyeSBjYWNoZT0nICsgcmVjb3ZlcnlDYWNoZVNpemUgKyAnIHNlZ21lbnRzLCBmYWxsaW5nIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayAmJiAhc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4KSB7CiAgICAgICAgICAgICAgICBpZiAoSXNBZFN0cmlwcGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEVhcmx5IHJlbG9hZCBkdXJpbmcgcHJvbG9uZ2VkIGZyZWV6ZSDigJQgbWlycm9ycyB0aGUgY2hlY2sgaW4gdGhlIG5vcm1hbAogICAgICAgICAgICAgICAgLy8gYmFja3VwLXNlYXJjaCBwYXRoIHdoaWNoIHdlJ2Qgb3RoZXJ3aXNlIHNraXAgZW50aXJlbHkgYnkgcmV0dXJuaW5nIGVhcmx5CiAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBzdGlja3kgcGF0aC4gV2l0aG91dCB0aGlzLCBoZWF2eSBTU0FJIGJyZWFrcyBvbiBDU0FJLWNvbmZpcm1lZAogICAgICAgICAgICAgICAgLy8gc3RyZWFtcyBsZWF2ZSB0aGUgcGxheWVyIHJlcGxheWluZyB0aGUgdGhpbiByZWNvdmVyeSBjYWNoZSBmb3IgdGhlIGZ1bGwKICAgICAgICAgICAgICAgIC8vIGJyZWFrIGR1cmF0aW9uIChvYnNlcnZlZDogMzUuOXMgZnJlZXplIG9uIHBvZC0xIGJyZWFrLCAzIGFsbC1zdHJpcHBlZAogICAgICAgICAgICAgICAgLy8gcG9sbHMsIDEtc2VnbWVudCByZWNvdmVyeSBjYWNoZSkuCiAgICAgICAgICAgICAgICAvLyBCb3VuZGVkIHRvIG1heEVhcmx5UmVsb2FkcyBwZXIgYWQgaW4gcG9kIHNvIHJlbG9hZCBsb29wcyBhcmUgaW1wb3NzaWJsZS4KICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0IChzdGlja3kgcGF0aCk6IHN0aWxsIGFkcyDigJQgY29udGludWluZyByZWNvdmVyeSBsb29wJyk7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5UmVjb3ZlcnlUaGluID0gKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApIDwgMzsKICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreU1heEVhcmx5UmVsb2FkcyA9IHN0aWNreVJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgICAgICBjb25zdCBzdGlja3lFZmZlY3RpdmVUaHJlc2hvbGQgPSBzdGlja3lSZWNvdmVyeVRoaW4gPyAxIDogRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkOwogICAgICAgICAgICAgICAgaWYgKEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA+IDAgJiYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApID49IHN0aWNreUVmZmVjdGl2ZVRocmVzaG9sZCAmJiAhc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCAmJiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApIDwgc3RpY2t5TWF4RWFybHlSZWxvYWRzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgPSAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5UmVhc29uID0gc3RpY2t5UmVjb3ZlcnlUaGluID8gJyAodGhpbiByZWNvdmVyeSBjYWNoZTogJyArIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSArICcgc2VnbWVudHMpJyA6ICcnOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCB0cmlnZ2VyZWQgKHN0aWNreSBwYXRoKSDigJQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzICsgJyBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMnICsgc3RpY2t5UmVhc29uICsgJyBbJyArIHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCArICcvJyArIHN0aWNreU1heEVhcmx5UmVsb2FkcyArICddJyk7CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyBrZXk6ICdSZWxvYWRQbGF5ZXInLCBraW5kOiAnZWFybHknIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgbnVtU3RyaXBwZWRBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cywKICAgICAgICAgICAgICAgICAgICBhY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBudWxsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENTQUkgZmFzdCBwYXRoOiBpZiBhbGwgc2VnbWVudHMgaW4gdGhlIG1haW4gc3RyZWFtIGFyZSBsaXZlLCBza2lwIGJhY2t1cCBzZWFyY2guCiAgICAgICAgICAgIC8vIENTQUkgYWRzIGFyZSBkZWxpdmVyZWQgb3V0c2lkZSB0aGUgbTN1OCDigJQgdGhlIG1haW4gc3RyZWFtIHNlZ21lbnRzIGFyZSBjbGVhbi4KICAgICAgICAgICAgLy8gSnVzdCBzdHJpcCB0cmFja2luZyBVUkxzIGFuZCByZXR1cm4gdGhlIG1haW4gc3RyZWFtIGRpcmVjdGx5LCBhdm9pZGluZyB0aGUKICAgICAgICAgICAgLy8gYmFja3VwIHN0cmVhbSBzd2l0Y2ggdGhhdCBjYXVzZXMgYSAyMC00MHMgcmVidWZmZXIgZ2FwLgogICAgICAgICAgICBjb25zdCBtYWluU3RyZWFtTGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICBsZXQgaGFzTm9uTGl2ZVNlZ21lbnQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWluU3RyZWFtTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtYWluU3RyZWFtTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVElORicpICYmICFtYWluU3RyZWFtTGluZXNbaV0uaW5jbHVkZXMoJyxsaXZlJykpIHsKICAgICAgICAgICAgICAgICAgICBoYXNOb25MaXZlU2VnbWVudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmFja3VwU3dhcEZpcnN0IChvcHQtaW4pOiBza2lwIHN0aWNreSBDU0FJIHBhdGggZW50aXJlbHksIGFsd2F5cyBmYWxsIHRocm91Z2ggdG8KICAgICAgICAgICAgLy8gYmFja3VwIHNlYXJjaCBvbiBhZCBkZXRlY3QuIE1pbWljcyBUVFYtQUIncyBiYWNrdXAtc3dhcC1maXJzdCBmbG93IOKAlCBhdm9pZHMKICAgICAgICAgICAgLy8gTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkgKG5vIEJMQU5LX01QNCBpbmplY3Rpb24sIG5vIHJlY292ZXJ5CiAgICAgICAgICAgIC8vIHNlZ21lbnQgcmVwbGF5KSwgd2hpY2ggdXNlcnMgcmVwb3J0IHByb2R1Y2VzIGZld2VyIGxvYWRpbmcgY2lyY2xlcy4gQ29zdDogZXh0cmEKICAgICAgICAgICAgLy8gZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhayAodG9rZW4gcmVxdWVzdHMgZm9yIGVhY2ggYmFja3VwIHR5cGUgdHJpZWQpLgogICAgICAgICAgICBpZiAoIWhhc05vbkxpdmVTZWdtZW50ICYmICFzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggJiYgIUJhY2t1cFN3YXBGaXJzdCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IHRydWU7Ly8gTWFyayBicmVhayBhcyBjb25maXJtZWQgQ1NBSSBzbyBzdWJzZXF1ZW50IHBvbGxzIHN0YXkgb24gdGhlIGZhc3QgcGF0aAogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBmYXN0IHBhdGgg4oCUIGFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoJyk7CiAgICAgICAgICAgICAgICBpZiAoSXNBZFN0cmlwcGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICAgICAgICAgIGhhc0Fkczogc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCwKICAgICAgICAgICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBiYWNrdXBTZWFyY2hTdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIGxldCBiYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2t1cE0zdTggPSBudWxsOwogICAgICAgICAgICBsZXQgZmFsbGJhY2tNM3U4ID0gbnVsbDsKICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwOwogICAgICAgICAgICBsZXQgaXNEb2luZ01pbmltYWxSZXF1ZXN0cyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID4gRGF0ZS5ub3coKSAtIFBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1RpbWUpIHsKICAgICAgICAgICAgICAgIC8vIFdoZW4gZG9pbmcgcGxheWVyIHJlbG9hZCB0aGVyZSBhcmUgYSBsb3Qgb2YgcmVxdWVzdHMgd2hpY2ggY2F1c2VzIHRoZSBiYWNrdXAgc3RyZWFtIHRvIGxvYWQgaW4gc2xvdy4gQnJpZWZseSBwcmVmZXIgdXNpbmcgYSBzaW5nbGUgdmVyc2lvbiB0byBwcmV2ZW50IGxvbmcgZGVsYXlzCiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gUGxheWVyUmVsb2FkTWluaW1hbFJlcXVlc3RzUGxheWVySW5kZXg7CiAgICAgICAgICAgICAgICBpc0RvaW5nTWluaW1hbFJlcXVlc3RzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUcnkgcGlubmVkIGJhY2t1cCBwbGF5ZXIgdHlwZSBmaXJzdCBpZiBhdmFpbGFibGUKICAgICAgICAgICAgY29uc3QgcGxheWVyVHlwZXNUb1RyeSA9IFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPyBbLi4uQmFja3VwUGxheWVyVHlwZXMsICdhdXRvcGxheSddIDogWy4uLkJhY2t1cFBsYXllclR5cGVzXTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgY29uc3QgcGlubmVkSW5kZXggPSBwbGF5ZXJUeXBlc1RvVHJ5LmluZGV4T2Yoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIGlmIChwaW5uZWRJbmRleCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlc1RvVHJ5LnNwbGljZShwaW5uZWRJbmRleCwgMSk7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS51bnNoaWZ0KHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgcGxheWVyVHlwZUluZGV4ID0gc3RhcnRJbmRleDsgIWJhY2t1cE0zdTggJiYgcGxheWVyVHlwZUluZGV4IDwgcGxheWVyVHlwZXNUb1RyeS5sZW5ndGg7IHBsYXllclR5cGVJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJUeXBlID0gcGxheWVyVHlwZXNUb1RyeVtwbGF5ZXJUeXBlSW5kZXhdOwogICAgICAgICAgICAgICAgY29uc3QgcmVhbFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlLnJlcGxhY2UoJy1DQUNIRUQnLCAnJyk7CiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRBdCA9IHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuZ2V0KHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIGlmIChmYWlsZWRBdCAmJiAoRGF0ZS5ub3coKSAtIGZhaWxlZEF0KSA8IDE1MDAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBpc0Z1bGx5Q2FjaGVkUGxheWVyVHlwZSA9IHBsYXllclR5cGUgIT0gcmVhbFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FjaGVzIHRoZSBtM3U4IGlmIGl0IGRvZXNuJ3QgaGF2ZSBhZHMuIElmIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGhhcyBhZHMgaXQgZmV0Y2hlcyBhIG5ldyB2ZXJzaW9uIChzZWNvbmQgbG9vcCkKICAgICAgICAgICAgICAgICAgICBsZXQgaXNGcmVzaE0zdTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RpbmdzTTN1OCA9IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdOwogICAgICAgICAgICAgICAgICAgIGlmICghZW5jb2RpbmdzTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICBpc0ZyZXNoTTN1OCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcmVhbFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IChmbGF0dGVyLCBvYnNlcnZlZCBmb3IgJ2VtYmVkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNwYXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCBzcGF0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXSA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVXNoZXIgSFRUUCAnICsgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyByZWFsUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JCb2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXJyb3JCb2R5ID0gJyDigJQgJyArIChhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLnRleHQoKSkuc3Vic3RyaW5nKDAsIDIwMCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBY2Nlc3MgdG9rZW4gSFRUUCAnICsgYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgKyAnIGZvciAnICsgcmVhbFBsYXllclR5cGUgKyAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDQwMyA/ICcgKGludGVncml0eTogJyArIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAncHJlc2VudCcgOiAnbWlzc2luZycpICsgJyknIDogJycpICsgZXJyb3JCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLnNldChyZWFsUGxheWVyVHlwZSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWNjZXNzIHRva2VuIGZhaWxlZCBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJzogJyArIGVyci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuc2V0KHJlYWxQbGF5ZXJUeXBlLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFVybCA9IGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbTN1OFRleHQgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtM3U4VGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyVHlwZSA9PSBGYWxsYmFja1BsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0FkVGFncyhtM3U4VGV4dCkgJiYgKFNpbXVsYXRlZEFkc0RlcHRoID09IDAgfHwgcGxheWVyVHlwZUluZGV4ID49IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSkpIHx8ICghZmFsbGJhY2tNM3U4ICYmIHBsYXllclR5cGVJbmRleCA+PSBwbGF5ZXJUeXBlc1RvVHJ5Lmxlbmd0aCAtIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApID49IDEgJiYgIWhhc0FkVGFncyhtM3U4VGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2VHlwZSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZUeXBlICYmIHByZXZUeXBlICE9PSBwbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEN5Y2xlIHN3aXRjaGVkIHRvIGRpZmZlcmVudCBjbGVhbiB0eXBlICgnICsgcGxheWVyVHlwZSArICcsIHdhcyAnICsgcHJldlR5cGUgKyAnKSBkdXJpbmcgZnJlZXplIOKAlCByZWNvdmVyZWQgd2l0aG91dCByZWxvYWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBtYXJrIGFzIGN5Y2xlLXJlc2N1ZWQgd2hlbiB3ZSBBQ1RVQUxMWSBzd2l0Y2hlZCBwbGF5ZXIgdHlwZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdHVyYWwgcmVjb3ZlcnkgKHNhbWUgdHlwZSBiZWNhbWUgY2xlYW4pIHN0aWxsIG5lZWRzIHRoZSBlbmQtb2YtYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIHRvIHJlZnJlc2ggdGhlIHBsYXllciBidWZmZXIg4oCUIHNraXBwaW5nIGl0IGxlYXZlcyB0aGUgcGxheWVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0dWNrIHdpdGggbG93IGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBtb25pdG9yIHVuYWJsZSB0byByZWNvdmVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkN5Y2xlUmVzY3VlZFRoaXNCcmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU2FtZSBiYWNrdXAgdHlwZSAoJyArIHBsYXllclR5cGUgKyAnKSBiZWNhbWUgY2xlYW4gZHVyaW5nIGZyZWV6ZSDigJQgbmF0dXJhbCByZWNvdmVyeScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0FkVGFncyhtM3U4VGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUpIHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5oYXMocGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5hZGQocGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSAoJyArIHBsYXllclR5cGUgKyAnKSBhbHNvIGhhcyBhZHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdWxseUNhY2hlZFBsYXllclR5cGUgfHwgaXNEb2luZ01pbmltYWxSZXF1ZXN0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IHBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDeWNsZSB0aHJvdWdoIGFsbCBwbGF5ZXIgdHlwZXMgbG9va2luZyBmb3IgYSBjbGVhbiBiYWNrdXAuIE9ubHkgY29tbWl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGFkLWxhZGVuIGJhY2t1cCBhcyBhIGxhc3QgcmVzb3J0IHdoZW4gd2UndmUgZXhoYXVzdGVkIGFsbCBvcHRpb25zLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQUiAjODkgcHJldmlvdXNseSBjb21taXR0ZWQgdGhlIGZpcnN0IGFkLWxhZGVuIHR5cGUgaW1tZWRpYXRlbHkg4oCUIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSB2NTggZnJlZXplIHJlZ3Jlc3Npb24gKGlzc3VlICMxMTIpIGJlY2F1c2UgdGhlIHN0cmlwK3JlY292ZXJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3Agd291bGQgZW5nYWdlIGV2ZW4gd2hlbiBhIGNsZWFuIGFsdGVybmF0ZSB3YXMgYXZhaWxhYmxlIG9uIGFub3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxheWVyIHR5cGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3MobTN1OFRleHQpICYmIHBsYXllclR5cGVJbmRleCA+PSBwbGF5ZXJUeXBlc1RvVHJ5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBiYWNrdXAgcGxheWVyIHR5cGVzIGFkLWxhZGVuIOKAlCB0YWtpbmcgJyArIHBsYXllclR5cGUgKyAnIGFzIGxhc3QtcmVzb3J0IGZhbGxiYWNrIChzdHJpcCtyZWNvdmVyeSBwYXRoIHdpbGwgZW5nYWdlKScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IHBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSBmZXRjaCBmYWlsZWQgZm9yICcgKyBwbGF5ZXJUeXBlICsgJyAoc3RhdHVzICcgKyBzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGVycm9yIGZvciAnICsgcGxheWVyVHlwZSArICc6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NNM1U4Q2FjaGVbcGxheWVyVHlwZV0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0ZyZXNoTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFiYWNrdXBNM3U4ICYmIGZhbGxiYWNrTTN1OCkgewogICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IEZhbGxiYWNrUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgIGJhY2t1cE0zdTggPSBmYWxsYmFja00zdTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3RhbGUtY29tbWl0IGd1YXJkOiBtdWx0aXBsZSBwcm9jZXNzTTNVOCBjYWxscyBjYW4gYmUgaW4gZmxpZ2h0IGNvbmN1cnJlbnRseSBmb3IKICAgICAgICAgICAgLy8gdGhlIHNhbWUgc3RyZWFtSW5mbyAob25lIHBlciBtM3U4IHBvbGwpLiBJZiB0aGlzIGJhY2t1cCBzZWFyY2ggc3RhcnRlZCBkdXJpbmcgdGhlCiAgICAgICAgICAgIC8vIGFkIGJyZWFrIGJ1dCBjb21wbGV0ZWQgQUZURVIgYSBsYXRlciBwb2xsIGFscmVhZHkgcmFuIHRoZSBlbmQtb2YtYnJlYWsgcmVzZXQKICAgICAgICAgICAgLy8gKElzU2hvd2luZ0FkID0gZmFsc2UsIEFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBudWxsKSwgY29tbWl0dGluZyB0aGUgYmFja3VwIGhlcmUKICAgICAgICAgICAgLy8gd291bGQgb3ZlcndyaXRlIHRoZSBjbGVhcmVkIHN0YXRlIGFuZCBmZWVkIHN0YWxlIHBsYXlsaXN0IGRhdGEgdG8gdGhlIHBsYXllciwKICAgICAgICAgICAgLy8gY2F1c2luZyBidWZmZXIgcmVjb25jaWxpYXRpb24gZmFpbHVyZXMgYW5kIGEgZm9yY2VkIHJlbG9hZC4gQ2hlY2sgSXNTaG93aW5nQWQKICAgICAgICAgICAgLy8gaGVyZSB0byBkaXNjYXJkIHN0YWxlIHJlc3VsdHMuCiAgICAgICAgICAgIGlmIChiYWNrdXBNM3U4ICYmIHN0cmVhbUluZm8uSXNTaG93aW5nQWQpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBiYWNrdXBNM3U4OwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSA9IGJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlICE9IGJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBiYWNrdXBQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVF1YWxpdHlUeXBlcyA9IFsnZW1iZWQnLCAnc2l0ZScsICdwb3BvdXQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoUGluQmFja3VwUGxheWVyVHlwZSB8fCBzb3VyY2VRdWFsaXR5VHlwZXMuaW5jbHVkZXMoYmFja3VwUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEJsb2NraW5nJHsoc3RyZWFtSW5mby5Jc01pZHJvbGwgPyAnIG1pZHJvbGwgJyA6ICcgJyl9YWRzICgke2JhY2t1cFBsYXllclR5cGV9KSDigJQgYmFja3VwIGZvdW5kIGluICR7RGF0ZS5ub3coKSAtIGJhY2t1cFNlYXJjaFN0YXJ0fW1zYCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5VGllciA9IGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgPyAnMzYwcCcgOiAnU291cmNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1lc2NhcGUgYmFja3VwOiAnICsgYmFja3VwUGxheWVyVHlwZSArICcgKCcgKyBxdWFsaXR5VGllciArICcpIOKAlCByZWNvdmVyZWQgZnJvbSBzdGlja3ktcGF0aCBmcmVlemUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgJiYgUHJlZmVyTG93UXVhbGl0eUJhY2t1cCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvcGxheSBiYWNrdXAgY29tbWl0dGVkIOKAlCAzNjBwIGZhbGxiYWNrIGFmdGVyIFNvdXJjZSB0eXBlcyBhZC1sYWRlbiAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFja3VwTTN1OCAmJiAhc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRGlzY2FyZGVkIHN0YWxlIGJhY2t1cCBjb21taXQgKCcgKyBiYWNrdXBQbGF5ZXJUeXBlICsgJywgJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zKSDigJQgYnJlYWsgZW5kZWQgZHVyaW5nIHNlYXJjaCcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIOKAlCBhZHMgbWF5IGxlYWsuIFRyaWVkOiAnICsgcGxheWVyVHlwZXNUb1RyeS5zbGljZShzdGFydEluZGV4KS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPOiBJbXByb3ZlIGhldmMgc3RyaXBwaW5nLiBJdCBzaG91bGQgYWx3YXlzIHN0cmlwIHdoZW4gdGhlcmUgaXMgYSBjb2RlYyBtaXNtYXRjaCAoYm90aCB3YXlzKQogICAgICAgICAgICBjb25zdCBzdHJpcEhldmMgPSBpc0hldmMgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTg7CiAgICAgICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCB8fCBzdHJpcEhldmMpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgc3RyaXBIZXZjLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghYmFja3VwTTN1OCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc3RyaXBwaW5nIGRpc2FibGVkIGFuZCBubyBiYWNrdXAg4oCUIGFkcyBXSUxMIHNob3cnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBMb2cgcmVsb2FkIG91dGNvbWUgb24gdGhlIHBvbGwgYWZ0ZXIgZWFybHkgcmVsb2FkIHRyaWdnZXJlZAogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpICYmIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdDogcGFydGlhbCDigJQgc29tZSBsaXZlIHNlZ21lbnRzIHJldHVybmVkJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCByZXN1bHQ6IGNsZWFuIOKAlCBmcmVlemUgZW5kZWQnKTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0cmlnZ2VyIGZsYWcgc28gc3Vic2VxdWVudCBmcmVlemVzIHdpdGhpbiB0aGUgc2FtZSBwb2QgY2FuIHJlLWZpcmUgKGJvdW5kZWQgYnkgRWFybHlSZWxvYWRDb3VudC9Qb2RMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0OiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemU6IGlmIHdlJ3ZlIGJlZW4gbG9vcGluZyByZWNvdmVyeSBzZWdtZW50cwogICAgICAgICAgICAvLyBmb3IgTisgcG9sbHMgKH5OeDJzKSwgdHJpZ2dlciBhIHJlbG9hZCB0byBhdHRlbXB0IGZyZXNoIGNvbnRlbnQuIEJvdW5kZWQgdG8gb25lCiAgICAgICAgICAgIC8vIHJlbG9hZCBwZXIgYWQgaW4gdGhlIHBvZCAoZS5nLiAyLWFkIHBvZCA9IHVwIHRvIDIgZWFybHkgcmVsb2FkcykuCiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IG1heEVhcmx5UmVsb2FkcyA9IHJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IG1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24gKyAnIFsnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ICsgJy8nICsgbWF4RWFybHlSZWxvYWRzICsgJ10nKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCsrOwogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBwbGF5bGlzdCBoYXMgbGl2ZSBzZWdtZW50cyDigJQgaWYgbm90LCBiYWNrdXAgc3RyZWFtIGlzIGRlYWQKICAgICAgICAgICAgY29uc3QgaGFzTGl2ZVNlZ21lbnRzID0gdGV4dFN0ci5pbmNsdWRlcygnLGxpdmUnKTsKICAgICAgICAgICAgY29uc3QgY2xlYW5UaHJlc2hvbGQgPSBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9PT0gMCA/IDEgOiAyOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gY2xlYW5UaHJlc2hvbGQgfHwgIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgaWYgKCFoYXNMaXZlU2VnbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGhhcyBubyBsaXZlIHNlZ21lbnRzIOKAlCBmb3JjaW5nIGltbWVkaWF0ZSByZWxvYWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGFkQnJlYWtEdXJhdGlvblNlYyA9IHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCkgLyAxMDAwKS50b0ZpeGVkKDEpIDogJz8nOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZpbmlzaGVkIGJsb2NraW5nIGFkcyDigJQgc3RyaXBwZWQgJyArIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzICsgJyBhZCBzZWdtZW50cywgZHVyYXRpb246ICcgKyBhZEJyZWFrRHVyYXRpb25TZWMgKyAncycpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZEluZm8gPSBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID8gJywgZWFybHkgcmVsb2FkIGF0IHBvbGwgJyArIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgOiAnJzsKICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWxsQ2xvY2tGcmVlemUgPSBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0KSAvIDEwMDApLnRvRml4ZWQoMSkgKyAncyB3YWxsLWNsb2NrJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBicmVhayBzdGF0czogJyArIHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzICsgJyBhbGwtc3RyaXBwZWQgcG9sbHMsIGZyZWV6ZSBkdXJhdGlvbjogJyArIHdhbGxDbG9ja0ZyZWV6ZSArIHJlbG9hZEluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaGFkU3RyaXBwZWRTZWdtZW50cyA9IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMDsKICAgICAgICAgICAgICAgIC8vIE9ubHkgY291bnQgdG93YXJkIGZhbHNlLXBvc2l0aXZlIGd1YXJkIGlmIHRoZSBtM3U4IGxhY2tlZCBoaWdoLWNvbmZpZGVuY2UgYWQgbWFya2Vycy4KICAgICAgICAgICAgICAgIC8vIENvbmZpcm1lZCBhZHMgKHdpdGggWC1UVi1UV0lUQ0gtQUQtQUQtU0VTU0lPTi1JRCBldGMuKSB0aGF0IHByb2R1Y2UgMCBzdHJpcHMgYXJlIHJlYWwgYWRzCiAgICAgICAgICAgICAgICAvLyB3ZSBzdWNjZXNzZnVsbHkgYXZvaWRlZCB2aWEgY2xlYW4gYmFja3VwIOKAlCBub3QgZmFsc2UgcG9zaXRpdmVzLgogICAgICAgICAgICAgICAgaWYgKCFoYWRTdHJpcHBlZFNlZ21lbnRzICYmICFzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPj0gMykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXYXJuaW5nOiAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyArICcgY29uc2VjdXRpdmUgdW5jb25maXJtZWQgYWQgYnJlYWtzIHdpdGggMCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcG9zc2libGUgZmFsc2UgcG9zaXRpdmUgZnJvbSBhZCBzaWduaWZpZXJzJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYWRTdHJpcHBlZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU2hvd2luZ0FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUpIHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gQ1NBSS1vbmx5IGFkIGJyZWFrOiBubyBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkIOKAlCBza2lwIHJlbG9hZCBlbnRpcmVseS4KICAgICAgICAgICAgICAgIGlmICghaGFkU3RyaXBwZWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUktb25seSBhZCBicmVhayAoc3RyaXBwZWQgMCkg4oCUIGNsZWFyaW5nIGJhY2t1cCB3aXRob3V0IHBsYXllciBhY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb246IGlmIEFOWSBiYWNrdXAgd2FzIGNvbW1pdHRlZCBkdXJpbmcgdGhpcyBicmVhayAoZXNjYXBlIGhhdGNoCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgY3ljbGUgcmVzY3VlIHRoYXQgZGlkbid0IG1lZXQgY3ljbGVSZXNjdWVkQ2xlYW5seSBjcml0ZXJpYSksIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIGJ1ZmZlciBoYXMgYWNjdW11bGF0ZWQgbWl4ZWQtc291cmNlIHNlZ21lbnRzIChiYWNrdXAtZmV0Y2hlZAogICAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbHRlcm5hdGUgcGxheWVyLXR5cGUgYWNjZXNzIHRva2VuICsgbmF0aXZlLWZldGNoZWQpLiBNaXhpbmcgY2FuCiAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgYXVkaW8vdmlkZW8gdHJhY2sgdGltZXN0YW1wcyB0byBkaXZlcmdlLCBhbmQgd2l0aG91dCBhIHJlbG9hZCB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBkcmlmdCBjb21wb3VuZHMgYWNyb3NzIHN1YnNlcXVlbnQgZXNjYXBlLWhhdGNoIGJyZWFrcy4gRm9yY2UgYSBoYXJkIHJlbG9hZAogICAgICAgICAgICAgICAgICAgIC8vIHRvIGZsdXNoIHRoZSBNZWRpYVNvdXJjZSBidWZmZXIgKyByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9wbGF5ICgzNjBwKSBzcGVjaWZpY2FsbHksIHRoZSByZWxvYWQgYWxzbyByZXN0b3JlcyBTb3VyY2UKICAgICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IChhdXRvcGxheS1zY29wZWQgdG9rZW4gb25seSBzZXJ2ZXMgMzYwcCB2YXJpYW50IGxhZGRlcikuCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBdXRvcGxheSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGlzQXV0b3BsYXkgPyAnYXV0b3BsYXkgKDM2MHApIOKAlCByZXN0b3JpbmcgU291cmNlIHF1YWxpdHknIDogc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSArICcg4oCUIGZsdXNoaW5nIE1lZGlhU291cmNlIHRvIHByZXZlbnQgQS9WIGRlc3luYyBhY2N1bXVsYXRpb24nOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LWVzY2FwZSByZWxvYWQ6ICcgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcykgc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5wdXNoKERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7IGtleTogJ1JlbG9hZFBsYXllcicsIGtpbmQ6ICdlYXJseScgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEF1dG8tZXNjYWxhdGUgY29vbGRvd246IGlmIDMrIHJlbG9hZHMgaW4gbGFzdCA1IG1pbiwgdHJpcGxlIHRoZSBjb29sZG93bgogICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMpIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzID0gc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzLmZpbHRlcih0ID0+IERhdGUubm93KCkgLSB0IDwgMzAwMDAwKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlY2VudFJlbG9hZHMgPSBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMuZmlsdGVyKHQgPT4gRGF0ZS5ub3coKSAtIHQgPCAzMDAwMDApLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUNvb2xkb3duID0gcmVjZW50UmVsb2FkcyA+PSAzID8gUmVsb2FkQ29vbGRvd25TZWNvbmRzICogMyA6IFJlbG9hZENvb2xkb3duU2Vjb25kczsKICAgICAgICAgICAgICAgIGNvbnN0IHRvb1Nvb25TaW5jZUxhc3RSZWxvYWQgPSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgJiYgKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQpIDwgKGVmZmVjdGl2ZUNvb2xkb3duICogMTAwMCk7CiAgICAgICAgICAgICAgICAvLyBTa2lwIGVuZC1vZi1icmVhayByZWxvYWQgd2hlbiBjeWNsZSByZXNjdWUgaGFuZGxlZCB0aGUgYnJlYWsgY2xlYW5seToKICAgICAgICAgICAgICAgIC8vIGEgZnJlZXplIG9mIOKJpDIgcG9sbHMgKH40cykgd2FzIHJlc29sdmVkIGJ5IHN3aXRjaGluZyB0byBhIGNsZWFuIGJhY2t1cCwKICAgICAgICAgICAgICAgIC8vIGFuZCBubyBlYXJseSByZWxvYWQgd2FzIG5lZWRlZC4gVGhlIHBsYXllciBpcyBvbiBhIGhlYWx0aHkgYmFja3VwIHN0cmVhbQogICAgICAgICAgICAgICAgLy8g4oCUIHJlbG9hZGluZyBqdXN0IHRvIHJldHVybiB0byB0aGUgY2Fub25pY2FsIHBsYXllciB0eXBlIGNhdXNlcyBhbiB1bm5lY2Vzc2FyeQogICAgICAgICAgICAgICAgLy8gfjEtMnMgbG9hZGluZyBjaXJjbGUuCiAgICAgICAgICAgICAgICBjb25zdCBjeWNsZVJlc2N1ZWRDbGVhbmx5ID0gc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgJiYKICAgICAgICAgICAgICAgICAgICAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgPD0gMiAmJgogICAgICAgICAgICAgICAgICAgIChzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgfHwgMCkgPT09IDA7CiAgICAgICAgICAgICAgICBpZiAoY3ljbGVSZXNjdWVkQ2xlYW5seSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEN5Y2xlIHJlc2N1ZSBoYW5kbGVkIHRoZSBicmVhayBjbGVhbmx5IOKAlCBza2lwcGluZyBlbmQtb2YtYnJlYWsgcmVsb2FkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBQb3N0LWFkIHJlbG9hZCBieXBhc3NlcyBjb29sZG93bjogaXQncyBhIGJ1ZmZlciBmbHVzaCB0aWVkIHRvIG5hdHVyYWwgYnJlYWsKICAgICAgICAgICAgICAgIC8vIGVuZCwgbm90IGEgY2FzY2FkZS1yaXNrIHJldHJ5LiBUaGUgYWQgYnJlYWsgY3ljbGUgaXRzZWxmIHJhdGUtbGltaXRzIHRoaXMKICAgICAgICAgICAgICAgIC8vIHBhdGggKG9uY2UgcGVyIGJyZWFrKS4gQ29vbGRvd24gc3RpbGwgZ2F0ZXMgYnVmZmVyLW1vbml0b3IgYW5kIG90aGVyCiAgICAgICAgICAgICAgICAvLyBjYXNjYWRlLXJpc2sgcGF0aHMgdGhhdCBjYW4gZmlyZSByZXBlYXRlZGx5IGluLWJyZWFrLgogICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVsb2FkID0gc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4IHx8IChSZWxvYWRQbGF5ZXJBZnRlckFkICYmIGhhZFN0cmlwcGVkU2VnbWVudHMgJiYgIWN5Y2xlUmVzY3VlZENsZWFubHkpOwogICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlbG9hZCkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5wdXNoKERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdSZWxvYWRQbGF5ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnZWFybHknCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0b29Tb29uU2luY2VMYXN0UmVsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNraXBwaW5nIHJlbG9hZCDigJQgbGFzdCByZWxvYWQgd2FzICcgKyAoKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQpIC8gMTAwMCkudG9GaXhlZCgwKSArICdzIGFnbyAoY29vbGRvd246ICcgKyBlZmZlY3RpdmVDb29sZG93biArICdzJyArIChyZWNlbnRSZWxvYWRzID49IDMgPyAnLCBhdXRvLWVzY2FsYXRlZCBmcm9tICcgKyByZWNlbnRSZWxvYWRzICsgJyByZWxvYWRzIGluIDVtaW4nIDogJycpICsgJyknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdQYXVzZVJlc3VtZVBsYXllcicKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0vLyBlbmQgZWxzZSAobm9uLUNTQUkgcGF0aCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IHN0cmVhbUluZm8uQWN0aXZlQmFja3VwUGxheWVyVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGVzKHN0cikgewogICAgICAgIGlmICghc3RyKSByZXR1cm4ge307CiAgICAgICAgLy8gTm9ybWFsaXplOiBhbHdheXMgcGFzcyBvbmx5IGF0dHJpYnV0ZSBzZWN0aW9uCiAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KDApID09PSAzNSkgeyAvLyAnIycKICAgICAgICAgICAgY29uc3QgaWR4ID0gc3RyLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHN0ciA9IHN0ci5zbGljZShpZHggKyAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcygKICAgICAgICAgICAgc3RyLnNwbGl0KC8oPzpefCwpKCg/OltePV0qKT0oPzoiW14iXSoifFteLF0qKSkvKQogICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB4LmluZGV4T2YoJz0nKTsKICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHguc3Vic3RyaW5nKDAsIGlkeCk7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArIDEpOwogICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBOdW1iZXIuaXNOYU4obnVtKSA/IHZhbHVlLnN0YXJ0c1dpdGgoJyInKSA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWUgOiBudW1dOwogICAgICAgICAgICB9KSk7CiAgICB9CiAgICAvLyBSZXF1ZXN0IGEgcGxheWJhY2sgYWNjZXNzIHRva2VuIGZyb20gVHdpdGNoIEdRTCB1c2luZyB0aGUgZ2l2ZW4gcGxheWVyIHR5cGUKICAgIGZ1bmN0aW9uIGdldEFjY2Vzc1Rva2VuKGNoYW5uZWxOYW1lLCBwbGF5ZXJUeXBlKSB7CiAgICAgICAgY29uc3QgYm9keSA9IHsKICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1BsYXliYWNrQWNjZXNzVG9rZW4nLAogICAgICAgICAgICB2YXJpYWJsZXM6IHsKICAgICAgICAgICAgICAgIGlzTGl2ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGxvZ2luOiBjaGFubmVsTmFtZSwKICAgICAgICAgICAgICAgIGlzVm9kOiBmYWxzZSwKICAgICAgICAgICAgICAgIHZvZElEOiAiIiwKICAgICAgICAgICAgICAgIHBsYXllclR5cGU6IHBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogcGxheWVyVHlwZSA9PSAnYXV0b3BsYXknID8gJ2FuZHJvaWQnIDogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSk7CiAgICB9CiAgICAvLyBTZW5kIGEgR1FMIHJlcXVlc3QgdG8gVHdpdGNoIHZpYSB0aGUgbWFpbiB0aHJlYWQgKHdvcmtlcnMgY2FuJ3QgbWFrZSBjcmVkZW50aWFsZWQgcmVxdWVzdHMpCiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHksIHBsYXllclR5cGUpIHsKICAgICAgICBpZiAoIUdRTERldmljZUlEKSB7CiAgICAgICAgICAgIEdRTERldmljZUlEID0gJyc7CiAgICAgICAgICAgIGNvbnN0IGRjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7CiAgICAgICAgICAgIGNvbnN0IGRjaGFyYWN0ZXJzTGVuZ3RoID0gZGNoYXJhY3RlcnMubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHsKICAgICAgICAgICAgICAgIEdRTERldmljZUlEICs9IGRjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBkY2hhcmFjdGVyc0xlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlEJzogQ2xpZW50SUQsCiAgICAgICAgICAgICdYLURldmljZS1JZCc6IEdRTERldmljZUlELAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSksCiAgICAgICAgICAgIC4uLihDbGllbnRWZXJzaW9uICYmIHsnQ2xpZW50LVZlcnNpb24nOiBDbGllbnRWZXJzaW9ufSksCiAgICAgICAgICAgIC4uLihDbGllbnRTZXNzaW9uICYmIHsnQ2xpZW50LVNlc3Npb24tSWQnOiBDbGllbnRTZXNzaW9ufSkKICAgICAgICB9OwogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGxldCBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgIGxldCBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7CiAgICBsZXQgZHJpZnRDYXRjaFVwVGltZW91dCA9IG51bGw7CiAgICBmdW5jdGlvbiBzdGFydERyaWZ0Q29ycmVjdGlvbih2aWRlb0VsZW1lbnQpIHsKICAgICAgICBpZiAoRHJpZnRDb3JyZWN0aW9uUmF0ZSA8PSAxKSByZXR1cm47CiAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICBpZiAoZHJpZnRDYXRjaFVwVGltZW91dCkgeyBjbGVhclRpbWVvdXQoZHJpZnRDYXRjaFVwVGltZW91dCk7IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOyB9CiAgICAgICAgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IERyaWZ0Q29ycmVjdGlvblJhdGU7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRHJpZnQgY29ycmVjdGlvbjogY2F0Y2hpbmcgdXAgYXQgJyArIERyaWZ0Q29ycmVjdGlvblJhdGUgKyAneCcpOwogICAgICAgIGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgdmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsKICAgICAgICAgICAgICAgIGlmICh2aWQgJiYgdmlkLmJ1ZmZlcmVkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmlkLmJ1ZmZlcmVkLmVuZCh2aWQuYnVmZmVyZWQubGVuZ3RoIC0gMSkgLSB2aWQuY3VycmVudFRpbWUgPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICB2aWQucGxheWJhY2tSYXRlID0gMS4wOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEcmlmdCBjb3JyZWN0aW9uIGNvbXBsZXRlIOKAlCByZXN1bWVkIG5vcm1hbCBwbGF5YmFjayBzcGVlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwVGltZW91dCkgeyBjbGVhclRpbWVvdXQoZHJpZnRDYXRjaFVwVGltZW91dCk7IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOyB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgIH0sIDUwMCk7CiAgICAgICAgZHJpZnRDYXRjaFVwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0cnkgeyB2aWRlb0VsZW1lbnQucGxheWJhY2tSYXRlID0gMS4wOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIGlmIChkcmlmdENhdGNoVXBJbnRlcnZhbCkgeyBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOyB9CiAgICAgICAgICAgIGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOwogICAgICAgIH0sIDMwMDAwKTsKICAgIH0KICAgIGNvbnN0IHBsYXllckJ1ZmZlclN0YXRlID0gewogICAgICAgIGNoYW5uZWxOYW1lOiBudWxsLAogICAgICAgIGhhc1N0cmVhbVN0YXJ0ZWQ6IGZhbHNlLAogICAgICAgIHBvc2l0aW9uOiAwLAogICAgICAgIGJ1ZmZlcmVkUG9zaXRpb246IDAsCiAgICAgICAgYnVmZmVyRHVyYXRpb246IDAsCiAgICAgICAgbnVtU2FtZTogMCwKICAgICAgICBmaXhBdHRlbXB0czogMCwKICAgICAgICBsYXN0Rml4VGltZTogMCwKICAgICAgICBpc0xpdmU6IHRydWUsCiAgICAgICAgbGFzdEJhY2t1cFN3aXRjaEF0OiAwLAogICAgICAgIGxhc3RSZWxvYWRBdDogMCwKICAgICAgICByZWNvdmVyeVJlbG9hZFVzZWQ6IGZhbHNlLAogICAgICAgIHVzZXJQYXVzZUludGVudDogZmFsc2UsCiAgICAgICAgbG9nZ2VkUGF1c2VJbnRlbnQ6IGZhbHNlLAogICAgICAgIHdlSnVzdFBhdXNlZDogMCwKICAgICAgICBpbkFkQnJlYWs6IGZhbHNlCiAgICB9OwogICAgLy8gUG9sbCB0aGUgcGxheWVyIHN0YXRlIHRvIGRldGVjdCBhbmQgZml4IGJ1ZmZlcmluZyBjYXVzZWQgYnkgYWQgc3RyZWFtIHN3aXRjaGluZwogICAgZnVuY3Rpb24gbW9uaXRvclBsYXllckJ1ZmZlcmluZygpIHsKICAgICAgICAvLyBGcmVzaCBwbGF5ZXIgbG9va3VwIGV2ZXJ5IHRpY2sgKGF2b2lkcyBzdGFsZSByZWYgd2hlbiBUd2l0Y2ggcmVzdGFydHMgaXRzIG93biBwbGF5ZXIpCiAgICAgICAgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgICAgIGlmIChwbGF5ZXJBbmRTdGF0ZSAmJiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIgJiYgcGxheWVyQW5kU3RhdGUuc3RhdGUpIHsKICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBsYXllckFuZFN0YXRlLnN0YXRlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgIXZpZGVvLl9fdGFzSW50ZW50SG9va2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uX190YXNJbnRlbnRIb29rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCB8fCAoRGF0ZS5ub3coKSAtIHBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCkgPiAyMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudXNlclBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcucGxheWVyOwogICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnN0YXRlOwogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXIuY29yZSkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnICYmICFwbGF5ZXIuaXNQYXVzZWQoKSAmJiAhcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKT8uZW5kZWQgJiYgKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50KCk/LnJlYWR5U3RhdGUgPz8gMCkgPj0gMSAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA8PSBEYXRlLm5vdygpIC0gUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgJiYgIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdFJlbG9hZEF0ID49IDE1MDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThVcmwgPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG0zdThVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaCA9IG0zdThVcmwubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RhcnQgPSBtM3U4VXJsLmluZGV4T2YoJz8nLCBsYXN0U2xhc2gpOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBtM3U4VXJsLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxLCBxdWVyeVN0YXJ0ICE9PSAtMSA/IHF1ZXJ5U3RhcnQgOiB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lPy5lbmRzV2l0aCgnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gZmlsZU5hbWUuc2xpY2UoMCwgLTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSAhPSBjaGFubmVsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnQ2hhbm5lbCBjaGFuZ2VkIHRvICcgKyBjaGFubmVsTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLmdldFN0YXRlKCkgPT09ICdQbGF5aW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkUG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LmJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyRHVyYXRpb24gPSBwbGF5ZXIuZ2V0QnVmZmVyRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBidWZmZXJlZFBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncG9zaXRpb246JyArIHBvc2l0aW9uICsgJyBidWZmZXJEdXJhdGlvbjonICsgYnVmZmVyRHVyYXRpb24gKyAnIGJ1ZmZlclBvc2l0aW9uOicgKyBidWZmZXJlZFBvc2l0aW9uICsgJyBzdGF0ZTogJyArIHBsYXllci5jb3JlPy5zdGF0ZT8uc3RhdGUgKyAnIHN0YXJ0ZWQ6ICcgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBjb3VsZCBiZSBpbXByb3ZlZC4gSXQgY3VycmVudGx5IGxldHMgdGhlIHBsYXllciBmdWxseSBlYXQgdGhlIGZ1bGwgYnVmZmVyIGJlZm9yZSBpdCB0cmlnZ2VycyBwYXVzZS9wbGF5CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgfHwgcG9zaXRpb24gPiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPT0gcG9zaXRpb24gfHwgYnVmZmVyRHVyYXRpb24gPCBQbGF5ZXJCdWZmZXJpbmdEYW5nZXJab25lKSAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlcmVkUG9zaXRpb24gPT0gYnVmZmVyZWRQb3NpdGlvbiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gPj0gYnVmZmVyRHVyYXRpb24gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3NpdGlvbiAhPSAwIHx8IGJ1ZmZlcmVkUG9zaXRpb24gIT0gMCB8fCBidWZmZXJEdXJhdGlvbiAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID09IFBsYXllckJ1ZmZlcmluZ1NhbWVTdGF0ZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXA6IGF0IG1vc3QgT05FIHJlbG9hZCBwZXIgcmVjb3Zlcnkgd2luZG93LiBBZnRlciByZWxvYWRpbmcgb25jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF5IG9uIHBhdXNlL3BsYXkgdW50aWwgcGxheWJhY2sgcmVjb3ZlcnMuIFByZXZlbnRzIHJlbG9hZCBjYXNjYWRlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3VsZEVzY2FsYXRlID0gcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMgPj0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0ZVRvUmVsb2FkID0gd291bGRFc2NhbGF0ZSAmJiAoRGlzYWJsZVJlbG9hZENhcCB8fCAhcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxvYWRDYXBOb3RlID0gd291bGRFc2NhbGF0ZSAmJiAhZXNjYWxhdGVUb1JlbG9hZCA/ICcgKHJlbG9hZCBjYXAgcmVhY2hlZCwgcGF1c2UvcGxheSBvbmx5IOKAlCBzZXQgdHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcD10cnVlIHRvIGJ5cGFzcyknIDogKGVzY2FsYXRlVG9SZWxvYWQgPyAnIChlc2NhbGF0aW5nIHRvIHJlbG9hZCknIDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIGZpeCBidWZmZXJpbmcgcG9zaXRpb246JyArIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uICsgJyBidWZmZXJlZFBvc2l0aW9uOicgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5idWZmZXJlZFBvc2l0aW9uICsgJyBidWZmZXJEdXJhdGlvbjonICsgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gKyByZWxvYWRDYXBOb3RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVrIHBhc3QgYnVmZmVyIGdhcCBpbnN0ZWFkIG9mIHN0YWxsaW5nICsgZHJpZnQgdG8gcmVjb3ZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQ/LigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5idWZmZXJlZC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGJpID0gMDsgYmkgPCB2aWRlby5idWZmZXJlZC5sZW5ndGg7IGJpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby5idWZmZXJlZC5zdGFydChiaSkgPiB2aWRlby5jdXJyZW50VGltZSArIDAuNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNlZWtpbmcgcGFzdCAnICsgKHZpZGVvLmJ1ZmZlcmVkLnN0YXJ0KGJpKSAtIHZpZGVvLmN1cnJlbnRUaW1lKS50b0ZpeGVkKDEpICsgJ3MgYnVmZmVyIGdhcCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdmlkZW8uYnVmZmVyZWQuc3RhcnQoYmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHZpZGVvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVmlkZW8gc3RhdGU6IHJlYWR5U3RhdGU9JyArIHZpZGVvLnJlYWR5U3RhdGUgKyAnIG5ldHdvcmtTdGF0ZT0nICsgdmlkZW8ubmV0d29ya1N0YXRlICsgJyBidWZmZXJlZD0nICsgKHZpZGVvLmJ1ZmZlcmVkLmxlbmd0aCA+IDAgPyB2aWRlby5idWZmZXJlZC5lbmQodmlkZW8uYnVmZmVyZWQubGVuZ3RoIC0gMSkudG9GaXhlZCgxKSA6IDApICsgJyBjdXJyZW50VGltZT0nICsgdmlkZW8uY3VycmVudFRpbWUudG9GaXhlZCgxKSArICcgcGF1c2VkPScgKyB2aWRlby5wYXVzZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1BhdXNlUGxheSA9IGVzY2FsYXRlVG9SZWxvYWQgPyBmYWxzZSA6ICFQbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1JlbG9hZCA9IGVzY2FsYXRlVG9SZWxvYWQgPyB0cnVlIDogUGxheWVyQnVmZmVyaW5nRG9QbGF5ZXJSZWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Ud2l0Y2hQbGF5ZXJUYXNrKGlzUGF1c2VQbGF5LCBpc1JlbG9hZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEZpeFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0ZVRvUmVsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBwb3NpdGlvbiBqdW1wIChuYXRpdmUgZ2FwIHJlY292ZXJ5KSDigJQgZHJpZnQgdG8gY2F0Y2ggdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBkdXJpbmcgYWQgYnJlYWtzIGFuZCAxMHMgYWZ0ZXI6IGJhY2t1cCBzdHJlYW0gc3dpdGNoaW5nIGNhdXNlcyBidWZmZXIgZ2FwcyB0aGF0IHRyaWdnZXIgZmFsc2UganVtcHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID4gMCAmJiBwb3NpdGlvbiAtIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID4gNSAmJiAhcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrICYmICghcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0IHx8IERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QmFja3VwU3dpdGNoQXQgPj0gMTAwMDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3NpdGlvbiBqdW1wZWQgJyArIChwb3NpdGlvbiAtIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uKS50b0ZpeGVkKDEpICsgJ3Mg4oCUIHN0YXJ0aW5nIGRyaWZ0IGNvcnJlY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiA9IGJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID0gYnVmZmVyRHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIHdoZW4gbW9uaXRvcmluZyBwbGF5ZXIgZm9yIGJ1ZmZlcmluZzogJyArIGVycik7CiAgICAgICAgICAgICAgICBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2FkaW5nLWNpcmNsZSBoZWFsdGggY2hlY2s6IGR1cmluZyBhbiBhZCBzdHJpcCtyZWNvdmVyeSBsb29wIHRoZSBub3JtYWwgYnVmZmVyIG1vbml0b3IKICAgICAgICAvLyBpcyBnYXRlZCBvZmYgKGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMpLCBzbyBhIHZpc2libHkgc3RhbGxlZCBwbGF5ZXIgd291bGQgb3RoZXJ3aXNlIHdhaXQKICAgICAgICAvLyBmb3IgdGhlIHdvcmtlcidzIHBvbGwtYmFzZWQgZWFybHkgcmVsb2FkICh+MTBzKS4gVGhpcyBjYXRjaGVzIHRoZSB2aXNpYmxlIHN0YWxsIH4zcyBhZnRlcgogICAgICAgIC8vIGl0IHN0YXJ0cyBhbmQgdHJpZ2dlcnMgYSByZWxvYWQgZGlyZWN0bHksIGVsaW1pbmF0aW5nIG1vc3Qgb2YgdGhlIGxvYWRpbmctY2lyY2xlIHdpbmRvdy4KICAgICAgICBpZiAoaXNBY3RpdmVseVN0cmlwcGluZ0FkcyAmJiBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnBsYXllcjsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyPy5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8uZW5kZWQgJiYgIXBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIHBsYXllciBoYXMgZXZlciBoYWQgZGF0YSDigJQgZGlzdGluZ3Vpc2hlcyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAvLyAoaGFkIGRhdGEsIGxvc3QgZGF0YSkgZnJvbSBpbml0aWFsIHBsYXllciBpbml0IChuZXZlciBoYWQgZGF0YSB5ZXQpLgogICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgZnJlc2ggcGFnZSBsb2FkICsgcHJlcm9sbCBjYXVzZXMgUFIgIzk2IHRvIG1pc2ZpcmUgcmVwZWF0ZWRseQogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVhZHlTdGF0ZT0wIGlzIG5vcm1hbCBkdXJpbmcgaW5pdC4KICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1N0YWxsZWQgPSB2aWRlby5yZWFkeVN0YXRlIDwgMyAmJiAodmlkZW8ucGF1c2VkIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gMik7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhbGxSZWxvYWRDb29sZG93biA9IDE1MDAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb2xkb3duRXhwaXJlZCA9ICFwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QWRTdGFsbFJlbG9hZEF0IHx8IChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCkgPiBzdGFsbFJlbG9hZENvb2xkb3duOwogICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGZpcmUgbG9hZGluZy1jaXJjbGUgcmVsb2FkIGlmIEFOWSByZWxvYWQgaGFwcGVuZWQgcmVjZW50bHkg4oCUIHJlYWR5U3RhdGU9MAogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBleHBlY3RlZCB0cmFuc2llbnQgc3RhdGUgZHVyaW5nIGEgcmVsb2FkJ3MgTWVkaWFTb3VyY2UgdGVhcmRvd24uIFdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLCBhbiBlYXJseS1yZWxvYWQgaW4gZmxpZ2h0IGNhbiB0cmlnZ2VyIGEgcmVkdW5kYW50IGxvYWRpbmctY2lyY2xlIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWQgPSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQpIDwgc3RhbGxSZWxvYWRDb29sZG93bjsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGFsbGVkICYmIGNvb2xkb3duRXhwaXJlZCAmJiAhcmVjZW50UmVsb2FkICYmIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpID4gMzAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTG9hZGluZyBjaXJjbGUgZGV0ZWN0ZWQgZHVyaW5nIGFkIGJyZWFrICgnICsgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHN0YWxsLCByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJykg4oCUIGVhcmx5IHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkIHJlbG9hZDogYSBzdHVjayBtZWRpYSBwbGF5ZXIgbmVlZHMgaXRzIE1lZGlhU291cmNlIHJlYnVpbHQsIG5vdCBqdXN0IGFuIG0zdTggcmVmZXRjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgJ2Vhcmx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1N0YWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0gZWxzZSBpZiAoIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIHsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc0xpdmUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUuaXNMaXZlICYmICFpc0xpdmUpIHsKICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcih7CiAgICAgICAgICAgICAgICBoYXNBZHM6IGZhbHNlCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pc0xpdmUgPSBpc0xpdmU7CiAgICAgICAgLy8gRm9yY2UgaW1tZWRpYXRlIHRpY2sgd2hlbiB0YWIgYmVjb21lcyB2aXNpYmxlIHNvIHN0YWxscyBhcmUgY2F1Z2h0IGZhc3Qgb24gcmV0dXJuCiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcudmlzaWJpbGl0eUhvb2tlZCkgewogICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnZpc2liaWxpdHlIb29rZWQgPSB0cnVlOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcucGVuZGluZ1RpY2spIHsKICAgICAgICAgICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnBlbmRpbmdUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9uaXRvclBsYXllckJ1ZmZlcmluZy5wZW5kaW5nVGljayA9IGZhbHNlOyBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7IH0sIDEwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBDYXRjaCBwZXJzaXN0ZW50IGFkLWJyZWFrIG92ZXJsYXlzIChlLmcuICJ0YWtpbmcgYW4gYWQgYnJlYWsgLyBzdGljayBhcm91bmQiKQogICAgICAgIC8vIGV2ZW4gYWZ0ZXIgaGFzQWRzIGhhcyB0cmFuc2l0aW9uZWQgdG8gZmFsc2UuIHVwZGF0ZUFkYmxvY2tCYW5uZXIgb25seSBjYWxscwogICAgICAgIC8vIGhpZGVUd2l0Y2hBZE92ZXJsYXlzIGR1cmluZyB0aGUgYWN0aXZlIGFkIGJyZWFrOyBzb21lIG92ZXJsYXlzIGhhdmUgdGhlaXIgb3duCiAgICAgICAgLy8gbGlmZWN5Y2xlIGFuZCBzdGF5IHZpc2libGUgYWZ0ZXJ3YXJkcy4gUnVubmluZyBoZXJlIG9uIGV2ZXJ5IG1vbml0b3IgdGljawogICAgICAgIC8vICgxLTNzIGNhZGVuY2UpIGtlZXBzIHRoZW0gaGlkZGVuIHdpdGhvdXQgYSBkZWRpY2F0ZWQgaW50ZXJ2YWwuCiAgICAgICAgdHJ5IHsgaGlkZVR3aXRjaEFkT3ZlcmxheXMoKTsgfSBjYXRjaCB7fQogICAgICAgIC8vIFZpc2liaWxpdHktYXdhcmUgYmFja29mZjogcG9sbCAzeCBzbG93ZXIgd2hlbiB0YWIgaXMgaGlkZGVuIChidXQgTk9UIGR1cmluZyBQaVAg4oCUIHVzZXIgaXMgc3RpbGwgd2F0Y2hpbmcpCiAgICAgICAgY29uc3Qgc2hvdWxkVGhyb3R0bGUgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmhpZGRlbiAmJiAhZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQ7CiAgICAgICAgY29uc3QgbmV4dERlbGF5ID0gc2hvdWxkVGhyb3R0bGUgPyBQbGF5ZXJCdWZmZXJpbmdEZWxheSAqIDMgOiBQbGF5ZXJCdWZmZXJpbmdEZWxheTsKICAgICAgICBzZXRUaW1lb3V0KG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcsIG5leHREZWxheSk7CiAgICB9CiAgICAvLyBIaWRlIFR3aXRjaCdzIGFkIGJyZWFrIC8gVHVyYm8gcHJvbW8gLyBzdHJlYW0gZGlzcGxheSBhZCBvdmVybGF5cyB3aGVuIHdlJ3JlIGFscmVhZHkgYmxvY2tpbmcgYWRzCiAgICBmdW5jdGlvbiBoaWRlVHdpdGNoQWRPdmVybGF5cygpIHsKICAgICAgICBpZiAoIWNhY2hlZFBsYXllclJvb3REaXYgfHwgIWNhY2hlZFBsYXllclJvb3REaXYuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgICAgICAvLyBIaWRlIHN0cmVhbSBkaXNwbGF5IGFkIChTREEpIHdyYXBwZXIKICAgICAgICBjb25zdCBzZGFFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRlc3Qtc2VsZWN0b3I9InNkYS13cmFwcGVyIl0nKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNkYUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghc2RhRWxlbWVudHNbaV0uZGF0YXNldC50YXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIHNkYUVsZW1lbnRzW2ldLmRhdGFzZXQudGFzSGlkZGVuID0gJyc7CiAgICAgICAgICAgICAgICBzZGFFbGVtZW50c1tpXS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRTZGFIaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VkU2RhSGlkZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSGlkZGVuIFR3aXRjaCBzdHJlYW0gZGlzcGxheSBhZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgaWYgKCFjYWNoZWRQbGF5ZXJSb290RGl2IHx8ICFjYWNoZWRQbGF5ZXJSb290RGl2LmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIGNhY2hlZFBsYXllclJvb3REaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tcGxheWVyJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllclJvb3REaXYgPSBjYWNoZWRQbGF5ZXJSb290RGl2OwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgPSBkYXRhLmlzU3RyaXBwaW5nQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIHBsYXllckJ1ZmZlclN0YXRlLmlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuaGFzQWRzKSB7CiAgICAgICAgICAgICAgICBoaWRlVHdpdGNoQWRPdmVybGF5cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gVHJhdmVyc2UgUmVhY3QncyBmaWJlciB0cmVlIHRvIGZpbmQgVHdpdGNoJ3MgcGxheWVyIGFuZCBwbGF5ZXIgc3RhdGUgaW5zdGFuY2VzCiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgaWYgKCFjYWNoZWRSb290Tm9kZSkgewogICAgICAgICAgICAgICAgY2FjaGVkUm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gY2FjaGVkUm9vdE5vZGU7CiAgICAgICAgICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdCAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCkgewogICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZWFjdFJvb3ROb2RlID09IG51bGwgJiYgcm9vdE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IE9iamVjdC5rZXlzKHJvb3ROb2RlKS5maW5kKHggPT4geC5zdGFydHNXaXRoKCdfX3JlYWN0Q29udGFpbmVyJykgfHwgeC5zdGFydHNXaXRoKCdfX3JlYWN0RmliZXInKSk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlW2NvbnRhaW5lck5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFjdFJvb3ROb2RlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWFjdFJvb3ROb2RlID0gZmluZFJlYWN0Um9vdE5vZGUoKTsKICAgICAgICBpZiAoIXJlYWN0Um9vdE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGxldCBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRQbGF5ZXJBY3RpdmUgJiYgbm9kZS5wcm9wcyAmJiBub2RlLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UpOwogICAgICAgIHBsYXllciA9IHBsYXllciAmJiBwbGF5ZXIucHJvcHMgJiYgcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgPyBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgaWYgKHBsYXllcj8ucGxheWVySW5zdGFuY2UpIHsKICAgICAgICAgICAgcGxheWVyID0gcGxheWVyLnBsYXllckluc3RhbmNlOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCBpZiBUd2l0Y2ggb2JmdXNjYXRlcyBwcm9wZXJ0eSBuYW1lcwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQgJiYgbm9kZS5nZXRCdWZmZXJEdXJhdGlvbiAmJiBub2RlLmNvcmU/LnN0YXRlKTsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2gg4oCUIHNldFNyYyBleGlzdHMgYnV0IHNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzIHdhcyByZW5hbWVkCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjayA9ICFwbGF5ZXJTdGF0ZSA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldFN0cmVhbU1hbmFnZXJOb2RlICYmICFub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQpIDogbnVsbDsKICAgICAgICAvLyBGYWxsYmFjayAyOiBUVFYtQUIncyBhcHByb2FjaCDigJQgdmlkZW9QbGF5ZXJJbnN0YW5jZSB3aXRoIHBsYXllck1vZGUKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMiA9ICFwbGF5ZXJTdGF0ZSAmJiAhcGxheWVyU3RhdGVGYWxsYmFjayA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlPy5wbGF5ZXJNb2RlICE9PSB1bmRlZmluZWQpPy5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgY29uc3QgZmluYWxQbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlIHx8IHBsYXllclN0YXRlRmFsbGJhY2sgfHwgcGxheWVyU3RhdGVGYWxsYmFjazI7CiAgICAgICAgLy8gR3JhY2UgcGVyaW9kIGJlZm9yZSBsb2dnaW5nICJub3QgZm91bmQiIHdhcm5pbmdzLiBUaGUgYnVmZmVyIG1vbml0b3IgY2FuIHRpY2sKICAgICAgICAvLyBiZWZvcmUgUmVhY3QgaGFzIGZpbmlzaGVkIG1vdW50aW5nIHRoZSBwbGF5ZXIsIGxlYWRpbmcgdG8gYSBmYWxzZS1wb3NpdGl2ZQogICAgICAgIC8vIGxvZyB0aGF0IGZpcmVzIG9uY2Ugb24gZXZlcnkgcGFnZSBsb2FkLiBPbmx5IGxvZyBpZiB0aGUgbnVsbCBzdGF0ZSBwZXJzaXN0cwogICAgICAgIC8vIGZvciAxMCsgc2Vjb25kcyDigJQgYnkgdGhlbiBSZWFjdCBpcyBkZWZpbml0ZWx5IG1vdW50ZWQgYW5kIGEgcGVyc2lzdGVudCBudWxsCiAgICAgICAgLy8gaW5kaWNhdGVzIHJlYWwgQVBJIGRyaWZ0IChUd2l0Y2ggcmVuYW1lZCBzZXRQbGF5ZXJBY3RpdmUvc2V0U3JjL2V0YykuCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgaWYgKCFnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCkgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyICYmIChEYXRlLm5vdygpIC0gZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQpID4gMTAwMDApIHsKICAgICAgICAgICAgICAgIGdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFBsYXllckFjdGl2ZS9tZWRpYVBsYXllckluc3RhbmNlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIGlmICghZmluYWxQbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQpIGdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vU3RhdGUgJiYgKERhdGUubm93KCkgLSBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFN0YXRlTnVsbEF0KSA+IDEwMDAwKSB7CiAgICAgICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5sb2dnZWROb1N0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBzdGF0ZSBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFNyYy9zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncycpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RTdGF0ZU51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgLy8gUGF1c2UvcGxheSBvciBmdWxseSByZWxvYWQgdGhlIFR3aXRjaCBwbGF5ZXIsIHByZXNlcnZpbmcgcXVhbGl0eS92b2x1bWUgc2V0dGluZ3MKICAgIGZ1bmN0aW9uIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQsIHJlbG9hZEtpbmQpIHsKICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgaWYgKCFwbGF5ZXJBbmRTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcmVhY3Qgcm9vdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckFuZFN0YXRlLnBsYXllcjsKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IHBsYXllckFuZFN0YXRlLnN0YXRlOwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXInKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXBsYXllclN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXIgc3RhdGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB3YXNQYXVzZWQgPSBwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkOwogICAgICAgIGlmICh3YXNQYXVzZWQpIHsKICAgICAgICAgICAgLy8gVXNlciBkZWxpYmVyYXRlbHkgcGF1c2VkIOKAlCByZXNwZWN0IHRoZWlyIGludGVudCwgZG9uJ3QgYXV0by1yZXN1bWUKICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZXNwZWN0aW5nIHVzZXIgcGF1c2UgaW50ZW50IOKAlCBza2lwcGluZyBhdXRvLXJlc3VtZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIFdFIHJlY2VudGx5IGNhbGxlZCBwYXVzZS9wbGF5IGFuZCBwbGF5ZXIgaXMgc3RpbGwgcGF1c2VkLCByZXRyeSBwbGF5IChzdHVjayBmcm9tIGF1dG9wbGF5IHBvbGljeSBvciBhZC1zdGF0ZSBpbnRlcmZlcmVuY2UpCiAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQpIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXdhc1BhdXNlZCkgewogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgPSAwOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQgJiYgZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQpIHsKICAgICAgICAgICAgLy8gU2tpcCByZWxvYWQgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IGhlYWx0aHkg4oCUIGF2b2lkcyBkaXNydXB0aW5nIHNtb290aCBwbGF5YmFjay4KICAgICAgICAgICAgLy8gQnV0IGlmIHdlJ3JlIHdheSBiZWhpbmQgbGl2ZSBlZGdlIChlLmcuIGFmdGVyIGEgbG9uZyBhZCBicmVhayksIHByb2NlZWQgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeS4KICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5yZWFkeVN0YXRlID49IDMgJiYgIXZpZGVvLnBhdXNlZCAmJiAhdmlkZW8uZW5kZWQpIHsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5U2VjID0gMDsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5S25vd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLnNlZWthYmxlICYmIHZpZGVvLnNlZWthYmxlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vla2FibGVFbmQgPSB2aWRlby5zZWVrYWJsZS5lbmQodmlkZW8uc2Vla2FibGUubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoc2Vla2FibGVFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxjID0gTWF0aC5tYXgoMCwgc2Vla2FibGVFbmQgLSB2aWRlby5jdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2FwOiB2YWx1ZXMgPjFoIGluZGljYXRlIGdhcmJhZ2UgZnJvbSB0aGUgTWVkaWEgU291cmNlIEFQSQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHNlZW4gcmlnaHQgYWZ0ZXIgYSByZWxvYWQgd2hpbGUgdGhlIHNlZWthYmxlIHJhbmdlIGlzIGluIGEgdHJhbnNpZW50IHN0YXRlKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxjIDwgMzYwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lTZWMgPSBjYWxjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lLbm93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgaWYgKCFsYXRlbmN5S25vd24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBMYXRlbmN5IHVua25vd24gKHNlZWthYmxlIHVuYXZhaWxhYmxlKSDigJQgcHJvY2VlZGluZyB3aXRoIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXRlbmN5U2VjID4gNykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBwbGF5aW5nIGJ1dCAnICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kIGxpdmUg4oCUIHByb2NlZWRpbmcgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeScpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIHBsYXllciBoZWFsdGh5IChyZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJywgcGxheWluZywgbGF0ZW5jeT0nICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MpJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1JlbG9hZCkgewogICAgICAgICAgICBjb25zdCBsc0tleVF1YWxpdHkgPSAndmlkZW8tcXVhbGl0eSc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5TXV0ZWQgPSAndmlkZW8tbXV0ZWQnOwogICAgICAgICAgICBjb25zdCBsc0tleVZvbHVtZSA9ICd2b2x1bWUnOwogICAgICAgICAgICBsZXQgY3VycmVudFF1YWxpdHlMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50TXV0ZWRMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50Vm9sdW1lTFMgPSBudWxsOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY3VycmVudFF1YWxpdHlMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5UXVhbGl0eSk7CiAgICAgICAgICAgICAgICBjdXJyZW50TXV0ZWRMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TXV0ZWQpOwogICAgICAgICAgICAgICAgY3VycmVudFZvbHVtZUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlWb2x1bWUpOwogICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgJiYgcGxheWVyPy5jb3JlPy5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBwbGF5ZXIuY29yZS5zdGF0ZS52b2x1bWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlRdWFsaXR5LCBKU09OLnN0cmluZ2lmeSh7ZGVmYXVsdDpwbGF5ZXIuY29yZS5zdGF0ZS5xdWFsaXR5Lmdyb3VwfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmFkU3RhbGxTdGFydEF0ID0gMDsvLyBjbGVhciBzdGFsZSBzdGFsbCB0aW1lciBzbyBwb3N0LXJlbG9hZCByZWFkeVN0YXRlPTAgaXNuJ3QgYXR0cmlidXRlZCB0byBwcmUtcmVsb2FkIHN0YWxsCiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCA9IGZhbHNlOwogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCA9IGZhbHNlOwogICAgICAgICAgICAvLyBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nIHJlLWFjcXVpcmVkIGZyZXNoIGV2ZXJ5IHRpY2sg4oCUIG5vIG1hbnVhbCBpbnZhbGlkYXRpb24gbmVlZGVkCiAgICAgICAgICAgIC8vIEhhcmQgcmVsb2FkIGZvciAnZWFybHknIChtaWQtYnJlYWsgZXNjYXBlIOKAlCBmcmVzaCBzZXNzaW9uIGdldHMgbmV3IGFkLWRlY2lzaW9uIGJ1Y2tldCkuCiAgICAgICAgICAgIC8vIFNvZnQgcmVsb2FkIGZvciAncG9zdC1hZCcgKHNtb290aCB0cmFuc2l0aW9uLCBubyBibGFjayBzY3JlZW4gdGVhcmRvd24pLgogICAgICAgICAgICBjb25zdCBoYXJkUmVsb2FkID0gcmVsb2FkS2luZCA9PT0gJ2Vhcmx5JzsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlbG9hZGluZyBUd2l0Y2ggcGxheWVyJyArIChoYXJkUmVsb2FkID8gJyAoaGFyZCknIDogJyAoc29mdCknKSk7CiAgICAgICAgICAgIHBsYXllclN0YXRlLnNldFNyYyh7IGlzTmV3TWVkaWFQbGF5ZXJJbnN0YW5jZTogaGFyZFJlbG9hZCwgcmVmcmVzaEFjY2Vzc1Rva2VuOiBoYXJkUmVsb2FkIH0pOwogICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVHJpZ2dlcmVkUGxheWVyUmVsb2FkJyk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICAvLyBBbHdheXMgcmVzdG9yZSBtdXRlZC92b2x1bWUgc3RhdGUgYWZ0ZXIgcmVsb2FkIOKAlCBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBmb3JjZSBtdXRlZC4KICAgICAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgICAgICAvLyBjbGVhcmVkIGNhY2hlKSwgdGhlIHZpZGVvIHN0aWxsIG5lZWRzIHVubXV0ZSBhZnRlciBDaHJvbWUncyBhdXRvcGxheSBtdXRlIG9uIHJlbG9hZC4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWFsaXR5TFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNdXRlZExTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWVMUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCB3cml0ZXMgdmlkZW8tbXV0ZWQgYXMgJ3siZGVmYXVsdCI6dHJ1ZX0nIHdoZW4gdXNlciBtdXRlZCB2aWEgVUk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENocm9tZSBhdXRvcGxheSBwb2xpY3kgY2FuIG11dGUgZXZlbiBpZiB1c2VyIGRpZG4ndCAobm8gTFMgc2lnbmFsKS4KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLm11dGVkICYmICF1c2VySW50ZW5kZWRNdXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0ubXV0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IGxpdmUgZHJpZnQgYWZ0ZXIgcmVsb2FkLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgaGFyZCByZWxvYWQgd2l0aCBsYXJnZSBkcmlmdCAoPjVzKSwgaGFyZC1zZWVrIHRvIGxpdmUgZWRnZSB0byBmbHVzaAogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgQS9WIHRpbWVzdGFtcCBkZXN5bmMgZnJvbSBzdHJpcCtCTEFOS19NUDQrcmVjb3ZlcnkgYWN0aXZpdHkuIERyaWZ0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Rpb24gYXQgMS4xeCB3b3VsZCB0YWtlIG1pbnV0ZXMgdG8gY2F0Y2ggdXAgMzAtNjBzIG9mIGRyaWZ0LgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igc29mdCByZWxvYWQgb3Igc21hbGwgZHJpZnQsIHVzZSBleGlzdGluZyBncmFkdWFsIGNhdGNoLXVwLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLmJ1ZmZlcmVkLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLnJlYWR5U3RhdGUgPj0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGl2ZUVkZ2UgPSB2aWRlb3NbMF0uYnVmZmVyZWQuZW5kKHZpZGVvc1swXS5idWZmZXJlZC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyaWZ0ID0gbGl2ZUVkZ2UgLSB2aWRlb3NbMF0uY3VycmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFyZFJlbG9hZCAmJiBkcmlmdCA+IDUgJiYgTnVtYmVyLmlzRmluaXRlKGxpdmVFZGdlKSAmJiBsaXZlRWRnZSA8IDM2MDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LWhhcmQtcmVsb2FkIHNlZWsgdG8gbGl2ZSDigJQgJyArIGRyaWZ0LnRvRml4ZWQoMSkgKyAncyBiZWhpbmQsIGp1bXBpbmcgdG8gbGl2ZSBlZGdlIHRvIGZsdXNoIEEvViBkcmlmdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5jdXJyZW50VGltZSA9IGxpdmVFZGdlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkcmlmdCA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LXJlbG9hZCBsaXZlIGRyaWZ0IGNvcnJlY3Rpb246ICcgKyBkcmlmdC50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREcmlmdENvcnJlY3Rpb24odmlkZW9zWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIH0sIDMwMDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gKCkgPT4gewogICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSk7CiAgICB9OwogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCBmZXRjaFJlcXVlc3Qub3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICAvLyBIb29rIGZldGNoKCkgaW4gdGhlIHdpbmRvdyBzY29wZSB0byBjYXB0dXJlIGF1dGggaGVhZGVycyBhbmQgbW9kaWZ5IHBsYXllciB0eXBlIHJlcXVlc3RzCiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0LCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBHUUxEZXZpY2VJRCAhPSBkZXZpY2VJZCkgewogICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlRGV2aWNlSWQnLCBHUUxEZXZpY2VJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1WZXJzaW9uJ10gIT09IENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uID0gaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXSAhPT0gQ2xpZW50U2Vzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50U2Vzc2lvbicsIENsaWVudFNlc3Npb24gPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSAhPT0gQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInLCBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddICE9PSBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWRIZWFkZXJzICYmIEdRTERldmljZUlEICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChHUUxEZXZpY2VJRCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VkUGxheWVyVHlwZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gSlNPTi5wYXJzZShpbml0LmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdCb2R5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVwbGFjZWQgJyR7cmVwbGFjZWRQbGF5ZXJUeXBlfScgcGxheWVyIHR5cGUgd2l0aCAnJHtGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZX0nIHBsYXllciB0eXBlYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NhaVR5cGUgPSB1cmwuaW5jbHVkZXMoJ2JwPW1pZHJvbGwnKSA/ICdtaWRyb2xsJyA6IHVybC5pbmNsdWRlcygnYnA9cHJlcm9sbCcpID8gJ3ByZXJvbGwnIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyhjc2FpVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZChjc2FpVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgYWQgcmVxdWVzdCBkZXRlY3RlZCDigJQgdHlwZTogJyArIGNzYWlUeXBlICsgJyAoY2xpZW50LXNpZGUgYWQgaW5zZXJ0aW9uLCBub3QgYmxvY2thYmxlIHZpYSBtM3U4KScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwgJ2ZldGNoJyk7CiAgICB9CiAgICAvLyBTZXQgdXAgdmlzaWJpbGl0eSBvdmVycmlkZXMgYW5kIGxvY2FsU3RvcmFnZSBob29rcyB0byBwcmVzZXJ2ZSBwbGF5ZXIgc3RhdGUgYWNyb3NzIHJlbG9hZHMKICAgIGZ1bmN0aW9uIG9uQ29udGVudExvYWRlZCgpIHsKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldmVudHYtZXh0ZW5zaW9uJykpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2FybmluZzogN1RWIGV4dGVuc2lvbiBkZXRlY3RlZCDigJQgbWF5IGNhdXNlIGJsYWNrIHNjcmVlbiBvciBidWZmZXJpbmcgaXNzdWVzLiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcywgdHJ5IGRpc2FibGluZyA3VFYuJyk7CiAgICAgICAgfQogICAgICAgIC8vIFRoaXMgc3RvcHMgVHdpdGNoIGZyb20gcGF1c2luZyB0aGUgcGxheWVyIHdoZW4gaW4gYW5vdGhlciB0YWIgYW5kIGFuIGFkIHNob3dzLgogICAgICAgIC8vIFRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhdWNldHR2L1ZpZGVvQWRCbG9ja0ZvclR3aXRjaC9ibG9iL2NlZmNlOWQyYjU2NTc2OWM3N2UzNjY2YWM4MjM0YzNhY2ZlMjBkODMvY2hyb21lL2NvbnRlbnQuanMjTDMwCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAndmlzaWJpbGl0eVN0YXRlJywgewogICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAndmlzaWJsZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgbGV0IGhpZGRlbiA9IGRvY3VtZW50Ll9fbG9va3VwR2V0dGVyX18oJ2hpZGRlbicpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2hpZGRlbicsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgY29uc3QgYmxvY2sgPSBlID0+IHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIH07CiAgICAgICAgbGV0IHdhc1ZpZGVvUGxheWluZyA9IHRydWU7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eUNoYW5nZSA9IGUgPT4gewogICAgICAgICAgICBjb25zdCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoaGlkZGVuICYmIGhpZGRlbi5hcHBseShkb2N1bWVudCkgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICB3YXNWaWRlb1BsYXlpbmcgPSAhdmlkZW9zWzBdLnBhdXNlZCAmJiAhdmlkZW9zWzBdLmVuZGVkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnVGFiIGZvY3VzZWQuIFN0cmVhbSBzaG91bGQgYmUgYWN0aXZlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0ucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmxvY2soZSk7CiAgICAgICAgfTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgdHJ5IHsgZG9jdW1lbnQuaGFzRm9jdXMgPSAoKSA9PiB0cnVlOyB9IGNhdGNoe30KICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBkZWNsYXJlT3B0aW9ucyh3aW5kb3cpOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBsc1JlbG9hZEFmdGVyQWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkUGxheWVyQWZ0ZXJBZCcpOwogICAgICAgIGlmIChsc1JlbG9hZEFmdGVyQWQgIT09IG51bGwpIHsKICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IGxzUmVsb2FkQWZ0ZXJBZCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc1JlbG9hZENvb2xkb3duID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZENvb2xkb3duU2Vjb25kcycpKTsKICAgICAgICBpZiAoIWlzTmFOKGxzUmVsb2FkQ29vbGRvd24pICYmIGxzUmVsb2FkQ29vbGRvd24gPj0gMCkgewogICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSBsc1JlbG9hZENvb2xkb3duOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVSZWxvYWRDYXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcCcpOwogICAgICAgIGlmIChsc0Rpc2FibGVSZWxvYWRDYXAgIT09IG51bGwpIHsKICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9IGxzRGlzYWJsZVJlbG9hZENhcCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0RyaWZ0UmF0ZSA9IHBhcnNlRmxvYXQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2RyaWZ0Q29ycmVjdGlvblJhdGUnKSk7CiAgICAgICAgaWYgKCFpc05hTihsc0RyaWZ0UmF0ZSkgJiYgbHNEcmlmdFJhdGUgPj0gMCkgewogICAgICAgICAgICBEcmlmdENvcnJlY3Rpb25SYXRlID0gbHNEcmlmdFJhdGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGxheWVyVHlwZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19wbGF5ZXJUeXBlJyk7CiAgICAgICAgaWYgKGxzUGxheWVyVHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9IGxzUGxheWVyVHlwZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQaW5CYWNrdXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcGluQmFja3VwUGxheWVyVHlwZScpOwogICAgICAgIGlmIChsc1BpbkJhY2t1cCAhPT0gbnVsbCkgewogICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gbHNQaW5CYWNrdXAgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQcmVmZXJMb3cgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcHJlZmVyTG93UXVhbGl0eUJhY2t1cCcpOwogICAgICAgIGlmIChsc1ByZWZlckxvdyA9PT0gJ2ZhbHNlJykgewogICAgICAgICAgICBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgc3RpY2t5IENTQUkgcGF0aCBvbmx5LCBubyBhdXRvcGxheSBmYWxsYmFjayBvciBlc2NhcGUgaGF0Y2gnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNCYWNrdXBTd2FwRmlyc3QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfYmFja3VwU3dhcEZpcnN0Jyk7CiAgICAgICAgaWYgKGxzQmFja3VwU3dhcEZpcnN0ID09PSAnZmFsc2UnKSB7CiAgICAgICAgICAgIEJhY2t1cFN3YXBGaXJzdCA9IGZhbHNlOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXBTd2FwRmlyc3QgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgdXNpbmcgc3RpY2t5IENTQUkgcGF0aCAoc3RyaXAgb24gbmF0aXZlIHN0cmVhbSknKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNIaWRlQWRPdmVybGF5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2hpZGVBZE92ZXJsYXknKTsKICAgICAgICBpZiAobHNIaWRlQWRPdmVybGF5ID09PSAndHJ1ZScpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9ICcudGFzLWFkYmxvY2stb3ZlcmxheSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSc7CiAgICAgICAgICAgIChkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgIH0KICAgIH0gY2F0Y2gge30KICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENvbmZpZzogUmVsb2FkUGxheWVyQWZ0ZXJBZCA9ICcgKyBSZWxvYWRQbGF5ZXJBZnRlckFkICsgJywgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgPSAnICsgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIGlmIChQbGF5ZXJCdWZmZXJpbmdGaXgpIHsKICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7CiAgICB9CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbWV0ZXIgcmVxdWlyZWQgKDAgPSBubyBzaW11bGF0ZWQgYWQsIDErID0gdXNlIGJhY2t1cCBwbGF5ZXIgZm9yIGdpdmVuIGRlcHRoKScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdTaW11bGF0ZUFkcycsIGRlcHRoKTsKICAgIH07CiAgICB3aW5kb3cuYWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gKCkgPT4gewogICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMnKTsKICAgIH07Cn0pKCk7Cg=="},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIGluc3RhbmNlCiAgICAvLyB0aGF0IGZpZ2h0cyBmb3IgcGxheWVyIGNvbnRyb2wuIE9ubHkgdGhlIHRvcCBmcmFtZSBob3N0cyB0aGUgcGxheWVyIG9uIHR3aXRjaC50di9DSEFOTkVMOwogICAgLy8gbmVzdGVkIGF1eGlsaWFyeSBmcmFtZXMgYXJlIG5vaXNlLgogICAgLy8gQWxsb3ctbGlzdCBmb3IgbmVzdGVkLWZyYW1lIGluamVjdGlvbjogVHdpdGNoJ3MgdGhyZWUgZG9jdW1lbnRlZCBlbWJlZCBjb250ZXh0cwogICAgLy8gKGh0dHBzOi8vZGV2LnR3aXRjaC50di9kb2NzL2VtYmVkL3ZpZGVvLWFuZC1jbGlwcy8pIOKAlCBwcmVzZXJ2ZXMgVHdpdGNoIHN0cmVhbXMKICAgIC8vIGVtYmVkZGVkIG9uIHRoaXJkLXBhcnR5IHNpdGVzIHdoZXJlIHRoZSBzY3JpcHQgcnVucyBpbiBhbiBpZnJhbWUgd2hvc2UgcGFyZW50CiAgICAvLyBpcyBvbiBhIGRpZmZlcmVudCBvcmlnaW4uCiAgICAvLyBVc2Ugd2luZG93LmZyYW1lRWxlbWVudCB0byBkZXRlY3QgbmVzdGVkIGZyYW1lcyDigJQgbnVsbCBvbiB0b3AgZnJhbWUsIHRoZSBpZnJhbWUKICAgIC8vIGVsZW1lbnQgb24gYSBzYW1lLW9yaWdpbiBuZXN0ZWQgZnJhbWUsIHRocm93cyBvbiBhIGNyb3NzLW9yaWdpbiBuZXN0ZWQgZnJhbWUuCiAgICAvLyBNb3JlIHJlbGlhYmxlIHRoYW4gJ3dpbmRvdyAhPT0gd2luZG93LnRvcCcgYmVjYXVzZSBUYW1wZXJtb25rZXkgd3JhcHMgd2luZG93IGluIGEKICAgIC8vIHByb3h5IHdoZXJlIHRoZSBzdHJpY3QgY29tcGFyaXNvbiBjYW4gcmV0dXJuIHRydWUgZXZlbiBvbiB0aGUgdG9wIGZyYW1lLgogICAgbGV0IF9pc05lc3RlZCA9IGZhbHNlOwogICAgdHJ5IHsgX2lzTmVzdGVkID0gd2luZG93LmZyYW1lRWxlbWVudCAhPT0gbnVsbDsgfSBjYXRjaCAoX2UpIHsgX2lzTmVzdGVkID0gdHJ1ZTsgfQogICAgaWYgKF9pc05lc3RlZCkgewogICAgICAgIGNvbnN0IF9ob3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2lzRW1iZWRDb250ZXh0ID0gX2hvc3QgPT09ICdwbGF5ZXIudHdpdGNoLnR2JyB8fCBfaG9zdCA9PT0gJ2VtYmVkLnR3aXRjaC50dicgfHwgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2VtYmVkLycpOwogICAgICAgIGlmICghX2lzRW1iZWRDb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZpZGVvLXN3YXAtbmV3IHNraXBwZWQg4oCUIG5lc3RlZCBmcmFtZSBvbiAnICsgX2hvc3QgKyBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSArICcgKG5vdCBhIFR3aXRjaCBlbWJlZCkuIElmIHlvdSBzZWUgdGhpcyBvbiB0d2l0Y2gudHYvQ0hBTk5FTCB0b3AgZnJhbWUsIHBsZWFzZSByZXBvcnQuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSA0NzsvLyBVc2VkIHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3V0ZGF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNjcmlwdHMKICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFR3aXRjaEFkU29sdXRpb25zIHZpZGVvLXN3YXAtbmV3IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZpZGVvLXN3YXAtbmV3IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBza2lwcGVkIOKAlCBhbm90aGVyIHNjcmlwdCBhbHJlYWR5IGFjdGl2ZSAodicgKyB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJykuIFJlbW92ZSBkdXBsaWNhdGUgc2NyaXB0cy4nKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uOwogICAgZnVuY3Rpb24gZGVjbGFyZU9wdGlvbnMoc2NvcGUpIHsKICAgICAgICAvLyBPcHRpb25zIC8gZ2xvYmFscwogICAgICAgIC8vICdlbWJlZCcgbW92ZWQgdG8gZW5kIOKAlCBmaWVsZC1vYnNlcnZlZCBUd2l0Y2ggcmV0dXJucyBHUUwgJ3NlcnZlciBlcnJvcicgZm9yCiAgICAgICAgLy8gc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBvbiBlbWJlZCB3aGVuIHJlcXVlc3RlZCBmcm9tIHR3aXRjaC50diBvcmlnaW4uCiAgICAgICAgc2NvcGUuT1BUX0JBQ0tVUF9QTEFZRVJfVFlQRVMgPSBbICdwb3BvdXQnLCAnbW9iaWxlX3dlYicsICdlbWJlZCcgXTsKICAgICAgICBzY29wZS5PUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFID0gJ3BvcG91dCc7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guCiAgICAgICAgc2NvcGUuQURfU0lHTklGSUVSUyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIiddOwogICAgICAgIHNjb3BlLkFEX1NFR01FTlRfVVJMX1BBVFRFUk5TID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24uCiAgICAgICAgc2NvcGUuVFdJVENIX0FEX1VSTF9SRVdSSVRFX1JFR0VYID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVVJJX0FUVFJJQlVURV9SRUdFWCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5MSVZFX1NJR05JRklFUiA9ICcsbGl2ZSc7CiAgICAgICAgc2NvcGUuQ0xJRU5UX0lEID0gJ2tpbW5lNzhreDNuY3g2YnJnbzRtdjZ3a2k1aDFrbyc7CiAgICAgICAgLy8gVGhlc2UgYXJlIG9ubHkgcmVhbGx5IGZvciBXb3JrZXIgc2NvcGUuLi4KICAgICAgICBzY29wZS5TdHJlYW1JbmZvcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3NCeVVybCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgLy8gTmVlZCB0aGlzIGluIGJvdGggc2NvcGVzLiBXaW5kb3cgc2NvcGUgbmVlZHMgdG8gdXBkYXRlIHRoaXMgdG8gd29ya2VyIHNjb3BlLgogICAgICAgIHNjb3BlLmdxbF9kZXZpY2VfaWQgPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudEludGVncml0eUhlYWRlciA9IG51bGw7CiAgICAgICAgc2NvcGUuQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZDsKICAgICAgICBzY29wZS5TaW11bGF0ZWRBZHNEZXB0aCA9IDA7CiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IHRydWU7Ly8gQWZ0ZXIgdGhlIGFkIGZpbmlzaGVzIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5SZWxvYWRDb29sZG93blNlY29uZHMgPSAzMDsvLyBNaW5pbXVtIHNlY29uZHMgYmV0d2VlbiByZWxvYWRzIOKAlCBicmVha3MgQ1NBSSBjYXNjYWRlcyB0cmlnZ2VyZWQgYnkgcmVsb2FkCiAgICAgICAgc2NvcGUuRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gNTsvLyBBbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIGVhcmx5IHJlbG9hZCAofjJzIGVhY2gsIHNvIDUgPSB+MTBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gZmFsc2U7Ly8gSWYgdHJ1ZSwgcmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvTWF4QWdlTXMgPSAzMCAqIDYwICogMTAwMDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIEVuY29kaW5nczogbnVsbCwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzOiBudWxsLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NTdGF0dXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4OiAtMSwKICAgICAgICAgICAgUGlubmVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgSGFzQ2hlY2tlZFVua25vd25UYWdzOiBmYWxzZSwKICAgICAgICAgICAgSGFzQ29uZmlybWVkQWRBdHRyczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICAgICAgSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3M6IGZhbHNlLAogICAgICAgICAgICBJc01pZHJvbGw6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIENsZWFuUGxheWxpc3RDb3VudDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3M6IDAsCiAgICAgICAgICAgIFVzZUZhbGxiYWNrU3RyZWFtOiBmYWxzZSwKICAgICAgICAgICAgTGFzdENsZWFuTmF0aXZlTTNVODogbnVsbCwKICAgICAgICAgICAgTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZFRyaWdnZXJlZDogZmFsc2UsCiAgICAgICAgICAgIExhc3RQbGF5ZXJSZWxvYWQ6IDAsCiAgICAgICAgICAgIFJlbG9hZFRpbWVzdGFtcHM6IFtdLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBtYXNrQXNOYXRpdmUoZm4sIG5hbWUpIHsKICAgICAgICBmbi50b1N0cmluZyA9ICgpID0+ICdmdW5jdGlvbiAnICsgbmFtZSArICcoKSB7IFtuYXRpdmUgY29kZV0gfSc7CiAgICAgICAgcmV0dXJuIGZuOwogICAgfQogICAgZnVuY3Rpb24gcHJ1bmVTdHJlYW1JbmZvcygpIHsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIGZvciAoY29uc3QgY2hhbm5lbE5hbWUgaW4gU3RyZWFtSW5mb3MpIHsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLkxhc3RTZWVuQXQgfHwgKG5vdyAtIHN0cmVhbUluZm8uTGFzdFNlZW5BdCkgPiBTdHJlYW1JbmZvTWF4QWdlTXMpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvICYmIHN0cmVhbUluZm8uVXJscykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJscy5mb3JFYWNoKChfLCB1cmwpID0+IHsgZGVsZXRlIFN0cmVhbUluZm9zQnlVcmxbdXJsXTsgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWxldGUgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY29uc3QgbG9nZ2VkQ3NhaVR5cGVzID0gbmV3IFNldCgpOwogICAgbGV0IHR3aXRjaFBsYXllckFuZFN0YXRlID0gbnVsbDsKICAgIGxldCBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gZmFsc2U7CiAgICBsZXQgbGFzdFJlbG9hZFRpbWVzdGFtcCA9IDA7CiAgICBsZXQgcmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgbGV0IEVzY2FsYXRlZEZyb21Db29sZG93biA9IG51bGw7Ly8gdHJhY2tzIHByZS1lc2NhbGF0aW9uIHZhbHVlIHNvIHdlIGNhbiByZXZlcnQgd2hlbiB0aGUgYnVyc3Qgc3Vic2lkZXMKICAgIGNvbnN0IHR3aXRjaFdvcmtlcnMgPSBbXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0NvbmZsaWN0cyA9IFsKICAgICAgICAndHdpdGNoJywKICAgICAgICAnaXNWYXJpYW50QScvLyBUd2l0Y2hOb1N1YgogICAgXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0FsbG93ID0gW107CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkgJiYgIXdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocGFyZW50LCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOwogICAgICAgICAgICBwYXJlbnQgPSByZWluc2VydFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVmFsaWRXb3JrZXIod29ya2VyKSB7CiAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gd29ya2VyLnRvU3RyaW5nKCk7CiAgICAgICAgY29uc3QgaGFzQ29uZmxpY3QgPSB3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBjb25zdCBoYXNBbGxvdyA9IHdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgY29uc3QgaGFzUmVpbnNlcnQgPSB3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGlmIChoYXNDb25mbGljdCAmJiAhaGFzQWxsb3cgJiYgIWhhc1JlaW5zZXJ0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciByZWplY3RlZCDigJQgY29uZmxpY3Qgc3RyaW5nIGZvdW5kOiAnICsgd29ya2VyU3RyaW5nQ29uZmxpY3RzLmZpbHRlcigoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKS5qb2luKCcsICcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFoYXNDb25mbGljdCB8fCBoYXNBbGxvdyB8fCBoYXNSZWluc2VydDsKICAgIH0KICAgIGxldCBpbmplY3RlZEJsb2JVcmwgPSBudWxsOwogICAgZnVuY3Rpb24gaG9va1dpbmRvd1dvcmtlcigpIHsKICAgICAgICAvLyBQcmV2ZW50IFR3aXRjaCBmcm9tIHJldm9raW5nIG91ciBpbmplY3RlZCB3b3JrZXIgYmxvYiBVUkwKICAgICAgICBpZiAoIVVSTC5yZXZva2VPYmplY3RVUkwuX190YXNNYXNrZWQpIHsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwgPSBVUkwucmV2b2tlT2JqZWN0VVJMOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICAgICAgaWYgKHVybCA9PT0gaW5qZWN0ZWRCbG9iVXJsKSByZXR1cm47CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxSZXZva2VPYmplY3RVUkwuY2FsbCh0aGlzLCB1cmwpOwogICAgICAgICAgICB9LCAncmV2b2tlT2JqZWN0VVJMJyk7CiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwuX190YXNNYXNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWluc2VydCA9IGdldFdvcmtlcnNGb3JSZWluc2VydCh3aW5kb3cuV29ya2VyKTsKICAgICAgICBjb25zdCBuZXdXb3JrZXIgPSBjbGFzcyBXb3JrZXIgZXh0ZW5kcyAoZ2V0Q2xlYW5Xb3JrZXIod2luZG93LldvcmtlcikgfHwgd2luZG93LldvcmtlcikgewogICAgICAgICAgICBjb25zdHJ1Y3Rvcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBsZXQgaXNUd2l0Y2hXb3JrZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaXNUd2l0Y2hXb3JrZXIgPSBuZXcgVVJMKHR3aXRjaEJsb2JVcmwpLm9yaWdpbi5lbmRzV2l0aCgnLnR3aXRjaC50dicpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFpc1R3aXRjaFdvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5vbi1Ud2l0Y2ggd29ya2VyIHNraXBwZWQ6ICcgKyB0d2l0Y2hCbG9iVXJsKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBQcmUtY2hlY2s6IHZlcmlmeSB3ZSBjYW4gZmV0Y2ggdGhlIHdvcmtlciBKUyBiZWZvcmUgaW5qZWN0aW5nCiAgICAgICAgICAgICAgICBsZXQgcHJlZmV0Y2hlZFdvcmtlckpzID0gbnVsbDsKICAgICAgICAgICAgICAgIHRyeSB7IHByZWZldGNoZWRXb3JrZXJKcyA9IGdldFdhc21Xb3JrZXJKcyh0d2l0Y2hCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFwcmVmZXRjaGVkV29ya2VySnMpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYWlsZWQgdG8gZmV0Y2ggd29ya2VyIEpTIOKAlCBmYWxsaW5nIGJhY2sgdG8gdW5tb2RpZmllZCB3b3JrZXInKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgaW50ZXJjZXB0ZWQg4oCUIGluamVjdGluZyBhZC1ibG9jayBob29rcycpOwogICAgICAgICAgICAgICAgY29uc3QgbmV3QmxvYlN0ciA9IGAKICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nRmV0Y2hSZXF1ZXN0cyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICAke2hhc0FkVGFncy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0TWF0Y2hlZEFkU2lnbmlmaWVycy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c3RyaXBBZFNlZ21lbnRzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwcm9jZXNzTTNVOC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7aG9va1dvcmtlckZldGNoLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtkZWNsYXJlT3B0aW9ucy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0QWNjZXNzVG9rZW4udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dxbFJlcXVlc3QudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3BhcnNlQXR0cmlidXRlcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c2V0U3RyZWFtSW5mb1VybHMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke29uRm91bmRBZC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0V2FzbVdvcmtlckpzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3JlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHt1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwcnVuZVN0cmVhbUluZm9zLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtjcmVhdGVTdHJlYW1JbmZvLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gZ2V0V2FzbVdvcmtlckpzKCcke3R3aXRjaEJsb2JVcmwucmVwbGFjZUFsbCgiJyIsICIlMjciKX0nKTsKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlT3B0aW9ucyhzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuX190YXNQcnVuZUludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX190YXNQcnVuZUludGVydmFsID0gc2V0SW50ZXJ2YWwocHJ1bmVTdHJlYW1JbmZvcywgNSAqIDYwICogMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSAke1JlbG9hZFBsYXllckFmdGVyQWR9OwogICAgICAgICAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9ICR7UmVsb2FkQ29vbGRvd25TZWNvbmRzfTsKICAgICAgICAgICAgICAgICAgICBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSAke0Vhcmx5UmVsb2FkUG9sbFRocmVzaG9sZH07CiAgICAgICAgICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9ICR7UGluQmFja3VwUGxheWVyVHlwZX07CiAgICAgICAgICAgICAgICAgICAgT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSA9ICcke09QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEV9JzsKICAgICAgICAgICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gJHtncWxfZGV2aWNlX2lkID8gIiciICsgZ3FsX2RldmljZV9pZCArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSAke0F1dGhvcml6YXRpb25IZWFkZXIgPyAiJyIgKyBBdXRob3JpemF0aW9uSGVhZGVyICsgIiciIDogdW5kZWZpbmVkfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSAke0NsaWVudEludGVncml0eUhlYWRlciA/ICInIiArIENsaWVudEludGVncml0eUhlYWRlciArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1VwZGF0ZURldmljZUlkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRmV0Y2hSZXNwb25zZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVzcG9uc2VEYXRhLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCB0aW1lb3V0SWQgfSA9IHBlbmRpbmdGZXRjaFJlcXVlc3RzLmdldChyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXNwb25zZURhdGEuZXJyb3IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcmVzcG9uc2UgZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSB0YWtlcyBzdGF0dXMvc3RhdHVzVGV4dC9oZWFkZXJzIOKAlCB1cmwvcmVkaXJlY3RlZC90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UuIElWUyBXQVNNIHZhbGlkYXRlcyB0aGVzZSAoU3BhZGUvdHJhY2tpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMpIGFuZCB0aHJvd3MgTmV0d29ya0Vycm9yIGlmIHRoZXkncmUgbWlzc2luZyDigJQgVFRWLUFCIHY2LjMuNSBmaXguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHJlc3BvbnNlRGF0YS5ib2R5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlRGF0YS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZURhdGEuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlRGF0YS5oZWFkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2VEYXRhLnVybCB8fCAnJywgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAncmVkaXJlY3RlZCcsIHsgdmFsdWU6ICEhcmVzcG9uc2VEYXRhLnJlZGlyZWN0ZWQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNwb25zZSwgJ3R5cGUnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudHlwZSB8fCAnYmFzaWMnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1NpbXVsYXRlQWRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltdWxhdGVkQWRzRGVwdGggPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU2ltdWxhdGVkQWRzRGVwdGg6ICcgKyBTaW11bGF0ZWRBZHNEZXB0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gIUFsbFNlZ21lbnRzQXJlQWRTZWdtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM6ICcgKyBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaG9va1dvcmtlckZldGNoKCk7CiAgICAgICAgICAgICAgICAgICAgZXZhbCh3b3JrZXJTdHJpbmcpOwogICAgICAgICAgICAgICAgYAogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVYm9VcGRhdGVBZEJhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcihlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUGF1c2VSZXN1bWVQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9hZFR3aXRjaFBsYXllcih0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5rZXkgPT0gJ0ZldGNoUmVxdWVzdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hSZXF1ZXN0ID0gZXZlbnQuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gV29ya2VyIGNyYXNoIHJlY292ZXJ5IOKAlCBJVlMgV0FTTSB3b3JrZXIgY2FuIGZpcmUgUnVudGltZUVycm9yCiAgICAgICAgICAgICAgICAvLyAoZS5nLiAiaW5kZXggb3V0IG9mIGJvdW5kcyIpIGFuZCBkaWUuIEEgc2luZ2xlIGNyYXNoIGZpcmVzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAvLyBlcnJvciBldmVudHM7IGRlZHVwZSB2aWEgYSBsb2NhbCBmbGFnLiBPbiBmaXJzdCBlcnJvciwgdHJpZ2dlciBhCiAgICAgICAgICAgICAgICAvLyBwbGF5ZXIgcmVsb2FkIOKAlCBUd2l0Y2ggcmUtc3Bhd25zIHRoZSB3b3JrZXIgYXMgcGFydCBvZiB0aGUgbmV3CiAgICAgICAgICAgICAgICAvLyBwbGF5ZXIgaW5zdGFuY2UsIGFuZCBleGlzdGluZyByZWxvYWQgY29vbGRvd24gcHJldmVudHMgcmVzdGFydCBsb29wcy4KICAgICAgICAgICAgICAgIGxldCBjcmFzaGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3Jhc2hlZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNyYXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIElWUyBXQVNNIHdvcmtlciBjcmFzaGVkOiAnICsgKChlICYmIGUubWVzc2FnZSkgfHwgJ3Vua25vd24gZXJyb3InKSArICcg4oCUIHRyaWdnZXJpbmcgcGxheWVyIHJlbG9hZCB0byByZWNvdmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmVsb2FkVHdpdGNoUGxheWVyKGZhbHNlKTsgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBjcmFzaCByZWNvdmVyeSBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHdvcmtlckluc3RhbmNlID0gcmVpbnNlcnRXb3JrZXJzKG5ld1dvcmtlciwgcmVpbnNlcnQpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdXb3JrZXInLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VySW5zdGFuY2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkV29ya2VyKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdvcmtlckluc3RhbmNlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIHNldCB0d2l0Y2ggd29ya2VyIGRlbmllZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCkgewogICAgICAgIGlmICghZ2V0V2FzbVdvcmtlckpzLmNhY2hlKSB7CiAgICAgICAgICAgIGdldFdhc21Xb3JrZXJKcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0pIHsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc21Xb3JrZXJKcy5jYWNoZVt0d2l0Y2hCbG9iVXJsXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICBjb25zdCB0ZXh0ID0gcmVxLnJlc3BvbnNlVGV4dDsKICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0gPSB0ZXh0OwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFtSW5mb1VybHMoc3RyZWFtSW5mbywgZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGNvbnN0IGxpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIHYyIEFQSSB2YXJpYW50IFVSTHMgYXJlIHJhdyBDRE4gVVJMcyB3aXRob3V0ICcubTN1OCcgaW4gdGhlIHBhdGguCiAgICAgICAgICAgIC8vIEFjY2VwdCBhYnNvbHV0ZSBVUkxzIChjb250YWluaW5nICc6Ly8nKSBhbG9uZ3NpZGUgJy5tM3U4JyBVUkxzLgogICAgICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZXNbaV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKHRyaW1tZWQgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aCgnIycpICYmICh0cmltbWVkLmluY2x1ZGVzKCcubTN1OCcpIHx8IHRyaW1tZWQuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NCeVVybFtsaW5lc1tpXS50cmltRW5kKCldID0gc3RyZWFtSW5mbzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuZXh0TGluZSA9IGxpbmVzW2kgKyAxXT8udHJpbSgpOwogICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBuZXh0TGluZSAmJiAhbmV4dExpbmUuc3RhcnRzV2l0aCgnIycpICYmIChuZXh0TGluZS5pbmNsdWRlcygnLm0zdTgnKSB8fCBuZXh0TGluZS5pbmNsdWRlcygnOi8vJykpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBhdHRyaWJ1dGVzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHV0aW9uOiByZXNvbHV0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBGcmFtZVJhdGU6IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgVXJsOiBsaW5lc1tpICsgMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJscy5zZXQobGluZXNbaSArIDFdLnRyaW1FbmQoKSwgcmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKSB7CiAgICAgICAgY29uc3QgaXNTaG93aW5nQWQgPSAhIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzOwogICAgICAgIGlmICghaXNTaG93aW5nQWQgJiYgKHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzIHx8IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBmYWxzZTsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIGtleTogJ1Vib1VwZGF0ZUFkQmFubmVyJywKICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgaGFzQWRzOiBpc1Nob3dpbmdBZCwKICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cywKICAgICAgICAgICAgbnVtU3RyaXBwZWRBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cywKICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXggPj0gMCA/IE9QVF9CQUNLVVBfUExBWUVSX1RZUEVTW3N0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4XSA6IG51bGwKICAgICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCByZWxvYWRQbGF5ZXIsIHJlYWxGZXRjaCwgdXJsLCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGxldCByZXN1bHQgPSB0ZXh0U3RyOwogICAgICAgIHN0cmVhbUluZm8uSXNNaWRyb2xsID0gdGV4dFN0ci5pbmNsdWRlcygnIk1JRFJPTEwiJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnIm1pZHJvbGwiJyk7CiAgICAgICAgLy8gVHJhY2sgaGlnaC1jb25maWRlbmNlIGFkIG1hcmtlcnMgdG8gZGlzdGluZ3Vpc2ggcmVhbCBhZHMgZnJvbSBmYWxzZS1wb3NpdGl2ZSBzaWduaWZpZXIgbWF0Y2hlcy4KICAgICAgICAvLyBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50IG9uIGV2ZXJ5IHJlYWwgVHdpdGNoIGFkIGFuZCBhYnNlbnQgZnJvbSBhbnl0aGluZyB0aGF0IGNvdWxkCiAgICAgICAgLy8gZmFsc2UtcG9zaXRpdmUgKGUuZy4gbWV0YWRhdGEgY29udGFpbmluZyB0aGUgd29yZCAnc3RpdGNoZWQnKS4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMgPSB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTicpOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGF5ZXJUeXBlcyA9IFsuLi5PUFRfQkFDS1VQX1BMQVlFUl9UWVBFU107CiAgICAgICAgLy8gVHJ5IHBpbm5lZCBiYWNrdXAgcGxheWVyIHR5cGUgZmlyc3QgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgKFBpbkJhY2t1cFBsYXllclR5cGUgJiYgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gcGxheWVyVHlwZXMuaW5kZXhPZihzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICBpZiAocGlubmVkSW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlcy5zcGxpY2UocGlubmVkSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgcGxheWVyVHlwZXMudW5zaGlmdChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5zaXplID49IHBsYXllclR5cGVzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzICYmICFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncy5pbmNsdWRlcyh1cmwpKSB7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYmFja3VwU2VhcmNoU3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgIGxldCBiYWNrdXBQbGF5ZXJUeXBlSW5mbyA9ICcnOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxheWVyVHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgcGxheWVyVHlwZSA9IHBsYXllclR5cGVzW2ldOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmhhcyhwbGF5ZXJUeXBlKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2UgIT0gbnVsbCAmJiBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvckJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXJyb3JCb2R5ID0gJyDigJQgJyArIChhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLnRleHQoKSkuc3Vic3RyaW5nKDAsIDIwMCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWNjZXNzIHRva2VuIEhUVFAgJyArIGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHBsYXllclR5cGUgKyAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDQwMyA/ICcgKGludGVncml0eTogJyArIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAncHJlc2VudCcgOiAnbWlzc2luZycpICsgJyknIDogJycpICsgZXJyb3JCb2R5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2UgIT0gbnVsbCAmJiBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB7IGRhdGE6IHsgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjogey4uLn0gfSB9IChtb3N0IHBsYXllciB0eXBlcykKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB7IHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW46IHsuLi59IH0gKGZsYXR0ZXIsIG9ic2VydmVkIGZvciAnZW1iZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGF0ID0gYWNjZXNzVG9rZW4/LmRhdGE/LnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gfHwgYWNjZXNzVG9rZW4/LnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3BhdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCByZXNwb25zZSBtaXNzaW5nIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gZm9yICcgKyBwbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmxJbmZvLnNlYXJjaFBhcmFtcy5zZXQoJ3NpZycsIHNwYXQuc2lnbmF0dXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIHNwYXQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVXNoZXIgSFRUUCAnICsgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyBwbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlICE9IG51bGwgJiYgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RpbmdzTTN1OCA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja1RleHRTdHIgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0FkVGFncyhiYWNrVGV4dFN0cikgJiYgKFNpbXVsYXRlZEFkc0RlcHRoID09IDAgfHwgaSA+PSBTaW11bGF0ZWRBZHNEZXB0aCAtIDEpKSB8fCBpID49IHBsYXllclR5cGVzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmFja1RleHRTdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGVJbmZvID0gJyAoJyArIHBsYXllclR5cGUgKyAnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNldChwbGF5ZXJUeXBlLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGluQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gcGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FbmNvZGluZ3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG93IHJlc29sdXRpb24gc3RyZWFtcyB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHJlc29sdXRpb25zIGluIHRoZSBVSS4gVG8gZml4IHRoaXMgd2UgbWVyZ2UgdGhlIGxvdyByZXMgVVJMcyBpbnRvIHRoZSBtYWluIG0zdTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbEVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkVuY29kaW5nczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbExpbmVzID0gbm9ybWFsRW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9ybWFsTGluZXMubGVuZ3RoIC0gMTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbExpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobm9ybWFsTGluZXNbal0uc3Vic3RyaW5nKG5vcm1hbExpbmVzW2pdLmluZGV4T2YoJzonKSArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzVXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCBzdHJlYW1JbmZvLlVybHMuZ2V0KG5vcm1hbExpbmVzW2ogKyAxXS50cmltRW5kKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzSW5mID0gZW5jb2RpbmdzTTN1OC5tYXRjaChuZXcgUmVnRXhwKGBeLiooPz1cbi4qJHtsb3dSZXNVcmx9KWAsICdtJykpPy5bMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG93UmVzSW5mKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobG93UmVzSW5mLnN1YnN0cmluZyhsb3dSZXNJbmYuaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtYXAgJyArIHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ10gKyAnIHRvICcgKyBsb3dSZXNTZXR0aW5nc1snUkVTT0xVVElPTiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzU2V0dGluZ3NbY29kZWNzS2V5XSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0gPT09ICdzdHJpbmcnICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNTZXR0aW5nc1tjb2RlY3NLZXldLmxlbmd0aCA+PSAzICYmIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0ubGVuZ3RoID49IDMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2hldicpIHx8IHJlc1NldHRpbmdzW2NvZGVjc0tleV0uc3RhcnRzV2l0aCgnaHZjJykpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN1YnN0cmluZygwLCAzKSAhPT0gbG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdWJzdHJpbmcoMCwgMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3dhcCAnICsgcmVzU2V0dGluZ3NbY29kZWNzS2V5XSArICcgdG8gJyArIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTGluZXNbal0gPSBub3JtYWxMaW5lc1tqXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XX0iYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhub3JtYWxMaW5lc1tqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTGluZXNbaiArIDFdID0gbG93UmVzVXJsICsgJyAnLnJlcGVhdChqICsgMSk7Ly8gVGhlIHN0cmVhbSBkb2Vzbid0IGxvYWQgdW5sZXNzIGVhY2ggdXJsIGxpbmUgaXMgdW5pcXVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzTTN1OCA9IG5vcm1hbExpbmVzLmpvaW4oJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPSBlbmNvZGluZ3NNM3U4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyB9CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuZ2V0KHBsYXllclR5cGUpID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNldChwbGF5ZXJUeXBlLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zb2xlLmxvZygnRm91bmQgYWRzLCBzd2l0Y2ggdG8gYmFja3VwJyArIGJhY2t1cFBsYXllclR5cGVJbmZvICsgJyBpbiAnICsgKERhdGUubm93KCkgLSBiYWNrdXBTZWFyY2hTdGFydCkgKyAnbXMg4oCUIHNpZ25pZmllcnM6ICcgKyBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpLmpvaW4oJywgJykpOwogICAgICAgIGlmIChyZWxvYWRQbGF5ZXIpIHsKICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBRF9TSUdOSUZJRVJTLnNvbWUoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFEX1NJR05JRklFUlMuZmlsdGVyKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFEX1NJR05JRklFUlMgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzKSB7CiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIGxldCBzbTsKICAgICAgICAgICAgY29uc3QgY2xhc3NSZSA9IC9FWFQtWC1EQVRFUkFOR0U6W15cbl0qQ0xBU1M9Iih0d2l0Y2gtW14iXSspIi9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gY2xhc3NSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0iJyArIHNtWzFdICsgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB0YWdSZSA9IC8oU0NURTM1LVtBLVotXSt8RVhULVgtQ1VFLVtBLVotXSspL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSB0YWdSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoc21bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN1YnN0cmluZyBjaGVjayAobm90IGV4YWN0KTogYSBjYW5kaWRhdGUgaXMgImtub3duIiBpZiBhbnkgQURfU0lHTklGSUVSCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4gIUFEX1NJR05JRklFUlMuc29tZShzID0+IGMuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQURfU0lHTklGSUVSUzogJyArIHVua25vd24uam9pbignLCAnKSArICcgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAvLyBUcmFjayBTQ1RFLTM1IENVRS1PVVQvQ1VFLUlOIGFkIGJvdW5kYXJpZXMKICAgICAgICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1PVVQnKSkgewogICAgICAgICAgICAgICAgaWYgKCFpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLU9VVCDigJQgYWQgYm91bmRhcnkgZW50ZXJlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1JTicpKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1JTiDigJQgYWQgYm91bmRhcnkgZXhpdGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmFja2luZyB1cmxzIHdoaWNoIGFwcGVhciBpbiB0aGUgb3ZlcmxheSBVSQogICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmUucmVwbGFjZUFsbChUV0lUQ0hfQURfVVJMX1JFV1JJVEVfUkVHRVgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmICghbGluZS5pbmNsdWRlcygnLGxpdmUnKSB8fCBzdHJpcEFsbFNlZ21lbnRzIHx8IEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyB8fCBpbkN1ZU91dCkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRVcmwgPSBsaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICBpZiAoIUFkU2VnbWVudENhY2hlLmhhcyhzZWdtZW50VXJsKSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoc2VnbWVudFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IGxpbmVzW2kgKyAxXS5pbmNsdWRlcyhwKSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHNlZ21lbnQgZGV0ZWN0ZWQgdmlhIFVSTCBwYXR0ZXJuOiAnICsgbGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChsaW5lc1tpICsgMV0sIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZS5pbmNsdWRlcygnLGxpdmUnKSkgewogICAgICAgICAgICAgICAgbGl2ZVNlZ21lbnRzLnB1c2goeyBleHRpbmY6IGxpbmUsIHVybDogbGluZXNbaSArIDFdIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBBUlQ6JykpIHsKICAgICAgICAgICAgICAgIC8vIExMLUhMUyBwYXJ0OiBVUkkgaXMgaW5saW5lIGFzIGFuIGF0dHJpYnV0ZS4gU3RyaXAgaWYgaXQgbWF0Y2hlcyBhIGtub3duCiAgICAgICAgICAgICAgICAvLyBhZCBVUkwgKGFscmVhZHkgaW4gY2FjaGUgZnJvbSBhIHBhcmFsbGVsIEVYVElORiBzdHJpcCwgb3IgbWF0Y2hlcyBhIFVSTCBwYXR0ZXJuKS4KICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllciBtYXkgdXNlIHRoZSBwYXJ0cyBwYXRoIHRvIGZldGNoIGFkIG1lZGlhIHZpYSBsb3ctbGF0ZW5jeS4KICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmlNYXRjaCA9IGxpbmUubWF0Y2goVVJJX0FUVFJJQlVURV9SRUdFWCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBRF9TRUdNRU5UX1VSTF9QQVRURVJOUy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBBRF9TSUdOSUZJRVJTLnNvbWUoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpKSB7CiAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLy8gTm8gbG93IGxhdGVuY3kgZHVyaW5nIGFkcyAob3RoZXJ3aXNlIGl0J3MgcG9zc2libGUgZm9yIHRoZSBwbGF5ZXIgdG8gcHJlZmV0Y2ggYW5kIGRpc3BsYXkgYWQgc2VnbWVudHMpCiAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSB8fCBsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtUFJFTE9BRC1ISU5UOicpKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID0gMDsKICAgICAgICB9CiAgICAgICAgLy8gQ2FjaGUgbGl2ZSBzZWdtZW50cyBmb3IgcmVjb3ZlcnkgKHBsdXMgdGhlIE1FRElBLVNFUVVFTkNFIG9mIHRoZSBvbGRlc3QgY2FjaGVkIHNlZ21lbnQsCiAgICAgICAgLy8gc28gdGhlIHBsYXllciBhY2NlcHRzIGluamVjdGVkIHJlY292ZXJ5IHNlZ21lbnRzIGFzIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0pCiAgICAgICAgaWYgKGxpdmVTZWdtZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyA9IGxpdmVTZWdtZW50cy5zbGljZSgtNik7CiAgICAgICAgICAgIGNvbnN0IHNlcSA9IHBhcnNlSW50KCh0ZXh0U3RyLm1hdGNoKC8jRVhULVgtTUVESUEtU0VRVUVOQ0U6KFxkKykvKSB8fCBbXSlbMV0pOwogICAgICAgICAgICBpZiAoIWlzTmFOKHNlcSkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcSA9IHNlcSArIE1hdGgubWF4KDAsIGxpdmVTZWdtZW50cy5sZW5ndGggLSBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiBhbGwgc2VnbWVudHMgd2VyZSBzdHJpcHBlZCwgdHJ5IHRvIHByZXZlbnQgYmxhY2sgc2NyZWVuIHZpYSByZWNvdmVyeSBjb250ZW50LgogICAgICAgIC8vIFByZWZlciB0aGUgZnVsbC1wbGF5bGlzdCBzbmFwc2hvdCBmcm9tIGEgcmVjZW50IG5vbi1hZCBwb2xsIChtaXJyb3JzIFRUVi1BQgogICAgICAgIC8vIExhc3RDbGVhbk5hdGl2ZU0zVTggYXBwcm9hY2gpIOKAlCBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIHdvcnRoIG9mCiAgICAgICAgLy8gY29udGVudCB2cyB0aGUgdGhpbiBwZXItc2VnbWVudCByZWNvdmVyeSBjYWNoZS4gRmFsbHMgYmFjayB0byB0aGUgcGVyLXNlZ21lbnQKICAgICAgICAvLyBjYWNoZSBpZiB0aGUgc25hcHNob3QgaXMgc3RhbGUgb3IgbWlzc2luZy4KICAgICAgICBpZiAoaGFzU3RyaXBwZWRBZFNlZ21lbnRzICYmIGxpdmVTZWdtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgPSAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgKyAxOwogICAgICAgICAgICBjb25zdCByZWNvdmVyeVRoaW4gPSAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzPy5sZW5ndGggfHwgMCkgPCAzOwogICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVUaHJlc2hvbGQgPSByZWNvdmVyeVRoaW4gPyAxIDogRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkOwogICAgICAgICAgICBpZiAoRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID4gMCAmJiBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc3QgcmVhc29uID0gcmVjb3ZlcnlUaGluID8gJyAodGhpbiByZWNvdmVyeSBjYWNoZTogJyArIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSArICcgc2VnbWVudHMpJyA6ICcnOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHRyaWdnZXJlZCDigJQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzICsgJyBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMnICsgcmVhc29uKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnVWJvUmVsb2FkUGxheWVyJyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBQcmltYXJ5OiBmcmVzaCBmdWxsLXBsYXlsaXN0IHNuYXBzaG90ICg8IDEuNXMgb2xkLCBtdXN0IG5vdCBpdHNlbGYgY29udGFpbiBhZCBtYXJrZXJzKQogICAgICAgICAgICBjb25zdCBzbmFwc2hvdEFnZSA9IHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA/IChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0KSA6IEluZmluaXR5OwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4ICYmIHNuYXBzaG90QWdlIDw9IDE1MDAgJiYgIWhhc0FkVGFncyhzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTgpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJldXNpbmcgbGFzdCBjbGVhbiBuYXRpdmUgcGxheWxpc3QgKCcgKyBzbmFwc2hvdEFnZSArICdtcyBvbGQpJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlIChleGlzdGluZyBiZWhhdmlvcikKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyAmJiBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXN0b3JpbmcgJyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggKyAnIHJlY292ZXJ5IHNlZ21lbnRzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKCcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2pdID0gJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonICsgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLmV4dGluZik7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0udXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIC8vIFRocm90dGxlIGNhY2hlIHBydW5lIHRvIG9uY2UgcGVyIDYwcy4gVGhlIDEyMHMgVFRMIGdpdmVzIHBsZW50eSBvZiBoZWFkcm9vbQogICAgICAgIC8vIGFuZCBzY2FubmluZyB0aGUgZnVsbCBjYWNoZSBvbiBldmVyeSBtM3U4IHBvbGwgYWRkcyB1cCBkdXJpbmcgaGVhdnkgYWQgYnJlYWsKICAgICAgICAvLyBzZXF1ZW5jZXMgKExMLUhMUyBjYW4gcG9sbCBtdWx0aXBsZSB0aW1lcyBwZXIgc2Vjb25kKS4gUG9ydGVkIGZyb20gVFRWLUFCLgogICAgICAgIGlmICghc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgfHwgbm93IC0gc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPiA2MDAwMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA9IG5vdzsKICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSwgbWFwKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBub3cgLSAxMjAwMDApIHsKICAgICAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBEaWFnbm9zdGljOiBsb2cgb25jZSBwZXIgc3RyZWFtSW5mbyB3aGVuIHRoZSBjYWNoZSBjcm9zc2VzIDEwMDAgZW50cmllcywKICAgICAgICAgICAgLy8gc28gY2FjaGUgYmxvYXQgZnJvbSBhIGZ1dHVyZSBUVEwvcHJ1bmUgYnVnIHdvdWxkIHN1cmZhY2UgaW4gdXNlciByZXBvcnRzCiAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc3RheWluZyBpbnZpc2libGUuCiAgICAgICAgICAgIGlmIChBZFNlZ21lbnRDYWNoZS5zaXplID4gMTAwMCAmJiAhc3RyZWFtSW5mby5Mb2dnZWRBZENhY2hlU2l6ZTFrKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEFkQ2FjaGVTaXplMWsgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTZWdtZW50Q2FjaGUgY3Jvc3NlZCAxMDAwIGVudHJpZXMgKG5vdyAnICsgQWRTZWdtZW50Q2FjaGUuc2l6ZSArICcpIOKAlCBwb3NzaWJsZSBjYWNoZSBibG9hdCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcbicpOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBjb25zdCBjdXJyZW50UmVzb2x1dGlvbiA9IHN0cmVhbUluZm8uVXJscy5nZXQodXJsKTsKICAgICAgICBpZiAoIWN1cnJlbnRSZXNvbHV0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgdW5rbm93bkFkVGFncyA9IHRleHRTdHIubWF0Y2goLyNFWFRbXjpcbl0qKD86YWR8Y3VlfHNjdGV8c3BvbnNvcilbXjpcbl0qL2dpKTsKICAgICAgICAgICAgaWYgKHVua25vd25BZFRhZ3MpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSB1bmtub3duQWRUYWdzLmZpbHRlcih0ID0+ICFBRF9TSUdOSUZJRVJTLnNvbWUocyA9PiB0LmluY2x1ZGVzKHMpKSk7CiAgICAgICAgICAgICAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVW5rbm93biBhZC1yZWxhdGVkIHRhZ3MgZm91bmQ6ICcgKyBbLi4ubmV3IFNldCh1bmtub3duKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgaGF2ZUFkVGFncyA9IGhhc0FkVGFncyh0ZXh0U3RyKSB8fCAoU2ltdWxhdGVkQWRzRGVwdGggPiAwICYmICghc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgfHwgIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLmluY2x1ZGVzKHVybCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggLSAxID4gc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXgpKTsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB2cyB0aGUgMS0yIGNhY2hlZCBpbmRpdmlkdWFsIHNlZ21lbnRzLgogICAgICAgIC8vIE1pcnJvcnMgVFRWLUFCIHNyYy9tb2R1bGVzL3Byb2Nlc3Nvci50czo3MzMtNzM2LgogICAgICAgIGlmICghaGF2ZUFkVGFncyAmJiAhc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgJiYgdGV4dFN0ci5pbmRleE9mKCcjRVhUSU5GJykgIT09IC0xKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCA9IHRleHRTdHI7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA9IERhdGUubm93KCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gc3RyZWFtSW5mby5FbmNvZGluZ3MubWF0Y2goL15odHRwczouKlwubTN1OCQvbSk/LlswXTsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdTggPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdTggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGlmICghaGFzQWRUYWdzKHN0cmVhbU0zdTgpICYmIFNpbXVsYXRlZEFkc0RlcHRoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGxheWxpc3QgaGFzIGxpdmUgc2VnbWVudHMg4oCUIGlmIG5vdCwgYmFja3VwIHN0cmVhbSBpcyBkZWFkCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0xpdmVTZWdtZW50cyA9IHRleHRTdHIuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gMiB8fCAhaGFzTGl2ZVNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gaGFzIG5vIGxpdmUgc2VnbWVudHMg4oCUIGZvcmNpbmcgaW1tZWRpYXRlIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIG1vcmUgYWRzIG9uIG1haW4gc3RyZWFtLiBTdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLiAnICsgKFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVHJpZ2dlcmluZyBwbGF5ZXIgcmVsb2FkIHRvIGdvIGJhY2sgdG8gbWFpbiBzdHJlYW0uLi4nIDogJ1Jlc3VtaW5nIHBsYXliYWNrLi4uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRzIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPT09IDAgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbU0zdTguaW5jbHVkZXMoJyJNSURST0xMIicpICYmICFzdHJlYW1NM3U4LmluY2x1ZGVzKCcibWlkcm9sbCInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBzdHJlYW1NM3U4LnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKExJVkVfU0lHTklGSUVSKSAmJiAhc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuaGFzKGxpbmVzW2kgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVxdWVzdCBvbmUgLnRzIGZpbGUgcGVyIC5tM3U4IHJlcXVlc3QgdG8gYXZvaWQgbWFraW5nIHRvbyBtYW55IHJlcXVlc3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdGZXRjaCBhZCAudHMgZmlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuYWRkKGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ibG9iKCkpLmNhdGNoKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyAmJiBoYXZlQWRUYWdzKSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUsIHJlYWxGZXRjaCwgdXJsLCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGhhdmVBZFRhZ3MgJiYgIXN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MpIHsKICAgICAgICAgICAgLy8gQ1NBSSBmYXN0IHBhdGg6IGlmIGFsbCBzZWdtZW50cyBpbiB0aGUgbWFpbiBzdHJlYW0gYXJlIGxpdmUsIHNraXAgYmFja3VwIHNlYXJjaC4KICAgICAgICAgICAgLy8gQ1NBSSBhZHMgYXJlIGRlbGl2ZXJlZCBvdXRzaWRlIHRoZSBtM3U4IOKAlCB0aGUgbWFpbiBzdHJlYW0gc2VnbWVudHMgYXJlIGNsZWFuLgogICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1haW4gc3RyZWFtIGRpcmVjdGx5LCBhdm9pZGluZyB0aGUgYmFja3VwIHN0cmVhbSBzd2l0Y2ggdGhhdCBjYXVzZXMKICAgICAgICAgICAgLy8gYSAyMC00MHMgcmVidWZmZXIgZ2FwLgogICAgICAgICAgICBjb25zdCBtYWluU3RyZWFtTGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICBsZXQgaGFzTm9uTGl2ZVNlZ21lbnQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWluU3RyZWFtTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtYWluU3RyZWFtTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVElORicpICYmICFtYWluU3RyZWFtTGluZXNbaV0uaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzTm9uTGl2ZVNlZ21lbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFzTm9uTGl2ZVNlZ21lbnQpIHsKICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBmYXN0IHBhdGgg4oCUIGFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUsIHJlYWxGZXRjaCwgdXJsLCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgZmFsc2UsIHN0cmVhbUluZm8pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pOwogICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgfQogICAgZnVuY3Rpb24gaG9va1dvcmtlckZldGNoKCkgewogICAgICAgIGNvbnNvbGUubG9nKCdob29rV29ya2VyRmV0Y2ggKHZpZGVvLXN3YXAtbmV3KScpOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IGZldGNoOwogICAgICAgIGZldGNoID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLmhhcyh1cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2goJ2RhdGE6dmlkZW8vbXA0O2Jhc2U2NCxBQUFBS0daMGVYQnRjRFF5QUFBQUFXbHpiMjF0Y0RReVpHRnphR0YyWXpGcGMyODJhR3h6WmdBQUJFbHRiMjkyQUFBQWJHMTJhR1FBQUFBQUFBQUFBQUFBQUFBQUFZYWdBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQUFBQnFIUnlZV3NBQUFCY2RHdG9aQUFBQUFNQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFVUnRaR2xoQUFBQUlHMWthR1FBQUFBQUFBQUFBQUFBQUFBQUFMdUFBQUFBQUZYRUFBQUFBQUF0YUdSc2NnQUFBQUFBQUFBQWMyOTFiZ0FBQUFBQUFBQUFBQUFBQUZOdmRXNWtTR0Z1Wkd4bGNnQUFBQUR2YldsdVpnQUFBQkJ6Yldoa0FBQUFBQUFBQUFBQUFBQWtaR2x1WmdBQUFCeGtjbVZtQUFBQUFBQUFBQUVBQUFBTWRYSnNJQUFBQUFFQUFBQ3pjM1JpYkFBQUFHZHpkSE5rQUFBQUFBQUFBQUVBQUFCWGJYQTBZUUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FRQUFBQUFMdUFBQUFBQUFBelpYTmtjd0FBQUFBRGdJQ0FJZ0FCQUFTQWdJQVVRQlVBQUFBQUFBQUFBQUFBQUFXQWdJQUNFWkFHZ0lDQUFRSUFBQUFRYzNSMGN3QUFBQUFBQUFBQUFBQUFFSE4wYzJNQUFBQUFBQUFBQUFBQUFCUnpkSE42QUFBQUFBQUFBQUFBQUFBQUFBQUFFSE4wWTI4QUFBQUFBQUFBQUFBQUFlVjBjbUZyQUFBQVhIUnJhR1FBQUFBREFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFvQUFBQUZvQUFBQUFBR0JiV1JwWVFBQUFDQnRaR2hrQUFBQUFBQUFBQUFBQUFBQUFBOUNRQUFBQUFCVnhBQUFBQUFBTFdoa2JISUFBQUFBQUFBQUFIWnBaR1VBQUFBQUFBQUFBQUFBQUFCV2FXUmxiMGhoYm1Sc1pYSUFBQUFCTEcxcGJtWUFBQUFVZG0xb1pBQUFBQUVBQUFBQUFBQUFBQUFBQUNSa2FXNW1BQUFBSEdSeVpXWUFBQUFBQUFBQUFRQUFBQXgxY213Z0FBQUFBUUFBQU94emRHSnNBQUFBb0hOMGMyUUFBQUFBQUFBQUFRQUFBSkJoZG1NeEFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW9BQmFBQklBQUFBU0FBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHUC8vQUFBQU9tRjJZME1CVFVBZS8rRUFJMmROUUI2V1VvRkFYL0xnTFVCQVFGQUFBRDZBQUE2bURnQUFIb1FBQTlDVzd5NEtBUUFFYU91UElBQUFBQkJ6ZEhSekFBQUFBQUFBQUFBQUFBQVFjM1J6WXdBQUFBQUFBQUFBQUFBQUZITjBjM29BQUFBQUFBQUFBQUFBQUFBQUFBQVFjM1JqYndBQUFBQUFBQUFBQUFBQVNHMTJaWGdBQUFBZ2RISmxlQUFBQUFBQUFBQUJBQUFBQVFBQUFDNEFBQUFBQW9BQUFBQUFBQ0IwY21WNEFBQUFBQUFBQUFJQUFBQUJBQUNDTlFBQUFBQUNRQUFBJywgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXJsID0gdXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0ciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gU3RyaW5nKGVycj8ubWVzc2FnZSB8fCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj8ubmFtZSAhPT0gJ0Fib3J0RXJyb3InICYmICEvY2FuY2VsfGFib3J0L2kudGVzdChlcnJNc2cpKSBjb25zb2xlLmxvZygnZmV0Y2ggaG9vayBlcnIgJyArIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gKG5ldyBVUkwodXJsKSkucGF0aG5hbWUubWF0Y2goLyhbXlwvXSspKD89XC5cdyskKS8pPy5bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdwYXJlbnRfZG9tYWlucycpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB0ZW1wVXJsLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBGaXJzdCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggd2l0aCB0aGUgdmlkZW8gZW5jb2RpbmdzICgzNjBwLDQ4MHAsNzIwcCxldGMpLgogICAgICAgICAgICAgICAgICAgICAgICAvLyAtIFNlY29uZCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBvYnRhaW5lZCBpbiB0aGUgZmlyc3QgcmVxdWVzdC4gQXQgdGhpcyBwb2ludCB3ZSB3aWxsIGtub3cgaWYgdGhlcmUncyBhZHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzICE9IG51bGwgJiYgKGF3YWl0IHJlYWxGZXRjaChzdHJlYW1JbmZvLkVuY29kaW5ncy5tYXRjaCgvXmh0dHBzOi4qXC5tM3U4JC9tKT8uWzBdKSkuc3RhdHVzICE9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgZW5jb2RpbmdzIGFyZSBkZWFkICh0aGUgc3RyZWFtIHByb2JhYmx5IHJlc3RhcnRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZXJUaW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCB8fCBzdHJlYW1JbmZvLkVuY29kaW5ncyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0gY3JlYXRlU3RyZWFtSW5mbyhjaGFubmVsTmFtZSwgKG5ldyBVUkwodXJsKSkuc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gc3RyZWFtSW5mby5VcmxzLnZhbHVlcygpLm5leHQoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2gocmVzb2x1dGlvbkluZm8uVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OCA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3Moc3RyZWFtTTN1OCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbkZvdW5kQWQoc3RyZWFtSW5mbywgc3RyZWFtTTN1OCwgZmFsc2UsIHJlYWxGZXRjaCwgcmVzb2x1dGlvbkluZm8uVXJsLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0cmVhbU0zdThSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW5jb2RpbmdzTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2ZXJUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPyBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA6IHN0cmVhbUluZm8uRW5jb2RpbmdzLCBzZXJ2ZXJUaW1lKSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgoZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvI0VYVC1YLVNFU1NJT04tREFUQTpEQVRBLUlEPSJTRVJWRVItVElNRSIsVkFMVUU9IihbXiJdKykiLyk7CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgnU0VSVkVSLVRJTUU9IihbMC05Ll0rKSInKTsKICAgICAgICByZXR1cm4gbWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDEgPyBtYXRjaGVzWzFdIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4KGVuY29kaW5nc00zdTgsIG5ld1NlcnZlclRpbWUpIHsKICAgICAgICBpZiAoVjJBUEkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ld1NlcnZlclRpbWUgPyBlbmNvZGluZ3NNM3U4LnJlcGxhY2UoLygjRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKVteIl0rKCIpLywgYCQxJHtuZXdTZXJ2ZXJUaW1lfSQyYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZShuZXcgUmVnRXhwKCcoU0VSVkVSLVRJTUU9IilbMC05Ll0rIicpLCBgU0VSVkVSLVRJTUU9IiR7bmV3U2VydmVyVGltZX0iYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgfQogICAgZnVuY3Rpb24gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGNvbnN0IGVuY29kaW5nc0xpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBbdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodF0gPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uLnNwbGl0KCd4JykubWFwKE51bWJlcik7CiAgICAgICAgbGV0IG1hdGNoZWRSZXNvbHV0aW9uVXJsID0gbnVsbDsKICAgICAgICBsZXQgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZhbHNlOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IGNsb3Nlc3RSZXNvbHV0aW9uRGlmZmVyZW5jZSA9IEluZmluaXR5OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RpbmdzTGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIC8vIEFjY2VwdCB2MiBBUEkgdmFyaWFudCBVUkxzIChyYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnKS4KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGVuY29kaW5nc0xpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhlbmNvZGluZ3NMaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgY29uc3QgZnJhbWVSYXRlID0gYXR0cmlidXRlc1snRlJBTUUtUkFURSddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbiA9PSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uICYmICghbWF0Y2hlZFJlc29sdXRpb25VcmwgfHwgKCFtYXRjaGVkRnJhbWVSYXRlICYmIGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRnJhbWVSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oY2hhbm5lbE5hbWUsIHBsYXllclR5cGUpIHsKICAgICAgICBjb25zdCByZWFsUGxheWVyVHlwZSA9IHBsYXllclR5cGUucmVwbGFjZSgnLUFMVCcsICcnKTsKICAgICAgICBjb25zdCBib2R5ID0gewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUGxheWJhY2tBY2Nlc3NUb2tlbicsCiAgICAgICAgICAgIHZhcmlhYmxlczogewogICAgICAgICAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgbG9naW46IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgaXNWb2Q6IGZhbHNlLAogICAgICAgICAgICAgICAgdm9kSUQ6ICIiLAogICAgICAgICAgICAgICAgcGxheWVyVHlwZTogcmVhbFBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSk7CiAgICB9CiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHksIHBsYXllclR5cGUpIHsKICAgICAgICBpZiAoIWdxbF9kZXZpY2VfaWQpIHsKICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9ICcnOwogICAgICAgICAgICBjb25zdCBjaGFycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlkJzogQ0xJRU5UX0lELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkLAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSkKICAgICAgICB9OwogICAgICAgIGlmIChwbGF5ZXJUeXBlLmluY2x1ZGVzKCctQUxUJykpIHsKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgICdDbGllbnQtSWQnOiBDTElFTlRfSUQsCiAgICAgICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0geC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArMSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXQogICAgICAgICAgICAgICAgfSkpOwogICAgfQogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCBmZXRjaFJlcXVlc3Qub3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0LCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBncWxfZGV2aWNlX2lkICE9IGRldmljZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgPSBkZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1Vib1VwZGF0ZURldmljZUlkJywgZ3FsX2RldmljZV9pZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddICE9PSBDbGllbnRJbnRlZ3JpdHlIZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicsIENsaWVudEludGVncml0eUhlYWRlciA9IGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9PT0gJ3N0cmluZycgJiYgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gIT09IEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUF1dGhvcml6YXRpb25IZWFkZXInLCBBdXRob3JpemF0aW9uSGVhZGVyID0gaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEhlYWRlcnMgJiYgZ3FsX2RldmljZV9pZCAmJiBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xvZ2dlZEhlYWRlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBHUUwgaGVhZGVycyBjYXB0dXJlZCDigJQgRGV2aWNlSWQ6ICcgKyAoZ3FsX2RldmljZV9pZCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZWRQbGF5ZXJUeXBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0JvZHkgPSBKU09OLnBhcnNlKGluaXQuYm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0JvZHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0JvZHkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keVtpXT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9keS52YXJpYWJsZXMucGxheWVyVHlwZSA9IE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlcGxhY2VkICcke3JlcGxhY2VkUGxheWVyVHlwZX0nIHBsYXllciB0eXBlIHdpdGggJyR7T1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRX0nIHBsYXllciB0eXBlYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NhaVR5cGUgPSB1cmwuaW5jbHVkZXMoJ2JwPW1pZHJvbGwnKSA/ICdtaWRyb2xsJyA6IHVybC5pbmNsdWRlcygnYnA9cHJlcm9sbCcpID8gJ3ByZXJvbGwnIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyhjc2FpVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZChjc2FpVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgYWQgcmVxdWVzdCBkZXRlY3RlZCDigJQgdHlwZTogJyArIGNzYWlUeXBlICsgJyAoY2xpZW50LXNpZGUgYWQgaW5zZXJ0aW9uLCBub3QgYmxvY2thYmxlIHZpYSBtM3U4KScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwgJ2ZldGNoJyk7CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVBZGJsb2NrQmFubmVyKGRhdGEpIHsKICAgICAgICBjb25zdCBwbGF5ZXJSb290RGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLXBsYXllcicpOwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICghdHdpdGNoUGxheWVyQW5kU3RhdGU/LnBsYXllcj8uY29yZSB8fCAhdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgdHdpdGNoUGxheWVyQW5kU3RhdGUgPSBnZXRQbGF5ZXJBbmRTdGF0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaXNMaXZlID0gdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlPy5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QLnRleHRDb250ZW50ID0gJ0Jsb2NraW5nJyArIChkYXRhLmlzTWlkcm9sbCA/ICcgbWlkcm9sbCcgOiAnJykgKyAnIGFkcycgKyAoZGF0YS5pc1N0cmlwcGluZ0FkU2VnbWVudHMgPyAnIChzdHJpcHBpbmcpJyA6ICcnKSArIChkYXRhLmFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPyAnICgnICsgZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlICsgJyknIDogJycpOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gZGF0YS5oYXNBZHMgJiYgaXNMaXZlID8gJ2Jsb2NrJyA6ICdub25lJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG1vbml0b3JMaXZlU3RhdHVzKCkgewogICAgICAgIGlmICghdHdpdGNoUGxheWVyQW5kU3RhdGU/LnBsYXllcj8uY29yZSB8fCAhdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlKSB7CiAgICAgICAgICAgIHR3aXRjaFBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaXNMaXZlID0gdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlPy5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnOwogICAgICAgIGlmICghaXNMaXZlKSB7CiAgICAgICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXIoewogICAgICAgICAgICAgICAgaGFzQWRzOiBmYWxzZQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dChtb25pdG9yTGl2ZVN0YXR1cywgMTAwMCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lciAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVhY3RSb290Tm9kZSA9PSBudWxsICYmIHJvb3ROb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBPYmplY3Qua2V5cyhyb290Tm9kZSkuZmluZCh4ID0+IHguc3RhcnRzV2l0aCgnX19yZWFjdENvbnRhaW5lcicpIHx8IHguc3RhcnRzV2l0aCgnX19yZWFjdEZpYmVyJykpOwogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZVtjb250YWluZXJOYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhY3RSb290Tm9kZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVhY3RSb290Tm9kZSA9IGZpbmRSZWFjdFJvb3ROb2RlKCk7CiAgICAgICAgaWYgKCFyZWFjdFJvb3ROb2RlKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBQcmltYXJ5OiBuYW1lZCBwcm9wZXJ0eSBsb29rdXAKICAgICAgICBsZXQgcGxheWVyID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0UGxheWVyQWN0aXZlICYmIG5vZGUucHJvcHMgJiYgbm9kZS5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlKTsKICAgICAgICBwbGF5ZXIgPSBwbGF5ZXIgJiYgcGxheWVyLnByb3BzICYmIHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlID8gcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgIGlmIChwbGF5ZXI/LnBsYXllckluc3RhbmNlKSB7CiAgICAgICAgICAgIHBsYXllciA9IHBsYXllci5wbGF5ZXJJbnN0YW5jZTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2ggaWYgVHdpdGNoIG9iZnVzY2F0ZXMgcHJvcGVydHkgbmFtZXMKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5nZXRIVE1MVmlkZW9FbGVtZW50ICYmIG5vZGUuZ2V0QnVmZmVyRHVyYXRpb24gJiYgbm9kZS5jb3JlPy5zdGF0ZSk7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGNvbnN0IHBsYXllclN0YXRlID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0U3JjICYmIG5vZGUuc2V0SW5pdGlhbFBsYXliYWNrU2V0dGluZ3MpOwogICAgICAgIC8vIEZhbGxiYWNrOiBzdHJ1Y3R1cmFsIG1hdGNoIOKAlCBzZXRTcmMgZXhpc3RzIGJ1dCBzZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyB3YXMgcmVuYW1lZAogICAgICAgIGNvbnN0IHBsYXllclN0YXRlRmFsbGJhY2sgPSAhcGxheWVyU3RhdGUgPyBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRTdHJlYW1NYW5hZ2VyTm9kZSAmJiAhbm9kZS5nZXRIVE1MVmlkZW9FbGVtZW50KSA6IG51bGw7CiAgICAgICAgLy8gRmFsbGJhY2sgMjogVFRWLUFCJ3MgYXBwcm9hY2gg4oCUIHZpZGVvUGxheWVySW5zdGFuY2Ugd2l0aCBwbGF5ZXJNb2RlCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjazIgPSAhcGxheWVyU3RhdGUgJiYgIXBsYXllclN0YXRlRmFsbGJhY2sgPyBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZT8ucGxheWVyTW9kZSAhPT0gdW5kZWZpbmVkKT8uc3RhdGU/LnZpZGVvUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgIGNvbnN0IGZpbmFsUGxheWVyU3RhdGUgPSBwbGF5ZXJTdGF0ZSB8fCBwbGF5ZXJTdGF0ZUZhbGxiYWNrIHx8IHBsYXllclN0YXRlRmFsbGJhY2syOwogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVsb2FkVHdpdGNoUGxheWVyKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgY29uc3QgcGxheWVyQW5kU3RhdGUgPSBnZXRQbGF5ZXJBbmRTdGF0ZSgpOwogICAgICAgIGlmICghcGxheWVyQW5kU3RhdGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHJlYWN0IHJvb3QnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXI7CiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBwbGF5ZXJBbmRTdGF0ZS5zdGF0ZTsKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCFwbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyIHN0YXRlJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllci5pc1BhdXNlZCgpIHx8IHBsYXllci5jb3JlPy5wYXVzZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzUGF1c2VQbGF5ICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA+IDApIHsKICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY29uc3QgY29vbGRvd25NcyA9IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDEwMDA7CiAgICAgICAgICAgIGlmIChsYXN0UmVsb2FkVGltZXN0YW1wICYmIG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXAgPCBjb29sZG93bk1zKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIGNvb2xkb3duIGFjdGl2ZSAoJyArIE1hdGgucm91bmQoKGNvb2xkb3duTXMgLSAobm93IC0gbGFzdFJlbG9hZFRpbWVzdGFtcCkpIC8gMTAwMCkgKyAncyByZW1haW5pbmcpJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVsb2FkVGltZXN0YW1wcy5wdXNoKG5vdyk7CiAgICAgICAgICAgIGNvbnN0IGZpdmVNaW5BZ28gPSBub3cgLSAzMDAwMDA7CiAgICAgICAgICAgIHdoaWxlIChyZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA+IDAgJiYgcmVsb2FkVGltZXN0YW1wc1swXSA8IGZpdmVNaW5BZ28pIHsgcmVsb2FkVGltZXN0YW1wcy5zaGlmdCgpOyB9CiAgICAgICAgICAgIGlmIChyZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA+PSAzICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA8IDkwKSB7CiAgICAgICAgICAgICAgICBFc2NhbGF0ZWRGcm9tQ29vbGRvd24gPSBSZWxvYWRDb29sZG93blNlY29uZHM7CiAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSA5MDsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEF1dG8tZXNjYWxhdGVkIHJlbG9hZCBjb29sZG93biB0byA5MHMgKDMrIHJlbG9hZHMgaW4gNSBtaW51dGVzKScpOwogICAgICAgICAgICB9IGVsc2UgaWYgKEVzY2FsYXRlZEZyb21Db29sZG93biAhPT0gbnVsbCAmJiByZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA8IDMpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIERlLWVzY2FsYXRlZCByZWxvYWQgY29vbGRvd24gYmFjayB0byAnICsgRXNjYWxhdGVkRnJvbUNvb2xkb3duICsgJ3MgKGJ1cnN0IHN1YnNpZGVkKScpOwogICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gRXNjYWxhdGVkRnJvbUNvb2xkb3duOwogICAgICAgICAgICAgICAgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0UmVsb2FkVGltZXN0YW1wID0gbm93OwogICAgICAgIH0KICAgICAgICBpZiAoaXNQYXVzZVBsYXkpIHsKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudCkgewogICAgICAgICAgICAvLyBEb3duZ3JhZGUgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAg4oCUIHNldFNyYyBleGl0cyBQaVAKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEb3duZ3JhZGVkIHJlbG9hZCB0byBwYXVzZS9wbGF5IHRvIHByZXNlcnZlIFBpUCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzS2V5UXVhbGl0eSA9ICd2aWRlby1xdWFsaXR5JzsKICAgICAgICBjb25zdCBsc0tleU11dGVkID0gJ3ZpZGVvLW11dGVkJzsKICAgICAgICBjb25zdCBsc0tleVZvbHVtZSA9ICd2b2x1bWUnOwogICAgICAgIGxldCBjdXJyZW50UXVhbGl0eUxTID0gbnVsbDsKICAgICAgICBsZXQgY3VycmVudE11dGVkTFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50Vm9sdW1lTFMgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGN1cnJlbnRRdWFsaXR5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVF1YWxpdHkpOwogICAgICAgICAgICBjdXJyZW50TXV0ZWRMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TXV0ZWQpOwogICAgICAgICAgICBjdXJyZW50Vm9sdW1lTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVZvbHVtZSk7CiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIHBsYXllci5jb3JlLnN0YXRlLnZvbHVtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLnF1YWxpdHkuZ3JvdXB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgcGxheWVyLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgIC8vIGNsZWFyZWQgY2FjaGUpLCB0aGUgdmlkZW8gc3RpbGwgbmVlZHMgdW5tdXRlIGFmdGVyIENocm9tZSdzIGF1dG9wbGF5IG11dGUgb24gcmVsb2FkLgogICAgICAgIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHdyaXRlcyB2aWRlby1tdXRlZCBhcyAneyJkZWZhdWx0Ijp0cnVlfScgd2hlbiB1c2VyIG11dGVkIHZpYSBVSTsKICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID4gMCAmJiB2aWRlb3NbMF0ubXV0ZWQgJiYgIXVzZXJJbnRlbmRlZE11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRlbnRMb2FkZWQoKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXZlbnR2LWV4dGVuc2lvbicpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6IDdUViBleHRlbnNpb24gZGV0ZWN0ZWQg4oCUIG1heSBjYXVzZSBibGFjayBzY3JlZW4gb3IgYnVmZmVyaW5nIGlzc3Vlcy4gSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMsIHRyeSBkaXNhYmxpbmcgN1RWLicpOwogICAgICAgIH0KICAgICAgICAvLyBUaGlzIHN0b3BzIFR3aXRjaCBmcm9tIHBhdXNpbmcgdGhlIHBsYXllciB3aGVuIGluIGFub3RoZXIgdGFiIGFuZCBhbiBhZCBzaG93cy4KICAgICAgICAvLyBUYWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXVjZXR0di9WaWRlb0FkQmxvY2tGb3JUd2l0Y2gvYmxvYi9jZWZjZTlkMmI1NjU3NjljNzdlMzY2NmFjODIzNGMzYWNmZTIwZDgzL2Nocm9tZS9jb250ZW50LmpzI0wzMAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Zpc2libGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9Y2F0Y2h7fQogICAgICAgIGxldCBoaWRkZW4gPSBkb2N1bWVudC5fX2xvb2t1cEdldHRlcl9fKCdoaWRkZW4nKTsKICAgICAgICBsZXQgd2Via2l0SGlkZGVuID0gZG9jdW1lbnQuX19sb29rdXBHZXR0ZXJfXygnd2Via2l0SGlkZGVuJyk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnaGlkZGVuJywgewogICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfWNhdGNoe30KICAgICAgICBjb25zdCBibG9jayA9IGUgPT4gewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgfTsKICAgICAgICBsZXQgd2FzVmlkZW9QbGF5aW5nID0gdHJ1ZTsKICAgICAgICBjb25zdCB2aXNpYmlsaXR5Q2hhbmdlID0gZSA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hyb21lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuLmFwcGx5KGRvY3VtZW50KSA9PT0gdHJ1ZSB8fCAod2Via2l0SGlkZGVuICYmIHdlYmtpdEhpZGRlbi5hcHBseShkb2N1bWVudCkgPT09IHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhc1ZpZGVvUGxheWluZyA9ICF2aWRlb3NbMF0ucGF1c2VkICYmICF2aWRlb3NbMF0uZW5kZWQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YXNWaWRlb1BsYXlpbmcgJiYgIXZpZGVvc1swXS5lbmRlZCAmJiB2aWRlb3NbMF0ucGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBibG9jayhlKTsKICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96dmlzaWJpbGl0eWNoYW5nZScsIHZpc2liaWxpdHlDaGFuZ2UsIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc0ZvY3VzJywgYmxvY2ssIHRydWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICgvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnbW96SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnd2Via2l0SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfWNhdGNoe30KICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gcmVsb2FkVHdpdGNoUGxheWVyOwogICAgZGVjbGFyZU9wdGlvbnMod2luZG93KTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgbHNSZWxvYWRBZnRlckFkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZFBsYXllckFmdGVyQWQnKTsKICAgICAgICBpZiAobHNSZWxvYWRBZnRlckFkICE9PSBudWxsKSB7CiAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSBsc1JlbG9hZEFmdGVyQWQgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQbGF5ZXJUeXBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQbGF5ZXJUeXBlICE9PSBudWxsKSB7CiAgICAgICAgICAgIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgPSBsc1BsYXllclR5cGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGluQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BpbkJhY2t1cFBsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQaW5CYWNrdXAgIT09IG51bGwpIHsKICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9IGxzUGluQmFja3VwID09PSAndHJ1ZSc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzQ29vbGRvd24gPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkQ29vbGRvd25TZWNvbmRzJykpOwogICAgICAgIGlmICghaXNOYU4obHNDb29sZG93bikgJiYgbHNDb29sZG93biA+PSAwKSB7CiAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IGxzQ29vbGRvd247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzSGlkZUFkT3ZlcmxheSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19oaWRlQWRPdmVybGF5Jyk7CiAgICAgICAgaWYgKGxzSGlkZUFkT3ZlcmxheSA9PT0gJ3RydWUnKSB7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAnLnRhcy1hZGJsb2NrLW92ZXJsYXkgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0nOwogICAgICAgICAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDb25maWc6IFJlbG9hZFBsYXllckFmdGVyQWQgPSAnICsgUmVsb2FkUGxheWVyQWZ0ZXJBZCArICcsIEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJyArIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIG1vbml0b3JMaXZlU3RhdHVzKCk7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"}] \ No newline at end of file +[{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-auto-pip.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBicmF2ZS1hdXRvLXBpcCDigJQgYXV0b21hdGljIFBpY3R1cmUtaW4tUGljdHVyZSB0b2dnbGUgZm9yIEhUTUw1IDx2aWRlbz4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBXaGF0IGl0IGRvZXMKICogLS0tLS0tLS0tLS0tCiAqICAgMS4gRm9yY2UtZW5hYmxlcyBQaVAgb24gdmlkZW9zIHRoYXQgZXhwbGljaXRseSBkaXNhYmxlIGl0IChOZXRmbGl4LAogKiAgICAgIGNlcnRhaW4gRFJNIHBsYXllcnMpIGJ5IGNsZWFyaW5nIGBkaXNhYmxlUGljdHVyZUluUGljdHVyZWAgYW5kCiAqICAgICAgd2F0Y2hpbmcgZm9yIHNpdGVzIHRoYXQgdHJ5IHRvIHJlLXNldCBpdC4KICogICAyLiBXaXJlcyBgbWVkaWFTZXNzaW9uLnNldEFjdGlvbkhhbmRsZXIoImVudGVycGljdHVyZWlucGljdHVyZSIpYCBzbwogKiAgICAgIGJyb3dzZXJzIC8gT1NlcyB0aGF0IGZpcmUgaXQgKGF1dG8tUGlQIG9uIHRhYiBzd2l0Y2gpIGp1c3Qgd29yay4KICogICAzLiBBZGRzIGEgY2xpY2thYmxlIFBpUCBjb250cm9sOgogKiAgICAgICAgLSBOYXRpdmUgaW5qZWN0aW9uIG9uIFlvdVR1YmUgLyBUd2l0Y2ggLyBOZXRmbGl4IChtYXRjaGVzIGVhY2gKICogICAgICAgICAgc2l0ZSdzIGV4aXN0aW5nIGNvbnRyb2xzIGJhcikuCiAqICAgICAgICAtIE90aGVyd2lzZSBhIEZpcmVmb3gtc3R5bGUgIlBvcCBvdXQgdGhpcyB2aWRlbyIgaG92ZXIgcGlsbAogKiAgICAgICAgICB0aGF0IGZsb2F0cyBvdmVyIHRoZSB2aWRlbywgZmFkZXMgaW4gb24gaG92ZXIsIGZhZGVzIG91dAogKiAgICAgICAgICBhZnRlciBhIHNtYWxsIGdyYWNlIHBlcmlvZCwgYW5kIHNocmlua3MgdG8gaWNvbi1vbmx5IGFmdGVyCiAqICAgICAgICAgIHRoZSBmaXJzdCBjbGljay4KICogICA0LiBIYW5kbGVzIG1hbnkgdmlkZW9zIG9uIHRoZSBzYW1lIHBhZ2UgKGZlZWRzLCBjb21tZW50IGVtYmVkcywKICogICAgICBtb2RhbCBwbGF5ZXJzKSBhbmQgdHJhY2tzIGFkZC9yZW1vdmUgdmlhIE11dGF0aW9uT2JzZXJ2ZXIuCiAqCiAqIENvbmZpZ3VyYXRpb24gKHBlci1vcmlnaW4gbG9jYWxTdG9yYWdlKQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogICBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAKICogICAgIHVuc2V0IC8gIjEiIC8gInRydWUiIC8gInllcyIgLyAib24iICAgLT4gZ2VuZXJpYyBvdmVybGF5IHBpbGwgKGRlZmF1bHQpCiAqICAgICAiMCIgICAvICJmYWxzZSIgLyAibm8iICAgLyAib2ZmIiAgICAgIC0+IHVzZSBzaXRlLXNwZWNpZmljIG5hdGl2ZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gKFlvdVR1YmUvVHdpdGNoL05ldGZsaXgpCiAqCiAqICAgU2V0IHZpYSBEZXZUb29scyBjb25zb2xlIG9uIHRoZSBkZXNpcmVkIG9yaWdpbiwgdGhlbiByZWxvYWQgdGhlIHRhYi4KICoKICogQnJvd3NlciBzdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLQogKiAgIC0gQ2hyb21pdW0gKEJyYXZlLCBDaHJvbWUsIEVkZ2UpOiBmdWxsIHN1cHBvcnQsIGFsbCBmZWF0dXJlcy4KICogICAtIEZpcmVmb3g6IFBpUCB3b3JrcywgYnV0IEZpcmVmb3ggYWxyZWFkeSBzaGlwcyBhIGJ1aWx0LWluICJQb3Agb3V0CiAqICAgICB0aGlzIHZpZGVvIiB0b2dnbGUgc28gdGhlIHNjcmlwdCdzIHBpbGwgaXMgcmVkdW5kYW50IHRoZXJlLgogKiAgIC0gU2FmYXJpIChpT1MgMTQrKTogZmFsbHMgYmFjayB0byBgd2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZWAuIFRoZQogKiAgICAgaG92ZXIgcGlsbCBzd2l0Y2hlcyB0byBhIHRhcC10by1yZXZlYWwgcGlsbCAoMyBzIGF1dG8taGlkZSkuCiAqICAgLSBPdGhlciAvIG9sZGVyOiBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbm8gUGlQIEFQSSBpcwogKiAgICAgcHJlc2VudCBhdCBhbGwuCiAqCiAqIEFyY2hpdGVjdHVyZQogKiAtLS0tLS0tLS0tLS0KICogICAqIE9uZSBzaGFyZWQgbW91c2Vtb3ZlIC8gdG91Y2hzdGFydCAvIHNjcm9sbCAvIHJlc2l6ZSAvIGZ1bGxzY3JlZW4KICogICAgIGxpc3RlbmVyIHNldCwgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB2aWRlb3MgYXJlIG9uIHRoZSBwYWdlCiAqICAgICAoYG92ZXJsYXlzYCByZWdpc3RyeSArIGBhcm1HbG9iYWxzKClgIC8gYG1heWJlRGlzYXJtR2xvYmFscygpYCkuCiAqICAgKiBPZmYtc2NyZWVuIHZpZGVvcyBhcmUgZ2F0ZWQgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBhIHNpbmdsZQogKiAgICAgYEludGVyc2VjdGlvbk9ic2VydmVyYCAoYHZpc2libGVPdmVybGF5c2Agc3Vic2V0KS4KICogICAqIEV2ZXJ5IHBlci12aWRlbyByZWdpc3RyYXRpb24gcmVjb3JkcyBhIHRlYXJkb3duIGZ1bmN0aW9uIGluCiAqICAgICBgdmlkZW9DbGVhbnVwc2Agc28gdGhlIGxpc3RlbmVycywgb2JzZXJ2ZXJzLCBhbmQgcGlsbCBidXR0b24gYXJlCiAqICAgICBhbGwgcmVtb3ZlZCBpZiB0aGUgcGFnZSBkcm9wcyB0aGUgdmlkZW8gZWxlbWVudC4KICoKICogU291cmNlIG9mIG9yaWdpbmFsIGF1dG8tUGlQIGJlaGF2aW91cjoKICogICBodHRwczovL29sZC5yZWRkaXQuY29tL3IvYnJhdmVfYnJvd3Nlci9jb21tZW50cy8xcjhlZGc0LwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCihmdW5jdGlvbigpIHsKICBjb25zdCBWRVJTSU9OID0gInYwLjQyLXl0LWF1dG9waXAtdGFyZ2V0K2NvbmRpdGlvbmFsLXJlc3VtZSI7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFR1bmFibGVzCiAgLy8KICAvLyBDb2xsZWN0ZWQgaGVyZSBzbyBhIHVzZXIgLyBtYWludGFpbmVyIGNhbiBhZGp1c3Qgc3BhY2luZywgdGltaW5nIGFuZAogIC8vIHZpZXdwb3J0IGJlaGF2aW91ciB3aXRob3V0IGh1bnRpbmcgdGhyb3VnaCB0aGUgZmlsZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBjb25zdCBDT05GSUcgPSB7CiAgICAvLyBWZXJ0aWNhbCBvZmZzZXQgYWRkZWQgdG8gdGhlIHBpbGwncyBjZW50cmVkLW1pZC1yaWdodCBwb3NpdGlvbgogICAgLy8gKHBvc2l0aXZlID0gZG93bikuIEVtcGlyaWNhbGx5IHR1bmVkIHNvIHRoZSBwaWxsIHNpdHMgYmVsb3cgdGhlCiAgICAvLyB0eXBpY2FsIHNpdGUgY29udHJvbCBiYXIgaW5zdGVhZCBvZiBvdmVybGFwcGluZyBpdC4KICAgIFBJTExfT0ZGU0VUX1k6IDQwLAogICAgLy8gSG9yaXpvbnRhbCBnYXAgZnJvbSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdmlzaWJsZSB2aWRlbyB0byB0aGUgcGlsbC4KICAgIFBJTExfUklHSFRfTUFSR0lOOiAxMiwKICAgIC8vIE1pbmltdW0gZ2FwIGJldHdlZW4gdGhlIHBpbGwgYW5kIGFueSB2aWV3cG9ydCBlZGdlLgogICAgVklFV1BPUlRfUEFEOiA4LAogICAgLy8gRGVsYXkgYmV0d2VlbiB0aGUgY3Vyc29yIGxlYXZpbmcgdGhlIHZpZGVvL3BpbGwgcmVnaW9uIGFuZCB0aGUKICAgIC8vIHBpbGwgZmFkaW5nIG91dCDigJQgcHJvdGVjdHMgYWdhaW5zdCBmbGlja2VyIHdoZW4gdGhlIGN1cnNvcgogICAgLy8gY3Jvc3NlcyB0aGUgZ2FwIGZyb20gdmlkZW8gdG8gcGlsbC4KICAgIEhPVkVSX0dSQUNFX01TOiAxNTAsCiAgICAvLyBIb3cgbG9uZyB0aGUgcGlsbCBzdGF5cyByZXZlYWxlZCBhZnRlciBhIHRhcCBvbiBhIHRvdWNoIGRldmljZS4KICAgIFRPVUNIX1JFVkVBTF9NUzogMzAwMCwKICAgIC8vIE1heGltdW0gdGltZSB3ZSB3YWl0IGZvciBgbG9hZGVkbWV0YWRhdGFgIGJlZm9yZSBpc3N1aW5nIFBpUC4KICAgIE1FVEFEQVRBX1dBSVRfTVM6IDMwMDAsCiAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBidWZmZXIgc28gdGhlIHBpbGwgaXMgaW4gcGxhY2UgYmVmb3JlIHRoZQogICAgLy8gdmlkZW8gZnVsbHkgc2Nyb2xscyBpbnRvIHZpZXcuCiAgICBJT19ST09UX01BUkdJTjogIjEwMHB4IiwKICAgIC8vIEdyYWNlIHdpbmRvdyBhZnRlciBhIFlvdVR1YmUgU1BBIG5hdmlnYXRpb24gZHVyaW5nIHdoaWNoIHRoZSBwaWxsCiAgICAvLyBzdGF5cyBzdXBwcmVzc2VkIGV2ZW4gaWYgdGhlIG5ldyBVUkwgd291bGQgb3RoZXJ3aXNlIGJlIGVsaWdpYmxlLgogICAgLy8gTGV0cyB0aGUgd2F0Y2gtcGFnZSBwbGF5ZXIgbW91bnQgYW5kIGF2b2lkcyBhIGJyaWVmIGZsYXNoIHdoZW4gdGhlCiAgICAvLyBjdXJzb3IgaXMgc3RpbGwgYXQgdGhlIHByZXZpb3VzIGhvdmVyIHRhcmdldCdzIGNvb3JkaW5hdGVzLgogICAgWVRfTkFWX0dSQUNFX01TOiA1MDAsCiAgICAvLyBJZiBhIG5hdGl2ZSBpbmplY3RvciAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpIGtlZXBzIHJldHVybmluZwogICAgLy8gZmFsc2UgZm9yIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIGdpdmUgdXAKICAgIC8vIG9uIG5hdGl2ZSBpbmplY3Rpb24gYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQuCiAgICAvLyBHZW5lcm91cyBvbiBwdXJwb3NlIOKAlCBzbG93IHBsYXllciBtb3VudHMgKG5ldHdvcmstc3RhbGxlZCBpZnJhbWVzLAogICAgLy8gbG9uZy1ydW5uaW5nIFJlYWN0IGh5ZHJhdGlvbikgc2hvdWxkbid0IHRyaXAgdGhlIGZhbGxiYWNrLgogICAgTkFUSVZFX0ZBTExCQUNLX01TOiAxMDAwMCwKICB9OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNb2R1bGUtbGV2ZWwgc3RhdGUKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gdmlkZW8gZWxlbWVudCAtPiBjbGVhbnVwIGZ1bmN0aW9uLiBQb3B1bGF0ZWQgd2hlbiBhIHZpZGVvIGlzIHdpcmVkCiAgLy8gdXA7IGNhbGxlZCBmcm9tIHRoZSBkaXNjb3ZlcnkgTXV0YXRpb25PYnNlcnZlciB3aGVuIGEgdHJhY2tlZCB2aWRlbwogIC8vIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB3ZSBjYW4gcmVsZWFzZSBldmVyeSBsaXN0ZW5lciBhbmQgdGhlCiAgLy8gcGlsbCBET00gbm9kZSBpdCBvd25zLgogIGNvbnN0IHZpZGVvQ2xlYW51cHMgPSBuZXcgV2Vha01hcCgpOwoKICAvLyBZb3VUdWJlLXNwZWNpZmljIHN0YXRlIGZvciB0aGUgVVJMLWdhdGUgKyBTUEEtbmF2LWdyYWNlIGxvZ2ljIGluCiAgLy8gdXBkYXRlKCkuIEhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHNvIHVwZGF0ZSgpIGRvZXNuJ3QgcmUtdGVzdCB0aGUKICAvLyBob3N0IHJlZ2V4IGV2ZXJ5IHRpY2sg4oCUIGhvc3RuYW1lIGlzIGludmFyaWFudCBmb3IgdGhlIHBhZ2UgbGlmZXRpbWUsCiAgLy8gYW5kIHRoZSBwYXRobmFtZSByZWdleCBvbmx5IHJlLXJ1bnMgb24gYWN0dWFsIFNQQSBwYXRoIGNoYW5nZXMuCiAgLy8gV2h5IHRoaXMgZXhpc3RzOiBZb3VUdWJlJ3MgaG9tZXBhZ2UgLyBmZWVkIC8gc2VhcmNoIC8gY2hhbm5lbCBwYWdlcwogIC8vIHJldXNlIHRoZSBzYW1lIGBodG1sNS12aWRlby1jb250YWluZXJgIDx2aWRlbz4gZWxlbWVudCBhcyB0aGUgd2F0Y2gKICAvLyBwYWdlIGZvciBob3Zlci10aHVtYm5haWwgcHJldmlld3MsIHJlcG9zaXRpb25pbmcgaXQgb3ZlciB3aGljaGV2ZXIKICAvLyB0aHVtYm5haWwgdGhlIGN1cnNvciBpcyBvbi4gRE9NLWxldmVsIHNpZ25hbHMgKHNpemUsIG11dGVkLCBsb29wLAogIC8vIHBhcmVudCBjbGFzcykgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHByZXZpZXcgYW5kIHdhdGNoLCBzbyB0aGUgVVJMIGlzCiAgLy8gdGhlIG9ubHkgcmVsaWFibGUgZGlzdGluZ3Vpc2hlci4KICBjb25zdCBfeXRIb3N0ID0gLyg/Ol58XC4pKD86eW91dHViZVwuY29tfHlvdXR1YmUtbm9jb29raWVcLmNvbSkkL2kudGVzdChsb2NhdGlvbi5ob3N0bmFtZSk7CiAgY29uc3QgX3l0V2F0Y2hQYXRoID0gL15cLyg/OndhdGNofGVtYmVkfGxpdmV8c2hvcnRzKS87CiAgbGV0IF95dExhc3RQYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgbGV0IF95dFByZXZpZXdBcmVhID0gX3l0SG9zdCAmJiAhX3l0V2F0Y2hQYXRoLnRlc3QoX3l0TGFzdFBhdGgpOwogIGxldCBfeXROYXZBdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE92ZXJsYXkgcmVnaXN0cnkgKyB2aWV3cG9ydCBnYXRpbmcKICAvLwogIC8vIEdvYWw6IE8oMSkgZG9jdW1lbnQvd2luZG93IGxpc3RlbmVycyByZWdhcmRsZXNzIG9mIHZpZGVvIGNvdW50LCBhbmQKICAvLyBPKHZpc2libGUpIChub3QgTyh0b3RhbCkpIHdvcmsgcGVyIHNjcm9sbC9tb3VzZW1vdmUgdGljay4gQSBzaW5nbGUKICAvLyBzaGFyZWQgbGlzdGVuZXIgc2V0IHdhbGtzIHRoZSByZWdpc3RyeTsgYW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIKICAvLyBuYXJyb3dzIGl0ZXJhdGlvbiB0byB0aGUgdmlkZW9zIGFjdHVhbGx5IG9uIHNjcmVlbi4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gRXZlcnkgb3ZlcmxheSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgKGxpZmV0aW1lIHJlZ2lzdHJ5KS4KICBjb25zdCBvdmVybGF5cyA9IG5ldyBTZXQoKTsKICAvLyBTdWJzZXQgb2YgYG92ZXJsYXlzYCB3aG9zZSB2aWRlbyBpcyBjdXJyZW50bHkgaW50ZXJzZWN0aW5nIHRoZQogIC8vIHZpZXdwb3J0LiBIb3QtcGF0aCBpdGVyYXRpb24gdXNlcyB0aGlzIHNldCBzbyBvZmYtc2NyZWVuIHZpZGVvcyBpbgogIC8vIGxvbmcgZmVlZHMgZG9uJ3QgcGF5IGxheW91dCBjb3N0cyBvbiBldmVyeSBzY3JvbGwgZnJhbWUuCiAgY29uc3QgdmlzaWJsZU92ZXJsYXlzID0gbmV3IFNldCgpOwogIC8vIFJldmVyc2UgbG9va3VwIGZvciB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sgKGVudHJ5LnRhcmdldAogIC8vIGlzIHRoZSB2aWRlbyBlbGVtZW50KS4KICBjb25zdCB2aWRlb1RvT3ZlcmxheSA9IG5ldyBXZWFrTWFwKCk7CiAgbGV0IGludGVyc2VjdGlvbk9ic2VydmVyID0gbnVsbDsKICBmdW5jdGlvbiBnZXRJTygpIHsKICAgIGlmIChpbnRlcnNlY3Rpb25PYnNlcnZlcikgcmV0dXJuIGludGVyc2VjdGlvbk9ic2VydmVyOwogICAgaWYgKHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgZSA9IGVudHJpZXNbaV07CiAgICAgICAgY29uc3QgaW5zdCA9IHZpZGVvVG9PdmVybGF5LmdldChlLnRhcmdldCk7CiAgICAgICAgaWYgKCFpbnN0KSBjb250aW51ZTsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmFkZChpbnN0KTsKICAgICAgICB9IGVsc2UgaWYgKHZpc2libGVPdmVybGF5cy5kZWxldGUoaW5zdCkpIHsKICAgICAgICAgIC8vIEZvcmNlIGEgZmluYWwgdXBkYXRlIHNvIGFueSB2aXNpYmxlIHBpbGwgaGlkZXMgY2xlYW5seS4KICAgICAgICAgIGluc3QudXBkYXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7IHJvb3RNYXJnaW46IENPTkZJRy5JT19ST09UX01BUkdJTiB9KTsKICAgIHJldHVybiBpbnRlcnNlY3Rpb25PYnNlcnZlcjsKICB9CiAgLy8gTGFzdCBrbm93biBwb2ludGVyIHBvc2l0aW9uIChudW1iZXJzLCBuZXZlciB0aGUgTW91c2VFdmVudCDigJQga2VlcGluZwogIC8vIHRoZSBldmVudCBhbGl2ZSBhY3Jvc3MgckFGIHRpY2tzIHBpbnMgZXh0cmEgRE9NIHJlZmVyZW5jZXMgaW4gVjgncwogIC8vIGNsb3N1cmUgZW52aXJvbm1lbnQpLgogIGxldCBtbVggPSAwLCBtbVkgPSAwOwogIC8vIENvYWxlc2NpbmcgZmxhZ3Mg4oCUIGNvbGxhcHNlIGJ1cnN0cyBvZiBtb3VzZW1vdmUgLyBzY3JvbGwgLyBldGMuIGludG8KICAvLyBhIHNpbmdsZSBwZXItZnJhbWUgdGljayBpbnN0ZWFkIG9mIG9uZSB0aWNrIHBlciBldmVudC4KICBsZXQgbW1UaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IHVwZFRpY2tTY2hlZHVsZWQgPSBmYWxzZTsKICAvLyBUcnVlIHdoZW4gZ2xvYmFsIGxpc3RlbmVycyBhcmUgY3VycmVudGx5IGF0dGFjaGVkLiBSZWZlcmVuY2UtY291bnRlZAogIC8vIGJ5IGBvdmVybGF5cy5zaXplYCBzbyB3ZSBvbmx5IGxpc3RlbiB3aGlsZSBhdCBsZWFzdCBvbmUgb3ZlcmxheSBpcyBsaXZlLgogIGxldCBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gX21tVGljaygpIHsKICAgIG1tVGlja1NjaGVkdWxlZCA9IGZhbHNlOwogICAgY29uc3QgeCA9IG1tWCwgeSA9IG1tWTsKICAgIC8vIEl0ZXJhdGUgb25seSB0aGUgdmlzaWJsZSBzdWJzZXQ7IG9mZi1zY3JlZW4gdmlkZW9zIGNhbid0IGJlIGhvdmVyZWQuCiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC5oYW5kbGVQb2ludGVyKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX29uRG9jTW91c2VNb3ZlKGUpIHsKICAgIG1tWCA9IGUuY2xpZW50WDsKICAgIG1tWSA9IGUuY2xpZW50WTsKICAgIGlmIChtbVRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIG1tVGlja1NjaGVkdWxlZCA9IHRydWU7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX21tVGljayk7CiAgfQogIGZ1bmN0aW9uIF9vbkRvY1RvdWNoU3RhcnQoZSkgewogICAgY29uc3QgdCA9IChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB8fCAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKTsKICAgIGlmICghdCkgcmV0dXJuOwogICAgY29uc3QgeCA9IHQuY2xpZW50WCwgeSA9IHQuY2xpZW50WTsKICAgIHZpc2libGVPdmVybGF5cy5mb3JFYWNoKChpbnN0KSA9PiBpbnN0LmhhbmRsZVRvdWNoKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX3NjaGVkdWxlVXBkYXRlQWxsKCkgewogICAgaWYgKHVwZFRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIHVwZFRpY2tTY2hlZHVsZWQgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF91cGRhdGVBbGxUaWNrKTsKICB9CiAgZnVuY3Rpb24gX3VwZGF0ZUFsbFRpY2soKSB7CiAgICB1cGRUaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC51cGRhdGUoKSk7CiAgfQoKICBmdW5jdGlvbiBhcm1HbG9iYWxzKCkgewogICAgaWYgKGdsb2JhbHNBcm1lZCkgcmV0dXJuOwogICAgZ2xvYmFsc0FybWVkID0gdHJ1ZTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIGFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlRGlzYXJtR2xvYmFscygpIHsKICAgIGlmICghZ2xvYmFsc0FybWVkIHx8IG92ZXJsYXlzLnNpemUgPiAwKSByZXR1cm47CiAgICBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICAvLyBUZWFyIGRvd24gdGhlIEludGVyc2VjdGlvbk9ic2VydmVyIHRvbyDigJQgaXQncyB0aWVkIHRvIHRoZSBzYW1lCiAgICAvLyBvdmVybGF5IGxpZmVjeWNsZSBhcyB0aGUgZ2xvYmFsIGxpc3RlbmVycy4gUmUtY3JlYXRlZCBsYXppbHkgYnkKICAgIC8vIGdldElPKCkgaWYgYSBmdXR1cmUgb3ZlcmxheSByZWdpc3RlcnMuCiAgICBpZiAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHsKICAgICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICBpbnRlcnNlY3Rpb25PYnNlcnZlciA9IG51bGw7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDYXBhYmlsaXR5ICsgZW52aXJvbm1lbnQgZGV0ZWN0aW9uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBpUCBhdmFpbGFiaWxpdHkgYWNyb3NzIGJyb3dzZXJzOgogIC8vICAgSEFTX1NUQU5EQVJEX1BJUCDigJQgYHJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlYCAoQ2hyb21pdW0gLyBGaXJlZm94IC8gaU9TIDE0KykuCiAgLy8gICBIQVNfV0VCS0lUX1BJUCAgIOKAlCBvbGRlciBpT1MgU2FmYXJpJ3MgYHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGVgLgogIC8vIFRoZSBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbmVpdGhlciBpcyBwcmVzZW50LgogIGNvbnN0IEhBU19TVEFOREFSRF9QSVAgPSAhIWRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbmFibGVkOwogIGNvbnN0IEhBU19XRUJLSVRfUElQID0gIndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUiIGluIEhUTUxWaWRlb0VsZW1lbnQucHJvdG90eXBlOwogIGNvbnN0IFBJUF9TVVBQT1JURUQgPSBIQVNfU1RBTkRBUkRfUElQIHx8IEhBU19XRUJLSVRfUElQOwoKICAvLyBUb3VjaCBjYXBhYmlsaXR5IOKAlCBzd2l0Y2hlcyB0aGUgb3ZlcmxheSBmcm9tIGhvdmVyLWRyaXZlbiB0bwogIC8vIHRhcC10by1yZXZlYWwgb24gaU9TIC8gQW5kcm9pZC4KICBjb25zdCBJU19UT1VDSCA9ICJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwOwoKICAvLyBDb21iaW5lZCBmdWxsc2NyZWVuIGNoZWNrIGFjcm9zcyB0aGUgdGhyZWUgdmVuZG9yIHZhcmlhbnRzOgogIC8vICAgLSBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAgICAgICAoc3RhbmRhcmQpCiAgLy8gICAtIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IChvbGRlciBDaHJvbWl1bSAvIFNhZmFyaSBkZXNrdG9wKQogIC8vICAgLSB2aWRlby53ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbiAoaU9TIG5hdGl2ZSB2aWRlbyBmdWxsc2NyZWVuLAogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggbmV2ZXIgc2V0cyBkb2N1bWVudC4qKQogIGZ1bmN0aW9uIGlzRnVsbHNjcmVlbih2aWRlbykgewogICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICBpZiAodmlkZW8gJiYgdmlkZW8ud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW4pIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gQ29uc29sZSBvdXRwdXQuIGBsb2dgIGZvciBvbmUtbGluZSBzdWNjZXNzIG1lc3NhZ2VzIG9uIGluamVjdGlvbiwKICAvLyBgd2FybmAgZm9yIGZhaWx1cmVzIChrZXB0IHF1aWV0IGJ5IGRlZmF1bHQpLgogIGNvbnN0IFRBRyA9ICJbYnJhdmUtYXV0by1waXAgIiArIFZFUlNJT04gKyAiXSI7CiAgY29uc3QgbG9nID0gKC4uLmEpID0+IGNvbnNvbGUubG9nKFRBRywgLi4uYSk7CiAgY29uc3Qgd2FybiA9ICguLi5hKSA9PiBjb25zb2xlLndhcm4oVEFHLCAuLi5hKTsKCiAgLy8gUGljayB0aGUgYmVzdCA8dmlkZW8+IGZvciBhbiBhdXRvLVBpUCBpbnRlbnQgZmlyZWQgYnkgdGhlIE9TIC8KICAvLyBicm93c2VyLiBVc2VkIGJ5IHRoZSBnbG9iYWwgYG1lZGlhU2Vzc2lvbmAgYWN0aW9uIGhhbmRsZXIgc28gdGhlCiAgLy8gKmxhc3QqIHJlZ2lzdGVyZWQgdmlkZW8gZG9lc24ndCBnZXQgUGlQJ2QgYnkgZGVmYXVsdCDigJQgc2VlIGNvbW1lbnQKICAvLyBhdCB0aGUgcmVnaXN0cmF0aW9uIHNpdGUgZm9yIHRoZSBZb3VUdWJlIGJsYWNrLXNjcmVlbiByYXRpb25hbGUuCiAgZnVuY3Rpb24gcGlja0F1dG9QaXBUYXJnZXQoKSB7CiAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHJldHVybiBkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudDsKICAgIGNvbnN0IHZpZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgIGxldCBiZXN0UGxheWluZyA9IG51bGwsIGJlc3RQbGF5aW5nQXJlYSA9IDA7CiAgICBsZXQgYmVzdFJlYWR5ID0gbnVsbCwgYmVzdFJlYWR5QXJlYSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZHMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgdiA9IHZpZHNbaV07CiAgICAgIGlmICh2LmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKSBjb250aW51ZTsKICAgICAgY29uc3QgciA9IHYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGEgPSBNYXRoLm1heCgwLCByLndpZHRoKSAqIE1hdGgubWF4KDAsIHIuaGVpZ2h0KTsKICAgICAgaWYgKGEgPD0gMCkgY29udGludWU7CiAgICAgIGlmICghdi5wYXVzZWQgJiYgIXYuZW5kZWQgJiYgdi5yZWFkeVN0YXRlID49IDIgJiYgYSA+IGJlc3RQbGF5aW5nQXJlYSkgewogICAgICAgIGJlc3RQbGF5aW5nID0gdjsgYmVzdFBsYXlpbmdBcmVhID0gYTsKICAgICAgfQogICAgICBpZiAodi5yZWFkeVN0YXRlID49IDEgJiYgYSA+IGJlc3RSZWFkeUFyZWEpIHsKICAgICAgICBiZXN0UmVhZHkgPSB2OyBiZXN0UmVhZHlBcmVhID0gYTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJlc3RQbGF5aW5nIHx8IGJlc3RSZWFkeTsKICB9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFBpUCBpY29uIGZhY3RvcnkKICAvLwogIC8vIEJ1aWx0IHdpdGggY3JlYXRlRWxlbWVudE5TIGluc3RlYWQgb2YgaW5uZXJIVE1MIHRvIGF2b2lkIFRydXN0ZWRUeXBlcwogIC8vIC8gQ1NQIGByZXF1aXJlVHJ1c3RlZFR5cGVzRm9yICdzY3JpcHQnYCB2aW9sYXRpb25zIG9uIFlvdVR1YmUgZXRjLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERlZmVuc2UtaW4tZGVwdGggaGVscGVyIHVzZWQgd2hlbiBjbG9uaW5nIHRoaXJkLXBhcnR5IHdyYXBwZXIKICAvLyBlbGVtZW50cyAoTmV0ZmxpeCdzIC5tZWRpdW0gaWNvbiB3cmFwcGVyLCBUd2l0Y2gncyByaWdodC1jb250cm9scwogIC8vIHdyYXBwZXIpLiBjbG9uZU5vZGUoZmFsc2UpIGNhcnJpZXMgZm9yd2FyZCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMKICAvLyBhbmQgdGhlIGBzdHlsZWAgYXR0cmlidXRlIOKAlCB3ZSBzdHJpcDoKICAvLyAgIC0gYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIGBvbipgICh3b3VsZCByZS1maXJlIHRoZSBzaXRlJ3MKICAvLyAgICAgaW5saW5lIGV2ZW50IGhhbmRsZXJzIG9uIG91ciBjbG9uZSksIGFuZAogIC8vICAgLSB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgaXRzZWxmIChjb3VsZCBjYXJyeSBhIGB1cmwoLi4uKWAgdG9rZW4KICAvLyAgICAgdGhhdCB0cmlnZ2VycyBhIG5ldHdvcmsgZmV0Y2ggd2hlbiB0aGUgY2xvbmUgaXMgcGFyZW50ZWQpLCBhbmQKICAvLyAgIC0gdGhlIGBpZGAgYXR0cmlidXRlIChjbG9uaW5nIHByb2R1Y2VzIGEgZHVwbGljYXRlLCB3aGljaCB3b3VsZAogIC8vICAgICBicmVhayB0aGUgc2l0ZSdzIG93biBnZXRFbGVtZW50QnlJZCAvIENTUyAjaWQgc2VsZWN0b3JzKS4KICAvLyBXZSByZWx5IG9uIHRoZSBjbG9uZWQgZWxlbWVudCdzIGNsYXNzIGxpc3QgZm9yIHNpemluZy9zcGFjaW5nLAogIC8vIHdoaWNoIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHZpYSB0aGUgc2l0ZSdzIGV4dGVybmFsIHN0eWxlc2hlZXQuCiAgZnVuY3Rpb24gc3RyaXBJbmxpbmVIYW5kbGVycyhlbCkgewogICAgY29uc3QgYXR0cnMgPSBlbC5hdHRyaWJ1dGVzOwogICAgZm9yIChsZXQgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBhdHRyc1tpXS5uYW1lOwogICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJvbiIpIHx8IG5hbWUgPT09ICJzdHlsZSIgfHwgbmFtZSA9PT0gImlkIikgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogIH0KCiAgY29uc3QgUElQX1NWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgZnVuY3Rpb24gbWFrZVBpcFN2ZyhzaXplKSB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoUElQX1NWR19OUywgInN2ZyIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgidmlld0JveCIsICIwIDAgMjQgMjQiKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgc2l6ZSk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBzaXplKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgImN1cnJlbnRDb2xvciIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjIiKTsKICAgIGNvbnN0IHIxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMS5zZXRBdHRyaWJ1dGUoIngiLCAiMyIpOyByMS5zZXRBdHRyaWJ1dGUoInkiLCAiNSIpOwogICAgcjEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsICIxOCIpOyByMS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsICIxNCIpOyByMS5zZXRBdHRyaWJ1dGUoInJ4IiwgIjIiKTsKICAgIGNvbnN0IHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIngiLCAiMTIiKTsgcjIuc2V0QXR0cmlidXRlKCJ5IiwgIjExIik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgIjciKTsgcjIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCAiNiIpOyByMi5zZXRBdHRyaWJ1dGUoInJ4IiwgIjEiKTsKICAgIHIyLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJjdXJyZW50Q29sb3IiKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChyMSk7IHN2Zy5hcHBlbmRDaGlsZChyMik7CiAgICByZXR1cm4gc3ZnOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGlQIHRvZ2dsZSBlbnRyeSBwb2ludAogIC8vCiAgLy8gU2luZ2xlIGFzeW5jIGZ1bmN0aW9uIHNoYXJlZCBieSBldmVyeSBjbGljayBoYW5kbGVyLiBXYWxrcyB0aGUKICAvLyBhdmFpbGFibGUgQVBJcyBpbiBwcmlvcml0eSBvcmRlciBhbmQgaXMgcm9idXN0IHRvIGEgY2xpY2sgdGhhdCBsYW5kcwogIC8vIGJlZm9yZSB0aGUgdmlkZW8gaGFzIGxvYWRlZCBlbm91Z2ggbWV0YWRhdGEgKHdhaXRzIHVwIHRvIDMgcykuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlUGlwKHZpZGVvKSB7CiAgICB0cnkgewogICAgICAvLyBpT1MgU2FmYXJpIHBhdGgg4oCUIHdlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUgdG9nZ2xlcyBiZXR3ZWVuCiAgICAgIC8vICJpbmxpbmUiLCAicGljdHVyZS1pbi1waWN0dXJlIiBhbmQgImZ1bGxzY3JlZW4iLgogICAgICBpZiAoIUhBU19TVEFOREFSRF9QSVAgJiYgSEFTX1dFQktJVF9QSVAgJiYKICAgICAgICAgIHR5cGVvZiB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdmlkZW8ud2Via2l0UHJlc2VudGF0aW9uTW9kZSA9PT0gInBpY3R1cmUtaW4tcGljdHVyZSIKICAgICAgICAgID8gImlubGluZSIgOiAicGljdHVyZS1pbi1waWN0dXJlIjsKICAgICAgICB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlKHRhcmdldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIFN0YW5kYXJkIEFQSSBwYXRoLgogICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQgPT09IHZpZGVvKSB7CiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZXhpdFBpY3R1cmVJblBpY3R1cmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCAxKSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7IHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSk7IHJlc29sdmUoKTsgfTsKICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgc2V0VGltZW91dChkb25lLCBDT05GSUcuTUVUQURBVEFfV0FJVF9NUyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB2aWRlby5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGF3YWl0IHZpZGVvLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIExhc3QtcmVzb3J0IGlPUyBmYWxsYmFjayBldmVuIGlmIEhBU19TVEFOREFSRF9QSVAgd2FzIGNsYWltZWQuCiAgICAgIGlmICh0eXBlb2YgdmlkZW8ud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUoInBpY3R1cmUtaW4tcGljdHVyZSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB3YXJuKCJQaVAgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTsKICAgIH0gY2F0Y2ggKGVycikgeyB3YXJuKCJQaVAgcmVxdWVzdCBmYWlsZWQ6IiwgZXJyLm1lc3NhZ2UgfHwgZXJyKTsgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gU2l0ZS1zcGVjaWZpYyBuYXRpdmUgaW5qZWN0b3JzCiAgLy8KICAvLyBFYWNoIGluamVjdG9yIGlzIGlkZW1wb3RlbnQgKHNhZmUgdG8gcmUtcnVuIHdoZW4gdGhlIHNpdGUncyBSZWFjdAogIC8vIHJvb3QgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIpIGFuZCByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAvIGZhbHNlCiAgLy8gd2hlbiB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpc24ndCBpbiB0aGUgRE9NIHlldC4gVGhleSdyZSBkcml2ZW4gYnkKICAvLyBhIHBlcnNpc3RlbnQgTXV0YXRpb25PYnNlcnZlciBpbiBgdHJ5TmF0aXZlKClgIHNvIHJlLXJlbmRlcnMgZG9uJ3QKICAvLyBwZXJtYW5lbnRseSBsb3NlIHRoZSBidXR0b24uCiAgLy8KICAvLyBTdHJhdGVneSBhY3Jvc3Mgc2l0ZXM6CiAgLy8gICAtIFlvdVR1YmU6IGluc2VydCBhIDxidXR0b24gY2xhc3M9Inl0cC1idXR0b24iPiBhbG9uZ3NpZGUgdGhlCiAgLy8gICAgIGV4aXN0aW5nIHNldHRpbmdzL21pbmlwbGF5ZXIvc2l6ZSBpY29ucy4gSW5oZXJpdHMgWW91VHViZSdzCiAgLy8gICAgIGF1dG8tZmFkZSAvIGhvdmVyIGJlaGF2aW91ciBmb3IgZnJlZS4KICAvLyAgIC0gVHdpdGNoOiBjbG9uZSB0aGUgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgcmlnaHQtc2lkZSBjb250cm9sCiAgLy8gICAgIGJ1dHRvbiAoc2V0dGluZ3MvZnVsbHNjcmVlbi90aGVhdHJlKSBhbmQgcGxhY2Ugb3VyIGJ1dHRvbiBpbnNpZGUsCiAgLy8gICAgIHNvIHdlIGluaGVyaXQgVHdpdGNoJ3MgZmxleCBzcGFjaW5nIGNsYXNzZXMuCiAgLy8gICAtIE5ldGZsaXg6IGNsb25lIHRoZSAubWVkaXVtIGljb24gd3JhcHBlciAqYW5kKiB0aGUgM3JlbSBzcGFjZXIKICAvLyAgICAgdGhhdCBzaXRzIGJldHdlZW4gc2libGluZ3MsIHNvIHRoZSByaHl0aG0gb2YgdGhlIGljb24gcm93IGlzCiAgLy8gICAgIHByZXNlcnZlZCBhbmQgZnVsbHNjcmVlbiBzdGF5cyBpbiBpdHMgcm93LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGFkZFlvdVR1YmVCdXR0b24odmlkZW8pIHsKICAgIGlmIChfc2l0ZURpc2FibGVkKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCByaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi55dHAtcmlnaHQtY29udHJvbHMiKTsKICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTsKICAgIGlmIChyaWdodC5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgYnRuLmNsYXNzTmFtZSA9ICJ5dHAtYnV0dG9uIGJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjp0b3A7Y29sb3I6I2ZmZjsiOwogICAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDM2KTsKICAgICAgc3ZnLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTpibG9jazsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwoKICAgICAgY29uc3QgYW5jaG9yID0gcmlnaHQucXVlcnlTZWxlY3RvcigiLnl0cC1taW5pcGxheWVyLWJ1dHRvbiwgLnl0cC1zZXR0aW5ncy1idXR0b24sIC55dHAtc2l6ZS1idXR0b24iKTsKICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IucGFyZW50Tm9kZSkgewogICAgICAgIGFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShidG4sIGFuY2hvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmlnaHQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgfQogICAgICBsb2coImluamVjdGVkIG9uIFlvdVR1YmUiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgd2FybigiWW91VHViZSBpbmplY3QgZmFpbGVkOiIsIGVyci5tZXNzYWdlIHx8IGVycik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIFR3aXRjaDogY2xvbmUgdGhlIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHJpZ2h0LXNpZGUgY29udHJvbCBidXR0b24KICAvLyAoc2V0dGluZ3Mgb3IgZnVsbHNjcmVlbikgYW5kIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUgaXQsIHRoZW4gaW5zZXJ0IGF0CiAgLy8gdGhlIHNhbWUgRE9NIGxldmVsIHNvIHNwYWNpbmcvc2l6aW5nIG1hdGNoLgogIGxldCB0d2l0Y2hJbmplY3RDb3VudCA9IDA7CiAgZnVuY3Rpb24gYWRkVHdpdGNoQnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgLy8gQW5jaG9yIG9uIHRoZSBmdWxsc2NyZWVuIC8gdGhlYXRyZSByb3cgc28gd2UgbGFuZCBhbG9uZ3NpZGUgY2FzdCwKICAgIC8vIHRoZWF0cmUgYW5kIGZ1bGxzY3JlZW4g4oCUIHNldHRpbmdzIG9mdGVuIGxpdmVzIGluIGEgc2VwYXJhdGUgcm93IGluCiAgICAvLyB0aGUgcG9wb3V0IHBsYXllciBsYXlvdXQuCiAgICBjb25zdCBQRUVSX1NFTCA9CiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWZ1bGxzY3JlZW4tYnV0dG9uIl0sJyArCiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLXRoZWF0cmUtbW9kZS1idXR0b24iXSwnICsKICAgICAgJ1tkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItc2V0dGluZ3MtYnV0dG9uIl0nOwogICAgY29uc3QgYW5jaG9yQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihQRUVSX1NFTCk7CiAgICBpZiAoIWFuY2hvckJ0bikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFdhbGsgdXAgdG8gdGhlIHJvdyBjb250YWluZXIuIFR3byBzdG9wIHNpZ25hbHMsIGluIHByaW9yaXR5IG9yZGVyOgogICAgLy8gICAxLiBTdHJvbmc6IGEgcGFyZW50IHRoYXQgaGFzIG11bHRpcGxlIGNoaWxkcmVuIEFORCBjb250YWlucyBhCiAgICAvLyAgICAgIHBlZXIgY29udHJvbCBvdXRzaWRlIG91ciBjdXJyZW50IHN1YnRyZWUg4oCUIHRoYXQncyBhbG1vc3QKICAgIC8vICAgICAgY2VydGFpbmx5IHRoZSBhY3R1YWwgY29udHJvbCByb3cuCiAgICAvLyAgIDIuIFdlYWsgKGZhbGxiYWNrKTogdGhlIGZpcnN0IHBhcmVudCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuIHdlCiAgICAvLyAgICAgIHBhc3NlZCBkdXJpbmcgdGhlIHdhbGsuIFVzZWQgd2hlbiB0aGUgc3Ryb25nIHNpZ25hbCBuZXZlcgogICAgLy8gICAgICBmaXJlcywgc28gbGF5b3V0cyB0aGF0IGRvbid0IGV4cG9zZSBwZWVyIGNvbnRyb2xzIGF0IHRoZQogICAgLy8gICAgICBzYW1lIGxldmVsIHN0aWxsIHdvcmsuCiAgICAvLyBDb21iaW5lZCwgdGhpcyBhZGRyZXNzZXMgdGhlIHJldmlldyBjb25jZXJuIGFib3V0IG5vbi1jb250cm9sCiAgICAvLyBzaWJsaW5ncyBoaWphY2tpbmcgdGhlIHN0cnVjdHVyYWwgd2FsayB3aGlsZSBrZWVwaW5nIHRoZSBvcmlnaW5hbAogICAgLy8gYmVoYXZpb3VyIGFzIGEgc2FmZXR5IG5ldC4KICAgIGxldCBhbmNob3JXcmFwcGVyID0gYW5jaG9yQnRuOwogICAgbGV0IHN0cnVjdHVyYWxGYWxsYmFjayA9IG51bGw7CiAgICB3aGlsZSAoYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlICYmIGFuY2hvcldyYXBwZXIucGFyZW50Tm9kZS50YWdOYW1lICE9PSAiQk9EWSIpIHsKICAgICAgY29uc3QgcGFyZW50ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50LmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgICBjb25zdCBwZWVycyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFBFRVJfU0VMKTsKICAgICAgICBsZXQgaGFzT3V0c2lkZVBlZXIgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIWFuY2hvcldyYXBwZXIuY29udGFpbnMocGVlcnNbaV0pKSB7IGhhc091dHNpZGVQZWVyID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc091dHNpZGVQZWVyKSBicmVhazsKICAgICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgc3RydWN0dXJhbEZhbGxiYWNrID0gYW5jaG9yV3JhcHBlcjsKICAgICAgfQogICAgICBhbmNob3JXcmFwcGVyID0gcGFyZW50OwogICAgfQogICAgaWYgKCFhbmNob3JXcmFwcGVyLnBhcmVudE5vZGUgfHwgYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlLnRhZ05hbWUgPT09ICJCT0RZIikgewogICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgcmV0dXJuIGZhbHNlOwogICAgICBhbmNob3JXcmFwcGVyID0gc3RydWN0dXJhbEZhbGxiYWNrOwogICAgfQogICAgY29uc3Qgcm93ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKICAgIGlmIChyb3cucXVlcnlTZWxlY3RvcigiLmJyYXZlLXBpcC1idG4iKSkgcmV0dXJuIHRydWU7CiAgICAvLyBTYW5pdHkgY2hlY2s6IGEgaGVhbHRoeSBUd2l0Y2ggcmlnaHQtY29udHJvbHMgcm93IGNvbnRhaW5zIGF0CiAgICAvLyBsZWFzdCB0d28gb2YgdGhlIHBlZXIgYnV0dG9ucyAoc2V0dGluZ3MgKyB0aGVhdHJlICsgZnVsbHNjcmVlbikuCiAgICAvLyBJZiBvbmx5IG9uZSBpcyBwcmVzZW50LCB0aGUgd2FsayBsYW5kZWQgb24gYSBkZWdlbmVyYXRlIHJvdwogICAgLy8gKHBvcG91dCAvIGRldGFjaGVkIHBsYXllciAvIGZ1dHVyZSByZWRlc2lnbikgYW5kIHdlIHNob3VsZCBiYWlsCiAgICAvLyByYXRoZXIgdGhhbiBtaXMtdGFyZ2V0LiBDaGVhcCDigJQgb25lIHF1ZXJ5U2VsZWN0b3JBbGwsIG5vIHdhbGtpbmcuCiAgICBpZiAocm93LnF1ZXJ5U2VsZWN0b3JBbGwoUEVFUl9TRUwpLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTsKCiAgICB0cnkgewogICAgICAvLyBDbG9uZSB0aGUgYW5jaG9yJ3Mgb3V0ZXIgd3JhcHBlciAoc2hhbGxvdykgc28gd2UgaW5oZXJpdCBUd2l0Y2gncwogICAgICAvLyBzcGFjaW5nL2ZsZXggY2xhc3NlcywgdGhlbiBkcm9wIG91ciBvd24gYnV0dG9uIGluc2lkZS4KICAgICAgY29uc3Qgd3JhcHBlciA9IGFuY2hvcldyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hLXRhcmdldCIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpOwogICAgICBzdHJpcElubGluZUhhbmRsZXJzKHdyYXBwZXIpOwoKICAgICAgLy8gU2l6ZSBmcm9tIHRoZSByZW5kZXJlZCBTVkcgZ2x5cGggKHZpc3VhbGx5IGFjY3VyYXRlKS4gRmxvb3IgYXQgMjQKICAgICAgLy8gYmVjYXVzZSBUd2l0Y2gncyB1bmRlcmx5aW5nIFNWRyBlbGVtZW50IGlzIHNvbWV0aW1lcyBzbWFsbGVyIHRoYW4KICAgICAgLy8gdGhlIHZpc3VhbCBpY29uIChDU1Mgc2NhbGVzIGl0IHVwKS4KICAgICAgY29uc3QgcmVmU3ZnID0gYW5jaG9yQnRuLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpOwogICAgICBjb25zdCByZWZTdmdSZWN0ID0gcmVmU3ZnID8gcmVmU3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDsKICAgICAgY29uc3QgcmVmQnRuUmVjdCA9IGFuY2hvckJ0bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgbWVhc3VyZWQgPSByZWZTdmdSZWN0ICYmIHJlZlN2Z1JlY3Qud2lkdGggPiAwCiAgICAgICAgPyBNYXRoLm1pbihyZWZTdmdSZWN0LndpZHRoLCByZWZTdmdSZWN0LmhlaWdodCkKICAgICAgICA6IE1hdGgubWluKHJlZkJ0blJlY3Qud2lkdGgsIHJlZkJ0blJlY3QuaGVpZ2h0KSAqIDAuNzsKICAgICAgY29uc3QgaWNvblNpemUgPSBNYXRoLm1heCgyNCwgTWF0aC5yb3VuZChtZWFzdXJlZCkpOwogICAgICBjb25zdCBib3hTaXplID0gTWF0aC5tYXgoMzAsIE1hdGgucm91bmQocmVmQnRuUmVjdC53aWR0aCB8fCAzMCkpOwoKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgIGJ0bi5jbGFzc05hbWUgPSAiYnJhdmUtcGlwLWJ0biI7CiAgICAgIGJ0bi50eXBlID0gImJ1dHRvbiI7CiAgICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgICBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlBpY3R1cmUtaW4tUGljdHVyZSIpOwogICAgICBidG4uc3R5bGUuY3NzVGV4dCA9CiAgICAgICAgImJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7cGFkZGluZzowO21hcmdpbjowOyIgKwogICAgICAgICJjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyIgKwogICAgICAgICJ3aWR0aDoiICsgYm94U2l6ZSArICJweDtoZWlnaHQ6IiArIGJveFNpemUgKyAicHg7IjsKICAgICAgY29uc3Qgc3ZnID0gbWFrZVBpcFN2ZyhpY29uU2l6ZSk7CiAgICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7Y29sb3I6I2ZmZjsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwogICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGJ0bik7CgogICAgICByb3cuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIGFuY2hvcldyYXBwZXIpOwoKICAgICAgdHdpdGNoSW5qZWN0Q291bnQrKzsKICAgICAgaWYgKHR3aXRjaEluamVjdENvdW50ID09PSAxKSBsb2coImluamVjdGVkIG9uIFR3aXRjaCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICB3YXJuKCJUd2l0Y2ggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyBOZXRmbGl4OiBpbnNlcnQgaW50byB0aGUgc3RhbmRhcmQgY29udHJvbHMgYmFyLCBiZWZvcmUgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uLgogIC8vIE5ldGZsaXggcmFuZG9taXplcyBjbGFzcyBuYW1lcyBidXQgaWNvbnMgZm9sbG93IGEgY29uc2lzdGVudCBwYXR0ZXJuOgogIC8vICAgPGZsZXgtcm93PgogIC8vICAgICA8c3BhY2VyIC4xbnBxeXdyPiAuLi4gPHdyYXBwZXIgLm1lZGl1bT4gPGljb24tYnV0dG9uPiA8L3dyYXBwZXI+CiAgLy8gICAgIDxzcGFjZXIgLjFucHF5d3I+ICAgICA8d3JhcHBlciAubWVkaXVtPiA8aWNvbi1idXR0b24+IDwvd3JhcHBlcj4KICAvLyAgICAgPHNwYWNlciAuMW5wcXl3cj4gICAgIDx3cmFwcGVyIC5tZWRpdW0+IDxpY29uLWJ1dHRvbiBkYXRhLXVpYT0iY29udHJvbC1mdWxsc2NyZWVuLS4uLiI+IDwvd3JhcHBlcj4KICAvLyBXZSBjbG9uZSB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyIChhbmQgdGhlIHNwYWNlciBpbiBmcm9udCBvZiBpdCkgc28gb3VyCiAgLy8gYnV0dG9uIGdldHMgdGhlIHNhbWUgc3R5bGluZyBhbmQgcmh5dGhtIGFzIG5hdGl2ZSBpY29ucy4KICBsZXQgbmZseEluamVjdENvdW50ID0gMDsKICBmdW5jdGlvbiBhZGROZXRmbGl4QnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJyk7CiAgICBpZiAoIWJhcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGJhci5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBmcyA9IGJhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1lbnRlciJdLCBbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1leGl0Il0nKTsKICAgICAgaWYgKCFmcykgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRmluZCBOZXRmbGl4J3MgaWNvbiB3cmFwcGVyIGFyb3VuZCBmdWxsc2NyZWVuIOKAlCB0aGUgLm1lZGl1bSBjbGFzcwogICAgICAvLyBpcyB0aGUgc3RhYmxlIHNpZ25hbDsgZmFsbCBiYWNrIHRvIHRoZSBjbG9zZXN0IGRpdi4KICAgICAgY29uc3QgZnNXcmFwcGVyID0gZnMuY2xvc2VzdCgiLm1lZGl1bSIpIHx8IGZzLmNsb3Nlc3QoImRpdiIpIHx8IGZzOwogICAgICBjb25zdCByb3cgPSBmc1dyYXBwZXIucGFyZW50Tm9kZTsKICAgICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFNpemUgZnJvbSB0aGUgaW5uZXIgc3ZnIG9mIGZ1bGxzY3JlZW4ncyBidXR0b24gc28gd2UgdmlzdWFsbHkgbWF0Y2guCiAgICAgIGNvbnN0IHJlZlN2ZyA9IGZzLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpIHx8IChmcy5jbG9zZXN0KCJidXR0b24iKSB8fCBmcykucXVlcnlTZWxlY3Rvcigic3ZnIik7CiAgICAgIGNvbnN0IHJlZlN2Z1JlY3QgPSByZWZTdmcgPyByZWZTdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsOwogICAgICBjb25zdCBpY29uU2l6ZSA9IHJlZlN2Z1JlY3QgJiYgcmVmU3ZnUmVjdC53aWR0aCA+IDAKICAgICAgICA/IE1hdGgucm91bmQoTWF0aC5taW4ocmVmU3ZnUmVjdC53aWR0aCwgcmVmU3ZnUmVjdC5oZWlnaHQpKQogICAgICAgIDogMjg7CgogICAgICAvLyBDbG9uZSB0aGUgd3JhcHBlciAoc2hhbGxvdyDigJQgcHJlc2VydmVzIGNsYXNzZXMvaW5saW5lIHN0eWxlcykgYW5kCiAgICAgIC8vIGVtcHR5IGl0LCB0aGVuIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUuCiAgICAgIGNvbnN0IHdyYXBwZXIgPSBmc1dyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS11aWEiKTsKICAgICAgc3RyaXBJbmxpbmVIYW5kbGVycyh3cmFwcGVyKTsKCiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidG4uY2xhc3NOYW1lID0gImJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPQogICAgICAgICJiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO3BhZGRpbmc6MDttYXJnaW46MDsiICsKICAgICAgICAid2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyI7CiAgICAgIGNvbnN0IHN2ZyA9IG1ha2VQaXBTdmcoaWNvblNpemUpOwogICAgICBzdmcuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OmJsb2NrOyI7CiAgICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZVBpcCh2aWRlbyk7IH0pOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBfb25OYXRpdmVCdG5Db250ZXh0TWVudSk7CiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYnRuKTsKCiAgICAgIC8vIENsb25lIHRoZSBzcGFjZXIgdGhhdCBwcmVjZWRlcyB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyLCBzbyBzcGFjaW5nCiAgICAgIC8vIGJldHdlZW4gb3VyIGJ1dHRvbiBhbmQgZnVsbHNjcmVlbiBtYXRjaGVzIHRoZSByaHl0aG0gYmV0d2VlbgogICAgICAvLyBleGlzdGluZyBpY29ucy4KICAgICAgY29uc3QgcHJldlNwYWNlciA9IGZzV3JhcHBlci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwogICAgICBjb25zdCBzcGFjZXJDbG9uZSA9IChwcmV2U3BhY2VyICYmIHByZXZTcGFjZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKQogICAgICAgID8gcHJldlNwYWNlci5jbG9uZU5vZGUoZmFsc2UpCiAgICAgICAgOiBudWxsOwoKICAgICAgcm93Lmluc2VydEJlZm9yZSh3cmFwcGVyLCBmc1dyYXBwZXIpOwogICAgICBpZiAoc3BhY2VyQ2xvbmUpIHJvdy5pbnNlcnRCZWZvcmUoc3BhY2VyQ2xvbmUsIGZzV3JhcHBlcik7CgogICAgICBuZmx4SW5qZWN0Q291bnQrKzsKICAgICAgaWYgKG5mbHhJbmplY3RDb3VudCA9PT0gMSkgbG9nKCJpbmplY3RlZCBvbiBOZXRmbGl4Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHdhcm4oIk5ldGZsaXggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBHZW5lcmljIEZpcmVmb3gtc3R5bGUgb3ZlcmxheQogIC8vCiAgLy8gVXNlZCBvbiBldmVyeSBzaXRlIGJ5IGRlZmF1bHQgKHVubGVzcyBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAgaXMKICAvLyBleHBsaWNpdGx5IHNldCB0byAiMCIpLiBNaW1pY3MgRmlyZWZveCdzICJQb3Agb3V0IHRoaXMgdmlkZW8iIHRvZ2dsZToKICAvLyBhIGRhcmsgcGlsbCBhbmNob3JlZCBtaWQtcmlnaHQgb2YgdGhlIHZpZGVvIHRoYXQgZmFkZXMgaW4gb24gaG92ZXIKICAvLyBhbmQgZmFkZXMgb3V0IGFmdGVyIHRoZSBjdXJzb3IgbGVhdmVzLiBBZnRlciB0aGUgdXNlciBjbGlja3Mgb25jZSBpdAogIC8vIHNocmlua3MgdG8gaWNvbi1vbmx5IGZvciB0aGUgcmVzdCBvZiB0aGUgc2Vzc2lvbiDigJQgbGVzcyB2aXN1YWwgbm9pc2UKICAvLyBvbiBzdWJzZXF1ZW50IGhvdmVycy4KICAvLwogIC8vIEhvdmVyIGRldGVjdGlvbiBydW5zIHRocm91Z2ggdGhlIHNoYXJlZCBgX29uRG9jTW91c2VNb3ZlYCBoYW5kbGVyCiAgLy8gKHNlZSB0b3Agb2YgZmlsZSkgaW5zdGVhZCBvZiBgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIpYCwKICAvLyBiZWNhdXNlIG1hbnkgcGxheWVycyAoTmV0ZmxpeCwgY3VzdG9tKSBsYXllciB0aGVpciBVSSBvbiB0b3Agb2YgdGhlCiAgLy8gPHZpZGVvPiBhbmQgYWJzb3JiIG1vdXNlIGV2ZW50cyBiZWZvcmUgdGhleSByZWFjaCBpdC4gQSBnbG9iYWwKICAvLyBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIGJ5cGFzc2VzIHRoYXQuCiAgLy8KICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSBwaWxsIGlzIHRhcC10by1yZXZlYWwgKDMgcyBhdXRvLWZhZGUpIGluc3RlYWQuCiAgLy8KICAvLyBgdGVhcmRvd25zYCBpcyBhbiBhcnJheSB0aGUgY2FsbGVyIChgYXR0YWNoVG9WaWRlb2ApIGhhbmRzIGluOyB3ZQogIC8vIHB1c2ggY2xlYW51cCBjbG9zdXJlcyBvbnRvIGl0IHNvIGEgbGF0ZXIgY2xlYW51cCBvZiB0aGlzIHZpZGVvCiAgLy8gcmVsZWFzZXMgZXZlcnkgbGlzdGVuZXIgLyBvYnNlcnZlciAvIERPTSBub2RlIHdlIGNyZWF0ZWQgaGVyZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIFJlYWNoaW5nIGhlcmUgbWVhbnMgYGF0dGFjaFRvVmlkZW9gJ3MgYHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKWAKICAgIC8vIGd1YXJkIGFscmVhZHkgc2hvcnQtY2lyY3VpdGVkIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zLCBzbyBubwogICAgLy8gc2VwYXJhdGUgZGF0YXNldCBtYXJrZXIgaXMgbmVlZGVkLgogICAgLy8gUGVyLW9yaWdpbiBvcHQtb3V0OiBza2lwIGJ1aWxkaW5nIGFueXRoaW5nIGlmIHRoZSB1c2VyIHByZXZpb3VzbHkKICAgIC8vIGRpc2FibGVkIHRoZSBwaWxsIG9uIHRoaXMgc2l0ZSB2aWEgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuCiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuOwogICAgY29uc3QgUEFERElOR19GVUxMID0gIjhweCAxNHB4IDhweCAxMHB4IjsKICAgIGNvbnN0IFBBRERJTkdfSUNPTiA9ICI4cHgiOwoKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgYnRuLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0KICAgICAgInBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDsiICsKICAgICAgInBhZGRpbmc6IiArIFBBRERJTkdfRlVMTCArICI7IiArCiAgICAgICJib3JkZXI6MDtib3JkZXItcmFkaXVzOjhweDsiICsKICAgICAgImJhY2tncm91bmQ6cmdiYSgyOCwyOCwzMCwwLjkyKTtjb2xvcjojZmZmOyIgKwogICAgICAiZm9udDo2MDAgMTNweC8xIHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxzYW5zLXNlcmlmOyIgKwogICAgICAiY3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiYm94LXNoYWRvdzowIDJweCA4cHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAib3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAwLjE1cyBlYXNlOyIgKwogICAgICAicG9pbnRlci1ldmVudHM6YXV0bzt1c2VyLXNlbGVjdDpub25lOyI7CiAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDE4KTsKICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7IjsKICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICJQb3Agb3V0IHRoaXMgdmlkZW8iOwogICAgYnRuLmFwcGVuZENoaWxkKGxhYmVsKTsKCiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCAoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNob3dEaXNhYmxlTWVudShlLmNsaWVudFgsIGUuY2xpZW50WSk7CiAgICB9KTsKCiAgICBsZXQgY2xpY2tlZCA9IGZhbHNlOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBpZiAoIWNsaWNrZWQpIHsKICAgICAgICBjbGlja2VkID0gdHJ1ZTsKICAgICAgICAvLyBTdXBwcmVzcyBmYWRlIHNvIHRoZSBpY29uLW9ubHkgcGlsbCBpcyBpbiBpdHMgZmluYWwgcG9zaXRpb24KICAgICAgICAvLyBiZWZvcmUgdGhlIHVzZXIgbm90aWNlcyB0aGUgY2hhbmdlLgogICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gYnRuLnN0eWxlLnRyYW5zaXRpb247CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSAibm9uZSI7CiAgICAgICAgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9IFBBRERJTkdfSUNPTjsKICAgICAgICBidG4uc3R5bGUuZ2FwID0gIjAiOwogICAgICAgIHVwZGF0ZSgpOyAvLyBzeW5jaHJvbm91cyByZXBvc2l0aW9uIGZvciB0aGUgbmV3IChzbWFsbGVyKSBib3gKICAgICAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyB0aGUgbmV4dCBzdHlsZSBjaGFuZ2UgaXMgY29tbWl0dGVkIHdpdGhvdXQKICAgICAgICAvLyBhIHRyYW5zaXRpb24sIHRoZW4gcmVzdG9yZSB0aGUgZmFkZSB0cmFuc2l0aW9uLgogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMKICAgICAgICBidG4ub2Zmc2V0V2lkdGg7CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsKICAgICAgfQogICAgICB0b2dnbGVQaXAodmlkZW8pOwogICAgfSk7CiAgICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGJ0bik7CgogICAgbGV0IGhvdmVyID0gZmFsc2U7CiAgICBsZXQgaG92ZXJUaW1lciA9IG51bGw7CiAgICBsZXQgbGFzdFJlY3QgPSBudWxsOwogICAgbGV0IHRvdWNoSGlkZVRpbWVyID0gbnVsbDsKICAgIGZ1bmN0aW9uIHNldEhvdmVyKHYpIHsKICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICBpZiAodikgeyBob3ZlciA9IHRydWU7IHVwZGF0ZSgpOyB9CiAgICAgIGVsc2UgICB7IGhvdmVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgaG92ZXIgPSBmYWxzZTsgdXBkYXRlKCk7IH0sIENPTkZJRy5IT1ZFUl9HUkFDRV9NUyk7IH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0OwogICAgICBpZiAoIXIpIHJldHVybjsKICAgICAgY29uc3Qgb3ZlclZpZGVvID0KICAgICAgICB4ID49IHIubGVmdCAmJiB4IDw9IHIucmlnaHQgJiYKICAgICAgICB5ID49IHIudG9wICAmJiB5IDw9IHIuYm90dG9tOwogICAgICBsZXQgb3ZlckJ0biA9IGZhbHNlOwogICAgICBpZiAoYnRuLnN0eWxlLmRpc3BsYXkgIT09ICJub25lIikgewogICAgICAgIGNvbnN0IGJSZWN0ID0gYnRuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIG92ZXJCdG4gPQogICAgICAgICAgeCA+PSBiUmVjdC5sZWZ0ICYmIHggPD0gYlJlY3QucmlnaHQgJiYKICAgICAgICAgIHkgPj0gYlJlY3QudG9wICAmJiB5IDw9IGJSZWN0LmJvdHRvbTsKICAgICAgfQogICAgICBpZiAob3ZlclZpZGVvIHx8IG92ZXJCdG4pIHsgaWYgKCFob3Zlcikgc2V0SG92ZXIodHJ1ZSk7IH0KICAgICAgZWxzZSBpZiAoaG92ZXIpIHNldEhvdmVyKGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0IHx8IHZpZGVvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBsYXN0UmVjdCA9IHI7CiAgICAgIGNvbnN0IG92ZXJWaWRlbyA9CiAgICAgICAgeCA+PSByLmxlZnQgJiYgeCA8PSByLnJpZ2h0ICYmCiAgICAgICAgeSA+PSByLnRvcCAgJiYgeSA8PSByLmJvdHRvbTsKICAgICAgaWYgKCFvdmVyVmlkZW8pIHJldHVybjsKICAgICAgc2V0SG92ZXIodHJ1ZSk7CiAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgY2xlYXJUaW1lb3V0KHRvdWNoSGlkZVRpbWVyKTsKICAgICAgdG91Y2hIaWRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0b3VjaEhpZGVUaW1lciA9IG51bGw7CiAgICAgICAgc2V0SG92ZXIoZmFsc2UpOwogICAgICB9LCBDT05GSUcuVE9VQ0hfUkVWRUFMX01TKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgIC8vIE1hdGNoIEZpcmVmb3g6IHNob3cgb24gaG92ZXIgcmVnYXJkbGVzcyBvZiBwYXVzZWQgc3RhdGUuIE9ubHkKICAgICAgLy8gcmVxdWlyZSB0aGF0IHRoZSB2aWRlbyBoYXMgbWV0YWRhdGEgbG9hZGVkIChzbyBQaVAgaXMgdXNhYmxlKSwKICAgICAgLy8gaXMgdmlzaWJsZSwgYW5kIHdlJ3JlIG5vdCBpbiBmdWxsc2NyZWVuIChpbmNsLiBpT1Mgd2Via2l0IEZTKS4KICAgICAgLy8gQWxzbyBob25vdXIgYSBtaWQtc2Vzc2lvbiBkaXNhYmxlIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUKICAgICAgLy8gKGNhY2hlZCBgX3NpdGVEaXNhYmxlZGAgZmxhZyDigJQgbm8gbG9jYWxTdG9yYWdlIGhpdCBwZXIgdGljaykuCiAgICAgIGlmIChfc2l0ZURpc2FibGVkKSB7CiAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlYWR5ID0gdmlkZW8ucmVhZHlTdGF0ZSA+PSAxOwogICAgICBjb25zdCBmcyA9IGlzRnVsbHNjcmVlbih2aWRlbyk7CiAgICAgIGNvbnN0IHIgPSB2aWRlby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbGFzdFJlY3QgPSByOwogICAgICBjb25zdCBvblNjcmVlbiA9IHIud2lkdGggPiAwICYmIHIuaGVpZ2h0ID4gMCAmJiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCBpbm5lckhlaWdodDsKICAgICAgLy8gWW91VHViZSBVUkwgZ2F0ZSArIFNQQS1uYXYtZ3JhY2UuIFJlZnJlc2ggdGhlIGNhY2hlZCBwcmV2aWV3LWFyZWEKICAgICAgLy8gZmxhZyBhbmQgc3RhbXAgYSBuYXZpZ2F0aW9uIHRpbWVzdGFtcCBvbiBwYXRoIGNoYW5nZSwgdGhlbgogICAgICAvLyBzdXBwcmVzcyBlbGlnaWJpbGl0eSB3aGlsZSB3ZSdyZSBlaXRoZXIgb24gYSBub24td2F0Y2ggVVJMIG9yCiAgICAgIC8vIGluc2lkZSB0aGUgcG9zdC1uYXYgZ3JhY2Ugd2luZG93IChhYnNvcmJzIHRoZSBicmllZiBmbGFzaCB3aGVuCiAgICAgIC8vIGEgaG9tZXBhZ2UgdGh1bWJuYWlsIGNsaWNrIGxhbmRzIHRoZSBjdXJzb3Igb24gdGhlIG5ldyBwbGF5ZXIpLgogICAgICBpZiAoX3l0SG9zdCAmJiBfeXRMYXN0UGF0aCAhPT0gbG9jYXRpb24ucGF0aG5hbWUpIHsKICAgICAgICBfeXRMYXN0UGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgIF95dFByZXZpZXdBcmVhID0gIV95dFdhdGNoUGF0aC50ZXN0KF95dExhc3RQYXRoKTsKICAgICAgICBfeXROYXZBdCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICAgIGNvbnN0IF9pbk5hdkdyYWNlID0gX3l0TmF2QXQgJiYgKHBlcmZvcm1hbmNlLm5vdygpIC0gX3l0TmF2QXQpIDwgQ09ORklHLllUX05BVl9HUkFDRV9NUzsKICAgICAgY29uc3QgZWxpZ2libGUgPSByZWFkeSAmJiAhZnMgJiYgb25TY3JlZW4gJiYgIV95dFByZXZpZXdBcmVhICYmICFfaW5OYXZHcmFjZTsKICAgICAgaWYgKCFlbGlnaWJsZSkgewogICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gIm5vbmUiOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtZmxleCI7CiAgICAgIGNvbnN0IHcgPSBidG4ub2Zmc2V0V2lkdGggfHwgMTcwOwogICAgICBjb25zdCBoID0gYnRuLm9mZnNldEhlaWdodCB8fCAzNjsKCiAgICAgIC8vIENvbXB1dGUgbWlkLXJpZ2h0IG9mIHRoZSAqdmlzaWJsZSogcG9ydGlvbiBvZiB0aGUgdmlkZW8gKHRoZQogICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgaXRzIHJlY3Qgd2l0aCB0aGUgdmlld3BvcnQpLiBOZXRmbGl4J3MgPHZpZGVvPgogICAgICAvLyBjYW4gYmUgbXVjaCB0YWxsZXIgdGhhbiB0aGUgdmlld3BvcnQuCiAgICAgIGNvbnN0IHZpc1RvcCA9IE1hdGgubWF4KHIudG9wLCAwKTsKICAgICAgY29uc3QgdmlzQm90dG9tID0gTWF0aC5taW4oci5ib3R0b20sIGlubmVySGVpZ2h0KTsKICAgICAgY29uc3QgdmlzUmlnaHQgPSBNYXRoLm1pbihyLnJpZ2h0LCBpbm5lcldpZHRoKTsKICAgICAgbGV0IHRvcCA9IE1hdGgucm91bmQodmlzVG9wICsgKHZpc0JvdHRvbSAtIHZpc1RvcCAtIGgpIC8gMikgKyBDT05GSUcuUElMTF9PRkZTRVRfWTsKICAgICAgbGV0IGxlZnQgPSBNYXRoLnJvdW5kKHZpc1JpZ2h0IC0gdyAtIENPTkZJRy5QSUxMX1JJR0hUX01BUkdJTik7CiAgICAgIC8vIEZpbmFsIHZpZXdwb3J0IGNsYW1wLgogICAgICB0b3AgPSBNYXRoLm1heChDT05GSUcuVklFV1BPUlRfUEFELCBNYXRoLm1pbih0b3AsIGlubmVySGVpZ2h0IC0gaCAtIENPTkZJRy5WSUVXUE9SVF9QQUQpKTsKICAgICAgbGVmdCA9IE1hdGgubWF4KENPTkZJRy5WSUVXUE9SVF9QQUQsIE1hdGgubWluKGxlZnQsIGlubmVyV2lkdGggLSB3IC0gQ09ORklHLlZJRVdQT1JUX1BBRCkpOwoKICAgICAgYnRuLnN0eWxlLnRvcCA9IHRvcCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gaG92ZXIgPyAiMSIgOiAiMCI7CiAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gaG92ZXIgPyAiYXV0byIgOiAibm9uZSI7CiAgICB9CgogICAgY29uc3Qgb25CdG5FbnRlciA9ICgpID0+IHNldEhvdmVyKHRydWUpOwogICAgY29uc3Qgb25CdG5MZWF2ZSA9ICgpID0+IHNldEhvdmVyKGZhbHNlKTsKCiAgICAvLyBQZXItdmlkZW8gbGlzdGVuZXJzIHN0YXkgb24gdGhlIHZpZGVvIGVsZW1lbnQuIERvY3VtZW50L3dpbmRvdwogICAgLy8gbGlzdGVuZXJzIGFyZSBzaGFyZWQgdmlhIHRoZSBtb2R1bGUtbGV2ZWwgYG92ZXJsYXlzYCByZWdpc3RyeQogICAgLy8gKG9uZSBzZXQgb2YgZ2xvYmFscyByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHZpZGVvcyBhcmUgb24gdGhlIHBhZ2UpLgogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgb25CdG5MZWF2ZSk7CiAgICBjb25zdCBWSURFT19FVkVOVFMgPSBbInBsYXkiLCJwbGF5aW5nIiwicGF1c2UiLCJlbmRlZCIsImVtcHRpZWQiLCJsb2FkZWRkYXRhIl07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFZJREVPX0VWRU5UUy5sZW5ndGg7IGkrKykgewogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIH0KICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGJlZ2luZnVsbHNjcmVlbiIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICByby5vYnNlcnZlKHZpZGVvKTsKCiAgICBjb25zdCBpbnN0YW5jZSA9IHsgdXBkYXRlLCBoYW5kbGVQb2ludGVyLCBoYW5kbGVUb3VjaCB9OwogICAgb3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIHZpZGVvVG9PdmVybGF5LnNldCh2aWRlbywgaW5zdGFuY2UpOwogICAgY29uc3QgaW8gPSBnZXRJTygpOwogICAgaWYgKGlvKSB7CiAgICAgIGlvLm9ic2VydmUodmlkZW8pOwogICAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBmaXJlcyBhIGNhbGxiYWNrIHN5bmNocm9ub3VzbHkgYWZ0ZXIKICAgICAgLy8gb2JzZXJ2ZSgpIGluIGEgbWljcm90YXNrLiBVbnRpbCB0aGVuIGFzc3VtZSB0aGUgdmlkZW8gaXMKICAgICAgLy8gdmlzaWJsZSBzbyB0aGUgdmVyeSBmaXJzdCB1cGRhdGUoKSBydW5zLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIElPIHN1cHBvcnQg4oCUIGZhbGwgYmFjayB0byAiYWx3YXlzIHZpc2libGUiLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0KICAgIGFybUdsb2JhbHMoKTsKICAgIHVwZGF0ZSgpOwoKICAgIGlmICh0ZWFyZG93bnMpIHsKICAgICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICAgIG92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgaWYgKGludGVyc2VjdGlvbk9ic2VydmVyKSBpbnRlcnNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUodmlkZW8pOwogICAgICAgIHZpZGVvVG9PdmVybGF5LmRlbGV0ZSh2aWRlbyk7CiAgICAgICAgYnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgICAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIG9uQnRuTGVhdmUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVklERU9fRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB9CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2Via2l0YmVnaW5mdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICByby5kaXNjb25uZWN0KCk7CiAgICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgeyBjbGVhclRpbWVvdXQodG91Y2hIaWRlVGltZXIpOyB0b3VjaEhpZGVUaW1lciA9IG51bGw7IH0KICAgICAgICBidG4ucmVtb3ZlKCk7CiAgICAgICAgbWF5YmVEaXNhcm1HbG9iYWxzKCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29uZmlndXJhdGlvbiAmIGRpc3BhdGNoCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBlci1vcmlnaW4gYGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcGAgZmxhZy4KICAvLyBEZWZhdWx0IGlzIE9OOiBldmVyeSBzaXRlIHVzZXMgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIHVubGVzcyB0aGUKICAvLyB1c2VyIGhhcyBleHBsaWNpdGx5IG9wdGVkIGludG8gbmF0aXZlIGluamVjdGlvbiAoc2V0IHRoZSBmbGFnIHRvCiAgLy8gIjAiIC8gImZhbHNlIiAvICJubyIgLyAib2ZmIikuIFdyYXBwZWQgaW4gdHJ5L2NhdGNoIGJlY2F1c2UKICAvLyBsb2NhbFN0b3JhZ2UgYWNjZXNzIHRocm93cyBpbiBwcml2YXRlIC8gc2FuZGJveGVkIGNvbnRleHRzLgogIC8vCiAgLy8gRXhjZXB0aW9uOiB3d3cueW91dHViZS5jb20sIHd3dy50d2l0Y2gudHYgYW5kIHd3dy5uZXRmbGl4LmNvbQogIC8vIGRlZmF1bHQgdG8gT0ZGIChuYXRpdmUgaW5qZWN0aW9uKSBiZWNhdXNlIHRoZWlyIHBsYXllcnMgYWxyZWFkeQogIC8vIGhhdmUgZmlyc3QtY2xhc3MgY29udHJvbCBiYXJzIHdoZXJlIGEgbmF0aXZlIGJ1dHRvbiBsb29rcyBhdCBob21lLgogIC8vIE9ubHkgdGhlIGV4YWN0IGRlc2t0b3AgaG9zdG5hbWVzIGFyZSB0YXJnZXRlZCDigJQgbS4vbXVzaWMuL21vYmlsZQogIC8vIHN1YmRvbWFpbnMga2VlcCB0aGUgZ2VuZXJpYy1waWxsIGRlZmF1bHQuIFRoZSB1c2VyIGNhbiBmbGlwIHRoZQogIC8vIGZsYWcgZXhwbGljaXRseSBwZXIgb3JpZ2luIHRvIG92ZXJyaWRlLgogIC8vCiAgLy8gUmVhZCBsYXppbHkgb24gZmlyc3QgdXNlIChub3QgYXQgSUlGRSBpbml0KSBzbyB0aGF0IHVzZXJzY3JpcHQKICAvLyBtYW5hZ2VycyBvciBwb2x5ZmlsbCBzaGltcyB0aGF0IHJlcGxhY2UgYGxvY2FsU3RvcmFnZWAgc2xpZ2h0bHkKICAvLyBhZnRlciBvdXIgc2NyaXB0IGxvYWRzIHN0aWxsIHNlZSBhIGNvbnNpc3RlbnQgdmFsdWUuIEFmdGVyIHRoZQogIC8vIGZpcnN0IHJlYWQgaXQncyBjYWNoZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwYWdlIGxpZmV0aW1lIOKAlCB0aGUKICAvLyB2YWx1ZSBjYW4ndCBjaGFuZ2Ugd2l0aG91dCBhIHJlbG9hZC4KICBjb25zdCBOQVRJVkVfREVGQVVMVF9IT1NUUyA9IG5ldyBTZXQoWyJ3d3cueW91dHViZS5jb20iLCAid3d3LnR3aXRjaC50diIsICJ3d3cubmV0ZmxpeC5jb20iXSk7CiAgZnVuY3Rpb24gX2RlZmF1bHRHZW5lcmljRm9ySG9zdCgpIHsKICAgIHJldHVybiAhTkFUSVZFX0RFRkFVTFRfSE9TVFMuaGFzKGxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiByZWFkR2VuZXJpY1BpcEZvcmNlZCgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlZ2VuZXJpY19waXAiKTsKICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsKICAgICAgY29uc3QgcyA9IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKICAgICAgaWYgKHMgPT09ICIwIiB8fCBzID09PSAiZmFsc2UiIHx8IHMgPT09ICJubyIgfHwgcyA9PT0gIm9mZiIpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIHsgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsgfQogIH0KICBsZXQgX2dlbmVyaWNQaXBGb3JjZWRDYWNoZSA9IG51bGw7IC8vIG51bGwgPSBub3QgeWV0IHJlYWQKICBmdW5jdGlvbiBnZW5lcmljUGlwRm9yY2VkQ2FjaGVkKCkgewogICAgaWYgKF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPT09IG51bGwpIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPSByZWFkR2VuZXJpY1BpcEZvcmNlZCgpOwogICAgcmV0dXJuIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGU7CiAgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IHdoZW4gdHJ1dGh5LCB0aGUgZ2VuZXJpYyBvdmVybGF5IHBpbGwgaXMKICAvLyBzdXBwcmVzc2VkIG9uIHRoaXMgc2l0ZS4gU2V0IHZpYSB0aGUgcmlnaHQtY2xpY2sgbWVudSBvbiB0aGUgcGlsbDsKICAvLyBjbGVhcmVkIGZyb20gRGV2VG9vbHMgd2l0aCBgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImJyYXZlX3BpcF9kaXNhYmxlZCIpYC4KICAvLwogIC8vIFRoZSBmbGFnIGlzIGNhY2hlZCBpbiBgX3NpdGVEaXNhYmxlZGAgYWZ0ZXIgdGhlIGluaXRpYWwgYmFpbC1vdXQKICAvLyBjaGVjayBzbyB0aGUgaG90IHBhdGhzICh1cGRhdGUoKSBydW5zIHBlciB2aXNpYmxlIHZpZGVvIHBlcgogIC8vIGFuaW1hdGlvbiBmcmFtZSkgZG9uJ3QgaGF2ZSB0byBoaXQgbG9jYWxTdG9yYWdlIGV2ZXJ5IHRpY2suIFRoZQogIC8vIG1lbnUncyBjbGljayBoYW5kbGVyIGZsaXBzIHRoZSBjYWNoZWQgdmFsdWUgd2hlbiB0aGUgdXNlciBkaXNhYmxlcwogIC8vIG1pZC1zZXNzaW9uLgogIGNvbnN0IERJU0FCTEVfS0VZID0gImJyYXZlX3BpcF9kaXNhYmxlZCI7CiAgZnVuY3Rpb24gcmVhZFNpdGVEaXNhYmxlZCgpIHsKICAgIHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShESVNBQkxFX0tFWSkgPT09ICIxIjsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfQogIH0KICBmdW5jdGlvbiBzZXRTaXRlRGlzYWJsZWQoKSB7CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShESVNBQkxFX0tFWSwgIjEiKTsgfSBjYXRjaCB7fQogIH0KICAvLyBDYWNoZWQgZmxhZyDigJQgdXBkYXRlZCBvbiBpbml0IGFuZCBvbiBtaWQtc2Vzc2lvbiBkaXNhYmxlLgogIGxldCBfc2l0ZURpc2FibGVkID0gZmFsc2U7CgogIC8vIFNoYXJlZCByaWdodC1jbGljayBoYW5kbGVyIGF0dGFjaGVkIHRvIGV2ZXJ5IG5hdGl2ZSBpbmplY3RlZCBidXR0b24KICAvLyAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpLiBNaXJyb3JzIHRoZSBnZW5lcmljIHBpbGwncyBjb250ZXh0bWVudQogIC8vIHdpcmluZyBzbyB1c2VycyBjYW4gZGlzYWJsZSBQaVAgb24gdGhlIGhvc3Qgc2l0ZSBmcm9tIGFueSBvZiBvdXIgVUlzLgogIGZ1bmN0aW9uIF9vbk5hdGl2ZUJ0bkNvbnRleHRNZW51KGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzaG93RGlzYWJsZU1lbnUoZS5jbGllbnRYLCBlLmNsaWVudFkpOwogIH0KCiAgLy8gUmVtb3ZlcyBhbnkgb2Ygb3VyIGluamVjdGVkIERPTSAobmF0aXZlIGJ1dHRvbnMgKyBjbG9uZWQgd3JhcHBlcnMpLgogIC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIHBpY2tzICJEaXNhYmxlIFBpUCBpY29uIG9uIDxzaXRlPiIgZnJvbSB0aGUKICAvLyByaWdodC1jbGljayBtZW51IHNvIHRoZSBwYWdlIHJldHVybnMgdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS4KICBmdW5jdGlvbiBfcmVtb3ZlTmF0aXZlQnV0dG9ucygpIHsKICAgIGNvbnN0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJyYXZlLXBpcC1idG4sIC5icmF2ZS1waXAtd3JhcHBlciIpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgbm9kZXNbaV0ucmVtb3ZlKCk7CiAgfQoKICAvLyBTaW5nbGUtaW5zdGFuY2UgY3VzdG9tIGNvbnRleHQgbWVudSBzaG93biBvbiByaWdodC1jbGljayBvZiB0aGUKICAvLyBnZW5lcmljIHBpbGwgb3IgYW55IG5hdGl2ZSBpbmplY3RlZCBidXR0b24uIFdlIGNhbid0IGN1c3RvbWlzZSB0aGUKICAvLyBicm93c2VyJ3MgbmF0aXZlIGNvbnRleHQgbWVudSB3aXRob3V0IGFuIGV4dGVuc2lvbiwgc28gd2UgY2FuY2VsIGl0CiAgLy8gKGBwcmV2ZW50RGVmYXVsdGApIGFuZCByZW5kZXIgb3VyIG93biBET00uIEF1dG8tZGlzbWlzc2VzIG9uCiAgLy8gY2xpY2stb3V0c2lkZSwgRXNjYXBlLCBvciBzY3JvbGwuCiAgbGV0IGFjdGl2ZU1lbnUgPSBudWxsOwogIC8vIFRpbWVzdGFtcCB3aGVuIHRoZSBhY3RpdmUgbWVudSB3YXMgb3BlbmVkLiBPdXRzaWRlLWNsaWNrcyB3aXRoaW4gYQogIC8vIHNob3J0IHdpbmRvdyAofjE1MCBtcykgb2Ygb3BlbmluZyBhcmUgaWdub3JlZCDigJQgZGVmZW5kcyBhZ2FpbnN0IGEKICAvLyBzeW50aGV0aWMgc2FtZS1mcmFtZSBjbGljayBieXBhc3NpbmcgdGhlIHNldFRpbWVvdXQoMCkgaGFuZG9mZi4KICBsZXQgYWN0aXZlTWVudU9wZW5lZEF0ID0gMDsKICBjb25zdCBNRU5VX09QRU5fR1VBUkRfTVMgPSAxNTA7CiAgZnVuY3Rpb24gY2xvc2VNZW51KCkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBhY3RpdmVNZW51LnJlbW92ZSgpOwogICAgYWN0aXZlTWVudSA9IG51bGw7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgX29uTWVudUtleSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgY2xvc2VNZW51LCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGNsb3NlTWVudSk7CiAgfQogIGZ1bmN0aW9uIF9vbk1lbnVLZXkoZSkgeyBpZiAoZS5rZXkgPT09ICJFc2NhcGUiKSBjbG9zZU1lbnUoKTsgfQogIGZ1bmN0aW9uIF9vbk1lbnVDbGlja091dHNpZGUoZSkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBpZiAoZS50aW1lU3RhbXAgLSBhY3RpdmVNZW51T3BlbmVkQXQgPCBNRU5VX09QRU5fR1VBUkRfTVMpIHJldHVybjsKICAgIGlmICghYWN0aXZlTWVudS5jb250YWlucyhlLnRhcmdldCkpIGNsb3NlTWVudSgpOwogIH0KICBmdW5jdGlvbiBzaG93RGlzYWJsZU1lbnUoeCwgeSkgewogICAgY2xvc2VNZW51KCk7CiAgICBjb25zdCBtZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBtZW51LnN0eWxlLmNzc1RleHQgPQogICAgICAicG9zaXRpb246Zml4ZWQ7bGVmdDoiICsgeCArICJweDt0b3A6IiArIHkgKyAicHg7IiArCiAgICAgICJiYWNrZ3JvdW5kOnJnYmEoMjgsMjgsMzAsMC45Nik7Y29sb3I6I2ZmZjsiICsKICAgICAgImJvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NHB4IDA7IiArCiAgICAgICJib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAiei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiZm9udDo1MDAgMTNweC8xLjQgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sU2Vnb2UgVUksUm9ib3RvLHNhbnMtc2VyaWY7IiArCiAgICAgICJ1c2VyLXNlbGVjdDpub25lO3BvaW50ZXItZXZlbnRzOmF1dG87bWluLXdpZHRoOjE4MHB4OyI7CgogICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaXRlbS50ZXh0Q29udGVudCA9ICJEaXNhYmxlIFBpUCBpY29uIG9uICIgKyBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjhweCAxNHB4O2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcDsiOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjEyKSI7IH0pOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAiIjsgfSk7CiAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBzZXRTaXRlRGlzYWJsZWQoKTsKICAgICAgX3NpdGVEaXNhYmxlZCA9IHRydWU7CiAgICAgIC8vIEhpZGUgZXZlcnkgYWN0aXZlIGdlbmVyaWMgcGlsbCBvbiB0aGlzIHBhZ2UgaW1tZWRpYXRlbHkuIFRoZQogICAgICAvLyBuZXh0IGB1cGRhdGUoKWAgdGljayB3aWxsIHNlZSB0aGUgY2FjaGVkIGZsYWcgYW5kIGtlZXAgdGhlbQogICAgICAvLyBoaWRkZW4uIE5hdGl2ZSBpbmplY3RlZCBidXR0b25zIChZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeCkKICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGRpcmVjdGx5IOKAlCB0aGVpciBwZXJzaXN0ZW50IG9ic2VydmVycwogICAgICAvLyB3aWxsIHNlZSBgX3NpdGVEaXNhYmxlZGAgYW5kIHN0b3AgcmUtaW5qZWN0aW5nLgogICAgICBfc2NoZWR1bGVVcGRhdGVBbGwoKTsKICAgICAgX3JlbW92ZU5hdGl2ZUJ1dHRvbnMoKTsKICAgICAgbG9nKCJkaXNhYmxlZCBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUpOwogICAgICBjbG9zZU1lbnUoKTsKICAgIH0pOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgYWN0aXZlTWVudSA9IG1lbnU7CiAgICBhY3RpdmVNZW51T3BlbmVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKCiAgICAvLyBJZiB0aGUgbWVudSB3b3VsZCBvdmVyZmxvdyB0aGUgdmlld3BvcnQsIG51ZGdlIGl0IGJhY2sgaW4uCiAgICBjb25zdCByID0gbWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmIChyLnJpZ2h0ID4gaW5uZXJXaWR0aCkgIG1lbnUuc3R5bGUubGVmdCA9IChpbm5lcldpZHRoICAtIHIud2lkdGggIC0gOCkgKyAicHgiOwogICAgaWYgKHIuYm90dG9tID4gaW5uZXJIZWlnaHQpIG1lbnUuc3R5bGUudG9wICA9IChpbm5lckhlaWdodCAtIHIuaGVpZ2h0IC0gOCkgKyAicHgiOwoKICAgIC8vIERlZmVyIGxpc3RlbmVyIGF0dGFjaCB0byB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gdGhlIGNsaWNrIHRoYXQKICAgIC8vIG9wZW5lZCB0aGUgbWVudSBkb2Vzbid0IGltbWVkaWF0ZWx5IGRpc21pc3MgaXQuCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIF9vbk1lbnVLZXksIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBjbG9zZU1lbnUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBjbG9zZU1lbnUpOwogICAgfSwgMCk7CiAgfQoKICAvLyBOYXRpdmUtc2l0ZSBhZGFwdGVyIHRhYmxlLiBFYWNoIGVudHJ5IGRlc2NyaWJlcyBvbmUgc2l0ZSB3aG9zZQogIC8vIHBsYXllciBjaHJvbWUgd2Uga25vdyBob3cgdG8gaW5qZWN0IGludG8uIERldGVjdGlvbiBpcyBob3N0bmFtZS0KICAvLyBmaXJzdCAoaGFuZGxlcyByZWd1bGFyIHBhZ2VzKSB3aXRoIGEgRE9NLXNpZ25hbCBmYWxsYmFjayAoaGFuZGxlcwogIC8vIGFib3V0OmJsYW5rIHNhbWUtb3JpZ2luIGlmcmFtZXMgd2hlcmUgbG9jYXRpb24uaG9zdG5hbWUgaXMgIiIpLgogIC8vCiAgLy8gVG8gc3VwcG9ydCBhIG5ldyBzaXRlLCBhZGQgYSByZWNvcmQgaGVyZSBhbmQgd3JpdGUgYSBtYXRjaGluZwogIC8vIGBhZGQ8TmFtZT5CdXR0b24odmlkZW8pYCBpbmplY3RvciDigJQgbm8gb3RoZXIgY2hhbmdlIHJlcXVpcmVkLgogIGNvbnN0IE5BVElWRV9TSVRFUyA9IFsKICAgIHsKICAgICAgbmFtZTogIllvdVR1YmUiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoInlvdXR1YmUuY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5odG1sNS12aWRlby1wbGF5ZXIsIC55dHAtcmlnaHQtY29udHJvbHMiKSwKICAgICAgaW5qZWN0OiBhZGRZb3VUdWJlQnV0dG9uLAogICAgICBzY29wZTogIi5odG1sNS12aWRlby1wbGF5ZXIiLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlR3aXRjaCIsCiAgICAgIG1hdGNoOiAoaG9zdCkgPT4gaG9zdC5lbmRzV2l0aCgidHdpdGNoLnR2IikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXIsIFtkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItY29udHJvbHMiXScpLAogICAgICBpbmplY3Q6IGFkZFR3aXRjaEJ1dHRvbiwKICAgICAgc2NvcGU6ICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWNvbnRyb2xzIl0sIC52aWRlby1wbGF5ZXInLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIk5ldGZsaXgiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoIm5ldGZsaXguY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVpYT0iY29udHJvbHMtc3RhbmRhcmQiXSwgW2RhdGEtdWlhPSJ2aWRlby1jYW52YXMiXScpLAogICAgICBpbmplY3Q6IGFkZE5ldGZsaXhCdXR0b24sCiAgICAgIHNjb3BlOiAnW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJywKICAgIH0sCiAgXTsKCiAgLy8gUnVuIGFuIGluamVjdG9yIG9uY2Ugbm93IGFuZCBhZ2FpbiBvbiBldmVyeSByZWxldmFudCBET00gbXV0YXRpb24sCiAgLy8gc28gdGhlIGJ1dHRvbiByZWFwcGVhcnMgYWZ0ZXIgUmVhY3QgKE5ldGZsaXggLyBUd2l0Y2gpIHRlYXJzIGRvd24KICAvLyBhbmQgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIuIFRoZSBvYnNlcnZlciBzdGFydHMgb24gPGh0bWw+IGlmCiAgLy8gdGhlIHNjb3BlZCBjb250YWluZXIgaXNuJ3QgaW4gdGhlIERPTSB5ZXQsIHRoZW4gInByb21vdGVzIiBpdHNlbGYKICAvLyB0byB0aGUgc21hbGxlciBzdWJ0cmVlIGFzIHNvb24gYXMgaXQgYXBwZWFycyDigJQgbWluaW1pc2luZyBjaHVybi4KICAvLwogIC8vIFJlc2lsaWVuY2UgdG8gaG9zdCByZWRlc2lnbnM6IGlmIHRoZSBpbmplY3RvciBrZWVwcyByZXR1cm5pbmcgZmFsc2UKICAvLyBmb3IgYE5BVElWRV9GQUxMQkFDS19NU2AgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIHdlIGRpc2Nvbm5lY3QgdGhlCiAgLy8gb2JzZXJ2ZXIgYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQg4oCUIHNvIHVzZXJzCiAgLy8gYWx3YXlzIGdldCAqc29tZSogUGlQIGNvbnRyb2wgZXZlbiBpZiBZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeAogIC8vIGNoYW5nZXMgaXRzIERPTSBpbiBhIHdheSB0aGF0IGJyZWFrcyBvdXIgc2VsZWN0b3JzLiBUaGUgZmFsbGJhY2sgaXMKICAvLyBhcm1lZCBvbmx5IG9uY2UgcGVyIHZpZGVvIGFuZCBvbmx5IHRyaWdnZXJzIGlmIHRoZSBpbmplY3RvciBoYXMKICAvLyAqbmV2ZXIqIHN1Y2NlZWRlZDsgaW50ZXJtaXR0ZW50IGZhaWx1cmVzIGR1cmluZyBhIHJlLW1vdW50IGRvbid0CiAgLy8gY291bnQuCiAgZnVuY3Rpb24gdHJ5TmF0aXZlKHZpZGVvLCBpbmplY3Rvciwgc2NvcGVTZWxlY3RvciwgdGVhcmRvd25zKSB7CiAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGxldCBldmVyU3VjY2VlZGVkID0gISFpbmplY3Rvcih2aWRlbyk7CiAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgICBsZXQgZmVsbEJhY2sgPSBmYWxzZTsKICAgIC8vIEFsd2F5cyBvYnNlcnZlIGF0IGRvY3VtZW50IGxldmVsLiBXZSB0cmllZCBwcm9tb3RpbmcgdG8gYSBzY29wZWQKICAgIC8vIHN1YnRyZWUgKGFuZCB0byB0aGUgc2NvcGVkIHRhcmdldCdzIHBhcmVudCkgZm9yIGxvd2VyIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIGJ1dCBOZXRmbGl4IHJlLW1vdW50cyB3aG9sZSBwbGF5ZXIgc3VidHJlZXMgb24gdmlzaWJpbGl0eQogICAgLy8gY2hhbmdlcyDigJQgbGVhdmluZyBhbnkgbmFycm93ZXIgb2JzZXJ2ZXIgYXR0YWNoZWQgdG8gYSBkZXRhY2hlZAogICAgLy8gbm9kZSwgd2l0aCBubyB3YXkgdG8gZGV0ZWN0IGRldGFjaG1lbnQgYmVjYXVzZSBubyBtdXRhdGlvbnMgZmlyZQogICAgLy8gb24gdGhlIGRldGFjaGVkIG5vZGUuIFRoZSByQUYtY29hbGVzY2VkIGNhbGxiYWNrIGJlbG93IGNhcHMgd29yawogICAgLy8gYXQgb25lIGluamVjdG9yIGNhbGwgcGVyIGFuaW1hdGlvbiBmcmFtZSByZWdhcmRsZXNzIG9mIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIHNvIGRvY3VtZW50LWxldmVsIG9ic2VydmF0aW9uIHN0YXlzIGJvdW5kZWQuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgIGlmIChzY2hlZHVsZWQgfHwgZmVsbEJhY2spIHJldHVybjsKICAgICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICBpZiAoZmVsbEJhY2spIHJldHVybjsKICAgICAgICBpZiAoaW5qZWN0b3IodmlkZW8pKSB7CiAgICAgICAgICBldmVyU3VjY2VlZGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFldmVyU3VjY2VlZGVkICYmCiAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCA+PSBDT05GSUcuTkFUSVZFX0ZBTExCQUNLX01TKSB7CiAgICAgICAgICBmZWxsQmFjayA9IHRydWU7CiAgICAgICAgICBvYnMuZGlzY29ubmVjdCgpOwogICAgICAgICAgd2FybigibmF0aXZlIGluamVjdGlvbiB1bmF2YWlsYWJsZSBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUgKwogICAgICAgICAgICAgICAiOyBmYWxsaW5nIGJhY2sgdG8gZ2VuZXJpYyBwaWxsIik7CiAgICAgICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIG9icy5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICBpZiAodGVhcmRvd25zKSB0ZWFyZG93bnMucHVzaCgoKSA9PiBvYnMuZGlzY29ubmVjdCgpKTsKICB9CgogIC8vIERlY2lkZXMgd2hpY2ggVUkgdG8gYWRkIGZvciBhIGdpdmVuIHZpZGVvIGFuZCB3aXJlcyBpdCB1cC4gQ2FsbGVkCiAgLy8gZXhhY3RseSBvbmNlIHBlciB2aWRlbyBieSBgYXR0YWNoVG9WaWRlb2AuIFRoZSBgdGVhcmRvd25zYCBhcnJheSBpcwogIC8vIHBvcHVsYXRlZCB3aXRoIGNsZWFudXAgY2xvc3VyZXMgdGhhdCB0aGUgZGlzY292ZXJ5IG9ic2VydmVyJ3MKICAvLyByZW1vdmVkLW5vZGVzIHBhdGggd2lsbCBydW4uCiAgZnVuY3Rpb24gYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIEdlbmVyaWMgb3ZlcmxheSBpcyB0aGUgZGVmYXVsdC4gU2V0IGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcD0iMCIKICAgIC8vIChvciBmYWxzZS9uby9vZmYpIHBlci1vcmlnaW4gdG8gb3B0IGJhY2sgaW50byBuYXRpdmUgaW5qZWN0aW9uLgogICAgaWYgKGdlbmVyaWNQaXBGb3JjZWRDYWNoZWQoKSkgewogICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICBsb2coImluamVjdGVkIG92ZXJsYXkiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGhvc3QgPSBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTkFUSVZFX1NJVEVTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHNpdGUgPSBOQVRJVkVfU0lURVNbaV07CiAgICAgIGlmIChzaXRlLm1hdGNoKGhvc3QpKSB7CiAgICAgICAgdHJ5TmF0aXZlKHZpZGVvLCBzaXRlLmluamVjdCwgc2l0ZS5zY29wZSwgdGVhcmRvd25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAvLyBVbnJlY29nbmlzZWQgc2l0ZSAoYW5kIHVzZXIgb3B0ZWQgb3V0IG9mIGdlbmVyaWMgdmlhIGxvY2FsU3RvcmFnZSk6CiAgICAvLyBzdGlsbCBpbnN0YWxsIHRoZSBvdmVybGF5IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyBuYXRpdmUgdG8gYW5jaG9yIHRvLgogICAgYWRkT3ZlcmxheUJ1dHRvbih2aWRlbywgdGVhcmRvd25zKTsKICAgIGxvZygiaW5qZWN0ZWQgb3ZlcmxheSIpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGVyLXZpZGVvIHNldHVwICsgdGVhcmRvd24KICAvLwogIC8vIFJ1bnMgb25jZSBwZXIgPHZpZGVvPiBlbGVtZW50LiBUaGUgYHRlYXJkb3duc2AgYXJyYXkgaXMgdGhlIHNpbmdsZQogIC8vIHBsYWNlIGV2ZXJ5IGxpc3RlbmVyIC8gb2JzZXJ2ZXIgLyBET00gbm9kZSB3ZSBhZGQgZm9yIHRoaXMgdmlkZW8gaXMKICAvLyByZWNvcmRlZDsgdGhlIGRpc2NvdmVyeSBvYnNlcnZlciBiZWxvdyBjYWxscyB0aGVtIHdoZW4gdGhlIHZpZGVvIGlzCiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRoZSBzY3JpcHQgZG9lc24ndCBsZWFrIG9uIGxvbmctbGl2ZWQgU1BBCiAgLy8gcGFnZXMgd2l0aCBpbmZpbml0ZSBzY3JvbGwuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gYXR0YWNoVG9WaWRlbyh2aWRlbykgewogICAgaWYgKHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKSkgcmV0dXJuOwoKICAgIC8vIFNvbWUgc2l0ZXMgKE5ldGZsaXgsIGNlcnRhaW4gRFJNIHBsYXllcnMpIGV4cGxpY2l0bHkgZGlzYWJsZSBQaVAuCiAgICAvLyBDbGVhciBpdCBub3cgYW5kIHdhdGNoIChiZWxvdykgZm9yIHRoZSBwYWdlIHJlLXNldHRpbmcgaXQuCiAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgdmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgPSBmYWxzZTsKICAgICAgdmlkZW8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScpOwogICAgfQogICAgLy8gV2lyZSBhdXRvbWF0aWMtUGlQIGludGVudCAoYnJvd3NlcnMgd2l0aCBhdXRvLVBpUCBmZWF0dXJlLCBlLmcuCiAgICAvLyBDaHJvbWUgZmxhZywgZmlyZSB0aGlzIG9uIHRhYiBzd2l0Y2gpLiBUaGUgaGFuZGxlciBpcyBnbG9iYWwgcGVyCiAgICAvLyBkb2N1bWVudCDigJQgbGFzdCByZWdpc3RyYXRpb24gd2lucyDigJQgc28gb24gcGFnZXMgd2l0aCBtdWx0aXBsZQogICAgLy8gPHZpZGVvPiBlbGVtZW50cyAoWW91VHViZSB3YXRjaDogbWFpbiBwbGF5ZXIgKyBob3Zlci10aHVtYm5haWwKICAgIC8vIHByZXZpZXdzICsgYWQgcHJlLXJvbGwpIHRoZSAqbGFzdCogbW91bnRlZCB2aWRlbyB3b3VsZCBiZSBQaVAnZCwKICAgIC8vIHdoaWNoIGlzIGZyZXF1ZW50bHkgYSBoaWRkZW4vZW1wdHkgcHJldmlldyDihpIgYmxhY2sgUGlQIHdpbmRvdwogICAgLy8gd2l0aCBubyBjb250cm9scyBhbmQgYSBkZXN5bmNlZCBkdXJhdGlvbi4KICAgIC8vIFBpY2sgdGhlIG1vc3QgcGxhdXNpYmxlICJhY3RpdmUiIHZpZGVvIGF0IGZpcmUgdGltZSBpbnN0ZWFkOgogICAgLy8gdGhlIG9uZSBjdXJyZW50bHkgaW4gUGlQICh0b2dnbGluZyBvdXQpLCBlbHNlIHRoZSBsYXJnZXN0IHBsYXlpbmcKICAgIC8vIHZpZGVvLCBlbHNlIHRoZSBsYXJnZXN0IHZpZGVvIHdpdGggbWV0YWRhdGEuIE5vLW9wIG9uIGJyb3dzZXJzCiAgICAvLyB0aGF0IGRvbid0IHN1cHBvcnQgaXQ7IHRoZSB0cnkvY2F0Y2ggZ3VhcmRzIGlPUyAvIG9sZGVyIGJyb3dzZXJzLgogICAgdHJ5IHsKICAgICAgbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKCJlbnRlcnBpY3R1cmVpbnBpY3R1cmUiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgdiA9IHBpY2tBdXRvUGlwVGFyZ2V0KCkgfHwgdmlkZW87CiAgICAgICAgdHJ5IHsgYXdhaXQgdi5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpOyB9IGNhdGNoIChlKSB7IHdhcm4oImF1dG8tUGlQIGZhaWxlZDoiLCBlLm1lc3NhZ2UgfHwgZSk7IH0KICAgICAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciAqLyB9CgogICAgY29uc3QgdGVhcmRvd25zID0gW107CgogICAgYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwoKICAgIC8vIE9ubHkgcmVzdW1lIG9uIGVudGVyaW5nIFBpUCBpZiB0aGUgdmlkZW8gd2FzIGFjdHVhbGx5IHBsYXlpbmcgd2hlbgogICAgLy8gdGhlIHRyYW5zaXRpb24gZmlyZWQuIFRoZSBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGB2aWRlby5wbGF5KClgCiAgICAvLyBvdmVycm9kZSB1c2VyLWluaXRpYXRlZCBwYXVzZXMgKGUuZy4gWW91VHViZSBhdXRvLVBpUCBvbiB0YWItc3dpdGNoCiAgICAvLyB3b3VsZCB1bi1wYXVzZSBhIHBhdXNlZCB2aWRlbykuIENhcHR1cmUgc3RhdGUgYXQgaGFuZGxlciBhdHRhY2gKICAgIC8vIHRpbWUgYW5kIHJlZnJlc2ggb24gcGxheS9wYXVzZSBldmVudHMuCiAgICBsZXQgd2FzUGxheWluZyA9ICF2aWRlby5wYXVzZWQgJiYgIXZpZGVvLmVuZGVkOwogICAgY29uc3Qgb25QbGF5U3RhdGUgPSAoKSA9PiB7IHdhc1BsYXlpbmcgPSAhdmlkZW8ucGF1c2VkICYmICF2aWRlby5lbmRlZDsgfTsKICAgIGNvbnN0IFBMQVlfRVZFTlRTID0gWyJwbGF5IiwgInBsYXlpbmciLCAicGF1c2UiLCAiZW5kZWQiXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUExBWV9FVkVOVFMubGVuZ3RoOyBpKyspIHsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgfQogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFBMQVlfRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCBvbkVudGVyUGlwID0gKCkgPT4gewogICAgICBpZiAoIXdhc1BsYXlpbmcpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh3YXNQbGF5aW5nICYmIHZpZGVvLnBhdXNlZCkgdmlkZW8ucGxheSgpOyB9LCAyNTApOwogICAgfTsKICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImVudGVycGljdHVyZWlucGljdHVyZSIsIG9uRW50ZXJQaXApOwogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW50ZXJwaWN0dXJlaW5waWN0dXJlIiwgb25FbnRlclBpcCkpOwoKICAgIC8vIFdhdGNoIGZvciBzaXRlcyAoZS5nLiBOZXRmbGl4KSByZS1hZGRpbmcgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUuCiAgICBjb25zdCBkcGlwT2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgICB2aWRlby5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IGZhbHNlOwogICAgICAgIHZpZGVvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnKTsKICAgICAgfQogICAgfSk7CiAgICBkcGlwT2JzLm9ic2VydmUodmlkZW8sIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJ10gfSk7CiAgICB0ZWFyZG93bnMucHVzaCgoKSA9PiBkcGlwT2JzLmRpc2Nvbm5lY3QoKSk7CgogICAgdmlkZW9DbGVhbnVwcy5zZXQodmlkZW8sICgpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZWFyZG93bnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgeyB0ZWFyZG93bnNbaV0oKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSBpbmRpdmlkdWFsIHRlYXJkb3duIGVycm9ycyAqLyB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG9wLWxldmVsIHNldHVwICsgZGlzY292ZXJ5IG9ic2VydmVyCiAgLy8KICAvLyBPbmUgcGVyc2lzdGVudCBNdXRhdGlvbk9ic2VydmVyIHRyYWNrcyA8dmlkZW8+IGVsZW1lbnRzIGJlaW5nIGFkZGVkCiAgLy8gdG8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSBvdmVyIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEFkZCDihpIgd2lyZSB1cC4KICAvLyBSZW1vdmUg4oaSIHJ1biB0aGUgcmVnaXN0ZXJlZCB0ZWFyZG93biBjbG9zdXJlIGZvciB0aGF0IHZpZGVvLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUoKSB7CiAgICAvLyBBdHRhY2ggdG8gZXZlcnkgPHZpZGVvPiBjdXJyZW50bHkgb24gdGhlIHBhZ2UuCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpLmZvckVhY2goYXR0YWNoVG9WaWRlbyk7CgogICAgLy8gS2VlcCB3YXRjaGluZyBmb3IgdmlkZW9zIGFkZGVkIGxhdGVyIChsYXp5LWxvYWRlZCBmZWVkcywgU1BBIHJvdXRlCiAgICAvLyBjaGFuZ2VzLCBlbWJlZGRlZCBwbGF5ZXJzIHRoYXQgbW91bnQgYWZ0ZXIgZmlyc3QgcGFpbnQsIGV0Yy4pLgogICAgLy8gSW5kZXhlZCBsb29wcyArIG5vZGVUeXBlIGNoZWNrIGFyZSBmcmllbmRsaWVyIHRvIFY4J3MgaW5saW5lCiAgICAvLyBjYWNoZXMgdGhhbiBmb3Itb2YgKyBpbnN0YW5jZW9mIG9uIGhvdCBET00tbXV0YXRpb24gcGF0aHMuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihfb25Eb21NdXRhdGlvbnMpOwogICAgb2JzLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIF9ydW5DbGVhbnVwKHZpZGVvKSB7CiAgICBjb25zdCBmbiA9IHZpZGVvQ2xlYW51cHMuZ2V0KHZpZGVvKTsKICAgIGlmICghZm4pIHJldHVybjsKICAgIHZpZGVvQ2xlYW51cHMuZGVsZXRlKHZpZGVvKTsKICAgIHRyeSB7IGZuKCk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgZnVuY3Rpb24gX29uRG9tTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7CiAgICAgIGNvbnN0IG11ID0gbXV0YXRpb25zW2ldOwoKICAgICAgY29uc3QgYWRkZWQgPSBtdS5hZGRlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgYWxlbiA9IGFkZGVkLmxlbmd0aDsgaiA8IGFsZW47IGorKykgewogICAgICAgIGNvbnN0IG5vZGUgPSBhZGRlZFtqXTsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgY29udGludWU7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICJWSURFTyIpIHsKICAgICAgICAgIGF0dGFjaFRvVmlkZW8obm9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7CiAgICAgICAgICBjb25zdCB2aWRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCB2bGVuID0gdmlkcy5sZW5ndGg7IGsgPCB2bGVuOyBrKyspIGF0dGFjaFRvVmlkZW8odmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdCByZW1vdmVkID0gbXUucmVtb3ZlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgcmxlbiA9IHJlbW92ZWQubGVuZ3RoOyBqIDwgcmxlbjsgaisrKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IHJlbW92ZWRbal07CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIGNvbnRpbnVlOwogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAiVklERU8iKSB7CiAgICAgICAgICBfcnVuQ2xlYW51cChub2RlKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKICAgICAgICAgIGNvbnN0IHZpZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwogICAgICAgICAgZm9yIChsZXQgayA9IDAsIHZsZW4gPSB2aWRzLmxlbmd0aDsgayA8IHZsZW47IGsrKykgX3J1bkNsZWFudXAodmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBCb290CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIEJhaWwgb3V0IGVhcmx5IG9uIGJyb3dzZXJzIHdpdGggbm8gUGlQIEFQSSBhdCBhbGwgKGV4dHJlbWVseSBvbGQgb3IKICAvLyBleG90aWMpLiBBdm9pZHMgcmVnaXN0ZXJpbmcgbGlzdGVuZXJzIHdlJ2QgbmV2ZXIgdXNlLgogIGlmICghUElQX1NVUFBPUlRFRCkgcmV0dXJuOwoKICAvLyBTY29wZTogb25seSBydW4gaW4gdGhlIHRvcC1sZXZlbCBmcmFtZS4gRW1iZWRkZWQgcGxheWVycyAoZS5nLgogIC8vIHd3dy55b3V0dWJlLmNvbS9lbWJlZC88aWQ+IGlmcmFtZXMgaW5zaWRlIHRoaXJkLXBhcnR5IHBhZ2VzKSBnZXQKICAvLyBuZWl0aGVyIG5hdGl2ZSBpbmplY3Rpb24gbm9yIHRoZSBnZW5lcmljLXBpbGwgZmFsbGJhY2sg4oCUIHRoZSBob3N0CiAgLy8gc2l0ZSBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBQaVAgVVggaW5zaWRlIGlmcmFtZXMuIFRoaXMga2VlcHMKICAvLyB0aGUgc2NyaXB0IGZvY3VzZWQgb24gY2Fub25pY2FsIGRlc2t0b3Agc2Vzc2lvbnMgYW5kIGF2b2lkcwogIC8vIGRvdWJsZS1pbmplY3Rpb24gd2hlbiBib3RoIHRoZSBwYXJlbnQgZnJhbWUgYW5kIHRoZSBlbWJlZCBtYXRjaAogIC8vIGEgdXNlcidzIGZpbHRlciBydWxlLgogIHRyeSB7IGlmICh3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZikgcmV0dXJuOyB9IGNhdGNoIChlKSB7IHJldHVybjsgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IGlmIHRoZSB1c2VyIHByZXZpb3VzbHkgc2VsZWN0ZWQgIkRpc2FibGUgUGlQIGljb24KICAvLyBvbiA8c2l0ZT4iIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUsIHRoaXMgZmxhZyBwZXJzaXN0cyBpbgogIC8vIGxvY2FsU3RvcmFnZS4gQmFpbCBiZWZvcmUgYW55IHNldHVwIHNvIHRoZSBzY3JpcHQgaXMgYSB0cnVlIG5vLW9wCiAgLy8gZm9yIHRoYXQgb3JpZ2luIOKAlCBubyBvYnNlcnZlcnMsIG5vIGxpc3RlbmVycywgbm8gd29yay4gT3RoZXIKICAvLyBvcmlnaW5zIGFyZSB1bmFmZmVjdGVkIGJlY2F1c2UgbG9jYWxTdG9yYWdlIGlzIHBhcnRpdGlvbmVkIHBlci1vcmlnaW4uCiAgLy8gV2UgYWxzbyBzZWVkIHRoZSBjYWNoZWQgYF9zaXRlRGlzYWJsZWRgIGZsYWcgaGVyZSAoaXJyZWxldmFudCBpZiB3ZQogIC8vIHJldHVybiwgYnV0IGtlZXBzIHRoZSBjYWNoZSBsaXZlIGluIHRoZSBub3QteWV0LWRpc2FibGVkIGNhc2UpLgogIF9zaXRlRGlzYWJsZWQgPSByZWFkU2l0ZURpc2FibGVkKCk7CiAgaWYgKF9zaXRlRGlzYWJsZWQpIHJldHVybjsKCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCiAgICAgIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgc2V0dXBBdXRvUGljdHVyZUluUGljdHVyZSgpOwogIH0KfSkoKTs="},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUKCmNvbnN0IHNwb29mQnJhbmRzID0gKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgaWYgKGl0ZW0/LmJyYW5kPy50b0xvd2VyQ2FzZSgpID09PSAnYnJhdmUnKSB7CiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGJyYW5kOiAnR29vZ2xlIENocm9tZScgfTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0pOwp9OwoKY29uc3Qgb3JpZ2luYWxCcmFuZHMgPSBuYXZpZ2F0b3I/LnVzZXJBZ2VudERhdGE/LmJyYW5kczsKaWYgKG9yaWdpbmFsQnJhbmRzKSB7CiAgY29uc3Qgc3Bvb2ZlZEJyYW5kcyA9IHNwb29mQnJhbmRzKG9yaWdpbmFsQnJhbmRzKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF2aWdhdG9yVUFEYXRhLnByb3RvdHlwZSwgJ2JyYW5kcycsIHsKICAgIHZhbHVlOiBzcG9vZmVkQnJhbmRzCiAgfSk7Cn0KCmNvbnN0IG9yaWdpbmFsR2V0SGlnaEVudHJvcHlWYWx1ZXMgPQogIE5hdmlnYXRvclVBRGF0YT8ucHJvdG90eXBlPy5nZXRIaWdoRW50cm9weVZhbHVlczsKCmlmIChvcmlnaW5hbEdldEhpZ2hFbnRyb3B5VmFsdWVzKSB7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdmlnYXRvclVBRGF0YS5wcm90b3R5cGUsICdnZXRIaWdoRW50cm9weVZhbHVlcycsIHsKICAgIHZhbHVlOiBhc3luYyBmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcyhoaW50cykgewogICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgb3JpZ2luYWxHZXRIaWdoRW50cm9weVZhbHVlcy5jYWxsKAogICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnREYXRhLAogICAgICAgIGhpbnRzCiAgICAgICk7CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdHMpKSB7CiAgICAgICAgaWYgKGtleSA9PT0gJ2JyYW5kcycgfHwga2V5ID09PSAnZnVsbFZlcnNpb25MaXN0JykgewogICAgICAgICAgcmVzdWx0c1trZXldID0gc3Bvb2ZCcmFuZHMocmVzdWx0c1trZXldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfSk7Cn0KCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICBOYXZpZ2F0b3JVQURhdGEucHJvdG90eXBlLmdldEhpZ2hFbnRyb3B5VmFsdWVzLCAndG9TdHJpbmcnLCB7CiAgdmFsdWU6ICgpID0+ICdmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcygpIHsgW25hdGl2ZSBjb2RlXSB9Jwp9KTsK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play-update.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXktdXBkYXRlLmpzCi8vIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpIHsKICBjb25zdCBob3N0ID0gbG9jYXRpb24uaG9zdG5hbWU7CiAgY29uc3QgSVNfWU9VVFVCRSA9IC8oPzpefC4rXC4peW91dHViZSg/Oi1ub2Nvb2tpZSk/XC5jb20kLy50ZXN0KGhvc3QpOwogIGNvbnN0IElTX1ZJTUVPID0gLyg/Ol58LitcLil2aW1lb1wuY29tJC8udGVzdChob3N0KTsKCiAgLy8gUGFnZSBWaXNpYmlsaXR5IEFQSQogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnaGlkZGVuJywgewogICAgICBnZXQoKSB7IHJldHVybiBmYWxzZTsgfSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgZ2V0KCkgeyByZXR1cm4gJ3Zpc2libGUnOyB9LAogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnb252aXNpYmlsaXR5Y2hhbmdlJywgewogICAgICBnZXQoKSB7IHJldHVybiBudWxsOyB9LAogICAgICBzZXQoKSB7fSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gQmxvY2sgZXZlbnQgZGVsaXZlcnkgKGNhcHR1cmU9dHJ1ZSB0byBpbnRlcmNlcHQgZWFybHkpCiAgY29uc3Qgc3RvcCA9IChlKSA9PiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogIGNvbnN0IElTX0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8CiAgICAgICAgICAgICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICB0cnkgewogICAgLy8gU2tpcCB2aXNpYmlsaXR5Y2hhbmdlIGJsb2NraW5nIG9uIGlPUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1lZGlhIGJhY2tncm91bmRpbmcKICAgIGlmICghSVNfSU9TKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBzdG9wLCB0cnVlKTsKICAgIH0KICB9IGNhdGNoIChlKSB7fQoKICAvLyBGdWxsc2NyZWVuIEFQSSAoVmltZW8pCiAgaWYgKElTX1ZJTUVPKSB7CiAgICB0cnkgewogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHN0b3AsIHRydWUpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIC8vIFlvdVR1YmUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzCiAgaWYgKElTX1lPVVRVQkUpIHsKICAgIC8vIFVzZXIgYWN0aXZpdHkgdHJhY2tpbmcKICAgIGNvbnN0IExBQ1RfUkVGUkVTSCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWluCiAgICB3YWl0Rm9yTGFjdCgoKSA9PiByZWZyZXNoTGFjdCgpLCBMQUNUX1JFRlJFU0gpOwoKICAgIGZ1bmN0aW9uIGdldFZpZGVvKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigneXRkLXBsYXllciB2aWRlbywgI21vdmllX3BsYXllciB2aWRlbywgdmlkZW8nKTsKICAgIH0KCiAgICBsZXQgbGFzdFVzZXJJbnB1dCA9IDA7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CgogICAgLy8gTWVkaWEga2V5cyBnbyB0aHJvdWdoIE1lZGlhU2Vzc2lvbiwgbm90IGtleWRvd24uIFBhdGNoIHRoZSBwcm90b3R5cGUKICAgIC8vIHNvIHBhdXNlL3BsYXkgaGFuZGxlcnMgdXBkYXRlIGxhc3RVc2VySW5wdXQuCiAgICB0cnkgewogICAgICBjb25zdCBvcmlnU2V0ID0gTWVkaWFTZXNzaW9uLnByb3RvdHlwZS5zZXRBY3Rpb25IYW5kbGVyOwogICAgICBNZWRpYVNlc3Npb24ucHJvdG90eXBlLnNldEFjdGlvbkhhbmRsZXIgPSBmdW5jdGlvbihhY3QsIGgpIHsKICAgICAgICByZXR1cm4gb3JpZ1NldC5jYWxsKHRoaXMsIGFjdCwgKGFjdCAhPT0gJ3BhdXNlJyAmJiBhY3QgIT09ICdwbGF5JykgPyBoIDogZnVuY3Rpb24oLi4uYSkgewogICAgICAgICAgbGFzdFVzZXJJbnB1dCA9IERhdGUubm93KCk7CiAgICAgICAgICBpZiAodHlwZW9mIGggPT09ICdmdW5jdGlvbicpIHJldHVybiBoLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICBpZiAodikgYWN0ID09PSAncGF1c2UnID8gdi5wYXVzZSgpIDogdi5wbGF5KCkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBbJ3BhdXNlJywgJ3BsYXknXS5mb3JFYWNoKGEgPT4gbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKGEsIG51bGwpKTsKICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgZnVuY3Rpb24gb25WaWRlb05hdmlnYXRpb24oKSB7CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICAgIGlmIChJU19JT1MpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkZW8gPSBnZXRWaWRlbygpOwogICAgICAgIGlmICghdmlkZW8pIHJldHVybjsKICAgICAgICBpZiAodmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlcikgewogICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB2aWRlby5fYmdQbGF5UGF1c2VIYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHsKICAgICAgICAgIC8vIElmIHVzZXIgY2xpY2tlZCBvciBwcmVzc2VkIGEga2V5IHdpdGhpbiAzcyBiZWZvcmUgdGhlIHBhdXNlLCBpdCdzIGludGVudGlvbmFsCiAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RVc2VySW5wdXQgPCAzMDAwKSByZXR1cm47CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICAgIGlmICh2ICYmIHYucGF1c2VkICYmICF2LmVuZGVkICYmIHYucmVhZHlTdGF0ZSA+PSAyKSB2LnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICB9LCA4MDApOwogICAgICAgIH07CiAgICAgICAgdmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlciA9IGhhbmRsZXI7CiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVyKTsKICAgICAgfSwgMTUwMCk7CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3l0LW5hdmlnYXRlLWZpbmlzaCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1wYWdlLWRhdGEtdXBkYXRlZCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKCiAgICAvLyBTaW11bGF0ZSB1c2VyIGludGVyYWN0aW9uIHRvIHByZXZlbnQgIkFyZSB5b3Ugc3RpbGwgd2F0Y2hpbmc/IgogICAgY29uc3QgSU5URVJBQ1RJT05fSU5URVJWQUwgPSAxMCAqIDYwICogMTAwMDsgLy8gMTAgbWluCiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgaWYgKHBsYXllcikgewogICAgICAgIHBsYXllci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW1vdmUnLCB7IGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICB9CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICB9LCBJTlRFUkFDVElPTl9JTlRFUlZBTCk7CgogICAgLy8gS2VlcCBwbGF5ZXIgc3RhdGUgdXBkYXRlZAogICAgY29uc3QgUExBWUVSX1NUQVRFX0lOVEVSVkFMID0gNjAgKiAxMDAwOyAvLyAxIG1pbgogICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBjb25zdCB2aWRlbyA9IGdldFZpZGVvKCk7CiAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8ucGF1c2VkKSB7CiAgICAgICAgdmlkZW8uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3RpbWV1cGRhdGUnKSk7CiAgICAgIH0KICAgIH0sIFBMQVlFUl9TVEFURV9JTlRFUlZBTCk7CiAgfQoKICBmdW5jdGlvbiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIGRlbGF5ID0gMTAwMCkgewogICAgY29uc3QgbWF4RGVsYXkgPSA2MCAqIDEwMDA7IC8vIGNhcCBhdCA2MHMKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCAnX2xhY3QnKSkgewogICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dCgKICAgICAgICAoKSA9PiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIE1hdGgubWluKGRlbGF5ICogMiwgbWF4RGVsYXkpKSwKICAgICAgICBkZWxheQogICAgICApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaExhY3QoKSB7CiAgICB0cnkgewogICAgICBpZiAod2luZG93Ll9sYWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"brave-yt-sabr-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gWW91VHViZSdzIFNBQlIgKFNlcnZlciBBZGFwdGl2ZSBCaXRyYXRlKSBwcm90b2NvbCBzZW5kcyBhIGJhY2tvZmZUaW1lTXMKLy8gdmFsdWUgdGVsbGluZyB0aGUgcGxheWVyIHRvIHdhaXQgYmVmb3JlIHJlcXVlc3RpbmcgdmlkZW8gZGF0YS4gVGhpcwovLyBjb3ZlcnMgdGhlIGFkIHNsb3QgZHVyYXRpb24uIFdpdGhvdXQgYW4gYWRibG9ja2VyIHRoZSBhZCBmaWxscyB0aGUgd2FpdCwKLy8gc28gdGhlIHVzZXIgbmV2ZXIgbm90aWNlcy4gV2l0aCBhbiBhZGJsb2NrZXIsIHRoZSBhZCBpcyBibG9ja2VkIGJ1dCB0aGUKLy8gYmFja29mZiByZW1haW5zLCBjYXVzaW5nIGEgNC0xNiBzZWNvbmQgc3Bpbm5lci4KLy8gRnJvbTogaHR0cHM6Ly9pdGVyLmNhL3Bvc3QveXQtYWRibG9jay8KLy8KLy8gVHdvLXByb25nZWQgZml4OgovLwovLyAxLiBTUEEgbmF2aWdhdGlvbjogV2hlbiBjbGlja2luZyBiZXR3ZWVuIHZpZGVvcyB3aXRob3V0IGEgcGFnZSByZWxvYWQsCi8vICAgIHRoZSBwbGF5ZXIgcmV1c2VzIHRoZSBvbGQgU0FCUiBzZXNzaW9uICh3aGljaCBtYXkgYWxyZWFkeSBoYXZlIGEKLy8gICAgYmFja29mZikuIE9uIHl0LW5hdmlnYXRlLWZpbmlzaCwgd2Ugc2V0IGlzSW5saW5lUGxheWJhY2tOb0FkIG9uIHRoZQovLyAgICBwbGF5ZXIncyB2aWRlbyBkYXRhICh0ZWxsaW5nIGl0IHRoZXJlJ3Mgbm8gYWQgc2xvdCksIHRoZW4gY2FsbAovLyAgICBjYW5jZWxQbGF5YmFjaygpICsgbG9hZFZpZGVvQnlJZCgpIHRvIGZvcmNlIGEgbmV3IFNBQlIgc2Vzc2lvbi4KLy8KLy8gMi4gU0FCUiByZXNwb25zZSBwYXRjaGluZyAoZnVsbCBwYWdlIGxvYWRzKTogSW50ZXJjZXB0IFNBQlIgc3RyZWFtaW5nCi8vICAgIHJlc3BvbnNlcyBhbmQgcmV3cml0ZSBiYWNrb2ZmVGltZU1zIGluIHRoZSBwcm90b2J1Zi4gVGhpcyBoYW5kbGVzCi8vICAgIHBhZ2UgcmVsb2FkcyBhbmQgZGlyZWN0IG5hdmlnYXRpb25zIHdoZXJlIHRoZSBTQUJSIHNlc3Npb24gd2FzCi8vICAgIGFscmVhZHkgZXN0YWJsaXNoZWQgYmVmb3JlIHRoZSBzY3JpcHRsZXQgY291bGQgaW50ZXJ2ZW5lLgovLwovLyBUbyB1c2UgdGhpcyBzY3JpcHRsZXQ6Ci8vIDEuIEdvIHRvIGJyYXZlOi8vc2V0dGluZ3Mvc2hpZWxkcy9maWx0ZXJzCi8vIDIuIEVuYWJsZSBEZXZlbG9wZXIgbW9kZQovLyAzLiBDbGljayBvbiBjcmVhdGUgbmV3IHNjcmlwdGxldAovLyA0LiBBZGQgdGhpcyBjb250ZW50IGFuZCBuYW1lIGl0IGB1c2VyLXl0LXNhYnItZml4LmpzYAovLyA1LiBBZGQgYSBjdXN0b20gZmlsdGVyOiBgd3d3LnlvdXR1YmUuY29tIyMranModXNlci15dC1zYWJyLWZpeC5qcylgCi8vIDYuIEdvIHRvIFlvdVR1YmUgYW5kIHRlc3QKCihmdW5jdGlvbigpIHsKICAgIGNvbnN0IERFQlVHID0gZmFsc2U7CiAgICBjb25zdCBMT0dfUFJFRklYID0gJ1t5dC1zYWJyLWZpeF0nOwogICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IGVsYXBzZWQgPSAoKSA9PiAoKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMCkudG9GaXhlZCgyKSArICdzJzsKICAgIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7IGlmIChERUJVRykgY29uc29sZS5sb2coTE9HX1BSRUZJWCwgZWxhcHNlZCgpLCAuLi5hcmdzKTsgfTsKCiAgICAvLyBQcmVtaXVtIGFjY291bnRzIGhhdmUgbm8gYWRzIGFuZCBubyBiYWNrb2ZmLCBub3RoaW5nIHRvIGRvLgogICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EjbG9nb1t0aXRsZSo9IlByZW1pdW0iIGldJykpIHJldHVybjsKCiAgICAvLyBQcm9uZyAxOiBPbiBTUEEgbmF2aWdhdGlvbiwgZm9yY2UgYSBuZXcgYWQtZnJlZSBTQUJSIHNlc3Npb24uCiAgICAvLyBTZXQgaXNJbmxpbmVQbGF5YmFja05vQWQgb24gdGhlIHZpZGVvIGRhdGEgc28gdGhlIG5ldyBzZXNzaW9uCiAgICAvLyBkb2Vzbid0IGdldCBhbiBhZCBzbG90LCB0aGVuIHRlYXIgZG93biB0aGUgb2xkIHNlc3Npb24gYW5kIHN0YXJ0IGZyZXNoLgogICAgLy8gSW5pdGlhbGl6ZSB0byB0aGUgY3VycmVudCB2aWQgc28gdGhlIGluaXRpYWwgeXQtbmF2aWdhdGUtZmluaXNoCiAgICAvLyAod2hpY2ggZmlyZXMgb24gcGFnZSBsb2FkIGNvbXBsZXRpb24sIG5vdCBqdXN0IFNQQSBuYXYpIGlzIHRyZWF0ZWQKICAgIC8vIGFzIGEgZHVwbGljYXRlIGFuZCBza2lwcGVkLiBBdm9pZHMgdGVhcmluZyBkb3duIHBsYXliYWNrIG9uIHJlZnJlc2guCiAgICAvLyBXZSBza2lwIHRlYXJkb3duIHdoZW4gdGhlcmUncyBubyBwcmlvciBzZXNzaW9uIHRvIGNsZWFyLgogICAgbGV0IGxhc3RSZWxvYWRlZFZpZCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKSB8fCAnJzsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1uYXZpZ2F0ZS1maW5pc2gnLCAoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkIHx8IHZpZCA9PT0gbGFzdFJlbG9hZGVkVmlkKSByZXR1cm47CiAgICAgICAgY29uc3QgaGFkUHJpb3JTZXNzaW9uID0gbGFzdFJlbG9hZGVkVmlkICE9PSAnJzsKICAgICAgICBsYXN0UmVsb2FkZWRWaWQgPSB2aWQ7CiAgICAgICAgaWYgKCFoYWRQcmlvclNlc3Npb24pIHJldHVybjsKCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgICAgICAgaWYgKCFwbGF5ZXI/LmNhbmNlbFBsYXliYWNrIHx8ICFwbGF5ZXI/LmxvYWRWaWRlb0J5SWQpIHJldHVybjsKCiAgICAgICAgICAgIC8vIFNldCB0aGUgbm8tYWQgZmxhZyBiZWZvcmUgcmVsb2FkaW5nIHNvIHRoZSBuZXcgc2Vzc2lvbiBwaWNrcyBpdCB1cAogICAgICAgICAgICBjb25zdCB2ZCA9IHBsYXllci5nZXRWaWRlb0RhdGE/LigpOwogICAgICAgICAgICBpZiAodmQpIHZkLmlzSW5saW5lUGxheWJhY2tOb0FkID0gdHJ1ZTsKCiAgICAgICAgICAgIHBsYXllci5jYW5jZWxQbGF5YmFjaygpOwogICAgICAgICAgICBwbGF5ZXIubG9hZFZpZGVvQnlJZCh2aWQpOwogICAgICAgICAgICBsb2coJ2ZvcmNlZCBuZXcgU0FCUiBzZXNzaW9uIGZvcicsIHZpZCk7CiAgICAgICAgfSwgMTAwKTsKICAgIH0pOwoKICAgIC8vIFByb25nIDFiOiBjb2xkLWxvYWQgcmVzY3VlLiBPbiBhIGZyZXNoIHBhZ2UgbG9hZCB0aGUgcGxheWVyIGFscmVhZHkKICAgIC8vIGhvbGRzIGEgU0FCUiBzZXNzaW9uIGNhcnJ5aW5nIHRoZSBhZC1zbG90IGJhY2tvZmYsIGFuZCBQcm9uZyAxIChTUEEgbmF2CiAgICAvLyBvbmx5KSB3b24ndCBmaXJlLiBQcm9uZyAyIGJlbG93IGNhbiByZXdyaXRlIGJhY2tvZmZUaW1lTXMsIGJ1dCBZb3VUdWJlCiAgICAvLyBzZWVtcyB0byBiZSBpZ25vcmluZyBvdXIgcmV3cml0dGVuIHZhbHVlIGFuZCBlbmZvcmNpbmcgYSBzZXJ2ZXItc2lkZQogICAgLy8gYWQtc2xvdCBkZWxheS4gVGhlIHdheSB0byBnZXQgYXJvdW5kIHRoaXMgaXMgdG8gZm9yY2UgYSBmcmVzaCBzZXNzaW9uIAogICAgLy8gKHNhbWUgbWVjaGFuaXNtIGFzIFByb25nIDEpLiBTbyB3aGVuIFByb25nIDIgZmlyc3Qgc2VlcyBhIHJlYWwgYmFja29mZiAKICAgIC8vIG9uIHRoZSBjb2xkIHNlc3Npb24sIGZvcmNlIGEgc2luZ2xlIGZyZXNoIHNlc3Npb24gaGVyZS4gSWYgdGhlIG5ldyAKICAgIC8vIHNlc3Npb24gc3RpbGwgcmV0dXJucyBhIGJhY2tvZmYsIHdlIGJyZWFrIHRvIGF2b2lkIGEgcmVsb2FkIGxvb3AuCiAgICBsZXQgY29sZFJlbG9hZERvbmUgPSBmYWxzZTsKICAgIGZ1bmN0aW9uIGZvcmNlRnJlc2hTZXNzaW9uT25jZSgpIHsKICAgICAgICBpZiAoY29sZFJlbG9hZERvbmUpIHJldHVybjsKICAgICAgICBjb2xkUmVsb2FkRG9uZSA9IHRydWU7CiAgICAgICAgY29uc3QgcGxheWVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21vdmllX3BsYXllcicpOwogICAgICAgIGlmICghcGxheWVyPy5jYW5jZWxQbGF5YmFjayB8fCAhcGxheWVyPy5sb2FkVmlkZW9CeUlkKSByZXR1cm47CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkKSByZXR1cm47CgogICAgICAgIGNvbnN0IHZkID0gcGxheWVyLmdldFZpZGVvRGF0YT8uKCk7CiAgICAgICAgaWYgKHZkKSB2ZC5pc0lubGluZVBsYXliYWNrTm9BZCA9IHRydWU7CgogICAgICAgIHBsYXllci5jYW5jZWxQbGF5YmFjaygpOwogICAgICAgIHBsYXllci5sb2FkVmlkZW9CeUlkKHZpZCk7CiAgICAgICAgbG9nKCdjb2xkLWxvYWQgcmVzY3VlOiBmb3JjZWQgZnJlc2ggYWQtZnJlZSBzZXNzaW9uIGZvcicsIHZpZCk7CiAgICB9CgogICAgLy8gUHJvbmcgMjogSW50ZXJjZXB0IFNBQlIgcmVzcG9uc2VzIGFuZCBwYXRjaCBiYWNrb2ZmVGltZU1zLgogICAgLy8gVGVlIHRoZSBib2R5IHNvIG1lZGlhIGNodW5rcyAoPj0xMDAwIGJ5dGVzKSBwYXNzIHRocm91Z2ggdW50b3VjaGVkCiAgICAvLyDigJQgb25seSB0aGUgc21hbGwgY29udHJvbCBtZXNzYWdlcyBjYXJyeWluZyB0aGUgYmFja29mZiBmaWVsZCBnZXQKICAgIC8vIGJ1ZmZlcmVkIGFuZCByZS1lbWl0dGVkIGFzIGEgc3ludGhlc2l6ZWQgUmVzcG9uc2UuCiAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CgogICAgd2luZG93LmZldGNoID0gZnVuY3Rpb24ocmVzb3VyY2UsIGluaXQpIHsKICAgICAgICBjb25zdCB1cmwgPSB0eXBlb2YgcmVzb3VyY2UgPT09ICdzdHJpbmcnID8gcmVzb3VyY2UgOiAocmVzb3VyY2U/LnVybCB8fCAnJyk7CgogICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2dvb2dsZXZpZGVvLmNvbScpICYmIHVybC5pbmNsdWRlcygnc2Ficj0xJykpIHsKICAgICAgICAgICAgbGV0IHJuID0gJyc7CiAgICAgICAgICAgIHRyeSB7IHJuID0gbmV3IFVSTCh1cmwpLnNlYXJjaFBhcmFtcy5nZXQoJ3JuJykgfHwgJyc7IH0gY2F0Y2goZSkge30KICAgICAgICAgICAgbG9nKCdTQUJSIGZldGNoIHJuPScgKyBybik7CgogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCAhcmVzcG9uc2UuYm9keSkgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgLy8gVGVlIGRlZmVuc2l2ZWx5OiBpZiBpdCB0aHJvd3MgKGxvY2tlZCBzdHJlYW0sIGJyb3dzZXIgcXVpcmspLAogICAgICAgICAgICAgICAgLy8gaGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgYmFjayB0byBhdm9pZCBicmVha2luZyB0aGUgdmlkZW8gZW50aXJlbHkuCiAgICAgICAgICAgICAgICBsZXQgcGFzcywgc2NhbiwgcmVpbml0OwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBbcGFzcywgc2Nhbl0gPSByZXNwb25zZS5ib2R5LnRlZSgpOwogICAgICAgICAgICAgICAgICAgIHJlaW5pdCA9IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMgfTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFN0cmVhbShzY2FuLmdldFJlYWRlcigpLCAxMDAwKS50aGVuKGZ1bmN0aW9uKGJ5dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnU0FCUiBkb25lIHJuPScgKyBybik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocGFzcywgcmVpbml0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbG9nKCdzbWFsbCByZXNwb25zZSBybj0nICsgcm4sICdzaXplPScgKyBieXRlcy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIHRoZSBhZC1zbG90IHdhaXQsIGF0dGVtcHQgdG8gZm9yY2UgYSBmcmVzaCBzZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGZpcnN0IHNpZ24gb2YgYSByZWFsIGJhY2tvZmYgb24gdGhlIGNvbGQgc2Vzc2lvbi4gSWYgdGhlIG5ldwogICAgICAgICAgICAgICAgICAgIC8vIHNlc3Npb24gc3RpbGwgcmV0dXJucyBhIGJhY2tvZmYsIGJyZWFrIHRvIGF2b2lkIGFuIGluZmluaXRlIHJlbG9hZCBsb29wLgogICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaEJhY2tvZmZGaWVsZChieXRlcywgcm4pKSBmb3JjZUZyZXNoU2Vzc2lvbk9uY2UoKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBuZXcgUmVzcG9uc2UoYnl0ZXMsIHJlaW5pdCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG91dCwgJ3VybCcsIHsgdmFsdWU6IHJlc3BvbnNlLnVybCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlLnR5cGUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CgogICAgLy8gUmVhZCBhIHN0cmVhbSBpbnRvIGEgVWludDhBcnJheS4gSWYgZWFybHlFeGl0VGhyZXNob2xkIGlzIHNldCBhbmQgdGhlCiAgICAvLyBhY2N1bXVsYXRlZCBieXRlcyBjcm9zcyBpdCwgY2FuY2VsIHRoZSByZWFkZXIgYW5kIHJldHVybiBudWxsIOKAlCB1c2VkCiAgICAvLyB0byBiYWlsIG91dCBvZiBidWZmZXJpbmcgd2hlbiB0aGUgcmVzcG9uc2UgaXMgY2xlYXJseSBhIG1lZGlhIGNodW5rCiAgICAvLyBhbmQgc2hvdWxkIHN0cmVhbSBzdHJhaWdodCB0byB0aGUgcGxheWVyIGluc3RlYWQuCiAgICBmdW5jdGlvbiByZWFkU3RyZWFtKHJlYWRlciwgZWFybHlFeGl0VGhyZXNob2xkKSB7CiAgICAgICAgY29uc3QgY2h1bmtzID0gW107CiAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIHB1bXAocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgewogICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkodG90YWwpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBvZmYgKz0gY2h1bmtzW2ldLmxlbmd0aCwgaSsrKQogICAgICAgICAgICAgICAgICAgIG1lcmdlZC5zZXQoY2h1bmtzW2ldLCBvZmYpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaHVua3MucHVzaChyZXN1bHQudmFsdWUpOwogICAgICAgICAgICB0b3RhbCArPSByZXN1bHQudmFsdWUubGVuZ3RoOwogICAgICAgICAgICBpZiAoZWFybHlFeGl0VGhyZXNob2xkICYmIHRvdGFsID49IGVhcmx5RXhpdFRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgdHJ5IHsgcmVhZGVyLmNhbmNlbCgpOyB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKHB1bXApOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vIFNjYW4gZm9yIHByb3RvYnVmIGZpZWxkIDQgKGJhY2tvZmZUaW1lTXMpIGFuZCByZXdyaXRlIHZhbHVlcyA+IDUwMG1zCiAgICAvLyB0byBhIHNtYWxsIHJhbmRvbSB2YWx1ZSAoNTAtMTUwbXMsIGxvb2tzIGxpa2UgbmF0dXJhbCBiYWNrb2ZmIG5vaXNlCiAgICAvLyByYXRoZXIgdGhhbiBhIGNsZWFuIHplcm8pLiBQcm90b2J1ZiB3aXJlIGZvcm1hdDogZmllbGQgNCwgd2lyZSB0eXBlCiAgICAvLyAwICh2YXJpbnQpID0gdGFnIGJ5dGUgMHgyMCAoZmllbGRfbnVtYmVyIDw8IDMgfCB3aXJlX3R5cGUgPSA0IDw8IDMKICAgIC8vIHwgMCkuIFRoZSB2YXJpbnQgdXNlcyA3IGJpdHMgcGVyIGJ5dGUgd2l0aCAweDgwIGFzIGNvbnRpbnVhdGlvbgogICAgLy8gZmxhZy4gV2UgcmV3cml0ZSB0aGUgdmFyaW50IGluIHBsYWNlLCBrZWVwaW5nIHRoZSBzYW1lIGJ5dGUgY291bnQKICAgIC8vIHNvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZSBzdGF5cyB2YWxpZC4KICAgIGZ1bmN0aW9uIHBhdGNoQmFja29mZkZpZWxkKGJ5dGVzLCBybikgewogICAgICAgIGxldCBwYXRjaGVkID0gZmFsc2U7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgaWYgKGJ5dGVzW2ldICE9PSAweDIwKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IHZhbCA9IDAsIHNoaWZ0ID0gMCwgZW5kID0gaSArIDE7CiAgICAgICAgICAgIHdoaWxlIChlbmQgPCBieXRlcy5sZW5ndGggJiYgc2hpZnQgPCAzNSkgewogICAgICAgICAgICAgICAgdmFsIHw9IChieXRlc1tlbmRdICYgMHg3ZikgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgICBpZiAoIShieXRlc1tlbmRdICYgMHg4MCkpIHsgZW5kKys7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBzaGlmdCArPSA3OwogICAgICAgICAgICAgICAgZW5kKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbCA+IDUwMCAmJiB2YWwgPCAxMDAwMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IDUwICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKTsKICAgICAgICAgICAgICAgIGxvZygnUEFUQ0ggYmFja29mZj0nICsgdmFsICsgJ21zIOKGkiAnICsgdGFyZ2V0ICsgJ21zIGF0IG9mZnNldD0nICsgaSwgJ3JuPScgKyBybik7CiAgICAgICAgICAgICAgICBsZXQgcG9zID0gaSArIDEsIHJlbWFpbmluZyA9IHRhcmdldDsKICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnl0ZXNbcG9zKytdID0gKHJlbWFpbmluZyAmIDB4N2YpIHwgMHg4MDsKICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPj4+PSA3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnl0ZXNbcG9zXSA9IHJlbWFpbmluZyAmIDB4N2Y7CiAgICAgICAgICAgICAgICBwYXRjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF0Y2hlZDsKICAgIH0KCiAgICBpZiAoREVCVUcpIHsKICAgICAgICBsZXQgbGFzdFJTID0gLTE7CiAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICBpZiAoIXYpIHJldHVybjsKICAgICAgICAgICAgaWYgKHYucmVhZHlTdGF0ZSAhPT0gbGFzdFJTKSB7CiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2LmJ1ZmZlcmVkLmxlbmd0aCA+IDAgPyB2LmJ1ZmZlcmVkLmVuZCgwKS50b0ZpeGVkKDEpIDogJzAnOwogICAgICAgICAgICAgICAgbG9nKCdWSURFTyBycz0nICsgdi5yZWFkeVN0YXRlLCAnY3Q9JyArIHYuY3VycmVudFRpbWUudG9GaXhlZCgxKSwgJ2J1Zj0nICsgYnVmLCB2LnBhdXNlZCA/ICdwYXVzZWQnIDogJ3BsYXlpbmcnKTsKICAgICAgICAgICAgICAgIGxhc3RSUyA9IHYucmVhZHlTdGF0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDIwMCk7CiAgICB9CgogICAgbG9nKCdsb2FkZWQnKTsKfSkoKTsKCg=="},{"name":"brave-youtube-playback-speed-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXlvdXR1YmUtcGxheWJhY2stc3BlZWQtZml4LmpzCi8vIFRoaXMgc2NyaXB0IGlzIGluamVjdGVkIGludG8gWW91VHViZSBwYWdlcyB0byB3b3JrIGFyb3VuZCBhIFlvdVR1YmUgYnVnIHdoZXJlCi8vIHRoZSBwbGF5YmFjayBzcGVlZCB3aWxsIG9ubHkgc2F2ZSBmb3IgZnV0dXJlIHZpZGVvcyB3aGVuIHVzaW5nIHRoZSBzbGlkZXIgY29udHJvbHMuCi8vIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHBsYXliYWNrIHNwZWVkIHVzaW5nIHRoZSBidXR0b25zLCB0aGUgbmV3IHNwZWVkIHdpbGwgbm90IGJlIHNhdmVkLgovLyBUaGlzIGNyZWF0ZWQgaXNzdWVzIHdoZXJlLCBpZiB0aGUgdXNlciBhZGp1c3RlZCB0aGUgc2xpZGVyLCBhbmQgdGhlbiBjbGlja2VkIHRoZSAxeCBidXR0b24gdG8KLy8gcmVzZXQgdGhlIHNwZWVkLCB0aGUgc3BlZWQgd291bGQgYmUgcmVzZXQgdG8gMXgsIGJ1dCB0aGVuIGFsbCBmdXR1cmUgdmlkZW9zIHdvdWxkIHBsYXkgYXQgdGhlCi8vIHByZXZpb3VzbHkgc2V0IHNwZWVkLiBUaGUgc2NyaXB0IHdvcmtzIGFyb3VuZCB0aGlzIGJ5IHNhdmluZyB0aGUgcGxheWJhY2sgc3BlZWQgdG8gc2Vzc2lvblN0b3JhZ2UKLy8gd2hlbmV2ZXIgaXQgY2hhbmdlcywgaW5zdGVhZCBvZiByZWx5aW5nIG9uIFlvdVR1YmUncyBkZWZhdWx0IGJlaGF2aW9yLgooZnVuY3Rpb24gKCkgewogIGNvbnN0IEtFWSA9ICd5dC1wbGF5ZXItcGxheWJhY2stcmF0ZSc7CiAgZnVuY3Rpb24gYXR0YWNoKHBsYXllcikgewogICAgaWYgKCFwbGF5ZXIgfHwgIXBsYXllci5hZGRFdmVudExpc3RlbmVyIHx8IHBsYXllci5fX3JhdGVIb29rZWQpIHJldHVybiBmYWxzZTsKICAgIHBsYXllci5fX3JhdGVIb29rZWQgPSB0cnVlOwogICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ29uUGxheWJhY2tSYXRlQ2hhbmdlJywgZnVuY3Rpb24gKHJhdGUpIHsKICAgICAgY29uc3QgdiA9ICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpID8gcmF0ZSA6IChyYXRlICYmIHJhdGUuZGF0YSkgPz8gcmF0ZTsKICAgICAgdHJ5IHsKICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKEtFWSwgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgZGF0YTogU3RyaW5nKHYpLAogICAgICAgICAgY3JlYXRpb246IERhdGUubm93KCkKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoIWF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICBjb25zdCBvbk5hdkZpbmlzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogIH0KfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIHZhZnQKICAgIC8vIGluc3RhbmNlIHRoYXQgZmlnaHRzIGZvciBwbGF5ZXIgY29udHJvbC4gT25seSB0aGUgdG9wIGZyYW1lIGhvc3RzIHRoZSBwbGF5ZXIgb24KICAgIC8vIHR3aXRjaC50di9DSEFOTkVMOyBuZXN0ZWQgYXV4aWxpYXJ5IGZyYW1lcyBhcmUgbm9pc2UuCiAgICAvLyBBbGxvdy1saXN0IGZvciBuZXN0ZWQtZnJhbWUgaW5qZWN0aW9uOiBUd2l0Y2gncyB0aHJlZSBkb2N1bWVudGVkIGVtYmVkIGNvbnRleHRzCiAgICAvLyAoaHR0cHM6Ly9kZXYudHdpdGNoLnR2L2RvY3MvZW1iZWQvdmlkZW8tYW5kLWNsaXBzLykg4oCUIHByZXNlcnZlcyBUd2l0Y2ggc3RyZWFtcwogICAgLy8gZW1iZWRkZWQgb24gdGhpcmQtcGFydHkgc2l0ZXMgd2hlcmUgdmFmdCBydW5zIGluIGFuIGlmcmFtZSB3aG9zZSBwYXJlbnQgaXMgb24KICAgIC8vIGEgZGlmZmVyZW50IG9yaWdpbi4KICAgIC8vIFVzZSB3aW5kb3cuZnJhbWVFbGVtZW50IHRvIGRldGVjdCBuZXN0ZWQgZnJhbWVzIOKAlCBudWxsIG9uIHRvcCBmcmFtZSwgdGhlIGlmcmFtZQogICAgLy8gZWxlbWVudCBvbiBhIHNhbWUtb3JpZ2luIG5lc3RlZCBmcmFtZSwgdGhyb3dzIG9uIGEgY3Jvc3Mtb3JpZ2luIG5lc3RlZCBmcmFtZS4KICAgIC8vIE1vcmUgcmVsaWFibGUgdGhhbiAnd2luZG93ICE9PSB3aW5kb3cudG9wJyBiZWNhdXNlIFRhbXBlcm1vbmtleSB3cmFwcyB3aW5kb3cgaW4gYQogICAgLy8gcHJveHkgd2hlcmUgdGhlIHN0cmljdCBjb21wYXJpc29uIGNhbiByZXR1cm4gdHJ1ZSBldmVuIG9uIHRoZSB0b3AgZnJhbWUuCiAgICBsZXQgX2lzTmVzdGVkID0gZmFsc2U7CiAgICB0cnkgeyBfaXNOZXN0ZWQgPSB3aW5kb3cuZnJhbWVFbGVtZW50ICE9PSBudWxsOyB9IGNhdGNoIChfZSkgeyBfaXNOZXN0ZWQgPSB0cnVlOyB9CiAgICBpZiAoX2lzTmVzdGVkKSB7CiAgICAgICAgY29uc3QgX2hvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfaXNFbWJlZENvbnRleHQgPSBfaG9zdCA9PT0gJ3BsYXllci50d2l0Y2gudHYnIHx8IF9ob3N0ID09PSAnZW1iZWQudHdpdGNoLnR2JyB8fCBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvZW1iZWQvJyk7CiAgICAgICAgaWYgKCFfaXNFbWJlZENvbnRleHQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmFmdCBza2lwcGVkIOKAlCBuZXN0ZWQgZnJhbWUgb24gJyArIF9ob3N0ICsgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgKyAnIChub3QgYSBUd2l0Y2ggZW1iZWQpLiBJZiB5b3Ugc2VlIHRoaXMgb24gdHdpdGNoLnR2L0NIQU5ORUwgdG9wIGZyYW1lLCBwbGVhc2UgcmVwb3J0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJ3VzZSBzdHJpY3QnOwogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gNTg7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2YWZ0IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZhZnQgdicgKyBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnIHNraXBwZWQg4oCUIGFub3RoZXIgc2NyaXB0IGFscmVhZHkgYWN0aXZlICh2JyArIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnKS4gUmVtb3ZlIGR1cGxpY2F0ZSBzY3JpcHRzLicpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb247CiAgICAvLyBDb25maWd1cmF0aW9uIGFuZCBzdGF0ZSBzaGFyZWQgYmV0d2VlbiB3aW5kb3cgYW5kIHdvcmtlciBzY29wZXMKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guIFRoZSBzcGVjaWZpYyB0d2l0Y2gtc3RpdGNoZWQtYWQgREFURVJBTkdFCiAgICAgICAgLy8gbWFya2VyIGlzIGEgc3Vic2V0IG9mIHRoaXMgcHJlZml4LgogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVycyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIiddOwogICAgICAgIHNjb3BlLkFkU2VnbWVudFVSTFBhdHRlcm5zID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24g4oCUIGZvcgogICAgICAgIC8vIGEgMTAwLWxpbmUgbTN1OCBhdCB+MiBwb2xscy9zZWMgZHVyaW5nIGFuIGFkIGJyZWFrLCBob2lzdGluZyB0aGUgVVJMCiAgICAgICAgLy8gcmV3cml0ZSBhbG9uZSBzYXZlcyB+MjAwIHJlZ2V4IGNvbXBpbGF0aW9ucyBwZXIgc2Vjb25kLgogICAgICAgIHNjb3BlLlR3aXRjaEFkVXJsUmV3cml0ZVJlZ2V4ID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVXJpQXR0cmlidXRlUmVnZXggPSAvVVJJPSIoW14iXSspIi87CiAgICAgICAgc2NvcGUuQ2xpZW50SUQgPSAna2ltbmU3OGt4M25jeDZicmdvNG12NndraTVoMWtvJzsKICAgICAgICBzY29wZS5CYWNrdXBQbGF5ZXJUeXBlcyA9IFsKICAgICAgICAgICAgLy8gT3JkZXIgbWF0dGVyczogZmlyc3QgY2xlYW4gdHlwZSB3aW5zLiAnZW1iZWQnIG1vdmVkIHRvIGVuZCDigJQgZmllbGQtb2JzZXJ2ZWQKICAgICAgICAgICAgLy8gVHdpdGNoIHJldHVybnMgR1FMICdzZXJ2ZXIgZXJyb3InIGZvciBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuIG9uIGVtYmVkIHdoZW4KICAgICAgICAgICAgLy8gcmVxdWVzdGVkIGZyb20gdHdpdGNoLnR2IG9yaWdpbiwgd2FzdGluZyB+MjAwLTQwMG1zIHBlciBicmVhayBhcyBmaXJzdC10cnkuCiAgICAgICAgICAgIC8vIEtlcHQgaW4gY2FzZSBpdCBldmVyIHN1Y2NlZWRzIG9uIHNvbWUgY2hhbm5lbC91c2VyIGNvbWJvLgogICAgICAgICAgICAnc2l0ZScsLy9Tb3VyY2UKICAgICAgICAgICAgJ3BvcG91dCcsLy9Tb3VyY2UKICAgICAgICAgICAgJ21vYmlsZV93ZWInLC8vTW9iaWxlCiAgICAgICAgICAgICdlbWJlZCcsLy9Tb3VyY2UgKHVucmVsaWFibGUg4oCUIHNlZSBub3RlIGFib3ZlKQogICAgICAgICAgICAvLyAnYXV0b3BsYXknICgzNjBwKSByZW1vdmVkOiB3aGVuIGNvbW1pdHRlZCBhcyBjeWNsZSBiYWNrdXAsIHRoZSBwbGF5ZXIgZ2V0cyBzdHVjawogICAgICAgICAgICAvLyBpbiBhbiBlbmRsZXNzIGxvYWRpbmcgY2lyY2xlIGFmdGVyIHRoZSBDU0FJLW9ubHkgcGF0aCByZWxlYXNlcyB0aGUgYmFja3VwIOKAlAogICAgICAgICAgICAvLyBhdXRvcGxheSB2YXJpYW50cyBkb24ndCB0cmFuc2l0aW9uIGNsZWFubHkgYmFjayB0byBtYWluIHN0cmVhbSB2YXJpYW50cy4KICAgICAgICAgICAgLy8ncGljdHVyZS1ieS1waWN0dXJlLUNBQ0hFRCcvLzM2MHAgKC1DQUNIRUQgaXMgYW4gaW50ZXJuYWwgc3VmZml4IGFuZCBpcyByZW1vdmVkKQogICAgICAgIF07CiAgICAgICAgc2NvcGUuRmFsbGJhY2tQbGF5ZXJUeXBlID0gJ3NpdGUnOy8vIHdhcyAnZW1iZWQnIOKAlCBzaXRlIGlzIG1vcmUgcmVsaWFibGUgd2hlbiBhbGwgU291cmNlIHR5cGVzIGVuZCB1cCBhZC1sYWRlbgogICAgICAgIHNjb3BlLkZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJ3BvcG91dCc7CiAgICAgICAgc2NvcGUuUHJlZmVyTG93UXVhbGl0eUJhY2t1cCA9IHRydWU7Ly8gSHlicmlkIHNhZmV0eSBuZXQgZm9yIFNTQUktaGVhdnkgYnJlYWtzOiBzdGlja3kgZXNjYXBlIGhhdGNoIChmaXJlcyBhZnRlciB+OHMgc3R1Y2sgaW4gYWxsLXN0cmlwcGVkIHN0YXRlKSArIGF1dG9wbGF5ICgzNjBwKSBhcyBsYXN0LXJlc29ydCBiYWNrdXAgd2hlbiBhbGwgU291cmNlIHR5cGVzIGFyZSBhZC1sYWRlbi4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX3ByZWZlckxvd1F1YWxpdHlCYWNrdXA9ZmFsc2UgdG8gZGlzYWJsZS4KICAgICAgICBzY29wZS5CYWNrdXBTd2FwRmlyc3QgPSB0cnVlOy8vIE9uIGFkIGRldGVjdCwgaW1tZWRpYXRlbHkgc3dhcCB0byBhIGJhY2t1cCBwbGF5ZXItdHlwZSBtM3U4IChUVFYtQUItc3R5bGUpLiBBdm9pZHMgTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkg4oCUIGZld2VyIGxvYWRpbmcgY2lyY2xlcyBpbiBmaWVsZC4gQ29zdDogZXh0cmEgZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhay4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX2JhY2t1cFN3YXBGaXJzdD1mYWxzZSB0byBkaXNhYmxlLgogICAgICAgIHNjb3BlLlNraXBQbGF5ZXJSZWxvYWRPbkhldmMgPSBmYWxzZTsvLyBJZiB0cnVlIHRoaXMgd2lsbCBza2lwIHBsYXllciByZWxvYWQgb24gc3RyZWFtcyB3aGljaCBoYXZlIDJrLzRrIHF1YWxpdHkgKGlmIHlvdSBlbmFibGUgdGhpcyBhbmQgeW91IHVzZSB0aGUgMmsvNGsgcXVhbGl0eSBzZXR0aW5nIHlvdSdsbCBnZXQgZXJyb3IgIzQwMDAgLyAjMzAwMCAvIHNwaW5uaW5nIHdoZWVsIG9uIGNocm9tZSBiYXNlZCBicm93c2VycykKICAgICAgICBzY29wZS5BbHdheXNSZWxvYWRQbGF5ZXJPbkFkID0gZmFsc2U7Ly8gQWx3YXlzIHBhdXNlL3BsYXkgd2hlbiBlbnRlcmluZy9sZWF2aW5nIGFkcwogICAgICAgIHNjb3BlLlJlbG9hZFBsYXllckFmdGVyQWQgPSB0cnVlOy8vIEFmdGVyIHRoZSBhZCBmaW5pc2hlcyBkbyBhIHBsYXllciByZWxvYWQgaW5zdGVhZCBvZiBwYXVzZS9wbGF5CiAgICAgICAgc2NvcGUuUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gMzA7Ly8gTWluaW11bSBzZWNvbmRzIGJldHdlZW4gcmVsb2FkcyDigJQgYnJlYWtzIENTQUkgY2FzY2FkZXMgdHJpZ2dlcmVkIGJ5IHJlbG9hZAogICAgICAgIHNjb3BlLkRpc2FibGVSZWxvYWRDYXAgPSBmYWxzZTsvLyBJZiB0cnVlLCBidWZmZXIgbW9uaXRvciByZWxvYWRzIHVubGltaXRlZCB0aW1lcyAocHJlLXY0NyBiZWhhdmlvciwgcmlzayBvZiBjYXNjYWRlKQogICAgICAgIHNjb3BlLkRyaWZ0Q29ycmVjdGlvblJhdGUgPSAxLjE7Ly8gUGxheWJhY2sgcmF0ZSBmb3IgY2F0Y2hpbmcgdXAgdG8gbGl2ZSBlZGdlIGFmdGVyIHJlbG9hZCAoMCA9IGRpc2FibGUgZHJpZnQgY29ycmVjdGlvbikKICAgICAgICBzY29wZS5FYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSA1Oy8vIE51bWJlciBvZiBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIHRyaWdnZXJpbmcgZWFybHkgcmVsb2FkIChlYWNoIHBvbGwgfjJzLCBzbyA1ID0gfjEwcywgMyA9IH42cywgMTAgPSB+MjBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gdHJ1ZTsvLyBSZW1lbWJlciB3aGljaCBiYWNrdXAgcGxheWVyIHR5cGUgd29ya2VkIGFuZCB0cnkgaXQgZmlyc3Qgb24gbmV4dCBhZCBicmVhawogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1RpbWUgPSAxNTAwOwogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1BsYXllckluZGV4ID0gMjsvL2F1dG9wbGF5CiAgICAgICAgc2NvcGUuSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3MgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHNjb3BlLlN0cmVhbUluZm9zQnlVcmwgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHNjb3BlLkdRTERldmljZUlEID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRWZXJzaW9uID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRTZXNzaW9uID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBudWxsOwogICAgICAgIHNjb3BlLkF1dGhvcml6YXRpb25IZWFkZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgc2NvcGUuU2ltdWxhdGVkQWRzRGVwdGggPSAwOwogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ0ZpeCA9IHRydWU7Ly8gSWYgdHJ1ZSB0aGlzIHdpbGwgcGF1c2UvcGxheSB0aGUgcGxheWVyIHdoZW4gaXQgZ2V0cyBzdHVjayBidWZmZXJpbmcKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEZWxheSA9IDYwMDsvLyBIb3cgb2Z0ZW4gc2hvdWxkIHdlIGNoZWNrIHRoZSBwbGF5ZXIgc3RhdGUgKGluIG1pbGxpc2Vjb25kcykKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdTYW1lU3RhdGVDb3VudCA9IDM7Ly8gSG93IG1hbnkgdGltZXMgb2Ygc2VlaW5nIHRoZSBzYW1lIHBsYXllciBzdGF0ZSB1bnRpbCB3ZSB0cmlnZ2VyIHBhdXNlL3BsYXkgKGl0IHdpbGwgb25seSB0cmlnZ2VyIGl0IG9uZSB0aW1lIHVudGlsIHRoZSBwbGF5ZXIgc3RhdGUgY2hhbmdlcyBhZ2FpbikKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEYW5nZXJab25lID0gMTsvLyBUaGUgYnVmZmVyaW5nIHRpbWUgbGVmdCAoaW4gc2Vjb25kcykgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBwbGF5ZXJzIHBsYXliYWNrIHBvc2l0aW9uIGluIHRoZSBwbGF5ZXIgc3RhdGUgY2hlY2sKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZCA9IGZhbHNlOy8vIElmIHRydWUgdGhpcyB3aWxsIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkgKHBsYXllciByZWxvYWRpbmcgaXMgYmV0dGVyIGF0IGZpeGluZyB0aGUgcGxheWJhY2sgaXNzdWVzIGJ1dCBpdCB0YWtlcyBzbGlnaHRseSBsb25nZXIpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgPSA4MDAwOy8vIE1pbmltdW0gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmV0d2VlbiBlYWNoIHBhdXNlL3BsYXkgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlciBwcmVzc2luZyBwYXVzZS9wbGF5IHdoZW4gdGhlcmUgYXJlIGdlbnVpbmUgYnVmZmVyaW5nIHByb2JsZW1zKQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgPSBmYWxzZTsvLyBFbmFibGUgdGhpcyBpZiB5b3UncmUgZ2V0dGluZyBhbiBpbW1lZGlhdGUgcGF1c2UvcGxheS9yZWxvYWQgYXMgeW91IG9wZW4gYSBzdHJlYW0gKHdoaWNoIGlzIGNhdXNpbmcgdGhlIHN0cmVhbSB0byB0YWtlIGxvbmdlciB0byBsb2FkKS4gT25lIHByb2JsZW0gd2l0aCB0aGlzIGJlaW5nIHRydWUgaXMgdGhhdCBpdCBjYW4gY2F1c2UgdGhlIHBsYXllciB0byBnZXQgc3R1Y2sgaW4gc29tZSBpbnN0YW5jZXMgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIHByZXNzIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQgPSA1Oy8vIEhvdyBmYXIgdGhlIHN0cmVhbSBuZWVkIHRvIG1vdmUgYmVmb3JlIGRvaW5nIHRoZSBidWZmZXJpbmcgbWl0aWdhdGlvbiAoZGVwZW5kcyBvbiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tFbmFibGVkIGJlaW5nIHRydWUpCiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb01heEFnZU1zID0gMzAgKiA2MCAqIDEwMDA7CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgaW4gc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVsZXRlIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBFbmNvZGluZ3NNM1U4OiBlbmNvZGluZ3NNM3U4LAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgICAgIFJlc29sdXRpb25MaXN0OiBbXSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIE1vZGlmaWVkTTNVODogbnVsbCwKICAgICAgICAgICAgSXNVc2luZ01vZGlmaWVkTTNVODogZmFsc2UsCiAgICAgICAgICAgIElzU2hvd2luZ0FkOiBmYWxzZSwKICAgICAgICAgICAgSXNNaWRyb2xsOiBmYWxzZSwKICAgICAgICAgICAgQWRCcmVha1N0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgUG9kTGVuZ3RoOiAxLAogICAgICAgICAgICBIYXNDb25maXJtZWRBZEF0dHJzOiBmYWxzZSwKICAgICAgICAgICAgQ2xlYW5QbGF5bGlzdENvdW50OiAwLAogICAgICAgICAgICBDb25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrczogMCwKICAgICAgICAgICAgQ3NhaU9ubHlUaGlzQnJlYWs6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIEZyZWV6ZVN0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBUb3RhbEFsbFN0cmlwcGVkUG9sbHM6IDAsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZU0zVTg6IG51bGwsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQ6IDAsCiAgICAgICAgICAgIEJhY2t1cEVuY29kaW5nc00zVThDYWNoZTogW10sCiAgICAgICAgICAgIEFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IG51bGwsCiAgICAgICAgICAgIFBpbm5lZEJhY2t1cFBsYXllclR5cGU6IG51bGwsCiAgICAgICAgICAgIExhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBGYWlsZWRCYWNrdXBQbGF5ZXJUeXBlczogbmV3IE1hcCgpLAogICAgICAgICAgICBMb2dnZWRCYWNrdXBBZHNCeVR5cGU6IG51bGwsCiAgICAgICAgICAgIEN5Y2xlUmVzY3VlZFRoaXNCcmVhazogZmFsc2UsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQ291bnQ6IDAsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQXRQb2xsOiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZFRyaWdnZXJlZDogZmFsc2UsCiAgICAgICAgICAgIEVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQ6IGZhbHNlLAogICAgICAgICAgICBFc2NhcGVIYXRjaEZpcmVkOiBmYWxzZSwKICAgICAgICAgICAgTGFzdFBsYXllclJlbG9hZDogMCwKICAgICAgICAgICAgUmVsb2FkVGltZXN0YW1wczogW10sCiAgICAgICAgICAgIEhhc0NoZWNrZWRVbmtub3duVGFnczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gbWFza0FzTmF0aXZlKGZuLCBuYW1lKSB7CiAgICAgICAgZm4udG9TdHJpbmcgPSAoKSA9PiAnZnVuY3Rpb24gJyArIG5hbWUgKyAnKCkgeyBbbmF0aXZlIGNvZGVdIH0nOwogICAgICAgIHJldHVybiBmbjsKICAgIH0KICAgIGNvbnN0IGxvZ2dlZENzYWlUeXBlcyA9IG5ldyBTZXQoKTsKICAgIGxldCBpc0FjdGl2ZWx5U3RyaXBwaW5nQWRzID0gZmFsc2U7CiAgICBsZXQgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IGZhbHNlOwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgbGV0IGNhY2hlZFJvb3ROb2RlID0gbnVsbDsvLyBDYWNoZWQgI3Jvb3QgRE9NIGVsZW1lbnQgKG5ldmVyIGNoYW5nZXMgaW4gUmVhY3QgU1BBcykKICAgIGxldCBjYWNoZWRQbGF5ZXJSb290RGl2ID0gbnVsbDsvLyBDYWNoZWQgLnZpZGVvLXBsYXllciBlbGVtZW50CiAgICAvLyBPbmUtc2hvdCBmbGFncyBmb3Igb3ZlcmxheS1oaWRlIGxvZ3MuIFR3aXRjaCdzIFJlYWN0IHRyZWUgcmUtbW91bnRzIFNEQQogICAgLy8gd3JhcHBlcnMgYW5kIGFkLWJyZWFrIGNhcmRzIGNvbnN0YW50bHkgZHVyaW5nIGFuIGFkIGJyZWFrLCBzbyB0aGUKICAgIC8vIGhpZGUtYW5kLWxvZyBmaXJlcyBodW5kcmVkcyBvZiB0aW1lcy4gTG9nIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKICAgIC8vIGhpZGUgdHlwZSBwZXIgcGFnZSBsb2FkLCB0aGVuIHN0YXkgc2lsZW50IOKAlCB0aGUgaGlkZSBpdHNlbGYgc3RpbGwgcnVucwogICAgLy8gb24gZXZlcnkgdGljayB2aWEgZGF0YXNldC1iYXNlZCBkZWR1cC4KICAgIGxldCBsb2dnZWRTZGFIaWRlID0gZmFsc2U7CiAgICAvLyBTdHJpbmdzIHVzZWQgdG8gZGV0ZWN0IGFuZCBoYW5kbGUgY29uZmxpY3RpbmcgVHdpdGNoIHdvcmtlciBvdmVycmlkZXMgKGUuZy4gVHdpdGNoTm9TdWIpCiAgICBjb25zdCB3b3JrZXJTdHJpbmdDb25mbGljdHMgPSBbCiAgICAgICAgJ3R3aXRjaCcsCiAgICAgICAgJ2lzVmFyaWFudEEnLy8gVHdpdGNoTm9TdWIKICAgIF07CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICAvLyBXYWxrIHRoZSBXb3JrZXIgcHJvdG90eXBlIGNoYWluIGFuZCByZW1vdmUgY29uZmxpY3Rpbmcgb3ZlcnJpZGVzCiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocGFyZW50LCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOwogICAgICAgICAgICBwYXJlbnQgPSByZWluc2VydFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVmFsaWRXb3JrZXIod29ya2VyKSB7CiAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gd29ya2VyLnRvU3RyaW5nKCk7CiAgICAgICAgY29uc3QgaGFzQ29uZmxpY3QgPSB3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBjb25zdCBoYXNSZWluc2VydCA9IHdvcmtlclN0cmluZ1JlaW5zZXJ0LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgaWYgKGhhc0NvbmZsaWN0ICYmICFoYXNSZWluc2VydCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgcmVqZWN0ZWQg4oCUIGNvbmZsaWN0IHN0cmluZyBmb3VuZDogJyArIHdvcmtlclN0cmluZ0NvbmZsaWN0cy5maWx0ZXIoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkuam9pbignLCAnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhaGFzQ29uZmxpY3QgfHwgaGFzUmVpbnNlcnQ7CiAgICB9CiAgICAvLyBSZXBsYWNlIHdpbmRvdy5Xb3JrZXIgdG8gaW50ZXJjZXB0IFR3aXRjaCdzIHZpZGVvIHdvcmtlciBhbmQgaW5qZWN0IGFkLWJsb2NraW5nIGxvZ2ljCiAgICBsZXQgaW5qZWN0ZWRCbG9iVXJsID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgLy8gUHJldmVudCBUd2l0Y2ggZnJvbSByZXZva2luZyBvdXIgaW5qZWN0ZWQgd29ya2VyIGJsb2IgVVJMCiAgICAgICAgaWYgKCFVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkKSB7CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gVVJMLnJldm9rZU9iamVjdFVSTDsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwgPT09IGluamVjdGVkQmxvYlVybCkgcmV0dXJuOwogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMLmNhbGwodGhpcywgdXJsKTsKICAgICAgICAgICAgfSwgJ3Jldm9rZU9iamVjdFVSTCcpOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVpbnNlcnQgPSBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod2luZG93Lldvcmtlcik7CiAgICAgICAgY29uc3QgY2xlYW5Xb3JrZXIgPSBnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIGNsZWFuV29ya2VyIHsKICAgICAgICAgICAgY29uc3RydWN0b3IodHdpdGNoQmxvYlVybCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgbGV0IGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gbmV3IFVSTCh0d2l0Y2hCbG9iVXJsKS5vcmlnaW4uZW5kc1dpdGgoJy50d2l0Y2gudHYnKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghaXNUd2l0Y2hXb3JrZXIpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBOb24tVHdpdGNoIHdvcmtlciBza2lwcGVkOiAnICsgdHdpdGNoQmxvYlVybCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUHJlLWNoZWNrOiB2ZXJpZnkgd2UgY2FuIGZldGNoIHRoZSB3b3JrZXIgSlMgYmVmb3JlIGluamVjdGluZwogICAgICAgICAgICAgICAgbGV0IHByZWZldGNoZWRXb3JrZXJKcyA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgeyBwcmVmZXRjaGVkV29ya2VySnMgPSBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghcHJlZmV0Y2hlZFdvcmtlckpzKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFpbGVkIHRvIGZldGNoIHdvcmtlciBKUyDigJQgZmFsbGluZyBiYWNrIHRvIHVubW9kaWZpZWQgd29ya2VyJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGludGVyY2VwdGVkIOKAlCBpbmplY3RpbmcgYWQtYmxvY2sgaG9va3MnKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ0ZldGNoUmVxdWVzdHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgJHtoYXNBZFRhZ3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldE1hdGNoZWRBZFNpZ25pZmllcnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3N0cmlwQWRTZWdtZW50cy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJvY2Vzc00zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2hvb2tXb3JrZXJGZXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7ZGVjbGFyZU9wdGlvbnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldEFjY2Vzc1Rva2VuLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtncWxSZXF1ZXN0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwYXJzZUF0dHJpYnV0ZXMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFdhc21Xb3JrZXJKcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U2VydmVyVGltZUZyb21NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtyZXBsYWNlU2VydmVyVGltZUluTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJ1bmVTdHJlYW1JbmZvcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Y3JlYXRlU3RyZWFtSW5mby50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IGdldFdhc21Xb3JrZXJKcygnJHt0d2l0Y2hCbG9iVXJsLnJlcGxhY2VBbGwoIiciLCAiJTI3Iil9Jyk7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZU9wdGlvbnMoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCA9IHNldEludGVydmFsKHBydW5lU3RyZWFtSW5mb3MsIDUgKiA2MCAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJHtSZWxvYWRQbGF5ZXJBZnRlckFkfTsKICAgICAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSAke1JlbG9hZENvb2xkb3duU2Vjb25kc307CiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9ICR7RGlzYWJsZVJlbG9hZENhcH07CiAgICAgICAgICAgICAgICAgICAgRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gJHtFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGR9OwogICAgICAgICAgICAgICAgICAgIFBpbkJhY2t1cFBsYXllclR5cGUgPSAke1BpbkJhY2t1cFBsYXllclR5cGV9OwogICAgICAgICAgICAgICAgICAgIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPSAke1ByZWZlckxvd1F1YWxpdHlCYWNrdXB9OwogICAgICAgICAgICAgICAgICAgIEJhY2t1cFN3YXBGaXJzdCA9ICR7QmFja3VwU3dhcEZpcnN0fTsKICAgICAgICAgICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9ICcke0ZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlfSc7CiAgICAgICAgICAgICAgICAgICAgR1FMRGV2aWNlSUQgPSAke0dRTERldmljZUlEID8gIiciICsgR1FMRGV2aWNlSUQgKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uSGVhZGVyID0gJHtBdXRob3JpemF0aW9uSGVhZGVyID8gIiciICsgQXV0aG9yaXphdGlvbkhlYWRlciArICInIiA6IHVuZGVmaW5lZH07CiAgICAgICAgICAgICAgICAgICAgQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gJHtDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAiJyIgKyBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gJHtDbGllbnRWZXJzaW9uID8gIiciICsgQ2xpZW50VmVyc2lvbiArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIENsaWVudFNlc3Npb24gPSAke0NsaWVudFNlc3Npb24gPyAiJyIgKyBDbGllbnRTZXNzaW9uICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50VmVyc2lvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFZlcnNpb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50U2Vzc2lvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFNlc3Npb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50SWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJRCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVEZXZpY2VJZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdGZXRjaFJlc3BvbnNlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXNwb25zZURhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIHRpbWVvdXRJZCB9ID0gcGVuZGluZ0ZldGNoUmVxdWVzdHMuZ2V0KHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHJlc3BvbnNlRGF0YS5lcnJvcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSByZXNwb25zZSBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IHRha2VzIHN0YXR1cy9zdGF0dXNUZXh0L2hlYWRlcnMg4oCUIHVybC9yZWRpcmVjdGVkL3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZS4gSVZTIFdBU00gdmFsaWRhdGVzIHRoZXNlIChTcGFkZS90cmFja2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cykgYW5kIHRocm93cyBOZXR3b3JrRXJyb3IgaWYgdGhleSdyZSBtaXNzaW5nIOKAlCBUVFYtQUIgdjYuMy41IGZpeC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VEYXRhLmJvZHksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VEYXRhLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlRGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VEYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICd1cmwnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudXJsIHx8ICcnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICdyZWRpcmVjdGVkJywgeyB2YWx1ZTogISFyZXNwb25zZURhdGEucmVkaXJlY3RlZCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlRGF0YS50eXBlIHx8ICdiYXNpYycsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVHJpZ2dlcmVkUGxheWVyUmVsb2FkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdTaW11bGF0ZUFkcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRlZEFkc0RlcHRoID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpbXVsYXRlZEFkc0RlcHRoOiAnICsgU2ltdWxhdGVkQWRzRGVwdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyA9ICFBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOiAnICsgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGhvb2tXb3JrZXJGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgIGV2YWwod29ya2VyU3RyaW5nKTsKICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICAgICAgICBpbmplY3RlZEJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuZXdCbG9iU3RyXSkpOwogICAgICAgICAgICAgICAgc3VwZXIoaW5qZWN0ZWRCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUFkQmxvY2tCYW5uZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXIoZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgYmFja3VwIHN0cmVhbSBzd2l0Y2hlcyAoc3RhcnQgYW5kIGVuZCBvZiBhZCBicmVhaykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5oYXNBZHMgIT09ICEhcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QmFja3VwU3dpdGNoQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgcG9zaXRpb24gdHJhY2tpbmcgb24gYWQtZW5kIHNvIHRoZSBzdHJlYW0gc3dpdGNoIGdhcCBpc24ndCBkZXRlY3RlZCBhcyBhIGp1bXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5kYXRhLmhhc0FkcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pbkFkQnJlYWsgPSAhIWUuZGF0YS5oYXNBZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGRyaWZ0IGNhdGNoLXVwIHdoZW4gYWRzIHN0YXJ0IOKAlCBkb24ndCBydW4gMS4xeCBkdXJpbmcgYWQgaGFuZGxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5oYXNBZHMgJiYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsIHx8IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKS5wbGF5YmFja1JhdGUgPSAxLjA7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUGF1c2VSZXN1bWVQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdSZWxvYWRQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgZS5kYXRhLmtpbmQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYXN5bmMgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmtleSA9PSAnRmV0Y2hSZXF1ZXN0JykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFJlcXVlc3QgPSBldmVudC5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCBoYW5kbGVXb3JrZXJGZXRjaFJlcXVlc3QoZmV0Y2hSZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlc3BvbnNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZURhdGEKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBXb3JrZXIgY3Jhc2ggcmVjb3Zlcnkg4oCUIElWUyBXQVNNIHdvcmtlciBjYW4gZmlyZSBSdW50aW1lRXJyb3IKICAgICAgICAgICAgICAgIC8vIChlLmcuICJpbmRleCBvdXQgb2YgYm91bmRzIikgYW5kIGRpZS4gQSBzaW5nbGUgY3Jhc2ggZmlyZXMgbXVsdGlwbGUKICAgICAgICAgICAgICAgIC8vIGVycm9yIGV2ZW50czsgZGVkdXBlIHZpYSBhIGxvY2FsIGZsYWcuIE9uIGZpcnN0IGVycm9yLCB0cmlnZ2VyIGEKICAgICAgICAgICAgICAgIC8vIGhhcmQgcmVsb2FkIHZpYSB0aGUgbWFpbiByZWxvYWQgcGF0aCDigJQgVHdpdGNoIHJlLXNwYXducyB0aGUgd29ya2VyCiAgICAgICAgICAgICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBuZXcgcGxheWVyIGluc3RhbmNlLCBhbmQgZXhpc3RpbmcgcmVsb2FkIGNvb2xkb3duCiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50cyBydW5hd2F5IHJlc3RhcnQgbG9vcHMuCiAgICAgICAgICAgICAgICBsZXQgY3Jhc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyYXNoZWQpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBJVlMgV0FTTSB3b3JrZXIgY3Jhc2hlZDogJyArICgoZSAmJiBlLm1lc3NhZ2UpIHx8ICd1bmtub3duIGVycm9yJykgKyAnIOKAlCB0cmlnZ2VyaW5nIGhhcmQgcmVsb2FkIHRvIHJlY292ZXInKTsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUsICdlYXJseScpOyB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGNyYXNoIHJlY292ZXJ5IGZhaWxlZDogJyArIGVyci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbGV0IHdvcmtlckluc3RhbmNlID0gcmVpbnNlcnRXb3JrZXJzKG5ld1dvcmtlciwgcmVpbnNlcnQpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdXb3JrZXInLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VySW5zdGFuY2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkV29ya2VyKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdvcmtlckluc3RhbmNlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIHNldCB0d2l0Y2ggd29ya2VyIGRlbmllZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCkgewogICAgICAgIGlmICghZ2V0V2FzbVdvcmtlckpzLmNhY2hlKSB7CiAgICAgICAgICAgIGdldFdhc21Xb3JrZXJKcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0pIHsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc21Xb3JrZXJKcy5jYWNoZVt0d2l0Y2hCbG9iVXJsXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICBjb25zdCB0ZXh0ID0gcmVxLnJlc3BvbnNlVGV4dDsKICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0gPSB0ZXh0OwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgLy8gSG9vayBmZXRjaCgpIGluIHRoZSB3b3JrZXIgc2NvcGUgdG8gaW50ZXJjZXB0IG0zdTggcGxheWxpc3QgcmVxdWVzdHMgYW5kIGFkIHNlZ21lbnRzCiAgICBmdW5jdGlvbiBob29rV29ya2VyRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2hvb2tXb3JrZXJGZXRjaCAodmFmdCknKTsKICAgICAgICBjb25zdCBCTEFOS19NUDQgPSBuZXcgQmxvYihbVWludDhBcnJheS5mcm9tKGF0b2IoJ0FBQUFLR1owZVhCdGNEUXlBQUFBQVdsemIyMXRjRFF5WkdGemFHRjJZekZwYzI4MmFHeHpaZ0FBQkVsdGIyOTJBQUFBYkcxMmFHUUFBQUFBQUFBQUFBQUFBQUFBQVlhZ0FBQUFBQUFCQUFBQkFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUFCcUhSeVlXc0FBQUJjZEd0b1pBQUFBQU1BQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQVVSdFpHbGhBQUFBSUcxa2FHUUFBQUFBQUFBQUFBQUFBQUFBQUx1QUFBQUFBRlhFQUFBQUFBQXRhR1JzY2dBQUFBQUFBQUFBYzI5MWJnQUFBQUFBQUFBQUFBQUFBRk52ZFc1a1NHRnVaR3hsY2dBQUFBRHZiV2x1WmdBQUFCQnpiV2hrQUFBQUFBQUFBQUFBQUFBa1pHbHVaZ0FBQUJ4a2NtVm1BQUFBQUFBQUFBRUFBQUFNZFhKc0lBQUFBQUVBQUFDemMzUmliQUFBQUdkemRITmtBQUFBQUFBQUFBRUFBQUJYYlhBMFlRQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFnQVFBQUFBQUx1QUFBQUFBQUF6WlhOa2N3QUFBQUFEZ0lDQUlnQUJBQVNBZ0lBVVFCVUFBQUFBQUFBQUFBQUFBQVdBZ0lBQ0VaQUdnSUNBQVFJQUFBQVFjM1IwY3dBQUFBQUFBQUFBQUFBQUVITjBjMk1BQUFBQUFBQUFBQUFBQUJSemRITjZBQUFBQUFBQUFBQUFBQUFBQUFBQUVITjBZMjhBQUFBQUFBQUFBQUFBQWVWMGNtRnJBQUFBWEhScmFHUUFBQUFEQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQW9BQUFBRm9BQUFBQUFHQmJXUnBZUUFBQUNCdFpHaGtBQUFBQUFBQUFBQUFBQUFBQUE5Q1FBQUFBQUJWeEFBQUFBQUFMV2hrYkhJQUFBQUFBQUFBQUhacFpHVUFBQUFBQUFBQUFBQUFBQUJXYVdSbGIwaGhibVJzWlhJQUFBQUJMRzFwYm1ZQUFBQVVkbTFvWkFBQUFBRUFBQUFBQUFBQUFBQUFBQ1JrYVc1bUFBQUFIR1J5WldZQUFBQUFBQUFBQVFBQUFBeDFjbXdnQUFBQUFRQUFBT3h6ZEdKc0FBQUFvSE4wYzJRQUFBQUFBQUFBQVFBQUFKQmhkbU14QUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0FCYUFCSUFBQUFTQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdQLy9BQUFBT21GMlkwTUJUVUFlLytFQUkyZE5RQjZXVW9GQVgvTGdMVUJBUUZBQUFENkFBQTZtRGdBQUhvUUFBOUNXN3k0S0FRQUVhT3VQSUFBQUFCQnpkSFJ6QUFBQUFBQUFBQUFBQUFBUWMzUnpZd0FBQUFBQUFBQUFBQUFBRkhOMGMzb0FBQUFBQUFBQUFBQUFBQUFBQUFBUWMzUmpid0FBQUFBQUFBQUFBQUFBU0cxMlpYZ0FBQUFnZEhKbGVBQUFBQUFBQUFBQkFBQUFBUUFBQUM0QUFBQUFBb0FBQUFBQUFDQjBjbVY0QUFBQUFBQUFBQUlBQUFBQkFBQ0NOUUFBQUFBQ1FBQUEnKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpXSwge3R5cGU6ICd2aWRlby9tcDQnfSk7CiAgICAgICAgY29uc3QgcmVhbEZldGNoID0gZmV0Y2g7CiAgICAgICAgZmV0Y2ggPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuaGFzKHVybCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEJMQU5LX01QNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgnbTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSBhc3luYyBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYXdhaXQgcHJvY2Vzc00zVTgodXJsLCBhd2FpdCByZXNwb25zZS50ZXh0KCksIHJlYWxGZXRjaCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcnNlZFVybC5wYXRobmFtZS5tYXRjaCgvKFteXC9dKykoPz1cLlx3KyQpLyk/LlswXTsKICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ3BhcmVudF9kb21haW5zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlZFVybC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyVGltZSA9IGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCAhPSBudWxsICYmIChhd2FpdCByZWFsRmV0Y2goc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Lm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF0pKS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGVuY29kaW5ncyBhcmUgZGVhZCAodGhlIHN0cmVhbSBwcm9iYWJseSByZXN0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHJlbG9hZC1wZW5kaW5nIGZsYWcgZnJvbSBhIHByaW9yIHN0cmVhbSBzZXNzaW9uIOKAlCB3aXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVsb2FkIHRyaWdnZXJlZCBvbiB0aGUgcHJldmlvdXMgY2hhbm5lbCBibGVlZHMgaW50byB0aGUgbmV3IGNoYW5uZWwncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29sZG93biBjYWxjdWxhdGlvbiwgYmxvY2tpbmcgbGVnaXRpbWF0ZSBlbmQtb2YtYnJlYWsgcmVsb2Fkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5ldyBzdHJlYW0gc2Vzc2lvbiDigJQgY2hhbm5lbDogJyArIGNoYW5uZWxOYW1lICsgJywgQVBJOiAnICsgKFYyQVBJID8gJ3YyJyA6ICd2MScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdID0gc3RyZWFtSW5mbyA9IGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHBhcnNlZFVybC5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBsaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmF0ZTogYXR0cmlidXRlc1snRlJBTUUtUkFURSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNzOiBhdHRyaWJ1dGVzWydDT0RFQ1MnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVybDogbGluZXNbaSArIDFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJsc1tsaW5lc1tpICsgMV1dID0gcmVzb2x1dGlvbkluZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QucHVzaChyZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zQnlVcmxbbGluZXNbaSArIDFdXSA9IHN0cmVhbUluZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBObyByZXNvbHV0aW9ucyBwYXJzZWQgZnJvbSBlbmNvZGluZ3MgbTN1OCDigJQgVHdpdGNoIG1heSBoYXZlIGNoYW5nZWQgdGhlIGZvcm1hdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vbkhldmNSZXNvbHV0aW9uTGlzdCA9IHN0cmVhbUluZm8uUmVzb2x1dGlvbkxpc3QuZmlsdGVyKChlbGVtZW50KSA9PiBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdhdmMnKSB8fCBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdhdjAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHdheXNSZWxvYWRQbGF5ZXJPbkFkIHx8IChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCAmJiBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LnNvbWUoKGVsZW1lbnQpID0+IGVsZW1lbnQuQ29kZWNzLnN0YXJ0c1dpdGgoJ2hldicpIHx8IGVsZW1lbnQuQ29kZWNzLnN0YXJ0c1dpdGgoJ2h2YycpKSAmJiAhU2tpcFBsYXllclJlbG9hZE9uSGV2YykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXS5zdWJzdHJpbmcobGluZXNbaV0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkUmVzb2x1dGlvbiA9IHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gb2xkUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEFyZWEgPSB0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UmVzb2x1dGlvbkluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZXN0RGlmZiA9IEluZmluaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vbkhldmNSZXNvbHV0aW9uTGlzdFtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3N0cmVhbVdpZHRoLCBzdHJlYW1IZWlnaHRdID0gY2FuZGlkYXRlLlJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKChzdHJlYW1XaWR0aCAqIHN0cmVhbUhlaWdodCkgLSB0YXJnZXRBcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpZmYgPSBkaWZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVzb2x1dGlvbkluZm8gPSBjYW5kaWRhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZGlmaWVkTTNVOCBzd2FwICcgKyByZXNTZXR0aW5nc1tjb2RlY3NLZXldICsgJyB0byAnICsgbmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzICsgJyBvbGRSZXM6JyArIG9sZFJlc29sdXRpb24gKyAnIG5ld1JlczonICsgbmV3UmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzfSJgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpICsgMV0gPSBuZXdSZXNvbHV0aW9uSW5mby5VcmwgKyAnICcucmVwZWF0KGkgKyAxKTsvLyBUaGUgc3RyZWFtIGRvZXNuJ3QgbG9hZCB1bmxlc3MgZWFjaCB1cmwgbGluZSBpcyB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCB8fCBBbHdheXNSZWxvYWRQbGF5ZXJPbkFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggPSBsaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZG8gTk9UIHNldCBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgaGVyZS4gSXQgd2FzIHByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdW5jb25kaXRpb25hbGx5IG9uIG5ldyBzdHJlYW0gc2Vzc2lvbiBjcmVhdGlvbiwgd2hpY2ggY2F1c2VkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVuZC1vZi1icmVhayByZWxvYWQgb2YgZXZlcnkgbmV3IGNoYW5uZWwgdG8gYmUgYmxvY2tlZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb2xkb3duIOKAlCB0aGUgY29vbGRvd24gY2hlY2sgdHJlYXRlZCB0aGUgc2Vzc2lvbi1jcmVhdGlvbiB0aW1lc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHJlY2VudCByZWxvYWQsIGV2ZW4gdGhvdWdoIG5vIHJlbG9hZCBoYWQgYWN0dWFsbHkgb2NjdXJyZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID8gc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggOiBzdHJlYW1JbmZvLkVuY29kaW5nc00zVTgsIHNlcnZlclRpbWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXIocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC8jRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKFteIl0rKSIvKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAxID8gbWF0Y2hlc1sxXSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC9TRVJWRVItVElNRT0iKFswLTkuXSspIi8pOwogICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gcmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoZW5jb2RpbmdzTTN1OCwgbmV3U2VydmVyVGltZSkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKCNFWFQtWC1TRVNTSU9OLURBVEE6REFUQS1JRD0iU0VSVkVSLVRJTUUiLFZBTFVFPSIpW14iXSsoIikvLCBgJDEke25ld1NlcnZlclRpbWV9JDJgKSA6IGVuY29kaW5nc00zdTg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTZXJ2ZXJUaW1lID8gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKC8oU0VSVkVSLVRJTUU9IilbMC05Ll0rIi8sIGBTRVJWRVItVElNRT0iJHtuZXdTZXJ2ZXJUaW1lfSJgKSA6IGVuY29kaW5nc00zdTg7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBZFNpZ25pZmllcnMuc29tZSgocykgPT4gdGV4dFN0ci5pbmNsdWRlcyhzKSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpIHsKICAgICAgICByZXR1cm4gQWRTaWduaWZpZXJzLmZpbHRlcigocykgPT4gdGV4dFN0ci5pbmNsdWRlcyhzKSk7CiAgICB9CiAgICAvLyBSZW1vdmUgYWQgc2VnbWVudHMgZnJvbSBhbiBtM3U4IHBsYXlsaXN0IGFuZCBjYWNoZSB0aGVpciBVUkxzIGZvciByZXBsYWNlbWVudAogICAgZnVuY3Rpb24gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIHN0cmlwQWxsU2VnbWVudHMsIHN0cmVhbUluZm8pIHsKICAgICAgICBsZXQgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgbGV0IGluQ3VlT3V0ID0gZmFsc2U7CiAgICAgICAgY29uc3QgbGl2ZVNlZ21lbnRzID0gW107CiAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgIGNvbnN0IG5ld0FkVXJsID0gJ2h0dHBzOi8vdHdpdGNoLnR2JzsKICAgICAgICAvLyBMb2cgYWQgdHJhY2tpbmcgYXR0cmlidXRlIG5hbWVzIG9uY2UgcGVyIHN0cmVhbSAoaGVscHMgaWRlbnRpZnkgbmV3IGJlYWNvbnMpCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcykgewogICAgICAgICAgICBjb25zdCBhZEF0dHJzID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQURbQS1aLV0qKD89PSIpL2cpOwogICAgICAgICAgICBpZiAoYWRBdHRycyAmJiBhZEF0dHJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkQWRBdHRyaWJ1dGVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHRyYWNraW5nIGF0dHJpYnV0ZXMgc2VlbjogJyArIFsuLi5uZXcgU2V0KGFkQXR0cnMpXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2cgcG90ZW50aWFsIGFkIG1hcmtlcnMgdGhhdCBhcmVuJ3QgaW4gQWRTaWduaWZpZXJzIChjYW5kaWRhdGVzIGZvciBmdXR1cmUgaW5jbHVzaW9uKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycykgewogICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gbmV3IFNldCgpOwogICAgICAgICAgICBsZXQgc207CiAgICAgICAgICAgIGNvbnN0IGNsYXNzUmUgPSAvRVhULVgtREFURVJBTkdFOlteXG5dKkNMQVNTPSIodHdpdGNoLVteIl0rKSIvZzsKICAgICAgICAgICAgd2hpbGUgKChzbSA9IGNsYXNzUmUuZXhlYyh0ZXh0U3RyKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKCdFWFQtWC1EQVRFUkFOR0U6Q0xBU1M9IicgKyBzbVsxXSArICciJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdGFnUmUgPSAvKFNDVEUzNS1bQS1aLV0rfEVYVC1YLUNVRS1bQS1aLV0rKS9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gdGFnUmUuZXhlYyh0ZXh0U3RyKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKHNtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTdWJzdHJpbmcgY2hlY2sgKG5vdCBleGFjdCk6IGEgY2FuZGlkYXRlIGlzICJrbm93biIgaWYgYW55IEFkU2lnbmlmaWVyCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4gIUFkU2lnbmlmaWVycy5zb21lKHMgPT4gYy5pbmNsdWRlcyhzKSkpOwogICAgICAgICAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBvdGVudGlhbCBhZCBtYXJrZXJzIHNlZW4gYnV0IG5vdCBpbiBBZFNpZ25pZmllcnM6ICcgKyB1bmtub3duLmpvaW4oJywgJykgKyAnIChjYW5kaWRhdGVzIGZvciBmdXR1cmUgaW5jbHVzaW9uKScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgLy8gVHJhY2sgU0NURS0zNSBDVUUtT1VUL0NVRS1JTiBhZCBib3VuZGFyaWVzCiAgICAgICAgICAgIGlmIChsaW5lLmluY2x1ZGVzKCdFWFQtWC1DVUUtT1VUJykpIHsKICAgICAgICAgICAgICAgIGlmICghaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1PVVQg4oCUIGFkIGJvdW5kYXJ5IGVudGVyZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluQ3VlT3V0ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCdFWFQtWC1DVUUtSU4nKSkgewogICAgICAgICAgICAgICAgaWYgKGluQ3VlT3V0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU0NURS0zNSBDVUUtSU4g4oCUIGFkIGJvdW5kYXJ5IGV4aXRlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZW1vdmUgdHJhY2tpbmcgdXJscyB3aGljaCBhcHBlYXIgaW4gdGhlIG92ZXJsYXkgVUkKICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lLnJlcGxhY2VBbGwoVHdpdGNoQWRVcmxSZXdyaXRlUmVnZXgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgY29uc3QgaXNMaXZlU2VnbWVudCA9IGxpbmUuaW5jbHVkZXMoJyxsaXZlJyk7CiAgICAgICAgICAgIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAoIWlzTGl2ZVNlZ21lbnQgfHwgc3RyaXBBbGxTZWdtZW50cyB8fCBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgfHwgaW5DdWVPdXQpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50VXJsID0gbGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgaWYgKCFBZFNlZ21lbnRDYWNoZS5oYXMoc2VnbWVudFVybCkpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KHNlZ21lbnRVcmwsIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBBZFNlZ21lbnRVUkxQYXR0ZXJucy5zb21lKChwKSA9PiBsaW5lc1tpICsgMV0uaW5jbHVkZXMocCkpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBzZWdtZW50IGRldGVjdGVkIHZpYSBVUkwgcGF0dGVybjogJyArIGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQobGluZXNbaSArIDFdLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cysrOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIGlzTGl2ZVNlZ21lbnQpIHsKICAgICAgICAgICAgICAgIGxpdmVTZWdtZW50cy5wdXNoKHsgZXh0aW5mOiBsaW5lLCB1cmw6IGxpbmVzW2kgKyAxXSB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFQtWC1QQVJUOicpKSB7CiAgICAgICAgICAgICAgICAvLyBMTC1ITFMgcGFydDogVVJJIGlzIGlubGluZSBhcyBhbiBhdHRyaWJ1dGUuIFN0cmlwIGlmIGl0IG1hdGNoZXMgYSBrbm93bgogICAgICAgICAgICAgICAgLy8gYWQgVVJMIChhbHJlYWR5IGluIGNhY2hlIGZyb20gYSBwYXJhbGxlbCBFWFRJTkYgc3RyaXAsIG9yIG1hdGNoZXMgYSBVUkwgcGF0dGVybikuCiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIHRoZSBwbGF5ZXIgbWF5IHVzZSB0aGUgcGFydHMgcGF0aCB0byBmZXRjaCBhZCBtZWRpYSB2aWEgbG93LWxhdGVuY3kuCiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpTWF0Y2ggPSBsaW5lLm1hdGNoKFVyaUF0dHJpYnV0ZVJlZ2V4KTsKICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmkgPSBwYXJ0VXJpTWF0Y2ggPyBwYXJ0VXJpTWF0Y2hbMV0gOiAnJzsKICAgICAgICAgICAgICAgIGlmIChwYXJ0VXJpICYmIChBZFNlZ21lbnRDYWNoZS5oYXMocGFydFVyaSkgfHwgQWRTZWdtZW50VVJMUGF0dGVybnMuc29tZSgocCkgPT4gcGFydFVyaS5pbmNsdWRlcyhwKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KHBhcnRVcmksIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6JykgfHwgbGluZS5zdGFydHNXaXRoKCcjRVhULVgtUFJFTE9BRC1ISU5UOicpKSB7CiAgICAgICAgICAgICAgICAvLyBMTC1ITFMgcHJlZmV0Y2gvcHJlbG9hZCBoaW50cyBjYW4gcG9pbnQgYXQgdXBjb21pbmcgYWQgc2VnbWVudHMgYmVmb3JlIGFueQogICAgICAgICAgICAgICAgLy8gRVhUSU5GIGxpbmUgb3IgYWQgc2lnbmlmaWVyIGhhcyBtYXRlcmlhbGl6ZWQgaW4gdGhlIHBsYXlsaXN0LiBJZiB3ZSBvbmx5CiAgICAgICAgICAgICAgICAvLyBzdHJpcCBwcmVmZXRjaCBoaW50cyBBRlRFUiBoYXNTdHJpcHBlZEFkU2VnbWVudHMgaXMgc2V0LCB0aGUgZmlyc3QgcG9sbCBvZgogICAgICAgICAgICAgICAgLy8gYW4gYWQgYnJlYWsgY2FuIGxlYWsgYSBwcmVmZXRjaCBoaW50IHBvaW50aW5nIGF0IGFuIGFkIFVSTCDigJQgdGhlIHBsYXllcgogICAgICAgICAgICAgICAgLy8gdGhlbiBwcmUtZmV0Y2hlcyBhZCBtZWRpYSB2aWEgdGhlIExMLUhMUyBwYXRoIGJlZm9yZSBvdXIgdXN1YWwgc3RyaXAgY2F0Y2hlcwogICAgICAgICAgICAgICAgLy8gdXAsIHByb2R1Y2luZyBhbiBhZCBmbGFzaC4gRGV0ZWN0IHRoZSBhZCBVUkwgaGVyZSBzbyBoYXNTdHJpcHBlZEFkU2VnbWVudHMKICAgICAgICAgICAgICAgIC8vIGZsaXBzIG9uIHRoZSBmaXJzdCBwb2xsIGFuZCB0aGUgcG9zdC1sb29wIHVuY29uZGl0aW9uYWwgcHJlZmV0Y2ggc3RyaXAgZmlyZXMuCiAgICAgICAgICAgICAgICAvLyBQb3J0ZWQgZnJvbSBUVFYtQUIgNTJiNDFiNC4KICAgICAgICAgICAgICAgIC8vIEZvcm1hdDogJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6aHR0cHM6Ly91cmwvaGVyZS50cycgKHJhdyBVUkwgYWZ0ZXIgdGhlIGNvbG9uKQogICAgICAgICAgICAgICAgLy8gICAgIG9yOiAnI0VYVC1YLVBSRUxPQUQtSElOVDpUWVBFPVBBUlQsVVJJPSJ1cmwiJyAoVVJJIGF0dHJpYnV0ZSkKICAgICAgICAgICAgICAgIGxldCBoaW50VXJsID0gJyc7CiAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpKSB7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGxpbmUuc3Vic3RyaW5nKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicubGVuZ3RoKS50cmltKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpbnRNYXRjaCA9IGxpbmUubWF0Y2goL1VSST0iKFteIl0rKSIvKTsKICAgICAgICAgICAgICAgICAgICBoaW50VXJsID0gaGludE1hdGNoID8gaGludE1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGludFVybCAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKGhpbnRVcmwpIHx8IEFkU2VnbWVudFVSTFBhdHRlcm5zLnNvbWUoKHApID0+IGhpbnRVcmwuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChoaW50VXJsLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIE1vdmVkIG91dCBvZiB0aGUgcGVyLWxpbmUgbG9vcDogYSBwZXItbGluZSBzY2FuIGZvciBhbnkgc2lnbmlmaWVyIGlzCiAgICAgICAgLy8gc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgZnVsbC10ZXh0IHNjYW4sIHNpbmNlIHRoZSBjaGVjayBoYXMKICAgICAgICAvLyBubyBsaW5lLWxldmVsIHN0YXRlIOKAlCBpdCBqdXN0IGZsaXBzIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWUgb24gZmlyc3QKICAgICAgICAvLyBtYXRjaC4gT25lIHNjYW4gaW5zdGVhZCBvZiBOX2xpbmVzICogTl9zaWduaWZpZXJzIHNjYW5zICh+MTAweCBmZXdlcgogICAgICAgIC8vIGluY2x1ZGVzKCkgY2FsbHMgb24gYSB0eXBpY2FsIDEwMC1saW5lIG0zdTgpLgogICAgICAgIGlmICghaGFzU3RyaXBwZWRBZFNlZ21lbnRzICYmIEFkU2lnbmlmaWVycy5zb21lKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKSkgewogICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoaGFzU3RyaXBwZWRBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIE5vIGxvdyBsYXRlbmN5IGR1cmluZyBhZHMgKG90aGVyd2lzZSBpdCdzIHBvc3NpYmxlIGZvciB0aGUgcGxheWVyIHRvIHByZWZldGNoIGFuZCBkaXNwbGF5IGFkIHNlZ21lbnRzKQogICAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1UV0lUQ0gtUFJFRkVUQ0g6JykgfHwgbGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9IDA7CiAgICAgICAgfQogICAgICAgIC8vIENhY2hlIGxpdmUgc2VnbWVudHMgZm9yIHJlY292ZXJ5IChwbHVzIHRoZSBNRURJQS1TRVFVRU5DRSBvZiB0aGUgb2xkZXN0IGNhY2hlZCBzZWdtZW50LAogICAgICAgIC8vIHNvIHRoZSBwbGF5ZXIgYWNjZXB0cyBpbmplY3RlZCByZWNvdmVyeSBzZWdtZW50cyBhcyB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtKQogICAgICAgIGlmIChsaXZlU2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMgPSBsaXZlU2VnbWVudHMuc2xpY2UoLTYpOwogICAgICAgICAgICBjb25zdCBzZXEgPSBwYXJzZUludCgodGV4dFN0ci5tYXRjaCgvI0VYVC1YLU1FRElBLVNFUVVFTkNFOihcZCspLykgfHwgW10pWzFdKTsKICAgICAgICAgICAgaWYgKCFpc05hTihzZXEpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXEgPSBzZXEgKyBNYXRoLm1heCgwLCBsaXZlU2VnbWVudHMubGVuZ3RoIC0gc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSWYgYWxsIHNlZ21lbnRzIHdlcmUgc3RyaXBwZWQsIHRyeSB0byBwcmV2ZW50IGJsYWNrIHNjcmVlbiB2aWEgcmVjb3ZlcnkgY29udGVudC4KICAgICAgICAvLyBQcmVmZXIgdGhlIGZ1bGwtcGxheWxpc3Qgc25hcHNob3QgZnJvbSBhIHJlY2VudCBub24tYWQgcG9sbCAobWlycm9ycyBUVFYtQUIKICAgICAgICAvLyBMYXN0Q2xlYW5OYXRpdmVNM1U4IGFwcHJvYWNoKSDigJQgZ2l2ZXMgdGhlIHBsYXllciA0LTYgbGl2ZSBzZWdtZW50cyB3b3J0aCBvZgogICAgICAgIC8vIGNvbnRlbnQgdnMgdGhlIHRoaW4gcGVyLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUuIEZhbGxzIGJhY2sgdG8gdGhlIHBlci1zZWdtZW50CiAgICAgICAgLy8gY2FjaGUgaWYgdGhlIHNuYXBzaG90IGlzIHN0YWxlIG9yIG1pc3NpbmcuCiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApICsgMTsKICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgKyAxOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0KSBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIC8vIFByaW1hcnk6IGZyZXNoIGZ1bGwtcGxheWxpc3Qgc25hcHNob3QgKDwgMS41cyBvbGQsIG11c3Qgbm90IGl0c2VsZiBjb250YWluIGFkIG1hcmtlcnMpCiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90QWdlID0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0ID8gKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQpIDogSW5maW5pdHk7CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggJiYgc25hcHNob3RBZ2UgPD0gMTUwMCAmJiAhaGFzQWRUYWdzKHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcmV1c2luZyBsYXN0IGNsZWFuIG5hdGl2ZSBwbGF5bGlzdCAoJyArIHNuYXBzaG90QWdlICsgJ21zIG9sZCknKTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gaGFzU3RyaXBwZWRBZFNlZ21lbnRzOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVODsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGYWxsYmFjazogcGVyLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUgKGV4aXN0aW5nIGJlaGF2aW9yKQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzICYmIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJlc3RvcmluZyAnICsgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCArICcgcmVjb3Zlcnkgc2VnbWVudHMnKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXEgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbal0gPSAnI0VYVC1YLU1FRElBLVNFUVVFTkNFOicgKyBzdHJlYW1JbmZvLlJlY292ZXJ5U3RhcnRTZXE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0uZXh0aW5mKTsKICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50c1tqXS51cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChsaXZlU2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAvLyBSZXNldCBmcmVlemUgY291bnRlciB3aGVuIGxpdmUgc2VnbWVudHMgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gaGFzU3RyaXBwZWRBZFNlZ21lbnRzOwogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgLy8gVGhyb3R0bGUgY2FjaGUgcHJ1bmUgdG8gb25jZSBwZXIgNjBzLiBUaGUgMTIwcyBUVEwgZ2l2ZXMgcGxlbnR5IG9mIGhlYWRyb29tCiAgICAgICAgLy8gYW5kIHNjYW5uaW5nIHRoZSBmdWxsIGNhY2hlIG9uIGV2ZXJ5IG0zdTggcG9sbCBhZGRzIHVwIGR1cmluZyBoZWF2eSBhZCBicmVhawogICAgICAgIC8vIHNlcXVlbmNlcyAoTEwtSExTIGNhbiBwb2xsIG11bHRpcGxlIHRpbWVzIHBlciBzZWNvbmQpLiBQb3J0ZWQgZnJvbSBUVFYtQUIuCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCB8fCBub3cgLSBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA+IDYwMDAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0ID0gbm93OwogICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5LCBtYXApID0+IHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IG5vdyAtIDEyMDAwMCkgewogICAgICAgICAgICAgICAgICAgIG1hcC5kZWxldGUoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIERpYWdub3N0aWM6IGxvZyBvbmNlIHBlciBzdHJlYW1JbmZvIHdoZW4gdGhlIGNhY2hlIGNyb3NzZXMgMTAwMCBlbnRyaWVzLAogICAgICAgICAgICAvLyBzbyBjYWNoZSBibG9hdCBmcm9tIGEgZnV0dXJlIFRUTC9wcnVuZSBidWcgd291bGQgc3VyZmFjZSBpbiB1c2VyIHJlcG9ydHMKICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBzdGF5aW5nIGludmlzaWJsZS4KICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLnNpemUgPiAxMDAwICYmICFzdHJlYW1JbmZvLkxvZ2dlZEFkQ2FjaGVTaXplMWspIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxayA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZFNlZ21lbnRDYWNoZSBjcm9zc2VkIDEwMDAgZW50cmllcyAobm93ICcgKyBBZFNlZ21lbnRDYWNoZS5zaXplICsgJykg4oCUIHBvc3NpYmxlIGNhY2hlIGJsb2F0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xuJyk7CiAgICB9CiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG1hdGNoaW5nIHN0cmVhbSBVUkwgZm9yIGEgZ2l2ZW4gcmVzb2x1dGlvbiBmcm9tIGEgbWFzdGVyIG0zdTgKICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBjb25zdCBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgIGxldCBtYXRjaGVkUmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IG1hdGNoZWRGcmFtZVJhdGUgPSBmYWxzZTsKICAgICAgICBsZXQgY2xvc2VzdFJlc29sdXRpb25VcmwgPSBudWxsOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBJbmZpbml0eTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kaW5nc0xpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICAvLyBBY2NlcHQgdjIgQVBJIHZhcmlhbnQgVVJMcyB3aGljaCBhcmUgcmF3IENETiBVUkxzIHdpdGhvdXQgJy5tM3U4JyBpbiB0aGUgcGF0aC4KICAgICAgICAgICAgLy8gdjEgQVBJOiBuZXh0IGxpbmUgaXMgJy4uLmluZGV4LTxyZXNvbHV0aW9uPi5tM3U4Py4uLicKICAgICAgICAgICAgLy8gdjIgQVBJOiBuZXh0IGxpbmUgaXMgYSByYXcgQ0ROIFVSTCBsaWtlICdodHRwczovL3ZpZGVvLWVkZ2UtLi4ubmV0L3YxLy4uLi9jaHVua2VkLy4uLicKICAgICAgICAgICAgLy8gd2l0aG91dCAnLm0zdTgnLiBNYXRjaGluZyBvbmx5IG9uICcubTN1OCcgd291bGQgc2tpcCB2MiB2YXJpYW50cyBlbnRpcmVseSwKICAgICAgICAgICAgLy8gY2F1c2luZyBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uIHRvIHJldHVybiBudWxsIGFuZCBiYWNrdXAgc2VsZWN0aW9uIHRvIGZhaWwuCiAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lID0gZW5jb2RpbmdzTGluZXNbaSArIDFdPy50cmltKCk7CiAgICAgICAgICAgIGlmIChlbmNvZGluZ3NMaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpICYmIG5leHRMaW5lICYmICFuZXh0TGluZS5zdGFydHNXaXRoKCcjJykgJiYgKG5leHRMaW5lLmluY2x1ZGVzKCcubTN1OCcpIHx8IG5leHRMaW5lLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoZW5jb2RpbmdzTGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbiAmJiAoIW1hdGNoZWRSZXNvbHV0aW9uVXJsIHx8ICghbWF0Y2hlZEZyYW1lUmF0ZSAmJiBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlc29sdXRpb25VcmwgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGcmFtZVJhdGUgPSBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25Vcmw7CiAgICB9CiAgICAvLyBDb3JlIGFkLWJsb2NraW5nIGxvZ2ljOiBkZXRlY3QgYWRzIGluIG0zdTgsIGZldGNoIGJhY2t1cCBzdHJlYW1zLCBzdHJpcCBhZCBzZWdtZW50cwogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBpZiAoSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkKSB7CiAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgdW5rbm93bkFkVGFncyA9IHRleHRTdHIubWF0Y2goLyNFWFRbXjpcbl0qKD86YWR8Y3VlfHNjdGV8c3BvbnNvcilbXjpcbl0qL2dpKTsKICAgICAgICAgICAgaWYgKHVua25vd25BZFRhZ3MpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSB1bmtub3duQWRUYWdzLmZpbHRlcih0ID0+ICFBZFNpZ25pZmllcnMuc29tZShzID0+IHQuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVbmtub3duIGFkLXJlbGF0ZWQgdGFncyBmb3VuZDogJyArIFsuLi5uZXcgU2V0KHVua25vd24pXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBoYXZlQWRUYWdzID0gaGFzQWRUYWdzKHRleHRTdHIpIHx8IFNpbXVsYXRlZEFkc0RlcHRoID4gMDsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB0byBjaGV3IG9uIHZzIHRoZSAxLTIgY2FjaGVkIGluZGl2aWR1YWwgc2VnbWVudHMuCiAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgc3JjL21vZHVsZXMvcHJvY2Vzc29yLnRzOjczMy03MzYuCiAgICAgICAgaWYgKCFoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzU2hvd2luZ0FkICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoaGF2ZUFkVGFncykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNaWRyb2xsID0gdGV4dFN0ci5pbmNsdWRlcygnIk1JRFJPTEwiJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnIm1pZHJvbGwiJyk7CiAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkQnJlYWtTdGFydGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgY29uc3QgcG9kTGVuZ3RoTWF0Y2ggPSB0ZXh0U3RyLm1hdGNoKC9YLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIPSIoXGQrKSIvKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aCA9IHBvZExlbmd0aE1hdGNoID8gcGFyc2VJbnQocG9kTGVuZ3RoTWF0Y2hbMV0sIDEwKSA6IDE7CiAgICAgICAgICAgICAgICAvLyBSZXNldCBlYXJseS1yZWxvYWQgc3RhdGUgZm9yIG5ldyBhZCBicmVhazsgYWxsb3cgdXAgdG8gb25lIGVhcmx5IHJlbG9hZCBwZXIgYWQgaW4gcG9kCiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBvZExlbmd0aCA9IHBvZExlbmd0aDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gMDsKICAgICAgICAgICAgICAgIC8vIFRyYWNrIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzIHRvIGRpc3Rpbmd1aXNoIHJlYWwgYWRzIGZyb20gZmFsc2UtcG9zaXRpdmUgc2lnbmlmaWVyIG1hdGNoZXMKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycyA9IHRleHRTdHIuaW5jbHVkZXMoJ1gtVFYtVFdJVENILUFELUFELVNFU1NJT04tSUQnKSB8fCB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1SQURTLVRPS0VOJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkN5Y2xlUmVzY3VlZFRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSA9IG51bGw7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNzYWlPbmx5VGhpc0JyZWFrID0gZmFsc2U7Ly8gUmVzZXQgc3RpY2t5IENTQUkgZmxhZyBmb3IgbmV3IGJyZWFrCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBkZXRlY3RlZCDigJQgdHlwZTogJyArIChzdHJlYW1JbmZvLklzTWlkcm9sbCA/ICdtaWRyb2xsJyA6ICdwcmVyb2xsJykgKyAnLCBjaGFubmVsOiAnICsgc3RyZWFtSW5mby5DaGFubmVsTmFtZSArICcsIHBvZDogJyArIHBvZExlbmd0aCArICcgYWQocykgKH4nICsgKHBvZExlbmd0aCAqIDMwKSArICdzIGV4cGVjdGVkKSwgc2lnbmlmaWVyczogJyArIGdldE1hdGNoZWRBZFNpZ25pZmllcnModGV4dFN0cikuam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnVXBkYXRlQWRCbG9ja0Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLklzTWlkcm9sbCkgewogICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKCcsbGl2ZScpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXF1ZXN0IG9uZSAudHMgZmlsZSBwZXIgLm0zdTggcmVxdWVzdCB0byBhdm9pZCBtYWtpbmcgdG9vIG1hbnkgcmVxdWVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0ZldGNoIGFkIC50cyBmaWxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5hZGQobGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoKGxpbmVzW2kgKyAxXSkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJsb2IoKSkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY3VycmVudFJlc29sdXRpb24gPSBzdHJlYW1JbmZvLlVybHNbdXJsXTsKICAgICAgICAgICAgaWYgKCFjdXJyZW50UmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkcyB3aWxsIGxlYWsgZHVlIHRvIG1pc3NpbmcgcmVzb2x1dGlvbiBpbmZvIGZvciAnICsgdXJsKTsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgZmFsc2UsIHN0cmVhbUluZm8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGlzSGV2YyA9IGN1cnJlbnRSZXNvbHV0aW9uLkNvZGVjcy5zdGFydHNXaXRoKCdoZXYnKSB8fCBjdXJyZW50UmVzb2x1dGlvbi5Db2RlY3Muc3RhcnRzV2l0aCgnaHZjJyk7CiAgICAgICAgICAgIGlmICgoKGlzSGV2YyAmJiAhU2tpcFBsYXllclJlbG9hZE9uSGV2YykgfHwgQWx3YXlzUmVsb2FkUGxheWVyT25BZCkgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggJiYgIXN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnUmVsb2FkUGxheWVyJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3RpY2t5IENTQUkgZmFzdCBwYXRoOiBpZiBhIHByaW9yIHBvbGwgaW4gVEhJUyBicmVhayBhbHJlYWR5IGNvbmZpcm1lZCB0aGUgYnJlYWsKICAgICAgICAgICAgLy8gaXMgQ1NBSS1vbmx5IChhbGwgc2VnbWVudHMgbGl2ZSBvbiBwb2xsIDEpLCBzdGF5IG9uIHRoZSBmYXN0IHBhdGggZm9yIHRoZSByZXN0CiAgICAgICAgICAgIC8vIG9mIHRoZSBicmVhay4gc3RyaXBBZFNlZ21lbnRzIHN0aWxsIGhhbmRsZXMgYW55IHJlYWwgRVhUSU5GIGFkIHNlZ21lbnRzIHRoYXQKICAgICAgICAgICAgLy8gc2hvdyB1cCBvbiBsYXRlciBwb2xscyAodGhleSBnZXQgY2FjaGVkIGFuZCB0aGUgZmV0Y2ggaG9vayByZXR1cm5zIEJMQU5LX01QNCksCiAgICAgICAgICAgIC8vIHNvIGFkcyBhcmUgYmxvY2tlZCBldmVuIHdpdGhvdXQgdGhlIGJhY2t1cCBzd2l0Y2guIFNraXBwaW5nIGJhY2t1cCBzZWFyY2ggZm9yCiAgICAgICAgICAgIC8vIHRoZSB3aG9sZSBDU0FJIGJyZWFrIHNhdmVzIH4yMCB3YXN0ZWQgZmV0Y2hlcyBwZXIgYnJlYWsg4oCUIHRoZSBiYWNrdXAgd291bGRuJ3QKICAgICAgICAgICAgLy8gaGVscCBhbnl3YXkgc2luY2UgZXZlcnkgcGxheWVyIHR5cGUgaGFzIHRoZSBzYW1lIENTQUkgYWRzLiBGbGFnIGlzIGNsZWFyZWQKICAgICAgICAgICAgLy8gb25seSBhdCBicmVhayBlbmQgKElzU2hvd2luZ0FkPWZhbHNlIHBhdGgpLgogICAgICAgICAgICAvLyBTdGlja3kgQ1NBSSBlc2NhcGUgaGF0Y2ggKFByZWZlckxvd1F1YWxpdHlCYWNrdXApOiBhZnRlciB+OHMgc3R1Y2ssIGZhbGwgdGhyb3VnaCB0byBiYWNrdXAgc2VhcmNoLgogICAgICAgICAgICBpZiAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCAmJiBzdHJlYW1JbmZvLkNzYWlPbmx5VGhpc0JyZWFrICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSA0KSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHVja1BvbGxzID0gc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWNvdmVyeUNhY2hlU2l6ZSA9IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDA7CiAgICAgICAgICAgICAgICBjb25zdCBlYXJseVJlbG9hZEluZm8gPSAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApICsgJy8nICsgTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTdGlja3kgQ1NBSSBlc2NhcGUgaGF0Y2gg4oCUIHN0dWNrICcgKyBzdHVja1BvbGxzICsgJyBwb2xscyAoficgKyAoc3R1Y2tQb2xscyAqIDIpICsgJ3MpLCBFYXJseVJlbG9hZENvdW50PScgKyBlYXJseVJlbG9hZEluZm8gKyAnLCByZWNvdmVyeSBjYWNoZT0nICsgcmVjb3ZlcnlDYWNoZVNpemUgKyAnIHNlZ21lbnRzLCBmYWxsaW5nIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayAmJiAhc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4KSB7CiAgICAgICAgICAgICAgICBpZiAoSXNBZFN0cmlwcGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEVhcmx5IHJlbG9hZCBkdXJpbmcgcHJvbG9uZ2VkIGZyZWV6ZSDigJQgbWlycm9ycyB0aGUgY2hlY2sgaW4gdGhlIG5vcm1hbAogICAgICAgICAgICAgICAgLy8gYmFja3VwLXNlYXJjaCBwYXRoIHdoaWNoIHdlJ2Qgb3RoZXJ3aXNlIHNraXAgZW50aXJlbHkgYnkgcmV0dXJuaW5nIGVhcmx5CiAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBzdGlja3kgcGF0aC4gV2l0aG91dCB0aGlzLCBoZWF2eSBTU0FJIGJyZWFrcyBvbiBDU0FJLWNvbmZpcm1lZAogICAgICAgICAgICAgICAgLy8gc3RyZWFtcyBsZWF2ZSB0aGUgcGxheWVyIHJlcGxheWluZyB0aGUgdGhpbiByZWNvdmVyeSBjYWNoZSBmb3IgdGhlIGZ1bGwKICAgICAgICAgICAgICAgIC8vIGJyZWFrIGR1cmF0aW9uIChvYnNlcnZlZDogMzUuOXMgZnJlZXplIG9uIHBvZC0xIGJyZWFrLCAzIGFsbC1zdHJpcHBlZAogICAgICAgICAgICAgICAgLy8gcG9sbHMsIDEtc2VnbWVudCByZWNvdmVyeSBjYWNoZSkuCiAgICAgICAgICAgICAgICAvLyBCb3VuZGVkIHRvIG1heEVhcmx5UmVsb2FkcyBwZXIgYWQgaW4gcG9kIHNvIHJlbG9hZCBsb29wcyBhcmUgaW1wb3NzaWJsZS4KICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0IChzdGlja3kgcGF0aCk6IHN0aWxsIGFkcyDigJQgY29udGludWluZyByZWNvdmVyeSBsb29wJyk7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5UmVjb3ZlcnlUaGluID0gKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApIDwgMzsKICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreU1heEVhcmx5UmVsb2FkcyA9IHN0aWNreVJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgICAgICBjb25zdCBzdGlja3lFZmZlY3RpdmVUaHJlc2hvbGQgPSBzdGlja3lSZWNvdmVyeVRoaW4gPyAxIDogRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkOwogICAgICAgICAgICAgICAgaWYgKEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA+IDAgJiYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApID49IHN0aWNreUVmZmVjdGl2ZVRocmVzaG9sZCAmJiAhc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCAmJiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApIDwgc3RpY2t5TWF4RWFybHlSZWxvYWRzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgPSAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5UmVhc29uID0gc3RpY2t5UmVjb3ZlcnlUaGluID8gJyAodGhpbiByZWNvdmVyeSBjYWNoZTogJyArIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSArICcgc2VnbWVudHMpJyA6ICcnOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCB0cmlnZ2VyZWQgKHN0aWNreSBwYXRoKSDigJQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzICsgJyBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMnICsgc3RpY2t5UmVhc29uICsgJyBbJyArIHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCArICcvJyArIHN0aWNreU1heEVhcmx5UmVsb2FkcyArICddJyk7CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyBrZXk6ICdSZWxvYWRQbGF5ZXInLCBraW5kOiAnZWFybHknIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgbnVtU3RyaXBwZWRBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cywKICAgICAgICAgICAgICAgICAgICBhY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBudWxsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENTQUkgZmFzdCBwYXRoOiBpZiBhbGwgc2VnbWVudHMgaW4gdGhlIG1haW4gc3RyZWFtIGFyZSBsaXZlLCBza2lwIGJhY2t1cCBzZWFyY2guCiAgICAgICAgICAgIC8vIENTQUkgYWRzIGFyZSBkZWxpdmVyZWQgb3V0c2lkZSB0aGUgbTN1OCDigJQgdGhlIG1haW4gc3RyZWFtIHNlZ21lbnRzIGFyZSBjbGVhbi4KICAgICAgICAgICAgLy8gSnVzdCBzdHJpcCB0cmFja2luZyBVUkxzIGFuZCByZXR1cm4gdGhlIG1haW4gc3RyZWFtIGRpcmVjdGx5LCBhdm9pZGluZyB0aGUKICAgICAgICAgICAgLy8gYmFja3VwIHN0cmVhbSBzd2l0Y2ggdGhhdCBjYXVzZXMgYSAyMC00MHMgcmVidWZmZXIgZ2FwLgogICAgICAgICAgICBjb25zdCBtYWluU3RyZWFtTGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICBsZXQgaGFzTm9uTGl2ZVNlZ21lbnQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWluU3RyZWFtTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtYWluU3RyZWFtTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVElORicpICYmICFtYWluU3RyZWFtTGluZXNbaV0uaW5jbHVkZXMoJyxsaXZlJykpIHsKICAgICAgICAgICAgICAgICAgICBoYXNOb25MaXZlU2VnbWVudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmFja3VwU3dhcEZpcnN0IChvcHQtaW4pOiBza2lwIHN0aWNreSBDU0FJIHBhdGggZW50aXJlbHksIGFsd2F5cyBmYWxsIHRocm91Z2ggdG8KICAgICAgICAgICAgLy8gYmFja3VwIHNlYXJjaCBvbiBhZCBkZXRlY3QuIE1pbWljcyBUVFYtQUIncyBiYWNrdXAtc3dhcC1maXJzdCBmbG93IOKAlCBhdm9pZHMKICAgICAgICAgICAgLy8gTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkgKG5vIEJMQU5LX01QNCBpbmplY3Rpb24sIG5vIHJlY292ZXJ5CiAgICAgICAgICAgIC8vIHNlZ21lbnQgcmVwbGF5KSwgd2hpY2ggdXNlcnMgcmVwb3J0IHByb2R1Y2VzIGZld2VyIGxvYWRpbmcgY2lyY2xlcy4gQ29zdDogZXh0cmEKICAgICAgICAgICAgLy8gZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhayAodG9rZW4gcmVxdWVzdHMgZm9yIGVhY2ggYmFja3VwIHR5cGUgdHJpZWQpLgogICAgICAgICAgICBpZiAoIWhhc05vbkxpdmVTZWdtZW50ICYmICFzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggJiYgIUJhY2t1cFN3YXBGaXJzdCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IHRydWU7Ly8gTWFyayBicmVhayBhcyBjb25maXJtZWQgQ1NBSSBzbyBzdWJzZXF1ZW50IHBvbGxzIHN0YXkgb24gdGhlIGZhc3QgcGF0aAogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBmYXN0IHBhdGgg4oCUIGFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoJyk7CiAgICAgICAgICAgICAgICBpZiAoSXNBZFN0cmlwcGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICAgICAgICAgIGhhc0Fkczogc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCwKICAgICAgICAgICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBiYWNrdXBTZWFyY2hTdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIGxldCBiYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2t1cE0zdTggPSBudWxsOwogICAgICAgICAgICBsZXQgZmFsbGJhY2tNM3U4ID0gbnVsbDsKICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwOwogICAgICAgICAgICBsZXQgaXNEb2luZ01pbmltYWxSZXF1ZXN0cyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID4gRGF0ZS5ub3coKSAtIFBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1RpbWUpIHsKICAgICAgICAgICAgICAgIC8vIFdoZW4gZG9pbmcgcGxheWVyIHJlbG9hZCB0aGVyZSBhcmUgYSBsb3Qgb2YgcmVxdWVzdHMgd2hpY2ggY2F1c2VzIHRoZSBiYWNrdXAgc3RyZWFtIHRvIGxvYWQgaW4gc2xvdy4gQnJpZWZseSBwcmVmZXIgdXNpbmcgYSBzaW5nbGUgdmVyc2lvbiB0byBwcmV2ZW50IGxvbmcgZGVsYXlzCiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gUGxheWVyUmVsb2FkTWluaW1hbFJlcXVlc3RzUGxheWVySW5kZXg7CiAgICAgICAgICAgICAgICBpc0RvaW5nTWluaW1hbFJlcXVlc3RzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUcnkgcGlubmVkIGJhY2t1cCBwbGF5ZXIgdHlwZSBmaXJzdCBpZiBhdmFpbGFibGUKICAgICAgICAgICAgY29uc3QgcGxheWVyVHlwZXNUb1RyeSA9IFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPyBbLi4uQmFja3VwUGxheWVyVHlwZXMsICdhdXRvcGxheSddIDogWy4uLkJhY2t1cFBsYXllclR5cGVzXTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgY29uc3QgcGlubmVkSW5kZXggPSBwbGF5ZXJUeXBlc1RvVHJ5LmluZGV4T2Yoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIGlmIChwaW5uZWRJbmRleCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlc1RvVHJ5LnNwbGljZShwaW5uZWRJbmRleCwgMSk7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS51bnNoaWZ0KHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgcGxheWVyVHlwZUluZGV4ID0gc3RhcnRJbmRleDsgIWJhY2t1cE0zdTggJiYgcGxheWVyVHlwZUluZGV4IDwgcGxheWVyVHlwZXNUb1RyeS5sZW5ndGg7IHBsYXllclR5cGVJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJUeXBlID0gcGxheWVyVHlwZXNUb1RyeVtwbGF5ZXJUeXBlSW5kZXhdOwogICAgICAgICAgICAgICAgY29uc3QgcmVhbFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlLnJlcGxhY2UoJy1DQUNIRUQnLCAnJyk7CiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRBdCA9IHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuZ2V0KHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIGlmIChmYWlsZWRBdCAmJiAoRGF0ZS5ub3coKSAtIGZhaWxlZEF0KSA8IDE1MDAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBpc0Z1bGx5Q2FjaGVkUGxheWVyVHlwZSA9IHBsYXllclR5cGUgIT0gcmVhbFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FjaGVzIHRoZSBtM3U4IGlmIGl0IGRvZXNuJ3QgaGF2ZSBhZHMuIElmIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGhhcyBhZHMgaXQgZmV0Y2hlcyBhIG5ldyB2ZXJzaW9uIChzZWNvbmQgbG9vcCkKICAgICAgICAgICAgICAgICAgICBsZXQgaXNGcmVzaE0zdTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RpbmdzTTN1OCA9IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdOwogICAgICAgICAgICAgICAgICAgIGlmICghZW5jb2RpbmdzTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICBpc0ZyZXNoTTN1OCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcmVhbFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IChmbGF0dGVyLCBvYnNlcnZlZCBmb3IgJ2VtYmVkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNwYXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCBzcGF0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXSA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVXNoZXIgSFRUUCAnICsgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyByZWFsUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JCb2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXJyb3JCb2R5ID0gJyDigJQgJyArIChhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLnRleHQoKSkuc3Vic3RyaW5nKDAsIDIwMCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBY2Nlc3MgdG9rZW4gSFRUUCAnICsgYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgKyAnIGZvciAnICsgcmVhbFBsYXllclR5cGUgKyAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDQwMyA/ICcgKGludGVncml0eTogJyArIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAncHJlc2VudCcgOiAnbWlzc2luZycpICsgJyknIDogJycpICsgZXJyb3JCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLnNldChyZWFsUGxheWVyVHlwZSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWNjZXNzIHRva2VuIGZhaWxlZCBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJzogJyArIGVyci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuc2V0KHJlYWxQbGF5ZXJUeXBlLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFVybCA9IGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbTN1OFRleHQgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtM3U4VGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyVHlwZSA9PSBGYWxsYmFja1BsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0FkVGFncyhtM3U4VGV4dCkgJiYgKFNpbXVsYXRlZEFkc0RlcHRoID09IDAgfHwgcGxheWVyVHlwZUluZGV4ID49IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSkpIHx8ICghZmFsbGJhY2tNM3U4ICYmIHBsYXllclR5cGVJbmRleCA+PSBwbGF5ZXJUeXBlc1RvVHJ5Lmxlbmd0aCAtIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzIHx8IDApID49IDEgJiYgIWhhc0FkVGFncyhtM3U4VGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2VHlwZSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZUeXBlICYmIHByZXZUeXBlICE9PSBwbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEN5Y2xlIHN3aXRjaGVkIHRvIGRpZmZlcmVudCBjbGVhbiB0eXBlICgnICsgcGxheWVyVHlwZSArICcsIHdhcyAnICsgcHJldlR5cGUgKyAnKSBkdXJpbmcgZnJlZXplIOKAlCByZWNvdmVyZWQgd2l0aG91dCByZWxvYWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBtYXJrIGFzIGN5Y2xlLXJlc2N1ZWQgd2hlbiB3ZSBBQ1RVQUxMWSBzd2l0Y2hlZCBwbGF5ZXIgdHlwZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdHVyYWwgcmVjb3ZlcnkgKHNhbWUgdHlwZSBiZWNhbWUgY2xlYW4pIHN0aWxsIG5lZWRzIHRoZSBlbmQtb2YtYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIHRvIHJlZnJlc2ggdGhlIHBsYXllciBidWZmZXIg4oCUIHNraXBwaW5nIGl0IGxlYXZlcyB0aGUgcGxheWVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0dWNrIHdpdGggbG93IGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBtb25pdG9yIHVuYWJsZSB0byByZWNvdmVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkN5Y2xlUmVzY3VlZFRoaXNCcmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU2FtZSBiYWNrdXAgdHlwZSAoJyArIHBsYXllclR5cGUgKyAnKSBiZWNhbWUgY2xlYW4gZHVyaW5nIGZyZWV6ZSDigJQgbmF0dXJhbCByZWNvdmVyeScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0FkVGFncyhtM3U4VGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUpIHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5oYXMocGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5hZGQocGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSAoJyArIHBsYXllclR5cGUgKyAnKSBhbHNvIGhhcyBhZHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdWxseUNhY2hlZFBsYXllclR5cGUgfHwgaXNEb2luZ01pbmltYWxSZXF1ZXN0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IHBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDeWNsZSB0aHJvdWdoIGFsbCBwbGF5ZXIgdHlwZXMgbG9va2luZyBmb3IgYSBjbGVhbiBiYWNrdXAuIE9ubHkgY29tbWl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGFkLWxhZGVuIGJhY2t1cCBhcyBhIGxhc3QgcmVzb3J0IHdoZW4gd2UndmUgZXhoYXVzdGVkIGFsbCBvcHRpb25zLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQUiAjODkgcHJldmlvdXNseSBjb21taXR0ZWQgdGhlIGZpcnN0IGFkLWxhZGVuIHR5cGUgaW1tZWRpYXRlbHkg4oCUIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSB2NTggZnJlZXplIHJlZ3Jlc3Npb24gKGlzc3VlICMxMTIpIGJlY2F1c2UgdGhlIHN0cmlwK3JlY292ZXJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3Agd291bGQgZW5nYWdlIGV2ZW4gd2hlbiBhIGNsZWFuIGFsdGVybmF0ZSB3YXMgYXZhaWxhYmxlIG9uIGFub3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxheWVyIHR5cGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3MobTN1OFRleHQpICYmIHBsYXllclR5cGVJbmRleCA+PSBwbGF5ZXJUeXBlc1RvVHJ5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBiYWNrdXAgcGxheWVyIHR5cGVzIGFkLWxhZGVuIOKAlCB0YWtpbmcgJyArIHBsYXllclR5cGUgKyAnIGFzIGxhc3QtcmVzb3J0IGZhbGxiYWNrIChzdHJpcCtyZWNvdmVyeSBwYXRoIHdpbGwgZW5nYWdlKScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IHBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSBmZXRjaCBmYWlsZWQgZm9yICcgKyBwbGF5ZXJUeXBlICsgJyAoc3RhdHVzICcgKyBzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGVycm9yIGZvciAnICsgcGxheWVyVHlwZSArICc6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NNM1U4Q2FjaGVbcGxheWVyVHlwZV0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0ZyZXNoTTN1OCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFiYWNrdXBNM3U4ICYmIGZhbGxiYWNrTTN1OCkgewogICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IEZhbGxiYWNrUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgIGJhY2t1cE0zdTggPSBmYWxsYmFja00zdTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3RhbGUtY29tbWl0IGd1YXJkOiBtdWx0aXBsZSBwcm9jZXNzTTNVOCBjYWxscyBjYW4gYmUgaW4gZmxpZ2h0IGNvbmN1cnJlbnRseSBmb3IKICAgICAgICAgICAgLy8gdGhlIHNhbWUgc3RyZWFtSW5mbyAob25lIHBlciBtM3U4IHBvbGwpLiBJZiB0aGlzIGJhY2t1cCBzZWFyY2ggc3RhcnRlZCBkdXJpbmcgdGhlCiAgICAgICAgICAgIC8vIGFkIGJyZWFrIGJ1dCBjb21wbGV0ZWQgQUZURVIgYSBsYXRlciBwb2xsIGFscmVhZHkgcmFuIHRoZSBlbmQtb2YtYnJlYWsgcmVzZXQKICAgICAgICAgICAgLy8gKElzU2hvd2luZ0FkID0gZmFsc2UsIEFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBudWxsKSwgY29tbWl0dGluZyB0aGUgYmFja3VwIGhlcmUKICAgICAgICAgICAgLy8gd291bGQgb3ZlcndyaXRlIHRoZSBjbGVhcmVkIHN0YXRlIGFuZCBmZWVkIHN0YWxlIHBsYXlsaXN0IGRhdGEgdG8gdGhlIHBsYXllciwKICAgICAgICAgICAgLy8gY2F1c2luZyBidWZmZXIgcmVjb25jaWxpYXRpb24gZmFpbHVyZXMgYW5kIGEgZm9yY2VkIHJlbG9hZC4gQ2hlY2sgSXNTaG93aW5nQWQKICAgICAgICAgICAgLy8gaGVyZSB0byBkaXNjYXJkIHN0YWxlIHJlc3VsdHMuCiAgICAgICAgICAgIGlmIChiYWNrdXBNM3U4ICYmIHN0cmVhbUluZm8uSXNTaG93aW5nQWQpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBiYWNrdXBNM3U4OwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSA9IGJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlICE9IGJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBiYWNrdXBQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVF1YWxpdHlUeXBlcyA9IFsnZW1iZWQnLCAnc2l0ZScsICdwb3BvdXQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoUGluQmFja3VwUGxheWVyVHlwZSB8fCBzb3VyY2VRdWFsaXR5VHlwZXMuaW5jbHVkZXMoYmFja3VwUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEJsb2NraW5nJHsoc3RyZWFtSW5mby5Jc01pZHJvbGwgPyAnIG1pZHJvbGwgJyA6ICcgJyl9YWRzICgke2JhY2t1cFBsYXllclR5cGV9KSDigJQgYmFja3VwIGZvdW5kIGluICR7RGF0ZS5ub3coKSAtIGJhY2t1cFNlYXJjaFN0YXJ0fW1zYCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5VGllciA9IGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgPyAnMzYwcCcgOiAnU291cmNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1lc2NhcGUgYmFja3VwOiAnICsgYmFja3VwUGxheWVyVHlwZSArICcgKCcgKyBxdWFsaXR5VGllciArICcpIOKAlCByZWNvdmVyZWQgZnJvbSBzdGlja3ktcGF0aCBmcmVlemUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgJiYgUHJlZmVyTG93UXVhbGl0eUJhY2t1cCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvcGxheSBiYWNrdXAgY29tbWl0dGVkIOKAlCAzNjBwIGZhbGxiYWNrIGFmdGVyIFNvdXJjZSB0eXBlcyBhZC1sYWRlbiAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFja3VwTTN1OCAmJiAhc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRGlzY2FyZGVkIHN0YWxlIGJhY2t1cCBjb21taXQgKCcgKyBiYWNrdXBQbGF5ZXJUeXBlICsgJywgJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zKSDigJQgYnJlYWsgZW5kZWQgZHVyaW5nIHNlYXJjaCcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIOKAlCBhZHMgbWF5IGxlYWsuIFRyaWVkOiAnICsgcGxheWVyVHlwZXNUb1RyeS5zbGljZShzdGFydEluZGV4KS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPOiBJbXByb3ZlIGhldmMgc3RyaXBwaW5nLiBJdCBzaG91bGQgYWx3YXlzIHN0cmlwIHdoZW4gdGhlcmUgaXMgYSBjb2RlYyBtaXNtYXRjaCAoYm90aCB3YXlzKQogICAgICAgICAgICBjb25zdCBzdHJpcEhldmMgPSBpc0hldmMgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTg7CiAgICAgICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCB8fCBzdHJpcEhldmMpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgc3RyaXBIZXZjLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghYmFja3VwTTN1OCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc3RyaXBwaW5nIGRpc2FibGVkIGFuZCBubyBiYWNrdXAg4oCUIGFkcyBXSUxMIHNob3cnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBMb2cgcmVsb2FkIG91dGNvbWUgb24gdGhlIHBvbGwgYWZ0ZXIgZWFybHkgcmVsb2FkIHRyaWdnZXJlZAogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpICYmIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdDogcGFydGlhbCDigJQgc29tZSBsaXZlIHNlZ21lbnRzIHJldHVybmVkJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCByZXN1bHQ6IGNsZWFuIOKAlCBmcmVlemUgZW5kZWQnKTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0cmlnZ2VyIGZsYWcgc28gc3Vic2VxdWVudCBmcmVlemVzIHdpdGhpbiB0aGUgc2FtZSBwb2QgY2FuIHJlLWZpcmUgKGJvdW5kZWQgYnkgRWFybHlSZWxvYWRDb3VudC9Qb2RMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0OiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemU6IGlmIHdlJ3ZlIGJlZW4gbG9vcGluZyByZWNvdmVyeSBzZWdtZW50cwogICAgICAgICAgICAvLyBmb3IgTisgcG9sbHMgKH5OeDJzKSwgdHJpZ2dlciBhIHJlbG9hZCB0byBhdHRlbXB0IGZyZXNoIGNvbnRlbnQuIEJvdW5kZWQgdG8gb25lCiAgICAgICAgICAgIC8vIHJlbG9hZCBwZXIgYWQgaW4gdGhlIHBvZCAoZS5nLiAyLWFkIHBvZCA9IHVwIHRvIDIgZWFybHkgcmVsb2FkcykuCiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IG1heEVhcmx5UmVsb2FkcyA9IHJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IG1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24gKyAnIFsnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ICsgJy8nICsgbWF4RWFybHlSZWxvYWRzICsgJ10nKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCsrOwogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBwbGF5bGlzdCBoYXMgbGl2ZSBzZWdtZW50cyDigJQgaWYgbm90LCBiYWNrdXAgc3RyZWFtIGlzIGRlYWQKICAgICAgICAgICAgY29uc3QgaGFzTGl2ZVNlZ21lbnRzID0gdGV4dFN0ci5pbmNsdWRlcygnLGxpdmUnKTsKICAgICAgICAgICAgY29uc3QgY2xlYW5UaHJlc2hvbGQgPSBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9PT0gMCA/IDEgOiAyOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gY2xlYW5UaHJlc2hvbGQgfHwgIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgaWYgKCFoYXNMaXZlU2VnbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGhhcyBubyBsaXZlIHNlZ21lbnRzIOKAlCBmb3JjaW5nIGltbWVkaWF0ZSByZWxvYWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGFkQnJlYWtEdXJhdGlvblNlYyA9IHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCkgLyAxMDAwKS50b0ZpeGVkKDEpIDogJz8nOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZpbmlzaGVkIGJsb2NraW5nIGFkcyDigJQgc3RyaXBwZWQgJyArIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzICsgJyBhZCBzZWdtZW50cywgZHVyYXRpb246ICcgKyBhZEJyZWFrRHVyYXRpb25TZWMgKyAncycpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZEluZm8gPSBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID8gJywgZWFybHkgcmVsb2FkIGF0IHBvbGwgJyArIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgOiAnJzsKICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWxsQ2xvY2tGcmVlemUgPSBzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0KSAvIDEwMDApLnRvRml4ZWQoMSkgKyAncyB3YWxsLWNsb2NrJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCBicmVhayBzdGF0czogJyArIHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzICsgJyBhbGwtc3RyaXBwZWQgcG9sbHMsIGZyZWV6ZSBkdXJhdGlvbjogJyArIHdhbGxDbG9ja0ZyZWV6ZSArIHJlbG9hZEluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaGFkU3RyaXBwZWRTZWdtZW50cyA9IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMDsKICAgICAgICAgICAgICAgIC8vIE9ubHkgY291bnQgdG93YXJkIGZhbHNlLXBvc2l0aXZlIGd1YXJkIGlmIHRoZSBtM3U4IGxhY2tlZCBoaWdoLWNvbmZpZGVuY2UgYWQgbWFya2Vycy4KICAgICAgICAgICAgICAgIC8vIENvbmZpcm1lZCBhZHMgKHdpdGggWC1UVi1UV0lUQ0gtQUQtQUQtU0VTU0lPTi1JRCBldGMuKSB0aGF0IHByb2R1Y2UgMCBzdHJpcHMgYXJlIHJlYWwgYWRzCiAgICAgICAgICAgICAgICAvLyB3ZSBzdWNjZXNzZnVsbHkgYXZvaWRlZCB2aWEgY2xlYW4gYmFja3VwIOKAlCBub3QgZmFsc2UgcG9zaXRpdmVzLgogICAgICAgICAgICAgICAgaWYgKCFoYWRTdHJpcHBlZFNlZ21lbnRzICYmICFzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPj0gMykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXYXJuaW5nOiAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyArICcgY29uc2VjdXRpdmUgdW5jb25maXJtZWQgYWQgYnJlYWtzIHdpdGggMCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcG9zc2libGUgZmFsc2UgcG9zaXRpdmUgZnJvbSBhZCBzaWduaWZpZXJzJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYWRTdHJpcHBlZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU2hvd2luZ0FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUpIHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gQ1NBSS1vbmx5IGFkIGJyZWFrOiBubyBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkIOKAlCBza2lwIHJlbG9hZCBlbnRpcmVseS4KICAgICAgICAgICAgICAgIGlmICghaGFkU3RyaXBwZWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUktb25seSBhZCBicmVhayAoc3RyaXBwZWQgMCkg4oCUIGNsZWFyaW5nIGJhY2t1cCB3aXRob3V0IHBsYXllciBhY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb246IGlmIEFOWSBiYWNrdXAgd2FzIGNvbW1pdHRlZCBkdXJpbmcgdGhpcyBicmVhayAoZXNjYXBlIGhhdGNoCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgY3ljbGUgcmVzY3VlIHRoYXQgZGlkbid0IG1lZXQgY3ljbGVSZXNjdWVkQ2xlYW5seSBjcml0ZXJpYSksIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIGJ1ZmZlciBoYXMgYWNjdW11bGF0ZWQgbWl4ZWQtc291cmNlIHNlZ21lbnRzIChiYWNrdXAtZmV0Y2hlZAogICAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbHRlcm5hdGUgcGxheWVyLXR5cGUgYWNjZXNzIHRva2VuICsgbmF0aXZlLWZldGNoZWQpLiBNaXhpbmcgY2FuCiAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgYXVkaW8vdmlkZW8gdHJhY2sgdGltZXN0YW1wcyB0byBkaXZlcmdlLCBhbmQgd2l0aG91dCBhIHJlbG9hZCB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBkcmlmdCBjb21wb3VuZHMgYWNyb3NzIHN1YnNlcXVlbnQgZXNjYXBlLWhhdGNoIGJyZWFrcy4gRm9yY2UgYSBoYXJkIHJlbG9hZAogICAgICAgICAgICAgICAgICAgIC8vIHRvIGZsdXNoIHRoZSBNZWRpYVNvdXJjZSBidWZmZXIgKyByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9wbGF5ICgzNjBwKSBzcGVjaWZpY2FsbHksIHRoZSByZWxvYWQgYWxzbyByZXN0b3JlcyBTb3VyY2UKICAgICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IChhdXRvcGxheS1zY29wZWQgdG9rZW4gb25seSBzZXJ2ZXMgMzYwcCB2YXJpYW50IGxhZGRlcikuCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBdXRvcGxheSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGlzQXV0b3BsYXkgPyAnYXV0b3BsYXkgKDM2MHApIOKAlCByZXN0b3JpbmcgU291cmNlIHF1YWxpdHknIDogc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSArICcg4oCUIGZsdXNoaW5nIE1lZGlhU291cmNlIHRvIHByZXZlbnQgQS9WIGRlc3luYyBhY2N1bXVsYXRpb24nOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LWVzY2FwZSByZWxvYWQ6ICcgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcykgc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5wdXNoKERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7IGtleTogJ1JlbG9hZFBsYXllcicsIGtpbmQ6ICdlYXJseScgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEF1dG8tZXNjYWxhdGUgY29vbGRvd246IGlmIDMrIHJlbG9hZHMgaW4gbGFzdCA1IG1pbiwgdHJpcGxlIHRoZSBjb29sZG93bgogICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMpIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzID0gc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzLmZpbHRlcih0ID0+IERhdGUubm93KCkgLSB0IDwgMzAwMDAwKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlY2VudFJlbG9hZHMgPSBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMuZmlsdGVyKHQgPT4gRGF0ZS5ub3coKSAtIHQgPCAzMDAwMDApLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUNvb2xkb3duID0gcmVjZW50UmVsb2FkcyA+PSAzID8gUmVsb2FkQ29vbGRvd25TZWNvbmRzICogMyA6IFJlbG9hZENvb2xkb3duU2Vjb25kczsKICAgICAgICAgICAgICAgIGNvbnN0IHRvb1Nvb25TaW5jZUxhc3RSZWxvYWQgPSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgJiYgKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQpIDwgKGVmZmVjdGl2ZUNvb2xkb3duICogMTAwMCk7CiAgICAgICAgICAgICAgICAvLyBTa2lwIGVuZC1vZi1icmVhayByZWxvYWQgd2hlbiBjeWNsZSByZXNjdWUgaGFuZGxlZCB0aGUgYnJlYWsgY2xlYW5seToKICAgICAgICAgICAgICAgIC8vIGEgZnJlZXplIG9mIOKJpDIgcG9sbHMgKH40cykgd2FzIHJlc29sdmVkIGJ5IHN3aXRjaGluZyB0byBhIGNsZWFuIGJhY2t1cCwKICAgICAgICAgICAgICAgIC8vIGFuZCBubyBlYXJseSByZWxvYWQgd2FzIG5lZWRlZC4gVGhlIHBsYXllciBpcyBvbiBhIGhlYWx0aHkgYmFja3VwIHN0cmVhbQogICAgICAgICAgICAgICAgLy8g4oCUIHJlbG9hZGluZyBqdXN0IHRvIHJldHVybiB0byB0aGUgY2Fub25pY2FsIHBsYXllciB0eXBlIGNhdXNlcyBhbiB1bm5lY2Vzc2FyeQogICAgICAgICAgICAgICAgLy8gfjEtMnMgbG9hZGluZyBjaXJjbGUuCiAgICAgICAgICAgICAgICBjb25zdCBjeWNsZVJlc2N1ZWRDbGVhbmx5ID0gc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgJiYKICAgICAgICAgICAgICAgICAgICAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgPD0gMiAmJgogICAgICAgICAgICAgICAgICAgIChzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgfHwgMCkgPT09IDA7CiAgICAgICAgICAgICAgICBpZiAoY3ljbGVSZXNjdWVkQ2xlYW5seSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEN5Y2xlIHJlc2N1ZSBoYW5kbGVkIHRoZSBicmVhayBjbGVhbmx5IOKAlCBza2lwcGluZyBlbmQtb2YtYnJlYWsgcmVsb2FkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBQb3N0LWFkIHJlbG9hZCBieXBhc3NlcyBjb29sZG93bjogaXQncyBhIGJ1ZmZlciBmbHVzaCB0aWVkIHRvIG5hdHVyYWwgYnJlYWsKICAgICAgICAgICAgICAgIC8vIGVuZCwgbm90IGEgY2FzY2FkZS1yaXNrIHJldHJ5LiBUaGUgYWQgYnJlYWsgY3ljbGUgaXRzZWxmIHJhdGUtbGltaXRzIHRoaXMKICAgICAgICAgICAgICAgIC8vIHBhdGggKG9uY2UgcGVyIGJyZWFrKS4gQ29vbGRvd24gc3RpbGwgZ2F0ZXMgYnVmZmVyLW1vbml0b3IgYW5kIG90aGVyCiAgICAgICAgICAgICAgICAvLyBjYXNjYWRlLXJpc2sgcGF0aHMgdGhhdCBjYW4gZmlyZSByZXBlYXRlZGx5IGluLWJyZWFrLgogICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVsb2FkID0gc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4IHx8IChSZWxvYWRQbGF5ZXJBZnRlckFkICYmIGhhZFN0cmlwcGVkU2VnbWVudHMgJiYgIWN5Y2xlUmVzY3VlZENsZWFubHkpOwogICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlbG9hZCkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5wdXNoKERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdSZWxvYWRQbGF5ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnZWFybHknCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0b29Tb29uU2luY2VMYXN0UmVsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNraXBwaW5nIHJlbG9hZCDigJQgbGFzdCByZWxvYWQgd2FzICcgKyAoKERhdGUubm93KCkgLSBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQpIC8gMTAwMCkudG9GaXhlZCgwKSArICdzIGFnbyAoY29vbGRvd246ICcgKyBlZmZlY3RpdmVDb29sZG93biArICdzJyArIChyZWNlbnRSZWxvYWRzID49IDMgPyAnLCBhdXRvLWVzY2FsYXRlZCBmcm9tICcgKyByZWNlbnRSZWxvYWRzICsgJyByZWxvYWRzIGluIDVtaW4nIDogJycpICsgJyknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdQYXVzZVJlc3VtZVBsYXllcicKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0vLyBlbmQgZWxzZSAobm9uLUNTQUkgcGF0aCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IHN0cmVhbUluZm8uQWN0aXZlQmFja3VwUGxheWVyVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGVzKHN0cikgewogICAgICAgIGlmICghc3RyKSByZXR1cm4ge307CiAgICAgICAgLy8gTm9ybWFsaXplOiBhbHdheXMgcGFzcyBvbmx5IGF0dHJpYnV0ZSBzZWN0aW9uCiAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KDApID09PSAzNSkgeyAvLyAnIycKICAgICAgICAgICAgY29uc3QgaWR4ID0gc3RyLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHN0ciA9IHN0ci5zbGljZShpZHggKyAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcygKICAgICAgICAgICAgc3RyLnNwbGl0KC8oPzpefCwpKCg/OltePV0qKT0oPzoiW14iXSoifFteLF0qKSkvKQogICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB4LmluZGV4T2YoJz0nKTsKICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHguc3Vic3RyaW5nKDAsIGlkeCk7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArIDEpOwogICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBOdW1iZXIuaXNOYU4obnVtKSA/IHZhbHVlLnN0YXJ0c1dpdGgoJyInKSA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWUgOiBudW1dOwogICAgICAgICAgICB9KSk7CiAgICB9CiAgICAvLyBSZXF1ZXN0IGEgcGxheWJhY2sgYWNjZXNzIHRva2VuIGZyb20gVHdpdGNoIEdRTCB1c2luZyB0aGUgZ2l2ZW4gcGxheWVyIHR5cGUKICAgIGZ1bmN0aW9uIGdldEFjY2Vzc1Rva2VuKGNoYW5uZWxOYW1lLCBwbGF5ZXJUeXBlKSB7CiAgICAgICAgY29uc3QgYm9keSA9IHsKICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1BsYXliYWNrQWNjZXNzVG9rZW4nLAogICAgICAgICAgICB2YXJpYWJsZXM6IHsKICAgICAgICAgICAgICAgIGlzTGl2ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGxvZ2luOiBjaGFubmVsTmFtZSwKICAgICAgICAgICAgICAgIGlzVm9kOiBmYWxzZSwKICAgICAgICAgICAgICAgIHZvZElEOiAiIiwKICAgICAgICAgICAgICAgIHBsYXllclR5cGU6IHBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogcGxheWVyVHlwZSA9PSAnYXV0b3BsYXknID8gJ2FuZHJvaWQnIDogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSk7CiAgICB9CiAgICAvLyBTZW5kIGEgR1FMIHJlcXVlc3QgdG8gVHdpdGNoIHZpYSB0aGUgbWFpbiB0aHJlYWQgKHdvcmtlcnMgY2FuJ3QgbWFrZSBjcmVkZW50aWFsZWQgcmVxdWVzdHMpCiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHksIHBsYXllclR5cGUpIHsKICAgICAgICBpZiAoIUdRTERldmljZUlEKSB7CiAgICAgICAgICAgIEdRTERldmljZUlEID0gJyc7CiAgICAgICAgICAgIGNvbnN0IGRjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7CiAgICAgICAgICAgIGNvbnN0IGRjaGFyYWN0ZXJzTGVuZ3RoID0gZGNoYXJhY3RlcnMubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHsKICAgICAgICAgICAgICAgIEdRTERldmljZUlEICs9IGRjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBkY2hhcmFjdGVyc0xlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlEJzogQ2xpZW50SUQsCiAgICAgICAgICAgICdYLURldmljZS1JZCc6IEdRTERldmljZUlELAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSksCiAgICAgICAgICAgIC4uLihDbGllbnRWZXJzaW9uICYmIHsnQ2xpZW50LVZlcnNpb24nOiBDbGllbnRWZXJzaW9ufSksCiAgICAgICAgICAgIC4uLihDbGllbnRTZXNzaW9uICYmIHsnQ2xpZW50LVNlc3Npb24tSWQnOiBDbGllbnRTZXNzaW9ufSkKICAgICAgICB9OwogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGxldCBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgIGxldCBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7CiAgICBsZXQgZHJpZnRDYXRjaFVwVGltZW91dCA9IG51bGw7CiAgICBmdW5jdGlvbiBzdGFydERyaWZ0Q29ycmVjdGlvbih2aWRlb0VsZW1lbnQpIHsKICAgICAgICBpZiAoRHJpZnRDb3JyZWN0aW9uUmF0ZSA8PSAxKSByZXR1cm47CiAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICBpZiAoZHJpZnRDYXRjaFVwVGltZW91dCkgeyBjbGVhclRpbWVvdXQoZHJpZnRDYXRjaFVwVGltZW91dCk7IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOyB9CiAgICAgICAgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IERyaWZ0Q29ycmVjdGlvblJhdGU7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRHJpZnQgY29ycmVjdGlvbjogY2F0Y2hpbmcgdXAgYXQgJyArIERyaWZ0Q29ycmVjdGlvblJhdGUgKyAneCcpOwogICAgICAgIGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgdmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsKICAgICAgICAgICAgICAgIGlmICh2aWQgJiYgdmlkLmJ1ZmZlcmVkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmlkLmJ1ZmZlcmVkLmVuZCh2aWQuYnVmZmVyZWQubGVuZ3RoIC0gMSkgLSB2aWQuY3VycmVudFRpbWUgPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICB2aWQucGxheWJhY2tSYXRlID0gMS4wOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEcmlmdCBjb3JyZWN0aW9uIGNvbXBsZXRlIOKAlCByZXN1bWVkIG5vcm1hbCBwbGF5YmFjayBzcGVlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwVGltZW91dCkgeyBjbGVhclRpbWVvdXQoZHJpZnRDYXRjaFVwVGltZW91dCk7IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOyB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgIH0sIDUwMCk7CiAgICAgICAgZHJpZnRDYXRjaFVwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0cnkgeyB2aWRlb0VsZW1lbnQucGxheWJhY2tSYXRlID0gMS4wOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIGlmIChkcmlmdENhdGNoVXBJbnRlcnZhbCkgeyBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOyB9CiAgICAgICAgICAgIGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOwogICAgICAgIH0sIDMwMDAwKTsKICAgIH0KICAgIGNvbnN0IHBsYXllckJ1ZmZlclN0YXRlID0gewogICAgICAgIGNoYW5uZWxOYW1lOiBudWxsLAogICAgICAgIGhhc1N0cmVhbVN0YXJ0ZWQ6IGZhbHNlLAogICAgICAgIHBvc2l0aW9uOiAwLAogICAgICAgIGJ1ZmZlcmVkUG9zaXRpb246IDAsCiAgICAgICAgYnVmZmVyRHVyYXRpb246IDAsCiAgICAgICAgbnVtU2FtZTogMCwKICAgICAgICBmaXhBdHRlbXB0czogMCwKICAgICAgICBsYXN0Rml4VGltZTogMCwKICAgICAgICBpc0xpdmU6IHRydWUsCiAgICAgICAgbGFzdEJhY2t1cFN3aXRjaEF0OiAwLAogICAgICAgIGxhc3RSZWxvYWRBdDogMCwKICAgICAgICByZWNvdmVyeVJlbG9hZFVzZWQ6IGZhbHNlLAogICAgICAgIHVzZXJQYXVzZUludGVudDogZmFsc2UsCiAgICAgICAgbG9nZ2VkUGF1c2VJbnRlbnQ6IGZhbHNlLAogICAgICAgIHdlSnVzdFBhdXNlZDogMCwKICAgICAgICBpbkFkQnJlYWs6IGZhbHNlCiAgICB9OwogICAgLy8gUG9sbCB0aGUgcGxheWVyIHN0YXRlIHRvIGRldGVjdCBhbmQgZml4IGJ1ZmZlcmluZyBjYXVzZWQgYnkgYWQgc3RyZWFtIHN3aXRjaGluZwogICAgZnVuY3Rpb24gbW9uaXRvclBsYXllckJ1ZmZlcmluZygpIHsKICAgICAgICAvLyBGcmVzaCBwbGF5ZXIgbG9va3VwIGV2ZXJ5IHRpY2sgKGF2b2lkcyBzdGFsZSByZWYgd2hlbiBUd2l0Y2ggcmVzdGFydHMgaXRzIG93biBwbGF5ZXIpCiAgICAgICAgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgICAgIGlmIChwbGF5ZXJBbmRTdGF0ZSAmJiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIgJiYgcGxheWVyQW5kU3RhdGUuc3RhdGUpIHsKICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBsYXllckFuZFN0YXRlLnN0YXRlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgIXZpZGVvLl9fdGFzSW50ZW50SG9va2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uX190YXNJbnRlbnRIb29rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCB8fCAoRGF0ZS5ub3coKSAtIHBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCkgPiAyMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudXNlclBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcucGxheWVyOwogICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnN0YXRlOwogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXIuY29yZSkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnICYmICFwbGF5ZXIuaXNQYXVzZWQoKSAmJiAhcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKT8uZW5kZWQgJiYgKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50KCk/LnJlYWR5U3RhdGUgPz8gMCkgPj0gMSAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA8PSBEYXRlLm5vdygpIC0gUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgJiYgIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdFJlbG9hZEF0ID49IDE1MDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThVcmwgPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG0zdThVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaCA9IG0zdThVcmwubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RhcnQgPSBtM3U4VXJsLmluZGV4T2YoJz8nLCBsYXN0U2xhc2gpOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBtM3U4VXJsLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxLCBxdWVyeVN0YXJ0ICE9PSAtMSA/IHF1ZXJ5U3RhcnQgOiB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lPy5lbmRzV2l0aCgnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gZmlsZU5hbWUuc2xpY2UoMCwgLTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSAhPSBjaGFubmVsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnQ2hhbm5lbCBjaGFuZ2VkIHRvICcgKyBjaGFubmVsTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLmdldFN0YXRlKCkgPT09ICdQbGF5aW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkUG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LmJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyRHVyYXRpb24gPSBwbGF5ZXIuZ2V0QnVmZmVyRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBidWZmZXJlZFBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncG9zaXRpb246JyArIHBvc2l0aW9uICsgJyBidWZmZXJEdXJhdGlvbjonICsgYnVmZmVyRHVyYXRpb24gKyAnIGJ1ZmZlclBvc2l0aW9uOicgKyBidWZmZXJlZFBvc2l0aW9uICsgJyBzdGF0ZTogJyArIHBsYXllci5jb3JlPy5zdGF0ZT8uc3RhdGUgKyAnIHN0YXJ0ZWQ6ICcgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBjb3VsZCBiZSBpbXByb3ZlZC4gSXQgY3VycmVudGx5IGxldHMgdGhlIHBsYXllciBmdWxseSBlYXQgdGhlIGZ1bGwgYnVmZmVyIGJlZm9yZSBpdCB0cmlnZ2VycyBwYXVzZS9wbGF5CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgfHwgcG9zaXRpb24gPiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPT0gcG9zaXRpb24gfHwgYnVmZmVyRHVyYXRpb24gPCBQbGF5ZXJCdWZmZXJpbmdEYW5nZXJab25lKSAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlcmVkUG9zaXRpb24gPT0gYnVmZmVyZWRQb3NpdGlvbiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gPj0gYnVmZmVyRHVyYXRpb24gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3NpdGlvbiAhPSAwIHx8IGJ1ZmZlcmVkUG9zaXRpb24gIT0gMCB8fCBidWZmZXJEdXJhdGlvbiAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID09IFBsYXllckJ1ZmZlcmluZ1NhbWVTdGF0ZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXA6IGF0IG1vc3QgT05FIHJlbG9hZCBwZXIgcmVjb3Zlcnkgd2luZG93LiBBZnRlciByZWxvYWRpbmcgb25jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF5IG9uIHBhdXNlL3BsYXkgdW50aWwgcGxheWJhY2sgcmVjb3ZlcnMuIFByZXZlbnRzIHJlbG9hZCBjYXNjYWRlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3VsZEVzY2FsYXRlID0gcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMgPj0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0ZVRvUmVsb2FkID0gd291bGRFc2NhbGF0ZSAmJiAoRGlzYWJsZVJlbG9hZENhcCB8fCAhcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxvYWRDYXBOb3RlID0gd291bGRFc2NhbGF0ZSAmJiAhZXNjYWxhdGVUb1JlbG9hZCA/ICcgKHJlbG9hZCBjYXAgcmVhY2hlZCwgcGF1c2UvcGxheSBvbmx5IOKAlCBzZXQgdHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcD10cnVlIHRvIGJ5cGFzcyknIDogKGVzY2FsYXRlVG9SZWxvYWQgPyAnIChlc2NhbGF0aW5nIHRvIHJlbG9hZCknIDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIGZpeCBidWZmZXJpbmcgcG9zaXRpb246JyArIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uICsgJyBidWZmZXJlZFBvc2l0aW9uOicgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5idWZmZXJlZFBvc2l0aW9uICsgJyBidWZmZXJEdXJhdGlvbjonICsgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gKyByZWxvYWRDYXBOb3RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVrIHBhc3QgYnVmZmVyIGdhcCBpbnN0ZWFkIG9mIHN0YWxsaW5nICsgZHJpZnQgdG8gcmVjb3ZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQ/LigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5idWZmZXJlZC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGJpID0gMDsgYmkgPCB2aWRlby5idWZmZXJlZC5sZW5ndGg7IGJpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby5idWZmZXJlZC5zdGFydChiaSkgPiB2aWRlby5jdXJyZW50VGltZSArIDAuNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNlZWtpbmcgcGFzdCAnICsgKHZpZGVvLmJ1ZmZlcmVkLnN0YXJ0KGJpKSAtIHZpZGVvLmN1cnJlbnRUaW1lKS50b0ZpeGVkKDEpICsgJ3MgYnVmZmVyIGdhcCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdmlkZW8uYnVmZmVyZWQuc3RhcnQoYmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHZpZGVvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVmlkZW8gc3RhdGU6IHJlYWR5U3RhdGU9JyArIHZpZGVvLnJlYWR5U3RhdGUgKyAnIG5ldHdvcmtTdGF0ZT0nICsgdmlkZW8ubmV0d29ya1N0YXRlICsgJyBidWZmZXJlZD0nICsgKHZpZGVvLmJ1ZmZlcmVkLmxlbmd0aCA+IDAgPyB2aWRlby5idWZmZXJlZC5lbmQodmlkZW8uYnVmZmVyZWQubGVuZ3RoIC0gMSkudG9GaXhlZCgxKSA6IDApICsgJyBjdXJyZW50VGltZT0nICsgdmlkZW8uY3VycmVudFRpbWUudG9GaXhlZCgxKSArICcgcGF1c2VkPScgKyB2aWRlby5wYXVzZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1BhdXNlUGxheSA9IGVzY2FsYXRlVG9SZWxvYWQgPyBmYWxzZSA6ICFQbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1JlbG9hZCA9IGVzY2FsYXRlVG9SZWxvYWQgPyB0cnVlIDogUGxheWVyQnVmZmVyaW5nRG9QbGF5ZXJSZWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Ud2l0Y2hQbGF5ZXJUYXNrKGlzUGF1c2VQbGF5LCBpc1JlbG9hZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEZpeFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0ZVRvUmVsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBwb3NpdGlvbiBqdW1wIChuYXRpdmUgZ2FwIHJlY292ZXJ5KSDigJQgZHJpZnQgdG8gY2F0Y2ggdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBkdXJpbmcgYWQgYnJlYWtzIGFuZCAxMHMgYWZ0ZXI6IGJhY2t1cCBzdHJlYW0gc3dpdGNoaW5nIGNhdXNlcyBidWZmZXIgZ2FwcyB0aGF0IHRyaWdnZXIgZmFsc2UganVtcHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID4gMCAmJiBwb3NpdGlvbiAtIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uID4gNSAmJiAhcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrICYmICghcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0IHx8IERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QmFja3VwU3dpdGNoQXQgPj0gMTAwMDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3NpdGlvbiBqdW1wZWQgJyArIChwb3NpdGlvbiAtIHBsYXllckJ1ZmZlclN0YXRlLnBvc2l0aW9uKS50b0ZpeGVkKDEpICsgJ3Mg4oCUIHN0YXJ0aW5nIGRyaWZ0IGNvcnJlY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiA9IGJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID0gYnVmZmVyRHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIHdoZW4gbW9uaXRvcmluZyBwbGF5ZXIgZm9yIGJ1ZmZlcmluZzogJyArIGVycik7CiAgICAgICAgICAgICAgICBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2FkaW5nLWNpcmNsZSBoZWFsdGggY2hlY2s6IGR1cmluZyBhbiBhZCBzdHJpcCtyZWNvdmVyeSBsb29wIHRoZSBub3JtYWwgYnVmZmVyIG1vbml0b3IKICAgICAgICAvLyBpcyBnYXRlZCBvZmYgKGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMpLCBzbyBhIHZpc2libHkgc3RhbGxlZCBwbGF5ZXIgd291bGQgb3RoZXJ3aXNlIHdhaXQKICAgICAgICAvLyBmb3IgdGhlIHdvcmtlcidzIHBvbGwtYmFzZWQgZWFybHkgcmVsb2FkICh+MTBzKS4gVGhpcyBjYXRjaGVzIHRoZSB2aXNpYmxlIHN0YWxsIH4zcyBhZnRlcgogICAgICAgIC8vIGl0IHN0YXJ0cyBhbmQgdHJpZ2dlcnMgYSByZWxvYWQgZGlyZWN0bHksIGVsaW1pbmF0aW5nIG1vc3Qgb2YgdGhlIGxvYWRpbmctY2lyY2xlIHdpbmRvdy4KICAgICAgICBpZiAoaXNBY3RpdmVseVN0cmlwcGluZ0FkcyAmJiBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnBsYXllcjsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyPy5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8uZW5kZWQgJiYgIXBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIHBsYXllciBoYXMgZXZlciBoYWQgZGF0YSDigJQgZGlzdGluZ3Vpc2hlcyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAvLyAoaGFkIGRhdGEsIGxvc3QgZGF0YSkgZnJvbSBpbml0aWFsIHBsYXllciBpbml0IChuZXZlciBoYWQgZGF0YSB5ZXQpLgogICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgZnJlc2ggcGFnZSBsb2FkICsgcHJlcm9sbCBjYXVzZXMgUFIgIzk2IHRvIG1pc2ZpcmUgcmVwZWF0ZWRseQogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVhZHlTdGF0ZT0wIGlzIG5vcm1hbCBkdXJpbmcgaW5pdC4KICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1N0YWxsZWQgPSB2aWRlby5yZWFkeVN0YXRlIDwgMyAmJiAodmlkZW8ucGF1c2VkIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gMik7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhbGxSZWxvYWRDb29sZG93biA9IDE1MDAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb2xkb3duRXhwaXJlZCA9ICFwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QWRTdGFsbFJlbG9hZEF0IHx8IChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCkgPiBzdGFsbFJlbG9hZENvb2xkb3duOwogICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGZpcmUgbG9hZGluZy1jaXJjbGUgcmVsb2FkIGlmIEFOWSByZWxvYWQgaGFwcGVuZWQgcmVjZW50bHkg4oCUIHJlYWR5U3RhdGU9MAogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBleHBlY3RlZCB0cmFuc2llbnQgc3RhdGUgZHVyaW5nIGEgcmVsb2FkJ3MgTWVkaWFTb3VyY2UgdGVhcmRvd24uIFdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLCBhbiBlYXJseS1yZWxvYWQgaW4gZmxpZ2h0IGNhbiB0cmlnZ2VyIGEgcmVkdW5kYW50IGxvYWRpbmctY2lyY2xlIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWQgPSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQpIDwgc3RhbGxSZWxvYWRDb29sZG93bjsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGFsbGVkICYmIGNvb2xkb3duRXhwaXJlZCAmJiAhcmVjZW50UmVsb2FkICYmIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpID4gMzAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTG9hZGluZyBjaXJjbGUgZGV0ZWN0ZWQgZHVyaW5nIGFkIGJyZWFrICgnICsgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHN0YWxsLCByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJykg4oCUIGVhcmx5IHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkIHJlbG9hZDogYSBzdHVjayBtZWRpYSBwbGF5ZXIgbmVlZHMgaXRzIE1lZGlhU291cmNlIHJlYnVpbHQsIG5vdCBqdXN0IGFuIG0zdTggcmVmZXRjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgJ2Vhcmx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1N0YWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0gZWxzZSBpZiAoIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIHsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc0xpdmUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUuaXNMaXZlICYmICFpc0xpdmUpIHsKICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcih7CiAgICAgICAgICAgICAgICBoYXNBZHM6IGZhbHNlCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pc0xpdmUgPSBpc0xpdmU7CiAgICAgICAgLy8gRm9yY2UgaW1tZWRpYXRlIHRpY2sgd2hlbiB0YWIgYmVjb21lcyB2aXNpYmxlIHNvIHN0YWxscyBhcmUgY2F1Z2h0IGZhc3Qgb24gcmV0dXJuCiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcudmlzaWJpbGl0eUhvb2tlZCkgewogICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnZpc2liaWxpdHlIb29rZWQgPSB0cnVlOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcucGVuZGluZ1RpY2spIHsKICAgICAgICAgICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnBlbmRpbmdUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9uaXRvclBsYXllckJ1ZmZlcmluZy5wZW5kaW5nVGljayA9IGZhbHNlOyBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7IH0sIDEwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBDYXRjaCBwZXJzaXN0ZW50IGFkLWJyZWFrIG92ZXJsYXlzIChlLmcuICJ0YWtpbmcgYW4gYWQgYnJlYWsgLyBzdGljayBhcm91bmQiKQogICAgICAgIC8vIGV2ZW4gYWZ0ZXIgaGFzQWRzIGhhcyB0cmFuc2l0aW9uZWQgdG8gZmFsc2UuIHVwZGF0ZUFkYmxvY2tCYW5uZXIgb25seSBjYWxscwogICAgICAgIC8vIGhpZGVUd2l0Y2hBZE92ZXJsYXlzIGR1cmluZyB0aGUgYWN0aXZlIGFkIGJyZWFrOyBzb21lIG92ZXJsYXlzIGhhdmUgdGhlaXIgb3duCiAgICAgICAgLy8gbGlmZWN5Y2xlIGFuZCBzdGF5IHZpc2libGUgYWZ0ZXJ3YXJkcy4gUnVubmluZyBoZXJlIG9uIGV2ZXJ5IG1vbml0b3IgdGljawogICAgICAgIC8vICgxLTNzIGNhZGVuY2UpIGtlZXBzIHRoZW0gaGlkZGVuIHdpdGhvdXQgYSBkZWRpY2F0ZWQgaW50ZXJ2YWwuCiAgICAgICAgdHJ5IHsgaGlkZVR3aXRjaEFkT3ZlcmxheXMoKTsgfSBjYXRjaCB7fQogICAgICAgIC8vIFZpc2liaWxpdHktYXdhcmUgYmFja29mZjogcG9sbCAzeCBzbG93ZXIgd2hlbiB0YWIgaXMgaGlkZGVuIChidXQgTk9UIGR1cmluZyBQaVAg4oCUIHVzZXIgaXMgc3RpbGwgd2F0Y2hpbmcpCiAgICAgICAgY29uc3Qgc2hvdWxkVGhyb3R0bGUgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmhpZGRlbiAmJiAhZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQ7CiAgICAgICAgY29uc3QgbmV4dERlbGF5ID0gc2hvdWxkVGhyb3R0bGUgPyBQbGF5ZXJCdWZmZXJpbmdEZWxheSAqIDMgOiBQbGF5ZXJCdWZmZXJpbmdEZWxheTsKICAgICAgICBzZXRUaW1lb3V0KG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcsIG5leHREZWxheSk7CiAgICB9CiAgICAvLyBIaWRlIFR3aXRjaCdzIGFkIGJyZWFrIC8gVHVyYm8gcHJvbW8gLyBzdHJlYW0gZGlzcGxheSBhZCBvdmVybGF5cyB3aGVuIHdlJ3JlIGFscmVhZHkgYmxvY2tpbmcgYWRzCiAgICBmdW5jdGlvbiBoaWRlVHdpdGNoQWRPdmVybGF5cygpIHsKICAgICAgICBpZiAoIWNhY2hlZFBsYXllclJvb3REaXYgfHwgIWNhY2hlZFBsYXllclJvb3REaXYuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgICAgICAvLyBIaWRlIHN0cmVhbSBkaXNwbGF5IGFkIChTREEpIHdyYXBwZXIKICAgICAgICBjb25zdCBzZGFFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRlc3Qtc2VsZWN0b3I9InNkYS13cmFwcGVyIl0nKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNkYUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghc2RhRWxlbWVudHNbaV0uZGF0YXNldC50YXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIHNkYUVsZW1lbnRzW2ldLmRhdGFzZXQudGFzSGlkZGVuID0gJyc7CiAgICAgICAgICAgICAgICBzZGFFbGVtZW50c1tpXS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRTZGFIaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VkU2RhSGlkZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSGlkZGVuIFR3aXRjaCBzdHJlYW0gZGlzcGxheSBhZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgaWYgKCFjYWNoZWRQbGF5ZXJSb290RGl2IHx8ICFjYWNoZWRQbGF5ZXJSb290RGl2LmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIGNhY2hlZFBsYXllclJvb3REaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tcGxheWVyJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllclJvb3REaXYgPSBjYWNoZWRQbGF5ZXJSb290RGl2OwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgPSBkYXRhLmlzU3RyaXBwaW5nQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIHBsYXllckJ1ZmZlclN0YXRlLmlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuaGFzQWRzKSB7CiAgICAgICAgICAgICAgICBoaWRlVHdpdGNoQWRPdmVybGF5cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gVHJhdmVyc2UgUmVhY3QncyBmaWJlciB0cmVlIHRvIGZpbmQgVHdpdGNoJ3MgcGxheWVyIGFuZCBwbGF5ZXIgc3RhdGUgaW5zdGFuY2VzCiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgaWYgKCFjYWNoZWRSb290Tm9kZSkgewogICAgICAgICAgICAgICAgY2FjaGVkUm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gY2FjaGVkUm9vdE5vZGU7CiAgICAgICAgICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdCAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCkgewogICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZWFjdFJvb3ROb2RlID09IG51bGwgJiYgcm9vdE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IE9iamVjdC5rZXlzKHJvb3ROb2RlKS5maW5kKHggPT4geC5zdGFydHNXaXRoKCdfX3JlYWN0Q29udGFpbmVyJykgfHwgeC5zdGFydHNXaXRoKCdfX3JlYWN0RmliZXInKSk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlW2NvbnRhaW5lck5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFjdFJvb3ROb2RlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWFjdFJvb3ROb2RlID0gZmluZFJlYWN0Um9vdE5vZGUoKTsKICAgICAgICBpZiAoIXJlYWN0Um9vdE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGxldCBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRQbGF5ZXJBY3RpdmUgJiYgbm9kZS5wcm9wcyAmJiBub2RlLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UpOwogICAgICAgIHBsYXllciA9IHBsYXllciAmJiBwbGF5ZXIucHJvcHMgJiYgcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgPyBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgaWYgKHBsYXllcj8ucGxheWVySW5zdGFuY2UpIHsKICAgICAgICAgICAgcGxheWVyID0gcGxheWVyLnBsYXllckluc3RhbmNlOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCBpZiBUd2l0Y2ggb2JmdXNjYXRlcyBwcm9wZXJ0eSBuYW1lcwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQgJiYgbm9kZS5nZXRCdWZmZXJEdXJhdGlvbiAmJiBub2RlLmNvcmU/LnN0YXRlKTsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2gg4oCUIHNldFNyYyBleGlzdHMgYnV0IHNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzIHdhcyByZW5hbWVkCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjayA9ICFwbGF5ZXJTdGF0ZSA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldFN0cmVhbU1hbmFnZXJOb2RlICYmICFub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQpIDogbnVsbDsKICAgICAgICAvLyBGYWxsYmFjayAyOiBUVFYtQUIncyBhcHByb2FjaCDigJQgdmlkZW9QbGF5ZXJJbnN0YW5jZSB3aXRoIHBsYXllck1vZGUKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMiA9ICFwbGF5ZXJTdGF0ZSAmJiAhcGxheWVyU3RhdGVGYWxsYmFjayA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlPy5wbGF5ZXJNb2RlICE9PSB1bmRlZmluZWQpPy5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgY29uc3QgZmluYWxQbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlIHx8IHBsYXllclN0YXRlRmFsbGJhY2sgfHwgcGxheWVyU3RhdGVGYWxsYmFjazI7CiAgICAgICAgLy8gR3JhY2UgcGVyaW9kIGJlZm9yZSBsb2dnaW5nICJub3QgZm91bmQiIHdhcm5pbmdzLiBUaGUgYnVmZmVyIG1vbml0b3IgY2FuIHRpY2sKICAgICAgICAvLyBiZWZvcmUgUmVhY3QgaGFzIGZpbmlzaGVkIG1vdW50aW5nIHRoZSBwbGF5ZXIsIGxlYWRpbmcgdG8gYSBmYWxzZS1wb3NpdGl2ZQogICAgICAgIC8vIGxvZyB0aGF0IGZpcmVzIG9uY2Ugb24gZXZlcnkgcGFnZSBsb2FkLiBPbmx5IGxvZyBpZiB0aGUgbnVsbCBzdGF0ZSBwZXJzaXN0cwogICAgICAgIC8vIGZvciAxMCsgc2Vjb25kcyDigJQgYnkgdGhlbiBSZWFjdCBpcyBkZWZpbml0ZWx5IG1vdW50ZWQgYW5kIGEgcGVyc2lzdGVudCBudWxsCiAgICAgICAgLy8gaW5kaWNhdGVzIHJlYWwgQVBJIGRyaWZ0IChUd2l0Y2ggcmVuYW1lZCBzZXRQbGF5ZXJBY3RpdmUvc2V0U3JjL2V0YykuCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgaWYgKCFnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCkgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyICYmIChEYXRlLm5vdygpIC0gZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQpID4gMTAwMDApIHsKICAgICAgICAgICAgICAgIGdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFBsYXllckFjdGl2ZS9tZWRpYVBsYXllckluc3RhbmNlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIGlmICghZmluYWxQbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQpIGdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vU3RhdGUgJiYgKERhdGUubm93KCkgLSBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFN0YXRlTnVsbEF0KSA+IDEwMDAwKSB7CiAgICAgICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5sb2dnZWROb1N0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBzdGF0ZSBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFNyYy9zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncycpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RTdGF0ZU51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgLy8gUGF1c2UvcGxheSBvciBmdWxseSByZWxvYWQgdGhlIFR3aXRjaCBwbGF5ZXIsIHByZXNlcnZpbmcgcXVhbGl0eS92b2x1bWUgc2V0dGluZ3MKICAgIGZ1bmN0aW9uIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQsIHJlbG9hZEtpbmQpIHsKICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgaWYgKCFwbGF5ZXJBbmRTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcmVhY3Qgcm9vdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckFuZFN0YXRlLnBsYXllcjsKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IHBsYXllckFuZFN0YXRlLnN0YXRlOwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXInKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXBsYXllclN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXIgc3RhdGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB3YXNQYXVzZWQgPSBwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkOwogICAgICAgIGlmICh3YXNQYXVzZWQpIHsKICAgICAgICAgICAgLy8gVXNlciBkZWxpYmVyYXRlbHkgcGF1c2VkIOKAlCByZXNwZWN0IHRoZWlyIGludGVudCwgZG9uJ3QgYXV0by1yZXN1bWUKICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZXNwZWN0aW5nIHVzZXIgcGF1c2UgaW50ZW50IOKAlCBza2lwcGluZyBhdXRvLXJlc3VtZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIFdFIHJlY2VudGx5IGNhbGxlZCBwYXVzZS9wbGF5IGFuZCBwbGF5ZXIgaXMgc3RpbGwgcGF1c2VkLCByZXRyeSBwbGF5IChzdHVjayBmcm9tIGF1dG9wbGF5IHBvbGljeSBvciBhZC1zdGF0ZSBpbnRlcmZlcmVuY2UpCiAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQpIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXdhc1BhdXNlZCkgewogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgPSAwOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQgJiYgZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQpIHsKICAgICAgICAgICAgLy8gU2tpcCByZWxvYWQgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IGhlYWx0aHkg4oCUIGF2b2lkcyBkaXNydXB0aW5nIHNtb290aCBwbGF5YmFjay4KICAgICAgICAgICAgLy8gQnV0IGlmIHdlJ3JlIHdheSBiZWhpbmQgbGl2ZSBlZGdlIChlLmcuIGFmdGVyIGEgbG9uZyBhZCBicmVhayksIHByb2NlZWQgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeS4KICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5yZWFkeVN0YXRlID49IDMgJiYgIXZpZGVvLnBhdXNlZCAmJiAhdmlkZW8uZW5kZWQpIHsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5U2VjID0gMDsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5S25vd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLnNlZWthYmxlICYmIHZpZGVvLnNlZWthYmxlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vla2FibGVFbmQgPSB2aWRlby5zZWVrYWJsZS5lbmQodmlkZW8uc2Vla2FibGUubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoc2Vla2FibGVFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxjID0gTWF0aC5tYXgoMCwgc2Vla2FibGVFbmQgLSB2aWRlby5jdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2FwOiB2YWx1ZXMgPjFoIGluZGljYXRlIGdhcmJhZ2UgZnJvbSB0aGUgTWVkaWEgU291cmNlIEFQSQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHNlZW4gcmlnaHQgYWZ0ZXIgYSByZWxvYWQgd2hpbGUgdGhlIHNlZWthYmxlIHJhbmdlIGlzIGluIGEgdHJhbnNpZW50IHN0YXRlKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxjIDwgMzYwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lTZWMgPSBjYWxjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lLbm93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgaWYgKCFsYXRlbmN5S25vd24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBMYXRlbmN5IHVua25vd24gKHNlZWthYmxlIHVuYXZhaWxhYmxlKSDigJQgcHJvY2VlZGluZyB3aXRoIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXRlbmN5U2VjID4gNykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBwbGF5aW5nIGJ1dCAnICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kIGxpdmUg4oCUIHByb2NlZWRpbmcgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeScpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIHBsYXllciBoZWFsdGh5IChyZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJywgcGxheWluZywgbGF0ZW5jeT0nICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MpJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1JlbG9hZCkgewogICAgICAgICAgICBjb25zdCBsc0tleVF1YWxpdHkgPSAndmlkZW8tcXVhbGl0eSc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5TXV0ZWQgPSAndmlkZW8tbXV0ZWQnOwogICAgICAgICAgICBjb25zdCBsc0tleVZvbHVtZSA9ICd2b2x1bWUnOwogICAgICAgICAgICBsZXQgY3VycmVudFF1YWxpdHlMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50TXV0ZWRMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50Vm9sdW1lTFMgPSBudWxsOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY3VycmVudFF1YWxpdHlMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5UXVhbGl0eSk7CiAgICAgICAgICAgICAgICBjdXJyZW50TXV0ZWRMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TXV0ZWQpOwogICAgICAgICAgICAgICAgY3VycmVudFZvbHVtZUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlWb2x1bWUpOwogICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgJiYgcGxheWVyPy5jb3JlPy5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBwbGF5ZXIuY29yZS5zdGF0ZS52b2x1bWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlRdWFsaXR5LCBKU09OLnN0cmluZ2lmeSh7ZGVmYXVsdDpwbGF5ZXIuY29yZS5zdGF0ZS5xdWFsaXR5Lmdyb3VwfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmFkU3RhbGxTdGFydEF0ID0gMDsvLyBjbGVhciBzdGFsZSBzdGFsbCB0aW1lciBzbyBwb3N0LXJlbG9hZCByZWFkeVN0YXRlPTAgaXNuJ3QgYXR0cmlidXRlZCB0byBwcmUtcmVsb2FkIHN0YWxsCiAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCA9IGZhbHNlOwogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCA9IGZhbHNlOwogICAgICAgICAgICAvLyBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nIHJlLWFjcXVpcmVkIGZyZXNoIGV2ZXJ5IHRpY2sg4oCUIG5vIG1hbnVhbCBpbnZhbGlkYXRpb24gbmVlZGVkCiAgICAgICAgICAgIC8vIEhhcmQgcmVsb2FkIGZvciAnZWFybHknIChtaWQtYnJlYWsgZXNjYXBlIOKAlCBmcmVzaCBzZXNzaW9uIGdldHMgbmV3IGFkLWRlY2lzaW9uIGJ1Y2tldCkuCiAgICAgICAgICAgIC8vIFNvZnQgcmVsb2FkIGZvciAncG9zdC1hZCcgKHNtb290aCB0cmFuc2l0aW9uLCBubyBibGFjayBzY3JlZW4gdGVhcmRvd24pLgogICAgICAgICAgICBjb25zdCBoYXJkUmVsb2FkID0gcmVsb2FkS2luZCA9PT0gJ2Vhcmx5JzsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlbG9hZGluZyBUd2l0Y2ggcGxheWVyJyArIChoYXJkUmVsb2FkID8gJyAoaGFyZCknIDogJyAoc29mdCknKSk7CiAgICAgICAgICAgIHBsYXllclN0YXRlLnNldFNyYyh7IGlzTmV3TWVkaWFQbGF5ZXJJbnN0YW5jZTogaGFyZFJlbG9hZCwgcmVmcmVzaEFjY2Vzc1Rva2VuOiBoYXJkUmVsb2FkIH0pOwogICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVHJpZ2dlcmVkUGxheWVyUmVsb2FkJyk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICAvLyBBbHdheXMgcmVzdG9yZSBtdXRlZC92b2x1bWUgc3RhdGUgYWZ0ZXIgcmVsb2FkIOKAlCBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBmb3JjZSBtdXRlZC4KICAgICAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgICAgICAvLyBjbGVhcmVkIGNhY2hlKSwgdGhlIHZpZGVvIHN0aWxsIG5lZWRzIHVubXV0ZSBhZnRlciBDaHJvbWUncyBhdXRvcGxheSBtdXRlIG9uIHJlbG9hZC4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWFsaXR5TFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNdXRlZExTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWVMUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCB3cml0ZXMgdmlkZW8tbXV0ZWQgYXMgJ3siZGVmYXVsdCI6dHJ1ZX0nIHdoZW4gdXNlciBtdXRlZCB2aWEgVUk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENocm9tZSBhdXRvcGxheSBwb2xpY3kgY2FuIG11dGUgZXZlbiBpZiB1c2VyIGRpZG4ndCAobm8gTFMgc2lnbmFsKS4KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLm11dGVkICYmICF1c2VySW50ZW5kZWRNdXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0ubXV0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IGxpdmUgZHJpZnQgYWZ0ZXIgcmVsb2FkLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgaGFyZCByZWxvYWQgd2l0aCBsYXJnZSBkcmlmdCAoPjVzKSwgaGFyZC1zZWVrIHRvIGxpdmUgZWRnZSB0byBmbHVzaAogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgQS9WIHRpbWVzdGFtcCBkZXN5bmMgZnJvbSBzdHJpcCtCTEFOS19NUDQrcmVjb3ZlcnkgYWN0aXZpdHkuIERyaWZ0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Rpb24gYXQgMS4xeCB3b3VsZCB0YWtlIG1pbnV0ZXMgdG8gY2F0Y2ggdXAgMzAtNjBzIG9mIGRyaWZ0LgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igc29mdCByZWxvYWQgb3Igc21hbGwgZHJpZnQsIHVzZSBleGlzdGluZyBncmFkdWFsIGNhdGNoLXVwLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLmJ1ZmZlcmVkLmxlbmd0aCA+IDAgJiYgdmlkZW9zWzBdLnJlYWR5U3RhdGUgPj0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGl2ZUVkZ2UgPSB2aWRlb3NbMF0uYnVmZmVyZWQuZW5kKHZpZGVvc1swXS5idWZmZXJlZC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyaWZ0ID0gbGl2ZUVkZ2UgLSB2aWRlb3NbMF0uY3VycmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFyZFJlbG9hZCAmJiBkcmlmdCA+IDUgJiYgTnVtYmVyLmlzRmluaXRlKGxpdmVFZGdlKSAmJiBsaXZlRWRnZSA8IDM2MDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LWhhcmQtcmVsb2FkIHNlZWsgdG8gbGl2ZSDigJQgJyArIGRyaWZ0LnRvRml4ZWQoMSkgKyAncyBiZWhpbmQsIGp1bXBpbmcgdG8gbGl2ZSBlZGdlIHRvIGZsdXNoIEEvViBkcmlmdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5jdXJyZW50VGltZSA9IGxpdmVFZGdlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkcmlmdCA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3N0LXJlbG9hZCBsaXZlIGRyaWZ0IGNvcnJlY3Rpb246ICcgKyBkcmlmdC50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREcmlmdENvcnJlY3Rpb24odmlkZW9zWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIH0sIDMwMDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gKCkgPT4gewogICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSk7CiAgICB9OwogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCBmZXRjaFJlcXVlc3Qub3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICAvLyBIb29rIGZldGNoKCkgaW4gdGhlIHdpbmRvdyBzY29wZSB0byBjYXB0dXJlIGF1dGggaGVhZGVycyBhbmQgbW9kaWZ5IHBsYXllciB0eXBlIHJlcXVlc3RzCiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0LCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBHUUxEZXZpY2VJRCAhPSBkZXZpY2VJZCkgewogICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlRGV2aWNlSWQnLCBHUUxEZXZpY2VJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1WZXJzaW9uJ10gIT09IENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uID0gaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXSAhPT0gQ2xpZW50U2Vzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50U2Vzc2lvbicsIENsaWVudFNlc3Npb24gPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSAhPT0gQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInLCBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddICE9PSBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWRIZWFkZXJzICYmIEdRTERldmljZUlEICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChHUUxEZXZpY2VJRCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VkUGxheWVyVHlwZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gSlNPTi5wYXJzZShpbml0LmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdCb2R5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVwbGFjZWQgJyR7cmVwbGFjZWRQbGF5ZXJUeXBlfScgcGxheWVyIHR5cGUgd2l0aCAnJHtGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZX0nIHBsYXllciB0eXBlYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NhaVR5cGUgPSB1cmwuaW5jbHVkZXMoJ2JwPW1pZHJvbGwnKSA/ICdtaWRyb2xsJyA6IHVybC5pbmNsdWRlcygnYnA9cHJlcm9sbCcpID8gJ3ByZXJvbGwnIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyhjc2FpVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZChjc2FpVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgYWQgcmVxdWVzdCBkZXRlY3RlZCDigJQgdHlwZTogJyArIGNzYWlUeXBlICsgJyAoY2xpZW50LXNpZGUgYWQgaW5zZXJ0aW9uLCBub3QgYmxvY2thYmxlIHZpYSBtM3U4KScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwgJ2ZldGNoJyk7CiAgICB9CiAgICAvLyBTZXQgdXAgdmlzaWJpbGl0eSBvdmVycmlkZXMgYW5kIGxvY2FsU3RvcmFnZSBob29rcyB0byBwcmVzZXJ2ZSBwbGF5ZXIgc3RhdGUgYWNyb3NzIHJlbG9hZHMKICAgIGZ1bmN0aW9uIG9uQ29udGVudExvYWRlZCgpIHsKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldmVudHYtZXh0ZW5zaW9uJykpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2FybmluZzogN1RWIGV4dGVuc2lvbiBkZXRlY3RlZCDigJQgbWF5IGNhdXNlIGJsYWNrIHNjcmVlbiBvciBidWZmZXJpbmcgaXNzdWVzLiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcywgdHJ5IGRpc2FibGluZyA3VFYuJyk7CiAgICAgICAgfQogICAgICAgIC8vIFRoaXMgc3RvcHMgVHdpdGNoIGZyb20gcGF1c2luZyB0aGUgcGxheWVyIHdoZW4gaW4gYW5vdGhlciB0YWIgYW5kIGFuIGFkIHNob3dzLgogICAgICAgIC8vIFRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhdWNldHR2L1ZpZGVvQWRCbG9ja0ZvclR3aXRjaC9ibG9iL2NlZmNlOWQyYjU2NTc2OWM3N2UzNjY2YWM4MjM0YzNhY2ZlMjBkODMvY2hyb21lL2NvbnRlbnQuanMjTDMwCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAndmlzaWJpbGl0eVN0YXRlJywgewogICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAndmlzaWJsZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgbGV0IGhpZGRlbiA9IGRvY3VtZW50Ll9fbG9va3VwR2V0dGVyX18oJ2hpZGRlbicpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2hpZGRlbicsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgY29uc3QgYmxvY2sgPSBlID0+IHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIH07CiAgICAgICAgbGV0IHdhc1ZpZGVvUGxheWluZyA9IHRydWU7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eUNoYW5nZSA9IGUgPT4gewogICAgICAgICAgICBjb25zdCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoaGlkZGVuICYmIGhpZGRlbi5hcHBseShkb2N1bWVudCkgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICB3YXNWaWRlb1BsYXlpbmcgPSAhdmlkZW9zWzBdLnBhdXNlZCAmJiAhdmlkZW9zWzBdLmVuZGVkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnVGFiIGZvY3VzZWQuIFN0cmVhbSBzaG91bGQgYmUgYWN0aXZlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0ucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmxvY2soZSk7CiAgICAgICAgfTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgdHJ5IHsgZG9jdW1lbnQuaGFzRm9jdXMgPSAoKSA9PiB0cnVlOyB9IGNhdGNoe30KICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBkZWNsYXJlT3B0aW9ucyh3aW5kb3cpOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBsc1JlbG9hZEFmdGVyQWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkUGxheWVyQWZ0ZXJBZCcpOwogICAgICAgIGlmIChsc1JlbG9hZEFmdGVyQWQgIT09IG51bGwpIHsKICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IGxzUmVsb2FkQWZ0ZXJBZCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc1JlbG9hZENvb2xkb3duID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZENvb2xkb3duU2Vjb25kcycpKTsKICAgICAgICBpZiAoIWlzTmFOKGxzUmVsb2FkQ29vbGRvd24pICYmIGxzUmVsb2FkQ29vbGRvd24gPj0gMCkgewogICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSBsc1JlbG9hZENvb2xkb3duOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVSZWxvYWRDYXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcCcpOwogICAgICAgIGlmIChsc0Rpc2FibGVSZWxvYWRDYXAgIT09IG51bGwpIHsKICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9IGxzRGlzYWJsZVJlbG9hZENhcCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0RyaWZ0UmF0ZSA9IHBhcnNlRmxvYXQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2RyaWZ0Q29ycmVjdGlvblJhdGUnKSk7CiAgICAgICAgaWYgKCFpc05hTihsc0RyaWZ0UmF0ZSkgJiYgbHNEcmlmdFJhdGUgPj0gMCkgewogICAgICAgICAgICBEcmlmdENvcnJlY3Rpb25SYXRlID0gbHNEcmlmdFJhdGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGxheWVyVHlwZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19wbGF5ZXJUeXBlJyk7CiAgICAgICAgaWYgKGxzUGxheWVyVHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9IGxzUGxheWVyVHlwZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQaW5CYWNrdXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcGluQmFja3VwUGxheWVyVHlwZScpOwogICAgICAgIGlmIChsc1BpbkJhY2t1cCAhPT0gbnVsbCkgewogICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gbHNQaW5CYWNrdXAgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQcmVmZXJMb3cgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcHJlZmVyTG93UXVhbGl0eUJhY2t1cCcpOwogICAgICAgIGlmIChsc1ByZWZlckxvdyA9PT0gJ2ZhbHNlJykgewogICAgICAgICAgICBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgc3RpY2t5IENTQUkgcGF0aCBvbmx5LCBubyBhdXRvcGxheSBmYWxsYmFjayBvciBlc2NhcGUgaGF0Y2gnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNCYWNrdXBTd2FwRmlyc3QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfYmFja3VwU3dhcEZpcnN0Jyk7CiAgICAgICAgaWYgKGxzQmFja3VwU3dhcEZpcnN0ID09PSAnZmFsc2UnKSB7CiAgICAgICAgICAgIEJhY2t1cFN3YXBGaXJzdCA9IGZhbHNlOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXBTd2FwRmlyc3QgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgdXNpbmcgc3RpY2t5IENTQUkgcGF0aCAoc3RyaXAgb24gbmF0aXZlIHN0cmVhbSknKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNIaWRlQWRPdmVybGF5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2hpZGVBZE92ZXJsYXknKTsKICAgICAgICBpZiAobHNIaWRlQWRPdmVybGF5ID09PSAndHJ1ZScpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9ICcudGFzLWFkYmxvY2stb3ZlcmxheSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSc7CiAgICAgICAgICAgIChkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgIH0KICAgIH0gY2F0Y2gge30KICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENvbmZpZzogUmVsb2FkUGxheWVyQWZ0ZXJBZCA9ICcgKyBSZWxvYWRQbGF5ZXJBZnRlckFkICsgJywgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgPSAnICsgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIGlmIChQbGF5ZXJCdWZmZXJpbmdGaXgpIHsKICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7CiAgICB9CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbWV0ZXIgcmVxdWlyZWQgKDAgPSBubyBzaW11bGF0ZWQgYWQsIDErID0gdXNlIGJhY2t1cCBwbGF5ZXIgZm9yIGdpdmVuIGRlcHRoKScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdTaW11bGF0ZUFkcycsIGRlcHRoKTsKICAgIH07CiAgICB3aW5kb3cuYWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gKCkgPT4gewogICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMnKTsKICAgIH07Cn0pKCk7Cg=="},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIGluc3RhbmNlCiAgICAvLyB0aGF0IGZpZ2h0cyBmb3IgcGxheWVyIGNvbnRyb2wuIE9ubHkgdGhlIHRvcCBmcmFtZSBob3N0cyB0aGUgcGxheWVyIG9uIHR3aXRjaC50di9DSEFOTkVMOwogICAgLy8gbmVzdGVkIGF1eGlsaWFyeSBmcmFtZXMgYXJlIG5vaXNlLgogICAgLy8gQWxsb3ctbGlzdCBmb3IgbmVzdGVkLWZyYW1lIGluamVjdGlvbjogVHdpdGNoJ3MgdGhyZWUgZG9jdW1lbnRlZCBlbWJlZCBjb250ZXh0cwogICAgLy8gKGh0dHBzOi8vZGV2LnR3aXRjaC50di9kb2NzL2VtYmVkL3ZpZGVvLWFuZC1jbGlwcy8pIOKAlCBwcmVzZXJ2ZXMgVHdpdGNoIHN0cmVhbXMKICAgIC8vIGVtYmVkZGVkIG9uIHRoaXJkLXBhcnR5IHNpdGVzIHdoZXJlIHRoZSBzY3JpcHQgcnVucyBpbiBhbiBpZnJhbWUgd2hvc2UgcGFyZW50CiAgICAvLyBpcyBvbiBhIGRpZmZlcmVudCBvcmlnaW4uCiAgICAvLyBVc2Ugd2luZG93LmZyYW1lRWxlbWVudCB0byBkZXRlY3QgbmVzdGVkIGZyYW1lcyDigJQgbnVsbCBvbiB0b3AgZnJhbWUsIHRoZSBpZnJhbWUKICAgIC8vIGVsZW1lbnQgb24gYSBzYW1lLW9yaWdpbiBuZXN0ZWQgZnJhbWUsIHRocm93cyBvbiBhIGNyb3NzLW9yaWdpbiBuZXN0ZWQgZnJhbWUuCiAgICAvLyBNb3JlIHJlbGlhYmxlIHRoYW4gJ3dpbmRvdyAhPT0gd2luZG93LnRvcCcgYmVjYXVzZSBUYW1wZXJtb25rZXkgd3JhcHMgd2luZG93IGluIGEKICAgIC8vIHByb3h5IHdoZXJlIHRoZSBzdHJpY3QgY29tcGFyaXNvbiBjYW4gcmV0dXJuIHRydWUgZXZlbiBvbiB0aGUgdG9wIGZyYW1lLgogICAgbGV0IF9pc05lc3RlZCA9IGZhbHNlOwogICAgdHJ5IHsgX2lzTmVzdGVkID0gd2luZG93LmZyYW1lRWxlbWVudCAhPT0gbnVsbDsgfSBjYXRjaCAoX2UpIHsgX2lzTmVzdGVkID0gdHJ1ZTsgfQogICAgaWYgKF9pc05lc3RlZCkgewogICAgICAgIGNvbnN0IF9ob3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2lzRW1iZWRDb250ZXh0ID0gX2hvc3QgPT09ICdwbGF5ZXIudHdpdGNoLnR2JyB8fCBfaG9zdCA9PT0gJ2VtYmVkLnR3aXRjaC50dicgfHwgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2VtYmVkLycpOwogICAgICAgIGlmICghX2lzRW1iZWRDb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZpZGVvLXN3YXAtbmV3IHNraXBwZWQg4oCUIG5lc3RlZCBmcmFtZSBvbiAnICsgX2hvc3QgKyBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSArICcgKG5vdCBhIFR3aXRjaCBlbWJlZCkuIElmIHlvdSBzZWUgdGhpcyBvbiB0d2l0Y2gudHYvQ0hBTk5FTCB0b3AgZnJhbWUsIHBsZWFzZSByZXBvcnQuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSA0NzsvLyBVc2VkIHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3V0ZGF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNjcmlwdHMKICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFR3aXRjaEFkU29sdXRpb25zIHZpZGVvLXN3YXAtbmV3IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZpZGVvLXN3YXAtbmV3IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBza2lwcGVkIOKAlCBhbm90aGVyIHNjcmlwdCBhbHJlYWR5IGFjdGl2ZSAodicgKyB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJykuIFJlbW92ZSBkdXBsaWNhdGUgc2NyaXB0cy4nKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uOwogICAgZnVuY3Rpb24gZGVjbGFyZU9wdGlvbnMoc2NvcGUpIHsKICAgICAgICAvLyBPcHRpb25zIC8gZ2xvYmFscwogICAgICAgIC8vICdlbWJlZCcgbW92ZWQgdG8gZW5kIOKAlCBmaWVsZC1vYnNlcnZlZCBUd2l0Y2ggcmV0dXJucyBHUUwgJ3NlcnZlciBlcnJvcicgZm9yCiAgICAgICAgLy8gc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBvbiBlbWJlZCB3aGVuIHJlcXVlc3RlZCBmcm9tIHR3aXRjaC50diBvcmlnaW4uCiAgICAgICAgc2NvcGUuT1BUX0JBQ0tVUF9QTEFZRVJfVFlQRVMgPSBbICdwb3BvdXQnLCAnbW9iaWxlX3dlYicsICdlbWJlZCcgXTsKICAgICAgICBzY29wZS5PUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFID0gJ3BvcG91dCc7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guCiAgICAgICAgc2NvcGUuQURfU0lHTklGSUVSUyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIiddOwogICAgICAgIHNjb3BlLkFEX1NFR01FTlRfVVJMX1BBVFRFUk5TID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24uCiAgICAgICAgc2NvcGUuVFdJVENIX0FEX1VSTF9SRVdSSVRFX1JFR0VYID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVVJJX0FUVFJJQlVURV9SRUdFWCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5MSVZFX1NJR05JRklFUiA9ICcsbGl2ZSc7CiAgICAgICAgc2NvcGUuQ0xJRU5UX0lEID0gJ2tpbW5lNzhreDNuY3g2YnJnbzRtdjZ3a2k1aDFrbyc7CiAgICAgICAgLy8gVGhlc2UgYXJlIG9ubHkgcmVhbGx5IGZvciBXb3JrZXIgc2NvcGUuLi4KICAgICAgICBzY29wZS5TdHJlYW1JbmZvcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3NCeVVybCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgLy8gTmVlZCB0aGlzIGluIGJvdGggc2NvcGVzLiBXaW5kb3cgc2NvcGUgbmVlZHMgdG8gdXBkYXRlIHRoaXMgdG8gd29ya2VyIHNjb3BlLgogICAgICAgIHNjb3BlLmdxbF9kZXZpY2VfaWQgPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudEludGVncml0eUhlYWRlciA9IG51bGw7CiAgICAgICAgc2NvcGUuQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZDsKICAgICAgICBzY29wZS5TaW11bGF0ZWRBZHNEZXB0aCA9IDA7CiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IHRydWU7Ly8gQWZ0ZXIgdGhlIGFkIGZpbmlzaGVzIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5SZWxvYWRDb29sZG93blNlY29uZHMgPSAzMDsvLyBNaW5pbXVtIHNlY29uZHMgYmV0d2VlbiByZWxvYWRzIOKAlCBicmVha3MgQ1NBSSBjYXNjYWRlcyB0cmlnZ2VyZWQgYnkgcmVsb2FkCiAgICAgICAgc2NvcGUuRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gNTsvLyBBbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIGVhcmx5IHJlbG9hZCAofjJzIGVhY2gsIHNvIDUgPSB+MTBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gZmFsc2U7Ly8gSWYgdHJ1ZSwgcmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvTWF4QWdlTXMgPSAzMCAqIDYwICogMTAwMDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIEVuY29kaW5nczogbnVsbCwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzOiBudWxsLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NTdGF0dXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4OiAtMSwKICAgICAgICAgICAgUGlubmVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgSGFzQ2hlY2tlZFVua25vd25UYWdzOiBmYWxzZSwKICAgICAgICAgICAgSGFzQ29uZmlybWVkQWRBdHRyczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICAgICAgSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3M6IGZhbHNlLAogICAgICAgICAgICBJc01pZHJvbGw6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIENsZWFuUGxheWxpc3RDb3VudDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3M6IDAsCiAgICAgICAgICAgIFVzZUZhbGxiYWNrU3RyZWFtOiBmYWxzZSwKICAgICAgICAgICAgTGFzdENsZWFuTmF0aXZlTTNVODogbnVsbCwKICAgICAgICAgICAgTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZFRyaWdnZXJlZDogZmFsc2UsCiAgICAgICAgICAgIExhc3RQbGF5ZXJSZWxvYWQ6IDAsCiAgICAgICAgICAgIFJlbG9hZFRpbWVzdGFtcHM6IFtdLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBtYXNrQXNOYXRpdmUoZm4sIG5hbWUpIHsKICAgICAgICBmbi50b1N0cmluZyA9ICgpID0+ICdmdW5jdGlvbiAnICsgbmFtZSArICcoKSB7IFtuYXRpdmUgY29kZV0gfSc7CiAgICAgICAgcmV0dXJuIGZuOwogICAgfQogICAgZnVuY3Rpb24gcHJ1bmVTdHJlYW1JbmZvcygpIHsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIGZvciAoY29uc3QgY2hhbm5lbE5hbWUgaW4gU3RyZWFtSW5mb3MpIHsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLkxhc3RTZWVuQXQgfHwgKG5vdyAtIHN0cmVhbUluZm8uTGFzdFNlZW5BdCkgPiBTdHJlYW1JbmZvTWF4QWdlTXMpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvICYmIHN0cmVhbUluZm8uVXJscykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJscy5mb3JFYWNoKChfLCB1cmwpID0+IHsgZGVsZXRlIFN0cmVhbUluZm9zQnlVcmxbdXJsXTsgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWxldGUgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY29uc3QgbG9nZ2VkQ3NhaVR5cGVzID0gbmV3IFNldCgpOwogICAgbGV0IHR3aXRjaFBsYXllckFuZFN0YXRlID0gbnVsbDsKICAgIGxldCBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gZmFsc2U7CiAgICBsZXQgbGFzdFJlbG9hZFRpbWVzdGFtcCA9IDA7CiAgICBsZXQgcmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgbGV0IEVzY2FsYXRlZEZyb21Db29sZG93biA9IG51bGw7Ly8gdHJhY2tzIHByZS1lc2NhbGF0aW9uIHZhbHVlIHNvIHdlIGNhbiByZXZlcnQgd2hlbiB0aGUgYnVyc3Qgc3Vic2lkZXMKICAgIGNvbnN0IHR3aXRjaFdvcmtlcnMgPSBbXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0NvbmZsaWN0cyA9IFsKICAgICAgICAndHdpdGNoJywKICAgICAgICAnaXNWYXJpYW50QScvLyBUd2l0Y2hOb1N1YgogICAgXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0FsbG93ID0gW107CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkgJiYgIXdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocGFyZW50LCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOwogICAgICAgICAgICBwYXJlbnQgPSByZWluc2VydFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVmFsaWRXb3JrZXIod29ya2VyKSB7CiAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gd29ya2VyLnRvU3RyaW5nKCk7CiAgICAgICAgY29uc3QgaGFzQ29uZmxpY3QgPSB3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBjb25zdCBoYXNBbGxvdyA9IHdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgY29uc3QgaGFzUmVpbnNlcnQgPSB3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGlmIChoYXNDb25mbGljdCAmJiAhaGFzQWxsb3cgJiYgIWhhc1JlaW5zZXJ0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciByZWplY3RlZCDigJQgY29uZmxpY3Qgc3RyaW5nIGZvdW5kOiAnICsgd29ya2VyU3RyaW5nQ29uZmxpY3RzLmZpbHRlcigoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKS5qb2luKCcsICcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFoYXNDb25mbGljdCB8fCBoYXNBbGxvdyB8fCBoYXNSZWluc2VydDsKICAgIH0KICAgIGxldCBpbmplY3RlZEJsb2JVcmwgPSBudWxsOwogICAgZnVuY3Rpb24gaG9va1dpbmRvd1dvcmtlcigpIHsKICAgICAgICAvLyBQcmV2ZW50IFR3aXRjaCBmcm9tIHJldm9raW5nIG91ciBpbmplY3RlZCB3b3JrZXIgYmxvYiBVUkwKICAgICAgICBpZiAoIVVSTC5yZXZva2VPYmplY3RVUkwuX190YXNNYXNrZWQpIHsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwgPSBVUkwucmV2b2tlT2JqZWN0VVJMOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKHVybCkgewogICAgICAgICAgICAgICAgaWYgKHVybCA9PT0gaW5qZWN0ZWRCbG9iVXJsKSByZXR1cm47CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxSZXZva2VPYmplY3RVUkwuY2FsbCh0aGlzLCB1cmwpOwogICAgICAgICAgICB9LCAncmV2b2tlT2JqZWN0VVJMJyk7CiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwuX190YXNNYXNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWluc2VydCA9IGdldFdvcmtlcnNGb3JSZWluc2VydCh3aW5kb3cuV29ya2VyKTsKICAgICAgICBjb25zdCBuZXdXb3JrZXIgPSBjbGFzcyBXb3JrZXIgZXh0ZW5kcyAoZ2V0Q2xlYW5Xb3JrZXIod2luZG93LldvcmtlcikgfHwgd2luZG93LldvcmtlcikgewogICAgICAgICAgICBjb25zdHJ1Y3Rvcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBsZXQgaXNUd2l0Y2hXb3JrZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaXNUd2l0Y2hXb3JrZXIgPSBuZXcgVVJMKHR3aXRjaEJsb2JVcmwpLm9yaWdpbi5lbmRzV2l0aCgnLnR3aXRjaC50dicpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFpc1R3aXRjaFdvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5vbi1Ud2l0Y2ggd29ya2VyIHNraXBwZWQ6ICcgKyB0d2l0Y2hCbG9iVXJsKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBQcmUtY2hlY2s6IHZlcmlmeSB3ZSBjYW4gZmV0Y2ggdGhlIHdvcmtlciBKUyBiZWZvcmUgaW5qZWN0aW5nCiAgICAgICAgICAgICAgICBsZXQgcHJlZmV0Y2hlZFdvcmtlckpzID0gbnVsbDsKICAgICAgICAgICAgICAgIHRyeSB7IHByZWZldGNoZWRXb3JrZXJKcyA9IGdldFdhc21Xb3JrZXJKcyh0d2l0Y2hCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFwcmVmZXRjaGVkV29ya2VySnMpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYWlsZWQgdG8gZmV0Y2ggd29ya2VyIEpTIOKAlCBmYWxsaW5nIGJhY2sgdG8gdW5tb2RpZmllZCB3b3JrZXInKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgaW50ZXJjZXB0ZWQg4oCUIGluamVjdGluZyBhZC1ibG9jayBob29rcycpOwogICAgICAgICAgICAgICAgY29uc3QgbmV3QmxvYlN0ciA9IGAKICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nRmV0Y2hSZXF1ZXN0cyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICAke2hhc0FkVGFncy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0TWF0Y2hlZEFkU2lnbmlmaWVycy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c3RyaXBBZFNlZ21lbnRzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwcm9jZXNzTTNVOC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7aG9va1dvcmtlckZldGNoLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtkZWNsYXJlT3B0aW9ucy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0QWNjZXNzVG9rZW4udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dxbFJlcXVlc3QudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3BhcnNlQXR0cmlidXRlcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c2V0U3RyZWFtSW5mb1VybHMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke29uRm91bmRBZC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0V2FzbVdvcmtlckpzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3JlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHt1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwcnVuZVN0cmVhbUluZm9zLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtjcmVhdGVTdHJlYW1JbmZvLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gZ2V0V2FzbVdvcmtlckpzKCcke3R3aXRjaEJsb2JVcmwucmVwbGFjZUFsbCgiJyIsICIlMjciKX0nKTsKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlT3B0aW9ucyhzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuX190YXNQcnVuZUludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX190YXNQcnVuZUludGVydmFsID0gc2V0SW50ZXJ2YWwocHJ1bmVTdHJlYW1JbmZvcywgNSAqIDYwICogMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSAke1JlbG9hZFBsYXllckFmdGVyQWR9OwogICAgICAgICAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9ICR7UmVsb2FkQ29vbGRvd25TZWNvbmRzfTsKICAgICAgICAgICAgICAgICAgICBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSAke0Vhcmx5UmVsb2FkUG9sbFRocmVzaG9sZH07CiAgICAgICAgICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9ICR7UGluQmFja3VwUGxheWVyVHlwZX07CiAgICAgICAgICAgICAgICAgICAgT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSA9ICcke09QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEV9JzsKICAgICAgICAgICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gJHtncWxfZGV2aWNlX2lkID8gIiciICsgZ3FsX2RldmljZV9pZCArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSAke0F1dGhvcml6YXRpb25IZWFkZXIgPyAiJyIgKyBBdXRob3JpemF0aW9uSGVhZGVyICsgIiciIDogdW5kZWZpbmVkfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSAke0NsaWVudEludGVncml0eUhlYWRlciA/ICInIiArIENsaWVudEludGVncml0eUhlYWRlciArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1VwZGF0ZURldmljZUlkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRmV0Y2hSZXNwb25zZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVzcG9uc2VEYXRhLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCB0aW1lb3V0SWQgfSA9IHBlbmRpbmdGZXRjaFJlcXVlc3RzLmdldChyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXNwb25zZURhdGEuZXJyb3IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcmVzcG9uc2UgZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSB0YWtlcyBzdGF0dXMvc3RhdHVzVGV4dC9oZWFkZXJzIOKAlCB1cmwvcmVkaXJlY3RlZC90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UuIElWUyBXQVNNIHZhbGlkYXRlcyB0aGVzZSAoU3BhZGUvdHJhY2tpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMpIGFuZCB0aHJvd3MgTmV0d29ya0Vycm9yIGlmIHRoZXkncmUgbWlzc2luZyDigJQgVFRWLUFCIHY2LjMuNSBmaXguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHJlc3BvbnNlRGF0YS5ib2R5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlRGF0YS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZURhdGEuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlRGF0YS5oZWFkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2VEYXRhLnVybCB8fCAnJywgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAncmVkaXJlY3RlZCcsIHsgdmFsdWU6ICEhcmVzcG9uc2VEYXRhLnJlZGlyZWN0ZWQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNwb25zZSwgJ3R5cGUnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudHlwZSB8fCAnYmFzaWMnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1NpbXVsYXRlQWRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltdWxhdGVkQWRzRGVwdGggPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU2ltdWxhdGVkQWRzRGVwdGg6ICcgKyBTaW11bGF0ZWRBZHNEZXB0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gIUFsbFNlZ21lbnRzQXJlQWRTZWdtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM6ICcgKyBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaG9va1dvcmtlckZldGNoKCk7CiAgICAgICAgICAgICAgICAgICAgZXZhbCh3b3JrZXJTdHJpbmcpOwogICAgICAgICAgICAgICAgYAogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVYm9VcGRhdGVBZEJhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcihlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUGF1c2VSZXN1bWVQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9hZFR3aXRjaFBsYXllcih0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5rZXkgPT0gJ0ZldGNoUmVxdWVzdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hSZXF1ZXN0ID0gZXZlbnQuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gV29ya2VyIGNyYXNoIHJlY292ZXJ5IOKAlCBJVlMgV0FTTSB3b3JrZXIgY2FuIGZpcmUgUnVudGltZUVycm9yCiAgICAgICAgICAgICAgICAvLyAoZS5nLiAiaW5kZXggb3V0IG9mIGJvdW5kcyIpIGFuZCBkaWUuIEEgc2luZ2xlIGNyYXNoIGZpcmVzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAvLyBlcnJvciBldmVudHM7IGRlZHVwZSB2aWEgYSBsb2NhbCBmbGFnLiBPbiBmaXJzdCBlcnJvciwgdHJpZ2dlciBhCiAgICAgICAgICAgICAgICAvLyBwbGF5ZXIgcmVsb2FkIOKAlCBUd2l0Y2ggcmUtc3Bhd25zIHRoZSB3b3JrZXIgYXMgcGFydCBvZiB0aGUgbmV3CiAgICAgICAgICAgICAgICAvLyBwbGF5ZXIgaW5zdGFuY2UsIGFuZCBleGlzdGluZyByZWxvYWQgY29vbGRvd24gcHJldmVudHMgcmVzdGFydCBsb29wcy4KICAgICAgICAgICAgICAgIGxldCBjcmFzaGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3Jhc2hlZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNyYXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIElWUyBXQVNNIHdvcmtlciBjcmFzaGVkOiAnICsgKChlICYmIGUubWVzc2FnZSkgfHwgJ3Vua25vd24gZXJyb3InKSArICcg4oCUIHRyaWdnZXJpbmcgcGxheWVyIHJlbG9hZCB0byByZWNvdmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmVsb2FkVHdpdGNoUGxheWVyKGZhbHNlKTsgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBjcmFzaCByZWNvdmVyeSBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHdvcmtlckluc3RhbmNlID0gcmVpbnNlcnRXb3JrZXJzKG5ld1dvcmtlciwgcmVpbnNlcnQpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdXb3JrZXInLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VySW5zdGFuY2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkV29ya2VyKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdvcmtlckluc3RhbmNlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIHNldCB0d2l0Y2ggd29ya2VyIGRlbmllZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCkgewogICAgICAgIGlmICghZ2V0V2FzbVdvcmtlckpzLmNhY2hlKSB7CiAgICAgICAgICAgIGdldFdhc21Xb3JrZXJKcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0pIHsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc21Xb3JrZXJKcy5jYWNoZVt0d2l0Y2hCbG9iVXJsXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICBjb25zdCB0ZXh0ID0gcmVxLnJlc3BvbnNlVGV4dDsKICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF0gPSB0ZXh0OwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFtSW5mb1VybHMoc3RyZWFtSW5mbywgZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGNvbnN0IGxpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIHYyIEFQSSB2YXJpYW50IFVSTHMgYXJlIHJhdyBDRE4gVVJMcyB3aXRob3V0ICcubTN1OCcgaW4gdGhlIHBhdGguCiAgICAgICAgICAgIC8vIEFjY2VwdCBhYnNvbHV0ZSBVUkxzIChjb250YWluaW5nICc6Ly8nKSBhbG9uZ3NpZGUgJy5tM3U4JyBVUkxzLgogICAgICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZXNbaV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKHRyaW1tZWQgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aCgnIycpICYmICh0cmltbWVkLmluY2x1ZGVzKCcubTN1OCcpIHx8IHRyaW1tZWQuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NCeVVybFtsaW5lc1tpXS50cmltRW5kKCldID0gc3RyZWFtSW5mbzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuZXh0TGluZSA9IGxpbmVzW2kgKyAxXT8udHJpbSgpOwogICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBuZXh0TGluZSAmJiAhbmV4dExpbmUuc3RhcnRzV2l0aCgnIycpICYmIChuZXh0TGluZS5pbmNsdWRlcygnLm0zdTgnKSB8fCBuZXh0TGluZS5pbmNsdWRlcygnOi8vJykpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBhdHRyaWJ1dGVzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHV0aW9uOiByZXNvbHV0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBGcmFtZVJhdGU6IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgVXJsOiBsaW5lc1tpICsgMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXJscy5zZXQobGluZXNbaSArIDFdLnRyaW1FbmQoKSwgcmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKSB7CiAgICAgICAgY29uc3QgaXNTaG93aW5nQWQgPSAhIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzOwogICAgICAgIGlmICghaXNTaG93aW5nQWQgJiYgKHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzIHx8IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBmYWxzZTsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIGtleTogJ1Vib1VwZGF0ZUFkQmFubmVyJywKICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgaGFzQWRzOiBpc1Nob3dpbmdBZCwKICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cywKICAgICAgICAgICAgbnVtU3RyaXBwZWRBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cywKICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXggPj0gMCA/IE9QVF9CQUNLVVBfUExBWUVSX1RZUEVTW3N0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4XSA6IG51bGwKICAgICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCByZWxvYWRQbGF5ZXIsIHJlYWxGZXRjaCwgdXJsLCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGxldCByZXN1bHQgPSB0ZXh0U3RyOwogICAgICAgIHN0cmVhbUluZm8uSXNNaWRyb2xsID0gdGV4dFN0ci5pbmNsdWRlcygnIk1JRFJPTEwiJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnIm1pZHJvbGwiJyk7CiAgICAgICAgLy8gVHJhY2sgaGlnaC1jb25maWRlbmNlIGFkIG1hcmtlcnMgdG8gZGlzdGluZ3Vpc2ggcmVhbCBhZHMgZnJvbSBmYWxzZS1wb3NpdGl2ZSBzaWduaWZpZXIgbWF0Y2hlcy4KICAgICAgICAvLyBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50IG9uIGV2ZXJ5IHJlYWwgVHdpdGNoIGFkIGFuZCBhYnNlbnQgZnJvbSBhbnl0aGluZyB0aGF0IGNvdWxkCiAgICAgICAgLy8gZmFsc2UtcG9zaXRpdmUgKGUuZy4gbWV0YWRhdGEgY29udGFpbmluZyB0aGUgd29yZCAnc3RpdGNoZWQnKS4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMgPSB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTicpOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGF5ZXJUeXBlcyA9IFsuLi5PUFRfQkFDS1VQX1BMQVlFUl9UWVBFU107CiAgICAgICAgLy8gVHJ5IHBpbm5lZCBiYWNrdXAgcGxheWVyIHR5cGUgZmlyc3QgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgKFBpbkJhY2t1cFBsYXllclR5cGUgJiYgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gcGxheWVyVHlwZXMuaW5kZXhPZihzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICBpZiAocGlubmVkSW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlcy5zcGxpY2UocGlubmVkSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgcGxheWVyVHlwZXMudW5zaGlmdChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5zaXplID49IHBsYXllclR5cGVzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzICYmICFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncy5pbmNsdWRlcyh1cmwpKSB7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYmFja3VwU2VhcmNoU3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgIGxldCBiYWNrdXBQbGF5ZXJUeXBlSW5mbyA9ICcnOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxheWVyVHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgcGxheWVyVHlwZSA9IHBsYXllclR5cGVzW2ldOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmhhcyhwbGF5ZXJUeXBlKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2UgIT0gbnVsbCAmJiBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvckJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXJyb3JCb2R5ID0gJyDigJQgJyArIChhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLnRleHQoKSkuc3Vic3RyaW5nKDAsIDIwMCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWNjZXNzIHRva2VuIEhUVFAgJyArIGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHBsYXllclR5cGUgKyAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDQwMyA/ICcgKGludGVncml0eTogJyArIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPyAncHJlc2VudCcgOiAnbWlzc2luZycpICsgJyknIDogJycpICsgZXJyb3JCb2R5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2UgIT0gbnVsbCAmJiBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB7IGRhdGE6IHsgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjogey4uLn0gfSB9IChtb3N0IHBsYXllciB0eXBlcykKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB7IHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW46IHsuLi59IH0gKGZsYXR0ZXIsIG9ic2VydmVkIGZvciAnZW1iZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGF0ID0gYWNjZXNzVG9rZW4/LmRhdGE/LnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gfHwgYWNjZXNzVG9rZW4/LnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3BhdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCByZXNwb25zZSBtaXNzaW5nIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gZm9yICcgKyBwbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmxJbmZvLnNlYXJjaFBhcmFtcy5zZXQoJ3NpZycsIHNwYXQuc2lnbmF0dXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIHNwYXQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVXNoZXIgSFRUUCAnICsgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyBwbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlICE9IG51bGwgJiYgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RpbmdzTTN1OCA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja1RleHRTdHIgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0FkVGFncyhiYWNrVGV4dFN0cikgJiYgKFNpbXVsYXRlZEFkc0RlcHRoID09IDAgfHwgaSA+PSBTaW11bGF0ZWRBZHNEZXB0aCAtIDEpKSB8fCBpID49IHBsYXllclR5cGVzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmFja1RleHRTdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGVJbmZvID0gJyAoJyArIHBsYXllclR5cGUgKyAnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNldChwbGF5ZXJUeXBlLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGluQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gcGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FbmNvZGluZ3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG93IHJlc29sdXRpb24gc3RyZWFtcyB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHJlc29sdXRpb25zIGluIHRoZSBVSS4gVG8gZml4IHRoaXMgd2UgbWVyZ2UgdGhlIGxvdyByZXMgVVJMcyBpbnRvIHRoZSBtYWluIG0zdTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbEVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkVuY29kaW5nczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbExpbmVzID0gbm9ybWFsRW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9ybWFsTGluZXMubGVuZ3RoIC0gMTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbExpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobm9ybWFsTGluZXNbal0uc3Vic3RyaW5nKG5vcm1hbExpbmVzW2pdLmluZGV4T2YoJzonKSArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzVXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCBzdHJlYW1JbmZvLlVybHMuZ2V0KG5vcm1hbExpbmVzW2ogKyAxXS50cmltRW5kKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzSW5mID0gZW5jb2RpbmdzTTN1OC5tYXRjaChuZXcgUmVnRXhwKGBeLiooPz1cbi4qJHtsb3dSZXNVcmx9KWAsICdtJykpPy5bMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG93UmVzSW5mKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobG93UmVzSW5mLnN1YnN0cmluZyhsb3dSZXNJbmYuaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtYXAgJyArIHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ10gKyAnIHRvICcgKyBsb3dSZXNTZXR0aW5nc1snUkVTT0xVVElPTiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzU2V0dGluZ3NbY29kZWNzS2V5XSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0gPT09ICdzdHJpbmcnICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNTZXR0aW5nc1tjb2RlY3NLZXldLmxlbmd0aCA+PSAzICYmIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0ubGVuZ3RoID49IDMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2hldicpIHx8IHJlc1NldHRpbmdzW2NvZGVjc0tleV0uc3RhcnRzV2l0aCgnaHZjJykpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN1YnN0cmluZygwLCAzKSAhPT0gbG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdWJzdHJpbmcoMCwgMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3dhcCAnICsgcmVzU2V0dGluZ3NbY29kZWNzS2V5XSArICcgdG8gJyArIGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTGluZXNbal0gPSBub3JtYWxMaW5lc1tqXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XX0iYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhub3JtYWxMaW5lc1tqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTGluZXNbaiArIDFdID0gbG93UmVzVXJsICsgJyAnLnJlcGVhdChqICsgMSk7Ly8gVGhlIHN0cmVhbSBkb2Vzbid0IGxvYWQgdW5sZXNzIGVhY2ggdXJsIGxpbmUgaXMgdW5pcXVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzTTN1OCA9IG5vcm1hbExpbmVzLmpvaW4oJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPSBlbmNvZGluZ3NNM3U4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyB9CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuZ2V0KHBsYXllclR5cGUpID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNldChwbGF5ZXJUeXBlLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zb2xlLmxvZygnRm91bmQgYWRzLCBzd2l0Y2ggdG8gYmFja3VwJyArIGJhY2t1cFBsYXllclR5cGVJbmZvICsgJyBpbiAnICsgKERhdGUubm93KCkgLSBiYWNrdXBTZWFyY2hTdGFydCkgKyAnbXMg4oCUIHNpZ25pZmllcnM6ICcgKyBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpLmpvaW4oJywgJykpOwogICAgICAgIGlmIChyZWxvYWRQbGF5ZXIpIHsKICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBRF9TSUdOSUZJRVJTLnNvbWUoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFEX1NJR05JRklFUlMuZmlsdGVyKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFEX1NJR05JRklFUlMgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzKSB7CiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIGxldCBzbTsKICAgICAgICAgICAgY29uc3QgY2xhc3NSZSA9IC9FWFQtWC1EQVRFUkFOR0U6W15cbl0qQ0xBU1M9Iih0d2l0Y2gtW14iXSspIi9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gY2xhc3NSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0iJyArIHNtWzFdICsgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB0YWdSZSA9IC8oU0NURTM1LVtBLVotXSt8RVhULVgtQ1VFLVtBLVotXSspL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSB0YWdSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoc21bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN1YnN0cmluZyBjaGVjayAobm90IGV4YWN0KTogYSBjYW5kaWRhdGUgaXMgImtub3duIiBpZiBhbnkgQURfU0lHTklGSUVSCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4gIUFEX1NJR05JRklFUlMuc29tZShzID0+IGMuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQURfU0lHTklGSUVSUzogJyArIHVua25vd24uam9pbignLCAnKSArICcgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAvLyBUcmFjayBTQ1RFLTM1IENVRS1PVVQvQ1VFLUlOIGFkIGJvdW5kYXJpZXMKICAgICAgICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1PVVQnKSkgewogICAgICAgICAgICAgICAgaWYgKCFpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLU9VVCDigJQgYWQgYm91bmRhcnkgZW50ZXJlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1JTicpKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1JTiDigJQgYWQgYm91bmRhcnkgZXhpdGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmFja2luZyB1cmxzIHdoaWNoIGFwcGVhciBpbiB0aGUgb3ZlcmxheSBVSQogICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmUucmVwbGFjZUFsbChUV0lUQ0hfQURfVVJMX1JFV1JJVEVfUkVHRVgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmICghbGluZS5pbmNsdWRlcygnLGxpdmUnKSB8fCBzdHJpcEFsbFNlZ21lbnRzIHx8IEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyB8fCBpbkN1ZU91dCkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRVcmwgPSBsaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICBpZiAoIUFkU2VnbWVudENhY2hlLmhhcyhzZWdtZW50VXJsKSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoc2VnbWVudFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IGxpbmVzW2kgKyAxXS5pbmNsdWRlcyhwKSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHNlZ21lbnQgZGV0ZWN0ZWQgdmlhIFVSTCBwYXR0ZXJuOiAnICsgbGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChsaW5lc1tpICsgMV0sIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZS5pbmNsdWRlcygnLGxpdmUnKSkgewogICAgICAgICAgICAgICAgbGl2ZVNlZ21lbnRzLnB1c2goeyBleHRpbmY6IGxpbmUsIHVybDogbGluZXNbaSArIDFdIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBBUlQ6JykpIHsKICAgICAgICAgICAgICAgIC8vIExMLUhMUyBwYXJ0OiBVUkkgaXMgaW5saW5lIGFzIGFuIGF0dHJpYnV0ZS4gU3RyaXAgaWYgaXQgbWF0Y2hlcyBhIGtub3duCiAgICAgICAgICAgICAgICAvLyBhZCBVUkwgKGFscmVhZHkgaW4gY2FjaGUgZnJvbSBhIHBhcmFsbGVsIEVYVElORiBzdHJpcCwgb3IgbWF0Y2hlcyBhIFVSTCBwYXR0ZXJuKS4KICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllciBtYXkgdXNlIHRoZSBwYXJ0cyBwYXRoIHRvIGZldGNoIGFkIG1lZGlhIHZpYSBsb3ctbGF0ZW5jeS4KICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmlNYXRjaCA9IGxpbmUubWF0Y2goVVJJX0FUVFJJQlVURV9SRUdFWCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBRF9TRUdNRU5UX1VSTF9QQVRURVJOUy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBBRF9TSUdOSUZJRVJTLnNvbWUoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpKSB7CiAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLy8gTm8gbG93IGxhdGVuY3kgZHVyaW5nIGFkcyAob3RoZXJ3aXNlIGl0J3MgcG9zc2libGUgZm9yIHRoZSBwbGF5ZXIgdG8gcHJlZmV0Y2ggYW5kIGRpc3BsYXkgYWQgc2VnbWVudHMpCiAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSB8fCBsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtUFJFTE9BRC1ISU5UOicpKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID0gMDsKICAgICAgICB9CiAgICAgICAgLy8gQ2FjaGUgbGl2ZSBzZWdtZW50cyBmb3IgcmVjb3ZlcnkgKHBsdXMgdGhlIE1FRElBLVNFUVVFTkNFIG9mIHRoZSBvbGRlc3QgY2FjaGVkIHNlZ21lbnQsCiAgICAgICAgLy8gc28gdGhlIHBsYXllciBhY2NlcHRzIGluamVjdGVkIHJlY292ZXJ5IHNlZ21lbnRzIGFzIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0pCiAgICAgICAgaWYgKGxpdmVTZWdtZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyA9IGxpdmVTZWdtZW50cy5zbGljZSgtNik7CiAgICAgICAgICAgIGNvbnN0IHNlcSA9IHBhcnNlSW50KCh0ZXh0U3RyLm1hdGNoKC8jRVhULVgtTUVESUEtU0VRVUVOQ0U6KFxkKykvKSB8fCBbXSlbMV0pOwogICAgICAgICAgICBpZiAoIWlzTmFOKHNlcSkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcSA9IHNlcSArIE1hdGgubWF4KDAsIGxpdmVTZWdtZW50cy5sZW5ndGggLSBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiBhbGwgc2VnbWVudHMgd2VyZSBzdHJpcHBlZCwgdHJ5IHRvIHByZXZlbnQgYmxhY2sgc2NyZWVuIHZpYSByZWNvdmVyeSBjb250ZW50LgogICAgICAgIC8vIFByZWZlciB0aGUgZnVsbC1wbGF5bGlzdCBzbmFwc2hvdCBmcm9tIGEgcmVjZW50IG5vbi1hZCBwb2xsIChtaXJyb3JzIFRUVi1BQgogICAgICAgIC8vIExhc3RDbGVhbk5hdGl2ZU0zVTggYXBwcm9hY2gpIOKAlCBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIHdvcnRoIG9mCiAgICAgICAgLy8gY29udGVudCB2cyB0aGUgdGhpbiBwZXItc2VnbWVudCByZWNvdmVyeSBjYWNoZS4gRmFsbHMgYmFjayB0byB0aGUgcGVyLXNlZ21lbnQKICAgICAgICAvLyBjYWNoZSBpZiB0aGUgc25hcHNob3QgaXMgc3RhbGUgb3IgbWlzc2luZy4KICAgICAgICBpZiAoaGFzU3RyaXBwZWRBZFNlZ21lbnRzICYmIGxpdmVTZWdtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgPSAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgKyAxOwogICAgICAgICAgICBjb25zdCByZWNvdmVyeVRoaW4gPSAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzPy5sZW5ndGggfHwgMCkgPCAzOwogICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVUaHJlc2hvbGQgPSByZWNvdmVyeVRoaW4gPyAxIDogRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkOwogICAgICAgICAgICBpZiAoRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID4gMCAmJiBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc3QgcmVhc29uID0gcmVjb3ZlcnlUaGluID8gJyAodGhpbiByZWNvdmVyeSBjYWNoZTogJyArIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSArICcgc2VnbWVudHMpJyA6ICcnOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHRyaWdnZXJlZCDigJQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzICsgJyBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMnICsgcmVhc29uKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnVWJvUmVsb2FkUGxheWVyJyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBQcmltYXJ5OiBmcmVzaCBmdWxsLXBsYXlsaXN0IHNuYXBzaG90ICg8IDEuNXMgb2xkLCBtdXN0IG5vdCBpdHNlbGYgY29udGFpbiBhZCBtYXJrZXJzKQogICAgICAgICAgICBjb25zdCBzbmFwc2hvdEFnZSA9IHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA/IChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0KSA6IEluZmluaXR5OwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4ICYmIHNuYXBzaG90QWdlIDw9IDE1MDAgJiYgIWhhc0FkVGFncyhzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTgpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJldXNpbmcgbGFzdCBjbGVhbiBuYXRpdmUgcGxheWxpc3QgKCcgKyBzbmFwc2hvdEFnZSArICdtcyBvbGQpJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlIChleGlzdGluZyBiZWhhdmlvcikKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyAmJiBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXN0b3JpbmcgJyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggKyAnIHJlY292ZXJ5IHNlZ21lbnRzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKCcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2pdID0gJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonICsgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLmV4dGluZik7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0udXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIC8vIFRocm90dGxlIGNhY2hlIHBydW5lIHRvIG9uY2UgcGVyIDYwcy4gVGhlIDEyMHMgVFRMIGdpdmVzIHBsZW50eSBvZiBoZWFkcm9vbQogICAgICAgIC8vIGFuZCBzY2FubmluZyB0aGUgZnVsbCBjYWNoZSBvbiBldmVyeSBtM3U4IHBvbGwgYWRkcyB1cCBkdXJpbmcgaGVhdnkgYWQgYnJlYWsKICAgICAgICAvLyBzZXF1ZW5jZXMgKExMLUhMUyBjYW4gcG9sbCBtdWx0aXBsZSB0aW1lcyBwZXIgc2Vjb25kKS4gUG9ydGVkIGZyb20gVFRWLUFCLgogICAgICAgIGlmICghc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgfHwgbm93IC0gc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPiA2MDAwMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA9IG5vdzsKICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSwgbWFwKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBub3cgLSAxMjAwMDApIHsKICAgICAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBEaWFnbm9zdGljOiBsb2cgb25jZSBwZXIgc3RyZWFtSW5mbyB3aGVuIHRoZSBjYWNoZSBjcm9zc2VzIDEwMDAgZW50cmllcywKICAgICAgICAgICAgLy8gc28gY2FjaGUgYmxvYXQgZnJvbSBhIGZ1dHVyZSBUVEwvcHJ1bmUgYnVnIHdvdWxkIHN1cmZhY2UgaW4gdXNlciByZXBvcnRzCiAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc3RheWluZyBpbnZpc2libGUuCiAgICAgICAgICAgIGlmIChBZFNlZ21lbnRDYWNoZS5zaXplID4gMTAwMCAmJiAhc3RyZWFtSW5mby5Mb2dnZWRBZENhY2hlU2l6ZTFrKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEFkQ2FjaGVTaXplMWsgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTZWdtZW50Q2FjaGUgY3Jvc3NlZCAxMDAwIGVudHJpZXMgKG5vdyAnICsgQWRTZWdtZW50Q2FjaGUuc2l6ZSArICcpIOKAlCBwb3NzaWJsZSBjYWNoZSBibG9hdCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcbicpOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBjb25zdCBjdXJyZW50UmVzb2x1dGlvbiA9IHN0cmVhbUluZm8uVXJscy5nZXQodXJsKTsKICAgICAgICBpZiAoIWN1cnJlbnRSZXNvbHV0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzQ2hlY2tlZFVua25vd25UYWdzID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgdW5rbm93bkFkVGFncyA9IHRleHRTdHIubWF0Y2goLyNFWFRbXjpcbl0qKD86YWR8Y3VlfHNjdGV8c3BvbnNvcilbXjpcbl0qL2dpKTsKICAgICAgICAgICAgaWYgKHVua25vd25BZFRhZ3MpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSB1bmtub3duQWRUYWdzLmZpbHRlcih0ID0+ICFBRF9TSUdOSUZJRVJTLnNvbWUocyA9PiB0LmluY2x1ZGVzKHMpKSk7CiAgICAgICAgICAgICAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVW5rbm93biBhZC1yZWxhdGVkIHRhZ3MgZm91bmQ6ICcgKyBbLi4ubmV3IFNldCh1bmtub3duKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgaGF2ZUFkVGFncyA9IGhhc0FkVGFncyh0ZXh0U3RyKSB8fCAoU2ltdWxhdGVkQWRzRGVwdGggPiAwICYmICghc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgfHwgIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLmluY2x1ZGVzKHVybCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggLSAxID4gc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXgpKTsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB2cyB0aGUgMS0yIGNhY2hlZCBpbmRpdmlkdWFsIHNlZ21lbnRzLgogICAgICAgIC8vIE1pcnJvcnMgVFRWLUFCIHNyYy9tb2R1bGVzL3Byb2Nlc3Nvci50czo3MzMtNzM2LgogICAgICAgIGlmICghaGF2ZUFkVGFncyAmJiAhc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgJiYgdGV4dFN0ci5pbmRleE9mKCcjRVhUSU5GJykgIT09IC0xKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCA9IHRleHRTdHI7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA9IERhdGUubm93KCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gc3RyZWFtSW5mby5FbmNvZGluZ3MubWF0Y2goL15odHRwczouKlwubTN1OCQvbSk/LlswXTsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdTggPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdTggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGlmICghaGFzQWRUYWdzKHN0cmVhbU0zdTgpICYmIFNpbXVsYXRlZEFkc0RlcHRoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGxheWxpc3QgaGFzIGxpdmUgc2VnbWVudHMg4oCUIGlmIG5vdCwgYmFja3VwIHN0cmVhbSBpcyBkZWFkCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0xpdmVTZWdtZW50cyA9IHRleHRTdHIuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gMiB8fCAhaGFzTGl2ZVNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gaGFzIG5vIGxpdmUgc2VnbWVudHMg4oCUIGZvcmNpbmcgaW1tZWRpYXRlIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIG1vcmUgYWRzIG9uIG1haW4gc3RyZWFtLiBTdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLiAnICsgKFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVHJpZ2dlcmluZyBwbGF5ZXIgcmVsb2FkIHRvIGdvIGJhY2sgdG8gbWFpbiBzdHJlYW0uLi4nIDogJ1Jlc3VtaW5nIHBsYXliYWNrLi4uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRzIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPT09IDAgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbU0zdTguaW5jbHVkZXMoJyJNSURST0xMIicpICYmICFzdHJlYW1NM3U4LmluY2x1ZGVzKCcibWlkcm9sbCInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBzdHJlYW1NM3U4LnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKExJVkVfU0lHTklGSUVSKSAmJiAhc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuaGFzKGxpbmVzW2kgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVxdWVzdCBvbmUgLnRzIGZpbGUgcGVyIC5tM3U4IHJlcXVlc3QgdG8gYXZvaWQgbWFraW5nIHRvbyBtYW55IHJlcXVlc3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdGZXRjaCBhZCAudHMgZmlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuYWRkKGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ibG9iKCkpLmNhdGNoKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyAmJiBoYXZlQWRUYWdzKSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUsIHJlYWxGZXRjaCwgdXJsLCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGhhdmVBZFRhZ3MgJiYgIXN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MpIHsKICAgICAgICAgICAgLy8gQ1NBSSBmYXN0IHBhdGg6IGlmIGFsbCBzZWdtZW50cyBpbiB0aGUgbWFpbiBzdHJlYW0gYXJlIGxpdmUsIHNraXAgYmFja3VwIHNlYXJjaC4KICAgICAgICAgICAgLy8gQ1NBSSBhZHMgYXJlIGRlbGl2ZXJlZCBvdXRzaWRlIHRoZSBtM3U4IOKAlCB0aGUgbWFpbiBzdHJlYW0gc2VnbWVudHMgYXJlIGNsZWFuLgogICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1haW4gc3RyZWFtIGRpcmVjdGx5LCBhdm9pZGluZyB0aGUgYmFja3VwIHN0cmVhbSBzd2l0Y2ggdGhhdCBjYXVzZXMKICAgICAgICAgICAgLy8gYSAyMC00MHMgcmVidWZmZXIgZ2FwLgogICAgICAgICAgICBjb25zdCBtYWluU3RyZWFtTGluZXMgPSB0ZXh0U3RyLnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICBsZXQgaGFzTm9uTGl2ZVNlZ21lbnQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWluU3RyZWFtTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtYWluU3RyZWFtTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVElORicpICYmICFtYWluU3RyZWFtTGluZXNbaV0uaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzTm9uTGl2ZVNlZ21lbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFzTm9uTGl2ZVNlZ21lbnQpIHsKICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBmYXN0IHBhdGgg4oCUIGFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUsIHJlYWxGZXRjaCwgdXJsLCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgZmFsc2UsIHN0cmVhbUluZm8pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pOwogICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgfQogICAgZnVuY3Rpb24gaG9va1dvcmtlckZldGNoKCkgewogICAgICAgIGNvbnNvbGUubG9nKCdob29rV29ya2VyRmV0Y2ggKHZpZGVvLXN3YXAtbmV3KScpOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IGZldGNoOwogICAgICAgIGZldGNoID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLmhhcyh1cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2goJ2RhdGE6dmlkZW8vbXA0O2Jhc2U2NCxBQUFBS0daMGVYQnRjRFF5QUFBQUFXbHpiMjF0Y0RReVpHRnphR0YyWXpGcGMyODJhR3h6WmdBQUJFbHRiMjkyQUFBQWJHMTJhR1FBQUFBQUFBQUFBQUFBQUFBQUFZYWdBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQUFBQnFIUnlZV3NBQUFCY2RHdG9aQUFBQUFNQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFVUnRaR2xoQUFBQUlHMWthR1FBQUFBQUFBQUFBQUFBQUFBQUFMdUFBQUFBQUZYRUFBQUFBQUF0YUdSc2NnQUFBQUFBQUFBQWMyOTFiZ0FBQUFBQUFBQUFBQUFBQUZOdmRXNWtTR0Z1Wkd4bGNnQUFBQUR2YldsdVpnQUFBQkJ6Yldoa0FBQUFBQUFBQUFBQUFBQWtaR2x1WmdBQUFCeGtjbVZtQUFBQUFBQUFBQUVBQUFBTWRYSnNJQUFBQUFFQUFBQ3pjM1JpYkFBQUFHZHpkSE5rQUFBQUFBQUFBQUVBQUFCWGJYQTBZUUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FRQUFBQUFMdUFBQUFBQUFBelpYTmtjd0FBQUFBRGdJQ0FJZ0FCQUFTQWdJQVVRQlVBQUFBQUFBQUFBQUFBQUFXQWdJQUNFWkFHZ0lDQUFRSUFBQUFRYzNSMGN3QUFBQUFBQUFBQUFBQUFFSE4wYzJNQUFBQUFBQUFBQUFBQUFCUnpkSE42QUFBQUFBQUFBQUFBQUFBQUFBQUFFSE4wWTI4QUFBQUFBQUFBQUFBQUFlVjBjbUZyQUFBQVhIUnJhR1FBQUFBREFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFvQUFBQUZvQUFBQUFBR0JiV1JwWVFBQUFDQnRaR2hrQUFBQUFBQUFBQUFBQUFBQUFBOUNRQUFBQUFCVnhBQUFBQUFBTFdoa2JISUFBQUFBQUFBQUFIWnBaR1VBQUFBQUFBQUFBQUFBQUFCV2FXUmxiMGhoYm1Sc1pYSUFBQUFCTEcxcGJtWUFBQUFVZG0xb1pBQUFBQUVBQUFBQUFBQUFBQUFBQUNSa2FXNW1BQUFBSEdSeVpXWUFBQUFBQUFBQUFRQUFBQXgxY213Z0FBQUFBUUFBQU94emRHSnNBQUFBb0hOMGMyUUFBQUFBQUFBQUFRQUFBSkJoZG1NeEFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW9BQmFBQklBQUFBU0FBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHUC8vQUFBQU9tRjJZME1CVFVBZS8rRUFJMmROUUI2V1VvRkFYL0xnTFVCQVFGQUFBRDZBQUE2bURnQUFIb1FBQTlDVzd5NEtBUUFFYU91UElBQUFBQkJ6ZEhSekFBQUFBQUFBQUFBQUFBQVFjM1J6WXdBQUFBQUFBQUFBQUFBQUZITjBjM29BQUFBQUFBQUFBQUFBQUFBQUFBQVFjM1JqYndBQUFBQUFBQUFBQUFBQVNHMTJaWGdBQUFBZ2RISmxlQUFBQUFBQUFBQUJBQUFBQVFBQUFDNEFBQUFBQW9BQUFBQUFBQ0IwY21WNEFBQUFBQUFBQUFJQUFBQUJBQUNDTlFBQUFBQUNRQUFBJywgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXJsID0gdXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0ciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gU3RyaW5nKGVycj8ubWVzc2FnZSB8fCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj8ubmFtZSAhPT0gJ0Fib3J0RXJyb3InICYmICEvY2FuY2VsfGFib3J0L2kudGVzdChlcnJNc2cpKSBjb25zb2xlLmxvZygnZmV0Y2ggaG9vayBlcnIgJyArIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gKG5ldyBVUkwodXJsKSkucGF0aG5hbWUubWF0Y2goLyhbXlwvXSspKD89XC5cdyskKS8pPy5bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdwYXJlbnRfZG9tYWlucycpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB0ZW1wVXJsLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBGaXJzdCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggd2l0aCB0aGUgdmlkZW8gZW5jb2RpbmdzICgzNjBwLDQ4MHAsNzIwcCxldGMpLgogICAgICAgICAgICAgICAgICAgICAgICAvLyAtIFNlY29uZCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBvYnRhaW5lZCBpbiB0aGUgZmlyc3QgcmVxdWVzdC4gQXQgdGhpcyBwb2ludCB3ZSB3aWxsIGtub3cgaWYgdGhlcmUncyBhZHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzICE9IG51bGwgJiYgKGF3YWl0IHJlYWxGZXRjaChzdHJlYW1JbmZvLkVuY29kaW5ncy5tYXRjaCgvXmh0dHBzOi4qXC5tM3U4JC9tKT8uWzBdKSkuc3RhdHVzICE9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgZW5jb2RpbmdzIGFyZSBkZWFkICh0aGUgc3RyZWFtIHByb2JhYmx5IHJlc3RhcnRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZXJUaW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCB8fCBzdHJlYW1JbmZvLkVuY29kaW5ncyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0gY3JlYXRlU3RyZWFtSW5mbyhjaGFubmVsTmFtZSwgKG5ldyBVUkwodXJsKSkuc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gc3RyZWFtSW5mby5VcmxzLnZhbHVlcygpLm5leHQoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2gocmVzb2x1dGlvbkluZm8uVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OCA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3Moc3RyZWFtTTN1OCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbkZvdW5kQWQoc3RyZWFtSW5mbywgc3RyZWFtTTN1OCwgZmFsc2UsIHJlYWxGZXRjaCwgcmVzb2x1dGlvbkluZm8uVXJsLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0cmVhbU0zdThSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW5jb2RpbmdzTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2ZXJUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPyBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA6IHN0cmVhbUluZm8uRW5jb2RpbmdzLCBzZXJ2ZXJUaW1lKSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgoZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvI0VYVC1YLVNFU1NJT04tREFUQTpEQVRBLUlEPSJTRVJWRVItVElNRSIsVkFMVUU9IihbXiJdKykiLyk7CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgnU0VSVkVSLVRJTUU9IihbMC05Ll0rKSInKTsKICAgICAgICByZXR1cm4gbWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDEgPyBtYXRjaGVzWzFdIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4KGVuY29kaW5nc00zdTgsIG5ld1NlcnZlclRpbWUpIHsKICAgICAgICBpZiAoVjJBUEkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ld1NlcnZlclRpbWUgPyBlbmNvZGluZ3NNM3U4LnJlcGxhY2UoLygjRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKVteIl0rKCIpLywgYCQxJHtuZXdTZXJ2ZXJUaW1lfSQyYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZShuZXcgUmVnRXhwKCcoU0VSVkVSLVRJTUU9IilbMC05Ll0rIicpLCBgU0VSVkVSLVRJTUU9IiR7bmV3U2VydmVyVGltZX0iYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgfQogICAgZnVuY3Rpb24gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGNvbnN0IGVuY29kaW5nc0xpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBbdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodF0gPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uLnNwbGl0KCd4JykubWFwKE51bWJlcik7CiAgICAgICAgbGV0IG1hdGNoZWRSZXNvbHV0aW9uVXJsID0gbnVsbDsKICAgICAgICBsZXQgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZhbHNlOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IGNsb3Nlc3RSZXNvbHV0aW9uRGlmZmVyZW5jZSA9IEluZmluaXR5OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RpbmdzTGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIC8vIEFjY2VwdCB2MiBBUEkgdmFyaWFudCBVUkxzIChyYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnKS4KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGVuY29kaW5nc0xpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhlbmNvZGluZ3NMaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgY29uc3QgZnJhbWVSYXRlID0gYXR0cmlidXRlc1snRlJBTUUtUkFURSddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbiA9PSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uICYmICghbWF0Y2hlZFJlc29sdXRpb25VcmwgfHwgKCFtYXRjaGVkRnJhbWVSYXRlICYmIGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRnJhbWVSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oY2hhbm5lbE5hbWUsIHBsYXllclR5cGUpIHsKICAgICAgICBjb25zdCByZWFsUGxheWVyVHlwZSA9IHBsYXllclR5cGUucmVwbGFjZSgnLUFMVCcsICcnKTsKICAgICAgICBjb25zdCBib2R5ID0gewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUGxheWJhY2tBY2Nlc3NUb2tlbicsCiAgICAgICAgICAgIHZhcmlhYmxlczogewogICAgICAgICAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgbG9naW46IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgaXNWb2Q6IGZhbHNlLAogICAgICAgICAgICAgICAgdm9kSUQ6ICIiLAogICAgICAgICAgICAgICAgcGxheWVyVHlwZTogcmVhbFBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSk7CiAgICB9CiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHksIHBsYXllclR5cGUpIHsKICAgICAgICBpZiAoIWdxbF9kZXZpY2VfaWQpIHsKICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9ICcnOwogICAgICAgICAgICBjb25zdCBjaGFycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlkJzogQ0xJRU5UX0lELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkLAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSkKICAgICAgICB9OwogICAgICAgIGlmIChwbGF5ZXJUeXBlLmluY2x1ZGVzKCctQUxUJykpIHsKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgICdDbGllbnQtSWQnOiBDTElFTlRfSUQsCiAgICAgICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0geC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArMSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXQogICAgICAgICAgICAgICAgfSkpOwogICAgfQogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCBmZXRjaFJlcXVlc3Qub3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0LCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBncWxfZGV2aWNlX2lkICE9IGRldmljZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgPSBkZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1Vib1VwZGF0ZURldmljZUlkJywgZ3FsX2RldmljZV9pZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddICE9PSBDbGllbnRJbnRlZ3JpdHlIZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicsIENsaWVudEludGVncml0eUhlYWRlciA9IGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9PT0gJ3N0cmluZycgJiYgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gIT09IEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUF1dGhvcml6YXRpb25IZWFkZXInLCBBdXRob3JpemF0aW9uSGVhZGVyID0gaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEhlYWRlcnMgJiYgZ3FsX2RldmljZV9pZCAmJiBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xvZ2dlZEhlYWRlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBHUUwgaGVhZGVycyBjYXB0dXJlZCDigJQgRGV2aWNlSWQ6ICcgKyAoZ3FsX2RldmljZV9pZCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZWRQbGF5ZXJUeXBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0JvZHkgPSBKU09OLnBhcnNlKGluaXQuYm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0JvZHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0JvZHkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keVtpXT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9keS52YXJpYWJsZXMucGxheWVyVHlwZSA9IE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlcGxhY2VkICcke3JlcGxhY2VkUGxheWVyVHlwZX0nIHBsYXllciB0eXBlIHdpdGggJyR7T1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRX0nIHBsYXllciB0eXBlYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NhaVR5cGUgPSB1cmwuaW5jbHVkZXMoJ2JwPW1pZHJvbGwnKSA/ICdtaWRyb2xsJyA6IHVybC5pbmNsdWRlcygnYnA9cHJlcm9sbCcpID8gJ3ByZXJvbGwnIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyhjc2FpVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZChjc2FpVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgYWQgcmVxdWVzdCBkZXRlY3RlZCDigJQgdHlwZTogJyArIGNzYWlUeXBlICsgJyAoY2xpZW50LXNpZGUgYWQgaW5zZXJ0aW9uLCBub3QgYmxvY2thYmxlIHZpYSBtM3U4KScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwgJ2ZldGNoJyk7CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVBZGJsb2NrQmFubmVyKGRhdGEpIHsKICAgICAgICBjb25zdCBwbGF5ZXJSb290RGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLXBsYXllcicpOwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICghdHdpdGNoUGxheWVyQW5kU3RhdGU/LnBsYXllcj8uY29yZSB8fCAhdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgdHdpdGNoUGxheWVyQW5kU3RhdGUgPSBnZXRQbGF5ZXJBbmRTdGF0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaXNMaXZlID0gdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlPy5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QLnRleHRDb250ZW50ID0gJ0Jsb2NraW5nJyArIChkYXRhLmlzTWlkcm9sbCA/ICcgbWlkcm9sbCcgOiAnJykgKyAnIGFkcycgKyAoZGF0YS5pc1N0cmlwcGluZ0FkU2VnbWVudHMgPyAnIChzdHJpcHBpbmcpJyA6ICcnKSArIChkYXRhLmFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPyAnICgnICsgZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlICsgJyknIDogJycpOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gZGF0YS5oYXNBZHMgJiYgaXNMaXZlID8gJ2Jsb2NrJyA6ICdub25lJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG1vbml0b3JMaXZlU3RhdHVzKCkgewogICAgICAgIGlmICghdHdpdGNoUGxheWVyQW5kU3RhdGU/LnBsYXllcj8uY29yZSB8fCAhdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlKSB7CiAgICAgICAgICAgIHR3aXRjaFBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaXNMaXZlID0gdHdpdGNoUGxheWVyQW5kU3RhdGU/LnN0YXRlPy5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnOwogICAgICAgIGlmICghaXNMaXZlKSB7CiAgICAgICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXIoewogICAgICAgICAgICAgICAgaGFzQWRzOiBmYWxzZQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dChtb25pdG9yTGl2ZVN0YXR1cywgMTAwMCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lciAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVhY3RSb290Tm9kZSA9PSBudWxsICYmIHJvb3ROb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBPYmplY3Qua2V5cyhyb290Tm9kZSkuZmluZCh4ID0+IHguc3RhcnRzV2l0aCgnX19yZWFjdENvbnRhaW5lcicpIHx8IHguc3RhcnRzV2l0aCgnX19yZWFjdEZpYmVyJykpOwogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZVtjb250YWluZXJOYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhY3RSb290Tm9kZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVhY3RSb290Tm9kZSA9IGZpbmRSZWFjdFJvb3ROb2RlKCk7CiAgICAgICAgaWYgKCFyZWFjdFJvb3ROb2RlKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBQcmltYXJ5OiBuYW1lZCBwcm9wZXJ0eSBsb29rdXAKICAgICAgICBsZXQgcGxheWVyID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0UGxheWVyQWN0aXZlICYmIG5vZGUucHJvcHMgJiYgbm9kZS5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlKTsKICAgICAgICBwbGF5ZXIgPSBwbGF5ZXIgJiYgcGxheWVyLnByb3BzICYmIHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlID8gcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgIGlmIChwbGF5ZXI/LnBsYXllckluc3RhbmNlKSB7CiAgICAgICAgICAgIHBsYXllciA9IHBsYXllci5wbGF5ZXJJbnN0YW5jZTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2ggaWYgVHdpdGNoIG9iZnVzY2F0ZXMgcHJvcGVydHkgbmFtZXMKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5nZXRIVE1MVmlkZW9FbGVtZW50ICYmIG5vZGUuZ2V0QnVmZmVyRHVyYXRpb24gJiYgbm9kZS5jb3JlPy5zdGF0ZSk7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGNvbnN0IHBsYXllclN0YXRlID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0U3JjICYmIG5vZGUuc2V0SW5pdGlhbFBsYXliYWNrU2V0dGluZ3MpOwogICAgICAgIC8vIEZhbGxiYWNrOiBzdHJ1Y3R1cmFsIG1hdGNoIOKAlCBzZXRTcmMgZXhpc3RzIGJ1dCBzZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyB3YXMgcmVuYW1lZAogICAgICAgIGNvbnN0IHBsYXllclN0YXRlRmFsbGJhY2sgPSAhcGxheWVyU3RhdGUgPyBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRTdHJlYW1NYW5hZ2VyTm9kZSAmJiAhbm9kZS5nZXRIVE1MVmlkZW9FbGVtZW50KSA6IG51bGw7CiAgICAgICAgLy8gRmFsbGJhY2sgMjogVFRWLUFCJ3MgYXBwcm9hY2gg4oCUIHZpZGVvUGxheWVySW5zdGFuY2Ugd2l0aCBwbGF5ZXJNb2RlCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjazIgPSAhcGxheWVyU3RhdGUgJiYgIXBsYXllclN0YXRlRmFsbGJhY2sgPyBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZT8ucGxheWVyTW9kZSAhPT0gdW5kZWZpbmVkKT8uc3RhdGU/LnZpZGVvUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgIGNvbnN0IGZpbmFsUGxheWVyU3RhdGUgPSBwbGF5ZXJTdGF0ZSB8fCBwbGF5ZXJTdGF0ZUZhbGxiYWNrIHx8IHBsYXllclN0YXRlRmFsbGJhY2syOwogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVsb2FkVHdpdGNoUGxheWVyKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgY29uc3QgcGxheWVyQW5kU3RhdGUgPSBnZXRQbGF5ZXJBbmRTdGF0ZSgpOwogICAgICAgIGlmICghcGxheWVyQW5kU3RhdGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHJlYWN0IHJvb3QnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXI7CiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBwbGF5ZXJBbmRTdGF0ZS5zdGF0ZTsKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCFwbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyIHN0YXRlJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllci5pc1BhdXNlZCgpIHx8IHBsYXllci5jb3JlPy5wYXVzZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzUGF1c2VQbGF5ICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA+IDApIHsKICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY29uc3QgY29vbGRvd25NcyA9IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDEwMDA7CiAgICAgICAgICAgIGlmIChsYXN0UmVsb2FkVGltZXN0YW1wICYmIG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXAgPCBjb29sZG93bk1zKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIGNvb2xkb3duIGFjdGl2ZSAoJyArIE1hdGgucm91bmQoKGNvb2xkb3duTXMgLSAobm93IC0gbGFzdFJlbG9hZFRpbWVzdGFtcCkpIC8gMTAwMCkgKyAncyByZW1haW5pbmcpJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVsb2FkVGltZXN0YW1wcy5wdXNoKG5vdyk7CiAgICAgICAgICAgIGNvbnN0IGZpdmVNaW5BZ28gPSBub3cgLSAzMDAwMDA7CiAgICAgICAgICAgIHdoaWxlIChyZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA+IDAgJiYgcmVsb2FkVGltZXN0YW1wc1swXSA8IGZpdmVNaW5BZ28pIHsgcmVsb2FkVGltZXN0YW1wcy5zaGlmdCgpOyB9CiAgICAgICAgICAgIGlmIChyZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA+PSAzICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA8IDkwKSB7CiAgICAgICAgICAgICAgICBFc2NhbGF0ZWRGcm9tQ29vbGRvd24gPSBSZWxvYWRDb29sZG93blNlY29uZHM7CiAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSA5MDsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEF1dG8tZXNjYWxhdGVkIHJlbG9hZCBjb29sZG93biB0byA5MHMgKDMrIHJlbG9hZHMgaW4gNSBtaW51dGVzKScpOwogICAgICAgICAgICB9IGVsc2UgaWYgKEVzY2FsYXRlZEZyb21Db29sZG93biAhPT0gbnVsbCAmJiByZWxvYWRUaW1lc3RhbXBzLmxlbmd0aCA8IDMpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIERlLWVzY2FsYXRlZCByZWxvYWQgY29vbGRvd24gYmFjayB0byAnICsgRXNjYWxhdGVkRnJvbUNvb2xkb3duICsgJ3MgKGJ1cnN0IHN1YnNpZGVkKScpOwogICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gRXNjYWxhdGVkRnJvbUNvb2xkb3duOwogICAgICAgICAgICAgICAgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0UmVsb2FkVGltZXN0YW1wID0gbm93OwogICAgICAgIH0KICAgICAgICBpZiAoaXNQYXVzZVBsYXkpIHsKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudCkgewogICAgICAgICAgICAvLyBEb3duZ3JhZGUgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAg4oCUIHNldFNyYyBleGl0cyBQaVAKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEb3duZ3JhZGVkIHJlbG9hZCB0byBwYXVzZS9wbGF5IHRvIHByZXNlcnZlIFBpUCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzS2V5UXVhbGl0eSA9ICd2aWRlby1xdWFsaXR5JzsKICAgICAgICBjb25zdCBsc0tleU11dGVkID0gJ3ZpZGVvLW11dGVkJzsKICAgICAgICBjb25zdCBsc0tleVZvbHVtZSA9ICd2b2x1bWUnOwogICAgICAgIGxldCBjdXJyZW50UXVhbGl0eUxTID0gbnVsbDsKICAgICAgICBsZXQgY3VycmVudE11dGVkTFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50Vm9sdW1lTFMgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGN1cnJlbnRRdWFsaXR5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVF1YWxpdHkpOwogICAgICAgICAgICBjdXJyZW50TXV0ZWRMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TXV0ZWQpOwogICAgICAgICAgICBjdXJyZW50Vm9sdW1lTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVZvbHVtZSk7CiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIHBsYXllci5jb3JlLnN0YXRlLnZvbHVtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLnF1YWxpdHkuZ3JvdXB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgcGxheWVyLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgIC8vIGNsZWFyZWQgY2FjaGUpLCB0aGUgdmlkZW8gc3RpbGwgbmVlZHMgdW5tdXRlIGFmdGVyIENocm9tZSdzIGF1dG9wbGF5IG11dGUgb24gcmVsb2FkLgogICAgICAgIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHdyaXRlcyB2aWRlby1tdXRlZCBhcyAneyJkZWZhdWx0Ijp0cnVlfScgd2hlbiB1c2VyIG11dGVkIHZpYSBVSTsKICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID4gMCAmJiB2aWRlb3NbMF0ubXV0ZWQgJiYgIXVzZXJJbnRlbmRlZE11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRlbnRMb2FkZWQoKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXZlbnR2LWV4dGVuc2lvbicpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6IDdUViBleHRlbnNpb24gZGV0ZWN0ZWQg4oCUIG1heSBjYXVzZSBibGFjayBzY3JlZW4gb3IgYnVmZmVyaW5nIGlzc3Vlcy4gSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMsIHRyeSBkaXNhYmxpbmcgN1RWLicpOwogICAgICAgIH0KICAgICAgICAvLyBUaGlzIHN0b3BzIFR3aXRjaCBmcm9tIHBhdXNpbmcgdGhlIHBsYXllciB3aGVuIGluIGFub3RoZXIgdGFiIGFuZCBhbiBhZCBzaG93cy4KICAgICAgICAvLyBUYWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXVjZXR0di9WaWRlb0FkQmxvY2tGb3JUd2l0Y2gvYmxvYi9jZWZjZTlkMmI1NjU3NjljNzdlMzY2NmFjODIzNGMzYWNmZTIwZDgzL2Nocm9tZS9jb250ZW50LmpzI0wzMAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Zpc2libGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9Y2F0Y2h7fQogICAgICAgIGxldCBoaWRkZW4gPSBkb2N1bWVudC5fX2xvb2t1cEdldHRlcl9fKCdoaWRkZW4nKTsKICAgICAgICBsZXQgd2Via2l0SGlkZGVuID0gZG9jdW1lbnQuX19sb29rdXBHZXR0ZXJfXygnd2Via2l0SGlkZGVuJyk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnaGlkZGVuJywgewogICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfWNhdGNoe30KICAgICAgICBjb25zdCBibG9jayA9IGUgPT4gewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgfTsKICAgICAgICBsZXQgd2FzVmlkZW9QbGF5aW5nID0gdHJ1ZTsKICAgICAgICBjb25zdCB2aXNpYmlsaXR5Q2hhbmdlID0gZSA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hyb21lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuLmFwcGx5KGRvY3VtZW50KSA9PT0gdHJ1ZSB8fCAod2Via2l0SGlkZGVuICYmIHdlYmtpdEhpZGRlbi5hcHBseShkb2N1bWVudCkgPT09IHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhc1ZpZGVvUGxheWluZyA9ICF2aWRlb3NbMF0ucGF1c2VkICYmICF2aWRlb3NbMF0uZW5kZWQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YXNWaWRlb1BsYXlpbmcgJiYgIXZpZGVvc1swXS5lbmRlZCAmJiB2aWRlb3NbMF0ucGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBibG9jayhlKTsKICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96dmlzaWJpbGl0eWNoYW5nZScsIHZpc2liaWxpdHlDaGFuZ2UsIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc0ZvY3VzJywgYmxvY2ssIHRydWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICgvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnbW96SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnd2Via2l0SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfWNhdGNoe30KICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gcmVsb2FkVHdpdGNoUGxheWVyOwogICAgZGVjbGFyZU9wdGlvbnMod2luZG93KTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgbHNSZWxvYWRBZnRlckFkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZFBsYXllckFmdGVyQWQnKTsKICAgICAgICBpZiAobHNSZWxvYWRBZnRlckFkICE9PSBudWxsKSB7CiAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSBsc1JlbG9hZEFmdGVyQWQgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQbGF5ZXJUeXBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQbGF5ZXJUeXBlICE9PSBudWxsKSB7CiAgICAgICAgICAgIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgPSBsc1BsYXllclR5cGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGluQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BpbkJhY2t1cFBsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQaW5CYWNrdXAgIT09IG51bGwpIHsKICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9IGxzUGluQmFja3VwID09PSAndHJ1ZSc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzQ29vbGRvd24gPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkQ29vbGRvd25TZWNvbmRzJykpOwogICAgICAgIGlmICghaXNOYU4obHNDb29sZG93bikgJiYgbHNDb29sZG93biA+PSAwKSB7CiAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IGxzQ29vbGRvd247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzSGlkZUFkT3ZlcmxheSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19oaWRlQWRPdmVybGF5Jyk7CiAgICAgICAgaWYgKGxzSGlkZUFkT3ZlcmxheSA9PT0gJ3RydWUnKSB7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAnLnRhcy1hZGJsb2NrLW92ZXJsYXkgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0nOwogICAgICAgICAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDb25maWc6IFJlbG9hZFBsYXllckFmdGVyQWQgPSAnICsgUmVsb2FkUGxheWVyQWZ0ZXJBZCArICcsIEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJyArIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIG1vbml0b3JMaXZlU3RhdHVzKCk7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"}] \ No newline at end of file diff --git a/resources/brave-yt-sabr-fix.js b/resources/brave-yt-sabr-fix.js index 0184db31..330b7dbd 100644 --- a/resources/brave-yt-sabr-fix.js +++ b/resources/brave-yt-sabr-fix.js @@ -65,6 +65,31 @@ }, 100); }); + // Prong 1b: cold-load rescue. On a fresh page load the player already + // holds a SABR session carrying the ad-slot backoff, and Prong 1 (SPA nav + // only) won't fire. Prong 2 below can rewrite backoffTimeMs, but YouTube + // seems to be ignoring our rewritten value and enforcing a server-side + // ad-slot delay. The way to get around this is to force a fresh session + // (same mechanism as Prong 1). So when Prong 2 first sees a real backoff + // on the cold session, force a single fresh session here. If the new + // session still returns a backoff, we break to avoid a reload loop. + let coldReloadDone = false; + function forceFreshSessionOnce() { + if (coldReloadDone) return; + coldReloadDone = true; + const player = document.querySelector('#movie_player'); + if (!player?.cancelPlayback || !player?.loadVideoById) return; + const vid = new URL(window.location.href).searchParams.get('v'); + if (!vid) return; + + const vd = player.getVideoData?.(); + if (vd) vd.isInlinePlaybackNoAd = true; + + player.cancelPlayback(); + player.loadVideoById(vid); + log('cold-load rescue: forced fresh ad-free session for', vid); + } + // Prong 2: Intercept SABR responses and patch backoffTimeMs. // Tee the body so media chunks (>=1000 bytes) pass through untouched // — only the small control messages carrying the backoff field get @@ -96,7 +121,10 @@ return new Response(pass, reinit); } log('small response rn=' + rn, 'size=' + bytes.length); - patchBackoffField(bytes, rn); + // To avoid the ad-slot wait, attempt to force a fresh session + // after the first sign of a real backoff on the cold session. If the new + // session still returns a backoff, break to avoid an infinite reload loop. + if (patchBackoffField(bytes, rn)) forceFreshSessionOnce(); const out = new Response(bytes, reinit); try { Object.defineProperty(out, 'url', { value: response.url, configurable: true }); @@ -142,6 +170,7 @@ // flag. We rewrite the varint in place, keeping the same byte count // so the message structure stays valid. function patchBackoffField(bytes, rn) { + let patched = false; for (let i = 0; i < bytes.length - 2; i++) { if (bytes[i] !== 0x20) continue; let val = 0, shift = 0, end = i + 1; @@ -160,8 +189,10 @@ remaining >>>= 7; } bytes[pos] = remaining & 0x7f; + patched = true; } } + return patched; } if (DEBUG) { From f632d476d2eef1257f68de633ad224d3f0757ac0 Mon Sep 17 00:00:00 2001 From: Griffin Allen <40434025+griffinallen@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:29:44 -0400 Subject: [PATCH 4/5] run build --- dist/resources.json | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/resources.json b/dist/resources.json index e69de29b..799aafa8 100644 --- a/dist/resources.json +++ b/dist/resources.json @@ -0,0 +1 @@ +[{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-auto-pip.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBicmF2ZS1hdXRvLXBpcCDigJQgYXV0b21hdGljIFBpY3R1cmUtaW4tUGljdHVyZSB0b2dnbGUgZm9yIEhUTUw1IDx2aWRlbz4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBXaGF0IGl0IGRvZXMKICogLS0tLS0tLS0tLS0tCiAqICAgMS4gRm9yY2UtZW5hYmxlcyBQaVAgb24gdmlkZW9zIHRoYXQgZXhwbGljaXRseSBkaXNhYmxlIGl0IChOZXRmbGl4LAogKiAgICAgIGNlcnRhaW4gRFJNIHBsYXllcnMpIGJ5IGNsZWFyaW5nIGBkaXNhYmxlUGljdHVyZUluUGljdHVyZWAgYW5kCiAqICAgICAgd2F0Y2hpbmcgZm9yIHNpdGVzIHRoYXQgdHJ5IHRvIHJlLXNldCBpdC4KICogICAyLiBXaXJlcyBgbWVkaWFTZXNzaW9uLnNldEFjdGlvbkhhbmRsZXIoImVudGVycGljdHVyZWlucGljdHVyZSIpYCBzbwogKiAgICAgIGJyb3dzZXJzIC8gT1NlcyB0aGF0IGZpcmUgaXQgKGF1dG8tUGlQIG9uIHRhYiBzd2l0Y2gpIGp1c3Qgd29yay4KICogICAzLiBBZGRzIGEgY2xpY2thYmxlIFBpUCBjb250cm9sOgogKiAgICAgICAgLSBOYXRpdmUgaW5qZWN0aW9uIG9uIFlvdVR1YmUgLyBUd2l0Y2ggLyBOZXRmbGl4IChtYXRjaGVzIGVhY2gKICogICAgICAgICAgc2l0ZSdzIGV4aXN0aW5nIGNvbnRyb2xzIGJhcikuCiAqICAgICAgICAtIE90aGVyd2lzZSBhIEZpcmVmb3gtc3R5bGUgIlBvcCBvdXQgdGhpcyB2aWRlbyIgaG92ZXIgcGlsbAogKiAgICAgICAgICB0aGF0IGZsb2F0cyBvdmVyIHRoZSB2aWRlbywgZmFkZXMgaW4gb24gaG92ZXIsIGZhZGVzIG91dAogKiAgICAgICAgICBhZnRlciBhIHNtYWxsIGdyYWNlIHBlcmlvZCwgYW5kIHNocmlua3MgdG8gaWNvbi1vbmx5IGFmdGVyCiAqICAgICAgICAgIHRoZSBmaXJzdCBjbGljay4KICogICA0LiBIYW5kbGVzIG1hbnkgdmlkZW9zIG9uIHRoZSBzYW1lIHBhZ2UgKGZlZWRzLCBjb21tZW50IGVtYmVkcywKICogICAgICBtb2RhbCBwbGF5ZXJzKSBhbmQgdHJhY2tzIGFkZC9yZW1vdmUgdmlhIE11dGF0aW9uT2JzZXJ2ZXIuCiAqCiAqIENvbmZpZ3VyYXRpb24gKHBlci1vcmlnaW4gbG9jYWxTdG9yYWdlKQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogICBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAKICogICAgIHVuc2V0IC8gIjEiIC8gInRydWUiIC8gInllcyIgLyAib24iICAgLT4gZ2VuZXJpYyBvdmVybGF5IHBpbGwgKGRlZmF1bHQpCiAqICAgICAiMCIgICAvICJmYWxzZSIgLyAibm8iICAgLyAib2ZmIiAgICAgIC0+IHVzZSBzaXRlLXNwZWNpZmljIG5hdGl2ZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gKFlvdVR1YmUvVHdpdGNoL05ldGZsaXgpCiAqCiAqICAgU2V0IHZpYSBEZXZUb29scyBjb25zb2xlIG9uIHRoZSBkZXNpcmVkIG9yaWdpbiwgdGhlbiByZWxvYWQgdGhlIHRhYi4KICoKICogQnJvd3NlciBzdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLQogKiAgIC0gQ2hyb21pdW0gKEJyYXZlLCBDaHJvbWUsIEVkZ2UpOiBmdWxsIHN1cHBvcnQsIGFsbCBmZWF0dXJlcy4KICogICAtIEZpcmVmb3g6IFBpUCB3b3JrcywgYnV0IEZpcmVmb3ggYWxyZWFkeSBzaGlwcyBhIGJ1aWx0LWluICJQb3Agb3V0CiAqICAgICB0aGlzIHZpZGVvIiB0b2dnbGUgc28gdGhlIHNjcmlwdCdzIHBpbGwgaXMgcmVkdW5kYW50IHRoZXJlLgogKiAgIC0gU2FmYXJpIChpT1MgMTQrKTogZmFsbHMgYmFjayB0byBgd2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZWAuIFRoZQogKiAgICAgaG92ZXIgcGlsbCBzd2l0Y2hlcyB0byBhIHRhcC10by1yZXZlYWwgcGlsbCAoMyBzIGF1dG8taGlkZSkuCiAqICAgLSBPdGhlciAvIG9sZGVyOiBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbm8gUGlQIEFQSSBpcwogKiAgICAgcHJlc2VudCBhdCBhbGwuCiAqCiAqIEFyY2hpdGVjdHVyZQogKiAtLS0tLS0tLS0tLS0KICogICAqIE9uZSBzaGFyZWQgbW91c2Vtb3ZlIC8gdG91Y2hzdGFydCAvIHNjcm9sbCAvIHJlc2l6ZSAvIGZ1bGxzY3JlZW4KICogICAgIGxpc3RlbmVyIHNldCwgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB2aWRlb3MgYXJlIG9uIHRoZSBwYWdlCiAqICAgICAoYG92ZXJsYXlzYCByZWdpc3RyeSArIGBhcm1HbG9iYWxzKClgIC8gYG1heWJlRGlzYXJtR2xvYmFscygpYCkuCiAqICAgKiBPZmYtc2NyZWVuIHZpZGVvcyBhcmUgZ2F0ZWQgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBhIHNpbmdsZQogKiAgICAgYEludGVyc2VjdGlvbk9ic2VydmVyYCAoYHZpc2libGVPdmVybGF5c2Agc3Vic2V0KS4KICogICAqIEV2ZXJ5IHBlci12aWRlbyByZWdpc3RyYXRpb24gcmVjb3JkcyBhIHRlYXJkb3duIGZ1bmN0aW9uIGluCiAqICAgICBgdmlkZW9DbGVhbnVwc2Agc28gdGhlIGxpc3RlbmVycywgb2JzZXJ2ZXJzLCBhbmQgcGlsbCBidXR0b24gYXJlCiAqICAgICBhbGwgcmVtb3ZlZCBpZiB0aGUgcGFnZSBkcm9wcyB0aGUgdmlkZW8gZWxlbWVudC4KICoKICogU291cmNlIG9mIG9yaWdpbmFsIGF1dG8tUGlQIGJlaGF2aW91cjoKICogICBodHRwczovL29sZC5yZWRkaXQuY29tL3IvYnJhdmVfYnJvd3Nlci9jb21tZW50cy8xcjhlZGc0LwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCihmdW5jdGlvbigpIHsKICBjb25zdCBWRVJTSU9OID0gInYwLjQyLXl0LWF1dG9waXAtdGFyZ2V0K2NvbmRpdGlvbmFsLXJlc3VtZSI7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFR1bmFibGVzCiAgLy8KICAvLyBDb2xsZWN0ZWQgaGVyZSBzbyBhIHVzZXIgLyBtYWludGFpbmVyIGNhbiBhZGp1c3Qgc3BhY2luZywgdGltaW5nIGFuZAogIC8vIHZpZXdwb3J0IGJlaGF2aW91ciB3aXRob3V0IGh1bnRpbmcgdGhyb3VnaCB0aGUgZmlsZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBjb25zdCBDT05GSUcgPSB7CiAgICAvLyBWZXJ0aWNhbCBvZmZzZXQgYWRkZWQgdG8gdGhlIHBpbGwncyBjZW50cmVkLW1pZC1yaWdodCBwb3NpdGlvbgogICAgLy8gKHBvc2l0aXZlID0gZG93bikuIEVtcGlyaWNhbGx5IHR1bmVkIHNvIHRoZSBwaWxsIHNpdHMgYmVsb3cgdGhlCiAgICAvLyB0eXBpY2FsIHNpdGUgY29udHJvbCBiYXIgaW5zdGVhZCBvZiBvdmVybGFwcGluZyBpdC4KICAgIFBJTExfT0ZGU0VUX1k6IDQwLAogICAgLy8gSG9yaXpvbnRhbCBnYXAgZnJvbSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdmlzaWJsZSB2aWRlbyB0byB0aGUgcGlsbC4KICAgIFBJTExfUklHSFRfTUFSR0lOOiAxMiwKICAgIC8vIE1pbmltdW0gZ2FwIGJldHdlZW4gdGhlIHBpbGwgYW5kIGFueSB2aWV3cG9ydCBlZGdlLgogICAgVklFV1BPUlRfUEFEOiA4LAogICAgLy8gRGVsYXkgYmV0d2VlbiB0aGUgY3Vyc29yIGxlYXZpbmcgdGhlIHZpZGVvL3BpbGwgcmVnaW9uIGFuZCB0aGUKICAgIC8vIHBpbGwgZmFkaW5nIG91dCDigJQgcHJvdGVjdHMgYWdhaW5zdCBmbGlja2VyIHdoZW4gdGhlIGN1cnNvcgogICAgLy8gY3Jvc3NlcyB0aGUgZ2FwIGZyb20gdmlkZW8gdG8gcGlsbC4KICAgIEhPVkVSX0dSQUNFX01TOiAxNTAsCiAgICAvLyBIb3cgbG9uZyB0aGUgcGlsbCBzdGF5cyByZXZlYWxlZCBhZnRlciBhIHRhcCBvbiBhIHRvdWNoIGRldmljZS4KICAgIFRPVUNIX1JFVkVBTF9NUzogMzAwMCwKICAgIC8vIE1heGltdW0gdGltZSB3ZSB3YWl0IGZvciBgbG9hZGVkbWV0YWRhdGFgIGJlZm9yZSBpc3N1aW5nIFBpUC4KICAgIE1FVEFEQVRBX1dBSVRfTVM6IDMwMDAsCiAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBidWZmZXIgc28gdGhlIHBpbGwgaXMgaW4gcGxhY2UgYmVmb3JlIHRoZQogICAgLy8gdmlkZW8gZnVsbHkgc2Nyb2xscyBpbnRvIHZpZXcuCiAgICBJT19ST09UX01BUkdJTjogIjEwMHB4IiwKICAgIC8vIEdyYWNlIHdpbmRvdyBhZnRlciBhIFlvdVR1YmUgU1BBIG5hdmlnYXRpb24gZHVyaW5nIHdoaWNoIHRoZSBwaWxsCiAgICAvLyBzdGF5cyBzdXBwcmVzc2VkIGV2ZW4gaWYgdGhlIG5ldyBVUkwgd291bGQgb3RoZXJ3aXNlIGJlIGVsaWdpYmxlLgogICAgLy8gTGV0cyB0aGUgd2F0Y2gtcGFnZSBwbGF5ZXIgbW91bnQgYW5kIGF2b2lkcyBhIGJyaWVmIGZsYXNoIHdoZW4gdGhlCiAgICAvLyBjdXJzb3IgaXMgc3RpbGwgYXQgdGhlIHByZXZpb3VzIGhvdmVyIHRhcmdldCdzIGNvb3JkaW5hdGVzLgogICAgWVRfTkFWX0dSQUNFX01TOiA1MDAsCiAgICAvLyBJZiBhIG5hdGl2ZSBpbmplY3RvciAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpIGtlZXBzIHJldHVybmluZwogICAgLy8gZmFsc2UgZm9yIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIGdpdmUgdXAKICAgIC8vIG9uIG5hdGl2ZSBpbmplY3Rpb24gYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQuCiAgICAvLyBHZW5lcm91cyBvbiBwdXJwb3NlIOKAlCBzbG93IHBsYXllciBtb3VudHMgKG5ldHdvcmstc3RhbGxlZCBpZnJhbWVzLAogICAgLy8gbG9uZy1ydW5uaW5nIFJlYWN0IGh5ZHJhdGlvbikgc2hvdWxkbid0IHRyaXAgdGhlIGZhbGxiYWNrLgogICAgTkFUSVZFX0ZBTExCQUNLX01TOiAxMDAwMCwKICB9OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNb2R1bGUtbGV2ZWwgc3RhdGUKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gdmlkZW8gZWxlbWVudCAtPiBjbGVhbnVwIGZ1bmN0aW9uLiBQb3B1bGF0ZWQgd2hlbiBhIHZpZGVvIGlzIHdpcmVkCiAgLy8gdXA7IGNhbGxlZCBmcm9tIHRoZSBkaXNjb3ZlcnkgTXV0YXRpb25PYnNlcnZlciB3aGVuIGEgdHJhY2tlZCB2aWRlbwogIC8vIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB3ZSBjYW4gcmVsZWFzZSBldmVyeSBsaXN0ZW5lciBhbmQgdGhlCiAgLy8gcGlsbCBET00gbm9kZSBpdCBvd25zLgogIGNvbnN0IHZpZGVvQ2xlYW51cHMgPSBuZXcgV2Vha01hcCgpOwoKICAvLyBZb3VUdWJlLXNwZWNpZmljIHN0YXRlIGZvciB0aGUgVVJMLWdhdGUgKyBTUEEtbmF2LWdyYWNlIGxvZ2ljIGluCiAgLy8gdXBkYXRlKCkuIEhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHNvIHVwZGF0ZSgpIGRvZXNuJ3QgcmUtdGVzdCB0aGUKICAvLyBob3N0IHJlZ2V4IGV2ZXJ5IHRpY2sg4oCUIGhvc3RuYW1lIGlzIGludmFyaWFudCBmb3IgdGhlIHBhZ2UgbGlmZXRpbWUsCiAgLy8gYW5kIHRoZSBwYXRobmFtZSByZWdleCBvbmx5IHJlLXJ1bnMgb24gYWN0dWFsIFNQQSBwYXRoIGNoYW5nZXMuCiAgLy8gV2h5IHRoaXMgZXhpc3RzOiBZb3VUdWJlJ3MgaG9tZXBhZ2UgLyBmZWVkIC8gc2VhcmNoIC8gY2hhbm5lbCBwYWdlcwogIC8vIHJldXNlIHRoZSBzYW1lIGBodG1sNS12aWRlby1jb250YWluZXJgIDx2aWRlbz4gZWxlbWVudCBhcyB0aGUgd2F0Y2gKICAvLyBwYWdlIGZvciBob3Zlci10aHVtYm5haWwgcHJldmlld3MsIHJlcG9zaXRpb25pbmcgaXQgb3ZlciB3aGljaGV2ZXIKICAvLyB0aHVtYm5haWwgdGhlIGN1cnNvciBpcyBvbi4gRE9NLWxldmVsIHNpZ25hbHMgKHNpemUsIG11dGVkLCBsb29wLAogIC8vIHBhcmVudCBjbGFzcykgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHByZXZpZXcgYW5kIHdhdGNoLCBzbyB0aGUgVVJMIGlzCiAgLy8gdGhlIG9ubHkgcmVsaWFibGUgZGlzdGluZ3Vpc2hlci4KICBjb25zdCBfeXRIb3N0ID0gLyg/Ol58XC4pKD86eW91dHViZVwuY29tfHlvdXR1YmUtbm9jb29raWVcLmNvbSkkL2kudGVzdChsb2NhdGlvbi5ob3N0bmFtZSk7CiAgY29uc3QgX3l0V2F0Y2hQYXRoID0gL15cLyg/OndhdGNofGVtYmVkfGxpdmV8c2hvcnRzKS87CiAgbGV0IF95dExhc3RQYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgbGV0IF95dFByZXZpZXdBcmVhID0gX3l0SG9zdCAmJiAhX3l0V2F0Y2hQYXRoLnRlc3QoX3l0TGFzdFBhdGgpOwogIGxldCBfeXROYXZBdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE92ZXJsYXkgcmVnaXN0cnkgKyB2aWV3cG9ydCBnYXRpbmcKICAvLwogIC8vIEdvYWw6IE8oMSkgZG9jdW1lbnQvd2luZG93IGxpc3RlbmVycyByZWdhcmRsZXNzIG9mIHZpZGVvIGNvdW50LCBhbmQKICAvLyBPKHZpc2libGUpIChub3QgTyh0b3RhbCkpIHdvcmsgcGVyIHNjcm9sbC9tb3VzZW1vdmUgdGljay4gQSBzaW5nbGUKICAvLyBzaGFyZWQgbGlzdGVuZXIgc2V0IHdhbGtzIHRoZSByZWdpc3RyeTsgYW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIKICAvLyBuYXJyb3dzIGl0ZXJhdGlvbiB0byB0aGUgdmlkZW9zIGFjdHVhbGx5IG9uIHNjcmVlbi4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gRXZlcnkgb3ZlcmxheSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgKGxpZmV0aW1lIHJlZ2lzdHJ5KS4KICBjb25zdCBvdmVybGF5cyA9IG5ldyBTZXQoKTsKICAvLyBTdWJzZXQgb2YgYG92ZXJsYXlzYCB3aG9zZSB2aWRlbyBpcyBjdXJyZW50bHkgaW50ZXJzZWN0aW5nIHRoZQogIC8vIHZpZXdwb3J0LiBIb3QtcGF0aCBpdGVyYXRpb24gdXNlcyB0aGlzIHNldCBzbyBvZmYtc2NyZWVuIHZpZGVvcyBpbgogIC8vIGxvbmcgZmVlZHMgZG9uJ3QgcGF5IGxheW91dCBjb3N0cyBvbiBldmVyeSBzY3JvbGwgZnJhbWUuCiAgY29uc3QgdmlzaWJsZU92ZXJsYXlzID0gbmV3IFNldCgpOwogIC8vIFJldmVyc2UgbG9va3VwIGZvciB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sgKGVudHJ5LnRhcmdldAogIC8vIGlzIHRoZSB2aWRlbyBlbGVtZW50KS4KICBjb25zdCB2aWRlb1RvT3ZlcmxheSA9IG5ldyBXZWFrTWFwKCk7CiAgbGV0IGludGVyc2VjdGlvbk9ic2VydmVyID0gbnVsbDsKICBmdW5jdGlvbiBnZXRJTygpIHsKICAgIGlmIChpbnRlcnNlY3Rpb25PYnNlcnZlcikgcmV0dXJuIGludGVyc2VjdGlvbk9ic2VydmVyOwogICAgaWYgKHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgZSA9IGVudHJpZXNbaV07CiAgICAgICAgY29uc3QgaW5zdCA9IHZpZGVvVG9PdmVybGF5LmdldChlLnRhcmdldCk7CiAgICAgICAgaWYgKCFpbnN0KSBjb250aW51ZTsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmFkZChpbnN0KTsKICAgICAgICB9IGVsc2UgaWYgKHZpc2libGVPdmVybGF5cy5kZWxldGUoaW5zdCkpIHsKICAgICAgICAgIC8vIEZvcmNlIGEgZmluYWwgdXBkYXRlIHNvIGFueSB2aXNpYmxlIHBpbGwgaGlkZXMgY2xlYW5seS4KICAgICAgICAgIGluc3QudXBkYXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7IHJvb3RNYXJnaW46IENPTkZJRy5JT19ST09UX01BUkdJTiB9KTsKICAgIHJldHVybiBpbnRlcnNlY3Rpb25PYnNlcnZlcjsKICB9CiAgLy8gTGFzdCBrbm93biBwb2ludGVyIHBvc2l0aW9uIChudW1iZXJzLCBuZXZlciB0aGUgTW91c2VFdmVudCDigJQga2VlcGluZwogIC8vIHRoZSBldmVudCBhbGl2ZSBhY3Jvc3MgckFGIHRpY2tzIHBpbnMgZXh0cmEgRE9NIHJlZmVyZW5jZXMgaW4gVjgncwogIC8vIGNsb3N1cmUgZW52aXJvbm1lbnQpLgogIGxldCBtbVggPSAwLCBtbVkgPSAwOwogIC8vIENvYWxlc2NpbmcgZmxhZ3Mg4oCUIGNvbGxhcHNlIGJ1cnN0cyBvZiBtb3VzZW1vdmUgLyBzY3JvbGwgLyBldGMuIGludG8KICAvLyBhIHNpbmdsZSBwZXItZnJhbWUgdGljayBpbnN0ZWFkIG9mIG9uZSB0aWNrIHBlciBldmVudC4KICBsZXQgbW1UaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IHVwZFRpY2tTY2hlZHVsZWQgPSBmYWxzZTsKICAvLyBUcnVlIHdoZW4gZ2xvYmFsIGxpc3RlbmVycyBhcmUgY3VycmVudGx5IGF0dGFjaGVkLiBSZWZlcmVuY2UtY291bnRlZAogIC8vIGJ5IGBvdmVybGF5cy5zaXplYCBzbyB3ZSBvbmx5IGxpc3RlbiB3aGlsZSBhdCBsZWFzdCBvbmUgb3ZlcmxheSBpcyBsaXZlLgogIGxldCBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gX21tVGljaygpIHsKICAgIG1tVGlja1NjaGVkdWxlZCA9IGZhbHNlOwogICAgY29uc3QgeCA9IG1tWCwgeSA9IG1tWTsKICAgIC8vIEl0ZXJhdGUgb25seSB0aGUgdmlzaWJsZSBzdWJzZXQ7IG9mZi1zY3JlZW4gdmlkZW9zIGNhbid0IGJlIGhvdmVyZWQuCiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC5oYW5kbGVQb2ludGVyKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX29uRG9jTW91c2VNb3ZlKGUpIHsKICAgIG1tWCA9IGUuY2xpZW50WDsKICAgIG1tWSA9IGUuY2xpZW50WTsKICAgIGlmIChtbVRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIG1tVGlja1NjaGVkdWxlZCA9IHRydWU7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX21tVGljayk7CiAgfQogIGZ1bmN0aW9uIF9vbkRvY1RvdWNoU3RhcnQoZSkgewogICAgY29uc3QgdCA9IChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB8fCAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKTsKICAgIGlmICghdCkgcmV0dXJuOwogICAgY29uc3QgeCA9IHQuY2xpZW50WCwgeSA9IHQuY2xpZW50WTsKICAgIHZpc2libGVPdmVybGF5cy5mb3JFYWNoKChpbnN0KSA9PiBpbnN0LmhhbmRsZVRvdWNoKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX3NjaGVkdWxlVXBkYXRlQWxsKCkgewogICAgaWYgKHVwZFRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIHVwZFRpY2tTY2hlZHVsZWQgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF91cGRhdGVBbGxUaWNrKTsKICB9CiAgZnVuY3Rpb24gX3VwZGF0ZUFsbFRpY2soKSB7CiAgICB1cGRUaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC51cGRhdGUoKSk7CiAgfQoKICBmdW5jdGlvbiBhcm1HbG9iYWxzKCkgewogICAgaWYgKGdsb2JhbHNBcm1lZCkgcmV0dXJuOwogICAgZ2xvYmFsc0FybWVkID0gdHJ1ZTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIGFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlRGlzYXJtR2xvYmFscygpIHsKICAgIGlmICghZ2xvYmFsc0FybWVkIHx8IG92ZXJsYXlzLnNpemUgPiAwKSByZXR1cm47CiAgICBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICAvLyBUZWFyIGRvd24gdGhlIEludGVyc2VjdGlvbk9ic2VydmVyIHRvbyDigJQgaXQncyB0aWVkIHRvIHRoZSBzYW1lCiAgICAvLyBvdmVybGF5IGxpZmVjeWNsZSBhcyB0aGUgZ2xvYmFsIGxpc3RlbmVycy4gUmUtY3JlYXRlZCBsYXppbHkgYnkKICAgIC8vIGdldElPKCkgaWYgYSBmdXR1cmUgb3ZlcmxheSByZWdpc3RlcnMuCiAgICBpZiAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHsKICAgICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICBpbnRlcnNlY3Rpb25PYnNlcnZlciA9IG51bGw7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDYXBhYmlsaXR5ICsgZW52aXJvbm1lbnQgZGV0ZWN0aW9uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBpUCBhdmFpbGFiaWxpdHkgYWNyb3NzIGJyb3dzZXJzOgogIC8vICAgSEFTX1NUQU5EQVJEX1BJUCDigJQgYHJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlYCAoQ2hyb21pdW0gLyBGaXJlZm94IC8gaU9TIDE0KykuCiAgLy8gICBIQVNfV0VCS0lUX1BJUCAgIOKAlCBvbGRlciBpT1MgU2FmYXJpJ3MgYHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGVgLgogIC8vIFRoZSBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbmVpdGhlciBpcyBwcmVzZW50LgogIGNvbnN0IEhBU19TVEFOREFSRF9QSVAgPSAhIWRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbmFibGVkOwogIGNvbnN0IEhBU19XRUJLSVRfUElQID0gIndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUiIGluIEhUTUxWaWRlb0VsZW1lbnQucHJvdG90eXBlOwogIGNvbnN0IFBJUF9TVVBQT1JURUQgPSBIQVNfU1RBTkRBUkRfUElQIHx8IEhBU19XRUJLSVRfUElQOwoKICAvLyBUb3VjaCBjYXBhYmlsaXR5IOKAlCBzd2l0Y2hlcyB0aGUgb3ZlcmxheSBmcm9tIGhvdmVyLWRyaXZlbiB0bwogIC8vIHRhcC10by1yZXZlYWwgb24gaU9TIC8gQW5kcm9pZC4KICBjb25zdCBJU19UT1VDSCA9ICJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwOwoKICAvLyBDb21iaW5lZCBmdWxsc2NyZWVuIGNoZWNrIGFjcm9zcyB0aGUgdGhyZWUgdmVuZG9yIHZhcmlhbnRzOgogIC8vICAgLSBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAgICAgICAoc3RhbmRhcmQpCiAgLy8gICAtIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IChvbGRlciBDaHJvbWl1bSAvIFNhZmFyaSBkZXNrdG9wKQogIC8vICAgLSB2aWRlby53ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbiAoaU9TIG5hdGl2ZSB2aWRlbyBmdWxsc2NyZWVuLAogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggbmV2ZXIgc2V0cyBkb2N1bWVudC4qKQogIGZ1bmN0aW9uIGlzRnVsbHNjcmVlbih2aWRlbykgewogICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICBpZiAodmlkZW8gJiYgdmlkZW8ud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW4pIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gQ29uc29sZSBvdXRwdXQuIGBsb2dgIGZvciBvbmUtbGluZSBzdWNjZXNzIG1lc3NhZ2VzIG9uIGluamVjdGlvbiwKICAvLyBgd2FybmAgZm9yIGZhaWx1cmVzIChrZXB0IHF1aWV0IGJ5IGRlZmF1bHQpLgogIGNvbnN0IFRBRyA9ICJbYnJhdmUtYXV0by1waXAgIiArIFZFUlNJT04gKyAiXSI7CiAgY29uc3QgbG9nID0gKC4uLmEpID0+IGNvbnNvbGUubG9nKFRBRywgLi4uYSk7CiAgY29uc3Qgd2FybiA9ICguLi5hKSA9PiBjb25zb2xlLndhcm4oVEFHLCAuLi5hKTsKCiAgLy8gUGljayB0aGUgYmVzdCA8dmlkZW8+IGZvciBhbiBhdXRvLVBpUCBpbnRlbnQgZmlyZWQgYnkgdGhlIE9TIC8KICAvLyBicm93c2VyLiBVc2VkIGJ5IHRoZSBnbG9iYWwgYG1lZGlhU2Vzc2lvbmAgYWN0aW9uIGhhbmRsZXIgc28gdGhlCiAgLy8gKmxhc3QqIHJlZ2lzdGVyZWQgdmlkZW8gZG9lc24ndCBnZXQgUGlQJ2QgYnkgZGVmYXVsdCDigJQgc2VlIGNvbW1lbnQKICAvLyBhdCB0aGUgcmVnaXN0cmF0aW9uIHNpdGUgZm9yIHRoZSBZb3VUdWJlIGJsYWNrLXNjcmVlbiByYXRpb25hbGUuCiAgZnVuY3Rpb24gcGlja0F1dG9QaXBUYXJnZXQoKSB7CiAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHJldHVybiBkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudDsKICAgIGNvbnN0IHZpZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgIGxldCBiZXN0UGxheWluZyA9IG51bGwsIGJlc3RQbGF5aW5nQXJlYSA9IDA7CiAgICBsZXQgYmVzdFJlYWR5ID0gbnVsbCwgYmVzdFJlYWR5QXJlYSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZHMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgdiA9IHZpZHNbaV07CiAgICAgIGlmICh2LmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKSBjb250aW51ZTsKICAgICAgY29uc3QgciA9IHYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGEgPSBNYXRoLm1heCgwLCByLndpZHRoKSAqIE1hdGgubWF4KDAsIHIuaGVpZ2h0KTsKICAgICAgaWYgKGEgPD0gMCkgY29udGludWU7CiAgICAgIGlmICghdi5wYXVzZWQgJiYgIXYuZW5kZWQgJiYgdi5yZWFkeVN0YXRlID49IDIgJiYgYSA+IGJlc3RQbGF5aW5nQXJlYSkgewogICAgICAgIGJlc3RQbGF5aW5nID0gdjsgYmVzdFBsYXlpbmdBcmVhID0gYTsKICAgICAgfQogICAgICBpZiAodi5yZWFkeVN0YXRlID49IDEgJiYgYSA+IGJlc3RSZWFkeUFyZWEpIHsKICAgICAgICBiZXN0UmVhZHkgPSB2OyBiZXN0UmVhZHlBcmVhID0gYTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJlc3RQbGF5aW5nIHx8IGJlc3RSZWFkeTsKICB9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFBpUCBpY29uIGZhY3RvcnkKICAvLwogIC8vIEJ1aWx0IHdpdGggY3JlYXRlRWxlbWVudE5TIGluc3RlYWQgb2YgaW5uZXJIVE1MIHRvIGF2b2lkIFRydXN0ZWRUeXBlcwogIC8vIC8gQ1NQIGByZXF1aXJlVHJ1c3RlZFR5cGVzRm9yICdzY3JpcHQnYCB2aW9sYXRpb25zIG9uIFlvdVR1YmUgZXRjLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERlZmVuc2UtaW4tZGVwdGggaGVscGVyIHVzZWQgd2hlbiBjbG9uaW5nIHRoaXJkLXBhcnR5IHdyYXBwZXIKICAvLyBlbGVtZW50cyAoTmV0ZmxpeCdzIC5tZWRpdW0gaWNvbiB3cmFwcGVyLCBUd2l0Y2gncyByaWdodC1jb250cm9scwogIC8vIHdyYXBwZXIpLiBjbG9uZU5vZGUoZmFsc2UpIGNhcnJpZXMgZm9yd2FyZCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMKICAvLyBhbmQgdGhlIGBzdHlsZWAgYXR0cmlidXRlIOKAlCB3ZSBzdHJpcDoKICAvLyAgIC0gYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIGBvbipgICh3b3VsZCByZS1maXJlIHRoZSBzaXRlJ3MKICAvLyAgICAgaW5saW5lIGV2ZW50IGhhbmRsZXJzIG9uIG91ciBjbG9uZSksIGFuZAogIC8vICAgLSB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgaXRzZWxmIChjb3VsZCBjYXJyeSBhIGB1cmwoLi4uKWAgdG9rZW4KICAvLyAgICAgdGhhdCB0cmlnZ2VycyBhIG5ldHdvcmsgZmV0Y2ggd2hlbiB0aGUgY2xvbmUgaXMgcGFyZW50ZWQpLCBhbmQKICAvLyAgIC0gdGhlIGBpZGAgYXR0cmlidXRlIChjbG9uaW5nIHByb2R1Y2VzIGEgZHVwbGljYXRlLCB3aGljaCB3b3VsZAogIC8vICAgICBicmVhayB0aGUgc2l0ZSdzIG93biBnZXRFbGVtZW50QnlJZCAvIENTUyAjaWQgc2VsZWN0b3JzKS4KICAvLyBXZSByZWx5IG9uIHRoZSBjbG9uZWQgZWxlbWVudCdzIGNsYXNzIGxpc3QgZm9yIHNpemluZy9zcGFjaW5nLAogIC8vIHdoaWNoIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHZpYSB0aGUgc2l0ZSdzIGV4dGVybmFsIHN0eWxlc2hlZXQuCiAgZnVuY3Rpb24gc3RyaXBJbmxpbmVIYW5kbGVycyhlbCkgewogICAgY29uc3QgYXR0cnMgPSBlbC5hdHRyaWJ1dGVzOwogICAgZm9yIChsZXQgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBhdHRyc1tpXS5uYW1lOwogICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJvbiIpIHx8IG5hbWUgPT09ICJzdHlsZSIgfHwgbmFtZSA9PT0gImlkIikgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogIH0KCiAgY29uc3QgUElQX1NWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgZnVuY3Rpb24gbWFrZVBpcFN2ZyhzaXplKSB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoUElQX1NWR19OUywgInN2ZyIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgidmlld0JveCIsICIwIDAgMjQgMjQiKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgc2l6ZSk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBzaXplKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgImN1cnJlbnRDb2xvciIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjIiKTsKICAgIGNvbnN0IHIxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMS5zZXRBdHRyaWJ1dGUoIngiLCAiMyIpOyByMS5zZXRBdHRyaWJ1dGUoInkiLCAiNSIpOwogICAgcjEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsICIxOCIpOyByMS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsICIxNCIpOyByMS5zZXRBdHRyaWJ1dGUoInJ4IiwgIjIiKTsKICAgIGNvbnN0IHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIngiLCAiMTIiKTsgcjIuc2V0QXR0cmlidXRlKCJ5IiwgIjExIik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgIjciKTsgcjIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCAiNiIpOyByMi5zZXRBdHRyaWJ1dGUoInJ4IiwgIjEiKTsKICAgIHIyLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJjdXJyZW50Q29sb3IiKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChyMSk7IHN2Zy5hcHBlbmRDaGlsZChyMik7CiAgICByZXR1cm4gc3ZnOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGlQIHRvZ2dsZSBlbnRyeSBwb2ludAogIC8vCiAgLy8gU2luZ2xlIGFzeW5jIGZ1bmN0aW9uIHNoYXJlZCBieSBldmVyeSBjbGljayBoYW5kbGVyLiBXYWxrcyB0aGUKICAvLyBhdmFpbGFibGUgQVBJcyBpbiBwcmlvcml0eSBvcmRlciBhbmQgaXMgcm9idXN0IHRvIGEgY2xpY2sgdGhhdCBsYW5kcwogIC8vIGJlZm9yZSB0aGUgdmlkZW8gaGFzIGxvYWRlZCBlbm91Z2ggbWV0YWRhdGEgKHdhaXRzIHVwIHRvIDMgcykuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlUGlwKHZpZGVvKSB7CiAgICB0cnkgewogICAgICAvLyBpT1MgU2FmYXJpIHBhdGgg4oCUIHdlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUgdG9nZ2xlcyBiZXR3ZWVuCiAgICAgIC8vICJpbmxpbmUiLCAicGljdHVyZS1pbi1waWN0dXJlIiBhbmQgImZ1bGxzY3JlZW4iLgogICAgICBpZiAoIUhBU19TVEFOREFSRF9QSVAgJiYgSEFTX1dFQktJVF9QSVAgJiYKICAgICAgICAgIHR5cGVvZiB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdmlkZW8ud2Via2l0UHJlc2VudGF0aW9uTW9kZSA9PT0gInBpY3R1cmUtaW4tcGljdHVyZSIKICAgICAgICAgID8gImlubGluZSIgOiAicGljdHVyZS1pbi1waWN0dXJlIjsKICAgICAgICB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlKHRhcmdldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIFN0YW5kYXJkIEFQSSBwYXRoLgogICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQgPT09IHZpZGVvKSB7CiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZXhpdFBpY3R1cmVJblBpY3R1cmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCAxKSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7IHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSk7IHJlc29sdmUoKTsgfTsKICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgc2V0VGltZW91dChkb25lLCBDT05GSUcuTUVUQURBVEFfV0FJVF9NUyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB2aWRlby5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGF3YWl0IHZpZGVvLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIExhc3QtcmVzb3J0IGlPUyBmYWxsYmFjayBldmVuIGlmIEhBU19TVEFOREFSRF9QSVAgd2FzIGNsYWltZWQuCiAgICAgIGlmICh0eXBlb2YgdmlkZW8ud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUoInBpY3R1cmUtaW4tcGljdHVyZSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB3YXJuKCJQaVAgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTsKICAgIH0gY2F0Y2ggKGVycikgeyB3YXJuKCJQaVAgcmVxdWVzdCBmYWlsZWQ6IiwgZXJyLm1lc3NhZ2UgfHwgZXJyKTsgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gU2l0ZS1zcGVjaWZpYyBuYXRpdmUgaW5qZWN0b3JzCiAgLy8KICAvLyBFYWNoIGluamVjdG9yIGlzIGlkZW1wb3RlbnQgKHNhZmUgdG8gcmUtcnVuIHdoZW4gdGhlIHNpdGUncyBSZWFjdAogIC8vIHJvb3QgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIpIGFuZCByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAvIGZhbHNlCiAgLy8gd2hlbiB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpc24ndCBpbiB0aGUgRE9NIHlldC4gVGhleSdyZSBkcml2ZW4gYnkKICAvLyBhIHBlcnNpc3RlbnQgTXV0YXRpb25PYnNlcnZlciBpbiBgdHJ5TmF0aXZlKClgIHNvIHJlLXJlbmRlcnMgZG9uJ3QKICAvLyBwZXJtYW5lbnRseSBsb3NlIHRoZSBidXR0b24uCiAgLy8KICAvLyBTdHJhdGVneSBhY3Jvc3Mgc2l0ZXM6CiAgLy8gICAtIFlvdVR1YmU6IGluc2VydCBhIDxidXR0b24gY2xhc3M9Inl0cC1idXR0b24iPiBhbG9uZ3NpZGUgdGhlCiAgLy8gICAgIGV4aXN0aW5nIHNldHRpbmdzL21pbmlwbGF5ZXIvc2l6ZSBpY29ucy4gSW5oZXJpdHMgWW91VHViZSdzCiAgLy8gICAgIGF1dG8tZmFkZSAvIGhvdmVyIGJlaGF2aW91ciBmb3IgZnJlZS4KICAvLyAgIC0gVHdpdGNoOiBjbG9uZSB0aGUgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgcmlnaHQtc2lkZSBjb250cm9sCiAgLy8gICAgIGJ1dHRvbiAoc2V0dGluZ3MvZnVsbHNjcmVlbi90aGVhdHJlKSBhbmQgcGxhY2Ugb3VyIGJ1dHRvbiBpbnNpZGUsCiAgLy8gICAgIHNvIHdlIGluaGVyaXQgVHdpdGNoJ3MgZmxleCBzcGFjaW5nIGNsYXNzZXMuCiAgLy8gICAtIE5ldGZsaXg6IGNsb25lIHRoZSAubWVkaXVtIGljb24gd3JhcHBlciAqYW5kKiB0aGUgM3JlbSBzcGFjZXIKICAvLyAgICAgdGhhdCBzaXRzIGJldHdlZW4gc2libGluZ3MsIHNvIHRoZSByaHl0aG0gb2YgdGhlIGljb24gcm93IGlzCiAgLy8gICAgIHByZXNlcnZlZCBhbmQgZnVsbHNjcmVlbiBzdGF5cyBpbiBpdHMgcm93LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGFkZFlvdVR1YmVCdXR0b24odmlkZW8pIHsKICAgIGlmIChfc2l0ZURpc2FibGVkKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCByaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi55dHAtcmlnaHQtY29udHJvbHMiKTsKICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTsKICAgIGlmIChyaWdodC5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgYnRuLmNsYXNzTmFtZSA9ICJ5dHAtYnV0dG9uIGJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjp0b3A7Y29sb3I6I2ZmZjsiOwogICAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDM2KTsKICAgICAgc3ZnLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTpibG9jazsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwoKICAgICAgY29uc3QgYW5jaG9yID0gcmlnaHQucXVlcnlTZWxlY3RvcigiLnl0cC1taW5pcGxheWVyLWJ1dHRvbiwgLnl0cC1zZXR0aW5ncy1idXR0b24sIC55dHAtc2l6ZS1idXR0b24iKTsKICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IucGFyZW50Tm9kZSkgewogICAgICAgIGFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShidG4sIGFuY2hvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmlnaHQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgfQogICAgICBsb2coImluamVjdGVkIG9uIFlvdVR1YmUiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgd2FybigiWW91VHViZSBpbmplY3QgZmFpbGVkOiIsIGVyci5tZXNzYWdlIHx8IGVycik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIFR3aXRjaDogY2xvbmUgdGhlIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHJpZ2h0LXNpZGUgY29udHJvbCBidXR0b24KICAvLyAoc2V0dGluZ3Mgb3IgZnVsbHNjcmVlbikgYW5kIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUgaXQsIHRoZW4gaW5zZXJ0IGF0CiAgLy8gdGhlIHNhbWUgRE9NIGxldmVsIHNvIHNwYWNpbmcvc2l6aW5nIG1hdGNoLgogIGxldCB0d2l0Y2hJbmplY3RDb3VudCA9IDA7CiAgZnVuY3Rpb24gYWRkVHdpdGNoQnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgLy8gQW5jaG9yIG9uIHRoZSBmdWxsc2NyZWVuIC8gdGhlYXRyZSByb3cgc28gd2UgbGFuZCBhbG9uZ3NpZGUgY2FzdCwKICAgIC8vIHRoZWF0cmUgYW5kIGZ1bGxzY3JlZW4g4oCUIHNldHRpbmdzIG9mdGVuIGxpdmVzIGluIGEgc2VwYXJhdGUgcm93IGluCiAgICAvLyB0aGUgcG9wb3V0IHBsYXllciBsYXlvdXQuCiAgICBjb25zdCBQRUVSX1NFTCA9CiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWZ1bGxzY3JlZW4tYnV0dG9uIl0sJyArCiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLXRoZWF0cmUtbW9kZS1idXR0b24iXSwnICsKICAgICAgJ1tkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItc2V0dGluZ3MtYnV0dG9uIl0nOwogICAgY29uc3QgYW5jaG9yQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihQRUVSX1NFTCk7CiAgICBpZiAoIWFuY2hvckJ0bikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFdhbGsgdXAgdG8gdGhlIHJvdyBjb250YWluZXIuIFR3byBzdG9wIHNpZ25hbHMsIGluIHByaW9yaXR5IG9yZGVyOgogICAgLy8gICAxLiBTdHJvbmc6IGEgcGFyZW50IHRoYXQgaGFzIG11bHRpcGxlIGNoaWxkcmVuIEFORCBjb250YWlucyBhCiAgICAvLyAgICAgIHBlZXIgY29udHJvbCBvdXRzaWRlIG91ciBjdXJyZW50IHN1YnRyZWUg4oCUIHRoYXQncyBhbG1vc3QKICAgIC8vICAgICAgY2VydGFpbmx5IHRoZSBhY3R1YWwgY29udHJvbCByb3cuCiAgICAvLyAgIDIuIFdlYWsgKGZhbGxiYWNrKTogdGhlIGZpcnN0IHBhcmVudCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuIHdlCiAgICAvLyAgICAgIHBhc3NlZCBkdXJpbmcgdGhlIHdhbGsuIFVzZWQgd2hlbiB0aGUgc3Ryb25nIHNpZ25hbCBuZXZlcgogICAgLy8gICAgICBmaXJlcywgc28gbGF5b3V0cyB0aGF0IGRvbid0IGV4cG9zZSBwZWVyIGNvbnRyb2xzIGF0IHRoZQogICAgLy8gICAgICBzYW1lIGxldmVsIHN0aWxsIHdvcmsuCiAgICAvLyBDb21iaW5lZCwgdGhpcyBhZGRyZXNzZXMgdGhlIHJldmlldyBjb25jZXJuIGFib3V0IG5vbi1jb250cm9sCiAgICAvLyBzaWJsaW5ncyBoaWphY2tpbmcgdGhlIHN0cnVjdHVyYWwgd2FsayB3aGlsZSBrZWVwaW5nIHRoZSBvcmlnaW5hbAogICAgLy8gYmVoYXZpb3VyIGFzIGEgc2FmZXR5IG5ldC4KICAgIGxldCBhbmNob3JXcmFwcGVyID0gYW5jaG9yQnRuOwogICAgbGV0IHN0cnVjdHVyYWxGYWxsYmFjayA9IG51bGw7CiAgICB3aGlsZSAoYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlICYmIGFuY2hvcldyYXBwZXIucGFyZW50Tm9kZS50YWdOYW1lICE9PSAiQk9EWSIpIHsKICAgICAgY29uc3QgcGFyZW50ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50LmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgICBjb25zdCBwZWVycyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFBFRVJfU0VMKTsKICAgICAgICBsZXQgaGFzT3V0c2lkZVBlZXIgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIWFuY2hvcldyYXBwZXIuY29udGFpbnMocGVlcnNbaV0pKSB7IGhhc091dHNpZGVQZWVyID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc091dHNpZGVQZWVyKSBicmVhazsKICAgICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgc3RydWN0dXJhbEZhbGxiYWNrID0gYW5jaG9yV3JhcHBlcjsKICAgICAgfQogICAgICBhbmNob3JXcmFwcGVyID0gcGFyZW50OwogICAgfQogICAgaWYgKCFhbmNob3JXcmFwcGVyLnBhcmVudE5vZGUgfHwgYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlLnRhZ05hbWUgPT09ICJCT0RZIikgewogICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgcmV0dXJuIGZhbHNlOwogICAgICBhbmNob3JXcmFwcGVyID0gc3RydWN0dXJhbEZhbGxiYWNrOwogICAgfQogICAgY29uc3Qgcm93ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKICAgIGlmIChyb3cucXVlcnlTZWxlY3RvcigiLmJyYXZlLXBpcC1idG4iKSkgcmV0dXJuIHRydWU7CiAgICAvLyBTYW5pdHkgY2hlY2s6IGEgaGVhbHRoeSBUd2l0Y2ggcmlnaHQtY29udHJvbHMgcm93IGNvbnRhaW5zIGF0CiAgICAvLyBsZWFzdCB0d28gb2YgdGhlIHBlZXIgYnV0dG9ucyAoc2V0dGluZ3MgKyB0aGVhdHJlICsgZnVsbHNjcmVlbikuCiAgICAvLyBJZiBvbmx5IG9uZSBpcyBwcmVzZW50LCB0aGUgd2FsayBsYW5kZWQgb24gYSBkZWdlbmVyYXRlIHJvdwogICAgLy8gKHBvcG91dCAvIGRldGFjaGVkIHBsYXllciAvIGZ1dHVyZSByZWRlc2lnbikgYW5kIHdlIHNob3VsZCBiYWlsCiAgICAvLyByYXRoZXIgdGhhbiBtaXMtdGFyZ2V0LiBDaGVhcCDigJQgb25lIHF1ZXJ5U2VsZWN0b3JBbGwsIG5vIHdhbGtpbmcuCiAgICBpZiAocm93LnF1ZXJ5U2VsZWN0b3JBbGwoUEVFUl9TRUwpLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTsKCiAgICB0cnkgewogICAgICAvLyBDbG9uZSB0aGUgYW5jaG9yJ3Mgb3V0ZXIgd3JhcHBlciAoc2hhbGxvdykgc28gd2UgaW5oZXJpdCBUd2l0Y2gncwogICAgICAvLyBzcGFjaW5nL2ZsZXggY2xhc3NlcywgdGhlbiBkcm9wIG91ciBvd24gYnV0dG9uIGluc2lkZS4KICAgICAgY29uc3Qgd3JhcHBlciA9IGFuY2hvcldyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hLXRhcmdldCIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpOwogICAgICBzdHJpcElubGluZUhhbmRsZXJzKHdyYXBwZXIpOwoKICAgICAgLy8gU2l6ZSBmcm9tIHRoZSByZW5kZXJlZCBTVkcgZ2x5cGggKHZpc3VhbGx5IGFjY3VyYXRlKS4gRmxvb3IgYXQgMjQKICAgICAgLy8gYmVjYXVzZSBUd2l0Y2gncyB1bmRlcmx5aW5nIFNWRyBlbGVtZW50IGlzIHNvbWV0aW1lcyBzbWFsbGVyIHRoYW4KICAgICAgLy8gdGhlIHZpc3VhbCBpY29uIChDU1Mgc2NhbGVzIGl0IHVwKS4KICAgICAgY29uc3QgcmVmU3ZnID0gYW5jaG9yQnRuLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpOwogICAgICBjb25zdCByZWZTdmdSZWN0ID0gcmVmU3ZnID8gcmVmU3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDsKICAgICAgY29uc3QgcmVmQnRuUmVjdCA9IGFuY2hvckJ0bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgbWVhc3VyZWQgPSByZWZTdmdSZWN0ICYmIHJlZlN2Z1JlY3Qud2lkdGggPiAwCiAgICAgICAgPyBNYXRoLm1pbihyZWZTdmdSZWN0LndpZHRoLCByZWZTdmdSZWN0LmhlaWdodCkKICAgICAgICA6IE1hdGgubWluKHJlZkJ0blJlY3Qud2lkdGgsIHJlZkJ0blJlY3QuaGVpZ2h0KSAqIDAuNzsKICAgICAgY29uc3QgaWNvblNpemUgPSBNYXRoLm1heCgyNCwgTWF0aC5yb3VuZChtZWFzdXJlZCkpOwogICAgICBjb25zdCBib3hTaXplID0gTWF0aC5tYXgoMzAsIE1hdGgucm91bmQocmVmQnRuUmVjdC53aWR0aCB8fCAzMCkpOwoKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgIGJ0bi5jbGFzc05hbWUgPSAiYnJhdmUtcGlwLWJ0biI7CiAgICAgIGJ0bi50eXBlID0gImJ1dHRvbiI7CiAgICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgICBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlBpY3R1cmUtaW4tUGljdHVyZSIpOwogICAgICBidG4uc3R5bGUuY3NzVGV4dCA9CiAgICAgICAgImJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7cGFkZGluZzowO21hcmdpbjowOyIgKwogICAgICAgICJjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyIgKwogICAgICAgICJ3aWR0aDoiICsgYm94U2l6ZSArICJweDtoZWlnaHQ6IiArIGJveFNpemUgKyAicHg7IjsKICAgICAgY29uc3Qgc3ZnID0gbWFrZVBpcFN2ZyhpY29uU2l6ZSk7CiAgICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7Y29sb3I6I2ZmZjsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwogICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGJ0bik7CgogICAgICByb3cuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIGFuY2hvcldyYXBwZXIpOwoKICAgICAgdHdpdGNoSW5qZWN0Q291bnQrKzsKICAgICAgaWYgKHR3aXRjaEluamVjdENvdW50ID09PSAxKSBsb2coImluamVjdGVkIG9uIFR3aXRjaCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICB3YXJuKCJUd2l0Y2ggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyBOZXRmbGl4OiBpbnNlcnQgaW50byB0aGUgc3RhbmRhcmQgY29udHJvbHMgYmFyLCBiZWZvcmUgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uLgogIC8vIE5ldGZsaXggcmFuZG9taXplcyBjbGFzcyBuYW1lcyBidXQgaWNvbnMgZm9sbG93IGEgY29uc2lzdGVudCBwYXR0ZXJuOgogIC8vICAgPGZsZXgtcm93PgogIC8vICAgICA8c3BhY2VyIC4xbnBxeXdyPiAuLi4gPHdyYXBwZXIgLm1lZGl1bT4gPGljb24tYnV0dG9uPiA8L3dyYXBwZXI+CiAgLy8gICAgIDxzcGFjZXIgLjFucHF5d3I+ICAgICA8d3JhcHBlciAubWVkaXVtPiA8aWNvbi1idXR0b24+IDwvd3JhcHBlcj4KICAvLyAgICAgPHNwYWNlciAuMW5wcXl3cj4gICAgIDx3cmFwcGVyIC5tZWRpdW0+IDxpY29uLWJ1dHRvbiBkYXRhLXVpYT0iY29udHJvbC1mdWxsc2NyZWVuLS4uLiI+IDwvd3JhcHBlcj4KICAvLyBXZSBjbG9uZSB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyIChhbmQgdGhlIHNwYWNlciBpbiBmcm9udCBvZiBpdCkgc28gb3VyCiAgLy8gYnV0dG9uIGdldHMgdGhlIHNhbWUgc3R5bGluZyBhbmQgcmh5dGhtIGFzIG5hdGl2ZSBpY29ucy4KICBsZXQgbmZseEluamVjdENvdW50ID0gMDsKICBmdW5jdGlvbiBhZGROZXRmbGl4QnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJyk7CiAgICBpZiAoIWJhcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGJhci5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBmcyA9IGJhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1lbnRlciJdLCBbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1leGl0Il0nKTsKICAgICAgaWYgKCFmcykgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRmluZCBOZXRmbGl4J3MgaWNvbiB3cmFwcGVyIGFyb3VuZCBmdWxsc2NyZWVuIOKAlCB0aGUgLm1lZGl1bSBjbGFzcwogICAgICAvLyBpcyB0aGUgc3RhYmxlIHNpZ25hbDsgZmFsbCBiYWNrIHRvIHRoZSBjbG9zZXN0IGRpdi4KICAgICAgY29uc3QgZnNXcmFwcGVyID0gZnMuY2xvc2VzdCgiLm1lZGl1bSIpIHx8IGZzLmNsb3Nlc3QoImRpdiIpIHx8IGZzOwogICAgICBjb25zdCByb3cgPSBmc1dyYXBwZXIucGFyZW50Tm9kZTsKICAgICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFNpemUgZnJvbSB0aGUgaW5uZXIgc3ZnIG9mIGZ1bGxzY3JlZW4ncyBidXR0b24gc28gd2UgdmlzdWFsbHkgbWF0Y2guCiAgICAgIGNvbnN0IHJlZlN2ZyA9IGZzLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpIHx8IChmcy5jbG9zZXN0KCJidXR0b24iKSB8fCBmcykucXVlcnlTZWxlY3Rvcigic3ZnIik7CiAgICAgIGNvbnN0IHJlZlN2Z1JlY3QgPSByZWZTdmcgPyByZWZTdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsOwogICAgICBjb25zdCBpY29uU2l6ZSA9IHJlZlN2Z1JlY3QgJiYgcmVmU3ZnUmVjdC53aWR0aCA+IDAKICAgICAgICA/IE1hdGgucm91bmQoTWF0aC5taW4ocmVmU3ZnUmVjdC53aWR0aCwgcmVmU3ZnUmVjdC5oZWlnaHQpKQogICAgICAgIDogMjg7CgogICAgICAvLyBDbG9uZSB0aGUgd3JhcHBlciAoc2hhbGxvdyDigJQgcHJlc2VydmVzIGNsYXNzZXMvaW5saW5lIHN0eWxlcykgYW5kCiAgICAgIC8vIGVtcHR5IGl0LCB0aGVuIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUuCiAgICAgIGNvbnN0IHdyYXBwZXIgPSBmc1dyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS11aWEiKTsKICAgICAgc3RyaXBJbmxpbmVIYW5kbGVycyh3cmFwcGVyKTsKCiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidG4uY2xhc3NOYW1lID0gImJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPQogICAgICAgICJiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO3BhZGRpbmc6MDttYXJnaW46MDsiICsKICAgICAgICAid2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyI7CiAgICAgIGNvbnN0IHN2ZyA9IG1ha2VQaXBTdmcoaWNvblNpemUpOwogICAgICBzdmcuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OmJsb2NrOyI7CiAgICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZVBpcCh2aWRlbyk7IH0pOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBfb25OYXRpdmVCdG5Db250ZXh0TWVudSk7CiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYnRuKTsKCiAgICAgIC8vIENsb25lIHRoZSBzcGFjZXIgdGhhdCBwcmVjZWRlcyB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyLCBzbyBzcGFjaW5nCiAgICAgIC8vIGJldHdlZW4gb3VyIGJ1dHRvbiBhbmQgZnVsbHNjcmVlbiBtYXRjaGVzIHRoZSByaHl0aG0gYmV0d2VlbgogICAgICAvLyBleGlzdGluZyBpY29ucy4KICAgICAgY29uc3QgcHJldlNwYWNlciA9IGZzV3JhcHBlci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwogICAgICBjb25zdCBzcGFjZXJDbG9uZSA9IChwcmV2U3BhY2VyICYmIHByZXZTcGFjZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKQogICAgICAgID8gcHJldlNwYWNlci5jbG9uZU5vZGUoZmFsc2UpCiAgICAgICAgOiBudWxsOwoKICAgICAgcm93Lmluc2VydEJlZm9yZSh3cmFwcGVyLCBmc1dyYXBwZXIpOwogICAgICBpZiAoc3BhY2VyQ2xvbmUpIHJvdy5pbnNlcnRCZWZvcmUoc3BhY2VyQ2xvbmUsIGZzV3JhcHBlcik7CgogICAgICBuZmx4SW5qZWN0Q291bnQrKzsKICAgICAgaWYgKG5mbHhJbmplY3RDb3VudCA9PT0gMSkgbG9nKCJpbmplY3RlZCBvbiBOZXRmbGl4Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHdhcm4oIk5ldGZsaXggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBHZW5lcmljIEZpcmVmb3gtc3R5bGUgb3ZlcmxheQogIC8vCiAgLy8gVXNlZCBvbiBldmVyeSBzaXRlIGJ5IGRlZmF1bHQgKHVubGVzcyBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAgaXMKICAvLyBleHBsaWNpdGx5IHNldCB0byAiMCIpLiBNaW1pY3MgRmlyZWZveCdzICJQb3Agb3V0IHRoaXMgdmlkZW8iIHRvZ2dsZToKICAvLyBhIGRhcmsgcGlsbCBhbmNob3JlZCBtaWQtcmlnaHQgb2YgdGhlIHZpZGVvIHRoYXQgZmFkZXMgaW4gb24gaG92ZXIKICAvLyBhbmQgZmFkZXMgb3V0IGFmdGVyIHRoZSBjdXJzb3IgbGVhdmVzLiBBZnRlciB0aGUgdXNlciBjbGlja3Mgb25jZSBpdAogIC8vIHNocmlua3MgdG8gaWNvbi1vbmx5IGZvciB0aGUgcmVzdCBvZiB0aGUgc2Vzc2lvbiDigJQgbGVzcyB2aXN1YWwgbm9pc2UKICAvLyBvbiBzdWJzZXF1ZW50IGhvdmVycy4KICAvLwogIC8vIEhvdmVyIGRldGVjdGlvbiBydW5zIHRocm91Z2ggdGhlIHNoYXJlZCBgX29uRG9jTW91c2VNb3ZlYCBoYW5kbGVyCiAgLy8gKHNlZSB0b3Agb2YgZmlsZSkgaW5zdGVhZCBvZiBgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIpYCwKICAvLyBiZWNhdXNlIG1hbnkgcGxheWVycyAoTmV0ZmxpeCwgY3VzdG9tKSBsYXllciB0aGVpciBVSSBvbiB0b3Agb2YgdGhlCiAgLy8gPHZpZGVvPiBhbmQgYWJzb3JiIG1vdXNlIGV2ZW50cyBiZWZvcmUgdGhleSByZWFjaCBpdC4gQSBnbG9iYWwKICAvLyBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIGJ5cGFzc2VzIHRoYXQuCiAgLy8KICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSBwaWxsIGlzIHRhcC10by1yZXZlYWwgKDMgcyBhdXRvLWZhZGUpIGluc3RlYWQuCiAgLy8KICAvLyBgdGVhcmRvd25zYCBpcyBhbiBhcnJheSB0aGUgY2FsbGVyIChgYXR0YWNoVG9WaWRlb2ApIGhhbmRzIGluOyB3ZQogIC8vIHB1c2ggY2xlYW51cCBjbG9zdXJlcyBvbnRvIGl0IHNvIGEgbGF0ZXIgY2xlYW51cCBvZiB0aGlzIHZpZGVvCiAgLy8gcmVsZWFzZXMgZXZlcnkgbGlzdGVuZXIgLyBvYnNlcnZlciAvIERPTSBub2RlIHdlIGNyZWF0ZWQgaGVyZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIFJlYWNoaW5nIGhlcmUgbWVhbnMgYGF0dGFjaFRvVmlkZW9gJ3MgYHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKWAKICAgIC8vIGd1YXJkIGFscmVhZHkgc2hvcnQtY2lyY3VpdGVkIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zLCBzbyBubwogICAgLy8gc2VwYXJhdGUgZGF0YXNldCBtYXJrZXIgaXMgbmVlZGVkLgogICAgLy8gUGVyLW9yaWdpbiBvcHQtb3V0OiBza2lwIGJ1aWxkaW5nIGFueXRoaW5nIGlmIHRoZSB1c2VyIHByZXZpb3VzbHkKICAgIC8vIGRpc2FibGVkIHRoZSBwaWxsIG9uIHRoaXMgc2l0ZSB2aWEgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuCiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuOwogICAgY29uc3QgUEFERElOR19GVUxMID0gIjhweCAxNHB4IDhweCAxMHB4IjsKICAgIGNvbnN0IFBBRERJTkdfSUNPTiA9ICI4cHgiOwoKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgYnRuLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0KICAgICAgInBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDsiICsKICAgICAgInBhZGRpbmc6IiArIFBBRERJTkdfRlVMTCArICI7IiArCiAgICAgICJib3JkZXI6MDtib3JkZXItcmFkaXVzOjhweDsiICsKICAgICAgImJhY2tncm91bmQ6cmdiYSgyOCwyOCwzMCwwLjkyKTtjb2xvcjojZmZmOyIgKwogICAgICAiZm9udDo2MDAgMTNweC8xIHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxzYW5zLXNlcmlmOyIgKwogICAgICAiY3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiYm94LXNoYWRvdzowIDJweCA4cHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAib3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAwLjE1cyBlYXNlOyIgKwogICAgICAicG9pbnRlci1ldmVudHM6YXV0bzt1c2VyLXNlbGVjdDpub25lOyI7CiAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDE4KTsKICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7IjsKICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICJQb3Agb3V0IHRoaXMgdmlkZW8iOwogICAgYnRuLmFwcGVuZENoaWxkKGxhYmVsKTsKCiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCAoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNob3dEaXNhYmxlTWVudShlLmNsaWVudFgsIGUuY2xpZW50WSk7CiAgICB9KTsKCiAgICBsZXQgY2xpY2tlZCA9IGZhbHNlOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBpZiAoIWNsaWNrZWQpIHsKICAgICAgICBjbGlja2VkID0gdHJ1ZTsKICAgICAgICAvLyBTdXBwcmVzcyBmYWRlIHNvIHRoZSBpY29uLW9ubHkgcGlsbCBpcyBpbiBpdHMgZmluYWwgcG9zaXRpb24KICAgICAgICAvLyBiZWZvcmUgdGhlIHVzZXIgbm90aWNlcyB0aGUgY2hhbmdlLgogICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gYnRuLnN0eWxlLnRyYW5zaXRpb247CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSAibm9uZSI7CiAgICAgICAgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9IFBBRERJTkdfSUNPTjsKICAgICAgICBidG4uc3R5bGUuZ2FwID0gIjAiOwogICAgICAgIHVwZGF0ZSgpOyAvLyBzeW5jaHJvbm91cyByZXBvc2l0aW9uIGZvciB0aGUgbmV3IChzbWFsbGVyKSBib3gKICAgICAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyB0aGUgbmV4dCBzdHlsZSBjaGFuZ2UgaXMgY29tbWl0dGVkIHdpdGhvdXQKICAgICAgICAvLyBhIHRyYW5zaXRpb24sIHRoZW4gcmVzdG9yZSB0aGUgZmFkZSB0cmFuc2l0aW9uLgogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMKICAgICAgICBidG4ub2Zmc2V0V2lkdGg7CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsKICAgICAgfQogICAgICB0b2dnbGVQaXAodmlkZW8pOwogICAgfSk7CiAgICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGJ0bik7CgogICAgbGV0IGhvdmVyID0gZmFsc2U7CiAgICBsZXQgaG92ZXJUaW1lciA9IG51bGw7CiAgICBsZXQgbGFzdFJlY3QgPSBudWxsOwogICAgbGV0IHRvdWNoSGlkZVRpbWVyID0gbnVsbDsKICAgIGZ1bmN0aW9uIHNldEhvdmVyKHYpIHsKICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICBpZiAodikgeyBob3ZlciA9IHRydWU7IHVwZGF0ZSgpOyB9CiAgICAgIGVsc2UgICB7IGhvdmVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgaG92ZXIgPSBmYWxzZTsgdXBkYXRlKCk7IH0sIENPTkZJRy5IT1ZFUl9HUkFDRV9NUyk7IH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0OwogICAgICBpZiAoIXIpIHJldHVybjsKICAgICAgY29uc3Qgb3ZlclZpZGVvID0KICAgICAgICB4ID49IHIubGVmdCAmJiB4IDw9IHIucmlnaHQgJiYKICAgICAgICB5ID49IHIudG9wICAmJiB5IDw9IHIuYm90dG9tOwogICAgICBsZXQgb3ZlckJ0biA9IGZhbHNlOwogICAgICBpZiAoYnRuLnN0eWxlLmRpc3BsYXkgIT09ICJub25lIikgewogICAgICAgIGNvbnN0IGJSZWN0ID0gYnRuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIG92ZXJCdG4gPQogICAgICAgICAgeCA+PSBiUmVjdC5sZWZ0ICYmIHggPD0gYlJlY3QucmlnaHQgJiYKICAgICAgICAgIHkgPj0gYlJlY3QudG9wICAmJiB5IDw9IGJSZWN0LmJvdHRvbTsKICAgICAgfQogICAgICBpZiAob3ZlclZpZGVvIHx8IG92ZXJCdG4pIHsgaWYgKCFob3Zlcikgc2V0SG92ZXIodHJ1ZSk7IH0KICAgICAgZWxzZSBpZiAoaG92ZXIpIHNldEhvdmVyKGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0IHx8IHZpZGVvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBsYXN0UmVjdCA9IHI7CiAgICAgIGNvbnN0IG92ZXJWaWRlbyA9CiAgICAgICAgeCA+PSByLmxlZnQgJiYgeCA8PSByLnJpZ2h0ICYmCiAgICAgICAgeSA+PSByLnRvcCAgJiYgeSA8PSByLmJvdHRvbTsKICAgICAgaWYgKCFvdmVyVmlkZW8pIHJldHVybjsKICAgICAgc2V0SG92ZXIodHJ1ZSk7CiAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgY2xlYXJUaW1lb3V0KHRvdWNoSGlkZVRpbWVyKTsKICAgICAgdG91Y2hIaWRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0b3VjaEhpZGVUaW1lciA9IG51bGw7CiAgICAgICAgc2V0SG92ZXIoZmFsc2UpOwogICAgICB9LCBDT05GSUcuVE9VQ0hfUkVWRUFMX01TKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgIC8vIE1hdGNoIEZpcmVmb3g6IHNob3cgb24gaG92ZXIgcmVnYXJkbGVzcyBvZiBwYXVzZWQgc3RhdGUuIE9ubHkKICAgICAgLy8gcmVxdWlyZSB0aGF0IHRoZSB2aWRlbyBoYXMgbWV0YWRhdGEgbG9hZGVkIChzbyBQaVAgaXMgdXNhYmxlKSwKICAgICAgLy8gaXMgdmlzaWJsZSwgYW5kIHdlJ3JlIG5vdCBpbiBmdWxsc2NyZWVuIChpbmNsLiBpT1Mgd2Via2l0IEZTKS4KICAgICAgLy8gQWxzbyBob25vdXIgYSBtaWQtc2Vzc2lvbiBkaXNhYmxlIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUKICAgICAgLy8gKGNhY2hlZCBgX3NpdGVEaXNhYmxlZGAgZmxhZyDigJQgbm8gbG9jYWxTdG9yYWdlIGhpdCBwZXIgdGljaykuCiAgICAgIGlmIChfc2l0ZURpc2FibGVkKSB7CiAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlYWR5ID0gdmlkZW8ucmVhZHlTdGF0ZSA+PSAxOwogICAgICBjb25zdCBmcyA9IGlzRnVsbHNjcmVlbih2aWRlbyk7CiAgICAgIGNvbnN0IHIgPSB2aWRlby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbGFzdFJlY3QgPSByOwogICAgICBjb25zdCBvblNjcmVlbiA9IHIud2lkdGggPiAwICYmIHIuaGVpZ2h0ID4gMCAmJiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCBpbm5lckhlaWdodDsKICAgICAgLy8gWW91VHViZSBVUkwgZ2F0ZSArIFNQQS1uYXYtZ3JhY2UuIFJlZnJlc2ggdGhlIGNhY2hlZCBwcmV2aWV3LWFyZWEKICAgICAgLy8gZmxhZyBhbmQgc3RhbXAgYSBuYXZpZ2F0aW9uIHRpbWVzdGFtcCBvbiBwYXRoIGNoYW5nZSwgdGhlbgogICAgICAvLyBzdXBwcmVzcyBlbGlnaWJpbGl0eSB3aGlsZSB3ZSdyZSBlaXRoZXIgb24gYSBub24td2F0Y2ggVVJMIG9yCiAgICAgIC8vIGluc2lkZSB0aGUgcG9zdC1uYXYgZ3JhY2Ugd2luZG93IChhYnNvcmJzIHRoZSBicmllZiBmbGFzaCB3aGVuCiAgICAgIC8vIGEgaG9tZXBhZ2UgdGh1bWJuYWlsIGNsaWNrIGxhbmRzIHRoZSBjdXJzb3Igb24gdGhlIG5ldyBwbGF5ZXIpLgogICAgICBpZiAoX3l0SG9zdCAmJiBfeXRMYXN0UGF0aCAhPT0gbG9jYXRpb24ucGF0aG5hbWUpIHsKICAgICAgICBfeXRMYXN0UGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgIF95dFByZXZpZXdBcmVhID0gIV95dFdhdGNoUGF0aC50ZXN0KF95dExhc3RQYXRoKTsKICAgICAgICBfeXROYXZBdCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICAgIGNvbnN0IF9pbk5hdkdyYWNlID0gX3l0TmF2QXQgJiYgKHBlcmZvcm1hbmNlLm5vdygpIC0gX3l0TmF2QXQpIDwgQ09ORklHLllUX05BVl9HUkFDRV9NUzsKICAgICAgY29uc3QgZWxpZ2libGUgPSByZWFkeSAmJiAhZnMgJiYgb25TY3JlZW4gJiYgIV95dFByZXZpZXdBcmVhICYmICFfaW5OYXZHcmFjZTsKICAgICAgaWYgKCFlbGlnaWJsZSkgewogICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gIm5vbmUiOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtZmxleCI7CiAgICAgIGNvbnN0IHcgPSBidG4ub2Zmc2V0V2lkdGggfHwgMTcwOwogICAgICBjb25zdCBoID0gYnRuLm9mZnNldEhlaWdodCB8fCAzNjsKCiAgICAgIC8vIENvbXB1dGUgbWlkLXJpZ2h0IG9mIHRoZSAqdmlzaWJsZSogcG9ydGlvbiBvZiB0aGUgdmlkZW8gKHRoZQogICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgaXRzIHJlY3Qgd2l0aCB0aGUgdmlld3BvcnQpLiBOZXRmbGl4J3MgPHZpZGVvPgogICAgICAvLyBjYW4gYmUgbXVjaCB0YWxsZXIgdGhhbiB0aGUgdmlld3BvcnQuCiAgICAgIGNvbnN0IHZpc1RvcCA9IE1hdGgubWF4KHIudG9wLCAwKTsKICAgICAgY29uc3QgdmlzQm90dG9tID0gTWF0aC5taW4oci5ib3R0b20sIGlubmVySGVpZ2h0KTsKICAgICAgY29uc3QgdmlzUmlnaHQgPSBNYXRoLm1pbihyLnJpZ2h0LCBpbm5lcldpZHRoKTsKICAgICAgbGV0IHRvcCA9IE1hdGgucm91bmQodmlzVG9wICsgKHZpc0JvdHRvbSAtIHZpc1RvcCAtIGgpIC8gMikgKyBDT05GSUcuUElMTF9PRkZTRVRfWTsKICAgICAgbGV0IGxlZnQgPSBNYXRoLnJvdW5kKHZpc1JpZ2h0IC0gdyAtIENPTkZJRy5QSUxMX1JJR0hUX01BUkdJTik7CiAgICAgIC8vIEZpbmFsIHZpZXdwb3J0IGNsYW1wLgogICAgICB0b3AgPSBNYXRoLm1heChDT05GSUcuVklFV1BPUlRfUEFELCBNYXRoLm1pbih0b3AsIGlubmVySGVpZ2h0IC0gaCAtIENPTkZJRy5WSUVXUE9SVF9QQUQpKTsKICAgICAgbGVmdCA9IE1hdGgubWF4KENPTkZJRy5WSUVXUE9SVF9QQUQsIE1hdGgubWluKGxlZnQsIGlubmVyV2lkdGggLSB3IC0gQ09ORklHLlZJRVdQT1JUX1BBRCkpOwoKICAgICAgYnRuLnN0eWxlLnRvcCA9IHRvcCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gaG92ZXIgPyAiMSIgOiAiMCI7CiAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gaG92ZXIgPyAiYXV0byIgOiAibm9uZSI7CiAgICB9CgogICAgY29uc3Qgb25CdG5FbnRlciA9ICgpID0+IHNldEhvdmVyKHRydWUpOwogICAgY29uc3Qgb25CdG5MZWF2ZSA9ICgpID0+IHNldEhvdmVyKGZhbHNlKTsKCiAgICAvLyBQZXItdmlkZW8gbGlzdGVuZXJzIHN0YXkgb24gdGhlIHZpZGVvIGVsZW1lbnQuIERvY3VtZW50L3dpbmRvdwogICAgLy8gbGlzdGVuZXJzIGFyZSBzaGFyZWQgdmlhIHRoZSBtb2R1bGUtbGV2ZWwgYG92ZXJsYXlzYCByZWdpc3RyeQogICAgLy8gKG9uZSBzZXQgb2YgZ2xvYmFscyByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHZpZGVvcyBhcmUgb24gdGhlIHBhZ2UpLgogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgb25CdG5MZWF2ZSk7CiAgICBjb25zdCBWSURFT19FVkVOVFMgPSBbInBsYXkiLCJwbGF5aW5nIiwicGF1c2UiLCJlbmRlZCIsImVtcHRpZWQiLCJsb2FkZWRkYXRhIl07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFZJREVPX0VWRU5UUy5sZW5ndGg7IGkrKykgewogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIH0KICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGJlZ2luZnVsbHNjcmVlbiIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICByby5vYnNlcnZlKHZpZGVvKTsKCiAgICBjb25zdCBpbnN0YW5jZSA9IHsgdXBkYXRlLCBoYW5kbGVQb2ludGVyLCBoYW5kbGVUb3VjaCB9OwogICAgb3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIHZpZGVvVG9PdmVybGF5LnNldCh2aWRlbywgaW5zdGFuY2UpOwogICAgY29uc3QgaW8gPSBnZXRJTygpOwogICAgaWYgKGlvKSB7CiAgICAgIGlvLm9ic2VydmUodmlkZW8pOwogICAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBmaXJlcyBhIGNhbGxiYWNrIHN5bmNocm9ub3VzbHkgYWZ0ZXIKICAgICAgLy8gb2JzZXJ2ZSgpIGluIGEgbWljcm90YXNrLiBVbnRpbCB0aGVuIGFzc3VtZSB0aGUgdmlkZW8gaXMKICAgICAgLy8gdmlzaWJsZSBzbyB0aGUgdmVyeSBmaXJzdCB1cGRhdGUoKSBydW5zLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIElPIHN1cHBvcnQg4oCUIGZhbGwgYmFjayB0byAiYWx3YXlzIHZpc2libGUiLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0KICAgIGFybUdsb2JhbHMoKTsKICAgIHVwZGF0ZSgpOwoKICAgIGlmICh0ZWFyZG93bnMpIHsKICAgICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICAgIG92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgaWYgKGludGVyc2VjdGlvbk9ic2VydmVyKSBpbnRlcnNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUodmlkZW8pOwogICAgICAgIHZpZGVvVG9PdmVybGF5LmRlbGV0ZSh2aWRlbyk7CiAgICAgICAgYnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgICAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIG9uQnRuTGVhdmUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVklERU9fRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB9CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2Via2l0YmVnaW5mdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICByby5kaXNjb25uZWN0KCk7CiAgICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgeyBjbGVhclRpbWVvdXQodG91Y2hIaWRlVGltZXIpOyB0b3VjaEhpZGVUaW1lciA9IG51bGw7IH0KICAgICAgICBidG4ucmVtb3ZlKCk7CiAgICAgICAgbWF5YmVEaXNhcm1HbG9iYWxzKCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29uZmlndXJhdGlvbiAmIGRpc3BhdGNoCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBlci1vcmlnaW4gYGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcGAgZmxhZy4KICAvLyBEZWZhdWx0IGlzIE9OOiBldmVyeSBzaXRlIHVzZXMgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIHVubGVzcyB0aGUKICAvLyB1c2VyIGhhcyBleHBsaWNpdGx5IG9wdGVkIGludG8gbmF0aXZlIGluamVjdGlvbiAoc2V0IHRoZSBmbGFnIHRvCiAgLy8gIjAiIC8gImZhbHNlIiAvICJubyIgLyAib2ZmIikuIFdyYXBwZWQgaW4gdHJ5L2NhdGNoIGJlY2F1c2UKICAvLyBsb2NhbFN0b3JhZ2UgYWNjZXNzIHRocm93cyBpbiBwcml2YXRlIC8gc2FuZGJveGVkIGNvbnRleHRzLgogIC8vCiAgLy8gRXhjZXB0aW9uOiB3d3cueW91dHViZS5jb20sIHd3dy50d2l0Y2gudHYgYW5kIHd3dy5uZXRmbGl4LmNvbQogIC8vIGRlZmF1bHQgdG8gT0ZGIChuYXRpdmUgaW5qZWN0aW9uKSBiZWNhdXNlIHRoZWlyIHBsYXllcnMgYWxyZWFkeQogIC8vIGhhdmUgZmlyc3QtY2xhc3MgY29udHJvbCBiYXJzIHdoZXJlIGEgbmF0aXZlIGJ1dHRvbiBsb29rcyBhdCBob21lLgogIC8vIE9ubHkgdGhlIGV4YWN0IGRlc2t0b3AgaG9zdG5hbWVzIGFyZSB0YXJnZXRlZCDigJQgbS4vbXVzaWMuL21vYmlsZQogIC8vIHN1YmRvbWFpbnMga2VlcCB0aGUgZ2VuZXJpYy1waWxsIGRlZmF1bHQuIFRoZSB1c2VyIGNhbiBmbGlwIHRoZQogIC8vIGZsYWcgZXhwbGljaXRseSBwZXIgb3JpZ2luIHRvIG92ZXJyaWRlLgogIC8vCiAgLy8gUmVhZCBsYXppbHkgb24gZmlyc3QgdXNlIChub3QgYXQgSUlGRSBpbml0KSBzbyB0aGF0IHVzZXJzY3JpcHQKICAvLyBtYW5hZ2VycyBvciBwb2x5ZmlsbCBzaGltcyB0aGF0IHJlcGxhY2UgYGxvY2FsU3RvcmFnZWAgc2xpZ2h0bHkKICAvLyBhZnRlciBvdXIgc2NyaXB0IGxvYWRzIHN0aWxsIHNlZSBhIGNvbnNpc3RlbnQgdmFsdWUuIEFmdGVyIHRoZQogIC8vIGZpcnN0IHJlYWQgaXQncyBjYWNoZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwYWdlIGxpZmV0aW1lIOKAlCB0aGUKICAvLyB2YWx1ZSBjYW4ndCBjaGFuZ2Ugd2l0aG91dCBhIHJlbG9hZC4KICBjb25zdCBOQVRJVkVfREVGQVVMVF9IT1NUUyA9IG5ldyBTZXQoWyJ3d3cueW91dHViZS5jb20iLCAid3d3LnR3aXRjaC50diIsICJ3d3cubmV0ZmxpeC5jb20iXSk7CiAgZnVuY3Rpb24gX2RlZmF1bHRHZW5lcmljRm9ySG9zdCgpIHsKICAgIHJldHVybiAhTkFUSVZFX0RFRkFVTFRfSE9TVFMuaGFzKGxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiByZWFkR2VuZXJpY1BpcEZvcmNlZCgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlZ2VuZXJpY19waXAiKTsKICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsKICAgICAgY29uc3QgcyA9IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKICAgICAgaWYgKHMgPT09ICIwIiB8fCBzID09PSAiZmFsc2UiIHx8IHMgPT09ICJubyIgfHwgcyA9PT0gIm9mZiIpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIHsgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsgfQogIH0KICBsZXQgX2dlbmVyaWNQaXBGb3JjZWRDYWNoZSA9IG51bGw7IC8vIG51bGwgPSBub3QgeWV0IHJlYWQKICBmdW5jdGlvbiBnZW5lcmljUGlwRm9yY2VkQ2FjaGVkKCkgewogICAgaWYgKF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPT09IG51bGwpIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPSByZWFkR2VuZXJpY1BpcEZvcmNlZCgpOwogICAgcmV0dXJuIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGU7CiAgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IHdoZW4gdHJ1dGh5LCB0aGUgZ2VuZXJpYyBvdmVybGF5IHBpbGwgaXMKICAvLyBzdXBwcmVzc2VkIG9uIHRoaXMgc2l0ZS4gU2V0IHZpYSB0aGUgcmlnaHQtY2xpY2sgbWVudSBvbiB0aGUgcGlsbDsKICAvLyBjbGVhcmVkIGZyb20gRGV2VG9vbHMgd2l0aCBgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImJyYXZlX3BpcF9kaXNhYmxlZCIpYC4KICAvLwogIC8vIFRoZSBmbGFnIGlzIGNhY2hlZCBpbiBgX3NpdGVEaXNhYmxlZGAgYWZ0ZXIgdGhlIGluaXRpYWwgYmFpbC1vdXQKICAvLyBjaGVjayBzbyB0aGUgaG90IHBhdGhzICh1cGRhdGUoKSBydW5zIHBlciB2aXNpYmxlIHZpZGVvIHBlcgogIC8vIGFuaW1hdGlvbiBmcmFtZSkgZG9uJ3QgaGF2ZSB0byBoaXQgbG9jYWxTdG9yYWdlIGV2ZXJ5IHRpY2suIFRoZQogIC8vIG1lbnUncyBjbGljayBoYW5kbGVyIGZsaXBzIHRoZSBjYWNoZWQgdmFsdWUgd2hlbiB0aGUgdXNlciBkaXNhYmxlcwogIC8vIG1pZC1zZXNzaW9uLgogIGNvbnN0IERJU0FCTEVfS0VZID0gImJyYXZlX3BpcF9kaXNhYmxlZCI7CiAgZnVuY3Rpb24gcmVhZFNpdGVEaXNhYmxlZCgpIHsKICAgIHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShESVNBQkxFX0tFWSkgPT09ICIxIjsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfQogIH0KICBmdW5jdGlvbiBzZXRTaXRlRGlzYWJsZWQoKSB7CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShESVNBQkxFX0tFWSwgIjEiKTsgfSBjYXRjaCB7fQogIH0KICAvLyBDYWNoZWQgZmxhZyDigJQgdXBkYXRlZCBvbiBpbml0IGFuZCBvbiBtaWQtc2Vzc2lvbiBkaXNhYmxlLgogIGxldCBfc2l0ZURpc2FibGVkID0gZmFsc2U7CgogIC8vIFNoYXJlZCByaWdodC1jbGljayBoYW5kbGVyIGF0dGFjaGVkIHRvIGV2ZXJ5IG5hdGl2ZSBpbmplY3RlZCBidXR0b24KICAvLyAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpLiBNaXJyb3JzIHRoZSBnZW5lcmljIHBpbGwncyBjb250ZXh0bWVudQogIC8vIHdpcmluZyBzbyB1c2VycyBjYW4gZGlzYWJsZSBQaVAgb24gdGhlIGhvc3Qgc2l0ZSBmcm9tIGFueSBvZiBvdXIgVUlzLgogIGZ1bmN0aW9uIF9vbk5hdGl2ZUJ0bkNvbnRleHRNZW51KGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzaG93RGlzYWJsZU1lbnUoZS5jbGllbnRYLCBlLmNsaWVudFkpOwogIH0KCiAgLy8gUmVtb3ZlcyBhbnkgb2Ygb3VyIGluamVjdGVkIERPTSAobmF0aXZlIGJ1dHRvbnMgKyBjbG9uZWQgd3JhcHBlcnMpLgogIC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIHBpY2tzICJEaXNhYmxlIFBpUCBpY29uIG9uIDxzaXRlPiIgZnJvbSB0aGUKICAvLyByaWdodC1jbGljayBtZW51IHNvIHRoZSBwYWdlIHJldHVybnMgdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS4KICBmdW5jdGlvbiBfcmVtb3ZlTmF0aXZlQnV0dG9ucygpIHsKICAgIGNvbnN0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJyYXZlLXBpcC1idG4sIC5icmF2ZS1waXAtd3JhcHBlciIpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgbm9kZXNbaV0ucmVtb3ZlKCk7CiAgfQoKICAvLyBTaW5nbGUtaW5zdGFuY2UgY3VzdG9tIGNvbnRleHQgbWVudSBzaG93biBvbiByaWdodC1jbGljayBvZiB0aGUKICAvLyBnZW5lcmljIHBpbGwgb3IgYW55IG5hdGl2ZSBpbmplY3RlZCBidXR0b24uIFdlIGNhbid0IGN1c3RvbWlzZSB0aGUKICAvLyBicm93c2VyJ3MgbmF0aXZlIGNvbnRleHQgbWVudSB3aXRob3V0IGFuIGV4dGVuc2lvbiwgc28gd2UgY2FuY2VsIGl0CiAgLy8gKGBwcmV2ZW50RGVmYXVsdGApIGFuZCByZW5kZXIgb3VyIG93biBET00uIEF1dG8tZGlzbWlzc2VzIG9uCiAgLy8gY2xpY2stb3V0c2lkZSwgRXNjYXBlLCBvciBzY3JvbGwuCiAgbGV0IGFjdGl2ZU1lbnUgPSBudWxsOwogIC8vIFRpbWVzdGFtcCB3aGVuIHRoZSBhY3RpdmUgbWVudSB3YXMgb3BlbmVkLiBPdXRzaWRlLWNsaWNrcyB3aXRoaW4gYQogIC8vIHNob3J0IHdpbmRvdyAofjE1MCBtcykgb2Ygb3BlbmluZyBhcmUgaWdub3JlZCDigJQgZGVmZW5kcyBhZ2FpbnN0IGEKICAvLyBzeW50aGV0aWMgc2FtZS1mcmFtZSBjbGljayBieXBhc3NpbmcgdGhlIHNldFRpbWVvdXQoMCkgaGFuZG9mZi4KICBsZXQgYWN0aXZlTWVudU9wZW5lZEF0ID0gMDsKICBjb25zdCBNRU5VX09QRU5fR1VBUkRfTVMgPSAxNTA7CiAgZnVuY3Rpb24gY2xvc2VNZW51KCkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBhY3RpdmVNZW51LnJlbW92ZSgpOwogICAgYWN0aXZlTWVudSA9IG51bGw7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgX29uTWVudUtleSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgY2xvc2VNZW51LCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGNsb3NlTWVudSk7CiAgfQogIGZ1bmN0aW9uIF9vbk1lbnVLZXkoZSkgeyBpZiAoZS5rZXkgPT09ICJFc2NhcGUiKSBjbG9zZU1lbnUoKTsgfQogIGZ1bmN0aW9uIF9vbk1lbnVDbGlja091dHNpZGUoZSkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBpZiAoZS50aW1lU3RhbXAgLSBhY3RpdmVNZW51T3BlbmVkQXQgPCBNRU5VX09QRU5fR1VBUkRfTVMpIHJldHVybjsKICAgIGlmICghYWN0aXZlTWVudS5jb250YWlucyhlLnRhcmdldCkpIGNsb3NlTWVudSgpOwogIH0KICBmdW5jdGlvbiBzaG93RGlzYWJsZU1lbnUoeCwgeSkgewogICAgY2xvc2VNZW51KCk7CiAgICBjb25zdCBtZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBtZW51LnN0eWxlLmNzc1RleHQgPQogICAgICAicG9zaXRpb246Zml4ZWQ7bGVmdDoiICsgeCArICJweDt0b3A6IiArIHkgKyAicHg7IiArCiAgICAgICJiYWNrZ3JvdW5kOnJnYmEoMjgsMjgsMzAsMC45Nik7Y29sb3I6I2ZmZjsiICsKICAgICAgImJvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NHB4IDA7IiArCiAgICAgICJib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAiei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiZm9udDo1MDAgMTNweC8xLjQgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sU2Vnb2UgVUksUm9ib3RvLHNhbnMtc2VyaWY7IiArCiAgICAgICJ1c2VyLXNlbGVjdDpub25lO3BvaW50ZXItZXZlbnRzOmF1dG87bWluLXdpZHRoOjE4MHB4OyI7CgogICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaXRlbS50ZXh0Q29udGVudCA9ICJEaXNhYmxlIFBpUCBpY29uIG9uICIgKyBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjhweCAxNHB4O2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcDsiOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjEyKSI7IH0pOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAiIjsgfSk7CiAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBzZXRTaXRlRGlzYWJsZWQoKTsKICAgICAgX3NpdGVEaXNhYmxlZCA9IHRydWU7CiAgICAgIC8vIEhpZGUgZXZlcnkgYWN0aXZlIGdlbmVyaWMgcGlsbCBvbiB0aGlzIHBhZ2UgaW1tZWRpYXRlbHkuIFRoZQogICAgICAvLyBuZXh0IGB1cGRhdGUoKWAgdGljayB3aWxsIHNlZSB0aGUgY2FjaGVkIGZsYWcgYW5kIGtlZXAgdGhlbQogICAgICAvLyBoaWRkZW4uIE5hdGl2ZSBpbmplY3RlZCBidXR0b25zIChZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeCkKICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGRpcmVjdGx5IOKAlCB0aGVpciBwZXJzaXN0ZW50IG9ic2VydmVycwogICAgICAvLyB3aWxsIHNlZSBgX3NpdGVEaXNhYmxlZGAgYW5kIHN0b3AgcmUtaW5qZWN0aW5nLgogICAgICBfc2NoZWR1bGVVcGRhdGVBbGwoKTsKICAgICAgX3JlbW92ZU5hdGl2ZUJ1dHRvbnMoKTsKICAgICAgbG9nKCJkaXNhYmxlZCBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUpOwogICAgICBjbG9zZU1lbnUoKTsKICAgIH0pOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgYWN0aXZlTWVudSA9IG1lbnU7CiAgICBhY3RpdmVNZW51T3BlbmVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKCiAgICAvLyBJZiB0aGUgbWVudSB3b3VsZCBvdmVyZmxvdyB0aGUgdmlld3BvcnQsIG51ZGdlIGl0IGJhY2sgaW4uCiAgICBjb25zdCByID0gbWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmIChyLnJpZ2h0ID4gaW5uZXJXaWR0aCkgIG1lbnUuc3R5bGUubGVmdCA9IChpbm5lcldpZHRoICAtIHIud2lkdGggIC0gOCkgKyAicHgiOwogICAgaWYgKHIuYm90dG9tID4gaW5uZXJIZWlnaHQpIG1lbnUuc3R5bGUudG9wICA9IChpbm5lckhlaWdodCAtIHIuaGVpZ2h0IC0gOCkgKyAicHgiOwoKICAgIC8vIERlZmVyIGxpc3RlbmVyIGF0dGFjaCB0byB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gdGhlIGNsaWNrIHRoYXQKICAgIC8vIG9wZW5lZCB0aGUgbWVudSBkb2Vzbid0IGltbWVkaWF0ZWx5IGRpc21pc3MgaXQuCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIF9vbk1lbnVLZXksIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBjbG9zZU1lbnUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBjbG9zZU1lbnUpOwogICAgfSwgMCk7CiAgfQoKICAvLyBOYXRpdmUtc2l0ZSBhZGFwdGVyIHRhYmxlLiBFYWNoIGVudHJ5IGRlc2NyaWJlcyBvbmUgc2l0ZSB3aG9zZQogIC8vIHBsYXllciBjaHJvbWUgd2Uga25vdyBob3cgdG8gaW5qZWN0IGludG8uIERldGVjdGlvbiBpcyBob3N0bmFtZS0KICAvLyBmaXJzdCAoaGFuZGxlcyByZWd1bGFyIHBhZ2VzKSB3aXRoIGEgRE9NLXNpZ25hbCBmYWxsYmFjayAoaGFuZGxlcwogIC8vIGFib3V0OmJsYW5rIHNhbWUtb3JpZ2luIGlmcmFtZXMgd2hlcmUgbG9jYXRpb24uaG9zdG5hbWUgaXMgIiIpLgogIC8vCiAgLy8gVG8gc3VwcG9ydCBhIG5ldyBzaXRlLCBhZGQgYSByZWNvcmQgaGVyZSBhbmQgd3JpdGUgYSBtYXRjaGluZwogIC8vIGBhZGQ8TmFtZT5CdXR0b24odmlkZW8pYCBpbmplY3RvciDigJQgbm8gb3RoZXIgY2hhbmdlIHJlcXVpcmVkLgogIGNvbnN0IE5BVElWRV9TSVRFUyA9IFsKICAgIHsKICAgICAgbmFtZTogIllvdVR1YmUiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoInlvdXR1YmUuY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5odG1sNS12aWRlby1wbGF5ZXIsIC55dHAtcmlnaHQtY29udHJvbHMiKSwKICAgICAgaW5qZWN0OiBhZGRZb3VUdWJlQnV0dG9uLAogICAgICBzY29wZTogIi5odG1sNS12aWRlby1wbGF5ZXIiLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlR3aXRjaCIsCiAgICAgIG1hdGNoOiAoaG9zdCkgPT4gaG9zdC5lbmRzV2l0aCgidHdpdGNoLnR2IikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXIsIFtkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItY29udHJvbHMiXScpLAogICAgICBpbmplY3Q6IGFkZFR3aXRjaEJ1dHRvbiwKICAgICAgc2NvcGU6ICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWNvbnRyb2xzIl0sIC52aWRlby1wbGF5ZXInLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIk5ldGZsaXgiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoIm5ldGZsaXguY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVpYT0iY29udHJvbHMtc3RhbmRhcmQiXSwgW2RhdGEtdWlhPSJ2aWRlby1jYW52YXMiXScpLAogICAgICBpbmplY3Q6IGFkZE5ldGZsaXhCdXR0b24sCiAgICAgIHNjb3BlOiAnW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJywKICAgIH0sCiAgXTsKCiAgLy8gUnVuIGFuIGluamVjdG9yIG9uY2Ugbm93IGFuZCBhZ2FpbiBvbiBldmVyeSByZWxldmFudCBET00gbXV0YXRpb24sCiAgLy8gc28gdGhlIGJ1dHRvbiByZWFwcGVhcnMgYWZ0ZXIgUmVhY3QgKE5ldGZsaXggLyBUd2l0Y2gpIHRlYXJzIGRvd24KICAvLyBhbmQgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIuIFRoZSBvYnNlcnZlciBzdGFydHMgb24gPGh0bWw+IGlmCiAgLy8gdGhlIHNjb3BlZCBjb250YWluZXIgaXNuJ3QgaW4gdGhlIERPTSB5ZXQsIHRoZW4gInByb21vdGVzIiBpdHNlbGYKICAvLyB0byB0aGUgc21hbGxlciBzdWJ0cmVlIGFzIHNvb24gYXMgaXQgYXBwZWFycyDigJQgbWluaW1pc2luZyBjaHVybi4KICAvLwogIC8vIFJlc2lsaWVuY2UgdG8gaG9zdCByZWRlc2lnbnM6IGlmIHRoZSBpbmplY3RvciBrZWVwcyByZXR1cm5pbmcgZmFsc2UKICAvLyBmb3IgYE5BVElWRV9GQUxMQkFDS19NU2AgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIHdlIGRpc2Nvbm5lY3QgdGhlCiAgLy8gb2JzZXJ2ZXIgYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQg4oCUIHNvIHVzZXJzCiAgLy8gYWx3YXlzIGdldCAqc29tZSogUGlQIGNvbnRyb2wgZXZlbiBpZiBZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeAogIC8vIGNoYW5nZXMgaXRzIERPTSBpbiBhIHdheSB0aGF0IGJyZWFrcyBvdXIgc2VsZWN0b3JzLiBUaGUgZmFsbGJhY2sgaXMKICAvLyBhcm1lZCBvbmx5IG9uY2UgcGVyIHZpZGVvIGFuZCBvbmx5IHRyaWdnZXJzIGlmIHRoZSBpbmplY3RvciBoYXMKICAvLyAqbmV2ZXIqIHN1Y2NlZWRlZDsgaW50ZXJtaXR0ZW50IGZhaWx1cmVzIGR1cmluZyBhIHJlLW1vdW50IGRvbid0CiAgLy8gY291bnQuCiAgZnVuY3Rpb24gdHJ5TmF0aXZlKHZpZGVvLCBpbmplY3Rvciwgc2NvcGVTZWxlY3RvciwgdGVhcmRvd25zKSB7CiAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGxldCBldmVyU3VjY2VlZGVkID0gISFpbmplY3Rvcih2aWRlbyk7CiAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgICBsZXQgZmVsbEJhY2sgPSBmYWxzZTsKICAgIC8vIEFsd2F5cyBvYnNlcnZlIGF0IGRvY3VtZW50IGxldmVsLiBXZSB0cmllZCBwcm9tb3RpbmcgdG8gYSBzY29wZWQKICAgIC8vIHN1YnRyZWUgKGFuZCB0byB0aGUgc2NvcGVkIHRhcmdldCdzIHBhcmVudCkgZm9yIGxvd2VyIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIGJ1dCBOZXRmbGl4IHJlLW1vdW50cyB3aG9sZSBwbGF5ZXIgc3VidHJlZXMgb24gdmlzaWJpbGl0eQogICAgLy8gY2hhbmdlcyDigJQgbGVhdmluZyBhbnkgbmFycm93ZXIgb2JzZXJ2ZXIgYXR0YWNoZWQgdG8gYSBkZXRhY2hlZAogICAgLy8gbm9kZSwgd2l0aCBubyB3YXkgdG8gZGV0ZWN0IGRldGFjaG1lbnQgYmVjYXVzZSBubyBtdXRhdGlvbnMgZmlyZQogICAgLy8gb24gdGhlIGRldGFjaGVkIG5vZGUuIFRoZSByQUYtY29hbGVzY2VkIGNhbGxiYWNrIGJlbG93IGNhcHMgd29yawogICAgLy8gYXQgb25lIGluamVjdG9yIGNhbGwgcGVyIGFuaW1hdGlvbiBmcmFtZSByZWdhcmRsZXNzIG9mIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIHNvIGRvY3VtZW50LWxldmVsIG9ic2VydmF0aW9uIHN0YXlzIGJvdW5kZWQuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgIGlmIChzY2hlZHVsZWQgfHwgZmVsbEJhY2spIHJldHVybjsKICAgICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICBpZiAoZmVsbEJhY2spIHJldHVybjsKICAgICAgICBpZiAoaW5qZWN0b3IodmlkZW8pKSB7CiAgICAgICAgICBldmVyU3VjY2VlZGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFldmVyU3VjY2VlZGVkICYmCiAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCA+PSBDT05GSUcuTkFUSVZFX0ZBTExCQUNLX01TKSB7CiAgICAgICAgICBmZWxsQmFjayA9IHRydWU7CiAgICAgICAgICBvYnMuZGlzY29ubmVjdCgpOwogICAgICAgICAgd2FybigibmF0aXZlIGluamVjdGlvbiB1bmF2YWlsYWJsZSBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUgKwogICAgICAgICAgICAgICAiOyBmYWxsaW5nIGJhY2sgdG8gZ2VuZXJpYyBwaWxsIik7CiAgICAgICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIG9icy5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICBpZiAodGVhcmRvd25zKSB0ZWFyZG93bnMucHVzaCgoKSA9PiBvYnMuZGlzY29ubmVjdCgpKTsKICB9CgogIC8vIERlY2lkZXMgd2hpY2ggVUkgdG8gYWRkIGZvciBhIGdpdmVuIHZpZGVvIGFuZCB3aXJlcyBpdCB1cC4gQ2FsbGVkCiAgLy8gZXhhY3RseSBvbmNlIHBlciB2aWRlbyBieSBgYXR0YWNoVG9WaWRlb2AuIFRoZSBgdGVhcmRvd25zYCBhcnJheSBpcwogIC8vIHBvcHVsYXRlZCB3aXRoIGNsZWFudXAgY2xvc3VyZXMgdGhhdCB0aGUgZGlzY292ZXJ5IG9ic2VydmVyJ3MKICAvLyByZW1vdmVkLW5vZGVzIHBhdGggd2lsbCBydW4uCiAgZnVuY3Rpb24gYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIEdlbmVyaWMgb3ZlcmxheSBpcyB0aGUgZGVmYXVsdC4gU2V0IGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcD0iMCIKICAgIC8vIChvciBmYWxzZS9uby9vZmYpIHBlci1vcmlnaW4gdG8gb3B0IGJhY2sgaW50byBuYXRpdmUgaW5qZWN0aW9uLgogICAgaWYgKGdlbmVyaWNQaXBGb3JjZWRDYWNoZWQoKSkgewogICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICBsb2coImluamVjdGVkIG92ZXJsYXkiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGhvc3QgPSBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTkFUSVZFX1NJVEVTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHNpdGUgPSBOQVRJVkVfU0lURVNbaV07CiAgICAgIGlmIChzaXRlLm1hdGNoKGhvc3QpKSB7CiAgICAgICAgdHJ5TmF0aXZlKHZpZGVvLCBzaXRlLmluamVjdCwgc2l0ZS5zY29wZSwgdGVhcmRvd25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAvLyBVbnJlY29nbmlzZWQgc2l0ZSAoYW5kIHVzZXIgb3B0ZWQgb3V0IG9mIGdlbmVyaWMgdmlhIGxvY2FsU3RvcmFnZSk6CiAgICAvLyBzdGlsbCBpbnN0YWxsIHRoZSBvdmVybGF5IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyBuYXRpdmUgdG8gYW5jaG9yIHRvLgogICAgYWRkT3ZlcmxheUJ1dHRvbih2aWRlbywgdGVhcmRvd25zKTsKICAgIGxvZygiaW5qZWN0ZWQgb3ZlcmxheSIpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGVyLXZpZGVvIHNldHVwICsgdGVhcmRvd24KICAvLwogIC8vIFJ1bnMgb25jZSBwZXIgPHZpZGVvPiBlbGVtZW50LiBUaGUgYHRlYXJkb3duc2AgYXJyYXkgaXMgdGhlIHNpbmdsZQogIC8vIHBsYWNlIGV2ZXJ5IGxpc3RlbmVyIC8gb2JzZXJ2ZXIgLyBET00gbm9kZSB3ZSBhZGQgZm9yIHRoaXMgdmlkZW8gaXMKICAvLyByZWNvcmRlZDsgdGhlIGRpc2NvdmVyeSBvYnNlcnZlciBiZWxvdyBjYWxscyB0aGVtIHdoZW4gdGhlIHZpZGVvIGlzCiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRoZSBzY3JpcHQgZG9lc24ndCBsZWFrIG9uIGxvbmctbGl2ZWQgU1BBCiAgLy8gcGFnZXMgd2l0aCBpbmZpbml0ZSBzY3JvbGwuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gYXR0YWNoVG9WaWRlbyh2aWRlbykgewogICAgaWYgKHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKSkgcmV0dXJuOwoKICAgIC8vIFNvbWUgc2l0ZXMgKE5ldGZsaXgsIGNlcnRhaW4gRFJNIHBsYXllcnMpIGV4cGxpY2l0bHkgZGlzYWJsZSBQaVAuCiAgICAvLyBDbGVhciBpdCBub3cgYW5kIHdhdGNoIChiZWxvdykgZm9yIHRoZSBwYWdlIHJlLXNldHRpbmcgaXQuCiAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgdmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgPSBmYWxzZTsKICAgICAgdmlkZW8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScpOwogICAgfQogICAgLy8gV2lyZSBhdXRvbWF0aWMtUGlQIGludGVudCAoYnJvd3NlcnMgd2l0aCBhdXRvLVBpUCBmZWF0dXJlLCBlLmcuCiAgICAvLyBDaHJvbWUgZmxhZywgZmlyZSB0aGlzIG9uIHRhYiBzd2l0Y2gpLiBUaGUgaGFuZGxlciBpcyBnbG9iYWwgcGVyCiAgICAvLyBkb2N1bWVudCDigJQgbGFzdCByZWdpc3RyYXRpb24gd2lucyDigJQgc28gb24gcGFnZXMgd2l0aCBtdWx0aXBsZQogICAgLy8gPHZpZGVvPiBlbGVtZW50cyAoWW91VHViZSB3YXRjaDogbWFpbiBwbGF5ZXIgKyBob3Zlci10aHVtYm5haWwKICAgIC8vIHByZXZpZXdzICsgYWQgcHJlLXJvbGwpIHRoZSAqbGFzdCogbW91bnRlZCB2aWRlbyB3b3VsZCBiZSBQaVAnZCwKICAgIC8vIHdoaWNoIGlzIGZyZXF1ZW50bHkgYSBoaWRkZW4vZW1wdHkgcHJldmlldyDihpIgYmxhY2sgUGlQIHdpbmRvdwogICAgLy8gd2l0aCBubyBjb250cm9scyBhbmQgYSBkZXN5bmNlZCBkdXJhdGlvbi4KICAgIC8vIFBpY2sgdGhlIG1vc3QgcGxhdXNpYmxlICJhY3RpdmUiIHZpZGVvIGF0IGZpcmUgdGltZSBpbnN0ZWFkOgogICAgLy8gdGhlIG9uZSBjdXJyZW50bHkgaW4gUGlQICh0b2dnbGluZyBvdXQpLCBlbHNlIHRoZSBsYXJnZXN0IHBsYXlpbmcKICAgIC8vIHZpZGVvLCBlbHNlIHRoZSBsYXJnZXN0IHZpZGVvIHdpdGggbWV0YWRhdGEuIE5vLW9wIG9uIGJyb3dzZXJzCiAgICAvLyB0aGF0IGRvbid0IHN1cHBvcnQgaXQ7IHRoZSB0cnkvY2F0Y2ggZ3VhcmRzIGlPUyAvIG9sZGVyIGJyb3dzZXJzLgogICAgdHJ5IHsKICAgICAgbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKCJlbnRlcnBpY3R1cmVpbnBpY3R1cmUiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgdiA9IHBpY2tBdXRvUGlwVGFyZ2V0KCkgfHwgdmlkZW87CiAgICAgICAgdHJ5IHsgYXdhaXQgdi5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpOyB9IGNhdGNoIChlKSB7IHdhcm4oImF1dG8tUGlQIGZhaWxlZDoiLCBlLm1lc3NhZ2UgfHwgZSk7IH0KICAgICAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciAqLyB9CgogICAgY29uc3QgdGVhcmRvd25zID0gW107CgogICAgYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwoKICAgIC8vIE9ubHkgcmVzdW1lIG9uIGVudGVyaW5nIFBpUCBpZiB0aGUgdmlkZW8gd2FzIGFjdHVhbGx5IHBsYXlpbmcgd2hlbgogICAgLy8gdGhlIHRyYW5zaXRpb24gZmlyZWQuIFRoZSBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGB2aWRlby5wbGF5KClgCiAgICAvLyBvdmVycm9kZSB1c2VyLWluaXRpYXRlZCBwYXVzZXMgKGUuZy4gWW91VHViZSBhdXRvLVBpUCBvbiB0YWItc3dpdGNoCiAgICAvLyB3b3VsZCB1bi1wYXVzZSBhIHBhdXNlZCB2aWRlbykuIENhcHR1cmUgc3RhdGUgYXQgaGFuZGxlciBhdHRhY2gKICAgIC8vIHRpbWUgYW5kIHJlZnJlc2ggb24gcGxheS9wYXVzZSBldmVudHMuCiAgICBsZXQgd2FzUGxheWluZyA9ICF2aWRlby5wYXVzZWQgJiYgIXZpZGVvLmVuZGVkOwogICAgY29uc3Qgb25QbGF5U3RhdGUgPSAoKSA9PiB7IHdhc1BsYXlpbmcgPSAhdmlkZW8ucGF1c2VkICYmICF2aWRlby5lbmRlZDsgfTsKICAgIGNvbnN0IFBMQVlfRVZFTlRTID0gWyJwbGF5IiwgInBsYXlpbmciLCAicGF1c2UiLCAiZW5kZWQiXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUExBWV9FVkVOVFMubGVuZ3RoOyBpKyspIHsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgfQogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFBMQVlfRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCBvbkVudGVyUGlwID0gKCkgPT4gewogICAgICBpZiAoIXdhc1BsYXlpbmcpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh3YXNQbGF5aW5nICYmIHZpZGVvLnBhdXNlZCkgdmlkZW8ucGxheSgpOyB9LCAyNTApOwogICAgfTsKICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImVudGVycGljdHVyZWlucGljdHVyZSIsIG9uRW50ZXJQaXApOwogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW50ZXJwaWN0dXJlaW5waWN0dXJlIiwgb25FbnRlclBpcCkpOwoKICAgIC8vIFdhdGNoIGZvciBzaXRlcyAoZS5nLiBOZXRmbGl4KSByZS1hZGRpbmcgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUuCiAgICBjb25zdCBkcGlwT2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgICB2aWRlby5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IGZhbHNlOwogICAgICAgIHZpZGVvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnKTsKICAgICAgfQogICAgfSk7CiAgICBkcGlwT2JzLm9ic2VydmUodmlkZW8sIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJ10gfSk7CiAgICB0ZWFyZG93bnMucHVzaCgoKSA9PiBkcGlwT2JzLmRpc2Nvbm5lY3QoKSk7CgogICAgdmlkZW9DbGVhbnVwcy5zZXQodmlkZW8sICgpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZWFyZG93bnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgeyB0ZWFyZG93bnNbaV0oKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSBpbmRpdmlkdWFsIHRlYXJkb3duIGVycm9ycyAqLyB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG9wLWxldmVsIHNldHVwICsgZGlzY292ZXJ5IG9ic2VydmVyCiAgLy8KICAvLyBPbmUgcGVyc2lzdGVudCBNdXRhdGlvbk9ic2VydmVyIHRyYWNrcyA8dmlkZW8+IGVsZW1lbnRzIGJlaW5nIGFkZGVkCiAgLy8gdG8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSBvdmVyIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEFkZCDihpIgd2lyZSB1cC4KICAvLyBSZW1vdmUg4oaSIHJ1biB0aGUgcmVnaXN0ZXJlZCB0ZWFyZG93biBjbG9zdXJlIGZvciB0aGF0IHZpZGVvLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUoKSB7CiAgICAvLyBBdHRhY2ggdG8gZXZlcnkgPHZpZGVvPiBjdXJyZW50bHkgb24gdGhlIHBhZ2UuCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpLmZvckVhY2goYXR0YWNoVG9WaWRlbyk7CgogICAgLy8gS2VlcCB3YXRjaGluZyBmb3IgdmlkZW9zIGFkZGVkIGxhdGVyIChsYXp5LWxvYWRlZCBmZWVkcywgU1BBIHJvdXRlCiAgICAvLyBjaGFuZ2VzLCBlbWJlZGRlZCBwbGF5ZXJzIHRoYXQgbW91bnQgYWZ0ZXIgZmlyc3QgcGFpbnQsIGV0Yy4pLgogICAgLy8gSW5kZXhlZCBsb29wcyArIG5vZGVUeXBlIGNoZWNrIGFyZSBmcmllbmRsaWVyIHRvIFY4J3MgaW5saW5lCiAgICAvLyBjYWNoZXMgdGhhbiBmb3Itb2YgKyBpbnN0YW5jZW9mIG9uIGhvdCBET00tbXV0YXRpb24gcGF0aHMuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihfb25Eb21NdXRhdGlvbnMpOwogICAgb2JzLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIF9ydW5DbGVhbnVwKHZpZGVvKSB7CiAgICBjb25zdCBmbiA9IHZpZGVvQ2xlYW51cHMuZ2V0KHZpZGVvKTsKICAgIGlmICghZm4pIHJldHVybjsKICAgIHZpZGVvQ2xlYW51cHMuZGVsZXRlKHZpZGVvKTsKICAgIHRyeSB7IGZuKCk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgZnVuY3Rpb24gX29uRG9tTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7CiAgICAgIGNvbnN0IG11ID0gbXV0YXRpb25zW2ldOwoKICAgICAgY29uc3QgYWRkZWQgPSBtdS5hZGRlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgYWxlbiA9IGFkZGVkLmxlbmd0aDsgaiA8IGFsZW47IGorKykgewogICAgICAgIGNvbnN0IG5vZGUgPSBhZGRlZFtqXTsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgY29udGludWU7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICJWSURFTyIpIHsKICAgICAgICAgIGF0dGFjaFRvVmlkZW8obm9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7CiAgICAgICAgICBjb25zdCB2aWRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCB2bGVuID0gdmlkcy5sZW5ndGg7IGsgPCB2bGVuOyBrKyspIGF0dGFjaFRvVmlkZW8odmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdCByZW1vdmVkID0gbXUucmVtb3ZlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgcmxlbiA9IHJlbW92ZWQubGVuZ3RoOyBqIDwgcmxlbjsgaisrKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IHJlbW92ZWRbal07CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIGNvbnRpbnVlOwogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAiVklERU8iKSB7CiAgICAgICAgICBfcnVuQ2xlYW51cChub2RlKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKICAgICAgICAgIGNvbnN0IHZpZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwogICAgICAgICAgZm9yIChsZXQgayA9IDAsIHZsZW4gPSB2aWRzLmxlbmd0aDsgayA8IHZsZW47IGsrKykgX3J1bkNsZWFudXAodmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBCb290CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIEJhaWwgb3V0IGVhcmx5IG9uIGJyb3dzZXJzIHdpdGggbm8gUGlQIEFQSSBhdCBhbGwgKGV4dHJlbWVseSBvbGQgb3IKICAvLyBleG90aWMpLiBBdm9pZHMgcmVnaXN0ZXJpbmcgbGlzdGVuZXJzIHdlJ2QgbmV2ZXIgdXNlLgogIGlmICghUElQX1NVUFBPUlRFRCkgcmV0dXJuOwoKICAvLyBTY29wZTogb25seSBydW4gaW4gdGhlIHRvcC1sZXZlbCBmcmFtZS4gRW1iZWRkZWQgcGxheWVycyAoZS5nLgogIC8vIHd3dy55b3V0dWJlLmNvbS9lbWJlZC88aWQ+IGlmcmFtZXMgaW5zaWRlIHRoaXJkLXBhcnR5IHBhZ2VzKSBnZXQKICAvLyBuZWl0aGVyIG5hdGl2ZSBpbmplY3Rpb24gbm9yIHRoZSBnZW5lcmljLXBpbGwgZmFsbGJhY2sg4oCUIHRoZSBob3N0CiAgLy8gc2l0ZSBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBQaVAgVVggaW5zaWRlIGlmcmFtZXMuIFRoaXMga2VlcHMKICAvLyB0aGUgc2NyaXB0IGZvY3VzZWQgb24gY2Fub25pY2FsIGRlc2t0b3Agc2Vzc2lvbnMgYW5kIGF2b2lkcwogIC8vIGRvdWJsZS1pbmplY3Rpb24gd2hlbiBib3RoIHRoZSBwYXJlbnQgZnJhbWUgYW5kIHRoZSBlbWJlZCBtYXRjaAogIC8vIGEgdXNlcidzIGZpbHRlciBydWxlLgogIHRyeSB7IGlmICh3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZikgcmV0dXJuOyB9IGNhdGNoIChlKSB7IHJldHVybjsgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IGlmIHRoZSB1c2VyIHByZXZpb3VzbHkgc2VsZWN0ZWQgIkRpc2FibGUgUGlQIGljb24KICAvLyBvbiA8c2l0ZT4iIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUsIHRoaXMgZmxhZyBwZXJzaXN0cyBpbgogIC8vIGxvY2FsU3RvcmFnZS4gQmFpbCBiZWZvcmUgYW55IHNldHVwIHNvIHRoZSBzY3JpcHQgaXMgYSB0cnVlIG5vLW9wCiAgLy8gZm9yIHRoYXQgb3JpZ2luIOKAlCBubyBvYnNlcnZlcnMsIG5vIGxpc3RlbmVycywgbm8gd29yay4gT3RoZXIKICAvLyBvcmlnaW5zIGFyZSB1bmFmZmVjdGVkIGJlY2F1c2UgbG9jYWxTdG9yYWdlIGlzIHBhcnRpdGlvbmVkIHBlci1vcmlnaW4uCiAgLy8gV2UgYWxzbyBzZWVkIHRoZSBjYWNoZWQgYF9zaXRlRGlzYWJsZWRgIGZsYWcgaGVyZSAoaXJyZWxldmFudCBpZiB3ZQogIC8vIHJldHVybiwgYnV0IGtlZXBzIHRoZSBjYWNoZSBsaXZlIGluIHRoZSBub3QteWV0LWRpc2FibGVkIGNhc2UpLgogIF9zaXRlRGlzYWJsZWQgPSByZWFkU2l0ZURpc2FibGVkKCk7CiAgaWYgKF9zaXRlRGlzYWJsZWQpIHJldHVybjsKCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCiAgICAgIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgc2V0dXBBdXRvUGljdHVyZUluUGljdHVyZSgpOwogIH0KfSkoKTs="},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUKCmNvbnN0IHNwb29mQnJhbmRzID0gKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgaWYgKGl0ZW0/LmJyYW5kPy50b0xvd2VyQ2FzZSgpID09PSAnYnJhdmUnKSB7CiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGJyYW5kOiAnR29vZ2xlIENocm9tZScgfTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0pOwp9OwoKY29uc3Qgb3JpZ2luYWxCcmFuZHMgPSBuYXZpZ2F0b3I/LnVzZXJBZ2VudERhdGE/LmJyYW5kczsKaWYgKG9yaWdpbmFsQnJhbmRzKSB7CiAgY29uc3Qgc3Bvb2ZlZEJyYW5kcyA9IHNwb29mQnJhbmRzKG9yaWdpbmFsQnJhbmRzKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF2aWdhdG9yVUFEYXRhLnByb3RvdHlwZSwgJ2JyYW5kcycsIHsKICAgIHZhbHVlOiBzcG9vZmVkQnJhbmRzCiAgfSk7Cn0KCmNvbnN0IG9yaWdpbmFsR2V0SGlnaEVudHJvcHlWYWx1ZXMgPQogIE5hdmlnYXRvclVBRGF0YT8ucHJvdG90eXBlPy5nZXRIaWdoRW50cm9weVZhbHVlczsKCmlmIChvcmlnaW5hbEdldEhpZ2hFbnRyb3B5VmFsdWVzKSB7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdmlnYXRvclVBRGF0YS5wcm90b3R5cGUsICdnZXRIaWdoRW50cm9weVZhbHVlcycsIHsKICAgIHZhbHVlOiBhc3luYyBmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcyhoaW50cykgewogICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgb3JpZ2luYWxHZXRIaWdoRW50cm9weVZhbHVlcy5jYWxsKAogICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnREYXRhLAogICAgICAgIGhpbnRzCiAgICAgICk7CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdHMpKSB7CiAgICAgICAgaWYgKGtleSA9PT0gJ2JyYW5kcycgfHwga2V5ID09PSAnZnVsbFZlcnNpb25MaXN0JykgewogICAgICAgICAgcmVzdWx0c1trZXldID0gc3Bvb2ZCcmFuZHMocmVzdWx0c1trZXldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfSk7Cn0KCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICBOYXZpZ2F0b3JVQURhdGEucHJvdG90eXBlLmdldEhpZ2hFbnRyb3B5VmFsdWVzLCAndG9TdHJpbmcnLCB7CiAgdmFsdWU6ICgpID0+ICdmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcygpIHsgW25hdGl2ZSBjb2RlXSB9Jwp9KTsK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play-update.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXktdXBkYXRlLmpzCi8vIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpIHsKICBjb25zdCBob3N0ID0gbG9jYXRpb24uaG9zdG5hbWU7CiAgY29uc3QgSVNfWU9VVFVCRSA9IC8oPzpefC4rXC4peW91dHViZSg/Oi1ub2Nvb2tpZSk/XC5jb20kLy50ZXN0KGhvc3QpOwogIGNvbnN0IElTX1ZJTUVPID0gLyg/Ol58LitcLil2aW1lb1wuY29tJC8udGVzdChob3N0KTsKCiAgLy8gUGFnZSBWaXNpYmlsaXR5IEFQSQogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnaGlkZGVuJywgewogICAgICBnZXQoKSB7IHJldHVybiBmYWxzZTsgfSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgZ2V0KCkgeyByZXR1cm4gJ3Zpc2libGUnOyB9LAogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnb252aXNpYmlsaXR5Y2hhbmdlJywgewogICAgICBnZXQoKSB7IHJldHVybiBudWxsOyB9LAogICAgICBzZXQoKSB7fSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gQmxvY2sgZXZlbnQgZGVsaXZlcnkgKGNhcHR1cmU9dHJ1ZSB0byBpbnRlcmNlcHQgZWFybHkpCiAgY29uc3Qgc3RvcCA9IChlKSA9PiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogIGNvbnN0IElTX0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8CiAgICAgICAgICAgICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICB0cnkgewogICAgLy8gU2tpcCB2aXNpYmlsaXR5Y2hhbmdlIGJsb2NraW5nIG9uIGlPUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1lZGlhIGJhY2tncm91bmRpbmcKICAgIGlmICghSVNfSU9TKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBzdG9wLCB0cnVlKTsKICAgIH0KICB9IGNhdGNoIChlKSB7fQoKICAvLyBGdWxsc2NyZWVuIEFQSSAoVmltZW8pCiAgaWYgKElTX1ZJTUVPKSB7CiAgICB0cnkgewogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHN0b3AsIHRydWUpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIC8vIFlvdVR1YmUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzCiAgaWYgKElTX1lPVVRVQkUpIHsKICAgIC8vIFVzZXIgYWN0aXZpdHkgdHJhY2tpbmcKICAgIGNvbnN0IExBQ1RfUkVGUkVTSCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWluCiAgICB3YWl0Rm9yTGFjdCgoKSA9PiByZWZyZXNoTGFjdCgpLCBMQUNUX1JFRlJFU0gpOwoKICAgIGZ1bmN0aW9uIGdldFZpZGVvKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigneXRkLXBsYXllciB2aWRlbywgI21vdmllX3BsYXllciB2aWRlbywgdmlkZW8nKTsKICAgIH0KCiAgICBsZXQgbGFzdFVzZXJJbnB1dCA9IDA7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CgogICAgLy8gTWVkaWEga2V5cyBnbyB0aHJvdWdoIE1lZGlhU2Vzc2lvbiwgbm90IGtleWRvd24uIFBhdGNoIHRoZSBwcm90b3R5cGUKICAgIC8vIHNvIHBhdXNlL3BsYXkgaGFuZGxlcnMgdXBkYXRlIGxhc3RVc2VySW5wdXQuCiAgICB0cnkgewogICAgICBjb25zdCBvcmlnU2V0ID0gTWVkaWFTZXNzaW9uLnByb3RvdHlwZS5zZXRBY3Rpb25IYW5kbGVyOwogICAgICBNZWRpYVNlc3Npb24ucHJvdG90eXBlLnNldEFjdGlvbkhhbmRsZXIgPSBmdW5jdGlvbihhY3QsIGgpIHsKICAgICAgICByZXR1cm4gb3JpZ1NldC5jYWxsKHRoaXMsIGFjdCwgKGFjdCAhPT0gJ3BhdXNlJyAmJiBhY3QgIT09ICdwbGF5JykgPyBoIDogZnVuY3Rpb24oLi4uYSkgewogICAgICAgICAgbGFzdFVzZXJJbnB1dCA9IERhdGUubm93KCk7CiAgICAgICAgICBpZiAodHlwZW9mIGggPT09ICdmdW5jdGlvbicpIHJldHVybiBoLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICBpZiAodikgYWN0ID09PSAncGF1c2UnID8gdi5wYXVzZSgpIDogdi5wbGF5KCkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBbJ3BhdXNlJywgJ3BsYXknXS5mb3JFYWNoKGEgPT4gbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKGEsIG51bGwpKTsKICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgZnVuY3Rpb24gb25WaWRlb05hdmlnYXRpb24oKSB7CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICAgIGlmIChJU19JT1MpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkZW8gPSBnZXRWaWRlbygpOwogICAgICAgIGlmICghdmlkZW8pIHJldHVybjsKICAgICAgICBpZiAodmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlcikgewogICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB2aWRlby5fYmdQbGF5UGF1c2VIYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHsKICAgICAgICAgIC8vIElmIHVzZXIgY2xpY2tlZCBvciBwcmVzc2VkIGEga2V5IHdpdGhpbiAzcyBiZWZvcmUgdGhlIHBhdXNlLCBpdCdzIGludGVudGlvbmFsCiAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RVc2VySW5wdXQgPCAzMDAwKSByZXR1cm47CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICAgIGlmICh2ICYmIHYucGF1c2VkICYmICF2LmVuZGVkICYmIHYucmVhZHlTdGF0ZSA+PSAyKSB2LnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICB9LCA4MDApOwogICAgICAgIH07CiAgICAgICAgdmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlciA9IGhhbmRsZXI7CiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVyKTsKICAgICAgfSwgMTUwMCk7CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3l0LW5hdmlnYXRlLWZpbmlzaCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1wYWdlLWRhdGEtdXBkYXRlZCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKCiAgICAvLyBTaW11bGF0ZSB1c2VyIGludGVyYWN0aW9uIHRvIHByZXZlbnQgIkFyZSB5b3Ugc3RpbGwgd2F0Y2hpbmc/IgogICAgY29uc3QgSU5URVJBQ1RJT05fSU5URVJWQUwgPSAxMCAqIDYwICogMTAwMDsgLy8gMTAgbWluCiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgaWYgKHBsYXllcikgewogICAgICAgIHBsYXllci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW1vdmUnLCB7IGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICB9CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICB9LCBJTlRFUkFDVElPTl9JTlRFUlZBTCk7CgogICAgLy8gS2VlcCBwbGF5ZXIgc3RhdGUgdXBkYXRlZAogICAgY29uc3QgUExBWUVSX1NUQVRFX0lOVEVSVkFMID0gNjAgKiAxMDAwOyAvLyAxIG1pbgogICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBjb25zdCB2aWRlbyA9IGdldFZpZGVvKCk7CiAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8ucGF1c2VkKSB7CiAgICAgICAgdmlkZW8uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3RpbWV1cGRhdGUnKSk7CiAgICAgIH0KICAgIH0sIFBMQVlFUl9TVEFURV9JTlRFUlZBTCk7CiAgfQoKICBmdW5jdGlvbiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIGRlbGF5ID0gMTAwMCkgewogICAgY29uc3QgbWF4RGVsYXkgPSA2MCAqIDEwMDA7IC8vIGNhcCBhdCA2MHMKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCAnX2xhY3QnKSkgewogICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dCgKICAgICAgICAoKSA9PiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIE1hdGgubWluKGRlbGF5ICogMiwgbWF4RGVsYXkpKSwKICAgICAgICBkZWxheQogICAgICApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaExhY3QoKSB7CiAgICB0cnkgewogICAgICBpZiAod2luZG93Ll9sYWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"brave-yt-sabr-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gWW91VHViZSdzIFNBQlIgKFNlcnZlciBBZGFwdGl2ZSBCaXRyYXRlKSBwcm90b2NvbCBzZW5kcyBhIGJhY2tvZmZUaW1lTXMKLy8gdmFsdWUgdGVsbGluZyB0aGUgcGxheWVyIHRvIHdhaXQgYmVmb3JlIHJlcXVlc3RpbmcgdmlkZW8gZGF0YS4gVGhpcwovLyBjb3ZlcnMgdGhlIGFkIHNsb3QgZHVyYXRpb24uIFdpdGhvdXQgYW4gYWRibG9ja2VyIHRoZSBhZCBmaWxscyB0aGUgd2FpdCwKLy8gc28gdGhlIHVzZXIgbmV2ZXIgbm90aWNlcy4gV2l0aCBhbiBhZGJsb2NrZXIsIHRoZSBhZCBpcyBibG9ja2VkIGJ1dCB0aGUKLy8gYmFja29mZiByZW1haW5zLCBjYXVzaW5nIGEgNC0xNiBzZWNvbmQgc3Bpbm5lci4KLy8gRnJvbTogaHR0cHM6Ly9pdGVyLmNhL3Bvc3QveXQtYWRibG9jay8KLy8KLy8gVHdvLXByb25nZWQgZml4OgovLwovLyAxLiBTUEEgbmF2aWdhdGlvbjogV2hlbiBjbGlja2luZyBiZXR3ZWVuIHZpZGVvcyB3aXRob3V0IGEgcGFnZSByZWxvYWQsCi8vICAgIHRoZSBwbGF5ZXIgcmV1c2VzIHRoZSBvbGQgU0FCUiBzZXNzaW9uICh3aGljaCBtYXkgYWxyZWFkeSBoYXZlIGEKLy8gICAgYmFja29mZikuIE9uIHl0LW5hdmlnYXRlLWZpbmlzaCwgd2Ugc2V0IGlzSW5saW5lUGxheWJhY2tOb0FkIG9uIHRoZQovLyAgICBwbGF5ZXIncyB2aWRlbyBkYXRhICh0ZWxsaW5nIGl0IHRoZXJlJ3Mgbm8gYWQgc2xvdCksIHRoZW4gY2FsbAovLyAgICBjYW5jZWxQbGF5YmFjaygpICsgbG9hZFZpZGVvQnlJZCgpIHRvIGZvcmNlIGEgbmV3IFNBQlIgc2Vzc2lvbi4KLy8KLy8gMi4gU0FCUiByZXNwb25zZSBwYXRjaGluZyAoZnVsbCBwYWdlIGxvYWRzKTogSW50ZXJjZXB0IFNBQlIgc3RyZWFtaW5nCi8vICAgIHJlc3BvbnNlcyBhbmQgcmV3cml0ZSBiYWNrb2ZmVGltZU1zIGluIHRoZSBwcm90b2J1Zi4gVGhpcyBoYW5kbGVzCi8vICAgIHBhZ2UgcmVsb2FkcyBhbmQgZGlyZWN0IG5hdmlnYXRpb25zIHdoZXJlIHRoZSBTQUJSIHNlc3Npb24gd2FzCi8vICAgIGFscmVhZHkgZXN0YWJsaXNoZWQgYmVmb3JlIHRoZSBzY3JpcHRsZXQgY291bGQgaW50ZXJ2ZW5lLgovLwovLyBUbyB1c2UgdGhpcyBzY3JpcHRsZXQ6Ci8vIDEuIEdvIHRvIGJyYXZlOi8vc2V0dGluZ3Mvc2hpZWxkcy9maWx0ZXJzCi8vIDIuIEVuYWJsZSBEZXZlbG9wZXIgbW9kZQovLyAzLiBDbGljayBvbiBjcmVhdGUgbmV3IHNjcmlwdGxldAovLyA0LiBBZGQgdGhpcyBjb250ZW50IGFuZCBuYW1lIGl0IGB1c2VyLXl0LXNhYnItZml4LmpzYAovLyA1LiBBZGQgYSBjdXN0b20gZmlsdGVyOiBgd3d3LnlvdXR1YmUuY29tIyMranModXNlci15dC1zYWJyLWZpeC5qcylgCi8vIDYuIEdvIHRvIFlvdVR1YmUgYW5kIHRlc3QKCihmdW5jdGlvbigpIHsKICAgIGNvbnN0IERFQlVHID0gZmFsc2U7CiAgICBjb25zdCBMT0dfUFJFRklYID0gJ1t5dC1zYWJyLWZpeF0nOwogICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IGVsYXBzZWQgPSAoKSA9PiAoKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMCkudG9GaXhlZCgyKSArICdzJzsKICAgIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7IGlmIChERUJVRykgY29uc29sZS5sb2coTE9HX1BSRUZJWCwgZWxhcHNlZCgpLCAuLi5hcmdzKTsgfTsKCiAgICAvLyBQcmVtaXVtIGFjY291bnRzIGhhdmUgbm8gYWRzIGFuZCBubyBiYWNrb2ZmLCBub3RoaW5nIHRvIGRvLgogICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EjbG9nb1t0aXRsZSo9IlByZW1pdW0iIGldJykpIHJldHVybjsKCiAgICAvLyBQcm9uZyAxOiBPbiBTUEEgbmF2aWdhdGlvbiwgZm9yY2UgYSBuZXcgYWQtZnJlZSBTQUJSIHNlc3Npb24uCiAgICAvLyBTZXQgaXNJbmxpbmVQbGF5YmFja05vQWQgb24gdGhlIHZpZGVvIGRhdGEgc28gdGhlIG5ldyBzZXNzaW9uCiAgICAvLyBkb2Vzbid0IGdldCBhbiBhZCBzbG90LCB0aGVuIHRlYXIgZG93biB0aGUgb2xkIHNlc3Npb24gYW5kIHN0YXJ0IGZyZXNoLgogICAgLy8gSW5pdGlhbGl6ZSB0byB0aGUgY3VycmVudCB2aWQgc28gdGhlIGluaXRpYWwgeXQtbmF2aWdhdGUtZmluaXNoCiAgICAvLyAod2hpY2ggZmlyZXMgb24gcGFnZSBsb2FkIGNvbXBsZXRpb24sIG5vdCBqdXN0IFNQQSBuYXYpIGlzIHRyZWF0ZWQKICAgIC8vIGFzIGEgZHVwbGljYXRlIGFuZCBza2lwcGVkLiBBdm9pZHMgdGVhcmluZyBkb3duIHBsYXliYWNrIG9uIHJlZnJlc2guCiAgICAvLyBXZSBza2lwIHRlYXJkb3duIHdoZW4gdGhlcmUncyBubyBwcmlvciBzZXNzaW9uIHRvIGNsZWFyLgogICAgbGV0IGxhc3RSZWxvYWRlZFZpZCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKSB8fCAnJzsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1uYXZpZ2F0ZS1maW5pc2gnLCAoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkIHx8IHZpZCA9PT0gbGFzdFJlbG9hZGVkVmlkKSByZXR1cm47CiAgICAgICAgY29uc3QgaGFkUHJpb3JTZXNzaW9uID0gbGFzdFJlbG9hZGVkVmlkICE9PSAnJzsKICAgICAgICBsYXN0UmVsb2FkZWRWaWQgPSB2aWQ7CiAgICAgICAgaWYgKCFoYWRQcmlvclNlc3Npb24pIHJldHVybjsKCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgICAgICAgaWYgKCFwbGF5ZXI/LmNhbmNlbFBsYXliYWNrIHx8ICFwbGF5ZXI/LmxvYWRWaWRlb0J5SWQpIHJldHVybjsKCiAgICAgICAgICAgIC8vIFNldCB0aGUgbm8tYWQgZmxhZyBiZWZvcmUgcmVsb2FkaW5nIHNvIHRoZSBuZXcgc2Vzc2lvbiBwaWNrcyBpdCB1cAogICAgICAgICAgICBjb25zdCB2ZCA9IHBsYXllci5nZXRWaWRlb0RhdGE/LigpOwogICAgICAgICAgICBpZiAodmQpIHZkLmlzSW5saW5lUGxheWJhY2tOb0FkID0gdHJ1ZTsKCiAgICAgICAgICAgIHBsYXllci5jYW5jZWxQbGF5YmFjaygpOwogICAgICAgICAgICBwbGF5ZXIubG9hZFZpZGVvQnlJZCh2aWQpOwogICAgICAgICAgICBsb2coJ2ZvcmNlZCBuZXcgU0FCUiBzZXNzaW9uIGZvcicsIHZpZCk7CiAgICAgICAgfSwgMTAwKTsKICAgIH0pOwoKICAgIC8vIFByb25nIDFiOiBjb2xkLWxvYWQgcmVzY3VlLiBPbiBhIGZyZXNoIHBhZ2UgbG9hZCB0aGUgcGxheWVyIGFscmVhZHkKICAgIC8vIGhvbGRzIGEgU0FCUiBzZXNzaW9uIGNhcnJ5aW5nIHRoZSBhZC1zbG90IGJhY2tvZmYsIGFuZCBQcm9uZyAxIChTUEEgbmF2CiAgICAvLyBvbmx5KSB3b24ndCBmaXJlLiBQcm9uZyAyIGJlbG93IGNhbiByZXdyaXRlIGJhY2tvZmZUaW1lTXMsIGJ1dCBZb3VUdWJlCiAgICAvLyBzZWVtcyB0byBiZSBpZ25vcmluZyBvdXIgcmV3cml0dGVuIHZhbHVlIGFuZCBlbmZvcmNpbmcgYSBzZXJ2ZXItc2lkZQogICAgLy8gYWQtc2xvdCBkZWxheS4gVGhlIHdheSB0byBnZXQgYXJvdW5kIHRoaXMgaXMgdG8gZm9yY2UgYSBmcmVzaCBzZXNzaW9uIAogICAgLy8gKHNhbWUgbWVjaGFuaXNtIGFzIFByb25nIDEpLiBTbyB3aGVuIFByb25nIDIgZmlyc3Qgc2VlcyBhIHJlYWwgYmFja29mZiAKICAgIC8vIG9uIHRoZSBjb2xkIHNlc3Npb24sIGZvcmNlIGEgc2luZ2xlIGZyZXNoIHNlc3Npb24gaGVyZS4gSWYgdGhlIG5ldyAKICAgIC8vIHNlc3Npb24gc3RpbGwgcmV0dXJucyBhIGJhY2tvZmYsIHdlIGJyZWFrIHRvIGF2b2lkIGEgcmVsb2FkIGxvb3AuCiAgICBsZXQgY29sZFJlbG9hZERvbmUgPSBmYWxzZTsKICAgIGZ1bmN0aW9uIGZvcmNlRnJlc2hTZXNzaW9uT25jZSgpIHsKICAgICAgICBpZiAoY29sZFJlbG9hZERvbmUpIHJldHVybjsKICAgICAgICBjb2xkUmVsb2FkRG9uZSA9IHRydWU7CiAgICAgICAgY29uc3QgcGxheWVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21vdmllX3BsYXllcicpOwogICAgICAgIGlmICghcGxheWVyPy5jYW5jZWxQbGF5YmFjayB8fCAhcGxheWVyPy5sb2FkVmlkZW9CeUlkKSByZXR1cm47CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkKSByZXR1cm47CgogICAgICAgIGNvbnN0IHZkID0gcGxheWVyLmdldFZpZGVvRGF0YT8uKCk7CiAgICAgICAgaWYgKHZkKSB2ZC5pc0lubGluZVBsYXliYWNrTm9BZCA9IHRydWU7CgogICAgICAgIHBsYXllci5jYW5jZWxQbGF5YmFjaygpOwogICAgICAgIHBsYXllci5sb2FkVmlkZW9CeUlkKHZpZCk7CiAgICAgICAgbG9nKCdjb2xkLWxvYWQgcmVzY3VlOiBmb3JjZWQgZnJlc2ggYWQtZnJlZSBzZXNzaW9uIGZvcicsIHZpZCk7CiAgICB9CgogICAgLy8gUHJvbmcgMjogSW50ZXJjZXB0IFNBQlIgcmVzcG9uc2VzIGFuZCBwYXRjaCBiYWNrb2ZmVGltZU1zLgogICAgLy8gVGVlIHRoZSBib2R5IHNvIG1lZGlhIGNodW5rcyAoPj0xMDAwIGJ5dGVzKSBwYXNzIHRocm91Z2ggdW50b3VjaGVkCiAgICAvLyDigJQgb25seSB0aGUgc21hbGwgY29udHJvbCBtZXNzYWdlcyBjYXJyeWluZyB0aGUgYmFja29mZiBmaWVsZCBnZXQKICAgIC8vIGJ1ZmZlcmVkIGFuZCByZS1lbWl0dGVkIGFzIGEgc3ludGhlc2l6ZWQgUmVzcG9uc2UuCiAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CgogICAgd2luZG93LmZldGNoID0gZnVuY3Rpb24ocmVzb3VyY2UsIGluaXQpIHsKICAgICAgICBjb25zdCB1cmwgPSB0eXBlb2YgcmVzb3VyY2UgPT09ICdzdHJpbmcnID8gcmVzb3VyY2UgOiAocmVzb3VyY2U/LnVybCB8fCAnJyk7CgogICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2dvb2dsZXZpZGVvLmNvbScpICYmIHVybC5pbmNsdWRlcygnc2Ficj0xJykpIHsKICAgICAgICAgICAgbGV0IHJuID0gJyc7CiAgICAgICAgICAgIHRyeSB7IHJuID0gbmV3IFVSTCh1cmwpLnNlYXJjaFBhcmFtcy5nZXQoJ3JuJykgfHwgJyc7IH0gY2F0Y2goZSkge30KICAgICAgICAgICAgbG9nKCdTQUJSIGZldGNoIHJuPScgKyBybik7CgogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCAhcmVzcG9uc2UuYm9keSkgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgLy8gVGVlIGRlZmVuc2l2ZWx5OiBpZiBpdCB0aHJvd3MgKGxvY2tlZCBzdHJlYW0sIGJyb3dzZXIgcXVpcmspLAogICAgICAgICAgICAgICAgLy8gaGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgYmFjayB0byBhdm9pZCBicmVha2luZyB0aGUgdmlkZW8gZW50aXJlbHkuCiAgICAgICAgICAgICAgICBsZXQgcGFzcywgc2NhbiwgcmVpbml0OwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBbcGFzcywgc2Nhbl0gPSByZXNwb25zZS5ib2R5LnRlZSgpOwogICAgICAgICAgICAgICAgICAgIHJlaW5pdCA9IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMgfTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFN0cmVhbShzY2FuLmdldFJlYWRlcigpLCAxMDAwKS50aGVuKGZ1bmN0aW9uKGJ5dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnU0FCUiBkb25lIHJuPScgKyBybik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocGFzcywgcmVpbml0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbG9nKCdzbWFsbCByZXNwb25zZSBybj0nICsgcm4sICdzaXplPScgKyBieXRlcy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIHRoZSBhZC1zbG90IHdhaXQsIGF0dGVtcHQgdG8gZm9yY2UgYSBmcmVzaCBzZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGZpcnN0IHNpZ24gb2YgYSByZWFsIGJhY2tvZmYgb24gdGhlIGNvbGQgc2Vzc2lvbi4gSWYgdGhlIG5ldwogICAgICAgICAgICAgICAgICAgIC8vIHNlc3Npb24gc3RpbGwgcmV0dXJucyBhIGJhY2tvZmYsIGJyZWFrIHRvIGF2b2lkIGFuIGluZmluaXRlIHJlbG9hZCBsb29wLgogICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaEJhY2tvZmZGaWVsZChieXRlcywgcm4pKSBmb3JjZUZyZXNoU2Vzc2lvbk9uY2UoKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBuZXcgUmVzcG9uc2UoYnl0ZXMsIHJlaW5pdCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG91dCwgJ3VybCcsIHsgdmFsdWU6IHJlc3BvbnNlLnVybCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlLnR5cGUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CgogICAgLy8gUmVhZCBhIHN0cmVhbSBpbnRvIGEgVWludDhBcnJheS4gSWYgZWFybHlFeGl0VGhyZXNob2xkIGlzIHNldCBhbmQgdGhlCiAgICAvLyBhY2N1bXVsYXRlZCBieXRlcyBjcm9zcyBpdCwgY2FuY2VsIHRoZSByZWFkZXIgYW5kIHJldHVybiBudWxsIOKAlCB1c2VkCiAgICAvLyB0byBiYWlsIG91dCBvZiBidWZmZXJpbmcgd2hlbiB0aGUgcmVzcG9uc2UgaXMgY2xlYXJseSBhIG1lZGlhIGNodW5rCiAgICAvLyBhbmQgc2hvdWxkIHN0cmVhbSBzdHJhaWdodCB0byB0aGUgcGxheWVyIGluc3RlYWQuCiAgICBmdW5jdGlvbiByZWFkU3RyZWFtKHJlYWRlciwgZWFybHlFeGl0VGhyZXNob2xkKSB7CiAgICAgICAgY29uc3QgY2h1bmtzID0gW107CiAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIHB1bXAocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgewogICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkodG90YWwpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBvZmYgKz0gY2h1bmtzW2ldLmxlbmd0aCwgaSsrKQogICAgICAgICAgICAgICAgICAgIG1lcmdlZC5zZXQoY2h1bmtzW2ldLCBvZmYpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaHVua3MucHVzaChyZXN1bHQudmFsdWUpOwogICAgICAgICAgICB0b3RhbCArPSByZXN1bHQudmFsdWUubGVuZ3RoOwogICAgICAgICAgICBpZiAoZWFybHlFeGl0VGhyZXNob2xkICYmIHRvdGFsID49IGVhcmx5RXhpdFRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgdHJ5IHsgcmVhZGVyLmNhbmNlbCgpOyB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKHB1bXApOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vIFNjYW4gZm9yIHByb3RvYnVmIGZpZWxkIDQgKGJhY2tvZmZUaW1lTXMpIGFuZCByZXdyaXRlIHZhbHVlcyA+IDUwMG1zCiAgICAvLyB0byBhIHNtYWxsIHJhbmRvbSB2YWx1ZSAoNTAtMTUwbXMsIGxvb2tzIGxpa2UgbmF0dXJhbCBiYWNrb2ZmIG5vaXNlCiAgICAvLyByYXRoZXIgdGhhbiBhIGNsZWFuIHplcm8pLiBQcm90b2J1ZiB3aXJlIGZvcm1hdDogZmllbGQgNCwgd2lyZSB0eXBlCiAgICAvLyAwICh2YXJpbnQpID0gdGFnIGJ5dGUgMHgyMCAoZmllbGRfbnVtYmVyIDw8IDMgfCB3aXJlX3R5cGUgPSA0IDw8IDMKICAgIC8vIHwgMCkuIFRoZSB2YXJpbnQgdXNlcyA3IGJpdHMgcGVyIGJ5dGUgd2l0aCAweDgwIGFzIGNvbnRpbnVhdGlvbgogICAgLy8gZmxhZy4gV2UgcmV3cml0ZSB0aGUgdmFyaW50IGluIHBsYWNlLCBrZWVwaW5nIHRoZSBzYW1lIGJ5dGUgY291bnQKICAgIC8vIHNvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZSBzdGF5cyB2YWxpZC4KICAgIGZ1bmN0aW9uIHBhdGNoQmFja29mZkZpZWxkKGJ5dGVzLCBybikgewogICAgICAgIGxldCBwYXRjaGVkID0gZmFsc2U7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgaWYgKGJ5dGVzW2ldICE9PSAweDIwKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IHZhbCA9IDAsIHNoaWZ0ID0gMCwgZW5kID0gaSArIDE7CiAgICAgICAgICAgIHdoaWxlIChlbmQgPCBieXRlcy5sZW5ndGggJiYgc2hpZnQgPCAzNSkgewogICAgICAgICAgICAgICAgdmFsIHw9IChieXRlc1tlbmRdICYgMHg3ZikgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgICBpZiAoIShieXRlc1tlbmRdICYgMHg4MCkpIHsgZW5kKys7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBzaGlmdCArPSA3OwogICAgICAgICAgICAgICAgZW5kKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbCA+IDUwMCAmJiB2YWwgPCAxMDAwMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IDUwICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKTsKICAgICAgICAgICAgICAgIGxvZygnUEFUQ0ggYmFja29mZj0nICsgdmFsICsgJ21zIOKGkiAnICsgdGFyZ2V0ICsgJ21zIGF0IG9mZnNldD0nICsgaSwgJ3JuPScgKyBybik7CiAgICAgICAgICAgICAgICBsZXQgcG9zID0gaSArIDEsIHJlbWFpbmluZyA9IHRhcmdldDsKICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnl0ZXNbcG9zKytdID0gKHJlbWFpbmluZyAmIDB4N2YpIHwgMHg4MDsKICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPj4+PSA3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnl0ZXNbcG9zXSA9IHJlbWFpbmluZyAmIDB4N2Y7CiAgICAgICAgICAgICAgICBwYXRjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF0Y2hlZDsKICAgIH0KCiAgICBpZiAoREVCVUcpIHsKICAgICAgICBsZXQgbGFzdFJTID0gLTE7CiAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICBpZiAoIXYpIHJldHVybjsKICAgICAgICAgICAgaWYgKHYucmVhZHlTdGF0ZSAhPT0gbGFzdFJTKSB7CiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2LmJ1ZmZlcmVkLmxlbmd0aCA+IDAgPyB2LmJ1ZmZlcmVkLmVuZCgwKS50b0ZpeGVkKDEpIDogJzAnOwogICAgICAgICAgICAgICAgbG9nKCdWSURFTyBycz0nICsgdi5yZWFkeVN0YXRlLCAnY3Q9JyArIHYuY3VycmVudFRpbWUudG9GaXhlZCgxKSwgJ2J1Zj0nICsgYnVmLCB2LnBhdXNlZCA/ICdwYXVzZWQnIDogJ3BsYXlpbmcnKTsKICAgICAgICAgICAgICAgIGxhc3RSUyA9IHYucmVhZHlTdGF0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDIwMCk7CiAgICB9CgogICAgbG9nKCdsb2FkZWQnKTsKfSkoKTsKCg=="},{"name":"brave-youtube-playback-speed-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXlvdXR1YmUtcGxheWJhY2stc3BlZWQtZml4LmpzCi8vIFRoaXMgc2NyaXB0IGlzIGluamVjdGVkIGludG8gWW91VHViZSBwYWdlcyB0byB3b3JrIGFyb3VuZCBhIFlvdVR1YmUgYnVnIHdoZXJlCi8vIHRoZSBwbGF5YmFjayBzcGVlZCB3aWxsIG9ubHkgc2F2ZSBmb3IgZnV0dXJlIHZpZGVvcyB3aGVuIHVzaW5nIHRoZSBzbGlkZXIgY29udHJvbHMuCi8vIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHBsYXliYWNrIHNwZWVkIHVzaW5nIHRoZSBidXR0b25zLCB0aGUgbmV3IHNwZWVkIHdpbGwgbm90IGJlIHNhdmVkLgovLyBUaGlzIGNyZWF0ZWQgaXNzdWVzIHdoZXJlLCBpZiB0aGUgdXNlciBhZGp1c3RlZCB0aGUgc2xpZGVyLCBhbmQgdGhlbiBjbGlja2VkIHRoZSAxeCBidXR0b24gdG8KLy8gcmVzZXQgdGhlIHNwZWVkLCB0aGUgc3BlZWQgd291bGQgYmUgcmVzZXQgdG8gMXgsIGJ1dCB0aGVuIGFsbCBmdXR1cmUgdmlkZW9zIHdvdWxkIHBsYXkgYXQgdGhlCi8vIHByZXZpb3VzbHkgc2V0IHNwZWVkLiBUaGUgc2NyaXB0IHdvcmtzIGFyb3VuZCB0aGlzIGJ5IHNhdmluZyB0aGUgcGxheWJhY2sgc3BlZWQgdG8gc2Vzc2lvblN0b3JhZ2UKLy8gd2hlbmV2ZXIgaXQgY2hhbmdlcywgaW5zdGVhZCBvZiByZWx5aW5nIG9uIFlvdVR1YmUncyBkZWZhdWx0IGJlaGF2aW9yLgooZnVuY3Rpb24gKCkgewogIGNvbnN0IEtFWSA9ICd5dC1wbGF5ZXItcGxheWJhY2stcmF0ZSc7CiAgZnVuY3Rpb24gYXR0YWNoKHBsYXllcikgewogICAgaWYgKCFwbGF5ZXIgfHwgIXBsYXllci5hZGRFdmVudExpc3RlbmVyIHx8IHBsYXllci5fX3JhdGVIb29rZWQpIHJldHVybiBmYWxzZTsKICAgIHBsYXllci5fX3JhdGVIb29rZWQgPSB0cnVlOwogICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ29uUGxheWJhY2tSYXRlQ2hhbmdlJywgZnVuY3Rpb24gKHJhdGUpIHsKICAgICAgY29uc3QgdiA9ICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpID8gcmF0ZSA6IChyYXRlICYmIHJhdGUuZGF0YSkgPz8gcmF0ZTsKICAgICAgdHJ5IHsKICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKEtFWSwgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgZGF0YTogU3RyaW5nKHYpLAogICAgICAgICAgY3JlYXRpb246IERhdGUubm93KCkKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoIWF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICBjb25zdCBvbk5hdkZpbmlzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogIH0KfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIHZhZnQKICAgIC8vIGluc3RhbmNlIHRoYXQgZmlnaHRzIGZvciBwbGF5ZXIgY29udHJvbC4gT25seSB0aGUgdG9wIGZyYW1lIGhvc3RzIHRoZSBwbGF5ZXIgb24KICAgIC8vIHR3aXRjaC50di9DSEFOTkVMOyBuZXN0ZWQgYXV4aWxpYXJ5IGZyYW1lcyBhcmUgbm9pc2UuCiAgICAvLyBBbGxvdy1saXN0IGZvciBuZXN0ZWQtZnJhbWUgaW5qZWN0aW9uOiBUd2l0Y2gncyB0aHJlZSBkb2N1bWVudGVkIGVtYmVkIGNvbnRleHRzCiAgICAvLyAoaHR0cHM6Ly9kZXYudHdpdGNoLnR2L2RvY3MvZW1iZWQvdmlkZW8tYW5kLWNsaXBzLykg4oCUIHByZXNlcnZlcyBUd2l0Y2ggc3RyZWFtcwogICAgLy8gZW1iZWRkZWQgb24gdGhpcmQtcGFydHkgc2l0ZXMgd2hlcmUgdmFmdCBydW5zIGluIGFuIGlmcmFtZSB3aG9zZSBwYXJlbnQgaXMgb24KICAgIC8vIGEgZGlmZmVyZW50IG9yaWdpbi4KICAgIC8vIFVzZSB3aW5kb3cuZnJhbWVFbGVtZW50IHRvIGRldGVjdCBuZXN0ZWQgZnJhbWVzIOKAlCBudWxsIG9uIHRvcCBmcmFtZSwgdGhlIGlmcmFtZQogICAgLy8gZWxlbWVudCBvbiBhIHNhbWUtb3JpZ2luIG5lc3RlZCBmcmFtZSwgdGhyb3dzIG9uIGEgY3Jvc3Mtb3JpZ2luIG5lc3RlZCBmcmFtZS4KICAgIC8vIE1vcmUgcmVsaWFibGUgdGhhbiAnd2luZG93ICE9PSB3aW5kb3cudG9wJyBiZWNhdXNlIFRhbXBlcm1vbmtleSB3cmFwcyB3aW5kb3cgaW4gYQogICAgLy8gcHJveHkgd2hlcmUgdGhlIHN0cmljdCBjb21wYXJpc29uIGNhbiByZXR1cm4gdHJ1ZSBldmVuIG9uIHRoZSB0b3AgZnJhbWUuCiAgICBsZXQgX2lzTmVzdGVkID0gZmFsc2U7CiAgICB0cnkgeyBfaXNOZXN0ZWQgPSB3aW5kb3cuZnJhbWVFbGVtZW50ICE9PSBudWxsOyB9IGNhdGNoIChfZSkgeyBfaXNOZXN0ZWQgPSB0cnVlOyB9CiAgICBpZiAoX2lzTmVzdGVkKSB7CiAgICAgICAgY29uc3QgX2hvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfaXNFbWJlZENvbnRleHQgPSBfaG9zdCA9PT0gJ3BsYXllci50d2l0Y2gudHYnIHx8IF9ob3N0ID09PSAnZW1iZWQudHdpdGNoLnR2JyB8fCBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvZW1iZWQvJyk7CiAgICAgICAgaWYgKCFfaXNFbWJlZENvbnRleHQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmFmdCBza2lwcGVkIOKAlCBuZXN0ZWQgZnJhbWUgb24gJyArIF9ob3N0ICsgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgKyAnIChub3QgYSBUd2l0Y2ggZW1iZWQpLiBJZiB5b3Ugc2VlIHRoaXMgb24gdHdpdGNoLnR2L0NIQU5ORUwgdG9wIGZyYW1lLCBwbGVhc2UgcmVwb3J0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgLy8gU2tpcCBpbmplY3Rpb24gb24gdGhlIFR3aXRjaCBjbGlwIGVkaXRvciDigJQgY2xpcHMudHdpdGNoLnR2IGhvc3Qgb3IgLzxjaGFubmVsPi9jbGlwLzxzbHVnPiBwYXRoLgogICAgLy8gT3VyIGZldGNoL1dvcmtlciBob29rcyBhbmQgYnVmZmVyIG1vbml0b3IgYXJlIGFpbWVkIGF0IHRoZSBsaXZlIGNoYW5uZWwgcGxheWVyOyBvbiB0aGUKICAgIC8vIGNsaXAgZWRpdG9yJ3Mgc2Vla2FibGUgcHJldmlldyB0aGV5IGhhdmUgbm8gYWRzIHRvIGFjdCBvbiBhbmQgaGF2ZSBjYXVzZWQgdGhlIHByZXZpZXcKICAgIC8vIHRvIGZyZWV6ZSB3aGVuIHRoZSB1c2VyIGRyYWdzIHRoZSB0cmltIHJhbmdlLiAoU3luYydkIHdpdGggVFRWLUFCIHY2LjQuOS4pCiAgICB7CiAgICAgICAgY29uc3QgX2NsaXBIb3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2NsaXBQYXRoID0gZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgfHwgJyc7CiAgICAgICAgaWYgKF9jbGlwSG9zdCA9PT0gJ2NsaXBzLnR3aXRjaC50dicgfHwgL15cL1teL10rXC9jbGlwXC9bXi9dKy8udGVzdChfY2xpcFBhdGgpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZhZnQgc2tpcHBlZCDigJQgY2xpcCBlZGl0b3IgcGFnZSAoJyArIF9jbGlwSG9zdCArIF9jbGlwUGF0aCArICcpLicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJ3VzZSBzdHJpY3QnOwogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gODQ7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2YWZ0IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZhZnQgdicgKyBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnIHNraXBwZWQg4oCUIGFub3RoZXIgc2NyaXB0IGFscmVhZHkgYWN0aXZlICh2JyArIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnKS4gUmVtb3ZlIGR1cGxpY2F0ZSBzY3JpcHRzLicpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb247CiAgICAvLyBDb25maWd1cmF0aW9uIGFuZCBzdGF0ZSBzaGFyZWQgYmV0d2VlbiB3aW5kb3cgYW5kIHdvcmtlciBzY29wZXMKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guIFRoZSBzcGVjaWZpYyB0d2l0Y2gtc3RpdGNoZWQtYWQgREFURVJBTkdFCiAgICAgICAgLy8gbWFya2VyIGlzIGEgc3Vic2V0IG9mIHRoaXMgcHJlZml4LgogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVycyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIicsICdFWFQtWC1EQVRFUkFOR0U6Q0xBU1M9InR3aXRjaC10cmlnZ2VyIiddOwogICAgICAgIC8vIENvbmZpcm1lZCBzZXNzaW9uL3NvdXJjZSBtZXRhZGF0YSwgbmV2ZXIgYWQgbWFya2VycyDigJQgZmlsdGVyIGZyb20gY2FuZGlkYXRlIGxvZy4KICAgICAgICBzY29wZS5Lbm93bk5vbkFkU2lnbmlmaWVycyA9IFsndHdpdGNoLXNlc3Npb24nLCAndHdpdGNoLXN0cmVhbS1zb3VyY2UnLCAndHdpdGNoLWFkLXF1YXJ0aWxlJywgJ3R3aXRjaC1hc3NpZ25tZW50J107CiAgICAgICAgc2NvcGUuQWRTZWdtZW50VVJMUGF0dGVybnMgPSBbJy9hZHNxdWFyZWQvJywgJy9fNDA0LycsICcvcHJvY2Vzc2luZyddOwogICAgICAgIC8vIFByZWNvbXBpbGVkIHJlZ2V4ZXMgc2hhcmVkIGFjcm9zcyB0aGUgc3RyaXBBZFNlZ21lbnRzIGhvdCBwYXRoLiBEZWNsYXJlZAogICAgICAgIC8vIGhlcmUgKHNlcmlhbGl6ZWQgaW50byB0aGUgd29ya2VyIGJsb2Igd2l0aCBkZWNsYXJlT3B0aW9ucykgc28gbGl0ZXJhbHMKICAgICAgICAvLyBpbnNpZGUgdGhlIHBlci1saW5lIHN0cmlwIGxvb3AgZG9uJ3QgcmVjb21waWxlIG9uIGV2ZXJ5IGl0ZXJhdGlvbiDigJQgZm9yCiAgICAgICAgLy8gYSAxMDAtbGluZSBtM3U4IGF0IH4yIHBvbGxzL3NlYyBkdXJpbmcgYW4gYWQgYnJlYWssIGhvaXN0aW5nIHRoZSBVUkwKICAgICAgICAvLyByZXdyaXRlIGFsb25lIHNhdmVzIH4yMDAgcmVnZXggY29tcGlsYXRpb25zIHBlciBzZWNvbmQuCiAgICAgICAgc2NvcGUuVHdpdGNoQWRVcmxSZXdyaXRlUmVnZXggPSAvKFgtVFYtVFdJVENILUFEKD86LVtBLVpdKykqLVVSTFM/PSIpW14iXSooIikvZzsKICAgICAgICBzY29wZS5VcmlBdHRyaWJ1dGVSZWdleCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5DbGllbnRJRCA9ICdraW1uZTc4a3gzbmN4NmJyZ280bXY2d2tpNWgxa28nOwogICAgICAgIHNjb3BlLkJhY2t1cFBsYXllclR5cGVzID0gWwogICAgICAgICAgICAvLyBPcmRlciBtYXR0ZXJzOiBmaXJzdCBjbGVhbiB0eXBlIHdpbnMuICdlbWJlZCcgbW92ZWQgdG8gZW5kIOKAlCBmaWVsZC1vYnNlcnZlZAogICAgICAgICAgICAvLyBUd2l0Y2ggcmV0dXJucyBHUUwgJ3NlcnZlciBlcnJvcicgZm9yIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gb24gZW1iZWQgd2hlbgogICAgICAgICAgICAvLyByZXF1ZXN0ZWQgZnJvbSB0d2l0Y2gudHYgb3JpZ2luLCB3YXN0aW5nIH4yMDAtNDAwbXMgcGVyIGJyZWFrIGFzIGZpcnN0LXRyeS4KICAgICAgICAgICAgLy8gS2VwdCBpbiBjYXNlIGl0IGV2ZXIgc3VjY2VlZHMgb24gc29tZSBjaGFubmVsL3VzZXIgY29tYm8uCiAgICAgICAgICAgICdzaXRlJywvL1NvdXJjZQogICAgICAgICAgICAncG9wb3V0JywvL1NvdXJjZQogICAgICAgICAgICAnbW9iaWxlX3dlYicsLy9Nb2JpbGUKICAgICAgICAgICAgJ2VtYmVkJywvL1NvdXJjZSAodW5yZWxpYWJsZSDigJQgc2VlIG5vdGUgYWJvdmUpCiAgICAgICAgICAgIC8vICdhdXRvcGxheScgKDM2MHApIHJlbW92ZWQ6IHdoZW4gY29tbWl0dGVkIGFzIGN5Y2xlIGJhY2t1cCwgdGhlIHBsYXllciBnZXRzIHN0dWNrCiAgICAgICAgICAgIC8vIGluIGFuIGVuZGxlc3MgbG9hZGluZyBjaXJjbGUgYWZ0ZXIgdGhlIENTQUktb25seSBwYXRoIHJlbGVhc2VzIHRoZSBiYWNrdXAg4oCUCiAgICAgICAgICAgIC8vIGF1dG9wbGF5IHZhcmlhbnRzIGRvbid0IHRyYW5zaXRpb24gY2xlYW5seSBiYWNrIHRvIG1haW4gc3RyZWFtIHZhcmlhbnRzLgogICAgICAgIF07CiAgICAgICAgc2NvcGUuRmFsbGJhY2tQbGF5ZXJUeXBlID0gJ3NpdGUnOy8vIHdhcyAnZW1iZWQnIOKAlCBzaXRlIGlzIG1vcmUgcmVsaWFibGUgd2hlbiBhbGwgU291cmNlIHR5cGVzIGVuZCB1cCBhZC1sYWRlbgogICAgICAgIHNjb3BlLkZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJ3BvcG91dCc7CiAgICAgICAgc2NvcGUuUHJlZmVyTG93UXVhbGl0eUJhY2t1cCA9IHRydWU7Ly8gSHlicmlkIHNhZmV0eSBuZXQgZm9yIFNTQUktaGVhdnkgYnJlYWtzOiBzdGlja3kgZXNjYXBlIGhhdGNoIChmaXJlcyBhZnRlciB+OHMgc3R1Y2sgaW4gYWxsLXN0cmlwcGVkIHN0YXRlKSArIGF1dG9wbGF5ICgzNjBwKSBhcyBsYXN0LXJlc29ydCBiYWNrdXAgd2hlbiBhbGwgU291cmNlIHR5cGVzIGFyZSBhZC1sYWRlbi4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX3ByZWZlckxvd1F1YWxpdHlCYWNrdXA9ZmFsc2UgdG8gZGlzYWJsZS4KICAgICAgICBzY29wZS5GYXN0QXV0b3BsYXlGaXJzdFRyeSA9IHRydWU7Ly8gUHJlcGVuZCBhdXRvcGxheSAoMzYwcCkgdG8gdGhlIGl0ZXJhdGlvbiB3aGVuIHRoZSBwcmlvciBicmVhayBleGhhdXN0ZWQgYWxsIDQgU291cmNlIHR5cGVzIOKAlCBzYXZlcyB+MS41cyBvZiBwcm9iZSBidWZmZXJpbmcgb24gZXZlcnkgYnJlYWsuIEF1dG8tcmVzZXRzIG9uIFNvdXJjZS10aWVyIHJlY292ZXJ5LiBEZWZhdWx0IG9uIGFzIG9mIHY2Ny4xLjAgKGV2ZXJ5IG9ic2VydmVkIGNoYW5uZWwgaXMgQ1NBSS1vbmx5LWJ1dC1tYXJrZWQpLiBPcHQtb3V0OiB0d2l0Y2hBZFNvbHV0aW9uc19mYXN0QXV0b3BsYXlGaXJzdFRyeT1mYWxzZS4KICAgICAgICBzY29wZS5CYWNrdXBTd2FwRmlyc3QgPSB0cnVlOy8vIE9uIGFkIGRldGVjdCwgaW1tZWRpYXRlbHkgc3dhcCB0byBhIGJhY2t1cCBwbGF5ZXItdHlwZSBtM3U4IChUVFYtQUItc3R5bGUpLiBBdm9pZHMgTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkg4oCUIGZld2VyIGxvYWRpbmcgY2lyY2xlcyBpbiBmaWVsZC4gQ29zdDogZXh0cmEgZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhay4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX2JhY2t1cFN3YXBGaXJzdD1mYWxzZSB0byBkaXNhYmxlLgogICAgICAgIHNjb3BlLkRpc2FibGVBZFNwb29maW5nID0gdHJ1ZTsvLyBEZWZhdWx0IE9GRiAod2FzIE9OIHRocm91Z2ggdjY4LjIuMCkuIFRoZSBhbHdheXMtMTAwJS13YXRjaGVkICsgYXVkaWJsZSArIHZpc2libGUgc3Bvb2YgYmVhY29uIHBhdHRlcm4gbWF5IGl0c2VsZiBmaW5nZXJwcmludCBhcyBhbm9tYWxvdXMgYW5kIHRyaWdnZXIgZGV0ZWN0aW9uIGVzY2FsYXRpb24gKENTQUkgcmVhY2hpbmcgdGhlIGNvbW1pdHRlZCBiYWNrdXApLiBTcG9vZi1hY2NlcHRlZCBkb2VzIE5PVCBwcm92ZSBub3QtZmluZ2VycHJpbnRlZC4gT3B0IGluIHZpYSB0d2l0Y2hBZFNvbHV0aW9uc19kaXNhYmxlQWRTcG9vZmluZz1mYWxzZS4KICAgICAgICBzY29wZS5SZWNvdmVyRnJvbVNpbGVudE11dGUgPSB0cnVlOy8vIE9uIGhhcmQgcmVsb2FkLCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IG11dGVkIGJ1dCB2YWZ0IGhhcyBzdWNjZXNzZnVsbHkgdW5tdXRlZCBhdCBhbnkgcG9pbnQgZWFybGllciB0aGlzIHNlc3Npb24sIHRyZWF0IGl0IGFzIGEgc2lsZW50IFR3aXRjaCByZS1tdXRlIGFuZCByZWNvdmVyIHZpYSB0aGUgYmFja3N0b3AuIERlZmF1bHQgb247IHNldCB0d2l0Y2hBZFNvbHV0aW9uc19yZWNvdmVyRnJvbVNpbGVudE11dGU9ZmFsc2UgdG8gZGlzYWJsZSAodXNlZnVsIGZvciB1c2VycyB3aG8gZGVsaWJlcmF0ZWx5IG11dGUgbWlkLXNlc3Npb24pLgogICAgICAgIHNjb3BlLlNraXBQbGF5ZXJSZWxvYWRPbkhldmMgPSBmYWxzZTsvLyBJZiB0cnVlIHRoaXMgd2lsbCBza2lwIHBsYXllciByZWxvYWQgb24gc3RyZWFtcyB3aGljaCBoYXZlIDJrLzRrIHF1YWxpdHkgKGlmIHlvdSBlbmFibGUgdGhpcyBhbmQgeW91IHVzZSB0aGUgMmsvNGsgcXVhbGl0eSBzZXR0aW5nIHlvdSdsbCBnZXQgZXJyb3IgIzQwMDAgLyAjMzAwMCAvIHNwaW5uaW5nIHdoZWVsIG9uIGNocm9tZSBiYXNlZCBicm93c2VycykKICAgICAgICBzY29wZS5BbHdheXNSZWxvYWRQbGF5ZXJPbkFkID0gZmFsc2U7Ly8gQWx3YXlzIHBhdXNlL3BsYXkgd2hlbiBlbnRlcmluZy9sZWF2aW5nIGFkcwogICAgICAgIHNjb3BlLlJlbG9hZFBsYXllckFmdGVyQWQgPSB0cnVlOy8vIEFmdGVyIHRoZSBhZCBmaW5pc2hlcyBkbyBhIHBsYXllciByZWxvYWQgaW5zdGVhZCBvZiBwYXVzZS9wbGF5CiAgICAgICAgc2NvcGUuUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gMzA7Ly8gTWluaW11bSBzZWNvbmRzIGJldHdlZW4gcmVsb2FkcyDigJQgYnJlYWtzIENTQUkgY2FzY2FkZXMgdHJpZ2dlcmVkIGJ5IHJlbG9hZAogICAgICAgIHNjb3BlLkRpc2FibGVSZWxvYWRDYXAgPSBmYWxzZTsvLyBJZiB0cnVlLCBidWZmZXIgbW9uaXRvciByZWxvYWRzIHVubGltaXRlZCB0aW1lcyAocHJlLXY0NyBiZWhhdmlvciwgcmlzayBvZiBjYXNjYWRlKQogICAgICAgIHNjb3BlLkRyaWZ0Q29ycmVjdGlvblJhdGUgPSAxLjE7Ly8gUGxheWJhY2sgcmF0ZSBmb3IgY2F0Y2hpbmcgdXAgdG8gbGl2ZSBlZGdlIGFmdGVyIHJlbG9hZCAoMCA9IGRpc2FibGUgZHJpZnQgY29ycmVjdGlvbikKICAgICAgICBzY29wZS5FYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSAzOy8vIE51bWJlciBvZiBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIHRyaWdnZXJpbmcgZWFybHkgcmVsb2FkIChlYWNoIHBvbGwgfjJzLCBzbyAzID0gfjZzLCA1ID0gfjEwcywgMTAgPSB+MjBzOyAwID0gZGlzYWJsZSkuIExvd2VyZWQgZnJvbSA1IHRvIDMgdG8gbWF0Y2ggdGhlIHRlc3RpbmcgdmFyaWFudC4gT3ZlcnJpZGUgdmlhIGxvY2FsU3RvcmFnZSB0d2l0Y2hBZFNvbHV0aW9uc19lYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQuCiAgICAgICAgc2NvcGUuUGluQmFja3VwUGxheWVyVHlwZSA9IHRydWU7Ly8gUmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5QbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNUaW1lID0gMTUwMDsKICAgICAgICBzY29wZS5QbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNQbGF5ZXJJbmRleCA9IDI7Ly9hdXRvcGxheQogICAgICAgIHNjb3BlLkhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgIHNjb3BlLlN0cmVhbUluZm9zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvc0J5VXJsID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBzY29wZS5HUUxEZXZpY2VJRCA9IG51bGw7CiAgICAgICAgc2NvcGUuQ2xpZW50VmVyc2lvbiA9IG51bGw7CiAgICAgICAgc2NvcGUuQ2xpZW50U2Vzc2lvbiA9IG51bGw7CiAgICAgICAgc2NvcGUuQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gbnVsbDsKICAgICAgICBzY29wZS5BdXRob3JpemF0aW9uSGVhZGVyID0gdW5kZWZpbmVkOwogICAgICAgIHNjb3BlLlNpbXVsYXRlZEFkc0RlcHRoID0gMDsKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdGaXggPSB0cnVlOy8vIElmIHRydWUgdGhpcyB3aWxsIHBhdXNlL3BsYXkgdGhlIHBsYXllciB3aGVuIGl0IGdldHMgc3R1Y2sgYnVmZmVyaW5nCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nRGVsYXkgPSA2MDA7Ly8gSG93IG9mdGVuIHNob3VsZCB3ZSBjaGVjayB0aGUgcGxheWVyIHN0YXRlIChpbiBtaWxsaXNlY29uZHMpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nU2FtZVN0YXRlQ291bnQgPSAzOy8vIEhvdyBtYW55IHRpbWVzIG9mIHNlZWluZyB0aGUgc2FtZSBwbGF5ZXIgc3RhdGUgdW50aWwgd2UgdHJpZ2dlciBwYXVzZS9wbGF5IChpdCB3aWxsIG9ubHkgdHJpZ2dlciBpdCBvbmUgdGltZSB1bnRpbCB0aGUgcGxheWVyIHN0YXRlIGNoYW5nZXMgYWdhaW4pCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nRGFuZ2VyWm9uZSA9IDAuNTsvLyBMb3dlcmVkIDEg4oaSIDAuNTogYXZvaWRzIGNhc2NhZGUgZmlyZXMgb24gdGhpbi1idXQtZnVuY3Rpb25hbCBidWZmZXIgYXQgbGl2ZSBlZGdlIHdoZXJlIHBhdXNlL3BsYXkgaW50ZXJhY3RzIGJhZGx5IHdpdGggVHdpdGNoJ3MgcGxheWJhY2stbW9uaXRvci4KICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZCA9IGZhbHNlOy8vIElmIHRydWUgdGhpcyB3aWxsIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkgKHBsYXllciByZWxvYWRpbmcgaXMgYmV0dGVyIGF0IGZpeGluZyB0aGUgcGxheWJhY2sgaXNzdWVzIGJ1dCBpdCB0YWtlcyBzbGlnaHRseSBsb25nZXIpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgPSA4MDAwOy8vIE1pbmltdW0gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmV0d2VlbiBlYWNoIHBhdXNlL3BsYXkgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlciBwcmVzc2luZyBwYXVzZS9wbGF5IHdoZW4gdGhlcmUgYXJlIGdlbnVpbmUgYnVmZmVyaW5nIHByb2JsZW1zKQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgPSBmYWxzZTsvLyBFbmFibGUgdGhpcyBpZiB5b3UncmUgZ2V0dGluZyBhbiBpbW1lZGlhdGUgcGF1c2UvcGxheS9yZWxvYWQgYXMgeW91IG9wZW4gYSBzdHJlYW0gKHdoaWNoIGlzIGNhdXNpbmcgdGhlIHN0cmVhbSB0byB0YWtlIGxvbmdlciB0byBsb2FkKS4gT25lIHByb2JsZW0gd2l0aCB0aGlzIGJlaW5nIHRydWUgaXMgdGhhdCBpdCBjYW4gY2F1c2UgdGhlIHBsYXllciB0byBnZXQgc3R1Y2sgaW4gc29tZSBpbnN0YW5jZXMgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIHByZXNzIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQgPSA1Oy8vIEhvdyBmYXIgdGhlIHN0cmVhbSBuZWVkIHRvIG1vdmUgYmVmb3JlIGRvaW5nIHRoZSBidWZmZXJpbmcgbWl0aWdhdGlvbiAoZGVwZW5kcyBvbiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tFbmFibGVkIGJlaW5nIHRydWUpCiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb01heEFnZU1zID0gMzAgKiA2MCAqIDEwMDA7CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgaW4gc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVsZXRlIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBFbmNvZGluZ3NNM1U4OiBlbmNvZGluZ3NNM3U4LAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgICAgIFJlc29sdXRpb25MaXN0OiBbXSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIFNwb29mZWRBZElkczogbmV3IFNldCgpLC8vIG5vdGlmeUFkQ29tcGxldGUgbXVsdGktcG9sbCBkZWR1cCDigJQgc3RpdGNoZWQtYWQgSURzIHNwb29mZWQgdGhpcyBicmVhay4gQ2xlYXJlZCBhdCBicmVhayBlbmQuCiAgICAgICAgICAgIE1vZGlmaWVkTTNVODogbnVsbCwKICAgICAgICAgICAgSXNVc2luZ01vZGlmaWVkTTNVODogZmFsc2UsCiAgICAgICAgICAgIElzU2hvd2luZ0FkOiBmYWxzZSwKICAgICAgICAgICAgSXNNaWRyb2xsOiBmYWxzZSwKICAgICAgICAgICAgQWRCcmVha1N0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgUG9kTGVuZ3RoOiAxLAogICAgICAgICAgICBIYXNDb25maXJtZWRBZEF0dHJzOiBmYWxzZSwKICAgICAgICAgICAgQ2xlYW5QbGF5bGlzdENvdW50OiAwLAogICAgICAgICAgICBQZW5kaW5nQWRFbmRBdDogMCwKICAgICAgICAgICAgQWRFbmRCb3VuY2VDb3VudDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3M6IDAsCiAgICAgICAgICAgIENzYWlPbmx5VGhpc0JyZWFrOiBmYWxzZSwKICAgICAgICAgICAgSXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBmYWxzZSwKICAgICAgICAgICAgTnVtU3RyaXBwZWRBZFNlZ21lbnRzOiAwLAogICAgICAgICAgICBSZWNvdmVyeVNlZ21lbnRzOiBbXSwKICAgICAgICAgICAgUmVjb3ZlcnlTdGFydFNlcTogdW5kZWZpbmVkLAogICAgICAgICAgICBGcmVlemVTdGFydGVkQXQ6IDAsCiAgICAgICAgICAgIENvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xsczogMCwKICAgICAgICAgICAgVG90YWxBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBMYXN0Q2xlYW5OYXRpdmVNM1U4OiBudWxsLAogICAgICAgICAgICBMYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0OiAwLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NNM1U4Q2FjaGU6IFtdLAogICAgICAgICAgICBBY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBQaW5uZWRCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBMYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgRmFpbGVkQmFja3VwUGxheWVyVHlwZXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgTG9nZ2VkQmFja3VwQWRzQnlUeXBlOiBudWxsLAogICAgICAgICAgICBDeWNsZVJlc2N1ZWRUaGlzQnJlYWs6IGZhbHNlLAogICAgICAgICAgICBFYXJseVJlbG9hZENvdW50OiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZEF0UG9sbDogMCwKICAgICAgICAgICAgRWFybHlSZWxvYWRUcmlnZ2VyZWQ6IGZhbHNlLAogICAgICAgICAgICBFYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0OiBmYWxzZSwKICAgICAgICAgICAgRXNjYXBlSGF0Y2hGaXJlZDogZmFsc2UsCiAgICAgICAgICAgIExhc3RCcmVha1VzZWRFc2NhcGVIYXRjaDogZmFsc2UsLy8gRmFzdEF1dG9wbGF5Rmlyc3RUcnkgc2lnbmFsIOKAlCBzZXQgd2hlbiBhIGJyZWFrIGNvbW1pdHMgYXV0b3BsYXkgdmlhIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZXNjYXBlIGhhdGNoLiBSZXNldCB3aGVuIGEgU291cmNlLXRpZXIgdHlwZSB3aW5zLgogICAgICAgICAgICBGYXN0QXV0b3BsYXlDb25zZWN1dGl2ZTogMCwvLyBDb3VudCBvZiBjb25zZWN1dGl2ZSBmYXN0LWF1dG9wbGF5IHdpbnMg4oCUIHRyaWdnZXJzIHBlcmlvZGljIHJlLXByb2JlIHRvIGNhdGNoIGNoYW5uZWwgcmVjb3ZlcnkuCiAgICAgICAgICAgIExhc3RQbGF5ZXJSZWxvYWQ6IDAsCiAgICAgICAgICAgIFJlbG9hZFRpbWVzdGFtcHM6IFtdLAogICAgICAgICAgICBIYXNDaGVja2VkVW5rbm93blRhZ3M6IGZhbHNlLAogICAgICAgICAgICBIYXNMb2dnZWRBZEF0dHJpYnV0ZXM6IGZhbHNlLAogICAgICAgICAgICBIYXNMb2dnZWRVbmtub3duU2lnbmlmaWVyczogZmFsc2UsCiAgICAgICAgICAgIExvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uOiBmYWxzZSwvLyBEZXRlY3Rpb24gZGlhZ25vc3RpYzogc2V0IHdoZW4gbTN1OCB0cmFuc2l0aW9ucyB0byBvZmZsaW5lLXNoYXBlIG1pZC1zZXNzaW9uLgogICAgICAgICAgICBDb25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlczogMCwvLyBEZXRlY3Rpb24gZGlhZ25vc3RpYzogY291bnRlciBmb3IgY29uc2VjdXRpdmUgZmFpbGVkIGFjY2Vzcy10b2tlbiBmZXRjaGVzIGFjcm9zcyBwbGF5ZXIgdHlwZXMuIExvZ2dlZCBhdCB0aHJlc2hvbGQsIHJlc2V0IG9uIHN1Y2Nlc3MuCiAgICAgICAgICAgIExvZ2dlZFRva2VuRmFpbHVyZVN0cmVhazogZmFsc2UsLy8gT25jZS1wZXItc3RyZWFrIGd1YXJkIGZvciB0aGUgdGhyZXNob2xkIGxvZy4KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gbWFza0FzTmF0aXZlKGZuLCBuYW1lKSB7CiAgICAgICAgZm4udG9TdHJpbmcgPSAoKSA9PiAnZnVuY3Rpb24gJyArIG5hbWUgKyAnKCkgeyBbbmF0aXZlIGNvZGVdIH0nOwogICAgICAgIHJldHVybiBmbjsKICAgIH0KICAgIGNvbnN0IGxvZ2dlZENzYWlUeXBlcyA9IG5ldyBTZXQoKTsKICAgIGxldCBpc0FjdGl2ZWx5U3RyaXBwaW5nQWRzID0gZmFsc2U7CiAgICBsZXQgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IGZhbHNlOwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgbGV0IGNhY2hlZFJvb3ROb2RlID0gbnVsbDsvLyBDYWNoZWQgI3Jvb3QgRE9NIGVsZW1lbnQgKG5ldmVyIGNoYW5nZXMgaW4gUmVhY3QgU1BBcykKICAgIGxldCBjYWNoZWRQbGF5ZXJSb290RGl2ID0gbnVsbDsvLyBDYWNoZWQgLnZpZGVvLXBsYXllciBlbGVtZW50CiAgICAvLyBPbmUtc2hvdCBmbGFncyBmb3Igb3ZlcmxheS1oaWRlIGxvZ3MuIFR3aXRjaCdzIFJlYWN0IHRyZWUgcmUtbW91bnRzIFNEQQogICAgLy8gd3JhcHBlcnMgYW5kIGFkLWJyZWFrIGNhcmRzIGNvbnN0YW50bHkgZHVyaW5nIGFuIGFkIGJyZWFrLCBzbyB0aGUKICAgIC8vIGhpZGUtYW5kLWxvZyBmaXJlcyBodW5kcmVkcyBvZiB0aW1lcy4gTG9nIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKICAgIC8vIGhpZGUgdHlwZSBwZXIgcGFnZSBsb2FkLCB0aGVuIHN0YXkgc2lsZW50IOKAlCB0aGUgaGlkZSBpdHNlbGYgc3RpbGwgcnVucwogICAgLy8gb24gZXZlcnkgdGljayB2aWEgZGF0YXNldC1iYXNlZCBkZWR1cC4KICAgIGxldCBsb2dnZWRTZGFIaWRlID0gZmFsc2U7CiAgICAvLyBTdHJpbmdzIHVzZWQgdG8gZGV0ZWN0IGFuZCBoYW5kbGUgY29uZmxpY3RpbmcgVHdpdGNoIHdvcmtlciBvdmVycmlkZXMgKGUuZy4gVHdpdGNoTm9TdWIpCiAgICBjb25zdCB3b3JrZXJTdHJpbmdDb25mbGljdHMgPSBbCiAgICAgICAgJ3R3aXRjaCcsCiAgICAgICAgJ2lzVmFyaWFudEEnLy8gVHdpdGNoTm9TdWIKICAgIF07CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICAvLyBXYWxrIHRoZSBXb3JrZXIgcHJvdG90eXBlIGNoYWluIGFuZCByZW1vdmUgY29uZmxpY3Rpbmcgb3ZlcnJpZGVzCiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGb3JlaWduIGV4dGVuc2lvbiBtYXkgaGF2ZSBmcm96ZW4gV29ya2VyLnByb3RvdHlwZTsgcGVyLWxpbmsgdHJ5LWNhdGNoLgogICAgICAgICAgICAgICAgICAgIHRyeSB7IE9iamVjdC5zZXRQcm90b3R5cGVPZihwYXJlbnQsIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAocm9vdCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJvb3QgPSBwcm90bzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBhcmVudCA9IHByb3RvOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod29ya2VyKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocHJvdG8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlaW5zZXJ0V29ya2Vycyh3b3JrZXIsIHJlaW5zZXJ0KSB7CiAgICAgICAgbGV0IHBhcmVudCA9IHdvcmtlcjsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlaW5zZXJ0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIFBlci1saW5rIHRyeS1jYXRjaDogZm9yZWlnbi1mcm96ZW4gZW50cnkgc2hvdWxkbid0IGFib3J0IHRoZSBjaGFpbi4KICAgICAgICAgICAgdHJ5IHsgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIHBhcmVudCA9IHJlaW5zZXJ0W2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyZW50OwogICAgfQogICAgZnVuY3Rpb24gaXNWYWxpZFdvcmtlcih3b3JrZXIpIHsKICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSB3b3JrZXIudG9TdHJpbmcoKTsKICAgICAgICBjb25zdCBoYXNDb25mbGljdCA9IHdvcmtlclN0cmluZ0NvbmZsaWN0cy5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGNvbnN0IGhhc1JlaW5zZXJ0ID0gd29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBpZiAoaGFzQ29uZmxpY3QgJiYgIWhhc1JlaW5zZXJ0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciByZWplY3RlZCDigJQgY29uZmxpY3Qgc3RyaW5nIGZvdW5kOiAnICsgd29ya2VyU3RyaW5nQ29uZmxpY3RzLmZpbHRlcigoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKS5qb2luKCcsICcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFoYXNDb25mbGljdCB8fCBoYXNSZWluc2VydDsKICAgIH0KICAgIC8vIFJlcGxhY2Ugd2luZG93LldvcmtlciB0byBpbnRlcmNlcHQgVHdpdGNoJ3MgdmlkZW8gd29ya2VyIGFuZCBpbmplY3QgYWQtYmxvY2tpbmcgbG9naWMKICAgIGxldCBpbmplY3RlZEJsb2JVcmwgPSBudWxsOwogICAgbGV0IG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgLy8gUHJldmVudCBUd2l0Y2ggZnJvbSByZXZva2luZyBvdXIgaW5qZWN0ZWQgd29ya2VyIGJsb2IgVVJMCiAgICAgICAgaWYgKCFVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkKSB7CiAgICAgICAgICAgIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gVVJMLnJldm9rZU9iamVjdFVSTDsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwgPT09IGluamVjdGVkQmxvYlVybCkgcmV0dXJuOwogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMLmNhbGwodGhpcywgdXJsKTsKICAgICAgICAgICAgfSwgJ3Jldm9rZU9iamVjdFVSTCcpOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVpbnNlcnQgPSBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod2luZG93Lldvcmtlcik7CiAgICAgICAgY29uc3QgY2xlYW5Xb3JrZXIgPSBnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIGNsZWFuV29ya2VyIHsKICAgICAgICAgICAgY29uc3RydWN0b3IodHdpdGNoQmxvYlVybCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgbGV0IGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gbmV3IFVSTCh0d2l0Y2hCbG9iVXJsKS5vcmlnaW4uZW5kc1dpdGgoJy50d2l0Y2gudHYnKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghaXNUd2l0Y2hXb3JrZXIpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBOb24tVHdpdGNoIHdvcmtlciBza2lwcGVkOiAnICsgdHdpdGNoQmxvYlVybCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUHJlLWNoZWNrOiB2ZXJpZnkgd2UgY2FuIGZldGNoIHRoZSB3b3JrZXIgSlMgYmVmb3JlIGluamVjdGluZwogICAgICAgICAgICAgICAgbGV0IHByZWZldGNoZWRXb3JrZXJKcyA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgeyBwcmVmZXRjaGVkV29ya2VySnMgPSBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghcHJlZmV0Y2hlZFdvcmtlckpzKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFpbGVkIHRvIGZldGNoIHdvcmtlciBKUyDigJQgZmFsbGluZyBiYWNrIHRvIHVubW9kaWZpZWQgd29ya2VyJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGludGVyY2VwdGVkIOKAlCBpbmplY3RpbmcgYWQtYmxvY2sgaG9va3MnKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ0ZldGNoUmVxdWVzdHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgJHtoYXNBZFRhZ3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldE1hdGNoZWRBZFNpZ25pZmllcnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke25vdGlmeUFkQ29tcGxldGUudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3N0cmlwQWRTZWdtZW50cy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJvY2Vzc00zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2hvb2tXb3JrZXJGZXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7ZGVjbGFyZU9wdGlvbnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldEFjY2Vzc1Rva2VuLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtncWxSZXF1ZXN0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwYXJzZUF0dHJpYnV0ZXMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFdhc21Xb3JrZXJKcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U2VydmVyVGltZUZyb21NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtyZXBsYWNlU2VydmVyVGltZUluTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJ1bmVTdHJlYW1JbmZvcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Y3JlYXRlU3RyZWFtSW5mby50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IGdldFdhc21Xb3JrZXJKcygnJHt0d2l0Y2hCbG9iVXJsLnJlcGxhY2VBbGwoIiciLCAiJTI3Iil9Jyk7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZU9wdGlvbnMoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCA9IHNldEludGVydmFsKHBydW5lU3RyZWFtSW5mb3MsIDUgKiA2MCAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJHtSZWxvYWRQbGF5ZXJBZnRlckFkfTsKICAgICAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSAke1JlbG9hZENvb2xkb3duU2Vjb25kc307CiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9ICR7RGlzYWJsZVJlbG9hZENhcH07CiAgICAgICAgICAgICAgICAgICAgRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gJHtFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGR9OwogICAgICAgICAgICAgICAgICAgIFBpbkJhY2t1cFBsYXllclR5cGUgPSAke1BpbkJhY2t1cFBsYXllclR5cGV9OwogICAgICAgICAgICAgICAgICAgIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPSAke1ByZWZlckxvd1F1YWxpdHlCYWNrdXB9OwogICAgICAgICAgICAgICAgICAgIEZhc3RBdXRvcGxheUZpcnN0VHJ5ID0gJHtGYXN0QXV0b3BsYXlGaXJzdFRyeX07CiAgICAgICAgICAgICAgICAgICAgQmFja3VwU3dhcEZpcnN0ID0gJHtCYWNrdXBTd2FwRmlyc3R9OwogICAgICAgICAgICAgICAgICAgIERpc2FibGVBZFNwb29maW5nID0gJHtEaXNhYmxlQWRTcG9vZmluZ307CiAgICAgICAgICAgICAgICAgICAgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgPSAnJHtGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZX0nOwogICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gJHtHUUxEZXZpY2VJRCA/ICInIiArIEdRTERldmljZUlEICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9ICR7QXV0aG9yaXphdGlvbkhlYWRlciA/ICInIiArIEF1dGhvcml6YXRpb25IZWFkZXIgKyAiJyIgOiB1bmRlZmluZWR9OwogICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9ICR7Q2xpZW50SW50ZWdyaXR5SGVhZGVyID8gIiciICsgQ2xpZW50SW50ZWdyaXR5SGVhZGVyICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQ2xpZW50VmVyc2lvbiA9ICR7Q2xpZW50VmVyc2lvbiA/ICInIiArIENsaWVudFZlcnNpb24gKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gJHtDbGllbnRTZXNzaW9uID8gIiciICsgQ2xpZW50U2Vzc2lvbiArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudFZlcnNpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudFNlc3Npb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudElkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SUQgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlRGV2aWNlSWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRmV0Y2hSZXNwb25zZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVzcG9uc2VEYXRhLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCB0aW1lb3V0SWQgfSA9IHBlbmRpbmdGZXRjaFJlcXVlc3RzLmdldChyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXNwb25zZURhdGEuZXJyb3IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcmVzcG9uc2UgZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSB0YWtlcyBzdGF0dXMvc3RhdHVzVGV4dC9oZWFkZXJzIOKAlCB1cmwvcmVkaXJlY3RlZC90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UuIElWUyBXQVNNIHZhbGlkYXRlcyB0aGVzZSAoU3BhZGUvdHJhY2tpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMpIGFuZCB0aHJvd3MgTmV0d29ya0Vycm9yIGlmIHRoZXkncmUgbWlzc2luZyDigJQgVFRWLUFCIHY2LjMuNSBmaXguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHJlc3BvbnNlRGF0YS5ib2R5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlRGF0YS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZURhdGEuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlRGF0YS5oZWFkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2VEYXRhLnVybCB8fCAnJywgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAncmVkaXJlY3RlZCcsIHsgdmFsdWU6ICEhcmVzcG9uc2VEYXRhLnJlZGlyZWN0ZWQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNwb25zZSwgJ3R5cGUnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudHlwZSB8fCAnYmFzaWMnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1RyaWdnZXJlZFBsYXllclJlbG9hZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUmVsb2FkU2tpcHBlZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1haW4gdGhyZWFkIHJlZnVzZWQgdGhlIHJlbG9hZCAocGxheWVyIGhlYWx0aHkpIOKAlCBjbGVhciBlYXJseS1yZWxvYWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWdzIHNvIHdlIGNhbiByZS1maXJlIGlmIHRoZSBwbGF5ZXIgbGF0ZXIgc3RhbGxzLiBXaXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFYXJseVJlbG9hZFRyaWdnZXJlZCAvIEVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgc3RheSBzZXQgYWZ0ZXIgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhbHRoeS1za2lwLCBibG9ja2luZyBzdWJzZXF1ZW50IGVhcmx5LXJlbG9hZCBmaXJpbmdzIGluIHRoZSBicmVhay4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbGVhcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgaW4gU3RyZWFtSW5mb3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaSA9IFN0cmVhbUluZm9zW2NoYW5uZWxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaSAmJiBzaS5FYXJseVJlbG9hZFRyaWdnZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaS5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaS5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpLkVhcmx5UmVsb2FkQ291bnQgPSBNYXRoLm1heCgwLCAoc2kuRWFybHlSZWxvYWRDb3VudCB8fCAwKSAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFJlbG9hZCBza2lwcGVkIGJ5IG1haW4gdGhyZWFkIChwbGF5ZXIgaGVhbHRoeSkg4oCUIGVhcmx5IHJlbG9hZCBzdGF0ZSBjbGVhcmVkLCBjYW4gcmV0cnknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdTaW11bGF0ZUFkcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRlZEFkc0RlcHRoID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpbXVsYXRlZEFkc0RlcHRoOiAnICsgU2ltdWxhdGVkQWRzRGVwdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyA9ICFBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOiAnICsgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGhvb2tXb3JrZXJGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgIC8vIEd1YXJkIHRoZSBldmFsIOKAlCBtYWxmb3JtZWQgd29ya2VyU3RyaW5nIHNob3VsZG4ndCBzaWxlbnRseSBicmVhawogICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCdzIHBsYXllciBsb2dpYyB3aXRob3V0IGEgZGlhZ25vc3RpYy4KICAgICAgICAgICAgICAgICAgICB0cnkgeyBldmFsKHdvcmtlclN0cmluZyk7IH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignW0FEIERFQlVHXSBXb3JrZXIgZXZhbCBmYWlsZWQg4oCUIFR3aXRjaCBwbGF5ZXIgbG9naWMgbm90IGxvYWRlZDonLCBlKTsgfQogICAgICAgICAgICAgICAgYDsKICAgICAgICAgICAgICAgIGlmIChpbmplY3RlZEJsb2JVcmwgJiYgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBvcmlnaW5hbFJldm9rZU9iamVjdFVSTC5jYWxsKFVSTCwgaW5qZWN0ZWRCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBZEJsb2NrQmFubmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyKGUuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIGJhY2t1cCBzdHJlYW0gc3dpdGNoZXMgKHN0YXJ0IGFuZCBlbmQgb2YgYWQgYnJlYWspCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuaGFzQWRzICE9PSAhIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHBvc2l0aW9uIHRyYWNraW5nIG9uIGFkLWVuZCBzbyB0aGUgc3RyZWFtIHN3aXRjaCBnYXAgaXNuJ3QgZGV0ZWN0ZWQgYXMgYSBqdW1wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuZGF0YS5oYXNBZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrID0gISFlLmRhdGEuaGFzQWRzOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBkcmlmdCBjYXRjaC11cCB3aGVuIGFkcyBzdGFydCDigJQgZG9uJ3QgcnVuIDEuMXggZHVyaW5nIGFkIGhhbmRsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuaGFzQWRzICYmIChkcmlmdENhdGNoVXBJbnRlcnZhbCB8fCBkcmlmdENhdGNoVXBUaW1lb3V0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmlmdENhdGNoVXBUaW1lb3V0KSB7IGNsZWFyVGltZW91dChkcmlmdENhdGNoVXBUaW1lb3V0KTsgZHJpZnRDYXRjaFVwVGltZW91dCA9IG51bGw7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykucGxheWJhY2tSYXRlID0gMS4wOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1BhdXNlUmVzdW1lUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBkb1R3aXRjaFBsYXllclRhc2sodHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUsIGUuZGF0YS5raW5kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5rZXkgPT0gJ0ZldGNoUmVxdWVzdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hSZXF1ZXN0ID0gZXZlbnQuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gV29ya2VyIGNyYXNoIHJlY292ZXJ5IOKAlCBJVlMgV0FTTSB3b3JrZXIgY2FuIGZpcmUgUnVudGltZUVycm9yCiAgICAgICAgICAgICAgICAvLyAoZS5nLiAiaW5kZXggb3V0IG9mIGJvdW5kcyIpIGFuZCBkaWUuIEEgc2luZ2xlIGNyYXNoIGZpcmVzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAvLyBlcnJvciBldmVudHM7IGRlZHVwZSB2aWEgYSBsb2NhbCBmbGFnLiBPbiBmaXJzdCBlcnJvciwgdHJpZ2dlciBhCiAgICAgICAgICAgICAgICAvLyBoYXJkIHJlbG9hZCB2aWEgdGhlIG1haW4gcmVsb2FkIHBhdGgg4oCUIFR3aXRjaCByZS1zcGF3bnMgdGhlIHdvcmtlcgogICAgICAgICAgICAgICAgLy8gYXMgcGFydCBvZiB0aGUgbmV3IHBsYXllciBpbnN0YW5jZSwgYW5kIGV4aXN0aW5nIHJlbG9hZCBjb29sZG93bgogICAgICAgICAgICAgICAgLy8gcHJldmVudHMgcnVuYXdheSByZXN0YXJ0IGxvb3BzLgogICAgICAgICAgICAgICAgbGV0IGNyYXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChjcmFzaGVkKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY3Jhc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSVZTIFdBU00gd29ya2VyIGNyYXNoZWQ6ICcgKyAoKGUgJiYgZS5tZXNzYWdlKSB8fCAndW5rbm93biBlcnJvcicpICsgJyDigJQgdHJpZ2dlcmluZyBoYXJkIHJlbG9hZCB0byByZWNvdmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZG9Ud2l0Y2hQbGF5ZXJUYXNrKGZhbHNlLCB0cnVlLCAnZWFybHknKTsgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBjcmFzaCByZWNvdmVyeSBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGxldCB3b3JrZXJJbnN0YW5jZSA9IHJlaW5zZXJ0V29ya2VycyhuZXdXb3JrZXIsIHJlaW5zZXJ0KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnV29ya2VyJywgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlckluc3RhbmNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFdvcmtlcih2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB3b3JrZXJJbnN0YW5jZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQXR0ZW1wdCB0byBzZXQgdHdpdGNoIHdvcmtlciBkZW5pZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbVdvcmtlckpzKHR3aXRjaEJsb2JVcmwpIHsKICAgICAgICBpZiAoIWdldFdhc21Xb3JrZXJKcy5jYWNoZSkgewogICAgICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF07CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJlcS5vcGVuKCdHRVQnLCB0d2l0Y2hCbG9iVXJsLCBmYWxzZSk7CiAgICAgICAgcmVxLm92ZXJyaWRlTWltZVR5cGUoInRleHQvamF2YXNjcmlwdCIpOwogICAgICAgIHJlcS5zZW5kKCk7CiAgICAgICAgY29uc3QgdGV4dCA9IHJlcS5yZXNwb25zZVRleHQ7CiAgICAgICAgZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdID0gdGV4dDsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIC8vIEhvb2sgZmV0Y2goKSBpbiB0aGUgd29ya2VyIHNjb3BlIHRvIGludGVyY2VwdCBtM3U4IHBsYXlsaXN0IHJlcXVlc3RzIGFuZCBhZCBzZWdtZW50cwogICAgZnVuY3Rpb24gaG9va1dvcmtlckZldGNoKCkgewogICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIGhvb2tXb3JrZXJGZXRjaCAodmFmdCknKTsKICAgICAgICBjb25zdCBCTEFOS19NUDQgPSBuZXcgQmxvYihbVWludDhBcnJheS5mcm9tKGF0b2IoJ0FBQUFLR1owZVhCdGNEUXlBQUFBQVdsemIyMXRjRFF5WkdGemFHRjJZekZwYzI4MmFHeHpaZ0FBQkVsdGIyOTJBQUFBYkcxMmFHUUFBQUFBQUFBQUFBQUFBQUFBQVlhZ0FBQUFBQUFCQUFBQkFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUFCcUhSeVlXc0FBQUJjZEd0b1pBQUFBQU1BQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQVVSdFpHbGhBQUFBSUcxa2FHUUFBQUFBQUFBQUFBQUFBQUFBQUx1QUFBQUFBRlhFQUFBQUFBQXRhR1JzY2dBQUFBQUFBQUFBYzI5MWJnQUFBQUFBQUFBQUFBQUFBRk52ZFc1a1NHRnVaR3hsY2dBQUFBRHZiV2x1WmdBQUFCQnpiV2hrQUFBQUFBQUFBQUFBQUFBa1pHbHVaZ0FBQUJ4a2NtVm1BQUFBQUFBQUFBRUFBQUFNZFhKc0lBQUFBQUVBQUFDemMzUmliQUFBQUdkemRITmtBQUFBQUFBQUFBRUFBQUJYYlhBMFlRQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFnQVFBQUFBQUx1QUFBQUFBQUF6WlhOa2N3QUFBQUFEZ0lDQUlnQUJBQVNBZ0lBVVFCVUFBQUFBQUFBQUFBQUFBQVdBZ0lBQ0VaQUdnSUNBQVFJQUFBQVFjM1IwY3dBQUFBQUFBQUFBQUFBQUVITjBjMk1BQUFBQUFBQUFBQUFBQUJSemRITjZBQUFBQUFBQUFBQUFBQUFBQUFBQUVITjBZMjhBQUFBQUFBQUFBQUFBQWVWMGNtRnJBQUFBWEhScmFHUUFBQUFEQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQW9BQUFBRm9BQUFBQUFHQmJXUnBZUUFBQUNCdFpHaGtBQUFBQUFBQUFBQUFBQUFBQUE5Q1FBQUFBQUJWeEFBQUFBQUFMV2hrYkhJQUFBQUFBQUFBQUhacFpHVUFBQUFBQUFBQUFBQUFBQUJXYVdSbGIwaGhibVJzWlhJQUFBQUJMRzFwYm1ZQUFBQVVkbTFvWkFBQUFBRUFBQUFBQUFBQUFBQUFBQ1JrYVc1bUFBQUFIR1J5WldZQUFBQUFBQUFBQVFBQUFBeDFjbXdnQUFBQUFRQUFBT3h6ZEdKc0FBQUFvSE4wYzJRQUFBQUFBQUFBQVFBQUFKQmhkbU14QUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0FCYUFCSUFBQUFTQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdQLy9BQUFBT21GMlkwTUJUVUFlLytFQUkyZE5RQjZXVW9GQVgvTGdMVUJBUUZBQUFENkFBQTZtRGdBQUhvUUFBOUNXN3k0S0FRQUVhT3VQSUFBQUFCQnpkSFJ6QUFBQUFBQUFBQUFBQUFBUWMzUnpZd0FBQUFBQUFBQUFBQUFBRkhOMGMzb0FBQUFBQUFBQUFBQUFBQUFBQUFBUWMzUmpid0FBQUFBQUFBQUFBQUFBU0cxMlpYZ0FBQUFnZEhKbGVBQUFBQUFBQUFBQkFBQUFBUUFBQUM0QUFBQUFBb0FBQUFBQUFDQjBjbVY0QUFBQUFBQUFBQUlBQUFBQkFBQ0NOUUFBQUFBQ1FBQUEnKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpXSwge3R5cGU6ICd2aWRlby9tcDQnfSk7CiAgICAgICAgY29uc3QgcmVhbEZldGNoID0gZmV0Y2g7CiAgICAgICAgZmV0Y2ggPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuaGFzKHVybCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEJMQU5LX01QNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgnbTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSBhc3luYyBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYXdhaXQgcHJvY2Vzc00zVTgodXJsLCBhd2FpdCByZXNwb25zZS50ZXh0KCksIHJlYWxGZXRjaCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcnNlZFVybC5wYXRobmFtZS5tYXRjaCgvKFteXC9dKykoPz1cLlx3KyQpLyk/LlswXTsKICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ3BhcmVudF9kb21haW5zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlZFVybC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyVGltZSA9IGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCAhPSBudWxsICYmIChhd2FpdCByZWFsRmV0Y2goc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Lm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF0pKS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGVuY29kaW5ncyBhcmUgZGVhZCAodGhlIHN0cmVhbSBwcm9iYWJseSByZXN0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHJlbG9hZC1wZW5kaW5nIGZsYWcgZnJvbSBhIHByaW9yIHN0cmVhbSBzZXNzaW9uIOKAlCB3aXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVsb2FkIHRyaWdnZXJlZCBvbiB0aGUgcHJldmlvdXMgY2hhbm5lbCBibGVlZHMgaW50byB0aGUgbmV3IGNoYW5uZWwncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29sZG93biBjYWxjdWxhdGlvbiwgYmxvY2tpbmcgbGVnaXRpbWF0ZSBlbmQtb2YtYnJlYWsgcmVsb2Fkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5ldyBzdHJlYW0gc2Vzc2lvbiDigJQgY2hhbm5lbDogJyArIGNoYW5uZWxOYW1lICsgJywgQVBJOiAnICsgKFYyQVBJID8gJ3YyJyA6ICd2MScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdID0gc3RyZWFtSW5mbyA9IGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHBhcnNlZFVybC5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBsaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmF0ZTogYXR0cmlidXRlc1snRlJBTUUtUkFURSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNzOiBhdHRyaWJ1dGVzWydDT0RFQ1MnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFVRElPL1ZJREVPL1NVQlRJVExFUyBncm91cHMgY29waWVkIG9udG8gdGhlIHJld3JpdHRlbiBTVFJFQU0tSU5GIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmluZyBIRVZD4oaSQVZDIGZhbGxiYWNrIChUVFYtQUIgdjYuNy41IHBhcnNlciBmaXgpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW86IGF0dHJpYnV0ZXNbJ0FVRElPJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbzogYXR0cmlidXRlc1snVklERU8nXSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnRpdGxlczogYXR0cmlidXRlc1snU1VCVElUTEVTJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmw6IGxpbmVzW2kgKyAxXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHNbbGluZXNbaSArIDFdXSA9IHJlc29sdXRpb25JbmZvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LnB1c2gocmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc0J5VXJsW2xpbmVzW2kgKyAxXV0gPSBzdHJlYW1JbmZvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gcmVzb2x1dGlvbnMgcGFyc2VkIGZyb20gZW5jb2RpbmdzIG0zdTgg4oCUIFR3aXRjaCBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBmb3JtYXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub25IZXZjUmVzb2x1dGlvbkxpc3QgPSBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudC5Db2RlY3Muc3RhcnRzV2l0aCgnYXZjJykgfHwgZWxlbWVudC5Db2RlY3Muc3RhcnRzV2l0aCgnYXYwJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWx3YXlzUmVsb2FkUGxheWVyT25BZCB8fCAobm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aCA+IDAgJiYgc3RyZWFtSW5mby5SZXNvbHV0aW9uTGlzdC5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdoZXYnKSB8fCBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdodmMnKSkgJiYgIVNraXBQbGF5ZXJSZWxvYWRPbkhldmMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyID0gKGxpbmUsIGtleSwgdmFsdWUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCAhdmFsdWUpIHJldHVybiBsaW5lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWQgPSB2YWx1ZS5yZXBsYWNlKC9cXC9nLCAnXFxcXCcpLnJlcGxhY2UoLyIvZywgJ1xcIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBrZXkgKyAnPSInICsgZXNjYXBlZCArICciJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCgnKF58LCknICsga2V5ICsgJz0oIlteIl0qInxbXixdKiknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KGxpbmUpID8gbGluZS5yZXBsYWNlKHBhdHRlcm4sICckMScgKyBuZXh0KSA6IGxpbmUgKyAnLCcgKyBuZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXS5zdWJzdHJpbmcobGluZXNbaV0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkUmVzb2x1dGlvbiA9IHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gb2xkUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEFyZWEgPSB0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UmVzb2x1dGlvbkluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZXN0RGlmZiA9IEluZmluaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vbkhldmNSZXNvbHV0aW9uTGlzdFtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3N0cmVhbVdpZHRoLCBzdHJlYW1IZWlnaHRdID0gY2FuZGlkYXRlLlJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKChzdHJlYW1XaWR0aCAqIHN0cmVhbUhlaWdodCkgLSB0YXJnZXRBcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpZmYgPSBkaWZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVzb2x1dGlvbkluZm8gPSBjYW5kaWRhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZGlmaWVkTTNVOCBzd2FwICcgKyByZXNTZXR0aW5nc1tjb2RlY3NLZXldICsgJyB0byAnICsgbmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzICsgJyBvbGRSZXM6JyArIG9sZFJlc29sdXRpb24gKyAnIG5ld1JlczonICsgbmV3UmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzfSJgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IEFVRElPL1ZJREVPL1NVQlRJVExFUyBncm91cHMgKFRUVi1BQiB2Ni43LjUgcGFyc2VyIGZpeCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyKGxpbmVzW2ldLCAnQVVESU8nLCBuZXdSZXNvbHV0aW9uSW5mby5BdWRpbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyKGxpbmVzW2ldLCAnVklERU8nLCBuZXdSZXNvbHV0aW9uSW5mby5WaWRlbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyKGxpbmVzW2ldLCAnU1VCVElUTEVTJywgbmV3UmVzb2x1dGlvbkluZm8uU3VidGl0bGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpICsgMV0gPSBuZXdSZXNvbHV0aW9uSW5mby5VcmwgKyAnICcucmVwZWF0KGkgKyAxKTsvLyBUaGUgc3RyZWFtIGRvZXNuJ3QgbG9hZCB1bmxlc3MgZWFjaCB1cmwgbGluZSBpcyB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCB8fCBBbHdheXNSZWxvYWRQbGF5ZXJPbkFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggPSBsaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZG8gTk9UIHNldCBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgaGVyZS4gSXQgd2FzIHByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdW5jb25kaXRpb25hbGx5IG9uIG5ldyBzdHJlYW0gc2Vzc2lvbiBjcmVhdGlvbiwgd2hpY2ggY2F1c2VkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVuZC1vZi1icmVhayByZWxvYWQgb2YgZXZlcnkgbmV3IGNoYW5uZWwgdG8gYmUgYmxvY2tlZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb2xkb3duIOKAlCB0aGUgY29vbGRvd24gY2hlY2sgdHJlYXRlZCB0aGUgc2Vzc2lvbi1jcmVhdGlvbiB0aW1lc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHJlY2VudCByZWxvYWQsIGV2ZW4gdGhvdWdoIG5vIHJlbG9hZCBoYWQgYWN0dWFsbHkgb2NjdXJyZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID8gc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggOiBzdHJlYW1JbmZvLkVuY29kaW5nc00zVTgsIHNlcnZlclRpbWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXIocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC8jRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKFteIl0rKSIvKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAxID8gbWF0Y2hlc1sxXSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC9TRVJWRVItVElNRT0iKFswLTkuXSspIi8pOwogICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gcmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoZW5jb2RpbmdzTTN1OCwgbmV3U2VydmVyVGltZSkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKCNFWFQtWC1TRVNTSU9OLURBVEE6REFUQS1JRD0iU0VSVkVSLVRJTUUiLFZBTFVFPSIpW14iXSsoIikvLCBgJDEke25ld1NlcnZlclRpbWV9JDJgKSA6IGVuY29kaW5nc00zdTg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTZXJ2ZXJUaW1lID8gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKC8oU0VSVkVSLVRJTUU9IilbMC05Ll0rIi8sIGBTRVJWRVItVElNRT0iJHtuZXdTZXJ2ZXJUaW1lfSJgKSA6IGVuY29kaW5nc00zdTg7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBZFNpZ25pZmllcnMuc29tZSgocykgPT4gcyAmJiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIC8vIFNwb29mIGFkIGNvbXBsZXRpb24gdG8gVHdpdGNoJ3MgR1FMIGVuZHBvaW50IHdoZW4gYW4gYWQgYnJlYWsgaXMgZGV0ZWN0ZWQuCiAgICAvLyBNaW1pY3MgdGhlIGltcHJlc3Npb24vcXVhcnRpbGUvcG9kLWNvbXBsZXRlIGJlYWNvbnMgVHdpdGNoJ3MgcGxheWVyIHdvdWxkIGhhdmUgc2VudAogICAgLy8gaWYgdGhlIGFkIGFjdHVhbGx5IHBsYXllZC4gTWF5IHJlZHVjZSBkZXRlY3Rpb24gZXNjYWxhdGlvbi4KICAgIGZ1bmN0aW9uIG5vdGlmeUFkQ29tcGxldGUodGV4dFN0ciwgc3RyZWFtSW5mbykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIFR3aXRjaCByZXZlYWxzIGVhY2ggYWQncyBEQVRFUkFOR0Ugb25seSBhcyB0aGF0IGFkIHN0YXJ0cywgc28gbXVsdGktYWQKICAgICAgICAgICAgLy8gcG9kcyBzdXJmYWNlIG9uZSBhZCBwZXIgcG9sbC4gQ2FsbGVkIGV2ZXJ5IGFkLWxhZGVuIHBvbGw7IFNwb29mZWRBZElkcwogICAgICAgICAgICAvLyBkZWR1cHMgYWNyb3NzIHBvbGxzIHNvIGVhY2ggYWQgaXMgc3Bvb2ZlZCBvbmNlIChmdWxsIE4vTiBwb2QgY292ZXJhZ2UpLgogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gWy4uLnRleHRTdHIubWF0Y2hBbGwoLyNFWFQtWC1EQVRFUkFOR0U6KElEPSJzdGl0Y2hlZC1hZC1bXlxuXSspXG4vZyldOwogICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIGlmICghbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWROb01hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWROb01hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlUmFuZ2VMaW5lID0gdGV4dFN0ci5tYXRjaCgvI0VYVC1YLURBVEVSQU5HRTpbXlxuXXswLDIwMH0vKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBub3RpZnlBZENvbXBsZXRlOiBubyBzdGl0Y2hlZC1hZCBEQVRFUkFOR0UgbWF0Y2guIFNhbXBsZSBEQVRFUkFOR0U6ICcgKyAoZGF0ZVJhbmdlTGluZSA/IGRhdGVSYW5nZUxpbmVbMF0gOiAnbm9uZSBmb3VuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzcG9vZmVkU2V0ID0gKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5TcG9vZmVkQWRJZHMpIHx8IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHBvZExlbk1hdGNoID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQUQtUE9ELUxFTkdUSD0iKFxkKykiLyk7CiAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aCA9IHBvZExlbk1hdGNoID8gcGFyc2VJbnQocG9kTGVuTWF0Y2hbMV0sIDEwKSA6IG1hdGNoZXMubGVuZ3RoOwogICAgICAgICAgICAvLyBIb3QtcGF0aCBlYXJseS1vdXQ6IHNwb29mIHJ1bnMgZXZlcnkgYWQtbGFkZW4gcG9sbDsgb25jZSB0aGUgZGVkdXAgc2V0CiAgICAgICAgICAgIC8vIGNvdmVycyB0aGUgcG9kLCBldmVyeSByZW1haW5pbmcgcG9sbCBpcyBwdXJlIHdhc3RlIOKAlCBiYWlsIGJlZm9yZSB0aGUgbG9vcC4KICAgICAgICAgICAgaWYgKHNwb29mZWRTZXQgJiYgc3Bvb2ZlZFNldC5zaXplID49IHBvZExlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBuZXdTcG9vZmVkID0gMDsKICAgICAgICAgICAgbGV0IGZpcnN0Um9sbFR5cGUgPSAnJzsKICAgICAgICAgICAgbGV0IHBvZENvbXBsZXRlU2VudCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIENoZWFwIElEIHByZS1leHRyYWN0IOKAlCBkZWR1cC1jaGVjayBiZWZvcmUgdGhlIGZ1bGwgcGFyc2VBdHRyaWJ1dGVzKCkKICAgICAgICAgICAgICAgIC8vIHNvIGFscmVhZHktc3Bvb2ZlZCBhZHMgYXJlbid0IHJlLXBhcnNlZCBldmVyeSBwb2xsLgogICAgICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IG1hdGNoZXNbaV1bMV0ubWF0Y2goL15JRD0iKFteIl0rKSIvKTsKICAgICAgICAgICAgICAgIGNvbnN0IHN0aXRjaGVkQWRJZCA9IGlkTWF0Y2ggPyBpZE1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICAvLyBNdWx0aS1wb2xsIGRlZHVwOiBza2lwIGFkcyBhbHJlYWR5IHNwb29mZWQgZWFybGllciB0aGlzIGJyZWFrLgogICAgICAgICAgICAgICAgaWYgKHNwb29mZWRTZXQgJiYgc3RpdGNoZWRBZElkICYmIHNwb29mZWRTZXQuaGFzKHN0aXRjaGVkQWRJZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBwYXJzZUF0dHJpYnV0ZXMobWF0Y2hlc1tpXVsxXSk7CiAgICAgICAgICAgICAgICBjb25zdCByYWRUb2tlbiA9IGF0dHJbJ1gtVFYtVFdJVENILUFELVJBRFMtVE9LRU4nXTsKICAgICAgICAgICAgICAgIGlmICghcmFkVG9rZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiAhbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWROb1Rva2VuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUFkQ29tcGxldGUubG9nZ2VkTm9Ub2tlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIG5vdGlmeUFkQ29tcGxldGU6IG1hdGNoZWQgREFURVJBTkdFIGJ1dCBubyBSQURTIHRva2VuLiBBdHRyaWJ1dGVzOiAnICsgT2JqZWN0LmtleXMoYXR0cikuam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgcm9sbFR5cGUgPSAoYXR0clsnWC1UVi1UV0lUQ0gtQUQtUk9MTC1UWVBFJ10gfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Um9sbFR5cGUpIGZpcnN0Um9sbFR5cGUgPSByb2xsVHlwZTsKICAgICAgICAgICAgICAgIGNvbnN0IGFkUG9zaXRpb24gPSBwYXJzZUludChhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtUE9TSVRJT04nXSB8fCBTdHJpbmcoaSksIDEwKTsKICAgICAgICAgICAgICAgIC8vIFBheWxvYWQgY29uc2lzdGVudCB3aXRoIHRoZSAid2F0Y2hlZC10by1jb21wbGV0aW9uIiBldmVudHMgd2UgY2xhaW06CiAgICAgICAgICAgICAgICAvLyBhdWRpby1vbiwgdmlzaWJsZSwgZnVsbCBkdXJhdGlvbi4gTWlzbWF0Y2hlZCBmaWVsZHMgKG11dGU9dHJ1ZSAvIHZvbHVtZT0wIC8KICAgICAgICAgICAgICAgIC8vIHZpc2libGU9ZmFsc2UgLyBkdXJhdGlvbj0wKSB3b3VsZCBiZSBvYnZpb3VzIGNyb3NzLXZhbGlkYXRpb24gZmxhZ3MuCiAgICAgICAgICAgICAgICBjb25zdCBhZER1cmF0aW9uID0gcGFyc2VJbnQoYXR0clsnWC1UVi1UV0lUQ0gtQUQtRFVSQVRJT04nXSB8fCAnMCcsIDEwKSB8fCAwOwogICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsKICAgICAgICAgICAgICAgICAgICBzdGl0Y2hlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBhZF9pZDogc3RpdGNoZWRBZElkLAogICAgICAgICAgICAgICAgICAgIHJvbGxfdHlwZTogcm9sbFR5cGUsCiAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVfaWQ6IGF0dHJbJ1gtVFYtVFdJVENILUFELUNSRUFUSVZFLUlEJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQ6IGF0dHJbJ1gtVFYtVFdJVENILUFELU9SREVSLUlEJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgbGluZV9pdGVtX2lkOiBhdHRyWydYLVRWLVRXSVRDSC1BRC1MSU5FLUlURU0tSUQnXSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfbXV0ZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgcGxheWVyX3ZvbHVtZTogMS4wLAogICAgICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGFkRHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgYWRfcG9zaXRpb246IGFkUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgdG90YWxfYWRzOiBwb2RMZW5ndGgKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyBCYXRjaCBhbGwgNiBldmVudHMgaW50byBvbmUgR1FMIFBPU1Qg4oCUIFR3aXRjaCBzdXBwb3J0cyBhcnJheS1iYXRjaGVkCiAgICAgICAgICAgICAgICAvLyBvcGVyYXRpb25zIG5hdGl2ZWx5LiBSZWR1Y2VzIHJlcXVlc3QgY291bnQgNsOXIGFuZCBhdm9pZHMgdGhlIGJvdC1saWtlCiAgICAgICAgICAgICAgICAvLyBmaW5nZXJwcmludCBvZiBmaXJpbmcgNiBzZXBhcmF0ZSByZXF1ZXN0cyBhdCBhZC1kZXRlY3QuCiAgICAgICAgICAgICAgICBjb25zdCBtYWtlUGFja2V0ID0gKGV2ZW50LCBleHRyYSkgPT4gKHsKICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnQ2xpZW50U2lkZUFkRXZlbnRIYW5kbGluZ19SZWNvcmRBZEV2ZW50JywKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHsgaW5wdXQ6IHsgZXZlbnROYW1lOiBldmVudCwgZXZlbnRQYXlsb2FkOiBKU09OLnN0cmluZ2lmeSh7IC4uLnBheWxvYWQsIC4uLmV4dHJhIH0pLCByYWRUb2tlbiB9IH0sCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogeyBwZXJzaXN0ZWRRdWVyeTogeyB2ZXJzaW9uOiAxLCBzaGEyNTZIYXNoOiAnN2U2YzY5ZTZlYjU5ZjhjY2I5N2FiNzM2ODZmM2Q4YjdkODVhNzJhMDI5ODc0NWNjZDhiZmM2OGU0MDU0Y2E1YicgfSB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIE1hcmsgc3Bvb2ZlZCBiZWZvcmUgYnVpbGRpbmcgYmF0Y2ggc28gdGhlIHBvZC1jb21wbGV0ZSBzaXplIGNoZWNrIGlzIGFjY3VyYXRlLgogICAgICAgICAgICAgICAgaWYgKHNwb29mZWRTZXQgJiYgc3RpdGNoZWRBZElkKSBzcG9vZmVkU2V0LmFkZChzdGl0Y2hlZEFkSWQpOwogICAgICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBbCiAgICAgICAgICAgICAgICAgICAgbWFrZVBhY2tldCgndmlkZW9fYWRfaW1wcmVzc2lvbicpLAogICAgICAgICAgICAgICAgICAgIG1ha2VQYWNrZXQoJ3ZpZGVvX2FkX3F1YXJ0aWxlX2NvbXBsZXRlJywgeyBxdWFydGlsZTogMSB9KSwKICAgICAgICAgICAgICAgICAgICBtYWtlUGFja2V0KCd2aWRlb19hZF9xdWFydGlsZV9jb21wbGV0ZScsIHsgcXVhcnRpbGU6IDIgfSksCiAgICAgICAgICAgICAgICAgICAgbWFrZVBhY2tldCgndmlkZW9fYWRfcXVhcnRpbGVfY29tcGxldGUnLCB7IHF1YXJ0aWxlOiAzIH0pLAogICAgICAgICAgICAgICAgICAgIG1ha2VQYWNrZXQoJ3ZpZGVvX2FkX3F1YXJ0aWxlX2NvbXBsZXRlJywgeyBxdWFydGlsZTogNCB9KSwKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAvLyBwb2RfY29tcGxldGUgb25jZSBwZXIgcG9kIChub3QgcGVyIGFkKSDigJQgYXR0YWNoZWQgdG8gdGhlIGFkIHRoYXQKICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlcyB0aGUgdHJ1ZSBwb2Qgc2l6ZS4gUGVyLWFkIHBvZF9jb21wbGV0ZSAoNsOXIGZvciBhIDYtYWQgcG9kKQogICAgICAgICAgICAgICAgLy8gaXMgaXRzZWxmIGEgZmluZ2VycHJpbnQuIERlZmVuc2l2ZSBmYWxsYmFjayAobm8gZGVkdXAgc2V0KTogcGVyLWFkLgogICAgICAgICAgICAgICAgaWYgKCFzcG9vZmVkU2V0IHx8IHNwb29mZWRTZXQuc2l6ZSA9PT0gcG9kTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaChtYWtlUGFja2V0KCd2aWRlb19hZF9wb2RfY29tcGxldGUnKSk7CiAgICAgICAgICAgICAgICAgICAgcG9kQ29tcGxldGVTZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFN1cnZlaWwgR1FMIHJlc3BvbnNlIHN0YXR1cyDigJQgbm9uLTIwMCBtZWFucyBUd2l0Y2ggcmVqZWN0ZWQgdGhlIHNwb29mCiAgICAgICAgICAgICAgICAvLyAoNDAwLzQwMy80MjkpLiBPbmNlLXBlci1zZXNzaW9uIGd1YXJkIGF2b2lkcyBsb2cgc3BhbS4KICAgICAgICAgICAgICAgIGdxbFJlcXVlc3QoYmF0Y2gpLnRoZW4ocmVzcG9uc2UgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXMgIT09IDIwMCAmJiAhbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWRCYWRTdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWRCYWRTdGF0dXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBub3RpZnlBZENvbXBsZXRlOiBHUUwgcmVzcG9uc2Ugc3RhdHVzICcgKyByZXNwb25zZS5zdGF0dXMgKyAnIOKAlCBzcG9vZiBtYXkgYmUgcmVqZWN0ZWQvcmF0ZS1saW1pdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgICAgICAgICAgbmV3U3Bvb2ZlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdTcG9vZmVkID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgdG90YWwgPSBzcG9vZmVkU2V0ID8gc3Bvb2ZlZFNldC5zaXplIDogbmV3U3Bvb2ZlZDsKICAgICAgICAgICAgICAgIC8vIHNyYz0gcHJpbWFyeSB2cyBjb21taXR0ZWQgYmFja3VwIHBsYXllci10eXBlIChzdXJmYWNlcyBzdHJlYW0tc3dhcAogICAgICAgICAgICAgICAgLy8gYWQtSUQgbWl4aW5nKS4gcG9kLWNvbXBsZXRlPSB3aGV0aGVyIHRoZSBzaW5nbGUgcG9kX2NvbXBsZXRlIGZpcmVkLgogICAgICAgICAgICAgICAgY29uc3Qgc3JjID0gKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlKSB8fCAncHJpbWFyeSc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTcG9vZmVkIGFkIGNvbXBsZXRpb24gZm9yICcgKyBuZXdTcG9vZmVkICsgJyBuZXcgYWQocykgKCcgKyB0b3RhbCArICcvJyArIHBvZExlbmd0aCArICcgcG9kKSDigJQgcm9sbDogJyArIGZpcnN0Um9sbFR5cGUgKyAnLCBzcmM6ICcgKyBzcmMgKyAnLCBwb2QtY29tcGxldGU6ICcgKyAocG9kQ29tcGxldGVTZW50ID8gJ3llcycgOiAnbm8nKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgY29tcGxldGlvbiBzcG9vZiBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFkU2lnbmlmaWVycy5maWx0ZXIoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgLy8gUmVtb3ZlIGFkIHNlZ21lbnRzIGZyb20gYW4gbTN1OCBwbGF5bGlzdCBhbmQgY2FjaGUgdGhlaXIgVVJMcyBmb3IgcmVwbGFjZW1lbnQKICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFkU2lnbmlmaWVycyAoY2FuZGlkYXRlcyBmb3IgZnV0dXJlIGluY2x1c2lvbikKICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMpIHsKICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgbGV0IHNtOwogICAgICAgICAgICBjb25zdCBjbGFzc1JlID0gL0VYVC1YLURBVEVSQU5HRTpbXlxuXSpDTEFTUz0iKHR3aXRjaC1bXiJdKykiL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSBjbGFzc1JlLmV4ZWModGV4dFN0cikpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZCgnRVhULVgtREFURVJBTkdFOkNMQVNTPSInICsgc21bMV0gKyAnIicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHRhZ1JlID0gLyhTQ1RFMzUtW0EtWi1dK3xFWFQtWC1DVUUtW0EtWi1dKykvZzsKICAgICAgICAgICAgd2hpbGUgKChzbSA9IHRhZ1JlLmV4ZWModGV4dFN0cikpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZChzbVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3Vic3RyaW5nIGNoZWNrIChub3QgZXhhY3QpOiBhIGNhbmRpZGF0ZSBpcyAia25vd24iIGlmIGFueSBBZFNpZ25pZmllcgogICAgICAgICAgICAvLyBhcHBlYXJzIHdpdGhpbiBpdC4gVGhpcyBoYW5kbGVzIHByZWZpeCBzaWduaWZpZXJzIGxpa2UgJ3R3aXRjaC1zdGl0Y2hlZCcKICAgICAgICAgICAgLy8gY292ZXJpbmcgJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0idHdpdGNoLXN0aXRjaGVkLWFkIicgZXRjLgogICAgICAgICAgICBjb25zdCB1bmtub3duID0gWy4uLmNhbmRpZGF0ZXNdLmZpbHRlcihjID0+CiAgICAgICAgICAgICAgICAhQWRTaWduaWZpZXJzLnNvbWUocyA9PiBzICYmIGMuaW5jbHVkZXMocykpICYmCiAgICAgICAgICAgICAgICAhS25vd25Ob25BZFNpZ25pZmllcnMuc29tZShzID0+IHMgJiYgYy5pbmNsdWRlcyhzKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQWRTaWduaWZpZXJzOiAnICsgdW5rbm93bi5qb2luKCcsICcpICsgJyAoY2FuZGlkYXRlcyBmb3IgZnV0dXJlIGluY2x1c2lvbiknKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbaV07CiAgICAgICAgICAgIC8vIFRyYWNrIFNDVEUtMzUgQ1VFLU9VVC9DVUUtSU4gYWQgYm91bmRhcmllcwogICAgICAgICAgICBpZiAobGluZS5pbmNsdWRlcygnRVhULVgtQ1VFLU9VVCcpKSB7CiAgICAgICAgICAgICAgICBpZiAoIWluQ3VlT3V0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU0NURS0zNSBDVUUtT1VUIOKAlCBhZCBib3VuZGFyeSBlbnRlcmVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5pbmNsdWRlcygnRVhULVgtQ1VFLUlOJykpIHsKICAgICAgICAgICAgICAgIGlmIChpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLUlOIOKAlCBhZCBib3VuZGFyeSBleGl0ZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluQ3VlT3V0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWNraW5nIHVybHMgd2hpY2ggYXBwZWFyIGluIHRoZSBvdmVybGF5IFVJCiAgICAgICAgICAgIGxpbmVzW2ldID0gbGluZS5yZXBsYWNlQWxsKFR3aXRjaEFkVXJsUmV3cml0ZVJlZ2V4LCBgJDEke25ld0FkVXJsfSQyYCk7CiAgICAgICAgICAgIGNvbnN0IGlzTGl2ZVNlZ21lbnQgPSBsaW5lLmluY2x1ZGVzKCcsbGl2ZScpOwogICAgICAgICAgICBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgKCFpc0xpdmVTZWdtZW50IHx8IHN0cmlwQWxsU2VnbWVudHMgfHwgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzIHx8IGluQ3VlT3V0KSkgewogICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudFVybCA9IGxpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGlmICghQWRTZWdtZW50Q2FjaGUuaGFzKHNlZ21lbnRVcmwpKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChzZWdtZW50VXJsLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgQWRTZWdtZW50VVJMUGF0dGVybnMuc29tZSgocCkgPT4gbGluZXNbaSArIDFdLmluY2x1ZGVzKHApKSkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc2VnbWVudCBkZXRlY3RlZCB2aWEgVVJMIHBhdHRlcm46ICcgKyBsaW5lc1tpICsgMV0pOwogICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KGxpbmVzW2kgKyAxXSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMrKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBpc0xpdmVTZWdtZW50KSB7CiAgICAgICAgICAgICAgICBsaXZlU2VnbWVudHMucHVzaCh7IGV4dGluZjogbGluZSwgdXJsOiBsaW5lc1tpICsgMV0gfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtUEFSVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHBhcnQ6IFVSSSBpcyBpbmxpbmUgYXMgYW4gYXR0cmlidXRlLiBTdHJpcCBpZiBpdCBtYXRjaGVzIGEga25vd24KICAgICAgICAgICAgICAgIC8vIGFkIFVSTCAoYWxyZWFkeSBpbiBjYWNoZSBmcm9tIGEgcGFyYWxsZWwgRVhUSU5GIHN0cmlwLCBvciBtYXRjaGVzIGEgVVJMIHBhdHRlcm4pLgogICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCB0aGUgcGxheWVyIG1heSB1c2UgdGhlIHBhcnRzIHBhdGggdG8gZmV0Y2ggYWQgbWVkaWEgdmlhIGxvdy1sYXRlbmN5LgogICAgICAgICAgICAgICAgY29uc3QgcGFydFVyaU1hdGNoID0gbGluZS5tYXRjaChVcmlBdHRyaWJ1dGVSZWdleCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFkU2VnbWVudFVSTFBhdHRlcm5zLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICAvLyBGb3JtYXQ6ICcjRVhULVgtVFdJVENILVBSRUZFVENIOmh0dHBzOi8vdXJsL2hlcmUudHMnIChyYXcgVVJMIGFmdGVyIHRoZSBjb2xvbikKICAgICAgICAgICAgICAgIC8vICAgICBvcjogJyNFWFQtWC1QUkVMT0FELUhJTlQ6VFlQRT1QQVJULFVSST0idXJsIicgKFVSSSBhdHRyaWJ1dGUpCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBZFNlZ21lbnRVUkxQYXR0ZXJucy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBoYXNBZFRhZ3ModGV4dFN0cikpIHsKICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBObyBsb3cgbGF0ZW5jeSBkdXJpbmcgYWRzIChvdGhlcndpc2UgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHBsYXllciB0byBwcmVmZXRjaCBhbmQgZGlzcGxheSBhZCBzZWdtZW50cykKICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1QUkVMT0FELUhJTlQ6JykpIHsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICAvLyBDYWNoZSBsaXZlIHNlZ21lbnRzIGZvciByZWNvdmVyeSAocGx1cyB0aGUgTUVESUEtU0VRVUVOQ0Ugb2YgdGhlIG9sZGVzdCBjYWNoZWQgc2VnbWVudCwKICAgICAgICAvLyBzbyB0aGUgcGxheWVyIGFjY2VwdHMgaW5qZWN0ZWQgcmVjb3Zlcnkgc2VnbWVudHMgYXMgdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSkKICAgICAgICBpZiAobGl2ZVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzID0gbGl2ZVNlZ21lbnRzLnNsaWNlKC02KTsKICAgICAgICAgICAgY29uc3Qgc2VxID0gcGFyc2VJbnQoKHRleHRTdHIubWF0Y2goLyNFWFQtWC1NRURJQS1TRVFVRU5DRTooXGQrKS8pIHx8IFtdKVsxXSk7CiAgICAgICAgICAgIGlmICghaXNOYU4oc2VxKSkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxID0gc2VxICsgTWF0aC5tYXgoMCwgbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIGFsbCBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkLCB0cnkgdG8gcHJldmVudCBibGFjayBzY3JlZW4gdmlhIHJlY292ZXJ5IGNvbnRlbnQuCiAgICAgICAgLy8gUHJlZmVyIHRoZSBmdWxsLXBsYXlsaXN0IHNuYXBzaG90IGZyb20gYSByZWNlbnQgbm9uLWFkIHBvbGwgKG1pcnJvcnMgVFRWLUFCCiAgICAgICAgLy8gTGFzdENsZWFuTmF0aXZlTTNVOCBhcHByb2FjaCkg4oCUIGdpdmVzIHRoZSBwbGF5ZXIgNC02IGxpdmUgc2VnbWVudHMgd29ydGggb2YKICAgICAgICAvLyBjb250ZW50IHZzIHRoZSB0aGluIHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlLiBGYWxscyBiYWNrIHRvIHRoZSBwZXItc2VnbWVudAogICAgICAgIC8vIGNhY2hlIGlmIHRoZSBzbmFwc2hvdCBpcyBzdGFsZSBvciBtaXNzaW5nLgogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMgJiYgbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSArIDE7CiAgICAgICAgICAgIHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzID0gKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzIHx8IDApICsgMTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCkgc3RyZWFtSW5mby5GcmVlemVTdGFydGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAvLyBQcmltYXJ5OiBmcmVzaCBmdWxsLXBsYXlsaXN0IHNuYXBzaG90ICg8IDEuNXMgb2xkLCBtdXN0IG5vdCBpdHNlbGYgY29udGFpbiBhZCBtYXJrZXJzKQogICAgICAgICAgICBjb25zdCBzbmFwc2hvdEFnZSA9IHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA/IChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0KSA6IEluZmluaXR5OwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4ICYmIHNuYXBzaG90QWdlIDw9IDE1MDAgJiYgIWhhc0FkVGFncyhzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTgpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJldXNpbmcgbGFzdCBjbGVhbiBuYXRpdmUgcGxheWxpc3QgKCcgKyBzbmFwc2hvdEFnZSArICdtcyBvbGQpJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlIChleGlzdGluZyBiZWhhdmlvcikKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyAmJiBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXN0b3JpbmcgJyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggKyAnIHJlY292ZXJ5IHNlZ21lbnRzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKCcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2pdID0gJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonICsgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLmV4dGluZik7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0udXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAobGl2ZVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgLy8gUmVzZXQgZnJlZXplIGNvdW50ZXIgd2hlbiBsaXZlIHNlZ21lbnRzIGFyZSBhdmFpbGFibGUKICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgIH0KICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIC8vIFRocm90dGxlIGNhY2hlIHBydW5lIHRvIG9uY2UgcGVyIDYwcy4gVGhlIDEyMHMgVFRMIGdpdmVzIHBsZW50eSBvZiBoZWFkcm9vbQogICAgICAgIC8vIGFuZCBzY2FubmluZyB0aGUgZnVsbCBjYWNoZSBvbiBldmVyeSBtM3U4IHBvbGwgYWRkcyB1cCBkdXJpbmcgaGVhdnkgYWQgYnJlYWsKICAgICAgICAvLyBzZXF1ZW5jZXMgKExMLUhMUyBjYW4gcG9sbCBtdWx0aXBsZSB0aW1lcyBwZXIgc2Vjb25kKS4gUG9ydGVkIGZyb20gVFRWLUFCLgogICAgICAgIGlmICghc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgfHwgbm93IC0gc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPiA2MDAwMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA9IG5vdzsKICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSwgbWFwKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBub3cgLSAxMjAwMDApIHsKICAgICAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBCb3VuZCB0aGUgY2FjaGUgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoIG9uIGxvbmcgc2Vzc2lvbnMuIFdoZW4gc2l6ZSA+IDEwMDAsCiAgICAgICAgICAgIC8vIGV2aWN0IHRoZSBvbGRlc3QgMjAwIGVudHJpZXMgKE1hcCBpdGVyYXRpb24gb3JkZXIgaXMgaW5zZXJ0aW9uIG9yZGVyLCBzbyBGSUZPKS4KICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLnNpemUgPiAxMDAwKSB7CiAgICAgICAgICAgICAgICBsZXQgZXZpY3RlZCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHVybCBvZiBBZFNlZ21lbnRDYWNoZS5rZXlzKCkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5kZWxldGUodXJsKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKytldmljdGVkID49IDIwMCkgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxaykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTZWdtZW50Q2FjaGUgZXhjZWVkZWQgMTAwMCBlbnRyaWVzIOKAlCBldmljdGVkIG9sZGVzdCAnICsgZXZpY3RlZCArICcgKG5vdyAnICsgQWRTZWdtZW50Q2FjaGUuc2l6ZSArICcpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xuJyk7CiAgICB9CiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG1hdGNoaW5nIHN0cmVhbSBVUkwgZm9yIGEgZ2l2ZW4gcmVzb2x1dGlvbiBmcm9tIGEgbWFzdGVyIG0zdTgKICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBjb25zdCBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgIGxldCBtYXRjaGVkUmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IG1hdGNoZWRGcmFtZVJhdGUgPSBmYWxzZTsKICAgICAgICBsZXQgY2xvc2VzdFJlc29sdXRpb25VcmwgPSBudWxsOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBJbmZpbml0eTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kaW5nc0xpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICAvLyBBY2NlcHQgdjIgQVBJIHZhcmlhbnQgVVJMcyB3aGljaCBhcmUgcmF3IENETiBVUkxzIHdpdGhvdXQgJy5tM3U4JyBpbiB0aGUgcGF0aC4KICAgICAgICAgICAgLy8gdjEgQVBJOiBuZXh0IGxpbmUgaXMgJy4uLmluZGV4LTxyZXNvbHV0aW9uPi5tM3U4Py4uLicKICAgICAgICAgICAgLy8gdjIgQVBJOiBuZXh0IGxpbmUgaXMgYSByYXcgQ0ROIFVSTCBsaWtlICdodHRwczovL3ZpZGVvLWVkZ2UtLi4ubmV0L3YxLy4uLi9jaHVua2VkLy4uLicKICAgICAgICAgICAgLy8gd2l0aG91dCAnLm0zdTgnLiBNYXRjaGluZyBvbmx5IG9uICcubTN1OCcgd291bGQgc2tpcCB2MiB2YXJpYW50cyBlbnRpcmVseSwKICAgICAgICAgICAgLy8gY2F1c2luZyBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uIHRvIHJldHVybiBudWxsIGFuZCBiYWNrdXAgc2VsZWN0aW9uIHRvIGZhaWwuCiAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lID0gZW5jb2RpbmdzTGluZXNbaSArIDFdPy50cmltKCk7CiAgICAgICAgICAgIGlmIChlbmNvZGluZ3NMaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpICYmIG5leHRMaW5lICYmICFuZXh0TGluZS5zdGFydHNXaXRoKCcjJykgJiYgKG5leHRMaW5lLmluY2x1ZGVzKCcubTN1OCcpIHx8IG5leHRMaW5lLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoZW5jb2RpbmdzTGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbiAmJiAoIW1hdGNoZWRSZXNvbHV0aW9uVXJsIHx8ICghbWF0Y2hlZEZyYW1lUmF0ZSAmJiBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlc29sdXRpb25VcmwgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGcmFtZVJhdGUgPSBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25Vcmw7CiAgICB9CiAgICAvLyBDb3JlIGFkLWJsb2NraW5nIGxvZ2ljOiBkZXRlY3QgYWRzIGluIG0zdTgsIGZldGNoIGJhY2t1cCBzdHJlYW1zLCBzdHJpcCBhZCBzZWdtZW50cwogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBpZiAoSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkKSB7CiAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICAvLyBEZXRlY3Rpb24gZGlhZ25vc3RpYzogaWYgVHdpdGNoIHNodXRzIGEgc3RyZWFtIGRvd24gKGFudGktYWQtYmxvY2sgZGV0ZWN0aW9uCiAgICAgICAgLy8gcmVzcG9uc2Ugb2JzZXJ2ZWQgaW4gZmllbGQgcmVwb3J0cyksIHRoZSBtM3U4IHRyYW5zaXRpb25zIHRvIGEgc3RyZWFtLWVuZCBzaGFwZQogICAgICAgIC8vIOKAlCBgRVhULVgtRU5ETElTVGAgcHJlc2VudCBhbmQgbm8gYCNFWFRJTkY6YCBzZWdtZW50IGxpbmVzLiBMb2cgb25jZSBwZXIgc3RyZWFtCiAgICAgICAgLy8gc2Vzc2lvbiBzbyB1c2VycyAvIGJ1ZyByZXBvcnRlcnMgY2FuIGluY2x1ZGUgdGhlIHRyYW5zaXRpb24gdGltZXN0YW1wIGluIHJlcHJvcy4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkT2ZmbGluZVRyYW5zaXRpb24gJiYgdGV4dFN0ci5pbmNsdWRlcygnI0VYVC1YLUVORExJU1QnKSAmJiAhdGV4dFN0ci5pbmNsdWRlcygnI0VYVElORjonKSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU3RyZWFtIGVuZGVkIC8gb2ZmbGluZSBzaGFwZSBkZXRlY3RlZCDigJQgbTN1OCBoYXMgI0VYVC1YLUVORExJU1Qgd2l0aCBubyBzZWdtZW50cy4gUG9zc2libGUgVHdpdGNoIGRldGVjdGlvbiByZXNwb25zZSwgYnJvYWRjYXN0ZXIgZW5kZWQgc3RyZWFtLCBvciBuYXR1cmFsIGVuZC1vZi1icm9hZGNhc3QnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0NoZWNrZWRVbmtub3duVGFncykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NoZWNrZWRVbmtub3duVGFncyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHVua25vd25BZFRhZ3MgPSB0ZXh0U3RyLm1hdGNoKC8jRVhUW146XG5dKig/OmFkfGN1ZXxzY3RlfHNwb25zb3IpW146XG5dKi9naSk7CiAgICAgICAgICAgIGlmICh1bmtub3duQWRUYWdzKSB7CiAgICAgICAgICAgICAgICBjb25zdCB1bmtub3duID0gdW5rbm93bkFkVGFncy5maWx0ZXIodCA9PiAhQWRTaWduaWZpZXJzLnNvbWUocyA9PiBzICYmIHQuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVbmtub3duIGFkLXJlbGF0ZWQgdGFncyBmb3VuZDogJyArIFsuLi5uZXcgU2V0KHVua25vd24pXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBoYXZlQWRUYWdzID0gaGFzQWRUYWdzKHRleHRTdHIpIHx8IFNpbXVsYXRlZEFkc0RlcHRoID4gMDsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB0byBjaGV3IG9uIHZzIHRoZSAxLTIgY2FjaGVkIGluZGl2aWR1YWwgc2VnbWVudHMuCiAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgc3JjL21vZHVsZXMvcHJvY2Vzc29yLnRzOjczMy03MzYuCiAgICAgICAgaWYgKCFoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzU2hvd2luZ0FkICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoaGF2ZUFkVGFncykgewogICAgICAgICAgICAvLyBCb3VuY2UtdG9sZXJhbnQgcmVzZXQ6IGtlZXAgUGVuZGluZ0FkRW5kQXQgYWxpdmUgYWNyb3NzIHNob3J0IGZsaXBzIGJhY2sgdG8gYWQtbWFya2VkCiAgICAgICAgICAgIC8vIHNvIHRoZSBzbG93LXBhdGggbWF4LXdhaXQgZ2F0ZSBjYW4gc3RpbGwgZmlyZSB3aGVuIGJvdW5jaW5nIG1hcmtlcnMgcHJldmVudAogICAgICAgICAgICAvLyBDbGVhblBsYXlsaXN0Q291bnQgZnJvbSByZWFjaGluZyB0aHJlc2hvbGQuIE1pcnJvcnMgVFRWLUFCIHY2LjYuNyAjMS4KICAgICAgICAgICAgY29uc3QgYWRFbmRTdGFsZW5lc3NNcyA9IDEyMDAwOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCAmJiAoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQpIDwgYWRFbmRTdGFsZW5lc3NNcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50ID0gKHN0cmVhbUluZm8uQWRFbmRCb3VuY2VDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0ID0gMDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQWRFbmRCb3VuY2VDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICBzdHJlYW1JbmZvLklzTWlkcm9sbCA9IHRleHRTdHIuaW5jbHVkZXMoJyJNSURST0xMIicpIHx8IHRleHRTdHIuaW5jbHVkZXMoJyJtaWRyb2xsIicpOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uSXNTaG93aW5nQWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTaG93aW5nQWQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BZEJyZWFrU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aE1hdGNoID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQUQtUE9ELUxFTkdUSD0iKFxkKykiLyk7CiAgICAgICAgICAgICAgICBjb25zdCBwb2RMZW5ndGggPSBwb2RMZW5ndGhNYXRjaCA/IHBhcnNlSW50KHBvZExlbmd0aE1hdGNoWzFdLCAxMCkgOiAxOwogICAgICAgICAgICAgICAgLy8gUmVzZXQgZWFybHktcmVsb2FkIHN0YXRlIGZvciBuZXcgYWQgYnJlYWs7IGFsbG93IHVwIHRvIG9uZSBlYXJseSByZWxvYWQgcGVyIGFkIGluIHBvZAogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Qb2RMZW5ndGggPSBwb2RMZW5ndGg7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF0UG9sbCA9IDA7CiAgICAgICAgICAgICAgICAvLyBUcmFjayBoaWdoLWNvbmZpZGVuY2UgYWQgbWFya2VycyB0byBkaXN0aW5ndWlzaCByZWFsIGFkcyBmcm9tIGZhbHNlLXBvc2l0aXZlIHNpZ25pZmllciBtYXRjaGVzCiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMgPSB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTicpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPSBudWxsOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5GcmVlemVTdGFydGVkQXQgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOy8vIFJlc2V0IHN0aWNreSBDU0FJIGZsYWcgZm9yIG5ldyBicmVhawogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgZGV0ZWN0ZWQg4oCUIHR5cGU6ICcgKyAoc3RyZWFtSW5mby5Jc01pZHJvbGwgPyAnbWlkcm9sbCcgOiAncHJlcm9sbCcpICsgJywgY2hhbm5lbDogJyArIHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUgKyAnLCBwb2Q6ICcgKyBwb2RMZW5ndGggKyAnIGFkKHMpICh+JyArIChwb2RMZW5ndGggKiAzMCkgKyAncyBleHBlY3RlZCksIHNpZ25pZmllcnM6ICcgKyBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpLmpvaW4oJywgJykpOwogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogZmFsc2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNwb29mIGFkLWNvbXBsZXRpb24gZXZlcnkgYWQtbGFkZW4gcG9sbCAobm90IGp1c3QgYnJlYWstc3RhcnQpLiBNdWx0aS1hZAogICAgICAgICAgICAvLyBwb2RzIHN1cmZhY2Ugb25lIGFkIHBlciBwb2xsOyBub3RpZnlBZENvbXBsZXRlIGRlZHVwcyB2aWEgU3Bvb2ZlZEFkSWRzLgogICAgICAgICAgICBpZiAoIURpc2FibGVBZFNwb29maW5nKSB7CiAgICAgICAgICAgICAgICAvLyBEZWZlciBvZmYgdGhlIHBsYXlsaXN0IGNyaXRpY2FsIHBhdGgg4oCUIHN5bmNocm9ub3VzIG1hdGNoQWxsICsgcGFyc2UgKwogICAgICAgICAgICAgICAgLy8gSlNPTi5zdHJpbmdpZnkgaGVyZSBkZWxheXMgdGhlIG1vZGlmaWVkLW0zdTggcmV0dXJuIHRvIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIChhZC1icmVhayBzdHV0dGVyKS4gTmV4dCB0aWNrIGlzIGZpbmU7IHNwb29mIGJlYWNvbnMgYXJlbid0IHRpbWUtY3JpdGljYWwuCiAgICAgICAgICAgICAgICAvLyAoR29zdURSTSBUVFYtQUIgdjguMC4wIGZpZWxkIGZpbmRpbmcgb24gdGhpcyBzYW1lIHNwb29mIGNvZGUuKQogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBub3RpZnlBZENvbXBsZXRlKHRleHRTdHIsIHN0cmVhbUluZm8pLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uSXNNaWRyb2xsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHRleHRTdHIuc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBsaW5lcy5sZW5ndGggPiBpICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMoJyxsaXZlJykgJiYgIXN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmhhcyhsaW5lc1tpICsgMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcXVlc3Qgb25lIC50cyBmaWxlIHBlciAubTN1OCByZXF1ZXN0IHRvIGF2b2lkIG1ha2luZyB0b28gbWFueSByZXF1ZXN0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuYWRkKGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ibG9iKCkpLmNhdGNoKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZXNvbHV0aW9uID0gc3RyZWFtSW5mby5VcmxzW3VybF07CiAgICAgICAgICAgIGlmICghY3VycmVudFJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZHMgd2lsbCBsZWFrIGR1ZSB0byBtaXNzaW5nIHJlc29sdXRpb24gaW5mbyBmb3IgJyArIHVybCk7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpc0hldmMgPSBjdXJyZW50UmVzb2x1dGlvbi5Db2RlY3Muc3RhcnRzV2l0aCgnaGV2JykgfHwgY3VycmVudFJlc29sdXRpb24uQ29kZWNzLnN0YXJ0c1dpdGgoJ2h2YycpOwogICAgICAgICAgICAvLyBQb3N0LWFkIHJlbG9hZC1sb29wIGd1YXJkOiBza2lwIHRoZSBIRVZDIHJlbG9hZCBpZiBhIHBsYXllciByZWxvYWQgYWxyZWFkeQogICAgICAgICAgICAvLyBmaXJlZCB3aXRoaW4gdGhlIGxhc3QgOHMuIEVuZC1vZi1icmVhayBjbGVhcnMgSXNVc2luZ01vZGlmaWVkTTNVODsgd2l0aG91dAogICAgICAgICAgICAvLyB0aGlzIGd1YXJkLCBwb3N0LWFkIGNvbnRpbnVhdGlvbiBtYXJrZXJzIHdvdWxkIHJlLWZpcmUgdGhlIHJlbG9hZC4KICAgICAgICAgICAgY29uc3QgcG9zdEFkUmVlbnRyeUd1YXJkTXMgPSA4MDAwOwogICAgICAgICAgICBjb25zdCByZWNlbnRseVJlbG9hZGVkID0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkICYmIChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkKSA8IHBvc3RBZFJlZW50cnlHdWFyZE1zOwogICAgICAgICAgICBpZiAoKChpc0hldmMgJiYgIVNraXBQbGF5ZXJSZWxvYWRPbkhldmMpIHx8IEFsd2F5c1JlbG9hZFBsYXllck9uQWQpICYmIHN0cmVhbUluZm8uTW9kaWZpZWRNM1U4ICYmICFzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggJiYgIXJlY2VudGx5UmVsb2FkZWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1JlbG9hZFBsYXllcicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN0aWNreSBDU0FJIGZhc3QgcGF0aDogaWYgYSBwcmlvciBwb2xsIGluIFRISVMgYnJlYWsgYWxyZWFkeSBjb25maXJtZWQgdGhlIGJyZWFrCiAgICAgICAgICAgIC8vIGlzIENTQUktb25seSAoYWxsIHNlZ21lbnRzIGxpdmUgb24gcG9sbCAxKSwgc3RheSBvbiB0aGUgZmFzdCBwYXRoIGZvciB0aGUgcmVzdAogICAgICAgICAgICAvLyBvZiB0aGUgYnJlYWsuIHN0cmlwQWRTZWdtZW50cyBzdGlsbCBoYW5kbGVzIGFueSByZWFsIEVYVElORiBhZCBzZWdtZW50cyB0aGF0CiAgICAgICAgICAgIC8vIHNob3cgdXAgb24gbGF0ZXIgcG9sbHMgKHRoZXkgZ2V0IGNhY2hlZCBhbmQgdGhlIGZldGNoIGhvb2sgcmV0dXJucyBCTEFOS19NUDQpLAogICAgICAgICAgICAvLyBzbyBhZHMgYXJlIGJsb2NrZWQgZXZlbiB3aXRob3V0IHRoZSBiYWNrdXAgc3dpdGNoLiBTa2lwcGluZyBiYWNrdXAgc2VhcmNoIGZvcgogICAgICAgICAgICAvLyB0aGUgd2hvbGUgQ1NBSSBicmVhayBzYXZlcyB+MjAgd2FzdGVkIGZldGNoZXMgcGVyIGJyZWFrIOKAlCB0aGUgYmFja3VwIHdvdWxkbid0CiAgICAgICAgICAgIC8vIGhlbHAgYW55d2F5IHNpbmNlIGV2ZXJ5IHBsYXllciB0eXBlIGhhcyB0aGUgc2FtZSBDU0FJIGFkcy4gRmxhZyBpcyBjbGVhcmVkCiAgICAgICAgICAgIC8vIG9ubHkgYXQgYnJlYWsgZW5kIChJc1Nob3dpbmdBZD1mYWxzZSBwYXRoKS4KICAgICAgICAgICAgLy8gU3RpY2t5IENTQUkgZXNjYXBlIGhhdGNoIChQcmVmZXJMb3dRdWFsaXR5QmFja3VwKTogYWZ0ZXIgfjhzIHN0dWNrLCBmYWxsIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaC4KICAgICAgICAgICAgaWYgKFByZWZlckxvd1F1YWxpdHlCYWNrdXAgJiYgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayAmJiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgPj0gNCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3R1Y2tQb2xscyA9IHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOwogICAgICAgICAgICAgICAgY29uc3QgcmVjb3ZlcnlDYWNoZVNpemUgPSBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgY29uc3QgZWFybHlSZWxvYWRJbmZvID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArICcvJyArIE1hdGgubWF4KDEsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU3RpY2t5IENTQUkgZXNjYXBlIGhhdGNoIOKAlCBzdHVjayAnICsgc3R1Y2tQb2xscyArICcgcG9sbHMgKH4nICsgKHN0dWNrUG9sbHMgKiAyKSArICdzKSwgRWFybHlSZWxvYWRDb3VudD0nICsgZWFybHlSZWxvYWRJbmZvICsgJywgcmVjb3ZlcnkgY2FjaGU9JyArIHJlY292ZXJ5Q2FjaGVTaXplICsgJyBzZWdtZW50cywgZmFsbGluZyB0aHJvdWdoIHRvIGJhY2t1cCBzZWFyY2gnKTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ3NhaU9ubHlUaGlzQnJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ3NhaU9ubHlUaGlzQnJlYWsgJiYgIXN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCkgewogICAgICAgICAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4dFN0ciA9IHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBmYWxzZSwgc3RyZWFtSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemUg4oCUIG1pcnJvcnMgdGhlIGNoZWNrIGluIHRoZSBub3JtYWwKICAgICAgICAgICAgICAgIC8vIGJhY2t1cC1zZWFyY2ggcGF0aCB3aGljaCB3ZSdkIG90aGVyd2lzZSBza2lwIGVudGlyZWx5IGJ5IHJldHVybmluZyBlYXJseQogICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgc3RpY2t5IHBhdGguIFdpdGhvdXQgdGhpcywgaGVhdnkgU1NBSSBicmVha3Mgb24gQ1NBSS1jb25maXJtZWQKICAgICAgICAgICAgICAgIC8vIHN0cmVhbXMgbGVhdmUgdGhlIHBsYXllciByZXBsYXlpbmcgdGhlIHRoaW4gcmVjb3ZlcnkgY2FjaGUgZm9yIHRoZSBmdWxsCiAgICAgICAgICAgICAgICAvLyBicmVhayBkdXJhdGlvbiAob2JzZXJ2ZWQ6IDM1LjlzIGZyZWV6ZSBvbiBwb2QtMSBicmVhaywgMyBhbGwtc3RyaXBwZWQKICAgICAgICAgICAgICAgIC8vIHBvbGxzLCAxLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUpLgogICAgICAgICAgICAgICAgLy8gQm91bmRlZCB0byBtYXhFYXJseVJlbG9hZHMgcGVyIGFkIGluIHBvZCBzbyByZWxvYWQgbG9vcHMgYXJlIGltcG9zc2libGUuCiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdCAoc3RpY2t5IHBhdGgpOiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreVJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgICAgICBjb25zdCBzdGlja3lNYXhFYXJseVJlbG9hZHMgPSBzdGlja3lSZWNvdmVyeVRoaW4gPyBNYXRoLm1heCgyLCBzdHJlYW1JbmZvLlBvZExlbmd0aCB8fCAxKSA6IE1hdGgubWF4KDEsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpOwogICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5RWZmZWN0aXZlVGhyZXNob2xkID0gc3RpY2t5UmVjb3ZlcnlUaGluID8gMSA6IEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZDsKICAgICAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBzdGlja3lFZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IHN0aWNreU1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBd2FpdGluZ1Jlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF0UG9sbCA9IHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzIHx8IHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreVJlYXNvbiA9IHN0aWNreVJlY292ZXJ5VGhpbiA/ICcgKHRoaW4gcmVjb3ZlcnkgY2FjaGU6ICcgKyAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzPy5sZW5ndGggfHwgMCkgKyAnIHNlZ21lbnRzKScgOiAnJzsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIChzdGlja3kgcGF0aCkg4oCUICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyArICcgY29uc2VjdXRpdmUgYWxsLXN0cmlwcGVkIHBvbGxzJyArIHN0aWNreVJlYXNvbiArICcgWycgKyBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgKyAnLycgKyBzdGlja3lNYXhFYXJseVJlbG9hZHMgKyAnXScpOwogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICAgICAgICAgIGhhc0Fkczogc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCwKICAgICAgICAgICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDU0FJIGZhc3QgcGF0aDogaWYgYWxsIHNlZ21lbnRzIGluIHRoZSBtYWluIHN0cmVhbSBhcmUgbGl2ZSwgc2tpcCBiYWNrdXAgc2VhcmNoLgogICAgICAgICAgICAvLyBDU0FJIGFkcyBhcmUgZGVsaXZlcmVkIG91dHNpZGUgdGhlIG0zdTgg4oCUIHRoZSBtYWluIHN0cmVhbSBzZWdtZW50cyBhcmUgY2xlYW4uCiAgICAgICAgICAgIC8vIEp1c3Qgc3RyaXAgdHJhY2tpbmcgVVJMcyBhbmQgcmV0dXJuIHRoZSBtYWluIHN0cmVhbSBkaXJlY3RseSwgYXZvaWRpbmcgdGhlCiAgICAgICAgICAgIC8vIGJhY2t1cCBzdHJlYW0gc3dpdGNoIHRoYXQgY2F1c2VzIGEgMjAtNDBzIHJlYnVmZmVyIGdhcC4KICAgICAgICAgICAgY29uc3QgbWFpblN0cmVhbUxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgbGV0IGhhc05vbkxpdmVTZWdtZW50ID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFpblN0cmVhbUxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobWFpblN0cmVhbUxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAhbWFpblN0cmVhbUxpbmVzW2ldLmluY2x1ZGVzKCcsbGl2ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzTm9uTGl2ZVNlZ21lbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEJhY2t1cFN3YXBGaXJzdCAob3B0LWluKTogc2tpcCBzdGlja3kgQ1NBSSBwYXRoIGVudGlyZWx5LCBhbHdheXMgZmFsbCB0aHJvdWdoIHRvCiAgICAgICAgICAgIC8vIGJhY2t1cCBzZWFyY2ggb24gYWQgZGV0ZWN0LiBNaW1pY3MgVFRWLUFCJ3MgYmFja3VwLXN3YXAtZmlyc3QgZmxvdyDigJQgYXZvaWRzCiAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIG1peGluZyBmcm9tIHN0cmlwIGFjdGl2aXR5IChubyBCTEFOS19NUDQgaW5qZWN0aW9uLCBubyByZWNvdmVyeQogICAgICAgICAgICAvLyBzZWdtZW50IHJlcGxheSksIHdoaWNoIHVzZXJzIHJlcG9ydCBwcm9kdWNlcyBmZXdlciBsb2FkaW5nIGNpcmNsZXMuIENvc3Q6IGV4dHJhCiAgICAgICAgICAgIC8vIGZldGNoZXMgb24gZXZlcnkgYWQgYnJlYWsgKHRva2VuIHJlcXVlc3RzIGZvciBlYWNoIGJhY2t1cCB0eXBlIHRyaWVkKS4KICAgICAgICAgICAgaWYgKCFoYXNOb25MaXZlU2VnbWVudCAmJiAhc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ICYmICFCYWNrdXBTd2FwRmlyc3QpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ3NhaU9ubHlUaGlzQnJlYWsgPSB0cnVlOy8vIE1hcmsgYnJlYWsgYXMgY29uZmlybWVkIENTQUkgc28gc3Vic2VxdWVudCBwb2xscyBzdGF5IG9uIHRoZSBmYXN0IHBhdGgKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgZmFzdCBwYXRoIOKAlCBhbGwgc2VnbWVudHMgbGl2ZSwgc2tpcHBpbmcgYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4dFN0ciA9IHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBmYWxzZSwgc3RyZWFtSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnVXBkYXRlQWRCbG9ja0Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cywKICAgICAgICAgICAgICAgICAgICBudW1TdHJpcHBlZEFkU2VnbWVudHM6IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IG51bGwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgYmFja3VwU2VhcmNoU3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBsZXQgYmFja3VwQ29sZFRva2VuRmV0Y2hlcyA9IDA7Ly8gZGlhZzogY29sZC1jYWNoZSB0b2tlbiByb3VuZC10cmlwcyB0aGlzIGJhY2t1cCBzZWFyY2ggKDAgPSB3YXJtIOKAlCBlbmNvZGluZ3MgY2FjaGUgaGl0KQogICAgICAgICAgICBsZXQgYmFja3VwUGxheWVyVHlwZSA9IG51bGw7CiAgICAgICAgICAgIGxldCBiYWNrdXBNM3U4ID0gbnVsbDsKICAgICAgICAgICAgbGV0IGZhbGxiYWNrTTN1OCA9IG51bGw7CiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDsKICAgICAgICAgICAgbGV0IGlzRG9pbmdNaW5pbWFsUmVxdWVzdHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA+IERhdGUubm93KCkgLSBQbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNUaW1lKSB7CiAgICAgICAgICAgICAgICAvLyBXaGVuIGRvaW5nIHBsYXllciByZWxvYWQgdGhlcmUgYXJlIGEgbG90IG9mIHJlcXVlc3RzIHdoaWNoIGNhdXNlcyB0aGUgYmFja3VwIHN0cmVhbSB0byBsb2FkIGluIHNsb3cuIEJyaWVmbHkgcHJlZmVyIHVzaW5nIGEgc2luZ2xlIHZlcnNpb24gdG8gcHJldmVudCBsb25nIGRlbGF5cwogICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IFBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1BsYXllckluZGV4OwogICAgICAgICAgICAgICAgaXNEb2luZ01pbmltYWxSZXF1ZXN0cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVHJ5IHBpbm5lZCBiYWNrdXAgcGxheWVyIHR5cGUgZmlyc3QgaWYgYXZhaWxhYmxlCiAgICAgICAgICAgIGNvbnN0IHBsYXllclR5cGVzVG9UcnkgPSBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID8gWy4uLkJhY2t1cFBsYXllclR5cGVzLCAnYXV0b3BsYXknXSA6IFsuLi5CYWNrdXBQbGF5ZXJUeXBlc107CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gcGxheWVyVHlwZXNUb1RyeS5pbmRleE9mKHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICBpZiAocGlubmVkSW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS5zcGxpY2UocGlubmVkSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgIHBsYXllclR5cGVzVG9UcnkudW5zaGlmdChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZhc3RBdXRvcGxheUZpcnN0VHJ5OiBwcmVwZW5kIGF1dG9wbGF5IHdoZW4gcHJpb3IgYnJlYWsgZXhoYXVzdGVkIFNvdXJjZS10aWVyCiAgICAgICAgICAgIC8vIChTU0FJLXVuaWZvcm0gc2lnbmFsKS4gU2F2ZXMgfjEuNXMgb2YgcHJvYmUgYnVmZmVyaW5nLiBQZXJpb2RpYyByZS1wcm9iZSBldmVyeQogICAgICAgICAgICAvLyBOdGggY29uc2VjdXRpdmUgZmFzdC1hdXRvcGxheSB3aW4gY2F0Y2hlcyBjaGFubmVsIHJlY292ZXJ5IChUd2l0Y2ggcmV2ZXJzaW5nCiAgICAgICAgICAgIC8vIHVuaXZlcnNhbCBDU0FJIGRlbGl2ZXJ5KSDigJQgd2l0aG91dCBpdCwgY2hhbm5lbCBzdGF5cyBvbiAzNjBwIGZvciB0aGUgc2Vzc2lvbi4KICAgICAgICAgICAgaWYgKEZhc3RBdXRvcGxheUZpcnN0VHJ5ICYmIHN0cmVhbUluZm8uTGFzdEJyZWFrVXNlZEVzY2FwZUhhdGNoICYmIFByZWZlckxvd1F1YWxpdHlCYWNrdXApIHsKICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RBdXRvcGxheVJlcHJvYmVJbnRlcnZhbCA9IDU7CiAgICAgICAgICAgICAgICBjb25zdCBjb25zZWN1dGl2ZSA9IHN0cmVhbUluZm8uRmFzdEF1dG9wbGF5Q29uc2VjdXRpdmUgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjb25zZWN1dGl2ZSA+PSBGYXN0QXV0b3BsYXlSZXByb2JlSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhc3RBdXRvcGxheUNvbnNlY3V0aXZlID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkRmFzdEF1dG9wbGF5UmVwcm9iZVRoaXNCcmVhaykgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEZhc3RBdXRvcGxheVJlcHJvYmVUaGlzQnJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYXN0LWF1dG9wbGF5IHJlLXByb2JlIOKAlCB0ZXN0aW5nIFNvdXJjZS10aWVyIGFmdGVyICcgKyBjb25zZWN1dGl2ZSArICcgY29uc2VjdXRpdmUgZmFzdC1hdXRvcGxheSBicmVha3MgKGNoYW5uZWwtcmVjb3ZlcnkgY2hlY2spJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvcGxheUlkeCA9IHBsYXllclR5cGVzVG9UcnkuaW5kZXhPZignYXV0b3BsYXknKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b3BsYXlJZHggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllclR5cGVzVG9Ucnkuc3BsaWNlKGF1dG9wbGF5SWR4LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS51bnNoaWZ0KCdhdXRvcGxheScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkRmFzdEF1dG9wbGF5VGhpc0JyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEZhc3RBdXRvcGxheVRoaXNCcmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYXN0LWF1dG9wbGF5IGZpcnN0LXRyeSDigJQgcHJpb3IgYnJlYWsgZXhoYXVzdGVkIFNvdXJjZS10aWVyOyBwcm9iaW5nIGF1dG9wbGF5IGZpcnN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVhbC10aW1lIGNvbnRhbWluYXRpb24gcmVvcmRlcjogb24gcG9sbCAyKyBvZiBhIGJyZWFrLCBtb3ZlIHR5cGVzIHRoYXQgd2VyZQogICAgICAgICAgICAvLyBhbHJlYWR5IGxvZ2dlZCBhcyBhZC1sYWRlbiBlYXJsaWVyIGluIHRoZSBzYW1lIGJyZWFrIHRvIHRoZSBlbmQgb2YgaXRlcmF0aW9uLgogICAgICAgICAgICAvLyBMZXRzIHVudHJpZWQvY2xlYW4gdHlwZXMgKHR5cGljYWxseSBhdXRvcGxheSBvbiBTU0FJLWhlYXZ5IGNoYW5uZWxzIGxpa2Ugd2FybikKICAgICAgICAgICAgLy8gZ2V0IHRyaWVkIGZpcnN0IGluc3RlYWQgb2YgcmUtY2hlY2tpbmcgdHlwZXMgd2UgYWxyZWFkeSBrbm93IGFyZSBjb250YW1pbmF0ZWQuCiAgICAgICAgICAgIC8vIExvZ2dlZEJhY2t1cEFkc0J5VHlwZSBpcyBwb3B1bGF0ZWQgYmVsb3cgYXQgdGhlICJhbHNvIGhhcyBhZHMiIGxvZyBzaXRlIGFuZAogICAgICAgICAgICAvLyBjbGVhcmVkIGF0IGVuZC1vZi1icmVhaywgc28gdGhpcyBpcyBwZXItYnJlYWsgYWRhcHRpdmUuCiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZSAmJiBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5zaXplID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgY2xlYW4gPSBbXTsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhbSA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHBsYXllclR5cGVzVG9UcnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuaGFzKHQpKSBjb250YW0ucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGNsZWFuLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY29udGFtLmxlbmd0aCA+IDAgJiYgY2xlYW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllclR5cGVzVG9UcnkubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlc1RvVHJ5LnB1c2goLi4uY2xlYW4sIC4uLmNvbnRhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZENvbnRhbVJlb3JkZXJUaGlzQnJlYWspIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRDb250YW1SZW9yZGVyVGhpc0JyZWFrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ29udGFtaW5hdGlvbi1hd2FyZSByZW9yZGVyIOKAlCB0cnlpbmcgWycgKyBjbGVhbi5qb2luKCcsICcpICsgJ10gYmVmb3JlIGtub3duLWNvbnRhbWluYXRlZCBbJyArIGNvbnRhbS5qb2luKCcsICcpICsgJ10nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgcGxheWVyVHlwZUluZGV4ID0gc3RhcnRJbmRleDsgIWJhY2t1cE0zdTggJiYgcGxheWVyVHlwZUluZGV4IDwgcGxheWVyVHlwZXNUb1RyeS5sZW5ndGg7IHBsYXllclR5cGVJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJUeXBlID0gcGxheWVyVHlwZXNUb1RyeVtwbGF5ZXJUeXBlSW5kZXhdOwogICAgICAgICAgICAgICAgY29uc3QgcmVhbFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlLnJlcGxhY2UoJy1DQUNIRUQnLCAnJyk7CiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRBdCA9IHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuZ2V0KHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIC8vIDVzICh3YXMgMTVzKTogaW4gdGhlIENTQUktZmxpcCB3b3JsZCBhIGNvbnRhbWluYXRlZCBiYWNrdXAgdHlwZSBjYW4KICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgd2l0aGluIHNlY29uZHM7IHRoZSAxNXMgbG9ja291dCBrZXB0IHVzIG9mZiBhIG5vdy1jbGVhbiB0eXBlIGZhcgogICAgICAgICAgICAgICAgLy8gdG9vIGxvbmcgKFRUVi1BQi9Hb3N1RFJNIHY4LjAuMCAicmVkdWNlZCBhZC1pbmR1Y2VkIHN0YWxsaW5nIikuIFRyYWRlb2ZmOgogICAgICAgICAgICAgICAgLy8gfjN4IG1vcmUgcmV0cnkgZmV0Y2hlcyDigJQgd2F0Y2hlZCB2aWEgdGhlIGNvbGQvd2FybSB0b2tlbi1mZXRjaCBsb2cgKCMyMjgpLgogICAgICAgICAgICAgICAgaWYgKGZhaWxlZEF0ICYmIChEYXRlLm5vdygpIC0gZmFpbGVkQXQpIDwgNTAwMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaXNGdWxseUNhY2hlZFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlICE9IHJlYWxQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNhY2hlcyB0aGUgbTN1OCBpZiBpdCBkb2Vzbid0IGhhdmUgYWRzLiBJZiB0aGUgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBoYXMgYWRzIGl0IGZldGNoZXMgYSBuZXcgdmVyc2lvbiAoc2Vjb25kIGxvb3ApCiAgICAgICAgICAgICAgICAgICAgbGV0IGlzRnJlc2hNM3U4ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgbGV0IGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVuY29kaW5nc00zdTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNGcmVzaE0zdTggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBDb2xkVG9rZW5GZXRjaGVzKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcmVhbFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IChmbGF0dGVyLCBvYnNlcnZlZCBmb3IgJ2VtYmVkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNwYXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5GYWlsZWRCYWNrdXBQbGF5ZXJUeXBlcy5zZXQocmVhbFBsYXllclR5cGUsIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyA+PSAzICYmICFzdHJlYW1JbmZvLkxvZ2dlZFRva2VuRmFpbHVyZVN0cmVhaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVG9rZW4gZmV0Y2ggZmFpbGVkICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzICsgJyB0aW1lcyBjb25zZWN1dGl2ZWx5IGFjcm9zcyBwbGF5ZXIgdHlwZXMg4oCUIHBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gLyBpbnRlZ3JpdHkgcm90YXRpb24gLyByYXRlIGxpbWl0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCBzcGF0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXSA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGRldGVjdGlvbiBkaWFnbm9zdGljIGNvdW50ZXIgb24gc3VjY2VzcyDigJQgdG9rZW4gZmV0Y2hlZCwgbTN1OCBmZXRjaGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVc2hlciBIVFRQICcgKyBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvckJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBlcnJvckJvZHkgPSAnIOKAlCAnICsgKGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UudGV4dCgpKS5zdWJzdHJpbmcoMCwgMjAwKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFjY2VzcyB0b2tlbiBIVFRQICcgKyBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyByZWFsUGxheWVyVHlwZSArIChhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzID8gJyAoaW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICdwcmVzZW50JyA6ICdtaXNzaW5nJykgKyAnKScgOiAnJykgKyBlcnJvckJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuc2V0KHJlYWxQbGF5ZXJUeXBlLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID49IDMgJiYgIXN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVG9rZW4gZmV0Y2ggZmFpbGVkICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzICsgJyB0aW1lcyBjb25zZWN1dGl2ZWx5IGFjcm9zcyBwbGF5ZXIgdHlwZXMg4oCUIHBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gLyBpbnRlZ3JpdHkgcm90YXRpb24gLyByYXRlIGxpbWl0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFjY2VzcyB0b2tlbiBmYWlsZWQgZm9yICcgKyByZWFsUGxheWVyVHlwZSArICc6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLnNldChyZWFsUGxheWVyVHlwZSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgPj0gMyAmJiAhc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZFRva2VuRmFpbHVyZVN0cmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVG9rZW4gZmV0Y2ggZmFpbGVkICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzICsgJyB0aW1lcyBjb25zZWN1dGl2ZWx5IGFjcm9zcyBwbGF5ZXIgdHlwZXMg4oCUIHBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gLyBpbnRlZ3JpdHkgcm90YXRpb24gLyByYXRlIGxpbWl0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKGVuY29kaW5nc00zdTgsIGN1cnJlbnRSZXNvbHV0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThUZXh0ID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobTN1OFRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllclR5cGUgPT0gRmFsbGJhY2tQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFja00zdTggPSBtM3U4VGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFoYXNBZFRhZ3MobTN1OFRleHQpICYmIChTaW11bGF0ZWRBZHNEZXB0aCA9PSAwIHx8IHBsYXllclR5cGVJbmRleCA+PSBTaW11bGF0ZWRBZHNEZXB0aCAtIDEpKSB8fCAoIWZhbGxiYWNrTTN1OCAmJiBwbGF5ZXJUeXBlSW5kZXggPj0gcGxheWVyVHlwZXNUb1RyeS5sZW5ndGggLSAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSAxICYmICFoYXNBZFRhZ3MobTN1OFRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldlR5cGUgPSBzdHJlYW1JbmZvLkxhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2VHlwZSAmJiBwcmV2VHlwZSAhPT0gcGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDeWNsZSBzd2l0Y2hlZCB0byBkaWZmZXJlbnQgY2xlYW4gdHlwZSAoJyArIHBsYXllclR5cGUgKyAnLCB3YXMgJyArIHByZXZUeXBlICsgJykgZHVyaW5nIGZyZWV6ZSDigJQgcmVjb3ZlcmVkIHdpdGhvdXQgcmVsb2FkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbWFyayBhcyBjeWNsZS1yZXNjdWVkIHdoZW4gd2UgQUNUVUFMTFkgc3dpdGNoZWQgcGxheWVyIHR5cGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXR1cmFsIHJlY292ZXJ5IChzYW1lIHR5cGUgYmVjYW1lIGNsZWFuKSBzdGlsbCBuZWVkcyB0aGUgZW5kLW9mLWJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbG9hZCB0byByZWZyZXNoIHRoZSBwbGF5ZXIgYnVmZmVyIOKAlCBza2lwcGluZyBpdCBsZWF2ZXMgdGhlIHBsYXllcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHVjayB3aXRoIGxvdyBidWZmZXIgYW5kIHRoZSBidWZmZXIgbW9uaXRvciB1bmFibGUgdG8gcmVjb3Zlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNhbWUgYmFja3VwIHR5cGUgKCcgKyBwbGF5ZXJUeXBlICsgJykgYmVjYW1lIGNsZWFuIGR1cmluZyBmcmVlemUg4oCUIG5hdHVyYWwgcmVjb3ZlcnknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBQbGF5ZXJUeXBlID0gcGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cE0zdTggPSBtM3U4VGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3MobTN1OFRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlKSBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZSA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuaGFzKHBsYXllclR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuYWRkKHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gKCcgKyBwbGF5ZXJUeXBlICsgJykgYWxzbyBoYXMgYWRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbHlDYWNoZWRQbGF5ZXJUeXBlIHx8IGlzRG9pbmdNaW5pbWFsUmVxdWVzdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3ljbGUgdGhyb3VnaCBhbGwgcGxheWVyIHR5cGVzIGxvb2tpbmcgZm9yIGEgY2xlYW4gYmFja3VwLiBPbmx5IGNvbW1pdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBhZC1sYWRlbiBiYWNrdXAgYXMgYSBsYXN0IHJlc29ydCB3aGVuIHdlJ3ZlIGV4aGF1c3RlZCBhbGwgb3B0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFIgIzg5IHByZXZpb3VzbHkgY29tbWl0dGVkIHRoZSBmaXJzdCBhZC1sYWRlbiB0eXBlIGltbWVkaWF0ZWx5IOKAlCB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlZCB0aGUgdjU4IGZyZWV6ZSByZWdyZXNzaW9uIChpc3N1ZSAjMTEyKSBiZWNhdXNlIHRoZSBzdHJpcCtyZWNvdmVyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHdvdWxkIGVuZ2FnZSBldmVuIHdoZW4gYSBjbGVhbiBhbHRlcm5hdGUgd2FzIGF2YWlsYWJsZSBvbiBhbm90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYXllciB0eXBlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQWRUYWdzKG0zdThUZXh0KSAmJiBwbGF5ZXJUeXBlSW5kZXggPj0gcGxheWVyVHlwZXNUb1RyeS5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgYmFja3VwIHBsYXllciB0eXBlcyBhZC1sYWRlbiDigJQgdGFraW5nICcgKyBwbGF5ZXJUeXBlICsgJyBhcyBsYXN0LXJlc29ydCBmYWxsYmFjayAoc3RyaXArcmVjb3ZlcnkgcGF0aCB3aWxsIGVuZ2FnZSknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gZmV0Y2ggZmFpbGVkIGZvciAnICsgcGxheWVyVHlwZSArICcgKHN0YXR1cyAnICsgc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyArICcpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSBlcnJvciBmb3IgJyArIHBsYXllclR5cGUgKyAnOiAnICsgZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNGcmVzaE0zdTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYmFja3VwTTN1OCAmJiBmYWxsYmFja00zdTgpIHsKICAgICAgICAgICAgICAgIC8vIERvbid0IGZhbGwgYmFjayB0byBhIHR5cGUgd2UndmUgYWxyZWFkeSBtYXJrZWQgY29udGFtaW5hdGVkIHRoaXMgYnJlYWsuCiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgZ3VhcmQsIHdoZW4gYWxsIFNvdXJjZSB0eXBlcyBnbyBhZC1sYWRlbiBtaWQtYnJlYWsgdGhlIGl0ZXJhdGlvbgogICAgICAgICAgICAgICAgLy8gZW5kcyB3aXRoIG5vIGNsZWFuIGNvbW1pdCBBTkQgZmFsbGJhY2tNM3U4IHN0aWxsIHBvaW50aW5nIGF0IEZhbGxiYWNrUGxheWVyVHlwZSdzCiAgICAgICAgICAgICAgICAvLyBhZC1sYWRlbiBtM3U4IOKAlCB3ZSdkIHNpbGVudGx5IHJlLWNvbW1pdCB0aGUgc2FtZSBjb250YW1pbmF0ZWQgc2l0ZSBvbiBldmVyeSBwb2xsCiAgICAgICAgICAgICAgICAvLyAobm8gIkJsb2NraW5nIGFkcyIgbG9nIGJlY2F1c2UgQWN0aXZlQmFja3VwUGxheWVyVHlwZSB1bmNoYW5nZWQpLCBhbmQgdGhlIHVzZXIKICAgICAgICAgICAgICAgIC8vIHNlZXMgdGhlIGZ1bGwgYWQgcG9kIHdpdGggbm8gaW5kaWNhdGlvbiBvZiBmYWlsdXJlLiBCZXR0ZXIgdG8gbGVhdmUgYmFja3VwTTN1OAogICAgICAgICAgICAgICAgLy8gbnVsbCBhbmQgbGV0IHRoZSAiTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIiBsb2cgZmlyZSBzbyBpdCdzIHZpc2libGUuCiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUgJiYgc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuaGFzKEZhbGxiYWNrUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyBmYWxsYmFjayB0byAnICsgRmFsbGJhY2tQbGF5ZXJUeXBlICsgJyDigJQgbWFya2VkIGNvbnRhbWluYXRlZCB0aGlzIGJyZWFrICgnICsgWy4uLnN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlXS5qb2luKCcsICcpICsgJyBhbGwgYWQtbGFkZW4pJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBGYWxsYmFja1BsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IGZhbGxiYWNrTTN1ODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTdGFsZS1jb21taXQgZ3VhcmQ6IG11bHRpcGxlIHByb2Nlc3NNM1U4IGNhbGxzIGNhbiBiZSBpbiBmbGlnaHQgY29uY3VycmVudGx5IGZvcgogICAgICAgICAgICAvLyB0aGUgc2FtZSBzdHJlYW1JbmZvIChvbmUgcGVyIG0zdTggcG9sbCkuIElmIHRoaXMgYmFja3VwIHNlYXJjaCBzdGFydGVkIGR1cmluZyB0aGUKICAgICAgICAgICAgLy8gYWQgYnJlYWsgYnV0IGNvbXBsZXRlZCBBRlRFUiBhIGxhdGVyIHBvbGwgYWxyZWFkeSByYW4gdGhlIGVuZC1vZi1icmVhayByZXNldAogICAgICAgICAgICAvLyAoSXNTaG93aW5nQWQgPSBmYWxzZSwgQWN0aXZlQmFja3VwUGxheWVyVHlwZSA9IG51bGwpLCBjb21taXR0aW5nIHRoZSBiYWNrdXAgaGVyZQogICAgICAgICAgICAvLyB3b3VsZCBvdmVyd3JpdGUgdGhlIGNsZWFyZWQgc3RhdGUgYW5kIGZlZWQgc3RhbGUgcGxheWxpc3QgZGF0YSB0byB0aGUgcGxheWVyLAogICAgICAgICAgICAvLyBjYXVzaW5nIGJ1ZmZlciByZWNvbmNpbGlhdGlvbiBmYWlsdXJlcyBhbmQgYSBmb3JjZWQgcmVsb2FkLiBDaGVjayBJc1Nob3dpbmdBZAogICAgICAgICAgICAvLyBoZXJlIHRvIGRpc2NhcmQgc3RhbGUgcmVzdWx0cy4KICAgICAgICAgICAgaWYgKGJhY2t1cE0zdTggJiYgc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGJhY2t1cE0zdTg7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUgIT0gYmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQWN0aXZlQmFja3VwUGxheWVyVHlwZSA9IGJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlUXVhbGl0eVR5cGVzID0gWydlbWJlZCcsICdzaXRlJywgJ3BvcG91dCddOwogICAgICAgICAgICAgICAgICAgIC8vIE5ldmVyIHBpbiAnYXV0b3BsYXknIOKAlCBtdXN0IHN0YXkgYXQgdGhlIGxhc3QgcG9zaXRpb24gaW4gcGxheWVyVHlwZXNUb1RyeQogICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBpdGVyYXRpb24tZW5kIGxhc3QtcmVzb3J0IGJyYW5jaCBjb21taXRzIGl0IHdoZW4gYWxsIFNvdXJjZSB0eXBlcwogICAgICAgICAgICAgICAgICAgIC8vIGFyZSBhZC1sYWRlbiAoaW50ZW5kZWQgMzYwcCBjbGVhbiBmYWxsYmFjaykuIFBpbm5pbmcgd291bGQgbW92ZSBpdCB0bwogICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIDAgYW5kIGEgZGlmZmVyZW50IGFkLWxhZGVuIFNvdXJjZSB0eXBlIHdvdWxkIGJlIGNvbW1pdHRlZCBpbnN0ZWFkLgogICAgICAgICAgICAgICAgICAgIGlmICgoUGluQmFja3VwUGxheWVyVHlwZSAmJiBiYWNrdXBQbGF5ZXJUeXBlICE9PSAnYXV0b3BsYXknKSB8fCBzb3VyY2VRdWFsaXR5VHlwZXMuaW5jbHVkZXMoYmFja3VwUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtBRCBERUJVR10gQmxvY2tpbmckeyhzdHJlYW1JbmZvLklzTWlkcm9sbCA/ICcgbWlkcm9sbCAnIDogJyAnKX1hZHMgKCR7YmFja3VwUGxheWVyVHlwZX0pIOKAlCBiYWNrdXAgZm91bmQgaW4gJHtEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnR9bXMke2JhY2t1cENvbGRUb2tlbkZldGNoZXMgPiAwID8gYCAoY29sZCBjYWNoZTogJHtiYWNrdXBDb2xkVG9rZW5GZXRjaGVzfSB0b2tlbiBmZXRjaCR7YmFja3VwQ29sZFRva2VuRmV0Y2hlcyA+IDEgPyAnZXMnIDogJyd9KWAgOiAnICh3YXJtIGNhY2hlKSd9YCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5VGllciA9IGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgPyAnMzYwcCcgOiAnU291cmNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1lc2NhcGUgYmFja3VwOiAnICsgYmFja3VwUGxheWVyVHlwZSArICcgKCcgKyBxdWFsaXR5VGllciArICcpIOKAlCByZWNvdmVyZWQgZnJvbSBzdGlja3ktcGF0aCBmcmVlemUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgJiYgUHJlZmVyTG93UXVhbGl0eUJhY2t1cCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VUcmllZCA9IHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlPy5zaXplIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUcmllZCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQXV0b3BsYXkgYmFja3VwIGNvbW1pdHRlZCDigJQgMzYwcCBwaW5uZWQgZnJvbSBwcmlvciBicmVhayAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhc3QtYXV0b3BsYXkgd29uIHdpdGhvdXQgdGVzdGluZyBTb3VyY2UtdGllciDigJQgaW5jcmVtZW50IHJlLXByb2JlIGNvdW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFzdEF1dG9wbGF5Q29uc2VjdXRpdmUgPSAoc3RyZWFtSW5mby5GYXN0QXV0b3BsYXlDb25zZWN1dGl2ZSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvcGxheSBiYWNrdXAgY29tbWl0dGVkIOKAlCAzNjBwIGZhbGxiYWNrIGFmdGVyICcgKyBzb3VyY2VUcmllZCArICcgU291cmNlIHR5cGUocykgYWQtbGFkZW4gKFByZWZlckxvd1F1YWxpdHlCYWNrdXApJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFzdEF1dG9wbGF5Rmlyc3RUcnkgc2lnbmFsOiBvbmx5IGZsYWcgU1NBSS11bmlmb3JtIHdoZW4gNCBTb3VyY2UgdHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VyZSBwcm9iZWQgYW5kIGFsbCBjb250YW1pbmF0ZWQuIFBpbm5lZC1mcm9tLXByaW9yLWJyZWFrIChzb3VyY2VUcmllZD09MCkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBhZGQgbmV3IGluZm8uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGYXN0QXV0b3BsYXlGaXJzdFRyeSAmJiBzb3VyY2VUcmllZCA+PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RCcmVha1VzZWRFc2NhcGVIYXRjaCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdWxsIHByb2JlIGp1c3QgcmFuIOKAlCByZXNldCByZS1wcm9iZSBjb3VudGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhc3RBdXRvcGxheUNvbnNlY3V0aXZlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRmFzdEF1dG9wbGF5Rmlyc3RUcnkgJiYgYmFja3VwUGxheWVyVHlwZSAhPT0gJ2F1dG9wbGF5JykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBTb3VyY2UtdGllciB3b24g4oCUIGNoYW5uZWwgcmVjb3ZlcmVkLCByZXNldCBzaWduYWwgKyByZS1wcm9iZSBjb3VudGVyLgogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RCcmVha1VzZWRFc2NhcGVIYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhc3RBdXRvcGxheUNvbnNlY3V0aXZlID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFja3VwTTN1OCAmJiAhc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRGlzY2FyZGVkIHN0YWxlIGJhY2t1cCBjb21taXQgKCcgKyBiYWNrdXBQbGF5ZXJUeXBlICsgJywgJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zKSDigJQgYnJlYWsgZW5kZWQgZHVyaW5nIHNlYXJjaCcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIOKAlCBhZHMgbWF5IGxlYWsuIFRyaWVkOiAnICsgcGxheWVyVHlwZXNUb1RyeS5zbGljZShzdGFydEluZGV4KS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPOiBJbXByb3ZlIGhldmMgc3RyaXBwaW5nLiBJdCBzaG91bGQgYWx3YXlzIHN0cmlwIHdoZW4gdGhlcmUgaXMgYSBjb2RlYyBtaXNtYXRjaCAoYm90aCB3YXlzKQogICAgICAgICAgICBjb25zdCBzdHJpcEhldmMgPSBpc0hldmMgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTg7CiAgICAgICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCB8fCBzdHJpcEhldmMpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgc3RyaXBIZXZjLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghYmFja3VwTTN1OCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc3RyaXBwaW5nIGRpc2FibGVkIGFuZCBubyBiYWNrdXAg4oCUIGFkcyBXSUxMIHNob3cnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBMb2cgcmVsb2FkIG91dGNvbWUgb24gdGhlIHBvbGwgYWZ0ZXIgZWFybHkgcmVsb2FkIHRyaWdnZXJlZAogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpICYmIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdDogcGFydGlhbCDigJQgc29tZSBsaXZlIHNlZ21lbnRzIHJldHVybmVkJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCByZXN1bHQ6IGNsZWFuIOKAlCBmcmVlemUgZW5kZWQnKTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0cmlnZ2VyIGZsYWcgc28gc3Vic2VxdWVudCBmcmVlemVzIHdpdGhpbiB0aGUgc2FtZSBwb2QgY2FuIHJlLWZpcmUgKGJvdW5kZWQgYnkgRWFybHlSZWxvYWRDb3VudC9Qb2RMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0OiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemU6IGlmIHdlJ3ZlIGJlZW4gbG9vcGluZyByZWNvdmVyeSBzZWdtZW50cwogICAgICAgICAgICAvLyBmb3IgTisgcG9sbHMgKH5OeDJzKSwgdHJpZ2dlciBhIHJlbG9hZCB0byBhdHRlbXB0IGZyZXNoIGNvbnRlbnQuIEJvdW5kZWQgdG8gb25lCiAgICAgICAgICAgIC8vIHJlbG9hZCBwZXIgYWQgaW4gdGhlIHBvZCAoZS5nLiAyLWFkIHBvZCA9IHVwIHRvIDIgZWFybHkgcmVsb2FkcykuCiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IG1heEVhcmx5UmVsb2FkcyA9IHJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IG1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24gKyAnIFsnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ICsgJy8nICsgbWF4RWFybHlSZWxvYWRzICsgJ10nKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAvLyBNYXJrIGZpcnN0IGNhbmRpZGF0ZS1lbmQgdGltZXN0YW1wIG9uIHRoZSBmaXJzdCBjbGVhbiBwb2xsIHNlZW4gdGhpcyBicmVhaywKICAgICAgICAgICAgLy8gc28gdGhlIHNsb3ctcGF0aCBtYXgtd2FpdCBnYXRlIGJlbG93IGNhbiBmaXJlIGV2ZW4gaWYgc3Vic2VxdWVudCBwb2xscyBib3VuY2UKICAgICAgICAgICAgLy8gYmFjayB0byBhZC1tYXJrZWQuIFRoZSBib3VuY2UtdG9sZXJhbnQgaGF2ZUFkVGFncyByZXNldCBrZWVwcyB0aGlzIGFsaXZlCiAgICAgICAgICAgIC8vIGFjcm9zcyBzaG9ydCBmbGlwcy4gTWlycm9ycyBUVFYtQUIgdjYuNi43ICMxLgogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cmVhbUluZm8uQ2xlYW5QbGF5bGlzdENvdW50Kys7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHBsYXlsaXN0IGhhcyBsaXZlIHNlZ21lbnRzIOKAlCBpZiBub3QsIGJhY2t1cCBzdHJlYW0gaXMgZGVhZAogICAgICAgICAgICBjb25zdCBoYXNMaXZlU2VnbWVudHMgPSB0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpOwogICAgICAgICAgICAvLyBJbmRlcGVuZGVudCBzbG93LXBhdGggbWF4LXdhaXQgZXNjYWxhdGlvbiDigJQgZW5kcyB0aGUgdmlzaWJsZSBhZCBjeWNsZSBldmVuIHdoZW4KICAgICAgICAgICAgLy8gbWFya2VyIGJvdW5jaW5nIGtlZXBzIENsZWFuUGxheWxpc3RDb3VudCBiZWxvdyB0aHJlc2hvbGQuIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllcgogICAgICAgICAgICAvLyBjb3VsZCBiZSB3ZWRnZWQgb24gYmFja3VwIGluZGVmaW5pdGVseSBvbiBjaGFubmVscyB3aGVyZSBUd2l0Y2ggZmxpcHMgbWFya2VycwogICAgICAgICAgICAvLyBpbi9vdXQgZmFzdGVyIHRoYW4gMyBjb25zZWN1dGl2ZSBjbGVhbiBwb2xscyBjYW4gbGFuZC4gTWlycm9ycyBUVFYtQUIgdjYuNi43ICM0CiAgICAgICAgICAgIC8vICgiRGVjb3VwbGVkIFNsb3ctUGF0aCBSZWNvdmVyeSBmcm9tIENsZWFuLUNvdW50IikuCiAgICAgICAgICAgIGNvbnN0IGFkRW5kTWF4V2FpdE1zID0gMTIwMDA7CiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRTaW5jZUNhbmRpZGF0ZSA9IERhdGUubm93KCkgLSBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0OwogICAgICAgICAgICBjb25zdCBzbG93UGF0aFJlYWR5ID0gc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA+IDAgJiYgZWxhcHNlZFNpbmNlQ2FuZGlkYXRlID49IGFkRW5kTWF4V2FpdE1zOwogICAgICAgICAgICAvLyBSZXF1aXJlIDMgY29uc2VjdXRpdmUgY2xlYW4gcG9sbHMgYmVmb3JlIGRlY2xhcmluZyBhZC1lbmQuIFByZXZpb3VzbHkgb25seSAxCiAgICAgICAgICAgIC8vIHdoZW4gTnVtU3RyaXBwZWRBZFNlZ21lbnRzID09PSAwIChDU0FJLW9ubHkgLyBiYWNrdXAtc3dhcCBwYXRoKSBhbmQgMiBvdGhlcndpc2UsCiAgICAgICAgICAgIC8vIHdoaWNoIGxldCBicmllZiBjbGVhbiB3aW5kb3dzIGR1cmluZyBvbmdvaW5nIGJyZWFrcyBmbGlwIElzU2hvd2luZ0FkIGZhbHNlCiAgICAgICAgICAgIC8vIHByZW1hdHVyZWx5IG9uIFNTQUktdW5pZm9ybSBjaGFubmVscy4gVFRWLUFCIGhpdCB0aGUgc2FtZSBmYWxzZS1wb3NpdGl2ZSBhdCAyCiAgICAgICAgICAgIC8vIHByb2JlcyBhbmQgYnVtcGVkIHRvIDMgaW4gdjYuNi43ICgiQWQtRW5kIFJlLUVudHJ5IFN0YWJpbGl0eSIpIOKAlCBUd2l0Y2ggY2FuCiAgICAgICAgICAgIC8vIHNlcnZlIGEgY2xlYW4gcGxheWxpc3QgbWlkLWJyZWFrIGJlZm9yZSByZS1pbmplY3RpbmcgbWFya2VycywgYW5kIDIgcG9sbHMKICAgICAgICAgICAgLy8gKH40cykgd2Fzbid0IGFsd2F5cyBlbm91Z2ggdG8gcmlkZSBvdXQgdGhlIGJvdW5jZS4KICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ2xlYW5QbGF5bGlzdENvdW50ID49IDMgfHwgIWhhc0xpdmVTZWdtZW50cyB8fCBzbG93UGF0aFJlYWR5KSB7CiAgICAgICAgICAgICAgICBpZiAoc2xvd1BhdGhSZWFkeSAmJiBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA8IDMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTbG93LXBhdGggYWQtZW5kIGVzY2FsYXRpb24g4oCUICcgKyAoc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50IHx8IDApICsgJyBtYXJrZXIgYm91bmNlcywgJyArIChlbGFwc2VkU2luY2VDYW5kaWRhdGUgLyAxMDAwKS50b0ZpeGVkKDEpICsgJ3Mgc2luY2UgZmlyc3QgY2xlYW4gcG9sbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFoYXNMaXZlU2VnbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGhhcyBubyBsaXZlIHNlZ21lbnRzIOKAlCBmb3JjaW5nIGltbWVkaWF0ZSByZWxvYWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGFkQnJlYWtEdXJhdGlvblNlYyA9IHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCkgLyAxMDAwKS50b0ZpeGVkKDEpIDogJz8nOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmluaXNoZWQgYmxvY2tpbmcgYWRzIOKAlCBzdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLCBkdXJhdGlvbjogJyArIGFkQnJlYWtEdXJhdGlvblNlYyArICdzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkSW5mbyA9IHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPyAnLCBlYXJseSByZWxvYWQgYXQgcG9sbCAnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF0UG9sbCA6ICcnOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhbGxDbG9ja0ZyZWV6ZSA9IHN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0ID8gKChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5GcmVlemVTdGFydGVkQXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHdhbGwtY2xvY2snIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIGJyZWFrIHN0YXRzOiAnICsgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgKyAnIGFsbC1zdHJpcHBlZCBwb2xscywgZnJlZXplIGR1cmF0aW9uOiAnICsgd2FsbENsb2NrRnJlZXplICsgcmVsb2FkSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBoYWRTdHJpcHBlZFNlZ21lbnRzID0gc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPiAwOwogICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbCBhZHMKICAgICAgICAgICAgICAgIC8vIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICBpZiAoIWhhZFN0cmlwcGVkU2VnbWVudHMgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhZFN0cmlwcGVkU2VnbWVudHMgfHwgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgaXMgc3ltbWV0cmljIHdpdGggdGhlIGluY3JlbWVudCBndWFyZCBhYm92ZSDigJQgYW55IHBvc2l0aXZlICJicmVhawogICAgICAgICAgICAgICAgICAgIC8vIHdhcyBoYW5kbGVkIGNsZWFubHkiIHNpZ25hbCByZXNldHMgdGhlIGZhbHNlLXBvc2l0aXZlIGhpc3RvcnkuIFByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHN0cmlwcGVkPjAgcmVzZXQgdGhlIGNvdW50ZXIsIHdoaWNoIGxldCBzdGFsZSBzdXNwaWNpb3VzIGhpc3RvcnkKICAgICAgICAgICAgICAgICAgICAvLyBibGVlZCBhY3Jvc3MgbGVnaXRpbWF0ZWx5LWhhbmRsZWQgYmFja3VwLXN3YXAgYnJlYWtzICgwIHN0cmlwcGVkICsgcmVhbAogICAgICAgICAgICAgICAgICAgIC8vIGFkIGF0dHJzKSBhbmQgdHJpZ2dlciB0aGUgd2FybmluZyBvbiBwYXJ0aWFsbHktc3RhbGUgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU2hvd2luZ0FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzPy5jbGVhcj8uKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlNwb29mZWRBZElkcz8uY2xlYXI/LigpOy8vIE5ldyBicmVhayA9IGZyZXNoIGFkLXNwb29mIGRlZHVwIHNldAogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5GYWlsZWRCYWNrdXBQbGF5ZXJUeXBlcz8uY2xlYXI/LigpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlKSBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5jbGVhcigpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRDb250YW1SZW9yZGVyVGhpc0JyZWFrID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0ID0gMDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQWRFbmRCb3VuY2VDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRGYXN0QXV0b3BsYXlUaGlzQnJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkRmFzdEF1dG9wbGF5UmVwcm9iZVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gQ1NBSS1vbmx5IGFkIGJyZWFrOiBubyBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkIOKAlCBza2lwIHJlbG9hZCBlbnRpcmVseS4KICAgICAgICAgICAgICAgIGlmICghaGFkU3RyaXBwZWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUktb25seSBhZCBicmVhayAoc3RyaXBwZWQgMCkg4oCUIGNsZWFyaW5nIGJhY2t1cCB3aXRob3V0IHBsYXllciBhY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb246IGlmIEFOWSBiYWNrdXAgd2FzIGNvbW1pdHRlZCBkdXJpbmcgdGhpcyBicmVhayAoZXNjYXBlIGhhdGNoCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgY3ljbGUgcmVzY3VlIHRoYXQgZGlkbid0IG1lZXQgY3ljbGVSZXNjdWVkQ2xlYW5seSBjcml0ZXJpYSksIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIGJ1ZmZlciBoYXMgYWNjdW11bGF0ZWQgbWl4ZWQtc291cmNlIHNlZ21lbnRzIChiYWNrdXAtZmV0Y2hlZAogICAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbHRlcm5hdGUgcGxheWVyLXR5cGUgYWNjZXNzIHRva2VuICsgbmF0aXZlLWZldGNoZWQpLiBNaXhpbmcgY2FuCiAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgYXVkaW8vdmlkZW8gdHJhY2sgdGltZXN0YW1wcyB0byBkaXZlcmdlLCBhbmQgd2l0aG91dCBhIHJlbG9hZCB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBkcmlmdCBjb21wb3VuZHMgYWNyb3NzIHN1YnNlcXVlbnQgZXNjYXBlLWhhdGNoIGJyZWFrcy4gRm9yY2UgYSBoYXJkIHJlbG9hZAogICAgICAgICAgICAgICAgICAgIC8vIHRvIGZsdXNoIHRoZSBNZWRpYVNvdXJjZSBidWZmZXIgKyByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9wbGF5ICgzNjBwKSBzcGVjaWZpY2FsbHksIHRoZSByZWxvYWQgYWxzbyByZXN0b3JlcyBTb3VyY2UKICAgICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IChhdXRvcGxheS1zY29wZWQgdG9rZW4gb25seSBzZXJ2ZXMgMzYwcCB2YXJpYW50IGxhZGRlcikuCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBdXRvcGxheSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGlzQXV0b3BsYXkgPyAnYXV0b3BsYXkgKDM2MHApIOKAlCByZXN0b3JpbmcgU291cmNlIHF1YWxpdHknIDogc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSArICcg4oCUIGZsdXNoaW5nIE1lZGlhU291cmNlIHRvIHByZXZlbnQgQS9WIGRlc3luYyBhY2N1bXVsYXRpb24nOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFbmQtb2YtYnJlYWsgcmVsb2FkOiAnICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMpIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMucHVzaChEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyBrZXk6ICdSZWxvYWRQbGF5ZXInLCBraW5kOiAnZWFybHknIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBdXRvLWVzY2FsYXRlIGNvb2xkb3duOiBpZiAzKyByZWxvYWRzIGluIGxhc3QgNSBtaW4sIHRyaXBsZSB0aGUgY29vbGRvd24KICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzKSBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMgPSBbXTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5maWx0ZXIodCA9PiBEYXRlLm5vdygpIC0gdCA8IDMwMDAwMCk7CiAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWRzID0gc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzLmZpbHRlcih0ID0+IERhdGUubm93KCkgLSB0IDwgMzAwMDAwKS5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVDb29sZG93biA9IHJlY2VudFJlbG9hZHMgPj0gMyA/IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDMgOiBSZWxvYWRDb29sZG93blNlY29uZHM7CiAgICAgICAgICAgICAgICBjb25zdCB0b29Tb29uU2luY2VMYXN0UmVsb2FkID0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkICYmIChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkKSA8IChlZmZlY3RpdmVDb29sZG93biAqIDEwMDApOwogICAgICAgICAgICAgICAgLy8gU2tpcCBlbmQtb2YtYnJlYWsgcmVsb2FkIHdoZW4gY3ljbGUgcmVzY3VlIGhhbmRsZWQgdGhlIGJyZWFrIGNsZWFubHk6CiAgICAgICAgICAgICAgICAvLyBhIGZyZWV6ZSBvZiDiiaQyIHBvbGxzICh+NHMpIHdhcyByZXNvbHZlZCBieSBzd2l0Y2hpbmcgdG8gYSBjbGVhbiBiYWNrdXAsCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gZWFybHkgcmVsb2FkIHdhcyBuZWVkZWQuIFRoZSBwbGF5ZXIgaXMgb24gYSBoZWFsdGh5IGJhY2t1cCBzdHJlYW0KICAgICAgICAgICAgICAgIC8vIOKAlCByZWxvYWRpbmcganVzdCB0byByZXR1cm4gdG8gdGhlIGNhbm9uaWNhbCBwbGF5ZXIgdHlwZSBjYXVzZXMgYW4gdW5uZWNlc3NhcnkKICAgICAgICAgICAgICAgIC8vIH4xLTJzIGxvYWRpbmcgY2lyY2xlLgogICAgICAgICAgICAgICAgY29uc3QgY3ljbGVSZXNjdWVkQ2xlYW5seSA9IHN0cmVhbUluZm8uQ3ljbGVSZXNjdWVkVGhpc0JyZWFrICYmCiAgICAgICAgICAgICAgICAgICAgKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzIHx8IDApIDw9IDIgJiYKICAgICAgICAgICAgICAgICAgICAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApID09PSAwOwogICAgICAgICAgICAgICAgaWYgKGN5Y2xlUmVzY3VlZENsZWFubHkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDeWNsZSByZXNjdWUgaGFuZGxlZCB0aGUgYnJlYWsgY2xlYW5seSDigJQgc2tpcHBpbmcgZW5kLW9mLWJyZWFrIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUG9zdC1hZCByZWxvYWQgYnlwYXNzZXMgY29vbGRvd246IGl0J3MgYSBidWZmZXIgZmx1c2ggdGllZCB0byBuYXR1cmFsIGJyZWFrCiAgICAgICAgICAgICAgICAvLyBlbmQsIG5vdCBhIGNhc2NhZGUtcmlzayByZXRyeS4gVGhlIGFkIGJyZWFrIGN5Y2xlIGl0c2VsZiByYXRlLWxpbWl0cyB0aGlzCiAgICAgICAgICAgICAgICAvLyBwYXRoIChvbmNlIHBlciBicmVhaykuIENvb2xkb3duIHN0aWxsIGdhdGVzIGJ1ZmZlci1tb25pdG9yIGFuZCBvdGhlcgogICAgICAgICAgICAgICAgLy8gY2FzY2FkZS1yaXNrIHBhdGhzIHRoYXQgY2FuIGZpcmUgcmVwZWF0ZWRseSBpbi1icmVhay4KICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlbG9hZCA9IHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCB8fCAoUmVsb2FkUGxheWVyQWZ0ZXJBZCAmJiBoYWRTdHJpcHBlZFNlZ21lbnRzICYmICFjeWNsZVJlc2N1ZWRDbGVhbmx5KTsKICAgICAgICAgICAgICAgIGlmIChzaG91bGRSZWxvYWQpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMucHVzaChEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnUmVsb2FkUGxheWVyJywKICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2Vhcmx5JwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAodG9vU29vblNpbmNlTGFzdFJlbG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIGxhc3QgcmVsb2FkIHdhcyAnICsgKChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkKSAvIDEwMDApLnRvRml4ZWQoMCkgKyAncyBhZ28gKGNvb2xkb3duOiAnICsgZWZmZWN0aXZlQ29vbGRvd24gKyAncycgKyAocmVjZW50UmVsb2FkcyA+PSAzID8gJywgYXV0by1lc2NhbGF0ZWQgZnJvbSAnICsgcmVjZW50UmVsb2FkcyArICcgcmVsb2FkcyBpbiA1bWluJyA6ICcnKSArICcpJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnUGF1c2VSZXN1bWVQbGF5ZXInCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9Ly8gZW5kIGVsc2UgKG5vbi1DU0FJIHBhdGgpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICBudW1TdHJpcHBlZEFkU2VnbWVudHM6IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzLAogICAgICAgICAgICBhY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKQogICAgICAgICAgICAubWFwKHggPT4gewogICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB4LnN1YnN0cmluZygwLCBpZHgpOwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB4LnN1YnN0cmluZyhpZHggKyAxKTsKICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXTsKICAgICAgICAgICAgfSkpOwogICAgfQogICAgLy8gUmVxdWVzdCBhIHBsYXliYWNrIGFjY2VzcyB0b2tlbiBmcm9tIFR3aXRjaCBHUUwgdXNpbmcgdGhlIGdpdmVuIHBsYXllciB0eXBlCiAgICBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbihjaGFubmVsTmFtZSwgcGxheWVyVHlwZSkgewogICAgICAgIGNvbnN0IGJvZHkgPSB7CiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdQbGF5YmFja0FjY2Vzc1Rva2VuJywKICAgICAgICAgICAgdmFyaWFibGVzOiB7CiAgICAgICAgICAgICAgICBpc0xpdmU6IHRydWUsCiAgICAgICAgICAgICAgICBsb2dpbjogY2hhbm5lbE5hbWUsCiAgICAgICAgICAgICAgICBpc1ZvZDogZmFsc2UsCiAgICAgICAgICAgICAgICB2b2RJRDogIiIsCiAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlOiBwbGF5ZXJUeXBlLAogICAgICAgICAgICAgICAgcGxhdGZvcm06IHBsYXllclR5cGUgPT0gJ2F1dG9wbGF5JyA/ICdhbmRyb2lkJyA6ICd3ZWInCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV4dGVuc2lvbnM6IHsKICAgICAgICAgICAgICAgIHBlcnNpc3RlZFF1ZXJ5OiB7CiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjoxLAogICAgICAgICAgICAgICAgICAgIHNoYTI1Nkhhc2g6ImVkMjMwYWExZTMzZTA3ZWViYjg5Mjg1MDQ1ODNkYTc4YTUxNzM5ODlmYWRmYjFhYzk0YmUwNmEwNGYzY2RiZTkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBncWxSZXF1ZXN0KGJvZHkpOwogICAgfQogICAgLy8gU2VuZCBhIEdRTCByZXF1ZXN0IHRvIFR3aXRjaCB2aWEgdGhlIG1haW4gdGhyZWFkICh3b3JrZXJzIGNhbid0IG1ha2UgY3JlZGVudGlhbGVkIHJlcXVlc3RzKQogICAgZnVuY3Rpb24gZ3FsUmVxdWVzdChib2R5KSB7CiAgICAgICAgaWYgKCFHUUxEZXZpY2VJRCkgewogICAgICAgICAgICBHUUxEZXZpY2VJRCA9ICcnOwogICAgICAgICAgICBjb25zdCBkY2hhcmFjdGVycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBjb25zdCBkY2hhcmFjdGVyc0xlbmd0aCA9IGRjaGFyYWN0ZXJzLmxlbmd0aDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CiAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCArPSBkY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGNoYXJhY3RlcnNMZW5ndGgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgaGVhZGVycyA9IHsKICAgICAgICAgICAgJ0NsaWVudC1JRCc6IENsaWVudElELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBHUUxEZXZpY2VJRCwKICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBBdXRob3JpemF0aW9uSGVhZGVyLAogICAgICAgICAgICAuLi4oQ2xpZW50SW50ZWdyaXR5SGVhZGVyICYmIHsnQ2xpZW50LUludGVncml0eSc6IENsaWVudEludGVncml0eUhlYWRlcn0pLAogICAgICAgICAgICAuLi4oQ2xpZW50VmVyc2lvbiAmJiB7J0NsaWVudC1WZXJzaW9uJzogQ2xpZW50VmVyc2lvbn0pLAogICAgICAgICAgICAuLi4oQ2xpZW50U2Vzc2lvbiAmJiB7J0NsaWVudC1TZXNzaW9uLUlkJzogQ2xpZW50U2Vzc2lvbn0pCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpOwogICAgICAgICAgICBjb25zdCBmZXRjaFJlcXVlc3QgPSB7CiAgICAgICAgICAgICAgICBpZDogcmVxdWVzdElkLAogICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9ncWwudHdpdGNoLnR2L2dxbCcsCiAgICAgICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVxdWVzdElkKSkgewogICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0SWQpOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZldGNoUmVxdWVzdCB0aW1lZCBvdXQnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDE1MDAwKTsKICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuc2V0KHJlcXVlc3RJZCwgewogICAgICAgICAgICAgICAgcmVzb2x2ZSwKICAgICAgICAgICAgICAgIHJlamVjdCwKICAgICAgICAgICAgICAgIHRpbWVvdXRJZAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXF1ZXN0JywKICAgICAgICAgICAgICAgIHZhbHVlOiBmZXRjaFJlcXVlc3QKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBsZXQgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICBsZXQgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOwogICAgbGV0IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOwogICAgZnVuY3Rpb24gc3RhcnREcmlmdENvcnJlY3Rpb24odmlkZW9FbGVtZW50KSB7CiAgICAgICAgaWYgKERyaWZ0Q29ycmVjdGlvblJhdGUgPD0gMSkgcmV0dXJuOwogICAgICAgIGlmIChkcmlmdENhdGNoVXBJbnRlcnZhbCkgeyBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOyB9CiAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgIHZpZGVvRWxlbWVudC5wbGF5YmFja1JhdGUgPSBEcmlmdENvcnJlY3Rpb25SYXRlOwogICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIERyaWZ0IGNvcnJlY3Rpb246IGNhdGNoaW5nIHVwIGF0ICcgKyBEcmlmdENvcnJlY3Rpb25SYXRlICsgJ3gnKTsKICAgICAgICBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICBpZiAodmlkICYmIHZpZC5idWZmZXJlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZC5idWZmZXJlZC5lbmQodmlkLmJ1ZmZlcmVkLmxlbmd0aCAtIDEpIC0gdmlkLmN1cnJlbnRUaW1lIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkLnBsYXliYWNrUmF0ZSA9IDEuMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRHJpZnQgY29ycmVjdGlvbiBjb21wbGV0ZSDigJQgcmVzdW1lZCBub3JtYWwgcGxheWJhY2sgc3BlZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICB9LCA1MDApOwogICAgICAgIGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdHJ5IHsgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IDEuMDsgfSBjYXRjaCB7fQogICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgICAgICBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsKICAgICAgICB9LCAzMDAwMCk7CiAgICB9CiAgICBjb25zdCBwbGF5ZXJCdWZmZXJTdGF0ZSA9IHsKICAgICAgICBjaGFubmVsTmFtZTogbnVsbCwKICAgICAgICBoYXNTdHJlYW1TdGFydGVkOiBmYWxzZSwKICAgICAgICBwb3NpdGlvbjogMCwKICAgICAgICBidWZmZXJlZFBvc2l0aW9uOiAwLAogICAgICAgIGJ1ZmZlckR1cmF0aW9uOiAwLAogICAgICAgIG51bVNhbWU6IDAsCiAgICAgICAgZml4QXR0ZW1wdHM6IDAsCiAgICAgICAgbGFzdEZpeFRpbWU6IDAsCiAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgIGxhc3RCYWNrdXBTd2l0Y2hBdDogMCwKICAgICAgICBsYXN0UmVsb2FkQXQ6IDAsCiAgICAgICAgcmVjb3ZlcnlSZWxvYWRVc2VkOiBmYWxzZSwKICAgICAgICB1c2VyUGF1c2VJbnRlbnQ6IGZhbHNlLAogICAgICAgIGxvZ2dlZFBhdXNlSW50ZW50OiBmYWxzZSwKICAgICAgICB3ZUp1c3RQYXVzZWQ6IDAsCiAgICAgICAgaW5BZEJyZWFrOiBmYWxzZSwKICAgICAgICB2YWZ0RXZlclVubXV0ZWQ6IGZhbHNlCiAgICB9OwogICAgLy8gUG9sbCB0aGUgcGxheWVyIHN0YXRlIHRvIGRldGVjdCBhbmQgZml4IGJ1ZmZlcmluZyBjYXVzZWQgYnkgYWQgc3RyZWFtIHN3aXRjaGluZwogICAgZnVuY3Rpb24gbW9uaXRvclBsYXllckJ1ZmZlcmluZygpIHsKICAgICAgICAvLyBGcmVzaCBwbGF5ZXIgbG9va3VwIGV2ZXJ5IHRpY2sgKGF2b2lkcyBzdGFsZSByZWYgd2hlbiBUd2l0Y2ggcmVzdGFydHMgaXRzIG93biBwbGF5ZXIpCiAgICAgICAgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgICAgIGlmIChwbGF5ZXJBbmRTdGF0ZSAmJiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIgJiYgcGxheWVyQW5kU3RhdGUuc3RhdGUpIHsKICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBsYXllckFuZFN0YXRlLnN0YXRlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgIXZpZGVvLl9fdGFzSW50ZW50SG9va2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uX190YXNJbnRlbnRIb29rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCB8fCAoRGF0ZS5ub3coKSAtIHBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCkgPiAyMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudXNlclBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcucGxheWVyOwogICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnN0YXRlOwogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXIuY29yZSkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnICYmICFwbGF5ZXIuaXNQYXVzZWQoKSAmJiAhcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKT8uZW5kZWQgJiYgKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50KCk/LnJlYWR5U3RhdGUgPz8gMCkgPj0gMSAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA8PSBEYXRlLm5vdygpIC0gUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgJiYgIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdFJlbG9hZEF0ID49IDE1MDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThVcmwgPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG0zdThVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaCA9IG0zdThVcmwubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RhcnQgPSBtM3U4VXJsLmluZGV4T2YoJz8nLCBsYXN0U2xhc2gpOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBtM3U4VXJsLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxLCBxdWVyeVN0YXJ0ICE9PSAtMSA/IHF1ZXJ5U3RhcnQgOiB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lPy5lbmRzV2l0aCgnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gZmlsZU5hbWUuc2xpY2UoMCwgLTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSAhPSBjaGFubmVsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuZ2V0U3RhdGUoKSA9PT0gJ1BsYXlpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHBsYXllci5jb3JlPy5zdGF0ZT8ucG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyZWRQb3NpdGlvbiA9IHBsYXllci5jb3JlPy5zdGF0ZT8uYnVmZmVyZWRQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXJEdXJhdGlvbiA9IHBsYXllci5nZXRCdWZmZXJEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIC8vIHZpZGVvLmN1cnJlbnRUaW1lIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGFjdHVhbCBwbGF5YmFjayBwcm9ncmVzcyDigJQKICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZS5wb3NpdGlvbiB1cGRhdGVzIGluIGJhdGNoZXMgb24gcmVsb2FkLWhlYXZ5IGNoYW5uZWxzIGFuZCBjYW4KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXIgZnJvemVuIGZvciB+MTJzIHdoaWxlIHRoZSB2aWRlbyBlbGVtZW50IGFkdmFuY2VzIHNtb290aGx5LgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvRWwgPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlkZW9DdXJyZW50VGltZSA9IHZpZGVvRWw/LmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICYmIGJ1ZmZlcmVkUG9zaXRpb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGNvdWxkIGJlIGltcHJvdmVkLiBJdCBjdXJyZW50bHkgbGV0cyB0aGUgcGxheWVyIGZ1bGx5IGVhdCB0aGUgZnVsbCBidWZmZXIgYmVmb3JlIGl0IHRyaWdnZXJzIHBhdXNlL3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgYnVmZmVyLXN0YWxsIGNoZWNrIHdoaWxlIHRoZSA8dmlkZW8+IGVsZW1lbnQgaXNuJ3QgYWN0aXZlbHkgdHJ5aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHBsYXk6IHJlYWR5U3RhdGUgPCAyIChNU0UgaW5pdCAvIHNlZWspIG9yIHBhdXNlZD10cnVlIChhdXRvcGxheS1wb2xpY3kgLwogICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgdGVhcmRvd24gcmFjZSB3aXRoIHBsYXllci5pc1BhdXNlZCgpKS4gSG9sZCBjb3VudGVycyBzbyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UgaW50ZXJydXB0ZWQgYnkgYSBicmllZiBpbml0IGRpcCByZXN1bWVzIGNvdW50aW5nIG9uIG5leHQgYWN0aXZlIHBvbGwuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllck5vdEFjdGl2ZWx5UGxheWluZyA9IHZpZGVvRWwgJiYgKHZpZGVvRWwucmVhZHlTdGF0ZSA8IDIgfHwgdmlkZW9FbC5wYXVzZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBGRloncyBhdWRpbyBjb21wcmVzc29yIHJlY3JlYXRlcyB0aGUgPHZpZGVvPiBlbGVtZW50IG9uIGV2ZXJ5IHBsYXllci5sb2FkKCkuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCB0aGVuIHNuYXBzIHRoZSBuZXcgZWxlbWVudCB0byAiYnVmZmVyZWQgcmVnaW9uIDAuMDR4eHgiIOKAlCBhIGJyaWVmCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRUaW1lIHBsYXRlYXUgdGhhdCBtYXRjaGVzIHBvc2l0aW9uRnJvemVuIGV2ZW4gdGhvdWdoIHBsYXliYWNrIGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWx0aHkuIERldGVjdCB0aGUgc3dhcCBieSBlbGVtZW50IGlkZW50aXR5IGFuZCBjbGVhciBjb3VudGVycyBzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFtcC11cCBpc24ndCBjb3VudGVkIGFzIGEgc3RhbGwuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb0VsICYmIHBsYXllckJ1ZmZlclN0YXRlLnZpZGVvRWxlbWVudCAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS52aWRlb0VsZW1lbnQgIT09IHZpZGVvRWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudmlkZW9FbGVtZW50ID0gdmlkZW9FbDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25Gcm96ZW4gPSAocGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPT0gcG9zaXRpb24pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheWVyQnVmZmVyU3RhdGUudmlkZW9DdXJyZW50VGltZSA9PT0gdW5kZWZpbmVkIHx8IHBsYXllckJ1ZmZlclN0YXRlLnZpZGVvQ3VycmVudFRpbWUgPT09IHZpZGVvQ3VycmVudFRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyTm90QWN0aXZlbHlQbGF5aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIOKAlCBuZWl0aGVyIGluY3JlbWVudCBub3IgcmVzZXQsIGp1c3QgaG9sZCBzdGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgfHwgcG9zaXRpb24gPiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaWdodGVuIHRvIEFORDogYSByZWFsIHN0YWxsIGlzIEJPVEggZnJvemVuIHBvc2l0aW9uIEFORCBhIGRyYWluaW5nIGJ1ZmZlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpZWxkIHJlcG9ydHMgb24gRmlyZWZveCBhdCBsaXZlIGVkZ2Ugc2hvd2VkIHRoZSBPUiBmb3JtIGZpcmluZyBkdXJpbmcgbm9ybWFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGluLWJ1ZmZlciBicmVhdGhpbmcgKH4xLTJzIGJ1ZmZlcmVkLCBjdXJyZW50VGltZSBicmllZmx5IGlkbGUgd2FpdGluZyBvbiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWdtZW50IGZldGNoKSDigJQgcGF1c2UvcGxheSB3b3VsZCB0aGVuIGtub2NrIHRoZSBwbGF5ZXIgYmFjayB0byByZWFkeVN0YXRlPTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjdXJyZW50VGltZT0wLCBzbm93YmFsbGluZyBpbnRvIGEgc2VsZi1yZWluZm9yY2luZyByZWxvYWQgY2FzY2FkZS4gV2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQU5ELCByZWFsIHN0YWxscyAoZnJvemVuICsgYnVmZmVyIGRyYWluZWQgYmVsb3cgRGFuZ2VyWm9uZSkgc3RpbGwgZmlyZSBvbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgcG9sbCBjYWRlbmNlOyBoZWFsdGh5IHRoaW4tYnVmZmVyIGZlZWRzIG5vIGxvbmdlciB0cmlwIGl0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uRnJvemVuICYmIGJ1ZmZlckR1cmF0aW9uIDwgUGxheWVyQnVmZmVyaW5nRGFuZ2VyWm9uZSkgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5idWZmZXJlZFBvc2l0aW9uID09IGJ1ZmZlcmVkUG9zaXRpb24gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID49IGJ1ZmZlckR1cmF0aW9uICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9zaXRpb24gIT0gMCB8fCBidWZmZXJlZFBvc2l0aW9uICE9IDAgfHwgYnVmZmVyRHVyYXRpb24gIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9PSBQbGF5ZXJCdWZmZXJpbmdTYW1lU3RhdGVDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FwOiBhdCBtb3N0IE9ORSByZWxvYWQgcGVyIHJlY292ZXJ5IHdpbmRvdy4gQWZ0ZXIgcmVsb2FkaW5nIG9uY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RheSBvbiBwYXVzZS9wbGF5IHVudGlsIHBsYXliYWNrIHJlY292ZXJzLiBQcmV2ZW50cyByZWxvYWQgY2FzY2FkZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd291bGRFc2NhbGF0ZSA9IHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID49IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGVUb1JlbG9hZCA9IHdvdWxkRXNjYWxhdGUgJiYgKERpc2FibGVSZWxvYWRDYXAgfHwgIXBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkQ2FwTm90ZSA9IHdvdWxkRXNjYWxhdGUgJiYgIWVzY2FsYXRlVG9SZWxvYWQgPyAnIChyZWxvYWQgY2FwIHJlYWNoZWQsIHBhdXNlL3BsYXkgb25seSDigJQgc2V0IHR3aXRjaEFkU29sdXRpb25zX2Rpc2FibGVSZWxvYWRDYXA9dHJ1ZSB0byBieXBhc3MpJyA6IChlc2NhbGF0ZVRvUmVsb2FkID8gJyAoZXNjYWxhdGluZyB0byByZWxvYWQpJyA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQXR0ZW1wdCB0byBmaXggYnVmZmVyaW5nIHBvc2l0aW9uOicgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiArICcgYnVmZmVyZWRQb3NpdGlvbjonICsgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiArICcgYnVmZmVyRHVyYXRpb246JyArIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uICsgcmVsb2FkQ2FwTm90ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlayBwYXN0IGJ1ZmZlciBnYXAgaW5zdGVhZCBvZiBzdGFsbGluZyArIGRyaWZ0IHRvIHJlY292ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWRlbyA9IHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgdmlkZW8uYnVmZmVyZWQubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBiaSA9IDA7IGJpIDwgdmlkZW8uYnVmZmVyZWQubGVuZ3RoOyBiaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8uYnVmZmVyZWQuc3RhcnQoYmkpID4gdmlkZW8uY3VycmVudFRpbWUgKyAwLjUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTZWVraW5nIHBhc3QgJyArICh2aWRlby5idWZmZXJlZC5zdGFydChiaSkgLSB2aWRlby5jdXJyZW50VGltZSkudG9GaXhlZCgxKSArICdzIGJ1ZmZlciBnYXAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHZpZGVvLmJ1ZmZlcmVkLnN0YXJ0KGJpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyaWZ0Q29ycmVjdGlvbih2aWRlbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFZpZGVvIHN0YXRlOiByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJyBuZXR3b3JrU3RhdGU9JyArIHZpZGVvLm5ldHdvcmtTdGF0ZSArICcgYnVmZmVyZWQ9JyArICh2aWRlby5idWZmZXJlZC5sZW5ndGggPiAwID8gdmlkZW8uYnVmZmVyZWQuZW5kKHZpZGVvLmJ1ZmZlcmVkLmxlbmd0aCAtIDEpLnRvRml4ZWQoMSkgOiAwKSArICcgY3VycmVudFRpbWU9JyArIHZpZGVvLmN1cnJlbnRUaW1lLnRvRml4ZWQoMSkgKyAnIHBhdXNlZD0nICsgdmlkZW8ucGF1c2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNQYXVzZVBsYXkgPSBlc2NhbGF0ZVRvUmVsb2FkID8gZmFsc2UgOiAhUGxheWVyQnVmZmVyaW5nRG9QbGF5ZXJSZWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNSZWxvYWQgPSBlc2NhbGF0ZVRvUmVsb2FkID8gdHJ1ZSA6IFBsYXllckJ1ZmZlcmluZ0RvUGxheWVyUmVsb2FkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxhc3RGaXhUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGVUb1JlbG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5yZWNvdmVyeVJlbG9hZFVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3QgcG9zaXRpb24ganVtcCAobmF0aXZlIGdhcCByZWNvdmVyeSkg4oCUIGRyaWZ0IHRvIGNhdGNoIHVwLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGR1cmluZyBhZCBicmVha3MgYW5kIDEwcyBhZnRlcjogYmFja3VwIHN0cmVhbSBzd2l0Y2hpbmcgY2F1c2VzIGJ1ZmZlciBnYXBzIHRoYXQgdHJpZ2dlciBmYWxzZSBqdW1wcy4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmF0ZS1saW1pdCB0byBvbmNlIHBlciAzMHM6IGZpZWxkLW9ic2VydmVkIG9uIHdhcm4gdGhhdCBUd2l0Y2gncyBwbGF5ZXIuY29yZS5zdGF0ZS5wb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBqdW1wcyB+NjBzIGV2ZXJ5IH4xMnMgb24gcmVsb2FkLWhlYXZ5IGNoYW5uZWxzIChsaWtlbHkgYmF0Y2ggdXBkYXRlcyBmcm9tIG0zdTggbWFuaWZlc3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaGVzIC8gcHJvZ3JhbS1kYXRlLXRpbWUgc3luYyBwb2ludHMsIG5vdCByZWFsIGRyaWZ0KS4gT3VyIDEuMXggdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGFmZmVjdCBzdGF0ZS5wb3NpdGlvbiBhbnl3YXksIHNvIHJlLWZpcmluZyBldmVyeSAxMnMgaXMgdXNlbGVzcyBsb2cgc3BhbSDigJQgdGhlIGNhdGNoLXVwCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdGVzIG9uIGN1cnJlbnRUaW1lIHdoaWNoIGlzIGFscmVhZHkgYXQgbGl2ZSBlZGdlLiBSYXRlLWxpbWl0IGNvbGxhcHNlcyB0aGUgc3BhbSB0byBhCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBkcmlmdCBhdHRlbXB0IHBlciAzMHMgd2luZG93LCBsZWF2aW5nIHJlYWwtZHJpZnQgcGF0aHMgKGJ1ZmZlci1nYXAgc2VlaywgcG9zdC1yZWxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYWZmZWN0ZWQgc2luY2UgdGhleSBjYWxsIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKCkgZGlyZWN0bHkgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgZGV0ZWN0b3IuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA+IDAgJiYgcG9zaXRpb24gLSBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA+IDUgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3REcmlmdFN0YXJ0ZWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdERyaWZ0U3RhcnRlZEF0ID49IDMwMDAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zaXRpb24ganVtcGVkICcgKyAocG9zaXRpb24gLSBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbikudG9GaXhlZCgxKSArICdzIOKAlCBzdGFydGluZyBkcmlmdCBjb3JyZWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyaWZ0Q29ycmVjdGlvbihwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdERyaWZ0U3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS52aWRlb0N1cnJlbnRUaW1lID0gdmlkZW9DdXJyZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiA9IGJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID0gYnVmZmVyRHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIHdoZW4gbW9uaXRvcmluZyBwbGF5ZXIgZm9yIGJ1ZmZlcmluZzogJyArIGVycik7CiAgICAgICAgICAgICAgICBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2FkaW5nLWNpcmNsZSBoZWFsdGggY2hlY2s6IGR1cmluZyBhbiBhZCBzdHJpcCtyZWNvdmVyeSBsb29wIHRoZSBub3JtYWwgYnVmZmVyIG1vbml0b3IKICAgICAgICAvLyBpcyBnYXRlZCBvZmYgKGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMpLCBzbyBhIHZpc2libHkgc3RhbGxlZCBwbGF5ZXIgd291bGQgb3RoZXJ3aXNlIHdhaXQKICAgICAgICAvLyBmb3IgdGhlIHdvcmtlcidzIHBvbGwtYmFzZWQgZWFybHkgcmVsb2FkICh+MTBzKS4gVGhpcyBjYXRjaGVzIHRoZSB2aXNpYmxlIHN0YWxsIH4zcyBhZnRlcgogICAgICAgIC8vIGl0IHN0YXJ0cyBhbmQgdHJpZ2dlcnMgYSByZWxvYWQgZGlyZWN0bHksIGVsaW1pbmF0aW5nIG1vc3Qgb2YgdGhlIGxvYWRpbmctY2lyY2xlIHdpbmRvdy4KICAgICAgICBpZiAoaXNBY3RpdmVseVN0cmlwcGluZ0FkcyAmJiBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnBsYXllcjsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyPy5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8uZW5kZWQgJiYgIXBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIHBsYXllciBoYXMgZXZlciBoYWQgZGF0YSDigJQgZGlzdGluZ3Vpc2hlcyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAvLyAoaGFkIGRhdGEsIGxvc3QgZGF0YSkgZnJvbSBpbml0aWFsIHBsYXllciBpbml0IChuZXZlciBoYWQgZGF0YSB5ZXQpLgogICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgZnJlc2ggcGFnZSBsb2FkICsgcHJlcm9sbCBjYXVzZXMgUFIgIzk2IHRvIG1pc2ZpcmUgcmVwZWF0ZWRseQogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVhZHlTdGF0ZT0wIGlzIG5vcm1hbCBkdXJpbmcgaW5pdC4KICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1N0YWxsZWQgPSB2aWRlby5yZWFkeVN0YXRlIDwgMyAmJiAodmlkZW8ucGF1c2VkIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gMik7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhbGxSZWxvYWRDb29sZG93biA9IDE1MDAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb2xkb3duRXhwaXJlZCA9ICFwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QWRTdGFsbFJlbG9hZEF0IHx8IChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCkgPiBzdGFsbFJlbG9hZENvb2xkb3duOwogICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGZpcmUgbG9hZGluZy1jaXJjbGUgcmVsb2FkIGlmIEFOWSByZWxvYWQgaGFwcGVuZWQgcmVjZW50bHkg4oCUIHJlYWR5U3RhdGU9MAogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBleHBlY3RlZCB0cmFuc2llbnQgc3RhdGUgZHVyaW5nIGEgcmVsb2FkJ3MgTWVkaWFTb3VyY2UgdGVhcmRvd24uIFdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLCBhbiBlYXJseS1yZWxvYWQgaW4gZmxpZ2h0IGNhbiB0cmlnZ2VyIGEgcmVkdW5kYW50IGxvYWRpbmctY2lyY2xlIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWQgPSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQpIDwgc3RhbGxSZWxvYWRDb29sZG93bjsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGFsbGVkICYmIGNvb2xkb3duRXhwaXJlZCAmJiAhcmVjZW50UmVsb2FkICYmIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpID4gMzAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTG9hZGluZyBjaXJjbGUgZGV0ZWN0ZWQgZHVyaW5nIGFkIGJyZWFrICgnICsgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHN0YWxsLCByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJykg4oCUIGVhcmx5IHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkIHJlbG9hZDogYSBzdHVjayBtZWRpYSBwbGF5ZXIgbmVlZHMgaXRzIE1lZGlhU291cmNlIHJlYnVpbHQsIG5vdCBqdXN0IGFuIG0zdTggcmVmZXRjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgJ2Vhcmx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1N0YWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0gZWxzZSBpZiAoIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIHsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc0xpdmUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUuaXNMaXZlICYmICFpc0xpdmUpIHsKICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcih7CiAgICAgICAgICAgICAgICBoYXNBZHM6IGZhbHNlCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pc0xpdmUgPSBpc0xpdmU7CiAgICAgICAgLy8gRm9yY2UgaW1tZWRpYXRlIHRpY2sgd2hlbiB0YWIgYmVjb21lcyB2aXNpYmxlIHNvIHN0YWxscyBhcmUgY2F1Z2h0IGZhc3Qgb24gcmV0dXJuCiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcudmlzaWJpbGl0eUhvb2tlZCkgewogICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnZpc2liaWxpdHlIb29rZWQgPSB0cnVlOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcucGVuZGluZ1RpY2spIHsKICAgICAgICAgICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnBlbmRpbmdUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9uaXRvclBsYXllckJ1ZmZlcmluZy5wZW5kaW5nVGljayA9IGZhbHNlOyBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7IH0sIDEwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBDYXRjaCBwZXJzaXN0ZW50IGFkLWJyZWFrIG92ZXJsYXlzIChlLmcuICJ0YWtpbmcgYW4gYWQgYnJlYWsgLyBzdGljayBhcm91bmQiKQogICAgICAgIC8vIGV2ZW4gYWZ0ZXIgaGFzQWRzIGhhcyB0cmFuc2l0aW9uZWQgdG8gZmFsc2UuIHVwZGF0ZUFkYmxvY2tCYW5uZXIgb25seSBjYWxscwogICAgICAgIC8vIGhpZGVUd2l0Y2hBZE92ZXJsYXlzIGR1cmluZyB0aGUgYWN0aXZlIGFkIGJyZWFrOyBzb21lIG92ZXJsYXlzIGhhdmUgdGhlaXIgb3duCiAgICAgICAgLy8gbGlmZWN5Y2xlIGFuZCBzdGF5IHZpc2libGUgYWZ0ZXJ3YXJkcy4gUnVubmluZyBoZXJlIG9uIGV2ZXJ5IG1vbml0b3IgdGljawogICAgICAgIC8vICgxLTNzIGNhZGVuY2UpIGtlZXBzIHRoZW0gaGlkZGVuIHdpdGhvdXQgYSBkZWRpY2F0ZWQgaW50ZXJ2YWwuCiAgICAgICAgdHJ5IHsgaGlkZVR3aXRjaEFkT3ZlcmxheXMoKTsgfSBjYXRjaCB7fQogICAgICAgIC8vIFZpc2liaWxpdHktYXdhcmUgYmFja29mZjogcG9sbCAzeCBzbG93ZXIgd2hlbiB0YWIgaXMgaGlkZGVuIChidXQgTk9UIGR1cmluZyBQaVAg4oCUIHVzZXIgaXMgc3RpbGwgd2F0Y2hpbmcpCiAgICAgICAgY29uc3Qgc2hvdWxkVGhyb3R0bGUgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmhpZGRlbiAmJiAhZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQ7CiAgICAgICAgY29uc3QgbmV4dERlbGF5ID0gc2hvdWxkVGhyb3R0bGUgPyBQbGF5ZXJCdWZmZXJpbmdEZWxheSAqIDMgOiBQbGF5ZXJCdWZmZXJpbmdEZWxheTsKICAgICAgICBzZXRUaW1lb3V0KG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcsIG5leHREZWxheSk7CiAgICB9CiAgICAvLyBIaWRlIFR3aXRjaCdzIGFkIGJyZWFrIC8gVHVyYm8gcHJvbW8gLyBzdHJlYW0gZGlzcGxheSBhZCBvdmVybGF5cyB3aGVuIHdlJ3JlIGFscmVhZHkgYmxvY2tpbmcgYWRzCiAgICBmdW5jdGlvbiBoaWRlVHdpdGNoQWRPdmVybGF5cygpIHsKICAgICAgICBpZiAoIWNhY2hlZFBsYXllclJvb3REaXYgfHwgIWNhY2hlZFBsYXllclJvb3REaXYuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgICAgICAvLyBIaWRlIHN0cmVhbSBkaXNwbGF5IGFkIChTREEpIHdyYXBwZXIKICAgICAgICBjb25zdCBzZGFFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRlc3Qtc2VsZWN0b3I9InNkYS13cmFwcGVyIl0nKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNkYUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghc2RhRWxlbWVudHNbaV0uZGF0YXNldC50YXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIHNkYUVsZW1lbnRzW2ldLmRhdGFzZXQudGFzSGlkZGVuID0gJyc7CiAgICAgICAgICAgICAgICBzZGFFbGVtZW50c1tpXS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRTZGFIaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VkU2RhSGlkZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSGlkZGVuIFR3aXRjaCBzdHJlYW0gZGlzcGxheSBhZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgaWYgKCFjYWNoZWRQbGF5ZXJSb290RGl2IHx8ICFjYWNoZWRQbGF5ZXJSb290RGl2LmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIGNhY2hlZFBsYXllclJvb3REaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tcGxheWVyJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllclJvb3REaXYgPSBjYWNoZWRQbGF5ZXJSb290RGl2OwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgPSBkYXRhLmlzU3RyaXBwaW5nQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIHBsYXllckJ1ZmZlclN0YXRlLmlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuaGFzQWRzKSB7CiAgICAgICAgICAgICAgICBoaWRlVHdpdGNoQWRPdmVybGF5cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gVHJhdmVyc2UgUmVhY3QncyBmaWJlciB0cmVlIHRvIGZpbmQgVHdpdGNoJ3MgcGxheWVyIGFuZCBwbGF5ZXIgc3RhdGUgaW5zdGFuY2VzCiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgaWYgKCFjYWNoZWRSb290Tm9kZSkgewogICAgICAgICAgICAgICAgY2FjaGVkUm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gY2FjaGVkUm9vdE5vZGU7CiAgICAgICAgICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdCAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCkgewogICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZWFjdFJvb3ROb2RlID09IG51bGwgJiYgcm9vdE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IE9iamVjdC5rZXlzKHJvb3ROb2RlKS5maW5kKHggPT4geC5zdGFydHNXaXRoKCdfX3JlYWN0Q29udGFpbmVyJykgfHwgeC5zdGFydHNXaXRoKCdfX3JlYWN0RmliZXInKSk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlW2NvbnRhaW5lck5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFjdFJvb3ROb2RlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWFjdFJvb3ROb2RlID0gZmluZFJlYWN0Um9vdE5vZGUoKTsKICAgICAgICBpZiAoIXJlYWN0Um9vdE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGxldCBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRQbGF5ZXJBY3RpdmUgJiYgbm9kZS5wcm9wcyAmJiBub2RlLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UpOwogICAgICAgIHBsYXllciA9IHBsYXllciAmJiBwbGF5ZXIucHJvcHMgJiYgcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgPyBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgaWYgKHBsYXllcj8ucGxheWVySW5zdGFuY2UpIHsKICAgICAgICAgICAgcGxheWVyID0gcGxheWVyLnBsYXllckluc3RhbmNlOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCBpZiBUd2l0Y2ggb2JmdXNjYXRlcyBwcm9wZXJ0eSBuYW1lcwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQgJiYgbm9kZS5nZXRCdWZmZXJEdXJhdGlvbiAmJiBub2RlLmNvcmU/LnN0YXRlKTsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2gg4oCUIHNldFNyYyBleGlzdHMgYnV0IHNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzIHdhcyByZW5hbWVkCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjayA9ICFwbGF5ZXJTdGF0ZSA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldFN0cmVhbU1hbmFnZXJOb2RlICYmICFub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQpIDogbnVsbDsKICAgICAgICAvLyBGYWxsYmFjayAyOiBUVFYtQUIncyBhcHByb2FjaCDigJQgdmlkZW9QbGF5ZXJJbnN0YW5jZSB3aXRoIHBsYXllck1vZGUKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMiA9ICFwbGF5ZXJTdGF0ZSAmJiAhcGxheWVyU3RhdGVGYWxsYmFjayA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlPy5wbGF5ZXJNb2RlICE9PSB1bmRlZmluZWQpPy5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgY29uc3QgZmluYWxQbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlIHx8IHBsYXllclN0YXRlRmFsbGJhY2sgfHwgcGxheWVyU3RhdGVGYWxsYmFjazI7CiAgICAgICAgLy8gR3JhY2UgcGVyaW9kIGJlZm9yZSBsb2dnaW5nICJub3QgZm91bmQiIHdhcm5pbmdzLiBUaGUgYnVmZmVyIG1vbml0b3IgY2FuIHRpY2sKICAgICAgICAvLyBiZWZvcmUgUmVhY3QgaGFzIGZpbmlzaGVkIG1vdW50aW5nIHRoZSBwbGF5ZXIsIGxlYWRpbmcgdG8gYSBmYWxzZS1wb3NpdGl2ZQogICAgICAgIC8vIGxvZyB0aGF0IGZpcmVzIG9uY2Ugb24gZXZlcnkgcGFnZSBsb2FkLiBPbmx5IGxvZyBpZiB0aGUgbnVsbCBzdGF0ZSBwZXJzaXN0cwogICAgICAgIC8vIGZvciAxMCsgc2Vjb25kcyDigJQgYnkgdGhlbiBSZWFjdCBpcyBkZWZpbml0ZWx5IG1vdW50ZWQgYW5kIGEgcGVyc2lzdGVudCBudWxsCiAgICAgICAgLy8gaW5kaWNhdGVzIHJlYWwgQVBJIGRyaWZ0IChUd2l0Y2ggcmVuYW1lZCBzZXRQbGF5ZXJBY3RpdmUvc2V0U3JjL2V0YykuCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgaWYgKCFnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCkgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyICYmIChEYXRlLm5vdygpIC0gZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQpID4gMTAwMDApIHsKICAgICAgICAgICAgICAgIGdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFBsYXllckFjdGl2ZS9tZWRpYVBsYXllckluc3RhbmNlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIGlmICghZmluYWxQbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQpIGdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vU3RhdGUgJiYgKERhdGUubm93KCkgLSBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFN0YXRlTnVsbEF0KSA+IDEwMDAwKSB7CiAgICAgICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5sb2dnZWROb1N0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBzdGF0ZSBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFNyYy9zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncycpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RTdGF0ZU51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgLy8gUGF1c2UvcGxheSBvciBmdWxseSByZWxvYWQgdGhlIFR3aXRjaCBwbGF5ZXIsIHByZXNlcnZpbmcgcXVhbGl0eS92b2x1bWUgc2V0dGluZ3MKICAgIGZ1bmN0aW9uIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQsIHJlbG9hZEtpbmQpIHsKICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgaWYgKCFwbGF5ZXJBbmRTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcmVhY3Qgcm9vdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckFuZFN0YXRlLnBsYXllcjsKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IHBsYXllckFuZFN0YXRlLnN0YXRlOwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXInKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXBsYXllclN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXIgc3RhdGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB3YXNQYXVzZWQgPSBwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkOwogICAgICAgIGlmICh3YXNQYXVzZWQpIHsKICAgICAgICAgICAgLy8gVXNlciBkZWxpYmVyYXRlbHkgcGF1c2VkIOKAlCByZXNwZWN0IHRoZWlyIGludGVudCwgZG9uJ3QgYXV0by1yZXN1bWUKICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZXNwZWN0aW5nIHVzZXIgcGF1c2UgaW50ZW50IOKAlCBza2lwcGluZyBhdXRvLXJlc3VtZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIFdFIHJlY2VudGx5IGNhbGxlZCBwYXVzZS9wbGF5IGFuZCBwbGF5ZXIgaXMgc3RpbGwgcGF1c2VkLCByZXRyeSBwbGF5IChzdHVjayBmcm9tIGF1dG9wbGF5IHBvbGljeSBvciBhZC1zdGF0ZSBpbnRlcmZlcmVuY2UpCiAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQpIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXdhc1BhdXNlZCkgewogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgPSAwOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQgJiYgZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQpIHsKICAgICAgICAgICAgLy8gU2tpcCByZWxvYWQgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IGhlYWx0aHkg4oCUIGF2b2lkcyBkaXNydXB0aW5nIHNtb290aCBwbGF5YmFjay4KICAgICAgICAgICAgLy8gQnV0IGlmIHdlJ3JlIHdheSBiZWhpbmQgbGl2ZSBlZGdlIChlLmcuIGFmdGVyIGEgbG9uZyBhZCBicmVhayksIHByb2NlZWQgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeS4KICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5yZWFkeVN0YXRlID49IDMgJiYgIXZpZGVvLnBhdXNlZCAmJiAhdmlkZW8uZW5kZWQpIHsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5U2VjID0gMDsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5S25vd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLnNlZWthYmxlICYmIHZpZGVvLnNlZWthYmxlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vla2FibGVFbmQgPSB2aWRlby5zZWVrYWJsZS5lbmQodmlkZW8uc2Vla2FibGUubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoc2Vla2FibGVFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxjID0gTWF0aC5tYXgoMCwgc2Vla2FibGVFbmQgLSB2aWRlby5jdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2FwOiB2YWx1ZXMgPjFoIGluZGljYXRlIGdhcmJhZ2UgZnJvbSB0aGUgTWVkaWEgU291cmNlIEFQSQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHNlZW4gcmlnaHQgYWZ0ZXIgYSByZWxvYWQgd2hpbGUgdGhlIHNlZWthYmxlIHJhbmdlIGlzIGluIGEgdHJhbnNpZW50IHN0YXRlKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxjIDwgMzYwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lTZWMgPSBjYWxjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lLbm93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgaWYgKCFsYXRlbmN5S25vd24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBMYXRlbmN5IHVua25vd24gKHNlZWthYmxlIHVuYXZhaWxhYmxlKSDigJQgcHJvY2VlZGluZyB3aXRoIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXRlbmN5U2VjID4gNykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBwbGF5aW5nIGJ1dCAnICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kIGxpdmUg4oCUIHByb2NlZWRpbmcgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeScpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIHBsYXllciBoZWFsdGh5IChyZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJywgcGxheWluZywgbGF0ZW5jeT0nICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MpJyk7CiAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1JlbG9hZFNraXBwZWQnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzUmVsb2FkKSB7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5UXVhbGl0eSA9ICd2aWRlby1xdWFsaXR5JzsKICAgICAgICAgICAgY29uc3QgbHNLZXlNdXRlZCA9ICd2aWRlby1tdXRlZCc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5Vm9sdW1lID0gJ3ZvbHVtZSc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5TG93TGF0ZW5jeSA9ICdsb3dMYXRlbmN5TW9kZUVuYWJsZWQnOy8vIFByZXNlcnZlIHVzZXIncyBsb3ctbGF0ZW5jeSB0b2dnbGUgYWNyb3NzIHJlbG9hZHMgKFRUVi1BQiBwYXJpdHkpCiAgICAgICAgICAgIGNvbnN0IGxzS2V5UGVyc2lzdGVuY2UgPSAncGVyc2lzdGVuY2VFbmFibGVkJzsvLyBQcmVzZXJ2ZSBhdXRvcGxheS9wZXJzaXN0ZW5jZSB0b2dnbGUgYWNyb3NzIHJlbG9hZHMgKFRUVi1BQiBwYXJpdHkpCiAgICAgICAgICAgIGxldCBjdXJyZW50UXVhbGl0eUxTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRNdXRlZExTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRWb2x1bWVMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50TG93TGF0ZW5jeUxTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRQZXJzaXN0ZW5jZUxTID0gbnVsbDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGN1cnJlbnRRdWFsaXR5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVF1YWxpdHkpOwogICAgICAgICAgICAgICAgY3VycmVudE11dGVkTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleU11dGVkKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRWb2x1bWVMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5Vm9sdW1lKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRMb3dMYXRlbmN5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleUxvd0xhdGVuY3kpOwogICAgICAgICAgICAgICAgY3VycmVudFBlcnNpc3RlbmNlTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVBlcnNpc3RlbmNlKTsKICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBKU09OLnN0cmluZ2lmeSh7ZGVmYXVsdDpwbGF5ZXIuY29yZS5zdGF0ZS5tdXRlZH0pKTsKICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVZvbHVtZSwgcGxheWVyLmNvcmUuc3RhdGUudm9sdW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwbGF5ZXI/LmNvcmU/LnN0YXRlPy5xdWFsaXR5Py5ncm91cCkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgSlNPTi5zdHJpbmdpZnkoe2RlZmF1bHQ6cGxheWVyLmNvcmUuc3RhdGUucXVhbGl0eS5ncm91cH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7Ly8gY2xlYXIgc3RhbGUgc3RhbGwgdGltZXIgc28gcG9zdC1yZWxvYWQgcmVhZHlTdGF0ZT0wIGlzbid0IGF0dHJpYnV0ZWQgdG8gcHJlLXJlbG9hZCBzdGFsbAogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgLy8gcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyByZS1hY3F1aXJlZCBmcmVzaCBldmVyeSB0aWNrIOKAlCBubyBtYW51YWwgaW52YWxpZGF0aW9uIG5lZWRlZAogICAgICAgICAgICAvLyBIYXJkIHJlbG9hZCBmb3IgJ2Vhcmx5JyAobWlkLWJyZWFrIGVzY2FwZSDigJQgZnJlc2ggc2Vzc2lvbiBnZXRzIG5ldyBhZC1kZWNpc2lvbiBidWNrZXQpLgogICAgICAgICAgICAvLyBTb2Z0IHJlbG9hZCBmb3IgJ3Bvc3QtYWQnIChzbW9vdGggdHJhbnNpdGlvbiwgbm8gYmxhY2sgc2NyZWVuIHRlYXJkb3duKS4KICAgICAgICAgICAgY29uc3QgaGFyZFJlbG9hZCA9IHJlbG9hZEtpbmQgPT09ICdlYXJseSc7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFJlbG9hZGluZyBUd2l0Y2ggcGxheWVyJyArIChoYXJkUmVsb2FkID8gJyAoaGFyZCknIDogJyAoc29mdCknKSk7CiAgICAgICAgICAgIC8vIFByZS1tdXRlIHRocm91Z2ggaGFyZCByZWxvYWQgdG8gaGlkZSBNU0UtdGVhcmRvd24gYXVkaW8gY2xpY2s7IHJlc3RvcmVkIG9uCiAgICAgICAgICAgIC8vIGBjYW5wbGF5YCB3aXRoIDE1MDBtcyBzYWZldHkgY2FwLiBTa2lwcGVkIGlmIHVzZXIgYWxyZWFkeSBtdXRlZC4KICAgICAgICAgICAgaWYgKGhhcmRSZWxvYWQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FzSW5pdGlhbGx5VW5tdXRlZCA9IHYgJiYgIXYubXV0ZWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgIzIwMCBmaXg6IGFsc28gc2V0IHVwIHJlc3RvcmUrYmFja3N0b3Agd2hlbiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5CiAgICAgICAgICAgICAgICAgICAgLy8gbXV0ZWQgSUYgdmFmdCBoYXMgc3VjY2Vzc2Z1bGx5IHVubXV0ZWQgYXQgYW55IHBvaW50IGVhcmxpZXIgdGhpcyBzZXNzaW9uLgogICAgICAgICAgICAgICAgICAgIC8vIFN0cm9uZyBzaWduYWwgb2YgVHdpdGNoJ3Mgc2lsZW50IHJlLW11dGUgcGF0dGVybiByYXRoZXIgdGhhbiB1c2VyLWluaXRpYXRlZAogICAgICAgICAgICAgICAgICAgIC8vIG11dGUuIEZpcnN0LXNlc3Npb24tbXV0ZSB1c2VycyBoYXZlIHZhZnRFdmVyVW5tdXRlZD1mYWxzZSDihpIgYmFja3N0b3AgbmV2ZXIKICAgICAgICAgICAgICAgICAgICAvLyBlbmdhZ2VzIOKGkiBtdXRlIHJlc3BlY3RlZC4gRGlzYWJsZWQgYnkgdHdpdGNoQWRTb2x1dGlvbnNfcmVjb3ZlckZyb21TaWxlbnRNdXRlPQogICAgICAgICAgICAgICAgICAgIC8vIGZhbHNlIGZvciB1c2VycyB3aG8gZGVsaWJlcmF0ZWx5IG11dGUgbWlkLXNlc3Npb24uCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVjb3ZlciA9IHBsYXllckJ1ZmZlclN0YXRlLnZhZnRFdmVyVW5tdXRlZCAmJiBSZWNvdmVyRnJvbVNpbGVudE11dGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgKHdhc0luaXRpYWxseVVubXV0ZWQgfHwgc2hvdWxkUmVjb3ZlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0luaXRpYWxseVVubXV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubXV0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11bHRpLWV2ZW50IHJlc3RvcmU6IEVkZ2UgZmlyZXMgbG9hZGVkZGF0YS9wbGF5aW5nIGluZGVwZW5kZW50bHkgb2YKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FucGxheTsgZmlyc3QtZmlyZWQgd2lucyB2aWEgdGhlIGlkZW1wb3RlbnQgYGRvbmVgIGd1YXJkLgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN0b3JlID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2FucGxheScsIGxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCBsaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnZhZnRFdmVyVW5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSA9PT0gJ1ZJREVPJykgcmVzdG9yZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjYW5wbGF5JywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc3RvcmUsIDQwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBCYWNrc3RvcDogcmUtY2hlY2sgYXQgNTUwMG1zLiBUd2l0Y2gncyBMUy1yZXN0b3JlIGF0IH4zMDAwbXMgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW11dGUgcG9zdC1yZXN0b3JlIGlmIGl0IGNhcHR1cmVkIGEgbXV0ZWQgc25hcHNob3QuIElkZW1wb3RlbnQuCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgJiYgY3VyLm11dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEhhcmQgcmVsb2FkIGJhY2tzdG9wIFNLSVBQRUQg4oCUIGVsZW1lbnQgbXV0ZWQgYXQgNTUwMG1zIGJ1dCB1c2VyUGF1c2VJbnRlbnQgc2V0IChsaWtlbHkgZmFsc2UtcG9zaXRpdmUgcGF1c2UgZXZlbnQgZHVyaW5nIE1TRSB0ZWFyZG93biDigJQgaXNzdWUgIzIwMCBmb2xsb3ctdXApJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIubXV0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnZhZnRFdmVyVW5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBIYXJkIHJlbG9hZCBiYWNrc3RvcCB1bm11dGUgZmlyZWQg4oCUIGVsZW1lbnQgd2FzIHN0aWxsIG11dGVkIGF0IDU1MDBtcyAoaW5pdGlhbDogJyArICh3YXNJbml0aWFsbHlVbm11dGVkID8gJ3VubXV0ZWQsIHdlIHByZS1tdXRlZCcgOiAnYWxyZWFkeS1tdXRlZCBvbiBlbnRyeSDigJQgcmVjb3ZlcmluZyBmcm9tIHNpbGVudCBUd2l0Y2ggcmUtbXV0ZScpICsgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTUwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNldCB3ZUp1c3RQYXVzZWQgc28gdGhlIHBhdXNlLWxpc3RlbmVyIGZpbHRlcnMgb3V0IHRoZSBNU0UtdGVhcmRvd24KICAgICAgICAgICAgLy8gcGF1c2UgZXZlbnQgVHdpdGNoIGRpc3BhdGNoZXMgb24gdGhlIG9sZCA8dmlkZW8+IGR1cmluZyBzZXRTcmMuCiAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdXNlclBhdXNlSW50ZW50IHdvdWxkIGZhbHNlbHkgZmxpcCB0byB0cnVlIGR1cmluZyB0aGUKICAgICAgICAgICAgLy8gcmVsb2FkIHdpbmRvdywgYmxvY2tpbmcgdGhlIDU1MDBtcyBiYWNrc3RvcCdzIHVubXV0ZSBvbiBzdHVjay1tdXRlZAogICAgICAgICAgICAvLyByZWNvdmVyeSAoaXNzdWUgIzIwMCBmb2xsb3ctdXApLgogICAgICAgICAgICBpZiAoaGFyZFJlbG9hZCkgewogICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwbGF5ZXJTdGF0ZS5zZXRTcmMoeyBpc05ld01lZGlhUGxheWVySW5zdGFuY2U6IGhhcmRSZWxvYWQsIHJlZnJlc2hBY2Nlc3NUb2tlbjogaGFyZFJlbG9hZCB9KTsKICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1RyaWdnZXJlZFBsYXllclJlbG9hZCcpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgICAgIC8vIEJsb2NrIG11c3QgYWx3YXlzIHJ1bjogaWYgVHdpdGNoIGhhc24ndCB3cml0dGVuIExTIHZhbHVlcyB5ZXQgKGZyZXNoIHNlc3Npb24sIHByaXZhdGUgbW9kZSwKICAgICAgICAgICAgLy8gY2xlYXJlZCBjYWNoZSksIHRoZSB2aWRlbyBzdGlsbCBuZWVkcyB1bm11dGUgYWZ0ZXIgQ2hyb21lJ3MgYXV0b3BsYXkgbXV0ZSBvbiByZWxvYWQuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIGN1cnJlbnRRdWFsaXR5TFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlNdXRlZCwgY3VycmVudE11dGVkTFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBjdXJyZW50Vm9sdW1lTFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG93TGF0ZW5jeUxTICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleUxvd0xhdGVuY3ksIGN1cnJlbnRMb3dMYXRlbmN5TFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGVyc2lzdGVuY2VMUyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlQZXJzaXN0ZW5jZSwgY3VycmVudFBlcnNpc3RlbmNlTFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwZWN0IHVzZXIncyBtdXRlIGludGVudDogb25seSBmb3JjZS11bm11dGUgaWYgTFMgZGlkbid0IHNheSBtdXRlLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUd2l0Y2ggd3JpdGVzIHZpZGVvLW11dGVkIGFzICd7ImRlZmF1bHQiOnRydWV9JyB3aGVuIHVzZXIgbXV0ZWQgdmlhIFVJOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJJbnRlbmRlZE11dGUgPSBjdXJyZW50TXV0ZWRMUyAmJiBjdXJyZW50TXV0ZWRMUy5pbmNsdWRlcygnImRlZmF1bHQiOnRydWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwICYmIHZpZGVvc1swXS5tdXRlZCAmJiAhdXNlckludGVuZGVkTXV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCBsaXZlIGRyaWZ0IGFmdGVyIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGhhcmQgcmVsb2FkIHdpdGggbGFyZ2UgZHJpZnQgKD41cyksIGhhcmQtc2VlayB0byBsaXZlIGVkZ2UgdG8gZmx1c2gKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IEEvViB0aW1lc3RhbXAgZGVzeW5jIGZyb20gc3RyaXArQkxBTktfTVA0K3JlY292ZXJ5IGFjdGl2aXR5LiBEcmlmdAogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0aW9uIGF0IDEuMXggd291bGQgdGFrZSBtaW51dGVzIHRvIGNhdGNoIHVwIDMwLTYwcyBvZiBkcmlmdC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHNvZnQgcmVsb2FkIG9yIHNtYWxsIGRyaWZ0LCB1c2UgZXhpc3RpbmcgZ3JhZHVhbCBjYXRjaC11cC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwICYmIHZpZGVvc1swXS5idWZmZXJlZC5sZW5ndGggPiAwICYmIHZpZGVvc1swXS5yZWFkeVN0YXRlID49IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpdmVFZGdlID0gdmlkZW9zWzBdLmJ1ZmZlcmVkLmVuZCh2aWRlb3NbMF0uYnVmZmVyZWQubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkcmlmdCA9IGxpdmVFZGdlIC0gdmlkZW9zWzBdLmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhcmRSZWxvYWQgJiYgZHJpZnQgPiA1ICYmIE51bWJlci5pc0Zpbml0ZShsaXZlRWRnZSkgJiYgbGl2ZUVkZ2UgPCAzNjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1oYXJkLXJlbG9hZCBzZWVrIHRvIGxpdmUg4oCUICcgKyBkcmlmdC50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kLCBqdW1waW5nIHRvIGxpdmUgZWRnZSB0byBmbHVzaCBBL1YgZHJpZnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0uY3VycmVudFRpbWUgPSBsaXZlRWRnZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJpZnQgPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1yZWxvYWQgbGl2ZSBkcmlmdCBjb3JyZWN0aW9uOiAnICsgZHJpZnQudG9GaXhlZCgxKSArICdzIGJlaGluZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHZpZGVvc1swXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgd2luZG93LnJlbG9hZFR3aXRjaFBsYXllciA9ICgpID0+IHsKICAgICAgICBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUpOwogICAgfTsKICAgIGZ1bmN0aW9uIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKGtleSwgdmFsdWUpIHsKICAgICAgICB0d2l0Y2hXb3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gewogICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2tleToga2V5LCB2YWx1ZTogdmFsdWV9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVdvcmtlckZldGNoUmVxdWVzdChmZXRjaFJlcXVlc3QpIHsKICAgICAgICAvLyA1cyBBYm9ydENvbnRyb2xsZXIgdGltZW91dCDigJQgYm91bmRzIHdvcnN0LWNhc2Ugd2FpdCB3aGVuIFR3aXRjaCBHUUwgaGFuZ3MuCiAgICAgICAgLy8gQWJvcnRFcnJvciBmbG93cyB0aHJvdWdoIHRoZSBleGlzdGluZyBjYXRjaCArIEZhaWxlZEJhY2t1cFBsYXllclR5cGVzIGxvY2tvdXQuCiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSA1MDAwOwogICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0TXMpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCB7CiAgICAgICAgICAgICAgICAuLi5mZXRjaFJlcXVlc3Qub3B0aW9ucywKICAgICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0gewogICAgICAgICAgICAgICAgaWQ6IGZldGNoUmVxdWVzdC5pZCwKICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgIG9rOiByZXNwb25zZS5vaywKICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQ6IHJlc3BvbnNlLnJlZGlyZWN0ZWQsCiAgICAgICAgICAgICAgICB0eXBlOiByZXNwb25zZS50eXBlLAogICAgICAgICAgICAgICAgdXJsOiByZXNwb25zZS51cmwsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMocmVzcG9uc2UuaGVhZGVycy5lbnRyaWVzKCkpLAogICAgICAgICAgICAgICAgYm9keTogcmVzcG9uc2VCb2R5CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdDsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGlkOiBmZXRjaFJlcXVlc3QuaWQsCiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InID8gJ0dRTCBmZXRjaCB0aW1lb3V0ICgnICsgKHRpbWVvdXRNcyAvIDEwMDApICsgJ3MpJyA6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICAvLyBIb29rIGZldGNoKCkgaW4gdGhlIHdpbmRvdyBzY29wZSB0byBjYXB0dXJlIGF1dGggaGVhZGVycyBhbmQgbW9kaWZ5IHBsYXllciB0eXBlIHJlcXVlc3RzCiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0KSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBHUUxEZXZpY2VJRCAhPSBkZXZpY2VJZCkgewogICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlRGV2aWNlSWQnLCBHUUxEZXZpY2VJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1WZXJzaW9uJ10gIT09IENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uID0gaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXSAhPT0gQ2xpZW50U2Vzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50U2Vzc2lvbicsIENsaWVudFNlc3Npb24gPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSAhPT0gQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInLCBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddICE9PSBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWRIZWFkZXJzICYmIEdRTERldmljZUlEICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChHUUxEZXZpY2VJRCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VkUGxheWVyVHlwZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gSlNPTi5wYXJzZShpbml0LmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdCb2R5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW0FEIERFQlVHXSBSZXBsYWNlZCAnJHtyZXBsYWNlZFBsYXllclR5cGV9JyBwbGF5ZXIgdHlwZSB3aXRoICcke0ZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlfScgcGxheWVyIHR5cGVgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KG5ld0JvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZWRnZS5hZHMudHdpdGNoLnR2JykpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRDc2FpVHlwZXMuaGFzKGNzYWlUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZWRDc2FpVHlwZXMuYWRkKGNzYWlUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUgKyAnIChjbGllbnQtc2lkZSBhZCBpbnNlcnRpb24sIG5vdCBibG9ja2FibGUgdmlhIG0zdTgpJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LCAnZmV0Y2gnKTsKICAgIH0KICAgIC8vIFNldCB1cCB2aXNpYmlsaXR5IG92ZXJyaWRlcyBhbmQgbG9jYWxTdG9yYWdlIGhvb2tzIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBhY3Jvc3MgcmVsb2FkcwogICAgZnVuY3Rpb24gb25Db250ZW50TG9hZGVkKCkgewogICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V2ZW50di1leHRlbnNpb24nKSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXYXJuaW5nOiA3VFYgZXh0ZW5zaW9uIGRldGVjdGVkIOKAlCBtYXkgY2F1c2UgYmxhY2sgc2NyZWVuIG9yIGJ1ZmZlcmluZyBpc3N1ZXMuIElmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zLCB0cnkgZGlzYWJsaW5nIDdUVi4nKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVzdW1lIHRoZSBwbGF5ZXIgb24gdGFiIGZvY3VzIGlmIFR3aXRjaCBwYXVzZWQgaXQgZHVyaW5nIGFuIGFkIG9uIGEgaGlkZGVuIHRhYi4KICAgICAgICAvLyBQcmV2aW91c2x5IGFsc28gc3Bvb2ZlZCBkb2N1bWVudC5oaWRkZW4gLyB2aXNpYmlsaXR5U3RhdGUgLyBoYXNGb2N1cyBhbmQgc3dhbGxvd2VkCiAgICAgICAgLy8gdGhlIGV2ZW50cyBvbiB0aGUgY2FwdHVyZSBwaGFzZS4gVGhhdCBicm9rZSBvdGhlciBleHRlbnNpb25zIHRoYXQga2V5IG9mZiByZWFsCiAgICAgICAgLy8gdmlzaWJpbGl0eSAoZS5nLiBCZXR0ZXJUVFYgIk11dGUgSW52aXNpYmxlIFBsYXllciIpLiBSZXN1bWUtb24tZm9jdXMgYWxvbmUgaXMKICAgICAgICAvLyBlbm91Z2ggdG8ga2VlcCBwbGF5YmFjayBhbGl2ZSBhY3Jvc3MgaGlkZGVu4oaSdmlzaWJsZSB0cmFuc2l0aW9ucyBkdXJpbmcgYWRzLgogICAgICAgIC8vIFN5bmMnZCB3aXRoIFRUVi1BQiB2Ni41LjAuCiAgICAgICAgbGV0IHdhc1ZpZGVvUGxheWluZyA9IHRydWU7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eUNoYW5nZSA9ICgpID0+IHsKICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID09PSAwKSByZXR1cm47CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5oaWRkZW4pIHsKICAgICAgICAgICAgICAgIHdhc1ZpZGVvUGxheWluZyA9ICF2aWRlb3NbMF0ucGF1c2VkICYmICF2aWRlb3NbMF0uZW5kZWQ7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgdmlkZW9zWzBdLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlKTsKICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBkZWNsYXJlT3B0aW9ucyh3aW5kb3cpOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBsc1JlbG9hZEFmdGVyQWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkUGxheWVyQWZ0ZXJBZCcpOwogICAgICAgIGlmIChsc1JlbG9hZEFmdGVyQWQgIT09IG51bGwpIHsKICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IGxzUmVsb2FkQWZ0ZXJBZCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc1JlbG9hZENvb2xkb3duID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZENvb2xkb3duU2Vjb25kcycpKTsKICAgICAgICBpZiAoIWlzTmFOKGxzUmVsb2FkQ29vbGRvd24pICYmIGxzUmVsb2FkQ29vbGRvd24gPj0gMCkgewogICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSBsc1JlbG9hZENvb2xkb3duOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVSZWxvYWRDYXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcCcpOwogICAgICAgIGlmIChsc0Rpc2FibGVSZWxvYWRDYXAgIT09IG51bGwpIHsKICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9IGxzRGlzYWJsZVJlbG9hZENhcCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0RyaWZ0UmF0ZSA9IHBhcnNlRmxvYXQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2RyaWZ0Q29ycmVjdGlvblJhdGUnKSk7CiAgICAgICAgaWYgKCFpc05hTihsc0RyaWZ0UmF0ZSkgJiYgbHNEcmlmdFJhdGUgPj0gMCkgewogICAgICAgICAgICBEcmlmdENvcnJlY3Rpb25SYXRlID0gbHNEcmlmdFJhdGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGxheWVyVHlwZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19wbGF5ZXJUeXBlJyk7CiAgICAgICAgaWYgKGxzUGxheWVyVHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9IGxzUGxheWVyVHlwZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQaW5CYWNrdXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcGluQmFja3VwUGxheWVyVHlwZScpOwogICAgICAgIGlmIChsc1BpbkJhY2t1cCAhPT0gbnVsbCkgewogICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gbHNQaW5CYWNrdXAgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQcmVmZXJMb3cgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcHJlZmVyTG93UXVhbGl0eUJhY2t1cCcpOwogICAgICAgIGlmIChsc1ByZWZlckxvdyA9PT0gJ2ZhbHNlJykgewogICAgICAgICAgICBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgc3RpY2t5IENTQUkgcGF0aCBvbmx5LCBubyBhdXRvcGxheSBmYWxsYmFjayBvciBlc2NhcGUgaGF0Y2gnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNGYXN0QXV0b3BsYXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZmFzdEF1dG9wbGF5Rmlyc3RUcnknKTsKICAgICAgICBpZiAobHNGYXN0QXV0b3BsYXkgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgRmFzdEF1dG9wbGF5Rmlyc3RUcnkgPSBmYWxzZTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFzdEF1dG9wbGF5Rmlyc3RUcnkgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgZnVsbCBTb3VyY2UtdGllciBwcm9iZSBvbiBldmVyeSBicmVhaycpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0JhY2t1cFN3YXBGaXJzdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19iYWNrdXBTd2FwRmlyc3QnKTsKICAgICAgICBpZiAobHNCYWNrdXBTd2FwRmlyc3QgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgQmFja3VwU3dhcEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cFN3YXBGaXJzdCBkaXNhYmxlZCB2aWEgbG9jYWxTdG9yYWdlIOKAlCB1c2luZyBzdGlja3kgQ1NBSSBwYXRoIChzdHJpcCBvbiBuYXRpdmUgc3RyZWFtKScpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVBZFNwb29maW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2Rpc2FibGVBZFNwb29maW5nJyk7CiAgICAgICAgaWYgKGxzRGlzYWJsZUFkU3Bvb2ZpbmcgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgRGlzYWJsZUFkU3Bvb2ZpbmcgPSBmYWxzZTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTcG9vZmluZyBlbmFibGVkIHZpYSBsb2NhbFN0b3JhZ2Ugb3B0LWluIOKAlCBmaXJpbmcgR1FMIGFkLXRyYWNraW5nIGJlYWNvbnMnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNSZWNvdmVyRnJvbVNpbGVudE11dGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVjb3ZlckZyb21TaWxlbnRNdXRlJyk7CiAgICAgICAgaWYgKGxzUmVjb3ZlckZyb21TaWxlbnRNdXRlID09PSAnZmFsc2UnKSB7CiAgICAgICAgICAgIFJlY292ZXJGcm9tU2lsZW50TXV0ZSA9IGZhbHNlOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZWNvdmVyRnJvbVNpbGVudE11dGUgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgaGFyZC1yZWxvYWQgYmFja3N0b3AgcmVzcGVjdHMgYWxyZWFkeS1tdXRlZCBzdGF0ZSwgbWlkLXNlc3Npb24gbWFudWFsIG11dGVzIHByZXNlcnZlZCBhY3Jvc3MgcmVsb2FkcycpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0hpZGVBZE92ZXJsYXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfaGlkZUFkT3ZlcmxheScpOwogICAgICAgIGlmIChsc0hpZGVBZE92ZXJsYXkgPT09ICd0cnVlJykgewogICAgICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gJy50YXMtYWRibG9jay1vdmVybGF5IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9JzsKICAgICAgICAgICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgfQogICAgfSBjYXRjaCB7fQogICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ29uZmlnOiBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJyArIFJlbG9hZFBsYXllckFmdGVyQWQgKyAnLCBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9ICcgKyBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSArICcsIFBpbkJhY2t1cFBsYXllclR5cGUgPSAnICsgUGluQmFja3VwUGxheWVyVHlwZSk7CiAgICBob29rV2luZG93V29ya2VyKCk7CiAgICBob29rRmV0Y2goKTsKICAgIGNvbnN0IHJlYWxYSFJPcGVuID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW47CiAgICBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbiA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbihtZXRob2QsIHVybCkgewogICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiB1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgIGNvbnN0IGNzYWlUeXBlID0gdXJsLmluY2x1ZGVzKCdicD1taWRyb2xsJykgPyAnbWlkcm9sbCcgOiB1cmwuaW5jbHVkZXMoJ2JwPXByZXJvbGwnKSA/ICdwcmVyb2xsJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgY29uc3QgeGhyS2V5ID0gY3NhaVR5cGUgKyAnLXhocic7CiAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyh4aHJLZXkpKSB7CiAgICAgICAgICAgICAgICBsb2dnZWRDc2FpVHlwZXMuYWRkKHhocktleSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDU0FJIGFkIHJlcXVlc3QgKFhIUikgZGV0ZWN0ZWQg4oCUIHR5cGU6ICcgKyBjc2FpVHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlYWxYSFJPcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9LCAnb3BlbicpOwogICAgaWYgKFBsYXllckJ1ZmZlcmluZ0ZpeCkgewogICAgICAgIG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcoKTsKICAgIH0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJpbnRlcmFjdGl2ZSIpIHsKICAgICAgICBvbkNvbnRlbnRMb2FkZWQoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICAgICAgfSk7CiAgICB9CiAgICB3aW5kb3cuc2ltdWxhdGVBZHMgPSAoZGVwdGgpID0+IHsKICAgICAgICBpZiAoZGVwdGggPT09IHVuZGVmaW5lZCB8fCBkZXB0aCA8IDApIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkIGRlcHRoIHBhcmFtZXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIGluc3RhbmNlCiAgICAvLyB0aGF0IGZpZ2h0cyBmb3IgcGxheWVyIGNvbnRyb2wuIE9ubHkgdGhlIHRvcCBmcmFtZSBob3N0cyB0aGUgcGxheWVyIG9uIHR3aXRjaC50di9DSEFOTkVMOwogICAgLy8gbmVzdGVkIGF1eGlsaWFyeSBmcmFtZXMgYXJlIG5vaXNlLgogICAgLy8gQWxsb3ctbGlzdCBmb3IgbmVzdGVkLWZyYW1lIGluamVjdGlvbjogVHdpdGNoJ3MgdGhyZWUgZG9jdW1lbnRlZCBlbWJlZCBjb250ZXh0cwogICAgLy8gKGh0dHBzOi8vZGV2LnR3aXRjaC50di9kb2NzL2VtYmVkL3ZpZGVvLWFuZC1jbGlwcy8pIOKAlCBwcmVzZXJ2ZXMgVHdpdGNoIHN0cmVhbXMKICAgIC8vIGVtYmVkZGVkIG9uIHRoaXJkLXBhcnR5IHNpdGVzIHdoZXJlIHRoZSBzY3JpcHQgcnVucyBpbiBhbiBpZnJhbWUgd2hvc2UgcGFyZW50CiAgICAvLyBpcyBvbiBhIGRpZmZlcmVudCBvcmlnaW4uCiAgICAvLyBVc2Ugd2luZG93LmZyYW1lRWxlbWVudCB0byBkZXRlY3QgbmVzdGVkIGZyYW1lcyDigJQgbnVsbCBvbiB0b3AgZnJhbWUsIHRoZSBpZnJhbWUKICAgIC8vIGVsZW1lbnQgb24gYSBzYW1lLW9yaWdpbiBuZXN0ZWQgZnJhbWUsIHRocm93cyBvbiBhIGNyb3NzLW9yaWdpbiBuZXN0ZWQgZnJhbWUuCiAgICAvLyBNb3JlIHJlbGlhYmxlIHRoYW4gJ3dpbmRvdyAhPT0gd2luZG93LnRvcCcgYmVjYXVzZSBUYW1wZXJtb25rZXkgd3JhcHMgd2luZG93IGluIGEKICAgIC8vIHByb3h5IHdoZXJlIHRoZSBzdHJpY3QgY29tcGFyaXNvbiBjYW4gcmV0dXJuIHRydWUgZXZlbiBvbiB0aGUgdG9wIGZyYW1lLgogICAgbGV0IF9pc05lc3RlZCA9IGZhbHNlOwogICAgdHJ5IHsgX2lzTmVzdGVkID0gd2luZG93LmZyYW1lRWxlbWVudCAhPT0gbnVsbDsgfSBjYXRjaCAoX2UpIHsgX2lzTmVzdGVkID0gdHJ1ZTsgfQogICAgaWYgKF9pc05lc3RlZCkgewogICAgICAgIGNvbnN0IF9ob3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2lzRW1iZWRDb250ZXh0ID0gX2hvc3QgPT09ICdwbGF5ZXIudHdpdGNoLnR2JyB8fCBfaG9zdCA9PT0gJ2VtYmVkLnR3aXRjaC50dicgfHwgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2VtYmVkLycpOwogICAgICAgIGlmICghX2lzRW1iZWRDb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZpZGVvLXN3YXAtbmV3IHNraXBwZWQg4oCUIG5lc3RlZCBmcmFtZSBvbiAnICsgX2hvc3QgKyBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSArICcgKG5vdCBhIFR3aXRjaCBlbWJlZCkuIElmIHlvdSBzZWUgdGhpcyBvbiB0d2l0Y2gudHYvQ0hBTk5FTCB0b3AgZnJhbWUsIHBsZWFzZSByZXBvcnQuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBvbiB0aGUgVHdpdGNoIGNsaXAgZWRpdG9yIOKAlCBjbGlwcy50d2l0Y2gudHYgaG9zdCBvciAvPGNoYW5uZWw+L2NsaXAvPHNsdWc+IHBhdGguCiAgICAvLyBPdXIgZmV0Y2gvV29ya2VyIGhvb2tzIGFuZCBidWZmZXIgbW9uaXRvciBhcmUgYWltZWQgYXQgdGhlIGxpdmUgY2hhbm5lbCBwbGF5ZXI7IG9uIHRoZQogICAgLy8gY2xpcCBlZGl0b3IncyBzZWVrYWJsZSBwcmV2aWV3IHRoZXkgaGF2ZSBubyBhZHMgdG8gYWN0IG9uIGFuZCBoYXZlIGNhdXNlZCB0aGUgcHJldmlldwogICAgLy8gdG8gZnJlZXplIHdoZW4gdGhlIHVzZXIgZHJhZ3MgdGhlIHRyaW0gcmFuZ2UuIChTeW5jJ2Qgd2l0aCBUVFYtQUIgdjYuNC45LikKICAgIHsKICAgICAgICBjb25zdCBfY2xpcEhvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfY2xpcFBhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSB8fCAnJzsKICAgICAgICBpZiAoX2NsaXBIb3N0ID09PSAnY2xpcHMudHdpdGNoLnR2JyB8fCAvXlwvW14vXStcL2NsaXBcL1teL10rLy50ZXN0KF9jbGlwUGF0aCkpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmlkZW8tc3dhcC1uZXcgc2tpcHBlZCDigJQgY2xpcCBlZGl0b3IgcGFnZSAoJyArIF9jbGlwSG9zdCArIF9jbGlwUGF0aCArICcpLicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gNTQ7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2aWRlby1zd2FwLW5ldyB2JyArIG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICcgbG9hZGluZycpOwogICAgaWYgKHR5cGVvZiB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID49IG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbikgewogICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENPTkZMSUNUOiB2aWRlby1zd2FwLW5ldyB2JyArIG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICcgc2tpcHBlZCDigJQgYW5vdGhlciBzY3JpcHQgYWxyZWFkeSBhY3RpdmUgKHYnICsgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICcpLiBSZW1vdmUgZHVwbGljYXRlIHNjcmlwdHMuJyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiA9IG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbjsKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gT3B0aW9ucyAvIGdsb2JhbHMKICAgICAgICAvLyAnZW1iZWQnIG1vdmVkIHRvIGVuZCDigJQgZmllbGQtb2JzZXJ2ZWQgVHdpdGNoIHJldHVybnMgR1FMICdzZXJ2ZXIgZXJyb3InIGZvcgogICAgICAgIC8vIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gb24gZW1iZWQgd2hlbiByZXF1ZXN0ZWQgZnJvbSB0d2l0Y2gudHYgb3JpZ2luLgogICAgICAgIHNjb3BlLk9QVF9CQUNLVVBfUExBWUVSX1RZUEVTID0gWyAncG9wb3V0JywgJ21vYmlsZV93ZWInLCAnZW1iZWQnIF07CiAgICAgICAgc2NvcGUuT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSA9ICdwb3BvdXQnOwogICAgICAgIC8vICd0d2l0Y2gtc3RpdGNoZWQnIGNhdGNoZXMgdGhlIHR3aXRjaC1zdGl0Y2hlZC0qIERBVEVSQU5HRSBjbGFzcyBmYW1pbHkKICAgICAgICAvLyAoLWFkLCAtbWlkLCAtcG9kLCBldGMuKSB3aXRob3V0IHJlcXVpcmluZyBhbiBleGFjdCAtYWQgc3VmZml4LiBUd2l0Y2gtCiAgICAgICAgLy8gcHJlZml4ZWQgc28gd2UgZG9uJ3QgcmUtaW50cm9kdWNlIHRoZSBQUiAjMTIwIGZhbHNlLXBvc2l0aXZlIGZyb20gYmFyZQogICAgICAgIC8vICdzdGl0Y2hlZCcgc3Vic3RyaW5nIG1hdGNoLgogICAgICAgIHNjb3BlLkFEX1NJR05JRklFUlMgPSBbJ3N0aXRjaGVkLWFkJywgJ0VYVC1YLUNVRS1PVVQnLCAndHdpdGNoLXN0aXRjaGVkJywgJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0idHdpdGNoLW1hZi1hZCInLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtdHJpZ2dlciInXTsKICAgICAgICAvLyBDb25maXJtZWQgc2Vzc2lvbi9zb3VyY2UgbWV0YWRhdGEsIG5ldmVyIGFkIG1hcmtlcnMg4oCUIGZpbHRlciBmcm9tIGNhbmRpZGF0ZSBsb2cuCiAgICAgICAgc2NvcGUuS05PV05fTk9OX0FEX1NJR05JRklFUlMgPSBbJ3R3aXRjaC1zZXNzaW9uJywgJ3R3aXRjaC1zdHJlYW0tc291cmNlJywgJ3R3aXRjaC1hZC1xdWFydGlsZScsICd0d2l0Y2gtYXNzaWdubWVudCddOwogICAgICAgIHNjb3BlLkFEX1NFR01FTlRfVVJMX1BBVFRFUk5TID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24uCiAgICAgICAgc2NvcGUuVFdJVENIX0FEX1VSTF9SRVdSSVRFX1JFR0VYID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVVJJX0FUVFJJQlVURV9SRUdFWCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5MSVZFX1NJR05JRklFUiA9ICcsbGl2ZSc7CiAgICAgICAgc2NvcGUuQ0xJRU5UX0lEID0gJ2tpbW5lNzhreDNuY3g2YnJnbzRtdjZ3a2k1aDFrbyc7CiAgICAgICAgLy8gVGhlc2UgYXJlIG9ubHkgcmVhbGx5IGZvciBXb3JrZXIgc2NvcGUuLi4KICAgICAgICBzY29wZS5TdHJlYW1JbmZvcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3NCeVVybCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgLy8gTmVlZCB0aGlzIGluIGJvdGggc2NvcGVzLiBXaW5kb3cgc2NvcGUgbmVlZHMgdG8gdXBkYXRlIHRoaXMgdG8gd29ya2VyIHNjb3BlLgogICAgICAgIHNjb3BlLmdxbF9kZXZpY2VfaWQgPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudEludGVncml0eUhlYWRlciA9IG51bGw7CiAgICAgICAgc2NvcGUuQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZDsKICAgICAgICBzY29wZS5TaW11bGF0ZWRBZHNEZXB0aCA9IDA7CiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IHRydWU7Ly8gQWZ0ZXIgdGhlIGFkIGZpbmlzaGVzIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5SZWxvYWRDb29sZG93blNlY29uZHMgPSAzMDsvLyBNaW5pbXVtIHNlY29uZHMgYmV0d2VlbiByZWxvYWRzIOKAlCBicmVha3MgQ1NBSSBjYXNjYWRlcyB0cmlnZ2VyZWQgYnkgcmVsb2FkCiAgICAgICAgc2NvcGUuRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gNTsvLyBBbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIGVhcmx5IHJlbG9hZCAofjJzIGVhY2gsIHNvIDUgPSB+MTBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gZmFsc2U7Ly8gSWYgdHJ1ZSwgcmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvTWF4QWdlTXMgPSAzMCAqIDYwICogMTAwMDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIEVuY29kaW5nczogbnVsbCwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzOiBudWxsLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NTdGF0dXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4OiAtMSwKICAgICAgICAgICAgUGlubmVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgSGFzQ2hlY2tlZFVua25vd25UYWdzOiBmYWxzZSwKICAgICAgICAgICAgSGFzQ29uZmlybWVkQWRBdHRyczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICAgICAgSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3M6IGZhbHNlLAogICAgICAgICAgICBJc01pZHJvbGw6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIENsZWFuUGxheWxpc3RDb3VudDogMCwKICAgICAgICAgICAgUGVuZGluZ0FkRW5kQXQ6IDAsCiAgICAgICAgICAgIEFkRW5kQm91bmNlQ291bnQ6IDAsCiAgICAgICAgICAgIENvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzOiAwLAogICAgICAgICAgICBVc2VGYWxsYmFja1N0cmVhbTogZmFsc2UsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZU0zVTg6IG51bGwsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQ6IDAsCiAgICAgICAgICAgIENvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xsczogMCwKICAgICAgICAgICAgRWFybHlSZWxvYWRUcmlnZ2VyZWQ6IGZhbHNlLAogICAgICAgICAgICBMYXN0UGxheWVyUmVsb2FkOiAwLAogICAgICAgICAgICBSZWxvYWRUaW1lc3RhbXBzOiBbXSwKICAgICAgICAgICAgLy8gRGV0ZWN0aW9uIGRpYWdub3N0aWNzCiAgICAgICAgICAgIExvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uOiBmYWxzZSwKICAgICAgICAgICAgQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXM6IDAsCiAgICAgICAgICAgIExvZ2dlZFRva2VuRmFpbHVyZVN0cmVhazogZmFsc2UsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hc2tBc05hdGl2ZShmbiwgbmFtZSkgewogICAgICAgIGZuLnRvU3RyaW5nID0gKCkgPT4gJ2Z1bmN0aW9uICcgKyBuYW1lICsgJygpIHsgW25hdGl2ZSBjb2RlXSB9JzsKICAgICAgICByZXR1cm4gZm47CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5VcmxzLmZvckVhY2goKF8sIHVybCkgPT4geyBkZWxldGUgU3RyZWFtSW5mb3NCeVVybFt1cmxdOyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjb25zdCBsb2dnZWRDc2FpVHlwZXMgPSBuZXcgU2V0KCk7CiAgICBsZXQgdHdpdGNoUGxheWVyQW5kU3RhdGUgPSBudWxsOwogICAgbGV0IGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgPSBmYWxzZTsKICAgIGxldCBsYXN0UmVsb2FkVGltZXN0YW1wID0gMDsKICAgIGxldCByZWxvYWRUaW1lc3RhbXBzID0gW107CiAgICBsZXQgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gbnVsbDsvLyB0cmFja3MgcHJlLWVzY2FsYXRpb24gdmFsdWUgc28gd2UgY2FuIHJldmVydCB3aGVuIHRoZSBidXJzdCBzdWJzaWRlcwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgY29uc3Qgd29ya2VyU3RyaW5nQ29uZmxpY3RzID0gWwogICAgICAgICd0d2l0Y2gnLAogICAgICAgICdpc1ZhcmlhbnRBJy8vIFR3aXRjaE5vU3ViCiAgICBdOwogICAgY29uc3Qgd29ya2VyU3RyaW5nQWxsb3cgPSBbXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ1JlaW5zZXJ0ID0gWwogICAgICAgICdpc1ZhcmlhbnRBJywvLyBUd2l0Y2hOb1N1YiAocHJpb3IgdG8gKDAuOSkpCiAgICAgICAgJ2Jlc3VwZXIvJywvLyBUd2l0Y2hOb1N1YiAoMC45KQogICAgICAgICcke3BhdGNoX3VybH0nLy8gVHdpdGNoTm9TdWIgKDAuOS4xKQogICAgXTsKICAgIGZ1bmN0aW9uIGdldENsZWFuV29ya2VyKHdvcmtlcikgewogICAgICAgIGxldCByb290ID0gbnVsbDsKICAgICAgICBsZXQgcGFyZW50ID0gbnVsbDsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSAmJiAhd29ya2VyU3RyaW5nQWxsb3cuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSkgewogICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8vIEZvcmVpZ24gZXh0ZW5zaW9uIG1heSBoYXZlIGZyb3plbiBXb3JrZXIucHJvdG90eXBlOyBwZXItbGluayB0cnktY2F0Y2guCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhcmVudCwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gUGVyLWxpbmsgdHJ5LWNhdGNoOiBmb3JlaWduLWZyb3plbiBlbnRyeSBzaG91bGRuJ3QgYWJvcnQgdGhlIGNoYWluLgogICAgICAgICAgICB0cnkgeyBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVpbnNlcnRbaV0sIHBhcmVudCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgcGFyZW50ID0gcmVpbnNlcnRbaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQ7CiAgICB9CiAgICBmdW5jdGlvbiBpc1ZhbGlkV29ya2VyKHdvcmtlcikgewogICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHdvcmtlci50b1N0cmluZygpOwogICAgICAgIGNvbnN0IGhhc0NvbmZsaWN0ID0gd29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgY29uc3QgaGFzQWxsb3cgPSB3b3JrZXJTdHJpbmdBbGxvdy5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGNvbnN0IGhhc1JlaW5zZXJ0ID0gd29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBpZiAoaGFzQ29uZmxpY3QgJiYgIWhhc0FsbG93ICYmICFoYXNSZWluc2VydCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgcmVqZWN0ZWQg4oCUIGNvbmZsaWN0IHN0cmluZyBmb3VuZDogJyArIHdvcmtlclN0cmluZ0NvbmZsaWN0cy5maWx0ZXIoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkuam9pbignLCAnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhaGFzQ29uZmxpY3QgfHwgaGFzQWxsb3cgfHwgaGFzUmVpbnNlcnQ7CiAgICB9CiAgICBsZXQgaW5qZWN0ZWRCbG9iVXJsID0gbnVsbDsKICAgIGxldCBvcmlnaW5hbFJldm9rZU9iamVjdFVSTCA9IG51bGw7CiAgICBmdW5jdGlvbiBob29rV2luZG93V29ya2VyKCkgewogICAgICAgIC8vIFByZXZlbnQgVHdpdGNoIGZyb20gcmV2b2tpbmcgb3VyIGluamVjdGVkIHdvcmtlciBibG9iIFVSTAogICAgICAgIGlmICghVVJMLnJldm9rZU9iamVjdFVSTC5fX3Rhc01hc2tlZCkgewogICAgICAgICAgICBvcmlnaW5hbFJldm9rZU9iamVjdFVSTCA9IFVSTC5yZXZva2VPYmplY3RVUkw7CiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwgPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgICAgICBpZiAodXJsID09PSBpbmplY3RlZEJsb2JVcmwpIHJldHVybjsKICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFJldm9rZU9iamVjdFVSTC5jYWxsKHRoaXMsIHVybCk7CiAgICAgICAgICAgIH0sICdyZXZva2VPYmplY3RVUkwnKTsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTC5fX3Rhc01hc2tlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlaW5zZXJ0ID0gZ2V0V29ya2Vyc0ZvclJlaW5zZXJ0KHdpbmRvdy5Xb3JrZXIpOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIChnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyKSB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGxldCBpc1R3aXRjaFdvcmtlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpc1R3aXRjaFdvcmtlciA9IG5ldyBVUkwodHdpdGNoQmxvYlVybCkub3JpZ2luLmVuZHNXaXRoKCcudHdpdGNoLnR2Jyk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICBpZiAoIWlzVHdpdGNoV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm9uLVR3aXRjaCB3b3JrZXIgc2tpcHBlZDogJyArIHR3aXRjaEJsb2JVcmwpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFByZS1jaGVjazogdmVyaWZ5IHdlIGNhbiBmZXRjaCB0aGUgd29ya2VyIEpTIGJlZm9yZSBpbmplY3RpbmcKICAgICAgICAgICAgICAgIGxldCBwcmVmZXRjaGVkV29ya2VySnMgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsgcHJlZmV0Y2hlZFdvcmtlckpzID0gZ2V0V2FzbVdvcmtlckpzKHR3aXRjaEJsb2JVcmwpOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICBpZiAoIXByZWZldGNoZWRXb3JrZXJKcykgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEZhaWxlZCB0byBmZXRjaCB3b3JrZXIgSlMg4oCUIGZhbGxpbmcgYmFjayB0byB1bm1vZGlmaWVkIHdvcmtlcicpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBpbnRlcmNlcHRlZCDigJQgaW5qZWN0aW5nIGFkLWJsb2NrIGhvb2tzJyk7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdCbG9iU3RyID0gYAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdGZXRjaFJlcXVlc3RzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgICAgICR7aGFzQWRUYWdzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRNYXRjaGVkQWRTaWduaWZpZXJzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtzdHJpcEFkU2VnbWVudHMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3Byb2Nlc3NNM1U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtob29rV29ya2VyRmV0Y2gudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2RlY2xhcmVPcHRpb25zLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRBY2Nlc3NUb2tlbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z3FsUmVxdWVzdC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cGFyc2VBdHRyaWJ1dGVzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtzZXRTdHJlYW1JbmZvVXJscy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7b25Gb3VuZEFkLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRXYXNtV29ya2VySnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFNlcnZlclRpbWVGcm9tTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cmVwbGFjZVNlcnZlclRpbWVJbk0zdTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFN0cmVhbVVybEZvclJlc29sdXRpb24udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3VwZGF0ZUFkYmxvY2tCYW5uZXJGb3JTdHJlYW0udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3BydW5lU3RyZWFtSW5mb3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2NyZWF0ZVN0cmVhbUluZm8udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBnZXRXYXNtV29ya2VySnMoJyR7dHdpdGNoQmxvYlVybC5yZXBsYWNlQWxsKCInIiwgIiUyNyIpfScpOwogICAgICAgICAgICAgICAgICAgIGRlY2xhcmVPcHRpb25zKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fX3Rhc1BydW5lSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3Rhc1BydW5lSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwcnVuZVN0cmVhbUluZm9zLCA1ICogNjAgKiAxMDAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9ICR7UmVsb2FkUGxheWVyQWZ0ZXJBZH07CiAgICAgICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gJHtSZWxvYWRDb29sZG93blNlY29uZHN9OwogICAgICAgICAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9ICR7RWFybHlSZWxvYWRQb2xsVGhyZXNob2xkfTsKICAgICAgICAgICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJHtQaW5CYWNrdXBQbGF5ZXJUeXBlfTsKICAgICAgICAgICAgICAgICAgICBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFID0gJyR7T1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRX0nOwogICAgICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgPSAke2dxbF9kZXZpY2VfaWQgPyAiJyIgKyBncWxfZGV2aWNlX2lkICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9ICR7QXV0aG9yaXphdGlvbkhlYWRlciA/ICInIiArIEF1dGhvcml6YXRpb25IZWFkZXIgKyAiJyIgOiB1bmRlZmluZWR9OwogICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9ICR7Q2xpZW50SW50ZWdyaXR5SGVhZGVyID8gIiciICsgQ2xpZW50SW50ZWdyaXR5SGVhZGVyICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVWJvVXBkYXRlRGV2aWNlSWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdGZXRjaFJlc3BvbnNlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXNwb25zZURhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIHRpbWVvdXRJZCB9ID0gcGVuZGluZ0ZldGNoUmVxdWVzdHMuZ2V0KHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHJlc3BvbnNlRGF0YS5lcnJvcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSByZXNwb25zZSBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IHRha2VzIHN0YXR1cy9zdGF0dXNUZXh0L2hlYWRlcnMg4oCUIHVybC9yZWRpcmVjdGVkL3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZS4gSVZTIFdBU00gdmFsaWRhdGVzIHRoZXNlIChTcGFkZS90cmFja2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cykgYW5kIHRocm93cyBOZXR3b3JrRXJyb3IgaWYgdGhleSdyZSBtaXNzaW5nIOKAlCBUVFYtQUIgdjYuMy41IGZpeC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VEYXRhLmJvZHksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VEYXRhLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlRGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VEYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICd1cmwnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudXJsIHx8ICcnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICdyZWRpcmVjdGVkJywgeyB2YWx1ZTogISFyZXNwb25zZURhdGEucmVkaXJlY3RlZCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlRGF0YS50eXBlIHx8ICdiYXNpYycsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnU2ltdWxhdGVBZHMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW11bGF0ZWRBZHNEZXB0aCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTaW11bGF0ZWRBZHNEZXB0aDogJyArIFNpbXVsYXRlZEFkc0RlcHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAhQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50czogJyArIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBob29rV29ya2VyRmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZCB0aGUgZXZhbCDigJQgbWFsZm9ybWVkIHdvcmtlclN0cmluZyBzaG91bGRuJ3Qgc2lsZW50bHkgYnJlYWsKICAgICAgICAgICAgICAgICAgICAvLyBUd2l0Y2gncyBwbGF5ZXIgbG9naWMgd2l0aG91dCBhIGRpYWdub3N0aWMuCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXZhbCh3b3JrZXJTdHJpbmcpOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ1tBRCBERUJVR10gV29ya2VyIGV2YWwgZmFpbGVkIOKAlCBUd2l0Y2ggcGxheWVyIGxvZ2ljIG5vdCBsb2FkZWQ6JywgZSk7IH0KICAgICAgICAgICAgICAgIGAKICAgICAgICAgICAgICAgIGlmIChpbmplY3RlZEJsb2JVcmwgJiYgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBvcmlnaW5hbFJldm9rZU9iamVjdFVSTC5jYWxsKFVSTCwgaW5qZWN0ZWRCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVYm9VcGRhdGVBZEJhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcihlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIoZmFsc2UsIGUuZGF0YS5raW5kKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1BhdXNlUmVzdW1lUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBhc3luYyBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEua2V5ID09ICdGZXRjaFJlcXVlc3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IGV2ZW50LmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IGhhbmRsZVdvcmtlckZldGNoUmVxdWVzdChmZXRjaFJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ0ZldGNoUmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIFdvcmtlciBjcmFzaCByZWNvdmVyeSDigJQgSVZTIFdBU00gd29ya2VyIGNhbiBmaXJlIFJ1bnRpbWVFcnJvcgogICAgICAgICAgICAgICAgLy8gKGUuZy4gImluZGV4IG91dCBvZiBib3VuZHMiKSBhbmQgZGllLiBBIHNpbmdsZSBjcmFzaCBmaXJlcyBtdWx0aXBsZQogICAgICAgICAgICAgICAgLy8gZXJyb3IgZXZlbnRzOyBkZWR1cGUgdmlhIGEgbG9jYWwgZmxhZy4gT24gZmlyc3QgZXJyb3IsIHRyaWdnZXIgYQogICAgICAgICAgICAgICAgLy8gcGxheWVyIHJlbG9hZCDigJQgVHdpdGNoIHJlLXNwYXducyB0aGUgd29ya2VyIGFzIHBhcnQgb2YgdGhlIG5ldwogICAgICAgICAgICAgICAgLy8gcGxheWVyIGluc3RhbmNlLCBhbmQgZXhpc3RpbmcgcmVsb2FkIGNvb2xkb3duIHByZXZlbnRzIHJlc3RhcnQgbG9vcHMuCiAgICAgICAgICAgICAgICBsZXQgY3Jhc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyYXNoZWQpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBJVlMgV0FTTSB3b3JrZXIgY3Jhc2hlZDogJyArICgoZSAmJiBlLm1lc3NhZ2UpIHx8ICd1bmtub3duIGVycm9yJykgKyAnIOKAlCB0cmlnZ2VyaW5nIHBsYXllciByZWxvYWQgdG8gcmVjb3ZlcicpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7IHJlbG9hZFR3aXRjaFBsYXllcihmYWxzZSk7IH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgY3Jhc2ggcmVjb3ZlcnkgZmFpbGVkOiAnICsgZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCB3b3JrZXJJbnN0YW5jZSA9IHJlaW5zZXJ0V29ya2VycyhuZXdXb3JrZXIsIHJlaW5zZXJ0KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnV29ya2VyJywgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlckluc3RhbmNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFdvcmtlcih2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB3b3JrZXJJbnN0YW5jZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQXR0ZW1wdCB0byBzZXQgdHdpdGNoIHdvcmtlciBkZW5pZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbVdvcmtlckpzKHR3aXRjaEJsb2JVcmwpIHsKICAgICAgICBpZiAoIWdldFdhc21Xb3JrZXJKcy5jYWNoZSkgewogICAgICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF07CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJlcS5vcGVuKCdHRVQnLCB0d2l0Y2hCbG9iVXJsLCBmYWxzZSk7CiAgICAgICAgcmVxLm92ZXJyaWRlTWltZVR5cGUoInRleHQvamF2YXNjcmlwdCIpOwogICAgICAgIHJlcS5zZW5kKCk7CiAgICAgICAgY29uc3QgdGV4dCA9IHJlcS5yZXNwb25zZVRleHQ7CiAgICAgICAgZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdID0gdGV4dDsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0cmVhbUluZm9VcmxzKHN0cmVhbUluZm8sIGVuY29kaW5nc00zdTgpIHsKICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvLyB2MiBBUEkgdmFyaWFudCBVUkxzIGFyZSByYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnIGluIHRoZSBwYXRoLgogICAgICAgICAgICAvLyBBY2NlcHQgYWJzb2x1dGUgVVJMcyAoY29udGFpbmluZyAnOi8vJykgYWxvbmdzaWRlICcubTN1OCcgVVJMcy4KICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmVzW2ldPy50cmltKCk7CiAgICAgICAgICAgIGlmICh0cmltbWVkICYmICF0cmltbWVkLnN0YXJ0c1dpdGgoJyMnKSAmJiAodHJpbW1lZC5pbmNsdWRlcygnLm0zdTgnKSB8fCB0cmltbWVkLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zQnlVcmxbbGluZXNbaV0udHJpbUVuZCgpXSA9IHN0cmVhbUluZm87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBsaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uSW5mbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVSYXRlOiBhdHRyaWJ1dGVzWydGUkFNRS1SQVRFJ10sCiAgICAgICAgICAgICAgICAgICAgICAgIFVybDogbGluZXNbaSArIDFdCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHMuc2V0KGxpbmVzW2kgKyAxXS50cmltRW5kKCksIHJlc29sdXRpb25JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZUFkYmxvY2tCYW5uZXJGb3JTdHJlYW0oc3RyZWFtSW5mbykgewogICAgICAgIGNvbnN0IGlzU2hvd2luZ0FkID0gISFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nczsKICAgICAgICBpZiAoIWlzU2hvd2luZ0FkICYmIChzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyB8fCBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA+IDApKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID0gMDsKICAgICAgICB9CiAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICBrZXk6ICdVYm9VcGRhdGVBZEJhbm5lcicsCiAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgIGhhc0FkczogaXNTaG93aW5nQWQsCiAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4ID49IDAgPyBPUFRfQkFDS1VQX1BMQVlFUl9UWVBFU1tzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleF0gOiBudWxsCiAgICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBvbkZvdW5kQWQoc3RyZWFtSW5mbywgdGV4dFN0ciwgcmVsb2FkUGxheWVyLCByZWFsRmV0Y2gsIHVybCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBsZXQgcmVzdWx0ID0gdGV4dFN0cjsKICAgICAgICBzdHJlYW1JbmZvLklzTWlkcm9sbCA9IHRleHRTdHIuaW5jbHVkZXMoJyJNSURST0xMIicpIHx8IHRleHRTdHIuaW5jbHVkZXMoJyJtaWRyb2xsIicpOwogICAgICAgIC8vIFRyYWNrIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzIHRvIGRpc3Rpbmd1aXNoIHJlYWwgYWRzIGZyb20gZmFsc2UtcG9zaXRpdmUgc2lnbmlmaWVyIG1hdGNoZXMuCiAgICAgICAgLy8gVGhlc2UgYXR0cmlidXRlcyBhcmUgcHJlc2VudCBvbiBldmVyeSByZWFsIFR3aXRjaCBhZCBhbmQgYWJzZW50IGZyb20gYW55dGhpbmcgdGhhdCBjb3VsZAogICAgICAgIC8vIGZhbHNlLXBvc2l0aXZlIChlLmcuIG1ldGFkYXRhIGNvbnRhaW5pbmcgdGhlIHdvcmQgJ3N0aXRjaGVkJykuCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtQUQtU0VTU0lPTi1JRCcpIHx8IHRleHRTdHIuaW5jbHVkZXMoJ1gtVFYtVFdJVENILUFELVJBRFMtVE9LRU4nKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGxheWVyVHlwZXMgPSBbLi4uT1BUX0JBQ0tVUF9QTEFZRVJfVFlQRVNdOwogICAgICAgIC8vIFRyeSBwaW5uZWQgYmFja3VwIHBsYXllciB0eXBlIGZpcnN0IGlmIGF2YWlsYWJsZQogICAgICAgIGlmIChQaW5CYWNrdXBQbGF5ZXJUeXBlICYmIHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICBjb25zdCBwaW5uZWRJbmRleCA9IHBsYXllclR5cGVzLmluZGV4T2Yoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgaWYgKHBpbm5lZEluZGV4ID4gMCkgewogICAgICAgICAgICAgICAgcGxheWVyVHlwZXMuc3BsaWNlKHBpbm5lZEluZGV4LCAxKTsKICAgICAgICAgICAgICAgIHBsYXllclR5cGVzLnVuc2hpZnQoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuc2l6ZSA+PSBwbGF5ZXJUeXBlcy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyAmJiAhc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MuaW5jbHVkZXModXJsKSkgewogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncywgcmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJhY2t1cFNlYXJjaFN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgICAgICBsZXQgYmFja3VwUGxheWVyVHlwZUluZm8gPSAnJzsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYXllclR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllclR5cGUgPSBwbGF5ZXJUeXBlc1tpXTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5oYXMocGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5SZXNwb25zZSA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUsIHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlblJlc3BvbnNlICE9IG51bGwgJiYgYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JCb2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IGVycm9yQm9keSA9ICcg4oCUICcgKyAoYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS50ZXh0KCkpLnN1YnN0cmluZygwLCAyMDApOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFjY2VzcyB0b2tlbiBIVFRQICcgKyBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyBwbGF5ZXJUeXBlICsgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSA0MDMgPyAnIChpbnRlZ3JpdHk6ICcgKyAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyID8gJ3ByZXNlbnQnIDogJ21pc3NpbmcnKSArICcpJyA6ICcnKSArIGVycm9yQm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgPSAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID49IDMgJiYgIXN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZFRva2VuRmFpbHVyZVN0cmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUb2tlbiBmZXRjaCBmYWlsZWQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgKyAnIHRpbWVzIGNvbnNlY3V0aXZlbHkgYWNyb3NzIHBsYXllciB0eXBlcyDigJQgcG9zc2libGUgVHdpdGNoIGRldGVjdGlvbiAvIGludGVncml0eSByb3RhdGlvbiAvIHJhdGUgbGltaXRpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVG9rZW5SZXNwb25zZSAhPSBudWxsICYmIGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLmpzb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHJldHVybnMgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBpbiB0d28gb2JzZXJ2ZWQgc2hhcGVzOgogICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjogey4uLn0gfSAoZmxhdHRlciwgb2JzZXJ2ZWQgZm9yICdlbWJlZCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY2VwdCBlaXRoZXIuIEZpZWxkLW9ic2VydmVkIHNpbGVudGx5IGRyb3BwaW5nIGVtYmVkIGJhY2t1cCBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJJbmZvID0gYWNjZXNzVG9rZW4/LmVycm9ycyA/ICcgZXJyb3JzOiAnICsgSlNPTi5zdHJpbmdpZnkoYWNjZXNzVG9rZW4uZXJyb3JzKS5zdWJzdHJpbmcoMCwgMzAwKSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHBsYXllclR5cGUgKyAnLiBSZXNwb25zZSBrZXlzOiAnICsgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoYWNjZXNzVG9rZW4gfHwge30pKSArIGVyckluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyA9IChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzIHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID49IDMgJiYgIXN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFRva2VuIGZldGNoIGZhaWxlZCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyArICcgdGltZXMgY29uc2VjdXRpdmVseSBhY3Jvc3MgcGxheWVyIHR5cGVzIOKAlCBwb3NzaWJsZSBUd2l0Y2ggZGV0ZWN0aW9uIC8gaW50ZWdyaXR5IHJvdGF0aW9uIC8gcmF0ZSBsaW1pdGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsSW5mbyA9IG5ldyBVUkwoJ2h0dHBzOi8vdXNoZXIudHR2bncubmV0L2FwaS8nICsgKFYyQVBJID8gJ3YyLycgOiAnJykgKyAnY2hhbm5lbC9obHMvJyArIHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUgKyAnLm0zdTgnICsgc3RyZWFtSW5mby5Vc2hlclBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmxJbmZvLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgc3BhdC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmxJbmZvLmhyZWYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlICE9IG51bGwgJiYgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVc2hlciBIVFRQICcgKyBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmNvZGluZ3NNM3U4ID0gYXdhaXQgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKGVuY29kaW5nc00zdTgsIHJlc29sdXRpb25JbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrVGV4dFN0ciA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQWRUYWdzKGJhY2tUZXh0U3RyKSAmJiAoU2ltdWxhdGVkQWRzRGVwdGggPT0gMCB8fCBpID49IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSkpIHx8IGkgPj0gcGxheWVyVHlwZXMubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBiYWNrVGV4dFN0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZUluZm8gPSAnICgnICsgcGxheWVyVHlwZSArICcpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuc2V0KHBsYXllclR5cGUsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQaW5CYWNrdXBQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkVuY29kaW5ncyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb3cgcmVzb2x1dGlvbiBzdHJlYW1zIHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgaW4gdGhlIFVJLiBUbyBmaXggdGhpcyB3ZSBtZXJnZSB0aGUgbG93IHJlcyBVUkxzIGludG8gdGhlIG1haW4gbTN1OAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsRW5jb2RpbmdzTTN1OCA9IHN0cmVhbUluZm8uRW5jb2RpbmdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsTGluZXMgPSBub3JtYWxFbmNvZGluZ3NNM3U4LnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub3JtYWxMaW5lcy5sZW5ndGggLSAxOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsTGluZXNbal0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhub3JtYWxMaW5lc1tqXS5zdWJzdHJpbmcobm9ybWFsTGluZXNbal0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKGVuY29kaW5nc00zdTgsIHN0cmVhbUluZm8uVXJscy5nZXQobm9ybWFsTGluZXNbaiArIDFdLnRyaW1FbmQoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNJbmYgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKG5ldyBSZWdFeHAoYF4uKig/PVxuLioke2xvd1Jlc1VybH0pYCwgJ20nKSk/LlswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb3dSZXNJbmYpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsb3dSZXNJbmYuc3Vic3RyaW5nKGxvd1Jlc0luZi5pbmRleE9mKCc6JykgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVjc0tleSA9ICdDT0RFQ1MnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc1NldHRpbmdzW2NvZGVjc0tleV0gPT09ICdzdHJpbmcnICYmIHR5cGVvZiBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzU2V0dGluZ3NbY29kZWNzS2V5XS5sZW5ndGggPj0gMyAmJiBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldLmxlbmd0aCA+PSAzICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdWJzdHJpbmcoMCwgMykgIT09IGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0uc3Vic3RyaW5nKDAsIDMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N3YXAgJyArIHJlc1NldHRpbmdzW2NvZGVjc0tleV0gKyAnIHRvICcgKyBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbExpbmVzW2pdID0gbm9ybWFsTGluZXNbal0ucmVwbGFjZSgvQ09ERUNTPSJbXiJdKyIvLCBgQ09ERUNTPSIke2xvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV19ImApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobm9ybWFsTGluZXNbal0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbExpbmVzW2ogKyAxXSA9IGxvd1Jlc1VybCArICcgJy5yZXBlYXQoaiArIDEpOy8vIFRoZSBzdHJlYW0gZG9lc24ndCBsb2FkIHVubGVzcyBlYWNoIHVybCBsaW5lIGlzIHVuaXF1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBub3JtYWxMaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtSW5mb1VybHMoc3RyZWFtSW5mbywgZW5jb2RpbmdzTTN1OCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgfQogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmdldChwbGF5ZXJUeXBlKSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5zZXQocGxheWVyVHlwZSwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGFkcywgc3dpdGNoIHRvIGJhY2t1cCcgKyBiYWNrdXBQbGF5ZXJUeXBlSW5mbyArICcgaW4gJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zIOKAlCBzaWduaWZpZXJzOiAnICsgZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKS5qb2luKCcsICcpKTsKICAgICAgICBpZiAocmVsb2FkUGxheWVyKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtrZXk6IFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVWJvUmVsb2FkUGxheWVyJyA6ICdVYm9QYXVzZVJlc3VtZVBsYXllcid9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gaGFzQWRUYWdzKHRleHRTdHIpIHsKICAgICAgICByZXR1cm4gQURfU0lHTklGSUVSUy5zb21lKChzKSA9PiBzICYmIHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFEX1NJR05JRklFUlMuZmlsdGVyKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFEX1NJR05JRklFUlMgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzKSB7CiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIGxldCBzbTsKICAgICAgICAgICAgY29uc3QgY2xhc3NSZSA9IC9FWFQtWC1EQVRFUkFOR0U6W15cbl0qQ0xBU1M9Iih0d2l0Y2gtW14iXSspIi9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gY2xhc3NSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0iJyArIHNtWzFdICsgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB0YWdSZSA9IC8oU0NURTM1LVtBLVotXSt8RVhULVgtQ1VFLVtBLVotXSspL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSB0YWdSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoc21bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN1YnN0cmluZyBjaGVjayAobm90IGV4YWN0KTogYSBjYW5kaWRhdGUgaXMgImtub3duIiBpZiBhbnkgQURfU0lHTklGSUVSCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4KICAgICAgICAgICAgICAgICFBRF9TSUdOSUZJRVJTLnNvbWUocyA9PiBzICYmIGMuaW5jbHVkZXMocykpICYmCiAgICAgICAgICAgICAgICAhS05PV05fTk9OX0FEX1NJR05JRklFUlMuc29tZShzID0+IHMgJiYgYy5pbmNsdWRlcyhzKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQURfU0lHTklGSUVSUzogJyArIHVua25vd24uam9pbignLCAnKSArICcgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAvLyBUcmFjayBTQ1RFLTM1IENVRS1PVVQvQ1VFLUlOIGFkIGJvdW5kYXJpZXMKICAgICAgICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1PVVQnKSkgewogICAgICAgICAgICAgICAgaWYgKCFpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLU9VVCDigJQgYWQgYm91bmRhcnkgZW50ZXJlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1JTicpKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1JTiDigJQgYWQgYm91bmRhcnkgZXhpdGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmFja2luZyB1cmxzIHdoaWNoIGFwcGVhciBpbiB0aGUgb3ZlcmxheSBVSQogICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmUucmVwbGFjZUFsbChUV0lUQ0hfQURfVVJMX1JFV1JJVEVfUkVHRVgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmICghbGluZS5pbmNsdWRlcygnLGxpdmUnKSB8fCBzdHJpcEFsbFNlZ21lbnRzIHx8IEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyB8fCBpbkN1ZU91dCkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRVcmwgPSBsaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICBpZiAoIUFkU2VnbWVudENhY2hlLmhhcyhzZWdtZW50VXJsKSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoc2VnbWVudFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IGxpbmVzW2kgKyAxXS5pbmNsdWRlcyhwKSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHNlZ21lbnQgZGV0ZWN0ZWQgdmlhIFVSTCBwYXR0ZXJuOiAnICsgbGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChsaW5lc1tpICsgMV0sIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZS5pbmNsdWRlcygnLGxpdmUnKSkgewogICAgICAgICAgICAgICAgbGl2ZVNlZ21lbnRzLnB1c2goeyBleHRpbmY6IGxpbmUsIHVybDogbGluZXNbaSArIDFdIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBBUlQ6JykpIHsKICAgICAgICAgICAgICAgIC8vIExMLUhMUyBwYXJ0OiBVUkkgaXMgaW5saW5lIGFzIGFuIGF0dHJpYnV0ZS4gU3RyaXAgaWYgaXQgbWF0Y2hlcyBhIGtub3duCiAgICAgICAgICAgICAgICAvLyBhZCBVUkwgKGFscmVhZHkgaW4gY2FjaGUgZnJvbSBhIHBhcmFsbGVsIEVYVElORiBzdHJpcCwgb3IgbWF0Y2hlcyBhIFVSTCBwYXR0ZXJuKS4KICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllciBtYXkgdXNlIHRoZSBwYXJ0cyBwYXRoIHRvIGZldGNoIGFkIG1lZGlhIHZpYSBsb3ctbGF0ZW5jeS4KICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmlNYXRjaCA9IGxpbmUubWF0Y2goVVJJX0FUVFJJQlVURV9SRUdFWCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBRF9TRUdNRU5UX1VSTF9QQVRURVJOUy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBoYXNBZFRhZ3ModGV4dFN0cikpIHsKICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBObyBsb3cgbGF0ZW5jeSBkdXJpbmcgYWRzIChvdGhlcndpc2UgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHBsYXllciB0byBwcmVmZXRjaCBhbmQgZGlzcGxheSBhZCBzZWdtZW50cykKICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1QUkVMT0FELUhJTlQ6JykpIHsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICAvLyBDYWNoZSBsaXZlIHNlZ21lbnRzIGZvciByZWNvdmVyeSAocGx1cyB0aGUgTUVESUEtU0VRVUVOQ0Ugb2YgdGhlIG9sZGVzdCBjYWNoZWQgc2VnbWVudCwKICAgICAgICAvLyBzbyB0aGUgcGxheWVyIGFjY2VwdHMgaW5qZWN0ZWQgcmVjb3Zlcnkgc2VnbWVudHMgYXMgdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSkKICAgICAgICBpZiAobGl2ZVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzID0gbGl2ZVNlZ21lbnRzLnNsaWNlKC02KTsKICAgICAgICAgICAgY29uc3Qgc2VxID0gcGFyc2VJbnQoKHRleHRTdHIubWF0Y2goLyNFWFQtWC1NRURJQS1TRVFVRU5DRTooXGQrKS8pIHx8IFtdKVsxXSk7CiAgICAgICAgICAgIGlmICghaXNOYU4oc2VxKSkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxID0gc2VxICsgTWF0aC5tYXgoMCwgbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIGFsbCBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkLCB0cnkgdG8gcHJldmVudCBibGFjayBzY3JlZW4gdmlhIHJlY292ZXJ5IGNvbnRlbnQuCiAgICAgICAgLy8gUHJlZmVyIHRoZSBmdWxsLXBsYXlsaXN0IHNuYXBzaG90IGZyb20gYSByZWNlbnQgbm9uLWFkIHBvbGwgKG1pcnJvcnMgVFRWLUFCCiAgICAgICAgLy8gTGFzdENsZWFuTmF0aXZlTTNVOCBhcHByb2FjaCkg4oCUIGdpdmVzIHRoZSBwbGF5ZXIgNC02IGxpdmUgc2VnbWVudHMgd29ydGggb2YKICAgICAgICAvLyBjb250ZW50IHZzIHRoZSB0aGluIHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlLiBGYWxscyBiYWNrIHRvIHRoZSBwZXItc2VnbWVudAogICAgICAgIC8vIGNhY2hlIGlmIHRoZSBzbmFwc2hvdCBpcyBzdGFsZSBvciBtaXNzaW5nLgogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMgJiYgbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSArIDE7CiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzID49IGVmZmVjdGl2ZVRocmVzaG9sZCAmJiAhc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24pOwogICAgICAgICAgICAgICAgLy8ga2luZDogJ2Vhcmx5JyBieXBhc3NlcyB0aGUgY29vbGRvd24gZ2F0ZSB0aGF0J3MgbWVhbnQgZm9yIGJ1ZmZlci1tb25pdG9yIHJlbG9hZHMuCiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7IGtleTogJ1Vib1JlbG9hZFBsYXllcicsIGtpbmQ6ICdlYXJseScgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUHJpbWFyeTogZnJlc2ggZnVsbC1wbGF5bGlzdCBzbmFwc2hvdCAoPCAxLjVzIG9sZCwgbXVzdCBub3QgaXRzZWxmIGNvbnRhaW4gYWQgbWFya2VycykKICAgICAgICAgICAgY29uc3Qgc25hcHNob3RBZ2UgPSBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPyAoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCkgOiBJbmZpbml0eTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCAmJiBzbmFwc2hvdEFnZSA8PSAxNTAwICYmICFoYXNBZFRhZ3Moc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4KSkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXVzaW5nIGxhc3QgY2xlYW4gbmF0aXZlIHBsYXlsaXN0ICgnICsgc25hcHNob3RBZ2UgKyAnbXMgb2xkKScpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBoYXNTdHJpcHBlZEFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBwZXItc2VnbWVudCByZWNvdmVyeSBjYWNoZSAoZXhpc3RpbmcgYmVoYXZpb3IpCiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMgJiYgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcmVzdG9yaW5nICcgKyBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoICsgJyByZWNvdmVyeSBzZWdtZW50cycpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaW5lcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbal0uc3RhcnRzV2l0aCgnI0VYVC1YLU1FRElBLVNFUVVFTkNFOicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tqXSA9ICcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50c1tqXS5leHRpbmYpOwogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLnVybCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBoYXNTdHJpcHBlZEFkU2VnbWVudHM7CiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAvLyBUaHJvdHRsZSBjYWNoZSBwcnVuZSB0byBvbmNlIHBlciA2MHMuIFRoZSAxMjBzIFRUTCBnaXZlcyBwbGVudHkgb2YgaGVhZHJvb20KICAgICAgICAvLyBhbmQgc2Nhbm5pbmcgdGhlIGZ1bGwgY2FjaGUgb24gZXZlcnkgbTN1OCBwb2xsIGFkZHMgdXAgZHVyaW5nIGhlYXZ5IGFkIGJyZWFrCiAgICAgICAgLy8gc2VxdWVuY2VzIChMTC1ITFMgY2FuIHBvbGwgbXVsdGlwbGUgdGltZXMgcGVyIHNlY29uZCkuIFBvcnRlZCBmcm9tIFRUVi1BQi4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0IHx8IG5vdyAtIHN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0ID4gNjAwMDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPSBub3c7CiAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLmZvckVhY2goKHZhbHVlLCBrZXksIG1hcCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgbm93IC0gMTIwMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwLmRlbGV0ZShrZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gRGlhZ25vc3RpYzogbG9nIG9uY2UgcGVyIHN0cmVhbUluZm8gd2hlbiB0aGUgY2FjaGUgY3Jvc3NlcyAxMDAwIGVudHJpZXMsCiAgICAgICAgICAgIC8vIHNvIGNhY2hlIGJsb2F0IGZyb20gYSBmdXR1cmUgVFRML3BydW5lIGJ1ZyB3b3VsZCBzdXJmYWNlIGluIHVzZXIgcmVwb3J0cwogICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHN0YXlpbmcgaW52aXNpYmxlLgogICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuc2l6ZSA+IDEwMDAgJiYgIXN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxaykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRBZENhY2hlU2l6ZTFrID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkU2VnbWVudENhY2hlIGNyb3NzZWQgMTAwMCBlbnRyaWVzIChub3cgJyArIEFkU2VnbWVudENhY2hlLnNpemUgKyAnKSDigJQgcG9zc2libGUgY2FjaGUgYmxvYXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbGluZXMuam9pbignXG4nKTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NNM1U4KHVybCwgdGV4dFN0ciwgcmVhbEZldGNoKSB7CiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zQnlVcmxbdXJsXTsKICAgICAgICBpZiAoIXN0cmVhbUluZm8pIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uICYmIHRleHRTdHIuaW5jbHVkZXMoJyNFWFQtWC1FTkRMSVNUJykgJiYgIXRleHRTdHIuaW5jbHVkZXMoJyNFWFRJTkY6JykpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRPZmZsaW5lVHJhbnNpdGlvbiA9IHRydWU7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFN0cmVhbSBlbmRlZCAvIG9mZmxpbmUgc2hhcGUgZGV0ZWN0ZWQg4oCUIG0zdTggaGFzICNFWFQtWC1FTkRMSVNUIHdpdGggbm8gc2VnbWVudHMuIFBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gcmVzcG9uc2UsIGJyb2FkY2FzdGVyIGVuZGVkIHN0cmVhbSwgb3IgbmF0dXJhbCBlbmQtb2YtYnJvYWRjYXN0Jyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGN1cnJlbnRSZXNvbHV0aW9uID0gc3RyZWFtSW5mby5VcmxzLmdldCh1cmwpOwogICAgICAgIGlmICghY3VycmVudFJlc29sdXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNDaGVja2VkVW5rbm93blRhZ3MpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDaGVja2VkVW5rbm93blRhZ3MgPSB0cnVlOwogICAgICAgICAgICBjb25zdCB1bmtub3duQWRUYWdzID0gdGV4dFN0ci5tYXRjaCgvI0VYVFteOlxuXSooPzphZHxjdWV8c2N0ZXxzcG9uc29yKVteOlxuXSovZ2kpOwogICAgICAgICAgICBpZiAodW5rbm93bkFkVGFncykgewogICAgICAgICAgICAgICAgY29uc3QgdW5rbm93biA9IHVua25vd25BZFRhZ3MuZmlsdGVyKHQgPT4gIUFEX1NJR05JRklFUlMuc29tZShzID0+IHMgJiYgdC5pbmNsdWRlcyhzKSkpOwogICAgICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFVua25vd24gYWQtcmVsYXRlZCB0YWdzIGZvdW5kOiAnICsgWy4uLm5ldyBTZXQodW5rbm93bildLmpvaW4oJywgJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGhhdmVBZFRhZ3MgPSBoYXNBZFRhZ3ModGV4dFN0cikgfHwgKFNpbXVsYXRlZEFkc0RlcHRoID4gMCAmJiAoIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzIHx8ICFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncy5pbmNsdWRlcyh1cmwpIHx8IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSA+IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4KSk7CiAgICAgICAgLy8gQ2FjaGUgdGhlIGNsZWFuIG1haW4gc3RyZWFtIG0zdTggZm9yIGFsbC1zdHJpcHBlZCByZWNvdmVyeSBmYWxsYmFjay4KICAgICAgICAvLyBVcGRhdGVkIGR1cmluZyBub24tYWQgcG9sbHMgKG91dHNpZGUgb2YgYW55IGFkIGJyZWFrKSwgc28gYnkgdGhlIHRpbWUgYW4gYWQKICAgICAgICAvLyBicmVhayBzdGFydHMsIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCBob2xkcyBhIHNuYXBzaG90IH4xLTIgc2Vjb25kcyBvbGQKICAgICAgICAvLyB3aXRoIHNldmVyYWwgbGl2ZSBzZWdtZW50cy4gV2hlbiBoZWF2eSBTU0FJIGJyZWFrcyBsZWF2ZSB0aGUgbWFpbiBwbGF5bGlzdAogICAgICAgIC8vIGVudGlyZWx5IHN0cmlwcGVkLCBzdHJpcEFkU2VnbWVudHMgcmVwbGF5cyB0aGlzIHNuYXBzaG90IGluc3RlYWQgb2YgdGhlIHRoaW4KICAgICAgICAvLyBSZWNvdmVyeVNlZ21lbnRzIGFycmF5IOKAlCB0eXBpY2FsbHkgZ2l2ZXMgdGhlIHBsYXllciA0LTYgbGl2ZSBzZWdtZW50cyBvZgogICAgICAgIC8vIGNvbnRlbnQgdnMgdGhlIDEtMiBjYWNoZWQgaW5kaXZpZHVhbCBzZWdtZW50cy4KICAgICAgICAvLyBNaXJyb3JzIFRUVi1BQiBzcmMvbW9kdWxlcy9wcm9jZXNzb3IudHM6NzMzLTczNi4KICAgICAgICBpZiAoIWhhdmVBZFRhZ3MgJiYgIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MpIHsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFVybCA9IHN0cmVhbUluZm8uRW5jb2RpbmdzLm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF07CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4ID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0FkVGFncyhzdHJlYW1NM3U4KSAmJiBTaW11bGF0ZWRBZHNEZXB0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pcnJvcnMgVFRWLUFCIHY2LjYuNyAjMTogbWFyayBmaXJzdCBjYW5kaWRhdGUtZW5kIHRpbWVzdGFtcCBvbiB0aGUgZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW4gbWFpbi1zdHJlYW0gcG9sbCwgc28gdGhlIHNsb3ctcGF0aCBtYXgtd2FpdCBnYXRlIGJlbG93IGNhbiBmaXJlIGV2ZW4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3Vic2VxdWVudCBwb2xscyBib3VuY2UgYmFjayB0byBhZC1tYXJrZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGxheWxpc3QgaGFzIGxpdmUgc2VnbWVudHMg4oCUIGlmIG5vdCwgYmFja3VwIHN0cmVhbSBpcyBkZWFkCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0xpdmVTZWdtZW50cyA9IHRleHRTdHIuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXJyb3JzIFRUVi1BQiB2Ni42LjcgIzQ6IGluZGVwZW5kZW50IHNsb3ctcGF0aCBtYXgtd2FpdCBlc2NhbGF0aW9uIGdhdGUgc28KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmNpbmcgbWFya2VycyBjYW4ndCB3ZWRnZSB0aGUgcGxheWVyIG9uIGJhY2t1cCBpbmRlZmluaXRlbHkuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkRW5kTWF4V2FpdE1zID0gMTIwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRTaW5jZUNhbmRpZGF0ZSA9IERhdGUubm93KCkgLSBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbG93UGF0aFJlYWR5ID0gc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA+IDAgJiYgZWxhcHNlZFNpbmNlQ2FuZGlkYXRlID49IGFkRW5kTWF4V2FpdE1zOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gMiB8fCAhaGFzTGl2ZVNlZ21lbnRzIHx8IHNsb3dQYXRoUmVhZHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG93UGF0aFJlYWR5ICYmIHN0cmVhbUluZm8uQ2xlYW5QbGF5bGlzdENvdW50IDwgMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNsb3ctcGF0aCBhZC1lbmQgZXNjYWxhdGlvbiDigJQgJyArIChzdHJlYW1JbmZvLkFkRW5kQm91bmNlQ291bnQgfHwgMCkgKyAnIG1hcmtlciBib3VuY2VzLCAnICsgKGVsYXBzZWRTaW5jZUNhbmRpZGF0ZSAvIDEwMDApLnRvRml4ZWQoMSkgKyAncyBzaW5jZSBmaXJzdCBjbGVhbiBwb2xsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gaGFzIG5vIGxpdmUgc2VnbWVudHMg4oCUIGZvcmNpbmcgaW1tZWRpYXRlIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIG1vcmUgYWRzIG9uIG1haW4gc3RyZWFtLiBTdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLiAnICsgKFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVHJpZ2dlcmluZyBwbGF5ZXIgcmVsb2FkIHRvIGdvIGJhY2sgdG8gbWFpbiBzdHJlYW0uLi4nIDogJ1Jlc3VtaW5nIHBsYXliYWNrLi4uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRzIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPT09IDAgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpVG9Tc2FpVHJhbnNpdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzPy5jbGVhcj8uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzPy5jbGVhcj8uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkRW5kQm91bmNlQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgdjYuNi43ICMxOiBib3VuY2UtdG9sZXJhbnQgcmVzZXQga2VlcHMgUGVuZGluZ0FkRW5kQXQgYWxpdmUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNyb3NzIHNob3J0IGZsaXBzIGJhY2sgdG8gYWQtbWFya2VkLCBzbyB0aGUgc2xvdy1wYXRoIG1heC13YWl0IGdhdGUgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGZpcmUgd2hlbiBib3VuY2luZyBtYXJrZXJzIHByZXZlbnQgQ2xlYW5QbGF5bGlzdENvdW50IHByb2dyZXNzLgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZEVuZFN0YWxlbmVzc01zID0gMTIwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0ICYmIChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCkgPCBhZEVuZFN0YWxlbmVzc01zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkRW5kQm91bmNlQ291bnQgPSAoc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50IHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtTTN1OC5pbmNsdWRlcygnIk1JRFJPTEwiJykgJiYgIXN0cmVhbU0zdTguaW5jbHVkZXMoJyJtaWRyb2xsIicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHN0cmVhbU0zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBsaW5lcy5sZW5ndGggPiBpICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXF1ZXN0IG9uZSAudHMgZmlsZSBwZXIgLm0zdTggcmVxdWVzdCB0byBhdm9pZCBtYWtpbmcgdG9vIG1hbnkgcmVxdWVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmFkZChsaW5lc1tpICsgMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2gobGluZXNbaSArIDFdKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYmxvYigpKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgJiYgaGF2ZUFkVGFncykgewogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGF3YWl0IG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCB0cnVlLCByZWFsRmV0Y2gsIHVybCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzKSB7CiAgICAgICAgICAgIC8vIENTQUkgZmFzdCBwYXRoOiBpZiBhbGwgc2VnbWVudHMgaW4gdGhlIG1haW4gc3RyZWFtIGFyZSBsaXZlLCBza2lwIGJhY2t1cCBzZWFyY2guCiAgICAgICAgICAgIC8vIENTQUkgYWRzIGFyZSBkZWxpdmVyZWQgb3V0c2lkZSB0aGUgbTN1OCDigJQgdGhlIG1haW4gc3RyZWFtIHNlZ21lbnRzIGFyZSBjbGVhbi4KICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBtYWluIHN0cmVhbSBkaXJlY3RseSwgYXZvaWRpbmcgdGhlIGJhY2t1cCBzdHJlYW0gc3dpdGNoIHRoYXQgY2F1c2VzCiAgICAgICAgICAgIC8vIGEgMjAtNDBzIHJlYnVmZmVyIGdhcC4KICAgICAgICAgICAgY29uc3QgbWFpblN0cmVhbUxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgbGV0IGhhc05vbkxpdmVTZWdtZW50ID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFpblN0cmVhbUxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobWFpblN0cmVhbUxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAhbWFpblN0cmVhbUxpbmVzW2ldLmluY2x1ZGVzKExJVkVfU0lHTklGSUVSKSkgewogICAgICAgICAgICAgICAgICAgIGhhc05vbkxpdmVTZWdtZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWhhc05vbkxpdmVTZWdtZW50KSB7CiAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzTG9nZ2VkQ3NhaUZhc3RQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIC8vIFJld29yZGVkIOKAlCB0aGUgb3JpZ2luYWwgImFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoIgogICAgICAgICAgICAgICAgICAgIC8vIGltcGxpZWQgYSBwZXJtYW5lbnQgc3RhdGUsIGJ1dCBpdCBvbmx5IGRlc2NyaWJlcyB0aGlzIHBvbGwuIFR3aXRjaCBjYW4KICAgICAgICAgICAgICAgICAgICAvLyBzaGlmdCBtaWQtYnJlYWsgdG8gU1NBSSAoc3RpdGNoZWQgYWQgc2VnbWVudHMpIGF0IHdoaWNoIHBvaW50IHRoZQogICAgICAgICAgICAgICAgICAgIC8vIGJhY2t1cCBzZWFyY2ggbGVnaXRpbWF0ZWx5IGZpcmVzOyB0aGUgdHJhbnNpdGlvbiBpcyBsb2dnZWQgc2VwYXJhdGVseS4KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDU0FJIGZhc3QgcGF0aCDigJQgY3VycmVudCBwb2xsIGhhcyBhbGwtbGl2ZSBzZWdtZW50cywgc2tpcHBpbmcgYmFja3VwIHNlYXJjaCB0aGlzIHBvbGwgKHBsYXlsaXN0IG1heSBzaGlmdCB0byBTU0FJIG9uIHN1YnNlcXVlbnQgcG9sbHMpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGggJiYgIXN0cmVhbUluZm8uSGFzTG9nZ2VkQ3NhaVRvU3NhaVRyYW5zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlUb1NzYWlUcmFuc2l0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQbGF5bGlzdCBub3cgY29udGFpbnMgc3RpdGNoZWQgYWQgc2VnbWVudHMg4oCUIENTQUkgZmFzdCBwYXRoIG5vIGxvbmdlciBhcHBsaWVzLCBmYWxsaW5nIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGF3YWl0IG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCB0cnVlLCByZWFsRmV0Y2gsIHVybCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCkgewogICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKTsKICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tXb3JrZXJGZXRjaCgpIHsKICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBob29rV29ya2VyRmV0Y2ggKHZpZGVvLXN3YXAtbmV3KScpOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IGZldGNoOwogICAgICAgIGZldGNoID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLmhhcyh1cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2goJ2RhdGE6dmlkZW8vbXA0O2Jhc2U2NCxBQUFBS0daMGVYQnRjRFF5QUFBQUFXbHpiMjF0Y0RReVpHRnphR0YyWXpGcGMyODJhR3h6WmdBQUJFbHRiMjkyQUFBQWJHMTJhR1FBQUFBQUFBQUFBQUFBQUFBQUFZYWdBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQUFBQnFIUnlZV3NBQUFCY2RHdG9aQUFBQUFNQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFVUnRaR2xoQUFBQUlHMWthR1FBQUFBQUFBQUFBQUFBQUFBQUFMdUFBQUFBQUZYRUFBQUFBQUF0YUdSc2NnQUFBQUFBQUFBQWMyOTFiZ0FBQUFBQUFBQUFBQUFBQUZOdmRXNWtTR0Z1Wkd4bGNnQUFBQUR2YldsdVpnQUFBQkJ6Yldoa0FBQUFBQUFBQUFBQUFBQWtaR2x1WmdBQUFCeGtjbVZtQUFBQUFBQUFBQUVBQUFBTWRYSnNJQUFBQUFFQUFBQ3pjM1JpYkFBQUFHZHpkSE5rQUFBQUFBQUFBQUVBQUFCWGJYQTBZUUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FRQUFBQUFMdUFBQUFBQUFBelpYTmtjd0FBQUFBRGdJQ0FJZ0FCQUFTQWdJQVVRQlVBQUFBQUFBQUFBQUFBQUFXQWdJQUNFWkFHZ0lDQUFRSUFBQUFRYzNSMGN3QUFBQUFBQUFBQUFBQUFFSE4wYzJNQUFBQUFBQUFBQUFBQUFCUnpkSE42QUFBQUFBQUFBQUFBQUFBQUFBQUFFSE4wWTI4QUFBQUFBQUFBQUFBQUFlVjBjbUZyQUFBQVhIUnJhR1FBQUFBREFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFvQUFBQUZvQUFBQUFBR0JiV1JwWVFBQUFDQnRaR2hrQUFBQUFBQUFBQUFBQUFBQUFBOUNRQUFBQUFCVnhBQUFBQUFBTFdoa2JISUFBQUFBQUFBQUFIWnBaR1VBQUFBQUFBQUFBQUFBQUFCV2FXUmxiMGhoYm1Sc1pYSUFBQUFCTEcxcGJtWUFBQUFVZG0xb1pBQUFBQUVBQUFBQUFBQUFBQUFBQUNSa2FXNW1BQUFBSEdSeVpXWUFBQUFBQUFBQUFRQUFBQXgxY213Z0FBQUFBUUFBQU94emRHSnNBQUFBb0hOMGMyUUFBQUFBQUFBQUFRQUFBSkJoZG1NeEFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW9BQmFBQklBQUFBU0FBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHUC8vQUFBQU9tRjJZME1CVFVBZS8rRUFJMmROUUI2V1VvRkFYL0xnTFVCQVFGQUFBRDZBQUE2bURnQUFIb1FBQTlDVzd5NEtBUUFFYU91UElBQUFBQkJ6ZEhSekFBQUFBQUFBQUFBQUFBQVFjM1J6WXdBQUFBQUFBQUFBQUFBQUZITjBjM29BQUFBQUFBQUFBQUFBQUFBQUFBQVFjM1JqYndBQUFBQUFBQUFBQUFBQVNHMTJaWGdBQUFBZ2RISmxlQUFBQUFBQUFBQUJBQUFBQVFBQUFDNEFBQUFBQW9BQUFBQUFBQ0IwY21WNEFBQUFBQUFBQUFJQUFBQUJBQUNDTlFBQUFBQUNRQUFBJywgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXJsID0gdXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0ciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gU3RyaW5nKGVycj8ubWVzc2FnZSB8fCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj8ubmFtZSAhPT0gJ0Fib3J0RXJyb3InICYmICEvY2FuY2VsfGFib3J0L2kudGVzdChlcnJNc2cpKSBjb25zb2xlLmxvZygnZmV0Y2ggaG9vayBlcnIgJyArIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gKG5ldyBVUkwodXJsKSkucGF0aG5hbWUubWF0Y2goLyhbXlwvXSspKD89XC5cdyskKS8pPy5bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdwYXJlbnRfZG9tYWlucycpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB0ZW1wVXJsLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBGaXJzdCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggd2l0aCB0aGUgdmlkZW8gZW5jb2RpbmdzICgzNjBwLDQ4MHAsNzIwcCxldGMpLgogICAgICAgICAgICAgICAgICAgICAgICAvLyAtIFNlY29uZCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBvYnRhaW5lZCBpbiB0aGUgZmlyc3QgcmVxdWVzdC4gQXQgdGhpcyBwb2ludCB3ZSB3aWxsIGtub3cgaWYgdGhlcmUncyBhZHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzICE9IG51bGwgJiYgKGF3YWl0IHJlYWxGZXRjaChzdHJlYW1JbmZvLkVuY29kaW5ncy5tYXRjaCgvXmh0dHBzOi4qXC5tM3U4JC9tKT8uWzBdKSkuc3RhdHVzICE9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgZW5jb2RpbmdzIGFyZSBkZWFkICh0aGUgc3RyZWFtIHByb2JhYmx5IHJlc3RhcnRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZXJUaW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCB8fCBzdHJlYW1JbmZvLkVuY29kaW5ncyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0gY3JlYXRlU3RyZWFtSW5mbyhjaGFubmVsTmFtZSwgKG5ldyBVUkwodXJsKSkuc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gc3RyZWFtSW5mby5VcmxzLnZhbHVlcygpLm5leHQoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2gocmVzb2x1dGlvbkluZm8uVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OCA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3Moc3RyZWFtTTN1OCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbkZvdW5kQWQoc3RyZWFtSW5mbywgc3RyZWFtTTN1OCwgZmFsc2UsIHJlYWxGZXRjaCwgcmVzb2x1dGlvbkluZm8uVXJsLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0cmVhbU0zdThSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW5jb2RpbmdzTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2ZXJUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPyBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA6IHN0cmVhbUluZm8uRW5jb2RpbmdzLCBzZXJ2ZXJUaW1lKSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgoZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvI0VYVC1YLVNFU1NJT04tREFUQTpEQVRBLUlEPSJTRVJWRVItVElNRSIsVkFMVUU9IihbXiJdKykiLyk7CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvU0VSVkVSLVRJTUU9IihbMC05Ll0rKSIvKTsKICAgICAgICByZXR1cm4gbWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDEgPyBtYXRjaGVzWzFdIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4KGVuY29kaW5nc00zdTgsIG5ld1NlcnZlclRpbWUpIHsKICAgICAgICBpZiAoVjJBUEkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ld1NlcnZlclRpbWUgPyBlbmNvZGluZ3NNM3U4LnJlcGxhY2UoLygjRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKVteIl0rKCIpLywgYCQxJHtuZXdTZXJ2ZXJUaW1lfSQyYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKFNFUlZFUi1USU1FPSIpWzAtOS5dKyIvLCBgU0VSVkVSLVRJTUU9IiR7bmV3U2VydmVyVGltZX0iYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgfQogICAgZnVuY3Rpb24gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGNvbnN0IGVuY29kaW5nc0xpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBbdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodF0gPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uLnNwbGl0KCd4JykubWFwKE51bWJlcik7CiAgICAgICAgbGV0IG1hdGNoZWRSZXNvbHV0aW9uVXJsID0gbnVsbDsKICAgICAgICBsZXQgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZhbHNlOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IGNsb3Nlc3RSZXNvbHV0aW9uRGlmZmVyZW5jZSA9IEluZmluaXR5OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RpbmdzTGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIC8vIEFjY2VwdCB2MiBBUEkgdmFyaWFudCBVUkxzIChyYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnKS4KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGVuY29kaW5nc0xpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhlbmNvZGluZ3NMaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgY29uc3QgZnJhbWVSYXRlID0gYXR0cmlidXRlc1snRlJBTUUtUkFURSddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbiA9PSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uICYmICghbWF0Y2hlZFJlc29sdXRpb25VcmwgfHwgKCFtYXRjaGVkRnJhbWVSYXRlICYmIGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRnJhbWVSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oY2hhbm5lbE5hbWUsIHBsYXllclR5cGUpIHsKICAgICAgICBjb25zdCByZWFsUGxheWVyVHlwZSA9IHBsYXllclR5cGUucmVwbGFjZSgnLUFMVCcsICcnKTsKICAgICAgICBjb25zdCBib2R5ID0gewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUGxheWJhY2tBY2Nlc3NUb2tlbicsCiAgICAgICAgICAgIHZhcmlhYmxlczogewogICAgICAgICAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgbG9naW46IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgaXNWb2Q6IGZhbHNlLAogICAgICAgICAgICAgICAgdm9kSUQ6ICIiLAogICAgICAgICAgICAgICAgcGxheWVyVHlwZTogcmVhbFBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSk7CiAgICB9CiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHkpIHsKICAgICAgICBpZiAoIWdxbF9kZXZpY2VfaWQpIHsKICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9ICcnOwogICAgICAgICAgICBjb25zdCBjaGFycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlkJzogQ0xJRU5UX0lELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkLAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSkKICAgICAgICB9OwogICAgICAgIGlmIChwbGF5ZXJUeXBlLmluY2x1ZGVzKCctQUxUJykpIHsKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgICdDbGllbnQtSWQnOiBDTElFTlRfSUQsCiAgICAgICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0geC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArMSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXQogICAgICAgICAgICAgICAgfSkpOwogICAgfQogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIC8vIDVzIEFib3J0Q29udHJvbGxlciB0aW1lb3V0IOKAlCBib3VuZHMgd29yc3QtY2FzZSB3YWl0IHdoZW4gVHdpdGNoIEdRTCBoYW5ncy4KICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICAgIGNvbnN0IHRpbWVvdXRNcyA9IDUwMDA7CiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXRNcyk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aW5kb3cucmVhbEZldGNoKGZldGNoUmVxdWVzdC51cmwsIHsKICAgICAgICAgICAgICAgIC4uLmZldGNoUmVxdWVzdC5vcHRpb25zLAogICAgICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaWQ6IGZldGNoUmVxdWVzdC5pZCwKICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicgPyAnR1FMIGZldGNoIHRpbWVvdXQgKCcgKyAodGltZW91dE1zIC8gMTAwMCkgKyAncyknIDogZXJyb3IubWVzc2FnZQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tGZXRjaCgpIHsKICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXaW5kb3cgZmV0Y2ggaG9vayBpbnN0YWxsZWQnKTsKICAgICAgICBsZXQgaGFzTG9nZ2VkSGVhZGVycyA9IGZhbHNlOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IHdpbmRvdy5mZXRjaDsKICAgICAgICB3aW5kb3cucmVhbEZldGNoID0gcmVhbEZldGNoOwogICAgICAgIHdpbmRvdy5mZXRjaCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwsIGluaXQpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdncWwnKSkgewogICAgICAgICAgICAgICAgICAgIGxldCBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snWC1EZXZpY2UtSWQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snRGV2aWNlLUlEJ107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGV2aWNlSWQgPT09ICdzdHJpbmcnICYmIGdxbF9kZXZpY2VfaWQgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVWJvVXBkYXRlRGV2aWNlSWQnLCBncWxfZGV2aWNlX2lkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSA9PT0gJ3N0cmluZycgJiYgaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10gIT09IENsaWVudEludGVncml0eUhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50SW50ZWdyaXR5SGVhZGVyJywgQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSAhPT0gQXV0aG9yaXphdGlvbkhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicsIEF1dGhvcml6YXRpb25IZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghaGFzTG9nZ2VkSGVhZGVycyAmJiBncWxfZGV2aWNlX2lkICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChncWxfZGV2aWNlX2lkID8gJ3llcycgOiAnbm8nKSArICcsIEF1dGg6ICcgKyAoQXV0aG9yaXphdGlvbkhlYWRlciA/ICd5ZXMnIDogJ25vJykgKyAnLCBJbnRlZ3JpdHk6ICcgKyAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyID8gJ3llcycgOiAnbm8nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIEdldCByaWQgb2YgbWluaSBwbGF5ZXIgYWJvdmUgY2hhdCAtIFRPRE86IFJlamVjdCB0aGlzIGxvY2FsbHkgaW5zdGVhZCBvZiBoYXZpbmcgc2VydmVyIHJlamVjdCBpdAogICAgICAgICAgICAgICAgICAgIGlmIChpbml0ICYmIHR5cGVvZiBpbml0LmJvZHkgPT09ICdzdHJpbmcnICYmIGluaXQuYm9keS5pbmNsdWRlcygnUGxheWJhY2tBY2Nlc3NUb2tlbicpICYmIGluaXQuYm9keS5pbmNsdWRlcygncGljdHVyZS1ieS1waWN0dXJlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFICYmIHR5cGVvZiBpbml0LmJvZHkgPT09ICdzdHJpbmcnICYmIGluaXQuYm9keS5pbmNsdWRlcygnUGxheWJhY2tBY2Nlc3NUb2tlbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYWNlZFBsYXllclR5cGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Qm9keSA9IEpTT04ucGFyc2UoaW5pdC5ib2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Qm9keSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Qm9keS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgJiYgbmV3Qm9keVtpXT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICE9PSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdCb2R5Py52YXJpYWJsZXM/LnBsYXllclR5cGUgJiYgbmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICE9PSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRQbGF5ZXJUeXBlID0gbmV3Qm9keS52YXJpYWJsZXMucGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW0FEIERFQlVHXSBSZXBsYWNlZCAnJHtyZXBsYWNlZFBsYXllclR5cGV9JyBwbGF5ZXIgdHlwZSB3aXRoICcke09QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEV9JyBwbGF5ZXIgdHlwZWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkobmV3Qm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzYWlUeXBlID0gdXJsLmluY2x1ZGVzKCdicD1taWRyb2xsJykgPyAnbWlkcm9sbCcgOiB1cmwuaW5jbHVkZXMoJ2JwPXByZXJvbGwnKSA/ICdwcmVyb2xsJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoY3NhaVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlZENzYWlUeXBlcy5hZGQoY3NhaVR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDU0FJIGFkIHJlcXVlc3QgZGV0ZWN0ZWQg4oCUIHR5cGU6ICcgKyBjc2FpVHlwZSArICcgKGNsaWVudC1zaWRlIGFkIGluc2VydGlvbiwgbm90IGJsb2NrYWJsZSB2aWEgbTN1OCknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0sICdmZXRjaCcpOwogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgY29uc3QgcGxheWVyUm9vdERpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXInKTsKICAgICAgICBpZiAocGxheWVyUm9vdERpdiAhPSBudWxsKSB7CiAgICAgICAgICAgIGxldCBhZEJsb2NrRGl2ID0gbnVsbDsKICAgICAgICAgICAgYWRCbG9ja0RpdiA9IHBsYXllclJvb3REaXYucXVlcnlTZWxlY3RvcignLnRhcy1hZGJsb2NrLW92ZXJsYXknKTsKICAgICAgICAgICAgaWYgKGFkQmxvY2tEaXYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYWRCbG9ja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5jbGFzc05hbWUgPSAndGFzLWFkYmxvY2stb3ZlcmxheSc7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJwbGF5ZXItYWRibG9jay1ub3RpY2UiIHN0eWxlPSJjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyBwYWRkaW5nOiA1cHg7Ij48cD48L3A+PC9kaXY+JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUCA9IGFkQmxvY2tEaXYucXVlcnlTZWxlY3RvcigncCcpOwogICAgICAgICAgICAgICAgcGxheWVyUm9vdERpdi5hcHBlbmRDaGlsZChhZEJsb2NrRGl2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoIXR3aXRjaFBsYXllckFuZFN0YXRlPy5wbGF5ZXI/LmNvcmUgfHwgIXR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHR3aXRjaFBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGlzTGl2ZSA9IHR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIGlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtb25pdG9yTGl2ZVN0YXR1cygpIHsKICAgICAgICBpZiAoIXR3aXRjaFBsYXllckFuZFN0YXRlPy5wbGF5ZXI/LmNvcmUgfHwgIXR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZSkgewogICAgICAgICAgICB0d2l0Y2hQbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlzTGl2ZSA9IHR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAoIWlzTGl2ZSkgewogICAgICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyKHsKICAgICAgICAgICAgICAgIGhhc0FkczogZmFsc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQobW9uaXRvckxpdmVTdGF0dXMsIDEwMDApOwogICAgfQogICAgZnVuY3Rpb24gZ2V0UGxheWVyQW5kU3RhdGUoKSB7CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Tm9kZShyb290LCBjb25zdHJhaW50KSB7CiAgICAgICAgICAgIGlmIChyb290LnN0YXRlTm9kZSAmJiBjb25zdHJhaW50KHJvb3Quc3RhdGVOb2RlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Quc3RhdGVOb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBub2RlID0gcm9vdC5jaGlsZDsKICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbmRSZWFjdE5vZGUobm9kZSwgY29uc3RyYWludCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGZpbmRSZWFjdFJvb3ROb2RlKCkgewogICAgICAgICAgICBsZXQgcmVhY3RSb290Tm9kZSA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jvb3QnKTsKICAgICAgICAgICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290ICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50KSB7CiAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlYWN0Um9vdE5vZGUgPT0gbnVsbCAmJiByb290Tm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gT2JqZWN0LmtleXMocm9vdE5vZGUpLmZpbmQoeCA9PiB4LnN0YXJ0c1dpdGgoJ19fcmVhY3RDb250YWluZXInKSB8fCB4LnN0YXJ0c1dpdGgoJ19fcmVhY3RGaWJlcicpKTsKICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGVbY29udGFpbmVyTmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWN0Um9vdE5vZGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlYWN0Um9vdE5vZGUgPSBmaW5kUmVhY3RSb290Tm9kZSgpOwogICAgICAgIGlmICghcmVhY3RSb290Tm9kZSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgbGV0IHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFBsYXllckFjdGl2ZSAmJiBub2RlLnByb3BzICYmIG5vZGUucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSk7CiAgICAgICAgcGxheWVyID0gcGxheWVyICYmIHBsYXllci5wcm9wcyAmJiBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA/IHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlIDogbnVsbDsKICAgICAgICBpZiAocGxheWVyPy5wbGF5ZXJJbnN0YW5jZSkgewogICAgICAgICAgICBwbGF5ZXIgPSBwbGF5ZXIucGxheWVySW5zdGFuY2U7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGxiYWNrOiBzdHJ1Y3R1cmFsIG1hdGNoIGlmIFR3aXRjaCBvYmZ1c2NhdGVzIHByb3BlcnR5IG5hbWVzCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgcGxheWVyID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuZ2V0SFRNTFZpZGVvRWxlbWVudCAmJiBub2RlLmdldEJ1ZmZlckR1cmF0aW9uICYmIG5vZGUuY29yZT8uc3RhdGUpOwogICAgICAgIH0KICAgICAgICAvLyBQcmltYXJ5OiBuYW1lZCBwcm9wZXJ0eSBsb29rdXAKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzKTsKICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCDigJQgc2V0U3JjIGV4aXN0cyBidXQgc2V0SW5pdGlhbFBsYXliYWNrU2V0dGluZ3Mgd2FzIHJlbmFtZWQKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrID0gIXBsYXllclN0YXRlID8gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0U3JjICYmIG5vZGUuc2V0U3RyZWFtTWFuYWdlck5vZGUgJiYgIW5vZGUuZ2V0SFRNTFZpZGVvRWxlbWVudCkgOiBudWxsOwogICAgICAgIC8vIEZhbGxiYWNrIDI6IFRUVi1BQidzIGFwcHJvYWNoIOKAlCB2aWRlb1BsYXllckluc3RhbmNlIHdpdGggcGxheWVyTW9kZQogICAgICAgIGNvbnN0IHBsYXllclN0YXRlRmFsbGJhY2syID0gIXBsYXllclN0YXRlICYmICFwbGF5ZXJTdGF0ZUZhbGxiYWNrID8gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc3RhdGU/LnZpZGVvUGxheWVySW5zdGFuY2U/LnBsYXllck1vZGUgIT09IHVuZGVmaW5lZCk/LnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlIDogbnVsbDsKICAgICAgICBjb25zdCBmaW5hbFBsYXllclN0YXRlID0gcGxheWVyU3RhdGUgfHwgcGxheWVyU3RhdGVGYWxsYmFjayB8fCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMjsKICAgICAgICByZXR1cm4gIHsKICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXIsCiAgICAgICAgICAgIHN0YXRlOiBmaW5hbFBsYXllclN0YXRlCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbG9hZFR3aXRjaFBsYXllcihpc1BhdXNlUGxheSwgcmVsb2FkS2luZCkgewogICAgICAgIGNvbnN0IHBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICBpZiAoIXBsYXllckFuZFN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCByZWFjdCByb290Jyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGxheWVyID0gcGxheWVyQW5kU3RhdGUucGxheWVyOwogICAgICAgIGNvbnN0IHBsYXllclN0YXRlID0gcGxheWVyQW5kU3RhdGUuc3RhdGU7CiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHBsYXllcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICghcGxheWVyU3RhdGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHBsYXllciBzdGF0ZScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gUmVsb2FkIGNvb2xkb3duIOKAlCBlYXJseSByZWxvYWRzICh3b3JrZXItdHJpZ2dlcmVkIHRoaW4tY2FjaGUgZmFzdCBwYXRoKSBieXBhc3MgdGhlCiAgICAgICAgLy8gZ2F0ZSBidXQgc3RpbGwgdXBkYXRlIGJvb2trZWVwaW5nIHNvIDMrIHJhcGlkIGVhcmx5IHJlbG9hZHMgc3RpbGwgdHJpZ2dlciB0aGUgOTBzCiAgICAgICAgLy8gZXNjYWxhdGlvbiB0aGF0IHByb3RlY3RzIGFnYWluc3QgcnVuYXdheSBsb29wcy4KICAgICAgICBpZiAoIWlzUGF1c2VQbGF5ICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA+IDApIHsKICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY29uc3QgY29vbGRvd25NcyA9IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDEwMDA7CiAgICAgICAgICAgIGNvbnN0IGlzRWFybHkgPSByZWxvYWRLaW5kID09PSAnZWFybHknOwogICAgICAgICAgICBpZiAobGFzdFJlbG9hZFRpbWVzdGFtcCAmJiBub3cgLSBsYXN0UmVsb2FkVGltZXN0YW1wIDwgY29vbGRvd25NcykgewogICAgICAgICAgICAgICAgaWYgKCFpc0Vhcmx5KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU2tpcHBpbmcgcmVsb2FkIOKAlCBjb29sZG93biBhY3RpdmUgKCcgKyBNYXRoLnJvdW5kKChjb29sZG93bk1zIC0gKG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXApKSAvIDEwMDApICsgJ3MgcmVtYWluaW5nKScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJ5cGFzc2luZyBjb29sZG93biBmb3IgZWFybHkgcmVsb2FkICh0aGluLWNhY2hlIGZhc3QgcGF0aCkg4oCUICcgKyBNYXRoLnJvdW5kKChjb29sZG93bk1zIC0gKG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXApKSAvIDEwMDApICsgJ3Mgd291bGQgaGF2ZSByZW1haW5lZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbG9hZFRpbWVzdGFtcHMucHVzaChub3cpOwogICAgICAgICAgICBjb25zdCBmaXZlTWluQWdvID0gbm93IC0gMzAwMDAwOwogICAgICAgICAgICB3aGlsZSAocmVsb2FkVGltZXN0YW1wcy5sZW5ndGggPiAwICYmIHJlbG9hZFRpbWVzdGFtcHNbMF0gPCBmaXZlTWluQWdvKSB7IHJlbG9hZFRpbWVzdGFtcHMuc2hpZnQoKTsgfQogICAgICAgICAgICBpZiAocmVsb2FkVGltZXN0YW1wcy5sZW5ndGggPj0gMyAmJiBSZWxvYWRDb29sZG93blNlY29uZHMgPCA5MCkgewogICAgICAgICAgICAgICAgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gUmVsb2FkQ29vbGRvd25TZWNvbmRzOwogICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gOTA7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvLWVzY2FsYXRlZCByZWxvYWQgY29vbGRvd24gdG8gOTBzICgzKyByZWxvYWRzIGluIDUgbWludXRlcyknKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChFc2NhbGF0ZWRGcm9tQ29vbGRvd24gIT09IG51bGwgJiYgcmVsb2FkVGltZXN0YW1wcy5sZW5ndGggPCAzKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEZS1lc2NhbGF0ZWQgcmVsb2FkIGNvb2xkb3duIGJhY2sgdG8gJyArIEVzY2FsYXRlZEZyb21Db29sZG93biArICdzIChidXJzdCBzdWJzaWRlZCknKTsKICAgICAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IEVzY2FsYXRlZEZyb21Db29sZG93bjsKICAgICAgICAgICAgICAgIEVzY2FsYXRlZEZyb21Db29sZG93biA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdFJlbG9hZFRpbWVzdGFtcCA9IG5vdzsKICAgICAgICB9CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0tleVF1YWxpdHkgPSAndmlkZW8tcXVhbGl0eSc7CiAgICAgICAgY29uc3QgbHNLZXlNdXRlZCA9ICd2aWRlby1tdXRlZCc7CiAgICAgICAgY29uc3QgbHNLZXlWb2x1bWUgPSAndm9sdW1lJzsKICAgICAgICBjb25zdCBsc0tleUxvd0xhdGVuY3kgPSAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJzsvLyBQcmVzZXJ2ZSB1c2VyJ3MgbG93LWxhdGVuY3kgdG9nZ2xlIGFjcm9zcyByZWxvYWRzIChUVFYtQUIgcGFyaXR5KQogICAgICAgIGNvbnN0IGxzS2V5UGVyc2lzdGVuY2UgPSAncGVyc2lzdGVuY2VFbmFibGVkJzsvLyBQcmVzZXJ2ZSBhdXRvcGxheS9wZXJzaXN0ZW5jZSB0b2dnbGUgYWNyb3NzIHJlbG9hZHMgKFRUVi1BQiBwYXJpdHkpCiAgICAgICAgbGV0IGN1cnJlbnRRdWFsaXR5TFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50TXV0ZWRMUyA9IG51bGw7CiAgICAgICAgbGV0IGN1cnJlbnRWb2x1bWVMUyA9IG51bGw7CiAgICAgICAgbGV0IGN1cnJlbnRMb3dMYXRlbmN5TFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50UGVyc2lzdGVuY2VMUyA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY3VycmVudFF1YWxpdHlMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5UXVhbGl0eSk7CiAgICAgICAgICAgIGN1cnJlbnRNdXRlZExTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlNdXRlZCk7CiAgICAgICAgICAgIGN1cnJlbnRWb2x1bWVMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5Vm9sdW1lKTsKICAgICAgICAgICAgY3VycmVudExvd0xhdGVuY3lMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TG93TGF0ZW5jeSk7CiAgICAgICAgICAgIGN1cnJlbnRQZXJzaXN0ZW5jZUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlQZXJzaXN0ZW5jZSk7CiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIHBsYXllci5jb3JlLnN0YXRlLnZvbHVtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLnF1YWxpdHkuZ3JvdXB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgLy8gUHJlLW11dGUgdGhyb3VnaCBoYXJkIHJlbG9hZCB0byBoaWRlIE1TRS10ZWFyZG93biBhdWRpbyBjbGljazsgcmVzdG9yZWQgb24KICAgICAgICAvLyBgY2FucGxheWAgd2l0aCAxNTAwbXMgY2FwLgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICBpZiAodiAmJiAhdi5tdXRlZCkgewogICAgICAgICAgICAgICAgdi5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAvLyBNdWx0aS1ldmVudCByZXN0b3JlOiBjYW5wbGF5L3BsYXlpbmcvbG9hZGVkZGF0YSDigJQgZmlyc3QtZmlyZWQgd2lucy4KICAgICAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjb25zdCByZXN0b3JlID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2FucGxheScsIGxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBsaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cikgY3VyLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSA9PT0gJ1ZJREVPJykgcmVzdG9yZSgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCBsaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIGxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocmVzdG9yZSwgNDAwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgcGxheWVyLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgIC8vIGNsZWFyZWQgY2FjaGUpLCB0aGUgdmlkZW8gc3RpbGwgbmVlZHMgdW5tdXRlIGFmdGVyIENocm9tZSdzIGF1dG9wbGF5IG11dGUgb24gcmVsb2FkLgogICAgICAgIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG93TGF0ZW5jeUxTICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TG93TGF0ZW5jeSwgY3VycmVudExvd0xhdGVuY3lMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGVyc2lzdGVuY2VMUyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVBlcnNpc3RlbmNlLCBjdXJyZW50UGVyc2lzdGVuY2VMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHdyaXRlcyB2aWRlby1tdXRlZCBhcyAneyJkZWZhdWx0Ijp0cnVlfScgd2hlbiB1c2VyIG11dGVkIHZpYSBVSTsKICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID4gMCAmJiB2aWRlb3NbMF0ubXV0ZWQgJiYgIXVzZXJJbnRlbmRlZE11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRlbnRMb2FkZWQoKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXZlbnR2LWV4dGVuc2lvbicpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6IDdUViBleHRlbnNpb24gZGV0ZWN0ZWQg4oCUIG1heSBjYXVzZSBibGFjayBzY3JlZW4gb3IgYnVmZmVyaW5nIGlzc3Vlcy4gSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMsIHRyeSBkaXNhYmxpbmcgN1RWLicpOwogICAgICAgIH0KICAgICAgICAvLyBSZXN1bWUgdGhlIHBsYXllciBvbiB0YWIgZm9jdXMgaWYgVHdpdGNoIHBhdXNlZCBpdCBkdXJpbmcgYW4gYWQgb24gYSBoaWRkZW4gdGFiLgogICAgICAgIC8vIFByZXZpb3VzbHkgYWxzbyBzcG9vZmVkIGRvY3VtZW50LmhpZGRlbiAvIHZpc2liaWxpdHlTdGF0ZSAvIGhhc0ZvY3VzIC8gbW96SGlkZGVuIC8KICAgICAgICAvLyB3ZWJraXRIaWRkZW4gYW5kIHN3YWxsb3dlZCB0aGUgZXZlbnRzIG9uIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0IGJyb2tlIG90aGVyCiAgICAgICAgLy8gZXh0ZW5zaW9ucyB0aGF0IGtleSBvZmYgcmVhbCB2aXNpYmlsaXR5IChlLmcuIEJldHRlclRUViAiTXV0ZSBJbnZpc2libGUgUGxheWVyIikuCiAgICAgICAgLy8gUmVzdW1lLW9uLWZvY3VzIGFsb25lIGlzIGVub3VnaCB0byBrZWVwIHBsYXliYWNrIGFsaXZlIGFjcm9zcyBoaWRkZW7ihpJ2aXNpYmxlCiAgICAgICAgLy8gdHJhbnNpdGlvbnMgZHVyaW5nIGFkcy4gU3luYydkIHdpdGggVFRWLUFCIHY2LjUuMC4KICAgICAgICBsZXQgd2FzVmlkZW9QbGF5aW5nID0gdHJ1ZTsKICAgICAgICBjb25zdCB2aXNpYmlsaXR5Q2hhbmdlID0gKCkgPT4gewogICAgICAgICAgICBjb25zdCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPT09IDApIHJldHVybjsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmhpZGRlbikgewogICAgICAgICAgICAgICAgd2FzVmlkZW9QbGF5aW5nID0gIXZpZGVvc1swXS5wYXVzZWQgJiYgIXZpZGVvc1swXS5lbmRlZDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgdmlkZW9zWzBdLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlKTsKICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gcmVsb2FkVHdpdGNoUGxheWVyOwogICAgZGVjbGFyZU9wdGlvbnMod2luZG93KTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgbHNSZWxvYWRBZnRlckFkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZFBsYXllckFmdGVyQWQnKTsKICAgICAgICBpZiAobHNSZWxvYWRBZnRlckFkICE9PSBudWxsKSB7CiAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSBsc1JlbG9hZEFmdGVyQWQgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQbGF5ZXJUeXBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQbGF5ZXJUeXBlICE9PSBudWxsKSB7CiAgICAgICAgICAgIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgPSBsc1BsYXllclR5cGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGluQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BpbkJhY2t1cFBsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQaW5CYWNrdXAgIT09IG51bGwpIHsKICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9IGxzUGluQmFja3VwID09PSAndHJ1ZSc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzQ29vbGRvd24gPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkQ29vbGRvd25TZWNvbmRzJykpOwogICAgICAgIGlmICghaXNOYU4obHNDb29sZG93bikgJiYgbHNDb29sZG93biA+PSAwKSB7CiAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IGxzQ29vbGRvd247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzSGlkZUFkT3ZlcmxheSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19oaWRlQWRPdmVybGF5Jyk7CiAgICAgICAgaWYgKGxzSGlkZUFkT3ZlcmxheSA9PT0gJ3RydWUnKSB7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAnLnRhcy1hZGJsb2NrLW92ZXJsYXkgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0nOwogICAgICAgICAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDb25maWc6IFJlbG9hZFBsYXllckFmdGVyQWQgPSAnICsgUmVsb2FkUGxheWVyQWZ0ZXJBZCArICcsIEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJyArIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIG1vbml0b3JMaXZlU3RhdHVzKCk7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"}] \ No newline at end of file From 58c7cc174a7924b25e08b3095659eeb272f9388d Mon Sep 17 00:00:00 2001 From: Griffin Allen <40434025+griffinallen@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:17:50 -0400 Subject: [PATCH 5/5] Fixing double play issue There was an issue with the previous fix where videos would play two times --- dist/resources.json | 2 +- resources/brave-yt-sabr-fix.js | 74 ++++++++++------------------------ 2 files changed, 23 insertions(+), 53 deletions(-) diff --git a/dist/resources.json b/dist/resources.json index 799aafa8..ef7cf2a8 100644 --- a/dist/resources.json +++ b/dist/resources.json @@ -1 +1 @@ -[{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-auto-pip.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBicmF2ZS1hdXRvLXBpcCDigJQgYXV0b21hdGljIFBpY3R1cmUtaW4tUGljdHVyZSB0b2dnbGUgZm9yIEhUTUw1IDx2aWRlbz4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBXaGF0IGl0IGRvZXMKICogLS0tLS0tLS0tLS0tCiAqICAgMS4gRm9yY2UtZW5hYmxlcyBQaVAgb24gdmlkZW9zIHRoYXQgZXhwbGljaXRseSBkaXNhYmxlIGl0IChOZXRmbGl4LAogKiAgICAgIGNlcnRhaW4gRFJNIHBsYXllcnMpIGJ5IGNsZWFyaW5nIGBkaXNhYmxlUGljdHVyZUluUGljdHVyZWAgYW5kCiAqICAgICAgd2F0Y2hpbmcgZm9yIHNpdGVzIHRoYXQgdHJ5IHRvIHJlLXNldCBpdC4KICogICAyLiBXaXJlcyBgbWVkaWFTZXNzaW9uLnNldEFjdGlvbkhhbmRsZXIoImVudGVycGljdHVyZWlucGljdHVyZSIpYCBzbwogKiAgICAgIGJyb3dzZXJzIC8gT1NlcyB0aGF0IGZpcmUgaXQgKGF1dG8tUGlQIG9uIHRhYiBzd2l0Y2gpIGp1c3Qgd29yay4KICogICAzLiBBZGRzIGEgY2xpY2thYmxlIFBpUCBjb250cm9sOgogKiAgICAgICAgLSBOYXRpdmUgaW5qZWN0aW9uIG9uIFlvdVR1YmUgLyBUd2l0Y2ggLyBOZXRmbGl4IChtYXRjaGVzIGVhY2gKICogICAgICAgICAgc2l0ZSdzIGV4aXN0aW5nIGNvbnRyb2xzIGJhcikuCiAqICAgICAgICAtIE90aGVyd2lzZSBhIEZpcmVmb3gtc3R5bGUgIlBvcCBvdXQgdGhpcyB2aWRlbyIgaG92ZXIgcGlsbAogKiAgICAgICAgICB0aGF0IGZsb2F0cyBvdmVyIHRoZSB2aWRlbywgZmFkZXMgaW4gb24gaG92ZXIsIGZhZGVzIG91dAogKiAgICAgICAgICBhZnRlciBhIHNtYWxsIGdyYWNlIHBlcmlvZCwgYW5kIHNocmlua3MgdG8gaWNvbi1vbmx5IGFmdGVyCiAqICAgICAgICAgIHRoZSBmaXJzdCBjbGljay4KICogICA0LiBIYW5kbGVzIG1hbnkgdmlkZW9zIG9uIHRoZSBzYW1lIHBhZ2UgKGZlZWRzLCBjb21tZW50IGVtYmVkcywKICogICAgICBtb2RhbCBwbGF5ZXJzKSBhbmQgdHJhY2tzIGFkZC9yZW1vdmUgdmlhIE11dGF0aW9uT2JzZXJ2ZXIuCiAqCiAqIENvbmZpZ3VyYXRpb24gKHBlci1vcmlnaW4gbG9jYWxTdG9yYWdlKQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogICBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAKICogICAgIHVuc2V0IC8gIjEiIC8gInRydWUiIC8gInllcyIgLyAib24iICAgLT4gZ2VuZXJpYyBvdmVybGF5IHBpbGwgKGRlZmF1bHQpCiAqICAgICAiMCIgICAvICJmYWxzZSIgLyAibm8iICAgLyAib2ZmIiAgICAgIC0+IHVzZSBzaXRlLXNwZWNpZmljIG5hdGl2ZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gKFlvdVR1YmUvVHdpdGNoL05ldGZsaXgpCiAqCiAqICAgU2V0IHZpYSBEZXZUb29scyBjb25zb2xlIG9uIHRoZSBkZXNpcmVkIG9yaWdpbiwgdGhlbiByZWxvYWQgdGhlIHRhYi4KICoKICogQnJvd3NlciBzdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLQogKiAgIC0gQ2hyb21pdW0gKEJyYXZlLCBDaHJvbWUsIEVkZ2UpOiBmdWxsIHN1cHBvcnQsIGFsbCBmZWF0dXJlcy4KICogICAtIEZpcmVmb3g6IFBpUCB3b3JrcywgYnV0IEZpcmVmb3ggYWxyZWFkeSBzaGlwcyBhIGJ1aWx0LWluICJQb3Agb3V0CiAqICAgICB0aGlzIHZpZGVvIiB0b2dnbGUgc28gdGhlIHNjcmlwdCdzIHBpbGwgaXMgcmVkdW5kYW50IHRoZXJlLgogKiAgIC0gU2FmYXJpIChpT1MgMTQrKTogZmFsbHMgYmFjayB0byBgd2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZWAuIFRoZQogKiAgICAgaG92ZXIgcGlsbCBzd2l0Y2hlcyB0byBhIHRhcC10by1yZXZlYWwgcGlsbCAoMyBzIGF1dG8taGlkZSkuCiAqICAgLSBPdGhlciAvIG9sZGVyOiBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbm8gUGlQIEFQSSBpcwogKiAgICAgcHJlc2VudCBhdCBhbGwuCiAqCiAqIEFyY2hpdGVjdHVyZQogKiAtLS0tLS0tLS0tLS0KICogICAqIE9uZSBzaGFyZWQgbW91c2Vtb3ZlIC8gdG91Y2hzdGFydCAvIHNjcm9sbCAvIHJlc2l6ZSAvIGZ1bGxzY3JlZW4KICogICAgIGxpc3RlbmVyIHNldCwgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB2aWRlb3MgYXJlIG9uIHRoZSBwYWdlCiAqICAgICAoYG92ZXJsYXlzYCByZWdpc3RyeSArIGBhcm1HbG9iYWxzKClgIC8gYG1heWJlRGlzYXJtR2xvYmFscygpYCkuCiAqICAgKiBPZmYtc2NyZWVuIHZpZGVvcyBhcmUgZ2F0ZWQgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBhIHNpbmdsZQogKiAgICAgYEludGVyc2VjdGlvbk9ic2VydmVyYCAoYHZpc2libGVPdmVybGF5c2Agc3Vic2V0KS4KICogICAqIEV2ZXJ5IHBlci12aWRlbyByZWdpc3RyYXRpb24gcmVjb3JkcyBhIHRlYXJkb3duIGZ1bmN0aW9uIGluCiAqICAgICBgdmlkZW9DbGVhbnVwc2Agc28gdGhlIGxpc3RlbmVycywgb2JzZXJ2ZXJzLCBhbmQgcGlsbCBidXR0b24gYXJlCiAqICAgICBhbGwgcmVtb3ZlZCBpZiB0aGUgcGFnZSBkcm9wcyB0aGUgdmlkZW8gZWxlbWVudC4KICoKICogU291cmNlIG9mIG9yaWdpbmFsIGF1dG8tUGlQIGJlaGF2aW91cjoKICogICBodHRwczovL29sZC5yZWRkaXQuY29tL3IvYnJhdmVfYnJvd3Nlci9jb21tZW50cy8xcjhlZGc0LwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCihmdW5jdGlvbigpIHsKICBjb25zdCBWRVJTSU9OID0gInYwLjQyLXl0LWF1dG9waXAtdGFyZ2V0K2NvbmRpdGlvbmFsLXJlc3VtZSI7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFR1bmFibGVzCiAgLy8KICAvLyBDb2xsZWN0ZWQgaGVyZSBzbyBhIHVzZXIgLyBtYWludGFpbmVyIGNhbiBhZGp1c3Qgc3BhY2luZywgdGltaW5nIGFuZAogIC8vIHZpZXdwb3J0IGJlaGF2aW91ciB3aXRob3V0IGh1bnRpbmcgdGhyb3VnaCB0aGUgZmlsZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBjb25zdCBDT05GSUcgPSB7CiAgICAvLyBWZXJ0aWNhbCBvZmZzZXQgYWRkZWQgdG8gdGhlIHBpbGwncyBjZW50cmVkLW1pZC1yaWdodCBwb3NpdGlvbgogICAgLy8gKHBvc2l0aXZlID0gZG93bikuIEVtcGlyaWNhbGx5IHR1bmVkIHNvIHRoZSBwaWxsIHNpdHMgYmVsb3cgdGhlCiAgICAvLyB0eXBpY2FsIHNpdGUgY29udHJvbCBiYXIgaW5zdGVhZCBvZiBvdmVybGFwcGluZyBpdC4KICAgIFBJTExfT0ZGU0VUX1k6IDQwLAogICAgLy8gSG9yaXpvbnRhbCBnYXAgZnJvbSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdmlzaWJsZSB2aWRlbyB0byB0aGUgcGlsbC4KICAgIFBJTExfUklHSFRfTUFSR0lOOiAxMiwKICAgIC8vIE1pbmltdW0gZ2FwIGJldHdlZW4gdGhlIHBpbGwgYW5kIGFueSB2aWV3cG9ydCBlZGdlLgogICAgVklFV1BPUlRfUEFEOiA4LAogICAgLy8gRGVsYXkgYmV0d2VlbiB0aGUgY3Vyc29yIGxlYXZpbmcgdGhlIHZpZGVvL3BpbGwgcmVnaW9uIGFuZCB0aGUKICAgIC8vIHBpbGwgZmFkaW5nIG91dCDigJQgcHJvdGVjdHMgYWdhaW5zdCBmbGlja2VyIHdoZW4gdGhlIGN1cnNvcgogICAgLy8gY3Jvc3NlcyB0aGUgZ2FwIGZyb20gdmlkZW8gdG8gcGlsbC4KICAgIEhPVkVSX0dSQUNFX01TOiAxNTAsCiAgICAvLyBIb3cgbG9uZyB0aGUgcGlsbCBzdGF5cyByZXZlYWxlZCBhZnRlciBhIHRhcCBvbiBhIHRvdWNoIGRldmljZS4KICAgIFRPVUNIX1JFVkVBTF9NUzogMzAwMCwKICAgIC8vIE1heGltdW0gdGltZSB3ZSB3YWl0IGZvciBgbG9hZGVkbWV0YWRhdGFgIGJlZm9yZSBpc3N1aW5nIFBpUC4KICAgIE1FVEFEQVRBX1dBSVRfTVM6IDMwMDAsCiAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBidWZmZXIgc28gdGhlIHBpbGwgaXMgaW4gcGxhY2UgYmVmb3JlIHRoZQogICAgLy8gdmlkZW8gZnVsbHkgc2Nyb2xscyBpbnRvIHZpZXcuCiAgICBJT19ST09UX01BUkdJTjogIjEwMHB4IiwKICAgIC8vIEdyYWNlIHdpbmRvdyBhZnRlciBhIFlvdVR1YmUgU1BBIG5hdmlnYXRpb24gZHVyaW5nIHdoaWNoIHRoZSBwaWxsCiAgICAvLyBzdGF5cyBzdXBwcmVzc2VkIGV2ZW4gaWYgdGhlIG5ldyBVUkwgd291bGQgb3RoZXJ3aXNlIGJlIGVsaWdpYmxlLgogICAgLy8gTGV0cyB0aGUgd2F0Y2gtcGFnZSBwbGF5ZXIgbW91bnQgYW5kIGF2b2lkcyBhIGJyaWVmIGZsYXNoIHdoZW4gdGhlCiAgICAvLyBjdXJzb3IgaXMgc3RpbGwgYXQgdGhlIHByZXZpb3VzIGhvdmVyIHRhcmdldCdzIGNvb3JkaW5hdGVzLgogICAgWVRfTkFWX0dSQUNFX01TOiA1MDAsCiAgICAvLyBJZiBhIG5hdGl2ZSBpbmplY3RvciAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpIGtlZXBzIHJldHVybmluZwogICAgLy8gZmFsc2UgZm9yIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIGdpdmUgdXAKICAgIC8vIG9uIG5hdGl2ZSBpbmplY3Rpb24gYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQuCiAgICAvLyBHZW5lcm91cyBvbiBwdXJwb3NlIOKAlCBzbG93IHBsYXllciBtb3VudHMgKG5ldHdvcmstc3RhbGxlZCBpZnJhbWVzLAogICAgLy8gbG9uZy1ydW5uaW5nIFJlYWN0IGh5ZHJhdGlvbikgc2hvdWxkbid0IHRyaXAgdGhlIGZhbGxiYWNrLgogICAgTkFUSVZFX0ZBTExCQUNLX01TOiAxMDAwMCwKICB9OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNb2R1bGUtbGV2ZWwgc3RhdGUKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gdmlkZW8gZWxlbWVudCAtPiBjbGVhbnVwIGZ1bmN0aW9uLiBQb3B1bGF0ZWQgd2hlbiBhIHZpZGVvIGlzIHdpcmVkCiAgLy8gdXA7IGNhbGxlZCBmcm9tIHRoZSBkaXNjb3ZlcnkgTXV0YXRpb25PYnNlcnZlciB3aGVuIGEgdHJhY2tlZCB2aWRlbwogIC8vIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB3ZSBjYW4gcmVsZWFzZSBldmVyeSBsaXN0ZW5lciBhbmQgdGhlCiAgLy8gcGlsbCBET00gbm9kZSBpdCBvd25zLgogIGNvbnN0IHZpZGVvQ2xlYW51cHMgPSBuZXcgV2Vha01hcCgpOwoKICAvLyBZb3VUdWJlLXNwZWNpZmljIHN0YXRlIGZvciB0aGUgVVJMLWdhdGUgKyBTUEEtbmF2LWdyYWNlIGxvZ2ljIGluCiAgLy8gdXBkYXRlKCkuIEhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHNvIHVwZGF0ZSgpIGRvZXNuJ3QgcmUtdGVzdCB0aGUKICAvLyBob3N0IHJlZ2V4IGV2ZXJ5IHRpY2sg4oCUIGhvc3RuYW1lIGlzIGludmFyaWFudCBmb3IgdGhlIHBhZ2UgbGlmZXRpbWUsCiAgLy8gYW5kIHRoZSBwYXRobmFtZSByZWdleCBvbmx5IHJlLXJ1bnMgb24gYWN0dWFsIFNQQSBwYXRoIGNoYW5nZXMuCiAgLy8gV2h5IHRoaXMgZXhpc3RzOiBZb3VUdWJlJ3MgaG9tZXBhZ2UgLyBmZWVkIC8gc2VhcmNoIC8gY2hhbm5lbCBwYWdlcwogIC8vIHJldXNlIHRoZSBzYW1lIGBodG1sNS12aWRlby1jb250YWluZXJgIDx2aWRlbz4gZWxlbWVudCBhcyB0aGUgd2F0Y2gKICAvLyBwYWdlIGZvciBob3Zlci10aHVtYm5haWwgcHJldmlld3MsIHJlcG9zaXRpb25pbmcgaXQgb3ZlciB3aGljaGV2ZXIKICAvLyB0aHVtYm5haWwgdGhlIGN1cnNvciBpcyBvbi4gRE9NLWxldmVsIHNpZ25hbHMgKHNpemUsIG11dGVkLCBsb29wLAogIC8vIHBhcmVudCBjbGFzcykgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHByZXZpZXcgYW5kIHdhdGNoLCBzbyB0aGUgVVJMIGlzCiAgLy8gdGhlIG9ubHkgcmVsaWFibGUgZGlzdGluZ3Vpc2hlci4KICBjb25zdCBfeXRIb3N0ID0gLyg/Ol58XC4pKD86eW91dHViZVwuY29tfHlvdXR1YmUtbm9jb29raWVcLmNvbSkkL2kudGVzdChsb2NhdGlvbi5ob3N0bmFtZSk7CiAgY29uc3QgX3l0V2F0Y2hQYXRoID0gL15cLyg/OndhdGNofGVtYmVkfGxpdmV8c2hvcnRzKS87CiAgbGV0IF95dExhc3RQYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgbGV0IF95dFByZXZpZXdBcmVhID0gX3l0SG9zdCAmJiAhX3l0V2F0Y2hQYXRoLnRlc3QoX3l0TGFzdFBhdGgpOwogIGxldCBfeXROYXZBdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE92ZXJsYXkgcmVnaXN0cnkgKyB2aWV3cG9ydCBnYXRpbmcKICAvLwogIC8vIEdvYWw6IE8oMSkgZG9jdW1lbnQvd2luZG93IGxpc3RlbmVycyByZWdhcmRsZXNzIG9mIHZpZGVvIGNvdW50LCBhbmQKICAvLyBPKHZpc2libGUpIChub3QgTyh0b3RhbCkpIHdvcmsgcGVyIHNjcm9sbC9tb3VzZW1vdmUgdGljay4gQSBzaW5nbGUKICAvLyBzaGFyZWQgbGlzdGVuZXIgc2V0IHdhbGtzIHRoZSByZWdpc3RyeTsgYW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIKICAvLyBuYXJyb3dzIGl0ZXJhdGlvbiB0byB0aGUgdmlkZW9zIGFjdHVhbGx5IG9uIHNjcmVlbi4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gRXZlcnkgb3ZlcmxheSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgKGxpZmV0aW1lIHJlZ2lzdHJ5KS4KICBjb25zdCBvdmVybGF5cyA9IG5ldyBTZXQoKTsKICAvLyBTdWJzZXQgb2YgYG92ZXJsYXlzYCB3aG9zZSB2aWRlbyBpcyBjdXJyZW50bHkgaW50ZXJzZWN0aW5nIHRoZQogIC8vIHZpZXdwb3J0LiBIb3QtcGF0aCBpdGVyYXRpb24gdXNlcyB0aGlzIHNldCBzbyBvZmYtc2NyZWVuIHZpZGVvcyBpbgogIC8vIGxvbmcgZmVlZHMgZG9uJ3QgcGF5IGxheW91dCBjb3N0cyBvbiBldmVyeSBzY3JvbGwgZnJhbWUuCiAgY29uc3QgdmlzaWJsZU92ZXJsYXlzID0gbmV3IFNldCgpOwogIC8vIFJldmVyc2UgbG9va3VwIGZvciB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sgKGVudHJ5LnRhcmdldAogIC8vIGlzIHRoZSB2aWRlbyBlbGVtZW50KS4KICBjb25zdCB2aWRlb1RvT3ZlcmxheSA9IG5ldyBXZWFrTWFwKCk7CiAgbGV0IGludGVyc2VjdGlvbk9ic2VydmVyID0gbnVsbDsKICBmdW5jdGlvbiBnZXRJTygpIHsKICAgIGlmIChpbnRlcnNlY3Rpb25PYnNlcnZlcikgcmV0dXJuIGludGVyc2VjdGlvbk9ic2VydmVyOwogICAgaWYgKHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgZSA9IGVudHJpZXNbaV07CiAgICAgICAgY29uc3QgaW5zdCA9IHZpZGVvVG9PdmVybGF5LmdldChlLnRhcmdldCk7CiAgICAgICAgaWYgKCFpbnN0KSBjb250aW51ZTsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmFkZChpbnN0KTsKICAgICAgICB9IGVsc2UgaWYgKHZpc2libGVPdmVybGF5cy5kZWxldGUoaW5zdCkpIHsKICAgICAgICAgIC8vIEZvcmNlIGEgZmluYWwgdXBkYXRlIHNvIGFueSB2aXNpYmxlIHBpbGwgaGlkZXMgY2xlYW5seS4KICAgICAgICAgIGluc3QudXBkYXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7IHJvb3RNYXJnaW46IENPTkZJRy5JT19ST09UX01BUkdJTiB9KTsKICAgIHJldHVybiBpbnRlcnNlY3Rpb25PYnNlcnZlcjsKICB9CiAgLy8gTGFzdCBrbm93biBwb2ludGVyIHBvc2l0aW9uIChudW1iZXJzLCBuZXZlciB0aGUgTW91c2VFdmVudCDigJQga2VlcGluZwogIC8vIHRoZSBldmVudCBhbGl2ZSBhY3Jvc3MgckFGIHRpY2tzIHBpbnMgZXh0cmEgRE9NIHJlZmVyZW5jZXMgaW4gVjgncwogIC8vIGNsb3N1cmUgZW52aXJvbm1lbnQpLgogIGxldCBtbVggPSAwLCBtbVkgPSAwOwogIC8vIENvYWxlc2NpbmcgZmxhZ3Mg4oCUIGNvbGxhcHNlIGJ1cnN0cyBvZiBtb3VzZW1vdmUgLyBzY3JvbGwgLyBldGMuIGludG8KICAvLyBhIHNpbmdsZSBwZXItZnJhbWUgdGljayBpbnN0ZWFkIG9mIG9uZSB0aWNrIHBlciBldmVudC4KICBsZXQgbW1UaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IHVwZFRpY2tTY2hlZHVsZWQgPSBmYWxzZTsKICAvLyBUcnVlIHdoZW4gZ2xvYmFsIGxpc3RlbmVycyBhcmUgY3VycmVudGx5IGF0dGFjaGVkLiBSZWZlcmVuY2UtY291bnRlZAogIC8vIGJ5IGBvdmVybGF5cy5zaXplYCBzbyB3ZSBvbmx5IGxpc3RlbiB3aGlsZSBhdCBsZWFzdCBvbmUgb3ZlcmxheSBpcyBsaXZlLgogIGxldCBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gX21tVGljaygpIHsKICAgIG1tVGlja1NjaGVkdWxlZCA9IGZhbHNlOwogICAgY29uc3QgeCA9IG1tWCwgeSA9IG1tWTsKICAgIC8vIEl0ZXJhdGUgb25seSB0aGUgdmlzaWJsZSBzdWJzZXQ7IG9mZi1zY3JlZW4gdmlkZW9zIGNhbid0IGJlIGhvdmVyZWQuCiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC5oYW5kbGVQb2ludGVyKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX29uRG9jTW91c2VNb3ZlKGUpIHsKICAgIG1tWCA9IGUuY2xpZW50WDsKICAgIG1tWSA9IGUuY2xpZW50WTsKICAgIGlmIChtbVRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIG1tVGlja1NjaGVkdWxlZCA9IHRydWU7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX21tVGljayk7CiAgfQogIGZ1bmN0aW9uIF9vbkRvY1RvdWNoU3RhcnQoZSkgewogICAgY29uc3QgdCA9IChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB8fCAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKTsKICAgIGlmICghdCkgcmV0dXJuOwogICAgY29uc3QgeCA9IHQuY2xpZW50WCwgeSA9IHQuY2xpZW50WTsKICAgIHZpc2libGVPdmVybGF5cy5mb3JFYWNoKChpbnN0KSA9PiBpbnN0LmhhbmRsZVRvdWNoKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX3NjaGVkdWxlVXBkYXRlQWxsKCkgewogICAgaWYgKHVwZFRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIHVwZFRpY2tTY2hlZHVsZWQgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF91cGRhdGVBbGxUaWNrKTsKICB9CiAgZnVuY3Rpb24gX3VwZGF0ZUFsbFRpY2soKSB7CiAgICB1cGRUaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC51cGRhdGUoKSk7CiAgfQoKICBmdW5jdGlvbiBhcm1HbG9iYWxzKCkgewogICAgaWYgKGdsb2JhbHNBcm1lZCkgcmV0dXJuOwogICAgZ2xvYmFsc0FybWVkID0gdHJ1ZTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIGFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlRGlzYXJtR2xvYmFscygpIHsKICAgIGlmICghZ2xvYmFsc0FybWVkIHx8IG92ZXJsYXlzLnNpemUgPiAwKSByZXR1cm47CiAgICBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICAvLyBUZWFyIGRvd24gdGhlIEludGVyc2VjdGlvbk9ic2VydmVyIHRvbyDigJQgaXQncyB0aWVkIHRvIHRoZSBzYW1lCiAgICAvLyBvdmVybGF5IGxpZmVjeWNsZSBhcyB0aGUgZ2xvYmFsIGxpc3RlbmVycy4gUmUtY3JlYXRlZCBsYXppbHkgYnkKICAgIC8vIGdldElPKCkgaWYgYSBmdXR1cmUgb3ZlcmxheSByZWdpc3RlcnMuCiAgICBpZiAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHsKICAgICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICBpbnRlcnNlY3Rpb25PYnNlcnZlciA9IG51bGw7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDYXBhYmlsaXR5ICsgZW52aXJvbm1lbnQgZGV0ZWN0aW9uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBpUCBhdmFpbGFiaWxpdHkgYWNyb3NzIGJyb3dzZXJzOgogIC8vICAgSEFTX1NUQU5EQVJEX1BJUCDigJQgYHJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlYCAoQ2hyb21pdW0gLyBGaXJlZm94IC8gaU9TIDE0KykuCiAgLy8gICBIQVNfV0VCS0lUX1BJUCAgIOKAlCBvbGRlciBpT1MgU2FmYXJpJ3MgYHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGVgLgogIC8vIFRoZSBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbmVpdGhlciBpcyBwcmVzZW50LgogIGNvbnN0IEhBU19TVEFOREFSRF9QSVAgPSAhIWRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbmFibGVkOwogIGNvbnN0IEhBU19XRUJLSVRfUElQID0gIndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUiIGluIEhUTUxWaWRlb0VsZW1lbnQucHJvdG90eXBlOwogIGNvbnN0IFBJUF9TVVBQT1JURUQgPSBIQVNfU1RBTkRBUkRfUElQIHx8IEhBU19XRUJLSVRfUElQOwoKICAvLyBUb3VjaCBjYXBhYmlsaXR5IOKAlCBzd2l0Y2hlcyB0aGUgb3ZlcmxheSBmcm9tIGhvdmVyLWRyaXZlbiB0bwogIC8vIHRhcC10by1yZXZlYWwgb24gaU9TIC8gQW5kcm9pZC4KICBjb25zdCBJU19UT1VDSCA9ICJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwOwoKICAvLyBDb21iaW5lZCBmdWxsc2NyZWVuIGNoZWNrIGFjcm9zcyB0aGUgdGhyZWUgdmVuZG9yIHZhcmlhbnRzOgogIC8vICAgLSBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAgICAgICAoc3RhbmRhcmQpCiAgLy8gICAtIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IChvbGRlciBDaHJvbWl1bSAvIFNhZmFyaSBkZXNrdG9wKQogIC8vICAgLSB2aWRlby53ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbiAoaU9TIG5hdGl2ZSB2aWRlbyBmdWxsc2NyZWVuLAogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggbmV2ZXIgc2V0cyBkb2N1bWVudC4qKQogIGZ1bmN0aW9uIGlzRnVsbHNjcmVlbih2aWRlbykgewogICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICBpZiAodmlkZW8gJiYgdmlkZW8ud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW4pIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gQ29uc29sZSBvdXRwdXQuIGBsb2dgIGZvciBvbmUtbGluZSBzdWNjZXNzIG1lc3NhZ2VzIG9uIGluamVjdGlvbiwKICAvLyBgd2FybmAgZm9yIGZhaWx1cmVzIChrZXB0IHF1aWV0IGJ5IGRlZmF1bHQpLgogIGNvbnN0IFRBRyA9ICJbYnJhdmUtYXV0by1waXAgIiArIFZFUlNJT04gKyAiXSI7CiAgY29uc3QgbG9nID0gKC4uLmEpID0+IGNvbnNvbGUubG9nKFRBRywgLi4uYSk7CiAgY29uc3Qgd2FybiA9ICguLi5hKSA9PiBjb25zb2xlLndhcm4oVEFHLCAuLi5hKTsKCiAgLy8gUGljayB0aGUgYmVzdCA8dmlkZW8+IGZvciBhbiBhdXRvLVBpUCBpbnRlbnQgZmlyZWQgYnkgdGhlIE9TIC8KICAvLyBicm93c2VyLiBVc2VkIGJ5IHRoZSBnbG9iYWwgYG1lZGlhU2Vzc2lvbmAgYWN0aW9uIGhhbmRsZXIgc28gdGhlCiAgLy8gKmxhc3QqIHJlZ2lzdGVyZWQgdmlkZW8gZG9lc24ndCBnZXQgUGlQJ2QgYnkgZGVmYXVsdCDigJQgc2VlIGNvbW1lbnQKICAvLyBhdCB0aGUgcmVnaXN0cmF0aW9uIHNpdGUgZm9yIHRoZSBZb3VUdWJlIGJsYWNrLXNjcmVlbiByYXRpb25hbGUuCiAgZnVuY3Rpb24gcGlja0F1dG9QaXBUYXJnZXQoKSB7CiAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHJldHVybiBkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudDsKICAgIGNvbnN0IHZpZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgIGxldCBiZXN0UGxheWluZyA9IG51bGwsIGJlc3RQbGF5aW5nQXJlYSA9IDA7CiAgICBsZXQgYmVzdFJlYWR5ID0gbnVsbCwgYmVzdFJlYWR5QXJlYSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZHMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgdiA9IHZpZHNbaV07CiAgICAgIGlmICh2LmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKSBjb250aW51ZTsKICAgICAgY29uc3QgciA9IHYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGEgPSBNYXRoLm1heCgwLCByLndpZHRoKSAqIE1hdGgubWF4KDAsIHIuaGVpZ2h0KTsKICAgICAgaWYgKGEgPD0gMCkgY29udGludWU7CiAgICAgIGlmICghdi5wYXVzZWQgJiYgIXYuZW5kZWQgJiYgdi5yZWFkeVN0YXRlID49IDIgJiYgYSA+IGJlc3RQbGF5aW5nQXJlYSkgewogICAgICAgIGJlc3RQbGF5aW5nID0gdjsgYmVzdFBsYXlpbmdBcmVhID0gYTsKICAgICAgfQogICAgICBpZiAodi5yZWFkeVN0YXRlID49IDEgJiYgYSA+IGJlc3RSZWFkeUFyZWEpIHsKICAgICAgICBiZXN0UmVhZHkgPSB2OyBiZXN0UmVhZHlBcmVhID0gYTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJlc3RQbGF5aW5nIHx8IGJlc3RSZWFkeTsKICB9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFBpUCBpY29uIGZhY3RvcnkKICAvLwogIC8vIEJ1aWx0IHdpdGggY3JlYXRlRWxlbWVudE5TIGluc3RlYWQgb2YgaW5uZXJIVE1MIHRvIGF2b2lkIFRydXN0ZWRUeXBlcwogIC8vIC8gQ1NQIGByZXF1aXJlVHJ1c3RlZFR5cGVzRm9yICdzY3JpcHQnYCB2aW9sYXRpb25zIG9uIFlvdVR1YmUgZXRjLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERlZmVuc2UtaW4tZGVwdGggaGVscGVyIHVzZWQgd2hlbiBjbG9uaW5nIHRoaXJkLXBhcnR5IHdyYXBwZXIKICAvLyBlbGVtZW50cyAoTmV0ZmxpeCdzIC5tZWRpdW0gaWNvbiB3cmFwcGVyLCBUd2l0Y2gncyByaWdodC1jb250cm9scwogIC8vIHdyYXBwZXIpLiBjbG9uZU5vZGUoZmFsc2UpIGNhcnJpZXMgZm9yd2FyZCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMKICAvLyBhbmQgdGhlIGBzdHlsZWAgYXR0cmlidXRlIOKAlCB3ZSBzdHJpcDoKICAvLyAgIC0gYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIGBvbipgICh3b3VsZCByZS1maXJlIHRoZSBzaXRlJ3MKICAvLyAgICAgaW5saW5lIGV2ZW50IGhhbmRsZXJzIG9uIG91ciBjbG9uZSksIGFuZAogIC8vICAgLSB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgaXRzZWxmIChjb3VsZCBjYXJyeSBhIGB1cmwoLi4uKWAgdG9rZW4KICAvLyAgICAgdGhhdCB0cmlnZ2VycyBhIG5ldHdvcmsgZmV0Y2ggd2hlbiB0aGUgY2xvbmUgaXMgcGFyZW50ZWQpLCBhbmQKICAvLyAgIC0gdGhlIGBpZGAgYXR0cmlidXRlIChjbG9uaW5nIHByb2R1Y2VzIGEgZHVwbGljYXRlLCB3aGljaCB3b3VsZAogIC8vICAgICBicmVhayB0aGUgc2l0ZSdzIG93biBnZXRFbGVtZW50QnlJZCAvIENTUyAjaWQgc2VsZWN0b3JzKS4KICAvLyBXZSByZWx5IG9uIHRoZSBjbG9uZWQgZWxlbWVudCdzIGNsYXNzIGxpc3QgZm9yIHNpemluZy9zcGFjaW5nLAogIC8vIHdoaWNoIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHZpYSB0aGUgc2l0ZSdzIGV4dGVybmFsIHN0eWxlc2hlZXQuCiAgZnVuY3Rpb24gc3RyaXBJbmxpbmVIYW5kbGVycyhlbCkgewogICAgY29uc3QgYXR0cnMgPSBlbC5hdHRyaWJ1dGVzOwogICAgZm9yIChsZXQgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBhdHRyc1tpXS5uYW1lOwogICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJvbiIpIHx8IG5hbWUgPT09ICJzdHlsZSIgfHwgbmFtZSA9PT0gImlkIikgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogIH0KCiAgY29uc3QgUElQX1NWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgZnVuY3Rpb24gbWFrZVBpcFN2ZyhzaXplKSB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoUElQX1NWR19OUywgInN2ZyIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgidmlld0JveCIsICIwIDAgMjQgMjQiKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgc2l6ZSk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBzaXplKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgImN1cnJlbnRDb2xvciIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjIiKTsKICAgIGNvbnN0IHIxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMS5zZXRBdHRyaWJ1dGUoIngiLCAiMyIpOyByMS5zZXRBdHRyaWJ1dGUoInkiLCAiNSIpOwogICAgcjEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsICIxOCIpOyByMS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsICIxNCIpOyByMS5zZXRBdHRyaWJ1dGUoInJ4IiwgIjIiKTsKICAgIGNvbnN0IHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIngiLCAiMTIiKTsgcjIuc2V0QXR0cmlidXRlKCJ5IiwgIjExIik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgIjciKTsgcjIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCAiNiIpOyByMi5zZXRBdHRyaWJ1dGUoInJ4IiwgIjEiKTsKICAgIHIyLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJjdXJyZW50Q29sb3IiKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChyMSk7IHN2Zy5hcHBlbmRDaGlsZChyMik7CiAgICByZXR1cm4gc3ZnOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGlQIHRvZ2dsZSBlbnRyeSBwb2ludAogIC8vCiAgLy8gU2luZ2xlIGFzeW5jIGZ1bmN0aW9uIHNoYXJlZCBieSBldmVyeSBjbGljayBoYW5kbGVyLiBXYWxrcyB0aGUKICAvLyBhdmFpbGFibGUgQVBJcyBpbiBwcmlvcml0eSBvcmRlciBhbmQgaXMgcm9idXN0IHRvIGEgY2xpY2sgdGhhdCBsYW5kcwogIC8vIGJlZm9yZSB0aGUgdmlkZW8gaGFzIGxvYWRlZCBlbm91Z2ggbWV0YWRhdGEgKHdhaXRzIHVwIHRvIDMgcykuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlUGlwKHZpZGVvKSB7CiAgICB0cnkgewogICAgICAvLyBpT1MgU2FmYXJpIHBhdGgg4oCUIHdlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUgdG9nZ2xlcyBiZXR3ZWVuCiAgICAgIC8vICJpbmxpbmUiLCAicGljdHVyZS1pbi1waWN0dXJlIiBhbmQgImZ1bGxzY3JlZW4iLgogICAgICBpZiAoIUhBU19TVEFOREFSRF9QSVAgJiYgSEFTX1dFQktJVF9QSVAgJiYKICAgICAgICAgIHR5cGVvZiB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdmlkZW8ud2Via2l0UHJlc2VudGF0aW9uTW9kZSA9PT0gInBpY3R1cmUtaW4tcGljdHVyZSIKICAgICAgICAgID8gImlubGluZSIgOiAicGljdHVyZS1pbi1waWN0dXJlIjsKICAgICAgICB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlKHRhcmdldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIFN0YW5kYXJkIEFQSSBwYXRoLgogICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQgPT09IHZpZGVvKSB7CiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZXhpdFBpY3R1cmVJblBpY3R1cmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCAxKSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7IHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSk7IHJlc29sdmUoKTsgfTsKICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgc2V0VGltZW91dChkb25lLCBDT05GSUcuTUVUQURBVEFfV0FJVF9NUyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB2aWRlby5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGF3YWl0IHZpZGVvLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIExhc3QtcmVzb3J0IGlPUyBmYWxsYmFjayBldmVuIGlmIEhBU19TVEFOREFSRF9QSVAgd2FzIGNsYWltZWQuCiAgICAgIGlmICh0eXBlb2YgdmlkZW8ud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUoInBpY3R1cmUtaW4tcGljdHVyZSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB3YXJuKCJQaVAgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTsKICAgIH0gY2F0Y2ggKGVycikgeyB3YXJuKCJQaVAgcmVxdWVzdCBmYWlsZWQ6IiwgZXJyLm1lc3NhZ2UgfHwgZXJyKTsgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gU2l0ZS1zcGVjaWZpYyBuYXRpdmUgaW5qZWN0b3JzCiAgLy8KICAvLyBFYWNoIGluamVjdG9yIGlzIGlkZW1wb3RlbnQgKHNhZmUgdG8gcmUtcnVuIHdoZW4gdGhlIHNpdGUncyBSZWFjdAogIC8vIHJvb3QgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIpIGFuZCByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAvIGZhbHNlCiAgLy8gd2hlbiB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpc24ndCBpbiB0aGUgRE9NIHlldC4gVGhleSdyZSBkcml2ZW4gYnkKICAvLyBhIHBlcnNpc3RlbnQgTXV0YXRpb25PYnNlcnZlciBpbiBgdHJ5TmF0aXZlKClgIHNvIHJlLXJlbmRlcnMgZG9uJ3QKICAvLyBwZXJtYW5lbnRseSBsb3NlIHRoZSBidXR0b24uCiAgLy8KICAvLyBTdHJhdGVneSBhY3Jvc3Mgc2l0ZXM6CiAgLy8gICAtIFlvdVR1YmU6IGluc2VydCBhIDxidXR0b24gY2xhc3M9Inl0cC1idXR0b24iPiBhbG9uZ3NpZGUgdGhlCiAgLy8gICAgIGV4aXN0aW5nIHNldHRpbmdzL21pbmlwbGF5ZXIvc2l6ZSBpY29ucy4gSW5oZXJpdHMgWW91VHViZSdzCiAgLy8gICAgIGF1dG8tZmFkZSAvIGhvdmVyIGJlaGF2aW91ciBmb3IgZnJlZS4KICAvLyAgIC0gVHdpdGNoOiBjbG9uZSB0aGUgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgcmlnaHQtc2lkZSBjb250cm9sCiAgLy8gICAgIGJ1dHRvbiAoc2V0dGluZ3MvZnVsbHNjcmVlbi90aGVhdHJlKSBhbmQgcGxhY2Ugb3VyIGJ1dHRvbiBpbnNpZGUsCiAgLy8gICAgIHNvIHdlIGluaGVyaXQgVHdpdGNoJ3MgZmxleCBzcGFjaW5nIGNsYXNzZXMuCiAgLy8gICAtIE5ldGZsaXg6IGNsb25lIHRoZSAubWVkaXVtIGljb24gd3JhcHBlciAqYW5kKiB0aGUgM3JlbSBzcGFjZXIKICAvLyAgICAgdGhhdCBzaXRzIGJldHdlZW4gc2libGluZ3MsIHNvIHRoZSByaHl0aG0gb2YgdGhlIGljb24gcm93IGlzCiAgLy8gICAgIHByZXNlcnZlZCBhbmQgZnVsbHNjcmVlbiBzdGF5cyBpbiBpdHMgcm93LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGFkZFlvdVR1YmVCdXR0b24odmlkZW8pIHsKICAgIGlmIChfc2l0ZURpc2FibGVkKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCByaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi55dHAtcmlnaHQtY29udHJvbHMiKTsKICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTsKICAgIGlmIChyaWdodC5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgYnRuLmNsYXNzTmFtZSA9ICJ5dHAtYnV0dG9uIGJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjp0b3A7Y29sb3I6I2ZmZjsiOwogICAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDM2KTsKICAgICAgc3ZnLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTpibG9jazsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwoKICAgICAgY29uc3QgYW5jaG9yID0gcmlnaHQucXVlcnlTZWxlY3RvcigiLnl0cC1taW5pcGxheWVyLWJ1dHRvbiwgLnl0cC1zZXR0aW5ncy1idXR0b24sIC55dHAtc2l6ZS1idXR0b24iKTsKICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IucGFyZW50Tm9kZSkgewogICAgICAgIGFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShidG4sIGFuY2hvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmlnaHQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgfQogICAgICBsb2coImluamVjdGVkIG9uIFlvdVR1YmUiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgd2FybigiWW91VHViZSBpbmplY3QgZmFpbGVkOiIsIGVyci5tZXNzYWdlIHx8IGVycik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIFR3aXRjaDogY2xvbmUgdGhlIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHJpZ2h0LXNpZGUgY29udHJvbCBidXR0b24KICAvLyAoc2V0dGluZ3Mgb3IgZnVsbHNjcmVlbikgYW5kIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUgaXQsIHRoZW4gaW5zZXJ0IGF0CiAgLy8gdGhlIHNhbWUgRE9NIGxldmVsIHNvIHNwYWNpbmcvc2l6aW5nIG1hdGNoLgogIGxldCB0d2l0Y2hJbmplY3RDb3VudCA9IDA7CiAgZnVuY3Rpb24gYWRkVHdpdGNoQnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgLy8gQW5jaG9yIG9uIHRoZSBmdWxsc2NyZWVuIC8gdGhlYXRyZSByb3cgc28gd2UgbGFuZCBhbG9uZ3NpZGUgY2FzdCwKICAgIC8vIHRoZWF0cmUgYW5kIGZ1bGxzY3JlZW4g4oCUIHNldHRpbmdzIG9mdGVuIGxpdmVzIGluIGEgc2VwYXJhdGUgcm93IGluCiAgICAvLyB0aGUgcG9wb3V0IHBsYXllciBsYXlvdXQuCiAgICBjb25zdCBQRUVSX1NFTCA9CiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWZ1bGxzY3JlZW4tYnV0dG9uIl0sJyArCiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLXRoZWF0cmUtbW9kZS1idXR0b24iXSwnICsKICAgICAgJ1tkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItc2V0dGluZ3MtYnV0dG9uIl0nOwogICAgY29uc3QgYW5jaG9yQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihQRUVSX1NFTCk7CiAgICBpZiAoIWFuY2hvckJ0bikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFdhbGsgdXAgdG8gdGhlIHJvdyBjb250YWluZXIuIFR3byBzdG9wIHNpZ25hbHMsIGluIHByaW9yaXR5IG9yZGVyOgogICAgLy8gICAxLiBTdHJvbmc6IGEgcGFyZW50IHRoYXQgaGFzIG11bHRpcGxlIGNoaWxkcmVuIEFORCBjb250YWlucyBhCiAgICAvLyAgICAgIHBlZXIgY29udHJvbCBvdXRzaWRlIG91ciBjdXJyZW50IHN1YnRyZWUg4oCUIHRoYXQncyBhbG1vc3QKICAgIC8vICAgICAgY2VydGFpbmx5IHRoZSBhY3R1YWwgY29udHJvbCByb3cuCiAgICAvLyAgIDIuIFdlYWsgKGZhbGxiYWNrKTogdGhlIGZpcnN0IHBhcmVudCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuIHdlCiAgICAvLyAgICAgIHBhc3NlZCBkdXJpbmcgdGhlIHdhbGsuIFVzZWQgd2hlbiB0aGUgc3Ryb25nIHNpZ25hbCBuZXZlcgogICAgLy8gICAgICBmaXJlcywgc28gbGF5b3V0cyB0aGF0IGRvbid0IGV4cG9zZSBwZWVyIGNvbnRyb2xzIGF0IHRoZQogICAgLy8gICAgICBzYW1lIGxldmVsIHN0aWxsIHdvcmsuCiAgICAvLyBDb21iaW5lZCwgdGhpcyBhZGRyZXNzZXMgdGhlIHJldmlldyBjb25jZXJuIGFib3V0IG5vbi1jb250cm9sCiAgICAvLyBzaWJsaW5ncyBoaWphY2tpbmcgdGhlIHN0cnVjdHVyYWwgd2FsayB3aGlsZSBrZWVwaW5nIHRoZSBvcmlnaW5hbAogICAgLy8gYmVoYXZpb3VyIGFzIGEgc2FmZXR5IG5ldC4KICAgIGxldCBhbmNob3JXcmFwcGVyID0gYW5jaG9yQnRuOwogICAgbGV0IHN0cnVjdHVyYWxGYWxsYmFjayA9IG51bGw7CiAgICB3aGlsZSAoYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlICYmIGFuY2hvcldyYXBwZXIucGFyZW50Tm9kZS50YWdOYW1lICE9PSAiQk9EWSIpIHsKICAgICAgY29uc3QgcGFyZW50ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50LmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgICBjb25zdCBwZWVycyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFBFRVJfU0VMKTsKICAgICAgICBsZXQgaGFzT3V0c2lkZVBlZXIgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIWFuY2hvcldyYXBwZXIuY29udGFpbnMocGVlcnNbaV0pKSB7IGhhc091dHNpZGVQZWVyID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc091dHNpZGVQZWVyKSBicmVhazsKICAgICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgc3RydWN0dXJhbEZhbGxiYWNrID0gYW5jaG9yV3JhcHBlcjsKICAgICAgfQogICAgICBhbmNob3JXcmFwcGVyID0gcGFyZW50OwogICAgfQogICAgaWYgKCFhbmNob3JXcmFwcGVyLnBhcmVudE5vZGUgfHwgYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlLnRhZ05hbWUgPT09ICJCT0RZIikgewogICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgcmV0dXJuIGZhbHNlOwogICAgICBhbmNob3JXcmFwcGVyID0gc3RydWN0dXJhbEZhbGxiYWNrOwogICAgfQogICAgY29uc3Qgcm93ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKICAgIGlmIChyb3cucXVlcnlTZWxlY3RvcigiLmJyYXZlLXBpcC1idG4iKSkgcmV0dXJuIHRydWU7CiAgICAvLyBTYW5pdHkgY2hlY2s6IGEgaGVhbHRoeSBUd2l0Y2ggcmlnaHQtY29udHJvbHMgcm93IGNvbnRhaW5zIGF0CiAgICAvLyBsZWFzdCB0d28gb2YgdGhlIHBlZXIgYnV0dG9ucyAoc2V0dGluZ3MgKyB0aGVhdHJlICsgZnVsbHNjcmVlbikuCiAgICAvLyBJZiBvbmx5IG9uZSBpcyBwcmVzZW50LCB0aGUgd2FsayBsYW5kZWQgb24gYSBkZWdlbmVyYXRlIHJvdwogICAgLy8gKHBvcG91dCAvIGRldGFjaGVkIHBsYXllciAvIGZ1dHVyZSByZWRlc2lnbikgYW5kIHdlIHNob3VsZCBiYWlsCiAgICAvLyByYXRoZXIgdGhhbiBtaXMtdGFyZ2V0LiBDaGVhcCDigJQgb25lIHF1ZXJ5U2VsZWN0b3JBbGwsIG5vIHdhbGtpbmcuCiAgICBpZiAocm93LnF1ZXJ5U2VsZWN0b3JBbGwoUEVFUl9TRUwpLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTsKCiAgICB0cnkgewogICAgICAvLyBDbG9uZSB0aGUgYW5jaG9yJ3Mgb3V0ZXIgd3JhcHBlciAoc2hhbGxvdykgc28gd2UgaW5oZXJpdCBUd2l0Y2gncwogICAgICAvLyBzcGFjaW5nL2ZsZXggY2xhc3NlcywgdGhlbiBkcm9wIG91ciBvd24gYnV0dG9uIGluc2lkZS4KICAgICAgY29uc3Qgd3JhcHBlciA9IGFuY2hvcldyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hLXRhcmdldCIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpOwogICAgICBzdHJpcElubGluZUhhbmRsZXJzKHdyYXBwZXIpOwoKICAgICAgLy8gU2l6ZSBmcm9tIHRoZSByZW5kZXJlZCBTVkcgZ2x5cGggKHZpc3VhbGx5IGFjY3VyYXRlKS4gRmxvb3IgYXQgMjQKICAgICAgLy8gYmVjYXVzZSBUd2l0Y2gncyB1bmRlcmx5aW5nIFNWRyBlbGVtZW50IGlzIHNvbWV0aW1lcyBzbWFsbGVyIHRoYW4KICAgICAgLy8gdGhlIHZpc3VhbCBpY29uIChDU1Mgc2NhbGVzIGl0IHVwKS4KICAgICAgY29uc3QgcmVmU3ZnID0gYW5jaG9yQnRuLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpOwogICAgICBjb25zdCByZWZTdmdSZWN0ID0gcmVmU3ZnID8gcmVmU3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDsKICAgICAgY29uc3QgcmVmQnRuUmVjdCA9IGFuY2hvckJ0bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgbWVhc3VyZWQgPSByZWZTdmdSZWN0ICYmIHJlZlN2Z1JlY3Qud2lkdGggPiAwCiAgICAgICAgPyBNYXRoLm1pbihyZWZTdmdSZWN0LndpZHRoLCByZWZTdmdSZWN0LmhlaWdodCkKICAgICAgICA6IE1hdGgubWluKHJlZkJ0blJlY3Qud2lkdGgsIHJlZkJ0blJlY3QuaGVpZ2h0KSAqIDAuNzsKICAgICAgY29uc3QgaWNvblNpemUgPSBNYXRoLm1heCgyNCwgTWF0aC5yb3VuZChtZWFzdXJlZCkpOwogICAgICBjb25zdCBib3hTaXplID0gTWF0aC5tYXgoMzAsIE1hdGgucm91bmQocmVmQnRuUmVjdC53aWR0aCB8fCAzMCkpOwoKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgIGJ0bi5jbGFzc05hbWUgPSAiYnJhdmUtcGlwLWJ0biI7CiAgICAgIGJ0bi50eXBlID0gImJ1dHRvbiI7CiAgICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgICBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlBpY3R1cmUtaW4tUGljdHVyZSIpOwogICAgICBidG4uc3R5bGUuY3NzVGV4dCA9CiAgICAgICAgImJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7cGFkZGluZzowO21hcmdpbjowOyIgKwogICAgICAgICJjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyIgKwogICAgICAgICJ3aWR0aDoiICsgYm94U2l6ZSArICJweDtoZWlnaHQ6IiArIGJveFNpemUgKyAicHg7IjsKICAgICAgY29uc3Qgc3ZnID0gbWFrZVBpcFN2ZyhpY29uU2l6ZSk7CiAgICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7Y29sb3I6I2ZmZjsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwogICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGJ0bik7CgogICAgICByb3cuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIGFuY2hvcldyYXBwZXIpOwoKICAgICAgdHdpdGNoSW5qZWN0Q291bnQrKzsKICAgICAgaWYgKHR3aXRjaEluamVjdENvdW50ID09PSAxKSBsb2coImluamVjdGVkIG9uIFR3aXRjaCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICB3YXJuKCJUd2l0Y2ggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyBOZXRmbGl4OiBpbnNlcnQgaW50byB0aGUgc3RhbmRhcmQgY29udHJvbHMgYmFyLCBiZWZvcmUgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uLgogIC8vIE5ldGZsaXggcmFuZG9taXplcyBjbGFzcyBuYW1lcyBidXQgaWNvbnMgZm9sbG93IGEgY29uc2lzdGVudCBwYXR0ZXJuOgogIC8vICAgPGZsZXgtcm93PgogIC8vICAgICA8c3BhY2VyIC4xbnBxeXdyPiAuLi4gPHdyYXBwZXIgLm1lZGl1bT4gPGljb24tYnV0dG9uPiA8L3dyYXBwZXI+CiAgLy8gICAgIDxzcGFjZXIgLjFucHF5d3I+ICAgICA8d3JhcHBlciAubWVkaXVtPiA8aWNvbi1idXR0b24+IDwvd3JhcHBlcj4KICAvLyAgICAgPHNwYWNlciAuMW5wcXl3cj4gICAgIDx3cmFwcGVyIC5tZWRpdW0+IDxpY29uLWJ1dHRvbiBkYXRhLXVpYT0iY29udHJvbC1mdWxsc2NyZWVuLS4uLiI+IDwvd3JhcHBlcj4KICAvLyBXZSBjbG9uZSB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyIChhbmQgdGhlIHNwYWNlciBpbiBmcm9udCBvZiBpdCkgc28gb3VyCiAgLy8gYnV0dG9uIGdldHMgdGhlIHNhbWUgc3R5bGluZyBhbmQgcmh5dGhtIGFzIG5hdGl2ZSBpY29ucy4KICBsZXQgbmZseEluamVjdENvdW50ID0gMDsKICBmdW5jdGlvbiBhZGROZXRmbGl4QnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJyk7CiAgICBpZiAoIWJhcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGJhci5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBmcyA9IGJhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1lbnRlciJdLCBbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1leGl0Il0nKTsKICAgICAgaWYgKCFmcykgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRmluZCBOZXRmbGl4J3MgaWNvbiB3cmFwcGVyIGFyb3VuZCBmdWxsc2NyZWVuIOKAlCB0aGUgLm1lZGl1bSBjbGFzcwogICAgICAvLyBpcyB0aGUgc3RhYmxlIHNpZ25hbDsgZmFsbCBiYWNrIHRvIHRoZSBjbG9zZXN0IGRpdi4KICAgICAgY29uc3QgZnNXcmFwcGVyID0gZnMuY2xvc2VzdCgiLm1lZGl1bSIpIHx8IGZzLmNsb3Nlc3QoImRpdiIpIHx8IGZzOwogICAgICBjb25zdCByb3cgPSBmc1dyYXBwZXIucGFyZW50Tm9kZTsKICAgICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFNpemUgZnJvbSB0aGUgaW5uZXIgc3ZnIG9mIGZ1bGxzY3JlZW4ncyBidXR0b24gc28gd2UgdmlzdWFsbHkgbWF0Y2guCiAgICAgIGNvbnN0IHJlZlN2ZyA9IGZzLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpIHx8IChmcy5jbG9zZXN0KCJidXR0b24iKSB8fCBmcykucXVlcnlTZWxlY3Rvcigic3ZnIik7CiAgICAgIGNvbnN0IHJlZlN2Z1JlY3QgPSByZWZTdmcgPyByZWZTdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsOwogICAgICBjb25zdCBpY29uU2l6ZSA9IHJlZlN2Z1JlY3QgJiYgcmVmU3ZnUmVjdC53aWR0aCA+IDAKICAgICAgICA/IE1hdGgucm91bmQoTWF0aC5taW4ocmVmU3ZnUmVjdC53aWR0aCwgcmVmU3ZnUmVjdC5oZWlnaHQpKQogICAgICAgIDogMjg7CgogICAgICAvLyBDbG9uZSB0aGUgd3JhcHBlciAoc2hhbGxvdyDigJQgcHJlc2VydmVzIGNsYXNzZXMvaW5saW5lIHN0eWxlcykgYW5kCiAgICAgIC8vIGVtcHR5IGl0LCB0aGVuIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUuCiAgICAgIGNvbnN0IHdyYXBwZXIgPSBmc1dyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS11aWEiKTsKICAgICAgc3RyaXBJbmxpbmVIYW5kbGVycyh3cmFwcGVyKTsKCiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidG4uY2xhc3NOYW1lID0gImJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPQogICAgICAgICJiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO3BhZGRpbmc6MDttYXJnaW46MDsiICsKICAgICAgICAid2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyI7CiAgICAgIGNvbnN0IHN2ZyA9IG1ha2VQaXBTdmcoaWNvblNpemUpOwogICAgICBzdmcuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OmJsb2NrOyI7CiAgICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZVBpcCh2aWRlbyk7IH0pOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBfb25OYXRpdmVCdG5Db250ZXh0TWVudSk7CiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYnRuKTsKCiAgICAgIC8vIENsb25lIHRoZSBzcGFjZXIgdGhhdCBwcmVjZWRlcyB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyLCBzbyBzcGFjaW5nCiAgICAgIC8vIGJldHdlZW4gb3VyIGJ1dHRvbiBhbmQgZnVsbHNjcmVlbiBtYXRjaGVzIHRoZSByaHl0aG0gYmV0d2VlbgogICAgICAvLyBleGlzdGluZyBpY29ucy4KICAgICAgY29uc3QgcHJldlNwYWNlciA9IGZzV3JhcHBlci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwogICAgICBjb25zdCBzcGFjZXJDbG9uZSA9IChwcmV2U3BhY2VyICYmIHByZXZTcGFjZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKQogICAgICAgID8gcHJldlNwYWNlci5jbG9uZU5vZGUoZmFsc2UpCiAgICAgICAgOiBudWxsOwoKICAgICAgcm93Lmluc2VydEJlZm9yZSh3cmFwcGVyLCBmc1dyYXBwZXIpOwogICAgICBpZiAoc3BhY2VyQ2xvbmUpIHJvdy5pbnNlcnRCZWZvcmUoc3BhY2VyQ2xvbmUsIGZzV3JhcHBlcik7CgogICAgICBuZmx4SW5qZWN0Q291bnQrKzsKICAgICAgaWYgKG5mbHhJbmplY3RDb3VudCA9PT0gMSkgbG9nKCJpbmplY3RlZCBvbiBOZXRmbGl4Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHdhcm4oIk5ldGZsaXggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBHZW5lcmljIEZpcmVmb3gtc3R5bGUgb3ZlcmxheQogIC8vCiAgLy8gVXNlZCBvbiBldmVyeSBzaXRlIGJ5IGRlZmF1bHQgKHVubGVzcyBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAgaXMKICAvLyBleHBsaWNpdGx5IHNldCB0byAiMCIpLiBNaW1pY3MgRmlyZWZveCdzICJQb3Agb3V0IHRoaXMgdmlkZW8iIHRvZ2dsZToKICAvLyBhIGRhcmsgcGlsbCBhbmNob3JlZCBtaWQtcmlnaHQgb2YgdGhlIHZpZGVvIHRoYXQgZmFkZXMgaW4gb24gaG92ZXIKICAvLyBhbmQgZmFkZXMgb3V0IGFmdGVyIHRoZSBjdXJzb3IgbGVhdmVzLiBBZnRlciB0aGUgdXNlciBjbGlja3Mgb25jZSBpdAogIC8vIHNocmlua3MgdG8gaWNvbi1vbmx5IGZvciB0aGUgcmVzdCBvZiB0aGUgc2Vzc2lvbiDigJQgbGVzcyB2aXN1YWwgbm9pc2UKICAvLyBvbiBzdWJzZXF1ZW50IGhvdmVycy4KICAvLwogIC8vIEhvdmVyIGRldGVjdGlvbiBydW5zIHRocm91Z2ggdGhlIHNoYXJlZCBgX29uRG9jTW91c2VNb3ZlYCBoYW5kbGVyCiAgLy8gKHNlZSB0b3Agb2YgZmlsZSkgaW5zdGVhZCBvZiBgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIpYCwKICAvLyBiZWNhdXNlIG1hbnkgcGxheWVycyAoTmV0ZmxpeCwgY3VzdG9tKSBsYXllciB0aGVpciBVSSBvbiB0b3Agb2YgdGhlCiAgLy8gPHZpZGVvPiBhbmQgYWJzb3JiIG1vdXNlIGV2ZW50cyBiZWZvcmUgdGhleSByZWFjaCBpdC4gQSBnbG9iYWwKICAvLyBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIGJ5cGFzc2VzIHRoYXQuCiAgLy8KICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSBwaWxsIGlzIHRhcC10by1yZXZlYWwgKDMgcyBhdXRvLWZhZGUpIGluc3RlYWQuCiAgLy8KICAvLyBgdGVhcmRvd25zYCBpcyBhbiBhcnJheSB0aGUgY2FsbGVyIChgYXR0YWNoVG9WaWRlb2ApIGhhbmRzIGluOyB3ZQogIC8vIHB1c2ggY2xlYW51cCBjbG9zdXJlcyBvbnRvIGl0IHNvIGEgbGF0ZXIgY2xlYW51cCBvZiB0aGlzIHZpZGVvCiAgLy8gcmVsZWFzZXMgZXZlcnkgbGlzdGVuZXIgLyBvYnNlcnZlciAvIERPTSBub2RlIHdlIGNyZWF0ZWQgaGVyZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIFJlYWNoaW5nIGhlcmUgbWVhbnMgYGF0dGFjaFRvVmlkZW9gJ3MgYHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKWAKICAgIC8vIGd1YXJkIGFscmVhZHkgc2hvcnQtY2lyY3VpdGVkIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zLCBzbyBubwogICAgLy8gc2VwYXJhdGUgZGF0YXNldCBtYXJrZXIgaXMgbmVlZGVkLgogICAgLy8gUGVyLW9yaWdpbiBvcHQtb3V0OiBza2lwIGJ1aWxkaW5nIGFueXRoaW5nIGlmIHRoZSB1c2VyIHByZXZpb3VzbHkKICAgIC8vIGRpc2FibGVkIHRoZSBwaWxsIG9uIHRoaXMgc2l0ZSB2aWEgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuCiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuOwogICAgY29uc3QgUEFERElOR19GVUxMID0gIjhweCAxNHB4IDhweCAxMHB4IjsKICAgIGNvbnN0IFBBRERJTkdfSUNPTiA9ICI4cHgiOwoKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgYnRuLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0KICAgICAgInBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDsiICsKICAgICAgInBhZGRpbmc6IiArIFBBRERJTkdfRlVMTCArICI7IiArCiAgICAgICJib3JkZXI6MDtib3JkZXItcmFkaXVzOjhweDsiICsKICAgICAgImJhY2tncm91bmQ6cmdiYSgyOCwyOCwzMCwwLjkyKTtjb2xvcjojZmZmOyIgKwogICAgICAiZm9udDo2MDAgMTNweC8xIHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxzYW5zLXNlcmlmOyIgKwogICAgICAiY3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiYm94LXNoYWRvdzowIDJweCA4cHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAib3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAwLjE1cyBlYXNlOyIgKwogICAgICAicG9pbnRlci1ldmVudHM6YXV0bzt1c2VyLXNlbGVjdDpub25lOyI7CiAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDE4KTsKICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7IjsKICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICJQb3Agb3V0IHRoaXMgdmlkZW8iOwogICAgYnRuLmFwcGVuZENoaWxkKGxhYmVsKTsKCiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCAoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNob3dEaXNhYmxlTWVudShlLmNsaWVudFgsIGUuY2xpZW50WSk7CiAgICB9KTsKCiAgICBsZXQgY2xpY2tlZCA9IGZhbHNlOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBpZiAoIWNsaWNrZWQpIHsKICAgICAgICBjbGlja2VkID0gdHJ1ZTsKICAgICAgICAvLyBTdXBwcmVzcyBmYWRlIHNvIHRoZSBpY29uLW9ubHkgcGlsbCBpcyBpbiBpdHMgZmluYWwgcG9zaXRpb24KICAgICAgICAvLyBiZWZvcmUgdGhlIHVzZXIgbm90aWNlcyB0aGUgY2hhbmdlLgogICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gYnRuLnN0eWxlLnRyYW5zaXRpb247CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSAibm9uZSI7CiAgICAgICAgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9IFBBRERJTkdfSUNPTjsKICAgICAgICBidG4uc3R5bGUuZ2FwID0gIjAiOwogICAgICAgIHVwZGF0ZSgpOyAvLyBzeW5jaHJvbm91cyByZXBvc2l0aW9uIGZvciB0aGUgbmV3IChzbWFsbGVyKSBib3gKICAgICAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyB0aGUgbmV4dCBzdHlsZSBjaGFuZ2UgaXMgY29tbWl0dGVkIHdpdGhvdXQKICAgICAgICAvLyBhIHRyYW5zaXRpb24sIHRoZW4gcmVzdG9yZSB0aGUgZmFkZSB0cmFuc2l0aW9uLgogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMKICAgICAgICBidG4ub2Zmc2V0V2lkdGg7CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsKICAgICAgfQogICAgICB0b2dnbGVQaXAodmlkZW8pOwogICAgfSk7CiAgICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGJ0bik7CgogICAgbGV0IGhvdmVyID0gZmFsc2U7CiAgICBsZXQgaG92ZXJUaW1lciA9IG51bGw7CiAgICBsZXQgbGFzdFJlY3QgPSBudWxsOwogICAgbGV0IHRvdWNoSGlkZVRpbWVyID0gbnVsbDsKICAgIGZ1bmN0aW9uIHNldEhvdmVyKHYpIHsKICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICBpZiAodikgeyBob3ZlciA9IHRydWU7IHVwZGF0ZSgpOyB9CiAgICAgIGVsc2UgICB7IGhvdmVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgaG92ZXIgPSBmYWxzZTsgdXBkYXRlKCk7IH0sIENPTkZJRy5IT1ZFUl9HUkFDRV9NUyk7IH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0OwogICAgICBpZiAoIXIpIHJldHVybjsKICAgICAgY29uc3Qgb3ZlclZpZGVvID0KICAgICAgICB4ID49IHIubGVmdCAmJiB4IDw9IHIucmlnaHQgJiYKICAgICAgICB5ID49IHIudG9wICAmJiB5IDw9IHIuYm90dG9tOwogICAgICBsZXQgb3ZlckJ0biA9IGZhbHNlOwogICAgICBpZiAoYnRuLnN0eWxlLmRpc3BsYXkgIT09ICJub25lIikgewogICAgICAgIGNvbnN0IGJSZWN0ID0gYnRuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIG92ZXJCdG4gPQogICAgICAgICAgeCA+PSBiUmVjdC5sZWZ0ICYmIHggPD0gYlJlY3QucmlnaHQgJiYKICAgICAgICAgIHkgPj0gYlJlY3QudG9wICAmJiB5IDw9IGJSZWN0LmJvdHRvbTsKICAgICAgfQogICAgICBpZiAob3ZlclZpZGVvIHx8IG92ZXJCdG4pIHsgaWYgKCFob3Zlcikgc2V0SG92ZXIodHJ1ZSk7IH0KICAgICAgZWxzZSBpZiAoaG92ZXIpIHNldEhvdmVyKGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0IHx8IHZpZGVvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBsYXN0UmVjdCA9IHI7CiAgICAgIGNvbnN0IG92ZXJWaWRlbyA9CiAgICAgICAgeCA+PSByLmxlZnQgJiYgeCA8PSByLnJpZ2h0ICYmCiAgICAgICAgeSA+PSByLnRvcCAgJiYgeSA8PSByLmJvdHRvbTsKICAgICAgaWYgKCFvdmVyVmlkZW8pIHJldHVybjsKICAgICAgc2V0SG92ZXIodHJ1ZSk7CiAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgY2xlYXJUaW1lb3V0KHRvdWNoSGlkZVRpbWVyKTsKICAgICAgdG91Y2hIaWRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0b3VjaEhpZGVUaW1lciA9IG51bGw7CiAgICAgICAgc2V0SG92ZXIoZmFsc2UpOwogICAgICB9LCBDT05GSUcuVE9VQ0hfUkVWRUFMX01TKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgIC8vIE1hdGNoIEZpcmVmb3g6IHNob3cgb24gaG92ZXIgcmVnYXJkbGVzcyBvZiBwYXVzZWQgc3RhdGUuIE9ubHkKICAgICAgLy8gcmVxdWlyZSB0aGF0IHRoZSB2aWRlbyBoYXMgbWV0YWRhdGEgbG9hZGVkIChzbyBQaVAgaXMgdXNhYmxlKSwKICAgICAgLy8gaXMgdmlzaWJsZSwgYW5kIHdlJ3JlIG5vdCBpbiBmdWxsc2NyZWVuIChpbmNsLiBpT1Mgd2Via2l0IEZTKS4KICAgICAgLy8gQWxzbyBob25vdXIgYSBtaWQtc2Vzc2lvbiBkaXNhYmxlIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUKICAgICAgLy8gKGNhY2hlZCBgX3NpdGVEaXNhYmxlZGAgZmxhZyDigJQgbm8gbG9jYWxTdG9yYWdlIGhpdCBwZXIgdGljaykuCiAgICAgIGlmIChfc2l0ZURpc2FibGVkKSB7CiAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlYWR5ID0gdmlkZW8ucmVhZHlTdGF0ZSA+PSAxOwogICAgICBjb25zdCBmcyA9IGlzRnVsbHNjcmVlbih2aWRlbyk7CiAgICAgIGNvbnN0IHIgPSB2aWRlby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbGFzdFJlY3QgPSByOwogICAgICBjb25zdCBvblNjcmVlbiA9IHIud2lkdGggPiAwICYmIHIuaGVpZ2h0ID4gMCAmJiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCBpbm5lckhlaWdodDsKICAgICAgLy8gWW91VHViZSBVUkwgZ2F0ZSArIFNQQS1uYXYtZ3JhY2UuIFJlZnJlc2ggdGhlIGNhY2hlZCBwcmV2aWV3LWFyZWEKICAgICAgLy8gZmxhZyBhbmQgc3RhbXAgYSBuYXZpZ2F0aW9uIHRpbWVzdGFtcCBvbiBwYXRoIGNoYW5nZSwgdGhlbgogICAgICAvLyBzdXBwcmVzcyBlbGlnaWJpbGl0eSB3aGlsZSB3ZSdyZSBlaXRoZXIgb24gYSBub24td2F0Y2ggVVJMIG9yCiAgICAgIC8vIGluc2lkZSB0aGUgcG9zdC1uYXYgZ3JhY2Ugd2luZG93IChhYnNvcmJzIHRoZSBicmllZiBmbGFzaCB3aGVuCiAgICAgIC8vIGEgaG9tZXBhZ2UgdGh1bWJuYWlsIGNsaWNrIGxhbmRzIHRoZSBjdXJzb3Igb24gdGhlIG5ldyBwbGF5ZXIpLgogICAgICBpZiAoX3l0SG9zdCAmJiBfeXRMYXN0UGF0aCAhPT0gbG9jYXRpb24ucGF0aG5hbWUpIHsKICAgICAgICBfeXRMYXN0UGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgIF95dFByZXZpZXdBcmVhID0gIV95dFdhdGNoUGF0aC50ZXN0KF95dExhc3RQYXRoKTsKICAgICAgICBfeXROYXZBdCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICAgIGNvbnN0IF9pbk5hdkdyYWNlID0gX3l0TmF2QXQgJiYgKHBlcmZvcm1hbmNlLm5vdygpIC0gX3l0TmF2QXQpIDwgQ09ORklHLllUX05BVl9HUkFDRV9NUzsKICAgICAgY29uc3QgZWxpZ2libGUgPSByZWFkeSAmJiAhZnMgJiYgb25TY3JlZW4gJiYgIV95dFByZXZpZXdBcmVhICYmICFfaW5OYXZHcmFjZTsKICAgICAgaWYgKCFlbGlnaWJsZSkgewogICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gIm5vbmUiOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtZmxleCI7CiAgICAgIGNvbnN0IHcgPSBidG4ub2Zmc2V0V2lkdGggfHwgMTcwOwogICAgICBjb25zdCBoID0gYnRuLm9mZnNldEhlaWdodCB8fCAzNjsKCiAgICAgIC8vIENvbXB1dGUgbWlkLXJpZ2h0IG9mIHRoZSAqdmlzaWJsZSogcG9ydGlvbiBvZiB0aGUgdmlkZW8gKHRoZQogICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgaXRzIHJlY3Qgd2l0aCB0aGUgdmlld3BvcnQpLiBOZXRmbGl4J3MgPHZpZGVvPgogICAgICAvLyBjYW4gYmUgbXVjaCB0YWxsZXIgdGhhbiB0aGUgdmlld3BvcnQuCiAgICAgIGNvbnN0IHZpc1RvcCA9IE1hdGgubWF4KHIudG9wLCAwKTsKICAgICAgY29uc3QgdmlzQm90dG9tID0gTWF0aC5taW4oci5ib3R0b20sIGlubmVySGVpZ2h0KTsKICAgICAgY29uc3QgdmlzUmlnaHQgPSBNYXRoLm1pbihyLnJpZ2h0LCBpbm5lcldpZHRoKTsKICAgICAgbGV0IHRvcCA9IE1hdGgucm91bmQodmlzVG9wICsgKHZpc0JvdHRvbSAtIHZpc1RvcCAtIGgpIC8gMikgKyBDT05GSUcuUElMTF9PRkZTRVRfWTsKICAgICAgbGV0IGxlZnQgPSBNYXRoLnJvdW5kKHZpc1JpZ2h0IC0gdyAtIENPTkZJRy5QSUxMX1JJR0hUX01BUkdJTik7CiAgICAgIC8vIEZpbmFsIHZpZXdwb3J0IGNsYW1wLgogICAgICB0b3AgPSBNYXRoLm1heChDT05GSUcuVklFV1BPUlRfUEFELCBNYXRoLm1pbih0b3AsIGlubmVySGVpZ2h0IC0gaCAtIENPTkZJRy5WSUVXUE9SVF9QQUQpKTsKICAgICAgbGVmdCA9IE1hdGgubWF4KENPTkZJRy5WSUVXUE9SVF9QQUQsIE1hdGgubWluKGxlZnQsIGlubmVyV2lkdGggLSB3IC0gQ09ORklHLlZJRVdQT1JUX1BBRCkpOwoKICAgICAgYnRuLnN0eWxlLnRvcCA9IHRvcCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gaG92ZXIgPyAiMSIgOiAiMCI7CiAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gaG92ZXIgPyAiYXV0byIgOiAibm9uZSI7CiAgICB9CgogICAgY29uc3Qgb25CdG5FbnRlciA9ICgpID0+IHNldEhvdmVyKHRydWUpOwogICAgY29uc3Qgb25CdG5MZWF2ZSA9ICgpID0+IHNldEhvdmVyKGZhbHNlKTsKCiAgICAvLyBQZXItdmlkZW8gbGlzdGVuZXJzIHN0YXkgb24gdGhlIHZpZGVvIGVsZW1lbnQuIERvY3VtZW50L3dpbmRvdwogICAgLy8gbGlzdGVuZXJzIGFyZSBzaGFyZWQgdmlhIHRoZSBtb2R1bGUtbGV2ZWwgYG92ZXJsYXlzYCByZWdpc3RyeQogICAgLy8gKG9uZSBzZXQgb2YgZ2xvYmFscyByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHZpZGVvcyBhcmUgb24gdGhlIHBhZ2UpLgogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgb25CdG5MZWF2ZSk7CiAgICBjb25zdCBWSURFT19FVkVOVFMgPSBbInBsYXkiLCJwbGF5aW5nIiwicGF1c2UiLCJlbmRlZCIsImVtcHRpZWQiLCJsb2FkZWRkYXRhIl07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFZJREVPX0VWRU5UUy5sZW5ndGg7IGkrKykgewogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIH0KICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGJlZ2luZnVsbHNjcmVlbiIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICByby5vYnNlcnZlKHZpZGVvKTsKCiAgICBjb25zdCBpbnN0YW5jZSA9IHsgdXBkYXRlLCBoYW5kbGVQb2ludGVyLCBoYW5kbGVUb3VjaCB9OwogICAgb3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIHZpZGVvVG9PdmVybGF5LnNldCh2aWRlbywgaW5zdGFuY2UpOwogICAgY29uc3QgaW8gPSBnZXRJTygpOwogICAgaWYgKGlvKSB7CiAgICAgIGlvLm9ic2VydmUodmlkZW8pOwogICAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBmaXJlcyBhIGNhbGxiYWNrIHN5bmNocm9ub3VzbHkgYWZ0ZXIKICAgICAgLy8gb2JzZXJ2ZSgpIGluIGEgbWljcm90YXNrLiBVbnRpbCB0aGVuIGFzc3VtZSB0aGUgdmlkZW8gaXMKICAgICAgLy8gdmlzaWJsZSBzbyB0aGUgdmVyeSBmaXJzdCB1cGRhdGUoKSBydW5zLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIElPIHN1cHBvcnQg4oCUIGZhbGwgYmFjayB0byAiYWx3YXlzIHZpc2libGUiLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0KICAgIGFybUdsb2JhbHMoKTsKICAgIHVwZGF0ZSgpOwoKICAgIGlmICh0ZWFyZG93bnMpIHsKICAgICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICAgIG92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgaWYgKGludGVyc2VjdGlvbk9ic2VydmVyKSBpbnRlcnNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUodmlkZW8pOwogICAgICAgIHZpZGVvVG9PdmVybGF5LmRlbGV0ZSh2aWRlbyk7CiAgICAgICAgYnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgICAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIG9uQnRuTGVhdmUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVklERU9fRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB9CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2Via2l0YmVnaW5mdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICByby5kaXNjb25uZWN0KCk7CiAgICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgeyBjbGVhclRpbWVvdXQodG91Y2hIaWRlVGltZXIpOyB0b3VjaEhpZGVUaW1lciA9IG51bGw7IH0KICAgICAgICBidG4ucmVtb3ZlKCk7CiAgICAgICAgbWF5YmVEaXNhcm1HbG9iYWxzKCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29uZmlndXJhdGlvbiAmIGRpc3BhdGNoCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBlci1vcmlnaW4gYGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcGAgZmxhZy4KICAvLyBEZWZhdWx0IGlzIE9OOiBldmVyeSBzaXRlIHVzZXMgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIHVubGVzcyB0aGUKICAvLyB1c2VyIGhhcyBleHBsaWNpdGx5IG9wdGVkIGludG8gbmF0aXZlIGluamVjdGlvbiAoc2V0IHRoZSBmbGFnIHRvCiAgLy8gIjAiIC8gImZhbHNlIiAvICJubyIgLyAib2ZmIikuIFdyYXBwZWQgaW4gdHJ5L2NhdGNoIGJlY2F1c2UKICAvLyBsb2NhbFN0b3JhZ2UgYWNjZXNzIHRocm93cyBpbiBwcml2YXRlIC8gc2FuZGJveGVkIGNvbnRleHRzLgogIC8vCiAgLy8gRXhjZXB0aW9uOiB3d3cueW91dHViZS5jb20sIHd3dy50d2l0Y2gudHYgYW5kIHd3dy5uZXRmbGl4LmNvbQogIC8vIGRlZmF1bHQgdG8gT0ZGIChuYXRpdmUgaW5qZWN0aW9uKSBiZWNhdXNlIHRoZWlyIHBsYXllcnMgYWxyZWFkeQogIC8vIGhhdmUgZmlyc3QtY2xhc3MgY29udHJvbCBiYXJzIHdoZXJlIGEgbmF0aXZlIGJ1dHRvbiBsb29rcyBhdCBob21lLgogIC8vIE9ubHkgdGhlIGV4YWN0IGRlc2t0b3AgaG9zdG5hbWVzIGFyZSB0YXJnZXRlZCDigJQgbS4vbXVzaWMuL21vYmlsZQogIC8vIHN1YmRvbWFpbnMga2VlcCB0aGUgZ2VuZXJpYy1waWxsIGRlZmF1bHQuIFRoZSB1c2VyIGNhbiBmbGlwIHRoZQogIC8vIGZsYWcgZXhwbGljaXRseSBwZXIgb3JpZ2luIHRvIG92ZXJyaWRlLgogIC8vCiAgLy8gUmVhZCBsYXppbHkgb24gZmlyc3QgdXNlIChub3QgYXQgSUlGRSBpbml0KSBzbyB0aGF0IHVzZXJzY3JpcHQKICAvLyBtYW5hZ2VycyBvciBwb2x5ZmlsbCBzaGltcyB0aGF0IHJlcGxhY2UgYGxvY2FsU3RvcmFnZWAgc2xpZ2h0bHkKICAvLyBhZnRlciBvdXIgc2NyaXB0IGxvYWRzIHN0aWxsIHNlZSBhIGNvbnNpc3RlbnQgdmFsdWUuIEFmdGVyIHRoZQogIC8vIGZpcnN0IHJlYWQgaXQncyBjYWNoZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwYWdlIGxpZmV0aW1lIOKAlCB0aGUKICAvLyB2YWx1ZSBjYW4ndCBjaGFuZ2Ugd2l0aG91dCBhIHJlbG9hZC4KICBjb25zdCBOQVRJVkVfREVGQVVMVF9IT1NUUyA9IG5ldyBTZXQoWyJ3d3cueW91dHViZS5jb20iLCAid3d3LnR3aXRjaC50diIsICJ3d3cubmV0ZmxpeC5jb20iXSk7CiAgZnVuY3Rpb24gX2RlZmF1bHRHZW5lcmljRm9ySG9zdCgpIHsKICAgIHJldHVybiAhTkFUSVZFX0RFRkFVTFRfSE9TVFMuaGFzKGxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiByZWFkR2VuZXJpY1BpcEZvcmNlZCgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlZ2VuZXJpY19waXAiKTsKICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsKICAgICAgY29uc3QgcyA9IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKICAgICAgaWYgKHMgPT09ICIwIiB8fCBzID09PSAiZmFsc2UiIHx8IHMgPT09ICJubyIgfHwgcyA9PT0gIm9mZiIpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIHsgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsgfQogIH0KICBsZXQgX2dlbmVyaWNQaXBGb3JjZWRDYWNoZSA9IG51bGw7IC8vIG51bGwgPSBub3QgeWV0IHJlYWQKICBmdW5jdGlvbiBnZW5lcmljUGlwRm9yY2VkQ2FjaGVkKCkgewogICAgaWYgKF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPT09IG51bGwpIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPSByZWFkR2VuZXJpY1BpcEZvcmNlZCgpOwogICAgcmV0dXJuIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGU7CiAgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IHdoZW4gdHJ1dGh5LCB0aGUgZ2VuZXJpYyBvdmVybGF5IHBpbGwgaXMKICAvLyBzdXBwcmVzc2VkIG9uIHRoaXMgc2l0ZS4gU2V0IHZpYSB0aGUgcmlnaHQtY2xpY2sgbWVudSBvbiB0aGUgcGlsbDsKICAvLyBjbGVhcmVkIGZyb20gRGV2VG9vbHMgd2l0aCBgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImJyYXZlX3BpcF9kaXNhYmxlZCIpYC4KICAvLwogIC8vIFRoZSBmbGFnIGlzIGNhY2hlZCBpbiBgX3NpdGVEaXNhYmxlZGAgYWZ0ZXIgdGhlIGluaXRpYWwgYmFpbC1vdXQKICAvLyBjaGVjayBzbyB0aGUgaG90IHBhdGhzICh1cGRhdGUoKSBydW5zIHBlciB2aXNpYmxlIHZpZGVvIHBlcgogIC8vIGFuaW1hdGlvbiBmcmFtZSkgZG9uJ3QgaGF2ZSB0byBoaXQgbG9jYWxTdG9yYWdlIGV2ZXJ5IHRpY2suIFRoZQogIC8vIG1lbnUncyBjbGljayBoYW5kbGVyIGZsaXBzIHRoZSBjYWNoZWQgdmFsdWUgd2hlbiB0aGUgdXNlciBkaXNhYmxlcwogIC8vIG1pZC1zZXNzaW9uLgogIGNvbnN0IERJU0FCTEVfS0VZID0gImJyYXZlX3BpcF9kaXNhYmxlZCI7CiAgZnVuY3Rpb24gcmVhZFNpdGVEaXNhYmxlZCgpIHsKICAgIHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShESVNBQkxFX0tFWSkgPT09ICIxIjsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfQogIH0KICBmdW5jdGlvbiBzZXRTaXRlRGlzYWJsZWQoKSB7CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShESVNBQkxFX0tFWSwgIjEiKTsgfSBjYXRjaCB7fQogIH0KICAvLyBDYWNoZWQgZmxhZyDigJQgdXBkYXRlZCBvbiBpbml0IGFuZCBvbiBtaWQtc2Vzc2lvbiBkaXNhYmxlLgogIGxldCBfc2l0ZURpc2FibGVkID0gZmFsc2U7CgogIC8vIFNoYXJlZCByaWdodC1jbGljayBoYW5kbGVyIGF0dGFjaGVkIHRvIGV2ZXJ5IG5hdGl2ZSBpbmplY3RlZCBidXR0b24KICAvLyAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpLiBNaXJyb3JzIHRoZSBnZW5lcmljIHBpbGwncyBjb250ZXh0bWVudQogIC8vIHdpcmluZyBzbyB1c2VycyBjYW4gZGlzYWJsZSBQaVAgb24gdGhlIGhvc3Qgc2l0ZSBmcm9tIGFueSBvZiBvdXIgVUlzLgogIGZ1bmN0aW9uIF9vbk5hdGl2ZUJ0bkNvbnRleHRNZW51KGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzaG93RGlzYWJsZU1lbnUoZS5jbGllbnRYLCBlLmNsaWVudFkpOwogIH0KCiAgLy8gUmVtb3ZlcyBhbnkgb2Ygb3VyIGluamVjdGVkIERPTSAobmF0aXZlIGJ1dHRvbnMgKyBjbG9uZWQgd3JhcHBlcnMpLgogIC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIHBpY2tzICJEaXNhYmxlIFBpUCBpY29uIG9uIDxzaXRlPiIgZnJvbSB0aGUKICAvLyByaWdodC1jbGljayBtZW51IHNvIHRoZSBwYWdlIHJldHVybnMgdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS4KICBmdW5jdGlvbiBfcmVtb3ZlTmF0aXZlQnV0dG9ucygpIHsKICAgIGNvbnN0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJyYXZlLXBpcC1idG4sIC5icmF2ZS1waXAtd3JhcHBlciIpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgbm9kZXNbaV0ucmVtb3ZlKCk7CiAgfQoKICAvLyBTaW5nbGUtaW5zdGFuY2UgY3VzdG9tIGNvbnRleHQgbWVudSBzaG93biBvbiByaWdodC1jbGljayBvZiB0aGUKICAvLyBnZW5lcmljIHBpbGwgb3IgYW55IG5hdGl2ZSBpbmplY3RlZCBidXR0b24uIFdlIGNhbid0IGN1c3RvbWlzZSB0aGUKICAvLyBicm93c2VyJ3MgbmF0aXZlIGNvbnRleHQgbWVudSB3aXRob3V0IGFuIGV4dGVuc2lvbiwgc28gd2UgY2FuY2VsIGl0CiAgLy8gKGBwcmV2ZW50RGVmYXVsdGApIGFuZCByZW5kZXIgb3VyIG93biBET00uIEF1dG8tZGlzbWlzc2VzIG9uCiAgLy8gY2xpY2stb3V0c2lkZSwgRXNjYXBlLCBvciBzY3JvbGwuCiAgbGV0IGFjdGl2ZU1lbnUgPSBudWxsOwogIC8vIFRpbWVzdGFtcCB3aGVuIHRoZSBhY3RpdmUgbWVudSB3YXMgb3BlbmVkLiBPdXRzaWRlLWNsaWNrcyB3aXRoaW4gYQogIC8vIHNob3J0IHdpbmRvdyAofjE1MCBtcykgb2Ygb3BlbmluZyBhcmUgaWdub3JlZCDigJQgZGVmZW5kcyBhZ2FpbnN0IGEKICAvLyBzeW50aGV0aWMgc2FtZS1mcmFtZSBjbGljayBieXBhc3NpbmcgdGhlIHNldFRpbWVvdXQoMCkgaGFuZG9mZi4KICBsZXQgYWN0aXZlTWVudU9wZW5lZEF0ID0gMDsKICBjb25zdCBNRU5VX09QRU5fR1VBUkRfTVMgPSAxNTA7CiAgZnVuY3Rpb24gY2xvc2VNZW51KCkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBhY3RpdmVNZW51LnJlbW92ZSgpOwogICAgYWN0aXZlTWVudSA9IG51bGw7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgX29uTWVudUtleSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgY2xvc2VNZW51LCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGNsb3NlTWVudSk7CiAgfQogIGZ1bmN0aW9uIF9vbk1lbnVLZXkoZSkgeyBpZiAoZS5rZXkgPT09ICJFc2NhcGUiKSBjbG9zZU1lbnUoKTsgfQogIGZ1bmN0aW9uIF9vbk1lbnVDbGlja091dHNpZGUoZSkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBpZiAoZS50aW1lU3RhbXAgLSBhY3RpdmVNZW51T3BlbmVkQXQgPCBNRU5VX09QRU5fR1VBUkRfTVMpIHJldHVybjsKICAgIGlmICghYWN0aXZlTWVudS5jb250YWlucyhlLnRhcmdldCkpIGNsb3NlTWVudSgpOwogIH0KICBmdW5jdGlvbiBzaG93RGlzYWJsZU1lbnUoeCwgeSkgewogICAgY2xvc2VNZW51KCk7CiAgICBjb25zdCBtZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBtZW51LnN0eWxlLmNzc1RleHQgPQogICAgICAicG9zaXRpb246Zml4ZWQ7bGVmdDoiICsgeCArICJweDt0b3A6IiArIHkgKyAicHg7IiArCiAgICAgICJiYWNrZ3JvdW5kOnJnYmEoMjgsMjgsMzAsMC45Nik7Y29sb3I6I2ZmZjsiICsKICAgICAgImJvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NHB4IDA7IiArCiAgICAgICJib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAiei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiZm9udDo1MDAgMTNweC8xLjQgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sU2Vnb2UgVUksUm9ib3RvLHNhbnMtc2VyaWY7IiArCiAgICAgICJ1c2VyLXNlbGVjdDpub25lO3BvaW50ZXItZXZlbnRzOmF1dG87bWluLXdpZHRoOjE4MHB4OyI7CgogICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaXRlbS50ZXh0Q29udGVudCA9ICJEaXNhYmxlIFBpUCBpY29uIG9uICIgKyBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjhweCAxNHB4O2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcDsiOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjEyKSI7IH0pOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAiIjsgfSk7CiAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBzZXRTaXRlRGlzYWJsZWQoKTsKICAgICAgX3NpdGVEaXNhYmxlZCA9IHRydWU7CiAgICAgIC8vIEhpZGUgZXZlcnkgYWN0aXZlIGdlbmVyaWMgcGlsbCBvbiB0aGlzIHBhZ2UgaW1tZWRpYXRlbHkuIFRoZQogICAgICAvLyBuZXh0IGB1cGRhdGUoKWAgdGljayB3aWxsIHNlZSB0aGUgY2FjaGVkIGZsYWcgYW5kIGtlZXAgdGhlbQogICAgICAvLyBoaWRkZW4uIE5hdGl2ZSBpbmplY3RlZCBidXR0b25zIChZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeCkKICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGRpcmVjdGx5IOKAlCB0aGVpciBwZXJzaXN0ZW50IG9ic2VydmVycwogICAgICAvLyB3aWxsIHNlZSBgX3NpdGVEaXNhYmxlZGAgYW5kIHN0b3AgcmUtaW5qZWN0aW5nLgogICAgICBfc2NoZWR1bGVVcGRhdGVBbGwoKTsKICAgICAgX3JlbW92ZU5hdGl2ZUJ1dHRvbnMoKTsKICAgICAgbG9nKCJkaXNhYmxlZCBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUpOwogICAgICBjbG9zZU1lbnUoKTsKICAgIH0pOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgYWN0aXZlTWVudSA9IG1lbnU7CiAgICBhY3RpdmVNZW51T3BlbmVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKCiAgICAvLyBJZiB0aGUgbWVudSB3b3VsZCBvdmVyZmxvdyB0aGUgdmlld3BvcnQsIG51ZGdlIGl0IGJhY2sgaW4uCiAgICBjb25zdCByID0gbWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmIChyLnJpZ2h0ID4gaW5uZXJXaWR0aCkgIG1lbnUuc3R5bGUubGVmdCA9IChpbm5lcldpZHRoICAtIHIud2lkdGggIC0gOCkgKyAicHgiOwogICAgaWYgKHIuYm90dG9tID4gaW5uZXJIZWlnaHQpIG1lbnUuc3R5bGUudG9wICA9IChpbm5lckhlaWdodCAtIHIuaGVpZ2h0IC0gOCkgKyAicHgiOwoKICAgIC8vIERlZmVyIGxpc3RlbmVyIGF0dGFjaCB0byB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gdGhlIGNsaWNrIHRoYXQKICAgIC8vIG9wZW5lZCB0aGUgbWVudSBkb2Vzbid0IGltbWVkaWF0ZWx5IGRpc21pc3MgaXQuCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIF9vbk1lbnVLZXksIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBjbG9zZU1lbnUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBjbG9zZU1lbnUpOwogICAgfSwgMCk7CiAgfQoKICAvLyBOYXRpdmUtc2l0ZSBhZGFwdGVyIHRhYmxlLiBFYWNoIGVudHJ5IGRlc2NyaWJlcyBvbmUgc2l0ZSB3aG9zZQogIC8vIHBsYXllciBjaHJvbWUgd2Uga25vdyBob3cgdG8gaW5qZWN0IGludG8uIERldGVjdGlvbiBpcyBob3N0bmFtZS0KICAvLyBmaXJzdCAoaGFuZGxlcyByZWd1bGFyIHBhZ2VzKSB3aXRoIGEgRE9NLXNpZ25hbCBmYWxsYmFjayAoaGFuZGxlcwogIC8vIGFib3V0OmJsYW5rIHNhbWUtb3JpZ2luIGlmcmFtZXMgd2hlcmUgbG9jYXRpb24uaG9zdG5hbWUgaXMgIiIpLgogIC8vCiAgLy8gVG8gc3VwcG9ydCBhIG5ldyBzaXRlLCBhZGQgYSByZWNvcmQgaGVyZSBhbmQgd3JpdGUgYSBtYXRjaGluZwogIC8vIGBhZGQ8TmFtZT5CdXR0b24odmlkZW8pYCBpbmplY3RvciDigJQgbm8gb3RoZXIgY2hhbmdlIHJlcXVpcmVkLgogIGNvbnN0IE5BVElWRV9TSVRFUyA9IFsKICAgIHsKICAgICAgbmFtZTogIllvdVR1YmUiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoInlvdXR1YmUuY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5odG1sNS12aWRlby1wbGF5ZXIsIC55dHAtcmlnaHQtY29udHJvbHMiKSwKICAgICAgaW5qZWN0OiBhZGRZb3VUdWJlQnV0dG9uLAogICAgICBzY29wZTogIi5odG1sNS12aWRlby1wbGF5ZXIiLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlR3aXRjaCIsCiAgICAgIG1hdGNoOiAoaG9zdCkgPT4gaG9zdC5lbmRzV2l0aCgidHdpdGNoLnR2IikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXIsIFtkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItY29udHJvbHMiXScpLAogICAgICBpbmplY3Q6IGFkZFR3aXRjaEJ1dHRvbiwKICAgICAgc2NvcGU6ICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWNvbnRyb2xzIl0sIC52aWRlby1wbGF5ZXInLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIk5ldGZsaXgiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoIm5ldGZsaXguY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVpYT0iY29udHJvbHMtc3RhbmRhcmQiXSwgW2RhdGEtdWlhPSJ2aWRlby1jYW52YXMiXScpLAogICAgICBpbmplY3Q6IGFkZE5ldGZsaXhCdXR0b24sCiAgICAgIHNjb3BlOiAnW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJywKICAgIH0sCiAgXTsKCiAgLy8gUnVuIGFuIGluamVjdG9yIG9uY2Ugbm93IGFuZCBhZ2FpbiBvbiBldmVyeSByZWxldmFudCBET00gbXV0YXRpb24sCiAgLy8gc28gdGhlIGJ1dHRvbiByZWFwcGVhcnMgYWZ0ZXIgUmVhY3QgKE5ldGZsaXggLyBUd2l0Y2gpIHRlYXJzIGRvd24KICAvLyBhbmQgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIuIFRoZSBvYnNlcnZlciBzdGFydHMgb24gPGh0bWw+IGlmCiAgLy8gdGhlIHNjb3BlZCBjb250YWluZXIgaXNuJ3QgaW4gdGhlIERPTSB5ZXQsIHRoZW4gInByb21vdGVzIiBpdHNlbGYKICAvLyB0byB0aGUgc21hbGxlciBzdWJ0cmVlIGFzIHNvb24gYXMgaXQgYXBwZWFycyDigJQgbWluaW1pc2luZyBjaHVybi4KICAvLwogIC8vIFJlc2lsaWVuY2UgdG8gaG9zdCByZWRlc2lnbnM6IGlmIHRoZSBpbmplY3RvciBrZWVwcyByZXR1cm5pbmcgZmFsc2UKICAvLyBmb3IgYE5BVElWRV9GQUxMQkFDS19NU2AgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIHdlIGRpc2Nvbm5lY3QgdGhlCiAgLy8gb2JzZXJ2ZXIgYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQg4oCUIHNvIHVzZXJzCiAgLy8gYWx3YXlzIGdldCAqc29tZSogUGlQIGNvbnRyb2wgZXZlbiBpZiBZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeAogIC8vIGNoYW5nZXMgaXRzIERPTSBpbiBhIHdheSB0aGF0IGJyZWFrcyBvdXIgc2VsZWN0b3JzLiBUaGUgZmFsbGJhY2sgaXMKICAvLyBhcm1lZCBvbmx5IG9uY2UgcGVyIHZpZGVvIGFuZCBvbmx5IHRyaWdnZXJzIGlmIHRoZSBpbmplY3RvciBoYXMKICAvLyAqbmV2ZXIqIHN1Y2NlZWRlZDsgaW50ZXJtaXR0ZW50IGZhaWx1cmVzIGR1cmluZyBhIHJlLW1vdW50IGRvbid0CiAgLy8gY291bnQuCiAgZnVuY3Rpb24gdHJ5TmF0aXZlKHZpZGVvLCBpbmplY3Rvciwgc2NvcGVTZWxlY3RvciwgdGVhcmRvd25zKSB7CiAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGxldCBldmVyU3VjY2VlZGVkID0gISFpbmplY3Rvcih2aWRlbyk7CiAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgICBsZXQgZmVsbEJhY2sgPSBmYWxzZTsKICAgIC8vIEFsd2F5cyBvYnNlcnZlIGF0IGRvY3VtZW50IGxldmVsLiBXZSB0cmllZCBwcm9tb3RpbmcgdG8gYSBzY29wZWQKICAgIC8vIHN1YnRyZWUgKGFuZCB0byB0aGUgc2NvcGVkIHRhcmdldCdzIHBhcmVudCkgZm9yIGxvd2VyIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIGJ1dCBOZXRmbGl4IHJlLW1vdW50cyB3aG9sZSBwbGF5ZXIgc3VidHJlZXMgb24gdmlzaWJpbGl0eQogICAgLy8gY2hhbmdlcyDigJQgbGVhdmluZyBhbnkgbmFycm93ZXIgb2JzZXJ2ZXIgYXR0YWNoZWQgdG8gYSBkZXRhY2hlZAogICAgLy8gbm9kZSwgd2l0aCBubyB3YXkgdG8gZGV0ZWN0IGRldGFjaG1lbnQgYmVjYXVzZSBubyBtdXRhdGlvbnMgZmlyZQogICAgLy8gb24gdGhlIGRldGFjaGVkIG5vZGUuIFRoZSByQUYtY29hbGVzY2VkIGNhbGxiYWNrIGJlbG93IGNhcHMgd29yawogICAgLy8gYXQgb25lIGluamVjdG9yIGNhbGwgcGVyIGFuaW1hdGlvbiBmcmFtZSByZWdhcmRsZXNzIG9mIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIHNvIGRvY3VtZW50LWxldmVsIG9ic2VydmF0aW9uIHN0YXlzIGJvdW5kZWQuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgIGlmIChzY2hlZHVsZWQgfHwgZmVsbEJhY2spIHJldHVybjsKICAgICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICBpZiAoZmVsbEJhY2spIHJldHVybjsKICAgICAgICBpZiAoaW5qZWN0b3IodmlkZW8pKSB7CiAgICAgICAgICBldmVyU3VjY2VlZGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFldmVyU3VjY2VlZGVkICYmCiAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCA+PSBDT05GSUcuTkFUSVZFX0ZBTExCQUNLX01TKSB7CiAgICAgICAgICBmZWxsQmFjayA9IHRydWU7CiAgICAgICAgICBvYnMuZGlzY29ubmVjdCgpOwogICAgICAgICAgd2FybigibmF0aXZlIGluamVjdGlvbiB1bmF2YWlsYWJsZSBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUgKwogICAgICAgICAgICAgICAiOyBmYWxsaW5nIGJhY2sgdG8gZ2VuZXJpYyBwaWxsIik7CiAgICAgICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIG9icy5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICBpZiAodGVhcmRvd25zKSB0ZWFyZG93bnMucHVzaCgoKSA9PiBvYnMuZGlzY29ubmVjdCgpKTsKICB9CgogIC8vIERlY2lkZXMgd2hpY2ggVUkgdG8gYWRkIGZvciBhIGdpdmVuIHZpZGVvIGFuZCB3aXJlcyBpdCB1cC4gQ2FsbGVkCiAgLy8gZXhhY3RseSBvbmNlIHBlciB2aWRlbyBieSBgYXR0YWNoVG9WaWRlb2AuIFRoZSBgdGVhcmRvd25zYCBhcnJheSBpcwogIC8vIHBvcHVsYXRlZCB3aXRoIGNsZWFudXAgY2xvc3VyZXMgdGhhdCB0aGUgZGlzY292ZXJ5IG9ic2VydmVyJ3MKICAvLyByZW1vdmVkLW5vZGVzIHBhdGggd2lsbCBydW4uCiAgZnVuY3Rpb24gYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIEdlbmVyaWMgb3ZlcmxheSBpcyB0aGUgZGVmYXVsdC4gU2V0IGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcD0iMCIKICAgIC8vIChvciBmYWxzZS9uby9vZmYpIHBlci1vcmlnaW4gdG8gb3B0IGJhY2sgaW50byBuYXRpdmUgaW5qZWN0aW9uLgogICAgaWYgKGdlbmVyaWNQaXBGb3JjZWRDYWNoZWQoKSkgewogICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICBsb2coImluamVjdGVkIG92ZXJsYXkiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGhvc3QgPSBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTkFUSVZFX1NJVEVTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHNpdGUgPSBOQVRJVkVfU0lURVNbaV07CiAgICAgIGlmIChzaXRlLm1hdGNoKGhvc3QpKSB7CiAgICAgICAgdHJ5TmF0aXZlKHZpZGVvLCBzaXRlLmluamVjdCwgc2l0ZS5zY29wZSwgdGVhcmRvd25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAvLyBVbnJlY29nbmlzZWQgc2l0ZSAoYW5kIHVzZXIgb3B0ZWQgb3V0IG9mIGdlbmVyaWMgdmlhIGxvY2FsU3RvcmFnZSk6CiAgICAvLyBzdGlsbCBpbnN0YWxsIHRoZSBvdmVybGF5IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyBuYXRpdmUgdG8gYW5jaG9yIHRvLgogICAgYWRkT3ZlcmxheUJ1dHRvbih2aWRlbywgdGVhcmRvd25zKTsKICAgIGxvZygiaW5qZWN0ZWQgb3ZlcmxheSIpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGVyLXZpZGVvIHNldHVwICsgdGVhcmRvd24KICAvLwogIC8vIFJ1bnMgb25jZSBwZXIgPHZpZGVvPiBlbGVtZW50LiBUaGUgYHRlYXJkb3duc2AgYXJyYXkgaXMgdGhlIHNpbmdsZQogIC8vIHBsYWNlIGV2ZXJ5IGxpc3RlbmVyIC8gb2JzZXJ2ZXIgLyBET00gbm9kZSB3ZSBhZGQgZm9yIHRoaXMgdmlkZW8gaXMKICAvLyByZWNvcmRlZDsgdGhlIGRpc2NvdmVyeSBvYnNlcnZlciBiZWxvdyBjYWxscyB0aGVtIHdoZW4gdGhlIHZpZGVvIGlzCiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRoZSBzY3JpcHQgZG9lc24ndCBsZWFrIG9uIGxvbmctbGl2ZWQgU1BBCiAgLy8gcGFnZXMgd2l0aCBpbmZpbml0ZSBzY3JvbGwuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gYXR0YWNoVG9WaWRlbyh2aWRlbykgewogICAgaWYgKHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKSkgcmV0dXJuOwoKICAgIC8vIFNvbWUgc2l0ZXMgKE5ldGZsaXgsIGNlcnRhaW4gRFJNIHBsYXllcnMpIGV4cGxpY2l0bHkgZGlzYWJsZSBQaVAuCiAgICAvLyBDbGVhciBpdCBub3cgYW5kIHdhdGNoIChiZWxvdykgZm9yIHRoZSBwYWdlIHJlLXNldHRpbmcgaXQuCiAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgdmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgPSBmYWxzZTsKICAgICAgdmlkZW8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScpOwogICAgfQogICAgLy8gV2lyZSBhdXRvbWF0aWMtUGlQIGludGVudCAoYnJvd3NlcnMgd2l0aCBhdXRvLVBpUCBmZWF0dXJlLCBlLmcuCiAgICAvLyBDaHJvbWUgZmxhZywgZmlyZSB0aGlzIG9uIHRhYiBzd2l0Y2gpLiBUaGUgaGFuZGxlciBpcyBnbG9iYWwgcGVyCiAgICAvLyBkb2N1bWVudCDigJQgbGFzdCByZWdpc3RyYXRpb24gd2lucyDigJQgc28gb24gcGFnZXMgd2l0aCBtdWx0aXBsZQogICAgLy8gPHZpZGVvPiBlbGVtZW50cyAoWW91VHViZSB3YXRjaDogbWFpbiBwbGF5ZXIgKyBob3Zlci10aHVtYm5haWwKICAgIC8vIHByZXZpZXdzICsgYWQgcHJlLXJvbGwpIHRoZSAqbGFzdCogbW91bnRlZCB2aWRlbyB3b3VsZCBiZSBQaVAnZCwKICAgIC8vIHdoaWNoIGlzIGZyZXF1ZW50bHkgYSBoaWRkZW4vZW1wdHkgcHJldmlldyDihpIgYmxhY2sgUGlQIHdpbmRvdwogICAgLy8gd2l0aCBubyBjb250cm9scyBhbmQgYSBkZXN5bmNlZCBkdXJhdGlvbi4KICAgIC8vIFBpY2sgdGhlIG1vc3QgcGxhdXNpYmxlICJhY3RpdmUiIHZpZGVvIGF0IGZpcmUgdGltZSBpbnN0ZWFkOgogICAgLy8gdGhlIG9uZSBjdXJyZW50bHkgaW4gUGlQICh0b2dnbGluZyBvdXQpLCBlbHNlIHRoZSBsYXJnZXN0IHBsYXlpbmcKICAgIC8vIHZpZGVvLCBlbHNlIHRoZSBsYXJnZXN0IHZpZGVvIHdpdGggbWV0YWRhdGEuIE5vLW9wIG9uIGJyb3dzZXJzCiAgICAvLyB0aGF0IGRvbid0IHN1cHBvcnQgaXQ7IHRoZSB0cnkvY2F0Y2ggZ3VhcmRzIGlPUyAvIG9sZGVyIGJyb3dzZXJzLgogICAgdHJ5IHsKICAgICAgbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKCJlbnRlcnBpY3R1cmVpbnBpY3R1cmUiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgdiA9IHBpY2tBdXRvUGlwVGFyZ2V0KCkgfHwgdmlkZW87CiAgICAgICAgdHJ5IHsgYXdhaXQgdi5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpOyB9IGNhdGNoIChlKSB7IHdhcm4oImF1dG8tUGlQIGZhaWxlZDoiLCBlLm1lc3NhZ2UgfHwgZSk7IH0KICAgICAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciAqLyB9CgogICAgY29uc3QgdGVhcmRvd25zID0gW107CgogICAgYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwoKICAgIC8vIE9ubHkgcmVzdW1lIG9uIGVudGVyaW5nIFBpUCBpZiB0aGUgdmlkZW8gd2FzIGFjdHVhbGx5IHBsYXlpbmcgd2hlbgogICAgLy8gdGhlIHRyYW5zaXRpb24gZmlyZWQuIFRoZSBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGB2aWRlby5wbGF5KClgCiAgICAvLyBvdmVycm9kZSB1c2VyLWluaXRpYXRlZCBwYXVzZXMgKGUuZy4gWW91VHViZSBhdXRvLVBpUCBvbiB0YWItc3dpdGNoCiAgICAvLyB3b3VsZCB1bi1wYXVzZSBhIHBhdXNlZCB2aWRlbykuIENhcHR1cmUgc3RhdGUgYXQgaGFuZGxlciBhdHRhY2gKICAgIC8vIHRpbWUgYW5kIHJlZnJlc2ggb24gcGxheS9wYXVzZSBldmVudHMuCiAgICBsZXQgd2FzUGxheWluZyA9ICF2aWRlby5wYXVzZWQgJiYgIXZpZGVvLmVuZGVkOwogICAgY29uc3Qgb25QbGF5U3RhdGUgPSAoKSA9PiB7IHdhc1BsYXlpbmcgPSAhdmlkZW8ucGF1c2VkICYmICF2aWRlby5lbmRlZDsgfTsKICAgIGNvbnN0IFBMQVlfRVZFTlRTID0gWyJwbGF5IiwgInBsYXlpbmciLCAicGF1c2UiLCAiZW5kZWQiXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUExBWV9FVkVOVFMubGVuZ3RoOyBpKyspIHsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgfQogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFBMQVlfRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCBvbkVudGVyUGlwID0gKCkgPT4gewogICAgICBpZiAoIXdhc1BsYXlpbmcpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh3YXNQbGF5aW5nICYmIHZpZGVvLnBhdXNlZCkgdmlkZW8ucGxheSgpOyB9LCAyNTApOwogICAgfTsKICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImVudGVycGljdHVyZWlucGljdHVyZSIsIG9uRW50ZXJQaXApOwogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW50ZXJwaWN0dXJlaW5waWN0dXJlIiwgb25FbnRlclBpcCkpOwoKICAgIC8vIFdhdGNoIGZvciBzaXRlcyAoZS5nLiBOZXRmbGl4KSByZS1hZGRpbmcgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUuCiAgICBjb25zdCBkcGlwT2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgICB2aWRlby5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IGZhbHNlOwogICAgICAgIHZpZGVvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnKTsKICAgICAgfQogICAgfSk7CiAgICBkcGlwT2JzLm9ic2VydmUodmlkZW8sIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJ10gfSk7CiAgICB0ZWFyZG93bnMucHVzaCgoKSA9PiBkcGlwT2JzLmRpc2Nvbm5lY3QoKSk7CgogICAgdmlkZW9DbGVhbnVwcy5zZXQodmlkZW8sICgpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZWFyZG93bnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgeyB0ZWFyZG93bnNbaV0oKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSBpbmRpdmlkdWFsIHRlYXJkb3duIGVycm9ycyAqLyB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG9wLWxldmVsIHNldHVwICsgZGlzY292ZXJ5IG9ic2VydmVyCiAgLy8KICAvLyBPbmUgcGVyc2lzdGVudCBNdXRhdGlvbk9ic2VydmVyIHRyYWNrcyA8dmlkZW8+IGVsZW1lbnRzIGJlaW5nIGFkZGVkCiAgLy8gdG8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSBvdmVyIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEFkZCDihpIgd2lyZSB1cC4KICAvLyBSZW1vdmUg4oaSIHJ1biB0aGUgcmVnaXN0ZXJlZCB0ZWFyZG93biBjbG9zdXJlIGZvciB0aGF0IHZpZGVvLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUoKSB7CiAgICAvLyBBdHRhY2ggdG8gZXZlcnkgPHZpZGVvPiBjdXJyZW50bHkgb24gdGhlIHBhZ2UuCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpLmZvckVhY2goYXR0YWNoVG9WaWRlbyk7CgogICAgLy8gS2VlcCB3YXRjaGluZyBmb3IgdmlkZW9zIGFkZGVkIGxhdGVyIChsYXp5LWxvYWRlZCBmZWVkcywgU1BBIHJvdXRlCiAgICAvLyBjaGFuZ2VzLCBlbWJlZGRlZCBwbGF5ZXJzIHRoYXQgbW91bnQgYWZ0ZXIgZmlyc3QgcGFpbnQsIGV0Yy4pLgogICAgLy8gSW5kZXhlZCBsb29wcyArIG5vZGVUeXBlIGNoZWNrIGFyZSBmcmllbmRsaWVyIHRvIFY4J3MgaW5saW5lCiAgICAvLyBjYWNoZXMgdGhhbiBmb3Itb2YgKyBpbnN0YW5jZW9mIG9uIGhvdCBET00tbXV0YXRpb24gcGF0aHMuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihfb25Eb21NdXRhdGlvbnMpOwogICAgb2JzLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIF9ydW5DbGVhbnVwKHZpZGVvKSB7CiAgICBjb25zdCBmbiA9IHZpZGVvQ2xlYW51cHMuZ2V0KHZpZGVvKTsKICAgIGlmICghZm4pIHJldHVybjsKICAgIHZpZGVvQ2xlYW51cHMuZGVsZXRlKHZpZGVvKTsKICAgIHRyeSB7IGZuKCk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgZnVuY3Rpb24gX29uRG9tTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7CiAgICAgIGNvbnN0IG11ID0gbXV0YXRpb25zW2ldOwoKICAgICAgY29uc3QgYWRkZWQgPSBtdS5hZGRlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgYWxlbiA9IGFkZGVkLmxlbmd0aDsgaiA8IGFsZW47IGorKykgewogICAgICAgIGNvbnN0IG5vZGUgPSBhZGRlZFtqXTsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgY29udGludWU7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICJWSURFTyIpIHsKICAgICAgICAgIGF0dGFjaFRvVmlkZW8obm9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7CiAgICAgICAgICBjb25zdCB2aWRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCB2bGVuID0gdmlkcy5sZW5ndGg7IGsgPCB2bGVuOyBrKyspIGF0dGFjaFRvVmlkZW8odmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdCByZW1vdmVkID0gbXUucmVtb3ZlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgcmxlbiA9IHJlbW92ZWQubGVuZ3RoOyBqIDwgcmxlbjsgaisrKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IHJlbW92ZWRbal07CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIGNvbnRpbnVlOwogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAiVklERU8iKSB7CiAgICAgICAgICBfcnVuQ2xlYW51cChub2RlKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKICAgICAgICAgIGNvbnN0IHZpZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwogICAgICAgICAgZm9yIChsZXQgayA9IDAsIHZsZW4gPSB2aWRzLmxlbmd0aDsgayA8IHZsZW47IGsrKykgX3J1bkNsZWFudXAodmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBCb290CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIEJhaWwgb3V0IGVhcmx5IG9uIGJyb3dzZXJzIHdpdGggbm8gUGlQIEFQSSBhdCBhbGwgKGV4dHJlbWVseSBvbGQgb3IKICAvLyBleG90aWMpLiBBdm9pZHMgcmVnaXN0ZXJpbmcgbGlzdGVuZXJzIHdlJ2QgbmV2ZXIgdXNlLgogIGlmICghUElQX1NVUFBPUlRFRCkgcmV0dXJuOwoKICAvLyBTY29wZTogb25seSBydW4gaW4gdGhlIHRvcC1sZXZlbCBmcmFtZS4gRW1iZWRkZWQgcGxheWVycyAoZS5nLgogIC8vIHd3dy55b3V0dWJlLmNvbS9lbWJlZC88aWQ+IGlmcmFtZXMgaW5zaWRlIHRoaXJkLXBhcnR5IHBhZ2VzKSBnZXQKICAvLyBuZWl0aGVyIG5hdGl2ZSBpbmplY3Rpb24gbm9yIHRoZSBnZW5lcmljLXBpbGwgZmFsbGJhY2sg4oCUIHRoZSBob3N0CiAgLy8gc2l0ZSBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBQaVAgVVggaW5zaWRlIGlmcmFtZXMuIFRoaXMga2VlcHMKICAvLyB0aGUgc2NyaXB0IGZvY3VzZWQgb24gY2Fub25pY2FsIGRlc2t0b3Agc2Vzc2lvbnMgYW5kIGF2b2lkcwogIC8vIGRvdWJsZS1pbmplY3Rpb24gd2hlbiBib3RoIHRoZSBwYXJlbnQgZnJhbWUgYW5kIHRoZSBlbWJlZCBtYXRjaAogIC8vIGEgdXNlcidzIGZpbHRlciBydWxlLgogIHRyeSB7IGlmICh3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZikgcmV0dXJuOyB9IGNhdGNoIChlKSB7IHJldHVybjsgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IGlmIHRoZSB1c2VyIHByZXZpb3VzbHkgc2VsZWN0ZWQgIkRpc2FibGUgUGlQIGljb24KICAvLyBvbiA8c2l0ZT4iIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUsIHRoaXMgZmxhZyBwZXJzaXN0cyBpbgogIC8vIGxvY2FsU3RvcmFnZS4gQmFpbCBiZWZvcmUgYW55IHNldHVwIHNvIHRoZSBzY3JpcHQgaXMgYSB0cnVlIG5vLW9wCiAgLy8gZm9yIHRoYXQgb3JpZ2luIOKAlCBubyBvYnNlcnZlcnMsIG5vIGxpc3RlbmVycywgbm8gd29yay4gT3RoZXIKICAvLyBvcmlnaW5zIGFyZSB1bmFmZmVjdGVkIGJlY2F1c2UgbG9jYWxTdG9yYWdlIGlzIHBhcnRpdGlvbmVkIHBlci1vcmlnaW4uCiAgLy8gV2UgYWxzbyBzZWVkIHRoZSBjYWNoZWQgYF9zaXRlRGlzYWJsZWRgIGZsYWcgaGVyZSAoaXJyZWxldmFudCBpZiB3ZQogIC8vIHJldHVybiwgYnV0IGtlZXBzIHRoZSBjYWNoZSBsaXZlIGluIHRoZSBub3QteWV0LWRpc2FibGVkIGNhc2UpLgogIF9zaXRlRGlzYWJsZWQgPSByZWFkU2l0ZURpc2FibGVkKCk7CiAgaWYgKF9zaXRlRGlzYWJsZWQpIHJldHVybjsKCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCiAgICAgIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgc2V0dXBBdXRvUGljdHVyZUluUGljdHVyZSgpOwogIH0KfSkoKTs="},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUKCmNvbnN0IHNwb29mQnJhbmRzID0gKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgaWYgKGl0ZW0/LmJyYW5kPy50b0xvd2VyQ2FzZSgpID09PSAnYnJhdmUnKSB7CiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGJyYW5kOiAnR29vZ2xlIENocm9tZScgfTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0pOwp9OwoKY29uc3Qgb3JpZ2luYWxCcmFuZHMgPSBuYXZpZ2F0b3I/LnVzZXJBZ2VudERhdGE/LmJyYW5kczsKaWYgKG9yaWdpbmFsQnJhbmRzKSB7CiAgY29uc3Qgc3Bvb2ZlZEJyYW5kcyA9IHNwb29mQnJhbmRzKG9yaWdpbmFsQnJhbmRzKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF2aWdhdG9yVUFEYXRhLnByb3RvdHlwZSwgJ2JyYW5kcycsIHsKICAgIHZhbHVlOiBzcG9vZmVkQnJhbmRzCiAgfSk7Cn0KCmNvbnN0IG9yaWdpbmFsR2V0SGlnaEVudHJvcHlWYWx1ZXMgPQogIE5hdmlnYXRvclVBRGF0YT8ucHJvdG90eXBlPy5nZXRIaWdoRW50cm9weVZhbHVlczsKCmlmIChvcmlnaW5hbEdldEhpZ2hFbnRyb3B5VmFsdWVzKSB7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdmlnYXRvclVBRGF0YS5wcm90b3R5cGUsICdnZXRIaWdoRW50cm9weVZhbHVlcycsIHsKICAgIHZhbHVlOiBhc3luYyBmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcyhoaW50cykgewogICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgb3JpZ2luYWxHZXRIaWdoRW50cm9weVZhbHVlcy5jYWxsKAogICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnREYXRhLAogICAgICAgIGhpbnRzCiAgICAgICk7CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdHMpKSB7CiAgICAgICAgaWYgKGtleSA9PT0gJ2JyYW5kcycgfHwga2V5ID09PSAnZnVsbFZlcnNpb25MaXN0JykgewogICAgICAgICAgcmVzdWx0c1trZXldID0gc3Bvb2ZCcmFuZHMocmVzdWx0c1trZXldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfSk7Cn0KCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICBOYXZpZ2F0b3JVQURhdGEucHJvdG90eXBlLmdldEhpZ2hFbnRyb3B5VmFsdWVzLCAndG9TdHJpbmcnLCB7CiAgdmFsdWU6ICgpID0+ICdmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcygpIHsgW25hdGl2ZSBjb2RlXSB9Jwp9KTsK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play-update.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXktdXBkYXRlLmpzCi8vIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpIHsKICBjb25zdCBob3N0ID0gbG9jYXRpb24uaG9zdG5hbWU7CiAgY29uc3QgSVNfWU9VVFVCRSA9IC8oPzpefC4rXC4peW91dHViZSg/Oi1ub2Nvb2tpZSk/XC5jb20kLy50ZXN0KGhvc3QpOwogIGNvbnN0IElTX1ZJTUVPID0gLyg/Ol58LitcLil2aW1lb1wuY29tJC8udGVzdChob3N0KTsKCiAgLy8gUGFnZSBWaXNpYmlsaXR5IEFQSQogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnaGlkZGVuJywgewogICAgICBnZXQoKSB7IHJldHVybiBmYWxzZTsgfSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgZ2V0KCkgeyByZXR1cm4gJ3Zpc2libGUnOyB9LAogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnb252aXNpYmlsaXR5Y2hhbmdlJywgewogICAgICBnZXQoKSB7IHJldHVybiBudWxsOyB9LAogICAgICBzZXQoKSB7fSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gQmxvY2sgZXZlbnQgZGVsaXZlcnkgKGNhcHR1cmU9dHJ1ZSB0byBpbnRlcmNlcHQgZWFybHkpCiAgY29uc3Qgc3RvcCA9IChlKSA9PiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogIGNvbnN0IElTX0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8CiAgICAgICAgICAgICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICB0cnkgewogICAgLy8gU2tpcCB2aXNpYmlsaXR5Y2hhbmdlIGJsb2NraW5nIG9uIGlPUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1lZGlhIGJhY2tncm91bmRpbmcKICAgIGlmICghSVNfSU9TKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBzdG9wLCB0cnVlKTsKICAgIH0KICB9IGNhdGNoIChlKSB7fQoKICAvLyBGdWxsc2NyZWVuIEFQSSAoVmltZW8pCiAgaWYgKElTX1ZJTUVPKSB7CiAgICB0cnkgewogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHN0b3AsIHRydWUpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIC8vIFlvdVR1YmUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzCiAgaWYgKElTX1lPVVRVQkUpIHsKICAgIC8vIFVzZXIgYWN0aXZpdHkgdHJhY2tpbmcKICAgIGNvbnN0IExBQ1RfUkVGUkVTSCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWluCiAgICB3YWl0Rm9yTGFjdCgoKSA9PiByZWZyZXNoTGFjdCgpLCBMQUNUX1JFRlJFU0gpOwoKICAgIGZ1bmN0aW9uIGdldFZpZGVvKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigneXRkLXBsYXllciB2aWRlbywgI21vdmllX3BsYXllciB2aWRlbywgdmlkZW8nKTsKICAgIH0KCiAgICBsZXQgbGFzdFVzZXJJbnB1dCA9IDA7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CgogICAgLy8gTWVkaWEga2V5cyBnbyB0aHJvdWdoIE1lZGlhU2Vzc2lvbiwgbm90IGtleWRvd24uIFBhdGNoIHRoZSBwcm90b3R5cGUKICAgIC8vIHNvIHBhdXNlL3BsYXkgaGFuZGxlcnMgdXBkYXRlIGxhc3RVc2VySW5wdXQuCiAgICB0cnkgewogICAgICBjb25zdCBvcmlnU2V0ID0gTWVkaWFTZXNzaW9uLnByb3RvdHlwZS5zZXRBY3Rpb25IYW5kbGVyOwogICAgICBNZWRpYVNlc3Npb24ucHJvdG90eXBlLnNldEFjdGlvbkhhbmRsZXIgPSBmdW5jdGlvbihhY3QsIGgpIHsKICAgICAgICByZXR1cm4gb3JpZ1NldC5jYWxsKHRoaXMsIGFjdCwgKGFjdCAhPT0gJ3BhdXNlJyAmJiBhY3QgIT09ICdwbGF5JykgPyBoIDogZnVuY3Rpb24oLi4uYSkgewogICAgICAgICAgbGFzdFVzZXJJbnB1dCA9IERhdGUubm93KCk7CiAgICAgICAgICBpZiAodHlwZW9mIGggPT09ICdmdW5jdGlvbicpIHJldHVybiBoLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICBpZiAodikgYWN0ID09PSAncGF1c2UnID8gdi5wYXVzZSgpIDogdi5wbGF5KCkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBbJ3BhdXNlJywgJ3BsYXknXS5mb3JFYWNoKGEgPT4gbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKGEsIG51bGwpKTsKICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgZnVuY3Rpb24gb25WaWRlb05hdmlnYXRpb24oKSB7CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICAgIGlmIChJU19JT1MpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkZW8gPSBnZXRWaWRlbygpOwogICAgICAgIGlmICghdmlkZW8pIHJldHVybjsKICAgICAgICBpZiAodmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlcikgewogICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB2aWRlby5fYmdQbGF5UGF1c2VIYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHsKICAgICAgICAgIC8vIElmIHVzZXIgY2xpY2tlZCBvciBwcmVzc2VkIGEga2V5IHdpdGhpbiAzcyBiZWZvcmUgdGhlIHBhdXNlLCBpdCdzIGludGVudGlvbmFsCiAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RVc2VySW5wdXQgPCAzMDAwKSByZXR1cm47CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICAgIGlmICh2ICYmIHYucGF1c2VkICYmICF2LmVuZGVkICYmIHYucmVhZHlTdGF0ZSA+PSAyKSB2LnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICB9LCA4MDApOwogICAgICAgIH07CiAgICAgICAgdmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlciA9IGhhbmRsZXI7CiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVyKTsKICAgICAgfSwgMTUwMCk7CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3l0LW5hdmlnYXRlLWZpbmlzaCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1wYWdlLWRhdGEtdXBkYXRlZCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKCiAgICAvLyBTaW11bGF0ZSB1c2VyIGludGVyYWN0aW9uIHRvIHByZXZlbnQgIkFyZSB5b3Ugc3RpbGwgd2F0Y2hpbmc/IgogICAgY29uc3QgSU5URVJBQ1RJT05fSU5URVJWQUwgPSAxMCAqIDYwICogMTAwMDsgLy8gMTAgbWluCiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgaWYgKHBsYXllcikgewogICAgICAgIHBsYXllci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW1vdmUnLCB7IGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICB9CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICB9LCBJTlRFUkFDVElPTl9JTlRFUlZBTCk7CgogICAgLy8gS2VlcCBwbGF5ZXIgc3RhdGUgdXBkYXRlZAogICAgY29uc3QgUExBWUVSX1NUQVRFX0lOVEVSVkFMID0gNjAgKiAxMDAwOyAvLyAxIG1pbgogICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBjb25zdCB2aWRlbyA9IGdldFZpZGVvKCk7CiAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8ucGF1c2VkKSB7CiAgICAgICAgdmlkZW8uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3RpbWV1cGRhdGUnKSk7CiAgICAgIH0KICAgIH0sIFBMQVlFUl9TVEFURV9JTlRFUlZBTCk7CiAgfQoKICBmdW5jdGlvbiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIGRlbGF5ID0gMTAwMCkgewogICAgY29uc3QgbWF4RGVsYXkgPSA2MCAqIDEwMDA7IC8vIGNhcCBhdCA2MHMKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCAnX2xhY3QnKSkgewogICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dCgKICAgICAgICAoKSA9PiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIE1hdGgubWluKGRlbGF5ICogMiwgbWF4RGVsYXkpKSwKICAgICAgICBkZWxheQogICAgICApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaExhY3QoKSB7CiAgICB0cnkgewogICAgICBpZiAod2luZG93Ll9sYWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"brave-yt-sabr-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gWW91VHViZSdzIFNBQlIgKFNlcnZlciBBZGFwdGl2ZSBCaXRyYXRlKSBwcm90b2NvbCBzZW5kcyBhIGJhY2tvZmZUaW1lTXMKLy8gdmFsdWUgdGVsbGluZyB0aGUgcGxheWVyIHRvIHdhaXQgYmVmb3JlIHJlcXVlc3RpbmcgdmlkZW8gZGF0YS4gVGhpcwovLyBjb3ZlcnMgdGhlIGFkIHNsb3QgZHVyYXRpb24uIFdpdGhvdXQgYW4gYWRibG9ja2VyIHRoZSBhZCBmaWxscyB0aGUgd2FpdCwKLy8gc28gdGhlIHVzZXIgbmV2ZXIgbm90aWNlcy4gV2l0aCBhbiBhZGJsb2NrZXIsIHRoZSBhZCBpcyBibG9ja2VkIGJ1dCB0aGUKLy8gYmFja29mZiByZW1haW5zLCBjYXVzaW5nIGEgNC0xNiBzZWNvbmQgc3Bpbm5lci4KLy8gRnJvbTogaHR0cHM6Ly9pdGVyLmNhL3Bvc3QveXQtYWRibG9jay8KLy8KLy8gVHdvLXByb25nZWQgZml4OgovLwovLyAxLiBTUEEgbmF2aWdhdGlvbjogV2hlbiBjbGlja2luZyBiZXR3ZWVuIHZpZGVvcyB3aXRob3V0IGEgcGFnZSByZWxvYWQsCi8vICAgIHRoZSBwbGF5ZXIgcmV1c2VzIHRoZSBvbGQgU0FCUiBzZXNzaW9uICh3aGljaCBtYXkgYWxyZWFkeSBoYXZlIGEKLy8gICAgYmFja29mZikuIE9uIHl0LW5hdmlnYXRlLWZpbmlzaCwgd2Ugc2V0IGlzSW5saW5lUGxheWJhY2tOb0FkIG9uIHRoZQovLyAgICBwbGF5ZXIncyB2aWRlbyBkYXRhICh0ZWxsaW5nIGl0IHRoZXJlJ3Mgbm8gYWQgc2xvdCksIHRoZW4gY2FsbAovLyAgICBjYW5jZWxQbGF5YmFjaygpICsgbG9hZFZpZGVvQnlJZCgpIHRvIGZvcmNlIGEgbmV3IFNBQlIgc2Vzc2lvbi4KLy8KLy8gMi4gU0FCUiByZXNwb25zZSBwYXRjaGluZyAoZnVsbCBwYWdlIGxvYWRzKTogSW50ZXJjZXB0IFNBQlIgc3RyZWFtaW5nCi8vICAgIHJlc3BvbnNlcyBhbmQgcmV3cml0ZSBiYWNrb2ZmVGltZU1zIGluIHRoZSBwcm90b2J1Zi4gVGhpcyBoYW5kbGVzCi8vICAgIHBhZ2UgcmVsb2FkcyBhbmQgZGlyZWN0IG5hdmlnYXRpb25zIHdoZXJlIHRoZSBTQUJSIHNlc3Npb24gd2FzCi8vICAgIGFscmVhZHkgZXN0YWJsaXNoZWQgYmVmb3JlIHRoZSBzY3JpcHRsZXQgY291bGQgaW50ZXJ2ZW5lLgovLwovLyBUbyB1c2UgdGhpcyBzY3JpcHRsZXQ6Ci8vIDEuIEdvIHRvIGJyYXZlOi8vc2V0dGluZ3Mvc2hpZWxkcy9maWx0ZXJzCi8vIDIuIEVuYWJsZSBEZXZlbG9wZXIgbW9kZQovLyAzLiBDbGljayBvbiBjcmVhdGUgbmV3IHNjcmlwdGxldAovLyA0LiBBZGQgdGhpcyBjb250ZW50IGFuZCBuYW1lIGl0IGB1c2VyLXl0LXNhYnItZml4LmpzYAovLyA1LiBBZGQgYSBjdXN0b20gZmlsdGVyOiBgd3d3LnlvdXR1YmUuY29tIyMranModXNlci15dC1zYWJyLWZpeC5qcylgCi8vIDYuIEdvIHRvIFlvdVR1YmUgYW5kIHRlc3QKCihmdW5jdGlvbigpIHsKICAgIGNvbnN0IERFQlVHID0gZmFsc2U7CiAgICBjb25zdCBMT0dfUFJFRklYID0gJ1t5dC1zYWJyLWZpeF0nOwogICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IGVsYXBzZWQgPSAoKSA9PiAoKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMCkudG9GaXhlZCgyKSArICdzJzsKICAgIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7IGlmIChERUJVRykgY29uc29sZS5sb2coTE9HX1BSRUZJWCwgZWxhcHNlZCgpLCAuLi5hcmdzKTsgfTsKCiAgICAvLyBQcmVtaXVtIGFjY291bnRzIGhhdmUgbm8gYWRzIGFuZCBubyBiYWNrb2ZmLCBub3RoaW5nIHRvIGRvLgogICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EjbG9nb1t0aXRsZSo9IlByZW1pdW0iIGldJykpIHJldHVybjsKCiAgICAvLyBQcm9uZyAxOiBPbiBTUEEgbmF2aWdhdGlvbiwgZm9yY2UgYSBuZXcgYWQtZnJlZSBTQUJSIHNlc3Npb24uCiAgICAvLyBTZXQgaXNJbmxpbmVQbGF5YmFja05vQWQgb24gdGhlIHZpZGVvIGRhdGEgc28gdGhlIG5ldyBzZXNzaW9uCiAgICAvLyBkb2Vzbid0IGdldCBhbiBhZCBzbG90LCB0aGVuIHRlYXIgZG93biB0aGUgb2xkIHNlc3Npb24gYW5kIHN0YXJ0IGZyZXNoLgogICAgLy8gSW5pdGlhbGl6ZSB0byB0aGUgY3VycmVudCB2aWQgc28gdGhlIGluaXRpYWwgeXQtbmF2aWdhdGUtZmluaXNoCiAgICAvLyAod2hpY2ggZmlyZXMgb24gcGFnZSBsb2FkIGNvbXBsZXRpb24sIG5vdCBqdXN0IFNQQSBuYXYpIGlzIHRyZWF0ZWQKICAgIC8vIGFzIGEgZHVwbGljYXRlIGFuZCBza2lwcGVkLiBBdm9pZHMgdGVhcmluZyBkb3duIHBsYXliYWNrIG9uIHJlZnJlc2guCiAgICAvLyBXZSBza2lwIHRlYXJkb3duIHdoZW4gdGhlcmUncyBubyBwcmlvciBzZXNzaW9uIHRvIGNsZWFyLgogICAgbGV0IGxhc3RSZWxvYWRlZFZpZCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKSB8fCAnJzsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1uYXZpZ2F0ZS1maW5pc2gnLCAoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkIHx8IHZpZCA9PT0gbGFzdFJlbG9hZGVkVmlkKSByZXR1cm47CiAgICAgICAgY29uc3QgaGFkUHJpb3JTZXNzaW9uID0gbGFzdFJlbG9hZGVkVmlkICE9PSAnJzsKICAgICAgICBsYXN0UmVsb2FkZWRWaWQgPSB2aWQ7CiAgICAgICAgaWYgKCFoYWRQcmlvclNlc3Npb24pIHJldHVybjsKCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgICAgICAgaWYgKCFwbGF5ZXI/LmNhbmNlbFBsYXliYWNrIHx8ICFwbGF5ZXI/LmxvYWRWaWRlb0J5SWQpIHJldHVybjsKCiAgICAgICAgICAgIC8vIFNldCB0aGUgbm8tYWQgZmxhZyBiZWZvcmUgcmVsb2FkaW5nIHNvIHRoZSBuZXcgc2Vzc2lvbiBwaWNrcyBpdCB1cAogICAgICAgICAgICBjb25zdCB2ZCA9IHBsYXllci5nZXRWaWRlb0RhdGE/LigpOwogICAgICAgICAgICBpZiAodmQpIHZkLmlzSW5saW5lUGxheWJhY2tOb0FkID0gdHJ1ZTsKCiAgICAgICAgICAgIHBsYXllci5jYW5jZWxQbGF5YmFjaygpOwogICAgICAgICAgICBwbGF5ZXIubG9hZFZpZGVvQnlJZCh2aWQpOwogICAgICAgICAgICBsb2coJ2ZvcmNlZCBuZXcgU0FCUiBzZXNzaW9uIGZvcicsIHZpZCk7CiAgICAgICAgfSwgMTAwKTsKICAgIH0pOwoKICAgIC8vIFByb25nIDFiOiBjb2xkLWxvYWQgcmVzY3VlLiBPbiBhIGZyZXNoIHBhZ2UgbG9hZCB0aGUgcGxheWVyIGFscmVhZHkKICAgIC8vIGhvbGRzIGEgU0FCUiBzZXNzaW9uIGNhcnJ5aW5nIHRoZSBhZC1zbG90IGJhY2tvZmYsIGFuZCBQcm9uZyAxIChTUEEgbmF2CiAgICAvLyBvbmx5KSB3b24ndCBmaXJlLiBQcm9uZyAyIGJlbG93IGNhbiByZXdyaXRlIGJhY2tvZmZUaW1lTXMsIGJ1dCBZb3VUdWJlCiAgICAvLyBzZWVtcyB0byBiZSBpZ25vcmluZyBvdXIgcmV3cml0dGVuIHZhbHVlIGFuZCBlbmZvcmNpbmcgYSBzZXJ2ZXItc2lkZQogICAgLy8gYWQtc2xvdCBkZWxheS4gVGhlIHdheSB0byBnZXQgYXJvdW5kIHRoaXMgaXMgdG8gZm9yY2UgYSBmcmVzaCBzZXNzaW9uIAogICAgLy8gKHNhbWUgbWVjaGFuaXNtIGFzIFByb25nIDEpLiBTbyB3aGVuIFByb25nIDIgZmlyc3Qgc2VlcyBhIHJlYWwgYmFja29mZiAKICAgIC8vIG9uIHRoZSBjb2xkIHNlc3Npb24sIGZvcmNlIGEgc2luZ2xlIGZyZXNoIHNlc3Npb24gaGVyZS4gSWYgdGhlIG5ldyAKICAgIC8vIHNlc3Npb24gc3RpbGwgcmV0dXJucyBhIGJhY2tvZmYsIHdlIGJyZWFrIHRvIGF2b2lkIGEgcmVsb2FkIGxvb3AuCiAgICBsZXQgY29sZFJlbG9hZERvbmUgPSBmYWxzZTsKICAgIGZ1bmN0aW9uIGZvcmNlRnJlc2hTZXNzaW9uT25jZSgpIHsKICAgICAgICBpZiAoY29sZFJlbG9hZERvbmUpIHJldHVybjsKICAgICAgICBjb2xkUmVsb2FkRG9uZSA9IHRydWU7CiAgICAgICAgY29uc3QgcGxheWVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21vdmllX3BsYXllcicpOwogICAgICAgIGlmICghcGxheWVyPy5jYW5jZWxQbGF5YmFjayB8fCAhcGxheWVyPy5sb2FkVmlkZW9CeUlkKSByZXR1cm47CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkKSByZXR1cm47CgogICAgICAgIGNvbnN0IHZkID0gcGxheWVyLmdldFZpZGVvRGF0YT8uKCk7CiAgICAgICAgaWYgKHZkKSB2ZC5pc0lubGluZVBsYXliYWNrTm9BZCA9IHRydWU7CgogICAgICAgIHBsYXllci5jYW5jZWxQbGF5YmFjaygpOwogICAgICAgIHBsYXllci5sb2FkVmlkZW9CeUlkKHZpZCk7CiAgICAgICAgbG9nKCdjb2xkLWxvYWQgcmVzY3VlOiBmb3JjZWQgZnJlc2ggYWQtZnJlZSBzZXNzaW9uIGZvcicsIHZpZCk7CiAgICB9CgogICAgLy8gUHJvbmcgMjogSW50ZXJjZXB0IFNBQlIgcmVzcG9uc2VzIGFuZCBwYXRjaCBiYWNrb2ZmVGltZU1zLgogICAgLy8gVGVlIHRoZSBib2R5IHNvIG1lZGlhIGNodW5rcyAoPj0xMDAwIGJ5dGVzKSBwYXNzIHRocm91Z2ggdW50b3VjaGVkCiAgICAvLyDigJQgb25seSB0aGUgc21hbGwgY29udHJvbCBtZXNzYWdlcyBjYXJyeWluZyB0aGUgYmFja29mZiBmaWVsZCBnZXQKICAgIC8vIGJ1ZmZlcmVkIGFuZCByZS1lbWl0dGVkIGFzIGEgc3ludGhlc2l6ZWQgUmVzcG9uc2UuCiAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CgogICAgd2luZG93LmZldGNoID0gZnVuY3Rpb24ocmVzb3VyY2UsIGluaXQpIHsKICAgICAgICBjb25zdCB1cmwgPSB0eXBlb2YgcmVzb3VyY2UgPT09ICdzdHJpbmcnID8gcmVzb3VyY2UgOiAocmVzb3VyY2U/LnVybCB8fCAnJyk7CgogICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2dvb2dsZXZpZGVvLmNvbScpICYmIHVybC5pbmNsdWRlcygnc2Ficj0xJykpIHsKICAgICAgICAgICAgbGV0IHJuID0gJyc7CiAgICAgICAgICAgIHRyeSB7IHJuID0gbmV3IFVSTCh1cmwpLnNlYXJjaFBhcmFtcy5nZXQoJ3JuJykgfHwgJyc7IH0gY2F0Y2goZSkge30KICAgICAgICAgICAgbG9nKCdTQUJSIGZldGNoIHJuPScgKyBybik7CgogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCAhcmVzcG9uc2UuYm9keSkgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgLy8gVGVlIGRlZmVuc2l2ZWx5OiBpZiBpdCB0aHJvd3MgKGxvY2tlZCBzdHJlYW0sIGJyb3dzZXIgcXVpcmspLAogICAgICAgICAgICAgICAgLy8gaGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgYmFjayB0byBhdm9pZCBicmVha2luZyB0aGUgdmlkZW8gZW50aXJlbHkuCiAgICAgICAgICAgICAgICBsZXQgcGFzcywgc2NhbiwgcmVpbml0OwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBbcGFzcywgc2Nhbl0gPSByZXNwb25zZS5ib2R5LnRlZSgpOwogICAgICAgICAgICAgICAgICAgIHJlaW5pdCA9IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMgfTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFN0cmVhbShzY2FuLmdldFJlYWRlcigpLCAxMDAwKS50aGVuKGZ1bmN0aW9uKGJ5dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnU0FCUiBkb25lIHJuPScgKyBybik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocGFzcywgcmVpbml0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbG9nKCdzbWFsbCByZXNwb25zZSBybj0nICsgcm4sICdzaXplPScgKyBieXRlcy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIHRoZSBhZC1zbG90IHdhaXQsIGF0dGVtcHQgdG8gZm9yY2UgYSBmcmVzaCBzZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGZpcnN0IHNpZ24gb2YgYSByZWFsIGJhY2tvZmYgb24gdGhlIGNvbGQgc2Vzc2lvbi4gSWYgdGhlIG5ldwogICAgICAgICAgICAgICAgICAgIC8vIHNlc3Npb24gc3RpbGwgcmV0dXJucyBhIGJhY2tvZmYsIGJyZWFrIHRvIGF2b2lkIGFuIGluZmluaXRlIHJlbG9hZCBsb29wLgogICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaEJhY2tvZmZGaWVsZChieXRlcywgcm4pKSBmb3JjZUZyZXNoU2Vzc2lvbk9uY2UoKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBuZXcgUmVzcG9uc2UoYnl0ZXMsIHJlaW5pdCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG91dCwgJ3VybCcsIHsgdmFsdWU6IHJlc3BvbnNlLnVybCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlLnR5cGUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CgogICAgLy8gUmVhZCBhIHN0cmVhbSBpbnRvIGEgVWludDhBcnJheS4gSWYgZWFybHlFeGl0VGhyZXNob2xkIGlzIHNldCBhbmQgdGhlCiAgICAvLyBhY2N1bXVsYXRlZCBieXRlcyBjcm9zcyBpdCwgY2FuY2VsIHRoZSByZWFkZXIgYW5kIHJldHVybiBudWxsIOKAlCB1c2VkCiAgICAvLyB0byBiYWlsIG91dCBvZiBidWZmZXJpbmcgd2hlbiB0aGUgcmVzcG9uc2UgaXMgY2xlYXJseSBhIG1lZGlhIGNodW5rCiAgICAvLyBhbmQgc2hvdWxkIHN0cmVhbSBzdHJhaWdodCB0byB0aGUgcGxheWVyIGluc3RlYWQuCiAgICBmdW5jdGlvbiByZWFkU3RyZWFtKHJlYWRlciwgZWFybHlFeGl0VGhyZXNob2xkKSB7CiAgICAgICAgY29uc3QgY2h1bmtzID0gW107CiAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIHB1bXAocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgewogICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkodG90YWwpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBvZmYgKz0gY2h1bmtzW2ldLmxlbmd0aCwgaSsrKQogICAgICAgICAgICAgICAgICAgIG1lcmdlZC5zZXQoY2h1bmtzW2ldLCBvZmYpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaHVua3MucHVzaChyZXN1bHQudmFsdWUpOwogICAgICAgICAgICB0b3RhbCArPSByZXN1bHQudmFsdWUubGVuZ3RoOwogICAgICAgICAgICBpZiAoZWFybHlFeGl0VGhyZXNob2xkICYmIHRvdGFsID49IGVhcmx5RXhpdFRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgdHJ5IHsgcmVhZGVyLmNhbmNlbCgpOyB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKHB1bXApOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vIFNjYW4gZm9yIHByb3RvYnVmIGZpZWxkIDQgKGJhY2tvZmZUaW1lTXMpIGFuZCByZXdyaXRlIHZhbHVlcyA+IDUwMG1zCiAgICAvLyB0byBhIHNtYWxsIHJhbmRvbSB2YWx1ZSAoNTAtMTUwbXMsIGxvb2tzIGxpa2UgbmF0dXJhbCBiYWNrb2ZmIG5vaXNlCiAgICAvLyByYXRoZXIgdGhhbiBhIGNsZWFuIHplcm8pLiBQcm90b2J1ZiB3aXJlIGZvcm1hdDogZmllbGQgNCwgd2lyZSB0eXBlCiAgICAvLyAwICh2YXJpbnQpID0gdGFnIGJ5dGUgMHgyMCAoZmllbGRfbnVtYmVyIDw8IDMgfCB3aXJlX3R5cGUgPSA0IDw8IDMKICAgIC8vIHwgMCkuIFRoZSB2YXJpbnQgdXNlcyA3IGJpdHMgcGVyIGJ5dGUgd2l0aCAweDgwIGFzIGNvbnRpbnVhdGlvbgogICAgLy8gZmxhZy4gV2UgcmV3cml0ZSB0aGUgdmFyaW50IGluIHBsYWNlLCBrZWVwaW5nIHRoZSBzYW1lIGJ5dGUgY291bnQKICAgIC8vIHNvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZSBzdGF5cyB2YWxpZC4KICAgIGZ1bmN0aW9uIHBhdGNoQmFja29mZkZpZWxkKGJ5dGVzLCBybikgewogICAgICAgIGxldCBwYXRjaGVkID0gZmFsc2U7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgaWYgKGJ5dGVzW2ldICE9PSAweDIwKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IHZhbCA9IDAsIHNoaWZ0ID0gMCwgZW5kID0gaSArIDE7CiAgICAgICAgICAgIHdoaWxlIChlbmQgPCBieXRlcy5sZW5ndGggJiYgc2hpZnQgPCAzNSkgewogICAgICAgICAgICAgICAgdmFsIHw9IChieXRlc1tlbmRdICYgMHg3ZikgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgICBpZiAoIShieXRlc1tlbmRdICYgMHg4MCkpIHsgZW5kKys7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBzaGlmdCArPSA3OwogICAgICAgICAgICAgICAgZW5kKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbCA+IDUwMCAmJiB2YWwgPCAxMDAwMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IDUwICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKTsKICAgICAgICAgICAgICAgIGxvZygnUEFUQ0ggYmFja29mZj0nICsgdmFsICsgJ21zIOKGkiAnICsgdGFyZ2V0ICsgJ21zIGF0IG9mZnNldD0nICsgaSwgJ3JuPScgKyBybik7CiAgICAgICAgICAgICAgICBsZXQgcG9zID0gaSArIDEsIHJlbWFpbmluZyA9IHRhcmdldDsKICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnl0ZXNbcG9zKytdID0gKHJlbWFpbmluZyAmIDB4N2YpIHwgMHg4MDsKICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPj4+PSA3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnl0ZXNbcG9zXSA9IHJlbWFpbmluZyAmIDB4N2Y7CiAgICAgICAgICAgICAgICBwYXRjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF0Y2hlZDsKICAgIH0KCiAgICBpZiAoREVCVUcpIHsKICAgICAgICBsZXQgbGFzdFJTID0gLTE7CiAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICBpZiAoIXYpIHJldHVybjsKICAgICAgICAgICAgaWYgKHYucmVhZHlTdGF0ZSAhPT0gbGFzdFJTKSB7CiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2LmJ1ZmZlcmVkLmxlbmd0aCA+IDAgPyB2LmJ1ZmZlcmVkLmVuZCgwKS50b0ZpeGVkKDEpIDogJzAnOwogICAgICAgICAgICAgICAgbG9nKCdWSURFTyBycz0nICsgdi5yZWFkeVN0YXRlLCAnY3Q9JyArIHYuY3VycmVudFRpbWUudG9GaXhlZCgxKSwgJ2J1Zj0nICsgYnVmLCB2LnBhdXNlZCA/ICdwYXVzZWQnIDogJ3BsYXlpbmcnKTsKICAgICAgICAgICAgICAgIGxhc3RSUyA9IHYucmVhZHlTdGF0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDIwMCk7CiAgICB9CgogICAgbG9nKCdsb2FkZWQnKTsKfSkoKTsKCg=="},{"name":"brave-youtube-playback-speed-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXlvdXR1YmUtcGxheWJhY2stc3BlZWQtZml4LmpzCi8vIFRoaXMgc2NyaXB0IGlzIGluamVjdGVkIGludG8gWW91VHViZSBwYWdlcyB0byB3b3JrIGFyb3VuZCBhIFlvdVR1YmUgYnVnIHdoZXJlCi8vIHRoZSBwbGF5YmFjayBzcGVlZCB3aWxsIG9ubHkgc2F2ZSBmb3IgZnV0dXJlIHZpZGVvcyB3aGVuIHVzaW5nIHRoZSBzbGlkZXIgY29udHJvbHMuCi8vIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHBsYXliYWNrIHNwZWVkIHVzaW5nIHRoZSBidXR0b25zLCB0aGUgbmV3IHNwZWVkIHdpbGwgbm90IGJlIHNhdmVkLgovLyBUaGlzIGNyZWF0ZWQgaXNzdWVzIHdoZXJlLCBpZiB0aGUgdXNlciBhZGp1c3RlZCB0aGUgc2xpZGVyLCBhbmQgdGhlbiBjbGlja2VkIHRoZSAxeCBidXR0b24gdG8KLy8gcmVzZXQgdGhlIHNwZWVkLCB0aGUgc3BlZWQgd291bGQgYmUgcmVzZXQgdG8gMXgsIGJ1dCB0aGVuIGFsbCBmdXR1cmUgdmlkZW9zIHdvdWxkIHBsYXkgYXQgdGhlCi8vIHByZXZpb3VzbHkgc2V0IHNwZWVkLiBUaGUgc2NyaXB0IHdvcmtzIGFyb3VuZCB0aGlzIGJ5IHNhdmluZyB0aGUgcGxheWJhY2sgc3BlZWQgdG8gc2Vzc2lvblN0b3JhZ2UKLy8gd2hlbmV2ZXIgaXQgY2hhbmdlcywgaW5zdGVhZCBvZiByZWx5aW5nIG9uIFlvdVR1YmUncyBkZWZhdWx0IGJlaGF2aW9yLgooZnVuY3Rpb24gKCkgewogIGNvbnN0IEtFWSA9ICd5dC1wbGF5ZXItcGxheWJhY2stcmF0ZSc7CiAgZnVuY3Rpb24gYXR0YWNoKHBsYXllcikgewogICAgaWYgKCFwbGF5ZXIgfHwgIXBsYXllci5hZGRFdmVudExpc3RlbmVyIHx8IHBsYXllci5fX3JhdGVIb29rZWQpIHJldHVybiBmYWxzZTsKICAgIHBsYXllci5fX3JhdGVIb29rZWQgPSB0cnVlOwogICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ29uUGxheWJhY2tSYXRlQ2hhbmdlJywgZnVuY3Rpb24gKHJhdGUpIHsKICAgICAgY29uc3QgdiA9ICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpID8gcmF0ZSA6IChyYXRlICYmIHJhdGUuZGF0YSkgPz8gcmF0ZTsKICAgICAgdHJ5IHsKICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKEtFWSwgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgZGF0YTogU3RyaW5nKHYpLAogICAgICAgICAgY3JlYXRpb246IERhdGUubm93KCkKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoIWF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICBjb25zdCBvbk5hdkZpbmlzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogIH0KfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIHZhZnQKICAgIC8vIGluc3RhbmNlIHRoYXQgZmlnaHRzIGZvciBwbGF5ZXIgY29udHJvbC4gT25seSB0aGUgdG9wIGZyYW1lIGhvc3RzIHRoZSBwbGF5ZXIgb24KICAgIC8vIHR3aXRjaC50di9DSEFOTkVMOyBuZXN0ZWQgYXV4aWxpYXJ5IGZyYW1lcyBhcmUgbm9pc2UuCiAgICAvLyBBbGxvdy1saXN0IGZvciBuZXN0ZWQtZnJhbWUgaW5qZWN0aW9uOiBUd2l0Y2gncyB0aHJlZSBkb2N1bWVudGVkIGVtYmVkIGNvbnRleHRzCiAgICAvLyAoaHR0cHM6Ly9kZXYudHdpdGNoLnR2L2RvY3MvZW1iZWQvdmlkZW8tYW5kLWNsaXBzLykg4oCUIHByZXNlcnZlcyBUd2l0Y2ggc3RyZWFtcwogICAgLy8gZW1iZWRkZWQgb24gdGhpcmQtcGFydHkgc2l0ZXMgd2hlcmUgdmFmdCBydW5zIGluIGFuIGlmcmFtZSB3aG9zZSBwYXJlbnQgaXMgb24KICAgIC8vIGEgZGlmZmVyZW50IG9yaWdpbi4KICAgIC8vIFVzZSB3aW5kb3cuZnJhbWVFbGVtZW50IHRvIGRldGVjdCBuZXN0ZWQgZnJhbWVzIOKAlCBudWxsIG9uIHRvcCBmcmFtZSwgdGhlIGlmcmFtZQogICAgLy8gZWxlbWVudCBvbiBhIHNhbWUtb3JpZ2luIG5lc3RlZCBmcmFtZSwgdGhyb3dzIG9uIGEgY3Jvc3Mtb3JpZ2luIG5lc3RlZCBmcmFtZS4KICAgIC8vIE1vcmUgcmVsaWFibGUgdGhhbiAnd2luZG93ICE9PSB3aW5kb3cudG9wJyBiZWNhdXNlIFRhbXBlcm1vbmtleSB3cmFwcyB3aW5kb3cgaW4gYQogICAgLy8gcHJveHkgd2hlcmUgdGhlIHN0cmljdCBjb21wYXJpc29uIGNhbiByZXR1cm4gdHJ1ZSBldmVuIG9uIHRoZSB0b3AgZnJhbWUuCiAgICBsZXQgX2lzTmVzdGVkID0gZmFsc2U7CiAgICB0cnkgeyBfaXNOZXN0ZWQgPSB3aW5kb3cuZnJhbWVFbGVtZW50ICE9PSBudWxsOyB9IGNhdGNoIChfZSkgeyBfaXNOZXN0ZWQgPSB0cnVlOyB9CiAgICBpZiAoX2lzTmVzdGVkKSB7CiAgICAgICAgY29uc3QgX2hvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfaXNFbWJlZENvbnRleHQgPSBfaG9zdCA9PT0gJ3BsYXllci50d2l0Y2gudHYnIHx8IF9ob3N0ID09PSAnZW1iZWQudHdpdGNoLnR2JyB8fCBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvZW1iZWQvJyk7CiAgICAgICAgaWYgKCFfaXNFbWJlZENvbnRleHQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmFmdCBza2lwcGVkIOKAlCBuZXN0ZWQgZnJhbWUgb24gJyArIF9ob3N0ICsgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgKyAnIChub3QgYSBUd2l0Y2ggZW1iZWQpLiBJZiB5b3Ugc2VlIHRoaXMgb24gdHdpdGNoLnR2L0NIQU5ORUwgdG9wIGZyYW1lLCBwbGVhc2UgcmVwb3J0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgLy8gU2tpcCBpbmplY3Rpb24gb24gdGhlIFR3aXRjaCBjbGlwIGVkaXRvciDigJQgY2xpcHMudHdpdGNoLnR2IGhvc3Qgb3IgLzxjaGFubmVsPi9jbGlwLzxzbHVnPiBwYXRoLgogICAgLy8gT3VyIGZldGNoL1dvcmtlciBob29rcyBhbmQgYnVmZmVyIG1vbml0b3IgYXJlIGFpbWVkIGF0IHRoZSBsaXZlIGNoYW5uZWwgcGxheWVyOyBvbiB0aGUKICAgIC8vIGNsaXAgZWRpdG9yJ3Mgc2Vla2FibGUgcHJldmlldyB0aGV5IGhhdmUgbm8gYWRzIHRvIGFjdCBvbiBhbmQgaGF2ZSBjYXVzZWQgdGhlIHByZXZpZXcKICAgIC8vIHRvIGZyZWV6ZSB3aGVuIHRoZSB1c2VyIGRyYWdzIHRoZSB0cmltIHJhbmdlLiAoU3luYydkIHdpdGggVFRWLUFCIHY2LjQuOS4pCiAgICB7CiAgICAgICAgY29uc3QgX2NsaXBIb3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2NsaXBQYXRoID0gZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgfHwgJyc7CiAgICAgICAgaWYgKF9jbGlwSG9zdCA9PT0gJ2NsaXBzLnR3aXRjaC50dicgfHwgL15cL1teL10rXC9jbGlwXC9bXi9dKy8udGVzdChfY2xpcFBhdGgpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZhZnQgc2tpcHBlZCDigJQgY2xpcCBlZGl0b3IgcGFnZSAoJyArIF9jbGlwSG9zdCArIF9jbGlwUGF0aCArICcpLicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJ3VzZSBzdHJpY3QnOwogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gODQ7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2YWZ0IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZhZnQgdicgKyBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnIHNraXBwZWQg4oCUIGFub3RoZXIgc2NyaXB0IGFscmVhZHkgYWN0aXZlICh2JyArIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnKS4gUmVtb3ZlIGR1cGxpY2F0ZSBzY3JpcHRzLicpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb247CiAgICAvLyBDb25maWd1cmF0aW9uIGFuZCBzdGF0ZSBzaGFyZWQgYmV0d2VlbiB3aW5kb3cgYW5kIHdvcmtlciBzY29wZXMKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guIFRoZSBzcGVjaWZpYyB0d2l0Y2gtc3RpdGNoZWQtYWQgREFURVJBTkdFCiAgICAgICAgLy8gbWFya2VyIGlzIGEgc3Vic2V0IG9mIHRoaXMgcHJlZml4LgogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVycyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIicsICdFWFQtWC1EQVRFUkFOR0U6Q0xBU1M9InR3aXRjaC10cmlnZ2VyIiddOwogICAgICAgIC8vIENvbmZpcm1lZCBzZXNzaW9uL3NvdXJjZSBtZXRhZGF0YSwgbmV2ZXIgYWQgbWFya2VycyDigJQgZmlsdGVyIGZyb20gY2FuZGlkYXRlIGxvZy4KICAgICAgICBzY29wZS5Lbm93bk5vbkFkU2lnbmlmaWVycyA9IFsndHdpdGNoLXNlc3Npb24nLCAndHdpdGNoLXN0cmVhbS1zb3VyY2UnLCAndHdpdGNoLWFkLXF1YXJ0aWxlJywgJ3R3aXRjaC1hc3NpZ25tZW50J107CiAgICAgICAgc2NvcGUuQWRTZWdtZW50VVJMUGF0dGVybnMgPSBbJy9hZHNxdWFyZWQvJywgJy9fNDA0LycsICcvcHJvY2Vzc2luZyddOwogICAgICAgIC8vIFByZWNvbXBpbGVkIHJlZ2V4ZXMgc2hhcmVkIGFjcm9zcyB0aGUgc3RyaXBBZFNlZ21lbnRzIGhvdCBwYXRoLiBEZWNsYXJlZAogICAgICAgIC8vIGhlcmUgKHNlcmlhbGl6ZWQgaW50byB0aGUgd29ya2VyIGJsb2Igd2l0aCBkZWNsYXJlT3B0aW9ucykgc28gbGl0ZXJhbHMKICAgICAgICAvLyBpbnNpZGUgdGhlIHBlci1saW5lIHN0cmlwIGxvb3AgZG9uJ3QgcmVjb21waWxlIG9uIGV2ZXJ5IGl0ZXJhdGlvbiDigJQgZm9yCiAgICAgICAgLy8gYSAxMDAtbGluZSBtM3U4IGF0IH4yIHBvbGxzL3NlYyBkdXJpbmcgYW4gYWQgYnJlYWssIGhvaXN0aW5nIHRoZSBVUkwKICAgICAgICAvLyByZXdyaXRlIGFsb25lIHNhdmVzIH4yMDAgcmVnZXggY29tcGlsYXRpb25zIHBlciBzZWNvbmQuCiAgICAgICAgc2NvcGUuVHdpdGNoQWRVcmxSZXdyaXRlUmVnZXggPSAvKFgtVFYtVFdJVENILUFEKD86LVtBLVpdKykqLVVSTFM/PSIpW14iXSooIikvZzsKICAgICAgICBzY29wZS5VcmlBdHRyaWJ1dGVSZWdleCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5DbGllbnRJRCA9ICdraW1uZTc4a3gzbmN4NmJyZ280bXY2d2tpNWgxa28nOwogICAgICAgIHNjb3BlLkJhY2t1cFBsYXllclR5cGVzID0gWwogICAgICAgICAgICAvLyBPcmRlciBtYXR0ZXJzOiBmaXJzdCBjbGVhbiB0eXBlIHdpbnMuICdlbWJlZCcgbW92ZWQgdG8gZW5kIOKAlCBmaWVsZC1vYnNlcnZlZAogICAgICAgICAgICAvLyBUd2l0Y2ggcmV0dXJucyBHUUwgJ3NlcnZlciBlcnJvcicgZm9yIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gb24gZW1iZWQgd2hlbgogICAgICAgICAgICAvLyByZXF1ZXN0ZWQgZnJvbSB0d2l0Y2gudHYgb3JpZ2luLCB3YXN0aW5nIH4yMDAtNDAwbXMgcGVyIGJyZWFrIGFzIGZpcnN0LXRyeS4KICAgICAgICAgICAgLy8gS2VwdCBpbiBjYXNlIGl0IGV2ZXIgc3VjY2VlZHMgb24gc29tZSBjaGFubmVsL3VzZXIgY29tYm8uCiAgICAgICAgICAgICdzaXRlJywvL1NvdXJjZQogICAgICAgICAgICAncG9wb3V0JywvL1NvdXJjZQogICAgICAgICAgICAnbW9iaWxlX3dlYicsLy9Nb2JpbGUKICAgICAgICAgICAgJ2VtYmVkJywvL1NvdXJjZSAodW5yZWxpYWJsZSDigJQgc2VlIG5vdGUgYWJvdmUpCiAgICAgICAgICAgIC8vICdhdXRvcGxheScgKDM2MHApIHJlbW92ZWQ6IHdoZW4gY29tbWl0dGVkIGFzIGN5Y2xlIGJhY2t1cCwgdGhlIHBsYXllciBnZXRzIHN0dWNrCiAgICAgICAgICAgIC8vIGluIGFuIGVuZGxlc3MgbG9hZGluZyBjaXJjbGUgYWZ0ZXIgdGhlIENTQUktb25seSBwYXRoIHJlbGVhc2VzIHRoZSBiYWNrdXAg4oCUCiAgICAgICAgICAgIC8vIGF1dG9wbGF5IHZhcmlhbnRzIGRvbid0IHRyYW5zaXRpb24gY2xlYW5seSBiYWNrIHRvIG1haW4gc3RyZWFtIHZhcmlhbnRzLgogICAgICAgIF07CiAgICAgICAgc2NvcGUuRmFsbGJhY2tQbGF5ZXJUeXBlID0gJ3NpdGUnOy8vIHdhcyAnZW1iZWQnIOKAlCBzaXRlIGlzIG1vcmUgcmVsaWFibGUgd2hlbiBhbGwgU291cmNlIHR5cGVzIGVuZCB1cCBhZC1sYWRlbgogICAgICAgIHNjb3BlLkZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJ3BvcG91dCc7CiAgICAgICAgc2NvcGUuUHJlZmVyTG93UXVhbGl0eUJhY2t1cCA9IHRydWU7Ly8gSHlicmlkIHNhZmV0eSBuZXQgZm9yIFNTQUktaGVhdnkgYnJlYWtzOiBzdGlja3kgZXNjYXBlIGhhdGNoIChmaXJlcyBhZnRlciB+OHMgc3R1Y2sgaW4gYWxsLXN0cmlwcGVkIHN0YXRlKSArIGF1dG9wbGF5ICgzNjBwKSBhcyBsYXN0LXJlc29ydCBiYWNrdXAgd2hlbiBhbGwgU291cmNlIHR5cGVzIGFyZSBhZC1sYWRlbi4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX3ByZWZlckxvd1F1YWxpdHlCYWNrdXA9ZmFsc2UgdG8gZGlzYWJsZS4KICAgICAgICBzY29wZS5GYXN0QXV0b3BsYXlGaXJzdFRyeSA9IHRydWU7Ly8gUHJlcGVuZCBhdXRvcGxheSAoMzYwcCkgdG8gdGhlIGl0ZXJhdGlvbiB3aGVuIHRoZSBwcmlvciBicmVhayBleGhhdXN0ZWQgYWxsIDQgU291cmNlIHR5cGVzIOKAlCBzYXZlcyB+MS41cyBvZiBwcm9iZSBidWZmZXJpbmcgb24gZXZlcnkgYnJlYWsuIEF1dG8tcmVzZXRzIG9uIFNvdXJjZS10aWVyIHJlY292ZXJ5LiBEZWZhdWx0IG9uIGFzIG9mIHY2Ny4xLjAgKGV2ZXJ5IG9ic2VydmVkIGNoYW5uZWwgaXMgQ1NBSS1vbmx5LWJ1dC1tYXJrZWQpLiBPcHQtb3V0OiB0d2l0Y2hBZFNvbHV0aW9uc19mYXN0QXV0b3BsYXlGaXJzdFRyeT1mYWxzZS4KICAgICAgICBzY29wZS5CYWNrdXBTd2FwRmlyc3QgPSB0cnVlOy8vIE9uIGFkIGRldGVjdCwgaW1tZWRpYXRlbHkgc3dhcCB0byBhIGJhY2t1cCBwbGF5ZXItdHlwZSBtM3U4IChUVFYtQUItc3R5bGUpLiBBdm9pZHMgTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkg4oCUIGZld2VyIGxvYWRpbmcgY2lyY2xlcyBpbiBmaWVsZC4gQ29zdDogZXh0cmEgZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhay4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX2JhY2t1cFN3YXBGaXJzdD1mYWxzZSB0byBkaXNhYmxlLgogICAgICAgIHNjb3BlLkRpc2FibGVBZFNwb29maW5nID0gdHJ1ZTsvLyBEZWZhdWx0IE9GRiAod2FzIE9OIHRocm91Z2ggdjY4LjIuMCkuIFRoZSBhbHdheXMtMTAwJS13YXRjaGVkICsgYXVkaWJsZSArIHZpc2libGUgc3Bvb2YgYmVhY29uIHBhdHRlcm4gbWF5IGl0c2VsZiBmaW5nZXJwcmludCBhcyBhbm9tYWxvdXMgYW5kIHRyaWdnZXIgZGV0ZWN0aW9uIGVzY2FsYXRpb24gKENTQUkgcmVhY2hpbmcgdGhlIGNvbW1pdHRlZCBiYWNrdXApLiBTcG9vZi1hY2NlcHRlZCBkb2VzIE5PVCBwcm92ZSBub3QtZmluZ2VycHJpbnRlZC4gT3B0IGluIHZpYSB0d2l0Y2hBZFNvbHV0aW9uc19kaXNhYmxlQWRTcG9vZmluZz1mYWxzZS4KICAgICAgICBzY29wZS5SZWNvdmVyRnJvbVNpbGVudE11dGUgPSB0cnVlOy8vIE9uIGhhcmQgcmVsb2FkLCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IG11dGVkIGJ1dCB2YWZ0IGhhcyBzdWNjZXNzZnVsbHkgdW5tdXRlZCBhdCBhbnkgcG9pbnQgZWFybGllciB0aGlzIHNlc3Npb24sIHRyZWF0IGl0IGFzIGEgc2lsZW50IFR3aXRjaCByZS1tdXRlIGFuZCByZWNvdmVyIHZpYSB0aGUgYmFja3N0b3AuIERlZmF1bHQgb247IHNldCB0d2l0Y2hBZFNvbHV0aW9uc19yZWNvdmVyRnJvbVNpbGVudE11dGU9ZmFsc2UgdG8gZGlzYWJsZSAodXNlZnVsIGZvciB1c2VycyB3aG8gZGVsaWJlcmF0ZWx5IG11dGUgbWlkLXNlc3Npb24pLgogICAgICAgIHNjb3BlLlNraXBQbGF5ZXJSZWxvYWRPbkhldmMgPSBmYWxzZTsvLyBJZiB0cnVlIHRoaXMgd2lsbCBza2lwIHBsYXllciByZWxvYWQgb24gc3RyZWFtcyB3aGljaCBoYXZlIDJrLzRrIHF1YWxpdHkgKGlmIHlvdSBlbmFibGUgdGhpcyBhbmQgeW91IHVzZSB0aGUgMmsvNGsgcXVhbGl0eSBzZXR0aW5nIHlvdSdsbCBnZXQgZXJyb3IgIzQwMDAgLyAjMzAwMCAvIHNwaW5uaW5nIHdoZWVsIG9uIGNocm9tZSBiYXNlZCBicm93c2VycykKICAgICAgICBzY29wZS5BbHdheXNSZWxvYWRQbGF5ZXJPbkFkID0gZmFsc2U7Ly8gQWx3YXlzIHBhdXNlL3BsYXkgd2hlbiBlbnRlcmluZy9sZWF2aW5nIGFkcwogICAgICAgIHNjb3BlLlJlbG9hZFBsYXllckFmdGVyQWQgPSB0cnVlOy8vIEFmdGVyIHRoZSBhZCBmaW5pc2hlcyBkbyBhIHBsYXllciByZWxvYWQgaW5zdGVhZCBvZiBwYXVzZS9wbGF5CiAgICAgICAgc2NvcGUuUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gMzA7Ly8gTWluaW11bSBzZWNvbmRzIGJldHdlZW4gcmVsb2FkcyDigJQgYnJlYWtzIENTQUkgY2FzY2FkZXMgdHJpZ2dlcmVkIGJ5IHJlbG9hZAogICAgICAgIHNjb3BlLkRpc2FibGVSZWxvYWRDYXAgPSBmYWxzZTsvLyBJZiB0cnVlLCBidWZmZXIgbW9uaXRvciByZWxvYWRzIHVubGltaXRlZCB0aW1lcyAocHJlLXY0NyBiZWhhdmlvciwgcmlzayBvZiBjYXNjYWRlKQogICAgICAgIHNjb3BlLkRyaWZ0Q29ycmVjdGlvblJhdGUgPSAxLjE7Ly8gUGxheWJhY2sgcmF0ZSBmb3IgY2F0Y2hpbmcgdXAgdG8gbGl2ZSBlZGdlIGFmdGVyIHJlbG9hZCAoMCA9IGRpc2FibGUgZHJpZnQgY29ycmVjdGlvbikKICAgICAgICBzY29wZS5FYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSAzOy8vIE51bWJlciBvZiBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIHRyaWdnZXJpbmcgZWFybHkgcmVsb2FkIChlYWNoIHBvbGwgfjJzLCBzbyAzID0gfjZzLCA1ID0gfjEwcywgMTAgPSB+MjBzOyAwID0gZGlzYWJsZSkuIExvd2VyZWQgZnJvbSA1IHRvIDMgdG8gbWF0Y2ggdGhlIHRlc3RpbmcgdmFyaWFudC4gT3ZlcnJpZGUgdmlhIGxvY2FsU3RvcmFnZSB0d2l0Y2hBZFNvbHV0aW9uc19lYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQuCiAgICAgICAgc2NvcGUuUGluQmFja3VwUGxheWVyVHlwZSA9IHRydWU7Ly8gUmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5QbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNUaW1lID0gMTUwMDsKICAgICAgICBzY29wZS5QbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNQbGF5ZXJJbmRleCA9IDI7Ly9hdXRvcGxheQogICAgICAgIHNjb3BlLkhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgIHNjb3BlLlN0cmVhbUluZm9zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvc0J5VXJsID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBzY29wZS5HUUxEZXZpY2VJRCA9IG51bGw7CiAgICAgICAgc2NvcGUuQ2xpZW50VmVyc2lvbiA9IG51bGw7CiAgICAgICAgc2NvcGUuQ2xpZW50U2Vzc2lvbiA9IG51bGw7CiAgICAgICAgc2NvcGUuQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gbnVsbDsKICAgICAgICBzY29wZS5BdXRob3JpemF0aW9uSGVhZGVyID0gdW5kZWZpbmVkOwogICAgICAgIHNjb3BlLlNpbXVsYXRlZEFkc0RlcHRoID0gMDsKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdGaXggPSB0cnVlOy8vIElmIHRydWUgdGhpcyB3aWxsIHBhdXNlL3BsYXkgdGhlIHBsYXllciB3aGVuIGl0IGdldHMgc3R1Y2sgYnVmZmVyaW5nCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nRGVsYXkgPSA2MDA7Ly8gSG93IG9mdGVuIHNob3VsZCB3ZSBjaGVjayB0aGUgcGxheWVyIHN0YXRlIChpbiBtaWxsaXNlY29uZHMpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nU2FtZVN0YXRlQ291bnQgPSAzOy8vIEhvdyBtYW55IHRpbWVzIG9mIHNlZWluZyB0aGUgc2FtZSBwbGF5ZXIgc3RhdGUgdW50aWwgd2UgdHJpZ2dlciBwYXVzZS9wbGF5IChpdCB3aWxsIG9ubHkgdHJpZ2dlciBpdCBvbmUgdGltZSB1bnRpbCB0aGUgcGxheWVyIHN0YXRlIGNoYW5nZXMgYWdhaW4pCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nRGFuZ2VyWm9uZSA9IDAuNTsvLyBMb3dlcmVkIDEg4oaSIDAuNTogYXZvaWRzIGNhc2NhZGUgZmlyZXMgb24gdGhpbi1idXQtZnVuY3Rpb25hbCBidWZmZXIgYXQgbGl2ZSBlZGdlIHdoZXJlIHBhdXNlL3BsYXkgaW50ZXJhY3RzIGJhZGx5IHdpdGggVHdpdGNoJ3MgcGxheWJhY2stbW9uaXRvci4KICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZCA9IGZhbHNlOy8vIElmIHRydWUgdGhpcyB3aWxsIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkgKHBsYXllciByZWxvYWRpbmcgaXMgYmV0dGVyIGF0IGZpeGluZyB0aGUgcGxheWJhY2sgaXNzdWVzIGJ1dCBpdCB0YWtlcyBzbGlnaHRseSBsb25nZXIpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgPSA4MDAwOy8vIE1pbmltdW0gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmV0d2VlbiBlYWNoIHBhdXNlL3BsYXkgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlciBwcmVzc2luZyBwYXVzZS9wbGF5IHdoZW4gdGhlcmUgYXJlIGdlbnVpbmUgYnVmZmVyaW5nIHByb2JsZW1zKQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgPSBmYWxzZTsvLyBFbmFibGUgdGhpcyBpZiB5b3UncmUgZ2V0dGluZyBhbiBpbW1lZGlhdGUgcGF1c2UvcGxheS9yZWxvYWQgYXMgeW91IG9wZW4gYSBzdHJlYW0gKHdoaWNoIGlzIGNhdXNpbmcgdGhlIHN0cmVhbSB0byB0YWtlIGxvbmdlciB0byBsb2FkKS4gT25lIHByb2JsZW0gd2l0aCB0aGlzIGJlaW5nIHRydWUgaXMgdGhhdCBpdCBjYW4gY2F1c2UgdGhlIHBsYXllciB0byBnZXQgc3R1Y2sgaW4gc29tZSBpbnN0YW5jZXMgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIHByZXNzIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQgPSA1Oy8vIEhvdyBmYXIgdGhlIHN0cmVhbSBuZWVkIHRvIG1vdmUgYmVmb3JlIGRvaW5nIHRoZSBidWZmZXJpbmcgbWl0aWdhdGlvbiAoZGVwZW5kcyBvbiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tFbmFibGVkIGJlaW5nIHRydWUpCiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb01heEFnZU1zID0gMzAgKiA2MCAqIDEwMDA7CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgaW4gc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVsZXRlIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBFbmNvZGluZ3NNM1U4OiBlbmNvZGluZ3NNM3U4LAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgICAgIFJlc29sdXRpb25MaXN0OiBbXSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIFNwb29mZWRBZElkczogbmV3IFNldCgpLC8vIG5vdGlmeUFkQ29tcGxldGUgbXVsdGktcG9sbCBkZWR1cCDigJQgc3RpdGNoZWQtYWQgSURzIHNwb29mZWQgdGhpcyBicmVhay4gQ2xlYXJlZCBhdCBicmVhayBlbmQuCiAgICAgICAgICAgIE1vZGlmaWVkTTNVODogbnVsbCwKICAgICAgICAgICAgSXNVc2luZ01vZGlmaWVkTTNVODogZmFsc2UsCiAgICAgICAgICAgIElzU2hvd2luZ0FkOiBmYWxzZSwKICAgICAgICAgICAgSXNNaWRyb2xsOiBmYWxzZSwKICAgICAgICAgICAgQWRCcmVha1N0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgUG9kTGVuZ3RoOiAxLAogICAgICAgICAgICBIYXNDb25maXJtZWRBZEF0dHJzOiBmYWxzZSwKICAgICAgICAgICAgQ2xlYW5QbGF5bGlzdENvdW50OiAwLAogICAgICAgICAgICBQZW5kaW5nQWRFbmRBdDogMCwKICAgICAgICAgICAgQWRFbmRCb3VuY2VDb3VudDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3M6IDAsCiAgICAgICAgICAgIENzYWlPbmx5VGhpc0JyZWFrOiBmYWxzZSwKICAgICAgICAgICAgSXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBmYWxzZSwKICAgICAgICAgICAgTnVtU3RyaXBwZWRBZFNlZ21lbnRzOiAwLAogICAgICAgICAgICBSZWNvdmVyeVNlZ21lbnRzOiBbXSwKICAgICAgICAgICAgUmVjb3ZlcnlTdGFydFNlcTogdW5kZWZpbmVkLAogICAgICAgICAgICBGcmVlemVTdGFydGVkQXQ6IDAsCiAgICAgICAgICAgIENvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xsczogMCwKICAgICAgICAgICAgVG90YWxBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBMYXN0Q2xlYW5OYXRpdmVNM1U4OiBudWxsLAogICAgICAgICAgICBMYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0OiAwLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NNM1U4Q2FjaGU6IFtdLAogICAgICAgICAgICBBY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBQaW5uZWRCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBMYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgRmFpbGVkQmFja3VwUGxheWVyVHlwZXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgTG9nZ2VkQmFja3VwQWRzQnlUeXBlOiBudWxsLAogICAgICAgICAgICBDeWNsZVJlc2N1ZWRUaGlzQnJlYWs6IGZhbHNlLAogICAgICAgICAgICBFYXJseVJlbG9hZENvdW50OiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZEF0UG9sbDogMCwKICAgICAgICAgICAgRWFybHlSZWxvYWRUcmlnZ2VyZWQ6IGZhbHNlLAogICAgICAgICAgICBFYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0OiBmYWxzZSwKICAgICAgICAgICAgRXNjYXBlSGF0Y2hGaXJlZDogZmFsc2UsCiAgICAgICAgICAgIExhc3RCcmVha1VzZWRFc2NhcGVIYXRjaDogZmFsc2UsLy8gRmFzdEF1dG9wbGF5Rmlyc3RUcnkgc2lnbmFsIOKAlCBzZXQgd2hlbiBhIGJyZWFrIGNvbW1pdHMgYXV0b3BsYXkgdmlhIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZXNjYXBlIGhhdGNoLiBSZXNldCB3aGVuIGEgU291cmNlLXRpZXIgdHlwZSB3aW5zLgogICAgICAgICAgICBGYXN0QXV0b3BsYXlDb25zZWN1dGl2ZTogMCwvLyBDb3VudCBvZiBjb25zZWN1dGl2ZSBmYXN0LWF1dG9wbGF5IHdpbnMg4oCUIHRyaWdnZXJzIHBlcmlvZGljIHJlLXByb2JlIHRvIGNhdGNoIGNoYW5uZWwgcmVjb3ZlcnkuCiAgICAgICAgICAgIExhc3RQbGF5ZXJSZWxvYWQ6IDAsCiAgICAgICAgICAgIFJlbG9hZFRpbWVzdGFtcHM6IFtdLAogICAgICAgICAgICBIYXNDaGVja2VkVW5rbm93blRhZ3M6IGZhbHNlLAogICAgICAgICAgICBIYXNMb2dnZWRBZEF0dHJpYnV0ZXM6IGZhbHNlLAogICAgICAgICAgICBIYXNMb2dnZWRVbmtub3duU2lnbmlmaWVyczogZmFsc2UsCiAgICAgICAgICAgIExvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uOiBmYWxzZSwvLyBEZXRlY3Rpb24gZGlhZ25vc3RpYzogc2V0IHdoZW4gbTN1OCB0cmFuc2l0aW9ucyB0byBvZmZsaW5lLXNoYXBlIG1pZC1zZXNzaW9uLgogICAgICAgICAgICBDb25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlczogMCwvLyBEZXRlY3Rpb24gZGlhZ25vc3RpYzogY291bnRlciBmb3IgY29uc2VjdXRpdmUgZmFpbGVkIGFjY2Vzcy10b2tlbiBmZXRjaGVzIGFjcm9zcyBwbGF5ZXIgdHlwZXMuIExvZ2dlZCBhdCB0aHJlc2hvbGQsIHJlc2V0IG9uIHN1Y2Nlc3MuCiAgICAgICAgICAgIExvZ2dlZFRva2VuRmFpbHVyZVN0cmVhazogZmFsc2UsLy8gT25jZS1wZXItc3RyZWFrIGd1YXJkIGZvciB0aGUgdGhyZXNob2xkIGxvZy4KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gbWFza0FzTmF0aXZlKGZuLCBuYW1lKSB7CiAgICAgICAgZm4udG9TdHJpbmcgPSAoKSA9PiAnZnVuY3Rpb24gJyArIG5hbWUgKyAnKCkgeyBbbmF0aXZlIGNvZGVdIH0nOwogICAgICAgIHJldHVybiBmbjsKICAgIH0KICAgIGNvbnN0IGxvZ2dlZENzYWlUeXBlcyA9IG5ldyBTZXQoKTsKICAgIGxldCBpc0FjdGl2ZWx5U3RyaXBwaW5nQWRzID0gZmFsc2U7CiAgICBsZXQgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IGZhbHNlOwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgbGV0IGNhY2hlZFJvb3ROb2RlID0gbnVsbDsvLyBDYWNoZWQgI3Jvb3QgRE9NIGVsZW1lbnQgKG5ldmVyIGNoYW5nZXMgaW4gUmVhY3QgU1BBcykKICAgIGxldCBjYWNoZWRQbGF5ZXJSb290RGl2ID0gbnVsbDsvLyBDYWNoZWQgLnZpZGVvLXBsYXllciBlbGVtZW50CiAgICAvLyBPbmUtc2hvdCBmbGFncyBmb3Igb3ZlcmxheS1oaWRlIGxvZ3MuIFR3aXRjaCdzIFJlYWN0IHRyZWUgcmUtbW91bnRzIFNEQQogICAgLy8gd3JhcHBlcnMgYW5kIGFkLWJyZWFrIGNhcmRzIGNvbnN0YW50bHkgZHVyaW5nIGFuIGFkIGJyZWFrLCBzbyB0aGUKICAgIC8vIGhpZGUtYW5kLWxvZyBmaXJlcyBodW5kcmVkcyBvZiB0aW1lcy4gTG9nIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKICAgIC8vIGhpZGUgdHlwZSBwZXIgcGFnZSBsb2FkLCB0aGVuIHN0YXkgc2lsZW50IOKAlCB0aGUgaGlkZSBpdHNlbGYgc3RpbGwgcnVucwogICAgLy8gb24gZXZlcnkgdGljayB2aWEgZGF0YXNldC1iYXNlZCBkZWR1cC4KICAgIGxldCBsb2dnZWRTZGFIaWRlID0gZmFsc2U7CiAgICAvLyBTdHJpbmdzIHVzZWQgdG8gZGV0ZWN0IGFuZCBoYW5kbGUgY29uZmxpY3RpbmcgVHdpdGNoIHdvcmtlciBvdmVycmlkZXMgKGUuZy4gVHdpdGNoTm9TdWIpCiAgICBjb25zdCB3b3JrZXJTdHJpbmdDb25mbGljdHMgPSBbCiAgICAgICAgJ3R3aXRjaCcsCiAgICAgICAgJ2lzVmFyaWFudEEnLy8gVHdpdGNoTm9TdWIKICAgIF07CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICAvLyBXYWxrIHRoZSBXb3JrZXIgcHJvdG90eXBlIGNoYWluIGFuZCByZW1vdmUgY29uZmxpY3Rpbmcgb3ZlcnJpZGVzCiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGb3JlaWduIGV4dGVuc2lvbiBtYXkgaGF2ZSBmcm96ZW4gV29ya2VyLnByb3RvdHlwZTsgcGVyLWxpbmsgdHJ5LWNhdGNoLgogICAgICAgICAgICAgICAgICAgIHRyeSB7IE9iamVjdC5zZXRQcm90b3R5cGVPZihwYXJlbnQsIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAocm9vdCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJvb3QgPSBwcm90bzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBhcmVudCA9IHByb3RvOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod29ya2VyKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocHJvdG8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlaW5zZXJ0V29ya2Vycyh3b3JrZXIsIHJlaW5zZXJ0KSB7CiAgICAgICAgbGV0IHBhcmVudCA9IHdvcmtlcjsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlaW5zZXJ0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIFBlci1saW5rIHRyeS1jYXRjaDogZm9yZWlnbi1mcm96ZW4gZW50cnkgc2hvdWxkbid0IGFib3J0IHRoZSBjaGFpbi4KICAgICAgICAgICAgdHJ5IHsgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIHBhcmVudCA9IHJlaW5zZXJ0W2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyZW50OwogICAgfQogICAgZnVuY3Rpb24gaXNWYWxpZFdvcmtlcih3b3JrZXIpIHsKICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSB3b3JrZXIudG9TdHJpbmcoKTsKICAgICAgICBjb25zdCBoYXNDb25mbGljdCA9IHdvcmtlclN0cmluZ0NvbmZsaWN0cy5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGNvbnN0IGhhc1JlaW5zZXJ0ID0gd29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBpZiAoaGFzQ29uZmxpY3QgJiYgIWhhc1JlaW5zZXJ0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciByZWplY3RlZCDigJQgY29uZmxpY3Qgc3RyaW5nIGZvdW5kOiAnICsgd29ya2VyU3RyaW5nQ29uZmxpY3RzLmZpbHRlcigoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKS5qb2luKCcsICcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFoYXNDb25mbGljdCB8fCBoYXNSZWluc2VydDsKICAgIH0KICAgIC8vIFJlcGxhY2Ugd2luZG93LldvcmtlciB0byBpbnRlcmNlcHQgVHdpdGNoJ3MgdmlkZW8gd29ya2VyIGFuZCBpbmplY3QgYWQtYmxvY2tpbmcgbG9naWMKICAgIGxldCBpbmplY3RlZEJsb2JVcmwgPSBudWxsOwogICAgbGV0IG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgLy8gUHJldmVudCBUd2l0Y2ggZnJvbSByZXZva2luZyBvdXIgaW5qZWN0ZWQgd29ya2VyIGJsb2IgVVJMCiAgICAgICAgaWYgKCFVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkKSB7CiAgICAgICAgICAgIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gVVJMLnJldm9rZU9iamVjdFVSTDsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwgPT09IGluamVjdGVkQmxvYlVybCkgcmV0dXJuOwogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMLmNhbGwodGhpcywgdXJsKTsKICAgICAgICAgICAgfSwgJ3Jldm9rZU9iamVjdFVSTCcpOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVpbnNlcnQgPSBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod2luZG93Lldvcmtlcik7CiAgICAgICAgY29uc3QgY2xlYW5Xb3JrZXIgPSBnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIGNsZWFuV29ya2VyIHsKICAgICAgICAgICAgY29uc3RydWN0b3IodHdpdGNoQmxvYlVybCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgbGV0IGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gbmV3IFVSTCh0d2l0Y2hCbG9iVXJsKS5vcmlnaW4uZW5kc1dpdGgoJy50d2l0Y2gudHYnKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghaXNUd2l0Y2hXb3JrZXIpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBOb24tVHdpdGNoIHdvcmtlciBza2lwcGVkOiAnICsgdHdpdGNoQmxvYlVybCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUHJlLWNoZWNrOiB2ZXJpZnkgd2UgY2FuIGZldGNoIHRoZSB3b3JrZXIgSlMgYmVmb3JlIGluamVjdGluZwogICAgICAgICAgICAgICAgbGV0IHByZWZldGNoZWRXb3JrZXJKcyA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgeyBwcmVmZXRjaGVkV29ya2VySnMgPSBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghcHJlZmV0Y2hlZFdvcmtlckpzKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFpbGVkIHRvIGZldGNoIHdvcmtlciBKUyDigJQgZmFsbGluZyBiYWNrIHRvIHVubW9kaWZpZWQgd29ya2VyJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGludGVyY2VwdGVkIOKAlCBpbmplY3RpbmcgYWQtYmxvY2sgaG9va3MnKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ0ZldGNoUmVxdWVzdHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgJHtoYXNBZFRhZ3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldE1hdGNoZWRBZFNpZ25pZmllcnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke25vdGlmeUFkQ29tcGxldGUudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3N0cmlwQWRTZWdtZW50cy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJvY2Vzc00zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2hvb2tXb3JrZXJGZXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7ZGVjbGFyZU9wdGlvbnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldEFjY2Vzc1Rva2VuLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtncWxSZXF1ZXN0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwYXJzZUF0dHJpYnV0ZXMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFdhc21Xb3JrZXJKcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U2VydmVyVGltZUZyb21NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtyZXBsYWNlU2VydmVyVGltZUluTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJ1bmVTdHJlYW1JbmZvcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Y3JlYXRlU3RyZWFtSW5mby50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IGdldFdhc21Xb3JrZXJKcygnJHt0d2l0Y2hCbG9iVXJsLnJlcGxhY2VBbGwoIiciLCAiJTI3Iil9Jyk7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZU9wdGlvbnMoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCA9IHNldEludGVydmFsKHBydW5lU3RyZWFtSW5mb3MsIDUgKiA2MCAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJHtSZWxvYWRQbGF5ZXJBZnRlckFkfTsKICAgICAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSAke1JlbG9hZENvb2xkb3duU2Vjb25kc307CiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9ICR7RGlzYWJsZVJlbG9hZENhcH07CiAgICAgICAgICAgICAgICAgICAgRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gJHtFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGR9OwogICAgICAgICAgICAgICAgICAgIFBpbkJhY2t1cFBsYXllclR5cGUgPSAke1BpbkJhY2t1cFBsYXllclR5cGV9OwogICAgICAgICAgICAgICAgICAgIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPSAke1ByZWZlckxvd1F1YWxpdHlCYWNrdXB9OwogICAgICAgICAgICAgICAgICAgIEZhc3RBdXRvcGxheUZpcnN0VHJ5ID0gJHtGYXN0QXV0b3BsYXlGaXJzdFRyeX07CiAgICAgICAgICAgICAgICAgICAgQmFja3VwU3dhcEZpcnN0ID0gJHtCYWNrdXBTd2FwRmlyc3R9OwogICAgICAgICAgICAgICAgICAgIERpc2FibGVBZFNwb29maW5nID0gJHtEaXNhYmxlQWRTcG9vZmluZ307CiAgICAgICAgICAgICAgICAgICAgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgPSAnJHtGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZX0nOwogICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gJHtHUUxEZXZpY2VJRCA/ICInIiArIEdRTERldmljZUlEICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9ICR7QXV0aG9yaXphdGlvbkhlYWRlciA/ICInIiArIEF1dGhvcml6YXRpb25IZWFkZXIgKyAiJyIgOiB1bmRlZmluZWR9OwogICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9ICR7Q2xpZW50SW50ZWdyaXR5SGVhZGVyID8gIiciICsgQ2xpZW50SW50ZWdyaXR5SGVhZGVyICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQ2xpZW50VmVyc2lvbiA9ICR7Q2xpZW50VmVyc2lvbiA/ICInIiArIENsaWVudFZlcnNpb24gKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gJHtDbGllbnRTZXNzaW9uID8gIiciICsgQ2xpZW50U2Vzc2lvbiArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudFZlcnNpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudFNlc3Npb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudElkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SUQgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlRGV2aWNlSWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRmV0Y2hSZXNwb25zZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVzcG9uc2VEYXRhLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCB0aW1lb3V0SWQgfSA9IHBlbmRpbmdGZXRjaFJlcXVlc3RzLmdldChyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXNwb25zZURhdGEuZXJyb3IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcmVzcG9uc2UgZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSB0YWtlcyBzdGF0dXMvc3RhdHVzVGV4dC9oZWFkZXJzIOKAlCB1cmwvcmVkaXJlY3RlZC90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UuIElWUyBXQVNNIHZhbGlkYXRlcyB0aGVzZSAoU3BhZGUvdHJhY2tpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMpIGFuZCB0aHJvd3MgTmV0d29ya0Vycm9yIGlmIHRoZXkncmUgbWlzc2luZyDigJQgVFRWLUFCIHY2LjMuNSBmaXguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHJlc3BvbnNlRGF0YS5ib2R5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlRGF0YS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZURhdGEuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlRGF0YS5oZWFkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2VEYXRhLnVybCB8fCAnJywgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAncmVkaXJlY3RlZCcsIHsgdmFsdWU6ICEhcmVzcG9uc2VEYXRhLnJlZGlyZWN0ZWQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNwb25zZSwgJ3R5cGUnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudHlwZSB8fCAnYmFzaWMnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1RyaWdnZXJlZFBsYXllclJlbG9hZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUmVsb2FkU2tpcHBlZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1haW4gdGhyZWFkIHJlZnVzZWQgdGhlIHJlbG9hZCAocGxheWVyIGhlYWx0aHkpIOKAlCBjbGVhciBlYXJseS1yZWxvYWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWdzIHNvIHdlIGNhbiByZS1maXJlIGlmIHRoZSBwbGF5ZXIgbGF0ZXIgc3RhbGxzLiBXaXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFYXJseVJlbG9hZFRyaWdnZXJlZCAvIEVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgc3RheSBzZXQgYWZ0ZXIgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhbHRoeS1za2lwLCBibG9ja2luZyBzdWJzZXF1ZW50IGVhcmx5LXJlbG9hZCBmaXJpbmdzIGluIHRoZSBicmVhay4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbGVhcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgaW4gU3RyZWFtSW5mb3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaSA9IFN0cmVhbUluZm9zW2NoYW5uZWxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaSAmJiBzaS5FYXJseVJlbG9hZFRyaWdnZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaS5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaS5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpLkVhcmx5UmVsb2FkQ291bnQgPSBNYXRoLm1heCgwLCAoc2kuRWFybHlSZWxvYWRDb3VudCB8fCAwKSAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFJlbG9hZCBza2lwcGVkIGJ5IG1haW4gdGhyZWFkIChwbGF5ZXIgaGVhbHRoeSkg4oCUIGVhcmx5IHJlbG9hZCBzdGF0ZSBjbGVhcmVkLCBjYW4gcmV0cnknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdTaW11bGF0ZUFkcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRlZEFkc0RlcHRoID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpbXVsYXRlZEFkc0RlcHRoOiAnICsgU2ltdWxhdGVkQWRzRGVwdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyA9ICFBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOiAnICsgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGhvb2tXb3JrZXJGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgIC8vIEd1YXJkIHRoZSBldmFsIOKAlCBtYWxmb3JtZWQgd29ya2VyU3RyaW5nIHNob3VsZG4ndCBzaWxlbnRseSBicmVhawogICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCdzIHBsYXllciBsb2dpYyB3aXRob3V0IGEgZGlhZ25vc3RpYy4KICAgICAgICAgICAgICAgICAgICB0cnkgeyBldmFsKHdvcmtlclN0cmluZyk7IH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignW0FEIERFQlVHXSBXb3JrZXIgZXZhbCBmYWlsZWQg4oCUIFR3aXRjaCBwbGF5ZXIgbG9naWMgbm90IGxvYWRlZDonLCBlKTsgfQogICAgICAgICAgICAgICAgYDsKICAgICAgICAgICAgICAgIGlmIChpbmplY3RlZEJsb2JVcmwgJiYgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBvcmlnaW5hbFJldm9rZU9iamVjdFVSTC5jYWxsKFVSTCwgaW5qZWN0ZWRCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBZEJsb2NrQmFubmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyKGUuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIGJhY2t1cCBzdHJlYW0gc3dpdGNoZXMgKHN0YXJ0IGFuZCBlbmQgb2YgYWQgYnJlYWspCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuaGFzQWRzICE9PSAhIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHBvc2l0aW9uIHRyYWNraW5nIG9uIGFkLWVuZCBzbyB0aGUgc3RyZWFtIHN3aXRjaCBnYXAgaXNuJ3QgZGV0ZWN0ZWQgYXMgYSBqdW1wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuZGF0YS5oYXNBZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrID0gISFlLmRhdGEuaGFzQWRzOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBkcmlmdCBjYXRjaC11cCB3aGVuIGFkcyBzdGFydCDigJQgZG9uJ3QgcnVuIDEuMXggZHVyaW5nIGFkIGhhbmRsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuaGFzQWRzICYmIChkcmlmdENhdGNoVXBJbnRlcnZhbCB8fCBkcmlmdENhdGNoVXBUaW1lb3V0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmlmdENhdGNoVXBUaW1lb3V0KSB7IGNsZWFyVGltZW91dChkcmlmdENhdGNoVXBUaW1lb3V0KTsgZHJpZnRDYXRjaFVwVGltZW91dCA9IG51bGw7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykucGxheWJhY2tSYXRlID0gMS4wOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1BhdXNlUmVzdW1lUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBkb1R3aXRjaFBsYXllclRhc2sodHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUsIGUuZGF0YS5raW5kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5rZXkgPT0gJ0ZldGNoUmVxdWVzdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hSZXF1ZXN0ID0gZXZlbnQuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gV29ya2VyIGNyYXNoIHJlY292ZXJ5IOKAlCBJVlMgV0FTTSB3b3JrZXIgY2FuIGZpcmUgUnVudGltZUVycm9yCiAgICAgICAgICAgICAgICAvLyAoZS5nLiAiaW5kZXggb3V0IG9mIGJvdW5kcyIpIGFuZCBkaWUuIEEgc2luZ2xlIGNyYXNoIGZpcmVzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAvLyBlcnJvciBldmVudHM7IGRlZHVwZSB2aWEgYSBsb2NhbCBmbGFnLiBPbiBmaXJzdCBlcnJvciwgdHJpZ2dlciBhCiAgICAgICAgICAgICAgICAvLyBoYXJkIHJlbG9hZCB2aWEgdGhlIG1haW4gcmVsb2FkIHBhdGgg4oCUIFR3aXRjaCByZS1zcGF3bnMgdGhlIHdvcmtlcgogICAgICAgICAgICAgICAgLy8gYXMgcGFydCBvZiB0aGUgbmV3IHBsYXllciBpbnN0YW5jZSwgYW5kIGV4aXN0aW5nIHJlbG9hZCBjb29sZG93bgogICAgICAgICAgICAgICAgLy8gcHJldmVudHMgcnVuYXdheSByZXN0YXJ0IGxvb3BzLgogICAgICAgICAgICAgICAgbGV0IGNyYXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChjcmFzaGVkKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY3Jhc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSVZTIFdBU00gd29ya2VyIGNyYXNoZWQ6ICcgKyAoKGUgJiYgZS5tZXNzYWdlKSB8fCAndW5rbm93biBlcnJvcicpICsgJyDigJQgdHJpZ2dlcmluZyBoYXJkIHJlbG9hZCB0byByZWNvdmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZG9Ud2l0Y2hQbGF5ZXJUYXNrKGZhbHNlLCB0cnVlLCAnZWFybHknKTsgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBjcmFzaCByZWNvdmVyeSBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGxldCB3b3JrZXJJbnN0YW5jZSA9IHJlaW5zZXJ0V29ya2VycyhuZXdXb3JrZXIsIHJlaW5zZXJ0KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnV29ya2VyJywgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlckluc3RhbmNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFdvcmtlcih2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB3b3JrZXJJbnN0YW5jZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQXR0ZW1wdCB0byBzZXQgdHdpdGNoIHdvcmtlciBkZW5pZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbVdvcmtlckpzKHR3aXRjaEJsb2JVcmwpIHsKICAgICAgICBpZiAoIWdldFdhc21Xb3JrZXJKcy5jYWNoZSkgewogICAgICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF07CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJlcS5vcGVuKCdHRVQnLCB0d2l0Y2hCbG9iVXJsLCBmYWxzZSk7CiAgICAgICAgcmVxLm92ZXJyaWRlTWltZVR5cGUoInRleHQvamF2YXNjcmlwdCIpOwogICAgICAgIHJlcS5zZW5kKCk7CiAgICAgICAgY29uc3QgdGV4dCA9IHJlcS5yZXNwb25zZVRleHQ7CiAgICAgICAgZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdID0gdGV4dDsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIC8vIEhvb2sgZmV0Y2goKSBpbiB0aGUgd29ya2VyIHNjb3BlIHRvIGludGVyY2VwdCBtM3U4IHBsYXlsaXN0IHJlcXVlc3RzIGFuZCBhZCBzZWdtZW50cwogICAgZnVuY3Rpb24gaG9va1dvcmtlckZldGNoKCkgewogICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIGhvb2tXb3JrZXJGZXRjaCAodmFmdCknKTsKICAgICAgICBjb25zdCBCTEFOS19NUDQgPSBuZXcgQmxvYihbVWludDhBcnJheS5mcm9tKGF0b2IoJ0FBQUFLR1owZVhCdGNEUXlBQUFBQVdsemIyMXRjRFF5WkdGemFHRjJZekZwYzI4MmFHeHpaZ0FBQkVsdGIyOTJBQUFBYkcxMmFHUUFBQUFBQUFBQUFBQUFBQUFBQVlhZ0FBQUFBQUFCQUFBQkFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUFCcUhSeVlXc0FBQUJjZEd0b1pBQUFBQU1BQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQVVSdFpHbGhBQUFBSUcxa2FHUUFBQUFBQUFBQUFBQUFBQUFBQUx1QUFBQUFBRlhFQUFBQUFBQXRhR1JzY2dBQUFBQUFBQUFBYzI5MWJnQUFBQUFBQUFBQUFBQUFBRk52ZFc1a1NHRnVaR3hsY2dBQUFBRHZiV2x1WmdBQUFCQnpiV2hrQUFBQUFBQUFBQUFBQUFBa1pHbHVaZ0FBQUJ4a2NtVm1BQUFBQUFBQUFBRUFBQUFNZFhKc0lBQUFBQUVBQUFDemMzUmliQUFBQUdkemRITmtBQUFBQUFBQUFBRUFBQUJYYlhBMFlRQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFnQVFBQUFBQUx1QUFBQUFBQUF6WlhOa2N3QUFBQUFEZ0lDQUlnQUJBQVNBZ0lBVVFCVUFBQUFBQUFBQUFBQUFBQVdBZ0lBQ0VaQUdnSUNBQVFJQUFBQVFjM1IwY3dBQUFBQUFBQUFBQUFBQUVITjBjMk1BQUFBQUFBQUFBQUFBQUJSemRITjZBQUFBQUFBQUFBQUFBQUFBQUFBQUVITjBZMjhBQUFBQUFBQUFBQUFBQWVWMGNtRnJBQUFBWEhScmFHUUFBQUFEQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQW9BQUFBRm9BQUFBQUFHQmJXUnBZUUFBQUNCdFpHaGtBQUFBQUFBQUFBQUFBQUFBQUE5Q1FBQUFBQUJWeEFBQUFBQUFMV2hrYkhJQUFBQUFBQUFBQUhacFpHVUFBQUFBQUFBQUFBQUFBQUJXYVdSbGIwaGhibVJzWlhJQUFBQUJMRzFwYm1ZQUFBQVVkbTFvWkFBQUFBRUFBQUFBQUFBQUFBQUFBQ1JrYVc1bUFBQUFIR1J5WldZQUFBQUFBQUFBQVFBQUFBeDFjbXdnQUFBQUFRQUFBT3h6ZEdKc0FBQUFvSE4wYzJRQUFBQUFBQUFBQVFBQUFKQmhkbU14QUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0FCYUFCSUFBQUFTQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdQLy9BQUFBT21GMlkwTUJUVUFlLytFQUkyZE5RQjZXVW9GQVgvTGdMVUJBUUZBQUFENkFBQTZtRGdBQUhvUUFBOUNXN3k0S0FRQUVhT3VQSUFBQUFCQnpkSFJ6QUFBQUFBQUFBQUFBQUFBUWMzUnpZd0FBQUFBQUFBQUFBQUFBRkhOMGMzb0FBQUFBQUFBQUFBQUFBQUFBQUFBUWMzUmpid0FBQUFBQUFBQUFBQUFBU0cxMlpYZ0FBQUFnZEhKbGVBQUFBQUFBQUFBQkFBQUFBUUFBQUM0QUFBQUFBb0FBQUFBQUFDQjBjbVY0QUFBQUFBQUFBQUlBQUFBQkFBQ0NOUUFBQUFBQ1FBQUEnKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpXSwge3R5cGU6ICd2aWRlby9tcDQnfSk7CiAgICAgICAgY29uc3QgcmVhbEZldGNoID0gZmV0Y2g7CiAgICAgICAgZmV0Y2ggPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuaGFzKHVybCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEJMQU5LX01QNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgnbTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSBhc3luYyBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYXdhaXQgcHJvY2Vzc00zVTgodXJsLCBhd2FpdCByZXNwb25zZS50ZXh0KCksIHJlYWxGZXRjaCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcnNlZFVybC5wYXRobmFtZS5tYXRjaCgvKFteXC9dKykoPz1cLlx3KyQpLyk/LlswXTsKICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ3BhcmVudF9kb21haW5zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlZFVybC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyVGltZSA9IGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCAhPSBudWxsICYmIChhd2FpdCByZWFsRmV0Y2goc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Lm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF0pKS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGVuY29kaW5ncyBhcmUgZGVhZCAodGhlIHN0cmVhbSBwcm9iYWJseSByZXN0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHJlbG9hZC1wZW5kaW5nIGZsYWcgZnJvbSBhIHByaW9yIHN0cmVhbSBzZXNzaW9uIOKAlCB3aXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVsb2FkIHRyaWdnZXJlZCBvbiB0aGUgcHJldmlvdXMgY2hhbm5lbCBibGVlZHMgaW50byB0aGUgbmV3IGNoYW5uZWwncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29sZG93biBjYWxjdWxhdGlvbiwgYmxvY2tpbmcgbGVnaXRpbWF0ZSBlbmQtb2YtYnJlYWsgcmVsb2Fkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5ldyBzdHJlYW0gc2Vzc2lvbiDigJQgY2hhbm5lbDogJyArIGNoYW5uZWxOYW1lICsgJywgQVBJOiAnICsgKFYyQVBJID8gJ3YyJyA6ICd2MScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdID0gc3RyZWFtSW5mbyA9IGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHBhcnNlZFVybC5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBsaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmF0ZTogYXR0cmlidXRlc1snRlJBTUUtUkFURSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNzOiBhdHRyaWJ1dGVzWydDT0RFQ1MnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFVRElPL1ZJREVPL1NVQlRJVExFUyBncm91cHMgY29waWVkIG9udG8gdGhlIHJld3JpdHRlbiBTVFJFQU0tSU5GIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmluZyBIRVZD4oaSQVZDIGZhbGxiYWNrIChUVFYtQUIgdjYuNy41IHBhcnNlciBmaXgpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW86IGF0dHJpYnV0ZXNbJ0FVRElPJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbzogYXR0cmlidXRlc1snVklERU8nXSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnRpdGxlczogYXR0cmlidXRlc1snU1VCVElUTEVTJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmw6IGxpbmVzW2kgKyAxXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHNbbGluZXNbaSArIDFdXSA9IHJlc29sdXRpb25JbmZvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LnB1c2gocmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc0J5VXJsW2xpbmVzW2kgKyAxXV0gPSBzdHJlYW1JbmZvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gcmVzb2x1dGlvbnMgcGFyc2VkIGZyb20gZW5jb2RpbmdzIG0zdTgg4oCUIFR3aXRjaCBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBmb3JtYXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub25IZXZjUmVzb2x1dGlvbkxpc3QgPSBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudC5Db2RlY3Muc3RhcnRzV2l0aCgnYXZjJykgfHwgZWxlbWVudC5Db2RlY3Muc3RhcnRzV2l0aCgnYXYwJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWx3YXlzUmVsb2FkUGxheWVyT25BZCB8fCAobm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aCA+IDAgJiYgc3RyZWFtSW5mby5SZXNvbHV0aW9uTGlzdC5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdoZXYnKSB8fCBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdodmMnKSkgJiYgIVNraXBQbGF5ZXJSZWxvYWRPbkhldmMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyID0gKGxpbmUsIGtleSwgdmFsdWUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCAhdmFsdWUpIHJldHVybiBsaW5lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWQgPSB2YWx1ZS5yZXBsYWNlKC9cXC9nLCAnXFxcXCcpLnJlcGxhY2UoLyIvZywgJ1xcIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBrZXkgKyAnPSInICsgZXNjYXBlZCArICciJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCgnKF58LCknICsga2V5ICsgJz0oIlteIl0qInxbXixdKiknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KGxpbmUpID8gbGluZS5yZXBsYWNlKHBhdHRlcm4sICckMScgKyBuZXh0KSA6IGxpbmUgKyAnLCcgKyBuZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXS5zdWJzdHJpbmcobGluZXNbaV0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkUmVzb2x1dGlvbiA9IHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gb2xkUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEFyZWEgPSB0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UmVzb2x1dGlvbkluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZXN0RGlmZiA9IEluZmluaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vbkhldmNSZXNvbHV0aW9uTGlzdFtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3N0cmVhbVdpZHRoLCBzdHJlYW1IZWlnaHRdID0gY2FuZGlkYXRlLlJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKChzdHJlYW1XaWR0aCAqIHN0cmVhbUhlaWdodCkgLSB0YXJnZXRBcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpZmYgPSBkaWZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVzb2x1dGlvbkluZm8gPSBjYW5kaWRhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZGlmaWVkTTNVOCBzd2FwICcgKyByZXNTZXR0aW5nc1tjb2RlY3NLZXldICsgJyB0byAnICsgbmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzICsgJyBvbGRSZXM6JyArIG9sZFJlc29sdXRpb24gKyAnIG5ld1JlczonICsgbmV3UmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzfSJgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IEFVRElPL1ZJREVPL1NVQlRJVExFUyBncm91cHMgKFRUVi1BQiB2Ni43LjUgcGFyc2VyIGZpeCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyKGxpbmVzW2ldLCAnQVVESU8nLCBuZXdSZXNvbHV0aW9uSW5mby5BdWRpbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyKGxpbmVzW2ldLCAnVklERU8nLCBuZXdSZXNvbHV0aW9uSW5mby5WaWRlbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyKGxpbmVzW2ldLCAnU1VCVElUTEVTJywgbmV3UmVzb2x1dGlvbkluZm8uU3VidGl0bGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpICsgMV0gPSBuZXdSZXNvbHV0aW9uSW5mby5VcmwgKyAnICcucmVwZWF0KGkgKyAxKTsvLyBUaGUgc3RyZWFtIGRvZXNuJ3QgbG9hZCB1bmxlc3MgZWFjaCB1cmwgbGluZSBpcyB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCB8fCBBbHdheXNSZWxvYWRQbGF5ZXJPbkFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggPSBsaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZG8gTk9UIHNldCBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgaGVyZS4gSXQgd2FzIHByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdW5jb25kaXRpb25hbGx5IG9uIG5ldyBzdHJlYW0gc2Vzc2lvbiBjcmVhdGlvbiwgd2hpY2ggY2F1c2VkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVuZC1vZi1icmVhayByZWxvYWQgb2YgZXZlcnkgbmV3IGNoYW5uZWwgdG8gYmUgYmxvY2tlZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb2xkb3duIOKAlCB0aGUgY29vbGRvd24gY2hlY2sgdHJlYXRlZCB0aGUgc2Vzc2lvbi1jcmVhdGlvbiB0aW1lc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHJlY2VudCByZWxvYWQsIGV2ZW4gdGhvdWdoIG5vIHJlbG9hZCBoYWQgYWN0dWFsbHkgb2NjdXJyZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID8gc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggOiBzdHJlYW1JbmZvLkVuY29kaW5nc00zVTgsIHNlcnZlclRpbWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXIocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC8jRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKFteIl0rKSIvKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAxID8gbWF0Y2hlc1sxXSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC9TRVJWRVItVElNRT0iKFswLTkuXSspIi8pOwogICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gcmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoZW5jb2RpbmdzTTN1OCwgbmV3U2VydmVyVGltZSkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKCNFWFQtWC1TRVNTSU9OLURBVEE6REFUQS1JRD0iU0VSVkVSLVRJTUUiLFZBTFVFPSIpW14iXSsoIikvLCBgJDEke25ld1NlcnZlclRpbWV9JDJgKSA6IGVuY29kaW5nc00zdTg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTZXJ2ZXJUaW1lID8gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKC8oU0VSVkVSLVRJTUU9IilbMC05Ll0rIi8sIGBTRVJWRVItVElNRT0iJHtuZXdTZXJ2ZXJUaW1lfSJgKSA6IGVuY29kaW5nc00zdTg7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBZFNpZ25pZmllcnMuc29tZSgocykgPT4gcyAmJiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIC8vIFNwb29mIGFkIGNvbXBsZXRpb24gdG8gVHdpdGNoJ3MgR1FMIGVuZHBvaW50IHdoZW4gYW4gYWQgYnJlYWsgaXMgZGV0ZWN0ZWQuCiAgICAvLyBNaW1pY3MgdGhlIGltcHJlc3Npb24vcXVhcnRpbGUvcG9kLWNvbXBsZXRlIGJlYWNvbnMgVHdpdGNoJ3MgcGxheWVyIHdvdWxkIGhhdmUgc2VudAogICAgLy8gaWYgdGhlIGFkIGFjdHVhbGx5IHBsYXllZC4gTWF5IHJlZHVjZSBkZXRlY3Rpb24gZXNjYWxhdGlvbi4KICAgIGZ1bmN0aW9uIG5vdGlmeUFkQ29tcGxldGUodGV4dFN0ciwgc3RyZWFtSW5mbykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIFR3aXRjaCByZXZlYWxzIGVhY2ggYWQncyBEQVRFUkFOR0Ugb25seSBhcyB0aGF0IGFkIHN0YXJ0cywgc28gbXVsdGktYWQKICAgICAgICAgICAgLy8gcG9kcyBzdXJmYWNlIG9uZSBhZCBwZXIgcG9sbC4gQ2FsbGVkIGV2ZXJ5IGFkLWxhZGVuIHBvbGw7IFNwb29mZWRBZElkcwogICAgICAgICAgICAvLyBkZWR1cHMgYWNyb3NzIHBvbGxzIHNvIGVhY2ggYWQgaXMgc3Bvb2ZlZCBvbmNlIChmdWxsIE4vTiBwb2QgY292ZXJhZ2UpLgogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gWy4uLnRleHRTdHIubWF0Y2hBbGwoLyNFWFQtWC1EQVRFUkFOR0U6KElEPSJzdGl0Y2hlZC1hZC1bXlxuXSspXG4vZyldOwogICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIGlmICghbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWROb01hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWROb01hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlUmFuZ2VMaW5lID0gdGV4dFN0ci5tYXRjaCgvI0VYVC1YLURBVEVSQU5HRTpbXlxuXXswLDIwMH0vKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBub3RpZnlBZENvbXBsZXRlOiBubyBzdGl0Y2hlZC1hZCBEQVRFUkFOR0UgbWF0Y2guIFNhbXBsZSBEQVRFUkFOR0U6ICcgKyAoZGF0ZVJhbmdlTGluZSA/IGRhdGVSYW5nZUxpbmVbMF0gOiAnbm9uZSBmb3VuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzcG9vZmVkU2V0ID0gKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5TcG9vZmVkQWRJZHMpIHx8IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHBvZExlbk1hdGNoID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQUQtUE9ELUxFTkdUSD0iKFxkKykiLyk7CiAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aCA9IHBvZExlbk1hdGNoID8gcGFyc2VJbnQocG9kTGVuTWF0Y2hbMV0sIDEwKSA6IG1hdGNoZXMubGVuZ3RoOwogICAgICAgICAgICAvLyBIb3QtcGF0aCBlYXJseS1vdXQ6IHNwb29mIHJ1bnMgZXZlcnkgYWQtbGFkZW4gcG9sbDsgb25jZSB0aGUgZGVkdXAgc2V0CiAgICAgICAgICAgIC8vIGNvdmVycyB0aGUgcG9kLCBldmVyeSByZW1haW5pbmcgcG9sbCBpcyBwdXJlIHdhc3RlIOKAlCBiYWlsIGJlZm9yZSB0aGUgbG9vcC4KICAgICAgICAgICAgaWYgKHNwb29mZWRTZXQgJiYgc3Bvb2ZlZFNldC5zaXplID49IHBvZExlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBuZXdTcG9vZmVkID0gMDsKICAgICAgICAgICAgbGV0IGZpcnN0Um9sbFR5cGUgPSAnJzsKICAgICAgICAgICAgbGV0IHBvZENvbXBsZXRlU2VudCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIENoZWFwIElEIHByZS1leHRyYWN0IOKAlCBkZWR1cC1jaGVjayBiZWZvcmUgdGhlIGZ1bGwgcGFyc2VBdHRyaWJ1dGVzKCkKICAgICAgICAgICAgICAgIC8vIHNvIGFscmVhZHktc3Bvb2ZlZCBhZHMgYXJlbid0IHJlLXBhcnNlZCBldmVyeSBwb2xsLgogICAgICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IG1hdGNoZXNbaV1bMV0ubWF0Y2goL15JRD0iKFteIl0rKSIvKTsKICAgICAgICAgICAgICAgIGNvbnN0IHN0aXRjaGVkQWRJZCA9IGlkTWF0Y2ggPyBpZE1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICAvLyBNdWx0aS1wb2xsIGRlZHVwOiBza2lwIGFkcyBhbHJlYWR5IHNwb29mZWQgZWFybGllciB0aGlzIGJyZWFrLgogICAgICAgICAgICAgICAgaWYgKHNwb29mZWRTZXQgJiYgc3RpdGNoZWRBZElkICYmIHNwb29mZWRTZXQuaGFzKHN0aXRjaGVkQWRJZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBwYXJzZUF0dHJpYnV0ZXMobWF0Y2hlc1tpXVsxXSk7CiAgICAgICAgICAgICAgICBjb25zdCByYWRUb2tlbiA9IGF0dHJbJ1gtVFYtVFdJVENILUFELVJBRFMtVE9LRU4nXTsKICAgICAgICAgICAgICAgIGlmICghcmFkVG9rZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiAhbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWROb1Rva2VuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUFkQ29tcGxldGUubG9nZ2VkTm9Ub2tlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIG5vdGlmeUFkQ29tcGxldGU6IG1hdGNoZWQgREFURVJBTkdFIGJ1dCBubyBSQURTIHRva2VuLiBBdHRyaWJ1dGVzOiAnICsgT2JqZWN0LmtleXMoYXR0cikuam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgcm9sbFR5cGUgPSAoYXR0clsnWC1UVi1UV0lUQ0gtQUQtUk9MTC1UWVBFJ10gfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Um9sbFR5cGUpIGZpcnN0Um9sbFR5cGUgPSByb2xsVHlwZTsKICAgICAgICAgICAgICAgIGNvbnN0IGFkUG9zaXRpb24gPSBwYXJzZUludChhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtUE9TSVRJT04nXSB8fCBTdHJpbmcoaSksIDEwKTsKICAgICAgICAgICAgICAgIC8vIFBheWxvYWQgY29uc2lzdGVudCB3aXRoIHRoZSAid2F0Y2hlZC10by1jb21wbGV0aW9uIiBldmVudHMgd2UgY2xhaW06CiAgICAgICAgICAgICAgICAvLyBhdWRpby1vbiwgdmlzaWJsZSwgZnVsbCBkdXJhdGlvbi4gTWlzbWF0Y2hlZCBmaWVsZHMgKG11dGU9dHJ1ZSAvIHZvbHVtZT0wIC8KICAgICAgICAgICAgICAgIC8vIHZpc2libGU9ZmFsc2UgLyBkdXJhdGlvbj0wKSB3b3VsZCBiZSBvYnZpb3VzIGNyb3NzLXZhbGlkYXRpb24gZmxhZ3MuCiAgICAgICAgICAgICAgICBjb25zdCBhZER1cmF0aW9uID0gcGFyc2VJbnQoYXR0clsnWC1UVi1UV0lUQ0gtQUQtRFVSQVRJT04nXSB8fCAnMCcsIDEwKSB8fCAwOwogICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsKICAgICAgICAgICAgICAgICAgICBzdGl0Y2hlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBhZF9pZDogc3RpdGNoZWRBZElkLAogICAgICAgICAgICAgICAgICAgIHJvbGxfdHlwZTogcm9sbFR5cGUsCiAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVfaWQ6IGF0dHJbJ1gtVFYtVFdJVENILUFELUNSRUFUSVZFLUlEJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQ6IGF0dHJbJ1gtVFYtVFdJVENILUFELU9SREVSLUlEJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgbGluZV9pdGVtX2lkOiBhdHRyWydYLVRWLVRXSVRDSC1BRC1MSU5FLUlURU0tSUQnXSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfbXV0ZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgcGxheWVyX3ZvbHVtZTogMS4wLAogICAgICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGFkRHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgYWRfcG9zaXRpb246IGFkUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgdG90YWxfYWRzOiBwb2RMZW5ndGgKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyBCYXRjaCBhbGwgNiBldmVudHMgaW50byBvbmUgR1FMIFBPU1Qg4oCUIFR3aXRjaCBzdXBwb3J0cyBhcnJheS1iYXRjaGVkCiAgICAgICAgICAgICAgICAvLyBvcGVyYXRpb25zIG5hdGl2ZWx5LiBSZWR1Y2VzIHJlcXVlc3QgY291bnQgNsOXIGFuZCBhdm9pZHMgdGhlIGJvdC1saWtlCiAgICAgICAgICAgICAgICAvLyBmaW5nZXJwcmludCBvZiBmaXJpbmcgNiBzZXBhcmF0ZSByZXF1ZXN0cyBhdCBhZC1kZXRlY3QuCiAgICAgICAgICAgICAgICBjb25zdCBtYWtlUGFja2V0ID0gKGV2ZW50LCBleHRyYSkgPT4gKHsKICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnQ2xpZW50U2lkZUFkRXZlbnRIYW5kbGluZ19SZWNvcmRBZEV2ZW50JywKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHsgaW5wdXQ6IHsgZXZlbnROYW1lOiBldmVudCwgZXZlbnRQYXlsb2FkOiBKU09OLnN0cmluZ2lmeSh7IC4uLnBheWxvYWQsIC4uLmV4dHJhIH0pLCByYWRUb2tlbiB9IH0sCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogeyBwZXJzaXN0ZWRRdWVyeTogeyB2ZXJzaW9uOiAxLCBzaGEyNTZIYXNoOiAnN2U2YzY5ZTZlYjU5ZjhjY2I5N2FiNzM2ODZmM2Q4YjdkODVhNzJhMDI5ODc0NWNjZDhiZmM2OGU0MDU0Y2E1YicgfSB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIE1hcmsgc3Bvb2ZlZCBiZWZvcmUgYnVpbGRpbmcgYmF0Y2ggc28gdGhlIHBvZC1jb21wbGV0ZSBzaXplIGNoZWNrIGlzIGFjY3VyYXRlLgogICAgICAgICAgICAgICAgaWYgKHNwb29mZWRTZXQgJiYgc3RpdGNoZWRBZElkKSBzcG9vZmVkU2V0LmFkZChzdGl0Y2hlZEFkSWQpOwogICAgICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBbCiAgICAgICAgICAgICAgICAgICAgbWFrZVBhY2tldCgndmlkZW9fYWRfaW1wcmVzc2lvbicpLAogICAgICAgICAgICAgICAgICAgIG1ha2VQYWNrZXQoJ3ZpZGVvX2FkX3F1YXJ0aWxlX2NvbXBsZXRlJywgeyBxdWFydGlsZTogMSB9KSwKICAgICAgICAgICAgICAgICAgICBtYWtlUGFja2V0KCd2aWRlb19hZF9xdWFydGlsZV9jb21wbGV0ZScsIHsgcXVhcnRpbGU6IDIgfSksCiAgICAgICAgICAgICAgICAgICAgbWFrZVBhY2tldCgndmlkZW9fYWRfcXVhcnRpbGVfY29tcGxldGUnLCB7IHF1YXJ0aWxlOiAzIH0pLAogICAgICAgICAgICAgICAgICAgIG1ha2VQYWNrZXQoJ3ZpZGVvX2FkX3F1YXJ0aWxlX2NvbXBsZXRlJywgeyBxdWFydGlsZTogNCB9KSwKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAvLyBwb2RfY29tcGxldGUgb25jZSBwZXIgcG9kIChub3QgcGVyIGFkKSDigJQgYXR0YWNoZWQgdG8gdGhlIGFkIHRoYXQKICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlcyB0aGUgdHJ1ZSBwb2Qgc2l6ZS4gUGVyLWFkIHBvZF9jb21wbGV0ZSAoNsOXIGZvciBhIDYtYWQgcG9kKQogICAgICAgICAgICAgICAgLy8gaXMgaXRzZWxmIGEgZmluZ2VycHJpbnQuIERlZmVuc2l2ZSBmYWxsYmFjayAobm8gZGVkdXAgc2V0KTogcGVyLWFkLgogICAgICAgICAgICAgICAgaWYgKCFzcG9vZmVkU2V0IHx8IHNwb29mZWRTZXQuc2l6ZSA9PT0gcG9kTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaChtYWtlUGFja2V0KCd2aWRlb19hZF9wb2RfY29tcGxldGUnKSk7CiAgICAgICAgICAgICAgICAgICAgcG9kQ29tcGxldGVTZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFN1cnZlaWwgR1FMIHJlc3BvbnNlIHN0YXR1cyDigJQgbm9uLTIwMCBtZWFucyBUd2l0Y2ggcmVqZWN0ZWQgdGhlIHNwb29mCiAgICAgICAgICAgICAgICAvLyAoNDAwLzQwMy80MjkpLiBPbmNlLXBlci1zZXNzaW9uIGd1YXJkIGF2b2lkcyBsb2cgc3BhbS4KICAgICAgICAgICAgICAgIGdxbFJlcXVlc3QoYmF0Y2gpLnRoZW4ocmVzcG9uc2UgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXMgIT09IDIwMCAmJiAhbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWRCYWRTdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWRCYWRTdGF0dXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBub3RpZnlBZENvbXBsZXRlOiBHUUwgcmVzcG9uc2Ugc3RhdHVzICcgKyByZXNwb25zZS5zdGF0dXMgKyAnIOKAlCBzcG9vZiBtYXkgYmUgcmVqZWN0ZWQvcmF0ZS1saW1pdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgICAgICAgICAgbmV3U3Bvb2ZlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdTcG9vZmVkID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgdG90YWwgPSBzcG9vZmVkU2V0ID8gc3Bvb2ZlZFNldC5zaXplIDogbmV3U3Bvb2ZlZDsKICAgICAgICAgICAgICAgIC8vIHNyYz0gcHJpbWFyeSB2cyBjb21taXR0ZWQgYmFja3VwIHBsYXllci10eXBlIChzdXJmYWNlcyBzdHJlYW0tc3dhcAogICAgICAgICAgICAgICAgLy8gYWQtSUQgbWl4aW5nKS4gcG9kLWNvbXBsZXRlPSB3aGV0aGVyIHRoZSBzaW5nbGUgcG9kX2NvbXBsZXRlIGZpcmVkLgogICAgICAgICAgICAgICAgY29uc3Qgc3JjID0gKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlKSB8fCAncHJpbWFyeSc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTcG9vZmVkIGFkIGNvbXBsZXRpb24gZm9yICcgKyBuZXdTcG9vZmVkICsgJyBuZXcgYWQocykgKCcgKyB0b3RhbCArICcvJyArIHBvZExlbmd0aCArICcgcG9kKSDigJQgcm9sbDogJyArIGZpcnN0Um9sbFR5cGUgKyAnLCBzcmM6ICcgKyBzcmMgKyAnLCBwb2QtY29tcGxldGU6ICcgKyAocG9kQ29tcGxldGVTZW50ID8gJ3llcycgOiAnbm8nKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgY29tcGxldGlvbiBzcG9vZiBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFkU2lnbmlmaWVycy5maWx0ZXIoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgLy8gUmVtb3ZlIGFkIHNlZ21lbnRzIGZyb20gYW4gbTN1OCBwbGF5bGlzdCBhbmQgY2FjaGUgdGhlaXIgVVJMcyBmb3IgcmVwbGFjZW1lbnQKICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFkU2lnbmlmaWVycyAoY2FuZGlkYXRlcyBmb3IgZnV0dXJlIGluY2x1c2lvbikKICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMpIHsKICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgbGV0IHNtOwogICAgICAgICAgICBjb25zdCBjbGFzc1JlID0gL0VYVC1YLURBVEVSQU5HRTpbXlxuXSpDTEFTUz0iKHR3aXRjaC1bXiJdKykiL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSBjbGFzc1JlLmV4ZWModGV4dFN0cikpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZCgnRVhULVgtREFURVJBTkdFOkNMQVNTPSInICsgc21bMV0gKyAnIicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHRhZ1JlID0gLyhTQ1RFMzUtW0EtWi1dK3xFWFQtWC1DVUUtW0EtWi1dKykvZzsKICAgICAgICAgICAgd2hpbGUgKChzbSA9IHRhZ1JlLmV4ZWModGV4dFN0cikpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZChzbVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3Vic3RyaW5nIGNoZWNrIChub3QgZXhhY3QpOiBhIGNhbmRpZGF0ZSBpcyAia25vd24iIGlmIGFueSBBZFNpZ25pZmllcgogICAgICAgICAgICAvLyBhcHBlYXJzIHdpdGhpbiBpdC4gVGhpcyBoYW5kbGVzIHByZWZpeCBzaWduaWZpZXJzIGxpa2UgJ3R3aXRjaC1zdGl0Y2hlZCcKICAgICAgICAgICAgLy8gY292ZXJpbmcgJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0idHdpdGNoLXN0aXRjaGVkLWFkIicgZXRjLgogICAgICAgICAgICBjb25zdCB1bmtub3duID0gWy4uLmNhbmRpZGF0ZXNdLmZpbHRlcihjID0+CiAgICAgICAgICAgICAgICAhQWRTaWduaWZpZXJzLnNvbWUocyA9PiBzICYmIGMuaW5jbHVkZXMocykpICYmCiAgICAgICAgICAgICAgICAhS25vd25Ob25BZFNpZ25pZmllcnMuc29tZShzID0+IHMgJiYgYy5pbmNsdWRlcyhzKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQWRTaWduaWZpZXJzOiAnICsgdW5rbm93bi5qb2luKCcsICcpICsgJyAoY2FuZGlkYXRlcyBmb3IgZnV0dXJlIGluY2x1c2lvbiknKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbaV07CiAgICAgICAgICAgIC8vIFRyYWNrIFNDVEUtMzUgQ1VFLU9VVC9DVUUtSU4gYWQgYm91bmRhcmllcwogICAgICAgICAgICBpZiAobGluZS5pbmNsdWRlcygnRVhULVgtQ1VFLU9VVCcpKSB7CiAgICAgICAgICAgICAgICBpZiAoIWluQ3VlT3V0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU0NURS0zNSBDVUUtT1VUIOKAlCBhZCBib3VuZGFyeSBlbnRlcmVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5pbmNsdWRlcygnRVhULVgtQ1VFLUlOJykpIHsKICAgICAgICAgICAgICAgIGlmIChpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLUlOIOKAlCBhZCBib3VuZGFyeSBleGl0ZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluQ3VlT3V0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWNraW5nIHVybHMgd2hpY2ggYXBwZWFyIGluIHRoZSBvdmVybGF5IFVJCiAgICAgICAgICAgIGxpbmVzW2ldID0gbGluZS5yZXBsYWNlQWxsKFR3aXRjaEFkVXJsUmV3cml0ZVJlZ2V4LCBgJDEke25ld0FkVXJsfSQyYCk7CiAgICAgICAgICAgIGNvbnN0IGlzTGl2ZVNlZ21lbnQgPSBsaW5lLmluY2x1ZGVzKCcsbGl2ZScpOwogICAgICAgICAgICBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgKCFpc0xpdmVTZWdtZW50IHx8IHN0cmlwQWxsU2VnbWVudHMgfHwgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzIHx8IGluQ3VlT3V0KSkgewogICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudFVybCA9IGxpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGlmICghQWRTZWdtZW50Q2FjaGUuaGFzKHNlZ21lbnRVcmwpKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChzZWdtZW50VXJsLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgQWRTZWdtZW50VVJMUGF0dGVybnMuc29tZSgocCkgPT4gbGluZXNbaSArIDFdLmluY2x1ZGVzKHApKSkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc2VnbWVudCBkZXRlY3RlZCB2aWEgVVJMIHBhdHRlcm46ICcgKyBsaW5lc1tpICsgMV0pOwogICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KGxpbmVzW2kgKyAxXSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMrKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBpc0xpdmVTZWdtZW50KSB7CiAgICAgICAgICAgICAgICBsaXZlU2VnbWVudHMucHVzaCh7IGV4dGluZjogbGluZSwgdXJsOiBsaW5lc1tpICsgMV0gfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtUEFSVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHBhcnQ6IFVSSSBpcyBpbmxpbmUgYXMgYW4gYXR0cmlidXRlLiBTdHJpcCBpZiBpdCBtYXRjaGVzIGEga25vd24KICAgICAgICAgICAgICAgIC8vIGFkIFVSTCAoYWxyZWFkeSBpbiBjYWNoZSBmcm9tIGEgcGFyYWxsZWwgRVhUSU5GIHN0cmlwLCBvciBtYXRjaGVzIGEgVVJMIHBhdHRlcm4pLgogICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCB0aGUgcGxheWVyIG1heSB1c2UgdGhlIHBhcnRzIHBhdGggdG8gZmV0Y2ggYWQgbWVkaWEgdmlhIGxvdy1sYXRlbmN5LgogICAgICAgICAgICAgICAgY29uc3QgcGFydFVyaU1hdGNoID0gbGluZS5tYXRjaChVcmlBdHRyaWJ1dGVSZWdleCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFkU2VnbWVudFVSTFBhdHRlcm5zLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICAvLyBGb3JtYXQ6ICcjRVhULVgtVFdJVENILVBSRUZFVENIOmh0dHBzOi8vdXJsL2hlcmUudHMnIChyYXcgVVJMIGFmdGVyIHRoZSBjb2xvbikKICAgICAgICAgICAgICAgIC8vICAgICBvcjogJyNFWFQtWC1QUkVMT0FELUhJTlQ6VFlQRT1QQVJULFVSST0idXJsIicgKFVSSSBhdHRyaWJ1dGUpCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBZFNlZ21lbnRVUkxQYXR0ZXJucy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBoYXNBZFRhZ3ModGV4dFN0cikpIHsKICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBObyBsb3cgbGF0ZW5jeSBkdXJpbmcgYWRzIChvdGhlcndpc2UgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHBsYXllciB0byBwcmVmZXRjaCBhbmQgZGlzcGxheSBhZCBzZWdtZW50cykKICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1QUkVMT0FELUhJTlQ6JykpIHsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICAvLyBDYWNoZSBsaXZlIHNlZ21lbnRzIGZvciByZWNvdmVyeSAocGx1cyB0aGUgTUVESUEtU0VRVUVOQ0Ugb2YgdGhlIG9sZGVzdCBjYWNoZWQgc2VnbWVudCwKICAgICAgICAvLyBzbyB0aGUgcGxheWVyIGFjY2VwdHMgaW5qZWN0ZWQgcmVjb3Zlcnkgc2VnbWVudHMgYXMgdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSkKICAgICAgICBpZiAobGl2ZVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzID0gbGl2ZVNlZ21lbnRzLnNsaWNlKC02KTsKICAgICAgICAgICAgY29uc3Qgc2VxID0gcGFyc2VJbnQoKHRleHRTdHIubWF0Y2goLyNFWFQtWC1NRURJQS1TRVFVRU5DRTooXGQrKS8pIHx8IFtdKVsxXSk7CiAgICAgICAgICAgIGlmICghaXNOYU4oc2VxKSkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxID0gc2VxICsgTWF0aC5tYXgoMCwgbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIGFsbCBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkLCB0cnkgdG8gcHJldmVudCBibGFjayBzY3JlZW4gdmlhIHJlY292ZXJ5IGNvbnRlbnQuCiAgICAgICAgLy8gUHJlZmVyIHRoZSBmdWxsLXBsYXlsaXN0IHNuYXBzaG90IGZyb20gYSByZWNlbnQgbm9uLWFkIHBvbGwgKG1pcnJvcnMgVFRWLUFCCiAgICAgICAgLy8gTGFzdENsZWFuTmF0aXZlTTNVOCBhcHByb2FjaCkg4oCUIGdpdmVzIHRoZSBwbGF5ZXIgNC02IGxpdmUgc2VnbWVudHMgd29ydGggb2YKICAgICAgICAvLyBjb250ZW50IHZzIHRoZSB0aGluIHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlLiBGYWxscyBiYWNrIHRvIHRoZSBwZXItc2VnbWVudAogICAgICAgIC8vIGNhY2hlIGlmIHRoZSBzbmFwc2hvdCBpcyBzdGFsZSBvciBtaXNzaW5nLgogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMgJiYgbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSArIDE7CiAgICAgICAgICAgIHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzID0gKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzIHx8IDApICsgMTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCkgc3RyZWFtSW5mby5GcmVlemVTdGFydGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAvLyBQcmltYXJ5OiBmcmVzaCBmdWxsLXBsYXlsaXN0IHNuYXBzaG90ICg8IDEuNXMgb2xkLCBtdXN0IG5vdCBpdHNlbGYgY29udGFpbiBhZCBtYXJrZXJzKQogICAgICAgICAgICBjb25zdCBzbmFwc2hvdEFnZSA9IHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA/IChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0KSA6IEluZmluaXR5OwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4ICYmIHNuYXBzaG90QWdlIDw9IDE1MDAgJiYgIWhhc0FkVGFncyhzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTgpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJldXNpbmcgbGFzdCBjbGVhbiBuYXRpdmUgcGxheWxpc3QgKCcgKyBzbmFwc2hvdEFnZSArICdtcyBvbGQpJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlIChleGlzdGluZyBiZWhhdmlvcikKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyAmJiBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXN0b3JpbmcgJyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggKyAnIHJlY292ZXJ5IHNlZ21lbnRzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKCcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2pdID0gJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonICsgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLmV4dGluZik7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0udXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAobGl2ZVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgLy8gUmVzZXQgZnJlZXplIGNvdW50ZXIgd2hlbiBsaXZlIHNlZ21lbnRzIGFyZSBhdmFpbGFibGUKICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgIH0KICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIC8vIFRocm90dGxlIGNhY2hlIHBydW5lIHRvIG9uY2UgcGVyIDYwcy4gVGhlIDEyMHMgVFRMIGdpdmVzIHBsZW50eSBvZiBoZWFkcm9vbQogICAgICAgIC8vIGFuZCBzY2FubmluZyB0aGUgZnVsbCBjYWNoZSBvbiBldmVyeSBtM3U4IHBvbGwgYWRkcyB1cCBkdXJpbmcgaGVhdnkgYWQgYnJlYWsKICAgICAgICAvLyBzZXF1ZW5jZXMgKExMLUhMUyBjYW4gcG9sbCBtdWx0aXBsZSB0aW1lcyBwZXIgc2Vjb25kKS4gUG9ydGVkIGZyb20gVFRWLUFCLgogICAgICAgIGlmICghc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgfHwgbm93IC0gc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPiA2MDAwMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA9IG5vdzsKICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSwgbWFwKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBub3cgLSAxMjAwMDApIHsKICAgICAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBCb3VuZCB0aGUgY2FjaGUgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoIG9uIGxvbmcgc2Vzc2lvbnMuIFdoZW4gc2l6ZSA+IDEwMDAsCiAgICAgICAgICAgIC8vIGV2aWN0IHRoZSBvbGRlc3QgMjAwIGVudHJpZXMgKE1hcCBpdGVyYXRpb24gb3JkZXIgaXMgaW5zZXJ0aW9uIG9yZGVyLCBzbyBGSUZPKS4KICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLnNpemUgPiAxMDAwKSB7CiAgICAgICAgICAgICAgICBsZXQgZXZpY3RlZCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHVybCBvZiBBZFNlZ21lbnRDYWNoZS5rZXlzKCkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5kZWxldGUodXJsKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKytldmljdGVkID49IDIwMCkgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxaykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTZWdtZW50Q2FjaGUgZXhjZWVkZWQgMTAwMCBlbnRyaWVzIOKAlCBldmljdGVkIG9sZGVzdCAnICsgZXZpY3RlZCArICcgKG5vdyAnICsgQWRTZWdtZW50Q2FjaGUuc2l6ZSArICcpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xuJyk7CiAgICB9CiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG1hdGNoaW5nIHN0cmVhbSBVUkwgZm9yIGEgZ2l2ZW4gcmVzb2x1dGlvbiBmcm9tIGEgbWFzdGVyIG0zdTgKICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBjb25zdCBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgIGxldCBtYXRjaGVkUmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IG1hdGNoZWRGcmFtZVJhdGUgPSBmYWxzZTsKICAgICAgICBsZXQgY2xvc2VzdFJlc29sdXRpb25VcmwgPSBudWxsOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBJbmZpbml0eTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kaW5nc0xpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICAvLyBBY2NlcHQgdjIgQVBJIHZhcmlhbnQgVVJMcyB3aGljaCBhcmUgcmF3IENETiBVUkxzIHdpdGhvdXQgJy5tM3U4JyBpbiB0aGUgcGF0aC4KICAgICAgICAgICAgLy8gdjEgQVBJOiBuZXh0IGxpbmUgaXMgJy4uLmluZGV4LTxyZXNvbHV0aW9uPi5tM3U4Py4uLicKICAgICAgICAgICAgLy8gdjIgQVBJOiBuZXh0IGxpbmUgaXMgYSByYXcgQ0ROIFVSTCBsaWtlICdodHRwczovL3ZpZGVvLWVkZ2UtLi4ubmV0L3YxLy4uLi9jaHVua2VkLy4uLicKICAgICAgICAgICAgLy8gd2l0aG91dCAnLm0zdTgnLiBNYXRjaGluZyBvbmx5IG9uICcubTN1OCcgd291bGQgc2tpcCB2MiB2YXJpYW50cyBlbnRpcmVseSwKICAgICAgICAgICAgLy8gY2F1c2luZyBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uIHRvIHJldHVybiBudWxsIGFuZCBiYWNrdXAgc2VsZWN0aW9uIHRvIGZhaWwuCiAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lID0gZW5jb2RpbmdzTGluZXNbaSArIDFdPy50cmltKCk7CiAgICAgICAgICAgIGlmIChlbmNvZGluZ3NMaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpICYmIG5leHRMaW5lICYmICFuZXh0TGluZS5zdGFydHNXaXRoKCcjJykgJiYgKG5leHRMaW5lLmluY2x1ZGVzKCcubTN1OCcpIHx8IG5leHRMaW5lLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoZW5jb2RpbmdzTGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbiAmJiAoIW1hdGNoZWRSZXNvbHV0aW9uVXJsIHx8ICghbWF0Y2hlZEZyYW1lUmF0ZSAmJiBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlc29sdXRpb25VcmwgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGcmFtZVJhdGUgPSBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25Vcmw7CiAgICB9CiAgICAvLyBDb3JlIGFkLWJsb2NraW5nIGxvZ2ljOiBkZXRlY3QgYWRzIGluIG0zdTgsIGZldGNoIGJhY2t1cCBzdHJlYW1zLCBzdHJpcCBhZCBzZWdtZW50cwogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBpZiAoSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkKSB7CiAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICAvLyBEZXRlY3Rpb24gZGlhZ25vc3RpYzogaWYgVHdpdGNoIHNodXRzIGEgc3RyZWFtIGRvd24gKGFudGktYWQtYmxvY2sgZGV0ZWN0aW9uCiAgICAgICAgLy8gcmVzcG9uc2Ugb2JzZXJ2ZWQgaW4gZmllbGQgcmVwb3J0cyksIHRoZSBtM3U4IHRyYW5zaXRpb25zIHRvIGEgc3RyZWFtLWVuZCBzaGFwZQogICAgICAgIC8vIOKAlCBgRVhULVgtRU5ETElTVGAgcHJlc2VudCBhbmQgbm8gYCNFWFRJTkY6YCBzZWdtZW50IGxpbmVzLiBMb2cgb25jZSBwZXIgc3RyZWFtCiAgICAgICAgLy8gc2Vzc2lvbiBzbyB1c2VycyAvIGJ1ZyByZXBvcnRlcnMgY2FuIGluY2x1ZGUgdGhlIHRyYW5zaXRpb24gdGltZXN0YW1wIGluIHJlcHJvcy4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkT2ZmbGluZVRyYW5zaXRpb24gJiYgdGV4dFN0ci5pbmNsdWRlcygnI0VYVC1YLUVORExJU1QnKSAmJiAhdGV4dFN0ci5pbmNsdWRlcygnI0VYVElORjonKSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU3RyZWFtIGVuZGVkIC8gb2ZmbGluZSBzaGFwZSBkZXRlY3RlZCDigJQgbTN1OCBoYXMgI0VYVC1YLUVORExJU1Qgd2l0aCBubyBzZWdtZW50cy4gUG9zc2libGUgVHdpdGNoIGRldGVjdGlvbiByZXNwb25zZSwgYnJvYWRjYXN0ZXIgZW5kZWQgc3RyZWFtLCBvciBuYXR1cmFsIGVuZC1vZi1icm9hZGNhc3QnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0NoZWNrZWRVbmtub3duVGFncykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NoZWNrZWRVbmtub3duVGFncyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHVua25vd25BZFRhZ3MgPSB0ZXh0U3RyLm1hdGNoKC8jRVhUW146XG5dKig/OmFkfGN1ZXxzY3RlfHNwb25zb3IpW146XG5dKi9naSk7CiAgICAgICAgICAgIGlmICh1bmtub3duQWRUYWdzKSB7CiAgICAgICAgICAgICAgICBjb25zdCB1bmtub3duID0gdW5rbm93bkFkVGFncy5maWx0ZXIodCA9PiAhQWRTaWduaWZpZXJzLnNvbWUocyA9PiBzICYmIHQuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVbmtub3duIGFkLXJlbGF0ZWQgdGFncyBmb3VuZDogJyArIFsuLi5uZXcgU2V0KHVua25vd24pXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBoYXZlQWRUYWdzID0gaGFzQWRUYWdzKHRleHRTdHIpIHx8IFNpbXVsYXRlZEFkc0RlcHRoID4gMDsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB0byBjaGV3IG9uIHZzIHRoZSAxLTIgY2FjaGVkIGluZGl2aWR1YWwgc2VnbWVudHMuCiAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgc3JjL21vZHVsZXMvcHJvY2Vzc29yLnRzOjczMy03MzYuCiAgICAgICAgaWYgKCFoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzU2hvd2luZ0FkICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoaGF2ZUFkVGFncykgewogICAgICAgICAgICAvLyBCb3VuY2UtdG9sZXJhbnQgcmVzZXQ6IGtlZXAgUGVuZGluZ0FkRW5kQXQgYWxpdmUgYWNyb3NzIHNob3J0IGZsaXBzIGJhY2sgdG8gYWQtbWFya2VkCiAgICAgICAgICAgIC8vIHNvIHRoZSBzbG93LXBhdGggbWF4LXdhaXQgZ2F0ZSBjYW4gc3RpbGwgZmlyZSB3aGVuIGJvdW5jaW5nIG1hcmtlcnMgcHJldmVudAogICAgICAgICAgICAvLyBDbGVhblBsYXlsaXN0Q291bnQgZnJvbSByZWFjaGluZyB0aHJlc2hvbGQuIE1pcnJvcnMgVFRWLUFCIHY2LjYuNyAjMS4KICAgICAgICAgICAgY29uc3QgYWRFbmRTdGFsZW5lc3NNcyA9IDEyMDAwOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCAmJiAoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQpIDwgYWRFbmRTdGFsZW5lc3NNcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50ID0gKHN0cmVhbUluZm8uQWRFbmRCb3VuY2VDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0ID0gMDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQWRFbmRCb3VuY2VDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICBzdHJlYW1JbmZvLklzTWlkcm9sbCA9IHRleHRTdHIuaW5jbHVkZXMoJyJNSURST0xMIicpIHx8IHRleHRTdHIuaW5jbHVkZXMoJyJtaWRyb2xsIicpOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uSXNTaG93aW5nQWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTaG93aW5nQWQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BZEJyZWFrU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aE1hdGNoID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQUQtUE9ELUxFTkdUSD0iKFxkKykiLyk7CiAgICAgICAgICAgICAgICBjb25zdCBwb2RMZW5ndGggPSBwb2RMZW5ndGhNYXRjaCA/IHBhcnNlSW50KHBvZExlbmd0aE1hdGNoWzFdLCAxMCkgOiAxOwogICAgICAgICAgICAgICAgLy8gUmVzZXQgZWFybHktcmVsb2FkIHN0YXRlIGZvciBuZXcgYWQgYnJlYWs7IGFsbG93IHVwIHRvIG9uZSBlYXJseSByZWxvYWQgcGVyIGFkIGluIHBvZAogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Qb2RMZW5ndGggPSBwb2RMZW5ndGg7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF0UG9sbCA9IDA7CiAgICAgICAgICAgICAgICAvLyBUcmFjayBoaWdoLWNvbmZpZGVuY2UgYWQgbWFya2VycyB0byBkaXN0aW5ndWlzaCByZWFsIGFkcyBmcm9tIGZhbHNlLXBvc2l0aXZlIHNpZ25pZmllciBtYXRjaGVzCiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMgPSB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTicpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPSBudWxsOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5GcmVlemVTdGFydGVkQXQgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOy8vIFJlc2V0IHN0aWNreSBDU0FJIGZsYWcgZm9yIG5ldyBicmVhawogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgZGV0ZWN0ZWQg4oCUIHR5cGU6ICcgKyAoc3RyZWFtSW5mby5Jc01pZHJvbGwgPyAnbWlkcm9sbCcgOiAncHJlcm9sbCcpICsgJywgY2hhbm5lbDogJyArIHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUgKyAnLCBwb2Q6ICcgKyBwb2RMZW5ndGggKyAnIGFkKHMpICh+JyArIChwb2RMZW5ndGggKiAzMCkgKyAncyBleHBlY3RlZCksIHNpZ25pZmllcnM6ICcgKyBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpLmpvaW4oJywgJykpOwogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogZmFsc2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNwb29mIGFkLWNvbXBsZXRpb24gZXZlcnkgYWQtbGFkZW4gcG9sbCAobm90IGp1c3QgYnJlYWstc3RhcnQpLiBNdWx0aS1hZAogICAgICAgICAgICAvLyBwb2RzIHN1cmZhY2Ugb25lIGFkIHBlciBwb2xsOyBub3RpZnlBZENvbXBsZXRlIGRlZHVwcyB2aWEgU3Bvb2ZlZEFkSWRzLgogICAgICAgICAgICBpZiAoIURpc2FibGVBZFNwb29maW5nKSB7CiAgICAgICAgICAgICAgICAvLyBEZWZlciBvZmYgdGhlIHBsYXlsaXN0IGNyaXRpY2FsIHBhdGgg4oCUIHN5bmNocm9ub3VzIG1hdGNoQWxsICsgcGFyc2UgKwogICAgICAgICAgICAgICAgLy8gSlNPTi5zdHJpbmdpZnkgaGVyZSBkZWxheXMgdGhlIG1vZGlmaWVkLW0zdTggcmV0dXJuIHRvIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIChhZC1icmVhayBzdHV0dGVyKS4gTmV4dCB0aWNrIGlzIGZpbmU7IHNwb29mIGJlYWNvbnMgYXJlbid0IHRpbWUtY3JpdGljYWwuCiAgICAgICAgICAgICAgICAvLyAoR29zdURSTSBUVFYtQUIgdjguMC4wIGZpZWxkIGZpbmRpbmcgb24gdGhpcyBzYW1lIHNwb29mIGNvZGUuKQogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBub3RpZnlBZENvbXBsZXRlKHRleHRTdHIsIHN0cmVhbUluZm8pLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uSXNNaWRyb2xsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHRleHRTdHIuc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBsaW5lcy5sZW5ndGggPiBpICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMoJyxsaXZlJykgJiYgIXN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmhhcyhsaW5lc1tpICsgMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcXVlc3Qgb25lIC50cyBmaWxlIHBlciAubTN1OCByZXF1ZXN0IHRvIGF2b2lkIG1ha2luZyB0b28gbWFueSByZXF1ZXN0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuYWRkKGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ibG9iKCkpLmNhdGNoKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZXNvbHV0aW9uID0gc3RyZWFtSW5mby5VcmxzW3VybF07CiAgICAgICAgICAgIGlmICghY3VycmVudFJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZHMgd2lsbCBsZWFrIGR1ZSB0byBtaXNzaW5nIHJlc29sdXRpb24gaW5mbyBmb3IgJyArIHVybCk7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpc0hldmMgPSBjdXJyZW50UmVzb2x1dGlvbi5Db2RlY3Muc3RhcnRzV2l0aCgnaGV2JykgfHwgY3VycmVudFJlc29sdXRpb24uQ29kZWNzLnN0YXJ0c1dpdGgoJ2h2YycpOwogICAgICAgICAgICAvLyBQb3N0LWFkIHJlbG9hZC1sb29wIGd1YXJkOiBza2lwIHRoZSBIRVZDIHJlbG9hZCBpZiBhIHBsYXllciByZWxvYWQgYWxyZWFkeQogICAgICAgICAgICAvLyBmaXJlZCB3aXRoaW4gdGhlIGxhc3QgOHMuIEVuZC1vZi1icmVhayBjbGVhcnMgSXNVc2luZ01vZGlmaWVkTTNVODsgd2l0aG91dAogICAgICAgICAgICAvLyB0aGlzIGd1YXJkLCBwb3N0LWFkIGNvbnRpbnVhdGlvbiBtYXJrZXJzIHdvdWxkIHJlLWZpcmUgdGhlIHJlbG9hZC4KICAgICAgICAgICAgY29uc3QgcG9zdEFkUmVlbnRyeUd1YXJkTXMgPSA4MDAwOwogICAgICAgICAgICBjb25zdCByZWNlbnRseVJlbG9hZGVkID0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkICYmIChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkKSA8IHBvc3RBZFJlZW50cnlHdWFyZE1zOwogICAgICAgICAgICBpZiAoKChpc0hldmMgJiYgIVNraXBQbGF5ZXJSZWxvYWRPbkhldmMpIHx8IEFsd2F5c1JlbG9hZFBsYXllck9uQWQpICYmIHN0cmVhbUluZm8uTW9kaWZpZWRNM1U4ICYmICFzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggJiYgIXJlY2VudGx5UmVsb2FkZWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1JlbG9hZFBsYXllcicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN0aWNreSBDU0FJIGZhc3QgcGF0aDogaWYgYSBwcmlvciBwb2xsIGluIFRISVMgYnJlYWsgYWxyZWFkeSBjb25maXJtZWQgdGhlIGJyZWFrCiAgICAgICAgICAgIC8vIGlzIENTQUktb25seSAoYWxsIHNlZ21lbnRzIGxpdmUgb24gcG9sbCAxKSwgc3RheSBvbiB0aGUgZmFzdCBwYXRoIGZvciB0aGUgcmVzdAogICAgICAgICAgICAvLyBvZiB0aGUgYnJlYWsuIHN0cmlwQWRTZWdtZW50cyBzdGlsbCBoYW5kbGVzIGFueSByZWFsIEVYVElORiBhZCBzZWdtZW50cyB0aGF0CiAgICAgICAgICAgIC8vIHNob3cgdXAgb24gbGF0ZXIgcG9sbHMgKHRoZXkgZ2V0IGNhY2hlZCBhbmQgdGhlIGZldGNoIGhvb2sgcmV0dXJucyBCTEFOS19NUDQpLAogICAgICAgICAgICAvLyBzbyBhZHMgYXJlIGJsb2NrZWQgZXZlbiB3aXRob3V0IHRoZSBiYWNrdXAgc3dpdGNoLiBTa2lwcGluZyBiYWNrdXAgc2VhcmNoIGZvcgogICAgICAgICAgICAvLyB0aGUgd2hvbGUgQ1NBSSBicmVhayBzYXZlcyB+MjAgd2FzdGVkIGZldGNoZXMgcGVyIGJyZWFrIOKAlCB0aGUgYmFja3VwIHdvdWxkbid0CiAgICAgICAgICAgIC8vIGhlbHAgYW55d2F5IHNpbmNlIGV2ZXJ5IHBsYXllciB0eXBlIGhhcyB0aGUgc2FtZSBDU0FJIGFkcy4gRmxhZyBpcyBjbGVhcmVkCiAgICAgICAgICAgIC8vIG9ubHkgYXQgYnJlYWsgZW5kIChJc1Nob3dpbmdBZD1mYWxzZSBwYXRoKS4KICAgICAgICAgICAgLy8gU3RpY2t5IENTQUkgZXNjYXBlIGhhdGNoIChQcmVmZXJMb3dRdWFsaXR5QmFja3VwKTogYWZ0ZXIgfjhzIHN0dWNrLCBmYWxsIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaC4KICAgICAgICAgICAgaWYgKFByZWZlckxvd1F1YWxpdHlCYWNrdXAgJiYgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayAmJiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgPj0gNCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3R1Y2tQb2xscyA9IHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOwogICAgICAgICAgICAgICAgY29uc3QgcmVjb3ZlcnlDYWNoZVNpemUgPSBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgY29uc3QgZWFybHlSZWxvYWRJbmZvID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArICcvJyArIE1hdGgubWF4KDEsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU3RpY2t5IENTQUkgZXNjYXBlIGhhdGNoIOKAlCBzdHVjayAnICsgc3R1Y2tQb2xscyArICcgcG9sbHMgKH4nICsgKHN0dWNrUG9sbHMgKiAyKSArICdzKSwgRWFybHlSZWxvYWRDb3VudD0nICsgZWFybHlSZWxvYWRJbmZvICsgJywgcmVjb3ZlcnkgY2FjaGU9JyArIHJlY292ZXJ5Q2FjaGVTaXplICsgJyBzZWdtZW50cywgZmFsbGluZyB0aHJvdWdoIHRvIGJhY2t1cCBzZWFyY2gnKTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ3NhaU9ubHlUaGlzQnJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ3NhaU9ubHlUaGlzQnJlYWsgJiYgIXN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCkgewogICAgICAgICAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4dFN0ciA9IHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBmYWxzZSwgc3RyZWFtSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemUg4oCUIG1pcnJvcnMgdGhlIGNoZWNrIGluIHRoZSBub3JtYWwKICAgICAgICAgICAgICAgIC8vIGJhY2t1cC1zZWFyY2ggcGF0aCB3aGljaCB3ZSdkIG90aGVyd2lzZSBza2lwIGVudGlyZWx5IGJ5IHJldHVybmluZyBlYXJseQogICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgc3RpY2t5IHBhdGguIFdpdGhvdXQgdGhpcywgaGVhdnkgU1NBSSBicmVha3Mgb24gQ1NBSS1jb25maXJtZWQKICAgICAgICAgICAgICAgIC8vIHN0cmVhbXMgbGVhdmUgdGhlIHBsYXllciByZXBsYXlpbmcgdGhlIHRoaW4gcmVjb3ZlcnkgY2FjaGUgZm9yIHRoZSBmdWxsCiAgICAgICAgICAgICAgICAvLyBicmVhayBkdXJhdGlvbiAob2JzZXJ2ZWQ6IDM1LjlzIGZyZWV6ZSBvbiBwb2QtMSBicmVhaywgMyBhbGwtc3RyaXBwZWQKICAgICAgICAgICAgICAgIC8vIHBvbGxzLCAxLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUpLgogICAgICAgICAgICAgICAgLy8gQm91bmRlZCB0byBtYXhFYXJseVJlbG9hZHMgcGVyIGFkIGluIHBvZCBzbyByZWxvYWQgbG9vcHMgYXJlIGltcG9zc2libGUuCiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdCAoc3RpY2t5IHBhdGgpOiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreVJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgICAgICBjb25zdCBzdGlja3lNYXhFYXJseVJlbG9hZHMgPSBzdGlja3lSZWNvdmVyeVRoaW4gPyBNYXRoLm1heCgyLCBzdHJlYW1JbmZvLlBvZExlbmd0aCB8fCAxKSA6IE1hdGgubWF4KDEsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpOwogICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5RWZmZWN0aXZlVGhyZXNob2xkID0gc3RpY2t5UmVjb3ZlcnlUaGluID8gMSA6IEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZDsKICAgICAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBzdGlja3lFZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IHN0aWNreU1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBd2FpdGluZ1Jlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF0UG9sbCA9IHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzIHx8IHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreVJlYXNvbiA9IHN0aWNreVJlY292ZXJ5VGhpbiA/ICcgKHRoaW4gcmVjb3ZlcnkgY2FjaGU6ICcgKyAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzPy5sZW5ndGggfHwgMCkgKyAnIHNlZ21lbnRzKScgOiAnJzsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIChzdGlja3kgcGF0aCkg4oCUICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyArICcgY29uc2VjdXRpdmUgYWxsLXN0cmlwcGVkIHBvbGxzJyArIHN0aWNreVJlYXNvbiArICcgWycgKyBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgKyAnLycgKyBzdGlja3lNYXhFYXJseVJlbG9hZHMgKyAnXScpOwogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICAgICAgICAgIGhhc0Fkczogc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCwKICAgICAgICAgICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDU0FJIGZhc3QgcGF0aDogaWYgYWxsIHNlZ21lbnRzIGluIHRoZSBtYWluIHN0cmVhbSBhcmUgbGl2ZSwgc2tpcCBiYWNrdXAgc2VhcmNoLgogICAgICAgICAgICAvLyBDU0FJIGFkcyBhcmUgZGVsaXZlcmVkIG91dHNpZGUgdGhlIG0zdTgg4oCUIHRoZSBtYWluIHN0cmVhbSBzZWdtZW50cyBhcmUgY2xlYW4uCiAgICAgICAgICAgIC8vIEp1c3Qgc3RyaXAgdHJhY2tpbmcgVVJMcyBhbmQgcmV0dXJuIHRoZSBtYWluIHN0cmVhbSBkaXJlY3RseSwgYXZvaWRpbmcgdGhlCiAgICAgICAgICAgIC8vIGJhY2t1cCBzdHJlYW0gc3dpdGNoIHRoYXQgY2F1c2VzIGEgMjAtNDBzIHJlYnVmZmVyIGdhcC4KICAgICAgICAgICAgY29uc3QgbWFpblN0cmVhbUxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgbGV0IGhhc05vbkxpdmVTZWdtZW50ID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFpblN0cmVhbUxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobWFpblN0cmVhbUxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAhbWFpblN0cmVhbUxpbmVzW2ldLmluY2x1ZGVzKCcsbGl2ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzTm9uTGl2ZVNlZ21lbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEJhY2t1cFN3YXBGaXJzdCAob3B0LWluKTogc2tpcCBzdGlja3kgQ1NBSSBwYXRoIGVudGlyZWx5LCBhbHdheXMgZmFsbCB0aHJvdWdoIHRvCiAgICAgICAgICAgIC8vIGJhY2t1cCBzZWFyY2ggb24gYWQgZGV0ZWN0LiBNaW1pY3MgVFRWLUFCJ3MgYmFja3VwLXN3YXAtZmlyc3QgZmxvdyDigJQgYXZvaWRzCiAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIG1peGluZyBmcm9tIHN0cmlwIGFjdGl2aXR5IChubyBCTEFOS19NUDQgaW5qZWN0aW9uLCBubyByZWNvdmVyeQogICAgICAgICAgICAvLyBzZWdtZW50IHJlcGxheSksIHdoaWNoIHVzZXJzIHJlcG9ydCBwcm9kdWNlcyBmZXdlciBsb2FkaW5nIGNpcmNsZXMuIENvc3Q6IGV4dHJhCiAgICAgICAgICAgIC8vIGZldGNoZXMgb24gZXZlcnkgYWQgYnJlYWsgKHRva2VuIHJlcXVlc3RzIGZvciBlYWNoIGJhY2t1cCB0eXBlIHRyaWVkKS4KICAgICAgICAgICAgaWYgKCFoYXNOb25MaXZlU2VnbWVudCAmJiAhc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ICYmICFCYWNrdXBTd2FwRmlyc3QpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ3NhaU9ubHlUaGlzQnJlYWsgPSB0cnVlOy8vIE1hcmsgYnJlYWsgYXMgY29uZmlybWVkIENTQUkgc28gc3Vic2VxdWVudCBwb2xscyBzdGF5IG9uIHRoZSBmYXN0IHBhdGgKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgZmFzdCBwYXRoIOKAlCBhbGwgc2VnbWVudHMgbGl2ZSwgc2tpcHBpbmcgYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4dFN0ciA9IHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBmYWxzZSwgc3RyZWFtSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnVXBkYXRlQWRCbG9ja0Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cywKICAgICAgICAgICAgICAgICAgICBudW1TdHJpcHBlZEFkU2VnbWVudHM6IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IG51bGwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgYmFja3VwU2VhcmNoU3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBsZXQgYmFja3VwQ29sZFRva2VuRmV0Y2hlcyA9IDA7Ly8gZGlhZzogY29sZC1jYWNoZSB0b2tlbiByb3VuZC10cmlwcyB0aGlzIGJhY2t1cCBzZWFyY2ggKDAgPSB3YXJtIOKAlCBlbmNvZGluZ3MgY2FjaGUgaGl0KQogICAgICAgICAgICBsZXQgYmFja3VwUGxheWVyVHlwZSA9IG51bGw7CiAgICAgICAgICAgIGxldCBiYWNrdXBNM3U4ID0gbnVsbDsKICAgICAgICAgICAgbGV0IGZhbGxiYWNrTTN1OCA9IG51bGw7CiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDsKICAgICAgICAgICAgbGV0IGlzRG9pbmdNaW5pbWFsUmVxdWVzdHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA+IERhdGUubm93KCkgLSBQbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNUaW1lKSB7CiAgICAgICAgICAgICAgICAvLyBXaGVuIGRvaW5nIHBsYXllciByZWxvYWQgdGhlcmUgYXJlIGEgbG90IG9mIHJlcXVlc3RzIHdoaWNoIGNhdXNlcyB0aGUgYmFja3VwIHN0cmVhbSB0byBsb2FkIGluIHNsb3cuIEJyaWVmbHkgcHJlZmVyIHVzaW5nIGEgc2luZ2xlIHZlcnNpb24gdG8gcHJldmVudCBsb25nIGRlbGF5cwogICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IFBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1BsYXllckluZGV4OwogICAgICAgICAgICAgICAgaXNEb2luZ01pbmltYWxSZXF1ZXN0cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVHJ5IHBpbm5lZCBiYWNrdXAgcGxheWVyIHR5cGUgZmlyc3QgaWYgYXZhaWxhYmxlCiAgICAgICAgICAgIGNvbnN0IHBsYXllclR5cGVzVG9UcnkgPSBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID8gWy4uLkJhY2t1cFBsYXllclR5cGVzLCAnYXV0b3BsYXknXSA6IFsuLi5CYWNrdXBQbGF5ZXJUeXBlc107CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gcGxheWVyVHlwZXNUb1RyeS5pbmRleE9mKHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICBpZiAocGlubmVkSW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS5zcGxpY2UocGlubmVkSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgIHBsYXllclR5cGVzVG9UcnkudW5zaGlmdChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZhc3RBdXRvcGxheUZpcnN0VHJ5OiBwcmVwZW5kIGF1dG9wbGF5IHdoZW4gcHJpb3IgYnJlYWsgZXhoYXVzdGVkIFNvdXJjZS10aWVyCiAgICAgICAgICAgIC8vIChTU0FJLXVuaWZvcm0gc2lnbmFsKS4gU2F2ZXMgfjEuNXMgb2YgcHJvYmUgYnVmZmVyaW5nLiBQZXJpb2RpYyByZS1wcm9iZSBldmVyeQogICAgICAgICAgICAvLyBOdGggY29uc2VjdXRpdmUgZmFzdC1hdXRvcGxheSB3aW4gY2F0Y2hlcyBjaGFubmVsIHJlY292ZXJ5IChUd2l0Y2ggcmV2ZXJzaW5nCiAgICAgICAgICAgIC8vIHVuaXZlcnNhbCBDU0FJIGRlbGl2ZXJ5KSDigJQgd2l0aG91dCBpdCwgY2hhbm5lbCBzdGF5cyBvbiAzNjBwIGZvciB0aGUgc2Vzc2lvbi4KICAgICAgICAgICAgaWYgKEZhc3RBdXRvcGxheUZpcnN0VHJ5ICYmIHN0cmVhbUluZm8uTGFzdEJyZWFrVXNlZEVzY2FwZUhhdGNoICYmIFByZWZlckxvd1F1YWxpdHlCYWNrdXApIHsKICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RBdXRvcGxheVJlcHJvYmVJbnRlcnZhbCA9IDU7CiAgICAgICAgICAgICAgICBjb25zdCBjb25zZWN1dGl2ZSA9IHN0cmVhbUluZm8uRmFzdEF1dG9wbGF5Q29uc2VjdXRpdmUgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjb25zZWN1dGl2ZSA+PSBGYXN0QXV0b3BsYXlSZXByb2JlSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhc3RBdXRvcGxheUNvbnNlY3V0aXZlID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkRmFzdEF1dG9wbGF5UmVwcm9iZVRoaXNCcmVhaykgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEZhc3RBdXRvcGxheVJlcHJvYmVUaGlzQnJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYXN0LWF1dG9wbGF5IHJlLXByb2JlIOKAlCB0ZXN0aW5nIFNvdXJjZS10aWVyIGFmdGVyICcgKyBjb25zZWN1dGl2ZSArICcgY29uc2VjdXRpdmUgZmFzdC1hdXRvcGxheSBicmVha3MgKGNoYW5uZWwtcmVjb3ZlcnkgY2hlY2spJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvcGxheUlkeCA9IHBsYXllclR5cGVzVG9UcnkuaW5kZXhPZignYXV0b3BsYXknKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b3BsYXlJZHggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllclR5cGVzVG9Ucnkuc3BsaWNlKGF1dG9wbGF5SWR4LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS51bnNoaWZ0KCdhdXRvcGxheScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkRmFzdEF1dG9wbGF5VGhpc0JyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEZhc3RBdXRvcGxheVRoaXNCcmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYXN0LWF1dG9wbGF5IGZpcnN0LXRyeSDigJQgcHJpb3IgYnJlYWsgZXhoYXVzdGVkIFNvdXJjZS10aWVyOyBwcm9iaW5nIGF1dG9wbGF5IGZpcnN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVhbC10aW1lIGNvbnRhbWluYXRpb24gcmVvcmRlcjogb24gcG9sbCAyKyBvZiBhIGJyZWFrLCBtb3ZlIHR5cGVzIHRoYXQgd2VyZQogICAgICAgICAgICAvLyBhbHJlYWR5IGxvZ2dlZCBhcyBhZC1sYWRlbiBlYXJsaWVyIGluIHRoZSBzYW1lIGJyZWFrIHRvIHRoZSBlbmQgb2YgaXRlcmF0aW9uLgogICAgICAgICAgICAvLyBMZXRzIHVudHJpZWQvY2xlYW4gdHlwZXMgKHR5cGljYWxseSBhdXRvcGxheSBvbiBTU0FJLWhlYXZ5IGNoYW5uZWxzIGxpa2Ugd2FybikKICAgICAgICAgICAgLy8gZ2V0IHRyaWVkIGZpcnN0IGluc3RlYWQgb2YgcmUtY2hlY2tpbmcgdHlwZXMgd2UgYWxyZWFkeSBrbm93IGFyZSBjb250YW1pbmF0ZWQuCiAgICAgICAgICAgIC8vIExvZ2dlZEJhY2t1cEFkc0J5VHlwZSBpcyBwb3B1bGF0ZWQgYmVsb3cgYXQgdGhlICJhbHNvIGhhcyBhZHMiIGxvZyBzaXRlIGFuZAogICAgICAgICAgICAvLyBjbGVhcmVkIGF0IGVuZC1vZi1icmVhaywgc28gdGhpcyBpcyBwZXItYnJlYWsgYWRhcHRpdmUuCiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZSAmJiBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5zaXplID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgY2xlYW4gPSBbXTsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhbSA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHBsYXllclR5cGVzVG9UcnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuaGFzKHQpKSBjb250YW0ucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGNsZWFuLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY29udGFtLmxlbmd0aCA+IDAgJiYgY2xlYW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllclR5cGVzVG9UcnkubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlc1RvVHJ5LnB1c2goLi4uY2xlYW4sIC4uLmNvbnRhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZENvbnRhbVJlb3JkZXJUaGlzQnJlYWspIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRDb250YW1SZW9yZGVyVGhpc0JyZWFrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ29udGFtaW5hdGlvbi1hd2FyZSByZW9yZGVyIOKAlCB0cnlpbmcgWycgKyBjbGVhbi5qb2luKCcsICcpICsgJ10gYmVmb3JlIGtub3duLWNvbnRhbWluYXRlZCBbJyArIGNvbnRhbS5qb2luKCcsICcpICsgJ10nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgcGxheWVyVHlwZUluZGV4ID0gc3RhcnRJbmRleDsgIWJhY2t1cE0zdTggJiYgcGxheWVyVHlwZUluZGV4IDwgcGxheWVyVHlwZXNUb1RyeS5sZW5ndGg7IHBsYXllclR5cGVJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJUeXBlID0gcGxheWVyVHlwZXNUb1RyeVtwbGF5ZXJUeXBlSW5kZXhdOwogICAgICAgICAgICAgICAgY29uc3QgcmVhbFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlLnJlcGxhY2UoJy1DQUNIRUQnLCAnJyk7CiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRBdCA9IHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuZ2V0KHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIC8vIDVzICh3YXMgMTVzKTogaW4gdGhlIENTQUktZmxpcCB3b3JsZCBhIGNvbnRhbWluYXRlZCBiYWNrdXAgdHlwZSBjYW4KICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgd2l0aGluIHNlY29uZHM7IHRoZSAxNXMgbG9ja291dCBrZXB0IHVzIG9mZiBhIG5vdy1jbGVhbiB0eXBlIGZhcgogICAgICAgICAgICAgICAgLy8gdG9vIGxvbmcgKFRUVi1BQi9Hb3N1RFJNIHY4LjAuMCAicmVkdWNlZCBhZC1pbmR1Y2VkIHN0YWxsaW5nIikuIFRyYWRlb2ZmOgogICAgICAgICAgICAgICAgLy8gfjN4IG1vcmUgcmV0cnkgZmV0Y2hlcyDigJQgd2F0Y2hlZCB2aWEgdGhlIGNvbGQvd2FybSB0b2tlbi1mZXRjaCBsb2cgKCMyMjgpLgogICAgICAgICAgICAgICAgaWYgKGZhaWxlZEF0ICYmIChEYXRlLm5vdygpIC0gZmFpbGVkQXQpIDwgNTAwMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaXNGdWxseUNhY2hlZFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlICE9IHJlYWxQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNhY2hlcyB0aGUgbTN1OCBpZiBpdCBkb2Vzbid0IGhhdmUgYWRzLiBJZiB0aGUgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBoYXMgYWRzIGl0IGZldGNoZXMgYSBuZXcgdmVyc2lvbiAoc2Vjb25kIGxvb3ApCiAgICAgICAgICAgICAgICAgICAgbGV0IGlzRnJlc2hNM3U4ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgbGV0IGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVuY29kaW5nc00zdTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNGcmVzaE0zdTggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBDb2xkVG9rZW5GZXRjaGVzKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcmVhbFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IChmbGF0dGVyLCBvYnNlcnZlZCBmb3IgJ2VtYmVkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNwYXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5GYWlsZWRCYWNrdXBQbGF5ZXJUeXBlcy5zZXQocmVhbFBsYXllclR5cGUsIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyA+PSAzICYmICFzdHJlYW1JbmZvLkxvZ2dlZFRva2VuRmFpbHVyZVN0cmVhaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVG9rZW4gZmV0Y2ggZmFpbGVkICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzICsgJyB0aW1lcyBjb25zZWN1dGl2ZWx5IGFjcm9zcyBwbGF5ZXIgdHlwZXMg4oCUIHBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gLyBpbnRlZ3JpdHkgcm90YXRpb24gLyByYXRlIGxpbWl0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCBzcGF0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXSA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGRldGVjdGlvbiBkaWFnbm9zdGljIGNvdW50ZXIgb24gc3VjY2VzcyDigJQgdG9rZW4gZmV0Y2hlZCwgbTN1OCBmZXRjaGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVc2hlciBIVFRQICcgKyBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvckJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBlcnJvckJvZHkgPSAnIOKAlCAnICsgKGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UudGV4dCgpKS5zdWJzdHJpbmcoMCwgMjAwKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFjY2VzcyB0b2tlbiBIVFRQICcgKyBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyByZWFsUGxheWVyVHlwZSArIChhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzID8gJyAoaW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICdwcmVzZW50JyA6ICdtaXNzaW5nJykgKyAnKScgOiAnJykgKyBlcnJvckJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuc2V0KHJlYWxQbGF5ZXJUeXBlLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID49IDMgJiYgIXN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVG9rZW4gZmV0Y2ggZmFpbGVkICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzICsgJyB0aW1lcyBjb25zZWN1dGl2ZWx5IGFjcm9zcyBwbGF5ZXIgdHlwZXMg4oCUIHBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gLyBpbnRlZ3JpdHkgcm90YXRpb24gLyByYXRlIGxpbWl0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFjY2VzcyB0b2tlbiBmYWlsZWQgZm9yICcgKyByZWFsUGxheWVyVHlwZSArICc6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLnNldChyZWFsUGxheWVyVHlwZSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgPj0gMyAmJiAhc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZFRva2VuRmFpbHVyZVN0cmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVG9rZW4gZmV0Y2ggZmFpbGVkICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzICsgJyB0aW1lcyBjb25zZWN1dGl2ZWx5IGFjcm9zcyBwbGF5ZXIgdHlwZXMg4oCUIHBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gLyBpbnRlZ3JpdHkgcm90YXRpb24gLyByYXRlIGxpbWl0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKGVuY29kaW5nc00zdTgsIGN1cnJlbnRSZXNvbHV0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThUZXh0ID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobTN1OFRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllclR5cGUgPT0gRmFsbGJhY2tQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFja00zdTggPSBtM3U4VGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFoYXNBZFRhZ3MobTN1OFRleHQpICYmIChTaW11bGF0ZWRBZHNEZXB0aCA9PSAwIHx8IHBsYXllclR5cGVJbmRleCA+PSBTaW11bGF0ZWRBZHNEZXB0aCAtIDEpKSB8fCAoIWZhbGxiYWNrTTN1OCAmJiBwbGF5ZXJUeXBlSW5kZXggPj0gcGxheWVyVHlwZXNUb1RyeS5sZW5ndGggLSAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSAxICYmICFoYXNBZFRhZ3MobTN1OFRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldlR5cGUgPSBzdHJlYW1JbmZvLkxhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2VHlwZSAmJiBwcmV2VHlwZSAhPT0gcGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDeWNsZSBzd2l0Y2hlZCB0byBkaWZmZXJlbnQgY2xlYW4gdHlwZSAoJyArIHBsYXllclR5cGUgKyAnLCB3YXMgJyArIHByZXZUeXBlICsgJykgZHVyaW5nIGZyZWV6ZSDigJQgcmVjb3ZlcmVkIHdpdGhvdXQgcmVsb2FkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbWFyayBhcyBjeWNsZS1yZXNjdWVkIHdoZW4gd2UgQUNUVUFMTFkgc3dpdGNoZWQgcGxheWVyIHR5cGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXR1cmFsIHJlY292ZXJ5IChzYW1lIHR5cGUgYmVjYW1lIGNsZWFuKSBzdGlsbCBuZWVkcyB0aGUgZW5kLW9mLWJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbG9hZCB0byByZWZyZXNoIHRoZSBwbGF5ZXIgYnVmZmVyIOKAlCBza2lwcGluZyBpdCBsZWF2ZXMgdGhlIHBsYXllcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHVjayB3aXRoIGxvdyBidWZmZXIgYW5kIHRoZSBidWZmZXIgbW9uaXRvciB1bmFibGUgdG8gcmVjb3Zlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNhbWUgYmFja3VwIHR5cGUgKCcgKyBwbGF5ZXJUeXBlICsgJykgYmVjYW1lIGNsZWFuIGR1cmluZyBmcmVlemUg4oCUIG5hdHVyYWwgcmVjb3ZlcnknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBQbGF5ZXJUeXBlID0gcGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cE0zdTggPSBtM3U4VGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3MobTN1OFRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlKSBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZSA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuaGFzKHBsYXllclR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuYWRkKHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gKCcgKyBwbGF5ZXJUeXBlICsgJykgYWxzbyBoYXMgYWRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbHlDYWNoZWRQbGF5ZXJUeXBlIHx8IGlzRG9pbmdNaW5pbWFsUmVxdWVzdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3ljbGUgdGhyb3VnaCBhbGwgcGxheWVyIHR5cGVzIGxvb2tpbmcgZm9yIGEgY2xlYW4gYmFja3VwLiBPbmx5IGNvbW1pdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBhZC1sYWRlbiBiYWNrdXAgYXMgYSBsYXN0IHJlc29ydCB3aGVuIHdlJ3ZlIGV4aGF1c3RlZCBhbGwgb3B0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFIgIzg5IHByZXZpb3VzbHkgY29tbWl0dGVkIHRoZSBmaXJzdCBhZC1sYWRlbiB0eXBlIGltbWVkaWF0ZWx5IOKAlCB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlZCB0aGUgdjU4IGZyZWV6ZSByZWdyZXNzaW9uIChpc3N1ZSAjMTEyKSBiZWNhdXNlIHRoZSBzdHJpcCtyZWNvdmVyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHdvdWxkIGVuZ2FnZSBldmVuIHdoZW4gYSBjbGVhbiBhbHRlcm5hdGUgd2FzIGF2YWlsYWJsZSBvbiBhbm90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYXllciB0eXBlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQWRUYWdzKG0zdThUZXh0KSAmJiBwbGF5ZXJUeXBlSW5kZXggPj0gcGxheWVyVHlwZXNUb1RyeS5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgYmFja3VwIHBsYXllciB0eXBlcyBhZC1sYWRlbiDigJQgdGFraW5nICcgKyBwbGF5ZXJUeXBlICsgJyBhcyBsYXN0LXJlc29ydCBmYWxsYmFjayAoc3RyaXArcmVjb3ZlcnkgcGF0aCB3aWxsIGVuZ2FnZSknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gZmV0Y2ggZmFpbGVkIGZvciAnICsgcGxheWVyVHlwZSArICcgKHN0YXR1cyAnICsgc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyArICcpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSBlcnJvciBmb3IgJyArIHBsYXllclR5cGUgKyAnOiAnICsgZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNGcmVzaE0zdTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYmFja3VwTTN1OCAmJiBmYWxsYmFja00zdTgpIHsKICAgICAgICAgICAgICAgIC8vIERvbid0IGZhbGwgYmFjayB0byBhIHR5cGUgd2UndmUgYWxyZWFkeSBtYXJrZWQgY29udGFtaW5hdGVkIHRoaXMgYnJlYWsuCiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgZ3VhcmQsIHdoZW4gYWxsIFNvdXJjZSB0eXBlcyBnbyBhZC1sYWRlbiBtaWQtYnJlYWsgdGhlIGl0ZXJhdGlvbgogICAgICAgICAgICAgICAgLy8gZW5kcyB3aXRoIG5vIGNsZWFuIGNvbW1pdCBBTkQgZmFsbGJhY2tNM3U4IHN0aWxsIHBvaW50aW5nIGF0IEZhbGxiYWNrUGxheWVyVHlwZSdzCiAgICAgICAgICAgICAgICAvLyBhZC1sYWRlbiBtM3U4IOKAlCB3ZSdkIHNpbGVudGx5IHJlLWNvbW1pdCB0aGUgc2FtZSBjb250YW1pbmF0ZWQgc2l0ZSBvbiBldmVyeSBwb2xsCiAgICAgICAgICAgICAgICAvLyAobm8gIkJsb2NraW5nIGFkcyIgbG9nIGJlY2F1c2UgQWN0aXZlQmFja3VwUGxheWVyVHlwZSB1bmNoYW5nZWQpLCBhbmQgdGhlIHVzZXIKICAgICAgICAgICAgICAgIC8vIHNlZXMgdGhlIGZ1bGwgYWQgcG9kIHdpdGggbm8gaW5kaWNhdGlvbiBvZiBmYWlsdXJlLiBCZXR0ZXIgdG8gbGVhdmUgYmFja3VwTTN1OAogICAgICAgICAgICAgICAgLy8gbnVsbCBhbmQgbGV0IHRoZSAiTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIiBsb2cgZmlyZSBzbyBpdCdzIHZpc2libGUuCiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUgJiYgc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuaGFzKEZhbGxiYWNrUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyBmYWxsYmFjayB0byAnICsgRmFsbGJhY2tQbGF5ZXJUeXBlICsgJyDigJQgbWFya2VkIGNvbnRhbWluYXRlZCB0aGlzIGJyZWFrICgnICsgWy4uLnN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlXS5qb2luKCcsICcpICsgJyBhbGwgYWQtbGFkZW4pJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBGYWxsYmFja1BsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IGZhbGxiYWNrTTN1ODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTdGFsZS1jb21taXQgZ3VhcmQ6IG11bHRpcGxlIHByb2Nlc3NNM1U4IGNhbGxzIGNhbiBiZSBpbiBmbGlnaHQgY29uY3VycmVudGx5IGZvcgogICAgICAgICAgICAvLyB0aGUgc2FtZSBzdHJlYW1JbmZvIChvbmUgcGVyIG0zdTggcG9sbCkuIElmIHRoaXMgYmFja3VwIHNlYXJjaCBzdGFydGVkIGR1cmluZyB0aGUKICAgICAgICAgICAgLy8gYWQgYnJlYWsgYnV0IGNvbXBsZXRlZCBBRlRFUiBhIGxhdGVyIHBvbGwgYWxyZWFkeSByYW4gdGhlIGVuZC1vZi1icmVhayByZXNldAogICAgICAgICAgICAvLyAoSXNTaG93aW5nQWQgPSBmYWxzZSwgQWN0aXZlQmFja3VwUGxheWVyVHlwZSA9IG51bGwpLCBjb21taXR0aW5nIHRoZSBiYWNrdXAgaGVyZQogICAgICAgICAgICAvLyB3b3VsZCBvdmVyd3JpdGUgdGhlIGNsZWFyZWQgc3RhdGUgYW5kIGZlZWQgc3RhbGUgcGxheWxpc3QgZGF0YSB0byB0aGUgcGxheWVyLAogICAgICAgICAgICAvLyBjYXVzaW5nIGJ1ZmZlciByZWNvbmNpbGlhdGlvbiBmYWlsdXJlcyBhbmQgYSBmb3JjZWQgcmVsb2FkLiBDaGVjayBJc1Nob3dpbmdBZAogICAgICAgICAgICAvLyBoZXJlIHRvIGRpc2NhcmQgc3RhbGUgcmVzdWx0cy4KICAgICAgICAgICAgaWYgKGJhY2t1cE0zdTggJiYgc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGJhY2t1cE0zdTg7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUgIT0gYmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQWN0aXZlQmFja3VwUGxheWVyVHlwZSA9IGJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlUXVhbGl0eVR5cGVzID0gWydlbWJlZCcsICdzaXRlJywgJ3BvcG91dCddOwogICAgICAgICAgICAgICAgICAgIC8vIE5ldmVyIHBpbiAnYXV0b3BsYXknIOKAlCBtdXN0IHN0YXkgYXQgdGhlIGxhc3QgcG9zaXRpb24gaW4gcGxheWVyVHlwZXNUb1RyeQogICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBpdGVyYXRpb24tZW5kIGxhc3QtcmVzb3J0IGJyYW5jaCBjb21taXRzIGl0IHdoZW4gYWxsIFNvdXJjZSB0eXBlcwogICAgICAgICAgICAgICAgICAgIC8vIGFyZSBhZC1sYWRlbiAoaW50ZW5kZWQgMzYwcCBjbGVhbiBmYWxsYmFjaykuIFBpbm5pbmcgd291bGQgbW92ZSBpdCB0bwogICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIDAgYW5kIGEgZGlmZmVyZW50IGFkLWxhZGVuIFNvdXJjZSB0eXBlIHdvdWxkIGJlIGNvbW1pdHRlZCBpbnN0ZWFkLgogICAgICAgICAgICAgICAgICAgIGlmICgoUGluQmFja3VwUGxheWVyVHlwZSAmJiBiYWNrdXBQbGF5ZXJUeXBlICE9PSAnYXV0b3BsYXknKSB8fCBzb3VyY2VRdWFsaXR5VHlwZXMuaW5jbHVkZXMoYmFja3VwUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtBRCBERUJVR10gQmxvY2tpbmckeyhzdHJlYW1JbmZvLklzTWlkcm9sbCA/ICcgbWlkcm9sbCAnIDogJyAnKX1hZHMgKCR7YmFja3VwUGxheWVyVHlwZX0pIOKAlCBiYWNrdXAgZm91bmQgaW4gJHtEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnR9bXMke2JhY2t1cENvbGRUb2tlbkZldGNoZXMgPiAwID8gYCAoY29sZCBjYWNoZTogJHtiYWNrdXBDb2xkVG9rZW5GZXRjaGVzfSB0b2tlbiBmZXRjaCR7YmFja3VwQ29sZFRva2VuRmV0Y2hlcyA+IDEgPyAnZXMnIDogJyd9KWAgOiAnICh3YXJtIGNhY2hlKSd9YCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5VGllciA9IGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgPyAnMzYwcCcgOiAnU291cmNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1lc2NhcGUgYmFja3VwOiAnICsgYmFja3VwUGxheWVyVHlwZSArICcgKCcgKyBxdWFsaXR5VGllciArICcpIOKAlCByZWNvdmVyZWQgZnJvbSBzdGlja3ktcGF0aCBmcmVlemUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgJiYgUHJlZmVyTG93UXVhbGl0eUJhY2t1cCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VUcmllZCA9IHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlPy5zaXplIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUcmllZCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQXV0b3BsYXkgYmFja3VwIGNvbW1pdHRlZCDigJQgMzYwcCBwaW5uZWQgZnJvbSBwcmlvciBicmVhayAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhc3QtYXV0b3BsYXkgd29uIHdpdGhvdXQgdGVzdGluZyBTb3VyY2UtdGllciDigJQgaW5jcmVtZW50IHJlLXByb2JlIGNvdW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFzdEF1dG9wbGF5Q29uc2VjdXRpdmUgPSAoc3RyZWFtSW5mby5GYXN0QXV0b3BsYXlDb25zZWN1dGl2ZSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvcGxheSBiYWNrdXAgY29tbWl0dGVkIOKAlCAzNjBwIGZhbGxiYWNrIGFmdGVyICcgKyBzb3VyY2VUcmllZCArICcgU291cmNlIHR5cGUocykgYWQtbGFkZW4gKFByZWZlckxvd1F1YWxpdHlCYWNrdXApJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFzdEF1dG9wbGF5Rmlyc3RUcnkgc2lnbmFsOiBvbmx5IGZsYWcgU1NBSS11bmlmb3JtIHdoZW4gNCBTb3VyY2UgdHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VyZSBwcm9iZWQgYW5kIGFsbCBjb250YW1pbmF0ZWQuIFBpbm5lZC1mcm9tLXByaW9yLWJyZWFrIChzb3VyY2VUcmllZD09MCkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBhZGQgbmV3IGluZm8uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGYXN0QXV0b3BsYXlGaXJzdFRyeSAmJiBzb3VyY2VUcmllZCA+PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RCcmVha1VzZWRFc2NhcGVIYXRjaCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdWxsIHByb2JlIGp1c3QgcmFuIOKAlCByZXNldCByZS1wcm9iZSBjb3VudGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhc3RBdXRvcGxheUNvbnNlY3V0aXZlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRmFzdEF1dG9wbGF5Rmlyc3RUcnkgJiYgYmFja3VwUGxheWVyVHlwZSAhPT0gJ2F1dG9wbGF5JykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBTb3VyY2UtdGllciB3b24g4oCUIGNoYW5uZWwgcmVjb3ZlcmVkLCByZXNldCBzaWduYWwgKyByZS1wcm9iZSBjb3VudGVyLgogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RCcmVha1VzZWRFc2NhcGVIYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhc3RBdXRvcGxheUNvbnNlY3V0aXZlID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFja3VwTTN1OCAmJiAhc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRGlzY2FyZGVkIHN0YWxlIGJhY2t1cCBjb21taXQgKCcgKyBiYWNrdXBQbGF5ZXJUeXBlICsgJywgJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zKSDigJQgYnJlYWsgZW5kZWQgZHVyaW5nIHNlYXJjaCcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIOKAlCBhZHMgbWF5IGxlYWsuIFRyaWVkOiAnICsgcGxheWVyVHlwZXNUb1RyeS5zbGljZShzdGFydEluZGV4KS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPOiBJbXByb3ZlIGhldmMgc3RyaXBwaW5nLiBJdCBzaG91bGQgYWx3YXlzIHN0cmlwIHdoZW4gdGhlcmUgaXMgYSBjb2RlYyBtaXNtYXRjaCAoYm90aCB3YXlzKQogICAgICAgICAgICBjb25zdCBzdHJpcEhldmMgPSBpc0hldmMgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTg7CiAgICAgICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCB8fCBzdHJpcEhldmMpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgc3RyaXBIZXZjLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghYmFja3VwTTN1OCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc3RyaXBwaW5nIGRpc2FibGVkIGFuZCBubyBiYWNrdXAg4oCUIGFkcyBXSUxMIHNob3cnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBMb2cgcmVsb2FkIG91dGNvbWUgb24gdGhlIHBvbGwgYWZ0ZXIgZWFybHkgcmVsb2FkIHRyaWdnZXJlZAogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpICYmIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdDogcGFydGlhbCDigJQgc29tZSBsaXZlIHNlZ21lbnRzIHJldHVybmVkJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCByZXN1bHQ6IGNsZWFuIOKAlCBmcmVlemUgZW5kZWQnKTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0cmlnZ2VyIGZsYWcgc28gc3Vic2VxdWVudCBmcmVlemVzIHdpdGhpbiB0aGUgc2FtZSBwb2QgY2FuIHJlLWZpcmUgKGJvdW5kZWQgYnkgRWFybHlSZWxvYWRDb3VudC9Qb2RMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0OiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemU6IGlmIHdlJ3ZlIGJlZW4gbG9vcGluZyByZWNvdmVyeSBzZWdtZW50cwogICAgICAgICAgICAvLyBmb3IgTisgcG9sbHMgKH5OeDJzKSwgdHJpZ2dlciBhIHJlbG9hZCB0byBhdHRlbXB0IGZyZXNoIGNvbnRlbnQuIEJvdW5kZWQgdG8gb25lCiAgICAgICAgICAgIC8vIHJlbG9hZCBwZXIgYWQgaW4gdGhlIHBvZCAoZS5nLiAyLWFkIHBvZCA9IHVwIHRvIDIgZWFybHkgcmVsb2FkcykuCiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IG1heEVhcmx5UmVsb2FkcyA9IHJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IG1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24gKyAnIFsnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ICsgJy8nICsgbWF4RWFybHlSZWxvYWRzICsgJ10nKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAvLyBNYXJrIGZpcnN0IGNhbmRpZGF0ZS1lbmQgdGltZXN0YW1wIG9uIHRoZSBmaXJzdCBjbGVhbiBwb2xsIHNlZW4gdGhpcyBicmVhaywKICAgICAgICAgICAgLy8gc28gdGhlIHNsb3ctcGF0aCBtYXgtd2FpdCBnYXRlIGJlbG93IGNhbiBmaXJlIGV2ZW4gaWYgc3Vic2VxdWVudCBwb2xscyBib3VuY2UKICAgICAgICAgICAgLy8gYmFjayB0byBhZC1tYXJrZWQuIFRoZSBib3VuY2UtdG9sZXJhbnQgaGF2ZUFkVGFncyByZXNldCBrZWVwcyB0aGlzIGFsaXZlCiAgICAgICAgICAgIC8vIGFjcm9zcyBzaG9ydCBmbGlwcy4gTWlycm9ycyBUVFYtQUIgdjYuNi43ICMxLgogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cmVhbUluZm8uQ2xlYW5QbGF5bGlzdENvdW50Kys7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHBsYXlsaXN0IGhhcyBsaXZlIHNlZ21lbnRzIOKAlCBpZiBub3QsIGJhY2t1cCBzdHJlYW0gaXMgZGVhZAogICAgICAgICAgICBjb25zdCBoYXNMaXZlU2VnbWVudHMgPSB0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpOwogICAgICAgICAgICAvLyBJbmRlcGVuZGVudCBzbG93LXBhdGggbWF4LXdhaXQgZXNjYWxhdGlvbiDigJQgZW5kcyB0aGUgdmlzaWJsZSBhZCBjeWNsZSBldmVuIHdoZW4KICAgICAgICAgICAgLy8gbWFya2VyIGJvdW5jaW5nIGtlZXBzIENsZWFuUGxheWxpc3RDb3VudCBiZWxvdyB0aHJlc2hvbGQuIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllcgogICAgICAgICAgICAvLyBjb3VsZCBiZSB3ZWRnZWQgb24gYmFja3VwIGluZGVmaW5pdGVseSBvbiBjaGFubmVscyB3aGVyZSBUd2l0Y2ggZmxpcHMgbWFya2VycwogICAgICAgICAgICAvLyBpbi9vdXQgZmFzdGVyIHRoYW4gMyBjb25zZWN1dGl2ZSBjbGVhbiBwb2xscyBjYW4gbGFuZC4gTWlycm9ycyBUVFYtQUIgdjYuNi43ICM0CiAgICAgICAgICAgIC8vICgiRGVjb3VwbGVkIFNsb3ctUGF0aCBSZWNvdmVyeSBmcm9tIENsZWFuLUNvdW50IikuCiAgICAgICAgICAgIGNvbnN0IGFkRW5kTWF4V2FpdE1zID0gMTIwMDA7CiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRTaW5jZUNhbmRpZGF0ZSA9IERhdGUubm93KCkgLSBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0OwogICAgICAgICAgICBjb25zdCBzbG93UGF0aFJlYWR5ID0gc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA+IDAgJiYgZWxhcHNlZFNpbmNlQ2FuZGlkYXRlID49IGFkRW5kTWF4V2FpdE1zOwogICAgICAgICAgICAvLyBSZXF1aXJlIDMgY29uc2VjdXRpdmUgY2xlYW4gcG9sbHMgYmVmb3JlIGRlY2xhcmluZyBhZC1lbmQuIFByZXZpb3VzbHkgb25seSAxCiAgICAgICAgICAgIC8vIHdoZW4gTnVtU3RyaXBwZWRBZFNlZ21lbnRzID09PSAwIChDU0FJLW9ubHkgLyBiYWNrdXAtc3dhcCBwYXRoKSBhbmQgMiBvdGhlcndpc2UsCiAgICAgICAgICAgIC8vIHdoaWNoIGxldCBicmllZiBjbGVhbiB3aW5kb3dzIGR1cmluZyBvbmdvaW5nIGJyZWFrcyBmbGlwIElzU2hvd2luZ0FkIGZhbHNlCiAgICAgICAgICAgIC8vIHByZW1hdHVyZWx5IG9uIFNTQUktdW5pZm9ybSBjaGFubmVscy4gVFRWLUFCIGhpdCB0aGUgc2FtZSBmYWxzZS1wb3NpdGl2ZSBhdCAyCiAgICAgICAgICAgIC8vIHByb2JlcyBhbmQgYnVtcGVkIHRvIDMgaW4gdjYuNi43ICgiQWQtRW5kIFJlLUVudHJ5IFN0YWJpbGl0eSIpIOKAlCBUd2l0Y2ggY2FuCiAgICAgICAgICAgIC8vIHNlcnZlIGEgY2xlYW4gcGxheWxpc3QgbWlkLWJyZWFrIGJlZm9yZSByZS1pbmplY3RpbmcgbWFya2VycywgYW5kIDIgcG9sbHMKICAgICAgICAgICAgLy8gKH40cykgd2Fzbid0IGFsd2F5cyBlbm91Z2ggdG8gcmlkZSBvdXQgdGhlIGJvdW5jZS4KICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ2xlYW5QbGF5bGlzdENvdW50ID49IDMgfHwgIWhhc0xpdmVTZWdtZW50cyB8fCBzbG93UGF0aFJlYWR5KSB7CiAgICAgICAgICAgICAgICBpZiAoc2xvd1BhdGhSZWFkeSAmJiBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA8IDMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTbG93LXBhdGggYWQtZW5kIGVzY2FsYXRpb24g4oCUICcgKyAoc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50IHx8IDApICsgJyBtYXJrZXIgYm91bmNlcywgJyArIChlbGFwc2VkU2luY2VDYW5kaWRhdGUgLyAxMDAwKS50b0ZpeGVkKDEpICsgJ3Mgc2luY2UgZmlyc3QgY2xlYW4gcG9sbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFoYXNMaXZlU2VnbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGhhcyBubyBsaXZlIHNlZ21lbnRzIOKAlCBmb3JjaW5nIGltbWVkaWF0ZSByZWxvYWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGFkQnJlYWtEdXJhdGlvblNlYyA9IHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCkgLyAxMDAwKS50b0ZpeGVkKDEpIDogJz8nOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmluaXNoZWQgYmxvY2tpbmcgYWRzIOKAlCBzdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLCBkdXJhdGlvbjogJyArIGFkQnJlYWtEdXJhdGlvblNlYyArICdzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkSW5mbyA9IHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPyAnLCBlYXJseSByZWxvYWQgYXQgcG9sbCAnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF0UG9sbCA6ICcnOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhbGxDbG9ja0ZyZWV6ZSA9IHN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0ID8gKChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5GcmVlemVTdGFydGVkQXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHdhbGwtY2xvY2snIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIGJyZWFrIHN0YXRzOiAnICsgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgKyAnIGFsbC1zdHJpcHBlZCBwb2xscywgZnJlZXplIGR1cmF0aW9uOiAnICsgd2FsbENsb2NrRnJlZXplICsgcmVsb2FkSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBoYWRTdHJpcHBlZFNlZ21lbnRzID0gc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPiAwOwogICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbCBhZHMKICAgICAgICAgICAgICAgIC8vIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICBpZiAoIWhhZFN0cmlwcGVkU2VnbWVudHMgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhZFN0cmlwcGVkU2VnbWVudHMgfHwgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgaXMgc3ltbWV0cmljIHdpdGggdGhlIGluY3JlbWVudCBndWFyZCBhYm92ZSDigJQgYW55IHBvc2l0aXZlICJicmVhawogICAgICAgICAgICAgICAgICAgIC8vIHdhcyBoYW5kbGVkIGNsZWFubHkiIHNpZ25hbCByZXNldHMgdGhlIGZhbHNlLXBvc2l0aXZlIGhpc3RvcnkuIFByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHN0cmlwcGVkPjAgcmVzZXQgdGhlIGNvdW50ZXIsIHdoaWNoIGxldCBzdGFsZSBzdXNwaWNpb3VzIGhpc3RvcnkKICAgICAgICAgICAgICAgICAgICAvLyBibGVlZCBhY3Jvc3MgbGVnaXRpbWF0ZWx5LWhhbmRsZWQgYmFja3VwLXN3YXAgYnJlYWtzICgwIHN0cmlwcGVkICsgcmVhbAogICAgICAgICAgICAgICAgICAgIC8vIGFkIGF0dHJzKSBhbmQgdHJpZ2dlciB0aGUgd2FybmluZyBvbiBwYXJ0aWFsbHktc3RhbGUgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU2hvd2luZ0FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzPy5jbGVhcj8uKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlNwb29mZWRBZElkcz8uY2xlYXI/LigpOy8vIE5ldyBicmVhayA9IGZyZXNoIGFkLXNwb29mIGRlZHVwIHNldAogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5GYWlsZWRCYWNrdXBQbGF5ZXJUeXBlcz8uY2xlYXI/LigpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlKSBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5jbGVhcigpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRDb250YW1SZW9yZGVyVGhpc0JyZWFrID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0ID0gMDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQWRFbmRCb3VuY2VDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRGYXN0QXV0b3BsYXlUaGlzQnJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkRmFzdEF1dG9wbGF5UmVwcm9iZVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gQ1NBSS1vbmx5IGFkIGJyZWFrOiBubyBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkIOKAlCBza2lwIHJlbG9hZCBlbnRpcmVseS4KICAgICAgICAgICAgICAgIGlmICghaGFkU3RyaXBwZWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUktb25seSBhZCBicmVhayAoc3RyaXBwZWQgMCkg4oCUIGNsZWFyaW5nIGJhY2t1cCB3aXRob3V0IHBsYXllciBhY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb246IGlmIEFOWSBiYWNrdXAgd2FzIGNvbW1pdHRlZCBkdXJpbmcgdGhpcyBicmVhayAoZXNjYXBlIGhhdGNoCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgY3ljbGUgcmVzY3VlIHRoYXQgZGlkbid0IG1lZXQgY3ljbGVSZXNjdWVkQ2xlYW5seSBjcml0ZXJpYSksIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIGJ1ZmZlciBoYXMgYWNjdW11bGF0ZWQgbWl4ZWQtc291cmNlIHNlZ21lbnRzIChiYWNrdXAtZmV0Y2hlZAogICAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbHRlcm5hdGUgcGxheWVyLXR5cGUgYWNjZXNzIHRva2VuICsgbmF0aXZlLWZldGNoZWQpLiBNaXhpbmcgY2FuCiAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgYXVkaW8vdmlkZW8gdHJhY2sgdGltZXN0YW1wcyB0byBkaXZlcmdlLCBhbmQgd2l0aG91dCBhIHJlbG9hZCB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBkcmlmdCBjb21wb3VuZHMgYWNyb3NzIHN1YnNlcXVlbnQgZXNjYXBlLWhhdGNoIGJyZWFrcy4gRm9yY2UgYSBoYXJkIHJlbG9hZAogICAgICAgICAgICAgICAgICAgIC8vIHRvIGZsdXNoIHRoZSBNZWRpYVNvdXJjZSBidWZmZXIgKyByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9wbGF5ICgzNjBwKSBzcGVjaWZpY2FsbHksIHRoZSByZWxvYWQgYWxzbyByZXN0b3JlcyBTb3VyY2UKICAgICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IChhdXRvcGxheS1zY29wZWQgdG9rZW4gb25seSBzZXJ2ZXMgMzYwcCB2YXJpYW50IGxhZGRlcikuCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBdXRvcGxheSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGlzQXV0b3BsYXkgPyAnYXV0b3BsYXkgKDM2MHApIOKAlCByZXN0b3JpbmcgU291cmNlIHF1YWxpdHknIDogc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSArICcg4oCUIGZsdXNoaW5nIE1lZGlhU291cmNlIHRvIHByZXZlbnQgQS9WIGRlc3luYyBhY2N1bXVsYXRpb24nOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFbmQtb2YtYnJlYWsgcmVsb2FkOiAnICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMpIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMucHVzaChEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyBrZXk6ICdSZWxvYWRQbGF5ZXInLCBraW5kOiAnZWFybHknIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBdXRvLWVzY2FsYXRlIGNvb2xkb3duOiBpZiAzKyByZWxvYWRzIGluIGxhc3QgNSBtaW4sIHRyaXBsZSB0aGUgY29vbGRvd24KICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzKSBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMgPSBbXTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5maWx0ZXIodCA9PiBEYXRlLm5vdygpIC0gdCA8IDMwMDAwMCk7CiAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWRzID0gc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzLmZpbHRlcih0ID0+IERhdGUubm93KCkgLSB0IDwgMzAwMDAwKS5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVDb29sZG93biA9IHJlY2VudFJlbG9hZHMgPj0gMyA/IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDMgOiBSZWxvYWRDb29sZG93blNlY29uZHM7CiAgICAgICAgICAgICAgICBjb25zdCB0b29Tb29uU2luY2VMYXN0UmVsb2FkID0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkICYmIChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkKSA8IChlZmZlY3RpdmVDb29sZG93biAqIDEwMDApOwogICAgICAgICAgICAgICAgLy8gU2tpcCBlbmQtb2YtYnJlYWsgcmVsb2FkIHdoZW4gY3ljbGUgcmVzY3VlIGhhbmRsZWQgdGhlIGJyZWFrIGNsZWFubHk6CiAgICAgICAgICAgICAgICAvLyBhIGZyZWV6ZSBvZiDiiaQyIHBvbGxzICh+NHMpIHdhcyByZXNvbHZlZCBieSBzd2l0Y2hpbmcgdG8gYSBjbGVhbiBiYWNrdXAsCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gZWFybHkgcmVsb2FkIHdhcyBuZWVkZWQuIFRoZSBwbGF5ZXIgaXMgb24gYSBoZWFsdGh5IGJhY2t1cCBzdHJlYW0KICAgICAgICAgICAgICAgIC8vIOKAlCByZWxvYWRpbmcganVzdCB0byByZXR1cm4gdG8gdGhlIGNhbm9uaWNhbCBwbGF5ZXIgdHlwZSBjYXVzZXMgYW4gdW5uZWNlc3NhcnkKICAgICAgICAgICAgICAgIC8vIH4xLTJzIGxvYWRpbmcgY2lyY2xlLgogICAgICAgICAgICAgICAgY29uc3QgY3ljbGVSZXNjdWVkQ2xlYW5seSA9IHN0cmVhbUluZm8uQ3ljbGVSZXNjdWVkVGhpc0JyZWFrICYmCiAgICAgICAgICAgICAgICAgICAgKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzIHx8IDApIDw9IDIgJiYKICAgICAgICAgICAgICAgICAgICAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApID09PSAwOwogICAgICAgICAgICAgICAgaWYgKGN5Y2xlUmVzY3VlZENsZWFubHkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDeWNsZSByZXNjdWUgaGFuZGxlZCB0aGUgYnJlYWsgY2xlYW5seSDigJQgc2tpcHBpbmcgZW5kLW9mLWJyZWFrIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUG9zdC1hZCByZWxvYWQgYnlwYXNzZXMgY29vbGRvd246IGl0J3MgYSBidWZmZXIgZmx1c2ggdGllZCB0byBuYXR1cmFsIGJyZWFrCiAgICAgICAgICAgICAgICAvLyBlbmQsIG5vdCBhIGNhc2NhZGUtcmlzayByZXRyeS4gVGhlIGFkIGJyZWFrIGN5Y2xlIGl0c2VsZiByYXRlLWxpbWl0cyB0aGlzCiAgICAgICAgICAgICAgICAvLyBwYXRoIChvbmNlIHBlciBicmVhaykuIENvb2xkb3duIHN0aWxsIGdhdGVzIGJ1ZmZlci1tb25pdG9yIGFuZCBvdGhlcgogICAgICAgICAgICAgICAgLy8gY2FzY2FkZS1yaXNrIHBhdGhzIHRoYXQgY2FuIGZpcmUgcmVwZWF0ZWRseSBpbi1icmVhay4KICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlbG9hZCA9IHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCB8fCAoUmVsb2FkUGxheWVyQWZ0ZXJBZCAmJiBoYWRTdHJpcHBlZFNlZ21lbnRzICYmICFjeWNsZVJlc2N1ZWRDbGVhbmx5KTsKICAgICAgICAgICAgICAgIGlmIChzaG91bGRSZWxvYWQpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMucHVzaChEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnUmVsb2FkUGxheWVyJywKICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2Vhcmx5JwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAodG9vU29vblNpbmNlTGFzdFJlbG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIGxhc3QgcmVsb2FkIHdhcyAnICsgKChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkKSAvIDEwMDApLnRvRml4ZWQoMCkgKyAncyBhZ28gKGNvb2xkb3duOiAnICsgZWZmZWN0aXZlQ29vbGRvd24gKyAncycgKyAocmVjZW50UmVsb2FkcyA+PSAzID8gJywgYXV0by1lc2NhbGF0ZWQgZnJvbSAnICsgcmVjZW50UmVsb2FkcyArICcgcmVsb2FkcyBpbiA1bWluJyA6ICcnKSArICcpJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnUGF1c2VSZXN1bWVQbGF5ZXInCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9Ly8gZW5kIGVsc2UgKG5vbi1DU0FJIHBhdGgpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICBudW1TdHJpcHBlZEFkU2VnbWVudHM6IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzLAogICAgICAgICAgICBhY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKQogICAgICAgICAgICAubWFwKHggPT4gewogICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB4LnN1YnN0cmluZygwLCBpZHgpOwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB4LnN1YnN0cmluZyhpZHggKyAxKTsKICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXTsKICAgICAgICAgICAgfSkpOwogICAgfQogICAgLy8gUmVxdWVzdCBhIHBsYXliYWNrIGFjY2VzcyB0b2tlbiBmcm9tIFR3aXRjaCBHUUwgdXNpbmcgdGhlIGdpdmVuIHBsYXllciB0eXBlCiAgICBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbihjaGFubmVsTmFtZSwgcGxheWVyVHlwZSkgewogICAgICAgIGNvbnN0IGJvZHkgPSB7CiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdQbGF5YmFja0FjY2Vzc1Rva2VuJywKICAgICAgICAgICAgdmFyaWFibGVzOiB7CiAgICAgICAgICAgICAgICBpc0xpdmU6IHRydWUsCiAgICAgICAgICAgICAgICBsb2dpbjogY2hhbm5lbE5hbWUsCiAgICAgICAgICAgICAgICBpc1ZvZDogZmFsc2UsCiAgICAgICAgICAgICAgICB2b2RJRDogIiIsCiAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlOiBwbGF5ZXJUeXBlLAogICAgICAgICAgICAgICAgcGxhdGZvcm06IHBsYXllclR5cGUgPT0gJ2F1dG9wbGF5JyA/ICdhbmRyb2lkJyA6ICd3ZWInCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV4dGVuc2lvbnM6IHsKICAgICAgICAgICAgICAgIHBlcnNpc3RlZFF1ZXJ5OiB7CiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjoxLAogICAgICAgICAgICAgICAgICAgIHNoYTI1Nkhhc2g6ImVkMjMwYWExZTMzZTA3ZWViYjg5Mjg1MDQ1ODNkYTc4YTUxNzM5ODlmYWRmYjFhYzk0YmUwNmEwNGYzY2RiZTkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBncWxSZXF1ZXN0KGJvZHkpOwogICAgfQogICAgLy8gU2VuZCBhIEdRTCByZXF1ZXN0IHRvIFR3aXRjaCB2aWEgdGhlIG1haW4gdGhyZWFkICh3b3JrZXJzIGNhbid0IG1ha2UgY3JlZGVudGlhbGVkIHJlcXVlc3RzKQogICAgZnVuY3Rpb24gZ3FsUmVxdWVzdChib2R5KSB7CiAgICAgICAgaWYgKCFHUUxEZXZpY2VJRCkgewogICAgICAgICAgICBHUUxEZXZpY2VJRCA9ICcnOwogICAgICAgICAgICBjb25zdCBkY2hhcmFjdGVycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBjb25zdCBkY2hhcmFjdGVyc0xlbmd0aCA9IGRjaGFyYWN0ZXJzLmxlbmd0aDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CiAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCArPSBkY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGNoYXJhY3RlcnNMZW5ndGgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgaGVhZGVycyA9IHsKICAgICAgICAgICAgJ0NsaWVudC1JRCc6IENsaWVudElELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBHUUxEZXZpY2VJRCwKICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBBdXRob3JpemF0aW9uSGVhZGVyLAogICAgICAgICAgICAuLi4oQ2xpZW50SW50ZWdyaXR5SGVhZGVyICYmIHsnQ2xpZW50LUludGVncml0eSc6IENsaWVudEludGVncml0eUhlYWRlcn0pLAogICAgICAgICAgICAuLi4oQ2xpZW50VmVyc2lvbiAmJiB7J0NsaWVudC1WZXJzaW9uJzogQ2xpZW50VmVyc2lvbn0pLAogICAgICAgICAgICAuLi4oQ2xpZW50U2Vzc2lvbiAmJiB7J0NsaWVudC1TZXNzaW9uLUlkJzogQ2xpZW50U2Vzc2lvbn0pCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpOwogICAgICAgICAgICBjb25zdCBmZXRjaFJlcXVlc3QgPSB7CiAgICAgICAgICAgICAgICBpZDogcmVxdWVzdElkLAogICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9ncWwudHdpdGNoLnR2L2dxbCcsCiAgICAgICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVxdWVzdElkKSkgewogICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0SWQpOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZldGNoUmVxdWVzdCB0aW1lZCBvdXQnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDE1MDAwKTsKICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuc2V0KHJlcXVlc3RJZCwgewogICAgICAgICAgICAgICAgcmVzb2x2ZSwKICAgICAgICAgICAgICAgIHJlamVjdCwKICAgICAgICAgICAgICAgIHRpbWVvdXRJZAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXF1ZXN0JywKICAgICAgICAgICAgICAgIHZhbHVlOiBmZXRjaFJlcXVlc3QKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBsZXQgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICBsZXQgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOwogICAgbGV0IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOwogICAgZnVuY3Rpb24gc3RhcnREcmlmdENvcnJlY3Rpb24odmlkZW9FbGVtZW50KSB7CiAgICAgICAgaWYgKERyaWZ0Q29ycmVjdGlvblJhdGUgPD0gMSkgcmV0dXJuOwogICAgICAgIGlmIChkcmlmdENhdGNoVXBJbnRlcnZhbCkgeyBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOyB9CiAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgIHZpZGVvRWxlbWVudC5wbGF5YmFja1JhdGUgPSBEcmlmdENvcnJlY3Rpb25SYXRlOwogICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIERyaWZ0IGNvcnJlY3Rpb246IGNhdGNoaW5nIHVwIGF0ICcgKyBEcmlmdENvcnJlY3Rpb25SYXRlICsgJ3gnKTsKICAgICAgICBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICBpZiAodmlkICYmIHZpZC5idWZmZXJlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZC5idWZmZXJlZC5lbmQodmlkLmJ1ZmZlcmVkLmxlbmd0aCAtIDEpIC0gdmlkLmN1cnJlbnRUaW1lIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkLnBsYXliYWNrUmF0ZSA9IDEuMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRHJpZnQgY29ycmVjdGlvbiBjb21wbGV0ZSDigJQgcmVzdW1lZCBub3JtYWwgcGxheWJhY2sgc3BlZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICB9LCA1MDApOwogICAgICAgIGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdHJ5IHsgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IDEuMDsgfSBjYXRjaCB7fQogICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgICAgICBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsKICAgICAgICB9LCAzMDAwMCk7CiAgICB9CiAgICBjb25zdCBwbGF5ZXJCdWZmZXJTdGF0ZSA9IHsKICAgICAgICBjaGFubmVsTmFtZTogbnVsbCwKICAgICAgICBoYXNTdHJlYW1TdGFydGVkOiBmYWxzZSwKICAgICAgICBwb3NpdGlvbjogMCwKICAgICAgICBidWZmZXJlZFBvc2l0aW9uOiAwLAogICAgICAgIGJ1ZmZlckR1cmF0aW9uOiAwLAogICAgICAgIG51bVNhbWU6IDAsCiAgICAgICAgZml4QXR0ZW1wdHM6IDAsCiAgICAgICAgbGFzdEZpeFRpbWU6IDAsCiAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgIGxhc3RCYWNrdXBTd2l0Y2hBdDogMCwKICAgICAgICBsYXN0UmVsb2FkQXQ6IDAsCiAgICAgICAgcmVjb3ZlcnlSZWxvYWRVc2VkOiBmYWxzZSwKICAgICAgICB1c2VyUGF1c2VJbnRlbnQ6IGZhbHNlLAogICAgICAgIGxvZ2dlZFBhdXNlSW50ZW50OiBmYWxzZSwKICAgICAgICB3ZUp1c3RQYXVzZWQ6IDAsCiAgICAgICAgaW5BZEJyZWFrOiBmYWxzZSwKICAgICAgICB2YWZ0RXZlclVubXV0ZWQ6IGZhbHNlCiAgICB9OwogICAgLy8gUG9sbCB0aGUgcGxheWVyIHN0YXRlIHRvIGRldGVjdCBhbmQgZml4IGJ1ZmZlcmluZyBjYXVzZWQgYnkgYWQgc3RyZWFtIHN3aXRjaGluZwogICAgZnVuY3Rpb24gbW9uaXRvclBsYXllckJ1ZmZlcmluZygpIHsKICAgICAgICAvLyBGcmVzaCBwbGF5ZXIgbG9va3VwIGV2ZXJ5IHRpY2sgKGF2b2lkcyBzdGFsZSByZWYgd2hlbiBUd2l0Y2ggcmVzdGFydHMgaXRzIG93biBwbGF5ZXIpCiAgICAgICAgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgICAgIGlmIChwbGF5ZXJBbmRTdGF0ZSAmJiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIgJiYgcGxheWVyQW5kU3RhdGUuc3RhdGUpIHsKICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBsYXllckFuZFN0YXRlLnN0YXRlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgIXZpZGVvLl9fdGFzSW50ZW50SG9va2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uX190YXNJbnRlbnRIb29rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCB8fCAoRGF0ZS5ub3coKSAtIHBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCkgPiAyMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudXNlclBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcucGxheWVyOwogICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnN0YXRlOwogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXIuY29yZSkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnICYmICFwbGF5ZXIuaXNQYXVzZWQoKSAmJiAhcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKT8uZW5kZWQgJiYgKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50KCk/LnJlYWR5U3RhdGUgPz8gMCkgPj0gMSAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA8PSBEYXRlLm5vdygpIC0gUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgJiYgIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdFJlbG9hZEF0ID49IDE1MDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThVcmwgPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG0zdThVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaCA9IG0zdThVcmwubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RhcnQgPSBtM3U4VXJsLmluZGV4T2YoJz8nLCBsYXN0U2xhc2gpOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBtM3U4VXJsLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxLCBxdWVyeVN0YXJ0ICE9PSAtMSA/IHF1ZXJ5U3RhcnQgOiB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lPy5lbmRzV2l0aCgnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gZmlsZU5hbWUuc2xpY2UoMCwgLTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSAhPSBjaGFubmVsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuZ2V0U3RhdGUoKSA9PT0gJ1BsYXlpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHBsYXllci5jb3JlPy5zdGF0ZT8ucG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyZWRQb3NpdGlvbiA9IHBsYXllci5jb3JlPy5zdGF0ZT8uYnVmZmVyZWRQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXJEdXJhdGlvbiA9IHBsYXllci5nZXRCdWZmZXJEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIC8vIHZpZGVvLmN1cnJlbnRUaW1lIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGFjdHVhbCBwbGF5YmFjayBwcm9ncmVzcyDigJQKICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZS5wb3NpdGlvbiB1cGRhdGVzIGluIGJhdGNoZXMgb24gcmVsb2FkLWhlYXZ5IGNoYW5uZWxzIGFuZCBjYW4KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXIgZnJvemVuIGZvciB+MTJzIHdoaWxlIHRoZSB2aWRlbyBlbGVtZW50IGFkdmFuY2VzIHNtb290aGx5LgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvRWwgPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlkZW9DdXJyZW50VGltZSA9IHZpZGVvRWw/LmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICYmIGJ1ZmZlcmVkUG9zaXRpb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGNvdWxkIGJlIGltcHJvdmVkLiBJdCBjdXJyZW50bHkgbGV0cyB0aGUgcGxheWVyIGZ1bGx5IGVhdCB0aGUgZnVsbCBidWZmZXIgYmVmb3JlIGl0IHRyaWdnZXJzIHBhdXNlL3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgYnVmZmVyLXN0YWxsIGNoZWNrIHdoaWxlIHRoZSA8dmlkZW8+IGVsZW1lbnQgaXNuJ3QgYWN0aXZlbHkgdHJ5aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHBsYXk6IHJlYWR5U3RhdGUgPCAyIChNU0UgaW5pdCAvIHNlZWspIG9yIHBhdXNlZD10cnVlIChhdXRvcGxheS1wb2xpY3kgLwogICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgdGVhcmRvd24gcmFjZSB3aXRoIHBsYXllci5pc1BhdXNlZCgpKS4gSG9sZCBjb3VudGVycyBzbyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UgaW50ZXJydXB0ZWQgYnkgYSBicmllZiBpbml0IGRpcCByZXN1bWVzIGNvdW50aW5nIG9uIG5leHQgYWN0aXZlIHBvbGwuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllck5vdEFjdGl2ZWx5UGxheWluZyA9IHZpZGVvRWwgJiYgKHZpZGVvRWwucmVhZHlTdGF0ZSA8IDIgfHwgdmlkZW9FbC5wYXVzZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBGRloncyBhdWRpbyBjb21wcmVzc29yIHJlY3JlYXRlcyB0aGUgPHZpZGVvPiBlbGVtZW50IG9uIGV2ZXJ5IHBsYXllci5sb2FkKCkuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCB0aGVuIHNuYXBzIHRoZSBuZXcgZWxlbWVudCB0byAiYnVmZmVyZWQgcmVnaW9uIDAuMDR4eHgiIOKAlCBhIGJyaWVmCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRUaW1lIHBsYXRlYXUgdGhhdCBtYXRjaGVzIHBvc2l0aW9uRnJvemVuIGV2ZW4gdGhvdWdoIHBsYXliYWNrIGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWx0aHkuIERldGVjdCB0aGUgc3dhcCBieSBlbGVtZW50IGlkZW50aXR5IGFuZCBjbGVhciBjb3VudGVycyBzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFtcC11cCBpc24ndCBjb3VudGVkIGFzIGEgc3RhbGwuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb0VsICYmIHBsYXllckJ1ZmZlclN0YXRlLnZpZGVvRWxlbWVudCAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS52aWRlb0VsZW1lbnQgIT09IHZpZGVvRWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudmlkZW9FbGVtZW50ID0gdmlkZW9FbDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25Gcm96ZW4gPSAocGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPT0gcG9zaXRpb24pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheWVyQnVmZmVyU3RhdGUudmlkZW9DdXJyZW50VGltZSA9PT0gdW5kZWZpbmVkIHx8IHBsYXllckJ1ZmZlclN0YXRlLnZpZGVvQ3VycmVudFRpbWUgPT09IHZpZGVvQ3VycmVudFRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyTm90QWN0aXZlbHlQbGF5aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIOKAlCBuZWl0aGVyIGluY3JlbWVudCBub3IgcmVzZXQsIGp1c3QgaG9sZCBzdGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgfHwgcG9zaXRpb24gPiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaWdodGVuIHRvIEFORDogYSByZWFsIHN0YWxsIGlzIEJPVEggZnJvemVuIHBvc2l0aW9uIEFORCBhIGRyYWluaW5nIGJ1ZmZlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpZWxkIHJlcG9ydHMgb24gRmlyZWZveCBhdCBsaXZlIGVkZ2Ugc2hvd2VkIHRoZSBPUiBmb3JtIGZpcmluZyBkdXJpbmcgbm9ybWFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGluLWJ1ZmZlciBicmVhdGhpbmcgKH4xLTJzIGJ1ZmZlcmVkLCBjdXJyZW50VGltZSBicmllZmx5IGlkbGUgd2FpdGluZyBvbiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWdtZW50IGZldGNoKSDigJQgcGF1c2UvcGxheSB3b3VsZCB0aGVuIGtub2NrIHRoZSBwbGF5ZXIgYmFjayB0byByZWFkeVN0YXRlPTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjdXJyZW50VGltZT0wLCBzbm93YmFsbGluZyBpbnRvIGEgc2VsZi1yZWluZm9yY2luZyByZWxvYWQgY2FzY2FkZS4gV2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQU5ELCByZWFsIHN0YWxscyAoZnJvemVuICsgYnVmZmVyIGRyYWluZWQgYmVsb3cgRGFuZ2VyWm9uZSkgc3RpbGwgZmlyZSBvbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgcG9sbCBjYWRlbmNlOyBoZWFsdGh5IHRoaW4tYnVmZmVyIGZlZWRzIG5vIGxvbmdlciB0cmlwIGl0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uRnJvemVuICYmIGJ1ZmZlckR1cmF0aW9uIDwgUGxheWVyQnVmZmVyaW5nRGFuZ2VyWm9uZSkgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5idWZmZXJlZFBvc2l0aW9uID09IGJ1ZmZlcmVkUG9zaXRpb24gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID49IGJ1ZmZlckR1cmF0aW9uICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9zaXRpb24gIT0gMCB8fCBidWZmZXJlZFBvc2l0aW9uICE9IDAgfHwgYnVmZmVyRHVyYXRpb24gIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9PSBQbGF5ZXJCdWZmZXJpbmdTYW1lU3RhdGVDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FwOiBhdCBtb3N0IE9ORSByZWxvYWQgcGVyIHJlY292ZXJ5IHdpbmRvdy4gQWZ0ZXIgcmVsb2FkaW5nIG9uY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RheSBvbiBwYXVzZS9wbGF5IHVudGlsIHBsYXliYWNrIHJlY292ZXJzLiBQcmV2ZW50cyByZWxvYWQgY2FzY2FkZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd291bGRFc2NhbGF0ZSA9IHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID49IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGVUb1JlbG9hZCA9IHdvdWxkRXNjYWxhdGUgJiYgKERpc2FibGVSZWxvYWRDYXAgfHwgIXBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkQ2FwTm90ZSA9IHdvdWxkRXNjYWxhdGUgJiYgIWVzY2FsYXRlVG9SZWxvYWQgPyAnIChyZWxvYWQgY2FwIHJlYWNoZWQsIHBhdXNlL3BsYXkgb25seSDigJQgc2V0IHR3aXRjaEFkU29sdXRpb25zX2Rpc2FibGVSZWxvYWRDYXA9dHJ1ZSB0byBieXBhc3MpJyA6IChlc2NhbGF0ZVRvUmVsb2FkID8gJyAoZXNjYWxhdGluZyB0byByZWxvYWQpJyA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQXR0ZW1wdCB0byBmaXggYnVmZmVyaW5nIHBvc2l0aW9uOicgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiArICcgYnVmZmVyZWRQb3NpdGlvbjonICsgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiArICcgYnVmZmVyRHVyYXRpb246JyArIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uICsgcmVsb2FkQ2FwTm90ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlayBwYXN0IGJ1ZmZlciBnYXAgaW5zdGVhZCBvZiBzdGFsbGluZyArIGRyaWZ0IHRvIHJlY292ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWRlbyA9IHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgdmlkZW8uYnVmZmVyZWQubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBiaSA9IDA7IGJpIDwgdmlkZW8uYnVmZmVyZWQubGVuZ3RoOyBiaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8uYnVmZmVyZWQuc3RhcnQoYmkpID4gdmlkZW8uY3VycmVudFRpbWUgKyAwLjUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTZWVraW5nIHBhc3QgJyArICh2aWRlby5idWZmZXJlZC5zdGFydChiaSkgLSB2aWRlby5jdXJyZW50VGltZSkudG9GaXhlZCgxKSArICdzIGJ1ZmZlciBnYXAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHZpZGVvLmJ1ZmZlcmVkLnN0YXJ0KGJpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyaWZ0Q29ycmVjdGlvbih2aWRlbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFZpZGVvIHN0YXRlOiByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJyBuZXR3b3JrU3RhdGU9JyArIHZpZGVvLm5ldHdvcmtTdGF0ZSArICcgYnVmZmVyZWQ9JyArICh2aWRlby5idWZmZXJlZC5sZW5ndGggPiAwID8gdmlkZW8uYnVmZmVyZWQuZW5kKHZpZGVvLmJ1ZmZlcmVkLmxlbmd0aCAtIDEpLnRvRml4ZWQoMSkgOiAwKSArICcgY3VycmVudFRpbWU9JyArIHZpZGVvLmN1cnJlbnRUaW1lLnRvRml4ZWQoMSkgKyAnIHBhdXNlZD0nICsgdmlkZW8ucGF1c2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNQYXVzZVBsYXkgPSBlc2NhbGF0ZVRvUmVsb2FkID8gZmFsc2UgOiAhUGxheWVyQnVmZmVyaW5nRG9QbGF5ZXJSZWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNSZWxvYWQgPSBlc2NhbGF0ZVRvUmVsb2FkID8gdHJ1ZSA6IFBsYXllckJ1ZmZlcmluZ0RvUGxheWVyUmVsb2FkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxhc3RGaXhUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGVUb1JlbG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5yZWNvdmVyeVJlbG9hZFVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3QgcG9zaXRpb24ganVtcCAobmF0aXZlIGdhcCByZWNvdmVyeSkg4oCUIGRyaWZ0IHRvIGNhdGNoIHVwLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGR1cmluZyBhZCBicmVha3MgYW5kIDEwcyBhZnRlcjogYmFja3VwIHN0cmVhbSBzd2l0Y2hpbmcgY2F1c2VzIGJ1ZmZlciBnYXBzIHRoYXQgdHJpZ2dlciBmYWxzZSBqdW1wcy4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmF0ZS1saW1pdCB0byBvbmNlIHBlciAzMHM6IGZpZWxkLW9ic2VydmVkIG9uIHdhcm4gdGhhdCBUd2l0Y2gncyBwbGF5ZXIuY29yZS5zdGF0ZS5wb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBqdW1wcyB+NjBzIGV2ZXJ5IH4xMnMgb24gcmVsb2FkLWhlYXZ5IGNoYW5uZWxzIChsaWtlbHkgYmF0Y2ggdXBkYXRlcyBmcm9tIG0zdTggbWFuaWZlc3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaGVzIC8gcHJvZ3JhbS1kYXRlLXRpbWUgc3luYyBwb2ludHMsIG5vdCByZWFsIGRyaWZ0KS4gT3VyIDEuMXggdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGFmZmVjdCBzdGF0ZS5wb3NpdGlvbiBhbnl3YXksIHNvIHJlLWZpcmluZyBldmVyeSAxMnMgaXMgdXNlbGVzcyBsb2cgc3BhbSDigJQgdGhlIGNhdGNoLXVwCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdGVzIG9uIGN1cnJlbnRUaW1lIHdoaWNoIGlzIGFscmVhZHkgYXQgbGl2ZSBlZGdlLiBSYXRlLWxpbWl0IGNvbGxhcHNlcyB0aGUgc3BhbSB0byBhCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBkcmlmdCBhdHRlbXB0IHBlciAzMHMgd2luZG93LCBsZWF2aW5nIHJlYWwtZHJpZnQgcGF0aHMgKGJ1ZmZlci1nYXAgc2VlaywgcG9zdC1yZWxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYWZmZWN0ZWQgc2luY2UgdGhleSBjYWxsIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKCkgZGlyZWN0bHkgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgZGV0ZWN0b3IuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA+IDAgJiYgcG9zaXRpb24gLSBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA+IDUgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3REcmlmdFN0YXJ0ZWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdERyaWZ0U3RhcnRlZEF0ID49IDMwMDAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zaXRpb24ganVtcGVkICcgKyAocG9zaXRpb24gLSBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbikudG9GaXhlZCgxKSArICdzIOKAlCBzdGFydGluZyBkcmlmdCBjb3JyZWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyaWZ0Q29ycmVjdGlvbihwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdERyaWZ0U3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS52aWRlb0N1cnJlbnRUaW1lID0gdmlkZW9DdXJyZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiA9IGJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID0gYnVmZmVyRHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIHdoZW4gbW9uaXRvcmluZyBwbGF5ZXIgZm9yIGJ1ZmZlcmluZzogJyArIGVycik7CiAgICAgICAgICAgICAgICBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2FkaW5nLWNpcmNsZSBoZWFsdGggY2hlY2s6IGR1cmluZyBhbiBhZCBzdHJpcCtyZWNvdmVyeSBsb29wIHRoZSBub3JtYWwgYnVmZmVyIG1vbml0b3IKICAgICAgICAvLyBpcyBnYXRlZCBvZmYgKGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMpLCBzbyBhIHZpc2libHkgc3RhbGxlZCBwbGF5ZXIgd291bGQgb3RoZXJ3aXNlIHdhaXQKICAgICAgICAvLyBmb3IgdGhlIHdvcmtlcidzIHBvbGwtYmFzZWQgZWFybHkgcmVsb2FkICh+MTBzKS4gVGhpcyBjYXRjaGVzIHRoZSB2aXNpYmxlIHN0YWxsIH4zcyBhZnRlcgogICAgICAgIC8vIGl0IHN0YXJ0cyBhbmQgdHJpZ2dlcnMgYSByZWxvYWQgZGlyZWN0bHksIGVsaW1pbmF0aW5nIG1vc3Qgb2YgdGhlIGxvYWRpbmctY2lyY2xlIHdpbmRvdy4KICAgICAgICBpZiAoaXNBY3RpdmVseVN0cmlwcGluZ0FkcyAmJiBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnBsYXllcjsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyPy5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8uZW5kZWQgJiYgIXBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIHBsYXllciBoYXMgZXZlciBoYWQgZGF0YSDigJQgZGlzdGluZ3Vpc2hlcyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAvLyAoaGFkIGRhdGEsIGxvc3QgZGF0YSkgZnJvbSBpbml0aWFsIHBsYXllciBpbml0IChuZXZlciBoYWQgZGF0YSB5ZXQpLgogICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgZnJlc2ggcGFnZSBsb2FkICsgcHJlcm9sbCBjYXVzZXMgUFIgIzk2IHRvIG1pc2ZpcmUgcmVwZWF0ZWRseQogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVhZHlTdGF0ZT0wIGlzIG5vcm1hbCBkdXJpbmcgaW5pdC4KICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1N0YWxsZWQgPSB2aWRlby5yZWFkeVN0YXRlIDwgMyAmJiAodmlkZW8ucGF1c2VkIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gMik7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhbGxSZWxvYWRDb29sZG93biA9IDE1MDAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb2xkb3duRXhwaXJlZCA9ICFwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QWRTdGFsbFJlbG9hZEF0IHx8IChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCkgPiBzdGFsbFJlbG9hZENvb2xkb3duOwogICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGZpcmUgbG9hZGluZy1jaXJjbGUgcmVsb2FkIGlmIEFOWSByZWxvYWQgaGFwcGVuZWQgcmVjZW50bHkg4oCUIHJlYWR5U3RhdGU9MAogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBleHBlY3RlZCB0cmFuc2llbnQgc3RhdGUgZHVyaW5nIGEgcmVsb2FkJ3MgTWVkaWFTb3VyY2UgdGVhcmRvd24uIFdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLCBhbiBlYXJseS1yZWxvYWQgaW4gZmxpZ2h0IGNhbiB0cmlnZ2VyIGEgcmVkdW5kYW50IGxvYWRpbmctY2lyY2xlIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWQgPSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQpIDwgc3RhbGxSZWxvYWRDb29sZG93bjsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGFsbGVkICYmIGNvb2xkb3duRXhwaXJlZCAmJiAhcmVjZW50UmVsb2FkICYmIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpID4gMzAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTG9hZGluZyBjaXJjbGUgZGV0ZWN0ZWQgZHVyaW5nIGFkIGJyZWFrICgnICsgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHN0YWxsLCByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJykg4oCUIGVhcmx5IHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkIHJlbG9hZDogYSBzdHVjayBtZWRpYSBwbGF5ZXIgbmVlZHMgaXRzIE1lZGlhU291cmNlIHJlYnVpbHQsIG5vdCBqdXN0IGFuIG0zdTggcmVmZXRjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgJ2Vhcmx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1N0YWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0gZWxzZSBpZiAoIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIHsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc0xpdmUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUuaXNMaXZlICYmICFpc0xpdmUpIHsKICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcih7CiAgICAgICAgICAgICAgICBoYXNBZHM6IGZhbHNlCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pc0xpdmUgPSBpc0xpdmU7CiAgICAgICAgLy8gRm9yY2UgaW1tZWRpYXRlIHRpY2sgd2hlbiB0YWIgYmVjb21lcyB2aXNpYmxlIHNvIHN0YWxscyBhcmUgY2F1Z2h0IGZhc3Qgb24gcmV0dXJuCiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcudmlzaWJpbGl0eUhvb2tlZCkgewogICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnZpc2liaWxpdHlIb29rZWQgPSB0cnVlOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcucGVuZGluZ1RpY2spIHsKICAgICAgICAgICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnBlbmRpbmdUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9uaXRvclBsYXllckJ1ZmZlcmluZy5wZW5kaW5nVGljayA9IGZhbHNlOyBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7IH0sIDEwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBDYXRjaCBwZXJzaXN0ZW50IGFkLWJyZWFrIG92ZXJsYXlzIChlLmcuICJ0YWtpbmcgYW4gYWQgYnJlYWsgLyBzdGljayBhcm91bmQiKQogICAgICAgIC8vIGV2ZW4gYWZ0ZXIgaGFzQWRzIGhhcyB0cmFuc2l0aW9uZWQgdG8gZmFsc2UuIHVwZGF0ZUFkYmxvY2tCYW5uZXIgb25seSBjYWxscwogICAgICAgIC8vIGhpZGVUd2l0Y2hBZE92ZXJsYXlzIGR1cmluZyB0aGUgYWN0aXZlIGFkIGJyZWFrOyBzb21lIG92ZXJsYXlzIGhhdmUgdGhlaXIgb3duCiAgICAgICAgLy8gbGlmZWN5Y2xlIGFuZCBzdGF5IHZpc2libGUgYWZ0ZXJ3YXJkcy4gUnVubmluZyBoZXJlIG9uIGV2ZXJ5IG1vbml0b3IgdGljawogICAgICAgIC8vICgxLTNzIGNhZGVuY2UpIGtlZXBzIHRoZW0gaGlkZGVuIHdpdGhvdXQgYSBkZWRpY2F0ZWQgaW50ZXJ2YWwuCiAgICAgICAgdHJ5IHsgaGlkZVR3aXRjaEFkT3ZlcmxheXMoKTsgfSBjYXRjaCB7fQogICAgICAgIC8vIFZpc2liaWxpdHktYXdhcmUgYmFja29mZjogcG9sbCAzeCBzbG93ZXIgd2hlbiB0YWIgaXMgaGlkZGVuIChidXQgTk9UIGR1cmluZyBQaVAg4oCUIHVzZXIgaXMgc3RpbGwgd2F0Y2hpbmcpCiAgICAgICAgY29uc3Qgc2hvdWxkVGhyb3R0bGUgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmhpZGRlbiAmJiAhZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQ7CiAgICAgICAgY29uc3QgbmV4dERlbGF5ID0gc2hvdWxkVGhyb3R0bGUgPyBQbGF5ZXJCdWZmZXJpbmdEZWxheSAqIDMgOiBQbGF5ZXJCdWZmZXJpbmdEZWxheTsKICAgICAgICBzZXRUaW1lb3V0KG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcsIG5leHREZWxheSk7CiAgICB9CiAgICAvLyBIaWRlIFR3aXRjaCdzIGFkIGJyZWFrIC8gVHVyYm8gcHJvbW8gLyBzdHJlYW0gZGlzcGxheSBhZCBvdmVybGF5cyB3aGVuIHdlJ3JlIGFscmVhZHkgYmxvY2tpbmcgYWRzCiAgICBmdW5jdGlvbiBoaWRlVHdpdGNoQWRPdmVybGF5cygpIHsKICAgICAgICBpZiAoIWNhY2hlZFBsYXllclJvb3REaXYgfHwgIWNhY2hlZFBsYXllclJvb3REaXYuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgICAgICAvLyBIaWRlIHN0cmVhbSBkaXNwbGF5IGFkIChTREEpIHdyYXBwZXIKICAgICAgICBjb25zdCBzZGFFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRlc3Qtc2VsZWN0b3I9InNkYS13cmFwcGVyIl0nKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNkYUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghc2RhRWxlbWVudHNbaV0uZGF0YXNldC50YXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIHNkYUVsZW1lbnRzW2ldLmRhdGFzZXQudGFzSGlkZGVuID0gJyc7CiAgICAgICAgICAgICAgICBzZGFFbGVtZW50c1tpXS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRTZGFIaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VkU2RhSGlkZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSGlkZGVuIFR3aXRjaCBzdHJlYW0gZGlzcGxheSBhZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgaWYgKCFjYWNoZWRQbGF5ZXJSb290RGl2IHx8ICFjYWNoZWRQbGF5ZXJSb290RGl2LmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIGNhY2hlZFBsYXllclJvb3REaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tcGxheWVyJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllclJvb3REaXYgPSBjYWNoZWRQbGF5ZXJSb290RGl2OwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgPSBkYXRhLmlzU3RyaXBwaW5nQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIHBsYXllckJ1ZmZlclN0YXRlLmlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuaGFzQWRzKSB7CiAgICAgICAgICAgICAgICBoaWRlVHdpdGNoQWRPdmVybGF5cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gVHJhdmVyc2UgUmVhY3QncyBmaWJlciB0cmVlIHRvIGZpbmQgVHdpdGNoJ3MgcGxheWVyIGFuZCBwbGF5ZXIgc3RhdGUgaW5zdGFuY2VzCiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgaWYgKCFjYWNoZWRSb290Tm9kZSkgewogICAgICAgICAgICAgICAgY2FjaGVkUm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gY2FjaGVkUm9vdE5vZGU7CiAgICAgICAgICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdCAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCkgewogICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZWFjdFJvb3ROb2RlID09IG51bGwgJiYgcm9vdE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IE9iamVjdC5rZXlzKHJvb3ROb2RlKS5maW5kKHggPT4geC5zdGFydHNXaXRoKCdfX3JlYWN0Q29udGFpbmVyJykgfHwgeC5zdGFydHNXaXRoKCdfX3JlYWN0RmliZXInKSk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlW2NvbnRhaW5lck5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFjdFJvb3ROb2RlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWFjdFJvb3ROb2RlID0gZmluZFJlYWN0Um9vdE5vZGUoKTsKICAgICAgICBpZiAoIXJlYWN0Um9vdE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGxldCBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRQbGF5ZXJBY3RpdmUgJiYgbm9kZS5wcm9wcyAmJiBub2RlLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UpOwogICAgICAgIHBsYXllciA9IHBsYXllciAmJiBwbGF5ZXIucHJvcHMgJiYgcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgPyBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgaWYgKHBsYXllcj8ucGxheWVySW5zdGFuY2UpIHsKICAgICAgICAgICAgcGxheWVyID0gcGxheWVyLnBsYXllckluc3RhbmNlOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCBpZiBUd2l0Y2ggb2JmdXNjYXRlcyBwcm9wZXJ0eSBuYW1lcwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQgJiYgbm9kZS5nZXRCdWZmZXJEdXJhdGlvbiAmJiBub2RlLmNvcmU/LnN0YXRlKTsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2gg4oCUIHNldFNyYyBleGlzdHMgYnV0IHNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzIHdhcyByZW5hbWVkCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjayA9ICFwbGF5ZXJTdGF0ZSA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldFN0cmVhbU1hbmFnZXJOb2RlICYmICFub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQpIDogbnVsbDsKICAgICAgICAvLyBGYWxsYmFjayAyOiBUVFYtQUIncyBhcHByb2FjaCDigJQgdmlkZW9QbGF5ZXJJbnN0YW5jZSB3aXRoIHBsYXllck1vZGUKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMiA9ICFwbGF5ZXJTdGF0ZSAmJiAhcGxheWVyU3RhdGVGYWxsYmFjayA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlPy5wbGF5ZXJNb2RlICE9PSB1bmRlZmluZWQpPy5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgY29uc3QgZmluYWxQbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlIHx8IHBsYXllclN0YXRlRmFsbGJhY2sgfHwgcGxheWVyU3RhdGVGYWxsYmFjazI7CiAgICAgICAgLy8gR3JhY2UgcGVyaW9kIGJlZm9yZSBsb2dnaW5nICJub3QgZm91bmQiIHdhcm5pbmdzLiBUaGUgYnVmZmVyIG1vbml0b3IgY2FuIHRpY2sKICAgICAgICAvLyBiZWZvcmUgUmVhY3QgaGFzIGZpbmlzaGVkIG1vdW50aW5nIHRoZSBwbGF5ZXIsIGxlYWRpbmcgdG8gYSBmYWxzZS1wb3NpdGl2ZQogICAgICAgIC8vIGxvZyB0aGF0IGZpcmVzIG9uY2Ugb24gZXZlcnkgcGFnZSBsb2FkLiBPbmx5IGxvZyBpZiB0aGUgbnVsbCBzdGF0ZSBwZXJzaXN0cwogICAgICAgIC8vIGZvciAxMCsgc2Vjb25kcyDigJQgYnkgdGhlbiBSZWFjdCBpcyBkZWZpbml0ZWx5IG1vdW50ZWQgYW5kIGEgcGVyc2lzdGVudCBudWxsCiAgICAgICAgLy8gaW5kaWNhdGVzIHJlYWwgQVBJIGRyaWZ0IChUd2l0Y2ggcmVuYW1lZCBzZXRQbGF5ZXJBY3RpdmUvc2V0U3JjL2V0YykuCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgaWYgKCFnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCkgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyICYmIChEYXRlLm5vdygpIC0gZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQpID4gMTAwMDApIHsKICAgICAgICAgICAgICAgIGdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFBsYXllckFjdGl2ZS9tZWRpYVBsYXllckluc3RhbmNlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIGlmICghZmluYWxQbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQpIGdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vU3RhdGUgJiYgKERhdGUubm93KCkgLSBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFN0YXRlTnVsbEF0KSA+IDEwMDAwKSB7CiAgICAgICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5sb2dnZWROb1N0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBzdGF0ZSBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFNyYy9zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncycpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RTdGF0ZU51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgLy8gUGF1c2UvcGxheSBvciBmdWxseSByZWxvYWQgdGhlIFR3aXRjaCBwbGF5ZXIsIHByZXNlcnZpbmcgcXVhbGl0eS92b2x1bWUgc2V0dGluZ3MKICAgIGZ1bmN0aW9uIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQsIHJlbG9hZEtpbmQpIHsKICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgaWYgKCFwbGF5ZXJBbmRTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcmVhY3Qgcm9vdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckFuZFN0YXRlLnBsYXllcjsKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IHBsYXllckFuZFN0YXRlLnN0YXRlOwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXInKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXBsYXllclN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXIgc3RhdGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB3YXNQYXVzZWQgPSBwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkOwogICAgICAgIGlmICh3YXNQYXVzZWQpIHsKICAgICAgICAgICAgLy8gVXNlciBkZWxpYmVyYXRlbHkgcGF1c2VkIOKAlCByZXNwZWN0IHRoZWlyIGludGVudCwgZG9uJ3QgYXV0by1yZXN1bWUKICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZXNwZWN0aW5nIHVzZXIgcGF1c2UgaW50ZW50IOKAlCBza2lwcGluZyBhdXRvLXJlc3VtZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIFdFIHJlY2VudGx5IGNhbGxlZCBwYXVzZS9wbGF5IGFuZCBwbGF5ZXIgaXMgc3RpbGwgcGF1c2VkLCByZXRyeSBwbGF5IChzdHVjayBmcm9tIGF1dG9wbGF5IHBvbGljeSBvciBhZC1zdGF0ZSBpbnRlcmZlcmVuY2UpCiAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQpIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXdhc1BhdXNlZCkgewogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgPSAwOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQgJiYgZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQpIHsKICAgICAgICAgICAgLy8gU2tpcCByZWxvYWQgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IGhlYWx0aHkg4oCUIGF2b2lkcyBkaXNydXB0aW5nIHNtb290aCBwbGF5YmFjay4KICAgICAgICAgICAgLy8gQnV0IGlmIHdlJ3JlIHdheSBiZWhpbmQgbGl2ZSBlZGdlIChlLmcuIGFmdGVyIGEgbG9uZyBhZCBicmVhayksIHByb2NlZWQgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeS4KICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5yZWFkeVN0YXRlID49IDMgJiYgIXZpZGVvLnBhdXNlZCAmJiAhdmlkZW8uZW5kZWQpIHsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5U2VjID0gMDsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5S25vd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLnNlZWthYmxlICYmIHZpZGVvLnNlZWthYmxlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vla2FibGVFbmQgPSB2aWRlby5zZWVrYWJsZS5lbmQodmlkZW8uc2Vla2FibGUubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoc2Vla2FibGVFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxjID0gTWF0aC5tYXgoMCwgc2Vla2FibGVFbmQgLSB2aWRlby5jdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2FwOiB2YWx1ZXMgPjFoIGluZGljYXRlIGdhcmJhZ2UgZnJvbSB0aGUgTWVkaWEgU291cmNlIEFQSQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHNlZW4gcmlnaHQgYWZ0ZXIgYSByZWxvYWQgd2hpbGUgdGhlIHNlZWthYmxlIHJhbmdlIGlzIGluIGEgdHJhbnNpZW50IHN0YXRlKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxjIDwgMzYwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lTZWMgPSBjYWxjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lLbm93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgaWYgKCFsYXRlbmN5S25vd24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBMYXRlbmN5IHVua25vd24gKHNlZWthYmxlIHVuYXZhaWxhYmxlKSDigJQgcHJvY2VlZGluZyB3aXRoIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXRlbmN5U2VjID4gNykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBwbGF5aW5nIGJ1dCAnICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kIGxpdmUg4oCUIHByb2NlZWRpbmcgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeScpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIHBsYXllciBoZWFsdGh5IChyZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJywgcGxheWluZywgbGF0ZW5jeT0nICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MpJyk7CiAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1JlbG9hZFNraXBwZWQnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzUmVsb2FkKSB7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5UXVhbGl0eSA9ICd2aWRlby1xdWFsaXR5JzsKICAgICAgICAgICAgY29uc3QgbHNLZXlNdXRlZCA9ICd2aWRlby1tdXRlZCc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5Vm9sdW1lID0gJ3ZvbHVtZSc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5TG93TGF0ZW5jeSA9ICdsb3dMYXRlbmN5TW9kZUVuYWJsZWQnOy8vIFByZXNlcnZlIHVzZXIncyBsb3ctbGF0ZW5jeSB0b2dnbGUgYWNyb3NzIHJlbG9hZHMgKFRUVi1BQiBwYXJpdHkpCiAgICAgICAgICAgIGNvbnN0IGxzS2V5UGVyc2lzdGVuY2UgPSAncGVyc2lzdGVuY2VFbmFibGVkJzsvLyBQcmVzZXJ2ZSBhdXRvcGxheS9wZXJzaXN0ZW5jZSB0b2dnbGUgYWNyb3NzIHJlbG9hZHMgKFRUVi1BQiBwYXJpdHkpCiAgICAgICAgICAgIGxldCBjdXJyZW50UXVhbGl0eUxTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRNdXRlZExTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRWb2x1bWVMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50TG93TGF0ZW5jeUxTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRQZXJzaXN0ZW5jZUxTID0gbnVsbDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGN1cnJlbnRRdWFsaXR5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVF1YWxpdHkpOwogICAgICAgICAgICAgICAgY3VycmVudE11dGVkTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleU11dGVkKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRWb2x1bWVMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5Vm9sdW1lKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRMb3dMYXRlbmN5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleUxvd0xhdGVuY3kpOwogICAgICAgICAgICAgICAgY3VycmVudFBlcnNpc3RlbmNlTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVBlcnNpc3RlbmNlKTsKICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBKU09OLnN0cmluZ2lmeSh7ZGVmYXVsdDpwbGF5ZXIuY29yZS5zdGF0ZS5tdXRlZH0pKTsKICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVZvbHVtZSwgcGxheWVyLmNvcmUuc3RhdGUudm9sdW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwbGF5ZXI/LmNvcmU/LnN0YXRlPy5xdWFsaXR5Py5ncm91cCkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgSlNPTi5zdHJpbmdpZnkoe2RlZmF1bHQ6cGxheWVyLmNvcmUuc3RhdGUucXVhbGl0eS5ncm91cH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7Ly8gY2xlYXIgc3RhbGUgc3RhbGwgdGltZXIgc28gcG9zdC1yZWxvYWQgcmVhZHlTdGF0ZT0wIGlzbid0IGF0dHJpYnV0ZWQgdG8gcHJlLXJlbG9hZCBzdGFsbAogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgLy8gcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyByZS1hY3F1aXJlZCBmcmVzaCBldmVyeSB0aWNrIOKAlCBubyBtYW51YWwgaW52YWxpZGF0aW9uIG5lZWRlZAogICAgICAgICAgICAvLyBIYXJkIHJlbG9hZCBmb3IgJ2Vhcmx5JyAobWlkLWJyZWFrIGVzY2FwZSDigJQgZnJlc2ggc2Vzc2lvbiBnZXRzIG5ldyBhZC1kZWNpc2lvbiBidWNrZXQpLgogICAgICAgICAgICAvLyBTb2Z0IHJlbG9hZCBmb3IgJ3Bvc3QtYWQnIChzbW9vdGggdHJhbnNpdGlvbiwgbm8gYmxhY2sgc2NyZWVuIHRlYXJkb3duKS4KICAgICAgICAgICAgY29uc3QgaGFyZFJlbG9hZCA9IHJlbG9hZEtpbmQgPT09ICdlYXJseSc7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFJlbG9hZGluZyBUd2l0Y2ggcGxheWVyJyArIChoYXJkUmVsb2FkID8gJyAoaGFyZCknIDogJyAoc29mdCknKSk7CiAgICAgICAgICAgIC8vIFByZS1tdXRlIHRocm91Z2ggaGFyZCByZWxvYWQgdG8gaGlkZSBNU0UtdGVhcmRvd24gYXVkaW8gY2xpY2s7IHJlc3RvcmVkIG9uCiAgICAgICAgICAgIC8vIGBjYW5wbGF5YCB3aXRoIDE1MDBtcyBzYWZldHkgY2FwLiBTa2lwcGVkIGlmIHVzZXIgYWxyZWFkeSBtdXRlZC4KICAgICAgICAgICAgaWYgKGhhcmRSZWxvYWQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FzSW5pdGlhbGx5VW5tdXRlZCA9IHYgJiYgIXYubXV0ZWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgIzIwMCBmaXg6IGFsc28gc2V0IHVwIHJlc3RvcmUrYmFja3N0b3Agd2hlbiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5CiAgICAgICAgICAgICAgICAgICAgLy8gbXV0ZWQgSUYgdmFmdCBoYXMgc3VjY2Vzc2Z1bGx5IHVubXV0ZWQgYXQgYW55IHBvaW50IGVhcmxpZXIgdGhpcyBzZXNzaW9uLgogICAgICAgICAgICAgICAgICAgIC8vIFN0cm9uZyBzaWduYWwgb2YgVHdpdGNoJ3Mgc2lsZW50IHJlLW11dGUgcGF0dGVybiByYXRoZXIgdGhhbiB1c2VyLWluaXRpYXRlZAogICAgICAgICAgICAgICAgICAgIC8vIG11dGUuIEZpcnN0LXNlc3Npb24tbXV0ZSB1c2VycyBoYXZlIHZhZnRFdmVyVW5tdXRlZD1mYWxzZSDihpIgYmFja3N0b3AgbmV2ZXIKICAgICAgICAgICAgICAgICAgICAvLyBlbmdhZ2VzIOKGkiBtdXRlIHJlc3BlY3RlZC4gRGlzYWJsZWQgYnkgdHdpdGNoQWRTb2x1dGlvbnNfcmVjb3ZlckZyb21TaWxlbnRNdXRlPQogICAgICAgICAgICAgICAgICAgIC8vIGZhbHNlIGZvciB1c2VycyB3aG8gZGVsaWJlcmF0ZWx5IG11dGUgbWlkLXNlc3Npb24uCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVjb3ZlciA9IHBsYXllckJ1ZmZlclN0YXRlLnZhZnRFdmVyVW5tdXRlZCAmJiBSZWNvdmVyRnJvbVNpbGVudE11dGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgKHdhc0luaXRpYWxseVVubXV0ZWQgfHwgc2hvdWxkUmVjb3ZlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0luaXRpYWxseVVubXV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubXV0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11bHRpLWV2ZW50IHJlc3RvcmU6IEVkZ2UgZmlyZXMgbG9hZGVkZGF0YS9wbGF5aW5nIGluZGVwZW5kZW50bHkgb2YKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FucGxheTsgZmlyc3QtZmlyZWQgd2lucyB2aWEgdGhlIGlkZW1wb3RlbnQgYGRvbmVgIGd1YXJkLgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN0b3JlID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2FucGxheScsIGxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCBsaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnZhZnRFdmVyVW5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSA9PT0gJ1ZJREVPJykgcmVzdG9yZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjYW5wbGF5JywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc3RvcmUsIDQwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBCYWNrc3RvcDogcmUtY2hlY2sgYXQgNTUwMG1zLiBUd2l0Y2gncyBMUy1yZXN0b3JlIGF0IH4zMDAwbXMgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW11dGUgcG9zdC1yZXN0b3JlIGlmIGl0IGNhcHR1cmVkIGEgbXV0ZWQgc25hcHNob3QuIElkZW1wb3RlbnQuCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgJiYgY3VyLm11dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEhhcmQgcmVsb2FkIGJhY2tzdG9wIFNLSVBQRUQg4oCUIGVsZW1lbnQgbXV0ZWQgYXQgNTUwMG1zIGJ1dCB1c2VyUGF1c2VJbnRlbnQgc2V0IChsaWtlbHkgZmFsc2UtcG9zaXRpdmUgcGF1c2UgZXZlbnQgZHVyaW5nIE1TRSB0ZWFyZG93biDigJQgaXNzdWUgIzIwMCBmb2xsb3ctdXApJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIubXV0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnZhZnRFdmVyVW5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBIYXJkIHJlbG9hZCBiYWNrc3RvcCB1bm11dGUgZmlyZWQg4oCUIGVsZW1lbnQgd2FzIHN0aWxsIG11dGVkIGF0IDU1MDBtcyAoaW5pdGlhbDogJyArICh3YXNJbml0aWFsbHlVbm11dGVkID8gJ3VubXV0ZWQsIHdlIHByZS1tdXRlZCcgOiAnYWxyZWFkeS1tdXRlZCBvbiBlbnRyeSDigJQgcmVjb3ZlcmluZyBmcm9tIHNpbGVudCBUd2l0Y2ggcmUtbXV0ZScpICsgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTUwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNldCB3ZUp1c3RQYXVzZWQgc28gdGhlIHBhdXNlLWxpc3RlbmVyIGZpbHRlcnMgb3V0IHRoZSBNU0UtdGVhcmRvd24KICAgICAgICAgICAgLy8gcGF1c2UgZXZlbnQgVHdpdGNoIGRpc3BhdGNoZXMgb24gdGhlIG9sZCA8dmlkZW8+IGR1cmluZyBzZXRTcmMuCiAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdXNlclBhdXNlSW50ZW50IHdvdWxkIGZhbHNlbHkgZmxpcCB0byB0cnVlIGR1cmluZyB0aGUKICAgICAgICAgICAgLy8gcmVsb2FkIHdpbmRvdywgYmxvY2tpbmcgdGhlIDU1MDBtcyBiYWNrc3RvcCdzIHVubXV0ZSBvbiBzdHVjay1tdXRlZAogICAgICAgICAgICAvLyByZWNvdmVyeSAoaXNzdWUgIzIwMCBmb2xsb3ctdXApLgogICAgICAgICAgICBpZiAoaGFyZFJlbG9hZCkgewogICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwbGF5ZXJTdGF0ZS5zZXRTcmMoeyBpc05ld01lZGlhUGxheWVySW5zdGFuY2U6IGhhcmRSZWxvYWQsIHJlZnJlc2hBY2Nlc3NUb2tlbjogaGFyZFJlbG9hZCB9KTsKICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1RyaWdnZXJlZFBsYXllclJlbG9hZCcpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgICAgIC8vIEJsb2NrIG11c3QgYWx3YXlzIHJ1bjogaWYgVHdpdGNoIGhhc24ndCB3cml0dGVuIExTIHZhbHVlcyB5ZXQgKGZyZXNoIHNlc3Npb24sIHByaXZhdGUgbW9kZSwKICAgICAgICAgICAgLy8gY2xlYXJlZCBjYWNoZSksIHRoZSB2aWRlbyBzdGlsbCBuZWVkcyB1bm11dGUgYWZ0ZXIgQ2hyb21lJ3MgYXV0b3BsYXkgbXV0ZSBvbiByZWxvYWQuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIGN1cnJlbnRRdWFsaXR5TFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlNdXRlZCwgY3VycmVudE11dGVkTFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBjdXJyZW50Vm9sdW1lTFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG93TGF0ZW5jeUxTICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleUxvd0xhdGVuY3ksIGN1cnJlbnRMb3dMYXRlbmN5TFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGVyc2lzdGVuY2VMUyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlQZXJzaXN0ZW5jZSwgY3VycmVudFBlcnNpc3RlbmNlTFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwZWN0IHVzZXIncyBtdXRlIGludGVudDogb25seSBmb3JjZS11bm11dGUgaWYgTFMgZGlkbid0IHNheSBtdXRlLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUd2l0Y2ggd3JpdGVzIHZpZGVvLW11dGVkIGFzICd7ImRlZmF1bHQiOnRydWV9JyB3aGVuIHVzZXIgbXV0ZWQgdmlhIFVJOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJJbnRlbmRlZE11dGUgPSBjdXJyZW50TXV0ZWRMUyAmJiBjdXJyZW50TXV0ZWRMUy5pbmNsdWRlcygnImRlZmF1bHQiOnRydWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwICYmIHZpZGVvc1swXS5tdXRlZCAmJiAhdXNlckludGVuZGVkTXV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCBsaXZlIGRyaWZ0IGFmdGVyIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGhhcmQgcmVsb2FkIHdpdGggbGFyZ2UgZHJpZnQgKD41cyksIGhhcmQtc2VlayB0byBsaXZlIGVkZ2UgdG8gZmx1c2gKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IEEvViB0aW1lc3RhbXAgZGVzeW5jIGZyb20gc3RyaXArQkxBTktfTVA0K3JlY292ZXJ5IGFjdGl2aXR5LiBEcmlmdAogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0aW9uIGF0IDEuMXggd291bGQgdGFrZSBtaW51dGVzIHRvIGNhdGNoIHVwIDMwLTYwcyBvZiBkcmlmdC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHNvZnQgcmVsb2FkIG9yIHNtYWxsIGRyaWZ0LCB1c2UgZXhpc3RpbmcgZ3JhZHVhbCBjYXRjaC11cC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwICYmIHZpZGVvc1swXS5idWZmZXJlZC5sZW5ndGggPiAwICYmIHZpZGVvc1swXS5yZWFkeVN0YXRlID49IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpdmVFZGdlID0gdmlkZW9zWzBdLmJ1ZmZlcmVkLmVuZCh2aWRlb3NbMF0uYnVmZmVyZWQubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkcmlmdCA9IGxpdmVFZGdlIC0gdmlkZW9zWzBdLmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhcmRSZWxvYWQgJiYgZHJpZnQgPiA1ICYmIE51bWJlci5pc0Zpbml0ZShsaXZlRWRnZSkgJiYgbGl2ZUVkZ2UgPCAzNjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1oYXJkLXJlbG9hZCBzZWVrIHRvIGxpdmUg4oCUICcgKyBkcmlmdC50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kLCBqdW1waW5nIHRvIGxpdmUgZWRnZSB0byBmbHVzaCBBL1YgZHJpZnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0uY3VycmVudFRpbWUgPSBsaXZlRWRnZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJpZnQgPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1yZWxvYWQgbGl2ZSBkcmlmdCBjb3JyZWN0aW9uOiAnICsgZHJpZnQudG9GaXhlZCgxKSArICdzIGJlaGluZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHZpZGVvc1swXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgd2luZG93LnJlbG9hZFR3aXRjaFBsYXllciA9ICgpID0+IHsKICAgICAgICBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUpOwogICAgfTsKICAgIGZ1bmN0aW9uIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKGtleSwgdmFsdWUpIHsKICAgICAgICB0d2l0Y2hXb3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gewogICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2tleToga2V5LCB2YWx1ZTogdmFsdWV9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVdvcmtlckZldGNoUmVxdWVzdChmZXRjaFJlcXVlc3QpIHsKICAgICAgICAvLyA1cyBBYm9ydENvbnRyb2xsZXIgdGltZW91dCDigJQgYm91bmRzIHdvcnN0LWNhc2Ugd2FpdCB3aGVuIFR3aXRjaCBHUUwgaGFuZ3MuCiAgICAgICAgLy8gQWJvcnRFcnJvciBmbG93cyB0aHJvdWdoIHRoZSBleGlzdGluZyBjYXRjaCArIEZhaWxlZEJhY2t1cFBsYXllclR5cGVzIGxvY2tvdXQuCiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSA1MDAwOwogICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0TXMpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCB7CiAgICAgICAgICAgICAgICAuLi5mZXRjaFJlcXVlc3Qub3B0aW9ucywKICAgICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0gewogICAgICAgICAgICAgICAgaWQ6IGZldGNoUmVxdWVzdC5pZCwKICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgIG9rOiByZXNwb25zZS5vaywKICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQ6IHJlc3BvbnNlLnJlZGlyZWN0ZWQsCiAgICAgICAgICAgICAgICB0eXBlOiByZXNwb25zZS50eXBlLAogICAgICAgICAgICAgICAgdXJsOiByZXNwb25zZS51cmwsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMocmVzcG9uc2UuaGVhZGVycy5lbnRyaWVzKCkpLAogICAgICAgICAgICAgICAgYm9keTogcmVzcG9uc2VCb2R5CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdDsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGlkOiBmZXRjaFJlcXVlc3QuaWQsCiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InID8gJ0dRTCBmZXRjaCB0aW1lb3V0ICgnICsgKHRpbWVvdXRNcyAvIDEwMDApICsgJ3MpJyA6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICAvLyBIb29rIGZldGNoKCkgaW4gdGhlIHdpbmRvdyBzY29wZSB0byBjYXB0dXJlIGF1dGggaGVhZGVycyBhbmQgbW9kaWZ5IHBsYXllciB0eXBlIHJlcXVlc3RzCiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0KSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBHUUxEZXZpY2VJRCAhPSBkZXZpY2VJZCkgewogICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlRGV2aWNlSWQnLCBHUUxEZXZpY2VJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1WZXJzaW9uJ10gIT09IENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uID0gaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXSAhPT0gQ2xpZW50U2Vzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50U2Vzc2lvbicsIENsaWVudFNlc3Npb24gPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSAhPT0gQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInLCBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddICE9PSBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWRIZWFkZXJzICYmIEdRTERldmljZUlEICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChHUUxEZXZpY2VJRCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VkUGxheWVyVHlwZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gSlNPTi5wYXJzZShpbml0LmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdCb2R5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW0FEIERFQlVHXSBSZXBsYWNlZCAnJHtyZXBsYWNlZFBsYXllclR5cGV9JyBwbGF5ZXIgdHlwZSB3aXRoICcke0ZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlfScgcGxheWVyIHR5cGVgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KG5ld0JvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZWRnZS5hZHMudHdpdGNoLnR2JykpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRDc2FpVHlwZXMuaGFzKGNzYWlUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZWRDc2FpVHlwZXMuYWRkKGNzYWlUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUgKyAnIChjbGllbnQtc2lkZSBhZCBpbnNlcnRpb24sIG5vdCBibG9ja2FibGUgdmlhIG0zdTgpJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LCAnZmV0Y2gnKTsKICAgIH0KICAgIC8vIFNldCB1cCB2aXNpYmlsaXR5IG92ZXJyaWRlcyBhbmQgbG9jYWxTdG9yYWdlIGhvb2tzIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBhY3Jvc3MgcmVsb2FkcwogICAgZnVuY3Rpb24gb25Db250ZW50TG9hZGVkKCkgewogICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V2ZW50di1leHRlbnNpb24nKSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXYXJuaW5nOiA3VFYgZXh0ZW5zaW9uIGRldGVjdGVkIOKAlCBtYXkgY2F1c2UgYmxhY2sgc2NyZWVuIG9yIGJ1ZmZlcmluZyBpc3N1ZXMuIElmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zLCB0cnkgZGlzYWJsaW5nIDdUVi4nKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVzdW1lIHRoZSBwbGF5ZXIgb24gdGFiIGZvY3VzIGlmIFR3aXRjaCBwYXVzZWQgaXQgZHVyaW5nIGFuIGFkIG9uIGEgaGlkZGVuIHRhYi4KICAgICAgICAvLyBQcmV2aW91c2x5IGFsc28gc3Bvb2ZlZCBkb2N1bWVudC5oaWRkZW4gLyB2aXNpYmlsaXR5U3RhdGUgLyBoYXNGb2N1cyBhbmQgc3dhbGxvd2VkCiAgICAgICAgLy8gdGhlIGV2ZW50cyBvbiB0aGUgY2FwdHVyZSBwaGFzZS4gVGhhdCBicm9rZSBvdGhlciBleHRlbnNpb25zIHRoYXQga2V5IG9mZiByZWFsCiAgICAgICAgLy8gdmlzaWJpbGl0eSAoZS5nLiBCZXR0ZXJUVFYgIk11dGUgSW52aXNpYmxlIFBsYXllciIpLiBSZXN1bWUtb24tZm9jdXMgYWxvbmUgaXMKICAgICAgICAvLyBlbm91Z2ggdG8ga2VlcCBwbGF5YmFjayBhbGl2ZSBhY3Jvc3MgaGlkZGVu4oaSdmlzaWJsZSB0cmFuc2l0aW9ucyBkdXJpbmcgYWRzLgogICAgICAgIC8vIFN5bmMnZCB3aXRoIFRUVi1BQiB2Ni41LjAuCiAgICAgICAgbGV0IHdhc1ZpZGVvUGxheWluZyA9IHRydWU7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eUNoYW5nZSA9ICgpID0+IHsKICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID09PSAwKSByZXR1cm47CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5oaWRkZW4pIHsKICAgICAgICAgICAgICAgIHdhc1ZpZGVvUGxheWluZyA9ICF2aWRlb3NbMF0ucGF1c2VkICYmICF2aWRlb3NbMF0uZW5kZWQ7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgdmlkZW9zWzBdLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlKTsKICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBkZWNsYXJlT3B0aW9ucyh3aW5kb3cpOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBsc1JlbG9hZEFmdGVyQWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkUGxheWVyQWZ0ZXJBZCcpOwogICAgICAgIGlmIChsc1JlbG9hZEFmdGVyQWQgIT09IG51bGwpIHsKICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IGxzUmVsb2FkQWZ0ZXJBZCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc1JlbG9hZENvb2xkb3duID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZENvb2xkb3duU2Vjb25kcycpKTsKICAgICAgICBpZiAoIWlzTmFOKGxzUmVsb2FkQ29vbGRvd24pICYmIGxzUmVsb2FkQ29vbGRvd24gPj0gMCkgewogICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSBsc1JlbG9hZENvb2xkb3duOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVSZWxvYWRDYXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcCcpOwogICAgICAgIGlmIChsc0Rpc2FibGVSZWxvYWRDYXAgIT09IG51bGwpIHsKICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9IGxzRGlzYWJsZVJlbG9hZENhcCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0RyaWZ0UmF0ZSA9IHBhcnNlRmxvYXQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2RyaWZ0Q29ycmVjdGlvblJhdGUnKSk7CiAgICAgICAgaWYgKCFpc05hTihsc0RyaWZ0UmF0ZSkgJiYgbHNEcmlmdFJhdGUgPj0gMCkgewogICAgICAgICAgICBEcmlmdENvcnJlY3Rpb25SYXRlID0gbHNEcmlmdFJhdGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGxheWVyVHlwZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19wbGF5ZXJUeXBlJyk7CiAgICAgICAgaWYgKGxzUGxheWVyVHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9IGxzUGxheWVyVHlwZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQaW5CYWNrdXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcGluQmFja3VwUGxheWVyVHlwZScpOwogICAgICAgIGlmIChsc1BpbkJhY2t1cCAhPT0gbnVsbCkgewogICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gbHNQaW5CYWNrdXAgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQcmVmZXJMb3cgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcHJlZmVyTG93UXVhbGl0eUJhY2t1cCcpOwogICAgICAgIGlmIChsc1ByZWZlckxvdyA9PT0gJ2ZhbHNlJykgewogICAgICAgICAgICBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgc3RpY2t5IENTQUkgcGF0aCBvbmx5LCBubyBhdXRvcGxheSBmYWxsYmFjayBvciBlc2NhcGUgaGF0Y2gnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNGYXN0QXV0b3BsYXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZmFzdEF1dG9wbGF5Rmlyc3RUcnknKTsKICAgICAgICBpZiAobHNGYXN0QXV0b3BsYXkgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgRmFzdEF1dG9wbGF5Rmlyc3RUcnkgPSBmYWxzZTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFzdEF1dG9wbGF5Rmlyc3RUcnkgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgZnVsbCBTb3VyY2UtdGllciBwcm9iZSBvbiBldmVyeSBicmVhaycpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0JhY2t1cFN3YXBGaXJzdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19iYWNrdXBTd2FwRmlyc3QnKTsKICAgICAgICBpZiAobHNCYWNrdXBTd2FwRmlyc3QgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgQmFja3VwU3dhcEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cFN3YXBGaXJzdCBkaXNhYmxlZCB2aWEgbG9jYWxTdG9yYWdlIOKAlCB1c2luZyBzdGlja3kgQ1NBSSBwYXRoIChzdHJpcCBvbiBuYXRpdmUgc3RyZWFtKScpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVBZFNwb29maW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2Rpc2FibGVBZFNwb29maW5nJyk7CiAgICAgICAgaWYgKGxzRGlzYWJsZUFkU3Bvb2ZpbmcgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgRGlzYWJsZUFkU3Bvb2ZpbmcgPSBmYWxzZTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTcG9vZmluZyBlbmFibGVkIHZpYSBsb2NhbFN0b3JhZ2Ugb3B0LWluIOKAlCBmaXJpbmcgR1FMIGFkLXRyYWNraW5nIGJlYWNvbnMnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNSZWNvdmVyRnJvbVNpbGVudE11dGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVjb3ZlckZyb21TaWxlbnRNdXRlJyk7CiAgICAgICAgaWYgKGxzUmVjb3ZlckZyb21TaWxlbnRNdXRlID09PSAnZmFsc2UnKSB7CiAgICAgICAgICAgIFJlY292ZXJGcm9tU2lsZW50TXV0ZSA9IGZhbHNlOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZWNvdmVyRnJvbVNpbGVudE11dGUgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgaGFyZC1yZWxvYWQgYmFja3N0b3AgcmVzcGVjdHMgYWxyZWFkeS1tdXRlZCBzdGF0ZSwgbWlkLXNlc3Npb24gbWFudWFsIG11dGVzIHByZXNlcnZlZCBhY3Jvc3MgcmVsb2FkcycpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0hpZGVBZE92ZXJsYXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfaGlkZUFkT3ZlcmxheScpOwogICAgICAgIGlmIChsc0hpZGVBZE92ZXJsYXkgPT09ICd0cnVlJykgewogICAgICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gJy50YXMtYWRibG9jay1vdmVybGF5IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9JzsKICAgICAgICAgICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgfQogICAgfSBjYXRjaCB7fQogICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ29uZmlnOiBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJyArIFJlbG9hZFBsYXllckFmdGVyQWQgKyAnLCBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9ICcgKyBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSArICcsIFBpbkJhY2t1cFBsYXllclR5cGUgPSAnICsgUGluQmFja3VwUGxheWVyVHlwZSk7CiAgICBob29rV2luZG93V29ya2VyKCk7CiAgICBob29rRmV0Y2goKTsKICAgIGNvbnN0IHJlYWxYSFJPcGVuID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW47CiAgICBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbiA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbihtZXRob2QsIHVybCkgewogICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiB1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgIGNvbnN0IGNzYWlUeXBlID0gdXJsLmluY2x1ZGVzKCdicD1taWRyb2xsJykgPyAnbWlkcm9sbCcgOiB1cmwuaW5jbHVkZXMoJ2JwPXByZXJvbGwnKSA/ICdwcmVyb2xsJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgY29uc3QgeGhyS2V5ID0gY3NhaVR5cGUgKyAnLXhocic7CiAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyh4aHJLZXkpKSB7CiAgICAgICAgICAgICAgICBsb2dnZWRDc2FpVHlwZXMuYWRkKHhocktleSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDU0FJIGFkIHJlcXVlc3QgKFhIUikgZGV0ZWN0ZWQg4oCUIHR5cGU6ICcgKyBjc2FpVHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlYWxYSFJPcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9LCAnb3BlbicpOwogICAgaWYgKFBsYXllckJ1ZmZlcmluZ0ZpeCkgewogICAgICAgIG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcoKTsKICAgIH0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJpbnRlcmFjdGl2ZSIpIHsKICAgICAgICBvbkNvbnRlbnRMb2FkZWQoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICAgICAgfSk7CiAgICB9CiAgICB3aW5kb3cuc2ltdWxhdGVBZHMgPSAoZGVwdGgpID0+IHsKICAgICAgICBpZiAoZGVwdGggPT09IHVuZGVmaW5lZCB8fCBkZXB0aCA8IDApIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkIGRlcHRoIHBhcmFtZXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIGluc3RhbmNlCiAgICAvLyB0aGF0IGZpZ2h0cyBmb3IgcGxheWVyIGNvbnRyb2wuIE9ubHkgdGhlIHRvcCBmcmFtZSBob3N0cyB0aGUgcGxheWVyIG9uIHR3aXRjaC50di9DSEFOTkVMOwogICAgLy8gbmVzdGVkIGF1eGlsaWFyeSBmcmFtZXMgYXJlIG5vaXNlLgogICAgLy8gQWxsb3ctbGlzdCBmb3IgbmVzdGVkLWZyYW1lIGluamVjdGlvbjogVHdpdGNoJ3MgdGhyZWUgZG9jdW1lbnRlZCBlbWJlZCBjb250ZXh0cwogICAgLy8gKGh0dHBzOi8vZGV2LnR3aXRjaC50di9kb2NzL2VtYmVkL3ZpZGVvLWFuZC1jbGlwcy8pIOKAlCBwcmVzZXJ2ZXMgVHdpdGNoIHN0cmVhbXMKICAgIC8vIGVtYmVkZGVkIG9uIHRoaXJkLXBhcnR5IHNpdGVzIHdoZXJlIHRoZSBzY3JpcHQgcnVucyBpbiBhbiBpZnJhbWUgd2hvc2UgcGFyZW50CiAgICAvLyBpcyBvbiBhIGRpZmZlcmVudCBvcmlnaW4uCiAgICAvLyBVc2Ugd2luZG93LmZyYW1lRWxlbWVudCB0byBkZXRlY3QgbmVzdGVkIGZyYW1lcyDigJQgbnVsbCBvbiB0b3AgZnJhbWUsIHRoZSBpZnJhbWUKICAgIC8vIGVsZW1lbnQgb24gYSBzYW1lLW9yaWdpbiBuZXN0ZWQgZnJhbWUsIHRocm93cyBvbiBhIGNyb3NzLW9yaWdpbiBuZXN0ZWQgZnJhbWUuCiAgICAvLyBNb3JlIHJlbGlhYmxlIHRoYW4gJ3dpbmRvdyAhPT0gd2luZG93LnRvcCcgYmVjYXVzZSBUYW1wZXJtb25rZXkgd3JhcHMgd2luZG93IGluIGEKICAgIC8vIHByb3h5IHdoZXJlIHRoZSBzdHJpY3QgY29tcGFyaXNvbiBjYW4gcmV0dXJuIHRydWUgZXZlbiBvbiB0aGUgdG9wIGZyYW1lLgogICAgbGV0IF9pc05lc3RlZCA9IGZhbHNlOwogICAgdHJ5IHsgX2lzTmVzdGVkID0gd2luZG93LmZyYW1lRWxlbWVudCAhPT0gbnVsbDsgfSBjYXRjaCAoX2UpIHsgX2lzTmVzdGVkID0gdHJ1ZTsgfQogICAgaWYgKF9pc05lc3RlZCkgewogICAgICAgIGNvbnN0IF9ob3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2lzRW1iZWRDb250ZXh0ID0gX2hvc3QgPT09ICdwbGF5ZXIudHdpdGNoLnR2JyB8fCBfaG9zdCA9PT0gJ2VtYmVkLnR3aXRjaC50dicgfHwgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2VtYmVkLycpOwogICAgICAgIGlmICghX2lzRW1iZWRDb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZpZGVvLXN3YXAtbmV3IHNraXBwZWQg4oCUIG5lc3RlZCBmcmFtZSBvbiAnICsgX2hvc3QgKyBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSArICcgKG5vdCBhIFR3aXRjaCBlbWJlZCkuIElmIHlvdSBzZWUgdGhpcyBvbiB0d2l0Y2gudHYvQ0hBTk5FTCB0b3AgZnJhbWUsIHBsZWFzZSByZXBvcnQuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBvbiB0aGUgVHdpdGNoIGNsaXAgZWRpdG9yIOKAlCBjbGlwcy50d2l0Y2gudHYgaG9zdCBvciAvPGNoYW5uZWw+L2NsaXAvPHNsdWc+IHBhdGguCiAgICAvLyBPdXIgZmV0Y2gvV29ya2VyIGhvb2tzIGFuZCBidWZmZXIgbW9uaXRvciBhcmUgYWltZWQgYXQgdGhlIGxpdmUgY2hhbm5lbCBwbGF5ZXI7IG9uIHRoZQogICAgLy8gY2xpcCBlZGl0b3IncyBzZWVrYWJsZSBwcmV2aWV3IHRoZXkgaGF2ZSBubyBhZHMgdG8gYWN0IG9uIGFuZCBoYXZlIGNhdXNlZCB0aGUgcHJldmlldwogICAgLy8gdG8gZnJlZXplIHdoZW4gdGhlIHVzZXIgZHJhZ3MgdGhlIHRyaW0gcmFuZ2UuIChTeW5jJ2Qgd2l0aCBUVFYtQUIgdjYuNC45LikKICAgIHsKICAgICAgICBjb25zdCBfY2xpcEhvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfY2xpcFBhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSB8fCAnJzsKICAgICAgICBpZiAoX2NsaXBIb3N0ID09PSAnY2xpcHMudHdpdGNoLnR2JyB8fCAvXlwvW14vXStcL2NsaXBcL1teL10rLy50ZXN0KF9jbGlwUGF0aCkpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmlkZW8tc3dhcC1uZXcgc2tpcHBlZCDigJQgY2xpcCBlZGl0b3IgcGFnZSAoJyArIF9jbGlwSG9zdCArIF9jbGlwUGF0aCArICcpLicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gNTQ7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2aWRlby1zd2FwLW5ldyB2JyArIG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICcgbG9hZGluZycpOwogICAgaWYgKHR5cGVvZiB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID49IG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbikgewogICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENPTkZMSUNUOiB2aWRlby1zd2FwLW5ldyB2JyArIG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICcgc2tpcHBlZCDigJQgYW5vdGhlciBzY3JpcHQgYWxyZWFkeSBhY3RpdmUgKHYnICsgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICcpLiBSZW1vdmUgZHVwbGljYXRlIHNjcmlwdHMuJyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiA9IG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbjsKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gT3B0aW9ucyAvIGdsb2JhbHMKICAgICAgICAvLyAnZW1iZWQnIG1vdmVkIHRvIGVuZCDigJQgZmllbGQtb2JzZXJ2ZWQgVHdpdGNoIHJldHVybnMgR1FMICdzZXJ2ZXIgZXJyb3InIGZvcgogICAgICAgIC8vIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gb24gZW1iZWQgd2hlbiByZXF1ZXN0ZWQgZnJvbSB0d2l0Y2gudHYgb3JpZ2luLgogICAgICAgIHNjb3BlLk9QVF9CQUNLVVBfUExBWUVSX1RZUEVTID0gWyAncG9wb3V0JywgJ21vYmlsZV93ZWInLCAnZW1iZWQnIF07CiAgICAgICAgc2NvcGUuT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSA9ICdwb3BvdXQnOwogICAgICAgIC8vICd0d2l0Y2gtc3RpdGNoZWQnIGNhdGNoZXMgdGhlIHR3aXRjaC1zdGl0Y2hlZC0qIERBVEVSQU5HRSBjbGFzcyBmYW1pbHkKICAgICAgICAvLyAoLWFkLCAtbWlkLCAtcG9kLCBldGMuKSB3aXRob3V0IHJlcXVpcmluZyBhbiBleGFjdCAtYWQgc3VmZml4LiBUd2l0Y2gtCiAgICAgICAgLy8gcHJlZml4ZWQgc28gd2UgZG9uJ3QgcmUtaW50cm9kdWNlIHRoZSBQUiAjMTIwIGZhbHNlLXBvc2l0aXZlIGZyb20gYmFyZQogICAgICAgIC8vICdzdGl0Y2hlZCcgc3Vic3RyaW5nIG1hdGNoLgogICAgICAgIHNjb3BlLkFEX1NJR05JRklFUlMgPSBbJ3N0aXRjaGVkLWFkJywgJ0VYVC1YLUNVRS1PVVQnLCAndHdpdGNoLXN0aXRjaGVkJywgJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0idHdpdGNoLW1hZi1hZCInLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtdHJpZ2dlciInXTsKICAgICAgICAvLyBDb25maXJtZWQgc2Vzc2lvbi9zb3VyY2UgbWV0YWRhdGEsIG5ldmVyIGFkIG1hcmtlcnMg4oCUIGZpbHRlciBmcm9tIGNhbmRpZGF0ZSBsb2cuCiAgICAgICAgc2NvcGUuS05PV05fTk9OX0FEX1NJR05JRklFUlMgPSBbJ3R3aXRjaC1zZXNzaW9uJywgJ3R3aXRjaC1zdHJlYW0tc291cmNlJywgJ3R3aXRjaC1hZC1xdWFydGlsZScsICd0d2l0Y2gtYXNzaWdubWVudCddOwogICAgICAgIHNjb3BlLkFEX1NFR01FTlRfVVJMX1BBVFRFUk5TID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24uCiAgICAgICAgc2NvcGUuVFdJVENIX0FEX1VSTF9SRVdSSVRFX1JFR0VYID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVVJJX0FUVFJJQlVURV9SRUdFWCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5MSVZFX1NJR05JRklFUiA9ICcsbGl2ZSc7CiAgICAgICAgc2NvcGUuQ0xJRU5UX0lEID0gJ2tpbW5lNzhreDNuY3g2YnJnbzRtdjZ3a2k1aDFrbyc7CiAgICAgICAgLy8gVGhlc2UgYXJlIG9ubHkgcmVhbGx5IGZvciBXb3JrZXIgc2NvcGUuLi4KICAgICAgICBzY29wZS5TdHJlYW1JbmZvcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3NCeVVybCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgLy8gTmVlZCB0aGlzIGluIGJvdGggc2NvcGVzLiBXaW5kb3cgc2NvcGUgbmVlZHMgdG8gdXBkYXRlIHRoaXMgdG8gd29ya2VyIHNjb3BlLgogICAgICAgIHNjb3BlLmdxbF9kZXZpY2VfaWQgPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudEludGVncml0eUhlYWRlciA9IG51bGw7CiAgICAgICAgc2NvcGUuQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZDsKICAgICAgICBzY29wZS5TaW11bGF0ZWRBZHNEZXB0aCA9IDA7CiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IHRydWU7Ly8gQWZ0ZXIgdGhlIGFkIGZpbmlzaGVzIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5SZWxvYWRDb29sZG93blNlY29uZHMgPSAzMDsvLyBNaW5pbXVtIHNlY29uZHMgYmV0d2VlbiByZWxvYWRzIOKAlCBicmVha3MgQ1NBSSBjYXNjYWRlcyB0cmlnZ2VyZWQgYnkgcmVsb2FkCiAgICAgICAgc2NvcGUuRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gNTsvLyBBbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIGVhcmx5IHJlbG9hZCAofjJzIGVhY2gsIHNvIDUgPSB+MTBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gZmFsc2U7Ly8gSWYgdHJ1ZSwgcmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvTWF4QWdlTXMgPSAzMCAqIDYwICogMTAwMDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIEVuY29kaW5nczogbnVsbCwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzOiBudWxsLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NTdGF0dXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4OiAtMSwKICAgICAgICAgICAgUGlubmVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgSGFzQ2hlY2tlZFVua25vd25UYWdzOiBmYWxzZSwKICAgICAgICAgICAgSGFzQ29uZmlybWVkQWRBdHRyczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICAgICAgSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3M6IGZhbHNlLAogICAgICAgICAgICBJc01pZHJvbGw6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIENsZWFuUGxheWxpc3RDb3VudDogMCwKICAgICAgICAgICAgUGVuZGluZ0FkRW5kQXQ6IDAsCiAgICAgICAgICAgIEFkRW5kQm91bmNlQ291bnQ6IDAsCiAgICAgICAgICAgIENvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzOiAwLAogICAgICAgICAgICBVc2VGYWxsYmFja1N0cmVhbTogZmFsc2UsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZU0zVTg6IG51bGwsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQ6IDAsCiAgICAgICAgICAgIENvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xsczogMCwKICAgICAgICAgICAgRWFybHlSZWxvYWRUcmlnZ2VyZWQ6IGZhbHNlLAogICAgICAgICAgICBMYXN0UGxheWVyUmVsb2FkOiAwLAogICAgICAgICAgICBSZWxvYWRUaW1lc3RhbXBzOiBbXSwKICAgICAgICAgICAgLy8gRGV0ZWN0aW9uIGRpYWdub3N0aWNzCiAgICAgICAgICAgIExvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uOiBmYWxzZSwKICAgICAgICAgICAgQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXM6IDAsCiAgICAgICAgICAgIExvZ2dlZFRva2VuRmFpbHVyZVN0cmVhazogZmFsc2UsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hc2tBc05hdGl2ZShmbiwgbmFtZSkgewogICAgICAgIGZuLnRvU3RyaW5nID0gKCkgPT4gJ2Z1bmN0aW9uICcgKyBuYW1lICsgJygpIHsgW25hdGl2ZSBjb2RlXSB9JzsKICAgICAgICByZXR1cm4gZm47CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5VcmxzLmZvckVhY2goKF8sIHVybCkgPT4geyBkZWxldGUgU3RyZWFtSW5mb3NCeVVybFt1cmxdOyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjb25zdCBsb2dnZWRDc2FpVHlwZXMgPSBuZXcgU2V0KCk7CiAgICBsZXQgdHdpdGNoUGxheWVyQW5kU3RhdGUgPSBudWxsOwogICAgbGV0IGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgPSBmYWxzZTsKICAgIGxldCBsYXN0UmVsb2FkVGltZXN0YW1wID0gMDsKICAgIGxldCByZWxvYWRUaW1lc3RhbXBzID0gW107CiAgICBsZXQgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gbnVsbDsvLyB0cmFja3MgcHJlLWVzY2FsYXRpb24gdmFsdWUgc28gd2UgY2FuIHJldmVydCB3aGVuIHRoZSBidXJzdCBzdWJzaWRlcwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgY29uc3Qgd29ya2VyU3RyaW5nQ29uZmxpY3RzID0gWwogICAgICAgICd0d2l0Y2gnLAogICAgICAgICdpc1ZhcmlhbnRBJy8vIFR3aXRjaE5vU3ViCiAgICBdOwogICAgY29uc3Qgd29ya2VyU3RyaW5nQWxsb3cgPSBbXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ1JlaW5zZXJ0ID0gWwogICAgICAgICdpc1ZhcmlhbnRBJywvLyBUd2l0Y2hOb1N1YiAocHJpb3IgdG8gKDAuOSkpCiAgICAgICAgJ2Jlc3VwZXIvJywvLyBUd2l0Y2hOb1N1YiAoMC45KQogICAgICAgICcke3BhdGNoX3VybH0nLy8gVHdpdGNoTm9TdWIgKDAuOS4xKQogICAgXTsKICAgIGZ1bmN0aW9uIGdldENsZWFuV29ya2VyKHdvcmtlcikgewogICAgICAgIGxldCByb290ID0gbnVsbDsKICAgICAgICBsZXQgcGFyZW50ID0gbnVsbDsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSAmJiAhd29ya2VyU3RyaW5nQWxsb3cuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSkgewogICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8vIEZvcmVpZ24gZXh0ZW5zaW9uIG1heSBoYXZlIGZyb3plbiBXb3JrZXIucHJvdG90eXBlOyBwZXItbGluayB0cnktY2F0Y2guCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhcmVudCwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gUGVyLWxpbmsgdHJ5LWNhdGNoOiBmb3JlaWduLWZyb3plbiBlbnRyeSBzaG91bGRuJ3QgYWJvcnQgdGhlIGNoYWluLgogICAgICAgICAgICB0cnkgeyBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVpbnNlcnRbaV0sIHBhcmVudCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgcGFyZW50ID0gcmVpbnNlcnRbaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQ7CiAgICB9CiAgICBmdW5jdGlvbiBpc1ZhbGlkV29ya2VyKHdvcmtlcikgewogICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHdvcmtlci50b1N0cmluZygpOwogICAgICAgIGNvbnN0IGhhc0NvbmZsaWN0ID0gd29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgY29uc3QgaGFzQWxsb3cgPSB3b3JrZXJTdHJpbmdBbGxvdy5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGNvbnN0IGhhc1JlaW5zZXJ0ID0gd29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBpZiAoaGFzQ29uZmxpY3QgJiYgIWhhc0FsbG93ICYmICFoYXNSZWluc2VydCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgcmVqZWN0ZWQg4oCUIGNvbmZsaWN0IHN0cmluZyBmb3VuZDogJyArIHdvcmtlclN0cmluZ0NvbmZsaWN0cy5maWx0ZXIoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkuam9pbignLCAnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhaGFzQ29uZmxpY3QgfHwgaGFzQWxsb3cgfHwgaGFzUmVpbnNlcnQ7CiAgICB9CiAgICBsZXQgaW5qZWN0ZWRCbG9iVXJsID0gbnVsbDsKICAgIGxldCBvcmlnaW5hbFJldm9rZU9iamVjdFVSTCA9IG51bGw7CiAgICBmdW5jdGlvbiBob29rV2luZG93V29ya2VyKCkgewogICAgICAgIC8vIFByZXZlbnQgVHdpdGNoIGZyb20gcmV2b2tpbmcgb3VyIGluamVjdGVkIHdvcmtlciBibG9iIFVSTAogICAgICAgIGlmICghVVJMLnJldm9rZU9iamVjdFVSTC5fX3Rhc01hc2tlZCkgewogICAgICAgICAgICBvcmlnaW5hbFJldm9rZU9iamVjdFVSTCA9IFVSTC5yZXZva2VPYmplY3RVUkw7CiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwgPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgICAgICBpZiAodXJsID09PSBpbmplY3RlZEJsb2JVcmwpIHJldHVybjsKICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFJldm9rZU9iamVjdFVSTC5jYWxsKHRoaXMsIHVybCk7CiAgICAgICAgICAgIH0sICdyZXZva2VPYmplY3RVUkwnKTsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTC5fX3Rhc01hc2tlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlaW5zZXJ0ID0gZ2V0V29ya2Vyc0ZvclJlaW5zZXJ0KHdpbmRvdy5Xb3JrZXIpOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIChnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyKSB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGxldCBpc1R3aXRjaFdvcmtlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpc1R3aXRjaFdvcmtlciA9IG5ldyBVUkwodHdpdGNoQmxvYlVybCkub3JpZ2luLmVuZHNXaXRoKCcudHdpdGNoLnR2Jyk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICBpZiAoIWlzVHdpdGNoV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm9uLVR3aXRjaCB3b3JrZXIgc2tpcHBlZDogJyArIHR3aXRjaEJsb2JVcmwpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFByZS1jaGVjazogdmVyaWZ5IHdlIGNhbiBmZXRjaCB0aGUgd29ya2VyIEpTIGJlZm9yZSBpbmplY3RpbmcKICAgICAgICAgICAgICAgIGxldCBwcmVmZXRjaGVkV29ya2VySnMgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsgcHJlZmV0Y2hlZFdvcmtlckpzID0gZ2V0V2FzbVdvcmtlckpzKHR3aXRjaEJsb2JVcmwpOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICBpZiAoIXByZWZldGNoZWRXb3JrZXJKcykgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEZhaWxlZCB0byBmZXRjaCB3b3JrZXIgSlMg4oCUIGZhbGxpbmcgYmFjayB0byB1bm1vZGlmaWVkIHdvcmtlcicpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBpbnRlcmNlcHRlZCDigJQgaW5qZWN0aW5nIGFkLWJsb2NrIGhvb2tzJyk7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdCbG9iU3RyID0gYAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdGZXRjaFJlcXVlc3RzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgICAgICR7aGFzQWRUYWdzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRNYXRjaGVkQWRTaWduaWZpZXJzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtzdHJpcEFkU2VnbWVudHMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3Byb2Nlc3NNM1U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtob29rV29ya2VyRmV0Y2gudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2RlY2xhcmVPcHRpb25zLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRBY2Nlc3NUb2tlbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z3FsUmVxdWVzdC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cGFyc2VBdHRyaWJ1dGVzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtzZXRTdHJlYW1JbmZvVXJscy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7b25Gb3VuZEFkLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRXYXNtV29ya2VySnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFNlcnZlclRpbWVGcm9tTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cmVwbGFjZVNlcnZlclRpbWVJbk0zdTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFN0cmVhbVVybEZvclJlc29sdXRpb24udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3VwZGF0ZUFkYmxvY2tCYW5uZXJGb3JTdHJlYW0udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3BydW5lU3RyZWFtSW5mb3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2NyZWF0ZVN0cmVhbUluZm8udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBnZXRXYXNtV29ya2VySnMoJyR7dHdpdGNoQmxvYlVybC5yZXBsYWNlQWxsKCInIiwgIiUyNyIpfScpOwogICAgICAgICAgICAgICAgICAgIGRlY2xhcmVPcHRpb25zKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fX3Rhc1BydW5lSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3Rhc1BydW5lSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwcnVuZVN0cmVhbUluZm9zLCA1ICogNjAgKiAxMDAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9ICR7UmVsb2FkUGxheWVyQWZ0ZXJBZH07CiAgICAgICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gJHtSZWxvYWRDb29sZG93blNlY29uZHN9OwogICAgICAgICAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9ICR7RWFybHlSZWxvYWRQb2xsVGhyZXNob2xkfTsKICAgICAgICAgICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJHtQaW5CYWNrdXBQbGF5ZXJUeXBlfTsKICAgICAgICAgICAgICAgICAgICBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFID0gJyR7T1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRX0nOwogICAgICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgPSAke2dxbF9kZXZpY2VfaWQgPyAiJyIgKyBncWxfZGV2aWNlX2lkICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9ICR7QXV0aG9yaXphdGlvbkhlYWRlciA/ICInIiArIEF1dGhvcml6YXRpb25IZWFkZXIgKyAiJyIgOiB1bmRlZmluZWR9OwogICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9ICR7Q2xpZW50SW50ZWdyaXR5SGVhZGVyID8gIiciICsgQ2xpZW50SW50ZWdyaXR5SGVhZGVyICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVWJvVXBkYXRlRGV2aWNlSWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdGZXRjaFJlc3BvbnNlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXNwb25zZURhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIHRpbWVvdXRJZCB9ID0gcGVuZGluZ0ZldGNoUmVxdWVzdHMuZ2V0KHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHJlc3BvbnNlRGF0YS5lcnJvcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSByZXNwb25zZSBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IHRha2VzIHN0YXR1cy9zdGF0dXNUZXh0L2hlYWRlcnMg4oCUIHVybC9yZWRpcmVjdGVkL3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZS4gSVZTIFdBU00gdmFsaWRhdGVzIHRoZXNlIChTcGFkZS90cmFja2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cykgYW5kIHRocm93cyBOZXR3b3JrRXJyb3IgaWYgdGhleSdyZSBtaXNzaW5nIOKAlCBUVFYtQUIgdjYuMy41IGZpeC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VEYXRhLmJvZHksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VEYXRhLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlRGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VEYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICd1cmwnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudXJsIHx8ICcnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICdyZWRpcmVjdGVkJywgeyB2YWx1ZTogISFyZXNwb25zZURhdGEucmVkaXJlY3RlZCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlRGF0YS50eXBlIHx8ICdiYXNpYycsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnU2ltdWxhdGVBZHMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW11bGF0ZWRBZHNEZXB0aCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTaW11bGF0ZWRBZHNEZXB0aDogJyArIFNpbXVsYXRlZEFkc0RlcHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAhQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50czogJyArIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBob29rV29ya2VyRmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZCB0aGUgZXZhbCDigJQgbWFsZm9ybWVkIHdvcmtlclN0cmluZyBzaG91bGRuJ3Qgc2lsZW50bHkgYnJlYWsKICAgICAgICAgICAgICAgICAgICAvLyBUd2l0Y2gncyBwbGF5ZXIgbG9naWMgd2l0aG91dCBhIGRpYWdub3N0aWMuCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXZhbCh3b3JrZXJTdHJpbmcpOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ1tBRCBERUJVR10gV29ya2VyIGV2YWwgZmFpbGVkIOKAlCBUd2l0Y2ggcGxheWVyIGxvZ2ljIG5vdCBsb2FkZWQ6JywgZSk7IH0KICAgICAgICAgICAgICAgIGAKICAgICAgICAgICAgICAgIGlmIChpbmplY3RlZEJsb2JVcmwgJiYgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBvcmlnaW5hbFJldm9rZU9iamVjdFVSTC5jYWxsKFVSTCwgaW5qZWN0ZWRCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVYm9VcGRhdGVBZEJhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcihlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIoZmFsc2UsIGUuZGF0YS5raW5kKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1BhdXNlUmVzdW1lUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBhc3luYyBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEua2V5ID09ICdGZXRjaFJlcXVlc3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IGV2ZW50LmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IGhhbmRsZVdvcmtlckZldGNoUmVxdWVzdChmZXRjaFJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ0ZldGNoUmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIFdvcmtlciBjcmFzaCByZWNvdmVyeSDigJQgSVZTIFdBU00gd29ya2VyIGNhbiBmaXJlIFJ1bnRpbWVFcnJvcgogICAgICAgICAgICAgICAgLy8gKGUuZy4gImluZGV4IG91dCBvZiBib3VuZHMiKSBhbmQgZGllLiBBIHNpbmdsZSBjcmFzaCBmaXJlcyBtdWx0aXBsZQogICAgICAgICAgICAgICAgLy8gZXJyb3IgZXZlbnRzOyBkZWR1cGUgdmlhIGEgbG9jYWwgZmxhZy4gT24gZmlyc3QgZXJyb3IsIHRyaWdnZXIgYQogICAgICAgICAgICAgICAgLy8gcGxheWVyIHJlbG9hZCDigJQgVHdpdGNoIHJlLXNwYXducyB0aGUgd29ya2VyIGFzIHBhcnQgb2YgdGhlIG5ldwogICAgICAgICAgICAgICAgLy8gcGxheWVyIGluc3RhbmNlLCBhbmQgZXhpc3RpbmcgcmVsb2FkIGNvb2xkb3duIHByZXZlbnRzIHJlc3RhcnQgbG9vcHMuCiAgICAgICAgICAgICAgICBsZXQgY3Jhc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyYXNoZWQpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBJVlMgV0FTTSB3b3JrZXIgY3Jhc2hlZDogJyArICgoZSAmJiBlLm1lc3NhZ2UpIHx8ICd1bmtub3duIGVycm9yJykgKyAnIOKAlCB0cmlnZ2VyaW5nIHBsYXllciByZWxvYWQgdG8gcmVjb3ZlcicpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7IHJlbG9hZFR3aXRjaFBsYXllcihmYWxzZSk7IH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgY3Jhc2ggcmVjb3ZlcnkgZmFpbGVkOiAnICsgZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCB3b3JrZXJJbnN0YW5jZSA9IHJlaW5zZXJ0V29ya2VycyhuZXdXb3JrZXIsIHJlaW5zZXJ0KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnV29ya2VyJywgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlckluc3RhbmNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFdvcmtlcih2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB3b3JrZXJJbnN0YW5jZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQXR0ZW1wdCB0byBzZXQgdHdpdGNoIHdvcmtlciBkZW5pZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbVdvcmtlckpzKHR3aXRjaEJsb2JVcmwpIHsKICAgICAgICBpZiAoIWdldFdhc21Xb3JrZXJKcy5jYWNoZSkgewogICAgICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF07CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJlcS5vcGVuKCdHRVQnLCB0d2l0Y2hCbG9iVXJsLCBmYWxzZSk7CiAgICAgICAgcmVxLm92ZXJyaWRlTWltZVR5cGUoInRleHQvamF2YXNjcmlwdCIpOwogICAgICAgIHJlcS5zZW5kKCk7CiAgICAgICAgY29uc3QgdGV4dCA9IHJlcS5yZXNwb25zZVRleHQ7CiAgICAgICAgZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdID0gdGV4dDsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0cmVhbUluZm9VcmxzKHN0cmVhbUluZm8sIGVuY29kaW5nc00zdTgpIHsKICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvLyB2MiBBUEkgdmFyaWFudCBVUkxzIGFyZSByYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnIGluIHRoZSBwYXRoLgogICAgICAgICAgICAvLyBBY2NlcHQgYWJzb2x1dGUgVVJMcyAoY29udGFpbmluZyAnOi8vJykgYWxvbmdzaWRlICcubTN1OCcgVVJMcy4KICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmVzW2ldPy50cmltKCk7CiAgICAgICAgICAgIGlmICh0cmltbWVkICYmICF0cmltbWVkLnN0YXJ0c1dpdGgoJyMnKSAmJiAodHJpbW1lZC5pbmNsdWRlcygnLm0zdTgnKSB8fCB0cmltbWVkLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zQnlVcmxbbGluZXNbaV0udHJpbUVuZCgpXSA9IHN0cmVhbUluZm87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBsaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uSW5mbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVSYXRlOiBhdHRyaWJ1dGVzWydGUkFNRS1SQVRFJ10sCiAgICAgICAgICAgICAgICAgICAgICAgIFVybDogbGluZXNbaSArIDFdCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHMuc2V0KGxpbmVzW2kgKyAxXS50cmltRW5kKCksIHJlc29sdXRpb25JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZUFkYmxvY2tCYW5uZXJGb3JTdHJlYW0oc3RyZWFtSW5mbykgewogICAgICAgIGNvbnN0IGlzU2hvd2luZ0FkID0gISFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nczsKICAgICAgICBpZiAoIWlzU2hvd2luZ0FkICYmIChzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyB8fCBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA+IDApKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID0gMDsKICAgICAgICB9CiAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICBrZXk6ICdVYm9VcGRhdGVBZEJhbm5lcicsCiAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgIGhhc0FkczogaXNTaG93aW5nQWQsCiAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4ID49IDAgPyBPUFRfQkFDS1VQX1BMQVlFUl9UWVBFU1tzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleF0gOiBudWxsCiAgICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBvbkZvdW5kQWQoc3RyZWFtSW5mbywgdGV4dFN0ciwgcmVsb2FkUGxheWVyLCByZWFsRmV0Y2gsIHVybCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBsZXQgcmVzdWx0ID0gdGV4dFN0cjsKICAgICAgICBzdHJlYW1JbmZvLklzTWlkcm9sbCA9IHRleHRTdHIuaW5jbHVkZXMoJyJNSURST0xMIicpIHx8IHRleHRTdHIuaW5jbHVkZXMoJyJtaWRyb2xsIicpOwogICAgICAgIC8vIFRyYWNrIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzIHRvIGRpc3Rpbmd1aXNoIHJlYWwgYWRzIGZyb20gZmFsc2UtcG9zaXRpdmUgc2lnbmlmaWVyIG1hdGNoZXMuCiAgICAgICAgLy8gVGhlc2UgYXR0cmlidXRlcyBhcmUgcHJlc2VudCBvbiBldmVyeSByZWFsIFR3aXRjaCBhZCBhbmQgYWJzZW50IGZyb20gYW55dGhpbmcgdGhhdCBjb3VsZAogICAgICAgIC8vIGZhbHNlLXBvc2l0aXZlIChlLmcuIG1ldGFkYXRhIGNvbnRhaW5pbmcgdGhlIHdvcmQgJ3N0aXRjaGVkJykuCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtQUQtU0VTU0lPTi1JRCcpIHx8IHRleHRTdHIuaW5jbHVkZXMoJ1gtVFYtVFdJVENILUFELVJBRFMtVE9LRU4nKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGxheWVyVHlwZXMgPSBbLi4uT1BUX0JBQ0tVUF9QTEFZRVJfVFlQRVNdOwogICAgICAgIC8vIFRyeSBwaW5uZWQgYmFja3VwIHBsYXllciB0eXBlIGZpcnN0IGlmIGF2YWlsYWJsZQogICAgICAgIGlmIChQaW5CYWNrdXBQbGF5ZXJUeXBlICYmIHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICBjb25zdCBwaW5uZWRJbmRleCA9IHBsYXllclR5cGVzLmluZGV4T2Yoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgaWYgKHBpbm5lZEluZGV4ID4gMCkgewogICAgICAgICAgICAgICAgcGxheWVyVHlwZXMuc3BsaWNlKHBpbm5lZEluZGV4LCAxKTsKICAgICAgICAgICAgICAgIHBsYXllclR5cGVzLnVuc2hpZnQoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuc2l6ZSA+PSBwbGF5ZXJUeXBlcy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyAmJiAhc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MuaW5jbHVkZXModXJsKSkgewogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncywgcmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJhY2t1cFNlYXJjaFN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgICAgICBsZXQgYmFja3VwUGxheWVyVHlwZUluZm8gPSAnJzsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYXllclR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllclR5cGUgPSBwbGF5ZXJUeXBlc1tpXTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5oYXMocGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5SZXNwb25zZSA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUsIHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlblJlc3BvbnNlICE9IG51bGwgJiYgYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JCb2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IGVycm9yQm9keSA9ICcg4oCUICcgKyAoYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS50ZXh0KCkpLnN1YnN0cmluZygwLCAyMDApOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFjY2VzcyB0b2tlbiBIVFRQICcgKyBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyBwbGF5ZXJUeXBlICsgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSA0MDMgPyAnIChpbnRlZ3JpdHk6ICcgKyAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyID8gJ3ByZXNlbnQnIDogJ21pc3NpbmcnKSArICcpJyA6ICcnKSArIGVycm9yQm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgPSAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID49IDMgJiYgIXN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZFRva2VuRmFpbHVyZVN0cmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUb2tlbiBmZXRjaCBmYWlsZWQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgKyAnIHRpbWVzIGNvbnNlY3V0aXZlbHkgYWNyb3NzIHBsYXllciB0eXBlcyDigJQgcG9zc2libGUgVHdpdGNoIGRldGVjdGlvbiAvIGludGVncml0eSByb3RhdGlvbiAvIHJhdGUgbGltaXRpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVG9rZW5SZXNwb25zZSAhPSBudWxsICYmIGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLmpzb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHJldHVybnMgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBpbiB0d28gb2JzZXJ2ZWQgc2hhcGVzOgogICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjogey4uLn0gfSAoZmxhdHRlciwgb2JzZXJ2ZWQgZm9yICdlbWJlZCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY2VwdCBlaXRoZXIuIEZpZWxkLW9ic2VydmVkIHNpbGVudGx5IGRyb3BwaW5nIGVtYmVkIGJhY2t1cCBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJJbmZvID0gYWNjZXNzVG9rZW4/LmVycm9ycyA/ICcgZXJyb3JzOiAnICsgSlNPTi5zdHJpbmdpZnkoYWNjZXNzVG9rZW4uZXJyb3JzKS5zdWJzdHJpbmcoMCwgMzAwKSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHBsYXllclR5cGUgKyAnLiBSZXNwb25zZSBrZXlzOiAnICsgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoYWNjZXNzVG9rZW4gfHwge30pKSArIGVyckluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyA9IChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzIHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID49IDMgJiYgIXN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFRva2VuIGZldGNoIGZhaWxlZCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyArICcgdGltZXMgY29uc2VjdXRpdmVseSBhY3Jvc3MgcGxheWVyIHR5cGVzIOKAlCBwb3NzaWJsZSBUd2l0Y2ggZGV0ZWN0aW9uIC8gaW50ZWdyaXR5IHJvdGF0aW9uIC8gcmF0ZSBsaW1pdGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsSW5mbyA9IG5ldyBVUkwoJ2h0dHBzOi8vdXNoZXIudHR2bncubmV0L2FwaS8nICsgKFYyQVBJID8gJ3YyLycgOiAnJykgKyAnY2hhbm5lbC9obHMvJyArIHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUgKyAnLm0zdTgnICsgc3RyZWFtSW5mby5Vc2hlclBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmxJbmZvLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgc3BhdC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmxJbmZvLmhyZWYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlICE9IG51bGwgJiYgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVc2hlciBIVFRQICcgKyBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmNvZGluZ3NNM3U4ID0gYXdhaXQgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKGVuY29kaW5nc00zdTgsIHJlc29sdXRpb25JbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrVGV4dFN0ciA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQWRUYWdzKGJhY2tUZXh0U3RyKSAmJiAoU2ltdWxhdGVkQWRzRGVwdGggPT0gMCB8fCBpID49IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSkpIHx8IGkgPj0gcGxheWVyVHlwZXMubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBiYWNrVGV4dFN0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZUluZm8gPSAnICgnICsgcGxheWVyVHlwZSArICcpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuc2V0KHBsYXllclR5cGUsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQaW5CYWNrdXBQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkVuY29kaW5ncyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb3cgcmVzb2x1dGlvbiBzdHJlYW1zIHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgaW4gdGhlIFVJLiBUbyBmaXggdGhpcyB3ZSBtZXJnZSB0aGUgbG93IHJlcyBVUkxzIGludG8gdGhlIG1haW4gbTN1OAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsRW5jb2RpbmdzTTN1OCA9IHN0cmVhbUluZm8uRW5jb2RpbmdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsTGluZXMgPSBub3JtYWxFbmNvZGluZ3NNM3U4LnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub3JtYWxMaW5lcy5sZW5ndGggLSAxOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsTGluZXNbal0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhub3JtYWxMaW5lc1tqXS5zdWJzdHJpbmcobm9ybWFsTGluZXNbal0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKGVuY29kaW5nc00zdTgsIHN0cmVhbUluZm8uVXJscy5nZXQobm9ybWFsTGluZXNbaiArIDFdLnRyaW1FbmQoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNJbmYgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKG5ldyBSZWdFeHAoYF4uKig/PVxuLioke2xvd1Jlc1VybH0pYCwgJ20nKSk/LlswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb3dSZXNJbmYpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsb3dSZXNJbmYuc3Vic3RyaW5nKGxvd1Jlc0luZi5pbmRleE9mKCc6JykgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVjc0tleSA9ICdDT0RFQ1MnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc1NldHRpbmdzW2NvZGVjc0tleV0gPT09ICdzdHJpbmcnICYmIHR5cGVvZiBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzU2V0dGluZ3NbY29kZWNzS2V5XS5sZW5ndGggPj0gMyAmJiBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldLmxlbmd0aCA+PSAzICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdWJzdHJpbmcoMCwgMykgIT09IGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0uc3Vic3RyaW5nKDAsIDMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N3YXAgJyArIHJlc1NldHRpbmdzW2NvZGVjc0tleV0gKyAnIHRvICcgKyBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbExpbmVzW2pdID0gbm9ybWFsTGluZXNbal0ucmVwbGFjZSgvQ09ERUNTPSJbXiJdKyIvLCBgQ09ERUNTPSIke2xvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV19ImApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobm9ybWFsTGluZXNbal0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbExpbmVzW2ogKyAxXSA9IGxvd1Jlc1VybCArICcgJy5yZXBlYXQoaiArIDEpOy8vIFRoZSBzdHJlYW0gZG9lc24ndCBsb2FkIHVubGVzcyBlYWNoIHVybCBsaW5lIGlzIHVuaXF1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBub3JtYWxMaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtSW5mb1VybHMoc3RyZWFtSW5mbywgZW5jb2RpbmdzTTN1OCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgfQogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmdldChwbGF5ZXJUeXBlKSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5zZXQocGxheWVyVHlwZSwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGFkcywgc3dpdGNoIHRvIGJhY2t1cCcgKyBiYWNrdXBQbGF5ZXJUeXBlSW5mbyArICcgaW4gJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zIOKAlCBzaWduaWZpZXJzOiAnICsgZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKS5qb2luKCcsICcpKTsKICAgICAgICBpZiAocmVsb2FkUGxheWVyKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtrZXk6IFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVWJvUmVsb2FkUGxheWVyJyA6ICdVYm9QYXVzZVJlc3VtZVBsYXllcid9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gaGFzQWRUYWdzKHRleHRTdHIpIHsKICAgICAgICByZXR1cm4gQURfU0lHTklGSUVSUy5zb21lKChzKSA9PiBzICYmIHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFEX1NJR05JRklFUlMuZmlsdGVyKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFEX1NJR05JRklFUlMgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzKSB7CiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIGxldCBzbTsKICAgICAgICAgICAgY29uc3QgY2xhc3NSZSA9IC9FWFQtWC1EQVRFUkFOR0U6W15cbl0qQ0xBU1M9Iih0d2l0Y2gtW14iXSspIi9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gY2xhc3NSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0iJyArIHNtWzFdICsgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB0YWdSZSA9IC8oU0NURTM1LVtBLVotXSt8RVhULVgtQ1VFLVtBLVotXSspL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSB0YWdSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoc21bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN1YnN0cmluZyBjaGVjayAobm90IGV4YWN0KTogYSBjYW5kaWRhdGUgaXMgImtub3duIiBpZiBhbnkgQURfU0lHTklGSUVSCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4KICAgICAgICAgICAgICAgICFBRF9TSUdOSUZJRVJTLnNvbWUocyA9PiBzICYmIGMuaW5jbHVkZXMocykpICYmCiAgICAgICAgICAgICAgICAhS05PV05fTk9OX0FEX1NJR05JRklFUlMuc29tZShzID0+IHMgJiYgYy5pbmNsdWRlcyhzKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQURfU0lHTklGSUVSUzogJyArIHVua25vd24uam9pbignLCAnKSArICcgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAvLyBUcmFjayBTQ1RFLTM1IENVRS1PVVQvQ1VFLUlOIGFkIGJvdW5kYXJpZXMKICAgICAgICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1PVVQnKSkgewogICAgICAgICAgICAgICAgaWYgKCFpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLU9VVCDigJQgYWQgYm91bmRhcnkgZW50ZXJlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1JTicpKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1JTiDigJQgYWQgYm91bmRhcnkgZXhpdGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmFja2luZyB1cmxzIHdoaWNoIGFwcGVhciBpbiB0aGUgb3ZlcmxheSBVSQogICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmUucmVwbGFjZUFsbChUV0lUQ0hfQURfVVJMX1JFV1JJVEVfUkVHRVgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmICghbGluZS5pbmNsdWRlcygnLGxpdmUnKSB8fCBzdHJpcEFsbFNlZ21lbnRzIHx8IEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyB8fCBpbkN1ZU91dCkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRVcmwgPSBsaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICBpZiAoIUFkU2VnbWVudENhY2hlLmhhcyhzZWdtZW50VXJsKSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoc2VnbWVudFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IGxpbmVzW2kgKyAxXS5pbmNsdWRlcyhwKSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHNlZ21lbnQgZGV0ZWN0ZWQgdmlhIFVSTCBwYXR0ZXJuOiAnICsgbGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChsaW5lc1tpICsgMV0sIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZS5pbmNsdWRlcygnLGxpdmUnKSkgewogICAgICAgICAgICAgICAgbGl2ZVNlZ21lbnRzLnB1c2goeyBleHRpbmY6IGxpbmUsIHVybDogbGluZXNbaSArIDFdIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBBUlQ6JykpIHsKICAgICAgICAgICAgICAgIC8vIExMLUhMUyBwYXJ0OiBVUkkgaXMgaW5saW5lIGFzIGFuIGF0dHJpYnV0ZS4gU3RyaXAgaWYgaXQgbWF0Y2hlcyBhIGtub3duCiAgICAgICAgICAgICAgICAvLyBhZCBVUkwgKGFscmVhZHkgaW4gY2FjaGUgZnJvbSBhIHBhcmFsbGVsIEVYVElORiBzdHJpcCwgb3IgbWF0Y2hlcyBhIFVSTCBwYXR0ZXJuKS4KICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllciBtYXkgdXNlIHRoZSBwYXJ0cyBwYXRoIHRvIGZldGNoIGFkIG1lZGlhIHZpYSBsb3ctbGF0ZW5jeS4KICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmlNYXRjaCA9IGxpbmUubWF0Y2goVVJJX0FUVFJJQlVURV9SRUdFWCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBRF9TRUdNRU5UX1VSTF9QQVRURVJOUy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBoYXNBZFRhZ3ModGV4dFN0cikpIHsKICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBObyBsb3cgbGF0ZW5jeSBkdXJpbmcgYWRzIChvdGhlcndpc2UgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHBsYXllciB0byBwcmVmZXRjaCBhbmQgZGlzcGxheSBhZCBzZWdtZW50cykKICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1QUkVMT0FELUhJTlQ6JykpIHsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICAvLyBDYWNoZSBsaXZlIHNlZ21lbnRzIGZvciByZWNvdmVyeSAocGx1cyB0aGUgTUVESUEtU0VRVUVOQ0Ugb2YgdGhlIG9sZGVzdCBjYWNoZWQgc2VnbWVudCwKICAgICAgICAvLyBzbyB0aGUgcGxheWVyIGFjY2VwdHMgaW5qZWN0ZWQgcmVjb3Zlcnkgc2VnbWVudHMgYXMgdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSkKICAgICAgICBpZiAobGl2ZVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzID0gbGl2ZVNlZ21lbnRzLnNsaWNlKC02KTsKICAgICAgICAgICAgY29uc3Qgc2VxID0gcGFyc2VJbnQoKHRleHRTdHIubWF0Y2goLyNFWFQtWC1NRURJQS1TRVFVRU5DRTooXGQrKS8pIHx8IFtdKVsxXSk7CiAgICAgICAgICAgIGlmICghaXNOYU4oc2VxKSkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxID0gc2VxICsgTWF0aC5tYXgoMCwgbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIGFsbCBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkLCB0cnkgdG8gcHJldmVudCBibGFjayBzY3JlZW4gdmlhIHJlY292ZXJ5IGNvbnRlbnQuCiAgICAgICAgLy8gUHJlZmVyIHRoZSBmdWxsLXBsYXlsaXN0IHNuYXBzaG90IGZyb20gYSByZWNlbnQgbm9uLWFkIHBvbGwgKG1pcnJvcnMgVFRWLUFCCiAgICAgICAgLy8gTGFzdENsZWFuTmF0aXZlTTNVOCBhcHByb2FjaCkg4oCUIGdpdmVzIHRoZSBwbGF5ZXIgNC02IGxpdmUgc2VnbWVudHMgd29ydGggb2YKICAgICAgICAvLyBjb250ZW50IHZzIHRoZSB0aGluIHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlLiBGYWxscyBiYWNrIHRvIHRoZSBwZXItc2VnbWVudAogICAgICAgIC8vIGNhY2hlIGlmIHRoZSBzbmFwc2hvdCBpcyBzdGFsZSBvciBtaXNzaW5nLgogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMgJiYgbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSArIDE7CiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzID49IGVmZmVjdGl2ZVRocmVzaG9sZCAmJiAhc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24pOwogICAgICAgICAgICAgICAgLy8ga2luZDogJ2Vhcmx5JyBieXBhc3NlcyB0aGUgY29vbGRvd24gZ2F0ZSB0aGF0J3MgbWVhbnQgZm9yIGJ1ZmZlci1tb25pdG9yIHJlbG9hZHMuCiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7IGtleTogJ1Vib1JlbG9hZFBsYXllcicsIGtpbmQ6ICdlYXJseScgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUHJpbWFyeTogZnJlc2ggZnVsbC1wbGF5bGlzdCBzbmFwc2hvdCAoPCAxLjVzIG9sZCwgbXVzdCBub3QgaXRzZWxmIGNvbnRhaW4gYWQgbWFya2VycykKICAgICAgICAgICAgY29uc3Qgc25hcHNob3RBZ2UgPSBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPyAoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCkgOiBJbmZpbml0eTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCAmJiBzbmFwc2hvdEFnZSA8PSAxNTAwICYmICFoYXNBZFRhZ3Moc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4KSkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXVzaW5nIGxhc3QgY2xlYW4gbmF0aXZlIHBsYXlsaXN0ICgnICsgc25hcHNob3RBZ2UgKyAnbXMgb2xkKScpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBoYXNTdHJpcHBlZEFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBwZXItc2VnbWVudCByZWNvdmVyeSBjYWNoZSAoZXhpc3RpbmcgYmVoYXZpb3IpCiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMgJiYgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcmVzdG9yaW5nICcgKyBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoICsgJyByZWNvdmVyeSBzZWdtZW50cycpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaW5lcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbal0uc3RhcnRzV2l0aCgnI0VYVC1YLU1FRElBLVNFUVVFTkNFOicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tqXSA9ICcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50c1tqXS5leHRpbmYpOwogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLnVybCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBoYXNTdHJpcHBlZEFkU2VnbWVudHM7CiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAvLyBUaHJvdHRsZSBjYWNoZSBwcnVuZSB0byBvbmNlIHBlciA2MHMuIFRoZSAxMjBzIFRUTCBnaXZlcyBwbGVudHkgb2YgaGVhZHJvb20KICAgICAgICAvLyBhbmQgc2Nhbm5pbmcgdGhlIGZ1bGwgY2FjaGUgb24gZXZlcnkgbTN1OCBwb2xsIGFkZHMgdXAgZHVyaW5nIGhlYXZ5IGFkIGJyZWFrCiAgICAgICAgLy8gc2VxdWVuY2VzIChMTC1ITFMgY2FuIHBvbGwgbXVsdGlwbGUgdGltZXMgcGVyIHNlY29uZCkuIFBvcnRlZCBmcm9tIFRUVi1BQi4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0IHx8IG5vdyAtIHN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0ID4gNjAwMDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPSBub3c7CiAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLmZvckVhY2goKHZhbHVlLCBrZXksIG1hcCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgbm93IC0gMTIwMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwLmRlbGV0ZShrZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gRGlhZ25vc3RpYzogbG9nIG9uY2UgcGVyIHN0cmVhbUluZm8gd2hlbiB0aGUgY2FjaGUgY3Jvc3NlcyAxMDAwIGVudHJpZXMsCiAgICAgICAgICAgIC8vIHNvIGNhY2hlIGJsb2F0IGZyb20gYSBmdXR1cmUgVFRML3BydW5lIGJ1ZyB3b3VsZCBzdXJmYWNlIGluIHVzZXIgcmVwb3J0cwogICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHN0YXlpbmcgaW52aXNpYmxlLgogICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuc2l6ZSA+IDEwMDAgJiYgIXN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxaykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRBZENhY2hlU2l6ZTFrID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkU2VnbWVudENhY2hlIGNyb3NzZWQgMTAwMCBlbnRyaWVzIChub3cgJyArIEFkU2VnbWVudENhY2hlLnNpemUgKyAnKSDigJQgcG9zc2libGUgY2FjaGUgYmxvYXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbGluZXMuam9pbignXG4nKTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NNM1U4KHVybCwgdGV4dFN0ciwgcmVhbEZldGNoKSB7CiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zQnlVcmxbdXJsXTsKICAgICAgICBpZiAoIXN0cmVhbUluZm8pIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uICYmIHRleHRTdHIuaW5jbHVkZXMoJyNFWFQtWC1FTkRMSVNUJykgJiYgIXRleHRTdHIuaW5jbHVkZXMoJyNFWFRJTkY6JykpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRPZmZsaW5lVHJhbnNpdGlvbiA9IHRydWU7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFN0cmVhbSBlbmRlZCAvIG9mZmxpbmUgc2hhcGUgZGV0ZWN0ZWQg4oCUIG0zdTggaGFzICNFWFQtWC1FTkRMSVNUIHdpdGggbm8gc2VnbWVudHMuIFBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gcmVzcG9uc2UsIGJyb2FkY2FzdGVyIGVuZGVkIHN0cmVhbSwgb3IgbmF0dXJhbCBlbmQtb2YtYnJvYWRjYXN0Jyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGN1cnJlbnRSZXNvbHV0aW9uID0gc3RyZWFtSW5mby5VcmxzLmdldCh1cmwpOwogICAgICAgIGlmICghY3VycmVudFJlc29sdXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNDaGVja2VkVW5rbm93blRhZ3MpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDaGVja2VkVW5rbm93blRhZ3MgPSB0cnVlOwogICAgICAgICAgICBjb25zdCB1bmtub3duQWRUYWdzID0gdGV4dFN0ci5tYXRjaCgvI0VYVFteOlxuXSooPzphZHxjdWV8c2N0ZXxzcG9uc29yKVteOlxuXSovZ2kpOwogICAgICAgICAgICBpZiAodW5rbm93bkFkVGFncykgewogICAgICAgICAgICAgICAgY29uc3QgdW5rbm93biA9IHVua25vd25BZFRhZ3MuZmlsdGVyKHQgPT4gIUFEX1NJR05JRklFUlMuc29tZShzID0+IHMgJiYgdC5pbmNsdWRlcyhzKSkpOwogICAgICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFVua25vd24gYWQtcmVsYXRlZCB0YWdzIGZvdW5kOiAnICsgWy4uLm5ldyBTZXQodW5rbm93bildLmpvaW4oJywgJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGhhdmVBZFRhZ3MgPSBoYXNBZFRhZ3ModGV4dFN0cikgfHwgKFNpbXVsYXRlZEFkc0RlcHRoID4gMCAmJiAoIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzIHx8ICFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncy5pbmNsdWRlcyh1cmwpIHx8IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSA+IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4KSk7CiAgICAgICAgLy8gQ2FjaGUgdGhlIGNsZWFuIG1haW4gc3RyZWFtIG0zdTggZm9yIGFsbC1zdHJpcHBlZCByZWNvdmVyeSBmYWxsYmFjay4KICAgICAgICAvLyBVcGRhdGVkIGR1cmluZyBub24tYWQgcG9sbHMgKG91dHNpZGUgb2YgYW55IGFkIGJyZWFrKSwgc28gYnkgdGhlIHRpbWUgYW4gYWQKICAgICAgICAvLyBicmVhayBzdGFydHMsIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCBob2xkcyBhIHNuYXBzaG90IH4xLTIgc2Vjb25kcyBvbGQKICAgICAgICAvLyB3aXRoIHNldmVyYWwgbGl2ZSBzZWdtZW50cy4gV2hlbiBoZWF2eSBTU0FJIGJyZWFrcyBsZWF2ZSB0aGUgbWFpbiBwbGF5bGlzdAogICAgICAgIC8vIGVudGlyZWx5IHN0cmlwcGVkLCBzdHJpcEFkU2VnbWVudHMgcmVwbGF5cyB0aGlzIHNuYXBzaG90IGluc3RlYWQgb2YgdGhlIHRoaW4KICAgICAgICAvLyBSZWNvdmVyeVNlZ21lbnRzIGFycmF5IOKAlCB0eXBpY2FsbHkgZ2l2ZXMgdGhlIHBsYXllciA0LTYgbGl2ZSBzZWdtZW50cyBvZgogICAgICAgIC8vIGNvbnRlbnQgdnMgdGhlIDEtMiBjYWNoZWQgaW5kaXZpZHVhbCBzZWdtZW50cy4KICAgICAgICAvLyBNaXJyb3JzIFRUVi1BQiBzcmMvbW9kdWxlcy9wcm9jZXNzb3IudHM6NzMzLTczNi4KICAgICAgICBpZiAoIWhhdmVBZFRhZ3MgJiYgIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MpIHsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFVybCA9IHN0cmVhbUluZm8uRW5jb2RpbmdzLm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF07CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4ID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0FkVGFncyhzdHJlYW1NM3U4KSAmJiBTaW11bGF0ZWRBZHNEZXB0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pcnJvcnMgVFRWLUFCIHY2LjYuNyAjMTogbWFyayBmaXJzdCBjYW5kaWRhdGUtZW5kIHRpbWVzdGFtcCBvbiB0aGUgZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW4gbWFpbi1zdHJlYW0gcG9sbCwgc28gdGhlIHNsb3ctcGF0aCBtYXgtd2FpdCBnYXRlIGJlbG93IGNhbiBmaXJlIGV2ZW4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3Vic2VxdWVudCBwb2xscyBib3VuY2UgYmFjayB0byBhZC1tYXJrZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGxheWxpc3QgaGFzIGxpdmUgc2VnbWVudHMg4oCUIGlmIG5vdCwgYmFja3VwIHN0cmVhbSBpcyBkZWFkCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0xpdmVTZWdtZW50cyA9IHRleHRTdHIuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXJyb3JzIFRUVi1BQiB2Ni42LjcgIzQ6IGluZGVwZW5kZW50IHNsb3ctcGF0aCBtYXgtd2FpdCBlc2NhbGF0aW9uIGdhdGUgc28KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmNpbmcgbWFya2VycyBjYW4ndCB3ZWRnZSB0aGUgcGxheWVyIG9uIGJhY2t1cCBpbmRlZmluaXRlbHkuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkRW5kTWF4V2FpdE1zID0gMTIwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRTaW5jZUNhbmRpZGF0ZSA9IERhdGUubm93KCkgLSBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbG93UGF0aFJlYWR5ID0gc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA+IDAgJiYgZWxhcHNlZFNpbmNlQ2FuZGlkYXRlID49IGFkRW5kTWF4V2FpdE1zOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gMiB8fCAhaGFzTGl2ZVNlZ21lbnRzIHx8IHNsb3dQYXRoUmVhZHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG93UGF0aFJlYWR5ICYmIHN0cmVhbUluZm8uQ2xlYW5QbGF5bGlzdENvdW50IDwgMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNsb3ctcGF0aCBhZC1lbmQgZXNjYWxhdGlvbiDigJQgJyArIChzdHJlYW1JbmZvLkFkRW5kQm91bmNlQ291bnQgfHwgMCkgKyAnIG1hcmtlciBib3VuY2VzLCAnICsgKGVsYXBzZWRTaW5jZUNhbmRpZGF0ZSAvIDEwMDApLnRvRml4ZWQoMSkgKyAncyBzaW5jZSBmaXJzdCBjbGVhbiBwb2xsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gaGFzIG5vIGxpdmUgc2VnbWVudHMg4oCUIGZvcmNpbmcgaW1tZWRpYXRlIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIG1vcmUgYWRzIG9uIG1haW4gc3RyZWFtLiBTdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLiAnICsgKFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVHJpZ2dlcmluZyBwbGF5ZXIgcmVsb2FkIHRvIGdvIGJhY2sgdG8gbWFpbiBzdHJlYW0uLi4nIDogJ1Jlc3VtaW5nIHBsYXliYWNrLi4uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRzIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPT09IDAgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpVG9Tc2FpVHJhbnNpdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzPy5jbGVhcj8uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzPy5jbGVhcj8uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkRW5kQm91bmNlQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgdjYuNi43ICMxOiBib3VuY2UtdG9sZXJhbnQgcmVzZXQga2VlcHMgUGVuZGluZ0FkRW5kQXQgYWxpdmUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNyb3NzIHNob3J0IGZsaXBzIGJhY2sgdG8gYWQtbWFya2VkLCBzbyB0aGUgc2xvdy1wYXRoIG1heC13YWl0IGdhdGUgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGZpcmUgd2hlbiBib3VuY2luZyBtYXJrZXJzIHByZXZlbnQgQ2xlYW5QbGF5bGlzdENvdW50IHByb2dyZXNzLgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZEVuZFN0YWxlbmVzc01zID0gMTIwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0ICYmIChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCkgPCBhZEVuZFN0YWxlbmVzc01zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkRW5kQm91bmNlQ291bnQgPSAoc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50IHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtTTN1OC5pbmNsdWRlcygnIk1JRFJPTEwiJykgJiYgIXN0cmVhbU0zdTguaW5jbHVkZXMoJyJtaWRyb2xsIicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHN0cmVhbU0zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBsaW5lcy5sZW5ndGggPiBpICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXF1ZXN0IG9uZSAudHMgZmlsZSBwZXIgLm0zdTggcmVxdWVzdCB0byBhdm9pZCBtYWtpbmcgdG9vIG1hbnkgcmVxdWVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmFkZChsaW5lc1tpICsgMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2gobGluZXNbaSArIDFdKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYmxvYigpKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgJiYgaGF2ZUFkVGFncykgewogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGF3YWl0IG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCB0cnVlLCByZWFsRmV0Y2gsIHVybCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzKSB7CiAgICAgICAgICAgIC8vIENTQUkgZmFzdCBwYXRoOiBpZiBhbGwgc2VnbWVudHMgaW4gdGhlIG1haW4gc3RyZWFtIGFyZSBsaXZlLCBza2lwIGJhY2t1cCBzZWFyY2guCiAgICAgICAgICAgIC8vIENTQUkgYWRzIGFyZSBkZWxpdmVyZWQgb3V0c2lkZSB0aGUgbTN1OCDigJQgdGhlIG1haW4gc3RyZWFtIHNlZ21lbnRzIGFyZSBjbGVhbi4KICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBtYWluIHN0cmVhbSBkaXJlY3RseSwgYXZvaWRpbmcgdGhlIGJhY2t1cCBzdHJlYW0gc3dpdGNoIHRoYXQgY2F1c2VzCiAgICAgICAgICAgIC8vIGEgMjAtNDBzIHJlYnVmZmVyIGdhcC4KICAgICAgICAgICAgY29uc3QgbWFpblN0cmVhbUxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgbGV0IGhhc05vbkxpdmVTZWdtZW50ID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFpblN0cmVhbUxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobWFpblN0cmVhbUxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAhbWFpblN0cmVhbUxpbmVzW2ldLmluY2x1ZGVzKExJVkVfU0lHTklGSUVSKSkgewogICAgICAgICAgICAgICAgICAgIGhhc05vbkxpdmVTZWdtZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWhhc05vbkxpdmVTZWdtZW50KSB7CiAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzTG9nZ2VkQ3NhaUZhc3RQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIC8vIFJld29yZGVkIOKAlCB0aGUgb3JpZ2luYWwgImFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoIgogICAgICAgICAgICAgICAgICAgIC8vIGltcGxpZWQgYSBwZXJtYW5lbnQgc3RhdGUsIGJ1dCBpdCBvbmx5IGRlc2NyaWJlcyB0aGlzIHBvbGwuIFR3aXRjaCBjYW4KICAgICAgICAgICAgICAgICAgICAvLyBzaGlmdCBtaWQtYnJlYWsgdG8gU1NBSSAoc3RpdGNoZWQgYWQgc2VnbWVudHMpIGF0IHdoaWNoIHBvaW50IHRoZQogICAgICAgICAgICAgICAgICAgIC8vIGJhY2t1cCBzZWFyY2ggbGVnaXRpbWF0ZWx5IGZpcmVzOyB0aGUgdHJhbnNpdGlvbiBpcyBsb2dnZWQgc2VwYXJhdGVseS4KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDU0FJIGZhc3QgcGF0aCDigJQgY3VycmVudCBwb2xsIGhhcyBhbGwtbGl2ZSBzZWdtZW50cywgc2tpcHBpbmcgYmFja3VwIHNlYXJjaCB0aGlzIHBvbGwgKHBsYXlsaXN0IG1heSBzaGlmdCB0byBTU0FJIG9uIHN1YnNlcXVlbnQgcG9sbHMpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGggJiYgIXN0cmVhbUluZm8uSGFzTG9nZ2VkQ3NhaVRvU3NhaVRyYW5zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlUb1NzYWlUcmFuc2l0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQbGF5bGlzdCBub3cgY29udGFpbnMgc3RpdGNoZWQgYWQgc2VnbWVudHMg4oCUIENTQUkgZmFzdCBwYXRoIG5vIGxvbmdlciBhcHBsaWVzLCBmYWxsaW5nIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGF3YWl0IG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCB0cnVlLCByZWFsRmV0Y2gsIHVybCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCkgewogICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKTsKICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tXb3JrZXJGZXRjaCgpIHsKICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBob29rV29ya2VyRmV0Y2ggKHZpZGVvLXN3YXAtbmV3KScpOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IGZldGNoOwogICAgICAgIGZldGNoID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLmhhcyh1cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2goJ2RhdGE6dmlkZW8vbXA0O2Jhc2U2NCxBQUFBS0daMGVYQnRjRFF5QUFBQUFXbHpiMjF0Y0RReVpHRnphR0YyWXpGcGMyODJhR3h6WmdBQUJFbHRiMjkyQUFBQWJHMTJhR1FBQUFBQUFBQUFBQUFBQUFBQUFZYWdBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQUFBQnFIUnlZV3NBQUFCY2RHdG9aQUFBQUFNQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFVUnRaR2xoQUFBQUlHMWthR1FBQUFBQUFBQUFBQUFBQUFBQUFMdUFBQUFBQUZYRUFBQUFBQUF0YUdSc2NnQUFBQUFBQUFBQWMyOTFiZ0FBQUFBQUFBQUFBQUFBQUZOdmRXNWtTR0Z1Wkd4bGNnQUFBQUR2YldsdVpnQUFBQkJ6Yldoa0FBQUFBQUFBQUFBQUFBQWtaR2x1WmdBQUFCeGtjbVZtQUFBQUFBQUFBQUVBQUFBTWRYSnNJQUFBQUFFQUFBQ3pjM1JpYkFBQUFHZHpkSE5rQUFBQUFBQUFBQUVBQUFCWGJYQTBZUUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FRQUFBQUFMdUFBQUFBQUFBelpYTmtjd0FBQUFBRGdJQ0FJZ0FCQUFTQWdJQVVRQlVBQUFBQUFBQUFBQUFBQUFXQWdJQUNFWkFHZ0lDQUFRSUFBQUFRYzNSMGN3QUFBQUFBQUFBQUFBQUFFSE4wYzJNQUFBQUFBQUFBQUFBQUFCUnpkSE42QUFBQUFBQUFBQUFBQUFBQUFBQUFFSE4wWTI4QUFBQUFBQUFBQUFBQUFlVjBjbUZyQUFBQVhIUnJhR1FBQUFBREFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFvQUFBQUZvQUFBQUFBR0JiV1JwWVFBQUFDQnRaR2hrQUFBQUFBQUFBQUFBQUFBQUFBOUNRQUFBQUFCVnhBQUFBQUFBTFdoa2JISUFBQUFBQUFBQUFIWnBaR1VBQUFBQUFBQUFBQUFBQUFCV2FXUmxiMGhoYm1Sc1pYSUFBQUFCTEcxcGJtWUFBQUFVZG0xb1pBQUFBQUVBQUFBQUFBQUFBQUFBQUNSa2FXNW1BQUFBSEdSeVpXWUFBQUFBQUFBQUFRQUFBQXgxY213Z0FBQUFBUUFBQU94emRHSnNBQUFBb0hOMGMyUUFBQUFBQUFBQUFRQUFBSkJoZG1NeEFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW9BQmFBQklBQUFBU0FBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHUC8vQUFBQU9tRjJZME1CVFVBZS8rRUFJMmROUUI2V1VvRkFYL0xnTFVCQVFGQUFBRDZBQUE2bURnQUFIb1FBQTlDVzd5NEtBUUFFYU91UElBQUFBQkJ6ZEhSekFBQUFBQUFBQUFBQUFBQVFjM1J6WXdBQUFBQUFBQUFBQUFBQUZITjBjM29BQUFBQUFBQUFBQUFBQUFBQUFBQVFjM1JqYndBQUFBQUFBQUFBQUFBQVNHMTJaWGdBQUFBZ2RISmxlQUFBQUFBQUFBQUJBQUFBQVFBQUFDNEFBQUFBQW9BQUFBQUFBQ0IwY21WNEFBQUFBQUFBQUFJQUFBQUJBQUNDTlFBQUFBQUNRQUFBJywgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXJsID0gdXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0ciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gU3RyaW5nKGVycj8ubWVzc2FnZSB8fCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj8ubmFtZSAhPT0gJ0Fib3J0RXJyb3InICYmICEvY2FuY2VsfGFib3J0L2kudGVzdChlcnJNc2cpKSBjb25zb2xlLmxvZygnZmV0Y2ggaG9vayBlcnIgJyArIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gKG5ldyBVUkwodXJsKSkucGF0aG5hbWUubWF0Y2goLyhbXlwvXSspKD89XC5cdyskKS8pPy5bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdwYXJlbnRfZG9tYWlucycpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB0ZW1wVXJsLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBGaXJzdCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggd2l0aCB0aGUgdmlkZW8gZW5jb2RpbmdzICgzNjBwLDQ4MHAsNzIwcCxldGMpLgogICAgICAgICAgICAgICAgICAgICAgICAvLyAtIFNlY29uZCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBvYnRhaW5lZCBpbiB0aGUgZmlyc3QgcmVxdWVzdC4gQXQgdGhpcyBwb2ludCB3ZSB3aWxsIGtub3cgaWYgdGhlcmUncyBhZHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzICE9IG51bGwgJiYgKGF3YWl0IHJlYWxGZXRjaChzdHJlYW1JbmZvLkVuY29kaW5ncy5tYXRjaCgvXmh0dHBzOi4qXC5tM3U4JC9tKT8uWzBdKSkuc3RhdHVzICE9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgZW5jb2RpbmdzIGFyZSBkZWFkICh0aGUgc3RyZWFtIHByb2JhYmx5IHJlc3RhcnRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZXJUaW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCB8fCBzdHJlYW1JbmZvLkVuY29kaW5ncyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0gY3JlYXRlU3RyZWFtSW5mbyhjaGFubmVsTmFtZSwgKG5ldyBVUkwodXJsKSkuc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gc3RyZWFtSW5mby5VcmxzLnZhbHVlcygpLm5leHQoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2gocmVzb2x1dGlvbkluZm8uVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OCA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3Moc3RyZWFtTTN1OCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbkZvdW5kQWQoc3RyZWFtSW5mbywgc3RyZWFtTTN1OCwgZmFsc2UsIHJlYWxGZXRjaCwgcmVzb2x1dGlvbkluZm8uVXJsLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0cmVhbU0zdThSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW5jb2RpbmdzTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2ZXJUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPyBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA6IHN0cmVhbUluZm8uRW5jb2RpbmdzLCBzZXJ2ZXJUaW1lKSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgoZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvI0VYVC1YLVNFU1NJT04tREFUQTpEQVRBLUlEPSJTRVJWRVItVElNRSIsVkFMVUU9IihbXiJdKykiLyk7CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvU0VSVkVSLVRJTUU9IihbMC05Ll0rKSIvKTsKICAgICAgICByZXR1cm4gbWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDEgPyBtYXRjaGVzWzFdIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4KGVuY29kaW5nc00zdTgsIG5ld1NlcnZlclRpbWUpIHsKICAgICAgICBpZiAoVjJBUEkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ld1NlcnZlclRpbWUgPyBlbmNvZGluZ3NNM3U4LnJlcGxhY2UoLygjRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKVteIl0rKCIpLywgYCQxJHtuZXdTZXJ2ZXJUaW1lfSQyYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKFNFUlZFUi1USU1FPSIpWzAtOS5dKyIvLCBgU0VSVkVSLVRJTUU9IiR7bmV3U2VydmVyVGltZX0iYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgfQogICAgZnVuY3Rpb24gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGNvbnN0IGVuY29kaW5nc0xpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBbdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodF0gPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uLnNwbGl0KCd4JykubWFwKE51bWJlcik7CiAgICAgICAgbGV0IG1hdGNoZWRSZXNvbHV0aW9uVXJsID0gbnVsbDsKICAgICAgICBsZXQgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZhbHNlOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IGNsb3Nlc3RSZXNvbHV0aW9uRGlmZmVyZW5jZSA9IEluZmluaXR5OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RpbmdzTGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIC8vIEFjY2VwdCB2MiBBUEkgdmFyaWFudCBVUkxzIChyYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnKS4KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGVuY29kaW5nc0xpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhlbmNvZGluZ3NMaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgY29uc3QgZnJhbWVSYXRlID0gYXR0cmlidXRlc1snRlJBTUUtUkFURSddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbiA9PSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uICYmICghbWF0Y2hlZFJlc29sdXRpb25VcmwgfHwgKCFtYXRjaGVkRnJhbWVSYXRlICYmIGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRnJhbWVSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oY2hhbm5lbE5hbWUsIHBsYXllclR5cGUpIHsKICAgICAgICBjb25zdCByZWFsUGxheWVyVHlwZSA9IHBsYXllclR5cGUucmVwbGFjZSgnLUFMVCcsICcnKTsKICAgICAgICBjb25zdCBib2R5ID0gewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUGxheWJhY2tBY2Nlc3NUb2tlbicsCiAgICAgICAgICAgIHZhcmlhYmxlczogewogICAgICAgICAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgbG9naW46IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgaXNWb2Q6IGZhbHNlLAogICAgICAgICAgICAgICAgdm9kSUQ6ICIiLAogICAgICAgICAgICAgICAgcGxheWVyVHlwZTogcmVhbFBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSk7CiAgICB9CiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHkpIHsKICAgICAgICBpZiAoIWdxbF9kZXZpY2VfaWQpIHsKICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9ICcnOwogICAgICAgICAgICBjb25zdCBjaGFycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlkJzogQ0xJRU5UX0lELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkLAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSkKICAgICAgICB9OwogICAgICAgIGlmIChwbGF5ZXJUeXBlLmluY2x1ZGVzKCctQUxUJykpIHsKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgICdDbGllbnQtSWQnOiBDTElFTlRfSUQsCiAgICAgICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0geC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArMSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXQogICAgICAgICAgICAgICAgfSkpOwogICAgfQogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIC8vIDVzIEFib3J0Q29udHJvbGxlciB0aW1lb3V0IOKAlCBib3VuZHMgd29yc3QtY2FzZSB3YWl0IHdoZW4gVHdpdGNoIEdRTCBoYW5ncy4KICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICAgIGNvbnN0IHRpbWVvdXRNcyA9IDUwMDA7CiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXRNcyk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aW5kb3cucmVhbEZldGNoKGZldGNoUmVxdWVzdC51cmwsIHsKICAgICAgICAgICAgICAgIC4uLmZldGNoUmVxdWVzdC5vcHRpb25zLAogICAgICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaWQ6IGZldGNoUmVxdWVzdC5pZCwKICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicgPyAnR1FMIGZldGNoIHRpbWVvdXQgKCcgKyAodGltZW91dE1zIC8gMTAwMCkgKyAncyknIDogZXJyb3IubWVzc2FnZQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tGZXRjaCgpIHsKICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXaW5kb3cgZmV0Y2ggaG9vayBpbnN0YWxsZWQnKTsKICAgICAgICBsZXQgaGFzTG9nZ2VkSGVhZGVycyA9IGZhbHNlOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IHdpbmRvdy5mZXRjaDsKICAgICAgICB3aW5kb3cucmVhbEZldGNoID0gcmVhbEZldGNoOwogICAgICAgIHdpbmRvdy5mZXRjaCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwsIGluaXQpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdncWwnKSkgewogICAgICAgICAgICAgICAgICAgIGxldCBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snWC1EZXZpY2UtSWQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snRGV2aWNlLUlEJ107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGV2aWNlSWQgPT09ICdzdHJpbmcnICYmIGdxbF9kZXZpY2VfaWQgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVWJvVXBkYXRlRGV2aWNlSWQnLCBncWxfZGV2aWNlX2lkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSA9PT0gJ3N0cmluZycgJiYgaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10gIT09IENsaWVudEludGVncml0eUhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50SW50ZWdyaXR5SGVhZGVyJywgQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSAhPT0gQXV0aG9yaXphdGlvbkhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicsIEF1dGhvcml6YXRpb25IZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghaGFzTG9nZ2VkSGVhZGVycyAmJiBncWxfZGV2aWNlX2lkICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChncWxfZGV2aWNlX2lkID8gJ3llcycgOiAnbm8nKSArICcsIEF1dGg6ICcgKyAoQXV0aG9yaXphdGlvbkhlYWRlciA/ICd5ZXMnIDogJ25vJykgKyAnLCBJbnRlZ3JpdHk6ICcgKyAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyID8gJ3llcycgOiAnbm8nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIEdldCByaWQgb2YgbWluaSBwbGF5ZXIgYWJvdmUgY2hhdCAtIFRPRE86IFJlamVjdCB0aGlzIGxvY2FsbHkgaW5zdGVhZCBvZiBoYXZpbmcgc2VydmVyIHJlamVjdCBpdAogICAgICAgICAgICAgICAgICAgIGlmIChpbml0ICYmIHR5cGVvZiBpbml0LmJvZHkgPT09ICdzdHJpbmcnICYmIGluaXQuYm9keS5pbmNsdWRlcygnUGxheWJhY2tBY2Nlc3NUb2tlbicpICYmIGluaXQuYm9keS5pbmNsdWRlcygncGljdHVyZS1ieS1waWN0dXJlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFICYmIHR5cGVvZiBpbml0LmJvZHkgPT09ICdzdHJpbmcnICYmIGluaXQuYm9keS5pbmNsdWRlcygnUGxheWJhY2tBY2Nlc3NUb2tlbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYWNlZFBsYXllclR5cGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Qm9keSA9IEpTT04ucGFyc2UoaW5pdC5ib2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Qm9keSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Qm9keS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgJiYgbmV3Qm9keVtpXT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICE9PSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdCb2R5Py52YXJpYWJsZXM/LnBsYXllclR5cGUgJiYgbmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICE9PSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRQbGF5ZXJUeXBlID0gbmV3Qm9keS52YXJpYWJsZXMucGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW0FEIERFQlVHXSBSZXBsYWNlZCAnJHtyZXBsYWNlZFBsYXllclR5cGV9JyBwbGF5ZXIgdHlwZSB3aXRoICcke09QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEV9JyBwbGF5ZXIgdHlwZWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkobmV3Qm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzYWlUeXBlID0gdXJsLmluY2x1ZGVzKCdicD1taWRyb2xsJykgPyAnbWlkcm9sbCcgOiB1cmwuaW5jbHVkZXMoJ2JwPXByZXJvbGwnKSA/ICdwcmVyb2xsJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoY3NhaVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlZENzYWlUeXBlcy5hZGQoY3NhaVR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDU0FJIGFkIHJlcXVlc3QgZGV0ZWN0ZWQg4oCUIHR5cGU6ICcgKyBjc2FpVHlwZSArICcgKGNsaWVudC1zaWRlIGFkIGluc2VydGlvbiwgbm90IGJsb2NrYWJsZSB2aWEgbTN1OCknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0sICdmZXRjaCcpOwogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgY29uc3QgcGxheWVyUm9vdERpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXInKTsKICAgICAgICBpZiAocGxheWVyUm9vdERpdiAhPSBudWxsKSB7CiAgICAgICAgICAgIGxldCBhZEJsb2NrRGl2ID0gbnVsbDsKICAgICAgICAgICAgYWRCbG9ja0RpdiA9IHBsYXllclJvb3REaXYucXVlcnlTZWxlY3RvcignLnRhcy1hZGJsb2NrLW92ZXJsYXknKTsKICAgICAgICAgICAgaWYgKGFkQmxvY2tEaXYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYWRCbG9ja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5jbGFzc05hbWUgPSAndGFzLWFkYmxvY2stb3ZlcmxheSc7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJwbGF5ZXItYWRibG9jay1ub3RpY2UiIHN0eWxlPSJjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyBwYWRkaW5nOiA1cHg7Ij48cD48L3A+PC9kaXY+JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUCA9IGFkQmxvY2tEaXYucXVlcnlTZWxlY3RvcigncCcpOwogICAgICAgICAgICAgICAgcGxheWVyUm9vdERpdi5hcHBlbmRDaGlsZChhZEJsb2NrRGl2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoIXR3aXRjaFBsYXllckFuZFN0YXRlPy5wbGF5ZXI/LmNvcmUgfHwgIXR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHR3aXRjaFBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGlzTGl2ZSA9IHR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIGlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtb25pdG9yTGl2ZVN0YXR1cygpIHsKICAgICAgICBpZiAoIXR3aXRjaFBsYXllckFuZFN0YXRlPy5wbGF5ZXI/LmNvcmUgfHwgIXR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZSkgewogICAgICAgICAgICB0d2l0Y2hQbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlzTGl2ZSA9IHR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAoIWlzTGl2ZSkgewogICAgICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyKHsKICAgICAgICAgICAgICAgIGhhc0FkczogZmFsc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQobW9uaXRvckxpdmVTdGF0dXMsIDEwMDApOwogICAgfQogICAgZnVuY3Rpb24gZ2V0UGxheWVyQW5kU3RhdGUoKSB7CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Tm9kZShyb290LCBjb25zdHJhaW50KSB7CiAgICAgICAgICAgIGlmIChyb290LnN0YXRlTm9kZSAmJiBjb25zdHJhaW50KHJvb3Quc3RhdGVOb2RlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Quc3RhdGVOb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBub2RlID0gcm9vdC5jaGlsZDsKICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbmRSZWFjdE5vZGUobm9kZSwgY29uc3RyYWludCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGZpbmRSZWFjdFJvb3ROb2RlKCkgewogICAgICAgICAgICBsZXQgcmVhY3RSb290Tm9kZSA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jvb3QnKTsKICAgICAgICAgICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290ICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50KSB7CiAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlYWN0Um9vdE5vZGUgPT0gbnVsbCAmJiByb290Tm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gT2JqZWN0LmtleXMocm9vdE5vZGUpLmZpbmQoeCA9PiB4LnN0YXJ0c1dpdGgoJ19fcmVhY3RDb250YWluZXInKSB8fCB4LnN0YXJ0c1dpdGgoJ19fcmVhY3RGaWJlcicpKTsKICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGVbY29udGFpbmVyTmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWN0Um9vdE5vZGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlYWN0Um9vdE5vZGUgPSBmaW5kUmVhY3RSb290Tm9kZSgpOwogICAgICAgIGlmICghcmVhY3RSb290Tm9kZSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgbGV0IHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFBsYXllckFjdGl2ZSAmJiBub2RlLnByb3BzICYmIG5vZGUucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSk7CiAgICAgICAgcGxheWVyID0gcGxheWVyICYmIHBsYXllci5wcm9wcyAmJiBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA/IHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlIDogbnVsbDsKICAgICAgICBpZiAocGxheWVyPy5wbGF5ZXJJbnN0YW5jZSkgewogICAgICAgICAgICBwbGF5ZXIgPSBwbGF5ZXIucGxheWVySW5zdGFuY2U7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGxiYWNrOiBzdHJ1Y3R1cmFsIG1hdGNoIGlmIFR3aXRjaCBvYmZ1c2NhdGVzIHByb3BlcnR5IG5hbWVzCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgcGxheWVyID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuZ2V0SFRNTFZpZGVvRWxlbWVudCAmJiBub2RlLmdldEJ1ZmZlckR1cmF0aW9uICYmIG5vZGUuY29yZT8uc3RhdGUpOwogICAgICAgIH0KICAgICAgICAvLyBQcmltYXJ5OiBuYW1lZCBwcm9wZXJ0eSBsb29rdXAKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzKTsKICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCDigJQgc2V0U3JjIGV4aXN0cyBidXQgc2V0SW5pdGlhbFBsYXliYWNrU2V0dGluZ3Mgd2FzIHJlbmFtZWQKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrID0gIXBsYXllclN0YXRlID8gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0U3JjICYmIG5vZGUuc2V0U3RyZWFtTWFuYWdlck5vZGUgJiYgIW5vZGUuZ2V0SFRNTFZpZGVvRWxlbWVudCkgOiBudWxsOwogICAgICAgIC8vIEZhbGxiYWNrIDI6IFRUVi1BQidzIGFwcHJvYWNoIOKAlCB2aWRlb1BsYXllckluc3RhbmNlIHdpdGggcGxheWVyTW9kZQogICAgICAgIGNvbnN0IHBsYXllclN0YXRlRmFsbGJhY2syID0gIXBsYXllclN0YXRlICYmICFwbGF5ZXJTdGF0ZUZhbGxiYWNrID8gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc3RhdGU/LnZpZGVvUGxheWVySW5zdGFuY2U/LnBsYXllck1vZGUgIT09IHVuZGVmaW5lZCk/LnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlIDogbnVsbDsKICAgICAgICBjb25zdCBmaW5hbFBsYXllclN0YXRlID0gcGxheWVyU3RhdGUgfHwgcGxheWVyU3RhdGVGYWxsYmFjayB8fCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMjsKICAgICAgICByZXR1cm4gIHsKICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXIsCiAgICAgICAgICAgIHN0YXRlOiBmaW5hbFBsYXllclN0YXRlCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbG9hZFR3aXRjaFBsYXllcihpc1BhdXNlUGxheSwgcmVsb2FkS2luZCkgewogICAgICAgIGNvbnN0IHBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICBpZiAoIXBsYXllckFuZFN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCByZWFjdCByb290Jyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGxheWVyID0gcGxheWVyQW5kU3RhdGUucGxheWVyOwogICAgICAgIGNvbnN0IHBsYXllclN0YXRlID0gcGxheWVyQW5kU3RhdGUuc3RhdGU7CiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHBsYXllcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICghcGxheWVyU3RhdGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHBsYXllciBzdGF0ZScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gUmVsb2FkIGNvb2xkb3duIOKAlCBlYXJseSByZWxvYWRzICh3b3JrZXItdHJpZ2dlcmVkIHRoaW4tY2FjaGUgZmFzdCBwYXRoKSBieXBhc3MgdGhlCiAgICAgICAgLy8gZ2F0ZSBidXQgc3RpbGwgdXBkYXRlIGJvb2trZWVwaW5nIHNvIDMrIHJhcGlkIGVhcmx5IHJlbG9hZHMgc3RpbGwgdHJpZ2dlciB0aGUgOTBzCiAgICAgICAgLy8gZXNjYWxhdGlvbiB0aGF0IHByb3RlY3RzIGFnYWluc3QgcnVuYXdheSBsb29wcy4KICAgICAgICBpZiAoIWlzUGF1c2VQbGF5ICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA+IDApIHsKICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY29uc3QgY29vbGRvd25NcyA9IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDEwMDA7CiAgICAgICAgICAgIGNvbnN0IGlzRWFybHkgPSByZWxvYWRLaW5kID09PSAnZWFybHknOwogICAgICAgICAgICBpZiAobGFzdFJlbG9hZFRpbWVzdGFtcCAmJiBub3cgLSBsYXN0UmVsb2FkVGltZXN0YW1wIDwgY29vbGRvd25NcykgewogICAgICAgICAgICAgICAgaWYgKCFpc0Vhcmx5KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU2tpcHBpbmcgcmVsb2FkIOKAlCBjb29sZG93biBhY3RpdmUgKCcgKyBNYXRoLnJvdW5kKChjb29sZG93bk1zIC0gKG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXApKSAvIDEwMDApICsgJ3MgcmVtYWluaW5nKScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJ5cGFzc2luZyBjb29sZG93biBmb3IgZWFybHkgcmVsb2FkICh0aGluLWNhY2hlIGZhc3QgcGF0aCkg4oCUICcgKyBNYXRoLnJvdW5kKChjb29sZG93bk1zIC0gKG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXApKSAvIDEwMDApICsgJ3Mgd291bGQgaGF2ZSByZW1haW5lZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbG9hZFRpbWVzdGFtcHMucHVzaChub3cpOwogICAgICAgICAgICBjb25zdCBmaXZlTWluQWdvID0gbm93IC0gMzAwMDAwOwogICAgICAgICAgICB3aGlsZSAocmVsb2FkVGltZXN0YW1wcy5sZW5ndGggPiAwICYmIHJlbG9hZFRpbWVzdGFtcHNbMF0gPCBmaXZlTWluQWdvKSB7IHJlbG9hZFRpbWVzdGFtcHMuc2hpZnQoKTsgfQogICAgICAgICAgICBpZiAocmVsb2FkVGltZXN0YW1wcy5sZW5ndGggPj0gMyAmJiBSZWxvYWRDb29sZG93blNlY29uZHMgPCA5MCkgewogICAgICAgICAgICAgICAgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gUmVsb2FkQ29vbGRvd25TZWNvbmRzOwogICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gOTA7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvLWVzY2FsYXRlZCByZWxvYWQgY29vbGRvd24gdG8gOTBzICgzKyByZWxvYWRzIGluIDUgbWludXRlcyknKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChFc2NhbGF0ZWRGcm9tQ29vbGRvd24gIT09IG51bGwgJiYgcmVsb2FkVGltZXN0YW1wcy5sZW5ndGggPCAzKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEZS1lc2NhbGF0ZWQgcmVsb2FkIGNvb2xkb3duIGJhY2sgdG8gJyArIEVzY2FsYXRlZEZyb21Db29sZG93biArICdzIChidXJzdCBzdWJzaWRlZCknKTsKICAgICAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IEVzY2FsYXRlZEZyb21Db29sZG93bjsKICAgICAgICAgICAgICAgIEVzY2FsYXRlZEZyb21Db29sZG93biA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdFJlbG9hZFRpbWVzdGFtcCA9IG5vdzsKICAgICAgICB9CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0tleVF1YWxpdHkgPSAndmlkZW8tcXVhbGl0eSc7CiAgICAgICAgY29uc3QgbHNLZXlNdXRlZCA9ICd2aWRlby1tdXRlZCc7CiAgICAgICAgY29uc3QgbHNLZXlWb2x1bWUgPSAndm9sdW1lJzsKICAgICAgICBjb25zdCBsc0tleUxvd0xhdGVuY3kgPSAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJzsvLyBQcmVzZXJ2ZSB1c2VyJ3MgbG93LWxhdGVuY3kgdG9nZ2xlIGFjcm9zcyByZWxvYWRzIChUVFYtQUIgcGFyaXR5KQogICAgICAgIGNvbnN0IGxzS2V5UGVyc2lzdGVuY2UgPSAncGVyc2lzdGVuY2VFbmFibGVkJzsvLyBQcmVzZXJ2ZSBhdXRvcGxheS9wZXJzaXN0ZW5jZSB0b2dnbGUgYWNyb3NzIHJlbG9hZHMgKFRUVi1BQiBwYXJpdHkpCiAgICAgICAgbGV0IGN1cnJlbnRRdWFsaXR5TFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50TXV0ZWRMUyA9IG51bGw7CiAgICAgICAgbGV0IGN1cnJlbnRWb2x1bWVMUyA9IG51bGw7CiAgICAgICAgbGV0IGN1cnJlbnRMb3dMYXRlbmN5TFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50UGVyc2lzdGVuY2VMUyA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY3VycmVudFF1YWxpdHlMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5UXVhbGl0eSk7CiAgICAgICAgICAgIGN1cnJlbnRNdXRlZExTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlNdXRlZCk7CiAgICAgICAgICAgIGN1cnJlbnRWb2x1bWVMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5Vm9sdW1lKTsKICAgICAgICAgICAgY3VycmVudExvd0xhdGVuY3lMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TG93TGF0ZW5jeSk7CiAgICAgICAgICAgIGN1cnJlbnRQZXJzaXN0ZW5jZUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlQZXJzaXN0ZW5jZSk7CiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIHBsYXllci5jb3JlLnN0YXRlLnZvbHVtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLnF1YWxpdHkuZ3JvdXB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgLy8gUHJlLW11dGUgdGhyb3VnaCBoYXJkIHJlbG9hZCB0byBoaWRlIE1TRS10ZWFyZG93biBhdWRpbyBjbGljazsgcmVzdG9yZWQgb24KICAgICAgICAvLyBgY2FucGxheWAgd2l0aCAxNTAwbXMgY2FwLgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICBpZiAodiAmJiAhdi5tdXRlZCkgewogICAgICAgICAgICAgICAgdi5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAvLyBNdWx0aS1ldmVudCByZXN0b3JlOiBjYW5wbGF5L3BsYXlpbmcvbG9hZGVkZGF0YSDigJQgZmlyc3QtZmlyZWQgd2lucy4KICAgICAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjb25zdCByZXN0b3JlID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2FucGxheScsIGxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBsaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cikgY3VyLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSA9PT0gJ1ZJREVPJykgcmVzdG9yZSgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCBsaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIGxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocmVzdG9yZSwgNDAwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgcGxheWVyLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgIC8vIGNsZWFyZWQgY2FjaGUpLCB0aGUgdmlkZW8gc3RpbGwgbmVlZHMgdW5tdXRlIGFmdGVyIENocm9tZSdzIGF1dG9wbGF5IG11dGUgb24gcmVsb2FkLgogICAgICAgIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG93TGF0ZW5jeUxTICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TG93TGF0ZW5jeSwgY3VycmVudExvd0xhdGVuY3lMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGVyc2lzdGVuY2VMUyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVBlcnNpc3RlbmNlLCBjdXJyZW50UGVyc2lzdGVuY2VMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHdyaXRlcyB2aWRlby1tdXRlZCBhcyAneyJkZWZhdWx0Ijp0cnVlfScgd2hlbiB1c2VyIG11dGVkIHZpYSBVSTsKICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID4gMCAmJiB2aWRlb3NbMF0ubXV0ZWQgJiYgIXVzZXJJbnRlbmRlZE11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRlbnRMb2FkZWQoKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXZlbnR2LWV4dGVuc2lvbicpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6IDdUViBleHRlbnNpb24gZGV0ZWN0ZWQg4oCUIG1heSBjYXVzZSBibGFjayBzY3JlZW4gb3IgYnVmZmVyaW5nIGlzc3Vlcy4gSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMsIHRyeSBkaXNhYmxpbmcgN1RWLicpOwogICAgICAgIH0KICAgICAgICAvLyBSZXN1bWUgdGhlIHBsYXllciBvbiB0YWIgZm9jdXMgaWYgVHdpdGNoIHBhdXNlZCBpdCBkdXJpbmcgYW4gYWQgb24gYSBoaWRkZW4gdGFiLgogICAgICAgIC8vIFByZXZpb3VzbHkgYWxzbyBzcG9vZmVkIGRvY3VtZW50LmhpZGRlbiAvIHZpc2liaWxpdHlTdGF0ZSAvIGhhc0ZvY3VzIC8gbW96SGlkZGVuIC8KICAgICAgICAvLyB3ZWJraXRIaWRkZW4gYW5kIHN3YWxsb3dlZCB0aGUgZXZlbnRzIG9uIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0IGJyb2tlIG90aGVyCiAgICAgICAgLy8gZXh0ZW5zaW9ucyB0aGF0IGtleSBvZmYgcmVhbCB2aXNpYmlsaXR5IChlLmcuIEJldHRlclRUViAiTXV0ZSBJbnZpc2libGUgUGxheWVyIikuCiAgICAgICAgLy8gUmVzdW1lLW9uLWZvY3VzIGFsb25lIGlzIGVub3VnaCB0byBrZWVwIHBsYXliYWNrIGFsaXZlIGFjcm9zcyBoaWRkZW7ihpJ2aXNpYmxlCiAgICAgICAgLy8gdHJhbnNpdGlvbnMgZHVyaW5nIGFkcy4gU3luYydkIHdpdGggVFRWLUFCIHY2LjUuMC4KICAgICAgICBsZXQgd2FzVmlkZW9QbGF5aW5nID0gdHJ1ZTsKICAgICAgICBjb25zdCB2aXNpYmlsaXR5Q2hhbmdlID0gKCkgPT4gewogICAgICAgICAgICBjb25zdCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPT09IDApIHJldHVybjsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmhpZGRlbikgewogICAgICAgICAgICAgICAgd2FzVmlkZW9QbGF5aW5nID0gIXZpZGVvc1swXS5wYXVzZWQgJiYgIXZpZGVvc1swXS5lbmRlZDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgdmlkZW9zWzBdLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlKTsKICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gcmVsb2FkVHdpdGNoUGxheWVyOwogICAgZGVjbGFyZU9wdGlvbnMod2luZG93KTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgbHNSZWxvYWRBZnRlckFkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZFBsYXllckFmdGVyQWQnKTsKICAgICAgICBpZiAobHNSZWxvYWRBZnRlckFkICE9PSBudWxsKSB7CiAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSBsc1JlbG9hZEFmdGVyQWQgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQbGF5ZXJUeXBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQbGF5ZXJUeXBlICE9PSBudWxsKSB7CiAgICAgICAgICAgIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgPSBsc1BsYXllclR5cGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGluQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BpbkJhY2t1cFBsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQaW5CYWNrdXAgIT09IG51bGwpIHsKICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9IGxzUGluQmFja3VwID09PSAndHJ1ZSc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzQ29vbGRvd24gPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkQ29vbGRvd25TZWNvbmRzJykpOwogICAgICAgIGlmICghaXNOYU4obHNDb29sZG93bikgJiYgbHNDb29sZG93biA+PSAwKSB7CiAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IGxzQ29vbGRvd247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzSGlkZUFkT3ZlcmxheSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19oaWRlQWRPdmVybGF5Jyk7CiAgICAgICAgaWYgKGxzSGlkZUFkT3ZlcmxheSA9PT0gJ3RydWUnKSB7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAnLnRhcy1hZGJsb2NrLW92ZXJsYXkgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0nOwogICAgICAgICAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDb25maWc6IFJlbG9hZFBsYXllckFmdGVyQWQgPSAnICsgUmVsb2FkUGxheWVyQWZ0ZXJBZCArICcsIEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJyArIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIG1vbml0b3JMaXZlU3RhdHVzKCk7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"}] \ No newline at end of file +[{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-auto-pip.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBicmF2ZS1hdXRvLXBpcCDigJQgYXV0b21hdGljIFBpY3R1cmUtaW4tUGljdHVyZSB0b2dnbGUgZm9yIEhUTUw1IDx2aWRlbz4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBXaGF0IGl0IGRvZXMKICogLS0tLS0tLS0tLS0tCiAqICAgMS4gRm9yY2UtZW5hYmxlcyBQaVAgb24gdmlkZW9zIHRoYXQgZXhwbGljaXRseSBkaXNhYmxlIGl0IChOZXRmbGl4LAogKiAgICAgIGNlcnRhaW4gRFJNIHBsYXllcnMpIGJ5IGNsZWFyaW5nIGBkaXNhYmxlUGljdHVyZUluUGljdHVyZWAgYW5kCiAqICAgICAgd2F0Y2hpbmcgZm9yIHNpdGVzIHRoYXQgdHJ5IHRvIHJlLXNldCBpdC4KICogICAyLiBXaXJlcyBgbWVkaWFTZXNzaW9uLnNldEFjdGlvbkhhbmRsZXIoImVudGVycGljdHVyZWlucGljdHVyZSIpYCBzbwogKiAgICAgIGJyb3dzZXJzIC8gT1NlcyB0aGF0IGZpcmUgaXQgKGF1dG8tUGlQIG9uIHRhYiBzd2l0Y2gpIGp1c3Qgd29yay4KICogICAzLiBBZGRzIGEgY2xpY2thYmxlIFBpUCBjb250cm9sOgogKiAgICAgICAgLSBOYXRpdmUgaW5qZWN0aW9uIG9uIFlvdVR1YmUgLyBUd2l0Y2ggLyBOZXRmbGl4IChtYXRjaGVzIGVhY2gKICogICAgICAgICAgc2l0ZSdzIGV4aXN0aW5nIGNvbnRyb2xzIGJhcikuCiAqICAgICAgICAtIE90aGVyd2lzZSBhIEZpcmVmb3gtc3R5bGUgIlBvcCBvdXQgdGhpcyB2aWRlbyIgaG92ZXIgcGlsbAogKiAgICAgICAgICB0aGF0IGZsb2F0cyBvdmVyIHRoZSB2aWRlbywgZmFkZXMgaW4gb24gaG92ZXIsIGZhZGVzIG91dAogKiAgICAgICAgICBhZnRlciBhIHNtYWxsIGdyYWNlIHBlcmlvZCwgYW5kIHNocmlua3MgdG8gaWNvbi1vbmx5IGFmdGVyCiAqICAgICAgICAgIHRoZSBmaXJzdCBjbGljay4KICogICA0LiBIYW5kbGVzIG1hbnkgdmlkZW9zIG9uIHRoZSBzYW1lIHBhZ2UgKGZlZWRzLCBjb21tZW50IGVtYmVkcywKICogICAgICBtb2RhbCBwbGF5ZXJzKSBhbmQgdHJhY2tzIGFkZC9yZW1vdmUgdmlhIE11dGF0aW9uT2JzZXJ2ZXIuCiAqCiAqIENvbmZpZ3VyYXRpb24gKHBlci1vcmlnaW4gbG9jYWxTdG9yYWdlKQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogICBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAKICogICAgIHVuc2V0IC8gIjEiIC8gInRydWUiIC8gInllcyIgLyAib24iICAgLT4gZ2VuZXJpYyBvdmVybGF5IHBpbGwgKGRlZmF1bHQpCiAqICAgICAiMCIgICAvICJmYWxzZSIgLyAibm8iICAgLyAib2ZmIiAgICAgIC0+IHVzZSBzaXRlLXNwZWNpZmljIG5hdGl2ZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gKFlvdVR1YmUvVHdpdGNoL05ldGZsaXgpCiAqCiAqICAgU2V0IHZpYSBEZXZUb29scyBjb25zb2xlIG9uIHRoZSBkZXNpcmVkIG9yaWdpbiwgdGhlbiByZWxvYWQgdGhlIHRhYi4KICoKICogQnJvd3NlciBzdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLQogKiAgIC0gQ2hyb21pdW0gKEJyYXZlLCBDaHJvbWUsIEVkZ2UpOiBmdWxsIHN1cHBvcnQsIGFsbCBmZWF0dXJlcy4KICogICAtIEZpcmVmb3g6IFBpUCB3b3JrcywgYnV0IEZpcmVmb3ggYWxyZWFkeSBzaGlwcyBhIGJ1aWx0LWluICJQb3Agb3V0CiAqICAgICB0aGlzIHZpZGVvIiB0b2dnbGUgc28gdGhlIHNjcmlwdCdzIHBpbGwgaXMgcmVkdW5kYW50IHRoZXJlLgogKiAgIC0gU2FmYXJpIChpT1MgMTQrKTogZmFsbHMgYmFjayB0byBgd2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZWAuIFRoZQogKiAgICAgaG92ZXIgcGlsbCBzd2l0Y2hlcyB0byBhIHRhcC10by1yZXZlYWwgcGlsbCAoMyBzIGF1dG8taGlkZSkuCiAqICAgLSBPdGhlciAvIG9sZGVyOiBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbm8gUGlQIEFQSSBpcwogKiAgICAgcHJlc2VudCBhdCBhbGwuCiAqCiAqIEFyY2hpdGVjdHVyZQogKiAtLS0tLS0tLS0tLS0KICogICAqIE9uZSBzaGFyZWQgbW91c2Vtb3ZlIC8gdG91Y2hzdGFydCAvIHNjcm9sbCAvIHJlc2l6ZSAvIGZ1bGxzY3JlZW4KICogICAgIGxpc3RlbmVyIHNldCwgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB2aWRlb3MgYXJlIG9uIHRoZSBwYWdlCiAqICAgICAoYG92ZXJsYXlzYCByZWdpc3RyeSArIGBhcm1HbG9iYWxzKClgIC8gYG1heWJlRGlzYXJtR2xvYmFscygpYCkuCiAqICAgKiBPZmYtc2NyZWVuIHZpZGVvcyBhcmUgZ2F0ZWQgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBhIHNpbmdsZQogKiAgICAgYEludGVyc2VjdGlvbk9ic2VydmVyYCAoYHZpc2libGVPdmVybGF5c2Agc3Vic2V0KS4KICogICAqIEV2ZXJ5IHBlci12aWRlbyByZWdpc3RyYXRpb24gcmVjb3JkcyBhIHRlYXJkb3duIGZ1bmN0aW9uIGluCiAqICAgICBgdmlkZW9DbGVhbnVwc2Agc28gdGhlIGxpc3RlbmVycywgb2JzZXJ2ZXJzLCBhbmQgcGlsbCBidXR0b24gYXJlCiAqICAgICBhbGwgcmVtb3ZlZCBpZiB0aGUgcGFnZSBkcm9wcyB0aGUgdmlkZW8gZWxlbWVudC4KICoKICogU291cmNlIG9mIG9yaWdpbmFsIGF1dG8tUGlQIGJlaGF2aW91cjoKICogICBodHRwczovL29sZC5yZWRkaXQuY29tL3IvYnJhdmVfYnJvd3Nlci9jb21tZW50cy8xcjhlZGc0LwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCihmdW5jdGlvbigpIHsKICBjb25zdCBWRVJTSU9OID0gInYwLjQyLXl0LWF1dG9waXAtdGFyZ2V0K2NvbmRpdGlvbmFsLXJlc3VtZSI7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFR1bmFibGVzCiAgLy8KICAvLyBDb2xsZWN0ZWQgaGVyZSBzbyBhIHVzZXIgLyBtYWludGFpbmVyIGNhbiBhZGp1c3Qgc3BhY2luZywgdGltaW5nIGFuZAogIC8vIHZpZXdwb3J0IGJlaGF2aW91ciB3aXRob3V0IGh1bnRpbmcgdGhyb3VnaCB0aGUgZmlsZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBjb25zdCBDT05GSUcgPSB7CiAgICAvLyBWZXJ0aWNhbCBvZmZzZXQgYWRkZWQgdG8gdGhlIHBpbGwncyBjZW50cmVkLW1pZC1yaWdodCBwb3NpdGlvbgogICAgLy8gKHBvc2l0aXZlID0gZG93bikuIEVtcGlyaWNhbGx5IHR1bmVkIHNvIHRoZSBwaWxsIHNpdHMgYmVsb3cgdGhlCiAgICAvLyB0eXBpY2FsIHNpdGUgY29udHJvbCBiYXIgaW5zdGVhZCBvZiBvdmVybGFwcGluZyBpdC4KICAgIFBJTExfT0ZGU0VUX1k6IDQwLAogICAgLy8gSG9yaXpvbnRhbCBnYXAgZnJvbSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdmlzaWJsZSB2aWRlbyB0byB0aGUgcGlsbC4KICAgIFBJTExfUklHSFRfTUFSR0lOOiAxMiwKICAgIC8vIE1pbmltdW0gZ2FwIGJldHdlZW4gdGhlIHBpbGwgYW5kIGFueSB2aWV3cG9ydCBlZGdlLgogICAgVklFV1BPUlRfUEFEOiA4LAogICAgLy8gRGVsYXkgYmV0d2VlbiB0aGUgY3Vyc29yIGxlYXZpbmcgdGhlIHZpZGVvL3BpbGwgcmVnaW9uIGFuZCB0aGUKICAgIC8vIHBpbGwgZmFkaW5nIG91dCDigJQgcHJvdGVjdHMgYWdhaW5zdCBmbGlja2VyIHdoZW4gdGhlIGN1cnNvcgogICAgLy8gY3Jvc3NlcyB0aGUgZ2FwIGZyb20gdmlkZW8gdG8gcGlsbC4KICAgIEhPVkVSX0dSQUNFX01TOiAxNTAsCiAgICAvLyBIb3cgbG9uZyB0aGUgcGlsbCBzdGF5cyByZXZlYWxlZCBhZnRlciBhIHRhcCBvbiBhIHRvdWNoIGRldmljZS4KICAgIFRPVUNIX1JFVkVBTF9NUzogMzAwMCwKICAgIC8vIE1heGltdW0gdGltZSB3ZSB3YWl0IGZvciBgbG9hZGVkbWV0YWRhdGFgIGJlZm9yZSBpc3N1aW5nIFBpUC4KICAgIE1FVEFEQVRBX1dBSVRfTVM6IDMwMDAsCiAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBidWZmZXIgc28gdGhlIHBpbGwgaXMgaW4gcGxhY2UgYmVmb3JlIHRoZQogICAgLy8gdmlkZW8gZnVsbHkgc2Nyb2xscyBpbnRvIHZpZXcuCiAgICBJT19ST09UX01BUkdJTjogIjEwMHB4IiwKICAgIC8vIEdyYWNlIHdpbmRvdyBhZnRlciBhIFlvdVR1YmUgU1BBIG5hdmlnYXRpb24gZHVyaW5nIHdoaWNoIHRoZSBwaWxsCiAgICAvLyBzdGF5cyBzdXBwcmVzc2VkIGV2ZW4gaWYgdGhlIG5ldyBVUkwgd291bGQgb3RoZXJ3aXNlIGJlIGVsaWdpYmxlLgogICAgLy8gTGV0cyB0aGUgd2F0Y2gtcGFnZSBwbGF5ZXIgbW91bnQgYW5kIGF2b2lkcyBhIGJyaWVmIGZsYXNoIHdoZW4gdGhlCiAgICAvLyBjdXJzb3IgaXMgc3RpbGwgYXQgdGhlIHByZXZpb3VzIGhvdmVyIHRhcmdldCdzIGNvb3JkaW5hdGVzLgogICAgWVRfTkFWX0dSQUNFX01TOiA1MDAsCiAgICAvLyBJZiBhIG5hdGl2ZSBpbmplY3RvciAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpIGtlZXBzIHJldHVybmluZwogICAgLy8gZmFsc2UgZm9yIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIGdpdmUgdXAKICAgIC8vIG9uIG5hdGl2ZSBpbmplY3Rpb24gYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQuCiAgICAvLyBHZW5lcm91cyBvbiBwdXJwb3NlIOKAlCBzbG93IHBsYXllciBtb3VudHMgKG5ldHdvcmstc3RhbGxlZCBpZnJhbWVzLAogICAgLy8gbG9uZy1ydW5uaW5nIFJlYWN0IGh5ZHJhdGlvbikgc2hvdWxkbid0IHRyaXAgdGhlIGZhbGxiYWNrLgogICAgTkFUSVZFX0ZBTExCQUNLX01TOiAxMDAwMCwKICB9OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNb2R1bGUtbGV2ZWwgc3RhdGUKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gdmlkZW8gZWxlbWVudCAtPiBjbGVhbnVwIGZ1bmN0aW9uLiBQb3B1bGF0ZWQgd2hlbiBhIHZpZGVvIGlzIHdpcmVkCiAgLy8gdXA7IGNhbGxlZCBmcm9tIHRoZSBkaXNjb3ZlcnkgTXV0YXRpb25PYnNlcnZlciB3aGVuIGEgdHJhY2tlZCB2aWRlbwogIC8vIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBzbyB3ZSBjYW4gcmVsZWFzZSBldmVyeSBsaXN0ZW5lciBhbmQgdGhlCiAgLy8gcGlsbCBET00gbm9kZSBpdCBvd25zLgogIGNvbnN0IHZpZGVvQ2xlYW51cHMgPSBuZXcgV2Vha01hcCgpOwoKICAvLyBZb3VUdWJlLXNwZWNpZmljIHN0YXRlIGZvciB0aGUgVVJMLWdhdGUgKyBTUEEtbmF2LWdyYWNlIGxvZ2ljIGluCiAgLy8gdXBkYXRlKCkuIEhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHNvIHVwZGF0ZSgpIGRvZXNuJ3QgcmUtdGVzdCB0aGUKICAvLyBob3N0IHJlZ2V4IGV2ZXJ5IHRpY2sg4oCUIGhvc3RuYW1lIGlzIGludmFyaWFudCBmb3IgdGhlIHBhZ2UgbGlmZXRpbWUsCiAgLy8gYW5kIHRoZSBwYXRobmFtZSByZWdleCBvbmx5IHJlLXJ1bnMgb24gYWN0dWFsIFNQQSBwYXRoIGNoYW5nZXMuCiAgLy8gV2h5IHRoaXMgZXhpc3RzOiBZb3VUdWJlJ3MgaG9tZXBhZ2UgLyBmZWVkIC8gc2VhcmNoIC8gY2hhbm5lbCBwYWdlcwogIC8vIHJldXNlIHRoZSBzYW1lIGBodG1sNS12aWRlby1jb250YWluZXJgIDx2aWRlbz4gZWxlbWVudCBhcyB0aGUgd2F0Y2gKICAvLyBwYWdlIGZvciBob3Zlci10aHVtYm5haWwgcHJldmlld3MsIHJlcG9zaXRpb25pbmcgaXQgb3ZlciB3aGljaGV2ZXIKICAvLyB0aHVtYm5haWwgdGhlIGN1cnNvciBpcyBvbi4gRE9NLWxldmVsIHNpZ25hbHMgKHNpemUsIG11dGVkLCBsb29wLAogIC8vIHBhcmVudCBjbGFzcykgYXJlIGlkZW50aWNhbCBiZXR3ZWVuIHByZXZpZXcgYW5kIHdhdGNoLCBzbyB0aGUgVVJMIGlzCiAgLy8gdGhlIG9ubHkgcmVsaWFibGUgZGlzdGluZ3Vpc2hlci4KICBjb25zdCBfeXRIb3N0ID0gLyg/Ol58XC4pKD86eW91dHViZVwuY29tfHlvdXR1YmUtbm9jb29raWVcLmNvbSkkL2kudGVzdChsb2NhdGlvbi5ob3N0bmFtZSk7CiAgY29uc3QgX3l0V2F0Y2hQYXRoID0gL15cLyg/OndhdGNofGVtYmVkfGxpdmV8c2hvcnRzKS87CiAgbGV0IF95dExhc3RQYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgbGV0IF95dFByZXZpZXdBcmVhID0gX3l0SG9zdCAmJiAhX3l0V2F0Y2hQYXRoLnRlc3QoX3l0TGFzdFBhdGgpOwogIGxldCBfeXROYXZBdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE92ZXJsYXkgcmVnaXN0cnkgKyB2aWV3cG9ydCBnYXRpbmcKICAvLwogIC8vIEdvYWw6IE8oMSkgZG9jdW1lbnQvd2luZG93IGxpc3RlbmVycyByZWdhcmRsZXNzIG9mIHZpZGVvIGNvdW50LCBhbmQKICAvLyBPKHZpc2libGUpIChub3QgTyh0b3RhbCkpIHdvcmsgcGVyIHNjcm9sbC9tb3VzZW1vdmUgdGljay4gQSBzaW5nbGUKICAvLyBzaGFyZWQgbGlzdGVuZXIgc2V0IHdhbGtzIHRoZSByZWdpc3RyeTsgYW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIKICAvLyBuYXJyb3dzIGl0ZXJhdGlvbiB0byB0aGUgdmlkZW9zIGFjdHVhbGx5IG9uIHNjcmVlbi4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gRXZlcnkgb3ZlcmxheSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgKGxpZmV0aW1lIHJlZ2lzdHJ5KS4KICBjb25zdCBvdmVybGF5cyA9IG5ldyBTZXQoKTsKICAvLyBTdWJzZXQgb2YgYG92ZXJsYXlzYCB3aG9zZSB2aWRlbyBpcyBjdXJyZW50bHkgaW50ZXJzZWN0aW5nIHRoZQogIC8vIHZpZXdwb3J0LiBIb3QtcGF0aCBpdGVyYXRpb24gdXNlcyB0aGlzIHNldCBzbyBvZmYtc2NyZWVuIHZpZGVvcyBpbgogIC8vIGxvbmcgZmVlZHMgZG9uJ3QgcGF5IGxheW91dCBjb3N0cyBvbiBldmVyeSBzY3JvbGwgZnJhbWUuCiAgY29uc3QgdmlzaWJsZU92ZXJsYXlzID0gbmV3IFNldCgpOwogIC8vIFJldmVyc2UgbG9va3VwIGZvciB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sgKGVudHJ5LnRhcmdldAogIC8vIGlzIHRoZSB2aWRlbyBlbGVtZW50KS4KICBjb25zdCB2aWRlb1RvT3ZlcmxheSA9IG5ldyBXZWFrTWFwKCk7CiAgbGV0IGludGVyc2VjdGlvbk9ic2VydmVyID0gbnVsbDsKICBmdW5jdGlvbiBnZXRJTygpIHsKICAgIGlmIChpbnRlcnNlY3Rpb25PYnNlcnZlcikgcmV0dXJuIGludGVyc2VjdGlvbk9ic2VydmVyOwogICAgaWYgKHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgZSA9IGVudHJpZXNbaV07CiAgICAgICAgY29uc3QgaW5zdCA9IHZpZGVvVG9PdmVybGF5LmdldChlLnRhcmdldCk7CiAgICAgICAgaWYgKCFpbnN0KSBjb250aW51ZTsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmFkZChpbnN0KTsKICAgICAgICB9IGVsc2UgaWYgKHZpc2libGVPdmVybGF5cy5kZWxldGUoaW5zdCkpIHsKICAgICAgICAgIC8vIEZvcmNlIGEgZmluYWwgdXBkYXRlIHNvIGFueSB2aXNpYmxlIHBpbGwgaGlkZXMgY2xlYW5seS4KICAgICAgICAgIGluc3QudXBkYXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7IHJvb3RNYXJnaW46IENPTkZJRy5JT19ST09UX01BUkdJTiB9KTsKICAgIHJldHVybiBpbnRlcnNlY3Rpb25PYnNlcnZlcjsKICB9CiAgLy8gTGFzdCBrbm93biBwb2ludGVyIHBvc2l0aW9uIChudW1iZXJzLCBuZXZlciB0aGUgTW91c2VFdmVudCDigJQga2VlcGluZwogIC8vIHRoZSBldmVudCBhbGl2ZSBhY3Jvc3MgckFGIHRpY2tzIHBpbnMgZXh0cmEgRE9NIHJlZmVyZW5jZXMgaW4gVjgncwogIC8vIGNsb3N1cmUgZW52aXJvbm1lbnQpLgogIGxldCBtbVggPSAwLCBtbVkgPSAwOwogIC8vIENvYWxlc2NpbmcgZmxhZ3Mg4oCUIGNvbGxhcHNlIGJ1cnN0cyBvZiBtb3VzZW1vdmUgLyBzY3JvbGwgLyBldGMuIGludG8KICAvLyBhIHNpbmdsZSBwZXItZnJhbWUgdGljayBpbnN0ZWFkIG9mIG9uZSB0aWNrIHBlciBldmVudC4KICBsZXQgbW1UaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IHVwZFRpY2tTY2hlZHVsZWQgPSBmYWxzZTsKICAvLyBUcnVlIHdoZW4gZ2xvYmFsIGxpc3RlbmVycyBhcmUgY3VycmVudGx5IGF0dGFjaGVkLiBSZWZlcmVuY2UtY291bnRlZAogIC8vIGJ5IGBvdmVybGF5cy5zaXplYCBzbyB3ZSBvbmx5IGxpc3RlbiB3aGlsZSBhdCBsZWFzdCBvbmUgb3ZlcmxheSBpcyBsaXZlLgogIGxldCBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gX21tVGljaygpIHsKICAgIG1tVGlja1NjaGVkdWxlZCA9IGZhbHNlOwogICAgY29uc3QgeCA9IG1tWCwgeSA9IG1tWTsKICAgIC8vIEl0ZXJhdGUgb25seSB0aGUgdmlzaWJsZSBzdWJzZXQ7IG9mZi1zY3JlZW4gdmlkZW9zIGNhbid0IGJlIGhvdmVyZWQuCiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC5oYW5kbGVQb2ludGVyKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX29uRG9jTW91c2VNb3ZlKGUpIHsKICAgIG1tWCA9IGUuY2xpZW50WDsKICAgIG1tWSA9IGUuY2xpZW50WTsKICAgIGlmIChtbVRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIG1tVGlja1NjaGVkdWxlZCA9IHRydWU7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX21tVGljayk7CiAgfQogIGZ1bmN0aW9uIF9vbkRvY1RvdWNoU3RhcnQoZSkgewogICAgY29uc3QgdCA9IChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB8fCAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKTsKICAgIGlmICghdCkgcmV0dXJuOwogICAgY29uc3QgeCA9IHQuY2xpZW50WCwgeSA9IHQuY2xpZW50WTsKICAgIHZpc2libGVPdmVybGF5cy5mb3JFYWNoKChpbnN0KSA9PiBpbnN0LmhhbmRsZVRvdWNoKHgsIHkpKTsKICB9CiAgZnVuY3Rpb24gX3NjaGVkdWxlVXBkYXRlQWxsKCkgewogICAgaWYgKHVwZFRpY2tTY2hlZHVsZWQpIHJldHVybjsKICAgIHVwZFRpY2tTY2hlZHVsZWQgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF91cGRhdGVBbGxUaWNrKTsKICB9CiAgZnVuY3Rpb24gX3VwZGF0ZUFsbFRpY2soKSB7CiAgICB1cGRUaWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgICB2aXNpYmxlT3ZlcmxheXMuZm9yRWFjaCgoaW5zdCkgPT4gaW5zdC51cGRhdGUoKSk7CiAgfQoKICBmdW5jdGlvbiBhcm1HbG9iYWxzKCkgewogICAgaWYgKGdsb2JhbHNBcm1lZCkgcmV0dXJuOwogICAgZ2xvYmFsc0FybWVkID0gdHJ1ZTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIGFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlRGlzYXJtR2xvYmFscygpIHsKICAgIGlmICghZ2xvYmFsc0FybWVkIHx8IG92ZXJsYXlzLnNpemUgPiAwKSByZXR1cm47CiAgICBnbG9iYWxzQXJtZWQgPSBmYWxzZTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIF9vbkRvY01vdXNlTW92ZSwgdHJ1ZSk7CiAgICBpZiAoSVNfVE9VQ0gpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBfb25Eb2NUb3VjaFN0YXJ0LCB7IGNhcHR1cmU6IHRydWUgfSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBfc2NoZWR1bGVVcGRhdGVBbGwpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgX3NjaGVkdWxlVXBkYXRlQWxsLCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICAvLyBUZWFyIGRvd24gdGhlIEludGVyc2VjdGlvbk9ic2VydmVyIHRvbyDigJQgaXQncyB0aWVkIHRvIHRoZSBzYW1lCiAgICAvLyBvdmVybGF5IGxpZmVjeWNsZSBhcyB0aGUgZ2xvYmFsIGxpc3RlbmVycy4gUmUtY3JlYXRlZCBsYXppbHkgYnkKICAgIC8vIGdldElPKCkgaWYgYSBmdXR1cmUgb3ZlcmxheSByZWdpc3RlcnMuCiAgICBpZiAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHsKICAgICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICBpbnRlcnNlY3Rpb25PYnNlcnZlciA9IG51bGw7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDYXBhYmlsaXR5ICsgZW52aXJvbm1lbnQgZGV0ZWN0aW9uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBpUCBhdmFpbGFiaWxpdHkgYWNyb3NzIGJyb3dzZXJzOgogIC8vICAgSEFTX1NUQU5EQVJEX1BJUCDigJQgYHJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlYCAoQ2hyb21pdW0gLyBGaXJlZm94IC8gaU9TIDE0KykuCiAgLy8gICBIQVNfV0VCS0lUX1BJUCAgIOKAlCBvbGRlciBpT1MgU2FmYXJpJ3MgYHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGVgLgogIC8vIFRoZSBzY3JpcHQgYmFpbHMgb3V0IGF0IHN0YXJ0dXAgaWYgbmVpdGhlciBpcyBwcmVzZW50LgogIGNvbnN0IEhBU19TVEFOREFSRF9QSVAgPSAhIWRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbmFibGVkOwogIGNvbnN0IEhBU19XRUJLSVRfUElQID0gIndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUiIGluIEhUTUxWaWRlb0VsZW1lbnQucHJvdG90eXBlOwogIGNvbnN0IFBJUF9TVVBQT1JURUQgPSBIQVNfU1RBTkRBUkRfUElQIHx8IEhBU19XRUJLSVRfUElQOwoKICAvLyBUb3VjaCBjYXBhYmlsaXR5IOKAlCBzd2l0Y2hlcyB0aGUgb3ZlcmxheSBmcm9tIGhvdmVyLWRyaXZlbiB0bwogIC8vIHRhcC10by1yZXZlYWwgb24gaU9TIC8gQW5kcm9pZC4KICBjb25zdCBJU19UT1VDSCA9ICJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwOwoKICAvLyBDb21iaW5lZCBmdWxsc2NyZWVuIGNoZWNrIGFjcm9zcyB0aGUgdGhyZWUgdmVuZG9yIHZhcmlhbnRzOgogIC8vICAgLSBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAgICAgICAoc3RhbmRhcmQpCiAgLy8gICAtIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IChvbGRlciBDaHJvbWl1bSAvIFNhZmFyaSBkZXNrdG9wKQogIC8vICAgLSB2aWRlby53ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbiAoaU9TIG5hdGl2ZSB2aWRlbyBmdWxsc2NyZWVuLAogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggbmV2ZXIgc2V0cyBkb2N1bWVudC4qKQogIGZ1bmN0aW9uIGlzRnVsbHNjcmVlbih2aWRlbykgewogICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICBpZiAodmlkZW8gJiYgdmlkZW8ud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW4pIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gQ29uc29sZSBvdXRwdXQuIGBsb2dgIGZvciBvbmUtbGluZSBzdWNjZXNzIG1lc3NhZ2VzIG9uIGluamVjdGlvbiwKICAvLyBgd2FybmAgZm9yIGZhaWx1cmVzIChrZXB0IHF1aWV0IGJ5IGRlZmF1bHQpLgogIGNvbnN0IFRBRyA9ICJbYnJhdmUtYXV0by1waXAgIiArIFZFUlNJT04gKyAiXSI7CiAgY29uc3QgbG9nID0gKC4uLmEpID0+IGNvbnNvbGUubG9nKFRBRywgLi4uYSk7CiAgY29uc3Qgd2FybiA9ICguLi5hKSA9PiBjb25zb2xlLndhcm4oVEFHLCAuLi5hKTsKCiAgLy8gUGljayB0aGUgYmVzdCA8dmlkZW8+IGZvciBhbiBhdXRvLVBpUCBpbnRlbnQgZmlyZWQgYnkgdGhlIE9TIC8KICAvLyBicm93c2VyLiBVc2VkIGJ5IHRoZSBnbG9iYWwgYG1lZGlhU2Vzc2lvbmAgYWN0aW9uIGhhbmRsZXIgc28gdGhlCiAgLy8gKmxhc3QqIHJlZ2lzdGVyZWQgdmlkZW8gZG9lc24ndCBnZXQgUGlQJ2QgYnkgZGVmYXVsdCDigJQgc2VlIGNvbW1lbnQKICAvLyBhdCB0aGUgcmVnaXN0cmF0aW9uIHNpdGUgZm9yIHRoZSBZb3VUdWJlIGJsYWNrLXNjcmVlbiByYXRpb25hbGUuCiAgZnVuY3Rpb24gcGlja0F1dG9QaXBUYXJnZXQoKSB7CiAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHJldHVybiBkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudDsKICAgIGNvbnN0IHZpZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgIGxldCBiZXN0UGxheWluZyA9IG51bGwsIGJlc3RQbGF5aW5nQXJlYSA9IDA7CiAgICBsZXQgYmVzdFJlYWR5ID0gbnVsbCwgYmVzdFJlYWR5QXJlYSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZHMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgdiA9IHZpZHNbaV07CiAgICAgIGlmICh2LmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKSBjb250aW51ZTsKICAgICAgY29uc3QgciA9IHYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGEgPSBNYXRoLm1heCgwLCByLndpZHRoKSAqIE1hdGgubWF4KDAsIHIuaGVpZ2h0KTsKICAgICAgaWYgKGEgPD0gMCkgY29udGludWU7CiAgICAgIGlmICghdi5wYXVzZWQgJiYgIXYuZW5kZWQgJiYgdi5yZWFkeVN0YXRlID49IDIgJiYgYSA+IGJlc3RQbGF5aW5nQXJlYSkgewogICAgICAgIGJlc3RQbGF5aW5nID0gdjsgYmVzdFBsYXlpbmdBcmVhID0gYTsKICAgICAgfQogICAgICBpZiAodi5yZWFkeVN0YXRlID49IDEgJiYgYSA+IGJlc3RSZWFkeUFyZWEpIHsKICAgICAgICBiZXN0UmVhZHkgPSB2OyBiZXN0UmVhZHlBcmVhID0gYTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJlc3RQbGF5aW5nIHx8IGJlc3RSZWFkeTsKICB9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFBpUCBpY29uIGZhY3RvcnkKICAvLwogIC8vIEJ1aWx0IHdpdGggY3JlYXRlRWxlbWVudE5TIGluc3RlYWQgb2YgaW5uZXJIVE1MIHRvIGF2b2lkIFRydXN0ZWRUeXBlcwogIC8vIC8gQ1NQIGByZXF1aXJlVHJ1c3RlZFR5cGVzRm9yICdzY3JpcHQnYCB2aW9sYXRpb25zIG9uIFlvdVR1YmUgZXRjLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERlZmVuc2UtaW4tZGVwdGggaGVscGVyIHVzZWQgd2hlbiBjbG9uaW5nIHRoaXJkLXBhcnR5IHdyYXBwZXIKICAvLyBlbGVtZW50cyAoTmV0ZmxpeCdzIC5tZWRpdW0gaWNvbiB3cmFwcGVyLCBUd2l0Y2gncyByaWdodC1jb250cm9scwogIC8vIHdyYXBwZXIpLiBjbG9uZU5vZGUoZmFsc2UpIGNhcnJpZXMgZm9yd2FyZCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMKICAvLyBhbmQgdGhlIGBzdHlsZWAgYXR0cmlidXRlIOKAlCB3ZSBzdHJpcDoKICAvLyAgIC0gYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIGBvbipgICh3b3VsZCByZS1maXJlIHRoZSBzaXRlJ3MKICAvLyAgICAgaW5saW5lIGV2ZW50IGhhbmRsZXJzIG9uIG91ciBjbG9uZSksIGFuZAogIC8vICAgLSB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgaXRzZWxmIChjb3VsZCBjYXJyeSBhIGB1cmwoLi4uKWAgdG9rZW4KICAvLyAgICAgdGhhdCB0cmlnZ2VycyBhIG5ldHdvcmsgZmV0Y2ggd2hlbiB0aGUgY2xvbmUgaXMgcGFyZW50ZWQpLCBhbmQKICAvLyAgIC0gdGhlIGBpZGAgYXR0cmlidXRlIChjbG9uaW5nIHByb2R1Y2VzIGEgZHVwbGljYXRlLCB3aGljaCB3b3VsZAogIC8vICAgICBicmVhayB0aGUgc2l0ZSdzIG93biBnZXRFbGVtZW50QnlJZCAvIENTUyAjaWQgc2VsZWN0b3JzKS4KICAvLyBXZSByZWx5IG9uIHRoZSBjbG9uZWQgZWxlbWVudCdzIGNsYXNzIGxpc3QgZm9yIHNpemluZy9zcGFjaW5nLAogIC8vIHdoaWNoIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHZpYSB0aGUgc2l0ZSdzIGV4dGVybmFsIHN0eWxlc2hlZXQuCiAgZnVuY3Rpb24gc3RyaXBJbmxpbmVIYW5kbGVycyhlbCkgewogICAgY29uc3QgYXR0cnMgPSBlbC5hdHRyaWJ1dGVzOwogICAgZm9yIChsZXQgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBhdHRyc1tpXS5uYW1lOwogICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJvbiIpIHx8IG5hbWUgPT09ICJzdHlsZSIgfHwgbmFtZSA9PT0gImlkIikgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfQogIH0KCiAgY29uc3QgUElQX1NWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgZnVuY3Rpb24gbWFrZVBpcFN2ZyhzaXplKSB7CiAgICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoUElQX1NWR19OUywgInN2ZyIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgidmlld0JveCIsICIwIDAgMjQgMjQiKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgc2l6ZSk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBzaXplKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgImN1cnJlbnRDb2xvciIpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjIiKTsKICAgIGNvbnN0IHIxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMS5zZXRBdHRyaWJ1dGUoIngiLCAiMyIpOyByMS5zZXRBdHRyaWJ1dGUoInkiLCAiNSIpOwogICAgcjEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsICIxOCIpOyByMS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsICIxNCIpOyByMS5zZXRBdHRyaWJ1dGUoInJ4IiwgIjIiKTsKICAgIGNvbnN0IHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFBJUF9TVkdfTlMsICJyZWN0Iik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIngiLCAiMTIiKTsgcjIuc2V0QXR0cmlidXRlKCJ5IiwgIjExIik7CiAgICByMi5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgIjciKTsgcjIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCAiNiIpOyByMi5zZXRBdHRyaWJ1dGUoInJ4IiwgIjEiKTsKICAgIHIyLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJjdXJyZW50Q29sb3IiKTsKICAgIHN2Zy5hcHBlbmRDaGlsZChyMSk7IHN2Zy5hcHBlbmRDaGlsZChyMik7CiAgICByZXR1cm4gc3ZnOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGlQIHRvZ2dsZSBlbnRyeSBwb2ludAogIC8vCiAgLy8gU2luZ2xlIGFzeW5jIGZ1bmN0aW9uIHNoYXJlZCBieSBldmVyeSBjbGljayBoYW5kbGVyLiBXYWxrcyB0aGUKICAvLyBhdmFpbGFibGUgQVBJcyBpbiBwcmlvcml0eSBvcmRlciBhbmQgaXMgcm9idXN0IHRvIGEgY2xpY2sgdGhhdCBsYW5kcwogIC8vIGJlZm9yZSB0aGUgdmlkZW8gaGFzIGxvYWRlZCBlbm91Z2ggbWV0YWRhdGEgKHdhaXRzIHVwIHRvIDMgcykuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlUGlwKHZpZGVvKSB7CiAgICB0cnkgewogICAgICAvLyBpT1MgU2FmYXJpIHBhdGgg4oCUIHdlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUgdG9nZ2xlcyBiZXR3ZWVuCiAgICAgIC8vICJpbmxpbmUiLCAicGljdHVyZS1pbi1waWN0dXJlIiBhbmQgImZ1bGxzY3JlZW4iLgogICAgICBpZiAoIUhBU19TVEFOREFSRF9QSVAgJiYgSEFTX1dFQktJVF9QSVAgJiYKICAgICAgICAgIHR5cGVvZiB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdmlkZW8ud2Via2l0UHJlc2VudGF0aW9uTW9kZSA9PT0gInBpY3R1cmUtaW4tcGljdHVyZSIKICAgICAgICAgID8gImlubGluZSIgOiAicGljdHVyZS1pbi1waWN0dXJlIjsKICAgICAgICB2aWRlby53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlKHRhcmdldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIFN0YW5kYXJkIEFQSSBwYXRoLgogICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQgPT09IHZpZGVvKSB7CiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZXhpdFBpY3R1cmVJblBpY3R1cmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCAxKSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7IHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSk7IHJlc29sdmUoKTsgfTsKICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgZG9uZSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgc2V0VGltZW91dChkb25lLCBDT05GSUcuTUVUQURBVEFfV0FJVF9NUyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB2aWRlby5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGF3YWl0IHZpZGVvLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIExhc3QtcmVzb3J0IGlPUyBmYWxsYmFjayBldmVuIGlmIEhBU19TVEFOREFSRF9QSVAgd2FzIGNsYWltZWQuCiAgICAgIGlmICh0eXBlb2YgdmlkZW8ud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUoInBpY3R1cmUtaW4tcGljdHVyZSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB3YXJuKCJQaVAgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTsKICAgIH0gY2F0Y2ggKGVycikgeyB3YXJuKCJQaVAgcmVxdWVzdCBmYWlsZWQ6IiwgZXJyLm1lc3NhZ2UgfHwgZXJyKTsgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gU2l0ZS1zcGVjaWZpYyBuYXRpdmUgaW5qZWN0b3JzCiAgLy8KICAvLyBFYWNoIGluamVjdG9yIGlzIGlkZW1wb3RlbnQgKHNhZmUgdG8gcmUtcnVuIHdoZW4gdGhlIHNpdGUncyBSZWFjdAogIC8vIHJvb3QgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIpIGFuZCByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAvIGZhbHNlCiAgLy8gd2hlbiB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpc24ndCBpbiB0aGUgRE9NIHlldC4gVGhleSdyZSBkcml2ZW4gYnkKICAvLyBhIHBlcnNpc3RlbnQgTXV0YXRpb25PYnNlcnZlciBpbiBgdHJ5TmF0aXZlKClgIHNvIHJlLXJlbmRlcnMgZG9uJ3QKICAvLyBwZXJtYW5lbnRseSBsb3NlIHRoZSBidXR0b24uCiAgLy8KICAvLyBTdHJhdGVneSBhY3Jvc3Mgc2l0ZXM6CiAgLy8gICAtIFlvdVR1YmU6IGluc2VydCBhIDxidXR0b24gY2xhc3M9Inl0cC1idXR0b24iPiBhbG9uZ3NpZGUgdGhlCiAgLy8gICAgIGV4aXN0aW5nIHNldHRpbmdzL21pbmlwbGF5ZXIvc2l6ZSBpY29ucy4gSW5oZXJpdHMgWW91VHViZSdzCiAgLy8gICAgIGF1dG8tZmFkZSAvIGhvdmVyIGJlaGF2aW91ciBmb3IgZnJlZS4KICAvLyAgIC0gVHdpdGNoOiBjbG9uZSB0aGUgd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgcmlnaHQtc2lkZSBjb250cm9sCiAgLy8gICAgIGJ1dHRvbiAoc2V0dGluZ3MvZnVsbHNjcmVlbi90aGVhdHJlKSBhbmQgcGxhY2Ugb3VyIGJ1dHRvbiBpbnNpZGUsCiAgLy8gICAgIHNvIHdlIGluaGVyaXQgVHdpdGNoJ3MgZmxleCBzcGFjaW5nIGNsYXNzZXMuCiAgLy8gICAtIE5ldGZsaXg6IGNsb25lIHRoZSAubWVkaXVtIGljb24gd3JhcHBlciAqYW5kKiB0aGUgM3JlbSBzcGFjZXIKICAvLyAgICAgdGhhdCBzaXRzIGJldHdlZW4gc2libGluZ3MsIHNvIHRoZSByaHl0aG0gb2YgdGhlIGljb24gcm93IGlzCiAgLy8gICAgIHByZXNlcnZlZCBhbmQgZnVsbHNjcmVlbiBzdGF5cyBpbiBpdHMgcm93LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGFkZFlvdVR1YmVCdXR0b24odmlkZW8pIHsKICAgIGlmIChfc2l0ZURpc2FibGVkKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCByaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi55dHAtcmlnaHQtY29udHJvbHMiKTsKICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTsKICAgIGlmIChyaWdodC5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgYnRuLmNsYXNzTmFtZSA9ICJ5dHAtYnV0dG9uIGJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjp0b3A7Y29sb3I6I2ZmZjsiOwogICAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDM2KTsKICAgICAgc3ZnLnN0eWxlLmNzc1RleHQgPSAiZGlzcGxheTpibG9jazsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwoKICAgICAgY29uc3QgYW5jaG9yID0gcmlnaHQucXVlcnlTZWxlY3RvcigiLnl0cC1taW5pcGxheWVyLWJ1dHRvbiwgLnl0cC1zZXR0aW5ncy1idXR0b24sIC55dHAtc2l6ZS1idXR0b24iKTsKICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IucGFyZW50Tm9kZSkgewogICAgICAgIGFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShidG4sIGFuY2hvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmlnaHQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgfQogICAgICBsb2coImluamVjdGVkIG9uIFlvdVR1YmUiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgd2FybigiWW91VHViZSBpbmplY3QgZmFpbGVkOiIsIGVyci5tZXNzYWdlIHx8IGVycik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIFR3aXRjaDogY2xvbmUgdGhlIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIHJpZ2h0LXNpZGUgY29udHJvbCBidXR0b24KICAvLyAoc2V0dGluZ3Mgb3IgZnVsbHNjcmVlbikgYW5kIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUgaXQsIHRoZW4gaW5zZXJ0IGF0CiAgLy8gdGhlIHNhbWUgRE9NIGxldmVsIHNvIHNwYWNpbmcvc2l6aW5nIG1hdGNoLgogIGxldCB0d2l0Y2hJbmplY3RDb3VudCA9IDA7CiAgZnVuY3Rpb24gYWRkVHdpdGNoQnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgLy8gQW5jaG9yIG9uIHRoZSBmdWxsc2NyZWVuIC8gdGhlYXRyZSByb3cgc28gd2UgbGFuZCBhbG9uZ3NpZGUgY2FzdCwKICAgIC8vIHRoZWF0cmUgYW5kIGZ1bGxzY3JlZW4g4oCUIHNldHRpbmdzIG9mdGVuIGxpdmVzIGluIGEgc2VwYXJhdGUgcm93IGluCiAgICAvLyB0aGUgcG9wb3V0IHBsYXllciBsYXlvdXQuCiAgICBjb25zdCBQRUVSX1NFTCA9CiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWZ1bGxzY3JlZW4tYnV0dG9uIl0sJyArCiAgICAgICdbZGF0YS1hLXRhcmdldD0icGxheWVyLXRoZWF0cmUtbW9kZS1idXR0b24iXSwnICsKICAgICAgJ1tkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItc2V0dGluZ3MtYnV0dG9uIl0nOwogICAgY29uc3QgYW5jaG9yQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihQRUVSX1NFTCk7CiAgICBpZiAoIWFuY2hvckJ0bikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFdhbGsgdXAgdG8gdGhlIHJvdyBjb250YWluZXIuIFR3byBzdG9wIHNpZ25hbHMsIGluIHByaW9yaXR5IG9yZGVyOgogICAgLy8gICAxLiBTdHJvbmc6IGEgcGFyZW50IHRoYXQgaGFzIG11bHRpcGxlIGNoaWxkcmVuIEFORCBjb250YWlucyBhCiAgICAvLyAgICAgIHBlZXIgY29udHJvbCBvdXRzaWRlIG91ciBjdXJyZW50IHN1YnRyZWUg4oCUIHRoYXQncyBhbG1vc3QKICAgIC8vICAgICAgY2VydGFpbmx5IHRoZSBhY3R1YWwgY29udHJvbCByb3cuCiAgICAvLyAgIDIuIFdlYWsgKGZhbGxiYWNrKTogdGhlIGZpcnN0IHBhcmVudCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuIHdlCiAgICAvLyAgICAgIHBhc3NlZCBkdXJpbmcgdGhlIHdhbGsuIFVzZWQgd2hlbiB0aGUgc3Ryb25nIHNpZ25hbCBuZXZlcgogICAgLy8gICAgICBmaXJlcywgc28gbGF5b3V0cyB0aGF0IGRvbid0IGV4cG9zZSBwZWVyIGNvbnRyb2xzIGF0IHRoZQogICAgLy8gICAgICBzYW1lIGxldmVsIHN0aWxsIHdvcmsuCiAgICAvLyBDb21iaW5lZCwgdGhpcyBhZGRyZXNzZXMgdGhlIHJldmlldyBjb25jZXJuIGFib3V0IG5vbi1jb250cm9sCiAgICAvLyBzaWJsaW5ncyBoaWphY2tpbmcgdGhlIHN0cnVjdHVyYWwgd2FsayB3aGlsZSBrZWVwaW5nIHRoZSBvcmlnaW5hbAogICAgLy8gYmVoYXZpb3VyIGFzIGEgc2FmZXR5IG5ldC4KICAgIGxldCBhbmNob3JXcmFwcGVyID0gYW5jaG9yQnRuOwogICAgbGV0IHN0cnVjdHVyYWxGYWxsYmFjayA9IG51bGw7CiAgICB3aGlsZSAoYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlICYmIGFuY2hvcldyYXBwZXIucGFyZW50Tm9kZS50YWdOYW1lICE9PSAiQk9EWSIpIHsKICAgICAgY29uc3QgcGFyZW50ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50LmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgICBjb25zdCBwZWVycyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFBFRVJfU0VMKTsKICAgICAgICBsZXQgaGFzT3V0c2lkZVBlZXIgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIWFuY2hvcldyYXBwZXIuY29udGFpbnMocGVlcnNbaV0pKSB7IGhhc091dHNpZGVQZWVyID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc091dHNpZGVQZWVyKSBicmVhazsKICAgICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgc3RydWN0dXJhbEZhbGxiYWNrID0gYW5jaG9yV3JhcHBlcjsKICAgICAgfQogICAgICBhbmNob3JXcmFwcGVyID0gcGFyZW50OwogICAgfQogICAgaWYgKCFhbmNob3JXcmFwcGVyLnBhcmVudE5vZGUgfHwgYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlLnRhZ05hbWUgPT09ICJCT0RZIikgewogICAgICBpZiAoIXN0cnVjdHVyYWxGYWxsYmFjaykgcmV0dXJuIGZhbHNlOwogICAgICBhbmNob3JXcmFwcGVyID0gc3RydWN0dXJhbEZhbGxiYWNrOwogICAgfQogICAgY29uc3Qgcm93ID0gYW5jaG9yV3JhcHBlci5wYXJlbnROb2RlOwogICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKICAgIGlmIChyb3cucXVlcnlTZWxlY3RvcigiLmJyYXZlLXBpcC1idG4iKSkgcmV0dXJuIHRydWU7CiAgICAvLyBTYW5pdHkgY2hlY2s6IGEgaGVhbHRoeSBUd2l0Y2ggcmlnaHQtY29udHJvbHMgcm93IGNvbnRhaW5zIGF0CiAgICAvLyBsZWFzdCB0d28gb2YgdGhlIHBlZXIgYnV0dG9ucyAoc2V0dGluZ3MgKyB0aGVhdHJlICsgZnVsbHNjcmVlbikuCiAgICAvLyBJZiBvbmx5IG9uZSBpcyBwcmVzZW50LCB0aGUgd2FsayBsYW5kZWQgb24gYSBkZWdlbmVyYXRlIHJvdwogICAgLy8gKHBvcG91dCAvIGRldGFjaGVkIHBsYXllciAvIGZ1dHVyZSByZWRlc2lnbikgYW5kIHdlIHNob3VsZCBiYWlsCiAgICAvLyByYXRoZXIgdGhhbiBtaXMtdGFyZ2V0LiBDaGVhcCDigJQgb25lIHF1ZXJ5U2VsZWN0b3JBbGwsIG5vIHdhbGtpbmcuCiAgICBpZiAocm93LnF1ZXJ5U2VsZWN0b3JBbGwoUEVFUl9TRUwpLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTsKCiAgICB0cnkgewogICAgICAvLyBDbG9uZSB0aGUgYW5jaG9yJ3Mgb3V0ZXIgd3JhcHBlciAoc2hhbGxvdykgc28gd2UgaW5oZXJpdCBUd2l0Y2gncwogICAgICAvLyBzcGFjaW5nL2ZsZXggY2xhc3NlcywgdGhlbiBkcm9wIG91ciBvd24gYnV0dG9uIGluc2lkZS4KICAgICAgY29uc3Qgd3JhcHBlciA9IGFuY2hvcldyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hLXRhcmdldCIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpOwogICAgICBzdHJpcElubGluZUhhbmRsZXJzKHdyYXBwZXIpOwoKICAgICAgLy8gU2l6ZSBmcm9tIHRoZSByZW5kZXJlZCBTVkcgZ2x5cGggKHZpc3VhbGx5IGFjY3VyYXRlKS4gRmxvb3IgYXQgMjQKICAgICAgLy8gYmVjYXVzZSBUd2l0Y2gncyB1bmRlcmx5aW5nIFNWRyBlbGVtZW50IGlzIHNvbWV0aW1lcyBzbWFsbGVyIHRoYW4KICAgICAgLy8gdGhlIHZpc3VhbCBpY29uIChDU1Mgc2NhbGVzIGl0IHVwKS4KICAgICAgY29uc3QgcmVmU3ZnID0gYW5jaG9yQnRuLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpOwogICAgICBjb25zdCByZWZTdmdSZWN0ID0gcmVmU3ZnID8gcmVmU3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDsKICAgICAgY29uc3QgcmVmQnRuUmVjdCA9IGFuY2hvckJ0bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgbWVhc3VyZWQgPSByZWZTdmdSZWN0ICYmIHJlZlN2Z1JlY3Qud2lkdGggPiAwCiAgICAgICAgPyBNYXRoLm1pbihyZWZTdmdSZWN0LndpZHRoLCByZWZTdmdSZWN0LmhlaWdodCkKICAgICAgICA6IE1hdGgubWluKHJlZkJ0blJlY3Qud2lkdGgsIHJlZkJ0blJlY3QuaGVpZ2h0KSAqIDAuNzsKICAgICAgY29uc3QgaWNvblNpemUgPSBNYXRoLm1heCgyNCwgTWF0aC5yb3VuZChtZWFzdXJlZCkpOwogICAgICBjb25zdCBib3hTaXplID0gTWF0aC5tYXgoMzAsIE1hdGgucm91bmQocmVmQnRuUmVjdC53aWR0aCB8fCAzMCkpOwoKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgIGJ0bi5jbGFzc05hbWUgPSAiYnJhdmUtcGlwLWJ0biI7CiAgICAgIGJ0bi50eXBlID0gImJ1dHRvbiI7CiAgICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgICBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlBpY3R1cmUtaW4tUGljdHVyZSIpOwogICAgICBidG4uc3R5bGUuY3NzVGV4dCA9CiAgICAgICAgImJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7cGFkZGluZzowO21hcmdpbjowOyIgKwogICAgICAgICJjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyIgKwogICAgICAgICJ3aWR0aDoiICsgYm94U2l6ZSArICJweDtoZWlnaHQ6IiArIGJveFNpemUgKyAicHg7IjsKICAgICAgY29uc3Qgc3ZnID0gbWFrZVBpcFN2ZyhpY29uU2l6ZSk7CiAgICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7Y29sb3I6I2ZmZjsiOwogICAgICBidG4uYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVQaXAodmlkZW8pOyB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgX29uTmF0aXZlQnRuQ29udGV4dE1lbnUpOwogICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGJ0bik7CgogICAgICByb3cuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIGFuY2hvcldyYXBwZXIpOwoKICAgICAgdHdpdGNoSW5qZWN0Q291bnQrKzsKICAgICAgaWYgKHR3aXRjaEluamVjdENvdW50ID09PSAxKSBsb2coImluamVjdGVkIG9uIFR3aXRjaCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICB3YXJuKCJUd2l0Y2ggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyBOZXRmbGl4OiBpbnNlcnQgaW50byB0aGUgc3RhbmRhcmQgY29udHJvbHMgYmFyLCBiZWZvcmUgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uLgogIC8vIE5ldGZsaXggcmFuZG9taXplcyBjbGFzcyBuYW1lcyBidXQgaWNvbnMgZm9sbG93IGEgY29uc2lzdGVudCBwYXR0ZXJuOgogIC8vICAgPGZsZXgtcm93PgogIC8vICAgICA8c3BhY2VyIC4xbnBxeXdyPiAuLi4gPHdyYXBwZXIgLm1lZGl1bT4gPGljb24tYnV0dG9uPiA8L3dyYXBwZXI+CiAgLy8gICAgIDxzcGFjZXIgLjFucHF5d3I+ICAgICA8d3JhcHBlciAubWVkaXVtPiA8aWNvbi1idXR0b24+IDwvd3JhcHBlcj4KICAvLyAgICAgPHNwYWNlciAuMW5wcXl3cj4gICAgIDx3cmFwcGVyIC5tZWRpdW0+IDxpY29uLWJ1dHRvbiBkYXRhLXVpYT0iY29udHJvbC1mdWxsc2NyZWVuLS4uLiI+IDwvd3JhcHBlcj4KICAvLyBXZSBjbG9uZSB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyIChhbmQgdGhlIHNwYWNlciBpbiBmcm9udCBvZiBpdCkgc28gb3VyCiAgLy8gYnV0dG9uIGdldHMgdGhlIHNhbWUgc3R5bGluZyBhbmQgcmh5dGhtIGFzIG5hdGl2ZSBpY29ucy4KICBsZXQgbmZseEluamVjdENvdW50ID0gMDsKICBmdW5jdGlvbiBhZGROZXRmbGl4QnV0dG9uKHZpZGVvKSB7CiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJyk7CiAgICBpZiAoIWJhcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGJhci5xdWVyeVNlbGVjdG9yKCIuYnJhdmUtcGlwLWJ0biIpKSByZXR1cm4gdHJ1ZTsKCiAgICB0cnkgewogICAgICBjb25zdCBmcyA9IGJhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1lbnRlciJdLCBbZGF0YS11aWE9ImNvbnRyb2wtZnVsbHNjcmVlbi1leGl0Il0nKTsKICAgICAgaWYgKCFmcykgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRmluZCBOZXRmbGl4J3MgaWNvbiB3cmFwcGVyIGFyb3VuZCBmdWxsc2NyZWVuIOKAlCB0aGUgLm1lZGl1bSBjbGFzcwogICAgICAvLyBpcyB0aGUgc3RhYmxlIHNpZ25hbDsgZmFsbCBiYWNrIHRvIHRoZSBjbG9zZXN0IGRpdi4KICAgICAgY29uc3QgZnNXcmFwcGVyID0gZnMuY2xvc2VzdCgiLm1lZGl1bSIpIHx8IGZzLmNsb3Nlc3QoImRpdiIpIHx8IGZzOwogICAgICBjb25zdCByb3cgPSBmc1dyYXBwZXIucGFyZW50Tm9kZTsKICAgICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFNpemUgZnJvbSB0aGUgaW5uZXIgc3ZnIG9mIGZ1bGxzY3JlZW4ncyBidXR0b24gc28gd2UgdmlzdWFsbHkgbWF0Y2guCiAgICAgIGNvbnN0IHJlZlN2ZyA9IGZzLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpIHx8IChmcy5jbG9zZXN0KCJidXR0b24iKSB8fCBmcykucXVlcnlTZWxlY3Rvcigic3ZnIik7CiAgICAgIGNvbnN0IHJlZlN2Z1JlY3QgPSByZWZTdmcgPyByZWZTdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsOwogICAgICBjb25zdCBpY29uU2l6ZSA9IHJlZlN2Z1JlY3QgJiYgcmVmU3ZnUmVjdC53aWR0aCA+IDAKICAgICAgICA/IE1hdGgucm91bmQoTWF0aC5taW4ocmVmU3ZnUmVjdC53aWR0aCwgcmVmU3ZnUmVjdC5oZWlnaHQpKQogICAgICAgIDogMjg7CgogICAgICAvLyBDbG9uZSB0aGUgd3JhcHBlciAoc2hhbGxvdyDigJQgcHJlc2VydmVzIGNsYXNzZXMvaW5saW5lIHN0eWxlcykgYW5kCiAgICAgIC8vIGVtcHR5IGl0LCB0aGVuIGRyb3Agb3VyIGJ1dHRvbiBpbnNpZGUuCiAgICAgIGNvbnN0IHdyYXBwZXIgPSBmc1dyYXBwZXIuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJicmF2ZS1waXAtd3JhcHBlciIpOwogICAgICB3cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS11aWEiKTsKICAgICAgc3RyaXBJbmxpbmVIYW5kbGVycyh3cmFwcGVyKTsKCiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidG4uY2xhc3NOYW1lID0gImJyYXZlLXBpcC1idG4iOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4udGl0bGUgPSAiUGljdHVyZS1pbi1QaWN0dXJlIjsKICAgICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgICAgYnRuLnN0eWxlLmNzc1RleHQgPQogICAgICAgICJiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO3BhZGRpbmc6MDttYXJnaW46MDsiICsKICAgICAgICAid2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyI7CiAgICAgIGNvbnN0IHN2ZyA9IG1ha2VQaXBTdmcoaWNvblNpemUpOwogICAgICBzdmcuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OmJsb2NrOyI7CiAgICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZVBpcCh2aWRlbyk7IH0pOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBfb25OYXRpdmVCdG5Db250ZXh0TWVudSk7CiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYnRuKTsKCiAgICAgIC8vIENsb25lIHRoZSBzcGFjZXIgdGhhdCBwcmVjZWRlcyB0aGUgZnVsbHNjcmVlbiB3cmFwcGVyLCBzbyBzcGFjaW5nCiAgICAgIC8vIGJldHdlZW4gb3VyIGJ1dHRvbiBhbmQgZnVsbHNjcmVlbiBtYXRjaGVzIHRoZSByaHl0aG0gYmV0d2VlbgogICAgICAvLyBleGlzdGluZyBpY29ucy4KICAgICAgY29uc3QgcHJldlNwYWNlciA9IGZzV3JhcHBlci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwogICAgICBjb25zdCBzcGFjZXJDbG9uZSA9IChwcmV2U3BhY2VyICYmIHByZXZTcGFjZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKQogICAgICAgID8gcHJldlNwYWNlci5jbG9uZU5vZGUoZmFsc2UpCiAgICAgICAgOiBudWxsOwoKICAgICAgcm93Lmluc2VydEJlZm9yZSh3cmFwcGVyLCBmc1dyYXBwZXIpOwogICAgICBpZiAoc3BhY2VyQ2xvbmUpIHJvdy5pbnNlcnRCZWZvcmUoc3BhY2VyQ2xvbmUsIGZzV3JhcHBlcik7CgogICAgICBuZmx4SW5qZWN0Q291bnQrKzsKICAgICAgaWYgKG5mbHhJbmplY3RDb3VudCA9PT0gMSkgbG9nKCJpbmplY3RlZCBvbiBOZXRmbGl4Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHdhcm4oIk5ldGZsaXggaW5qZWN0IGZhaWxlZDoiLCBlcnIubWVzc2FnZSB8fCBlcnIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBHZW5lcmljIEZpcmVmb3gtc3R5bGUgb3ZlcmxheQogIC8vCiAgLy8gVXNlZCBvbiBldmVyeSBzaXRlIGJ5IGRlZmF1bHQgKHVubGVzcyBsb2NhbFN0b3JhZ2UudXNlZ2VuZXJpY19waXAgaXMKICAvLyBleHBsaWNpdGx5IHNldCB0byAiMCIpLiBNaW1pY3MgRmlyZWZveCdzICJQb3Agb3V0IHRoaXMgdmlkZW8iIHRvZ2dsZToKICAvLyBhIGRhcmsgcGlsbCBhbmNob3JlZCBtaWQtcmlnaHQgb2YgdGhlIHZpZGVvIHRoYXQgZmFkZXMgaW4gb24gaG92ZXIKICAvLyBhbmQgZmFkZXMgb3V0IGFmdGVyIHRoZSBjdXJzb3IgbGVhdmVzLiBBZnRlciB0aGUgdXNlciBjbGlja3Mgb25jZSBpdAogIC8vIHNocmlua3MgdG8gaWNvbi1vbmx5IGZvciB0aGUgcmVzdCBvZiB0aGUgc2Vzc2lvbiDigJQgbGVzcyB2aXN1YWwgbm9pc2UKICAvLyBvbiBzdWJzZXF1ZW50IGhvdmVycy4KICAvLwogIC8vIEhvdmVyIGRldGVjdGlvbiBydW5zIHRocm91Z2ggdGhlIHNoYXJlZCBgX29uRG9jTW91c2VNb3ZlYCBoYW5kbGVyCiAgLy8gKHNlZSB0b3Agb2YgZmlsZSkgaW5zdGVhZCBvZiBgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIpYCwKICAvLyBiZWNhdXNlIG1hbnkgcGxheWVycyAoTmV0ZmxpeCwgY3VzdG9tKSBsYXllciB0aGVpciBVSSBvbiB0b3Agb2YgdGhlCiAgLy8gPHZpZGVvPiBhbmQgYWJzb3JiIG1vdXNlIGV2ZW50cyBiZWZvcmUgdGhleSByZWFjaCBpdC4gQSBnbG9iYWwKICAvLyBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIGJ5cGFzc2VzIHRoYXQuCiAgLy8KICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSBwaWxsIGlzIHRhcC10by1yZXZlYWwgKDMgcyBhdXRvLWZhZGUpIGluc3RlYWQuCiAgLy8KICAvLyBgdGVhcmRvd25zYCBpcyBhbiBhcnJheSB0aGUgY2FsbGVyIChgYXR0YWNoVG9WaWRlb2ApIGhhbmRzIGluOyB3ZQogIC8vIHB1c2ggY2xlYW51cCBjbG9zdXJlcyBvbnRvIGl0IHNvIGEgbGF0ZXIgY2xlYW51cCBvZiB0aGlzIHZpZGVvCiAgLy8gcmVsZWFzZXMgZXZlcnkgbGlzdGVuZXIgLyBvYnNlcnZlciAvIERPTSBub2RlIHdlIGNyZWF0ZWQgaGVyZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIFJlYWNoaW5nIGhlcmUgbWVhbnMgYGF0dGFjaFRvVmlkZW9gJ3MgYHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKWAKICAgIC8vIGd1YXJkIGFscmVhZHkgc2hvcnQtY2lyY3VpdGVkIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zLCBzbyBubwogICAgLy8gc2VwYXJhdGUgZGF0YXNldCBtYXJrZXIgaXMgbmVlZGVkLgogICAgLy8gUGVyLW9yaWdpbiBvcHQtb3V0OiBza2lwIGJ1aWxkaW5nIGFueXRoaW5nIGlmIHRoZSB1c2VyIHByZXZpb3VzbHkKICAgIC8vIGRpc2FibGVkIHRoZSBwaWxsIG9uIHRoaXMgc2l0ZSB2aWEgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuCiAgICBpZiAoX3NpdGVEaXNhYmxlZCkgcmV0dXJuOwogICAgY29uc3QgUEFERElOR19GVUxMID0gIjhweCAxNHB4IDhweCAxMHB4IjsKICAgIGNvbnN0IFBBRERJTkdfSUNPTiA9ICI4cHgiOwoKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgYnRuLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ0bi50aXRsZSA9ICJQaWN0dXJlLWluLVBpY3R1cmUiOwogICAgYnRuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJQaWN0dXJlLWluLVBpY3R1cmUiKTsKICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0KICAgICAgInBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDsiICsKICAgICAgInBhZGRpbmc6IiArIFBBRERJTkdfRlVMTCArICI7IiArCiAgICAgICJib3JkZXI6MDtib3JkZXItcmFkaXVzOjhweDsiICsKICAgICAgImJhY2tncm91bmQ6cmdiYSgyOCwyOCwzMCwwLjkyKTtjb2xvcjojZmZmOyIgKwogICAgICAiZm9udDo2MDAgMTNweC8xIHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLFNlZ29lIFVJLFJvYm90byxzYW5zLXNlcmlmOyIgKwogICAgICAiY3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiYm94LXNoYWRvdzowIDJweCA4cHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAib3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAwLjE1cyBlYXNlOyIgKwogICAgICAicG9pbnRlci1ldmVudHM6YXV0bzt1c2VyLXNlbGVjdDpub25lOyI7CiAgICBjb25zdCBzdmcgPSBtYWtlUGlwU3ZnKDE4KTsKICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6YmxvY2s7IjsKICAgIGJ0bi5hcHBlbmRDaGlsZChzdmcpOwogICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICJQb3Agb3V0IHRoaXMgdmlkZW8iOwogICAgYnRuLmFwcGVuZENoaWxkKGxhYmVsKTsKCiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCAoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNob3dEaXNhYmxlTWVudShlLmNsaWVudFgsIGUuY2xpZW50WSk7CiAgICB9KTsKCiAgICBsZXQgY2xpY2tlZCA9IGZhbHNlOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBpZiAoIWNsaWNrZWQpIHsKICAgICAgICBjbGlja2VkID0gdHJ1ZTsKICAgICAgICAvLyBTdXBwcmVzcyBmYWRlIHNvIHRoZSBpY29uLW9ubHkgcGlsbCBpcyBpbiBpdHMgZmluYWwgcG9zaXRpb24KICAgICAgICAvLyBiZWZvcmUgdGhlIHVzZXIgbm90aWNlcyB0aGUgY2hhbmdlLgogICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gYnRuLnN0eWxlLnRyYW5zaXRpb247CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSAibm9uZSI7CiAgICAgICAgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9IFBBRERJTkdfSUNPTjsKICAgICAgICBidG4uc3R5bGUuZ2FwID0gIjAiOwogICAgICAgIHVwZGF0ZSgpOyAvLyBzeW5jaHJvbm91cyByZXBvc2l0aW9uIGZvciB0aGUgbmV3IChzbWFsbGVyKSBib3gKICAgICAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyB0aGUgbmV4dCBzdHlsZSBjaGFuZ2UgaXMgY29tbWl0dGVkIHdpdGhvdXQKICAgICAgICAvLyBhIHRyYW5zaXRpb24sIHRoZW4gcmVzdG9yZSB0aGUgZmFkZSB0cmFuc2l0aW9uLgogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMKICAgICAgICBidG4ub2Zmc2V0V2lkdGg7CiAgICAgICAgYnRuLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsKICAgICAgfQogICAgICB0b2dnbGVQaXAodmlkZW8pOwogICAgfSk7CiAgICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGJ0bik7CgogICAgbGV0IGhvdmVyID0gZmFsc2U7CiAgICBsZXQgaG92ZXJUaW1lciA9IG51bGw7CiAgICBsZXQgbGFzdFJlY3QgPSBudWxsOwogICAgbGV0IHRvdWNoSGlkZVRpbWVyID0gbnVsbDsKICAgIGZ1bmN0aW9uIHNldEhvdmVyKHYpIHsKICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICBpZiAodikgeyBob3ZlciA9IHRydWU7IHVwZGF0ZSgpOyB9CiAgICAgIGVsc2UgICB7IGhvdmVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsgaG92ZXIgPSBmYWxzZTsgdXBkYXRlKCk7IH0sIENPTkZJRy5IT1ZFUl9HUkFDRV9NUyk7IH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0OwogICAgICBpZiAoIXIpIHJldHVybjsKICAgICAgY29uc3Qgb3ZlclZpZGVvID0KICAgICAgICB4ID49IHIubGVmdCAmJiB4IDw9IHIucmlnaHQgJiYKICAgICAgICB5ID49IHIudG9wICAmJiB5IDw9IHIuYm90dG9tOwogICAgICBsZXQgb3ZlckJ0biA9IGZhbHNlOwogICAgICBpZiAoYnRuLnN0eWxlLmRpc3BsYXkgIT09ICJub25lIikgewogICAgICAgIGNvbnN0IGJSZWN0ID0gYnRuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIG92ZXJCdG4gPQogICAgICAgICAgeCA+PSBiUmVjdC5sZWZ0ICYmIHggPD0gYlJlY3QucmlnaHQgJiYKICAgICAgICAgIHkgPj0gYlJlY3QudG9wICAmJiB5IDw9IGJSZWN0LmJvdHRvbTsKICAgICAgfQogICAgICBpZiAob3ZlclZpZGVvIHx8IG92ZXJCdG4pIHsgaWYgKCFob3Zlcikgc2V0SG92ZXIodHJ1ZSk7IH0KICAgICAgZWxzZSBpZiAoaG92ZXIpIHNldEhvdmVyKGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoKHgsIHkpIHsKICAgICAgY29uc3QgciA9IGxhc3RSZWN0IHx8IHZpZGVvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBsYXN0UmVjdCA9IHI7CiAgICAgIGNvbnN0IG92ZXJWaWRlbyA9CiAgICAgICAgeCA+PSByLmxlZnQgJiYgeCA8PSByLnJpZ2h0ICYmCiAgICAgICAgeSA+PSByLnRvcCAgJiYgeSA8PSByLmJvdHRvbTsKICAgICAgaWYgKCFvdmVyVmlkZW8pIHJldHVybjsKICAgICAgc2V0SG92ZXIodHJ1ZSk7CiAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgY2xlYXJUaW1lb3V0KHRvdWNoSGlkZVRpbWVyKTsKICAgICAgdG91Y2hIaWRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0b3VjaEhpZGVUaW1lciA9IG51bGw7CiAgICAgICAgc2V0SG92ZXIoZmFsc2UpOwogICAgICB9LCBDT05GSUcuVE9VQ0hfUkVWRUFMX01TKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgIC8vIE1hdGNoIEZpcmVmb3g6IHNob3cgb24gaG92ZXIgcmVnYXJkbGVzcyBvZiBwYXVzZWQgc3RhdGUuIE9ubHkKICAgICAgLy8gcmVxdWlyZSB0aGF0IHRoZSB2aWRlbyBoYXMgbWV0YWRhdGEgbG9hZGVkIChzbyBQaVAgaXMgdXNhYmxlKSwKICAgICAgLy8gaXMgdmlzaWJsZSwgYW5kIHdlJ3JlIG5vdCBpbiBmdWxsc2NyZWVuIChpbmNsLiBpT1Mgd2Via2l0IEZTKS4KICAgICAgLy8gQWxzbyBob25vdXIgYSBtaWQtc2Vzc2lvbiBkaXNhYmxlIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUKICAgICAgLy8gKGNhY2hlZCBgX3NpdGVEaXNhYmxlZGAgZmxhZyDigJQgbm8gbG9jYWxTdG9yYWdlIGhpdCBwZXIgdGljaykuCiAgICAgIGlmIChfc2l0ZURpc2FibGVkKSB7CiAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlYWR5ID0gdmlkZW8ucmVhZHlTdGF0ZSA+PSAxOwogICAgICBjb25zdCBmcyA9IGlzRnVsbHNjcmVlbih2aWRlbyk7CiAgICAgIGNvbnN0IHIgPSB2aWRlby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbGFzdFJlY3QgPSByOwogICAgICBjb25zdCBvblNjcmVlbiA9IHIud2lkdGggPiAwICYmIHIuaGVpZ2h0ID4gMCAmJiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCBpbm5lckhlaWdodDsKICAgICAgLy8gWW91VHViZSBVUkwgZ2F0ZSArIFNQQS1uYXYtZ3JhY2UuIFJlZnJlc2ggdGhlIGNhY2hlZCBwcmV2aWV3LWFyZWEKICAgICAgLy8gZmxhZyBhbmQgc3RhbXAgYSBuYXZpZ2F0aW9uIHRpbWVzdGFtcCBvbiBwYXRoIGNoYW5nZSwgdGhlbgogICAgICAvLyBzdXBwcmVzcyBlbGlnaWJpbGl0eSB3aGlsZSB3ZSdyZSBlaXRoZXIgb24gYSBub24td2F0Y2ggVVJMIG9yCiAgICAgIC8vIGluc2lkZSB0aGUgcG9zdC1uYXYgZ3JhY2Ugd2luZG93IChhYnNvcmJzIHRoZSBicmllZiBmbGFzaCB3aGVuCiAgICAgIC8vIGEgaG9tZXBhZ2UgdGh1bWJuYWlsIGNsaWNrIGxhbmRzIHRoZSBjdXJzb3Igb24gdGhlIG5ldyBwbGF5ZXIpLgogICAgICBpZiAoX3l0SG9zdCAmJiBfeXRMYXN0UGF0aCAhPT0gbG9jYXRpb24ucGF0aG5hbWUpIHsKICAgICAgICBfeXRMYXN0UGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgIF95dFByZXZpZXdBcmVhID0gIV95dFdhdGNoUGF0aC50ZXN0KF95dExhc3RQYXRoKTsKICAgICAgICBfeXROYXZBdCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICAgIGNvbnN0IF9pbk5hdkdyYWNlID0gX3l0TmF2QXQgJiYgKHBlcmZvcm1hbmNlLm5vdygpIC0gX3l0TmF2QXQpIDwgQ09ORklHLllUX05BVl9HUkFDRV9NUzsKICAgICAgY29uc3QgZWxpZ2libGUgPSByZWFkeSAmJiAhZnMgJiYgb25TY3JlZW4gJiYgIV95dFByZXZpZXdBcmVhICYmICFfaW5OYXZHcmFjZTsKICAgICAgaWYgKCFlbGlnaWJsZSkgewogICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gIm5vbmUiOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtZmxleCI7CiAgICAgIGNvbnN0IHcgPSBidG4ub2Zmc2V0V2lkdGggfHwgMTcwOwogICAgICBjb25zdCBoID0gYnRuLm9mZnNldEhlaWdodCB8fCAzNjsKCiAgICAgIC8vIENvbXB1dGUgbWlkLXJpZ2h0IG9mIHRoZSAqdmlzaWJsZSogcG9ydGlvbiBvZiB0aGUgdmlkZW8gKHRoZQogICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgaXRzIHJlY3Qgd2l0aCB0aGUgdmlld3BvcnQpLiBOZXRmbGl4J3MgPHZpZGVvPgogICAgICAvLyBjYW4gYmUgbXVjaCB0YWxsZXIgdGhhbiB0aGUgdmlld3BvcnQuCiAgICAgIGNvbnN0IHZpc1RvcCA9IE1hdGgubWF4KHIudG9wLCAwKTsKICAgICAgY29uc3QgdmlzQm90dG9tID0gTWF0aC5taW4oci5ib3R0b20sIGlubmVySGVpZ2h0KTsKICAgICAgY29uc3QgdmlzUmlnaHQgPSBNYXRoLm1pbihyLnJpZ2h0LCBpbm5lcldpZHRoKTsKICAgICAgbGV0IHRvcCA9IE1hdGgucm91bmQodmlzVG9wICsgKHZpc0JvdHRvbSAtIHZpc1RvcCAtIGgpIC8gMikgKyBDT05GSUcuUElMTF9PRkZTRVRfWTsKICAgICAgbGV0IGxlZnQgPSBNYXRoLnJvdW5kKHZpc1JpZ2h0IC0gdyAtIENPTkZJRy5QSUxMX1JJR0hUX01BUkdJTik7CiAgICAgIC8vIEZpbmFsIHZpZXdwb3J0IGNsYW1wLgogICAgICB0b3AgPSBNYXRoLm1heChDT05GSUcuVklFV1BPUlRfUEFELCBNYXRoLm1pbih0b3AsIGlubmVySGVpZ2h0IC0gaCAtIENPTkZJRy5WSUVXUE9SVF9QQUQpKTsKICAgICAgbGVmdCA9IE1hdGgubWF4KENPTkZJRy5WSUVXUE9SVF9QQUQsIE1hdGgubWluKGxlZnQsIGlubmVyV2lkdGggLSB3IC0gQ09ORklHLlZJRVdQT1JUX1BBRCkpOwoKICAgICAgYnRuLnN0eWxlLnRvcCA9IHRvcCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gaG92ZXIgPyAiMSIgOiAiMCI7CiAgICAgIGJ0bi5zdHlsZS5wb2ludGVyRXZlbnRzID0gaG92ZXIgPyAiYXV0byIgOiAibm9uZSI7CiAgICB9CgogICAgY29uc3Qgb25CdG5FbnRlciA9ICgpID0+IHNldEhvdmVyKHRydWUpOwogICAgY29uc3Qgb25CdG5MZWF2ZSA9ICgpID0+IHNldEhvdmVyKGZhbHNlKTsKCiAgICAvLyBQZXItdmlkZW8gbGlzdGVuZXJzIHN0YXkgb24gdGhlIHZpZGVvIGVsZW1lbnQuIERvY3VtZW50L3dpbmRvdwogICAgLy8gbGlzdGVuZXJzIGFyZSBzaGFyZWQgdmlhIHRoZSBtb2R1bGUtbGV2ZWwgYG92ZXJsYXlzYCByZWdpc3RyeQogICAgLy8gKG9uZSBzZXQgb2YgZ2xvYmFscyByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHZpZGVvcyBhcmUgb24gdGhlIHBhZ2UpLgogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgb25CdG5MZWF2ZSk7CiAgICBjb25zdCBWSURFT19FVkVOVFMgPSBbInBsYXkiLCJwbGF5aW5nIiwicGF1c2UiLCJlbmRlZCIsImVtcHRpZWQiLCJsb2FkZWRkYXRhIl07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFZJREVPX0VWRU5UUy5sZW5ndGg7IGkrKykgewogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIH0KICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGJlZ2luZnVsbHNjcmVlbiIsIF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKF9zY2hlZHVsZVVwZGF0ZUFsbCk7CiAgICByby5vYnNlcnZlKHZpZGVvKTsKCiAgICBjb25zdCBpbnN0YW5jZSA9IHsgdXBkYXRlLCBoYW5kbGVQb2ludGVyLCBoYW5kbGVUb3VjaCB9OwogICAgb3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIHZpZGVvVG9PdmVybGF5LnNldCh2aWRlbywgaW5zdGFuY2UpOwogICAgY29uc3QgaW8gPSBnZXRJTygpOwogICAgaWYgKGlvKSB7CiAgICAgIGlvLm9ic2VydmUodmlkZW8pOwogICAgICAvLyBJbnRlcnNlY3Rpb25PYnNlcnZlciBmaXJlcyBhIGNhbGxiYWNrIHN5bmNocm9ub3VzbHkgYWZ0ZXIKICAgICAgLy8gb2JzZXJ2ZSgpIGluIGEgbWljcm90YXNrLiBVbnRpbCB0aGVuIGFzc3VtZSB0aGUgdmlkZW8gaXMKICAgICAgLy8gdmlzaWJsZSBzbyB0aGUgdmVyeSBmaXJzdCB1cGRhdGUoKSBydW5zLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIElPIHN1cHBvcnQg4oCUIGZhbGwgYmFjayB0byAiYWx3YXlzIHZpc2libGUiLgogICAgICB2aXNpYmxlT3ZlcmxheXMuYWRkKGluc3RhbmNlKTsKICAgIH0KICAgIGFybUdsb2JhbHMoKTsKICAgIHVwZGF0ZSgpOwoKICAgIGlmICh0ZWFyZG93bnMpIHsKICAgICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICAgIG92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgdmlzaWJsZU92ZXJsYXlzLmRlbGV0ZShpbnN0YW5jZSk7CiAgICAgICAgaWYgKGludGVyc2VjdGlvbk9ic2VydmVyKSBpbnRlcnNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUodmlkZW8pOwogICAgICAgIHZpZGVvVG9PdmVybGF5LmRlbGV0ZSh2aWRlbyk7CiAgICAgICAgYnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBvbkJ0bkVudGVyKTsKICAgICAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIG9uQnRuTGVhdmUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVklERU9fRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFZJREVPX0VWRU5UU1tpXSwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB9CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2Via2l0YmVnaW5mdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJraXRlbmRmdWxsc2NyZWVuIiwgX3NjaGVkdWxlVXBkYXRlQWxsKTsKICAgICAgICByby5kaXNjb25uZWN0KCk7CiAgICAgICAgaWYgKGhvdmVyVGltZXIpIHsgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyBob3ZlclRpbWVyID0gbnVsbDsgfQogICAgICAgIGlmICh0b3VjaEhpZGVUaW1lcikgeyBjbGVhclRpbWVvdXQodG91Y2hIaWRlVGltZXIpOyB0b3VjaEhpZGVUaW1lciA9IG51bGw7IH0KICAgICAgICBidG4ucmVtb3ZlKCk7CiAgICAgICAgbWF5YmVEaXNhcm1HbG9iYWxzKCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29uZmlndXJhdGlvbiAmIGRpc3BhdGNoCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIFBlci1vcmlnaW4gYGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcGAgZmxhZy4KICAvLyBEZWZhdWx0IGlzIE9OOiBldmVyeSBzaXRlIHVzZXMgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIHVubGVzcyB0aGUKICAvLyB1c2VyIGhhcyBleHBsaWNpdGx5IG9wdGVkIGludG8gbmF0aXZlIGluamVjdGlvbiAoc2V0IHRoZSBmbGFnIHRvCiAgLy8gIjAiIC8gImZhbHNlIiAvICJubyIgLyAib2ZmIikuIFdyYXBwZWQgaW4gdHJ5L2NhdGNoIGJlY2F1c2UKICAvLyBsb2NhbFN0b3JhZ2UgYWNjZXNzIHRocm93cyBpbiBwcml2YXRlIC8gc2FuZGJveGVkIGNvbnRleHRzLgogIC8vCiAgLy8gRXhjZXB0aW9uOiB3d3cueW91dHViZS5jb20sIHd3dy50d2l0Y2gudHYgYW5kIHd3dy5uZXRmbGl4LmNvbQogIC8vIGRlZmF1bHQgdG8gT0ZGIChuYXRpdmUgaW5qZWN0aW9uKSBiZWNhdXNlIHRoZWlyIHBsYXllcnMgYWxyZWFkeQogIC8vIGhhdmUgZmlyc3QtY2xhc3MgY29udHJvbCBiYXJzIHdoZXJlIGEgbmF0aXZlIGJ1dHRvbiBsb29rcyBhdCBob21lLgogIC8vIE9ubHkgdGhlIGV4YWN0IGRlc2t0b3AgaG9zdG5hbWVzIGFyZSB0YXJnZXRlZCDigJQgbS4vbXVzaWMuL21vYmlsZQogIC8vIHN1YmRvbWFpbnMga2VlcCB0aGUgZ2VuZXJpYy1waWxsIGRlZmF1bHQuIFRoZSB1c2VyIGNhbiBmbGlwIHRoZQogIC8vIGZsYWcgZXhwbGljaXRseSBwZXIgb3JpZ2luIHRvIG92ZXJyaWRlLgogIC8vCiAgLy8gUmVhZCBsYXppbHkgb24gZmlyc3QgdXNlIChub3QgYXQgSUlGRSBpbml0KSBzbyB0aGF0IHVzZXJzY3JpcHQKICAvLyBtYW5hZ2VycyBvciBwb2x5ZmlsbCBzaGltcyB0aGF0IHJlcGxhY2UgYGxvY2FsU3RvcmFnZWAgc2xpZ2h0bHkKICAvLyBhZnRlciBvdXIgc2NyaXB0IGxvYWRzIHN0aWxsIHNlZSBhIGNvbnNpc3RlbnQgdmFsdWUuIEFmdGVyIHRoZQogIC8vIGZpcnN0IHJlYWQgaXQncyBjYWNoZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwYWdlIGxpZmV0aW1lIOKAlCB0aGUKICAvLyB2YWx1ZSBjYW4ndCBjaGFuZ2Ugd2l0aG91dCBhIHJlbG9hZC4KICBjb25zdCBOQVRJVkVfREVGQVVMVF9IT1NUUyA9IG5ldyBTZXQoWyJ3d3cueW91dHViZS5jb20iLCAid3d3LnR3aXRjaC50diIsICJ3d3cubmV0ZmxpeC5jb20iXSk7CiAgZnVuY3Rpb24gX2RlZmF1bHRHZW5lcmljRm9ySG9zdCgpIHsKICAgIHJldHVybiAhTkFUSVZFX0RFRkFVTFRfSE9TVFMuaGFzKGxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiByZWFkR2VuZXJpY1BpcEZvcmNlZCgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidXNlZ2VuZXJpY19waXAiKTsKICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsKICAgICAgY29uc3QgcyA9IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKICAgICAgaWYgKHMgPT09ICIwIiB8fCBzID09PSAiZmFsc2UiIHx8IHMgPT09ICJubyIgfHwgcyA9PT0gIm9mZiIpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIHsgcmV0dXJuIF9kZWZhdWx0R2VuZXJpY0Zvckhvc3QoKTsgfQogIH0KICBsZXQgX2dlbmVyaWNQaXBGb3JjZWRDYWNoZSA9IG51bGw7IC8vIG51bGwgPSBub3QgeWV0IHJlYWQKICBmdW5jdGlvbiBnZW5lcmljUGlwRm9yY2VkQ2FjaGVkKCkgewogICAgaWYgKF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPT09IG51bGwpIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGUgPSByZWFkR2VuZXJpY1BpcEZvcmNlZCgpOwogICAgcmV0dXJuIF9nZW5lcmljUGlwRm9yY2VkQ2FjaGU7CiAgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IHdoZW4gdHJ1dGh5LCB0aGUgZ2VuZXJpYyBvdmVybGF5IHBpbGwgaXMKICAvLyBzdXBwcmVzc2VkIG9uIHRoaXMgc2l0ZS4gU2V0IHZpYSB0aGUgcmlnaHQtY2xpY2sgbWVudSBvbiB0aGUgcGlsbDsKICAvLyBjbGVhcmVkIGZyb20gRGV2VG9vbHMgd2l0aCBgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImJyYXZlX3BpcF9kaXNhYmxlZCIpYC4KICAvLwogIC8vIFRoZSBmbGFnIGlzIGNhY2hlZCBpbiBgX3NpdGVEaXNhYmxlZGAgYWZ0ZXIgdGhlIGluaXRpYWwgYmFpbC1vdXQKICAvLyBjaGVjayBzbyB0aGUgaG90IHBhdGhzICh1cGRhdGUoKSBydW5zIHBlciB2aXNpYmxlIHZpZGVvIHBlcgogIC8vIGFuaW1hdGlvbiBmcmFtZSkgZG9uJ3QgaGF2ZSB0byBoaXQgbG9jYWxTdG9yYWdlIGV2ZXJ5IHRpY2suIFRoZQogIC8vIG1lbnUncyBjbGljayBoYW5kbGVyIGZsaXBzIHRoZSBjYWNoZWQgdmFsdWUgd2hlbiB0aGUgdXNlciBkaXNhYmxlcwogIC8vIG1pZC1zZXNzaW9uLgogIGNvbnN0IERJU0FCTEVfS0VZID0gImJyYXZlX3BpcF9kaXNhYmxlZCI7CiAgZnVuY3Rpb24gcmVhZFNpdGVEaXNhYmxlZCgpIHsKICAgIHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShESVNBQkxFX0tFWSkgPT09ICIxIjsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfQogIH0KICBmdW5jdGlvbiBzZXRTaXRlRGlzYWJsZWQoKSB7CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShESVNBQkxFX0tFWSwgIjEiKTsgfSBjYXRjaCB7fQogIH0KICAvLyBDYWNoZWQgZmxhZyDigJQgdXBkYXRlZCBvbiBpbml0IGFuZCBvbiBtaWQtc2Vzc2lvbiBkaXNhYmxlLgogIGxldCBfc2l0ZURpc2FibGVkID0gZmFsc2U7CgogIC8vIFNoYXJlZCByaWdodC1jbGljayBoYW5kbGVyIGF0dGFjaGVkIHRvIGV2ZXJ5IG5hdGl2ZSBpbmplY3RlZCBidXR0b24KICAvLyAoWW91VHViZSAvIFR3aXRjaCAvIE5ldGZsaXgpLiBNaXJyb3JzIHRoZSBnZW5lcmljIHBpbGwncyBjb250ZXh0bWVudQogIC8vIHdpcmluZyBzbyB1c2VycyBjYW4gZGlzYWJsZSBQaVAgb24gdGhlIGhvc3Qgc2l0ZSBmcm9tIGFueSBvZiBvdXIgVUlzLgogIGZ1bmN0aW9uIF9vbk5hdGl2ZUJ0bkNvbnRleHRNZW51KGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBzaG93RGlzYWJsZU1lbnUoZS5jbGllbnRYLCBlLmNsaWVudFkpOwogIH0KCiAgLy8gUmVtb3ZlcyBhbnkgb2Ygb3VyIGluamVjdGVkIERPTSAobmF0aXZlIGJ1dHRvbnMgKyBjbG9uZWQgd3JhcHBlcnMpLgogIC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIHBpY2tzICJEaXNhYmxlIFBpUCBpY29uIG9uIDxzaXRlPiIgZnJvbSB0aGUKICAvLyByaWdodC1jbGljayBtZW51IHNvIHRoZSBwYWdlIHJldHVybnMgdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS4KICBmdW5jdGlvbiBfcmVtb3ZlTmF0aXZlQnV0dG9ucygpIHsKICAgIGNvbnN0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJyYXZlLXBpcC1idG4sIC5icmF2ZS1waXAtd3JhcHBlciIpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgbm9kZXNbaV0ucmVtb3ZlKCk7CiAgfQoKICAvLyBTaW5nbGUtaW5zdGFuY2UgY3VzdG9tIGNvbnRleHQgbWVudSBzaG93biBvbiByaWdodC1jbGljayBvZiB0aGUKICAvLyBnZW5lcmljIHBpbGwgb3IgYW55IG5hdGl2ZSBpbmplY3RlZCBidXR0b24uIFdlIGNhbid0IGN1c3RvbWlzZSB0aGUKICAvLyBicm93c2VyJ3MgbmF0aXZlIGNvbnRleHQgbWVudSB3aXRob3V0IGFuIGV4dGVuc2lvbiwgc28gd2UgY2FuY2VsIGl0CiAgLy8gKGBwcmV2ZW50RGVmYXVsdGApIGFuZCByZW5kZXIgb3VyIG93biBET00uIEF1dG8tZGlzbWlzc2VzIG9uCiAgLy8gY2xpY2stb3V0c2lkZSwgRXNjYXBlLCBvciBzY3JvbGwuCiAgbGV0IGFjdGl2ZU1lbnUgPSBudWxsOwogIC8vIFRpbWVzdGFtcCB3aGVuIHRoZSBhY3RpdmUgbWVudSB3YXMgb3BlbmVkLiBPdXRzaWRlLWNsaWNrcyB3aXRoaW4gYQogIC8vIHNob3J0IHdpbmRvdyAofjE1MCBtcykgb2Ygb3BlbmluZyBhcmUgaWdub3JlZCDigJQgZGVmZW5kcyBhZ2FpbnN0IGEKICAvLyBzeW50aGV0aWMgc2FtZS1mcmFtZSBjbGljayBieXBhc3NpbmcgdGhlIHNldFRpbWVvdXQoMCkgaGFuZG9mZi4KICBsZXQgYWN0aXZlTWVudU9wZW5lZEF0ID0gMDsKICBjb25zdCBNRU5VX09QRU5fR1VBUkRfTVMgPSAxNTA7CiAgZnVuY3Rpb24gY2xvc2VNZW51KCkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBhY3RpdmVNZW51LnJlbW92ZSgpOwogICAgYWN0aXZlTWVudSA9IG51bGw7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgX29uTWVudUtleSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgY2xvc2VNZW51LCB0cnVlKTsKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGNsb3NlTWVudSk7CiAgfQogIGZ1bmN0aW9uIF9vbk1lbnVLZXkoZSkgeyBpZiAoZS5rZXkgPT09ICJFc2NhcGUiKSBjbG9zZU1lbnUoKTsgfQogIGZ1bmN0aW9uIF9vbk1lbnVDbGlja091dHNpZGUoZSkgewogICAgaWYgKCFhY3RpdmVNZW51KSByZXR1cm47CiAgICBpZiAoZS50aW1lU3RhbXAgLSBhY3RpdmVNZW51T3BlbmVkQXQgPCBNRU5VX09QRU5fR1VBUkRfTVMpIHJldHVybjsKICAgIGlmICghYWN0aXZlTWVudS5jb250YWlucyhlLnRhcmdldCkpIGNsb3NlTWVudSgpOwogIH0KICBmdW5jdGlvbiBzaG93RGlzYWJsZU1lbnUoeCwgeSkgewogICAgY2xvc2VNZW51KCk7CiAgICBjb25zdCBtZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBtZW51LnN0eWxlLmNzc1RleHQgPQogICAgICAicG9zaXRpb246Zml4ZWQ7bGVmdDoiICsgeCArICJweDt0b3A6IiArIHkgKyAicHg7IiArCiAgICAgICJiYWNrZ3JvdW5kOnJnYmEoMjgsMjgsMzAsMC45Nik7Y29sb3I6I2ZmZjsiICsKICAgICAgImJvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6NHB4IDA7IiArCiAgICAgICJib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjQpOyIgKwogICAgICAiei1pbmRleDoyMTQ3NDgzNjQ3OyIgKwogICAgICAiZm9udDo1MDAgMTNweC8xLjQgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sU2Vnb2UgVUksUm9ib3RvLHNhbnMtc2VyaWY7IiArCiAgICAgICJ1c2VyLXNlbGVjdDpub25lO3BvaW50ZXItZXZlbnRzOmF1dG87bWluLXdpZHRoOjE4MHB4OyI7CgogICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaXRlbS50ZXh0Q29udGVudCA9ICJEaXNhYmxlIFBpUCBpY29uIG9uICIgKyBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjhweCAxNHB4O2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcDsiOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAicmdiYSgyNTUsMjU1LDI1NSwwLjEyKSI7IH0pOwogICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgKCkgPT4geyBpdGVtLnN0eWxlLmJhY2tncm91bmQgPSAiIjsgfSk7CiAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBzZXRTaXRlRGlzYWJsZWQoKTsKICAgICAgX3NpdGVEaXNhYmxlZCA9IHRydWU7CiAgICAgIC8vIEhpZGUgZXZlcnkgYWN0aXZlIGdlbmVyaWMgcGlsbCBvbiB0aGlzIHBhZ2UgaW1tZWRpYXRlbHkuIFRoZQogICAgICAvLyBuZXh0IGB1cGRhdGUoKWAgdGljayB3aWxsIHNlZSB0aGUgY2FjaGVkIGZsYWcgYW5kIGtlZXAgdGhlbQogICAgICAvLyBoaWRkZW4uIE5hdGl2ZSBpbmplY3RlZCBidXR0b25zIChZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeCkKICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGRpcmVjdGx5IOKAlCB0aGVpciBwZXJzaXN0ZW50IG9ic2VydmVycwogICAgICAvLyB3aWxsIHNlZSBgX3NpdGVEaXNhYmxlZGAgYW5kIHN0b3AgcmUtaW5qZWN0aW5nLgogICAgICBfc2NoZWR1bGVVcGRhdGVBbGwoKTsKICAgICAgX3JlbW92ZU5hdGl2ZUJ1dHRvbnMoKTsKICAgICAgbG9nKCJkaXNhYmxlZCBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUpOwogICAgICBjbG9zZU1lbnUoKTsKICAgIH0pOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgYWN0aXZlTWVudSA9IG1lbnU7CiAgICBhY3RpdmVNZW51T3BlbmVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKCiAgICAvLyBJZiB0aGUgbWVudSB3b3VsZCBvdmVyZmxvdyB0aGUgdmlld3BvcnQsIG51ZGdlIGl0IGJhY2sgaW4uCiAgICBjb25zdCByID0gbWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmIChyLnJpZ2h0ID4gaW5uZXJXaWR0aCkgIG1lbnUuc3R5bGUubGVmdCA9IChpbm5lcldpZHRoICAtIHIud2lkdGggIC0gOCkgKyAicHgiOwogICAgaWYgKHIuYm90dG9tID4gaW5uZXJIZWlnaHQpIG1lbnUuc3R5bGUudG9wICA9IChpbm5lckhlaWdodCAtIHIuaGVpZ2h0IC0gOCkgKyAicHgiOwoKICAgIC8vIERlZmVyIGxpc3RlbmVyIGF0dGFjaCB0byB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gdGhlIGNsaWNrIHRoYXQKICAgIC8vIG9wZW5lZCB0aGUgbWVudSBkb2Vzbid0IGltbWVkaWF0ZWx5IGRpc21pc3MgaXQuCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIF9vbk1lbnVLZXksIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIF9vbk1lbnVDbGlja091dHNpZGUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBjbG9zZU1lbnUsIHRydWUpOwogICAgICBhZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBjbG9zZU1lbnUpOwogICAgfSwgMCk7CiAgfQoKICAvLyBOYXRpdmUtc2l0ZSBhZGFwdGVyIHRhYmxlLiBFYWNoIGVudHJ5IGRlc2NyaWJlcyBvbmUgc2l0ZSB3aG9zZQogIC8vIHBsYXllciBjaHJvbWUgd2Uga25vdyBob3cgdG8gaW5qZWN0IGludG8uIERldGVjdGlvbiBpcyBob3N0bmFtZS0KICAvLyBmaXJzdCAoaGFuZGxlcyByZWd1bGFyIHBhZ2VzKSB3aXRoIGEgRE9NLXNpZ25hbCBmYWxsYmFjayAoaGFuZGxlcwogIC8vIGFib3V0OmJsYW5rIHNhbWUtb3JpZ2luIGlmcmFtZXMgd2hlcmUgbG9jYXRpb24uaG9zdG5hbWUgaXMgIiIpLgogIC8vCiAgLy8gVG8gc3VwcG9ydCBhIG5ldyBzaXRlLCBhZGQgYSByZWNvcmQgaGVyZSBhbmQgd3JpdGUgYSBtYXRjaGluZwogIC8vIGBhZGQ8TmFtZT5CdXR0b24odmlkZW8pYCBpbmplY3RvciDigJQgbm8gb3RoZXIgY2hhbmdlIHJlcXVpcmVkLgogIGNvbnN0IE5BVElWRV9TSVRFUyA9IFsKICAgIHsKICAgICAgbmFtZTogIllvdVR1YmUiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoInlvdXR1YmUuY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5odG1sNS12aWRlby1wbGF5ZXIsIC55dHAtcmlnaHQtY29udHJvbHMiKSwKICAgICAgaW5qZWN0OiBhZGRZb3VUdWJlQnV0dG9uLAogICAgICBzY29wZTogIi5odG1sNS12aWRlby1wbGF5ZXIiLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlR3aXRjaCIsCiAgICAgIG1hdGNoOiAoaG9zdCkgPT4gaG9zdC5lbmRzV2l0aCgidHdpdGNoLnR2IikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXIsIFtkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItY29udHJvbHMiXScpLAogICAgICBpbmplY3Q6IGFkZFR3aXRjaEJ1dHRvbiwKICAgICAgc2NvcGU6ICdbZGF0YS1hLXRhcmdldD0icGxheWVyLWNvbnRyb2xzIl0sIC52aWRlby1wbGF5ZXInLAogICAgfSwKICAgIHsKICAgICAgbmFtZTogIk5ldGZsaXgiLAogICAgICBtYXRjaDogKGhvc3QpID0+IGhvc3QuZW5kc1dpdGgoIm5ldGZsaXguY29tIikKICAgICAgICB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVpYT0iY29udHJvbHMtc3RhbmRhcmQiXSwgW2RhdGEtdWlhPSJ2aWRlby1jYW52YXMiXScpLAogICAgICBpbmplY3Q6IGFkZE5ldGZsaXhCdXR0b24sCiAgICAgIHNjb3BlOiAnW2RhdGEtdWlhPSJjb250cm9scy1zdGFuZGFyZCJdJywKICAgIH0sCiAgXTsKCiAgLy8gUnVuIGFuIGluamVjdG9yIG9uY2Ugbm93IGFuZCBhZ2FpbiBvbiBldmVyeSByZWxldmFudCBET00gbXV0YXRpb24sCiAgLy8gc28gdGhlIGJ1dHRvbiByZWFwcGVhcnMgYWZ0ZXIgUmVhY3QgKE5ldGZsaXggLyBUd2l0Y2gpIHRlYXJzIGRvd24KICAvLyBhbmQgcmUtbW91bnRzIHRoZSBjb250cm9scyBiYXIuIFRoZSBvYnNlcnZlciBzdGFydHMgb24gPGh0bWw+IGlmCiAgLy8gdGhlIHNjb3BlZCBjb250YWluZXIgaXNuJ3QgaW4gdGhlIERPTSB5ZXQsIHRoZW4gInByb21vdGVzIiBpdHNlbGYKICAvLyB0byB0aGUgc21hbGxlciBzdWJ0cmVlIGFzIHNvb24gYXMgaXQgYXBwZWFycyDigJQgbWluaW1pc2luZyBjaHVybi4KICAvLwogIC8vIFJlc2lsaWVuY2UgdG8gaG9zdCByZWRlc2lnbnM6IGlmIHRoZSBpbmplY3RvciBrZWVwcyByZXR1cm5pbmcgZmFsc2UKICAvLyBmb3IgYE5BVElWRV9GQUxMQkFDS19NU2AgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIHdlIGRpc2Nvbm5lY3QgdGhlCiAgLy8gb2JzZXJ2ZXIgYW5kIGluc3RhbGwgdGhlIGdlbmVyaWMgb3ZlcmxheSBwaWxsIGluc3RlYWQg4oCUIHNvIHVzZXJzCiAgLy8gYWx3YXlzIGdldCAqc29tZSogUGlQIGNvbnRyb2wgZXZlbiBpZiBZb3VUdWJlIC8gVHdpdGNoIC8gTmV0ZmxpeAogIC8vIGNoYW5nZXMgaXRzIERPTSBpbiBhIHdheSB0aGF0IGJyZWFrcyBvdXIgc2VsZWN0b3JzLiBUaGUgZmFsbGJhY2sgaXMKICAvLyBhcm1lZCBvbmx5IG9uY2UgcGVyIHZpZGVvIGFuZCBvbmx5IHRyaWdnZXJzIGlmIHRoZSBpbmplY3RvciBoYXMKICAvLyAqbmV2ZXIqIHN1Y2NlZWRlZDsgaW50ZXJtaXR0ZW50IGZhaWx1cmVzIGR1cmluZyBhIHJlLW1vdW50IGRvbid0CiAgLy8gY291bnQuCiAgZnVuY3Rpb24gdHJ5TmF0aXZlKHZpZGVvLCBpbmplY3Rvciwgc2NvcGVTZWxlY3RvciwgdGVhcmRvd25zKSB7CiAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGxldCBldmVyU3VjY2VlZGVkID0gISFpbmplY3Rvcih2aWRlbyk7CiAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgICBsZXQgZmVsbEJhY2sgPSBmYWxzZTsKICAgIC8vIEFsd2F5cyBvYnNlcnZlIGF0IGRvY3VtZW50IGxldmVsLiBXZSB0cmllZCBwcm9tb3RpbmcgdG8gYSBzY29wZWQKICAgIC8vIHN1YnRyZWUgKGFuZCB0byB0aGUgc2NvcGVkIHRhcmdldCdzIHBhcmVudCkgZm9yIGxvd2VyIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIGJ1dCBOZXRmbGl4IHJlLW1vdW50cyB3aG9sZSBwbGF5ZXIgc3VidHJlZXMgb24gdmlzaWJpbGl0eQogICAgLy8gY2hhbmdlcyDigJQgbGVhdmluZyBhbnkgbmFycm93ZXIgb2JzZXJ2ZXIgYXR0YWNoZWQgdG8gYSBkZXRhY2hlZAogICAgLy8gbm9kZSwgd2l0aCBubyB3YXkgdG8gZGV0ZWN0IGRldGFjaG1lbnQgYmVjYXVzZSBubyBtdXRhdGlvbnMgZmlyZQogICAgLy8gb24gdGhlIGRldGFjaGVkIG5vZGUuIFRoZSByQUYtY29hbGVzY2VkIGNhbGxiYWNrIGJlbG93IGNhcHMgd29yawogICAgLy8gYXQgb25lIGluamVjdG9yIGNhbGwgcGVyIGFuaW1hdGlvbiBmcmFtZSByZWdhcmRsZXNzIG9mIG11dGF0aW9uCiAgICAvLyB2b2x1bWUsIHNvIGRvY3VtZW50LWxldmVsIG9ic2VydmF0aW9uIHN0YXlzIGJvdW5kZWQuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgIGlmIChzY2hlZHVsZWQgfHwgZmVsbEJhY2spIHJldHVybjsKICAgICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICBpZiAoZmVsbEJhY2spIHJldHVybjsKICAgICAgICBpZiAoaW5qZWN0b3IodmlkZW8pKSB7CiAgICAgICAgICBldmVyU3VjY2VlZGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFldmVyU3VjY2VlZGVkICYmCiAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCA+PSBDT05GSUcuTkFUSVZFX0ZBTExCQUNLX01TKSB7CiAgICAgICAgICBmZWxsQmFjayA9IHRydWU7CiAgICAgICAgICBvYnMuZGlzY29ubmVjdCgpOwogICAgICAgICAgd2FybigibmF0aXZlIGluamVjdGlvbiB1bmF2YWlsYWJsZSBvbiAiICsgbG9jYXRpb24uaG9zdG5hbWUgKwogICAgICAgICAgICAgICAiOyBmYWxsaW5nIGJhY2sgdG8gZ2VuZXJpYyBwaWxsIik7CiAgICAgICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIG9icy5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICBpZiAodGVhcmRvd25zKSB0ZWFyZG93bnMucHVzaCgoKSA9PiBvYnMuZGlzY29ubmVjdCgpKTsKICB9CgogIC8vIERlY2lkZXMgd2hpY2ggVUkgdG8gYWRkIGZvciBhIGdpdmVuIHZpZGVvIGFuZCB3aXJlcyBpdCB1cC4gQ2FsbGVkCiAgLy8gZXhhY3RseSBvbmNlIHBlciB2aWRlbyBieSBgYXR0YWNoVG9WaWRlb2AuIFRoZSBgdGVhcmRvd25zYCBhcnJheSBpcwogIC8vIHBvcHVsYXRlZCB3aXRoIGNsZWFudXAgY2xvc3VyZXMgdGhhdCB0aGUgZGlzY292ZXJ5IG9ic2VydmVyJ3MKICAvLyByZW1vdmVkLW5vZGVzIHBhdGggd2lsbCBydW4uCiAgZnVuY3Rpb24gYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpIHsKICAgIC8vIEdlbmVyaWMgb3ZlcmxheSBpcyB0aGUgZGVmYXVsdC4gU2V0IGxvY2FsU3RvcmFnZS51c2VnZW5lcmljX3BpcD0iMCIKICAgIC8vIChvciBmYWxzZS9uby9vZmYpIHBlci1vcmlnaW4gdG8gb3B0IGJhY2sgaW50byBuYXRpdmUgaW5qZWN0aW9uLgogICAgaWYgKGdlbmVyaWNQaXBGb3JjZWRDYWNoZWQoKSkgewogICAgICBhZGRPdmVybGF5QnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwogICAgICBsb2coImluamVjdGVkIG92ZXJsYXkiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGhvc3QgPSBsb2NhdGlvbi5ob3N0bmFtZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTkFUSVZFX1NJVEVTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHNpdGUgPSBOQVRJVkVfU0lURVNbaV07CiAgICAgIGlmIChzaXRlLm1hdGNoKGhvc3QpKSB7CiAgICAgICAgdHJ5TmF0aXZlKHZpZGVvLCBzaXRlLmluamVjdCwgc2l0ZS5zY29wZSwgdGVhcmRvd25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAvLyBVbnJlY29nbmlzZWQgc2l0ZSAoYW5kIHVzZXIgb3B0ZWQgb3V0IG9mIGdlbmVyaWMgdmlhIGxvY2FsU3RvcmFnZSk6CiAgICAvLyBzdGlsbCBpbnN0YWxsIHRoZSBvdmVybGF5IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyBuYXRpdmUgdG8gYW5jaG9yIHRvLgogICAgYWRkT3ZlcmxheUJ1dHRvbih2aWRlbywgdGVhcmRvd25zKTsKICAgIGxvZygiaW5qZWN0ZWQgb3ZlcmxheSIpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGVyLXZpZGVvIHNldHVwICsgdGVhcmRvd24KICAvLwogIC8vIFJ1bnMgb25jZSBwZXIgPHZpZGVvPiBlbGVtZW50LiBUaGUgYHRlYXJkb3duc2AgYXJyYXkgaXMgdGhlIHNpbmdsZQogIC8vIHBsYWNlIGV2ZXJ5IGxpc3RlbmVyIC8gb2JzZXJ2ZXIgLyBET00gbm9kZSB3ZSBhZGQgZm9yIHRoaXMgdmlkZW8gaXMKICAvLyByZWNvcmRlZDsgdGhlIGRpc2NvdmVyeSBvYnNlcnZlciBiZWxvdyBjYWxscyB0aGVtIHdoZW4gdGhlIHZpZGVvIGlzCiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBET00sIHNvIHRoZSBzY3JpcHQgZG9lc24ndCBsZWFrIG9uIGxvbmctbGl2ZWQgU1BBCiAgLy8gcGFnZXMgd2l0aCBpbmZpbml0ZSBzY3JvbGwuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gYXR0YWNoVG9WaWRlbyh2aWRlbykgewogICAgaWYgKHZpZGVvQ2xlYW51cHMuaGFzKHZpZGVvKSkgcmV0dXJuOwoKICAgIC8vIFNvbWUgc2l0ZXMgKE5ldGZsaXgsIGNlcnRhaW4gRFJNIHBsYXllcnMpIGV4cGxpY2l0bHkgZGlzYWJsZSBQaVAuCiAgICAvLyBDbGVhciBpdCBub3cgYW5kIHdhdGNoIChiZWxvdykgZm9yIHRoZSBwYWdlIHJlLXNldHRpbmcgaXQuCiAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgdmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgPSBmYWxzZTsKICAgICAgdmlkZW8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScpOwogICAgfQogICAgLy8gV2lyZSBhdXRvbWF0aWMtUGlQIGludGVudCAoYnJvd3NlcnMgd2l0aCBhdXRvLVBpUCBmZWF0dXJlLCBlLmcuCiAgICAvLyBDaHJvbWUgZmxhZywgZmlyZSB0aGlzIG9uIHRhYiBzd2l0Y2gpLiBUaGUgaGFuZGxlciBpcyBnbG9iYWwgcGVyCiAgICAvLyBkb2N1bWVudCDigJQgbGFzdCByZWdpc3RyYXRpb24gd2lucyDigJQgc28gb24gcGFnZXMgd2l0aCBtdWx0aXBsZQogICAgLy8gPHZpZGVvPiBlbGVtZW50cyAoWW91VHViZSB3YXRjaDogbWFpbiBwbGF5ZXIgKyBob3Zlci10aHVtYm5haWwKICAgIC8vIHByZXZpZXdzICsgYWQgcHJlLXJvbGwpIHRoZSAqbGFzdCogbW91bnRlZCB2aWRlbyB3b3VsZCBiZSBQaVAnZCwKICAgIC8vIHdoaWNoIGlzIGZyZXF1ZW50bHkgYSBoaWRkZW4vZW1wdHkgcHJldmlldyDihpIgYmxhY2sgUGlQIHdpbmRvdwogICAgLy8gd2l0aCBubyBjb250cm9scyBhbmQgYSBkZXN5bmNlZCBkdXJhdGlvbi4KICAgIC8vIFBpY2sgdGhlIG1vc3QgcGxhdXNpYmxlICJhY3RpdmUiIHZpZGVvIGF0IGZpcmUgdGltZSBpbnN0ZWFkOgogICAgLy8gdGhlIG9uZSBjdXJyZW50bHkgaW4gUGlQICh0b2dnbGluZyBvdXQpLCBlbHNlIHRoZSBsYXJnZXN0IHBsYXlpbmcKICAgIC8vIHZpZGVvLCBlbHNlIHRoZSBsYXJnZXN0IHZpZGVvIHdpdGggbWV0YWRhdGEuIE5vLW9wIG9uIGJyb3dzZXJzCiAgICAvLyB0aGF0IGRvbid0IHN1cHBvcnQgaXQ7IHRoZSB0cnkvY2F0Y2ggZ3VhcmRzIGlPUyAvIG9sZGVyIGJyb3dzZXJzLgogICAgdHJ5IHsKICAgICAgbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKCJlbnRlcnBpY3R1cmVpbnBpY3R1cmUiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgdiA9IHBpY2tBdXRvUGlwVGFyZ2V0KCkgfHwgdmlkZW87CiAgICAgICAgdHJ5IHsgYXdhaXQgdi5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpOyB9IGNhdGNoIChlKSB7IHdhcm4oImF1dG8tUGlQIGZhaWxlZDoiLCBlLm1lc3NhZ2UgfHwgZSk7IH0KICAgICAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciAqLyB9CgogICAgY29uc3QgdGVhcmRvd25zID0gW107CgogICAgYWRkUGlwQnV0dG9uKHZpZGVvLCB0ZWFyZG93bnMpOwoKICAgIC8vIE9ubHkgcmVzdW1lIG9uIGVudGVyaW5nIFBpUCBpZiB0aGUgdmlkZW8gd2FzIGFjdHVhbGx5IHBsYXlpbmcgd2hlbgogICAgLy8gdGhlIHRyYW5zaXRpb24gZmlyZWQuIFRoZSBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGB2aWRlby5wbGF5KClgCiAgICAvLyBvdmVycm9kZSB1c2VyLWluaXRpYXRlZCBwYXVzZXMgKGUuZy4gWW91VHViZSBhdXRvLVBpUCBvbiB0YWItc3dpdGNoCiAgICAvLyB3b3VsZCB1bi1wYXVzZSBhIHBhdXNlZCB2aWRlbykuIENhcHR1cmUgc3RhdGUgYXQgaGFuZGxlciBhdHRhY2gKICAgIC8vIHRpbWUgYW5kIHJlZnJlc2ggb24gcGxheS9wYXVzZSBldmVudHMuCiAgICBsZXQgd2FzUGxheWluZyA9ICF2aWRlby5wYXVzZWQgJiYgIXZpZGVvLmVuZGVkOwogICAgY29uc3Qgb25QbGF5U3RhdGUgPSAoKSA9PiB7IHdhc1BsYXlpbmcgPSAhdmlkZW8ucGF1c2VkICYmICF2aWRlby5lbmRlZDsgfTsKICAgIGNvbnN0IFBMQVlfRVZFTlRTID0gWyJwbGF5IiwgInBsYXlpbmciLCAicGF1c2UiLCAiZW5kZWQiXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUExBWV9FVkVOVFMubGVuZ3RoOyBpKyspIHsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgfQogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFBMQVlfRVZFTlRTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihQTEFZX0VWRU5UU1tpXSwgb25QbGF5U3RhdGUpOwogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCBvbkVudGVyUGlwID0gKCkgPT4gewogICAgICBpZiAoIXdhc1BsYXlpbmcpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh3YXNQbGF5aW5nICYmIHZpZGVvLnBhdXNlZCkgdmlkZW8ucGxheSgpOyB9LCAyNTApOwogICAgfTsKICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImVudGVycGljdHVyZWlucGljdHVyZSIsIG9uRW50ZXJQaXApOwogICAgdGVhcmRvd25zLnB1c2goKCkgPT4gdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW50ZXJwaWN0dXJlaW5waWN0dXJlIiwgb25FbnRlclBpcCkpOwoKICAgIC8vIFdhdGNoIGZvciBzaXRlcyAoZS5nLiBOZXRmbGl4KSByZS1hZGRpbmcgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUuCiAgICBjb25zdCBkcGlwT2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICBpZiAodmlkZW8uZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpIHsKICAgICAgICB2aWRlby5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IGZhbHNlOwogICAgICAgIHZpZGVvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnKTsKICAgICAgfQogICAgfSk7CiAgICBkcGlwT2JzLm9ic2VydmUodmlkZW8sIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJ10gfSk7CiAgICB0ZWFyZG93bnMucHVzaCgoKSA9PiBkcGlwT2JzLmRpc2Nvbm5lY3QoKSk7CgogICAgdmlkZW9DbGVhbnVwcy5zZXQodmlkZW8sICgpID0+IHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZWFyZG93bnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgeyB0ZWFyZG93bnNbaV0oKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSBpbmRpdmlkdWFsIHRlYXJkb3duIGVycm9ycyAqLyB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG9wLWxldmVsIHNldHVwICsgZGlzY292ZXJ5IG9ic2VydmVyCiAgLy8KICAvLyBPbmUgcGVyc2lzdGVudCBNdXRhdGlvbk9ic2VydmVyIHRyYWNrcyA8dmlkZW8+IGVsZW1lbnRzIGJlaW5nIGFkZGVkCiAgLy8gdG8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSBvdmVyIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEFkZCDihpIgd2lyZSB1cC4KICAvLyBSZW1vdmUg4oaSIHJ1biB0aGUgcmVnaXN0ZXJlZCB0ZWFyZG93biBjbG9zdXJlIGZvciB0aGF0IHZpZGVvLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUoKSB7CiAgICAvLyBBdHRhY2ggdG8gZXZlcnkgPHZpZGVvPiBjdXJyZW50bHkgb24gdGhlIHBhZ2UuCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpLmZvckVhY2goYXR0YWNoVG9WaWRlbyk7CgogICAgLy8gS2VlcCB3YXRjaGluZyBmb3IgdmlkZW9zIGFkZGVkIGxhdGVyIChsYXp5LWxvYWRlZCBmZWVkcywgU1BBIHJvdXRlCiAgICAvLyBjaGFuZ2VzLCBlbWJlZGRlZCBwbGF5ZXJzIHRoYXQgbW91bnQgYWZ0ZXIgZmlyc3QgcGFpbnQsIGV0Yy4pLgogICAgLy8gSW5kZXhlZCBsb29wcyArIG5vZGVUeXBlIGNoZWNrIGFyZSBmcmllbmRsaWVyIHRvIFY4J3MgaW5saW5lCiAgICAvLyBjYWNoZXMgdGhhbiBmb3Itb2YgKyBpbnN0YW5jZW9mIG9uIGhvdCBET00tbXV0YXRpb24gcGF0aHMuCiAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihfb25Eb21NdXRhdGlvbnMpOwogICAgb2JzLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIF9ydW5DbGVhbnVwKHZpZGVvKSB7CiAgICBjb25zdCBmbiA9IHZpZGVvQ2xlYW51cHMuZ2V0KHZpZGVvKTsKICAgIGlmICghZm4pIHJldHVybjsKICAgIHZpZGVvQ2xlYW51cHMuZGVsZXRlKHZpZGVvKTsKICAgIHRyeSB7IGZuKCk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgZnVuY3Rpb24gX29uRG9tTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7CiAgICAgIGNvbnN0IG11ID0gbXV0YXRpb25zW2ldOwoKICAgICAgY29uc3QgYWRkZWQgPSBtdS5hZGRlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgYWxlbiA9IGFkZGVkLmxlbmd0aDsgaiA8IGFsZW47IGorKykgewogICAgICAgIGNvbnN0IG5vZGUgPSBhZGRlZFtqXTsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgY29udGludWU7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICJWSURFTyIpIHsKICAgICAgICAgIGF0dGFjaFRvVmlkZW8obm9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7CiAgICAgICAgICBjb25zdCB2aWRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCB2bGVuID0gdmlkcy5sZW5ndGg7IGsgPCB2bGVuOyBrKyspIGF0dGFjaFRvVmlkZW8odmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdCByZW1vdmVkID0gbXUucmVtb3ZlZE5vZGVzOwogICAgICBmb3IgKGxldCBqID0gMCwgcmxlbiA9IHJlbW92ZWQubGVuZ3RoOyBqIDwgcmxlbjsgaisrKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IHJlbW92ZWRbal07CiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIGNvbnRpbnVlOwogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAiVklERU8iKSB7CiAgICAgICAgICBfcnVuQ2xlYW51cChub2RlKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKICAgICAgICAgIGNvbnN0IHZpZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpOwogICAgICAgICAgZm9yIChsZXQgayA9IDAsIHZsZW4gPSB2aWRzLmxlbmd0aDsgayA8IHZsZW47IGsrKykgX3J1bkNsZWFudXAodmlkc1trXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBCb290CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIEJhaWwgb3V0IGVhcmx5IG9uIGJyb3dzZXJzIHdpdGggbm8gUGlQIEFQSSBhdCBhbGwgKGV4dHJlbWVseSBvbGQgb3IKICAvLyBleG90aWMpLiBBdm9pZHMgcmVnaXN0ZXJpbmcgbGlzdGVuZXJzIHdlJ2QgbmV2ZXIgdXNlLgogIGlmICghUElQX1NVUFBPUlRFRCkgcmV0dXJuOwoKICAvLyBTY29wZTogb25seSBydW4gaW4gdGhlIHRvcC1sZXZlbCBmcmFtZS4gRW1iZWRkZWQgcGxheWVycyAoZS5nLgogIC8vIHd3dy55b3V0dWJlLmNvbS9lbWJlZC88aWQ+IGlmcmFtZXMgaW5zaWRlIHRoaXJkLXBhcnR5IHBhZ2VzKSBnZXQKICAvLyBuZWl0aGVyIG5hdGl2ZSBpbmplY3Rpb24gbm9yIHRoZSBnZW5lcmljLXBpbGwgZmFsbGJhY2sg4oCUIHRoZSBob3N0CiAgLy8gc2l0ZSBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBQaVAgVVggaW5zaWRlIGlmcmFtZXMuIFRoaXMga2VlcHMKICAvLyB0aGUgc2NyaXB0IGZvY3VzZWQgb24gY2Fub25pY2FsIGRlc2t0b3Agc2Vzc2lvbnMgYW5kIGF2b2lkcwogIC8vIGRvdWJsZS1pbmplY3Rpb24gd2hlbiBib3RoIHRoZSBwYXJlbnQgZnJhbWUgYW5kIHRoZSBlbWJlZCBtYXRjaAogIC8vIGEgdXNlcidzIGZpbHRlciBydWxlLgogIHRyeSB7IGlmICh3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZikgcmV0dXJuOyB9IGNhdGNoIChlKSB7IHJldHVybjsgfQoKICAvLyBQZXItb3JpZ2luIG9wdC1vdXQ6IGlmIHRoZSB1c2VyIHByZXZpb3VzbHkgc2VsZWN0ZWQgIkRpc2FibGUgUGlQIGljb24KICAvLyBvbiA8c2l0ZT4iIGZyb20gdGhlIHJpZ2h0LWNsaWNrIG1lbnUsIHRoaXMgZmxhZyBwZXJzaXN0cyBpbgogIC8vIGxvY2FsU3RvcmFnZS4gQmFpbCBiZWZvcmUgYW55IHNldHVwIHNvIHRoZSBzY3JpcHQgaXMgYSB0cnVlIG5vLW9wCiAgLy8gZm9yIHRoYXQgb3JpZ2luIOKAlCBubyBvYnNlcnZlcnMsIG5vIGxpc3RlbmVycywgbm8gd29yay4gT3RoZXIKICAvLyBvcmlnaW5zIGFyZSB1bmFmZmVjdGVkIGJlY2F1c2UgbG9jYWxTdG9yYWdlIGlzIHBhcnRpdGlvbmVkIHBlci1vcmlnaW4uCiAgLy8gV2UgYWxzbyBzZWVkIHRoZSBjYWNoZWQgYF9zaXRlRGlzYWJsZWRgIGZsYWcgaGVyZSAoaXJyZWxldmFudCBpZiB3ZQogIC8vIHJldHVybiwgYnV0IGtlZXBzIHRoZSBjYWNoZSBsaXZlIGluIHRoZSBub3QteWV0LWRpc2FibGVkIGNhc2UpLgogIF9zaXRlRGlzYWJsZWQgPSByZWFkU2l0ZURpc2FibGVkKCk7CiAgaWYgKF9zaXRlRGlzYWJsZWQpIHJldHVybjsKCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCiAgICAgIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgc2V0dXBBdXRvUGljdHVyZUluUGljdHVyZSgpOwogIH0KfSkoKTs="},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUKCmNvbnN0IHNwb29mQnJhbmRzID0gKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgaWYgKGl0ZW0/LmJyYW5kPy50b0xvd2VyQ2FzZSgpID09PSAnYnJhdmUnKSB7CiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGJyYW5kOiAnR29vZ2xlIENocm9tZScgfTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0pOwp9OwoKY29uc3Qgb3JpZ2luYWxCcmFuZHMgPSBuYXZpZ2F0b3I/LnVzZXJBZ2VudERhdGE/LmJyYW5kczsKaWYgKG9yaWdpbmFsQnJhbmRzKSB7CiAgY29uc3Qgc3Bvb2ZlZEJyYW5kcyA9IHNwb29mQnJhbmRzKG9yaWdpbmFsQnJhbmRzKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF2aWdhdG9yVUFEYXRhLnByb3RvdHlwZSwgJ2JyYW5kcycsIHsKICAgIHZhbHVlOiBzcG9vZmVkQnJhbmRzCiAgfSk7Cn0KCmNvbnN0IG9yaWdpbmFsR2V0SGlnaEVudHJvcHlWYWx1ZXMgPQogIE5hdmlnYXRvclVBRGF0YT8ucHJvdG90eXBlPy5nZXRIaWdoRW50cm9weVZhbHVlczsKCmlmIChvcmlnaW5hbEdldEhpZ2hFbnRyb3B5VmFsdWVzKSB7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdmlnYXRvclVBRGF0YS5wcm90b3R5cGUsICdnZXRIaWdoRW50cm9weVZhbHVlcycsIHsKICAgIHZhbHVlOiBhc3luYyBmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcyhoaW50cykgewogICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgb3JpZ2luYWxHZXRIaWdoRW50cm9weVZhbHVlcy5jYWxsKAogICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnREYXRhLAogICAgICAgIGhpbnRzCiAgICAgICk7CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdHMpKSB7CiAgICAgICAgaWYgKGtleSA9PT0gJ2JyYW5kcycgfHwga2V5ID09PSAnZnVsbFZlcnNpb25MaXN0JykgewogICAgICAgICAgcmVzdWx0c1trZXldID0gc3Bvb2ZCcmFuZHMocmVzdWx0c1trZXldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfSk7Cn0KCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICBOYXZpZ2F0b3JVQURhdGEucHJvdG90eXBlLmdldEhpZ2hFbnRyb3B5VmFsdWVzLCAndG9TdHJpbmcnLCB7CiAgdmFsdWU6ICgpID0+ICdmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcygpIHsgW25hdGl2ZSBjb2RlXSB9Jwp9KTsK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play-update.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXktdXBkYXRlLmpzCi8vIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpIHsKICBjb25zdCBob3N0ID0gbG9jYXRpb24uaG9zdG5hbWU7CiAgY29uc3QgSVNfWU9VVFVCRSA9IC8oPzpefC4rXC4peW91dHViZSg/Oi1ub2Nvb2tpZSk/XC5jb20kLy50ZXN0KGhvc3QpOwogIGNvbnN0IElTX1ZJTUVPID0gLyg/Ol58LitcLil2aW1lb1wuY29tJC8udGVzdChob3N0KTsKCiAgLy8gUGFnZSBWaXNpYmlsaXR5IEFQSQogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnaGlkZGVuJywgewogICAgICBnZXQoKSB7IHJldHVybiBmYWxzZTsgfSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgZ2V0KCkgeyByZXR1cm4gJ3Zpc2libGUnOyB9LAogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnb252aXNpYmlsaXR5Y2hhbmdlJywgewogICAgICBnZXQoKSB7IHJldHVybiBudWxsOyB9LAogICAgICBzZXQoKSB7fSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gQmxvY2sgZXZlbnQgZGVsaXZlcnkgKGNhcHR1cmU9dHJ1ZSB0byBpbnRlcmNlcHQgZWFybHkpCiAgY29uc3Qgc3RvcCA9IChlKSA9PiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogIGNvbnN0IElTX0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8CiAgICAgICAgICAgICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICB0cnkgewogICAgLy8gU2tpcCB2aXNpYmlsaXR5Y2hhbmdlIGJsb2NraW5nIG9uIGlPUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1lZGlhIGJhY2tncm91bmRpbmcKICAgIGlmICghSVNfSU9TKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBzdG9wLCB0cnVlKTsKICAgIH0KICB9IGNhdGNoIChlKSB7fQoKICAvLyBGdWxsc2NyZWVuIEFQSSAoVmltZW8pCiAgaWYgKElTX1ZJTUVPKSB7CiAgICB0cnkgewogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHN0b3AsIHRydWUpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIC8vIFlvdVR1YmUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzCiAgaWYgKElTX1lPVVRVQkUpIHsKICAgIC8vIFVzZXIgYWN0aXZpdHkgdHJhY2tpbmcKICAgIGNvbnN0IExBQ1RfUkVGUkVTSCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWluCiAgICB3YWl0Rm9yTGFjdCgoKSA9PiByZWZyZXNoTGFjdCgpLCBMQUNUX1JFRlJFU0gpOwoKICAgIGZ1bmN0aW9uIGdldFZpZGVvKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigneXRkLXBsYXllciB2aWRlbywgI21vdmllX3BsYXllciB2aWRlbywgdmlkZW8nKTsKICAgIH0KCiAgICBsZXQgbGFzdFVzZXJJbnB1dCA9IDA7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CgogICAgLy8gTWVkaWEga2V5cyBnbyB0aHJvdWdoIE1lZGlhU2Vzc2lvbiwgbm90IGtleWRvd24uIFBhdGNoIHRoZSBwcm90b3R5cGUKICAgIC8vIHNvIHBhdXNlL3BsYXkgaGFuZGxlcnMgdXBkYXRlIGxhc3RVc2VySW5wdXQuCiAgICB0cnkgewogICAgICBjb25zdCBvcmlnU2V0ID0gTWVkaWFTZXNzaW9uLnByb3RvdHlwZS5zZXRBY3Rpb25IYW5kbGVyOwogICAgICBNZWRpYVNlc3Npb24ucHJvdG90eXBlLnNldEFjdGlvbkhhbmRsZXIgPSBmdW5jdGlvbihhY3QsIGgpIHsKICAgICAgICByZXR1cm4gb3JpZ1NldC5jYWxsKHRoaXMsIGFjdCwgKGFjdCAhPT0gJ3BhdXNlJyAmJiBhY3QgIT09ICdwbGF5JykgPyBoIDogZnVuY3Rpb24oLi4uYSkgewogICAgICAgICAgbGFzdFVzZXJJbnB1dCA9IERhdGUubm93KCk7CiAgICAgICAgICBpZiAodHlwZW9mIGggPT09ICdmdW5jdGlvbicpIHJldHVybiBoLmFwcGx5KHRoaXMsIGEpOwogICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICBpZiAodikgYWN0ID09PSAncGF1c2UnID8gdi5wYXVzZSgpIDogdi5wbGF5KCkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBbJ3BhdXNlJywgJ3BsYXknXS5mb3JFYWNoKGEgPT4gbmF2aWdhdG9yLm1lZGlhU2Vzc2lvbi5zZXRBY3Rpb25IYW5kbGVyKGEsIG51bGwpKTsKICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgZnVuY3Rpb24gb25WaWRlb05hdmlnYXRpb24oKSB7CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICAgIGlmIChJU19JT1MpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkZW8gPSBnZXRWaWRlbygpOwogICAgICAgIGlmICghdmlkZW8pIHJldHVybjsKICAgICAgICBpZiAodmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlcikgewogICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB2aWRlby5fYmdQbGF5UGF1c2VIYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHsKICAgICAgICAgIC8vIElmIHVzZXIgY2xpY2tlZCBvciBwcmVzc2VkIGEga2V5IHdpdGhpbiAzcyBiZWZvcmUgdGhlIHBhdXNlLCBpdCdzIGludGVudGlvbmFsCiAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RVc2VySW5wdXQgPCAzMDAwKSByZXR1cm47CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICAgIGlmICh2ICYmIHYucGF1c2VkICYmICF2LmVuZGVkICYmIHYucmVhZHlTdGF0ZSA+PSAyKSB2LnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICB9LCA4MDApOwogICAgICAgIH07CiAgICAgICAgdmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlciA9IGhhbmRsZXI7CiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVyKTsKICAgICAgfSwgMTUwMCk7CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3l0LW5hdmlnYXRlLWZpbmlzaCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1wYWdlLWRhdGEtdXBkYXRlZCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKCiAgICAvLyBTaW11bGF0ZSB1c2VyIGludGVyYWN0aW9uIHRvIHByZXZlbnQgIkFyZSB5b3Ugc3RpbGwgd2F0Y2hpbmc/IgogICAgY29uc3QgSU5URVJBQ1RJT05fSU5URVJWQUwgPSAxMCAqIDYwICogMTAwMDsgLy8gMTAgbWluCiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgaWYgKHBsYXllcikgewogICAgICAgIHBsYXllci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW1vdmUnLCB7IGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICB9CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICB9LCBJTlRFUkFDVElPTl9JTlRFUlZBTCk7CgogICAgLy8gS2VlcCBwbGF5ZXIgc3RhdGUgdXBkYXRlZAogICAgY29uc3QgUExBWUVSX1NUQVRFX0lOVEVSVkFMID0gNjAgKiAxMDAwOyAvLyAxIG1pbgogICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBjb25zdCB2aWRlbyA9IGdldFZpZGVvKCk7CiAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8ucGF1c2VkKSB7CiAgICAgICAgdmlkZW8uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3RpbWV1cGRhdGUnKSk7CiAgICAgIH0KICAgIH0sIFBMQVlFUl9TVEFURV9JTlRFUlZBTCk7CiAgfQoKICBmdW5jdGlvbiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIGRlbGF5ID0gMTAwMCkgewogICAgY29uc3QgbWF4RGVsYXkgPSA2MCAqIDEwMDA7IC8vIGNhcCBhdCA2MHMKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCAnX2xhY3QnKSkgewogICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dCgKICAgICAgICAoKSA9PiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIE1hdGgubWluKGRlbGF5ICogMiwgbWF4RGVsYXkpKSwKICAgICAgICBkZWxheQogICAgICApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaExhY3QoKSB7CiAgICB0cnkgewogICAgICBpZiAod2luZG93Ll9sYWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"brave-yt-sabr-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gWW91VHViZSdzIFNBQlIgKFNlcnZlciBBZGFwdGl2ZSBCaXRyYXRlKSBwcm90b2NvbCBzZW5kcyBhIGJhY2tvZmZUaW1lTXMKLy8gdmFsdWUgdGVsbGluZyB0aGUgcGxheWVyIHRvIHdhaXQgYmVmb3JlIHJlcXVlc3RpbmcgdmlkZW8gZGF0YS4gVGhpcwovLyBjb3ZlcnMgdGhlIGFkIHNsb3QgZHVyYXRpb24uIFdpdGhvdXQgYW4gYWRibG9ja2VyIHRoZSBhZCBmaWxscyB0aGUgd2FpdCwKLy8gc28gdGhlIHVzZXIgbmV2ZXIgbm90aWNlcy4gV2l0aCBhbiBhZGJsb2NrZXIsIHRoZSBhZCBpcyBibG9ja2VkIGJ1dCB0aGUKLy8gYmFja29mZiByZW1haW5zLCBjYXVzaW5nIGEgNC0xNiBzZWNvbmQgc3Bpbm5lci4KLy8gRnJvbTogaHR0cHM6Ly9pdGVyLmNhL3Bvc3QveXQtYWRibG9jay8KLy8KLy8gVHdvLXByb25nZWQgZml4OgovLwovLyAxLiBGcmVzaCBhZC1mcmVlIHNlc3Npb246IFdoZW4gUHJvbmcgMiBkZXRlY3RzIGEgcmVhbCBiYWNrb2ZmLCBzZXQKLy8gICAgaXNJbmxpbmVQbGF5YmFja05vQWQgb24gdGhlIHBsYXllcidzIHZpZGVvIGRhdGEgKHRlbGxpbmcgaXQgdGhlcmUncyBubwovLyAgICBhZCBzbG90KSwgdGhlbiBjYWxsIGNhbmNlbFBsYXliYWNrKCkgKyBsb2FkVmlkZW9CeUlkKCkgdG8gZm9yY2UgYSBuZXcKLy8gICAgU0FCUiBzZXNzaW9uLiBHdWFyZGVkIHBlciB2aWRlbyBhbmQgb25seSBiZWZvcmUgcGxheWJhY2sgc3RhcnRzLCBzbwovLyAgICBuby1hZCB2aWRlb3MgYW5kIG1pZC1wbGF5YmFjayBwYWNpbmcgYmFja29mZnMgYXJlIGxlZnQgYWxvbmUuCi8vCi8vIDIuIFNBQlIgcmVzcG9uc2UgcGF0Y2hpbmcgKGZ1bGwgcGFnZSBsb2Fkcyk6IEludGVyY2VwdCBTQUJSIHN0cmVhbWluZwovLyAgICByZXNwb25zZXMgYW5kIHJld3JpdGUgYmFja29mZlRpbWVNcyBpbiB0aGUgcHJvdG9idWYuIFRoaXMgaGFuZGxlcwovLyAgICBwYWdlIHJlbG9hZHMgYW5kIGRpcmVjdCBuYXZpZ2F0aW9ucyB3aGVyZSB0aGUgU0FCUiBzZXNzaW9uIHdhcwovLyAgICBhbHJlYWR5IGVzdGFibGlzaGVkIGJlZm9yZSB0aGUgc2NyaXB0bGV0IGNvdWxkIGludGVydmVuZS4KLy8KLy8gVG8gdXNlIHRoaXMgc2NyaXB0bGV0OgovLyAxLiBHbyB0byBicmF2ZTovL3NldHRpbmdzL3NoaWVsZHMvZmlsdGVycwovLyAyLiBFbmFibGUgRGV2ZWxvcGVyIG1vZGUKLy8gMy4gQ2xpY2sgb24gY3JlYXRlIG5ldyBzY3JpcHRsZXQKLy8gNC4gQWRkIHRoaXMgY29udGVudCBhbmQgbmFtZSBpdCBgdXNlci15dC1zYWJyLWZpeC5qc2AKLy8gNS4gQWRkIGEgY3VzdG9tIGZpbHRlcjogYHd3dy55b3V0dWJlLmNvbSMjK2pzKHVzZXIteXQtc2Fici1maXguanMpYAovLyA2LiBHbyB0byBZb3VUdWJlIGFuZCB0ZXN0CgooZnVuY3Rpb24oKSB7CiAgICBjb25zdCBERUJVRyA9IGZhbHNlOwogICAgY29uc3QgTE9HX1BSRUZJWCA9ICdbeXQtc2Fici1maXhdJzsKICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7CiAgICBjb25zdCBlbGFwc2VkID0gKCkgPT4gKChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDApLnRvRml4ZWQoMikgKyAncyc7CiAgICBjb25zdCBsb2cgPSAoLi4uYXJncykgPT4geyBpZiAoREVCVUcpIGNvbnNvbGUubG9nKExPR19QUkVGSVgsIGVsYXBzZWQoKSwgLi4uYXJncyk7IH07CgogICAgLy8gUHJlbWl1bSBhY2NvdW50cyBoYXZlIG5vIGFkcyBhbmQgbm8gYmFja29mZiwgbm90aGluZyB0byBkby4KICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhI2xvZ29bdGl0bGUqPSJQcmVtaXVtIiBpXScpKSByZXR1cm47CgogICAgLy8gUHJvbmcgMTogRm9yY2UgYSBmcmVzaCBhZC1mcmVlIFNBQlIgc2Vzc2lvbiwgZHJpdmVuIGJ5IFByb25nIDIgd2hlbiBpdAogICAgLy8gc2VlcyBhIHJlYWwgYmFja29mZi4gU2V0IGlzSW5saW5lUGxheWJhY2tOb0FkIHNvIHRoZSBuZXcgc2Vzc2lvbiBnZXRzIG5vCiAgICAvLyBhZCBzbG90LCB0aGVuIHRlYXIgZG93biB0aGUgY3VycmVudCBzZXNzaW9uIGFuZCByZWxvYWQuIEd1YXJkZWQgcGVyIHZpZGVvCiAgICAvLyAob25lIHJlbG9hZCBlYWNoLCBzbyBhIHNlc3Npb24gdGhhdCBzdGlsbCBiYWNrcyBvZmYgZmFsbHMgYmFjayB0byBwYXRjaGluZwogICAgLy8gcmF0aGVyIHRoYW4gbG9vcGluZykgYW5kIHNraXBwZWQgb25jZSBwbGF5YmFjayBoYXMgc3RhcnRlZCDigJQgYSBuby1hZCB2aWRlbwogICAgLy8gaGFzIG5vIGJhY2tvZmYsIGFuZCBhIG1pZC1wbGF5YmFjayBiYWNrb2ZmIGlzIG5vcm1hbCBwYWNpbmcuCiAgICBsZXQgcmVsb2FkZWRWaWQgPSBudWxsOwogICAgZnVuY3Rpb24gZm9yY2VGcmVzaFNlc3Npb24oKSB7CiAgICAgICAgY29uc3QgdmlkID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndicpOwogICAgICAgIGlmICghdmlkIHx8IHZpZCA9PT0gcmVsb2FkZWRWaWQpIHJldHVybjsKICAgICAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CiAgICAgICAgaWYgKHZpZGVvICYmIHZpZGVvLmN1cnJlbnRUaW1lID4gMSkgcmV0dXJuOwogICAgICAgIHJlbG9hZGVkVmlkID0gdmlkOwogICAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgICBpZiAoIXBsYXllcj8uY2FuY2VsUGxheWJhY2sgfHwgIXBsYXllcj8ubG9hZFZpZGVvQnlJZCkgcmV0dXJuOwoKICAgICAgICAvLyBTZXQgdGhlIG5vLWFkIGZsYWcgYmVmb3JlIHJlbG9hZGluZyBzbyB0aGUgbmV3IHNlc3Npb24gcGlja3MgaXQgdXAKICAgICAgICBjb25zdCB2ZCA9IHBsYXllci5nZXRWaWRlb0RhdGE/LigpOwogICAgICAgIGlmICh2ZCkgdmQuaXNJbmxpbmVQbGF5YmFja05vQWQgPSB0cnVlOwoKICAgICAgICBwbGF5ZXIuY2FuY2VsUGxheWJhY2soKTsKICAgICAgICBwbGF5ZXIubG9hZFZpZGVvQnlJZCh2aWQpOwogICAgICAgIGxvZygnZm9yY2VkIGZyZXNoIGFkLWZyZWUgc2Vzc2lvbiBmb3InLCB2aWQpOwogICAgfQoKICAgIC8vIFByb25nIDI6IEludGVyY2VwdCBTQUJSIHJlc3BvbnNlcyBhbmQgcGF0Y2ggYmFja29mZlRpbWVNcy4KICAgIC8vIFRlZSB0aGUgYm9keSBzbyBtZWRpYSBjaHVua3MgKD49MTAwMCBieXRlcykgcGFzcyB0aHJvdWdoIHVudG91Y2hlZAogICAgLy8g4oCUIG9ubHkgdGhlIHNtYWxsIGNvbnRyb2wgbWVzc2FnZXMgY2FycnlpbmcgdGhlIGJhY2tvZmYgZmllbGQgZ2V0CiAgICAvLyBidWZmZXJlZCBhbmQgcmUtZW1pdHRlZCBhcyBhIHN5bnRoZXNpemVkIFJlc3BvbnNlLgogICAgY29uc3QgcmVhbEZldGNoID0gd2luZG93LmZldGNoOwoKICAgIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uKHJlc291cmNlLCBpbml0KSB7CiAgICAgICAgY29uc3QgdXJsID0gdHlwZW9mIHJlc291cmNlID09PSAnc3RyaW5nJyA/IHJlc291cmNlIDogKHJlc291cmNlPy51cmwgfHwgJycpOwoKICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdnb29nbGV2aWRlby5jb20nKSAmJiB1cmwuaW5jbHVkZXMoJ3NhYnI9MScpKSB7CiAgICAgICAgICAgIGxldCBybiA9ICcnOwogICAgICAgICAgICB0cnkgeyBybiA9IG5ldyBVUkwodXJsKS5zZWFyY2hQYXJhbXMuZ2V0KCdybicpIHx8ICcnOyB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgIGxvZygnU0FCUiBmZXRjaCBybj0nICsgcm4pOwoKICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgIXJlc3BvbnNlLmJvZHkpIHJldHVybiByZXNwb25zZTsKICAgICAgICAgICAgICAgIC8vIFRlZSBkZWZlbnNpdmVseTogaWYgaXQgdGhyb3dzIChsb2NrZWQgc3RyZWFtLCBicm93c2VyIHF1aXJrKSwKICAgICAgICAgICAgICAgIC8vIGhhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGJhY2sgdG8gYXZvaWQgYnJlYWtpbmcgdGhlIHZpZGVvIGVudGlyZWx5LgogICAgICAgICAgICAgICAgbGV0IHBhc3MsIHNjYW4sIHJlaW5pdDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgW3Bhc3MsIHNjYW5dID0gcmVzcG9uc2UuYm9keS50ZWUoKTsKICAgICAgICAgICAgICAgICAgICByZWluaXQgPSB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LCBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzIH07CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0oc2Nhbi5nZXRSZWFkZXIoKSwgMTAwMCkudGhlbihmdW5jdGlvbihieXRlcykgewogICAgICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1NBQlIgZG9uZSBybj0nICsgcm4pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHBhc3MsIHJlaW5pdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvZygnc21hbGwgcmVzcG9uc2Ugcm49JyArIHJuLCAnc2l6ZT0nICsgYnl0ZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAvLyBBIHJlYWwgYmFja29mZiBibG9ja3MgaW5pdGlhbCBwbGF5YmFjazsgZm9yY2UgYSBmcmVzaAogICAgICAgICAgICAgICAgICAgIC8vIGFkLWZyZWUgc2Vzc2lvbiAoZ3VhcmRlZCBwZXIgdmlkZW8sIHNraXBwZWQgbWlkLXBsYXliYWNrKS4KICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2hCYWNrb2ZmRmllbGQoYnl0ZXMsIHJuKSkgZm9yY2VGcmVzaFNlc3Npb24oKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBuZXcgUmVzcG9uc2UoYnl0ZXMsIHJlaW5pdCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG91dCwgJ3VybCcsIHsgdmFsdWU6IHJlc3BvbnNlLnVybCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlLnR5cGUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CgogICAgLy8gUmVhZCBhIHN0cmVhbSBpbnRvIGEgVWludDhBcnJheS4gSWYgZWFybHlFeGl0VGhyZXNob2xkIGlzIHNldCBhbmQgdGhlCiAgICAvLyBhY2N1bXVsYXRlZCBieXRlcyBjcm9zcyBpdCwgY2FuY2VsIHRoZSByZWFkZXIgYW5kIHJldHVybiBudWxsIOKAlCB1c2VkCiAgICAvLyB0byBiYWlsIG91dCBvZiBidWZmZXJpbmcgd2hlbiB0aGUgcmVzcG9uc2UgaXMgY2xlYXJseSBhIG1lZGlhIGNodW5rCiAgICAvLyBhbmQgc2hvdWxkIHN0cmVhbSBzdHJhaWdodCB0byB0aGUgcGxheWVyIGluc3RlYWQuCiAgICBmdW5jdGlvbiByZWFkU3RyZWFtKHJlYWRlciwgZWFybHlFeGl0VGhyZXNob2xkKSB7CiAgICAgICAgY29uc3QgY2h1bmtzID0gW107CiAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIHB1bXAocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgewogICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkodG90YWwpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBvZmYgKz0gY2h1bmtzW2ldLmxlbmd0aCwgaSsrKQogICAgICAgICAgICAgICAgICAgIG1lcmdlZC5zZXQoY2h1bmtzW2ldLCBvZmYpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaHVua3MucHVzaChyZXN1bHQudmFsdWUpOwogICAgICAgICAgICB0b3RhbCArPSByZXN1bHQudmFsdWUubGVuZ3RoOwogICAgICAgICAgICBpZiAoZWFybHlFeGl0VGhyZXNob2xkICYmIHRvdGFsID49IGVhcmx5RXhpdFRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgdHJ5IHsgcmVhZGVyLmNhbmNlbCgpOyB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKHB1bXApOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vIFNjYW4gZm9yIHByb3RvYnVmIGZpZWxkIDQgKGJhY2tvZmZUaW1lTXMpIGFuZCByZXdyaXRlIHZhbHVlcyA+IDUwMG1zCiAgICAvLyB0byBhIHNtYWxsIHJhbmRvbSB2YWx1ZSAoNTAtMTUwbXMsIGxvb2tzIGxpa2UgbmF0dXJhbCBiYWNrb2ZmIG5vaXNlCiAgICAvLyByYXRoZXIgdGhhbiBhIGNsZWFuIHplcm8pLiBQcm90b2J1ZiB3aXJlIGZvcm1hdDogZmllbGQgNCwgd2lyZSB0eXBlCiAgICAvLyAwICh2YXJpbnQpID0gdGFnIGJ5dGUgMHgyMCAoZmllbGRfbnVtYmVyIDw8IDMgfCB3aXJlX3R5cGUgPSA0IDw8IDMKICAgIC8vIHwgMCkuIFRoZSB2YXJpbnQgdXNlcyA3IGJpdHMgcGVyIGJ5dGUgd2l0aCAweDgwIGFzIGNvbnRpbnVhdGlvbgogICAgLy8gZmxhZy4gV2UgcmV3cml0ZSB0aGUgdmFyaW50IGluIHBsYWNlLCBrZWVwaW5nIHRoZSBzYW1lIGJ5dGUgY291bnQKICAgIC8vIHNvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZSBzdGF5cyB2YWxpZC4KICAgIGZ1bmN0aW9uIHBhdGNoQmFja29mZkZpZWxkKGJ5dGVzLCBybikgewogICAgICAgIGxldCBwYXRjaGVkID0gZmFsc2U7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgaWYgKGJ5dGVzW2ldICE9PSAweDIwKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IHZhbCA9IDAsIHNoaWZ0ID0gMCwgZW5kID0gaSArIDE7CiAgICAgICAgICAgIHdoaWxlIChlbmQgPCBieXRlcy5sZW5ndGggJiYgc2hpZnQgPCAzNSkgewogICAgICAgICAgICAgICAgdmFsIHw9IChieXRlc1tlbmRdICYgMHg3ZikgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgICBpZiAoIShieXRlc1tlbmRdICYgMHg4MCkpIHsgZW5kKys7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBzaGlmdCArPSA3OwogICAgICAgICAgICAgICAgZW5kKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbCA+IDUwMCAmJiB2YWwgPCAxMDAwMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IDUwICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKTsKICAgICAgICAgICAgICAgIGxvZygnUEFUQ0ggYmFja29mZj0nICsgdmFsICsgJ21zIOKGkiAnICsgdGFyZ2V0ICsgJ21zIGF0IG9mZnNldD0nICsgaSwgJ3JuPScgKyBybik7CiAgICAgICAgICAgICAgICBsZXQgcG9zID0gaSArIDEsIHJlbWFpbmluZyA9IHRhcmdldDsKICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnl0ZXNbcG9zKytdID0gKHJlbWFpbmluZyAmIDB4N2YpIHwgMHg4MDsKICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPj4+PSA3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnl0ZXNbcG9zXSA9IHJlbWFpbmluZyAmIDB4N2Y7CiAgICAgICAgICAgICAgICBwYXRjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF0Y2hlZDsKICAgIH0KCiAgICBpZiAoREVCVUcpIHsKICAgICAgICBsZXQgbGFzdFJTID0gLTE7CiAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICBpZiAoIXYpIHJldHVybjsKICAgICAgICAgICAgaWYgKHYucmVhZHlTdGF0ZSAhPT0gbGFzdFJTKSB7CiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2LmJ1ZmZlcmVkLmxlbmd0aCA+IDAgPyB2LmJ1ZmZlcmVkLmVuZCgwKS50b0ZpeGVkKDEpIDogJzAnOwogICAgICAgICAgICAgICAgbG9nKCdWSURFTyBycz0nICsgdi5yZWFkeVN0YXRlLCAnY3Q9JyArIHYuY3VycmVudFRpbWUudG9GaXhlZCgxKSwgJ2J1Zj0nICsgYnVmLCB2LnBhdXNlZCA/ICdwYXVzZWQnIDogJ3BsYXlpbmcnKTsKICAgICAgICAgICAgICAgIGxhc3RSUyA9IHYucmVhZHlTdGF0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDIwMCk7CiAgICB9CgogICAgbG9nKCdsb2FkZWQnKTsKfSkoKTsKCg=="},{"name":"brave-youtube-playback-speed-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXlvdXR1YmUtcGxheWJhY2stc3BlZWQtZml4LmpzCi8vIFRoaXMgc2NyaXB0IGlzIGluamVjdGVkIGludG8gWW91VHViZSBwYWdlcyB0byB3b3JrIGFyb3VuZCBhIFlvdVR1YmUgYnVnIHdoZXJlCi8vIHRoZSBwbGF5YmFjayBzcGVlZCB3aWxsIG9ubHkgc2F2ZSBmb3IgZnV0dXJlIHZpZGVvcyB3aGVuIHVzaW5nIHRoZSBzbGlkZXIgY29udHJvbHMuCi8vIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHBsYXliYWNrIHNwZWVkIHVzaW5nIHRoZSBidXR0b25zLCB0aGUgbmV3IHNwZWVkIHdpbGwgbm90IGJlIHNhdmVkLgovLyBUaGlzIGNyZWF0ZWQgaXNzdWVzIHdoZXJlLCBpZiB0aGUgdXNlciBhZGp1c3RlZCB0aGUgc2xpZGVyLCBhbmQgdGhlbiBjbGlja2VkIHRoZSAxeCBidXR0b24gdG8KLy8gcmVzZXQgdGhlIHNwZWVkLCB0aGUgc3BlZWQgd291bGQgYmUgcmVzZXQgdG8gMXgsIGJ1dCB0aGVuIGFsbCBmdXR1cmUgdmlkZW9zIHdvdWxkIHBsYXkgYXQgdGhlCi8vIHByZXZpb3VzbHkgc2V0IHNwZWVkLiBUaGUgc2NyaXB0IHdvcmtzIGFyb3VuZCB0aGlzIGJ5IHNhdmluZyB0aGUgcGxheWJhY2sgc3BlZWQgdG8gc2Vzc2lvblN0b3JhZ2UKLy8gd2hlbmV2ZXIgaXQgY2hhbmdlcywgaW5zdGVhZCBvZiByZWx5aW5nIG9uIFlvdVR1YmUncyBkZWZhdWx0IGJlaGF2aW9yLgooZnVuY3Rpb24gKCkgewogIGNvbnN0IEtFWSA9ICd5dC1wbGF5ZXItcGxheWJhY2stcmF0ZSc7CiAgZnVuY3Rpb24gYXR0YWNoKHBsYXllcikgewogICAgaWYgKCFwbGF5ZXIgfHwgIXBsYXllci5hZGRFdmVudExpc3RlbmVyIHx8IHBsYXllci5fX3JhdGVIb29rZWQpIHJldHVybiBmYWxzZTsKICAgIHBsYXllci5fX3JhdGVIb29rZWQgPSB0cnVlOwogICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ29uUGxheWJhY2tSYXRlQ2hhbmdlJywgZnVuY3Rpb24gKHJhdGUpIHsKICAgICAgY29uc3QgdiA9ICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpID8gcmF0ZSA6IChyYXRlICYmIHJhdGUuZGF0YSkgPz8gcmF0ZTsKICAgICAgdHJ5IHsKICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKEtFWSwgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgZGF0YTogU3RyaW5nKHYpLAogICAgICAgICAgY3JlYXRpb246IERhdGUubm93KCkKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoIWF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICBjb25zdCBvbk5hdkZpbmlzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGF0dGFjaChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92aWVfcGxheWVyJykpKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigneXQtbmF2aWdhdGUtZmluaXNoJywgb25OYXZGaW5pc2gpOwogIH0KfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIHZhZnQKICAgIC8vIGluc3RhbmNlIHRoYXQgZmlnaHRzIGZvciBwbGF5ZXIgY29udHJvbC4gT25seSB0aGUgdG9wIGZyYW1lIGhvc3RzIHRoZSBwbGF5ZXIgb24KICAgIC8vIHR3aXRjaC50di9DSEFOTkVMOyBuZXN0ZWQgYXV4aWxpYXJ5IGZyYW1lcyBhcmUgbm9pc2UuCiAgICAvLyBBbGxvdy1saXN0IGZvciBuZXN0ZWQtZnJhbWUgaW5qZWN0aW9uOiBUd2l0Y2gncyB0aHJlZSBkb2N1bWVudGVkIGVtYmVkIGNvbnRleHRzCiAgICAvLyAoaHR0cHM6Ly9kZXYudHdpdGNoLnR2L2RvY3MvZW1iZWQvdmlkZW8tYW5kLWNsaXBzLykg4oCUIHByZXNlcnZlcyBUd2l0Y2ggc3RyZWFtcwogICAgLy8gZW1iZWRkZWQgb24gdGhpcmQtcGFydHkgc2l0ZXMgd2hlcmUgdmFmdCBydW5zIGluIGFuIGlmcmFtZSB3aG9zZSBwYXJlbnQgaXMgb24KICAgIC8vIGEgZGlmZmVyZW50IG9yaWdpbi4KICAgIC8vIFVzZSB3aW5kb3cuZnJhbWVFbGVtZW50IHRvIGRldGVjdCBuZXN0ZWQgZnJhbWVzIOKAlCBudWxsIG9uIHRvcCBmcmFtZSwgdGhlIGlmcmFtZQogICAgLy8gZWxlbWVudCBvbiBhIHNhbWUtb3JpZ2luIG5lc3RlZCBmcmFtZSwgdGhyb3dzIG9uIGEgY3Jvc3Mtb3JpZ2luIG5lc3RlZCBmcmFtZS4KICAgIC8vIE1vcmUgcmVsaWFibGUgdGhhbiAnd2luZG93ICE9PSB3aW5kb3cudG9wJyBiZWNhdXNlIFRhbXBlcm1vbmtleSB3cmFwcyB3aW5kb3cgaW4gYQogICAgLy8gcHJveHkgd2hlcmUgdGhlIHN0cmljdCBjb21wYXJpc29uIGNhbiByZXR1cm4gdHJ1ZSBldmVuIG9uIHRoZSB0b3AgZnJhbWUuCiAgICBsZXQgX2lzTmVzdGVkID0gZmFsc2U7CiAgICB0cnkgeyBfaXNOZXN0ZWQgPSB3aW5kb3cuZnJhbWVFbGVtZW50ICE9PSBudWxsOyB9IGNhdGNoIChfZSkgeyBfaXNOZXN0ZWQgPSB0cnVlOyB9CiAgICBpZiAoX2lzTmVzdGVkKSB7CiAgICAgICAgY29uc3QgX2hvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfaXNFbWJlZENvbnRleHQgPSBfaG9zdCA9PT0gJ3BsYXllci50d2l0Y2gudHYnIHx8IF9ob3N0ID09PSAnZW1iZWQudHdpdGNoLnR2JyB8fCBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvZW1iZWQvJyk7CiAgICAgICAgaWYgKCFfaXNFbWJlZENvbnRleHQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmFmdCBza2lwcGVkIOKAlCBuZXN0ZWQgZnJhbWUgb24gJyArIF9ob3N0ICsgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgKyAnIChub3QgYSBUd2l0Y2ggZW1iZWQpLiBJZiB5b3Ugc2VlIHRoaXMgb24gdHdpdGNoLnR2L0NIQU5ORUwgdG9wIGZyYW1lLCBwbGVhc2UgcmVwb3J0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgLy8gU2tpcCBpbmplY3Rpb24gb24gdGhlIFR3aXRjaCBjbGlwIGVkaXRvciDigJQgY2xpcHMudHdpdGNoLnR2IGhvc3Qgb3IgLzxjaGFubmVsPi9jbGlwLzxzbHVnPiBwYXRoLgogICAgLy8gT3VyIGZldGNoL1dvcmtlciBob29rcyBhbmQgYnVmZmVyIG1vbml0b3IgYXJlIGFpbWVkIGF0IHRoZSBsaXZlIGNoYW5uZWwgcGxheWVyOyBvbiB0aGUKICAgIC8vIGNsaXAgZWRpdG9yJ3Mgc2Vla2FibGUgcHJldmlldyB0aGV5IGhhdmUgbm8gYWRzIHRvIGFjdCBvbiBhbmQgaGF2ZSBjYXVzZWQgdGhlIHByZXZpZXcKICAgIC8vIHRvIGZyZWV6ZSB3aGVuIHRoZSB1c2VyIGRyYWdzIHRoZSB0cmltIHJhbmdlLiAoU3luYydkIHdpdGggVFRWLUFCIHY2LjQuOS4pCiAgICB7CiAgICAgICAgY29uc3QgX2NsaXBIb3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2NsaXBQYXRoID0gZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgfHwgJyc7CiAgICAgICAgaWYgKF9jbGlwSG9zdCA9PT0gJ2NsaXBzLnR3aXRjaC50dicgfHwgL15cL1teL10rXC9jbGlwXC9bXi9dKy8udGVzdChfY2xpcFBhdGgpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZhZnQgc2tpcHBlZCDigJQgY2xpcCBlZGl0b3IgcGFnZSAoJyArIF9jbGlwSG9zdCArIF9jbGlwUGF0aCArICcpLicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJ3VzZSBzdHJpY3QnOwogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gODQ7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2YWZ0IHYnICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgJyBsb2FkaW5nJyk7CiAgICBpZiAodHlwZW9mIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPj0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ09ORkxJQ1Q6IHZhZnQgdicgKyBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnIHNraXBwZWQg4oCUIGFub3RoZXIgc2NyaXB0IGFscmVhZHkgYWN0aXZlICh2JyArIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gKyAnKS4gUmVtb3ZlIGR1cGxpY2F0ZSBzY3JpcHRzLicpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb247CiAgICAvLyBDb25maWd1cmF0aW9uIGFuZCBzdGF0ZSBzaGFyZWQgYmV0d2VlbiB3aW5kb3cgYW5kIHdvcmtlciBzY29wZXMKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gJ3R3aXRjaC1zdGl0Y2hlZCcgY2F0Y2hlcyB0aGUgdHdpdGNoLXN0aXRjaGVkLSogREFURVJBTkdFIGNsYXNzIGZhbWlseQogICAgICAgIC8vICgtYWQsIC1taWQsIC1wb2QsIGV0Yy4pIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGV4YWN0IC1hZCBzdWZmaXguIFR3aXRjaC0KICAgICAgICAvLyBwcmVmaXhlZCBzbyB3ZSBkb24ndCByZS1pbnRyb2R1Y2UgdGhlIFBSICMxMjAgZmFsc2UtcG9zaXRpdmUgZnJvbSBiYXJlCiAgICAgICAgLy8gJ3N0aXRjaGVkJyBzdWJzdHJpbmcgbWF0Y2guIFRoZSBzcGVjaWZpYyB0d2l0Y2gtc3RpdGNoZWQtYWQgREFURVJBTkdFCiAgICAgICAgLy8gbWFya2VyIGlzIGEgc3Vic2V0IG9mIHRoaXMgcHJlZml4LgogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVycyA9IFsnc3RpdGNoZWQtYWQnLCAnRVhULVgtQ1VFLU9VVCcsICd0d2l0Y2gtc3RpdGNoZWQnLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtbWFmLWFkIicsICdFWFQtWC1EQVRFUkFOR0U6Q0xBU1M9InR3aXRjaC10cmlnZ2VyIiddOwogICAgICAgIC8vIENvbmZpcm1lZCBzZXNzaW9uL3NvdXJjZSBtZXRhZGF0YSwgbmV2ZXIgYWQgbWFya2VycyDigJQgZmlsdGVyIGZyb20gY2FuZGlkYXRlIGxvZy4KICAgICAgICBzY29wZS5Lbm93bk5vbkFkU2lnbmlmaWVycyA9IFsndHdpdGNoLXNlc3Npb24nLCAndHdpdGNoLXN0cmVhbS1zb3VyY2UnLCAndHdpdGNoLWFkLXF1YXJ0aWxlJywgJ3R3aXRjaC1hc3NpZ25tZW50J107CiAgICAgICAgc2NvcGUuQWRTZWdtZW50VVJMUGF0dGVybnMgPSBbJy9hZHNxdWFyZWQvJywgJy9fNDA0LycsICcvcHJvY2Vzc2luZyddOwogICAgICAgIC8vIFByZWNvbXBpbGVkIHJlZ2V4ZXMgc2hhcmVkIGFjcm9zcyB0aGUgc3RyaXBBZFNlZ21lbnRzIGhvdCBwYXRoLiBEZWNsYXJlZAogICAgICAgIC8vIGhlcmUgKHNlcmlhbGl6ZWQgaW50byB0aGUgd29ya2VyIGJsb2Igd2l0aCBkZWNsYXJlT3B0aW9ucykgc28gbGl0ZXJhbHMKICAgICAgICAvLyBpbnNpZGUgdGhlIHBlci1saW5lIHN0cmlwIGxvb3AgZG9uJ3QgcmVjb21waWxlIG9uIGV2ZXJ5IGl0ZXJhdGlvbiDigJQgZm9yCiAgICAgICAgLy8gYSAxMDAtbGluZSBtM3U4IGF0IH4yIHBvbGxzL3NlYyBkdXJpbmcgYW4gYWQgYnJlYWssIGhvaXN0aW5nIHRoZSBVUkwKICAgICAgICAvLyByZXdyaXRlIGFsb25lIHNhdmVzIH4yMDAgcmVnZXggY29tcGlsYXRpb25zIHBlciBzZWNvbmQuCiAgICAgICAgc2NvcGUuVHdpdGNoQWRVcmxSZXdyaXRlUmVnZXggPSAvKFgtVFYtVFdJVENILUFEKD86LVtBLVpdKykqLVVSTFM/PSIpW14iXSooIikvZzsKICAgICAgICBzY29wZS5VcmlBdHRyaWJ1dGVSZWdleCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5DbGllbnRJRCA9ICdraW1uZTc4a3gzbmN4NmJyZ280bXY2d2tpNWgxa28nOwogICAgICAgIHNjb3BlLkJhY2t1cFBsYXllclR5cGVzID0gWwogICAgICAgICAgICAvLyBPcmRlciBtYXR0ZXJzOiBmaXJzdCBjbGVhbiB0eXBlIHdpbnMuICdlbWJlZCcgbW92ZWQgdG8gZW5kIOKAlCBmaWVsZC1vYnNlcnZlZAogICAgICAgICAgICAvLyBUd2l0Y2ggcmV0dXJucyBHUUwgJ3NlcnZlciBlcnJvcicgZm9yIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gb24gZW1iZWQgd2hlbgogICAgICAgICAgICAvLyByZXF1ZXN0ZWQgZnJvbSB0d2l0Y2gudHYgb3JpZ2luLCB3YXN0aW5nIH4yMDAtNDAwbXMgcGVyIGJyZWFrIGFzIGZpcnN0LXRyeS4KICAgICAgICAgICAgLy8gS2VwdCBpbiBjYXNlIGl0IGV2ZXIgc3VjY2VlZHMgb24gc29tZSBjaGFubmVsL3VzZXIgY29tYm8uCiAgICAgICAgICAgICdzaXRlJywvL1NvdXJjZQogICAgICAgICAgICAncG9wb3V0JywvL1NvdXJjZQogICAgICAgICAgICAnbW9iaWxlX3dlYicsLy9Nb2JpbGUKICAgICAgICAgICAgJ2VtYmVkJywvL1NvdXJjZSAodW5yZWxpYWJsZSDigJQgc2VlIG5vdGUgYWJvdmUpCiAgICAgICAgICAgIC8vICdhdXRvcGxheScgKDM2MHApIHJlbW92ZWQ6IHdoZW4gY29tbWl0dGVkIGFzIGN5Y2xlIGJhY2t1cCwgdGhlIHBsYXllciBnZXRzIHN0dWNrCiAgICAgICAgICAgIC8vIGluIGFuIGVuZGxlc3MgbG9hZGluZyBjaXJjbGUgYWZ0ZXIgdGhlIENTQUktb25seSBwYXRoIHJlbGVhc2VzIHRoZSBiYWNrdXAg4oCUCiAgICAgICAgICAgIC8vIGF1dG9wbGF5IHZhcmlhbnRzIGRvbid0IHRyYW5zaXRpb24gY2xlYW5seSBiYWNrIHRvIG1haW4gc3RyZWFtIHZhcmlhbnRzLgogICAgICAgIF07CiAgICAgICAgc2NvcGUuRmFsbGJhY2tQbGF5ZXJUeXBlID0gJ3NpdGUnOy8vIHdhcyAnZW1iZWQnIOKAlCBzaXRlIGlzIG1vcmUgcmVsaWFibGUgd2hlbiBhbGwgU291cmNlIHR5cGVzIGVuZCB1cCBhZC1sYWRlbgogICAgICAgIHNjb3BlLkZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJ3BvcG91dCc7CiAgICAgICAgc2NvcGUuUHJlZmVyTG93UXVhbGl0eUJhY2t1cCA9IHRydWU7Ly8gSHlicmlkIHNhZmV0eSBuZXQgZm9yIFNTQUktaGVhdnkgYnJlYWtzOiBzdGlja3kgZXNjYXBlIGhhdGNoIChmaXJlcyBhZnRlciB+OHMgc3R1Y2sgaW4gYWxsLXN0cmlwcGVkIHN0YXRlKSArIGF1dG9wbGF5ICgzNjBwKSBhcyBsYXN0LXJlc29ydCBiYWNrdXAgd2hlbiBhbGwgU291cmNlIHR5cGVzIGFyZSBhZC1sYWRlbi4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX3ByZWZlckxvd1F1YWxpdHlCYWNrdXA9ZmFsc2UgdG8gZGlzYWJsZS4KICAgICAgICBzY29wZS5GYXN0QXV0b3BsYXlGaXJzdFRyeSA9IHRydWU7Ly8gUHJlcGVuZCBhdXRvcGxheSAoMzYwcCkgdG8gdGhlIGl0ZXJhdGlvbiB3aGVuIHRoZSBwcmlvciBicmVhayBleGhhdXN0ZWQgYWxsIDQgU291cmNlIHR5cGVzIOKAlCBzYXZlcyB+MS41cyBvZiBwcm9iZSBidWZmZXJpbmcgb24gZXZlcnkgYnJlYWsuIEF1dG8tcmVzZXRzIG9uIFNvdXJjZS10aWVyIHJlY292ZXJ5LiBEZWZhdWx0IG9uIGFzIG9mIHY2Ny4xLjAgKGV2ZXJ5IG9ic2VydmVkIGNoYW5uZWwgaXMgQ1NBSS1vbmx5LWJ1dC1tYXJrZWQpLiBPcHQtb3V0OiB0d2l0Y2hBZFNvbHV0aW9uc19mYXN0QXV0b3BsYXlGaXJzdFRyeT1mYWxzZS4KICAgICAgICBzY29wZS5CYWNrdXBTd2FwRmlyc3QgPSB0cnVlOy8vIE9uIGFkIGRldGVjdCwgaW1tZWRpYXRlbHkgc3dhcCB0byBhIGJhY2t1cCBwbGF5ZXItdHlwZSBtM3U4IChUVFYtQUItc3R5bGUpLiBBdm9pZHMgTWVkaWFTb3VyY2UgbWl4aW5nIGZyb20gc3RyaXAgYWN0aXZpdHkg4oCUIGZld2VyIGxvYWRpbmcgY2lyY2xlcyBpbiBmaWVsZC4gQ29zdDogZXh0cmEgZmV0Y2hlcyBvbiBldmVyeSBhZCBicmVhay4gRGVmYXVsdCBvbjsgc2V0IHR3aXRjaEFkU29sdXRpb25zX2JhY2t1cFN3YXBGaXJzdD1mYWxzZSB0byBkaXNhYmxlLgogICAgICAgIHNjb3BlLkRpc2FibGVBZFNwb29maW5nID0gdHJ1ZTsvLyBEZWZhdWx0IE9GRiAod2FzIE9OIHRocm91Z2ggdjY4LjIuMCkuIFRoZSBhbHdheXMtMTAwJS13YXRjaGVkICsgYXVkaWJsZSArIHZpc2libGUgc3Bvb2YgYmVhY29uIHBhdHRlcm4gbWF5IGl0c2VsZiBmaW5nZXJwcmludCBhcyBhbm9tYWxvdXMgYW5kIHRyaWdnZXIgZGV0ZWN0aW9uIGVzY2FsYXRpb24gKENTQUkgcmVhY2hpbmcgdGhlIGNvbW1pdHRlZCBiYWNrdXApLiBTcG9vZi1hY2NlcHRlZCBkb2VzIE5PVCBwcm92ZSBub3QtZmluZ2VycHJpbnRlZC4gT3B0IGluIHZpYSB0d2l0Y2hBZFNvbHV0aW9uc19kaXNhYmxlQWRTcG9vZmluZz1mYWxzZS4KICAgICAgICBzY29wZS5SZWNvdmVyRnJvbVNpbGVudE11dGUgPSB0cnVlOy8vIE9uIGhhcmQgcmVsb2FkLCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IG11dGVkIGJ1dCB2YWZ0IGhhcyBzdWNjZXNzZnVsbHkgdW5tdXRlZCBhdCBhbnkgcG9pbnQgZWFybGllciB0aGlzIHNlc3Npb24sIHRyZWF0IGl0IGFzIGEgc2lsZW50IFR3aXRjaCByZS1tdXRlIGFuZCByZWNvdmVyIHZpYSB0aGUgYmFja3N0b3AuIERlZmF1bHQgb247IHNldCB0d2l0Y2hBZFNvbHV0aW9uc19yZWNvdmVyRnJvbVNpbGVudE11dGU9ZmFsc2UgdG8gZGlzYWJsZSAodXNlZnVsIGZvciB1c2VycyB3aG8gZGVsaWJlcmF0ZWx5IG11dGUgbWlkLXNlc3Npb24pLgogICAgICAgIHNjb3BlLlNraXBQbGF5ZXJSZWxvYWRPbkhldmMgPSBmYWxzZTsvLyBJZiB0cnVlIHRoaXMgd2lsbCBza2lwIHBsYXllciByZWxvYWQgb24gc3RyZWFtcyB3aGljaCBoYXZlIDJrLzRrIHF1YWxpdHkgKGlmIHlvdSBlbmFibGUgdGhpcyBhbmQgeW91IHVzZSB0aGUgMmsvNGsgcXVhbGl0eSBzZXR0aW5nIHlvdSdsbCBnZXQgZXJyb3IgIzQwMDAgLyAjMzAwMCAvIHNwaW5uaW5nIHdoZWVsIG9uIGNocm9tZSBiYXNlZCBicm93c2VycykKICAgICAgICBzY29wZS5BbHdheXNSZWxvYWRQbGF5ZXJPbkFkID0gZmFsc2U7Ly8gQWx3YXlzIHBhdXNlL3BsYXkgd2hlbiBlbnRlcmluZy9sZWF2aW5nIGFkcwogICAgICAgIHNjb3BlLlJlbG9hZFBsYXllckFmdGVyQWQgPSB0cnVlOy8vIEFmdGVyIHRoZSBhZCBmaW5pc2hlcyBkbyBhIHBsYXllciByZWxvYWQgaW5zdGVhZCBvZiBwYXVzZS9wbGF5CiAgICAgICAgc2NvcGUuUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gMzA7Ly8gTWluaW11bSBzZWNvbmRzIGJldHdlZW4gcmVsb2FkcyDigJQgYnJlYWtzIENTQUkgY2FzY2FkZXMgdHJpZ2dlcmVkIGJ5IHJlbG9hZAogICAgICAgIHNjb3BlLkRpc2FibGVSZWxvYWRDYXAgPSBmYWxzZTsvLyBJZiB0cnVlLCBidWZmZXIgbW9uaXRvciByZWxvYWRzIHVubGltaXRlZCB0aW1lcyAocHJlLXY0NyBiZWhhdmlvciwgcmlzayBvZiBjYXNjYWRlKQogICAgICAgIHNjb3BlLkRyaWZ0Q29ycmVjdGlvblJhdGUgPSAxLjE7Ly8gUGxheWJhY2sgcmF0ZSBmb3IgY2F0Y2hpbmcgdXAgdG8gbGl2ZSBlZGdlIGFmdGVyIHJlbG9hZCAoMCA9IGRpc2FibGUgZHJpZnQgY29ycmVjdGlvbikKICAgICAgICBzY29wZS5FYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPSAzOy8vIE51bWJlciBvZiBjb25zZWN1dGl2ZSBhbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIHRyaWdnZXJpbmcgZWFybHkgcmVsb2FkIChlYWNoIHBvbGwgfjJzLCBzbyAzID0gfjZzLCA1ID0gfjEwcywgMTAgPSB+MjBzOyAwID0gZGlzYWJsZSkuIExvd2VyZWQgZnJvbSA1IHRvIDMgdG8gbWF0Y2ggdGhlIHRlc3RpbmcgdmFyaWFudC4gT3ZlcnJpZGUgdmlhIGxvY2FsU3RvcmFnZSB0d2l0Y2hBZFNvbHV0aW9uc19lYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQuCiAgICAgICAgc2NvcGUuUGluQmFja3VwUGxheWVyVHlwZSA9IHRydWU7Ly8gUmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5QbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNUaW1lID0gMTUwMDsKICAgICAgICBzY29wZS5QbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNQbGF5ZXJJbmRleCA9IDI7Ly9hdXRvcGxheQogICAgICAgIHNjb3BlLkhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgIHNjb3BlLlN0cmVhbUluZm9zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvc0J5VXJsID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBzY29wZS5HUUxEZXZpY2VJRCA9IG51bGw7CiAgICAgICAgc2NvcGUuQ2xpZW50VmVyc2lvbiA9IG51bGw7CiAgICAgICAgc2NvcGUuQ2xpZW50U2Vzc2lvbiA9IG51bGw7CiAgICAgICAgc2NvcGUuQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gbnVsbDsKICAgICAgICBzY29wZS5BdXRob3JpemF0aW9uSGVhZGVyID0gdW5kZWZpbmVkOwogICAgICAgIHNjb3BlLlNpbXVsYXRlZEFkc0RlcHRoID0gMDsKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdGaXggPSB0cnVlOy8vIElmIHRydWUgdGhpcyB3aWxsIHBhdXNlL3BsYXkgdGhlIHBsYXllciB3aGVuIGl0IGdldHMgc3R1Y2sgYnVmZmVyaW5nCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nRGVsYXkgPSA2MDA7Ly8gSG93IG9mdGVuIHNob3VsZCB3ZSBjaGVjayB0aGUgcGxheWVyIHN0YXRlIChpbiBtaWxsaXNlY29uZHMpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nU2FtZVN0YXRlQ291bnQgPSAzOy8vIEhvdyBtYW55IHRpbWVzIG9mIHNlZWluZyB0aGUgc2FtZSBwbGF5ZXIgc3RhdGUgdW50aWwgd2UgdHJpZ2dlciBwYXVzZS9wbGF5IChpdCB3aWxsIG9ubHkgdHJpZ2dlciBpdCBvbmUgdGltZSB1bnRpbCB0aGUgcGxheWVyIHN0YXRlIGNoYW5nZXMgYWdhaW4pCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nRGFuZ2VyWm9uZSA9IDAuNTsvLyBMb3dlcmVkIDEg4oaSIDAuNTogYXZvaWRzIGNhc2NhZGUgZmlyZXMgb24gdGhpbi1idXQtZnVuY3Rpb25hbCBidWZmZXIgYXQgbGl2ZSBlZGdlIHdoZXJlIHBhdXNlL3BsYXkgaW50ZXJhY3RzIGJhZGx5IHdpdGggVHdpdGNoJ3MgcGxheWJhY2stbW9uaXRvci4KICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZCA9IGZhbHNlOy8vIElmIHRydWUgdGhpcyB3aWxsIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkgKHBsYXllciByZWxvYWRpbmcgaXMgYmV0dGVyIGF0IGZpeGluZyB0aGUgcGxheWJhY2sgaXNzdWVzIGJ1dCBpdCB0YWtlcyBzbGlnaHRseSBsb25nZXIpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgPSA4MDAwOy8vIE1pbmltdW0gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmV0d2VlbiBlYWNoIHBhdXNlL3BsYXkgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlciBwcmVzc2luZyBwYXVzZS9wbGF5IHdoZW4gdGhlcmUgYXJlIGdlbnVpbmUgYnVmZmVyaW5nIHByb2JsZW1zKQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgPSBmYWxzZTsvLyBFbmFibGUgdGhpcyBpZiB5b3UncmUgZ2V0dGluZyBhbiBpbW1lZGlhdGUgcGF1c2UvcGxheS9yZWxvYWQgYXMgeW91IG9wZW4gYSBzdHJlYW0gKHdoaWNoIGlzIGNhdXNpbmcgdGhlIHN0cmVhbSB0byB0YWtlIGxvbmdlciB0byBsb2FkKS4gT25lIHByb2JsZW0gd2l0aCB0aGlzIGJlaW5nIHRydWUgaXMgdGhhdCBpdCBjYW4gY2F1c2UgdGhlIHBsYXllciB0byBnZXQgc3R1Y2sgaW4gc29tZSBpbnN0YW5jZXMgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIHByZXNzIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQgPSA1Oy8vIEhvdyBmYXIgdGhlIHN0cmVhbSBuZWVkIHRvIG1vdmUgYmVmb3JlIGRvaW5nIHRoZSBidWZmZXJpbmcgbWl0aWdhdGlvbiAoZGVwZW5kcyBvbiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tFbmFibGVkIGJlaW5nIHRydWUpCiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb01heEFnZU1zID0gMzAgKiA2MCAqIDEwMDA7CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgaW4gc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVsZXRlIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBFbmNvZGluZ3NNM1U4OiBlbmNvZGluZ3NNM3U4LAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgICAgIFJlc29sdXRpb25MaXN0OiBbXSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIFNwb29mZWRBZElkczogbmV3IFNldCgpLC8vIG5vdGlmeUFkQ29tcGxldGUgbXVsdGktcG9sbCBkZWR1cCDigJQgc3RpdGNoZWQtYWQgSURzIHNwb29mZWQgdGhpcyBicmVhay4gQ2xlYXJlZCBhdCBicmVhayBlbmQuCiAgICAgICAgICAgIE1vZGlmaWVkTTNVODogbnVsbCwKICAgICAgICAgICAgSXNVc2luZ01vZGlmaWVkTTNVODogZmFsc2UsCiAgICAgICAgICAgIElzU2hvd2luZ0FkOiBmYWxzZSwKICAgICAgICAgICAgSXNNaWRyb2xsOiBmYWxzZSwKICAgICAgICAgICAgQWRCcmVha1N0YXJ0ZWRBdDogMCwKICAgICAgICAgICAgUG9kTGVuZ3RoOiAxLAogICAgICAgICAgICBIYXNDb25maXJtZWRBZEF0dHJzOiBmYWxzZSwKICAgICAgICAgICAgQ2xlYW5QbGF5bGlzdENvdW50OiAwLAogICAgICAgICAgICBQZW5kaW5nQWRFbmRBdDogMCwKICAgICAgICAgICAgQWRFbmRCb3VuY2VDb3VudDogMCwKICAgICAgICAgICAgQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3M6IDAsCiAgICAgICAgICAgIENzYWlPbmx5VGhpc0JyZWFrOiBmYWxzZSwKICAgICAgICAgICAgSXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBmYWxzZSwKICAgICAgICAgICAgTnVtU3RyaXBwZWRBZFNlZ21lbnRzOiAwLAogICAgICAgICAgICBSZWNvdmVyeVNlZ21lbnRzOiBbXSwKICAgICAgICAgICAgUmVjb3ZlcnlTdGFydFNlcTogdW5kZWZpbmVkLAogICAgICAgICAgICBGcmVlemVTdGFydGVkQXQ6IDAsCiAgICAgICAgICAgIENvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xsczogMCwKICAgICAgICAgICAgVG90YWxBbGxTdHJpcHBlZFBvbGxzOiAwLAogICAgICAgICAgICBMYXN0Q2xlYW5OYXRpdmVNM1U4OiBudWxsLAogICAgICAgICAgICBMYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0OiAwLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NNM1U4Q2FjaGU6IFtdLAogICAgICAgICAgICBBY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBQaW5uZWRCYWNrdXBQbGF5ZXJUeXBlOiBudWxsLAogICAgICAgICAgICBMYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgRmFpbGVkQmFja3VwUGxheWVyVHlwZXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgTG9nZ2VkQmFja3VwQWRzQnlUeXBlOiBudWxsLAogICAgICAgICAgICBDeWNsZVJlc2N1ZWRUaGlzQnJlYWs6IGZhbHNlLAogICAgICAgICAgICBFYXJseVJlbG9hZENvdW50OiAwLAogICAgICAgICAgICBFYXJseVJlbG9hZEF0UG9sbDogMCwKICAgICAgICAgICAgRWFybHlSZWxvYWRUcmlnZ2VyZWQ6IGZhbHNlLAogICAgICAgICAgICBFYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0OiBmYWxzZSwKICAgICAgICAgICAgRXNjYXBlSGF0Y2hGaXJlZDogZmFsc2UsCiAgICAgICAgICAgIExhc3RCcmVha1VzZWRFc2NhcGVIYXRjaDogZmFsc2UsLy8gRmFzdEF1dG9wbGF5Rmlyc3RUcnkgc2lnbmFsIOKAlCBzZXQgd2hlbiBhIGJyZWFrIGNvbW1pdHMgYXV0b3BsYXkgdmlhIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZXNjYXBlIGhhdGNoLiBSZXNldCB3aGVuIGEgU291cmNlLXRpZXIgdHlwZSB3aW5zLgogICAgICAgICAgICBGYXN0QXV0b3BsYXlDb25zZWN1dGl2ZTogMCwvLyBDb3VudCBvZiBjb25zZWN1dGl2ZSBmYXN0LWF1dG9wbGF5IHdpbnMg4oCUIHRyaWdnZXJzIHBlcmlvZGljIHJlLXByb2JlIHRvIGNhdGNoIGNoYW5uZWwgcmVjb3ZlcnkuCiAgICAgICAgICAgIExhc3RQbGF5ZXJSZWxvYWQ6IDAsCiAgICAgICAgICAgIFJlbG9hZFRpbWVzdGFtcHM6IFtdLAogICAgICAgICAgICBIYXNDaGVja2VkVW5rbm93blRhZ3M6IGZhbHNlLAogICAgICAgICAgICBIYXNMb2dnZWRBZEF0dHJpYnV0ZXM6IGZhbHNlLAogICAgICAgICAgICBIYXNMb2dnZWRVbmtub3duU2lnbmlmaWVyczogZmFsc2UsCiAgICAgICAgICAgIExvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uOiBmYWxzZSwvLyBEZXRlY3Rpb24gZGlhZ25vc3RpYzogc2V0IHdoZW4gbTN1OCB0cmFuc2l0aW9ucyB0byBvZmZsaW5lLXNoYXBlIG1pZC1zZXNzaW9uLgogICAgICAgICAgICBDb25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlczogMCwvLyBEZXRlY3Rpb24gZGlhZ25vc3RpYzogY291bnRlciBmb3IgY29uc2VjdXRpdmUgZmFpbGVkIGFjY2Vzcy10b2tlbiBmZXRjaGVzIGFjcm9zcyBwbGF5ZXIgdHlwZXMuIExvZ2dlZCBhdCB0aHJlc2hvbGQsIHJlc2V0IG9uIHN1Y2Nlc3MuCiAgICAgICAgICAgIExvZ2dlZFRva2VuRmFpbHVyZVN0cmVhazogZmFsc2UsLy8gT25jZS1wZXItc3RyZWFrIGd1YXJkIGZvciB0aGUgdGhyZXNob2xkIGxvZy4KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gbWFza0FzTmF0aXZlKGZuLCBuYW1lKSB7CiAgICAgICAgZm4udG9TdHJpbmcgPSAoKSA9PiAnZnVuY3Rpb24gJyArIG5hbWUgKyAnKCkgeyBbbmF0aXZlIGNvZGVdIH0nOwogICAgICAgIHJldHVybiBmbjsKICAgIH0KICAgIGNvbnN0IGxvZ2dlZENzYWlUeXBlcyA9IG5ldyBTZXQoKTsKICAgIGxldCBpc0FjdGl2ZWx5U3RyaXBwaW5nQWRzID0gZmFsc2U7CiAgICBsZXQgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IGZhbHNlOwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgbGV0IGNhY2hlZFJvb3ROb2RlID0gbnVsbDsvLyBDYWNoZWQgI3Jvb3QgRE9NIGVsZW1lbnQgKG5ldmVyIGNoYW5nZXMgaW4gUmVhY3QgU1BBcykKICAgIGxldCBjYWNoZWRQbGF5ZXJSb290RGl2ID0gbnVsbDsvLyBDYWNoZWQgLnZpZGVvLXBsYXllciBlbGVtZW50CiAgICAvLyBPbmUtc2hvdCBmbGFncyBmb3Igb3ZlcmxheS1oaWRlIGxvZ3MuIFR3aXRjaCdzIFJlYWN0IHRyZWUgcmUtbW91bnRzIFNEQQogICAgLy8gd3JhcHBlcnMgYW5kIGFkLWJyZWFrIGNhcmRzIGNvbnN0YW50bHkgZHVyaW5nIGFuIGFkIGJyZWFrLCBzbyB0aGUKICAgIC8vIGhpZGUtYW5kLWxvZyBmaXJlcyBodW5kcmVkcyBvZiB0aW1lcy4gTG9nIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKICAgIC8vIGhpZGUgdHlwZSBwZXIgcGFnZSBsb2FkLCB0aGVuIHN0YXkgc2lsZW50IOKAlCB0aGUgaGlkZSBpdHNlbGYgc3RpbGwgcnVucwogICAgLy8gb24gZXZlcnkgdGljayB2aWEgZGF0YXNldC1iYXNlZCBkZWR1cC4KICAgIGxldCBsb2dnZWRTZGFIaWRlID0gZmFsc2U7CiAgICAvLyBTdHJpbmdzIHVzZWQgdG8gZGV0ZWN0IGFuZCBoYW5kbGUgY29uZmxpY3RpbmcgVHdpdGNoIHdvcmtlciBvdmVycmlkZXMgKGUuZy4gVHdpdGNoTm9TdWIpCiAgICBjb25zdCB3b3JrZXJTdHJpbmdDb25mbGljdHMgPSBbCiAgICAgICAgJ3R3aXRjaCcsCiAgICAgICAgJ2lzVmFyaWFudEEnLy8gVHdpdGNoTm9TdWIKICAgIF07CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICAvLyBXYWxrIHRoZSBXb3JrZXIgcHJvdG90eXBlIGNoYWluIGFuZCByZW1vdmUgY29uZmxpY3Rpbmcgb3ZlcnJpZGVzCiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGb3JlaWduIGV4dGVuc2lvbiBtYXkgaGF2ZSBmcm96ZW4gV29ya2VyLnByb3RvdHlwZTsgcGVyLWxpbmsgdHJ5LWNhdGNoLgogICAgICAgICAgICAgICAgICAgIHRyeSB7IE9iamVjdC5zZXRQcm90b3R5cGVPZihwYXJlbnQsIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAocm9vdCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJvb3QgPSBwcm90bzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBhcmVudCA9IHByb3RvOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod29ya2VyKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocHJvdG8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlaW5zZXJ0V29ya2Vycyh3b3JrZXIsIHJlaW5zZXJ0KSB7CiAgICAgICAgbGV0IHBhcmVudCA9IHdvcmtlcjsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlaW5zZXJ0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIFBlci1saW5rIHRyeS1jYXRjaDogZm9yZWlnbi1mcm96ZW4gZW50cnkgc2hvdWxkbid0IGFib3J0IHRoZSBjaGFpbi4KICAgICAgICAgICAgdHJ5IHsgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIHBhcmVudCA9IHJlaW5zZXJ0W2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyZW50OwogICAgfQogICAgZnVuY3Rpb24gaXNWYWxpZFdvcmtlcih3b3JrZXIpIHsKICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSB3b3JrZXIudG9TdHJpbmcoKTsKICAgICAgICBjb25zdCBoYXNDb25mbGljdCA9IHdvcmtlclN0cmluZ0NvbmZsaWN0cy5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGNvbnN0IGhhc1JlaW5zZXJ0ID0gd29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBpZiAoaGFzQ29uZmxpY3QgJiYgIWhhc1JlaW5zZXJ0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciByZWplY3RlZCDigJQgY29uZmxpY3Qgc3RyaW5nIGZvdW5kOiAnICsgd29ya2VyU3RyaW5nQ29uZmxpY3RzLmZpbHRlcigoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKS5qb2luKCcsICcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFoYXNDb25mbGljdCB8fCBoYXNSZWluc2VydDsKICAgIH0KICAgIC8vIFJlcGxhY2Ugd2luZG93LldvcmtlciB0byBpbnRlcmNlcHQgVHdpdGNoJ3MgdmlkZW8gd29ya2VyIGFuZCBpbmplY3QgYWQtYmxvY2tpbmcgbG9naWMKICAgIGxldCBpbmplY3RlZEJsb2JVcmwgPSBudWxsOwogICAgbGV0IG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gbnVsbDsKICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgLy8gUHJldmVudCBUd2l0Y2ggZnJvbSByZXZva2luZyBvdXIgaW5qZWN0ZWQgd29ya2VyIGJsb2IgVVJMCiAgICAgICAgaWYgKCFVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkKSB7CiAgICAgICAgICAgIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMID0gVVJMLnJldm9rZU9iamVjdFVSTDsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwgPT09IGluamVjdGVkQmxvYlVybCkgcmV0dXJuOwogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmV2b2tlT2JqZWN0VVJMLmNhbGwodGhpcywgdXJsKTsKICAgICAgICAgICAgfSwgJ3Jldm9rZU9iamVjdFVSTCcpOwogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMLl9fdGFzTWFza2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVpbnNlcnQgPSBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod2luZG93Lldvcmtlcik7CiAgICAgICAgY29uc3QgY2xlYW5Xb3JrZXIgPSBnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIGNsZWFuV29ya2VyIHsKICAgICAgICAgICAgY29uc3RydWN0b3IodHdpdGNoQmxvYlVybCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgbGV0IGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gbmV3IFVSTCh0d2l0Y2hCbG9iVXJsKS5vcmlnaW4uZW5kc1dpdGgoJy50d2l0Y2gudHYnKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghaXNUd2l0Y2hXb3JrZXIpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBOb24tVHdpdGNoIHdvcmtlciBza2lwcGVkOiAnICsgdHdpdGNoQmxvYlVybCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUHJlLWNoZWNrOiB2ZXJpZnkgd2UgY2FuIGZldGNoIHRoZSB3b3JrZXIgSlMgYmVmb3JlIGluamVjdGluZwogICAgICAgICAgICAgICAgbGV0IHByZWZldGNoZWRXb3JrZXJKcyA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgeyBwcmVmZXRjaGVkV29ya2VySnMgPSBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghcHJlZmV0Y2hlZFdvcmtlckpzKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFpbGVkIHRvIGZldGNoIHdvcmtlciBKUyDigJQgZmFsbGluZyBiYWNrIHRvIHVubW9kaWZpZWQgd29ya2VyJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV29ya2VyIGludGVyY2VwdGVkIOKAlCBpbmplY3RpbmcgYWQtYmxvY2sgaG9va3MnKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ0ZldGNoUmVxdWVzdHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgJHtoYXNBZFRhZ3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldE1hdGNoZWRBZFNpZ25pZmllcnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke25vdGlmeUFkQ29tcGxldGUudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3N0cmlwQWRTZWdtZW50cy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJvY2Vzc00zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2hvb2tXb3JrZXJGZXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7ZGVjbGFyZU9wdGlvbnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldEFjY2Vzc1Rva2VuLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtncWxSZXF1ZXN0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwYXJzZUF0dHJpYnV0ZXMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFdhc21Xb3JrZXJKcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U2VydmVyVGltZUZyb21NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtyZXBsYWNlU2VydmVyVGltZUluTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJ1bmVTdHJlYW1JbmZvcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Y3JlYXRlU3RyZWFtSW5mby50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IGdldFdhc21Xb3JrZXJKcygnJHt0d2l0Y2hCbG9iVXJsLnJlcGxhY2VBbGwoIiciLCAiJTI3Iil9Jyk7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZU9wdGlvbnMoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fdGFzUHJ1bmVJbnRlcnZhbCA9IHNldEludGVydmFsKHBydW5lU3RyZWFtSW5mb3MsIDUgKiA2MCAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJHtSZWxvYWRQbGF5ZXJBZnRlckFkfTsKICAgICAgICAgICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSAke1JlbG9hZENvb2xkb3duU2Vjb25kc307CiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9ICR7RGlzYWJsZVJlbG9hZENhcH07CiAgICAgICAgICAgICAgICAgICAgRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gJHtFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGR9OwogICAgICAgICAgICAgICAgICAgIFBpbkJhY2t1cFBsYXllclR5cGUgPSAke1BpbkJhY2t1cFBsYXllclR5cGV9OwogICAgICAgICAgICAgICAgICAgIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgPSAke1ByZWZlckxvd1F1YWxpdHlCYWNrdXB9OwogICAgICAgICAgICAgICAgICAgIEZhc3RBdXRvcGxheUZpcnN0VHJ5ID0gJHtGYXN0QXV0b3BsYXlGaXJzdFRyeX07CiAgICAgICAgICAgICAgICAgICAgQmFja3VwU3dhcEZpcnN0ID0gJHtCYWNrdXBTd2FwRmlyc3R9OwogICAgICAgICAgICAgICAgICAgIERpc2FibGVBZFNwb29maW5nID0gJHtEaXNhYmxlQWRTcG9vZmluZ307CiAgICAgICAgICAgICAgICAgICAgRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgPSAnJHtGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZX0nOwogICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gJHtHUUxEZXZpY2VJRCA/ICInIiArIEdRTERldmljZUlEICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9ICR7QXV0aG9yaXphdGlvbkhlYWRlciA/ICInIiArIEF1dGhvcml6YXRpb25IZWFkZXIgKyAiJyIgOiB1bmRlZmluZWR9OwogICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9ICR7Q2xpZW50SW50ZWdyaXR5SGVhZGVyID8gIiciICsgQ2xpZW50SW50ZWdyaXR5SGVhZGVyICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQ2xpZW50VmVyc2lvbiA9ICR7Q2xpZW50VmVyc2lvbiA/ICInIiArIENsaWVudFZlcnNpb24gKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gJHtDbGllbnRTZXNzaW9uID8gIiciICsgQ2xpZW50U2Vzc2lvbiArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudFZlcnNpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudFNlc3Npb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudElkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SUQgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlRGV2aWNlSWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRmV0Y2hSZXNwb25zZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVzcG9uc2VEYXRhLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCB0aW1lb3V0SWQgfSA9IHBlbmRpbmdGZXRjaFJlcXVlc3RzLmdldChyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXNwb25zZURhdGEuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXNwb25zZURhdGEuZXJyb3IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcmVzcG9uc2UgZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSB0YWtlcyBzdGF0dXMvc3RhdHVzVGV4dC9oZWFkZXJzIOKAlCB1cmwvcmVkaXJlY3RlZC90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UuIElWUyBXQVNNIHZhbGlkYXRlcyB0aGVzZSAoU3BhZGUvdHJhY2tpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMpIGFuZCB0aHJvd3MgTmV0d29ya0Vycm9yIGlmIHRoZXkncmUgbWlzc2luZyDigJQgVFRWLUFCIHY2LjMuNSBmaXguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHJlc3BvbnNlRGF0YS5ib2R5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlRGF0YS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZURhdGEuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlRGF0YS5oZWFkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndXJsJywgeyB2YWx1ZTogcmVzcG9uc2VEYXRhLnVybCB8fCAnJywgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAncmVkaXJlY3RlZCcsIHsgdmFsdWU6ICEhcmVzcG9uc2VEYXRhLnJlZGlyZWN0ZWQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNwb25zZSwgJ3R5cGUnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudHlwZSB8fCAnYmFzaWMnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1RyaWdnZXJlZFBsYXllclJlbG9hZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUmVsb2FkU2tpcHBlZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1haW4gdGhyZWFkIHJlZnVzZWQgdGhlIHJlbG9hZCAocGxheWVyIGhlYWx0aHkpIOKAlCBjbGVhciBlYXJseS1yZWxvYWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWdzIHNvIHdlIGNhbiByZS1maXJlIGlmIHRoZSBwbGF5ZXIgbGF0ZXIgc3RhbGxzLiBXaXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFYXJseVJlbG9hZFRyaWdnZXJlZCAvIEVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgc3RheSBzZXQgYWZ0ZXIgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhbHRoeS1za2lwLCBibG9ja2luZyBzdWJzZXF1ZW50IGVhcmx5LXJlbG9hZCBmaXJpbmdzIGluIHRoZSBicmVhay4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbGVhcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgaW4gU3RyZWFtSW5mb3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaSA9IFN0cmVhbUluZm9zW2NoYW5uZWxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaSAmJiBzaS5FYXJseVJlbG9hZFRyaWdnZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaS5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaS5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpLkVhcmx5UmVsb2FkQ291bnQgPSBNYXRoLm1heCgwLCAoc2kuRWFybHlSZWxvYWRDb3VudCB8fCAwKSAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFJlbG9hZCBza2lwcGVkIGJ5IG1haW4gdGhyZWFkIChwbGF5ZXIgaGVhbHRoeSkg4oCUIGVhcmx5IHJlbG9hZCBzdGF0ZSBjbGVhcmVkLCBjYW4gcmV0cnknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdTaW11bGF0ZUFkcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRlZEFkc0RlcHRoID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpbXVsYXRlZEFkc0RlcHRoOiAnICsgU2ltdWxhdGVkQWRzRGVwdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyA9ICFBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOiAnICsgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGhvb2tXb3JrZXJGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgIC8vIEd1YXJkIHRoZSBldmFsIOKAlCBtYWxmb3JtZWQgd29ya2VyU3RyaW5nIHNob3VsZG4ndCBzaWxlbnRseSBicmVhawogICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCdzIHBsYXllciBsb2dpYyB3aXRob3V0IGEgZGlhZ25vc3RpYy4KICAgICAgICAgICAgICAgICAgICB0cnkgeyBldmFsKHdvcmtlclN0cmluZyk7IH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignW0FEIERFQlVHXSBXb3JrZXIgZXZhbCBmYWlsZWQg4oCUIFR3aXRjaCBwbGF5ZXIgbG9naWMgbm90IGxvYWRlZDonLCBlKTsgfQogICAgICAgICAgICAgICAgYDsKICAgICAgICAgICAgICAgIGlmIChpbmplY3RlZEJsb2JVcmwgJiYgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBvcmlnaW5hbFJldm9rZU9iamVjdFVSTC5jYWxsKFVSTCwgaW5qZWN0ZWRCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBZEJsb2NrQmFubmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyKGUuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIGJhY2t1cCBzdHJlYW0gc3dpdGNoZXMgKHN0YXJ0IGFuZCBlbmQgb2YgYWQgYnJlYWspCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuaGFzQWRzICE9PSAhIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHBvc2l0aW9uIHRyYWNraW5nIG9uIGFkLWVuZCBzbyB0aGUgc3RyZWFtIHN3aXRjaCBnYXAgaXNuJ3QgZGV0ZWN0ZWQgYXMgYSBqdW1wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuZGF0YS5oYXNBZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuaW5BZEJyZWFrID0gISFlLmRhdGEuaGFzQWRzOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBkcmlmdCBjYXRjaC11cCB3aGVuIGFkcyBzdGFydCDigJQgZG9uJ3QgcnVuIDEuMXggZHVyaW5nIGFkIGhhbmRsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuaGFzQWRzICYmIChkcmlmdENhdGNoVXBJbnRlcnZhbCB8fCBkcmlmdENhdGNoVXBUaW1lb3V0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcEludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmlmdENhdGNoVXBUaW1lb3V0KSB7IGNsZWFyVGltZW91dChkcmlmdENhdGNoVXBUaW1lb3V0KTsgZHJpZnRDYXRjaFVwVGltZW91dCA9IG51bGw7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykucGxheWJhY2tSYXRlID0gMS4wOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1BhdXNlUmVzdW1lUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBkb1R3aXRjaFBsYXllclRhc2sodHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUsIGUuZGF0YS5raW5kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5rZXkgPT0gJ0ZldGNoUmVxdWVzdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hSZXF1ZXN0ID0gZXZlbnQuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gV29ya2VyIGNyYXNoIHJlY292ZXJ5IOKAlCBJVlMgV0FTTSB3b3JrZXIgY2FuIGZpcmUgUnVudGltZUVycm9yCiAgICAgICAgICAgICAgICAvLyAoZS5nLiAiaW5kZXggb3V0IG9mIGJvdW5kcyIpIGFuZCBkaWUuIEEgc2luZ2xlIGNyYXNoIGZpcmVzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAvLyBlcnJvciBldmVudHM7IGRlZHVwZSB2aWEgYSBsb2NhbCBmbGFnLiBPbiBmaXJzdCBlcnJvciwgdHJpZ2dlciBhCiAgICAgICAgICAgICAgICAvLyBoYXJkIHJlbG9hZCB2aWEgdGhlIG1haW4gcmVsb2FkIHBhdGgg4oCUIFR3aXRjaCByZS1zcGF3bnMgdGhlIHdvcmtlcgogICAgICAgICAgICAgICAgLy8gYXMgcGFydCBvZiB0aGUgbmV3IHBsYXllciBpbnN0YW5jZSwgYW5kIGV4aXN0aW5nIHJlbG9hZCBjb29sZG93bgogICAgICAgICAgICAgICAgLy8gcHJldmVudHMgcnVuYXdheSByZXN0YXJ0IGxvb3BzLgogICAgICAgICAgICAgICAgbGV0IGNyYXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChjcmFzaGVkKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY3Jhc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSVZTIFdBU00gd29ya2VyIGNyYXNoZWQ6ICcgKyAoKGUgJiYgZS5tZXNzYWdlKSB8fCAndW5rbm93biBlcnJvcicpICsgJyDigJQgdHJpZ2dlcmluZyBoYXJkIHJlbG9hZCB0byByZWNvdmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZG9Ud2l0Y2hQbGF5ZXJUYXNrKGZhbHNlLCB0cnVlLCAnZWFybHknKTsgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBjcmFzaCByZWNvdmVyeSBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGxldCB3b3JrZXJJbnN0YW5jZSA9IHJlaW5zZXJ0V29ya2VycyhuZXdXb3JrZXIsIHJlaW5zZXJ0KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnV29ya2VyJywgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlckluc3RhbmNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFdvcmtlcih2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB3b3JrZXJJbnN0YW5jZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQXR0ZW1wdCB0byBzZXQgdHdpdGNoIHdvcmtlciBkZW5pZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbVdvcmtlckpzKHR3aXRjaEJsb2JVcmwpIHsKICAgICAgICBpZiAoIWdldFdhc21Xb3JrZXJKcy5jYWNoZSkgewogICAgICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF07CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJlcS5vcGVuKCdHRVQnLCB0d2l0Y2hCbG9iVXJsLCBmYWxzZSk7CiAgICAgICAgcmVxLm92ZXJyaWRlTWltZVR5cGUoInRleHQvamF2YXNjcmlwdCIpOwogICAgICAgIHJlcS5zZW5kKCk7CiAgICAgICAgY29uc3QgdGV4dCA9IHJlcS5yZXNwb25zZVRleHQ7CiAgICAgICAgZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdID0gdGV4dDsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIC8vIEhvb2sgZmV0Y2goKSBpbiB0aGUgd29ya2VyIHNjb3BlIHRvIGludGVyY2VwdCBtM3U4IHBsYXlsaXN0IHJlcXVlc3RzIGFuZCBhZCBzZWdtZW50cwogICAgZnVuY3Rpb24gaG9va1dvcmtlckZldGNoKCkgewogICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIGhvb2tXb3JrZXJGZXRjaCAodmFmdCknKTsKICAgICAgICBjb25zdCBCTEFOS19NUDQgPSBuZXcgQmxvYihbVWludDhBcnJheS5mcm9tKGF0b2IoJ0FBQUFLR1owZVhCdGNEUXlBQUFBQVdsemIyMXRjRFF5WkdGemFHRjJZekZwYzI4MmFHeHpaZ0FBQkVsdGIyOTJBQUFBYkcxMmFHUUFBQUFBQUFBQUFBQUFBQUFBQVlhZ0FBQUFBQUFCQUFBQkFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUFCcUhSeVlXc0FBQUJjZEd0b1pBQUFBQU1BQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQVVSdFpHbGhBQUFBSUcxa2FHUUFBQUFBQUFBQUFBQUFBQUFBQUx1QUFBQUFBRlhFQUFBQUFBQXRhR1JzY2dBQUFBQUFBQUFBYzI5MWJnQUFBQUFBQUFBQUFBQUFBRk52ZFc1a1NHRnVaR3hsY2dBQUFBRHZiV2x1WmdBQUFCQnpiV2hrQUFBQUFBQUFBQUFBQUFBa1pHbHVaZ0FBQUJ4a2NtVm1BQUFBQUFBQUFBRUFBQUFNZFhKc0lBQUFBQUVBQUFDemMzUmliQUFBQUdkemRITmtBQUFBQUFBQUFBRUFBQUJYYlhBMFlRQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFnQVFBQUFBQUx1QUFBQUFBQUF6WlhOa2N3QUFBQUFEZ0lDQUlnQUJBQVNBZ0lBVVFCVUFBQUFBQUFBQUFBQUFBQVdBZ0lBQ0VaQUdnSUNBQVFJQUFBQVFjM1IwY3dBQUFBQUFBQUFBQUFBQUVITjBjMk1BQUFBQUFBQUFBQUFBQUJSemRITjZBQUFBQUFBQUFBQUFBQUFBQUFBQUVITjBZMjhBQUFBQUFBQUFBQUFBQWVWMGNtRnJBQUFBWEhScmFHUUFBQUFEQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQW9BQUFBRm9BQUFBQUFHQmJXUnBZUUFBQUNCdFpHaGtBQUFBQUFBQUFBQUFBQUFBQUE5Q1FBQUFBQUJWeEFBQUFBQUFMV2hrYkhJQUFBQUFBQUFBQUhacFpHVUFBQUFBQUFBQUFBQUFBQUJXYVdSbGIwaGhibVJzWlhJQUFBQUJMRzFwYm1ZQUFBQVVkbTFvWkFBQUFBRUFBQUFBQUFBQUFBQUFBQ1JrYVc1bUFBQUFIR1J5WldZQUFBQUFBQUFBQVFBQUFBeDFjbXdnQUFBQUFRQUFBT3h6ZEdKc0FBQUFvSE4wYzJRQUFBQUFBQUFBQVFBQUFKQmhkbU14QUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0FCYUFCSUFBQUFTQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdQLy9BQUFBT21GMlkwTUJUVUFlLytFQUkyZE5RQjZXVW9GQVgvTGdMVUJBUUZBQUFENkFBQTZtRGdBQUhvUUFBOUNXN3k0S0FRQUVhT3VQSUFBQUFCQnpkSFJ6QUFBQUFBQUFBQUFBQUFBUWMzUnpZd0FBQUFBQUFBQUFBQUFBRkhOMGMzb0FBQUFBQUFBQUFBQUFBQUFBQUFBUWMzUmpid0FBQUFBQUFBQUFBQUFBU0cxMlpYZ0FBQUFnZEhKbGVBQUFBQUFBQUFBQkFBQUFBUUFBQUM0QUFBQUFBb0FBQUFBQUFDQjBjbVY0QUFBQUFBQUFBQUlBQUFBQkFBQ0NOUUFBQUFBQ1FBQUEnKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpXSwge3R5cGU6ICd2aWRlby9tcDQnfSk7CiAgICAgICAgY29uc3QgcmVhbEZldGNoID0gZmV0Y2g7CiAgICAgICAgZmV0Y2ggPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuaGFzKHVybCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEJMQU5LX01QNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgnbTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSBhc3luYyBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYXdhaXQgcHJvY2Vzc00zVTgodXJsLCBhd2FpdCByZXNwb25zZS50ZXh0KCksIHJlYWxGZXRjaCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcnNlZFVybC5wYXRobmFtZS5tYXRjaCgvKFteXC9dKykoPz1cLlx3KyQpLyk/LlswXTsKICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ3BhcmVudF9kb21haW5zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlZFVybC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyVGltZSA9IGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCAhPSBudWxsICYmIChhd2FpdCByZWFsRmV0Y2goc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Lm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF0pKS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGVuY29kaW5ncyBhcmUgZGVhZCAodGhlIHN0cmVhbSBwcm9iYWJseSByZXN0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHJlbG9hZC1wZW5kaW5nIGZsYWcgZnJvbSBhIHByaW9yIHN0cmVhbSBzZXNzaW9uIOKAlCB3aXRob3V0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVsb2FkIHRyaWdnZXJlZCBvbiB0aGUgcHJldmlvdXMgY2hhbm5lbCBibGVlZHMgaW50byB0aGUgbmV3IGNoYW5uZWwncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29sZG93biBjYWxjdWxhdGlvbiwgYmxvY2tpbmcgbGVnaXRpbWF0ZSBlbmQtb2YtYnJlYWsgcmVsb2Fkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIE5ldyBzdHJlYW0gc2Vzc2lvbiDigJQgY2hhbm5lbDogJyArIGNoYW5uZWxOYW1lICsgJywgQVBJOiAnICsgKFYyQVBJID8gJ3YyJyA6ICd2MScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdID0gc3RyZWFtSW5mbyA9IGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIGVuY29kaW5nc00zdTgsIHBhcnNlZFVybC5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBsaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmF0ZTogYXR0cmlidXRlc1snRlJBTUUtUkFURSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNzOiBhdHRyaWJ1dGVzWydDT0RFQ1MnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFVRElPL1ZJREVPL1NVQlRJVExFUyBncm91cHMgY29waWVkIG9udG8gdGhlIHJld3JpdHRlbiBTVFJFQU0tSU5GIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmluZyBIRVZD4oaSQVZDIGZhbGxiYWNrIChUVFYtQUIgdjYuNy41IHBhcnNlciBmaXgpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW86IGF0dHJpYnV0ZXNbJ0FVRElPJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbzogYXR0cmlidXRlc1snVklERU8nXSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnRpdGxlczogYXR0cmlidXRlc1snU1VCVElUTEVTJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmw6IGxpbmVzW2kgKyAxXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHNbbGluZXNbaSArIDFdXSA9IHJlc29sdXRpb25JbmZvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LnB1c2gocmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc0J5VXJsW2xpbmVzW2kgKyAxXV0gPSBzdHJlYW1JbmZvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gcmVzb2x1dGlvbnMgcGFyc2VkIGZyb20gZW5jb2RpbmdzIG0zdTgg4oCUIFR3aXRjaCBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBmb3JtYXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub25IZXZjUmVzb2x1dGlvbkxpc3QgPSBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudC5Db2RlY3Muc3RhcnRzV2l0aCgnYXZjJykgfHwgZWxlbWVudC5Db2RlY3Muc3RhcnRzV2l0aCgnYXYwJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWx3YXlzUmVsb2FkUGxheWVyT25BZCB8fCAobm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aCA+IDAgJiYgc3RyZWFtSW5mby5SZXNvbHV0aW9uTGlzdC5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdoZXYnKSB8fCBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdodmMnKSkgJiYgIVNraXBQbGF5ZXJSZWxvYWRPbkhldmMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyID0gKGxpbmUsIGtleSwgdmFsdWUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCAhdmFsdWUpIHJldHVybiBsaW5lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWQgPSB2YWx1ZS5yZXBsYWNlKC9cXC9nLCAnXFxcXCcpLnJlcGxhY2UoLyIvZywgJ1xcIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBrZXkgKyAnPSInICsgZXNjYXBlZCArICciJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCgnKF58LCknICsga2V5ICsgJz0oIlteIl0qInxbXixdKiknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KGxpbmUpID8gbGluZS5yZXBsYWNlKHBhdHRlcm4sICckMScgKyBuZXh0KSA6IGxpbmUgKyAnLCcgKyBuZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXS5zdWJzdHJpbmcobGluZXNbaV0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNzS2V5ID0gJ0NPREVDUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkUmVzb2x1dGlvbiA9IHJlc1NldHRpbmdzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gb2xkUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEFyZWEgPSB0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UmVzb2x1dGlvbkluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZXN0RGlmZiA9IEluZmluaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vbkhldmNSZXNvbHV0aW9uTGlzdFtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3N0cmVhbVdpZHRoLCBzdHJlYW1IZWlnaHRdID0gY2FuZGlkYXRlLlJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKChzdHJlYW1XaWR0aCAqIHN0cmVhbUhlaWdodCkgLSB0YXJnZXRBcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjbG9zZXN0RGlmZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpZmYgPSBkaWZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVzb2x1dGlvbkluZm8gPSBjYW5kaWRhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZGlmaWVkTTNVOCBzd2FwICcgKyByZXNTZXR0aW5nc1tjb2RlY3NLZXldICsgJyB0byAnICsgbmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzICsgJyBvbGRSZXM6JyArIG9sZFJlc29sdXRpb24gKyAnIG5ld1JlczonICsgbmV3UmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXS5yZXBsYWNlKC9DT0RFQ1M9IlteIl0rIi8sIGBDT0RFQ1M9IiR7bmV3UmVzb2x1dGlvbkluZm8uQ29kZWNzfSJgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IEFVRElPL1ZJREVPL1NVQlRJVExFUyBncm91cHMgKFRUVi1BQiB2Ni43LjUgcGFyc2VyIGZpeCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyKGxpbmVzW2ldLCAnQVVESU8nLCBuZXdSZXNvbHV0aW9uSW5mby5BdWRpbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyKGxpbmVzW2ldLCAnVklERU8nLCBuZXdSZXNvbHV0aW9uSW5mby5WaWRlbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSByZXBsYWNlT3JBcHBlbmRTdHJlYW1JbmZBdHRyKGxpbmVzW2ldLCAnU1VCVElUTEVTJywgbmV3UmVzb2x1dGlvbkluZm8uU3VidGl0bGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpICsgMV0gPSBuZXdSZXNvbHV0aW9uSW5mby5VcmwgKyAnICcucmVwZWF0KGkgKyAxKTsvLyBUaGUgc3RyZWFtIGRvZXNuJ3QgbG9hZCB1bmxlc3MgZWFjaCB1cmwgbGluZSBpcyB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub25IZXZjUmVzb2x1dGlvbkxpc3QubGVuZ3RoID4gMCB8fCBBbHdheXNSZWxvYWRQbGF5ZXJPbkFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggPSBsaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZG8gTk9UIHNldCBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgaGVyZS4gSXQgd2FzIHByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdW5jb25kaXRpb25hbGx5IG9uIG5ldyBzdHJlYW0gc2Vzc2lvbiBjcmVhdGlvbiwgd2hpY2ggY2F1c2VkIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVuZC1vZi1icmVhayByZWxvYWQgb2YgZXZlcnkgbmV3IGNoYW5uZWwgdG8gYmUgYmxvY2tlZCBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb2xkb3duIOKAlCB0aGUgY29vbGRvd24gY2hlY2sgdHJlYXRlZCB0aGUgc2Vzc2lvbi1jcmVhdGlvbiB0aW1lc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHJlY2VudCByZWxvYWQsIGV2ZW4gdGhvdWdoIG5vIHJlbG9hZCBoYWQgYWN0dWFsbHkgb2NjdXJyZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ID8gc3RyZWFtSW5mby5Nb2RpZmllZE0zVTggOiBzdHJlYW1JbmZvLkVuY29kaW5nc00zVTgsIHNlcnZlclRpbWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXIocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC8jRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKFteIl0rKSIvKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAxID8gbWF0Y2hlc1sxXSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC9TRVJWRVItVElNRT0iKFswLTkuXSspIi8pOwogICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gcmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoZW5jb2RpbmdzTTN1OCwgbmV3U2VydmVyVGltZSkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKCNFWFQtWC1TRVNTSU9OLURBVEE6REFUQS1JRD0iU0VSVkVSLVRJTUUiLFZBTFVFPSIpW14iXSsoIikvLCBgJDEke25ld1NlcnZlclRpbWV9JDJgKSA6IGVuY29kaW5nc00zdTg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTZXJ2ZXJUaW1lID8gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKC8oU0VSVkVSLVRJTUU9IilbMC05Ll0rIi8sIGBTRVJWRVItVElNRT0iJHtuZXdTZXJ2ZXJUaW1lfSJgKSA6IGVuY29kaW5nc00zdTg7CiAgICB9CiAgICBmdW5jdGlvbiBoYXNBZFRhZ3ModGV4dFN0cikgewogICAgICAgIHJldHVybiBBZFNpZ25pZmllcnMuc29tZSgocykgPT4gcyAmJiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIC8vIFNwb29mIGFkIGNvbXBsZXRpb24gdG8gVHdpdGNoJ3MgR1FMIGVuZHBvaW50IHdoZW4gYW4gYWQgYnJlYWsgaXMgZGV0ZWN0ZWQuCiAgICAvLyBNaW1pY3MgdGhlIGltcHJlc3Npb24vcXVhcnRpbGUvcG9kLWNvbXBsZXRlIGJlYWNvbnMgVHdpdGNoJ3MgcGxheWVyIHdvdWxkIGhhdmUgc2VudAogICAgLy8gaWYgdGhlIGFkIGFjdHVhbGx5IHBsYXllZC4gTWF5IHJlZHVjZSBkZXRlY3Rpb24gZXNjYWxhdGlvbi4KICAgIGZ1bmN0aW9uIG5vdGlmeUFkQ29tcGxldGUodGV4dFN0ciwgc3RyZWFtSW5mbykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIFR3aXRjaCByZXZlYWxzIGVhY2ggYWQncyBEQVRFUkFOR0Ugb25seSBhcyB0aGF0IGFkIHN0YXJ0cywgc28gbXVsdGktYWQKICAgICAgICAgICAgLy8gcG9kcyBzdXJmYWNlIG9uZSBhZCBwZXIgcG9sbC4gQ2FsbGVkIGV2ZXJ5IGFkLWxhZGVuIHBvbGw7IFNwb29mZWRBZElkcwogICAgICAgICAgICAvLyBkZWR1cHMgYWNyb3NzIHBvbGxzIHNvIGVhY2ggYWQgaXMgc3Bvb2ZlZCBvbmNlIChmdWxsIE4vTiBwb2QgY292ZXJhZ2UpLgogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gWy4uLnRleHRTdHIubWF0Y2hBbGwoLyNFWFQtWC1EQVRFUkFOR0U6KElEPSJzdGl0Y2hlZC1hZC1bXlxuXSspXG4vZyldOwogICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIGlmICghbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWROb01hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWROb01hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlUmFuZ2VMaW5lID0gdGV4dFN0ci5tYXRjaCgvI0VYVC1YLURBVEVSQU5HRTpbXlxuXXswLDIwMH0vKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBub3RpZnlBZENvbXBsZXRlOiBubyBzdGl0Y2hlZC1hZCBEQVRFUkFOR0UgbWF0Y2guIFNhbXBsZSBEQVRFUkFOR0U6ICcgKyAoZGF0ZVJhbmdlTGluZSA/IGRhdGVSYW5nZUxpbmVbMF0gOiAnbm9uZSBmb3VuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzcG9vZmVkU2V0ID0gKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5TcG9vZmVkQWRJZHMpIHx8IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHBvZExlbk1hdGNoID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQUQtUE9ELUxFTkdUSD0iKFxkKykiLyk7CiAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aCA9IHBvZExlbk1hdGNoID8gcGFyc2VJbnQocG9kTGVuTWF0Y2hbMV0sIDEwKSA6IG1hdGNoZXMubGVuZ3RoOwogICAgICAgICAgICAvLyBIb3QtcGF0aCBlYXJseS1vdXQ6IHNwb29mIHJ1bnMgZXZlcnkgYWQtbGFkZW4gcG9sbDsgb25jZSB0aGUgZGVkdXAgc2V0CiAgICAgICAgICAgIC8vIGNvdmVycyB0aGUgcG9kLCBldmVyeSByZW1haW5pbmcgcG9sbCBpcyBwdXJlIHdhc3RlIOKAlCBiYWlsIGJlZm9yZSB0aGUgbG9vcC4KICAgICAgICAgICAgaWYgKHNwb29mZWRTZXQgJiYgc3Bvb2ZlZFNldC5zaXplID49IHBvZExlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBuZXdTcG9vZmVkID0gMDsKICAgICAgICAgICAgbGV0IGZpcnN0Um9sbFR5cGUgPSAnJzsKICAgICAgICAgICAgbGV0IHBvZENvbXBsZXRlU2VudCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIENoZWFwIElEIHByZS1leHRyYWN0IOKAlCBkZWR1cC1jaGVjayBiZWZvcmUgdGhlIGZ1bGwgcGFyc2VBdHRyaWJ1dGVzKCkKICAgICAgICAgICAgICAgIC8vIHNvIGFscmVhZHktc3Bvb2ZlZCBhZHMgYXJlbid0IHJlLXBhcnNlZCBldmVyeSBwb2xsLgogICAgICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IG1hdGNoZXNbaV1bMV0ubWF0Y2goL15JRD0iKFteIl0rKSIvKTsKICAgICAgICAgICAgICAgIGNvbnN0IHN0aXRjaGVkQWRJZCA9IGlkTWF0Y2ggPyBpZE1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICAvLyBNdWx0aS1wb2xsIGRlZHVwOiBza2lwIGFkcyBhbHJlYWR5IHNwb29mZWQgZWFybGllciB0aGlzIGJyZWFrLgogICAgICAgICAgICAgICAgaWYgKHNwb29mZWRTZXQgJiYgc3RpdGNoZWRBZElkICYmIHNwb29mZWRTZXQuaGFzKHN0aXRjaGVkQWRJZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBwYXJzZUF0dHJpYnV0ZXMobWF0Y2hlc1tpXVsxXSk7CiAgICAgICAgICAgICAgICBjb25zdCByYWRUb2tlbiA9IGF0dHJbJ1gtVFYtVFdJVENILUFELVJBRFMtVE9LRU4nXTsKICAgICAgICAgICAgICAgIGlmICghcmFkVG9rZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiAhbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWROb1Rva2VuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUFkQ29tcGxldGUubG9nZ2VkTm9Ub2tlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIG5vdGlmeUFkQ29tcGxldGU6IG1hdGNoZWQgREFURVJBTkdFIGJ1dCBubyBSQURTIHRva2VuLiBBdHRyaWJ1dGVzOiAnICsgT2JqZWN0LmtleXMoYXR0cikuam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgcm9sbFR5cGUgPSAoYXR0clsnWC1UVi1UV0lUQ0gtQUQtUk9MTC1UWVBFJ10gfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Um9sbFR5cGUpIGZpcnN0Um9sbFR5cGUgPSByb2xsVHlwZTsKICAgICAgICAgICAgICAgIGNvbnN0IGFkUG9zaXRpb24gPSBwYXJzZUludChhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtUE9TSVRJT04nXSB8fCBTdHJpbmcoaSksIDEwKTsKICAgICAgICAgICAgICAgIC8vIFBheWxvYWQgY29uc2lzdGVudCB3aXRoIHRoZSAid2F0Y2hlZC10by1jb21wbGV0aW9uIiBldmVudHMgd2UgY2xhaW06CiAgICAgICAgICAgICAgICAvLyBhdWRpby1vbiwgdmlzaWJsZSwgZnVsbCBkdXJhdGlvbi4gTWlzbWF0Y2hlZCBmaWVsZHMgKG11dGU9dHJ1ZSAvIHZvbHVtZT0wIC8KICAgICAgICAgICAgICAgIC8vIHZpc2libGU9ZmFsc2UgLyBkdXJhdGlvbj0wKSB3b3VsZCBiZSBvYnZpb3VzIGNyb3NzLXZhbGlkYXRpb24gZmxhZ3MuCiAgICAgICAgICAgICAgICBjb25zdCBhZER1cmF0aW9uID0gcGFyc2VJbnQoYXR0clsnWC1UVi1UV0lUQ0gtQUQtRFVSQVRJT04nXSB8fCAnMCcsIDEwKSB8fCAwOwogICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsKICAgICAgICAgICAgICAgICAgICBzdGl0Y2hlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBhZF9pZDogc3RpdGNoZWRBZElkLAogICAgICAgICAgICAgICAgICAgIHJvbGxfdHlwZTogcm9sbFR5cGUsCiAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVfaWQ6IGF0dHJbJ1gtVFYtVFdJVENILUFELUNSRUFUSVZFLUlEJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQ6IGF0dHJbJ1gtVFYtVFdJVENILUFELU9SREVSLUlEJ10gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgbGluZV9pdGVtX2lkOiBhdHRyWydYLVRWLVRXSVRDSC1BRC1MSU5FLUlURU0tSUQnXSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfbXV0ZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgcGxheWVyX3ZvbHVtZTogMS4wLAogICAgICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGFkRHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgYWRfcG9zaXRpb246IGFkUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgdG90YWxfYWRzOiBwb2RMZW5ndGgKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyBCYXRjaCBhbGwgNiBldmVudHMgaW50byBvbmUgR1FMIFBPU1Qg4oCUIFR3aXRjaCBzdXBwb3J0cyBhcnJheS1iYXRjaGVkCiAgICAgICAgICAgICAgICAvLyBvcGVyYXRpb25zIG5hdGl2ZWx5LiBSZWR1Y2VzIHJlcXVlc3QgY291bnQgNsOXIGFuZCBhdm9pZHMgdGhlIGJvdC1saWtlCiAgICAgICAgICAgICAgICAvLyBmaW5nZXJwcmludCBvZiBmaXJpbmcgNiBzZXBhcmF0ZSByZXF1ZXN0cyBhdCBhZC1kZXRlY3QuCiAgICAgICAgICAgICAgICBjb25zdCBtYWtlUGFja2V0ID0gKGV2ZW50LCBleHRyYSkgPT4gKHsKICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnQ2xpZW50U2lkZUFkRXZlbnRIYW5kbGluZ19SZWNvcmRBZEV2ZW50JywKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHsgaW5wdXQ6IHsgZXZlbnROYW1lOiBldmVudCwgZXZlbnRQYXlsb2FkOiBKU09OLnN0cmluZ2lmeSh7IC4uLnBheWxvYWQsIC4uLmV4dHJhIH0pLCByYWRUb2tlbiB9IH0sCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogeyBwZXJzaXN0ZWRRdWVyeTogeyB2ZXJzaW9uOiAxLCBzaGEyNTZIYXNoOiAnN2U2YzY5ZTZlYjU5ZjhjY2I5N2FiNzM2ODZmM2Q4YjdkODVhNzJhMDI5ODc0NWNjZDhiZmM2OGU0MDU0Y2E1YicgfSB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIE1hcmsgc3Bvb2ZlZCBiZWZvcmUgYnVpbGRpbmcgYmF0Y2ggc28gdGhlIHBvZC1jb21wbGV0ZSBzaXplIGNoZWNrIGlzIGFjY3VyYXRlLgogICAgICAgICAgICAgICAgaWYgKHNwb29mZWRTZXQgJiYgc3RpdGNoZWRBZElkKSBzcG9vZmVkU2V0LmFkZChzdGl0Y2hlZEFkSWQpOwogICAgICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBbCiAgICAgICAgICAgICAgICAgICAgbWFrZVBhY2tldCgndmlkZW9fYWRfaW1wcmVzc2lvbicpLAogICAgICAgICAgICAgICAgICAgIG1ha2VQYWNrZXQoJ3ZpZGVvX2FkX3F1YXJ0aWxlX2NvbXBsZXRlJywgeyBxdWFydGlsZTogMSB9KSwKICAgICAgICAgICAgICAgICAgICBtYWtlUGFja2V0KCd2aWRlb19hZF9xdWFydGlsZV9jb21wbGV0ZScsIHsgcXVhcnRpbGU6IDIgfSksCiAgICAgICAgICAgICAgICAgICAgbWFrZVBhY2tldCgndmlkZW9fYWRfcXVhcnRpbGVfY29tcGxldGUnLCB7IHF1YXJ0aWxlOiAzIH0pLAogICAgICAgICAgICAgICAgICAgIG1ha2VQYWNrZXQoJ3ZpZGVvX2FkX3F1YXJ0aWxlX2NvbXBsZXRlJywgeyBxdWFydGlsZTogNCB9KSwKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAvLyBwb2RfY29tcGxldGUgb25jZSBwZXIgcG9kIChub3QgcGVyIGFkKSDigJQgYXR0YWNoZWQgdG8gdGhlIGFkIHRoYXQKICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlcyB0aGUgdHJ1ZSBwb2Qgc2l6ZS4gUGVyLWFkIHBvZF9jb21wbGV0ZSAoNsOXIGZvciBhIDYtYWQgcG9kKQogICAgICAgICAgICAgICAgLy8gaXMgaXRzZWxmIGEgZmluZ2VycHJpbnQuIERlZmVuc2l2ZSBmYWxsYmFjayAobm8gZGVkdXAgc2V0KTogcGVyLWFkLgogICAgICAgICAgICAgICAgaWYgKCFzcG9vZmVkU2V0IHx8IHNwb29mZWRTZXQuc2l6ZSA9PT0gcG9kTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaChtYWtlUGFja2V0KCd2aWRlb19hZF9wb2RfY29tcGxldGUnKSk7CiAgICAgICAgICAgICAgICAgICAgcG9kQ29tcGxldGVTZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFN1cnZlaWwgR1FMIHJlc3BvbnNlIHN0YXR1cyDigJQgbm9uLTIwMCBtZWFucyBUd2l0Y2ggcmVqZWN0ZWQgdGhlIHNwb29mCiAgICAgICAgICAgICAgICAvLyAoNDAwLzQwMy80MjkpLiBPbmNlLXBlci1zZXNzaW9uIGd1YXJkIGF2b2lkcyBsb2cgc3BhbS4KICAgICAgICAgICAgICAgIGdxbFJlcXVlc3QoYmF0Y2gpLnRoZW4ocmVzcG9uc2UgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXMgIT09IDIwMCAmJiAhbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWRCYWRTdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5QWRDb21wbGV0ZS5sb2dnZWRCYWRTdGF0dXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBub3RpZnlBZENvbXBsZXRlOiBHUUwgcmVzcG9uc2Ugc3RhdHVzICcgKyByZXNwb25zZS5zdGF0dXMgKyAnIOKAlCBzcG9vZiBtYXkgYmUgcmVqZWN0ZWQvcmF0ZS1saW1pdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgICAgICAgICAgbmV3U3Bvb2ZlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdTcG9vZmVkID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgdG90YWwgPSBzcG9vZmVkU2V0ID8gc3Bvb2ZlZFNldC5zaXplIDogbmV3U3Bvb2ZlZDsKICAgICAgICAgICAgICAgIC8vIHNyYz0gcHJpbWFyeSB2cyBjb21taXR0ZWQgYmFja3VwIHBsYXllci10eXBlIChzdXJmYWNlcyBzdHJlYW0tc3dhcAogICAgICAgICAgICAgICAgLy8gYWQtSUQgbWl4aW5nKS4gcG9kLWNvbXBsZXRlPSB3aGV0aGVyIHRoZSBzaW5nbGUgcG9kX2NvbXBsZXRlIGZpcmVkLgogICAgICAgICAgICAgICAgY29uc3Qgc3JjID0gKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlKSB8fCAncHJpbWFyeSc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTcG9vZmVkIGFkIGNvbXBsZXRpb24gZm9yICcgKyBuZXdTcG9vZmVkICsgJyBuZXcgYWQocykgKCcgKyB0b3RhbCArICcvJyArIHBvZExlbmd0aCArICcgcG9kKSDigJQgcm9sbDogJyArIGZpcnN0Um9sbFR5cGUgKyAnLCBzcmM6ICcgKyBzcmMgKyAnLCBwb2QtY29tcGxldGU6ICcgKyAocG9kQ29tcGxldGVTZW50ID8gJ3llcycgOiAnbm8nKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgY29tcGxldGlvbiBzcG9vZiBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFkU2lnbmlmaWVycy5maWx0ZXIoKHMpID0+IHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgLy8gUmVtb3ZlIGFkIHNlZ21lbnRzIGZyb20gYW4gbTN1OCBwbGF5bGlzdCBhbmQgY2FjaGUgdGhlaXIgVVJMcyBmb3IgcmVwbGFjZW1lbnQKICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFkU2lnbmlmaWVycyAoY2FuZGlkYXRlcyBmb3IgZnV0dXJlIGluY2x1c2lvbikKICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMpIHsKICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgbGV0IHNtOwogICAgICAgICAgICBjb25zdCBjbGFzc1JlID0gL0VYVC1YLURBVEVSQU5HRTpbXlxuXSpDTEFTUz0iKHR3aXRjaC1bXiJdKykiL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSBjbGFzc1JlLmV4ZWModGV4dFN0cikpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZCgnRVhULVgtREFURVJBTkdFOkNMQVNTPSInICsgc21bMV0gKyAnIicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHRhZ1JlID0gLyhTQ1RFMzUtW0EtWi1dK3xFWFQtWC1DVUUtW0EtWi1dKykvZzsKICAgICAgICAgICAgd2hpbGUgKChzbSA9IHRhZ1JlLmV4ZWModGV4dFN0cikpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZChzbVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3Vic3RyaW5nIGNoZWNrIChub3QgZXhhY3QpOiBhIGNhbmRpZGF0ZSBpcyAia25vd24iIGlmIGFueSBBZFNpZ25pZmllcgogICAgICAgICAgICAvLyBhcHBlYXJzIHdpdGhpbiBpdC4gVGhpcyBoYW5kbGVzIHByZWZpeCBzaWduaWZpZXJzIGxpa2UgJ3R3aXRjaC1zdGl0Y2hlZCcKICAgICAgICAgICAgLy8gY292ZXJpbmcgJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0idHdpdGNoLXN0aXRjaGVkLWFkIicgZXRjLgogICAgICAgICAgICBjb25zdCB1bmtub3duID0gWy4uLmNhbmRpZGF0ZXNdLmZpbHRlcihjID0+CiAgICAgICAgICAgICAgICAhQWRTaWduaWZpZXJzLnNvbWUocyA9PiBzICYmIGMuaW5jbHVkZXMocykpICYmCiAgICAgICAgICAgICAgICAhS25vd25Ob25BZFNpZ25pZmllcnMuc29tZShzID0+IHMgJiYgYy5pbmNsdWRlcyhzKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQWRTaWduaWZpZXJzOiAnICsgdW5rbm93bi5qb2luKCcsICcpICsgJyAoY2FuZGlkYXRlcyBmb3IgZnV0dXJlIGluY2x1c2lvbiknKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbaV07CiAgICAgICAgICAgIC8vIFRyYWNrIFNDVEUtMzUgQ1VFLU9VVC9DVUUtSU4gYWQgYm91bmRhcmllcwogICAgICAgICAgICBpZiAobGluZS5pbmNsdWRlcygnRVhULVgtQ1VFLU9VVCcpKSB7CiAgICAgICAgICAgICAgICBpZiAoIWluQ3VlT3V0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU0NURS0zNSBDVUUtT1VUIOKAlCBhZCBib3VuZGFyeSBlbnRlcmVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5pbmNsdWRlcygnRVhULVgtQ1VFLUlOJykpIHsKICAgICAgICAgICAgICAgIGlmIChpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLUlOIOKAlCBhZCBib3VuZGFyeSBleGl0ZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluQ3VlT3V0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWNraW5nIHVybHMgd2hpY2ggYXBwZWFyIGluIHRoZSBvdmVybGF5IFVJCiAgICAgICAgICAgIGxpbmVzW2ldID0gbGluZS5yZXBsYWNlQWxsKFR3aXRjaEFkVXJsUmV3cml0ZVJlZ2V4LCBgJDEke25ld0FkVXJsfSQyYCk7CiAgICAgICAgICAgIGNvbnN0IGlzTGl2ZVNlZ21lbnQgPSBsaW5lLmluY2x1ZGVzKCcsbGl2ZScpOwogICAgICAgICAgICBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgKCFpc0xpdmVTZWdtZW50IHx8IHN0cmlwQWxsU2VnbWVudHMgfHwgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzIHx8IGluQ3VlT3V0KSkgewogICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudFVybCA9IGxpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGlmICghQWRTZWdtZW50Q2FjaGUuaGFzKHNlZ21lbnRVcmwpKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChzZWdtZW50VXJsLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgQWRTZWdtZW50VVJMUGF0dGVybnMuc29tZSgocCkgPT4gbGluZXNbaSArIDFdLmluY2x1ZGVzKHApKSkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc2VnbWVudCBkZXRlY3RlZCB2aWEgVVJMIHBhdHRlcm46ICcgKyBsaW5lc1tpICsgMV0pOwogICAgICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuc2V0KGxpbmVzW2kgKyAxXSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMrKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBpc0xpdmVTZWdtZW50KSB7CiAgICAgICAgICAgICAgICBsaXZlU2VnbWVudHMucHVzaCh7IGV4dGluZjogbGluZSwgdXJsOiBsaW5lc1tpICsgMV0gfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtUEFSVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHBhcnQ6IFVSSSBpcyBpbmxpbmUgYXMgYW4gYXR0cmlidXRlLiBTdHJpcCBpZiBpdCBtYXRjaGVzIGEga25vd24KICAgICAgICAgICAgICAgIC8vIGFkIFVSTCAoYWxyZWFkeSBpbiBjYWNoZSBmcm9tIGEgcGFyYWxsZWwgRVhUSU5GIHN0cmlwLCBvciBtYXRjaGVzIGEgVVJMIHBhdHRlcm4pLgogICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCB0aGUgcGxheWVyIG1heSB1c2UgdGhlIHBhcnRzIHBhdGggdG8gZmV0Y2ggYWQgbWVkaWEgdmlhIGxvdy1sYXRlbmN5LgogICAgICAgICAgICAgICAgY29uc3QgcGFydFVyaU1hdGNoID0gbGluZS5tYXRjaChVcmlBdHRyaWJ1dGVSZWdleCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFkU2VnbWVudFVSTFBhdHRlcm5zLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICAvLyBGb3JtYXQ6ICcjRVhULVgtVFdJVENILVBSRUZFVENIOmh0dHBzOi8vdXJsL2hlcmUudHMnIChyYXcgVVJMIGFmdGVyIHRoZSBjb2xvbikKICAgICAgICAgICAgICAgIC8vICAgICBvcjogJyNFWFQtWC1QUkVMT0FELUhJTlQ6VFlQRT1QQVJULFVSST0idXJsIicgKFVSSSBhdHRyaWJ1dGUpCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBZFNlZ21lbnRVUkxQYXR0ZXJucy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBoYXNBZFRhZ3ModGV4dFN0cikpIHsKICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBObyBsb3cgbGF0ZW5jeSBkdXJpbmcgYWRzIChvdGhlcndpc2UgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHBsYXllciB0byBwcmVmZXRjaCBhbmQgZGlzcGxheSBhZCBzZWdtZW50cykKICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1QUkVMT0FELUhJTlQ6JykpIHsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICAvLyBDYWNoZSBsaXZlIHNlZ21lbnRzIGZvciByZWNvdmVyeSAocGx1cyB0aGUgTUVESUEtU0VRVUVOQ0Ugb2YgdGhlIG9sZGVzdCBjYWNoZWQgc2VnbWVudCwKICAgICAgICAvLyBzbyB0aGUgcGxheWVyIGFjY2VwdHMgaW5qZWN0ZWQgcmVjb3Zlcnkgc2VnbWVudHMgYXMgdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSkKICAgICAgICBpZiAobGl2ZVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzID0gbGl2ZVNlZ21lbnRzLnNsaWNlKC02KTsKICAgICAgICAgICAgY29uc3Qgc2VxID0gcGFyc2VJbnQoKHRleHRTdHIubWF0Y2goLyNFWFQtWC1NRURJQS1TRVFVRU5DRTooXGQrKS8pIHx8IFtdKVsxXSk7CiAgICAgICAgICAgIGlmICghaXNOYU4oc2VxKSkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxID0gc2VxICsgTWF0aC5tYXgoMCwgbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIGFsbCBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkLCB0cnkgdG8gcHJldmVudCBibGFjayBzY3JlZW4gdmlhIHJlY292ZXJ5IGNvbnRlbnQuCiAgICAgICAgLy8gUHJlZmVyIHRoZSBmdWxsLXBsYXlsaXN0IHNuYXBzaG90IGZyb20gYSByZWNlbnQgbm9uLWFkIHBvbGwgKG1pcnJvcnMgVFRWLUFCCiAgICAgICAgLy8gTGFzdENsZWFuTmF0aXZlTTNVOCBhcHByb2FjaCkg4oCUIGdpdmVzIHRoZSBwbGF5ZXIgNC02IGxpdmUgc2VnbWVudHMgd29ydGggb2YKICAgICAgICAvLyBjb250ZW50IHZzIHRoZSB0aGluIHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlLiBGYWxscyBiYWNrIHRvIHRoZSBwZXItc2VnbWVudAogICAgICAgIC8vIGNhY2hlIGlmIHRoZSBzbmFwc2hvdCBpcyBzdGFsZSBvciBtaXNzaW5nLgogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMgJiYgbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSArIDE7CiAgICAgICAgICAgIHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzID0gKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzIHx8IDApICsgMTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkZyZWV6ZVN0YXJ0ZWRBdCkgc3RyZWFtSW5mby5GcmVlemVTdGFydGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAvLyBQcmltYXJ5OiBmcmVzaCBmdWxsLXBsYXlsaXN0IHNuYXBzaG90ICg8IDEuNXMgb2xkLCBtdXN0IG5vdCBpdHNlbGYgY29udGFpbiBhZCBtYXJrZXJzKQogICAgICAgICAgICBjb25zdCBzbmFwc2hvdEFnZSA9IHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCA/IChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVQbGF5bGlzdEF0KSA6IEluZmluaXR5OwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4ICYmIHNuYXBzaG90QWdlIDw9IDE1MDAgJiYgIWhhc0FkVGFncyhzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTgpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgc2VnbWVudHMgc3RyaXBwZWQg4oCUIHJldXNpbmcgbGFzdCBjbGVhbiBuYXRpdmUgcGxheWxpc3QgKCcgKyBzbmFwc2hvdEFnZSArICdtcyBvbGQpJyk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlIChleGlzdGluZyBiZWhhdmlvcikKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cyAmJiBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXN0b3JpbmcgJyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGggKyAnIHJlY292ZXJ5IHNlZ21lbnRzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKCcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2pdID0gJyNFWFQtWC1NRURJQS1TRVFVRU5DRTonICsgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLmV4dGluZik7CiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHNbal0udXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAobGl2ZVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgLy8gUmVzZXQgZnJlZXplIGNvdW50ZXIgd2hlbiBsaXZlIHNlZ21lbnRzIGFyZSBhdmFpbGFibGUKICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgIH0KICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGhhc1N0cmlwcGVkQWRTZWdtZW50czsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIC8vIFRocm90dGxlIGNhY2hlIHBydW5lIHRvIG9uY2UgcGVyIDYwcy4gVGhlIDEyMHMgVFRMIGdpdmVzIHBsZW50eSBvZiBoZWFkcm9vbQogICAgICAgIC8vIGFuZCBzY2FubmluZyB0aGUgZnVsbCBjYWNoZSBvbiBldmVyeSBtM3U4IHBvbGwgYWRkcyB1cCBkdXJpbmcgaGVhdnkgYWQgYnJlYWsKICAgICAgICAvLyBzZXF1ZW5jZXMgKExMLUhMUyBjYW4gcG9sbCBtdWx0aXBsZSB0aW1lcyBwZXIgc2Vjb25kKS4gUG9ydGVkIGZyb20gVFRWLUFCLgogICAgICAgIGlmICghc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgfHwgbm93IC0gc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPiA2MDAwMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RBZENhY2hlUHJ1bmVBdCA9IG5vdzsKICAgICAgICAgICAgQWRTZWdtZW50Q2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSwgbWFwKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBub3cgLSAxMjAwMDApIHsKICAgICAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBCb3VuZCB0aGUgY2FjaGUgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoIG9uIGxvbmcgc2Vzc2lvbnMuIFdoZW4gc2l6ZSA+IDEwMDAsCiAgICAgICAgICAgIC8vIGV2aWN0IHRoZSBvbGRlc3QgMjAwIGVudHJpZXMgKE1hcCBpdGVyYXRpb24gb3JkZXIgaXMgaW5zZXJ0aW9uIG9yZGVyLCBzbyBGSUZPKS4KICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLnNpemUgPiAxMDAwKSB7CiAgICAgICAgICAgICAgICBsZXQgZXZpY3RlZCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHVybCBvZiBBZFNlZ21lbnRDYWNoZS5rZXlzKCkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5kZWxldGUodXJsKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKytldmljdGVkID49IDIwMCkgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxaykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTZWdtZW50Q2FjaGUgZXhjZWVkZWQgMTAwMCBlbnRyaWVzIOKAlCBldmljdGVkIG9sZGVzdCAnICsgZXZpY3RlZCArICcgKG5vdyAnICsgQWRTZWdtZW50Q2FjaGUuc2l6ZSArICcpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xuJyk7CiAgICB9CiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG1hdGNoaW5nIHN0cmVhbSBVUkwgZm9yIGEgZ2l2ZW4gcmVzb2x1dGlvbiBmcm9tIGEgbWFzdGVyIG0zdTgKICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBjb25zdCBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgIGxldCBtYXRjaGVkUmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IG1hdGNoZWRGcmFtZVJhdGUgPSBmYWxzZTsKICAgICAgICBsZXQgY2xvc2VzdFJlc29sdXRpb25VcmwgPSBudWxsOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBJbmZpbml0eTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kaW5nc0xpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICAvLyBBY2NlcHQgdjIgQVBJIHZhcmlhbnQgVVJMcyB3aGljaCBhcmUgcmF3IENETiBVUkxzIHdpdGhvdXQgJy5tM3U4JyBpbiB0aGUgcGF0aC4KICAgICAgICAgICAgLy8gdjEgQVBJOiBuZXh0IGxpbmUgaXMgJy4uLmluZGV4LTxyZXNvbHV0aW9uPi5tM3U4Py4uLicKICAgICAgICAgICAgLy8gdjIgQVBJOiBuZXh0IGxpbmUgaXMgYSByYXcgQ0ROIFVSTCBsaWtlICdodHRwczovL3ZpZGVvLWVkZ2UtLi4ubmV0L3YxLy4uLi9jaHVua2VkLy4uLicKICAgICAgICAgICAgLy8gd2l0aG91dCAnLm0zdTgnLiBNYXRjaGluZyBvbmx5IG9uICcubTN1OCcgd291bGQgc2tpcCB2MiB2YXJpYW50cyBlbnRpcmVseSwKICAgICAgICAgICAgLy8gY2F1c2luZyBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uIHRvIHJldHVybiBudWxsIGFuZCBiYWNrdXAgc2VsZWN0aW9uIHRvIGZhaWwuCiAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lID0gZW5jb2RpbmdzTGluZXNbaSArIDFdPy50cmltKCk7CiAgICAgICAgICAgIGlmIChlbmNvZGluZ3NMaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpICYmIG5leHRMaW5lICYmICFuZXh0TGluZS5zdGFydHNXaXRoKCcjJykgJiYgKG5leHRMaW5lLmluY2x1ZGVzKCcubTN1OCcpIHx8IG5leHRMaW5lLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoZW5jb2RpbmdzTGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbiAmJiAoIW1hdGNoZWRSZXNvbHV0aW9uVXJsIHx8ICghbWF0Y2hlZEZyYW1lUmF0ZSAmJiBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlc29sdXRpb25VcmwgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGcmFtZVJhdGUgPSBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25Vcmw7CiAgICB9CiAgICAvLyBDb3JlIGFkLWJsb2NraW5nIGxvZ2ljOiBkZXRlY3QgYWRzIGluIG0zdTgsIGZldGNoIGJhY2t1cCBzdHJlYW1zLCBzdHJpcCBhZCBzZWdtZW50cwogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5MYXN0U2VlbkF0ID0gRGF0ZS5ub3coKTsKICAgICAgICBpZiAoSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkKSB7CiAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICAvLyBEZXRlY3Rpb24gZGlhZ25vc3RpYzogaWYgVHdpdGNoIHNodXRzIGEgc3RyZWFtIGRvd24gKGFudGktYWQtYmxvY2sgZGV0ZWN0aW9uCiAgICAgICAgLy8gcmVzcG9uc2Ugb2JzZXJ2ZWQgaW4gZmllbGQgcmVwb3J0cyksIHRoZSBtM3U4IHRyYW5zaXRpb25zIHRvIGEgc3RyZWFtLWVuZCBzaGFwZQogICAgICAgIC8vIOKAlCBgRVhULVgtRU5ETElTVGAgcHJlc2VudCBhbmQgbm8gYCNFWFRJTkY6YCBzZWdtZW50IGxpbmVzLiBMb2cgb25jZSBwZXIgc3RyZWFtCiAgICAgICAgLy8gc2Vzc2lvbiBzbyB1c2VycyAvIGJ1ZyByZXBvcnRlcnMgY2FuIGluY2x1ZGUgdGhlIHRyYW5zaXRpb24gdGltZXN0YW1wIGluIHJlcHJvcy4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkT2ZmbGluZVRyYW5zaXRpb24gJiYgdGV4dFN0ci5pbmNsdWRlcygnI0VYVC1YLUVORExJU1QnKSAmJiAhdGV4dFN0ci5pbmNsdWRlcygnI0VYVElORjonKSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU3RyZWFtIGVuZGVkIC8gb2ZmbGluZSBzaGFwZSBkZXRlY3RlZCDigJQgbTN1OCBoYXMgI0VYVC1YLUVORExJU1Qgd2l0aCBubyBzZWdtZW50cy4gUG9zc2libGUgVHdpdGNoIGRldGVjdGlvbiByZXNwb25zZSwgYnJvYWRjYXN0ZXIgZW5kZWQgc3RyZWFtLCBvciBuYXR1cmFsIGVuZC1vZi1icm9hZGNhc3QnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0NoZWNrZWRVbmtub3duVGFncykgewogICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NoZWNrZWRVbmtub3duVGFncyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHVua25vd25BZFRhZ3MgPSB0ZXh0U3RyLm1hdGNoKC8jRVhUW146XG5dKig/OmFkfGN1ZXxzY3RlfHNwb25zb3IpW146XG5dKi9naSk7CiAgICAgICAgICAgIGlmICh1bmtub3duQWRUYWdzKSB7CiAgICAgICAgICAgICAgICBjb25zdCB1bmtub3duID0gdW5rbm93bkFkVGFncy5maWx0ZXIodCA9PiAhQWRTaWduaWZpZXJzLnNvbWUocyA9PiBzICYmIHQuaW5jbHVkZXMocykpKTsKICAgICAgICAgICAgICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVbmtub3duIGFkLXJlbGF0ZWQgdGFncyBmb3VuZDogJyArIFsuLi5uZXcgU2V0KHVua25vd24pXS5qb2luKCcsICcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBoYXZlQWRUYWdzID0gaGFzQWRUYWdzKHRleHRTdHIpIHx8IFNpbXVsYXRlZEFkc0RlcHRoID4gMDsKICAgICAgICAvLyBDYWNoZSB0aGUgY2xlYW4gbWFpbiBzdHJlYW0gbTN1OCBmb3IgYWxsLXN0cmlwcGVkIHJlY292ZXJ5IGZhbGxiYWNrLgogICAgICAgIC8vIFVwZGF0ZWQgZHVyaW5nIG5vbi1hZCBwb2xscyAob3V0c2lkZSBvZiBhbnkgYWQgYnJlYWspLCBzbyBieSB0aGUgdGltZSBhbiBhZAogICAgICAgIC8vIGJyZWFrIHN0YXJ0cywgc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4IGhvbGRzIGEgc25hcHNob3QgfjEtMiBzZWNvbmRzIG9sZAogICAgICAgIC8vIHdpdGggc2V2ZXJhbCBsaXZlIHNlZ21lbnRzLiBXaGVuIGhlYXZ5IFNTQUkgYnJlYWtzIGxlYXZlIHRoZSBtYWluIHBsYXlsaXN0CiAgICAgICAgLy8gZW50aXJlbHkgc3RyaXBwZWQsIHN0cmlwQWRTZWdtZW50cyByZXBsYXlzIHRoaXMgc25hcHNob3QgaW5zdGVhZCBvZiB0aGUgdGhpbgogICAgICAgIC8vIFJlY292ZXJ5U2VnbWVudHMgYXJyYXkg4oCUIHR5cGljYWxseSBnaXZlcyB0aGUgcGxheWVyIDQtNiBsaXZlIHNlZ21lbnRzIG9mCiAgICAgICAgLy8gY29udGVudCB0byBjaGV3IG9uIHZzIHRoZSAxLTIgY2FjaGVkIGluZGl2aWR1YWwgc2VnbWVudHMuCiAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgc3JjL21vZHVsZXMvcHJvY2Vzc29yLnRzOjczMy03MzYuCiAgICAgICAgaWYgKCFoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzU2hvd2luZ0FkICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoaGF2ZUFkVGFncykgewogICAgICAgICAgICAvLyBCb3VuY2UtdG9sZXJhbnQgcmVzZXQ6IGtlZXAgUGVuZGluZ0FkRW5kQXQgYWxpdmUgYWNyb3NzIHNob3J0IGZsaXBzIGJhY2sgdG8gYWQtbWFya2VkCiAgICAgICAgICAgIC8vIHNvIHRoZSBzbG93LXBhdGggbWF4LXdhaXQgZ2F0ZSBjYW4gc3RpbGwgZmlyZSB3aGVuIGJvdW5jaW5nIG1hcmtlcnMgcHJldmVudAogICAgICAgICAgICAvLyBDbGVhblBsYXlsaXN0Q291bnQgZnJvbSByZWFjaGluZyB0aHJlc2hvbGQuIE1pcnJvcnMgVFRWLUFCIHY2LjYuNyAjMS4KICAgICAgICAgICAgY29uc3QgYWRFbmRTdGFsZW5lc3NNcyA9IDEyMDAwOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCAmJiAoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQpIDwgYWRFbmRTdGFsZW5lc3NNcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50ID0gKHN0cmVhbUluZm8uQWRFbmRCb3VuY2VDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0ID0gMDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQWRFbmRCb3VuY2VDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICBzdHJlYW1JbmZvLklzTWlkcm9sbCA9IHRleHRTdHIuaW5jbHVkZXMoJyJNSURST0xMIicpIHx8IHRleHRTdHIuaW5jbHVkZXMoJyJtaWRyb2xsIicpOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uSXNTaG93aW5nQWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTaG93aW5nQWQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BZEJyZWFrU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBvZExlbmd0aE1hdGNoID0gdGV4dFN0ci5tYXRjaCgvWC1UVi1UV0lUQ0gtQUQtUE9ELUxFTkdUSD0iKFxkKykiLyk7CiAgICAgICAgICAgICAgICBjb25zdCBwb2RMZW5ndGggPSBwb2RMZW5ndGhNYXRjaCA/IHBhcnNlSW50KHBvZExlbmd0aE1hdGNoWzFdLCAxMCkgOiAxOwogICAgICAgICAgICAgICAgLy8gUmVzZXQgZWFybHktcmVsb2FkIHN0YXRlIGZvciBuZXcgYWQgYnJlYWs7IGFsbG93IHVwIHRvIG9uZSBlYXJseSByZWxvYWQgcGVyIGFkIGluIHBvZAogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Qb2RMZW5ndGggPSBwb2RMZW5ndGg7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF0UG9sbCA9IDA7CiAgICAgICAgICAgICAgICAvLyBUcmFjayBoaWdoLWNvbmZpZGVuY2UgYWQgbWFya2VycyB0byBkaXN0aW5ndWlzaCByZWFsIGFkcyBmcm9tIGZhbHNlLXBvc2l0aXZlIHNpZ25pZmllciBtYXRjaGVzCiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMgPSB0ZXh0U3RyLmluY2x1ZGVzKCdYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTicpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPSBudWxsOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5GcmVlemVTdGFydGVkQXQgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOy8vIFJlc2V0IHN0aWNreSBDU0FJIGZsYWcgZm9yIG5ldyBicmVhawogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgZGV0ZWN0ZWQg4oCUIHR5cGU6ICcgKyAoc3RyZWFtSW5mby5Jc01pZHJvbGwgPyAnbWlkcm9sbCcgOiAncHJlcm9sbCcpICsgJywgY2hhbm5lbDogJyArIHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUgKyAnLCBwb2Q6ICcgKyBwb2RMZW5ndGggKyAnIGFkKHMpICh+JyArIChwb2RMZW5ndGggKiAzMCkgKyAncyBleHBlY3RlZCksIHNpZ25pZmllcnM6ICcgKyBnZXRNYXRjaGVkQWRTaWduaWZpZXJzKHRleHRTdHIpLmpvaW4oJywgJykpOwogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1VwZGF0ZUFkQmxvY2tCYW5uZXInLAogICAgICAgICAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogZmFsc2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNwb29mIGFkLWNvbXBsZXRpb24gZXZlcnkgYWQtbGFkZW4gcG9sbCAobm90IGp1c3QgYnJlYWstc3RhcnQpLiBNdWx0aS1hZAogICAgICAgICAgICAvLyBwb2RzIHN1cmZhY2Ugb25lIGFkIHBlciBwb2xsOyBub3RpZnlBZENvbXBsZXRlIGRlZHVwcyB2aWEgU3Bvb2ZlZEFkSWRzLgogICAgICAgICAgICBpZiAoIURpc2FibGVBZFNwb29maW5nKSB7CiAgICAgICAgICAgICAgICAvLyBEZWZlciBvZmYgdGhlIHBsYXlsaXN0IGNyaXRpY2FsIHBhdGgg4oCUIHN5bmNocm9ub3VzIG1hdGNoQWxsICsgcGFyc2UgKwogICAgICAgICAgICAgICAgLy8gSlNPTi5zdHJpbmdpZnkgaGVyZSBkZWxheXMgdGhlIG1vZGlmaWVkLW0zdTggcmV0dXJuIHRvIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIChhZC1icmVhayBzdHV0dGVyKS4gTmV4dCB0aWNrIGlzIGZpbmU7IHNwb29mIGJlYWNvbnMgYXJlbid0IHRpbWUtY3JpdGljYWwuCiAgICAgICAgICAgICAgICAvLyAoR29zdURSTSBUVFYtQUIgdjguMC4wIGZpZWxkIGZpbmRpbmcgb24gdGhpcyBzYW1lIHNwb29mIGNvZGUuKQogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBub3RpZnlBZENvbXBsZXRlKHRleHRTdHIsIHN0cmVhbUluZm8pLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uSXNNaWRyb2xsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHRleHRTdHIuc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBsaW5lcy5sZW5ndGggPiBpICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMoJyxsaXZlJykgJiYgIXN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmhhcyhsaW5lc1tpICsgMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcXVlc3Qgb25lIC50cyBmaWxlIHBlciAubTN1OCByZXF1ZXN0IHRvIGF2b2lkIG1ha2luZyB0b28gbWFueSByZXF1ZXN0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuYWRkKGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ibG9iKCkpLmNhdGNoKCgpID0+IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZXNvbHV0aW9uID0gc3RyZWFtSW5mby5VcmxzW3VybF07CiAgICAgICAgICAgIGlmICghY3VycmVudFJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZHMgd2lsbCBsZWFrIGR1ZSB0byBtaXNzaW5nIHJlc29sdXRpb24gaW5mbyBmb3IgJyArIHVybCk7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpc0hldmMgPSBjdXJyZW50UmVzb2x1dGlvbi5Db2RlY3Muc3RhcnRzV2l0aCgnaGV2JykgfHwgY3VycmVudFJlc29sdXRpb24uQ29kZWNzLnN0YXJ0c1dpdGgoJ2h2YycpOwogICAgICAgICAgICAvLyBQb3N0LWFkIHJlbG9hZC1sb29wIGd1YXJkOiBza2lwIHRoZSBIRVZDIHJlbG9hZCBpZiBhIHBsYXllciByZWxvYWQgYWxyZWFkeQogICAgICAgICAgICAvLyBmaXJlZCB3aXRoaW4gdGhlIGxhc3QgOHMuIEVuZC1vZi1icmVhayBjbGVhcnMgSXNVc2luZ01vZGlmaWVkTTNVODsgd2l0aG91dAogICAgICAgICAgICAvLyB0aGlzIGd1YXJkLCBwb3N0LWFkIGNvbnRpbnVhdGlvbiBtYXJrZXJzIHdvdWxkIHJlLWZpcmUgdGhlIHJlbG9hZC4KICAgICAgICAgICAgY29uc3QgcG9zdEFkUmVlbnRyeUd1YXJkTXMgPSA4MDAwOwogICAgICAgICAgICBjb25zdCByZWNlbnRseVJlbG9hZGVkID0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkICYmIChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkKSA8IHBvc3RBZFJlZW50cnlHdWFyZE1zOwogICAgICAgICAgICBpZiAoKChpc0hldmMgJiYgIVNraXBQbGF5ZXJSZWxvYWRPbkhldmMpIHx8IEFsd2F5c1JlbG9hZFBsYXllck9uQWQpICYmIHN0cmVhbUluZm8uTW9kaWZpZWRNM1U4ICYmICFzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggJiYgIXJlY2VudGx5UmVsb2FkZWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgIGtleTogJ1JlbG9hZFBsYXllcicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN0aWNreSBDU0FJIGZhc3QgcGF0aDogaWYgYSBwcmlvciBwb2xsIGluIFRISVMgYnJlYWsgYWxyZWFkeSBjb25maXJtZWQgdGhlIGJyZWFrCiAgICAgICAgICAgIC8vIGlzIENTQUktb25seSAoYWxsIHNlZ21lbnRzIGxpdmUgb24gcG9sbCAxKSwgc3RheSBvbiB0aGUgZmFzdCBwYXRoIGZvciB0aGUgcmVzdAogICAgICAgICAgICAvLyBvZiB0aGUgYnJlYWsuIHN0cmlwQWRTZWdtZW50cyBzdGlsbCBoYW5kbGVzIGFueSByZWFsIEVYVElORiBhZCBzZWdtZW50cyB0aGF0CiAgICAgICAgICAgIC8vIHNob3cgdXAgb24gbGF0ZXIgcG9sbHMgKHRoZXkgZ2V0IGNhY2hlZCBhbmQgdGhlIGZldGNoIGhvb2sgcmV0dXJucyBCTEFOS19NUDQpLAogICAgICAgICAgICAvLyBzbyBhZHMgYXJlIGJsb2NrZWQgZXZlbiB3aXRob3V0IHRoZSBiYWNrdXAgc3dpdGNoLiBTa2lwcGluZyBiYWNrdXAgc2VhcmNoIGZvcgogICAgICAgICAgICAvLyB0aGUgd2hvbGUgQ1NBSSBicmVhayBzYXZlcyB+MjAgd2FzdGVkIGZldGNoZXMgcGVyIGJyZWFrIOKAlCB0aGUgYmFja3VwIHdvdWxkbid0CiAgICAgICAgICAgIC8vIGhlbHAgYW55d2F5IHNpbmNlIGV2ZXJ5IHBsYXllciB0eXBlIGhhcyB0aGUgc2FtZSBDU0FJIGFkcy4gRmxhZyBpcyBjbGVhcmVkCiAgICAgICAgICAgIC8vIG9ubHkgYXQgYnJlYWsgZW5kIChJc1Nob3dpbmdBZD1mYWxzZSBwYXRoKS4KICAgICAgICAgICAgLy8gU3RpY2t5IENTQUkgZXNjYXBlIGhhdGNoIChQcmVmZXJMb3dRdWFsaXR5QmFja3VwKTogYWZ0ZXIgfjhzIHN0dWNrLCBmYWxsIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaC4KICAgICAgICAgICAgaWYgKFByZWZlckxvd1F1YWxpdHlCYWNrdXAgJiYgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayAmJiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgfHwgMCkgPj0gNCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3R1Y2tQb2xscyA9IHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOwogICAgICAgICAgICAgICAgY29uc3QgcmVjb3ZlcnlDYWNoZVNpemUgPSBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgY29uc3QgZWFybHlSZWxvYWRJbmZvID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArICcvJyArIE1hdGgubWF4KDEsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU3RpY2t5IENTQUkgZXNjYXBlIGhhdGNoIOKAlCBzdHVjayAnICsgc3R1Y2tQb2xscyArICcgcG9sbHMgKH4nICsgKHN0dWNrUG9sbHMgKiAyKSArICdzKSwgRWFybHlSZWxvYWRDb3VudD0nICsgZWFybHlSZWxvYWRJbmZvICsgJywgcmVjb3ZlcnkgY2FjaGU9JyArIHJlY292ZXJ5Q2FjaGVTaXplICsgJyBzZWdtZW50cywgZmFsbGluZyB0aHJvdWdoIHRvIGJhY2t1cCBzZWFyY2gnKTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ3NhaU9ubHlUaGlzQnJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ3NhaU9ubHlUaGlzQnJlYWsgJiYgIXN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCkgewogICAgICAgICAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4dFN0ciA9IHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBmYWxzZSwgc3RyZWFtSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemUg4oCUIG1pcnJvcnMgdGhlIGNoZWNrIGluIHRoZSBub3JtYWwKICAgICAgICAgICAgICAgIC8vIGJhY2t1cC1zZWFyY2ggcGF0aCB3aGljaCB3ZSdkIG90aGVyd2lzZSBza2lwIGVudGlyZWx5IGJ5IHJldHVybmluZyBlYXJseQogICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgc3RpY2t5IHBhdGguIFdpdGhvdXQgdGhpcywgaGVhdnkgU1NBSSBicmVha3Mgb24gQ1NBSS1jb25maXJtZWQKICAgICAgICAgICAgICAgIC8vIHN0cmVhbXMgbGVhdmUgdGhlIHBsYXllciByZXBsYXlpbmcgdGhlIHRoaW4gcmVjb3ZlcnkgY2FjaGUgZm9yIHRoZSBmdWxsCiAgICAgICAgICAgICAgICAvLyBicmVhayBkdXJhdGlvbiAob2JzZXJ2ZWQ6IDM1LjlzIGZyZWV6ZSBvbiBwb2QtMSBicmVhaywgMyBhbGwtc3RyaXBwZWQKICAgICAgICAgICAgICAgIC8vIHBvbGxzLCAxLXNlZ21lbnQgcmVjb3ZlcnkgY2FjaGUpLgogICAgICAgICAgICAgICAgLy8gQm91bmRlZCB0byBtYXhFYXJseVJlbG9hZHMgcGVyIGFkIGluIHBvZCBzbyByZWxvYWQgbG9vcHMgYXJlIGltcG9zc2libGUuCiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdCAoc3RpY2t5IHBhdGgpOiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreVJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgICAgICBjb25zdCBzdGlja3lNYXhFYXJseVJlbG9hZHMgPSBzdGlja3lSZWNvdmVyeVRoaW4gPyBNYXRoLm1heCgyLCBzdHJlYW1JbmZvLlBvZExlbmd0aCB8fCAxKSA6IE1hdGgubWF4KDEsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpOwogICAgICAgICAgICAgICAgY29uc3Qgc3RpY2t5RWZmZWN0aXZlVGhyZXNob2xkID0gc3RpY2t5UmVjb3ZlcnlUaGluID8gMSA6IEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZDsKICAgICAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBzdGlja3lFZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IHN0aWNreU1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBd2FpdGluZ1Jlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF0UG9sbCA9IHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzIHx8IHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0aWNreVJlYXNvbiA9IHN0aWNreVJlY292ZXJ5VGhpbiA/ICcgKHRoaW4gcmVjb3ZlcnkgY2FjaGU6ICcgKyAoc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzPy5sZW5ndGggfHwgMCkgKyAnIHNlZ21lbnRzKScgOiAnJzsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIChzdGlja3kgcGF0aCkg4oCUICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyArICcgY29uc2VjdXRpdmUgYWxsLXN0cmlwcGVkIHBvbGxzJyArIHN0aWNreVJlYXNvbiArICcgWycgKyBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQ291bnQgKyAnLycgKyBzdGlja3lNYXhFYXJseVJlbG9hZHMgKyAnXScpOwogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICAgICAgICAgIGhhc0Fkczogc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCwKICAgICAgICAgICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQmFja3VwUGxheWVyVHlwZTogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDU0FJIGZhc3QgcGF0aDogaWYgYWxsIHNlZ21lbnRzIGluIHRoZSBtYWluIHN0cmVhbSBhcmUgbGl2ZSwgc2tpcCBiYWNrdXAgc2VhcmNoLgogICAgICAgICAgICAvLyBDU0FJIGFkcyBhcmUgZGVsaXZlcmVkIG91dHNpZGUgdGhlIG0zdTgg4oCUIHRoZSBtYWluIHN0cmVhbSBzZWdtZW50cyBhcmUgY2xlYW4uCiAgICAgICAgICAgIC8vIEp1c3Qgc3RyaXAgdHJhY2tpbmcgVVJMcyBhbmQgcmV0dXJuIHRoZSBtYWluIHN0cmVhbSBkaXJlY3RseSwgYXZvaWRpbmcgdGhlCiAgICAgICAgICAgIC8vIGJhY2t1cCBzdHJlYW0gc3dpdGNoIHRoYXQgY2F1c2VzIGEgMjAtNDBzIHJlYnVmZmVyIGdhcC4KICAgICAgICAgICAgY29uc3QgbWFpblN0cmVhbUxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgbGV0IGhhc05vbkxpdmVTZWdtZW50ID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFpblN0cmVhbUxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobWFpblN0cmVhbUxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAhbWFpblN0cmVhbUxpbmVzW2ldLmluY2x1ZGVzKCcsbGl2ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzTm9uTGl2ZVNlZ21lbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEJhY2t1cFN3YXBGaXJzdCAob3B0LWluKTogc2tpcCBzdGlja3kgQ1NBSSBwYXRoIGVudGlyZWx5LCBhbHdheXMgZmFsbCB0aHJvdWdoIHRvCiAgICAgICAgICAgIC8vIGJhY2t1cCBzZWFyY2ggb24gYWQgZGV0ZWN0LiBNaW1pY3MgVFRWLUFCJ3MgYmFja3VwLXN3YXAtZmlyc3QgZmxvdyDigJQgYXZvaWRzCiAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIG1peGluZyBmcm9tIHN0cmlwIGFjdGl2aXR5IChubyBCTEFOS19NUDQgaW5qZWN0aW9uLCBubyByZWNvdmVyeQogICAgICAgICAgICAvLyBzZWdtZW50IHJlcGxheSksIHdoaWNoIHVzZXJzIHJlcG9ydCBwcm9kdWNlcyBmZXdlciBsb2FkaW5nIGNpcmNsZXMuIENvc3Q6IGV4dHJhCiAgICAgICAgICAgIC8vIGZldGNoZXMgb24gZXZlcnkgYWQgYnJlYWsgKHRva2VuIHJlcXVlc3RzIGZvciBlYWNoIGJhY2t1cCB0eXBlIHRyaWVkKS4KICAgICAgICAgICAgaWYgKCFoYXNOb25MaXZlU2VnbWVudCAmJiAhc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4ICYmICFCYWNrdXBTd2FwRmlyc3QpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ3NhaU9ubHlUaGlzQnJlYWsgPSB0cnVlOy8vIE1hcmsgYnJlYWsgYXMgY29uZmlybWVkIENTQUkgc28gc3Vic2VxdWVudCBwb2xscyBzdGF5IG9uIHRoZSBmYXN0IHBhdGgKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUkgZmFzdCBwYXRoIOKAlCBhbGwgc2VnbWVudHMgbGl2ZSwgc2tpcHBpbmcgYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgaWYgKElzQWRTdHJpcHBpbmdFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4dFN0ciA9IHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBmYWxzZSwgc3RyZWFtSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnVXBkYXRlQWRCbG9ja0Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cywKICAgICAgICAgICAgICAgICAgICBudW1TdHJpcHBlZEFkU2VnbWVudHM6IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzLAogICAgICAgICAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IG51bGwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgYmFja3VwU2VhcmNoU3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBsZXQgYmFja3VwQ29sZFRva2VuRmV0Y2hlcyA9IDA7Ly8gZGlhZzogY29sZC1jYWNoZSB0b2tlbiByb3VuZC10cmlwcyB0aGlzIGJhY2t1cCBzZWFyY2ggKDAgPSB3YXJtIOKAlCBlbmNvZGluZ3MgY2FjaGUgaGl0KQogICAgICAgICAgICBsZXQgYmFja3VwUGxheWVyVHlwZSA9IG51bGw7CiAgICAgICAgICAgIGxldCBiYWNrdXBNM3U4ID0gbnVsbDsKICAgICAgICAgICAgbGV0IGZhbGxiYWNrTTN1OCA9IG51bGw7CiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDsKICAgICAgICAgICAgbGV0IGlzRG9pbmdNaW5pbWFsUmVxdWVzdHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA+IERhdGUubm93KCkgLSBQbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNUaW1lKSB7CiAgICAgICAgICAgICAgICAvLyBXaGVuIGRvaW5nIHBsYXllciByZWxvYWQgdGhlcmUgYXJlIGEgbG90IG9mIHJlcXVlc3RzIHdoaWNoIGNhdXNlcyB0aGUgYmFja3VwIHN0cmVhbSB0byBsb2FkIGluIHNsb3cuIEJyaWVmbHkgcHJlZmVyIHVzaW5nIGEgc2luZ2xlIHZlcnNpb24gdG8gcHJldmVudCBsb25nIGRlbGF5cwogICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IFBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1BsYXllckluZGV4OwogICAgICAgICAgICAgICAgaXNEb2luZ01pbmltYWxSZXF1ZXN0cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVHJ5IHBpbm5lZCBiYWNrdXAgcGxheWVyIHR5cGUgZmlyc3QgaWYgYXZhaWxhYmxlCiAgICAgICAgICAgIGNvbnN0IHBsYXllclR5cGVzVG9UcnkgPSBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID8gWy4uLkJhY2t1cFBsYXllclR5cGVzLCAnYXV0b3BsYXknXSA6IFsuLi5CYWNrdXBQbGF5ZXJUeXBlc107CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gcGxheWVyVHlwZXNUb1RyeS5pbmRleE9mKHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICBpZiAocGlubmVkSW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS5zcGxpY2UocGlubmVkSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgIHBsYXllclR5cGVzVG9UcnkudW5zaGlmdChzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZhc3RBdXRvcGxheUZpcnN0VHJ5OiBwcmVwZW5kIGF1dG9wbGF5IHdoZW4gcHJpb3IgYnJlYWsgZXhoYXVzdGVkIFNvdXJjZS10aWVyCiAgICAgICAgICAgIC8vIChTU0FJLXVuaWZvcm0gc2lnbmFsKS4gU2F2ZXMgfjEuNXMgb2YgcHJvYmUgYnVmZmVyaW5nLiBQZXJpb2RpYyByZS1wcm9iZSBldmVyeQogICAgICAgICAgICAvLyBOdGggY29uc2VjdXRpdmUgZmFzdC1hdXRvcGxheSB3aW4gY2F0Y2hlcyBjaGFubmVsIHJlY292ZXJ5IChUd2l0Y2ggcmV2ZXJzaW5nCiAgICAgICAgICAgIC8vIHVuaXZlcnNhbCBDU0FJIGRlbGl2ZXJ5KSDigJQgd2l0aG91dCBpdCwgY2hhbm5lbCBzdGF5cyBvbiAzNjBwIGZvciB0aGUgc2Vzc2lvbi4KICAgICAgICAgICAgaWYgKEZhc3RBdXRvcGxheUZpcnN0VHJ5ICYmIHN0cmVhbUluZm8uTGFzdEJyZWFrVXNlZEVzY2FwZUhhdGNoICYmIFByZWZlckxvd1F1YWxpdHlCYWNrdXApIHsKICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RBdXRvcGxheVJlcHJvYmVJbnRlcnZhbCA9IDU7CiAgICAgICAgICAgICAgICBjb25zdCBjb25zZWN1dGl2ZSA9IHN0cmVhbUluZm8uRmFzdEF1dG9wbGF5Q29uc2VjdXRpdmUgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjb25zZWN1dGl2ZSA+PSBGYXN0QXV0b3BsYXlSZXByb2JlSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhc3RBdXRvcGxheUNvbnNlY3V0aXZlID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkRmFzdEF1dG9wbGF5UmVwcm9iZVRoaXNCcmVhaykgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEZhc3RBdXRvcGxheVJlcHJvYmVUaGlzQnJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYXN0LWF1dG9wbGF5IHJlLXByb2JlIOKAlCB0ZXN0aW5nIFNvdXJjZS10aWVyIGFmdGVyICcgKyBjb25zZWN1dGl2ZSArICcgY29uc2VjdXRpdmUgZmFzdC1hdXRvcGxheSBicmVha3MgKGNoYW5uZWwtcmVjb3ZlcnkgY2hlY2spJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvcGxheUlkeCA9IHBsYXllclR5cGVzVG9UcnkuaW5kZXhPZignYXV0b3BsYXknKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b3BsYXlJZHggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllclR5cGVzVG9Ucnkuc3BsaWNlKGF1dG9wbGF5SWR4LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyVHlwZXNUb1RyeS51bnNoaWZ0KCdhdXRvcGxheScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkRmFzdEF1dG9wbGF5VGhpc0JyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZEZhc3RBdXRvcGxheVRoaXNCcmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBGYXN0LWF1dG9wbGF5IGZpcnN0LXRyeSDigJQgcHJpb3IgYnJlYWsgZXhoYXVzdGVkIFNvdXJjZS10aWVyOyBwcm9iaW5nIGF1dG9wbGF5IGZpcnN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVhbC10aW1lIGNvbnRhbWluYXRpb24gcmVvcmRlcjogb24gcG9sbCAyKyBvZiBhIGJyZWFrLCBtb3ZlIHR5cGVzIHRoYXQgd2VyZQogICAgICAgICAgICAvLyBhbHJlYWR5IGxvZ2dlZCBhcyBhZC1sYWRlbiBlYXJsaWVyIGluIHRoZSBzYW1lIGJyZWFrIHRvIHRoZSBlbmQgb2YgaXRlcmF0aW9uLgogICAgICAgICAgICAvLyBMZXRzIHVudHJpZWQvY2xlYW4gdHlwZXMgKHR5cGljYWxseSBhdXRvcGxheSBvbiBTU0FJLWhlYXZ5IGNoYW5uZWxzIGxpa2Ugd2FybikKICAgICAgICAgICAgLy8gZ2V0IHRyaWVkIGZpcnN0IGluc3RlYWQgb2YgcmUtY2hlY2tpbmcgdHlwZXMgd2UgYWxyZWFkeSBrbm93IGFyZSBjb250YW1pbmF0ZWQuCiAgICAgICAgICAgIC8vIExvZ2dlZEJhY2t1cEFkc0J5VHlwZSBpcyBwb3B1bGF0ZWQgYmVsb3cgYXQgdGhlICJhbHNvIGhhcyBhZHMiIGxvZyBzaXRlIGFuZAogICAgICAgICAgICAvLyBjbGVhcmVkIGF0IGVuZC1vZi1icmVhaywgc28gdGhpcyBpcyBwZXItYnJlYWsgYWRhcHRpdmUuCiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZSAmJiBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5zaXplID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgY2xlYW4gPSBbXTsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhbSA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHBsYXllclR5cGVzVG9UcnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuaGFzKHQpKSBjb250YW0ucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGNsZWFuLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY29udGFtLmxlbmd0aCA+IDAgJiYgY2xlYW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllclR5cGVzVG9UcnkubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlc1RvVHJ5LnB1c2goLi4uY2xlYW4sIC4uLmNvbnRhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZENvbnRhbVJlb3JkZXJUaGlzQnJlYWspIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRDb250YW1SZW9yZGVyVGhpc0JyZWFrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ29udGFtaW5hdGlvbi1hd2FyZSByZW9yZGVyIOKAlCB0cnlpbmcgWycgKyBjbGVhbi5qb2luKCcsICcpICsgJ10gYmVmb3JlIGtub3duLWNvbnRhbWluYXRlZCBbJyArIGNvbnRhbS5qb2luKCcsICcpICsgJ10nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgcGxheWVyVHlwZUluZGV4ID0gc3RhcnRJbmRleDsgIWJhY2t1cE0zdTggJiYgcGxheWVyVHlwZUluZGV4IDwgcGxheWVyVHlwZXNUb1RyeS5sZW5ndGg7IHBsYXllclR5cGVJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJUeXBlID0gcGxheWVyVHlwZXNUb1RyeVtwbGF5ZXJUeXBlSW5kZXhdOwogICAgICAgICAgICAgICAgY29uc3QgcmVhbFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlLnJlcGxhY2UoJy1DQUNIRUQnLCAnJyk7CiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRBdCA9IHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuZ2V0KHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgIC8vIDVzICh3YXMgMTVzKTogaW4gdGhlIENTQUktZmxpcCB3b3JsZCBhIGNvbnRhbWluYXRlZCBiYWNrdXAgdHlwZSBjYW4KICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgd2l0aGluIHNlY29uZHM7IHRoZSAxNXMgbG9ja291dCBrZXB0IHVzIG9mZiBhIG5vdy1jbGVhbiB0eXBlIGZhcgogICAgICAgICAgICAgICAgLy8gdG9vIGxvbmcgKFRUVi1BQi9Hb3N1RFJNIHY4LjAuMCAicmVkdWNlZCBhZC1pbmR1Y2VkIHN0YWxsaW5nIikuIFRyYWRlb2ZmOgogICAgICAgICAgICAgICAgLy8gfjN4IG1vcmUgcmV0cnkgZmV0Y2hlcyDigJQgd2F0Y2hlZCB2aWEgdGhlIGNvbGQvd2FybSB0b2tlbi1mZXRjaCBsb2cgKCMyMjgpLgogICAgICAgICAgICAgICAgaWYgKGZhaWxlZEF0ICYmIChEYXRlLm5vdygpIC0gZmFpbGVkQXQpIDwgNTAwMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaXNGdWxseUNhY2hlZFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlICE9IHJlYWxQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNhY2hlcyB0aGUgbTN1OCBpZiBpdCBkb2Vzbid0IGhhdmUgYWRzLiBJZiB0aGUgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBoYXMgYWRzIGl0IGZldGNoZXMgYSBuZXcgdmVyc2lvbiAoc2Vjb25kIGxvb3ApCiAgICAgICAgICAgICAgICAgICAgbGV0IGlzRnJlc2hNM3U4ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgbGV0IGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVuY29kaW5nc00zdTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNGcmVzaE0zdTggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBDb2xkVG9rZW5GZXRjaGVzKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblJlc3BvbnNlID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oc3RyZWFtSW5mby5DaGFubmVsTmFtZSwgcmVhbFBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCByZXR1cm5zIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gaW4gdHdvIG9ic2VydmVkIHNoYXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IChmbGF0dGVyLCBvYnNlcnZlZCBmb3IgJ2VtYmVkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgZWl0aGVyLiBGaWVsZC1vYnNlcnZlZCBzaWxlbnRseSBkcm9wcGluZyBlbWJlZCBiYWNrdXAgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNwYXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IGFjY2Vzc1Rva2VuPy5lcnJvcnMgPyAnIGVycm9yczogJyArIEpTT04uc3RyaW5naWZ5KGFjY2Vzc1Rva2VuLmVycm9ycykuc3Vic3RyaW5nKDAsIDMwMCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlICsgJy4gUmVzcG9uc2Uga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGFjY2Vzc1Rva2VuIHx8IHt9KSkgKyBlcnJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5GYWlsZWRCYWNrdXBQbGF5ZXJUeXBlcy5zZXQocmVhbFBsYXllclR5cGUsIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyA+PSAzICYmICFzdHJlYW1JbmZvLkxvZ2dlZFRva2VuRmFpbHVyZVN0cmVhaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVG9rZW4gZmV0Y2ggZmFpbGVkICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzICsgJyB0aW1lcyBjb25zZWN1dGl2ZWx5IGFjcm9zcyBwbGF5ZXIgdHlwZXMg4oCUIHBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gLyBpbnRlZ3JpdHkgcm90YXRpb24gLyByYXRlIGxpbWl0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvJyArIChWMkFQSSA/ICd2Mi8nIDogJycpICsgJ2NoYW5uZWwvaGxzLycgKyBzdHJlYW1JbmZvLkNoYW5uZWxOYW1lICsgJy5tM3U4JyArIHN0cmVhbUluZm8uVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCBzcGF0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXSA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGRldGVjdGlvbiBkaWFnbm9zdGljIGNvdW50ZXIgb24gc3VjY2VzcyDigJQgdG9rZW4gZmV0Y2hlZCwgbTN1OCBmZXRjaGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVc2hlciBIVFRQICcgKyBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHJlYWxQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvckJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBlcnJvckJvZHkgPSAnIOKAlCAnICsgKGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UudGV4dCgpKS5zdWJzdHJpbmcoMCwgMjAwKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFjY2VzcyB0b2tlbiBIVFRQICcgKyBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyByZWFsUGxheWVyVHlwZSArIChhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzID8gJyAoaW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICdwcmVzZW50JyA6ICdtaXNzaW5nJykgKyAnKScgOiAnJykgKyBlcnJvckJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFpbGVkQmFja3VwUGxheWVyVHlwZXMuc2V0KHJlYWxQbGF5ZXJUeXBlLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID49IDMgJiYgIXN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVG9rZW4gZmV0Y2ggZmFpbGVkICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzICsgJyB0aW1lcyBjb25zZWN1dGl2ZWx5IGFjcm9zcyBwbGF5ZXIgdHlwZXMg4oCUIHBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gLyBpbnRlZ3JpdHkgcm90YXRpb24gLyByYXRlIGxpbWl0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFjY2VzcyB0b2tlbiBmYWlsZWQgZm9yICcgKyByZWFsUGxheWVyVHlwZSArICc6ICcgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhaWxlZEJhY2t1cFBsYXllclR5cGVzLnNldChyZWFsUGxheWVyVHlwZSwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID0gKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgPj0gMyAmJiAhc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZFRva2VuRmFpbHVyZVN0cmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gVG9rZW4gZmV0Y2ggZmFpbGVkICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzICsgJyB0aW1lcyBjb25zZWN1dGl2ZWx5IGFjcm9zcyBwbGF5ZXIgdHlwZXMg4oCUIHBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gLyBpbnRlZ3JpdHkgcm90YXRpb24gLyByYXRlIGxpbWl0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKGVuY29kaW5nc00zdTgsIGN1cnJlbnRSZXNvbHV0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThUZXh0ID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobTN1OFRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllclR5cGUgPT0gRmFsbGJhY2tQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFja00zdTggPSBtM3U4VGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFoYXNBZFRhZ3MobTN1OFRleHQpICYmIChTaW11bGF0ZWRBZHNEZXB0aCA9PSAwIHx8IHBsYXllclR5cGVJbmRleCA+PSBTaW11bGF0ZWRBZHNEZXB0aCAtIDEpKSB8fCAoIWZhbGxiYWNrTTN1OCAmJiBwbGF5ZXJUeXBlSW5kZXggPj0gcGxheWVyVHlwZXNUb1RyeS5sZW5ndGggLSAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSAxICYmICFoYXNBZFRhZ3MobTN1OFRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldlR5cGUgPSBzdHJlYW1JbmZvLkxhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2VHlwZSAmJiBwcmV2VHlwZSAhPT0gcGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDeWNsZSBzd2l0Y2hlZCB0byBkaWZmZXJlbnQgY2xlYW4gdHlwZSAoJyArIHBsYXllclR5cGUgKyAnLCB3YXMgJyArIHByZXZUeXBlICsgJykgZHVyaW5nIGZyZWV6ZSDigJQgcmVjb3ZlcmVkIHdpdGhvdXQgcmVsb2FkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbWFyayBhcyBjeWNsZS1yZXNjdWVkIHdoZW4gd2UgQUNUVUFMTFkgc3dpdGNoZWQgcGxheWVyIHR5cGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXR1cmFsIHJlY292ZXJ5IChzYW1lIHR5cGUgYmVjYW1lIGNsZWFuKSBzdGlsbCBuZWVkcyB0aGUgZW5kLW9mLWJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbG9hZCB0byByZWZyZXNoIHRoZSBwbGF5ZXIgYnVmZmVyIOKAlCBza2lwcGluZyBpdCBsZWF2ZXMgdGhlIHBsYXllcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHVjayB3aXRoIGxvdyBidWZmZXIgYW5kIHRoZSBidWZmZXIgbW9uaXRvciB1bmFibGUgdG8gcmVjb3Zlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DeWNsZVJlc2N1ZWRUaGlzQnJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNhbWUgYmFja3VwIHR5cGUgKCcgKyBwbGF5ZXJUeXBlICsgJykgYmVjYW1lIGNsZWFuIGR1cmluZyBmcmVlemUg4oCUIG5hdHVyYWwgcmVjb3ZlcnknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBQbGF5ZXJUeXBlID0gcGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cE0zdTggPSBtM3U4VGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3MobTN1OFRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlKSBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZSA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuaGFzKHBsYXllclR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuYWRkKHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gKCcgKyBwbGF5ZXJUeXBlICsgJykgYWxzbyBoYXMgYWRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbHlDYWNoZWRQbGF5ZXJUeXBlIHx8IGlzRG9pbmdNaW5pbWFsUmVxdWVzdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3ljbGUgdGhyb3VnaCBhbGwgcGxheWVyIHR5cGVzIGxvb2tpbmcgZm9yIGEgY2xlYW4gYmFja3VwLiBPbmx5IGNvbW1pdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBhZC1sYWRlbiBiYWNrdXAgYXMgYSBsYXN0IHJlc29ydCB3aGVuIHdlJ3ZlIGV4aGF1c3RlZCBhbGwgb3B0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFIgIzg5IHByZXZpb3VzbHkgY29tbWl0dGVkIHRoZSBmaXJzdCBhZC1sYWRlbiB0eXBlIGltbWVkaWF0ZWx5IOKAlCB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlZCB0aGUgdjU4IGZyZWV6ZSByZWdyZXNzaW9uIChpc3N1ZSAjMTEyKSBiZWNhdXNlIHRoZSBzdHJpcCtyZWNvdmVyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHdvdWxkIGVuZ2FnZSBldmVuIHdoZW4gYSBjbGVhbiBhbHRlcm5hdGUgd2FzIGF2YWlsYWJsZSBvbiBhbm90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYXllciB0eXBlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQWRUYWdzKG0zdThUZXh0KSAmJiBwbGF5ZXJUeXBlSW5kZXggPj0gcGxheWVyVHlwZXNUb1RyeS5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBbGwgYmFja3VwIHBsYXllciB0eXBlcyBhZC1sYWRlbiDigJQgdGFraW5nICcgKyBwbGF5ZXJUeXBlICsgJyBhcyBsYXN0LXJlc29ydCBmYWxsYmFjayAoc3RyaXArcmVjb3ZlcnkgcGF0aCB3aWxsIGVuZ2FnZSknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gZmV0Y2ggZmFpbGVkIGZvciAnICsgcGxheWVyVHlwZSArICcgKHN0YXR1cyAnICsgc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyArICcpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQmFja3VwIHN0cmVhbSBlcnJvciBmb3IgJyArIHBsYXllclR5cGUgKyAnOiAnICsgZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNGcmVzaE0zdTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYmFja3VwTTN1OCAmJiBmYWxsYmFja00zdTgpIHsKICAgICAgICAgICAgICAgIC8vIERvbid0IGZhbGwgYmFjayB0byBhIHR5cGUgd2UndmUgYWxyZWFkeSBtYXJrZWQgY29udGFtaW5hdGVkIHRoaXMgYnJlYWsuCiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgZ3VhcmQsIHdoZW4gYWxsIFNvdXJjZSB0eXBlcyBnbyBhZC1sYWRlbiBtaWQtYnJlYWsgdGhlIGl0ZXJhdGlvbgogICAgICAgICAgICAgICAgLy8gZW5kcyB3aXRoIG5vIGNsZWFuIGNvbW1pdCBBTkQgZmFsbGJhY2tNM3U4IHN0aWxsIHBvaW50aW5nIGF0IEZhbGxiYWNrUGxheWVyVHlwZSdzCiAgICAgICAgICAgICAgICAvLyBhZC1sYWRlbiBtM3U4IOKAlCB3ZSdkIHNpbGVudGx5IHJlLWNvbW1pdCB0aGUgc2FtZSBjb250YW1pbmF0ZWQgc2l0ZSBvbiBldmVyeSBwb2xsCiAgICAgICAgICAgICAgICAvLyAobm8gIkJsb2NraW5nIGFkcyIgbG9nIGJlY2F1c2UgQWN0aXZlQmFja3VwUGxheWVyVHlwZSB1bmNoYW5nZWQpLCBhbmQgdGhlIHVzZXIKICAgICAgICAgICAgICAgIC8vIHNlZXMgdGhlIGZ1bGwgYWQgcG9kIHdpdGggbm8gaW5kaWNhdGlvbiBvZiBmYWlsdXJlLiBCZXR0ZXIgdG8gbGVhdmUgYmFja3VwTTN1OAogICAgICAgICAgICAgICAgLy8gbnVsbCBhbmQgbGV0IHRoZSAiTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIiBsb2cgZmlyZSBzbyBpdCdzIHZpc2libGUuCiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUgJiYgc3RyZWFtSW5mby5Mb2dnZWRCYWNrdXBBZHNCeVR5cGUuaGFzKEZhbGxiYWNrUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyBmYWxsYmFjayB0byAnICsgRmFsbGJhY2tQbGF5ZXJUeXBlICsgJyDigJQgbWFya2VkIGNvbnRhbWluYXRlZCB0aGlzIGJyZWFrICgnICsgWy4uLnN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlXS5qb2luKCcsICcpICsgJyBhbGwgYWQtbGFkZW4pJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBGYWxsYmFja1BsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IGZhbGxiYWNrTTN1ODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTdGFsZS1jb21taXQgZ3VhcmQ6IG11bHRpcGxlIHByb2Nlc3NNM1U4IGNhbGxzIGNhbiBiZSBpbiBmbGlnaHQgY29uY3VycmVudGx5IGZvcgogICAgICAgICAgICAvLyB0aGUgc2FtZSBzdHJlYW1JbmZvIChvbmUgcGVyIG0zdTggcG9sbCkuIElmIHRoaXMgYmFja3VwIHNlYXJjaCBzdGFydGVkIGR1cmluZyB0aGUKICAgICAgICAgICAgLy8gYWQgYnJlYWsgYnV0IGNvbXBsZXRlZCBBRlRFUiBhIGxhdGVyIHBvbGwgYWxyZWFkeSByYW4gdGhlIGVuZC1vZi1icmVhayByZXNldAogICAgICAgICAgICAvLyAoSXNTaG93aW5nQWQgPSBmYWxzZSwgQWN0aXZlQmFja3VwUGxheWVyVHlwZSA9IG51bGwpLCBjb21taXR0aW5nIHRoZSBiYWNrdXAgaGVyZQogICAgICAgICAgICAvLyB3b3VsZCBvdmVyd3JpdGUgdGhlIGNsZWFyZWQgc3RhdGUgYW5kIGZlZWQgc3RhbGUgcGxheWxpc3QgZGF0YSB0byB0aGUgcGxheWVyLAogICAgICAgICAgICAvLyBjYXVzaW5nIGJ1ZmZlciByZWNvbmNpbGlhdGlvbiBmYWlsdXJlcyBhbmQgYSBmb3JjZWQgcmVsb2FkLiBDaGVjayBJc1Nob3dpbmdBZAogICAgICAgICAgICAvLyBoZXJlIHRvIGRpc2NhcmQgc3RhbGUgcmVzdWx0cy4KICAgICAgICAgICAgaWYgKGJhY2t1cE0zdTggJiYgc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGJhY2t1cE0zdTg7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDb21taXR0ZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUgIT0gYmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQWN0aXZlQmFja3VwUGxheWVyVHlwZSA9IGJhY2t1cFBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlUXVhbGl0eVR5cGVzID0gWydlbWJlZCcsICdzaXRlJywgJ3BvcG91dCddOwogICAgICAgICAgICAgICAgICAgIC8vIE5ldmVyIHBpbiAnYXV0b3BsYXknIOKAlCBtdXN0IHN0YXkgYXQgdGhlIGxhc3QgcG9zaXRpb24gaW4gcGxheWVyVHlwZXNUb1RyeQogICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBpdGVyYXRpb24tZW5kIGxhc3QtcmVzb3J0IGJyYW5jaCBjb21taXRzIGl0IHdoZW4gYWxsIFNvdXJjZSB0eXBlcwogICAgICAgICAgICAgICAgICAgIC8vIGFyZSBhZC1sYWRlbiAoaW50ZW5kZWQgMzYwcCBjbGVhbiBmYWxsYmFjaykuIFBpbm5pbmcgd291bGQgbW92ZSBpdCB0bwogICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIDAgYW5kIGEgZGlmZmVyZW50IGFkLWxhZGVuIFNvdXJjZSB0eXBlIHdvdWxkIGJlIGNvbW1pdHRlZCBpbnN0ZWFkLgogICAgICAgICAgICAgICAgICAgIGlmICgoUGluQmFja3VwUGxheWVyVHlwZSAmJiBiYWNrdXBQbGF5ZXJUeXBlICE9PSAnYXV0b3BsYXknKSB8fCBzb3VyY2VRdWFsaXR5VHlwZXMuaW5jbHVkZXMoYmFja3VwUGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlID0gYmFja3VwUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtBRCBERUJVR10gQmxvY2tpbmckeyhzdHJlYW1JbmZvLklzTWlkcm9sbCA/ICcgbWlkcm9sbCAnIDogJyAnKX1hZHMgKCR7YmFja3VwUGxheWVyVHlwZX0pIOKAlCBiYWNrdXAgZm91bmQgaW4gJHtEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnR9bXMke2JhY2t1cENvbGRUb2tlbkZldGNoZXMgPiAwID8gYCAoY29sZCBjYWNoZTogJHtiYWNrdXBDb2xkVG9rZW5GZXRjaGVzfSB0b2tlbiBmZXRjaCR7YmFja3VwQ29sZFRva2VuRmV0Y2hlcyA+IDEgPyAnZXMnIDogJyd9KWAgOiAnICh3YXJtIGNhY2hlKSd9YCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uRXNjYXBlSGF0Y2hGaXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5VGllciA9IGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgPyAnMzYwcCcgOiAnU291cmNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1lc2NhcGUgYmFja3VwOiAnICsgYmFja3VwUGxheWVyVHlwZSArICcgKCcgKyBxdWFsaXR5VGllciArICcpIOKAlCByZWNvdmVyZWQgZnJvbSBzdGlja3ktcGF0aCBmcmVlemUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheScgJiYgUHJlZmVyTG93UXVhbGl0eUJhY2t1cCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VUcmllZCA9IHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlPy5zaXplIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUcmllZCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQXV0b3BsYXkgYmFja3VwIGNvbW1pdHRlZCDigJQgMzYwcCBwaW5uZWQgZnJvbSBwcmlvciBicmVhayAoUHJlZmVyTG93UXVhbGl0eUJhY2t1cCknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhc3QtYXV0b3BsYXkgd29uIHdpdGhvdXQgdGVzdGluZyBTb3VyY2UtdGllciDigJQgaW5jcmVtZW50IHJlLXByb2JlIGNvdW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRmFzdEF1dG9wbGF5Q29uc2VjdXRpdmUgPSAoc3RyZWFtSW5mby5GYXN0QXV0b3BsYXlDb25zZWN1dGl2ZSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvcGxheSBiYWNrdXAgY29tbWl0dGVkIOKAlCAzNjBwIGZhbGxiYWNrIGFmdGVyICcgKyBzb3VyY2VUcmllZCArICcgU291cmNlIHR5cGUocykgYWQtbGFkZW4gKFByZWZlckxvd1F1YWxpdHlCYWNrdXApJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFzdEF1dG9wbGF5Rmlyc3RUcnkgc2lnbmFsOiBvbmx5IGZsYWcgU1NBSS11bmlmb3JtIHdoZW4gNCBTb3VyY2UgdHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VyZSBwcm9iZWQgYW5kIGFsbCBjb250YW1pbmF0ZWQuIFBpbm5lZC1mcm9tLXByaW9yLWJyZWFrIChzb3VyY2VUcmllZD09MCkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBhZGQgbmV3IGluZm8uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGYXN0QXV0b3BsYXlGaXJzdFRyeSAmJiBzb3VyY2VUcmllZCA+PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RCcmVha1VzZWRFc2NhcGVIYXRjaCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdWxsIHByb2JlIGp1c3QgcmFuIOKAlCByZXNldCByZS1wcm9iZSBjb3VudGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhc3RBdXRvcGxheUNvbnNlY3V0aXZlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRmFzdEF1dG9wbGF5Rmlyc3RUcnkgJiYgYmFja3VwUGxheWVyVHlwZSAhPT0gJ2F1dG9wbGF5JykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBTb3VyY2UtdGllciB3b24g4oCUIGNoYW5uZWwgcmVjb3ZlcmVkLCByZXNldCBzaWduYWwgKyByZS1wcm9iZSBjb3VudGVyLgogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RCcmVha1VzZWRFc2NhcGVIYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkZhc3RBdXRvcGxheUNvbnNlY3V0aXZlID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFja3VwTTN1OCAmJiAhc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRGlzY2FyZGVkIHN0YWxlIGJhY2t1cCBjb21taXQgKCcgKyBiYWNrdXBQbGF5ZXJUeXBlICsgJywgJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zKSDigJQgYnJlYWsgZW5kZWQgZHVyaW5nIHNlYXJjaCcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm8gYWQtZnJlZSBiYWNrdXAgc3RyZWFtIGZvdW5kIOKAlCBhZHMgbWF5IGxlYWsuIFRyaWVkOiAnICsgcGxheWVyVHlwZXNUb1RyeS5zbGljZShzdGFydEluZGV4KS5qb2luKCcsICcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPOiBJbXByb3ZlIGhldmMgc3RyaXBwaW5nLiBJdCBzaG91bGQgYWx3YXlzIHN0cmlwIHdoZW4gdGhlcmUgaXMgYSBjb2RlYyBtaXNtYXRjaCAoYm90aCB3YXlzKQogICAgICAgICAgICBjb25zdCBzdHJpcEhldmMgPSBpc0hldmMgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTg7CiAgICAgICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCB8fCBzdHJpcEhldmMpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgc3RyaXBIZXZjLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghYmFja3VwTTN1OCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWQgc3RyaXBwaW5nIGRpc2FibGVkIGFuZCBubyBiYWNrdXAg4oCUIGFkcyBXSUxMIHNob3cnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBMb2cgcmVsb2FkIG91dGNvbWUgb24gdGhlIHBvbGwgYWZ0ZXIgZWFybHkgcmVsb2FkIHRyaWdnZXJlZAogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FYXJseVJlbG9hZEF3YWl0aW5nUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpICYmIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRWFybHkgcmVsb2FkIHJlc3VsdDogcGFydGlhbCDigJQgc29tZSBsaXZlIHNlZ21lbnRzIHJldHVybmVkJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEVhcmx5IHJlbG9hZCByZXN1bHQ6IGNsZWFuIOKAlCBmcmVlemUgZW5kZWQnKTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0cmlnZ2VyIGZsYWcgc28gc3Vic2VxdWVudCBmcmVlemVzIHdpdGhpbiB0aGUgc2FtZSBwb2QgY2FuIHJlLWZpcmUgKGJvdW5kZWQgYnkgRWFybHlSZWxvYWRDb3VudC9Qb2RMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgcmVzdWx0OiBzdGlsbCBhZHMg4oCUIGNvbnRpbnVpbmcgcmVjb3ZlcnkgbG9vcCcpOwogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFYXJseSByZWxvYWQgZHVyaW5nIHByb2xvbmdlZCBmcmVlemU6IGlmIHdlJ3ZlIGJlZW4gbG9vcGluZyByZWNvdmVyeSBzZWdtZW50cwogICAgICAgICAgICAvLyBmb3IgTisgcG9sbHMgKH5OeDJzKSwgdHJpZ2dlciBhIHJlbG9hZCB0byBhdHRlbXB0IGZyZXNoIGNvbnRlbnQuIEJvdW5kZWQgdG8gb25lCiAgICAgICAgICAgIC8vIHJlbG9hZCBwZXIgYWQgaW4gdGhlIHBvZCAoZS5nLiAyLWFkIHBvZCA9IHVwIHRvIDIgZWFybHkgcmVsb2FkcykuCiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IG1heEVhcmx5UmVsb2FkcyA9IHJlY292ZXJ5VGhpbiA/IE1hdGgubWF4KDIsIHN0cmVhbUluZm8uUG9kTGVuZ3RoIHx8IDEpIDogTWF0aC5tYXgoMSwgc3RyZWFtSW5mby5Qb2RMZW5ndGggfHwgMSk7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSA+PSBlZmZlY3RpdmVUaHJlc2hvbGQgJiYgIXN0cmVhbUluZm8uRWFybHlSZWxvYWRUcmlnZ2VyZWQgJiYgKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSA8IG1heEVhcmx5UmVsb2FkcykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ID0gKHN0cmVhbUluZm8uRWFybHlSZWxvYWRDb3VudCB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXRQb2xsID0gc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgfHwgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHM7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24gKyAnIFsnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50ICsgJy8nICsgbWF4RWFybHlSZWxvYWRzICsgJ10nKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsga2V5OiAnUmVsb2FkUGxheWVyJywga2luZDogJ2Vhcmx5JyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAvLyBNYXJrIGZpcnN0IGNhbmRpZGF0ZS1lbmQgdGltZXN0YW1wIG9uIHRoZSBmaXJzdCBjbGVhbiBwb2xsIHNlZW4gdGhpcyBicmVhaywKICAgICAgICAgICAgLy8gc28gdGhlIHNsb3ctcGF0aCBtYXgtd2FpdCBnYXRlIGJlbG93IGNhbiBmaXJlIGV2ZW4gaWYgc3Vic2VxdWVudCBwb2xscyBib3VuY2UKICAgICAgICAgICAgLy8gYmFjayB0byBhZC1tYXJrZWQuIFRoZSBib3VuY2UtdG9sZXJhbnQgaGF2ZUFkVGFncyByZXNldCBrZWVwcyB0aGlzIGFsaXZlCiAgICAgICAgICAgIC8vIGFjcm9zcyBzaG9ydCBmbGlwcy4gTWlycm9ycyBUVFYtQUIgdjYuNi43ICMxLgogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cmVhbUluZm8uQ2xlYW5QbGF5bGlzdENvdW50Kys7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHBsYXlsaXN0IGhhcyBsaXZlIHNlZ21lbnRzIOKAlCBpZiBub3QsIGJhY2t1cCBzdHJlYW0gaXMgZGVhZAogICAgICAgICAgICBjb25zdCBoYXNMaXZlU2VnbWVudHMgPSB0ZXh0U3RyLmluY2x1ZGVzKCcsbGl2ZScpOwogICAgICAgICAgICAvLyBJbmRlcGVuZGVudCBzbG93LXBhdGggbWF4LXdhaXQgZXNjYWxhdGlvbiDigJQgZW5kcyB0aGUgdmlzaWJsZSBhZCBjeWNsZSBldmVuIHdoZW4KICAgICAgICAgICAgLy8gbWFya2VyIGJvdW5jaW5nIGtlZXBzIENsZWFuUGxheWxpc3RDb3VudCBiZWxvdyB0aHJlc2hvbGQuIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllcgogICAgICAgICAgICAvLyBjb3VsZCBiZSB3ZWRnZWQgb24gYmFja3VwIGluZGVmaW5pdGVseSBvbiBjaGFubmVscyB3aGVyZSBUd2l0Y2ggZmxpcHMgbWFya2VycwogICAgICAgICAgICAvLyBpbi9vdXQgZmFzdGVyIHRoYW4gMyBjb25zZWN1dGl2ZSBjbGVhbiBwb2xscyBjYW4gbGFuZC4gTWlycm9ycyBUVFYtQUIgdjYuNi43ICM0CiAgICAgICAgICAgIC8vICgiRGVjb3VwbGVkIFNsb3ctUGF0aCBSZWNvdmVyeSBmcm9tIENsZWFuLUNvdW50IikuCiAgICAgICAgICAgIGNvbnN0IGFkRW5kTWF4V2FpdE1zID0gMTIwMDA7CiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRTaW5jZUNhbmRpZGF0ZSA9IERhdGUubm93KCkgLSBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0OwogICAgICAgICAgICBjb25zdCBzbG93UGF0aFJlYWR5ID0gc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA+IDAgJiYgZWxhcHNlZFNpbmNlQ2FuZGlkYXRlID49IGFkRW5kTWF4V2FpdE1zOwogICAgICAgICAgICAvLyBSZXF1aXJlIDMgY29uc2VjdXRpdmUgY2xlYW4gcG9sbHMgYmVmb3JlIGRlY2xhcmluZyBhZC1lbmQuIFByZXZpb3VzbHkgb25seSAxCiAgICAgICAgICAgIC8vIHdoZW4gTnVtU3RyaXBwZWRBZFNlZ21lbnRzID09PSAwIChDU0FJLW9ubHkgLyBiYWNrdXAtc3dhcCBwYXRoKSBhbmQgMiBvdGhlcndpc2UsCiAgICAgICAgICAgIC8vIHdoaWNoIGxldCBicmllZiBjbGVhbiB3aW5kb3dzIGR1cmluZyBvbmdvaW5nIGJyZWFrcyBmbGlwIElzU2hvd2luZ0FkIGZhbHNlCiAgICAgICAgICAgIC8vIHByZW1hdHVyZWx5IG9uIFNTQUktdW5pZm9ybSBjaGFubmVscy4gVFRWLUFCIGhpdCB0aGUgc2FtZSBmYWxzZS1wb3NpdGl2ZSBhdCAyCiAgICAgICAgICAgIC8vIHByb2JlcyBhbmQgYnVtcGVkIHRvIDMgaW4gdjYuNi43ICgiQWQtRW5kIFJlLUVudHJ5IFN0YWJpbGl0eSIpIOKAlCBUd2l0Y2ggY2FuCiAgICAgICAgICAgIC8vIHNlcnZlIGEgY2xlYW4gcGxheWxpc3QgbWlkLWJyZWFrIGJlZm9yZSByZS1pbmplY3RpbmcgbWFya2VycywgYW5kIDIgcG9sbHMKICAgICAgICAgICAgLy8gKH40cykgd2Fzbid0IGFsd2F5cyBlbm91Z2ggdG8gcmlkZSBvdXQgdGhlIGJvdW5jZS4KICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQ2xlYW5QbGF5bGlzdENvdW50ID49IDMgfHwgIWhhc0xpdmVTZWdtZW50cyB8fCBzbG93UGF0aFJlYWR5KSB7CiAgICAgICAgICAgICAgICBpZiAoc2xvd1BhdGhSZWFkeSAmJiBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA8IDMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTbG93LXBhdGggYWQtZW5kIGVzY2FsYXRpb24g4oCUICcgKyAoc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50IHx8IDApICsgJyBtYXJrZXIgYm91bmNlcywgJyArIChlbGFwc2VkU2luY2VDYW5kaWRhdGUgLyAxMDAwKS50b0ZpeGVkKDEpICsgJ3Mgc2luY2UgZmlyc3QgY2xlYW4gcG9sbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFoYXNMaXZlU2VnbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBCYWNrdXAgc3RyZWFtIGhhcyBubyBsaXZlIHNlZ21lbnRzIOKAlCBmb3JjaW5nIGltbWVkaWF0ZSByZWxvYWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGFkQnJlYWtEdXJhdGlvblNlYyA9IHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCA/ICgoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uQWRCcmVha1N0YXJ0ZWRBdCkgLyAxMDAwKS50b0ZpeGVkKDEpIDogJz8nOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmluaXNoZWQgYmxvY2tpbmcgYWRzIOKAlCBzdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLCBkdXJhdGlvbjogJyArIGFkQnJlYWtEdXJhdGlvblNlYyArICdzJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkSW5mbyA9IHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPyAnLCBlYXJseSByZWxvYWQgYXQgcG9sbCAnICsgc3RyZWFtSW5mby5FYXJseVJlbG9hZEF0UG9sbCA6ICcnOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhbGxDbG9ja0ZyZWV6ZSA9IHN0cmVhbUluZm8uRnJlZXplU3RhcnRlZEF0ID8gKChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5GcmVlemVTdGFydGVkQXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHdhbGwtY2xvY2snIDogJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIGJyZWFrIHN0YXRzOiAnICsgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgKyAnIGFsbC1zdHJpcHBlZCBwb2xscywgZnJlZXplIGR1cmF0aW9uOiAnICsgd2FsbENsb2NrRnJlZXplICsgcmVsb2FkSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBoYWRTdHJpcHBlZFNlZ21lbnRzID0gc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPiAwOwogICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbCBhZHMKICAgICAgICAgICAgICAgIC8vIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICBpZiAoIWhhZFN0cmlwcGVkU2VnbWVudHMgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhZFN0cmlwcGVkU2VnbWVudHMgfHwgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgaXMgc3ltbWV0cmljIHdpdGggdGhlIGluY3JlbWVudCBndWFyZCBhYm92ZSDigJQgYW55IHBvc2l0aXZlICJicmVhawogICAgICAgICAgICAgICAgICAgIC8vIHdhcyBoYW5kbGVkIGNsZWFubHkiIHNpZ25hbCByZXNldHMgdGhlIGZhbHNlLXBvc2l0aXZlIGhpc3RvcnkuIFByZXZpb3VzbHkKICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHN0cmlwcGVkPjAgcmVzZXQgdGhlIGNvdW50ZXIsIHdoaWNoIGxldCBzdGFsZSBzdXNwaWNpb3VzIGhpc3RvcnkKICAgICAgICAgICAgICAgICAgICAvLyBibGVlZCBhY3Jvc3MgbGVnaXRpbWF0ZWx5LWhhbmRsZWQgYmFja3VwLXN3YXAgYnJlYWtzICgwIHN0cmlwcGVkICsgcmVhbAogICAgICAgICAgICAgICAgICAgIC8vIGFkIGF0dHJzKSBhbmQgdHJpZ2dlciB0aGUgd2FybmluZyBvbiBwYXJ0aWFsbHktc3RhbGUgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU2hvd2luZ0FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzPy5jbGVhcj8uKCk7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlNwb29mZWRBZElkcz8uY2xlYXI/LigpOy8vIE5ldyBicmVhayA9IGZyZXNoIGFkLXNwb29mIGRlZHVwIHNldAogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5GYWlsZWRCYWNrdXBQbGF5ZXJUeXBlcz8uY2xlYXI/LigpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTG9nZ2VkQmFja3VwQWRzQnlUeXBlKSBzdHJlYW1JbmZvLkxvZ2dlZEJhY2t1cEFkc0J5VHlwZS5jbGVhcigpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRDb250YW1SZW9yZGVyVGhpc0JyZWFrID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0ID0gMDsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQWRFbmRCb3VuY2VDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkQXdhaXRpbmdSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRWFybHlSZWxvYWRBdFBvbGwgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Ub3RhbEFsbFN0cmlwcGVkUG9sbHMgPSAwOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Dc2FpT25seVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Fc2NhcGVIYXRjaEZpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRGYXN0QXV0b3BsYXlUaGlzQnJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTG9nZ2VkRmFzdEF1dG9wbGF5UmVwcm9iZVRoaXNCcmVhayA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gQ1NBSS1vbmx5IGFkIGJyZWFrOiBubyBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkIOKAlCBza2lwIHJlbG9hZCBlbnRpcmVseS4KICAgICAgICAgICAgICAgIGlmICghaGFkU3RyaXBwZWRTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENTQUktb25seSBhZCBicmVhayAoc3RyaXBwZWQgMCkg4oCUIGNsZWFyaW5nIGJhY2t1cCB3aXRob3V0IHBsYXllciBhY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb246IGlmIEFOWSBiYWNrdXAgd2FzIGNvbW1pdHRlZCBkdXJpbmcgdGhpcyBicmVhayAoZXNjYXBlIGhhdGNoCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgY3ljbGUgcmVzY3VlIHRoYXQgZGlkbid0IG1lZXQgY3ljbGVSZXNjdWVkQ2xlYW5seSBjcml0ZXJpYSksIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU291cmNlIGJ1ZmZlciBoYXMgYWNjdW11bGF0ZWQgbWl4ZWQtc291cmNlIHNlZ21lbnRzIChiYWNrdXAtZmV0Y2hlZAogICAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbHRlcm5hdGUgcGxheWVyLXR5cGUgYWNjZXNzIHRva2VuICsgbmF0aXZlLWZldGNoZWQpLiBNaXhpbmcgY2FuCiAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgYXVkaW8vdmlkZW8gdHJhY2sgdGltZXN0YW1wcyB0byBkaXZlcmdlLCBhbmQgd2l0aG91dCBhIHJlbG9hZCB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBkcmlmdCBjb21wb3VuZHMgYWNyb3NzIHN1YnNlcXVlbnQgZXNjYXBlLWhhdGNoIGJyZWFrcy4gRm9yY2UgYSBoYXJkIHJlbG9hZAogICAgICAgICAgICAgICAgICAgIC8vIHRvIGZsdXNoIHRoZSBNZWRpYVNvdXJjZSBidWZmZXIgKyByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9wbGF5ICgzNjBwKSBzcGVjaWZpY2FsbHksIHRoZSByZWxvYWQgYWxzbyByZXN0b3JlcyBTb3VyY2UKICAgICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IChhdXRvcGxheS1zY29wZWQgdG9rZW4gb25seSBzZXJ2ZXMgMzYwcCB2YXJpYW50IGxhZGRlcikuCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBdXRvcGxheSA9IHN0cmVhbUluZm8uTGFzdENvbW1pdHRlZEJhY2t1cFBsYXllclR5cGUgPT09ICdhdXRvcGxheSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGlzQXV0b3BsYXkgPyAnYXV0b3BsYXkgKDM2MHApIOKAlCByZXN0b3JpbmcgU291cmNlIHF1YWxpdHknIDogc3RyZWFtSW5mby5MYXN0Q29tbWl0dGVkQmFja3VwUGxheWVyVHlwZSArICcg4oCUIGZsdXNoaW5nIE1lZGlhU291cmNlIHRvIHByZXZlbnQgQS9WIGRlc3luYyBhY2N1bXVsYXRpb24nOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFbmQtb2YtYnJlYWsgcmVsb2FkOiAnICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMpIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMucHVzaChEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyBrZXk6ICdSZWxvYWRQbGF5ZXInLCBraW5kOiAnZWFybHknIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBdXRvLWVzY2FsYXRlIGNvb2xkb3duOiBpZiAzKyByZWxvYWRzIGluIGxhc3QgNSBtaW4sIHRyaXBsZSB0aGUgY29vbGRvd24KICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzKSBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMgPSBbXTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcyA9IHN0cmVhbUluZm8uUmVsb2FkVGltZXN0YW1wcy5maWx0ZXIodCA9PiBEYXRlLm5vdygpIC0gdCA8IDMwMDAwMCk7CiAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWRzID0gc3RyZWFtSW5mby5SZWxvYWRUaW1lc3RhbXBzLmZpbHRlcih0ID0+IERhdGUubm93KCkgLSB0IDwgMzAwMDAwKS5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVDb29sZG93biA9IHJlY2VudFJlbG9hZHMgPj0gMyA/IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDMgOiBSZWxvYWRDb29sZG93blNlY29uZHM7CiAgICAgICAgICAgICAgICBjb25zdCB0b29Tb29uU2luY2VMYXN0UmVsb2FkID0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkICYmIChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkKSA8IChlZmZlY3RpdmVDb29sZG93biAqIDEwMDApOwogICAgICAgICAgICAgICAgLy8gU2tpcCBlbmQtb2YtYnJlYWsgcmVsb2FkIHdoZW4gY3ljbGUgcmVzY3VlIGhhbmRsZWQgdGhlIGJyZWFrIGNsZWFubHk6CiAgICAgICAgICAgICAgICAvLyBhIGZyZWV6ZSBvZiDiiaQyIHBvbGxzICh+NHMpIHdhcyByZXNvbHZlZCBieSBzd2l0Y2hpbmcgdG8gYSBjbGVhbiBiYWNrdXAsCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gZWFybHkgcmVsb2FkIHdhcyBuZWVkZWQuIFRoZSBwbGF5ZXIgaXMgb24gYSBoZWFsdGh5IGJhY2t1cCBzdHJlYW0KICAgICAgICAgICAgICAgIC8vIOKAlCByZWxvYWRpbmcganVzdCB0byByZXR1cm4gdG8gdGhlIGNhbm9uaWNhbCBwbGF5ZXIgdHlwZSBjYXVzZXMgYW4gdW5uZWNlc3NhcnkKICAgICAgICAgICAgICAgIC8vIH4xLTJzIGxvYWRpbmcgY2lyY2xlLgogICAgICAgICAgICAgICAgY29uc3QgY3ljbGVSZXNjdWVkQ2xlYW5seSA9IHN0cmVhbUluZm8uQ3ljbGVSZXNjdWVkVGhpc0JyZWFrICYmCiAgICAgICAgICAgICAgICAgICAgKHN0cmVhbUluZm8uVG90YWxBbGxTdHJpcHBlZFBvbGxzIHx8IDApIDw9IDIgJiYKICAgICAgICAgICAgICAgICAgICAoc3RyZWFtSW5mby5FYXJseVJlbG9hZENvdW50IHx8IDApID09PSAwOwogICAgICAgICAgICAgICAgaWYgKGN5Y2xlUmVzY3VlZENsZWFubHkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDeWNsZSByZXNjdWUgaGFuZGxlZCB0aGUgYnJlYWsgY2xlYW5seSDigJQgc2tpcHBpbmcgZW5kLW9mLWJyZWFrIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUG9zdC1hZCByZWxvYWQgYnlwYXNzZXMgY29vbGRvd246IGl0J3MgYSBidWZmZXIgZmx1c2ggdGllZCB0byBuYXR1cmFsIGJyZWFrCiAgICAgICAgICAgICAgICAvLyBlbmQsIG5vdCBhIGNhc2NhZGUtcmlzayByZXRyeS4gVGhlIGFkIGJyZWFrIGN5Y2xlIGl0c2VsZiByYXRlLWxpbWl0cyB0aGlzCiAgICAgICAgICAgICAgICAvLyBwYXRoIChvbmNlIHBlciBicmVhaykuIENvb2xkb3duIHN0aWxsIGdhdGVzIGJ1ZmZlci1tb25pdG9yIGFuZCBvdGhlcgogICAgICAgICAgICAgICAgLy8gY2FzY2FkZS1yaXNrIHBhdGhzIHRoYXQgY2FuIGZpcmUgcmVwZWF0ZWRseSBpbi1icmVhay4KICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlbG9hZCA9IHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCB8fCAoUmVsb2FkUGxheWVyQWZ0ZXJBZCAmJiBoYWRTdHJpcHBlZFNlZ21lbnRzICYmICFjeWNsZVJlc2N1ZWRDbGVhbmx5KTsKICAgICAgICAgICAgICAgIGlmIChzaG91bGRSZWxvYWQpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlbG9hZFRpbWVzdGFtcHMucHVzaChEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnUmVsb2FkUGxheWVyJywKICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2Vhcmx5JwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAodG9vU29vblNpbmNlTGFzdFJlbG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIGxhc3QgcmVsb2FkIHdhcyAnICsgKChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkKSAvIDEwMDApLnRvRml4ZWQoMCkgKyAncyBhZ28gKGNvb2xkb3duOiAnICsgZWZmZWN0aXZlQ29vbGRvd24gKyAncycgKyAocmVjZW50UmVsb2FkcyA+PSAzID8gJywgYXV0by1lc2NhbGF0ZWQgZnJvbSAnICsgcmVjZW50UmVsb2FkcyArICcgcmVsb2FkcyBpbiA1bWluJyA6ICcnKSArICcpJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnUGF1c2VSZXN1bWVQbGF5ZXInCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9Ly8gZW5kIGVsc2UgKG5vbi1DU0FJIHBhdGgpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICBrZXk6ICdVcGRhdGVBZEJsb2NrQmFubmVyJywKICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgaGFzQWRzOiBzdHJlYW1JbmZvLklzU2hvd2luZ0FkLAogICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICBudW1TdHJpcHBlZEFkU2VnbWVudHM6IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzLAogICAgICAgICAgICBhY3RpdmVCYWNrdXBQbGF5ZXJUeXBlOiBzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKQogICAgICAgICAgICAubWFwKHggPT4gewogICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB4LnN1YnN0cmluZygwLCBpZHgpOwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB4LnN1YnN0cmluZyhpZHggKyAxKTsKICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXTsKICAgICAgICAgICAgfSkpOwogICAgfQogICAgLy8gUmVxdWVzdCBhIHBsYXliYWNrIGFjY2VzcyB0b2tlbiBmcm9tIFR3aXRjaCBHUUwgdXNpbmcgdGhlIGdpdmVuIHBsYXllciB0eXBlCiAgICBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbihjaGFubmVsTmFtZSwgcGxheWVyVHlwZSkgewogICAgICAgIGNvbnN0IGJvZHkgPSB7CiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdQbGF5YmFja0FjY2Vzc1Rva2VuJywKICAgICAgICAgICAgdmFyaWFibGVzOiB7CiAgICAgICAgICAgICAgICBpc0xpdmU6IHRydWUsCiAgICAgICAgICAgICAgICBsb2dpbjogY2hhbm5lbE5hbWUsCiAgICAgICAgICAgICAgICBpc1ZvZDogZmFsc2UsCiAgICAgICAgICAgICAgICB2b2RJRDogIiIsCiAgICAgICAgICAgICAgICBwbGF5ZXJUeXBlOiBwbGF5ZXJUeXBlLAogICAgICAgICAgICAgICAgcGxhdGZvcm06IHBsYXllclR5cGUgPT0gJ2F1dG9wbGF5JyA/ICdhbmRyb2lkJyA6ICd3ZWInCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV4dGVuc2lvbnM6IHsKICAgICAgICAgICAgICAgIHBlcnNpc3RlZFF1ZXJ5OiB7CiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjoxLAogICAgICAgICAgICAgICAgICAgIHNoYTI1Nkhhc2g6ImVkMjMwYWExZTMzZTA3ZWViYjg5Mjg1MDQ1ODNkYTc4YTUxNzM5ODlmYWRmYjFhYzk0YmUwNmEwNGYzY2RiZTkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBncWxSZXF1ZXN0KGJvZHkpOwogICAgfQogICAgLy8gU2VuZCBhIEdRTCByZXF1ZXN0IHRvIFR3aXRjaCB2aWEgdGhlIG1haW4gdGhyZWFkICh3b3JrZXJzIGNhbid0IG1ha2UgY3JlZGVudGlhbGVkIHJlcXVlc3RzKQogICAgZnVuY3Rpb24gZ3FsUmVxdWVzdChib2R5KSB7CiAgICAgICAgaWYgKCFHUUxEZXZpY2VJRCkgewogICAgICAgICAgICBHUUxEZXZpY2VJRCA9ICcnOwogICAgICAgICAgICBjb25zdCBkY2hhcmFjdGVycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBjb25zdCBkY2hhcmFjdGVyc0xlbmd0aCA9IGRjaGFyYWN0ZXJzLmxlbmd0aDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CiAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCArPSBkY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGNoYXJhY3RlcnNMZW5ndGgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgaGVhZGVycyA9IHsKICAgICAgICAgICAgJ0NsaWVudC1JRCc6IENsaWVudElELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBHUUxEZXZpY2VJRCwKICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBBdXRob3JpemF0aW9uSGVhZGVyLAogICAgICAgICAgICAuLi4oQ2xpZW50SW50ZWdyaXR5SGVhZGVyICYmIHsnQ2xpZW50LUludGVncml0eSc6IENsaWVudEludGVncml0eUhlYWRlcn0pLAogICAgICAgICAgICAuLi4oQ2xpZW50VmVyc2lvbiAmJiB7J0NsaWVudC1WZXJzaW9uJzogQ2xpZW50VmVyc2lvbn0pLAogICAgICAgICAgICAuLi4oQ2xpZW50U2Vzc2lvbiAmJiB7J0NsaWVudC1TZXNzaW9uLUlkJzogQ2xpZW50U2Vzc2lvbn0pCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpOwogICAgICAgICAgICBjb25zdCBmZXRjaFJlcXVlc3QgPSB7CiAgICAgICAgICAgICAgICBpZDogcmVxdWVzdElkLAogICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9ncWwudHdpdGNoLnR2L2dxbCcsCiAgICAgICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVxdWVzdElkKSkgewogICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGZXRjaFJlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0SWQpOwogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZldGNoUmVxdWVzdCB0aW1lZCBvdXQnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDE1MDAwKTsKICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuc2V0KHJlcXVlc3RJZCwgewogICAgICAgICAgICAgICAgcmVzb2x2ZSwKICAgICAgICAgICAgICAgIHJlamVjdCwKICAgICAgICAgICAgICAgIHRpbWVvdXRJZAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXF1ZXN0JywKICAgICAgICAgICAgICAgIHZhbHVlOiBmZXRjaFJlcXVlc3QKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBsZXQgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICBsZXQgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOwogICAgbGV0IGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBudWxsOwogICAgZnVuY3Rpb24gc3RhcnREcmlmdENvcnJlY3Rpb24odmlkZW9FbGVtZW50KSB7CiAgICAgICAgaWYgKERyaWZ0Q29ycmVjdGlvblJhdGUgPD0gMSkgcmV0dXJuOwogICAgICAgIGlmIChkcmlmdENhdGNoVXBJbnRlcnZhbCkgeyBjbGVhckludGVydmFsKGRyaWZ0Q2F0Y2hVcEludGVydmFsKTsgZHJpZnRDYXRjaFVwSW50ZXJ2YWwgPSBudWxsOyB9CiAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgIHZpZGVvRWxlbWVudC5wbGF5YmFja1JhdGUgPSBEcmlmdENvcnJlY3Rpb25SYXRlOwogICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIERyaWZ0IGNvcnJlY3Rpb246IGNhdGNoaW5nIHVwIGF0ICcgKyBEcmlmdENvcnJlY3Rpb25SYXRlICsgJ3gnKTsKICAgICAgICBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICBpZiAodmlkICYmIHZpZC5idWZmZXJlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZC5idWZmZXJlZC5lbmQodmlkLmJ1ZmZlcmVkLmxlbmd0aCAtIDEpIC0gdmlkLmN1cnJlbnRUaW1lIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkLnBsYXliYWNrUmF0ZSA9IDEuMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRHJpZnQgY29ycmVjdGlvbiBjb21wbGV0ZSDigJQgcmVzdW1lZCBub3JtYWwgcGxheWJhY2sgc3BlZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRyaWZ0Q2F0Y2hVcFRpbWVvdXQpOyBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7IGNsZWFySW50ZXJ2YWwoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpOyBkcmlmdENhdGNoVXBJbnRlcnZhbCA9IG51bGw7IH0KICAgICAgICB9LCA1MDApOwogICAgICAgIGRyaWZ0Q2F0Y2hVcFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdHJ5IHsgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IDEuMDsgfSBjYXRjaCB7fQogICAgICAgICAgICBpZiAoZHJpZnRDYXRjaFVwSW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChkcmlmdENhdGNoVXBJbnRlcnZhbCk7IGRyaWZ0Q2F0Y2hVcEludGVydmFsID0gbnVsbDsgfQogICAgICAgICAgICBkcmlmdENhdGNoVXBUaW1lb3V0ID0gbnVsbDsKICAgICAgICB9LCAzMDAwMCk7CiAgICB9CiAgICBjb25zdCBwbGF5ZXJCdWZmZXJTdGF0ZSA9IHsKICAgICAgICBjaGFubmVsTmFtZTogbnVsbCwKICAgICAgICBoYXNTdHJlYW1TdGFydGVkOiBmYWxzZSwKICAgICAgICBwb3NpdGlvbjogMCwKICAgICAgICBidWZmZXJlZFBvc2l0aW9uOiAwLAogICAgICAgIGJ1ZmZlckR1cmF0aW9uOiAwLAogICAgICAgIG51bVNhbWU6IDAsCiAgICAgICAgZml4QXR0ZW1wdHM6IDAsCiAgICAgICAgbGFzdEZpeFRpbWU6IDAsCiAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgIGxhc3RCYWNrdXBTd2l0Y2hBdDogMCwKICAgICAgICBsYXN0UmVsb2FkQXQ6IDAsCiAgICAgICAgcmVjb3ZlcnlSZWxvYWRVc2VkOiBmYWxzZSwKICAgICAgICB1c2VyUGF1c2VJbnRlbnQ6IGZhbHNlLAogICAgICAgIGxvZ2dlZFBhdXNlSW50ZW50OiBmYWxzZSwKICAgICAgICB3ZUp1c3RQYXVzZWQ6IDAsCiAgICAgICAgaW5BZEJyZWFrOiBmYWxzZSwKICAgICAgICB2YWZ0RXZlclVubXV0ZWQ6IGZhbHNlCiAgICB9OwogICAgLy8gUG9sbCB0aGUgcGxheWVyIHN0YXRlIHRvIGRldGVjdCBhbmQgZml4IGJ1ZmZlcmluZyBjYXVzZWQgYnkgYWQgc3RyZWFtIHN3aXRjaGluZwogICAgZnVuY3Rpb24gbW9uaXRvclBsYXllckJ1ZmZlcmluZygpIHsKICAgICAgICAvLyBGcmVzaCBwbGF5ZXIgbG9va3VwIGV2ZXJ5IHRpY2sgKGF2b2lkcyBzdGFsZSByZWYgd2hlbiBUd2l0Y2ggcmVzdGFydHMgaXRzIG93biBwbGF5ZXIpCiAgICAgICAgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgICAgIGlmIChwbGF5ZXJBbmRTdGF0ZSAmJiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIgJiYgcGxheWVyQW5kU3RhdGUuc3RhdGUpIHsKICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBsYXllckFuZFN0YXRlLnN0YXRlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgIXZpZGVvLl9fdGFzSW50ZW50SG9va2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uX190YXNJbnRlbnRIb29rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCB8fCAoRGF0ZS5ub3coKSAtIHBsYXllckJ1ZmZlclN0YXRlLndlSnVzdFBhdXNlZCkgPiAyMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudXNlclBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcucGxheWVyOwogICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnN0YXRlOwogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXIuY29yZSkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnICYmICFwbGF5ZXIuaXNQYXVzZWQoKSAmJiAhcGxheWVyLmdldEhUTUxWaWRlb0VsZW1lbnQoKT8uZW5kZWQgJiYgKHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50KCk/LnJlYWR5U3RhdGUgPz8gMCkgPj0gMSAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA8PSBEYXRlLm5vdygpIC0gUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgJiYgIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RSZWxvYWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdFJlbG9hZEF0ID49IDE1MDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG0zdThVcmwgPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG0zdThVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaCA9IG0zdThVcmwubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RhcnQgPSBtM3U4VXJsLmluZGV4T2YoJz8nLCBsYXN0U2xhc2gpOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBtM3U4VXJsLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxLCBxdWVyeVN0YXJ0ICE9PSAtMSA/IHF1ZXJ5U3RhcnQgOiB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lPy5lbmRzV2l0aCgnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gZmlsZU5hbWUuc2xpY2UoMCwgLTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSAhPSBjaGFubmVsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuZ2V0U3RhdGUoKSA9PT0gJ1BsYXlpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc1N0cmVhbVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHBsYXllci5jb3JlPy5zdGF0ZT8ucG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyZWRQb3NpdGlvbiA9IHBsYXllci5jb3JlPy5zdGF0ZT8uYnVmZmVyZWRQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXJEdXJhdGlvbiA9IHBsYXllci5nZXRCdWZmZXJEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIC8vIHZpZGVvLmN1cnJlbnRUaW1lIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGFjdHVhbCBwbGF5YmFjayBwcm9ncmVzcyDigJQKICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZS5wb3NpdGlvbiB1cGRhdGVzIGluIGJhdGNoZXMgb24gcmVsb2FkLWhlYXZ5IGNoYW5uZWxzIGFuZCBjYW4KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXIgZnJvemVuIGZvciB+MTJzIHdoaWxlIHRoZSB2aWRlbyBlbGVtZW50IGFkdmFuY2VzIHNtb290aGx5LgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvRWwgPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlkZW9DdXJyZW50VGltZSA9IHZpZGVvRWw/LmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICYmIGJ1ZmZlcmVkUG9zaXRpb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGNvdWxkIGJlIGltcHJvdmVkLiBJdCBjdXJyZW50bHkgbGV0cyB0aGUgcGxheWVyIGZ1bGx5IGVhdCB0aGUgZnVsbCBidWZmZXIgYmVmb3JlIGl0IHRyaWdnZXJzIHBhdXNlL3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgYnVmZmVyLXN0YWxsIGNoZWNrIHdoaWxlIHRoZSA8dmlkZW8+IGVsZW1lbnQgaXNuJ3QgYWN0aXZlbHkgdHJ5aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHBsYXk6IHJlYWR5U3RhdGUgPCAyIChNU0UgaW5pdCAvIHNlZWspIG9yIHBhdXNlZD10cnVlIChhdXRvcGxheS1wb2xpY3kgLwogICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgdGVhcmRvd24gcmFjZSB3aXRoIHBsYXllci5pc1BhdXNlZCgpKS4gSG9sZCBjb3VudGVycyBzbyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UgaW50ZXJydXB0ZWQgYnkgYSBicmllZiBpbml0IGRpcCByZXN1bWVzIGNvdW50aW5nIG9uIG5leHQgYWN0aXZlIHBvbGwuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllck5vdEFjdGl2ZWx5UGxheWluZyA9IHZpZGVvRWwgJiYgKHZpZGVvRWwucmVhZHlTdGF0ZSA8IDIgfHwgdmlkZW9FbC5wYXVzZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBGRloncyBhdWRpbyBjb21wcmVzc29yIHJlY3JlYXRlcyB0aGUgPHZpZGVvPiBlbGVtZW50IG9uIGV2ZXJ5IHBsYXllci5sb2FkKCkuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXRjaCB0aGVuIHNuYXBzIHRoZSBuZXcgZWxlbWVudCB0byAiYnVmZmVyZWQgcmVnaW9uIDAuMDR4eHgiIOKAlCBhIGJyaWVmCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRUaW1lIHBsYXRlYXUgdGhhdCBtYXRjaGVzIHBvc2l0aW9uRnJvemVuIGV2ZW4gdGhvdWdoIHBsYXliYWNrIGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWx0aHkuIERldGVjdCB0aGUgc3dhcCBieSBlbGVtZW50IGlkZW50aXR5IGFuZCBjbGVhciBjb3VudGVycyBzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFtcC11cCBpc24ndCBjb3VudGVkIGFzIGEgc3RhbGwuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb0VsICYmIHBsYXllckJ1ZmZlclN0YXRlLnZpZGVvRWxlbWVudCAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS52aWRlb0VsZW1lbnQgIT09IHZpZGVvRWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuZml4QXR0ZW1wdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUucmVjb3ZlcnlSZWxvYWRVc2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUudmlkZW9FbGVtZW50ID0gdmlkZW9FbDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25Gcm96ZW4gPSAocGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPT0gcG9zaXRpb24pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheWVyQnVmZmVyU3RhdGUudmlkZW9DdXJyZW50VGltZSA9PT0gdW5kZWZpbmVkIHx8IHBsYXllckJ1ZmZlclN0YXRlLnZpZGVvQ3VycmVudFRpbWUgPT09IHZpZGVvQ3VycmVudFRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyTm90QWN0aXZlbHlQbGF5aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIOKAlCBuZWl0aGVyIGluY3JlbWVudCBub3IgcmVzZXQsIGp1c3QgaG9sZCBzdGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgfHwgcG9zaXRpb24gPiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaWdodGVuIHRvIEFORDogYSByZWFsIHN0YWxsIGlzIEJPVEggZnJvemVuIHBvc2l0aW9uIEFORCBhIGRyYWluaW5nIGJ1ZmZlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpZWxkIHJlcG9ydHMgb24gRmlyZWZveCBhdCBsaXZlIGVkZ2Ugc2hvd2VkIHRoZSBPUiBmb3JtIGZpcmluZyBkdXJpbmcgbm9ybWFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGluLWJ1ZmZlciBicmVhdGhpbmcgKH4xLTJzIGJ1ZmZlcmVkLCBjdXJyZW50VGltZSBicmllZmx5IGlkbGUgd2FpdGluZyBvbiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWdtZW50IGZldGNoKSDigJQgcGF1c2UvcGxheSB3b3VsZCB0aGVuIGtub2NrIHRoZSBwbGF5ZXIgYmFjayB0byByZWFkeVN0YXRlPTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjdXJyZW50VGltZT0wLCBzbm93YmFsbGluZyBpbnRvIGEgc2VsZi1yZWluZm9yY2luZyByZWxvYWQgY2FzY2FkZS4gV2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQU5ELCByZWFsIHN0YWxscyAoZnJvemVuICsgYnVmZmVyIGRyYWluZWQgYmVsb3cgRGFuZ2VyWm9uZSkgc3RpbGwgZmlyZSBvbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgcG9sbCBjYWRlbmNlOyBoZWFsdGh5IHRoaW4tYnVmZmVyIGZlZWRzIG5vIGxvbmdlciB0cmlwIGl0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uRnJvemVuICYmIGJ1ZmZlckR1cmF0aW9uIDwgUGxheWVyQnVmZmVyaW5nRGFuZ2VyWm9uZSkgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5idWZmZXJlZFBvc2l0aW9uID09IGJ1ZmZlcmVkUG9zaXRpb24gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID49IGJ1ZmZlckR1cmF0aW9uICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9zaXRpb24gIT0gMCB8fCBidWZmZXJlZFBvc2l0aW9uICE9IDAgfHwgYnVmZmVyRHVyYXRpb24gIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9PSBQbGF5ZXJCdWZmZXJpbmdTYW1lU3RhdGVDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FwOiBhdCBtb3N0IE9ORSByZWxvYWQgcGVyIHJlY292ZXJ5IHdpbmRvdy4gQWZ0ZXIgcmVsb2FkaW5nIG9uY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RheSBvbiBwYXVzZS9wbGF5IHVudGlsIHBsYXliYWNrIHJlY292ZXJzLiBQcmV2ZW50cyByZWxvYWQgY2FzY2FkZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd291bGRFc2NhbGF0ZSA9IHBsYXllckJ1ZmZlclN0YXRlLmZpeEF0dGVtcHRzID49IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGVUb1JlbG9hZCA9IHdvdWxkRXNjYWxhdGUgJiYgKERpc2FibGVSZWxvYWRDYXAgfHwgIXBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkQ2FwTm90ZSA9IHdvdWxkRXNjYWxhdGUgJiYgIWVzY2FsYXRlVG9SZWxvYWQgPyAnIChyZWxvYWQgY2FwIHJlYWNoZWQsIHBhdXNlL3BsYXkgb25seSDigJQgc2V0IHR3aXRjaEFkU29sdXRpb25zX2Rpc2FibGVSZWxvYWRDYXA9dHJ1ZSB0byBieXBhc3MpJyA6IChlc2NhbGF0ZVRvUmVsb2FkID8gJyAoZXNjYWxhdGluZyB0byByZWxvYWQpJyA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQXR0ZW1wdCB0byBmaXggYnVmZmVyaW5nIHBvc2l0aW9uOicgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiArICcgYnVmZmVyZWRQb3NpdGlvbjonICsgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiArICcgYnVmZmVyRHVyYXRpb246JyArIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uICsgcmVsb2FkQ2FwTm90ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlayBwYXN0IGJ1ZmZlciBnYXAgaW5zdGVhZCBvZiBzdGFsbGluZyArIGRyaWZ0IHRvIHJlY292ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWRlbyA9IHBsYXllci5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8gJiYgdmlkZW8uYnVmZmVyZWQubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBiaSA9IDA7IGJpIDwgdmlkZW8uYnVmZmVyZWQubGVuZ3RoOyBiaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8uYnVmZmVyZWQuc3RhcnQoYmkpID4gdmlkZW8uY3VycmVudFRpbWUgKyAwLjUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTZWVraW5nIHBhc3QgJyArICh2aWRlby5idWZmZXJlZC5zdGFydChiaSkgLSB2aWRlby5jdXJyZW50VGltZSkudG9GaXhlZCgxKSArICdzIGJ1ZmZlciBnYXAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHZpZGVvLmJ1ZmZlcmVkLnN0YXJ0KGJpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyaWZ0Q29ycmVjdGlvbih2aWRlbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFZpZGVvIHN0YXRlOiByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJyBuZXR3b3JrU3RhdGU9JyArIHZpZGVvLm5ldHdvcmtTdGF0ZSArICcgYnVmZmVyZWQ9JyArICh2aWRlby5idWZmZXJlZC5sZW5ndGggPiAwID8gdmlkZW8uYnVmZmVyZWQuZW5kKHZpZGVvLmJ1ZmZlcmVkLmxlbmd0aCAtIDEpLnRvRml4ZWQoMSkgOiAwKSArICcgY3VycmVudFRpbWU9JyArIHZpZGVvLmN1cnJlbnRUaW1lLnRvRml4ZWQoMSkgKyAnIHBhdXNlZD0nICsgdmlkZW8ucGF1c2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNQYXVzZVBsYXkgPSBlc2NhbGF0ZVRvUmVsb2FkID8gZmFsc2UgOiAhUGxheWVyQnVmZmVyaW5nRG9QbGF5ZXJSZWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNSZWxvYWQgPSBlc2NhbGF0ZVRvUmVsb2FkID8gdHJ1ZSA6IFBsYXllckJ1ZmZlcmluZ0RvUGxheWVyUmVsb2FkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxhc3RGaXhUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGVUb1JlbG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnJlY292ZXJ5UmVsb2FkVXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5maXhBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5yZWNvdmVyeVJlbG9hZFVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3QgcG9zaXRpb24ganVtcCAobmF0aXZlIGdhcCByZWNvdmVyeSkg4oCUIGRyaWZ0IHRvIGNhdGNoIHVwLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGR1cmluZyBhZCBicmVha3MgYW5kIDEwcyBhZnRlcjogYmFja3VwIHN0cmVhbSBzd2l0Y2hpbmcgY2F1c2VzIGJ1ZmZlciBnYXBzIHRoYXQgdHJpZ2dlciBmYWxzZSBqdW1wcy4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmF0ZS1saW1pdCB0byBvbmNlIHBlciAzMHM6IGZpZWxkLW9ic2VydmVkIG9uIHdhcm4gdGhhdCBUd2l0Y2gncyBwbGF5ZXIuY29yZS5zdGF0ZS5wb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBqdW1wcyB+NjBzIGV2ZXJ5IH4xMnMgb24gcmVsb2FkLWhlYXZ5IGNoYW5uZWxzIChsaWtlbHkgYmF0Y2ggdXBkYXRlcyBmcm9tIG0zdTggbWFuaWZlc3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaGVzIC8gcHJvZ3JhbS1kYXRlLXRpbWUgc3luYyBwb2ludHMsIG5vdCByZWFsIGRyaWZ0KS4gT3VyIDEuMXggdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGFmZmVjdCBzdGF0ZS5wb3NpdGlvbiBhbnl3YXksIHNvIHJlLWZpcmluZyBldmVyeSAxMnMgaXMgdXNlbGVzcyBsb2cgc3BhbSDigJQgdGhlIGNhdGNoLXVwCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdGVzIG9uIGN1cnJlbnRUaW1lIHdoaWNoIGlzIGFscmVhZHkgYXQgbGl2ZSBlZGdlLiBSYXRlLWxpbWl0IGNvbGxhcHNlcyB0aGUgc3BhbSB0byBhCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBkcmlmdCBhdHRlbXB0IHBlciAzMHMgd2luZG93LCBsZWF2aW5nIHJlYWwtZHJpZnQgcGF0aHMgKGJ1ZmZlci1nYXAgc2VlaywgcG9zdC1yZWxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYWZmZWN0ZWQgc2luY2UgdGhleSBjYWxsIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKCkgZGlyZWN0bHkgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgZGV0ZWN0b3IuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA+IDAgJiYgcG9zaXRpb24gLSBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA+IDUgJiYgIXBsYXllckJ1ZmZlclN0YXRlLmluQWRCcmVhayAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3RCYWNrdXBTd2l0Y2hBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEJhY2t1cFN3aXRjaEF0ID49IDEwMDAwKSAmJiAoIXBsYXllckJ1ZmZlclN0YXRlLmxhc3REcmlmdFN0YXJ0ZWRBdCB8fCBEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdERyaWZ0U3RhcnRlZEF0ID49IDMwMDAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zaXRpb24ganVtcGVkICcgKyAocG9zaXRpb24gLSBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbikudG9GaXhlZCgxKSArICdzIOKAlCBzdGFydGluZyBkcmlmdCBjb3JyZWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyaWZ0Q29ycmVjdGlvbihwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdERyaWZ0U3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS52aWRlb0N1cnJlbnRUaW1lID0gdmlkZW9DdXJyZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyZWRQb3NpdGlvbiA9IGJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlckR1cmF0aW9uID0gYnVmZmVyRHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIHdoZW4gbW9uaXRvcmluZyBwbGF5ZXIgZm9yIGJ1ZmZlcmluZzogJyArIGVycik7CiAgICAgICAgICAgICAgICBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMb2FkaW5nLWNpcmNsZSBoZWFsdGggY2hlY2s6IGR1cmluZyBhbiBhZCBzdHJpcCtyZWNvdmVyeSBsb29wIHRoZSBub3JtYWwgYnVmZmVyIG1vbml0b3IKICAgICAgICAvLyBpcyBnYXRlZCBvZmYgKGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMpLCBzbyBhIHZpc2libHkgc3RhbGxlZCBwbGF5ZXIgd291bGQgb3RoZXJ3aXNlIHdhaXQKICAgICAgICAvLyBmb3IgdGhlIHdvcmtlcidzIHBvbGwtYmFzZWQgZWFybHkgcmVsb2FkICh+MTBzKS4gVGhpcyBjYXRjaGVzIHRoZSB2aXNpYmxlIHN0YWxsIH4zcyBhZnRlcgogICAgICAgIC8vIGl0IHN0YXJ0cyBhbmQgdHJpZ2dlcnMgYSByZWxvYWQgZGlyZWN0bHksIGVsaW1pbmF0aW5nIG1vc3Qgb2YgdGhlIGxvYWRpbmctY2lyY2xlIHdpbmRvdy4KICAgICAgICBpZiAoaXNBY3RpdmVseVN0cmlwcGluZ0FkcyAmJiBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nLnBsYXllcjsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcGxheWVyPy5nZXRIVE1MVmlkZW9FbGVtZW50Py4oKTsKICAgICAgICAgICAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8uZW5kZWQgJiYgIXBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIHBsYXllciBoYXMgZXZlciBoYWQgZGF0YSDigJQgZGlzdGluZ3Vpc2hlcyBhIHJlYWwgc3RhbGwKICAgICAgICAgICAgICAgICAgICAvLyAoaGFkIGRhdGEsIGxvc3QgZGF0YSkgZnJvbSBpbml0aWFsIHBsYXllciBpbml0IChuZXZlciBoYWQgZGF0YSB5ZXQpLgogICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgZnJlc2ggcGFnZSBsb2FkICsgcHJlcm9sbCBjYXVzZXMgUFIgIzk2IHRvIG1pc2ZpcmUgcmVwZWF0ZWRseQogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVhZHlTdGF0ZT0wIGlzIG5vcm1hbCBkdXJpbmcgaW5pdC4KICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1N0YWxsZWQgPSB2aWRlby5yZWFkeVN0YXRlIDwgMyAmJiAodmlkZW8ucGF1c2VkIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gMik7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhbGxSZWxvYWRDb29sZG93biA9IDE1MDAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb2xkb3duRXhwaXJlZCA9ICFwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0QWRTdGFsbFJlbG9hZEF0IHx8IChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCkgPiBzdGFsbFJlbG9hZENvb2xkb3duOwogICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGZpcmUgbG9hZGluZy1jaXJjbGUgcmVsb2FkIGlmIEFOWSByZWxvYWQgaGFwcGVuZWQgcmVjZW50bHkg4oCUIHJlYWR5U3RhdGU9MAogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBleHBlY3RlZCB0cmFuc2llbnQgc3RhdGUgZHVyaW5nIGEgcmVsb2FkJ3MgTWVkaWFTb3VyY2UgdGVhcmRvd24uIFdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLCBhbiBlYXJseS1yZWxvYWQgaW4gZmxpZ2h0IGNhbiB0cmlnZ2VyIGEgcmVkdW5kYW50IGxvYWRpbmctY2lyY2xlIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlbnRSZWxvYWQgPSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQpIDwgc3RhbGxSZWxvYWRDb29sZG93bjsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGFsbGVkICYmIGNvb2xkb3duRXhwaXJlZCAmJiAhcmVjZW50UmVsb2FkICYmIHBsYXllckJ1ZmZlclN0YXRlLmhhc0hhZERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpID4gMzAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTG9hZGluZyBjaXJjbGUgZGV0ZWN0ZWQgZHVyaW5nIGFkIGJyZWFrICgnICsgKChEYXRlLm5vdygpIC0gcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIC8gMTAwMCkudG9GaXhlZCgxKSArICdzIHN0YWxsLCByZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJykg4oCUIGVhcmx5IHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubGFzdEFkU3RhbGxSZWxvYWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkIHJlbG9hZDogYSBzdHVjayBtZWRpYSBwbGF5ZXIgbmVlZHMgaXRzIE1lZGlhU291cmNlIHJlYnVpbHQsIG5vdCBqdXN0IGFuIG0zdTggcmVmZXRjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgJ2Vhcmx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1N0YWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0gZWxzZSBpZiAoIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgJiYgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQpIHsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYWRTdGFsbFN0YXJ0QXQgPSAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc0xpdmUgPSBwbGF5ZXJGb3JNb25pdG9yaW5nQnVmZmVyaW5nPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUuaXNMaXZlICYmICFpc0xpdmUpIHsKICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcih7CiAgICAgICAgICAgICAgICBoYXNBZHM6IGZhbHNlCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5pc0xpdmUgPSBpc0xpdmU7CiAgICAgICAgLy8gRm9yY2UgaW1tZWRpYXRlIHRpY2sgd2hlbiB0YWIgYmVjb21lcyB2aXNpYmxlIHNvIHN0YWxscyBhcmUgY2F1Z2h0IGZhc3Qgb24gcmV0dXJuCiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcudmlzaWJpbGl0eUhvb2tlZCkgewogICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnZpc2liaWxpdHlIb29rZWQgPSB0cnVlOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgIW1vbml0b3JQbGF5ZXJCdWZmZXJpbmcucGVuZGluZ1RpY2spIHsKICAgICAgICAgICAgICAgICAgICBtb25pdG9yUGxheWVyQnVmZmVyaW5nLnBlbmRpbmdUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9uaXRvclBsYXllckJ1ZmZlcmluZy5wZW5kaW5nVGljayA9IGZhbHNlOyBtb25pdG9yUGxheWVyQnVmZmVyaW5nKCk7IH0sIDEwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBDYXRjaCBwZXJzaXN0ZW50IGFkLWJyZWFrIG92ZXJsYXlzIChlLmcuICJ0YWtpbmcgYW4gYWQgYnJlYWsgLyBzdGljayBhcm91bmQiKQogICAgICAgIC8vIGV2ZW4gYWZ0ZXIgaGFzQWRzIGhhcyB0cmFuc2l0aW9uZWQgdG8gZmFsc2UuIHVwZGF0ZUFkYmxvY2tCYW5uZXIgb25seSBjYWxscwogICAgICAgIC8vIGhpZGVUd2l0Y2hBZE92ZXJsYXlzIGR1cmluZyB0aGUgYWN0aXZlIGFkIGJyZWFrOyBzb21lIG92ZXJsYXlzIGhhdmUgdGhlaXIgb3duCiAgICAgICAgLy8gbGlmZWN5Y2xlIGFuZCBzdGF5IHZpc2libGUgYWZ0ZXJ3YXJkcy4gUnVubmluZyBoZXJlIG9uIGV2ZXJ5IG1vbml0b3IgdGljawogICAgICAgIC8vICgxLTNzIGNhZGVuY2UpIGtlZXBzIHRoZW0gaGlkZGVuIHdpdGhvdXQgYSBkZWRpY2F0ZWQgaW50ZXJ2YWwuCiAgICAgICAgdHJ5IHsgaGlkZVR3aXRjaEFkT3ZlcmxheXMoKTsgfSBjYXRjaCB7fQogICAgICAgIC8vIFZpc2liaWxpdHktYXdhcmUgYmFja29mZjogcG9sbCAzeCBzbG93ZXIgd2hlbiB0YWIgaXMgaGlkZGVuIChidXQgTk9UIGR1cmluZyBQaVAg4oCUIHVzZXIgaXMgc3RpbGwgd2F0Y2hpbmcpCiAgICAgICAgY29uc3Qgc2hvdWxkVGhyb3R0bGUgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmhpZGRlbiAmJiAhZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQ7CiAgICAgICAgY29uc3QgbmV4dERlbGF5ID0gc2hvdWxkVGhyb3R0bGUgPyBQbGF5ZXJCdWZmZXJpbmdEZWxheSAqIDMgOiBQbGF5ZXJCdWZmZXJpbmdEZWxheTsKICAgICAgICBzZXRUaW1lb3V0KG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcsIG5leHREZWxheSk7CiAgICB9CiAgICAvLyBIaWRlIFR3aXRjaCdzIGFkIGJyZWFrIC8gVHVyYm8gcHJvbW8gLyBzdHJlYW0gZGlzcGxheSBhZCBvdmVybGF5cyB3aGVuIHdlJ3JlIGFscmVhZHkgYmxvY2tpbmcgYWRzCiAgICBmdW5jdGlvbiBoaWRlVHdpdGNoQWRPdmVybGF5cygpIHsKICAgICAgICBpZiAoIWNhY2hlZFBsYXllclJvb3REaXYgfHwgIWNhY2hlZFBsYXllclJvb3REaXYuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgICAgICAvLyBIaWRlIHN0cmVhbSBkaXNwbGF5IGFkIChTREEpIHdyYXBwZXIKICAgICAgICBjb25zdCBzZGFFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRlc3Qtc2VsZWN0b3I9InNkYS13cmFwcGVyIl0nKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNkYUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghc2RhRWxlbWVudHNbaV0uZGF0YXNldC50YXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIHNkYUVsZW1lbnRzW2ldLmRhdGFzZXQudGFzSGlkZGVuID0gJyc7CiAgICAgICAgICAgICAgICBzZGFFbGVtZW50c1tpXS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRTZGFIaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VkU2RhSGlkZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gSGlkZGVuIFR3aXRjaCBzdHJlYW0gZGlzcGxheSBhZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgaWYgKCFjYWNoZWRQbGF5ZXJSb290RGl2IHx8ICFjYWNoZWRQbGF5ZXJSb290RGl2LmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIGNhY2hlZFBsYXllclJvb3REaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tcGxheWVyJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllclJvb3REaXYgPSBjYWNoZWRQbGF5ZXJSb290RGl2OwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcudGFzLWFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICd0YXMtYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgPSBkYXRhLmlzU3RyaXBwaW5nQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIHBsYXllckJ1ZmZlclN0YXRlLmlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuaGFzQWRzKSB7CiAgICAgICAgICAgICAgICBoaWRlVHdpdGNoQWRPdmVybGF5cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gVHJhdmVyc2UgUmVhY3QncyBmaWJlciB0cmVlIHRvIGZpbmQgVHdpdGNoJ3MgcGxheWVyIGFuZCBwbGF5ZXIgc3RhdGUgaW5zdGFuY2VzCiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgaWYgKCFjYWNoZWRSb290Tm9kZSkgewogICAgICAgICAgICAgICAgY2FjaGVkUm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gY2FjaGVkUm9vdE5vZGU7CiAgICAgICAgICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdCAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCkgewogICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZWFjdFJvb3ROb2RlID09IG51bGwgJiYgcm9vdE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IE9iamVjdC5rZXlzKHJvb3ROb2RlKS5maW5kKHggPT4geC5zdGFydHNXaXRoKCdfX3JlYWN0Q29udGFpbmVyJykgfHwgeC5zdGFydHNXaXRoKCdfX3JlYWN0RmliZXInKSk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlW2NvbnRhaW5lck5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFjdFJvb3ROb2RlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWFjdFJvb3ROb2RlID0gZmluZFJlYWN0Um9vdE5vZGUoKTsKICAgICAgICBpZiAoIXJlYWN0Um9vdE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIFByaW1hcnk6IG5hbWVkIHByb3BlcnR5IGxvb2t1cAogICAgICAgIGxldCBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRQbGF5ZXJBY3RpdmUgJiYgbm9kZS5wcm9wcyAmJiBub2RlLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UpOwogICAgICAgIHBsYXllciA9IHBsYXllciAmJiBwbGF5ZXIucHJvcHMgJiYgcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgPyBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgaWYgKHBsYXllcj8ucGxheWVySW5zdGFuY2UpIHsKICAgICAgICAgICAgcGxheWVyID0gcGxheWVyLnBsYXllckluc3RhbmNlOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCBpZiBUd2l0Y2ggb2JmdXNjYXRlcyBwcm9wZXJ0eSBuYW1lcwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQgJiYgbm9kZS5nZXRCdWZmZXJEdXJhdGlvbiAmJiBub2RlLmNvcmU/LnN0YXRlKTsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGUgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgLy8gRmFsbGJhY2s6IHN0cnVjdHVyYWwgbWF0Y2gg4oCUIHNldFNyYyBleGlzdHMgYnV0IHNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzIHdhcyByZW5hbWVkCiAgICAgICAgY29uc3QgcGxheWVyU3RhdGVGYWxsYmFjayA9ICFwbGF5ZXJTdGF0ZSA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldFN0cmVhbU1hbmFnZXJOb2RlICYmICFub2RlLmdldEhUTUxWaWRlb0VsZW1lbnQpIDogbnVsbDsKICAgICAgICAvLyBGYWxsYmFjayAyOiBUVFYtQUIncyBhcHByb2FjaCDigJQgdmlkZW9QbGF5ZXJJbnN0YW5jZSB3aXRoIHBsYXllck1vZGUKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMiA9ICFwbGF5ZXJTdGF0ZSAmJiAhcGxheWVyU3RhdGVGYWxsYmFjayA/IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlPy5wbGF5ZXJNb2RlICE9PSB1bmRlZmluZWQpPy5zdGF0ZT8udmlkZW9QbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgY29uc3QgZmluYWxQbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlIHx8IHBsYXllclN0YXRlRmFsbGJhY2sgfHwgcGxheWVyU3RhdGVGYWxsYmFjazI7CiAgICAgICAgLy8gR3JhY2UgcGVyaW9kIGJlZm9yZSBsb2dnaW5nICJub3QgZm91bmQiIHdhcm5pbmdzLiBUaGUgYnVmZmVyIG1vbml0b3IgY2FuIHRpY2sKICAgICAgICAvLyBiZWZvcmUgUmVhY3QgaGFzIGZpbmlzaGVkIG1vdW50aW5nIHRoZSBwbGF5ZXIsIGxlYWRpbmcgdG8gYSBmYWxzZS1wb3NpdGl2ZQogICAgICAgIC8vIGxvZyB0aGF0IGZpcmVzIG9uY2Ugb24gZXZlcnkgcGFnZSBsb2FkLiBPbmx5IGxvZyBpZiB0aGUgbnVsbCBzdGF0ZSBwZXJzaXN0cwogICAgICAgIC8vIGZvciAxMCsgc2Vjb25kcyDigJQgYnkgdGhlbiBSZWFjdCBpcyBkZWZpbml0ZWx5IG1vdW50ZWQgYW5kIGEgcGVyc2lzdGVudCBudWxsCiAgICAgICAgLy8gaW5kaWNhdGVzIHJlYWwgQVBJIGRyaWZ0IChUd2l0Y2ggcmVuYW1lZCBzZXRQbGF5ZXJBY3RpdmUvc2V0U3JjL2V0YykuCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgaWYgKCFnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCkgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyICYmIChEYXRlLm5vdygpIC0gZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RQbGF5ZXJOdWxsQXQpID4gMTAwMDApIHsKICAgICAgICAgICAgICAgIGdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vUGxheWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFBsYXllckFjdGl2ZS9tZWRpYVBsYXllckluc3RhbmNlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFBsYXllck51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIGlmICghZmluYWxQbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQpIGdldFBsYXllckFuZFN0YXRlLmZpcnN0U3RhdGVOdWxsQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBpZiAoIWdldFBsYXllckFuZFN0YXRlLmxvZ2dlZE5vU3RhdGUgJiYgKERhdGUubm93KCkgLSBnZXRQbGF5ZXJBbmRTdGF0ZS5maXJzdFN0YXRlTnVsbEF0KSA+IDEwMDAwKSB7CiAgICAgICAgICAgICAgICBnZXRQbGF5ZXJBbmRTdGF0ZS5sb2dnZWROb1N0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBzdGF0ZSBub3QgZm91bmQgZm9yIDEwcysg4oCUIFR3aXRjaCBtYXkgaGF2ZSByZW5hbWVkIHNldFNyYy9zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncycpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0UGxheWVyQW5kU3RhdGUuZmlyc3RTdGF0ZU51bGxBdCA9IDA7Ly8gcmVzZXQgb24gc3VjY2Vzc2Z1bCBmaW5kCiAgICAgICAgfQogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IGZpbmFsUGxheWVyU3RhdGUKICAgICAgICB9OwogICAgfQogICAgLy8gUGF1c2UvcGxheSBvciBmdWxseSByZWxvYWQgdGhlIFR3aXRjaCBwbGF5ZXIsIHByZXNlcnZpbmcgcXVhbGl0eS92b2x1bWUgc2V0dGluZ3MKICAgIGZ1bmN0aW9uIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQsIHJlbG9hZEtpbmQpIHsKICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgaWYgKCFwbGF5ZXJBbmRTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcmVhY3Qgcm9vdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckFuZFN0YXRlLnBsYXllcjsKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IHBsYXllckFuZFN0YXRlLnN0YXRlOwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXInKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXBsYXllclN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXIgc3RhdGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB3YXNQYXVzZWQgPSBwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkOwogICAgICAgIGlmICh3YXNQYXVzZWQpIHsKICAgICAgICAgICAgLy8gVXNlciBkZWxpYmVyYXRlbHkgcGF1c2VkIOKAlCByZXNwZWN0IHRoZWlyIGludGVudCwgZG9uJ3QgYXV0by1yZXN1bWUKICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlclN0YXRlLnVzZXJQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5sb2dnZWRQYXVzZUludGVudCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxvZ2dlZFBhdXNlSW50ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZXNwZWN0aW5nIHVzZXIgcGF1c2UgaW50ZW50IOKAlCBza2lwcGluZyBhdXRvLXJlc3VtZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIFdFIHJlY2VudGx5IGNhbGxlZCBwYXVzZS9wbGF5IGFuZCBwbGF5ZXIgaXMgc3RpbGwgcGF1c2VkLCByZXRyeSBwbGF5IChzdHVjayBmcm9tIGF1dG9wbGF5IHBvbGljeSBvciBhZC1zdGF0ZSBpbnRlcmZlcmVuY2UpCiAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgJiYgKERhdGUubm93KCkgLSBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQpIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHBsYXllci5wbGF5KCk/LmNhdGNoPy4oKCkgPT4ge30pOyB9IGNhdGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXdhc1BhdXNlZCkgewogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS53ZUp1c3RQYXVzZWQgPSAwOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQgJiYgZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNSZWxvYWQpIHsKICAgICAgICAgICAgLy8gU2tpcCByZWxvYWQgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IGhlYWx0aHkg4oCUIGF2b2lkcyBkaXNydXB0aW5nIHNtb290aCBwbGF5YmFjay4KICAgICAgICAgICAgLy8gQnV0IGlmIHdlJ3JlIHdheSBiZWhpbmQgbGl2ZSBlZGdlIChlLmcuIGFmdGVyIGEgbG9uZyBhZCBicmVhayksIHByb2NlZWQgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeS4KICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudD8uKCk7CiAgICAgICAgICAgIGlmICh2aWRlbyAmJiB2aWRlby5yZWFkeVN0YXRlID49IDMgJiYgIXZpZGVvLnBhdXNlZCAmJiAhdmlkZW8uZW5kZWQpIHsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5U2VjID0gMDsKICAgICAgICAgICAgICAgIGxldCBsYXRlbmN5S25vd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLnNlZWthYmxlICYmIHZpZGVvLnNlZWthYmxlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vla2FibGVFbmQgPSB2aWRlby5zZWVrYWJsZS5lbmQodmlkZW8uc2Vla2FibGUubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoc2Vla2FibGVFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxjID0gTWF0aC5tYXgoMCwgc2Vla2FibGVFbmQgLSB2aWRlby5jdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2FwOiB2YWx1ZXMgPjFoIGluZGljYXRlIGdhcmJhZ2UgZnJvbSB0aGUgTWVkaWEgU291cmNlIEFQSQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHNlZW4gcmlnaHQgYWZ0ZXIgYSByZWxvYWQgd2hpbGUgdGhlIHNlZWthYmxlIHJhbmdlIGlzIGluIGEgdHJhbnNpZW50IHN0YXRlKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxjIDwgMzYwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lTZWMgPSBjYWxjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lLbm93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgICAgaWYgKCFsYXRlbmN5S25vd24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBMYXRlbmN5IHVua25vd24gKHNlZWthYmxlIHVuYXZhaWxhYmxlKSDigJQgcHJvY2VlZGluZyB3aXRoIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXRlbmN5U2VjID4gNykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFBsYXllciBwbGF5aW5nIGJ1dCAnICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kIGxpdmUg4oCUIHByb2NlZWRpbmcgd2l0aCByZWxvYWQgdG8gcmVzZXQgbGF0ZW5jeScpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTa2lwcGluZyByZWxvYWQg4oCUIHBsYXllciBoZWFsdGh5IChyZWFkeVN0YXRlPScgKyB2aWRlby5yZWFkeVN0YXRlICsgJywgcGxheWluZywgbGF0ZW5jeT0nICsgbGF0ZW5jeVNlYy50b0ZpeGVkKDEpICsgJ3MpJyk7CiAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1JlbG9hZFNraXBwZWQnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzUmVsb2FkKSB7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5UXVhbGl0eSA9ICd2aWRlby1xdWFsaXR5JzsKICAgICAgICAgICAgY29uc3QgbHNLZXlNdXRlZCA9ICd2aWRlby1tdXRlZCc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5Vm9sdW1lID0gJ3ZvbHVtZSc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5TG93TGF0ZW5jeSA9ICdsb3dMYXRlbmN5TW9kZUVuYWJsZWQnOy8vIFByZXNlcnZlIHVzZXIncyBsb3ctbGF0ZW5jeSB0b2dnbGUgYWNyb3NzIHJlbG9hZHMgKFRUVi1BQiBwYXJpdHkpCiAgICAgICAgICAgIGNvbnN0IGxzS2V5UGVyc2lzdGVuY2UgPSAncGVyc2lzdGVuY2VFbmFibGVkJzsvLyBQcmVzZXJ2ZSBhdXRvcGxheS9wZXJzaXN0ZW5jZSB0b2dnbGUgYWNyb3NzIHJlbG9hZHMgKFRUVi1BQiBwYXJpdHkpCiAgICAgICAgICAgIGxldCBjdXJyZW50UXVhbGl0eUxTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRNdXRlZExTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRWb2x1bWVMUyA9IG51bGw7CiAgICAgICAgICAgIGxldCBjdXJyZW50TG93TGF0ZW5jeUxTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRQZXJzaXN0ZW5jZUxTID0gbnVsbDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGN1cnJlbnRRdWFsaXR5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVF1YWxpdHkpOwogICAgICAgICAgICAgICAgY3VycmVudE11dGVkTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleU11dGVkKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRWb2x1bWVMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5Vm9sdW1lKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRMb3dMYXRlbmN5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleUxvd0xhdGVuY3kpOwogICAgICAgICAgICAgICAgY3VycmVudFBlcnNpc3RlbmNlTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVBlcnNpc3RlbmNlKTsKICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBKU09OLnN0cmluZ2lmeSh7ZGVmYXVsdDpwbGF5ZXIuY29yZS5zdGF0ZS5tdXRlZH0pKTsKICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVZvbHVtZSwgcGxheWVyLmNvcmUuc3RhdGUudm9sdW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwbGF5ZXI/LmNvcmU/LnN0YXRlPy5xdWFsaXR5Py5ncm91cCkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgSlNPTi5zdHJpbmdpZnkoe2RlZmF1bHQ6cGxheWVyLmNvcmUuc3RhdGUucXVhbGl0eS5ncm91cH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0UmVsb2FkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5hZFN0YWxsU3RhcnRBdCA9IDA7Ly8gY2xlYXIgc3RhbGUgc3RhbGwgdGltZXIgc28gcG9zdC1yZWxvYWQgcmVhZHlTdGF0ZT0wIGlzbid0IGF0dHJpYnV0ZWQgdG8gcHJlLXJlbG9hZCBzdGFsbAogICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubG9nZ2VkUGF1c2VJbnRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgLy8gcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyByZS1hY3F1aXJlZCBmcmVzaCBldmVyeSB0aWNrIOKAlCBubyBtYW51YWwgaW52YWxpZGF0aW9uIG5lZWRlZAogICAgICAgICAgICAvLyBIYXJkIHJlbG9hZCBmb3IgJ2Vhcmx5JyAobWlkLWJyZWFrIGVzY2FwZSDigJQgZnJlc2ggc2Vzc2lvbiBnZXRzIG5ldyBhZC1kZWNpc2lvbiBidWNrZXQpLgogICAgICAgICAgICAvLyBTb2Z0IHJlbG9hZCBmb3IgJ3Bvc3QtYWQnIChzbW9vdGggdHJhbnNpdGlvbiwgbm8gYmxhY2sgc2NyZWVuIHRlYXJkb3duKS4KICAgICAgICAgICAgY29uc3QgaGFyZFJlbG9hZCA9IHJlbG9hZEtpbmQgPT09ICdlYXJseSc7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFJlbG9hZGluZyBUd2l0Y2ggcGxheWVyJyArIChoYXJkUmVsb2FkID8gJyAoaGFyZCknIDogJyAoc29mdCknKSk7CiAgICAgICAgICAgIC8vIFByZS1tdXRlIHRocm91Z2ggaGFyZCByZWxvYWQgdG8gaGlkZSBNU0UtdGVhcmRvd24gYXVkaW8gY2xpY2s7IHJlc3RvcmVkIG9uCiAgICAgICAgICAgIC8vIGBjYW5wbGF5YCB3aXRoIDE1MDBtcyBzYWZldHkgY2FwLiBTa2lwcGVkIGlmIHVzZXIgYWxyZWFkeSBtdXRlZC4KICAgICAgICAgICAgaWYgKGhhcmRSZWxvYWQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FzSW5pdGlhbGx5VW5tdXRlZCA9IHYgJiYgIXYubXV0ZWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgIzIwMCBmaXg6IGFsc28gc2V0IHVwIHJlc3RvcmUrYmFja3N0b3Agd2hlbiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5CiAgICAgICAgICAgICAgICAgICAgLy8gbXV0ZWQgSUYgdmFmdCBoYXMgc3VjY2Vzc2Z1bGx5IHVubXV0ZWQgYXQgYW55IHBvaW50IGVhcmxpZXIgdGhpcyBzZXNzaW9uLgogICAgICAgICAgICAgICAgICAgIC8vIFN0cm9uZyBzaWduYWwgb2YgVHdpdGNoJ3Mgc2lsZW50IHJlLW11dGUgcGF0dGVybiByYXRoZXIgdGhhbiB1c2VyLWluaXRpYXRlZAogICAgICAgICAgICAgICAgICAgIC8vIG11dGUuIEZpcnN0LXNlc3Npb24tbXV0ZSB1c2VycyBoYXZlIHZhZnRFdmVyVW5tdXRlZD1mYWxzZSDihpIgYmFja3N0b3AgbmV2ZXIKICAgICAgICAgICAgICAgICAgICAvLyBlbmdhZ2VzIOKGkiBtdXRlIHJlc3BlY3RlZC4gRGlzYWJsZWQgYnkgdHdpdGNoQWRTb2x1dGlvbnNfcmVjb3ZlckZyb21TaWxlbnRNdXRlPQogICAgICAgICAgICAgICAgICAgIC8vIGZhbHNlIGZvciB1c2VycyB3aG8gZGVsaWJlcmF0ZWx5IG11dGUgbWlkLXNlc3Npb24uCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVjb3ZlciA9IHBsYXllckJ1ZmZlclN0YXRlLnZhZnRFdmVyVW5tdXRlZCAmJiBSZWNvdmVyRnJvbVNpbGVudE11dGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgKHdhc0luaXRpYWxseVVubXV0ZWQgfHwgc2hvdWxkUmVjb3ZlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0luaXRpYWxseVVubXV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubXV0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11bHRpLWV2ZW50IHJlc3RvcmU6IEVkZ2UgZmlyZXMgbG9hZGVkZGF0YS9wbGF5aW5nIGluZGVwZW5kZW50bHkgb2YKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FucGxheTsgZmlyc3QtZmlyZWQgd2lucyB2aWEgdGhlIGlkZW1wb3RlbnQgYGRvbmVgIGd1YXJkLgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN0b3JlID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2FucGxheScsIGxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCBsaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnZhZnRFdmVyVW5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSA9PT0gJ1ZJREVPJykgcmVzdG9yZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjYW5wbGF5JywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc3RvcmUsIDQwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBCYWNrc3RvcDogcmUtY2hlY2sgYXQgNTUwMG1zLiBUd2l0Y2gncyBMUy1yZXN0b3JlIGF0IH4zMDAwbXMgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW11dGUgcG9zdC1yZXN0b3JlIGlmIGl0IGNhcHR1cmVkIGEgbXV0ZWQgc25hcHNob3QuIElkZW1wb3RlbnQuCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgJiYgY3VyLm11dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS51c2VyUGF1c2VJbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEhhcmQgcmVsb2FkIGJhY2tzdG9wIFNLSVBQRUQg4oCUIGVsZW1lbnQgbXV0ZWQgYXQgNTUwMG1zIGJ1dCB1c2VyUGF1c2VJbnRlbnQgc2V0IChsaWtlbHkgZmFsc2UtcG9zaXRpdmUgcGF1c2UgZXZlbnQgZHVyaW5nIE1TRSB0ZWFyZG93biDigJQgaXNzdWUgIzIwMCBmb2xsb3ctdXApJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIubXV0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLnZhZnRFdmVyVW5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBIYXJkIHJlbG9hZCBiYWNrc3RvcCB1bm11dGUgZmlyZWQg4oCUIGVsZW1lbnQgd2FzIHN0aWxsIG11dGVkIGF0IDU1MDBtcyAoaW5pdGlhbDogJyArICh3YXNJbml0aWFsbHlVbm11dGVkID8gJ3VubXV0ZWQsIHdlIHByZS1tdXRlZCcgOiAnYWxyZWFkeS1tdXRlZCBvbiBlbnRyeSDigJQgcmVjb3ZlcmluZyBmcm9tIHNpbGVudCBUd2l0Y2ggcmUtbXV0ZScpICsgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTUwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNldCB3ZUp1c3RQYXVzZWQgc28gdGhlIHBhdXNlLWxpc3RlbmVyIGZpbHRlcnMgb3V0IHRoZSBNU0UtdGVhcmRvd24KICAgICAgICAgICAgLy8gcGF1c2UgZXZlbnQgVHdpdGNoIGRpc3BhdGNoZXMgb24gdGhlIG9sZCA8dmlkZW8+IGR1cmluZyBzZXRTcmMuCiAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdXNlclBhdXNlSW50ZW50IHdvdWxkIGZhbHNlbHkgZmxpcCB0byB0cnVlIGR1cmluZyB0aGUKICAgICAgICAgICAgLy8gcmVsb2FkIHdpbmRvdywgYmxvY2tpbmcgdGhlIDU1MDBtcyBiYWNrc3RvcCdzIHVubXV0ZSBvbiBzdHVjay1tdXRlZAogICAgICAgICAgICAvLyByZWNvdmVyeSAoaXNzdWUgIzIwMCBmb2xsb3ctdXApLgogICAgICAgICAgICBpZiAoaGFyZFJlbG9hZCkgewogICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUud2VKdXN0UGF1c2VkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwbGF5ZXJTdGF0ZS5zZXRTcmMoeyBpc05ld01lZGlhUGxheWVySW5zdGFuY2U6IGhhcmRSZWxvYWQsIHJlZnJlc2hBY2Nlc3NUb2tlbjogaGFyZFJlbG9hZCB9KTsKICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1RyaWdnZXJlZFBsYXllclJlbG9hZCcpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgICAgIC8vIEJsb2NrIG11c3QgYWx3YXlzIHJ1bjogaWYgVHdpdGNoIGhhc24ndCB3cml0dGVuIExTIHZhbHVlcyB5ZXQgKGZyZXNoIHNlc3Npb24sIHByaXZhdGUgbW9kZSwKICAgICAgICAgICAgLy8gY2xlYXJlZCBjYWNoZSksIHRoZSB2aWRlbyBzdGlsbCBuZWVkcyB1bm11dGUgYWZ0ZXIgQ2hyb21lJ3MgYXV0b3BsYXkgbXV0ZSBvbiByZWxvYWQuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIGN1cnJlbnRRdWFsaXR5TFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlNdXRlZCwgY3VycmVudE11dGVkTFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBjdXJyZW50Vm9sdW1lTFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG93TGF0ZW5jeUxTICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleUxvd0xhdGVuY3ksIGN1cnJlbnRMb3dMYXRlbmN5TFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGVyc2lzdGVuY2VMUyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlQZXJzaXN0ZW5jZSwgY3VycmVudFBlcnNpc3RlbmNlTFMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwZWN0IHVzZXIncyBtdXRlIGludGVudDogb25seSBmb3JjZS11bm11dGUgaWYgTFMgZGlkbid0IHNheSBtdXRlLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUd2l0Y2ggd3JpdGVzIHZpZGVvLW11dGVkIGFzICd7ImRlZmF1bHQiOnRydWV9JyB3aGVuIHVzZXIgbXV0ZWQgdmlhIFVJOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJJbnRlbmRlZE11dGUgPSBjdXJyZW50TXV0ZWRMUyAmJiBjdXJyZW50TXV0ZWRMUy5pbmNsdWRlcygnImRlZmF1bHQiOnRydWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwICYmIHZpZGVvc1swXS5tdXRlZCAmJiAhdXNlckludGVuZGVkTXV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCBsaXZlIGRyaWZ0IGFmdGVyIHJlbG9hZC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGhhcmQgcmVsb2FkIHdpdGggbGFyZ2UgZHJpZnQgKD41cyksIGhhcmQtc2VlayB0byBsaXZlIGVkZ2UgdG8gZmx1c2gKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IEEvViB0aW1lc3RhbXAgZGVzeW5jIGZyb20gc3RyaXArQkxBTktfTVA0K3JlY292ZXJ5IGFjdGl2aXR5LiBEcmlmdAogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0aW9uIGF0IDEuMXggd291bGQgdGFrZSBtaW51dGVzIHRvIGNhdGNoIHVwIDMwLTYwcyBvZiBkcmlmdC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHNvZnQgcmVsb2FkIG9yIHNtYWxsIGRyaWZ0LCB1c2UgZXhpc3RpbmcgZ3JhZHVhbCBjYXRjaC11cC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwICYmIHZpZGVvc1swXS5idWZmZXJlZC5sZW5ndGggPiAwICYmIHZpZGVvc1swXS5yZWFkeVN0YXRlID49IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpdmVFZGdlID0gdmlkZW9zWzBdLmJ1ZmZlcmVkLmVuZCh2aWRlb3NbMF0uYnVmZmVyZWQubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkcmlmdCA9IGxpdmVFZGdlIC0gdmlkZW9zWzBdLmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhcmRSZWxvYWQgJiYgZHJpZnQgPiA1ICYmIE51bWJlci5pc0Zpbml0ZShsaXZlRWRnZSkgJiYgbGl2ZUVkZ2UgPCAzNjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1oYXJkLXJlbG9hZCBzZWVrIHRvIGxpdmUg4oCUICcgKyBkcmlmdC50b0ZpeGVkKDEpICsgJ3MgYmVoaW5kLCBqdW1waW5nIHRvIGxpdmUgZWRnZSB0byBmbHVzaCBBL1YgZHJpZnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3NbMF0uY3VycmVudFRpbWUgPSBsaXZlRWRnZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJpZnQgPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gUG9zdC1yZWxvYWQgbGl2ZSBkcmlmdCBjb3JyZWN0aW9uOiAnICsgZHJpZnQudG9GaXhlZCgxKSArICdzIGJlaGluZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJpZnRDb3JyZWN0aW9uKHZpZGVvc1swXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgd2luZG93LnJlbG9hZFR3aXRjaFBsYXllciA9ICgpID0+IHsKICAgICAgICBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUpOwogICAgfTsKICAgIGZ1bmN0aW9uIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKGtleSwgdmFsdWUpIHsKICAgICAgICB0d2l0Y2hXb3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gewogICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2tleToga2V5LCB2YWx1ZTogdmFsdWV9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVdvcmtlckZldGNoUmVxdWVzdChmZXRjaFJlcXVlc3QpIHsKICAgICAgICAvLyA1cyBBYm9ydENvbnRyb2xsZXIgdGltZW91dCDigJQgYm91bmRzIHdvcnN0LWNhc2Ugd2FpdCB3aGVuIFR3aXRjaCBHUUwgaGFuZ3MuCiAgICAgICAgLy8gQWJvcnRFcnJvciBmbG93cyB0aHJvdWdoIHRoZSBleGlzdGluZyBjYXRjaCArIEZhaWxlZEJhY2t1cFBsYXllclR5cGVzIGxvY2tvdXQuCiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSA1MDAwOwogICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0TXMpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2luZG93LnJlYWxGZXRjaChmZXRjaFJlcXVlc3QudXJsLCB7CiAgICAgICAgICAgICAgICAuLi5mZXRjaFJlcXVlc3Qub3B0aW9ucywKICAgICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0gewogICAgICAgICAgICAgICAgaWQ6IGZldGNoUmVxdWVzdC5pZCwKICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgIG9rOiByZXNwb25zZS5vaywKICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQ6IHJlc3BvbnNlLnJlZGlyZWN0ZWQsCiAgICAgICAgICAgICAgICB0eXBlOiByZXNwb25zZS50eXBlLAogICAgICAgICAgICAgICAgdXJsOiByZXNwb25zZS51cmwsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMocmVzcG9uc2UuaGVhZGVycy5lbnRyaWVzKCkpLAogICAgICAgICAgICAgICAgYm9keTogcmVzcG9uc2VCb2R5CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdDsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGlkOiBmZXRjaFJlcXVlc3QuaWQsCiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InID8gJ0dRTCBmZXRjaCB0aW1lb3V0ICgnICsgKHRpbWVvdXRNcyAvIDEwMDApICsgJ3MpJyA6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICAvLyBIb29rIGZldGNoKCkgaW4gdGhlIHdpbmRvdyBzY29wZSB0byBjYXB0dXJlIGF1dGggaGVhZGVycyBhbmQgbW9kaWZ5IHBsYXllciB0eXBlIHJlcXVlc3RzCiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gV2luZG93IGZldGNoIGhvb2sgaW5zdGFsbGVkJyk7CiAgICAgICAgbGV0IGhhc0xvZ2dlZEhlYWRlcnMgPSBmYWxzZTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgd2luZG93LnJlYWxGZXRjaCA9IHJlYWxGZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsLCBpbml0KSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBHUUxEZXZpY2VJRCAhPSBkZXZpY2VJZCkgewogICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlRGV2aWNlSWQnLCBHUUxEZXZpY2VJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1WZXJzaW9uJ10gIT09IENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uID0gaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXSAhPT0gQ2xpZW50U2Vzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50U2Vzc2lvbicsIENsaWVudFNlc3Npb24gPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSAhPT0gQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInLCBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddICE9PSBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWRIZWFkZXJzICYmIEdRTERldmljZUlEICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChHUUxEZXZpY2VJRCA/ICd5ZXMnIDogJ25vJykgKyAnLCBBdXRoOiAnICsgKEF1dGhvcml6YXRpb25IZWFkZXIgPyAneWVzJyA6ICdubycpICsgJywgSW50ZWdyaXR5OiAnICsgKENsaWVudEludGVncml0eUhlYWRlciA/ICd5ZXMnIDogJ25vJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIG1pbmkgcGxheWVyIGFib3ZlIGNoYXQgLSBUT0RPOiBSZWplY3QgdGhpcyBsb2NhbGx5IGluc3RlYWQgb2YgaGF2aW5nIHNlcnZlciByZWplY3QgaXQKICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VkUGxheWVyVHlwZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gSlNPTi5wYXJzZShpbml0LmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdCb2R5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICYmIG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAhPT0gRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGUgPSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW0FEIERFQlVHXSBSZXBsYWNlZCAnJHtyZXBsYWNlZFBsYXllclR5cGV9JyBwbGF5ZXIgdHlwZSB3aXRoICcke0ZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlfScgcGxheWVyIHR5cGVgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KG5ld0JvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZWRnZS5hZHMudHdpdGNoLnR2JykpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2dnZWRDc2FpVHlwZXMuaGFzKGNzYWlUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZWRDc2FpVHlwZXMuYWRkKGNzYWlUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUgKyAnIChjbGllbnQtc2lkZSBhZCBpbnNlcnRpb24sIG5vdCBibG9ja2FibGUgdmlhIG0zdTgpJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LCAnZmV0Y2gnKTsKICAgIH0KICAgIC8vIFNldCB1cCB2aXNpYmlsaXR5IG92ZXJyaWRlcyBhbmQgbG9jYWxTdG9yYWdlIGhvb2tzIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBhY3Jvc3MgcmVsb2FkcwogICAgZnVuY3Rpb24gb25Db250ZW50TG9hZGVkKCkgewogICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V2ZW50di1leHRlbnNpb24nKSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXYXJuaW5nOiA3VFYgZXh0ZW5zaW9uIGRldGVjdGVkIOKAlCBtYXkgY2F1c2UgYmxhY2sgc2NyZWVuIG9yIGJ1ZmZlcmluZyBpc3N1ZXMuIElmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zLCB0cnkgZGlzYWJsaW5nIDdUVi4nKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVzdW1lIHRoZSBwbGF5ZXIgb24gdGFiIGZvY3VzIGlmIFR3aXRjaCBwYXVzZWQgaXQgZHVyaW5nIGFuIGFkIG9uIGEgaGlkZGVuIHRhYi4KICAgICAgICAvLyBQcmV2aW91c2x5IGFsc28gc3Bvb2ZlZCBkb2N1bWVudC5oaWRkZW4gLyB2aXNpYmlsaXR5U3RhdGUgLyBoYXNGb2N1cyBhbmQgc3dhbGxvd2VkCiAgICAgICAgLy8gdGhlIGV2ZW50cyBvbiB0aGUgY2FwdHVyZSBwaGFzZS4gVGhhdCBicm9rZSBvdGhlciBleHRlbnNpb25zIHRoYXQga2V5IG9mZiByZWFsCiAgICAgICAgLy8gdmlzaWJpbGl0eSAoZS5nLiBCZXR0ZXJUVFYgIk11dGUgSW52aXNpYmxlIFBsYXllciIpLiBSZXN1bWUtb24tZm9jdXMgYWxvbmUgaXMKICAgICAgICAvLyBlbm91Z2ggdG8ga2VlcCBwbGF5YmFjayBhbGl2ZSBhY3Jvc3MgaGlkZGVu4oaSdmlzaWJsZSB0cmFuc2l0aW9ucyBkdXJpbmcgYWRzLgogICAgICAgIC8vIFN5bmMnZCB3aXRoIFRUVi1BQiB2Ni41LjAuCiAgICAgICAgbGV0IHdhc1ZpZGVvUGxheWluZyA9IHRydWU7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eUNoYW5nZSA9ICgpID0+IHsKICAgICAgICAgICAgY29uc3QgdmlkZW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID09PSAwKSByZXR1cm47CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5oaWRkZW4pIHsKICAgICAgICAgICAgICAgIHdhc1ZpZGVvUGxheWluZyA9ICF2aWRlb3NbMF0ucGF1c2VkICYmICF2aWRlb3NbMF0uZW5kZWQ7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgdmlkZW9zWzBdLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlKTsKICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBkZWNsYXJlT3B0aW9ucyh3aW5kb3cpOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBsc1JlbG9hZEFmdGVyQWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkUGxheWVyQWZ0ZXJBZCcpOwogICAgICAgIGlmIChsc1JlbG9hZEFmdGVyQWQgIT09IG51bGwpIHsKICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IGxzUmVsb2FkQWZ0ZXJBZCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc1JlbG9hZENvb2xkb3duID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZENvb2xkb3duU2Vjb25kcycpKTsKICAgICAgICBpZiAoIWlzTmFOKGxzUmVsb2FkQ29vbGRvd24pICYmIGxzUmVsb2FkQ29vbGRvd24gPj0gMCkgewogICAgICAgICAgICBSZWxvYWRDb29sZG93blNlY29uZHMgPSBsc1JlbG9hZENvb2xkb3duOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVSZWxvYWRDYXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZGlzYWJsZVJlbG9hZENhcCcpOwogICAgICAgIGlmIChsc0Rpc2FibGVSZWxvYWRDYXAgIT09IG51bGwpIHsKICAgICAgICAgICAgRGlzYWJsZVJlbG9hZENhcCA9IGxzRGlzYWJsZVJlbG9hZENhcCA9PT0gJ3RydWUnOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0RyaWZ0UmF0ZSA9IHBhcnNlRmxvYXQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2RyaWZ0Q29ycmVjdGlvblJhdGUnKSk7CiAgICAgICAgaWYgKCFpc05hTihsc0RyaWZ0UmF0ZSkgJiYgbHNEcmlmdFJhdGUgPj0gMCkgewogICAgICAgICAgICBEcmlmdENvcnJlY3Rpb25SYXRlID0gbHNEcmlmdFJhdGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGxheWVyVHlwZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19wbGF5ZXJUeXBlJyk7CiAgICAgICAgaWYgKGxzUGxheWVyVHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgICBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9IGxzUGxheWVyVHlwZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQaW5CYWNrdXAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcGluQmFja3VwUGxheWVyVHlwZScpOwogICAgICAgIGlmIChsc1BpbkJhY2t1cCAhPT0gbnVsbCkgewogICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gbHNQaW5CYWNrdXAgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQcmVmZXJMb3cgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcHJlZmVyTG93UXVhbGl0eUJhY2t1cCcpOwogICAgICAgIGlmIChsc1ByZWZlckxvdyA9PT0gJ2ZhbHNlJykgewogICAgICAgICAgICBQcmVmZXJMb3dRdWFsaXR5QmFja3VwID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFByZWZlckxvd1F1YWxpdHlCYWNrdXAgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgc3RpY2t5IENTQUkgcGF0aCBvbmx5LCBubyBhdXRvcGxheSBmYWxsYmFjayBvciBlc2NhcGUgaGF0Y2gnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNGYXN0QXV0b3BsYXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZmFzdEF1dG9wbGF5Rmlyc3RUcnknKTsKICAgICAgICBpZiAobHNGYXN0QXV0b3BsYXkgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgRmFzdEF1dG9wbGF5Rmlyc3RUcnkgPSBmYWxzZTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRmFzdEF1dG9wbGF5Rmlyc3RUcnkgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgZnVsbCBTb3VyY2UtdGllciBwcm9iZSBvbiBldmVyeSBicmVhaycpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0JhY2t1cFN3YXBGaXJzdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19iYWNrdXBTd2FwRmlyc3QnKTsKICAgICAgICBpZiAobHNCYWNrdXBTd2FwRmlyc3QgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgQmFja3VwU3dhcEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cFN3YXBGaXJzdCBkaXNhYmxlZCB2aWEgbG9jYWxTdG9yYWdlIOKAlCB1c2luZyBzdGlja3kgQ1NBSSBwYXRoIChzdHJpcCBvbiBuYXRpdmUgc3RyZWFtKScpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0Rpc2FibGVBZFNwb29maW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX2Rpc2FibGVBZFNwb29maW5nJyk7CiAgICAgICAgaWYgKGxzRGlzYWJsZUFkU3Bvb2ZpbmcgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgRGlzYWJsZUFkU3Bvb2ZpbmcgPSBmYWxzZTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWRTcG9vZmluZyBlbmFibGVkIHZpYSBsb2NhbFN0b3JhZ2Ugb3B0LWluIOKAlCBmaXJpbmcgR1FMIGFkLXRyYWNraW5nIGJlYWNvbnMnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNSZWNvdmVyRnJvbVNpbGVudE11dGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVjb3ZlckZyb21TaWxlbnRNdXRlJyk7CiAgICAgICAgaWYgKGxzUmVjb3ZlckZyb21TaWxlbnRNdXRlID09PSAnZmFsc2UnKSB7CiAgICAgICAgICAgIFJlY292ZXJGcm9tU2lsZW50TXV0ZSA9IGZhbHNlOwogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBSZWNvdmVyRnJvbVNpbGVudE11dGUgZGlzYWJsZWQgdmlhIGxvY2FsU3RvcmFnZSDigJQgaGFyZC1yZWxvYWQgYmFja3N0b3AgcmVzcGVjdHMgYWxyZWFkeS1tdXRlZCBzdGF0ZSwgbWlkLXNlc3Npb24gbWFudWFsIG11dGVzIHByZXNlcnZlZCBhY3Jvc3MgcmVsb2FkcycpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0hpZGVBZE92ZXJsYXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfaGlkZUFkT3ZlcmxheScpOwogICAgICAgIGlmIChsc0hpZGVBZE92ZXJsYXkgPT09ICd0cnVlJykgewogICAgICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gJy50YXMtYWRibG9jay1vdmVybGF5IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9JzsKICAgICAgICAgICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgfQogICAgfSBjYXRjaCB7fQogICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ29uZmlnOiBSZWxvYWRQbGF5ZXJBZnRlckFkID0gJyArIFJlbG9hZFBsYXllckFmdGVyQWQgKyAnLCBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSA9ICcgKyBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSArICcsIFBpbkJhY2t1cFBsYXllclR5cGUgPSAnICsgUGluQmFja3VwUGxheWVyVHlwZSk7CiAgICBob29rV2luZG93V29ya2VyKCk7CiAgICBob29rRmV0Y2goKTsKICAgIGNvbnN0IHJlYWxYSFJPcGVuID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW47CiAgICBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbiA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbihtZXRob2QsIHVybCkgewogICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiB1cmwuaW5jbHVkZXMoJ2VkZ2UuYWRzLnR3aXRjaC50dicpKSB7CiAgICAgICAgICAgIGNvbnN0IGNzYWlUeXBlID0gdXJsLmluY2x1ZGVzKCdicD1taWRyb2xsJykgPyAnbWlkcm9sbCcgOiB1cmwuaW5jbHVkZXMoJ2JwPXByZXJvbGwnKSA/ICdwcmVyb2xsJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgY29uc3QgeGhyS2V5ID0gY3NhaVR5cGUgKyAnLXhocic7CiAgICAgICAgICAgIGlmICghbG9nZ2VkQ3NhaVR5cGVzLmhhcyh4aHJLZXkpKSB7CiAgICAgICAgICAgICAgICBsb2dnZWRDc2FpVHlwZXMuYWRkKHhocktleSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDU0FJIGFkIHJlcXVlc3QgKFhIUikgZGV0ZWN0ZWQg4oCUIHR5cGU6ICcgKyBjc2FpVHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlYWxYSFJPcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9LCAnb3BlbicpOwogICAgaWYgKFBsYXllckJ1ZmZlcmluZ0ZpeCkgewogICAgICAgIG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcoKTsKICAgIH0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJpbnRlcmFjdGl2ZSIpIHsKICAgICAgICBvbkNvbnRlbnRMb2FkZWQoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICAgICAgfSk7CiAgICB9CiAgICB3aW5kb3cuc2ltdWxhdGVBZHMgPSAoZGVwdGgpID0+IHsKICAgICAgICBpZiAoZGVwdGggPT09IHVuZGVmaW5lZCB8fCBkZXB0aCA8IDApIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkIGRlcHRoIHBhcmFtZXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBpbiBuZXN0ZWQgZnJhbWVzIHRoYXQgYXJlbid0IGxlZ2l0aW1hdGUgVHdpdGNoIGVtYmVkIGNvbnRleHRzLgogICAgLy8gVHdpdGNoJ3MgbWFpbiBjaGFubmVsIHBhZ2UgaGFzIDUrIGhpZGRlbiBjcm9zcy1vcmlnaW4gaWZyYW1lcyAoYXV0aCwgYW5hbHl0aWNzLAogICAgLy8gYWQgU0RLLCBldGMuKSBhbmQgdUJPIGluamVjdHMgaW50byBhbGwgbWF0Y2hpbmcgb25lcy4gRWFjaCBiZWNvbWVzIGEgcmFjaW5nIGluc3RhbmNlCiAgICAvLyB0aGF0IGZpZ2h0cyBmb3IgcGxheWVyIGNvbnRyb2wuIE9ubHkgdGhlIHRvcCBmcmFtZSBob3N0cyB0aGUgcGxheWVyIG9uIHR3aXRjaC50di9DSEFOTkVMOwogICAgLy8gbmVzdGVkIGF1eGlsaWFyeSBmcmFtZXMgYXJlIG5vaXNlLgogICAgLy8gQWxsb3ctbGlzdCBmb3IgbmVzdGVkLWZyYW1lIGluamVjdGlvbjogVHdpdGNoJ3MgdGhyZWUgZG9jdW1lbnRlZCBlbWJlZCBjb250ZXh0cwogICAgLy8gKGh0dHBzOi8vZGV2LnR3aXRjaC50di9kb2NzL2VtYmVkL3ZpZGVvLWFuZC1jbGlwcy8pIOKAlCBwcmVzZXJ2ZXMgVHdpdGNoIHN0cmVhbXMKICAgIC8vIGVtYmVkZGVkIG9uIHRoaXJkLXBhcnR5IHNpdGVzIHdoZXJlIHRoZSBzY3JpcHQgcnVucyBpbiBhbiBpZnJhbWUgd2hvc2UgcGFyZW50CiAgICAvLyBpcyBvbiBhIGRpZmZlcmVudCBvcmlnaW4uCiAgICAvLyBVc2Ugd2luZG93LmZyYW1lRWxlbWVudCB0byBkZXRlY3QgbmVzdGVkIGZyYW1lcyDigJQgbnVsbCBvbiB0b3AgZnJhbWUsIHRoZSBpZnJhbWUKICAgIC8vIGVsZW1lbnQgb24gYSBzYW1lLW9yaWdpbiBuZXN0ZWQgZnJhbWUsIHRocm93cyBvbiBhIGNyb3NzLW9yaWdpbiBuZXN0ZWQgZnJhbWUuCiAgICAvLyBNb3JlIHJlbGlhYmxlIHRoYW4gJ3dpbmRvdyAhPT0gd2luZG93LnRvcCcgYmVjYXVzZSBUYW1wZXJtb25rZXkgd3JhcHMgd2luZG93IGluIGEKICAgIC8vIHByb3h5IHdoZXJlIHRoZSBzdHJpY3QgY29tcGFyaXNvbiBjYW4gcmV0dXJuIHRydWUgZXZlbiBvbiB0aGUgdG9wIGZyYW1lLgogICAgbGV0IF9pc05lc3RlZCA9IGZhbHNlOwogICAgdHJ5IHsgX2lzTmVzdGVkID0gd2luZG93LmZyYW1lRWxlbWVudCAhPT0gbnVsbDsgfSBjYXRjaCAoX2UpIHsgX2lzTmVzdGVkID0gdHJ1ZTsgfQogICAgaWYgKF9pc05lc3RlZCkgewogICAgICAgIGNvbnN0IF9ob3N0ID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgY29uc3QgX2lzRW1iZWRDb250ZXh0ID0gX2hvc3QgPT09ICdwbGF5ZXIudHdpdGNoLnR2JyB8fCBfaG9zdCA9PT0gJ2VtYmVkLnR3aXRjaC50dicgfHwgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2VtYmVkLycpOwogICAgICAgIGlmICghX2lzRW1iZWRDb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIHZpZGVvLXN3YXAtbmV3IHNraXBwZWQg4oCUIG5lc3RlZCBmcmFtZSBvbiAnICsgX2hvc3QgKyBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSArICcgKG5vdCBhIFR3aXRjaCBlbWJlZCkuIElmIHlvdSBzZWUgdGhpcyBvbiB0d2l0Y2gudHYvQ0hBTk5FTCB0b3AgZnJhbWUsIHBsZWFzZSByZXBvcnQuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAvLyBTa2lwIGluamVjdGlvbiBvbiB0aGUgVHdpdGNoIGNsaXAgZWRpdG9yIOKAlCBjbGlwcy50d2l0Y2gudHYgaG9zdCBvciAvPGNoYW5uZWw+L2NsaXAvPHNsdWc+IHBhdGguCiAgICAvLyBPdXIgZmV0Y2gvV29ya2VyIGhvb2tzIGFuZCBidWZmZXIgbW9uaXRvciBhcmUgYWltZWQgYXQgdGhlIGxpdmUgY2hhbm5lbCBwbGF5ZXI7IG9uIHRoZQogICAgLy8gY2xpcCBlZGl0b3IncyBzZWVrYWJsZSBwcmV2aWV3IHRoZXkgaGF2ZSBubyBhZHMgdG8gYWN0IG9uIGFuZCBoYXZlIGNhdXNlZCB0aGUgcHJldmlldwogICAgLy8gdG8gZnJlZXplIHdoZW4gdGhlIHVzZXIgZHJhZ3MgdGhlIHRyaW0gcmFuZ2UuIChTeW5jJ2Qgd2l0aCBUVFYtQUIgdjYuNC45LikKICAgIHsKICAgICAgICBjb25zdCBfY2xpcEhvc3QgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICBjb25zdCBfY2xpcFBhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSB8fCAnJzsKICAgICAgICBpZiAoX2NsaXBIb3N0ID09PSAnY2xpcHMudHdpdGNoLnR2JyB8fCAvXlwvW14vXStcL2NsaXBcL1teL10rLy50ZXN0KF9jbGlwUGF0aCkpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gdmlkZW8tc3dhcC1uZXcgc2tpcHBlZCDigJQgY2xpcCBlZGl0b3IgcGFnZSAoJyArIF9jbGlwSG9zdCArIF9jbGlwUGF0aCArICcpLicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgY29uc3Qgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gNTQ7Ly8gVXNlZCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG91dGRhdGVkIHZlcnNpb25zIG9mIHRoZSBzY3JpcHRzCiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUd2l0Y2hBZFNvbHV0aW9ucyB2aWRlby1zd2FwLW5ldyB2JyArIG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICcgbG9hZGluZycpOwogICAgaWYgKHR5cGVvZiB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID49IG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbikgewogICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIENPTkZMSUNUOiB2aWRlby1zd2FwLW5ldyB2JyArIG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICcgc2tpcHBlZCDigJQgYW5vdGhlciBzY3JpcHQgYWxyZWFkeSBhY3RpdmUgKHYnICsgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICcpLiBSZW1vdmUgZHVwbGljYXRlIHNjcmlwdHMuJyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiA9IG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbjsKICAgIGZ1bmN0aW9uIGRlY2xhcmVPcHRpb25zKHNjb3BlKSB7CiAgICAgICAgLy8gT3B0aW9ucyAvIGdsb2JhbHMKICAgICAgICAvLyAnZW1iZWQnIG1vdmVkIHRvIGVuZCDigJQgZmllbGQtb2JzZXJ2ZWQgVHdpdGNoIHJldHVybnMgR1FMICdzZXJ2ZXIgZXJyb3InIGZvcgogICAgICAgIC8vIHN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4gb24gZW1iZWQgd2hlbiByZXF1ZXN0ZWQgZnJvbSB0d2l0Y2gudHYgb3JpZ2luLgogICAgICAgIHNjb3BlLk9QVF9CQUNLVVBfUExBWUVSX1RZUEVTID0gWyAncG9wb3V0JywgJ21vYmlsZV93ZWInLCAnZW1iZWQnIF07CiAgICAgICAgc2NvcGUuT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSA9ICdwb3BvdXQnOwogICAgICAgIC8vICd0d2l0Y2gtc3RpdGNoZWQnIGNhdGNoZXMgdGhlIHR3aXRjaC1zdGl0Y2hlZC0qIERBVEVSQU5HRSBjbGFzcyBmYW1pbHkKICAgICAgICAvLyAoLWFkLCAtbWlkLCAtcG9kLCBldGMuKSB3aXRob3V0IHJlcXVpcmluZyBhbiBleGFjdCAtYWQgc3VmZml4LiBUd2l0Y2gtCiAgICAgICAgLy8gcHJlZml4ZWQgc28gd2UgZG9uJ3QgcmUtaW50cm9kdWNlIHRoZSBQUiAjMTIwIGZhbHNlLXBvc2l0aXZlIGZyb20gYmFyZQogICAgICAgIC8vICdzdGl0Y2hlZCcgc3Vic3RyaW5nIG1hdGNoLgogICAgICAgIHNjb3BlLkFEX1NJR05JRklFUlMgPSBbJ3N0aXRjaGVkLWFkJywgJ0VYVC1YLUNVRS1PVVQnLCAndHdpdGNoLXN0aXRjaGVkJywgJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0idHdpdGNoLW1hZi1hZCInLCAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtdHJpZ2dlciInXTsKICAgICAgICAvLyBDb25maXJtZWQgc2Vzc2lvbi9zb3VyY2UgbWV0YWRhdGEsIG5ldmVyIGFkIG1hcmtlcnMg4oCUIGZpbHRlciBmcm9tIGNhbmRpZGF0ZSBsb2cuCiAgICAgICAgc2NvcGUuS05PV05fTk9OX0FEX1NJR05JRklFUlMgPSBbJ3R3aXRjaC1zZXNzaW9uJywgJ3R3aXRjaC1zdHJlYW0tc291cmNlJywgJ3R3aXRjaC1hZC1xdWFydGlsZScsICd0d2l0Y2gtYXNzaWdubWVudCddOwogICAgICAgIHNjb3BlLkFEX1NFR01FTlRfVVJMX1BBVFRFUk5TID0gWycvYWRzcXVhcmVkLycsICcvXzQwNC8nLCAnL3Byb2Nlc3NpbmcnXTsKICAgICAgICAvLyBQcmVjb21waWxlZCByZWdleGVzIHNoYXJlZCBhY3Jvc3MgdGhlIHN0cmlwQWRTZWdtZW50cyBob3QgcGF0aC4gRGVjbGFyZWQKICAgICAgICAvLyBoZXJlIChzZXJpYWxpemVkIGludG8gdGhlIHdvcmtlciBibG9iIHdpdGggZGVjbGFyZU9wdGlvbnMpIHNvIGxpdGVyYWxzCiAgICAgICAgLy8gaW5zaWRlIHRoZSBwZXItbGluZSBzdHJpcCBsb29wIGRvbid0IHJlY29tcGlsZSBvbiBldmVyeSBpdGVyYXRpb24uCiAgICAgICAgc2NvcGUuVFdJVENIX0FEX1VSTF9SRVdSSVRFX1JFR0VYID0gLyhYLVRWLVRXSVRDSC1BRCg/Oi1bQS1aXSspKi1VUkxTPz0iKVteIl0qKCIpL2c7CiAgICAgICAgc2NvcGUuVVJJX0FUVFJJQlVURV9SRUdFWCA9IC9VUkk9IihbXiJdKykiLzsKICAgICAgICBzY29wZS5MSVZFX1NJR05JRklFUiA9ICcsbGl2ZSc7CiAgICAgICAgc2NvcGUuQ0xJRU5UX0lEID0gJ2tpbW5lNzhreDNuY3g2YnJnbzRtdjZ3a2k1aDFrbyc7CiAgICAgICAgLy8gVGhlc2UgYXJlIG9ubHkgcmVhbGx5IGZvciBXb3JrZXIgc2NvcGUuLi4KICAgICAgICBzY29wZS5TdHJlYW1JbmZvcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3NCeVVybCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgLy8gTmVlZCB0aGlzIGluIGJvdGggc2NvcGVzLiBXaW5kb3cgc2NvcGUgbmVlZHMgdG8gdXBkYXRlIHRoaXMgdG8gd29ya2VyIHNjb3BlLgogICAgICAgIHNjb3BlLmdxbF9kZXZpY2VfaWQgPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudEludGVncml0eUhlYWRlciA9IG51bGw7CiAgICAgICAgc2NvcGUuQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZDsKICAgICAgICBzY29wZS5TaW11bGF0ZWRBZHNEZXB0aCA9IDA7CiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgc2NvcGUuUmVsb2FkUGxheWVyQWZ0ZXJBZCA9IHRydWU7Ly8gQWZ0ZXIgdGhlIGFkIGZpbmlzaGVzIGRvIGEgcGxheWVyIHJlbG9hZCBpbnN0ZWFkIG9mIHBhdXNlL3BsYXkKICAgICAgICBzY29wZS5SZWxvYWRDb29sZG93blNlY29uZHMgPSAzMDsvLyBNaW5pbXVtIHNlY29uZHMgYmV0d2VlbiByZWxvYWRzIOKAlCBicmVha3MgQ1NBSSBjYXNjYWRlcyB0cmlnZ2VyZWQgYnkgcmVsb2FkCiAgICAgICAgc2NvcGUuRWFybHlSZWxvYWRQb2xsVGhyZXNob2xkID0gNTsvLyBBbGwtc3RyaXBwZWQgcG9sbHMgYmVmb3JlIGVhcmx5IHJlbG9hZCAofjJzIGVhY2gsIHNvIDUgPSB+MTBzOyAwID0gZGlzYWJsZSkKICAgICAgICBzY29wZS5QaW5CYWNrdXBQbGF5ZXJUeXBlID0gZmFsc2U7Ly8gSWYgdHJ1ZSwgcmVtZW1iZXIgd2hpY2ggYmFja3VwIHBsYXllciB0eXBlIHdvcmtlZCBhbmQgdHJ5IGl0IGZpcnN0IG9uIG5leHQgYWQgYnJlYWsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvTWF4QWdlTXMgPSAzMCAqIDYwICogMTAwMDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbUluZm8oY2hhbm5lbE5hbWUsIHVzaGVyUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICBMYXN0U2VlbkF0OiBEYXRlLm5vdygpLAogICAgICAgICAgICBVc2hlclBhcmFtczogdXNoZXJQYXJhbXMsCiAgICAgICAgICAgIFVybHM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIEVuY29kaW5nczogbnVsbCwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzOiBudWxsLAogICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NTdGF0dXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4OiAtMSwKICAgICAgICAgICAgUGlubmVkQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgSGFzQ2hlY2tlZFVua25vd25UYWdzOiBmYWxzZSwKICAgICAgICAgICAgSGFzQ29uZmlybWVkQWRBdHRyczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZEFkQXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIEhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzOiBmYWxzZSwKICAgICAgICAgICAgSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3M6IGZhbHNlLAogICAgICAgICAgICBJc01pZHJvbGw6IGZhbHNlLAogICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICBOdW1TdHJpcHBlZEFkU2VnbWVudHM6IDAsCiAgICAgICAgICAgIFJlY292ZXJ5U2VnbWVudHM6IFtdLAogICAgICAgICAgICBSZWNvdmVyeVN0YXJ0U2VxOiB1bmRlZmluZWQsCiAgICAgICAgICAgIENsZWFuUGxheWxpc3RDb3VudDogMCwKICAgICAgICAgICAgUGVuZGluZ0FkRW5kQXQ6IDAsCiAgICAgICAgICAgIEFkRW5kQm91bmNlQ291bnQ6IDAsCiAgICAgICAgICAgIENvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzOiAwLAogICAgICAgICAgICBVc2VGYWxsYmFja1N0cmVhbTogZmFsc2UsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZU0zVTg6IG51bGwsCiAgICAgICAgICAgIExhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQ6IDAsCiAgICAgICAgICAgIENvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xsczogMCwKICAgICAgICAgICAgRWFybHlSZWxvYWRUcmlnZ2VyZWQ6IGZhbHNlLAogICAgICAgICAgICBMYXN0UGxheWVyUmVsb2FkOiAwLAogICAgICAgICAgICBSZWxvYWRUaW1lc3RhbXBzOiBbXSwKICAgICAgICAgICAgLy8gRGV0ZWN0aW9uIGRpYWdub3N0aWNzCiAgICAgICAgICAgIExvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uOiBmYWxzZSwKICAgICAgICAgICAgQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXM6IDAsCiAgICAgICAgICAgIExvZ2dlZFRva2VuRmFpbHVyZVN0cmVhazogZmFsc2UsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hc2tBc05hdGl2ZShmbiwgbmFtZSkgewogICAgICAgIGZuLnRvU3RyaW5nID0gKCkgPT4gJ2Z1bmN0aW9uICcgKyBuYW1lICsgJygpIHsgW25hdGl2ZSBjb2RlXSB9JzsKICAgICAgICByZXR1cm4gZm47CiAgICB9CiAgICBmdW5jdGlvbiBwcnVuZVN0cmVhbUluZm9zKCkgewogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsTmFtZSBpbiBTdHJlYW1JbmZvcykgewogICAgICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8uTGFzdFNlZW5BdCB8fCAobm93IC0gc3RyZWFtSW5mby5MYXN0U2VlbkF0KSA+IFN0cmVhbUluZm9NYXhBZ2VNcykgewogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gJiYgc3RyZWFtSW5mby5VcmxzKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5VcmxzLmZvckVhY2goKF8sIHVybCkgPT4geyBkZWxldGUgU3RyZWFtSW5mb3NCeVVybFt1cmxdOyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlbGV0ZSBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjb25zdCBsb2dnZWRDc2FpVHlwZXMgPSBuZXcgU2V0KCk7CiAgICBsZXQgdHdpdGNoUGxheWVyQW5kU3RhdGUgPSBudWxsOwogICAgbGV0IGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgPSBmYWxzZTsKICAgIGxldCBsYXN0UmVsb2FkVGltZXN0YW1wID0gMDsKICAgIGxldCByZWxvYWRUaW1lc3RhbXBzID0gW107CiAgICBsZXQgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gbnVsbDsvLyB0cmFja3MgcHJlLWVzY2FsYXRpb24gdmFsdWUgc28gd2UgY2FuIHJldmVydCB3aGVuIHRoZSBidXJzdCBzdWJzaWRlcwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgY29uc3Qgd29ya2VyU3RyaW5nQ29uZmxpY3RzID0gWwogICAgICAgICd0d2l0Y2gnLAogICAgICAgICdpc1ZhcmlhbnRBJy8vIFR3aXRjaE5vU3ViCiAgICBdOwogICAgY29uc3Qgd29ya2VyU3RyaW5nQWxsb3cgPSBbXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ1JlaW5zZXJ0ID0gWwogICAgICAgICdpc1ZhcmlhbnRBJywvLyBUd2l0Y2hOb1N1YiAocHJpb3IgdG8gKDAuOSkpCiAgICAgICAgJ2Jlc3VwZXIvJywvLyBUd2l0Y2hOb1N1YiAoMC45KQogICAgICAgICcke3BhdGNoX3VybH0nLy8gVHdpdGNoTm9TdWIgKDAuOS4xKQogICAgXTsKICAgIGZ1bmN0aW9uIGdldENsZWFuV29ya2VyKHdvcmtlcikgewogICAgICAgIGxldCByb290ID0gbnVsbDsKICAgICAgICBsZXQgcGFyZW50ID0gbnVsbDsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSAmJiAhd29ya2VyU3RyaW5nQWxsb3cuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSkgewogICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8vIEZvcmVpZ24gZXh0ZW5zaW9uIG1heSBoYXZlIGZyb3plbiBXb3JrZXIucHJvdG90eXBlOyBwZXItbGluayB0cnktY2F0Y2guCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhcmVudCwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSk7IH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gUGVyLWxpbmsgdHJ5LWNhdGNoOiBmb3JlaWduLWZyb3plbiBlbnRyeSBzaG91bGRuJ3QgYWJvcnQgdGhlIGNoYWluLgogICAgICAgICAgICB0cnkgeyBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVpbnNlcnRbaV0sIHBhcmVudCk7IH0gY2F0Y2gge30KICAgICAgICAgICAgcGFyZW50ID0gcmVpbnNlcnRbaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQ7CiAgICB9CiAgICBmdW5jdGlvbiBpc1ZhbGlkV29ya2VyKHdvcmtlcikgewogICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHdvcmtlci50b1N0cmluZygpOwogICAgICAgIGNvbnN0IGhhc0NvbmZsaWN0ID0gd29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICAgICAgY29uc3QgaGFzQWxsb3cgPSB3b3JrZXJTdHJpbmdBbGxvdy5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpOwogICAgICAgIGNvbnN0IGhhc1JlaW5zZXJ0ID0gd29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgICAgICBpZiAoaGFzQ29uZmxpY3QgJiYgIWhhc0FsbG93ICYmICFoYXNSZWluc2VydCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgcmVqZWN0ZWQg4oCUIGNvbmZsaWN0IHN0cmluZyBmb3VuZDogJyArIHdvcmtlclN0cmluZ0NvbmZsaWN0cy5maWx0ZXIoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkuam9pbignLCAnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhaGFzQ29uZmxpY3QgfHwgaGFzQWxsb3cgfHwgaGFzUmVpbnNlcnQ7CiAgICB9CiAgICBsZXQgaW5qZWN0ZWRCbG9iVXJsID0gbnVsbDsKICAgIGxldCBvcmlnaW5hbFJldm9rZU9iamVjdFVSTCA9IG51bGw7CiAgICBmdW5jdGlvbiBob29rV2luZG93V29ya2VyKCkgewogICAgICAgIC8vIFByZXZlbnQgVHdpdGNoIGZyb20gcmV2b2tpbmcgb3VyIGluamVjdGVkIHdvcmtlciBibG9iIFVSTAogICAgICAgIGlmICghVVJMLnJldm9rZU9iamVjdFVSTC5fX3Rhc01hc2tlZCkgewogICAgICAgICAgICBvcmlnaW5hbFJldm9rZU9iamVjdFVSTCA9IFVSTC5yZXZva2VPYmplY3RVUkw7CiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwgPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24odXJsKSB7CiAgICAgICAgICAgICAgICBpZiAodXJsID09PSBpbmplY3RlZEJsb2JVcmwpIHJldHVybjsKICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFJldm9rZU9iamVjdFVSTC5jYWxsKHRoaXMsIHVybCk7CiAgICAgICAgICAgIH0sICdyZXZva2VPYmplY3RVUkwnKTsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTC5fX3Rhc01hc2tlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlaW5zZXJ0ID0gZ2V0V29ya2Vyc0ZvclJlaW5zZXJ0KHdpbmRvdy5Xb3JrZXIpOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIChnZXRDbGVhbldvcmtlcih3aW5kb3cuV29ya2VyKSB8fCB3aW5kb3cuV29ya2VyKSB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGxldCBpc1R3aXRjaFdvcmtlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpc1R3aXRjaFdvcmtlciA9IG5ldyBVUkwodHdpdGNoQmxvYlVybCkub3JpZ2luLmVuZHNXaXRoKCcudHdpdGNoLnR2Jyk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICBpZiAoIWlzVHdpdGNoV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gTm9uLVR3aXRjaCB3b3JrZXIgc2tpcHBlZDogJyArIHR3aXRjaEJsb2JVcmwpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFByZS1jaGVjazogdmVyaWZ5IHdlIGNhbiBmZXRjaCB0aGUgd29ya2VyIEpTIGJlZm9yZSBpbmplY3RpbmcKICAgICAgICAgICAgICAgIGxldCBwcmVmZXRjaGVkV29ya2VySnMgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsgcHJlZmV0Y2hlZFdvcmtlckpzID0gZ2V0V2FzbVdvcmtlckpzKHR3aXRjaEJsb2JVcmwpOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICBpZiAoIXByZWZldGNoZWRXb3JrZXJKcykgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEZhaWxlZCB0byBmZXRjaCB3b3JrZXIgSlMg4oCUIGZhbGxpbmcgYmFjayB0byB1bm1vZGlmaWVkIHdvcmtlcicpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdvcmtlciBpbnRlcmNlcHRlZCDigJQgaW5qZWN0aW5nIGFkLWJsb2NrIGhvb2tzJyk7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdCbG9iU3RyID0gYAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdGZXRjaFJlcXVlc3RzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgICAgICR7aGFzQWRUYWdzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRNYXRjaGVkQWRTaWduaWZpZXJzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtzdHJpcEFkU2VnbWVudHMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3Byb2Nlc3NNM1U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtob29rV29ya2VyRmV0Y2gudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2RlY2xhcmVPcHRpb25zLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRBY2Nlc3NUb2tlbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z3FsUmVxdWVzdC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cGFyc2VBdHRyaWJ1dGVzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtzZXRTdHJlYW1JbmZvVXJscy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7b25Gb3VuZEFkLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRXYXNtV29ya2VySnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFNlcnZlclRpbWVGcm9tTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cmVwbGFjZVNlcnZlclRpbWVJbk0zdTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFN0cmVhbVVybEZvclJlc29sdXRpb24udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3VwZGF0ZUFkYmxvY2tCYW5uZXJGb3JTdHJlYW0udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3BydW5lU3RyZWFtSW5mb3MudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2NyZWF0ZVN0cmVhbUluZm8udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBnZXRXYXNtV29ya2VySnMoJyR7dHdpdGNoQmxvYlVybC5yZXBsYWNlQWxsKCInIiwgIiUyNyIpfScpOwogICAgICAgICAgICAgICAgICAgIGRlY2xhcmVPcHRpb25zKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fX3Rhc1BydW5lSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3Rhc1BydW5lSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwcnVuZVN0cmVhbUluZm9zLCA1ICogNjAgKiAxMDAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUmVsb2FkUGxheWVyQWZ0ZXJBZCA9ICR7UmVsb2FkUGxheWVyQWZ0ZXJBZH07CiAgICAgICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gJHtSZWxvYWRDb29sZG93blNlY29uZHN9OwogICAgICAgICAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9ICR7RWFybHlSZWxvYWRQb2xsVGhyZXNob2xkfTsKICAgICAgICAgICAgICAgICAgICBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJHtQaW5CYWNrdXBQbGF5ZXJUeXBlfTsKICAgICAgICAgICAgICAgICAgICBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFID0gJyR7T1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRX0nOwogICAgICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgPSAke2dxbF9kZXZpY2VfaWQgPyAiJyIgKyBncWxfZGV2aWNlX2lkICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9ICR7QXV0aG9yaXphdGlvbkhlYWRlciA/ICInIiArIEF1dGhvcml6YXRpb25IZWFkZXIgKyAiJyIgOiB1bmRlZmluZWR9OwogICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9ICR7Q2xpZW50SW50ZWdyaXR5SGVhZGVyID8gIiciICsgQ2xpZW50SW50ZWdyaXR5SGVhZGVyICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVWJvVXBkYXRlRGV2aWNlSWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdGZXRjaFJlc3BvbnNlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXNwb25zZURhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIHRpbWVvdXRJZCB9ID0gcGVuZGluZ0ZldGNoUmVxdWVzdHMuZ2V0KHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlc3BvbnNlRGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHJlc3BvbnNlRGF0YS5lcnJvcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSByZXNwb25zZSBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IHRha2VzIHN0YXR1cy9zdGF0dXNUZXh0L2hlYWRlcnMg4oCUIHVybC9yZWRpcmVjdGVkL3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZS4gSVZTIFdBU00gdmFsaWRhdGVzIHRoZXNlIChTcGFkZS90cmFja2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cykgYW5kIHRocm93cyBOZXR3b3JrRXJyb3IgaWYgdGhleSdyZSBtaXNzaW5nIOKAlCBUVFYtQUIgdjYuMy41IGZpeC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VEYXRhLmJvZHksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VEYXRhLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlRGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VEYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICd1cmwnLCB7IHZhbHVlOiByZXNwb25zZURhdGEudXJsIHx8ICcnLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzcG9uc2UsICdyZWRpcmVjdGVkJywgeyB2YWx1ZTogISFyZXNwb25zZURhdGEucmVkaXJlY3RlZCwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndHlwZScsIHsgdmFsdWU6IHJlc3BvbnNlRGF0YS50eXBlIHx8ICdiYXNpYycsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnU2ltdWxhdGVBZHMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW11bGF0ZWRBZHNEZXB0aCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTaW11bGF0ZWRBZHNEZXB0aDogJyArIFNpbXVsYXRlZEFkc0RlcHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAhQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50czogJyArIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBob29rV29ya2VyRmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZCB0aGUgZXZhbCDigJQgbWFsZm9ybWVkIHdvcmtlclN0cmluZyBzaG91bGRuJ3Qgc2lsZW50bHkgYnJlYWsKICAgICAgICAgICAgICAgICAgICAvLyBUd2l0Y2gncyBwbGF5ZXIgbG9naWMgd2l0aG91dCBhIGRpYWdub3N0aWMuCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXZhbCh3b3JrZXJTdHJpbmcpOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ1tBRCBERUJVR10gV29ya2VyIGV2YWwgZmFpbGVkIOKAlCBUd2l0Y2ggcGxheWVyIGxvZ2ljIG5vdCBsb2FkZWQ6JywgZSk7IH0KICAgICAgICAgICAgICAgIGAKICAgICAgICAgICAgICAgIGlmIChpbmplY3RlZEJsb2JVcmwgJiYgb3JpZ2luYWxSZXZva2VPYmplY3RVUkwpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgeyBvcmlnaW5hbFJldm9rZU9iamVjdFVSTC5jYWxsKFVSTCwgaW5qZWN0ZWRCbG9iVXJsKTsgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5qZWN0ZWRCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKTsKICAgICAgICAgICAgICAgIHN1cGVyKGluamVjdGVkQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVYm9VcGRhdGVBZEJhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcihlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIoZmFsc2UsIGUuZGF0YS5raW5kKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1BhdXNlUmVzdW1lUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBhc3luYyBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEua2V5ID09ICdGZXRjaFJlcXVlc3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IGV2ZW50LmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IGhhbmRsZVdvcmtlckZldGNoUmVxdWVzdChmZXRjaFJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ0ZldGNoUmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIFdvcmtlciBjcmFzaCByZWNvdmVyeSDigJQgSVZTIFdBU00gd29ya2VyIGNhbiBmaXJlIFJ1bnRpbWVFcnJvcgogICAgICAgICAgICAgICAgLy8gKGUuZy4gImluZGV4IG91dCBvZiBib3VuZHMiKSBhbmQgZGllLiBBIHNpbmdsZSBjcmFzaCBmaXJlcyBtdWx0aXBsZQogICAgICAgICAgICAgICAgLy8gZXJyb3IgZXZlbnRzOyBkZWR1cGUgdmlhIGEgbG9jYWwgZmxhZy4gT24gZmlyc3QgZXJyb3IsIHRyaWdnZXIgYQogICAgICAgICAgICAgICAgLy8gcGxheWVyIHJlbG9hZCDigJQgVHdpdGNoIHJlLXNwYXducyB0aGUgd29ya2VyIGFzIHBhcnQgb2YgdGhlIG5ldwogICAgICAgICAgICAgICAgLy8gcGxheWVyIGluc3RhbmNlLCBhbmQgZXhpc3RpbmcgcmVsb2FkIGNvb2xkb3duIHByZXZlbnRzIHJlc3RhcnQgbG9vcHMuCiAgICAgICAgICAgICAgICBsZXQgY3Jhc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyYXNoZWQpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBJVlMgV0FTTSB3b3JrZXIgY3Jhc2hlZDogJyArICgoZSAmJiBlLm1lc3NhZ2UpIHx8ICd1bmtub3duIGVycm9yJykgKyAnIOKAlCB0cmlnZ2VyaW5nIHBsYXllciByZWxvYWQgdG8gcmVjb3ZlcicpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7IHJlbG9hZFR3aXRjaFBsYXllcihmYWxzZSk7IH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXb3JrZXIgY3Jhc2ggcmVjb3ZlcnkgZmFpbGVkOiAnICsgZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCB3b3JrZXJJbnN0YW5jZSA9IHJlaW5zZXJ0V29ya2VycyhuZXdXb3JrZXIsIHJlaW5zZXJ0KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnV29ya2VyJywgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlckluc3RhbmNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFdvcmtlcih2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB3b3JrZXJJbnN0YW5jZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQXR0ZW1wdCB0byBzZXQgdHdpdGNoIHdvcmtlciBkZW5pZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbVdvcmtlckpzKHR3aXRjaEJsb2JVcmwpIHsKICAgICAgICBpZiAoIWdldFdhc21Xb3JrZXJKcy5jYWNoZSkgewogICAgICAgICAgICBnZXRXYXNtV29ya2VySnMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRXYXNtV29ya2VySnMuY2FjaGVbdHdpdGNoQmxvYlVybF07CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJlcS5vcGVuKCdHRVQnLCB0d2l0Y2hCbG9iVXJsLCBmYWxzZSk7CiAgICAgICAgcmVxLm92ZXJyaWRlTWltZVR5cGUoInRleHQvamF2YXNjcmlwdCIpOwogICAgICAgIHJlcS5zZW5kKCk7CiAgICAgICAgY29uc3QgdGV4dCA9IHJlcS5yZXNwb25zZVRleHQ7CiAgICAgICAgZ2V0V2FzbVdvcmtlckpzLmNhY2hlW3R3aXRjaEJsb2JVcmxdID0gdGV4dDsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0cmVhbUluZm9VcmxzKHN0cmVhbUluZm8sIGVuY29kaW5nc00zdTgpIHsKICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvLyB2MiBBUEkgdmFyaWFudCBVUkxzIGFyZSByYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnIGluIHRoZSBwYXRoLgogICAgICAgICAgICAvLyBBY2NlcHQgYWJzb2x1dGUgVVJMcyAoY29udGFpbmluZyAnOi8vJykgYWxvbmdzaWRlICcubTN1OCcgVVJMcy4KICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmVzW2ldPy50cmltKCk7CiAgICAgICAgICAgIGlmICh0cmltbWVkICYmICF0cmltbWVkLnN0YXJ0c1dpdGgoJyMnKSAmJiAodHJpbW1lZC5pbmNsdWRlcygnLm0zdTgnKSB8fCB0cmltbWVkLmluY2x1ZGVzKCc6Ly8nKSkpIHsKICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zQnlVcmxbbGluZXNbaV0udHJpbUVuZCgpXSA9IHN0cmVhbUluZm87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBsaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uSW5mbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVSYXRlOiBhdHRyaWJ1dGVzWydGUkFNRS1SQVRFJ10sCiAgICAgICAgICAgICAgICAgICAgICAgIFVybDogbGluZXNbaSArIDFdCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHMuc2V0KGxpbmVzW2kgKyAxXS50cmltRW5kKCksIHJlc29sdXRpb25JbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZUFkYmxvY2tCYW5uZXJGb3JTdHJlYW0oc3RyZWFtSW5mbykgewogICAgICAgIGNvbnN0IGlzU2hvd2luZ0FkID0gISFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nczsKICAgICAgICBpZiAoIWlzU2hvd2luZ0FkICYmIChzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyB8fCBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA+IDApKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gZmFsc2U7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID0gMDsKICAgICAgICB9CiAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICBrZXk6ICdVYm9VcGRhdGVBZEJhbm5lcicsCiAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgIGhhc0FkczogaXNTaG93aW5nQWQsCiAgICAgICAgICAgIGlzU3RyaXBwaW5nQWRTZWdtZW50czogc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMsCiAgICAgICAgICAgIG51bVN0cmlwcGVkQWRTZWdtZW50czogc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMsCiAgICAgICAgICAgIGFjdGl2ZUJhY2t1cFBsYXllclR5cGU6IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4ID49IDAgPyBPUFRfQkFDS1VQX1BMQVlFUl9UWVBFU1tzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleF0gOiBudWxsCiAgICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBvbkZvdW5kQWQoc3RyZWFtSW5mbywgdGV4dFN0ciwgcmVsb2FkUGxheWVyLCByZWFsRmV0Y2gsIHVybCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBsZXQgcmVzdWx0ID0gdGV4dFN0cjsKICAgICAgICBzdHJlYW1JbmZvLklzTWlkcm9sbCA9IHRleHRTdHIuaW5jbHVkZXMoJyJNSURST0xMIicpIHx8IHRleHRTdHIuaW5jbHVkZXMoJyJtaWRyb2xsIicpOwogICAgICAgIC8vIFRyYWNrIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzIHRvIGRpc3Rpbmd1aXNoIHJlYWwgYWRzIGZyb20gZmFsc2UtcG9zaXRpdmUgc2lnbmlmaWVyIG1hdGNoZXMuCiAgICAgICAgLy8gVGhlc2UgYXR0cmlidXRlcyBhcmUgcHJlc2VudCBvbiBldmVyeSByZWFsIFR3aXRjaCBhZCBhbmQgYWJzZW50IGZyb20gYW55dGhpbmcgdGhhdCBjb3VsZAogICAgICAgIC8vIGZhbHNlLXBvc2l0aXZlIChlLmcuIG1ldGFkYXRhIGNvbnRhaW5pbmcgdGhlIHdvcmQgJ3N0aXRjaGVkJykuCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0NvbmZpcm1lZEFkQXR0cnMpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gdGV4dFN0ci5pbmNsdWRlcygnWC1UVi1UV0lUQ0gtQUQtQUQtU0VTU0lPTi1JRCcpIHx8IHRleHRTdHIuaW5jbHVkZXMoJ1gtVFYtVFdJVENILUFELVJBRFMtVE9LRU4nKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGxheWVyVHlwZXMgPSBbLi4uT1BUX0JBQ0tVUF9QTEFZRVJfVFlQRVNdOwogICAgICAgIC8vIFRyeSBwaW5uZWQgYmFja3VwIHBsYXllciB0eXBlIGZpcnN0IGlmIGF2YWlsYWJsZQogICAgICAgIGlmIChQaW5CYWNrdXBQbGF5ZXJUeXBlICYmIHN0cmVhbUluZm8uUGlubmVkQmFja3VwUGxheWVyVHlwZSkgewogICAgICAgICAgICBjb25zdCBwaW5uZWRJbmRleCA9IHBsYXllclR5cGVzLmluZGV4T2Yoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgaWYgKHBpbm5lZEluZGV4ID4gMCkgewogICAgICAgICAgICAgICAgcGxheWVyVHlwZXMuc3BsaWNlKHBpbm5lZEluZGV4LCAxKTsKICAgICAgICAgICAgICAgIHBsYXllclR5cGVzLnVuc2hpZnQoc3RyZWFtSW5mby5QaW5uZWRCYWNrdXBQbGF5ZXJUeXBlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuc2l6ZSA+PSBwbGF5ZXJUeXBlcy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyAmJiAhc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MuaW5jbHVkZXModXJsKSkgewogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncywgcmVzb2x1dGlvbkluZm8pOwogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJhY2t1cFNlYXJjaFN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgICAgICBsZXQgYmFja3VwUGxheWVyVHlwZUluZm8gPSAnJzsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYXllclR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllclR5cGUgPSBwbGF5ZXJUeXBlc1tpXTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5oYXMocGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5SZXNwb25zZSA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUsIHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlblJlc3BvbnNlICE9IG51bGwgJiYgYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JCb2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IGVycm9yQm9keSA9ICcg4oCUICcgKyAoYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS50ZXh0KCkpLnN1YnN0cmluZygwLCAyMDApOyB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFjY2VzcyB0b2tlbiBIVFRQICcgKyBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyArICcgZm9yICcgKyBwbGF5ZXJUeXBlICsgKGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSA0MDMgPyAnIChpbnRlZ3JpdHk6ICcgKyAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyID8gJ3ByZXNlbnQnIDogJ21pc3NpbmcnKSArICcpJyA6ICcnKSArIGVycm9yQm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgPSAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID49IDMgJiYgIXN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkxvZ2dlZFRva2VuRmFpbHVyZVN0cmVhayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBUb2tlbiBmZXRjaCBmYWlsZWQgJyArIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgKyAnIHRpbWVzIGNvbnNlY3V0aXZlbHkgYWNyb3NzIHBsYXllciB0eXBlcyDigJQgcG9zc2libGUgVHdpdGNoIGRldGVjdGlvbiAvIGludGVncml0eSByb3RhdGlvbiAvIHJhdGUgbGltaXRpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVG9rZW5SZXNwb25zZSAhPSBudWxsICYmIGFjY2Vzc1Rva2VuUmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBhY2Nlc3NUb2tlblJlc3BvbnNlLmpzb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHJldHVybnMgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBpbiB0d28gb2JzZXJ2ZWQgc2hhcGVzOgogICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgZGF0YTogeyBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuOiB7Li4ufSB9IH0gKG1vc3QgcGxheWVyIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjogey4uLn0gfSAoZmxhdHRlciwgb2JzZXJ2ZWQgZm9yICdlbWJlZCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY2VwdCBlaXRoZXIuIEZpZWxkLW9ic2VydmVkIHNpbGVudGx5IGRyb3BwaW5nIGVtYmVkIGJhY2t1cCBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXQgPSBhY2Nlc3NUb2tlbj8uZGF0YT8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbj8uc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJJbmZvID0gYWNjZXNzVG9rZW4/LmVycm9ycyA/ICcgZXJyb3JzOiAnICsgSlNPTi5zdHJpbmdpZnkoYWNjZXNzVG9rZW4uZXJyb3JzKS5zdWJzdHJpbmcoMCwgMzAwKSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gR1FMIHJlc3BvbnNlIG1pc3Npbmcgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbiBmb3IgJyArIHBsYXllclR5cGUgKyAnLiBSZXNwb25zZSBrZXlzOiAnICsgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoYWNjZXNzVG9rZW4gfHwge30pKSArIGVyckluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyA9IChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzIHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlVG9rZW5GZXRjaEZhaWx1cmVzID49IDMgJiYgIXN0cmVhbUluZm8uTG9nZ2VkVG9rZW5GYWlsdXJlU3RyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFRva2VuIGZldGNoIGZhaWxlZCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZVRva2VuRmV0Y2hGYWlsdXJlcyArICcgdGltZXMgY29uc2VjdXRpdmVseSBhY3Jvc3MgcGxheWVyIHR5cGVzIOKAlCBwb3NzaWJsZSBUd2l0Y2ggZGV0ZWN0aW9uIC8gaW50ZWdyaXR5IHJvdGF0aW9uIC8gcmF0ZSBsaW1pdGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsSW5mbyA9IG5ldyBVUkwoJ2h0dHBzOi8vdXNoZXIudHR2bncubmV0L2FwaS8nICsgKFYyQVBJID8gJ3YyLycgOiAnJykgKyAnY2hhbm5lbC9obHMvJyArIHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUgKyAnLm0zdTgnICsgc3RyZWFtSW5mby5Vc2hlclBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgc3BhdC5zaWduYXR1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmxJbmZvLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgc3BhdC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmxJbmZvLmhyZWYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlICE9IG51bGwgJiYgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBVc2hlciBIVFRQICcgKyBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzICsgJyBmb3IgJyArIHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVUb2tlbkZldGNoRmFpbHVyZXMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRUb2tlbkZhaWx1cmVTdHJlYWsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmNvZGluZ3NNM3U4ID0gYXdhaXQgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKGVuY29kaW5nc00zdTgsIHJlc29sdXRpb25JbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrVGV4dFN0ciA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQWRUYWdzKGJhY2tUZXh0U3RyKSAmJiAoU2ltdWxhdGVkQWRzRGVwdGggPT0gMCB8fCBpID49IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSkpIHx8IGkgPj0gcGxheWVyVHlwZXMubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBiYWNrVGV4dFN0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZUluZm8gPSAnICgnICsgcGxheWVyVHlwZSArICcpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuc2V0KHBsYXllclR5cGUsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQaW5CYWNrdXBQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlBpbm5lZEJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkVuY29kaW5ncyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb3cgcmVzb2x1dGlvbiBzdHJlYW1zIHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgaW4gdGhlIFVJLiBUbyBmaXggdGhpcyB3ZSBtZXJnZSB0aGUgbG93IHJlcyBVUkxzIGludG8gdGhlIG1haW4gbTN1OAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsRW5jb2RpbmdzTTN1OCA9IHN0cmVhbUluZm8uRW5jb2RpbmdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsTGluZXMgPSBub3JtYWxFbmNvZGluZ3NNM3U4LnNwbGl0KC9ccj9cbi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub3JtYWxMaW5lcy5sZW5ndGggLSAxOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsTGluZXNbal0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhub3JtYWxMaW5lc1tqXS5zdWJzdHJpbmcobm9ybWFsTGluZXNbal0uaW5kZXhPZignOicpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNVcmwgPSBnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uKGVuY29kaW5nc00zdTgsIHN0cmVhbUluZm8uVXJscy5nZXQobm9ybWFsTGluZXNbaiArIDFdLnRyaW1FbmQoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNJbmYgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKG5ldyBSZWdFeHAoYF4uKig/PVxuLioke2xvd1Jlc1VybH0pYCwgJ20nKSk/LlswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb3dSZXNJbmYpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsb3dSZXNJbmYuc3Vic3RyaW5nKGxvd1Jlc0luZi5pbmRleE9mKCc6JykgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVjc0tleSA9ICdDT0RFQ1MnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc1NldHRpbmdzW2NvZGVjc0tleV0gPT09ICdzdHJpbmcnICYmIHR5cGVvZiBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzU2V0dGluZ3NbY29kZWNzS2V5XS5sZW5ndGggPj0gMyAmJiBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldLmxlbmd0aCA+PSAzICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdoZXYnKSB8fCByZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN0YXJ0c1dpdGgoJ2h2YycpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdWJzdHJpbmcoMCwgMykgIT09IGxvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV0uc3Vic3RyaW5nKDAsIDMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N3YXAgJyArIHJlc1NldHRpbmdzW2NvZGVjc0tleV0gKyAnIHRvICcgKyBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbExpbmVzW2pdID0gbm9ybWFsTGluZXNbal0ucmVwbGFjZSgvQ09ERUNTPSJbXiJdKyIvLCBgQ09ERUNTPSIke2xvd1Jlc1NldHRpbmdzW2NvZGVjc0tleV19ImApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobm9ybWFsTGluZXNbal0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbExpbmVzW2ogKyAxXSA9IGxvd1Jlc1VybCArICcgJy5yZXBlYXQoaiArIDEpOy8vIFRoZSBzdHJlYW0gZG9lc24ndCBsb2FkIHVubGVzcyBlYWNoIHVybCBsaW5lIGlzIHVuaXF1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBub3JtYWxMaW5lcy5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtSW5mb1VybHMoc3RyZWFtSW5mbywgZW5jb2RpbmdzTTN1OCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgfQogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmdldChwbGF5ZXJUeXBlKSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5zZXQocGxheWVyVHlwZSwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGFkcywgc3dpdGNoIHRvIGJhY2t1cCcgKyBiYWNrdXBQbGF5ZXJUeXBlSW5mbyArICcgaW4gJyArIChEYXRlLm5vdygpIC0gYmFja3VwU2VhcmNoU3RhcnQpICsgJ21zIOKAlCBzaWduaWZpZXJzOiAnICsgZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKS5qb2luKCcsICcpKTsKICAgICAgICBpZiAocmVsb2FkUGxheWVyKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtrZXk6IFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVWJvUmVsb2FkUGxheWVyJyA6ICdVYm9QYXVzZVJlc3VtZVBsYXllcid9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gaGFzQWRUYWdzKHRleHRTdHIpIHsKICAgICAgICByZXR1cm4gQURfU0lHTklGSUVSUy5zb21lKChzKSA9PiBzICYmIHRleHRTdHIuaW5jbHVkZXMocykpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZEFkU2lnbmlmaWVycyh0ZXh0U3RyKSB7CiAgICAgICAgcmV0dXJuIEFEX1NJR05JRklFUlMuZmlsdGVyKChzKSA9PiB0ZXh0U3RyLmluY2x1ZGVzKHMpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGxldCBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpdmVTZWdtZW50cyA9IFtdOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgLy8gTG9nIGFkIHRyYWNraW5nIGF0dHJpYnV0ZSBuYW1lcyBvbmNlIHBlciBzdHJlYW0gKGhlbHBzIGlkZW50aWZ5IG5ldyBiZWFjb25zKQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3QgYWRBdHRycyA9IHRleHRTdHIubWF0Y2goL1gtVFYtVFdJVENILUFEW0EtWi1dKig/PT0iKS9nKTsKICAgICAgICAgICAgaWYgKGFkQXR0cnMgJiYgYWRBdHRycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZEFkQXR0cmlidXRlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBZCB0cmFja2luZyBhdHRyaWJ1dGVzIHNlZW46ICcgKyBbLi4ubmV3IFNldChhZEF0dHJzKV0uam9pbignLCAnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTG9nIHBvdGVudGlhbCBhZCBtYXJrZXJzIHRoYXQgYXJlbid0IGluIEFEX1NJR05JRklFUlMgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pCiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkhhc0xvZ2dlZFVua25vd25TaWduaWZpZXJzKSB7CiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIGxldCBzbTsKICAgICAgICAgICAgY29uc3QgY2xhc3NSZSA9IC9FWFQtWC1EQVRFUkFOR0U6W15cbl0qQ0xBU1M9Iih0d2l0Y2gtW14iXSspIi9nOwogICAgICAgICAgICB3aGlsZSAoKHNtID0gY2xhc3NSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoJ0VYVC1YLURBVEVSQU5HRTpDTEFTUz0iJyArIHNtWzFdICsgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB0YWdSZSA9IC8oU0NURTM1LVtBLVotXSt8RVhULVgtQ1VFLVtBLVotXSspL2c7CiAgICAgICAgICAgIHdoaWxlICgoc20gPSB0YWdSZS5leGVjKHRleHRTdHIpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQoc21bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN1YnN0cmluZyBjaGVjayAobm90IGV4YWN0KTogYSBjYW5kaWRhdGUgaXMgImtub3duIiBpZiBhbnkgQURfU0lHTklGSUVSCiAgICAgICAgICAgIC8vIGFwcGVhcnMgd2l0aGluIGl0LiBUaGlzIGhhbmRsZXMgcHJlZml4IHNpZ25pZmllcnMgbGlrZSAndHdpdGNoLXN0aXRjaGVkJwogICAgICAgICAgICAvLyBjb3ZlcmluZyAnRVhULVgtREFURVJBTkdFOkNMQVNTPSJ0d2l0Y2gtc3RpdGNoZWQtYWQiJyBldGMuCiAgICAgICAgICAgIGNvbnN0IHVua25vd24gPSBbLi4uY2FuZGlkYXRlc10uZmlsdGVyKGMgPT4KICAgICAgICAgICAgICAgICFBRF9TSUdOSUZJRVJTLnNvbWUocyA9PiBzICYmIGMuaW5jbHVkZXMocykpICYmCiAgICAgICAgICAgICAgICAhS05PV05fTk9OX0FEX1NJR05JRklFUlMuc29tZShzID0+IHMgJiYgYy5pbmNsdWRlcyhzKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRVbmtub3duU2lnbmlmaWVycyA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQb3RlbnRpYWwgYWQgbWFya2VycyBzZWVuIGJ1dCBub3QgaW4gQURfU0lHTklGSUVSUzogJyArIHVua25vd24uam9pbignLCAnKSArICcgKGNhbmRpZGF0ZXMgZm9yIGZ1dHVyZSBpbmNsdXNpb24pJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAvLyBUcmFjayBTQ1RFLTM1IENVRS1PVVQvQ1VFLUlOIGFkIGJvdW5kYXJpZXMKICAgICAgICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1PVVQnKSkgewogICAgICAgICAgICAgICAgaWYgKCFpbkN1ZU91dCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNDVEUtMzUgQ1VFLU9VVCDigJQgYWQgYm91bmRhcnkgZW50ZXJlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5DdWVPdXQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ0VYVC1YLUNVRS1JTicpKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5DdWVPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBTQ1RFLTM1IENVRS1JTiDigJQgYWQgYm91bmRhcnkgZXhpdGVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbkN1ZU91dCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmFja2luZyB1cmxzIHdoaWNoIGFwcGVhciBpbiB0aGUgb3ZlcmxheSBVSQogICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmUucmVwbGFjZUFsbChUV0lUQ0hfQURfVVJMX1JFV1JJVEVfUkVHRVgsIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmICghbGluZS5pbmNsdWRlcygnLGxpdmUnKSB8fCBzdHJpcEFsbFNlZ21lbnRzIHx8IEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyB8fCBpbkN1ZU91dCkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRVcmwgPSBsaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICBpZiAoIUFkU2VnbWVudENhY2hlLmhhcyhzZWdtZW50VXJsKSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoc2VnbWVudFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmIEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IGxpbmVzW2kgKyAxXS5pbmNsdWRlcyhwKSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkIHNlZ21lbnQgZGV0ZWN0ZWQgdmlhIFVSTCBwYXR0ZXJuOiAnICsgbGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChsaW5lc1tpICsgMV0sIERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZS5pbmNsdWRlcygnLGxpdmUnKSkgewogICAgICAgICAgICAgICAgbGl2ZVNlZ21lbnRzLnB1c2goeyBleHRpbmY6IGxpbmUsIHVybDogbGluZXNbaSArIDFdIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBBUlQ6JykpIHsKICAgICAgICAgICAgICAgIC8vIExMLUhMUyBwYXJ0OiBVUkkgaXMgaW5saW5lIGFzIGFuIGF0dHJpYnV0ZS4gU3RyaXAgaWYgaXQgbWF0Y2hlcyBhIGtub3duCiAgICAgICAgICAgICAgICAvLyBhZCBVUkwgKGFscmVhZHkgaW4gY2FjaGUgZnJvbSBhIHBhcmFsbGVsIEVYVElORiBzdHJpcCwgb3IgbWF0Y2hlcyBhIFVSTCBwYXR0ZXJuKS4KICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIHBsYXllciBtYXkgdXNlIHRoZSBwYXJ0cyBwYXRoIHRvIGZldGNoIGFkIG1lZGlhIHZpYSBsb3ctbGF0ZW5jeS4KICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRVcmlNYXRjaCA9IGxpbmUubWF0Y2goVVJJX0FUVFJJQlVURV9SRUdFWCk7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0VXJpID0gcGFydFVyaU1hdGNoID8gcGFydFVyaU1hdGNoWzFdIDogJyc7CiAgICAgICAgICAgICAgICBpZiAocGFydFVyaSAmJiAoQWRTZWdtZW50Q2FjaGUuaGFzKHBhcnRVcmkpIHx8IEFEX1NFR01FTlRfVVJMX1BBVFRFUk5TLnNvbWUoKHApID0+IHBhcnRVcmkuaW5jbHVkZXMocCkpKSkgewogICAgICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChwYXJ0VXJpLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVBSRUxPQUQtSElOVDonKSkgewogICAgICAgICAgICAgICAgLy8gTEwtSExTIHByZWZldGNoL3ByZWxvYWQgaGludHMgY2FuIHBvaW50IGF0IHVwY29taW5nIGFkIHNlZ21lbnRzIGJlZm9yZSBhbnkKICAgICAgICAgICAgICAgIC8vIEVYVElORiBsaW5lIG9yIGFkIHNpZ25pZmllciBoYXMgbWF0ZXJpYWxpemVkIGluIHRoZSBwbGF5bGlzdC4gSWYgd2Ugb25seQogICAgICAgICAgICAgICAgLy8gc3RyaXAgcHJlZmV0Y2ggaGludHMgQUZURVIgaGFzU3RyaXBwZWRBZFNlZ21lbnRzIGlzIHNldCwgdGhlIGZpcnN0IHBvbGwgb2YKICAgICAgICAgICAgICAgIC8vIGFuIGFkIGJyZWFrIGNhbiBsZWFrIGEgcHJlZmV0Y2ggaGludCBwb2ludGluZyBhdCBhbiBhZCBVUkwg4oCUIHRoZSBwbGF5ZXIKICAgICAgICAgICAgICAgIC8vIHRoZW4gcHJlLWZldGNoZXMgYWQgbWVkaWEgdmlhIHRoZSBMTC1ITFMgcGF0aCBiZWZvcmUgb3VyIHVzdWFsIHN0cmlwIGNhdGNoZXMKICAgICAgICAgICAgICAgIC8vIHVwLCBwcm9kdWNpbmcgYW4gYWQgZmxhc2guIERldGVjdCB0aGUgYWQgVVJMIGhlcmUgc28gaGFzU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgICAgICAgICAvLyBmbGlwcyBvbiB0aGUgZmlyc3QgcG9sbCBhbmQgdGhlIHBvc3QtbG9vcCB1bmNvbmRpdGlvbmFsIHByZWZldGNoIHN0cmlwIGZpcmVzLgogICAgICAgICAgICAgICAgLy8gUG9ydGVkIGZyb20gVFRWLUFCIDUyYjQxYjQuCiAgICAgICAgICAgICAgICBsZXQgaGludFVybCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGhpbnRVcmwgPSBsaW5lLnN1YnN0cmluZygnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonLmxlbmd0aCkudHJpbSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50TWF0Y2ggPSBsaW5lLm1hdGNoKC9VUkk9IihbXiJdKykiLyk7CiAgICAgICAgICAgICAgICAgICAgaGludFVybCA9IGhpbnRNYXRjaCA/IGhpbnRNYXRjaFsxXSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpbnRVcmwgJiYgKEFkU2VnbWVudENhY2hlLmhhcyhoaW50VXJsKSB8fCBBRF9TRUdNRU5UX1VSTF9QQVRURVJOUy5zb21lKChwKSA9PiBoaW50VXJsLmluY2x1ZGVzKHApKSkpIHsKICAgICAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoaGludFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNb3ZlZCBvdXQgb2YgdGhlIHBlci1saW5lIGxvb3A6IGEgcGVyLWxpbmUgc2NhbiBmb3IgYW55IHNpZ25pZmllciBpcwogICAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGZ1bGwtdGV4dCBzY2FuLCBzaW5jZSB0aGUgY2hlY2sgaGFzCiAgICAgICAgLy8gbm8gbGluZS1sZXZlbCBzdGF0ZSDigJQgaXQganVzdCBmbGlwcyBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlIG9uIGZpcnN0CiAgICAgICAgLy8gbWF0Y2guIE9uZSBzY2FuIGluc3RlYWQgb2YgTl9saW5lcyAqIE5fc2lnbmlmaWVycyBzY2FucyAofjEwMHggZmV3ZXIKICAgICAgICAvLyBpbmNsdWRlcygpIGNhbGxzIG9uIGEgdHlwaWNhbCAxMDAtbGluZSBtM3U4KS4KICAgICAgICBpZiAoIWhhc1N0cmlwcGVkQWRTZWdtZW50cyAmJiBoYXNBZFRhZ3ModGV4dFN0cikpIHsKICAgICAgICAgICAgaGFzU3RyaXBwZWRBZFNlZ21lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBObyBsb3cgbGF0ZW5jeSBkdXJpbmcgYWRzIChvdGhlcndpc2UgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHBsYXllciB0byBwcmVmZXRjaCBhbmQgZGlzcGxheSBhZCBzZWdtZW50cykKICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpIHx8IGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1QUkVMT0FELUhJTlQ6JykpIHsKICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgIH0KICAgICAgICAvLyBDYWNoZSBsaXZlIHNlZ21lbnRzIGZvciByZWNvdmVyeSAocGx1cyB0aGUgTUVESUEtU0VRVUVOQ0Ugb2YgdGhlIG9sZGVzdCBjYWNoZWQgc2VnbWVudCwKICAgICAgICAvLyBzbyB0aGUgcGxheWVyIGFjY2VwdHMgaW5qZWN0ZWQgcmVjb3Zlcnkgc2VnbWVudHMgYXMgdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSkKICAgICAgICBpZiAobGl2ZVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzID0gbGl2ZVNlZ21lbnRzLnNsaWNlKC02KTsKICAgICAgICAgICAgY29uc3Qgc2VxID0gcGFyc2VJbnQoKHRleHRTdHIubWF0Y2goLyNFWFQtWC1NRURJQS1TRVFVRU5DRTooXGQrKS8pIHx8IFtdKVsxXSk7CiAgICAgICAgICAgIGlmICghaXNOYU4oc2VxKSkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZWNvdmVyeVN0YXJ0U2VxID0gc2VxICsgTWF0aC5tYXgoMCwgbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIElmIGFsbCBzZWdtZW50cyB3ZXJlIHN0cmlwcGVkLCB0cnkgdG8gcHJldmVudCBibGFjayBzY3JlZW4gdmlhIHJlY292ZXJ5IGNvbnRlbnQuCiAgICAgICAgLy8gUHJlZmVyIHRoZSBmdWxsLXBsYXlsaXN0IHNuYXBzaG90IGZyb20gYSByZWNlbnQgbm9uLWFkIHBvbGwgKG1pcnJvcnMgVFRWLUFCCiAgICAgICAgLy8gTGFzdENsZWFuTmF0aXZlTTNVOCBhcHByb2FjaCkg4oCUIGdpdmVzIHRoZSBwbGF5ZXIgNC02IGxpdmUgc2VnbWVudHMgd29ydGggb2YKICAgICAgICAvLyBjb250ZW50IHZzIHRoZSB0aGluIHBlci1zZWdtZW50IHJlY292ZXJ5IGNhY2hlLiBGYWxscyBiYWNrIHRvIHRoZSBwZXItc2VnbWVudAogICAgICAgIC8vIGNhY2hlIGlmIHRoZSBzbmFwc2hvdCBpcyBzdGFsZSBvciBtaXNzaW5nLgogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMgJiYgbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IChzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyB8fCAwKSArIDE7CiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJ5VGhpbiA9IChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHM/Lmxlbmd0aCB8fCAwKSA8IDM7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVRocmVzaG9sZCA9IHJlY292ZXJ5VGhpbiA/IDEgOiBFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQ7CiAgICAgICAgICAgIGlmIChFYXJseVJlbG9hZFBvbGxUaHJlc2hvbGQgPiAwICYmIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVBbGxTdHJpcHBlZFBvbGxzID49IGVmZmVjdGl2ZVRocmVzaG9sZCAmJiAhc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FYXJseVJlbG9hZFRyaWdnZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZWNvdmVyeVRoaW4gPyAnICh0aGluIHJlY292ZXJ5IGNhY2hlOiAnICsgKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50cz8ubGVuZ3RoIHx8IDApICsgJyBzZWdtZW50cyknIDogJyc7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBFYXJseSByZWxvYWQgdHJpZ2dlcmVkIOKAlCAnICsgc3RyZWFtSW5mby5Db25zZWN1dGl2ZUFsbFN0cmlwcGVkUG9sbHMgKyAnIGNvbnNlY3V0aXZlIGFsbC1zdHJpcHBlZCBwb2xscycgKyByZWFzb24pOwogICAgICAgICAgICAgICAgLy8ga2luZDogJ2Vhcmx5JyBieXBhc3NlcyB0aGUgY29vbGRvd24gZ2F0ZSB0aGF0J3MgbWVhbnQgZm9yIGJ1ZmZlci1tb25pdG9yIHJlbG9hZHMuCiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7IGtleTogJ1Vib1JlbG9hZFBsYXllcicsIGtpbmQ6ICdlYXJseScgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUHJpbWFyeTogZnJlc2ggZnVsbC1wbGF5bGlzdCBzbmFwc2hvdCAoPCAxLjVzIG9sZCwgbXVzdCBub3QgaXRzZWxmIGNvbnRhaW4gYWQgbWFya2VycykKICAgICAgICAgICAgY29uc3Qgc25hcHNob3RBZ2UgPSBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPyAoRGF0ZS5ub3coKSAtIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlUGxheWxpc3RBdCkgOiBJbmZpbml0eTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCAmJiBzbmFwc2hvdEFnZSA8PSAxNTAwICYmICFoYXNBZFRhZ3Moc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4KSkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQWxsIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCByZXVzaW5nIGxhc3QgY2xlYW4gbmF0aXZlIHBsYXlsaXN0ICgnICsgc25hcHNob3RBZ2UgKyAnbXMgb2xkKScpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBoYXNTdHJpcHBlZEFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtSW5mby5MYXN0Q2xlYW5OYXRpdmVNM1U4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBwZXItc2VnbWVudCByZWNvdmVyeSBjYWNoZSAoZXhpc3RpbmcgYmVoYXZpb3IpCiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMgJiYgc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFsbCBzZWdtZW50cyBzdHJpcHBlZCDigJQgcmVzdG9yaW5nICcgKyBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoICsgJyByZWNvdmVyeSBzZWdtZW50cycpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaW5lcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbal0uc3RhcnRzV2l0aCgnI0VYVC1YLU1FRElBLVNFUVVFTkNFOicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tqXSA9ICcjRVhULVgtTUVESUEtU0VRVUVOQ0U6JyArIHN0cmVhbUluZm8uUmVjb3ZlcnlTdGFydFNlcTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdHJlYW1JbmZvLlJlY292ZXJ5U2VnbWVudHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKHN0cmVhbUluZm8uUmVjb3ZlcnlTZWdtZW50c1tqXS5leHRpbmYpOwogICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goc3RyZWFtSW5mby5SZWNvdmVyeVNlZ21lbnRzW2pdLnVybCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBoYXNTdHJpcHBlZEFkU2VnbWVudHM7CiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAvLyBUaHJvdHRsZSBjYWNoZSBwcnVuZSB0byBvbmNlIHBlciA2MHMuIFRoZSAxMjBzIFRUTCBnaXZlcyBwbGVudHkgb2YgaGVhZHJvb20KICAgICAgICAvLyBhbmQgc2Nhbm5pbmcgdGhlIGZ1bGwgY2FjaGUgb24gZXZlcnkgbTN1OCBwb2xsIGFkZHMgdXAgZHVyaW5nIGhlYXZ5IGFkIGJyZWFrCiAgICAgICAgLy8gc2VxdWVuY2VzIChMTC1ITFMgY2FuIHBvbGwgbXVsdGlwbGUgdGltZXMgcGVyIHNlY29uZCkuIFBvcnRlZCBmcm9tIFRUVi1BQi4KICAgICAgICBpZiAoIXN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0IHx8IG5vdyAtIHN0cmVhbUluZm8uTGFzdEFkQ2FjaGVQcnVuZUF0ID4gNjAwMDApIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0QWRDYWNoZVBydW5lQXQgPSBub3c7CiAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLmZvckVhY2goKHZhbHVlLCBrZXksIG1hcCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgbm93IC0gMTIwMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwLmRlbGV0ZShrZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gRGlhZ25vc3RpYzogbG9nIG9uY2UgcGVyIHN0cmVhbUluZm8gd2hlbiB0aGUgY2FjaGUgY3Jvc3NlcyAxMDAwIGVudHJpZXMsCiAgICAgICAgICAgIC8vIHNvIGNhY2hlIGJsb2F0IGZyb20gYSBmdXR1cmUgVFRML3BydW5lIGJ1ZyB3b3VsZCBzdXJmYWNlIGluIHVzZXIgcmVwb3J0cwogICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHN0YXlpbmcgaW52aXNpYmxlLgogICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuc2l6ZSA+IDEwMDAgJiYgIXN0cmVhbUluZm8uTG9nZ2VkQWRDYWNoZVNpemUxaykgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRBZENhY2hlU2l6ZTFrID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEFkU2VnbWVudENhY2hlIGNyb3NzZWQgMTAwMCBlbnRyaWVzIChub3cgJyArIEFkU2VnbWVudENhY2hlLnNpemUgKyAnKSDigJQgcG9zc2libGUgY2FjaGUgYmxvYXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbGluZXMuam9pbignXG4nKTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NNM1U4KHVybCwgdGV4dFN0ciwgcmVhbEZldGNoKSB7CiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zQnlVcmxbdXJsXTsKICAgICAgICBpZiAoIXN0cmVhbUluZm8pIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUluZm8uTGFzdFNlZW5BdCA9IERhdGUubm93KCk7CiAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkxvZ2dlZE9mZmxpbmVUcmFuc2l0aW9uICYmIHRleHRTdHIuaW5jbHVkZXMoJyNFWFQtWC1FTkRMSVNUJykgJiYgIXRleHRTdHIuaW5jbHVkZXMoJyNFWFRJTkY6JykpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5Mb2dnZWRPZmZsaW5lVHJhbnNpdGlvbiA9IHRydWU7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFN0cmVhbSBlbmRlZCAvIG9mZmxpbmUgc2hhcGUgZGV0ZWN0ZWQg4oCUIG0zdTggaGFzICNFWFQtWC1FTkRMSVNUIHdpdGggbm8gc2VnbWVudHMuIFBvc3NpYmxlIFR3aXRjaCBkZXRlY3Rpb24gcmVzcG9uc2UsIGJyb2FkY2FzdGVyIGVuZGVkIHN0cmVhbSwgb3IgbmF0dXJhbCBlbmQtb2YtYnJvYWRjYXN0Jyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGN1cnJlbnRSZXNvbHV0aW9uID0gc3RyZWFtSW5mby5VcmxzLmdldCh1cmwpOwogICAgICAgIGlmICghY3VycmVudFJlc29sdXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIGlmICghc3RyZWFtSW5mby5IYXNDaGVja2VkVW5rbm93blRhZ3MpIHsKICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDaGVja2VkVW5rbm93blRhZ3MgPSB0cnVlOwogICAgICAgICAgICBjb25zdCB1bmtub3duQWRUYWdzID0gdGV4dFN0ci5tYXRjaCgvI0VYVFteOlxuXSooPzphZHxjdWV8c2N0ZXxzcG9uc29yKVteOlxuXSovZ2kpOwogICAgICAgICAgICBpZiAodW5rbm93bkFkVGFncykgewogICAgICAgICAgICAgICAgY29uc3QgdW5rbm93biA9IHVua25vd25BZFRhZ3MuZmlsdGVyKHQgPT4gIUFEX1NJR05JRklFUlMuc29tZShzID0+IHMgJiYgdC5pbmNsdWRlcyhzKSkpOwogICAgICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFVua25vd24gYWQtcmVsYXRlZCB0YWdzIGZvdW5kOiAnICsgWy4uLm5ldyBTZXQodW5rbm93bildLmpvaW4oJywgJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGhhdmVBZFRhZ3MgPSBoYXNBZFRhZ3ModGV4dFN0cikgfHwgKFNpbXVsYXRlZEFkc0RlcHRoID4gMCAmJiAoIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzIHx8ICFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncy5pbmNsdWRlcyh1cmwpIHx8IFNpbXVsYXRlZEFkc0RlcHRoIC0gMSA+IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4KSk7CiAgICAgICAgLy8gQ2FjaGUgdGhlIGNsZWFuIG1haW4gc3RyZWFtIG0zdTggZm9yIGFsbC1zdHJpcHBlZCByZWNvdmVyeSBmYWxsYmFjay4KICAgICAgICAvLyBVcGRhdGVkIGR1cmluZyBub24tYWQgcG9sbHMgKG91dHNpZGUgb2YgYW55IGFkIGJyZWFrKSwgc28gYnkgdGhlIHRpbWUgYW4gYWQKICAgICAgICAvLyBicmVhayBzdGFydHMsIHN0cmVhbUluZm8uTGFzdENsZWFuTmF0aXZlTTNVOCBob2xkcyBhIHNuYXBzaG90IH4xLTIgc2Vjb25kcyBvbGQKICAgICAgICAvLyB3aXRoIHNldmVyYWwgbGl2ZSBzZWdtZW50cy4gV2hlbiBoZWF2eSBTU0FJIGJyZWFrcyBsZWF2ZSB0aGUgbWFpbiBwbGF5bGlzdAogICAgICAgIC8vIGVudGlyZWx5IHN0cmlwcGVkLCBzdHJpcEFkU2VnbWVudHMgcmVwbGF5cyB0aGlzIHNuYXBzaG90IGluc3RlYWQgb2YgdGhlIHRoaW4KICAgICAgICAvLyBSZWNvdmVyeVNlZ21lbnRzIGFycmF5IOKAlCB0eXBpY2FsbHkgZ2l2ZXMgdGhlIHBsYXllciA0LTYgbGl2ZSBzZWdtZW50cyBvZgogICAgICAgIC8vIGNvbnRlbnQgdnMgdGhlIDEtMiBjYWNoZWQgaW5kaXZpZHVhbCBzZWdtZW50cy4KICAgICAgICAvLyBNaXJyb3JzIFRUVi1BQiBzcmMvbW9kdWxlcy9wcm9jZXNzb3IudHM6NzMzLTczNi4KICAgICAgICBpZiAoIWhhdmVBZFRhZ3MgJiYgIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzICYmIHRleHRTdHIuaW5kZXhPZignI0VYVElORicpICE9PSAtMSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZU0zVTggPSB0ZXh0U3RyOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RDbGVhbk5hdGl2ZVBsYXlsaXN0QXQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MpIHsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFVybCA9IHN0cmVhbUluZm8uRW5jb2RpbmdzLm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pPy5bMF07CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4ID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0FkVGFncyhzdHJlYW1NM3U4KSAmJiBTaW11bGF0ZWRBZHNEZXB0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pcnJvcnMgVFRWLUFCIHY2LjYuNyAjMTogbWFyayBmaXJzdCBjYW5kaWRhdGUtZW5kIHRpbWVzdGFtcCBvbiB0aGUgZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW4gbWFpbi1zdHJlYW0gcG9sbCwgc28gdGhlIHNsb3ctcGF0aCBtYXgtd2FpdCBnYXRlIGJlbG93IGNhbiBmaXJlIGV2ZW4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3Vic2VxdWVudCBwb2xscyBib3VuY2UgYmFjayB0byBhZC1tYXJrZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGxheWxpc3QgaGFzIGxpdmUgc2VnbWVudHMg4oCUIGlmIG5vdCwgYmFja3VwIHN0cmVhbSBpcyBkZWFkCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0xpdmVTZWdtZW50cyA9IHRleHRTdHIuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXJyb3JzIFRUVi1BQiB2Ni42LjcgIzQ6IGluZGVwZW5kZW50IHNsb3ctcGF0aCBtYXgtd2FpdCBlc2NhbGF0aW9uIGdhdGUgc28KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmNpbmcgbWFya2VycyBjYW4ndCB3ZWRnZSB0aGUgcGxheWVyIG9uIGJhY2t1cCBpbmRlZmluaXRlbHkuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkRW5kTWF4V2FpdE1zID0gMTIwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRTaW5jZUNhbmRpZGF0ZSA9IERhdGUubm93KCkgLSBzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbG93UGF0aFJlYWR5ID0gc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA+IDAgJiYgZWxhcHNlZFNpbmNlQ2FuZGlkYXRlID49IGFkRW5kTWF4V2FpdE1zOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPj0gMiB8fCAhaGFzTGl2ZVNlZ21lbnRzIHx8IHNsb3dQYXRoUmVhZHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG93UGF0aFJlYWR5ICYmIHN0cmVhbUluZm8uQ2xlYW5QbGF5bGlzdENvdW50IDwgMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFNsb3ctcGF0aCBhZC1lbmQgZXNjYWxhdGlvbiDigJQgJyArIChzdHJlYW1JbmZvLkFkRW5kQm91bmNlQ291bnQgfHwgMCkgKyAnIG1hcmtlciBib3VuY2VzLCAnICsgKGVsYXBzZWRTaW5jZUNhbmRpZGF0ZSAvIDEwMDApLnRvRml4ZWQoMSkgKyAncyBzaW5jZSBmaXJzdCBjbGVhbiBwb2xsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xpdmVTZWdtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJhY2t1cCBzdHJlYW0gaGFzIG5vIGxpdmUgc2VnbWVudHMg4oCUIGZvcmNpbmcgaW1tZWRpYXRlIHJlbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIG1vcmUgYWRzIG9uIG1haW4gc3RyZWFtLiBTdHJpcHBlZCAnICsgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgKyAnIGFkIHNlZ21lbnRzLiAnICsgKFJlbG9hZFBsYXllckFmdGVyQWQgPyAnVHJpZ2dlcmluZyBwbGF5ZXIgcmVsb2FkIHRvIGdvIGJhY2sgdG8gbWFpbiBzdHJlYW0uLi4nIDogJ1Jlc3VtaW5nIHBsYXliYWNrLi4uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCB0b3dhcmQgZmFsc2UtcG9zaXRpdmUgZ3VhcmQgaWYgdGhlIG0zdTggbGFja2VkIGhpZ2gtY29uZmlkZW5jZSBhZCBtYXJrZXJzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlybWVkIGFkcyAod2l0aCBYLVRWLVRXSVRDSC1BRC1BRC1TRVNTSU9OLUlEIGV0Yy4pIHRoYXQgcHJvZHVjZSAwIHN0cmlwcyBhcmUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRzIHdlIHN1Y2Nlc3NmdWxseSBhdm9pZGVkIHZpYSBjbGVhbiBiYWNrdXAg4oCUIG5vdCBmYWxzZSBwb3NpdGl2ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPT09IDAgJiYgIXN0cmVhbUluZm8uSGFzQ29uZmlybWVkQWRBdHRycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Db25zZWN1dGl2ZVplcm9TdHJpcEJyZWFrcyA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6ICcgKyBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlWmVyb1N0cmlwQnJlYWtzICsgJyBjb25zZWN1dGl2ZSB1bmNvbmZpcm1lZCBhZCBicmVha3Mgd2l0aCAwIHNlZ21lbnRzIHN0cmlwcGVkIOKAlCBwb3NzaWJsZSBmYWxzZSBwb3NpdGl2ZSBmcm9tIGFkIHNpZ25pZmllcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ29uc2VjdXRpdmVaZXJvU3RyaXBCcmVha3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNDb25maXJtZWRBZEF0dHJzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlGYXN0UGF0aCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpVG9Tc2FpVHJhbnNpdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRBZEF0dHJpYnV0ZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSGFzTG9nZ2VkVW5rbm93blNpZ25pZmllcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzPy5jbGVhcj8uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNvbnNlY3V0aXZlQWxsU3RyaXBwZWRQb2xscyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVhcmx5UmVsb2FkVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzPy5jbGVhcj8uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1BsYXllclR5cGVJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5DbGVhblBsYXlsaXN0Q291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkRW5kQm91bmNlQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTogUmVsb2FkUGxheWVyQWZ0ZXJBZCA/ICdVYm9SZWxvYWRQbGF5ZXInIDogJ1Vib1BhdXNlUmVzdW1lUGxheWVyJ30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWlycm9ycyBUVFYtQUIgdjYuNi43ICMxOiBib3VuY2UtdG9sZXJhbnQgcmVzZXQga2VlcHMgUGVuZGluZ0FkRW5kQXQgYWxpdmUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNyb3NzIHNob3J0IGZsaXBzIGJhY2sgdG8gYWQtbWFya2VkLCBzbyB0aGUgc2xvdy1wYXRoIG1heC13YWl0IGdhdGUgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGZpcmUgd2hlbiBib3VuY2luZyBtYXJrZXJzIHByZXZlbnQgQ2xlYW5QbGF5bGlzdENvdW50IHByb2dyZXNzLgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZEVuZFN0YWxlbmVzc01zID0gMTIwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlBlbmRpbmdBZEVuZEF0ICYmIChEYXRlLm5vdygpIC0gc3RyZWFtSW5mby5QZW5kaW5nQWRFbmRBdCkgPCBhZEVuZFN0YWxlbmVzc01zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFkRW5kQm91bmNlQ291bnQgPSAoc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50IHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUGVuZGluZ0FkRW5kQXQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5BZEVuZEJvdW5jZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkNsZWFuUGxheWxpc3RDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtTTN1OC5pbmNsdWRlcygnIk1JRFJPTEwiJykgJiYgIXN0cmVhbU0zdTguaW5jbHVkZXMoJyJtaWRyb2xsIicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHN0cmVhbU0zdTguc3BsaXQoL1xyP1xuLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBsaW5lcy5sZW5ndGggPiBpICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXF1ZXN0IG9uZSAudHMgZmlsZSBwZXIgLm0zdTggcmVxdWVzdCB0byBhdm9pZCBtYWtpbmcgdG9vIG1hbnkgcmVxdWVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uUmVxdWVzdGVkQWRzLmFkZChsaW5lc1tpICsgMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2gobGluZXNbaSArIDFdKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYmxvYigpKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgJiYgaGF2ZUFkVGFncykgewogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGF3YWl0IG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCB0cnVlLCByZWFsRmV0Y2gsIHVybCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChoYXZlQWRUYWdzICYmICFzdHJlYW1JbmZvLklzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzKSB7CiAgICAgICAgICAgIC8vIENTQUkgZmFzdCBwYXRoOiBpZiBhbGwgc2VnbWVudHMgaW4gdGhlIG1haW4gc3RyZWFtIGFyZSBsaXZlLCBza2lwIGJhY2t1cCBzZWFyY2guCiAgICAgICAgICAgIC8vIENTQUkgYWRzIGFyZSBkZWxpdmVyZWQgb3V0c2lkZSB0aGUgbTN1OCDigJQgdGhlIG1haW4gc3RyZWFtIHNlZ21lbnRzIGFyZSBjbGVhbi4KICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBtYWluIHN0cmVhbSBkaXJlY3RseSwgYXZvaWRpbmcgdGhlIGJhY2t1cCBzdHJlYW0gc3dpdGNoIHRoYXQgY2F1c2VzCiAgICAgICAgICAgIC8vIGEgMjAtNDBzIHJlYnVmZmVyIGdhcC4KICAgICAgICAgICAgY29uc3QgbWFpblN0cmVhbUxpbmVzID0gdGV4dFN0ci5zcGxpdCgvXHI/XG4vKTsKICAgICAgICAgICAgbGV0IGhhc05vbkxpdmVTZWdtZW50ID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFpblN0cmVhbUxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobWFpblN0cmVhbUxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiAhbWFpblN0cmVhbUxpbmVzW2ldLmluY2x1ZGVzKExJVkVfU0lHTklGSUVSKSkgewogICAgICAgICAgICAgICAgICAgIGhhc05vbkxpdmVTZWdtZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWhhc05vbkxpdmVTZWdtZW50KSB7CiAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbUluZm8uSGFzTG9nZ2VkQ3NhaUZhc3RQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIC8vIFJld29yZGVkIOKAlCB0aGUgb3JpZ2luYWwgImFsbCBzZWdtZW50cyBsaXZlLCBza2lwcGluZyBiYWNrdXAgc2VhcmNoIgogICAgICAgICAgICAgICAgICAgIC8vIGltcGxpZWQgYSBwZXJtYW5lbnQgc3RhdGUsIGJ1dCBpdCBvbmx5IGRlc2NyaWJlcyB0aGlzIHBvbGwuIFR3aXRjaCBjYW4KICAgICAgICAgICAgICAgICAgICAvLyBzaGlmdCBtaWQtYnJlYWsgdG8gU1NBSSAoc3RpdGNoZWQgYWQgc2VnbWVudHMpIGF0IHdoaWNoIHBvaW50IHRoZQogICAgICAgICAgICAgICAgICAgIC8vIGJhY2t1cCBzZWFyY2ggbGVnaXRpbWF0ZWx5IGZpcmVzOyB0aGUgdHJhbnNpdGlvbiBpcyBsb2dnZWQgc2VwYXJhdGVseS4KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDU0FJIGZhc3QgcGF0aCDigJQgY3VycmVudCBwb2xsIGhhcyBhbGwtbGl2ZSBzZWdtZW50cywgc2tpcHBpbmcgYmFja3VwIHNlYXJjaCB0aGlzIHBvbGwgKHBsYXlsaXN0IG1heSBzaGlmdCB0byBTU0FJIG9uIHN1YnNlcXVlbnQgcG9sbHMpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5IYXNMb2dnZWRDc2FpRmFzdFBhdGggJiYgIXN0cmVhbUluZm8uSGFzTG9nZ2VkQ3NhaVRvU3NhaVRyYW5zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkhhc0xvZ2dlZENzYWlUb1NzYWlUcmFuc2l0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBQbGF5bGlzdCBub3cgY29udGFpbnMgc3RpdGNoZWQgYWQgc2VnbWVudHMg4oCUIENTQUkgZmFzdCBwYXRoIG5vIGxvbmdlciBhcHBsaWVzLCBmYWxsaW5nIHRocm91Z2ggdG8gYmFja3VwIHNlYXJjaCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGF3YWl0IG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCB0cnVlLCByZWFsRmV0Y2gsIHVybCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCkgewogICAgICAgICAgICB0ZXh0U3RyID0gc3RyaXBBZFNlZ21lbnRzKHRleHRTdHIsIGZhbHNlLCBzdHJlYW1JbmZvKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lckZvclN0cmVhbShzdHJlYW1JbmZvKTsKICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tXb3JrZXJGZXRjaCgpIHsKICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBob29rV29ya2VyRmV0Y2ggKHZpZGVvLXN3YXAtbmV3KScpOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IGZldGNoOwogICAgICAgIGZldGNoID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKEFkU2VnbWVudENhY2hlLmhhcyh1cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWFsRmV0Y2goJ2RhdGE6dmlkZW8vbXA0O2Jhc2U2NCxBQUFBS0daMGVYQnRjRFF5QUFBQUFXbHpiMjF0Y0RReVpHRnphR0YyWXpGcGMyODJhR3h6WmdBQUJFbHRiMjkyQUFBQWJHMTJhR1FBQUFBQUFBQUFBQUFBQUFBQUFZYWdBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQUFBQnFIUnlZV3NBQUFCY2RHdG9aQUFBQUFNQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFVUnRaR2xoQUFBQUlHMWthR1FBQUFBQUFBQUFBQUFBQUFBQUFMdUFBQUFBQUZYRUFBQUFBQUF0YUdSc2NnQUFBQUFBQUFBQWMyOTFiZ0FBQUFBQUFBQUFBQUFBQUZOdmRXNWtTR0Z1Wkd4bGNnQUFBQUR2YldsdVpnQUFBQkJ6Yldoa0FBQUFBQUFBQUFBQUFBQWtaR2x1WmdBQUFCeGtjbVZtQUFBQUFBQUFBQUVBQUFBTWRYSnNJQUFBQUFFQUFBQ3pjM1JpYkFBQUFHZHpkSE5rQUFBQUFBQUFBQUVBQUFCWGJYQTBZUUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FRQUFBQUFMdUFBQUFBQUFBelpYTmtjd0FBQUFBRGdJQ0FJZ0FCQUFTQWdJQVVRQlVBQUFBQUFBQUFBQUFBQUFXQWdJQUNFWkFHZ0lDQUFRSUFBQUFRYzNSMGN3QUFBQUFBQUFBQUFBQUFFSE4wYzJNQUFBQUFBQUFBQUFBQUFCUnpkSE42QUFBQUFBQUFBQUFBQUFBQUFBQUFFSE4wWTI4QUFBQUFBQUFBQUFBQUFlVjBjbUZyQUFBQVhIUnJhR1FBQUFBREFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFvQUFBQUZvQUFBQUFBR0JiV1JwWVFBQUFDQnRaR2hrQUFBQUFBQUFBQUFBQUFBQUFBOUNRQUFBQUFCVnhBQUFBQUFBTFdoa2JISUFBQUFBQUFBQUFIWnBaR1VBQUFBQUFBQUFBQUFBQUFCV2FXUmxiMGhoYm1Sc1pYSUFBQUFCTEcxcGJtWUFBQUFVZG0xb1pBQUFBQUVBQUFBQUFBQUFBQUFBQUNSa2FXNW1BQUFBSEdSeVpXWUFBQUFBQUFBQUFRQUFBQXgxY213Z0FBQUFBUUFBQU94emRHSnNBQUFBb0hOMGMyUUFBQUFBQUFBQUFRQUFBSkJoZG1NeEFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW9BQmFBQklBQUFBU0FBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHUC8vQUFBQU9tRjJZME1CVFVBZS8rRUFJMmROUUI2V1VvRkFYL0xnTFVCQVFGQUFBRDZBQUE2bURnQUFIb1FBQTlDVzd5NEtBUUFFYU91UElBQUFBQkJ6ZEhSekFBQUFBQUFBQUFBQUFBQVFjM1J6WXdBQUFBQUFBQUFBQUFBQUZITjBjM29BQUFBQUFBQUFBQUFBQUFBQUFBQVFjM1JqYndBQUFBQUFBQUFBQUFBQVNHMTJaWGdBQUFBZ2RISmxlQUFBQUFBQUFBQUJBQUFBQVFBQUFDNEFBQUFBQW9BQUFBQUFBQ0IwY21WNEFBQUFBQUFBQUFJQUFBQUJBQUNDTlFBQUFBQUNRQUFBJywgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXJsID0gdXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0ciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gU3RyaW5nKGVycj8ubWVzc2FnZSB8fCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj8ubmFtZSAhPT0gJ0Fib3J0RXJyb3InICYmICEvY2FuY2VsfGFib3J0L2kudGVzdChlcnJNc2cpKSBjb25zb2xlLmxvZygnZmV0Y2ggaG9vayBlcnIgJyArIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gKG5ldyBVUkwodXJsKSkucGF0aG5hbWUubWF0Y2goLyhbXlwvXSspKD89XC5cdyskKS8pPy5bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdwYXJlbnRfZG9tYWlucycpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB0ZW1wVXJsLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBGaXJzdCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggd2l0aCB0aGUgdmlkZW8gZW5jb2RpbmdzICgzNjBwLDQ4MHAsNzIwcCxldGMpLgogICAgICAgICAgICAgICAgICAgICAgICAvLyAtIFNlY29uZCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBvYnRhaW5lZCBpbiB0aGUgZmlyc3QgcmVxdWVzdC4gQXQgdGhpcyBwb2ludCB3ZSB3aWxsIGtub3cgaWYgdGhlcmUncyBhZHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzICE9IG51bGwgJiYgKGF3YWl0IHJlYWxGZXRjaChzdHJlYW1JbmZvLkVuY29kaW5ncy5tYXRjaCgvXmh0dHBzOi4qXC5tM3U4JC9tKT8uWzBdKSkuc3RhdHVzICE9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgZW5jb2RpbmdzIGFyZSBkZWFkICh0aGUgc3RyZWFtIHByb2JhYmx5IHJlc3RhcnRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZXJUaW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCB8fCBzdHJlYW1JbmZvLkVuY29kaW5ncyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0gY3JlYXRlU3RyZWFtSW5mbyhjaGFubmVsTmFtZSwgKG5ldyBVUkwodXJsKSkuc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdTggPSBhd2FpdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1JbmZvVXJscyhzdHJlYW1JbmZvLCBlbmNvZGluZ3NNM3U4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gc3RyZWFtSW5mby5VcmxzLnZhbHVlcygpLm5leHQoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2gocmVzb2x1dGlvbkluZm8uVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OCA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBZFRhZ3Moc3RyZWFtTTN1OCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbkZvdW5kQWQoc3RyZWFtSW5mbywgc3RyZWFtTTN1OCwgZmFsc2UsIHJlYWxGZXRjaCwgcmVzb2x1dGlvbkluZm8uVXJsLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0cmVhbU0zdThSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW5jb2RpbmdzTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2ZXJUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UocmVwbGFjZVNlcnZlclRpbWVJbk0zdTgoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPyBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA6IHN0cmVhbUluZm8uRW5jb2RpbmdzLCBzZXJ2ZXJUaW1lKSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgoZW5jb2RpbmdzTTN1OCkgewogICAgICAgIGlmIChWMkFQSSkgewogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvI0VYVC1YLVNFU1NJT04tREFUQTpEQVRBLUlEPSJTRVJWRVItVElNRSIsVkFMVUU9IihbXiJdKykiLyk7CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgvU0VSVkVSLVRJTUU9IihbMC05Ll0rKSIvKTsKICAgICAgICByZXR1cm4gbWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDEgPyBtYXRjaGVzWzFdIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4KGVuY29kaW5nc00zdTgsIG5ld1NlcnZlclRpbWUpIHsKICAgICAgICBpZiAoVjJBUEkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ld1NlcnZlclRpbWUgPyBlbmNvZGluZ3NNM3U4LnJlcGxhY2UoLygjRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKVteIl0rKCIpLywgYCQxJHtuZXdTZXJ2ZXJUaW1lfSQyYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U2VydmVyVGltZSA/IGVuY29kaW5nc00zdTgucmVwbGFjZSgvKFNFUlZFUi1USU1FPSIpWzAtOS5dKyIvLCBgU0VSVkVSLVRJTUU9IiR7bmV3U2VydmVyVGltZX0iYCkgOiBlbmNvZGluZ3NNM3U4OwogICAgfQogICAgZnVuY3Rpb24gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbykgewogICAgICAgIGNvbnN0IGVuY29kaW5nc0xpbmVzID0gZW5jb2RpbmdzTTN1OC5zcGxpdCgvXHI/XG4vKTsKICAgICAgICBjb25zdCBbdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodF0gPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uLnNwbGl0KCd4JykubWFwKE51bWJlcik7CiAgICAgICAgbGV0IG1hdGNoZWRSZXNvbHV0aW9uVXJsID0gbnVsbDsKICAgICAgICBsZXQgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZhbHNlOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IGNsb3Nlc3RSZXNvbHV0aW9uRGlmZmVyZW5jZSA9IEluZmluaXR5OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RpbmdzTGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIC8vIEFjY2VwdCB2MiBBUEkgdmFyaWFudCBVUkxzIChyYXcgQ0ROIFVSTHMgd2l0aG91dCAnLm0zdTgnKS4KICAgICAgICAgICAgY29uc3QgbmV4dExpbmUgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV0/LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGVuY29kaW5nc0xpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykgJiYgbmV4dExpbmUgJiYgIW5leHRMaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiAobmV4dExpbmUuaW5jbHVkZXMoJy5tM3U4JykgfHwgbmV4dExpbmUuaW5jbHVkZXMoJzovLycpKSkgewogICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhlbmNvZGluZ3NMaW5lc1tpXSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgY29uc3QgZnJhbWVSYXRlID0gYXR0cmlidXRlc1snRlJBTUUtUkFURSddOwogICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbiA9PSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uICYmICghbWF0Y2hlZFJlc29sdXRpb25VcmwgfHwgKCFtYXRjaGVkRnJhbWVSYXRlICYmIGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRnJhbWVSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25VcmwudHJpbUVuZCgpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oY2hhbm5lbE5hbWUsIHBsYXllclR5cGUpIHsKICAgICAgICBjb25zdCByZWFsUGxheWVyVHlwZSA9IHBsYXllclR5cGUucmVwbGFjZSgnLUFMVCcsICcnKTsKICAgICAgICBjb25zdCBib2R5ID0gewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUGxheWJhY2tBY2Nlc3NUb2tlbicsCiAgICAgICAgICAgIHZhcmlhYmxlczogewogICAgICAgICAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgbG9naW46IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgaXNWb2Q6IGZhbHNlLAogICAgICAgICAgICAgICAgdm9kSUQ6ICIiLAogICAgICAgICAgICAgICAgcGxheWVyVHlwZTogcmVhbFBsYXllclR5cGUsCiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogJ3dlYicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOjEsCiAgICAgICAgICAgICAgICAgICAgc2hhMjU2SGFzaDoiZWQyMzBhYTFlMzNlMDdlZWJiODkyODUwNDU4M2RhNzhhNTE3Mzk4OWZhZGZiMWFjOTRiZTA2YTA0ZjNjZGJlOSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGdxbFJlcXVlc3QoYm9keSk7CiAgICB9CiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHkpIHsKICAgICAgICBpZiAoIWdxbF9kZXZpY2VfaWQpIHsKICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9ICcnOwogICAgICAgICAgICBjb25zdCBjaGFycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZWFkZXJzID0gewogICAgICAgICAgICAnQ2xpZW50LUlkJzogQ0xJRU5UX0lELAogICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkLAogICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IEF1dGhvcml6YXRpb25IZWFkZXIsCiAgICAgICAgICAgIC4uLihDbGllbnRJbnRlZ3JpdHlIZWFkZXIgJiYgeydDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyfSkKICAgICAgICB9OwogICAgICAgIGlmIChwbGF5ZXJUeXBlLmluY2x1ZGVzKCctQUxUJykpIHsKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgICdDbGllbnQtSWQnOiBDTElFTlRfSUQsCiAgICAgICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7CiAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0SWQsCiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdGZXRjaFJlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmV0Y2hSZXF1ZXN0IHRpbWVkIG91dCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTUwMDApOwogICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7CiAgICAgICAgICAgICAgICByZXNvbHZlLAogICAgICAgICAgICAgICAgcmVqZWN0LAogICAgICAgICAgICAgICAgdGltZW91dElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdGZXRjaFJlcXVlc3QnLAogICAgICAgICAgICAgICAgdmFsdWU6IGZldGNoUmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuIHt9OwogICAgICAgIC8vIE5vcm1hbGl6ZTogYWx3YXlzIHBhc3Mgb25seSBhdHRyaWJ1dGUgc2VjdGlvbgogICAgICAgIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gMzUpIHsgLy8gJyMnCiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSBzdHIgPSBzdHIuc2xpY2UoaWR4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0geC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHguc3Vic3RyaW5nKGlkeCArMSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXQogICAgICAgICAgICAgICAgfSkpOwogICAgfQogICAgZnVuY3Rpb24gcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgIHR3aXRjaFdvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7CiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV29ya2VyRmV0Y2hSZXF1ZXN0KGZldGNoUmVxdWVzdCkgewogICAgICAgIC8vIDVzIEFib3J0Q29udHJvbGxlciB0aW1lb3V0IOKAlCBib3VuZHMgd29yc3QtY2FzZSB3YWl0IHdoZW4gVHdpdGNoIEdRTCBoYW5ncy4KICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICAgIGNvbnN0IHRpbWVvdXRNcyA9IDUwMDA7CiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXRNcyk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aW5kb3cucmVhbEZldGNoKGZldGNoUmVxdWVzdC51cmwsIHsKICAgICAgICAgICAgICAgIC4uLmZldGNoUmVxdWVzdC5vcHRpb25zLAogICAgICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLAogICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogcmVzcG9uc2UucmVkaXJlY3RlZCwKICAgICAgICAgICAgICAgIHR5cGU6IHJlc3BvbnNlLnR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaWQ6IGZldGNoUmVxdWVzdC5pZCwKICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicgPyAnR1FMIGZldGNoIHRpbWVvdXQgKCcgKyAodGltZW91dE1zIC8gMTAwMCkgKyAncyknIDogZXJyb3IubWVzc2FnZQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tGZXRjaCgpIHsKICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBXaW5kb3cgZmV0Y2ggaG9vayBpbnN0YWxsZWQnKTsKICAgICAgICBsZXQgaGFzTG9nZ2VkSGVhZGVycyA9IGZhbHNlOwogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IHdpbmRvdy5mZXRjaDsKICAgICAgICB3aW5kb3cucmVhbEZldGNoID0gcmVhbEZldGNoOwogICAgICAgIHdpbmRvdy5mZXRjaCA9IG1hc2tBc05hdGl2ZShmdW5jdGlvbih1cmwsIGluaXQpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdncWwnKSkgewogICAgICAgICAgICAgICAgICAgIGxldCBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snWC1EZXZpY2UtSWQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snRGV2aWNlLUlEJ107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGV2aWNlSWQgPT09ICdzdHJpbmcnICYmIGdxbF9kZXZpY2VfaWQgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVWJvVXBkYXRlRGV2aWNlSWQnLCBncWxfZGV2aWNlX2lkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSA9PT0gJ3N0cmluZycgJiYgaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10gIT09IENsaWVudEludGVncml0eUhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50SW50ZWdyaXR5SGVhZGVyJywgQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSAhPT0gQXV0aG9yaXphdGlvbkhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicsIEF1dGhvcml6YXRpb25IZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghaGFzTG9nZ2VkSGVhZGVycyAmJiBncWxfZGV2aWNlX2lkICYmIEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzTG9nZ2VkSGVhZGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEdRTCBoZWFkZXJzIGNhcHR1cmVkIOKAlCBEZXZpY2VJZDogJyArIChncWxfZGV2aWNlX2lkID8gJ3llcycgOiAnbm8nKSArICcsIEF1dGg6ICcgKyAoQXV0aG9yaXphdGlvbkhlYWRlciA/ICd5ZXMnIDogJ25vJykgKyAnLCBJbnRlZ3JpdHk6ICcgKyAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyID8gJ3llcycgOiAnbm8nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIEdldCByaWQgb2YgbWluaSBwbGF5ZXIgYWJvdmUgY2hhdCAtIFRPRE86IFJlamVjdCB0aGlzIGxvY2FsbHkgaW5zdGVhZCBvZiBoYXZpbmcgc2VydmVyIHJlamVjdCBpdAogICAgICAgICAgICAgICAgICAgIGlmIChpbml0ICYmIHR5cGVvZiBpbml0LmJvZHkgPT09ICdzdHJpbmcnICYmIGluaXQuYm9keS5pbmNsdWRlcygnUGxheWJhY2tBY2Nlc3NUb2tlbicpICYmIGluaXQuYm9keS5pbmNsdWRlcygncGljdHVyZS1ieS1waWN0dXJlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFICYmIHR5cGVvZiBpbml0LmJvZHkgPT09ICdzdHJpbmcnICYmIGluaXQuYm9keS5pbmNsdWRlcygnUGxheWJhY2tBY2Nlc3NUb2tlbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYWNlZFBsYXllclR5cGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Qm9keSA9IEpTT04ucGFyc2UoaW5pdC5ib2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Qm9keSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Qm9keS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgJiYgbmV3Qm9keVtpXT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICE9PSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkUGxheWVyVHlwZSA9IG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdCb2R5Py52YXJpYWJsZXM/LnBsYXllclR5cGUgJiYgbmV3Qm9keT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICE9PSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRQbGF5ZXJUeXBlID0gbmV3Qm9keS52YXJpYWJsZXMucGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW0FEIERFQlVHXSBSZXBsYWNlZCAnJHtyZXBsYWNlZFBsYXllclR5cGV9JyBwbGF5ZXIgdHlwZSB3aXRoICcke09QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEV9JyBwbGF5ZXIgdHlwZWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkobmV3Qm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzYWlUeXBlID0gdXJsLmluY2x1ZGVzKCdicD1taWRyb2xsJykgPyAnbWlkcm9sbCcgOiB1cmwuaW5jbHVkZXMoJ2JwPXByZXJvbGwnKSA/ICdwcmVyb2xsJyA6ICd1bmtub3duJzsKICAgICAgICAgICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoY3NhaVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlZENzYWlUeXBlcy5hZGQoY3NhaVR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDU0FJIGFkIHJlcXVlc3QgZGV0ZWN0ZWQg4oCUIHR5cGU6ICcgKyBjc2FpVHlwZSArICcgKGNsaWVudC1zaWRlIGFkIGluc2VydGlvbiwgbm90IGJsb2NrYWJsZSB2aWEgbTN1OCknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0sICdmZXRjaCcpOwogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlQWRibG9ja0Jhbm5lcihkYXRhKSB7CiAgICAgICAgY29uc3QgcGxheWVyUm9vdERpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXInKTsKICAgICAgICBpZiAocGxheWVyUm9vdERpdiAhPSBudWxsKSB7CiAgICAgICAgICAgIGxldCBhZEJsb2NrRGl2ID0gbnVsbDsKICAgICAgICAgICAgYWRCbG9ja0RpdiA9IHBsYXllclJvb3REaXYucXVlcnlTZWxlY3RvcignLnRhcy1hZGJsb2NrLW92ZXJsYXknKTsKICAgICAgICAgICAgaWYgKGFkQmxvY2tEaXYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYWRCbG9ja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5jbGFzc05hbWUgPSAndGFzLWFkYmxvY2stb3ZlcmxheSc7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJwbGF5ZXItYWRibG9jay1ub3RpY2UiIHN0eWxlPSJjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyBwYWRkaW5nOiA1cHg7Ij48cD48L3A+PC9kaXY+JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUCA9IGFkQmxvY2tEaXYucXVlcnlTZWxlY3RvcigncCcpOwogICAgICAgICAgICAgICAgcGxheWVyUm9vdERpdi5hcHBlbmRDaGlsZChhZEJsb2NrRGl2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoIXR3aXRjaFBsYXllckFuZFN0YXRlPy5wbGF5ZXI/LmNvcmUgfHwgIXR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHR3aXRjaFBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGlzTGl2ZSA9IHR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJykgKyAoZGF0YS5hY3RpdmVCYWNrdXBQbGF5ZXJUeXBlID8gJyAoJyArIGRhdGEuYWN0aXZlQmFja3VwUGxheWVyVHlwZSArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIGlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtb25pdG9yTGl2ZVN0YXR1cygpIHsKICAgICAgICBpZiAoIXR3aXRjaFBsYXllckFuZFN0YXRlPy5wbGF5ZXI/LmNvcmUgfHwgIXR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZSkgewogICAgICAgICAgICB0d2l0Y2hQbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlzTGl2ZSA9IHR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAoIWlzTGl2ZSkgewogICAgICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyKHsKICAgICAgICAgICAgICAgIGhhc0FkczogZmFsc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQobW9uaXRvckxpdmVTdGF0dXMsIDEwMDApOwogICAgfQogICAgZnVuY3Rpb24gZ2V0UGxheWVyQW5kU3RhdGUoKSB7CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Tm9kZShyb290LCBjb25zdHJhaW50KSB7CiAgICAgICAgICAgIGlmIChyb290LnN0YXRlTm9kZSAmJiBjb25zdHJhaW50KHJvb3Quc3RhdGVOb2RlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Quc3RhdGVOb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBub2RlID0gcm9vdC5jaGlsZDsKICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbmRSZWFjdE5vZGUobm9kZSwgY29uc3RyYWludCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGZpbmRSZWFjdFJvb3ROb2RlKCkgewogICAgICAgICAgICBsZXQgcmVhY3RSb290Tm9kZSA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jvb3QnKTsKICAgICAgICAgICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290ICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50KSB7CiAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlYWN0Um9vdE5vZGUgPT0gbnVsbCAmJiByb290Tm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gT2JqZWN0LmtleXMocm9vdE5vZGUpLmZpbmQoeCA9PiB4LnN0YXJ0c1dpdGgoJ19fcmVhY3RDb250YWluZXInKSB8fCB4LnN0YXJ0c1dpdGgoJ19fcmVhY3RGaWJlcicpKTsKICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGVbY29udGFpbmVyTmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWN0Um9vdE5vZGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlYWN0Um9vdE5vZGUgPSBmaW5kUmVhY3RSb290Tm9kZSgpOwogICAgICAgIGlmICghcmVhY3RSb290Tm9kZSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gUHJpbWFyeTogbmFtZWQgcHJvcGVydHkgbG9va3VwCiAgICAgICAgbGV0IHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFBsYXllckFjdGl2ZSAmJiBub2RlLnByb3BzICYmIG5vZGUucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSk7CiAgICAgICAgcGxheWVyID0gcGxheWVyICYmIHBsYXllci5wcm9wcyAmJiBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA/IHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlIDogbnVsbDsKICAgICAgICBpZiAocGxheWVyPy5wbGF5ZXJJbnN0YW5jZSkgewogICAgICAgICAgICBwbGF5ZXIgPSBwbGF5ZXIucGxheWVySW5zdGFuY2U7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGxiYWNrOiBzdHJ1Y3R1cmFsIG1hdGNoIGlmIFR3aXRjaCBvYmZ1c2NhdGVzIHByb3BlcnR5IG5hbWVzCiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgcGxheWVyID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuZ2V0SFRNTFZpZGVvRWxlbWVudCAmJiBub2RlLmdldEJ1ZmZlckR1cmF0aW9uICYmIG5vZGUuY29yZT8uc3RhdGUpOwogICAgICAgIH0KICAgICAgICAvLyBQcmltYXJ5OiBuYW1lZCBwcm9wZXJ0eSBsb29rdXAKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzKTsKICAgICAgICAvLyBGYWxsYmFjazogc3RydWN0dXJhbCBtYXRjaCDigJQgc2V0U3JjIGV4aXN0cyBidXQgc2V0SW5pdGlhbFBsYXliYWNrU2V0dGluZ3Mgd2FzIHJlbmFtZWQKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZUZhbGxiYWNrID0gIXBsYXllclN0YXRlID8gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0U3JjICYmIG5vZGUuc2V0U3RyZWFtTWFuYWdlck5vZGUgJiYgIW5vZGUuZ2V0SFRNTFZpZGVvRWxlbWVudCkgOiBudWxsOwogICAgICAgIC8vIEZhbGxiYWNrIDI6IFRUVi1BQidzIGFwcHJvYWNoIOKAlCB2aWRlb1BsYXllckluc3RhbmNlIHdpdGggcGxheWVyTW9kZQogICAgICAgIGNvbnN0IHBsYXllclN0YXRlRmFsbGJhY2syID0gIXBsYXllclN0YXRlICYmICFwbGF5ZXJTdGF0ZUZhbGxiYWNrID8gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc3RhdGU/LnZpZGVvUGxheWVySW5zdGFuY2U/LnBsYXllck1vZGUgIT09IHVuZGVmaW5lZCk/LnN0YXRlPy52aWRlb1BsYXllckluc3RhbmNlIDogbnVsbDsKICAgICAgICBjb25zdCBmaW5hbFBsYXllclN0YXRlID0gcGxheWVyU3RhdGUgfHwgcGxheWVyU3RhdGVGYWxsYmFjayB8fCBwbGF5ZXJTdGF0ZUZhbGxiYWNrMjsKICAgICAgICByZXR1cm4gIHsKICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXIsCiAgICAgICAgICAgIHN0YXRlOiBmaW5hbFBsYXllclN0YXRlCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbG9hZFR3aXRjaFBsYXllcihpc1BhdXNlUGxheSwgcmVsb2FkS2luZCkgewogICAgICAgIGNvbnN0IHBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICBpZiAoIXBsYXllckFuZFN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCByZWFjdCByb290Jyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGxheWVyID0gcGxheWVyQW5kU3RhdGUucGxheWVyOwogICAgICAgIGNvbnN0IHBsYXllclN0YXRlID0gcGxheWVyQW5kU3RhdGUuc3RhdGU7CiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHBsYXllcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICghcGxheWVyU3RhdGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHBsYXllciBzdGF0ZScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChwbGF5ZXIuaXNQYXVzZWQoKSB8fCBwbGF5ZXIuY29yZT8ucGF1c2VkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gUmVsb2FkIGNvb2xkb3duIOKAlCBlYXJseSByZWxvYWRzICh3b3JrZXItdHJpZ2dlcmVkIHRoaW4tY2FjaGUgZmFzdCBwYXRoKSBieXBhc3MgdGhlCiAgICAgICAgLy8gZ2F0ZSBidXQgc3RpbGwgdXBkYXRlIGJvb2trZWVwaW5nIHNvIDMrIHJhcGlkIGVhcmx5IHJlbG9hZHMgc3RpbGwgdHJpZ2dlciB0aGUgOTBzCiAgICAgICAgLy8gZXNjYWxhdGlvbiB0aGF0IHByb3RlY3RzIGFnYWluc3QgcnVuYXdheSBsb29wcy4KICAgICAgICBpZiAoIWlzUGF1c2VQbGF5ICYmIFJlbG9hZENvb2xkb3duU2Vjb25kcyA+IDApIHsKICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY29uc3QgY29vbGRvd25NcyA9IFJlbG9hZENvb2xkb3duU2Vjb25kcyAqIDEwMDA7CiAgICAgICAgICAgIGNvbnN0IGlzRWFybHkgPSByZWxvYWRLaW5kID09PSAnZWFybHknOwogICAgICAgICAgICBpZiAobGFzdFJlbG9hZFRpbWVzdGFtcCAmJiBub3cgLSBsYXN0UmVsb2FkVGltZXN0YW1wIDwgY29vbGRvd25NcykgewogICAgICAgICAgICAgICAgaWYgKCFpc0Vhcmx5KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gU2tpcHBpbmcgcmVsb2FkIOKAlCBjb29sZG93biBhY3RpdmUgKCcgKyBNYXRoLnJvdW5kKChjb29sZG93bk1zIC0gKG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXApKSAvIDEwMDApICsgJ3MgcmVtYWluaW5nKScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIEJ5cGFzc2luZyBjb29sZG93biBmb3IgZWFybHkgcmVsb2FkICh0aGluLWNhY2hlIGZhc3QgcGF0aCkg4oCUICcgKyBNYXRoLnJvdW5kKChjb29sZG93bk1zIC0gKG5vdyAtIGxhc3RSZWxvYWRUaW1lc3RhbXApKSAvIDEwMDApICsgJ3Mgd291bGQgaGF2ZSByZW1haW5lZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbG9hZFRpbWVzdGFtcHMucHVzaChub3cpOwogICAgICAgICAgICBjb25zdCBmaXZlTWluQWdvID0gbm93IC0gMzAwMDAwOwogICAgICAgICAgICB3aGlsZSAocmVsb2FkVGltZXN0YW1wcy5sZW5ndGggPiAwICYmIHJlbG9hZFRpbWVzdGFtcHNbMF0gPCBmaXZlTWluQWdvKSB7IHJlbG9hZFRpbWVzdGFtcHMuc2hpZnQoKTsgfQogICAgICAgICAgICBpZiAocmVsb2FkVGltZXN0YW1wcy5sZW5ndGggPj0gMyAmJiBSZWxvYWRDb29sZG93blNlY29uZHMgPCA5MCkgewogICAgICAgICAgICAgICAgRXNjYWxhdGVkRnJvbUNvb2xkb3duID0gUmVsb2FkQ29vbGRvd25TZWNvbmRzOwogICAgICAgICAgICAgICAgUmVsb2FkQ29vbGRvd25TZWNvbmRzID0gOTA7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBBdXRvLWVzY2FsYXRlZCByZWxvYWQgY29vbGRvd24gdG8gOTBzICgzKyByZWxvYWRzIGluIDUgbWludXRlcyknKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChFc2NhbGF0ZWRGcm9tQ29vbGRvd24gIT09IG51bGwgJiYgcmVsb2FkVGltZXN0YW1wcy5sZW5ndGggPCAzKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBEZS1lc2NhbGF0ZWQgcmVsb2FkIGNvb2xkb3duIGJhY2sgdG8gJyArIEVzY2FsYXRlZEZyb21Db29sZG93biArICdzIChidXJzdCBzdWJzaWRlZCknKTsKICAgICAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IEVzY2FsYXRlZEZyb21Db29sZG93bjsKICAgICAgICAgICAgICAgIEVzY2FsYXRlZEZyb21Db29sZG93biA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdFJlbG9hZFRpbWVzdGFtcCA9IG5vdzsKICAgICAgICB9CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gRG93bmdyYWRlIHRvIHBhdXNlL3BsYXkgdG8gcHJlc2VydmUgUGlQIOKAlCBzZXRTcmMgZXhpdHMgUGlQCiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpPy5jYXRjaD8uKCgpID0+IHt9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gRG93bmdyYWRlZCByZWxvYWQgdG8gcGF1c2UvcGxheSB0byBwcmVzZXJ2ZSBQaVAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0tleVF1YWxpdHkgPSAndmlkZW8tcXVhbGl0eSc7CiAgICAgICAgY29uc3QgbHNLZXlNdXRlZCA9ICd2aWRlby1tdXRlZCc7CiAgICAgICAgY29uc3QgbHNLZXlWb2x1bWUgPSAndm9sdW1lJzsKICAgICAgICBjb25zdCBsc0tleUxvd0xhdGVuY3kgPSAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJzsvLyBQcmVzZXJ2ZSB1c2VyJ3MgbG93LWxhdGVuY3kgdG9nZ2xlIGFjcm9zcyByZWxvYWRzIChUVFYtQUIgcGFyaXR5KQogICAgICAgIGNvbnN0IGxzS2V5UGVyc2lzdGVuY2UgPSAncGVyc2lzdGVuY2VFbmFibGVkJzsvLyBQcmVzZXJ2ZSBhdXRvcGxheS9wZXJzaXN0ZW5jZSB0b2dnbGUgYWNyb3NzIHJlbG9hZHMgKFRUVi1BQiBwYXJpdHkpCiAgICAgICAgbGV0IGN1cnJlbnRRdWFsaXR5TFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50TXV0ZWRMUyA9IG51bGw7CiAgICAgICAgbGV0IGN1cnJlbnRWb2x1bWVMUyA9IG51bGw7CiAgICAgICAgbGV0IGN1cnJlbnRMb3dMYXRlbmN5TFMgPSBudWxsOwogICAgICAgIGxldCBjdXJyZW50UGVyc2lzdGVuY2VMUyA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY3VycmVudFF1YWxpdHlMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5UXVhbGl0eSk7CiAgICAgICAgICAgIGN1cnJlbnRNdXRlZExTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlNdXRlZCk7CiAgICAgICAgICAgIGN1cnJlbnRWb2x1bWVMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5Vm9sdW1lKTsKICAgICAgICAgICAgY3VycmVudExvd0xhdGVuY3lMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TG93TGF0ZW5jeSk7CiAgICAgICAgICAgIGN1cnJlbnRQZXJzaXN0ZW5jZUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlQZXJzaXN0ZW5jZSk7CiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIHBsYXllci5jb3JlLnN0YXRlLnZvbHVtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLnF1YWxpdHkuZ3JvdXB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgLy8gUHJlLW11dGUgdGhyb3VnaCBoYXJkIHJlbG9hZCB0byBoaWRlIE1TRS10ZWFyZG93biBhdWRpbyBjbGljazsgcmVzdG9yZWQgb24KICAgICAgICAvLyBgY2FucGxheWAgd2l0aCAxNTAwbXMgY2FwLgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwogICAgICAgICAgICBpZiAodiAmJiAhdi5tdXRlZCkgewogICAgICAgICAgICAgICAgdi5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAvLyBNdWx0aS1ldmVudCByZXN0b3JlOiBjYW5wbGF5L3BsYXlpbmcvbG9hZGVkZGF0YSDigJQgZmlyc3QtZmlyZWQgd2lucy4KICAgICAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjb25zdCByZXN0b3JlID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2FucGxheScsIGxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBsaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cikgY3VyLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSA9PT0gJ1ZJREVPJykgcmVzdG9yZSgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCBsaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIGxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocmVzdG9yZSwgNDAwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgcGxheWVyLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgbXV0ZWQvdm9sdW1lIHN0YXRlIGFmdGVyIHJlbG9hZCDigJQgQ2hyb21lIGF1dG9wbGF5IHBvbGljeSBjYW4gZm9yY2UgbXV0ZWQuCiAgICAgICAgLy8gQmxvY2sgbXVzdCBhbHdheXMgcnVuOiBpZiBUd2l0Y2ggaGFzbid0IHdyaXR0ZW4gTFMgdmFsdWVzIHlldCAoZnJlc2ggc2Vzc2lvbiwgcHJpdmF0ZSBtb2RlLAogICAgICAgIC8vIGNsZWFyZWQgY2FjaGUpLCB0aGUgdmlkZW8gc3RpbGwgbmVlZHMgdW5tdXRlIGFmdGVyIENocm9tZSdzIGF1dG9wbGF5IG11dGUgb24gcmVsb2FkLgogICAgICAgIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UXVhbGl0eUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TXV0ZWRMUykgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Vm9sdW1lTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG93TGF0ZW5jeUxTICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TG93TGF0ZW5jeSwgY3VycmVudExvd0xhdGVuY3lMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGVyc2lzdGVuY2VMUyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVBlcnNpc3RlbmNlLCBjdXJyZW50UGVyc2lzdGVuY2VMUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgIC8vIFJlc3BlY3QgdXNlcidzIG11dGUgaW50ZW50OiBvbmx5IGZvcmNlLXVubXV0ZSBpZiBMUyBkaWRuJ3Qgc2F5IG11dGUuCiAgICAgICAgICAgICAgICAgICAgLy8gVHdpdGNoIHdyaXRlcyB2aWRlby1tdXRlZCBhcyAneyJkZWZhdWx0Ijp0cnVlfScgd2hlbiB1c2VyIG11dGVkIHZpYSBVSTsKICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYXV0b3BsYXkgcG9saWN5IGNhbiBtdXRlIGV2ZW4gaWYgdXNlciBkaWRuJ3QgKG5vIExTIHNpZ25hbCkuCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckludGVuZGVkTXV0ZSA9IGN1cnJlbnRNdXRlZExTICYmIGN1cnJlbnRNdXRlZExTLmluY2x1ZGVzKCciZGVmYXVsdCI6dHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID4gMCAmJiB2aWRlb3NbMF0ubXV0ZWQgJiYgIXVzZXJJbnRlbmRlZE11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zWzBdLm11dGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRlbnRMb2FkZWQoKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXZlbnR2LWV4dGVuc2lvbicpKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQUQgREVCVUddIFdhcm5pbmc6IDdUViBleHRlbnNpb24gZGV0ZWN0ZWQg4oCUIG1heSBjYXVzZSBibGFjayBzY3JlZW4gb3IgYnVmZmVyaW5nIGlzc3Vlcy4gSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMsIHRyeSBkaXNhYmxpbmcgN1RWLicpOwogICAgICAgIH0KICAgICAgICAvLyBSZXN1bWUgdGhlIHBsYXllciBvbiB0YWIgZm9jdXMgaWYgVHdpdGNoIHBhdXNlZCBpdCBkdXJpbmcgYW4gYWQgb24gYSBoaWRkZW4gdGFiLgogICAgICAgIC8vIFByZXZpb3VzbHkgYWxzbyBzcG9vZmVkIGRvY3VtZW50LmhpZGRlbiAvIHZpc2liaWxpdHlTdGF0ZSAvIGhhc0ZvY3VzIC8gbW96SGlkZGVuIC8KICAgICAgICAvLyB3ZWJraXRIaWRkZW4gYW5kIHN3YWxsb3dlZCB0aGUgZXZlbnRzIG9uIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0IGJyb2tlIG90aGVyCiAgICAgICAgLy8gZXh0ZW5zaW9ucyB0aGF0IGtleSBvZmYgcmVhbCB2aXNpYmlsaXR5IChlLmcuIEJldHRlclRUViAiTXV0ZSBJbnZpc2libGUgUGxheWVyIikuCiAgICAgICAgLy8gUmVzdW1lLW9uLWZvY3VzIGFsb25lIGlzIGVub3VnaCB0byBrZWVwIHBsYXliYWNrIGFsaXZlIGFjcm9zcyBoaWRkZW7ihpJ2aXNpYmxlCiAgICAgICAgLy8gdHJhbnNpdGlvbnMgZHVyaW5nIGFkcy4gU3luYydkIHdpdGggVFRWLUFCIHY2LjUuMC4KICAgICAgICBsZXQgd2FzVmlkZW9QbGF5aW5nID0gdHJ1ZTsKICAgICAgICBjb25zdCB2aXNpYmlsaXR5Q2hhbmdlID0gKCkgPT4gewogICAgICAgICAgICBjb25zdCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPT09IDApIHJldHVybjsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmhpZGRlbikgewogICAgICAgICAgICAgICAgd2FzVmlkZW9QbGF5aW5nID0gIXZpZGVvc1swXS5wYXVzZWQgJiYgIXZpZGVvc1swXS5lbmRlZDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2FzVmlkZW9QbGF5aW5nICYmICF2aWRlb3NbMF0uZW5kZWQgJiYgdmlkZW9zWzBdLnBhdXNlZCkgewogICAgICAgICAgICAgICAgdmlkZW9zWzBdLnBsYXkoKT8uY2F0Y2g/LigoKSA9PiB7fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlKTsKICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qga2V5c1RvQ2FjaGUgPSBbCiAgICAgICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAgICAgJ3ZvbHVtZScsCiAgICAgICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICAgICAgXTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gbmV3IE1hcCgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlYWxTZXRJdGVtID0gbG9jYWxTdG9yYWdlLnNldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gbWFza0FzTmF0aXZlKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhbFNldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgJ3NldEl0ZW0nKTsKICAgICAgICAgICAgY29uc3QgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9LCAnZ2V0SXRlbScpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0gPT09IHJlYWxHZXRJdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVzZSBob29rcyBhcmUgdXNlZnVsIHRvIHByZXNlcnZlIHBsYXllciBzdGF0ZSBvbiBwbGF5ZXIgcmVsb2FkCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYWxsb3cgaG9va2luZyBvZiBsb2NhbFN0b3JhZ2UgZnVuY3Rpb25zIGJ1dCBjaHJvbWUgZG9lcwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvY2FsU3RvcmFnZUhvb2tzIGZhaWxlZCAnICsgZXJyKQogICAgICAgICAgICBsb2NhbFN0b3JhZ2VIb29rRmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gcmVsb2FkVHdpdGNoUGxheWVyOwogICAgZGVjbGFyZU9wdGlvbnMod2luZG93KTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgbHNSZWxvYWRBZnRlckFkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3JlbG9hZFBsYXllckFmdGVyQWQnKTsKICAgICAgICBpZiAobHNSZWxvYWRBZnRlckFkICE9PSBudWxsKSB7CiAgICAgICAgICAgIFJlbG9hZFBsYXllckFmdGVyQWQgPSBsc1JlbG9hZEFmdGVyQWQgPT09ICd0cnVlJzsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNQbGF5ZXJUeXBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQbGF5ZXJUeXBlICE9PSBudWxsKSB7CiAgICAgICAgICAgIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgPSBsc1BsYXllclR5cGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzUGluQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aXRjaEFkU29sdXRpb25zX3BpbkJhY2t1cFBsYXllclR5cGUnKTsKICAgICAgICBpZiAobHNQaW5CYWNrdXAgIT09IG51bGwpIHsKICAgICAgICAgICAgUGluQmFja3VwUGxheWVyVHlwZSA9IGxzUGluQmFja3VwID09PSAndHJ1ZSc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzQ29vbGRvd24gPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfcmVsb2FkQ29vbGRvd25TZWNvbmRzJykpOwogICAgICAgIGlmICghaXNOYU4obHNDb29sZG93bikgJiYgbHNDb29sZG93biA+PSAwKSB7CiAgICAgICAgICAgIFJlbG9hZENvb2xkb3duU2Vjb25kcyA9IGxzQ29vbGRvd247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzRWFybHlSZWxvYWQgPSBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpdGNoQWRTb2x1dGlvbnNfZWFybHlSZWxvYWRQb2xsVGhyZXNob2xkJykpOwogICAgICAgIGlmICghaXNOYU4obHNFYXJseVJlbG9hZCkgJiYgbHNFYXJseVJlbG9hZCA+PSAwKSB7CiAgICAgICAgICAgIEVhcmx5UmVsb2FkUG9sbFRocmVzaG9sZCA9IGxzRWFybHlSZWxvYWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzSGlkZUFkT3ZlcmxheSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2l0Y2hBZFNvbHV0aW9uc19oaWRlQWRPdmVybGF5Jyk7CiAgICAgICAgaWYgKGxzSGlkZUFkT3ZlcmxheSA9PT0gJ3RydWUnKSB7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAnLnRhcy1hZGJsb2NrLW92ZXJsYXkgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0nOwogICAgICAgICAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICBjb25zb2xlLmxvZygnW0FEIERFQlVHXSBDb25maWc6IFJlbG9hZFBsYXllckFmdGVyQWQgPSAnICsgUmVsb2FkUGxheWVyQWZ0ZXJBZCArICcsIEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlID0gJyArIE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgKyAnLCBQaW5CYWNrdXBQbGF5ZXJUeXBlID0gJyArIFBpbkJhY2t1cFBsYXllclR5cGUpOwogICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgaG9va0ZldGNoKCk7CiAgICBjb25zdCByZWFsWEhST3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBtYXNrQXNOYXRpdmUoZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsKICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLmluY2x1ZGVzKCdlZGdlLmFkcy50d2l0Y2gudHYnKSkgewogICAgICAgICAgICBjb25zdCBjc2FpVHlwZSA9IHVybC5pbmNsdWRlcygnYnA9bWlkcm9sbCcpID8gJ21pZHJvbGwnIDogdXJsLmluY2x1ZGVzKCdicD1wcmVyb2xsJykgPyAncHJlcm9sbCcgOiAndW5rbm93bic7CiAgICAgICAgICAgIGNvbnN0IHhocktleSA9IGNzYWlUeXBlICsgJy14aHInOwogICAgICAgICAgICBpZiAoIWxvZ2dlZENzYWlUeXBlcy5oYXMoeGhyS2V5KSkgewogICAgICAgICAgICAgICAgbG9nZ2VkQ3NhaVR5cGVzLmFkZCh4aHJLZXkpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tBRCBERUJVR10gQ1NBSSBhZCByZXF1ZXN0IChYSFIpIGRldGVjdGVkIOKAlCB0eXBlOiAnICsgY3NhaVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWFsWEhST3Blbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSwgJ29wZW4nKTsKICAgIG1vbml0b3JMaXZlU3RhdHVzKCk7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"}] \ No newline at end of file diff --git a/resources/brave-yt-sabr-fix.js b/resources/brave-yt-sabr-fix.js index 330b7dbd..17b156c5 100644 --- a/resources/brave-yt-sabr-fix.js +++ b/resources/brave-yt-sabr-fix.js @@ -7,11 +7,11 @@ // // Two-pronged fix: // -// 1. SPA navigation: When clicking between videos without a page reload, -// the player reuses the old SABR session (which may already have a -// backoff). On yt-navigate-finish, we set isInlinePlaybackNoAd on the -// player's video data (telling it there's no ad slot), then call -// cancelPlayback() + loadVideoById() to force a new SABR session. +// 1. Fresh ad-free session: When Prong 2 detects a real backoff, set +// isInlinePlaybackNoAd on the player's video data (telling it there's no +// ad slot), then call cancelPlayback() + loadVideoById() to force a new +// SABR session. Guarded per video and only before playback starts, so +// no-ad videos and mid-playback pacing backoffs are left alone. // // 2. SABR response patching (full page loads): Intercept SABR streaming // responses and rewrite backoffTimeMs in the protobuf. This handles @@ -36,58 +36,29 @@ // Premium accounts have no ads and no backoff, nothing to do. if (document.querySelector('a#logo[title*="Premium" i]')) return; - // Prong 1: On SPA navigation, force a new ad-free SABR session. - // Set isInlinePlaybackNoAd on the video data so the new session - // doesn't get an ad slot, then tear down the old session and start fresh. - // Initialize to the current vid so the initial yt-navigate-finish - // (which fires on page load completion, not just SPA nav) is treated - // as a duplicate and skipped. Avoids tearing down playback on refresh. - // We skip teardown when there's no prior session to clear. - let lastReloadedVid = new URL(window.location.href).searchParams.get('v') || ''; - window.addEventListener('yt-navigate-finish', () => { + // Prong 1: Force a fresh ad-free SABR session, driven by Prong 2 when it + // sees a real backoff. Set isInlinePlaybackNoAd so the new session gets no + // ad slot, then tear down the current session and reload. Guarded per video + // (one reload each, so a session that still backs off falls back to patching + // rather than looping) and skipped once playback has started — a no-ad video + // has no backoff, and a mid-playback backoff is normal pacing. + let reloadedVid = null; + function forceFreshSession() { const vid = new URL(window.location.href).searchParams.get('v'); - if (!vid || vid === lastReloadedVid) return; - const hadPriorSession = lastReloadedVid !== ''; - lastReloadedVid = vid; - if (!hadPriorSession) return; - - setTimeout(() => { - const player = document.querySelector('#movie_player'); - if (!player?.cancelPlayback || !player?.loadVideoById) return; - - // Set the no-ad flag before reloading so the new session picks it up - const vd = player.getVideoData?.(); - if (vd) vd.isInlinePlaybackNoAd = true; - - player.cancelPlayback(); - player.loadVideoById(vid); - log('forced new SABR session for', vid); - }, 100); - }); - - // Prong 1b: cold-load rescue. On a fresh page load the player already - // holds a SABR session carrying the ad-slot backoff, and Prong 1 (SPA nav - // only) won't fire. Prong 2 below can rewrite backoffTimeMs, but YouTube - // seems to be ignoring our rewritten value and enforcing a server-side - // ad-slot delay. The way to get around this is to force a fresh session - // (same mechanism as Prong 1). So when Prong 2 first sees a real backoff - // on the cold session, force a single fresh session here. If the new - // session still returns a backoff, we break to avoid a reload loop. - let coldReloadDone = false; - function forceFreshSessionOnce() { - if (coldReloadDone) return; - coldReloadDone = true; + if (!vid || vid === reloadedVid) return; + const video = document.querySelector('video'); + if (video && video.currentTime > 1) return; + reloadedVid = vid; const player = document.querySelector('#movie_player'); if (!player?.cancelPlayback || !player?.loadVideoById) return; - const vid = new URL(window.location.href).searchParams.get('v'); - if (!vid) return; + // Set the no-ad flag before reloading so the new session picks it up const vd = player.getVideoData?.(); if (vd) vd.isInlinePlaybackNoAd = true; player.cancelPlayback(); player.loadVideoById(vid); - log('cold-load rescue: forced fresh ad-free session for', vid); + log('forced fresh ad-free session for', vid); } // Prong 2: Intercept SABR responses and patch backoffTimeMs. @@ -121,10 +92,9 @@ return new Response(pass, reinit); } log('small response rn=' + rn, 'size=' + bytes.length); - // To avoid the ad-slot wait, attempt to force a fresh session - // after the first sign of a real backoff on the cold session. If the new - // session still returns a backoff, break to avoid an infinite reload loop. - if (patchBackoffField(bytes, rn)) forceFreshSessionOnce(); + // A real backoff blocks initial playback; force a fresh + // ad-free session (guarded per video, skipped mid-playback). + if (patchBackoffField(bytes, rn)) forceFreshSession(); const out = new Response(bytes, reinit); try { Object.defineProperty(out, 'url', { value: response.url, configurable: true });