data:text/javascript;base64,IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuSGxzPWUoKTp0Lkhscz1lKCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShpKXtpZihyW2ldKXJldHVybiByW2ldLmV4cG9ydHM7dmFyIGE9cltpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbaV0uY2FsbChhLmV4cG9ydHMsYSxhLmV4cG9ydHMsZSksYS5sPSEwLGEuZXhwb3J0c312YXIgcj17fTtyZXR1cm4gZS5tPXQsZS5jPXIsZS5kPWZ1bmN0aW9uKHQscixpKXtlLm8odCxyKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQscix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Oml9KX0sZS5uPWZ1bmN0aW9uKHQpe3ZhciByPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBlLmQociwiYSIscikscn0sZS5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxlLnA9Ii9kaXN0LyIsZShlLnM9OCl9KFtmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoKXt9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBlPSJbIit0KyJdID4gIitlfWZ1bmN0aW9uIG4odCl7dmFyIGU9c2VsZi5jb25zb2xlW3RdO3JldHVybiBlP2Z1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsaT1BcnJheShyKSxuPTA7bjxyO24rKylpW25dPWFyZ3VtZW50c1tuXTtpWzBdJiYoaVswXT1hKHQsaVswXSkpLGUuYXBwbHkoc2VsZi5jb25zb2xlLGkpfTppfWZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1BcnJheShlPjE/ZS0xOjApLGk9MTtpPGU7aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2RbZV09dFtlXT90W2VdLmJpbmQodCk6bihlKX0pfXIuZChlLCJhIixmdW5jdGlvbigpe3JldHVybiB1fSksci5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGh9KTt2YXIgcz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0sbD17dHJhY2U6aSxkZWJ1ZzppLGxvZzppLHdhcm46aSxpbmZvOmksZXJyb3I6aX0sZD1sLHU9ZnVuY3Rpb24odCl7aWYoITA9PT10fHwib2JqZWN0Ij09PSh2b2lkIDA9PT10PyJ1bmRlZmluZWQiOnModCkpKXtvKHQsImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciIpO3RyeXtkLmxvZygpfWNhdGNoKHQpe2Q9bH19ZWxzZSBkPWx9LGg9ZH0sZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmE9e01FRElBX0FUVEFDSElORzoiaGxzTWVkaWFBdHRhY2hpbmciLE1FRElBX0FUVEFDSEVEOiJobHNNZWRpYUF0dGFjaGVkIixNRURJQV9ERVRBQ0hJTkc6Imhsc01lZGlhRGV0YWNoaW5nIixNRURJQV9ERVRBQ0hFRDoiaGxzTWVkaWFEZXRhY2hlZCIsQlVGRkVSX1JFU0VUOiJobHNCdWZmZXJSZXNldCIsQlVGRkVSX0NPREVDUzoiaGxzQnVmZmVyQ29kZWNzIixCVUZGRVJfQ1JFQVRFRDoiaGxzQnVmZmVyQ3JlYXRlZCIsQlVGRkVSX0FQUEVORElORzoiaGxzQnVmZmVyQXBwZW5kaW5nIixCVUZGRVJfQVBQRU5ERUQ6Imhsc0J1ZmZlckFwcGVuZGVkIixCVUZGRVJfRU9TOiJobHNCdWZmZXJFb3MiLEJVRkZFUl9GTFVTSElORzoiaGxzQnVmZmVyRmx1c2hpbmciLEJVRkZFUl9GTFVTSEVEOiJobHNCdWZmZXJGbHVzaGVkIixNQU5JRkVTVF9MT0FESU5HOiJobHNNYW5pZmVzdExvYWRpbmciLE1BTklGRVNUX0xPQURFRDoiaGxzTWFuaWZlc3RMb2FkZWQiLE1BTklGRVNUX1BBUlNFRDoiaGxzTWFuaWZlc3RQYXJzZWQiLExFVkVMX1NXSVRDSDoiaGxzTGV2ZWxTd2l0Y2giLExFVkVMX1NXSVRDSElORzoiaGxzTGV2ZWxTd2l0Y2hpbmciLExFVkVMX1NXSVRDSEVEOiJobHNMZXZlbFN3aXRjaGVkIixMRVZFTF9MT0FESU5HOiJobHNMZXZlbExvYWRpbmciLExFVkVMX0xPQURFRDoiaGxzTGV2ZWxMb2FkZWQiLExFVkVMX1VQREFURUQ6Imhsc0xldmVsVXBkYXRlZCIsTEVWRUxfUFRTX1VQREFURUQ6Imhsc0xldmVsUHRzVXBkYXRlZCIsQVVESU9fVFJBQ0tTX1VQREFURUQ6Imhsc0F1ZGlvVHJhY2tzVXBkYXRlZCIsQVVESU9fVFJBQ0tfU1dJVENIOiJobHNBdWRpb1RyYWNrU3dpdGNoIixBVURJT19UUkFDS19TV0lUQ0hJTkc6Imhsc0F1ZGlvVHJhY2tTd2l0Y2hpbmciLEFVRElPX1RSQUNLX1NXSVRDSEVEOiJobHNBdWRpb1RyYWNrU3dpdGNoZWQiLEFVRElPX1RSQUNLX0xPQURJTkc6Imhsc0F1ZGlvVHJhY2tMb2FkaW5nIixBVURJT19UUkFDS19MT0FERUQ6Imhsc0F1ZGlvVHJhY2tMb2FkZWQiLFNVQlRJVExFX1RSQUNLU19VUERBVEVEOiJobHNTdWJ0aXRsZVRyYWNrc1VwZGF0ZWQiLFNVQlRJVExFX1RSQUNLX1NXSVRDSDoiaGxzU3VidGl0bGVUcmFja1N3aXRjaCIsU1VCVElUTEVfVFJBQ0tfTE9BRElORzoiaGxzU3VidGl0bGVUcmFja0xvYWRpbmciLFNVQlRJVExFX1RSQUNLX0xPQURFRDoiaGxzU3VidGl0bGVUcmFja0xvYWRlZCIsU1VCVElUTEVfRlJBR19QUk9DRVNTRUQ6Imhsc1N1YnRpdGxlRnJhZ1Byb2Nlc3NlZCIsSU5JVF9QVFNfRk9VTkQ6Imhsc0luaXRQdHNGb3VuZCIsRlJBR19MT0FESU5HOiJobHNGcmFnTG9hZGluZyIsRlJBR19MT0FEX1BST0dSRVNTOiJobHNGcmFnTG9hZFByb2dyZXNzIixGUkFHX0xPQURfRU1FUkdFTkNZX0FCT1JURUQ6Imhsc0ZyYWdMb2FkRW1lcmdlbmN5QWJvcnRlZCIsRlJBR19MT0FERUQ6Imhsc0ZyYWdMb2FkZWQiLEZSQUdfREVDUllQVEVEOiJobHNGcmFnRGVjcnlwdGVkIixGUkFHX1BBUlNJTkdfSU5JVF9TRUdNRU5UOiJobHNGcmFnUGFyc2luZ0luaXRTZWdtZW50IixGUkFHX1BBUlNJTkdfVVNFUkRBVEE6Imhsc0ZyYWdQYXJzaW5nVXNlcmRhdGEiLEZSQUdfUEFSU0lOR19NRVRBREFUQToiaGxzRnJhZ1BhcnNpbmdNZXRhZGF0YSIsRlJBR19QQVJTSU5HX0RBVEE6Imhsc0ZyYWdQYXJzaW5nRGF0YSIsRlJBR19QQVJTRUQ6Imhsc0ZyYWdQYXJzZWQiLEZSQUdfQlVGRkVSRUQ6Imhsc0ZyYWdCdWZmZXJlZCIsRlJBR19DSEFOR0VEOiJobHNGcmFnQ2hhbmdlZCIsRlBTX0RST1A6Imhsc0Zwc0Ryb3AiLEZQU19EUk9QX0xFVkVMX0NBUFBJTkc6Imhsc0Zwc0Ryb3BMZXZlbENhcHBpbmciLEVSUk9SOiJobHNFcnJvciIsREVTVFJPWUlORzoiaGxzRGVzdHJveWluZyIsS0VZX0xPQURJTkc6Imhsc0tleUxvYWRpbmciLEtFWV9MT0FERUQ6Imhsc0tleUxvYWRlZCIsU1RSRUFNX1NUQVRFX1RSQU5TSVRJT046Imhsc1N0cmVhbVN0YXRlVHJhbnNpdGlvbiJ9fSxmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3IuZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBpfSksci5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTt2YXIgaT17TkVUV09SS19FUlJPUjoibmV0d29ya0Vycm9yIixNRURJQV9FUlJPUjoibWVkaWFFcnJvciIsTVVYX0VSUk9SOiJtdXhFcnJvciIsT1RIRVJfRVJST1I6Im90aGVyRXJyb3IifSxhPXtNQU5JRkVTVF9MT0FEX0VSUk9SOiJtYW5pZmVzdExvYWRFcnJvciIsTUFOSUZFU1RfTE9BRF9USU1FT1VUOiJtYW5pZmVzdExvYWRUaW1lT3V0IixNQU5JRkVTVF9QQVJTSU5HX0VSUk9SOiJtYW5pZmVzdFBhcnNpbmdFcnJvciIsTUFOSUZFU1RfSU5DT01QQVRJQkxFX0NPREVDU19FUlJPUjoibWFuaWZlc3RJbmNvbXBhdGlibGVDb2RlY3NFcnJvciIsTEVWRUxfTE9BRF9FUlJPUjoibGV2ZWxMb2FkRXJyb3IiLExFVkVMX0xPQURfVElNRU9VVDoibGV2ZWxMb2FkVGltZU91dCIsTEVWRUxfU1dJVENIX0VSUk9SOiJsZXZlbFN3aXRjaEVycm9yIixBVURJT19UUkFDS19MT0FEX0VSUk9SOiJhdWRpb1RyYWNrTG9hZEVycm9yIixBVURJT19UUkFDS19MT0FEX1RJTUVPVVQ6ImF1ZGlvVHJhY2tMb2FkVGltZU91dCIsRlJBR19MT0FEX0VSUk9SOiJmcmFnTG9hZEVycm9yIixGUkFHX0xPT1BfTE9BRElOR19FUlJPUjoiZnJhZ0xvb3BMb2FkaW5nRXJyb3IiLEZSQUdfTE9BRF9USU1FT1VUOiJmcmFnTG9hZFRpbWVPdXQiLEZSQUdfREVDUllQVF9FUlJPUjoiZnJhZ0RlY3J5cHRFcnJvciIsRlJBR19QQVJTSU5HX0VSUk9SOiJmcmFnUGFyc2luZ0Vycm9yIixSRU1VWF9BTExPQ19FUlJPUjoicmVtdXhBbGxvY0Vycm9yIixLRVlfTE9BRF9FUlJPUjoia2V5TG9hZEVycm9yIixLRVlfTE9BRF9USU1FT1VUOiJrZXlMb2FkVGltZU91dCIsQlVGRkVSX0FERF9DT0RFQ19FUlJPUjoiYnVmZmVyQWRkQ29kZWNFcnJvciIsQlVGRkVSX0FQUEVORF9FUlJPUjoiYnVmZmVyQXBwZW5kRXJyb3IiLEJVRkZFUl9BUFBFTkRJTkdfRVJST1I6ImJ1ZmZlckFwcGVuZGluZ0Vycm9yIixCVUZGRVJfU1RBTExFRF9FUlJPUjoiYnVmZmVyU3RhbGxlZEVycm9yIixCVUZGRVJfRlVMTF9FUlJPUjoiYnVmZmVyRnVsbEVycm9yIixCVUZGRVJfU0VFS19PVkVSX0hPTEU6ImJ1ZmZlclNlZWtPdmVySG9sZSIsQlVGRkVSX05VREdFX09OX1NUQUxMOiJidWZmZXJOdWRnZU9uU3RhbGwiLElOVEVSTkFMX0VYQ0VQVElPTjoiaW50ZXJuYWxFeGNlcHRpb24ifX0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2kodGhpcyx0KX1yZXR1cm4gdC5pc0hlYWRlcj1mdW5jdGlvbih0LGUpe3JldHVybiBlKzEwPD10Lmxlbmd0aCYmNzM9PT10W2VdJiY2OD09PXRbZSsxXSYmNTE9PT10W2UrMl0mJnRbZSszXTwyNTUmJnRbZSs0XTwyNTUmJnRbZSs2XTwxMjgmJnRbZSs3XTwxMjgmJnRbZSs4XTwxMjgmJnRbZSs5XTwxMjh9LHQuaXNGb290ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSsxMDw9dC5sZW5ndGgmJjUxPT09dFtlXSYmNjg9PT10W2UrMV0mJjczPT09dFtlKzJdJiZ0W2UrM108MjU1JiZ0W2UrNF08MjU1JiZ0W2UrNl08MTI4JiZ0W2UrN108MTI4JiZ0W2UrOF08MTI4JiZ0W2UrOV08MTI4fSx0LmdldElEM0RhdGE9ZnVuY3Rpb24oZSxyKXtmb3IodmFyIGk9cixhPTA7dC5pc0hlYWRlcihlLHIpOyl7YSs9MTA7YSs9dC5fcmVhZFNpemUoZSxyKzYpLHQuaXNGb290ZXIoZSxyKzEwKSYmKGErPTEwKSxyKz1hfWlmKGE+MClyZXR1cm4gZS5zdWJhcnJheShpLGkrYSl9LHQuX3JlYWRTaXplPWZ1bmN0aW9uKHQsZSl7dmFyIHI9MDtyZXR1cm4gcj0oMTI3JnRbZV0pPDwyMSxyfD0oMTI3JnRbZSsxXSk8PDE0LHJ8PSgxMjcmdFtlKzJdKTw8NyxyfD0xMjcmdFtlKzNdfSx0LmdldFRpbWVTdGFtcD1mdW5jdGlvbihlKXtmb3IodmFyIHI9dC5nZXRJRDNGcmFtZXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgYT1yW2ldO2lmKHQuaXNUaW1lU3RhbXBGcmFtZShhKSlyZXR1cm4gdC5fcmVhZFRpbWVTdGFtcChhKX19LHQuaXNUaW1lU3RhbXBGcmFtZT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmIlBSSVYiPT09dC5rZXkmJiJjb20uYXBwbGUuc3RyZWFtaW5nLnRyYW5zcG9ydFN0cmVhbVRpbWVzdGFtcCI9PT10LmluZm99LHQuX2dldEZyYW1lRGF0YT1mdW5jdGlvbihlKXt2YXIgcj1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbMF0sZVsxXSxlWzJdLGVbM10pLGk9dC5fcmVhZFNpemUoZSw0KTtyZXR1cm57dHlwZTpyLHNpemU6aSxkYXRhOmUuc3ViYXJyYXkoMTAsMTAraSl9fSx0LmdldElEM0ZyYW1lcz1mdW5jdGlvbihlKXtmb3IodmFyIHI9MCxpPVtdO3QuaXNIZWFkZXIoZSxyKTspe3ZhciBhPXQuX3JlYWRTaXplKGUscis2KTtyKz0xMDtmb3IodmFyIG49cithO3IrODxuOyl7dmFyIG89dC5fZ2V0RnJhbWVEYXRhKGUuc3ViYXJyYXkocikpLHM9dC5fZGVjb2RlRnJhbWUobyk7cyYmaS5wdXNoKHMpLHIrPW8uc2l6ZSsxMH10LmlzRm9vdGVyKGUscikmJihyKz0xMCl9cmV0dXJuIGl9LHQuX2RlY29kZUZyYW1lPWZ1bmN0aW9uKGUpe3JldHVybiJQUklWIj09PWUudHlwZT90Ll9kZWNvZGVQcml2RnJhbWUoZSk6IlQiPT09ZS50eXBlWzBdP3QuX2RlY29kZVRleHRGcmFtZShlKToiVyI9PT1lLnR5cGVbMF0/dC5fZGVjb2RlVVJMRnJhbWUoZSk6dm9pZCAwfSx0Ll9yZWFkVGltZVN0YW1wPWZ1bmN0aW9uKHQpe2lmKDg9PT10LmRhdGEuYnl0ZUxlbmd0aCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodC5kYXRhKSxyPTEmZVszXSxpPShlWzRdPDwyMykrKGVbNV08PDE1KSsoZVs2XTw8NykrZVs3XTtyZXR1cm4gaS89NDUsciYmKGkrPTQ3NzIxODU4Ljg0KSxNYXRoLnJvdW5kKGkpfX0sdC5fZGVjb2RlUHJpdkZyYW1lPWZ1bmN0aW9uKGUpe2lmKCEoZS5zaXplPDIpKXt2YXIgcj10Ll91dGY4QXJyYXlUb1N0cihlLmRhdGEpLGk9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLnN1YmFycmF5KHIubGVuZ3RoKzEpKTtyZXR1cm57a2V5OmUudHlwZSxpbmZvOnIsZGF0YTppLmJ1ZmZlcn19fSx0Ll9kZWNvZGVUZXh0RnJhbWU9ZnVuY3Rpb24oZSl7aWYoIShlLnNpemU8Mikpe2lmKCJUWFhYIj09PWUudHlwZSl7dmFyIHI9MSxpPXQuX3V0ZjhBcnJheVRvU3RyKGUuZGF0YS5zdWJhcnJheShyKSk7cis9aS5sZW5ndGgrMTt2YXIgYT10Ll91dGY4QXJyYXlUb1N0cihlLmRhdGEuc3ViYXJyYXkocikpO3JldHVybntrZXk6ZS50eXBlLGluZm86aSxkYXRhOmF9fXZhciBuPXQuX3V0ZjhBcnJheVRvU3RyKGUuZGF0YS5zdWJhcnJheSgxKSk7cmV0dXJue2tleTplLnR5cGUsZGF0YTpufX19LHQuX2RlY29kZVVSTEZyYW1lPWZ1bmN0aW9uKGUpe2lmKCJXWFhYIj09PWUudHlwZSl7aWYoZS5zaXplPDIpcmV0dXJuO3ZhciByPTEsaT10Ll91dGY4QXJyYXlUb1N0cihlLmRhdGEuc3ViYXJyYXkocikpO3IrPWkubGVuZ3RoKzE7dmFyIGE9dC5fdXRmOEFycmF5VG9TdHIoZS5kYXRhLnN1YmFycmF5KHIpKTtyZXR1cm57a2V5OmUudHlwZSxpbmZvOmksZGF0YTphfX12YXIgbj10Ll91dGY4QXJyYXlUb1N0cihlLmRhdGEpO3JldHVybntrZXk6ZS50eXBlLGRhdGE6bn19LHQuX3V0ZjhBcnJheVRvU3RyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT12b2lkIDAscj12b2lkIDAsaT0iIixhPTAsbj10Lmxlbmd0aDthPG47KXt2YXIgbz10W2ErK107c3dpdGNoKG8+PjQpe2Nhc2UgMDpyZXR1cm4gaTtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmNhc2UgNjpjYXNlIDc6aSs9U3RyaW5nLmZyb21DaGFyQ29kZShvKTticmVhaztjYXNlIDEyOmNhc2UgMTM6ZT10W2ErK10saSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoMzEmbyk8PDZ8NjMmZSk7YnJlYWs7Y2FzZSAxNDplPXRbYSsrXSxyPXRbYSsrXSxpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgxNSZvKTw8MTJ8KDYzJmUpPDw2fCg2MyZyKTw8MCl9fXJldHVybiBpfSx0fSgpO2UuYT1hfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9ZnVuY3Rpb24gaSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBhKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH1mdW5jdGlvbiBuKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdm9pZCAwPT09dH10LmV4cG9ydHM9cixyLkV2ZW50RW1pdHRlcj1yLHIucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLHIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLHIuZGVmYXVsdE1heExpc3RlbmVycz0xMCxyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7aWYoIWEodCl8fHQ8MHx8aXNOYU4odCkpdGhyb3cgVHlwZUVycm9yKCJuIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXQsdGhpc30sci5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZSxyLGEscyxsLGQ7aWYodGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSwiZXJyb3IiPT09dCYmKCF0aGlzLl9ldmVudHMuZXJyb3J8fG4odGhpcy5fZXZlbnRzLmVycm9yKSYmIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKXtpZigoZT1hcmd1bWVudHNbMV0paW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciB1PW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK2UrIikiKTt0aHJvdyB1LmNvbnRleHQ9ZSx1fWlmKHI9dGhpcy5fZXZlbnRzW3RdLG8ocikpcmV0dXJuITE7aWYoaShyKSlzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnIuY2FsbCh0aGlzKTticmVhaztjYXNlIDI6ci5jYWxsKHRoaXMsYXJndW1lbnRzWzFdKTticmVhaztjYXNlIDM6ci5jYWxsKHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7ZGVmYXVsdDpzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxyLmFwcGx5KHRoaXMscyl9ZWxzZSBpZihuKHIpKWZvcihzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPXIuc2xpY2UoKSxhPWQubGVuZ3RoLGw9MDtsPGE7bCsrKWRbbF0uYXBwbHkodGhpcyxzKTtyZXR1cm4hMH0sci5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXt2YXIgYTtpZighaShlKSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3JldHVybiB0aGlzLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9e30pLHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lciYmdGhpcy5lbWl0KCJuZXdMaXN0ZW5lciIsdCxpKGUubGlzdGVuZXIpP2UubGlzdGVuZXI6ZSksdGhpcy5fZXZlbnRzW3RdP24odGhpcy5fZXZlbnRzW3RdKT90aGlzLl9ldmVudHNbdF0ucHVzaChlKTp0aGlzLl9ldmVudHNbdF09W3RoaXMuX2V2ZW50c1t0XSxlXTp0aGlzLl9ldmVudHNbdF09ZSxuKHRoaXMuX2V2ZW50c1t0XSkmJiF0aGlzLl9ldmVudHNbdF0ud2FybmVkJiYoYT1vKHRoaXMuX21heExpc3RlbmVycyk/ci5kZWZhdWx0TWF4TGlzdGVuZXJzOnRoaXMuX21heExpc3RlbmVycykmJmE+MCYmdGhpcy5fZXZlbnRzW3RdLmxlbmd0aD5hJiYodGhpcy5fZXZlbnRzW3RdLndhcm5lZD0hMCxjb25zb2xlLmVycm9yKCIobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LiIsdGhpcy5fZXZlbnRzW3RdLmxlbmd0aCksImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUudHJhY2UmJmNvbnNvbGUudHJhY2UoKSksdGhpc30sci5wcm90b3R5cGUub249ci5wcm90b3R5cGUuYWRkTGlzdGVuZXIsci5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUxpc3RlbmVyKHQsciksYXx8KGE9ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfWlmKCFpKGUpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7dmFyIGE9ITE7cmV0dXJuIHIubGlzdGVuZXI9ZSx0aGlzLm9uKHQsciksdGhpc30sci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXt2YXIgcixhLG8scztpZighaShlKSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO2lmKCF0aGlzLl9ldmVudHN8fCF0aGlzLl9ldmVudHNbdF0pcmV0dXJuIHRoaXM7aWYocj10aGlzLl9ldmVudHNbdF0sbz1yLmxlbmd0aCxhPS0xLHI9PT1lfHxpKHIubGlzdGVuZXIpJiZyLmxpc3RlbmVyPT09ZSlkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxlKTtlbHNlIGlmKG4ocikpe2ZvcihzPW87cy0tID4wOylpZihyW3NdPT09ZXx8cltzXS5saXN0ZW5lciYmcltzXS5saXN0ZW5lcj09PWUpe2E9czticmVha31pZihhPDApcmV0dXJuIHRoaXM7MT09PXIubGVuZ3RoPyhyLmxlbmd0aD0wLGRlbGV0ZSB0aGlzLl9ldmVudHNbdF0pOnIuc3BsaWNlKGEsMSksdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGUpfXJldHVybiB0aGlzfSxyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7dmFyIGUscjtpZighdGhpcy5fZXZlbnRzKXJldHVybiB0aGlzO2lmKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuX2V2ZW50cz17fTp0aGlzLl9ldmVudHNbdF0mJmRlbGV0ZSB0aGlzLl9ldmVudHNbdF0sdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKGUgaW4gdGhpcy5fZXZlbnRzKSJyZW1vdmVMaXN0ZW5lciIhPT1lJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhlKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInJlbW92ZUxpc3RlbmVyIiksdGhpcy5fZXZlbnRzPXt9LHRoaXN9aWYocj10aGlzLl9ldmVudHNbdF0saShyKSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQscik7ZWxzZSBpZihyKWZvcig7ci5sZW5ndGg7KXRoaXMucmVtb3ZlTGlzdGVuZXIodCxyW3IubGVuZ3RoLTFdKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50c1t0XSx0aGlzfSxyLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW3RdP2kodGhpcy5fZXZlbnRzW3RdKT9bdGhpcy5fZXZlbnRzW3RdXTp0aGlzLl9ldmVudHNbdF0uc2xpY2UoKTpbXX0sci5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0KXtpZih0aGlzLl9ldmVudHMpe3ZhciBlPXRoaXMuX2V2ZW50c1t0XTtpZihpKGUpKXJldHVybiAxO2lmKGUpcmV0dXJuIGUubGVuZ3RofXJldHVybiAwfSxyLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5saXN0ZW5lckNvdW50KGUpfX0sZnVuY3Rpb24odCxlLHIpeyFmdW5jdGlvbihlKXt2YXIgcj0vXigoPzpbXlwvOz8jXSs6KT8pKFwvXC9bXlwvXDs/I10qKT8oLio/KT8/KDsuKj8pPyhcPy4qPyk/KCMuKj8pPyQvLGk9L14oW15cLzs/I10qKSguKikkLyxhPS8oPzpcL3xeKVwuKD89XC8pL2csbj0vKD86XC98XilcLlwuXC8oPyFcLlwuXC8pLio/KD89XC8pL2csbz17YnVpbGRBYnNvbHV0ZVVSTDpmdW5jdGlvbih0LGUscil7aWYocj1yfHx7fSx0PXQudHJpbSgpLCEoZT1lLnRyaW0oKSkpe2lmKCFyLmFsd2F5c05vcm1hbGl6ZSlyZXR1cm4gdDt2YXIgYT10aGlzLnBhcnNlVVJMKHQpO2lmKCFzKXRocm93IG5ldyBFcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIGJhc2UgVVJMLiIpO3JldHVybiBhLnBhdGg9by5ub3JtYWxpemVQYXRoKGEucGF0aCksby5idWlsZFVSTEZyb21QYXJ0cyhhKX12YXIgbj10aGlzLnBhcnNlVVJMKGUpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIHJlbGF0aXZlIFVSTC4iKTtpZihuLnNjaGVtZSlyZXR1cm4gci5hbHdheXNOb3JtYWxpemU/KG4ucGF0aD1vLm5vcm1hbGl6ZVBhdGgobi5wYXRoKSxvLmJ1aWxkVVJMRnJvbVBhcnRzKG4pKTplO3ZhciBzPXRoaXMucGFyc2VVUkwodCk7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgYmFzZSBVUkwuIik7aWYoIXMubmV0TG9jJiZzLnBhdGgmJiIvIiE9PXMucGF0aFswXSl7dmFyIGw9aS5leGVjKHMucGF0aCk7cy5uZXRMb2M9bFsxXSxzLnBhdGg9bFsyXX1zLm5ldExvYyYmIXMucGF0aCYmKHMucGF0aD0iLyIpO3ZhciBkPXtzY2hlbWU6cy5zY2hlbWUsbmV0TG9jOm4ubmV0TG9jLHBhdGg6bnVsbCxwYXJhbXM6bi5wYXJhbXMscXVlcnk6bi5xdWVyeSxmcmFnbWVudDpuLmZyYWdtZW50fTtpZighbi5uZXRMb2MmJihkLm5ldExvYz1zLm5ldExvYywiLyIhPT1uLnBhdGhbMF0pKWlmKG4ucGF0aCl7dmFyIHU9cy5wYXRoLGg9dS5zdWJzdHJpbmcoMCx1Lmxhc3RJbmRleE9mKCIvIikrMSkrbi5wYXRoO2QucGF0aD1vLm5vcm1hbGl6ZVBhdGgoaCl9ZWxzZSBkLnBhdGg9cy5wYXRoLG4ucGFyYW1zfHwoZC5wYXJhbXM9cy5wYXJhbXMsbi5xdWVyeXx8KGQucXVlcnk9cy5xdWVyeSkpO3JldHVybiBudWxsPT09ZC5wYXRoJiYoZC5wYXRoPXIuYWx3YXlzTm9ybWFsaXplP28ubm9ybWFsaXplUGF0aChuLnBhdGgpOm4ucGF0aCksby5idWlsZFVSTEZyb21QYXJ0cyhkKX0scGFyc2VVUkw6ZnVuY3Rpb24odCl7dmFyIGU9ci5leGVjKHQpO3JldHVybiBlP3tzY2hlbWU6ZVsxXXx8IiIsbmV0TG9jOmVbMl18fCIiLHBhdGg6ZVszXXx8IiIscGFyYW1zOmVbNF18fCIiLHF1ZXJ5OmVbNV18fCIiLGZyYWdtZW50OmVbNl18fCIifTpudWxsfSxub3JtYWxpemVQYXRoOmZ1bmN0aW9uKHQpe2Zvcih0PXQuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKS5yZXBsYWNlKGEsIiIpO3QubGVuZ3RoIT09KHQ9dC5yZXBsYWNlKG4sIiIpKS5sZW5ndGg7KTtyZXR1cm4gdC5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpfSxidWlsZFVSTEZyb21QYXJ0czpmdW5jdGlvbih0KXtyZXR1cm4gdC5zY2hlbWUrdC5uZXRMb2MrdC5wYXRoK3QucGFyYW1zK3QucXVlcnkrdC5mcmFnbWVudH19O3QuZXhwb3J0cz1vfSgpfSxmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBhKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBzKHQsZSxyLGkpe3ZhciBhLG4sbyxzLGwsZD1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksdT1pLGg9Wzk2ZTMsODgyMDAsNjRlMyw0OGUzLDQ0MTAwLDMyZTMsMjRlMywyMjA1MCwxNmUzLDEyZTMsMTEwMjUsOGUzLDczNTBdO3JldHVybiBhPTErKCgxOTImZVtyKzJdKT4+PjYpLChuPSg2MCZlW3IrMl0pPj4+Mik+aC5sZW5ndGgtMT92b2lkIHQudHJpZ2dlcihFdmVudC5FUlJPUix7dHlwZTpPLmIuTUVESUFfRVJST1IsZGV0YWlsczpPLmEuRlJBR19QQVJTSU5HX0VSUk9SLGZhdGFsOiEwLHJlYXNvbjoiaW52YWxpZCBBRFRTIHNhbXBsaW5nIGluZGV4OiIrbn0pOihzPSgxJmVbcisyXSk8PDIsc3w9KDE5MiZlW3IrM10pPj4+NixNLmIubG9nKCJtYW5pZmVzdCBjb2RlYzoiK2krIixBRFRTIGRhdGE6dHlwZToiK2ErIixzYW1wbGVpbmdJbmRleDoiK24rIlsiK2hbbl0rIkh6XSxjaGFubmVsQ29uZmlnOiIrcyksL2ZpcmVmb3gvaS50ZXN0KGQpP24+PTY/KGE9NSxsPW5ldyBBcnJheSg0KSxvPW4tMyk6KGE9MixsPW5ldyBBcnJheSgyKSxvPW4pOi0xIT09ZC5pbmRleE9mKCJhbmRyb2lkIik/KGE9MixsPW5ldyBBcnJheSgyKSxvPW4pOihhPTUsbD1uZXcgQXJyYXkoNCksaSYmKC0xIT09aS5pbmRleE9mKCJtcDRhLjQwLjI5Iil8fC0xIT09aS5pbmRleE9mKCJtcDRhLjQwLjUiKSl8fCFpJiZuPj02P289bi0zOigoaSYmLTEhPT1pLmluZGV4T2YoIm1wNGEuNDAuMiIpJiYobj49NiYmMT09PXN8fC92aXZhbGRpL2kudGVzdChkKSl8fCFpJiYxPT09cykmJihhPTIsbD1uZXcgQXJyYXkoMikpLG89bikpLGxbMF09YTw8MyxsWzBdfD0oMTQmbik+PjEsbFsxXXw9KDEmbik8PDcsbFsxXXw9czw8Myw1PT09YSYmKGxbMV18PSgxNCZvKT4+MSxsWzJdPSgxJm8pPDw3LGxbMl18PTgsbFszXT0wKSx7Y29uZmlnOmwsc2FtcGxlcmF0ZTpoW25dLGNoYW5uZWxDb3VudDpzLGNvZGVjOiJtcDRhLjQwLiIrYSxtYW5pZmVzdENvZGVjOnV9KX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIDI1NT09PXRbZV0mJjI0MD09KDI0NiZ0W2UrMV0pfWZ1bmN0aW9uIGQodCxlKXtyZXR1cm4gMSZ0W2UrMV0/Nzo5fWZ1bmN0aW9uIHUodCxlKXtyZXR1cm4oMyZ0W2UrM10pPDwxMXx0W2UrNF08PDN8KDIyNCZ0W2UrNV0pPj4+NX1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuISEoZSsxPHQubGVuZ3RoJiZsKHQsZSkpfWZ1bmN0aW9uIGYodCxlKXtpZihlKzE8dC5sZW5ndGgmJmwodCxlKSl7dmFyIHI9ZCh0LGUpLGk9cjtlKzU8dC5sZW5ndGgmJihpPXUodCxlKSk7dmFyIGE9ZStpO2lmKGE9PT10Lmxlbmd0aHx8YSsxPHQubGVuZ3RoJiZsKHQsYSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gYyh0LGUscixpLGEpe2lmKCF0LnNhbXBsZXJhdGUpe3ZhciBuPXMoZSxyLGksYSk7dC5jb25maWc9bi5jb25maWcsdC5zYW1wbGVyYXRlPW4uc2FtcGxlcmF0ZSx0LmNoYW5uZWxDb3VudD1uLmNoYW5uZWxDb3VudCx0LmNvZGVjPW4uY29kZWMsdC5tYW5pZmVzdENvZGVjPW4ubWFuaWZlc3RDb2RlYyxNLmIubG9nKCJwYXJzZWQgY29kZWM6Iit0LmNvZGVjKyIscmF0ZToiK24uc2FtcGxlcmF0ZSsiLG5iIGNoYW5uZWw6IituLmNoYW5uZWxDb3VudCl9fWZ1bmN0aW9uIHAodCl7cmV0dXJuIDkyMTZlNC90fWZ1bmN0aW9uIHYodCxlLHIsaSxhKXt2YXIgbixvLHMsbD10Lmxlbmd0aDtpZihuPWQodCxlKSxvPXUodCxlKSwoby09bik+MCYmZStuK288PWwpcmV0dXJuIHM9citpKmEse2hlYWRlckxlbmd0aDpuLGZyYW1lTGVuZ3RoOm8sc3RhbXA6c319ZnVuY3Rpb24gZyh0LGUscixpLGEpe3ZhciBuPXAodC5zYW1wbGVyYXRlKSxvPXYoZSxyLGksYSxuKTtpZihvKXt2YXIgcz1vLnN0YW1wLGw9by5oZWFkZXJMZW5ndGgsZD1vLmZyYW1lTGVuZ3RoLHU9e3VuaXQ6ZS5zdWJhcnJheShyK2wscitsK2QpLHB0czpzLGR0czpzfTtyZXR1cm4gdC5zYW1wbGVzLnB1c2godSksdC5sZW4rPWQse3NhbXBsZTp1LGxlbmd0aDpkK2x9fX1mdW5jdGlvbiBtKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24geSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGIodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBFKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gUih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEEodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBUKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gUyh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF8odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBMKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gdyh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXZhciBEPXIoMSksTz1yKDIpLHg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUscil7aSh0aGlzLHQpLHRoaXMuc3VidGxlPWUsdGhpcy5hZXNJVj1yfXJldHVybiB0LnByb3RvdHlwZS5kZWNyeXB0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc3VidGxlLmRlY3J5cHQoe25hbWU6IkFFUy1DQkMiLGl2OnRoaXMuYWVzSVZ9LGUsdCl9LHR9KCksST14LGs9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUscil7YSh0aGlzLHQpLHRoaXMuc3VidGxlPWUsdGhpcy5rZXk9cn1yZXR1cm4gdC5wcm90b3R5cGUuZXhwYW5kS2V5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3VidGxlLmltcG9ydEtleSgicmF3Iix0aGlzLmtleSx7bmFtZToiQUVTLUNCQyJ9LCExLFsiZW5jcnlwdCIsImRlY3J5cHQiXSl9LHR9KCksUD1rLEM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7bih0aGlzLHQpLHRoaXMucmNvbj1bMCwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NF0sdGhpcy5zdWJNaXg9W25ldyBVaW50MzJBcnJheSgyNTYpLG5ldyBVaW50MzJBcnJheSgyNTYpLG5ldyBVaW50MzJBcnJheSgyNTYpLG5ldyBVaW50MzJBcnJheSgyNTYpXSx0aGlzLmludlN1Yk1peD1bbmV3IFVpbnQzMkFycmF5KDI1NiksbmV3IFVpbnQzMkFycmF5KDI1NiksbmV3IFVpbnQzMkFycmF5KDI1NiksbmV3IFVpbnQzMkFycmF5KDI1NildLHRoaXMuc0JveD1uZXcgVWludDMyQXJyYXkoMjU2KSx0aGlzLmludlNCb3g9bmV3IFVpbnQzMkFycmF5KDI1NiksdGhpcy5rZXk9bmV3IFVpbnQzMkFycmF5KDApLHRoaXMuaW5pdFRhYmxlKCl9cmV0dXJuIHQucHJvdG90eXBlLnVpbnQ4QXJyYXlUb1VpbnQzMkFycmF5Xz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IERhdGFWaWV3KHQpLHI9bmV3IFVpbnQzMkFycmF5KDQpLGk9MDtpPDQ7aSsrKXJbaV09ZS5nZXRVaW50MzIoNCppKTtyZXR1cm4gcn0sdC5wcm90b3R5cGUuaW5pdFRhYmxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zQm94LGU9dGhpcy5pbnZTQm94LHI9dGhpcy5zdWJNaXgsaT1yWzBdLGE9clsxXSxuPXJbMl0sbz1yWzNdLHM9dGhpcy5pbnZTdWJNaXgsbD1zWzBdLGQ9c1sxXSx1PXNbMl0saD1zWzNdLGY9bmV3IFVpbnQzMkFycmF5KDI1NiksYz0wLHA9MCx2PTA7Zm9yKHY9MDt2PDI1Njt2KyspZlt2XT12PDEyOD92PDwxOnY8PDFeMjgzO2Zvcih2PTA7djwyNTY7disrKXt2YXIgZz1wXnA8PDFecDw8Ml5wPDwzXnA8PDQ7Zz1nPj4+OF4yNTUmZ145OSx0W2NdPWcsZVtnXT1jO3ZhciBtPWZbY10seT1mW21dLGI9Zlt5XSxFPTI1NypmW2ddXjE2ODQzMDA4Kmc7aVtjXT1FPDwyNHxFPj4+OCxhW2NdPUU8PDE2fEU+Pj4xNixuW2NdPUU8PDh8RT4+PjI0LG9bY109RSxFPTE2ODQzMDA5KmJeNjU1MzcqeV4yNTcqbV4xNjg0MzAwOCpjLGxbZ109RTw8MjR8RT4+PjgsZFtnXT1FPDwxNnxFPj4+MTYsdVtnXT1FPDw4fEU+Pj4yNCxoW2ddPUUsYz8oYz1tXmZbZltmW2JebV1dXSxwXj1mW2ZbcF1dKTpjPXA9MX19LHQucHJvdG90eXBlLmV4cGFuZEtleT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy51aW50OEFycmF5VG9VaW50MzJBcnJheV8odCkscj0hMCxpPTA7aTxlLmxlbmd0aCYmcjspcj1lW2ldPT09dGhpcy5rZXlbaV0saSsrO2lmKCFyKXt0aGlzLmtleT1lO3ZhciBhPXRoaXMua2V5U2l6ZT1lLmxlbmd0aDtpZig0IT09YSYmNiE9PWEmJjghPT1hKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhZXMga2V5IHNpemU9IithKTt2YXIgbj10aGlzLmtzUm93cz00KihhKzYrMSksbz12b2lkIDAscz12b2lkIDAsbD10aGlzLmtleVNjaGVkdWxlPW5ldyBVaW50MzJBcnJheShuKSxkPXRoaXMuaW52S2V5U2NoZWR1bGU9bmV3IFVpbnQzMkFycmF5KG4pLHU9dGhpcy5zQm94LGg9dGhpcy5yY29uLGY9dGhpcy5pbnZTdWJNaXgsYz1mWzBdLHA9ZlsxXSx2PWZbMl0sZz1mWzNdLG09dm9pZCAwLHk9dm9pZCAwO2ZvcihvPTA7bzxuO28rKylvPGE/bT1sW29dPWVbb106KHk9bSxvJWE9PTA/KHk9eTw8OHx5Pj4+MjQseT11W3k+Pj4yNF08PDI0fHVbeT4+PjE2JjI1NV08PDE2fHVbeT4+PjgmMjU1XTw8OHx1WzI1NSZ5XSx5Xj1oW28vYXwwXTw8MjQpOmE+NiYmbyVhPT00JiYoeT11W3k+Pj4yNF08PDI0fHVbeT4+PjE2JjI1NV08PDE2fHVbeT4+PjgmMjU1XTw8OHx1WzI1NSZ5XSksbFtvXT1tPShsW28tYV1eeSk+Pj4wKTtmb3Iocz0wO3M8bjtzKyspbz1uLXMseT0zJnM/bFtvXTpsW28tNF0sZFtzXT1zPDR8fG88PTQ/eTpjW3VbeT4+PjI0XV1ecFt1W3k+Pj4xNiYyNTVdXV52W3VbeT4+PjgmMjU1XV1eZ1t1WzI1NSZ5XV0sZFtzXT1kW3NdPj4+MH19LHQucHJvdG90eXBlLm5ldHdvcmtUb0hvc3RPcmRlclN3YXA9ZnVuY3Rpb24odCl7cmV0dXJuIHQ8PDI0fCg2NTI4MCZ0KTw8OHwoMTY3MTE2ODAmdCk+Pjh8dD4+PjI0fSx0LnByb3RvdHlwZS5kZWNyeXB0PWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIGksYSxuPXRoaXMua2V5U2l6ZSs2LG89dGhpcy5pbnZLZXlTY2hlZHVsZSxzPXRoaXMuaW52U0JveCxsPXRoaXMuaW52U3ViTWl4LGQ9bFswXSx1PWxbMV0saD1sWzJdLGY9bFszXSxjPXRoaXMudWludDhBcnJheVRvVWludDMyQXJyYXlfKHIpLHA9Y1swXSx2PWNbMV0sZz1jWzJdLG09Y1szXSx5PW5ldyBJbnQzMkFycmF5KHQpLGI9bmV3IEludDMyQXJyYXkoeS5sZW5ndGgpLEU9dm9pZCAwLFI9dm9pZCAwLEE9dm9pZCAwLFQ9dm9pZCAwLFM9dm9pZCAwLF89dm9pZCAwLEw9dm9pZCAwLHc9dm9pZCAwLEQ9dm9pZCAwLE89dm9pZCAwLHg9dm9pZCAwLEk9dm9pZCAwLGs9dGhpcy5uZXR3b3JrVG9Ib3N0T3JkZXJTd2FwO2U8eS5sZW5ndGg7KXtmb3IoRD1rKHlbZV0pLE89ayh5W2UrMV0pLHg9ayh5W2UrMl0pLEk9ayh5W2UrM10pLFM9RF5vWzBdLF89SV5vWzFdLEw9eF5vWzJdLHc9T15vWzNdLGk9NCxhPTE7YTxuO2ErKylFPWRbUz4+PjI0XV51W18+PjE2JjI1NV1eaFtMPj44JjI1NV1eZlsyNTUmd11eb1tpXSxSPWRbXz4+PjI0XV51W0w+PjE2JjI1NV1eaFt3Pj44JjI1NV1eZlsyNTUmU11eb1tpKzFdLEE9ZFtMPj4+MjRdXnVbdz4+MTYmMjU1XV5oW1M+PjgmMjU1XV5mWzI1NSZfXV5vW2krMl0sVD1kW3c+Pj4yNF1edVtTPj4xNiYyNTVdXmhbXz4+OCYyNTVdXmZbMjU1JkxdXm9baSszXSxTPUUsXz1SLEw9QSx3PVQsaSs9NDtFPXNbUz4+PjI0XTw8MjRec1tfPj4xNiYyNTVdPDwxNl5zW0w+PjgmMjU1XTw8OF5zWzI1NSZ3XV5vW2ldLFI9c1tfPj4+MjRdPDwyNF5zW0w+PjE2JjI1NV08PDE2XnNbdz4+OCYyNTVdPDw4XnNbMjU1JlNdXm9baSsxXSxBPXNbTD4+PjI0XTw8MjRec1t3Pj4xNiYyNTVdPDwxNl5zW1M+PjgmMjU1XTw8OF5zWzI1NSZfXV5vW2krMl0sVD1zW3c+Pj4yNF08PDI0XnNbUz4+MTYmMjU1XTw8MTZec1tfPj44JjI1NV08PDhec1syNTUmTF1eb1tpKzNdLGkrPTMsYltlXT1rKEVecCksYltlKzFdPWsoVF52KSxiW2UrMl09ayhBXmcpLGJbZSszXT1rKFJebSkscD1ELHY9TyxnPXgsbT1JLGUrPTR9cmV0dXJuIGIuYnVmZmVyfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5rZXk9dm9pZCAwLHRoaXMua2V5U2l6ZT12b2lkIDAsdGhpcy5rc1Jvd3M9dm9pZCAwLHRoaXMuc0JveD12b2lkIDAsdGhpcy5pbnZTQm94PXZvaWQgMCx0aGlzLnN1Yk1peD12b2lkIDAsdGhpcy5pbnZTdWJNaXg9dm9pZCAwLHRoaXMua2V5U2NoZWR1bGU9dm9pZCAwLHRoaXMuaW52S2V5U2NoZWR1bGU9dm9pZCAwLHRoaXMucmNvbj12b2lkIDB9LHR9KCksRj1DLE09cigwKSxOPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIpe28odGhpcyx0KSx0aGlzLm9ic2VydmVyPWUsdGhpcy5jb25maWc9cix0aGlzLmxvZ0VuYWJsZWQ9ITA7dHJ5e3ZhciBpPWNyeXB0b3x8c2VsZi5jcnlwdG87dGhpcy5zdWJ0bGU9aS5zdWJ0bGV8fGkud2Via2l0U3VidGxlfWNhdGNoKHQpe310aGlzLmRpc2FibGVXZWJDcnlwdG89IXRoaXMuc3VidGxlfXJldHVybiB0LnByb3RvdHlwZS5pc1N5bmM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlV2ViQ3J5cHRvJiZ0aGlzLmNvbmZpZy5lbmFibGVTb2Z0d2FyZUFFU30sdC5wcm90b3R5cGUuZGVjcnlwdD1mdW5jdGlvbih0LGUscixpKXt2YXIgYT10aGlzO2lmKHRoaXMuZGlzYWJsZVdlYkNyeXB0byYmdGhpcy5jb25maWcuZW5hYmxlU29mdHdhcmVBRVMpe3RoaXMubG9nRW5hYmxlZCYmKE0uYi5sb2coIkpTIEFFUyBkZWNyeXB0IiksdGhpcy5sb2dFbmFibGVkPSExKTt2YXIgbj10aGlzLmRlY3J5cHRvcjtufHwodGhpcy5kZWNyeXB0b3I9bj1uZXcgRiksbi5leHBhbmRLZXkoZSksaShuLmRlY3J5cHQodCwwLHIpKX1lbHNle3RoaXMubG9nRW5hYmxlZCYmKE0uYi5sb2coIldlYkNyeXB0byBBRVMgZGVjcnlwdCIpLHRoaXMubG9nRW5hYmxlZD0hMSk7dmFyIG89dGhpcy5zdWJ0bGU7dGhpcy5rZXkhPT1lJiYodGhpcy5rZXk9ZSx0aGlzLmZhc3RBZXNLZXk9bmV3IFAobyxlKSksdGhpcy5mYXN0QWVzS2V5LmV4cGFuZEtleSgpLnRoZW4oZnVuY3Rpb24obil7bmV3IEkobyxyKS5kZWNyeXB0KHQsbikuY2F0Y2goZnVuY3Rpb24obil7YS5vbldlYkNyeXB0b0Vycm9yKG4sdCxlLHIsaSl9KS50aGVuKGZ1bmN0aW9uKHQpe2kodCl9KX0pLmNhdGNoKGZ1bmN0aW9uKG4pe2Eub25XZWJDcnlwdG9FcnJvcihuLHQsZSxyLGkpfSl9fSx0LnByb3RvdHlwZS5vbldlYkNyeXB0b0Vycm9yPWZ1bmN0aW9uKHQsZSxyLGksYSl7dGhpcy5jb25maWcuZW5hYmxlU29mdHdhcmVBRVM/KE0uYi5sb2coIldlYkNyeXB0byBFcnJvciwgZGlzYWJsZSBXZWJDcnlwdG8gQVBJIiksdGhpcy5kaXNhYmxlV2ViQ3J5cHRvPSEwLHRoaXMubG9nRW5hYmxlZD0hMCx0aGlzLmRlY3J5cHQoZSxyLGksYSkpOihNLmIuZXJyb3IoImRlY3J5cHRpbmcgZXJyb3IgOiAiK3QubWVzc2FnZSksdGhpcy5vYnNlcnZlci50cmlnZ2VyKEV2ZW50LkVSUk9SLHt0eXBlOk8uYi5NRURJQV9FUlJPUixkZXRhaWxzOk8uYS5GUkFHX0RFQ1JZUFRfRVJST1IsZmF0YWw6ITAscmVhc29uOnQubWVzc2FnZX0pKX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZGVjcnlwdG9yO3QmJih0LmRlc3Ryb3koKSx0aGlzLmRlY3J5cHRvcj12b2lkIDApfSx0fSgpLFU9TixCPXIoNCksRz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxyLGkpe20odGhpcyx0KSx0aGlzLm9ic2VydmVyPWUsdGhpcy5jb25maWc9aSx0aGlzLnJlbXV4ZXI9cn1yZXR1cm4gdC5wcm90b3R5cGUucmVzZXRJbml0U2VnbWVudD1mdW5jdGlvbih0LGUscixpKXt0aGlzLl9hdWRpb1RyYWNrPXtjb250YWluZXI6ImF1ZGlvL2FkdHMiLHR5cGU6ImF1ZGlvIixpZDowLHNlcXVlbmNlTnVtYmVyOjAsaXNBQUM6ITAsc2FtcGxlczpbXSxsZW46MCxtYW5pZmVzdENvZGVjOmUsZHVyYXRpb246aSxpbnB1dFRpbWVTY2FsZTo5ZTR9fSx0LnByb3RvdHlwZS5yZXNldFRpbWVTdGFtcD1mdW5jdGlvbigpe30sdC5wcm9iZT1mdW5jdGlvbih0KXt2YXIgZSxyLGk9Qi5hLmdldElEM0RhdGEodCwwKTtpZihpJiZ2b2lkIDAhPT1CLmEuZ2V0VGltZVN0YW1wKGkpKWZvcihlPWkubGVuZ3RoLHI9TWF0aC5taW4odC5sZW5ndGgtMSxlKzEwMCk7ZTxyO2UrKylpZihmKHQsZSkpcmV0dXJuIE0uYi5sb2coIkFEVFMgc3luYyB3b3JkIGZvdW5kICEiKSwhMDtyZXR1cm4hMX0sdC5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHQsZSxyLGkpe2Zvcih2YXIgYT10aGlzLl9hdWRpb1RyYWNrLG49Qi5hLmdldElEM0RhdGEodCwwKSxvPTkwKkIuYS5nZXRUaW1lU3RhbXAobikscz0wLGw9byxkPXQubGVuZ3RoLHU9bi5sZW5ndGgsZj1be3B0czpsLGR0czpsLGRhdGE6bn1dO3U8ZC0xOylpZihoKHQsdSkmJnUrNTxkKXtjKGEsdGhpcy5vYnNlcnZlcix0LHUsYS5tYW5pZmVzdENvZGVjKTt2YXIgcD1nKGEsdCx1LG8scyk7aWYoIXApe00uYi5sb2coIlVuYWJsZSB0byBwYXJzZSBBQUMgZnJhbWUiKTticmVha311Kz1wLmxlbmd0aCxsPXAuc2FtcGxlLnB0cyxzKyt9ZWxzZSBCLmEuaXNIZWFkZXIodCx1KT8obj1CLmEuZ2V0SUQzRGF0YSh0LHUpLGYucHVzaCh7cHRzOmwsZHRzOmwsZGF0YTpufSksdSs9bi5sZW5ndGgpOnUrKzt0aGlzLnJlbXV4ZXIucmVtdXgoYSx7c2FtcGxlczpbXX0se3NhbXBsZXM6ZixpbnB1dFRpbWVTY2FsZTo5ZTR9LHtzYW1wbGVzOltdfSxlLHIsaSl9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LHR9KCksSD1HLGo9TWF0aC5wb3coMiwzMiktMSxWPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIpe3kodGhpcyx0KSx0aGlzLm9ic2VydmVyPWUsdGhpcy5yZW11eGVyPXJ9cmV0dXJuIHQucHJvdG90eXBlLnJlc2V0VGltZVN0YW1wPWZ1bmN0aW9uKHQpe3RoaXMuaW5pdFBUUz10fSx0LnByb3RvdHlwZS5yZXNldEluaXRTZWdtZW50PWZ1bmN0aW9uKGUscixpLGEpe2lmKGUmJmUuYnl0ZUxlbmd0aCl7dmFyIG49dGhpcy5pbml0RGF0YT10LnBhcnNlSW5pdFNlZ21lbnQoZSksbz17fTtuLmF1ZGlvJiZuLnZpZGVvP28uYXVkaW92aWRlbz17Y29udGFpbmVyOiJ2aWRlby9tcDQiLGNvZGVjOnIrIiwiK2ksaW5pdFNlZ21lbnQ6YT9lOm51bGx9OihuLmF1ZGlvJiYoby5hdWRpbz17Y29udGFpbmVyOiJhdWRpby9tcDQiLGNvZGVjOnIsaW5pdFNlZ21lbnQ6YT9lOm51bGx9KSxuLnZpZGVvJiYoby52aWRlbz17Y29udGFpbmVyOiJ2aWRlby9tcDQiLGNvZGVjOmksaW5pdFNlZ21lbnQ6YT9lOm51bGx9KSksdGhpcy5vYnNlcnZlci50cmlnZ2VyKEQuYS5GUkFHX1BBUlNJTkdfSU5JVF9TRUdNRU5ULHt0cmFja3M6b30pfWVsc2UgciYmKHRoaXMuYXVkaW9Db2RlYz1yKSxpJiYodGhpcy52aWRlb0NvZGVjPWkpfSx0LnByb2JlPWZ1bmN0aW9uKGUpe2lmKGUubGVuZ3RoPj04KXtyZXR1cm5bIm1vb2YiLCJmdHlwIiwic3R5cCJdLmluZGV4T2YodC5iaW4yc3RyKGUuc3ViYXJyYXkoNCw4KSkpPj0wfXJldHVybiExfSx0LmJpbjJzdHI9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCx0KX0sdC5yZWFkVWludDMyPWZ1bmN0aW9uKHQsZSl7dC5kYXRhJiYoZSs9dC5zdGFydCx0PXQuZGF0YSk7dmFyIHI9dFtlXTw8MjR8dFtlKzFdPDwxNnx0W2UrMl08PDh8dFtlKzNdO3JldHVybiByPDA/NDI5NDk2NzI5NityOnJ9LHQud3JpdGVVaW50MzI9ZnVuY3Rpb24odCxlLHIpe3QuZGF0YSYmKGUrPXQuc3RhcnQsdD10LmRhdGEpLHRbZV09cj4+MjQsdFtlKzFdPXI+PjE2JjI1NSx0W2UrMl09cj4+OCYyNTUsdFtlKzNdPTI1NSZyfSx0LmZpbmRCb3g9ZnVuY3Rpb24oZSxyKXt2YXIgaSxhLG4sbyxzLGwsZCx1PVtdO2lmKGUuZGF0YT8obD1lLnN0YXJ0LG89ZS5lbmQsZT1lLmRhdGEpOihsPTAsbz1lLmJ5dGVMZW5ndGgpLCFyLmxlbmd0aClyZXR1cm4gbnVsbDtmb3IoaT1sO2k8bzspYT10LnJlYWRVaW50MzIoZSxpKSxuPXQuYmluMnN0cihlLnN1YmFycmF5KGkrNCxpKzgpKSxkPWE+MT9pK2E6byxuPT09clswXSYmKDE9PT1yLmxlbmd0aD91LnB1c2goe2RhdGE6ZSxzdGFydDppKzgsZW5kOmR9KToocz10LmZpbmRCb3goe2RhdGE6ZSxzdGFydDppKzgsZW5kOmR9LHIuc2xpY2UoMSkpLHMubGVuZ3RoJiYodT11LmNvbmNhdChzKSkpKSxpPWQ7cmV0dXJuIHV9LHQucGFyc2VJbml0U2VnbWVudD1mdW5jdGlvbihlKXt2YXIgcj1bXTtyZXR1cm4gdC5maW5kQm94KGUsWyJtb292IiwidHJhayJdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBpPXQuZmluZEJveChlLFsidGtoZCJdKVswXTtpZihpKXt2YXIgYT1pLmRhdGFbaS5zdGFydF0sbj0wPT09YT8xMjoyMCxvPXQucmVhZFVpbnQzMihpLG4pLHM9dC5maW5kQm94KGUsWyJtZGlhIiwibWRoZCJdKVswXTtpZihzKXthPXMuZGF0YVtzLnN0YXJ0XSxuPTA9PT1hPzEyOjIwO3ZhciBsPXQucmVhZFVpbnQzMihzLG4pLGQ9dC5maW5kQm94KGUsWyJtZGlhIiwiaGRsciJdKVswXTtpZihkKXt2YXIgdT10LmJpbjJzdHIoZC5kYXRhLnN1YmFycmF5KGQuc3RhcnQrOCxkLnN0YXJ0KzEyKSksaD17c291bjoiYXVkaW8iLHZpZGU6InZpZGVvIn1bdV07aCYmKHJbb109e3RpbWVzY2FsZTpsLHR5cGU6aH0scltoXT17dGltZXNjYWxlOmwsaWQ6b30pfX19fSkscn0sdC5nZXRTdGFydERUUz1mdW5jdGlvbihlLHIpe3ZhciBpLGEsbjtyZXR1cm4gaT10LmZpbmRCb3gocixbIm1vb2YiLCJ0cmFmIl0pLGE9W10uY29uY2F0LmFwcGx5KFtdLGkubWFwKGZ1bmN0aW9uKHIpe3JldHVybiB0LmZpbmRCb3gocixbInRmaGQiXSkubWFwKGZ1bmN0aW9uKGkpe3ZhciBhLG47cmV0dXJuIGE9dC5yZWFkVWludDMyKGksNCksbj1lW2FdLnRpbWVzY2FsZXx8OWU0LHQuZmluZEJveChyLFsidGZkdCJdKS5tYXAoZnVuY3Rpb24oZSl7dmFyIHIsaTtyZXR1cm4gcj1lLmRhdGFbZS5zdGFydF0saT10LnJlYWRVaW50MzIoZSw0KSwxPT09ciYmKGkqPU1hdGgucG93KDIsMzIpLGkrPXQucmVhZFVpbnQzMihlLDgpKSxpfSlbMF0vbn0pfSkpLG49TWF0aC5taW4uYXBwbHkobnVsbCxhKSxpc0Zpbml0ZShuKT9uOjB9LHQub2Zmc2V0U3RhcnREVFM9ZnVuY3Rpb24oZSxyLGkpe3QuZmluZEJveChyLFsibW9vZiIsInRyYWYiXSkubWFwKGZ1bmN0aW9uKHIpe3JldHVybiB0LmZpbmRCb3gocixbInRmaGQiXSkubWFwKGZ1bmN0aW9uKGEpe3ZhciBuPXQucmVhZFVpbnQzMihhLDQpLG89ZVtuXS50aW1lc2NhbGV8fDllNDt0LmZpbmRCb3gocixbInRmZHQiXSkubWFwKGZ1bmN0aW9uKGUpe3ZhciByPWUuZGF0YVtlLnN0YXJ0XSxhPXQucmVhZFVpbnQzMihlLDQpO2lmKDA9PT1yKXQud3JpdGVVaW50MzIoZSw0LGEtaSpvKTtlbHNle2EqPU1hdGgucG93KDIsMzIpLGErPXQucmVhZFVpbnQzMihlLDgpLGEtPWkqbzt2YXIgbj1NYXRoLmZsb29yKGEvKGorMSkpLHM9TWF0aC5mbG9vcihhJShqKzEpKTt0LndyaXRlVWludDMyKGUsNCxuKSx0LndyaXRlVWludDMyKGUsOCxzKX19KX0pfSl9LHQucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihlLHIsaSxhKXt2YXIgbj10aGlzLmluaXREYXRhO258fCh0aGlzLnJlc2V0SW5pdFNlZ21lbnQoZSx0aGlzLmF1ZGlvQ29kZWMsdGhpcy52aWRlb0NvZGVjKSxuPXRoaXMuaW5pdERhdGEpO3ZhciBvPXZvaWQgMCxzPXRoaXMuaW5pdFBUUztpZih2b2lkIDA9PT1zKXt2YXIgbD10LmdldFN0YXJ0RFRTKG4sZSk7dGhpcy5pbml0UFRTPXM9bC1yLHRoaXMub2JzZXJ2ZXIudHJpZ2dlcihELmEuSU5JVF9QVFNfRk9VTkQse2luaXRQVFM6c30pfXQub2Zmc2V0U3RhcnREVFMobixlLHMpLG89dC5nZXRTdGFydERUUyhuLGUpLHRoaXMucmVtdXhlci5yZW11eChuLmF1ZGlvLG4udmlkZW8sbnVsbCxudWxsLG8saSxhLGUpfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fSx0fSgpLFc9VixLPXtCaXRyYXRlc01hcDpbMzIsNjQsOTYsMTI4LDE2MCwxOTIsMjI0LDI1NiwyODgsMzIwLDM1MiwzODQsNDE2LDQ0OCwzMiw0OCw1Niw2NCw4MCw5NiwxMTIsMTI4LDE2MCwxOTIsMjI0LDI1NiwzMjAsMzg0LDMyLDQwLDQ4LDU2LDY0LDgwLDk2LDExMiwxMjgsMTYwLDE5MiwyMjQsMjU2LDMyMCwzMiw0OCw1Niw2NCw4MCw5NiwxMTIsMTI4LDE0NCwxNjAsMTc2LDE5MiwyMjQsMjU2LDgsMTYsMjQsMzIsNDAsNDgsNTYsNjQsODAsOTYsMTEyLDEyOCwxNDQsMTYwXSxTYW1wbGluZ1JhdGVNYXA6WzQ0MTAwLDQ4ZTMsMzJlMywyMjA1MCwyNGUzLDE2ZTMsMTEwMjUsMTJlMyw4ZTNdLGFwcGVuZEZyYW1lOmZ1bmN0aW9uKHQsZSxyLGksYSl7aWYoIShyKzI0PmUubGVuZ3RoKSl7dmFyIG49dGhpcy5wYXJzZUhlYWRlcihlLHIpO2lmKG4mJnIrbi5mcmFtZUxlbmd0aDw9ZS5sZW5ndGgpe3ZhciBvPTEwMzY4ZTQvbi5zYW1wbGVSYXRlLHM9aSthKm8sbD17dW5pdDplLnN1YmFycmF5KHIscituLmZyYW1lTGVuZ3RoKSxwdHM6cyxkdHM6c307cmV0dXJuIHQuY29uZmlnPVtdLHQuY2hhbm5lbENvdW50PW4uY2hhbm5lbENvdW50LHQuc2FtcGxlcmF0ZT1uLnNhbXBsZVJhdGUsdC5zYW1wbGVzLnB1c2gobCksdC5sZW4rPW4uZnJhbWVMZW5ndGgse3NhbXBsZTpsLGxlbmd0aDpuLmZyYW1lTGVuZ3RofX19fSxwYXJzZUhlYWRlcjpmdW5jdGlvbih0LGUpe3ZhciByPXRbZSsxXT4+MyYzLGk9dFtlKzFdPj4xJjMsYT10W2UrMl0+PjQmMTUsbj10W2UrMl0+PjImMyxvPSEhKDImdFtlKzJdKTtpZigxIT09ciYmMCE9PWEmJjE1IT09YSYmMyE9PW4pe3ZhciBzPTM9PT1yPzMtaTozPT09aT8zOjQsbD0xZTMqSy5CaXRyYXRlc01hcFsxNCpzK2EtMV0sZD0zPT09cj8wOjI9PT1yPzE6Mix1PUsuU2FtcGxpbmdSYXRlTWFwWzMqZCtuXSxoPW8/MTowO3JldHVybntzYW1wbGVSYXRlOnUsY2hhbm5lbENvdW50OnRbZSszXT4+Nj09Mz8xOjIsZnJhbWVMZW5ndGg6Mz09PWk/KDM9PT1yPzEyOjYpKmwvdStoPDwyOigzPT09cj8xNDQ6NzIpKmwvdStofDB9fX0saXNIZWFkZXJQYXR0ZXJuOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIDI1NT09PXRbZV0mJjIyND09KDIyNCZ0W2UrMV0pJiYwIT0oNiZ0W2UrMV0pfSxpc0hlYWRlcjpmdW5jdGlvbih0LGUpe3JldHVybiEhKGUrMTx0Lmxlbmd0aCYmdGhpcy5pc0hlYWRlclBhdHRlcm4odCxlKSl9LHByb2JlOmZ1bmN0aW9uKHQsZSl7aWYoZSsxPHQubGVuZ3RoJiZ0aGlzLmlzSGVhZGVyUGF0dGVybih0LGUpKXt2YXIgcj10aGlzLnBhcnNlSGVhZGVyKHQsZSksaT00O3ImJnIuZnJhbWVMZW5ndGgmJihpPXIuZnJhbWVMZW5ndGgpO3ZhciBhPWUraTtpZihhPT09dC5sZW5ndGh8fGErMTx0Lmxlbmd0aCYmdGhpcy5pc0hlYWRlclBhdHRlcm4odCxhKSlyZXR1cm4hMH1yZXR1cm4hMX19LFk9Syx6PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtiKHRoaXMsdCksdGhpcy5kYXRhPWUsdGhpcy5ieXRlc0F2YWlsYWJsZT1lLmJ5dGVMZW5ndGgsdGhpcy53b3JkPTAsdGhpcy5iaXRzQXZhaWxhYmxlPTB9cmV0dXJuIHQucHJvdG90eXBlLmxvYWRXb3JkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhLGU9dGhpcy5ieXRlc0F2YWlsYWJsZSxyPXQuYnl0ZUxlbmd0aC1lLGk9bmV3IFVpbnQ4QXJyYXkoNCksYT1NYXRoLm1pbig0LGUpO2lmKDA9PT1hKXRocm93IG5ldyBFcnJvcigibm8gYnl0ZXMgYXZhaWxhYmxlIik7aS5zZXQodC5zdWJhcnJheShyLHIrYSkpLHRoaXMud29yZD1uZXcgRGF0YVZpZXcoaS5idWZmZXIpLmdldFVpbnQzMigwKSx0aGlzLmJpdHNBdmFpbGFibGU9OCphLHRoaXMuYnl0ZXNBdmFpbGFibGUtPWF9LHQucHJvdG90eXBlLnNraXBCaXRzPWZ1bmN0aW9uKHQpe3ZhciBlO3RoaXMuYml0c0F2YWlsYWJsZT50Pyh0aGlzLndvcmQ8PD10LHRoaXMuYml0c0F2YWlsYWJsZS09dCk6KHQtPXRoaXMuYml0c0F2YWlsYWJsZSxlPXQ+PjMsdC09ZT4+Myx0aGlzLmJ5dGVzQXZhaWxhYmxlLT1lLHRoaXMubG9hZFdvcmQoKSx0aGlzLndvcmQ8PD10LHRoaXMuYml0c0F2YWlsYWJsZS09dCl9LHQucHJvdG90eXBlLnJlYWRCaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgubWluKHRoaXMuYml0c0F2YWlsYWJsZSx0KSxyPXRoaXMud29yZD4+PjMyLWU7cmV0dXJuIHQ+MzImJk0uYi5lcnJvcigiQ2Fubm90IHJlYWQgbW9yZSB0aGFuIDMyIGJpdHMgYXQgYSB0aW1lIiksdGhpcy5iaXRzQXZhaWxhYmxlLT1lLHRoaXMuYml0c0F2YWlsYWJsZT4wP3RoaXMud29yZDw8PWU6dGhpcy5ieXRlc0F2YWlsYWJsZT4wJiZ0aGlzLmxvYWRXb3JkKCksZT10LWUsZT4wJiZ0aGlzLmJpdHNBdmFpbGFibGU/cjw8ZXx0aGlzLnJlYWRCaXRzKGUpOnJ9LHQucHJvdG90eXBlLnNraXBMWj1mdW5jdGlvbigpe3ZhciB0O2Zvcih0PTA7dDx0aGlzLmJpdHNBdmFpbGFibGU7Kyt0KWlmKDAhPSh0aGlzLndvcmQmMjE0NzQ4MzY0OD4+PnQpKXJldHVybiB0aGlzLndvcmQ8PD10LHRoaXMuYml0c0F2YWlsYWJsZS09dCx0O3JldHVybiB0aGlzLmxvYWRXb3JkKCksdCt0aGlzLnNraXBMWigpfSx0LnByb3RvdHlwZS5za2lwVUVHPWZ1bmN0aW9uKCl7dGhpcy5za2lwQml0cygxK3RoaXMuc2tpcExaKCkpfSx0LnByb3RvdHlwZS5za2lwRUc9ZnVuY3Rpb24oKXt0aGlzLnNraXBCaXRzKDErdGhpcy5za2lwTFooKSl9LHQucHJvdG90eXBlLnJlYWRVRUc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNraXBMWigpO3JldHVybiB0aGlzLnJlYWRCaXRzKHQrMSktMX0sdC5wcm90b3R5cGUucmVhZEVHPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVUVHKCk7cmV0dXJuIDEmdD8xK3Q+Pj4xOi0xKih0Pj4+MSl9LHQucHJvdG90eXBlLnJlYWRCb29sZWFuPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLnJlYWRCaXRzKDEpfSx0LnByb3RvdHlwZS5yZWFkVUJ5dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkQml0cyg4KX0sdC5wcm90b3R5cGUucmVhZFVTaG9ydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRCaXRzKDE2KX0sdC5wcm90b3R5cGUucmVhZFVJbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkQml0cygzMil9LHQucHJvdG90eXBlLnNraXBTY2FsaW5nTGlzdD1mdW5jdGlvbih0KXt2YXIgZSxyLGk9OCxhPTg7Zm9yKGU9MDtlPHQ7ZSsrKTAhPT1hJiYocj10aGlzLnJlYWRFRygpLGE9KGkrcisyNTYpJTI1NiksaT0wPT09YT9pOmF9LHQucHJvdG90eXBlLnJlYWRTUFM9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsaSxhLG4sbyxzPTAsbD0wLGQ9MCx1PTAsaD10aGlzLnJlYWRVQnl0ZS5iaW5kKHRoaXMpLGY9dGhpcy5yZWFkQml0cy5iaW5kKHRoaXMpLGM9dGhpcy5yZWFkVUVHLmJpbmQodGhpcykscD10aGlzLnJlYWRCb29sZWFuLmJpbmQodGhpcyksdj10aGlzLnNraXBCaXRzLmJpbmQodGhpcyksZz10aGlzLnNraXBFRy5iaW5kKHRoaXMpLG09dGhpcy5za2lwVUVHLmJpbmQodGhpcykseT10aGlzLnNraXBTY2FsaW5nTGlzdC5iaW5kKHRoaXMpO2lmKGgoKSx0PWgoKSxmKDUpLHYoMyksaCgpLG0oKSwxMDA9PT10fHwxMTA9PT10fHwxMjI9PT10fHwyNDQ9PT10fHw0ND09PXR8fDgzPT09dHx8ODY9PT10fHwxMTg9PT10fHwxMjg9PT10KXt2YXIgYj1jKCk7aWYoMz09PWImJnYoMSksbSgpLG0oKSx2KDEpLHAoKSlmb3Iobj0zIT09Yj84OjEyLG89MDtvPG47bysrKXAoKSYmeShvPDY/MTY6NjQpfW0oKTt2YXIgRT1jKCk7aWYoMD09PUUpYygpO2Vsc2UgaWYoMT09PUUpZm9yKHYoMSksZygpLGcoKSxlPWMoKSxvPTA7bzxlO28rKylnKCk7bSgpLHYoMSkscj1jKCksaT1jKCksYT1mKDEpLDA9PT1hJiZ2KDEpLHYoMSkscCgpJiYocz1jKCksbD1jKCksZD1jKCksdT1jKCkpO3ZhciBSPVsxLDFdO2lmKHAoKSYmcCgpKXtzd2l0Y2goaCgpKXtjYXNlIDE6Uj1bMSwxXTticmVhaztjYXNlIDI6Uj1bMTIsMTFdO2JyZWFrO2Nhc2UgMzpSPVsxMCwxMV07YnJlYWs7Y2FzZSA0OlI9WzE2LDExXTticmVhaztjYXNlIDU6Uj1bNDAsMzNdO2JyZWFrO2Nhc2UgNjpSPVsyNCwxMV07YnJlYWs7Y2FzZSA3OlI9WzIwLDExXTticmVhaztjYXNlIDg6Uj1bMzIsMTFdO2JyZWFrO2Nhc2UgOTpSPVs4MCwzM107YnJlYWs7Y2FzZSAxMDpSPVsxOCwxMV07YnJlYWs7Y2FzZSAxMTpSPVsxNSwxMV07YnJlYWs7Y2FzZSAxMjpSPVs2NCwzM107YnJlYWs7Y2FzZSAxMzpSPVsxNjAsOTldO2JyZWFrO2Nhc2UgMTQ6Uj1bNCwzXTticmVhaztjYXNlIDE1OlI9WzMsMl07YnJlYWs7Y2FzZSAxNjpSPVsyLDFdO2JyZWFrO2Nhc2UgMjU1OlI9W2goKTw8OHxoKCksaCgpPDw4fGgoKV19fXJldHVybnt3aWR0aDpNYXRoLmNlaWwoMTYqKHIrMSktMipzLTIqbCksaGVpZ2h0OigyLWEpKihpKzEpKjE2LShhPzI6NCkqKGQrdSkscGl4ZWxSYXRpbzpSfX0sdC5wcm90b3R5cGUucmVhZFNsaWNlVHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRVQnl0ZSgpLHRoaXMucmVhZFVFRygpLHRoaXMucmVhZFVFRygpfSx0fSgpLFg9eixxPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIsaSxhKXtFKHRoaXMsdCksdGhpcy5kZWNyeXB0ZGF0YT1pLHRoaXMuZGlzY2FyZEVQQj1hLHRoaXMuZGVjcnlwdGVyPW5ldyBVKGUscil9cmV0dXJuIHQucHJvdG90eXBlLmRlY3J5cHRCdWZmZXI9ZnVuY3Rpb24odCxlKXt0aGlzLmRlY3J5cHRlci5kZWNyeXB0KHQsdGhpcy5kZWNyeXB0ZGF0YS5rZXkuYnVmZmVyLHRoaXMuZGVjcnlwdGRhdGEuaXYuYnVmZmVyLGUpfSx0LnByb3RvdHlwZS5kZWNyeXB0QWFjU2FtcGxlPWZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBhPXRbZV0udW5pdCxuPWEuc3ViYXJyYXkoMTYsYS5sZW5ndGgtYS5sZW5ndGglMTYpLG89bi5idWZmZXIuc2xpY2Uobi5ieXRlT2Zmc2V0LG4uYnl0ZU9mZnNldCtuLmxlbmd0aCkscz10aGlzO3RoaXMuZGVjcnlwdEJ1ZmZlcihvLGZ1bmN0aW9uKG4pe249bmV3IFVpbnQ4QXJyYXkobiksYS5zZXQobiwxNiksaXx8cy5kZWNyeXB0QWFjU2FtcGxlcyh0LGUrMSxyKX0pfSx0LnByb3RvdHlwZS5kZWNyeXB0QWFjU2FtcGxlcz1mdW5jdGlvbih0LGUscil7Zm9yKDs7ZSsrKXtpZihlPj10Lmxlbmd0aClyZXR1cm4gdm9pZCByKCk7aWYoISh0W2VdLnVuaXQubGVuZ3RoPDMyKSl7dmFyIGk9dGhpcy5kZWNyeXB0ZXIuaXNTeW5jKCk7aWYodGhpcy5kZWNyeXB0QWFjU2FtcGxlKHQsZSxyLGkpLCFpKXJldHVybn19fSx0LnByb3RvdHlwZS5nZXRBdmNFbmNyeXB0ZWREYXRhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xNipNYXRoLmZsb29yKCh0Lmxlbmd0aC00OCkvMTYwKSsxNixyPW5ldyBJbnQ4QXJyYXkoZSksaT0wLGE9MzI7YTw9dC5sZW5ndGgtMTY7YSs9MTYwLGkrPTE2KXIuc2V0KHQuc3ViYXJyYXkoYSxhKzE2KSxpKTtyZXR1cm4gcn0sdC5wcm90b3R5cGUuZ2V0QXZjRGVjcnlwdGVkVW5pdD1mdW5jdGlvbih0LGUpe2U9bmV3IFVpbnQ4QXJyYXkoZSk7Zm9yKHZhciByPTAsaT0zMjtpPD10Lmxlbmd0aC0xNjtpKz0xNjAscis9MTYpdC5zZXQoZS5zdWJhcnJheShyLHIrMTYpLGkpO3JldHVybiB0fSx0LnByb3RvdHlwZS5kZWNyeXB0QXZjU2FtcGxlPWZ1bmN0aW9uKHQsZSxyLGksYSxuKXt2YXIgbz10aGlzLmRpc2NhcmRFUEIoYS5kYXRhKSxzPXRoaXMuZ2V0QXZjRW5jcnlwdGVkRGF0YShvKSxsPXRoaXM7dGhpcy5kZWNyeXB0QnVmZmVyKHMuYnVmZmVyLGZ1bmN0aW9uKHMpe2EuZGF0YT1sLmdldEF2Y0RlY3J5cHRlZFVuaXQobyxzKSxufHxsLmRlY3J5cHRBdmNTYW1wbGVzKHQsZSxyKzEsaSl9KX0sdC5wcm90b3R5cGUuZGVjcnlwdEF2Y1NhbXBsZXM9ZnVuY3Rpb24odCxlLHIsaSl7Zm9yKDs7ZSsrLHI9MCl7aWYoZT49dC5sZW5ndGgpcmV0dXJuIHZvaWQgaSgpO2Zvcih2YXIgYT10W2VdLnVuaXRzOyEocj49YS5sZW5ndGgpO3IrKyl7dmFyIG49YVtyXTtpZighKG4ubGVuZ3RoPD00OHx8MSE9PW4udHlwZSYmNSE9PW4udHlwZSkpe3ZhciBvPXRoaXMuZGVjcnlwdGVyLmlzU3luYygpO2lmKHRoaXMuZGVjcnlwdEF2Y1NhbXBsZSh0LGUscixpLG4sbyksIW8pcmV0dXJufX19fSx0fSgpLFE9cSxKPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIsaSxhKXtSKHRoaXMsdCksdGhpcy5vYnNlcnZlcj1lLHRoaXMuY29uZmlnPWksdGhpcy50eXBlU3VwcG9ydGVkPWEsdGhpcy5yZW11eGVyPXIsdGhpcy5zYW1wbGVBZXM9bnVsbH1yZXR1cm4gdC5wcm90b3R5cGUuc2V0RGVjcnlwdERhdGE9ZnVuY3Rpb24odCl7bnVsbCE9dCYmbnVsbCE9dC5rZXkmJiJTQU1QTEUtQUVTIj09PXQubWV0aG9kP3RoaXMuc2FtcGxlQWVzPW5ldyBRKHRoaXMub2JzZXJ2ZXIsdGhpcy5jb25maWcsdCx0aGlzLmRpc2NhcmRFUEIpOnRoaXMuc2FtcGxlQWVzPW51bGx9LHQucHJvYmU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoPj01NjQmJjcxPT09dFswXSYmNzE9PT10WzE4OF0mJjcxPT09dFszNzZdfSx0LnByb3RvdHlwZS5yZXNldEluaXRTZWdtZW50PWZ1bmN0aW9uKHQsZSxyLGkpe3RoaXMucG10UGFyc2VkPSExLHRoaXMuX3BtdElkPS0xLHRoaXMuX2F2Y1RyYWNrPXtjb250YWluZXI6InZpZGVvL21wMnQiLHR5cGU6InZpZGVvIixpZDotMSxpbnB1dFRpbWVTY2FsZTo5ZTQsc2VxdWVuY2VOdW1iZXI6MCxzYW1wbGVzOltdLGxlbjowLGRyb3BwZWQ6MH0sdGhpcy5fYXVkaW9UcmFjaz17Y29udGFpbmVyOiJ2aWRlby9tcDJ0Iix0eXBlOiJhdWRpbyIsaWQ6LTEsaW5wdXRUaW1lU2NhbGU6OWU0LGR1cmF0aW9uOmksc2VxdWVuY2VOdW1iZXI6MCxzYW1wbGVzOltdLGxlbjowLGlzQUFDOiEwfSx0aGlzLl9pZDNUcmFjaz17dHlwZToiaWQzIixpZDotMSxpbnB1dFRpbWVTY2FsZTo5ZTQsc2VxdWVuY2VOdW1iZXI6MCxzYW1wbGVzOltdLGxlbjowfSx0aGlzLl90eHRUcmFjaz17dHlwZToidGV4dCIsaWQ6LTEsaW5wdXRUaW1lU2NhbGU6OWU0LHNlcXVlbmNlTnVtYmVyOjAsc2FtcGxlczpbXSxsZW46MH0sdGhpcy5hYWNPdmVyRmxvdz1udWxsLHRoaXMuYWFjTGFzdFBUUz1udWxsLHRoaXMuYXZjU2FtcGxlPW51bGwsdGhpcy5hdWRpb0NvZGVjPWUsdGhpcy52aWRlb0NvZGVjPXIsdGhpcy5fZHVyYXRpb249aX0sdC5wcm90b3R5cGUucmVzZXRUaW1lU3RhbXA9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbih0LGUscixpKXt2YXIgYSxuLG8scyxsLGQ9dC5sZW5ndGgsdT0hMTt0aGlzLmNvbnRpZ3VvdXM9cjt2YXIgaD10aGlzLnBtdFBhcnNlZCxmPXRoaXMuX2F2Y1RyYWNrLGM9dGhpcy5fYXVkaW9UcmFjayxwPXRoaXMuX2lkM1RyYWNrLHY9Zi5pZCxnPWMuaWQsbT1wLmlkLHk9dGhpcy5fcG10SWQsYj1mLnBlc0RhdGEsRT1jLnBlc0RhdGEsUj1wLnBlc0RhdGEsQT10aGlzLl9wYXJzZVBBVCxUPXRoaXMuX3BhcnNlUE1ULFM9dGhpcy5fcGFyc2VQRVMsXz10aGlzLl9wYXJzZUFWQ1BFUy5iaW5kKHRoaXMpLEw9dGhpcy5fcGFyc2VBQUNQRVMuYmluZCh0aGlzKSx3PXRoaXMuX3BhcnNlTVBFR1BFUy5iaW5kKHRoaXMpLHg9dGhpcy5fcGFyc2VJRDNQRVMuYmluZCh0aGlzKTtmb3IoZC09ZCUxODgsYT0wO2E8ZDthKz0xODgpaWYoNzE9PT10W2FdKXtpZihuPSEhKDY0JnRbYSsxXSksbz0oKDMxJnRbYSsxXSk8PDgpK3RbYSsyXSwoNDgmdFthKzNdKT4+ND4xKXtpZigocz1hKzUrdFthKzRdKT09PWErMTg4KWNvbnRpbnVlfWVsc2Ugcz1hKzQ7c3dpdGNoKG8pe2Nhc2UgdjpuJiYoYiYmKGw9UyhiKSkmJl8obCwhMSksYj17ZGF0YTpbXSxzaXplOjB9KSxiJiYoYi5kYXRhLnB1c2godC5zdWJhcnJheShzLGErMTg4KSksYi5zaXplKz1hKzE4OC1zKTticmVhaztjYXNlIGc6biYmKEUmJihsPVMoRSkpJiYoYy5pc0FBQz9MKGwpOncobCkpLEU9e2RhdGE6W10sc2l6ZTowfSksRSYmKEUuZGF0YS5wdXNoKHQuc3ViYXJyYXkocyxhKzE4OCkpLEUuc2l6ZSs9YSsxODgtcyk7YnJlYWs7Y2FzZSBtOm4mJihSJiYobD1TKFIpKSYmeChsKSxSPXtkYXRhOltdLHNpemU6MH0pLFImJihSLmRhdGEucHVzaCh0LnN1YmFycmF5KHMsYSsxODgpKSxSLnNpemUrPWErMTg4LXMpO2JyZWFrO2Nhc2UgMDpuJiYocys9dFtzXSsxKSx5PXRoaXMuX3BtdElkPUEodCxzKTticmVhaztjYXNlIHk6biYmKHMrPXRbc10rMSk7dmFyIEk9VCh0LHMsITA9PT10aGlzLnR5cGVTdXBwb3J0ZWQubXBlZ3x8ITA9PT10aGlzLnR5cGVTdXBwb3J0ZWQubXAzLG51bGwhPXRoaXMuc2FtcGxlQWVzKTt2PUkuYXZjLHY+MCYmKGYuaWQ9diksZz1JLmF1ZGlvLGc+MCYmKGMuaWQ9ZyxjLmlzQUFDPUkuaXNBQUMpLG09SS5pZDMsbT4wJiYocC5pZD1tKSx1JiYhaCYmKE0uYi5sb2coInJlcGFyc2UgZnJvbSBiZWdpbm5pbmciKSx1PSExLGE9LTE4OCksaD10aGlzLnBtdFBhcnNlZD0hMDticmVhaztjYXNlIDE3OmNhc2UgODE5MTpicmVhaztkZWZhdWx0OnU9ITB9fWVsc2UgdGhpcy5vYnNlcnZlci50cmlnZ2VyKEQuYS5FUlJPUix7dHlwZTpPLmIuTUVESUFfRVJST1IsZGV0YWlsczpPLmEuRlJBR19QQVJTSU5HX0VSUk9SLGZhdGFsOiExLHJlYXNvbjoiVFMgcGFja2V0IGRpZCBub3Qgc3RhcnQgd2l0aCAweDQ3In0pO2ImJihsPVMoYikpPyhfKGwsITApLGYucGVzRGF0YT1udWxsKTpmLnBlc0RhdGE9YixFJiYobD1TKEUpKT8oYy5pc0FBQz9MKGwpOncobCksYy5wZXNEYXRhPW51bGwpOihFJiZFLnNpemUmJk0uYi5sb2coImxhc3QgQUFDIFBFUyBwYWNrZXQgdHJ1bmNhdGVkLG1pZ2h0IG92ZXJsYXAgYmV0d2VlbiBmcmFnbWVudHMiKSxjLnBlc0RhdGE9RSksUiYmKGw9UyhSKSk/KHgobCkscC5wZXNEYXRhPW51bGwpOnAucGVzRGF0YT1SLG51bGw9PXRoaXMuc2FtcGxlQWVzP3RoaXMucmVtdXhlci5yZW11eChjLGYscCx0aGlzLl90eHRUcmFjayxlLHIsaSk6dGhpcy5kZWNyeXB0QW5kUmVtdXgoYyxmLHAsdGhpcy5fdHh0VHJhY2ssZSxyLGkpfSx0LnByb3RvdHlwZS5kZWNyeXB0QW5kUmVtdXg9ZnVuY3Rpb24odCxlLHIsaSxhLG4sbyl7aWYodC5zYW1wbGVzJiZ0LmlzQUFDKXt2YXIgcz10aGlzO3RoaXMuc2FtcGxlQWVzLmRlY3J5cHRBYWNTYW1wbGVzKHQuc2FtcGxlcywwLGZ1bmN0aW9uKCl7cy5kZWNyeXB0QW5kUmVtdXhBdmModCxlLHIsaSxhLG4sbyl9KX1lbHNlIHRoaXMuZGVjcnlwdEFuZFJlbXV4QXZjKHQsZSxyLGksYSxuLG8pfSx0LnByb3RvdHlwZS5kZWNyeXB0QW5kUmVtdXhBdmM9ZnVuY3Rpb24odCxlLHIsaSxhLG4sbyl7aWYoZS5zYW1wbGVzKXt2YXIgcz10aGlzO3RoaXMuc2FtcGxlQWVzLmRlY3J5cHRBdmNTYW1wbGVzKGUuc2FtcGxlcywwLDAsZnVuY3Rpb24oKXtzLnJlbXV4ZXIucmVtdXgodCxlLHIsaSxhLG4sbyl9KX1lbHNlIHRoaXMucmVtdXhlci5yZW11eCh0LGUscixpLGEsbixvKX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2luaXRQVFM9dGhpcy5faW5pdERUUz12b2lkIDAsdGhpcy5fZHVyYXRpb249MH0sdC5wcm90b3R5cGUuX3BhcnNlUEFUPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKDMxJnRbZSsxMF0pPDw4fHRbZSsxMV19LHQucHJvdG90eXBlLl9wYXJzZVBNVD1mdW5jdGlvbih0LGUscixpKXt2YXIgYSxuLG8scyxsPXthdWRpbzotMSxhdmM6LTEsaWQzOi0xLGlzQUFDOiEwfTtmb3IoYT0oMTUmdFtlKzFdKTw8OHx0W2UrMl0sbj1lKzMrYS00LG89KDE1JnRbZSsxMF0pPDw4fHRbZSsxMV0sZSs9MTIrbztlPG47KXtzd2l0Y2gocz0oMzEmdFtlKzFdKTw8OHx0W2UrMl0sdFtlXSl7Y2FzZSAyMDc6aWYoIWkpe00uYi5sb2coInVua293biBzdHJlYW0gdHlwZToiK3RbZV0pO2JyZWFrfWNhc2UgMTU6LTE9PT1sLmF1ZGlvJiYobC5hdWRpbz1zKTticmVhaztjYXNlIDIxOi0xPT09bC5pZDMmJihsLmlkMz1zKTticmVhaztjYXNlIDIxOTppZighaSl7TS5iLmxvZygidW5rb3duIHN0cmVhbSB0eXBlOiIrdFtlXSk7YnJlYWt9Y2FzZSAyNzotMT09PWwuYXZjJiYobC5hdmM9cyk7YnJlYWs7Y2FzZSAzOmNhc2UgNDpyPy0xPT09bC5hdWRpbyYmKGwuYXVkaW89cyxsLmlzQUFDPSExKTpNLmIubG9nKCJNUEVHIGF1ZGlvIGZvdW5kLCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciBmb3Igbm93Iik7YnJlYWs7Y2FzZSAzNjpNLmIud2FybigiSEVWQyBzdHJlYW0gdHlwZSBmb3VuZCwgbm90IHN1cHBvcnRlZCBmb3Igbm93Iik7YnJlYWs7ZGVmYXVsdDpNLmIubG9nKCJ1bmtvd24gc3RyZWFtIHR5cGU6Iit0W2VdKX1lKz01KygoMTUmdFtlKzNdKTw8OHx0W2UrNF0pfXJldHVybiBsfSx0LnByb3RvdHlwZS5fcGFyc2VQRVM9ZnVuY3Rpb24odCl7dmFyIGUscixpLGEsbixvLHMsbCxkPTAsdT10LmRhdGE7aWYoIXR8fDA9PT10LnNpemUpcmV0dXJuIG51bGw7Zm9yKDt1WzBdLmxlbmd0aDwxOSYmdS5sZW5ndGg+MTspe3ZhciBoPW5ldyBVaW50OEFycmF5KHVbMF0ubGVuZ3RoK3VbMV0ubGVuZ3RoKTtoLnNldCh1WzBdKSxoLnNldCh1WzFdLHVbMF0ubGVuZ3RoKSx1WzBdPWgsdS5zcGxpY2UoMSwxKX1pZihlPXVbMF0sMT09PShlWzBdPDwxNikrKGVbMV08PDgpK2VbMl0pe2lmKChpPShlWzRdPDw4KStlWzVdKSYmaT50LnNpemUtNilyZXR1cm4gbnVsbDtyPWVbN10sMTkyJnImJihvPTUzNjg3MDkxMiooMTQmZVs5XSkrNDE5NDMwNCooMjU1JmVbMTBdKSsxNjM4NCooMjU0JmVbMTFdKSsxMjgqKDI1NSZlWzEyXSkrKDI1NCZlWzEzXSkvMixvPjQyOTQ5NjcyOTUmJihvLT04NTg5OTM0NTkyKSw2NCZyPyhzPTUzNjg3MDkxMiooMTQmZVsxNF0pKzQxOTQzMDQqKDI1NSZlWzE1XSkrMTYzODQqKDI1NCZlWzE2XSkrMTI4KigyNTUmZVsxN10pKygyNTQmZVsxOF0pLzIscz40Mjk0OTY3Mjk1JiYocy09ODU4OTkzNDU5Miksby1zPjU0ZTUmJihNLmIud2FybihNYXRoLnJvdW5kKChvLXMpLzllNCkrInMgZGVsdGEgYmV0d2VlbiBQVFMgYW5kIERUUywgYWxpZ24gdGhlbSIpLG89cykpOnM9byksYT1lWzhdLGw9YSs5LHQuc2l6ZS09bCxuPW5ldyBVaW50OEFycmF5KHQuc2l6ZSk7Zm9yKHZhciBmPTAsYz11Lmxlbmd0aDtmPGM7ZisrKXtlPXVbZl07dmFyIHA9ZS5ieXRlTGVuZ3RoO2lmKGwpe2lmKGw+cCl7bC09cDtjb250aW51ZX1lPWUuc3ViYXJyYXkobCkscC09bCxsPTB9bi5zZXQoZSxkKSxkKz1wfXJldHVybiBpJiYoaS09YSszKSx7ZGF0YTpuLHB0czpvLGR0czpzLGxlbjppfX1yZXR1cm4gbnVsbH0sdC5wcm90b3R5cGUucHVzaEFjY2VzVW5pdD1mdW5jdGlvbih0LGUpe2lmKHQudW5pdHMubGVuZ3RoJiZ0LmZyYW1lKXt2YXIgcj1lLnNhbXBsZXMsaT1yLmxlbmd0aDshdGhpcy5jb25maWcuZm9yY2VLZXlGcmFtZU9uRGlzY29udGludWl0eXx8ITA9PT10LmtleXx8ZS5zcHMmJihpfHx0aGlzLmNvbnRpZ3VvdXMpPyh0LmlkPWksci5wdXNoKHQpKTplLmRyb3BwZWQrK310LmRlYnVnLmxlbmd0aCYmTS5iLmxvZyh0LnB0cysiLyIrdC5kdHMrIjoiK3QuZGVidWcpfSx0LnByb3RvdHlwZS5fcGFyc2VBVkNQRVM9ZnVuY3Rpb24odCxlKXt2YXIgcixpLGEsbj10aGlzLG89dGhpcy5fYXZjVHJhY2sscz10aGlzLl9wYXJzZUFWQ05BTHUodC5kYXRhKSxsPXRoaXMuYXZjU2FtcGxlLGQ9ITEsdT10aGlzLnB1c2hBY2Nlc1VuaXQuYmluZCh0aGlzKSxoPWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybntrZXk6dCxwdHM6ZSxkdHM6cix1bml0czpbXSxkZWJ1ZzppfX07dC5kYXRhPW51bGwsbCYmcy5sZW5ndGgmJiFvLmF1ZEZvdW5kJiYodShsLG8pLGw9dGhpcy5hdmNTYW1wbGU9aCghMSx0LnB0cyx0LmR0cywiIikpLHMuZm9yRWFjaChmdW5jdGlvbihlKXtzd2l0Y2goZS50eXBlKXtjYXNlIDE6aT0hMCxsfHwobD1uLmF2Y1NhbXBsZT1oKCEwLHQucHRzLHQuZHRzLCIiKSksbC5mcmFtZT0hMDt2YXIgcz1lLmRhdGE7aWYoZCYmcy5sZW5ndGg+NCl7dmFyIGY9bmV3IFgocykucmVhZFNsaWNlVHlwZSgpOzIhPT1mJiY0IT09ZiYmNyE9PWYmJjkhPT1mfHwobC5rZXk9ITApfWJyZWFrO2Nhc2UgNTppPSEwLGx8fChsPW4uYXZjU2FtcGxlPWgoITAsdC5wdHMsdC5kdHMsIiIpKSxsLmtleT0hMCxsLmZyYW1lPSEwO2JyZWFrO2Nhc2UgNjppPSEwLHI9bmV3IFgobi5kaXNjYXJkRVBCKGUuZGF0YSkpLHIucmVhZFVCeXRlKCk7Zm9yKHZhciBjPTAscD0wLHY9ITEsZz0wOyF2JiZyLmJ5dGVzQXZhaWxhYmxlPjE7KXtjPTA7ZG97Zz1yLnJlYWRVQnl0ZSgpLGMrPWd9d2hpbGUoMjU1PT09Zyk7cD0wO2Rve2c9ci5yZWFkVUJ5dGUoKSxwKz1nfXdoaWxlKDI1NT09PWcpO2lmKDQ9PT1jJiYwIT09ci5ieXRlc0F2YWlsYWJsZSl7dj0hMDtpZigxODE9PT1yLnJlYWRVQnl0ZSgpKXtpZig0OT09PXIucmVhZFVTaG9ydCgpKXtpZigxMTk1NDU2ODIwPT09ci5yZWFkVUludCgpKXtpZigzPT09ci5yZWFkVUJ5dGUoKSl7dmFyIG09ci5yZWFkVUJ5dGUoKSx5PXIucmVhZFVCeXRlKCksYj0zMSZtLEU9W20seV07Zm9yKGE9MDthPGI7YSsrKUUucHVzaChyLnJlYWRVQnl0ZSgpKSxFLnB1c2goci5yZWFkVUJ5dGUoKSksRS5wdXNoKHIucmVhZFVCeXRlKCkpO24uX2luc2VydFNhbXBsZUluT3JkZXIobi5fdHh0VHJhY2suc2FtcGxlcyx7dHlwZTozLHB0czp0LnB0cyxieXRlczpFfSl9fX19fWVsc2UgaWYocDxyLmJ5dGVzQXZhaWxhYmxlKWZvcihhPTA7YTxwO2ErKylyLnJlYWRVQnl0ZSgpfWJyZWFrO2Nhc2UgNzppZihpPSEwLGQ9ITAsIW8uc3BzKXtyPW5ldyBYKGUuZGF0YSk7dmFyIFI9ci5yZWFkU1BTKCk7by53aWR0aD1SLndpZHRoLG8uaGVpZ2h0PVIuaGVpZ2h0LG8ucGl4ZWxSYXRpbz1SLnBpeGVsUmF0aW8sby5zcHM9W2UuZGF0YV0sby5kdXJhdGlvbj1uLl9kdXJhdGlvbjt2YXIgQT1lLmRhdGEuc3ViYXJyYXkoMSw0KSxUPSJhdmMxLiI7Zm9yKGE9MDthPDM7YSsrKXt2YXIgUz1BW2FdLnRvU3RyaW5nKDE2KTtTLmxlbmd0aDwyJiYoUz0iMCIrUyksVCs9U31vLmNvZGVjPVR9YnJlYWs7Y2FzZSA4Omk9ITAsby5wcHN8fChvLnBwcz1bZS5kYXRhXSk7YnJlYWs7Y2FzZSA5Omk9ITEsby5hdWRGb3VuZD0hMCxsJiZ1KGwsbyksbD1uLmF2Y1NhbXBsZT1oKCExLHQucHRzLHQuZHRzLCIiKTticmVhaztjYXNlIDEyOmk9ITE7YnJlYWs7ZGVmYXVsdDppPSExLGwmJihsLmRlYnVnKz0idW5rbm93biBOQUwgIitlLnR5cGUrIiAiKX1pZihsJiZpKXtsLnVuaXRzLnB1c2goZSl9fSksZSYmbCYmKHUobCxvKSx0aGlzLmF2Y1NhbXBsZT1udWxsKX0sdC5wcm90b3R5cGUuX2luc2VydFNhbXBsZUluT3JkZXI9ZnVuY3Rpb24odCxlKXt2YXIgcj10Lmxlbmd0aDtpZihyPjApe2lmKGUucHRzPj10W3ItMV0ucHRzKXQucHVzaChlKTtlbHNlIGZvcih2YXIgaT1yLTE7aT49MDtpLS0paWYoZS5wdHM8dFtpXS5wdHMpe3Quc3BsaWNlKGksMCxlKTticmVha319ZWxzZSB0LnB1c2goZSl9LHQucHJvdG90eXBlLl9nZXRMYXN0TmFsVW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYXZjU2FtcGxlLGU9dm9pZCAwO2lmKCF0fHwwPT09dC51bml0cy5sZW5ndGgpe3ZhciByPXRoaXMuX2F2Y1RyYWNrLGk9ci5zYW1wbGVzO3Q9aVtpLmxlbmd0aC0xXX1pZih0KXt2YXIgYT10LnVuaXRzO2U9YVthLmxlbmd0aC0xXX1yZXR1cm4gZX0sdC5wcm90b3R5cGUuX3BhcnNlQVZDTkFMdT1mdW5jdGlvbih0KXt2YXIgZSxyLGksYSxuLG89MCxzPXQuYnl0ZUxlbmd0aCxsPXRoaXMuX2F2Y1RyYWNrLGQ9bC5uYWx1U3RhdGV8fDAsdT1kLGg9W10sZj0tMTtmb3IoLTE9PT1kJiYoZj0wLG49MzEmdFswXSxkPTAsbz0xKTtvPHM7KWlmKGU9dFtvKytdLGQpaWYoMSE9PWQpaWYoZSlpZigxPT09ZSl7aWYoZj49MClpPXtkYXRhOnQuc3ViYXJyYXkoZixvLWQtMSksdHlwZTpufSxoLnB1c2goaSk7ZWxzZXt2YXIgYz10aGlzLl9nZXRMYXN0TmFsVW5pdCgpO2lmKGMmJih1JiZvPD00LXUmJmMuc3RhdGUmJihjLmRhdGE9Yy5kYXRhLnN1YmFycmF5KDAsYy5kYXRhLmJ5dGVMZW5ndGgtdSkpLChyPW8tZC0xKT4wKSl7dmFyIHA9bmV3IFVpbnQ4QXJyYXkoYy5kYXRhLmJ5dGVMZW5ndGgrcik7cC5zZXQoYy5kYXRhLDApLHAuc2V0KHQuc3ViYXJyYXkoMCxyKSxjLmRhdGEuYnl0ZUxlbmd0aCksYy5kYXRhPXB9fW88cz8oYT0zMSZ0W29dLGY9byxuPWEsZD0wKTpkPS0xfWVsc2UgZD0wO2Vsc2UgZD0zO2Vsc2UgZD1lPzA6MjtlbHNlIGQ9ZT8wOjE7aWYoZj49MCYmZD49MCYmKGk9e2RhdGE6dC5zdWJhcnJheShmLHMpLHR5cGU6bixzdGF0ZTpkfSxoLnB1c2goaSkpLDA9PT1oLmxlbmd0aCl7dmFyIHY9dGhpcy5fZ2V0TGFzdE5hbFVuaXQoKTtpZih2KXt2YXIgZz1uZXcgVWludDhBcnJheSh2LmRhdGEuYnl0ZUxlbmd0aCt0LmJ5dGVMZW5ndGgpO2cuc2V0KHYuZGF0YSwwKSxnLnNldCh0LHYuZGF0YS5ieXRlTGVuZ3RoKSx2LmRhdGE9Z319cmV0dXJuIGwubmFsdVN0YXRlPWQsaH0sdC5wcm90b3R5cGUuZGlzY2FyZEVQQj1mdW5jdGlvbih0KXtmb3IodmFyIGUscixpPXQuYnl0ZUxlbmd0aCxhPVtdLG49MTtuPGktMjspMD09PXRbbl0mJjA9PT10W24rMV0mJjM9PT10W24rMl0/KGEucHVzaChuKzIpLG4rPTIpOm4rKztpZigwPT09YS5sZW5ndGgpcmV0dXJuIHQ7ZT1pLWEubGVuZ3RoLHI9bmV3IFVpbnQ4QXJyYXkoZSk7dmFyIG89MDtmb3Iobj0wO248ZTtvKyssbisrKW89PT1hWzBdJiYobysrLGEuc2hpZnQoKSkscltuXT10W29dO3JldHVybiByfSx0LnByb3RvdHlwZS5fcGFyc2VBQUNQRVM9ZnVuY3Rpb24odCl7dmFyIGUscixpLGEsbixvPXRoaXMuX2F1ZGlvVHJhY2sscz10LmRhdGEsbD10LnB0cyxkPXRoaXMuYWFjT3ZlckZsb3csdT10aGlzLmFhY0xhc3RQVFM7aWYoZCl7dmFyIGY9bmV3IFVpbnQ4QXJyYXkoZC5ieXRlTGVuZ3RoK3MuYnl0ZUxlbmd0aCk7Zi5zZXQoZCwwKSxmLnNldChzLGQuYnl0ZUxlbmd0aCkscz1mfWZvcihpPTAsbj1zLmxlbmd0aDtpPG4tMSYmIWgocyxpKTtpKyspO2lmKGkpe3ZhciB2LG07aWYoaTxuLTE/KHY9IkFBQyBQRVMgZGlkIG5vdCBzdGFydCB3aXRoIEFEVFMgaGVhZGVyLG9mZnNldDoiK2ksbT0hMSk6KHY9Im5vIEFEVFMgaGVhZGVyIGZvdW5kIGluIEFBQyBQRVMiLG09ITApLE0uYi53YXJuKCJwYXJzaW5nIGVycm9yOiIrdiksdGhpcy5vYnNlcnZlci50cmlnZ2VyKEQuYS5FUlJPUix7dHlwZTpPLmIuTUVESUFfRVJST1IsZGV0YWlsczpPLmEuRlJBR19QQVJTSU5HX0VSUk9SLGZhdGFsOm0scmVhc29uOnZ9KSxtKXJldHVybn1pZihjKG8sdGhpcy5vYnNlcnZlcixzLGksdGhpcy5hdWRpb0NvZGVjKSxyPTAsZT1wKG8uc2FtcGxlcmF0ZSksZCYmdSl7dmFyIHk9dStlO01hdGguYWJzKHktbCk+MSYmKE0uYi5sb2coIkFBQzogYWxpZ24gUFRTIGZvciBvdmVybGFwcGluZyBmcmFtZXMgYnkgIitNYXRoLnJvdW5kKCh5LWwpLzkwKSksbD15KX1mb3IoO2k8bjspaWYoaChzLGkpJiZpKzU8bil7dmFyIGI9ZyhvLHMsaSxsLHIpO2lmKCFiKWJyZWFrO2krPWIubGVuZ3RoLGE9Yi5zYW1wbGUucHRzLHIrK31lbHNlIGkrKztkPWk8bj9zLnN1YmFycmF5KGksbik6bnVsbCx0aGlzLmFhY092ZXJGbG93PWQsdGhpcy5hYWNMYXN0UFRTPWF9LHQucHJvdG90eXBlLl9wYXJzZU1QRUdQRVM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuZGF0YSxyPWUubGVuZ3RoLGk9MCxhPTAsbj10LnB0czthPHI7KWlmKFkuaXNIZWFkZXIoZSxhKSl7dmFyIG89WS5hcHBlbmRGcmFtZSh0aGlzLl9hdWRpb1RyYWNrLGUsYSxuLGkpO2lmKCFvKWJyZWFrO2ErPW8ubGVuZ3RoLGkrK31lbHNlIGErK30sdC5wcm90b3R5cGUuX3BhcnNlSUQzUEVTPWZ1bmN0aW9uKHQpe3RoaXMuX2lkM1RyYWNrLnNhbXBsZXMucHVzaCh0KX0sdH0oKSxaPUosJD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxyLGkpe0EodGhpcyx0KSx0aGlzLm9ic2VydmVyPWUsdGhpcy5jb25maWc9aSx0aGlzLnJlbXV4ZXI9cn1yZXR1cm4gdC5wcm90b3R5cGUucmVzZXRJbml0U2VnbWVudD1mdW5jdGlvbih0LGUscixpKXt0aGlzLl9hdWRpb1RyYWNrPXtjb250YWluZXI6ImF1ZGlvL21wZWciLHR5cGU6ImF1ZGlvIixpZDotMSxzZXF1ZW5jZU51bWJlcjowLGlzQUFDOiExLHNhbXBsZXM6W10sbGVuOjAsbWFuaWZlc3RDb2RlYzplLGR1cmF0aW9uOmksaW5wdXRUaW1lU2NhbGU6OWU0fX0sdC5wcm90b3R5cGUucmVzZXRUaW1lU3RhbXA9ZnVuY3Rpb24oKXt9LHQucHJvYmU9ZnVuY3Rpb24odCl7dmFyIGUscixpPUIuYS5nZXRJRDNEYXRhKHQsMCk7aWYoaSYmdm9pZCAwIT09Qi5hLmdldFRpbWVTdGFtcChpKSlmb3IoZT1pLmxlbmd0aCxyPU1hdGgubWluKHQubGVuZ3RoLTEsZSsxMDApO2U8cjtlKyspaWYoWS5wcm9iZSh0LGUpKXJldHVybiBNLmIubG9nKCJNUEVHIEF1ZGlvIHN5bmMgd29yZCBmb3VuZCAhIiksITA7cmV0dXJuITF9LHQucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbih0LGUscixpKXtmb3IodmFyIGE9Qi5hLmdldElEM0RhdGEodCwwKSxuPTkwKkIuYS5nZXRUaW1lU3RhbXAoYSksbz1hLmxlbmd0aCxzPXQubGVuZ3RoLGw9MCxkPTAsdT10aGlzLl9hdWRpb1RyYWNrLGg9W3twdHM6bixkdHM6bixkYXRhOmF9XTtvPHM7KWlmKFkuaXNIZWFkZXIodCxvKSl7dmFyIGY9WS5hcHBlbmRGcmFtZSh1LHQsbyxuLGwpO2lmKCFmKWJyZWFrO28rPWYubGVuZ3RoLGQ9Zi5zYW1wbGUucHRzLGwrK31lbHNlIEIuYS5pc0hlYWRlcih0LG8pPyhhPUIuYS5nZXRJRDNEYXRhKHQsbyksaC5wdXNoKHtwdHM6ZCxkdHM6ZCxkYXRhOmF9KSxvKz1hLmxlbmd0aCk6bysrO3RoaXMucmVtdXhlci5yZW11eCh1LHtzYW1wbGVzOltdfSx7c2FtcGxlczpoLGlucHV0VGltZVNjYWxlOjllNH0se3NhbXBsZXM6W119LGUscixpKX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKSx0dD0kLGV0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe1QodGhpcyx0KX1yZXR1cm4gdC5nZXRTaWxlbnRGcmFtZT1mdW5jdGlvbih0LGUpe3N3aXRjaCh0KXtjYXNlIm1wNGEuNDAuMiI6aWYoMT09PWUpcmV0dXJuIG5ldyBVaW50OEFycmF5KFswLDIwMCwwLDEyOCwzNSwxMjhdKTtpZigyPT09ZSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzMzLDAsNzMsMTQ0LDIsMjUsMCwzNSwxMjhdKTtpZigzPT09ZSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzAsMjAwLDAsMTI4LDMyLDEzMiwxLDM4LDY0LDgsMTAwLDAsMTQyXSk7aWYoND09PWUpcmV0dXJuIG5ldyBVaW50OEFycmF5KFswLDIwMCwwLDEyOCwzMiwxMzIsMSwzOCw2NCw4LDEwMCwwLDEyOCw0NCwxMjgsOCwyLDU2XSk7aWYoNT09PWUpcmV0dXJuIG5ldyBVaW50OEFycmF5KFswLDIwMCwwLDEyOCwzMiwxMzIsMSwzOCw2NCw4LDEwMCwwLDEzMCw0OCw0LDE1MywwLDMzLDE0NCwyLDU2XSk7aWYoNj09PWUpcmV0dXJuIG5ldyBVaW50OEFycmF5KFswLDIwMCwwLDEyOCwzMiwxMzIsMSwzOCw2NCw4LDEwMCwwLDEzMCw0OCw0LDE1MywwLDMzLDE0NCwyLDAsMTc4LDAsMzIsOCwyMjRdKTticmVhaztkZWZhdWx0OmlmKDE9PT1lKXJldHVybiBuZXcgVWludDhBcnJheShbMSw2NCwzNCwxMjgsMTYzLDc4LDIzMCwxMjgsMTg2LDgsMCwwLDAsMjgsNiwyNDEsMTkzLDEwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDk0XSk7aWYoMj09PWUpcmV0dXJuIG5ldyBVaW50OEFycmF5KFsxLDY0LDM0LDEyOCwxNjMsOTQsMjMwLDEyOCwxODYsOCwwLDAsMCwwLDE0OSwwLDYsMjQxLDE2MSwxMCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5NF0pO2lmKDM9PT1lKXJldHVybiBuZXcgVWludDhBcnJheShbMSw2NCwzNCwxMjgsMTYzLDk0LDIzMCwxMjgsMTg2LDgsMCwwLDAsMCwxNDksMCw2LDI0MSwxNjEsMTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTRdKX1yZXR1cm4gbnVsbH0sdH0oKSxydD1ldCxpdD1NYXRoLnBvdygyLDMyKS0xLGF0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe1ModGhpcyx0KX1yZXR1cm4gdC5pbml0PWZ1bmN0aW9uKCl7dC50eXBlcz17YXZjMTpbXSxhdmNDOltdLGJ0cnQ6W10sZGluZjpbXSxkcmVmOltdLGVzZHM6W10sZnR5cDpbXSxoZGxyOltdLG1kYXQ6W10sbWRoZDpbXSxtZGlhOltdLG1maGQ6W10sbWluZjpbXSxtb29mOltdLG1vb3Y6W10sbXA0YTpbXSwiLm1wMyI6W10sbXZleDpbXSxtdmhkOltdLHBhc3A6W10sc2R0cDpbXSxzdGJsOltdLHN0Y286W10sc3RzYzpbXSxzdHNkOltdLHN0c3o6W10sc3R0czpbXSx0ZmR0OltdLHRmaGQ6W10sdHJhZjpbXSx0cmFrOltdLHRydW46W10sdHJleDpbXSx0a2hkOltdLHZtaGQ6W10sc21oZDpbXX07dmFyIGU7Zm9yKGUgaW4gdC50eXBlcyl0LnR5cGVzLmhhc093blByb3BlcnR5KGUpJiYodC50eXBlc1tlXT1bZS5jaGFyQ29kZUF0KDApLGUuY2hhckNvZGVBdCgxKSxlLmNoYXJDb2RlQXQoMiksZS5jaGFyQ29kZUF0KDMpXSk7dmFyIHI9bmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDAsMCwwLDAsMCwxMTgsMTA1LDEwMCwxMDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODYsMTA1LDEwMCwxMDEsMTExLDcyLDk3LDExMCwxMDAsMTA4LDEwMSwxMTQsMF0pLGk9bmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDAsMCwwLDAsMCwxMTUsMTExLDExNywxMTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODMsMTExLDExNywxMTAsMTAwLDcyLDk3LDExMCwxMDAsMTA4LDEwMSwxMTQsMF0pO3QuSERMUl9UWVBFUz17dmlkZW86cixhdWRpbzppfTt2YXIgYT1uZXcgVWludDhBcnJheShbMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEyLDExNywxMTQsMTA4LDMyLDAsMCwwLDFdKSxuPW5ldyBVaW50OEFycmF5KFswLDAsMCwwLDAsMCwwLDBdKTt0LlNUVFM9dC5TVFNDPXQuU1RDTz1uLHQuU1RTWj1uZXcgVWludDhBcnJheShbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdKSx0LlZNSEQ9bmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwXSksdC5TTUhEPW5ldyBVaW50OEFycmF5KFswLDAsMCwwLDAsMCwwLDBdKSx0LlNUU0Q9bmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDAsMCwwLDAsMV0pO3ZhciBvPW5ldyBVaW50OEFycmF5KFsxMDUsMTE1LDExMSwxMDldKSxzPW5ldyBVaW50OEFycmF5KFs5NywxMTgsOTksNDldKSxsPW5ldyBVaW50OEFycmF5KFswLDAsMCwxXSk7dC5GVFlQPXQuYm94KHQudHlwZXMuZnR5cCxvLGwsbyxzKSx0LkRJTkY9dC5ib3godC50eXBlcy5kaW5mLHQuYm94KHQudHlwZXMuZHJlZixhKSl9LHQuYm94PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxpPTgsYT1yLmxlbmd0aCxuPWE7YS0tOylpKz1yW2FdLmJ5dGVMZW5ndGg7Zm9yKGU9bmV3IFVpbnQ4QXJyYXkoaSksZVswXT1pPj4yNCYyNTUsZVsxXT1pPj4xNiYyNTUsZVsyXT1pPj44JjI1NSxlWzNdPTI1NSZpLGUuc2V0KHQsNCksYT0wLGk9ODthPG47YSsrKWUuc2V0KHJbYV0saSksaSs9clthXS5ieXRlTGVuZ3RoO3JldHVybiBlfSx0LmhkbHI9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYm94KHQudHlwZXMuaGRscix0LkhETFJfVFlQRVNbZV0pfSx0Lm1kYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYm94KHQudHlwZXMubWRhdCxlKX0sdC5tZGhkPWZ1bmN0aW9uKGUscil7cio9ZTt2YXIgaT1NYXRoLmZsb29yKHIvKGl0KzEpKSxhPU1hdGguZmxvb3IociUoaXQrMSkpO3JldHVybiB0LmJveCh0LnR5cGVzLm1kaGQsbmV3IFVpbnQ4QXJyYXkoWzEsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMyxlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LDI1NSZlLGk+PjI0LGk+PjE2JjI1NSxpPj44JjI1NSwyNTUmaSxhPj4yNCxhPj4xNiYyNTUsYT4+OCYyNTUsMjU1JmEsODUsMTk2LDAsMF0pKX0sdC5tZGlhPWZ1bmN0aW9uKGUpe3JldHVybiB0LmJveCh0LnR5cGVzLm1kaWEsdC5tZGhkKGUudGltZXNjYWxlLGUuZHVyYXRpb24pLHQuaGRscihlLnR5cGUpLHQubWluZihlKSl9LHQubWZoZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5ib3godC50eXBlcy5tZmhkLG5ldyBVaW50OEFycmF5KFswLDAsMCwwLGU+PjI0LGU+PjE2JjI1NSxlPj44JjI1NSwyNTUmZV0pKX0sdC5taW5mPWZ1bmN0aW9uKGUpe3JldHVybiJhdWRpbyI9PT1lLnR5cGU/dC5ib3godC50eXBlcy5taW5mLHQuYm94KHQudHlwZXMuc21oZCx0LlNNSEQpLHQuRElORix0LnN0YmwoZSkpOnQuYm94KHQudHlwZXMubWluZix0LmJveCh0LnR5cGVzLnZtaGQsdC5WTUhEKSx0LkRJTkYsdC5zdGJsKGUpKX0sdC5tb29mPWZ1bmN0aW9uKGUscixpKXtyZXR1cm4gdC5ib3godC50eXBlcy5tb29mLHQubWZoZChlKSx0LnRyYWYoaSxyKSl9LHQubW9vdj1mdW5jdGlvbihlKXtmb3IodmFyIHI9ZS5sZW5ndGgsaT1bXTtyLS07KWlbcl09dC50cmFrKGVbcl0pO3JldHVybiB0LmJveC5hcHBseShudWxsLFt0LnR5cGVzLm1vb3YsdC5tdmhkKGVbMF0udGltZXNjYWxlLGVbMF0uZHVyYXRpb24pXS5jb25jYXQoaSkuY29uY2F0KHQubXZleChlKSkpfSx0Lm12ZXg9ZnVuY3Rpb24oZSl7Zm9yKHZhciByPWUubGVuZ3RoLGk9W107ci0tOylpW3JdPXQudHJleChlW3JdKTtyZXR1cm4gdC5ib3guYXBwbHkobnVsbCxbdC50eXBlcy5tdmV4XS5jb25jYXQoaSkpfSx0Lm12aGQ9ZnVuY3Rpb24oZSxyKXtyKj1lO3ZhciBpPU1hdGguZmxvb3Ioci8oaXQrMSkpLGE9TWF0aC5mbG9vcihyJShpdCsxKSksbj1uZXcgVWludDhBcnJheShbMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwzLGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsMjU1JmUsaT4+MjQsaT4+MTYmMjU1LGk+PjgmMjU1LDI1NSZpLGE+PjI0LGE+PjE2JjI1NSxhPj44JjI1NSwyNTUmYSwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw2NCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNTUsMjU1LDI1NSwyNTVdKTtyZXR1cm4gdC5ib3godC50eXBlcy5tdmhkLG4pfSx0LnNkdHA9ZnVuY3Rpb24oZSl7dmFyIHIsaSxhPWUuc2FtcGxlc3x8W10sbj1uZXcgVWludDhBcnJheSg0K2EubGVuZ3RoKTtmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKXI9YVtpXS5mbGFncyxuW2krNF09ci5kZXBlbmRzT248PDR8ci5pc0RlcGVuZGVkT248PDJ8ci5oYXNSZWR1bmRhbmN5O3JldHVybiB0LmJveCh0LnR5cGVzLnNkdHAsbil9LHQuc3RibD1mdW5jdGlvbihlKXtyZXR1cm4gdC5ib3godC50eXBlcy5zdGJsLHQuc3RzZChlKSx0LmJveCh0LnR5cGVzLnN0dHMsdC5TVFRTKSx0LmJveCh0LnR5cGVzLnN0c2MsdC5TVFNDKSx0LmJveCh0LnR5cGVzLnN0c3osdC5TVFNaKSx0LmJveCh0LnR5cGVzLnN0Y28sdC5TVENPKSl9LHQuYXZjMT1mdW5jdGlvbihlKXt2YXIgcixpLGEsbj1bXSxvPVtdO2ZvcihyPTA7cjxlLnNwcy5sZW5ndGg7cisrKWk9ZS5zcHNbcl0sYT1pLmJ5dGVMZW5ndGgsbi5wdXNoKGE+Pj44JjI1NSksbi5wdXNoKDI1NSZhKSxuPW4uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGkpKTtmb3Iocj0wO3I8ZS5wcHMubGVuZ3RoO3IrKylpPWUucHBzW3JdLGE9aS5ieXRlTGVuZ3RoLG8ucHVzaChhPj4+OCYyNTUpLG8ucHVzaCgyNTUmYSksbz1vLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpKSk7dmFyIHM9dC5ib3godC50eXBlcy5hdmNDLG5ldyBVaW50OEFycmF5KFsxLG5bM10sbls0XSxuWzVdLDI1NSwyMjR8ZS5zcHMubGVuZ3RoXS5jb25jYXQobikuY29uY2F0KFtlLnBwcy5sZW5ndGhdKS5jb25jYXQobykpKSxsPWUud2lkdGgsZD1lLmhlaWdodCx1PWUucGl4ZWxSYXRpb1swXSxoPWUucGl4ZWxSYXRpb1sxXTtyZXR1cm4gdC5ib3godC50eXBlcy5hdmMxLG5ldyBVaW50OEFycmF5KFswLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCxsPj44JjI1NSwyNTUmbCxkPj44JjI1NSwyNTUmZCwwLDcyLDAsMCwwLDcyLDAsMCwwLDAsMCwwLDAsMSwxOCwxMDAsOTcsMTA1LDEwOCwxMjEsMTA5LDExMSwxMTYsMTA1LDExMSwxMTAsNDcsMTA0LDEwOCwxMTUsNDYsMTA2LDExNSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMjQsMTcsMTddKSxzLHQuYm94KHQudHlwZXMuYnRydCxuZXcgVWludDhBcnJheShbMCwyOCwxNTYsMTI4LDAsNDUsMTk4LDE5MiwwLDQ1LDE5OCwxOTJdKSksdC5ib3godC50eXBlcy5wYXNwLG5ldyBVaW50OEFycmF5KFt1Pj4yNCx1Pj4xNiYyNTUsdT4+OCYyNTUsMjU1JnUsaD4+MjQsaD4+MTYmMjU1LGg+PjgmMjU1LDI1NSZoXSkpKX0sdC5lc2RzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY29uZmlnLmxlbmd0aDtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDAsMywyMytlLDAsMSwwLDQsMTUrZSw2NCwyMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNV0uY29uY2F0KFtlXSkuY29uY2F0KHQuY29uZmlnKS5jb25jYXQoWzYsMSwyXSkpfSx0Lm1wNGE9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5zYW1wbGVyYXRlO3JldHVybiB0LmJveCh0LnR5cGVzLm1wNGEsbmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCxlLmNoYW5uZWxDb3VudCwwLDE2LDAsMCwwLDAscj4+OCYyNTUsMjU1JnIsMCwwXSksdC5ib3godC50eXBlcy5lc2RzLHQuZXNkcyhlKSkpfSx0Lm1wMz1mdW5jdGlvbihlKXt2YXIgcj1lLnNhbXBsZXJhdGU7cmV0dXJuIHQuYm94KHQudHlwZXNbIi5tcDMiXSxuZXcgVWludDhBcnJheShbMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLGUuY2hhbm5lbENvdW50LDAsMTYsMCwwLDAsMCxyPj44JjI1NSwyNTUmciwwLDBdKSl9LHQuc3RzZD1mdW5jdGlvbihlKXtyZXR1cm4iYXVkaW8iPT09ZS50eXBlP2UuaXNBQUN8fCJtcDMiIT09ZS5jb2RlYz90LmJveCh0LnR5cGVzLnN0c2QsdC5TVFNELHQubXA0YShlKSk6dC5ib3godC50eXBlcy5zdHNkLHQuU1RTRCx0Lm1wMyhlKSk6dC5ib3godC50eXBlcy5zdHNkLHQuU1RTRCx0LmF2YzEoZSkpfSx0LnRraGQ9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5pZCxpPWUuZHVyYXRpb24qZS50aW1lc2NhbGUsYT1lLndpZHRoLG49ZS5oZWlnaHQsbz1NYXRoLmZsb29yKGkvKGl0KzEpKSxzPU1hdGguZmxvb3IoaSUoaXQrMSkpO3JldHVybiB0LmJveCh0LnR5cGVzLnRraGQsbmV3IFVpbnQ4QXJyYXkoWzEsMCwwLDcsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMyxyPj4yNCYyNTUscj4+MTYmMjU1LHI+PjgmMjU1LDI1NSZyLDAsMCwwLDAsbz4+MjQsbz4+MTYmMjU1LG8+PjgmMjU1LDI1NSZvLHM+PjI0LHM+PjE2JjI1NSxzPj44JjI1NSwyNTUmcywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw2NCwwLDAsMCxhPj44JjI1NSwyNTUmYSwwLDAsbj4+OCYyNTUsMjU1Jm4sMCwwXSkpfSx0LnRyYWY9ZnVuY3Rpb24oZSxyKXt2YXIgaT10LnNkdHAoZSksYT1lLmlkLG49TWF0aC5mbG9vcihyLyhpdCsxKSksbz1NYXRoLmZsb29yKHIlKGl0KzEpKTtyZXR1cm4gdC5ib3godC50eXBlcy50cmFmLHQuYm94KHQudHlwZXMudGZoZCxuZXcgVWludDhBcnJheShbMCwwLDAsMCxhPj4yNCxhPj4xNiYyNTUsYT4+OCYyNTUsMjU1JmFdKSksdC5ib3godC50eXBlcy50ZmR0LG5ldyBVaW50OEFycmF5KFsxLDAsMCwwLG4+PjI0LG4+PjE2JjI1NSxuPj44JjI1NSwyNTUmbixvPj4yNCxvPj4xNiYyNTUsbz4+OCYyNTUsMjU1Jm9dKSksdC50cnVuKGUsaS5sZW5ndGgrMTYrMjArOCsxNis4KzgpLGkpfSx0LnRyYWs9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZHVyYXRpb249ZS5kdXJhdGlvbnx8NDI5NDk2NzI5NSx0LmJveCh0LnR5cGVzLnRyYWssdC50a2hkKGUpLHQubWRpYShlKSl9LHQudHJleD1mdW5jdGlvbihlKXt2YXIgcj1lLmlkO3JldHVybiB0LmJveCh0LnR5cGVzLnRyZXgsbmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDAscj4+MjQscj4+MTYmMjU1LHI+PjgmMjU1LDI1NSZyLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDFdKSl9LHQudHJ1bj1mdW5jdGlvbihlLHIpe3ZhciBpLGEsbixvLHMsbCxkPWUuc2FtcGxlc3x8W10sdT1kLmxlbmd0aCxoPTEyKzE2KnUsZj1uZXcgVWludDhBcnJheShoKTtmb3Iocis9OCtoLGYuc2V0KFswLDAsMTUsMSx1Pj4+MjQmMjU1LHU+Pj4xNiYyNTUsdT4+PjgmMjU1LDI1NSZ1LHI+Pj4yNCYyNTUscj4+PjE2JjI1NSxyPj4+OCYyNTUsMjU1JnJdLDApLGk9MDtpPHU7aSsrKWE9ZFtpXSxuPWEuZHVyYXRpb24sbz1hLnNpemUscz1hLmZsYWdzLGw9YS5jdHMsZi5zZXQoW24+Pj4yNCYyNTUsbj4+PjE2JjI1NSxuPj4+OCYyNTUsMjU1Jm4sbz4+PjI0JjI1NSxvPj4+MTYmMjU1LG8+Pj44JjI1NSwyNTUmbyxzLmlzTGVhZGluZzw8MnxzLmRlcGVuZHNPbixzLmlzRGVwZW5kZWRPbjw8NnxzLmhhc1JlZHVuZGFuY3k8PDR8cy5wYWRkaW5nVmFsdWU8PDF8cy5pc05vblN5bmMsNjE0NDAmcy5kZWdyYWRQcmlvLDE1JnMuZGVncmFkUHJpbyxsPj4+MjQmMjU1LGw+Pj4xNiYyNTUsbD4+PjgmMjU1LDI1NSZsXSwxMisxNippKTtyZXR1cm4gdC5ib3godC50eXBlcy50cnVuLGYpfSx0LmluaXRTZWdtZW50PWZ1bmN0aW9uKGUpe3QudHlwZXN8fHQuaW5pdCgpO3ZhciByLGk9dC5tb292KGUpO3JldHVybiByPW5ldyBVaW50OEFycmF5KHQuRlRZUC5ieXRlTGVuZ3RoK2kuYnl0ZUxlbmd0aCksci5zZXQodC5GVFlQKSxyLnNldChpLHQuRlRZUC5ieXRlTGVuZ3RoKSxyfSx0fSgpLG50PWF0LG90PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIsaSxhKXtfKHRoaXMsdCksdGhpcy5vYnNlcnZlcj1lLHRoaXMuY29uZmlnPXIsdGhpcy50eXBlU3VwcG9ydGVkPWk7dmFyIG49bmF2aWdhdG9yLnVzZXJBZ2VudDt0aGlzLmlzU2FmYXJpPWEmJmEuaW5kZXhPZigiQXBwbGUiKT4tMSYmbiYmIW4ubWF0Y2goIkNyaU9TIiksdGhpcy5JU0dlbmVyYXRlZD0hMX1yZXR1cm4gdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUucmVzZXRUaW1lU3RhbXA9ZnVuY3Rpb24odCl7dGhpcy5faW5pdFBUUz10aGlzLl9pbml0RFRTPXR9LHQucHJvdG90eXBlLnJlc2V0SW5pdFNlZ21lbnQ9ZnVuY3Rpb24oKXt0aGlzLklTR2VuZXJhdGVkPSExfSx0LnByb3RvdHlwZS5yZW11eD1mdW5jdGlvbih0LGUscixpLGEsbixvKXtpZih0aGlzLklTR2VuZXJhdGVkfHx0aGlzLmdlbmVyYXRlSVModCxlLGEpLHRoaXMuSVNHZW5lcmF0ZWQpaWYodC5zYW1wbGVzLmxlbmd0aCl7dC50aW1lc2NhbGV8fChNLmIud2FybigicmVnZW5lcmF0ZSBJbml0U2VnbWVudCBhcyBhdWRpbyBkZXRlY3RlZCIpLHRoaXMuZ2VuZXJhdGVJUyh0LGUsYSkpO3ZhciBzPXRoaXMucmVtdXhBdWRpbyh0LGEsbixvKTtpZihlLnNhbXBsZXMubGVuZ3RoKXt2YXIgbD12b2lkIDA7cyYmKGw9cy5lbmRQVFMtcy5zdGFydFBUUyksZS50aW1lc2NhbGV8fChNLmIud2FybigicmVnZW5lcmF0ZSBJbml0U2VnbWVudCBhcyB2aWRlbyBkZXRlY3RlZCIpLHRoaXMuZ2VuZXJhdGVJUyh0LGUsYSkpLHRoaXMucmVtdXhWaWRlbyhlLGEsbixsLG8pfX1lbHNle3ZhciBkPXZvaWQgMDtlLnNhbXBsZXMubGVuZ3RoJiYoZD10aGlzLnJlbXV4VmlkZW8oZSxhLG4sbykpLGQmJnQuY29kZWMmJnRoaXMucmVtdXhFbXB0eUF1ZGlvKHQsYSxuLGQpfXIuc2FtcGxlcy5sZW5ndGgmJnRoaXMucmVtdXhJRDMocixhKSxpLnNhbXBsZXMubGVuZ3RoJiZ0aGlzLnJlbXV4VGV4dChpLGEpLHRoaXMub2JzZXJ2ZXIudHJpZ2dlcihELmEuRlJBR19QQVJTRUQpfSx0LnByb3RvdHlwZS5nZW5lcmF0ZUlTPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaSxhLG49dGhpcy5vYnNlcnZlcixvPXQuc2FtcGxlcyxzPWUuc2FtcGxlcyxsPXRoaXMudHlwZVN1cHBvcnRlZCxkPSJhdWRpby9tcDQiLHU9e30saD17dHJhY2tzOnV9LGY9dm9pZCAwPT09dGhpcy5faW5pdFBUUztpZihmJiYoaT1hPTEvMCksdC5jb25maWcmJm8ubGVuZ3RoJiYodC50aW1lc2NhbGU9dC5zYW1wbGVyYXRlLE0uYi5sb2coImF1ZGlvIHNhbXBsaW5nIHJhdGUgOiAiK3Quc2FtcGxlcmF0ZSksdC5pc0FBQ3x8KGwubXBlZz8oZD0iYXVkaW8vbXBlZyIsdC5jb2RlYz0iIik6bC5tcDMmJih0LmNvZGVjPSJtcDMiKSksdS5hdWRpbz17Y29udGFpbmVyOmQsY29kZWM6dC5jb2RlYyxpbml0U2VnbWVudDohdC5pc0FBQyYmbC5tcGVnP25ldyBVaW50OEFycmF5Om50LmluaXRTZWdtZW50KFt0XSksbWV0YWRhdGE6e2NoYW5uZWxDb3VudDp0LmNoYW5uZWxDb3VudH19LGYmJihpPWE9b1swXS5wdHMtdC5pbnB1dFRpbWVTY2FsZSpyKSksZS5zcHMmJmUucHBzJiZzLmxlbmd0aCl7dmFyIGM9ZS5pbnB1dFRpbWVTY2FsZTtlLnRpbWVzY2FsZT1jLHUudmlkZW89e2NvbnRhaW5lcjoidmlkZW8vbXA0Iixjb2RlYzplLmNvZGVjLGluaXRTZWdtZW50Om50LmluaXRTZWdtZW50KFtlXSksbWV0YWRhdGE6e3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fX0sZiYmKGk9TWF0aC5taW4oaSxzWzBdLnB0cy1jKnIpLGE9TWF0aC5taW4oYSxzWzBdLmR0cy1jKnIpLHRoaXMub2JzZXJ2ZXIudHJpZ2dlcihELmEuSU5JVF9QVFNfRk9VTkQse2luaXRQVFM6aX0pKX1PYmplY3Qua2V5cyh1KS5sZW5ndGg/KG4udHJpZ2dlcihELmEuRlJBR19QQVJTSU5HX0lOSVRfU0VHTUVOVCxoKSx0aGlzLklTR2VuZXJhdGVkPSEwLGYmJih0aGlzLl9pbml0UFRTPWksdGhpcy5faW5pdERUUz1hKSk6bi50cmlnZ2VyKEQuYS5FUlJPUix7dHlwZTpPLmIuTUVESUFfRVJST1IsZGV0YWlsczpPLmEuRlJBR19QQVJTSU5HX0VSUk9SLGZhdGFsOiExLHJlYXNvbjoibm8gYXVkaW8vdmlkZW8gc2FtcGxlcyBmb3VuZCJ9KX0sdC5wcm90b3R5cGUucmVtdXhWaWRlbz1mdW5jdGlvbih0LGUscixpLGEpe3ZhciBuLG8scyxsLGQsdSxoLGY9OCxjPXQudGltZXNjYWxlLHA9dC5zYW1wbGVzLHY9W10sZz1wLmxlbmd0aCxtPXRoaXMuX1BUU05vcm1hbGl6ZSx5PXRoaXMuX2luaXREVFMsYj10aGlzLm5leHRBdmNEdHMsRT10aGlzLmlzU2FmYXJpO0UmJihyfD1wLmxlbmd0aCYmYiYmKGEmJk1hdGguYWJzKGUtYi9jKTwuMXx8TWF0aC5hYnMocFswXS5wdHMtYi15KTxjLzUpKSxyfHwoYj1lKmMpLHAuZm9yRWFjaChmdW5jdGlvbih0KXt0LnB0cz1tKHQucHRzLXksYiksdC5kdHM9bSh0LmR0cy15LGIpfSkscC5zb3J0KGZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5kdHMtZS5kdHMsaT10LnB0cy1lLnB0cztyZXR1cm4gcnx8KGl8fHQuaWQtZS5pZCl9KTt2YXIgUj1wLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heChNYXRoLm1pbih0LGUucHRzLWUuZHRzKSwtMThlMyl9LDApO2lmKFI8MCl7TS5iLndhcm4oIlBUUyA8IERUUyBkZXRlY3RlZCBpbiB2aWRlbyBzYW1wbGVzLCBzaGlmdGluZyBEVFMgYnkgIitNYXRoLnJvdW5kKFIvOTApKyIgbXMgdG8gb3ZlcmNvbWUgdGhpcyBpc3N1ZSIpO2Zvcih2YXIgQT0wO0E8cC5sZW5ndGg7QSsrKXBbQV0uZHRzKz1SfXZhciBUPXBbMF07ZD1NYXRoLm1heChULmR0cywwKSxsPU1hdGgubWF4KFQucHRzLDApO3ZhciBTPU1hdGgucm91bmQoKGQtYikvOTApO3ImJlMmJihTPjE/TS5iLmxvZygiQVZDOiIrUysiIG1zIGhvbGUgYmV0d2VlbiBmcmFnbWVudHMgZGV0ZWN0ZWQsZmlsbGluZyBpdCIpOlM8LTEmJk0uYi5sb2coIkFWQzoiKy1TKyIgbXMgb3ZlcmxhcHBpbmcgYmV0d2VlbiBmcmFnbWVudHMgZGV0ZWN0ZWQiKSxkPWIscFswXS5kdHM9ZCxsPU1hdGgubWF4KGwtUyxiKSxwWzBdLnB0cz1sLE0uYi5sb2coIlZpZGVvL1BUUy9EVFMgYWRqdXN0ZWQ6ICIrTWF0aC5yb3VuZChsLzkwKSsiLyIrTWF0aC5yb3VuZChkLzkwKSsiLGRlbHRhOiIrUysiIG1zIikpLFQ9cFtwLmxlbmd0aC0xXSxoPU1hdGgubWF4KFQuZHRzLDApLHU9TWF0aC5tYXgoVC5wdHMsMCxoKSxFJiYobj1NYXRoLnJvdW5kKChoLWQpLyhwLmxlbmd0aC0xKSkpO2Zvcih2YXIgXz0wLEw9MCx3PTA7dzxnO3crKyl7Zm9yKHZhciB4PXBbd10sST14LnVuaXRzLGs9SS5sZW5ndGgsUD0wLEM9MDtDPGs7QysrKVArPUlbQ10uZGF0YS5sZW5ndGg7TCs9UCxfKz1rLHgubGVuZ3RoPVAseC5kdHM9RT9kK3cqbjpNYXRoLm1heCh4LmR0cyxkKSx4LnB0cz1NYXRoLm1heCh4LnB0cyx4LmR0cyl9dmFyIEY9TCs0Kl8rODt0cnl7bz1uZXcgVWludDhBcnJheShGKX1jYXRjaCh0KXtyZXR1cm4gdm9pZCB0aGlzLm9ic2VydmVyLnRyaWdnZXIoRC5hLkVSUk9SLHt0eXBlOk8uYi5NVVhfRVJST1IsZGV0YWlsczpPLmEuUkVNVVhfQUxMT0NfRVJST1IsZmF0YWw6ITEsYnl0ZXM6RixyZWFzb246ImZhaWwgYWxsb2NhdGluZyB2aWRlbyBtZGF0ICIrRn0pfXZhciBOPW5ldyBEYXRhVmlldyhvLmJ1ZmZlcik7Ti5zZXRVaW50MzIoMCxGKSxvLnNldChudC50eXBlcy5tZGF0LDQpO2Zvcih2YXIgVT0wO1U8ZztVKyspe2Zvcih2YXIgQj1wW1VdLEc9Qi51bml0cyxIPTAsaj12b2lkIDAsVj0wLFc9Ry5sZW5ndGg7VjxXO1YrKyl7dmFyIEs9R1tWXSxZPUsuZGF0YSx6PUsuZGF0YS5ieXRlTGVuZ3RoO04uc2V0VWludDMyKGYseiksZis9NCxvLnNldChZLGYpLGYrPXosSCs9NCt6fWlmKEUpaj1NYXRoLm1heCgwLG4qTWF0aC5yb3VuZCgoQi5wdHMtQi5kdHMpL24pKTtlbHNle2lmKFU8Zy0xKW49cFtVKzFdLmR0cy1CLmR0cztlbHNle3ZhciBYPXRoaXMuY29uZmlnLHE9Qi5kdHMtcFtVPjA/VS0xOlVdLmR0cztpZihYLnN0cmV0Y2hTaG9ydFZpZGVvVHJhY2spe3ZhciBRPVgubWF4QnVmZmVySG9sZSxKPVgubWF4U2Vla0hvbGUsWj1NYXRoLmZsb29yKE1hdGgubWluKFEsSikqYyksJD0oaT9sK2kqYzp0aGlzLm5leHRBdWRpb1B0cyktQi5wdHM7JD5aPyhuPSQtcSxuPDAmJihuPXEpLE0uYi5sb2coIkl0IGlzIGFwcHJveGltYXRlbHkgIiskLzkwKyIgbXMgdG8gdGhlIG5leHQgc2VnbWVudDsgdXNpbmcgZHVyYXRpb24gIituLzkwKyIgbXMgZm9yIHRoZSBsYXN0IHZpZGVvIGZyYW1lLiIpKTpuPXF9ZWxzZSBuPXF9aj1NYXRoLnJvdW5kKEIucHRzLUIuZHRzKX12LnB1c2goe3NpemU6SCxkdXJhdGlvbjpuLGN0czpqLGZsYWdzOntpc0xlYWRpbmc6MCxpc0RlcGVuZGVkT246MCxoYXNSZWR1bmRhbmN5OjAsZGVncmFkUHJpbzowLGRlcGVuZHNPbjpCLmtleT8yOjEsaXNOb25TeW5jOkIua2V5PzA6MX19KX10aGlzLm5leHRBdmNEdHM9aCtuO3ZhciB0dD10LmRyb3BwZWQ7aWYodC5sZW49MCx0Lm5iTmFsdT0wLHQuZHJvcHBlZD0wLHYubGVuZ3RoJiZuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiY2hyb21lIik+LTEpe3ZhciBldD12WzBdLmZsYWdzO2V0LmRlcGVuZHNPbj0yLGV0LmlzTm9uU3luYz0wfXQuc2FtcGxlcz12LHM9bnQubW9vZih0LnNlcXVlbmNlTnVtYmVyKyssZCx0KSx0LnNhbXBsZXM9W107dmFyIHJ0PXtkYXRhMTpzLGRhdGEyOm8sc3RhcnRQVFM6bC9jLGVuZFBUUzoodStuKS9jLHN0YXJ0RFRTOmQvYyxlbmREVFM6dGhpcy5uZXh0QXZjRHRzL2MsdHlwZToidmlkZW8iLG5iOnYubGVuZ3RoLGRyb3BwZWQ6dHR9O3JldHVybiB0aGlzLm9ic2VydmVyLnRyaWdnZXIoRC5hLkZSQUdfUEFSU0lOR19EQVRBLHJ0KSxydH0sdC5wcm90b3R5cGUucmVtdXhBdWRpbz1mdW5jdGlvbih0LGUscixpKXt2YXIgYSxuLG8scyxsLGQsdSxoPXQuaW5wdXRUaW1lU2NhbGUsZj10LnRpbWVzY2FsZSxjPWgvZixwPXQuaXNBQUM/MTAyNDoxMTUyLHY9cCpjLGc9dGhpcy5fUFRTTm9ybWFsaXplLG09dGhpcy5faW5pdERUUyx5PSF0LmlzQUFDJiZ0aGlzLnR5cGVTdXBwb3J0ZWQubXBlZyxiPXQuc2FtcGxlcyxFPVtdLFI9dGhpcy5uZXh0QXVkaW9QdHM7aWYocnw9Yi5sZW5ndGgmJlImJihpJiZNYXRoLmFicyhlLVIvaCk8LjF8fE1hdGguYWJzKGJbMF0ucHRzLVItbSk8MjAqdikscnx8KFI9ZSpoKSxiLmZvckVhY2goZnVuY3Rpb24odCl7dC5wdHM9dC5kdHM9Zyh0LnB0cy1tLFIpfSksYi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucHRzLWUucHRzfSksaSYmdC5pc0FBQylmb3IodmFyIEE9MCxUPVI7QTxiLmxlbmd0aDspe3ZhciBTLF89YltBXSxMPV8ucHRzO1M9TC1UO3ZhciB3PU1hdGguYWJzKDFlMypTL2gpO2lmKFM8PS12KU0uYi53YXJuKCJEcm9wcGluZyAxIGF1ZGlvIGZyYW1lIEAgIisoVC9oKS50b0ZpeGVkKDMpKyJzIGR1ZSB0byAiK3crIiBtcyBvdmVybGFwLiIpLGIuc3BsaWNlKEEsMSksdC5sZW4tPV8udW5pdC5sZW5ndGg7ZWxzZSBpZihTPj12JiZ3PDFlNCYmVCl7dmFyIHg9TWF0aC5yb3VuZChTL3YpO00uYi53YXJuKCJJbmplY3RpbmcgIit4KyIgYXVkaW8gZnJhbWUgQCAiKyhUL2gpLnRvRml4ZWQoMykrInMgZHVlIHRvICIrTWF0aC5yb3VuZCgxZTMqUy9oKSsiIG1zIGdhcC4iKTtmb3IodmFyIEk9MDtJPHg7SSsrKXt2YXIgaz1NYXRoLm1heChULDApO289cnQuZ2V0U2lsZW50RnJhbWUodC5tYW5pZmVzdENvZGVjfHx0LmNvZGVjLHQuY2hhbm5lbENvdW50KSxvfHwoTS5iLmxvZygiVW5hYmxlIHRvIGdldCBzaWxlbnQgZnJhbWUgZm9yIGdpdmVuIGF1ZGlvIGNvZGVjOyBkdXBsaWNhdGluZyBsYXN0IGZyYW1lIGluc3RlYWQuIiksbz1fLnVuaXQuc3ViYXJyYXkoKSksYi5zcGxpY2UoQSwwLHt1bml0Om8scHRzOmssZHRzOmt9KSx0Lmxlbis9by5sZW5ndGgsVCs9dixBKyt9Xy5wdHM9Xy5kdHM9VCxUKz12LEErK31lbHNlIE1hdGguYWJzKFMpLF8ucHRzPV8uZHRzPVQsVCs9dixBKyt9Zm9yKHZhciBQPTAsQz1iLmxlbmd0aDtQPEM7UCsrKXt2YXIgRj1iW1BdLE49Ri51bml0LFU9Ri5wdHM7aWYodm9pZCAwIT09dSluLmR1cmF0aW9uPU1hdGgucm91bmQoKFUtdSkvYyk7ZWxzZXt2YXIgQj1NYXRoLnJvdW5kKDFlMyooVS1SKS9oKSxHPTA7aWYociYmdC5pc0FBQyYmQil7aWYoQj4wJiZCPDFlNClHPU1hdGgucm91bmQoKFUtUikvdiksTS5iLmxvZyhCKyIgbXMgaG9sZSBiZXR3ZWVuIEFBQyBzYW1wbGVzIGRldGVjdGVkLGZpbGxpbmcgaXQiKSxHPjAmJihvPXJ0LmdldFNpbGVudEZyYW1lKHQubWFuaWZlc3RDb2RlY3x8dC5jb2RlYyx0LmNoYW5uZWxDb3VudCksb3x8KG89Ti5zdWJhcnJheSgpKSx0Lmxlbis9RypvLmxlbmd0aCk7ZWxzZSBpZihCPC0xMil7TS5iLmxvZygiZHJvcCBvdmVybGFwcGluZyBBQUMgc2FtcGxlLCBleHBlY3RlZC9wYXJzZWQvZGVsdGE6IisoUi9oKS50b0ZpeGVkKDMpKyJzLyIrKFUvaCkudG9GaXhlZCgzKSsicy8iKy1CKyJtcyIpLHQubGVuLT1OLmJ5dGVMZW5ndGg7Y29udGludWV9VT1SfWlmKGQ9TWF0aC5tYXgoMCxVKSwhKHQubGVuPjApKXJldHVybjt2YXIgSD15P3QubGVuOnQubGVuKzg7YT15PzA6ODt0cnl7cz1uZXcgVWludDhBcnJheShIKX1jYXRjaCh0KXtyZXR1cm4gdm9pZCB0aGlzLm9ic2VydmVyLnRyaWdnZXIoRC5hLkVSUk9SLHt0eXBlOk8uYi5NVVhfRVJST1IsZGV0YWlsczpPLmEuUkVNVVhfQUxMT0NfRVJST1IsZmF0YWw6ITEsYnl0ZXM6SCxyZWFzb246ImZhaWwgYWxsb2NhdGluZyBhdWRpbyBtZGF0ICIrSH0pfWlmKCF5KXtuZXcgRGF0YVZpZXcocy5idWZmZXIpLnNldFVpbnQzMigwLEgpLHMuc2V0KG50LnR5cGVzLm1kYXQsNCl9Zm9yKHZhciBqPTA7ajxHO2orKylvPXJ0LmdldFNpbGVudEZyYW1lKHQubWFuaWZlc3RDb2RlY3x8dC5jb2RlYyx0LmNoYW5uZWxDb3VudCksb3x8KE0uYi5sb2coIlVuYWJsZSB0byBnZXQgc2lsZW50IGZyYW1lIGZvciBnaXZlbiBhdWRpbyBjb2RlYzsgZHVwbGljYXRpbmcgdGhpcyBmcmFtZSBpbnN0ZWFkLiIpLG89Ti5zdWJhcnJheSgpKSxzLnNldChvLGEpLGErPW8uYnl0ZUxlbmd0aCxuPXtzaXplOm8uYnl0ZUxlbmd0aCxjdHM6MCxkdXJhdGlvbjoxMDI0LGZsYWdzOntpc0xlYWRpbmc6MCxpc0RlcGVuZGVkT246MCxoYXNSZWR1bmRhbmN5OjAsZGVncmFkUHJpbzowLGRlcGVuZHNPbjoxfX0sRS5wdXNoKG4pfXMuc2V0KE4sYSk7dmFyIFY9Ti5ieXRlTGVuZ3RoO2ErPVYsbj17c2l6ZTpWLGN0czowLGR1cmF0aW9uOjAsZmxhZ3M6e2lzTGVhZGluZzowLGlzRGVwZW5kZWRPbjowLGhhc1JlZHVuZGFuY3k6MCxkZWdyYWRQcmlvOjAsZGVwZW5kc09uOjF9fSxFLnB1c2gobiksdT1VfXZhciBXPTAsSz1FLmxlbmd0aDtpZihLPj0yJiYoVz1FW0stMl0uZHVyYXRpb24sbi5kdXJhdGlvbj1XKSxLKXt0aGlzLm5leHRBdWRpb1B0cz1SPXUrYypXLHQubGVuPTAsdC5zYW1wbGVzPUUsbD15P25ldyBVaW50OEFycmF5Om50Lm1vb2YodC5zZXF1ZW5jZU51bWJlcisrLGQvYyx0KSx0LnNhbXBsZXM9W107dmFyIFk9ZC9oLHo9Ui9oLFg9e2RhdGExOmwsZGF0YTI6cyxzdGFydFBUUzpZLGVuZFBUUzp6LHN0YXJ0RFRTOlksZW5kRFRTOnosdHlwZToiYXVkaW8iLG5iOkt9O3JldHVybiB0aGlzLm9ic2VydmVyLnRyaWdnZXIoRC5hLkZSQUdfUEFSU0lOR19EQVRBLFgpLFh9cmV0dXJuIG51bGx9LHQucHJvdG90eXBlLnJlbXV4RW1wdHlBdWRpbz1mdW5jdGlvbih0LGUscixpKXt2YXIgYT10LmlucHV0VGltZVNjYWxlLG49dC5zYW1wbGVyYXRlP3Quc2FtcGxlcmF0ZTphLG89YS9uLHM9dGhpcy5uZXh0QXVkaW9QdHMsbD0odm9pZCAwIT09cz9zOmkuc3RhcnREVFMqYSkrdGhpcy5faW5pdERUUyxkPWkuZW5kRFRTKmErdGhpcy5faW5pdERUUyx1PTEwMjQqbyxoPU1hdGguY2VpbCgoZC1sKS91KSxmPXJ0LmdldFNpbGVudEZyYW1lKHQubWFuaWZlc3RDb2RlY3x8dC5jb2RlYyx0LmNoYW5uZWxDb3VudCk7aWYoTS5iLndhcm4oInJlbXV4IGVtcHR5IEF1ZGlvIiksIWYpcmV0dXJuIHZvaWQgTS5iLnRyYWNlKCJVbmFibGUgdG8gcmVtdXhFbXB0eUF1ZGlvIHNpbmNlIHdlIHdlcmUgdW5hYmxlIHRvIGdldCBhIHNpbGVudCBmcmFtZSBmb3IgZ2l2ZW4gYXVkaW8gY29kZWMhIik7Zm9yKHZhciBjPVtdLHA9MDtwPGg7cCsrKXt2YXIgdj1sK3AqdTtjLnB1c2goe3VuaXQ6ZixwdHM6dixkdHM6dn0pLHQubGVuKz1mLmxlbmd0aH10LnNhbXBsZXM9Yyx0aGlzLnJlbXV4QXVkaW8odCxlLHIpfSx0LnByb3RvdHlwZS5yZW11eElEMz1mdW5jdGlvbih0LGUpe3ZhciByLGk9dC5zYW1wbGVzLmxlbmd0aCxhPXQuaW5wdXRUaW1lU2NhbGUsbj10aGlzLl9pbml0UFRTLG89dGhpcy5faW5pdERUUztpZihpKXtmb3IodmFyIHM9MDtzPGk7cysrKXI9dC5zYW1wbGVzW3NdLHIucHRzPShyLnB0cy1uKS9hLHIuZHRzPShyLmR0cy1vKS9hO3RoaXMub2JzZXJ2ZXIudHJpZ2dlcihELmEuRlJBR19QQVJTSU5HX01FVEFEQVRBLHtzYW1wbGVzOnQuc2FtcGxlc30pfXQuc2FtcGxlcz1bXSxlPWV9LHQucHJvdG90eXBlLnJlbXV4VGV4dD1mdW5jdGlvbih0LGUpe3Quc2FtcGxlcy5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucHRzLWUucHRzfSk7dmFyIHIsaT10LnNhbXBsZXMubGVuZ3RoLGE9dC5pbnB1dFRpbWVTY2FsZSxuPXRoaXMuX2luaXRQVFM7aWYoaSl7Zm9yKHZhciBvPTA7bzxpO28rKylyPXQuc2FtcGxlc1tvXSxyLnB0cz0oci5wdHMtbikvYTt0aGlzLm9ic2VydmVyLnRyaWdnZXIoRC5hLkZSQUdfUEFSU0lOR19VU0VSREFUQSx7c2FtcGxlczp0LnNhbXBsZXN9KX10LnNhbXBsZXM9W10sZT1lfSx0LnByb3RvdHlwZS5fUFRTTm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7dmFyIHI7aWYodm9pZCAwPT09ZSlyZXR1cm4gdDtmb3Iocj1lPHQ/LTg1ODk5MzQ1OTI6ODU4OTkzNDU5MjtNYXRoLmFicyh0LWUpPjQyOTQ5NjcyOTY7KXQrPXI7cmV0dXJuIHR9LHR9KCksc3Q9b3QsbHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe0wodGhpcyx0KSx0aGlzLm9ic2VydmVyPWV9cmV0dXJuIHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLnJlc2V0VGltZVN0YW1wPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5yZXNldEluaXRTZWdtZW50PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5yZW11eD1mdW5jdGlvbih0LGUscixpLGEsbixvLHMpe3ZhciBsPXRoaXMub2JzZXJ2ZXIsZD0iIjt0JiYoZCs9ImF1ZGlvIiksZSYmKGQrPSJ2aWRlbyIpLGwudHJpZ2dlcihELmEuRlJBR19QQVJTSU5HX0RBVEEse2RhdGExOnMsc3RhcnRQVFM6YSxzdGFydERUUzphLHR5cGU6ZCxuYjoxLGRyb3BwZWQ6MH0pLGwudHJpZ2dlcihELmEuRlJBR19QQVJTRUQpfSx0fSgpLGR0PWx0LHV0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIsaSxhKXt3KHRoaXMsdCksdGhpcy5vYnNlcnZlcj1lLHRoaXMudHlwZVN1cHBvcnRlZD1yLHRoaXMuY29uZmlnPWksdGhpcy52ZW5kb3I9YX1yZXR1cm4gdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZGVtdXhlcjt0JiZ0LmRlc3Ryb3koKX0sdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUscixpLGEsbixvLHMsbCxkLHUsaCl7aWYodC5ieXRlTGVuZ3RoPjAmJm51bGwhPWUmJm51bGwhPWUua2V5JiYiQUVTLTEyOCI9PT1lLm1ldGhvZCl7dmFyIGY9dGhpcy5kZWNyeXB0ZXI7bnVsbD09ZiYmKGY9dGhpcy5kZWNyeXB0ZXI9bmV3IFUodGhpcy5vYnNlcnZlcix0aGlzLmNvbmZpZykpO3ZhciBjLHA9dGhpczt0cnl7Yz1wZXJmb3JtYW5jZS5ub3coKX1jYXRjaCh0KXtjPURhdGUubm93KCl9Zi5kZWNyeXB0KHQsZS5rZXkuYnVmZmVyLGUuaXYuYnVmZmVyLGZ1bmN0aW9uKHQpe3ZhciBmO3RyeXtmPXBlcmZvcm1hbmNlLm5vdygpfWNhdGNoKHQpe2Y9RGF0ZS5ub3coKX1wLm9ic2VydmVyLnRyaWdnZXIoRC5hLkZSQUdfREVDUllQVEVELHtzdGF0czp7dHN0YXJ0OmMsdGRlY3J5cHQ6Zn19KSxwLnB1c2hEZWNyeXB0ZWQobmV3IFVpbnQ4QXJyYXkodCksZSxuZXcgVWludDhBcnJheShyKSxpLGEsbixvLHMsbCxkLHUsaCl9KX1lbHNlIHRoaXMucHVzaERlY3J5cHRlZChuZXcgVWludDhBcnJheSh0KSxlLG5ldyBVaW50OEFycmF5KHIpLGksYSxuLG8scyxsLGQsdSxoKX0sdC5wcm90b3R5cGUucHVzaERlY3J5cHRlZD1mdW5jdGlvbih0LGUscixpLGEsbixvLHMsbCxkLHUsaCl7dmFyIGY9dGhpcy5kZW11eGVyO2lmKCFmfHxvJiYhdGhpcy5wcm9iZSh0KSl7Zm9yKHZhciBjPXRoaXMub2JzZXJ2ZXIscD10aGlzLnR5cGVTdXBwb3J0ZWQsdj10aGlzLmNvbmZpZyxnPVt7ZGVtdXg6SCxyZW11eDpzdH0se2RlbXV4OnR0LHJlbXV4OnN0fSx7ZGVtdXg6WixyZW11eDpzdH0se2RlbXV4OlcscmVtdXg6ZHR9XSxtPTAseT1nLmxlbmd0aDttPHk7bSsrKXt2YXIgYj1nW21dLEU9Yi5kZW11eC5wcm9iZTtpZihFKHQpKXt2YXIgUj10aGlzLnJlbXV4ZXI9bmV3IGIucmVtdXgoYyx2LHAsdGhpcy52ZW5kb3IpO2Y9bmV3IGIuZGVtdXgoYyxSLHYscCksdGhpcy5wcm9iZT1FO2JyZWFrfX1pZighZilyZXR1cm4gdm9pZCBjLnRyaWdnZXIoRC5hLkVSUk9SLHt0eXBlOk8uYi5NRURJQV9FUlJPUixkZXRhaWxzOk8uYS5GUkFHX1BBUlNJTkdfRVJST1IsZmF0YWw6ITAscmVhc29uOiJubyBkZW11eCBtYXRjaGluZyB3aXRoIGNvbnRlbnQgZm91bmQifSk7dGhpcy5kZW11eGVyPWZ9dmFyIEE9dGhpcy5yZW11eGVyOyhvfHxzKSYmKGYucmVzZXRJbml0U2VnbWVudChyLGksYSxkKSxBLnJlc2V0SW5pdFNlZ21lbnQoKSksbyYmKGYucmVzZXRUaW1lU3RhbXAoaCksQS5yZXNldFRpbWVTdGFtcChoKSksImZ1bmN0aW9uIj09dHlwZW9mIGYuc2V0RGVjcnlwdERhdGEmJmYuc2V0RGVjcnlwdERhdGEoZSksZi5hcHBlbmQodCxuLGwsdSl9LHR9KCk7ZS5hPXV0fSxmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBhKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbih0LGUpe3ZhciByPWx0W2VdO3JldHVybiEhciYmITA9PT1yW3Quc2xpY2UoMCw0KV19ZnVuY3Rpb24gbyh0KXtyZXR1cm4gTWVkaWFTb3VyY2UuaXNUeXBlU3VwcG9ydGVkKCd2aWRlby9tcDQ7Y29kZWNzPSInK3QrJyInKX1mdW5jdGlvbiBzKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gbCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9ZnVuY3Rpb24gZCh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHUodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBoKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gZih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9ZnVuY3Rpb24gYyh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHAodCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiB2KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1mdW5jdGlvbiBnKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbSh0LGUscil7dmFyIGk9dFtlXSxhPXRbcl0sbj1hLnN0YXJ0UFRTO2lzTmFOKG4pP2Euc3RhcnQ9cj5lP2kuc3RhcnQraS5kdXJhdGlvbjpNYXRoLm1heChpLnN0YXJ0LWEuZHVyYXRpb24sMCk6cj5lPyhpLmR1cmF0aW9uPW4taS5zdGFydCxpLmR1cmF0aW9uPDAmJnR0LmIud2FybigibmVnYXRpdmUgZHVyYXRpb24gY29tcHV0ZWQgZm9yIGZyYWcgIitpLnNuKyIsbGV2ZWwgIitpLmxldmVsKyIsIHRoZXJlIHNob3VsZCBiZSBzb21lIGR1cmF0aW9uIGRyaWZ0IGJldHdlZW4gcGxheWxpc3QgYW5kIGZyYWdtZW50ISIpKTooYS5kdXJhdGlvbj1pLnN0YXJ0LW4sYS5kdXJhdGlvbjwwJiZ0dC5iLndhcm4oIm5lZ2F0aXZlIGR1cmF0aW9uIGNvbXB1dGVkIGZvciBmcmFnICIrYS5zbisiLGxldmVsICIrYS5sZXZlbCsiLCB0aGVyZSBzaG91bGQgYmUgc29tZSBkdXJhdGlvbiBkcmlmdCBiZXR3ZWVuIHBsYXlsaXN0IGFuZCBmcmFnbWVudCEiKSl9ZnVuY3Rpb24geSh0LGUscixpLGEsbil7aWYoIWlzTmFOKGUuc3RhcnRQVFMpKXt2YXIgbz1NYXRoLmFicyhlLnN0YXJ0UFRTLXIpO2lzTmFOKGUuZGVsdGFQVFMpP2UuZGVsdGFQVFM9bzplLmRlbHRhUFRTPU1hdGgubWF4KG8sZS5kZWx0YVBUUykscj1NYXRoLm1pbihyLGUuc3RhcnRQVFMpLGk9TWF0aC5tYXgoaSxlLmVuZFBUUyksYT1NYXRoLm1pbihhLGUuc3RhcnREVFMpLG49TWF0aC5tYXgobixlLmVuZERUUyl9dmFyIHM9ci1lLnN0YXJ0O2Uuc3RhcnQ9ZS5zdGFydFBUUz1yLGUuZW5kUFRTPWksZS5zdGFydERUUz1hLGUuZW5kRFRTPW4sZS5kdXJhdGlvbj1pLXI7dmFyIGw9ZS5zbjtpZighdHx8bDx0LnN0YXJ0U058fGw+dC5lbmRTTilyZXR1cm4gMDt2YXIgZCx1LGg7Zm9yKGQ9bC10LnN0YXJ0U04sdT10LmZyYWdtZW50cyx1W2RdPWUsaD1kO2g+MDtoLS0pbSh1LGgsaC0xKTtmb3IoaD1kO2g8dS5sZW5ndGgtMTtoKyspbSh1LGgsaCsxKTtyZXR1cm4gdC5QVFNLbm93bj0hMCxzfWZ1bmN0aW9uIGIodCxlKXt2YXIgcixpPU1hdGgubWF4KHQuc3RhcnRTTixlLnN0YXJ0U04pLWUuc3RhcnRTTixhPU1hdGgubWluKHQuZW5kU04sZS5lbmRTTiktZS5zdGFydFNOLG49ZS5zdGFydFNOLXQuc3RhcnRTTixvPXQuZnJhZ21lbnRzLHM9ZS5mcmFnbWVudHMsbD0wO2lmKGE8aSlyZXR1cm4gdm9pZChlLlBUU0tub3duPSExKTtmb3IodmFyIGQ9aTtkPD1hO2QrKyl7dmFyIHU9b1tuK2RdLGg9c1tkXTtoJiZ1JiYobD11LmNjLWguY2MsaXNOYU4odS5zdGFydFBUUyl8fChoLnN0YXJ0PWguc3RhcnRQVFM9dS5zdGFydFBUUyxoLmVuZFBUUz11LmVuZFBUUyxoLmR1cmF0aW9uPXUuZHVyYXRpb24saC5iYWNrdHJhY2tlZD11LmJhY2t0cmFja2VkLGguZHJvcHBlZD11LmRyb3BwZWQscj1oKSl9aWYobClmb3IodHQuYi5sb2coImRpc2NvbnRpbnVpdHkgc2xpZGluZyBmcm9tIHBsYXlsaXN0LCB0YWtlIGRyaWZ0IGludG8gYWNjb3VudCIpLGQ9MDtkPHMubGVuZ3RoO2QrKylzW2RdLmNjKz1sO2lmKHIpeShlLHIsci5zdGFydFBUUyxyLmVuZFBUUyxyLnN0YXJ0RFRTLHIuZW5kRFRTKTtlbHNlIGlmKG4+PTAmJm48by5sZW5ndGgpe3ZhciBmPW9bbl0uc3RhcnQ7Zm9yKGQ9MDtkPHMubGVuZ3RoO2QrKylzW2RdLnN0YXJ0Kz1mfWUuUFRTS25vd249dC5QVFNLbm93bn1mdW5jdGlvbiBFKHQsZSl7Zm9yKHZhciByPW51bGwsaT0wO2k8dC5sZW5ndGg7aSs9MSl7dmFyIGE9dFtpXTtpZihhJiZhLmNjPT09ZSl7cj1hO2JyZWFrfX1yZXR1cm4gcn1mdW5jdGlvbiBSKHQsZSxyKXt2YXIgaT0hMTtyZXR1cm4gZSYmZS5kZXRhaWxzJiZyJiYoci5lbmRDQz5yLnN0YXJ0Q0N8fHQmJnQuY2M8ci5zdGFydENDKSYmKGk9ITApLGl9ZnVuY3Rpb24gQSh0LGUpe3ZhciByPXQuZnJhZ21lbnRzLGk9ZS5mcmFnbWVudHM7aWYoIWkubGVuZ3RofHwhci5sZW5ndGgpcmV0dXJuIHZvaWQgdHQuYi5sb2coIk5vIGZyYWdtZW50cyB0byBhbGlnbiIpO3ZhciBhPUUocixpWzBdLmNjKTtyZXR1cm4hYXx8YSYmIWEuc3RhcnRQVFM/dm9pZCB0dC5iLmxvZygiTm8gZnJhZyBpbiBwcmV2aW91cyBsZXZlbCB0byBhbGlnbiBvbiIpOmF9ZnVuY3Rpb24gVCh0LGUpe2UuZnJhZ21lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHI9ZS5zdGFydCt0O2Uuc3RhcnQ9ZS5zdGFydFBUUz1yLGUuZW5kUFRTPXIrZS5kdXJhdGlvbn19KSxlLlBUU0tub3duPSEwfWZ1bmN0aW9uIFModCxlLHIpe2lmKFIodCxlLHIpKXt2YXIgaT1BKGUuZGV0YWlscyxyKTtpJiYodHQuYi5sb2coIkFkanVzdGluZyBQVFMgdXNpbmcgbGFzdCBsZXZlbCBkdWUgdG8gQ0MgaW5jcmVhc2Ugd2l0aGluIGN1cnJlbnQgbGV2ZWwiKSxUKGkuc3RhcnQscikpfWlmKCExPT09ci5QVFNLbm93biYmZSYmZS5kZXRhaWxzKXt2YXIgYT1lLmRldGFpbHMucHJvZ3JhbURhdGVUaW1lLG49ci5wcm9ncmFtRGF0ZVRpbWUsbz0obi1hKS8xZTMrZS5kZXRhaWxzLmZyYWdtZW50c1swXS5zdGFydDtpc05hTihvKXx8KHR0LmIubG9nKCJhZGp1c3RpbmcgUFRTIHVzaW5nIHByb2dyYW1EYXRlVGltZSBkZWx0YSwgc2xpZGluZzoiK28udG9GaXhlZCgzKSksVChvLHIpKX19ZnVuY3Rpb24gXyh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEwodCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiB3KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1mdW5jdGlvbiBEKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gTyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIHgodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIEkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBrKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gUCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9ZnVuY3Rpb24gQyh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEYodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBNKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gTih0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIFUodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIEIodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBHKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gSCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9ZnVuY3Rpb24gaih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIFYodCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiBXKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1mdW5jdGlvbiBLKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gWSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIHoodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIFgodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBxKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBRPXIoNiksSj1yLm4oUSksWj1yKDEpLCQ9cigyKSx0dD1yKDApLGV0PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxydD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7aSh0aGlzLHQpLHRoaXMuaGxzPWUsdGhpcy5vbkV2ZW50PXRoaXMub25FdmVudC5iaW5kKHRoaXMpO2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLGE9QXJyYXkocj4xP3ItMTowKSxuPTE7bjxyO24rKylhW24tMV09YXJndW1lbnRzW25dO3RoaXMuaGFuZGxlZEV2ZW50cz1hLHRoaXMudXNlR2VuZXJpY0hhbmRsZXI9ITAsdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpfXJldHVybiB0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCl9LHQucHJvdG90eXBlLmlzRXZlbnRIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIm9iamVjdCI9PT1ldCh0aGlzLmhhbmRsZWRFdmVudHMpJiZ0aGlzLmhhbmRsZWRFdmVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vbkV2ZW50fSx0LnByb3RvdHlwZS5yZWdpc3Rlckxpc3RlbmVycz1mdW5jdGlvbigpe3RoaXMuaXNFdmVudEhhbmRsZXIoKSYmdGhpcy5oYW5kbGVkRXZlbnRzLmZvckVhY2goZnVuY3Rpb24odCl7aWYoImhsc0V2ZW50R2VuZXJpYyI9PT10KXRocm93IG5ldyBFcnJvcigiRm9yYmlkZGVuIGV2ZW50IG5hbWU6ICIrdCk7dGhpcy5obHMub24odCx0aGlzLm9uRXZlbnQpfSx0aGlzKX0sdC5wcm90b3R5cGUudW5yZWdpc3Rlckxpc3RlbmVycz1mdW5jdGlvbigpe3RoaXMuaXNFdmVudEhhbmRsZXIoKSYmdGhpcy5oYW5kbGVkRXZlbnRzLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5obHMub2ZmKHQsdGhpcy5vbkV2ZW50KX0sdGhpcyl9LHQucHJvdG90eXBlLm9uRXZlbnQ9ZnVuY3Rpb24odCxlKXt0aGlzLm9uRXZlbnRHZW5lcmljKHQsZSl9LHQucHJvdG90eXBlLm9uRXZlbnRHZW5lcmljPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCxlKXt2YXIgcj0ib24iK3QucmVwbGFjZSgiaGxzIiwiIik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbcl0pdGhyb3cgbmV3IEVycm9yKCJFdmVudCAiK3QrIiBoYXMgbm8gZ2VuZXJpYyBoYW5kbGVyIGluIHRoaXMgIit0aGlzLmNvbnN0cnVjdG9yLm5hbWUrIiBjbGFzcyAodHJpZWQgIityKyIpIik7cmV0dXJuIHRoaXNbcl0uYmluZCh0aGlzLGUpfTt0cnl7ci5jYWxsKHRoaXMsdCxlKS5jYWxsKCl9Y2F0Y2goZSl7dHQuYi5lcnJvcigiaW50ZXJuYWwgZXJyb3IgaGFwcGVuZWQgd2hpbGUgcHJvY2Vzc2luZyAiK3QrIjoiK2UubWVzc2FnZSksdGhpcy5obHMudHJpZ2dlcihaLmEuRVJST1Ise3R5cGU6JC5iLk9USEVSX0VSUk9SLGRldGFpbHM6JC5hLklOVEVSTkFMX0VYQ0VQVElPTixmYXRhbDohMSxldmVudDp0LGVycjplfSl9fSx0fSgpLGl0PXJ0LGF0PS9eKFxkKyl4KFxkKykkLyxudD0vXHMqKC4rPylccyo9KCg/OlwiLio/XCIpfC4qPykoPzosfCQpL2csb3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe2EodGhpcyx0KSwic3RyaW5nIj09dHlwZW9mIGUmJihlPXQucGFyc2VBdHRyTGlzdChlKSk7Zm9yKHZhciByIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShyKSYmKHRoaXNbcl09ZVtyXSl9cmV0dXJuIHQucHJvdG90eXBlLmRlY2ltYWxJbnRlZ2VyPWZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlSW50KHRoaXNbdF0sMTApO3JldHVybiBlPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSPzEvMDplfSx0LnByb3RvdHlwZS5oZXhhZGVjaW1hbEludGVnZXI9ZnVuY3Rpb24odCl7aWYodGhpc1t0XSl7dmFyIGU9KHRoaXNbdF18fCIweCIpLnNsaWNlKDIpO2U9KDEmZS5sZW5ndGg/IjAiOiIiKStlO2Zvcih2YXIgcj1uZXcgVWludDhBcnJheShlLmxlbmd0aC8yKSxpPTA7aTxlLmxlbmd0aC8yO2krKylyW2ldPXBhcnNlSW50KGUuc2xpY2UoMippLDIqaSsyKSwxNik7cmV0dXJuIHJ9cmV0dXJuIG51bGx9LHQucHJvdG90eXBlLmhleGFkZWNpbWFsSW50ZWdlckFzTnVtYmVyPWZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlSW50KHRoaXNbdF0sMTYpO3JldHVybiBlPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSPzEvMDplfSx0LnByb3RvdHlwZS5kZWNpbWFsRmxvYXRpbmdQb2ludD1mdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0aGlzW3RdKX0sdC5wcm90b3R5cGUuZW51bWVyYXRlZFN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpc1t0XX0sdC5wcm90b3R5cGUuZGVjaW1hbFJlc29sdXRpb249ZnVuY3Rpb24odCl7dmFyIGU9YXQuZXhlYyh0aGlzW3RdKTtpZihudWxsIT09ZSlyZXR1cm57d2lkdGg6cGFyc2VJbnQoZVsxXSwxMCksaGVpZ2h0OnBhcnNlSW50KGVbMl0sMTApfX0sdC5wYXJzZUF0dHJMaXN0PWZ1bmN0aW9uKHQpe3ZhciBlLHI9e307Zm9yKG50Lmxhc3RJbmRleD0wO251bGwhPT0oZT1udC5leGVjKHQpKTspe3ZhciBpPWVbMl07MD09PWkuaW5kZXhPZignIicpJiZpLmxhc3RJbmRleE9mKCciJyk9PT1pLmxlbmd0aC0xJiYoaT1pLnNsaWNlKDEsLTEpKSxyW2VbMV1dPWl9cmV0dXJuIHJ9LHR9KCksc3Q9b3QsbHQ9e2F1ZGlvOnthM2RzOiEwLCJhYy0zIjohMCwiYWMtNCI6ITAsYWxhYzohMCxhbGF3OiEwLGRyYTE6ITAsImR0cysiOiEwLCJkdHMtIjohMCxkdHNjOiEwLGR0c2U6ITAsZHRzaDohMCwiZWMtMyI6ITAsZW5jYTohMCxnNzE5OiEwLGc3MjY6ITAsbTRhZTohMCxtaGExOiEwLG1oYTI6ITAsbWhtMTohMCxtaG0yOiEwLG1scGE6ITAsbXA0YTohMCwicmF3ICI6ITAsT3B1czohMCxzYW1yOiEwLHNhd2I6ITAsc2F3cDohMCxzZXZjOiEwLHNxY3A6ITAsc3NtdjohMCx0d29zOiEwLHVsYXc6ITB9LHZpZGVvOnthdmMxOiEwLGF2YzI6ITAsYXZjMzohMCxhdmM0OiEwLGF2Y3A6ITAsZHJhYzohMCxkdmF2OiEwLGR2aGU6ITAsZW5jdjohMCxoZXYxOiEwLGh2YzE6ITAsbWpwMjohMCxtcDR2OiEwLG12YzE6ITAsbXZjMjohMCxtdmMzOiEwLG12YzQ6ITAscmVzdjohMCxydjYwOiEwLHMyNjM6ITAsc3ZjMTohMCxzdmMyOiEwLCJ2Yy0xIjohMCx2cDA4OiEwLHZwMDk6ITB9fSxkdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1yZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3JldHVybiByJiZ0KGUucHJvdG90eXBlLHIpLGkmJnQoZSxpKSxlfX0oKSx1dD0vI0VYVC1YLVNUUkVBTS1JTkY6KFteXG5ccl0qKVtcclxuXSsoW15cclxuXSspL2csaHQ9LyNFWFQtWC1NRURJQTooLiopL2csZnQ9bmV3IFJlZ0V4cChbLyNFWFRJTkY6KFxkKig/OlwuXGQrKT8pKD86LCguKilccyspPy8uc291cmNlLC98KD8hIykoXFMrKS8uc291cmNlLC98I0VYVC1YLUJZVEVSQU5HRToqKC4rKS8uc291cmNlLC98I0VYVC1YLVBST0dSQU0tREFURS1USU1FOiguKykvLnNvdXJjZSwvfCMuKi8uc291cmNlXS5qb2luKCIiKSwiZyIpLGN0PS8oPzooPzojKEVYVE0zVSkpfCg/OiNFWFQtWC0oUExBWUxJU1QtVFlQRSk6KC4rKSl8KD86I0VYVC1YLShNRURJQS1TRVFVRU5DRSk6ICooXGQrKSl8KD86I0VYVC1YLShUQVJHRVREVVJBVElPTik6ICooXGQrKSl8KD86I0VYVC1YLShLRVkpOiguKykpfCg/OiNFWFQtWC0oU1RBUlQpOiguKykpfCg/OiNFWFQtWC0oRU5ETElTVCkpfCg/OiNFWFQtWC0oRElTQ09OVElOVUlUWS1TRVEpVUVOQ0U6KFxkKykpfCg/OiNFWFQtWC0oRElTKUNPTlRJTlVJVFkpKXwoPzojRVhULVgtKFZFUlNJT04pOihcZCspKXwoPzojRVhULVgtKE1BUCk6KC4rKSl8KD86KCMpKC4qKTooLiopKXwoPzooIykoLiopKSg/Oi4qKVxyP1xuPy8scHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ZCh0aGlzLHQpLHRoaXMubWV0aG9kPW51bGwsdGhpcy5rZXk9bnVsbCx0aGlzLml2PW51bGwsdGhpcy5fdXJpPW51bGx9cmV0dXJuIGR0KHQsW3trZXk6InVyaSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX3VyaSYmdGhpcy5yZWx1cmkmJih0aGlzLl91cmk9Si5hLmJ1aWxkQWJzb2x1dGVVUkwodGhpcy5iYXNldXJpLHRoaXMucmVsdXJpLHthbHdheXNOb3JtYWxpemU6ITB9KSksdGhpcy5fdXJpfX1dKSx0fSgpLHZ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2QodGhpcyx0KSx0aGlzLl91cmw9bnVsbCx0aGlzLl9ieXRlUmFuZ2U9bnVsbCx0aGlzLl9kZWNyeXB0ZGF0YT1udWxsLHRoaXMudGFnTGlzdD1bXX1yZXR1cm4gdC5wcm90b3R5cGUuY3JlYXRlSW5pdGlhbGl6YXRpb25WZWN0b3I9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBVaW50OEFycmF5KDE2KSxyPTEyO3I8MTY7cisrKWVbcl09dD4+OCooMTUtcikmMjU1O3JldHVybiBlfSx0LnByb3RvdHlwZS5mcmFnbWVudERlY3J5cHRkYXRhRnJvbUxldmVsa2V5PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dDtyZXR1cm4gdCYmdC5tZXRob2QmJnQudXJpJiYhdC5pdiYmKHI9bmV3IHB0LHIubWV0aG9kPXQubWV0aG9kLHIuYmFzZXVyaT10LmJhc2V1cmksci5yZWx1cmk9dC5yZWx1cmksci5pdj10aGlzLmNyZWF0ZUluaXRpYWxpemF0aW9uVmVjdG9yKGUpKSxyfSx0LnByb3RvdHlwZS5jbG9uZU9iaj1mdW5jdGlvbih0KXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0KSl9LGR0KHQsW3trZXk6InVybCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX3VybCYmdGhpcy5yZWx1cmwmJih0aGlzLl91cmw9Si5hLmJ1aWxkQWJzb2x1dGVVUkwodGhpcy5iYXNldXJsLHRoaXMucmVsdXJsLHthbHdheXNOb3JtYWxpemU6ITB9KSksdGhpcy5fdXJsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdXJsPXR9fSx7a2V5OiJwcm9ncmFtRGF0ZVRpbWUiLGdldDpmdW5jdGlvbigpe3JldHVybiF0aGlzLl9wcm9ncmFtRGF0ZVRpbWUmJnRoaXMucmF3UHJvZ3JhbURhdGVUaW1lJiYodGhpcy5fcHJvZ3JhbURhdGVUaW1lPW5ldyBEYXRlKERhdGUucGFyc2UodGhpcy5yYXdQcm9ncmFtRGF0ZVRpbWUpKSksdGhpcy5fcHJvZ3JhbURhdGVUaW1lfX0se2tleToiYnl0ZVJhbmdlIixnZXQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fYnl0ZVJhbmdlKXt2YXIgdD10aGlzLl9ieXRlUmFuZ2U9W107aWYodGhpcy5yYXdCeXRlUmFuZ2Upe3ZhciBlPXRoaXMucmF3Qnl0ZVJhbmdlLnNwbGl0KCJAIiwyKTtpZigxPT09ZS5sZW5ndGgpe3ZhciByPXRoaXMubGFzdEJ5dGVSYW5nZUVuZE9mZnNldDt0WzBdPXJ8fDB9ZWxzZSB0WzBdPXBhcnNlSW50KGVbMV0pO3RbMV09cGFyc2VJbnQoZVswXSkrdFswXX19cmV0dXJuIHRoaXMuX2J5dGVSYW5nZX19LHtrZXk6ImJ5dGVSYW5nZVN0YXJ0T2Zmc2V0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ieXRlUmFuZ2VbMF19fSx7a2V5OiJieXRlUmFuZ2VFbmRPZmZzZXQiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVSYW5nZVsxXX19LHtrZXk6ImRlY3J5cHRkYXRhIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVjcnlwdGRhdGF8fCh0aGlzLl9kZWNyeXB0ZGF0YT10aGlzLmZyYWdtZW50RGVjcnlwdGRhdGFGcm9tTGV2ZWxrZXkodGhpcy5sZXZlbGtleSx0aGlzLnNuKSksdGhpcy5fZGVjcnlwdGRhdGF9fV0pLHR9KCksZ3Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShyKXtkKHRoaXMsZSk7dmFyIGk9cyh0aGlzLHQuY2FsbCh0aGlzLHIsWi5hLk1BTklGRVNUX0xPQURJTkcsWi5hLkxFVkVMX0xPQURJTkcsWi5hLkFVRElPX1RSQUNLX0xPQURJTkcsWi5hLlNVQlRJVExFX1RSQUNLX0xPQURJTkcpKTtyZXR1cm4gaS5sb2FkZXJzPXt9LGl9cmV0dXJuIGwoZSx0KSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMubG9hZGVycyl7dmFyIGU9dGhpcy5sb2FkZXJzW3RdO2UmJmUuZGVzdHJveSgpfXRoaXMubG9hZGVycz17fSxpdC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5vbk1hbmlmZXN0TG9hZGluZz1mdW5jdGlvbih0KXt0aGlzLmxvYWQodC51cmwse3R5cGU6Im1hbmlmZXN0In0pfSxlLnByb3RvdHlwZS5vbkxldmVsTG9hZGluZz1mdW5jdGlvbih0KXt0aGlzLmxvYWQodC51cmwse3R5cGU6ImxldmVsIixsZXZlbDp0LmxldmVsLGlkOnQuaWR9KX0sZS5wcm90b3R5cGUub25BdWRpb1RyYWNrTG9hZGluZz1mdW5jdGlvbih0KXt0aGlzLmxvYWQodC51cmwse3R5cGU6ImF1ZGlvVHJhY2siLGlkOnQuaWR9KX0sZS5wcm90b3R5cGUub25TdWJ0aXRsZVRyYWNrTG9hZGluZz1mdW5jdGlvbih0KXt0aGlzLmxvYWQodC51cmwse3R5cGU6InN1YnRpdGxlVHJhY2siLGlkOnQuaWR9KX0sZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMubG9hZGVyc1tlLnR5cGVdO2lmKHIpe3ZhciBpPXIuY29udGV4dDtpZihpJiZpLnVybD09PXQpcmV0dXJuIHZvaWQgdHQuYi50cmFjZSgicGxheWxpc3QgcmVxdWVzdCBvbmdvaW5nIik7dHQuYi53YXJuKCJhYm9ydCBwcmV2aW91cyBsb2FkZXIgZm9yIHR5cGU6IitlLnR5cGUpLHIuYWJvcnQoKX12YXIgYT10aGlzLmhscy5jb25maWcsbj12b2lkIDAsbz12b2lkIDAscz12b2lkIDAsbD12b2lkIDA7Im1hbmlmZXN0Ij09PWUudHlwZT8obj1hLm1hbmlmZXN0TG9hZGluZ01heFJldHJ5LG89YS5tYW5pZmVzdExvYWRpbmdUaW1lT3V0LHM9YS5tYW5pZmVzdExvYWRpbmdSZXRyeURlbGF5LGw9YS5tYW5pZmVzdExvYWRpbmdNYXhSZXRyeVRpbWVvdXQpOihuPWEubGV2ZWxMb2FkaW5nTWF4UmV0cnksbz1hLmxldmVsTG9hZGluZ1RpbWVPdXQscz1hLmxldmVsTG9hZGluZ1JldHJ5RGVsYXksbD1hLmxldmVsTG9hZGluZ01heFJldHJ5VGltZW91dCx0dC5iLmxvZygibG9hZGluZyBwbGF5bGlzdCBmb3IgIitlLnR5cGUrIiAiKyhlLmxldmVsfHxlLmlkKSkpLHI9dGhpcy5sb2FkZXJzW2UudHlwZV09ZS5sb2FkZXI9dm9pZCAwIT09YS5wTG9hZGVyP25ldyBhLnBMb2FkZXIoYSk6bmV3IGEubG9hZGVyKGEpLGUudXJsPXQsZS5yZXNwb25zZVR5cGU9IiI7dmFyIGQ9dm9pZCAwLHU9dm9pZCAwO2Q9e3RpbWVvdXQ6byxtYXhSZXRyeTpuLHJldHJ5RGVsYXk6cyxtYXhSZXRyeURlbGF5Omx9LHU9e29uU3VjY2Vzczp0aGlzLmxvYWRzdWNjZXNzLmJpbmQodGhpcyksb25FcnJvcjp0aGlzLmxvYWRlcnJvci5iaW5kKHRoaXMpLG9uVGltZW91dDp0aGlzLmxvYWR0aW1lb3V0LmJpbmQodGhpcyl9LHIubG9hZChlLGQsdSl9LGUucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gSi5hLmJ1aWxkQWJzb2x1dGVVUkwoZSx0LHthbHdheXNOb3JtYWxpemU6ITB9KX0sZS5wcm90b3R5cGUucGFyc2VNYXN0ZXJQbGF5bGlzdD1mdW5jdGlvbih0LGUpe3ZhciByPVtdLGk9dm9pZCAwO2Zvcih1dC5sYXN0SW5kZXg9MDtudWxsIT0oaT11dC5leGVjKHQpKTspe3ZhciBhPXt9LG89YS5hdHRycz1uZXcgc3QoaVsxXSk7YS51cmw9dGhpcy5yZXNvbHZlKGlbMl0sZSk7dmFyIHM9by5kZWNpbWFsUmVzb2x1dGlvbigiUkVTT0xVVElPTiIpO3MmJihhLndpZHRoPXMud2lkdGgsYS5oZWlnaHQ9cy5oZWlnaHQpLGEuYml0cmF0ZT1vLmRlY2ltYWxJbnRlZ2VyKCJBVkVSQUdFLUJBTkRXSURUSCIpfHxvLmRlY2ltYWxJbnRlZ2VyKCJCQU5EV0lEVEgiKSxhLm5hbWU9by5OQU1FLGZ1bmN0aW9uKHQsZSl7WyJ2aWRlbyIsImF1ZGlvIl0uZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgaT10LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gbih0LHIpfSk7aWYoaS5sZW5ndGgpe3ZhciBhPWkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5sYXN0SW5kZXhPZigiYXZjMSIsMCl8fDA9PT10Lmxhc3RJbmRleE9mKCJtcDRhIiwwKX0pO2VbcisiQ29kZWMiXT1hLmxlbmd0aD4wP2FbMF06aVswXSx0PXQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybi0xPT09aS5pbmRleE9mKHQpfSl9fSksZS51bmtub3duQ29kZWNzPXR9KFtdLmNvbmNhdCgoby5DT0RFQ1N8fCIiKS5zcGxpdCgvWyAsXSsvKSksYSksYS52aWRlb0NvZGVjJiYtMSE9PWEudmlkZW9Db2RlYy5pbmRleE9mKCJhdmMxIikmJihhLnZpZGVvQ29kZWM9dGhpcy5hdmMxdG9hdmNvdGkoYS52aWRlb0NvZGVjKSksci5wdXNoKGEpfXJldHVybiByfSxlLnByb3RvdHlwZS5wYXJzZU1hc3RlclBsYXlsaXN0TWVkaWE9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsLGE9dm9pZCAwLG49W10sbz0wO2ZvcihodC5sYXN0SW5kZXg9MDtudWxsIT0oYT1odC5leGVjKHQpKTspe3ZhciBzPXt9LGw9bmV3IHN0KGFbMV0pO2wuVFlQRT09PXImJihzLmdyb3VwSWQ9bFsiR1JPVVAtSUQiXSxzLm5hbWU9bC5OQU1FLHMudHlwZT1yLHMuZGVmYXVsdD0iWUVTIj09PWwuREVGQVVMVCxzLmF1dG9zZWxlY3Q9IllFUyI9PT1sLkFVVE9TRUxFQ1Qscy5mb3JjZWQ9IllFUyI9PT1sLkZPUkNFRCxsLlVSSSYmKHMudXJsPXRoaXMucmVzb2x2ZShsLlVSSSxlKSkscy5sYW5nPWwuTEFOR1VBR0Uscy5uYW1lfHwocy5uYW1lPXMubGFuZyksaSYmKHMuYXVkaW9Db2RlYz1pKSxzLmlkPW8rKyxuLnB1c2gocykpfXJldHVybiBufSxlLnByb3RvdHlwZS5hdmMxdG9hdmNvdGk9ZnVuY3Rpb24odCl7dmFyIGUscj10LnNwbGl0KCIuIik7cmV0dXJuIHIubGVuZ3RoPjI/KGU9ci5zaGlmdCgpKyIuIixlKz1wYXJzZUludChyLnNoaWZ0KCkpLnRvU3RyaW5nKDE2KSxlKz0oIjAwMCIrcGFyc2VJbnQoci5zaGlmdCgpKS50b1N0cmluZygxNikpLnN1YnN0cigtNCkpOmU9dCxlfSxlLnByb3RvdHlwZS5wYXJzZUxldmVsUGxheWxpc3Q9ZnVuY3Rpb24odCxlLHIsaSl7dmFyIGEsbixvPTAscz0wLGw9e3R5cGU6bnVsbCx2ZXJzaW9uOm51bGwsdXJsOmUsZnJhZ21lbnRzOltdLGxpdmU6ITAsc3RhcnRTTjowfSxkPW5ldyBwdCx1PTAsaD1udWxsLGY9bmV3IHZ0O2ZvcihmdC5sYXN0SW5kZXg9MDtudWxsIT09KGE9ZnQuZXhlYyh0KSk7KXt2YXIgYz1hWzFdO2lmKGMpe2YuZHVyYXRpb249cGFyc2VGbG9hdChjKTt2YXIgcD0oIiAiK2FbMl0pLnNsaWNlKDEpO2YudGl0bGU9cHx8bnVsbCxmLnRhZ0xpc3QucHVzaChwP1siSU5GIixjLHBdOlsiSU5GIixjXSl9ZWxzZSBpZihhWzNdKXtpZighaXNOYU4oZi5kdXJhdGlvbikpe3ZhciB2PW8rKztmLnR5cGU9aSxmLnN0YXJ0PXMsZi5sZXZlbGtleT1kLGYuc249dixmLmxldmVsPXIsZi5jYz11LGYuYmFzZXVybD1lLGYucmVsdXJsPSgiICIrYVszXSkuc2xpY2UoMSksbC5mcmFnbWVudHMucHVzaChmKSxoPWYscys9Zi5kdXJhdGlvbixmPW5ldyB2dH19ZWxzZSBpZihhWzRdKXtpZihmLnJhd0J5dGVSYW5nZT0oIiAiK2FbNF0pLnNsaWNlKDEpLGgpe3ZhciBnPWguYnl0ZVJhbmdlRW5kT2Zmc2V0O2cmJihmLmxhc3RCeXRlUmFuZ2VFbmRPZmZzZXQ9Zyl9fWVsc2UgaWYoYVs1XSlmLnJhd1Byb2dyYW1EYXRlVGltZT0oIiAiK2FbNV0pLnNsaWNlKDEpLGYudGFnTGlzdC5wdXNoKFsiUFJPR1JBTS1EQVRFLVRJTUUiLGYucmF3UHJvZ3JhbURhdGVUaW1lXSksdm9pZCAwPT09bC5wcm9ncmFtRGF0ZVRpbWUmJihsLnByb2dyYW1EYXRlVGltZT1uZXcgRGF0ZShuZXcgRGF0ZShEYXRlLnBhcnNlKGFbNV0pKS0xZTMqcykpO2Vsc2V7Zm9yKGE9YVswXS5tYXRjaChjdCksbj0xO248YS5sZW5ndGgmJnZvaWQgMD09PWFbbl07bisrKTt2YXIgbT0oIiAiK2FbbisxXSkuc2xpY2UoMSkseT0oIiAiK2FbbisyXSkuc2xpY2UoMSk7c3dpdGNoKGFbbl0pe2Nhc2UiIyI6Zi50YWdMaXN0LnB1c2goeT9bbSx5XTpbbV0pO2JyZWFrO2Nhc2UiUExBWUxJU1QtVFlQRSI6bC50eXBlPW0udG9VcHBlckNhc2UoKTticmVhaztjYXNlIk1FRElBLVNFUVVFTkNFIjpvPWwuc3RhcnRTTj1wYXJzZUludChtKTticmVhaztjYXNlIlRBUkdFVERVUkFUSU9OIjpsLnRhcmdldGR1cmF0aW9uPXBhcnNlRmxvYXQobSk7YnJlYWs7Y2FzZSJWRVJTSU9OIjpsLnZlcnNpb249cGFyc2VJbnQobSk7YnJlYWs7Y2FzZSJFWFRNM1UiOmJyZWFrO2Nhc2UiRU5ETElTVCI6bC5saXZlPSExO2JyZWFrO2Nhc2UiRElTIjp1KyssZi50YWdMaXN0LnB1c2goWyJESVMiXSk7YnJlYWs7Y2FzZSJESVNDT05USU5VSVRZLVNFUSI6dT1wYXJzZUludChtKTticmVhaztjYXNlIktFWSI6dmFyIGI9bSxFPW5ldyBzdChiKSxSPUUuZW51bWVyYXRlZFN0cmluZygiTUVUSE9EIiksQT1FLlVSSSxUPUUuaGV4YWRlY2ltYWxJbnRlZ2VyKCJJViIpO1ImJihkPW5ldyBwdCxBJiZbIkFFUy0xMjgiLCJTQU1QTEUtQUVTIl0uaW5kZXhPZihSKT49MCYmKGQubWV0aG9kPVIsZC5iYXNldXJpPWUsZC5yZWx1cmk9QSxkLmtleT1udWxsLGQuaXY9VCkpO2JyZWFrO2Nhc2UiU1RBUlQiOnZhciBTPW0sXz1uZXcgc3QoUyksTD1fLmRlY2ltYWxGbG9hdGluZ1BvaW50KCJUSU1FLU9GRlNFVCIpO2lzTmFOKEwpfHwobC5zdGFydFRpbWVPZmZzZXQ9TCk7YnJlYWs7Y2FzZSJNQVAiOnZhciB3PW5ldyBzdChtKTtmLnJlbHVybD13LlVSSSxmLnJhd0J5dGVSYW5nZT13LkJZVEVSQU5HRSxmLmJhc2V1cmw9ZSxmLmxldmVsPXIsZi50eXBlPWksZi5zbj0iaW5pdFNlZ21lbnQiLGwuaW5pdFNlZ21lbnQ9ZixmPW5ldyB2dDticmVhaztkZWZhdWx0OnR0LmIud2FybigibGluZSBwYXJzZWQgYnV0IG5vdCBoYW5kbGVkOiAiK2EpfX19cmV0dXJuIGY9aCxmJiYhZi5yZWx1cmwmJihsLmZyYWdtZW50cy5wb3AoKSxzLT1mLmR1cmF0aW9uKSxsLnRvdGFsZHVyYXRpb249cyxsLmF2ZXJhZ2V0YXJnZXRkdXJhdGlvbj1zL2wuZnJhZ21lbnRzLmxlbmd0aCxsLmVuZFNOPW8tMSxsLnN0YXJ0Q0M9bC5mcmFnbWVudHNbMF0/bC5mcmFnbWVudHNbMF0uY2M6MCxsLmVuZENDPXUsbH0sZS5wcm90b3R5cGUubG9hZHN1Y2Nlc3M9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsLGE9dC5kYXRhLG49dC51cmwsbz1yLnR5cGUscz1yLmlkLGw9ci5sZXZlbCxkPXRoaXMuaGxzO2lmKHRoaXMubG9hZGVyc1tvXT12b2lkIDAsdm9pZCAwIT09biYmMCE9PW4uaW5kZXhPZigiZGF0YToiKXx8KG49ci51cmwpLGUudGxvYWQ9cGVyZm9ybWFuY2Uubm93KCksMD09PWEuaW5kZXhPZigiI0VYVE0zVSIpKWlmKGEuaW5kZXhPZigiI0VYVElORjoiKT4wKXt2YXIgdT0iYXVkaW9UcmFjayIhPT1vJiYic3VidGl0bGVUcmFjayIhPT1vLGg9aXNOYU4obCk/aXNOYU4ocyk/MDpzOmwsZj10aGlzLnBhcnNlTGV2ZWxQbGF5bGlzdChhLG4saCwiYXVkaW9UcmFjayI9PT1vPyJhdWRpbyI6InN1YnRpdGxlVHJhY2siPT09bz8ic3VidGl0bGUiOiJtYWluIik7Zi50bG9hZD1lLnRsb2FkLCJtYW5pZmVzdCI9PT1vJiZkLnRyaWdnZXIoWi5hLk1BTklGRVNUX0xPQURFRCx7bGV2ZWxzOlt7dXJsOm4sZGV0YWlsczpmfV0sYXVkaW9UcmFja3M6W10sdXJsOm4sc3RhdHM6ZSxuZXR3b3JrRGV0YWlsczppfSksZS50cGFyc2VkPXBlcmZvcm1hbmNlLm5vdygpLGYudGFyZ2V0ZHVyYXRpb24/dT9kLnRyaWdnZXIoWi5hLkxFVkVMX0xPQURFRCx7ZGV0YWlsczpmLGxldmVsOmx8fDAsaWQ6c3x8MCxzdGF0czplLG5ldHdvcmtEZXRhaWxzOml9KToiYXVkaW9UcmFjayI9PT1vP2QudHJpZ2dlcihaLmEuQVVESU9fVFJBQ0tfTE9BREVELHtkZXRhaWxzOmYsaWQ6cyxzdGF0czplLG5ldHdvcmtEZXRhaWxzOml9KToic3VidGl0bGVUcmFjayI9PT1vJiZkLnRyaWdnZXIoWi5hLlNVQlRJVExFX1RSQUNLX0xPQURFRCx7ZGV0YWlsczpmLGlkOnMsc3RhdHM6ZSxuZXR3b3JrRGV0YWlsczppfSk6ZC50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuTkVUV09SS19FUlJPUixkZXRhaWxzOiQuYS5NQU5JRkVTVF9QQVJTSU5HX0VSUk9SLGZhdGFsOiEwLHVybDpuLHJlYXNvbjoiaW52YWxpZCB0YXJnZXRkdXJhdGlvbiIsbmV0d29ya0RldGFpbHM6aX0pfWVsc2V7dmFyIGM9dGhpcy5wYXJzZU1hc3RlclBsYXlsaXN0KGEsbik7aWYoYy5sZW5ndGgpe3ZhciBwPXRoaXMucGFyc2VNYXN0ZXJQbGF5bGlzdE1lZGlhKGEsbiwiQVVESU8iLGNbMF0uYXVkaW9Db2RlYyksdj10aGlzLnBhcnNlTWFzdGVyUGxheWxpc3RNZWRpYShhLG4sIlNVQlRJVExFUyIpO2lmKHAubGVuZ3RoKXt2YXIgZz0hMTtwLmZvckVhY2goZnVuY3Rpb24odCl7dC51cmx8fChnPSEwKX0pLCExPT09ZyYmY1swXS5hdWRpb0NvZGVjJiYhY1swXS5hdHRycy5BVURJTyYmKHR0LmIubG9nKCJhdWRpbyBjb2RlYyBzaWduYWxlZCBpbiBxdWFsaXR5IGxldmVsLCBidXQgbm8gZW1iZWRkZWQgYXVkaW8gdHJhY2sgc2lnbmFsZWQsIGNyZWF0ZSBvbmUiKSxwLnVuc2hpZnQoe3R5cGU6Im1haW4iLG5hbWU6Im1haW4ifSkpfWQudHJpZ2dlcihaLmEuTUFOSUZFU1RfTE9BREVELHtsZXZlbHM6YyxhdWRpb1RyYWNrczpwLHN1YnRpdGxlczp2LHVybDpuLHN0YXRzOmUsbmV0d29ya0RldGFpbHM6aX0pfWVsc2UgZC50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuTkVUV09SS19FUlJPUixkZXRhaWxzOiQuYS5NQU5JRkVTVF9QQVJTSU5HX0VSUk9SLGZhdGFsOiEwLHVybDpuLHJlYXNvbjoibm8gbGV2ZWwgZm91bmQgaW4gbWFuaWZlc3QiLG5ldHdvcmtEZXRhaWxzOml9KX1lbHNlIGQudHJpZ2dlcihaLmEuRVJST1Ise3R5cGU6JC5iLk5FVFdPUktfRVJST1IsZGV0YWlsczokLmEuTUFOSUZFU1RfUEFSU0lOR19FUlJPUixmYXRhbDohMCx1cmw6bixyZWFzb246Im5vIEVYVE0zVSBkZWxpbWl0ZXIiLG5ldHdvcmtEZXRhaWxzOml9KX0sZS5wcm90b3R5cGUubG9hZGVycm9yPWZ1bmN0aW9uKHQsZSl7dmFyIHIsaSxhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLG49ZS5sb2FkZXI7c3dpdGNoKGUudHlwZSl7Y2FzZSJtYW5pZmVzdCI6cj0kLmEuTUFOSUZFU1RfTE9BRF9FUlJPUixpPSEwO2JyZWFrO2Nhc2UibGV2ZWwiOnI9JC5hLkxFVkVMX0xPQURfRVJST1IsaT0hMTticmVhaztjYXNlImF1ZGlvVHJhY2siOnI9JC5hLkFVRElPX1RSQUNLX0xPQURfRVJST1IsaT0hMX1uJiYobi5hYm9ydCgpLHRoaXMubG9hZGVyc1tlLnR5cGVdPXZvaWQgMCksdGhpcy5obHMudHJpZ2dlcihaLmEuRVJST1Ise3R5cGU6JC5iLk5FVFdPUktfRVJST1IsZGV0YWlsczpyLGZhdGFsOmksdXJsOm4udXJsLGxvYWRlcjpuLHJlc3BvbnNlOnQsY29udGV4dDplLG5ldHdvcmtEZXRhaWxzOmF9KX0sZS5wcm90b3R5cGUubG9hZHRpbWVvdXQ9ZnVuY3Rpb24odCxlKXt2YXIgcixpLGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsbj1lLmxvYWRlcjtzd2l0Y2goZS50eXBlKXtjYXNlIm1hbmlmZXN0IjpyPSQuYS5NQU5JRkVTVF9MT0FEX1RJTUVPVVQsaT0hMDticmVhaztjYXNlImxldmVsIjpyPSQuYS5MRVZFTF9MT0FEX1RJTUVPVVQsaT0hMTticmVhaztjYXNlImF1ZGlvVHJhY2siOnI9JC5hLkFVRElPX1RSQUNLX0xPQURfVElNRU9VVCxpPSExfW4mJihuLmFib3J0KCksdGhpcy5sb2FkZXJzW2UudHlwZV09dm9pZCAwKSx0aGlzLmhscy50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuTkVUV09SS19FUlJPUixkZXRhaWxzOnIsZmF0YWw6aSx1cmw6bi51cmwsbG9hZGVyOm4sY29udGV4dDplLG5ldHdvcmtEZXRhaWxzOmF9KX0sZX0oaXQpLG10PWd0LHl0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUocil7dSh0aGlzLGUpO3ZhciBpPWgodGhpcyx0LmNhbGwodGhpcyxyLFouYS5GUkFHX0xPQURJTkcpKTtyZXR1cm4gaS5sb2FkZXJzPXt9LGl9cmV0dXJuIGYoZSx0KSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sb2FkZXJzO2Zvcih2YXIgZSBpbiB0KXt2YXIgcj10W2VdO3ImJnIuZGVzdHJveSgpfXRoaXMubG9hZGVycz17fSxpdC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5vbkZyYWdMb2FkaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZnJhZyxyPWUudHlwZSxpPXRoaXMubG9hZGVyc1tyXSxhPXRoaXMuaGxzLmNvbmZpZztlLmxvYWRlZD0wLGkmJih0dC5iLndhcm4oImFib3J0IHByZXZpb3VzIGZyYWdtZW50IGxvYWRlciBmb3IgdHlwZToiK3IpLGkuYWJvcnQoKSksaT10aGlzLmxvYWRlcnNbcl09ZS5sb2FkZXI9dm9pZCAwIT09YS5mTG9hZGVyP25ldyBhLmZMb2FkZXIoYSk6bmV3IGEubG9hZGVyKGEpO3ZhciBuPXZvaWQgMCxvPXZvaWQgMCxzPXZvaWQgMDtuPXt1cmw6ZS51cmwsZnJhZzplLHJlc3BvbnNlVHlwZToiYXJyYXlidWZmZXIiLHByb2dyZXNzRGF0YTohMX07dmFyIGw9ZS5ieXRlUmFuZ2VTdGFydE9mZnNldCxkPWUuYnl0ZVJhbmdlRW5kT2Zmc2V0O2lzTmFOKGwpfHxpc05hTihkKXx8KG4ucmFuZ2VTdGFydD1sLG4ucmFuZ2VFbmQ9ZCksbz17dGltZW91dDphLmZyYWdMb2FkaW5nVGltZU91dCxtYXhSZXRyeTowLHJldHJ5RGVsYXk6MCxtYXhSZXRyeURlbGF5OmEuZnJhZ0xvYWRpbmdNYXhSZXRyeVRpbWVvdXR9LHM9e29uU3VjY2Vzczp0aGlzLmxvYWRzdWNjZXNzLmJpbmQodGhpcyksb25FcnJvcjp0aGlzLmxvYWRlcnJvci5iaW5kKHRoaXMpLG9uVGltZW91dDp0aGlzLmxvYWR0aW1lb3V0LmJpbmQodGhpcyksb25Qcm9ncmVzczp0aGlzLmxvYWRwcm9ncmVzcy5iaW5kKHRoaXMpfSxpLmxvYWQobixvLHMpfSxlLnByb3RvdHlwZS5sb2Fkc3VjY2Vzcz1mdW5jdGlvbih0LGUscil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGwsYT10LmRhdGEsbj1yLmZyYWc7bi5sb2FkZXI9dm9pZCAwLHRoaXMubG9hZGVyc1tuLnR5cGVdPXZvaWQgMCx0aGlzLmhscy50cmlnZ2VyKFouYS5GUkFHX0xPQURFRCx7cGF5bG9hZDphLGZyYWc6bixzdGF0czplLG5ldHdvcmtEZXRhaWxzOml9KX0sZS5wcm90b3R5cGUubG9hZGVycm9yPWZ1bmN0aW9uKHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsaT1lLmxvYWRlcjtpJiZpLmFib3J0KCksdGhpcy5sb2FkZXJzW2UudHlwZV09dm9pZCAwLHRoaXMuaGxzLnRyaWdnZXIoWi5hLkVSUk9SLHt0eXBlOiQuYi5ORVRXT1JLX0VSUk9SLGRldGFpbHM6JC5hLkZSQUdfTE9BRF9FUlJPUixmYXRhbDohMSxmcmFnOmUuZnJhZyxyZXNwb25zZTp0LG5ldHdvcmtEZXRhaWxzOnJ9KX0sZS5wcm90b3R5cGUubG9hZHRpbWVvdXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxpPWUubG9hZGVyO2kmJmkuYWJvcnQoKSx0aGlzLmxvYWRlcnNbZS50eXBlXT12b2lkIDAsdGhpcy5obHMudHJpZ2dlcihaLmEuRVJST1Ise3R5cGU6JC5iLk5FVFdPUktfRVJST1IsZGV0YWlsczokLmEuRlJBR19MT0FEX1RJTUVPVVQsZmF0YWw6ITEsZnJhZzplLmZyYWcsbmV0d29ya0RldGFpbHM6cn0pfSxlLnByb3RvdHlwZS5sb2FkcHJvZ3Jlc3M9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsLGE9ZS5mcmFnO2EubG9hZGVkPXQubG9hZGVkLHRoaXMuaGxzLnRyaWdnZXIoWi5hLkZSQUdfTE9BRF9QUk9HUkVTUyx7ZnJhZzphLHN0YXRzOnQsbmV0d29ya0RldGFpbHM6aX0pfSxlfShpdCksYnQ9eXQsRXQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShyKXtjKHRoaXMsZSk7dmFyIGk9cCh0aGlzLHQuY2FsbCh0aGlzLHIsWi5hLktFWV9MT0FESU5HKSk7cmV0dXJuIGkubG9hZGVycz17fSxpLmRlY3J5cHRrZXk9bnVsbCxpLmRlY3J5cHR1cmw9bnVsbCxpfXJldHVybiB2KGUsdCksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLmxvYWRlcnMpe3ZhciBlPXRoaXMubG9hZGVyc1t0XTtlJiZlLmRlc3Ryb3koKX10aGlzLmxvYWRlcnM9e30saXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUub25LZXlMb2FkaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZnJhZyxyPWUudHlwZSxpPXRoaXMubG9hZGVyc1tyXSxhPWUuZGVjcnlwdGRhdGEsbj1hLnVyaTtpZihuIT09dGhpcy5kZWNyeXB0dXJsfHxudWxsPT09dGhpcy5kZWNyeXB0a2V5KXt2YXIgbz10aGlzLmhscy5jb25maWc7aSYmKHR0LmIud2FybigiYWJvcnQgcHJldmlvdXMga2V5IGxvYWRlciBmb3IgdHlwZToiK3IpLGkuYWJvcnQoKSksZS5sb2FkZXI9dGhpcy5sb2FkZXJzW3JdPW5ldyBvLmxvYWRlcihvKSx0aGlzLmRlY3J5cHR1cmw9bix0aGlzLmRlY3J5cHRrZXk9bnVsbDt2YXIgcz12b2lkIDAsbD12b2lkIDAsZD12b2lkIDA7cz17dXJsOm4sZnJhZzplLHJlc3BvbnNlVHlwZToiYXJyYXlidWZmZXIifSxsPXt0aW1lb3V0Om8uZnJhZ0xvYWRpbmdUaW1lT3V0LG1heFJldHJ5Om8uZnJhZ0xvYWRpbmdNYXhSZXRyeSxyZXRyeURlbGF5Om8uZnJhZ0xvYWRpbmdSZXRyeURlbGF5LG1heFJldHJ5RGVsYXk6by5mcmFnTG9hZGluZ01heFJldHJ5VGltZW91dH0sZD17b25TdWNjZXNzOnRoaXMubG9hZHN1Y2Nlc3MuYmluZCh0aGlzKSxvbkVycm9yOnRoaXMubG9hZGVycm9yLmJpbmQodGhpcyksb25UaW1lb3V0OnRoaXMubG9hZHRpbWVvdXQuYmluZCh0aGlzKX0sZS5sb2FkZXIubG9hZChzLGwsZCl9ZWxzZSB0aGlzLmRlY3J5cHRrZXkmJihhLmtleT10aGlzLmRlY3J5cHRrZXksdGhpcy5obHMudHJpZ2dlcihaLmEuS0VZX0xPQURFRCx7ZnJhZzplfSkpfSxlLnByb3RvdHlwZS5sb2Fkc3VjY2Vzcz1mdW5jdGlvbih0LGUscil7dmFyIGk9ci5mcmFnO3RoaXMuZGVjcnlwdGtleT1pLmRlY3J5cHRkYXRhLmtleT1uZXcgVWludDhBcnJheSh0LmRhdGEpLGkubG9hZGVyPXZvaWQgMCx0aGlzLmxvYWRlcnNbaS50eXBlXT12b2lkIDAsdGhpcy5obHMudHJpZ2dlcihaLmEuS0VZX0xPQURFRCx7ZnJhZzppfSl9LGUucHJvdG90eXBlLmxvYWRlcnJvcj1mdW5jdGlvbih0LGUpe3ZhciByPWUuZnJhZyxpPXIubG9hZGVyO2kmJmkuYWJvcnQoKSx0aGlzLmxvYWRlcnNbZS50eXBlXT12b2lkIDAsdGhpcy5obHMudHJpZ2dlcihaLmEuRVJST1Ise3R5cGU6JC5iLk5FVFdPUktfRVJST1IsZGV0YWlsczokLmEuS0VZX0xPQURfRVJST1IsZmF0YWw6ITEsZnJhZzpyLHJlc3BvbnNlOnR9KX0sZS5wcm90b3R5cGUubG9hZHRpbWVvdXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmZyYWcsaT1yLmxvYWRlcjtpJiZpLmFib3J0KCksdGhpcy5sb2FkZXJzW2UudHlwZV09dm9pZCAwLHRoaXMuaGxzLnRyaWdnZXIoWi5hLkVSUk9SLHt0eXBlOiQuYi5ORVRXT1JLX0VSUk9SLGRldGFpbHM6JC5hLktFWV9MT0FEX1RJTUVPVVQsZmF0YWw6ITEsZnJhZzpyfSl9LGV9KGl0KSxSdD1FdCxBdD17c2VhcmNoOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsaT10Lmxlbmd0aC0xLGE9bnVsbCxuPW51bGw7cjw9aTspe2E9KHIraSkvMnwwLG49dFthXTt2YXIgbz1lKG4pO2lmKG8+MClyPWErMTtlbHNle2lmKCEobzwwKSlyZXR1cm4gbjtpPWEtMX19cmV0dXJuIG51bGx9fSxUdD1BdCxTdD17aXNCdWZmZXJlZDpmdW5jdGlvbih0LGUpe2lmKHQpZm9yKHZhciByPXQuYnVmZmVyZWQsaT0wO2k8ci5sZW5ndGg7aSsrKWlmKGU+PXIuc3RhcnQoaSkmJmU8PXIuZW5kKGkpKXJldHVybiEwO3JldHVybiExfSxidWZmZXJJbmZvOmZ1bmN0aW9uKHQsZSxyKXtpZih0KXt2YXIgaSxhPXQuYnVmZmVyZWQsbj1bXTtmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKW4ucHVzaCh7c3RhcnQ6YS5zdGFydChpKSxlbmQ6YS5lbmQoaSl9KTtyZXR1cm4gdGhpcy5idWZmZXJlZEluZm8obixlLHIpfXJldHVybntsZW46MCxzdGFydDplLGVuZDplLG5leHRTdGFydDp2b2lkIDB9fSxidWZmZXJlZEluZm86ZnVuY3Rpb24odCxlLHIpe3ZhciBpLGEsbixvLHMsbD1bXTtmb3IodC5zb3J0KGZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5zdGFydC1lLnN0YXJ0O3JldHVybiByfHxlLmVuZC10LmVuZH0pLHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIGQ9bC5sZW5ndGg7aWYoZCl7dmFyIHU9bFtkLTFdLmVuZDt0W3NdLnN0YXJ0LXU8cj90W3NdLmVuZD51JiYobFtkLTFdLmVuZD10W3NdLmVuZCk6bC5wdXNoKHRbc10pfWVsc2UgbC5wdXNoKHRbc10pfWZvcihzPTAsaT0wLGE9bj1lO3M8bC5sZW5ndGg7cysrKXt2YXIgaD1sW3NdLnN0YXJ0LGY9bFtzXS5lbmQ7aWYoZStyPj1oJiZlPGYpYT1oLG49ZixpPW4tZTtlbHNlIGlmKGUrcjxoKXtvPWg7YnJlYWt9fXJldHVybntsZW46aSxzdGFydDphLGVuZDpuLG5leHRTdGFydDpvfX19LF90PVN0LEx0PXIoNyksd3Q9cig1KSxEdD1yLm4od3QpLE90PXIoOSkseHQ9ci5uKE90KSxJdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxyKXtnKHRoaXMsdCksdGhpcy5obHM9ZSx0aGlzLmlkPXI7dmFyIGk9dGhpcy5vYnNlcnZlcj1uZXcgRHQuYSxhPWUuY29uZmlnO2kudHJpZ2dlcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5KGU+MT9lLTE6MCksYT0xO2E8ZTthKyspclthLTFdPWFyZ3VtZW50c1thXTtpLmVtaXQuYXBwbHkoaSxbdCx0XS5jb25jYXQocikpfSxpLm9mZj1mdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5KGU+MT9lLTE6MCksYT0xO2E8ZTthKyspclthLTFdPWFyZ3VtZW50c1thXTtpLnJlbW92ZUxpc3RlbmVyLmFwcGx5KGksW3RdLmNvbmNhdChyKSl9O3ZhciBuPWZ1bmN0aW9uKHQscil7cj1yfHx7fSxyLmZyYWc9dGhpcy5mcmFnLHIuaWQ9dGhpcy5pZCxlLnRyaWdnZXIodCxyKX0uYmluZCh0aGlzKTtpLm9uKFouYS5GUkFHX0RFQ1JZUFRFRCxuKSxpLm9uKFouYS5GUkFHX1BBUlNJTkdfSU5JVF9TRUdNRU5ULG4pLGkub24oWi5hLkZSQUdfUEFSU0lOR19EQVRBLG4pLGkub24oWi5hLkZSQUdfUEFSU0VELG4pLGkub24oWi5hLkVSUk9SLG4pLGkub24oWi5hLkZSQUdfUEFSU0lOR19NRVRBREFUQSxuKSxpLm9uKFouYS5GUkFHX1BBUlNJTkdfVVNFUkRBVEEsbiksaS5vbihaLmEuSU5JVF9QVFNfRk9VTkQsbik7dmFyIG89e21wNDpNZWRpYVNvdXJjZS5pc1R5cGVTdXBwb3J0ZWQoInZpZGVvL21wNCIpLG1wZWc6TWVkaWFTb3VyY2UuaXNUeXBlU3VwcG9ydGVkKCJhdWRpby9tcGVnIiksbXAzOk1lZGlhU291cmNlLmlzVHlwZVN1cHBvcnRlZCgnYXVkaW8vbXA0OyBjb2RlY3M9Im1wMyInKX0scz1uYXZpZ2F0b3IudmVuZG9yO2lmKGEuZW5hYmxlV29ya2VyJiYidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlcil7dHQuYi5sb2coImRlbXV4aW5nIGluIHdlYndvcmtlciIpO3ZhciBsPXZvaWQgMDt0cnl7bD10aGlzLnc9eHQoKSgxMCksdGhpcy5vbndtc2c9dGhpcy5vbldvcmtlck1lc3NhZ2UuYmluZCh0aGlzKSxsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub253bXNnKSxsLm9uZXJyb3I9ZnVuY3Rpb24odCl7ZS50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuT1RIRVJfRVJST1IsZGV0YWlsczokLmEuSU5URVJOQUxfRVhDRVBUSU9OLGZhdGFsOiEwLGV2ZW50OiJkZW11eGVyV29ya2VyIixlcnI6e21lc3NhZ2U6dC5tZXNzYWdlKyIgKCIrdC5maWxlbmFtZSsiOiIrdC5saW5lbm8rIikifX0pfSxsLnBvc3RNZXNzYWdlKHtjbWQ6ImluaXQiLHR5cGVTdXBwb3J0ZWQ6byx2ZW5kb3I6cyxpZDpyLGNvbmZpZzpKU09OLnN0cmluZ2lmeShhKX0pfWNhdGNoKHQpe3R0LmIuZXJyb3IoImVycm9yIHdoaWxlIGluaXRpYWxpemluZyBEZW11eGVyV29ya2VyLCBmYWxsYmFjayBvbiBEZW11eGVySW5saW5lIiksbCYmVVJMLnJldm9rZU9iamVjdFVSTChsLm9iamVjdFVSTCksdGhpcy5kZW11eGVyPW5ldyBMdC5hKGksbyxhLHMpLHRoaXMudz12b2lkIDB9fWVsc2UgdGhpcy5kZW11eGVyPW5ldyBMdC5hKGksbyxhLHMpfXJldHVybiB0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53O2lmKHQpdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLm9ud21zZyksdC50ZXJtaW5hdGUoKSx0aGlzLnc9bnVsbDtlbHNle3ZhciBlPXRoaXMuZGVtdXhlcjtlJiYoZS5kZXN0cm95KCksdGhpcy5kZW11eGVyPW51bGwpfXZhciByPXRoaXMub2JzZXJ2ZXI7ciYmKHIucmVtb3ZlQWxsTGlzdGVuZXJzKCksdGhpcy5vYnNlcnZlcj1udWxsKX0sdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUscixpLGEsbixvLHMpe3ZhciBsPXRoaXMudyxkPWlzTmFOKGEuc3RhcnREVFMpP2Euc3RhcnQ6YS5zdGFydERUUyx1PWEuZGVjcnlwdGRhdGEsaD10aGlzLmZyYWcsZj0hKGgmJmEuY2M9PT1oLmNjKSxjPSEoaCYmYS5sZXZlbD09PWgubGV2ZWwpLHA9aCYmYS5zbj09PWguc24rMSx2PSFjJiZwO2lmKGYmJnR0LmIubG9nKHRoaXMuaWQrIjpkaXNjb250aW51aXR5IGRldGVjdGVkIiksYyYmdHQuYi5sb2codGhpcy5pZCsiOnN3aXRjaCBkZXRlY3RlZCIpLHRoaXMuZnJhZz1hLGwpbC5wb3N0TWVzc2FnZSh7Y21kOiJkZW11eCIsZGF0YTp0LGRlY3J5cHRkYXRhOnUsaW5pdFNlZ21lbnQ6ZSxhdWRpb0NvZGVjOnIsdmlkZW9Db2RlYzppLHRpbWVPZmZzZXQ6ZCxkaXNjb250aW51aXR5OmYsdHJhY2tTd2l0Y2g6Yyxjb250aWd1b3VzOnYsZHVyYXRpb246bixhY2N1cmF0ZVRpbWVPZmZzZXQ6byxkZWZhdWx0SW5pdFBUUzpzfSxbdF0pO2Vsc2V7dmFyIGc9dGhpcy5kZW11eGVyO2cmJmcucHVzaCh0LHUsZSxyLGksZCxmLGMsdixuLG8scyl9fSx0LnByb3RvdHlwZS5vbldvcmtlck1lc3NhZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRhLHI9dGhpcy5obHM7c3dpdGNoKGUuZXZlbnQpe2Nhc2UiaW5pdCI6VVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLncub2JqZWN0VVJMKTticmVhaztjYXNlIFouYS5GUkFHX1BBUlNJTkdfREFUQTplLmRhdGEuZGF0YTE9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhMSksZS5kYXRhMiYmKGUuZGF0YS5kYXRhMj1uZXcgVWludDhBcnJheShlLmRhdGEyKSk7ZGVmYXVsdDplLmRhdGE9ZS5kYXRhfHx7fSxlLmRhdGEuZnJhZz10aGlzLmZyYWcsZS5kYXRhLmlkPXRoaXMuaWQsci50cmlnZ2VyKGUuZXZlbnQsZS5kYXRhKX19LHR9KCksa3Q9SXQsUHQ9e3RvU3RyaW5nOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIixyPXQubGVuZ3RoLGk9MDtpPHI7aSsrKWUrPSJbIit0LnN0YXJ0KGkpLnRvRml4ZWQoMykrIiwiK3QuZW5kKGkpLnRvRml4ZWQoMykrIl0iO3JldHVybiBlfX0sQ3Q9UHQsRnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19cmV0dXJuIGZ1bmN0aW9uKGUscixpKXtyZXR1cm4gciYmdChlLnByb3RvdHlwZSxyKSxpJiZ0KGUsaSksZX19KCksTXQ9e1NUT1BQRUQ6IlNUT1BQRUQiLElETEU6IklETEUiLEtFWV9MT0FESU5HOiJLRVlfTE9BRElORyIsRlJBR19MT0FESU5HOiJGUkFHX0xPQURJTkciLEZSQUdfTE9BRElOR19XQUlUSU5HX1JFVFJZOiJGUkFHX0xPQURJTkdfV0FJVElOR19SRVRSWSIsV0FJVElOR19MRVZFTDoiV0FJVElOR19MRVZFTCIsUEFSU0lORzoiUEFSU0lORyIsUEFSU0VEOiJQQVJTRUQiLEJVRkZFUl9GTFVTSElORzoiQlVGRkVSX0ZMVVNISU5HIixFTkRFRDoiRU5ERUQiLEVSUk9SOiJFUlJPUiJ9LE50PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUocil7Xyh0aGlzLGUpO3ZhciBpPUwodGhpcyx0LmNhbGwodGhpcyxyLFouYS5NRURJQV9BVFRBQ0hFRCxaLmEuTUVESUFfREVUQUNISU5HLFouYS5NQU5JRkVTVF9MT0FESU5HLFouYS5NQU5JRkVTVF9QQVJTRUQsWi5hLkxFVkVMX0xPQURFRCxaLmEuS0VZX0xPQURFRCxaLmEuRlJBR19MT0FERUQsWi5hLkZSQUdfTE9BRF9FTUVSR0VOQ1lfQUJPUlRFRCxaLmEuRlJBR19QQVJTSU5HX0lOSVRfU0VHTUVOVCxaLmEuRlJBR19QQVJTSU5HX0RBVEEsWi5hLkZSQUdfUEFSU0VELFouYS5FUlJPUixaLmEuQVVESU9fVFJBQ0tfU1dJVENISU5HLFouYS5BVURJT19UUkFDS19TV0lUQ0hFRCxaLmEuQlVGRkVSX0NSRUFURUQsWi5hLkJVRkZFUl9BUFBFTkRFRCxaLmEuQlVGRkVSX0ZMVVNIRUQpKTtyZXR1cm4gaS5jb25maWc9ci5jb25maWcsaS5hdWRpb0NvZGVjU3dhcD0hMSxpLnRpY2tzPTAsaS5fc3RhdGU9TXQuU1RPUFBFRCxpLm9udGljaz1pLnRpY2suYmluZChpKSxpfXJldHVybiB3KGUsdCksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuc3RvcExvYWQoKSx0aGlzLnRpbWVyJiYoY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPW51bGwpLGl0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5zdGF0ZT1NdC5TVE9QUEVEfSxlLnByb3RvdHlwZS5zdGFydExvYWQ9ZnVuY3Rpb24odCl7aWYodGhpcy5sZXZlbHMpe3ZhciBlPXRoaXMubGFzdEN1cnJlbnRUaW1lLHI9dGhpcy5obHM7aWYodGhpcy5zdG9wTG9hZCgpLHRoaXMudGltZXJ8fCh0aGlzLnRpbWVyPXNldEludGVydmFsKHRoaXMub250aWNrLDEwMCkpLHRoaXMubGV2ZWw9LTEsdGhpcy5mcmFnTG9hZEVycm9yPTAsIXRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkKXt2YXIgaT1yLnN0YXJ0TGV2ZWw7LTE9PT1pJiYoaT0wLHRoaXMuYml0cmF0ZVRlc3Q9ITApLHRoaXMubGV2ZWw9ci5uZXh0TG9hZExldmVsPWksdGhpcy5sb2FkZWRtZXRhZGF0YT0hMX1lPjAmJi0xPT09dCYmKHR0LmIubG9nKCJvdmVycmlkZSBzdGFydFBvc2l0aW9uIHdpdGggbGFzdEN1cnJlbnRUaW1lIEAiK2UudG9GaXhlZCgzKSksdD1lKSx0aGlzLnN0YXRlPU10LklETEUsdGhpcy5uZXh0TG9hZFBvc2l0aW9uPXRoaXMuc3RhcnRQb3NpdGlvbj10aGlzLmxhc3RDdXJyZW50VGltZT10LHRoaXMudGljaygpfWVsc2UgdGhpcy5mb3JjZVN0YXJ0TG9hZD0hMCx0aGlzLnN0YXRlPU10LlNUT1BQRUR9LGUucHJvdG90eXBlLnN0b3BMb2FkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mcmFnQ3VycmVudDt0JiYodC5sb2FkZXImJnQubG9hZGVyLmFib3J0KCksdGhpcy5mcmFnQ3VycmVudD1udWxsKSx0aGlzLmZyYWdQcmV2aW91cz1udWxsLHRoaXMuZGVtdXhlciYmKHRoaXMuZGVtdXhlci5kZXN0cm95KCksdGhpcy5kZW11eGVyPW51bGwpLHRoaXMuc3RhdGU9TXQuU1RPUFBFRCx0aGlzLmZvcmNlU3RhcnRMb2FkPSExfSxlLnByb3RvdHlwZS50aWNrPWZ1bmN0aW9uKCl7MT09PSsrdGhpcy50aWNrcyYmKHRoaXMuZG9UaWNrKCksdGhpcy50aWNrcz4xJiZzZXRUaW1lb3V0KHRoaXMudGljaywxKSx0aGlzLnRpY2tzPTApfSxlLnByb3RvdHlwZS5kb1RpY2s9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5zdGF0ZSl7Y2FzZSBNdC5FUlJPUjpicmVhaztjYXNlIE10LkJVRkZFUl9GTFVTSElORzp0aGlzLmZyYWdMb2FkRXJyb3I9MDticmVhaztjYXNlIE10LklETEU6dGhpcy5fZG9UaWNrSWRsZSgpO2JyZWFrO2Nhc2UgTXQuV0FJVElOR19MRVZFTDp2YXIgdD10aGlzLmxldmVsc1t0aGlzLmxldmVsXTt0JiZ0LmRldGFpbHMmJih0aGlzLnN0YXRlPU10LklETEUpO2JyZWFrO2Nhc2UgTXQuRlJBR19MT0FESU5HX1dBSVRJTkdfUkVUUlk6dmFyIGU9cGVyZm9ybWFuY2Uubm93KCkscj10aGlzLnJldHJ5RGF0ZTsoIXJ8fGU+PXJ8fHRoaXMubWVkaWEmJnRoaXMubWVkaWEuc2Vla2luZykmJih0dC5iLmxvZygibWVkaWFDb250cm9sbGVyOiByZXRyeURhdGUgcmVhY2hlZCwgc3dpdGNoIGJhY2sgdG8gSURMRSBzdGF0ZSIpLHRoaXMuc3RhdGU9TXQuSURMRSk7YnJlYWs7Y2FzZSBNdC5FUlJPUjpjYXNlIE10LlNUT1BQRUQ6Y2FzZSBNdC5GUkFHX0xPQURJTkc6Y2FzZSBNdC5QQVJTSU5HOmNhc2UgTXQuUEFSU0VEOmNhc2UgTXQuRU5ERUQ6fXRoaXMuX2NoZWNrQnVmZmVyKCksdGhpcy5fY2hlY2tGcmFnbWVudENoYW5nZWQoKX0sZS5wcm90b3R5cGUuX2RvVGlja0lkbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmhscyxlPXQuY29uZmlnLHI9dGhpcy5tZWRpYTtpZih2b2lkIDA9PT10aGlzLmxldmVsTGFzdExvYWRlZHx8cnx8IXRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkJiZlLnN0YXJ0RnJhZ1ByZWZldGNoKXt2YXIgaT12b2lkIDA7aT10aGlzLmxvYWRlZG1ldGFkYXRhP3IuY3VycmVudFRpbWU6dGhpcy5uZXh0TG9hZFBvc2l0aW9uO3ZhciBhPXQubmV4dExvYWRMZXZlbCxuPXRoaXMubGV2ZWxzW2FdO2lmKG4pe3ZhciBvPW4uYml0cmF0ZSxzPXZvaWQgMDtzPW8/TWF0aC5tYXgoOCplLm1heEJ1ZmZlclNpemUvbyxlLm1heEJ1ZmZlckxlbmd0aCk6ZS5tYXhCdWZmZXJMZW5ndGgscz1NYXRoLm1pbihzLGUubWF4TWF4QnVmZmVyTGVuZ3RoKTt2YXIgbD1fdC5idWZmZXJJbmZvKHRoaXMubWVkaWFCdWZmZXI/dGhpcy5tZWRpYUJ1ZmZlcjpyLGksZS5tYXhCdWZmZXJIb2xlKSxkPWwubGVuO2lmKCEoZD49cykpe3R0LmIudHJhY2UoImJ1ZmZlciBsZW5ndGggb2YgIitkLnRvRml4ZWQoMykrIiBpcyBiZWxvdyBtYXggb2YgIitzLnRvRml4ZWQoMykrIi4gY2hlY2tpbmcgZm9yIG1vcmUgcGF5bG9hZCAuLi4iKSx0aGlzLmxldmVsPXQubmV4dExvYWRMZXZlbD1hO3ZhciB1PW4uZGV0YWlscztpZih2b2lkIDA9PT11fHx1LmxpdmUmJnRoaXMubGV2ZWxMYXN0TG9hZGVkIT09YSlyZXR1cm4gdm9pZCh0aGlzLnN0YXRlPU10LldBSVRJTkdfTEVWRUwpO3ZhciBoPXRoaXMuZnJhZ1ByZXZpb3VzO2lmKCF1LmxpdmUmJmgmJmguc249PT11LmVuZFNOJiYhbC5uZXh0U3RhcnQpe2lmKE1hdGgubWluKHIuZHVyYXRpb24saC5zdGFydCtoLmR1cmF0aW9uKS1NYXRoLm1heChsLmVuZCxoLnN0YXJ0KTw9TWF0aC5tYXgoLjIsaC5kdXJhdGlvbikpe3ZhciBmPXt9O3JldHVybiB0aGlzLmFsdEF1ZGlvJiYoZi50eXBlPSJ2aWRlbyIpLHRoaXMuaGxzLnRyaWdnZXIoWi5hLkJVRkZFUl9FT1MsZiksdm9pZCh0aGlzLnN0YXRlPU10LkVOREVEKX19dGhpcy5fZmV0Y2hQYXlsb2FkT3JFb3MoaSxsLHUpfX19fSxlLnByb3RvdHlwZS5fZmV0Y2hQYXlsb2FkT3JFb3M9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXRoaXMuZnJhZ1ByZXZpb3VzLGE9dGhpcy5sZXZlbCxuPXIuZnJhZ21lbnRzLG89bi5sZW5ndGg7aWYoMCE9PW8pe3ZhciBzPW5bMF0uc3RhcnQsbD1uW28tMV0uc3RhcnQrbltvLTFdLmR1cmF0aW9uLGQ9ZS5lbmQsdT12b2lkIDA7aWYoci5pbml0U2VnbWVudCYmIXIuaW5pdFNlZ21lbnQuZGF0YSl1PXIuaW5pdFNlZ21lbnQ7ZWxzZSBpZihyLmxpdmUpe3ZhciBoPXRoaXMuY29uZmlnLmluaXRpYWxMaXZlTWFuaWZlc3RTaXplO2lmKG88aClyZXR1cm4gdm9pZCB0dC5iLndhcm4oIkNhbiBub3Qgc3RhcnQgcGxheWJhY2sgb2YgYSBsZXZlbCwgcmVhc29uOiBub3QgZW5vdWdoIGZyYWdtZW50cyAiK28rIiA8ICIraCk7aWYobnVsbD09PSh1PXRoaXMuX2Vuc3VyZUZyYWdtZW50QXRMaXZlUG9pbnQocixkLHMsbCxpLG4sbykpKXJldHVybn1lbHNlIGQ8cyYmKHU9blswXSk7dXx8KHU9dGhpcy5fZmluZEZyYWdtZW50KHMsaSxvLG4sZCxsLHIpKSx1JiZ0aGlzLl9sb2FkRnJhZ21lbnRPcktleSh1LGEscix0LGQpfX0sZS5wcm90b3R5cGUuX2Vuc3VyZUZyYWdtZW50QXRMaXZlUG9pbnQ9ZnVuY3Rpb24odCxlLHIsaSxhLG4sbyl7dmFyIHM9dGhpcy5obHMuY29uZmlnLGw9dGhpcy5tZWRpYSxkPXZvaWQgMCx1PXZvaWQgMCE9PXMubGl2ZU1heExhdGVuY3lEdXJhdGlvbj9zLmxpdmVNYXhMYXRlbmN5RHVyYXRpb246cy5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uQ291bnQqdC50YXJnZXRkdXJhdGlvbjtpZihlPE1hdGgubWF4KHItcy5tYXhGcmFnTG9va1VwVG9sZXJhbmNlLGktdSkpe3ZhciBoPXRoaXMubGl2ZVN5bmNQb3NpdGlvbj10aGlzLmNvbXB1dGVMaXZlUG9zaXRpb24ocix0KTt0dC5iLmxvZygiYnVmZmVyIGVuZDogIitlLnRvRml4ZWQoMykrIiBpcyBsb2NhdGVkIHRvbyBmYXIgZnJvbSB0aGUgZW5kIG9mIGxpdmUgc2xpZGluZyBwbGF5bGlzdCwgcmVzZXQgY3VycmVudFRpbWUgdG8gOiAiK2gudG9GaXhlZCgzKSksZT1oLGwmJmwucmVhZHlTdGF0ZSYmbC5kdXJhdGlvbj5oJiYobC5jdXJyZW50VGltZT1oKSx0aGlzLm5leHRMb2FkUG9zaXRpb249aH1pZih0LlBUU0tub3duJiZlPmkmJmwmJmwucmVhZHlTdGF0ZSlyZXR1cm4gbnVsbDtpZih0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCYmIXQuUFRTS25vd24pe2lmKGEpe3ZhciBmPWEuc24rMTtpZihmPj10LnN0YXJ0U04mJmY8PXQuZW5kU04pe3ZhciBjPW5bZi10LnN0YXJ0U05dO2EuY2M9PT1jLmNjJiYoZD1jLHR0LmIubG9nKCJsaXZlIHBsYXlsaXN0LCBzd2l0Y2hpbmcgcGxheWxpc3QsIGxvYWQgZnJhZyB3aXRoIG5leHQgU046ICIrZC5zbikpfWR8fChkPVR0LnNlYXJjaChuLGZ1bmN0aW9uKHQpe3JldHVybiBhLmNjLXQuY2N9KSkmJnR0LmIubG9nKCJsaXZlIHBsYXlsaXN0LCBzd2l0Y2hpbmcgcGxheWxpc3QsIGxvYWQgZnJhZyB3aXRoIHNhbWUgQ0M6ICIrZC5zbil9ZHx8KGQ9bltNYXRoLm1pbihvLTEsTWF0aC5yb3VuZChvLzIpKV0sdHQuYi5sb2coImxpdmUgcGxheWxpc3QsIHN3aXRjaGluZyBwbGF5bGlzdCwgdW5rbm93biwgbG9hZCBtaWRkbGUgZnJhZyA6ICIrZC5zbikpfXJldHVybiBkfSxlLnByb3RvdHlwZS5fZmluZEZyYWdtZW50PWZ1bmN0aW9uKHQsZSxyLGksYSxuLG8pe3ZhciBzPXRoaXMuaGxzLmNvbmZpZyxsPXZvaWQgMCxkPXZvaWQgMCx1PXMubWF4RnJhZ0xvb2tVcFRvbGVyYW5jZSxoPWU/aVtlLnNuLWlbMF0uc24rMV06dm9pZCAwLGY9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4odSx0LmR1cmF0aW9uKTtyZXR1cm4gdC5zdGFydCt0LmR1cmF0aW9uLWU8PWE/MTp0LnN0YXJ0LWU+YSYmdC5zdGFydD8tMTowfTtpZihhPG4/KGE+bi11JiYodT0wKSxkPWgmJiFmKGgpP2g6VHQuc2VhcmNoKGksZikpOmQ9aVtyLTFdLGQpe2w9ZDt2YXIgYz1sLnNuLW8uc3RhcnRTTixwPWUmJmwubGV2ZWw9PT1lLmxldmVsLHY9aVtjLTFdLGc9aVtjKzFdO2lmKGUmJmwuc249PT1lLnNuKWlmKHAmJiFsLmJhY2t0cmFja2VkKWlmKGwuc248by5lbmRTTil7dmFyIG09ZS5kZWx0YVBUUzttJiZtPnMubWF4QnVmZmVySG9sZSYmZS5kcm9wcGVkJiZjPyhsPXYsdHQuYi53YXJuKCJTTiBqdXN0IGxvYWRlZCwgd2l0aCBsYXJnZSBQVFMgZ2FwIGJldHdlZW4gYXVkaW8gYW5kIHZpZGVvLCBtYXliZSBmcmFnIGlzIG5vdCBzdGFydGluZyB3aXRoIGEga2V5ZnJhbWUgPyBsb2FkIHByZXZpb3VzIG9uZSB0byB0cnkgdG8gb3ZlcmNvbWUgdGhpcyIpLGUubG9hZENvdW50ZXItLSk6KGw9Zyx0dC5iLmxvZygiU04ganVzdCBsb2FkZWQsIGxvYWQgbmV4dCBvbmU6ICIrbC5zbikpfWVsc2UgbD1udWxsO2Vsc2UgbC5iYWNrdHJhY2tlZCYmKGcmJmcuYmFja3RyYWNrZWQ/KHR0LmIud2FybigiQWxyZWFkeSBiYWNrdHJhY2tlZCBmcm9tIGZyYWdtZW50ICIrZy5zbisiLCB3aWxsIG5vdCBiYWNrdHJhY2sgdG8gZnJhZ21lbnQgIitsLnNuKyIuIExvYWRpbmcgZnJhZ21lbnQgIitnLnNuKSxsPWcpOih0dC5iLndhcm4oIkxvYWRlZCBmcmFnbWVudCB3aXRoIGRyb3BwZWQgZnJhbWVzLCBiYWNrdHJhY2tpbmcgMSBzZWdtZW50IHRvIGZpbmQgYSBrZXlmcmFtZSIpLGwuZHJvcHBlZD0wLHY/KHYubG9hZENvdW50ZXImJnYubG9hZENvdW50ZXItLSxsPXYsbC5iYWNrdHJhY2tlZD0hMCk6YyYmKGw9bnVsbCkpKX1yZXR1cm4gbH0sZS5wcm90b3R5cGUuX2xvYWRGcmFnbWVudE9yS2V5PWZ1bmN0aW9uKHQsZSxyLGksYSl7dmFyIG49dGhpcy5obHMsbz1uLmNvbmZpZztpZighdC5kZWNyeXB0ZGF0YXx8bnVsbD09dC5kZWNyeXB0ZGF0YS51cml8fG51bGwhPXQuZGVjcnlwdGRhdGEua2V5KXtpZih0dC5iLmxvZygiTG9hZGluZyAiK3Quc24rIiBvZiBbIityLnN0YXJ0U04rIiAsIityLmVuZFNOKyJdLGxldmVsICIrZSsiLCBjdXJyZW50VGltZToiK2kudG9GaXhlZCgzKSsiLGJ1ZmZlckVuZDoiK2EudG9GaXhlZCgzKSksdm9pZCAwIT09dGhpcy5mcmFnTG9hZElkeD90aGlzLmZyYWdMb2FkSWR4Kys6dGhpcy5mcmFnTG9hZElkeD0wLHQubG9hZENvdW50ZXIpe3QubG9hZENvdW50ZXIrKzt2YXIgcz1vLmZyYWdMb2FkaW5nTG9vcFRocmVzaG9sZDtpZih0LmxvYWRDb3VudGVyPnMmJk1hdGguYWJzKHRoaXMuZnJhZ0xvYWRJZHgtdC5sb2FkSWR4KTxzKXJldHVybiB2b2lkIG4udHJpZ2dlcihaLmEuRVJST1Ise3R5cGU6JC5iLk1FRElBX0VSUk9SLGRldGFpbHM6JC5hLkZSQUdfTE9PUF9MT0FESU5HX0VSUk9SLGZhdGFsOiExLGZyYWc6dH0pfWVsc2UgdC5sb2FkQ291bnRlcj0xO3JldHVybiB0LmxvYWRJZHg9dGhpcy5mcmFnTG9hZElkeCx0LmF1dG9MZXZlbD1uLmF1dG9MZXZlbEVuYWJsZWQsdC5iaXRyYXRlVGVzdD10aGlzLmJpdHJhdGVUZXN0LHRoaXMuZnJhZ0N1cnJlbnQ9dCx0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZD0hMCxpc05hTih0LnNuKXx8dC5iaXRyYXRlVGVzdHx8KHRoaXMubmV4dExvYWRQb3NpdGlvbj10LnN0YXJ0K3QuZHVyYXRpb24pLG4udHJpZ2dlcihaLmEuRlJBR19MT0FESU5HLHtmcmFnOnR9KSx0aGlzLmRlbXV4ZXJ8fCh0aGlzLmRlbXV4ZXI9bmV3IGt0KG4sIm1haW4iKSksdm9pZCh0aGlzLnN0YXRlPU10LkZSQUdfTE9BRElORyl9dHQuYi5sb2coIkxvYWRpbmcga2V5IGZvciAiK3Quc24rIiBvZiBbIityLnN0YXJ0U04rIiAsIityLmVuZFNOKyJdLGxldmVsICIrZSksdGhpcy5zdGF0ZT1NdC5LRVlfTE9BRElORyxuLnRyaWdnZXIoWi5hLktFWV9MT0FESU5HLHtmcmFnOnR9KX0sZS5wcm90b3R5cGUuZ2V0QnVmZmVyZWRGcmFnPWZ1bmN0aW9uKHQpe3JldHVybiBUdC5zZWFyY2godGhpcy5fYnVmZmVyZWRGcmFncyxmdW5jdGlvbihlKXtyZXR1cm4gdDxlLnN0YXJ0UFRTPy0xOnQ+ZS5lbmRQVFM/MTowfSl9LGUucHJvdG90eXBlLmZvbGxvd2luZ0J1ZmZlcmVkRnJhZz1mdW5jdGlvbih0KXtyZXR1cm4gdD90aGlzLmdldEJ1ZmZlcmVkRnJhZyh0LmVuZFBUUysuNSk6bnVsbH0sZS5wcm90b3R5cGUuX2NoZWNrRnJhZ21lbnRDaGFuZ2VkPWZ1bmN0aW9uKCl7dmFyIHQsZSxyPXRoaXMubWVkaWE7aWYociYmci5yZWFkeVN0YXRlJiYhMT09PXIuc2Vla2luZyYmKGU9ci5jdXJyZW50VGltZSxlPnIucGxheWJhY2tSYXRlKnRoaXMubGFzdEN1cnJlbnRUaW1lJiYodGhpcy5sYXN0Q3VycmVudFRpbWU9ZSksX3QuaXNCdWZmZXJlZChyLGUpP3Q9dGhpcy5nZXRCdWZmZXJlZEZyYWcoZSk6X3QuaXNCdWZmZXJlZChyLGUrLjEpJiYodD10aGlzLmdldEJ1ZmZlcmVkRnJhZyhlKy4xKSksdCkpe3ZhciBpPXQ7aWYoaSE9PXRoaXMuZnJhZ1BsYXlpbmcpe3RoaXMuaGxzLnRyaWdnZXIoWi5hLkZSQUdfQ0hBTkdFRCx7ZnJhZzppfSk7dmFyIGE9aS5sZXZlbDt0aGlzLmZyYWdQbGF5aW5nJiZ0aGlzLmZyYWdQbGF5aW5nLmxldmVsPT09YXx8dGhpcy5obHMudHJpZ2dlcihaLmEuTEVWRUxfU1dJVENIRUQse2xldmVsOmF9KSx0aGlzLmZyYWdQbGF5aW5nPWl9fX0sZS5wcm90b3R5cGUuaW1tZWRpYXRlTGV2ZWxTd2l0Y2g9ZnVuY3Rpb24oKXtpZih0dC5iLmxvZygiaW1tZWRpYXRlTGV2ZWxTd2l0Y2giKSwhdGhpcy5pbW1lZGlhdGVTd2l0Y2gpe3RoaXMuaW1tZWRpYXRlU3dpdGNoPSEwO3ZhciB0PXRoaXMubWVkaWEsZT12b2lkIDA7dD8oZT10LnBhdXNlZCx0LnBhdXNlKCkpOmU9ITAsdGhpcy5wcmV2aW91c2x5UGF1c2VkPWV9dmFyIHI9dGhpcy5mcmFnQ3VycmVudDtyJiZyLmxvYWRlciYmci5sb2FkZXIuYWJvcnQoKSx0aGlzLmZyYWdDdXJyZW50PW51bGwsdm9pZCAwIT09dGhpcy5mcmFnTG9hZElkeCYmKHRoaXMuZnJhZ0xvYWRJZHgrPTIqdGhpcy5jb25maWcuZnJhZ0xvYWRpbmdMb29wVGhyZXNob2xkKSx0aGlzLmZsdXNoTWFpbkJ1ZmZlcigwLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSl9LGUucHJvdG90eXBlLmltbWVkaWF0ZUxldmVsU3dpdGNoRW5kPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tZWRpYTt0JiZ0LmJ1ZmZlcmVkLmxlbmd0aCYmKHRoaXMuaW1tZWRpYXRlU3dpdGNoPSExLF90LmlzQnVmZmVyZWQodCx0LmN1cnJlbnRUaW1lKSYmKHQuY3VycmVudFRpbWUtPTFlLTQpLHRoaXMucHJldmlvdXNseVBhdXNlZHx8dC5wbGF5KCkpfSxlLnByb3RvdHlwZS5uZXh0TGV2ZWxTd2l0Y2g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1lZGlhO2lmKHQmJnQucmVhZHlTdGF0ZSl7dmFyIGU9dm9pZCAwLHI9dm9pZCAwLGk9dm9pZCAwO2lmKHRoaXMuZnJhZ0xvYWRJZHgrPTIqdGhpcy5jb25maWcuZnJhZ0xvYWRpbmdMb29wVGhyZXNob2xkLHI9dGhpcy5nZXRCdWZmZXJlZEZyYWcodC5jdXJyZW50VGltZSksciYmci5zdGFydFBUUz4xJiZ0aGlzLmZsdXNoTWFpbkJ1ZmZlcigwLHIuc3RhcnRQVFMtMSksdC5wYXVzZWQpZT0wO2Vsc2V7dmFyIGE9dGhpcy5obHMubmV4dExvYWRMZXZlbCxuPXRoaXMubGV2ZWxzW2FdLG89dGhpcy5mcmFnTGFzdEticHM7ZT1vJiZ0aGlzLmZyYWdDdXJyZW50P3RoaXMuZnJhZ0N1cnJlbnQuZHVyYXRpb24qbi5iaXRyYXRlLygxZTMqbykrMTowfWlmKChpPXRoaXMuZ2V0QnVmZmVyZWRGcmFnKHQuY3VycmVudFRpbWUrZSkpJiYoaT10aGlzLmZvbGxvd2luZ0J1ZmZlcmVkRnJhZyhpKSkpe3ZhciBzPXRoaXMuZnJhZ0N1cnJlbnQ7cyYmcy5sb2FkZXImJnMubG9hZGVyLmFib3J0KCksdGhpcy5mcmFnQ3VycmVudD1udWxsLHRoaXMuZmx1c2hNYWluQnVmZmVyKGkubWF4U3RhcnRQVFMsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKX19fSxlLnByb3RvdHlwZS5mbHVzaE1haW5CdWZmZXI9ZnVuY3Rpb24odCxlKXt0aGlzLnN0YXRlPU10LkJVRkZFUl9GTFVTSElORzt2YXIgcj17c3RhcnRPZmZzZXQ6dCxlbmRPZmZzZXQ6ZX07dGhpcy5hbHRBdWRpbyYmKHIudHlwZT0idmlkZW8iKSx0aGlzLmhscy50cmlnZ2VyKFouYS5CVUZGRVJfRkxVU0hJTkcscil9LGUucHJvdG90eXBlLm9uTWVkaWFBdHRhY2hlZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm1lZGlhPXRoaXMubWVkaWFCdWZmZXI9dC5tZWRpYTt0aGlzLm9udnNlZWtpbmc9dGhpcy5vbk1lZGlhU2Vla2luZy5iaW5kKHRoaXMpLHRoaXMub252c2Vla2VkPXRoaXMub25NZWRpYVNlZWtlZC5iaW5kKHRoaXMpLHRoaXMub252ZW5kZWQ9dGhpcy5vbk1lZGlhRW5kZWQuYmluZCh0aGlzKSxlLmFkZEV2ZW50TGlzdGVuZXIoInNlZWtpbmciLHRoaXMub252c2Vla2luZyksZS5hZGRFdmVudExpc3RlbmVyKCJzZWVrZWQiLHRoaXMub252c2Vla2VkKSxlLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLm9udmVuZGVkKTt2YXIgcj10aGlzLmNvbmZpZzt0aGlzLmxldmVscyYmci5hdXRvU3RhcnRMb2FkJiZ0aGlzLmhscy5zdGFydExvYWQoci5zdGFydFBvc2l0aW9uKX0sZS5wcm90b3R5cGUub25NZWRpYURldGFjaGluZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMubWVkaWE7dCYmdC5lbmRlZCYmKHR0LmIubG9nKCJNU0UgZGV0YWNoaW5nIGFuZCB2aWRlbyBlbmRlZCwgcmVzZXQgc3RhcnRQb3NpdGlvbiIpLHRoaXMuc3RhcnRQb3NpdGlvbj10aGlzLmxhc3RDdXJyZW50VGltZT0wKTt2YXIgZT10aGlzLmxldmVscztlJiZlLmZvckVhY2goZnVuY3Rpb24odCl7dC5kZXRhaWxzJiZ0LmRldGFpbHMuZnJhZ21lbnRzLmZvckVhY2goZnVuY3Rpb24odCl7dC5sb2FkQ291bnRlcj12b2lkIDAsdC5iYWNrdHJhY2tlZD12b2lkIDB9KX0pLHQmJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlZWtpbmciLHRoaXMub252c2Vla2luZyksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWVrZWQiLHRoaXMub252c2Vla2VkKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLm9udmVuZGVkKSx0aGlzLm9udnNlZWtpbmc9dGhpcy5vbnZzZWVrZWQ9dGhpcy5vbnZlbmRlZD1udWxsKSx0aGlzLm1lZGlhPXRoaXMubWVkaWFCdWZmZXI9bnVsbCx0aGlzLmxvYWRlZG1ldGFkYXRhPSExLHRoaXMuc3RvcExvYWQoKX0sZS5wcm90b3R5cGUub25NZWRpYVNlZWtpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1lZGlhLGU9dD90LmN1cnJlbnRUaW1lOnZvaWQgMCxyPXRoaXMuY29uZmlnO2lzTmFOKGUpfHx0dC5iLmxvZygibWVkaWEgc2Vla2luZyB0byAiK2UudG9GaXhlZCgzKSk7dmFyIGk9dGhpcy5tZWRpYUJ1ZmZlcj90aGlzLm1lZGlhQnVmZmVyOnQsYT1fdC5idWZmZXJJbmZvKGksZSx0aGlzLmNvbmZpZy5tYXhCdWZmZXJIb2xlKTtpZih0aGlzLnN0YXRlPT09TXQuRlJBR19MT0FESU5HKXt2YXIgbj10aGlzLmZyYWdDdXJyZW50O2lmKDA9PT1hLmxlbiYmbil7dmFyIG89ci5tYXhGcmFnTG9va1VwVG9sZXJhbmNlLHM9bi5zdGFydC1vLGw9bi5zdGFydCtuLmR1cmF0aW9uK287ZTxzfHxlPmw/KG4ubG9hZGVyJiYodHQuYi5sb2coInNlZWtpbmcgb3V0c2lkZSBvZiBidWZmZXIgd2hpbGUgZnJhZ21lbnQgbG9hZCBpbiBwcm9ncmVzcywgY2FuY2VsIGZyYWdtZW50IGxvYWQiKSxuLmxvYWRlci5hYm9ydCgpKSx0aGlzLmZyYWdDdXJyZW50PW51bGwsdGhpcy5mcmFnUHJldmlvdXM9bnVsbCx0aGlzLnN0YXRlPU10LklETEUpOnR0LmIubG9nKCJzZWVraW5nIG91dHNpZGUgb2YgYnVmZmVyIGJ1dCB3aXRoaW4gY3VycmVudGx5IGxvYWRlZCBmcmFnbWVudCByYW5nZSIpfX1lbHNlIHRoaXMuc3RhdGU9PT1NdC5FTkRFRCYmKDA9PT1hLmxlbiYmKHRoaXMuZnJhZ1ByZXZpb3VzPTApLHRoaXMuc3RhdGU9TXQuSURMRSk7dCYmKHRoaXMubGFzdEN1cnJlbnRUaW1lPWUpLHRoaXMuc3RhdGUhPT1NdC5GUkFHX0xPQURJTkcmJnZvaWQgMCE9PXRoaXMuZnJhZ0xvYWRJZHgmJih0aGlzLmZyYWdMb2FkSWR4Kz0yKnIuZnJhZ0xvYWRpbmdMb29wVGhyZXNob2xkKSx0aGlzLmxvYWRlZG1ldGFkYXRhfHwodGhpcy5uZXh0TG9hZFBvc2l0aW9uPXRoaXMuc3RhcnRQb3NpdGlvbj1lKSx0aGlzLnRpY2soKX0sZS5wcm90b3R5cGUub25NZWRpYVNlZWtlZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMubWVkaWEsZT10P3QuY3VycmVudFRpbWU6dm9pZCAwO2lzTmFOKGUpfHx0dC5iLmxvZygibWVkaWEgc2Vla2VkIHRvICIrZS50b0ZpeGVkKDMpKSx0aGlzLnRpY2soKX0sZS5wcm90b3R5cGUub25NZWRpYUVuZGVkPWZ1bmN0aW9uKCl7dHQuYi5sb2coIm1lZGlhIGVuZGVkIiksdGhpcy5zdGFydFBvc2l0aW9uPXRoaXMubGFzdEN1cnJlbnRUaW1lPTB9LGUucHJvdG90eXBlLm9uTWFuaWZlc3RMb2FkaW5nPWZ1bmN0aW9uKCl7dHQuYi5sb2coInRyaWdnZXIgQlVGRkVSX1JFU0VUIiksdGhpcy5obHMudHJpZ2dlcihaLmEuQlVGRkVSX1JFU0VUKSx0aGlzLl9idWZmZXJlZEZyYWdzPVtdLHRoaXMuc3RhbGxlZD0hMSx0aGlzLnN0YXJ0UG9zaXRpb249dGhpcy5sYXN0Q3VycmVudFRpbWU9MH0sZS5wcm90b3R5cGUub25NYW5pZmVzdFBhcnNlZD1mdW5jdGlvbih0KXt2YXIgZSxyPSExLGk9ITE7dC5sZXZlbHMuZm9yRWFjaChmdW5jdGlvbih0KXsoZT10LmF1ZGlvQ29kZWMpJiYoLTEhPT1lLmluZGV4T2YoIm1wNGEuNDAuMiIpJiYocj0hMCksLTEhPT1lLmluZGV4T2YoIm1wNGEuNDAuNSIpJiYoaT0hMCkpfSksdGhpcy5hdWRpb0NvZGVjU3dpdGNoPXImJmksdGhpcy5hdWRpb0NvZGVjU3dpdGNoJiZ0dC5iLmxvZygiYm90aCBBQUMvSEUtQUFDIGF1ZGlvIGZvdW5kIGluIGxldmVsczsgZGVjbGFyaW5nIGxldmVsIGNvZGVjIGFzIEhFLUFBQyIpLHRoaXMubGV2ZWxzPXQubGV2ZWxzLHRoaXMuc3RhcnRMZXZlbExvYWRlZD0hMSx0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZD0hMTt2YXIgYT10aGlzLmNvbmZpZzsoYS5hdXRvU3RhcnRMb2FkfHx0aGlzLmZvcmNlU3RhcnRMb2FkKSYmdGhpcy5obHMuc3RhcnRMb2FkKGEuc3RhcnRQb3NpdGlvbil9LGUucHJvdG90eXBlLm9uTGV2ZWxMb2FkZWQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5kZXRhaWxzLHI9dC5sZXZlbCxpPXRoaXMubGV2ZWxzW3RoaXMubGV2ZWxMYXN0TG9hZGVkXSxhPXRoaXMubGV2ZWxzW3JdLG49ZS50b3RhbGR1cmF0aW9uLG89MDtpZih0dC5iLmxvZygibGV2ZWwgIityKyIgbG9hZGVkIFsiK2Uuc3RhcnRTTisiLCIrZS5lbmRTTisiXSxkdXJhdGlvbjoiK24pLGUubGl2ZSl7dmFyIHM9YS5kZXRhaWxzO3MmJmUuZnJhZ21lbnRzLmxlbmd0aD4wPyhiKHMsZSksbz1lLmZyYWdtZW50c1swXS5zdGFydCx0aGlzLmxpdmVTeW5jUG9zaXRpb249dGhpcy5jb21wdXRlTGl2ZVBvc2l0aW9uKG8scyksZS5QVFNLbm93biYmIWlzTmFOKG8pP3R0LmIubG9nKCJsaXZlIHBsYXlsaXN0IHNsaWRpbmc6IitvLnRvRml4ZWQoMykpOih0dC5iLmxvZygibGl2ZSBwbGF5bGlzdCAtIG91dGRhdGVkIFBUUywgdW5rbm93biBzbGlkaW5nIiksUyh0aGlzLmZyYWdQcmV2aW91cyxpLGUpKSk6KHR0LmIubG9nKCJsaXZlIHBsYXlsaXN0IC0gZmlyc3QgbG9hZCwgdW5rbm93biBzbGlkaW5nIiksZS5QVFNLbm93bj0hMSxTKHRoaXMuZnJhZ1ByZXZpb3VzLGksZSkpfWVsc2UgZS5QVFNLbm93bj0hMTtpZihhLmRldGFpbHM9ZSx0aGlzLmxldmVsTGFzdExvYWRlZD1yLHRoaXMuaGxzLnRyaWdnZXIoWi5hLkxFVkVMX1VQREFURUQse2RldGFpbHM6ZSxsZXZlbDpyfSksITE9PT10aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCl7aWYoLTE9PT10aGlzLnN0YXJ0UG9zaXRpb258fC0xPT09dGhpcy5sYXN0Q3VycmVudFRpbWUpe3ZhciBsPWUuc3RhcnRUaW1lT2Zmc2V0O2lzTmFOKGwpP2UubGl2ZT8odGhpcy5zdGFydFBvc2l0aW9uPXRoaXMuY29tcHV0ZUxpdmVQb3NpdGlvbihvLGUpLHR0LmIubG9nKCJjb25maWd1cmUgc3RhcnRQb3NpdGlvbiB0byAiK3RoaXMuc3RhcnRQb3NpdGlvbikpOnRoaXMuc3RhcnRQb3NpdGlvbj0wOihsPDAmJih0dC5iLmxvZygibmVnYXRpdmUgc3RhcnQgdGltZSBvZmZzZXQgIitsKyIsIGNvdW50IGZyb20gZW5kIG9mIGxhc3QgZnJhZ21lbnQiKSxsPW8rbitsKSx0dC5iLmxvZygic3RhcnQgdGltZSBvZmZzZXQgZm91bmQgaW4gcGxheWxpc3QsIGFkanVzdCBzdGFydFBvc2l0aW9uIHRvICIrbCksdGhpcy5zdGFydFBvc2l0aW9uPWwpLHRoaXMubGFzdEN1cnJlbnRUaW1lPXRoaXMuc3RhcnRQb3NpdGlvbn10aGlzLm5leHRMb2FkUG9zaXRpb249dGhpcy5zdGFydFBvc2l0aW9ufXRoaXMuc3RhdGU9PT1NdC5XQUlUSU5HX0xFVkVMJiYodGhpcy5zdGF0ZT1NdC5JRExFKSx0aGlzLnRpY2soKX0sZS5wcm90b3R5cGUub25LZXlMb2FkZWQ9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPT09TXQuS0VZX0xPQURJTkcmJih0aGlzLnN0YXRlPU10LklETEUsdGhpcy50aWNrKCkpfSxlLnByb3RvdHlwZS5vbkZyYWdMb2FkZWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mcmFnQ3VycmVudCxyPXQuZnJhZztpZih0aGlzLnN0YXRlPT09TXQuRlJBR19MT0FESU5HJiZlJiYibWFpbiI9PT1yLnR5cGUmJnIubGV2ZWw9PT1lLmxldmVsJiZyLnNuPT09ZS5zbil7dmFyIGk9dC5zdGF0cyxhPXRoaXMubGV2ZWxzW2UubGV2ZWxdLG49YS5kZXRhaWxzO2lmKHR0LmIubG9nKCJMb2FkZWQgICIrZS5zbisiIG9mIFsiK24uc3RhcnRTTisiICwiK24uZW5kU04rIl0sbGV2ZWwgIitlLmxldmVsKSx0aGlzLmJpdHJhdGVUZXN0PSExLHRoaXMuc3RhdHM9aSwhMD09PXIuYml0cmF0ZVRlc3QmJnRoaXMuaGxzLm5leHRMb2FkTGV2ZWwpdGhpcy5zdGF0ZT1NdC5JRExFLHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkPSExLGkudHBhcnNlZD1pLnRidWZmZXJlZD1wZXJmb3JtYW5jZS5ub3coKSx0aGlzLmhscy50cmlnZ2VyKFouYS5GUkFHX0JVRkZFUkVELHtzdGF0czppLGZyYWc6ZSxpZDoibWFpbiJ9KSx0aGlzLnRpY2soKTtlbHNlIGlmKCJpbml0U2VnbWVudCI9PT1yLnNuKXRoaXMuc3RhdGU9TXQuSURMRSxpLnRwYXJzZWQ9aS50YnVmZmVyZWQ9cGVyZm9ybWFuY2Uubm93KCksbi5pbml0U2VnbWVudC5kYXRhPXQucGF5bG9hZCx0aGlzLmhscy50cmlnZ2VyKFouYS5GUkFHX0JVRkZFUkVELHtzdGF0czppLGZyYWc6ZSxpZDoibWFpbiJ9KSx0aGlzLnRpY2soKTtlbHNle3RoaXMuc3RhdGU9TXQuUEFSU0lORzt2YXIgbz1uLnRvdGFsZHVyYXRpb24scz1lLmxldmVsLGw9ZS5zbixkPXRoaXMuY29uZmlnLmRlZmF1bHRBdWRpb0NvZGVjfHxhLmF1ZGlvQ29kZWM7dGhpcy5hdWRpb0NvZGVjU3dhcCYmKHR0LmIubG9nKCJzd2FwcGluZyBwbGF5bGlzdCBhdWRpbyBjb2RlYyIpLHZvaWQgMD09PWQmJihkPXRoaXMubGFzdEF1ZGlvQ29kZWMpLGQmJihkPS0xIT09ZC5pbmRleE9mKCJtcDRhLjQwLjUiKT8ibXA0YS40MC4yIjoibXA0YS40MC41IikpLHRoaXMucGVuZGluZ0J1ZmZlcmluZz0hMCx0aGlzLmFwcGVuZGVkPSExLHR0LmIubG9nKCJQYXJzaW5nICIrbCsiIG9mIFsiK24uc3RhcnRTTisiICwiK24uZW5kU04rIl0sbGV2ZWwgIitzKyIsIGNjICIrZS5jYyk7dmFyIHU9dGhpcy5kZW11eGVyO3V8fCh1PXRoaXMuZGVtdXhlcj1uZXcga3QodGhpcy5obHMsIm1haW4iKSk7dmFyIGg9dGhpcy5tZWRpYSxmPWgmJmguc2Vla2luZyxjPSFmJiYobi5QVFNLbm93bnx8IW4ubGl2ZSkscD1uLmluaXRTZWdtZW50P24uaW5pdFNlZ21lbnQuZGF0YTpbXTt1LnB1c2godC5wYXlsb2FkLHAsZCxhLnZpZGVvQ29kZWMsZSxvLGMsdm9pZCAwKX19dGhpcy5mcmFnTG9hZEVycm9yPTB9LGUucHJvdG90eXBlLm9uRnJhZ1BhcnNpbmdJbml0U2VnbWVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZyYWdDdXJyZW50LHI9dC5mcmFnO2lmKGUmJiJtYWluIj09PXQuaWQmJnIuc249PT1lLnNuJiZyLmxldmVsPT09ZS5sZXZlbCYmdGhpcy5zdGF0ZT09PU10LlBBUlNJTkcpe3ZhciBpLGEsbj10LnRyYWNrcztpZihuLmF1ZGlvJiZ0aGlzLmFsdEF1ZGlvJiZkZWxldGUgbi5hdWRpbyxhPW4uYXVkaW8pe3ZhciBvPXRoaXMubGV2ZWxzW3RoaXMubGV2ZWxdLmF1ZGlvQ29kZWMscz1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7byYmdGhpcy5hdWRpb0NvZGVjU3dhcCYmKHR0LmIubG9nKCJzd2FwcGluZyBwbGF5bGlzdCBhdWRpbyBjb2RlYyIpLG89LTEhPT1vLmluZGV4T2YoIm1wNGEuNDAuNSIpPyJtcDRhLjQwLjIiOiJtcDRhLjQwLjUiKSx0aGlzLmF1ZGlvQ29kZWNTd2l0Y2gmJjEhPT1hLm1ldGFkYXRhLmNoYW5uZWxDb3VudCYmLTE9PT1zLmluZGV4T2YoImZpcmVmb3giKSYmKG89Im1wNGEuNDAuNSIpLC0xIT09cy5pbmRleE9mKCJhbmRyb2lkIikmJiJhdWRpby9tcGVnIiE9PWEuY29udGFpbmVyJiYobz0ibXA0YS40MC4yIix0dC5iLmxvZygiQW5kcm9pZDogZm9yY2UgYXVkaW8gY29kZWMgdG8gIitvKSksYS5sZXZlbENvZGVjPW8sYS5pZD10LmlkfWE9bi52aWRlbyxhJiYoYS5sZXZlbENvZGVjPXRoaXMubGV2ZWxzW3RoaXMubGV2ZWxdLnZpZGVvQ29kZWMsYS5pZD10LmlkKSx0aGlzLmhscy50cmlnZ2VyKFouYS5CVUZGRVJfQ09ERUNTLG4pO2ZvcihpIGluIG4pe2E9bltpXSx0dC5iLmxvZygibWFpbiB0cmFjazoiK2krIixjb250YWluZXI6IithLmNvbnRhaW5lcisiLGNvZGVjc1tsZXZlbC9wYXJzZWRdPVsiK2EubGV2ZWxDb2RlYysiLyIrYS5jb2RlYysiXSIpO3ZhciBsPWEuaW5pdFNlZ21lbnQ7bCYmKHRoaXMuYXBwZW5kZWQ9ITAsdGhpcy5wZW5kaW5nQnVmZmVyaW5nPSEwLHRoaXMuaGxzLnRyaWdnZXIoWi5hLkJVRkZFUl9BUFBFTkRJTkcse3R5cGU6aSxkYXRhOmwscGFyZW50OiJtYWluIixjb250ZW50OiJpbml0U2VnbWVudCJ9KSl9dGhpcy50aWNrKCl9fSxlLnByb3RvdHlwZS5vbkZyYWdQYXJzaW5nRGF0YT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLHI9dGhpcy5mcmFnQ3VycmVudCxpPXQuZnJhZztpZihyJiYibWFpbiI9PT10LmlkJiZpLnNuPT09ci5zbiYmaS5sZXZlbD09PXIubGV2ZWwmJigiYXVkaW8iIT09dC50eXBlfHwhdGhpcy5hbHRBdWRpbykmJnRoaXMuc3RhdGU9PT1NdC5QQVJTSU5HKXt2YXIgYT10aGlzLmxldmVsc1t0aGlzLmxldmVsXSxuPXI7aWYoaXNOYU4odC5lbmRQVFMpJiYodC5lbmRQVFM9dC5zdGFydFBUUytyLmR1cmF0aW9uLHQuZW5kRFRTPXQuc3RhcnREVFMrci5kdXJhdGlvbiksdHQuYi5sb2coIlBhcnNlZCAiK3QudHlwZSsiLFBUUzpbIit0LnN0YXJ0UFRTLnRvRml4ZWQoMykrIiwiK3QuZW5kUFRTLnRvRml4ZWQoMykrIl0sRFRTOlsiK3Quc3RhcnREVFMudG9GaXhlZCgzKSsiLyIrdC5lbmREVFMudG9GaXhlZCgzKSsiXSxuYjoiK3QubmIrIixkcm9wcGVkOiIrKHQuZHJvcHBlZHx8MCkpLCJ2aWRlbyI9PT10LnR5cGUpaWYobi5kcm9wcGVkPXQuZHJvcHBlZCxuLmRyb3BwZWQpe2lmKCFuLmJhY2t0cmFja2VkKXJldHVybiB0dC5iLndhcm4oIm1pc3NpbmcgdmlkZW8gZnJhbWUocyksIGJhY2t0cmFja2luZyBmcmFnbWVudCIpLG4uYmFja3RyYWNrZWQ9ITAsdGhpcy5uZXh0TG9hZFBvc2l0aW9uPXQuc3RhcnRQVFMsdGhpcy5zdGF0ZT1NdC5JRExFLHRoaXMuZnJhZ1ByZXZpb3VzPW4sdm9pZCB0aGlzLnRpY2soKTt0dC5iLndhcm4oIkFscmVhZHkgYmFja3RyYWNrZWQgb24gdGhpcyBmcmFnbWVudCwgYXBwZW5kaW5nIHdpdGggdGhlIGdhcCIpfWVsc2Ugbi5iYWNrdHJhY2tlZD0hMTt2YXIgbz15KGEuZGV0YWlscyxuLHQuc3RhcnRQVFMsdC5lbmRQVFMsdC5zdGFydERUUyx0LmVuZERUUykscz10aGlzLmhscztzLnRyaWdnZXIoWi5hLkxFVkVMX1BUU19VUERBVEVELHtkZXRhaWxzOmEuZGV0YWlscyxsZXZlbDp0aGlzLmxldmVsLGRyaWZ0Om8sdHlwZTp0LnR5cGUsc3RhcnQ6dC5zdGFydFBUUyxlbmQ6dC5lbmRQVFN9KSxbdC5kYXRhMSx0LmRhdGEyXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ImJnIubGVuZ3RoJiZlLnN0YXRlPT09TXQuUEFSU0lORyYmKGUuYXBwZW5kZWQ9ITAsZS5wZW5kaW5nQnVmZmVyaW5nPSEwLHMudHJpZ2dlcihaLmEuQlVGRkVSX0FQUEVORElORyx7dHlwZTp0LnR5cGUsZGF0YTpyLHBhcmVudDoibWFpbiIsY29udGVudDoiZGF0YSJ9KSl9KSx0aGlzLnRpY2soKX19LGUucHJvdG90eXBlLm9uRnJhZ1BhcnNlZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZyYWdDdXJyZW50LHI9dC5mcmFnO2UmJiJtYWluIj09PXQuaWQmJnIuc249PT1lLnNuJiZyLmxldmVsPT09ZS5sZXZlbCYmdGhpcy5zdGF0ZT09PU10LlBBUlNJTkcmJih0aGlzLnN0YXRzLnRwYXJzZWQ9cGVyZm9ybWFuY2Uubm93KCksdGhpcy5zdGF0ZT1NdC5QQVJTRUQsdGhpcy5fY2hlY2tBcHBlbmRlZFBhcnNlZCgpKX0sZS5wcm90b3R5cGUub25BdWRpb1RyYWNrU3dpdGNoaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPSEhdC51cmwscj10LmlkO2lmKCFlKXtpZih0aGlzLm1lZGlhQnVmZmVyIT09dGhpcy5tZWRpYSl7dHQuYi5sb2coInN3aXRjaGluZyBvbiBtYWluIGF1ZGlvLCB1c2UgbWVkaWEuYnVmZmVyZWQgdG8gc2NoZWR1bGUgbWFpbiBmcmFnbWVudCBsb2FkaW5nIiksdGhpcy5tZWRpYUJ1ZmZlcj10aGlzLm1lZGlhO3ZhciBpPXRoaXMuZnJhZ0N1cnJlbnQ7aS5sb2FkZXImJih0dC5iLmxvZygic3dpdGNoaW5nIHRvIG1haW4gYXVkaW8gdHJhY2ssIGNhbmNlbCBtYWluIGZyYWdtZW50IGxvYWQiKSxpLmxvYWRlci5hYm9ydCgpKSx0aGlzLmZyYWdDdXJyZW50PW51bGwsdGhpcy5mcmFnUHJldmlvdXM9bnVsbCx0aGlzLmRlbXV4ZXImJih0aGlzLmRlbXV4ZXIuZGVzdHJveSgpLHRoaXMuZGVtdXhlcj1udWxsKSx0aGlzLnN0YXRlPU10LklETEV9dmFyIGE9dGhpcy5obHM7YS50cmlnZ2VyKFouYS5CVUZGRVJfRkxVU0hJTkcse3N0YXJ0T2Zmc2V0OjAsZW5kT2Zmc2V0Ok51bWJlci5QT1NJVElWRV9JTkZJTklUWSx0eXBlOiJhdWRpbyJ9KSxhLnRyaWdnZXIoWi5hLkFVRElPX1RSQUNLX1NXSVRDSEVELHtpZDpyfSksdGhpcy5hbHRBdWRpbz0hMX19LGUucHJvdG90eXBlLm9uQXVkaW9UcmFja1N3aXRjaGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaWQscj0hIXRoaXMuaGxzLmF1ZGlvVHJhY2tzW2VdLnVybDtpZihyKXt2YXIgaT10aGlzLnZpZGVvQnVmZmVyO2kmJnRoaXMubWVkaWFCdWZmZXIhPT1pJiYodHQuYi5sb2coInN3aXRjaGluZyBvbiBhbHRlcm5hdGUgYXVkaW8sIHVzZSB2aWRlby5idWZmZXJlZCB0byBzY2hlZHVsZSBtYWluIGZyYWdtZW50IGxvYWRpbmciKSx0aGlzLm1lZGlhQnVmZmVyPWkpfXRoaXMuYWx0QXVkaW89cix0aGlzLnRpY2soKX0sZS5wcm90b3R5cGUub25CdWZmZXJDcmVhdGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXQudHJhY2tzLHI9dm9pZCAwLGk9dm9pZCAwLGE9ITE7Zm9yKHZhciBuIGluIGUpe3ZhciBvPWVbbl07Im1haW4iPT09by5pZD8oaT1uLHI9bywidmlkZW8iPT09biYmKHRoaXMudmlkZW9CdWZmZXI9ZVtuXS5idWZmZXIpKTphPSEwfWEmJnI/KHR0LmIubG9nKCJhbHRlcm5hdGUgdHJhY2sgZm91bmQsIHVzZSAiK2krIi5idWZmZXJlZCB0byBzY2hlZHVsZSBtYWluIGZyYWdtZW50IGxvYWRpbmciKSx0aGlzLm1lZGlhQnVmZmVyPXIuYnVmZmVyKTp0aGlzLm1lZGlhQnVmZmVyPXRoaXMubWVkaWF9LGUucHJvdG90eXBlLm9uQnVmZmVyQXBwZW5kZWQ9ZnVuY3Rpb24odCl7aWYoIm1haW4iPT09dC5wYXJlbnQpe3ZhciBlPXRoaXMuc3RhdGU7ZSE9PU10LlBBUlNJTkcmJmUhPT1NdC5QQVJTRUR8fCh0aGlzLnBlbmRpbmdCdWZmZXJpbmc9dC5wZW5kaW5nPjAsdGhpcy5fY2hlY2tBcHBlbmRlZFBhcnNlZCgpKX19LGUucHJvdG90eXBlLl9jaGVja0FwcGVuZGVkUGFyc2VkPWZ1bmN0aW9uKCl7aWYoISh0aGlzLnN0YXRlIT09TXQuUEFSU0VEfHx0aGlzLmFwcGVuZGVkJiZ0aGlzLnBlbmRpbmdCdWZmZXJpbmcpKXt2YXIgdD10aGlzLmZyYWdDdXJyZW50O2lmKHQpe3ZhciBlPXRoaXMubWVkaWFCdWZmZXI/dGhpcy5tZWRpYUJ1ZmZlcjp0aGlzLm1lZGlhO3R0LmIubG9nKCJtYWluIGJ1ZmZlcmVkIDogIitDdC50b1N0cmluZyhlLmJ1ZmZlcmVkKSk7dmFyIHI9dGhpcy5fYnVmZmVyZWRGcmFncy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIF90LmlzQnVmZmVyZWQoZSwodC5zdGFydFBUUyt0LmVuZFBUUykvMil9KTtyLnB1c2godCksdGhpcy5fYnVmZmVyZWRGcmFncz1yLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zdGFydFBUUy1lLnN0YXJ0UFRTfSksdGhpcy5mcmFnUHJldmlvdXM9dDt2YXIgaT10aGlzLnN0YXRzO2kudGJ1ZmZlcmVkPXBlcmZvcm1hbmNlLm5vdygpLHRoaXMuZnJhZ0xhc3RLYnBzPU1hdGgucm91bmQoOCppLnRvdGFsLyhpLnRidWZmZXJlZC1pLnRmaXJzdCkpLHRoaXMuaGxzLnRyaWdnZXIoWi5hLkZSQUdfQlVGRkVSRUQse3N0YXRzOmksZnJhZzp0LGlkOiJtYWluIn0pLHRoaXMuc3RhdGU9TXQuSURMRX10aGlzLnRpY2soKX19LGUucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24odCl7dmFyIGU9dC5mcmFnfHx0aGlzLmZyYWdDdXJyZW50O2lmKCFlfHwibWFpbiI9PT1lLnR5cGUpe3ZhciByPSEhdGhpcy5tZWRpYSYmX3QuaXNCdWZmZXJlZCh0aGlzLm1lZGlhLHRoaXMubWVkaWEuY3VycmVudFRpbWUpJiZfdC5pc0J1ZmZlcmVkKHRoaXMubWVkaWEsdGhpcy5tZWRpYS5jdXJyZW50VGltZSsuNSk7c3dpdGNoKHQuZGV0YWlscyl7Y2FzZSAkLmEuRlJBR19MT0FEX0VSUk9SOmNhc2UgJC5hLkZSQUdfTE9BRF9USU1FT1VUOmNhc2UgJC5hLktFWV9MT0FEX0VSUk9SOmNhc2UgJC5hLktFWV9MT0FEX1RJTUVPVVQ6aWYoIXQuZmF0YWwpaWYodGhpcy5mcmFnTG9hZEVycm9yKzE8PXRoaXMuY29uZmlnLmZyYWdMb2FkaW5nTWF4UmV0cnkpe3ZhciBpPU1hdGgubWluKE1hdGgucG93KDIsdGhpcy5mcmFnTG9hZEVycm9yKSp0aGlzLmNvbmZpZy5mcmFnTG9hZGluZ1JldHJ5RGVsYXksdGhpcy5jb25maWcuZnJhZ0xvYWRpbmdNYXhSZXRyeVRpbWVvdXQpO2UubG9hZENvdW50ZXI9MCx0dC5iLndhcm4oIm1lZGlhQ29udHJvbGxlcjogZnJhZyBsb2FkaW5nIGZhaWxlZCwgcmV0cnkgaW4gIitpKyIgbXMiKSx0aGlzLnJldHJ5RGF0ZT1wZXJmb3JtYW5jZS5ub3coKStpLHRoaXMubG9hZGVkbWV0YWRhdGF8fCh0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZD0hMSx0aGlzLm5leHRMb2FkUG9zaXRpb249dGhpcy5zdGFydFBvc2l0aW9uKSx0aGlzLmZyYWdMb2FkRXJyb3IrKyx0aGlzLnN0YXRlPU10LkZSQUdfTE9BRElOR19XQUlUSU5HX1JFVFJZfWVsc2UgdHQuYi5lcnJvcigibWVkaWFDb250cm9sbGVyOiAiK3QuZGV0YWlscysiIHJlYWNoZXMgbWF4IHJldHJ5LCByZWRpc3BhdGNoIGFzIGZhdGFsIC4uLiIpLHQuZmF0YWw9ITAsdGhpcy5zdGF0ZT1NdC5FUlJPUjticmVhaztjYXNlICQuYS5GUkFHX0xPT1BfTE9BRElOR19FUlJPUjp0LmZhdGFsfHwocj8odGhpcy5fcmVkdWNlTWF4QnVmZmVyTGVuZ3RoKGUuZHVyYXRpb24pLHRoaXMuc3RhdGU9TXQuSURMRSk6ZS5hdXRvTGV2ZWwmJjAhPT1lLmxldmVsfHwodC5mYXRhbD0hMCx0aGlzLnN0YXRlPU10LkVSUk9SKSk7YnJlYWs7Y2FzZSAkLmEuTEVWRUxfTE9BRF9FUlJPUjpjYXNlICQuYS5MRVZFTF9MT0FEX1RJTUVPVVQ6dGhpcy5zdGF0ZSE9PU10LkVSUk9SJiYodC5mYXRhbD8odGhpcy5zdGF0ZT1NdC5FUlJPUix0dC5iLndhcm4oInN0cmVhbUNvbnRyb2xsZXI6ICIrdC5kZXRhaWxzKyIsc3dpdGNoIHRvICIrdGhpcy5zdGF0ZSsiIHN0YXRlIC4uLiIpKTp0LmxldmVsUmV0cnl8fHRoaXMuc3RhdGUhPT1NdC5XQUlUSU5HX0xFVkVMfHwodGhpcy5zdGF0ZT1NdC5JRExFKSk7YnJlYWs7Y2FzZSAkLmEuQlVGRkVSX0ZVTExfRVJST1I6Im1haW4iIT09dC5wYXJlbnR8fHRoaXMuc3RhdGUhPT1NdC5QQVJTSU5HJiZ0aGlzLnN0YXRlIT09TXQuUEFSU0VEfHwocj8odGhpcy5fcmVkdWNlTWF4QnVmZmVyTGVuZ3RoKHRoaXMuY29uZmlnLm1heEJ1ZmZlckxlbmd0aCksdGhpcy5zdGF0ZT1NdC5JRExFKToodHQuYi53YXJuKCJidWZmZXIgZnVsbCBlcnJvciBhbHNvIG1lZGlhLmN1cnJlbnRUaW1lIGlzIG5vdCBidWZmZXJlZCwgZmx1c2ggZXZlcnl0aGluZyIpLHRoaXMuZnJhZ0N1cnJlbnQ9bnVsbCx0aGlzLmZsdXNoTWFpbkJ1ZmZlcigwLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkpKX19fSxlLnByb3RvdHlwZS5fcmVkdWNlTWF4QnVmZmVyTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29uZmlnO2UubWF4TWF4QnVmZmVyTGVuZ3RoPj10JiYoZS5tYXhNYXhCdWZmZXJMZW5ndGgvPTIsdHQuYi53YXJuKCJtYWluOnJlZHVjZSBtYXggYnVmZmVyIGxlbmd0aCB0byAiK2UubWF4TWF4QnVmZmVyTGVuZ3RoKyJzIiksdGhpcy5mcmFnTG9hZElkeCs9MiplLmZyYWdMb2FkaW5nTG9vcFRocmVzaG9sZCl9LGUucHJvdG90eXBlLl9jaGVja0J1ZmZlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubWVkaWEsZT10aGlzLmNvbmZpZztpZih0JiZ0LnJlYWR5U3RhdGUpe3ZhciByPXQuY3VycmVudFRpbWUsaT10aGlzLm1lZGlhQnVmZmVyP3RoaXMubWVkaWFCdWZmZXI6dCxhPWkuYnVmZmVyZWQ7aWYoIXRoaXMubG9hZGVkbWV0YWRhdGEmJmEubGVuZ3RoKXt0aGlzLmxvYWRlZG1ldGFkYXRhPSEwO3ZhciBuPXQuc2Vla2luZz9yOnRoaXMuc3RhcnRQb3NpdGlvbixvPV90LmlzQnVmZmVyZWQoaSxuKSxzPWEuc3RhcnQoMCk7KHIhPT1ufHwhbyYmTWF0aC5hYnMobi1zKTxlLm1heFNlZWtIb2xlKSYmKHR0LmIubG9nKCJ0YXJnZXQgc3RhcnQgcG9zaXRpb246IituKSxvfHwobj1zLHR0LmIubG9nKCJ0YXJnZXQgc3RhcnQgcG9zaXRpb24gbm90IGJ1ZmZlcmVkLCBzZWVrIHRvIGJ1ZmZlcmVkLnN0YXJ0KDApICIrbikpLHR0LmIubG9nKCJhZGp1c3QgY3VycmVudFRpbWUgZnJvbSAiK3IrIiB0byAiK24pLHQuY3VycmVudFRpbWU9bil9ZWxzZSBpZih0aGlzLmltbWVkaWF0ZVN3aXRjaCl0aGlzLmltbWVkaWF0ZUxldmVsU3dpdGNoRW5kKCk7ZWxzZXt2YXIgbD1fdC5idWZmZXJJbmZvKHQsciwwKSxkPSEodC5wYXVzZWR8fHQuZW5kZWR8fDA9PT10LmJ1ZmZlcmVkLmxlbmd0aCksdT1yIT09dGhpcy5sYXN0Q3VycmVudFRpbWU7aWYodSl0aGlzLnN0YWxsUmVwb3J0ZWQmJih0dC5iLndhcm4oInBsYXliYWNrIG5vdCBzdHVjayBhbnltb3JlIEAiK3IrIiwgYWZ0ZXIgIitNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLXRoaXMuc3RhbGxlZCkrIm1zIiksdGhpcy5zdGFsbFJlcG9ydGVkPSExKSx0aGlzLnN0YWxsZWQ9dm9pZCAwLHRoaXMubnVkZ2VSZXRyeT0wO2Vsc2UgaWYoZCl7dmFyIGg9cGVyZm9ybWFuY2Uubm93KCksZj10aGlzLmhscztpZih0aGlzLnN0YWxsZWQpe3ZhciBjPWgtdGhpcy5zdGFsbGVkLHA9bC5sZW4sdj10aGlzLm51ZGdlUmV0cnl8fDA7aWYocDw9LjUmJmM+MWUzKmUubG93QnVmZmVyV2F0Y2hkb2dQZXJpb2Qpe3RoaXMuc3RhbGxSZXBvcnRlZHx8KHRoaXMuc3RhbGxSZXBvcnRlZD0hMCx0dC5iLndhcm4oInBsYXliYWNrIHN0YWxsaW5nIGluIGxvdyBidWZmZXIgQCIrciksZi50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuTUVESUFfRVJST1IsZGV0YWlsczokLmEuQlVGRkVSX1NUQUxMRURfRVJST1IsZmF0YWw6ITEsYnVmZmVyOnB9KSk7dmFyIGc9bC5uZXh0U3RhcnQsbT1nLXI7aWYoZyYmbTxlLm1heFNlZWtIb2xlJiZtPjApe3RoaXMubnVkZ2VSZXRyeT0rK3Y7dmFyIHk9diplLm51ZGdlT2Zmc2V0O3R0LmIubG9nKCJhZGp1c3QgY3VycmVudFRpbWUgZnJvbSAiK3QuY3VycmVudFRpbWUrIiB0byBuZXh0IGJ1ZmZlcmVkIEAgIitnKyIgKyBudWRnZSAiK3kpLHQuY3VycmVudFRpbWU9Zyt5LHRoaXMuc3RhbGxlZD12b2lkIDAsZi50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuTUVESUFfRVJST1IsZGV0YWlsczokLmEuQlVGRkVSX1NFRUtfT1ZFUl9IT0xFLGZhdGFsOiExLGhvbGU6Zyt5LXJ9KX19ZWxzZSBpZihwPi41JiZjPjFlMyplLmhpZ2hCdWZmZXJXYXRjaGRvZ1BlcmlvZClpZih0aGlzLnN0YWxsUmVwb3J0ZWR8fCh0aGlzLnN0YWxsUmVwb3J0ZWQ9ITAsdHQuYi53YXJuKCJwbGF5YmFjayBzdGFsbGluZyBpbiBoaWdoIGJ1ZmZlciBAIityKSxmLnRyaWdnZXIoWi5hLkVSUk9SLHt0eXBlOiQuYi5NRURJQV9FUlJPUixkZXRhaWxzOiQuYS5CVUZGRVJfU1RBTExFRF9FUlJPUixmYXRhbDohMSxidWZmZXI6cH0pKSx0aGlzLnN0YWxsZWQ9dm9pZCAwLHRoaXMubnVkZ2VSZXRyeT0rK3YsdjxlLm51ZGdlTWF4UmV0cnkpe3ZhciBiPXQuY3VycmVudFRpbWUsRT1iK3YqZS5udWRnZU9mZnNldDt0dC5iLmxvZygiYWRqdXN0IGN1cnJlbnRUaW1lIGZyb20gIitiKyIgdG8gIitFKSx0LmN1cnJlbnRUaW1lPUUsZi50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuTUVESUFfRVJST1IsZGV0YWlsczokLmEuQlVGRkVSX05VREdFX09OX1NUQUxMLGZhdGFsOiExfSl9ZWxzZSB0dC5iLmVycm9yKCJzdGlsbCBzdHVjayBpbiBoaWdoIGJ1ZmZlciBAIityKyIgYWZ0ZXIgIitlLm51ZGdlTWF4UmV0cnkrIiwgcmFpc2UgZmF0YWwgZXJyb3IiKSxmLnRyaWdnZXIoWi5hLkVSUk9SLHt0eXBlOiQuYi5NRURJQV9FUlJPUixkZXRhaWxzOiQuYS5CVUZGRVJfU1RBTExFRF9FUlJPUixmYXRhbDohMH0pfWVsc2UgdGhpcy5zdGFsbGVkPWgsdGhpcy5zdGFsbFJlcG9ydGVkPSExfX19fSxlLnByb3RvdHlwZS5vbkZyYWdMb2FkRW1lcmdlbmN5QWJvcnRlZD1mdW5jdGlvbigpe3RoaXMuc3RhdGU9TXQuSURMRSx0aGlzLmxvYWRlZG1ldGFkYXRhfHwodGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQ9ITEsdGhpcy5uZXh0TG9hZFBvc2l0aW9uPXRoaXMuc3RhcnRQb3NpdGlvbiksdGhpcy50aWNrKCl9LGUucHJvdG90eXBlLm9uQnVmZmVyRmx1c2hlZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMubWVkaWFCdWZmZXI/dGhpcy5tZWRpYUJ1ZmZlcjp0aGlzLm1lZGlhO3RoaXMuX2J1ZmZlcmVkRnJhZ3M9dGhpcy5fYnVmZmVyZWRGcmFncy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIF90LmlzQnVmZmVyZWQodCwoZS5zdGFydFBUUytlLmVuZFBUUykvMil9KSx0aGlzLmZyYWdMb2FkSWR4Kz0yKnRoaXMuY29uZmlnLmZyYWdMb2FkaW5nTG9vcFRocmVzaG9sZCx0aGlzLnN0YXRlPU10LklETEUsdGhpcy5mcmFnUHJldmlvdXM9bnVsbH0sZS5wcm90b3R5cGUuc3dhcEF1ZGlvQ29kZWM9ZnVuY3Rpb24oKXt0aGlzLmF1ZGlvQ29kZWNTd2FwPSF0aGlzLmF1ZGlvQ29kZWNTd2FwfSxlLnByb3RvdHlwZS5jb21wdXRlTGl2ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dm9pZCAwIT09dGhpcy5jb25maWcubGl2ZVN5bmNEdXJhdGlvbj90aGlzLmNvbmZpZy5saXZlU3luY0R1cmF0aW9uOnRoaXMuY29uZmlnLmxpdmVTeW5jRHVyYXRpb25Db3VudCplLnRhcmdldGR1cmF0aW9uO3JldHVybiB0K01hdGgubWF4KDAsZS50b3RhbGR1cmF0aW9uLXIpfSxGdChlLFt7a2V5OiJzdGF0ZSIsc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuc3RhdGUhPT10KXt2YXIgZT10aGlzLnN0YXRlO3RoaXMuX3N0YXRlPXQsdHQuYi5sb2coIm1haW4gc3RyZWFtOiIrZSsiLT4iK3QpLHRoaXMuaGxzLnRyaWdnZXIoWi5hLlNUUkVBTV9TVEFURV9UUkFOU0lUSU9OLHtwcmV2aW91c1N0YXRlOmUsbmV4dFN0YXRlOnR9KX19LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGF0ZX19LHtrZXk6ImN1cnJlbnRMZXZlbCIsZ2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tZWRpYTtpZih0KXt2YXIgZT10aGlzLmdldEJ1ZmZlcmVkRnJhZyh0LmN1cnJlbnRUaW1lKTtpZihlKXJldHVybiBlLmxldmVsfXJldHVybi0xfX0se2tleToibmV4dEJ1ZmZlcmVkRnJhZyIsZ2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tZWRpYTtyZXR1cm4gdD90aGlzLmZvbGxvd2luZ0J1ZmZlcmVkRnJhZyh0aGlzLmdldEJ1ZmZlcmVkRnJhZyh0LmN1cnJlbnRUaW1lKSk6bnVsbH19LHtrZXk6Im5leHRMZXZlbCIsZ2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5uZXh0QnVmZmVyZWRGcmFnO3JldHVybiB0P3QubGV2ZWw6LTF9fSx7a2V5OiJsaXZlU3luY1Bvc2l0aW9uIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGl2ZVN5bmNQb3NpdGlvbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xpdmVTeW5jUG9zaXRpb249dH19XSksZX0oaXQpLFV0PU50LEJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExLGkuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fXJldHVybiBmdW5jdGlvbihlLHIsaSl7cmV0dXJuIHImJnQoZS5wcm90b3R5cGUsciksaSYmdChlLGkpLGV9fSgpLEd0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUocil7RCh0aGlzLGUpO3ZhciBpPU8odGhpcyx0LmNhbGwodGhpcyxyLFouYS5NQU5JRkVTVF9MT0FERUQsWi5hLkxFVkVMX0xPQURFRCxaLmEuRlJBR19MT0FERUQsWi5hLkVSUk9SKSk7cmV0dXJuIGkub250aWNrPWkudGljay5iaW5kKGkpLGkuX21hbnVhbExldmVsPS0xLGl9cmV0dXJuIHgoZSx0KSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5jbGVhblRpbWVyKCksdGhpcy5fbWFudWFsTGV2ZWw9LTF9LGUucHJvdG90eXBlLmNsZWFuVGltZXI9ZnVuY3Rpb24oKXt0aGlzLnRpbWVyJiYoY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9bnVsbCl9LGUucHJvdG90eXBlLnN0YXJ0TG9hZD1mdW5jdGlvbigpe3RoaXMuY2FubG9hZD0hMDt2YXIgdD10aGlzLl9sZXZlbHM7dCYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubG9hZEVycm9yPTA7dmFyIGU9dC5kZXRhaWxzO2UmJmUubGl2ZSYmKHQuZGV0YWlscz12b2lkIDApfSksdGhpcy50aW1lciYmdGhpcy50aWNrKCl9LGUucHJvdG90eXBlLnN0b3BMb2FkPWZ1bmN0aW9uKCl7dGhpcy5jYW5sb2FkPSExfSxlLnByb3RvdHlwZS5vbk1hbmlmZXN0TG9hZGVkPWZ1bmN0aW9uKHQpe3ZhciBlLHI9W10saT1bXSxhPXt9LG49ITEscz0hMSxsPXRoaXMuaGxzLGQ9L2Nocm9tZXxmaXJlZm94Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7aWYodC5sZXZlbHMuZm9yRWFjaChmdW5jdGlvbih0KXt0LnZpZGVvQ29kZWMmJihuPSEwKSxkJiZ0LmF1ZGlvQ29kZWMmJi0xIT09dC5hdWRpb0NvZGVjLmluZGV4T2YoIm1wNGEuNDAuMzQiKSYmKHQuYXVkaW9Db2RlYz12b2lkIDApLCh0LmF1ZGlvQ29kZWN8fHQuYXR0cnMmJnQuYXR0cnMuQVVESU8pJiYocz0hMCk7dmFyIGU9YVt0LmJpdHJhdGVdO3ZvaWQgMD09PWU/KGFbdC5iaXRyYXRlXT1yLmxlbmd0aCx0LnVybD1bdC51cmxdLHQudXJsSWQ9MCxyLnB1c2godCkpOnJbZV0udXJsLnB1c2godC51cmwpfSksbiYmcz9yLmZvckVhY2goZnVuY3Rpb24odCl7dC52aWRlb0NvZGVjJiZpLnB1c2godCl9KTppPXIsaT1pLmZpbHRlcihmdW5jdGlvbih0KXt2YXIgZT10LmF1ZGlvQ29kZWMscj10LnZpZGVvQ29kZWM7cmV0dXJuKCFlfHxvKGUpKSYmKCFyfHxvKHIpKX0pLGkubGVuZ3RoKXtlPWlbMF0uYml0cmF0ZSxpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5iaXRyYXRlLWUuYml0cmF0ZX0pLHRoaXMuX2xldmVscz1pO2Zvcih2YXIgdT0wO3U8aS5sZW5ndGg7dSsrKWlmKGlbdV0uYml0cmF0ZT09PWUpe3RoaXMuX2ZpcnN0TGV2ZWw9dSx0dC5iLmxvZygibWFuaWZlc3QgbG9hZGVkLCIraS5sZW5ndGgrIiBsZXZlbChzKSBmb3VuZCwgZmlyc3QgYml0cmF0ZToiK2UpO2JyZWFrfWwudHJpZ2dlcihaLmEuTUFOSUZFU1RfUEFSU0VELHtsZXZlbHM6aSxmaXJzdExldmVsOnRoaXMuX2ZpcnN0TGV2ZWwsc3RhdHM6dC5zdGF0cyxhdWRpbzpzLHZpZGVvOm4sYWx0QXVkaW86dC5hdWRpb1RyYWNrcy5sZW5ndGg+MH0pfWVsc2UgbC50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuTUVESUFfRVJST1IsZGV0YWlsczokLmEuTUFOSUZFU1RfSU5DT01QQVRJQkxFX0NPREVDU19FUlJPUixmYXRhbDohMCx1cmw6bC51cmwscmVhc29uOiJubyBsZXZlbCB3aXRoIGNvbXBhdGlibGUgY29kZWNzIGZvdW5kIGluIG1hbmlmZXN0In0pfSxlLnByb3RvdHlwZS5zZXRMZXZlbEludGVybmFsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2xldmVscyxyPXRoaXMuaGxzO2lmKHQ+PTAmJnQ8ZS5sZW5ndGgpe2lmKHRoaXMuY2xlYW5UaW1lcigpLHRoaXMuX2xldmVsIT09dCl7dHQuYi5sb2coInN3aXRjaGluZyB0byBsZXZlbCAiK3QpLHRoaXMuX2xldmVsPXQ7dmFyIGk9ZVt0XTtpLmxldmVsPXQsci50cmlnZ2VyKFouYS5MRVZFTF9TV0lUQ0gsaSksci50cmlnZ2VyKFouYS5MRVZFTF9TV0lUQ0hJTkcsaSl9dmFyIGE9ZVt0XSxuPWEuZGV0YWlscztpZighbnx8ITA9PT1uLmxpdmUpe3ZhciBvPWEudXJsSWQ7ci50cmlnZ2VyKFouYS5MRVZFTF9MT0FESU5HLHt1cmw6YS51cmxbb10sbGV2ZWw6dCxpZDpvfSl9fWVsc2Ugci50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuT1RIRVJfRVJST1IsZGV0YWlsczokLmEuTEVWRUxfU1dJVENIX0VSUk9SLGxldmVsOnQsZmF0YWw6ITEscmVhc29uOiJpbnZhbGlkIGxldmVsIGlkeCJ9KX0sZS5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbih0KXtpZih0LmZhdGFsKXJldHVybiB2b2lkKHQudHlwZT09PSQuYi5ORVRXT1JLX0VSUk9SJiZ0aGlzLmNsZWFuVGltZXIoKSk7dmFyIGU9dC5kZXRhaWxzLHI9dGhpcy5obHMsaT12b2lkIDAsYT12b2lkIDAsbj0hMTtzd2l0Y2goZSl7Y2FzZSAkLmEuRlJBR19MT0FEX0VSUk9SOmNhc2UgJC5hLkZSQUdfTE9BRF9USU1FT1VUOmNhc2UgJC5hLkZSQUdfTE9PUF9MT0FESU5HX0VSUk9SOmNhc2UgJC5hLktFWV9MT0FEX0VSUk9SOmNhc2UgJC5hLktFWV9MT0FEX1RJTUVPVVQ6aT10LmZyYWcubGV2ZWw7YnJlYWs7Y2FzZSAkLmEuTEVWRUxfTE9BRF9FUlJPUjpjYXNlICQuYS5MRVZFTF9MT0FEX1RJTUVPVVQ6aT10LmNvbnRleHQubGV2ZWwsbj0hMDticmVhaztjYXNlICQuYS5SRU1VWF9BTExPQ19FUlJPUjppPXQubGV2ZWx9aWYodm9pZCAwIT09aSl7YT10aGlzLl9sZXZlbHNbaV0sYS5sb2FkRXJyb3I/YS5sb2FkRXJyb3IrKzphLmxvYWRFcnJvcj0xO3ZhciBvPWEudXJsLmxlbmd0aDtpZihvPjEmJmEubG9hZEVycm9yPG8pYS51cmxJZD0oYS51cmxJZCsxKSVvLGEuZGV0YWlscz12b2lkIDAsdHQuYi53YXJuKCJsZXZlbCBjb250cm9sbGVyLCIrZSsiIGZvciBsZXZlbCAiK2krIjogc3dpdGNoaW5nIHRvIHJlZHVuZGFudCBzdHJlYW0gaWQgIithLnVybElkKTtlbHNle2lmKC0xPT09dGhpcy5fbWFudWFsTGV2ZWwmJmkpdHQuYi53YXJuKCJsZXZlbCBjb250cm9sbGVyLCIrZSsiOiBzd2l0Y2gtZG93biBmb3IgbmV4dCBmcmFnbWVudCIpLHIubmV4dEF1dG9MZXZlbD1NYXRoLm1heCgwLGktMSk7ZWxzZSBpZihhJiZhLmRldGFpbHMmJmEuZGV0YWlscy5saXZlKXR0LmIud2FybigibGV2ZWwgY29udHJvbGxlciwiK2UrIiBvbiBsaXZlIHN0cmVhbSwgZGlzY2FyZCIpLG4mJih0aGlzLl9sZXZlbD12b2lkIDApO2Vsc2UgaWYoZT09PSQuYS5MRVZFTF9MT0FEX0VSUk9SfHxlPT09JC5hLkxFVkVMX0xPQURfVElNRU9VVCl7dmFyIHM9ci5tZWRpYSxsPXMmJl90LmlzQnVmZmVyZWQocyxzLmN1cnJlbnRUaW1lKSYmX3QuaXNCdWZmZXJlZChzLHMuY3VycmVudFRpbWUrLjUpO2lmKGwpe3ZhciBkPXIuY29uZmlnLmxldmVsTG9hZGluZ1JldHJ5RGVsYXk7dHQuYi53YXJuKCJsZXZlbCBjb250cm9sbGVyLCIrZSsiLCBidXQgbWVkaWEgYnVmZmVyZWQsIHJldHJ5IGluICIrZCsibXMiKSx0aGlzLnRpbWVyPXNldFRpbWVvdXQodGhpcy5vbnRpY2ssZCksdC5sZXZlbFJldHJ5PSEwfWVsc2UgdHQuYi5lcnJvcigiY2Fubm90IHJlY292ZXIgIitlKyIgZXJyb3IiKSx0aGlzLl9sZXZlbD12b2lkIDAsdGhpcy5jbGVhblRpbWVyKCksdC5mYXRhbD0hMH19fX0sZS5wcm90b3R5cGUub25GcmFnTG9hZGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZnJhZztpZihlJiYibWFpbiI9PT1lLnR5cGUpe3ZhciByPXRoaXMuX2xldmVsc1tlLmxldmVsXTtyJiYoci5sb2FkRXJyb3I9MCl9fSxlLnByb3RvdHlwZS5vbkxldmVsTG9hZGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGV2ZWw7aWYoZT09PXRoaXMuX2xldmVsKXt2YXIgcj10aGlzLl9sZXZlbHNbZV07ci5sb2FkRXJyb3I9MDt2YXIgaT10LmRldGFpbHM7aWYoaS5saXZlKXt2YXIgYT0xZTMqKGkuYXZlcmFnZXRhcmdldGR1cmF0aW9uP2kuYXZlcmFnZXRhcmdldGR1cmF0aW9uOmkudGFyZ2V0ZHVyYXRpb24pLG49ci5kZXRhaWxzO24mJmkuZW5kU049PT1uLmVuZFNOJiYoYS89Mix0dC5iLmxvZygic2FtZSBsaXZlIHBsYXlsaXN0LCByZWxvYWQgdHdpY2UgZmFzdGVyIikpLGEtPXBlcmZvcm1hbmNlLm5vdygpLXQuc3RhdHMudHJlcXVlc3QsYT1NYXRoLm1heCgxZTMsTWF0aC5yb3VuZChhKSksdHQuYi5sb2coImxpdmUgcGxheWxpc3QsIHJlbG9hZCBpbiAiK2ErIiBtcyIpLHRoaXMudGltZXI9c2V0VGltZW91dCh0aGlzLm9udGljayxhKX1lbHNlIHRoaXMudGltZXI9bnVsbH19LGUucHJvdG90eXBlLnRpY2s9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9sZXZlbDtpZih2b2lkIDAhPT10JiZ0aGlzLmNhbmxvYWQpe3ZhciBlPXRoaXMuX2xldmVsc1t0XTtpZihlJiZlLnVybCl7dmFyIHI9ZS51cmxJZDt0aGlzLmhscy50cmlnZ2VyKFouYS5MRVZFTF9MT0FESU5HLHt1cmw6ZS51cmxbcl0sbGV2ZWw6dCxpZDpyfSl9fX0sQnQoZSxbe2tleToibGV2ZWxzIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGV2ZWxzfX0se2tleToibGV2ZWwiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZXZlbH0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2xldmVscztlJiZlLmxlbmd0aD50JiYodGhpcy5fbGV2ZWw9PT10JiZ2b2lkIDAhPT1lW3RdLmRldGFpbHN8fHRoaXMuc2V0TGV2ZWxJbnRlcm5hbCh0KSl9fSx7a2V5OiJtYW51YWxMZXZlbCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hbnVhbExldmVsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbWFudWFsTGV2ZWw9dCx2b2lkIDA9PT10aGlzLl9zdGFydExldmVsJiYodGhpcy5fc3RhcnRMZXZlbD10KSwtMSE9PXQmJih0aGlzLmxldmVsPXQpfX0se2tleToiZmlyc3RMZXZlbCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpcnN0TGV2ZWx9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9maXJzdExldmVsPXR9fSx7a2V5OiJzdGFydExldmVsIixnZXQ6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzLl9zdGFydExldmVsKXt2YXIgdD10aGlzLmhscy5jb25maWcuc3RhcnRMZXZlbDtyZXR1cm4gdm9pZCAwIT09dD90OnRoaXMuX2ZpcnN0TGV2ZWx9cmV0dXJuIHRoaXMuX3N0YXJ0TGV2ZWx9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zdGFydExldmVsPXR9fSx7a2V5OiJuZXh0TG9hZExldmVsIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PXRoaXMuX21hbnVhbExldmVsP3RoaXMuX21hbnVhbExldmVsOnRoaXMuaGxzLm5leHRBdXRvTGV2ZWx9LHNldDpmdW5jdGlvbih0KXt0aGlzLmxldmVsPXQsLTE9PT10aGlzLl9tYW51YWxMZXZlbCYmKHRoaXMuaGxzLm5leHRBdXRvTGV2ZWw9dCl9fV0pLGV9KGl0KSxIdD1HdCxqdD1yKDQpLFZ0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUocil7SSh0aGlzLGUpO3ZhciBpPWsodGhpcyx0LmNhbGwodGhpcyxyLFouYS5NRURJQV9BVFRBQ0hFRCxaLmEuTUVESUFfREVUQUNISU5HLFouYS5GUkFHX1BBUlNJTkdfTUVUQURBVEEpKTtyZXR1cm4gaS5pZDNUcmFjaz12b2lkIDAsaS5tZWRpYT12b2lkIDAsaX1yZXR1cm4gUChlLHQpLGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpdC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5vbk1lZGlhQXR0YWNoZWQ9ZnVuY3Rpb24odCl7dGhpcy5tZWRpYT10Lm1lZGlhLHRoaXMubWVkaWF9LGUucHJvdG90eXBlLm9uTWVkaWFEZXRhY2hpbmc9ZnVuY3Rpb24oKXt0aGlzLm1lZGlhPXZvaWQgMH0sZS5wcm90b3R5cGUub25GcmFnUGFyc2luZ01ldGFkYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZnJhZyxyPXQuc2FtcGxlczt0aGlzLmlkM1RyYWNrfHwodGhpcy5pZDNUcmFjaz10aGlzLm1lZGlhLmFkZFRleHRUcmFjaygibWV0YWRhdGEiLCJpZDMiKSx0aGlzLmlkM1RyYWNrLm1vZGU9ImhpZGRlbiIpO2Zvcih2YXIgaT13aW5kb3cuV2ViS2l0RGF0YUN1ZXx8d2luZG93LlZUVEN1ZXx8d2luZG93LlRleHRUcmFja0N1ZSxhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBuPWp0LmEuZ2V0SUQzRnJhbWVzKHJbYV0uZGF0YSk7aWYobil7dmFyIG89clthXS5wdHMscz1hPHIubGVuZ3RoLTE/clthKzFdLnB0czplLmVuZFBUUztvPT09cyYmKHMrPTFlLTQpO2Zvcih2YXIgbD0wO2w8bi5sZW5ndGg7bCsrKXt2YXIgZD1uW2xdO2lmKCFqdC5hLmlzVGltZVN0YW1wRnJhbWUoZCkpe3ZhciB1PW5ldyBpKG8scywiIik7dS52YWx1ZT1kLHRoaXMuaWQzVHJhY2suYWRkQ3VlKHUpfX19fX0sZX0oaXQpLFd0PVZ0LEt0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtDKHRoaXMsdCksdGhpcy5hbHBoYV89ZT9NYXRoLmV4cChNYXRoLmxvZyguNSkvZSk6MCx0aGlzLmVzdGltYXRlXz0wLHRoaXMudG90YWxXZWlnaHRfPTB9cmV0dXJuIHQucHJvdG90eXBlLnNhbXBsZT1mdW5jdGlvbih0LGUpe3ZhciByPU1hdGgucG93KHRoaXMuYWxwaGFfLHQpO3RoaXMuZXN0aW1hdGVfPWUqKDEtcikrcip0aGlzLmVzdGltYXRlXyx0aGlzLnRvdGFsV2VpZ2h0Xys9dH0sdC5wcm90b3R5cGUuZ2V0VG90YWxXZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3RhbFdlaWdodF99LHQucHJvdG90eXBlLmdldEVzdGltYXRlPWZ1bmN0aW9uKCl7aWYodGhpcy5hbHBoYV8pe3ZhciB0PTEtTWF0aC5wb3codGhpcy5hbHBoYV8sdGhpcy50b3RhbFdlaWdodF8pO3JldHVybiB0aGlzLmVzdGltYXRlXy90fXJldHVybiB0aGlzLmVzdGltYXRlX30sdH0oKSxZdD1LdCx6dD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxyLGksYSl7Rih0aGlzLHQpLHRoaXMuaGxzPWUsdGhpcy5kZWZhdWx0RXN0aW1hdGVfPWEsdGhpcy5taW5XZWlnaHRfPS4wMDEsdGhpcy5taW5EZWxheU1zXz01MCx0aGlzLnNsb3dfPW5ldyBZdChyKSx0aGlzLmZhc3RfPW5ldyBZdChpKX1yZXR1cm4gdC5wcm90b3R5cGUuc2FtcGxlPWZ1bmN0aW9uKHQsZSl7dD1NYXRoLm1heCh0LHRoaXMubWluRGVsYXlNc18pO3ZhciByPThlMyplL3QsaT10LzFlMzt0aGlzLmZhc3RfLnNhbXBsZShpLHIpLHRoaXMuc2xvd18uc2FtcGxlKGkscil9LHQucHJvdG90eXBlLmNhbkVzdGltYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mYXN0XztyZXR1cm4gdCYmdC5nZXRUb3RhbFdlaWdodCgpPj10aGlzLm1pbldlaWdodF99LHQucHJvdG90eXBlLmdldEVzdGltYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuRXN0aW1hdGUoKT9NYXRoLm1pbih0aGlzLmZhc3RfLmdldEVzdGltYXRlKCksdGhpcy5zbG93Xy5nZXRFc3RpbWF0ZSgpKTp0aGlzLmRlZmF1bHRFc3RpbWF0ZV99LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LHR9KCksWHQ9enQscXQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19cmV0dXJuIGZ1bmN0aW9uKGUscixpKXtyZXR1cm4gciYmdChlLnByb3RvdHlwZSxyKSxpJiZ0KGUsaSksZX19KCksUXQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShyKXtNKHRoaXMsZSk7dmFyIGk9Tih0aGlzLHQuY2FsbCh0aGlzLHIsWi5hLkZSQUdfTE9BRElORyxaLmEuRlJBR19MT0FERUQsWi5hLkZSQUdfQlVGRkVSRUQsWi5hLkVSUk9SKSk7cmV0dXJuIGkubGFzdExvYWRlZEZyYWdMZXZlbD0wLGkuX25leHRBdXRvTGV2ZWw9LTEsaS5obHM9cixpLnRpbWVyPW51bGwsaS5fYndFc3RpbWF0b3I9bnVsbCxpLm9uQ2hlY2s9aS5fYWJhbmRvblJ1bGVzQ2hlY2suYmluZChpKSxpfXJldHVybiBVKGUsdCksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuY2xlYXJUaW1lcigpLGl0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LGUucHJvdG90eXBlLm9uRnJhZ0xvYWRpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dC5mcmFnO2lmKCJtYWluIj09PWUudHlwZSl7aWYodGhpcy50aW1lcnx8KHRoaXMudGltZXI9c2V0SW50ZXJ2YWwodGhpcy5vbkNoZWNrLDEwMCkpLCF0aGlzLl9id0VzdGltYXRvcil7dmFyIHI9dGhpcy5obHMsaT10LmZyYWcubGV2ZWwsYT1yLmxldmVsc1tpXS5kZXRhaWxzLmxpdmUsbj1yLmNvbmZpZyxvPXZvaWQgMCxzPXZvaWQgMDthPyhvPW4uYWJyRXdtYUZhc3RMaXZlLHM9bi5hYnJFd21hU2xvd0xpdmUpOihvPW4uYWJyRXdtYUZhc3RWb0Qscz1uLmFickV3bWFTbG93Vm9EKSx0aGlzLl9id0VzdGltYXRvcj1uZXcgWHQocixzLG8sbi5hYnJFd21hRGVmYXVsdEVzdGltYXRlKX10aGlzLmZyYWdDdXJyZW50PWV9fSxlLnByb3RvdHlwZS5fYWJhbmRvblJ1bGVzQ2hlY2s9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmhscyxlPXQubWVkaWEscj10aGlzLmZyYWdDdXJyZW50LGk9ci5sb2FkZXIsYT10Lm1pbkF1dG9MZXZlbDtpZighaXx8aS5zdGF0cyYmaS5zdGF0cy5hYm9ydGVkKXJldHVybiB0dC5iLndhcm4oImZyYWcgbG9hZGVyIGRlc3Ryb3kgb3IgYWJvcnRlZCwgZGlzYXJtIGFiYW5kb25SdWxlcyIpLHZvaWQgdGhpcy5jbGVhclRpbWVyKCk7dmFyIG49aS5zdGF0cztpZihlJiZuJiYoIWUucGF1c2VkJiYwIT09ZS5wbGF5YmFja1JhdGV8fCFlLnJlYWR5U3RhdGUpJiZyLmF1dG9MZXZlbCYmci5sZXZlbCl7dmFyIG89cGVyZm9ybWFuY2Uubm93KCktbi50cmVxdWVzdCxzPU1hdGguYWJzKGUucGxheWJhY2tSYXRlKTtpZihvPjUwMCpyLmR1cmF0aW9uL3Mpe3ZhciBsPXQubGV2ZWxzLGQ9TWF0aC5tYXgoMSxuLmJ3P24uYncvODoxZTMqbi5sb2FkZWQvbyksdT1sW3IubGV2ZWxdLGg9dS5yZWFsQml0cmF0ZT9NYXRoLm1heCh1LnJlYWxCaXRyYXRlLHUuYml0cmF0ZSk6dS5iaXRyYXRlLGY9bi50b3RhbD9uLnRvdGFsOk1hdGgubWF4KG4ubG9hZGVkLE1hdGgucm91bmQoci5kdXJhdGlvbipoLzgpKSxjPWUuY3VycmVudFRpbWUscD0oZi1uLmxvYWRlZCkvZCx2PShfdC5idWZmZXJJbmZvKGUsYyx0LmNvbmZpZy5tYXhCdWZmZXJIb2xlKS5lbmQtYykvcztpZih2PDIqci5kdXJhdGlvbi9zJiZwPnYpe3ZhciBnPXZvaWQgMCxtPXZvaWQgMDtmb3IobT1yLmxldmVsLTE7bT5hO20tLSl7dmFyIHk9bFttXS5yZWFsQml0cmF0ZT9NYXRoLm1heChsW21dLnJlYWxCaXRyYXRlLGxbbV0uYml0cmF0ZSk6bFttXS5iaXRyYXRlO2lmKChnPXIuZHVyYXRpb24qeS8oNi40KmQpKTx2KWJyZWFrfWc8cCYmKHR0LmIud2FybigibG9hZGluZyB0b28gc2xvdywgYWJvcnQgZnJhZ21lbnQgbG9hZGluZyBhbmQgc3dpdGNoIHRvIGxldmVsICIrbSsiOmZyYWdMb2FkZWREZWxheVsiK20rIl08ZnJhZ0xvYWRlZERlbGF5WyIrKHIubGV2ZWwtMSkrIl07YnVmZmVyU3RhcnZhdGlvbkRlbGF5OiIrZy50b0ZpeGVkKDEpKyI8IitwLnRvRml4ZWQoMSkrIjoiK3YudG9GaXhlZCgxKSksdC5uZXh0TG9hZExldmVsPW0sdGhpcy5fYndFc3RpbWF0b3Iuc2FtcGxlKG8sbi5sb2FkZWQpLGkuYWJvcnQoKSx0aGlzLmNsZWFyVGltZXIoKSx0LnRyaWdnZXIoWi5hLkZSQUdfTE9BRF9FTUVSR0VOQ1lfQUJPUlRFRCx7ZnJhZzpyLHN0YXRzOm59KSl9fX19LGUucHJvdG90eXBlLm9uRnJhZ0xvYWRlZD1mdW5jdGlvbih0KXt2YXIgZT10LmZyYWc7aWYoIm1haW4iPT09ZS50eXBlJiYhaXNOYU4oZS5zbikpe2lmKHRoaXMuY2xlYXJUaW1lcigpLHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbD1lLmxldmVsLHRoaXMuX25leHRBdXRvTGV2ZWw9LTEsdGhpcy5obHMuY29uZmlnLmFick1heFdpdGhSZWFsQml0cmF0ZSl7dmFyIHI9dGhpcy5obHMubGV2ZWxzW2UubGV2ZWxdLGk9KHIubG9hZGVkP3IubG9hZGVkLmJ5dGVzOjApK3Quc3RhdHMubG9hZGVkLGE9KHIubG9hZGVkP3IubG9hZGVkLmR1cmF0aW9uOjApK3QuZnJhZy5kdXJhdGlvbjtyLmxvYWRlZD17Ynl0ZXM6aSxkdXJhdGlvbjphfSxyLnJlYWxCaXRyYXRlPU1hdGgucm91bmQoOCppL2EpfWlmKHQuZnJhZy5iaXRyYXRlVGVzdCl7dmFyIG49dC5zdGF0cztuLnRwYXJzZWQ9bi50YnVmZmVyZWQ9bi50bG9hZCx0aGlzLm9uRnJhZ0J1ZmZlcmVkKHQpfX19LGUucHJvdG90eXBlLm9uRnJhZ0J1ZmZlcmVkPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RhdHMscj10LmZyYWc7aWYoISghMD09PWUuYWJvcnRlZHx8MSE9PXIubG9hZENvdW50ZXJ8fCJtYWluIiE9PXIudHlwZXx8aXNOYU4oci5zbil8fHIuYml0cmF0ZVRlc3QmJmUudGxvYWQhPT1lLnRidWZmZXJlZCkpe3ZhciBpPWUudHBhcnNlZC1lLnRyZXF1ZXN0O3R0LmIubG9nKCJsYXRlbmN5L2xvYWRpbmcvcGFyc2luZy9hcHBlbmQva2JwczoiK01hdGgucm91bmQoZS50Zmlyc3QtZS50cmVxdWVzdCkrIi8iK01hdGgucm91bmQoZS50bG9hZC1lLnRmaXJzdCkrIi8iK01hdGgucm91bmQoZS50cGFyc2VkLWUudGxvYWQpKyIvIitNYXRoLnJvdW5kKGUudGJ1ZmZlcmVkLWUudHBhcnNlZCkrIi8iK01hdGgucm91bmQoOCplLmxvYWRlZC8oZS50YnVmZmVyZWQtZS50cmVxdWVzdCkpKSx0aGlzLl9id0VzdGltYXRvci5zYW1wbGUoaSxlLmxvYWRlZCksZS5id0VzdGltYXRlPXRoaXMuX2J3RXN0aW1hdG9yLmdldEVzdGltYXRlKCksci5iaXRyYXRlVGVzdD90aGlzLmJpdHJhdGVUZXN0RGVsYXk9aS8xZTM6dGhpcy5iaXRyYXRlVGVzdERlbGF5PTB9fSxlLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKHQpe3N3aXRjaCh0LmRldGFpbHMpe2Nhc2UgJC5hLkZSQUdfTE9BRF9FUlJPUjpjYXNlICQuYS5GUkFHX0xPQURfVElNRU9VVDp0aGlzLmNsZWFyVGltZXIoKX19LGUucHJvdG90eXBlLmNsZWFyVGltZXI9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMudGltZXIpLHRoaXMudGltZXI9bnVsbH0sZS5wcm90b3R5cGUuX2ZpbmRCZXN0TGV2ZWw9ZnVuY3Rpb24odCxlLHIsaSxhLG4sbyxzLGwpe2Zvcih2YXIgZD1hO2Q+PWk7ZC0tKXt2YXIgdT1sW2RdLGg9dS5kZXRhaWxzLGY9aD9oLnRvdGFsZHVyYXRpb24vaC5mcmFnbWVudHMubGVuZ3RoOmUsYz0hIWgmJmgubGl2ZSxwPXZvaWQgMDtwPWQ8PXQ/bypyOnMqcjt2YXIgdj1sW2RdLnJlYWxCaXRyYXRlP01hdGgubWF4KGxbZF0ucmVhbEJpdHJhdGUsbFtkXS5iaXRyYXRlKTpsW2RdLmJpdHJhdGUsZz12KmYvcDtpZih0dC5iLnRyYWNlKCJsZXZlbC9hZGp1c3RlZGJ3L2JpdHJhdGUvYXZnRHVyYXRpb24vbWF4RmV0Y2hEdXJhdGlvbi9mZXRjaER1cmF0aW9uOiAiK2QrIi8iK01hdGgucm91bmQocCkrIi8iK3YrIi8iK2YrIi8iK24rIi8iK2cpLHA+diYmKCFnfHxjJiYhdGhpcy5iaXRyYXRlVGVzdERlbGF5fHxnPG4pKXJldHVybiBkfXJldHVybi0xfSxxdChlLFt7a2V5OiJuZXh0QXV0b0xldmVsIixnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9uZXh0QXV0b0xldmVsLGU9dGhpcy5fYndFc3RpbWF0b3I7aWYoISgtMT09PXR8fGUmJmUuY2FuRXN0aW1hdGUoKSkpcmV0dXJuIHQ7dmFyIHI9dGhpcy5fbmV4dEFCUkF1dG9MZXZlbDtyZXR1cm4tMSE9PXQmJihyPU1hdGgubWluKHQscikpLHJ9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9uZXh0QXV0b0xldmVsPXR9fSx7a2V5OiJfbmV4dEFCUkF1dG9MZXZlbCIsZ2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5obHMsZT10Lm1heEF1dG9MZXZlbCxyPXQubGV2ZWxzLGk9dC5jb25maWcsYT10Lm1pbkF1dG9MZXZlbCxuPXQubWVkaWEsbz10aGlzLmxhc3RMb2FkZWRGcmFnTGV2ZWwscz10aGlzLmZyYWdDdXJyZW50P3RoaXMuZnJhZ0N1cnJlbnQuZHVyYXRpb246MCxsPW4/bi5jdXJyZW50VGltZTowLGQ9biYmMCE9PW4ucGxheWJhY2tSYXRlP01hdGguYWJzKG4ucGxheWJhY2tSYXRlKToxLHU9dGhpcy5fYndFc3RpbWF0b3I/dGhpcy5fYndFc3RpbWF0b3IuZ2V0RXN0aW1hdGUoKTppLmFickV3bWFEZWZhdWx0RXN0aW1hdGUsaD0oX3QuYnVmZmVySW5mbyhuLGwsaS5tYXhCdWZmZXJIb2xlKS5lbmQtbCkvZCxmPXRoaXMuX2ZpbmRCZXN0TGV2ZWwobyxzLHUsYSxlLGgsaS5hYnJCYW5kV2lkdGhGYWN0b3IsaS5hYnJCYW5kV2lkdGhVcEZhY3RvcixyKTtpZihmPj0wKXJldHVybiBmO3R0LmIudHJhY2UoInJlYnVmZmVyaW5nIGV4cGVjdGVkIHRvIGhhcHBlbiwgbGV0cyB0cnkgdG8gZmluZCBhIHF1YWxpdHkgbGV2ZWwgbWluaW1pemluZyB0aGUgcmVidWZmZXJpbmciKTt2YXIgYz1zP01hdGgubWluKHMsaS5tYXhTdGFydmF0aW9uRGVsYXkpOmkubWF4U3RhcnZhdGlvbkRlbGF5LHA9aS5hYnJCYW5kV2lkdGhGYWN0b3Isdj1pLmFickJhbmRXaWR0aFVwRmFjdG9yO2lmKDA9PT1oKXt2YXIgZz10aGlzLmJpdHJhdGVUZXN0RGVsYXk7aWYoZyl7Yz0ocz9NYXRoLm1pbihzLGkubWF4TG9hZGluZ0RlbGF5KTppLm1heExvYWRpbmdEZWxheSktZyx0dC5iLnRyYWNlKCJiaXRyYXRlIHRlc3QgdG9vayAiK01hdGgucm91bmQoMWUzKmcpKyJtcywgc2V0IGZpcnN0IGZyYWdtZW50IG1heCBmZXRjaER1cmF0aW9uIHRvICIrTWF0aC5yb3VuZCgxZTMqYykrIiBtcyIpLHA9dj0xfX1yZXR1cm4gZj10aGlzLl9maW5kQmVzdExldmVsKG8scyx1LGEsZSxoK2MscCx2LHIpLE1hdGgubWF4KGYsMCl9fV0pLGV9KGl0KSxKdD1RdCxadD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHIpe0IodGhpcyxlKTt2YXIgaT1HKHRoaXMsdC5jYWxsKHRoaXMscixaLmEuTUVESUFfQVRUQUNISU5HLFouYS5NRURJQV9ERVRBQ0hJTkcsWi5hLk1BTklGRVNUX1BBUlNFRCxaLmEuQlVGRkVSX1JFU0VULFouYS5CVUZGRVJfQVBQRU5ESU5HLFouYS5CVUZGRVJfQ09ERUNTLFouYS5CVUZGRVJfRU9TLFouYS5CVUZGRVJfRkxVU0hJTkcsWi5hLkxFVkVMX1BUU19VUERBVEVELFouYS5MRVZFTF9VUERBVEVEKSk7cmV0dXJuIGkuX21zRHVyYXRpb249bnVsbCxpLl9sZXZlbER1cmF0aW9uPW51bGwsaS5vbnNidWU9aS5vblNCVXBkYXRlRW5kLmJpbmQoaSksaS5vbnNiZT1pLm9uU0JVcGRhdGVFcnJvci5iaW5kKGkpLGkucGVuZGluZ1RyYWNrcz17fSxpLnRyYWNrcz17fSxpfXJldHVybiBIKGUsdCksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2l0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LGUucHJvdG90eXBlLm9uTGV2ZWxQdHNVcGRhdGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXQudHlwZSxyPXRoaXMudHJhY2tzLmF1ZGlvO2lmKCJhdWRpbyI9PT1lJiZyJiYiYXVkaW8vbXBlZyI9PT1yLmNvbnRhaW5lcil7dmFyIGk9dGhpcy5zb3VyY2VCdWZmZXIuYXVkaW87aWYoTWF0aC5hYnMoaS50aW1lc3RhbXBPZmZzZXQtdC5zdGFydCk+LjEpe3ZhciBhPWkudXBkYXRpbmc7dHJ5e2kuYWJvcnQoKX1jYXRjaCh0KXthPSEwLHR0LmIud2FybigiY2FuIG5vdCBhYm9ydCBhdWRpbyBidWZmZXI6ICIrdCl9YT90aGlzLmF1ZGlvVGltZXN0YW1wT2Zmc2V0PXQuc3RhcnQ6KHR0LmIud2FybigiY2hhbmdlIG1wZWcgYXVkaW8gdGltZXN0YW1wIG9mZnNldCBmcm9tICIraS50aW1lc3RhbXBPZmZzZXQrIiB0byAiK3Quc3RhcnQpLGkudGltZXN0YW1wT2Zmc2V0PXQuc3RhcnQpfX19LGUucHJvdG90eXBlLm9uTWFuaWZlc3RQYXJzZWQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5hdWRpbyxyPXQudmlkZW98fHQubGV2ZWxzLmxlbmd0aCYmdC5hdWRpbyxpPTA7dC5hbHRBdWRpbyYmKGV8fHIpJiYoaT0oZT8xOjApKyhyPzE6MCksdHQuYi5sb2coaSsiIHNvdXJjZUJ1ZmZlcihzKSBleHBlY3RlZCIpKSx0aGlzLnNvdXJjZUJ1ZmZlck5iPWl9LGUucHJvdG90eXBlLm9uTWVkaWFBdHRhY2hpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZWRpYT10Lm1lZGlhO2lmKGUpe3ZhciByPXRoaXMubWVkaWFTb3VyY2U9bmV3IE1lZGlhU291cmNlO3RoaXMub25tc289dGhpcy5vbk1lZGlhU291cmNlT3Blbi5iaW5kKHRoaXMpLHRoaXMub25tc2U9dGhpcy5vbk1lZGlhU291cmNlRW5kZWQuYmluZCh0aGlzKSx0aGlzLm9ubXNjPXRoaXMub25NZWRpYVNvdXJjZUNsb3NlLmJpbmQodGhpcyksci5hZGRFdmVudExpc3RlbmVyKCJzb3VyY2VvcGVuIix0aGlzLm9ubXNvKSxyLmFkZEV2ZW50TGlzdGVuZXIoInNvdXJjZWVuZGVkIix0aGlzLm9ubXNlKSxyLmFkZEV2ZW50TGlzdGVuZXIoInNvdXJjZWNsb3NlIix0aGlzLm9ubXNjKSxlLnNyYz1VUkwuY3JlYXRlT2JqZWN0VVJMKHIpfX0sZS5wcm90b3R5cGUub25NZWRpYURldGFjaGluZz1mdW5jdGlvbigpe3R0LmIubG9nKCJtZWRpYSBzb3VyY2UgZGV0YWNoaW5nIik7dmFyIHQ9dGhpcy5tZWRpYVNvdXJjZTtpZih0KXtpZigib3BlbiI9PT10LnJlYWR5U3RhdGUpdHJ5e3QuZW5kT2ZTdHJlYW0oKX1jYXRjaCh0KXt0dC5iLndhcm4oIm9uTWVkaWFEZXRhY2hpbmc6Iit0Lm1lc3NhZ2UrIiB3aGlsZSBjYWxsaW5nIGVuZE9mU3RyZWFtIil9dC5yZW1vdmVFdmVudExpc3RlbmVyKCJzb3VyY2VvcGVuIix0aGlzLm9ubXNvKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNvdXJjZWVuZGVkIix0aGlzLm9ubXNlKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNvdXJjZWNsb3NlIix0aGlzLm9ubXNjKSx0aGlzLm1lZGlhJiYoVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLm1lZGlhLnNyYyksdGhpcy5tZWRpYS5yZW1vdmVBdHRyaWJ1dGUoInNyYyIpLHRoaXMubWVkaWEubG9hZCgpKSx0aGlzLm1lZGlhU291cmNlPW51bGwsdGhpcy5tZWRpYT1udWxsLHRoaXMucGVuZGluZ1RyYWNrcz17fSx0aGlzLnRyYWNrcz17fSx0aGlzLnNvdXJjZUJ1ZmZlcj17fSx0aGlzLmZsdXNoUmFuZ2U9W10sdGhpcy5zZWdtZW50cz1bXSx0aGlzLmFwcGVuZGVkPTB9dGhpcy5vbm1zbz10aGlzLm9ubXNlPXRoaXMub25tc2M9bnVsbCx0aGlzLmhscy50cmlnZ2VyKFouYS5NRURJQV9ERVRBQ0hFRCl9LGUucHJvdG90eXBlLm9uTWVkaWFTb3VyY2VPcGVuPWZ1bmN0aW9uKCl7dHQuYi5sb2coIm1lZGlhIHNvdXJjZSBvcGVuZWQiKSx0aGlzLmhscy50cmlnZ2VyKFouYS5NRURJQV9BVFRBQ0hFRCx7bWVkaWE6dGhpcy5tZWRpYX0pO3ZhciB0PXRoaXMubWVkaWFTb3VyY2U7dCYmdC5yZW1vdmVFdmVudExpc3RlbmVyKCJzb3VyY2VvcGVuIix0aGlzLm9ubXNvKSx0aGlzLmNoZWNrUGVuZGluZ1RyYWNrcygpfSxlLnByb3RvdHlwZS5jaGVja1BlbmRpbmdUcmFja3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBlbmRpbmdUcmFja3MsZT1PYmplY3Qua2V5cyh0KS5sZW5ndGg7ZSYmKHRoaXMuc291cmNlQnVmZmVyTmI8PWV8fDA9PT10aGlzLnNvdXJjZUJ1ZmZlck5iKSYmKHRoaXMuY3JlYXRlU291cmNlQnVmZmVycyh0KSx0aGlzLnBlbmRpbmdUcmFja3M9e30sdGhpcy5kb0FwcGVuZGluZygpKX0sZS5wcm90b3R5cGUub25NZWRpYVNvdXJjZUNsb3NlPWZ1bmN0aW9uKCl7dHQuYi5sb2coIm1lZGlhIHNvdXJjZSBjbG9zZWQiKX0sZS5wcm90b3R5cGUub25NZWRpYVNvdXJjZUVuZGVkPWZ1bmN0aW9uKCl7dHQuYi5sb2coIm1lZGlhIHNvdXJjZSBlbmRlZCIpfSxlLnByb3RvdHlwZS5vblNCVXBkYXRlRW5kPWZ1bmN0aW9uKCl7aWYodGhpcy5hdWRpb1RpbWVzdGFtcE9mZnNldCl7dmFyIHQ9dGhpcy5zb3VyY2VCdWZmZXIuYXVkaW87dHQuYi53YXJuKCJjaGFuZ2UgbXBlZyBhdWRpbyB0aW1lc3RhbXAgb2Zmc2V0IGZyb20gIit0LnRpbWVzdGFtcE9mZnNldCsiIHRvICIrdGhpcy5hdWRpb1RpbWVzdGFtcE9mZnNldCksdC50aW1lc3RhbXBPZmZzZXQ9dGhpcy5hdWRpb1RpbWVzdGFtcE9mZnNldCxkZWxldGUgdGhpcy5hdWRpb1RpbWVzdGFtcE9mZnNldH10aGlzLl9uZWVkc0ZsdXNoJiZ0aGlzLmRvRmx1c2goKSx0aGlzLl9uZWVkc0VvcyYmdGhpcy5jaGVja0VvcygpLHRoaXMuYXBwZW5kaW5nPSExO3ZhciBlPXRoaXMucGFyZW50LHI9dGhpcy5zZWdtZW50cy5yZWR1Y2UoZnVuY3Rpb24odCxyKXtyZXR1cm4gci5wYXJlbnQ9PT1lP3QrMTp0fSwwKTt0aGlzLmhscy50cmlnZ2VyKFouYS5CVUZGRVJfQVBQRU5ERUQse3BhcmVudDplLHBlbmRpbmc6cn0pLHRoaXMuX25lZWRzRmx1c2h8fHRoaXMuZG9BcHBlbmRpbmcoKSx0aGlzLnVwZGF0ZU1lZGlhRWxlbWVudER1cmF0aW9uKCl9LGUucHJvdG90eXBlLm9uU0JVcGRhdGVFcnJvcj1mdW5jdGlvbih0KXt0dC5iLmVycm9yKCJzb3VyY2VCdWZmZXIgZXJyb3I6Iix0KSx0aGlzLmhscy50cmlnZ2VyKFouYS5FUlJPUix7dHlwZTokLmIuTUVESUFfRVJST1IsZGV0YWlsczokLmEuQlVGRkVSX0FQUEVORElOR19FUlJPUixmYXRhbDohMX0pfSxlLnByb3RvdHlwZS5vbkJ1ZmZlclJlc2V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zb3VyY2VCdWZmZXI7Zm9yKHZhciBlIGluIHQpe3ZhciByPXRbZV07dHJ5e3RoaXMubWVkaWFTb3VyY2UucmVtb3ZlU291cmNlQnVmZmVyKHIpLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigidXBkYXRlZW5kIix0aGlzLm9uc2J1ZSksci5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5vbnNiZSl9Y2F0Y2godCl7fX10aGlzLnNvdXJjZUJ1ZmZlcj17fSx0aGlzLmZsdXNoUmFuZ2U9W10sdGhpcy5zZWdtZW50cz1bXSx0aGlzLmFwcGVuZGVkPTB9LGUucHJvdG90eXBlLm9uQnVmZmVyQ29kZWNzPWZ1bmN0aW9uKHQpe2lmKDA9PT1PYmplY3Qua2V5cyh0aGlzLnNvdXJjZUJ1ZmZlcikubGVuZ3RoKXtmb3IodmFyIGUgaW4gdCl0aGlzLnBlbmRpbmdUcmFja3NbZV09dFtlXTt2YXIgcj10aGlzLm1lZGlhU291cmNlO3ImJiJvcGVuIj09PXIucmVhZHlTdGF0ZSYmdGhpcy5jaGVja1BlbmRpbmdUcmFja3MoKX19LGUucHJvdG90eXBlLmNyZWF0ZVNvdXJjZUJ1ZmZlcnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zb3VyY2VCdWZmZXIscj10aGlzLm1lZGlhU291cmNlO2Zvcih2YXIgaSBpbiB0KWlmKCFlW2ldKXt2YXIgYT10W2ldLG49YS5sZXZlbENvZGVjfHxhLmNvZGVjLG89YS5jb250YWluZXIrIjtjb2RlY3M9IituO3R0LmIubG9nKCJjcmVhdGluZyBzb3VyY2VCdWZmZXIoIitvKyIpIik7dHJ5e3ZhciBzPWVbaV09ci5hZGRTb3VyY2VCdWZmZXIobyk7cy5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGVlbmQiLHRoaXMub25zYnVlKSxzLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLm9uc2JlKSx0aGlzLnRyYWNrc1tpXT17Y29kZWM6bixjb250YWluZXI6YS5jb250YWluZXJ9LGEuYnVmZmVyPXN9Y2F0Y2godCl7dHQuYi5lcnJvcigiZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGFkZCBzb3VyY2VCdWZmZXI6Iit0Lm1lc3NhZ2UpLHRoaXMuaGxzLnRyaWdnZXIoWi5hLkVSUk9SLHt0eXBlOiQuYi5NRURJQV9FUlJPUixkZXRhaWxzOiQuYS5CVUZGRVJfQUREX0NPREVDX0VSUk9SLGZhdGFsOiExLGVycjp0LG1pbWVUeXBlOm99KX19dGhpcy5obHMudHJpZ2dlcihaLmEuQlVGRkVSX0NSRUFURUQse3RyYWNrczp0fSl9LGUucHJvdG90eXBlLm9uQnVmZmVyQXBwZW5kaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX25lZWRzRmx1c2h8fCh0aGlzLnNlZ21lbnRzP3RoaXMuc2VnbWVudHMucHVzaCh0KTp0aGlzLnNlZ21lbnRzPVt0XSx0aGlzLmRvQXBwZW5kaW5nKCkpfSxlLnByb3RvdHlwZS5vbkJ1ZmZlckFwcGVuZEZhaWw9ZnVuY3Rpb24odCl7dHQuYi5lcnJvcigic291cmNlQnVmZmVyIGVycm9yOiIsdC5ldmVudCksdGhpcy5obHMudHJpZ2dlcihaLmEuRVJST1Ise3R5cGU6JC5iLk1FRElBX0VSUk9SLGRldGFpbHM6JC5hLkJVRkZFUl9BUFBFTkRJTkdfRVJST1IsZmF0YWw6ITF9KX0sZS5wcm90b3R5cGUub25CdWZmZXJFb3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zb3VyY2VCdWZmZXIscj10LnR5cGU7Zm9yKHZhciBpIGluIGUpciYmaSE9PXJ8fGVbaV0uZW5kZWR8fChlW2ldLmVuZGVkPSEwLHR0LmIubG9nKGkrIiBzb3VyY2VCdWZmZXIgbm93IEVPUyIpKTt0aGlzLmNoZWNrRW9zKCl9LGUucHJvdG90eXBlLmNoZWNrRW9zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zb3VyY2VCdWZmZXIsZT10aGlzLm1lZGlhU291cmNlO2lmKCFlfHwib3BlbiIhPT1lLnJlYWR5U3RhdGUpcmV0dXJuIHZvaWQodGhpcy5fbmVlZHNFb3M9ITEpO2Zvcih2YXIgciBpbiB0KXt2YXIgaT10W3JdO2lmKCFpLmVuZGVkKXJldHVybjtpZihpLnVwZGF0aW5nKXJldHVybiB2b2lkKHRoaXMuX25lZWRzRW9zPSEwKX10dC5iLmxvZygiYWxsIG1lZGlhIGRhdGEgYXZhaWxhYmxlLCBzaWduYWwgZW5kT2ZTdHJlYW0oKSB0byBNZWRpYVNvdXJjZSBhbmQgc3RvcCBsb2FkaW5nIGZyYWdtZW50Iik7dHJ5e2UuZW5kT2ZTdHJlYW0oKX1jYXRjaCh0KXt0dC5iLndhcm4oImV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nIG1lZGlhU291cmNlLmVuZE9mU3RyZWFtKCkiKX10aGlzLl9uZWVkc0Vvcz0hMX0sZS5wcm90b3R5cGUub25CdWZmZXJGbHVzaGluZz1mdW5jdGlvbih0KXt0aGlzLmZsdXNoUmFuZ2UucHVzaCh7c3RhcnQ6dC5zdGFydE9mZnNldCxlbmQ6dC5lbmRPZmZzZXQsdHlwZTp0LnR5cGV9KSx0aGlzLmZsdXNoQnVmZmVyQ291bnRlcj0wLHRoaXMuZG9GbHVzaCgpfSxlLnByb3RvdHlwZS5vbkxldmVsVXBkYXRlZD1mdW5jdGlvbih0KXt2YXIgZT10LmRldGFpbHM7MCE9PWUuZnJhZ21lbnRzLmxlbmd0aCYmKHRoaXMuX2xldmVsRHVyYXRpb249ZS50b3RhbGR1cmF0aW9uK2UuZnJhZ21lbnRzWzBdLnN0YXJ0LHRoaXMudXBkYXRlTWVkaWFFbGVtZW50RHVyYXRpb24oKSl9LGUucHJvdG90eXBlLnVwZGF0ZU1lZGlhRWxlbWVudER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tZWRpYSxlPXRoaXMubWVkaWFTb3VyY2Uscj10aGlzLnNvdXJjZUJ1ZmZlcixpPXRoaXMuX2xldmVsRHVyYXRpb247aWYobnVsbCE9PWkmJnQmJmUmJnImJjAhPT10LnJlYWR5U3RhdGUmJiJvcGVuIj09PWUucmVhZHlTdGF0ZSl7Zm9yKHZhciBhIGluIHIpaWYoclthXS51cGRhdGluZylyZXR1cm47bnVsbD09PXRoaXMuX21zRHVyYXRpb24mJih0aGlzLl9tc0R1cmF0aW9uPWUuZHVyYXRpb24pO3ZhciBuPXQuZHVyYXRpb247KGk+dGhpcy5fbXNEdXJhdGlvbiYmaT5ufHxuPT09MS8wfHxpc05hTihuKSkmJih0dC5iLmxvZygiVXBkYXRpbmcgbWVkaWFzb3VyY2UgZHVyYXRpb24gdG8gIitpLnRvRml4ZWQoMykpLHRoaXMuX21zRHVyYXRpb249ZS5kdXJhdGlvbj1pKX19LGUucHJvdG90eXBlLmRvRmx1c2g9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuZmx1c2hSYW5nZS5sZW5ndGg7KXt2YXIgdD10aGlzLmZsdXNoUmFuZ2VbMF07aWYoIXRoaXMuZmx1c2hCdWZmZXIodC5zdGFydCx0LmVuZCx0LnR5cGUpKXJldHVybiB2b2lkKHRoaXMuX25lZWRzRmx1c2g9ITApO3RoaXMuZmx1c2hSYW5nZS5zaGlmdCgpLHRoaXMuZmx1c2hCdWZmZXJDb3VudGVyPTB9aWYoMD09PXRoaXMuZmx1c2hSYW5nZS5sZW5ndGgpe3RoaXMuX25lZWRzRmx1c2g9ITE7dmFyIGU9MCxyPXRoaXMuc291cmNlQnVmZmVyO3RyeXtmb3IodmFyIGkgaW4gcillKz1yW2ldLmJ1ZmZlcmVkLmxlbmd0aH1jYXRjaCh0KXt0dC5iLmVycm9yKCJlcnJvciB3aGlsZSBhY2Nlc3Npbmcgc291cmNlQnVmZmVyLmJ1ZmZlcmVkIil9dGhpcy5hcHBlbmRlZD1lLHRoaXMuaGxzLnRyaWdnZXIoWi5hLkJVRkZFUl9GTFVTSEVEKX19LGUucHJvdG90eXBlLmRvQXBwZW5kaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5obHMsZT10aGlzLnNvdXJjZUJ1ZmZlcixyPXRoaXMuc2VnbWVudHM7aWYoT2JqZWN0LmtleXMoZSkubGVuZ3RoKXtpZih0aGlzLm1lZGlhLmVycm9yKXJldHVybiB0aGlzLnNlZ21lbnRzPVtdLHZvaWQgdHQuYi5lcnJvcigidHJ5aW5nIHRvIGFwcGVuZCBhbHRob3VnaCBhIG1lZGlhIGVycm9yIG9jY3VyZWQsIGZsdXNoIHNlZ21lbnQgYW5kIGFib3J0Iik7aWYodGhpcy5hcHBlbmRpbmcpcmV0dXJuO2lmKHImJnIubGVuZ3RoKXt2YXIgaT1yLnNoaWZ0KCk7dHJ5e3ZhciBhPWkudHlwZSxuPWVbYV07bj9uLnVwZGF0aW5nP3IudW5zaGlmdChpKToobi5lbmRlZD0hMSx0aGlzLnBhcmVudD1pLnBhcmVudCxuLmFwcGVuZEJ1ZmZlcihpLmRhdGEpLHRoaXMuYXBwZW5kRXJyb3I9MCx0aGlzLmFwcGVuZGVkKyssdGhpcy5hcHBlbmRpbmc9ITApOnRoaXMub25TQlVwZGF0ZUVuZCgpfWNhdGNoKGUpe3R0LmIuZXJyb3IoImVycm9yIHdoaWxlIHRyeWluZyB0byBhcHBlbmQgYnVmZmVyOiIrZS5tZXNzYWdlKSxyLnVuc2hpZnQoaSk7dmFyIG89e3R5cGU6JC5iLk1FRElBX0VSUk9SLHBhcmVudDppLnBhcmVudH07aWYoMjI9PT1lLmNvZGUpcmV0dXJuIHRoaXMuc2VnbWVudHM9W10sby5kZXRhaWxzPSQuYS5CVUZGRVJfRlVMTF9FUlJPUixvLmZhdGFsPSExLHZvaWQgdC50cmlnZ2VyKFouYS5FUlJPUixvKTtpZih0aGlzLmFwcGVuZEVycm9yP3RoaXMuYXBwZW5kRXJyb3IrKzp0aGlzLmFwcGVuZEVycm9yPTEsby5kZXRhaWxzPSQuYS5CVUZGRVJfQVBQRU5EX0VSUk9SLHRoaXMuYXBwZW5kRXJyb3I+dC5jb25maWcuYXBwZW5kRXJyb3JNYXhSZXRyeSlyZXR1cm4gdHQuYi5sb2coImZhaWwgIit0LmNvbmZpZy5hcHBlbmRFcnJvck1heFJldHJ5KyIgdGltZXMgdG8gYXBwZW5kIHNlZ21lbnQgaW4gc291cmNlQnVmZmVyIikscj1bXSxvLmZhdGFsPSEwLHZvaWQgdC50cmlnZ2VyKFouYS5FUlJPUixvKTtvLmZhdGFsPSExLHQudHJpZ2dlcihaLmEuRVJST1Isbyl9fX19LGUucHJvdG90eXBlLmZsdXNoQnVmZmVyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaSxhLG4sbyxzLGwsZD10aGlzLnNvdXJjZUJ1ZmZlcjtpZihPYmplY3Qua2V5cyhkKS5sZW5ndGgpe2lmKHR0LmIubG9nKCJmbHVzaEJ1ZmZlcixwb3Mvc3RhcnQvZW5kOiAiK3RoaXMubWVkaWEuY3VycmVudFRpbWUudG9GaXhlZCgzKSsiLyIrdCsiLyIrZSksdGhpcy5mbHVzaEJ1ZmZlckNvdW50ZXI8dGhpcy5hcHBlbmRlZCl7Zm9yKHZhciB1IGluIGQpaWYoIXJ8fHU9PT1yKXtpZihpPWRbdV0saS5lbmRlZD0hMSxpLnVwZGF0aW5nKXJldHVybiB0dC5iLndhcm4oImNhbm5vdCBmbHVzaCwgc2IgdXBkYXRpbmcgaW4gcHJvZ3Jlc3MiKSwhMTt0cnl7Zm9yKGE9MDthPGkuYnVmZmVyZWQubGVuZ3RoO2ErKylpZihuPWkuYnVmZmVyZWQuc3RhcnQoYSksbz1pLmJ1ZmZlcmVkLmVuZChhKSwtMSE9PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJmaXJlZm94IikmJmU9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk/KHM9dCxsPWUpOihzPU1hdGgubWF4KG4sdCksbD1NYXRoLm1pbihvLGUpKSxNYXRoLm1pbihsLG8pLXM+LjUpcmV0dXJuIHRoaXMuZmx1c2hCdWZmZXJDb3VudGVyKyssdHQuYi5sb2coImZsdXNoICIrdSsiIFsiK3MrIiwiK2wrIl0sIG9mIFsiK24rIiwiK28rIl0sIHBvczoiK3RoaXMubWVkaWEuY3VycmVudFRpbWUpLGkucmVtb3ZlKHMsbCksITF9Y2F0Y2godCl7dHQuYi53YXJuKCJleGNlcHRpb24gd2hpbGUgYWNjZXNzaW5nIHNvdXJjZWJ1ZmZlciwgaXQgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSBNZWRpYVNvdXJjZSIpfX19ZWxzZSB0dC5iLndhcm4oImFib3J0IGZsdXNoaW5nIHRvbyBtYW55IHJldHJpZXMiKTt0dC5iLmxvZygiYnVmZmVyIGZsdXNoZWQiKX1yZXR1cm4hMH0sZX0oaXQpLCR0PVp0LHRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExLGkuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBpJiYoaS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaS5rZXksaSl9fXJldHVybiBmdW5jdGlvbihlLHIsaSl7cmV0dXJuIHImJnQoZS5wcm90b3R5cGUsciksaSYmdChlLGkpLGV9fSgpLGVlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUocil7cmV0dXJuIGoodGhpcyxlKSxWKHRoaXMsdC5jYWxsKHRoaXMscixaLmEuRlBTX0RST1BfTEVWRUxfQ0FQUElORyxaLmEuTUVESUFfQVRUQUNISU5HLFouYS5NQU5JRkVTVF9QQVJTRUQpKX1yZXR1cm4gVyhlLHQpLGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmhscy5jb25maWcuY2FwTGV2ZWxUb1BsYXllclNpemUmJih0aGlzLm1lZGlhPXRoaXMucmVzdHJpY3RlZExldmVscz1udWxsLHRoaXMuYXV0b0xldmVsQ2FwcGluZz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksdGhpcy50aW1lciYmKHRoaXMudGltZXI9Y2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKSkpfSxlLnByb3RvdHlwZS5vbkZwc0Ryb3BMZXZlbENhcHBpbmc9ZnVuY3Rpb24odCl7ZS5pc0xldmVsQWxsb3dlZCh0LmRyb3BwZWRMZXZlbCx0aGlzLnJlc3RyaWN0ZWRMZXZlbHMpJiZ0aGlzLnJlc3RyaWN0ZWRMZXZlbHMucHVzaCh0LmRyb3BwZWRMZXZlbCl9LGUucHJvdG90eXBlLm9uTWVkaWFBdHRhY2hpbmc9ZnVuY3Rpb24odCl7dGhpcy5tZWRpYT10Lm1lZGlhIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudD90Lm1lZGlhOm51bGx9LGUucHJvdG90eXBlLm9uTWFuaWZlc3RQYXJzZWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5obHM7dGhpcy5yZXN0cmljdGVkTGV2ZWxzPVtdLGUuY29uZmlnLmNhcExldmVsVG9QbGF5ZXJTaXplJiYodGhpcy5hdXRvTGV2ZWxDYXBwaW5nPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSx0aGlzLmxldmVscz10LmxldmVscyxlLmZpcnN0TGV2ZWw9dGhpcy5nZXRNYXhMZXZlbCh0LmZpcnN0TGV2ZWwpLGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksdGhpcy50aW1lcj1zZXRJbnRlcnZhbCh0aGlzLmRldGVjdFBsYXllclNpemUuYmluZCh0aGlzKSwxZTMpLHRoaXMuZGV0ZWN0UGxheWVyU2l6ZSgpKX0sZS5wcm90b3R5cGUuZGV0ZWN0UGxheWVyU2l6ZT1mdW5jdGlvbigpe2lmKHRoaXMubWVkaWEpe3ZhciB0PXRoaXMubGV2ZWxzP3RoaXMubGV2ZWxzLmxlbmd0aDowO2lmKHQpe3ZhciBlPXRoaXMuaGxzO2UuYXV0b0xldmVsQ2FwcGluZz10aGlzLmdldE1heExldmVsKHQtMSksZS5hdXRvTGV2ZWxDYXBwaW5nPnRoaXMuYXV0b0xldmVsQ2FwcGluZyYmZS5zdHJlYW1Db250cm9sbGVyLm5leHRMZXZlbFN3aXRjaCgpLHRoaXMuYXV0b0xldmVsQ2FwcGluZz1lLmF1dG9MZXZlbENhcHBpbmd9fX0sZS5wcm90b3R5cGUuZ2V0TWF4TGV2ZWw9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcztpZighdGhpcy5sZXZlbHMpcmV0dXJuLTE7dmFyIGk9dGhpcy5sZXZlbHMuZmlsdGVyKGZ1bmN0aW9uKGksYSl7cmV0dXJuIGUuaXNMZXZlbEFsbG93ZWQoYSxyLnJlc3RyaWN0ZWRMZXZlbHMpJiZhPD10fSk7cmV0dXJuIGUuZ2V0TWF4TGV2ZWxCeU1lZGlhU2l6ZShpLHRoaXMubWVkaWFXaWR0aCx0aGlzLm1lZGlhSGVpZ2h0KX0sZS5pc0xldmVsQWxsb3dlZD1mdW5jdGlvbih0KXtyZXR1cm4tMT09PShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06W10pLmluZGV4T2YodCl9LGUuZ2V0TWF4TGV2ZWxCeU1lZGlhU2l6ZT1mdW5jdGlvbih0LGUscil7aWYoIXR8fHQmJiF0Lmxlbmd0aClyZXR1cm4tMTtmb3IodmFyIGk9dC5sZW5ndGgtMSxhPTA7YTx0Lmxlbmd0aDthKz0xKXt2YXIgbj10W2FdO2lmKChuLndpZHRoPj1lfHxuLmhlaWdodD49cikmJmZ1bmN0aW9uKHQsZSl7cmV0dXJuIWV8fCh0LndpZHRoIT09ZS53aWR0aHx8dC5oZWlnaHQhPT1lLmhlaWdodCl9KG4sdFthKzFdKSl7aT1hO2JyZWFrfX1yZXR1cm4gaX0sdGUoZSxbe2tleToibWVkaWFXaWR0aCIsZ2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dm9pZCAwLHI9dGhpcy5tZWRpYTtyZXR1cm4gciYmKHQ9ci53aWR0aHx8ci5jbGllbnRXaWR0aHx8ci5vZmZzZXRXaWR0aCx0Kj1lLmNvbnRlbnRTY2FsZUZhY3RvciksdH19LHtrZXk6Im1lZGlhSGVpZ2h0IixnZXQ6ZnVuY3Rpb24oKXt2YXIgdD12b2lkIDAscj10aGlzLm1lZGlhO3JldHVybiByJiYodD1yLmhlaWdodHx8ci5jbGllbnRIZWlnaHR8fHIub2Zmc2V0SGVpZ2h0LHQqPWUuY29udGVudFNjYWxlRmFjdG9yKSx0fX1dLFt7a2V5OiJjb250ZW50U2NhbGVGYWN0b3IiLGdldDpmdW5jdGlvbigpe3ZhciB0PTE7dHJ5e3Q9d2luZG93LmRldmljZVBpeGVsUmF0aW99Y2F0Y2godCl7fXJldHVybiB0fX1dKSxlfShpdCkscmU9ZWUsaWU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShyKXtyZXR1cm4gSyh0aGlzLGUpLFkodGhpcyx0LmNhbGwodGhpcyxyLFouYS5NRURJQV9BVFRBQ0hJTkcpKX1yZXR1cm4geihlLHQpLGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnRpbWVyJiZjbGVhckludGVydmFsKHRoaXMudGltZXIpLHRoaXMuaXNWaWRlb1BsYXliYWNrUXVhbGl0eUF2YWlsYWJsZT0hMX0sZS5wcm90b3R5cGUub25NZWRpYUF0dGFjaGluZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhscy5jb25maWc7aWYoZS5jYXBMZXZlbE9uRlBTRHJvcCl7ImZ1bmN0aW9uIj09dHlwZW9mKHRoaXMudmlkZW89dC5tZWRpYSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQ/dC5tZWRpYTpudWxsKS5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSYmKHRoaXMuaXNWaWRlb1BsYXliYWNrUXVhbGl0eUF2YWlsYWJsZT0hMCksY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPXNldEludGVydmFsKHRoaXMuY2hlY2tGUFNJbnRlcnZhbC5iaW5kKHRoaXMpLGUuZnBzRHJvcHBlZE1vbml0b3JpbmdQZXJpb2QpfX0sZS5wcm90b3R5cGUuY2hlY2tGUFM9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXBlcmZvcm1hbmNlLm5vdygpO2lmKGUpe2lmKHRoaXMubGFzdFRpbWUpe3ZhciBhPWktdGhpcy5sYXN0VGltZSxuPXItdGhpcy5sYXN0RHJvcHBlZEZyYW1lcyxvPWUtdGhpcy5sYXN0RGVjb2RlZEZyYW1lcyxzPTFlMypuL2EsbD10aGlzLmhscztpZihsLnRyaWdnZXIoWi5hLkZQU19EUk9QLHtjdXJyZW50RHJvcHBlZDpuLGN1cnJlbnREZWNvZGVkOm8sdG90YWxEcm9wcGVkRnJhbWVzOnJ9KSxzPjAmJm4+bC5jb25maWcuZnBzRHJvcHBlZE1vbml0b3JpbmdUaHJlc2hvbGQqbyl7dmFyIGQ9bC5jdXJyZW50TGV2ZWw7dHQuYi53YXJuKCJkcm9wIEZQUyByYXRpbyBncmVhdGVyIHRoYW4gbWF4IGFsbG93ZWQgdmFsdWUgZm9yIGN1cnJlbnRMZXZlbDogIitkKSxkPjAmJigtMT09PWwuYXV0b0xldmVsQ2FwcGluZ3x8bC5hdXRvTGV2ZWxDYXBwaW5nPj1kKSYmKGQtPTEsbC50cmlnZ2VyKFouYS5GUFNfRFJPUF9MRVZFTF9DQVBQSU5HLHtsZXZlbDpkLGRyb3BwZWRMZXZlbDpsLmN1cnJlbnRMZXZlbH0pLGwuYXV0b0xldmVsQ2FwcGluZz1kLGwuc3RyZWFtQ29udHJvbGxlci5uZXh0TGV2ZWxTd2l0Y2goKSl9fXRoaXMubGFzdFRpbWU9aSx0aGlzLmxhc3REcm9wcGVkRnJhbWVzPXIsdGhpcy5sYXN0RGVjb2RlZEZyYW1lcz1lfX0sZS5wcm90b3R5cGUuY2hlY2tGUFNJbnRlcnZhbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmlkZW87aWYodClpZih0aGlzLmlzVmlkZW9QbGF5YmFja1F1YWxpdHlBdmFpbGFibGUpe3ZhciBlPXQuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKTt0aGlzLmNoZWNrRlBTKHQsZS50b3RhbFZpZGVvRnJhbWVzLGUuZHJvcHBlZFZpZGVvRnJhbWVzKX1lbHNlIHRoaXMuY2hlY2tGUFModCx0LndlYmtpdERlY29kZWRGcmFtZUNvdW50LHQud2Via2l0RHJvcHBlZEZyYW1lQ291bnQpfSxlfShpdCksYWU9aWUsbmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe1godGhpcyx0KSxlJiZlLnhoclNldHVwJiYodGhpcy54aHJTZXR1cD1lLnhoclNldHVwKX1yZXR1cm4gdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuYWJvcnQoKSx0aGlzLmxvYWRlcj1udWxsfSx0LnByb3RvdHlwZS5hYm9ydD1mdW5jdGlvbigpe3ZhciB0PXRoaXMubG9hZGVyO3QmJjQhPT10LnJlYWR5U3RhdGUmJih0aGlzLnN0YXRzLmFib3J0ZWQ9ITAsdC5hYm9ydCgpKSx3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLHRoaXMucmVxdWVzdFRpbWVvdXQ9bnVsbCx3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmV0cnlUaW1lb3V0KSx0aGlzLnJldHJ5VGltZW91dD1udWxsfSx0LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKHQsZSxyKXt0aGlzLmNvbnRleHQ9dCx0aGlzLmNvbmZpZz1lLHRoaXMuY2FsbGJhY2tzPXIsdGhpcy5zdGF0cz17dHJlcXVlc3Q6cGVyZm9ybWFuY2Uubm93KCkscmV0cnk6MH0sdGhpcy5yZXRyeURlbGF5PWUucmV0cnlEZWxheSx0aGlzLmxvYWRJbnRlcm5hbCgpfSx0LnByb3RvdHlwZS5sb2FkSW50ZXJuYWw9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuY29udGV4dDt0PSJ1bmRlZmluZWQiIT10eXBlb2YgWERvbWFpblJlcXVlc3Q/dGhpcy5sb2FkZXI9bmV3IFhEb21haW5SZXF1ZXN0OnRoaXMubG9hZGVyPW5ldyBYTUxIdHRwUmVxdWVzdDt2YXIgcj10aGlzLnN0YXRzO3IudGZpcnN0PTAsci5sb2FkZWQ9MDt2YXIgaT10aGlzLnhoclNldHVwO3RyeXtpZihpKXRyeXtpKHQsZS51cmwpfWNhdGNoKHIpe3Qub3BlbigiR0VUIixlLnVybCwhMCksaSh0LGUudXJsKX10LnJlYWR5U3RhdGV8fHQub3BlbigiR0VUIixlLnVybCwhMCl9Y2F0Y2gocil7cmV0dXJuIHZvaWQgdGhpcy5jYWxsYmFja3Mub25FcnJvcih7Y29kZTp0LnN0YXR1cyx0ZXh0OnIubWVzc2FnZX0sZSx0KX1lLnJhbmdlRW5kJiZ0LnNldFJlcXVlc3RIZWFkZXIoIlJhbmdlIiwiYnl0ZXM9IitlLnJhbmdlU3RhcnQrIi0iKyhlLnJhbmdlRW5kLTEpKSx0Lm9ucmVhZHlzdGF0ZWNoYW5nZT10aGlzLnJlYWR5c3RhdGVjaGFuZ2UuYmluZCh0aGlzKSx0Lm9ucHJvZ3Jlc3M9dGhpcy5sb2FkcHJvZ3Jlc3MuYmluZCh0aGlzKSx0LnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSx0aGlzLnJlcXVlc3RUaW1lb3V0PXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubG9hZHRpbWVvdXQuYmluZCh0aGlzKSx0aGlzLmNvbmZpZy50aW1lb3V0KSx0LnNlbmQoKX0sdC5wcm90b3R5cGUucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbih0KXt2YXIgZT10LmN1cnJlbnRUYXJnZXQscj1lLnJlYWR5U3RhdGUsaT10aGlzLnN0YXRzLGE9dGhpcy5jb250ZXh0LG49dGhpcy5jb25maWc7aWYoIWkuYWJvcnRlZCYmcj49MilpZih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLDA9PT1pLnRmaXJzdCYmKGkudGZpcnN0PU1hdGgubWF4KHBlcmZvcm1hbmNlLm5vdygpLGkudHJlcXVlc3QpKSw0PT09cil7dmFyIG89ZS5zdGF0dXM7aWYobz49MjAwJiZvPDMwMCl7aS50bG9hZD1NYXRoLm1heChpLnRmaXJzdCxwZXJmb3JtYW5jZS5ub3coKSk7dmFyIHM9dm9pZCAwLGw9dm9pZCAwOyJhcnJheWJ1ZmZlciI9PT1hLnJlc3BvbnNlVHlwZT8ocz1lLnJlc3BvbnNlLGw9cy5ieXRlTGVuZ3RoKToocz1lLnJlc3BvbnNlVGV4dCxsPXMubGVuZ3RoKSxpLmxvYWRlZD1pLnRvdGFsPWw7dmFyIGQ9e3VybDplLnJlc3BvbnNlVVJMLGRhdGE6c307dGhpcy5jYWxsYmFja3Mub25TdWNjZXNzKGQsaSxhLGUpfWVsc2UgaS5yZXRyeT49bi5tYXhSZXRyeXx8bz49NDAwJiZvPDQ5OT8odHQuYi5lcnJvcihvKyIgd2hpbGUgbG9hZGluZyAiK2EudXJsKSx0aGlzLmNhbGxiYWNrcy5vbkVycm9yKHtjb2RlOm8sdGV4dDplLnN0YXR1c1RleHR9LGEsZSkpOih0dC5iLndhcm4obysiIHdoaWxlIGxvYWRpbmcgIithLnVybCsiLCByZXRyeWluZyBpbiAiK3RoaXMucmV0cnlEZWxheSsiLi4uIiksdGhpcy5kZXN0cm95KCksdGhpcy5yZXRyeVRpbWVvdXQ9d2luZG93LnNldFRpbWVvdXQodGhpcy5sb2FkSW50ZXJuYWwuYmluZCh0aGlzKSx0aGlzLnJldHJ5RGVsYXkpLHRoaXMucmV0cnlEZWxheT1NYXRoLm1pbigyKnRoaXMucmV0cnlEZWxheSxuLm1heFJldHJ5RGVsYXkpLGkucmV0cnkrKyl9ZWxzZSB0aGlzLnJlcXVlc3RUaW1lb3V0PXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubG9hZHRpbWVvdXQuYmluZCh0aGlzKSxuLnRpbWVvdXQpfSx0LnByb3RvdHlwZS5sb2FkdGltZW91dD1mdW5jdGlvbigpe3R0LmIud2FybigidGltZW91dCB3aGlsZSBsb2FkaW5nICIrdGhpcy5jb250ZXh0LnVybCksdGhpcy5jYWxsYmFja3Mub25UaW1lb3V0KHRoaXMuc3RhdHMsdGhpcy5jb250ZXh0LG51bGwpfSx0LnByb3RvdHlwZS5sb2FkcHJvZ3Jlc3M9ZnVuY3Rpb24odCl7dmFyIGU9dC5jdXJyZW50VGFyZ2V0LHI9dGhpcy5zdGF0cztyLmxvYWRlZD10LmxvYWRlZCx0Lmxlbmd0aENvbXB1dGFibGUmJihyLnRvdGFsPXQudG90YWwpO3ZhciBpPXRoaXMuY2FsbGJhY2tzLm9uUHJvZ3Jlc3M7aSYmaShyLHRoaXMuY29udGV4dCxudWxsLGUpfSx0fSgpLG9lPW5lLHNlPShyKDMpLHthdXRvU3RhcnRMb2FkOiEwLHN0YXJ0UG9zaXRpb246LTEsZGVmYXVsdEF1ZGlvQ29kZWM6dm9pZCAwLGRlYnVnOiExLGNhcExldmVsT25GUFNEcm9wOiExLGNhcExldmVsVG9QbGF5ZXJTaXplOiExLGluaXRpYWxMaXZlTWFuaWZlc3RTaXplOjEsbWF4QnVmZmVyTGVuZ3RoOjMwLG1heEJ1ZmZlclNpemU6NmU3LG1heEJ1ZmZlckhvbGU6LjUsbWF4U2Vla0hvbGU6Mixsb3dCdWZmZXJXYXRjaGRvZ1BlcmlvZDouNSxoaWdoQnVmZmVyV2F0Y2hkb2dQZXJpb2Q6MyxudWRnZU9mZnNldDouMSxudWRnZU1heFJldHJ5OjMsbWF4RnJhZ0xvb2tVcFRvbGVyYW5jZTouMixsaXZlU3luY0R1cmF0aW9uQ291bnQ6MyxsaXZlTWF4TGF0ZW5jeUR1cmF0aW9uQ291bnQ6MS8wLGxpdmVTeW5jRHVyYXRpb246dm9pZCAwLGxpdmVNYXhMYXRlbmN5RHVyYXRpb246dm9pZCAwLG1heE1heEJ1ZmZlckxlbmd0aDo2MDAsZW5hYmxlV29ya2VyOiEwLGVuYWJsZVNvZnR3YXJlQUVTOiEwLG1hbmlmZXN0TG9hZGluZ1RpbWVPdXQ6MWU0LG1hbmlmZXN0TG9hZGluZ01heFJldHJ5OjEsbWFuaWZlc3RMb2FkaW5nUmV0cnlEZWxheToxZTMsbWFuaWZlc3RMb2FkaW5nTWF4UmV0cnlUaW1lb3V0OjY0ZTMsc3RhcnRMZXZlbDp2b2lkIDAsbGV2ZWxMb2FkaW5nVGltZU91dDoxZTQsbGV2ZWxMb2FkaW5nTWF4UmV0cnk6NCxsZXZlbExvYWRpbmdSZXRyeURlbGF5OjFlMyxsZXZlbExvYWRpbmdNYXhSZXRyeVRpbWVvdXQ6NjRlMyxmcmFnTG9hZGluZ1RpbWVPdXQ6MmU0LGZyYWdMb2FkaW5nTWF4UmV0cnk6NixmcmFnTG9hZGluZ1JldHJ5RGVsYXk6MWUzLGZyYWdMb2FkaW5nTWF4UmV0cnlUaW1lb3V0OjY0ZTMsZnJhZ0xvYWRpbmdMb29wVGhyZXNob2xkOjMsc3RhcnRGcmFnUHJlZmV0Y2g6ITEsZnBzRHJvcHBlZE1vbml0b3JpbmdQZXJpb2Q6NWUzLGZwc0Ryb3BwZWRNb25pdG9yaW5nVGhyZXNob2xkOi4yLGFwcGVuZEVycm9yTWF4UmV0cnk6Myxsb2FkZXI6b2UsZkxvYWRlcjp2b2lkIDAscExvYWRlcjp2b2lkIDAseGhyU2V0dXA6dm9pZCAwLGZldGNoU2V0dXA6dm9pZCAwLGFickNvbnRyb2xsZXI6SnQsYnVmZmVyQ29udHJvbGxlcjokdCxjYXBMZXZlbENvbnRyb2xsZXI6cmUsZnBzQ29udHJvbGxlcjphZSxzdHJldGNoU2hvcnRWaWRlb1RyYWNrOiExLGZvcmNlS2V5RnJhbWVPbkRpc2NvbnRpbnVpdHk6ITAsYWJyRXdtYUZhc3RMaXZlOjMsYWJyRXdtYVNsb3dMaXZlOjksYWJyRXdtYUZhc3RWb0Q6MyxhYnJFd21hU2xvd1ZvRDo5LGFickV3bWFEZWZhdWx0RXN0aW1hdGU6NWU1LGFickJhbmRXaWR0aEZhY3RvcjouOTUsYWJyQmFuZFdpZHRoVXBGYWN0b3I6LjcsYWJyTWF4V2l0aFJlYWxCaXRyYXRlOiExLG1heFN0YXJ2YXRpb25EZWxheTo0LG1heExvYWRpbmdEZWxheTo0LG1pbkF1dG9CaXRyYXRlOjB9KSxsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1yZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3JldHVybiByJiZ0KGUucHJvdG90eXBlLHIpLGkmJnQoZSxpKSxlfX0oKSxkZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgZT10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3EodGhpcyx0KTt2YXIgaT10LkRlZmF1bHRDb25maWc7aWYoKHIubGl2ZVN5bmNEdXJhdGlvbkNvdW50fHxyLmxpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudCkmJihyLmxpdmVTeW5jRHVyYXRpb258fHIubGl2ZU1heExhdGVuY3lEdXJhdGlvbikpdGhyb3cgbmV3IEVycm9yKCJJbGxlZ2FsIGhscy5qcyBjb25maWc6IGRvbid0IG1peCB1cCBsaXZlU3luY0R1cmF0aW9uQ291bnQvbGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50IGFuZCBsaXZlU3luY0R1cmF0aW9uL2xpdmVNYXhMYXRlbmN5RHVyYXRpb24iKTtmb3IodmFyIGEgaW4gaSlhIGluIHJ8fChyW2FdPWlbYV0pO2lmKHZvaWQgMCE9PXIubGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50JiZyLmxpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudDw9ci5saXZlU3luY0R1cmF0aW9uQ291bnQpdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGhscy5qcyBjb25maWc6ICJsaXZlTWF4TGF0ZW5jeUR1cmF0aW9uQ291bnQiIG11c3QgYmUgZ3QgImxpdmVTeW5jRHVyYXRpb25Db3VudCInKTtpZih2b2lkIDAhPT1yLmxpdmVNYXhMYXRlbmN5RHVyYXRpb24mJihyLmxpdmVNYXhMYXRlbmN5RHVyYXRpb248PXIubGl2ZVN5bmNEdXJhdGlvbnx8dm9pZCAwPT09ci5saXZlU3luY0R1cmF0aW9uKSl0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgaGxzLmpzIGNvbmZpZzogImxpdmVNYXhMYXRlbmN5RHVyYXRpb24iIG11c3QgYmUgZ3QgImxpdmVTeW5jRHVyYXRpb24iJyk7T2JqZWN0KHR0LmEpKHIuZGVidWcpLHRoaXMuY29uZmlnPXIsdGhpcy5fYXV0b0xldmVsQ2FwcGluZz0tMTt2YXIgbj10aGlzLm9ic2VydmVyPW5ldyBEdC5hO24udHJpZ2dlcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5KGU+MT9lLTE6MCksaT0xO2k8ZTtpKyspcltpLTFdPWFyZ3VtZW50c1tpXTtuLmVtaXQuYXBwbHkobixbdCx0XS5jb25jYXQocikpfSxuLm9mZj1mdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5KGU+MT9lLTE6MCksaT0xO2k8ZTtpKyspcltpLTFdPWFyZ3VtZW50c1tpXTtuLnJlbW92ZUxpc3RlbmVyLmFwcGx5KG4sW3RdLmNvbmNhdChyKSl9LHRoaXMub249bi5vbi5iaW5kKG4pLHRoaXMub2ZmPW4ub2ZmLmJpbmQobiksdGhpcy50cmlnZ2VyPW4udHJpZ2dlci5iaW5kKG4pO3ZhciBvPXRoaXMuYWJyQ29udHJvbGxlcj1uZXcgci5hYnJDb250cm9sbGVyKHRoaXMpLHM9bmV3IHIuYnVmZmVyQ29udHJvbGxlcih0aGlzKSxsPW5ldyByLmNhcExldmVsQ29udHJvbGxlcih0aGlzKSxkPW5ldyByLmZwc0NvbnRyb2xsZXIodGhpcyksdT1uZXcgbXQodGhpcyksaD1uZXcgYnQodGhpcyksZj1uZXcgUnQodGhpcyksYz1uZXcgV3QodGhpcykscD10aGlzLmxldmVsQ29udHJvbGxlcj1uZXcgSHQodGhpcyksdj10aGlzLnN0cmVhbUNvbnRyb2xsZXI9bmV3IFV0KHRoaXMpLGc9W3Asdl0sbT1yLmF1ZGlvU3RyZWFtQ29udHJvbGxlcjttJiZnLnB1c2gobmV3IG0odGhpcykpLHRoaXMubmV0d29ya0NvbnRyb2xsZXJzPWc7dmFyIHk9W3UsaCxmLG8scyxsLGQsY107aWYobT1yLmF1ZGlvVHJhY2tDb250cm9sbGVyKXt2YXIgYj1uZXcgbSh0aGlzKTt0aGlzLmF1ZGlvVHJhY2tDb250cm9sbGVyPWIseS5wdXNoKGIpfWlmKG09ci5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcil7dmFyIEU9bmV3IG0odGhpcyk7dGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcj1FLHkucHVzaChFKX1bci5zdWJ0aXRsZVN0cmVhbUNvbnRyb2xsZXIsci50aW1lbGluZUNvbnRyb2xsZXJdLmZvckVhY2goZnVuY3Rpb24odCl7dCYmeS5wdXNoKG5ldyB0KGUpKX0pLHRoaXMuY29yZUNvbXBvbmVudHM9eX1yZXR1cm4gdC5pc1N1cHBvcnRlZD1mdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5NZWRpYVNvdXJjZT13aW5kb3cuTWVkaWFTb3VyY2V8fHdpbmRvdy5XZWJLaXRNZWRpYVNvdXJjZSxlPXdpbmRvdy5Tb3VyY2VCdWZmZXI9d2luZG93LlNvdXJjZUJ1ZmZlcnx8d2luZG93LldlYktpdFNvdXJjZUJ1ZmZlcixyPXQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmlzVHlwZVN1cHBvcnRlZCYmdC5pc1R5cGVTdXBwb3J0ZWQoJ3ZpZGVvL21wNDsgY29kZWNzPSJhdmMxLjQyRTAxRSxtcDRhLjQwLjIiJyksaT0hZXx8ZS5wcm90b3R5cGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnByb3RvdHlwZS5hcHBlbmRCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnByb3RvdHlwZS5yZW1vdmU7cmV0dXJuIHImJml9LGxlKHQsbnVsbCxbe2tleToidmVyc2lvbiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjAuOC4yIn19LHtrZXk6IkV2ZW50cyIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFouYX19LHtrZXk6IkVycm9yVHlwZXMiLGdldDpmdW5jdGlvbigpe3JldHVybiAkLmJ9fSx7a2V5OiJFcnJvckRldGFpbHMiLGdldDpmdW5jdGlvbigpe3JldHVybiAkLmF9fSx7a2V5OiJEZWZhdWx0Q29uZmlnIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0Q29uZmlnP3QuZGVmYXVsdENvbmZpZzpzZX0sc2V0OmZ1bmN0aW9uKGUpe3QuZGVmYXVsdENvbmZpZz1lfX1dKSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dHQuYi5sb2coImRlc3Ryb3kiKSx0aGlzLnRyaWdnZXIoWi5hLkRFU1RST1lJTkcpLHRoaXMuZGV0YWNoTWVkaWEoKSx0aGlzLmNvcmVDb21wb25lbnRzLmNvbmNhdCh0aGlzLm5ldHdvcmtDb250cm9sbGVycykuZm9yRWFjaChmdW5jdGlvbih0KXt0LmRlc3Ryb3koKX0pLHRoaXMudXJsPW51bGwsdGhpcy5vYnNlcnZlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKSx0aGlzLl9hdXRvTGV2ZWxDYXBwaW5nPS0xfSx0LnByb3RvdHlwZS5hdHRhY2hNZWRpYT1mdW5jdGlvbih0KXt0dC5iLmxvZygiYXR0YWNoTWVkaWEiKSx0aGlzLm1lZGlhPXQsdGhpcy50cmlnZ2VyKFouYS5NRURJQV9BVFRBQ0hJTkcse21lZGlhOnR9KX0sdC5wcm90b3R5cGUuZGV0YWNoTWVkaWE9ZnVuY3Rpb24oKXt0dC5iLmxvZygiZGV0YWNoTWVkaWEiKSx0aGlzLnRyaWdnZXIoWi5hLk1FRElBX0RFVEFDSElORyksdGhpcy5tZWRpYT1udWxsfSx0LnByb3RvdHlwZS5sb2FkU291cmNlPWZ1bmN0aW9uKHQpe3Q9Si5hLmJ1aWxkQWJzb2x1dGVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYsdCx7YWx3YXlzTm9ybWFsaXplOiEwfSksdHQuYi5sb2coImxvYWRTb3VyY2U6Iit0KSx0aGlzLnVybD10LHRoaXMudHJpZ2dlcihaLmEuTUFOSUZFU1RfTE9BRElORyx7dXJsOnR9KX0sdC5wcm90b3R5cGUuc3RhcnRMb2FkPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOi0xO3R0LmIubG9nKCJzdGFydExvYWQoIit0KyIpIiksdGhpcy5uZXR3b3JrQ29udHJvbGxlcnMuZm9yRWFjaChmdW5jdGlvbihlKXtlLnN0YXJ0TG9hZCh0KX0pfSx0LnByb3RvdHlwZS5zdG9wTG9hZD1mdW5jdGlvbigpe3R0LmIubG9nKCJzdG9wTG9hZCIpLHRoaXMubmV0d29ya0NvbnRyb2xsZXJzLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdG9wTG9hZCgpfSl9LHQucHJvdG90eXBlLnN3YXBBdWRpb0NvZGVjPWZ1bmN0aW9uKCl7dHQuYi5sb2coInN3YXBBdWRpb0NvZGVjIiksdGhpcy5zdHJlYW1Db250cm9sbGVyLnN3YXBBdWRpb0NvZGVjKCl9LHQucHJvdG90eXBlLnJlY292ZXJNZWRpYUVycm9yPWZ1bmN0aW9uKCl7dHQuYi5sb2coInJlY292ZXJNZWRpYUVycm9yIik7dmFyIHQ9dGhpcy5tZWRpYTt0aGlzLmRldGFjaE1lZGlhKCksdGhpcy5hdHRhY2hNZWRpYSh0KX0sbGUodCxbe2tleToibGV2ZWxzIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubGV2ZWxzfX0se2tleToiY3VycmVudExldmVsIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLmN1cnJlbnRMZXZlbH0sc2V0OmZ1bmN0aW9uKHQpe3R0LmIubG9nKCJzZXQgY3VycmVudExldmVsOiIrdCksdGhpcy5sb2FkTGV2ZWw9dCx0aGlzLnN0cmVhbUNvbnRyb2xsZXIuaW1tZWRpYXRlTGV2ZWxTd2l0Y2goKX19LHtrZXk6Im5leHRMZXZlbCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyZWFtQ29udHJvbGxlci5uZXh0TGV2ZWx9LHNldDpmdW5jdGlvbih0KXt0dC5iLmxvZygic2V0IG5leHRMZXZlbDoiK3QpLHRoaXMubGV2ZWxDb250cm9sbGVyLm1hbnVhbExldmVsPXQsdGhpcy5zdHJlYW1Db250cm9sbGVyLm5leHRMZXZlbFN3aXRjaCgpfX0se2tleToibG9hZExldmVsIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubGV2ZWx9LHNldDpmdW5jdGlvbih0KXt0dC5iLmxvZygic2V0IGxvYWRMZXZlbDoiK3QpLHRoaXMubGV2ZWxDb250cm9sbGVyLm1hbnVhbExldmVsPXR9fSx7a2V5OiJuZXh0TG9hZExldmVsIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubmV4dExvYWRMZXZlbH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMubGV2ZWxDb250cm9sbGVyLm5leHRMb2FkTGV2ZWw9dH19LHtrZXk6ImZpcnN0TGV2ZWwiLGdldDpmdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCh0aGlzLmxldmVsQ29udHJvbGxlci5maXJzdExldmVsLHRoaXMubWluQXV0b0xldmVsKX0sc2V0OmZ1bmN0aW9uKHQpe3R0LmIubG9nKCJzZXQgZmlyc3RMZXZlbDoiK3QpLHRoaXMubGV2ZWxDb250cm9sbGVyLmZpcnN0TGV2ZWw9dH19LHtrZXk6InN0YXJ0TGV2ZWwiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxldmVsQ29udHJvbGxlci5zdGFydExldmVsfSxzZXQ6ZnVuY3Rpb24odCl7dHQuYi5sb2coInNldCBzdGFydExldmVsOiIrdCk7dmFyIGU9dGhpczstMSE9PXQmJih0PU1hdGgubWF4KHQsZS5taW5BdXRvTGV2ZWwpKSxlLmxldmVsQ29udHJvbGxlci5zdGFydExldmVsPXR9fSx7a2V5OiJhdXRvTGV2ZWxDYXBwaW5nIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXV0b0xldmVsQ2FwcGluZ30sc2V0OmZ1bmN0aW9uKHQpe3R0LmIubG9nKCJzZXQgYXV0b0xldmVsQ2FwcGluZzoiK3QpLHRoaXMuX2F1dG9MZXZlbENhcHBpbmc9dH19LHtrZXk6ImF1dG9MZXZlbEVuYWJsZWQiLGdldDpmdW5jdGlvbigpe3JldHVybi0xPT09dGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWx9fSx7a2V5OiJtYW51YWxMZXZlbCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGV2ZWxDb250cm9sbGVyLm1hbnVhbExldmVsfX0se2tleToibWluQXV0b0xldmVsIixnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPXQubGV2ZWxzLHI9dC5jb25maWcubWluQXV0b0JpdHJhdGUsaT1lP2UubGVuZ3RoOjAsYT0wO2E8aTthKyspe2lmKChlW2FdLnJlYWxCaXRyYXRlP01hdGgubWF4KGVbYV0ucmVhbEJpdHJhdGUsZVthXS5iaXRyYXRlKTplW2FdLmJpdHJhdGUpPnIpcmV0dXJuIGF9cmV0dXJuIDB9fSx7a2V5OiJtYXhBdXRvTGV2ZWwiLGdldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LmxldmVscyxyPXQuYXV0b0xldmVsQ2FwcGluZztyZXR1cm4tMT09PXImJmUmJmUubGVuZ3RoP2UubGVuZ3RoLTE6cn19LHtrZXk6Im5leHRBdXRvTGV2ZWwiLGdldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHQuYWJyQ29udHJvbGxlci5uZXh0QXV0b0xldmVsLHQubWluQXV0b0xldmVsKSx0Lm1heEF1dG9MZXZlbCl9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10aGlzO2UuYWJyQ29udHJvbGxlci5uZXh0QXV0b0xldmVsPU1hdGgubWF4KGUubWluQXV0b0xldmVsLHQpfX0se2tleToiYXVkaW9UcmFja3MiLGdldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXI7cmV0dXJuIHQ/dC5hdWRpb1RyYWNrczpbXX19LHtrZXk6ImF1ZGlvVHJhY2siLGdldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXI7cmV0dXJuIHQ/dC5hdWRpb1RyYWNrOi0xfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdWRpb1RyYWNrQ29udHJvbGxlcjtlJiYoZS5hdWRpb1RyYWNrPXQpfX0se2tleToibGl2ZVN5bmNQb3NpdGlvbiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyZWFtQ29udHJvbGxlci5saXZlU3luY1Bvc2l0aW9ufX0se2tleToic3VidGl0bGVUcmFja3MiLGdldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXI7cmV0dXJuIHQ/dC5zdWJ0aXRsZVRyYWNrczpbXX19LHtrZXk6InN1YnRpdGxlVHJhY2siLGdldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXI7cmV0dXJuIHQ/dC5zdWJ0aXRsZVRyYWNrOi0xfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjtlJiYoZS5zdWJ0aXRsZVRyYWNrPXQpfX1dKSx0fSgpO2UuZGVmYXVsdD1kZX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIGkodCl7ZnVuY3Rpb24gZShpKXtpZihyW2ldKXJldHVybiByW2ldLmV4cG9ydHM7dmFyIGE9cltpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbaV0uY2FsbChhLmV4cG9ydHMsYSxhLmV4cG9ydHMsZSksYS5sPSEwLGEuZXhwb3J0c312YXIgcj17fTtlLm09dCxlLmM9cixlLmk9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGUuZD1mdW5jdGlvbih0LHIsaSl7ZS5vKHQscil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDppfSl9LGUubj1mdW5jdGlvbih0KXt2YXIgcj10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gZS5kKHIsImEiLHIpLHJ9LGUubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sZS5wPSIvIixlLm9lPWZ1bmN0aW9uKHQpe3Rocm93IGNvbnNvbGUuZXJyb3IodCksdH07dmFyIGk9ZShlLnM9RU5UUllfTU9EVUxFKTtyZXR1cm4gaS5kZWZhdWx0fHxpfWZ1bmN0aW9uIGEodCl7cmV0dXJuKHQrIiIpLnJlcGxhY2UoL1suPyorXiRbXF1cXCgpe318LV0vZywiXFwkJiIpfWZ1bmN0aW9uIG4odCl7dmFyIGU9W10scj10LnRvU3RyaW5nKCksaT1yLm1hdGNoKC9eZnVuY3Rpb25ccz9cKFx3KyxccypcdyssXHMqKFx3KylcKS8pO2lmKCFpKXJldHVybiBlO2Zvcih2YXIgbixvPWlbMV0scz1uZXcgUmVnRXhwKCIoXFxcXG58XFxXKSIrYShvKSsiXFwoKC9cXCouKj9cXCovKT9zPy4qPyhbXFwufFxcLXxcXHd8L3xAXSspLio/XFwpIiwiZyIpO249cy5leGVjKHIpOyllLnB1c2goblszXSk7cmV0dXJuIGV9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgcj1bZV0saT1bXSxhPXt9O3IubGVuZ3RoOyl7dmFyIG89ci5wb3AoKTtpZighYVtvXSYmdFtvXSl7YVtvXT0hMCxpLnB1c2gobyk7dmFyIHM9bih0W29dKTtyPXIuY29uY2F0KHMpfX1yZXR1cm4gaX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlPWV8fHt9O3ZhciBhPXIubSxuPWUuYWxsP09iamVjdC5rZXlzKGEpOm8oYSx0KSxzPSIoIitpLnRvU3RyaW5nKCkucmVwbGFjZSgiRU5UUllfTU9EVUxFIixKU09OLnN0cmluZ2lmeSh0KSkrIikoeyIrbi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpKyI6ICIrYVt0XS50b1N0cmluZygpfSkuam9pbigiLCIpKyJ9KShzZWxmKTsiLGw9bmV3IHdpbmRvdy5CbG9iKFtzXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pO2lmKGUuYmFyZSlyZXR1cm4gbDt2YXIgZD13aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMfHx3aW5kb3cubW96VVJMfHx3aW5kb3cubXNVUkwsdT1kLmNyZWF0ZU9iamVjdFVSTChsKSxoPW5ldyB3aW5kb3cuV29ya2VyKHUpO3JldHVybiBoLm9iamVjdFVSTD11LGh9fSxmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaT1yKDcpLGE9cigxKSxuPXIoMCksbz1yKDUpLHM9ci5uKG8pLGw9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHMuYTtlLnRyaWdnZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsaT1BcnJheShyPjE/ci0xOjApLGE9MTthPHI7YSsrKWlbYS0xXT1hcmd1bWVudHNbYV07ZS5lbWl0LmFwcGx5KGUsW3QsdF0uY29uY2F0KGkpKX0sZS5vZmY9ZnVuY3Rpb24odCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsaT1BcnJheShyPjE/ci0xOjApLGE9MTthPHI7YSsrKWlbYS0xXT1hcmd1bWVudHNbYV07ZS5yZW1vdmVMaXN0ZW5lci5hcHBseShlLFt0XS5jb25jYXQoaSkpfTt2YXIgcj1mdW5jdGlvbihlLHIpe3QucG9zdE1lc3NhZ2Uoe2V2ZW50OmUsZGF0YTpyfSl9O3QuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dmFyIG89YS5kYXRhO3N3aXRjaChvLmNtZCl7Y2FzZSJpbml0Ijp2YXIgcz1KU09OLnBhcnNlKG8uY29uZmlnKTt0LmRlbXV4ZXI9bmV3IGkuYShlLG8udHlwZVN1cHBvcnRlZCxzLG8udmVuZG9yKTt0cnl7T2JqZWN0KG4uYSkoITA9PT1zLmRlYnVnKX1jYXRjaCh0KXtjb25zb2xlLndhcm4oImRlbXV4ZXJXb3JrZXI6IHVuYWJsZSB0byBlbmFibGUgbG9ncyIpfXIoImluaXQiLG51bGwpO2JyZWFrO2Nhc2UiZGVtdXgiOnQuZGVtdXhlci5wdXNoKG8uZGF0YSxvLmRlY3J5cHRkYXRhLG8uaW5pdFNlZ21lbnQsby5hdWRpb0NvZGVjLG8udmlkZW9Db2RlYyxvLnRpbWVPZmZzZXQsby5kaXNjb250aW51aXR5LG8udHJhY2tTd2l0Y2gsby5jb250aWd1b3VzLG8uZHVyYXRpb24sby5hY2N1cmF0ZVRpbWVPZmZzZXQsby5kZWZhdWx0SW5pdFBUUyl9fSksZS5vbihhLmEuRlJBR19ERUNSWVBURUQsciksZS5vbihhLmEuRlJBR19QQVJTSU5HX0lOSVRfU0VHTUVOVCxyKSxlLm9uKGEuYS5GUkFHX1BBUlNFRCxyKSxlLm9uKGEuYS5FUlJPUixyKSxlLm9uKGEuYS5GUkFHX1BBUlNJTkdfTUVUQURBVEEsciksZS5vbihhLmEuRlJBR19QQVJTSU5HX1VTRVJEQVRBLHIpLGUub24oYS5hLklOSVRfUFRTX0ZPVU5ELHIpLGUub24oYS5hLkZSQUdfUEFSU0lOR19EQVRBLGZ1bmN0aW9uKGUscil7dmFyIGk9W10sYT17ZXZlbnQ6ZSxkYXRhOnJ9O3IuZGF0YTEmJihhLmRhdGExPXIuZGF0YTEuYnVmZmVyLGkucHVzaChyLmRhdGExLmJ1ZmZlciksZGVsZXRlIHIuZGF0YTEpLHIuZGF0YTImJihhLmRhdGEyPXIuZGF0YTIuYnVmZmVyLGkucHVzaChyLmRhdGEyLmJ1ZmZlciksZGVsZXRlIHIuZGF0YTIpLHQucG9zdE1lc3NhZ2UoYSxpKX0pfTtlLmRlZmF1bHQ9bH1dKS5kZWZhdWx0fSk7