diff --git a/Documentation.md b/Documentation.md index d71010c..5ae9e98 100644 --- a/Documentation.md +++ b/Documentation.md @@ -16,14 +16,18 @@ In version 1.x, we also support `make` for legacy builds. This option was remove # Important Announcements -1. March 2024 - In response to a Google Chrome feature launched on 7/13/2023 called [Storage Partitioning](https://developers.google.com/privacy-sandbox/3pcd/storage-partitioning), we made a short term fix on 2/10/2024 to adjust our mute functionality and synchronize the mute state across all CCPs. However, due to current limitations, this change required us to disable muting while being on hold. As a workaround, agents should mute themselves on the call before going on hold. We are planning to address this issue by August 2024 and revert back to original mute behavior. +1. July 2024 - The issue with muting while a Voice contact is on hold has been resolved. Agents can use the mute button while a contact is placed on hold. The following APIs will be available when the contact is on hold: + * `voiceConnection.muteParticipant()` + * `voiceConnection.unmuteParticipant()` + * `agent.mute()` + * `agent.unmute()` +1. February 2024 - In response to a Google Chrome feature launched on 7/13/2023 called [Storage Partitioning](https://developers.google.com/privacy-sandbox/3pcd/storage-partitioning), we made a short term fix on 2/10/2024 to adjust our mute functionality and synchronize the mute state across all CCPs. However, due to current limitations, this change required us to disable muting while being on hold. As a workaround, agents should mute themselves on the call before going on hold. We are planning to address this issue by August 2024 and revert back to original mute behavior. * At the moment, the following APIs will fail when the contact is on hold: * `voiceConnection.muteParticipant()` * `voiceConnection.unmuteParticipant()` * `agent.mute()` * `agent.unmute()` * As a workaround, you can mute the call prior to placing the call on hold. - 1. December 2022 - In addition to the CCP, customers can now embed an application that provides guided experiences to your agents using the connect.agentApp. See the [updated documentation](https://github.com/amazon-connect/amazon-connect-streams/blob/master/Documentation.md#initialization-for-ccp-customer-profiles-amazon-q-connect-and-customviews) for details on usage. - ### Guided experiences for agents - With Amazon Connect you can now create guided step-by-step experiences that walk agents through tailored views that focus on what must be seen or done by the agent at a given moment during an interaction. You can design workflows for various types of customer interactions and present agents with different step-by-step guides based on context, such as call queue, customer information, and interactive voice response (IVR). This feature is available in the Connect agent workspace as well as an embeddable application that can be embedded into another website via the Streams API. For more information, visit the AWS website: https://aws.amazon.com/connect/agent-workspace/ @@ -225,8 +229,12 @@ everything set up correctly and that you are able to listen for events. VDIPlatform: null, // optional, provide with 'CITRIX' if using Citrix VDI, or use enum VDIPlatformType allowEarlyGum: true, //optional, default to true }, + task: { + disableRingtone: false, // optional, defaults to false + ringtoneUrl: "[your-ringtone-filepath].mp3" // optional, defaults to CCP's default ringtone if a falsy value is set + }, storageAccess: { - canRequest: true, // By default this is set to true. You can set it to false to opt out from checking storage access. + canRequest: false, // By default this is set to false. You can set it to true to opt in for checking storage access. mode: "custom", // To use the default banner, set this to "default" /** More customization options can be found here: https://github.com/amazon-connect/amazon-connect-streams/blob/master/src/index.d.ts under StorageAccessParameters */ }, diff --git a/README.md b/README.md index 9954087..615f198 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,12 @@ Run `npm run release` to generate new release files. Full instructions for build In version 1.x, we also support `make` for legacy builds. This option was removed in version 2.x. # Important Announcements -1. March 2024 - In response to a Google Chrome feature launched on 7/13/2023 called [Storage Partitioning](https://developers.google.com/privacy-sandbox/3pcd/storage-partitioning), we made a short term fix on 2/10/2024 to adjust our mute functionality and synchronize the mute state across all CCPs. However, due to current limitations, this change required us to disable muting while being on hold. As a workaround, agents should mute themselves on the call before going on hold. We are planning to address this issue by August 2024 and revert back to original mute behavior. +1. July 2024 - The issue with muting while a Voice contact is on hold has been resolved. Agents can use the mute button while a contact is placed on hold. The following APIs will be available when the contact is on hold: + * `voiceConnection.muteParticipant()` + * `voiceConnection.unmuteParticipant()` + * `agent.mute()` + * `agent.unmute()` +1. February 2024 - In response to a Google Chrome feature launched on 7/13/2023 called [Storage Partitioning](https://developers.google.com/privacy-sandbox/3pcd/storage-partitioning), we made a short term fix on 2/10/2024 to adjust our mute functionality and synchronize the mute state across all CCPs. However, due to current limitations, this change required us to disable muting while being on hold. As a workaround, agents should mute themselves on the call before going on hold. We are planning to address this issue by August 2024 and revert back to original mute behavior. * At the moment, the following APIs will fail when the contact is on hold: * `voiceConnection.muteParticipant()` * `voiceConnection.unmuteParticipant()` @@ -208,7 +213,7 @@ everything setup correctly and that you will be able to listen for events. }, task: { disableRingtone: false, // optional, defaults to false - ringtoneUrl: "[your-ringtone-filepath].mp3", // optional, defaults to CCP's default ringtone if a falsy value is set + ringtoneUrl: "[your-ringtone-filepath].mp3" // optional, defaults to CCP's default ringtone if a falsy value is set }, pageOptions: { //optional enableAudioDeviceSettings: false, //optional, defaults to 'false' diff --git a/package-lock.json b/package-lock.json index 1729231..8e1cc45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "amazon-connect-streams", - "version": "2.14.3", + "version": "2.14.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "amazon-connect-streams", - "version": "2.14.3", + "version": "2.14.4", "license": "Apache-2.0", "devDependencies": { "chai": "^4.3.7", diff --git a/package.json b/package.json index 2da6fa8..57dd653 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amazon-connect-streams", - "version": "2.14.3", + "version": "2.14.4", "description": "Amazon Connect Streams Library", "engines": { "node": ">=12.0.0" diff --git a/release/connect-streams-dr-min.js b/release/connect-streams-dr-min.js index dafdfa0..7ed6e92 100644 --- a/release/connect-streams-dr-min.js +++ b/release/connect-streams-dr-min.js @@ -1 +1 @@ -(()=>{var l;(l={772:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezgyMTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuYWdlbnRBcHA9e307dmFyIG49e0NDUDoiY2NwIixHVUlERVM6ImN1c3RvbXZpZXdzIn07dC5hZ2VudEFwcC5pbml0Q0NQPXQuY29yZS5pbml0Q0NQLHQuYWdlbnRBcHAuaXNJbml0aWFsaXplZD1mdW5jdGlvbihlKXt9LHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSxvPW5ldyB0LklGcmFtZUNvbmR1aXQobix3aW5kb3csciksaT1bdC5BZ2VudEV2ZW50cy5VUERBVEUsdC5Db250YWN0RXZlbnRzLlZJRVcsdC5FdmVudFR5cGUuQUNLTk9XTEVER0UsdC5FdmVudFR5cGUuVEVSTUlOQVRFRCx0LlRhc2tFdmVudHMuQ1JFQVRFRF07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oZSl7aS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGUsKGZ1bmN0aW9uKHQpe28uc2VuZFVwc3RyZWFtKGUsdCl9KSl9KSl9KSl9O3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiY2NwLXYyIik7cmV0dXJuIGUuc2xpY2UoMCx0LTEpfSxvPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTt0cnl7cmV0dXJuIGUuZ2V0Q29udGFjdElkKCl9Y2F0Y2h7cmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiW0N1c3RvbVZpZXdzXTogSW52YWxpZCBDb250YWN0IFByb3ZpZGVkOiAiLGUpfX07dC5hZ2VudEFwcC5pbml0QXBwPWZ1bmN0aW9uKGUsaSxzLGEpe2E9YXx8e307dmFyIGMsdT1zLmVuZHNXaXRoKCIvIil8fC9bPyZdP1tePT8mXSs9W149PyZdKy9nLnRlc3Qocyk/czpzKyIvIixsPWEub25Mb2FkP2Eub25Mb2FkOm51bGwscD17ZW5kcG9pbnQ6dSxzdHlsZTphLnN0eWxlLG9uTG9hZDpsfTtpZihlPT09bi5DQ1BfRFIpYz1uLkNDUDtlbHNlIGlmKGU9PT1uLkdVSURFUyYmYS5jdXN0b21WaWV3c1BhcmFtcyl7Y29uc3R7aWZyYW1lU3VmZml4OmV9PWEuY3VzdG9tVmlld3NQYXJhbXM7aWYoYz1lP2Ake24uR1VJREVTfSR7ZX1gOmAke24uR1VJREVTfWAsdm9pZCAwIT09dC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5nZXQoYykpdGhyb3cgbmV3IEVycm9yKCJbQ3VzdG9tVmlld3NdOiBDdXN0b20gdmlld3MgYXBwbGljYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLiBQbGVhc2UgcHJvdmlkZSBhIGRpZmZlcmVudCBpZnJhbWVTdWZmaXggZm9yIHRoZSBjdXN0b20gdmlld3MgYXBwbGljYXRpb24uIil9ZWxzZSBjPWU7dmFyIGQ9InN0cmluZyI9PXR5cGVvZiBpP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpOmk7dC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5yZWdpc3RlcihjLHAsZCksdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5zdGFydChjLChmdW5jdGlvbihpKXt2YXIgcz1pLmVuZHBvaW50LHU9aS5jb250YWluZXJET007cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtzd2l0Y2goZSl7Y2FzZSBuLkNDUDpyZXR1cm4gYS5jY3BQYXJhbXM9YS5jY3BQYXJhbXM/YS5jY3BQYXJhbXM6e30sYS5zdHlsZSYmKGEuY2NwUGFyYW1zLnN0eWxlPWEuc3R5bGUpLGZ1bmN0aW9uKGUsbixvKXt2YXIgaT17Y2NwVXJsOmUsY2NwTG9hZFRpbWVvdXQ6MWU0LGxvZ2luUG9wdXA6ITAsbG9naW5Vcmw6cihlKSsiL2xvZ2luIixzb2Z0cGhvbmU6e2FsbG93RnJhbWVkU29mdHBob25lOiEwLGRpc2FibGVSaW5ndG9uZTohMSxhbGxvd0ZyYW1lZFZpZGVvQ2FsbDohMH19LHM9dC5tZXJnZShpLG8uY2NwUGFyYW1zKTt0LmNvcmUuaW5pdENDUChuLHMpfShzLHUsYSk7Y2FzZSBuLkdVSURFUzpyZXR1cm4gdm9pZCAwIT09YS5jdXN0b21WaWV3c1BhcmFtcz8odC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLHMsdSksZnVuY3Rpb24oZSxyLGkpe2NvbnN0e2NvbnRhY3Q6cyxkaXNhYmxlQXV0b0Rlc3Ryb3k6YSxpZnJhbWVTdWZmaXg6Yyx0ZXJtaW5hdGVDdXN0b21WaWV3T3B0aW9uczp1PXt9fT1pLmN1c3RvbVZpZXdzUGFyYW1zO2xldCBsLHAse2NvbnRhY3RGbG93SWQ6ZH09aS5jdXN0b21WaWV3c1BhcmFtczt2b2lkIDAhPT1zJiYobD1vKHMpLGwmJiEwIT09YSYmInN0cmluZyIhPXR5cGVvZiBzJiZzLm9uRGVzdHJveSgobj0+e3QuY29yZS50ZXJtaW5hdGVDdXN0b21WaWV3KGUsYyx7dGltZW91dDp1LnRpbWVvdXR8fDVlMyxoaWRlSWZyYW1lOnZvaWQgMD09PXUuaGlkZUlmcmFtZXx8dS5oaWRlSWZyYW1lLHJlc29sdmVJZnJhbWU6dm9pZCAwPT09dS5yZXNvbHZlSWZyYW1lfHx1LnJlc29sdmVJZnJhbWV9KX0pKSxkfHxjb25zb2xlLndhcm4oIltDdXN0b21WaWV3c106IE5lZWQgdG8gcHJvdmlkZSBhIGNvbnRhY3RGbG93SWQgd2hlbiBkZWZpbmluZyBjb250YWN0IHBhcmFtZXRlciBmb3IgaW5pdGFsaXppbmcgY3VzdG9tdmlld3MgYXBwbGljYXRpb24iKSkscD1jP2Ake24uR1VJREVTfSR7Y31gOmAke24uR1VJREVTfWA7Y29uc3QgaD1gaWZyYW1lW2lkPScke3B9J11gLGY9cj8ucXVlcnlTZWxlY3RvcihoKXx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCl8fHdpbmRvdy50b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCk7aWYoIWYpdGhyb3cgbmV3IEVycm9yKCJbQ3VzdG9tVmlld3NdOiBObyBpZnJhbWUgZm91bmQgZm9yIHRoZSBhcHA6ICIscCk7e2NvbnN0IHQ9QVdTLnV0aWwudXVpZC52NCgpO2w/Zi5zcmM9YCR7ZX0/Y29udGFjdEZsb3dJZD0ke2R9JmN1cnJlbnRDb250YWN0SWQ9JHtsfSZhZ2VudEFwcFRhYklkPSR7dH0tdGFiYDpkJiYoZi5zcmM9YCR7ZX0/Y29udGFjdEZsb3dJZD0ke2R9JmFnZW50QXBwVGFiSWQ9JHt0fS10YWJgKX19KHMsdSxhKSk6dC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLHMsdSk7ZGVmYXVsdDpyZXR1cm4gdC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLHMsdSl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2Ugbi5DQ1A6cmV0dXJuIGk9cihzKSsiL2xvZ291dCIsdC5mZXRjaChpLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLlRFUk1JTkFURSksITB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldExvZygpLmVycm9yKCJBbiBlcnJvciBvY2N1cmVkIG9uIGxvZ291dC4iK2UpLndpdGhFeGNlcHRpb24oZSksd2luZG93LmxvY2F0aW9uLmhyZWY9aSwhMX0pKTtjYXNlIG4uR1VJREVTOnJldHVybiB2b2lkIDAhPT1hLmN1c3RvbVZpZXdzUGFyYW1zPyhvPWMsdm9pZCB0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LmRlbGV0ZShvKSk6bnVsbDtkZWZhdWx0OnJldHVybiBudWxsfXZhciBvLGl9fX0pKX0sdC5hZ2VudEFwcC5zdG9wQXBwPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnN0b3AoZSl9fSgpfSw1MDA6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dDt2YXIgbixyPSJjY3AiO2UuY29ubmVjdC5hZ2VudEFwcC5BcHBSZWdpc3RyeT0obj17fSx7cmVnaXN0ZXI6ZnVuY3Rpb24oZSx0LHIpe25bZV09e2NvbnRhaW5lckRPTTpyLGVuZHBvaW50OnQuZW5kcG9pbnQsc3R5bGU6dC5zdHlsZSxpbnN0YW5jZTp2b2lkIDAsb25Mb2FkOnQub25Mb2FkfX0sc3RhcnQ6ZnVuY3Rpb24oZSx0KXtpZihuW2VdKXt2YXIgbz1uW2VdLmNvbnRhaW5lckRPTSxpPW5bZV0uZW5kcG9pbnQscz1uW2VdLnN0eWxlLGE9bltlXS5vbkxvYWQ7aWYoZSE9PXIpe3ZhciBjPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3JldHVybiBvLnNyYz10LG8uc3R5bGU9bnx8IndpZHRoOiAxMDAlOyBoZWlnaHQ6MTAwJTsiLG8uaWQ9ZSxvWyJhcmlhLWxhYmVsIl09ZSxvLm9ubG9hZD1yLG8uYWxsb3c9ImNsaXBib2FyZC1yZWFkOyBjbGlwYm9hcmQtd3JpdGUiLG8uc2V0QXR0cmlidXRlKCJzYW5kYm94IiwiYWxsb3ctZm9ybXMgYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCBhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1zY3JpcHRzIiksb30oZSxpLHMsYSk7by5hcHBlbmRDaGlsZChjKX1yZXR1cm4gbltlXS5pbnN0YW5jZT10KG5bZV0pLG5bZV0uaW5zdGFuY2UuaW5pdCgpfX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfSxkZWxldGU6ZnVuY3Rpb24oZSl7ZGVsZXRlIG5bZV19LHN0b3A6ZnVuY3Rpb24oZSl7aWYobltlXSl7dmFyIHQscj1uW2VdLG89ci5jb250YWluZXJET00ucXVlcnlTZWxlY3RvcigiaWZyYW1lIik7aWYoZS5pbmNsdWRlcygiY3VzdG9tdmlld3MiKSl7Y29uc3QgdD1gaWZyYW1lW2lkPScke2V9J11gO289ci5jb250YWluZXJET00ucXVlcnlTZWxlY3Rvcih0KX1yZXR1cm4gci5jb250YWluZXJET00ucmVtb3ZlQ2hpbGQobyksci5pbnN0YW5jZSYmKHQ9ci5pbnN0YW5jZS5kZXN0cm95KCksZGVsZXRlIHIuaW5zdGFuY2UpLHR9fX0pfSgpfSw5NjU6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LkFnZW50U3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0Iiwicm91dGFibGUiLCJub3Rfcm91dGFibGUiLCJvZmZsaW5lIl0pLHQuQWdlbnRTdGF0dXNUeXBlPXQuQWdlbnRTdGF0ZVR5cGUsdC5BZ2VudEF2YWlsU3RhdGVzPXQubWFrZUVudW0oWyJJbml0IiwiQnVzeSIsIkFmdGVyQ2FsbFdvcmsiLCJDYWxsaW5nQ3VzdG9tZXIiLCJEaWFsaW5nIiwiSm9pbmluZyIsIlBlbmRpbmdBdmFpbGFibGUiLCJQZW5kaW5nQnVzeSJdKSx0LkFnZW50RXJyb3JTdGF0ZXM9dC5tYWtlRW51bShbIkVycm9yIiwiQWdlbnRIdW5nVXAiLCJCYWRBZGRyZXNzQWdlbnQiLCJCYWRBZGRyZXNzQ3VzdG9tZXIiLCJEZWZhdWx0IiwiRmFpbGVkQ29ubmVjdEFnZW50IiwiRmFpbGVkQ29ubmVjdEN1c3RvbWVyIiwiSW52YWxpZExvY2FsZSIsIkxpbmVFbmdhZ2VkQWdlbnQiLCJMaW5lRW5nYWdlZEN1c3RvbWVyIiwiTWlzc2VkQ2FsbEFnZW50IiwiTWlzc2VkQ2FsbEN1c3RvbWVyIiwiTXVsdGlwbGVDY3BXaW5kb3dzIiwiUmVhbHRpbWVDb21tdW5pY2F0aW9uRXJyb3IiXSksdC5FbmRwb2ludFR5cGU9dC5tYWtlRW51bShbInBob25lX251bWJlciIsImFnZW50IiwicXVldWUiXSksdC5BZGRyZXNzVHlwZT10LkVuZHBvaW50VHlwZSx0LkNvbm5lY3Rpb25UeXBlPXQubWFrZUVudW0oWyJhZ2VudCIsImluYm91bmQiLCJvdXRib3VuZCIsIm1vbml0b3JpbmciXSksdC5Db25uZWN0aW9uU3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0IiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsImhvbGQiLCJkaXNjb25uZWN0ZWQiLCJzaWxlbnRfbW9uaXRvciIsImJhcmdlIl0pLHQuQ29ubmVjdGlvblN0YXR1c1R5cGU9dC5Db25uZWN0aW9uU3RhdGVUeXBlLHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTPXQuc2V0KFt0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVEVELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5IT0xELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5TSUxFTlRfTU9OSVRPUix0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQkFSR0VdKSx0LkNPTk5FQ1RJT05fQ09OTkVDVEVEX1NUQVRFUz10LnNldChbdC5Db25uZWN0aW9uU3RhdGVUeXBlLkNPTk5FQ1RFRCx0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuU0lMRU5UX01PTklUT1IsdC5Db25uZWN0aW9uU3RhdGVUeXBlLkJBUkdFXSksdC5Db250YWN0U3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0IiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsIm1pc3NlZCIsImVycm9yIiwiZW5kZWQiLCJyZWplY3RlZCIsInBhdXNlZCJdKSx0LkNvbnRhY3RTdGF0dXNUeXBlPXQuQ29udGFjdFN0YXRlVHlwZSx0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUz10Lm1ha2VFbnVtKFsicGF1c2VkIiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCJdKSx0LkNvbnRhY3RUeXBlPXQubWFrZUVudW0oWyJ2b2ljZSIsInF1ZXVlX2NhbGxiYWNrIiwiY2hhdCIsInRhc2siXSksdC5Db250YWN0SW5pdGlhdGlvbk1ldGhvZD10Lm1ha2VFbnVtKFsiaW5ib3VuZCIsIm91dGJvdW5kIiwidHJhbnNmZXIiLCJxdWV1ZV90cmFuc2ZlciIsImNhbGxiYWNrIiwiYXBpIiwiZGlzY29ubmVjdCIsIndlYnJ0Y19hcGkiXSksdC5Nb25pdG9yaW5nTW9kZT10Lm1ha2VFbnVtKFsiU0lMRU5UX01PTklUT1IiLCJCQVJHRSJdKSx0Lk1vbml0b3JpbmdFcnJvclR5cGVzPXQubWFrZUVudW0oWyJpbnZhbGlkX3RhcmdldF9zdGF0ZSJdKSx0LkNoYW5uZWxUeXBlPXQubWFrZUVudW0oWyJWT0lDRSIsIkNIQVQiLCJUQVNLIl0pLHQuTWVkaWFUeXBlPXQubWFrZUVudW0oWyJzb2Z0cGhvbmUiLCJjaGF0IiwidGFzayJdKSx0LlNvZnRwaG9uZUNhbGxUeXBlPXQubWFrZUVudW0oWyJhdWRpb192aWRlbyIsInZpZGVvX29ubHkiLCJhdWRpb19vbmx5Iiwibm9uZSJdKSx0LlNvZnRwaG9uZUVycm9yVHlwZXM9dC5tYWtlRW51bShbInVuc3VwcG9ydGVkX2Jyb3dzZXIiLCJtaWNyb3Bob25lX25vdF9zaGFyZWQiLCJzaWduYWxsaW5nX2hhbmRzaGFrZV9mYWlsdXJlIiwic2lnbmFsbGluZ19jb25uZWN0aW9uX2ZhaWx1cmUiLCJpY2VfY29sbGVjdGlvbl90aW1lb3V0IiwidXNlcl9idXN5X2Vycm9yIiwid2VicnRjX2Vycm9yIiwicmVhbHRpbWVfY29tbXVuaWNhdGlvbl9lcnJvciIsInZkaV9zdHJhdGVneV9ub3Rfc3VwcG9ydGVkIiwidmRpX3JlZGlyX25vdF9zdXBwb3J0ZWQiLCJvdGhlciJdKSx0LkNsaWNrVHlwZT10Lm1ha2VFbnVtKFsiQWNjZXB0IiwiUmVqZWN0IiwiSGFuZ3VwIl0pLHQuVm9pY2VJZEVycm9yVHlwZXM9dC5tYWtlRW51bShbIm5vX3NwZWFrZXJfaWRfZm91bmQiLCJzcGVha2VyX2lkX25vdF9lbnJvbGxlZCIsImdldF9zcGVha2VyX2lkX2ZhaWxlZCIsImdldF9zcGVha2VyX3N0YXR1c19mYWlsZWQiLCJvcHRfb3V0X3NwZWFrZXJfZmFpbGVkIiwib3B0X291dF9zcGVha2VyX2luX2xjbXNfZmFpbGVkIiwiZGVsZXRlX3NwZWFrZXJfZmFpbGVkIiwic3RhcnRfc2Vzc2lvbl9mYWlsZWQiLCJldmFsdWF0ZV9zcGVha2VyX2ZhaWxlZCIsInNlc3Npb25fbm90X2V4aXN0cyIsImRlc2NyaWJlX3Nlc3Npb25fZmFpbGVkIiwiZW5yb2xsX3NwZWFrZXJfZmFpbGVkIiwidXBkYXRlX3NwZWFrZXJfaWRfZmFpbGVkIiwidXBkYXRlX3NwZWFrZXJfaWRfaW5fbGNtc19mYWlsZWQiLCJub3Rfc3VwcG9ydGVkX29uX2NvbmZlcmVuY2VfY2FsbHMiLCJlbnJvbGxfc3BlYWtlcl90aW1lb3V0IiwiZXZhbHVhdGVfc3BlYWtlcl90aW1lb3V0IiwiZ2V0X2RvbWFpbl9pZF9mYWlsZWQiLCJub19kb21haW5faWRfZm91bmQiXSksdC5DVElFeGNlcHRpb25zPXQubWFrZUVudW0oWyJBY2Nlc3NEZW5pZWRFeGNlcHRpb24iLCJJbnZhbGlkU3RhdGVFeGNlcHRpb24iLCJCYWRFbmRwb2ludEV4Y2VwdGlvbiIsIkludmFsaWRBZ2VudEFSTkV4Y2VwdGlvbiIsIkludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIiwiSW52YWxpZENvbnRhY3RUeXBlRXhjZXB0aW9uIiwiUGFnaW5hdGlvbkV4Y2VwdGlvbiIsIlJlZnJlc2hUb2tlbkV4cGlyZWRFeGNlcHRpb24iLCJTZW5kRGF0YUZhaWxlZEV4Y2VwdGlvbiIsIlVuYXV0aG9yaXplZEV4Y2VwdGlvbiIsIlF1b3RhRXhjZWVkZWRFeGNlcHRpb24iXSksdC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzPXQubWFrZUVudW0oWyJPTkdPSU5HIiwiRU5ERUQiLCJQRU5ESU5HX0NPTkZJR1VSQVRJT04iXSksdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiQUNDRVBUIiwiUkVKRUNUIiwiTk9UX0VOT1VHSF9TUEVFQ0giLCJTUEVBS0VSX05PVF9FTlJPTExFRCIsIlNQRUFLRVJfT1BURURfT1VUIiwiU1BFQUtFUl9JRF9OT1RfUFJPVklERUQiLCJTUEVBS0VSX0VYUElSRUQiXSksdC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiTk9UX0VOT1VHSF9TUEVFQ0giLCJISUdIX1JJU0siLCJMT1dfUklTSyJdKSx0LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiQXV0aGVudGljYXRlZCIsIk5vdEF1dGhlbnRpY2F0ZWQiLCJJbmNvbmNsdXNpdmUiLCJOb3RFbnJvbGxlZCIsIk9wdGVkT3V0IiwiTm90RW5hYmxlZCIsIkVycm9yIl0pLHQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJIaWdoUmlzayIsIkxvd1Jpc2siLCJJbmNvbmNsdXNpdmUiLCJOb3RFbmFibGVkIiwiRXJyb3IiXSksdC5WaWRlb0NhcGFiaWxpdHk9dC5tYWtlRW51bShbIlNFTkQiXSksdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXM9dC5tYWtlRW51bShbIk5PVF9FTk9VR0hfU1BFRUNIIiwiSU5fUFJPR1JFU1MiLCJDT01QTEVURUQiLCJGQUlMRUQiXSksdC5Wb2ljZUlkU3BlYWtlclN0YXR1cz10Lm1ha2VFbnVtKFsiT1BURURfT1VUIiwiRU5ST0xMRUQiLCJQRU5ESU5HIl0pLHQuVm9pY2VJZENvbnN0YW50cz17RVZBTFVBVEVfU0VTU0lPTl9ERUxBWToxZTQsRVZBTFVBVElPTl9NQVhfUE9MTF9USU1FUzoyNCxFVkFMVUFUSU9OX1BPTExJTkdfSU5URVJWQUw6NWUzLEVOUk9MTE1FTlRfTUFYX1BPTExfVElNRVM6MTIwLEVOUk9MTE1FTlRfUE9MTElOR19JTlRFUlZBTDo1ZTMsU1RBUlRfU0VTU0lPTl9ERUxBWTo4ZTN9LHQuQWdlbnRQZXJtaXNzaW9ucz17T1VUQk9VTkRfQ0FMTDoib3V0Ym91bmRDYWxsIixWT0lDRV9JRDoidm9pY2VJZCJ9O3ZhciBuPWZ1bmN0aW9uKCl7aWYoIXQuYWdlbnQuaW5pdGlhbGl6ZWQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGFnZW50IGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQhIil9O24ucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpfSxuLnByb3RvdHlwZS5fY3JlYXRlQ29udGFjdEFQST1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCl9LG4ucHJvdG90eXBlLm9uUmVmcmVzaD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5SRUZSRVNILGUpfSxuLnByb3RvdHlwZS5vblJvdXRhYmxlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlJPVVRBQkxFLGUpfSxuLnByb3RvdHlwZS5vbk5vdFJvdXRhYmxlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLk5PVF9ST1VUQUJMRSxlKX0sbi5wcm90b3R5cGUub25PZmZsaW5lPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLk9GRkxJTkUsZSl9LG4ucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuRVJST1IsZSl9LG4ucHJvdG90eXBlLm9uU29mdHBob25lRXJyb3I9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuU09GVFBIT05FX0VSUk9SLGUpfSxuLnByb3RvdHlwZS5vbldlYlNvY2tldENvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0xPU1QsZSl9LG4ucHJvdG90eXBlLm9uV2ViU29ja2V0Q29ubmVjdGlvbkdhaW5lZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9HQUlORUQsZSl9LG4ucHJvdG90eXBlLm9uQWZ0ZXJDYWxsV29yaz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5BQ1csZSl9LG4ucHJvdG90eXBlLm9uU3RhdGVDaGFuZ2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuU1RBVEVfQ0hBTkdFLGUpfSxuLnByb3RvdHlwZS5vbk11dGVUb2dnbGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkFnZW50RXZlbnRzLk1VVEVfVE9HR0xFLGUpfSxuLnByb3RvdHlwZS5vbkxvY2FsTWVkaWFTdHJlYW1DcmVhdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5BZ2VudEV2ZW50cy5MT0NBTF9NRURJQV9TVFJFQU1fQ1JFQVRFRCxlKX0sbi5wcm90b3R5cGUub25TcGVha2VyRGV2aWNlQ2hhbmdlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TUEVBS0VSX0RFVklDRV9DSEFOR0VELGUpfSxuLnByb3RvdHlwZS5vbk1pY3JvcGhvbmVEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLk1JQ1JPUEhPTkVfREVWSUNFX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm9uUmluZ2VyRGV2aWNlQ2hhbmdlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5SSU5HRVJfREVWSUNFX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm9uQ2FtZXJhRGV2aWNlQ2hhbmdlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5DQU1FUkFfREVWSUNFX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm9uQmFja2dyb3VuZEJsdXJDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLkJBQ0tHUk9VTkRfQkxVUl9DSEFOR0VELGUpfSxuLnByb3RvdHlwZS5tdXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuTVVURSxkYXRhOnttdXRlOiEwfX0pfSxuLnByb3RvdHlwZS51bm11dGU9ZnVuY3Rpb24oKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFLGRhdGE6e211dGU6ITF9fSl9LG4ucHJvdG90eXBlLnNldFNwZWFrZXJEZXZpY2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9TUEVBS0VSX0RFVklDRSxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5zZXRNaWNyb3Bob25lRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfTUlDUk9QSE9ORV9ERVZJQ0UsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0sbi5wcm90b3R5cGUuc2V0UmluZ2VyRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfUklOR0VSX0RFVklDRSxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5zZXRDYW1lcmFEZXZpY2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLkNBTUVSQV9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5zZXRCYWNrZ3JvdW5kQmx1cj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuQkFDS0dST1VORF9CTFVSX0NIQU5HRUQsZGF0YTp7aXNCYWNrZ3JvdW5kQmx1ckVuYWJsZWQ6ZX19KX0sbi5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LnN0YXRlfSxuLnByb3RvdHlwZS5nZXROZXh0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90Lm5leHRTdGF0ZX0sbi5wcm90b3R5cGUuZ2V0QXZhaWxhYmlsaXR5U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LmFnZW50QXZhaWxhYmlsaXR5U3RhdGV9LG4ucHJvdG90eXBlLmdldFN0YXR1cz1uLnByb3RvdHlwZS5nZXRTdGF0ZSxuLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQubm93KCktdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LnN0YXRlLnN0YXJ0VGltZXN0YW1wLmdldFRpbWUoKSt0LmNvcmUuZ2V0U2tldygpfSxuLnByb3RvdHlwZS5nZXRTdGF0dXNEdXJhdGlvbj1uLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uLG4ucHJvdG90eXBlLmdldFBlcm1pc3Npb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnBlcm1pc3Npb25zfSxuLnByb3RvdHlwZS5nZXRDb250YWN0cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3QuY29udGFjdHMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdC5fY3JlYXRlQ29udGFjdEFQSShlKX0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiFlfHx0LmdldFR5cGUoKT09PWV9KSl9LG4ucHJvdG90eXBlLmdldENvbmZpZ3VyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbmZpZ3VyYXRpb259LG4ucHJvdG90eXBlLmdldEFnZW50U3RhdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmFnZW50U3RhdGVzfSxuLnByb3RvdHlwZS5nZXRSb3V0aW5nUHJvZmlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5yb3V0aW5nUHJvZmlsZX0sbi5wcm90b3R5cGUuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuZ2V0Um91dGluZ1Byb2ZpbGUoKS5jaGFubmVsQ29uY3VycmVuY3lNYXA7cmV0dXJuIG58fChuPU9iamVjdC5rZXlzKHQuQ2hhbm5lbFR5cGUpLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4iVEFTSyIhPT1uJiYoZVt0LkNoYW5uZWxUeXBlW25dXT0xKSxlfSkse30pKSxlP25bZV18fDA6bn0sbi5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5uYW1lfSxuLnByb3RvdHlwZS5nZXRBZ2VudEFSTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5hZ2VudEFSTn0sbi5wcm90b3R5cGUuZ2V0RXh0ZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmV4dGVuc2lvbn0sbi5wcm90b3R5cGUuZ2V0RGlhbGFibGVDb3VudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZGlhbGFibGVDb3VudHJpZXN9LG4ucHJvdG90eXBlLmlzU29mdHBob25lRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zb2Z0cGhvbmVFbmFibGVkfSxuLnByb3RvdHlwZS5zZXRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpO2UmJmUuYWdlbnRQcmVmZXJlbmNlcyYmZS5hZ2VudFByZWZlcmVuY2VzLkxBTkdVQUdFJiYhZS5hZ2VudFByZWZlcmVuY2VzLmxvY2FsZSYmKGUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGU9ZS5hZ2VudFByZWZlcmVuY2VzLkxBTkdVQUdFKSxlJiZlLmFnZW50UHJlZmVyZW5jZXMmJiF0LmlzVmFsaWRMb2NhbGUoZS5hZ2VudFByZWZlcmVuY2VzLmxvY2FsZSk/biYmbi5mYWlsdXJlJiZuLmZhaWx1cmUodC5BZ2VudEVycm9yU3RhdGVzLklOVkFMSURfTE9DQUxFKTpyLmNhbGwodC5DbGllbnRNZXRob2RzLlVQREFURV9BR0VOVF9DT05GSUdVUkFUSU9OLHtjb25maWd1cmF0aW9uOnQuYXNzZXJ0Tm90TnVsbChlLCJjb25maWd1cmF0aW9uIil9LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5SRUxPQURfQUdFTlRfQ09ORklHVVJBVElPTiksbi5zdWNjZXNzJiZuLnN1Y2Nlc3MoZSl9LGZhaWx1cmU6biYmbi5mYWlsdXJlfSl9LG4ucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGUsbixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUFVUX0FHRU5UX1NUQVRFLHtzdGF0ZTp0LmFzc2VydE5vdE51bGwoZSwic3RhdGUiKSxlbnF1ZXVlTmV4dFN0YXRlOnImJiEhci5lbnF1ZXVlTmV4dFN0YXRlfSxuKX0sbi5wcm90b3R5cGUub25FbnF1ZXVlZE5leHRTdGF0ZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5FTlFVRVVFRF9ORVhUX1NUQVRFLGUpfSxuLnByb3RvdHlwZS5zZXRTdGF0dXM9bi5wcm90b3R5cGUuc2V0U3RhdGUsbi5wcm90b3R5cGUuY29ubmVjdD1mdW5jdGlvbihlLG4pe3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPW5ldyB0LkVuZHBvaW50KGUpO2RlbGV0ZSBvLmVuZHBvaW50SWQ7dmFyIGk9e2VuZHBvaW50OnQuYXNzZXJ0Tm90TnVsbChvLCJlbmRwb2ludCIpLHF1ZXVlQVJOOm4mJihuLnF1ZXVlQVJOfHxuLnF1ZXVlSWQpfHx0aGlzLmdldFJvdXRpbmdQcm9maWxlKCkuZGVmYXVsdE91dGJvdW5kUXVldWUucXVldWVBUk59O24mJm4ucmVsYXRlZENvbnRhY3RJZCYmbnVsbCE9PW4ucmVsYXRlZENvbnRhY3RJZCYmKGkucmVsYXRlZENvbnRhY3RJZD1uLnJlbGF0ZWRDb250YWN0SWQsbi5wcmV2aW91c0NvbnRhY3RJZCYmZGVsZXRlIGkucHJldmlvdXNDb250YWN0SWQpLHIuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX09VVEJPVU5EX0NPTlRBQ1QsaSxuJiZ7c3VjY2VzczpuLnN1Y2Nlc3MsZmFpbHVyZTpuLmZhaWx1cmV9KX0sbi5wcm90b3R5cGUuZ2V0QWxsUXVldWVBUk5zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnJvdXRpbmdQcm9maWxlLnF1ZXVlcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnF1ZXVlQVJOfSkpfSxuLnByb3RvdHlwZS5nZXRFbmRwb2ludHM9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT10LmNvcmUuZ2V0Q2xpZW50KCk7dC5hc3NlcnROb3ROdWxsKG4sImNhbGxiYWNrcyIpLHQuYXNzZXJ0Tm90TnVsbChuLnN1Y2Nlc3MsImNhbGxiYWNrcy5zdWNjZXNzIik7dmFyIHM9cnx8e307cy5lbmRwb2ludHM9cy5lbmRwb2ludHN8fFtdLHMubWF4UmVzdWx0cz1zLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHQuaXNBcnJheShlKXx8KGU9W2VdKSxpLmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9FTkRQT0lOVFMse3F1ZXVlQVJOczplLG5leHRUb2tlbjpzLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOnMubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24ocil7aWYoci5uZXh0VG9rZW4pby5nZXRFbmRwb2ludHMoZSxuLHtuZXh0VG9rZW46ci5uZXh0VG9rZW4sbWF4UmVzdWx0czpzLm1heFJlc3VsdHMsZW5kcG9pbnRzOnMuZW5kcG9pbnRzLmNvbmNhdChyLmVuZHBvaW50cyl9KTtlbHNle3MuZW5kcG9pbnRzPXMuZW5kcG9pbnRzLmNvbmNhdChyLmVuZHBvaW50cyk7dmFyIGk9cy5lbmRwb2ludHMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuRW5kcG9pbnQoZSl9KSk7bi5zdWNjZXNzKHtlbmRwb2ludHM6aSxhZGRyZXNzZXM6aX0pfX0sZmFpbHVyZTpuLmZhaWx1cmV9KX0sbi5wcm90b3R5cGUuZ2V0QWRkcmVzc2VzPW4ucHJvdG90eXBlLmdldEVuZHBvaW50cyxuLnByb3RvdHlwZS5fZ2V0UmVzb3VyY2VJZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QWxsUXVldWVBUk5zKCk7Zm9yKGxldCB0IG9mIGUpe2NvbnN0IGU9dC5tYXRjaCgvXC9hZ2VudFwvKFteL10rKS8pO2lmKGUpcmV0dXJuIGVbMV19cmV0dXJuIG5ldyBFcnJvcigiQWdlbnQucHJvdG90eXBlLl9nZXRSZXNvdXJjZUlkOiBxdWV1ZUFybnMgZGlkIG5vdCBjb250YWluIGFnZW50UmVzb3VyY2VJZDogIixlKX0sbi5wcm90b3R5cGUudG9TbmFwc2hvdD1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5BZ2VudFNuYXBzaG90KHRoaXMuX2dldERhdGEoKSl9O3ZhciByPWZ1bmN0aW9uKGUpe3QuQWdlbnQuY2FsbCh0aGlzKSx0aGlzLmFnZW50RGF0YT1lfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZ2VudERhdGF9LHIucHJvdG90eXBlLl9jcmVhdGVDb250YWN0QVBJPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5Db250YWN0U25hcHNob3QoZSl9O3ZhciBvPWZ1bmN0aW9uKGUpe3RoaXMuY29udGFjdElkPWV9O28ucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuZ2V0Q29udGFjdElkKCkpfSxvLnByb3RvdHlwZS5fY3JlYXRlQ29ubmVjdGlvbkFQST1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLkNIQVQ/bmV3IHQuQ2hhdENvbm5lY3Rpb24odGhpcy5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpOnRoaXMuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5UQVNLP25ldyB0LlRhc2tDb25uZWN0aW9uKHRoaXMuY29udGFjdElkLGUuY29ubmVjdGlvbklkKTpuZXcgdC5Wb2ljZUNvbm5lY3Rpb24odGhpcy5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpfSxvLnByb3RvdHlwZS5nZXRFdmVudE5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKGUsdGhpcy5nZXRDb250YWN0SWQoKSl9LG8ucHJvdG90eXBlLm9uUmVmcmVzaD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLlJFRlJFU0gpLGUpfSxvLnByb3RvdHlwZS5vbkluY29taW5nPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuSU5DT01JTkcpLGUpfSxvLnByb3RvdHlwZS5vbkNvbm5lY3Rpbmc9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5DT05ORUNUSU5HKSxlKX0sby5wcm90b3R5cGUub25QZW5kaW5nPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUEVORElORyksZSl9LG8ucHJvdG90eXBlLm9uQWNjZXB0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCksZSl9LG8ucHJvdG90eXBlLm9uTWlzc2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuTUlTU0VEKSxlKX0sby5wcm90b3R5cGUub25FbmRlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkVOREVEKSxlKX0sby5wcm90b3R5cGUub25EZXN0cm95PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVEKSxlKX0sby5wcm90b3R5cGUub25BQ1c9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ1cpLGUpfSxvLnByb3RvdHlwZS5vbkNvbm5lY3RlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkNPTk5FQ1RFRCksZSl9LG8ucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5FUlJPUiksZSl9LG8ucHJvdG90eXBlLmdldENvbnRhY3RJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhY3RJZH0sby5wcm90b3R5cGUuZ2V0T3JpZ2luYWxDb250YWN0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmluaXRpYWxDb250YWN0SWR9LG8ucHJvdG90eXBlLmdldEluaXRpYWxDb250YWN0SWQ9by5wcm90b3R5cGUuZ2V0T3JpZ2luYWxDb250YWN0SWQsby5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkudHlwZX0sby5wcm90b3R5cGUuZ2V0Q29udGFjdER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0RHVyYXRpb259LG8ucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zdGF0ZX0sby5wcm90b3R5cGUuZ2V0U3RhdHVzPW8ucHJvdG90eXBlLmdldFN0YXRlLG8ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5ub3coKS10aGlzLl9nZXREYXRhKCkuc3RhdGUudGltZXN0YW1wLmdldFRpbWUoKSt0LmNvcmUuZ2V0U2tldygpfSxvLnByb3RvdHlwZS5nZXRTdGF0dXNEdXJhdGlvbj1vLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uLG8ucHJvdG90eXBlLmdldFF1ZXVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5xdWV1ZX0sby5wcm90b3R5cGUuZ2V0UXVldWVUaW1lc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnF1ZXVlVGltZXN0YW1wfSxvLnByb3RvdHlwZS5nZXRDb25uZWN0aW9ucz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb25uZWN0aW9ucy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBlLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuQ0hBVD9uZXcgdC5DaGF0Q29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCk6ZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlRBU0s/bmV3IHQuVGFza0Nvbm5lY3Rpb24oZS5jb250YWN0SWQsbi5jb25uZWN0aW9uSWQpOm5ldyB0LlZvaWNlQ29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCl9KSl9LG8ucHJvdG90eXBlLmdldEluaXRpYWxDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzSW5pdGlhbENvbm5lY3Rpb24oKX0pKXx8bnVsbH0sby5wcm90b3R5cGUuZ2V0QWN0aXZlSW5pdGlhbENvbm5lY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEluaXRpYWxDb25uZWN0aW9uKCk7cmV0dXJuIG51bGwhPWUmJmUuaXNBY3RpdmUoKT9lOm51bGx9LG8ucHJvdG90eXBlLmdldFRoaXJkUGFydHlDb25uZWN0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hZS5pc0luaXRpYWxDb25uZWN0aW9uKCkmJmUuZ2V0VHlwZSgpIT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVH0pKX0sby5wcm90b3R5cGUuZ2V0U2luZ2xlQWN0aXZlVGhpcmRQYXJ0eUNvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaGlyZFBhcnR5Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KSlbMF18fG51bGx9LG8ucHJvdG90eXBlLmdldEFnZW50Q29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXt2YXIgbj1lLmdldFR5cGUoKTtyZXR1cm4gbj09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fG49PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9KSl9LG8ucHJvdG90eXBlLmdldEFjdGl2ZUNvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGU9PmUuaXNBY3RpdmUoKSkpfSxvLnByb3RvdHlwZS5oYXNUd29BY3RpdmVQYXJ0aWNpcGFudHM9ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXRoaXMuZ2V0QWN0aXZlQ29ubmVjdGlvbnMoKS5sZW5ndGh9LG8ucHJvdG90eXBlLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm5hbWV9LG8ucHJvdG90eXBlLmdldENvbnRhY3RNZXRhZGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29udGFjdE1ldGFkYXRhfSxvLnByb3RvdHlwZS5nZXREZXNjcmlwdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuZGVzY3JpcHRpb259LG8ucHJvdG90eXBlLmdldFJlZmVyZW5jZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnJlZmVyZW5jZXN9LG8ucHJvdG90eXBlLmdldEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmF0dHJpYnV0ZXN9LG8ucHJvdG90eXBlLmdldENvbnRhY3RGZWF0dXJlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29udGFjdEZlYXR1cmVzfSxvLnByb3RvdHlwZS5nZXRDaGFubmVsQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY2hhbm5lbENvbnRleHR9LG8ucHJvdG90eXBlLmdldFNlZ21lbnRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zZWdtZW50QXR0cmlidXRlc30sby5wcm90b3R5cGUuZ2V0Q29udGFjdFN1YnR5cGU9ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuZ2V0U2VnbWVudEF0dHJpYnV0ZXMoKTtyZXR1cm4gZSYmZVsiY29ubmVjdDpTdWJ0eXBlIl0/ZVsiY29ubmVjdDpTdWJ0eXBlIl0uVmFsdWVTdHJpbmc6bnVsbH0sby5wcm90b3R5cGUuaXNTb2Z0cGhvbmVDYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpfSkpfSxvLnByb3RvdHlwZS5oYXNWaWRlb1JUQ0NhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiBudWxsIT10LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jYW5TZW5kVmlkZW8mJmUuY2FuU2VuZFZpZGVvKCl9KSl9LG8ucHJvdG90eXBlLmNhbkFnZW50U2VuZFZpZGVvPWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLmdldEFnZW50Q29ubmVjdGlvbigpO3JldHVybiBlLmNhblNlbmRWaWRlbyYmZS5jYW5TZW5kVmlkZW8oKX0sby5wcm90b3R5cGUuY2FuQWdlbnRSZWNlaXZlVmlkZW89ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtpZihlLmNhblNlbmRWaWRlbyYmZS5jYW5TZW5kVmlkZW8oKSlyZXR1cm4hMDtjb25zdCB0PXRoaXMuZ2V0VGhpcmRQYXJ0eUNvbm5lY3Rpb25zKCk7cmV0dXJuIHQmJnQubGVuZ3RoPjAmJnRoaXMuY2FuQWdlbnRTZW5kVmlkZW8oKX0sby5wcm90b3R5cGUuX2lzSW5ib3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuaW5pdGlhdGlvbk1ldGhvZCE9PXQuQ29udGFjdEluaXRpYXRpb25NZXRob2QuT1VUQk9VTkR9LG8ucHJvdG90eXBlLmlzSW5ib3VuZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtyZXR1cm4gZS5nZXRNZWRpYVR5cGUoKT09PXQuTWVkaWFUeXBlLlRBU0s/dGhpcy5faXNJbmJvdW5kKCk6ISFlJiZlLmdldFR5cGUoKT09PXQuQ29ubmVjdGlvblR5cGUuSU5CT1VORH0sby5wcm90b3R5cGUuaXNDb25uZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RFRH0sby5wcm90b3R5cGUuYWNjZXB0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKSxyPXRoaXMsbz10aGlzLmdldENvbnRhY3RJZCgpO3QucHVibGlzaENsaWNrU3RyZWFtRGF0YSh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2xpY2tUeXBlOnQuQ2xpY2tUeXBlLkFDQ0VQVCxjbGlja1RpbWU6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpfSksbi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5BQ0NFUFRfQ09OVEFDVCx7Y29udGFjdElkOm99LHtzdWNjZXNzOmZ1bmN0aW9uKG4pe3ZhciBpPXQuY29yZS5nZXRVcHN0cmVhbSgpO2kuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db250YWN0RXZlbnRzLkFDQ0VQVEVELGRhdGE6bmV3IHQuQ29udGFjdChvKX0pLGkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVELHIuZ2V0Q29udGFjdElkKCkpLGRhdGE6bmV3IHQuQ29udGFjdChvKX0pO3ZhciBzPW5ldyB0LkNvbnRhY3Qobyk7dC5pc0ZpcmVmb3hCcm93c2VyKCkmJnMuaXNTb2Z0cGhvbmVDYWxsKCkmJnQuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50KCksZSYmZS5zdWNjZXNzJiZlLnN1Y2Nlc3Mobil9LGZhaWx1cmU6ZnVuY3Rpb24obixyKXt0LmdldExvZygpLmVycm9yKCJBY2NlcHQgQ29udGFjdCBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhFeGNlcHRpb24obikud2l0aE9iamVjdCh7ZGF0YTpyfSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJDb250YWN0QWNjZXB0RmFpbHVyZSIsZGF0YTp7Y291bnQ6MX19KSxlJiZlLmZhaWx1cmUmJmUuZmFpbHVyZSh0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IpfX0pfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dC5nZXRMb2coKS53YXJuKCJjb250YWN0LmRlc3Ryb3koKSBoYXMgYmVlbiBkZXByZWNhdGVkLiIpfSxvLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3QucHVibGlzaENsaWNrU3RyZWFtRGF0YSh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2xpY2tUeXBlOnQuQ2xpY2tUeXBlLlJFSkVDVCxjbGlja1RpbWU6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpfSksbi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5SRUpFQ1RfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5jb21wbGV0ZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ09NUExFVEVfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ0xFQVJfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5ub3RpZnlJc3N1ZT1mdW5jdGlvbihlLG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLk5PVElGWV9DT05UQUNUX0lTU1VFLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxpc3N1ZUNvZGU6ZSxkZXNjcmlwdGlvbjpufSxyKX0sby5wcm90b3R5cGUuYWRkQ29ubmVjdGlvbj1mdW5jdGlvbihlLG4pe3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPW5ldyB0LkVuZHBvaW50KGUpO2RlbGV0ZSBvLmVuZHBvaW50SWQsci5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfQURESVRJT05BTF9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxlbmRwb2ludDpvfSxuKX0sby5wcm90b3R5cGUudG9nZ2xlQWN0aXZlQ29ubmVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldENsaWVudCgpLHI9bnVsbCxvPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuSE9MRH0pKTtpZihudWxsIT1vKXI9by5nZXRDb25uZWN0aW9uSWQoKTtlbHNle3ZhciBpPXRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KSk7aS5sZW5ndGg+MCYmKHI9aVswXS5nZXRDb25uZWN0aW9uSWQoKSl9bi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5UT0dHTEVfQUNUSVZFX0NPTk5FQ1RJT05TLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6cn0sZSl9LG8ucHJvdG90eXBlLnNlbmRTb2Z0cGhvbmVNZXRyaWNzPWZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfTUVUUklDUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24sc29mdHBob25lU3RyZWFtU3RhdGlzdGljczpufSxyKSx0LnB1Ymxpc2hTb2Z0cGhvbmVTdGF0cyh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24sc3RhdHM6bn0pfSxvLnByb3RvdHlwZS5zZW5kU29mdHBob25lUmVwb3J0PWZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfUkVQT1JULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixyZXBvcnQ6bn0scil9LG8ucHJvdG90eXBlLmNvbmZlcmVuY2VDb25uZWN0aW9ucz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ09ORkVSRU5DRV9DT05ORUNUSU9OUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkNvbnRhY3RTbmFwc2hvdCh0aGlzLl9nZXREYXRhKCkpfSxvLnByb3RvdHlwZS5pc011bHRpUGFydHlDb25mZXJlbmNlRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q29udGFjdEZlYXR1cmVzKCk7cmV0dXJuISghZXx8IWUubXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkKX0sby5wcm90b3R5cGUudXBkYXRlTW9uaXRvclBhcnRpY2lwYW50U3RhdGU9ZnVuY3Rpb24oZSxuKXtlJiZPYmplY3QudmFsdWVzKHQuTW9uaXRvcmluZ01vZGUpLmluY2x1ZGVzKGUudG9VcHBlckNhc2UoKSk/dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlVQREFURV9NT05JVE9SX1BBUlRJQ0lQQU5UX1NUQVRFLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSx0YXJnZXRNb25pdG9yTW9kZTplLnRvVXBwZXJDYXNlKCl9LG4pOih0LmdldExvZygpLmVycm9yKGBJbnZhbGlkIHRhcmdldCBzdGF0ZSB3YXMgcHJvdmlkZWQ6ICR7ZX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4mJm4uZmFpbHVyZSYmbi5mYWlsdXJlKHQuTW9uaXRvcmluZ0Vycm9yVHlwZXMuSU5WQUxJRF9UQVJHRVRfU1RBVEUpKX0sby5wcm90b3R5cGUuaXNVbmRlclN1cGVydmlzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZT0+ZS5nZXRUeXBlKCkhPT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UKSk7cmV0dXJuIHZvaWQgMCE9PShlJiZlLmZpbmQoKGU9PmUuaXNCYXJnZSgpJiZlLmlzQWN0aXZlKCkpKSl9LG8ucHJvdG90eXBlLnNpbGVudE1vbml0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudXBkYXRlTW9uaXRvclBhcnRpY2lwYW50U3RhdGUodC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUixlKX0sby5wcm90b3R5cGUuYmFyZ2VJbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy51cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZSh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFLGUpfSxvLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUEFVU0VfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlJFU1VNRV9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9O3ZhciBpPWZ1bmN0aW9uKGUpe3QuQ29udGFjdC5jYWxsKHRoaXMsZS5jb250YWN0SWQpLHRoaXMuY29udGFjdERhdGE9ZX07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFjdERhdGF9LGkucHJvdG90eXBlLl9jcmVhdGVDb25uZWN0aW9uQVBJPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5Db25uZWN0aW9uU25hcHNob3QoZSl9O3ZhciBzPWZ1bmN0aW9uKGUsdCl7dGhpcy5jb250YWN0SWQ9ZSx0aGlzLmNvbm5lY3Rpb25JZD10LHRoaXMuX2luaXRNZWRpYUNvbnRyb2xsZXIoKX07cy5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29ubmVjdGlvbkRhdGEodGhpcy5nZXRDb250YWN0SWQoKSx0aGlzLmdldENvbm5lY3Rpb25JZCgpKX0scy5wcm90b3R5cGUuZ2V0Q29udGFjdElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFjdElkfSxzLnByb3RvdHlwZS5nZXRDb25uZWN0aW9uSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25uZWN0aW9uSWR9LHMucHJvdG90eXBlLmdldEVuZHBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkVuZHBvaW50KHRoaXMuX2dldERhdGEoKS5lbmRwb2ludCl9LHMucHJvdG90eXBlLmdldEFkZHJlc3M9cy5wcm90b3R5cGUuZ2V0RW5kcG9pbnQscy5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnN0YXRlfSxzLnByb3RvdHlwZS5nZXRTdGF0dXM9cy5wcm90b3R5cGUuZ2V0U3RhdGUscy5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0Lm5vdygpLXRoaXMuX2dldERhdGEoKS5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpK3QuY29yZS5nZXRTa2V3KCl9LHMucHJvdG90eXBlLmdldFN0YXR1c0R1cmF0aW9uPXMucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb24scy5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkudHlwZX0scy5wcm90b3R5cGUuaXNJbml0aWFsQ29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuaW5pdGlhbH0scy5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb250YWlucyh0LkNPTk5FQ1RJT05fQUNUSVZFX1NUQVRFUyx0aGlzLmdldFN0YXR1cygpLnR5cGUpfSxzLnByb3RvdHlwZS5pc0Nvbm5lY3RlZD1mdW5jdGlvbigpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9DT05ORUNURURfU1RBVEVTLHRoaXMuZ2V0U3RhdHVzKCkudHlwZSl9LHMucHJvdG90eXBlLmlzQ29ubmVjdGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVElOR30scy5wcm90b3R5cGUuaXNPbkhvbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTdGF0dXMoKS50eXBlPT09dC5Db25uZWN0aW9uU3RhdGVUeXBlLkhPTER9LHMucHJvdG90eXBlLmdldFNvZnRwaG9uZU1lZGlhSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc29mdHBob25lTWVkaWFJbmZvfSxzLnByb3RvdHlwZS5nZXRNb25pdG9ySW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvcmluZ0luZm99LHMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oZSl7dC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjbGlja1R5cGU6dC5DbGlja1R5cGUuSEFOR1VQLGNsaWNrVGltZToobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9KSx0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuREVTVFJPWV9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LHMucHJvdG90eXBlLnNlbmREaWdpdHM9ZnVuY3Rpb24oZSxuKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9ESUdJVFMse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpLGRpZ2l0czplfSxuKX0scy5wcm90b3R5cGUuaG9sZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuSE9MRF9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LHMucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUkVTVU1FX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0scy5wcm90b3R5cGUudG9TbmFwc2hvdD1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5Db25uZWN0aW9uU25hcHNob3QodGhpcy5fZ2V0RGF0YSgpKX0scy5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt0aGlzLmdldE1lZGlhSW5mbygpJiZ0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9LHMucHJvdG90eXBlLl9pc0FnZW50Q29ubmVjdGlvblR5cGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFR5cGUoKTtyZXR1cm4gZT09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fGU9PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9LHMucHJvdG90eXBlLl9pc0FnZW50Q29ubmVjdGlvblR5cGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFR5cGUoKTtyZXR1cm4gZT09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fGU9PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9O3ZhciBhPWZ1bmN0aW9uKGUpe3RoaXMuY29udGFjdElkPWV9O2EucHJvdG90eXBlLmdldFNwZWFrZXJJZD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtjb25zdCBpPXtjb250YWN0SWQ6ZS5jb250YWN0SWQsaW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksYXdzQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpfTt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJJZCBjYWxsZWQiKS53aXRoT2JqZWN0KGkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkdFVF9DT05UQUNULGkse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoZS5jb250YWN0RGF0YS5jdXN0b21lcklkKXt2YXIgbj17c3BlYWtlcklkOmUuY29udGFjdERhdGEuY3VzdG9tZXJJZH07dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VySWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobil9ZWxzZXt2YXIgaT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk5PX1NQRUFLRVJfSURfRk9VTkQsIk5vIHNwZWFrZXJJZCBhc3NvdGlhdGVkIHdpdGggdGhpcyBjYWxsIik7byhpKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiR2V0IFNwZWFrZXJJZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5HRVRfU1BFQUtFUl9JRF9GQUlMRUQsIkdldCBTcGVha2VySWQgZmFpbGVkIixlKTtvKG4pfX0pfSkpfSxhLnByb3RvdHlwZS5nZXRTcGVha2VyU3RhdHVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0U3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oaSl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IHM9e1NwZWFrZXJJZDp0LmFzc2VydE5vdE51bGwoaS5zcGVha2VySWQsInNwZWFrZXJJZCIpLERvbWFpbklkOmV9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlclN0YXR1cyBjYWxsZWQiKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkRFU0NSSUJFX1NQRUFLRVIscyx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJTdGF0dXMgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dmFyIG49SlNPTi5wYXJzZShlKTtzd2l0Y2gobi5zdGF0dXMpe2Nhc2UgNDAwOmNhc2UgNDA0OnZhciBpPW47aS50eXBlPWkudHlwZT9pLnR5cGU6dC5Wb2ljZUlkRXJyb3JUeXBlcy5TUEVBS0VSX0lEX05PVF9FTlJPTExFRCx0LmdldExvZygpLmluZm8oIlNwZWFrZXIgaXMgbm90IGVucm9sbGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihpKTticmVhaztkZWZhdWx0OnQuZ2V0TG9nKCkuZXJyb3IoImdldFNwZWFrZXJTdGF0dXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBzPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX1NQRUFLRVJfU1RBVFVTX0ZBSUxFRCwiR2V0IFNwZWFrZXJTdGF0dXMgZmFpbGVkIixlKTtvKHMpfX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuX29wdE91dFNwZWFrZXJJbkxjbXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXtjb25zdCBhPXtDb250YWN0SWQ6ci5jb250YWN0SWQsSW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksQVdTQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpLEN1c3RvbWVySWQ6dC5hc3NlcnROb3ROdWxsKGUsInNwZWFrZXJJZCIpLFZvaWNlSWRSZXN1bHQ6e1NwZWFrZXJPcHRlZE91dDohMCxnZW5lcmF0ZWRTcGVha2VySWQ6bn19O3QuZ2V0TG9nKCkuaW5mbygiX29wdE91dFNwZWFrZXJJbkxjbXMgY2FsbGVkIikud2l0aE9iamVjdChhKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfVk9JQ0VfSURfREFUQSxhLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlckluTGNtcyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJvcHRPdXRTcGVha2VySW5MY21zIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk9QVF9PVVRfU1BFQUtFUl9JTl9MQ01TX0ZBSUxFRCwib3B0T3V0U3BlYWtlckluTGNtcyBmYWlsZWQiLGUpO3Mobil9fSl9KSl9LGEucHJvdG90eXBlLm9wdE91dFNwZWFrZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24ocyl7dmFyIGE9aS5zcGVha2VySWQ7Y29uc3QgYz17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChhLCJzcGVha2VySWQiKSxEb21haW5JZDpzfTt0LmdldExvZygpLmluZm8oIm9wdE91dFNwZWFrZXIgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5PUFRfT1VUX1NQRUFLRVIsYyx7c3VjY2VzczpmdW5jdGlvbihuKXtlLl9vcHRPdXRTcGVha2VySW5MY21zKGEsbi5nZW5lcmF0ZWRTcGVha2VySWQpLmNhdGNoKChmdW5jdGlvbigpe30pKSx0LmdldExvZygpLmluZm8oIm9wdE91dFNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobil9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigib3B0T3V0U3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5PUFRfT1VUX1NQRUFLRVJfRkFJTEVELCJvcHRPdXRTcGVha2VyIGZhaWxlZC4iLGUpO28obil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLmRlbGV0ZVNwZWFrZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcz17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChpLnNwZWFrZXJJZCwic3BlYWtlcklkIiksRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJkZWxldGVTcGVha2VyIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuREVMRVRFX1NQRUFLRVIscyx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImRlbGV0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZGVsZXRlU3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5ERUxFVEVfU1BFQUtFUl9GQUlMRUQsImRlbGV0ZVNwZWFrZXIgZmFpbGVkLiIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuc3RhcnRTZXNzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihpKXtjb25zdCBzPXtjb250YWN0SWQ6ZS5jb250YWN0SWQsaW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksY3VzdG9tZXJBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksY2xpZW50VG9rZW46QVdTLnV0aWwudXVpZC52NCgpLGRvbWFpbklkOml9O3QuZ2V0TG9nKCkuaW5mbygic3RhcnRTZXNzaW9uIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuU1RBUlRfVk9JQ0VfSURfU0VTU0lPTixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2lmKGUuc2Vzc2lvbklkKXIoZSk7ZWxzZXt0LmdldExvZygpLmVycm9yKCJzdGFydFZvaWNlSWRTZXNzaW9uIGZhaWxlZCwgbm8gc2Vzc2lvbiBpZCByZXR1cm5lZCIpLndpdGhPYmplY3Qoe2RhdGE6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TVEFSVF9TRVNTSU9OX0ZBSUxFRCwiTm8gc2Vzc2lvbiBpZCByZXR1cm5lZCBmcm9tIHN0YXJ0IHNlc3Npb24gYXBpIik7byhuKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigic3RhcnRWb2ljZUlkU2Vzc2lvbiBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TVEFSVF9TRVNTSU9OX0ZBSUxFRCwic3RhcnRWb2ljZUlkU2Vzc2lvbiBmYWlsZWQiLGUpO28obil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLmV2YWx1YXRlU3BlYWtlcj1mdW5jdGlvbihlKXt2YXIgbj10aGlzO24uY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSxpPTA7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihzLGEpe2Z1bmN0aW9uIGMoKXtuLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3QgdT17U2Vzc2lvbk5hbWVPcklkOm8uaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgY2FsbGVkIikud2l0aE9iamVjdCh1KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5FVkFMVUFURV9TRVNTSU9OLHUse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoKytpPHQuVm9pY2VJZENvbnN0YW50cy5FVkFMVUFUSU9OX01BWF9QT0xMX1RJTUVTKWlmKGUuU3RyZWFtaW5nU3RhdHVzPT09dC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzLlBFTkRJTkdfQ09ORklHVVJBVElPTilzZXRUaW1lb3V0KGMsdC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTCk7ZWxzZXtpZihlLkF1dGhlbnRpY2F0aW9uUmVzdWx0fHwoZS5BdXRoZW50aWNhdGlvblJlc3VsdD17fSxlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEKSxlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0fHwoZS5GcmF1ZERldGVjdGlvblJlc3VsdD17fSxlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEKSwhbi5pc0F1dGhFbmFibGVkKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYhbi5pc0ZyYXVkRW5hYmxlZChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQgcyhlKTtpZihlLlN0cmVhbWluZ1N0YXR1cz09PXQuVm9pY2VJZFN0cmVhbWluZ1N0YXR1cy5FTkRFRCYmKG4uaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkUpLG4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSYmKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFKSksbi5pc0F1dGhSZXN1bHRJbmNvbmNsdXNpdmUoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJm4uaXNGcmF1ZFJlc3VsdEluY29uY2x1c2l2ZShlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQgcyhlKTtpZighbi5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJm4uaXNBdXRoRW5hYmxlZChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSlzd2l0Y2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbil7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLkFDQ0VQVDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLkFVVEhFTlRJQ0FURUQ7YnJlYWs7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLlJFSkVDVDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9BVVRIRU5USUNBVEVEO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5TUEVBS0VSX09QVEVEX09VVDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk9QVEVEX09VVDticmVhaztjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uU1BFQUtFUl9OT1RfRU5ST0xMRUQ6ZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5ST0xMRUQ7YnJlYWs7ZGVmYXVsdDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLkVSUk9SfWlmKCFuLmlzRnJhdWRSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikmJm4uaXNGcmF1ZEVuYWJsZWQoZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikpc3dpdGNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pe2Nhc2UgdC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbi5ISUdIX1JJU0s6ZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5ISUdIX1JJU0s7YnJlYWs7Y2FzZSB0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkxPV19SSVNLOmUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTE9XX1JJU0s7YnJlYWs7ZGVmYXVsdDplLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkVSUk9SfWlmKCFuLmlzQXV0aFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmIW4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQgcyhlKTtzZXRUaW1lb3V0KGMsdC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTCl9ZWxzZXt0LmdldExvZygpLmVycm9yKCJldmFsdWF0ZVNwZWFrZXIgdGltZW91dCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHI9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FVkFMVUFURV9TUEVBS0VSX1RJTUVPVVQsImV2YWx1YXRlU3BlYWtlciB0aW1lb3V0Iik7YShyKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dmFyIG47c3dpdGNoKEpTT04ucGFyc2UoZSkuc3RhdHVzKXtjYXNlIDQwMDpjYXNlIDQwNDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU0VTU0lPTl9OT1RfRVhJU1RTLCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoImV2YWx1YXRlU3BlYWtlciBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTticmVhaztkZWZhdWx0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FVkFMVUFURV9TUEVBS0VSX0ZBSUxFRCwiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCIsZSksdC5nZXRMb2coKS5lcnJvcigiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1hKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXthKGUpfSkpfWU/bi5zdGFydFNlc3Npb24oKS50aGVuKChmdW5jdGlvbihlKXtuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGMsdC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRFX1NFU1NJT05fREVMQVkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzeW5jU3BlYWtlcklkIGZhaWxlZCB3aGVuIHNlc3Npb24gc3RhcnROZXc9dHJ1ZSIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxhKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzdGFydFNlc3Npb24gZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz10cnVlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEoZSl9KSk6bi5zeW5jU3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oKXtjKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN5bmNTcGVha2VySWQgZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz1mYWxzZSIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxhKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5kZXNjcmliZVNlc3Npb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5jb3JlLmdldENsaWVudCgpLHI9dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcz17U2Vzc2lvbk5hbWVPcklkOnIuaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJkZXNjcmliZVNlc3Npb24gY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5ERVNDUklCRV9TRVNTSU9OLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7byhlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJkZXNjcmliZVNlc3Npb24gZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuREVTQ1JJQkVfU0VTU0lPTl9GQUlMRUQsImRlc2NyaWJlU2Vzc2lvbiBmYWlsZWQiLGUpO2kobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2koZSl9KSl9KSl9LGEucHJvdG90eXBlLmNoZWNrRW5yb2xsbWVudFN0YXR1cz1mdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImNoZWNrRW5yb2xsbWVudFN0YXR1cyBjYWxsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXRoaXMscj0wLG89ITE7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpeyFmdW5jdGlvbiBhKCl7aWYoKytyPHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX01BWF9QT0xMX1RJTUVTKW4uZGVzY3JpYmVTZXNzaW9uKCkudGhlbigoZnVuY3Rpb24ocil7c3dpdGNoKHIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuU3RhdHVzKXtjYXNlIHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLkNPTVBMRVRFRDppKHIpO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuSU5fUFJPR1JFU1M6b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fChlKHIpLG89ITApLHNldFRpbWVvdXQoYSx0LlZvaWNlSWRDb25zdGFudHMuRU5ST0xMTUVOVF9QT0xMSU5HX0lOVEVSVkFMKTticmVhaztjYXNlIHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLk5PVF9FTk9VR0hfU1BFRUNIOnIuU2Vzc2lvbi5TdHJlYW1pbmdTdGF0dXMhPT10LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXMuRU5ERUQ/c2V0VGltZW91dChhLHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX1BPTExJTkdfSU5URVJWQUwpOnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bi5zdGFydFNlc3Npb24oKS50aGVuKChmdW5jdGlvbihlKXthKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUsdCl7cyhlKX0pKX0pLHQuVm9pY2VJZENvbnN0YW50cy5TVEFSVF9TRVNTSU9OX0RFTEFZKTticmVhaztkZWZhdWx0OnZhciBjPXIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuTWVzc2FnZT9yLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLk1lc3NhZ2U6ImVucm9sbFNwZWFrZXIgZmFpbGVkLiBVbmtub3duIGVucm9sbG1lbnQgc3RhdHVzIGhhcyBiZWVuIHJlY2VpdmVkIjt0LmdldExvZygpLmVycm9yKGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHU9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FTlJPTExfU1BFQUtFUl9GQUlMRUQsYyxyLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLlN0YXR1cyk7cyh1KX19KSk7ZWxzZXt0LmdldExvZygpLmVycm9yKCJlbnJvbGxTcGVha2VyIHRpbWVvdXQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBjPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRU5ST0xMX1NQRUFLRVJfVElNRU9VVCwiZW5yb2xsU3BlYWtlciB0aW1lb3V0Iik7cyhjKX19KCl9KSl9LGEucHJvdG90eXBlLmVucm9sbFNwZWFrZXI9ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VyIGNhbGxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dGhpcztyZXR1cm4gbi5jaGVja0NvbmZlcmVuY2VDYWxsKCksbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7bi5zeW5jU3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oKXtuLmdldFNwZWFrZXJTdGF0dXMoKS50aGVuKChmdW5jdGlvbihpKXtpLlNwZWFrZXImJmkuU3BlYWtlci5TdGF0dXM9PXQuVm9pY2VJZFNwZWFrZXJTdGF0dXMuT1BURURfT1VUP24uZGVsZXRlU3BlYWtlcigpLnRoZW4oKGZ1bmN0aW9uKCl7bi5lbnJvbGxTcGVha2VySGVscGVyKHIsbyxlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKTpuLmVucm9sbFNwZWFrZXJIZWxwZXIocixvLGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5lbnJvbGxTcGVha2VySGVscGVyPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9dC5jb3JlLmdldENsaWVudCgpLHM9dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO28uZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihhKXtjb25zdCBjPXtTZXNzaW9uTmFtZU9ySWQ6cy5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDphfTt0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXJIZWxwZXIgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5FTlJPTExfQllfU0VTU0lPTixjLHtzdWNjZXNzOmZ1bmN0aW9uKGkpe2kuU3RhdHVzPT09dC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuQ09NUExFVEVEPyh0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUoaSkpOm8uY2hlY2tFbnJvbGxtZW50U3RhdHVzKHIpLnRoZW4oKGZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZShuKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7bihlKX0pKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJlbnJvbGxTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVOUk9MTF9TUEVBS0VSX0ZBSUxFRCwiZW5yb2xsU3BlYWtlciBmYWlsZWQiLGUpO24ocil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9LGEucHJvdG90eXBlLl91cGRhdGVTcGVha2VySWRJbkxjbXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXtjb25zdCBhPXtDb250YWN0SWQ6ci5jb250YWN0SWQsSW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksQVdTQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpLEN1c3RvbWVySWQ6dC5hc3NlcnROb3ROdWxsKGUsInNwZWFrZXJJZCIpLFZvaWNlSWRSZXN1bHQ6e2dlbmVyYXRlZFNwZWFrZXJJZDpufX07dC5nZXRMb2coKS5pbmZvKCJfdXBkYXRlU3BlYWtlcklkSW5MY21zIGNhbGxlZCIpLndpdGhPYmplY3QoYSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxvLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuVVBEQVRFX1ZPSUNFX0lEX0RBVEEsYSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJbkxjbXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuVVBEQVRFX1NQRUFLRVJfSURfSU5fTENNU19GQUlMRUQsInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBmYWlsZWQiLGUpO3Mobil9fSl9KSl9LGEucHJvdG90eXBlLnVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO24uY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscyl7bi5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGEpe2NvbnN0IGM9e1Nlc3Npb25OYW1lT3JJZDpvLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLFNwZWFrZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksRG9tYWluSWQ6YX07dC5nZXRMb2coKS5pbmZvKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfU0VTU0lPTixjLHtzdWNjZXNzOmZ1bmN0aW9uKHIpe3QuZ2V0TG9nKCkuaW5mbygidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbz1yJiZyLlNlc3Npb24mJnIuU2Vzc2lvbi5HZW5lcmF0ZWRTcGVha2VySWQ7bi5fdXBkYXRlU3BlYWtlcklkSW5MY21zKGUsbykudGhlbigoZnVuY3Rpb24oKXtpKHIpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtzKGUpfSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciBuO3N3aXRjaChKU09OLnBhcnNlKGUpLnN0YXR1cyl7Y2FzZSA0MDA6Y2FzZSA0MDQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNFU1NJT05fTk9UX0VYSVNUUywidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIixlKSx0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7YnJlYWs7ZGVmYXVsdDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuVVBEQVRFX1NQRUFLRVJfSURfRkFJTEVELCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkIixlKSx0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXMobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9KSl9LGEucHJvdG90eXBlLnN5bmNTcGVha2VySWQ9ZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oInN5bmNTcGVha2VySWQgY2FsbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKHIpe2UudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkKHIuc3BlYWtlcklkKS50aGVuKChmdW5jdGlvbihlKXt0KGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5nZXREb21haW5JZD1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxuKXtpZigobmV3IHQuQWdlbnQpLmdldFBlcm1pc3Npb25zKCkuaW5jbHVkZXModC5BZ2VudFBlcm1pc3Npb25zLlZPSUNFX0lEKSlpZih0LmNvcmUudm9pY2VJZERvbWFpbklkKWUodC5jb3JlLnZvaWNlSWREb21haW5JZCk7ZWxzZXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCk7Y29uc3Qgbz17SW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksSW50ZWdyYXRpb25UeXBlOiJWT0lDRV9JRCJ9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0RG9tYWluSWQgY2FsbGVkIikud2l0aE9iamVjdChvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5MSVNUX0lOVEVHUkFUSU9OX0FTU09DSUFUSU9OUyxvLHtzdWNjZXNzOmZ1bmN0aW9uKHIpe3RyeXt2YXIgbztpZihyLkludGVncmF0aW9uQXNzb2NpYXRpb25TdW1tYXJ5TGlzdC5sZW5ndGg+PTEmJihvPXIuSW50ZWdyYXRpb25Bc3NvY2lhdGlvblN1bW1hcnlMaXN0WzBdLkludGVncmF0aW9uQXJuLnJlcGxhY2UoL14uKmRvbWFpblwvL2ksIiIpKSwhbyl7dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZDogbm8gZG9tYWluSWQgZm91bmQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuTk9fRE9NQUlOX0lEX0ZPVU5EKTtyZXR1cm4gdm9pZCBuKGkpfXQuZ2V0TG9nKCkuaW5mbygiZ2V0RG9tYWluSWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELGRhdGE6e2RvbWFpbklkOm99fSksZShvKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJnZXREb21haW5JZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9ET01BSU5fSURfRkFJTEVELCJnZXREb21haW5JZCBmYWlsZWQiLGUpLG4oaSl9fSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImdldERvbWFpbklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9ET01BSU5fSURfRkFJTEVELCJnZXREb21haW5JZCBmYWlsZWQiLGUpO24ocil9fSl9ZWxzZSBuKG5ldyBFcnJvcigiQWdlbnQgZG9lc24ndCBoYXZlIHRoZSBwZXJtaXNzaW9uIGZvciBWb2ljZSBJRCIpKX0pKX0sYS5wcm90b3R5cGUuY2hlY2tDb25mZXJlbmNlQ2FsbD1mdW5jdGlvbigpe2lmKHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKS5jb25uZWN0aW9ucy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTLGUuc3RhdGUudHlwZSl9KSkubGVuZ3RoPjIpdGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcigiVm9pY2VJZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb25mZXJlbmNlIGNhbGxzIil9LGEucHJvdG90eXBlLmlzQXV0aEVuYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5BQkxFRH0sYS5wcm90b3R5cGUuaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5PVUdIX1NQRUVDSH0sYS5wcm90b3R5cGUuaXNBdXRoUmVzdWx0SW5jb25jbHVzaXZlPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFfSxhLnByb3RvdHlwZS5pc0ZyYXVkRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEfSxhLnByb3RvdHlwZS5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbi5OT1RfRU5PVUdIX1NQRUVDSH0sYS5wcm90b3R5cGUuaXNGcmF1ZFJlc3VsdEluY29uY2x1c2l2ZT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRX07dmFyIGM9ZnVuY3Rpb24oZSx0KXt0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvcj1uZXcgYShlKSxzLmNhbGwodGhpcyxlLHQpfTsoYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWMsYy5wcm90b3R5cGUuZ2V0U29mdHBob25lTWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LGMucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc29mdHBob25lTWVkaWFJbmZvfSxjLnByb3RvdHlwZS5nZXRNZWRpYVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5NZWRpYVR5cGUuU09GVFBIT05FfSxjLnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9LGMucHJvdG90eXBlLmdldFZvaWNlSWRTcGVha2VySWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZ2V0U3BlYWtlcklkKCl9LGMucHJvdG90eXBlLmdldFZvaWNlSWRTcGVha2VyU3RhdHVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmdldFNwZWFrZXJTdGF0dXMoKX0sYy5wcm90b3R5cGUub3B0T3V0Vm9pY2VJZFNwZWFrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3Iub3B0T3V0U3BlYWtlcigpfSxjLnByb3RvdHlwZS5kZWxldGVWb2ljZUlkU3BlYWtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5kZWxldGVTcGVha2VyKCl9LGMucHJvdG90eXBlLmV2YWx1YXRlU3BlYWtlcldpdGhWb2ljZUlkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5ldmFsdWF0ZVNwZWFrZXIoZSl9LGMucHJvdG90eXBlLmVucm9sbFNwZWFrZXJJblZvaWNlSWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmVucm9sbFNwZWFrZXIoZSl9LGMucHJvdG90eXBlLnVwZGF0ZVZvaWNlSWRTcGVha2VySWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLnVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZChlKX0sYy5wcm90b3R5cGUuZ2V0UXVpY2tDb25uZWN0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucXVpY2tDb25uZWN0TmFtZX0sYy5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUn0sYy5wcm90b3R5cGUuaXNCYXJnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE1vbml0b3JTdGF0dXMoKT09PXQuTW9uaXRvcmluZ01vZGUuQkFSR0V9LGMucHJvdG90eXBlLmlzQmFyZ2VFbmFibGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzKCk7cmV0dXJuIGUmJmUuaW5jbHVkZXModC5Nb25pdG9yaW5nTW9kZS5CQVJHRSl9LGMucHJvdG90eXBlLmlzU2lsZW50TW9uaXRvckVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SKX0sYy5wcm90b3R5cGUuZ2V0TW9uaXRvckNhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvckNhcGFiaWxpdGllc30sYy5wcm90b3R5cGUuZ2V0TW9uaXRvclN0YXR1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvclN0YXR1c30sYy5wcm90b3R5cGUuaXNNdXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tdXRlfSxjLnByb3RvdHlwZS5pc0ZvcmNlZE11dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmZvcmNlZE11dGV9LGMucHJvdG90eXBlLm11dGVQYXJ0aWNpcGFudD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuTVVURV9QQVJUSUNJUEFOVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxjLnByb3RvdHlwZS51bm11dGVQYXJ0aWNpcGFudD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuVU5NVVRFX1BBUlRJQ0lQQU5ULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LGMucHJvdG90eXBlLmNhblNlbmRWaWRlbz1mdW5jdGlvbigpe2NvbnN0IGU9dGhpcy5nZXRDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5WaWRlbz09PXQuVmlkZW9DYXBhYmlsaXR5LlNFTkR9LGMucHJvdG90eXBlLmdldENhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY2FwYWJpbGl0aWVzfSxjLnByb3RvdHlwZS5nZXRWaWRlb0Nvbm5lY3Rpb25JbmZvPWZ1bmN0aW9uKCl7Y29uc3QgZT10LmNvcmUuZ2V0Q2xpZW50KCksbj17dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5XRUJfUlRDLGNvbnRhY3RJZDp0aGlzLmNvbnRhY3RJZH07cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxuLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZS53ZWJSVENUcmFuc3BvcnQpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLG8oRXJyb3IoImdldFZpZGVvQ29ubmVjdGlvbkluZm8gZmFpbGVkIikpfX0pfSkpfTt2YXIgdT1mdW5jdGlvbihlLHQpe3MuY2FsbCh0aGlzLGUsdCl9Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx1LnByb3RvdHlwZS5nZXRNZWRpYUluZm89ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9nZXREYXRhKCkuY2hhdE1lZGlhSW5mbztpZihlKXt2YXIgbj10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCkscj17Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6bi5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxwYXJ0aWNpcGFudElkOnRoaXMuY29ubmVjdGlvbklkLGdldENvbm5lY3Rpb25Ub2tlbjp0LmhpdGNoKHRoaXMsdGhpcy5nZXRDb25uZWN0aW9uVG9rZW4pfTtpZihlLmNvbm5lY3Rpb25EYXRhKXRyeXtyLnBhcnRpY2lwYW50VG9rZW49SlNPTi5wYXJzZShlLmNvbm5lY3Rpb25EYXRhKS5Db25uZWN0aW9uQXV0aGVudGljYXRpb25Ub2tlbn1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKHQuTG9nQ29tcG9uZW50LkNIQVQsIkNvbm5lY3Rpb24gZGF0YSBpcyBpbnZhbGlkIikud2l0aE9iamVjdChlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5wYXJ0aWNpcGFudFRva2VuPW51bGx9cmV0dXJuIHIucGFydGljaXBhbnRUb2tlbj1yLnBhcnRpY2lwYW50VG9rZW58fG51bGwsci5vcmlnaW5hbEluZm89dGhpcy5fZ2V0RGF0YSgpLmNoYXRNZWRpYUluZm8scn1yZXR1cm4gbnVsbH0sdS5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvblRva2VuPWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLmdldENsaWVudCgpLG49KHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5DSEFUX1RPS0VOLHBhcnRpY2lwYW50SWQ6dGhpcy5jb25uZWN0aW9uSWQsY29udGFjdElkOnRoaXMuY29udGFjdElkfSk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxuLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0Q29ubmVjdGlvblRva2VuIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLG8oRXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKSl9fSl9KSl9LHUucHJvdG90eXBlLmdldE1lZGlhVHlwZT1mdW5jdGlvbigpe3JldHVybiB0Lk1lZGlhVHlwZS5DSEFUfSx1LnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9LHUucHJvdG90eXBlLl9pbml0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNBZ2VudENvbm5lY3Rpb25UeXBlKCkmJnQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpLmNhdGNoKChmdW5jdGlvbigpe30pKX0sdS5wcm90b3R5cGUuaXNCYXJnZUVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFKX0sdS5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TW9uaXRvckNhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLmluY2x1ZGVzKHQuTW9uaXRvcmluZ01vZGUuU0lMRU5UX01PTklUT1IpfSx1LnByb3RvdHlwZS5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yQ2FwYWJpbGl0aWVzfSx1LnByb3RvdHlwZS5pc0JhcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5CQVJHRX0sdS5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUn0sdS5wcm90b3R5cGUuZ2V0TW9uaXRvclN0YXR1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvclN0YXR1c307dmFyIGw9ZnVuY3Rpb24oZSx0KXtzLmNhbGwodGhpcyxlLHQpfTsobC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWwsbC5wcm90b3R5cGUuZ2V0TWVkaWFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTWVkaWFUeXBlLlRBU0t9LGwucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3ZhciBlPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtyZXR1cm57Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6ZS5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZH19LGwucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX07dmFyIHA9ZnVuY3Rpb24oZSl7dC5Db25uZWN0aW9uLmNhbGwodGhpcyxlLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCksdGhpcy5jb25uZWN0aW9uRGF0YT1lfTsocC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXAscC5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25uZWN0aW9uRGF0YX0scC5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt9O3ZhciBkPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuZW5kcG9pbnRBUk49dC5lbmRwb2ludElkfHx0LmVuZHBvaW50QVJOfHxudWxsLHRoaXMuZW5kcG9pbnRJZD10aGlzLmVuZHBvaW50QVJOLHRoaXMudHlwZT10LnR5cGV8fG51bGwsdGhpcy5uYW1lPXQubmFtZXx8bnVsbCx0aGlzLnBob25lTnVtYmVyPXQucGhvbmVOdW1iZXJ8fG51bGwsdGhpcy5hZ2VudExvZ2luPXQuYWdlbnRMb2dpbnx8bnVsbCx0aGlzLnF1ZXVlPXQucXVldWV8fG51bGx9O2QucHJvdG90eXBlLnN0cmlwUGhvbmVOdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waG9uZU51bWJlcj90aGlzLnBob25lTnVtYmVyLnJlcGxhY2UoL3NpcDooW15AXSopQC4qLywiJDEiKToiIn0sZC5ieVBob25lTnVtYmVyPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBkKHt0eXBlOnQuRW5kcG9pbnRUeXBlLlBIT05FX05VTUJFUixwaG9uZU51bWJlcjplLG5hbWU6bnx8bnVsbH0pfTt2YXIgaD1mdW5jdGlvbihlLHQsbil7dGhpcy5lcnJvclR5cGU9ZSx0aGlzLmVycm9yTWVzc2FnZT10LHRoaXMuZW5kUG9pbnRVcmw9bn07aC5wcm90b3R5cGUuZ2V0RXJyb3JUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JUeXBlfSxoLnByb3RvdHlwZS5nZXRFcnJvck1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvck1lc3NhZ2V9LGgucHJvdG90eXBlLmdldEVuZFBvaW50VXJsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kUG9pbnRVcmx9LHQuYWdlbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuSU5JVCxlKTtyZXR1cm4gdC5hZ2VudC5pbml0aWFsaXplZCYmZShuZXcgdC5BZ2VudCksbn0sdC5hZ2VudC5pbml0aWFsaXplZD0hMSx0LmNvbnRhY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbnRhY3RFdmVudHMuSU5JVCxlKX0sdC5vbldlYnNvY2tldEluaXRGYWlsdXJlPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUsZSk7cmV0dXJuIHQud2ViU29ja2V0SW5pdEZhaWxlZCYmZSgpLG59LHQuaWZNYXN0ZXI9ZnVuY3Rpb24oZSxuLHIsbyl7aWYodC5hc3NlcnROb3ROdWxsKGUsIkEgdG9waWMgbXVzdCBiZSBwcm92aWRlZC4iKSx0LmFzc2VydE5vdE51bGwobiwiQSB0cnVlIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQuIiksIXQuY29yZS5tYXN0ZXJDbGllbnQpcmV0dXJuIHQuZ2V0TG9nKCkud2FybigiV2UgY2FuJ3QgYmUgdGhlIG1hc3RlciBmb3IgdG9waWMgJyVzJyBiZWNhdXNlIHRoZXJlIGlzIG5vIG1hc3RlciBjbGllbnQhIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQociYmcigpKTt0LmNvcmUuZ2V0TWFzdGVyQ2xpZW50KCkuY2FsbCh0Lk1hc3Rlck1ldGhvZHMuQ0hFQ0tfTUFTVEVSLHt0b3BpYzplLHNob3VsZE5vdEJlY29tZU1hc3RlcklmTm9uZTpvfSx7c3VjY2VzczpmdW5jdGlvbihlKXtlLmlzTWFzdGVyP24oKTpyJiZyKCl9fSl9LHQuYmVjb21lTWFzdGVyPWZ1bmN0aW9uKGUsbixyKXt0LmFzc2VydE5vdE51bGwoZSwiQSB0b3BpYyBtdXN0IGJlIHByb3ZpZGVkLiIpLHQuY29yZS5tYXN0ZXJDbGllbnQ/dC5jb3JlLmdldE1hc3RlckNsaWVudCgpLmNhbGwodC5NYXN0ZXJNZXRob2RzLkJFQ09NRV9NQVNURVIse3RvcGljOmV9LHtzdWNjZXNzOmZ1bmN0aW9uKCl7biYmbigpfX0pOih0LmdldExvZygpLndhcm4oIldlIGNhbid0IGJlIHRoZSBtYXN0ZXIgZm9yIHRvcGljICclcycgYmVjYXVzZSB0aGVyZSBpcyBubyBtYXN0ZXIgY2xpZW50ISIsZSksciYmcigpKX0sdC5BZ2VudD1uLHQuQWdlbnRTbmFwc2hvdD1yLHQuQ29udGFjdD1vLHQuQ29udGFjdFNuYXBzaG90PWksdC5Db25uZWN0aW9uPWMsdC5CYXNlQ29ubmVjdGlvbj1zLHQuVm9pY2VDb25uZWN0aW9uPWMsdC5DaGF0Q29ubmVjdGlvbj11LHQuVGFza0Nvbm5lY3Rpb249bCx0LkNvbm5lY3Rpb25TbmFwc2hvdD1wLHQuRW5kcG9pbnQ9ZCx0LkFkZHJlc3M9ZCx0LlNvZnRwaG9uZUVycm9yPWgsdC5Wb2ljZUlkPWEsdC5RdWlja1Jlc3BvbnNlcz1jbGFzc3tzdGF0aWMgaXNFbmFibGVkPWZ1bmN0aW9uKCl7Y29uc3QgZT10LmlzQ1JNKCk/dC5jb3JlLmdldENsaWVudCgpOnQuY29yZS5nZXRBcGlQcm94eUNsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obixyKXtlLmNhbGwodC5BcGlQcm94eUNsaWVudE1ldGhvZHMuUVJfSU5URUdSQVRJT05fRVhJU1RTLG51bGwse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJRdWljayBSZXNwb25zZXMgaXNFbmFibGVkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIlF1aWNrIFJlc3BvbnNlcyBpc0VuYWJsZWQgZmFpbGVkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9fSl9KSl9O3N0YXRpYyBzZWFyY2hRdWlja1Jlc3BvbnNlcz1mdW5jdGlvbihlKXtjb25zdCBuPXQuaXNDUk0oKT90LmNvcmUuZ2V0Q2xpZW50KCk6dC5jb3JlLmdldEFwaVByb3h5Q2xpZW50KCkscj1lPy5jb250YWN0SWQ/bmV3IG8oZS5jb250YWN0SWQpLmdldEF0dHJpYnV0ZXMoKTp2b2lkIDA7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe24uY2FsbCh0LkFwaVByb3h5Q2xpZW50TWV0aG9kcy5RUl9TRUFSQ0hfUVVJQ0tfUkVTUE9OU0VTLHsuLi5lLGF0dHJpYnV0ZXM6cn0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJzZWFyY2hRdWlja1Jlc3BvbnNlcyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbyhlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzZWFyY2hRdWlja1Jlc3BvbnNlcyBmYWlsZWQiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShlKX19KX0pKX19fSgpfSw4Mjc6KGUsdCxuKT0+e3ZhciByOyFmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBvKHMsYSl7aWYoIW5bc10pe2lmKCF0W3NdKXtpZihpKXJldHVybiBpKHMsITApO3ZhciBjPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK3MrIiciKTt0aHJvdyBjLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGN9dmFyIHU9bltzXT17ZXhwb3J0czp7fX07dFtzXVswXS5jYWxsKHUuZXhwb3J0cywoZnVuY3Rpb24oZSl7cmV0dXJuIG8odFtzXVsxXVtlXXx8ZSl9KSx1LHUuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltzXS5leHBvcnRzfWZvcih2YXIgaT12b2lkIDAscz0wO3M8ci5sZW5ndGg7cysrKW8ocltzXSk7cmV0dXJuIG99KHsxOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDE0LTA2LTMwIixlbmRwb2ludFByZWZpeDoiY29nbml0by1pZGVudGl0eSIsanNvblZlcnNpb246IjEuMSIscHJvdG9jb2w6Impzb24iLHNlcnZpY2VGdWxsTmFtZToiQW1hem9uIENvZ25pdG8gSWRlbnRpdHkiLHNlcnZpY2VJZDoiQ29nbml0byBJZGVudGl0eSIsc2lnbmF0dXJlVmVyc2lvbjoidjQiLHRhcmdldFByZWZpeDoiQVdTQ29nbml0b0lkZW50aXR5U2VydmljZSIsdWlkOiJjb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAifSxvcGVyYXRpb25zOntDcmVhdGVJZGVudGl0eVBvb2w6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sTmFtZSIsIkFsbG93VW5hdXRoZW50aWNhdGVkSWRlbnRpdGllcyJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbE5hbWU6e30sQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzOnt0eXBlOiJib29sZWFuIn0sQWxsb3dDbGFzc2ljRmxvdzp7dHlwZToiYm9vbGVhbiJ9LFN1cHBvcnRlZExvZ2luUHJvdmlkZXJzOntzaGFwZToiUzUifSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sT3BlbklkQ29ubmVjdFByb3ZpZGVyQVJOczp7c2hhcGU6IlM5In0sQ29nbml0b0lkZW50aXR5UHJvdmlkZXJzOntzaGFwZToiU2IifSxTYW1sUHJvdmlkZXJBUk5zOntzaGFwZToiU2cifSxJZGVudGl0eVBvb2xUYWdzOntzaGFwZToiU2gifX19LG91dHB1dDp7c2hhcGU6IlNrIn19LERlbGV0ZUlkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZHNUb0RlbGV0ZSJdLG1lbWJlcnM6e0lkZW50aXR5SWRzVG9EZWxldGU6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VW5wcm9jZXNzZWRJZGVudGl0eUlkczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sRXJyb3JDb2RlOnt9fX19fX19LERlbGV0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX19LERlc2NyaWJlSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e319fSxvdXRwdXQ6e3NoYXBlOiJTdiJ9fSxEZXNjcmliZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX0sb3V0cHV0OntzaGFwZToiU2sifX0sR2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxDdXN0b21Sb2xlQXJuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sQ3JlZGVudGlhbHM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7QWNjZXNzS2V5SWQ6e30sU2VjcmV0S2V5Ont9LFNlc3Npb25Ub2tlbjp7fSxFeHBpcmF0aW9uOnt0eXBlOiJ0aW1lc3RhbXAifX19fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRJZDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0FjY291bnRJZDp7fSxJZGVudGl0eVBvb2xJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRJZGVudGl0eVBvb2xSb2xlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LFJvbGVzOntzaGFwZToiUzFjIn0sUm9sZU1hcHBpbmdzOntzaGFwZToiUzFlIn19fX0sR2V0T3BlbklkVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxUb2tlbjp7fX19LGF1dGh0eXBlOiJub25lIn0sR2V0T3BlbklkVG9rZW5Gb3JEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIkxvZ2lucyJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9LFRva2VuRHVyYXRpb246e3R5cGU6ImxvbmcifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LFRva2VuOnt9fX19LEdldFByaW5jaXBhbFRhZ0F0dHJpYnV0ZU1hcDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UHJvdmlkZXJOYW1lIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fX0sTGlzdElkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJNYXhSZXN1bHRzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sTWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fSxIaWRlRGlzYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0aWVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTdiJ9fSxOZXh0VG9rZW46e319fX0sTGlzdElkZW50aXR5UG9vbHM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiTWF4UmVzdWx0cyJdLG1lbWJlcnM6e01heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifSxOZXh0VG9rZW46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UG9vbE5hbWU6e319fX0sTmV4dFRva2VuOnt9fX19LExpc3RUYWdzRm9yUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iXSxtZW1iZXJzOntSZXNvdXJjZUFybjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntUYWdzOntzaGFwZToiU2gifX19fSxMb29rdXBEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5SWQ6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXI6e30sTWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LERldmVsb3BlclVzZXJJZGVudGlmaWVyTGlzdDp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxOZXh0VG9rZW46e319fX0sTWVyZ2VEZXZlbG9wZXJJZGVudGl0aWVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlNvdXJjZVVzZXJJZGVudGlmaWVyIiwiRGVzdGluYXRpb25Vc2VySWRlbnRpZmllciIsIkRldmVsb3BlclByb3ZpZGVyTmFtZSIsIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7U291cmNlVXNlcklkZW50aWZpZXI6e30sRGVzdGluYXRpb25Vc2VySWRlbnRpZmllcjp7fSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sSWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fX19fSxTZXRJZGVudGl0eVBvb2xSb2xlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIlJvbGVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sUm9sZXM6e3NoYXBlOiJTMWMifSxSb2xlTWFwcGluZ3M6e3NoYXBlOiJTMWUifX19fSxTZXRQcmluY2lwYWxUYWdBdHRyaWJ1dGVNYXA6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJJZGVudGl0eVByb3ZpZGVyTmFtZSJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UHJvdmlkZXJOYW1lOnt9LFVzZURlZmF1bHRzOnt0eXBlOiJib29sZWFuIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UHJvdmlkZXJOYW1lOnt9LFVzZURlZmF1bHRzOnt0eXBlOiJib29sZWFuIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9fX19LFRhZ1Jlc291cmNlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJlc291cmNlQXJuIiwiVGFncyJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9LFRhZ3M6e3NoYXBlOiJTaCJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVbmxpbmtEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIiwiSWRlbnRpdHlQb29sSWQiLCJEZXZlbG9wZXJQcm92aWRlck5hbWUiLCJEZXZlbG9wZXJVc2VySWRlbnRpZmllciJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sSWRlbnRpdHlQb29sSWQ6e30sRGV2ZWxvcGVyUHJvdmlkZXJOYW1lOnt9LERldmVsb3BlclVzZXJJZGVudGlmaWVyOnt9fX19LFVubGlua0lkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiLCJMb2dpbnMiLCJMb2dpbnNUb1JlbW92ZSJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn0sTG9naW5zVG9SZW1vdmU6e3NoYXBlOiJTdyJ9fX0sYXV0aHR5cGU6Im5vbmUifSxVbnRhZ1Jlc291cmNlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJlc291cmNlQXJuIiwiVGFnS2V5cyJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9LFRhZ0tleXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3NoYXBlOiJTayJ9LG91dHB1dDp7c2hhcGU6IlNrIn19fSxzaGFwZXM6e1M1Ont0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sUzk6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sU2I6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntQcm92aWRlck5hbWU6e30sQ2xpZW50SWQ6e30sU2VydmVyU2lkZVRva2VuQ2hlY2s6e3R5cGU6ImJvb2xlYW4ifX19fSxTZzp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTaDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFNrOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJJZGVudGl0eVBvb2xOYW1lIiwiQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQb29sTmFtZTp7fSxBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXM6e3R5cGU6ImJvb2xlYW4ifSxBbGxvd0NsYXNzaWNGbG93Ont0eXBlOiJib29sZWFuIn0sU3VwcG9ydGVkTG9naW5Qcm92aWRlcnM6e3NoYXBlOiJTNSJ9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxPcGVuSWRDb25uZWN0UHJvdmlkZXJBUk5zOntzaGFwZToiUzkifSxDb2duaXRvSWRlbnRpdHlQcm92aWRlcnM6e3NoYXBlOiJTYiJ9LFNhbWxQcm92aWRlckFSTnM6e3NoYXBlOiJTZyJ9LElkZW50aXR5UG9vbFRhZ3M6e3NoYXBlOiJTaCJ9fX0sU3Y6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTdyJ9LENyZWF0aW9uRGF0ZTp7dHlwZToidGltZXN0YW1wIn0sTGFzdE1vZGlmaWVkRGF0ZTp7dHlwZToidGltZXN0YW1wIn19fSxTdzp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTMTA6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTMWM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTMWU6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiVHlwZSJdLG1lbWJlcnM6e1R5cGU6e30sQW1iaWd1b3VzUm9sZVJlc29sdXRpb246e30sUnVsZXNDb25maWd1cmF0aW9uOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUnVsZXMiXSxtZW1iZXJzOntSdWxlczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQ2xhaW0iLCJNYXRjaFR5cGUiLCJWYWx1ZSIsIlJvbGVBUk4iXSxtZW1iZXJzOntDbGFpbTp7fSxNYXRjaFR5cGU6e30sVmFsdWU6e30sUm9sZUFSTjp7fX19fX19fX19LFMxczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319fX19LHt9XSwyOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtwYWdpbmF0aW9uOntMaXN0SWRlbnRpdHlQb29sczp7aW5wdXRfdG9rZW46Ik5leHRUb2tlbiIsbGltaXRfa2V5OiJNYXhSZXN1bHRzIixvdXRwdXRfdG9rZW46Ik5leHRUb2tlbiIscmVzdWx0X2tleToiSWRlbnRpdHlQb29scyJ9fX19LHt9XSwzOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDE3LTAyLTE1IixlbmRwb2ludFByZWZpeDoiY29ubmVjdCIsanNvblZlcnNpb246IjEuMCIscHJvdG9jb2w6Impzb24iLHNlcnZpY2VBYmJyZXZpYXRpb246IkNvbm5lY3QiLHNlcnZpY2VGdWxsTmFtZToiQW1hem9uQ29ubmVjdENUSVNlcnZpY2UiLHNpZ25hdHVyZVZlcnNpb246IiIsdGFyZ2V0UHJlZml4OiJBbWF6b25Db25uZWN0Q1RJU2VydmljZSIsdWlkOiJjb25uZWN0LTIwMTctMDItMTUifSxvcGVyYXRpb25zOntBY2NlcHRDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ2xlYXJDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ29tcGxldGVDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ29uZmVyZW5jZUNvbm5lY3Rpb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ3JlYXRlQWRkaXRpb25hbENvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJlbmRwb2ludCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sZW5kcG9pbnQ6e3NoYXBlOiJTZSJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVPdXRib3VuZENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJlbmRwb2ludCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxlbmRwb2ludDp7c2hhcGU6IlNlIn0scXVldWVBUk46e30scmVsYXRlZENvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ3JlYXRlVGFza0NvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiZW5kcG9pbnQiLCJuYW1lIl0sbWVtYmVyczp7ZW5kcG9pbnQ6e3NoYXBlOiJTZSJ9LHByZXZpb3VzQ29udGFjdElkOnt9LG5hbWU6e30sZGVzY3JpcHRpb246e30scmVmZXJlbmNlczp7c2hhcGU6IlNyIn0saWRlbXBvdGVuY3lUb2tlbjp7fSxzY2hlZHVsZWRUaW1lOnt0eXBlOiJsb25nIn0scmVsYXRlZENvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntjb250YWN0SWQ6e319fX0sQ3JlYXRlVHJhbnNwb3J0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInRyYW5zcG9ydFR5cGUiLCJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e3RyYW5zcG9ydFR5cGU6e30scGFydGljaXBhbnRJZDp7fSxjb250YWN0SWQ6e30sc29mdHBob25lQ2xpZW50SWQ6e30sYXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3dlYlNvY2tldFRyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInVybCIsInRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzIl0sbWVtYmVyczp7dXJsOnt9LHRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzOnt0eXBlOiJsb25nIn0sZXhwaXJ5Ont9fX0sY2hhdFRva2VuVHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicGFydGljaXBhbnRUb2tlbiIsImV4cGlyeSJdLG1lbWJlcnM6e3BhcnRpY2lwYW50VG9rZW46e30sZXhwaXJ5Ont9fX0sc29mdHBob25lVHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic29mdHBob25lTWVkaWFDb25uZWN0aW9ucyJdLG1lbWJlcnM6e3NvZnRwaG9uZU1lZGlhQ29ubmVjdGlvbnM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInVzZXJuYW1lIiwiY3JlZGVudGlhbCIsInVybHMiXSxtZW1iZXJzOnt1c2VybmFtZTp7fSxjcmVkZW50aWFsOnt9LHVybHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fX19fSxhZ2VudERpc2NvdmVyeVRyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInByZXNpZ25lZFVybCJdLG1lbWJlcnM6e3ByZXNpZ25lZFVybDp7fX19LHdlYlJUQ1RyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIm1lZXRpbmciLCJhdHRlbmRlZSJdLG1lbWJlcnM6e21lZXRpbmc6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bWVldGluZ0lkOnt9LG1lZGlhUmVnaW9uOnt9LG1lZGlhUGxhY2VtZW50Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F1ZGlvSG9zdFVybDp7fSxhdWRpb0ZhbGxiYWNrVXJsOnt9LHNpZ25hbGluZ1VybDp7fSx0dXJuQ29udHJvbFVybDp7fSxldmVudEluZ2VzdGlvblVybDp7fX19LG1lZXRpbmdGZWF0dXJlczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthdWRpbzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntlY2hvUmVkdWN0aW9uOnt9fX19fX19LGF0dGVuZGVlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F0dGVuZGVlSWQ6e30sam9pblRva2VuOnt0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH19fX19fX19LERlc3Ryb3lDb25uZWN0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LEdldEFnZW50Q29uZmlndXJhdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbmZpZ3VyYXRpb24iXSxtZW1iZXJzOntjb25maWd1cmF0aW9uOntzaGFwZToiUzFxIn19fX0sR2V0QWdlbnRQZXJtaXNzaW9uczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicGVybWlzc2lvbnMiXSxtZW1iZXJzOntwZXJtaXNzaW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e319fX0sR2V0QWdlbnRTbmFwc2hvdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sdGltZW91dDp7dHlwZToibG9uZyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic25hcHNob3QiLCJuZXh0VG9rZW4iXSxtZW1iZXJzOntzbmFwc2hvdDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInN0YXRlIiwiY29udGFjdHMiLCJzbmFwc2hvdFRpbWVzdGFtcCJdLG1lbWJlcnM6e3N0YXRlOntzaGFwZToiUzI5In0sbmV4dFN0YXRlOntzaGFwZToiUzI5In0sYWdlbnRBdmFpbGFiaWxpdHlTdGF0ZTp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzdGF0ZTp7fSx0aW1lU3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sY29udGFjdHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCIsInR5cGUiLCJzdGF0ZSIsImNvbm5lY3Rpb25zIiwiYXR0cmlidXRlcyJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fSxpbml0aWFsQ29udGFjdElkOnt9LHR5cGU6e30sc3RhdGU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwidGltZXN0YW1wIl0sbWVtYmVyczp7dHlwZTp7fSx0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0scXVldWU6e3NoYXBlOiJTayJ9LHF1ZXVlVGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifSxjb25uZWN0aW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29ubmVjdGlvbklkIiwic3RhdGUiLCJ0eXBlIiwiaW5pdGlhbCJdLG1lbWJlcnM6e2Nvbm5lY3Rpb25JZDp7fSxlbmRwb2ludDp7c2hhcGU6IlNlIn0sc3RhdGU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwidGltZXN0YW1wIl0sbWVtYmVyczp7dHlwZTp7fSx0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sdHlwZTp7fSxpbml0aWFsOnt0eXBlOiJib29sZWFuIn0sc29mdHBob25lTWVkaWFJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NhbGxUeXBlOnt9LGF1dG9BY2NlcHQ6e3R5cGU6ImJvb2xlYW4ifSxtZWRpYUxlZ0NvbnRleHRUb2tlbjp7fSxjYWxsQ29udGV4dFRva2VuOnt9LGNhbGxDb25maWdKc29uOnt9fX0sY2hhdE1lZGlhSW5mbzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntjaGF0QXV0b0FjY2VwdDp7dHlwZToiYm9vbGVhbiJ9LGNvbm5lY3Rpb25EYXRhOnt9LGN1c3RvbWVyTmFtZTp7fX19LG1vbml0b3JpbmdJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2FnZW50Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2FnZW50TmFtZTp7fX19LGpvaW5UaW1lU3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sbXV0ZTp7dHlwZToiYm9vbGVhbiJ9LGZvcmNlZE11dGU6e3R5cGU6ImJvb2xlYW4ifSxxdWlja0Nvbm5lY3ROYW1lOnt9LG1vbml0b3JDYXBhYmlsaXRpZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbW9uaXRvclN0YXR1czp7fSxjYXBhYmlsaXRpZXM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VmlkZW86e319fX19fSxhdHRyaWJ1dGVzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIm5hbWUiXSxtZW1iZXJzOntuYW1lOnt9LHZhbHVlOnt9fX19LGNvbnRhY3REdXJhdGlvbjp7fSxuYW1lOnt9LGRlc2NyaXB0aW9uOnt9LHJlZmVyZW5jZXM6e3NoYXBlOiJTciJ9LGluaXRpYXRpb25NZXRob2Q6e30sY29udGFjdEZlYXR1cmVzOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F0dGFjaG1lbnRzRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LG1lc3NhZ2luZ01hcmtkb3duRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LG11bHRpUGFydHlDb25mZXJlbmNlRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ0VuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxzY3JlZW5SZWNvcmRpbmdTdGF0ZTp7fSxzY3JlZW5SZWNvcmRpbmdDb25maWc6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7c2NyZWVuUmVjb3JkaW5nRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ1N0YXRlOnt9fX19fSxjaGFubmVsQ29udGV4dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzY2hlZHVsZWRUaW1lOnt0eXBlOiJsb25nIn0sdGFza1RlbXBsYXRlSWQ6e30sdGFza1RlbXBsYXRlVmVyc2lvbjp7dHlwZToiaW50ZWdlciJ9fX0sc2VnbWVudEF0dHJpYnV0ZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1ZhbHVlU3RyaW5nOnt9fX19fX19LHNuYXBzaG90VGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LG5leHRUb2tlbjp7fX19fSxHZXRBZ2VudFN0YXRlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic3RhdGVzIl0sbWVtYmVyczp7c3RhdGVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTMjkifX0sbmV4dFRva2VuOnt9fX19LEdldERpYWxhYmxlQ291bnRyeUNvZGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb3VudHJ5Q29kZXMiXSxtZW1iZXJzOntjb3VudHJ5Q29kZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbmV4dFRva2VuOnt9fX19LEdldEVuZHBvaW50czp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsInF1ZXVlQVJOcyJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxxdWV1ZUFSTnM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntlbmRwb2ludHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlNlIn19LG5leHRUb2tlbjp7fX19fSxHZXROZXdBdXRoVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJyZWZyZXNoVG9rZW4iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0scmVmcmVzaFRva2VuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e25ld0F1dGhUb2tlbjp7fSxleHBpcmF0aW9uRGF0ZVRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9fX19LEdldFJvdXRpbmdQcm9maWxlUXVldWVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwicm91dGluZ1Byb2ZpbGVBUk4iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0scm91dGluZ1Byb2ZpbGVBUk46e30sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInF1ZXVlcyJdLG1lbWJlcnM6e3F1ZXVlczp7dHlwZToibGlzdCIsbWVtYmVyOntzaGFwZToiU2sifX0sbmV4dFRva2VuOnt9fX19LEhvbGRDb25uZWN0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LE11dGVQYXJ0aWNpcGFudDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImNvbm5lY3Rpb25JZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY29ubmVjdGlvbklkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxOb3RpZnlDb250YWN0SXNzdWU6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGlzc3VlQ29kZTp7fSxkZXNjcmlwdGlvbjp7fSxjbGllbnRMb2dzOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxQYXVzZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxQdXRBZ2VudFN0YXRlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwic3RhdGUiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sc3RhdGU6e3NoYXBlOiJTMjkifSxlbnF1ZXVlTmV4dFN0YXRlOnt0eXBlOiJib29sZWFuIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlamVjdENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxSZXN1bWVDb25uZWN0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlc3VtZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kQ2xpZW50TG9nczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImxvZ0V2ZW50cyJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxsb2dFdmVudHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9LGNvbXBvbmVudDp7fSxtZXNzYWdlOnt9fX19fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kRGlnaXRzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIiwiZGlnaXRzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e30sZGlnaXRzOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kU29mdHBob25lQ2FsbE1ldHJpY3M6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjY3BWZXJzaW9uOnt9LHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6e3NoYXBlOiJTNGYifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sU2VuZFNvZnRwaG9uZUNhbGxSZXBvcnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJyZXBvcnQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNjcFZlcnNpb246e30scmVwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NhbGxTdGFydFRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9LGNhbGxFbmRUaW1lOnt0eXBlOiJ0aW1lc3RhbXAifSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOntzaGFwZToiUzRmIn0sZ3VtVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGluaXRpYWxpemF0aW9uVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGljZUNvbGxlY3Rpb25UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0sc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saGFuZHNoYWtlVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LHByZVRhbGtUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0sdGFsa1RpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxjbGVhbnVwVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGljZUNvbGxlY3Rpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn0saGFuZHNoYWtlRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGd1bU90aGVyRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGd1bVRpbWVvdXRGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sY3JlYXRlT2ZmZXJGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSx1c2VyQnVzeUZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxpbnZhbGlkUmVtb3RlU0RQRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LG5vUmVtb3RlSWNlQ2FuZGlkYXRlRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LHNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFRvZ2dsZUFjdGl2ZUNvbm5lY3Rpb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVubXV0ZVBhcnRpY2lwYW50OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbmZpZ3VyYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29uZmlndXJhdGlvbjp7c2hhcGU6IlMxcSJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVcGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiLCJ0YXJnZXRNb25pdG9yTW9kZSJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fSx0YXJnZXRNb25pdG9yTW9kZTp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX19LHNoYXBlczp7UzI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnRBUk46e30sYXV0aFRva2VuOnt9fX0sU2U6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIl0sbWVtYmVyczp7ZW5kcG9pbnRBUk46e30sdHlwZTp7fSxuYW1lOnt9LHBob25lTnVtYmVyOnt9LGFnZW50TG9naW46e30scXVldWU6e3NoYXBlOiJTayJ9fX0sU2s6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7cXVldWVBUk46e30sbmFtZTp7fX19LFNyOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInZhbHVlIiwidHlwZSJdLG1lbWJlcnM6e3ZhbHVlOnt9LHR5cGU6e319fX0sUzFxOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibmFtZSIsInNvZnRwaG9uZUVuYWJsZWQiLCJzb2Z0cGhvbmVBdXRvQWNjZXB0IiwiZXh0ZW5zaW9uIiwicm91dGluZ1Byb2ZpbGUiXSxtZW1iZXJzOntuYW1lOnt9LHVzZXJuYW1lOnt9LHNvZnRwaG9uZUVuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxzb2Z0cGhvbmVBdXRvQWNjZXB0Ont0eXBlOiJib29sZWFuIn0sZXh0ZW5zaW9uOnt9LHJvdXRpbmdQcm9maWxlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e25hbWU6e30scm91dGluZ1Byb2ZpbGVBUk46e30sZGVmYXVsdE91dGJvdW5kUXVldWU6e3NoYXBlOiJTayJ9LGNoYW5uZWxDb25jdXJyZW5jeU1hcDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6ImxvbmcifX19fSxhZ2VudFByZWZlcmVuY2VzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sYWdlbnRBUk46e319fSxTMjk6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwibmFtZSJdLG1lbWJlcnM6e2FnZW50U3RhdGVBUk46e30sdHlwZTp7fSxuYW1lOnt9LHN0YXJ0VGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LFM0Zjp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3RpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn0sc29mdHBob25lU3RyZWFtVHlwZTp7fSxwYWNrZXRDb3VudDp7dHlwZToibG9uZyJ9LHBhY2tldHNMb3N0Ont0eXBlOiJsb25nIn0sYXVkaW9MZXZlbDp7dHlwZToiZG91YmxlIn0saml0dGVyQnVmZmVyTWlsbGlzOnt0eXBlOiJsb25nIn0scm91bmRUcmlwVGltZU1pbGxpczp7dHlwZToibG9uZyJ9fX19fX19LHt9XSw0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXthY206e25hbWU6IkFDTSIsY29yczohMH0sYXBpZ2F0ZXdheTp7bmFtZToiQVBJR2F0ZXdheSIsY29yczohMH0sYXBwbGljYXRpb25hdXRvc2NhbGluZzp7cHJlZml4OiJhcHBsaWNhdGlvbi1hdXRvc2NhbGluZyIsbmFtZToiQXBwbGljYXRpb25BdXRvU2NhbGluZyIsY29yczohMH0sYXBwc3RyZWFtOntuYW1lOiJBcHBTdHJlYW0ifSxhdXRvc2NhbGluZzp7bmFtZToiQXV0b1NjYWxpbmciLGNvcnM6ITB9LGJhdGNoOntuYW1lOiJCYXRjaCJ9LGJ1ZGdldHM6e25hbWU6IkJ1ZGdldHMifSxjbG91ZGRpcmVjdG9yeTp7bmFtZToiQ2xvdWREaXJlY3RvcnkiLHZlcnNpb25zOlsiMjAxNi0wNS0xMCoiXX0sY2xvdWRmb3JtYXRpb246e25hbWU6IkNsb3VkRm9ybWF0aW9uIixjb3JzOiEwfSxjbG91ZGZyb250OntuYW1lOiJDbG91ZEZyb250Iix2ZXJzaW9uczpbIjIwMTMtMDUtMTIqIiwiMjAxMy0xMS0xMSoiLCIyMDE0LTA1LTMxKiIsIjIwMTQtMTAtMjEqIiwiMjAxNC0xMS0wNioiLCIyMDE1LTA0LTE3KiIsIjIwMTUtMDctMjcqIiwiMjAxNS0wOS0xNyoiLCIyMDE2LTAxLTEzKiIsIjIwMTYtMDEtMjgqIiwiMjAxNi0wOC0wMSoiLCIyMDE2LTA4LTIwKiIsIjIwMTYtMDktMDcqIiwiMjAxNi0wOS0yOSoiLCIyMDE2LTExLTI1KiIsIjIwMTctMDMtMjUqIiwiMjAxNy0xMC0zMCoiLCIyMDE4LTA2LTE4KiIsIjIwMTgtMTEtMDUqIiwiMjAxOS0wMy0yNioiXSxjb3JzOiEwfSxjbG91ZGhzbTp7bmFtZToiQ2xvdWRIU00iLGNvcnM6ITB9LGNsb3Vkc2VhcmNoOntuYW1lOiJDbG91ZFNlYXJjaCJ9LGNsb3Vkc2VhcmNoZG9tYWluOntuYW1lOiJDbG91ZFNlYXJjaERvbWFpbiJ9LGNsb3VkdHJhaWw6e25hbWU6IkNsb3VkVHJhaWwiLGNvcnM6ITB9LGNsb3Vkd2F0Y2g6e3ByZWZpeDoibW9uaXRvcmluZyIsbmFtZToiQ2xvdWRXYXRjaCIsY29yczohMH0sY2xvdWR3YXRjaGV2ZW50czp7cHJlZml4OiJldmVudHMiLG5hbWU6IkNsb3VkV2F0Y2hFdmVudHMiLHZlcnNpb25zOlsiMjAxNC0wMi0wMyoiXSxjb3JzOiEwfSxjbG91ZHdhdGNobG9nczp7cHJlZml4OiJsb2dzIixuYW1lOiJDbG91ZFdhdGNoTG9ncyIsY29yczohMH0sY29kZWJ1aWxkOntuYW1lOiJDb2RlQnVpbGQiLGNvcnM6ITB9LGNvZGVjb21taXQ6e25hbWU6IkNvZGVDb21taXQiLGNvcnM6ITB9LGNvZGVkZXBsb3k6e25hbWU6IkNvZGVEZXBsb3kiLGNvcnM6ITB9LGNvZGVwaXBlbGluZTp7bmFtZToiQ29kZVBpcGVsaW5lIixjb3JzOiEwfSxjb2duaXRvaWRlbnRpdHk6e3ByZWZpeDoiY29nbml0by1pZGVudGl0eSIsbmFtZToiQ29nbml0b0lkZW50aXR5Iixjb3JzOiEwfSxjb2duaXRvaWRlbnRpdHlzZXJ2aWNlcHJvdmlkZXI6e3ByZWZpeDoiY29nbml0by1pZHAiLG5hbWU6IkNvZ25pdG9JZGVudGl0eVNlcnZpY2VQcm92aWRlciIsY29yczohMH0sY29nbml0b3N5bmM6e3ByZWZpeDoiY29nbml0by1zeW5jIixuYW1lOiJDb2duaXRvU3luYyIsY29yczohMH0sY29uZmlnc2VydmljZTp7cHJlZml4OiJjb25maWciLG5hbWU6IkNvbmZpZ1NlcnZpY2UiLGNvcnM6ITB9LGN1cjp7bmFtZToiQ1VSIixjb3JzOiEwfSxkYXRhcGlwZWxpbmU6e25hbWU6IkRhdGFQaXBlbGluZSJ9LGRldmljZWZhcm06e25hbWU6IkRldmljZUZhcm0iLGNvcnM6ITB9LGRpcmVjdGNvbm5lY3Q6e25hbWU6IkRpcmVjdENvbm5lY3QiLGNvcnM6ITB9LGRpcmVjdG9yeXNlcnZpY2U6e3ByZWZpeDoiZHMiLG5hbWU6IkRpcmVjdG9yeVNlcnZpY2UifSxkaXNjb3Zlcnk6e25hbWU6IkRpc2NvdmVyeSJ9LGRtczp7bmFtZToiRE1TIn0sZHluYW1vZGI6e25hbWU6IkR5bmFtb0RCIixjb3JzOiEwfSxkeW5hbW9kYnN0cmVhbXM6e3ByZWZpeDoic3RyZWFtcy5keW5hbW9kYiIsbmFtZToiRHluYW1vREJTdHJlYW1zIixjb3JzOiEwfSxlYzI6e25hbWU6IkVDMiIsdmVyc2lvbnM6WyIyMDEzLTA2LTE1KiIsIjIwMTMtMTAtMTUqIiwiMjAxNC0wMi0wMSoiLCIyMDE0LTA1LTAxKiIsIjIwMTQtMDYtMTUqIiwiMjAxNC0wOS0wMSoiLCIyMDE0LTEwLTAxKiIsIjIwMTUtMDMtMDEqIiwiMjAxNS0wNC0xNSoiLCIyMDE1LTEwLTAxKiIsIjIwMTYtMDQtMDEqIiwiMjAxNi0wOS0xNSoiXSxjb3JzOiEwfSxlY3I6e25hbWU6IkVDUiIsY29yczohMH0sZWNzOntuYW1lOiJFQ1MiLGNvcnM6ITB9LGVmczp7cHJlZml4OiJlbGFzdGljZmlsZXN5c3RlbSIsbmFtZToiRUZTIixjb3JzOiEwfSxlbGFzdGljYWNoZTp7bmFtZToiRWxhc3RpQ2FjaGUiLHZlcnNpb25zOlsiMjAxMi0xMS0xNSoiLCIyMDE0LTAzLTI0KiIsIjIwMTQtMDctMTUqIiwiMjAxNC0wOS0zMCoiXSxjb3JzOiEwfSxlbGFzdGljYmVhbnN0YWxrOntuYW1lOiJFbGFzdGljQmVhbnN0YWxrIixjb3JzOiEwfSxlbGI6e3ByZWZpeDoiZWxhc3RpY2xvYWRiYWxhbmNpbmciLG5hbWU6IkVMQiIsY29yczohMH0sZWxidjI6e3ByZWZpeDoiZWxhc3RpY2xvYWRiYWxhbmNpbmd2MiIsbmFtZToiRUxCdjIiLGNvcnM6ITB9LGVtcjp7cHJlZml4OiJlbGFzdGljbWFwcmVkdWNlIixuYW1lOiJFTVIiLGNvcnM6ITB9LGVzOntuYW1lOiJFUyJ9LGVsYXN0aWN0cmFuc2NvZGVyOntuYW1lOiJFbGFzdGljVHJhbnNjb2RlciIsY29yczohMH0sZmlyZWhvc2U6e25hbWU6IkZpcmVob3NlIixjb3JzOiEwfSxnYW1lbGlmdDp7bmFtZToiR2FtZUxpZnQiLGNvcnM6ITB9LGdsYWNpZXI6e25hbWU6IkdsYWNpZXIifSxoZWFsdGg6e25hbWU6IkhlYWx0aCJ9LGlhbTp7bmFtZToiSUFNIixjb3JzOiEwfSxpbXBvcnRleHBvcnQ6e25hbWU6IkltcG9ydEV4cG9ydCJ9LGluc3BlY3Rvcjp7bmFtZToiSW5zcGVjdG9yIix2ZXJzaW9uczpbIjIwMTUtMDgtMTgqIl0sY29yczohMH0saW90OntuYW1lOiJJb3QiLGNvcnM6ITB9LGlvdGRhdGE6e3ByZWZpeDoiaW90LWRhdGEiLG5hbWU6IklvdERhdGEiLGNvcnM6ITB9LGtpbmVzaXM6e25hbWU6IktpbmVzaXMiLGNvcnM6ITB9LGtpbmVzaXNhbmFseXRpY3M6e25hbWU6IktpbmVzaXNBbmFseXRpY3MifSxrbXM6e25hbWU6IktNUyIsY29yczohMH0sbGFtYmRhOntuYW1lOiJMYW1iZGEiLGNvcnM6ITB9LGxleHJ1bnRpbWU6e3ByZWZpeDoicnVudGltZS5sZXgiLG5hbWU6IkxleFJ1bnRpbWUiLGNvcnM6ITB9LGxpZ2h0c2FpbDp7bmFtZToiTGlnaHRzYWlsIn0sbWFjaGluZWxlYXJuaW5nOntuYW1lOiJNYWNoaW5lTGVhcm5pbmciLGNvcnM6ITB9LG1hcmtldHBsYWNlY29tbWVyY2VhbmFseXRpY3M6e25hbWU6Ik1hcmtldHBsYWNlQ29tbWVyY2VBbmFseXRpY3MiLGNvcnM6ITB9LG1hcmtldHBsYWNlbWV0ZXJpbmc6e3ByZWZpeDoibWV0ZXJpbmdtYXJrZXRwbGFjZSIsbmFtZToiTWFya2V0cGxhY2VNZXRlcmluZyJ9LG10dXJrOntwcmVmaXg6Im10dXJrLXJlcXVlc3RlciIsbmFtZToiTVR1cmsiLGNvcnM6ITB9LG1vYmlsZWFuYWx5dGljczp7bmFtZToiTW9iaWxlQW5hbHl0aWNzIixjb3JzOiEwfSxvcHN3b3Jrczp7bmFtZToiT3BzV29ya3MiLGNvcnM6ITB9LG9wc3dvcmtzY206e25hbWU6Ik9wc1dvcmtzQ00ifSxvcmdhbml6YXRpb25zOntuYW1lOiJPcmdhbml6YXRpb25zIn0scGlucG9pbnQ6e25hbWU6IlBpbnBvaW50In0scG9sbHk6e25hbWU6IlBvbGx5Iixjb3JzOiEwfSxyZHM6e25hbWU6IlJEUyIsdmVyc2lvbnM6WyIyMDE0LTA5LTAxKiJdLGNvcnM6ITB9LHJlZHNoaWZ0OntuYW1lOiJSZWRzaGlmdCIsY29yczohMH0scmVrb2duaXRpb246e25hbWU6IlJla29nbml0aW9uIixjb3JzOiEwfSxyZXNvdXJjZWdyb3Vwc3RhZ2dpbmdhcGk6e25hbWU6IlJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSSJ9LHJvdXRlNTM6e25hbWU6IlJvdXRlNTMiLGNvcnM6ITB9LHJvdXRlNTNkb21haW5zOntuYW1lOiJSb3V0ZTUzRG9tYWlucyIsY29yczohMH0sczM6e25hbWU6IlMzIixkdWFsc3RhY2tBdmFpbGFibGU6ITAsY29yczohMH0sczNjb250cm9sOntuYW1lOiJTM0NvbnRyb2wiLGR1YWxzdGFja0F2YWlsYWJsZTohMCx4bWxOb0RlZmF1bHRMaXN0czohMH0sc2VydmljZWNhdGFsb2c6e25hbWU6IlNlcnZpY2VDYXRhbG9nIixjb3JzOiEwfSxzZXM6e3ByZWZpeDoiZW1haWwiLG5hbWU6IlNFUyIsY29yczohMH0sc2hpZWxkOntuYW1lOiJTaGllbGQifSxzaW1wbGVkYjp7cHJlZml4OiJzZGIiLG5hbWU6IlNpbXBsZURCIn0sc21zOntuYW1lOiJTTVMifSxzbm93YmFsbDp7bmFtZToiU25vd2JhbGwifSxzbnM6e25hbWU6IlNOUyIsY29yczohMH0sc3FzOntuYW1lOiJTUVMiLGNvcnM6ITB9LHNzbTp7bmFtZToiU1NNIixjb3JzOiEwfSxzdG9yYWdlZ2F0ZXdheTp7bmFtZToiU3RvcmFnZUdhdGV3YXkiLGNvcnM6ITB9LHN0ZXBmdW5jdGlvbnM6e3ByZWZpeDoic3RhdGVzIixuYW1lOiJTdGVwRnVuY3Rpb25zIn0sc3RzOntuYW1lOiJTVFMiLGNvcnM6ITB9LHN1cHBvcnQ6e25hbWU6IlN1cHBvcnQifSxzd2Y6e25hbWU6IlNXRiJ9LHhyYXk6e25hbWU6IlhSYXkiLGNvcnM6ITB9LHdhZjp7bmFtZToiV0FGIixjb3JzOiEwfSx3YWZyZWdpb25hbDp7cHJlZml4OiJ3YWYtcmVnaW9uYWwiLG5hbWU6IldBRlJlZ2lvbmFsIn0sd29ya2RvY3M6e25hbWU6IldvcmtEb2NzIixjb3JzOiEwfSx3b3Jrc3BhY2VzOntuYW1lOiJXb3JrU3BhY2VzIn0sY29kZXN0YXI6e25hbWU6IkNvZGVTdGFyIn0sbGV4bW9kZWxidWlsZGluZ3NlcnZpY2U6e3ByZWZpeDoibGV4LW1vZGVscyIsbmFtZToiTGV4TW9kZWxCdWlsZGluZ1NlcnZpY2UiLGNvcnM6ITB9LG1hcmtldHBsYWNlZW50aXRsZW1lbnRzZXJ2aWNlOntwcmVmaXg6ImVudGl0bGVtZW50Lm1hcmtldHBsYWNlIixuYW1lOiJNYXJrZXRwbGFjZUVudGl0bGVtZW50U2VydmljZSJ9LGF0aGVuYTp7bmFtZToiQXRoZW5hIixjb3JzOiEwfSxncmVlbmdyYXNzOntuYW1lOiJHcmVlbmdyYXNzIn0sZGF4OntuYW1lOiJEQVgifSxtaWdyYXRpb25odWI6e3ByZWZpeDoiQVdTTWlncmF0aW9uSHViIixuYW1lOiJNaWdyYXRpb25IdWIifSxjbG91ZGhzbXYyOntuYW1lOiJDbG91ZEhTTVYyIixjb3JzOiEwfSxnbHVlOntuYW1lOiJHbHVlIn0sbW9iaWxlOntuYW1lOiJNb2JpbGUifSxwcmljaW5nOntuYW1lOiJQcmljaW5nIixjb3JzOiEwfSxjb3N0ZXhwbG9yZXI6e3ByZWZpeDoiY2UiLG5hbWU6IkNvc3RFeHBsb3JlciIsY29yczohMH0sbWVkaWFjb252ZXJ0OntuYW1lOiJNZWRpYUNvbnZlcnQifSxtZWRpYWxpdmU6e25hbWU6Ik1lZGlhTGl2ZSJ9LG1lZGlhcGFja2FnZTp7bmFtZToiTWVkaWFQYWNrYWdlIn0sbWVkaWFzdG9yZTp7bmFtZToiTWVkaWFTdG9yZSJ9LG1lZGlhc3RvcmVkYXRhOntwcmVmaXg6Im1lZGlhc3RvcmUtZGF0YSIsbmFtZToiTWVkaWFTdG9yZURhdGEiLGNvcnM6ITB9LGFwcHN5bmM6e25hbWU6IkFwcFN5bmMifSxndWFyZGR1dHk6e25hbWU6Ikd1YXJkRHV0eSJ9LG1xOntuYW1lOiJNUSJ9LGNvbXByZWhlbmQ6e25hbWU6IkNvbXByZWhlbmQiLGNvcnM6ITB9LGlvdGpvYnNkYXRhcGxhbmU6e3ByZWZpeDoiaW90LWpvYnMtZGF0YSIsbmFtZToiSW9USm9ic0RhdGFQbGFuZSJ9LGtpbmVzaXN2aWRlb2FyY2hpdmVkbWVkaWE6e3ByZWZpeDoia2luZXNpcy12aWRlby1hcmNoaXZlZC1tZWRpYSIsbmFtZToiS2luZXNpc1ZpZGVvQXJjaGl2ZWRNZWRpYSIsY29yczohMH0sa2luZXNpc3ZpZGVvbWVkaWE6e3ByZWZpeDoia2luZXNpcy12aWRlby1tZWRpYSIsbmFtZToiS2luZXNpc1ZpZGVvTWVkaWEiLGNvcnM6ITB9LGtpbmVzaXN2aWRlbzp7bmFtZToiS2luZXNpc1ZpZGVvIixjb3JzOiEwfSxzYWdlbWFrZXJydW50aW1lOntwcmVmaXg6InJ1bnRpbWUuc2FnZW1ha2VyIixuYW1lOiJTYWdlTWFrZXJSdW50aW1lIn0sc2FnZW1ha2VyOntuYW1lOiJTYWdlTWFrZXIifSx0cmFuc2xhdGU6e25hbWU6IlRyYW5zbGF0ZSIsY29yczohMH0scmVzb3VyY2Vncm91cHM6e3ByZWZpeDoicmVzb3VyY2UtZ3JvdXBzIixuYW1lOiJSZXNvdXJjZUdyb3VwcyIsY29yczohMH0sYWxleGFmb3JidXNpbmVzczp7bmFtZToiQWxleGFGb3JCdXNpbmVzcyJ9LGNsb3VkOTp7bmFtZToiQ2xvdWQ5In0sc2VydmVybGVzc2FwcGxpY2F0aW9ucmVwb3NpdG9yeTp7cHJlZml4OiJzZXJ2ZXJsZXNzcmVwbyIsbmFtZToiU2VydmVybGVzc0FwcGxpY2F0aW9uUmVwb3NpdG9yeSJ9LHNlcnZpY2VkaXNjb3Zlcnk6e25hbWU6IlNlcnZpY2VEaXNjb3ZlcnkifSx3b3JrbWFpbDp7bmFtZToiV29ya01haWwifSxhdXRvc2NhbGluZ3BsYW5zOntwcmVmaXg6ImF1dG9zY2FsaW5nLXBsYW5zIixuYW1lOiJBdXRvU2NhbGluZ1BsYW5zIn0sdHJhbnNjcmliZXNlcnZpY2U6e3ByZWZpeDoidHJhbnNjcmliZSIsbmFtZToiVHJhbnNjcmliZVNlcnZpY2UifSxjb25uZWN0OntuYW1lOiJDb25uZWN0Iixjb3JzOiEwfSxhY21wY2E6e3ByZWZpeDoiYWNtLXBjYSIsbmFtZToiQUNNUENBIn0sZm1zOntuYW1lOiJGTVMifSxzZWNyZXRzbWFuYWdlcjp7bmFtZToiU2VjcmV0c01hbmFnZXIiLGNvcnM6ITB9LGlvdGFuYWx5dGljczp7bmFtZToiSW9UQW5hbHl0aWNzIixjb3JzOiEwfSxpb3QxY2xpY2tkZXZpY2Vzc2VydmljZTp7cHJlZml4OiJpb3QxY2xpY2stZGV2aWNlcyIsbmFtZToiSW9UMUNsaWNrRGV2aWNlc1NlcnZpY2UifSxpb3QxY2xpY2twcm9qZWN0czp7cHJlZml4OiJpb3QxY2xpY2stcHJvamVjdHMiLG5hbWU6IklvVDFDbGlja1Byb2plY3RzIn0scGk6e25hbWU6IlBJIn0sbmVwdHVuZTp7bmFtZToiTmVwdHVuZSJ9LG1lZGlhdGFpbG9yOntuYW1lOiJNZWRpYVRhaWxvciJ9LGVrczp7bmFtZToiRUtTIn0sbWFjaWU6e25hbWU6Ik1hY2llIn0sZGxtOntuYW1lOiJETE0ifSxzaWduZXI6e25hbWU6IlNpZ25lciJ9LGNoaW1lOntuYW1lOiJDaGltZSJ9LHBpbnBvaW50ZW1haWw6e3ByZWZpeDoicGlucG9pbnQtZW1haWwiLG5hbWU6IlBpbnBvaW50RW1haWwifSxyYW06e25hbWU6IlJBTSJ9LHJvdXRlNTNyZXNvbHZlcjp7bmFtZToiUm91dGU1M1Jlc29sdmVyIn0scGlucG9pbnRzbXN2b2ljZTp7cHJlZml4OiJzbXMtdm9pY2UiLG5hbWU6IlBpbnBvaW50U01TVm9pY2UifSxxdWlja3NpZ2h0OntuYW1lOiJRdWlja1NpZ2h0In0scmRzZGF0YXNlcnZpY2U6e3ByZWZpeDoicmRzLWRhdGEiLG5hbWU6IlJEU0RhdGFTZXJ2aWNlIn0sYW1wbGlmeTp7bmFtZToiQW1wbGlmeSJ9LGRhdGFzeW5jOntuYW1lOiJEYXRhU3luYyJ9LHJvYm9tYWtlcjp7bmFtZToiUm9ib01ha2VyIn0sdHJhbnNmZXI6e25hbWU6IlRyYW5zZmVyIn0sZ2xvYmFsYWNjZWxlcmF0b3I6e25hbWU6Ikdsb2JhbEFjY2VsZXJhdG9yIn0sY29tcHJlaGVuZG1lZGljYWw6e25hbWU6IkNvbXByZWhlbmRNZWRpY2FsIixjb3JzOiEwfSxraW5lc2lzYW5hbHl0aWNzdjI6e25hbWU6IktpbmVzaXNBbmFseXRpY3NWMiJ9LG1lZGlhY29ubmVjdDp7bmFtZToiTWVkaWFDb25uZWN0In0sZnN4OntuYW1lOiJGU3gifSxzZWN1cml0eWh1Yjp7bmFtZToiU2VjdXJpdHlIdWIifSxhcHBtZXNoOntuYW1lOiJBcHBNZXNoIix2ZXJzaW9uczpbIjIwMTgtMTAtMDEqIl19LGxpY2Vuc2VtYW5hZ2VyOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlciIsbmFtZToiTGljZW5zZU1hbmFnZXIifSxrYWZrYTp7bmFtZToiS2Fma2EifSxhcGlnYXRld2F5bWFuYWdlbWVudGFwaTp7bmFtZToiQXBpR2F0ZXdheU1hbmFnZW1lbnRBcGkifSxhcGlnYXRld2F5djI6e25hbWU6IkFwaUdhdGV3YXlWMiJ9LGRvY2RiOntuYW1lOiJEb2NEQiJ9LGJhY2t1cDp7bmFtZToiQmFja3VwIn0sd29ya2xpbms6e25hbWU6IldvcmtMaW5rIn0sdGV4dHJhY3Q6e25hbWU6IlRleHRyYWN0In0sbWFuYWdlZGJsb2NrY2hhaW46e25hbWU6Ik1hbmFnZWRCbG9ja2NoYWluIn0sbWVkaWFwYWNrYWdldm9kOntwcmVmaXg6Im1lZGlhcGFja2FnZS12b2QiLG5hbWU6Ik1lZGlhUGFja2FnZVZvZCJ9LGdyb3VuZHN0YXRpb246e25hbWU6Ikdyb3VuZFN0YXRpb24ifSxpb3R0aGluZ3NncmFwaDp7bmFtZToiSW9UVGhpbmdzR3JhcGgifSxpb3RldmVudHM6e25hbWU6IklvVEV2ZW50cyJ9LGlvdGV2ZW50c2RhdGE6e3ByZWZpeDoiaW90ZXZlbnRzLWRhdGEiLG5hbWU6IklvVEV2ZW50c0RhdGEifSxwZXJzb25hbGl6ZTp7bmFtZToiUGVyc29uYWxpemUiLGNvcnM6ITB9LHBlcnNvbmFsaXplZXZlbnRzOntwcmVmaXg6InBlcnNvbmFsaXplLWV2ZW50cyIsbmFtZToiUGVyc29uYWxpemVFdmVudHMiLGNvcnM6ITB9LHBlcnNvbmFsaXplcnVudGltZTp7cHJlZml4OiJwZXJzb25hbGl6ZS1ydW50aW1lIixuYW1lOiJQZXJzb25hbGl6ZVJ1bnRpbWUiLGNvcnM6ITB9LGFwcGxpY2F0aW9uaW5zaWdodHM6e3ByZWZpeDoiYXBwbGljYXRpb24taW5zaWdodHMiLG5hbWU6IkFwcGxpY2F0aW9uSW5zaWdodHMifSxzZXJ2aWNlcXVvdGFzOntwcmVmaXg6InNlcnZpY2UtcXVvdGFzIixuYW1lOiJTZXJ2aWNlUXVvdGFzIn0sZWMyaW5zdGFuY2Vjb25uZWN0OntwcmVmaXg6ImVjMi1pbnN0YW5jZS1jb25uZWN0IixuYW1lOiJFQzJJbnN0YW5jZUNvbm5lY3QifSxldmVudGJyaWRnZTp7bmFtZToiRXZlbnRCcmlkZ2UifSxsYWtlZm9ybWF0aW9uOntuYW1lOiJMYWtlRm9ybWF0aW9uIn0sZm9yZWNhc3RzZXJ2aWNlOntwcmVmaXg6ImZvcmVjYXN0IixuYW1lOiJGb3JlY2FzdFNlcnZpY2UiLGNvcnM6ITB9LGZvcmVjYXN0cXVlcnlzZXJ2aWNlOntwcmVmaXg6ImZvcmVjYXN0cXVlcnkiLG5hbWU6IkZvcmVjYXN0UXVlcnlTZXJ2aWNlIixjb3JzOiEwfSxxbGRiOntuYW1lOiJRTERCIn0scWxkYnNlc3Npb246e3ByZWZpeDoicWxkYi1zZXNzaW9uIixuYW1lOiJRTERCU2Vzc2lvbiJ9LHdvcmttYWlsbWVzc2FnZWZsb3c6e25hbWU6IldvcmtNYWlsTWVzc2FnZUZsb3cifSxjb2Rlc3Rhcm5vdGlmaWNhdGlvbnM6e3ByZWZpeDoiY29kZXN0YXItbm90aWZpY2F0aW9ucyIsbmFtZToiQ29kZVN0YXJOb3RpZmljYXRpb25zIn0sc2F2aW5nc3BsYW5zOntuYW1lOiJTYXZpbmdzUGxhbnMifSxzc286e25hbWU6IlNTTyJ9LHNzb29pZGM6e3ByZWZpeDoic3NvLW9pZGMiLG5hbWU6IlNTT09JREMifSxtYXJrZXRwbGFjZWNhdGFsb2c6e3ByZWZpeDoibWFya2V0cGxhY2UtY2F0YWxvZyIsbmFtZToiTWFya2V0cGxhY2VDYXRhbG9nIixjb3JzOiEwfSxkYXRhZXhjaGFuZ2U6e25hbWU6IkRhdGFFeGNoYW5nZSJ9LHNlc3YyOntuYW1lOiJTRVNWMiJ9LG1pZ3JhdGlvbmh1YmNvbmZpZzp7cHJlZml4OiJtaWdyYXRpb25odWItY29uZmlnIixuYW1lOiJNaWdyYXRpb25IdWJDb25maWcifSxjb25uZWN0cGFydGljaXBhbnQ6e25hbWU6IkNvbm5lY3RQYXJ0aWNpcGFudCJ9LGFwcGNvbmZpZzp7bmFtZToiQXBwQ29uZmlnIn0saW90c2VjdXJldHVubmVsaW5nOntuYW1lOiJJb1RTZWN1cmVUdW5uZWxpbmcifSx3YWZ2Mjp7bmFtZToiV0FGVjIifSxlbGFzdGljaW5mZXJlbmNlOntwcmVmaXg6ImVsYXN0aWMtaW5mZXJlbmNlIixuYW1lOiJFbGFzdGljSW5mZXJlbmNlIn0saW1hZ2VidWlsZGVyOntuYW1lOiJJbWFnZWJ1aWxkZXIifSxzY2hlbWFzOntuYW1lOiJTY2hlbWFzIn0sYWNjZXNzYW5hbHl6ZXI6e25hbWU6IkFjY2Vzc0FuYWx5emVyIn0sY29kZWd1cnVyZXZpZXdlcjp7cHJlZml4OiJjb2RlZ3VydS1yZXZpZXdlciIsbmFtZToiQ29kZUd1cnVSZXZpZXdlciJ9LGNvZGVndXJ1cHJvZmlsZXI6e25hbWU6IkNvZGVHdXJ1UHJvZmlsZXIifSxjb21wdXRlb3B0aW1pemVyOntwcmVmaXg6ImNvbXB1dGUtb3B0aW1pemVyIixuYW1lOiJDb21wdXRlT3B0aW1pemVyIn0sZnJhdWRkZXRlY3Rvcjp7bmFtZToiRnJhdWREZXRlY3RvciJ9LGtlbmRyYTp7bmFtZToiS2VuZHJhIn0sbmV0d29ya21hbmFnZXI6e25hbWU6Ik5ldHdvcmtNYW5hZ2VyIn0sb3V0cG9zdHM6e25hbWU6Ik91dHBvc3RzIn0sYXVnbWVudGVkYWlydW50aW1lOntwcmVmaXg6InNhZ2VtYWtlci1hMmktcnVudGltZSIsbmFtZToiQXVnbWVudGVkQUlSdW50aW1lIn0sZWJzOntuYW1lOiJFQlMifSxraW5lc2lzdmlkZW9zaWduYWxpbmdjaGFubmVsczp7cHJlZml4OiJraW5lc2lzLXZpZGVvLXNpZ25hbGluZyIsbmFtZToiS2luZXNpc1ZpZGVvU2lnbmFsaW5nQ2hhbm5lbHMiLGNvcnM6ITB9LGRldGVjdGl2ZTp7bmFtZToiRGV0ZWN0aXZlIn0sY29kZXN0YXJjb25uZWN0aW9uczp7cHJlZml4OiJjb2Rlc3Rhci1jb25uZWN0aW9ucyIsbmFtZToiQ29kZVN0YXJjb25uZWN0aW9ucyJ9LHN5bnRoZXRpY3M6e25hbWU6IlN5bnRoZXRpY3MifSxpb3RzaXRld2lzZTp7bmFtZToiSW9UU2l0ZVdpc2UifSxtYWNpZTI6e25hbWU6Ik1hY2llMiJ9LGNvZGVhcnRpZmFjdDp7bmFtZToiQ29kZUFydGlmYWN0In0saG9uZXljb2RlOntuYW1lOiJIb25leWNvZGUifSxpdnM6e25hbWU6IklWUyJ9LGJyYWtldDp7bmFtZToiQnJha2V0In0saWRlbnRpdHlzdG9yZTp7bmFtZToiSWRlbnRpdHlTdG9yZSJ9LGFwcGZsb3c6e25hbWU6IkFwcGZsb3cifSxyZWRzaGlmdGRhdGE6e3ByZWZpeDoicmVkc2hpZnQtZGF0YSIsbmFtZToiUmVkc2hpZnREYXRhIn0sc3NvYWRtaW46e3ByZWZpeDoic3NvLWFkbWluIixuYW1lOiJTU09BZG1pbiJ9LHRpbWVzdHJlYW1xdWVyeTp7cHJlZml4OiJ0aW1lc3RyZWFtLXF1ZXJ5IixuYW1lOiJUaW1lc3RyZWFtUXVlcnkifSx0aW1lc3RyZWFtd3JpdGU6e3ByZWZpeDoidGltZXN0cmVhbS13cml0ZSIsbmFtZToiVGltZXN0cmVhbVdyaXRlIn0sczNvdXRwb3N0czp7bmFtZToiUzNPdXRwb3N0cyJ9LGRhdGFicmV3OntuYW1lOiJEYXRhQnJldyJ9LHNlcnZpY2VjYXRhbG9nYXBwcmVnaXN0cnk6e3ByZWZpeDoic2VydmljZWNhdGFsb2ctYXBwcmVnaXN0cnkiLG5hbWU6IlNlcnZpY2VDYXRhbG9nQXBwUmVnaXN0cnkifSxuZXR3b3JrZmlyZXdhbGw6e3ByZWZpeDoibmV0d29yay1maXJld2FsbCIsbmFtZToiTmV0d29ya0ZpcmV3YWxsIn0sbXdhYTp7bmFtZToiTVdBQSJ9LGFtcGxpZnliYWNrZW5kOntuYW1lOiJBbXBsaWZ5QmFja2VuZCJ9LGFwcGludGVncmF0aW9uczp7bmFtZToiQXBwSW50ZWdyYXRpb25zIn0sY29ubmVjdGNvbnRhY3RsZW5zOntwcmVmaXg6ImNvbm5lY3QtY29udGFjdC1sZW5zIixuYW1lOiJDb25uZWN0Q29udGFjdExlbnMifSxkZXZvcHNndXJ1OntwcmVmaXg6ImRldm9wcy1ndXJ1IixuYW1lOiJEZXZPcHNHdXJ1In0sZWNycHVibGljOntwcmVmaXg6ImVjci1wdWJsaWMiLG5hbWU6IkVDUlBVQkxJQyJ9LGxvb2tvdXR2aXNpb246e25hbWU6Ikxvb2tvdXRWaXNpb24ifSxzYWdlbWFrZXJmZWF0dXJlc3RvcmVydW50aW1lOntwcmVmaXg6InNhZ2VtYWtlci1mZWF0dXJlc3RvcmUtcnVudGltZSIsbmFtZToiU2FnZU1ha2VyRmVhdHVyZVN0b3JlUnVudGltZSJ9LGN1c3RvbWVycHJvZmlsZXM6e3ByZWZpeDoiY3VzdG9tZXItcHJvZmlsZXMiLG5hbWU6IkN1c3RvbWVyUHJvZmlsZXMifSxhdWRpdG1hbmFnZXI6e25hbWU6IkF1ZGl0TWFuYWdlciJ9LGVtcmNvbnRhaW5lcnM6e3ByZWZpeDoiZW1yLWNvbnRhaW5lcnMiLG5hbWU6IkVNUmNvbnRhaW5lcnMifSxoZWFsdGhsYWtlOntuYW1lOiJIZWFsdGhMYWtlIn0sc2FnZW1ha2VyZWRnZTp7cHJlZml4OiJzYWdlbWFrZXItZWRnZSIsbmFtZToiU2FnZW1ha2VyRWRnZSJ9LGFtcDp7bmFtZToiQW1wIixjb3JzOiEwfSxncmVlbmdyYXNzdjI6e25hbWU6IkdyZWVuZ3Jhc3NWMiJ9LGlvdGRldmljZWFkdmlzb3I6e25hbWU6IklvdERldmljZUFkdmlzb3IifSxpb3RmbGVldGh1Yjp7bmFtZToiSW9URmxlZXRIdWIifSxpb3R3aXJlbGVzczp7bmFtZToiSW9UV2lyZWxlc3MifSxsb2NhdGlvbjp7bmFtZToiTG9jYXRpb24iLGNvcnM6ITB9LHdlbGxhcmNoaXRlY3RlZDp7bmFtZToiV2VsbEFyY2hpdGVjdGVkIn0sbGV4bW9kZWxzdjI6e3ByZWZpeDoibW9kZWxzLmxleC52MiIsbmFtZToiTGV4TW9kZWxzVjIifSxsZXhydW50aW1ldjI6e3ByZWZpeDoicnVudGltZS5sZXgudjIiLG5hbWU6IkxleFJ1bnRpbWVWMiIsY29yczohMH0sZmlzOntuYW1lOiJGaXMifSxsb29rb3V0bWV0cmljczp7bmFtZToiTG9va291dE1ldHJpY3MifSxtZ246e25hbWU6Ik1nbiJ9LGxvb2tvdXRlcXVpcG1lbnQ6e25hbWU6Ikxvb2tvdXRFcXVpcG1lbnQifSxuaW1ibGU6e25hbWU6Ik5pbWJsZSJ9LGZpbnNwYWNlOntuYW1lOiJGaW5zcGFjZSJ9LGZpbnNwYWNlZGF0YTp7cHJlZml4OiJmaW5zcGFjZS1kYXRhIixuYW1lOiJGaW5zcGFjZWRhdGEifSxzc21jb250YWN0czp7cHJlZml4OiJzc20tY29udGFjdHMiLG5hbWU6IlNTTUNvbnRhY3RzIn0sc3NtaW5jaWRlbnRzOntwcmVmaXg6InNzbS1pbmNpZGVudHMiLG5hbWU6IlNTTUluY2lkZW50cyJ9LGFwcGxpY2F0aW9uY29zdHByb2ZpbGVyOntuYW1lOiJBcHBsaWNhdGlvbkNvc3RQcm9maWxlciJ9LGFwcHJ1bm5lcjp7bmFtZToiQXBwUnVubmVyIn0scHJvdG9uOntuYW1lOiJQcm90b24ifSxyb3V0ZTUzcmVjb3ZlcnljbHVzdGVyOntwcmVmaXg6InJvdXRlNTMtcmVjb3ZlcnktY2x1c3RlciIsbmFtZToiUm91dGU1M1JlY292ZXJ5Q2x1c3RlciJ9LHJvdXRlNTNyZWNvdmVyeWNvbnRyb2xjb25maWc6e3ByZWZpeDoicm91dGU1My1yZWNvdmVyeS1jb250cm9sLWNvbmZpZyIsbmFtZToiUm91dGU1M1JlY292ZXJ5Q29udHJvbENvbmZpZyJ9LHJvdXRlNTNyZWNvdmVyeXJlYWRpbmVzczp7cHJlZml4OiJyb3V0ZTUzLXJlY292ZXJ5LXJlYWRpbmVzcyIsbmFtZToiUm91dGU1M1JlY292ZXJ5UmVhZGluZXNzIn0sY2hpbWVzZGtpZGVudGl0eTp7cHJlZml4OiJjaGltZS1zZGstaWRlbnRpdHkiLG5hbWU6IkNoaW1lU0RLSWRlbnRpdHkifSxjaGltZXNka21lc3NhZ2luZzp7cHJlZml4OiJjaGltZS1zZGstbWVzc2FnaW5nIixuYW1lOiJDaGltZVNES01lc3NhZ2luZyJ9LHNub3dkZXZpY2VtYW5hZ2VtZW50OntwcmVmaXg6InNub3ctZGV2aWNlLW1hbmFnZW1lbnQiLG5hbWU6IlNub3dEZXZpY2VNYW5hZ2VtZW50In0sbWVtb3J5ZGI6e25hbWU6Ik1lbW9yeURCIn0sb3BlbnNlYXJjaDp7bmFtZToiT3BlblNlYXJjaCJ9LGthZmthY29ubmVjdDp7bmFtZToiS2Fma2FDb25uZWN0In0sdm9pY2VpZDp7cHJlZml4OiJ2b2ljZS1pZCIsbmFtZToiVm9pY2VJRCJ9LHdpc2RvbTp7bmFtZToiV2lzZG9tIn0sYWNjb3VudDp7bmFtZToiQWNjb3VudCJ9LGNsb3VkY29udHJvbDp7bmFtZToiQ2xvdWRDb250cm9sIn0sZ3JhZmFuYTp7bmFtZToiR3JhZmFuYSJ9LHBhbm9yYW1hOntuYW1lOiJQYW5vcmFtYSJ9LGNoaW1lc2RrbWVldGluZ3M6e3ByZWZpeDoiY2hpbWUtc2RrLW1lZXRpbmdzIixuYW1lOiJDaGltZVNES01lZXRpbmdzIn0scmVzaWxpZW5jZWh1Yjp7bmFtZToiUmVzaWxpZW5jZWh1YiJ9LG1pZ3JhdGlvbmh1YnN0cmF0ZWd5OntuYW1lOiJNaWdyYXRpb25IdWJTdHJhdGVneSJ9LGFwcGNvbmZpZ2RhdGE6e25hbWU6IkFwcENvbmZpZ0RhdGEifSxkcnM6e25hbWU6IkRycyJ9LG1pZ3JhdGlvbmh1YnJlZmFjdG9yc3BhY2VzOntwcmVmaXg6Im1pZ3JhdGlvbi1odWItcmVmYWN0b3Itc3BhY2VzIixuYW1lOiJNaWdyYXRpb25IdWJSZWZhY3RvclNwYWNlcyJ9LGV2aWRlbnRseTp7bmFtZToiRXZpZGVudGx5In0saW5zcGVjdG9yMjp7bmFtZToiSW5zcGVjdG9yMiJ9LHJiaW46e25hbWU6IlJiaW4ifSxydW06e25hbWU6IlJVTSJ9LGJhY2t1cGdhdGV3YXk6e3ByZWZpeDoiYmFja3VwLWdhdGV3YXkiLG5hbWU6IkJhY2t1cEdhdGV3YXkifSxpb3R0d2lubWFrZXI6e25hbWU6IklvVFR3aW5NYWtlciJ9LHdvcmtzcGFjZXN3ZWI6e3ByZWZpeDoid29ya3NwYWNlcy13ZWIiLG5hbWU6IldvcmtTcGFjZXNXZWIifSxhbXBsaWZ5dWlidWlsZGVyOntuYW1lOiJBbXBsaWZ5VUlCdWlsZGVyIn0sa2V5c3BhY2VzOntuYW1lOiJLZXlzcGFjZXMifSxiaWxsaW5nY29uZHVjdG9yOntuYW1lOiJCaWxsaW5nY29uZHVjdG9yIn0sZ2FtZXNwYXJrczp7bmFtZToiR2FtZVNwYXJrcyJ9LHBpbnBvaW50c21zdm9pY2V2Mjp7cHJlZml4OiJwaW5wb2ludC1zbXMtdm9pY2UtdjIiLG5hbWU6IlBpbnBvaW50U01TVm9pY2VWMiJ9LGl2c2NoYXQ6e25hbWU6Ikl2c2NoYXQifSxjaGltZXNka21lZGlhcGlwZWxpbmVzOntwcmVmaXg6ImNoaW1lLXNkay1tZWRpYS1waXBlbGluZXMiLG5hbWU6IkNoaW1lU0RLTWVkaWFQaXBlbGluZXMifSxlbXJzZXJ2ZXJsZXNzOntwcmVmaXg6ImVtci1zZXJ2ZXJsZXNzIixuYW1lOiJFTVJTZXJ2ZXJsZXNzIn0sbTI6e25hbWU6Ik0yIn0sY29ubmVjdGNhbXBhaWduczp7bmFtZToiQ29ubmVjdENhbXBhaWducyJ9LHJlZHNoaWZ0c2VydmVybGVzczp7cHJlZml4OiJyZWRzaGlmdC1zZXJ2ZXJsZXNzIixuYW1lOiJSZWRzaGlmdFNlcnZlcmxlc3MifSxyb2xlc2FueXdoZXJlOntuYW1lOiJSb2xlc0FueXdoZXJlIn0sbGljZW5zZW1hbmFnZXJ1c2Vyc3Vic2NyaXB0aW9uczp7cHJlZml4OiJsaWNlbnNlLW1hbmFnZXItdXNlci1zdWJzY3JpcHRpb25zIixuYW1lOiJMaWNlbnNlTWFuYWdlclVzZXJTdWJzY3JpcHRpb25zIn0sYmFja3Vwc3RvcmFnZTp7bmFtZToiQmFja3VwU3RvcmFnZSJ9LHByaXZhdGVuZXR3b3Jrczp7bmFtZToiUHJpdmF0ZU5ldHdvcmtzIn0sc3VwcG9ydGFwcDp7cHJlZml4OiJzdXBwb3J0LWFwcCIsbmFtZToiU3VwcG9ydEFwcCJ9LGNvbnRyb2x0b3dlcjp7bmFtZToiQ29udHJvbFRvd2VyIn0saW90ZmxlZXR3aXNlOntuYW1lOiJJb1RGbGVldFdpc2UifSxtaWdyYXRpb25odWJvcmNoZXN0cmF0b3I6e25hbWU6Ik1pZ3JhdGlvbkh1Yk9yY2hlc3RyYXRvciJ9LGNvbm5lY3RjYXNlczp7bmFtZToiQ29ubmVjdENhc2VzIn0scmVzb3VyY2VleHBsb3JlcjI6e3ByZWZpeDoicmVzb3VyY2UtZXhwbG9yZXItMiIsbmFtZToiUmVzb3VyY2VFeHBsb3JlcjIifSxzY2hlZHVsZXI6e25hbWU6IlNjaGVkdWxlciJ9LGNoaW1lc2Rrdm9pY2U6e3ByZWZpeDoiY2hpbWUtc2RrLXZvaWNlIixuYW1lOiJDaGltZVNES1ZvaWNlIn0saW90cm9ib3J1bm5lcjp7cHJlZml4OiJpb3Qtcm9ib3J1bm5lciIsbmFtZToiSW9UUm9ib1J1bm5lciJ9LHNzbXNhcDp7cHJlZml4OiJzc20tc2FwIixuYW1lOiJTc21TYXAifSxvYW06e25hbWU6Ik9BTSJ9LGFyY3pvbmFsc2hpZnQ6e3ByZWZpeDoiYXJjLXpvbmFsLXNoaWZ0IixuYW1lOiJBUkNab25hbFNoaWZ0In0sb21pY3M6e25hbWU6Ik9taWNzIn0sb3BlbnNlYXJjaHNlcnZlcmxlc3M6e25hbWU6Ik9wZW5TZWFyY2hTZXJ2ZXJsZXNzIn0sc2VjdXJpdHlsYWtlOntuYW1lOiJTZWN1cml0eUxha2UifSxzaW1zcGFjZXdlYXZlcjp7bmFtZToiU2ltU3BhY2VXZWF2ZXIifSxkb2NkYmVsYXN0aWM6e3ByZWZpeDoiZG9jZGItZWxhc3RpYyIsbmFtZToiRG9jREJFbGFzdGljIn0sc2FnZW1ha2VyZ2Vvc3BhdGlhbDp7cHJlZml4OiJzYWdlbWFrZXItZ2Vvc3BhdGlhbCIsbmFtZToiU2FnZU1ha2VyR2Vvc3BhdGlhbCJ9LGNvZGVjYXRhbHlzdDp7bmFtZToiQ29kZUNhdGFseXN0In0scGlwZXM6e25hbWU6IlBpcGVzIn0sc2FnZW1ha2VybWV0cmljczp7cHJlZml4OiJzYWdlbWFrZXItbWV0cmljcyIsbmFtZToiU2FnZU1ha2VyTWV0cmljcyJ9LGtpbmVzaXN2aWRlb3dlYnJ0Y3N0b3JhZ2U6e3ByZWZpeDoia2luZXNpcy12aWRlby13ZWJydGMtc3RvcmFnZSIsbmFtZToiS2luZXNpc1ZpZGVvV2ViUlRDU3RvcmFnZSJ9LGxpY2Vuc2VtYW5hZ2VybGludXhzdWJzY3JpcHRpb25zOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlci1saW51eC1zdWJzY3JpcHRpb25zIixuYW1lOiJMaWNlbnNlTWFuYWdlckxpbnV4U3Vic2NyaXB0aW9ucyJ9LGtlbmRyYXJhbmtpbmc6e3ByZWZpeDoia2VuZHJhLXJhbmtpbmciLG5hbWU6IktlbmRyYVJhbmtpbmcifSxjbGVhbnJvb21zOntuYW1lOiJDbGVhblJvb21zIn0sY2xvdWR0cmFpbGRhdGE6e3ByZWZpeDoiY2xvdWR0cmFpbC1kYXRhIixuYW1lOiJDbG91ZFRyYWlsRGF0YSJ9LHRuYjp7bmFtZToiVG5iIn0saW50ZXJuZXRtb25pdG9yOntuYW1lOiJJbnRlcm5ldE1vbml0b3IifSxpdnNyZWFsdGltZTp7cHJlZml4OiJpdnMtcmVhbHRpbWUiLG5hbWU6IklWU1JlYWxUaW1lIn0sdnBjbGF0dGljZTp7cHJlZml4OiJ2cGMtbGF0dGljZSIsbmFtZToiVlBDTGF0dGljZSJ9LG9zaXM6e25hbWU6Ik9TSVMifSxtZWRpYXBhY2thZ2V2Mjp7bmFtZToiTWVkaWFQYWNrYWdlVjIifSxwYXltZW50Y3J5cHRvZ3JhcGh5OntwcmVmaXg6InBheW1lbnQtY3J5cHRvZ3JhcGh5IixuYW1lOiJQYXltZW50Q3J5cHRvZ3JhcGh5In0scGF5bWVudGNyeXB0b2dyYXBoeWRhdGE6e3ByZWZpeDoicGF5bWVudC1jcnlwdG9ncmFwaHktZGF0YSIsbmFtZToiUGF5bWVudENyeXB0b2dyYXBoeURhdGEifSxjb2RlZ3VydXNlY3VyaXR5OntwcmVmaXg6ImNvZGVndXJ1LXNlY3VyaXR5IixuYW1lOiJDb2RlR3VydVNlY3VyaXR5In0sdmVyaWZpZWRwZXJtaXNzaW9uczp7bmFtZToiVmVyaWZpZWRQZXJtaXNzaW9ucyJ9LGFwcGZhYnJpYzp7bmFtZToiQXBwRmFicmljIn0sbWVkaWNhbGltYWdpbmc6e3ByZWZpeDoibWVkaWNhbC1pbWFnaW5nIixuYW1lOiJNZWRpY2FsSW1hZ2luZyJ9LGVudGl0eXJlc29sdXRpb246e25hbWU6IkVudGl0eVJlc29sdXRpb24ifSxtYW5hZ2VkYmxvY2tjaGFpbnF1ZXJ5OntwcmVmaXg6Im1hbmFnZWRibG9ja2NoYWluLXF1ZXJ5IixuYW1lOiJNYW5hZ2VkQmxvY2tjaGFpblF1ZXJ5In0sbmVwdHVuZWRhdGE6e25hbWU6Ik5lcHR1bmVkYXRhIn0scGNhY29ubmVjdG9yYWQ6e3ByZWZpeDoicGNhLWNvbm5lY3Rvci1hZCIsbmFtZToiUGNhQ29ubmVjdG9yQWQifX19LHt9XSw1OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDExLTA2LTE1IixlbmRwb2ludFByZWZpeDoic3RzIixnbG9iYWxFbmRwb2ludDoic3RzLmFtYXpvbmF3cy5jb20iLHByb3RvY29sOiJxdWVyeSIsc2VydmljZUFiYnJldmlhdGlvbjoiQVdTIFNUUyIsc2VydmljZUZ1bGxOYW1lOiJBV1MgU2VjdXJpdHkgVG9rZW4gU2VydmljZSIsc2VydmljZUlkOiJTVFMiLHNpZ25hdHVyZVZlcnNpb246InY0Iix1aWQ6InN0cy0yMDExLTA2LTE1Iix4bWxOYW1lc3BhY2U6Imh0dHBzOi8vc3RzLmFtYXpvbmF3cy5jb20vZG9jLzIwMTEtMDYtMTUvIn0sb3BlcmF0aW9uczp7QXNzdW1lUm9sZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSb2xlQXJuIiwiUm9sZVNlc3Npb25OYW1lIl0sbWVtYmVyczp7Um9sZUFybjp7fSxSb2xlU2Vzc2lvbk5hbWU6e30sUG9saWN5QXJuczp7c2hhcGU6IlM0In0sUG9saWN5Ont9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFRhZ3M6e3NoYXBlOiJTOCJ9LFRyYW5zaXRpdmVUYWdLZXlzOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LEV4dGVybmFsSWQ6e30sU2VyaWFsTnVtYmVyOnt9LFRva2VuQ29kZTp7fSxTb3VyY2VJZGVudGl0eTp7fSxQcm92aWRlZENvbnRleHRzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7UHJvdmlkZXJBcm46e30sQ29udGV4dEFzc2VydGlvbjp7fX19fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNsIn0sQXNzdW1lZFJvbGVVc2VyOntzaGFwZToiU3EifSxQYWNrZWRQb2xpY3lTaXplOnt0eXBlOiJpbnRlZ2VyIn0sU291cmNlSWRlbnRpdHk6e319fX0sQXNzdW1lUm9sZVdpdGhTQU1MOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJvbGVBcm4iLCJQcmluY2lwYWxBcm4iLCJTQU1MQXNzZXJ0aW9uIl0sbWVtYmVyczp7Um9sZUFybjp7fSxQcmluY2lwYWxBcm46e30sU0FNTEFzc2VydGlvbjp7dHlwZToic3RyaW5nIixzZW5zaXRpdmU6ITB9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LFBvbGljeTp7fSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVdpdGhTQU1MUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTcSJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxTdWJqZWN0Ont9LFN1YmplY3RUeXBlOnt9LElzc3Vlcjp7fSxBdWRpZW5jZTp7fSxOYW1lUXVhbGlmaWVyOnt9LFNvdXJjZUlkZW50aXR5Ont9fX19LEFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUm9sZUFybiIsIlJvbGVTZXNzaW9uTmFtZSIsIldlYklkZW50aXR5VG9rZW4iXSxtZW1iZXJzOntSb2xlQXJuOnt9LFJvbGVTZXNzaW9uTmFtZTp7fSxXZWJJZGVudGl0eVRva2VuOnt0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH0sUHJvdmlkZXJJZDp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxQb2xpY3k6e30sRHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHlSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTbCJ9LFN1YmplY3RGcm9tV2ViSWRlbnRpdHlUb2tlbjp7fSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTcSJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxQcm92aWRlcjp7fSxBdWRpZW5jZTp7fSxTb3VyY2VJZGVudGl0eTp7fX19fSxEZWNvZGVBdXRob3JpemF0aW9uTWVzc2FnZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJFbmNvZGVkTWVzc2FnZSJdLG1lbWJlcnM6e0VuY29kZWRNZXNzYWdlOnt9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJEZWNvZGVBdXRob3JpemF0aW9uTWVzc2FnZVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntEZWNvZGVkTWVzc2FnZTp7fX19fSxHZXRBY2Nlc3NLZXlJbmZvOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkFjY2Vzc0tleUlkIl0sbWVtYmVyczp7QWNjZXNzS2V5SWQ6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldEFjY2Vzc0tleUluZm9SZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7QWNjb3VudDp7fX19fSxHZXRDYWxsZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJHZXRDYWxsZXJJZGVudGl0eVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntVc2VySWQ6e30sQWNjb3VudDp7fSxBcm46e319fX0sR2V0RmVkZXJhdGlvblRva2VuOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIk5hbWUiXSxtZW1iZXJzOntOYW1lOnt9LFBvbGljeTp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifSxUYWdzOntzaGFwZToiUzgifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0RmVkZXJhdGlvblRva2VuUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifSxGZWRlcmF0ZWRVc2VyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiRmVkZXJhdGVkVXNlcklkIiwiQXJuIl0sbWVtYmVyczp7RmVkZXJhdGVkVXNlcklkOnt9LEFybjp7fX19LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifX19fSxHZXRTZXNzaW9uVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0R1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFNlcmlhbE51bWJlcjp7fSxUb2tlbkNvZGU6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldFNlc3Npb25Ub2tlblJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNsIn19fX19LHNoYXBlczp7UzQ6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthcm46e319fX0sUzg6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIktleSIsIlZhbHVlIl0sbWVtYmVyczp7S2V5Ont9LFZhbHVlOnt9fX19LFNsOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQWNjZXNzS2V5SWQiLCJTZWNyZXRBY2Nlc3NLZXkiLCJTZXNzaW9uVG9rZW4iLCJFeHBpcmF0aW9uIl0sbWVtYmVyczp7QWNjZXNzS2V5SWQ6e30sU2VjcmV0QWNjZXNzS2V5Ont0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH0sU2Vzc2lvblRva2VuOnt9LEV4cGlyYXRpb246e3R5cGU6InRpbWVzdGFtcCJ9fX0sU3E6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJBc3N1bWVkUm9sZUlkIiwiQXJuIl0sbWVtYmVyczp7QXNzdW1lZFJvbGVJZDp7fSxBcm46e319fX19fSx7fV0sNjpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17cGFnaW5hdGlvbjp7fX19LHt9XSw3OltmdW5jdGlvbihlLHQsbil7ZSgiLi4vbGliL25vZGVfbG9hZGVyIik7dmFyIHI9ZSgiLi4vbGliL2NvcmUiKSxvPXIuU2VydmljZSxpPXIuYXBpTG9hZGVyO2kuc2VydmljZXMuY29nbml0b2lkZW50aXR5PXt9LHIuQ29nbml0b0lkZW50aXR5PW8uZGVmaW5lU2VydmljZSgiY29nbml0b2lkZW50aXR5IixbIjIwMTQtMDYtMzAiXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGkuc2VydmljZXMuY29nbml0b2lkZW50aXR5LCIyMDE0LTA2LTMwIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9ZSgiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAubWluLmpzb24iKTtyZXR1cm4gdC5wYWdpbmF0b3JzPWUoIi4uL2FwaXMvY29nbml0by1pZGVudGl0eS0yMDE0LTA2LTMwLnBhZ2luYXRvcnMuanNvbiIpLnBhZ2luYXRpb24sdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LmV4cG9ydHM9ci5Db2duaXRvSWRlbnRpdHl9LHsiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAubWluLmpzb24iOjEsIi4uL2FwaXMvY29nbml0by1pZGVudGl0eS0yMDE0LTA2LTMwLnBhZ2luYXRvcnMuanNvbiI6MiwiLi4vbGliL2NvcmUiOjE5LCIuLi9saWIvbm9kZV9sb2FkZXIiOjE2fV0sODpbZnVuY3Rpb24oZSx0LG4pe2UoIi4uL2xpYi9ub2RlX2xvYWRlciIpO3ZhciByPWUoIi4uL2xpYi9jb3JlIiksbz1yLlNlcnZpY2UsaT1yLmFwaUxvYWRlcjtpLnNlcnZpY2VzLnN0cz17fSxyLlNUUz1vLmRlZmluZVNlcnZpY2UoInN0cyIsWyIyMDExLTA2LTE1Il0pLGUoIi4uL2xpYi9zZXJ2aWNlcy9zdHMiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5zZXJ2aWNlcy5zdHMsIjIwMTEtMDYtMTUiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1lKCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1Lm1pbi5qc29uIik7cmV0dXJuIHQucGFnaW5hdG9ycz1lKCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1LnBhZ2luYXRvcnMuanNvbiIpLnBhZ2luYXRpb24sdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LmV4cG9ydHM9ci5TVFN9LHsiLi4vYXBpcy9zdHMtMjAxMS0wNi0xNS5taW4uanNvbiI6NSwiLi4vYXBpcy9zdHMtMjAxMS0wNi0xNS5wYWdpbmF0b3JzLmpzb24iOjYsIi4uL2xpYi9jb3JlIjoxOSwiLi4vbGliL25vZGVfbG9hZGVyIjoxNiwiLi4vbGliL3NlcnZpY2VzL3N0cyI6NjN9XSw5OltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe2lmKCFyLnNlcnZpY2VzLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZFNlcnZpY2U6IEZhaWxlZCB0byBsb2FkIGFwaSBmb3IgIitlKTtyZXR1cm4gci5zZXJ2aWNlc1tlXVt0XX1yLnNlcnZpY2VzPXt9LHQuZXhwb3J0cz1yfSx7fV0sMTA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2Jyb3dzZXJIbWFjIiksbz1lKCIuL2Jyb3dzZXJNZDUiKSxpPWUoIi4vYnJvd3NlclNoYTEiKSxzPWUoIi4vYnJvd3NlclNoYTI1NiIpO3QuZXhwb3J0cz17Y3JlYXRlSGFzaDpmdW5jdGlvbihlKXtpZigibWQ1Ij09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIG5ldyBvO2lmKCJzaGEyNTYiPT09ZSlyZXR1cm4gbmV3IHM7aWYoInNoYTEiPT09ZSlyZXR1cm4gbmV3IGk7dGhyb3cgbmV3IEVycm9yKCJIYXNoIGFsZ29yaXRobSAiK2UrIiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIFNESyIpfSxjcmVhdGVIbWFjOmZ1bmN0aW9uKGUsdCl7aWYoIm1kNSI9PT0oZT1lLnRvTG93ZXJDYXNlKCkpKXJldHVybiBuZXcgcihvLHQpO2lmKCJzaGEyNTYiPT09ZSlyZXR1cm4gbmV3IHIocyx0KTtpZigic2hhMSI9PT1lKXJldHVybiBuZXcgcihpLHQpO3Rocm93IG5ldyBFcnJvcigiSE1BQyBhbGdvcml0aG0gIitlKyIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBTREsiKX0sY3JlYXRlU2lnbjpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiY3JlYXRlU2lnbiBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGJyb3dzZXIiKX19fSx7Ii4vYnJvd3NlckhtYWMiOjEyLCIuL2Jyb3dzZXJNZDUiOjEzLCIuL2Jyb3dzZXJTaGExIjoxNCwiLi9icm93c2VyU2hhMjU2IjoxNX1dLDExOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcjsidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ2b2lkIDA9PT1BcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpPi0xfSk7dmFyIG89WyJbb2JqZWN0IEludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLCJbb2JqZWN0IEludDE2QXJyYXldIiwiW29iamVjdCBVaW50MTZBcnJheV0iLCJbb2JqZWN0IEludDMyQXJyYXldIiwiW29iamVjdCBVaW50MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLCJbb2JqZWN0IERhdGFWaWV3XSJdO3QuZXhwb3J0cz17aXNFbXB0eURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlPzA9PT1lLmxlbmd0aDowPT09ZS5ieXRlTGVuZ3RofSxjb252ZXJ0VG9CdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoZT1uZXcgcihlLCJ1dGY4IikpLEFycmF5QnVmZmVyLmlzVmlldyhlKT9uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoL1VpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOm5ldyBVaW50OEFycmF5KGUpfX19LHsiYnVmZmVyLyI6ODZ9XSwxMjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpO2Z1bmN0aW9uIG8oZSx0KXt0aGlzLmhhc2g9bmV3IGUsdGhpcy5vdXRlcj1uZXcgZTt2YXIgbj1mdW5jdGlvbihlLHQpe3ZhciBuPXIuY29udmVydFRvQnVmZmVyKHQpO2lmKG4uYnl0ZUxlbmd0aD5lLkJMT0NLX1NJWkUpe3ZhciBvPW5ldyBlO28udXBkYXRlKG4pLG49by5kaWdlc3QoKX12YXIgaT1uZXcgVWludDhBcnJheShlLkJMT0NLX1NJWkUpO3JldHVybiBpLnNldChuKSxpfShlLHQpLG89bmV3IFVpbnQ4QXJyYXkoZS5CTE9DS19TSVpFKTtvLnNldChuKTtmb3IodmFyIGk9MDtpPGUuQkxPQ0tfU0laRTtpKyspbltpXV49NTQsb1tpXV49OTI7Zm9yKHRoaXMuaGFzaC51cGRhdGUobiksdGhpcy5vdXRlci51cGRhdGUobyksaT0wO2k8bi5ieXRlTGVuZ3RoO2krKyluW2ldPTB9dC5leHBvcnRzPW8sby5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHIuaXNFbXB0eURhdGEoZSl8fHRoaXMuZXJyb3IpcmV0dXJuIHRoaXM7dHJ5e3RoaXMuaGFzaC51cGRhdGUoci5jb252ZXJ0VG9CdWZmZXIoZSkpfWNhdGNoKGUpe3RoaXMuZXJyb3I9ZX1yZXR1cm4gdGhpc30sby5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm91dGVyLmZpbmlzaGVkfHx0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmhhc2guZGlnZXN0KCkpLHRoaXMub3V0ZXIuZGlnZXN0KGUpfX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExfV0sMTM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKSxvPWUoImJ1ZmZlci8iKS5CdWZmZXIsaT02NDtmdW5jdGlvbiBzKCl7dGhpcy5zdGF0ZT1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4XSx0aGlzLmJ1ZmZlcj1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKGkpKSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExfWZ1bmN0aW9uIGEoZSx0LG4scixvLGkpe3JldHVybigodD0odCtlJjQyOTQ5NjcyOTUpKyhyK2kmNDI5NDk2NzI5NSkmNDI5NDk2NzI5NSk8PG98dD4+PjMyLW8pK24mNDI5NDk2NzI5NX1mdW5jdGlvbiBjKGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKHQmbnx+dCZyLGUsdCxvLGkscyl9ZnVuY3Rpb24gdShlLHQsbixyLG8saSxzKXtyZXR1cm4gYSh0JnJ8biZ+cixlLHQsbyxpLHMpfWZ1bmN0aW9uIGwoZSx0LG4scixvLGkscyl7cmV0dXJuIGEodF5uXnIsZSx0LG8saSxzKX1mdW5jdGlvbiBwKGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKG5eKHR8fnIpLGUsdCxvLGkscyl9dC5leHBvcnRzPXMscy5CTE9DS19TSVpFPWkscy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHIuaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO3ZhciB0PXIuY29udmVydFRvQnVmZmVyKGUpLG49MCxvPXQuYnl0ZUxlbmd0aDtmb3IodGhpcy5ieXRlc0hhc2hlZCs9bztvPjA7KXRoaXMuYnVmZmVyLnNldFVpbnQ4KHRoaXMuYnVmZmVyTGVuZ3RoKyssdFtuKytdKSxvLS0sdGhpcy5idWZmZXJMZW5ndGg9PT1pJiYodGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MCk7cmV0dXJuIHRoaXN9LHMucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9dGhpcyxuPXQuYnVmZmVyLHI9dC5idWZmZXJMZW5ndGgscz04KnQuYnl0ZXNIYXNoZWQ7aWYobi5zZXRVaW50OCh0aGlzLmJ1ZmZlckxlbmd0aCsrLDEyOCksciVpPj01Nil7Zm9yKHZhciBhPXRoaXMuYnVmZmVyTGVuZ3RoO2E8aTthKyspbi5zZXRVaW50OChhLDApO3RoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTB9Zm9yKGE9dGhpcy5idWZmZXJMZW5ndGg7YTw1NjthKyspbi5zZXRVaW50OChhLDApO24uc2V0VWludDMyKDU2LHM+Pj4wLCEwKSxuLnNldFVpbnQzMig2MCxNYXRoLmZsb29yKHMvNDI5NDk2NzI5NiksITApLHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuZmluaXNoZWQ9ITB9dmFyIGM9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxNikpO2ZvcihhPTA7YTw0O2ErKyljLnNldFVpbnQzMig0KmEsdGhpcy5zdGF0ZVthXSwhMCk7dmFyIHU9bmV3IG8oYy5idWZmZXIsYy5ieXRlT2Zmc2V0LGMuYnl0ZUxlbmd0aCk7cmV0dXJuIGU/dS50b1N0cmluZyhlKTp1fSxzLnByb3RvdHlwZS5oYXNoQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5idWZmZXIsdD10aGlzLnN0YXRlLG49dFswXSxyPXRbMV0sbz10WzJdLGk9dFszXTtuPWMobixyLG8saSxlLmdldFVpbnQzMigwLCEwKSw3LDM2MTQwOTAzNjApLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDQsITApLDEyLDM5MDU0MDI3MTApLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDgsITApLDE3LDYwNjEwNTgxOSkscj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoMTIsITApLDIyLDMyNTA0NDE5NjYpLG49YyhuLHIsbyxpLGUuZ2V0VWludDMyKDE2LCEwKSw3LDQxMTg1NDgzOTkpLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDIwLCEwKSwxMiwxMjAwMDgwNDI2KSxvPWMobyxpLG4scixlLmdldFVpbnQzMigyNCwhMCksMTcsMjgyMTczNTk1NSkscj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoMjgsITApLDIyLDQyNDkyNjEzMTMpLG49YyhuLHIsbyxpLGUuZ2V0VWludDMyKDMyLCEwKSw3LDE3NzAwMzU0MTYpLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDM2LCEwKSwxMiwyMzM2NTUyODc5KSxvPWMobyxpLG4scixlLmdldFVpbnQzMig0MCwhMCksMTcsNDI5NDkyNTIzMykscj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoNDQsITApLDIyLDIzMDQ1NjMxMzQpLG49YyhuLHIsbyxpLGUuZ2V0VWludDMyKDQ4LCEwKSw3LDE4MDQ2MDM2ODIpLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDUyLCEwKSwxMiw0MjU0NjI2MTk1KSxvPWMobyxpLG4scixlLmdldFVpbnQzMig1NiwhMCksMTcsMjc5Mjk2NTAwNiksbj11KG4scj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoNjAsITApLDIyLDEyMzY1MzUzMjkpLG8saSxlLmdldFVpbnQzMig0LCEwKSw1LDQxMjkxNzA3ODYpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDI0LCEwKSw5LDMyMjU0NjU2NjQpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDQ0LCEwKSwxNCw2NDM3MTc3MTMpLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDAsITApLDIwLDM5MjEwNjk5OTQpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDIwLCEwKSw1LDM1OTM0MDg2MDUpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDQwLCEwKSw5LDM4MDE2MDgzKSxvPXUobyxpLG4scixlLmdldFVpbnQzMig2MCwhMCksMTQsMzYzNDQ4ODk2MSkscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMTYsITApLDIwLDM4ODk0Mjk0NDgpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDM2LCEwKSw1LDU2ODQ0NjQzOCksaT11KGksbixyLG8sZS5nZXRVaW50MzIoNTYsITApLDksMzI3NTE2MzYwNiksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoMTIsITApLDE0LDQxMDc2MDMzMzUpLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDMyLCEwKSwyMCwxMTYzNTMxNTAxKSxuPXUobixyLG8saSxlLmdldFVpbnQzMig1MiwhMCksNSwyODUwMjg1ODI5KSxpPXUoaSxuLHIsbyxlLmdldFVpbnQzMig4LCEwKSw5LDQyNDM1NjM1MTIpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDI4LCEwKSwxNCwxNzM1MzI4NDczKSxuPWwobixyPXUocixvLGksbixlLmdldFVpbnQzMig0OCwhMCksMjAsMjM2ODM1OTU2MiksbyxpLGUuZ2V0VWludDMyKDIwLCEwKSw0LDQyOTQ1ODg3MzgpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDMyLCEwKSwxMSwyMjcyMzkyODMzKSxvPWwobyxpLG4scixlLmdldFVpbnQzMig0NCwhMCksMTYsMTgzOTAzMDU2Mikscj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoNTYsITApLDIzLDQyNTk2NTc3NDApLG49bChuLHIsbyxpLGUuZ2V0VWludDMyKDQsITApLDQsMjc2Mzk3NTIzNiksaT1sKGksbixyLG8sZS5nZXRVaW50MzIoMTYsITApLDExLDEyNzI4OTMzNTMpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDI4LCEwKSwxNiw0MTM5NDY5NjY0KSxyPWwocixvLGksbixlLmdldFVpbnQzMig0MCwhMCksMjMsMzIwMDIzNjY1Niksbj1sKG4scixvLGksZS5nZXRVaW50MzIoNTIsITApLDQsNjgxMjc5MTc0KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMigwLCEwKSwxMSwzOTM2NDMwMDc0KSxvPWwobyxpLG4scixlLmdldFVpbnQzMigxMiwhMCksMTYsMzU3MjQ0NTMxNykscj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoMjQsITApLDIzLDc2MDI5MTg5KSxuPWwobixyLG8saSxlLmdldFVpbnQzMigzNiwhMCksNCwzNjU0NjAyODA5KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMig0OCwhMCksMTEsMzg3MzE1MTQ2MSksbz1sKG8saSxuLHIsZS5nZXRVaW50MzIoNjAsITApLDE2LDUzMDc0MjUyMCksbj1wKG4scj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoOCwhMCksMjMsMzI5OTYyODY0NSksbyxpLGUuZ2V0VWludDMyKDAsITApLDYsNDA5NjMzNjQ1MiksaT1wKGksbixyLG8sZS5nZXRVaW50MzIoMjgsITApLDEwLDExMjY4OTE0MTUpLG89cChvLGksbixyLGUuZ2V0VWludDMyKDU2LCEwKSwxNSwyODc4NjEyMzkxKSxyPXAocixvLGksbixlLmdldFVpbnQzMigyMCwhMCksMjEsNDIzNzUzMzI0MSksbj1wKG4scixvLGksZS5nZXRVaW50MzIoNDgsITApLDYsMTcwMDQ4NTU3MSksaT1wKGksbixyLG8sZS5nZXRVaW50MzIoMTIsITApLDEwLDIzOTk5ODA2OTApLG89cChvLGksbixyLGUuZ2V0VWludDMyKDQwLCEwKSwxNSw0MjkzOTE1NzczKSxyPXAocixvLGksbixlLmdldFVpbnQzMig0LCEwKSwyMSwyMjQwMDQ0NDk3KSxuPXAobixyLG8saSxlLmdldFVpbnQzMigzMiwhMCksNiwxODczMzEzMzU5KSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMig2MCwhMCksMTAsNDI2NDM1NTU1Miksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoMjQsITApLDE1LDI3MzQ3Njg5MTYpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDUyLCEwKSwyMSwxMzA5MTUxNjQ5KSxuPXAobixyLG8saSxlLmdldFVpbnQzMigxNiwhMCksNiw0MTQ5NDQ0MjI2KSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMig0NCwhMCksMTAsMzE3NDc1NjkxNyksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoOCwhMCksMTUsNzE4Nzg3MjU5KSxyPXAocixvLGksbixlLmdldFVpbnQzMigzNiwhMCksMjEsMzk1MTQ4MTc0NSksdFswXT1uK3RbMF0mNDI5NDk2NzI5NSx0WzFdPXIrdFsxXSY0Mjk0OTY3Mjk1LHRbMl09byt0WzJdJjQyOTQ5NjcyOTUsdFszXT1pK3RbM10mNDI5NDk2NzI5NX19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODZ9XSwxNDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoImJ1ZmZlci8iKS5CdWZmZXIsbz1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKTtmdW5jdGlvbiBpKCl7dGhpcy5oMD0xNzMyNTg0MTkzLHRoaXMuaDE9NDAyMzIzMzQxNyx0aGlzLmgyPTI1NjIzODMxMDIsdGhpcy5oMz0yNzE3MzM4NzgsdGhpcy5oND0zMjg1Mzc3NTIwLHRoaXMuYmxvY2s9bmV3IFVpbnQzMkFycmF5KDgwKSx0aGlzLm9mZnNldD0wLHRoaXMuc2hpZnQ9MjQsdGhpcy50b3RhbExlbmd0aD0wfW5ldyBVaW50MzJBcnJheShbMTUxODUwMDI0OSwxODU5Nzc1MzkzLC0xODk0MDA3NTg4LC04OTk0OTc1MTRdKSxNYXRoLnBvdygyLDUzKSx0LmV4cG9ydHM9aSxpLkJMT0NLX1NJWkU9NjQsaS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuZmluaXNoZWQpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gdXBkYXRlIGFuIGFscmVhZHkgZmluaXNoZWQgaGFzaC4iKTtpZihvLmlzRW1wdHlEYXRhKGUpKXJldHVybiB0aGlzO3ZhciB0PShlPW8uY29udmVydFRvQnVmZmVyKGUpKS5sZW5ndGg7dGhpcy50b3RhbExlbmd0aCs9OCp0O2Zvcih2YXIgbj0wO248dDtuKyspdGhpcy53cml0ZShlW25dKTtyZXR1cm4gdGhpc30saS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSl7dGhpcy5ibG9ja1t0aGlzLm9mZnNldF18PSgyNTUmZSk8PHRoaXMuc2hpZnQsdGhpcy5zaGlmdD90aGlzLnNoaWZ0LT04Oih0aGlzLm9mZnNldCsrLHRoaXMuc2hpZnQ9MjQpLDE2PT09dGhpcy5vZmZzZXQmJnRoaXMucHJvY2Vzc0Jsb2NrKCl9LGkucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXt0aGlzLndyaXRlKDEyOCksKHRoaXMub2Zmc2V0PjE0fHwxND09PXRoaXMub2Zmc2V0JiZ0aGlzLnNoaWZ0PDI0KSYmdGhpcy5wcm9jZXNzQmxvY2soKSx0aGlzLm9mZnNldD0xNCx0aGlzLnNoaWZ0PTI0LHRoaXMud3JpdGUoMCksdGhpcy53cml0ZSgwKSx0aGlzLndyaXRlKHRoaXMudG90YWxMZW5ndGg+MHhmZmZmZmZmZmZmP3RoaXMudG90YWxMZW5ndGgvMTA5OTUxMTYyNzc3NjowKSx0aGlzLndyaXRlKHRoaXMudG90YWxMZW5ndGg+NDI5NDk2NzI5NT90aGlzLnRvdGFsTGVuZ3RoLzQyOTQ5NjcyOTY6MCk7Zm9yKHZhciB0PTI0O3Q+PTA7dC09OCl0aGlzLndyaXRlKHRoaXMudG90YWxMZW5ndGg+PnQpO3ZhciBuPW5ldyByKDIwKSxvPW5ldyBEYXRhVmlldyhuLmJ1ZmZlcik7cmV0dXJuIG8uc2V0VWludDMyKDAsdGhpcy5oMCwhMSksby5zZXRVaW50MzIoNCx0aGlzLmgxLCExKSxvLnNldFVpbnQzMig4LHRoaXMuaDIsITEpLG8uc2V0VWludDMyKDEyLHRoaXMuaDMsITEpLG8uc2V0VWludDMyKDE2LHRoaXMuaDQsITEpLGU/bi50b1N0cmluZyhlKTpufSxpLnByb3RvdHlwZS5wcm9jZXNzQmxvY2s9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MTY7ZTw4MDtlKyspe3ZhciB0PXRoaXMuYmxvY2tbZS0zXV50aGlzLmJsb2NrW2UtOF1edGhpcy5ibG9ja1tlLTE0XV50aGlzLmJsb2NrW2UtMTZdO3RoaXMuYmxvY2tbZV09dDw8MXx0Pj4+MzF9dmFyIG4scixvPXRoaXMuaDAsaT10aGlzLmgxLHM9dGhpcy5oMixhPXRoaXMuaDMsYz10aGlzLmg0O2ZvcihlPTA7ZTw4MDtlKyspe2U8MjA/KG49YV5pJihzXmEpLHI9MTUxODUwMDI0OSk6ZTw0MD8obj1pXnNeYSxyPTE4NTk3NzUzOTMpOmU8NjA/KG49aSZzfGEmKGl8cykscj0yNDAwOTU5NzA4KToobj1pXnNeYSxyPTMzOTU0Njk3ODIpO3ZhciB1PShvPDw1fG8+Pj4yNykrbitjK3IrKDB8dGhpcy5ibG9ja1tlXSk7Yz1hLGE9cyxzPWk8PDMwfGk+Pj4yLGk9byxvPXV9Zm9yKHRoaXMuaDA9dGhpcy5oMCtvfDAsdGhpcy5oMT10aGlzLmgxK2l8MCx0aGlzLmgyPXRoaXMuaDIrc3wwLHRoaXMuaDM9dGhpcy5oMythfDAsdGhpcy5oND10aGlzLmg0K2N8MCx0aGlzLm9mZnNldD0wLGU9MDtlPDE2O2UrKyl0aGlzLmJsb2NrW2VdPTB9fSx7Ii4vYnJvd3Nlckhhc2hVdGlscyI6MTEsImJ1ZmZlci8iOjg2fV0sMTU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJidWZmZXIvIikuQnVmZmVyLG89ZSgiLi9icm93c2VySGFzaFV0aWxzIiksaT02NCxzPW5ldyBVaW50MzJBcnJheShbMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSksYT1NYXRoLnBvdygyLDUzKS0xO2Z1bmN0aW9uIGMoKXt0aGlzLnN0YXRlPVsxNzc5MDMzNzAzLDMxNDQxMzQyNzcsMTAxMzkwNDI0MiwyNzczNDgwNzYyLDEzNTk4OTMxMTksMjYwMDgyMjkyNCw1Mjg3MzQ2MzUsMTU0MTQ1OTIyNV0sdGhpcy50ZW1wPW5ldyBJbnQzMkFycmF5KDY0KSx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSg2NCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMX10LmV4cG9ydHM9YyxjLkJMT0NLX1NJWkU9aSxjLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO2lmKG8uaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7dmFyIHQ9MCxuPShlPW8uY29udmVydFRvQnVmZmVyKGUpKS5ieXRlTGVuZ3RoO2lmKHRoaXMuYnl0ZXNIYXNoZWQrPW4sOCp0aGlzLmJ5dGVzSGFzaGVkPmEpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaGFzaCBtb3JlIHRoYW4gMl41MyAtIDEgYml0cyIpO2Zvcig7bj4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW3QrK10sbi0tLHRoaXMuYnVmZmVyTGVuZ3RoPT09aSYmKHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTApO3JldHVybiB0aGlzfSxjLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuZmluaXNoZWQpe3ZhciB0PTgqdGhpcy5ieXRlc0hhc2hlZCxuPW5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlci5idWZmZXIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCx0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKSxvPXRoaXMuYnVmZmVyTGVuZ3RoO2lmKG4uc2V0VWludDgodGhpcy5idWZmZXJMZW5ndGgrKywxMjgpLG8laT49NTYpe2Zvcih2YXIgcz10aGlzLmJ1ZmZlckxlbmd0aDtzPGk7cysrKW4uc2V0VWludDgocywwKTt0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmJ1ZmZlckxlbmd0aD0wfWZvcihzPXRoaXMuYnVmZmVyTGVuZ3RoO3M8NTY7cysrKW4uc2V0VWludDgocywwKTtuLnNldFVpbnQzMig1NixNYXRoLmZsb29yKHQvNDI5NDk2NzI5NiksITApLG4uc2V0VWludDMyKDYwLHQpLHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuZmluaXNoZWQ9ITB9dmFyIGE9bmV3IHIoMzIpO2ZvcihzPTA7czw4O3MrKylhWzQqc109dGhpcy5zdGF0ZVtzXT4+PjI0JjI1NSxhWzQqcysxXT10aGlzLnN0YXRlW3NdPj4+MTYmMjU1LGFbNCpzKzJdPXRoaXMuc3RhdGVbc10+Pj44JjI1NSxhWzQqcyszXT10aGlzLnN0YXRlW3NdPj4+MCYyNTU7cmV0dXJuIGU/YS50b1N0cmluZyhlKTphfSxjLnByb3RvdHlwZS5oYXNoQnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuYnVmZmVyLHQ9dGhpcy5zdGF0ZSxuPXRbMF0scj10WzFdLG89dFsyXSxhPXRbM10sYz10WzRdLHU9dFs1XSxsPXRbNl0scD10WzddLGQ9MDtkPGk7ZCsrKXtpZihkPDE2KXRoaXMudGVtcFtkXT0oMjU1JmVbNCpkXSk8PDI0fCgyNTUmZVs0KmQrMV0pPDwxNnwoMjU1JmVbNCpkKzJdKTw8OHwyNTUmZVs0KmQrM107ZWxzZXt2YXIgaD10aGlzLnRlbXBbZC0yXSxmPShoPj4+MTd8aDw8MTUpXihoPj4+MTl8aDw8MTMpXmg+Pj4xMCxnPSgoaD10aGlzLnRlbXBbZC0xNV0pPj4+N3xoPDwyNSleKGg+Pj4xOHxoPDwxNCleaD4+PjM7dGhpcy50ZW1wW2RdPShmK3RoaXMudGVtcFtkLTddfDApKyhnK3RoaXMudGVtcFtkLTE2XXwwKX12YXIgbT0oKChjPj4+NnxjPDwyNileKGM+Pj4xMXxjPDwyMSleKGM+Pj4yNXxjPDw3KSkrKGMmdV5+YyZsKXwwKSsocCsoc1tkXSt0aGlzLnRlbXBbZF18MCl8MCl8MCx2PSgobj4+PjJ8bjw8MzApXihuPj4+MTN8bjw8MTkpXihuPj4+MjJ8bjw8MTApKSsobiZyXm4mb15yJm8pfDA7cD1sLGw9dSx1PWMsYz1hK218MCxhPW8sbz1yLHI9bixuPW0rdnwwfXRbMF0rPW4sdFsxXSs9cix0WzJdKz1vLHRbM10rPWEsdFs0XSs9Yyx0WzVdKz11LHRbNl0rPWwsdFs3XSs9cH19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODZ9XSwxNjpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgbj1lKCIuL3V0aWwiKTtuLmNyeXB0by5saWI9ZSgiLi9icm93c2VyQ3J5cHRvTGliIiksbi5CdWZmZXI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcixuLnVybD1lKCJ1cmwvIiksbi5xdWVyeXN0cmluZz1lKCJxdWVyeXN0cmluZy8iKSxuLnJlYWxDbG9jaz1lKCIuL3JlYWxjbG9jay9icm93c2VyQ2xvY2siKSxuLmVudmlyb25tZW50PSJqcyIsbi5jcmVhdGVFdmVudFN0cmVhbT1lKCIuL2V2ZW50LXN0cmVhbS9idWZmZXJlZC1jcmVhdGUtZXZlbnQtc3RyZWFtIikuY3JlYXRlRXZlbnRTdHJlYW0sbi5pc0Jyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbi5pc05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX07dmFyIHI9ZSgiLi9jb3JlIik7aWYodC5leHBvcnRzPXIsZSgiLi9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiIpLGUoIi4vY3JlZGVudGlhbHMvdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jaGFpbmFibGVfdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy93ZWJfaWRlbnRpdHlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL2NvZ25pdG9faWRlbnRpdHlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL3NhbWxfY3JlZGVudGlhbHMiKSxyLlhNTC5QYXJzZXI9ZSgiLi94bWwvYnJvd3Nlcl9wYXJzZXIiKSxlKCIuL2h0dHAveGhyIiksdm9pZCAwPT09byl2YXIgbz17YnJvd3NlcjohMH19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vYnJvd3NlckNyeXB0b0xpYiI6MTAsIi4vY29yZSI6MTksIi4vY3JlZGVudGlhbHMiOjIwLCIuL2NyZWRlbnRpYWxzL2NoYWluYWJsZV90ZW1wb3JhcnlfY3JlZGVudGlhbHMiOjIxLCIuL2NyZWRlbnRpYWxzL2NvZ25pdG9faWRlbnRpdHlfY3JlZGVudGlhbHMiOjIyLCIuL2NyZWRlbnRpYWxzL2NyZWRlbnRpYWxfcHJvdmlkZXJfY2hhaW4iOjIzLCIuL2NyZWRlbnRpYWxzL3NhbWxfY3JlZGVudGlhbHMiOjI0LCIuL2NyZWRlbnRpYWxzL3RlbXBvcmFyeV9jcmVkZW50aWFscyI6MjUsIi4vY3JlZGVudGlhbHMvd2ViX2lkZW50aXR5X2NyZWRlbnRpYWxzIjoyNiwiLi9ldmVudC1zdHJlYW0vYnVmZmVyZWQtY3JlYXRlLWV2ZW50LXN0cmVhbSI6MjgsIi4vaHR0cC94aHIiOjM2LCIuL3JlYWxjbG9jay9icm93c2VyQ2xvY2siOjU0LCIuL3V0aWwiOjc0LCIuL3htbC9icm93c2VyX3BhcnNlciI6NzUsX3Byb2Nlc3M6OTEsImJ1ZmZlci8iOjg2LCJxdWVyeXN0cmluZy8iOjk4LCJ1cmwvIjoxMDB9XSwxNzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLG89ZSgiLi9jb3JlIik7ZSgiLi9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiIpLG8uQ29uZmlnPW8udXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksZT10aGlzLmV4dHJhY3RDcmVkZW50aWFscyhlKSxvLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5rZXlzLChmdW5jdGlvbih0LG4pe3RoaXMuc2V0KHQsZVt0XSxuKX0pKX0sZ2V0Q3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzO2Z1bmN0aW9uIHIodCl7ZSh0LHQ/bnVsbDpuLmNyZWRlbnRpYWxzKX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIG5ldyBvLnV0aWwuZXJyb3IodHx8bmV3IEVycm9yLHtjb2RlOiJDcmVkZW50aWFsc0Vycm9yIixtZXNzYWdlOmUsbmFtZToiQ3JlZGVudGlhbHNFcnJvciJ9KX1uLmNyZWRlbnRpYWxzPyJmdW5jdGlvbiI9PXR5cGVvZiBuLmNyZWRlbnRpYWxzLmdldD9uLmNyZWRlbnRpYWxzLmdldCgoZnVuY3Rpb24oZSl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgY3JlZGVudGlhbHMgZnJvbSAiK24uY3JlZGVudGlhbHMuY29uc3RydWN0b3IubmFtZSxlKSkscihlKX0pKToodD1udWxsLG4uY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQmJm4uY3JlZGVudGlhbHMuc2VjcmV0QWNjZXNzS2V5fHwodD1pKCJNaXNzaW5nIGNyZWRlbnRpYWxzIikpLHIodCkpOm4uY3JlZGVudGlhbFByb3ZpZGVyP24uY3JlZGVudGlhbFByb3ZpZGVyLnJlc29sdmUoKGZ1bmN0aW9uKGUsdCl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgY3JlZGVudGlhbHMgZnJvbSBhbnkgcHJvdmlkZXJzIixlKSksbi5jcmVkZW50aWFscz10LHIoZSl9KSk6cihpKCJObyBjcmVkZW50aWFscyB0byBsb2FkIikpfSxnZXRUb2tlbjpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXM7ZnVuY3Rpb24gcih0KXtlKHQsdD9udWxsOm4udG9rZW4pfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gbmV3IG8udXRpbC5lcnJvcih0fHxuZXcgRXJyb3Ise2NvZGU6IlRva2VuRXJyb3IiLG1lc3NhZ2U6ZSxuYW1lOiJUb2tlbkVycm9yIn0pfW4udG9rZW4/ImZ1bmN0aW9uIj09dHlwZW9mIG4udG9rZW4uZ2V0P24udG9rZW4uZ2V0KChmdW5jdGlvbihlKXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCB0b2tlbiBmcm9tICIrbi50b2tlbi5jb25zdHJ1Y3Rvci5uYW1lLGUpKSxyKGUpfSkpOih0PW51bGwsbi50b2tlbi50b2tlbnx8KHQ9aSgiTWlzc2luZyB0b2tlbiIpKSxyKHQpKTpuLnRva2VuUHJvdmlkZXI/bi50b2tlblByb3ZpZGVyLnJlc29sdmUoKGZ1bmN0aW9uKGUsdCl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgdG9rZW4gZnJvbSBhbnkgcHJvdmlkZXJzIixlKSksbi50b2tlbj10LHIoZSl9KSk6cihpKCJObyB0b2tlbiB0byBsb2FkIikpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXt0PXR8fCExLGU9dGhpcy5leHRyYWN0Q3JlZGVudGlhbHMoZSksby51dGlsLmVhY2guY2FsbCh0aGlzLGUsKGZ1bmN0aW9uKGUsbil7KHR8fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmtleXMsZSl8fG8uU2VydmljZS5oYXNTZXJ2aWNlKGUpKSYmdGhpcy5zZXQoZSxuKX0pKX0sbG9hZEZyb21QYXRoOmZ1bmN0aW9uKGUpe3RoaXMuY2xlYXIoKTt2YXIgdD1KU09OLnBhcnNlKG8udXRpbC5yZWFkRmlsZVN5bmMoZSkpLG49bmV3IG8uRmlsZVN5c3RlbUNyZWRlbnRpYWxzKGUpLHI9bmV3IG8uQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW47cmV0dXJuIHIucHJvdmlkZXJzLnVuc2hpZnQobiksci5yZXNvbHZlKChmdW5jdGlvbihlLG4pe2lmKGUpdGhyb3cgZTt0LmNyZWRlbnRpYWxzPW59KSksdGhpcy5jb25zdHJ1Y3Rvcih0KSx0aGlzfSxjbGVhcjpmdW5jdGlvbigpe28udXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLmtleXMsKGZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzW2VdfSkpLHRoaXMuc2V0KCJjcmVkZW50aWFscyIsdm9pZCAwKSx0aGlzLnNldCgiY3JlZGVudGlhbFByb3ZpZGVyIix2b2lkIDApfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQ/KHZvaWQgMD09PW4mJihuPXRoaXMua2V5c1tlXSksdGhpc1tlXT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodGhpcyk6bik6Imh0dHBPcHRpb25zIj09PWUmJnRoaXNbZV0/dGhpc1tlXT1vLnV0aWwubWVyZ2UodGhpc1tlXSx0KTp0aGlzW2VdPXR9LGtleXM6e2NyZWRlbnRpYWxzOm51bGwsY3JlZGVudGlhbFByb3ZpZGVyOm51bGwscmVnaW9uOm51bGwsbG9nZ2VyOm51bGwsYXBpVmVyc2lvbnM6e30sYXBpVmVyc2lvbjpudWxsLGVuZHBvaW50OnZvaWQgMCxodHRwT3B0aW9uczp7dGltZW91dDoxMmU0fSxtYXhSZXRyaWVzOnZvaWQgMCxtYXhSZWRpcmVjdHM6MTAscGFyYW1WYWxpZGF0aW9uOiEwLHNzbEVuYWJsZWQ6ITAsczNGb3JjZVBhdGhTdHlsZTohMSxzM0J1Y2tldEVuZHBvaW50OiExLHMzRGlzYWJsZUJvZHlTaWduaW5nOiEwLHMzVXNFYXN0MVJlZ2lvbmFsRW5kcG9pbnQ6ImxlZ2FjeSIsczNVc2VBcm5SZWdpb246dm9pZCAwLGNvbXB1dGVDaGVja3N1bXM6ITAsY29udmVydFJlc3BvbnNlVHlwZXM6ITAsY29ycmVjdENsb2NrU2tldzohMSxjdXN0b21Vc2VyQWdlbnQ6bnVsbCxkeW5hbW9EYkNyYzMyOiEwLHN5c3RlbUNsb2NrT2Zmc2V0OjAsc2lnbmF0dXJlVmVyc2lvbjpudWxsLHNpZ25hdHVyZUNhY2hlOiEwLHJldHJ5RGVsYXlPcHRpb25zOnt9LHVzZUFjY2VsZXJhdGVFbmRwb2ludDohMSxjbGllbnRTaWRlTW9uaXRvcmluZzohMSxlbmRwb2ludERpc2NvdmVyeUVuYWJsZWQ6dm9pZCAwLGVuZHBvaW50Q2FjaGVTaXplOjFlMyxob3N0UHJlZml4RW5hYmxlZDohMCxzdHNSZWdpb25hbEVuZHBvaW50czoibGVnYWN5Iix1c2VGaXBzRW5kcG9pbnQ6ITEsdXNlRHVhbHN0YWNrRW5kcG9pbnQ6ITEsdG9rZW46bnVsbH0sZXh0cmFjdENyZWRlbnRpYWxzOmZ1bmN0aW9uKGUpe3JldHVybiBlLmFjY2Vzc0tleUlkJiZlLnNlY3JldEFjY2Vzc0tleSYmKChlPW8udXRpbC5jb3B5KGUpKS5jcmVkZW50aWFscz1uZXcgby5DcmVkZW50aWFscyhlKSksZX0sc2V0UHJvbWlzZXNEZXBlbmRlbmN5OmZ1bmN0aW9uKGUpe3I9ZSxudWxsPT09ZSYmImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2UmJihyPVByb21pc2UpO3ZhciB0PVtvLlJlcXVlc3Qsby5DcmVkZW50aWFscyxvLkNyZWRlbnRpYWxQcm92aWRlckNoYWluXTtvLlMzJiYodC5wdXNoKG8uUzMpLG8uUzMuTWFuYWdlZFVwbG9hZCYmdC5wdXNoKG8uUzMuTWFuYWdlZFVwbG9hZCkpLG8udXRpbC5hZGRQcm9taXNlcyh0LHIpfSxnZXRQcm9taXNlc0RlcGVuZGVuY3k6ZnVuY3Rpb24oKXtyZXR1cm4gcn19KSxvLmNvbmZpZz1uZXcgby5Db25maWd9LHsiLi9jb3JlIjoxOSwiLi9jcmVkZW50aWFscyI6MjAsIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiI6MjN9XSwxODpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgcj1lKCIuL2NvcmUiKTtmdW5jdGlvbiBvKGUsdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZihbImxlZ2FjeSIsInJlZ2lvbmFsIl0uaW5kZXhPZihlLnRvTG93ZXJDYXNlKCkpPj0wKXJldHVybiBlLnRvTG93ZXJDYXNlKCk7dGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix0KX19dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIGk7aWYoKGU9ZXx8e30pW3QuY2xpZW50Q29uZmlnXSYmKGk9byhlW3QuY2xpZW50Q29uZmlnXSx7Y29kZToiSW52YWxpZENvbmZpZ3VyYXRpb24iLG1lc3NhZ2U6J2ludmFsaWQgIicrdC5jbGllbnRDb25maWcrJyIgY29uZmlndXJhdGlvbi4gRXhwZWN0ICJsZWdhY3kiICBvciAicmVnaW9uYWwiLiBHb3QgIicrZVt0LmNsaWVudENvbmZpZ10rJyIuJ30pKSlyZXR1cm4gaTtpZighci51dGlsLmlzTm9kZSgpKXJldHVybiBpO2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLmVudix0LmVudikmJihpPW8obi5lbnZbdC5lbnZdLHtjb2RlOiJJbnZhbGlkRW52aXJvbm1lbnRhbFZhcmlhYmxlIixtZXNzYWdlOiJpbnZhbGlkICIrdC5lbnYrJyBlbnZpcm9ubWVudGFsIHZhcmlhYmxlLiBFeHBlY3QgImxlZ2FjeSIgIG9yICJyZWdpb25hbCIuIEdvdCAiJytuLmVudlt0LmVudl0rJyIuJ30pKSlyZXR1cm4gaTt2YXIgcz17fTt0cnl7cz1yLnV0aWwuZ2V0UHJvZmlsZXNGcm9tU2hhcmVkQ29uZmlnKHIudXRpbC5pbmlMb2FkZXIpW24uZW52LkFXU19QUk9GSUxFfHxyLnV0aWwuZGVmYXVsdFByb2ZpbGVdfWNhdGNoKGUpe31yZXR1cm4gcyYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsdC5zaGFyZWRDb25maWcpJiYoaT1vKHNbdC5zaGFyZWRDb25maWddLHtjb2RlOiJJbnZhbGlkQ29uZmlndXJhdGlvbiIsbWVzc2FnZToiaW52YWxpZCAiK3Quc2hhcmVkQ29uZmlnKycgcHJvZmlsZSBjb25maWcuIEV4cGVjdCAibGVnYWN5IiAgb3IgInJlZ2lvbmFsIi4gR290ICInK3NbdC5zaGFyZWRDb25maWddKyciLid9KSksaX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksX3Byb2Nlc3M6OTF9XSwxOTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt1dGlsOmUoIi4vdXRpbCIpfTsoe30pLnRvU3RyaW5nKCksdC5leHBvcnRzPXIsci51dGlsLnVwZGF0ZShyLHtWRVJTSU9OOiIyLjE0NTUuMCIsU2lnbmVyczp7fSxQcm90b2NvbDp7SnNvbjplKCIuL3Byb3RvY29sL2pzb24iKSxRdWVyeTplKCIuL3Byb3RvY29sL3F1ZXJ5IiksUmVzdDplKCIuL3Byb3RvY29sL3Jlc3QiKSxSZXN0SnNvbjplKCIuL3Byb3RvY29sL3Jlc3RfanNvbiIpLFJlc3RYbWw6ZSgiLi9wcm90b2NvbC9yZXN0X3htbCIpfSxYTUw6e0J1aWxkZXI6ZSgiLi94bWwvYnVpbGRlciIpLFBhcnNlcjpudWxsfSxKU09OOntCdWlsZGVyOmUoIi4vanNvbi9idWlsZGVyIiksUGFyc2VyOmUoIi4vanNvbi9wYXJzZXIiKX0sTW9kZWw6e0FwaTplKCIuL21vZGVsL2FwaSIpLE9wZXJhdGlvbjplKCIuL21vZGVsL29wZXJhdGlvbiIpLFNoYXBlOmUoIi4vbW9kZWwvc2hhcGUiKSxQYWdpbmF0b3I6ZSgiLi9tb2RlbC9wYWdpbmF0b3IiKSxSZXNvdXJjZVdhaXRlcjplKCIuL21vZGVsL3Jlc291cmNlX3dhaXRlciIpfSxhcGlMb2FkZXI6ZSgiLi9hcGlfbG9hZGVyIiksRW5kcG9pbnRDYWNoZTplKCIuLi92ZW5kb3IvZW5kcG9pbnQtY2FjaGUiKS5FbmRwb2ludENhY2hlfSksZSgiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIiksZSgiLi9zZXJ2aWNlIiksZSgiLi9jb25maWciKSxlKCIuL2h0dHAiKSxlKCIuL2V2ZW50X2xpc3RlbmVycyIpLGUoIi4vcmVxdWVzdCIpLGUoIi4vcmVzcG9uc2UiKSxlKCIuL3Jlc291cmNlX3dhaXRlciIpLGUoIi4vc2lnbmVycy9yZXF1ZXN0X3NpZ25lciIpLGUoIi4vcGFyYW1fdmFsaWRhdG9yIiksZSgiLi9tYWludGVuYW5jZV9tb2RlX21lc3NhZ2UiKSxyLmV2ZW50cz1uZXcgci5TZXF1ZW50aWFsRXhlY3V0b3Isci51dGlsLm1lbW9pemVkUHJvcGVydHkociwiZW5kcG9pbnRDYWNoZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByLkVuZHBvaW50Q2FjaGUoci5jb25maWcuZW5kcG9pbnRDYWNoZVNpemUpfSksITApfSx7Ii4uL3ZlbmRvci9lbmRwb2ludC1jYWNoZSI6MTExLCIuL2FwaV9sb2FkZXIiOjksIi4vY29uZmlnIjoxNywiLi9ldmVudF9saXN0ZW5lcnMiOjM0LCIuL2h0dHAiOjM1LCIuL2pzb24vYnVpbGRlciI6MzcsIi4vanNvbi9wYXJzZXIiOjM4LCIuL21haW50ZW5hbmNlX21vZGVfbWVzc2FnZSI6MzksIi4vbW9kZWwvYXBpIjo0MCwiLi9tb2RlbC9vcGVyYXRpb24iOjQyLCIuL21vZGVsL3BhZ2luYXRvciI6NDMsIi4vbW9kZWwvcmVzb3VyY2Vfd2FpdGVyIjo0NCwiLi9tb2RlbC9zaGFwZSI6NDUsIi4vcGFyYW1fdmFsaWRhdG9yIjo0NiwiLi9wcm90b2NvbC9qc29uIjo0OCwiLi9wcm90b2NvbC9xdWVyeSI6NDksIi4vcHJvdG9jb2wvcmVzdCI6NTAsIi4vcHJvdG9jb2wvcmVzdF9qc29uIjo1MSwiLi9wcm90b2NvbC9yZXN0X3htbCI6NTIsIi4vcmVxdWVzdCI6NTgsIi4vcmVzb3VyY2Vfd2FpdGVyIjo1OSwiLi9yZXNwb25zZSI6NjAsIi4vc2VxdWVudGlhbF9leGVjdXRvciI6NjEsIi4vc2VydmljZSI6NjIsIi4vc2lnbmVycy9yZXF1ZXN0X3NpZ25lciI6NjYsIi4vdXRpbCI6NzQsIi4veG1sL2J1aWxkZXIiOjc2fV0sMjA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLkNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe2lmKHIudXRpbC5oaWRlUHJvcGVydGllcyh0aGlzLFsic2VjcmV0QWNjZXNzS2V5Il0pLHRoaXMuZXhwaXJlZD0hMSx0aGlzLmV4cGlyZVRpbWU9bnVsbCx0aGlzLnJlZnJlc2hDYWxsYmFja3M9W10sMT09PWFyZ3VtZW50cy5sZW5ndGgmJiJvYmplY3QiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF0uY3JlZGVudGlhbHN8fGFyZ3VtZW50c1swXTt0aGlzLmFjY2Vzc0tleUlkPWUuYWNjZXNzS2V5SWQsdGhpcy5zZWNyZXRBY2Nlc3NLZXk9ZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zZXNzaW9uVG9rZW49ZS5zZXNzaW9uVG9rZW59ZWxzZSB0aGlzLmFjY2Vzc0tleUlkPWFyZ3VtZW50c1swXSx0aGlzLnNlY3JldEFjY2Vzc0tleT1hcmd1bWVudHNbMV0sdGhpcy5zZXNzaW9uVG9rZW49YXJndW1lbnRzWzJdfSxleHBpcnlXaW5kb3c6MTUsbmVlZHNSZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGU9ci51dGlsLmRhdGUuZ2V0RGF0ZSgpLmdldFRpbWUoKSx0PW5ldyBEYXRlKGUrMWUzKnRoaXMuZXhwaXJ5V2luZG93KTtyZXR1cm4hISh0aGlzLmV4cGlyZVRpbWUmJnQ+dGhpcy5leHBpcmVUaW1lKXx8dGhpcy5leHBpcmVkfHwhdGhpcy5hY2Nlc3NLZXlJZHx8IXRoaXMuc2VjcmV0QWNjZXNzS2V5fSxnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLm5lZWRzUmVmcmVzaCgpP3RoaXMucmVmcmVzaCgoZnVuY3Rpb24obil7bnx8KHQuZXhwaXJlZD0hMSksZSYmZShuKX0pKTplJiZlKCl9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5leHBpcmVkPSExLGUoKX0sY29hbGVzY2VSZWZyZXNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczsxPT09bi5yZWZyZXNoQ2FsbGJhY2tzLnB1c2goZSkmJm4ubG9hZCgoZnVuY3Rpb24oZSl7ci51dGlsLmFycmF5RWFjaChuLnJlZnJlc2hDYWxsYmFja3MsKGZ1bmN0aW9uKG4pe3Q/bihlKTpyLnV0aWwuZGVmZXIoKGZ1bmN0aW9uKCl7bihlKX0pKX0pKSxuLnJlZnJlc2hDYWxsYmFja3MubGVuZ3RoPTB9KSl9LGxvYWQ6ZnVuY3Rpb24oZSl7ZSgpfX0pLHIuQ3JlZGVudGlhbHMuYWRkUHJvbWlzZXNUb0NsYXNzPWZ1bmN0aW9uKGUpe3RoaXMucHJvdG90eXBlLmdldFByb21pc2U9ci51dGlsLnByb21pc2lmeU1ldGhvZCgiZ2V0IixlKSx0aGlzLnByb3RvdHlwZS5yZWZyZXNoUHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJyZWZyZXNoIixlKX0sci5DcmVkZW50aWFscy5kZWxldGVQcm9taXNlc0Zyb21DbGFzcz1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByb3RvdHlwZS5nZXRQcm9taXNlLGRlbGV0ZSB0aGlzLnByb3RvdHlwZS5yZWZyZXNoUHJvbWlzZX0sci51dGlsLmFkZFByb21pc2VzKHIuQ3JlZGVudGlhbHMpfSx7Ii4vY29yZSI6MTl9XSwyMTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5DaGFpbmFibGVUZW1wb3JhcnlDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksZT1lfHx7fSx0aGlzLmVycm9yQ29kZT0iQ2hhaW5hYmxlVGVtcG9yYXJ5Q3JlZGVudGlhbHNQcm92aWRlckZhaWx1cmUiLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnRva2VuQ29kZUZuPW51bGw7dmFyIHQ9ci51dGlsLmNvcHkoZS5wYXJhbXMpfHx7fTtpZih0LlJvbGVBcm4mJih0LlJvbGVTZXNzaW9uTmFtZT10LlJvbGVTZXNzaW9uTmFtZXx8InRlbXBvcmFyeS1jcmVkZW50aWFscyIpLHQuU2VyaWFsTnVtYmVyKXtpZighZS50b2tlbkNvZGVGbnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9rZW5Db2RlRm4pdGhyb3cgbmV3IHIudXRpbC5lcnJvcihuZXcgRXJyb3IoInRva2VuQ29kZUZuIG11c3QgYmUgYSBmdW5jdGlvbiB3aGVuIHBhcmFtcy5TZXJpYWxOdW1iZXIgaXMgZ2l2ZW4iKSx7Y29kZTp0aGlzLmVycm9yQ29kZX0pO3RoaXMudG9rZW5Db2RlRm49ZS50b2tlbkNvZGVGbn12YXIgbj1yLnV0aWwubWVyZ2Uoe3BhcmFtczp0LGNyZWRlbnRpYWxzOmUubWFzdGVyQ3JlZGVudGlhbHN8fHIuY29uZmlnLmNyZWRlbnRpYWxzfSxlLnN0c0NvbmZpZ3x8e30pO3RoaXMuc2VydmljZT1uZXcgbyhuKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10LnNlcnZpY2UuY29uZmlnLnBhcmFtcy5Sb2xlQXJuPyJhc3N1bWVSb2xlIjoiZ2V0U2Vzc2lvblRva2VuIjt0aGlzLmdldFRva2VuQ29kZSgoZnVuY3Rpb24ocixvKXt2YXIgaT17fTtyP2Uocik6KG8mJihpLlRva2VuQ29kZT1vKSx0LnNlcnZpY2Vbbl0oaSwoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKSl9KSl9LGdldFRva2VuQ29kZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMudG9rZW5Db2RlRm4/dGhpcy50b2tlbkNvZGVGbih0aGlzLnNlcnZpY2UuY29uZmlnLnBhcmFtcy5TZXJpYWxOdW1iZXIsKGZ1bmN0aW9uKG4sbyl7aWYobil7dmFyIGk9bjtyZXR1cm4gbiBpbnN0YW5jZW9mIEVycm9yJiYoaT1uLm1lc3NhZ2UpLHZvaWQgZShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJFcnJvciBmZXRjaGluZyBNRkEgdG9rZW46ICIraSkse2NvZGU6dC5lcnJvckNvZGV9KSl9ZShudWxsLG8pfSkpOmUobnVsbCl9fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL2NvZ25pdG9pZGVudGl0eSIpLGk9ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLkNvZ25pdG9JZGVudGl0eUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2xvY2FsU3RvcmFnZUtleTp7aWQ6ImF3cy5jb2duaXRvLmlkZW50aXR5LWlkLiIscHJvdmlkZXJzOiJhd3MuY29nbml0by5pZGVudGl0eS1wcm92aWRlcnMuIn0sY29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWUsdGhpcy5kYXRhPW51bGwsdGhpcy5faWRlbnRpdHlJZD1udWxsLHRoaXMuX2NsaWVudENvbmZpZz1yLnV0aWwuY29weSh0fHx7fSksdGhpcy5sb2FkQ2FjaGVkSWQoKTt2YXIgbj10aGlzO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZGVudGl0eUlkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4ubG9hZENhY2hlZElkKCksbi5faWRlbnRpdHlJZHx8bi5wYXJhbXMuSWRlbnRpdHlJZH0sc2V0OmZ1bmN0aW9uKGUpe24uX2lkZW50aXR5SWQ9ZX19KX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5kYXRhPW51bGwsdC5faWRlbnRpdHlJZD1udWxsLHQuZ2V0SWQoKGZ1bmN0aW9uKG4pe24/KHQuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKSxlKG4pKTp0LnBhcmFtcy5Sb2xlQXJuP3QuZ2V0Q3JlZGVudGlhbHNGcm9tU1RTKGUpOnQuZ2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eShlKX0pKX0sY2xlYXJDYWNoZWRJZDpmdW5jdGlvbigpe3RoaXMuX2lkZW50aXR5SWQ9bnVsbCxkZWxldGUgdGhpcy5wYXJhbXMuSWRlbnRpdHlJZDt2YXIgZT10aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCx0PXRoaXMucGFyYW1zLkxvZ2luSWR8fCIiO2RlbGV0ZSB0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXkuaWQrZSt0XSxkZWxldGUgdGhpcy5zdG9yYWdlW3RoaXMubG9jYWxTdG9yYWdlS2V5LnByb3ZpZGVycytlK3RdfSxjbGVhcklkT25Ob3RBdXRob3JpemVkOmZ1bmN0aW9uKGUpeyJOb3RBdXRob3JpemVkRXhjZXB0aW9uIj09ZS5jb2RlJiZ0aGlzLmNsZWFyQ2FjaGVkSWQoKX0sZ2V0SWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZigic3RyaW5nIj09dHlwZW9mIHQucGFyYW1zLklkZW50aXR5SWQpcmV0dXJuIGUobnVsbCx0LnBhcmFtcy5JZGVudGl0eUlkKTt0LmNvZ25pdG8uZ2V0SWQoKGZ1bmN0aW9uKG4scil7IW4mJnIuSWRlbnRpdHlJZD8odC5wYXJhbXMuSWRlbnRpdHlJZD1yLklkZW50aXR5SWQsZShudWxsLHIuSWRlbnRpdHlJZCkpOmUobil9KSl9LGxvYWRDcmVkZW50aWFsczpmdW5jdGlvbihlLHQpe2UmJnQmJih0LmV4cGlyZWQ9ITEsdC5hY2Nlc3NLZXlJZD1lLkNyZWRlbnRpYWxzLkFjY2Vzc0tleUlkLHQuc2VjcmV0QWNjZXNzS2V5PWUuQ3JlZGVudGlhbHMuU2VjcmV0S2V5LHQuc2Vzc2lvblRva2VuPWUuQ3JlZGVudGlhbHMuU2Vzc2lvblRva2VuLHQuZXhwaXJlVGltZT1lLkNyZWRlbnRpYWxzLkV4cGlyYXRpb24pfSxnZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jb2duaXRvLmdldENyZWRlbnRpYWxzRm9ySWRlbnRpdHkoKGZ1bmN0aW9uKG4scil7bj90LmNsZWFySWRPbk5vdEF1dGhvcml6ZWQobik6KHQuY2FjaGVJZChyKSx0LmRhdGE9cix0LmxvYWRDcmVkZW50aWFscyh0LmRhdGEsdCkpLGUobil9KSl9LGdldENyZWRlbnRpYWxzRnJvbVNUUzpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY29nbml0by5nZXRPcGVuSWRUb2tlbigoZnVuY3Rpb24obixyKXtuPyh0LmNsZWFySWRPbk5vdEF1dGhvcml6ZWQobiksZShuKSk6KHQuY2FjaGVJZChyKSx0LnBhcmFtcy5XZWJJZGVudGl0eVRva2VuPXIuVG9rZW4sdC53ZWJJZGVudGl0eUNyZWRlbnRpYWxzLnJlZnJlc2goKGZ1bmN0aW9uKG4pe258fCh0LmRhdGE9dC53ZWJJZGVudGl0eUNyZWRlbnRpYWxzLmRhdGEsdC5zdHMuY3JlZGVudGlhbHNGcm9tKHQuZGF0YSx0KSksZShuKX0pKSl9KSl9LGxvYWRDYWNoZWRJZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoci51dGlsLmlzQnJvd3NlcigpJiYhZS5wYXJhbXMuSWRlbnRpdHlJZCl7dmFyIHQ9ZS5nZXRTdG9yYWdlKCJpZCIpO2lmKHQmJmUucGFyYW1zLkxvZ2lucyl7dmFyIG49T2JqZWN0LmtleXMoZS5wYXJhbXMuTG9naW5zKTswIT09KGUuZ2V0U3RvcmFnZSgicHJvdmlkZXJzIil8fCIiKS5zcGxpdCgiLCIpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1uLmluZGV4T2YoZSl9KSkubGVuZ3RoJiYoZS5wYXJhbXMuSWRlbnRpdHlJZD10KX1lbHNlIHQmJihlLnBhcmFtcy5JZGVudGl0eUlkPXQpfX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NsaWVudENvbmZpZztpZih0aGlzLndlYklkZW50aXR5Q3JlZGVudGlhbHM9dGhpcy53ZWJJZGVudGl0eUNyZWRlbnRpYWxzfHxuZXcgci5XZWJJZGVudGl0eUNyZWRlbnRpYWxzKHRoaXMucGFyYW1zLGUpLCF0aGlzLmNvZ25pdG8pe3ZhciB0PXIudXRpbC5tZXJnZSh7fSxlKTt0LnBhcmFtcz10aGlzLnBhcmFtcyx0aGlzLmNvZ25pdG89bmV3IG8odCl9dGhpcy5zdHM9dGhpcy5zdHN8fG5ldyBpKGUpfSxjYWNoZUlkOmZ1bmN0aW9uKGUpe3RoaXMuX2lkZW50aXR5SWQ9ZS5JZGVudGl0eUlkLHRoaXMucGFyYW1zLklkZW50aXR5SWQ9dGhpcy5faWRlbnRpdHlJZCxyLnV0aWwuaXNCcm93c2VyKCkmJih0aGlzLnNldFN0b3JhZ2UoImlkIixlLklkZW50aXR5SWQpLHRoaXMucGFyYW1zLkxvZ2lucyYmdGhpcy5zZXRTdG9yYWdlKCJwcm92aWRlcnMiLE9iamVjdC5rZXlzKHRoaXMucGFyYW1zLkxvZ2lucykuam9pbigiLCIpKSl9LGdldFN0b3JhZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleVtlXSt0aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCsodGhpcy5wYXJhbXMuTG9naW5JZHx8IiIpXX0sc2V0U3RvcmFnZTpmdW5jdGlvbihlLHQpe3RyeXt0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXlbZV0rdGhpcy5wYXJhbXMuSWRlbnRpdHlQb29sSWQrKHRoaXMucGFyYW1zLkxvZ2luSWR8fCIiKV09dH1jYXRjaChlKXt9fSxzdG9yYWdlOmZ1bmN0aW9uKCl7dHJ5e3ZhciBlPXIudXRpbC5pc0Jyb3dzZXIoKSYmbnVsbCE9PXdpbmRvdy5sb2NhbFN0b3JhZ2UmJiJvYmplY3QiPT10eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZT93aW5kb3cubG9jYWxTdG9yYWdlOnt9O3JldHVybiBlWyJhd3MudGVzdC1zdG9yYWdlIl09ImZvb2JhciIsZGVsZXRlIGVbImF3cy50ZXN0LXN0b3JhZ2UiXSxlfWNhdGNoKGUpe3JldHVybnt9fX0oKX0pfSx7Ii4uLy4uL2NsaWVudHMvY29nbml0b2lkZW50aXR5Ijo3LCIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKTtyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMucHJvdmlkZXJzPWV8fHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVmYXVsdFByb3ZpZGVycy5zbGljZSgwKSx0aGlzLnJlc29sdmVDYWxsYmFja3M9W119LHJlc29sdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZigwPT09dC5wcm92aWRlcnMubGVuZ3RoKXJldHVybiBlKG5ldyBFcnJvcigiTm8gcHJvdmlkZXJzIikpLHQ7aWYoMT09PXQucmVzb2x2ZUNhbGxiYWNrcy5wdXNoKGUpKXt2YXIgbj0wLG89dC5wcm92aWRlcnMuc2xpY2UoMCk7IWZ1bmN0aW9uIGUoaSxzKXtpZighaSYmc3x8bj09PW8ubGVuZ3RoKXJldHVybiByLnV0aWwuYXJyYXlFYWNoKHQucmVzb2x2ZUNhbGxiYWNrcywoZnVuY3Rpb24oZSl7ZShpLHMpfSkpLHZvaWQodC5yZXNvbHZlQ2FsbGJhY2tzLmxlbmd0aD0wKTt2YXIgYT1vW24rK107KHM9ImZ1bmN0aW9uIj09dHlwZW9mIGE/YS5jYWxsKCk6YSkuZ2V0P3MuZ2V0KChmdW5jdGlvbih0KXtlKHQsdD9udWxsOnMpfSkpOmUobnVsbCxzKX0oKX1yZXR1cm4gdH19KSxyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluLmRlZmF1bHRQcm92aWRlcnM9W10sci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUucmVzb2x2ZVByb21pc2U9ci51dGlsLnByb21pc2lmeU1ldGhvZCgicmVzb2x2ZSIsZSl9LHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVsZXRlUHJvbWlzZXNGcm9tQ2xhc3M9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcm90b3R5cGUucmVzb2x2ZVByb21pc2V9LHIudXRpbC5hZGRQcm9taXNlcyhyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluKX0seyIuLi9jb3JlIjoxOX1dLDI0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLlNBTUxDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWV9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQuc2VydmljZS5hc3N1bWVSb2xlV2l0aFNBTUwoKGZ1bmN0aW9uKG4scil7bnx8dC5zZXJ2aWNlLmNyZWRlbnRpYWxzRnJvbShyLHQpLGUobil9KSl9LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXt0aGlzLnNlcnZpY2U9dGhpcy5zZXJ2aWNlfHxuZXcgbyh7cGFyYW1zOnRoaXMucGFyYW1zfSl9fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuVGVtcG9yYXJ5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5sb2FkTWFzdGVyQ3JlZGVudGlhbHModCksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWV8fHt9LHRoaXMucGFyYW1zLlJvbGVBcm4mJih0aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWU9dGhpcy5wYXJhbXMuUm9sZVNlc3Npb25OYW1lfHwidGVtcG9yYXJ5LWNyZWRlbnRpYWxzIil9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQubWFzdGVyQ3JlZGVudGlhbHMuZ2V0KChmdW5jdGlvbigpe3Quc2VydmljZS5jb25maWcuY3JlZGVudGlhbHM9dC5tYXN0ZXJDcmVkZW50aWFscywodC5wYXJhbXMuUm9sZUFybj90LnNlcnZpY2UuYXNzdW1lUm9sZTp0LnNlcnZpY2UuZ2V0U2Vzc2lvblRva2VuKS5jYWxsKHQuc2VydmljZSwoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKX0pKX0sbG9hZE1hc3RlckNyZWRlbnRpYWxzOmZ1bmN0aW9uKGUpe2Zvcih0aGlzLm1hc3RlckNyZWRlbnRpYWxzPWV8fHIuY29uZmlnLmNyZWRlbnRpYWxzO3RoaXMubWFzdGVyQ3JlZGVudGlhbHMubWFzdGVyQ3JlZGVudGlhbHM7KXRoaXMubWFzdGVyQ3JlZGVudGlhbHM9dGhpcy5tYXN0ZXJDcmVkZW50aWFscy5tYXN0ZXJDcmVkZW50aWFsczsiZnVuY3Rpb24iIT10eXBlb2YgdGhpcy5tYXN0ZXJDcmVkZW50aWFscy5nZXQmJih0aGlzLm1hc3RlckNyZWRlbnRpYWxzPW5ldyByLkNyZWRlbnRpYWxzKHRoaXMubWFzdGVyQ3JlZGVudGlhbHMpKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3RoaXMuc2VydmljZT10aGlzLnNlcnZpY2V8fG5ldyBvKHtwYXJhbXM6dGhpcy5wYXJhbXN9KX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyNjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5XZWJJZGVudGl0eUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7ci5DcmVkZW50aWFscy5jYWxsKHRoaXMpLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnBhcmFtcz1lLHRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZT10aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWV8fCJ3ZWItaWRlbnRpdHkiLHRoaXMuZGF0YT1udWxsLHRoaXMuX2NsaWVudENvbmZpZz1yLnV0aWwuY29weSh0fHx7fSl9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQuc2VydmljZS5hc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5KChmdW5jdGlvbihuLHIpe3QuZGF0YT1udWxsLG58fCh0LmRhdGE9cix0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCkpLGUobil9KSl9LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXtpZighdGhpcy5zZXJ2aWNlKXt2YXIgZT1yLnV0aWwubWVyZ2Uoe30sdGhpcy5fY2xpZW50Q29uZmlnKTtlLnBhcmFtcz10aGlzLnBhcmFtcyx0aGlzLnNlcnZpY2U9bmV3IG8oZSl9fX0pfSx7Ii4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDI3OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpLG89ZSgiLi91dGlsIiksaT1bIkFXU19FTkFCTEVfRU5EUE9JTlRfRElTQ09WRVJZIiwiQVdTX0VORFBPSU5UX0RJU0NPVkVSWV9FTkFCTEVEIl07ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmFwaXx8e30scj0obi5vcGVyYXRpb25zLHt9KTtyZXR1cm4gdC5jb25maWcucmVnaW9uJiYoci5yZWdpb249dC5jb25maWcucmVnaW9uKSxuLnNlcnZpY2VJZCYmKHIuc2VydmljZUlkPW4uc2VydmljZUlkKSx0LmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmKHIuYWNjZXNzS2V5SWQ9dC5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQpLHJ9ZnVuY3Rpb24gYShlLHQsbil7biYmbnVsbCE9dCYmInN0cnVjdHVyZSI9PT1uLnR5cGUmJm4ucmVxdWlyZWQmJm4ucmVxdWlyZWQubGVuZ3RoPjAmJm8uYXJyYXlFYWNoKG4ucmVxdWlyZWQsKGZ1bmN0aW9uKHIpe3ZhciBvPW4ubWVtYmVyc1tyXTtpZighMD09PW8uZW5kcG9pbnREaXNjb3ZlcnlJZCl7dmFyIGk9by5pc0xvY2F0aW9uTmFtZT9vLm5hbWU6cjtlW2ldPVN0cmluZyh0W3JdKX1lbHNlIGEoZSx0W3JdLG8pfSkpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj17fTtyZXR1cm4gYShuLGUucGFyYW1zLHQpLG59ZnVuY3Rpb24gdShlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmFwaSxpPW4ub3BlcmF0aW9ucz9uLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dOnZvaWQgMCxhPWMoZSxpP2kuaW5wdXQ6dm9pZCAwKSx1PXMoZSk7T2JqZWN0LmtleXMoYSkubGVuZ3RoPjAmJih1PW8udXBkYXRlKHUsYSksaSYmKHUub3BlcmF0aW9uPWkubmFtZSkpO3ZhciBsPXIuZW5kcG9pbnRDYWNoZS5nZXQodSk7aWYoIWx8fDEhPT1sLmxlbmd0aHx8IiIhPT1sWzBdLkFkZHJlc3MpaWYobCYmbC5sZW5ndGg+MCllLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGxbMF0uQWRkcmVzcyk7ZWxzZXt2YXIgcD10Lm1ha2VSZXF1ZXN0KG4uZW5kcG9pbnRPcGVyYXRpb24se09wZXJhdGlvbjppLm5hbWUsSWRlbnRpZmllcnM6YX0pO2QocCkscC5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSxwLnJlbW92ZUxpc3RlbmVyKCJyZXRyeSIsci5FdmVudExpc3RlbmVycy5Db3JlLlJFVFJZX0NIRUNLKSxyLmVuZHBvaW50Q2FjaGUucHV0KHUsW3tBZGRyZXNzOiIiLENhY2hlUGVyaW9kSW5NaW51dGVzOjF9XSkscC5zZW5kKChmdW5jdGlvbihlLHQpe3QmJnQuRW5kcG9pbnRzP3IuZW5kcG9pbnRDYWNoZS5wdXQodSx0LkVuZHBvaW50cyk6ZSYmci5lbmRwb2ludENhY2hlLnB1dCh1LFt7QWRkcmVzczoiIixDYWNoZVBlcmlvZEluTWludXRlczoxfV0pfSkpfX12YXIgbD17fTtmdW5jdGlvbiBwKGUsdCl7dmFyIG49ZS5zZXJ2aWNlLGk9bi5hcGksYT1pLm9wZXJhdGlvbnM/aS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTp2b2lkIDAsdT1hP2EuaW5wdXQ6dm9pZCAwLHA9YyhlLHUpLGg9cyhlKTtPYmplY3Qua2V5cyhwKS5sZW5ndGg+MCYmKGg9by51cGRhdGUoaCxwKSxhJiYoaC5vcGVyYXRpb249YS5uYW1lKSk7dmFyIGY9ci5FbmRwb2ludENhY2hlLmdldEtleVN0cmluZyhoKSxnPXIuZW5kcG9pbnRDYWNoZS5nZXQoZik7aWYoZyYmMT09PWcubGVuZ3RoJiYiIj09PWdbMF0uQWRkcmVzcylyZXR1cm4gbFtmXXx8KGxbZl09W10pLHZvaWQgbFtmXS5wdXNoKHtyZXF1ZXN0OmUsY2FsbGJhY2s6dH0pO2lmKGcmJmcubGVuZ3RoPjApZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChnWzBdLkFkZHJlc3MpLHQoKTtlbHNle3ZhciBtPW4ubWFrZVJlcXVlc3QoaS5lbmRwb2ludE9wZXJhdGlvbix7T3BlcmF0aW9uOmEubmFtZSxJZGVudGlmaWVyczpwfSk7bS5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSxkKG0pLHIuZW5kcG9pbnRDYWNoZS5wdXQoZixbe0FkZHJlc3M6IiIsQ2FjaGVQZXJpb2RJbk1pbnV0ZXM6NjB9XSksbS5zZW5kKChmdW5jdGlvbihuLGkpe2lmKG4pe2lmKGUucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuLHtyZXRyeWFibGU6ITF9KSxyLmVuZHBvaW50Q2FjaGUucmVtb3ZlKGgpLGxbZl0pe3ZhciBzPWxbZl07by5hcnJheUVhY2gocywoZnVuY3Rpb24oZSl7ZS5yZXF1ZXN0LnJlc3BvbnNlLmVycm9yPW8uZXJyb3Iobix7cmV0cnlhYmxlOiExfSksZS5jYWxsYmFjaygpfSkpLGRlbGV0ZSBsW2ZdfX1lbHNlIGkmJihyLmVuZHBvaW50Q2FjaGUucHV0KGYsaS5FbmRwb2ludHMpLGUuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQoaS5FbmRwb2ludHNbMF0uQWRkcmVzcyksbFtmXSkmJihzPWxbZl0sby5hcnJheUVhY2gocywoZnVuY3Rpb24oZSl7ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGkuRW5kcG9pbnRzWzBdLkFkZHJlc3MpLGUuY2FsbGJhY2soKX0pKSxkZWxldGUgbFtmXSk7dCgpfSkpfX1mdW5jdGlvbiBkKGUpe3ZhciB0PWUuc2VydmljZS5hcGkuYXBpVmVyc2lvbjt0JiYhZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1hcGktdmVyc2lvbiJdJiYoZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1hcGktdmVyc2lvbiJdPXQpfWZ1bmN0aW9uIGgoZSl7dmFyIHQ9ZS5lcnJvcixuPWUuaHR0cFJlc3BvbnNlO2lmKHQmJigiSW52YWxpZEVuZHBvaW50RXhjZXB0aW9uIj09PXQuY29kZXx8NDIxPT09bi5zdGF0dXNDb2RlKSl7dmFyIGk9ZS5yZXF1ZXN0LGE9aS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSx1PWMoaSxhW2kub3BlcmF0aW9uXT9hW2kub3BlcmF0aW9uXS5pbnB1dDp2b2lkIDApLGw9cyhpKTtPYmplY3Qua2V5cyh1KS5sZW5ndGg+MCYmKGw9by51cGRhdGUobCx1KSxhW2kub3BlcmF0aW9uXSYmKGwub3BlcmF0aW9uPWFbaS5vcGVyYXRpb25dLm5hbWUpKSxyLmVuZHBvaW50Q2FjaGUucmVtb3ZlKGwpfX1mdW5jdGlvbiBmKGUpe3JldHVyblsiZmFsc2UiLCIwIl0uaW5kZXhPZihlKT49MH10LmV4cG9ydHM9e2Rpc2NvdmVyRW5kcG9pbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgcz1lLnNlcnZpY2V8fHt9O2lmKGZ1bmN0aW9uKGUpe2lmKGUuX29yaWdpbmFsQ29uZmlnJiZlLl9vcmlnaW5hbENvbmZpZy5lbmRwb2ludCYmITA9PT1lLl9vcmlnaW5hbENvbmZpZy5lbmRwb2ludERpc2NvdmVyeUVuYWJsZWQpdGhyb3cgby5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLG1lc3NhZ2U6IkN1c3RvbSBlbmRwb2ludCBpcyBzdXBwbGllZDsgZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkIG11c3Qgbm90IGJlIHRydWUuIn0pO3ZhciB0PXIuY29uZmlnW2Uuc2VydmljZUlkZW50aWZpZXJdfHx7fTtyZXR1cm4gQm9vbGVhbihyLmNvbmZpZy5lbmRwb2ludHx8dC5lbmRwb2ludHx8ZS5fb3JpZ2luYWxDb25maWcmJmUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50KX0ocyl8fGUuaXNQcmVzaWduZWQoKSlyZXR1cm4gdCgpO3ZhciBhPShzLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dLGM9YT9hLmVuZHBvaW50RGlzY292ZXJ5UmVxdWlyZWQ6Ik5VTEwiLGw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlfHx7fTtpZih2b2lkIDAhPT10LmNvbmZpZy5lbmRwb2ludERpc2NvdmVyeUVuYWJsZWQpcmV0dXJuIHQuY29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZDtpZighby5pc0Jyb3dzZXIoKSl7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBhPWlbc107aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4uZW52LGEpKXtpZigiIj09PW4uZW52W2FdfHx2b2lkIDA9PT1uLmVudlthXSl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiZW52aXJvbm1lbnRhbCB2YXJpYWJsZSAiK2ErIiBjYW5ub3QgYmUgc2V0IHRvIG5vdGhpbmcifSk7cmV0dXJuIWYobi5lbnZbYV0pfX12YXIgYz17fTt0cnl7Yz1yLnV0aWwuaW5pTG9hZGVyP3IudXRpbC5pbmlMb2FkZXIubG9hZEZyb20oe2lzQ29uZmlnOiEwLGZpbGVuYW1lOm4uZW52W3IudXRpbC5zaGFyZWRDb25maWdGaWxlRW52XX0pOnt9fWNhdGNoKGUpe312YXIgdT1jW24uZW52LkFXU19QUk9GSUxFfHxyLnV0aWwuZGVmYXVsdFByb2ZpbGVdfHx7fTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodSwiZW5kcG9pbnRfZGlzY292ZXJ5X2VuYWJsZWQiKSl7aWYodm9pZCAwPT09dS5lbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiY29uZmlnIGZpbGUgZW50cnkgJ2VuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkJyBjYW5ub3QgYmUgc2V0IHRvIG5vdGhpbmcifSk7cmV0dXJuIWYodS5lbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCl9fX0oZSksZD1zLmFwaS5oYXNSZXF1aXJlZEVuZHBvaW50RGlzY292ZXJ5O3N3aXRjaCgobHx8ZCkmJmUuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQoImVuZHBvaW50LWRpc2NvdmVyeSIpLGMpe2Nhc2UiT1BUSU9OQUwiOihsfHxkKSYmKHUoZSksZS5hZGROYW1lZExpc3RlbmVyKCJJTlZBTElEQVRFX0NBQ0hFRF9FTkRQT0lOVFMiLCJleHRyYWN0RXJyb3IiLGgpKSx0KCk7YnJlYWs7Y2FzZSJSRVFVSVJFRCI6aWYoITE9PT1sKXtlLnJlc3BvbnNlLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJFbmRwb2ludCBEaXNjb3ZlcnkgaXMgZGlzYWJsZWQgYnV0ICIrcy5hcGkuY2xhc3NOYW1lKyIuIitlLm9wZXJhdGlvbisiKCkgcmVxdWlyZXMgaXQuIFBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb25zLiJ9KSx0KCk7YnJlYWt9ZS5hZGROYW1lZExpc3RlbmVyKCJJTlZBTElEQVRFX0NBQ0hFRF9FTkRQT0lOVFMiLCJleHRyYWN0RXJyb3IiLGgpLHAoZSx0KTticmVhaztkZWZhdWx0OnQoKX19LHJlcXVpcmVkRGlzY292ZXJFbmRwb2ludDpwLG9wdGlvbmFsRGlzY292ZXJFbmRwb2ludDp1LG1hcnNoYWxsQ3VzdG9tSWRlbnRpZmllcnM6YyxnZXRDYWNoZUtleTpzLGludmFsaWRhdGVDYWNoZWRFbmRwb2ludDpofX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi91dGlsIjo3NCxfcHJvY2Vzczo5MX1dLDI4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vZXZlbnQtc3RyZWFtL2V2ZW50LW1lc3NhZ2UtY2h1bmtlciIpLmV2ZW50TWVzc2FnZUNodW5rZXIsbz1lKCIuL3BhcnNlLWV2ZW50IikucGFyc2VFdmVudDt0LmV4cG9ydHM9e2NyZWF0ZUV2ZW50U3RyZWFtOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9cihlKSxzPVtdLGE9MDthPGkubGVuZ3RoO2ErKylzLnB1c2gobyh0LGlbYV0sbikpO3JldHVybiBzfX19LHsiLi4vZXZlbnQtc3RyZWFtL2V2ZW50LW1lc3NhZ2UtY2h1bmtlciI6MjksIi4vcGFyc2UtZXZlbnQiOjMxfV0sMjk6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2V2ZW50TWVzc2FnZUNodW5rZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOyl7dmFyIHI9ZS5yZWFkSW50MzJCRShuKSxvPWUuc2xpY2UobixyK24pO24rPXIsdC5wdXNoKG8pfXJldHVybiB0fX19LHt9XSwzMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKS51dGlsLG89ci5idWZmZXIudG9CdWZmZXI7ZnVuY3Rpb24gaShlKXtpZig4IT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnQ2NCBidWZmZXJzIG11c3QgYmUgZXhhY3RseSA4IGJ5dGVzIik7ci5CdWZmZXIuaXNCdWZmZXIoZSl8fChlPW8oZSkpLHRoaXMuYnl0ZXM9ZX1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgdD0wO3Q8ODt0KyspZVt0XV49MjU1O2Zvcih0PTc7dD4tMSYmKGVbdF0rKywwPT09ZVt0XSk7dC0tKTt9aS5mcm9tTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKGU+MHg4MDAwMDAwMDAwMDAwMDAwfHxlPC0weDgwMDAwMDAwMDAwMDAwMDApdGhyb3cgbmV3IEVycm9yKGUrIiBpcyB0b28gbGFyZ2UgKG9yLCBpZiBuZWdhdGl2ZSwgdG9vIHNtYWxsKSB0byByZXByZXNlbnQgYXMgYW4gSW50NjQiKTtmb3IodmFyIHQ9bmV3IFVpbnQ4QXJyYXkoOCksbj03LHI9TWF0aC5hYnMoTWF0aC5yb3VuZChlKSk7bj4tMSYmcj4wO24tLSxyLz0yNTYpdFtuXT1yO3JldHVybiBlPDAmJnModCksbmV3IGkodCl9LGkucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJ5dGVzLnNsaWNlKDApLHQ9MTI4JmVbMF07cmV0dXJuIHQmJnMoZSkscGFyc2VJbnQoZS50b1N0cmluZygiaGV4IiksMTYpKih0Py0xOjEpfSxpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcy52YWx1ZU9mKCkpfSx0LmV4cG9ydHM9e0ludDY0Oml9fSx7Ii4uL2NvcmUiOjE5fV0sMzE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3BhcnNlLW1lc3NhZ2UiKS5wYXJzZU1lc3NhZ2U7dC5leHBvcnRzPXtwYXJzZUV2ZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1yKHQpLGk9by5oZWFkZXJzWyI6bWVzc2FnZS10eXBlIl07aWYoaSl7aWYoImVycm9yIj09PWkudmFsdWUpdGhyb3cgZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oZWFkZXJzWyI6ZXJyb3ItY29kZSJdLG49ZS5oZWFkZXJzWyI6ZXJyb3ItbWVzc2FnZSJdLHI9bmV3IEVycm9yKG4udmFsdWV8fG4pO3JldHVybiByLmNvZGU9ci5uYW1lPXQudmFsdWV8fHQscn0obyk7aWYoImV2ZW50IiE9PWkudmFsdWUpcmV0dXJufXZhciBzPW8uaGVhZGVyc1siOmV2ZW50LXR5cGUiXSxhPW4ubWVtYmVyc1tzLnZhbHVlXTtpZihhKXt2YXIgYz17fSx1PWEuZXZlbnRQYXlsb2FkTWVtYmVyTmFtZTtpZih1KXt2YXIgbD1hLm1lbWJlcnNbdV07ImJpbmFyeSI9PT1sLnR5cGU/Y1t1XT1vLmJvZHk6Y1t1XT1lLnBhcnNlKG8uYm9keS50b1N0cmluZygpLGwpfWZvcih2YXIgcD1hLmV2ZW50SGVhZGVyTWVtYmVyTmFtZXMsZD0wO2Q8cC5sZW5ndGg7ZCsrKXt2YXIgaD1wW2RdO28uaGVhZGVyc1toXSYmKGNbaF09YS5tZW1iZXJzW2hdLnRvVHlwZShvLmhlYWRlcnNbaF0udmFsdWUpKX12YXIgZj17fTtyZXR1cm4gZltzLnZhbHVlXT1jLGZ9fX19LHsiLi9wYXJzZS1tZXNzYWdlIjozMn1dLDMyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9pbnQ2NCIpLkludDY0LG89ZSgiLi9zcGxpdC1tZXNzYWdlIikuc3BsaXRNZXNzYWdlLGk9ImJvb2xlYW4iLHM9ImJ5dGUiLGE9InNob3J0IixjPSJpbnRlZ2VyIix1PSJsb25nIixsPSJiaW5hcnkiLHA9InN0cmluZyIsZD0idGltZXN0YW1wIixoPSJ1dWlkIjtmdW5jdGlvbiBmKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDspe3ZhciBvPWUucmVhZFVJbnQ4KG4rKyksZj1lLnNsaWNlKG4sbitvKS50b1N0cmluZygpO3N3aXRjaChuKz1vLGUucmVhZFVJbnQ4KG4rKykpe2Nhc2UgMDp0W2ZdPXt0eXBlOmksdmFsdWU6ITB9O2JyZWFrO2Nhc2UgMTp0W2ZdPXt0eXBlOmksdmFsdWU6ITF9O2JyZWFrO2Nhc2UgMjp0W2ZdPXt0eXBlOnMsdmFsdWU6ZS5yZWFkSW50OChuKyspfTticmVhaztjYXNlIDM6dFtmXT17dHlwZTphLHZhbHVlOmUucmVhZEludDE2QkUobil9LG4rPTI7YnJlYWs7Y2FzZSA0OnRbZl09e3R5cGU6Yyx2YWx1ZTplLnJlYWRJbnQzMkJFKG4pfSxuKz00O2JyZWFrO2Nhc2UgNTp0W2ZdPXt0eXBlOnUsdmFsdWU6bmV3IHIoZS5zbGljZShuLG4rOCkpfSxuKz04O2JyZWFrO2Nhc2UgNjp2YXIgZz1lLnJlYWRVSW50MTZCRShuKTtuKz0yLHRbZl09e3R5cGU6bCx2YWx1ZTplLnNsaWNlKG4sbitnKX0sbis9ZzticmVhaztjYXNlIDc6dmFyIG09ZS5yZWFkVUludDE2QkUobik7bis9Mix0W2ZdPXt0eXBlOnAsdmFsdWU6ZS5zbGljZShuLG4rbSkudG9TdHJpbmcoKX0sbis9bTticmVhaztjYXNlIDg6dFtmXT17dHlwZTpkLHZhbHVlOm5ldyBEYXRlKG5ldyByKGUuc2xpY2UobixuKzgpKS52YWx1ZU9mKCkpfSxuKz04O2JyZWFrO2Nhc2UgOTp2YXIgdj1lLnNsaWNlKG4sbisxNikudG9TdHJpbmcoImhleCIpO24rPTE2LHRbZl09e3R5cGU6aCx2YWx1ZTp2LnN1YnN0cigwLDgpKyItIit2LnN1YnN0cig4LDQpKyItIit2LnN1YnN0cigxMiw0KSsiLSIrdi5zdWJzdHIoMTYsNCkrIi0iK3Yuc3Vic3RyKDIwKX07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBoZWFkZXIgdHlwZSB0YWciKX19cmV0dXJuIHR9dC5leHBvcnRzPXtwYXJzZU1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9byhlKTtyZXR1cm57aGVhZGVyczpmKHQuaGVhZGVycyksYm9keTp0LmJvZHl9fX19LHsiLi9pbnQ2NCI6MzAsIi4vc3BsaXQtbWVzc2FnZSI6MzN9XSwzMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKS51dGlsLG89ci5idWZmZXIudG9CdWZmZXI7dC5leHBvcnRzPXtzcGxpdE1lc3NhZ2U6ZnVuY3Rpb24oZSl7aWYoci5CdWZmZXIuaXNCdWZmZXIoZSl8fChlPW8oZSkpLGUubGVuZ3RoPDE2KXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgbWVzc2FnZSB0b28gc2hvcnQgdG8gYWNjb21tb2RhdGUgZXZlbnQgc3RyZWFtIG1lc3NhZ2Ugb3ZlcmhlYWQiKTtpZihlLmxlbmd0aCE9PWUucmVhZFVJbnQzMkJFKDApKXRocm93IG5ldyBFcnJvcigiUmVwb3J0ZWQgbWVzc2FnZSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGgiKTt2YXIgdD1lLnJlYWRVSW50MzJCRSg4KTtpZih0IT09ci5jcnlwdG8uY3JjMzIoZS5zbGljZSgwLDgpKSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcmVsdWRlIGNoZWNrc3VtIHNwZWNpZmllZCBpbiB0aGUgbWVzc2FnZSAoIit0KyIpIGRvZXMgbm90IG1hdGNoIHRoZSBjYWxjdWxhdGVkIENSQzMyIGNoZWNrc3VtLiIpO3ZhciBuPWUucmVhZFVJbnQzMkJFKGUubGVuZ3RoLTQpO2lmKG4hPT1yLmNyeXB0by5jcmMzMihlLnNsaWNlKDAsZS5sZW5ndGgtNCkpKXRocm93IG5ldyBFcnJvcigiVGhlIG1lc3NhZ2UgY2hlY2tzdW0gZGlkIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgIituKTt2YXIgaT0xMitlLnJlYWRVSW50MzJCRSg0KTtyZXR1cm57aGVhZGVyczplLnNsaWNlKDEyLGkpLGJvZHk6ZS5zbGljZShpLGUubGVuZ3RoLTQpfX19fSx7Ii4uL2NvcmUiOjE5fV0sMzQ6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7KGZ1bmN0aW9uKCl7dmFyIG49ZSgiLi9jb3JlIikscj1lKCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiKSxvPWUoIi4vZGlzY292ZXJfZW5kcG9pbnQiKS5kaXNjb3ZlckVuZHBvaW50O2Z1bmN0aW9uIGkoZSl7aWYoIWUuc2VydmljZS5hcGkub3BlcmF0aW9ucylyZXR1cm4iIjt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO3JldHVybiB0P3QuYXV0aHR5cGU6IiJ9ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnNlcnZpY2U7cmV0dXJuIHQuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24/dC5jb25maWcuc2lnbmF0dXJlVmVyc2lvbjp0LmFwaS5zaWduYXR1cmVWZXJzaW9uP3QuYXBpLnNpZ25hdHVyZVZlcnNpb246aShlKX1uLkV2ZW50TGlzdGVuZXJzPXtDb3JlOnt9fSxuLkV2ZW50TGlzdGVuZXJzPXtDb3JlOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKGUscil7cigiVkFMSURBVEVfQ1JFREVOVElBTFMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUsdCl7aWYoIWUuc2VydmljZS5hcGkuc2lnbmF0dXJlVmVyc2lvbiYmIWUuc2VydmljZS5jb25maWcuc2lnbmF0dXJlVmVyc2lvbilyZXR1cm4gdCgpOyJiZWFyZXIiIT09cyhlKT9lLnNlcnZpY2UuY29uZmlnLmdldENyZWRlbnRpYWxzKChmdW5jdGlvbihyKXtyJiYoZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3Iocix7Y29kZToiQ3JlZGVudGlhbHNFcnJvciIsbWVzc2FnZToiTWlzc2luZyBjcmVkZW50aWFscyBpbiBjb25maWcsIGlmIHVzaW5nIEFXU19DT05GSUdfRklMRSwgc2V0IEFXU19TREtfTE9BRF9DT05GSUc9MSJ9KSksdCgpfSkpOmUuc2VydmljZS5jb25maWcuZ2V0VG9rZW4oKGZ1bmN0aW9uKHIpe3ImJihlLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihyLHtjb2RlOiJUb2tlbkVycm9yIn0pKSx0KCl9KSl9KSksZSgiVkFMSURBVEVfUkVHSU9OIiwidmFsaWRhdGUiLChmdW5jdGlvbihlKXtpZighZS5zZXJ2aWNlLmlzR2xvYmFsRW5kcG9pbnQpe3ZhciB0PW5ldyBSZWdFeHAoL14oW2EtekEtWjAtOV18W2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSkkLyk7ZS5zZXJ2aWNlLmNvbmZpZy5yZWdpb24/dC50ZXN0KGUuc2VydmljZS5jb25maWcucmVnaW9uKXx8KGUucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlnRXJyb3IiLG1lc3NhZ2U6IkludmFsaWQgcmVnaW9uIGluIGNvbmZpZyJ9KSk6ZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWdFcnJvciIsbWVzc2FnZToiTWlzc2luZyByZWdpb24gaW4gY29uZmlnIn0pfX0pKSxlKCJCVUlMRF9JREVNUE9URU5DWV9UT0tFTlMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZih0KXt2YXIgcj10LmlkZW1wb3RlbnRNZW1iZXJzO2lmKHIubGVuZ3RoKXtmb3IodmFyIG89bi51dGlsLmNvcHkoZS5wYXJhbXMpLGk9MCxzPXIubGVuZ3RoO2k8cztpKyspb1tyW2ldXXx8KG9bcltpXV09bi51dGlsLnV1aWQudjQoKSk7ZS5wYXJhbXM9b319fX0pKSxlKCJWQUxJREFURV9QQVJBTUVURVJTIiwidmFsaWRhdGUiLChmdW5jdGlvbihlKXtpZihlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQscj1lLnNlcnZpY2UuY29uZmlnLnBhcmFtVmFsaWRhdGlvbjtuZXcgbi5QYXJhbVZhbGlkYXRvcihyKS52YWxpZGF0ZSh0LGUucGFyYW1zKX19KSksZSgiQ09NUFVURV9DSEVDS1NVTSIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXtpZihlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07aWYodCl7dmFyIHI9ZS5odHRwUmVxdWVzdC5ib2R5LG89ciYmKG4udXRpbC5CdWZmZXIuaXNCdWZmZXIocil8fCJzdHJpbmciPT10eXBlb2YgciksaT1lLmh0dHBSZXF1ZXN0LmhlYWRlcnM7aWYodC5odHRwQ2hlY2tzdW1SZXF1aXJlZCYmZS5zZXJ2aWNlLmNvbmZpZy5jb21wdXRlQ2hlY2tzdW1zJiZvJiYhaVsiQ29udGVudC1NRDUiXSl7dmFyIHM9bi51dGlsLmNyeXB0by5tZDUociwiYmFzZTY0Iik7aVsiQ29udGVudC1NRDUiXT1zfX19fSkpLHIoIkNPTVBVVEVfU0hBMjU2IiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUsdCl7aWYoZS5oYWx0SGFuZGxlcnNPbkVycm9yKCksZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXt2YXIgcj1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG89cj9yLmF1dGh0eXBlOiIiO2lmKCFlLnNlcnZpY2UuYXBpLnNpZ25hdHVyZVZlcnNpb24mJiFvJiYhZS5zZXJ2aWNlLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uKXJldHVybiB0KCk7aWYoZS5zZXJ2aWNlLmdldFNpZ25lckNsYXNzKGUpPT09bi5TaWduZXJzLlY0KXt2YXIgaT1lLmh0dHBSZXF1ZXN0LmJvZHl8fCIiO2lmKG8uaW5kZXhPZigidW5zaWduZWQtYm9keSIpPj0wKXJldHVybiBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il09IlVOU0lHTkVELVBBWUxPQUQiLHQoKTtuLnV0aWwuY29tcHV0ZVNoYTI1NihpLChmdW5jdGlvbihuLHIpe24/dChuKTooZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdPXIsdCgpKX0pKX1lbHNlIHQoKX19KSksZSgiU0VUX0NPTlRFTlRfTEVOR1RIIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe3ZhciB0PWkoZSkscj1uLnV0aWwuZ2V0UmVxdWVzdFBheWxvYWRTaGFwZShlKTtpZih2b2lkIDA9PT1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pdHJ5e3ZhciBvPW4udXRpbC5zdHJpbmcuYnl0ZUxlbmd0aChlLmh0dHBSZXF1ZXN0LmJvZHkpO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXT1vfWNhdGNoKG4pe2lmKHImJnIuaXNTdHJlYW1pbmcpe2lmKHIucmVxdWlyZXNMZW5ndGgpdGhyb3cgbjtpZih0LmluZGV4T2YoInVuc2lnbmVkLWJvZHkiKT49MClyZXR1cm4gdm9pZChlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlRyYW5zZmVyLUVuY29kaW5nIl09ImNodW5rZWQiKTt0aHJvdyBufXRocm93IG59fSkpLGUoIlNFVF9IVFRQX0hPU1QiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5oZWFkZXJzLkhvc3Q9ZS5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0fSkpLGUoIlNFVF9UUkFDRV9JRCIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXt2YXIgcj0iWC1BbXpuLVRyYWNlLUlkIjtpZihuLnV0aWwuaXNOb2RlKCkmJiFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLmh0dHBSZXF1ZXN0LmhlYWRlcnMscikpe3ZhciBvPXQuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRSxpPXQuZW52Ll9YX0FNWk5fVFJBQ0VfSUQ7InN0cmluZyI9PXR5cGVvZiBvJiZvLmxlbmd0aD4wJiYic3RyaW5nIj09dHlwZW9mIGkmJmkubGVuZ3RoPjAmJihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbcl09aSl9fSkpLGUoIlJFU1RBUlQiLCJyZXN0YXJ0IiwoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlc3BvbnNlLmVycm9yO2UmJmUucmV0cnlhYmxlJiYodGhpcy5odHRwUmVxdWVzdD1uZXcgbi5IdHRwUmVxdWVzdCh0aGlzLnNlcnZpY2UuZW5kcG9pbnQsdGhpcy5zZXJ2aWNlLnJlZ2lvbiksdGhpcy5yZXNwb25zZS5yZXRyeUNvdW50PHRoaXMuc2VydmljZS5jb25maWcubWF4UmV0cmllcz90aGlzLnJlc3BvbnNlLnJldHJ5Q291bnQrKzp0aGlzLnJlc3BvbnNlLmVycm9yPW51bGwpfSkpLHIoIkRJU0NPVkVSX0VORFBPSU5UIiwic2lnbiIsbywhMCkscigiU0lHTiIsInNpZ24iLChmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2VydmljZSxyPXMoZSk7aWYoIXJ8fDA9PT1yLmxlbmd0aClyZXR1cm4gdCgpOyJiZWFyZXIiPT09cj9uLmNvbmZpZy5nZXRUb2tlbigoZnVuY3Rpb24ocixvKXtpZihyKXJldHVybiBlLnJlc3BvbnNlLmVycm9yPXIsdCgpO3RyeXtuZXcobi5nZXRTaWduZXJDbGFzcyhlKSkoZS5odHRwUmVxdWVzdCkuYWRkQXV0aG9yaXphdGlvbihvKX1jYXRjaCh0KXtlLnJlc3BvbnNlLmVycm9yPXR9dCgpfSkpOm4uY29uZmlnLmdldENyZWRlbnRpYWxzKChmdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUucmVzcG9uc2UuZXJyb3I9cix0KCk7dHJ5e3ZhciBpPW4uZ2V0U2tld0NvcnJlY3RlZERhdGUoKSxzPW4uZ2V0U2lnbmVyQ2xhc3MoZSksYT0oZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dLGM9bmV3IHMoZS5odHRwUmVxdWVzdCxuLmdldFNpZ25pbmdOYW1lKGUpLHtzaWduYXR1cmVDYWNoZTpuLmNvbmZpZy5zaWduYXR1cmVDYWNoZSxvcGVyYXRpb246YSxzaWduYXR1cmVWZXJzaW9uOm4uYXBpLnNpZ25hdHVyZVZlcnNpb259KTtjLnNldFNlcnZpY2VDbGllbnRJZChuLl9jbGllbnRJZCksZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnMuRGF0ZSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl0sYy5hZGRBdXRob3JpemF0aW9uKG8saSksZS5zaWduZWRBdD1pfWNhdGNoKHQpe2UucmVzcG9uc2UuZXJyb3I9dH10KCl9KSl9KSksZSgiVkFMSURBVEVfUkVTUE9OU0UiLCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oZSl7dGhpcy5zZXJ2aWNlLnN1Y2Nlc3NmdWxSZXNwb25zZShlLHRoaXMpPyhlLmRhdGE9e30sZS5lcnJvcj1udWxsKTooZS5kYXRhPW51bGwsZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJVbmtub3duRXJyb3IiLG1lc3NhZ2U6IkFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuIn0pKX0pKSxlKCJFUlJPUiIsImVycm9yIiwoZnVuY3Rpb24oZSx0KXtpZih0LnJlcXVlc3Quc2VydmljZS5hcGkuYXdzUXVlcnlDb21wYXRpYmxlKXt2YXIgbj10Lmh0dHBSZXNwb25zZS5oZWFkZXJzLHI9bj9uWyJ4LWFtem4tcXVlcnktZXJyb3IiXTp2b2lkIDA7ciYmci5pbmNsdWRlcygiOyIpJiYodC5lcnJvci5jb2RlPXIuc3BsaXQoIjsiKVswXSl9fSksITApLHIoIlNFTkQiLCJzZW5kIiwoZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKHIpe2UuaHR0cFJlc3BvbnNlLnN0cmVhbT1yO3ZhciBvPWUucmVxdWVzdC5odHRwUmVxdWVzdC5zdHJlYW0saT1lLnJlcXVlc3Quc2VydmljZSxzPWkuYXBpLGE9ZS5yZXF1ZXN0Lm9wZXJhdGlvbixjPXMub3BlcmF0aW9uc1thXXx8e307ci5vbigiaGVhZGVycyIsKGZ1bmN0aW9uKG8scyxhKXtpZihlLnJlcXVlc3QuZW1pdCgiaHR0cEhlYWRlcnMiLFtvLHMsZSxhXSksIWUuaHR0cFJlc3BvbnNlLnN0cmVhbWluZylpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uKXtpZihjLmhhc0V2ZW50T3V0cHV0JiZpLnN1Y2Nlc3NmdWxSZXNwb25zZShlKSlyZXR1cm4gZS5yZXF1ZXN0LmVtaXQoImh0dHBEb25lIiksdm9pZCB0KCk7ci5vbigicmVhZGFibGUiLChmdW5jdGlvbigpe3ZhciB0PXIucmVhZCgpO251bGwhPT10JiZlLnJlcXVlc3QuZW1pdCgiaHR0cERhdGEiLFt0LGVdKX0pKX1lbHNlIHIub24oImRhdGEiLChmdW5jdGlvbih0KXtlLnJlcXVlc3QuZW1pdCgiaHR0cERhdGEiLFt0LGVdKX0pKX0pKSxyLm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKCFvfHwhby5kaWRDYWxsYmFjayl7aWYoMj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbiYmYy5oYXNFdmVudE91dHB1dCYmaS5zdWNjZXNzZnVsUmVzcG9uc2UoZSkpcmV0dXJuO2UucmVxdWVzdC5lbWl0KCJodHRwRG9uZSIpLHQoKX19KSl9ZnVuY3Rpb24gbyhyKXtpZigiUmVxdWVzdEFib3J0ZWRFcnJvciIhPT1yLmNvZGUpe3ZhciBvPSJUaW1lb3V0RXJyb3IiPT09ci5jb2RlP3IuY29kZToiTmV0d29ya2luZ0Vycm9yIjtyPW4udXRpbC5lcnJvcihyLHtjb2RlOm8scmVnaW9uOmUucmVxdWVzdC5odHRwUmVxdWVzdC5yZWdpb24saG9zdG5hbWU6ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLHJldHJ5YWJsZTohMH0pfWUuZXJyb3I9cixlLnJlcXVlc3QuZW1pdCgiaHR0cEVycm9yIixbZS5lcnJvcixlXSwoZnVuY3Rpb24oKXt0KCl9KSl9ZnVuY3Rpb24gaSgpe3ZhciB0LGk9bi5IdHRwQ2xpZW50LmdldEluc3RhbmNlKCkscz1lLnJlcXVlc3Quc2VydmljZS5jb25maWcuaHR0cE9wdGlvbnN8fHt9O3RyeXt2YXIgYT1pLmhhbmRsZVJlcXVlc3QoZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LHMscixvKTsodD1hKS5vbigic2VuZFByb2dyZXNzIiwoZnVuY3Rpb24odCl7ZS5yZXF1ZXN0LmVtaXQoImh0dHBVcGxvYWRQcm9ncmVzcyIsW3QsZV0pfSkpLHQub24oInJlY2VpdmVQcm9ncmVzcyIsKGZ1bmN0aW9uKHQpe2UucmVxdWVzdC5lbWl0KCJodHRwRG93bmxvYWRQcm9ncmVzcyIsW3QsZV0pfSkpfWNhdGNoKGUpe28oZSl9fWUuaHR0cFJlc3BvbnNlLl9hYm9ydENhbGxiYWNrPXQsZS5lcnJvcj1udWxsLGUuZGF0YT1udWxsLChlLnJlcXVlc3Quc2VydmljZS5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLXRoaXMuc2lnbmVkQXQpLzFlMz49NjAwP3RoaXMuZW1pdCgic2lnbiIsW3RoaXNdLChmdW5jdGlvbihlKXtlP3QoZSk6aSgpfSkpOmkoKX0pKSxlKCJIVFRQX0hFQURFUlMiLCJodHRwSGVhZGVycyIsKGZ1bmN0aW9uKGUsdCxyLG8pe3IuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU9ZSxyLmh0dHBSZXNwb25zZS5zdGF0dXNNZXNzYWdlPW8sci5odHRwUmVzcG9uc2UuaGVhZGVycz10LHIuaHR0cFJlc3BvbnNlLmJvZHk9bi51dGlsLmJ1ZmZlci50b0J1ZmZlcigiIiksci5odHRwUmVzcG9uc2UuYnVmZmVycz1bXSxyLmh0dHBSZXNwb25zZS5udW1CeXRlcz0wO3ZhciBpPXQuZGF0ZXx8dC5EYXRlLHM9ci5yZXF1ZXN0LnNlcnZpY2U7aWYoaSl7dmFyIGE9RGF0ZS5wYXJzZShpKTtzLmNvbmZpZy5jb3JyZWN0Q2xvY2tTa2V3JiZzLmlzQ2xvY2tTa2V3ZWQoYSkmJnMuYXBwbHlDbG9ja09mZnNldChhKX19KSksZSgiSFRUUF9EQVRBIiwiaHR0cERhdGEiLChmdW5jdGlvbihlLHQpe2lmKGUpe2lmKG4udXRpbC5pc05vZGUoKSl7dC5odHRwUmVzcG9uc2UubnVtQnl0ZXMrPWUubGVuZ3RoO3ZhciByPXQuaHR0cFJlc3BvbnNlLmhlYWRlcnNbImNvbnRlbnQtbGVuZ3RoIl0sbz17bG9hZGVkOnQuaHR0cFJlc3BvbnNlLm51bUJ5dGVzLHRvdGFsOnJ9O3QucmVxdWVzdC5lbWl0KCJodHRwRG93bmxvYWRQcm9ncmVzcyIsW28sdF0pfXQuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMucHVzaChuLnV0aWwuYnVmZmVyLnRvQnVmZmVyKGUpKX19KSksZSgiSFRUUF9ET05FIiwiaHR0cERvbmUiLChmdW5jdGlvbihlKXtpZihlLmh0dHBSZXNwb25zZS5idWZmZXJzJiZlLmh0dHBSZXNwb25zZS5idWZmZXJzLmxlbmd0aD4wKXt2YXIgdD1uLnV0aWwuYnVmZmVyLmNvbmNhdChlLmh0dHBSZXNwb25zZS5idWZmZXJzKTtlLmh0dHBSZXNwb25zZS5ib2R5PXR9ZGVsZXRlIGUuaHR0cFJlc3BvbnNlLm51bUJ5dGVzLGRlbGV0ZSBlLmh0dHBSZXNwb25zZS5idWZmZXJzfSkpLGUoIkZJTkFMSVpFX0VSUk9SIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlJiYoZS5lcnJvci5zdGF0dXNDb2RlPWUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsdm9pZCAwPT09ZS5lcnJvci5yZXRyeWFibGUmJihlLmVycm9yLnJldHJ5YWJsZT10aGlzLnNlcnZpY2UucmV0cnlhYmxlRXJyb3IoZS5lcnJvcix0aGlzKSkpfSkpLGUoIklOVkFMSURBVEVfQ1JFREVOVElBTFMiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2lmKGUuZXJyb3Ipc3dpdGNoKGUuZXJyb3IuY29kZSl7Y2FzZSJSZXF1ZXN0RXhwaXJlZCI6Y2FzZSJFeHBpcmVkVG9rZW5FeGNlcHRpb24iOmNhc2UiRXhwaXJlZFRva2VuIjplLmVycm9yLnJldHJ5YWJsZT0hMCxlLnJlcXVlc3Quc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuZXhwaXJlZD0hMH19KSksZSgiRVhQSVJFRF9TSUdOQVRVUkUiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZXJyb3I7dCYmInN0cmluZyI9PXR5cGVvZiB0LmNvZGUmJiJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiZ0LmNvZGUubWF0Y2goL1NpZ25hdHVyZS8pJiZ0Lm1lc3NhZ2UubWF0Y2goL2V4cGlyZWQvKSYmKGUuZXJyb3IucmV0cnlhYmxlPSEwKX0pKSxlKCJDTE9DS19TS0VXRUQiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJnRoaXMuc2VydmljZS5jbG9ja1NrZXdFcnJvcihlLmVycm9yKSYmdGhpcy5zZXJ2aWNlLmNvbmZpZy5jb3JyZWN0Q2xvY2tTa2V3JiYoZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIlJFRElSRUNUIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmVycm9yJiZlLmVycm9yLnN0YXR1c0NvZGU+PTMwMCYmZS5lcnJvci5zdGF0dXNDb2RlPDQwMCYmZS5odHRwUmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbiYmKHRoaXMuaHR0cFJlcXVlc3QuZW5kcG9pbnQ9bmV3IG4uRW5kcG9pbnQoZS5odHRwUmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbiksdGhpcy5odHRwUmVxdWVzdC5oZWFkZXJzLkhvc3Q9dGhpcy5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0LGUuZXJyb3IucmVkaXJlY3Q9ITAsZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIlJFVFJZX0NIRUNLIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmVycm9yJiYoZS5lcnJvci5yZWRpcmVjdCYmZS5yZWRpcmVjdENvdW50PGUubWF4UmVkaXJlY3RzP2UuZXJyb3IucmV0cnlEZWxheT0wOmUucmV0cnlDb3VudDxlLm1heFJldHJpZXMmJihlLmVycm9yLnJldHJ5RGVsYXk9dGhpcy5zZXJ2aWNlLnJldHJ5RGVsYXlzKGUucmV0cnlDb3VudCxlLmVycm9yKXx8MCkpfSkpLHIoIlJFU0VUX1JFVFJZX1NUQVRFIiwiYWZ0ZXJSZXRyeSIsKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj0hMTtlLmVycm9yJiYobj1lLmVycm9yLnJldHJ5RGVsYXl8fDAsZS5lcnJvci5yZXRyeWFibGUmJmUucmV0cnlDb3VudDxlLm1heFJldHJpZXM/KGUucmV0cnlDb3VudCsrLHI9ITApOmUuZXJyb3IucmVkaXJlY3QmJmUucmVkaXJlY3RDb3VudDxlLm1heFJlZGlyZWN0cyYmKGUucmVkaXJlY3RDb3VudCsrLHI9ITApKSxyJiZuPj0wPyhlLmVycm9yPW51bGwsc2V0VGltZW91dCh0LG4pKTp0KCl9KSl9KSksQ29yZVBvc3Q6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSl7ZSgiRVhUUkFDVF9SRVFVRVNUX0lEIiwiZXh0cmFjdERhdGEiLG4udXRpbC5leHRyYWN0UmVxdWVzdElkKSxlKCJFWFRSQUNUX1JFUVVFU1RfSUQiLCJleHRyYWN0RXJyb3IiLG4udXRpbC5leHRyYWN0UmVxdWVzdElkKSxlKCJFTk9URk9VTkRfRVJST1IiLCJodHRwRXJyb3IiLChmdW5jdGlvbihlKXtpZigiTmV0d29ya2luZ0Vycm9yIj09PWUuY29kZSYmZnVuY3Rpb24oZSl7cmV0dXJuIkVOT1RGT1VORCI9PT1lLmVycm5vfHwibnVtYmVyIj09dHlwZW9mIGUuZXJybm8mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLnV0aWwuZ2V0U3lzdGVtRXJyb3JOYW1lJiZbIkVBSV9OT05BTUUiLCJFQUlfTk9EQVRBIl0uaW5kZXhPZihuLnV0aWwuZ2V0U3lzdGVtRXJyb3JOYW1lKGUuZXJybm8pPj0wKX0oZSkpe3ZhciB0PSJJbmFjY2Vzc2libGUgaG9zdDogYCIrZS5ob3N0bmFtZSsiJyBhdCBwb3J0IGAiK2UucG9ydCsiJy4gVGhpcyBzZXJ2aWNlIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBgIitlLnJlZ2lvbisiJyByZWdpb24uIjt0aGlzLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3IodCkse2NvZGU6IlVua25vd25FbmRwb2ludCIscmVnaW9uOmUucmVnaW9uLGhvc3RuYW1lOmUuaG9zdG5hbWUscmV0cnlhYmxlOiEwLG9yaWdpbmFsRXJyb3I6ZX0pfX0pKX0pKSxMb2dnZXI6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dCgiTE9HX1JFUVVFU1QiLCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe3ZhciByPXQucmVxdWVzdCxvPXIuc2VydmljZS5jb25maWcubG9nZ2VyO2lmKG8pe3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGk9KHQucmVxdWVzdC5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCkuZ2V0VGltZSgpLXIuc3RhcnRUaW1lLmdldFRpbWUoKSkvMWUzLGE9ISFvLmlzVFRZLGM9dC5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSx1PXIucGFyYW1zO3Iuc2VydmljZS5hcGkub3BlcmF0aW9ucyYmci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Iub3BlcmF0aW9uXSYmci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Iub3BlcmF0aW9uXS5pbnB1dCYmKHU9cyhyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dLmlucHV0LHIucGFyYW1zKSk7dmFyIGw9ZSgidXRpbCIpLmluc3BlY3QodSwhMCxudWxsKSxwPSIiO3JldHVybiBhJiYocCs9IhtbMzNtIikscCs9IltBV1MgIityLnNlcnZpY2Uuc2VydmljZUlkZW50aWZpZXIrIiAiK2MscCs9IiAiK2kudG9TdHJpbmcoKSsicyAiK3QucmV0cnlDb3VudCsiIHJldHJpZXNdIixhJiYocCs9IhtbMDsxbSIpLHArPSIgIituLnV0aWwuc3RyaW5nLmxvd2VyRmlyc3Qoci5vcGVyYXRpb24pLHArPSIoIitsKyIpIixhJiYocCs9IhtbMG0iKSxwfSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBvLmxvZz9vLmxvZyhpKToiZnVuY3Rpb24iPT10eXBlb2Ygby53cml0ZSYmby53cml0ZShpKyJcbiIpfWZ1bmN0aW9uIHMoZSx0KXtpZighdClyZXR1cm4gdDtpZihlLmlzU2Vuc2l0aXZlKXJldHVybiIqKipTZW5zaXRpdmVJbmZvcm1hdGlvbioqKiI7c3dpdGNoKGUudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnZhciByPXt9O3JldHVybiBuLnV0aWwuZWFjaCh0LChmdW5jdGlvbih0LG4pe09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLm1lbWJlcnMsdCk/clt0XT1zKGUubWVtYmVyc1t0XSxuKTpyW3RdPW59KSkscjtjYXNlImxpc3QiOnZhciBvPVtdO3JldHVybiBuLnV0aWwuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQsbil7by5wdXNoKHMoZS5tZW1iZXIsdCkpfSkpLG87Y2FzZSJtYXAiOnZhciBpPXt9O3JldHVybiBuLnV0aWwuZWFjaCh0LChmdW5jdGlvbih0LG4pe2lbdF09cyhlLnZhbHVlLG4pfSkpLGk7ZGVmYXVsdDpyZXR1cm4gdH19fSkpfSkpLEpzb246KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9qc29uIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvcil9KSksUmVzdDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3QiKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKSxSZXN0SnNvbjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3RfanNvbiIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpLHQoIlVOU0VUX0NPTlRFTlRfTEVOR1RIIiwiYWZ0ZXJCdWlsZCIsbi51bnNldENvbnRlbnRMZW5ndGgpfSkpLFJlc3RYbWw6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9yZXN0X3htbCIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpLFF1ZXJ5OihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcXVlcnkiKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksIi4vZGlzY292ZXJfZW5kcG9pbnQiOjI3LCIuL3Byb3RvY29sL2pzb24iOjQ4LCIuL3Byb3RvY29sL3F1ZXJ5Ijo0OSwiLi9wcm90b2NvbC9yZXN0Ijo1MCwiLi9wcm90b2NvbC9yZXN0X2pzb24iOjUxLCIuL3Byb3RvY29sL3Jlc3RfeG1sIjo1MiwiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIjo2MSxfcHJvY2Vzczo5MSx1dGlsOjg1fV0sMzU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuRW5kcG9pbnQ9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtpZihyLnV0aWwuaGlkZVByb3BlcnRpZXModGhpcyxbInNsYXNoZXMiLCJhdXRoIiwiaGFzaCIsInNlYXJjaCIsInF1ZXJ5Il0pLG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGVuZHBvaW50OiAiK2UpO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gci51dGlsLmNvcHkoZSk7ZS5tYXRjaCgvXmh0dHAvKXx8KGU9KCh0JiZ2b2lkIDAhPT10LnNzbEVuYWJsZWQ/dC5zc2xFbmFibGVkOnIuY29uZmlnLnNzbEVuYWJsZWQpPyJodHRwcyI6Imh0dHAiKSsiOi8vIitlKSxyLnV0aWwudXBkYXRlKHRoaXMsci51dGlsLnVybFBhcnNlKGUpKSx0aGlzLnBvcnQ/dGhpcy5wb3J0PXBhcnNlSW50KHRoaXMucG9ydCwxMCk6dGhpcy5wb3J0PSJodHRwczoiPT09dGhpcy5wcm90b2NvbD80NDM6ODB9fSksci5IdHRwUmVxdWVzdD1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe2U9bmV3IHIuRW5kcG9pbnQoZSksdGhpcy5tZXRob2Q9IlBPU1QiLHRoaXMucGF0aD1lLnBhdGh8fCIvIix0aGlzLmhlYWRlcnM9e30sdGhpcy5ib2R5PSIiLHRoaXMuZW5kcG9pbnQ9ZSx0aGlzLnJlZ2lvbj10LHRoaXMuX3VzZXJBZ2VudD0iIix0aGlzLnNldFVzZXJBZ2VudCgpfSxzZXRVc2VyQWdlbnQ6ZnVuY3Rpb24oKXt0aGlzLl91c2VyQWdlbnQ9dGhpcy5oZWFkZXJzW3RoaXMuZ2V0VXNlckFnZW50SGVhZGVyTmFtZSgpXT1yLnV0aWwudXNlckFnZW50KCl9LGdldFVzZXJBZ2VudEhlYWRlck5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4oci51dGlsLmlzQnJvd3NlcigpPyJYLUFtei0iOiIiKSsiVXNlci1BZ2VudCJ9LGFwcGVuZFRvVXNlckFnZW50OmZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZSYmZSYmKHRoaXMuX3VzZXJBZ2VudCs9IiAiK2UpLHRoaXMuaGVhZGVyc1t0aGlzLmdldFVzZXJBZ2VudEhlYWRlck5hbWUoKV09dGhpcy5fdXNlckFnZW50fSxnZXRVc2VyQWdlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXNlckFnZW50fSxwYXRobmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhdGguc3BsaXQoIj8iLDEpWzBdfSxzZWFyY2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhdGguc3BsaXQoIj8iLDIpWzFdO3JldHVybiBlPyhlPXIudXRpbC5xdWVyeVN0cmluZ1BhcnNlKGUpLHIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKGUpKToiIn0sdXBkYXRlRW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHIuRW5kcG9pbnQoZSk7dGhpcy5lbmRwb2ludD10LHRoaXMucGF0aD10LnBhdGh8fCIvIix0aGlzLmhlYWRlcnMuSG9zdCYmKHRoaXMuaGVhZGVycy5Ib3N0PXQuaG9zdCl9fSksci5IdHRwUmVzcG9uc2U9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1c0NvZGU9dm9pZCAwLHRoaXMuaGVhZGVycz17fSx0aGlzLmJvZHk9dm9pZCAwLHRoaXMuc3RyZWFtaW5nPSExLHRoaXMuc3RyZWFtPW51bGx9LGNyZWF0ZVVuYnVmZmVyZWRTdHJlYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJlYW1pbmc9ITAsdGhpcy5zdHJlYW19fSksci5IdHRwQ2xpZW50PW8oe30pLHIuSHR0cENsaWVudC5nZXRJbnN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLnNpbmdsZXRvbiYmKHRoaXMuc2luZ2xldG9uPW5ldyB0aGlzKSx0aGlzLnNpbmdsZXRvbn19LHsiLi9jb3JlIjoxOX1dLDM2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiZXZlbnRzIikuRXZlbnRFbWl0dGVyO2UoIi4uL2h0dHAiKSxyLlhIUkNsaWVudD1yLnV0aWwuaW5oZXJpdCh7aGFuZGxlUmVxdWVzdDpmdW5jdGlvbihlLHQsbixpKXt2YXIgcz10aGlzLGE9ZS5lbmRwb2ludCxjPW5ldyBvLHU9YS5wcm90b2NvbCsiLy8iK2EuaG9zdG5hbWU7ODAhPT1hLnBvcnQmJjQ0MyE9PWEucG9ydCYmKHUrPSI6IithLnBvcnQpLHUrPWUucGF0aDt2YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3QscD0hMTtlLnN0cmVhbT1sLGwuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsKGZ1bmN0aW9uKCl7dHJ5e2lmKDA9PT1sLnN0YXR1cylyZXR1cm59Y2F0Y2goZSl7cmV0dXJufXRoaXMucmVhZHlTdGF0ZT49dGhpcy5IRUFERVJTX1JFQ0VJVkVEJiYhcCYmKGMuc3RhdHVzQ29kZT1sLnN0YXR1cyxjLmhlYWRlcnM9cy5wYXJzZUhlYWRlcnMobC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksYy5lbWl0KCJoZWFkZXJzIixjLnN0YXR1c0NvZGUsYy5oZWFkZXJzLGwuc3RhdHVzVGV4dCkscD0hMCksdGhpcy5yZWFkeVN0YXRlPT09dGhpcy5ET05FJiZzLmZpbmlzaFJlcXVlc3QobCxjKX0pLCExKSxsLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsKGZ1bmN0aW9uKGUpe2MuZW1pdCgic2VuZFByb2dyZXNzIixlKX0pKSxsLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwoZnVuY3Rpb24oZSl7Yy5lbWl0KCJyZWNlaXZlUHJvZ3Jlc3MiLGUpfSksITEpLGwuYWRkRXZlbnRMaXN0ZW5lcigidGltZW91dCIsKGZ1bmN0aW9uKCl7aShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJUaW1lb3V0Iikse2NvZGU6IlRpbWVvdXRFcnJvciJ9KSl9KSwhMSksbC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKCl7aShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJOZXR3b3JrIEZhaWx1cmUiKSx7Y29kZToiTmV0d29ya2luZ0Vycm9yIn0pKX0pLCExKSxsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwoZnVuY3Rpb24oKXtpKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIlJlcXVlc3QgYWJvcnRlZCIpLHtjb2RlOiJSZXF1ZXN0QWJvcnRlZEVycm9yIn0pKX0pLCExKSxuKGMpLGwub3BlbihlLm1ldGhvZCx1LCExIT09dC54aHJBc3luYyksci51dGlsLmVhY2goZS5oZWFkZXJzLChmdW5jdGlvbihlLHQpeyJDb250ZW50LUxlbmd0aCIhPT1lJiYiVXNlci1BZ2VudCIhPT1lJiYiSG9zdCIhPT1lJiZsLnNldFJlcXVlc3RIZWFkZXIoZSx0KX0pKSx0LnRpbWVvdXQmJiExIT09dC54aHJBc3luYyYmKGwudGltZW91dD10LnRpbWVvdXQpLHQueGhyV2l0aENyZWRlbnRpYWxzJiYobC53aXRoQ3JlZGVudGlhbHM9ITApO3RyeXtsLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIifWNhdGNoKGUpe310cnl7ZS5ib2R5P2wuc2VuZChlLmJvZHkpOmwuc2VuZCgpfWNhdGNoKHQpe2lmKCFlLmJvZHl8fCJvYmplY3QiIT10eXBlb2YgZS5ib2R5LmJ1ZmZlcil0aHJvdyB0O2wuc2VuZChlLmJvZHkuYnVmZmVyKX1yZXR1cm4gY30scGFyc2VIZWFkZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiByLnV0aWwuYXJyYXlFYWNoKGUuc3BsaXQoL1xyP1xuLyksKGZ1bmN0aW9uKGUpe3ZhciBuPWUuc3BsaXQoIjoiLDEpWzBdLHI9ZS5zdWJzdHJpbmcobi5sZW5ndGgrMik7bi5sZW5ndGg+MCYmKHRbbi50b0xvd2VyQ2FzZSgpXT1yKX0pKSx0fSxmaW5pc2hSZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoImFycmF5YnVmZmVyIj09PWUucmVzcG9uc2VUeXBlJiZlLnJlc3BvbnNlKXt2YXIgbz1lLnJlc3BvbnNlO249bmV3IHIudXRpbC5CdWZmZXIoby5ieXRlTGVuZ3RoKTtmb3IodmFyIGk9bmV3IFVpbnQ4QXJyYXkobykscz0wO3M8bi5sZW5ndGg7KytzKW5bc109aVtzXX10cnl7bnx8InN0cmluZyIhPXR5cGVvZiBlLnJlc3BvbnNlVGV4dHx8KG49bmV3IHIudXRpbC5CdWZmZXIoZS5yZXNwb25zZVRleHQpKX1jYXRjaChlKXt9biYmdC5lbWl0KCJkYXRhIixuKSx0LmVtaXQoImVuZCIpfX0pLHIuSHR0cENsaWVudC5wcm90b3R5cGU9ci5YSFJDbGllbnQucHJvdG90eXBlLHIuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj0xfSx7Ii4uL2NvcmUiOjE5LCIuLi9odHRwIjozNSxldmVudHM6ODd9XSwzNzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSx0KXtpZih0JiZudWxsIT1lKXN3aXRjaCh0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZih0LmlzRG9jdW1lbnQpcmV0dXJuIGU7dmFyIG49e307cmV0dXJuIHIuZWFjaChlLChmdW5jdGlvbihlLHIpe3ZhciBvPXQubWVtYmVyc1tlXTtpZihvKXtpZigiYm9keSIhPT1vLmxvY2F0aW9uKXJldHVybjt2YXIgcz1vLmlzTG9jYXRpb25OYW1lP28ubmFtZTplLGE9aShyLG8pO3ZvaWQgMCE9PWEmJihuW3NdPWEpfX0pKSxufShlLHQpO2Nhc2UibWFwIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gci5lYWNoKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89aShyLHQudmFsdWUpO3ZvaWQgMCE9PW8mJihuW2VdPW8pfSkpLG59KGUsdCk7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtyZXR1cm4gci5hcnJheUVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIHI9aShlLHQubWVtYmVyKTt2b2lkIDAhPT1yJiZuLnB1c2gocil9KSksbn0oZSx0KTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvV2lyZUZvcm1hdChlKX0oZSx0KX19by5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaShlLHQpKX0sdC5leHBvcnRzPW99LHsiLi4vdXRpbCI6NzR9XSwzODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSx0KXtpZih0JiZ2b2lkIDAhPT1lKXN3aXRjaCh0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihudWxsIT1lKXtpZih0LmlzRG9jdW1lbnQpcmV0dXJuIGU7dmFyIG49e30sbz10Lm1lbWJlcnM7cmV0dXJuIHIuZWFjaChvLChmdW5jdGlvbih0LHIpe3ZhciBvPXIuaXNMb2NhdGlvbk5hbWU/ci5uYW1lOnQ7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykpe3ZhciBzPWkoZVtvXSxyKTt2b2lkIDAhPT1zJiYoblt0XT1zKX19KSksbn19KGUsdCk7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe3ZhciBuPXt9O3JldHVybiByLmVhY2goZSwoZnVuY3Rpb24oZSxyKXt2YXIgbz1pKHIsdC52YWx1ZSk7bltlXT12b2lkIDA9PT1vP251bGw6b30pKSxufX0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe3ZhciBuPVtdO3JldHVybiByLmFycmF5RWFjaChlLChmdW5jdGlvbihlKXt2YXIgcj1pKGUsdC5tZW1iZXIpO3ZvaWQgMD09PXI/bi5wdXNoKG51bGwpOm4ucHVzaChyKX0pKSxufX0oZSx0KTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVHlwZShlKX0oZSx0KX19by5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShKU09OLnBhcnNlKGUpLHQpfSx0LmV4cG9ydHM9b30seyIuLi91dGlsIjo3NH1dLDM5OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciBuPVsiV2UgYXJlIGZvcm1hbGl6aW5nIG91ciBwbGFucyB0byBlbnRlciBBV1MgU0RLIGZvciBKYXZhU2NyaXB0ICh2MikgaW50byBtYWludGVuYW5jZSBtb2RlIGluIDIwMjMuXG4iLCJQbGVhc2UgbWlncmF0ZSB5b3VyIGNvZGUgdG8gdXNlIEFXUyBTREsgZm9yIEphdmFTY3JpcHQgKHYzKS4iLCJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sgdGhlIG1pZ3JhdGlvbiBndWlkZSBhdCBodHRwczovL2EuY28vN1B6TUNjeSJdLmpvaW4oIlxuIik7dC5leHBvcnRzPXtzdXBwcmVzczohMX0sc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmV4cG9ydHMuc3VwcHJlc3N8fHZvaWQgMCE9PWUmJigib2JqZWN0Ij09dHlwZW9mIGUuZW52JiZ2b2lkIDAhPT1lLmVudi5BV1NfRVhFQ1VUSU9OX0VOViYmMD09PWUuZW52LkFXU19FWEVDVVRJT05fRU5WLmluZGV4T2YoIkFXU19MYW1iZGFfIil8fCJvYmplY3QiPT10eXBlb2YgZS5lbnYmJnZvaWQgMCE9PWUuZW52LkFXU19TREtfSlNfU1VQUFJFU1NfTUFJTlRFTkFOQ0VfTU9ERV9NRVNTQUdFfHwiZnVuY3Rpb24iPT10eXBlb2YgZS5lbWl0V2FybmluZyYmZS5lbWl0V2FybmluZyhuLHt0eXBlOiJOT1RFIn0pKX0pLDApfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0se19wcm9jZXNzOjkxfV0sNDA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvbGxlY3Rpb24iKSxvPWUoIi4vb3BlcmF0aW9uIiksaT1lKCIuL3NoYXBlIikscz1lKCIuL3BhZ2luYXRvciIpLGE9ZSgiLi9yZXNvdXJjZV93YWl0ZXIiKSxjPWUoIi4uLy4uL2FwaXMvbWV0YWRhdGEuanNvbiIpLHU9ZSgiLi4vdXRpbCIpLGw9dS5wcm9wZXJ0eSxwPXUubWVtb2l6ZWRQcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2U9ZXx8e30sKHQ9dHx8e30pLmFwaT10aGlzLGUubWV0YWRhdGE9ZS5tZXRhZGF0YXx8e307dmFyIGQ9dC5zZXJ2aWNlSWRlbnRpZmllcjtkZWxldGUgdC5zZXJ2aWNlSWRlbnRpZmllcixsKHRoaXMsImlzQXBpIiwhMCwhMSksbCh0aGlzLCJhcGlWZXJzaW9uIixlLm1ldGFkYXRhLmFwaVZlcnNpb24pLGwodGhpcywiZW5kcG9pbnRQcmVmaXgiLGUubWV0YWRhdGEuZW5kcG9pbnRQcmVmaXgpLGwodGhpcywic2lnbmluZ05hbWUiLGUubWV0YWRhdGEuc2lnbmluZ05hbWUpLGwodGhpcywiZ2xvYmFsRW5kcG9pbnQiLGUubWV0YWRhdGEuZ2xvYmFsRW5kcG9pbnQpLGwodGhpcywic2lnbmF0dXJlVmVyc2lvbiIsZS5tZXRhZGF0YS5zaWduYXR1cmVWZXJzaW9uKSxsKHRoaXMsImpzb25WZXJzaW9uIixlLm1ldGFkYXRhLmpzb25WZXJzaW9uKSxsKHRoaXMsInRhcmdldFByZWZpeCIsZS5tZXRhZGF0YS50YXJnZXRQcmVmaXgpLGwodGhpcywicHJvdG9jb2wiLGUubWV0YWRhdGEucHJvdG9jb2wpLGwodGhpcywidGltZXN0YW1wRm9ybWF0IixlLm1ldGFkYXRhLnRpbWVzdGFtcEZvcm1hdCksbCh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUubWV0YWRhdGEueG1sTmFtZXNwYWNlKSxsKHRoaXMsImFiYnJldmlhdGlvbiIsZS5tZXRhZGF0YS5zZXJ2aWNlQWJicmV2aWF0aW9uKSxsKHRoaXMsImZ1bGxOYW1lIixlLm1ldGFkYXRhLnNlcnZpY2VGdWxsTmFtZSksbCh0aGlzLCJzZXJ2aWNlSWQiLGUubWV0YWRhdGEuc2VydmljZUlkKSxkJiZjW2RdJiZsKHRoaXMsInhtbE5vRGVmYXVsdExpc3RzIixjW2RdLnhtbE5vRGVmYXVsdExpc3RzLCExKSxwKHRoaXMsImNsYXNzTmFtZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5tZXRhZGF0YS5zZXJ2aWNlQWJicmV2aWF0aW9ufHxlLm1ldGFkYXRhLnNlcnZpY2VGdWxsTmFtZTtyZXR1cm4gdD8oIkVsYXN0aWNMb2FkQmFsYW5jaW5nIj09PSh0PXQucmVwbGFjZSgvXkFtYXpvbnxBV1Nccyp8XCguKnxccyt8XFcrL2csIiIpKSYmKHQ9IkVMQiIpLHQpOm51bGx9KSksbCh0aGlzLCJvcGVyYXRpb25zIixuZXcgcihlLm9wZXJhdGlvbnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IG8oZSxuLHQpfSksdS5zdHJpbmcubG93ZXJGaXJzdCwoZnVuY3Rpb24oZSx0KXshMD09PXQuZW5kcG9pbnRvcGVyYXRpb24mJmwobiwiZW5kcG9pbnRPcGVyYXRpb24iLHUuc3RyaW5nLmxvd2VyRmlyc3QoZSkpLHQuZW5kcG9pbnRkaXNjb3ZlcnkmJiFuLmhhc1JlcXVpcmVkRW5kcG9pbnREaXNjb3ZlcnkmJmwobiwiaGFzUmVxdWlyZWRFbmRwb2ludERpc2NvdmVyeSIsITA9PT10LmVuZHBvaW50ZGlzY292ZXJ5LnJlcXVpcmVkKX0pKSksbCh0aGlzLCJzaGFwZXMiLG5ldyByKGUuc2hhcGVzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGkuY3JlYXRlKG4sdCl9KSkpLGwodGhpcywicGFnaW5hdG9ycyIsbmV3IHIoZS5wYWdpbmF0b3JzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBzKGUsbix0KX0pKSksbCh0aGlzLCJ3YWl0ZXJzIixuZXcgcihlLndhaXRlcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IGEoZSxuLHQpfSksdS5zdHJpbmcubG93ZXJGaXJzdCkpLHQuZG9jdW1lbnRhdGlvbiYmKGwodGhpcywiZG9jdW1lbnRhdGlvbiIsZS5kb2N1bWVudGF0aW9uKSxsKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLGUuZG9jdW1lbnRhdGlvblVybCkpLGwodGhpcywiYXdzUXVlcnlDb21wYXRpYmxlIixlLm1ldGFkYXRhLmF3c1F1ZXJ5Q29tcGF0aWJsZSl9fSx7Ii4uLy4uL2FwaXMvbWV0YWRhdGEuanNvbiI6NCwiLi4vdXRpbCI6NzQsIi4vY29sbGVjdGlvbiI6NDEsIi4vb3BlcmF0aW9uIjo0MiwiLi9wYWdpbmF0b3IiOjQzLCIuL3Jlc291cmNlX3dhaXRlciI6NDQsIi4vc2hhcGUiOjQ1fV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIikubWVtb2l6ZWRQcm9wZXJ0eTtmdW5jdGlvbiBvKGUsdCxuLG8pe3IodGhpcyxvKGUpLChmdW5jdGlvbigpe3JldHVybiBuKGUsdCl9KSl9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm9yKHZhciBzIGluIHI9cnx8U3RyaW5nLGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscykmJihvLmNhbGwodGhpcyxzLGVbc10sbixyKSxpJiZpKHMsZVtzXSkpfX0seyIuLi91dGlsIjo3NH1dLDQyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9zaGFwZSIpLG89ZSgiLi4vdXRpbCIpLGk9by5wcm9wZXJ0eSxzPW8ubWVtb2l6ZWRQcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXRoaXM7bj1ufHx7fSxpKHRoaXMsIm5hbWUiLHQubmFtZXx8ZSksaSh0aGlzLCJhcGkiLG4uYXBpLCExKSx0Lmh0dHA9dC5odHRwfHx7fSxpKHRoaXMsImVuZHBvaW50Iix0LmVuZHBvaW50KSxpKHRoaXMsImh0dHBNZXRob2QiLHQuaHR0cC5tZXRob2R8fCJQT1NUIiksaSh0aGlzLCJodHRwUGF0aCIsdC5odHRwLnJlcXVlc3RVcml8fCIvIiksaSh0aGlzLCJhdXRodHlwZSIsdC5hdXRodHlwZXx8IiIpLGkodGhpcywiZW5kcG9pbnREaXNjb3ZlcnlSZXF1aXJlZCIsdC5lbmRwb2ludGRpc2NvdmVyeT90LmVuZHBvaW50ZGlzY292ZXJ5LnJlcXVpcmVkPyJSRVFVSVJFRCI6Ik9QVElPTkFMIjoiTlVMTCIpO3ZhciBhPXQuaHR0cENoZWNrc3VtUmVxdWlyZWR8fHQuaHR0cENoZWNrc3VtJiZ0Lmh0dHBDaGVja3N1bS5yZXF1ZXN0Q2hlY2tzdW1SZXF1aXJlZDtpKHRoaXMsImh0dHBDaGVja3N1bVJlcXVpcmVkIixhLCExKSxzKHRoaXMsImlucHV0IiwoZnVuY3Rpb24oKXtyZXR1cm4gdC5pbnB1dD9yLmNyZWF0ZSh0LmlucHV0LG4pOm5ldyByLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0sbil9KSkscyh0aGlzLCJvdXRwdXQiLChmdW5jdGlvbigpe3JldHVybiB0Lm91dHB1dD9yLmNyZWF0ZSh0Lm91dHB1dCxuKTpuZXcgci5jcmVhdGUoe3R5cGU6InN0cnVjdHVyZSJ9LG4pfSkpLHModGhpcywiZXJyb3JzIiwoZnVuY3Rpb24oKXt2YXIgZT1bXTtpZighdC5lcnJvcnMpcmV0dXJuIG51bGw7Zm9yKHZhciBvPTA7bzx0LmVycm9ycy5sZW5ndGg7bysrKWUucHVzaChyLmNyZWF0ZSh0LmVycm9yc1tvXSxuKSk7cmV0dXJuIGV9KSkscyh0aGlzLCJwYWdpbmF0b3IiLChmdW5jdGlvbigpe3JldHVybiBuLmFwaS5wYWdpbmF0b3JzW2VdfSkpLG4uZG9jdW1lbnRhdGlvbiYmKGkodGhpcywiZG9jdW1lbnRhdGlvbiIsdC5kb2N1bWVudGF0aW9uKSxpKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLHQuZG9jdW1lbnRhdGlvblVybCkpLHModGhpcywiaWRlbXBvdGVudE1lbWJlcnMiLChmdW5jdGlvbigpe3ZhciBlPVtdLHQ9by5pbnB1dCxuPXQubWVtYmVycztpZighdC5tZW1iZXJzKXJldHVybiBlO2Zvcih2YXIgciBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJiEwPT09bltyXS5pc0lkZW1wb3RlbnQmJmUucHVzaChyKTtyZXR1cm4gZX0pKSxzKHRoaXMsImhhc0V2ZW50T3V0cHV0IiwoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tZW1iZXJzLG49ZS5wYXlsb2FkO2lmKCFlLm1lbWJlcnMpcmV0dXJuITE7aWYobilyZXR1cm4gdFtuXS5pc0V2ZW50U3RyZWFtO2Zvcih2YXIgciBpbiB0KWlmKCF0Lmhhc093blByb3BlcnR5KHIpJiYhMD09PXRbcl0uaXNFdmVudFN0cmVhbSlyZXR1cm4hMDtyZXR1cm4hMX0oby5vdXRwdXQpfSkpfX0seyIuLi91dGlsIjo3NCwiLi9zaGFwZSI6NDV9XSw0MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKS5wcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyKHRoaXMsImlucHV0VG9rZW4iLHQuaW5wdXRfdG9rZW4pLHIodGhpcywibGltaXRLZXkiLHQubGltaXRfa2V5KSxyKHRoaXMsIm1vcmVSZXN1bHRzIix0Lm1vcmVfcmVzdWx0cykscih0aGlzLCJvdXRwdXRUb2tlbiIsdC5vdXRwdXRfdG9rZW4pLHIodGhpcywicmVzdWx0S2V5Iix0LnJlc3VsdF9rZXkpfX0seyIuLi91dGlsIjo3NH1dLDQ0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ci5wcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe249bnx8e30sbyh0aGlzLCJuYW1lIixlKSxvKHRoaXMsImFwaSIsbi5hcGksITEpLHQub3BlcmF0aW9uJiZvKHRoaXMsIm9wZXJhdGlvbiIsci5zdHJpbmcubG93ZXJGaXJzdCh0Lm9wZXJhdGlvbikpO3ZhciBpPXRoaXM7WyJ0eXBlIiwiZGVzY3JpcHRpb24iLCJkZWxheSIsIm1heEF0dGVtcHRzIiwiYWNjZXB0b3JzIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49dFtlXTtuJiZvKGksZSxuKX0pKX19LHsiLi4vdXRpbCI6NzR9XSw0NTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29sbGVjdGlvbiIpLG89ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIGkoZSx0LG4pe251bGwhPW4mJm8ucHJvcGVydHkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHMoZSx0KXtlLmNvbnN0cnVjdG9yLnByb3RvdHlwZVt0XXx8by5tZW1vaXplZFByb3BlcnR5LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBhKGUsdCxuKXt0PXR8fHt9LGkodGhpcywic2hhcGUiLGUuc2hhcGUpLGkodGhpcywiYXBpIix0LmFwaSwhMSksaSh0aGlzLCJ0eXBlIixlLnR5cGUpLGkodGhpcywiZW51bSIsZS5lbnVtKSxpKHRoaXMsIm1pbiIsZS5taW4pLGkodGhpcywibWF4IixlLm1heCksaSh0aGlzLCJwYXR0ZXJuIixlLnBhdHRlcm4pLGkodGhpcywibG9jYXRpb24iLGUubG9jYXRpb258fHRoaXMubG9jYXRpb258fCJib2R5IiksaSh0aGlzLCJuYW1lIix0aGlzLm5hbWV8fGUueG1sTmFtZXx8ZS5xdWVyeU5hbWV8fGUubG9jYXRpb25OYW1lfHxuKSxpKHRoaXMsImlzU3RyZWFtaW5nIixlLnN0cmVhbWluZ3x8dGhpcy5pc1N0cmVhbWluZ3x8ITEpLGkodGhpcywicmVxdWlyZXNMZW5ndGgiLGUucmVxdWlyZXNMZW5ndGgsITEpLGkodGhpcywiaXNDb21wb3NpdGUiLGUuaXNDb21wb3NpdGV8fCExKSxpKHRoaXMsImlzU2hhcGUiLCEwLCExKSxpKHRoaXMsImlzUXVlcnlOYW1lIixCb29sZWFuKGUucXVlcnlOYW1lKSwhMSksaSh0aGlzLCJpc0xvY2F0aW9uTmFtZSIsQm9vbGVhbihlLmxvY2F0aW9uTmFtZSksITEpLGkodGhpcywiaXNJZGVtcG90ZW50IiwhMD09PWUuaWRlbXBvdGVuY3lUb2tlbiksaSh0aGlzLCJpc0pzb25WYWx1ZSIsITA9PT1lLmpzb252YWx1ZSksaSh0aGlzLCJpc1NlbnNpdGl2ZSIsITA9PT1lLnNlbnNpdGl2ZXx8ZS5wcm90b3R5cGUmJiEwPT09ZS5wcm90b3R5cGUuc2Vuc2l0aXZlKSxpKHRoaXMsImlzRXZlbnRTdHJlYW0iLEJvb2xlYW4oZS5ldmVudHN0cmVhbSksITEpLGkodGhpcywiaXNFdmVudCIsQm9vbGVhbihlLmV2ZW50KSwhMSksaSh0aGlzLCJpc0V2ZW50UGF5bG9hZCIsQm9vbGVhbihlLmV2ZW50cGF5bG9hZCksITEpLGkodGhpcywiaXNFdmVudEhlYWRlciIsQm9vbGVhbihlLmV2ZW50aGVhZGVyKSwhMSksaSh0aGlzLCJpc1RpbWVzdGFtcEZvcm1hdFNldCIsQm9vbGVhbihlLnRpbWVzdGFtcEZvcm1hdCl8fGUucHJvdG90eXBlJiYhMD09PWUucHJvdG90eXBlLmlzVGltZXN0YW1wRm9ybWF0U2V0LCExKSxpKHRoaXMsImVuZHBvaW50RGlzY292ZXJ5SWQiLEJvb2xlYW4oZS5lbmRwb2ludGRpc2NvdmVyeWlkKSwhMSksaSh0aGlzLCJob3N0TGFiZWwiLEJvb2xlYW4oZS5ob3N0TGFiZWwpLCExKSx0LmRvY3VtZW50YXRpb24mJihpKHRoaXMsImRvY3VtZW50YXRpb24iLGUuZG9jdW1lbnRhdGlvbiksaSh0aGlzLCJkb2N1bWVudGF0aW9uVXJsIixlLmRvY3VtZW50YXRpb25VcmwpKSxlLnhtbEF0dHJpYnV0ZSYmaSh0aGlzLCJpc1htbEF0dHJpYnV0ZSIsZS54bWxBdHRyaWJ1dGV8fCExKSxpKHRoaXMsImRlZmF1bHRWYWx1ZSIsbnVsbCksdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZX0sdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9fWZ1bmN0aW9uIGMoZSl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaSh0aGlzLCJpc0NvbXBvc2l0ZSIsITApLGUuZmxhdHRlbmVkJiZpKHRoaXMsImZsYXR0ZW5lZCIsZS5mbGF0dGVuZWR8fCExKX1mdW5jdGlvbiB1KGUsdCl7dmFyIG49dGhpcyxvPW51bGwsdT0hdGhpcy5pc1NoYXBlO2MuYXBwbHkodGhpcyxhcmd1bWVudHMpLHUmJihpKHRoaXMsImRlZmF1bHRWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJue319KSksaSh0aGlzLCJtZW1iZXJzIix7fSksaSh0aGlzLCJtZW1iZXJOYW1lcyIsW10pLGkodGhpcywicmVxdWlyZWQiLFtdKSxpKHRoaXMsImlzUmVxdWlyZWQiLChmdW5jdGlvbigpe3JldHVybiExfSkpLGkodGhpcywiaXNEb2N1bWVudCIsQm9vbGVhbihlLmRvY3VtZW50KSkpLGUubWVtYmVycyYmKGkodGhpcywibWVtYmVycyIsbmV3IHIoZS5tZW1iZXJzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGEuY3JlYXRlKG4sdCxlKX0pKSkscyh0aGlzLCJtZW1iZXJOYW1lcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUueG1sT3JkZXJ8fE9iamVjdC5rZXlzKGUubWVtYmVycyl9KSksZS5ldmVudCYmKHModGhpcywiZXZlbnRQYXlsb2FkTWVtYmVyTmFtZSIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW4ubWVtYmVycyx0PW4ubWVtYmVyTmFtZXMscj0wLG89dC5sZW5ndGg7cjxvO3IrKylpZihlW3Rbcl1dLmlzRXZlbnRQYXlsb2FkKXJldHVybiB0W3JdfSkpLHModGhpcywiZXZlbnRIZWFkZXJNZW1iZXJOYW1lcyIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW4ubWVtYmVycyx0PW4ubWVtYmVyTmFtZXMscj1bXSxvPTAsaT10Lmxlbmd0aDtvPGk7bysrKWVbdFtvXV0uaXNFdmVudEhlYWRlciYmci5wdXNoKHRbb10pO3JldHVybiByfSkpKSksZS5yZXF1aXJlZCYmKGkodGhpcywicmVxdWlyZWQiLGUucmVxdWlyZWQpLGkodGhpcywiaXNSZXF1aXJlZCIsKGZ1bmN0aW9uKHQpe2lmKCFvKXtvPXt9O2Zvcih2YXIgbj0wO248ZS5yZXF1aXJlZC5sZW5ndGg7bisrKW9bZS5yZXF1aXJlZFtuXV09ITB9cmV0dXJuIG9bdF19KSwhMSwhMCkpLGkodGhpcywicmVzdWx0V3JhcHBlciIsZS5yZXN1bHRXcmFwcGVyfHxudWxsKSxlLnBheWxvYWQmJmkodGhpcywicGF5bG9hZCIsZS5wYXlsb2FkKSwic3RyaW5nIj09dHlwZW9mIGUueG1sTmFtZXNwYWNlP2kodGhpcywieG1sTmFtZXNwYWNlVXJpIixlLnhtbE5hbWVzcGFjZSk6Im9iamVjdCI9PXR5cGVvZiBlLnhtbE5hbWVzcGFjZSYmKGkodGhpcywieG1sTmFtZXNwYWNlUHJlZml4IixlLnhtbE5hbWVzcGFjZS5wcmVmaXgpLGkodGhpcywieG1sTmFtZXNwYWNlVXJpIixlLnhtbE5hbWVzcGFjZS51cmkpKX1mdW5jdGlvbiBsKGUsdCl7dmFyIG49dGhpcyxyPSF0aGlzLmlzU2hhcGU7aWYoYy5hcHBseSh0aGlzLGFyZ3VtZW50cyksciYmaSh0aGlzLCJkZWZhdWx0VmFsdWUiLChmdW5jdGlvbigpe3JldHVybltdfSkpLGUubWVtYmVyJiZzKHRoaXMsIm1lbWJlciIsKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY3JlYXRlKGUubWVtYmVyLHQpfSkpLHRoaXMuZmxhdHRlbmVkKXt2YXIgbz10aGlzLm5hbWU7cyh0aGlzLCJuYW1lIiwoZnVuY3Rpb24oKXtyZXR1cm4gbi5tZW1iZXIubmFtZXx8b30pKX19ZnVuY3Rpb24gcChlLHQpe3ZhciBuPSF0aGlzLmlzU2hhcGU7Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksbiYmKGkodGhpcywiZGVmYXVsdFZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm57fX0pKSxpKHRoaXMsImtleSIsYS5jcmVhdGUoe3R5cGU6InN0cmluZyJ9LHQpKSxpKHRoaXMsInZhbHVlIixhLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0sdCkpKSxlLmtleSYmcyh0aGlzLCJrZXkiLChmdW5jdGlvbigpe3JldHVybiBhLmNyZWF0ZShlLmtleSx0KX0pKSxlLnZhbHVlJiZzKHRoaXMsInZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm4gYS5jcmVhdGUoZS52YWx1ZSx0KX0pKX1mdW5jdGlvbiBkKCl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9WyJyZXN0LXhtbCIsInF1ZXJ5IiwiZWMyIl07dGhpcy50b1R5cGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5hcGkmJmUuaW5kZXhPZih0aGlzLmFwaS5wcm90b2NvbCk+LTE/dHx8IiI6dCx0aGlzLmlzSnNvblZhbHVlP0pTT04ucGFyc2UodCk6dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudG9TdHJpbmc/dC50b1N0cmluZygpOnR9LHRoaXMudG9XaXJlRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlzSnNvblZhbHVlP0pTT04uc3RyaW5naWZ5KGUpOmV9fWZ1bmN0aW9uIGgoKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXt2YXIgdD1vLmJhc2U2NC5kZWNvZGUoZSk7aWYodGhpcy5pc1NlbnNpdGl2ZSYmby5pc05vZGUoKSYmImZ1bmN0aW9uIj09dHlwZW9mIG8uQnVmZmVyLmFsbG9jKXt2YXIgbj1vLkJ1ZmZlci5hbGxvYyh0Lmxlbmd0aCx0KTt0LmZpbGwoMCksdD1ufXJldHVybiB0fSx0aGlzLnRvV2lyZUZvcm1hdD1vLmJhc2U2NC5lbmNvZGV9ZnVuY3Rpb24gZigpe2guYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGcoKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U6bnVsbD09ZT9udWxsOiJ0cnVlIj09PWV9fWEubm9ybWFsaXplZFR5cGVzPXtjaGFyYWN0ZXI6InN0cmluZyIsZG91YmxlOiJmbG9hdCIsbG9uZzoiaW50ZWdlciIsc2hvcnQ6ImludGVnZXIiLGJpZ2ludGVnZXI6ImludGVnZXIiLGJpZ2RlY2ltYWw6ImZsb2F0IixibG9iOiJiaW5hcnkifSxhLnR5cGVzPXtzdHJ1Y3R1cmU6dSxsaXN0OmwsbWFwOnAsYm9vbGVhbjpnLHRpbWVzdGFtcDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKGEuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudGltZXN0YW1wRm9ybWF0KWkodGhpcywidGltZXN0YW1wRm9ybWF0IixlLnRpbWVzdGFtcEZvcm1hdCk7ZWxzZSBpZih0LmlzVGltZXN0YW1wRm9ybWF0U2V0JiZ0aGlzLnRpbWVzdGFtcEZvcm1hdClpKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsdGhpcy50aW1lc3RhbXBGb3JtYXQpO2Vsc2UgaWYoImhlYWRlciI9PT10aGlzLmxvY2F0aW9uKWkodGhpcywidGltZXN0YW1wRm9ybWF0IiwicmZjODIyIik7ZWxzZSBpZigicXVlcnlzdHJpbmciPT09dGhpcy5sb2NhdGlvbilpKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsImlzbzg2MDEiKTtlbHNlIGlmKHRoaXMuYXBpKXN3aXRjaCh0aGlzLmFwaS5wcm90b2NvbCl7Y2FzZSJqc29uIjpjYXNlInJlc3QtanNvbiI6aSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJ1bml4VGltZXN0YW1wIik7YnJlYWs7Y2FzZSJyZXN0LXhtbCI6Y2FzZSJxdWVyeSI6Y2FzZSJlYzIiOmkodGhpcywidGltZXN0YW1wRm9ybWF0IiwiaXNvODYwMSIpfXRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIGUudG9VVENTdHJpbmc/ZToic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZT9vLmRhdGUucGFyc2VUaW1lc3RhbXAoZSk6bnVsbH0sdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uZGF0ZS5mb3JtYXQoZSx0LnRpbWVzdGFtcEZvcm1hdCl9fSxmbG9hdDpmdW5jdGlvbigpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6cGFyc2VGbG9hdChlKX0sdGhpcy50b1dpcmVGb3JtYXQ9dGhpcy50b1R5cGV9LGludGVnZXI6ZnVuY3Rpb24oKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9udWxsOnBhcnNlSW50KGUsMTApfSx0aGlzLnRvV2lyZUZvcm1hdD10aGlzLnRvVHlwZX0sc3RyaW5nOmQsYmFzZTY0OmYsYmluYXJ5Omh9LGEucmVzb2x2ZT1mdW5jdGlvbihlLHQpe2lmKGUuc2hhcGUpe3ZhciBuPXQuYXBpLnNoYXBlc1tlLnNoYXBlXTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHNoYXBlIHJlZmVyZW5jZTogIitlLnNoYXBlKTtyZXR1cm4gbn1yZXR1cm4gbnVsbH0sYS5jcmVhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaXNTaGFwZSlyZXR1cm4gZTt2YXIgcj1hLnJlc29sdmUoZSx0KTtpZihyKXt2YXIgbz1PYmplY3Qua2V5cyhlKTt0LmRvY3VtZW50YXRpb258fChvPW8uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hZS5tYXRjaCgvZG9jdW1lbnRhdGlvbi8pfSkpKTt2YXIgaT1mdW5jdGlvbigpe3IuY29uc3RydWN0b3IuY2FsbCh0aGlzLGUsdCxuKX07cmV0dXJuIGkucHJvdG90eXBlPXIsbmV3IGl9ZS50eXBlfHwoZS5tZW1iZXJzP2UudHlwZT0ic3RydWN0dXJlIjplLm1lbWJlcj9lLnR5cGU9Imxpc3QiOmUua2V5P2UudHlwZT0ibWFwIjplLnR5cGU9InN0cmluZyIpO3ZhciBzPWUudHlwZTtpZihhLm5vcm1hbGl6ZWRUeXBlc1tlLnR5cGVdJiYoZS50eXBlPWEubm9ybWFsaXplZFR5cGVzW2UudHlwZV0pLGEudHlwZXNbZS50eXBlXSlyZXR1cm4gbmV3IGEudHlwZXNbZS50eXBlXShlLHQsbik7dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgc2hhcGUgdHlwZTogIitzKX0sYS5zaGFwZXM9e1N0cnVjdHVyZVNoYXBlOnUsTGlzdFNoYXBlOmwsTWFwU2hhcGU6cCxTdHJpbmdTaGFwZTpkLEJvb2xlYW5TaGFwZTpnLEJhc2U2NFNoYXBlOmZ9LHQuZXhwb3J0cz1hfSx7Ii4uL3V0aWwiOjc0LCIuL2NvbGxlY3Rpb24iOjQxfV0sNDY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLlBhcmFtVmFsaWRhdG9yPXIudXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXshMCE9PWUmJnZvaWQgMCE9PWV8fChlPXttaW46ITB9KSx0aGlzLnZhbGlkYXRpb249ZX0sdmFsaWRhdGU6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZXJyb3JzPVtdLHRoaXMudmFsaWRhdGVNZW1iZXIoZSx0fHx7fSxufHwicGFyYW1zIiksdGhpcy5lcnJvcnMubGVuZ3RoPjEpe3ZhciBvPXRoaXMuZXJyb3JzLmpvaW4oIlxuKiAiKTt0aHJvdyBvPSJUaGVyZSB3ZXJlICIrdGhpcy5lcnJvcnMubGVuZ3RoKyIgdmFsaWRhdGlvbiBlcnJvcnM6XG4qICIrbyxyLnV0aWwuZXJyb3IobmV3IEVycm9yKG8pLHtjb2RlOiJNdWx0aXBsZVZhbGlkYXRpb25FcnJvcnMiLGVycm9yczp0aGlzLmVycm9yc30pfWlmKDE9PT10aGlzLmVycm9ycy5sZW5ndGgpdGhyb3cgdGhpcy5lcnJvcnNbMF07cmV0dXJuITB9LGZhaWw6ZnVuY3Rpb24oZSx0KXt0aGlzLmVycm9ycy5wdXNoKHIudXRpbC5lcnJvcihuZXcgRXJyb3IodCkse2NvZGU6ZX0pKX0sdmFsaWRhdGVTdHJ1Y3R1cmU6ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaXNEb2N1bWVudClyZXR1cm4hMDt2YXIgcjt0aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJvYmplY3QiXSwic3RydWN0dXJlIik7Zm9yKHZhciBvPTA7ZS5yZXF1aXJlZCYmbzxlLnJlcXVpcmVkLmxlbmd0aDtvKyspe3ZhciBpPXRbcj1lLnJlcXVpcmVkW29dXTtudWxsPT1pJiZ0aGlzLmZhaWwoIk1pc3NpbmdSZXF1aXJlZFBhcmFtZXRlciIsIk1pc3NpbmcgcmVxdWlyZWQga2V5ICciK3IrIicgaW4gIituKX1mb3IociBpbiB0KWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpKXt2YXIgcz10W3JdLGE9ZS5tZW1iZXJzW3JdO2lmKHZvaWQgMCE9PWEpe3ZhciBjPVtuLHJdLmpvaW4oIi4iKTt0aGlzLnZhbGlkYXRlTWVtYmVyKGEscyxjKX1lbHNlIG51bGwhPXMmJnRoaXMuZmFpbCgiVW5leHBlY3RlZFBhcmFtZXRlciIsIlVuZXhwZWN0ZWQga2V5ICciK3IrIicgZm91bmQgaW4gIituKX1yZXR1cm4hMH0sdmFsaWRhdGVNZW1iZXI6ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaChlLnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gdGhpcy52YWxpZGF0ZVN0cnVjdHVyZShlLHQsbik7Y2FzZSJsaXN0IjpyZXR1cm4gdGhpcy52YWxpZGF0ZUxpc3QoZSx0LG4pO2Nhc2UibWFwIjpyZXR1cm4gdGhpcy52YWxpZGF0ZU1hcChlLHQsbik7ZGVmYXVsdDpyZXR1cm4gdGhpcy52YWxpZGF0ZVNjYWxhcihlLHQsbil9fSx2YWxpZGF0ZUxpc3Q6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmFsaWRhdGVUeXBlKHQsbixbQXJyYXldKSl7dGhpcy52YWxpZGF0ZVJhbmdlKGUsdC5sZW5ndGgsbiwibGlzdCBtZW1iZXIgY291bnQiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0aGlzLnZhbGlkYXRlTWVtYmVyKGUubWVtYmVyLHRbcl0sbisiWyIrcisiXSIpfX0sdmFsaWRhdGVNYXA6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmFsaWRhdGVUeXBlKHQsbixbIm9iamVjdCJdLCJtYXAiKSl7dmFyIHI9MDtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmKHRoaXMudmFsaWRhdGVNZW1iZXIoZS5rZXksbyxuKyJba2V5PSciK28rIiddIiksdGhpcy52YWxpZGF0ZU1lbWJlcihlLnZhbHVlLHRbb10sbisiWyciK28rIiddIikscisrKTt0aGlzLnZhbGlkYXRlUmFuZ2UoZSxyLG4sIm1hcCBtZW1iZXIgY291bnQiKX19LHZhbGlkYXRlU2NhbGFyOmZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2goZS50eXBlKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6Y2FzZSJzdHJpbmciOnJldHVybiB0aGlzLnZhbGlkYXRlU3RyaW5nKGUsdCxuKTtjYXNlImJhc2U2NCI6Y2FzZSJiaW5hcnkiOnJldHVybiB0aGlzLnZhbGlkYXRlUGF5bG9hZCh0LG4pO2Nhc2UiaW50ZWdlciI6Y2FzZSJmbG9hdCI6cmV0dXJuIHRoaXMudmFsaWRhdGVOdW1iZXIoZSx0LG4pO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHRoaXMudmFsaWRhdGVUeXBlKHQsbixbImJvb2xlYW4iXSk7Y2FzZSJ0aW1lc3RhbXAiOnJldHVybiB0aGlzLnZhbGlkYXRlVHlwZSh0LG4sW0RhdGUsL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfTpcZHsyfTpcZHsyfShcLlxkKyk/WiQvLCJudW1iZXIiXSwiRGF0ZSBvYmplY3QsIElTTy04NjAxIHN0cmluZywgb3IgYSBVTklYIHRpbWVzdGFtcCIpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuZmFpbCgiVW5rb3duVHlwZSIsIlVuaGFuZGxlZCB0eXBlICIrZS50eXBlKyIgZm9yICIrbil9fSx2YWxpZGF0ZVN0cmluZzpmdW5jdGlvbihlLHQsbil7dmFyIHI9WyJzdHJpbmciXTtlLmlzSnNvblZhbHVlJiYocj1yLmNvbmNhdChbIm51bWJlciIsIm9iamVjdCIsImJvb2xlYW4iXSkpLG51bGwhPT10JiZ0aGlzLnZhbGlkYXRlVHlwZSh0LG4scikmJih0aGlzLnZhbGlkYXRlRW51bShlLHQsbiksdGhpcy52YWxpZGF0ZVJhbmdlKGUsdC5sZW5ndGgsbiwic3RyaW5nIGxlbmd0aCIpLHRoaXMudmFsaWRhdGVQYXR0ZXJuKGUsdCxuKSx0aGlzLnZhbGlkYXRlVXJpKGUsdCxuKSl9LHZhbGlkYXRlVXJpOmZ1bmN0aW9uKGUsdCxuKXsidXJpIj09PWUubG9jYXRpb24mJjA9PT10Lmxlbmd0aCYmdGhpcy5mYWlsKCJVcmlQYXJhbWV0ZXJFcnJvciIsJ0V4cGVjdGVkIHVyaSBwYXJhbWV0ZXIgdG8gaGF2ZSBsZW5ndGggPj0gMSwgYnV0IGZvdW5kICInK3QrJyIgZm9yICcrbil9LHZhbGlkYXRlUGF0dGVybjpmdW5jdGlvbihlLHQsbil7dGhpcy52YWxpZGF0aW9uLnBhdHRlcm4mJnZvaWQgMCE9PWUucGF0dGVybiYmKG5ldyBSZWdFeHAoZS5wYXR0ZXJuKS50ZXN0KHQpfHx0aGlzLmZhaWwoIlBhdHRlcm5NYXRjaEVycm9yIiwnUHJvdmlkZWQgdmFsdWUgIicrdCsnIiBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIC8nK2UucGF0dGVybisiLyBmb3IgIituKSl9LHZhbGlkYXRlUmFuZ2U6ZnVuY3Rpb24oZSx0LG4scil7dGhpcy52YWxpZGF0aW9uLm1pbiYmdm9pZCAwIT09ZS5taW4mJnQ8ZS5taW4mJnRoaXMuZmFpbCgiTWluUmFuZ2VFcnJvciIsIkV4cGVjdGVkICIrcisiID49ICIrZS5taW4rIiwgYnV0IGZvdW5kICIrdCsiIGZvciAiK24pLHRoaXMudmFsaWRhdGlvbi5tYXgmJnZvaWQgMCE9PWUubWF4JiZ0PmUubWF4JiZ0aGlzLmZhaWwoIk1heFJhbmdlRXJyb3IiLCJFeHBlY3RlZCAiK3IrIiA8PSAiK2UubWF4KyIsIGJ1dCBmb3VuZCAiK3QrIiBmb3IgIituKX0sdmFsaWRhdGVFbnVtOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnZhbGlkYXRpb24uZW51bSYmdm9pZCAwIT09ZS5lbnVtJiYtMT09PWUuZW51bS5pbmRleE9mKHQpJiZ0aGlzLmZhaWwoIkVudW1FcnJvciIsIkZvdW5kIHN0cmluZyB2YWx1ZSBvZiAiK3QrIiwgYnV0IGV4cGVjdGVkICIrZS5lbnVtLmpvaW4oInwiKSsiIGZvciAiK24pfSx2YWxpZGF0ZVR5cGU6ZnVuY3Rpb24oZSx0LG4sbyl7aWYobnVsbD09ZSlyZXR1cm4hMTtmb3IodmFyIGk9ITEscz0wO3M8bi5sZW5ndGg7cysrKXtpZigic3RyaW5nIj09dHlwZW9mIG5bc10pe2lmKHR5cGVvZiBlPT09bltzXSlyZXR1cm4hMH1lbHNlIGlmKG5bc11pbnN0YW5jZW9mIFJlZ0V4cCl7aWYoKGV8fCIiKS50b1N0cmluZygpLm1hdGNoKG5bc10pKXJldHVybiEwfWVsc2V7aWYoZSBpbnN0YW5jZW9mIG5bc10pcmV0dXJuITA7aWYoci51dGlsLmlzVHlwZShlLG5bc10pKXJldHVybiEwO298fGl8fChuPW4uc2xpY2UoKSksbltzXT1yLnV0aWwudHlwZU5hbWUobltzXSl9aT0hMH12YXIgYT1vO2F8fChhPW4uam9pbigiLCAiKS5yZXBsYWNlKC8sKFteLF0rKSQvLCIsIG9yJDEiKSk7dmFyIGM9YS5tYXRjaCgvXlthZWlvdV0vaSk/Im4iOiIiO3JldHVybiB0aGlzLmZhaWwoIkludmFsaWRQYXJhbWV0ZXJUeXBlIiwiRXhwZWN0ZWQgIit0KyIgdG8gYmUgYSIrYysiICIrYSksITF9LHZhbGlkYXRlTnVtYmVyOmZ1bmN0aW9uKGUsdCxuKXtpZihudWxsIT10KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciByPXBhcnNlRmxvYXQodCk7ci50b1N0cmluZygpPT09dCYmKHQ9cil9dGhpcy52YWxpZGF0ZVR5cGUodCxuLFsibnVtYmVyIl0pJiZ0aGlzLnZhbGlkYXRlUmFuZ2UoZSx0LG4sIm51bWVyaWMgdmFsdWUiKX19LHZhbGlkYXRlUGF5bG9hZDpmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUmJiJzdHJpbmciIT10eXBlb2YgZSYmKCFlfHwibnVtYmVyIiE9dHlwZW9mIGUuYnl0ZUxlbmd0aCkpe2lmKHIudXRpbC5pc05vZGUoKSl7dmFyIG49ci51dGlsLnN0cmVhbS5TdHJlYW07aWYoci51dGlsLkJ1ZmZlci5pc0J1ZmZlcihlKXx8ZSBpbnN0YW5jZW9mIG4pcmV0dXJufWVsc2UgaWYodm9pZCAwIT09dHlwZW9mIEJsb2ImJmUgaW5zdGFuY2VvZiBCbG9iKXJldHVybjt2YXIgbz1bIkJ1ZmZlciIsIlN0cmVhbSIsIkZpbGUiLCJCbG9iIiwiQXJyYXlCdWZmZXIiLCJEYXRhVmlldyJdO2lmKGUpZm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspe2lmKHIudXRpbC5pc1R5cGUoZSxvW2ldKSlyZXR1cm47aWYoci51dGlsLnR5cGVOYW1lKGUuY29uc3RydWN0b3IpPT09b1tpXSlyZXR1cm59dGhpcy5mYWlsKCJJbnZhbGlkUGFyYW1ldGVyVHlwZSIsIkV4cGVjdGVkICIrdCsiIHRvIGJlIGEgc3RyaW5nLCBCdWZmZXIsIFN0cmVhbSwgQmxvYiwgb3IgdHlwZWQgYXJyYXkgb2JqZWN0Iil9fX0pfSx7Ii4vY29yZSI6MTl9XSw0NzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4uL2NvcmUiKTt0LmV4cG9ydHM9e3BvcHVsYXRlSG9zdFByZWZpeDpmdW5jdGlvbihlKXtpZighZS5zZXJ2aWNlLmNvbmZpZy5ob3N0UHJlZml4RW5hYmxlZClyZXR1cm4gZTt2YXIgdCxuLGkscyxhLGM9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZihmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLG49dC5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxvPXQuZW5kcG9pbnRPcGVyYXRpb24mJnQuZW5kcG9pbnRPcGVyYXRpb249PT1yLnN0cmluZy5sb3dlckZpcnN0KG4ubmFtZSk7cmV0dXJuIk5VTEwiIT09bi5lbmRwb2ludERpc2NvdmVyeVJlcXVpcmVkfHwhMD09PW99KGUpKXJldHVybiBlO2lmKGMuZW5kcG9pbnQmJmMuZW5kcG9pbnQuaG9zdFByZWZpeCl7dmFyIHU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLmVhY2gobi5tZW1iZXJzLChmdW5jdGlvbihuLG8pe2lmKCEwPT09by5ob3N0TGFiZWwpe2lmKCJzdHJpbmciIT10eXBlb2YgdFtuXXx8IiI9PT10W25dKXRocm93IHIuZXJyb3IobmV3IEVycm9yLHttZXNzYWdlOiJQYXJhbWV0ZXIgIituKyIgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IHN0cmluZy4iLGNvZGU6IkludmFsaWRQYXJhbWV0ZXIifSk7dmFyIGk9bmV3IFJlZ0V4cCgiXFx7IituKyJcXH0iLCJnIik7ZT1lLnJlcGxhY2UoaSx0W25dKX19KSksZX0oYy5lbmRwb2ludC5ob3N0UHJlZml4LGUucGFyYW1zLGMuaW5wdXQpO3M9ZS5odHRwUmVxdWVzdC5lbmRwb2ludCxhPXUscy5ob3N0JiYocy5ob3N0PWErcy5ob3N0KSxzLmhvc3RuYW1lJiYocy5ob3N0bmFtZT1hK3MuaG9zdG5hbWUpLHQ9ZS5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0bmFtZSxuPXQuc3BsaXQoIi4iKSxpPS9eW2EtekEtWjAtOV17MX0kfF5bYS16QS1aMC05XVthLXpBLVowLTlcLV0qW2EtekEtWjAtOV0kLyxyLmFycmF5RWFjaChuLChmdW5jdGlvbihlKXtpZighZS5sZW5ndGh8fGUubGVuZ3RoPDF8fGUubGVuZ3RoPjYzKXRocm93IHIuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJWYWxpZGF0aW9uRXJyb3IiLG1lc3NhZ2U6Ikhvc3RuYW1lIGxhYmVsIGxlbmd0aCBzaG91bGQgYmUgYmV0d2VlbiAxIHRvIDYzIGNoYXJhY3RlcnMsIGluY2x1c2l2ZS4ifSk7aWYoIWkudGVzdChlKSl0aHJvdyBvLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJWYWxpZGF0aW9uRXJyb3IiLG1lc3NhZ2U6ZSsiIGlzIG5vdCBob3N0bmFtZSBjb21wYXRpYmxlLiJ9KX0pKX1yZXR1cm4gZX19fSx7Ii4uL2NvcmUiOjE5LCIuLi91dGlsIjo3NH1dLDQ4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vanNvbi9idWlsZGVyIiksaT1lKCIuLi9qc29uL3BhcnNlciIpLHM9ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuaHR0cFJlcXVlc3Qsbj1lLnNlcnZpY2UuYXBpLHI9bi50YXJnZXRQcmVmaXgrIi4iK24ub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0ubmFtZSxpPW4uanNvblZlcnNpb258fCIxLjAiLGE9bi5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dCxjPW5ldyBvOzE9PT1pJiYoaT0iMS4wIiksbi5hd3NRdWVyeUNvbXBhdGlibGUmJih0LnBhcmFtc3x8KHQucGFyYW1zPXt9KSxPYmplY3QuYXNzaWduKHQucGFyYW1zLGUucGFyYW1zKSksdC5ib2R5PWMuYnVpbGQoZS5wYXJhbXN8fHt9LGEpLHQuaGVhZGVyc1siQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtYW16LWpzb24tIitpLHQuaGVhZGVyc1siWC1BbXotVGFyZ2V0Il09cixzKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj1lLmh0dHBSZXNwb25zZTtpZih0LmNvZGU9bi5oZWFkZXJzWyJ4LWFtem4tZXJyb3J0eXBlIl18fCJVbmtub3duRXJyb3IiLCJzdHJpbmciPT10eXBlb2YgdC5jb2RlJiYodC5jb2RlPXQuY29kZS5zcGxpdCgiOiIpWzBdKSxuLmJvZHkubGVuZ3RoPjApdHJ5e3ZhciBvPUpTT04ucGFyc2Uobi5ib2R5LnRvU3RyaW5nKCkpLGk9by5fX3R5cGV8fG8uY29kZXx8by5Db2RlO2Zvcih2YXIgcyBpbiBpJiYodC5jb2RlPWkuc3BsaXQoIiMiKS5wb3AoKSksIlJlcXVlc3RFbnRpdHlUb29MYXJnZSI9PT10LmNvZGU/dC5tZXNzYWdlPSJSZXF1ZXN0IGJvZHkgbXVzdCBiZSBsZXNzIHRoYW4gMSBNQiI6dC5tZXNzYWdlPW8ubWVzc2FnZXx8by5NZXNzYWdlfHxudWxsLG98fHt9KSJjb2RlIiE9PXMmJiJtZXNzYWdlIiE9PXMmJih0WyJbIitzKyJdIl09IlNlZSBlcnJvci4iK3MrIiBmb3IgZGV0YWlscy4iLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHMse3ZhbHVlOm9bc10sZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH0pKX1jYXRjaChvKXt0LnN0YXR1c0NvZGU9bi5zdGF0dXNDb2RlLHQubWVzc2FnZT1uLnN0YXR1c01lc3NhZ2V9ZWxzZSB0LnN0YXR1c0NvZGU9bi5zdGF0dXNDb2RlLHQubWVzc2FnZT1uLnN0YXR1c0NvZGUudG9TdHJpbmcoKTtlLmVycm9yPXIuZXJyb3IobmV3IEVycm9yLHQpfSxleHRyYWN0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCl8fCJ7fSI7aWYoITE9PT1lLnJlcXVlc3Quc2VydmljZS5jb25maWcuY29udmVydFJlc3BvbnNlVHlwZXMpZS5kYXRhPUpTT04ucGFyc2UodCk7ZWxzZXt2YXIgbj1lLnJlcXVlc3Quc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLnJlcXVlc3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9LHI9bmV3IGk7ZS5kYXRhPXIucGFyc2UodCxuKX19fX0seyIuLi9qc29uL2J1aWxkZXIiOjM3LCIuLi9qc29uL3BhcnNlciI6MzgsIi4uL3V0aWwiOjc0LCIuL2hlbHBlcnMiOjQ3fV0sNDk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi91dGlsIiksaT1lKCIuLi9xdWVyeS9xdWVyeV9wYXJhbV9zZXJpYWxpemVyIikscz1lKCIuLi9tb2RlbC9zaGFwZSIpLGE9ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj1lLmh0dHBSZXF1ZXN0O24uaGVhZGVyc1siQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD11dGYtOCIsbi5wYXJhbXM9e1ZlcnNpb246ZS5zZXJ2aWNlLmFwaS5hcGlWZXJzaW9uLEFjdGlvbjp0Lm5hbWV9LChuZXcgaSkuc2VyaWFsaXplKGUucGFyYW1zLHQuaW5wdXQsKGZ1bmN0aW9uKGUsdCl7bi5wYXJhbXNbZV09dH0pKSxuLmJvZHk9by5xdWVyeVBhcmFtc1RvU3RyaW5nKG4ucGFyYW1zKSxhKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCk7aWYobi5tYXRjaCgiPFVua25vd25PcGVyYXRpb25FeGNlcHRpb24iKSl0PXtDb2RlOiJVbmtub3duT3BlcmF0aW9uIixNZXNzYWdlOiJVbmtub3duIG9wZXJhdGlvbiAiK2UucmVxdWVzdC5vcGVyYXRpb259O2Vsc2UgdHJ5e3Q9KG5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKG4pfWNhdGNoKG4pe3Q9e0NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxNZXNzYWdlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c01lc3NhZ2V9fXQucmVxdWVzdElkJiYhZS5yZXF1ZXN0SWQmJihlLnJlcXVlc3RJZD10LnJlcXVlc3RJZCksdC5FcnJvcnMmJih0PXQuRXJyb3JzKSx0LkVycm9yJiYodD10LkVycm9yKSx0LkNvZGU/ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTp0LkNvZGUsbWVzc2FnZTp0Lk1lc3NhZ2V9KTplLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsbWVzc2FnZTpudWxsfSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0fHx7fSxpPW47aWYoaS5yZXN1bHRXcmFwcGVyKXt2YXIgYT1zLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0pO2EubWVtYmVyc1tpLnJlc3VsdFdyYXBwZXJdPW4sYS5tZW1iZXJOYW1lcz1baS5yZXN1bHRXcmFwcGVyXSxvLnByb3BlcnR5KG4sIm5hbWUiLG4ucmVzdWx0V3JhcHBlciksbj1hfXZhciBjPW5ldyByLlhNTC5QYXJzZXI7aWYobiYmbi5tZW1iZXJzJiYhbi5tZW1iZXJzLl9YQU1aUmVxdWVzdElkKXt2YXIgdT1zLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0se2FwaTp7cHJvdG9jb2w6InF1ZXJ5In19LCJyZXF1ZXN0SWQiKTtuLm1lbWJlcnMuX1hBTVpSZXF1ZXN0SWQ9dX12YXIgbD1jLnBhcnNlKGUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSxuKTtlLnJlcXVlc3RJZD1sLl9YQU1aUmVxdWVzdElkfHxsLnJlcXVlc3RJZCxsLl9YQU1aUmVxdWVzdElkJiZkZWxldGUgbC5fWEFNWlJlcXVlc3RJZCxpLnJlc3VsdFdyYXBwZXImJmxbaS5yZXN1bHRXcmFwcGVyXSYmKG8udXBkYXRlKGwsbFtpLnJlc3VsdFdyYXBwZXJdKSxkZWxldGUgbFtpLnJlc3VsdFdyYXBwZXJdKSxlLmRhdGE9bH19fSx7Ii4uL2NvcmUiOjE5LCIuLi9tb2RlbC9zaGFwZSI6NDUsIi4uL3F1ZXJ5L3F1ZXJ5X3BhcmFtX3NlcmlhbGl6ZXIiOjUzLCIuLi91dGlsIjo3NCwiLi9oZWxwZXJzIjo0N31dLDUwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O2Z1bmN0aW9uIGkoZSx0LG4sbyl7dmFyIGk9W2UsdF0uam9pbigiLyIpO2k9aS5yZXBsYWNlKC9cLysvZywiLyIpO3ZhciBzPXt9LGE9ITE7aWYoci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24oZSx0KXt2YXIgbj1vW2VdO2lmKG51bGwhPW4paWYoInVyaSI9PT10LmxvY2F0aW9uKXt2YXIgYz1uZXcgUmVnRXhwKCJcXHsiK3QubmFtZSsiKFxcKyk/XFx9Iik7aT1pLnJlcGxhY2UoYywoZnVuY3Rpb24oZSx0KXtyZXR1cm4odD9yLnVyaUVzY2FwZVBhdGg6ci51cmlFc2NhcGUpKFN0cmluZyhuKSl9KSl9ZWxzZSJxdWVyeXN0cmluZyI9PT10LmxvY2F0aW9uJiYoYT0hMCwibGlzdCI9PT10LnR5cGU/c1t0Lm5hbWVdPW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gci51cmlFc2NhcGUodC5tZW1iZXIudG9XaXJlRm9ybWF0KGUpLnRvU3RyaW5nKCkpfSkpOiJtYXAiPT09dC50eXBlP3IuZWFjaChuLChmdW5jdGlvbihlLHQpe0FycmF5LmlzQXJyYXkodCk/c1tlXT10Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHIudXJpRXNjYXBlKFN0cmluZyhlKSl9KSk6c1tlXT1yLnVyaUVzY2FwZShTdHJpbmcodCkpfSkpOnNbdC5uYW1lXT1yLnVyaUVzY2FwZSh0LnRvV2lyZUZvcm1hdChuKS50b1N0cmluZygpKSl9KSksYSl7aSs9aS5pbmRleE9mKCI/Iik+PTA/IiYiOiI/Ijt2YXIgYz1bXTtyLmFycmF5RWFjaChPYmplY3Qua2V5cyhzKS5zb3J0KCksKGZ1bmN0aW9uKGUpe0FycmF5LmlzQXJyYXkoc1tlXSl8fChzW2VdPVtzW2VdXSk7Zm9yKHZhciB0PTA7dDxzW2VdLmxlbmd0aDt0KyspYy5wdXNoKHIudXJpRXNjYXBlKFN0cmluZyhlKSkrIj0iK3NbZV1bdF0pfSkpLGkrPWMuam9pbigiJiIpfXJldHVybiBpfXQuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0Lm1ldGhvZD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmh0dHBNZXRob2R9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj10LmlucHV0LHI9aShlLmh0dHBSZXF1ZXN0LmVuZHBvaW50LnBhdGgsdC5odHRwUGF0aCxuLGUucGFyYW1zKTtlLmh0dHBSZXF1ZXN0LnBhdGg9cn0oZSksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtyLmVhY2godC5pbnB1dC5tZW1iZXJzLChmdW5jdGlvbih0LG4pe3ZhciBvPWUucGFyYW1zW3RdO251bGwhPW8mJigiaGVhZGVycyI9PT1uLmxvY2F0aW9uJiYibWFwIj09PW4udHlwZT9yLmVhY2gobywoZnVuY3Rpb24odCxyKXtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbbi5uYW1lK3RdPXJ9KSk6ImhlYWRlciI9PT1uLmxvY2F0aW9uJiYobz1uLnRvV2lyZUZvcm1hdChvKS50b1N0cmluZygpLG4uaXNKc29uVmFsdWUmJihvPXIuYmFzZTY0LmVuY29kZShvKSksZS5odHRwUmVxdWVzdC5oZWFkZXJzW24ubmFtZV09bykpfSkpfShlKSxvKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oKXt9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXt9LG89ZS5odHRwUmVzcG9uc2UsaT10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbdC5vcGVyYXRpb25dLm91dHB1dCxzPXt9O3IuZWFjaChvLmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7c1tlLnRvTG93ZXJDYXNlKCldPXR9KSksci5lYWNoKGkubWVtYmVycywoZnVuY3Rpb24oZSx0KXt2YXIgaT0odC5uYW1lfHxlKS50b0xvd2VyQ2FzZSgpO2lmKCJoZWFkZXJzIj09PXQubG9jYXRpb24mJiJtYXAiPT09dC50eXBlKXtuW2VdPXt9O3ZhciBhPXQuaXNMb2NhdGlvbk5hbWU/dC5uYW1lOiIiLGM9bmV3IFJlZ0V4cCgiXiIrYSsiKC4rKSIsImkiKTtyLmVhY2goby5oZWFkZXJzLChmdW5jdGlvbih0LHIpe3ZhciBvPXQubWF0Y2goYyk7bnVsbCE9PW8mJihuW2VdW29bMV1dPXIpfSkpfWVsc2UgaWYoImhlYWRlciI9PT10LmxvY2F0aW9uKXtpZih2b2lkIDAhPT1zW2ldKXt2YXIgdT10LmlzSnNvblZhbHVlP3IuYmFzZTY0LmRlY29kZShzW2ldKTpzW2ldO25bZV09dC50b1R5cGUodSl9fWVsc2Uic3RhdHVzQ29kZSI9PT10LmxvY2F0aW9uJiYobltlXT1wYXJzZUludChvLnN0YXR1c0NvZGUsMTApKX0pKSxlLmRhdGE9bn0sZ2VuZXJhdGVVUkk6aX19LHsiLi4vdXRpbCI6NzQsIi4vaGVscGVycyI6NDd9XSw1MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4vcmVzdCIpLGk9ZSgiLi9qc29uIikscz1lKCIuLi9qc29uL2J1aWxkZXIiKSxhPWUoIi4uL2pzb24vcGFyc2VyIiksYz1bIkdFVCIsIkhFQUQiLCJERUxFVEUiXTtmdW5jdGlvbiB1KGUsdCl7aWYoIWUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pe3ZhciBuPXQ/ImJpbmFyeS9vY3RldC1zdHJlYW0iOiJhcHBsaWNhdGlvbi9qc29uIjtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPW59fXQuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe28uYnVpbGRSZXF1ZXN0KGUpLGMuaW5kZXhPZihlLmh0dHBSZXF1ZXN0Lm1ldGhvZCk8MCYmZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHMsbj1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmlucHV0O2lmKG4ucGF5bG9hZCl7dmFyIHIsbz1uLm1lbWJlcnNbbi5wYXlsb2FkXTtyPWUucGFyYW1zW24ucGF5bG9hZF0sInN0cnVjdHVyZSI9PT1vLnR5cGU/KGUuaHR0cFJlcXVlc3QuYm9keT10LmJ1aWxkKHJ8fHt9LG8pLHUoZSkpOnZvaWQgMCE9PXImJihlLmh0dHBSZXF1ZXN0LmJvZHk9ciwoImJpbmFyeSI9PT1vLnR5cGV8fG8uaXNTdHJlYW1pbmcpJiZ1KGUsITApKX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT10LmJ1aWxkKGUucGFyYW1zLG4pLHUoZSl9KGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7aS5leHRyYWN0RXJyb3IoZSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe28uZXh0cmFjdERhdGEoZSk7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXSxzPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0fHx7fTtpZihuLmhhc0V2ZW50T3V0cHV0LHMucGF5bG9hZCl7dmFyIGM9cy5tZW1iZXJzW3MucGF5bG9hZF0sdT1lLmh0dHBSZXNwb25zZS5ib2R5O2lmKGMuaXNFdmVudFN0cmVhbSlsPW5ldyBhLGUuZGF0YVtwYXlsb2FkXT1yLmNyZWF0ZUV2ZW50U3RyZWFtKDI9PT1BV1MuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9lLmh0dHBSZXNwb25zZS5zdHJlYW06dSxsLGMpO2Vsc2UgaWYoInN0cnVjdHVyZSI9PT1jLnR5cGV8fCJsaXN0Ij09PWMudHlwZSl7dmFyIGw9bmV3IGE7ZS5kYXRhW3MucGF5bG9hZF09bC5wYXJzZSh1LGMpfWVsc2UiYmluYXJ5Ij09PWMudHlwZXx8Yy5pc1N0cmVhbWluZz9lLmRhdGFbcy5wYXlsb2FkXT11OmUuZGF0YVtzLnBheWxvYWRdPWMudG9UeXBlKHUpfWVsc2V7dmFyIHA9ZS5kYXRhO2kuZXh0cmFjdERhdGEoZSksZS5kYXRhPXIubWVyZ2UocCxlLmRhdGEpfX0sdW5zZXRDb250ZW50TGVuZ3RoOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PXIuZ2V0UmVxdWVzdFBheWxvYWRTaGFwZShlKSYmYy5pbmRleE9mKGUuaHR0cFJlcXVlc3QubWV0aG9kKT49MCYmZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXX19fSx7Ii4uL2pzb24vYnVpbGRlciI6MzcsIi4uL2pzb24vcGFyc2VyIjozOCwiLi4vdXRpbCI6NzQsIi4vanNvbiI6NDgsIi4vcmVzdCI6NTB9XSw1MjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL3V0aWwiKSxpPWUoIi4vcmVzdCIpO3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe2kuYnVpbGRSZXF1ZXN0KGUpLFsiR0VUIiwiSEVBRCJdLmluZGV4T2YoZS5odHRwUmVxdWVzdC5tZXRob2QpPDAmJmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQsbj1uZXcgci5YTUwuQnVpbGRlcixpPWUucGFyYW1zLHM9dC5wYXlsb2FkO2lmKHMpe3ZhciBhPXQubWVtYmVyc1tzXTtpZih2b2lkIDA9PT0oaT1pW3NdKSlyZXR1cm47aWYoInN0cnVjdHVyZSI9PT1hLnR5cGUpe3ZhciBjPWEubmFtZTtlLmh0dHBSZXF1ZXN0LmJvZHk9bi50b1hNTChpLGEsYywhMCl9ZWxzZSBlLmh0dHBSZXF1ZXN0LmJvZHk9aX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT1uLnRvWE1MKGksdCx0Lm5hbWV8fHQuc2hhcGV8fG8uc3RyaW5nLnVwcGVyRmlyc3QoZS5vcGVyYXRpb24pKyJSZXF1ZXN0Iil9KGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ7aS5leHRyYWN0RXJyb3IoZSk7dHJ5e3Q9KG5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKGUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSl9Y2F0Y2gobil7dD17Q29kZTplLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLE1lc3NhZ2U6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZX19dC5FcnJvcnMmJih0PXQuRXJyb3JzKSx0LkVycm9yJiYodD10LkVycm9yKSx0LkNvZGU/ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTp0LkNvZGUsbWVzc2FnZTp0Lk1lc3NhZ2V9KTplLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsbWVzc2FnZTpudWxsfSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0O2kuZXh0cmFjdERhdGEoZSk7dmFyIG49ZS5yZXF1ZXN0LHM9ZS5odHRwUmVzcG9uc2UuYm9keSxhPW4uc2VydmljZS5hcGkub3BlcmF0aW9uc1tuLm9wZXJhdGlvbl0sYz1hLm91dHB1dCx1PShhLmhhc0V2ZW50T3V0cHV0LGMucGF5bG9hZCk7aWYodSl7dmFyIGw9Yy5tZW1iZXJzW3VdO2wuaXNFdmVudFN0cmVhbT8odD1uZXcgci5YTUwuUGFyc2VyLGUuZGF0YVt1XT1vLmNyZWF0ZUV2ZW50U3RyZWFtKDI9PT1yLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/ZS5odHRwUmVzcG9uc2Uuc3RyZWFtOmUuaHR0cFJlc3BvbnNlLmJvZHksdCxsKSk6InN0cnVjdHVyZSI9PT1sLnR5cGU/KHQ9bmV3IHIuWE1MLlBhcnNlcixlLmRhdGFbdV09dC5wYXJzZShzLnRvU3RyaW5nKCksbCkpOiJiaW5hcnkiPT09bC50eXBlfHxsLmlzU3RyZWFtaW5nP2UuZGF0YVt1XT1zOmUuZGF0YVt1XT1sLnRvVHlwZShzKX1lbHNlIGlmKHMubGVuZ3RoPjApe3ZhciBwPSh0PW5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKHMudG9TdHJpbmcoKSxjKTtvLnVwZGF0ZShlLmRhdGEscCl9fX19LHsiLi4vY29yZSI6MTksIi4uL3V0aWwiOjc0LCIuL3Jlc3QiOjUwfV0sNTM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIik7ZnVuY3Rpb24gbygpe31mdW5jdGlvbiBpKGUpe3JldHVybiBlLmlzUXVlcnlOYW1lfHwiZWMyIiE9PWUuYXBpLnByb3RvY29sP2UubmFtZTplLm5hbWVbMF0udG9VcHBlckNhc2UoKStlLm5hbWUuc3Vic3RyKDEpfWZ1bmN0aW9uIHMoZSx0LG4sbyl7ci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24obixyKXt2YXIgcz10W25dO2lmKG51bGwhPXMpe3ZhciBjPWkocik7YShjPWU/ZSsiLiIrYzpjLHMscixvKX19KSl9ZnVuY3Rpb24gYShlLHQsbixvKXtudWxsIT10JiYoInN0cnVjdHVyZSI9PT1uLnR5cGU/cyhlLHQsbixvKToibGlzdCI9PT1uLnR5cGU/ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHM9bi5tZW1iZXJ8fHt9OzAhPT10Lmxlbmd0aD9yLmFycmF5RWFjaCh0LChmdW5jdGlvbih0LHIpe3ZhciBjPSIuIisocisxKTtpZigiZWMyIj09PW4uYXBpLnByb3RvY29sKWMrPSIiO2Vsc2UgaWYobi5mbGF0dGVuZWQpe2lmKHMubmFtZSl7dmFyIHU9ZS5zcGxpdCgiLiIpO3UucG9wKCksdS5wdXNoKGkocykpLGU9dS5qb2luKCIuIil9fWVsc2UgYz0iLiIrKHMubmFtZT9zLm5hbWU6Im1lbWJlciIpK2M7YShlK2MsdCxzLG8pfSkpOm8uY2FsbCh0aGlzLGUsbnVsbCl9KGUsdCxuLG8pOiJtYXAiPT09bi50eXBlP2Z1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPTE7ci5lYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIHM9KG4uZmxhdHRlbmVkPyIuIjoiLmVudHJ5LiIpK2krKysiLiIsYz1zKyhuLmtleS5uYW1lfHwia2V5IiksdT1zKyhuLnZhbHVlLm5hbWV8fCJ2YWx1ZSIpO2EoZStjLHQsbi5rZXksbyksYShlK3UscixuLnZhbHVlLG8pfSkpfShlLHQsbixvKTpvKGUsbi50b1dpcmVGb3JtYXQodCkudG9TdHJpbmcoKSkpfW8ucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbihlLHQsbil7cygiIixlLHQsbil9LHQuZXhwb3J0cz1vfSx7Ii4uL3V0aWwiOjc0fV0sNTQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e25vdzpmdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgcGVyZm9ybWFuY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3coKX19fSx7fV0sNTU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2lzRmlwc1JlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlLnN0YXJ0c1dpdGgoImZpcHMtIil8fGUuZW5kc1dpdGgoIi1maXBzIikpfSxpc0dsb2JhbFJlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJlsiYXdzLWdsb2JhbCIsImF3cy11cy1nb3YtZ2xvYmFsIl0uaW5jbHVkZXMoZSl9LGdldFJlYWxSZWdpb246ZnVuY3Rpb24oZSl7cmV0dXJuWyJmaXBzLWF3cy1nbG9iYWwiLCJhd3MtZmlwcyIsImF3cy1nbG9iYWwiXS5pbmNsdWRlcyhlKT8idXMtZWFzdC0xIjpbImZpcHMtYXdzLXVzLWdvdi1nbG9iYWwiLCJhd3MtdXMtZ292LWdsb2JhbCJdLmluY2x1ZGVzKGUpPyJ1cy1nb3Ytd2VzdC0xIjplLnJlcGxhY2UoL2ZpcHMtKGRrci18cHJvZC0pP3wtZmlwcy8sIiIpfX19LHt9XSw1NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vdXRpbCIpLG89ZSgiLi9yZWdpb25fY29uZmlnX2RhdGEuanNvbiIpO2Z1bmN0aW9uIGkoZSx0KXtyLmVhY2godCwoZnVuY3Rpb24odCxuKXsiZ2xvYmFsRW5kcG9pbnQiIT09dCYmKHZvaWQgMCE9PWUuY29uZmlnW3RdJiZudWxsIT09ZS5jb25maWdbdF18fChlLmNvbmZpZ1t0XT1uKSl9KSl9dC5leHBvcnRzPXtjb25maWd1cmVFbmRwb2ludDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcucmVnaW9uLG49ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7dmFyIHQ9ZS5zcGxpdCgiLSIpO3JldHVybiB0Lmxlbmd0aDwzP251bGw6dC5zbGljZSgwLHQubGVuZ3RoLTIpLmpvaW4oIi0iKSsiLSoifSh0KSxyPWUuYXBpLmVuZHBvaW50UHJlZml4O3JldHVybltbdCxyXSxbbixyXSxbdCwiKiJdLFtuLCIqIl0sWyIqIixyXSxbdCwiaW50ZXJuYWwtKiJdLFsiKiIsIioiXV0ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZVswXSYmZVsxXT9lLmpvaW4oIi8iKTpudWxsfSkpfShlKSxuPWUuY29uZmlnLnVzZUZpcHNFbmRwb2ludCxyPWUuY29uZmlnLnVzZUR1YWxzdGFja0VuZHBvaW50LHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIGE9dFtzXTtpZihhKXt2YXIgYz1uP3I/by5kdWFsc3RhY2tGaXBzUnVsZXM6by5maXBzUnVsZXM6cj9vLmR1YWxzdGFja1J1bGVzOm8ucnVsZXM7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSkpe3ZhciB1PWNbYV07InN0cmluZyI9PXR5cGVvZiB1JiYodT1vLnBhdHRlcm5zW3VdKSxlLmlzR2xvYmFsRW5kcG9pbnQ9ISF1Lmdsb2JhbEVuZHBvaW50LHUuc2lnbmluZ1JlZ2lvbiYmKGUuc2lnbmluZ1JlZ2lvbj11LnNpZ25pbmdSZWdpb24pLHUuc2lnbmF0dXJlVmVyc2lvbnx8KHUuc2lnbmF0dXJlVmVyc2lvbj0idjQiKTt2YXIgbD0iYmVhcmVyIj09PShlLmFwaSYmZS5hcGkuc2lnbmF0dXJlVmVyc2lvbik7cmV0dXJuIHZvaWQgaShlLE9iamVjdC5hc3NpZ24oe30sdSx7c2lnbmF0dXJlVmVyc2lvbjpsPyJiZWFyZXIiOnUuc2lnbmF0dXJlVmVyc2lvbn0pKX19fX0sZ2V0RW5kcG9pbnRTdWZmaXg6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXsiXih1c3xldXxhcHxzYXxjYXxtZSlcXC1cXHcrXFwtXFxkKyQiOiJhbWF6b25hd3MuY29tIiwiXmNuXFwtXFx3K1xcLVxcZCskIjoiYW1hem9uYXdzLmNvbS5jbiIsIl51c1xcLWdvdlxcLVxcdytcXC1cXGQrJCI6ImFtYXpvbmF3cy5jb20iLCJedXNcXC1pc29cXC1cXHcrXFwtXFxkKyQiOiJjMnMuaWMuZ292IiwiXnVzXFwtaXNvYlxcLVxcdytcXC1cXGQrJCI6InNjMnMuc2dvdi5nb3YifSxuPU9iamVjdC5rZXlzKHQpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89UmVnRXhwKG5bcl0pLGk9dFtuW3JdXTtpZihvLnRlc3QoZSkpcmV0dXJuIGl9cmV0dXJuImFtYXpvbmF3cy5jb20ifX19LHsiLi9yZWdpb25fY29uZmlnX2RhdGEuanNvbiI6NTcsIi4vdXRpbCI6NzR9XSw1NzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17cnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sInVzLWlzby0qLyoiOiJ1c0lzbyIsInVzLWlzb2ItKi8qIjoidXNJc29iIiwiKi9idWRnZXRzIjoiZ2xvYmFsU1NMIiwiKi9jbG91ZGZyb250IjoiZ2xvYmFsU1NMIiwiKi9zdHMiOiJnbG9iYWxTU0wiLCIqL2ltcG9ydGV4cG9ydCI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoidjIiLGdsb2JhbEVuZHBvaW50OiEwfSwiKi9yb3V0ZTUzIjoiZ2xvYmFsU1NMIiwiY24tKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tLmNuIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJjbi1ub3J0aHdlc3QtMSJ9LCJ1cy1nb3YtKi9yb3V0ZTUzIjoiZ2xvYmFsR292Q2xvdWQiLCJ1cy1pc28tKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5jMnMuaWMuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc28tZWFzdC0xIn0sInVzLWlzb2ItKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5zYzJzLnNnb3YuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc29iLWVhc3QtMSJ9LCIqL3dhZiI6Imdsb2JhbFNTTCIsIiovaWFtIjoiZ2xvYmFsU1NMIiwiY24tKi9pYW0iOntlbmRwb2ludDoie3NlcnZpY2V9LmNuLW5vcnRoLTEuYW1hem9uYXdzLmNvbS5jbiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoiY24tbm9ydGgtMSJ9LCJ1cy1pc28tKi9pYW0iOntlbmRwb2ludDoie3NlcnZpY2V9LnVzLWlzby1lYXN0LTEuYzJzLmljLmdvdiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtaXNvLWVhc3QtMSJ9LCJ1cy1nb3YtKi9pYW0iOiJnbG9iYWxHb3ZDbG91ZCIsIiovY2UiOntlbmRwb2ludDoie3NlcnZpY2V9LnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1lYXN0LTEifSwiY24tKi9jZSI6e2VuZHBvaW50OiJ7c2VydmljZX0uY24tbm9ydGh3ZXN0LTEuYW1hem9uYXdzLmNvbS5jbiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoiY24tbm9ydGh3ZXN0LTEifSwidXMtZ292LSovc3RzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sInVzLWdvdi13ZXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInVzLXdlc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwidXMtd2VzdC0yL3MzIjoiczNzaWduYXR1cmUiLCJldS13ZXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsImFwLXNvdXRoZWFzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJhcC1zb3V0aGVhc3QtMi9zMyI6InMzc2lnbmF0dXJlIiwiYXAtbm9ydGhlYXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInNhLWVhc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwidXMtZWFzdC0xL3MzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJzMyJ9LCJ1cy1lYXN0LTEvc2RiIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJ2MiJ9LCIqL3NkYiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoidjIifSwiKi9yZXNvdXJjZS1leHBsb3Jlci0yIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9rZW5kcmEtcmFua2luZyI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovaW50ZXJuZXRtb25pdG9yIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9jb2RlY2F0YWx5c3QiOiJnbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQifSxmaXBzUnVsZXM6eyIqLyoiOiJmaXBzU3RhbmRhcmQiLCJ1cy1nb3YtKi8qIjoiZmlwc1N0YW5kYXJkIiwidXMtaXNvLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5jMnMuaWMuZ292In0sInVzLWlzby0qL2RtcyI6InVzSXNvIiwidXMtaXNvYi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uc2Mycy5zZ292LmdvdiJ9LCJ1cy1pc29iLSovZG1zIjoidXNJc29iIiwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSwiKi9hcGkuZWNyIjoiZmlwcy5hcGkuZWNyIiwiKi9hcGkuc2FnZW1ha2VyIjoiZmlwcy5hcGkuc2FnZW1ha2VyIiwiKi9iYXRjaCI6ImZpcHNEb3RQcmVmaXgiLCIqL2VrcyI6ImZpcHNEb3RQcmVmaXgiLCIqL21vZGVscy5sZXgiOiJmaXBzLm1vZGVscy5sZXgiLCIqL3J1bnRpbWUubGV4IjoiZmlwcy5ydW50aW1lLmxleCIsIiovcnVudGltZS5zYWdlbWFrZXIiOntlbmRwb2ludDoicnVudGltZS1maXBzLnNhZ2VtYWtlci57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sIiovaWFtIjoiZmlwc1dpdGhvdXRSZWdpb24iLCIqL3JvdXRlNTMiOiJmaXBzV2l0aG91dFJlZ2lvbiIsIiovdHJhbnNjcmliZSI6ImZpcHNEb3RQcmVmaXgiLCIqL3dhZiI6ImZpcHNXaXRob3V0UmVnaW9uIiwidXMtZ292LSovdHJhbnNjcmliZSI6ImZpcHNEb3RQcmVmaXgiLCJ1cy1nb3YtKi9hcGkuZWNyIjoiZmlwcy5hcGkuZWNyIiwidXMtZ292LSovYXBpLnNhZ2VtYWtlciI6ImZpcHMuYXBpLnNhZ2VtYWtlciIsInVzLWdvdi0qL21vZGVscy5sZXgiOiJmaXBzLm1vZGVscy5sZXgiLCJ1cy1nb3YtKi9ydW50aW1lLmxleCI6ImZpcHMucnVudGltZS5sZXgiLCJ1cy1nb3YtKi9hY20tcGNhIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2JhdGNoIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2Nsb3VkZm9ybWF0aW9uIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2NvbmZpZyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9la3MiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZWxhc3RpY21hcHJlZHVjZSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9pZGVudGl0eXN0b3JlIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2R5bmFtb2RiIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2VsYXN0aWNsb2FkYmFsYW5jaW5nIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2d1YXJkZHV0eSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9tb25pdG9yaW5nIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3Jlc291cmNlLWdyb3VwcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9ydW50aW1lLnNhZ2VtYWtlciI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zZXJ2aWNlY2F0YWxvZy1hcHByZWdpc3RyeSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zZXJ2aWNlcXVvdGFzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3NzbSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zdHMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc3VwcG9ydCI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3Ytd2VzdC0xL3N0YXRlcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1pc28tZWFzdC0xL2VsYXN0aWNmaWxlc3lzdGVtIjp7ZW5kcG9pbnQ6ImVsYXN0aWNmaWxlc3lzdGVtLWZpcHMue3JlZ2lvbn0uYzJzLmljLmdvdiJ9LCJ1cy1nb3Ytd2VzdC0xL29yZ2FuaXphdGlvbnMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LXdlc3QtMS9yb3V0ZTUzIjp7ZW5kcG9pbnQ6InJvdXRlNTMudXMtZ292LmFtYXpvbmF3cy5jb20ifSwiKi9yZXNvdXJjZS1leHBsb3Jlci0yIjoiZmlwc0R1YWxzdGFja0J5RGVmYXVsdCIsIiova2VuZHJhLXJhbmtpbmciOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2ludGVybmV0bW9uaXRvciI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovY29kZWNhdGFseXN0IjoiZmlwc0dsb2JhbER1YWxzdGFja0J5RGVmYXVsdCJ9LGR1YWxzdGFja1J1bGVzOnsiKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hcGkuYXdzIn0sImNuLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYXBpLmFtYXpvbndlYnNlcnZpY2VzLmNvbS5jbiJ9LCIqL3MzIjoiZHVhbHN0YWNrTGVnYWN5IiwiY24tKi9zMyI6ImR1YWxzdGFja0xlZ2FjeUNuIiwiKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrTGVnYWN5IiwiY24tKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrTGVnYWN5Q24iLCJhcC1zb3V0aC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsImV1LXdlc3QtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJzYS1lYXN0LTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwidXMtZWFzdC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInVzLWVhc3QtMi9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJ1cy13ZXN0LTIvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIn0sZHVhbHN0YWNrRmlwc1J1bGVzOnsiKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFwaS5hd3MifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFwaS5hbWF6b253ZWJzZXJ2aWNlcy5jb20uY24ifSwiKi9zMyI6ImR1YWxzdGFja0ZpcHNMZWdhY3kiLCJjbi0qL3MzIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeUNuIiwiKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeSIsImNuLSovczMtY29udHJvbCI6ImR1YWxzdGFja0ZpcHNMZWdhY3lDbiJ9LHBhdHRlcm5zOntnbG9iYWxTU0w6e2VuZHBvaW50OiJodHRwczovL3tzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1lYXN0LTEifSxnbG9iYWxHb3ZDbG91ZDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS51cy1nb3YuYW1hem9uYXdzLmNvbSIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtZ292LXdlc3QtMSJ9LHMzc2lnbmF0dXJlOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InMzIn0sdXNJc286e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYzJzLmljLmdvdiJ9LHVzSXNvYjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5zYzJzLnNnb3YuZ292In0sZmlwc1N0YW5kYXJkOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGZpcHNEb3RQcmVmaXg6e2VuZHBvaW50OiJmaXBzLntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZmlwc1dpdGhvdXRSZWdpb246e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5hbWF6b25hd3MuY29tIn0sImZpcHMuYXBpLmVjciI6e2VuZHBvaW50OiJlY3ItZmlwcy57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImZpcHMuYXBpLnNhZ2VtYWtlciI6e2VuZHBvaW50OiJhcGktZmlwcy5zYWdlbWFrZXIue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJmaXBzLm1vZGVscy5sZXgiOntlbmRwb2ludDoibW9kZWxzLWZpcHMubGV4LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiZmlwcy5ydW50aW1lLmxleCI6e2VuZHBvaW50OiJydW50aW1lLWZpcHMubGV4LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxmaXBzV2l0aFNlcnZpY2VPbmx5OntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxkdWFsc3RhY2tMZWdhY3k6e2VuZHBvaW50OiJ7c2VydmljZX0uZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxkdWFsc3RhY2tMZWdhY3lDbjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LGR1YWxzdGFja0ZpcHNMZWdhY3k6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGR1YWxzdGFja0ZpcHNMZWdhY3lDbjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sZHVhbHN0YWNrTGVnYWN5RWMyOntlbmRwb2ludDoiYXBpLmVjMi57cmVnaW9ufS5hd3MifSxkdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYXBpLmF3cyJ9LGZpcHNEdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hcGkuYXdzIn0sZ2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9Lmdsb2JhbC5hcGkuYXdzIn0sZmlwc0dsb2JhbER1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmdsb2JhbC5hcGkuYXdzIn19fX0se31dLDU4OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQpeyhmdW5jdGlvbigpe3ZhciBuPWUoIi4vY29yZSIpLHI9ZSgiLi9zdGF0ZV9tYWNoaW5lIiksbz1uLnV0aWwuaW5oZXJpdCxpPW4udXRpbC5kb21haW4scz1lKCJqbWVzcGF0aCIpLGE9e3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9LGM9bmV3IHI7Yy5zZXR1cFN0YXRlcz1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztuLl9oYWx0SGFuZGxlcnNPbkVycm9yPSExLG4uZW1pdChuLl9hc20uY3VycmVudFN0YXRlLChmdW5jdGlvbihlKXtpZihlKWlmKHI9bixPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxyLl9hc20uY3VycmVudFN0YXRlKSl7aWYoIShpJiZuLmRvbWFpbiBpbnN0YW5jZW9mIGkuRG9tYWluKSl0aHJvdyBlO2UuZG9tYWluRW1pdHRlcj1uLGUuZG9tYWluPW4uZG9tYWluLGUuZG9tYWluVGhyb3duPSExLG4uZG9tYWluLmVtaXQoImVycm9yIixlKX1lbHNlIG4ucmVzcG9uc2UuZXJyb3I9ZSx0KGUpO2Vsc2UgdChuLnJlc3BvbnNlLmVycm9yKTt2YXIgcn0pKX07dGhpcy5hZGRTdGF0ZSgidmFsaWRhdGUiLCJidWlsZCIsImVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJidWlsZCIsImFmdGVyQnVpbGQiLCJyZXN0YXJ0IixlKSx0aGlzLmFkZFN0YXRlKCJhZnRlckJ1aWxkIiwic2lnbiIsInJlc3RhcnQiLGUpLHRoaXMuYWRkU3RhdGUoInNpZ24iLCJzZW5kIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoInJldHJ5IiwiYWZ0ZXJSZXRyeSIsImFmdGVyUmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoImFmdGVyUmV0cnkiLCJzaWduIiwiZXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoInNlbmQiLCJ2YWxpZGF0ZVJlc3BvbnNlIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoInZhbGlkYXRlUmVzcG9uc2UiLCJleHRyYWN0RGF0YSIsImV4dHJhY3RFcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgiZXh0cmFjdEVycm9yIiwiZXh0cmFjdERhdGEiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgiZXh0cmFjdERhdGEiLCJzdWNjZXNzIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoInJlc3RhcnQiLCJidWlsZCIsImVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJzdWNjZXNzIiwiY29tcGxldGUiLCJjb21wbGV0ZSIsZSksdGhpcy5hZGRTdGF0ZSgiZXJyb3IiLCJjb21wbGV0ZSIsImNvbXBsZXRlIixlKSx0aGlzLmFkZFN0YXRlKCJjb21wbGV0ZSIsbnVsbCxudWxsLGUpfSxjLnNldHVwU3RhdGVzKCksbi5SZXF1ZXN0PW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxvKXt2YXIgcz1lLmVuZHBvaW50LGE9ZS5jb25maWcucmVnaW9uLHU9ZS5jb25maWcuY3VzdG9tVXNlckFnZW50O2Uuc2lnbmluZ1JlZ2lvbj9hPWUuc2lnbmluZ1JlZ2lvbjplLmlzR2xvYmFsRW5kcG9pbnQmJihhPSJ1cy1lYXN0LTEiKSx0aGlzLmRvbWFpbj1pJiZpLmFjdGl2ZSx0aGlzLnNlcnZpY2U9ZSx0aGlzLm9wZXJhdGlvbj10LHRoaXMucGFyYW1zPW98fHt9LHRoaXMuaHR0cFJlcXVlc3Q9bmV3IG4uSHR0cFJlcXVlc3QocyxhKSx0aGlzLmh0dHBSZXF1ZXN0LmFwcGVuZFRvVXNlckFnZW50KHUpLHRoaXMuc3RhcnRUaW1lPWUuZ2V0U2tld0NvcnJlY3RlZERhdGUoKSx0aGlzLnJlc3BvbnNlPW5ldyBuLlJlc3BvbnNlKHRoaXMpLHRoaXMuX2FzbT1uZXcgcihjLnN0YXRlcywidmFsaWRhdGUiKSx0aGlzLl9oYWx0SGFuZGxlcnNPbkVycm9yPSExLG4uU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwodGhpcyksdGhpcy5lbWl0PXRoaXMuZW1pdEV2ZW50fSxzZW5kOmZ1bmN0aW9uKGUpe3JldHVybiBlJiYodGhpcy5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCgiY2FsbGJhY2siKSx0aGlzLm9uKCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe2UuY2FsbCh0LHQuZXJyb3IsdC5kYXRhKX0pKSksdGhpcy5ydW5UbygpLHRoaXMucmVzcG9uc2V9LGJ1aWxkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJ1blRvKCJzZW5kIixlKX0scnVuVG86ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fYXNtLnJ1blRvKGUsdCx0aGlzKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygidmFsaWRhdGVSZXNwb25zZSIpLHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJleHRyYWN0RXJyb3IiKSx0aGlzLm9uKCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oZSl7ZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yKCJSZXF1ZXN0IGFib3J0ZWQgYnkgdXNlciIpLHtjb2RlOiJSZXF1ZXN0QWJvcnRlZEVycm9yIixyZXRyeWFibGU6ITF9KX0pKSx0aGlzLmh0dHBSZXF1ZXN0LnN0cmVhbSYmIXRoaXMuaHR0cFJlcXVlc3Quc3RyZWFtLmRpZENhbGxiYWNrJiYodGhpcy5odHRwUmVxdWVzdC5zdHJlYW0uYWJvcnQoKSx0aGlzLmh0dHBSZXF1ZXN0Ll9hYm9ydENhbGxiYWNrP3RoaXMuaHR0cFJlcXVlc3QuX2Fib3J0Q2FsbGJhY2soKTp0aGlzLnJlbW92ZUFsbExpc3RlbmVycygic2VuZCIpKSx0aGlzfSxlYWNoUGFnZTpmdW5jdGlvbihlKXtlPW4udXRpbC5mbi5tYWtlQXN5bmMoZSwzKSx0aGlzLm9uKCJjb21wbGV0ZSIsKGZ1bmN0aW9uIHQocil7ZS5jYWxsKHIsci5lcnJvcixyLmRhdGEsKGZ1bmN0aW9uKG8peyExIT09byYmKHIuaGFzTmV4dFBhZ2UoKT9yLm5leHRQYWdlKCkub24oImNvbXBsZXRlIix0KS5zZW5kKCk6ZS5jYWxsKHIsbnVsbCxudWxsLG4udXRpbC5mbi5ub29wKSl9KSl9KSkuc2VuZCgpfSxlYWNoSXRlbTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuZWFjaFBhZ2UoKGZ1bmN0aW9uKHIsbyl7aWYocilyZXR1cm4gZShyLG51bGwpO2lmKG51bGw9PT1vKXJldHVybiBlKG51bGwsbnVsbCk7dmFyIGk9dC5zZXJ2aWNlLnBhZ2luYXRpb25Db25maWcodC5vcGVyYXRpb24pLnJlc3VsdEtleTtBcnJheS5pc0FycmF5KGkpJiYoaT1pWzBdKTt2YXIgYT1zLnNlYXJjaChvLGkpLGM9ITA7cmV0dXJuIG4udXRpbC5hcnJheUVhY2goYSwoZnVuY3Rpb24odCl7aWYoITE9PT0oYz1lKG51bGwsdCkpKXJldHVybiBuLnV0aWwuYWJvcnR9KSksY30pKX0saXNQYWdlYWJsZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5zZXJ2aWNlLnBhZ2luYXRpb25Db25maWcodGhpcy5vcGVyYXRpb24pfSxjcmVhdGVSZWFkU3RyZWFtOmZ1bmN0aW9uKCl7dmFyIGU9bi51dGlsLnN0cmVhbSxyPXRoaXMsbz1udWxsO3JldHVybiAyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uPyhvPW5ldyBlLlBhc3NUaHJvdWdoLHQubmV4dFRpY2soKGZ1bmN0aW9uKCl7ci5zZW5kKCl9KSkpOigobz1uZXcgZS5TdHJlYW0pLnJlYWRhYmxlPSEwLG8uc2VudD0hMSxvLm9uKCJuZXdMaXN0ZW5lciIsKGZ1bmN0aW9uKGUpe28uc2VudHx8ImRhdGEiIT09ZXx8KG8uc2VudD0hMCx0Lm5leHRUaWNrKChmdW5jdGlvbigpe3Iuc2VuZCgpfSkpKX0pKSksdGhpcy5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtvLmVtaXQoImVycm9yIixlKX0pKSx0aGlzLm9uKCJodHRwSGVhZGVycyIsKGZ1bmN0aW9uKHQsaSxzKXtpZih0PDMwMCl7ci5yZW1vdmVMaXN0ZW5lcigiaHR0cERhdGEiLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5IVFRQX0RBVEEpLHIucmVtb3ZlTGlzdGVuZXIoImh0dHBFcnJvciIsbi5FdmVudExpc3RlbmVycy5Db3JlLkhUVFBfRVJST1IpLHIub24oImh0dHBFcnJvciIsKGZ1bmN0aW9uKGUpe3MuZXJyb3I9ZSxzLmVycm9yLnJldHJ5YWJsZT0hMX0pKTt2YXIgYSxjPSExO2lmKCJIRUFEIiE9PXIuaHR0cFJlcXVlc3QubWV0aG9kJiYoYT1wYXJzZUludChpWyJjb250ZW50LWxlbmd0aCJdLDEwKSksdm9pZCAwIT09YSYmIWlzTmFOKGEpJiZhPj0wKXtjPSEwO3ZhciB1PTB9dmFyIGw9ZnVuY3Rpb24oKXtjJiZ1IT09YT9vLmVtaXQoImVycm9yIixuLnV0aWwuZXJyb3IobmV3IEVycm9yKCJTdHJlYW0gY29udGVudCBsZW5ndGggbWlzbWF0Y2guIFJlY2VpdmVkICIrdSsiIG9mICIrYSsiIGJ5dGVzLiIpLHtjb2RlOiJTdHJlYW1Db250ZW50TGVuZ3RoTWlzbWF0Y2gifSkpOjI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/by5lbmQoKTpvLmVtaXQoImVuZCIpfSxwPXMuaHR0cFJlc3BvbnNlLmNyZWF0ZVVuYnVmZmVyZWRTdHJlYW0oKTtpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uKWlmKGMpe3ZhciBkPW5ldyBlLlBhc3NUaHJvdWdoO2QuX3dyaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aCYmKHUrPXQubGVuZ3RoKSxlLlBhc3NUaHJvdWdoLnByb3RvdHlwZS5fd3JpdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxkLm9uKCJlbmQiLGwpLG8ub24oImVycm9yIiwoZnVuY3Rpb24oZSl7Yz0hMSxwLnVucGlwZShkKSxkLmVtaXQoImVuZCIpLGQuZW5kKCl9KSkscC5waXBlKGQpLnBpcGUobyx7ZW5kOiExfSl9ZWxzZSBwLnBpcGUobyk7ZWxzZSBjJiZwLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7ZSYmZS5sZW5ndGgmJih1Kz1lLmxlbmd0aCl9KSkscC5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe28uZW1pdCgiZGF0YSIsZSl9KSkscC5vbigiZW5kIixsKTtwLm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe2M9ITEsby5lbWl0KCJlcnJvciIsZSl9KSl9fSkpLG99LGVtaXRFdmVudDpmdW5jdGlvbihlLHQscil7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihyPXQsdD1udWxsKSxyfHwocj1mdW5jdGlvbigpe30pLHR8fCh0PXRoaXMuZXZlbnRQYXJhbWV0ZXJzKGUsdGhpcy5yZXNwb25zZSkpLG4uU2VxdWVudGlhbEV4ZWN1dG9yLnByb3RvdHlwZS5lbWl0LmNhbGwodGhpcyxlLHQsKGZ1bmN0aW9uKGUpe2UmJih0aGlzLnJlc3BvbnNlLmVycm9yPWUpLHIuY2FsbCh0aGlzLGUpfSkpfSxldmVudFBhcmFtZXRlcnM6ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UicmVzdGFydCI6Y2FzZSJ2YWxpZGF0ZSI6Y2FzZSJzaWduIjpjYXNlImJ1aWxkIjpjYXNlImFmdGVyVmFsaWRhdGUiOmNhc2UiYWZ0ZXJCdWlsZCI6cmV0dXJuW3RoaXNdO2Nhc2UiZXJyb3IiOnJldHVyblt0aGlzLnJlc3BvbnNlLmVycm9yLHRoaXMucmVzcG9uc2VdO2RlZmF1bHQ6cmV0dXJuW3RoaXMucmVzcG9uc2VdfX0scHJlc2lnbjpmdW5jdGlvbihlLHQpe3JldHVybiB0fHwiZnVuY3Rpb24iIT10eXBlb2YgZXx8KHQ9ZSxlPW51bGwpLChuZXcgbi5TaWduZXJzLlByZXNpZ24pLnNpZ24odGhpcy50b0dldCgpLGUsdCl9LGlzUHJlc2lnbmVkOmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmh0dHBSZXF1ZXN0LmhlYWRlcnMsInByZXNpZ25lZC1leHBpcmVzIil9LHRvVW5hdXRoZW50aWNhdGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VuQXV0aGVudGljYXRlZD0hMCx0aGlzLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsbi5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX0NSRURFTlRJQUxTKSx0aGlzLnJlbW92ZUxpc3RlbmVyKCJzaWduIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuU0lHTiksdGhpc30sdG9HZXQ6ZnVuY3Rpb24oKXtyZXR1cm4icXVlcnkiIT09dGhpcy5zZXJ2aWNlLmFwaS5wcm90b2NvbCYmImVjMiIhPT10aGlzLnNlcnZpY2UuYXBpLnByb3RvY29sfHwodGhpcy5yZW1vdmVMaXN0ZW5lcigiYnVpbGQiLHRoaXMuYnVpbGRBc0dldCksdGhpcy5hZGRMaXN0ZW5lcigiYnVpbGQiLHRoaXMuYnVpbGRBc0dldCkpLHRoaXN9LGJ1aWxkQXNHZXQ6ZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5tZXRob2Q9IkdFVCIsZS5odHRwUmVxdWVzdC5wYXRoPWUuc2VydmljZS5lbmRwb2ludC5wYXRoKyI/IitlLmh0dHBSZXF1ZXN0LmJvZHksZS5odHRwUmVxdWVzdC5ib2R5PSIiLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0sZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl19LGhhbHRIYW5kbGVyc09uRXJyb3I6ZnVuY3Rpb24oKXt0aGlzLl9oYWx0SGFuZGxlcnNPbkVycm9yPSEwfX0pLG4uUmVxdWVzdC5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUucHJvbWlzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQoInByb21pc2UiKSxuZXcgZSgoZnVuY3Rpb24oZSxuKXt0Lm9uKCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe3QuZXJyb3I/bih0LmVycm9yKTplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LmRhdGF8fHt9LCIkcmVzcG9uc2UiLHt2YWx1ZTp0fSkpfSkpLHQucnVuVG8oKX0pKX19LG4uUmVxdWVzdC5kZWxldGVQcm9taXNlc0Zyb21DbGFzcz1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByb3RvdHlwZS5wcm9taXNlfSxuLnV0aWwuYWRkUHJvbWlzZXMobi5SZXF1ZXN0KSxuLnV0aWwubWl4aW4obi5SZXF1ZXN0LG4uU2VxdWVudGlhbEV4ZWN1dG9yKX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9zdGF0ZV9tYWNoaW5lIjo3MyxfcHJvY2Vzczo5MSxqbWVzcGF0aDo5MH1dLDU5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdCxpPWUoImptZXNwYXRoIik7ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnJlcXVlc3QuX3dhaXRlcixuPXQuY29uZmlnLmFjY2VwdG9ycyxyPSExLG89InJldHJ5IjtuLmZvckVhY2goKGZ1bmN0aW9uKG4pe2lmKCFyKXt2YXIgaT10Lm1hdGNoZXJzW24ubWF0Y2hlcl07aSYmaShlLG4uZXhwZWN0ZWQsbi5hcmd1bWVudCkmJihyPSEwLG89bi5zdGF0ZSl9fSkpLCFyJiZlLmVycm9yJiYobz0iZmFpbHVyZSIpLCJzdWNjZXNzIj09PW8/dC5zZXRTdWNjZXNzKGUpOnQuc2V0RXJyb3IoZSwicmV0cnkiPT09byl9ci5SZXNvdXJjZVdhaXRlcj1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3RoaXMuc2VydmljZT1lLHRoaXMuc3RhdGU9dCx0aGlzLmxvYWRXYWl0ZXJDb25maWcodGhpcy5zdGF0ZSl9LHNlcnZpY2U6bnVsbCxzdGF0ZTpudWxsLGNvbmZpZzpudWxsLG1hdGNoZXJzOntwYXRoOmZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5zZWFyY2goZS5kYXRhLG4pfWNhdGNoKGUpe3JldHVybiExfXJldHVybiBpLnN0cmljdERlZXBFcXVhbChyLHQpfSxwYXRoQWxsOmZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5zZWFyY2goZS5kYXRhLG4pfWNhdGNoKGUpe3JldHVybiExfUFycmF5LmlzQXJyYXkocil8fChyPVtyXSk7dmFyIG89ci5sZW5ndGg7aWYoIW8pcmV0dXJuITE7Zm9yKHZhciBzPTA7czxvO3MrKylpZighaS5zdHJpY3REZWVwRXF1YWwocltzXSx0KSlyZXR1cm4hMTtyZXR1cm4hMH0scGF0aEFueTpmdW5jdGlvbihlLHQsbil7dHJ5e3ZhciByPWkuc2VhcmNoKGUuZGF0YSxuKX1jYXRjaChlKXtyZXR1cm4hMX1BcnJheS5pc0FycmF5KHIpfHwocj1bcl0pO2Zvcih2YXIgbz1yLmxlbmd0aCxzPTA7czxvO3MrKylpZihpLnN0cmljdERlZXBFcXVhbChyW3NdLHQpKXJldHVybiEwO3JldHVybiExfSxzdGF0dXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlO3JldHVybiJudW1iZXIiPT10eXBlb2YgbiYmbj09PXR9LGVycm9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZlLmVycm9yP3Q9PT1lLmVycm9yLmNvZGU6dD09PSEhZS5lcnJvcn19LGxpc3RlbmVyczoobmV3IHIuU2VxdWVudGlhbEV4ZWN1dG9yKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSl7ZSgiUkVUUllfQ0hFQ0siLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdC5fd2FpdGVyO2UuZXJyb3ImJiJSZXNvdXJjZU5vdFJlYWR5Ij09PWUuZXJyb3IuY29kZSYmKGUuZXJyb3IucmV0cnlEZWxheT0xZTMqKHQuY29uZmlnLmRlbGF5fHwwKSl9KSksZSgiQ0hFQ0tfT1VUUFVUIiwiZXh0cmFjdERhdGEiLHMpLGUoIkNIRUNLX0VSUk9SIiwiZXh0cmFjdEVycm9yIixzKX0pKSx3YWl0OmZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGUmJmUuJHdhaXRlciYmKCJudW1iZXIiPT10eXBlb2YoZT1yLnV0aWwuY29weShlKSkuJHdhaXRlci5kZWxheSYmKHRoaXMuY29uZmlnLmRlbGF5PWUuJHdhaXRlci5kZWxheSksIm51bWJlciI9PXR5cGVvZiBlLiR3YWl0ZXIubWF4QXR0ZW1wdHMmJih0aGlzLmNvbmZpZy5tYXhBdHRlbXB0cz1lLiR3YWl0ZXIubWF4QXR0ZW1wdHMpLGRlbGV0ZSBlLiR3YWl0ZXIpO3ZhciBuPXRoaXMuc2VydmljZS5tYWtlUmVxdWVzdCh0aGlzLmNvbmZpZy5vcGVyYXRpb24sZSk7cmV0dXJuIG4uX3dhaXRlcj10aGlzLG4ucmVzcG9uc2UubWF4UmV0cmllcz10aGlzLmNvbmZpZy5tYXhBdHRlbXB0cyxuLmFkZExpc3RlbmVycyh0aGlzLmxpc3RlbmVycyksdCYmbi5zZW5kKHQpLG59LHNldFN1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZS5lcnJvcj1udWxsLGUuZGF0YT1lLmRhdGF8fHt9LGUucmVxdWVzdC5yZW1vdmVBbGxMaXN0ZW5lcnMoImV4dHJhY3REYXRhIil9LHNldEVycm9yOmZ1bmN0aW9uKGUsdCl7ZS5kYXRhPW51bGwsZS5lcnJvcj1yLnV0aWwuZXJyb3IoZS5lcnJvcnx8bmV3IEVycm9yLHtjb2RlOiJSZXNvdXJjZU5vdFJlYWR5IixtZXNzYWdlOiJSZXNvdXJjZSBpcyBub3QgaW4gdGhlIHN0YXRlICIrdGhpcy5zdGF0ZSxyZXRyeWFibGU6dH0pfSxsb2FkV2FpdGVyQ29uZmlnOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNlcnZpY2UuYXBpLndhaXRlcnNbZV0pdGhyb3cgbmV3IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlN0YXRlTm90Rm91bmRFcnJvciIsbWVzc2FnZToiU3RhdGUgIitlKyIgbm90IGZvdW5kLiJ9KTt0aGlzLmNvbmZpZz1yLnV0aWwuY29weSh0aGlzLnNlcnZpY2UuYXBpLndhaXRlcnNbZV0pfX0pfSx7Ii4vY29yZSI6MTksam1lc3BhdGg6OTB9XSw2MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQsaT1lKCJqbWVzcGF0aCIpO3IuUmVzcG9uc2U9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0PWUsdGhpcy5kYXRhPW51bGwsdGhpcy5lcnJvcj1udWxsLHRoaXMucmV0cnlDb3VudD0wLHRoaXMucmVkaXJlY3RDb3VudD0wLHRoaXMuaHR0cFJlc3BvbnNlPW5ldyByLkh0dHBSZXNwb25zZSxlJiYodGhpcy5tYXhSZXRyaWVzPWUuc2VydmljZS5udW1SZXRyaWVzKCksdGhpcy5tYXhSZWRpcmVjdHM9ZS5zZXJ2aWNlLmNvbmZpZy5tYXhSZWRpcmVjdHMpfSxuZXh0UGFnZTpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMucmVxdWVzdC5zZXJ2aWNlLG89dGhpcy5yZXF1ZXN0Lm9wZXJhdGlvbjt0cnl7dD1uLnBhZ2luYXRpb25Db25maWcobywhMCl9Y2F0Y2goZSl7dGhpcy5lcnJvcj1lfWlmKCF0aGlzLmhhc05leHRQYWdlKCkpe2lmKGUpZSh0aGlzLmVycm9yLG51bGwpO2Vsc2UgaWYodGhpcy5lcnJvcil0aHJvdyB0aGlzLmVycm9yO3JldHVybiBudWxsfXZhciBpPXIudXRpbC5jb3B5KHRoaXMucmVxdWVzdC5wYXJhbXMpO2lmKHRoaXMubmV4dFBhZ2VUb2tlbnMpe3ZhciBzPXQuaW5wdXRUb2tlbjsic3RyaW5nIj09dHlwZW9mIHMmJihzPVtzXSk7Zm9yKHZhciBhPTA7YTxzLmxlbmd0aDthKyspaVtzW2FdXT10aGlzLm5leHRQYWdlVG9rZW5zW2FdO3JldHVybiBuLm1ha2VSZXF1ZXN0KHRoaXMucmVxdWVzdC5vcGVyYXRpb24saSxlKX1yZXR1cm4gZT9lKG51bGwsbnVsbCk6bnVsbH0saGFzTmV4dFBhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYWNoZU5leHRQYWdlVG9rZW5zKCksISF0aGlzLm5leHRQYWdlVG9rZW5zfHx2b2lkIDA9PT10aGlzLm5leHRQYWdlVG9rZW5zJiZ2b2lkIDB9LGNhY2hlTmV4dFBhZ2VUb2tlbnM6ZnVuY3Rpb24oKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywibmV4dFBhZ2VUb2tlbnMiKSlyZXR1cm4gdGhpcy5uZXh0UGFnZVRva2Vuczt0aGlzLm5leHRQYWdlVG9rZW5zPXZvaWQgMDt2YXIgZT10aGlzLnJlcXVlc3Quc2VydmljZS5wYWdpbmF0aW9uQ29uZmlnKHRoaXMucmVxdWVzdC5vcGVyYXRpb24pO2lmKCFlKXJldHVybiB0aGlzLm5leHRQYWdlVG9rZW5zO2lmKHRoaXMubmV4dFBhZ2VUb2tlbnM9bnVsbCxlLm1vcmVSZXN1bHRzJiYhaS5zZWFyY2godGhpcy5kYXRhLGUubW9yZVJlc3VsdHMpKXJldHVybiB0aGlzLm5leHRQYWdlVG9rZW5zO3ZhciB0PWUub3V0cHV0VG9rZW47cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHIudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLHQsKGZ1bmN0aW9uKGUpe3ZhciB0PWkuc2VhcmNoKHRoaXMuZGF0YSxlKTt0JiYodGhpcy5uZXh0UGFnZVRva2Vucz10aGlzLm5leHRQYWdlVG9rZW5zfHxbXSx0aGlzLm5leHRQYWdlVG9rZW5zLnB1c2godCkpfSkpLHRoaXMubmV4dFBhZ2VUb2tlbnN9fSl9LHsiLi9jb3JlIjoxOSxqbWVzcGF0aDo5MH1dLDYxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIik7ci5TZXF1ZW50aWFsRXhlY3V0b3I9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnRzPXt9fSxsaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2V2ZW50c1tlXT90aGlzLl9ldmVudHNbZV0uc2xpY2UoMCk6W119LG9uOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fZXZlbnRzW2VdP24/dGhpcy5fZXZlbnRzW2VdLnVuc2hpZnQodCk6dGhpcy5fZXZlbnRzW2VdLnB1c2godCk6dGhpcy5fZXZlbnRzW2VdPVt0XSx0aGlzfSxvbkFzeW5jOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdC5faXNBc3luYz0hMCx0aGlzLm9uKGUsdCxuKX0scmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9ldmVudHNbZV07aWYobil7Zm9yKHZhciByPW4ubGVuZ3RoLG89LTEsaT0wO2k8cjsrK2kpbltpXT09PXQmJihvPWkpO28+LTEmJm4uc3BsaWNlKG8sMSl9cmV0dXJuIHRoaXN9LHJlbW92ZUFsbExpc3RlbmVyczpmdW5jdGlvbihlKXtyZXR1cm4gZT9kZWxldGUgdGhpcy5fZXZlbnRzW2VdOnRoaXMuX2V2ZW50cz17fSx0aGlzfSxlbWl0OmZ1bmN0aW9uKGUsdCxuKXtufHwobj1mdW5jdGlvbigpe30pO3ZhciByPXRoaXMubGlzdGVuZXJzKGUpLG89ci5sZW5ndGg7cmV0dXJuIHRoaXMuY2FsbExpc3RlbmVycyhyLHQsbiksbz4wfSxjYWxsTGlzdGVuZXJzOmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPXRoaXMscz1vfHxudWxsO2Z1bmN0aW9uIGEobyl7aWYobyYmKHM9ci51dGlsLmVycm9yKHN8fG5ldyBFcnJvcixvKSxpLl9oYWx0SGFuZGxlcnNPbkVycm9yKSlyZXR1cm4gbi5jYWxsKGkscyk7aS5jYWxsTGlzdGVuZXJzKGUsdCxuLHMpfWZvcig7ZS5sZW5ndGg+MDspe3ZhciBjPWUuc2hpZnQoKTtpZihjLl9pc0FzeW5jKXJldHVybiB2b2lkIGMuYXBwbHkoaSx0LmNvbmNhdChbYV0pKTt0cnl7Yy5hcHBseShpLHQpfWNhdGNoKGUpe3M9ci51dGlsLmVycm9yKHN8fG5ldyBFcnJvcixlKX1pZihzJiZpLl9oYWx0SGFuZGxlcnNPbkVycm9yKXJldHVybiB2b2lkIG4uY2FsbChpLHMpfW4uY2FsbChpLHMpfSxhZGRMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZS5fZXZlbnRzJiYoZT1lLl9ldmVudHMpLHIudXRpbC5lYWNoKGUsKGZ1bmN0aW9uKGUsbil7ImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPVtuXSksci51dGlsLmFycmF5RWFjaChuLChmdW5jdGlvbihuKXt0Lm9uKGUsbil9KSl9KSksdH0sYWRkTmFtZWRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpc1tlXT1uLHRoaXMuYWRkTGlzdGVuZXIodCxuLHIpLHRoaXN9LGFkZE5hbWVkQXN5bmNMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbi5faXNBc3luYz0hMCx0aGlzLmFkZE5hbWVkTGlzdGVuZXIoZSx0LG4scil9LGFkZE5hbWVkTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoKGZ1bmN0aW9uKCl7dC5hZGROYW1lZExpc3RlbmVyLmFwcGx5KHQsYXJndW1lbnRzKX0pLChmdW5jdGlvbigpe3QuYWRkTmFtZWRBc3luY0xpc3RlbmVyLmFwcGx5KHQsYXJndW1lbnRzKX0pKSx0aGlzfX0pLHIuU2VxdWVudGlhbEV4ZWN1dG9yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1yLlNlcXVlbnRpYWxFeGVjdXRvci5wcm90b3R5cGUub24sdC5leHBvcnRzPXIuU2VxdWVudGlhbEV4ZWN1dG9yfSx7Ii4vY29yZSI6MTl9XSw2MjpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgcj1lKCIuL2NvcmUiKSxvPWUoIi4vbW9kZWwvYXBpIiksaT1lKCIuL3JlZ2lvbl9jb25maWciKSxzPXIudXRpbC5pbmhlcml0LGE9MCxjPWUoIi4vcmVnaW9uL3V0aWxzIik7ci5TZXJ2aWNlPXMoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmxvYWRTZXJ2aWNlQ2xhc3MpdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvciwiU2VydmljZSBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggYG5ldycgb3BlcmF0b3IiKTtpZihlKXtpZihlLnJlZ2lvbil7dmFyIHQ9ZS5yZWdpb247Yy5pc0ZpcHNSZWdpb24odCkmJihlLnJlZ2lvbj1jLmdldFJlYWxSZWdpb24odCksZS51c2VGaXBzRW5kcG9pbnQ9ITApLGMuaXNHbG9iYWxSZWdpb24odCkmJihlLnJlZ2lvbj1jLmdldFJlYWxSZWdpb24odCkpfSJib29sZWFuIj09dHlwZW9mIGUudXNlRHVhbHN0YWNrJiYiYm9vbGVhbiIhPXR5cGVvZiBlLnVzZUR1YWxzdGFja0VuZHBvaW50JiYoZS51c2VEdWFsc3RhY2tFbmRwb2ludD1lLnVzZUR1YWxzdGFjayl9dmFyIG49dGhpcy5sb2FkU2VydmljZUNsYXNzKGV8fHt9KTtpZihuKXt2YXIgbz1yLnV0aWwuY29weShlKSxpPW5ldyBuKGUpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwiX29yaWdpbmFsQ29uZmlnIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksaS5fY2xpZW50SWQ9KythLGl9dGhpcy5pbml0aWFsaXplKGUpfSxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe3ZhciB0PXIuY29uZmlnW3RoaXMuc2VydmljZUlkZW50aWZpZXJdO2lmKHRoaXMuY29uZmlnPW5ldyByLkNvbmZpZyhyLmNvbmZpZyksdCYmdGhpcy5jb25maWcudXBkYXRlKHQsITApLGUmJnRoaXMuY29uZmlnLnVwZGF0ZShlLCEwKSx0aGlzLnZhbGlkYXRlU2VydmljZSgpLHRoaXMuY29uZmlnLmVuZHBvaW50fHxpLmNvbmZpZ3VyZUVuZHBvaW50KHRoaXMpLHRoaXMuY29uZmlnLmVuZHBvaW50PXRoaXMuZW5kcG9pbnRGcm9tVGVtcGxhdGUodGhpcy5jb25maWcuZW5kcG9pbnQpLHRoaXMuc2V0RW5kcG9pbnQodGhpcy5jb25maWcuZW5kcG9pbnQpLHIuU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwodGhpcyksci5TZXJ2aWNlLmFkZERlZmF1bHRNb25pdG9yaW5nTGlzdGVuZXJzKHRoaXMpLCh0aGlzLmNvbmZpZy5jbGllbnRTaWRlTW9uaXRvcmluZ3x8ci5TZXJ2aWNlLl9jbGllbnRTaWRlTW9uaXRvcmluZykmJnRoaXMucHVibGlzaGVyKXt2YXIgbz10aGlzLnB1Ymxpc2hlcjt0aGlzLmFkZE5hbWVkTGlzdGVuZXIoIlBVQkxJU0hfQVBJX0NBTEwiLCJhcGlDYWxsIiwoZnVuY3Rpb24oZSl7bi5uZXh0VGljaygoZnVuY3Rpb24oKXtvLmV2ZW50SGFuZGxlcihlKX0pKX0pKSx0aGlzLmFkZE5hbWVkTGlzdGVuZXIoIlBVQkxJU0hfQVBJX0FUVEVNUFQiLCJhcGlDYWxsQXR0ZW1wdCIsKGZ1bmN0aW9uKGUpe24ubmV4dFRpY2soKGZ1bmN0aW9uKCl7by5ldmVudEhhbmRsZXIoZSl9KSl9KSl9fSx2YWxpZGF0ZVNlcnZpY2U6ZnVuY3Rpb24oKXt9LGxvYWRTZXJ2aWNlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtpZihyLnV0aWwuaXNFbXB0eSh0aGlzLmFwaSkpe2lmKHQuYXBpQ29uZmlnKXJldHVybiByLlNlcnZpY2UuZGVmaW5lU2VydmljZUFwaSh0aGlzLmNvbnN0cnVjdG9yLHQuYXBpQ29uZmlnKTtpZih0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzKXsodD1uZXcgci5Db25maWcoci5jb25maWcpKS51cGRhdGUoZSwhMCk7dmFyIG49dC5hcGlWZXJzaW9uc1t0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VJZGVudGlmaWVyXTtyZXR1cm4gbj1ufHx0LmFwaVZlcnNpb24sdGhpcy5nZXRMYXRlc3RTZXJ2aWNlQ2xhc3Mobil9cmV0dXJuIG51bGx9cmV0dXJuIG51bGx9LGdldExhdGVzdFNlcnZpY2VDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gZT10aGlzLmdldExhdGVzdFNlcnZpY2VWZXJzaW9uKGUpLG51bGw9PT10aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzW2VdJiZyLlNlcnZpY2UuZGVmaW5lU2VydmljZUFwaSh0aGlzLmNvbnN0cnVjdG9yLGUpLHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXNbZV19LGdldExhdGVzdFNlcnZpY2VWZXJzaW9uOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzfHwwPT09dGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJObyBzZXJ2aWNlcyBkZWZpbmVkIG9uICIrdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlSWRlbnRpZmllcik7aWYoZT9yLnV0aWwuaXNUeXBlKGUsRGF0ZSkmJihlPXIudXRpbC5kYXRlLmlzbzg2MDEoZSkuc3BsaXQoIlQiKVswXSk6ZT0ibGF0ZXN0IixPYmplY3QuaGFzT3duUHJvcGVydHkodGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcyxlKSlyZXR1cm4gZTtmb3IodmFyIHQ9T2JqZWN0LmtleXModGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcykuc29ydCgpLG49bnVsbCxvPXQubGVuZ3RoLTE7bz49MDtvLS0paWYoIioiIT09dFtvXVt0W29dLmxlbmd0aC0xXSYmKG49dFtvXSksdFtvXS5zdWJzdHIoMCwxMCk8PWUpcmV0dXJuIG47dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCAiK3RoaXMuY29uc3RydWN0b3Iuc2VydmljZUlkZW50aWZpZXIrIiBBUEkgdG8gc2F0aXNmeSB2ZXJzaW9uIGNvbnN0cmFpbnQgYCIrZSsiJyIpfSxhcGk6e30sZGVmYXVsdFJldHJ5Q291bnQ6MyxjdXN0b21pemVSZXF1ZXN0czpmdW5jdGlvbihlKXtpZihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FsbGJhY2sgdHlwZSAnIit0eXBlb2YgZSsiJyBwcm92aWRlZCBpbiBjdXN0b21pemVSZXF1ZXN0cyIpO3RoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXI9ZX1lbHNlIHRoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXI9bnVsbH0sbWFrZVJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9bnVsbCksdD10fHx7fSx0aGlzLmNvbmZpZy5wYXJhbXMpe3ZhciBvPXRoaXMuYXBpLm9wZXJhdGlvbnNbZV07byYmKHQ9ci51dGlsLmNvcHkodCksci51dGlsLmVhY2godGhpcy5jb25maWcucGFyYW1zLChmdW5jdGlvbihlLG4pe28uaW5wdXQubWVtYmVyc1tlXSYmKHZvaWQgMCE9PXRbZV0mJm51bGwhPT10W2VdfHwodFtlXT1uKSl9KSkpfXZhciBpPW5ldyByLlJlcXVlc3QodGhpcyxlLHQpO3JldHVybiB0aGlzLmFkZEFsbFJlcXVlc3RMaXN0ZW5lcnMoaSksdGhpcy5hdHRhY2hNb25pdG9yaW5nRW1pdHRlcihpKSxuJiZpLnNlbmQobiksaX0sbWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9e30pO3ZhciByPXRoaXMubWFrZVJlcXVlc3QoZSx0KS50b1VuYXV0aGVudGljYXRlZCgpO3JldHVybiBuP3Iuc2VuZChuKTpyfSx3YWl0Rm9yOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IHIuUmVzb3VyY2VXYWl0ZXIodGhpcyxlKS53YWl0KHQsbil9LGFkZEFsbFJlcXVlc3RMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtyLmV2ZW50cyxyLkV2ZW50TGlzdGVuZXJzLkNvcmUsdGhpcy5zZXJ2aWNlSW50ZXJmYWNlKCksci5FdmVudExpc3RlbmVycy5Db3JlUG9zdF0sbj0wO248dC5sZW5ndGg7bisrKXRbbl0mJmUuYWRkTGlzdGVuZXJzKHRbbl0pO3RoaXMuY29uZmlnLnBhcmFtVmFsaWRhdGlvbnx8ZS5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSx0aGlzLmNvbmZpZy5sb2dnZXImJmUuYWRkTGlzdGVuZXJzKHIuRXZlbnRMaXN0ZW5lcnMuTG9nZ2VyKSx0aGlzLnNldHVwUmVxdWVzdExpc3RlbmVycyhlKSwiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY3VzdG9tUmVxdWVzdEhhbmRsZXImJnRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmN1c3RvbVJlcXVlc3RIYW5kbGVyKGUpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCJjdXN0b21SZXF1ZXN0SGFuZGxlciIpJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlciYmdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcihlKX0sYXBpQ2FsbEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj17VHlwZToiQXBpQ2FsbCIsQXBpOnQ/dC5uYW1lOmUub3BlcmF0aW9uLFZlcnNpb246MSxTZXJ2aWNlOmUuc2VydmljZS5hcGkuc2VydmljZUlkfHxlLnNlcnZpY2UuYXBpLmVuZHBvaW50UHJlZml4LFJlZ2lvbjplLmh0dHBSZXF1ZXN0LnJlZ2lvbixNYXhSZXRyaWVzRXhjZWVkZWQ6MCxVc2VyQWdlbnQ6ZS5odHRwUmVxdWVzdC5nZXRVc2VyQWdlbnQoKX0scj1lLnJlc3BvbnNlO2lmKHIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihuLkZpbmFsSHR0cFN0YXR1c0NvZGU9ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSksci5lcnJvcil7dmFyIG89ci5lcnJvcjtyLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPjI5OT8oby5jb2RlJiYobi5GaW5hbEF3c0V4Y2VwdGlvbj1vLmNvZGUpLG8ubWVzc2FnZSYmKG4uRmluYWxBd3NFeGNlcHRpb25NZXNzYWdlPW8ubWVzc2FnZSkpOigoby5jb2RlfHxvLm5hbWUpJiYobi5GaW5hbFNka0V4Y2VwdGlvbj1vLmNvZGV8fG8ubmFtZSksby5tZXNzYWdlJiYobi5GaW5hbFNka0V4Y2VwdGlvbk1lc3NhZ2U9by5tZXNzYWdlKSl9cmV0dXJuIG59LGFwaUF0dGVtcHRFdmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG49e1R5cGU6IkFwaUNhbGxBdHRlbXB0IixBcGk6dD90Lm5hbWU6ZS5vcGVyYXRpb24sVmVyc2lvbjoxLFNlcnZpY2U6ZS5zZXJ2aWNlLmFwaS5zZXJ2aWNlSWR8fGUuc2VydmljZS5hcGkuZW5kcG9pbnRQcmVmaXgsRnFkbjplLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLFVzZXJBZ2VudDplLmh0dHBSZXF1ZXN0LmdldFVzZXJBZ2VudCgpfSxyPWUucmVzcG9uc2U7cmV0dXJuIHIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihuLkh0dHBTdGF0dXNDb2RlPXIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpLCFlLl91bkF1dGhlbnRpY2F0ZWQmJmUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMmJmUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQmJihuLkFjY2Vzc0tleT1lLnNlcnZpY2UuY29uZmlnLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzPyhlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl0mJihuLlNlc3Npb25Ub2tlbj1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16bi1yZXF1ZXN0aWQiXSYmKG4uWEFtem5SZXF1ZXN0SWQ9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXpuLXJlcXVlc3RpZCJdKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl0mJihuLlhBbXpSZXF1ZXN0SWQ9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotcmVxdWVzdC1pZCJdKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1pZC0yIl0mJihuLlhBbXpJZDI9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotaWQtMiJdKSxuKTpufSxhdHRlbXB0RmFpbEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYXBpQXR0ZW1wdEV2ZW50KGUpLG49ZS5yZXNwb25zZSxyPW4uZXJyb3I7cmV0dXJuIG4uaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU+Mjk5PyhyLmNvZGUmJih0LkF3c0V4Y2VwdGlvbj1yLmNvZGUpLHIubWVzc2FnZSYmKHQuQXdzRXhjZXB0aW9uTWVzc2FnZT1yLm1lc3NhZ2UpKTooKHIuY29kZXx8ci5uYW1lKSYmKHQuU2RrRXhjZXB0aW9uPXIuY29kZXx8ci5uYW1lKSxyLm1lc3NhZ2UmJih0LlNka0V4Y2VwdGlvbk1lc3NhZ2U9ci5tZXNzYWdlKSksdH0sYXR0YWNoTW9uaXRvcmluZ0VtaXR0ZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbixvLGkscyxhLGM9MCx1PXRoaXM7ZS5vbigidmFsaWRhdGUiLChmdW5jdGlvbigpe2k9ci51dGlsLnJlYWxDbG9jay5ub3coKSxhPURhdGUubm93KCl9KSwhMCksZS5vbigic2lnbiIsKGZ1bmN0aW9uKCl7bj1yLnV0aWwucmVhbENsb2NrLm5vdygpLHQ9RGF0ZS5ub3coKSxzPWUuaHR0cFJlcXVlc3QucmVnaW9uLGMrK30pLCEwKSxlLm9uKCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oKXtvPU1hdGgucm91bmQoci51dGlsLnJlYWxDbG9jay5ub3coKS1uKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkFQSV9DQUxMX0FUVEVNUFQiLCJzdWNjZXNzIiwoZnVuY3Rpb24oKXt2YXIgbj11LmFwaUF0dGVtcHRFdmVudChlKTtuLlRpbWVzdGFtcD10LG4uQXR0ZW1wdExhdGVuY3k9bz49MD9vOjAsbi5SZWdpb249cyx1LmVtaXQoImFwaUNhbGxBdHRlbXB0Iixbbl0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTExfQVRURU1QVF9SRVRSWSIsInJldHJ5IiwoZnVuY3Rpb24oKXt2YXIgaT11LmF0dGVtcHRGYWlsRXZlbnQoZSk7aS5UaW1lc3RhbXA9dCxvPW98fE1hdGgucm91bmQoci51dGlsLnJlYWxDbG9jay5ub3coKS1uKSxpLkF0dGVtcHRMYXRlbmN5PW8+PTA/bzowLGkuUmVnaW9uPXMsdS5lbWl0KCJhcGlDYWxsQXR0ZW1wdCIsW2ldKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkFQSV9DQUxMIiwiY29tcGxldGUiLChmdW5jdGlvbigpe3ZhciB0PXUuYXBpQ2FsbEV2ZW50KGUpO2lmKHQuQXR0ZW1wdENvdW50PWMsISh0LkF0dGVtcHRDb3VudDw9MCkpe3QuVGltZXN0YW1wPWE7dmFyIG49TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLWkpO3QuTGF0ZW5jeT1uPj0wP246MDt2YXIgbz1lLnJlc3BvbnNlO28uZXJyb3ImJm8uZXJyb3IucmV0cnlhYmxlJiYibnVtYmVyIj09dHlwZW9mIG8ucmV0cnlDb3VudCYmIm51bWJlciI9PXR5cGVvZiBvLm1heFJldHJpZXMmJm8ucmV0cnlDb3VudD49by5tYXhSZXRyaWVzJiYodC5NYXhSZXRyaWVzRXhjZWVkZWQ9MSksdS5lbWl0KCJhcGlDYWxsIixbdF0pfX0pKX0sc2V0dXBSZXF1ZXN0TGlzdGVuZXJzOmZ1bmN0aW9uKGUpe30sZ2V0U2lnbmluZ05hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcGkuc2lnbmluZ05hbWV8fHRoaXMuYXBpLmVuZHBvaW50UHJlZml4fSxnZXRTaWduZXJDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuPW51bGwsbz0iIjtyZXR1cm4gZSYmKG89KG49KGUuc2VydmljZS5hcGkub3BlcmF0aW9uc3x8e30pW2Uub3BlcmF0aW9uXXx8bnVsbCk/bi5hdXRodHlwZToiIiksdD10aGlzLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uP3RoaXMuY29uZmlnLnNpZ25hdHVyZVZlcnNpb246InY0Ij09PW98fCJ2NC11bnNpZ25lZC1ib2R5Ij09PW8/InY0IjoiYmVhcmVyIj09PW8/ImJlYXJlciI6dGhpcy5hcGkuc2lnbmF0dXJlVmVyc2lvbixyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5nZXRWZXJzaW9uKHQpfSxzZXJ2aWNlSW50ZXJmYWNlOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuYXBpLnByb3RvY29sKXtjYXNlImVjMiI6Y2FzZSJxdWVyeSI6cmV0dXJuIHIuRXZlbnRMaXN0ZW5lcnMuUXVlcnk7Y2FzZSJqc29uIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5Kc29uO2Nhc2UicmVzdC1qc29uIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5SZXN0SnNvbjtjYXNlInJlc3QteG1sIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5SZXN0WG1sfWlmKHRoaXMuYXBpLnByb3RvY29sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzZXJ2aWNlIGBwcm90b2NvbCcgIit0aGlzLmFwaS5wcm90b2NvbCsiIGluIEFQSSBjb25maWciKX0sc3VjY2Vzc2Z1bFJlc3BvbnNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPDMwMH0sbnVtUmV0cmllczpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLmNvbmZpZy5tYXhSZXRyaWVzP3RoaXMuY29uZmlnLm1heFJldHJpZXM6dGhpcy5kZWZhdWx0UmV0cnlDb3VudH0scmV0cnlEZWxheXM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci51dGlsLmNhbGN1bGF0ZVJldHJ5RGVsYXkoZSx0aGlzLmNvbmZpZy5yZXRyeURlbGF5T3B0aW9ucyx0KX0scmV0cnlhYmxlRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuISF0aGlzLnRpbWVvdXRFcnJvcihlKXx8ISF0aGlzLm5ldHdvcmtpbmdFcnJvcihlKXx8ISF0aGlzLmV4cGlyZWRDcmVkZW50aWFsc0Vycm9yKGUpfHwhIXRoaXMudGhyb3R0bGVkRXJyb3IoZSl8fGUuc3RhdHVzQ29kZT49NTAwfSxuZXR3b3JraW5nRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIk5ldHdvcmtpbmdFcnJvciI9PT1lLmNvZGV9LHRpbWVvdXRFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iVGltZW91dEVycm9yIj09PWUuY29kZX0sZXhwaXJlZENyZWRlbnRpYWxzRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIkV4cGlyZWRUb2tlbkV4Y2VwdGlvbiI9PT1lLmNvZGV9LGNsb2NrU2tld0Vycm9yOmZ1bmN0aW9uKGUpe3N3aXRjaChlLmNvZGUpe2Nhc2UiUmVxdWVzdFRpbWVUb29Ta2V3ZWQiOmNhc2UiUmVxdWVzdEV4cGlyZWQiOmNhc2UiSW52YWxpZFNpZ25hdHVyZUV4Y2VwdGlvbiI6Y2FzZSJTaWduYXR1cmVEb2VzTm90TWF0Y2giOmNhc2UiQXV0aEZhaWx1cmUiOmNhc2UiUmVxdWVzdEluVGhlRnV0dXJlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sZ2V0U2tld0NvcnJlY3RlZERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSt0aGlzLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCl9LGFwcGx5Q2xvY2tPZmZzZXQ6ZnVuY3Rpb24oZSl7ZSYmKHRoaXMuY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0PWUtRGF0ZS5ub3coKSl9LGlzQ2xvY2tTa2V3ZWQ6ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4gTWF0aC5hYnModGhpcy5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLmdldFRpbWUoKS1lKT49M2U1fSx0aHJvdHRsZWRFcnJvcjpmdW5jdGlvbihlKXtpZig0Mjk9PT1lLnN0YXR1c0NvZGUpcmV0dXJuITA7c3dpdGNoKGUuY29kZSl7Y2FzZSJQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZEV4Y2VwdGlvbiI6Y2FzZSJUaHJvdHRsaW5nIjpjYXNlIlRocm90dGxpbmdFeGNlcHRpb24iOmNhc2UiUmVxdWVzdExpbWl0RXhjZWVkZWQiOmNhc2UiUmVxdWVzdFRocm90dGxlZCI6Y2FzZSJSZXF1ZXN0VGhyb3R0bGVkRXhjZXB0aW9uIjpjYXNlIlRvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbiI6Y2FzZSJUcmFuc2FjdGlvbkluUHJvZ3Jlc3NFeGNlcHRpb24iOmNhc2UiRUMyVGhyb3R0bGVkRXhjZXB0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sZW5kcG9pbnRGcm9tVGVtcGxhdGU6ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO3ZhciB0PWU7cmV0dXJuIHQ9KHQ9KHQ9dC5yZXBsYWNlKC9ce3NlcnZpY2VcfS9nLHRoaXMuYXBpLmVuZHBvaW50UHJlZml4KSkucmVwbGFjZSgvXHtyZWdpb25cfS9nLHRoaXMuY29uZmlnLnJlZ2lvbikpLnJlcGxhY2UoL1x7c2NoZW1lXH0vZyx0aGlzLmNvbmZpZy5zc2xFbmFibGVkPyJodHRwcyI6Imh0dHAiKX0sc2V0RW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dGhpcy5lbmRwb2ludD1uZXcgci5FbmRwb2ludChlLHRoaXMuY29uZmlnKX0scGFnaW5hdGlvbkNvbmZpZzpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYXBpLm9wZXJhdGlvbnNbZV0ucGFnaW5hdG9yO2lmKCFuKXtpZih0KXt2YXIgbz1uZXcgRXJyb3I7dGhyb3cgci51dGlsLmVycm9yKG8sIk5vIHBhZ2luYXRpb24gY29uZmlndXJhdGlvbiBmb3IgIitlKX1yZXR1cm4gbnVsbH1yZXR1cm4gbn19KSxyLnV0aWwudXBkYXRlKHIuU2VydmljZSx7ZGVmaW5lTWV0aG9kczpmdW5jdGlvbihlKXtyLnV0aWwuZWFjaChlLnByb3RvdHlwZS5hcGkub3BlcmF0aW9ucywoZnVuY3Rpb24odCl7ZS5wcm90b3R5cGVbdF18fCgibm9uZSI9PT1lLnByb3RvdHlwZS5hcGkub3BlcmF0aW9uc1t0XS5hdXRodHlwZT9lLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzLm1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0KHQsZSxuKX06ZS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcy5tYWtlUmVxdWVzdCh0LGUsbil9KX0pKX0sZGVmaW5lU2VydmljZTpmdW5jdGlvbihlLHQsbil7ci5TZXJ2aWNlLl9zZXJ2aWNlTWFwW2VdPSEwLEFycmF5LmlzQXJyYXkodCl8fChuPXQsdD1bXSk7dmFyIG89cyhyLlNlcnZpY2Usbnx8e30pO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7ci5TZXJ2aWNlLmFkZFZlcnNpb25zKG8sdCk7dmFyIGk9by5zZXJ2aWNlSWRlbnRpZmllcnx8ZTtvLnNlcnZpY2VJZGVudGlmaWVyPWl9ZWxzZSBvLnByb3RvdHlwZS5hcGk9ZSxyLlNlcnZpY2UuZGVmaW5lTWV0aG9kcyhvKTtpZihyLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKHRoaXMucHJvdG90eXBlKSwhdGhpcy5wcm90b3R5cGUucHVibGlzaGVyJiZyLnV0aWwuY2xpZW50U2lkZU1vbml0b3Jpbmcpe3ZhciBhPXIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZy5QdWJsaXNoZXIsYz0oMCxyLnV0aWwuY2xpZW50U2lkZU1vbml0b3JpbmcuY29uZmlnUHJvdmlkZXIpKCk7dGhpcy5wcm90b3R5cGUucHVibGlzaGVyPW5ldyBhKGMpLGMuZW5hYmxlZCYmKHIuU2VydmljZS5fY2xpZW50U2lkZU1vbml0b3Jpbmc9ITApfXJldHVybiByLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKG8ucHJvdG90eXBlKSxyLlNlcnZpY2UuYWRkRGVmYXVsdE1vbml0b3JpbmdMaXN0ZW5lcnMoby5wcm90b3R5cGUpLG99LGFkZFZlcnNpb25zOmZ1bmN0aW9uKGUsdCl7QXJyYXkuaXNBcnJheSh0KXx8KHQ9W3RdKSxlLnNlcnZpY2VzPWUuc2VydmljZXN8fHt9O2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXZvaWQgMD09PWUuc2VydmljZXNbdFtuXV0mJihlLnNlcnZpY2VzW3Rbbl1dPW51bGwpO2UuYXBpVmVyc2lvbnM9T2JqZWN0LmtleXMoZS5zZXJ2aWNlcykuc29ydCgpfSxkZWZpbmVTZXJ2aWNlQXBpOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1zKGUse3NlcnZpY2VJZGVudGlmaWVyOmUuc2VydmljZUlkZW50aWZpZXJ9KTtmdW5jdGlvbiBhKHQpe3QuaXNBcGk/aS5wcm90b3R5cGUuYXBpPXQ6aS5wcm90b3R5cGUuYXBpPW5ldyBvKHQse3NlcnZpY2VJZGVudGlmaWVyOmUuc2VydmljZUlkZW50aWZpZXJ9KX1pZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKG4pYShuKTtlbHNlIHRyeXthKHIuYXBpTG9hZGVyKGUuc2VydmljZUlkZW50aWZpZXIsdCkpfWNhdGNoKG4pe3Rocm93IHIudXRpbC5lcnJvcihuLHttZXNzYWdlOiJDb3VsZCBub3QgZmluZCBBUEkgY29uZmlndXJhdGlvbiAiK2Uuc2VydmljZUlkZW50aWZpZXIrIi0iK3R9KX1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5zZXJ2aWNlcyx0KXx8KGUuYXBpVmVyc2lvbnM9ZS5hcGlWZXJzaW9ucy5jb25jYXQodCkuc29ydCgpKSxlLnNlcnZpY2VzW3RdPWl9ZWxzZSBhKHQpO3JldHVybiByLlNlcnZpY2UuZGVmaW5lTWV0aG9kcyhpKSxpfSxoYXNTZXJ2aWNlOmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoci5TZXJ2aWNlLl9zZXJ2aWNlTWFwLGUpfSxhZGREZWZhdWx0TW9uaXRvcmluZ0xpc3RlbmVyczpmdW5jdGlvbihlKXtlLmFkZE5hbWVkTGlzdGVuZXIoIk1PTklUT1JfRVZFTlRTX0JVQkJMRSIsImFwaUNhbGxBdHRlbXB0IiwoZnVuY3Rpb24odCl7dmFyIG49T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO24uX2V2ZW50cyYmbi5lbWl0KCJhcGlDYWxsQXR0ZW1wdCIsW3RdKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkNBTExfRVZFTlRTX0JVQkJMRSIsImFwaUNhbGwiLChmdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7bi5fZXZlbnRzJiZuLmVtaXQoImFwaUNhbGwiLFt0XSl9KSl9LF9zZXJ2aWNlTWFwOnt9fSksci51dGlsLm1peGluKHIuU2VydmljZSxyLlNlcXVlbnRpYWxFeGVjdXRvciksdC5leHBvcnRzPXIuU2VydmljZX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9tb2RlbC9hcGkiOjQwLCIuL3JlZ2lvbi91dGlscyI6NTUsIi4vcmVnaW9uX2NvbmZpZyI6NTYsX3Byb2Nlc3M6OTF9XSw2MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL2NvbmZpZ19yZWdpb25hbF9lbmRwb2ludCIpO3IudXRpbC51cGRhdGUoci5TVFMucHJvdG90eXBlLHtjcmVkZW50aWFsc0Zyb206ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT8odHx8KHQ9bmV3IHIuVGVtcG9yYXJ5Q3JlZGVudGlhbHMpLHQuZXhwaXJlZD0hMSx0LmFjY2Vzc0tleUlkPWUuQ3JlZGVudGlhbHMuQWNjZXNzS2V5SWQsdC5zZWNyZXRBY2Nlc3NLZXk9ZS5DcmVkZW50aWFscy5TZWNyZXRBY2Nlc3NLZXksdC5zZXNzaW9uVG9rZW49ZS5DcmVkZW50aWFscy5TZXNzaW9uVG9rZW4sdC5leHBpcmVUaW1lPWUuQ3JlZGVudGlhbHMuRXhwaXJhdGlvbix0KTpudWxsfSxhc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QoImFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHkiLGUsdCl9LGFzc3VtZVJvbGVXaXRoU0FNTDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0KCJhc3N1bWVSb2xlV2l0aFNBTUwiLGUsdCl9LHNldHVwUmVxdWVzdExpc3RlbmVyczpmdW5jdGlvbihlKXtlLmFkZExpc3RlbmVyKCJ2YWxpZGF0ZSIsdGhpcy5vcHRJblJlZ2lvbmFsRW5kcG9pbnQsITApfSxvcHRJblJlZ2lvbmFsRW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLG49dC5jb25maWc7aWYobi5zdHNSZWdpb25hbEVuZHBvaW50cz1vKHQuX29yaWdpbmFsQ29uZmlnLHtlbnY6IkFXU19TVFNfUkVHSU9OQUxfRU5EUE9JTlRTIixzaGFyZWRDb25maWc6InN0c19yZWdpb25hbF9lbmRwb2ludHMiLGNsaWVudENvbmZpZzoic3RzUmVnaW9uYWxFbmRwb2ludHMifSksInJlZ2lvbmFsIj09PW4uc3RzUmVnaW9uYWxFbmRwb2ludHMmJnQuaXNHbG9iYWxFbmRwb2ludCl7aWYoIW4ucmVnaW9uKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIHJlZ2lvbiBpbiBjb25maWcifSk7dmFyIGk9bi5lbmRwb2ludC5pbmRleE9mKCIuYW1hem9uYXdzLmNvbSIpLHM9bi5lbmRwb2ludC5zdWJzdHJpbmcoMCxpKSsiLiIrbi5yZWdpb24rbi5lbmRwb2ludC5zdWJzdHJpbmcoaSk7ZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChzKSxlLmh0dHBSZXF1ZXN0LnJlZ2lvbj1uLnJlZ2lvbn19fSl9LHsiLi4vY29uZmlnX3JlZ2lvbmFsX2VuZHBvaW50IjoxOCwiLi4vY29yZSI6MTl9XSw2NDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKTtyLlNpZ25lcnMuQmVhcmVyPXIudXRpbC5pbmhlcml0KHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5jYWxsKHRoaXMsZSl9LGFkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0LmhlYWRlcnMuQXV0aG9yaXphdGlvbj0iQmVhcmVyICIrZS50b2tlbn19KX0seyIuLi9jb3JlIjoxOX1dLDY1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQsaT0icHJlc2lnbmVkLWV4cGlyZXMiO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldLG49ZS5zZXJ2aWNlLmdldFNpZ25lckNsYXNzKGUpO2lmKGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlVzZXItQWdlbnQiXSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1Vc2VyLUFnZW50Il0sbj09PXIuU2lnbmVycy5WNCl7aWYodD42MDQ4MDApdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiSW52YWxpZEV4cGlyeVRpbWUiLG1lc3NhZ2U6IlByZXNpZ25pbmcgZG9lcyBub3Qgc3VwcG9ydCBleHBpcnkgdGltZSBncmVhdGVyIHRoYW4gYSB3ZWVrIHdpdGggU2lnVjQgc2lnbmluZy4iLHJldHJ5YWJsZTohMX0pO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT10fWVsc2V7aWYobiE9PXIuU2lnbmVycy5TMyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHttZXNzYWdlOiJQcmVzaWduaW5nIG9ubHkgc3VwcG9ydHMgUzMgb3IgU2lnVjQgc2lnbmluZy4iLGNvZGU6IlVuc3VwcG9ydGVkU2lnbmVyIixyZXRyeWFibGU6ITF9KTt2YXIgbz1lLnNlcnZpY2U/ZS5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCk6ci51dGlsLmRhdGUuZ2V0RGF0ZSgpO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT1wYXJzZUludChyLnV0aWwuZGF0ZS51bml4VGltZXN0YW1wKG8pK3QsMTApLnRvU3RyaW5nKCl9fWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdC5lbmRwb2ludCxuPXIudXRpbC51cmxQYXJzZShlLmh0dHBSZXF1ZXN0LnBhdGgpLG89e307bi5zZWFyY2gmJihvPXIudXRpbC5xdWVyeVN0cmluZ1BhcnNlKG4uc2VhcmNoLnN1YnN0cigxKSkpO3ZhciBzPWUuaHR0cFJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uLnNwbGl0KCIgIik7aWYoIkFXUyI9PT1zWzBdKXM9c1sxXS5zcGxpdCgiOiIpLG8uU2lnbmF0dXJlPXMucG9wKCksby5BV1NBY2Nlc3NLZXlJZD1zLmpvaW4oIjoiKSxyLnV0aWwuZWFjaChlLmh0dHBSZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7ZT09PWkmJihlPSJFeHBpcmVzIiksMD09PWUuaW5kZXhPZigieC1hbXotbWV0YS0iKSYmKGRlbGV0ZSBvW2VdLGU9ZS50b0xvd2VyQ2FzZSgpKSxvW2VdPXR9KSksZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXSxkZWxldGUgby5BdXRob3JpemF0aW9uLGRlbGV0ZSBvLkhvc3Q7ZWxzZSBpZigiQVdTNC1ITUFDLVNIQTI1NiI9PT1zWzBdKXtzLnNoaWZ0KCk7dmFyIGE9cy5qb2luKCIgIikubWF0Y2goL1NpZ25hdHVyZT0oLio/KSg/Oix8XHN8XHI/XG58JCkvKVsxXTtvWyJYLUFtei1TaWduYXR1cmUiXT1hLGRlbGV0ZSBvLkV4cGlyZXN9dC5wYXRobmFtZT1uLnBhdGhuYW1lLHQuc2VhcmNoPXIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKG8pfXIuU2lnbmVycy5QcmVzaWduPW8oe3NpZ246ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT10fHwzNjAwLGUub24oImJ1aWxkIixzKSxlLm9uKCJzaWduIixhKSxlLnJlbW92ZUxpc3RlbmVyKCJhZnRlckJ1aWxkIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuU0VUX0NPTlRFTlRfTEVOR1RIKSxlLnJlbW92ZUxpc3RlbmVyKCJhZnRlckJ1aWxkIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuQ09NUFVURV9TSEEyNTYpLGUuZW1pdCgiYmVmb3JlUHJlc2lnbiIsW2VdKSwhbil7aWYoZS5idWlsZCgpLGUucmVzcG9uc2UuZXJyb3IpdGhyb3cgZS5yZXNwb25zZS5lcnJvcjtyZXR1cm4gci51dGlsLnVybEZvcm1hdChlLmh0dHBSZXF1ZXN0LmVuZHBvaW50KX1lLmJ1aWxkKChmdW5jdGlvbigpe3RoaXMucmVzcG9uc2UuZXJyb3I/bih0aGlzLnJlc3BvbnNlLmVycm9yKTpuKG51bGwsci51dGlsLnVybEZvcm1hdChlLmh0dHBSZXF1ZXN0LmVuZHBvaW50KSl9KSl9fSksdC5leHBvcnRzPXIuU2lnbmVycy5QcmVzaWdufSx7Ii4uL2NvcmUiOjE5fV0sNjY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcj1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3Q9ZX0sc2V0U2VydmljZUNsaWVudElkOmZ1bmN0aW9uKGUpe3RoaXMuc2VydmljZUNsaWVudElkPWV9LGdldFNlcnZpY2VDbGllbnRJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlcnZpY2VDbGllbnRJZH19KSxyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5nZXRWZXJzaW9uPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlInYyIjpyZXR1cm4gci5TaWduZXJzLlYyO2Nhc2UidjMiOnJldHVybiByLlNpZ25lcnMuVjM7Y2FzZSJzM3Y0IjpjYXNlInY0IjpyZXR1cm4gci5TaWduZXJzLlY0O2Nhc2UiczMiOnJldHVybiByLlNpZ25lcnMuUzM7Y2FzZSJ2M2h0dHBzIjpyZXR1cm4gci5TaWduZXJzLlYzSHR0cHM7Y2FzZSJiZWFyZXIiOnJldHVybiByLlNpZ25lcnMuQmVhcmVyfXRocm93IG5ldyBFcnJvcigiVW5rbm93biBzaWduaW5nIHZlcnNpb24gIitlKX0sZSgiLi92MiIpLGUoIi4vdjMiKSxlKCIuL3YzaHR0cHMiKSxlKCIuL3Y0IiksZSgiLi9zMyIpLGUoIi4vcHJlc2lnbiIpLGUoIi4vYmVhcmVyIil9LHsiLi4vY29yZSI6MTksIi4vYmVhcmVyIjo2NCwiLi9wcmVzaWduIjo2NSwiLi9zMyI6NjcsIi4vdjIiOjY4LCIuL3YzIjo2OSwiLi92M2h0dHBzIjo3MCwiLi92NCI6NzF9XSw2NzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5TMz1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHtzdWJSZXNvdXJjZXM6e2FjbDoxLGFjY2VsZXJhdGU6MSxhbmFseXRpY3M6MSxjb3JzOjEsbGlmZWN5Y2xlOjEsZGVsZXRlOjEsaW52ZW50b3J5OjEsbG9jYXRpb246MSxsb2dnaW5nOjEsbWV0cmljczoxLG5vdGlmaWNhdGlvbjoxLHBhcnROdW1iZXI6MSxwb2xpY3k6MSxyZXF1ZXN0UGF5bWVudDoxLHJlcGxpY2F0aW9uOjEscmVzdG9yZToxLHRhZ2dpbmc6MSx0b3JyZW50OjEsdXBsb2FkSWQ6MSx1cGxvYWRzOjEsdmVyc2lvbklkOjEsdmVyc2lvbmluZzoxLHZlcnNpb25zOjEsd2Vic2l0ZToxfSxyZXNwb25zZUhlYWRlcnM6eyJyZXNwb25zZS1jb250ZW50LXR5cGUiOjEsInJlc3BvbnNlLWNvbnRlbnQtbGFuZ3VhZ2UiOjEsInJlc3BvbnNlLWV4cGlyZXMiOjEsInJlc3BvbnNlLWNhY2hlLWNvbnRyb2wiOjEsInJlc3BvbnNlLWNvbnRlbnQtZGlzcG9zaXRpb24iOjEsInJlc3BvbnNlLWNvbnRlbnQtZW5jb2RpbmciOjF9LGFkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLnJlcXVlc3QuaGVhZGVyc1sicHJlc2lnbmVkLWV4cGlyZXMiXXx8KHRoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl09ci51dGlsLmRhdGUucmZjODIyKHQpKSxlLnNlc3Npb25Ub2tlbiYmKHRoaXMucmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdPWUuc2Vzc2lvblRva2VuKTt2YXIgbj10aGlzLnNpZ24oZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSksbz0iQVdTICIrZS5hY2Nlc3NLZXlJZCsiOiIrbjt0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPW99LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdCx0PVtdO3QucHVzaChlLm1ldGhvZCksdC5wdXNoKGUuaGVhZGVyc1siQ29udGVudC1NRDUiXXx8IiIpLHQucHVzaChlLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdfHwiIiksdC5wdXNoKGUuaGVhZGVyc1sicHJlc2lnbmVkLWV4cGlyZXMiXXx8IiIpO3ZhciBuPXRoaXMuY2Fub25pY2FsaXplZEFtekhlYWRlcnMoKTtyZXR1cm4gbiYmdC5wdXNoKG4pLHQucHVzaCh0aGlzLmNhbm9uaWNhbGl6ZWRSZXNvdXJjZSgpKSx0LmpvaW4oIlxuIil9LGNhbm9uaWNhbGl6ZWRBbXpIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107ci51dGlsLmVhY2godGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQpe3QubWF0Y2goL154LWFtei0vaSkmJmUucHVzaCh0KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKTx0LnRvTG93ZXJDYXNlKCk/LTE6MX0pKTt2YXIgdD1bXTtyZXR1cm4gci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSl7dC5wdXNoKGUudG9Mb3dlckNhc2UoKSsiOiIrU3RyaW5nKHRoaXMucmVxdWVzdC5oZWFkZXJzW2VdKSl9KSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxpemVkUmVzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3QsdD1lLnBhdGguc3BsaXQoIj8iKSxuPXRbMF0sbz10WzFdLGk9IiI7aWYoZS52aXJ0dWFsSG9zdGVkQnVja2V0JiYoaSs9Ii8iK2UudmlydHVhbEhvc3RlZEJ1Y2tldCksaSs9bixvKXt2YXIgcz1bXTtyLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyxvLnNwbGl0KCImIiksKGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3BsaXQoIj0iKVswXSxuPWUuc3BsaXQoIj0iKVsxXTtpZih0aGlzLnN1YlJlc291cmNlc1t0XXx8dGhpcy5yZXNwb25zZUhlYWRlcnNbdF0pe3ZhciByPXtuYW1lOnR9O3ZvaWQgMCE9PW4mJih0aGlzLnN1YlJlc291cmNlc1t0XT9yLnZhbHVlPW46ci52YWx1ZT1kZWNvZGVVUklDb21wb25lbnQobikpLHMucHVzaChyKX19KSkscy5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLm5hbWU8dC5uYW1lPy0xOjF9KSkscy5sZW5ndGgmJihvPVtdLHIudXRpbC5hcnJheUVhY2gocywoZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS52YWx1ZT9vLnB1c2goZS5uYW1lKTpvLnB1c2goZS5uYW1lKyI9IitlLnZhbHVlKX0pKSxpKz0iPyIrby5qb2luKCImIikpfXJldHVybiBpfSxzaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhlLHQsImJhc2U2NCIsInNoYTEiKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlMzfSx7Ii4uL2NvcmUiOjE5fV0sNjg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuVjI9byhyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7YWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3R8fCh0PXIudXRpbC5kYXRlLmdldERhdGUoKSk7dmFyIG49dGhpcy5yZXF1ZXN0O24ucGFyYW1zLlRpbWVzdGFtcD1yLnV0aWwuZGF0ZS5pc284NjAxKHQpLG4ucGFyYW1zLlNpZ25hdHVyZVZlcnNpb249IjIiLG4ucGFyYW1zLlNpZ25hdHVyZU1ldGhvZD0iSG1hY1NIQTI1NiIsbi5wYXJhbXMuQVdTQWNjZXNzS2V5SWQ9ZS5hY2Nlc3NLZXlJZCxlLnNlc3Npb25Ub2tlbiYmKG4ucGFyYW1zLlNlY3VyaXR5VG9rZW49ZS5zZXNzaW9uVG9rZW4pLGRlbGV0ZSBuLnBhcmFtcy5TaWduYXR1cmUsbi5wYXJhbXMuU2lnbmF0dXJlPXRoaXMuc2lnbmF0dXJlKGUpLG4uYm9keT1yLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyhuLnBhcmFtcyksbi5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdPW4uYm9keS5sZW5ndGh9LHNpZ25hdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc3RyaW5nVG9TaWduKCksImJhc2U2NCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCh0aGlzLnJlcXVlc3QuZW5kcG9pbnQuaG9zdC50b0xvd2VyQ2FzZSgpKSxlLnB1c2godGhpcy5yZXF1ZXN0LnBhdGhuYW1lKCkpLGUucHVzaChyLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyh0aGlzLnJlcXVlc3QucGFyYW1zKSksZS5qb2luKCJcbiIpfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjJ9LHsiLi4vY29yZSI6MTl9XSw2OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5WMz1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHthZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ci51dGlsLmRhdGUucmZjODIyKHQpO3RoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl09bixlLnNlc3Npb25Ub2tlbiYmKHRoaXMucmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdPWUuc2Vzc2lvblRva2VuKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXpuLUF1dGhvcml6YXRpb24iXT10aGlzLmF1dGhvcml6YXRpb24oZSxuKX0sYXV0aG9yaXphdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4iQVdTMyBBV1NBY2Nlc3NLZXlJZD0iK2UuYWNjZXNzS2V5SWQrIixBbGdvcml0aG09SG1hY1NIQTI1NixTaWduZWRIZWFkZXJzPSIrdGhpcy5zaWduZWRIZWFkZXJzKCkrIixTaWduYXR1cmU9Iit0aGlzLnNpZ25hdHVyZShlKX0sc2lnbmVkSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoKHRoaXMuaGVhZGVyc1RvU2lnbigpLChmdW5jdGlvbih0KXtlLnB1c2godC50b0xvd2VyQ2FzZSgpKX0pKSxlLnNvcnQoKS5qb2luKCI7Iil9LGNhbm9uaWNhbEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3QuaGVhZGVycyx0PVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoKHRoaXMuaGVhZGVyc1RvU2lnbigpLChmdW5jdGlvbihuKXt0LnB1c2gobi50b0xvd2VyQ2FzZSgpLnRyaW0oKSsiOiIrU3RyaW5nKGVbbl0pLnRyaW0oKSl9KSksdC5zb3J0KCkuam9pbigiXG4iKSsiXG4ifSxoZWFkZXJzVG9TaWduOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5lYWNoKHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0KXsoIkhvc3QiPT09dHx8IkNvbnRlbnQtRW5jb2RpbmciPT09dHx8dC5tYXRjaCgvXlgtQW16L2kpKSYmZS5wdXNoKHQpfSkpLGV9LHNpZ25hdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc3RyaW5nVG9TaWduKCksImJhc2U2NCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCgiLyIpLGUucHVzaCgiIiksZS5wdXNoKHRoaXMuY2Fub25pY2FsSGVhZGVycygpKSxlLnB1c2godGhpcy5yZXF1ZXN0LmJvZHkpLHIudXRpbC5jcnlwdG8uc2hhMjU2KGUuam9pbigiXG4iKSl9fSksdC5leHBvcnRzPXIuU2lnbmVycy5WM30seyIuLi9jb3JlIjoxOX1dLDcwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ZSgiLi92MyIpLHIuU2lnbmVycy5WM0h0dHBzPW8oci5TaWduZXJzLlYzLHthdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJBV1MzLUhUVFBTIEFXU0FjY2Vzc0tleUlkPSIrZS5hY2Nlc3NLZXlJZCsiLEFsZ29yaXRobT1IbWFjU0hBMjU2LFNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlYzSHR0cHN9LHsiLi4vY29yZSI6MTksIi4vdjMiOjY5fV0sNzE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuL3Y0X2NyZWRlbnRpYWxzIiksaT1yLnV0aWwuaW5oZXJpdCxzPSJwcmVzaWduZWQtZXhwaXJlcyI7ci5TaWduZXJzLlY0PWkoci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxuKXtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5jYWxsKHRoaXMsZSksdGhpcy5zZXJ2aWNlTmFtZT10LG49bnx8e30sdGhpcy5zaWduYXR1cmVDYWNoZT0iYm9vbGVhbiIhPXR5cGVvZiBuLnNpZ25hdHVyZUNhY2hlfHxuLnNpZ25hdHVyZUNhY2hlLHRoaXMub3BlcmF0aW9uPW4ub3BlcmF0aW9uLHRoaXMuc2lnbmF0dXJlVmVyc2lvbj1uLnNpZ25hdHVyZVZlcnNpb259LGFsZ29yaXRobToiQVdTNC1ITUFDLVNIQTI1NiIsYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXIudXRpbC5kYXRlLmlzbzg2MDEodCkucmVwbGFjZSgvWzpcLV18XC5cZHszfS9nLCIiKTt0aGlzLmlzUHJlc2lnbmVkKCk/dGhpcy51cGRhdGVGb3JQcmVzaWduZWQoZSxuKTp0aGlzLmFkZEhlYWRlcnMoZSxuKSx0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPXRoaXMuYXV0aG9yaXphdGlvbihlLG4pfSxhZGRIZWFkZXJzOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT10LGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pfSx1cGRhdGVGb3JQcmVzaWduZWQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWRlbnRpYWxTdHJpbmcodCksbz17IlgtQW16LURhdGUiOnQsIlgtQW16LUFsZ29yaXRobSI6dGhpcy5hbGdvcml0aG0sIlgtQW16LUNyZWRlbnRpYWwiOmUuYWNjZXNzS2V5SWQrIi8iK24sIlgtQW16LUV4cGlyZXMiOnRoaXMucmVxdWVzdC5oZWFkZXJzW3NdLCJYLUFtei1TaWduZWRIZWFkZXJzIjp0aGlzLnNpZ25lZEhlYWRlcnMoKX07ZS5zZXNzaW9uVG9rZW4mJihvWyJYLUFtei1TZWN1cml0eS1Ub2tlbiJdPWUuc2Vzc2lvblRva2VuKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0mJihvWyJDb250ZW50LVR5cGUiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LU1ENSJdJiYob1siQ29udGVudC1NRDUiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1NRDUiXSksdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNhY2hlLUNvbnRyb2wiXSYmKG9bIkNhY2hlLUNvbnRyb2wiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ2FjaGUtQ29udHJvbCJdKSxyLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7aWYoZSE9PXMmJnRoaXMuaXNTaWduYWJsZUhlYWRlcihlKSl7dmFyIG49ZS50b0xvd2VyQ2FzZSgpOzA9PT1uLmluZGV4T2YoIngtYW16LW1ldGEtIik/b1tuXT10OjA9PT1uLmluZGV4T2YoIngtYW16LSIpJiYob1tlXT10KX19KSk7dmFyIGk9dGhpcy5yZXF1ZXN0LnBhdGguaW5kZXhPZigiPyIpPj0wPyImIjoiPyI7dGhpcy5yZXF1ZXN0LnBhdGgrPWkrci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobyl9LGF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxyPXRoaXMuY3JlZGVudGlhbFN0cmluZyh0KTtyZXR1cm4gbi5wdXNoKHRoaXMuYWxnb3JpdGhtKyIgQ3JlZGVudGlhbD0iK2UuYWNjZXNzS2V5SWQrIi8iK3IpLG4ucHVzaCgiU2lnbmVkSGVhZGVycz0iK3RoaXMuc2lnbmVkSGVhZGVycygpKSxuLnB1c2goIlNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUsdCkpLG4uam9pbigiLCAiKX0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUsdCl7dmFyIG49by5nZXRTaWduaW5nS2V5KGUsdC5zdWJzdHIoMCw4KSx0aGlzLnJlcXVlc3QucmVnaW9uLHRoaXMuc2VydmljZU5hbWUsdGhpcy5zaWduYXR1cmVDYWNoZSk7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhuLHRoaXMuc3RyaW5nVG9TaWduKHQpLCJoZXgiKX0sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiB0LnB1c2goIkFXUzQtSE1BQy1TSEEyNTYiKSx0LnB1c2goZSksdC5wdXNoKHRoaXMuY3JlZGVudGlhbFN0cmluZyhlKSksdC5wdXNoKHRoaXMuaGV4RW5jb2RlZEhhc2godGhpcy5jYW5vbmljYWxTdHJpbmcoKSkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD10aGlzLnJlcXVlc3QucGF0aG5hbWUoKTtyZXR1cm4iczMiIT09dGhpcy5zZXJ2aWNlTmFtZSYmInMzdjQiIT09dGhpcy5zaWduYXR1cmVWZXJzaW9uJiYodD1yLnV0aWwudXJpRXNjYXBlUGF0aCh0KSksZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCh0KSxlLnB1c2godGhpcy5yZXF1ZXN0LnNlYXJjaCgpKSxlLnB1c2godGhpcy5jYW5vbmljYWxIZWFkZXJzKCkrIlxuIiksZS5wdXNoKHRoaXMuc2lnbmVkSGVhZGVycygpKSxlLnB1c2godGhpcy5oZXhFbmNvZGVkQm9keUhhc2goKSksZS5qb2luKCJcbiIpfSxjYW5vbmljYWxIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107ci51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0LG4pe2UucHVzaChbdCxuXSl9KSksZS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlWzBdLnRvTG93ZXJDYXNlKCk8dFswXS50b0xvd2VyQ2FzZSgpPy0xOjF9KSk7dmFyIHQ9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLGUsKGZ1bmN0aW9uKGUpe3ZhciBuPWVbMF0udG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzU2lnbmFibGVIZWFkZXIobikpe3ZhciBvPWVbMV07aWYobnVsbD09b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIG8udG9TdHJpbmcpdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcigiSGVhZGVyICIrbisiIGNvbnRhaW5zIGludmFsaWQgdmFsdWUiKSx7Y29kZToiSW52YWxpZEhlYWRlciJ9KTt0LnB1c2gobisiOiIrdGhpcy5jYW5vbmljYWxIZWFkZXJWYWx1ZXMoby50b1N0cmluZygpKSl9fSkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsSGVhZGVyVmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1xzKy9nLCIgIikucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSxzaWduZWRIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24odCl7dD10LnRvTG93ZXJDYXNlKCksdGhpcy5pc1NpZ25hYmxlSGVhZGVyKHQpJiZlLnB1c2godCl9KSksZS5zb3J0KCkuam9pbigiOyIpfSxjcmVkZW50aWFsU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBvLmNyZWF0ZVNjb3BlKGUuc3Vic3RyKDAsOCksdGhpcy5yZXF1ZXN0LnJlZ2lvbix0aGlzLnNlcnZpY2VOYW1lKX0saGV4RW5jb2RlZEhhc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHIudXRpbC5jcnlwdG8uc2hhMjU2KGUsImhleCIpfSxoZXhFbmNvZGVkQm9keUhhc2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3Q7cmV0dXJuIHRoaXMuaXNQcmVzaWduZWQoKSYmWyJzMyIsInMzLW9iamVjdC1sYW1iZGEiXS5pbmRleE9mKHRoaXMuc2VydmljZU5hbWUpPi0xJiYhZS5ib2R5PyJVTlNJR05FRC1QQVlMT0FEIjplLmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il0/ZS5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdOnRoaXMuaGV4RW5jb2RlZEhhc2godGhpcy5yZXF1ZXN0LmJvZHl8fCIiKX0sdW5zaWduYWJsZUhlYWRlcnM6WyJhdXRob3JpemF0aW9uIiwiY29udGVudC10eXBlIiwiY29udGVudC1sZW5ndGgiLCJ1c2VyLWFnZW50IixzLCJleHBlY3QiLCJ4LWFtem4tdHJhY2UtaWQiXSxpc1NpZ25hYmxlSGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIngtYW16LSIpfHx0aGlzLnVuc2lnbmFibGVIZWFkZXJzLmluZGV4T2YoZSk8MH0saXNQcmVzaWduZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMucmVxdWVzdC5oZWFkZXJzW3NdfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjR9LHsiLi4vY29yZSI6MTksIi4vdjRfY3JlZGVudGlhbHMiOjcyfV0sNzI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz17fSxpPVtdLHM9ImF3czRfcmVxdWVzdCI7dC5leHBvcnRzPXtjcmVhdGVTY29wZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuW2Uuc3Vic3RyKDAsOCksdCxuLHNdLmpvaW4oIi8iKX0sZ2V0U2lnbmluZ0tleTpmdW5jdGlvbihlLHQsbixhLGMpe3ZhciB1PVtyLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksZS5hY2Nlc3NLZXlJZCwiYmFzZTY0IiksdCxuLGFdLmpvaW4oIl8iKTtpZigoYz0hMSE9PWMpJiZ1IGluIG8pcmV0dXJuIG9bdV07dmFyIGw9ci51dGlsLmNyeXB0by5obWFjKCJBV1M0IitlLnNlY3JldEFjY2Vzc0tleSx0LCJidWZmZXIiKSxwPXIudXRpbC5jcnlwdG8uaG1hYyhsLG4sImJ1ZmZlciIpLGQ9ci51dGlsLmNyeXB0by5obWFjKHAsYSwiYnVmZmVyIiksaD1yLnV0aWwuY3J5cHRvLmhtYWMoZCxzLCJidWZmZXIiKTtyZXR1cm4gYyYmKG9bdV09aCxpLnB1c2godSksaS5sZW5ndGg+NTAmJmRlbGV0ZSBvW2kuc2hpZnQoKV0pLGh9LGVtcHR5Q2FjaGU6ZnVuY3Rpb24oKXtvPXt9LGk9W119fX0seyIuLi9jb3JlIjoxOX1dLDczOltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe3RoaXMuY3VycmVudFN0YXRlPXR8fG51bGwsdGhpcy5zdGF0ZXM9ZXx8e319ci5wcm90b3R5cGUucnVuVG89ZnVuY3Rpb24oZSx0LG4scil7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPW4sbj10LHQ9ZSxlPW51bGwpO3ZhciBvPXRoaXMsaT1vLnN0YXRlc1tvLmN1cnJlbnRTdGF0ZV07aS5mbi5jYWxsKG58fG8sciwoZnVuY3Rpb24ocil7aWYocil7aWYoIWkuZmFpbClyZXR1cm4gdD90LmNhbGwobixyKTpudWxsO28uY3VycmVudFN0YXRlPWkuZmFpbH1lbHNle2lmKCFpLmFjY2VwdClyZXR1cm4gdD90LmNhbGwobik6bnVsbDtvLmN1cnJlbnRTdGF0ZT1pLmFjY2VwdH1pZihvLmN1cnJlbnRTdGF0ZT09PWUpcmV0dXJuIHQ/dC5jYWxsKG4scik6bnVsbDtvLnJ1blRvKGUsdCxuLHIpfSkpfSxyLnByb3RvdHlwZS5hZGRTdGF0ZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxuPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYocj1uLG49bnVsbCksdGhpcy5jdXJyZW50U3RhdGV8fCh0aGlzLmN1cnJlbnRTdGF0ZT1lKSx0aGlzLnN0YXRlc1tlXT17YWNjZXB0OnQsZmFpbDpuLGZuOnJ9LHRoaXN9LHQuZXhwb3J0cz1yfSx7fV0sNzQ6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obixyKXsoZnVuY3Rpb24oKXt2YXIgbyxpPXtlbnZpcm9ubWVudDoibm9kZWpzIixlbmdpbmU6ZnVuY3Rpb24oKXtpZihpLmlzQnJvd3NlcigpJiYidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcilyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDt2YXIgZT1uLnBsYXRmb3JtKyIvIituLnZlcnNpb247cmV0dXJuIG4uZW52LkFXU19FWEVDVVRJT05fRU5WJiYoZSs9IiBleGVjLWVudi8iK24uZW52LkFXU19FWEVDVVRJT05fRU5WKSxlfSx1c2VyQWdlbnQ6ZnVuY3Rpb24oKXt2YXIgdD1pLmVudmlyb25tZW50LG49ImF3cy1zZGstIit0KyIvIitlKCIuL2NvcmUiKS5WRVJTSU9OO3JldHVybiJub2RlanMiPT09dCYmKG4rPSIgIitpLmVuZ2luZSgpKSxufSx1cmlFc2NhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZW5jb2RlVVJJQ29tcG9uZW50KGUpO3JldHVybiB0PSh0PXQucmVwbGFjZSgvW15BLVphLXowLTlfLn5cLSVdKy9nLGVzY2FwZSkpLnJlcGxhY2UoL1sqXS9nLChmdW5jdGlvbihlKXtyZXR1cm4iJSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSkpfSx1cmlFc2NhcGVQYXRoOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiBpLmFycmF5RWFjaChlLnNwbGl0KCIvIiksKGZ1bmN0aW9uKGUpe3QucHVzaChpLnVyaUVzY2FwZShlKSl9KSksdC5qb2luKCIvIil9LHVybFBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybiBpLnVybC5wYXJzZShlKX0sdXJsRm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBpLnVybC5mb3JtYXQoZSl9LHF1ZXJ5U3RyaW5nUGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGkucXVlcnlzdHJpbmcucGFyc2UoZSl9LHF1ZXJ5UGFyYW1zVG9TdHJpbmc6ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1pLnVyaUVzY2FwZSxyPU9iamVjdC5rZXlzKGUpLnNvcnQoKTtyZXR1cm4gaS5hcnJheUVhY2gociwoZnVuY3Rpb24ocil7dmFyIG89ZVtyXSxzPW4ociksYT1zKyI9IjtpZihBcnJheS5pc0FycmF5KG8pKXt2YXIgYz1bXTtpLmFycmF5RWFjaChvLChmdW5jdGlvbihlKXtjLnB1c2gobihlKSl9KSksYT1zKyI9IitjLnNvcnQoKS5qb2luKCImIitzKyI9Iil9ZWxzZSBudWxsIT1vJiYoYT1zKyI9IituKG8pKTt0LnB1c2goYSl9KSksdC5qb2luKCImIil9LHJlYWRGaWxlU3luYzpmdW5jdGlvbih0KXtyZXR1cm4gaS5pc0Jyb3dzZXIoKT9udWxsOmUoImZzIikucmVhZEZpbGVTeW5jKHQsInV0Zi04Iil9LGJhc2U2NDp7ZW5jb2RlOmZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGJhc2U2NCBlbmNvZGUgbnVtYmVyICIrZSkpO3JldHVybiBudWxsPT1lP2U6aS5idWZmZXIudG9CdWZmZXIoZSkudG9TdHJpbmcoImJhc2U2NCIpfSxkZWNvZGU6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgYmFzZTY0IGRlY29kZSBudW1iZXIgIitlKSk7cmV0dXJuIG51bGw9PWU/ZTppLmJ1ZmZlci50b0J1ZmZlcihlLCJiYXNlNjQiKX19LGJ1ZmZlcjp7dG9CdWZmZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaS5CdWZmZXIuZnJvbSYmaS5CdWZmZXIuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbT9pLkJ1ZmZlci5mcm9tKGUsdCk6bmV3IGkuQnVmZmVyKGUsdCl9LGFsbG9jOmZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJzaXplIHBhc3NlZCB0byBhbGxvYyBtdXN0IGJlIGEgbnVtYmVyLiIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpLkJ1ZmZlci5hbGxvYylyZXR1cm4gaS5CdWZmZXIuYWxsb2MoZSx0LG4pO3ZhciByPW5ldyBpLkJ1ZmZlcihlKTtyZXR1cm4gdm9pZCAwIT09dCYmImZ1bmN0aW9uIj09dHlwZW9mIHIuZmlsbCYmci5maWxsKHQsdm9pZCAwLHZvaWQgMCxuKSxyfSx0b1N0cmVhbTpmdW5jdGlvbihlKXtpLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9aS5idWZmZXIudG9CdWZmZXIoZSkpO3ZhciB0PW5ldyBpLnN0cmVhbS5SZWFkYWJsZSxuPTA7cmV0dXJuIHQuX3JlYWQ9ZnVuY3Rpb24ocil7aWYobj49ZS5sZW5ndGgpcmV0dXJuIHQucHVzaChudWxsKTt2YXIgbz1uK3I7bz5lLmxlbmd0aCYmKG89ZS5sZW5ndGgpLHQucHVzaChlLnNsaWNlKG4sbykpLG49b30sdH0sY29uY2F0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wLG89MDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKXIrPWVbbl0ubGVuZ3RoO2Zvcih0PWkuYnVmZmVyLmFsbG9jKHIpLG49MDtuPGUubGVuZ3RoO24rKyllW25dLmNvcHkodCxvKSxvKz1lW25dLmxlbmd0aDtyZXR1cm4gdH19LHN0cmluZzp7Ynl0ZUxlbmd0aDpmdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5idWZmZXIudG9CdWZmZXIodCkpLCJudW1iZXIiPT10eXBlb2YgdC5ieXRlTGVuZ3RoKXJldHVybiB0LmJ5dGVMZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aClyZXR1cm4gdC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiB0LnNpemUpcmV0dXJuIHQuc2l6ZTtpZigic3RyaW5nIj09dHlwZW9mIHQucGF0aClyZXR1cm4gZSgiZnMiKS5sc3RhdFN5bmModC5wYXRoKS5zaXplO3Rocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgZGV0ZXJtaW5lIGxlbmd0aCBvZiAiK3QpLHtvYmplY3Q6dH0pfSx1cHBlckZpcnN0OmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHIoMSl9LGxvd2VyRmlyc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0udG9Mb3dlckNhc2UoKStlLnN1YnN0cigxKX19LGluaTp7cGFyc2U6ZnVuY3Rpb24oZSl7dmFyIHQsbj17fTtyZXR1cm4gaS5hcnJheUVhY2goZS5zcGxpdCgvXHI/XG4vKSwoZnVuY3Rpb24oZSl7aWYoIlsiPT09KGU9ZS5zcGxpdCgvKF58XHMpWzsjXS8pWzBdLnRyaW0oKSlbMF0mJiJdIj09PWVbZS5sZW5ndGgtMV0pe2lmKCJfX3Byb3RvX18iPT09KHQ9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKSl8fCJfX3Byb3RvX18iPT09dC5zcGxpdCgvXHMvKVsxXSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgcHJvZmlsZSBuYW1lICciK3QrIicgZnJvbSBzaGFyZWQgaW5pIGZpbGUuIikpfWVsc2UgaWYodCl7dmFyIHI9ZS5pbmRleE9mKCI9Iiksbz1lLmxlbmd0aC0xO2lmKC0xIT09ciYmMCE9PXImJnIhPT1vKXt2YXIgcz1lLnN1YnN0cmluZygwLHIpLnRyaW0oKSxhPWUuc3Vic3RyaW5nKHIrMSkudHJpbSgpO25bdF09blt0XXx8e30sblt0XVtzXT1hfX19KSksbn19LGZuOntub29wOmZ1bmN0aW9uKCl7fSxjYWxsYmFjazpmdW5jdGlvbihlKXtpZihlKXRocm93IGV9LG1ha2VBc3luYzpmdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0PD1lLmxlbmd0aD9lOmZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3QucG9wKCkoZS5hcHBseShudWxsLHQpKX19fSxkYXRlOntnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG98fChvPWUoIi4vY29yZSIpKSxvLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldD9uZXcgRGF0ZSgobmV3IERhdGUpLmdldFRpbWUoKStvLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCk6bmV3IERhdGV9LGlzbzg2MDE6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWkuZGF0ZS5nZXREYXRlKCkpLGUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9cLlxkezN9WiQvLCJaIil9LHJmYzgyMjpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9aS5kYXRlLmdldERhdGUoKSksZS50b1VUQ1N0cmluZygpfSx1bml4VGltZXN0YW1wOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1pLmRhdGUuZ2V0RGF0ZSgpKSxlLmdldFRpbWUoKS8xZTN9LGZyb206ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP25ldyBEYXRlKDFlMyplKTpuZXcgRGF0ZShlKX0sZm9ybWF0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PSJpc284NjAxIiksaS5kYXRlW3RdKGkuZGF0ZS5mcm9tKGUpKX0scGFyc2VUaW1lc3RhbXA6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBuZXcgRGF0ZSgxZTMqZSk7aWYoZS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gbmV3IERhdGUoMWUzKmUpO2lmKGUubWF0Y2goL15cZHs0fS8pKXJldHVybiBuZXcgRGF0ZShlKTtpZihlLm1hdGNoKC9eXHd7M30sLykpcmV0dXJuIG5ldyBEYXRlKGUpO3Rocm93IGkuZXJyb3IobmV3IEVycm9yKCJ1bmhhbmRsZWQgdGltZXN0YW1wIGZvcm1hdDogIitlKSx7Y29kZToiVGltZXN0YW1wUGFyc2VyRXJyb3IifSl9fSxjcnlwdG86e2NyYzMyVGFibGU6WzAsMTk5Njk1OTg5NCwzOTkzOTE5Nzg4LDI1Njc1MjQ3OTQsMTI0NjM0MTM3LDE4ODYwNTc2MTUsMzkxNTYyMTY4NSwyNjU3MzkyMDM1LDI0OTI2ODI3NCwyMDQ0NTA4MzI0LDM3NzIxMTUyMzAsMjU0NzE3Nzg2NCwxNjI5NDE5OTUsMjEyNTU2MTAyMSwzODg3NjA3MDQ3LDI0Mjg0NDQwNDksNDk4NTM2NTQ4LDE3ODk5Mjc2NjYsNDA4OTAxNjY0OCwyMjI3MDYxMjE0LDQ1MDU0ODg2MSwxODQzMjU4NjAzLDQxMDc1ODA3NTMsMjIxMTY3NzYzOSwzMjU4ODM5OTAsMTY4NDc3NzE1Miw0MjUxMTIyMDQyLDIzMjE5MjY2MzYsMzM1NjMzNDg3LDE2NjEzNjU0NjUsNDE5NTMwMjc1NSwyMzY2MTE1MzE3LDk5NzA3MzA5NiwxMjgxOTUzODg2LDM1Nzk4NTUzMzIsMjcyNDY4ODI0MiwxMDA2ODg4MTQ1LDEyNTg2MDc2ODcsMzUyNDEwMTYyOSwyNzY4OTQyNDQzLDkwMTA5NzcyMiwxMTE5MDAwNjg0LDM2ODY1MTcyMDYsMjg5ODA2NTcyOCw4NTMwNDQ0NTEsMTE3MjI2NjEwMSwzNzA1MDE1NzU5LDI4ODI2MTY2NjUsNjUxNzY3OTgwLDEzNzM1MDM1NDYsMzM2OTU1NDMwNCwzMjE4MTA0NTk4LDU2NTUwNzI1MywxNDU0NjIxNzMxLDM0ODUxMTE3MDUsMzA5OTQzNjMwMyw2NzEyNjY5NzQsMTU5NDE5ODAyNCwzMzIyNzMwOTMwLDI5NzAzNDc4MTIsNzk1ODM1NTI3LDE0ODMyMzAyMjUsMzI0NDM2NzI3NSwzMDYwMTQ5NTY1LDE5OTQxNDYxOTIsMzExNTg1MzQsMjU2MzkwNzc3Miw0MDIzNzE3OTMwLDE5MDc0NTk0NjUsMTEyNjM3MjE1LDI2ODAxNTMyNTMsMzkwNDQyNzA1OSwyMDEzNzc2MjkwLDI1MTcyMjAzNiwyNTE3MjE1Mzc0LDM3NzU4MzAwNDAsMjEzNzY1Njc2MywxNDEzNzY4MTMsMjQzOTI3NzcxOSwzODY1MjcxMjk3LDE4MDIxOTU0NDQsNDc2ODY0ODY2LDIyMzgwMDEzNjgsNDA2NjUwODg3OCwxODEyMzcwOTI1LDQ1MzA5MjczMSwyMTgxNjI1MDI1LDQxMTE0NTEyMjMsMTcwNjA4ODkwMiwzMTQwNDI3MDQsMjM0NDUzMjIwMiw0MjQwMDE3NTMyLDE2NTg2NTgyNzEsMzY2NjE5OTc3LDIzNjI2NzAzMjMsNDIyNDk5NDQwNSwxMzAzNTM1OTYwLDk4NDk2MTQ4NiwyNzQ3MDA3MDkyLDM1NjkwMzc1MzgsMTI1NjE3MDgxNywxMDM3NjA0MzExLDI3NjUyMTA3MzMsMzU1NDA3OTk5NSwxMTMxMDE0NTA2LDg3OTY3OTk5NiwyOTA5MjQzNDYyLDM2NjM3NzE4NTYsMTE0MTEyNDQ2Nyw4NTU4NDIyNzcsMjg1MjgwMTYzMSwzNzA4NjQ4NjQ5LDEzNDI1MzM5NDgsNjU0NDU5MzA2LDMxODgzOTYwNDgsMzM3MzAxNTE3NCwxNDY2NDc5OTA5LDU0NDE3OTYzNSwzMTEwNTIzOTEzLDM0NjI1MjIwMTUsMTU5MTY3MTA1NCw3MDIxMzg3NzYsMjk2NjQ2MDQ1MCwzMzUyNzk5NDEyLDE1MDQ5MTg4MDcsNzgzNTUxODczLDMwODI2NDA0NDMsMzIzMzQ0Mjk4OSwzOTg4MjkyMzg0LDI1OTYyNTQ2NDYsNjIzMTcwNjgsMTk1NzgxMDg0MiwzOTM5ODQ1OTQ1LDI2NDc4MTYxMTEsODE0NzA5OTcsMTk0MzgwMzUyMywzODE0OTE4OTMwLDI0ODk1OTY4MDQsMjI1Mjc0NDMwLDIwNTM3OTAzNzYsMzgyNjE3NTc1NSwyNDY2OTA2MDEzLDE2NzgxNjc0MywyMDk3NjUxMzc3LDQwMjc1NTI1ODAsMjI2NTQ5MDM4Niw1MDM0NDQwNzIsMTc2MjA1MDgxNCw0MTUwNDE3MjQ1LDIxNTQxMjkzNTUsNDI2NTIyMjI1LDE4NTI1MDc4NzksNDI3NTMxMzUyNiwyMzEyMzE3OTIwLDI4Mjc1MzYyNiwxNzQyNTU1ODUyLDQxODk3MDgxNDMsMjM5NDg3Nzk0NSwzOTc5MTc3NjMsMTYyMjE4MzYzNywzNjA0MzkwODg4LDI3MTQ4NjY1NTgsOTUzNzI5NzMyLDEzNDAwNzY2MjYsMzUxODcxOTk4NSwyNzk3MzYwOTk5LDEwNjg4MjgzODEsMTIxOTYzODg1OSwzNjI0NzQxODUwLDI5MzY2NzUxNDgsOTA2MTg1NDYyLDEwOTA4MTI1MTIsMzc0NzY3MjAwMywyODI1Mzc5NjY5LDgyOTMyOTEzNSwxMTgxMzM1MTYxLDM0MTIxNzc4MDQsMzE2MDgzNDg0Miw2MjgwODU0MDgsMTM4MjYwNTM2NiwzNDIzMzY5MTA5LDMxMzgwNzg0NjcsNTcwNTYyMjMzLDE0MjY0MDA4MTUsMzMxNzMxNjU0MiwyOTk4NzMzNjA4LDczMzIzOTk1NCwxNTU1MjYxOTU2LDMyNjg5MzU1OTEsMzA1MDM2MDYyNSw3NTI0NTk0MDMsMTU0MTMyMDIyMSwyNjA3MDcxOTIwLDM5NjU5NzMwMzAsMTk2OTkyMjk3Miw0MDczNTQ5OCwyNjE3ODM3MjI1LDM5NDM1NzcxNTEsMTkxMzA4Nzg3Nyw4MzkwODM3MSwyNTEyMzQxNjM0LDM4MDM3NDA2OTIsMjA3NTIwODYyMiwyMTMyNjExMTIsMjQ2MzI3MjYwMywzODU1OTkwMjg1LDIwOTQ4NTQwNzEsMTk4OTU4ODgxLDIyNjIwMjkwMTIsNDA1NzI2MDYxMCwxNzU5MzU5OTkyLDUzNDQxNDE5MCwyMTc2NzE4NTQxLDQxMzkzMjkxMTUsMTg3MzgzNjAwMSw0MTQ2NjQ1NjcsMjI4MjI0ODkzNCw0Mjc5MjAwMzY4LDE3MTE2ODQ1NTQsMjg1MjgxMTE2LDI0MDU4MDE3MjcsNDE2NzIxNjc0NSwxNjM0NDY3Nzk1LDM3NjIyOTcwMSwyNjg1MDY3ODk2LDM2MDgwMDc0MDYsMTMwODkxODYxMiw5NTY1NDM5MzgsMjgwODU1NTEwNSwzNDk1OTU4MjYzLDEyMzE2MzYzMDEsMTA0NzQyNzAzNSwyOTMyOTU5ODE4LDM2NTQ3MDM4MzYsMTA4ODM1OTI3MCw5MzY5MThlMywyODQ3NzE0ODk5LDM3MzY4Mzc4MjksMTIwMjkwMDg2Myw4MTcyMzM4OTcsMzE4MzM0MjEwOCwzNDAxMjM3MTMwLDE0MDQyNzc1NTIsNjE1ODE4MTUwLDMxMzQyMDc0OTMsMzQ1MzQyMTIwMywxNDIzODU3NDQ5LDYwMTQ1MDQzMSwzMDA5ODM3NjE0LDMyOTQ3MTA0NTYsMTU2NzEwMzc0Niw3MTE5Mjg3MjQsMzAyMDY2ODQ3MSwzMjcyMzgwMDY1LDE1MTAzMzQyMzUsNzU1MTY3MTE3XSxjcmMzMjpmdW5jdGlvbihlKXt2YXIgdD1pLmNyeXB0by5jcmMzMlRhYmxlLG49LTE7InN0cmluZyI9PXR5cGVvZiBlJiYoZT1pLmJ1ZmZlci50b0J1ZmZlcihlKSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspbj1uPj4+OF50WzI1NSYobl5lLnJlYWRVSW50OChyKSldO3JldHVybigtMV5uKT4+PjB9LGhtYWM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG58fChuPSJiaW5hcnkiKSwiYnVmZmVyIj09PW4mJihuPXZvaWQgMCkscnx8KHI9InNoYTI1NiIpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5idWZmZXIudG9CdWZmZXIodCkpLGkuY3J5cHRvLmxpYi5jcmVhdGVIbWFjKHIsZSkudXBkYXRlKHQpLmRpZ2VzdChuKX0sbWQ1OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaS5jcnlwdG8uaGFzaCgibWQ1IixlLHQsbil9LHNoYTI1NjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGkuY3J5cHRvLmhhc2goInNoYTI1NiIsZSx0LG4pfSxoYXNoOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWkuY3J5cHRvLmNyZWF0ZUhhc2goZSk7bnx8KG49ImJpbmFyeSIpLCJidWZmZXIiPT09biYmKG49dm9pZCAwKSwic3RyaW5nIj09dHlwZW9mIHQmJih0PWkuYnVmZmVyLnRvQnVmZmVyKHQpKTt2YXIgcz1pLmFycmF5U2xpY2VGbih0KSxhPWkuQnVmZmVyLmlzQnVmZmVyKHQpO2lmKGkuaXNCcm93c2VyKCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQmJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPSEwKSxyJiYib2JqZWN0Ij09dHlwZW9mIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uJiYhYSl0Lm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7by51cGRhdGUoZSl9KSksdC5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtyKGUpfSkpLHQub24oImVuZCIsKGZ1bmN0aW9uKCl7cihudWxsLG8uZGlnZXN0KG4pKX0pKTtlbHNle2lmKCFyfHwhc3x8YXx8InVuZGVmaW5lZCI9PXR5cGVvZiBGaWxlUmVhZGVyKXtpLmlzQnJvd3NlcigpJiYib2JqZWN0Ij09dHlwZW9mIHQmJiFhJiYodD1uZXcgaS5CdWZmZXIobmV3IFVpbnQ4QXJyYXkodCkpKTt2YXIgYz1vLnVwZGF0ZSh0KS5kaWdlc3Qobik7cmV0dXJuIHImJnIobnVsbCxjKSxjfXZhciB1PTAsbD1uZXcgRmlsZVJlYWRlcjtsLm9uZXJyb3I9ZnVuY3Rpb24oKXtyKG5ldyBFcnJvcigiRmFpbGVkIHRvIHJlYWQgZGF0YS4iKSl9LGwub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IGkuQnVmZmVyKG5ldyBVaW50OEFycmF5KGwucmVzdWx0KSk7by51cGRhdGUoZSksdSs9ZS5sZW5ndGgsbC5fY29udGludWVSZWFkaW5nKCl9LGwuX2NvbnRpbnVlUmVhZGluZz1mdW5jdGlvbigpe2lmKHU+PXQuc2l6ZSlyKG51bGwsby5kaWdlc3QobikpO2Vsc2V7dmFyIGU9dSs1MjQyODg7ZT50LnNpemUmJihlPXQuc2l6ZSksbC5yZWFkQXNBcnJheUJ1ZmZlcihzLmNhbGwodCx1LGUpKX19LGwuX2NvbnRpbnVlUmVhZGluZygpfX0sdG9IZXg6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goKCIwIitlLmNoYXJDb2RlQXQobikudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIsMikpO3JldHVybiB0LmpvaW4oIiIpfSxjcmVhdGVIYXNoOmZ1bmN0aW9uKGUpe3JldHVybiBpLmNyeXB0by5saWIuY3JlYXRlSGFzaChlKX19LGFib3J0Ont9LGVhY2g6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmdC5jYWxsKHRoaXMsbixlW25dKT09PWkuYWJvcnQpYnJlYWt9LGFycmF5RWFjaDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LmNhbGwodGhpcyxlW25dLHBhcnNlSW50KG4sMTApKT09PWkuYWJvcnQpYnJlYWt9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBpLmVhY2godCwoZnVuY3Rpb24odCxuKXtlW3RdPW59KSksZX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaS51cGRhdGUoaS5jb3B5KGUpLHQpfSxjb3B5OmZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIGU7dmFyIHQ9e307Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fSxpc0VtcHR5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfSxhcnJheVNsaWNlRm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zbGljZXx8ZS53ZWJraXRTbGljZXx8ZS5tb3pTbGljZTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGx9LGlzVHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD1pLnR5cGVOYW1lKHQpKSxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk9PT0iW29iamVjdCAiK3QrIl0ifSx0eXBlTmFtZTpmdW5jdGlvbihlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpKXJldHVybiBlLm5hbWU7dmFyIHQ9ZS50b1N0cmluZygpLG49dC5tYXRjaCgvXlxzKmZ1bmN0aW9uICguKylcKC8pO3JldHVybiBuP25bMV06dH0sZXJyb3I6ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsO2Zvcih2YXIgciBpbiJzdHJpbmciPT10eXBlb2YgZS5tZXNzYWdlJiYiIiE9PWUubWVzc2FnZSYmKCJzdHJpbmciPT10eXBlb2YgdHx8dCYmdC5tZXNzYWdlKSYmKChuPWkuY29weShlKSkubWVzc2FnZT1lLm1lc3NhZ2UpLGUubWVzc2FnZT1lLm1lc3NhZ2V8fG51bGwsInN0cmluZyI9PXR5cGVvZiB0P2UubWVzc2FnZT10OiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQmJihpLnVwZGF0ZShlLHQpLHQubWVzc2FnZSYmKGUubWVzc2FnZT10Lm1lc3NhZ2UpLCh0LmNvZGV8fHQubmFtZSkmJihlLmNvZGU9dC5jb2RlfHx0Lm5hbWUpLHQuc3RhY2smJihlLnN0YWNrPXQuc3RhY2spKSwiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5JiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5hbWUiLHt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm1lc3NhZ2UiLHtlbnVtZXJhYmxlOiEwfSkpLGUubmFtZT1TdHJpbmcodCYmdC5uYW1lfHxlLm5hbWV8fGUuY29kZXx8IkVycm9yIiksZS50aW1lPW5ldyBEYXRlLG4mJihlLm9yaWdpbmFsRXJyb3I9biksdHx8e30paWYoIlsiPT09clswXSYmIl0iPT09cltyLmxlbmd0aC0xXSl7aWYoImNvZGUiPT09KHI9ci5zbGljZSgxLC0xKSl8fCJtZXNzYWdlIj09PXIpY29udGludWU7ZVsiWyIrcisiXSJdPSJTZWUgZXJyb3IuIityKyIgZm9yIGRldGFpbHMuIixPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLHt2YWx1ZTplW3JdfHx0JiZ0W3JdfHxuJiZuW3JdLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITB9KX1yZXR1cm4gZX0saW5oZXJpdDpmdW5jdGlvbihlLHQpe3ZhciBuPW51bGw7aWYodm9pZCAwPT09dCl0PWUsZT1PYmplY3Qsbj17fTtlbHNle3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuPW5ldyByfXJldHVybiB0LmNvbnN0cnVjdG9yPT09T2JqZWN0JiYodC5jb25zdHJ1Y3Rvcj1mdW5jdGlvbigpe2lmKGUhPT1PYmplY3QpcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU9bixpLnVwZGF0ZSh0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSx0LmNvbnN0cnVjdG9yLl9fc3VwZXJfXz1lLHQuY29uc3RydWN0b3J9LG1peGluOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylmb3IodmFyIG4gaW4gYXJndW1lbnRzW3RdLnByb3RvdHlwZSl7dmFyIHI9YXJndW1lbnRzW3RdLnByb3RvdHlwZVtuXTsiY29uc3RydWN0b3IiIT09biYmKGUucHJvdG90eXBlW25dPXIpfXJldHVybiBlfSxoaWRlUHJvcGVydGllczpmdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkmJmkuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9KSl9LHByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOnZvaWQgMD09PXJ8fHJ9OyJmdW5jdGlvbiIhPXR5cGVvZiBufHxvPyhpLnZhbHVlPW4saS53cml0YWJsZT0hMCk6aS5nZXQ9bixPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LGkpfSxtZW1vaXplZFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPW51bGw7aS5wcm9wZXJ0eShlLHQsKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT1vJiYobz1uKCkpLG99KSxyKX0saG9pc3RQYXlsb2FkTWVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQub3BlcmF0aW9uLHI9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW25dLG89ci5vdXRwdXQ7aWYoby5wYXlsb2FkJiYhci5oYXNFdmVudE91dHB1dCl7dmFyIHM9by5tZW1iZXJzW28ucGF5bG9hZF0sYT1lLmRhdGFbby5wYXlsb2FkXTsic3RydWN0dXJlIj09PXMudHlwZSYmaS5lYWNoKGEsKGZ1bmN0aW9uKHQsbil7aS5wcm9wZXJ0eShlLmRhdGEsdCxuLCExKX0pKX19LGNvbXB1dGVTaGEyNTY6ZnVuY3Rpb24odCxuKXtpZihpLmlzTm9kZSgpKXt2YXIgcj1pLnN0cmVhbS5TdHJlYW0sbz1lKCJmcyIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiZ0IGluc3RhbmNlb2Ygcil7aWYoInN0cmluZyIhPXR5cGVvZiB0LnBhdGgpcmV0dXJuIG4obmV3IEVycm9yKCJOb24tZmlsZSBzdHJlYW0gb2JqZWN0cyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIFNpZ1Y0IikpO3ZhciBzPXt9OyJudW1iZXIiPT10eXBlb2YgdC5zdGFydCYmKHMuc3RhcnQ9dC5zdGFydCksIm51bWJlciI9PXR5cGVvZiB0LmVuZCYmKHMuZW5kPXQuZW5kKSx0PW8uY3JlYXRlUmVhZFN0cmVhbSh0LnBhdGgscyl9fWkuY3J5cHRvLnNoYTI1Nih0LCJoZXgiLChmdW5jdGlvbihlLHQpe2U/bihlKTpuKG51bGwsdCl9KSl9LGlzQ2xvY2tTa2V3ZWQ6ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4gaS5wcm9wZXJ0eShvLmNvbmZpZywiaXNDbG9ja1NrZXdlZCIsTWF0aC5hYnMoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSk+PTNlNSwhMSksby5jb25maWcuaXNDbG9ja1NrZXdlZH0sYXBwbHlDbG9ja09mZnNldDpmdW5jdGlvbihlKXtlJiYoby5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQ9ZS0obmV3IERhdGUpLmdldFRpbWUoKSl9LGV4dHJhY3RSZXF1ZXN0SWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotcmVxdWVzdC1pZCJdfHxlLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtem4tcmVxdWVzdGlkIl07IXQmJmUuZGF0YSYmZS5kYXRhLlJlc3BvbnNlTWV0YWRhdGEmJih0PWUuZGF0YS5SZXNwb25zZU1ldGFkYXRhLlJlcXVlc3RJZCksdCYmKGUucmVxdWVzdElkPXQpLGUuZXJyb3ImJihlLmVycm9yLnJlcXVlc3RJZD10KX0sYWRkUHJvbWlzZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTt2b2lkIDA9PT10JiZvJiZvLmNvbmZpZyYmKHQ9by5jb25maWcuZ2V0UHJvbWlzZXNEZXBlbmRlbmN5KCkpLHZvaWQgMD09PXQmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSYmKHQ9UHJvbWlzZSksImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihuPSEwKSxBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO24/aS5kZWxldGVQcm9taXNlc0Zyb21DbGFzcyYmaS5kZWxldGVQcm9taXNlc0Zyb21DbGFzcygpOmkuYWRkUHJvbWlzZXNUb0NsYXNzJiZpLmFkZFByb21pc2VzVG9DbGFzcyh0KX19LHByb21pc2lmeU1ldGhvZDpmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiBuZXcgdCgoZnVuY3Rpb24odCxvKXtyLnB1c2goKGZ1bmN0aW9uKGUsbil7ZT9vKGUpOnQobil9KSksbltlXS5hcHBseShuLHIpfSkpfX0saXNEdWFsc3RhY2tBdmFpbGFibGU6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7dmFyIG49ZSgiLi4vYXBpcy9tZXRhZGF0YS5qc29uIik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYodD10LnNlcnZpY2VJZGVudGlmaWVyKSwhKCJzdHJpbmciIT10eXBlb2YgdHx8IW4uaGFzT3duUHJvcGVydHkodCl8fCFuW3RdLmR1YWxzdGFja0F2YWlsYWJsZSl9LGNhbGN1bGF0ZVJldHJ5RGVsYXk6ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KTt2YXIgcj10LmN1c3RvbUJhY2tvZmZ8fG51bGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIpcmV0dXJuIHIoZSxuKTt2YXIgbz0ibnVtYmVyIj09dHlwZW9mIHQuYmFzZT90LmJhc2U6MTAwO3JldHVybiBNYXRoLnJhbmRvbSgpKihNYXRoLnBvdygyLGUpKm8pfSxoYW5kbGVSZXF1ZXN0V2l0aFJldHJpZXM6ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KTt2YXIgcj1vLkh0dHBDbGllbnQuZ2V0SW5zdGFuY2UoKSxzPXQuaHR0cE9wdGlvbnN8fHt9LGE9MCxjPWZ1bmN0aW9uKGUpe3ZhciByPXQubWF4UmV0cmllc3x8MDtpZihlJiYiVGltZW91dEVycm9yIj09PWUuY29kZSYmKGUucmV0cnlhYmxlPSEwKSxlJiZlLnJldHJ5YWJsZSYmYTxyKXt2YXIgbz1pLmNhbGN1bGF0ZVJldHJ5RGVsYXkoYSx0LnJldHJ5RGVsYXlPcHRpb25zLGUpO2lmKG8+PTApcmV0dXJuIGErKyx2b2lkIHNldFRpbWVvdXQodSxvKyhlLnJldHJ5QWZ0ZXJ8fDApKX1uKGUpfSx1PWZ1bmN0aW9uKCl7dmFyIHQ9IiI7ci5oYW5kbGVSZXF1ZXN0KGUscywoZnVuY3Rpb24oZSl7ZS5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe3QrPWUudG9TdHJpbmcoKX0pKSxlLm9uKCJlbmQiLChmdW5jdGlvbigpe3ZhciByPWUuc3RhdHVzQ29kZTtpZihyPDMwMCluKG51bGwsdCk7ZWxzZXt2YXIgbz0xZTMqcGFyc2VJbnQoZS5oZWFkZXJzWyJyZXRyeS1hZnRlciJdLDEwKXx8MCxzPWkuZXJyb3IobmV3IEVycm9yLHtzdGF0dXNDb2RlOnIscmV0cnlhYmxlOnI+PTUwMHx8NDI5PT09cn0pO28mJnMucmV0cnlhYmxlJiYocy5yZXRyeUFmdGVyPW8pLGMocyl9fSkpfSksYyl9O28udXRpbC5kZWZlcih1KX0sdXVpZDp7djQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgidXVpZCIpLnY0KCl9fSxjb252ZXJ0UGF5bG9hZFRvU3RyaW5nOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQub3BlcmF0aW9uLHI9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW25dLm91dHB1dHx8e307ci5wYXlsb2FkJiZlLmRhdGFbci5wYXlsb2FkXSYmKGUuZGF0YVtyLnBheWxvYWRdPWUuZGF0YVtyLnBheWxvYWRdLnRvU3RyaW5nKCkpfSxkZWZlcjpmdW5jdGlvbihlKXsib2JqZWN0Ij09dHlwZW9mIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLm5leHRUaWNrP24ubmV4dFRpY2soZSk6ImZ1bmN0aW9uIj09dHlwZW9mIHI/cihlKTpzZXRUaW1lb3V0KGUsMCl9LGdldFJlcXVlc3RQYXlsb2FkU2hhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zO2lmKHQpe3ZhciBuPSh0fHx7fSlbZS5vcGVyYXRpb25dO2lmKG4mJm4uaW5wdXQmJm4uaW5wdXQucGF5bG9hZClyZXR1cm4gbi5pbnB1dC5tZW1iZXJzW24uaW5wdXQucGF5bG9hZF19fSxnZXRQcm9maWxlc0Zyb21TaGFyZWRDb25maWc6ZnVuY3Rpb24oZSx0KXt2YXIgcj17fSxvPXt9O24uZW52W2kuY29uZmlnT3B0SW5FbnZdJiYobz1lLmxvYWRGcm9tKHtpc0NvbmZpZzohMCxmaWxlbmFtZTpuLmVudltpLnNoYXJlZENvbmZpZ0ZpbGVFbnZdfSkpO3ZhciBzPXt9O3RyeXtzPWUubG9hZEZyb20oe2ZpbGVuYW1lOnR8fG4uZW52W2kuY29uZmlnT3B0SW5FbnZdJiZuLmVudltpLnNoYXJlZENyZWRlbnRpYWxzRmlsZUVudl19KX1jYXRjaChlKXtpZighbi5lbnZbaS5jb25maWdPcHRJbkVudl0pdGhyb3cgZX1mb3IodmFyIGE9MCxjPU9iamVjdC5rZXlzKG8pO2E8Yy5sZW5ndGg7YSsrKXJbY1thXV09dShyW2NbYV1dfHx7fSxvW2NbYV1dKTtmb3IoYT0wLGM9T2JqZWN0LmtleXMocyk7YTxjLmxlbmd0aDthKyspcltjW2FdXT11KHJbY1thXV18fHt9LHNbY1thXV0pO3JldHVybiByO2Z1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49MCxyPU9iamVjdC5rZXlzKHQpO248ci5sZW5ndGg7bisrKWVbcltuXV09dFtyW25dXTtyZXR1cm4gZX19LEFSTjp7dmFsaWRhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJjA9PT1lLmluZGV4T2YoImFybjoiKSYmZS5zcGxpdCgiOiIpLmxlbmd0aD49Nn0scGFyc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcGxpdCgiOiIpO3JldHVybntwYXJ0aXRpb246dFsxXSxzZXJ2aWNlOnRbMl0scmVnaW9uOnRbM10sYWNjb3VudElkOnRbNF0scmVzb3VyY2U6dC5zbGljZSg1KS5qb2luKCI6Iil9fSxidWlsZDpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lLnNlcnZpY2V8fHZvaWQgMD09PWUucmVnaW9ufHx2b2lkIDA9PT1lLmFjY291bnRJZHx8dm9pZCAwPT09ZS5yZXNvdXJjZSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiSW5wdXQgQVJOIG9iamVjdCBpcyBpbnZhbGlkIikpO3JldHVybiJhcm46IisoZS5wYXJ0aXRpb258fCJhd3MiKSsiOiIrZS5zZXJ2aWNlKyI6IitlLnJlZ2lvbisiOiIrZS5hY2NvdW50SWQrIjoiK2UucmVzb3VyY2V9fSxkZWZhdWx0UHJvZmlsZToiZGVmYXVsdCIsY29uZmlnT3B0SW5FbnY6IkFXU19TREtfTE9BRF9DT05GSUciLHNoYXJlZENyZWRlbnRpYWxzRmlsZUVudjoiQVdTX1NIQVJFRF9DUkVERU5USUFMU19GSUxFIixzaGFyZWRDb25maWdGaWxlRW52OiJBV1NfQ09ORklHX0ZJTEUiLGltZHNEaXNhYmxlZEVudjoiQVdTX0VDMl9NRVRBREFUQV9ESVNBQkxFRCJ9O3QuZXhwb3J0cz1pfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLGUoInRpbWVycyIpLnNldEltbWVkaWF0ZSl9LHsiLi4vYXBpcy9tZXRhZGF0YS5qc29uIjo0LCIuL2NvcmUiOjE5LF9wcm9jZXNzOjkxLGZzOjgyLHRpbWVyczo5OSx1dWlkOjEwMn1dLDc1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vbW9kZWwvc2hhcGUiKTtmdW5jdGlvbiBpKCl7fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSxyPTAsbz1uLmxlbmd0aDtyPG87cisrKWlmKG5bcl0ucGFyZW50Tm9kZT09PWUpcmV0dXJuIG5bcl19ZnVuY3Rpb24gYShlLHQpe3N3aXRjaCh0fHwodD17fSksdC50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIGMoZSx0KTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXt9LHI9dC5rZXkubmFtZXx8ImtleSIsbz10LnZhbHVlLm5hbWV8fCJ2YWx1ZSIsaT10LmZsYXR0ZW5lZD90Lm5hbWU6ImVudHJ5IixjPWUuZmlyc3RFbGVtZW50Q2hpbGQ7Yzspe2lmKGMubm9kZU5hbWU9PT1pKXt2YXIgdT1zKGMscikudGV4dENvbnRlbnQsbD1zKGMsbyk7blt1XT1hKGwsdC52YWx1ZSl9Yz1jLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gbn0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPXQuZmxhdHRlbmVkP3QubmFtZTp0Lm1lbWJlci5uYW1lfHwibWVtYmVyIixvPWUuZmlyc3RFbGVtZW50Q2hpbGQ7bzspby5ub2RlTmFtZT09PXImJm4ucHVzaChhKG8sdC5tZW1iZXIpKSxvPW8ubmV4dEVsZW1lbnRTaWJsaW5nO3JldHVybiBufShlLHQpO2Nhc2Ugdm9pZCAwOmNhc2UgbnVsbDpyZXR1cm4gZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4iIjtpZighZS5maXJzdEVsZW1lbnRDaGlsZClyZXR1cm4gbnVsbD09PWUucGFyZW50Tm9kZS5wYXJlbnROb2RlP3t9OjA9PT1lLmNoaWxkTm9kZXMubGVuZ3RoPyIiOmUudGV4dENvbnRlbnQ7Zm9yKHZhciB0PXt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319LG49ZS5maXJzdEVsZW1lbnRDaGlsZDtuOyl7dmFyIHI9bi5ub2RlTmFtZTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodC5tZW1iZXJzLHIpP3QubWVtYmVyc1tyXS50eXBlPSJsaXN0Ijp0Lm1lbWJlcnNbcl09e25hbWU6cn0sbj1uLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gYyhlLHQpfShlKTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe2lmKGUuZ2V0QXR0cmlidXRlKXt2YXIgbj1lLmdldEF0dHJpYnV0ZSgiZW5jb2RpbmciKTsiYmFzZTY0Ij09PW4mJih0PW5ldyBvLmNyZWF0ZSh7dHlwZTpufSkpfXZhciByPWUudGV4dENvbnRlbnQ7cmV0dXJuIiI9PT1yJiYocj1udWxsKSwiZnVuY3Rpb24iPT10eXBlb2YgdC50b1R5cGU/dC50b1R5cGUocik6cn0oZSx0KX19ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPXt9O3JldHVybiBudWxsPT09ZXx8ci5lYWNoKHQubWVtYmVycywoZnVuY3Rpb24ocixvKXtpZihvLmlzWG1sQXR0cmlidXRlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5hdHRyaWJ1dGVzLG8ubmFtZSkpe3ZhciBpPWUuYXR0cmlidXRlc1tvLm5hbWVdLnZhbHVlO25bcl09YSh7dGV4dENvbnRlbnQ6aX0sbyl9fWVsc2V7dmFyIGM9by5mbGF0dGVuZWQ/ZTpzKGUsby5uYW1lKTtjP25bcl09YShjLG8pOm8uZmxhdHRlbmVkfHwibGlzdCIhPT1vLnR5cGV8fHQuYXBpLnhtbE5vRGVmYXVsdExpc3RzfHwobltyXT1vLmRlZmF1bHRWYWx1ZSl9fSkpLG59aS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0KXtpZigiIj09PWUucmVwbGFjZSgvXlxzKy8sIiIpKXJldHVybnt9O3ZhciBuLG87dHJ5e2lmKHdpbmRvdy5ET01QYXJzZXIpe3RyeXtuPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiUGFyc2UgZXJyb3IgaW4gZG9jdW1lbnQiKSx7b3JpZ2luYWxFcnJvcjplLGNvZGU6IlhNTFBhcnNlckVycm9yIixyZXRyeWFibGU6ITB9KX1pZihudWxsPT09bi5kb2N1bWVudEVsZW1lbnQpdGhyb3cgci5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBlbXB0eSBkb2N1bWVudC4iKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pO3ZhciBpPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIilbMF07aWYoaSYmKGkucGFyZW50Tm9kZT09PW58fCJib2R5Ij09PWkucGFyZW50Tm9kZS5ub2RlTmFtZXx8aS5wYXJlbnROb2RlLnBhcmVudE5vZGU9PT1ufHwiYm9keSI9PT1pLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpe3ZhciBjPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpWzBdfHxpO3Rocm93IHIuZXJyb3IobmV3IEVycm9yKGMudGV4dENvbnRlbnR8fCJQYXJzZXIgZXJyb3IgaW4gZG9jdW1lbnQiKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfX1lbHNle2lmKCF3aW5kb3cuQWN0aXZlWE9iamVjdCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIFhNTCBwYXJzZXIiKTtpZigobj1uZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSkuYXN5bmM9ITEsIW4ubG9hZFhNTChlKSl0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiUGFyc2UgZXJyb3IgaW4gZG9jdW1lbnQiKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfX1jYXRjaChlKXtvPWV9aWYobiYmbi5kb2N1bWVudEVsZW1lbnQmJiFvKXt2YXIgdT1hKG4uZG9jdW1lbnRFbGVtZW50LHQpLGw9cyhuLmRvY3VtZW50RWxlbWVudCwiUmVzcG9uc2VNZXRhZGF0YSIpO3JldHVybiBsJiYodS5SZXNwb25zZU1ldGFkYXRhPWEobCx7fSkpLHV9aWYobyl0aHJvdyByLmVycm9yKG98fG5ldyBFcnJvcix7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pO3JldHVybnt9fSx0LmV4cG9ydHM9aX0seyIuLi9tb2RlbC9zaGFwZSI6NDUsIi4uL3V0aWwiOjc0fV0sNzY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuL3htbC1ub2RlIikuWG1sTm9kZSxpPWUoIi4veG1sLXRleHQiKS5YbWxUZXh0O2Z1bmN0aW9uIHMoKXt9ZnVuY3Rpb24gYShlLHQsbil7c3dpdGNoKG4udHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQsbil7ci5hcnJheUVhY2gobi5tZW1iZXJOYW1lcywoZnVuY3Rpb24ocil7dmFyIGk9bi5tZW1iZXJzW3JdO2lmKCJib2R5Ij09PWkubG9jYXRpb24pe3ZhciBzPXRbcl0sdT1pLm5hbWU7aWYobnVsbCE9cylpZihpLmlzWG1sQXR0cmlidXRlKWUuYWRkQXR0cmlidXRlKHUscyk7ZWxzZSBpZihpLmZsYXR0ZW5lZClhKGUscyxpKTtlbHNle3ZhciBsPW5ldyBvKHUpO2UuYWRkQ2hpbGROb2RlKGwpLGMobCxpKSxhKGwscyxpKX19fSkpfShlLHQsbik7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIGk9bi5rZXkubmFtZXx8ImtleSIscz1uLnZhbHVlLm5hbWV8fCJ2YWx1ZSI7ci5lYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIGM9bmV3IG8obi5mbGF0dGVuZWQ/bi5uYW1lOiJlbnRyeSIpO2UuYWRkQ2hpbGROb2RlKGMpO3ZhciB1PW5ldyBvKGkpLGw9bmV3IG8ocyk7Yy5hZGRDaGlsZE5vZGUodSksYy5hZGRDaGlsZE5vZGUobCksYSh1LHQsbi5rZXkpLGEobCxyLG4udmFsdWUpfSkpfShlLHQsbik7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe24uZmxhdHRlbmVkP3IuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciByPW4ubWVtYmVyLm5hbWV8fG4ubmFtZSxpPW5ldyBvKHIpO2UuYWRkQ2hpbGROb2RlKGkpLGEoaSx0LG4ubWVtYmVyKX0pKTpyLmFycmF5RWFjaCh0LChmdW5jdGlvbih0KXt2YXIgcj1uLm1lbWJlci5uYW1lfHwibWVtYmVyIixpPW5ldyBvKHIpO2UuYWRkQ2hpbGROb2RlKGkpLGEoaSx0LG4ubWVtYmVyKX0pKX0oZSx0LG4pO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtlLmFkZENoaWxkTm9kZShuZXcgaShuLnRvV2lyZUZvcm1hdCh0KSkpfShlLHQsbil9fWZ1bmN0aW9uIGMoZSx0LG4pe3ZhciByLG89InhtbG5zIjt0LnhtbE5hbWVzcGFjZVVyaT8ocj10LnhtbE5hbWVzcGFjZVVyaSx0LnhtbE5hbWVzcGFjZVByZWZpeCYmKG8rPSI6Iit0LnhtbE5hbWVzcGFjZVByZWZpeCkpOm4mJnQuYXBpLnhtbE5hbWVzcGFjZVVyaSYmKHI9dC5hcGkueG1sTmFtZXNwYWNlVXJpKSxyJiZlLmFkZEF0dHJpYnV0ZShvLHIpfXMucHJvdG90eXBlLnRvWE1MPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPW5ldyBvKG4pO3JldHVybiBjKGksdCwhMCksYShpLGUsdCksaS5jaGlsZHJlbi5sZW5ndGg+MHx8cj9pLnRvU3RyaW5nKCk6IiJ9LHQuZXhwb3J0cz1zfSx7Ii4uL3V0aWwiOjc0LCIuL3htbC1ub2RlIjo3OSwiLi94bWwtdGV4dCI6ODB9XSw3NzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17ZXNjYXBlQXR0cmlidXRlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC8nL2csIiZhcG9zOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iil9fX0se31dLDc4OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtlc2NhcGVFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC9cci9nLCImI3gwRDsiKS5yZXBsYWNlKC9cbi9nLCImI3gwQTsiKS5yZXBsYWNlKC9cdTAwODUvZywiJiN4ODU7IikucmVwbGFjZSgvXHUyMDI4LywiJiN4MjAyODsiKX19fSx7fV0sNzk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2VzY2FwZS1hdHRyaWJ1dGUiKS5lc2NhcGVBdHRyaWJ1dGU7ZnVuY3Rpb24gbyhlLHQpe3ZvaWQgMD09PXQmJih0PVtdKSx0aGlzLm5hbWU9ZSx0aGlzLmNoaWxkcmVuPXQsdGhpcy5hdHRyaWJ1dGVzPXt9fW8ucHJvdG90eXBlLmFkZEF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbZV09dCx0aGlzfSxvLnByb3RvdHlwZS5hZGRDaGlsZE5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ucHVzaChlKSx0aGlzfSxvLnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbZV0sdGhpc30sby5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9Qm9vbGVhbih0aGlzLmNoaWxkcmVuLmxlbmd0aCksdD0iPCIrdGhpcy5uYW1lLG49dGhpcy5hdHRyaWJ1dGVzLG89MCxpPU9iamVjdC5rZXlzKG4pO288aS5sZW5ndGg7bysrKXt2YXIgcz1pW29dLGE9bltzXTtudWxsIT1hJiYodCs9IiAiK3MrJz0iJytyKCIiK2EpKyciJyl9cmV0dXJuIHQrKGU/Ij4iK3RoaXMuY2hpbGRyZW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkpLmpvaW4oIiIpKyI8LyIrdGhpcy5uYW1lKyI+IjoiLz4iKX0sdC5leHBvcnRzPXtYbWxOb2RlOm99fSx7Ii4vZXNjYXBlLWF0dHJpYnV0ZSI6Nzd9XSw4MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vZXNjYXBlLWVsZW1lbnQiKS5lc2NhcGVFbGVtZW50O2Z1bmN0aW9uIG8oZSl7dGhpcy52YWx1ZT1lfW8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHIoIiIrdGhpcy52YWx1ZSl9LHQuZXhwb3J0cz17WG1sVGV4dDpvfX0seyIuL2VzY2FwZS1lbGVtZW50Ijo3OH1dLDgxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24uYnl0ZUxlbmd0aD1mdW5jdGlvbihlKXt2YXIgdD1jKGUpLG49dFswXSxyPXRbMV07cmV0dXJuIDMqKG4rcikvNC1yfSxuLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1jKGUpLHM9clswXSxhPXJbMV0sdT1uZXcgaShmdW5jdGlvbihlLHQsbil7cmV0dXJuIDMqKHQrbikvNC1ufSgwLHMsYSkpLGw9MCxwPWE+MD9zLTQ6cztmb3Iobj0wO248cDtuKz00KXQ9b1tlLmNoYXJDb2RlQXQobildPDwxOHxvW2UuY2hhckNvZGVBdChuKzEpXTw8MTJ8b1tlLmNoYXJDb2RlQXQobisyKV08PDZ8b1tlLmNoYXJDb2RlQXQobiszKV0sdVtsKytdPXQ+PjE2JjI1NSx1W2wrK109dD4+OCYyNTUsdVtsKytdPTI1NSZ0O3JldHVybiAyPT09YSYmKHQ9b1tlLmNoYXJDb2RlQXQobildPDwyfG9bZS5jaGFyQ29kZUF0KG4rMSldPj40LHVbbCsrXT0yNTUmdCksMT09PWEmJih0PW9bZS5jaGFyQ29kZUF0KG4pXTw8MTB8b1tlLmNoYXJDb2RlQXQobisxKV08PDR8b1tlLmNoYXJDb2RlQXQobisyKV0+PjIsdVtsKytdPXQ+PjgmMjU1LHVbbCsrXT0yNTUmdCksdX0sbi5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPWUubGVuZ3RoLG89biUzLGk9W10scz0xNjM4MyxhPTAsYz1uLW87YTxjO2ErPXMpaS5wdXNoKHUoZSxhLGErcz5jP2M6YStzKSk7cmV0dXJuIDE9PT1vPyh0PWVbbi0xXSxpLnB1c2goclt0Pj4yXStyW3Q8PDQmNjNdKyI9PSIpKToyPT09byYmKHQ9KGVbbi0yXTw8OCkrZVtuLTFdLGkucHVzaChyW3Q+PjEwXStyW3Q+PjQmNjNdK3JbdDw8MiY2M10rIj0iKSksaS5qb2luKCIiKX07Zm9yKHZhciByPVtdLG89W10saT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxzPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixhPTA7YTw2NDsrK2EpclthXT1zW2FdLG9bcy5jaGFyQ29kZUF0KGEpXT1hO2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodCU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49ZS5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj10KSxbbixuPT09dD8wOjQtbiU0XX1mdW5jdGlvbiB1KGUsdCxuKXtmb3IodmFyIG8saSxzPVtdLGE9dDthPG47YSs9MylvPShlW2FdPDwxNiYxNjcxMTY4MCkrKGVbYSsxXTw8OCY2NTI4MCkrKDI1NSZlW2ErMl0pLHMucHVzaChyWyhpPW8pPj4xOCY2M10rcltpPj4xMiY2M10rcltpPj42JjYzXStyWzYzJmldKTtyZXR1cm4gcy5qb2luKCIiKX1vWyItIi5jaGFyQ29kZUF0KDApXT02MixvWyJfIi5jaGFyQ29kZUF0KDApXT02M30se31dLDgyOltmdW5jdGlvbihlLHQsbil7fSx7fV0sODM6W2Z1bmN0aW9uKGUsdCxuKXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTp0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10O3ZhciBuPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgbixlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lfX0se31dLDg0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvcHkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmZpbGwmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRVSW50OH19LHt9XSw4NTpbZnVuY3Rpb24oZSx0LHIpeyhmdW5jdGlvbih0LG4peyhmdW5jdGlvbigpe3ZhciBvPS8lW3NkaiVdL2c7ci5mb3JtYXQ9ZnVuY3Rpb24oZSl7aWYoIXYoZSkpe2Zvcih2YXIgdD1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYShhcmd1bWVudHNbbl0pKTtyZXR1cm4gdC5qb2luKCIgIil9bj0xO2Zvcih2YXIgcj1hcmd1bWVudHMsaT1yLmxlbmd0aCxzPVN0cmluZyhlKS5yZXBsYWNlKG8sKGZ1bmN0aW9uKGUpe2lmKCIlJSI9PT1lKXJldHVybiIlIjtpZihuPj1pKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKHJbbisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihyW24rK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocltuKytdKX1jYXRjaChlKXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gZX19KSksYz1yW25dO248aTtjPXJbKytuXSlnKGMpfHwhUyhjKT9zKz0iICIrYzpzKz0iICIrYShjKTtyZXR1cm4gc30sci5kZXByZWNhdGU9ZnVuY3Rpb24oZSxvKXtpZih5KG4ucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHIuZGVwcmVjYXRlKGUsbykuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PXQubm9EZXByZWNhdGlvbilyZXR1cm4gZTt2YXIgaT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighaSl7aWYodC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihvKTt0LnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShvKTpjb25zb2xlLmVycm9yKG8pLGk9ITB9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX07dmFyIGkscz17fTtmdW5jdGlvbiBhKGUsdCl7dmFyIG49e3NlZW46W10sc3R5bGl6ZTp1fTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKG4uZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYobi5jb2xvcnM9YXJndW1lbnRzWzNdKSxmKHQpP24uc2hvd0hpZGRlbj10OnQmJnIuX2V4dGVuZChuLHQpLHkobi5zaG93SGlkZGVuKSYmKG4uc2hvd0hpZGRlbj0hMSkseShuLmRlcHRoKSYmKG4uZGVwdGg9MikseShuLmNvbG9ycykmJihuLmNvbG9ycz0hMSkseShuLmN1c3RvbUluc3BlY3QpJiYobi5jdXN0b21JbnNwZWN0PSEwKSxuLmNvbG9ycyYmKG4uc3R5bGl6ZT1jKSxsKG4sZSxuLmRlcHRoKX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49YS5zdHlsZXNbdF07cmV0dXJuIG4/IhtbIithLmNvbG9yc1tuXVswXSsibSIrZSsiG1siK2EuY29sb3JzW25dWzFdKyJtIjplfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gZX1mdW5jdGlvbiBsKGUsdCxuKXtpZihlLmN1c3RvbUluc3BlY3QmJnQmJlQodC5pbnNwZWN0KSYmdC5pbnNwZWN0IT09ci5pbnNwZWN0JiYoIXQuY29uc3RydWN0b3J8fHQuY29uc3RydWN0b3IucHJvdG90eXBlIT09dCkpe3ZhciBvPXQuaW5zcGVjdChuLGUpO3JldHVybiB2KG8pfHwobz1sKGUsbyxuKSksb312YXIgaT1mdW5jdGlvbihlLHQpe2lmKHkodCkpcmV0dXJuIGUuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYodih0KSl7dmFyIG49IiciK0pTT04uc3RyaW5naWZ5KHQpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIGUuc3R5bGl6ZShuLCJzdHJpbmciKX1yZXR1cm4gbSh0KT9lLnN0eWxpemUoIiIrdCwibnVtYmVyIik6Zih0KT9lLnN0eWxpemUoIiIrdCwiYm9vbGVhbiIpOmcodCk/ZS5zdHlsaXplKCJudWxsIiwibnVsbCIpOnZvaWQgMH0oZSx0KTtpZihpKXJldHVybiBpO3ZhciBzPU9iamVjdC5rZXlzKHQpLGE9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt0W2VdPSEwfSkpLHR9KHMpO2lmKGUuc2hvd0hpZGRlbiYmKHM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkpLEModCkmJihzLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8cy5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gcCh0KTtpZigwPT09cy5sZW5ndGgpe2lmKFQodCkpe3ZhciBjPXQubmFtZT8iOiAiK3QubmFtZToiIjtyZXR1cm4gZS5zdHlsaXplKCJbRnVuY3Rpb24iK2MrIl0iLCJzcGVjaWFsIil9aWYoRSh0KSlyZXR1cm4gZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSwicmVnZXhwIik7aWYoYih0KSlyZXR1cm4gZS5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksImRhdGUiKTtpZihDKHQpKXJldHVybiBwKHQpfXZhciB1LFM9IiIsST0hMSxBPVsieyIsIn0iXTtyZXR1cm4gaCh0KSYmKEk9ITAsQT1bIlsiLCJdIl0pLFQodCkmJihTPSIgW0Z1bmN0aW9uIisodC5uYW1lPyI6ICIrdC5uYW1lOiIiKSsiXSIpLEUodCkmJihTPSIgIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLGIodCkmJihTPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHQpKSxDKHQpJiYoUz0iICIrcCh0KSksMCE9PXMubGVuZ3RofHxJJiYwIT10Lmxlbmd0aD9uPDA/RSh0KT9lLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJyZWdleHAiKTplLnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOihlLnNlZW4ucHVzaCh0KSx1PUk/ZnVuY3Rpb24oZSx0LG4scixvKXtmb3IodmFyIGk9W10scz0wLGE9dC5sZW5ndGg7czxhOysrcyl3KHQsU3RyaW5nKHMpKT9pLnB1c2goZChlLHQsbixyLFN0cmluZyhzKSwhMCkpOmkucHVzaCgiIik7cmV0dXJuIG8uZm9yRWFjaCgoZnVuY3Rpb24obyl7by5tYXRjaCgvXlxkKyQvKXx8aS5wdXNoKGQoZSx0LG4scixvLCEwKSl9KSksaX0oZSx0LG4sYSxzKTpzLm1hcCgoZnVuY3Rpb24ocil7cmV0dXJuIGQoZSx0LG4sYSxyLEkpfSkpLGUuc2Vlbi5wb3AoKSxmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaW5kZXhPZigiXG4iKSxlK3QucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKTtyZXR1cm4gcj42MD9uWzBdKygiIj09PXQ/IiI6dCsiXG4gIikrIiAiK2Uuam9pbigiLFxuICAiKSsiICIrblsxXTpuWzBdK3QrIiAiK2Uuam9pbigiLCAiKSsiICIrblsxXX0odSxTLEEpKTpBWzBdK1MrQVsxXX1mdW5jdGlvbiBwKGUpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSsiXSJ9ZnVuY3Rpb24gZChlLHQsbixyLG8saSl7dmFyIHMsYSxjO2lmKChjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxvKXx8e3ZhbHVlOnRbb119KS5nZXQ/YT1jLnNldD9lLnN0eWxpemUoIltHZXR0ZXIvU2V0dGVyXSIsInNwZWNpYWwiKTplLnN0eWxpemUoIltHZXR0ZXJdIiwic3BlY2lhbCIpOmMuc2V0JiYoYT1lLnN0eWxpemUoIltTZXR0ZXJdIiwic3BlY2lhbCIpKSx3KHIsbyl8fChzPSJbIitvKyJdIiksYXx8KGUuc2Vlbi5pbmRleE9mKGMudmFsdWUpPDA/KGE9ZyhuKT9sKGUsYy52YWx1ZSxudWxsKTpsKGUsYy52YWx1ZSxuLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYoYT1pP2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4iICAiK2V9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIithLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIiAgICIrZX0pKS5qb2luKCJcbiIpKTphPWUuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSkseShzKSl7aWYoaSYmby5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gYTsocz1KU09OLnN0cmluZ2lmeSgiIitvKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9ZS5zdHlsaXplKHMsIm5hbWUiKSk6KHM9cy5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIikscz1lLnN0eWxpemUocywic3RyaW5nIikpfXJldHVybiBzKyI6ICIrYX1mdW5jdGlvbiBoKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIGYoZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZX1mdW5jdGlvbiBnKGUpe3JldHVybiBudWxsPT09ZX1mdW5jdGlvbiBtKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX1mdW5jdGlvbiB2KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX1mdW5jdGlvbiB5KGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIEUoZSl7cmV0dXJuIFMoZSkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09SShlKX1mdW5jdGlvbiBTKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gYihlKXtyZXR1cm4gUyhlKSYmIltvYmplY3QgRGF0ZV0iPT09SShlKX1mdW5jdGlvbiBDKGUpe3JldHVybiBTKGUpJiYoIltvYmplY3QgRXJyb3JdIj09PUkoZSl8fGUgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gVChlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBJKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gQShlKXtyZXR1cm4gZTwxMD8iMCIrZS50b1N0cmluZygxMCk6ZS50b1N0cmluZygxMCl9ci5kZWJ1Z2xvZz1mdW5jdGlvbihlKXtpZih5KGkpJiYoaT10LmVudi5OT0RFX0RFQlVHfHwiIiksZT1lLnRvVXBwZXJDYXNlKCksIXNbZV0paWYobmV3IFJlZ0V4cCgiXFxiIitlKyJcXGIiLCJpIikudGVzdChpKSl7dmFyIG49dC5waWQ7c1tlXT1mdW5jdGlvbigpe3ZhciB0PXIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKTtjb25zb2xlLmVycm9yKCIlcyAlZDogJXMiLGUsbix0KX19ZWxzZSBzW2VdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gc1tlXX0sci5pbnNwZWN0PWEsYS5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LGEuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sci5pc0FycmF5PWgsci5pc0Jvb2xlYW49ZixyLmlzTnVsbD1nLHIuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9LHIuaXNOdW1iZXI9bSxyLmlzU3RyaW5nPXYsci5pc1N5bWJvbD1mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGV9LHIuaXNVbmRlZmluZWQ9eSxyLmlzUmVnRXhwPUUsci5pc09iamVjdD1TLHIuaXNEYXRlPWIsci5pc0Vycm9yPUMsci5pc0Z1bmN0aW9uPVQsci5pc1ByaW1pdGl2ZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV8fCJib29sZWFuIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN0cmluZyI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fHZvaWQgMD09PWV9LHIuaXNCdWZmZXI9ZSgiLi9zdXBwb3J0L2lzQnVmZmVyIik7dmFyIF89WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXTtmdW5jdGlvbiB3KGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXIubG9nPWZ1bmN0aW9uKCl7dmFyIGUsdDtjb25zb2xlLmxvZygiJXMgLSAlcyIsKGU9bmV3IERhdGUsdD1bQShlLmdldEhvdXJzKCkpLEEoZS5nZXRNaW51dGVzKCkpLEEoZS5nZXRTZWNvbmRzKCkpXS5qb2luKCI6IiksW2UuZ2V0RGF0ZSgpLF9bZS5nZXRNb250aCgpXSx0XS5qb2luKCIgIikpLHIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKSl9LHIuaW5oZXJpdHM9ZSgiaW5oZXJpdHMiKSxyLl9leHRlbmQ9ZnVuY3Rpb24oZSx0KXtpZighdHx8IVModCkpcmV0dXJuIGU7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHQpLHI9bi5sZW5ndGg7ci0tOyllW25bcl1dPXRbbltyXV07cmV0dXJuIGV9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLHZvaWQgMCE9PW4uZz9uLmc6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL3N1cHBvcnQvaXNCdWZmZXIiOjg0LF9wcm9jZXNzOjkxLGluaGVyaXRzOjgzfV0sODY6W2Z1bmN0aW9uKGUsdCxyKXsoZnVuY3Rpb24odCxuKXsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIG49ZSgiYmFzZTY0LWpzIiksbz1lKCJpZWVlNzU0IiksaT1lKCJpc2FycmF5Iik7ZnVuY3Rpb24gcygpe3JldHVybiBjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIGEoZSx0KXtpZihzKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189Yy5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgYyh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBjKGUsdCxuKXtpZighKGMuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGMpKXJldHVybiBuZXcgYyhlLHQsbik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBwKHRoaXMsZSl9cmV0dXJuIHUodGhpcyxlLHQsbil9ZnVuY3Rpb24gdShlLHQsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQsbixyKXtpZih0LmJ5dGVMZW5ndGgsbjwwfHx0LmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiB0PXZvaWQgMD09PW4mJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0LG4pOm5ldyBVaW50OEFycmF5KHQsbixyKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPWMucHJvdG90eXBlOmU9ZChlLHQpLGV9KGUsdCxuLHIpOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQsbil7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4IiksIWMuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGYodCxuKSxvPShlPWEoZSxyKSkud3JpdGUodCxuKTtyZXR1cm4gbyE9PXImJihlPWUuc2xpY2UoMCxvKSksZX0oZSx0LG4pOmZ1bmN0aW9uKGUsdCl7aWYoYy5pc0J1ZmZlcih0KSl7dmFyIG49MHxoKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPWEoZSxuKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsbiksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KHI9dC5sZW5ndGgpIT1yP2EoZSwwKTpkKGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJmkodC5kYXRhKSlyZXR1cm4gZChlLHQuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIGwoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBwKGUsdCl7aWYobCh0KSxlPWEoZSx0PDA/MDowfGgodCkpLCFjLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjx0OysrbillW25dPTA7cmV0dXJuIGV9ZnVuY3Rpb24gZChlLHQpe3ZhciBuPXQubGVuZ3RoPDA/MDowfGgodC5sZW5ndGgpO2U9YShlLG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKWVbcl09MjU1JnRbcl07cmV0dXJuIGV9ZnVuY3Rpb24gaChlKXtpZihlPj1zKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK3MoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gZihlLHQpe2lmKGMuaXNCdWZmZXIoZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciBuPWUubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEIoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipuO2Nhc2UiaGV4IjpyZXR1cm4gbj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBqKGUpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIEIoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gZyhlLHQsbil7dmFyIHI9ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PW58fG4+dGhpcy5sZW5ndGgpJiYobj10aGlzLmxlbmd0aCksbjw9MClyZXR1cm4iIjtpZigobj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBMKHRoaXMsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBfKHRoaXMsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gUih0aGlzLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gayh0aGlzLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBBKHRoaXMsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIE4odGhpcyx0LG4pO2RlZmF1bHQ6aWYocil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gbShlLHQsbil7dmFyIHI9ZVt0XTtlW3RdPWVbbl0sZVtuXT1yfWZ1bmN0aW9uIHYoZSx0LG4scixvKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc/bj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1vPzA6ZS5sZW5ndGgtMSksbjwwJiYobj1lLmxlbmd0aCtuKSxuPj1lLmxlbmd0aCl7aWYobylyZXR1cm4tMTtuPWUubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFvKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWMuZnJvbSh0LHIpKSxjLmlzQnVmZmVyKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6eShlLHQsbixyLG8pO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/bz9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LG4pOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LG4pOnkoZSxbdF0sbixyLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIHkoZSx0LG4scixvKXt2YXIgaSxzPTEsYT1lLmxlbmd0aCxjPXQubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsYy89MixuLz0yfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKG8pe3ZhciBsPS0xO2ZvcihpPW47aTxhO2krKylpZih1KGUsaSk9PT11KHQsLTE9PT1sPzA6aS1sKSl7aWYoLTE9PT1sJiYobD1pKSxpLWwrMT09PWMpcmV0dXJuIGwqc31lbHNlLTEhPT1sJiYoaS09aS1sKSxsPS0xfWVsc2UgZm9yKG4rYz5hJiYobj1hLWMpLGk9bjtpPj0wO2ktLSl7Zm9yKHZhciBwPSEwLGQ9MDtkPGM7ZCsrKWlmKHUoZSxpK2QpIT09dSh0LGQpKXtwPSExO2JyZWFrfWlmKHApcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gRShlLHQsbixyKXtuPU51bWJlcihuKXx8MDt2YXIgbz1lLmxlbmd0aC1uO3I/KHI9TnVtYmVyKHIpKT5vJiYocj1vKTpyPW87dmFyIGk9dC5sZW5ndGg7aWYoaSUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO3I+aS8yJiYocj1pLzIpO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtuK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gUyhlLHQsbixyKXtyZXR1cm4gVihCKHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIGIoZSx0LG4scil7cmV0dXJuIFYoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChuKSk7cmV0dXJuIHR9KHQpLGUsbixyKX1mdW5jdGlvbiBDKGUsdCxuLHIpe3JldHVybiBiKGUsdCxuLHIpfWZ1bmN0aW9uIFQoZSx0LG4scil7cmV0dXJuIFYoaih0KSxlLG4scil9ZnVuY3Rpb24gSShlLHQsbixyKXtyZXR1cm4gVihmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLG8saT1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKXI9KG49ZS5jaGFyQ29kZUF0KHMpKT4+OCxvPW4lMjU2LGkucHVzaChvKSxpLnB1c2gocik7cmV0dXJuIGl9KHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIEEoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP24uZnJvbUJ5dGVBcnJheShlKTpuLmZyb21CeXRlQXJyYXkoZS5zbGljZSh0LHIpKX1mdW5jdGlvbiBfKGUsdCxuKXtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgcj1bXSxvPXQ7bzxuOyl7dmFyIGkscyxhLGMsdT1lW29dLGw9bnVsbCxwPXU+MjM5PzQ6dT4yMjM/Mzp1PjE5MT8yOjE7aWYobytwPD1uKXN3aXRjaChwKXtjYXNlIDE6dTwxMjgmJihsPXUpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKGk9ZVtvKzFdKSkmJihjPSgzMSZ1KTw8Nnw2MyZpKT4xMjcmJihsPWMpO2JyZWFrO2Nhc2UgMzppPWVbbysxXSxzPWVbbysyXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZzKSYmKGM9KDE1JnUpPDwxMnwoNjMmaSk8PDZ8NjMmcyk+MjA0NyYmKGM8NTUyOTZ8fGM+NTczNDMpJiYobD1jKTticmVhaztjYXNlIDQ6aT1lW28rMV0scz1lW28rMl0sYT1lW28rM10sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKGM9KDE1JnUpPDwxOHwoNjMmaSk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmYzwxMTE0MTEyJiYobD1jKX1udWxsPT09bD8obD02NTUzMyxwPTEpOmw+NjU1MzUmJihsLT02NTUzNixyLnB1c2gobD4+PjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxyLnB1c2gobCksbys9cH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9dylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7Zm9yKHZhciBuPSIiLHI9MDtyPHQ7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UocixyKz13KSk7cmV0dXJuIG59KHIpfXIuQnVmZmVyPWMsci5TbG93QnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxjLmFsbG9jKCtlKX0sci5JTlNQRUNUX01BWF9CWVRFUz01MCxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgZT1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZS5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PWUuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN1YmFycmF5JiYwPT09ZS5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2goZSl7cmV0dXJuITF9fSgpLHIua01heExlbmd0aD1zKCksYy5wb29sU2l6ZT04MTkyLGMuX2F1Z21lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19fPWMucHJvdG90eXBlLGV9LGMuZnJvbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHUobnVsbCxlLHQsbil9LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmKGMucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxjLl9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmY1tTeW1ib2wuc3BlY2llc109PT1jJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksYy5hbGxvYz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBsKHQpLHQ8PTA/YShlLHQpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP2EoZSx0KS5maWxsKG4scik6YShlLHQpLmZpbGwobik6YShlLHQpfShudWxsLGUsdCxuKX0sYy5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmlzQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX0sYy5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7aWYoIWMuaXNCdWZmZXIoZSl8fCFjLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIG49ZS5sZW5ndGgscj10Lmxlbmd0aCxvPTAsaT1NYXRoLm1pbihuLHIpO288aTsrK28paWYoZVtvXSE9PXRbb10pe249ZVtvXSxyPXRbb107YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSxjLmlzRW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LGMuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIWkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gYy5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT10KWZvcih0PTAsbj0wO248ZS5sZW5ndGg7KytuKXQrPWVbbl0ubGVuZ3RoO3ZhciByPWMuYWxsb2NVbnNhZmUodCksbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBzPWVbbl07aWYoIWMuaXNCdWZmZXIocykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO3MuY29weShyLG8pLG8rPXMubGVuZ3RofXJldHVybiByfSxjLmJ5dGVMZW5ndGg9ZixjLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsYy5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz0yKW0odGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NCltKHRoaXMsdCx0KzMpLG0odGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KW0odGhpcyx0LHQrNyksbSh0aGlzLHQrMSx0KzYpLG0odGhpcyx0KzIsdCs1KSxtKHRoaXMsdCszLHQrNCk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/Xyh0aGlzLDAsZSk6Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGMucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighYy5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09Yy5jb21wYXJlKHRoaXMsZSl9LGMucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIix0PXIuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCx0KS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+dCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxjLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCxuLHIsbyl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8cjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1vJiZ0Pj1uKXJldHVybiAwO2lmKHI+PW8pcmV0dXJuLTE7aWYodD49bilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIGk9KG8+Pj49MCktKHI+Pj49MCkscz0obj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKGkscyksdT10aGlzLnNsaWNlKHIsbyksbD1lLnNsaWNlKHQsbikscD0wO3A8YTsrK3ApaWYodVtwXSE9PWxbcF0pe2k9dVtwXSxzPWxbcF07YnJlYWt9cmV0dXJuIGk8cz8tMTpzPGk/MTowfSxjLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LG4pfSxjLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdih0aGlzLGUsdCxuLCEwKX0sYy5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMsZSx0LG4sITEpfSxjLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixyKXtpZih2b2lkIDA9PT10KXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiB0KXI9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgbz10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1ufHxuPm8pJiYobj1vKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gRSh0aGlzLGUsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBTKHRoaXMsZSx0LG4pO2Nhc2UiYXNjaWkiOnJldHVybiBiKHRoaXMsZSx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEModGhpcyxlLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsZSx0LG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gSSh0aGlzLGUsdCxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSxjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciB3PTQwOTY7ZnVuY3Rpb24gUihlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIG89dDtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbb10pO3JldHVybiByfWZ1bmN0aW9uIGsoZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBvPXQ7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbb10pO3JldHVybiByfWZ1bmN0aW9uIEwoZSx0LG4pe3ZhciByLG89ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIW58fG48MHx8bj5vKSYmKG49byk7Zm9yKHZhciBpPSIiLHM9dDtzPG47KytzKWkrPShyPWVbc10pPDE2PyIwIityLnRvU3RyaW5nKDE2KTpyLnRvU3RyaW5nKDE2KTtyZXR1cm4gaX1mdW5jdGlvbiBOKGUsdCxuKXtmb3IodmFyIHI9ZS5zbGljZSh0LG4pLG89IiIsaT0wO2k8ci5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0rMjU2KnJbaSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gTyhlLHQsbil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gRChlLHQsbixyLG8saSl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+b3x8dDxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFAoZSx0LG4scil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4oZS5sZW5ndGgtbiwyKTtvPGk7KytvKWVbbitvXT0odCYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIHgoZSx0LG4scil7dDwwJiYodD00Mjk0OTY3Mjk1K3QrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbihlLmxlbmd0aC1uLDQpO288aTsrK28pZVtuK29dPXQ+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gTShlLHQsbixyLG8saSl7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFUoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw0KSxvLndyaXRlKGUsdCxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIEYoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw4KSxvLndyaXRlKGUsdCxuLHIsNTIsOCksbis4fWMucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPXIpPDAmJihlPTApOmU+ciYmKGU9ciksKHQ9dm9pZCAwPT09dD9yOn5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSx0PGUmJih0PWUpLGMuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1jLnByb3RvdHlwZTtlbHNle3ZhciBvPXQtZTtuPW5ldyBjKG8sdm9pZCAwKTtmb3IodmFyIGk9MDtpPG87KytpKW5baV09dGhpc1tpK2VdfXJldHVybiBufSxjLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TyhlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLG89MSxpPTA7KytpPHQmJihvKj0yNTYpOylyKz10aGlzW2UraV0qbztyZXR1cm4gcn0sYy5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlKy0tdF0sbz0xO3Q+MCYmKG8qPTI1Nik7KXIrPXRoaXNbZSstLXRdKm87cmV0dXJuIHJ9LGMucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sYy5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LGMucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlXSxvPTEsaT0wOysraTx0JiYobyo9MjU2KTspcis9dGhpc1tlK2ldKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KnQpKSxyfSxjLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxPKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXQsbz0xLGk9dGhpc1tlKy0tcl07cj4wJiYobyo9MjU2KTspaSs9dGhpc1tlKy0tcl0qbztyZXR1cm4gaT49KG8qPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqdCkpLGl9LGMucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxPKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LGMucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8TyhlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxjLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxjLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCwyMyw0KX0sYy5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITEsMjMsNCl9LGMucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCw1Miw4KX0sYy5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCExLDUyLDgpfSxjLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxEKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89MSxpPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxEKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89bi0xLGk9MTtmb3IodGhpc1t0K29dPTI1NSZlOy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbdCtvXT1lL2kmMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwxLDI1NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxjLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMiw2NTUzNSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpQKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwyLDY1NTM1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOlAodGhpcyxlLHQsITEpLHQrMn0sYy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6eCh0aGlzLGUsdCwhMCksdCs0fSxjLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTp4KHRoaXMsZSx0LCExKSx0KzR9LGMucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtEKHRoaXMsZSx0LG4sby0xLC1vKX12YXIgaT0wLHM9MSxhPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K2ktMV0mJihhPTEpLHRoaXNbdCtpXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7RCh0aGlzLGUsdCxuLG8tMSwtbyl9dmFyIGk9bi0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K2krMV0mJihhPTEpLHRoaXNbdCtpXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwxLDEyNywtMTI4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGMucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpQKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpQKHRoaXMsZSx0LCExKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOngodGhpcyxlLHQsITApLHQrNH0sYy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6eCh0aGlzLGUsdCwhMSksdCs0fSxjLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCEwLG4pfSxjLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCExLG4pfSxjLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRih0aGlzLGUsdCwhMCxuKX0sYy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEYodGhpcyxlLHQsITEsbil9LGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LG4scil7aWYobnx8KG49MCkscnx8MD09PXJ8fChyPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLHI+MCYmcjxuJiYocj1uKSxyPT09bilyZXR1cm4gMDtpZigwPT09ZS5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO3I+dGhpcy5sZW5ndGgmJihyPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PHItbiYmKHI9ZS5sZW5ndGgtdCtuKTt2YXIgbyxpPXItbjtpZih0aGlzPT09ZSYmbjx0JiZ0PHIpZm9yKG89aS0xO28+PTA7LS1vKWVbbyt0XT10aGlzW28rbl07ZWxzZSBpZihpPDFlM3x8IWMuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iobz0wO288aTsrK28pZVtvK3RdPXRoaXNbbytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLG4raSksdCk7cmV0dXJuIGl9LGMucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KHI9dCx0PTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIG89ZS5jaGFyQ29kZUF0KDApO288MjU2JiYoZT1vKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWMuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpfWVsc2UibnVtYmVyIj09dHlwZW9mIGUmJihlJj0yNTUpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9dClyZXR1cm4gdGhpczt2YXIgaTtpZih0Pj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPTApLCJudW1iZXIiPT10eXBlb2YgZSlmb3IoaT10O2k8bjsrK2kpdGhpc1tpXT1lO2Vsc2V7dmFyIHM9Yy5pc0J1ZmZlcihlKT9lOkIobmV3IGMoZSxyKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihpPTA7aTxuLXQ7KytpKXRoaXNbaSt0XT1zW2klYV19cmV0dXJuIHRoaXN9O3ZhciBxPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIEIoZSx0KXt2YXIgbjt0PXR8fDEvMDtmb3IodmFyIHI9ZS5sZW5ndGgsbz1udWxsLGk9W10scz0wO3M8cjsrK3Mpe2lmKChuPWUuY2hhckNvZGVBdChzKSk+NTUyOTUmJm48NTczNDQpe2lmKCFvKXtpZihuPjU2MzE5KXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09cil7KHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfW89bjtjb250aW51ZX1pZihuPDU2MzIwKXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSksbz1uO2NvbnRpbnVlfW49NjU1MzYrKG8tNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgbyYmKHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2lmKG89bnVsbCxuPDEyOCl7aWYoKHQtPTEpPDApYnJlYWs7aS5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigodC09Mik8MClicmVhaztpLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKHQtPTMpPDApYnJlYWs7aS5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztpLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBpfWZ1bmN0aW9uIGooZSl7cmV0dXJuIG4udG9CeXRlQXJyYXkoZnVuY3Rpb24oZSl7aWYoKGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0oZSkucmVwbGFjZShxLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBWKGUsdCxuLHIpe2Zvcih2YXIgbz0wO288ciYmIShvK24+PXQubGVuZ3RofHxvPj1lLmxlbmd0aCk7KytvKXRbbytuXT1lW29dO3JldHVybiBvfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30sZSgiYnVmZmVyIikuQnVmZmVyKX0seyJiYXNlNjQtanMiOjgxLGJ1ZmZlcjo4NixpZWVlNzU0Ojg4LGlzYXJyYXk6ODl9XSw4NzpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9ZnVuY3Rpb24gbyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBpKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gdm9pZCAwPT09ZX10LmV4cG9ydHM9cixyLkV2ZW50RW1pdHRlcj1yLHIucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLHIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLHIuZGVmYXVsdE1heExpc3RlbmVycz0xMCxyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlfHxlPDB8fGlzTmFOKGUpKXRocm93IFR5cGVFcnJvcigibiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9LHIucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGEsYyx1O2lmKHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksImVycm9yIj09PWUmJighdGhpcy5fZXZlbnRzLmVycm9yfHxpKHRoaXMuX2V2ZW50cy5lcnJvcikmJiF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSl7aWYoKHQ9YXJndW1lbnRzWzFdKWluc3RhbmNlb2YgRXJyb3IpdGhyb3cgdDt2YXIgbD1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50LiAoJyt0KyIpIik7dGhyb3cgbC5jb250ZXh0PXQsbH1pZihzKG49dGhpcy5fZXZlbnRzW2VdKSlyZXR1cm4hMTtpZihvKG4pKXN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6bi5jYWxsKHRoaXMpO2JyZWFrO2Nhc2UgMjpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztkZWZhdWx0OmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG4uYXBwbHkodGhpcyxhKX1lbHNlIGlmKGkobikpZm9yKGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHI9KHU9bi5zbGljZSgpKS5sZW5ndGgsYz0wO2M8cjtjKyspdVtjXS5hcHBseSh0aGlzLGEpO3JldHVybiEwfSxyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksdGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyJiZ0aGlzLmVtaXQoIm5ld0xpc3RlbmVyIixlLG8odC5saXN0ZW5lcik/dC5saXN0ZW5lcjp0KSx0aGlzLl9ldmVudHNbZV0/aSh0aGlzLl9ldmVudHNbZV0pP3RoaXMuX2V2ZW50c1tlXS5wdXNoKHQpOnRoaXMuX2V2ZW50c1tlXT1bdGhpcy5fZXZlbnRzW2VdLHRdOnRoaXMuX2V2ZW50c1tlXT10LGkodGhpcy5fZXZlbnRzW2VdKSYmIXRoaXMuX2V2ZW50c1tlXS53YXJuZWQmJihuPXModGhpcy5fbWF4TGlzdGVuZXJzKT9yLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dGhpcy5fbWF4TGlzdGVuZXJzKSYmbj4wJiZ0aGlzLl9ldmVudHNbZV0ubGVuZ3RoPm4mJih0aGlzLl9ldmVudHNbZV0ud2FybmVkPSEwLGNvbnNvbGUuZXJyb3IoIihub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuIix0aGlzLl9ldmVudHNbZV0ubGVuZ3RoKSwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS50cmFjZSYmY29uc29sZS50cmFjZSgpKSx0aGlzfSxyLnByb3RvdHlwZS5vbj1yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7aWYoIW8odCkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTt2YXIgbj0hMTtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpLG58fChuPSEwLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gci5saXN0ZW5lcj10LHRoaXMub24oZSxyKSx0aGlzfSxyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuLHIscyxhO2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoIXRoaXMuX2V2ZW50c3x8IXRoaXMuX2V2ZW50c1tlXSlyZXR1cm4gdGhpcztpZihzPShuPXRoaXMuX2V2ZW50c1tlXSkubGVuZ3RoLHI9LTEsbj09PXR8fG8obi5saXN0ZW5lcikmJm4ubGlzdGVuZXI9PT10KWRlbGV0ZSB0aGlzLl9ldmVudHNbZV0sdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLHQpO2Vsc2UgaWYoaShuKSl7Zm9yKGE9czthLS0gPjA7KWlmKG5bYV09PT10fHxuW2FdLmxpc3RlbmVyJiZuW2FdLmxpc3RlbmVyPT09dCl7cj1hO2JyZWFrfWlmKHI8MClyZXR1cm4gdGhpczsxPT09bi5sZW5ndGg/KG4ubGVuZ3RoPTAsZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSk6bi5zcGxpY2UociwxKSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsdCl9cmV0dXJuIHRoaXN9LHIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgdCxuO2lmKCF0aGlzLl9ldmVudHMpcmV0dXJuIHRoaXM7aWYoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fZXZlbnRzPXt9OnRoaXMuX2V2ZW50c1tlXSYmZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodCBpbiB0aGlzLl9ldmVudHMpInJlbW92ZUxpc3RlbmVyIiE9PXQmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKHQpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9e30sdGhpc31pZihvKG49dGhpcy5fZXZlbnRzW2VdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsbik7ZWxzZSBpZihuKWZvcig7bi5sZW5ndGg7KXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxuW24ubGVuZ3RoLTFdKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzfSxyLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW2VdP28odGhpcy5fZXZlbnRzW2VdKT9bdGhpcy5fZXZlbnRzW2VdXTp0aGlzLl9ldmVudHNbZV0uc2xpY2UoKTpbXX0sci5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbihlKXtpZih0aGlzLl9ldmVudHMpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZihvKHQpKXJldHVybiAxO2lmKHQpcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfSxyLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5saXN0ZW5lckNvdW50KHQpfX0se31dLDg4OltmdW5jdGlvbihlLHQsbil7bi5yZWFkPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGkscyxhPTgqby1yLTEsYz0oMTw8YSktMSx1PWM+PjEsbD0tNyxwPW4/by0xOjAsZD1uPy0xOjEsaD1lW3QrcF07Zm9yKHArPWQsaT1oJigxPDwtbCktMSxoPj49LWwsbCs9YTtsPjA7aT0yNTYqaStlW3QrcF0scCs9ZCxsLT04KTtmb3Iocz1pJigxPDwtbCktMSxpPj49LWwsbCs9cjtsPjA7cz0yNTYqcytlW3QrcF0scCs9ZCxsLT04KTtpZigwPT09aSlpPTEtdTtlbHNle2lmKGk9PT1jKXJldHVybiBzP05hTjoxLzAqKGg/LTE6MSk7cys9TWF0aC5wb3coMixyKSxpLT11fXJldHVybihoPy0xOjEpKnMqTWF0aC5wb3coMixpLXIpfSxuLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt2YXIgcyxhLGMsdT04Kmktby0xLGw9KDE8PHUpLTEscD1sPj4xLGQ9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDppLTEsZj1yPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9bCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCooYz1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSxjKj0yKSwodCs9cytwPj0xP2QvYzpkKk1hdGgucG93KDIsMS1wKSkqYz49MiYmKHMrKyxjLz0yKSxzK3A+PWw/KGE9MCxzPWwpOnMrcD49MT8oYT0odCpjLTEpKk1hdGgucG93KDIsbykscys9cCk6KGE9dCpNYXRoLnBvdygyLHAtMSkqTWF0aC5wb3coMixvKSxzPTApKTtvPj04O2VbbitoXT0yNTUmYSxoKz1mLGEvPTI1NixvLT04KTtmb3Iocz1zPDxvfGEsdSs9bzt1PjA7ZVtuK2hdPTI1NSZzLGgrPWYscy89MjU2LHUtPTgpO2VbbitoLWZdfD0xMjgqZ319LHt9XSw4OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1yLmNhbGwoZSl9fSx7fV0sOTA6W2Z1bmN0aW9uKGUsdCxuKXshZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiByKGUsbyl7aWYoZT09PW8pcmV0dXJuITA7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKXJldHVybiExO2lmKCEwPT09dChlKSl7aWYoZS5sZW5ndGghPT1vLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKylpZighMT09PXIoZVtpXSxvW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1pZighMD09PW4oZSkpe3ZhciBzPXt9O2Zvcih2YXIgYSBpbiBlKWlmKGhhc093blByb3BlcnR5LmNhbGwoZSxhKSl7aWYoITE9PT1yKGVbYV0sb1thXSkpcmV0dXJuITE7c1thXT0hMH1mb3IodmFyIGMgaW4gbylpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG8sYykmJiEwIT09c1tjXSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBvKGUpe2lmKCIiPT09ZXx8ITE9PT1lfHxudWxsPT09ZSlyZXR1cm4hMDtpZih0KGUpJiYwPT09ZS5sZW5ndGgpcmV0dXJuITA7aWYobihlKSl7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX12YXIgaTtpPSJmdW5jdGlvbiI9PXR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0P2Z1bmN0aW9uKGUpe3JldHVybiBlLnRyaW1MZWZ0KCl9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqKC4qKS8pWzFdfTt2YXIgcz0wLGE9MSxjPTIsdT0zLGw9NCxwPTYsZD04LGg9OSxmPXswOiJudW1iZXIiLDE6ImFueSIsMjoic3RyaW5nIiwzOiJhcnJheSIsNDoib2JqZWN0Iiw1OiJib29sZWFuIiw2OiJleHByZXNzaW9uIiw3OiJudWxsIiw4OiJBcnJheTxudW1iZXI+Iiw5OiJBcnJheTxzdHJpbmc+In0sZz0iRU9GIixtPSJVbnF1b3RlZElkZW50aWZpZXIiLHY9IlF1b3RlZElkZW50aWZpZXIiLHk9IlJicmFja2V0IixFPSJScGFyZW4iLFM9IkNvbW1hIixiPSJDb2xvbiIsQz0iUmJyYWNlIixUPSJOdW1iZXIiLEk9IkN1cnJlbnQiLEE9IkV4cHJlZiIsXz0iUGlwZSIsdz0iT3IiLFI9IkFuZCIsaz0iRVEiLEw9IkdUIixOPSJMVCIsTz0iR1RFIixEPSJMVEUiLFA9Ik5FIix4PSJGbGF0dGVuIixNPSJTdGFyIixVPSJGaWx0ZXIiLEY9IkRvdCIscT0iTm90IixCPSJMYnJhY2UiLGo9IkxicmFja2V0IixWPSJMcGFyZW4iLFc9IkxpdGVyYWwiLEc9eyIuIjpGLCIqIjpNLCIsIjpTLCI6IjpiLCJ7IjpCLCJ9IjpDLCJdIjp5LCIoIjpWLCIpIjpFLCJAIjpJfSxIPXsiPCI6ITAsIj4iOiEwLCI9IjohMCwiISI6ITB9LHo9eyIgIjohMCwiXHQiOiEwLCJcbiI6ITB9O2Z1bmN0aW9uIEsoZSl7cmV0dXJuIGU+PSIwIiYmZTw9IjkifHwiLSI9PT1lfWZ1bmN0aW9uIFgoKXt9WC5wcm90b3R5cGU9e3Rva2VuaXplOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGk9W107Zm9yKHRoaXMuX2N1cnJlbnQ9MDt0aGlzLl9jdXJyZW50PGUubGVuZ3RoOylpZigobz1lW3RoaXMuX2N1cnJlbnRdKT49ImEiJiZvPD0ieiJ8fG8+PSJBIiYmbzw9IloifHwiXyI9PT1vKXQ9dGhpcy5fY3VycmVudCxuPXRoaXMuX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIoZSksaS5wdXNoKHt0eXBlOm0sdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZih2b2lkIDAhPT1HW2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh7dHlwZTpHW2VbdGhpcy5fY3VycmVudF1dLHZhbHVlOmVbdGhpcy5fY3VycmVudF0sc3RhcnQ6dGhpcy5fY3VycmVudH0pLHRoaXMuX2N1cnJlbnQrKztlbHNlIGlmKEsoZVt0aGlzLl9jdXJyZW50XSkpcj10aGlzLl9jb25zdW1lTnVtYmVyKGUpLGkucHVzaChyKTtlbHNlIGlmKCJbIj09PWVbdGhpcy5fY3VycmVudF0pcj10aGlzLl9jb25zdW1lTEJyYWNrZXQoZSksaS5wdXNoKHIpO2Vsc2UgaWYoJyInPT09ZVt0aGlzLl9jdXJyZW50XSl0PXRoaXMuX2N1cnJlbnQsbj10aGlzLl9jb25zdW1lUXVvdGVkSWRlbnRpZmllcihlKSxpLnB1c2goe3R5cGU6dix2YWx1ZTpuLHN0YXJ0OnR9KTtlbHNlIGlmKCInIj09PWVbdGhpcy5fY3VycmVudF0pdD10aGlzLl9jdXJyZW50LG49dGhpcy5fY29uc3VtZVJhd1N0cmluZ0xpdGVyYWwoZSksaS5wdXNoKHt0eXBlOlcsdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZigiYCI9PT1lW3RoaXMuX2N1cnJlbnRdKXt0PXRoaXMuX2N1cnJlbnQ7dmFyIHM9dGhpcy5fY29uc3VtZUxpdGVyYWwoZSk7aS5wdXNoKHt0eXBlOlcsdmFsdWU6cyxzdGFydDp0fSl9ZWxzZSBpZih2b2lkIDAhPT1IW2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh0aGlzLl9jb25zdW1lT3BlcmF0b3IoZSkpO2Vsc2UgaWYodm9pZCAwIT09eltlW3RoaXMuX2N1cnJlbnRdXSl0aGlzLl9jdXJyZW50Kys7ZWxzZSBpZigiJiI9PT1lW3RoaXMuX2N1cnJlbnRdKXQ9dGhpcy5fY3VycmVudCx0aGlzLl9jdXJyZW50KyssIiYiPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLGkucHVzaCh7dHlwZTpSLHZhbHVlOiImJiIsc3RhcnQ6dH0pKTppLnB1c2goe3R5cGU6QSx2YWx1ZToiJiIsc3RhcnQ6dH0pO2Vsc2V7aWYoInwiIT09ZVt0aGlzLl9jdXJyZW50XSl7dmFyIGE9bmV3IEVycm9yKCJVbmtub3duIGNoYXJhY3RlcjoiK2VbdGhpcy5fY3VycmVudF0pO3Rocm93IGEubmFtZT0iTGV4ZXJFcnJvciIsYX10PXRoaXMuX2N1cnJlbnQsdGhpcy5fY3VycmVudCsrLCJ8Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyxpLnB1c2goe3R5cGU6dyx2YWx1ZToifHwiLHN0YXJ0OnR9KSk6aS5wdXNoKHt0eXBlOl8sdmFsdWU6InwiLHN0YXJ0OnR9KX1yZXR1cm4gaX0sX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9jdXJyZW50O2Zvcih0aGlzLl9jdXJyZW50Kys7dGhpcy5fY3VycmVudDxlLmxlbmd0aCYmKCh0PWVbdGhpcy5fY3VycmVudF0pPj0iYSImJnQ8PSJ6Inx8dD49IkEiJiZ0PD0iWiJ8fHQ+PSIwIiYmdDw9IjkifHwiXyI9PT10KTspdGhpcy5fY3VycmVudCsrO3JldHVybiBlLnNsaWNlKG4sdGhpcy5fY3VycmVudCl9LF9jb25zdW1lUXVvdGVkSWRlbnRpZmllcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3RoaXMuX2N1cnJlbnQrKztmb3IodmFyIG49ZS5sZW5ndGg7JyInIT09ZVt0aGlzLl9jdXJyZW50XSYmdGhpcy5fY3VycmVudDxuOyl7dmFyIHI9dGhpcy5fY3VycmVudDsiXFwiIT09ZVtyXXx8IlxcIiE9PWVbcisxXSYmJyInIT09ZVtyKzFdP3IrKzpyKz0yLHRoaXMuX2N1cnJlbnQ9cn1yZXR1cm4gdGhpcy5fY3VycmVudCsrLEpTT04ucGFyc2UoZS5zbGljZSh0LHRoaXMuX2N1cnJlbnQpKX0sX2NvbnN1bWVSYXdTdHJpbmdMaXRlcmFsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDsiJyIhPT1lW3RoaXMuX2N1cnJlbnRdJiZ0aGlzLl9jdXJyZW50PG47KXt2YXIgcj10aGlzLl9jdXJyZW50OyJcXCIhPT1lW3JdfHwiXFwiIT09ZVtyKzFdJiYiJyIhPT1lW3IrMV0/cisrOnIrPTIsdGhpcy5fY3VycmVudD1yfXJldHVybiB0aGlzLl9jdXJyZW50KyssZS5zbGljZSh0KzEsdGhpcy5fY3VycmVudC0xKS5yZXBsYWNlKCJcXCciLCInIil9LF9jb25zdW1lTnVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDtLKGVbdGhpcy5fY3VycmVudF0pJiZ0aGlzLl9jdXJyZW50PG47KXRoaXMuX2N1cnJlbnQrKzt2YXIgcj1wYXJzZUludChlLnNsaWNlKHQsdGhpcy5fY3VycmVudCkpO3JldHVybnt0eXBlOlQsdmFsdWU6cixzdGFydDp0fX0sX2NvbnN1bWVMQnJhY2tldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3JldHVybiB0aGlzLl9jdXJyZW50KyssIj8iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOlUsdmFsdWU6Ils/IixzdGFydDp0fSk6Il0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOngsdmFsdWU6IltdIixzdGFydDp0fSk6e3R5cGU6aix2YWx1ZToiWyIsc3RhcnQ6dH19LF9jb25zdW1lT3BlcmF0b3I6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudCxuPWVbdF07cmV0dXJuIHRoaXMuX2N1cnJlbnQrKywiISI9PT1uPyI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTpQLHZhbHVlOiIhPSIsc3RhcnQ6dH0pOnt0eXBlOnEsdmFsdWU6IiEiLHN0YXJ0OnR9OiI8Ij09PW4/Ij0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOkQsdmFsdWU6Ijw9IixzdGFydDp0fSk6e3R5cGU6Tix2YWx1ZToiPCIsc3RhcnQ6dH06Ij4iPT09bj8iPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6Tyx2YWx1ZToiPj0iLHN0YXJ0OnR9KTp7dHlwZTpMLHZhbHVlOiI+IixzdGFydDp0fToiPSI9PT1uJiYiPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6ayx2YWx1ZToiPT0iLHN0YXJ0OnR9KTp2b2lkIDB9LF9jb25zdW1lTGl0ZXJhbDpmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciB0LG49dGhpcy5fY3VycmVudCxyPWUubGVuZ3RoOyJgIiE9PWVbdGhpcy5fY3VycmVudF0mJnRoaXMuX2N1cnJlbnQ8cjspe3ZhciBvPXRoaXMuX2N1cnJlbnQ7IlxcIiE9PWVbb118fCJcXCIhPT1lW28rMV0mJiJgIiE9PWVbbysxXT9vKys6bys9Mix0aGlzLl9jdXJyZW50PW99dmFyIHM9aShlLnNsaWNlKG4sdGhpcy5fY3VycmVudCkpO3JldHVybiBzPXMucmVwbGFjZSgiXFxgIiwiYCIpLHQ9dGhpcy5fbG9va3NMaWtlSlNPTihzKT9KU09OLnBhcnNlKHMpOkpTT04ucGFyc2UoJyInK3MrJyInKSx0aGlzLl9jdXJyZW50KyssdH0sX2xvb2tzTGlrZUpTT046ZnVuY3Rpb24oZSl7aWYoIiI9PT1lKXJldHVybiExO2lmKCdbeyInLmluZGV4T2YoZVswXSk+PTApcmV0dXJuITA7aWYoWyJ0cnVlIiwiZmFsc2UiLCJudWxsIl0uaW5kZXhPZihlKT49MClyZXR1cm4hMDtpZighKCItMDEyMzQ1Njc4OSIuaW5kZXhPZihlWzBdKT49MCkpcmV0dXJuITE7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX19O3ZhciBZPXt9O2Z1bmN0aW9uICQoKXt9ZnVuY3Rpb24gSihlKXt0aGlzLnJ1bnRpbWU9ZX1mdW5jdGlvbiBRKGUpe3RoaXMuX2ludGVycHJldGVyPWUsdGhpcy5mdW5jdGlvblRhYmxlPXthYnM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQWJzLF9zaWduYXR1cmU6W3t0eXBlczpbc119XX0sYXZnOntfZnVuYzp0aGlzLl9mdW5jdGlvbkF2Zyxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LGNlaWw6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQ2VpbCxfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LGNvbnRhaW5zOntfZnVuYzp0aGlzLl9mdW5jdGlvbkNvbnRhaW5zLF9zaWduYXR1cmU6W3t0eXBlczpbYyx1XX0se3R5cGVzOlthXX1dfSxlbmRzX3dpdGg6e19mdW5jOnRoaXMuX2Z1bmN0aW9uRW5kc1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxmbG9vcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25GbG9vcixfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LGxlbmd0aDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25MZW5ndGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjLHUsbF19XX0sbWFwOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1hcCxfc2lnbmF0dXJlOlt7dHlwZXM6W3BdfSx7dHlwZXM6W3VdfV19LG1heDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NYXgsX3NpZ25hdHVyZTpbe3R5cGVzOltkLGhdfV19LG1lcmdlOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1lcmdlLF9zaWduYXR1cmU6W3t0eXBlczpbbF0sdmFyaWFkaWM6ITB9XX0sbWF4X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvbk1heEJ5LF9zaWduYXR1cmU6W3t0eXBlczpbdV19LHt0eXBlczpbcF19XX0sc3VtOntfZnVuYzp0aGlzLl9mdW5jdGlvblN1bSxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LHN0YXJ0c193aXRoOntfZnVuYzp0aGlzLl9mdW5jdGlvblN0YXJ0c1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxtaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluLF9zaWduYXR1cmU6W3t0eXBlczpbZCxoXX1dfSxtaW5fYnk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluQnksX3NpZ25hdHVyZTpbe3R5cGVzOlt1XX0se3R5cGVzOltwXX1dfSx0eXBlOntfZnVuYzp0aGlzLl9mdW5jdGlvblR5cGUsX3NpZ25hdHVyZTpbe3R5cGVzOlthXX1dfSxrZXlzOntfZnVuYzp0aGlzLl9mdW5jdGlvbktleXMsX3NpZ25hdHVyZTpbe3R5cGVzOltsXX1dfSx2YWx1ZXM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVmFsdWVzLF9zaWduYXR1cmU6W3t0eXBlczpbbF19XX0sc29ydDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Tb3J0LF9zaWduYXR1cmU6W3t0eXBlczpbaCxkXX1dfSxzb3J0X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvblNvcnRCeSxfc2lnbmF0dXJlOlt7dHlwZXM6W3VdfSx7dHlwZXM6W3BdfV19LGpvaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uSm9pbixfc2lnbmF0dXJlOlt7dHlwZXM6W2NdfSx7dHlwZXM6W2hdfV19LHJldmVyc2U6e19mdW5jOnRoaXMuX2Z1bmN0aW9uUmV2ZXJzZSxfc2lnbmF0dXJlOlt7dHlwZXM6W2MsdV19XX0sdG9fYXJyYXk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVG9BcnJheSxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LHRvX3N0cmluZzp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub1N0cmluZyxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LHRvX251bWJlcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub051bWJlcixfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LG5vdF9udWxsOntfZnVuYzp0aGlzLl9mdW5jdGlvbk5vdE51bGwsX3NpZ25hdHVyZTpbe3R5cGVzOlthXSx2YXJpYWRpYzohMH1dfX19WVtnXT0wLFlbbV09MCxZW3ZdPTAsWVt5XT0wLFlbRV09MCxZW1NdPTAsWVtDXT0wLFlbVF09MCxZW0ldPTAsWVtBXT0wLFlbX109MSxZW3ddPTIsWVtSXT0zLFlba109NSxZW0xdPTUsWVtOXT01LFlbT109NSxZW0RdPTUsWVtQXT01LFlbeF09OSxZW01dPTIwLFlbVV09MjEsWVtGXT00MCxZW3FdPTQ1LFlbQl09NTAsWVtqXT01NSxZW1ZdPTYwLCQucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbihlKXt0aGlzLl9sb2FkVG9rZW5zKGUpLHRoaXMuaW5kZXg9MDt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYodGhpcy5fbG9va2FoZWFkKDApIT09Zyl7dmFyIG49dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkscj1uZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gdHlwZTogIituLnR5cGUrIiwgdmFsdWU6ICIrbi52YWx1ZSk7dGhyb3cgci5uYW1lPSJQYXJzZXJFcnJvciIscn1yZXR1cm4gdH0sX2xvYWRUb2tlbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9KG5ldyBYKS50b2tlbml6ZShlKTt0LnB1c2goe3R5cGU6Zyx2YWx1ZToiIixzdGFydDplLmxlbmd0aH0pLHRoaXMudG9rZW5zPXR9LGV4cHJlc3Npb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7dGhpcy5fYWR2YW5jZSgpO2Zvcih2YXIgbj10aGlzLm51ZCh0KSxyPXRoaXMuX2xvb2thaGVhZCgwKTtlPFlbcl07KXRoaXMuX2FkdmFuY2UoKSxuPXRoaXMubGVkKHIsbikscj10aGlzLl9sb29rYWhlYWQoMCk7cmV0dXJuIG59LF9sb29rYWhlYWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXgrZV0udHlwZX0sX2xvb2thaGVhZFRva2VuOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRva2Vuc1t0aGlzLmluZGV4K2VdfSxfYWR2YW5jZTpmdW5jdGlvbigpe3RoaXMuaW5kZXgrK30sbnVkOmZ1bmN0aW9uKGUpe3ZhciB0LG47c3dpdGNoKGUudHlwZSl7Y2FzZSBXOnJldHVybnt0eXBlOiJMaXRlcmFsIix2YWx1ZTplLnZhbHVlfTtjYXNlIG06cmV0dXJue3R5cGU6IkZpZWxkIixuYW1lOmUudmFsdWV9O2Nhc2Ugdjp2YXIgcj17dHlwZToiRmllbGQiLG5hbWU6ZS52YWx1ZX07aWYodGhpcy5fbG9va2FoZWFkKDApPT09Vil0aHJvdyBuZXcgRXJyb3IoIlF1b3RlZCBpZGVudGlmaWVyIG5vdCBhbGxvd2VkIGZvciBmdW5jdGlvbiBuYW1lcy4iKTtyZXR1cm4gcjtjYXNlIHE6cmV0dXJue3R5cGU6Ik5vdEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0PXRoaXMuZXhwcmVzc2lvbihZLk5vdCldfTtjYXNlIE06cmV0dXJuIHQ9bnVsbCx7dHlwZToiVmFsdWVQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6IklkZW50aXR5In0sdD10aGlzLl9sb29rYWhlYWQoMCk9PT15P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLlN0YXIpXX07Y2FzZSBVOnJldHVybiB0aGlzLmxlZChlLnR5cGUse3R5cGU6IklkZW50aXR5In0pO2Nhc2UgQjpyZXR1cm4gdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKTtjYXNlIHg6cmV0dXJue3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt7dHlwZTp4LGNoaWxkcmVuOlt7dHlwZToiSWRlbnRpdHkifV19LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuRmxhdHRlbildfTtjYXNlIGo6cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKT09PVR8fHRoaXMuX2xvb2thaGVhZCgwKT09PWI/KHQ9dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh7dHlwZToiSWRlbnRpdHkifSx0KSk6dGhpcy5fbG9va2FoZWFkKDApPT09TSYmdGhpcy5fbG9va2FoZWFkKDEpPT09eT8odGhpcy5fYWR2YW5jZSgpLHRoaXMuX2FkdmFuY2UoKSx7dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOiJJZGVudGl0eSJ9LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfSk6dGhpcy5fcGFyc2VNdWx0aXNlbGVjdExpc3QoKTtjYXNlIEk6cmV0dXJue3R5cGU6SX07Y2FzZSBBOnJldHVybnt0eXBlOiJFeHByZXNzaW9uUmVmZXJlbmNlIixjaGlsZHJlbjpbbj10aGlzLmV4cHJlc3Npb24oWS5FeHByZWYpXX07Y2FzZSBWOmZvcih2YXIgbz1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1FOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhuPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bj10aGlzLmV4cHJlc3Npb24oMCksby5wdXNoKG4pO3JldHVybiB0aGlzLl9tYXRjaChFKSxvWzBdO2RlZmF1bHQ6dGhpcy5fZXJyb3JUb2tlbihlKX19LGxlZDpmdW5jdGlvbihlLHQpe3ZhciBuO3N3aXRjaChlKXtjYXNlIEY6dmFyIHI9WS5Eb3Q7cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKSE9PU0/e3R5cGU6IlN1YmV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VEb3RSSFMocildfToodGhpcy5fYWR2YW5jZSgpLHt0eXBlOiJWYWx1ZVByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKHIpXX0pO2Nhc2UgXzpyZXR1cm4gbj10aGlzLmV4cHJlc3Npb24oWS5QaXBlKSx7dHlwZTpfLGNoaWxkcmVuOlt0LG5dfTtjYXNlIHc6cmV0dXJue3R5cGU6Ik9yRXhwcmVzc2lvbiIsY2hpbGRyZW46W3Qsbj10aGlzLmV4cHJlc3Npb24oWS5PcildfTtjYXNlIFI6cmV0dXJue3R5cGU6IkFuZEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5leHByZXNzaW9uKFkuQW5kKV19O2Nhc2UgVjpmb3IodmFyIG8saT10Lm5hbWUscz1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1FOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhvPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bz10aGlzLmV4cHJlc3Npb24oMCksdGhpcy5fbG9va2FoZWFkKDApPT09UyYmdGhpcy5fbWF0Y2goUykscy5wdXNoKG8pO3JldHVybiB0aGlzLl9tYXRjaChFKSx7dHlwZToiRnVuY3Rpb24iLG5hbWU6aSxjaGlsZHJlbjpzfTtjYXNlIFU6dmFyIGE9dGhpcy5leHByZXNzaW9uKDApO3JldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiRmlsdGVyUHJvamVjdGlvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9sb29rYWhlYWQoMCk9PT14P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLkZpbHRlciksYV19O2Nhc2UgeDpyZXR1cm57dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOngsY2hpbGRyZW46W3RdfSx0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5GbGF0dGVuKV19O2Nhc2UgazpjYXNlIFA6Y2FzZSBMOmNhc2UgTzpjYXNlIE46Y2FzZSBEOnJldHVybiB0aGlzLl9wYXJzZUNvbXBhcmF0b3IodCxlKTtjYXNlIGo6dmFyIGM9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7cmV0dXJuIGMudHlwZT09PVR8fGMudHlwZT09PWI/KG49dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh0LG4pKToodGhpcy5fbWF0Y2goTSksdGhpcy5fbWF0Y2goeSkse3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfSk7ZGVmYXVsdDp0aGlzLl9lcnJvclRva2VuKHRoaXMuX2xvb2thaGVhZFRva2VuKDApKX19LF9tYXRjaDpmdW5jdGlvbihlKXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1lKXt2YXIgdD10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxuPW5ldyBFcnJvcigiRXhwZWN0ZWQgIitlKyIsIGdvdDogIit0LnR5cGUpO3Rocm93IG4ubmFtZT0iUGFyc2VyRXJyb3IiLG59dGhpcy5fYWR2YW5jZSgpfSxfZXJyb3JUb2tlbjpmdW5jdGlvbihlKXt2YXIgdD1uZXcgRXJyb3IoIkludmFsaWQgdG9rZW4gKCIrZS50eXBlKycpOiAiJytlLnZhbHVlKyciJyk7dGhyb3cgdC5uYW1lPSJQYXJzZXJFcnJvciIsdH0sX3BhcnNlSW5kZXhFeHByZXNzaW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fbG9va2FoZWFkKDApPT09Ynx8dGhpcy5fbG9va2FoZWFkKDEpPT09YilyZXR1cm4gdGhpcy5fcGFyc2VTbGljZUV4cHJlc3Npb24oKTt2YXIgZT17dHlwZToiSW5kZXgiLHZhbHVlOnRoaXMuX2xvb2thaGVhZFRva2VuKDApLnZhbHVlfTtyZXR1cm4gdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKHkpLGV9LF9wcm9qZWN0SWZTbGljZTpmdW5jdGlvbihlLHQpe3ZhciBuPXt0eXBlOiJJbmRleEV4cHJlc3Npb24iLGNoaWxkcmVuOltlLHRdfTtyZXR1cm4iU2xpY2UiPT09dC50eXBlP3t0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbbix0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5TdGFyKV19Om59LF9wYXJzZVNsaWNlRXhwcmVzc2lvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bbnVsbCxudWxsLG51bGxdLHQ9MCxuPXRoaXMuX2xvb2thaGVhZCgwKTtuIT09eSYmdDwzOyl7aWYobj09PWIpdCsrLHRoaXMuX2FkdmFuY2UoKTtlbHNle2lmKG4hPT1UKXt2YXIgcj10aGlzLl9sb29rYWhlYWQoMCksbz1uZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5leHBlY3RlZCB0b2tlbjogIityLnZhbHVlKyIoIityLnR5cGUrIikiKTt0aHJvdyBvLm5hbWU9IlBhcnNlcmVycm9yIixvfWVbdF09dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkudmFsdWUsdGhpcy5fYWR2YW5jZSgpfW49dGhpcy5fbG9va2FoZWFkKDApfXJldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiU2xpY2UiLGNoaWxkcmVuOmV9fSxfcGFyc2VDb21wYXJhdG9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJue3R5cGU6IkNvbXBhcmF0b3IiLG5hbWU6dCxjaGlsZHJlbjpbZSx0aGlzLmV4cHJlc3Npb24oWVt0XSldfX0sX3BhcnNlRG90UkhTOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xvb2thaGVhZCgwKTtyZXR1cm5bbSx2LE1dLmluZGV4T2YodCk+PTA/dGhpcy5leHByZXNzaW9uKGUpOnQ9PT1qPyh0aGlzLl9tYXRjaChqKSx0aGlzLl9wYXJzZU11bHRpc2VsZWN0TGlzdCgpKTp0PT09Qj8odGhpcy5fbWF0Y2goQiksdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKSk6dm9pZCAwfSxfcGFyc2VQcm9qZWN0aW9uUkhTOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKFlbdGhpcy5fbG9va2FoZWFkKDApXTwxMCl0PXt0eXBlOiJJZGVudGl0eSJ9O2Vsc2UgaWYodGhpcy5fbG9va2FoZWFkKDApPT09ail0PXRoaXMuZXhwcmVzc2lvbihlKTtlbHNlIGlmKHRoaXMuX2xvb2thaGVhZCgwKT09PVUpdD10aGlzLmV4cHJlc3Npb24oZSk7ZWxzZXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1GKXt2YXIgbj10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxyPW5ldyBFcnJvcigiU3l0YW54IGVycm9yLCB1bmV4cGVjdGVkIHRva2VuOiAiK24udmFsdWUrIigiK24udHlwZSsiKSIpO3Rocm93IHIubmFtZT0iUGFyc2VyRXJyb3IiLHJ9dGhpcy5fbWF0Y2goRiksdD10aGlzLl9wYXJzZURvdFJIUyhlKX1yZXR1cm4gdH0sX3BhcnNlTXVsdGlzZWxlY3RMaXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdO3RoaXMuX2xvb2thaGVhZCgwKSE9PXk7KXt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYoZS5wdXNoKHQpLHRoaXMuX2xvb2thaGVhZCgwKT09PVMmJih0aGlzLl9tYXRjaChTKSx0aGlzLl9sb29rYWhlYWQoMCk9PT15KSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gUmJyYWNrZXQiKX1yZXR1cm4gdGhpcy5fbWF0Y2goeSkse3R5cGU6Ik11bHRpU2VsZWN0TGlzdCIsY2hpbGRyZW46ZX19LF9wYXJzZU11bHRpc2VsZWN0SGFzaDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LG4scj1bXSxvPVttLHZdOzspe2lmKGU9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCksby5pbmRleE9mKGUudHlwZSk8MCl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGluZyBhbiBpZGVudGlmaWVyIHRva2VuLCBnb3Q6ICIrZS50eXBlKTtpZih0PWUudmFsdWUsdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKGIpLG49e3R5cGU6IktleVZhbHVlUGFpciIsbmFtZTp0LHZhbHVlOnRoaXMuZXhwcmVzc2lvbigwKX0sci5wdXNoKG4pLHRoaXMuX2xvb2thaGVhZCgwKT09PVMpdGhpcy5fbWF0Y2goUyk7ZWxzZSBpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1DKXt0aGlzLl9tYXRjaChDKTticmVha319cmV0dXJue3R5cGU6Ik11bHRpU2VsZWN0SGFzaCIsY2hpbGRyZW46cn19fSxKLnByb3RvdHlwZT17c2VhcmNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudmlzaXQoZSx0KX0sdmlzaXQ6ZnVuY3Rpb24oZSxpKXt2YXIgcyxhLGMsdSxsLHAsZCxoLGY7c3dpdGNoKGUudHlwZSl7Y2FzZSJGaWVsZCI6cmV0dXJuIG51bGwhPT1pJiZuKGkpP3ZvaWQgMD09PShwPWlbZS5uYW1lXSk/bnVsbDpwOm51bGw7Y2FzZSJTdWJleHByZXNzaW9uIjpmb3IoYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksZj0xO2Y8ZS5jaGlsZHJlbi5sZW5ndGg7ZisrKWlmKG51bGw9PT0oYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sYykpKXJldHVybiBudWxsO3JldHVybiBjO2Nhc2UiSW5kZXhFeHByZXNzaW9uIjpyZXR1cm4gZD10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksdGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGQpO2Nhc2UiSW5kZXgiOmlmKCF0KGkpKXJldHVybiBudWxsO3ZhciBnPWUudmFsdWU7cmV0dXJuIGc8MCYmKGc9aS5sZW5ndGgrZyksdm9pZCAwPT09KGM9aVtnXSkmJihjPW51bGwpLGM7Y2FzZSJTbGljZSI6aWYoIXQoaSkpcmV0dXJuIG51bGw7dmFyIG09ZS5jaGlsZHJlbi5zbGljZSgwKSx2PXRoaXMuY29tcHV0ZVNsaWNlUGFyYW1zKGkubGVuZ3RoLG0pLHk9dlswXSxFPXZbMV0sUz12WzJdO2lmKGM9W10sUz4wKWZvcihmPXk7ZjxFO2YrPVMpYy5wdXNoKGlbZl0pO2Vsc2UgZm9yKGY9eTtmPkU7Zis9UyljLnB1c2goaVtmXSk7cmV0dXJuIGM7Y2FzZSJQcm9qZWN0aW9uIjp2YXIgYj10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoYikpcmV0dXJuIG51bGw7Zm9yKGg9W10sZj0wO2Y8Yi5sZW5ndGg7ZisrKW51bGwhPT0oYT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sYltmXSkpJiZoLnB1c2goYSk7cmV0dXJuIGg7Y2FzZSJWYWx1ZVByb2plY3Rpb24iOmlmKCFuKGI9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDtoPVtdO3ZhciBDPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPVtdLHI9MDtyPHQubGVuZ3RoO3IrKyluLnB1c2goZVt0W3JdXSk7cmV0dXJuIG59KGIpO2ZvcihmPTA7ZjxDLmxlbmd0aDtmKyspbnVsbCE9PShhPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxDW2ZdKSkmJmgucHVzaChhKTtyZXR1cm4gaDtjYXNlIkZpbHRlclByb2plY3Rpb24iOmlmKCF0KGI9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDt2YXIgVD1bXSx3PVtdO2ZvcihmPTA7ZjxiLmxlbmd0aDtmKyspbyhzPXRoaXMudmlzaXQoZS5jaGlsZHJlblsyXSxiW2ZdKSl8fFQucHVzaChiW2ZdKTtmb3IodmFyIFI9MDtSPFQubGVuZ3RoO1IrKyludWxsIT09KGE9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLFRbUl0pKSYmdy5wdXNoKGEpO3JldHVybiB3O2Nhc2UiQ29tcGFyYXRvciI6c3dpdGNoKHU9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpLGw9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpLGUubmFtZSl7Y2FzZSBrOmM9cih1LGwpO2JyZWFrO2Nhc2UgUDpjPSFyKHUsbCk7YnJlYWs7Y2FzZSBMOmM9dT5sO2JyZWFrO2Nhc2UgTzpjPXU+PWw7YnJlYWs7Y2FzZSBOOmM9dTxsO2JyZWFrO2Nhc2UgRDpjPXU8PWw7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29tcGFyYXRvcjogIitlLm5hbWUpfXJldHVybiBjO2Nhc2UgeDp2YXIgTT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoTSkpcmV0dXJuIG51bGw7dmFyIFU9W107Zm9yKGY9MDtmPE0ubGVuZ3RoO2YrKyl0KGE9TVtmXSk/VS5wdXNoLmFwcGx5KFUsYSk6VS5wdXNoKGEpO3JldHVybiBVO2Nhc2UiSWRlbnRpdHkiOnJldHVybiBpO2Nhc2UiTXVsdGlTZWxlY3RMaXN0IjppZihudWxsPT09aSlyZXR1cm4gbnVsbDtmb3IoaD1bXSxmPTA7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspaC5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltmXSxpKSk7cmV0dXJuIGg7Y2FzZSJNdWx0aVNlbGVjdEhhc2giOmlmKG51bGw9PT1pKXJldHVybiBudWxsO3ZhciBGO2ZvcihoPXt9LGY9MDtmPGUuY2hpbGRyZW4ubGVuZ3RoO2YrKyloWyhGPWUuY2hpbGRyZW5bZl0pLm5hbWVdPXRoaXMudmlzaXQoRi52YWx1ZSxpKTtyZXR1cm4gaDtjYXNlIk9yRXhwcmVzc2lvbiI6cmV0dXJuIG8ocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpJiYocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0saSkpLHM7Y2FzZSJBbmRFeHByZXNzaW9uIjpyZXR1cm4hMD09PW8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpP3U6dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpO2Nhc2UiTm90RXhwcmVzc2lvbiI6cmV0dXJuIG8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpO2Nhc2UiTGl0ZXJhbCI6cmV0dXJuIGUudmFsdWU7Y2FzZSBfOnJldHVybiBkPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSx0aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sZCk7Y2FzZSBJOnJldHVybiBpO2Nhc2UiRnVuY3Rpb24iOnZhciBxPVtdO2ZvcihmPTA7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspcS5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltmXSxpKSk7cmV0dXJuIHRoaXMucnVudGltZS5jYWxsRnVuY3Rpb24oZS5uYW1lLHEpO2Nhc2UiRXhwcmVzc2lvblJlZmVyZW5jZSI6dmFyIEI9ZS5jaGlsZHJlblswXTtyZXR1cm4gQi5qbWVzcGF0aFR5cGU9QSxCO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG5vZGUgdHlwZTogIitlLnR5cGUpfX0sY29tcHV0ZVNsaWNlUGFyYW1zOmZ1bmN0aW9uKGUsdCl7dmFyIG49dFswXSxyPXRbMV0sbz10WzJdLGk9W251bGwsbnVsbCxudWxsXTtpZihudWxsPT09bylvPTE7ZWxzZSBpZigwPT09byl7dmFyIHM9bmV3IEVycm9yKCJJbnZhbGlkIHNsaWNlLCBzdGVwIGNhbm5vdCBiZSAwIik7dGhyb3cgcy5uYW1lPSJSdW50aW1lRXJyb3IiLHN9dmFyIGE9bzwwO3JldHVybiBuPW51bGw9PT1uP2E/ZS0xOjA6dGhpcy5jYXBTbGljZVJhbmdlKGUsbixvKSxyPW51bGw9PT1yP2E/LTE6ZTp0aGlzLmNhcFNsaWNlUmFuZ2UoZSxyLG8pLGlbMF09bixpWzFdPXIsaVsyXT1vLGl9LGNhcFNsaWNlUmFuZ2U6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PDA/KHQrPWUpPDAmJih0PW48MD8tMTowKTp0Pj1lJiYodD1uPDA/ZS0xOmUpLHR9fSxRLnByb3RvdHlwZT17Y2FsbEZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5mdW5jdGlvblRhYmxlW2VdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGZ1bmN0aW9uOiAiK2UrIigpIik7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlQXJncyhlLHQsbi5fc2lnbmF0dXJlKSxuLl9mdW5jLmNhbGwodGhpcyx0KX0sX3ZhbGlkYXRlQXJnczpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpLHM7aWYobltuLmxlbmd0aC0xXS52YXJpYWRpYyl7aWYodC5sZW5ndGg8bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyBhdCBsZWFzdCIrbi5sZW5ndGgrcisiIGJ1dCByZWNlaXZlZCAiK3QubGVuZ3RoKX1lbHNlIGlmKHQubGVuZ3RoIT09bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyAiK24ubGVuZ3RoK3IrIiBidXQgcmVjZWl2ZWQgIit0Lmxlbmd0aCk7Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspe3M9ITEsbz1uW2FdLnR5cGVzLGk9dGhpcy5fZ2V0VHlwZU5hbWUodFthXSk7Zm9yKHZhciBjPTA7YzxvLmxlbmd0aDtjKyspaWYodGhpcy5fdHlwZU1hdGNoZXMoaSxvW2NdLHRbYV0pKXtzPSEwO2JyZWFrfWlmKCFzKXt2YXIgdT1vLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGZbZV19KSkuam9pbigiLCIpO3Rocm93IG5ldyBFcnJvcigiVHlwZUVycm9yOiAiK2UrIigpIGV4cGVjdGVkIGFyZ3VtZW50ICIrKGErMSkrIiB0byBiZSB0eXBlICIrdSsiIGJ1dCByZWNlaXZlZCB0eXBlICIrZltpXSsiIGluc3RlYWQuIil9fX0sX3R5cGVNYXRjaGVzOmZ1bmN0aW9uKGUsdCxuKXtpZih0PT09YSlyZXR1cm4hMDtpZih0IT09aCYmdCE9PWQmJnQhPT11KXJldHVybiBlPT09dDtpZih0PT09dSlyZXR1cm4gZT09PXU7aWYoZT09PXUpe3ZhciByO3Q9PT1kP3I9czp0PT09aCYmKHI9Yyk7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspaWYoIXRoaXMuX3R5cGVNYXRjaGVzKHRoaXMuX2dldFR5cGVOYW1lKG5bb10pLHIsbltvXSkpcmV0dXJuITE7cmV0dXJuITB9fSxfZ2V0VHlwZU5hbWU6ZnVuY3Rpb24oZSl7c3dpdGNoKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSl7Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiBjO2Nhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gcztjYXNlIltvYmplY3QgQXJyYXldIjpyZXR1cm4gdTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOnJldHVybiA1O2Nhc2UiW29iamVjdCBOdWxsXSI6cmV0dXJuIDc7Y2FzZSJbb2JqZWN0IE9iamVjdF0iOnJldHVybiBlLmptZXNwYXRoVHlwZT09PUE/cDpsfX0sX2Z1bmN0aW9uU3RhcnRzV2l0aDpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWVbMF0ubGFzdEluZGV4T2YoZVsxXSl9LF9mdW5jdGlvbkVuZHNXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO3JldHVybi0xIT09dC5pbmRleE9mKG4sdC5sZW5ndGgtbi5sZW5ndGgpfSxfZnVuY3Rpb25SZXZlcnNlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pPT09Yyl7Zm9yKHZhciB0PWVbMF0sbj0iIixyPXQubGVuZ3RoLTE7cj49MDtyLS0pbis9dFtyXTtyZXR1cm4gbn12YXIgbz1lWzBdLnNsaWNlKDApO3JldHVybiBvLnJldmVyc2UoKSxvfSxfZnVuY3Rpb25BYnM6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguYWJzKGVbMF0pfSxfZnVuY3Rpb25DZWlsOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmNlaWwoZVswXSl9LF9mdW5jdGlvbkF2ZzpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWVbMF0scj0wO3I8bi5sZW5ndGg7cisrKXQrPW5bcl07cmV0dXJuIHQvbi5sZW5ndGh9LF9mdW5jdGlvbkNvbnRhaW5zOmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLmluZGV4T2YoZVsxXSk+PTB9LF9mdW5jdGlvbkZsb29yOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmZsb29yKGVbMF0pfSxfZnVuY3Rpb25MZW5ndGg6ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZVswXSk/T2JqZWN0LmtleXMoZVswXSkubGVuZ3RoOmVbMF0ubGVuZ3RofSxfZnVuY3Rpb25NYXA6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49dGhpcy5faW50ZXJwcmV0ZXIscj1lWzBdLG89ZVsxXSxpPTA7aTxvLmxlbmd0aDtpKyspdC5wdXNoKG4udmlzaXQocixvW2ldKSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1lcmdlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07Zm9yKHZhciBvIGluIHIpdFtvXT1yW29dfXJldHVybiB0fSxfZnVuY3Rpb25NYXg6ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1zKXJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspbi5sb2NhbGVDb21wYXJlKHRbcl0pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25NaW46ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1zKXJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspdFtyXS5sb2NhbGVDb21wYXJlKG4pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25TdW06ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lWzBdLHI9MDtyPG4ubGVuZ3RoO3IrKyl0Kz1uW3JdO3JldHVybiB0fSxfZnVuY3Rpb25UeXBlOmZ1bmN0aW9uKGUpe3N3aXRjaCh0aGlzLl9nZXRUeXBlTmFtZShlWzBdKSl7Y2FzZSBzOnJldHVybiJudW1iZXIiO2Nhc2UgYzpyZXR1cm4ic3RyaW5nIjtjYXNlIHU6cmV0dXJuImFycmF5IjtjYXNlIGw6cmV0dXJuIm9iamVjdCI7Y2FzZSA1OnJldHVybiJib29sZWFuIjtjYXNlIHA6cmV0dXJuImV4cHJlZiI7Y2FzZSA3OnJldHVybiJudWxsIn19LF9mdW5jdGlvbktleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5rZXlzKGVbMF0pfSxfZnVuY3Rpb25WYWx1ZXM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWVbMF0sbj1PYmplY3Qua2V5cyh0KSxyPVtdLG89MDtvPG4ubGVuZ3RoO28rKylyLnB1c2godFtuW29dXSk7cmV0dXJuIHJ9LF9mdW5jdGlvbkpvaW46ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtyZXR1cm4gZVsxXS5qb2luKHQpfSxfZnVuY3Rpb25Ub0FycmF5OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PXU/ZVswXTpbZVswXV19LF9mdW5jdGlvblRvU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PWM/ZVswXTpKU09OLnN0cmluZ2lmeShlWzBdKX0sX2Z1bmN0aW9uVG9OdW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9nZXRUeXBlTmFtZShlWzBdKTtyZXR1cm4gbj09PXM/ZVswXTpuIT09Y3x8KHQ9K2VbMF0saXNOYU4odCkpP251bGw6dH0sX2Z1bmN0aW9uTm90TnVsbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZig3IT09dGhpcy5fZ2V0VHlwZU5hbWUoZVt0XSkpcmV0dXJuIGVbdF07cmV0dXJuIG51bGx9LF9mdW5jdGlvblNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5zbGljZSgwKTtyZXR1cm4gdC5zb3J0KCksdH0sX2Z1bmN0aW9uU29ydEJ5OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0uc2xpY2UoMCk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB0O3ZhciBuPXRoaXMuX2ludGVycHJldGVyLHI9ZVsxXSxvPXRoaXMuX2dldFR5cGVOYW1lKG4udmlzaXQocix0WzBdKSk7aWYoW3MsY10uaW5kZXhPZihvKTwwKXRocm93IG5ldyBFcnJvcigiVHlwZUVycm9yIik7Zm9yKHZhciBpPXRoaXMsYT1bXSx1PTA7dTx0Lmxlbmd0aDt1KyspYS5wdXNoKFt1LHRbdV1dKTthLnNvcnQoKGZ1bmN0aW9uKGUsdCl7dmFyIHM9bi52aXNpdChyLGVbMV0pLGE9bi52aXNpdChyLHRbMV0pO2lmKGkuX2dldFR5cGVOYW1lKHMpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUocykpO2lmKGkuX2dldFR5cGVOYW1lKGEpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUoYSkpO3JldHVybiBzPmE/MTpzPGE/LTE6ZVswXS10WzBdfSkpO2Zvcih2YXIgbD0wO2w8YS5sZW5ndGg7bCsrKXRbbF09YVtsXVsxXTtyZXR1cm4gdH0sX2Z1bmN0aW9uTWF4Qnk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1lWzFdLG89ZVswXSxpPXRoaXMuY3JlYXRlS2V5RnVuY3Rpb24ocixbcyxjXSksYT0tMS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKT5hJiYoYT1uLHQ9b1t1XSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1pbkJ5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9ZVsxXSxvPWVbMF0saT10aGlzLmNyZWF0ZUtleUZ1bmN0aW9uKHIsW3MsY10pLGE9MS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKTxhJiYoYT1uLHQ9b1t1XSk7cmV0dXJuIHR9LGNyZWF0ZUtleUZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPXRoaXMuX2ludGVycHJldGVyO3JldHVybiBmdW5jdGlvbihvKXt2YXIgaT1yLnZpc2l0KGUsbyk7aWYodC5pbmRleE9mKG4uX2dldFR5cGVOYW1lKGkpKTwwKXt2YXIgcz0iVHlwZUVycm9yOiBleHBlY3RlZCBvbmUgb2YgIit0KyIsIHJlY2VpdmVkICIrbi5fZ2V0VHlwZU5hbWUoaSk7dGhyb3cgbmV3IEVycm9yKHMpfXJldHVybiBpfX19LGUudG9rZW5pemU9ZnVuY3Rpb24oZSl7cmV0dXJuKG5ldyBYKS50b2tlbml6ZShlKX0sZS5jb21waWxlPWZ1bmN0aW9uKGUpe3JldHVybihuZXcgJCkucGFyc2UoZSl9LGUuc2VhcmNoPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3ICQscj1uZXcgUSxvPW5ldyBKKHIpO3IuX2ludGVycHJldGVyPW87dmFyIGk9bi5wYXJzZSh0KTtyZXR1cm4gby5zZWFyY2goaSxlKX0sZS5zdHJpY3REZWVwRXF1YWw9cn0odm9pZCAwPT09bj90aGlzLmptZXNwYXRoPXt9Om4pfSx7fV0sOTE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGk9dC5leHBvcnRzPXt9O2Z1bmN0aW9uIHMoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBhKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBjKGUpe2lmKHI9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKHI9PT1zfHwhcikmJnNldFRpbWVvdXQpcmV0dXJuIHI9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiByKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiByLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiByLmNhbGwodGhpcyxlLDApfX19IWZ1bmN0aW9uKCl7dHJ5e3I9ImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDpzfWNhdGNoKGUpe3I9c310cnl7bz0iZnVuY3Rpb24iPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDphfWNhdGNoKGUpe289YX19KCk7dmFyIHUsbD1bXSxwPSExLGQ9LTE7ZnVuY3Rpb24gaCgpe3AmJnUmJihwPSExLHUubGVuZ3RoP2w9dS5jb25jYXQobCk6ZD0tMSxsLmxlbmd0aCYmZigpKX1mdW5jdGlvbiBmKCl7aWYoIXApe3ZhciBlPWMoaCk7cD0hMDtmb3IodmFyIHQ9bC5sZW5ndGg7dDspe2Zvcih1PWwsbD1bXTsrK2Q8dDspdSYmdVtkXS5ydW4oKTtkPS0xLHQ9bC5sZW5ndGh9dT1udWxsLHA9ITEsZnVuY3Rpb24oZSl7aWYobz09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKChvPT09YXx8IW8pJiZjbGVhclRpbWVvdXQpcmV0dXJuIG89Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7cmV0dXJuIG8oZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBvLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gby5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIGcoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1mdW5jdGlvbiBtKCl7fWkubmV4dFRpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtsLnB1c2gobmV3IGcoZSx0KSksMSE9PWwubGVuZ3RofHxwfHxjKGYpfSxnLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxpLnRpdGxlPSJicm93c2VyIixpLmJyb3dzZXI9ITAsaS5lbnY9e30saS5hcmd2PVtdLGkudmVyc2lvbj0iIixpLnZlcnNpb25zPXt9LGkub249bSxpLmFkZExpc3RlbmVyPW0saS5vbmNlPW0saS5vZmY9bSxpLnJlbW92ZUxpc3RlbmVyPW0saS5yZW1vdmVBbGxMaXN0ZW5lcnM9bSxpLmVtaXQ9bSxpLnByZXBlbmRMaXN0ZW5lcj1tLGkucHJlcGVuZE9uY2VMaXN0ZW5lcj1tLGkubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybltdfSxpLmJpbmRpbmc9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxpLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0saS5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxpLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sOTI6W2Z1bmN0aW9uKGUsdCxvKXsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGkpeyJvYmplY3QiPT10eXBlb2YgbyYmbyYmby5ub2RlVHlwZSwib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQubm9kZVR5cGU7dmFyIHM9Im9iamVjdCI9PXR5cGVvZiBlJiZlO3MuZ2xvYmFsIT09cyYmcy53aW5kb3chPT1zJiZzLnNlbGY7dmFyIGEsYz0yMTQ3NDgzNjQ3LHU9MzYsbD0xLHA9MjYsZD0zOCxoPTcwMCxmPTcyLGc9MTI4LG09Ii0iLHY9L154bi0tLyx5PS9bXlx4MjAtXHg3RV0vLEU9L1tceDJFXHUzMDAyXHVGRjBFXHVGRjYxXS9nLFM9e292ZXJmbG93OiJPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcyIsIm5vdC1iYXNpYyI6IklsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCkiLCJpbnZhbGlkLWlucHV0IjoiSW52YWxpZCBpbnB1dCJ9LGI9dS1sLEM9TWF0aC5mbG9vcixUPVN0cmluZy5mcm9tQ2hhckNvZGU7ZnVuY3Rpb24gSShlKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihTW2VdKX1mdW5jdGlvbiBBKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9W107bi0tOylyW25dPXQoZVtuXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gXyhlLHQpe3ZhciBuPWUuc3BsaXQoIkAiKSxyPSIiO3JldHVybiBuLmxlbmd0aD4xJiYocj1uWzBdKyJAIixlPW5bMV0pLHIrQSgoZT1lLnJlcGxhY2UoRSwiLiIpKS5zcGxpdCgiLiIpLHQpLmpvaW4oIi4iKX1mdW5jdGlvbiB3KGUpe2Zvcih2YXIgdCxuLHI9W10sbz0wLGk9ZS5sZW5ndGg7bzxpOykodD1lLmNoYXJDb2RlQXQobysrKSk+PTU1Mjk2JiZ0PD01NjMxOSYmbzxpPzU2MzIwPT0oNjQ1MTImKG49ZS5jaGFyQ29kZUF0KG8rKykpKT9yLnB1c2goKCgxMDIzJnQpPDwxMCkrKDEwMjMmbikrNjU1MzYpOihyLnB1c2godCksby0tKTpyLnB1c2godCk7cmV0dXJuIHJ9ZnVuY3Rpb24gUihlKXtyZXR1cm4gQShlLChmdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZT42NTUzNSYmKHQrPVQoKGUtPTY1NTM2KT4+PjEwJjEwMjN8NTUyOTYpLGU9NTYzMjB8MTAyMyZlKSx0Kz1UKGUpfSkpLmpvaW4oIiIpfWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm4gZSsyMis3NSooZTwyNiktKCgwIT10KTw8NSl9ZnVuY3Rpb24gTChlLHQsbil7dmFyIHI9MDtmb3IoZT1uP0MoZS9oKTplPj4xLGUrPUMoZS90KTtlPmIqcD4+MTtyKz11KWU9QyhlL2IpO3JldHVybiBDKHIrKGIrMSkqZS8oZStkKSl9ZnVuY3Rpb24gTihlKXt2YXIgdCxuLHIsbyxpLHMsYSxkLGgsdix5LEU9W10sUz1lLmxlbmd0aCxiPTAsVD1nLEE9Zjtmb3IoKG49ZS5sYXN0SW5kZXhPZihtKSk8MCYmKG49MCkscj0wO3I8bjsrK3IpZS5jaGFyQ29kZUF0KHIpPj0xMjgmJkkoIm5vdC1iYXNpYyIpLEUucHVzaChlLmNoYXJDb2RlQXQocikpO2ZvcihvPW4+MD9uKzE6MDtvPFM7KXtmb3IoaT1iLHM9MSxhPXU7bz49UyYmSSgiaW52YWxpZC1pbnB1dCIpLCgoZD0oeT1lLmNoYXJDb2RlQXQobysrKSktNDg8MTA/eS0yMjp5LTY1PDI2P3ktNjU6eS05NzwyNj95LTk3OnUpPj11fHxkPkMoKGMtYikvcykpJiZJKCJvdmVyZmxvdyIpLGIrPWQqcywhKGQ8KGg9YTw9QT9sOmE+PUErcD9wOmEtQSkpO2ErPXUpcz5DKGMvKHY9dS1oKSkmJkkoIm92ZXJmbG93Iikscyo9djtBPUwoYi1pLHQ9RS5sZW5ndGgrMSwwPT1pKSxDKGIvdCk+Yy1UJiZJKCJvdmVyZmxvdyIpLFQrPUMoYi90KSxiJT10LEUuc3BsaWNlKGIrKywwLFQpfXJldHVybiBSKEUpfWZ1bmN0aW9uIE8oZSl7dmFyIHQsbixyLG8saSxzLGEsZCxoLHYseSxFLFMsYixBLF89W107Zm9yKEU9KGU9dyhlKSkubGVuZ3RoLHQ9ZyxuPTAsaT1mLHM9MDtzPEU7KytzKSh5PWVbc10pPDEyOCYmXy5wdXNoKFQoeSkpO2ZvcihyPW89Xy5sZW5ndGgsbyYmXy5wdXNoKG0pO3I8RTspe2ZvcihhPWMscz0wO3M8RTsrK3MpKHk9ZVtzXSk+PXQmJnk8YSYmKGE9eSk7Zm9yKGEtdD5DKChjLW4pLyhTPXIrMSkpJiZJKCJvdmVyZmxvdyIpLG4rPShhLXQpKlMsdD1hLHM9MDtzPEU7KytzKWlmKCh5PWVbc10pPHQmJisrbj5jJiZJKCJvdmVyZmxvdyIpLHk9PXQpe2ZvcihkPW4saD11OyEoZDwodj1oPD1pP2w6aD49aStwP3A6aC1pKSk7aCs9dSlBPWQtdixiPXUtdixfLnB1c2goVChrKHYrQSViLDApKSksZD1DKEEvYik7Xy5wdXNoKFQoayhkLDApKSksaT1MKG4sUyxyPT1vKSxuPTAsKytyfSsrbiwrK3R9cmV0dXJuIF8uam9pbigiIil9YT17dmVyc2lvbjoiMS40LjEiLHVjczI6e2RlY29kZTp3LGVuY29kZTpSfSxkZWNvZGU6TixlbmNvZGU6Tyx0b0FTQ0lJOmZ1bmN0aW9uKGUpe3JldHVybiBfKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB5LnRlc3QoZSk/InhuLS0iK08oZSk6ZX0pKX0sdG9Vbmljb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBfKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB2LnRlc3QoZSk/TihlLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpOmV9KSl9fSx2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybiBhfS5jYWxsKG8sbixvLHQpKXx8KHQuZXhwb3J0cz1yKX0oKX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7fV0sOTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4saSl7dD10fHwiJiIsbj1ufHwiPSI7dmFyIHM9e307aWYoInN0cmluZyIhPXR5cGVvZiBlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIHM7dmFyIGE9L1wrL2c7ZT1lLnNwbGl0KHQpO3ZhciBjPTFlMztpJiYibnVtYmVyIj09dHlwZW9mIGkubWF4S2V5cyYmKGM9aS5tYXhLZXlzKTt2YXIgdT1lLmxlbmd0aDtjPjAmJnU+YyYmKHU9Yyk7Zm9yKHZhciBsPTA7bDx1OysrbCl7dmFyIHAsZCxoLGYsZz1lW2xdLnJlcGxhY2UoYSwiJTIwIiksbT1nLmluZGV4T2Yobik7bT49MD8ocD1nLnN1YnN0cigwLG0pLGQ9Zy5zdWJzdHIobSsxKSk6KHA9ZyxkPSIiKSxoPWRlY29kZVVSSUNvbXBvbmVudChwKSxmPWRlY29kZVVSSUNvbXBvbmVudChkKSxyKHMsaCk/byhzW2hdKT9zW2hdLnB1c2goZik6c1toXT1bc1toXSxmXTpzW2hdPWZ9cmV0dXJuIHN9O3ZhciBvPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9fSx7fV0sOTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlInN0cmluZyI6cmV0dXJuIGU7Y2FzZSJib29sZWFuIjpyZXR1cm4gZT8idHJ1ZSI6ImZhbHNlIjtjYXNlIm51bWJlciI6cmV0dXJuIGlzRmluaXRlKGUpP2U6IiI7ZGVmYXVsdDpyZXR1cm4iIn19O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixhKXtyZXR1cm4gdD10fHwiJiIsbj1ufHwiPSIsbnVsbD09PWUmJihlPXZvaWQgMCksIm9iamVjdCI9PXR5cGVvZiBlP2kocyhlKSwoZnVuY3Rpb24ocyl7dmFyIGE9ZW5jb2RlVVJJQ29tcG9uZW50KHIocykpK247cmV0dXJuIG8oZVtzXSk/aShlW3NdLChmdW5jdGlvbihlKXtyZXR1cm4gYStlbmNvZGVVUklDb21wb25lbnQocihlKSl9KSkuam9pbih0KTphK2VuY29kZVVSSUNvbXBvbmVudChyKGVbc10pKX0pKS5qb2luKHQpOmE/ZW5jb2RlVVJJQ29tcG9uZW50KHIoYSkpK24rZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpOiIifTt2YXIgbz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfTtmdW5jdGlvbiBpKGUsdCl7aWYoZS5tYXApcmV0dXJuIGUubWFwKHQpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspbi5wdXNoKHQoZVtyXSxyKSk7cmV0dXJuIG59dmFyIHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LnB1c2gobik7cmV0dXJuIHR9fSx7fV0sOTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5kZWNvZGU9bi5wYXJzZT1lKCIuL2RlY29kZSIpLG4uZW5jb2RlPW4uc3RyaW5naWZ5PWUoIi4vZW5jb2RlIil9LHsiLi9kZWNvZGUiOjkzLCIuL2VuY29kZSI6OTR9XSw5NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXQuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXt0PXR8fCImIixuPW58fCI9Ijt2YXIgaT17fTtpZigic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aClyZXR1cm4gaTt2YXIgcz0vXCsvZztlPWUuc3BsaXQodCk7dmFyIGE9MWUzO28mJiJudW1iZXIiPT10eXBlb2Ygby5tYXhLZXlzJiYoYT1vLm1heEtleXMpO3ZhciBjPWUubGVuZ3RoO2E+MCYmYz5hJiYoYz1hKTtmb3IodmFyIHU9MDt1PGM7Kyt1KXt2YXIgbCxwLGQsaCxmPWVbdV0ucmVwbGFjZShzLCIlMjAiKSxnPWYuaW5kZXhPZihuKTtnPj0wPyhsPWYuc3Vic3RyKDAsZykscD1mLnN1YnN0cihnKzEpKToobD1mLHA9IiIpLGQ9ZGVjb2RlVVJJQ29tcG9uZW50KGwpLGg9ZGVjb2RlVVJJQ29tcG9uZW50KHApLHIoaSxkKT9BcnJheS5pc0FycmF5KGlbZF0pP2lbZF0ucHVzaChoKTppW2RdPVtpW2RdLGhdOmlbZF09aH1yZXR1cm4gaX19LHt9XSw5NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbihlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gZTtjYXNlImJvb2xlYW4iOnJldHVybiBlPyJ0cnVlIjoiZmFsc2UiO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk/ZToiIjtkZWZhdWx0OnJldHVybiIifX07dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLG8pe3JldHVybiB0PXR8fCImIixuPW58fCI9IixudWxsPT09ZSYmKGU9dm9pZCAwKSwib2JqZWN0Ij09dHlwZW9mIGU/T2JqZWN0LmtleXMoZSkubWFwKChmdW5jdGlvbihvKXt2YXIgaT1lbmNvZGVVUklDb21wb25lbnQocihvKSkrbjtyZXR1cm4gQXJyYXkuaXNBcnJheShlW29dKT9lW29dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGkrZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpfSkpLmpvaW4odCk6aStlbmNvZGVVUklDb21wb25lbnQocihlW29dKSl9KSkuam9pbih0KTpvP2VuY29kZVVSSUNvbXBvbmVudChyKG8pKStuK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKToiIn19LHt9XSw5ODpbZnVuY3Rpb24oZSx0LG4pe2FyZ3VtZW50c1s0XVs5NV1bMF0uYXBwbHkobixhcmd1bWVudHMpfSx7Ii4vZGVjb2RlIjo5NiwiLi9lbmNvZGUiOjk3LGR1cDo5NX1dLDk5OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQscil7KGZ1bmN0aW9uKCl7dmFyIG89ZSgicHJvY2Vzcy9icm93c2VyLmpzIikubmV4dFRpY2ssaT1GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkscz1BcnJheS5wcm90b3R5cGUuc2xpY2UsYT17fSxjPTA7ZnVuY3Rpb24gdShlLHQpe3RoaXMuX2lkPWUsdGhpcy5fY2xlYXJGbj10fW4uc2V0VGltZW91dD1mdW5jdGlvbigpe3JldHVybiBuZXcgdShpLmNhbGwoc2V0VGltZW91dCx3aW5kb3csYXJndW1lbnRzKSxjbGVhclRpbWVvdXQpfSxuLnNldEludGVydmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1KGkuY2FsbChzZXRJbnRlcnZhbCx3aW5kb3csYXJndW1lbnRzKSxjbGVhckludGVydmFsKX0sbi5jbGVhclRpbWVvdXQ9bi5jbGVhckludGVydmFsPWZ1bmN0aW9uKGUpe2UuY2xvc2UoKX0sdS5wcm90b3R5cGUudW5yZWY9dS5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKCl7fSx1LnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyRm4uY2FsbCh3aW5kb3csdGhpcy5faWQpfSxuLmVucm9sbD1mdW5jdGlvbihlLHQpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD10fSxuLnVuZW5yb2xsPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD0tMX0sbi5fdW5yZWZBY3RpdmU9bi5hY3RpdmU9ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpO3ZhciB0PWUuX2lkbGVUaW1lb3V0O3Q+PTAmJihlLl9pZGxlVGltZW91dElkPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5fb25UaW1lb3V0JiZlLl9vblRpbWVvdXQoKX0pLHQpKX0sbi5zZXRJbW1lZGlhdGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbihlKXt2YXIgdD1jKysscj0hKGFyZ3VtZW50cy5sZW5ndGg8MikmJnMuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGFbdF09ITAsbygoZnVuY3Rpb24oKXthW3RdJiYocj9lLmFwcGx5KG51bGwscik6ZS5jYWxsKG51bGwpLG4uY2xlYXJJbW1lZGlhdGUodCkpfSkpLHR9LG4uY2xlYXJJbW1lZGlhdGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpmdW5jdGlvbihlKXtkZWxldGUgYVtlXX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoInRpbWVycyIpLnNldEltbWVkaWF0ZSxlKCJ0aW1lcnMiKS5jbGVhckltbWVkaWF0ZSl9LHsicHJvY2Vzcy9icm93c2VyLmpzIjo5MSx0aW1lcnM6OTl9XSwxMDA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJwdW55Y29kZSIpO2Z1bmN0aW9uIG8oKXt0aGlzLnByb3RvY29sPW51bGwsdGhpcy5zbGFzaGVzPW51bGwsdGhpcy5hdXRoPW51bGwsdGhpcy5ob3N0PW51bGwsdGhpcy5wb3J0PW51bGwsdGhpcy5ob3N0bmFtZT1udWxsLHRoaXMuaGFzaD1udWxsLHRoaXMuc2VhcmNoPW51bGwsdGhpcy5xdWVyeT1udWxsLHRoaXMucGF0aG5hbWU9bnVsbCx0aGlzLnBhdGg9bnVsbCx0aGlzLmhyZWY9bnVsbH1uLnBhcnNlPXYsbi5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYoZSwhMSwhMCkucmVzb2x2ZSh0KX0sbi5yZXNvbHZlT2JqZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU/dihlLCExLCEwKS5yZXNvbHZlT2JqZWN0KHQpOnR9LG4uZm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiB5KGUpJiYoZT12KGUpKSxlIGluc3RhbmNlb2Ygbz9lLmZvcm1hdCgpOm8ucHJvdG90eXBlLmZvcm1hdC5jYWxsKGUpfSxuLlVybD1vO3ZhciBpPS9eKFthLXowLTkuKy1dKzopL2kscz0vOlswLTldKiQvLGE9WyJ7IiwifSIsInwiLCJcXCIsIl4iLCJgIl0uY29uY2F0KFsiPCIsIj4iLCciJywiYCIsIiAiLCJcciIsIlxuIiwiXHQiXSksYz1bIiciXS5jb25jYXQoYSksdT1bIiUiLCIvIiwiPyIsIjsiLCIjIl0uY29uY2F0KGMpLGw9WyIvIiwiPyIsIiMiXSxwPS9eW2EtejAtOUEtWl8tXXswLDYzfSQvLGQ9L14oW2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8saD17amF2YXNjcmlwdDohMCwiamF2YXNjcmlwdDoiOiEwfSxmPXtqYXZhc2NyaXB0OiEwLCJqYXZhc2NyaXB0OiI6ITB9LGc9e2h0dHA6ITAsaHR0cHM6ITAsZnRwOiEwLGdvcGhlcjohMCxmaWxlOiEwLCJodHRwOiI6ITAsImh0dHBzOiI6ITAsImZ0cDoiOiEwLCJnb3BoZXI6IjohMCwiZmlsZToiOiEwfSxtPWUoInF1ZXJ5c3RyaW5nIik7ZnVuY3Rpb24gdihlLHQsbil7aWYoZSYmRShlKSYmZSBpbnN0YW5jZW9mIG8pcmV0dXJuIGU7dmFyIHI9bmV3IG87cmV0dXJuIHIucGFyc2UoZSx0LG4pLHJ9ZnVuY3Rpb24geShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9ZnVuY3Rpb24gRShlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIG51bGw9PT1lfW8ucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCxuKXtpZigheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90ICIrdHlwZW9mIGUpO3ZhciBvPWU7bz1vLnRyaW0oKTt2YXIgcz1pLmV4ZWMobyk7aWYocyl7dmFyIGE9KHM9c1swXSkudG9Mb3dlckNhc2UoKTt0aGlzLnByb3RvY29sPWEsbz1vLnN1YnN0cihzLmxlbmd0aCl9aWYobnx8c3x8by5tYXRjaCgvXlwvXC9bXkBcL10rQFteQFwvXSsvKSl7dmFyIHY9Ii8vIj09PW8uc3Vic3RyKDAsMik7IXZ8fHMmJmZbc118fChvPW8uc3Vic3RyKDIpLHRoaXMuc2xhc2hlcz0hMCl9aWYoIWZbc10mJih2fHxzJiYhZ1tzXSkpe2Zvcih2YXIgRSxTLGI9LTEsQz0wO0M8bC5sZW5ndGg7QysrKS0xIT09KFQ9by5pbmRleE9mKGxbQ10pKSYmKC0xPT09Ynx8VDxiKSYmKGI9VCk7Zm9yKC0xIT09KFM9LTE9PT1iP28ubGFzdEluZGV4T2YoIkAiKTpvLmxhc3RJbmRleE9mKCJAIixiKSkmJihFPW8uc2xpY2UoMCxTKSxvPW8uc2xpY2UoUysxKSx0aGlzLmF1dGg9ZGVjb2RlVVJJQ29tcG9uZW50KEUpKSxiPS0xLEM9MDtDPHUubGVuZ3RoO0MrKyl7dmFyIFQ7LTEhPT0oVD1vLmluZGV4T2YodVtDXSkpJiYoLTE9PT1ifHxUPGIpJiYoYj1UKX0tMT09PWImJihiPW8ubGVuZ3RoKSx0aGlzLmhvc3Q9by5zbGljZSgwLGIpLG89by5zbGljZShiKSx0aGlzLnBhcnNlSG9zdCgpLHRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZXx8IiI7dmFyIEk9IlsiPT09dGhpcy5ob3N0bmFtZVswXSYmIl0iPT09dGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aC0xXTtpZighSSlmb3IodmFyIEE9dGhpcy5ob3N0bmFtZS5zcGxpdCgvXC4vKSxfPShDPTAsQS5sZW5ndGgpO0M8XztDKyspe3ZhciB3PUFbQ107aWYodyYmIXcubWF0Y2gocCkpe2Zvcih2YXIgUj0iIixrPTAsTD13Lmxlbmd0aDtrPEw7aysrKXcuY2hhckNvZGVBdChrKT4xMjc/Uis9IngiOlIrPXdba107aWYoIVIubWF0Y2gocCkpe3ZhciBOPUEuc2xpY2UoMCxDKSxPPUEuc2xpY2UoQysxKSxEPXcubWF0Y2goZCk7RCYmKE4ucHVzaChEWzFdKSxPLnVuc2hpZnQoRFsyXSkpLE8ubGVuZ3RoJiYobz0iLyIrTy5qb2luKCIuIikrbyksdGhpcy5ob3N0bmFtZT1OLmpvaW4oIi4iKTticmVha319fWlmKHRoaXMuaG9zdG5hbWUubGVuZ3RoPjI1NT90aGlzLmhvc3RuYW1lPSIiOnRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLCFJKXt2YXIgUD10aGlzLmhvc3RuYW1lLnNwbGl0KCIuIikseD1bXTtmb3IoQz0wO0M8UC5sZW5ndGg7KytDKXt2YXIgTT1QW0NdO3gucHVzaChNLm1hdGNoKC9bXkEtWmEtejAtOV8tXS8pPyJ4bi0tIityLmVuY29kZShNKTpNKX10aGlzLmhvc3RuYW1lPXguam9pbigiLiIpfXZhciBVPXRoaXMucG9ydD8iOiIrdGhpcy5wb3J0OiIiLEY9dGhpcy5ob3N0bmFtZXx8IiI7dGhpcy5ob3N0PUYrVSx0aGlzLmhyZWYrPXRoaXMuaG9zdCxJJiYodGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lLnN1YnN0cigxLHRoaXMuaG9zdG5hbWUubGVuZ3RoLTIpLCIvIiE9PW9bMF0mJihvPSIvIitvKSl9aWYoIWhbYV0pZm9yKEM9MCxfPWMubGVuZ3RoO0M8XztDKyspe3ZhciBxPWNbQ10sQj1lbmNvZGVVUklDb21wb25lbnQocSk7Qj09PXEmJihCPWVzY2FwZShxKSksbz1vLnNwbGl0KHEpLmpvaW4oQil9dmFyIGo9by5pbmRleE9mKCIjIik7LTEhPT1qJiYodGhpcy5oYXNoPW8uc3Vic3RyKGopLG89by5zbGljZSgwLGopKTt2YXIgVj1vLmluZGV4T2YoIj8iKTtyZXR1cm4tMSE9PVY/KHRoaXMuc2VhcmNoPW8uc3Vic3RyKFYpLHRoaXMucXVlcnk9by5zdWJzdHIoVisxKSx0JiYodGhpcy5xdWVyeT1tLnBhcnNlKHRoaXMucXVlcnkpKSxvPW8uc2xpY2UoMCxWKSk6dCYmKHRoaXMuc2VhcmNoPSIiLHRoaXMucXVlcnk9e30pLG8mJih0aGlzLnBhdGhuYW1lPW8pLGdbYV0mJnRoaXMuaG9zdG5hbWUmJiF0aGlzLnBhdGhuYW1lJiYodGhpcy5wYXRobmFtZT0iLyIpLCh0aGlzLnBhdGhuYW1lfHx0aGlzLnNlYXJjaCkmJihVPXRoaXMucGF0aG5hbWV8fCIiLE09dGhpcy5zZWFyY2h8fCIiLHRoaXMucGF0aD1VK00pLHRoaXMuaHJlZj10aGlzLmZvcm1hdCgpLHRoaXN9LG8ucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYXV0aHx8IiI7ZSYmKGU9KGU9ZW5jb2RlVVJJQ29tcG9uZW50KGUpKS5yZXBsYWNlKC8lM0EvaSwiOiIpLGUrPSJAIik7dmFyIHQ9dGhpcy5wcm90b2NvbHx8IiIsbj10aGlzLnBhdGhuYW1lfHwiIixyPXRoaXMuaGFzaHx8IiIsbz0hMSxpPSIiO3RoaXMuaG9zdD9vPWUrdGhpcy5ob3N0OnRoaXMuaG9zdG5hbWUmJihvPWUrKC0xPT09dGhpcy5ob3N0bmFtZS5pbmRleE9mKCI6Iik/dGhpcy5ob3N0bmFtZToiWyIrdGhpcy5ob3N0bmFtZSsiXSIpLHRoaXMucG9ydCYmKG8rPSI6Iit0aGlzLnBvcnQpKSx0aGlzLnF1ZXJ5JiZFKHRoaXMucXVlcnkpJiZPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgmJihpPW0uc3RyaW5naWZ5KHRoaXMucXVlcnkpKTt2YXIgcz10aGlzLnNlYXJjaHx8aSYmIj8iK2l8fCIiO3JldHVybiB0JiYiOiIhPT10LnN1YnN0cigtMSkmJih0Kz0iOiIpLHRoaXMuc2xhc2hlc3x8KCF0fHxnW3RdKSYmITEhPT1vPyhvPSIvLyIrKG98fCIiKSxuJiYiLyIhPT1uLmNoYXJBdCgwKSYmKG49Ii8iK24pKTpvfHwobz0iIiksciYmIiMiIT09ci5jaGFyQXQoMCkmJihyPSIjIityKSxzJiYiPyIhPT1zLmNoYXJBdCgwKSYmKHM9Ij8iK3MpLHQrbysobj1uLnJlcGxhY2UoL1s/I10vZywoZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKX0pKSkrKHM9cy5yZXBsYWNlKCIjIiwiJTIzIikpK3J9LG8ucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh2KGUsITEsITApKS5mb3JtYXQoKX0sby5wcm90b3R5cGUucmVzb2x2ZU9iamVjdD1mdW5jdGlvbihlKXtpZih5KGUpKXt2YXIgdD1uZXcgbzt0LnBhcnNlKGUsITEsITApLGU9dH12YXIgbj1uZXcgbztpZihPYmplY3Qua2V5cyh0aGlzKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW2VdPXRoaXNbZV19KSx0aGlzKSxuLmhhc2g9ZS5oYXNoLCIiPT09ZS5ocmVmKXJldHVybiBuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKGUuc2xhc2hlcyYmIWUucHJvdG9jb2wpcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpeyJwcm90b2NvbCIhPT10JiYoblt0XT1lW3RdKX0pKSxnW24ucHJvdG9jb2xdJiZuLmhvc3RuYW1lJiYhbi5wYXRobmFtZSYmKG4ucGF0aD1uLnBhdGhuYW1lPSIvIiksbi5ocmVmPW4uZm9ybWF0KCksbjtpZihlLnByb3RvY29sJiZlLnByb3RvY29sIT09bi5wcm90b2NvbCl7aWYoIWdbZS5wcm90b2NvbF0pcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe25bdF09ZVt0XX0pKSxuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKG4ucHJvdG9jb2w9ZS5wcm90b2NvbCxlLmhvc3R8fGZbZS5wcm90b2NvbF0pbi5wYXRobmFtZT1lLnBhdGhuYW1lO2Vsc2V7Zm9yKHZhciByPShlLnBhdGhuYW1lfHwiIikuc3BsaXQoIi8iKTtyLmxlbmd0aCYmIShlLmhvc3Q9ci5zaGlmdCgpKTspO2UuaG9zdHx8KGUuaG9zdD0iIiksZS5ob3N0bmFtZXx8KGUuaG9zdG5hbWU9IiIpLCIiIT09clswXSYmci51bnNoaWZ0KCIiKSxyLmxlbmd0aDwyJiZyLnVuc2hpZnQoIiIpLG4ucGF0aG5hbWU9ci5qb2luKCIvIil9aWYobi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LG4uaG9zdD1lLmhvc3R8fCIiLG4uYXV0aD1lLmF1dGgsbi5ob3N0bmFtZT1lLmhvc3RuYW1lfHxlLmhvc3Qsbi5wb3J0PWUucG9ydCxuLnBhdGhuYW1lfHxuLnNlYXJjaCl7dmFyIGk9bi5wYXRobmFtZXx8IiIscz1uLnNlYXJjaHx8IiI7bi5wYXRoPWkrc31yZXR1cm4gbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59dmFyIGE9bi5wYXRobmFtZSYmIi8iPT09bi5wYXRobmFtZS5jaGFyQXQoMCksYz1lLmhvc3R8fGUucGF0aG5hbWUmJiIvIj09PWUucGF0aG5hbWUuY2hhckF0KDApLHU9Y3x8YXx8bi5ob3N0JiZlLnBhdGhuYW1lLGw9dSxwPW4ucGF0aG5hbWUmJm4ucGF0aG5hbWUuc3BsaXQoIi8iKXx8W10sZD0ocj1lLnBhdGhuYW1lJiZlLnBhdGhuYW1lLnNwbGl0KCIvIil8fFtdLG4ucHJvdG9jb2wmJiFnW24ucHJvdG9jb2xdKTtpZihkJiYobi5ob3N0bmFtZT0iIixuLnBvcnQ9bnVsbCxuLmhvc3QmJigiIj09PXBbMF0/cFswXT1uLmhvc3Q6cC51bnNoaWZ0KG4uaG9zdCkpLG4uaG9zdD0iIixlLnByb3RvY29sJiYoZS5ob3N0bmFtZT1udWxsLGUucG9ydD1udWxsLGUuaG9zdCYmKCIiPT09clswXT9yWzBdPWUuaG9zdDpyLnVuc2hpZnQoZS5ob3N0KSksZS5ob3N0PW51bGwpLHU9dSYmKCIiPT09clswXXx8IiI9PT1wWzBdKSksYyluLmhvc3Q9ZS5ob3N0fHwiIj09PWUuaG9zdD9lLmhvc3Q6bi5ob3N0LG4uaG9zdG5hbWU9ZS5ob3N0bmFtZXx8IiI9PT1lLmhvc3RuYW1lP2UuaG9zdG5hbWU6bi5ob3N0bmFtZSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnkscD1yO2Vsc2UgaWYoci5sZW5ndGgpcHx8KHA9W10pLHAucG9wKCkscD1wLmNvbmNhdChyKSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnk7ZWxzZSBpZihudWxsIT1lLnNlYXJjaClyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PXAuc2hpZnQoKSwoYj0hIShuLmhvc3QmJm4uaG9zdC5pbmRleE9mKCJAIik+MCkmJm4uaG9zdC5zcGxpdCgiQCIpKSYmKG4uYXV0aD1iLnNoaWZ0KCksbi5ob3N0PW4uaG9zdG5hbWU9Yi5zaGlmdCgpKSksbi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LFMobi5wYXRobmFtZSkmJlMobi5zZWFyY2gpfHwobi5wYXRoPShuLnBhdGhuYW1lP24ucGF0aG5hbWU6IiIpKyhuLnNlYXJjaD9uLnNlYXJjaDoiIikpLG4uaHJlZj1uLmZvcm1hdCgpLG47aWYoIXAubGVuZ3RoKXJldHVybiBuLnBhdGhuYW1lPW51bGwsbi5zZWFyY2g/bi5wYXRoPSIvIituLnNlYXJjaDpuLnBhdGg9bnVsbCxuLmhyZWY9bi5mb3JtYXQoKSxuO2Zvcih2YXIgaD1wLnNsaWNlKC0xKVswXSxtPShuLmhvc3R8fGUuaG9zdCkmJigiLiI9PT1ofHwiLi4iPT09aCl8fCIiPT09aCx2PTAsRT1wLmxlbmd0aDtFPj0wO0UtLSkiLiI9PShoPXBbRV0pP3Auc3BsaWNlKEUsMSk6Ii4uIj09PWg/KHAuc3BsaWNlKEUsMSksdisrKTp2JiYocC5zcGxpY2UoRSwxKSx2LS0pO2lmKCF1JiYhbClmb3IoO3YtLTt2KXAudW5zaGlmdCgiLi4iKTshdXx8IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKXx8cC51bnNoaWZ0KCIiKSxtJiYiLyIhPT1wLmpvaW4oIi8iKS5zdWJzdHIoLTEpJiZwLnB1c2goIiIpO3ZhciBiLEM9IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKTtyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PUM/IiI6cC5sZW5ndGg/cC5zaGlmdCgpOiIiLChiPSEhKG4uaG9zdCYmbi5ob3N0LmluZGV4T2YoIkAiKT4wKSYmbi5ob3N0LnNwbGl0KCJAIikpJiYobi5hdXRoPWIuc2hpZnQoKSxuLmhvc3Q9bi5ob3N0bmFtZT1iLnNoaWZ0KCkpKSwodT11fHxuLmhvc3QmJnAubGVuZ3RoKSYmIUMmJnAudW5zaGlmdCgiIikscC5sZW5ndGg/bi5wYXRobmFtZT1wLmpvaW4oIi8iKToobi5wYXRobmFtZT1udWxsLG4ucGF0aD1udWxsKSxTKG4ucGF0aG5hbWUpJiZTKG4uc2VhcmNoKXx8KG4ucGF0aD0obi5wYXRobmFtZT9uLnBhdGhuYW1lOiIiKSsobi5zZWFyY2g/bi5zZWFyY2g6IiIpKSxuLmF1dGg9ZS5hdXRofHxuLmF1dGgsbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59LG8ucHJvdG90eXBlLnBhcnNlSG9zdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaG9zdCx0PXMuZXhlYyhlKTt0JiYoIjoiIT09KHQ9dFswXSkmJih0aGlzLnBvcnQ9dC5zdWJzdHIoMSkpLGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC10Lmxlbmd0aCkpLGUmJih0aGlzLmhvc3RuYW1lPWUpfX0se3B1bnljb2RlOjkyLHF1ZXJ5c3RyaW5nOjk1fV0sMTAxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO2Zvcih2YXIgcj1bXSxvPTA7bzwyNTY7KytvKXJbb109KG8rMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpO3ZhciBpPWZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8MCxvPXI7cmV0dXJuW29bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV1dLmpvaW4oIiIpfTtuLmRlZmF1bHQ9aX0se31dLDEwMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInYxIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5kZWZhdWx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJ2MyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uZGVmYXVsdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLmRlZmF1bHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInY1Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWZhdWx0fX0pO3ZhciByPWEoZSgiLi92MS5qcyIpKSxvPWEoZSgiLi92My5qcyIpKSxpPWEoZSgiLi92NC5qcyIpKSxzPWEoZSgiLi92NS5qcyIpKTtmdW5jdGlvbiBhKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX19LHsiLi92MS5qcyI6MTA2LCIuL3YzLmpzIjoxMDcsIi4vdjQuanMiOjEwOSwiLi92NS5qcyI6MTEwfV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj0oNjU1MzUmZSkrKDY1NTM1JnQpO3JldHVybihlPj4xNikrKHQ+PjE2KSsobj4+MTYpPDwxNnw2NTUzNSZufWZ1bmN0aW9uIG8oZSx0LG4sbyxpLHMpe3JldHVybiByKChhPXIocih0LGUpLHIobyxzKSkpPDwoYz1pKXxhPj4+MzItYyxuKTt2YXIgYSxjfWZ1bmN0aW9uIGkoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8odCZufH50JnIsZSx0LGkscyxhKX1mdW5jdGlvbiBzKGUsdCxuLHIsaSxzLGEpe3JldHVybiBvKHQmcnxuJn5yLGUsdCxpLHMsYSl9ZnVuY3Rpb24gYShlLHQsbixyLGkscyxhKXtyZXR1cm4gbyh0Xm5ecixlLHQsaSxzLGEpfWZ1bmN0aW9uIGMoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8obl4odHx+ciksZSx0LGkscyxhKX1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgdT1mdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciB0PXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7ZT1uZXcgQXJyYXkodC5sZW5ndGgpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWVbbl09dC5jaGFyQ29kZUF0KG4pfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsbz1bXSxpPTMyKmUubGVuZ3RoLHM9IjAxMjM0NTY3ODlhYmNkZWYiO2Zvcih0PTA7dDxpO3QrPTgpbj1lW3Q+PjVdPj4+dCUzMiYyNTUscj1wYXJzZUludChzLmNoYXJBdChuPj4+NCYxNSkrcy5jaGFyQXQoMTUmbiksMTYpLG8ucHVzaChyKTtyZXR1cm4gb30oZnVuY3Rpb24oZSx0KXt2YXIgbixvLHUsbCxwO2VbdD4+NV18PTEyODw8dCUzMixlWzE0Kyh0KzY0Pj4+OTw8NCldPXQ7dmFyIGQ9MTczMjU4NDE5MyxoPS0yNzE3MzM4NzksZj0tMTczMjU4NDE5NCxnPTI3MTczMzg3ODtmb3Iobj0wO248ZS5sZW5ndGg7bis9MTYpbz1kLHU9aCxsPWYscD1nLGQ9aShkLGgsZixnLGVbbl0sNywtNjgwODc2OTM2KSxnPWkoZyxkLGgsZixlW24rMV0sMTIsLTM4OTU2NDU4NiksZj1pKGYsZyxkLGgsZVtuKzJdLDE3LDYwNjEwNTgxOSksaD1pKGgsZixnLGQsZVtuKzNdLDIyLC0xMDQ0NTI1MzMwKSxkPWkoZCxoLGYsZyxlW24rNF0sNywtMTc2NDE4ODk3KSxnPWkoZyxkLGgsZixlW24rNV0sMTIsMTIwMDA4MDQyNiksZj1pKGYsZyxkLGgsZVtuKzZdLDE3LC0xNDczMjMxMzQxKSxoPWkoaCxmLGcsZCxlW24rN10sMjIsLTQ1NzA1OTgzKSxkPWkoZCxoLGYsZyxlW24rOF0sNywxNzcwMDM1NDE2KSxnPWkoZyxkLGgsZixlW24rOV0sMTIsLTE5NTg0MTQ0MTcpLGY9aShmLGcsZCxoLGVbbisxMF0sMTcsLTQyMDYzKSxoPWkoaCxmLGcsZCxlW24rMTFdLDIyLC0xOTkwNDA0MTYyKSxkPWkoZCxoLGYsZyxlW24rMTJdLDcsMTgwNDYwMzY4MiksZz1pKGcsZCxoLGYsZVtuKzEzXSwxMiwtNDAzNDExMDEpLGY9aShmLGcsZCxoLGVbbisxNF0sMTcsLTE1MDIwMDIyOTApLGQ9cyhkLGg9aShoLGYsZyxkLGVbbisxNV0sMjIsMTIzNjUzNTMyOSksZixnLGVbbisxXSw1LC0xNjU3OTY1MTApLGc9cyhnLGQsaCxmLGVbbis2XSw5LC0xMDY5NTAxNjMyKSxmPXMoZixnLGQsaCxlW24rMTFdLDE0LDY0MzcxNzcxMyksaD1zKGgsZixnLGQsZVtuXSwyMCwtMzczODk3MzAyKSxkPXMoZCxoLGYsZyxlW24rNV0sNSwtNzAxNTU4NjkxKSxnPXMoZyxkLGgsZixlW24rMTBdLDksMzgwMTYwODMpLGY9cyhmLGcsZCxoLGVbbisxNV0sMTQsLTY2MDQ3ODMzNSksaD1zKGgsZixnLGQsZVtuKzRdLDIwLC00MDU1Mzc4NDgpLGQ9cyhkLGgsZixnLGVbbis5XSw1LDU2ODQ0NjQzOCksZz1zKGcsZCxoLGYsZVtuKzE0XSw5LC0xMDE5ODAzNjkwKSxmPXMoZixnLGQsaCxlW24rM10sMTQsLTE4NzM2Mzk2MSksaD1zKGgsZixnLGQsZVtuKzhdLDIwLDExNjM1MzE1MDEpLGQ9cyhkLGgsZixnLGVbbisxM10sNSwtMTQ0NDY4MTQ2NyksZz1zKGcsZCxoLGYsZVtuKzJdLDksLTUxNDAzNzg0KSxmPXMoZixnLGQsaCxlW24rN10sMTQsMTczNTMyODQ3MyksZD1hKGQsaD1zKGgsZixnLGQsZVtuKzEyXSwyMCwtMTkyNjYwNzczNCksZixnLGVbbis1XSw0LC0zNzg1NTgpLGc9YShnLGQsaCxmLGVbbis4XSwxMSwtMjAyMjU3NDQ2MyksZj1hKGYsZyxkLGgsZVtuKzExXSwxNiwxODM5MDMwNTYyKSxoPWEoaCxmLGcsZCxlW24rMTRdLDIzLC0zNTMwOTU1NiksZD1hKGQsaCxmLGcsZVtuKzFdLDQsLTE1MzA5OTIwNjApLGc9YShnLGQsaCxmLGVbbis0XSwxMSwxMjcyODkzMzUzKSxmPWEoZixnLGQsaCxlW24rN10sMTYsLTE1NTQ5NzYzMiksaD1hKGgsZixnLGQsZVtuKzEwXSwyMywtMTA5NDczMDY0MCksZD1hKGQsaCxmLGcsZVtuKzEzXSw0LDY4MTI3OTE3NCksZz1hKGcsZCxoLGYsZVtuXSwxMSwtMzU4NTM3MjIyKSxmPWEoZixnLGQsaCxlW24rM10sMTYsLTcyMjUyMTk3OSksaD1hKGgsZixnLGQsZVtuKzZdLDIzLDc2MDI5MTg5KSxkPWEoZCxoLGYsZyxlW24rOV0sNCwtNjQwMzY0NDg3KSxnPWEoZyxkLGgsZixlW24rMTJdLDExLC00MjE4MTU4MzUpLGY9YShmLGcsZCxoLGVbbisxNV0sMTYsNTMwNzQyNTIwKSxkPWMoZCxoPWEoaCxmLGcsZCxlW24rMl0sMjMsLTk5NTMzODY1MSksZixnLGVbbl0sNiwtMTk4NjMwODQ0KSxnPWMoZyxkLGgsZixlW24rN10sMTAsMTEyNjg5MTQxNSksZj1jKGYsZyxkLGgsZVtuKzE0XSwxNSwtMTQxNjM1NDkwNSksaD1jKGgsZixnLGQsZVtuKzVdLDIxLC01NzQzNDA1NSksZD1jKGQsaCxmLGcsZVtuKzEyXSw2LDE3MDA0ODU1NzEpLGc9YyhnLGQsaCxmLGVbbiszXSwxMCwtMTg5NDk4NjYwNiksZj1jKGYsZyxkLGgsZVtuKzEwXSwxNSwtMTA1MTUyMyksaD1jKGgsZixnLGQsZVtuKzFdLDIxLC0yMDU0OTIyNzk5KSxkPWMoZCxoLGYsZyxlW24rOF0sNiwxODczMzEzMzU5KSxnPWMoZyxkLGgsZixlW24rMTVdLDEwLC0zMDYxMTc0NCksZj1jKGYsZyxkLGgsZVtuKzZdLDE1LC0xNTYwMTk4MzgwKSxoPWMoaCxmLGcsZCxlW24rMTNdLDIxLDEzMDkxNTE2NDkpLGQ9YyhkLGgsZixnLGVbbis0XSw2LC0xNDU1MjMwNzApLGc9YyhnLGQsaCxmLGVbbisxMV0sMTAsLTExMjAyMTAzNzkpLGY9YyhmLGcsZCxoLGVbbisyXSwxNSw3MTg3ODcyNTkpLGg9YyhoLGYsZyxkLGVbbis5XSwyMSwtMzQzNDg1NTUxKSxkPXIoZCxvKSxoPXIoaCx1KSxmPXIoZixsKSxnPXIoZyxwKTtyZXR1cm5bZCxoLGYsZ119KGZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKG5bKGUubGVuZ3RoPj4yKS0xXT12b2lkIDAsdD0wO3Q8bi5sZW5ndGg7dCs9MSluW3RdPTA7dmFyIHI9OCplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW5bdD4+NV18PSgyNTUmZVt0LzhdKTw8dCUzMjtyZXR1cm4gbn0oZSksOCplLmxlbmd0aCkpfTtuLmRlZmF1bHQ9dX0se31dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PWZ1bmN0aW9uKCl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiByKG8pfTt2YXIgcj0idW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0byYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fCJ1bmRlZmluZWQiIT10eXBlb2YgbXNDcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMmJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSxvPW5ldyBVaW50OEFycmF5KDE2KX0se31dLDEwNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuIHQmbl5+dCZyO2Nhc2UgMTpjYXNlIDM6cmV0dXJuIHRebl5yO2Nhc2UgMjpyZXR1cm4gdCZuXnQmcl5uJnJ9fWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gZTw8dHxlPj4+MzItdH1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMzM5NTQ2OTc4Ml0sbj1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIGk9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtlPW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspZVtzXT1pLmNoYXJDb2RlQXQocyl9ZS5wdXNoKDEyOCk7dmFyIGE9ZS5sZW5ndGgvNCsyLGM9TWF0aC5jZWlsKGEvMTYpLHU9bmV3IEFycmF5KGMpO2ZvcihzPTA7czxjO3MrKyl7dVtzXT1uZXcgQXJyYXkoMTYpO2Zvcih2YXIgbD0wO2w8MTY7bCsrKXVbc11bbF09ZVs2NCpzKzQqbF08PDI0fGVbNjQqcys0KmwrMV08PDE2fGVbNjQqcys0KmwrMl08PDh8ZVs2NCpzKzQqbCszXX1mb3IodVtjLTFdWzE0XT04KihlLmxlbmd0aC0xKS9NYXRoLnBvdygyLDMyKSx1W2MtMV1bMTRdPU1hdGguZmxvb3IodVtjLTFdWzE0XSksdVtjLTFdWzE1XT04KihlLmxlbmd0aC0xKSY0Mjk0OTY3Mjk1LHM9MDtzPGM7cysrKXtmb3IodmFyIHA9bmV3IEFycmF5KDgwKSxkPTA7ZDwxNjtkKyspcFtkXT11W3NdW2RdO2ZvcihkPTE2O2Q8ODA7ZCsrKXBbZF09byhwW2QtM11ecFtkLThdXnBbZC0xNF1ecFtkLTE2XSwxKTt2YXIgaD1uWzBdLGY9blsxXSxnPW5bMl0sbT1uWzNdLHY9bls0XTtmb3IoZD0wO2Q8ODA7ZCsrKXt2YXIgeT1NYXRoLmZsb29yKGQvMjApLEU9byhoLDUpK3IoeSxmLGcsbSkrdit0W3ldK3BbZF0+Pj4wO3Y9bSxtPWcsZz1vKGYsMzApPj4+MCxmPWgsaD1FfW5bMF09blswXStoPj4+MCxuWzFdPW5bMV0rZj4+PjAsblsyXT1uWzJdK2c+Pj4wLG5bM109blszXSttPj4+MCxuWzRdPW5bNF0rdj4+PjB9cmV0dXJuW25bMF0+PjI0JjI1NSxuWzBdPj4xNiYyNTUsblswXT4+OCYyNTUsMjU1Jm5bMF0sblsxXT4+MjQmMjU1LG5bMV0+PjE2JjI1NSxuWzFdPj44JjI1NSwyNTUmblsxXSxuWzJdPj4yNCYyNTUsblsyXT4+MTYmMjU1LG5bMl0+PjgmMjU1LDI1NSZuWzJdLG5bM10+PjI0JjI1NSxuWzNdPj4xNiYyNTUsblszXT4+OCYyNTUsMjU1Jm5bM10sbls0XT4+MjQmMjU1LG5bNF0+PjE2JjI1NSxuWzRdPj44JjI1NSwyNTUmbls0XV19O24uZGVmYXVsdD1pfSx7fV0sMTA2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByLG8saT1hKGUoIi4vcm5nLmpzIikpLHM9YShlKCIuL2J5dGVzVG9VdWlkLmpzIikpO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBjPTAsdT0wLGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciBhPXQmJm58fDAsbD10fHxbXSxwPShlPWV8fHt9KS5ub2RlfHxyLGQ9dm9pZCAwIT09ZS5jbG9ja3NlcT9lLmNsb2Nrc2VxOm87aWYobnVsbD09cHx8bnVsbD09ZCl7dmFyIGg9ZS5yYW5kb218fChlLnJuZ3x8aS5kZWZhdWx0KSgpO251bGw9PXAmJihwPXI9WzF8aFswXSxoWzFdLGhbMl0saFszXSxoWzRdLGhbNV1dKSxudWxsPT1kJiYoZD1vPTE2MzgzJihoWzZdPDw4fGhbN10pKX12YXIgZj12b2lkIDAhPT1lLm1zZWNzP2UubXNlY3M6KG5ldyBEYXRlKS5nZXRUaW1lKCksZz12b2lkIDAhPT1lLm5zZWNzP2UubnNlY3M6dSsxLG09Zi1jKyhnLXUpLzFlNDtpZihtPDAmJnZvaWQgMD09PWUuY2xvY2tzZXEmJihkPWQrMSYxNjM4MyksKG08MHx8Zj5jKSYmdm9pZCAwPT09ZS5uc2VjcyYmKGc9MCksZz49MWU0KXRocm93IG5ldyBFcnJvcigidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWMiKTtjPWYsdT1nLG89ZDt2YXIgdj0oMWU0KigyNjg0MzU0NTUmKGYrPTEyMjE5MjkyOGU1KSkrZyklNDI5NDk2NzI5NjtsW2ErK109dj4+PjI0JjI1NSxsW2ErK109dj4+PjE2JjI1NSxsW2ErK109dj4+PjgmMjU1LGxbYSsrXT0yNTUmdjt2YXIgeT1mLzQyOTQ5NjcyOTYqMWU0JjI2ODQzNTQ1NTtsW2ErK109eT4+PjgmMjU1LGxbYSsrXT0yNTUmeSxsW2ErK109eT4+PjI0JjE1fDE2LGxbYSsrXT15Pj4+MTYmMjU1LGxbYSsrXT1kPj4+OHwxMjgsbFthKytdPTI1NSZkO2Zvcih2YXIgRT0wO0U8NjsrK0UpbFthK0VdPXBbRV07cmV0dXJuIHR8fCgwLHMuZGVmYXVsdCkobCl9O24uZGVmYXVsdD1sfSx7Ii4vYnl0ZXNUb1V1aWQuanMiOjEwMSwiLi9ybmcuanMiOjEwNH1dLDEwNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcj1pKGUoIi4vdjM1LmpzIikpLG89aShlKCIuL21kNS5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgcz0oMCxyLmRlZmF1bHQpKCJ2MyIsNDgsby5kZWZhdWx0KTtuLmRlZmF1bHQ9c30seyIuL21kNS5qcyI6MTAzLCIuL3YzNS5qcyI6MTA4fV0sMTA4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUscixpLHMpe3ZhciBhPWkmJnN8fDA7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1mdW5jdGlvbihlKXtlPXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7Zm9yKHZhciB0PW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKXRbbl09ZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fShlKSksInN0cmluZyI9PXR5cGVvZiByJiYocj1mdW5jdGlvbihlKXt2YXIgdD1bXTtyZXR1cm4gZS5yZXBsYWNlKC9bYS1mQS1GMC05XXsyfS9nLChmdW5jdGlvbihlKXt0LnB1c2gocGFyc2VJbnQoZSwxNikpfSkpLHR9KHIpKSwhQXJyYXkuaXNBcnJheShlKSl0aHJvdyBUeXBlRXJyb3IoInZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2YgYnl0ZXMiKTtpZighQXJyYXkuaXNBcnJheShyKXx8MTYhPT1yLmxlbmd0aCl0aHJvdyBUeXBlRXJyb3IoIm5hbWVzcGFjZSBtdXN0IGJlIHV1aWQgc3RyaW5nIG9yIGFuIEFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIik7dmFyIGM9bihyLmNvbmNhdChlKSk7aWYoY1s2XT0xNSZjWzZdfHQsY1s4XT02MyZjWzhdfDEyOCxpKWZvcih2YXIgdT0wO3U8MTY7Kyt1KWlbYSt1XT1jW3VdO3JldHVybiBpfHwoMCxvLmRlZmF1bHQpKGMpfTt0cnl7ci5uYW1lPWV9Y2F0Y2goZSl7fXJldHVybiByLkROUz1pLHIuVVJMPXMscn0sbi5VUkw9bi5ETlM9dm9pZCAwO3ZhciByLG89KHI9ZSgiLi9ieXRlc1RvVXVpZC5qcyIpKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn07Y29uc3QgaT0iNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IjtuLkROUz1pO2NvbnN0IHM9IjZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCI7bi5VUkw9c30seyIuL2J5dGVzVG9VdWlkLmpzIjoxMDF9XSwxMDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHI9aShlKCIuL3JuZy5qcyIpKSxvPWkoZSgiLi9ieXRlc1RvVXVpZC5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgcz1mdW5jdGlvbihlLHQsbil7dmFyIGk9dCYmbnx8MDsic3RyaW5nIj09dHlwZW9mIGUmJih0PSJiaW5hcnkiPT09ZT9uZXcgQXJyYXkoMTYpOm51bGwsZT1udWxsKTt2YXIgcz0oZT1lfHx7fSkucmFuZG9tfHwoZS5ybmd8fHIuZGVmYXVsdCkoKTtpZihzWzZdPTE1JnNbNl18NjQsc1s4XT02MyZzWzhdfDEyOCx0KWZvcih2YXIgYT0wO2E8MTY7KythKXRbaSthXT1zW2FdO3JldHVybiB0fHwoMCxvLmRlZmF1bHQpKHMpfTtuLmRlZmF1bHQ9c30seyIuL2J5dGVzVG9VdWlkLmpzIjoxMDEsIi4vcm5nLmpzIjoxMDR9XSwxMTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHI9aShlKCIuL3YzNS5qcyIpKSxvPWkoZSgiLi9zaGExLmpzIikpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPSgwLHIuZGVmYXVsdCkoInY1Iiw4MCxvLmRlZmF1bHQpO24uZGVmYXVsdD1zfSx7Ii4vc2hhMS5qcyI6MTA1LCIuL3YzNS5qcyI6MTA4fV0sMTExOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1lKCIuL3V0aWxzL0xSVSIpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPTFlMyksdGhpcy5tYXhTaXplPWUsdGhpcy5jYWNoZT1uZXcgci5MUlVDYWNoZShlKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FjaGUubGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LG4pe3ZhciByPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0LG89dGhpcy5wb3B1bGF0ZVZhbHVlKG4pO3RoaXMuY2FjaGUucHV0KHIsbyl9LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgbj0ic3RyaW5nIiE9dHlwZW9mIHQ/ZS5nZXRLZXlTdHJpbmcodCk6dCxyPURhdGUubm93KCksbz10aGlzLmNhY2hlLmdldChuKTtpZihvKXtmb3IodmFyIGk9by5sZW5ndGgtMTtpPj0wO2ktLSlvW2ldLkV4cGlyZTxyJiZvLnNwbGljZShpLDEpO2lmKDA9PT1vLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLmNhY2hlLnJlbW92ZShuKX1yZXR1cm4gb30sZS5nZXRLZXlTdHJpbmc9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49T2JqZWN0LmtleXMoZSkuc29ydCgpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTt2b2lkIDAhPT1lW29dJiZ0LnB1c2goZVtvXSl9cmV0dXJuIHQuam9pbigiICIpfSxlLnByb3RvdHlwZS5wb3B1bGF0ZVZhbHVlPWZ1bmN0aW9uKGUpe3ZhciB0PURhdGUubm93KCk7cmV0dXJuIGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm57QWRkcmVzczplLkFkZHJlc3N8fCIiLEV4cGlyZTp0KzYwKihlLkNhY2hlUGVyaW9kSW5NaW51dGVzfHwxKSoxZTN9fSkpfSxlLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3RoaXMuY2FjaGUuZW1wdHkoKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBuPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0O3RoaXMuY2FjaGUucmVtb3ZlKG4pfSxlfSgpO24uRW5kcG9pbnRDYWNoZT1vfSx7Ii4vdXRpbHMvTFJVIjoxMTJ9XSwxMTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKGUsdCl7dGhpcy5rZXk9ZSx0aGlzLnZhbHVlPXR9LG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMubm9kZU1hcD17fSx0aGlzLnNpemU9MCwibnVtYmVyIiE9dHlwZW9mIGV8fGU8MSl0aHJvdyBuZXcgRXJyb3IoIkNhY2hlIHNpemUgY2FuIG9ubHkgYmUgcG9zaXRpdmUgbnVtYmVyIik7dGhpcy5zaXplTGltaXQ9ZX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXplfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnByZXBlbmRUb0xpc3Q9ZnVuY3Rpb24oZSl7dGhpcy5oZWFkZXJOb2RlPyh0aGlzLmhlYWRlck5vZGUucHJldj1lLGUubmV4dD10aGlzLmhlYWRlck5vZGUpOnRoaXMudGFpbE5vZGU9ZSx0aGlzLmhlYWRlck5vZGU9ZSx0aGlzLnNpemUrK30sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVRhaWw9ZnVuY3Rpb24oKXtpZih0aGlzLnRhaWxOb2RlKXt2YXIgZT10aGlzLnRhaWxOb2RlLHQ9ZS5wcmV2O3JldHVybiB0JiYodC5uZXh0PXZvaWQgMCksZS5wcmV2PXZvaWQgMCx0aGlzLnRhaWxOb2RlPXQsdGhpcy5zaXplLS0sZX19LGUucHJvdG90eXBlLmRldGFjaEZyb21MaXN0PWZ1bmN0aW9uKGUpe3RoaXMuaGVhZGVyTm9kZT09PWUmJih0aGlzLmhlYWRlck5vZGU9ZS5uZXh0KSx0aGlzLnRhaWxOb2RlPT09ZSYmKHRoaXMudGFpbE5vZGU9ZS5wcmV2KSxlLnByZXYmJihlLnByZXYubmV4dD1lLm5leHQpLGUubmV4dCYmKGUubmV4dC5wcmV2PWUucHJldiksZS5uZXh0PXZvaWQgMCxlLnByZXY9dm9pZCAwLHRoaXMuc2l6ZS0tfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5ub2RlTWFwW2VdKXt2YXIgdD10aGlzLm5vZGVNYXBbZV07cmV0dXJuIHRoaXMuZGV0YWNoRnJvbUxpc3QodCksdGhpcy5wcmVwZW5kVG9MaXN0KHQpLHQudmFsdWV9fSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oZSl7aWYodGhpcy5ub2RlTWFwW2VdKXt2YXIgdD10aGlzLm5vZGVNYXBbZV07dGhpcy5kZXRhY2hGcm9tTGlzdCh0KSxkZWxldGUgdGhpcy5ub2RlTWFwW2VdfX0sZS5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5ub2RlTWFwW2VdKXRoaXMucmVtb3ZlKGUpO2Vsc2UgaWYodGhpcy5zaXplPT09dGhpcy5zaXplTGltaXQpe3ZhciBuPXRoaXMucmVtb3ZlRnJvbVRhaWwoKS5rZXk7ZGVsZXRlIHRoaXMubm9kZU1hcFtuXX12YXIgbz1uZXcgcihlLHQpO3RoaXMubm9kZU1hcFtlXT1vLHRoaXMucHJlcGVuZFRvTGlzdChvKX0sZS5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9T2JqZWN0LmtleXModGhpcy5ub2RlTWFwKSx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF0scj10aGlzLm5vZGVNYXBbbl07dGhpcy5kZXRhY2hGcm9tTGlzdChyKSxkZWxldGUgdGhpcy5ub2RlTWFwW25dfX0sZX0oKTtuLkxSVUNhY2hlPW99LHt9XSwxMTM6W2Z1bmN0aW9uKGUsdCxuKXtlKCIuL2Jyb3dzZXJfbG9hZGVyIik7dmFyIHI9ZSgiLi9jb3JlIik7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuQVdTPXIpLHZvaWQgMCE9PXQmJih0LmV4cG9ydHM9ciksInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYoc2VsZi5BV1M9ciksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIkNvbm5lY3QiKXx8KHIuYXBpTG9hZGVyLnNlcnZpY2VzLmNvbm5lY3Q9e30sci5Db25uZWN0PXIuU2VydmljZS5kZWZpbmVTZXJ2aWNlKCJjb25uZWN0IixbIjIwMTctMDItMTUiXSkpLHIuYXBpTG9hZGVyLnNlcnZpY2VzLmNvbm5lY3RbIjIwMTctMDItMTUiXT1lKCIuLi9hcGlzL2Nvbm5lY3QtMjAxNy0wMi0xNS5taW4iKX0seyIuLi9hcGlzL2Nvbm5lY3QtMjAxNy0wMi0xNS5taW4iOjMsIi4vYnJvd3Nlcl9sb2FkZXIiOjE2LCIuL2NvcmUiOjE5fV19LHt9LFsxMTNdKX0sNzU0OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsdC5DbGllbnRNZXRob2RzPXQubWFrZUVudW0oWyJnZXRBZ2VudFNuYXBzaG90IiwicHV0QWdlbnRTdGF0ZSIsImdldEFnZW50U3RhdGVzIiwiZ2V0RGlhbGFibGVDb3VudHJ5Q29kZXMiLCJnZXRSb3V0aW5nUHJvZmlsZVF1ZXVlcyIsImdldEFnZW50UGVybWlzc2lvbnMiLCJnZXRBZ2VudENvbmZpZ3VyYXRpb24iLCJ1cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24iLCJhY2NlcHRDb250YWN0IiwiY3JlYXRlT3V0Ym91bmRDb250YWN0IiwiY3JlYXRlVGFza0NvbnRhY3QiLCJjbGVhckNvbnRhY3QiLCJjb21wbGV0ZUNvbnRhY3QiLCJkZXN0cm95Q29udGFjdCIsInJlamVjdENvbnRhY3QiLCJub3RpZnlDb250YWN0SXNzdWUiLCJ1cGRhdGVDb250YWN0QXR0cmlidXRlcyIsImNyZWF0ZUFkZGl0aW9uYWxDb25uZWN0aW9uIiwiZGVzdHJveUNvbm5lY3Rpb24iLCJob2xkQ29ubmVjdGlvbiIsInJlc3VtZUNvbm5lY3Rpb24iLCJ0b2dnbGVBY3RpdmVDb25uZWN0aW9ucyIsImNvbmZlcmVuY2VDb25uZWN0aW9ucyIsInNlbmRDbGllbnRMb2dzIiwic2VuZERpZ2l0cyIsInNlbmRTb2Z0cGhvbmVDYWxsUmVwb3J0Iiwic2VuZFNvZnRwaG9uZUNhbGxNZXRyaWNzIiwiZ2V0RW5kcG9pbnRzIiwiZ2V0TmV3QXV0aFRva2VuIiwiY3JlYXRlVHJhbnNwb3J0IiwibXV0ZVBhcnRpY2lwYW50IiwidW5tdXRlUGFydGljaXBhbnQiLCJ1cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZSIsInBhdXNlQ29udGFjdCIsInJlc3VtZUNvbnRhY3QiXSksdC5BZ2VudEFwcENsaWVudE1ldGhvZHM9e0dFVF9DT05UQUNUOiJBZ2VudEFwcFNlcnZpY2UuTGNtcy5nZXRDb250YWN0IixERUxFVEVfU1BFQUtFUjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZGVsZXRlU3BlYWtlciIsRU5ST0xMX0JZX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmVucm9sbEJ5U2Vzc2lvbiIsRVZBTFVBVEVfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZXZhbHVhdGVTZXNzaW9uIixERVNDUklCRV9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZXNjcmliZVNwZWFrZXIiLE9QVF9PVVRfU1BFQUtFUjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQub3B0T3V0U3BlYWtlciIsVVBEQVRFX1ZPSUNFX0lEX0RBVEE6IkFnZW50QXBwU2VydmljZS5MY21zLnVwZGF0ZVZvaWNlSWREYXRhIixERVNDUklCRV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZXNjcmliZVNlc3Npb24iLFVQREFURV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC51cGRhdGVTZXNzaW9uIixTVEFSVF9WT0lDRV9JRF9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuTmFzYS5zdGFydFZvaWNlSWRTZXNzaW9uIixMSVNUX0lOVEVHUkFUSU9OX0FTU09DSUFUSU9OUzoiQWdlbnRBcHBTZXJ2aWNlLkFjcy5saXN0SW50ZWdyYXRpb25Bc3NvY2lhdGlvbnMifSx0Lk1hc3Rlck1ldGhvZHM9dC5tYWtlRW51bShbImJlY29tZU1hc3RlciIsImNoZWNrTWFzdGVyIl0pLHQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHM9dC5tYWtlRW51bShbImxpc3RUYXNrVGVtcGxhdGVzIiwiZ2V0VGFza1RlbXBsYXRlIiwiY3JlYXRlVGVtcGxhdGVkVGFzayIsInVwZGF0ZUNvbnRhY3QiXSksdC5BcGlQcm94eUNsaWVudE1ldGhvZHM9dC5tYWtlRW51bShbInFySW50ZWdyYXRpb25FeGlzdHMiLCJxclNlYXJjaFF1aWNrUmVzcG9uc2VzIl0pLHQuUmV0cnlhYmxlQ2xpZW50TWV0aG9kc0xpc3Q9W3QuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU05BUFNIT1QsdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9DT05GSUdVUkFUSU9OLHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfUEVSTUlTU0lPTlMsdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TVEFURVMsdC5DbGllbnRNZXRob2RzLkdFVF9ESUFMQUJMRV9DT1VOVFJZX0NPREVTLHQuQ2xpZW50TWV0aG9kcy5HRVRfUk9VVElOR19QUk9GSUxFX1FVRVVFU10sdC5SZXRyeWFibGVFcnJvcnM9dC5tYWtlRW51bShbInVuYXV0aG9yaXplZCIsImFjY2Vzc0RlbmllZCJdKSx0LlJldHJ5U3RhdHVzPXQubWFrZUVudW0oWyJyZXRyeWluZyIsImV4aGF1c3RlZCIsIm5vbmUiXSk7dmFyIG49ZnVuY3Rpb24oKXt9O24uRU1QVFlfQ0FMTEJBQ0tTPXtzdWNjZXNzOmZ1bmN0aW9uKCl7fSxmYWlsdXJlOmZ1bmN0aW9uKCl7fX0sbi5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsIm1ldGhvZCIpO3ZhciBpPXJ8fHt9LHM9b3x8bi5FTVBUWV9DQUxMQkFDS1M7dGhpcy5fY2FsbEltcGwoZSxpLHMpfSxuLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3Rocm93IG5ldyB0Lk5vdEltcGxlbWVudGVkRXJyb3J9O3ZhciByPWZ1bmN0aW9uKCl7bi5jYWxsKHRoaXMpfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXtpZihyJiZyLmZhaWx1cmUpe3ZhciBvPXQuc3ByaW50ZigiTm8gc3VjaCBtZXRob2QgZXhpc3RzIG9uIE5VTEwgY2xpZW50OiAlcyIsZSk7ci5mYWlsdXJlKG5ldyB0LlZhbHVlRXJyb3Iobykse21lc3NhZ2U6b30pfX07dmFyIG89ZnVuY3Rpb24oZSxyLG8pe24uY2FsbCh0aGlzKSx0aGlzLmNvbmR1aXQ9ZSx0aGlzLnJlcXVlc3RFdmVudD1yLHRoaXMucmVzcG9uc2VFdmVudD1vLHRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcD17fSx0aGlzLmNvbmR1aXQub25VcHN0cmVhbShvLHQuaGl0Y2godGhpcyx0aGlzLl9oYW5kbGVSZXNwb25zZSkpfTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXF1ZXN0KHRoaXMucmVxdWVzdEV2ZW50LGUsbik7dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW28ucmVxdWVzdElkXT1yO2NvbnN0IGk9W3QuQ2xpZW50TWV0aG9kcy5TRU5EX0NMSUVOVF9MT0dTLHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1MsdC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfUkVQT1JUXTt0cnl7by5ldmVudCE9PXQuRXZlbnRUeXBlLkFQSV9SRVFVRVNUfHxpLmluY2x1ZGVzKG8ubWV0aG9kKXx8dC5nZXRMb2coKS50cmFjZShgU2VuZGluZyBBUElfUkVRVUVTVCBldmVudCBmb3IgJHtvLm1ldGhvZH0gdG8gdXBzdHJlYW1gKS53aXRoT2JqZWN0KHttZXRob2Q6by5tZXRob2QscGFyYW1zOm8ucGFyYW1zLHN0YWNrOihuZXcgRXJyb3IpLnN0YWNrfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJTdGFjayB0cmFjZSBMb2cgRmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXRoaXMuY29uZHVpdC5zZW5kVXBzdHJlYW0oby5ldmVudCxvKX0sby5wcm90b3R5cGUuX2dldENhbGxiYWNrc0ZvclJlcXVlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdfHxudWxsO3JldHVybiBudWxsIT10JiZkZWxldGUgdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdLHR9LG8ucHJvdG90eXBlLl9oYW5kbGVSZXNwb25zZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0KGUucmVxdWVzdElkKTtudWxsIT10JiYoZS5lcnImJnQuZmFpbHVyZT90LmZhaWx1cmUoZS5lcnIsZS5kYXRhKTp0LnN1Y2Nlc3MmJnQuc3VjY2VzcyhlLmRhdGEpKX07dmFyIGk9ZnVuY3Rpb24oZSl7by5jYWxsKHRoaXMsZSx0LkV2ZW50VHlwZS5BUElfUkVRVUVTVCx0LkV2ZW50VHlwZS5BUElfUkVTUE9OU0UpfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWk7dmFyIHM9ZnVuY3Rpb24oKXtuLmNhbGwodGhpcyksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkFQSV9QUk9YWV9SRVNQT05TRSx0LmhpdGNoKHRoaXMsdGhpcy5faGFuZGxlUmVzcG9uc2UpKSx0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXA9e319OyhzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cyxzLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlcXVlc3QodC5FdmVudFR5cGUuQVBJX1BST1hZX1JFUVVFU1QsZSxuKTt0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbby5yZXF1ZXN0SWRdPXIsdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5BUElfUFJPWFlfUkVRVUVTVCxvKX0scy5wcm90b3R5cGUuX2dldENhbGxiYWNrc0ZvclJlcXVlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdfHxudWxsO3JldHVybiBudWxsIT10JiZkZWxldGUgdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdLHR9LHMucHJvdG90eXBlLl9oYW5kbGVSZXNwb25zZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0KGUucmVxdWVzdElkKTtudWxsIT10JiYoZS5lcnImJnQuZmFpbHVyZT90LmZhaWx1cmUoZS5lcnIsZS5kYXRhKTp0LnN1Y2Nlc3MmJnQuc3VjY2VzcyhlLmRhdGEpKX07dmFyIGE9ZnVuY3Rpb24oZSl7by5jYWxsKHRoaXMsZSx0LkV2ZW50VHlwZS5NQVNURVJfUkVRVUVTVCx0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0UpfTsoYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWE7dmFyIGM9ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJhdXRoQ29va2llTmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJhdXRoVG9rZW4iKSx0LmFzc2VydE5vdE51bGwobywiZW5kcG9pbnQiKSxuLmNhbGwodGhpcyksdGhpcy5lbmRwb2ludFVybD10LmdldFVybFdpdGhQcm90b2NvbChvKSx0aGlzLmF1dGhUb2tlbj1yLHRoaXMuYXV0aENvb2tpZU5hbWU9ZX07KGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1jLGMucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXt9O2lbby5hdXRoQ29va2llTmFtZV09by5hdXRoVG9rZW47dmFyIHM9e21ldGhvZDoicG9zdCIsYm9keTpKU09OLnN0cmluZ2lmeShufHx7fSksaGVhZGVyczp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIlgtQW16LXRhcmdldCI6ZSwiWC1BbXotQmVhcmVyIjpKU09OLnN0cmluZ2lmeShpKX19O3QuZmV0Y2goby5lbmRwb2ludFVybCxzKS50aGVuKChmdW5jdGlvbihlKXtyLnN1Y2Nlc3MoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5ib2R5LmdldFJlYWRlcigpO2xldCBuPSIiO2NvbnN0IG89bmV3IFRleHREZWNvZGVyO3QucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIGkoe2RvbmU6cyx2YWx1ZTphfSl7aWYocyl7dmFyIGM9SlNPTi5wYXJzZShuKTtyZXR1cm4gYy5zdGF0dXM9ZS5zdGF0dXMsdm9pZCByLmZhaWx1cmUoYyl9cmV0dXJuIG4rPW8uZGVjb2RlKGEpLHQucmVhZCgpLnRoZW4oaSl9KSl9KSl9O3ZhciB1PWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiYXV0aFRva2VuIiksdC5hc3NlcnROb3ROdWxsKHIsInJlZ2lvbiIpLG4uY2FsbCh0aGlzKSxBV1MuY29uZmlnLmNyZWRlbnRpYWxzPW5ldyBBV1MuQ3JlZGVudGlhbHMoe30pLEFXUy5jb25maWcucmVnaW9uPXIsdGhpcy5hdXRoVG9rZW49ZTt2YXIgaT10LmdldEJhc2VVcmwoKSxzPW98fChpLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKT9pKyIvY29ubmVjdC9hcGkiOmkrIi9hcGkiKSxhPW5ldyBBV1MuRW5kcG9pbnQocyk7dGhpcy5jbGllbnQ9bmV3IEFXUy5Db25uZWN0KHtlbmRwb2ludDphfSksdGhpcy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcj0wLHRoaXMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MH07KHUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj11LHUucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXQuZ2V0TG9nKCk7aWYodC5jb250YWlucyh0aGlzLmNsaWVudCxlKSluPXRoaXMuX3RyYW5zbGF0ZVBhcmFtcyhlLG4pLCJwYXVzZUNvbnRhY3QiIT09ZSYmInJlc3VtZUNvbnRhY3QiIT09ZXx8ZGVsZXRlIG4uYXV0aGVudGljYXRpb24sbiYmbi5yZWxhdGVkQ29udGFjdElkJiZudWxsIT09bi5yZWxhdGVkQ29udGFjdElkJiZuLnByZXZpb3VzQ29udGFjdElkJiZkZWxldGUgbi5wcmV2aW91c0NvbnRhY3RJZCxpLnRyYWNlKCJBV1NDbGllbnQ6IC0tXHgzZSBDYWxsaW5nIG9wZXJhdGlvbiAnJXMnIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMuY2xpZW50W2VdKG4pLm9uKCJidWlsZCIsKGZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotQmVhcmVyIl09by5hdXRoVG9rZW59KSkuc2VuZCgoZnVuY3Rpb24obixzKXt0cnl7aWYobiluLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTnx8NDAxPT09bi5zdGF0dXNDb2RlP28uX3JldHJ5TWV0aG9kKGUscixuLHMsdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEKTpuLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuQUNDRVNTX0RFTklFRF9FWENFUFRJT058fDQwMz09PW4uc3RhdHVzQ29kZT9vLl9yZXRyeU1ldGhvZChlLHIsbixzLHQuUmV0cnlhYmxlRXJyb3JzLkFDQ0VTU19ERU5JRUQpOihvLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsby5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wLHIuZmFpbHVyZShvLl9mb3JtYXRDYWxsRXJyb3Ioby5fYWRkU3RhdHVzQ29kZVRvRXJyb3IobikpLHMpKSxpLnRyYWNlKCJBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJyVzJyBmYWlsZWQ6ICVzIixlLEpTT04uc3RyaW5naWZ5KG4pKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2V7bGV0IHQ9e307aS50cmFjZSgiQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICclcycgc3VjY2VlZGVkLiIsZSkud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8udW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxvLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTAsdGhpcy5odHRwUmVzcG9uc2UmJnRoaXMuaHR0cFJlc3BvbnNlLmhhc093blByb3BlcnR5KCJib2R5IikmJih0LmNvbnRlbnRMZW5ndGg9dGhpcy5odHRwUmVzcG9uc2UuYm9keS5sZW5ndGgpLHIuc3VjY2VzcyhzLHQpfX1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gaGFuZGxlIEFXUyBBUEkgcmVxdWVzdCBmb3IgbWV0aG9kICVzIixlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpO2Vsc2V7dmFyIHM9dC5zcHJpbnRmKCJObyBzdWNoIG1ldGhvZCBleGlzdHMgb24gQVdTIGNsaWVudDogJXMiLGUpO3IuZmFpbHVyZShuZXcgdC5WYWx1ZUVycm9yKHMpLHttZXNzYWdlOnN9KX19LHUucHJvdG90eXBlLl9pc1JldHJ5YWJsZU1ldGhvZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5SZXRyeWFibGVDbGllbnRNZXRob2RzTGlzdC5pbmNsdWRlcyhlKX0sdS5wcm90b3R5cGUuX3JldHJ5TWV0aG9kPWZ1bmN0aW9uKGUsbixyLG8saSl7dmFyIHM9dGhpcyxhPXQuZ2V0TG9nKCk7Y29uc3QgYz1lPT5zLl9mb3JtYXRDYWxsRXJyb3Iocy5fYWRkU3RhdHVzQ29kZVRvRXJyb3IoZSkpO2xldCB1PXttYXhDb3VudDp0LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMudW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6InVuYXV0aG9yaXplZCIsZXhoYXVzdGVkUmV0cmllczpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPj10LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxyZXRyeUNhbGxiYWNrOihlLHQpPT5uLmZhaWx1cmUoYyhlKSx0KSxkZWZhdWx0Q2FsbGJhY2s6KGUsdCk9Pm4uYXV0aEZhaWx1cmUoYyhlKSx0KX07c3dpdGNoKGkpe2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEOmJyZWFrO2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuQUNDRVNTX0RFTklFRDp1PXsuLi51LG1heENvdW50OnQuY29yZS5NQVhfQUNDRVNTX0RFTklFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6ImFjY2VzcyBkZW5pZWQiLGV4aGF1c3RlZFJldHJpZXM6cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj49dC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5ULGRlZmF1bHRDYWxsYmFjazooZSx0KT0+bi5hY2Nlc3NEZW5pZWQoYyhlKSx0KX19bGV0IGw9ey4uLnIscmV0cnlTdGF0dXM6dC5SZXRyeVN0YXR1cy5OT05FfTtpZihzLl9pc1JldHJ5YWJsZU1ldGhvZChlKSl7aWYoIXUuZXhoYXVzdGVkUmV0cmllcylyZXR1cm4gYS50cmFjZShgQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICR7ZX0gZmFpbGVkIHdpdGggJHt1LmVycm9yTWVzc2FnZX0gZXJyb3IuIFJldHJ5aW5nIGNhbGwgZm9yIGEgJHt1LmZhaWxDb3VudGVyKzF9IHRpbWVgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUuaW5jcmVhc2VDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLlJFVFJZSU5HfSx2b2lkIHUucmV0cnlDYWxsYmFjayhsLG8pO2EudHJhY2UoYEFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAke2V9IGV4aGF1c3RlZCBtYXggJHt1Lm1heENvdW50fSBudW1iZXIgb2YgcmV0cmllcyBmb3IgJHt1LmVycm9yTWVzc2FnZX0gZXJyb3JgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUucmVzZXRDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLkVYSEFVU1RFRH19ZWxzZSBhLnRyYWNlKGBBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJHtlfSBmYWlsZWQ6ICR7SlNPTi5zdHJpbmdpZnkocil9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt1LmRlZmF1bHRDYWxsYmFjayhsLG8pfSx1LnByb3RvdHlwZS5fZm9ybWF0Q2FsbEVycm9yPWZ1bmN0aW9uKGUpe2NvbnN0IG49e3R5cGU6ZS5jb2RlLG1lc3NhZ2U6ZS5tZXNzYWdlLHN0YWNrOltdLHJldHJ5U3RhdHVzOmUucmV0cnlTdGF0dXN8fHQuUmV0cnlTdGF0dXMuTk9ORSwuLi5lLnN0YXR1c0NvZGUmJntzdGF0dXNDb2RlOmUuc3RhdHVzQ29kZX19O2lmKGUuc3RhY2spdHJ5e0FycmF5LmlzQXJyYXkoZS5zdGFjayk/bi5zdGFjaz1lLnN0YWNrOiJvYmplY3QiPT10eXBlb2YgZS5zdGFjaz9uLnN0YWNrPVtKU09OLnN0cmluZ2lmeShlLnN0YWNrKV06InN0cmluZyI9PXR5cGVvZiBlLnN0YWNrJiYobi5zdGFjaz1lLnN0YWNrLnNwbGl0KCJcbiIpKX1maW5hbGx5e31yZXR1cm4gbn0sdS5wcm90b3R5cGUuX2FkZFN0YXR1c0NvZGVUb0Vycm9yPWZ1bmN0aW9uKGUpe2lmKGUuc3RhdHVzQ29kZSlyZXR1cm4gZTtjb25zdCBuPXsuLi5lfTtpZihlLmNvZGUpc3dpdGNoKG4uY29kZSl7Y2FzZSB0LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTjpuLnN0YXR1c0NvZGU9NDAxO2JyZWFrO2Nhc2UgdC5DVElFeGNlcHRpb25zLkFDQ0VTU19ERU5JRURfRVhDRVBUSU9OOm4uc3RhdHVzQ29kZT00MDN9ZWxzZSBuLnN0YXR1c0NvZGU9NDAwO3JldHVybiBufSx1LnByb3RvdHlwZS5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dC5DbGllbnRNZXRob2RzLkNPTVBMRVRFX0NPTlRBQ1QmJmUhPT10LkNsaWVudE1ldGhvZHMuQ0xFQVJfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5SRUpFQ1RfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVEFTS19DT05UQUNUJiZlIT09dC5DbGllbnRNZXRob2RzLlVQREFURV9NT05JVE9SX1BBUlRJQ0lQQU5UX1NUQVRFfSx1LnByb3RvdHlwZS5fdHJhbnNsYXRlUGFyYW1zPWZ1bmN0aW9uKGUsbil7c3dpdGNoKGUpe2Nhc2UgdC5DbGllbnRNZXRob2RzLlVQREFURV9BR0VOVF9DT05GSUdVUkFUSU9OOm4uY29uZmlndXJhdGlvbj10aGlzLl90cmFuc2xhdGVBZ2VudENvbmZpZ3VyYXRpb24obi5jb25maWd1cmF0aW9uKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1M6bi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3Mobi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVDpuLnJlcG9ydD10aGlzLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0KG4ucmVwb3J0KX1yZXR1cm4gdGhpcy5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtKGUpJiYobi5hdXRoZW50aWNhdGlvbj17YXV0aFRva2VuOnRoaXMuYXV0aFRva2VufSksbn0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUsc29mdHBob25lRW5hYmxlZDplLnNvZnRwaG9uZUVuYWJsZWQsc29mdHBob25lQXV0b0FjY2VwdDplLnNvZnRwaG9uZUF1dG9BY2NlcHQsZXh0ZW5zaW9uOmUuZXh0ZW5zaW9uLHJvdXRpbmdQcm9maWxlOnRoaXMuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlKGUucm91dGluZ1Byb2ZpbGUpLGFnZW50UHJlZmVyZW5jZXM6ZS5hZ2VudFByZWZlcmVuY2VzfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlPWZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmUubmFtZSxyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlQVJOLGRlZmF1bHRPdXRib3VuZFF1ZXVlOnRoaXMuX3RyYW5zbGF0ZVF1ZXVlKGUuZGVmYXVsdE91dGJvdW5kUXVldWUpfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVF1ZXVlPWZ1bmN0aW9uKGUpe3JldHVybntxdWV1ZUFSTjplLnF1ZXVlQVJOLG5hbWU6ZS5uYW1lfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7InBhY2tldHNDb3VudCJpbiBlJiYoZS5wYWNrZXRDb3VudD1lLnBhY2tldHNDb3VudCxkZWxldGUgZS5wYWNrZXRzQ291bnQpfSkpLGV9LHUucHJvdG90eXBlLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0PWZ1bmN0aW9uKGUpe3JldHVybiJoYW5kc2hha2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUuaGFuZHNoYWtlVGltZU1pbGxpcz1lLmhhbmRzaGFraW5nVGltZU1pbGxpcyxkZWxldGUgZS5oYW5kc2hha2luZ1RpbWVNaWxsaXMpLCJwcmVUYWxraW5nVGltZU1pbGxpcyJpbiBlJiYoZS5wcmVUYWxrVGltZU1pbGxpcz1lLnByZVRhbGtpbmdUaW1lTWlsbGlzLGRlbGV0ZSBlLnByZVRhbGtpbmdUaW1lTWlsbGlzKSwiaGFuZHNoYWtpbmdGYWlsdXJlImluIGUmJihlLmhhbmRzaGFrZUZhaWx1cmU9ZS5oYW5kc2hha2luZ0ZhaWx1cmUsZGVsZXRlIGUuaGFuZHNoYWtpbmdGYWlsdXJlKSwidGFsa2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUudGFsa1RpbWVNaWxsaXM9ZS50YWxraW5nVGltZU1pbGxpcyxkZWxldGUgZS50YWxraW5nVGltZU1pbGxpcyksZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MoZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKSxlfTt2YXIgbD1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwiZW5kcG9pbnQiKSxuLmNhbGwodGhpcyksZS5pbmNsdWRlcygiL3Rhc2stdGVtcGxhdGVzIikpdGhpcy5lbmRwb2ludFVybD10LmdldFVybFdpdGhQcm90b2NvbChlKTtlbHNle3ZhciByPW5ldyBBV1MuRW5kcG9pbnQoZSksbz1lLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKT8iL2Nvbm5lY3QiOiIiO3RoaXMuZW5kcG9pbnRVcmw9dC5nZXRVcmxXaXRoUHJvdG9jb2woYCR7ci5ob3N0fSR7b30vdGFzay10ZW1wbGF0ZXMvYXBpL2NjcGApfX07KGwucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1sLGwucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7biYmbi5yZWxhdGVkQ29udGFjdElkJiZudWxsIT09bi5yZWxhdGVkQ29udGFjdElkJiZuLnByZXZpb3VzQ29udGFjdElkJiZkZWxldGUgbi5wcmV2aW91c0NvbnRhY3RJZCx0LmFzc2VydE5vdE51bGwoZSwibWV0aG9kIiksdC5hc3NlcnROb3ROdWxsKG4sInBhcmFtcyIpO3ZhciBvPXtjcmVkZW50aWFsczoiaW5jbHVkZSIsbWV0aG9kOiJHRVQiLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJ4LWNzcmYtdG9rZW4iOiJjc3JmIn19LGk9bi5pbnN0YW5jZUlkLHM9dGhpcy5lbmRwb2ludFVybCxhPXQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHM7c3dpdGNoKGUpe2Nhc2UgYS5MSVNUX1RBU0tfVEVNUExBVEVTOmlmKHMrPWAvcHJveHkvaW5zdGFuY2UvJHtpfS90YXNrL3RlbXBsYXRlYCxuLnF1ZXJ5UGFyYW1zKXtjb25zdCBlPW5ldyBVUkxTZWFyY2hQYXJhbXMobi5xdWVyeVBhcmFtcykudG9TdHJpbmcoKTtlJiYocys9YD8ke2V9YCl9YnJlYWs7Y2FzZSBhLkdFVF9UQVNLX1RFTVBMQVRFOnQuYXNzZXJ0Tm90TnVsbChuLnRlbXBsYXRlUGFyYW1zLCJwYXJhbXMudGVtcGxhdGVQYXJhbXMiKTtjb25zdCByPXQuYXNzZXJ0Tm90TnVsbChuLnRlbXBsYXRlUGFyYW1zLmlkLCJwYXJhbXMudGVtcGxhdGVQYXJhbXMuaWQiKSxjPW4udGVtcGxhdGVQYXJhbXMudmVyc2lvbjtzKz1gL3Byb3h5L2luc3RhbmNlLyR7aX0vdGFzay90ZW1wbGF0ZS8ke3J9YCxjJiYocys9YD9zbmFwc2hvdFZlcnNpb249JHtjfWApO2JyZWFrO2Nhc2UgYS5DUkVBVEVfVEVNUExBVEVEX1RBU0s6cys9YC8ke2V9YCxvLmJvZHk9SlNPTi5zdHJpbmdpZnkobiksby5tZXRob2Q9IlBVVCI7YnJlYWs7Y2FzZSBhLlVQREFURV9DT05UQUNUOnMrPWAvJHtlfWAsby5ib2R5PUpTT04uc3RyaW5naWZ5KG4pLG8ubWV0aG9kPSJQT1NUIn10LmZldGNoKHMsbykudGhlbigoZnVuY3Rpb24oZSl7ci5zdWNjZXNzKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtjb25zdCB0PWUuYm9keS5nZXRSZWFkZXIoKTtsZXQgbj0iIjtjb25zdCBvPW5ldyBUZXh0RGVjb2Rlcjt0LnJlYWQoKS50aGVuKChmdW5jdGlvbiBpKHtkb25lOnMsdmFsdWU6YX0pe2lmKHMpe3ZhciBjPUpTT04ucGFyc2Uobik7cmV0dXJuIGMuc3RhdHVzPWUuc3RhdHVzLHZvaWQgci5mYWlsdXJlKGMpfXJldHVybiBuKz1vLmRlY29kZShhKSx0LnJlYWQoKS50aGVuKGkpfSkpfSkpfSx0LkNsaWVudEJhc2U9bix0Lk51bGxDbGllbnQ9cix0LlVwc3RyZWFtQ29uZHVpdENsaWVudD1pLHQuQXBpUHJveHlDbGllbnQ9cyx0LlVwc3RyZWFtQ29uZHVpdE1hc3RlckNsaWVudD1hLHQuQVdTQ2xpZW50PXUsdC5BZ2VudEFwcENsaWVudD1jLHQuVGFza1RlbXBsYXRlc0NsaWVudD1sfSgpfSw4OTU6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LmNvcmU9e30sdC5jb3JlLmluaXRpYWxpemVkPSExLHQudmVyc2lvbj0iMi4xNC4zIix0Lm91dGVyQ29udGV4dFN0cmVhbXNWZXJzaW9uPW51bGwsdC5ERUZBVUxUX0JBVENIX1NJWkU9NTAwO3ZhciBuPSJBbWF6b24gQ29ubmVjdCBDQ1AiLHI9Imh0dHBzOi8ve2FsaWFzfS5hd3NhcHBzLmNvbS9hdXRoLz9jbGllbnRfaWQ9e2NsaWVudF9pZH0mcmVkaXJlY3RfdXJpPXtyZWRpcmVjdH0iLG89IjA2OTE5ZjRmZDhlZDMyNGUiLGk9Ii9hdXRoL2F1dGhvcml6ZSIscz0iL2Nvbm5lY3QvYXV0aC9hdXRob3JpemUiLGE9IklmcmFtZVJlZnJlc2hBdHRlbXB0cyIsYz0iSWZyYW1lUmVmcmVzaEF0dGVtcHRzRHIiLHU9IklmcmFtZUluaXRpYWxpemF0aW9uU3VjY2VzcyIsbD0iSWZyYW1lSW5pdGlhbGl6YXRpb25TdWNjZXNzRHIiO2NvbnN0IHA9ImN1c3RvbXZpZXdzIixkPXsiMC0xMDAiOlswLDEwMF0sIjEwMS01MDAiOlsxMDEsNTAwXSwiNTAxLTEwMDAiOls1MDEsMWUzXSwiMTAwMC0zMDAwIjpbMTAwMSwzZTNdLCIzMDAxLTUwMDAiOlszMDAxLDVlM10sIjUwMDEtMTAwMDAiOls1MDAxLDFlNF0sIjEwMDAxLTIwMDAwIjpbMTAwMDEsMmU0XSwiMjAwMDArIjpbMjAwMDEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdfTt0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz0wLHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPTAsdC5jb3JlLk1BWF9BVVRIT1JJWkVfUkVUUllfQ09VTlRfRk9SX1NFU1NJT049Myx0LmNvcmUuTUFYX0NUSV9BVVRIX1JFVFJZX0NPVU5UPTEwLHQuY29yZS5jdGlBdXRoUmV0cnlDb3VudD0wLHQuY29yZS5hdXRob3JpemVUaW1lb3V0SWQ9bnVsbCx0LmNvcmUuY3RpVGltZW91dElkPW51bGwsdC5jb3JlLk1BWF9VTkFVVEhPUklaRURfUkVUUllfQ09VTlQ9MjAsdC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5UPTEwLHQuU2Vzc2lvblN0b3JhZ2VLZXlzPXQubWFrZUVudW0oWyJ0YWJfaWQiLCJhdXRob3JpemVfcmV0cnlfY291bnQiXSk7Y2xhc3MgaHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmtleT1gJHt0fVBhcmFtc1N0b3JhZ2U6OiR7ZS5sb2NhdGlvbi5vcmlnaW59YH1nZXQoKXt0cnl7Y29uc3QgdD1lLmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMua2V5KTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKGAke3RoaXMua2V5fTo6IEZhaWxlZCB0byBnZXQgc29mdHBob25lIHBhcmFtcyBmcm9tIGxvY2FsIHN0b3JhZ2UhYCkud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXJldHVybiBudWxsfXNldChuKXt0cnl7biYmZS5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmtleSxKU09OLnN0cmluZ2lmeShuKSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcihgJHt0aGlzLmtleX06OiBGYWlsZWQgdG8gc2V0IHNvZnRwaG9uZSBwYXJhbXMgdG8gbG9jYWwgc3RvcmFnZSFgKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fWNsZWFuKCl7ZS5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmtleSl9fWNvbnN0IGY9bmV3IGNsYXNzIGV4dGVuZHMgaHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJTb2Z0cGhvbmUiKX19LGc9bmV3IGNsYXNzIGV4dGVuZHMgaHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJSaW5ndG9uZSIpfX07ZnVuY3Rpb24gbShlKXt2YXIgdD1lLm1hdGNoKC9eKD86aHR0cHM/OlwvXC8pPyg/OlteQFxuXStAKT8oPzp3d3dcLik/KFteOlwvXG4/XSspL2dpKTtyZXR1cm4gdC5sZW5ndGg/dFswXToiIn10LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZD1mdW5jdGlvbigpe3QuY29yZS5pbml0aWFsaXplZCYmdC5nZXRMb2coKS53YXJuKCJDb25uZWN0IGNvcmUgYWxyZWFkeSBpbml0aWFsaXplZCwgb25seSBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBvbmNlLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O3ZhciB2PWZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5nZXRBZ2VudFN0YXRlcygpLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT10LkFnZW50U3RhdGVUeXBlLk9GRkxJTkV9KSk7ZS5zZXRTdGF0ZShyLG4pfSx5PWZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBjb250YWN0cyBzdXBwcmVzc29yIHRvICVzIGZvciBpbnN0YW5jZSAlcy4iLGUsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNVUFBSRVNTLHtzdXBwcmVzczplLHNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW06ITF9KX0sRT1mdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuaW5mbygiW0RJU0FTVEVSIFJFQ09WRVJZXSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBmb3JjZU9mZmxpbmUgdG8gJXMgZm9yIGluc3RhbmNlICVzLiIsZSx0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSx7b2ZmbGluZTplLG5leHRBY3RpdmVBcm46bn0pfSxTPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5nZXRMb2coKTtjb25zdCBvPXQuYWdlbnQuaW5pdGlhbGl6ZWQ/dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpOnQuY29yZS5yZWdpb247ci5pbmZvKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEF0dGVtcHRpbmcgdG8gZm9yY2UgaW5zdGFuY2UgJHtvfSBvZmZsaW5lIHVzaW5nICR7ZT8ic29mdCI6ImhhcmQifSBmYWlsb3ZlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5hZ2VudCgoZnVuY3Rpb24obyl7dmFyIGk9MCxzPW8uZ2V0Q29udGFjdHMoKSxhPSExO2lmKHMubGVuZ3RoKWZvcihsZXQgYyBvZiBzKXtpZihhKWJyZWFrOyFlfHxjLmdldFR5cGUoKSE9PXQuQ29udGFjdFR5cGUuUVVFVUVfQ0FMTEJBQ0smJmMuZ2V0VHlwZSgpIT10LkNvbnRhY3RUeXBlLlZPSUNFP2MuZ2V0QWdlbnRDb25uZWN0aW9uKCkuZGVzdHJveSh7c3VjY2VzczpmdW5jdGlvbigpeysraT09PXMubGVuZ3RoJiYoRSghMSxuKSx2KG8pLHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAlcyBpcyBub3cgb2ZmbGluZSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7ci53YXJuKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmb3JjZSB0aGlzIGluc3RhbmNlIHRvIG9mZmxpbmUgaW4gcmVnaW9uICVzIix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIud2FybihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLEUoITAsbiksYT0hMH19KTooci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFdpbGwgd2FpdCB0byBjb21wbGV0ZSBmYWlsb3ZlciBvZiBpbnN0YW5jZSAlcyB1bnRpbCB2b2ljZSBjb250YWN0IHdpdGggSUQgJXMgaXMgZGVzdHJveWVkIix0LmNvcmUucmVnaW9uLGMuZ2V0Q29udGFjdElkKCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSX1BFTkRJTkcse25leHRBY3RpdmVBcm46bn0pLGMub25EZXN0cm95KChmdW5jdGlvbihlKXtyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gVm9pY2UgY29udGFjdCB3aXRoIElEICVzIGRlc3Ryb3llZCwgY29udGludWluZyB3aXRoIGZhaWxvdmVyIGluIGluc3RhbmNlICVzIixlLmdldENvbnRhY3RJZCgpLHQuY29yZS5yZWdpb24pLFMoITAsbil9KSkpfWVsc2UgRSghMSxuKSx2KG8pLHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAlcyBpcyBub3cgb2ZmbGluZSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX07dC5jb3JlLnRlcm1pbmF0ZUN1c3RvbVZpZXc9ZnVuY3Rpb24oZSxuPSIiLHtyZXNvbHZlSWZyYW1lOnI9ITAsdGltZW91dDpvPTVlMyxoaWRlSWZyYW1lOmk9ITB9PXt9KXtsZXQgcztjb25zdCBhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD8ucXVlcnlTZWxlY3RvcihuKXx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSl8fHdpbmRvdy50b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSl9O3M9bj9gJHtwfSR7bn1gOmAke3B9YDtjb25zdCBjPXQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuZ2V0KHMpPy5jb250YWluZXJET00sdT1gaWZyYW1lW2lkPScke3N9J11gLGw9YShzLGMsdSk7aWYobCl0cnl7Y29uc3Qgbj17dG9waWM6ImxpZmVjeWNsZS50ZXJtaW5hdGVkIn07bC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKG4sZSksciYmKGkmJihsLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxjb25zb2xlLmluZm8oIltDdXN0b21WaWV3c10gY3VzdG9tdmlld3MgaWZyYW1lIGhpZGRlbiBmb3IgcmVzb2x1dGlvbiBkdXJpbmcgdGVybWluYXRpb24iKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuYWdlbnRBcHAuc3RvcEFwcChzKSxhKHMsYyx1KT9jb25zb2xlLndhcm4oIltDdXN0b21WaWV3c10gY3VzdG9tdmlld3MgYXBwbGljYXRpb24gZGlkIG5vdCBzdG9wIHN1Y2Nlc3NmdWxseSBpbiB0ZXJtaW5hdGVDdXN0b21WaWV3IG9wZXJhdGlvbiIpOmNvbnNvbGUuaW5mbygiW0N1c3RvbVZpZXdzXSBjdXN0b212aWV3cyBhcHBsaWNhdGlvbiBzdWNjZXNzZnVsbHkgc3RvcHBlZCIpfSksbykpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiW0N1c3RvbVZpZXdzXSBFcnJvciBpbiB0ZXJtaW5hdGVDdXN0b21WaWV3OiAiLGUpfWVsc2UgY29uc29sZS53YXJuKCJbQ3VzdG9tVmlld3NdIHRlcm1pbmF0ZUN1c3RvbVZpZXcgb3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gaWZyYW1lIG5vdCBmb3VuZCIpfSx0LmNvcmUuaW5pdERpc2FzdGVyUmVjb3Zlcnk9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQuZ2V0TG9nKCk7dC5jb3JlLnJlZ2lvbj1lLnJlZ2lvbix0LmNvcmUuc3VwcHJlc3NDb250YWN0cz1ufHx5LHQuY29yZS5mb3JjZU9mZmxpbmU9cnx8Uyx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNFVF9PRkZMSU5FLChmdW5jdGlvbihlKXt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLkZBSUxPVkVSLChmdW5jdGlvbigpe3QuY29yZS5mb3JjZU9mZmxpbmUoZSYmZS5zb2Z0RmFpbG92ZXIpfSkpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7dC5jb3JlLmZvcmNlT2ZmbGluZShlJiZlLnNvZnRGYWlsb3ZlcixlJiZlLm5leHRBY3RpdmVBcm4pfSkpfSkpLHQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7by5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluaXRpYWxpemluZyByZWdpb24gJXMgYXMgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSksKGZ1bmN0aW9uKCl7by5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldICVzIGFscmVhZHkgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLGUucG9sbEZvckZhaWxvdmVyJiZ0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HP3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HLHtpbnN0YW5jZUFybjplLmluc3RhbmNlQXJuLG90aGVyQXJuOmUub3RoZXJBcm4sYXV0aFRva2VuOmUuYXV0aFRva2VufSk6ZS5pc1ByaW1hcnk/KHQuY29yZS5zdXBwcmVzc0NvbnRhY3RzKCExKSxvLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gJXMgaW5zdGFuY2UgaXMgc2V0IHRvIHByaW1hcnkiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOih0LmNvcmUuc3VwcHJlc3NDb250YWN0cyghMCksdC5jb3JlLmZvcmNlT2ZmbGluZSgpLG8uaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSAlcyBpbnN0YW5jZSBpcyBzZXQgdG8gc3RhbmQtYnkiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSx0LmNvcmUuaW5pdD1mdW5jdGlvbihlKXt0LmNvcmUuZXZlbnRCdXM9bmV3IHQuRXZlbnRCdXMsdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBBKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUuaW5pdENsaWVudChlKSx0LmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50KGUpLHQuY29yZS5pbml0VGFza1RlbXBsYXRlc0NsaWVudChlKSx0LmNvcmUuaW5pdGlhbGl6ZWQ9ITB9LHQuY29yZS5pbml0Q2xpZW50PWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJwYXJhbXMiKTt2YXIgbj10LmFzc2VydE5vdE51bGwoZS5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxyPXQuYXNzZXJ0Tm90TnVsbChlLnJlZ2lvbiwicGFyYW1zLnJlZ2lvbiIpLG89ZS5lbmRwb2ludHx8bnVsbDt0LmNvcmUuY2xpZW50PW5ldyB0LkFXU0NsaWVudChuLHIsbyl9LHQuY29yZS5pbml0QWdlbnRBcHBDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPXQuYXNzZXJ0Tm90TnVsbChlLmF1dGhUb2tlbiwicGFyYW1zLmF1dGhUb2tlbiIpLHI9dC5hc3NlcnROb3ROdWxsKGUuYXV0aENvb2tpZU5hbWUsInBhcmFtcy5hdXRoQ29va2llTmFtZSIpLG89dC5hc3NlcnROb3ROdWxsKGUuYWdlbnRBcHBFbmRwb2ludCwicGFyYW1zLmFnZW50QXBwRW5kcG9pbnQiKTt0LmNvcmUuYWdlbnRBcHBDbGllbnQ9bmV3IHQuQWdlbnRBcHBDbGllbnQocixuLG8pfSx0LmNvcmUuaW5pdFRhc2tUZW1wbGF0ZXNDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPWUudGFza1RlbXBsYXRlc0VuZHBvaW50fHxlLmVuZHBvaW50O3QuYXNzZXJ0Tm90TnVsbChuLCJ0YXNrVGVtcGxhdGVzRW5kcG9pbnQiKSx0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudD1uZXcgdC5UYXNrVGVtcGxhdGVzQ2xpZW50KG4pfSx0LmNvcmUudGVybWluYXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmNsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS5hcGlQcm94eUNsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS5hZ2VudEFwcENsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW5ldyB0Lk51bGxDbGllbnQsdC5jb3JlLm1hc3RlckNsaWVudD1uZXcgdC5OdWxsQ2xpZW50O3ZhciBlPXQuY29yZS5nZXRFdmVudEJ1cygpO2UmJmUudW5zdWJzY3JpYmVBbGwoKSx0LmNvcmUuYnVzPW5ldyB0LkV2ZW50QnVzLHQuY29yZS5hZ2VudERhdGFQcm92aWRlcj1udWxsLHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW51bGwsdC5jb3JlLnVwc3RyZWFtPW51bGwsdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXI9bnVsbCx0LnN0b3JhZ2VBY2Nlc3MucmVzZXRTdG9yYWdlQWNjZXNzU3RhdGUoKSx0LmFnZW50LmluaXRpYWxpemVkPSExLHQuY29yZS5pbml0aWFsaXplZD0hMX0sdC5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1udWxsLHQuY29yZS5zZXRTb2Z0cGhvbmVVc2VyTWVkaWFTdHJlYW09ZnVuY3Rpb24oZSl7dC5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1lfSx0LmNvcmUuaW5pdFJpbmd0b25lRW5naW5lcz1mdW5jdGlvbihuLHIpe3QuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gaW5pdFJpbmd0b25lRW5naW5lIHN0YXJ0ZWQiKS53aXRoT2JqZWN0KHtwYXJhbXM6bn0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5hc3NlcnROb3ROdWxsKG4sInBhcmFtcyIpO2NvbnN0IG89cnx8Qzt2YXIgaT1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwicmluZ3RvbmVTZXR0aW5ncyIpLHQuYXNzZXJ0Tm90TnVsbChlLnZvaWNlLCJyaW5ndG9uZVNldHRpbmdzLnZvaWNlIiksdC5hc3NlcnRUcnVlKGUudm9pY2UucmluZ3RvbmVVcmx8fGUudm9pY2UuZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnZvaWNlLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLHQuYXNzZXJ0Tm90TnVsbChlLnF1ZXVlX2NhbGxiYWNrLCJyaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrIiksdC5hc3NlcnRUcnVlKGUucXVldWVfY2FsbGJhY2sucmluZ3RvbmVVcmx8fGUucXVldWVfY2FsbGJhY2suZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLHQuY29yZS5yaW5ndG9uZUVuZ2luZXM9e30sdC5hZ2VudCgoZnVuY3Rpb24obil7bi5vblJlZnJlc2goKGZ1bmN0aW9uKCl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5SSU5HVE9ORSwoZnVuY3Rpb24oKXtsZXQgbj0hMTtlLnZvaWNlLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnZvaWNlfHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy52b2ljZT1uZXcgdC5Wb2ljZVJpbmd0b25lRW5naW5lKGUudm9pY2UpLG49ITAsdC5nZXRMb2coKS5pbmZvKCJWb2ljZVJpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLGUuY2hhdC5kaXNhYmxlZHx8dC5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0fHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0PW5ldyB0LkNoYXRSaW5ndG9uZUVuZ2luZShlLmNoYXQpLG49ITAsdC5nZXRMb2coKS5pbmZvKCJDaGF0UmluZ3RvbmVFbmdpbmUgaW5pdGlhbGl6ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksZS50YXNrLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2t8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2s9bmV3IHQuVGFza1Jpbmd0b25lRW5naW5lKGUudGFzayksbj0hMCx0LmdldExvZygpLmluZm8oIlRhc2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxlLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnF1ZXVlX2NhbGxiYWNrfHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy5xdWV1ZV9jYWxsYmFjaz1uZXcgdC5RdWV1ZUNhbGxiYWNrUmluZ3RvbmVFbmdpbmUoZS5xdWV1ZV9jYWxsYmFjayksbj0hMCx0LmdldExvZygpLmluZm8oIlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxuJiZ0LmNvcmUuX3JpbmdlckRldmljZUlkJiZvKHtkZXZpY2VJZDp0LmNvcmUuX3JpbmdlckRldmljZUlkfSl9KSl9KSl9KSksYigpfSxzPWZ1bmN0aW9uKGUsbil7ZS5yaW5ndG9uZT1lLnJpbmd0b25lfHx7fSxlLnJpbmd0b25lLnZvaWNlPWUucmluZ3RvbmUudm9pY2V8fHt9LGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2s9ZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFja3x8e30sZS5yaW5ndG9uZS5jaGF0PWUucmluZ3RvbmUuY2hhdHx8e2Rpc2FibGVkOiEwfSxlLnJpbmd0b25lLnRhc2s9ZS5yaW5ndG9uZS50YXNrfHx7ZGlzYWJsZWQ6ITB9LG4uc29mdHBob25lJiYobi5zb2Z0cGhvbmUuZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS52b2ljZS5kaXNhYmxlZD0hMCxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkPSEwKSxuLnNvZnRwaG9uZS5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUudm9pY2UucmluZ3RvbmVVcmw9bi5zb2Z0cGhvbmUucmluZ3RvbmVVcmwsZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjay5yaW5ndG9uZVVybD1uLnNvZnRwaG9uZS5yaW5ndG9uZVVybCkpLG4uY2hhdCYmKG4uY2hhdC5kaXNhYmxlUmluZ3RvbmUmJihlLnJpbmd0b25lLmNoYXQuZGlzYWJsZWQ9ITApLG4uY2hhdC5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUuY2hhdC5yaW5ndG9uZVVybD1uLmNoYXQucmluZ3RvbmVVcmwpKSxuLnRhc2smJihuLnRhc2suZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS50YXNrLmRpc2FibGVkPSEwKSxuLnRhc2sucmluZ3RvbmVVcmwmJihlLnJpbmd0b25lLnRhc2sucmluZ3RvbmVVcmw9bi50YXNrLnJpbmd0b25lVXJsKSksbi5yaW5ndG9uZSYmKGUucmluZ3RvbmUudm9pY2U9dC5tZXJnZShlLnJpbmd0b25lLnZvaWNlLG4ucmluZ3RvbmUudm9pY2V8fHt9KSxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrPXQubWVyZ2UoZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjayxuLnJpbmd0b25lLnZvaWNlfHx7fSksZS5yaW5ndG9uZS5jaGF0PXQubWVyZ2UoZS5yaW5ndG9uZS5jaGF0LG4ucmluZ3RvbmUuY2hhdHx8e30pLGUucmluZ3RvbmUudGFzaz10Lm1lcmdlKGUucmluZ3RvbmUudGFzayxuLnJpbmd0b25lLnRhc2t8fHt9KSl9O2lmKHMobixuKSx0LmlzRnJhbWVkKCkpe2xldCByO3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKG8pe2UuY2xlYXJUaW1lb3V0KHIpLHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gQ29uZmlndXJlIGV2ZW50IGhhbmRsZXIgZXhlY3V0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMudW5zdWJzY3JpYmUoKSxzKG4sbyksZy5zZXQobi5yaW5ndG9uZSksaShuLnJpbmd0b25lKX0pKTtjb25zdCBvPWcuZ2V0KCk7byYmdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24obil7biYmbi5pZCYmKHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lRW5naW5lXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHN1Y2Nlc3NmdWxseSBhbmQgd2FpdGluZyBmb3IgY29uZmlndXJlIE1lc3NhZ2UgaGFuZGxlciB0byBleGVjdXRlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnVuc3Vic2NyaWJlKCkscj1lLnNldFRpbWVvdXQoKCgpPT57dC5nZXRMb2coKS5pbmZvKCJbUmluZ3RvbmVFbmdpbmVdIEVtYmVkZGVkIENDUCBpcyByZWZyZXNoZWQgd2l0aG91dCBjb25maWd1cmUgbWVzc2FnZSAmIEluaXRpYWxpemluZyBzZXR1cFJpbmd0b25lRW5naW5lcyAoUmluZ3RvbmUgRW5naW5lKSBmcm9tIGxvY2FsU3RvcmFnZSByaW5ndG9uZSBwYXJhbXMuICIpLndpdGhPYmplY3Qoe3Jpbmd0b25lOm99KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkobyl9KSwxMDApKX0pKX1lbHNlIGkobi5yaW5ndG9uZSl9O3ZhciBiPWZ1bmN0aW9uKCl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfUklOR0VSX0RFVklDRSxDKX0sQz1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgcmluZ2VyIGRldmljZSAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSwwPT09dC5rZXlzKHQuY29yZS5yaW5ndG9uZUVuZ2luZXMpLmxlbmd0aClyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBzZXRSaW5nZXJEZXZpY2UgY2FsbGVkIGJlZm9yZSByaW5ndG9uZSBlbmdpbmUgaXMgaW5pdGlhbGl6ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQobiYmKHQuY29yZS5fcmluZ2VyRGV2aWNlSWQ9bix0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIHN0b3JlZCBkZXZpY2UgSWQgZm9yIGxhdGVyIHVzZSwgb25jZSByaW5ndG9uZSBlbmdpbmUgaXMgdXAuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IlNldFJpbmdlckRldmljZUJlZm9yZUluaXRSaW5ndG9uZUVuZ2luZSIsZGF0YTp7Y291bnQ6MX19KSkpO2lmKG4pe2ZvcihsZXQgZSBpbiB0LmNvcmUucmluZ3RvbmVFbmdpbmVzKXQuY29yZS5yaW5ndG9uZUVuZ2luZXNbZV0uc2V0T3V0cHV0RGV2aWNlKG4pLnRoZW4oKGZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gcmluZ3RvbmVUeXBlICR7ZX0gc3VjY2Vzc2Z1bGx5IHNldCB0byBkZXZpY2VpZCAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcihlKX0pKTt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuUklOR0VSX0RFVklDRV9DSEFOR0VELGRhdGE6e2RldmljZUlkOm59fSl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgcmluZ2VyIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgZGV2aWNlSWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTt0LmNvcmUuaW5pdFNvZnRwaG9uZU1hbmFnZXI9ZnVuY3Rpb24obil7dmFyIHI9bnx8e307dC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGluaXRTb2Z0cGhvbmVNYW5hZ2VyIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBvPWZ1bmN0aW9uKGUpe3ZhciBuPXQubWVyZ2Uoci5zb2Z0cGhvbmV8fHt9LGUpO3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSBleGVjdXRlZCIpLndpdGhPYmplY3Qoe3NvZnRwaG9uZVBhcmFtczpufSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmFnZW50KChmdW5jdGlvbihlKXtlLmdldENoYW5uZWxDb25jdXJyZW5jeSh0LkNoYW5uZWxUeXBlLlZPSUNFKSYmZS5vblJlZnJlc2goKGZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gYWdlbnQgcmVmcmVzaCBoYW5kbGVyIGV4ZWN1dGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNPRlRQSE9ORSwoZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gY29uZmlybWVkIGFzIHNvZnRwaG9uZSBtYXN0ZXIgdG9waWMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLCF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSxyLnVuc3Vic2NyaWJlKCkpfSkpfSkpfSkpfTtpZih0LmlzRnJhbWVkKCkmJnQuaXNDQ1AoKSl7bGV0IG47dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24ocil7ZS5jbGVhclRpbWVvdXQobiksdC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIENvbmZpZ3VyZSBldmVudCBoYW5kbGVyIGV4ZWN1dGVkIikud2l0aE9iamVjdCh7ZGF0YTpyfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxmLnNldChyLnNvZnRwaG9uZSksci5zb2Z0cGhvbmUmJnIuc29mdHBob25lLmFsbG93RnJhbWVkU29mdHBob25lJiYodGhpcy51bnN1YnNjcmliZSgpLG8oci5zb2Z0cGhvbmUpKSxpKHIuc29mdHBob25lKX0pKTtsZXQgcj1mLmdldCgpO3ImJnQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKHMpe3MmJnMuaWQmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHdhaXRpbmcgZm9yIGNvbmZpZ3VyZSBNZXNzYWdlIGhhbmRsZXIgdG8gZXhlY3V0ZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy51bnN1YnNjcmliZSgpLG49ZS5zZXRUaW1lb3V0KCgoKT0+e3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHdpdGhvdXQgY29uZmlndXJlIG1lc3NhZ2UgaGFuZGxlciBleGVjdXRpb24iKS53aXRoT2JqZWN0KHtzb2Z0cGhvbmVQYXJhbXNGcm9tTG9jYWxTdG9yYWdlOnJ9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZToiRW1iZWRkZWRDQ1BSZWZyZXNoZWRXaXRob3V0SW5pdENDUCIsZGF0YTp7Y291bnQ6MX19KSxpKHIpLHIuYWxsb3dGcmFtZWRTb2Z0cGhvbmUmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCAmIEluaXRpYWxpemluZyBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSAoU29mdHBob25lIG1hbmFnZXIpIGZyb20gbG9jYWxTdG9yYWdlIHNvZnRwaG9uZSBwYXJhbXMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8ocikpfSksMTAwKSl9KSl9ZWxzZSBvKHIpLGkocik7ZnVuY3Rpb24gaShlKXt2YXIgbj10Lm1lcmdlKHIuc29mdHBob25lfHx7fSxlKTt0LmNvcmUuc29mdHBob25lUGFyYW1zPW4sdC5pc0ZpcmVmb3hCcm93c2VyKCkmJih0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSwoZnVuY3Rpb24oZSl7ZS5kYXRhJiZlLmRhdGEudG9waWM9PT10Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUmJmUuZGF0YS50YWtlT3ZlciYmZS5kYXRhLm1hc3RlcklkIT09dC5jb3JlLnBvcnRTdHJlYW1JZCYmdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJih0LmNvcmUuc29mdHBob25lTWFuYWdlci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlKCksZGVsZXRlIHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04sKGZ1bmN0aW9uKCl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUsKGZ1bmN0aW9uKCl7dC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJnQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLnN0YXJ0U2Vzc2lvbigpfSksKGZ1bmN0aW9uKCl7dC5iZWNvbWVNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe3QuYWdlbnQoKGZ1bmN0aW9uKGUpeyF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSx0LmNvcmUuc29mdHBob25lTWFuYWdlci5zdGFydFNlc3Npb24oKSl9KSl9KSl9KSl9KSksdC5jb250YWN0KChmdW5jdGlvbihlKXt0LmFnZW50KChmdW5jdGlvbihuKXtlLm9uUmVmcmVzaCgoZnVuY3Rpb24oZSl7aWYodC5oYXNPdGhlckNvbm5lY3RlZENDUHMoKSYmInZpc2libGUiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlJiYoZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HKSl7dmFyIHI9ZS5pc1NvZnRwaG9uZUNhbGwoKSYmIWUuaXNJbmJvdW5kKCksbz1lLmlzU29mdHBob25lQ2FsbCgpJiZuLmdldENvbmZpZ3VyYXRpb24oKS5zb2Z0cGhvbmVBdXRvQWNjZXB0LGk9ZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLOyhyfHxvfHxpKSYmdC5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQoKX19KSl9KSl9KSkpfXQuYWdlbnQoKGZ1bmN0aW9uKGUpe2UuaXNTb2Z0cGhvbmVFbmFibGVkKCkmJmUuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5KHQuQ2hhbm5lbFR5cGUuVk9JQ0UpJiZ0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFfSl9KSl9LHQuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLnNvZnRwaG9uZVBhcmFtcyYmdC5jb3JlLnNvZnRwaG9uZVBhcmFtcy5hbGxvd0ZyYW1lZFNvZnRwaG9uZTt0LmlzQ0NQKCk/ZT90LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmlzRnJhbWVkKCk/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOnQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOmU/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKX0sdC5jb3JlLmluaXRQYWdlT3B0aW9ucz1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIiksdC5pc0ZyYW1lZCgpKXt2YXIgbj10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5DT05GSUdVUkUsZGF0YTplfSl9KSksbi5zdWJzY3JpYmUodC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QsKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVTUE9OU0UsZSl9bmF2aWdhdG9yJiZuYXZpZ2F0b3IubWVkaWFEZXZpY2VzP25hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKHQpe2RldmljZXM9dHx8W10sZGV2aWNlcz1kZXZpY2VzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9KU09OKCl9KSksZShkZXZpY2VzKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZSh7ZXJyb3I6dC5tZXNzYWdlfSl9KSk6ZSh7ZXJyb3I6Ik5vIG5hdmlnYXRvciBvciBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIG9iamVjdCBmb3VuZCJ9KX0pKX19LHQuY29yZS5pbml0QXBpUHJveHlTZXJ2aWNlPWZ1bmN0aW9uKCl7dC5jb3JlLmFwaVByb3h5Q2xpZW50PW5ldyB0LkFwaVByb3h5Q2xpZW50LHQuaXNGcmFtZWQoKSYmKHQuY29yZS5oYW5kbGVBcGlQcm94eVJlcXVlc3Q9ZnVuY3Rpb24oZSl7ZT8ubWV0aG9kJiZ0LmNvcmUuZ2V0QXBpUHJveHlDbGllbnQoKS5jYWxsKGUubWV0aG9kLGUucGFyYW1zLHtzdWNjZXNzOmZ1bmN0aW9uKG4pe2NvbnN0IHI9e2RhdGE6bixyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9O3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxyKX0sZmFpbHVyZTpmdW5jdGlvbihuKXtjb25zdCByPXtlcnI6bixyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9O3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxyKX19KX0pfSx0LmNvcmUuZ2V0RnJhbWVNZWRpYURldmljZXM9ZnVuY3Rpb24oZSl7dmFyIG49bnVsbCxyPWV8fDFlMyxvPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dChuZXcgRXJyb3IoIlRpbWVvdXQgZXhjZWVkZWQiKSl9KSxyKX0pKSxpPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2lmKHQuaXNDQ1AoKSluYXZpZ2F0b3ImJm5hdmlnYXRvci5tZWRpYURldmljZXM/bmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigoZnVuY3Rpb24odCl7ZGV2aWNlcz10fHxbXSxkZXZpY2VzPWRldmljZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSxlKGRldmljZXMpfSkpOnIobmV3IEVycm9yKCJObyBuYXZpZ2F0b3Igb3IgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyBvYmplY3QgZm91bmQiKSk7ZWxzZXt2YXIgbz10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuPW8uc3Vic2NyaWJlKHQuRXZlbnRUeXBlLk1FRElBX0RFVklDRV9SRVNQT05TRSwoZnVuY3Rpb24odCl7dC5lcnJvcj9yKG5ldyBFcnJvcih0LmVycm9yKSk6ZSh0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QpfX0pKTtyZXR1cm4gUHJvbWlzZS5yYWNlKFtpLG9dKS5maW5hbGx5KChmdW5jdGlvbigpe24mJm4udW5zdWJzY3JpYmUoKX0pKX0sdC5jb3JlLmF1dGhvcml6ZT1mdW5jdGlvbihlKXt2YXIgbj1lO3JldHVybiBufHwobj10LmNvcmUuaXNMZWdhY3lEb21haW4oKT9zOmkpLHQuZmV0Y2gobix7Y3JlZGVudGlhbHM6ImluY2x1ZGUifSwyZTMsNSl9LHQuY29yZS52ZXJpZnlEb21haW5BY2Nlc3M9ZnVuY3Rpb24oZSxuKXtpZih0LmdldExvZygpLndhcm4oIlRoaXMgQVBJIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIHJlbGVhc2UiKSwhdC5pc0ZyYW1lZCgpKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTt2YXIgcj17aGVhZGVyczp7IlgtQW16LUJlYXJlciI6ZX19LG89bnVsbDtyZXR1cm4gbz1ufHwodC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/Ii9jb25uZWN0L3doaXRlbGlzdGVkLW9yaWdpbnMiOiIvd2hpdGVsaXN0ZWQtb3JpZ2lucyIpLHQuZmV0Y2gobyxyLDJlMyw1KS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD1tKHdpbmRvdy5kb2N1bWVudC5yZWZlcnJlcik7cmV0dXJuIGUud2hpdGVsaXN0ZWRPcmlnaW5zLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiB0PT09bShlKX0pKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlamVjdCgpfSkpfSx0LmNvcmUuaXNMZWdhY3lEb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZXx8d2luZG93LmxvY2F0aW9uLmhyZWYpLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKX0sdC5jb3JlLmluaXRTaGFyZWRXb3JrZXI9ZnVuY3Rpb24obil7aWYodC5jb3JlLmNoZWNrTm90SW5pdGlhbGl6ZWQoKSwhdC5jb3JlLmluaXRpYWxpemVkKXt0LmFzc2VydE5vdE51bGwobiwicGFyYW1zIik7dmFyIHI9dC5hc3NlcnROb3ROdWxsKG4uc2hhcmVkV29ya2VyVXJsLCJwYXJhbXMuc2hhcmVkV29ya2VyVXJsIiksbz10LmFzc2VydE5vdE51bGwobi5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxhPXQuYXNzZXJ0Tm90TnVsbChuLnJlZnJlc2hUb2tlbiwicGFyYW1zLnJlZnJlc2hUb2tlbiIpLGM9dC5hc3NlcnROb3ROdWxsKG4uYXV0aFRva2VuRXhwaXJhdGlvbiwicGFyYW1zLmF1dGhUb2tlbkV4cGlyYXRpb24iKSx1PXQuYXNzZXJ0Tm90TnVsbChuLnJlZ2lvbiwicGFyYW1zLnJlZ2lvbiIpLGw9bi5lbmRwb2ludHx8bnVsbCxwPW4uYXV0aG9yaXplRW5kcG9pbnQ7cHx8KHA9dC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/czppKTt2YXIgZD1uLmFnZW50QXBwRW5kcG9pbnR8fG51bGwsaD1uLnRhc2tUZW1wbGF0ZXNFbmRwb2ludHx8bnVsbCxmPW4uYXV0aENvb2tpZU5hbWV8fG51bGw7dHJ5e3QuY29yZS5ldmVudEJ1cz1uZXcgdC5FdmVudEJ1cyh7bG9nRXZlbnRzOiEwfSksdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBBKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUubWVkaWFGYWN0b3J5PW5ldyB0Lk1lZGlhRmFjdG9yeShuKTt2YXIgZz1uZXcgU2hhcmVkV29ya2VyKHIsIkNvbm5lY3RTaGFyZWRXb3JrZXIiKSxtPW5ldyB0LkNvbmR1aXQoIkNvbm5lY3RTaGFyZWRXb3JrZXJDb25kdWl0IixuZXcgdC5Qb3J0U3RyZWFtKGcucG9ydCksbmV3IHQuV2luZG93SU9TdHJlYW0od2luZG93LHBhcmVudCkpO3QuY29yZS51cHN0cmVhbT1tLHQuY29yZS53ZWJTb2NrZXRQcm92aWRlcj1uZXcgSSxlLm9udW5sb2FkPWZ1bmN0aW9uKCl7bS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ0xPU0UpLGcucG9ydC5jbG9zZSgpfSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1Mb2dQdXNoKG0pLHQuZ2V0TG9nKCkuc2NoZWR1bGVEb3duc3RyZWFtQ2xpZW50U2lkZUxvZ3NQdXNoKCksbS5vbkFsbFVwc3RyZWFtKHQuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSxtLm9uQWxsVXBzdHJlYW0obS5wYXNzRG93bnN0cmVhbSgpKSx0LmlzRnJhbWVkKCkmJihtLm9uQWxsRG93bnN0cmVhbSh0LmNvcmUuZ2V0RXZlbnRCdXMoKS5icmlkZ2UoKSksbS5vbkFsbERvd25zdHJlYW0oKGZ1bmN0aW9uKGUsbil7bj09PXQuRXZlbnRUeXBlLkFQSV9SRVFVRVNUJiZ0LmNvbnRhaW5zVmFsdWUodC5BcGlQcm94eUNsaWVudE1ldGhvZHMsZT8ubWV0aG9kKT90LmNvcmUuaGFuZGxlQXBpUHJveHlSZXF1ZXN0KGUpOm0ucGFzc1Vwc3RyZWFtKCkoZSxuKX0pKSksbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ09ORklHVVJFLHthdXRoVG9rZW46byxhdXRoVG9rZW5FeHBpcmF0aW9uOmMsZW5kcG9pbnQ6bCxyZWZyZXNoVG9rZW46YSxyZWdpb246dSxhdXRob3JpemVFbmRwb2ludDpwLGFnZW50QXBwRW5kcG9pbnQ6ZCx0YXNrVGVtcGxhdGVzRW5kcG9pbnQ6aCxhdXRoQ29va2llTmFtZTpmLGxvbmdQb2xsaW5nT3B0aW9uczpuLmxvbmdQb2xsaW5nT3B0aW9uc3x8dm9pZCAwfSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIkFja25vd2xlZGdlZCBieSB0aGUgQ29ubmVjdFNoYXJlZFdvcmtlciEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5pbml0aWFsaXplZD0hMCx0LmNvcmUuX3NldFRhYklkKCksdC5jb3JlLnBvcnRTdHJlYW1JZD1lLmlkLHRoaXMudW5zdWJzY3JpYmUoKX0pKSxtLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuTE9HLChmdW5jdGlvbihlKXtlLmxvZ2dlcklkIT09dC5nZXRMb2coKS5nZXRMb2dnZXJJZCgpJiZ0LmdldExvZygpLmFkZExvZ0VudHJ5KHQuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuc2VuZEludGVybmFsTG9nRW50cnlUb1NlcnZlcih0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLG0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmQXJyYXkuaXNBcnJheShlKSYmZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLnNlbmRJbnRlcm5hbExvZ0VudHJ5VG9TZXJ2ZXIodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKX0pKSxtLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmZS5sb2dnZXJJZCE9PXQuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmdC5nZXRMb2coKS5hZGRMb2dFbnRyeSh0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLHQuY29yZS5vbkF1dGhGYWlsKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aEZhaWwsbi5sb2dpbkVuZHBvaW50fHxudWxsLHApKSx0LmNvcmUub25BdXRob3JpemVTdWNjZXNzKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aG9yaXplU3VjY2VzcykpLHQuZ2V0TG9nKCkuaW5mbygiVXNlciBBZ2VudDogIituYXZpZ2F0b3IudXNlckFnZW50KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbygiaXNDQ1B2MjogIishMCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oImlzRnJhbWVkOiAiK3QuaXNGcmFtZWQoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUudXBzdHJlYW0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTywoZnVuY3Rpb24oZSl7dmFyIG49ZS5zdHJlYW1zVmVyc2lvbnx8bnVsbDt0LmdldExvZygpLmluZm8oIlN0cmVhbXNKUyBWZXJzaW9uOiAiK24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5vdXRlckNvbnRleHRTdHJlYW1zVmVyc2lvbj1ufSkpLG0ub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiTnVtYmVyIG9mIGNvbm5lY3RlZCBDQ1BzIHVwZGF0ZWQ6ICIrZS5sZW5ndGgpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5udW1iZXJPZkNvbm5lY3RlZENDUHM9ZS5sZW5ndGgsZVt0LmNvcmUudGFiSWRdJiYhaXNOYU4oZVt0LmNvcmUudGFiSWRdLmxlbmd0aCkmJnQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiIT09ZVt0LmNvcmUudGFiSWRdLmxlbmd0aCYmKHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPWVbdC5jb3JlLnRhYklkXS5sZW5ndGgsdC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWI+MSYmdC5nZXRMb2coKS53YXJuKCJUaGVyZSBhcmUgIit0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYisiIGNvbm5lY3RlZCBDQ1BzIGluIHRoaXMgdGFiLiBQbGVhc2UgYWRqdXN0IHlvdXIgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4gSWYgeW91IGFyZSBlbWJlZGRpbmcgQ0NQLCBwbGVhc2UgZG8gc28gZXhjbHVzaXZlbHkgd2l0aCBpbml0Q0NQLiBJbml0Q0NQIHdpbGwgbm90IGxldCB5b3UgZW1iZWQgbW9yZSB0aGFuIG9uZSBDQ1AuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNvbm5lY3RlZENDUFNpbmdsZVRhYkNvdW50IixkYXRhOntjb3VudDp0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYn19KSksZS50YWJJZCYmZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXImJnQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuTUVUUklDUywoKCk9PnQuYWdlbnQoKCgpPT50LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNDUFRhYnNBY3Jvc3NCcm93c2VyQ291bnQiLGRhdGE6e3RhYklkOmUudGFiSWQsY291bnQ6ZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXJ9fSkpKSkpfSkpLHQuY29yZS5jbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50KG0pLHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KG0pLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5URVJNSU5BVEUsbS5wYXNzVXBzdHJlYW0oKSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLlRFUk1JTkFURUQsKGZ1bmN0aW9uKCl7d2luZG93LmxvY2F0aW9uLnJlbG9hZCghMCl9KSksZy5wb3J0LnN0YXJ0KCksbS5vblVwc3RyZWFtKHQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELChmdW5jdGlvbihlKXtlJiZlLmRvbWFpbklkJiYodC5jb3JlLnZvaWNlSWREb21haW5JZD1lLmRvbWFpbklkKX0pKSx0LmFnZW50KChmdW5jdGlvbigpeyhuZXcgdC5Wb2ljZUlkKS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidm9pY2VJZCBkb21haW5JZCBzdWNjZXNzZnVsbHkgZmV0Y2hlZCBhdCBhZ2VudCBpbml0aWFsaXphdGlvbjogIitlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInZvaWNlSWQgZG9tYWluSWQgbm90IGZldGNoZWQgYXQgYWdlbnQgaW5pdGlhbGl6YXRpb24iKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSksdC5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXIoKS5yZXF1ZXN0UGVybWlzc2lvbigpLG0ub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RJU0FTVEVSX1JFQ09WRVJZLChmdW5jdGlvbihlKXt0LmNvcmUuaW5pdERpc2FzdGVyUmVjb3ZlcnkoZSl9KSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIEFQSSBzaGFyZWQgd29ya2VyLCB3ZSdyZSBkZWFkISIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19fSx0LmNvcmUuX3NldFRhYklkPWZ1bmN0aW9uKCl7dHJ5e3QuY29yZS50YWJJZD13aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5UQUJfSUQpLHQuY29yZS50YWJJZHx8KHQuY29yZS50YWJJZD10LnJhbmRvbUlkKCksd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuVEFCX0lELHQuY29yZS50YWJJZCkpLHQuY29yZS51cHN0cmVhbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuVEFCX0lELHt0YWJJZDp0LmNvcmUudGFiSWR9KX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkXSBUaGVyZSB3YXMgYW4gaXNzdWUgc2V0dGluZyB0aGUgdGFiIElkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0sdC5jb3JlLmluaXRDQ1A9ZnVuY3Rpb24obixpKXtpZih0LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZCgpLCF0LmNvcmUuaW5pdGlhbGl6ZWQpe3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBzPURhdGUubm93KCk7dHJ5e2lmKHQuY29yZS5fZ2V0Q0NQSWZyYW1lKCkpcmV0dXJuIHZvaWQgdC5nZXRMb2coKS5lcnJvcigiQXR0ZW1wdGVkIHRvIGNhbGwgaW5pdENDUCB3aGVuIGFuIGlmcmFtZSBnZW5lcmF0ZWQgYnkgaW5pdENDUCBhbHJlYWR5IGV4aXN0cyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgaW5pdENDUCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX12YXIgcD17fTsic3RyaW5nIj09dHlwZW9mIGk/cC5jY3BVcmw9aTpwPWksdC5hc3NlcnROb3ROdWxsKG4sImNvbnRhaW5lckRpdiIpLHQuYXNzZXJ0Tm90TnVsbChwLmNjcFVybCwicGFyYW1zLmNjcFVybCIpLHAuc29mdHBob25lPy5kaXNhYmxlU3RvcmluZ1BhcmFtc0luTG9jYWxTdG9yYWdlfHwoZi5jbGVhbigpLGcuY2xlYW4oKSksdC5zdG9yYWdlQWNjZXNzLmluaXQocC5jY3BVcmwsbixwLnN0b3JhZ2VBY2Nlc3N8fHt9KTt2YXIgZD10LmNvcmUuX2NyZWF0ZUNDUElmcmFtZShuLHApLGg9bmV3IHQuSUZyYW1lQ29uZHVpdChwLmNjcFVybCx3aW5kb3csZCk7dC5jb3JlLnVwc3RyZWFtPWgsdC5jb3JlLmV2ZW50QnVzPW5ldyB0LkV2ZW50QnVzKHtsb2dFdmVudHM6ITF9KSx0LnN0b3JhZ2VBY2Nlc3MuY2FuUmVxdWVzdCgpP3Quc3RvcmFnZUFjY2Vzcy5zZXR1cFJlcXVlc3RIYW5kbGVycyh7b25HcmFudDptfSk6bSgpfWZ1bmN0aW9uIG0oKXt0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXI9bmV3IEEodC5jb3JlLmdldEV2ZW50QnVzKCkpLHQuY29yZS5tZWRpYUZhY3Rvcnk9bmV3IHQuTWVkaWFGYWN0b3J5KHApLHQuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWUoZCxoKSx0LmNvcmUud2ViU29ja2V0UHJvdmlkZXI9bmV3IEksaC5vbkFsbFVwc3RyZWFtKHQuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSx0LmNvcmUua2VlcGFsaXZlTWFuYWdlcj1uZXcgVChoLHQuY29yZS5nZXRFdmVudEJ1cygpLHAuY2NwU3luVGltZW91dHx8MWUzLHAuY2NwQWNrVGltZW91dHx8M2UzKSx0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQ9bnVsbCx0LmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZT1lLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9bnVsbCx0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkFDS19USU1FT1VUKSx0LmdldExvZygpLmluZm8oIkNDUCBMb2FkVGltZW91dCB0cmlnZ2VyZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkscC5jY3BMb2FkVGltZW91dHx8NWUzKSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BMb2dzUHVzaChoKSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NQdXNoKGgpLGgub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24obil7aWYodC5nZXRMb2coKS5pbmZvKCJBY2tub3dsZWRnZWQgYnkgdGhlIENDUCEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5jbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50KGgpLHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KGgpLHQuY29yZS5wb3J0U3RyZWFtSWQ9bi5pZCwocC5zb2Z0cGhvbmV8fHAuY2hhdHx8cC50YXNrfHxwLnBhZ2VPcHRpb25zfHxwLnNob3VsZEFkZE5hbWVzcGFjZVRvTG9nc3x8cC5kaXNhc3RlclJlY292ZXJ5T24pJiZoLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5DT05GSUdVUkUse3NvZnRwaG9uZTpwLnNvZnRwaG9uZSxjaGF0OnAuY2hhdCx0YXNrOnAudGFzayxwYWdlT3B0aW9uczpwLnBhZ2VPcHRpb25zLHNob3VsZEFkZE5hbWVzcGFjZVRvTG9nczpwLnNob3VsZEFkZE5hbWVzcGFjZVRvTG9ncyxkaXNhc3RlclJlY292ZXJ5T246cC5kaXNhc3RlclJlY292ZXJ5T259KSxwLmRpc2FzdGVyUmVjb3ZlcnlPbiYmKHQuY29yZS5yZWdpb249cC5yZWdpb24sdC5jb3JlLnN1cHByZXNzQ29udGFjdHM9eSx0LmNvcmUuZm9yY2VPZmZsaW5lPWZ1bmN0aW9uKGUpe2guc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5TRVRfT0ZGTElORSxlKX0saC5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRElTQVNURVJfUkVDT1ZFUlkscCkpLHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlJiYoZS5jbGVhclRpbWVvdXQodC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2UpLHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlPW51bGwpLGguc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTyx7c3RyZWFtc1ZlcnNpb246dC52ZXJzaW9ufSksdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXIuc3RhcnQoKSx0aGlzLnVuc3Vic2NyaWJlKCksdC5jb3JlLmluaXRpYWxpemVkPSEwLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuSU5JVCkscyl7dmFyIHI9RGF0ZS5ub3coKS1zLG89dC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0fHwwO3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5nZXRMb2coKS5pbmZvKGBJZnJhbWUgaW5pdGlhbGl6YXRpb24gdGltZSAke3J9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oYElmcmFtZSByZWZyZXNoIGF0dGVtcHRzICR7b31gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHNldFRpbWVvdXQoKCgpPT57dC5wdWJsaXNoTWV0cmljKHtuYW1lOmEsZGF0YTp7Y291bnQ6b319KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6dSxkYXRhOntjb3VudDoxfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiSWZyYW1lSW5pdGlhbGl6YXRpb25UaW1lIixkYXRhOntjb3VudDpyfX0pLHAuZGlzYXN0ZXJSZWNvdmVyeU9uJiYodC5wdWJsaXNoTWV0cmljKHtuYW1lOmMsZGF0YTp7Y291bnQ6b319KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bCxkYXRhOntjb3VudDoxfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiSWZyYW1lSW5pdGlhbGl6YXRpb25UaW1lRHIiLGRhdGE6e2NvdW50OnJ9fSkpLHM9bnVsbH0pLDFlMyl9fSkpLGgub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe2UubG9nZ2VySWQhPT10LmdldExvZygpLmdldExvZ2dlcklkKCkmJnQuZ2V0TG9nKCkuYWRkTG9nRW50cnkodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQUNLX1RJTUVPVVQsKGZ1bmN0aW9uKCl7aWYoITEhPT1wLmxvZ2luUG9wdXApdHJ5e3ZhciBpPWZ1bmN0aW9uKG4pe3ZhciBpPSJodHRwczovL2xpbHkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vdGF3L2F1dGgvY29kZSI7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChpKSxuLmxvZ2luVXJsP24ubG9naW5Vcmw6bi5hbGlhcz8obG9nLndhcm4oIlRoZSBgYWxpYXNgIHBhcmFtIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgZXhwZWN0ZWQgdG8gZnVuY3Rpb24gcHJvcGVybHkuIFBsZWFzZSB1c2UgYGNjcFVybGAgb3IgYGxvZ2luVXJsYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbWF6b24tY29ubmVjdC9hbWF6b24tY29ubmVjdC1zdHJlYW1zL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNjb25uZWN0Y29yZWluaXRjY3AgZm9yIHZhbGlkIHBhcmFtZXRlcnMuIiksci5yZXBsYWNlKCJ7YWxpYXN9IixuLmFsaWFzKS5yZXBsYWNlKCJ7Y2xpZW50X2lkfSIsbykucmVwbGFjZSgie3JlZGlyZWN0fSIsZS5lbmNvZGVVUklDb21wb25lbnQoaSkpKTpuLmNjcFVybH0ocCk7dC5nZXRMb2coKS53YXJuKCJBQ0tfVElNRU9VVCBvY2N1cnJlZCwgYXR0ZW1wdGluZyB0byBwb3AgdGhlIGxvZ2luIHBhZ2UgaWYgbm90IGFscmVhZHkgb3Blbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5sb2dpbldpbmRvdz10LmNvcmUuZ2V0UG9wdXBNYW5hZ2VyKCkub3BlbihpLHQuTWFzdGVyVG9waWNzLkxPR0lOX1BPUFVQLHAubG9naW5PcHRpb25zKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJBQ0tfVElNRU9VVCBvY2N1cnJlZCBidXQgd2UgYXJlIHVuYWJsZSB0byBvcGVuIHRoZSBsb2dpbiBwb3B1cC4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9aWYobnVsbD09dC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0KXRyeXtoLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKCl7dGhpcy51bnN1YnNjcmliZSgpLGUuY2xlYXJUaW1lb3V0KHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCksdC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0PW51bGwsKHAubG9naW5Qb3B1cEF1dG9DbG9zZXx8cC5sb2dpbk9wdGlvbnMmJnAubG9naW5PcHRpb25zLmF1dG9DbG9zZSkmJnQuY29yZS5sb2dpbldpbmRvdyYmKHQuY29yZS5sb2dpbldpbmRvdy5jbG9zZSgpLHQuY29yZS5sb2dpbldpbmRvdz1udWxsKX0pKSx0LmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQocCxuKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJFcnJvciBvY2N1cnJlZCB3aGlsZSByZWZyZXNoaW5nIGlmcmFtZSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSkscC5vblZpZXdDb250YWN0JiZ0LmNvcmUub25WaWV3Q29udGFjdChwLm9uVmlld0NvbnRhY3QpLGgub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe3QubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPWUubGVuZ3RofSkpLGgub25VcHN0cmVhbSh0LlZvaWNlSWRFdmVudHMuVVBEQVRFX0RPTUFJTl9JRCwoZnVuY3Rpb24oZSl7ZSYmZS5kb21haW5JZCYmKHQuY29yZS52b2ljZUlkRG9tYWluSWQ9ZS5kb21haW5JZCl9KSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLklGUkFNRV9SRVRSSUVTX0VYSEFVU1RFRCwoZnVuY3Rpb24oKXtpZihzKXt2YXIgZT10LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQtMTt0LmdldExvZygpLmluZm8oIklmcmFtZSBpbml0aWFsaXphdGlvbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbygiVGltZSBhZnRlciBpZnJhbWUgaW5pdGlhbGl6YXRpb24gc3RhcnRlZCAiKyhEYXRlLm5vdygpLXMpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbyhgSWZyYW1lIHJlZnJlc2ggYXR0ZW1wdHMgJHtlfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5wdWJsaXNoTWV0cmljKHtuYW1lOmEsZGF0YTp7Y291bnQ6ZX19KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6dSxkYXRhOntjb3VudDowfX0pLHAuZGlzYXN0ZXJSZWNvdmVyeU9uJiYodC5wdWJsaXNoTWV0cmljKHtuYW1lOmMsZGF0YTp7Y291bnQ6ZX19KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bCxkYXRhOntjb3VudDowfX0pKSxzPW51bGx9fSkpLHQuY29yZS5zb2Z0cGhvbmVQYXJhbXM9cC5zb2Z0cGhvbmV9fSx0LmNvcmUub25JZnJhbWVSZXRyaWVzRXhoYXVzdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQsZSl9LHQuY29yZS5fcmVmcmVzaElmcmFtZU9uVGltZW91dD1mdW5jdGlvbihuLHIpe3QuYXNzZXJ0Tm90TnVsbChuLCJpbml0Q0NQUGFyYW1zIiksdC5hc3NlcnROb3ROdWxsKHIsImNvbnRhaW5lckRpdiIpO3ZhciBvPW4uY2NwTG9hZFRpbWVvdXQ/bi5jY3BMb2FkVGltZW91dDpuLmRpc2FzdGVyUmVjb3ZlcnlPbj8xZTQ6NWUzO2UuY2xlYXJUaW1lb3V0KHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCksdC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0PWUuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpZih0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQ9KHQuY29yZS5pZnJhbWVSZWZyZXNoQXR0ZW1wdHx8MCkrMSx0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQ8PTEwKXt0cnl7dmFyIG89dC5jb3JlLl9nZXRDQ1BJZnJhbWUoKTtvJiZvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyk7dmFyIGk9dC5jb3JlLl9jcmVhdGVDQ1BJZnJhbWUocixuKTt0LmNvcmUudXBzdHJlYW0udXBzdHJlYW0ub3V0cHV0PWkuY29udGVudFdpbmRvdyx0LmNvcmUuX3NlbmRJZnJhbWVTdHlsZURhdGFVcHN0cmVhbUFmdGVyUmVhc29uYWJsZVdhaXRUaW1lKGksdC5jb3JlLnVwc3RyZWFtKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJFcnJvciB3aGlsZSBjaGVja2luZyBmb3IsIGFuZCByZWNyZWF0aW5nLCB0aGUgQ0NQIElGcmFtZSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX10LmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQobixyKX1lbHNlIHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuSUZSQU1FX1JFVFJJRVNfRVhIQVVTVEVEKSxlLmNsZWFyVGltZW91dCh0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpfSksbyl9LHQuY29yZS5fZ2V0Q0NQSWZyYW1lPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIG9mIHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIikpaWYoZS5uYW1lPT09bilyZXR1cm4gZTtyZXR1cm4gbnVsbH0sdC5jb3JlLl9jcmVhdGVDQ1BJZnJhbWU9ZnVuY3Rpb24oZSxyKXt0LmFzc2VydE5vdE51bGwociwiaW5pdENDUFBhcmFtcyIpLHQuYXNzZXJ0Tm90TnVsbChlLCJjb250YWluZXJEaXYiKTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtyZXR1cm4gby5zcmM9ci5jY3BVcmwsby5hbGxvdz0ibWljcm9waG9uZTsgY2FtZXJhOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBpZGVudGl0eS1jcmVkZW50aWFscy1nZXQiLG8uc3R5bGU9ci5zdHlsZXx8IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCUiLG8udGl0bGU9ci5pZnJhbWVUaXRsZXx8bixvLm5hbWU9bix0LnN0b3JhZ2VBY2Nlc3MuY2FuUmVxdWVzdCgpJiYoby5zcmM9dC5zdG9yYWdlQWNjZXNzLmdldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsKCksby5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix0LnN0b3JhZ2VBY2Nlc3MucmVxdWVzdCkpLGUuYXBwZW5kQ2hpbGQobyksb30sdC5jb3JlLl9zZW5kSWZyYW1lU3R5bGVEYXRhVXBzdHJlYW1BZnRlclJlYXNvbmFibGVXYWl0VGltZT1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJpZnJhbWUiKSx0LmFzc2VydE5vdE51bGwobiwiY29uZHVpdCIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHI9e2Rpc3BsYXk6d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSxudWxsKS5kaXNwbGF5LG9mZnNldFdpZHRoOmUub2Zmc2V0V2lkdGgsb2Zmc2V0SGVpZ2h0OmUub2Zmc2V0SGVpZ2h0LGNsaWVudFJlY3RzTGVuZ3RoOmUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGh9O24uc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLklGUkFNRV9TVFlMRSxyKX0pLDFlNCl9O3ZhciBUPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuY29uZHVpdD1lLHRoaXMuZXZlbnRCdXM9dCx0aGlzLnN5blRpbWVvdXQ9bix0aGlzLmFja1RpbWVvdXQ9cix0aGlzLmFja1RpbWVyPW51bGwsdGhpcy5zeW5UaW1lcj1udWxsLHRoaXMuYWNrU3ViPW51bGx9O1QucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7dmFyIG49dGhpczt0aGlzLmNvbmR1aXQuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlNZTkNIUk9OSVpFKSx0aGlzLmFja1N1Yj10aGlzLmNvbmR1aXQub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24oKXt0aGlzLnVuc3Vic2NyaWJlKCksZS5jbGVhclRpbWVvdXQobi5hY2tUaW1lciksbi5fZGVmZXJTdGFydCgpfSkpLHRoaXMuYWNrVGltZXI9ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe24uYWNrU3ViLnVuc3Vic2NyaWJlKCksbi5ldmVudEJ1cy50cmlnZ2VyKHQuRXZlbnRUeXBlLkFDS19USU1FT1VUKSxuLl9kZWZlclN0YXJ0KCl9KSx0aGlzLmFja1RpbWVvdXQpfSxULnByb3RvdHlwZS5fZGVmZXJTdGFydD1mdW5jdGlvbigpe3RoaXMuc3luVGltZXI9ZS5zZXRUaW1lb3V0KHQuaGl0Y2godGhpcyx0aGlzLnN0YXJ0KSx0aGlzLnN5blRpbWVvdXQpfSxULnByb3RvdHlwZS5kZWZlclN0YXJ0PWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5zeW5UaW1lciYmKHRoaXMuc3luVGltZXI9ZS5zZXRUaW1lb3V0KHQuaGl0Y2godGhpcyx0aGlzLnN0YXJ0KSx0aGlzLnN5blRpbWVvdXQpKX07dmFyIEk9ZnVuY3Rpb24oKXt2YXIgZT17aW5pdEZhaWx1cmU6bmV3IFNldCxzdWJzY3JpcHRpb25VcGRhdGU6bmV3IFNldCxzdWJzY3JpcHRpb25GYWlsdXJlOm5ldyBTZXQsdG9waWM6bmV3IE1hcCxhbGxNZXNzYWdlOm5ldyBTZXQsY29ubmVjdGlvbkdhaW46bmV3IFNldCxjb25uZWN0aW9uTG9zdDpuZXcgU2V0LGNvbm5lY3Rpb25PcGVuOm5ldyBTZXQsY29ubmVjdGlvbkNsb3NlOm5ldyBTZXR9LG49ZnVuY3Rpb24oZSx0KXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UodCl9KSl9O3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuSU5JVF9GQUlMVVJFLChmdW5jdGlvbigpe24oZS5pbml0RmFpbHVyZSl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX09QRU4sKGZ1bmN0aW9uKHQpe24oZS5jb25uZWN0aW9uT3Blbix0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fQ0xPU0UsKGZ1bmN0aW9uKHQpe24oZS5jb25uZWN0aW9uQ2xvc2UsdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0dBSU4sKGZ1bmN0aW9uKCl7bihlLmNvbm5lY3Rpb25HYWluKX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fTE9TVCwoZnVuY3Rpb24odCl7bihlLmNvbm5lY3Rpb25Mb3N0LHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX1VQREFURSwoZnVuY3Rpb24odCl7bihlLnN1YnNjcmlwdGlvblVwZGF0ZSx0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklQVElPTl9GQUlMVVJFLChmdW5jdGlvbih0KXtuKGUuc3Vic2NyaXB0aW9uRmFpbHVyZSx0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkFMTF9NRVNTQUdFLChmdW5jdGlvbih0KXtuKGUuYWxsTWVzc2FnZSx0KSxlLnRvcGljLmhhcyh0LnRvcGljKSYmbihlLnRvcGljLmdldCh0LnRvcGljKSx0KX0pKSx0aGlzLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TRU5ELGUpfSx0aGlzLm9uSW5pdEZhaWx1cmU9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmluaXRGYWlsdXJlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmluaXRGYWlsdXJlLmRlbGV0ZShuKX19LHRoaXMub25Db25uZWN0aW9uT3Blbj1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbk9wZW4uYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbk9wZW4uZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25DbG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbkNsb3NlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmNvbm5lY3Rpb25DbG9zZS5kZWxldGUobil9fSx0aGlzLm9uQ29ubmVjdGlvbkdhaW49ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmNvbm5lY3Rpb25HYWluLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmNvbm5lY3Rpb25HYWluLmRlbGV0ZShuKX19LHRoaXMub25Db25uZWN0aW9uTG9zdD1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbkxvc3QuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkxvc3QuZGVsZXRlKG4pfX0sdGhpcy5vblN1YnNjcmlwdGlvblVwZGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuc3Vic2NyaXB0aW9uVXBkYXRlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLnN1YnNjcmlwdGlvblVwZGF0ZS5kZWxldGUobil9fSx0aGlzLm9uU3Vic2NyaXB0aW9uRmFpbHVyZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuc3Vic2NyaXB0aW9uRmFpbHVyZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5zdWJzY3JpcHRpb25GYWlsdXJlLmRlbGV0ZShuKX19LHRoaXMuc3Vic2NyaWJlVG9waWNzPWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJ0b3BpY3MiKSx0LmFzc2VydFRydWUodC5pc0FycmF5KGUpLCJ0b3BpY3MgbXVzdCBiZSBhIGFycmF5IiksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklCRSxlKX0sdGhpcy5vbk1lc3NhZ2U9ZnVuY3Rpb24obixyKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKG4sInRvcGljTmFtZSIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24ociksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLnRvcGljLmhhcyhuKT9lLnRvcGljLmdldChuKS5hZGQocik6ZS50b3BpYy5zZXQobixuZXcgU2V0KFtyXSkpLGZ1bmN0aW9uKCl7cmV0dXJuIGUudG9waWMuZ2V0KG4pLmRlbGV0ZShyKX19LHRoaXMub25BbGxNZXNzYWdlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5hbGxNZXNzYWdlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmFsbE1lc3NhZ2UuZGVsZXRlKG4pfX19LEE9ZnVuY3Rpb24oZSl7dGhpcy5idXM9ZSx0aGlzLmJ1cy5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5VUERBVEUsdC5oaXRjaCh0aGlzLHRoaXMudXBkYXRlQWdlbnREYXRhKSl9O0EucHJvdG90eXBlLnVwZGF0ZUFnZW50RGF0YT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLmFnZW50RGF0YTt0aGlzLmFnZW50RGF0YT1lO3RyeXtjb25zdCByPURhdGUucGFyc2UoZS5zbmFwc2hvdC5zbmFwc2hvdFRpbWVzdGFtcCk7aWYoIW58fHIhPT1EYXRlLnBhcnNlKG4uc25hcHNob3Quc25hcHNob3RUaW1lc3RhbXApKXtjb25zdCBuPShuZXcgRGF0ZSkuZ2V0VGltZSgpLXI7XygiU25hcHNob3RSZWNlaXZlZEJ5Q2xpZW50IixuLHtDb250ZW50TGVuZ3RoSW5CeXRlczp0LmNvcmUuX2NhbGN1bGF0ZVNuYXBzaG90U2l6aW5nQnVja2V0KGUuc25hcHNob3QpLElzQ0NQTGF5ZXI6dC5pc0NDUCgpfSl9fWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltNZXRyaWNzXSBGYWlsZWQgdG8gc2VuZCBtZXRyaWNzLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1udWxsPT1uJiYodC5hZ2VudC5pbml0aWFsaXplZD0hMCx0aGlzLmJ1cy50cmlnZ2VyKHQuQWdlbnRFdmVudHMuSU5JVCxuZXcgdC5BZ2VudCkpLHRoaXMuYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5SRUZSRVNILG5ldyB0LkFnZW50KSx0aGlzLl9maXJlQWdlbnRVcGRhdGVFdmVudHMobil9LEEucHJvdG90eXBlLmdldEFnZW50RGF0YT1mdW5jdGlvbigpe2lmKG51bGw9PXRoaXMuYWdlbnREYXRhKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIk5vIGFnZW50IGRhdGEgaXMgYXZhaWxhYmxlIHlldCEiKTtyZXR1cm4gdGhpcy5hZ2VudERhdGF9LEEucHJvdG90eXBlLmdldENvbnRhY3REYXRhPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuZ2V0QWdlbnREYXRhKCkscj10LmZpbmQobi5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24odCl7cmV0dXJuIHQuY29udGFjdElkPT09ZX0pKTtpZihudWxsPT1yKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIkNvbnRhY3QgJXMgbm8gbG9uZ2VyIGV4aXN0cy4iLGUpO3JldHVybiByfSxBLnByb3RvdHlwZS5nZXRDb25uZWN0aW9uRGF0YT1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMuZ2V0Q29udGFjdERhdGEoZSksbz10LmZpbmQoci5jb25uZWN0aW9ucywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29ubmVjdGlvbklkPT09bn0pKTtpZihudWxsPT1vKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIkNvbm5lY3Rpb24gJXMgZm9yIGNvbnRhY3QgJXMgbm8gbG9uZ2VyIGV4aXN0cy4iLG4sZSk7cmV0dXJuIG99LEEucHJvdG90eXBlLmdldEluc3RhbmNlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBZ2VudERhdGEoKS5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlSWQubWF0Y2goL2luc3RhbmNlXC8oWzAtOWEtZkEtRnwtXSspXC8vKVsxXX0sQS5wcm90b3R5cGUuZ2V0QVdTQWNjb3VudElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QWdlbnREYXRhKCkuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5yb3V0aW5nUHJvZmlsZUlkLm1hdGNoKC86KFswLTldKyk6aW5zdGFuY2UvKVsxXX0sQS5wcm90b3R5cGUuX2RpZmZDb250YWN0cz1mdW5jdGlvbihlKXt2YXIgbj17YWRkZWQ6e30scmVtb3ZlZDp7fSxjb21tb246e30sb2xkTWFwOnQuaW5kZXgobnVsbD09ZT9bXTplLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSksbmV3TWFwOnQuaW5kZXgodGhpcy5hZ2VudERhdGEuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxlbmRUaW1lOjB9O3JldHVybiB0LmtleXMobi5vbGRNYXApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY29udGFpbnMobi5uZXdNYXAsZSk/bi5jb21tb25bZV09bi5uZXdNYXBbZV06bi5yZW1vdmVkW2VdPW4ub2xkTWFwW2VdfSkpLHQua2V5cyhuLm5ld01hcCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jb250YWlucyhuLm9sZE1hcCxlKXx8KG4uYWRkZWRbZV09bi5uZXdNYXBbZV0pfSkpLG4uZW5kVGltZT1wZXJmb3JtYW5jZS5ub3coKSxufSxBLnByb3RvdHlwZS5fZmlyZUFnZW50VXBkYXRlRXZlbnRzPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMscj1udWxsLG89bnVsbD09ZT90LkFnZW50QXZhaWxTdGF0ZXMuSU5JVDplLnNuYXBzaG90LnN0YXRlLm5hbWUsaT10aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5zdGF0ZS5uYW1lLHM9bnVsbD09ZT90LkFnZW50U3RhdGVUeXBlLklOSVQ6ZS5zbmFwc2hvdC5zdGF0ZS50eXBlLGE9dGhpcy5hZ2VudERhdGEuc25hcHNob3Quc3RhdGUudHlwZTtzIT09YSYmdC5jb3JlLmdldEFnZW50Um91dGluZ0V2ZW50R3JhcGgoKS5nZXRBc3NvY2lhdGlvbnModGhpcyxzLGEpLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uYnVzLnRyaWdnZXIoZSxuZXcgdC5BZ2VudCl9KSksbyE9PWkmJih0aGlzLmJ1cy50cmlnZ2VyKHQuQWdlbnRFdmVudHMuU1RBVEVfQ0hBTkdFLHthZ2VudDpuZXcgdC5BZ2VudCxvbGRTdGF0ZTpvLG5ld1N0YXRlOml9KSx0LmNvcmUuZ2V0QWdlbnRTdGF0ZUV2ZW50R3JhcGgoKS5nZXRBc3NvY2lhdGlvbnModGhpcyxvLGkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uYnVzLnRyaWdnZXIoZSxuZXcgdC5BZ2VudCl9KSkpO3ZhciBjPWUmJmUuc25hcHNob3QubmV4dFN0YXRlP2Uuc25hcHNob3QubmV4dFN0YXRlLm5hbWU6bnVsbCx1PXRoaXMuYWdlbnREYXRhLnNuYXBzaG90Lm5leHRTdGF0ZT90aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5uZXh0U3RhdGUubmFtZTpudWxsO2MhPT11JiZ1JiZuLmJ1cy50cmlnZ2VyKHQuQWdlbnRFdmVudHMuRU5RVUVVRURfTkVYVF9TVEFURSxuZXcgdC5BZ2VudCk7Y29uc3QgbD1wZXJmb3JtYW5jZS5ub3coKTtyPW51bGwhPT1lP3RoaXMuX2RpZmZDb250YWN0cyhlKTp7YWRkZWQ6dC5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLHJlbW92ZWQ6e30sY29tbW9uOnt9LG9sZE1hcDp7fSxuZXdNYXA6dC5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLGVuZFRpbWU6cGVyZm9ybWFuY2Uubm93KCl9O2NvbnN0IHA9cGVyZm9ybWFuY2Uubm93KCk7dC52YWx1ZXMoci5hZGRlZCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcih0LkNvbnRhY3RFdmVudHMuSU5JVCxuZXcgdC5Db250YWN0KGUuY29udGFjdElkKSksbi5fZmlyZUNvbnRhY3RVcGRhdGVFdmVudHMoZS5jb250YWN0SWQsdC5Db250YWN0U3RhdGVUeXBlLklOSVQsZS5zdGF0ZS50eXBlKX0pKSx0LnZhbHVlcyhyLnJlbW92ZWQpLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uYnVzLnRyaWdnZXIodC5Db250YWN0RXZlbnRzLkRFU1RST1lFRCxuZXcgdC5Db250YWN0U25hcHNob3QoZSkpLG4uYnVzLnRyaWdnZXIodC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkRFU1RST1lFRCxlLmNvbnRhY3RJZCksbmV3IHQuQ29udGFjdFNuYXBzaG90KGUpKSxuLl91bnN1YkFsbENvbnRhY3RFdmVudHNGb3JDb250YWN0KGUuY29udGFjdElkKX0pKSx0LmtleXMoci5jb21tb24pLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uX2ZpcmVDb250YWN0VXBkYXRlRXZlbnRzKGUsci5vbGRNYXBbZV0uc3RhdGUudHlwZSxyLm5ld01hcFtlXS5zdGF0ZS50eXBlKX0pKTtjb25zdCBkPXBlcmZvcm1hbmNlLm5vdygpLGg9e0NvbnRlbnRMZW5ndGhJbkJ5dGVzOnQuY29yZS5fY2FsY3VsYXRlU25hcHNob3RTaXppbmdCdWNrZXQodGhpcy5hZ2VudERhdGEuc25hcHNob3QpLElzQ0NQTGF5ZXI6dC5pc0NDUCgpfTt0cnl7XygiU25hcHNob3RDb21wYXJpc29uU3RlcFRpbWUiLHIuZW5kVGltZS1sLGgpLF8oIlNuYXBzaG90RXZlbnRUcmlnZ2VyU3RlcFRpbWUiLGQtcCxoKSxfKCJTbmFwc2hvdFRvdGFsUHJvY2Vzc2luZ1RpbWUiLGQtbCxoKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbTWV0cmljc10gRmFpbGVkIHRvIHNlbmQgbWV0cmljcy4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fTtsZXQgXz0oZSxuLHIpPT57dC5wdWJsaXNoTWV0cmljKHtuYW1lOmUsZGF0YTp7bGF0ZW5jeTpuLG9wdGlvbmFsRGltZW5zaW9uczpyfX0pfTt0LmNvcmUuX2NhbGN1bGF0ZVNuYXBzaG90U2l6aW5nQnVja2V0PWZ1bmN0aW9uKGUpe2lmKGUmJmUuaGFzT3duUHJvcGVydHkoImNvbnRlbnRMZW5ndGgiKSl7Y29uc3QgdD1wYXJzZUludChlLmNvbnRlbnRMZW5ndGgpO2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKGQpKXtjb25zdFtuLHJdPWRbZV07aWYodD49biYmdDw9cilyZXR1cm4gZX19cmV0dXJuInVuZGVmaW5lZCJ9LEEucHJvdG90eXBlLl9maXJlQ29udGFjdFVwZGF0ZUV2ZW50cz1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcztuIT09ciYmdC5jb3JlLmdldENvbnRhY3RFdmVudEdyYXBoKCkuZ2V0QXNzb2NpYXRpb25zKHRoaXMsbixyKS5mb3JFYWNoKChmdW5jdGlvbihuKXtvLmJ1cy50cmlnZ2VyKG4sbmV3IHQuQ29udGFjdChlKSksby5idXMudHJpZ2dlcih0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZShuLGUpLG5ldyB0LkNvbnRhY3QoZSkpfSkpLG8uYnVzLnRyaWdnZXIodC5Db250YWN0RXZlbnRzLlJFRlJFU0gsbmV3IHQuQ29udGFjdChlKSksby5idXMudHJpZ2dlcih0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCxlKSxuZXcgdC5Db250YWN0KGUpKX0sQS5wcm90b3R5cGUuX3Vuc3ViQWxsQ29udGFjdEV2ZW50c0ZvckNvbnRhY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnZhbHVlcyh0LkNvbnRhY3RFdmVudHMpLmZvckVhY2goKGZ1bmN0aW9uKHIpe24uYnVzLmdldFN1YnNjcmlwdGlvbnModC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUocixlKSkubWFwKChmdW5jdGlvbihlKXtlLnVuc3Vic2NyaWJlKCl9KSl9KSl9LHQuY29yZS5vblZpZXdDb250YWN0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db250YWN0RXZlbnRzLlZJRVcsZSl9LHQuY29yZS52aWV3Q29udGFjdD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbnRhY3RFdmVudHMuVklFVyxkYXRhOntjb250YWN0SWQ6ZX19KX0sdC5jb3JlLm9uQWN0aXZhdGVDaGFubmVsV2l0aFZpZXdUeXBlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5DaGFubmVsVmlld0V2ZW50cy5BQ1RJVkFURV9DSEFOTkVMX1dJVEhfVklFV19UWVBFLGUpfSx0LmNvcmUuYWN0aXZhdGVDaGFubmVsV2l0aFZpZXdUeXBlPWZ1bmN0aW9uKGUsbixyLG8pe2NvbnN0IGk9e3ZpZXdUeXBlOmUsbWVkaWFUeXBlOm59O3ImJihpLnNvdXJjZT1yKSxvJiYoaS5jYXNlSWQ9byksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5DaGFubmVsVmlld0V2ZW50cy5BQ1RJVkFURV9DSEFOTkVMX1dJVEhfVklFV19UWVBFLGRhdGE6aX0pfSx0LmNvcmUudHJpZ2dlclRhc2tDcmVhdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnVwc3RyZWFtQnVzLnRyaWdnZXIodC5UYXNrRXZlbnRzLkNSRUFURUQsZSl9LHQuY29yZS5vbkFjY2Vzc0RlbmllZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDQ0VTU19ERU5JRUQsZSl9LHQuY29yZS5vbkF1dGhGYWlsPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQVVUSF9GQUlMLGUpfSx0LmNvcmUub25BdXRob3JpemVTdWNjZXNzPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQVVUSE9SSVpFX1NVQ0NFU1MsZSl9LHQuY29yZS5faGFuZGxlQXV0aG9yaXplU3VjY2Vzcz1mdW5jdGlvbigpe3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCwwKX0sdC5jb3JlLl9oYW5kbGVBdXRoRmFpbD1mdW5jdGlvbihlLG4scil7ciYmci5hdXRob3JpemU/dC5jb3JlLl9oYW5kbGVBdXRob3JpemVGYWlsKGUpOnQuY29yZS5faGFuZGxlQ1RJQXV0aEZhaWwobil9LHQuY29yZS5faGFuZGxlQXV0aG9yaXplRmFpbD1mdW5jdGlvbihlKXtsZXQgbj10LmNvcmUuX2dldEF1dGhSZXRyeUNvdW50KCk7aWYoIXQuY29yZS5hdXRob3JpemVUaW1lb3V0SWQpaWYobjx0LmNvcmUuTUFYX0FVVEhPUklaRV9SRVRSWV9DT1VOVF9GT1JfU0VTU0lPTil7dC5jb3JlLl9pbmNyZW1lbnRBdXRoUmV0cnlDb3VudCgpO2xldCByPUFXUy51dGlsLmNhbGN1bGF0ZVJldHJ5RGVsYXkobisxfHwwLHtiYXNlOjJlM30pO3QuY29yZS5hdXRob3JpemVUaW1lb3V0SWQ9c2V0VGltZW91dCgoKCk9Pnt0LmNvcmUuX3JlZGlyZWN0VG9Mb2dpbihlKX0pLHIpfWVsc2UgdC5nZXRMb2coKS53YXJuKCJXZSBoYXZlIGV4aGF1c3RlZCBvdXIgYXV0aG9yaXphdGlvbiByZXRyaWVzIGR1ZSB0byA0MDFzIGZyb20gdGhlIGF1dGhvcml6ZSBhcGkuIE5vIG1vcmUgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZCBpbiB0aGlzIHNlc3Npb24gdW50aWwgdGhlIGF1dGhvcml6ZSBhcGkgcmV0dXJucyAyMDAuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkFVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCl9LHQuY29yZS5fcmVkaXJlY3RUb0xvZ2luPWZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZT9sb2NhdGlvbi5hc3NpZ24oZSk6bG9jYXRpb24ucmVsb2FkKCl9LHQuY29yZS5faGFuZGxlQ1RJQXV0aEZhaWw9ZnVuY3Rpb24oZSl7aWYoIXQuY29yZS5jdGlUaW1lb3V0SWQpaWYodC5jb3JlLmN0aUF1dGhSZXRyeUNvdW50PHQuY29yZS5NQVhfQ1RJX0FVVEhfUkVUUllfQ09VTlQpe3QuY29yZS5jdGlBdXRoUmV0cnlDb3VudCsrO2xldCBuPUFXUy51dGlsLmNhbGN1bGF0ZVJldHJ5RGVsYXkodC5jb3JlLmN0aUF1dGhSZXRyeUNvdW50fHwwLHtiYXNlOjUwMH0pO3QuY29yZS5jdGlUaW1lb3V0SWQ9c2V0VGltZW91dCgoKCk9Pnt0LmNvcmUuYXV0aG9yaXplKGUpLnRoZW4odC5jb3JlLl90cmlnZ2VyQXV0aG9yaXplU3VjY2Vzcy5iaW5kKHQuY29yZSkpLmNhdGNoKHQuY29yZS5fdHJpZ2dlckF1dGhGYWlsLmJpbmQodC5jb3JlLHthdXRob3JpemU6ITB9KSksdC5jb3JlLmN0aVRpbWVvdXRJZD1udWxsfSksbil9ZWxzZSB0LmdldExvZygpLndhcm4oIldlIGhhdmUgZXhoYXVzdGVkIG91ciBhdXRob3JpemF0aW9uIHJldHJpZXMgZHVlIHRvIDQwMXMgZnJvbSB0aGUgQ1RJIHNlcnZpY2UuIE5vIG1vcmUgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZCB1bnRpbCB0aGUgcGFnZSBpcyByZWZyZXNoZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkNUSV9BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQpfSx0LmNvcmUuX3RyaWdnZXJBdXRob3JpemVTdWNjZXNzPWZ1bmN0aW9uKCl7dC5jb3JlLmdldFVwc3RyZWFtKCkudXBzdHJlYW1CdXMudHJpZ2dlcih0LkV2ZW50VHlwZS5BVVRIT1JJWkVfU1VDQ0VTUyl9LHQuY29yZS5fdHJpZ2dlckF1dGhGYWlsPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnVwc3RyZWFtQnVzLnRyaWdnZXIodC5FdmVudFR5cGUuQVVUSF9GQUlMLGUpfSx0LmNvcmUuX2dldEF1dGhSZXRyeUNvdW50PWZ1bmN0aW9uKCl7bGV0IGU9d2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5UKTtpZihudWxsIT09ZSl7aWYoaXNOYU4ocGFyc2VJbnQoZSkpKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBzZXNzaW9uIHN0b3JhZ2UgdmFsdWUgZm9yIGF1dGggcmV0cnkgY291bnQgd2FzIE5hTiIpO3JldHVybiBwYXJzZUludChlKX1yZXR1cm4gd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5ULDApLDB9LHQuY29yZS5faW5jcmVtZW50QXV0aFJldHJ5Q291bnQ9ZnVuY3Rpb24oKXt3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQsKHQuY29yZS5fZ2V0QXV0aFJldHJ5Q291bnQoKSsxKS50b1N0cmluZygpKX0sdC5jb3JlLm9uQXV0aG9yaXplUmV0cmllc0V4aGF1c3RlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVELGUpfSx0LmNvcmUub25DVElBdXRob3JpemVSZXRyaWVzRXhoYXVzdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DVElfQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVELGUpfSx0LmNvcmUub25Tb2Z0cGhvbmVTZXNzaW9uSW5pdD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29ubmVjdGlvbkV2ZW50cy5TRVNTSU9OX0lOSVQsZSl9LHQuY29yZS5vbkNvbmZpZ3VyZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5DT05GSUdVUkUsZSl9LHQuY29yZS5vbkluaXRpYWxpemVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5JTklULGUpfSx0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZT1mdW5jdGlvbihlLG4pe2lmKHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiY29udGFjdElkIiksIXQuY29udGFpbnModC52YWx1ZXModC5Db250YWN0RXZlbnRzKSxlKSl0aHJvdyBuZXcgdC5WYWx1ZUVycm9yKCIlcyBpcyBub3QgYSB2YWxpZCBjb250YWN0IGV2ZW50LiIsZSk7cmV0dXJuIHQuc3ByaW50ZigiJXM6OiVzIixlLG4pfSx0LmNvcmUuZ2V0RXZlbnRCdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmV2ZW50QnVzfSx0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUud2ViU29ja2V0UHJvdmlkZXJ9LHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXJ9LHQuY29yZS5nZXRMb2NhbFRpbWVzdGFtcD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBZ2VudERhdGEoKS5zbmFwc2hvdC5sb2NhbFRpbWVzdGFtcH0sdC5jb3JlLmdldFNrZXc9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QWdlbnREYXRhKCkuc25hcHNob3Quc2tld30sdC5jb3JlLmdldEFnZW50Um91dGluZ0V2ZW50R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmFnZW50Um91dGluZ0V2ZW50R3JhcGh9LHQuY29yZS5hZ2VudFJvdXRpbmdFdmVudEdyYXBoPShuZXcgdC5FdmVudEdyYXBoKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRTdGF0ZVR5cGUuUk9VVEFCTEUsdC5BZ2VudEV2ZW50cy5ST1VUQUJMRSkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkFnZW50U3RhdGVUeXBlLk5PVF9ST1VUQUJMRSx0LkFnZW50RXZlbnRzLk5PVF9ST1VUQUJMRSkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkFnZW50U3RhdGVUeXBlLk9GRkxJTkUsdC5BZ2VudEV2ZW50cy5PRkZMSU5FKSx0LmNvcmUuZ2V0QWdlbnRTdGF0ZUV2ZW50R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmFnZW50U3RhdGVFdmVudEdyYXBofSx0LmNvcmUuYWdlbnRTdGF0ZUV2ZW50R3JhcGg9KG5ldyB0LkV2ZW50R3JhcGgpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC52YWx1ZXModC5BZ2VudEVycm9yU3RhdGVzKSx0LkFnZW50RXZlbnRzLkVSUk9SKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRBdmFpbFN0YXRlcy5BRlRFUl9DQUxMX1dPUkssdC5BZ2VudEV2ZW50cy5BQ1cpLHQuY29yZS5nZXRDb250YWN0RXZlbnRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuY29udGFjdEV2ZW50R3JhcGh9LHQuY29yZS5jb250YWN0RXZlbnRHcmFwaD0obmV3IHQuRXZlbnRHcmFwaCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuSU5DT01JTkcsdC5Db250YWN0RXZlbnRzLklOQ09NSU5HKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5QRU5ESU5HLHQuQ29udGFjdEV2ZW50cy5QRU5ESU5HKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29udGFjdEV2ZW50cy5DT05ORUNUSU5HKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNURUQsdC5Db250YWN0RXZlbnRzLkNPTk5FQ1RFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db250YWN0U3RhdGVUeXBlLkVSUk9SLHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5JTkNPTUlORyx0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuRU5ERUQsdC5Db250YWN0RXZlbnRzLkFDVykuYXNzb2ModC52YWx1ZXModC5DT05UQUNUX0FDVElWRV9TVEFURVMpLHQudmFsdWVzKHQucmVsYXRpdmVDb21wbGVtZW50KHQuQ09OVEFDVF9BQ1RJVkVfU1RBVEVTLHQuQ29udGFjdFN0YXRlVHlwZSkpLHQuQ29udGFjdEV2ZW50cy5FTkRFRCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IsdC5Db250YWN0RXZlbnRzLkVSUk9SKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbnRhY3RTdGF0ZVR5cGUuTUlTU0VELHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5JTkNPTUlORyx0LkNvbnRhY3RTdGF0ZVR5cGUuTUlTU0VELHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5SRUpFQ1RFRCx0LkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuSU5DT01JTkcsdC5Db250YWN0U3RhdGVUeXBlLlJFSkVDVEVELHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLHQuY29yZS5nZXRDbGllbnQ9ZnVuY3Rpb24oKXtpZighdC5jb3JlLmNsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBjb3JlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLmNsaWVudH0sdC5jb3JlLmNsaWVudD1udWxsLHQuY29yZS5nZXRBcGlQcm94eUNsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUuYXBpUHJveHlDbGllbnQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGNvbm5lY3QgYXBpUHJveHkgQ2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLmFwaVByb3h5Q2xpZW50fSx0LmNvcmUuYXBpUHJveHlDbGllbnQ9bnVsbCx0LmNvcmUuZ2V0QWdlbnRBcHBDbGllbnQ9ZnVuY3Rpb24oKXtpZighdC5jb3JlLmFnZW50QXBwQ2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IEFnZW50QXBwIENsaWVudCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIHQuY29yZS5hZ2VudEFwcENsaWVudH0sdC5jb3JlLmFnZW50QXBwQ2xpZW50PW51bGwsdC5jb3JlLmdldFRhc2tUZW1wbGF0ZXNDbGllbnQ9ZnVuY3Rpb24oKXtpZighdC5jb3JlLnRhc2tUZW1wbGF0ZXNDbGllbnQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGNvbm5lY3QgVGFza1RlbXBsYXRlcyBDbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudH0sdC5jb3JlLnRhc2tUZW1wbGF0ZXNDbGllbnQ9bnVsbCx0LmNvcmUuZ2V0TWFzdGVyQ2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS5tYXN0ZXJDbGllbnQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGNvbm5lY3QgbWFzdGVyIGNsaWVudCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIHQuY29yZS5tYXN0ZXJDbGllbnR9LHQuY29yZS5tYXN0ZXJDbGllbnQ9bnVsbCx0LmNvcmUuZ2V0U29mdHBob25lTWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuc29mdHBob25lTWFuYWdlcn0sdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bnVsbCx0LmNvcmUuZ2V0Tm90aWZpY2F0aW9uTWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcnx8KHQuY29yZS5ub3RpZmljYXRpb25NYW5hZ2VyPW5ldyB0Lk5vdGlmaWNhdGlvbk1hbmFnZXIpLHQuY29yZS5ub3RpZmljYXRpb25NYW5hZ2VyfSx0LmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcj1udWxsLHQuY29yZS5nZXRQb3B1cE1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLnBvcHVwTWFuYWdlcn0sdC5jb3JlLnBvcHVwTWFuYWdlcj1uZXcgdC5Qb3B1cE1hbmFnZXIsdC5jb3JlLmdldFVwc3RyZWFtPWZ1bmN0aW9uKCl7aWYoIXQuY29yZS51cHN0cmVhbSl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGVyZSBpcyBubyB1cHN0cmVhbSBjb25kdWl0ISIpO3JldHVybiB0LmNvcmUudXBzdHJlYW19LHQuY29yZS51cHN0cmVhbT1udWxsLHQuY29yZS5BZ2VudERhdGFQcm92aWRlcj1BfSgpfSw1OTI6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dDt2YXIgbj0iPDxhbGw+PiIscj10Lm1ha2VFbnVtKFsiYWNrbm93bGVkZ2UiLCJhY2tfdGltZW91dCIsImluaXQiLCJhcGlfcmVxdWVzdCIsImFwaV9yZXNwb25zZSIsImF1dGhfZmFpbCIsImFjY2Vzc19kZW5pZWQiLCJjbG9zZSIsImNvbmZpZ3VyZSIsImxvZyIsIm1hc3Rlcl9yZXF1ZXN0IiwibWFzdGVyX3Jlc3BvbnNlIiwic3luY2hyb25pemUiLCJ0ZXJtaW5hdGUiLCJ0ZXJtaW5hdGVkIiwic2VuZF9sb2dzIiwicmVsb2FkX2FnZW50X2NvbmZpZ3VyYXRpb24iLCJicm9hZGNhc3QiLCJhcGlfbWV0cmljIiwiY2xpZW50X21ldHJpYyIsInNvZnRwaG9uZV9zdGF0cyIsInNvZnRwaG9uZV9yZXBvcnQiLCJjbGllbnRfc2lkZV9sb2dzIiwic2VydmVyX2JvdW5kX2ludGVybmFsX2xvZyIsIm11dGUiLCJpZnJhbWVfc3R5bGUiLCJpZnJhbWVfcmV0cmllc19leGhhdXN0ZWQiLCJ1cGRhdGVfY29ubmVjdGVkX2NjcHMiLCJvdXRlcl9jb250ZXh0X2luZm8iLCJtZWRpYV9kZXZpY2VfcmVxdWVzdCIsIm1lZGlhX2RldmljZV9yZXNwb25zZSIsInRhYl9pZCIsImF1dGhvcml6ZV9zdWNjZXNzIiwiYXV0aG9yaXplX3JldHJpZXNfZXhoYXVzdGVkIiwiY3RpX2F1dGhvcml6ZV9yZXRyaWVzX2V4aGF1c3RlZCIsImNsaWNrX3N0cmVhbV9kYXRhIiwic2V0X3F1aWNrX2dldF9hZ2VudF9zbmFwc2hvdF9mbGFnIiwiYXBpX3Byb3h5X3JlcXVlc3QiLCJhcGlfcHJveHlfcmVzcG9uc2UiXSksbz10Lm1ha2VOYW1lc3BhY2VkRW51bSgiY29ubmVjdCIsWyJsb2dpblBvcHVwIiwic2VuZExvZ3MiLCJzb2Z0cGhvbmUiLCJyaW5ndG9uZSIsIm1ldHJpY3MiLCJmYWlsb3ZlciJdKSxpPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJhZ2VudCIsWyJpbml0IiwidXBkYXRlIiwicmVmcmVzaCIsInJvdXRhYmxlIiwibm90X3JvdXRhYmxlIiwicGVuZGluZyIsImNvbnRhY3RfcGVuZGluZyIsIm9mZmxpbmUiLCJlcnJvciIsInNvZnRwaG9uZV9lcnJvciIsIndlYnNvY2tldF9jb25uZWN0aW9uX2xvc3QiLCJ3ZWJzb2NrZXRfY29ubmVjdGlvbl9nYWluZWQiLCJzdGF0ZV9jaGFuZ2UiLCJhY3ciLCJtdXRlX3RvZ2dsZSIsImxvY2FsX21lZGlhX3N0cmVhbV9jcmVhdGVkIiwiZW5xdWV1ZWRfbmV4dF9zdGF0ZSJdKSxzPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJ3ZWJTb2NrZXQiLFsiaW5pdF9mYWlsdXJlIiwiY29ubmVjdGlvbl9vcGVuIiwiY29ubmVjdGlvbl9jbG9zZSIsImNvbm5lY3Rpb25fZXJyb3IiLCJjb25uZWN0aW9uX2dhaW4iLCJjb25uZWN0aW9uX2xvc3QiLCJzdWJzY3JpcHRpb25fdXBkYXRlIiwic3Vic2NyaXB0aW9uX2ZhaWx1cmUiLCJhbGxfbWVzc2FnZSIsInNlbmQiLCJzdWJzY3JpYmUiXSksYT10Lm1ha2VOYW1lc3BhY2VkRW51bSgiY29udGFjdCIsWyJpbml0IiwicmVmcmVzaCIsImRlc3Ryb3llZCIsImluY29taW5nIiwicGVuZGluZyIsImNvbm5lY3RpbmciLCJjb25uZWN0ZWQiLCJtaXNzZWQiLCJhY3ciLCJ2aWV3IiwiZW5kZWQiLCJlcnJvciIsImFjY2VwdGVkIl0pLGM9dC5tYWtlTmFtZXNwYWNlZEVudW0oInRhc2tMaXN0IixbImFjdGl2YXRlX2NoYW5uZWxfd2l0aF92aWV3X3R5cGUiXSksdT10Lm1ha2VOYW1lc3BhY2VkRW51bSgidGFzayIsWyJjcmVhdGVkIl0pLGw9dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbm5lY3Rpb24iLFsic2Vzc2lvbl9pbml0IiwicmVhZHlfdG9fc3RhcnRfc2Vzc2lvbiJdKSxwPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb25maWd1cmF0aW9uIixbImNvbmZpZ3VyZSIsInNldF9zcGVha2VyX2RldmljZSIsInNldF9taWNyb3Bob25lX2RldmljZSIsInNldF9yaW5nZXJfZGV2aWNlIiwic3BlYWtlcl9kZXZpY2VfY2hhbmdlZCIsIm1pY3JvcGhvbmVfZGV2aWNlX2NoYW5nZWQiLCJyaW5nZXJfZGV2aWNlX2NoYW5nZWQiLCJjYW1lcmFfZGV2aWNlX2NoYW5nZWQiLCJiYWNrZ3JvdW5kX2JsdXJfY2hhbmdlZCJdKSxkPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJkaXNhc3RlclJlY292ZXJ5IixbInN1cHByZXNzIiwiZm9yY2Vfb2ZmbGluZSIsInNldF9vZmZsaW5lIiwiaW5pdF9kaXNhc3Rlcl9yZWNvdmVyeSIsImZhaWxvdmVyIiwiZmFpbG92ZXJfcGVuZGluZyIsImluaXRfZHJfcG9sbGluZyJdKSxoPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJ2b2ljZUlkIixbInVwZGF0ZV9kb21haW5faWQiXSksZj1mdW5jdGlvbigpe307Zi5jcmVhdGVSZXF1ZXN0PWZ1bmN0aW9uKGUsbixyKXtyZXR1cm57ZXZlbnQ6ZSxyZXF1ZXN0SWQ6dC5yYW5kb21JZCgpLG1ldGhvZDpuLHBhcmFtczpyfX0sZi5jcmVhdGVSZXNwb25zZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm57ZXZlbnQ6ZSxyZXF1ZXN0SWQ6dC5yZXF1ZXN0SWQsZGF0YTpuLGVycjpyfHxudWxsfX07dmFyIGc9ZnVuY3Rpb24oZSxuLHIpe3RoaXMuc3ViTWFwPWUsdGhpcy5pZD10LnJhbmRvbUlkKCksdGhpcy5ldmVudE5hbWU9bix0aGlzLmY9cn07Zy5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXt0aGlzLnN1Yk1hcC51bnN1YnNjcmliZSh0aGlzLmV2ZW50TmFtZSx0aGlzLmlkKX07dmFyIG09ZnVuY3Rpb24oKXt0aGlzLnN1YklkTWFwPXt9LHRoaXMuc3ViRXZlbnROYW1lTWFwPXt9fTttLnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgZyh0aGlzLGUsdCk7dGhpcy5zdWJJZE1hcFtuLmlkXT1uO3ZhciByPXRoaXMuc3ViRXZlbnROYW1lTWFwW2VdfHxbXTtyZXR1cm4gci5wdXNoKG4pLHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdPXIsbn0sbS5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oZSxuKXt0LmNvbnRhaW5zKHRoaXMuc3ViRXZlbnROYW1lTWFwLGUpJiYodGhpcy5zdWJFdmVudE5hbWVNYXBbZV09dGhpcy5zdWJFdmVudE5hbWVNYXBbZV0uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZCE9PW59KSksdGhpcy5zdWJFdmVudE5hbWVNYXBbZV0ubGVuZ3RoPDEmJmRlbGV0ZSB0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXSksdC5jb250YWlucyh0aGlzLnN1YklkTWFwLG4pJiZkZWxldGUgdGhpcy5zdWJJZE1hcFtuXX0sbS5wcm90b3R5cGUuZ2V0QWxsU3Vic2NyaXB0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0LnZhbHVlcyh0aGlzLnN1YkV2ZW50TmFtZU1hcCkucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdCh0KX0pLFtdKX0sbS5wcm90b3R5cGUuZ2V0U3Vic2NyaXB0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdWJFdmVudE5hbWVNYXBbZV18fFtdfTt2YXIgdj1mdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0aGlzLnN1Yk1hcD1uZXcgbSx0aGlzLmxvZ0V2ZW50cz10LmxvZ0V2ZW50c3x8ITF9O3YucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlLG4pe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuc3ViTWFwLnN1YnNjcmliZShlLG4pfSx2LnByb3RvdHlwZS5zdWJzY3JpYmVBbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihlKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLnN1Yk1hcC5zdWJzY3JpYmUobixlKX0sdi5wcm90b3R5cGUuZ2V0U3Vic2NyaXB0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdWJNYXAuZ2V0U3Vic2NyaXB0aW9ucyhlKX0sdi5wcm90b3R5cGUudHJpZ2dlcj1mdW5jdGlvbihlLHIpe3QuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKTt2YXIgbz10aGlzLGk9dGhpcy5zdWJNYXAuZ2V0U3Vic2NyaXB0aW9ucyhuKSxzPXRoaXMuc3ViTWFwLmdldFN1YnNjcmlwdGlvbnMoZSk7dGhpcy5sb2dFdmVudHMmJmUhPT10LkV2ZW50VHlwZS5MT0cmJmUhPT10LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0UmJmUhPT10LkV2ZW50VHlwZS5BUElfTUVUUklDJiZlIT09dC5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRyYmdC5nZXRMb2coKS50cmFjZSgiUHVibGlzaGluZyBldmVudDogJXMiLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5zdGFydHNXaXRoKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCkmJnImJnIuY29udGFjdElkJiYhKHIgaW5zdGFuY2VvZiB0LkNvbnRhY3QpJiYocj1uZXcgdC5Db250YWN0KHIuY29udGFjdElkKSksaS5jb25jYXQocykuZm9yRWFjaCgoZnVuY3Rpb24obil7dHJ5e24uZihyfHxudWxsLGUsbyl9Y2F0Y2gobil7dC5nZXRMb2coKS5lcnJvcigiJyVzJyBldmVudCBoYW5kbGVyIGZhaWxlZC4iLGUpLndpdGhFeGNlcHRpb24obikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSl9LHYucHJvdG90eXBlLmJyaWRnZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZS50cmlnZ2VyKG4sdCl9fSx2LnByb3RvdHlwZS51bnN1YnNjcmliZUFsbD1mdW5jdGlvbigpe3RoaXMuc3ViTWFwLmdldEFsbFN1YnNjcmlwdGlvbnMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnVuc3Vic2NyaWJlKCl9KSl9LHQuRXZlbnRCdXM9dix0LkV2ZW50RmFjdG9yeT1mLHQuRXZlbnRUeXBlPXIsdC5BZ2VudEV2ZW50cz1pLHQuQ29uZmlndXJhdGlvbkV2ZW50cz1wLHQuQ29ubmVjdGlvbkV2ZW50cz1sLHQuQ29ubm5lY3Rpb25FdmVudHM9bCx0LkNvbnRhY3RFdmVudHM9YSx0LkNoYW5uZWxWaWV3RXZlbnRzPWMsdC5UYXNrRXZlbnRzPXUsdC5Wb2ljZUlkRXZlbnRzPWgsdC5XZWJTb2NrZXRFdmVudHM9cyx0Lk1hc3RlclRvcGljcz1vLHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cz1kfSgpfSwyODY6KCk9PnshZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gbihyKXtpZih0W3JdKXJldHVybiB0W3JdLmV4cG9ydHM7dmFyIG89dFtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsbiksby5sPSEwLG8uZXhwb3J0c31uLm09ZSxuLmM9dCxuLmQ9ZnVuY3Rpb24oZSx0LHIpe24ubyhlLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGdldDpyfSl9LG4ucj1mdW5jdGlvbihlKXsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSxuLnQ9ZnVuY3Rpb24oZSx0KXtpZigxJnQmJihlPW4oZSkpLDgmdClyZXR1cm4gZTtpZig0JnQmJiJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciByPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZ0JiYic3RyaW5nIiE9dHlwZW9mIGUpZm9yKHZhciBvIGluIGUpbi5kKHIsbyxmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0uYmluZChudWxsLG8pKTtyZXR1cm4gcn0sbi5uPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiBuLmQodCwiYSIsdCksdH0sbi5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSxuLnA9IiIsbihuLnM9Mil9KFtmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMSksbz0iREVCVUciLGk9IkFNWl9XRUJfU09DS0VUX01BTkFHRVI6IixzPSJOZXR3b3JrIG9mZmxpbmUiLGE9Ik5ldHdvcmsgb25saW5lLCBjb25uZWN0aW5nIHRvIFdlYlNvY2tldCBzZXJ2ZXIiLGM9Ik5ldHdvcmsgb2ZmbGluZSwgaWdub3JpbmcgdGhpcyBnZXRXZWJTb2NrZXRDb25uQ29uZmlnIHJlcXVlc3QiLHU9IkhlYXJ0YmVhdCByZXNwb25zZSBub3QgcmVjZWl2ZWQiLGw9IkZhaWxlZCB0byBzZW5kIGhlYXJ0YmVhdCBzaW5jZSBXZWJTb2NrZXQgaXMgbm90IG9wZW4iLHA9IldlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkISIsZD0iV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgY2xvc2VkIixoPSJXZWJTb2NrZXRNYW5hZ2VyIEVycm9yLCBlcnJvcl9ldmVudDogIixmPSJTY2hlZHVsaW5nIFdlYlNvY2tldCByZWluaXRpYWxpemF0aW9uLCBhZnRlciBkZWxheSAiLGc9IldlYlNvY2tldCBVUkwgY2Fubm90IGJlIHVzZWQgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24iLG09IldlYlNvY2tldCBJbml0aWFsaXphdGlvbiBmYWlsZWQgLSBUZXJtaW5hdGluZyBhbmQgY2xlYW5pbmcgc3Vic2NyaXB0aW9ucyIsdj0iRmV0Y2hpbmcgbmV3IFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLHk9IlN1Y2Nlc3NmdWxseSBmZXRjaGVkIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLEU9IkZhaWxlZCB0byBmZXRjaCB3ZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixTPSJSZXRyeWluZyBmZXRjaGluZyBuZXcgV2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIsYj0iSW5pdGlhbGl6aW5nIFdlYnNvY2tldCBNYW5hZ2VyIixDPSJXZWJTb2NrZXRNYW5hZ2VyIE1lc3NhZ2UgRXJyb3IiLFQ9Ik1lc3NhZ2UgcmVjZWl2ZWQgZm9yIHRvcGljICIsST0iSW52YWxpZCBpbmNvbWluZyBtZXNzYWdlIixBPSJhd3Mvc3Vic2NyaWJlIixfPSJhd3MvaGVhcnRiZWF0Iix3PSJkaXNjb25uZWN0ZWQiO2Z1bmN0aW9uIFIoZSl7cmV0dXJuKFI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX12YXIgaz17YXNzZXJ0VHJ1ZTpmdW5jdGlvbihlLHQpe2lmKCFlKXRocm93IG5ldyBFcnJvcih0KX0sYXNzZXJ0Tm90TnVsbDpmdW5jdGlvbihlLHQpe3JldHVybiBrLmFzc2VydFRydWUobnVsbCE9PWUmJnZvaWQgMCE9PVIoZSksT2JqZWN0KHIuc3ByaW50ZikoIiVzIG11c3QgYmUgcHJvdmlkZWQiLHR8fCJBIHZhbHVlIikpLGV9LGlzTm9uRW1wdHlTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiZlLmxlbmd0aD4wfSxhc3NlcnRJc0xpc3Q6ZnVuY3Rpb24oZSx0KXtpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhbiBhcnJheSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuY29uc3RydWN0b3ImJmUuY2FsbCYmZS5hcHBseSl9LGlzT2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiEoIm9iamVjdCIhPT1SKGUpfHxudWxsPT09ZSl9LGlzU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfX0sTD1uZXcgUmVnRXhwKCJeKHdzczovLylcXHcqIik7ay52YWxpZFdTVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBMLnRlc3QoZSl9LGsuZ2V0U3Vic2NyaXB0aW9uUmVzcG9uc2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybnt0b3BpYzplLGNvbnRlbnQ6e3N0YXR1czp0PyJzdWNjZXNzIjoiZmFpbHVyZSIsdG9waWNzOm59fX0say5hc3NlcnRJc09iamVjdD1mdW5jdGlvbihlLHQpe2lmKCFrLmlzT2JqZWN0KGUpKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IGFuIG9iamVjdCEiKX0say5hZGRKaXR0ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjE7dD1NYXRoLm1pbih0LDEpO3ZhciBuPU1hdGgucmFuZG9tKCk+LjU/MTotMTtyZXR1cm4gTWF0aC5mbG9vcihlK24qZSpNYXRoLnJhbmRvbSgpKnQpfSxrLmlzTmV0d29ya09ubGluZT1mdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3Iub25MaW5lfSxrLmlzTmV0d29ya0ZhaWx1cmU9ZnVuY3Rpb24oZSl7cmV0dXJuISghZS5fZGVidWd8fCFlLl9kZWJ1Zy50eXBlKSYmIk5ldHdvcmtpbmdFcnJvciI9PT1lLl9kZWJ1Zy50eXBlfTt2YXIgTj1rO2Z1bmN0aW9uIE8oZSl7cmV0dXJuKE89T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKX0pKGUpfWZ1bmN0aW9uIEQoZSx0KXtyZXR1cm4oRD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX19wcm90b19fPXQsZX0pKGUsdCl9ZnVuY3Rpb24gUChlKXtyZXR1cm4oUD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0pKGUpfWZ1bmN0aW9uIHgoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBNKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19ZnVuY3Rpb24gVShlLHQsbil7cmV0dXJuIHQmJk0oZS5wcm90b3R5cGUsdCksbiYmTShlLG4pLGV9dmFyIEY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7eCh0aGlzLGUpfXJldHVybiBVKGUsW3trZXk6ImRlYnVnIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJpbmZvIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJlcnJvciIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiYWR2YW5jZWRMb2ciLHZhbHVlOmZ1bmN0aW9uKGUpe319XSksZX0oKSxxPWksQj17REVCVUc6MTAsSU5GTzoyMCxXQVJOOjMwLEVSUk9SOjQwLEFEVkFOQ0VEX0xPRzo1MH0saj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt4KHRoaXMsZSksdGhpcy51cGRhdGVMb2dnZXJDb25maWcoKSx0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyPUcoKX1yZXR1cm4gVShlLFt7a2V5OiJ3cml0ZVRvQ2xpZW50TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuaGFzQ2xpZW50TG9nZ2VyKCkpc3dpdGNoKGUpe2Nhc2UgQi5ERUJVRzpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmRlYnVnKHQpfHx0O2Nhc2UgQi5JTkZPOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIuaW5mbyh0KXx8dDtjYXNlIEIuV0FSTjpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLndhcm4odCl8fHQ7Y2FzZSBCLkVSUk9SOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIuZXJyb3IodCl8fHQ7Y2FzZSBCLkFEVkFOQ0VEX0xPRzpyZXR1cm4gdGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI/dGhpcy5fY2xpZW50TG9nZ2VyW3RoaXMuX2FkdmFuY2VkTG9nV3JpdGVyXSh0KXx8dDoiIn19fSx7a2V5OiJpc0xldmVsRW5hYmxlZCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXRoaXMuX2xldmVsfX0se2tleToiaGFzQ2xpZW50TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5fY2xpZW50TG9nZ2VyfX0se2tleToiZ2V0TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnByZWZpeHx8cTtyZXR1cm4gdGhpcy5fbG9nc0Rlc3RpbmF0aW9uPT09bz90aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyOm5ldyBXKHQpfX0se2tleToidXBkYXRlTG9nZ2VyQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0aGlzLl9sZXZlbD10LmxldmVsfHxCLklORk8sdGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI9Indhcm4iLHQuYWR2YW5jZWRMb2dXcml0ZXImJih0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcj10LmFkdmFuY2VkTG9nV3JpdGVyKSx0LmN1c3RvbWl6ZWRMb2dnZXImJiJvYmplY3QiPT09UCh0LmN1c3RvbWl6ZWRMb2dnZXIpJiYodGhpcy51c2VDbGllbnRMb2dnZXI9ITApLHRoaXMuX2NsaWVudExvZ2dlcj10LmxvZ2dlcnx8dGhpcy5zZWxlY3RMb2dnZXIodCksdGhpcy5fbG9nc0Rlc3RpbmF0aW9uPSJOVUxMIix0LmRlYnVnJiYodGhpcy5fbG9nc0Rlc3RpbmF0aW9uPW8pLHQubG9nZ2VyJiYodGhpcy5fbG9nc0Rlc3RpbmF0aW9uPSJDTElFTlRfTE9HR0VSIil9fSx7a2V5OiJzZWxlY3RMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmN1c3RvbWl6ZWRMb2dnZXImJiJvYmplY3QiPT09UChlLmN1c3RvbWl6ZWRMb2dnZXIpP2UuY3VzdG9taXplZExvZ2dlcjplLnVzZURlZmF1bHRMb2dnZXI/KHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXI9RygpLHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXIpOm51bGx9fV0pLGV9KCksVj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt4KHRoaXMsZSl9cmV0dXJuIFUoZSxbe2tleToiZGVidWciLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbigpe319XSksZX0oKSxXPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7dmFyIG47cmV0dXJuIHgodGhpcyx0KSwobj1mdW5jdGlvbihlLHQpe3JldHVybiF0fHwib2JqZWN0IiE9PVAodCkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2Z1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX0oZSk6dH0odGhpcyxPKHQpLmNhbGwodGhpcykpKS5wcmVmaXg9ZXx8cSxufXJldHVybiBmdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiZEKGUsdCl9KHQsViksVSh0LFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuREVCVUcsdCl9fSx7a2V5OiJpbmZvIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5JTkZPLHQpfX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuV0FSTix0KX19LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5FUlJPUix0KX19LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5BRFZBTkNFRF9MT0csdCl9fSx7a2V5OiJfc2hvdWxkTG9nIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gSC5oYXNDbGllbnRMb2dnZXIoKSYmSC5pc0xldmVsRW5hYmxlZChlKX19LHtrZXk6Il93cml0ZVRvQ2xpZW50TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBILndyaXRlVG9DbGllbnRMb2dnZXIoZSx0KX19LHtrZXk6Il9sb2ciLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5fc2hvdWxkTG9nKGUpKXt2YXIgbj1ILnVzZUNsaWVudExvZ2dlcj90OnRoaXMuX2NvbnZlcnRUb1NpbmdsZVN0YXRlbWVudCh0LGUpO3JldHVybiB0aGlzLl93cml0ZVRvQ2xpZW50TG9nZ2VyKGUsbil9fX0se2tleToiX2NvbnZlcnRUb1NpbmdsZVN0YXRlbWVudCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgRGF0ZShEYXRlLm5vdygpKS50b0lTT1N0cmluZygpLHI9dGhpcy5fZ2V0TG9nTGV2ZWxCeVZhbHVlKHQpLG89IlsiLmNvbmNhdChuLCJdWyIpLmNvbmNhdChyLCJdIik7dGhpcy5wcmVmaXgmJihvKz10aGlzLnByZWZpeCsiICIpLHRoaXMub3B0aW9ucyYmKHRoaXMub3B0aW9ucy5wcmVmaXg/bys9IiAiK3RoaXMub3B0aW9ucy5wcmVmaXgrIjoiOm8rPSIiLHRoaXMub3B0aW9ucy5sb2dNZXRhRGF0YT9vKz0iIE1ldGEgZGF0YTogIitKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMubG9nTWV0YURhdGEpOm8rPSIiKTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIHM9ZVtpXTtvKz10aGlzLl9jb252ZXJ0VG9TdHJpbmcocykrIiAifXJldHVybiBvfX0se2tleToiX2dldExvZ0xldmVsQnlWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UgMTA6cmV0dXJuIkRFQlVHIjtjYXNlIDIwOnJldHVybiJJTkZPIjtjYXNlIDMwOnJldHVybiJXQVJOIjtjYXNlIDQwOnJldHVybiJFUlJPUiI7Y2FzZSA1MDpyZXR1cm4iQURWQU5DRURfTE9HIn19fSx7a2V5OiJfY29udmVydFRvU3RyaW5nIix2YWx1ZTpmdW5jdGlvbihlKXt0cnl7aWYoIWUpcmV0dXJuIiI7aWYoTi5pc1N0cmluZyhlKSlyZXR1cm4gZTtpZihOLmlzT2JqZWN0KGUpJiZOLmlzRnVuY3Rpb24oZS50b1N0cmluZykpe3ZhciB0PWUudG9TdHJpbmcoKTtpZigiW29iamVjdCBPYmplY3RdIiE9PXQpcmV0dXJuIHR9cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfWNhdGNoKHQpe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciB3aGlsZSBjb252ZXJ0aW5nIGFyZ3VtZW50IHRvIHN0cmluZyIsZSx0KSwiIn19fV0pLHR9KCksRz1mdW5jdGlvbigpe3ZhciBlPW5ldyBWO3JldHVybiBlLmRlYnVnPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUuZGVidWcuYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZS5pbmZvPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUuaW5mby5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlLndhcm49ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS53YXJuLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGUuZXJyb3I9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS5lcnJvci5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlfSxIPW5ldyBqO2Z1bmN0aW9uIHooZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX12YXIgSz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjJlMzshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKSx0aGlzLm51bUF0dGVtcHRzPTAsdGhpcy5leGVjdXRvcj10LHRoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9uPSExLHRoaXMuZGVmYXVsdFJldHJ5PW59dmFyIHQsbjtyZXR1cm4gdD1lLChuPVt7a2V5OiJyZXRyeSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9ufHwodGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb249ITAsc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLl9leGVjdXRlKCl9KSx0aGlzLl9nZXREZWxheSgpKSl9fSx7a2V5OiJfZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbj0hMSx0aGlzLmV4ZWN1dG9yKCksdGhpcy5udW1BdHRlbXB0cysrfX0se2tleToiY29ubmVjdGVkIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMubnVtQXR0ZW1wdHM9MH19LHtrZXk6Il9nZXREZWxheSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1NYXRoLnBvdygyLHRoaXMubnVtQXR0ZW1wdHMpKnRoaXMuZGVmYXVsdFJldHJ5O3JldHVybiBlPD0zZTQ/ZTozZTR9fSx7a2V5OiJnZXRJc0Nvbm5lY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5udW1BdHRlbXB0c319XSkmJnoodC5wcm90b3R5cGUsbiksZX0oKTtuLmQodCwiYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFl9KSk7dmFyIFg9ZnVuY3Rpb24oKXt2YXIgZT1ILmdldExvZ2dlcih7cHJlZml4Oml9KSx0PU4uaXNOZXR3b3JrT25saW5lKCksbj17cHJpbWFyeTpudWxsLHNlY29uZGFyeTpudWxsfSxyPXtyZWNvbm5lY3RXZWJTb2NrZXQ6ITAsd2Vic29ja2V0SW5pdEZhaWxlZDohMSxleHBvbmVudGlhbEJhY2tPZmZUaW1lOjFlMyxleHBvbmVudGlhbFRpbWVvdXRIYW5kbGU6bnVsbCxsaWZlVGltZVRpbWVvdXRIYW5kbGU6bnVsbCx3ZWJTb2NrZXRJbml0Q2hlY2tlclRpbWVvdXRJZDpudWxsLGNvbm5TdGF0ZTpudWxsfSxvPXtjb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudDowLGNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lOm51bGwsbm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA6bnVsbH0sUj17cGVuZGluZ1Jlc3BvbnNlOiExLGludGVydmFsSGFuZGxlOm51bGx9LGs9e2luaXRGYWlsdXJlOm5ldyBTZXQsZ2V0V2ViU29ja2V0VHJhbnNwb3J0Om51bGwsc3Vic2NyaXB0aW9uVXBkYXRlOm5ldyBTZXQsc3Vic2NyaXB0aW9uRmFpbHVyZTpuZXcgU2V0LHRvcGljOm5ldyBNYXAsYWxsTWVzc2FnZTpuZXcgU2V0LGNvbm5lY3Rpb25HYWluOm5ldyBTZXQsY29ubmVjdGlvbkxvc3Q6bmV3IFNldCxjb25uZWN0aW9uT3BlbjpuZXcgU2V0LGNvbm5lY3Rpb25DbG9zZTpuZXcgU2V0fSxMPXtjb25uQ29uZmlnOm51bGwscHJvbWlzZUhhbmRsZTpudWxsLHByb21pc2VDb21wbGV0ZWQ6ITB9LE89e3N1YnNjcmliZWQ6bmV3IFNldCxwZW5kaW5nOm5ldyBTZXQsc3Vic2NyaXB0aW9uSGlzdG9yeTpuZXcgU2V0fSxEPXtyZXNwb25zZUNoZWNrSW50ZXJ2YWxJZDpudWxsLHJlcXVlc3RDb21wbGV0ZWQ6ITAscmVTdWJzY3JpYmVJbnRlcnZhbElkOm51bGwsY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0czowLGNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q6MH0sUD1uZXcgSygoZnVuY3Rpb24oKXtzZSgpfSkpLHg9bmV3IFNldChbQSwiYXdzL3Vuc3Vic2NyaWJlIixfXSksTT1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtpZih0IT09Ti5pc05ldHdvcmtPbmxpbmUoKSl7aWYoISh0PU4uaXNOZXR3b3JrT25saW5lKCkpKXJldHVybiBlLmFkdmFuY2VkTG9nKHMpLHZvaWQgdWUoZS5pbmZvKHMpKTt2YXIgbj1XKCk7dCYmKCFufHxCKG4sV2ViU29ja2V0LkNMT1NJTkcpfHxCKG4sV2ViU29ja2V0LkNMT1NFRCkpJiYoZS5hZHZhbmNlZExvZyhhKSx1ZShlLmluZm8oYSkpLHNlKCkpfX0pLDI1MCksVT1mdW5jdGlvbih0LG4pe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dHJ5e3Qobil9Y2F0Y2godCl7dWUoZS5lcnJvcigiRXJyb3IgZXhlY3V0aW5nIGNhbGxiYWNrIix0KSl9fSkpfSxGPWZ1bmN0aW9uKGUpe2lmKG51bGw9PT1lKXJldHVybiJOVUxMIjtzd2l0Y2goZS5yZWFkeVN0YXRlKXtjYXNlIFdlYlNvY2tldC5DT05ORUNUSU5HOnJldHVybiJDT05ORUNUSU5HIjtjYXNlIFdlYlNvY2tldC5PUEVOOnJldHVybiJPUEVOIjtjYXNlIFdlYlNvY2tldC5DTE9TSU5HOnJldHVybiJDTE9TSU5HIjtjYXNlIFdlYlNvY2tldC5DTE9TRUQ6cmV0dXJuIkNMT1NFRCI7ZGVmYXVsdDpyZXR1cm4iVU5ERUZJTkVEIn19LHE9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7dWUoZS5kZWJ1ZygiWyIrdCsiXSBQcmltYXJ5IFdlYlNvY2tldDogIitGKG4ucHJpbWFyeSkrIiB8IFNlY29uZGFyeSBXZWJTb2NrZXQ6ICIrRihuLnNlY29uZGFyeSkpKX0sQj1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLnJlYWR5U3RhdGU9PT10fSxqPWZ1bmN0aW9uKGUpe3JldHVybiBCKGUsV2ViU29ja2V0Lk9QRU4pfSxWPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8dm9pZCAwPT09ZS5yZWFkeVN0YXRlfHxCKGUsV2ViU29ja2V0LkNMT1NFRCl9LFc9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PW4uc2Vjb25kYXJ5P24uc2Vjb25kYXJ5Om4ucHJpbWFyeX0sRz1mdW5jdGlvbigpe3JldHVybiBqKFcoKSl9LHo9ZnVuY3Rpb24oKXtpZihSLnBlbmRpbmdSZXNwb25zZSlyZXR1cm4gZS5hZHZhbmNlZExvZyh1KSx1ZShlLndhcm4odSkpLGNsZWFySW50ZXJ2YWwoUi5pbnRlcnZhbEhhbmRsZSksUi5wZW5kaW5nUmVzcG9uc2U9ITEsdm9pZCBzZSgpO0coKT8odWUoZS5kZWJ1ZygiU2VuZGluZyBoZWFydGJlYXQiKSksVygpLnNlbmQob2UoXykpLFIucGVuZGluZ1Jlc3BvbnNlPSEwKTooZS5hZHZhbmNlZExvZyhsKSx1ZShlLndhcm4obCkpLHEoInNlbmRIZWFydEJlYXQiKSxzZSgpKX0sWD1mdW5jdGlvbigpe2UuYWR2YW5jZWRMb2coIlJlc2V0IFdlYnNvY2tldCBzdGF0ZSIpLHIuZXhwb25lbnRpYWxCYWNrT2ZmVGltZT0xZTMsUi5wZW5kaW5nUmVzcG9uc2U9ITEsci5yZWNvbm5lY3RXZWJTb2NrZXQ9ITAsY2xlYXJUaW1lb3V0KHIubGlmZVRpbWVUaW1lb3V0SGFuZGxlKSxjbGVhckludGVydmFsKFIuaW50ZXJ2YWxIYW5kbGUpLGNsZWFyVGltZW91dChyLmV4cG9uZW50aWFsVGltZW91dEhhbmRsZSksY2xlYXJUaW1lb3V0KHIud2ViU29ja2V0SW5pdENoZWNrZXJUaW1lb3V0SWQpfSxZPWZ1bmN0aW9uKCl7RC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzPTAsRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PTAsY2xlYXJJbnRlcnZhbChELnJlc3BvbnNlQ2hlY2tJbnRlcnZhbElkKSxjbGVhckludGVydmFsKEQucmVTdWJzY3JpYmVJbnRlcnZhbElkKX0sJD1mdW5jdGlvbigpe28uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ9MCxvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lPW51bGwsby5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcD1udWxsfSxKPWZ1bmN0aW9uKCl7UC5jb25uZWN0ZWQoKTt0cnl7ZS5hZHZhbmNlZExvZyhwKSx1ZShlLmluZm8ocCkpLHEoIndlYlNvY2tldE9uT3BlbiIpLG51bGwhPT1yLmNvbm5TdGF0ZSYmci5jb25uU3RhdGUhPT13fHxVKGsuY29ubmVjdGlvbkdhaW4pLHIuY29ublN0YXRlPSJjb25uZWN0ZWQiO3ZhciB0PURhdGUubm93KCk7VShrLmNvbm5lY3Rpb25PcGVuLHtjb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudDpvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50LGNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lOm8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWUsbm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA6by5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcCxjb25uZWN0aW9uRXN0YWJsaXNoZWRUaW1lOnQsdGltZVRvQ29ubmVjdDp0LW8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWUsdGltZVdpdGhvdXRDb25uZWN0aW9uOm8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA/dC1vLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wOm51bGx9KSwkKCksWCgpLFcoKS5vcGVuVGltZXN0YW1wPURhdGUubm93KCksMD09PU8uc3Vic2NyaWJlZC5zaXplJiZqKG4uc2Vjb25kYXJ5KSYmdGUobi5wcmltYXJ5LCJbUHJpbWFyeSBXZWJTb2NrZXRdIENsb3NpbmcgV2ViU29ja2V0IiksKE8uc3Vic2NyaWJlZC5zaXplPjB8fE8ucGVuZGluZy5zaXplPjApJiYoaihuLnNlY29uZGFyeSkmJnVlKGUuaW5mbygiU3Vic2NyaWJpbmcgc2Vjb25kYXJ5IHdlYnNvY2tldCB0byB0b3BpY3Mgb2YgcHJpbWFyeSB3ZWJzb2NrZXQiKSksTy5zdWJzY3JpYmVkLmZvckVhY2goKGZ1bmN0aW9uKGUpe08uc3Vic2NyaXB0aW9uSGlzdG9yeS5hZGQoZSksTy5wZW5kaW5nLmFkZChlKX0pKSxPLnN1YnNjcmliZWQuY2xlYXIoKSxlZSgpKSx6KCksUi5pbnRlcnZhbEhhbmRsZT1zZXRJbnRlcnZhbCh6LDFlNCk7dmFyIGk9MWUzKkwuY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM7dWUoZS5kZWJ1ZygiU2NoZWR1bGluZyBXZWJTb2NrZXQgbWFuYWdlciByZWNvbm5lY3Rpb24sIGFmdGVyIGRlbGF5ICIraSsiIG1zIikpLHIubGlmZVRpbWVUaW1lb3V0SGFuZGxlPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dWUoZS5kZWJ1ZygiU3RhcnRpbmcgc2NoZWR1bGVkIFdlYlNvY2tldCBtYW5hZ2VyIHJlY29ubmVjdGlvbiIpKSxzZSgpfSksaSl9Y2F0Y2godCl7dWUoZS5lcnJvcigiRXJyb3IgYWZ0ZXIgZXN0YWJsaXNoaW5nIFdlYlNvY2tldCBjb25uZWN0aW9uIix0KSl9fSxRPWZ1bmN0aW9uKHQpe3EoIndlYlNvY2tldE9uRXJyb3IiKSxlLmFkdmFuY2VkTG9nKGgsSlNPTi5zdHJpbmdpZnkodCkpLHVlKGUuZXJyb3IoaCxKU09OLnN0cmluZ2lmeSh0KSkpLFAuZ2V0SXNDb25uZWN0ZWQoKT9zZSgpOlAucmV0cnkoKX0sWj1mdW5jdGlvbih0KXt2YXIgcj1KU09OLnBhcnNlKHQuZGF0YSk7c3dpdGNoKHIudG9waWMpe2Nhc2UgQTppZih1ZShlLmRlYnVnKCJTdWJzY3JpcHRpb24gTWVzc2FnZSByZWNlaXZlZCBmcm9tIHdlYlNvY2tldCBzZXJ2ZXIiLHQuZGF0YSkpLEQucmVxdWVzdENvbXBsZXRlZD0hMCxELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q9MCwic3VjY2VzcyI9PT1yLmNvbnRlbnQuc3RhdHVzKUQuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cz0wLHIuY29udGVudC50b3BpY3MuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Ty5zdWJzY3JpcHRpb25IaXN0b3J5LmRlbGV0ZShlKSxPLnBlbmRpbmcuZGVsZXRlKGUpLE8uc3Vic2NyaWJlZC5hZGQoZSl9KSksMD09PU8uc3Vic2NyaXB0aW9uSGlzdG9yeS5zaXplP2oobi5zZWNvbmRhcnkpJiYodWUoZS5pbmZvKCJTdWNjZXNzZnVsbHkgc3Vic2NyaWJlZCBzZWNvbmRhcnkgd2Vic29ja2V0IHRvIGFsbCB0b3BpY3Mgb2YgcHJpbWFyeSB3ZWJzb2NrZXQiKSksdGUobi5wcmltYXJ5LCJbUHJpbWFyeSBXZWJTb2NrZXRdIENsb3NpbmcgV2ViU29ja2V0IikpOmVlKCksVShrLnN1YnNjcmlwdGlvblVwZGF0ZSxyKTtlbHNle2lmKGNsZWFySW50ZXJ2YWwoRC5yZVN1YnNjcmliZUludGVydmFsSWQpLCsrRC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzLDU9PT1ELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHMpcmV0dXJuIFUoay5zdWJzY3JpcHRpb25GYWlsdXJlLHIpLHZvaWQoRC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzPTApO0QucmVTdWJzY3JpYmVJbnRlcnZhbElkPXNldEludGVydmFsKChmdW5jdGlvbigpe2VlKCl9KSw1MDApfWJyZWFrO2Nhc2UgXzp1ZShlLmRlYnVnKCJIZWFydGJlYXQgcmVzcG9uc2UgcmVjZWl2ZWQiKSksUi5wZW5kaW5nUmVzcG9uc2U9ITE7YnJlYWs7ZGVmYXVsdDppZihyLnRvcGljKXtpZihlLmFkdmFuY2VkTG9nKFQsci50b3BpYyksdWUoZS5kZWJ1ZyhUK3IudG9waWMpKSxqKG4ucHJpbWFyeSkmJmoobi5zZWNvbmRhcnkpJiYwPT09Ty5zdWJzY3JpcHRpb25IaXN0b3J5LnNpemUmJnRoaXM9PT1uLnByaW1hcnkpcmV0dXJuIHZvaWQgdWUoZS53YXJuKCJJZ25vcmluZyBNZXNzYWdlIGZvciBUb3BpYyAiK3IudG9waWMrIiwgdG8gYXZvaWQgZHVwbGljYXRlcyIpKTtpZigwPT09ay5hbGxNZXNzYWdlLnNpemUmJjA9PT1rLnRvcGljLnNpemUpcmV0dXJuIHZvaWQgdWUoZS53YXJuKCJObyByZWdpc3RlcmVkIGNhbGxiYWNrIGxpc3RlbmVyIGZvciBUb3BpYyIsci50b3BpYykpO2UuYWR2YW5jZWRMb2coIldlYnNvY2tldE1hbmFnZXIgaW52b2tlIGNhbGxiYWNrcyBmb3IgdG9waWMgc3VjY2VzcyAiLHIudG9waWMpLFUoay5hbGxNZXNzYWdlLHIpLGsudG9waWMuaGFzKHIudG9waWMpJiZVKGsudG9waWMuZ2V0KHIudG9waWMpLHIpfWVsc2Ugci5tZXNzYWdlPyhlLmFkdmFuY2VkTG9nKEMsciksdWUoZS53YXJuKEMscikpKTooZS5hZHZhbmNlZExvZyhJLHIpLHVlKGUud2FybihJLHIpKSl9fSxlZT1mdW5jdGlvbiB0KCl7aWYoRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PjMpcmV0dXJuIHVlKGUud2FybigiSWdub3Jpbmcgc3Vic2NyaWJlUGVuZGluZ1RvcGljcyBzaW5jZSB3ZSBoYXZlIGV4aGF1c3RlZCBtYXggc3Vic2NyaXB0aW9uIHJldHJpZXMgd2l0aCBubyByZXNwb25zZSIpKSx2b2lkIFUoay5zdWJzY3JpcHRpb25GYWlsdXJlLE4uZ2V0U3Vic2NyaXB0aW9uUmVzcG9uc2UoQSwhMSxBcnJheS5mcm9tKE8ucGVuZGluZykpKTtHKCk/MCE9PUFycmF5LmZyb20oTy5wZW5kaW5nKS5sZW5ndGgmJihjbGVhckludGVydmFsKEQucmVzcG9uc2VDaGVja0ludGVydmFsSWQpLFcoKS5zZW5kKG9lKEEse3RvcGljczpBcnJheS5mcm9tKE8ucGVuZGluZyl9KSksRC5yZXF1ZXN0Q29tcGxldGVkPSExLEQucmVzcG9uc2VDaGVja0ludGVydmFsSWQ9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7RC5yZXF1ZXN0Q29tcGxldGVkfHwoKytELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3QsdCgpKX0pLDFlMykpOnVlKGUud2FybigiSWdub3Jpbmcgc3Vic2NyaWJlUGVuZGluZ1RvcGljcyBjYWxsIHNpbmNlIERlZmF1bHQgV2ViU29ja2V0IGlzIG5vdCBvcGVuIikpfSx0ZT1mdW5jdGlvbih0LG4pe0IodCxXZWJTb2NrZXQuQ09OTkVDVElORyl8fEIodCxXZWJTb2NrZXQuT1BFTik/dC5jbG9zZSgxZTMsbik6dWUoZS53YXJuKCJJZ25vcmluZyBXZWJTb2NrZXQgQ2xvc2UgcmVxdWVzdCwgV2ViU29ja2V0IFN0YXRlOiAiK0YodCkpKX0sbmU9ZnVuY3Rpb24oZSl7dGUobi5wcmltYXJ5LCJbUHJpbWFyeV0gV2ViU29ja2V0ICIrZSksdGUobi5zZWNvbmRhcnksIltTZWNvbmRhcnldIFdlYlNvY2tldCAiK2UpfSxyZT1mdW5jdGlvbih0KXtYKCksWSgpLGUuYWR2YW5jZWRMb2cobSx0KSx1ZShlLmVycm9yKG0pKSxyLndlYnNvY2tldEluaXRGYWlsZWQ9ITAsbmUoIlRlcm1pbmF0aW5nIFdlYlNvY2tldCBNYW5hZ2VyIiksY2xlYXJJbnRlcnZhbChNKSxVKGsuaW5pdEZhaWx1cmUse2Nvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50Om8uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQsY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU6by5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZSxyZWFzb246dH0pLCQoKX0sb2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoe3RvcGljOmUsY29udGVudDp0fSl9LGllPWZ1bmN0aW9uKHQpe3JldHVybiEhKE4uaXNPYmplY3QodCkmJk4uaXNPYmplY3QodC53ZWJTb2NrZXRUcmFuc3BvcnQpJiZOLmlzTm9uRW1wdHlTdHJpbmcodC53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKSYmTi52YWxpZFdTVXJsKHQud2ViU29ja2V0VHJhbnNwb3J0LnVybCkmJjFlMyp0LndlYlNvY2tldFRyYW5zcG9ydC50cmFuc3BvcnRMaWZlVGltZUluU2Vjb25kcz49M2U1KXx8KHVlKGUuZXJyb3IoIkludmFsaWQgV2ViU29ja2V0IENvbm5lY3Rpb24gQ29uZmlndXJhdGlvbiIsdCkpLCExKX0sc2U9ZnVuY3Rpb24oKXtpZighTi5pc05ldHdvcmtPbmxpbmUoKSlyZXR1cm4gZS5hZHZhbmNlZExvZyhjKSx2b2lkIHVlKGUuaW5mbyhjKSk7aWYoci53ZWJzb2NrZXRJbml0RmFpbGVkKXVlKGUuZGVidWcoIldlYlNvY2tldCBJbml0IGhhZCBmYWlsZWQsIGlnbm9yaW5nIHRoaXMgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0IikpO2Vsc2V7aWYoTC5wcm9taXNlQ29tcGxldGVkKXJldHVybiBYKCksZS5hZHZhbmNlZExvZyh2KSx1ZShlLmluZm8odikpLG8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU9by5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZXx8RGF0ZS5ub3coKSxMLnByb21pc2VDb21wbGV0ZWQ9ITEsTC5wcm9taXNlSGFuZGxlPWsuZ2V0V2ViU29ja2V0VHJhbnNwb3J0KCksTC5wcm9taXNlSGFuZGxlLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBMLnByb21pc2VDb21wbGV0ZWQ9ITAsZS5hZHZhbmNlZExvZyh5KSx1ZShlLmRlYnVnKHksdCkpLGllKHQpPyhMLmNvbm5Db25maWc9dCxMLmNvbm5Db25maWcudXJsQ29ublZhbGlkVGltZT1EYXRlLm5vdygpKzg1ZTMsYWUoKSk6KHJlKCJJbnZhbGlkIFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb246ICIrdCkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9KX0pLChmdW5jdGlvbih0KXtyZXR1cm4gTC5wcm9taXNlQ29tcGxldGVkPSEwLGUuYWR2YW5jZWRMb2coRSksdWUoZS5lcnJvcihFLHQpKSxOLmlzTmV0d29ya0ZhaWx1cmUodCk/KGUuYWR2YW5jZWRMb2coUytKU09OLnN0cmluZ2lmeSh0KSksdWUoZS5pbmZvKFMrSlNPTi5zdHJpbmdpZnkodCkpKSxQLnJldHJ5KCkpOnJlKCJGYWlsZWQgdG8gZmV0Y2ggd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbjogIitKU09OLnN0cmluZ2lmeSh0KSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9fSkpO3VlKGUuZGVidWcoIlRoZXJlIGlzIGFuIG9uZ29pbmcgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0LCB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBpZ25vcmVkIikpfX0sYWU9ZnVuY3Rpb24oKXtpZihyLndlYnNvY2tldEluaXRGYWlsZWQpcmV0dXJuIHVlKGUuaW5mbygid2ViLXNvY2tldCBpbml0aWFsaXppbmcgaGFkIGZhaWxlZCwgYWJvcnRpbmcgcmUtaW5pdCIpKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH07aWYoIU4uaXNOZXR3b3JrT25saW5lKCkpcmV0dXJuIHVlKGUud2FybigiU3lzdGVtIGlzIG9mZmxpbmUgYWJvcnRpbmcgd2ViLXNvY2tldCBpbml0IikpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfTtlLmFkdmFuY2VkTG9nKGIpLHVlKGUuaW5mbyhiKSkscSgiaW5pdFdlYlNvY2tldCIpO3RyeXtpZihpZShMLmNvbm5Db25maWcpKXt2YXIgdD1udWxsO3JldHVybiBqKG4ucHJpbWFyeSk/KHVlKGUuZGVidWcoIlByaW1hcnkgU29ja2V0IGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBvcGVuIikpLEIobi5zZWNvbmRhcnksV2ViU29ja2V0LkNPTk5FQ1RJTkcpfHwodWUoZS5kZWJ1ZygiRXN0YWJsaXNoaW5nIGEgc2Vjb25kYXJ5IHdlYi1zb2NrZXQgY29ubmVjdGlvbiIpKSxQLm51bUF0dGVtcHRzPTAsbi5zZWNvbmRhcnk9Y2UoKSksdD1uLnNlY29uZGFyeSk6KEIobi5wcmltYXJ5LFdlYlNvY2tldC5DT05ORUNUSU5HKXx8KHVlKGUuZGVidWcoIkVzdGFibGlzaGluZyBhIHByaW1hcnkgd2ViLXNvY2tldCBjb25uZWN0aW9uIikpLG4ucHJpbWFyeT1jZSgpKSx0PW4ucHJpbWFyeSksci53ZWJTb2NrZXRJbml0Q2hlY2tlclRpbWVvdXRJZD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2oodCl8fGZ1bmN0aW9uKCl7by5jb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudCsrO3ZhciB0PU4uYWRkSml0dGVyKHIuZXhwb25lbnRpYWxCYWNrT2ZmVGltZSwuMyk7RGF0ZS5ub3coKSt0PD1MLmNvbm5Db25maWcudXJsQ29ublZhbGlkVGltZT8oZS5hZHZhbmNlZExvZyhmKSx1ZShlLmRlYnVnKGYrdCsiIG1zIikpLHIuZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGFlKCl9KSx0KSxyLmV4cG9uZW50aWFsQmFja09mZlRpbWUqPTIpOihlLmFkdmFuY2VkTG9nKGcpLHVlKGUud2FybihnKSksc2UoKSl9KCl9KSwxZTMpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiExfX19Y2F0Y2godCl7cmV0dXJuIHVlKGUuZXJyb3IoIkVycm9yIEluaXRpYWxpemluZyB3ZWItc29ja2V0LW1hbmFnZXIiLHQpKSxyZSgiRmFpbGVkIHRvIGluaXRpYWxpemUgbmV3IFdlYlNvY2tldDogIit0Lm1lc3NhZ2UpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfX19LGNlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFdlYlNvY2tldChMLmNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnVybCk7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsSiksdC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixaKSx0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixRKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwoZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKHQsaSl7ZS5hZHZhbmNlZExvZyhkLEpTT04uc3RyaW5naWZ5KHQpKSx1ZShlLmluZm8oZCxKU09OLnN0cmluZ2lmeSh0KSkpLHEoIndlYlNvY2tldE9uQ2xvc2UgYmVmb3JlLWNsZWFudXAiKSxVKGsuY29ubmVjdGlvbkNsb3NlLHtvcGVuVGltZXN0YW1wOmkub3BlblRpbWVzdGFtcCxjbG9zZVRpbWVzdGFtcDpEYXRlLm5vdygpLGNvbm5lY3Rpb25EdXJhdGlvbjpEYXRlLm5vdygpLWkub3BlblRpbWVzdGFtcCxjb2RlOnQuY29kZSxyZWFzb246dC5yZWFzb259KSxWKG4ucHJpbWFyeSkmJihuLnByaW1hcnk9bnVsbCksVihuLnNlY29uZGFyeSkmJihuLnNlY29uZGFyeT1udWxsKSxyLnJlY29ubmVjdFdlYlNvY2tldCYmKGoobi5wcmltYXJ5KXx8aihuLnNlY29uZGFyeSk/VihuLnByaW1hcnkpJiZqKG4uc2Vjb25kYXJ5KSYmKHVlKGUuaW5mbygiW1ByaW1hcnldIFdlYlNvY2tldCBDbGVhbmx5IENsb3NlZCIpKSxuLnByaW1hcnk9bi5zZWNvbmRhcnksbi5zZWNvbmRhcnk9bnVsbCk6KHVlKGUud2FybigiTmVpdGhlciBwcmltYXJ5IHdlYnNvY2tldCBhbmQgbm9yIHNlY29uZGFyeSB3ZWJzb2NrZXQgaGF2ZSBvcGVuIGNvbm5lY3Rpb25zLCBhdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uIikpLHIuY29ublN0YXRlPT09dz91ZShlLmluZm8oIklnbm9yaW5nIGNvbm5lY3Rpb25Mb3N0IGNhbGxiYWNrIGludm9jYXRpb24iKSk6KFUoay5jb25uZWN0aW9uTG9zdCx7b3BlblRpbWVzdGFtcDppLm9wZW5UaW1lc3RhbXAsY2xvc2VUaW1lc3RhbXA6RGF0ZS5ub3coKSxjb25uZWN0aW9uRHVyYXRpb246RGF0ZS5ub3coKS1pLm9wZW5UaW1lc3RhbXAsY29kZTp0LmNvZGUscmVhc29uOnQucmVhc29ufSksby5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcD1EYXRlLm5vdygpKSxyLmNvbm5TdGF0ZT13LHNlKCkpLHEoIndlYlNvY2tldE9uQ2xvc2UgYWZ0ZXItY2xlYW51cCIpKX0oaSx0KX0pKSx0fSx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXImJmUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlfTt0aGlzLmluaXQ9ZnVuY3Rpb24odCl7aWYoTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwidHJhbnNwb3J0SGFuZGxlIG11c3QgYmUgYSBmdW5jdGlvbiIpLG51bGw9PT1rLmdldFdlYlNvY2tldFRyYW5zcG9ydClyZXR1cm4gay5nZXRXZWJTb2NrZXRUcmFuc3BvcnQ9dCxzZSgpO3VlKGUud2FybigiV2ViIFNvY2tldCBNYW5hZ2VyIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIikpfSx0aGlzLm9uSW5pdEZhaWx1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIkluaXRpYWxpemluZyBXZWJzb2NrZXQgTWFuYWdlciBGYWlsZWQhIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5pbml0RmFpbHVyZS5hZGQodCksci53ZWJzb2NrZXRJbml0RmFpbGVkJiZ0KCksZnVuY3Rpb24oKXtyZXR1cm4gay5pbml0RmFpbHVyZS5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbk9wZW49ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIG9wZW4iKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmNvbm5lY3Rpb25PcGVuLmFkZCh0KSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25PcGVuLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uQ2xvc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIGNsb3NlIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5jb25uZWN0aW9uQ2xvc2UuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuY29ubmVjdGlvbkNsb3NlLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uR2Fpbj1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gZ2FpbiIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbkdhaW4uYWRkKHQpLEcoKSYmdCgpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuY29ubmVjdGlvbkdhaW4uZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBsb3N0IiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5jb25uZWN0aW9uTG9zdC5hZGQodCksci5jb25uU3RhdGU9PT13JiZ0KCksZnVuY3Rpb24oKXtyZXR1cm4gay5jb25uZWN0aW9uTG9zdC5kZWxldGUodCl9fSx0aGlzLm9uU3Vic2NyaXB0aW9uVXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKGUpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLnN1YnNjcmlwdGlvblVwZGF0ZS5hZGQoZSksZnVuY3Rpb24oKXtyZXR1cm4gay5zdWJzY3JpcHRpb25VcGRhdGUuZGVsZXRlKGUpfX0sdGhpcy5vblN1YnNjcmlwdGlvbkZhaWx1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBzdWJzY3JpcHRpb24gZmFpbHVyZSIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuc3Vic2NyaXB0aW9uRmFpbHVyZS5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gay5zdWJzY3JpcHRpb25GYWlsdXJlLmRlbGV0ZSh0KX19LHRoaXMub25NZXNzYWdlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE4uYXNzZXJ0Tm90TnVsbChlLCJ0b3BpY05hbWUiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLnRvcGljLmhhcyhlKT9rLnRvcGljLmdldChlKS5hZGQodCk6ay50b3BpYy5zZXQoZSxuZXcgU2V0KFt0XSkpLGZ1bmN0aW9uKCl7cmV0dXJuIGsudG9waWMuZ2V0KGUpLmRlbGV0ZSh0KX19LHRoaXMub25BbGxNZXNzYWdlPWZ1bmN0aW9uKGUpe3JldHVybiBOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKGUpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmFsbE1lc3NhZ2UuYWRkKGUpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuYWxsTWVzc2FnZS5kZWxldGUoZSl9fSx0aGlzLnN1YnNjcmliZVRvcGljcz1mdW5jdGlvbihlKXtOLmFzc2VydE5vdE51bGwoZSwidG9waWNzIiksTi5hc3NlcnRJc0xpc3QoZSksZS5mb3JFYWNoKChmdW5jdGlvbihlKXtPLnN1YnNjcmliZWQuaGFzKGUpfHxPLnBlbmRpbmcuYWRkKGUpfSkpLEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD0wLGVlKCl9LHRoaXMuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24odCl7aWYoTi5hc3NlcnRJc09iamVjdCh0LCJwYXlsb2FkIiksdm9pZCAwPT09dC50b3BpY3x8eC5oYXModC50b3BpYykpdWUoZS53YXJuKCJDYW5ub3Qgc2VuZCBtZXNzYWdlLCBJbnZhbGlkIHRvcGljIix0KSk7ZWxzZXt0cnl7dD1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaChuKXtyZXR1cm4gdm9pZCB1ZShlLndhcm4oIkVycm9yIHN0cmluZ2lmeSBtZXNzYWdlIix0KSl9RygpP1coKS5zZW5kKHQpOnVlKGUud2FybigiQ2Fubm90IHNlbmQgbWVzc2FnZSwgd2ViIHNvY2tldCBjb25uZWN0aW9uIGlzIG5vdCBvcGVuIikpfX0sdGhpcy5jbG9zZVdlYlNvY2tldD1mdW5jdGlvbigpe1goKSxZKCksci5yZWNvbm5lY3RXZWJTb2NrZXQ9ITEsY2xlYXJJbnRlcnZhbChNKSxuZSgiVXNlciByZXF1ZXN0IHRvIGNsb3NlIFdlYlNvY2tldCIpfSx0aGlzLnRlcm1pbmF0ZVdlYlNvY2tldE1hbmFnZXI9cmV9LFk9e2NyZWF0ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgWH0sc2V0R2xvYmFsQ29uZmlnOmZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUubG9nZ2VyQ29uZmlnO0gudXBkYXRlTG9nZ2VyQ29uZmlnKHQpfSxMb2dMZXZlbDpCLExvZ2dlcjpGfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByOyFmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz17bm90X3N0cmluZzovW15zXS8sbm90X2Jvb2w6L1tedF0vLG5vdF90eXBlOi9bXlRdLyxub3RfcHJpbWl0aXZlOi9bXnZdLyxudW1iZXI6L1tkaWVmZ10vLG51bWVyaWNfYXJnOi9bYmNkaWVmZ3V4WF0vLGpzb246L1tqXS8sbm90X2pzb246L1teal0vLHRleHQ6L15bXlx4MjVdKy8sbW9kdWxvOi9eXHgyNXsyfS8scGxhY2Vob2xkZXI6L15ceDI1KD86KFsxLTldXGQqKVwkfFwoKFteKV0rKVwpKT8oXCspPygwfCdbXiRdKT8oLSk/KFxkKyk/KD86XC4oXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLGtleTovXihbYS16X11bYS16X1xkXSopL2ksa2V5X2FjY2VzczovXlwuKFthLXpfXVthLXpfXGRdKikvaSxpbmRleF9hY2Nlc3M6L15cWyhcZCspXF0vLHNpZ246L15bKy1dL307ZnVuY3Rpb24gaShlKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbixyLHMsYSxjLHUsbCxwLGQsaD0xLGY9ZS5sZW5ndGgsZz0iIjtmb3Iocj0wO3I8ZjtyKyspaWYoInN0cmluZyI9PXR5cGVvZiBlW3JdKWcrPWVbcl07ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGVbcl0pe2lmKChhPWVbcl0pLmtleXMpZm9yKG49dFtoXSxzPTA7czxhLmtleXMubGVuZ3RoO3MrKyl7aWYobnVsbD09bil0aHJvdyBuZXcgRXJyb3IoaSgnW3NwcmludGZdIENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgIiVzIiBvZiB1bmRlZmluZWQgdmFsdWUgIiVzIicsYS5rZXlzW3NdLGEua2V5c1tzLTFdKSk7bj1uW2Eua2V5c1tzXV19ZWxzZSBuPWEucGFyYW1fbm8/dFthLnBhcmFtX25vXTp0W2grK107aWYoby5ub3RfdHlwZS50ZXN0KGEudHlwZSkmJm8ubm90X3ByaW1pdGl2ZS50ZXN0KGEudHlwZSkmJm4gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKG49bigpKSxvLm51bWVyaWNfYXJnLnRlc3QoYS50eXBlKSYmIm51bWJlciIhPXR5cGVvZiBuJiZpc05hTihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKGkoIltzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlVCIsbikpO3N3aXRjaChvLm51bWJlci50ZXN0KGEudHlwZSkmJihwPW4+PTApLGEudHlwZSl7Y2FzZSJiIjpuPXBhcnNlSW50KG4sMTApLnRvU3RyaW5nKDIpO2JyZWFrO2Nhc2UiYyI6bj1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4sMTApKTticmVhaztjYXNlImQiOmNhc2UiaSI6bj1wYXJzZUludChuLDEwKTticmVhaztjYXNlImoiOm49SlNPTi5zdHJpbmdpZnkobixudWxsLGEud2lkdGg/cGFyc2VJbnQoYS53aWR0aCk6MCk7YnJlYWs7Y2FzZSJlIjpuPWEucHJlY2lzaW9uP3BhcnNlRmxvYXQobikudG9FeHBvbmVudGlhbChhLnByZWNpc2lvbik6cGFyc2VGbG9hdChuKS50b0V4cG9uZW50aWFsKCk7YnJlYWs7Y2FzZSJmIjpuPWEucHJlY2lzaW9uP3BhcnNlRmxvYXQobikudG9GaXhlZChhLnByZWNpc2lvbik6cGFyc2VGbG9hdChuKTticmVhaztjYXNlImciOm49YS5wcmVjaXNpb24/U3RyaW5nKE51bWJlcihuLnRvUHJlY2lzaW9uKGEucHJlY2lzaW9uKSkpOnBhcnNlRmxvYXQobik7YnJlYWs7Y2FzZSJvIjpuPShwYXJzZUludChuLDEwKT4+PjApLnRvU3RyaW5nKDgpO2JyZWFrO2Nhc2UicyI6bj1TdHJpbmcobiksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UidCI6bj1TdHJpbmcoISFuKSxuPWEucHJlY2lzaW9uP24uc3Vic3RyaW5nKDAsYS5wcmVjaXNpb24pOm47YnJlYWs7Y2FzZSJUIjpuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpLG49YS5wcmVjaXNpb24/bi5zdWJzdHJpbmcoMCxhLnByZWNpc2lvbik6bjticmVhaztjYXNlInUiOm49cGFyc2VJbnQobiwxMCk+Pj4wO2JyZWFrO2Nhc2UidiI6bj1uLnZhbHVlT2YoKSxuPWEucHJlY2lzaW9uP24uc3Vic3RyaW5nKDAsYS5wcmVjaXNpb24pOm47YnJlYWs7Y2FzZSJ4IjpuPShwYXJzZUludChuLDEwKT4+PjApLnRvU3RyaW5nKDE2KTticmVhaztjYXNlIlgiOm49KHBhcnNlSW50KG4sMTApPj4+MCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9by5qc29uLnRlc3QoYS50eXBlKT9nKz1uOighby5udW1iZXIudGVzdChhLnR5cGUpfHxwJiYhYS5zaWduP2Q9IiI6KGQ9cD8iKyI6Ii0iLG49bi50b1N0cmluZygpLnJlcGxhY2Uoby5zaWduLCIiKSksdT1hLnBhZF9jaGFyPyIwIj09PWEucGFkX2NoYXI/IjAiOmEucGFkX2NoYXIuY2hhckF0KDEpOiIgIixsPWEud2lkdGgtKGQrbikubGVuZ3RoLGM9YS53aWR0aCYmbD4wP3UucmVwZWF0KGwpOiIiLGcrPWEuYWxpZ24/ZCtuK2M6IjAiPT09dT9kK2MrbjpjK2Qrbil9cmV0dXJuIGd9KGZ1bmN0aW9uKGUpe2lmKGFbZV0pcmV0dXJuIGFbZV07Zm9yKHZhciB0LG49ZSxyPVtdLGk9MDtuOyl7aWYobnVsbCE9PSh0PW8udGV4dC5leGVjKG4pKSlyLnB1c2godFswXSk7ZWxzZSBpZihudWxsIT09KHQ9by5tb2R1bG8uZXhlYyhuKSkpci5wdXNoKCIlIik7ZWxzZXtpZihudWxsPT09KHQ9by5wbGFjZWhvbGRlci5leGVjKG4pKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIltzcHJpbnRmXSB1bmV4cGVjdGVkIHBsYWNlaG9sZGVyIik7aWYodFsyXSl7aXw9MTt2YXIgcz1bXSxjPXRbMl0sdT1bXTtpZihudWxsPT09KHU9by5rZXkuZXhlYyhjKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleSIpO2ZvcihzLnB1c2godVsxXSk7IiIhPT0oYz1jLnN1YnN0cmluZyh1WzBdLmxlbmd0aCkpOylpZihudWxsIT09KHU9by5rZXlfYWNjZXNzLmV4ZWMoYykpKXMucHVzaCh1WzFdKTtlbHNle2lmKG51bGw9PT0odT1vLmluZGV4X2FjY2Vzcy5leGVjKGMpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIltzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5Iik7cy5wdXNoKHVbMV0pfXRbMl09c31lbHNlIGl8PTI7aWYoMz09PWkpdGhyb3cgbmV3IEVycm9yKCJbc3ByaW50Zl0gbWl4aW5nIHBvc2l0aW9uYWwgYW5kIG5hbWVkIHBsYWNlaG9sZGVycyBpcyBub3QgKHlldCkgc3VwcG9ydGVkIik7ci5wdXNoKHtwbGFjZWhvbGRlcjp0WzBdLHBhcmFtX25vOnRbMV0sa2V5czp0WzJdLHNpZ246dFszXSxwYWRfY2hhcjp0WzRdLGFsaWduOnRbNV0sd2lkdGg6dFs2XSxwcmVjaXNpb246dFs3XSx0eXBlOnRbOF19KX1uPW4uc3Vic3RyaW5nKHRbMF0ubGVuZ3RoKX1yZXR1cm4gYVtlXT1yfShlKSxhcmd1bWVudHMpfWZ1bmN0aW9uIHMoZSx0KXtyZXR1cm4gaS5hcHBseShudWxsLFtlXS5jb25jYXQodHx8W10pKX12YXIgYT1PYmplY3QuY3JlYXRlKG51bGwpO3Quc3ByaW50Zj1pLHQudnNwcmludGY9cywidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5zcHJpbnRmPWksd2luZG93LnZzcHJpbnRmPXMsdm9pZCAwPT09KHI9ZnVuY3Rpb24oKXtyZXR1cm57c3ByaW50ZjppLHZzcHJpbnRmOnN9fS5jYWxsKHQsbix0LGUpKXx8KGUuZXhwb3J0cz1yKSl9KCl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLGZ1bmN0aW9uKGUpe24uZCh0LCJXZWJTb2NrZXRNYW5hZ2VyIiwoZnVuY3Rpb24oKXtyZXR1cm4gb30pKTt2YXIgcj1uKDApO2UuY29ubmVjdD1lLmNvbm5lY3R8fHt9LGNvbm5lY3QuV2ViU29ja2V0TWFuYWdlcj1yLmE7dmFyIG89ci5hfS5jYWxsKHRoaXMsbigzKSl9LGZ1bmN0aW9uKGUsdCl7dmFyIG47bj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtuPW58fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKGUpeyJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfWUuZXhwb3J0cz1ufV0pfSwxNTE6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj17VEVTVDoiVEVTVCIsVFJBQ0U6IlRSQUNFIixERUJVRzoiREVCVUciLElORk86IklORk8iLExPRzoiTE9HIixXQVJOOiJXQVJOIixFUlJPUjoiRVJST1IiLENSSVRJQ0FMOiJDUklUSUNBTCJ9LHI9e0NDUDoiY2NwIixTT0ZUUEhPTkU6InNvZnRwaG9uZSIsQ0hBVDoiY2hhdCIsVEFTSzoidGFzayJ9LG89e1RFU1Q6MCxUUkFDRToxMCxERUJVRzoyMCxJTkZPOjMwLExPRzo0MCxXQVJOOjUwLEVSUk9SOjEwMCxDUklUSUNBTDoyMDB9LGk9IkNDUCIscz0iU2hhcmVkV29ya2VyIixhPSJDUk0iLGM9e1RSQUNFOmZ1bmN0aW9uKGUpe2NvbnNvbGUuaW5mbyhlKX0sREVCVUc6ZnVuY3Rpb24oZSl7Y29uc29sZS5pbmZvKGUpfSxJTkZPOmZ1bmN0aW9uKGUpe2NvbnNvbGUuaW5mbyhlKX0sTE9HOmZ1bmN0aW9uKGUpe2NvbnNvbGUubG9nKGUpfSxURVNUOmZ1bmN0aW9uKGUpe2NvbnNvbGUubG9nKGUpfSxXQVJOOmZ1bmN0aW9uKGUpe2NvbnNvbGUud2FybihlKX0sRVJST1I6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX0sQ1JJVElDQUw6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX19LHU9ZnVuY3Rpb24oZSl7dmFyIHQsbixvPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUsMCksaT1vLnNoaWZ0KCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybi0xIT09T2JqZWN0LnZhbHVlcyhyKS5pbmRleE9mKGUpfShpKT8obj1pLHQ9by5zaGlmdCgpKToodD1pLG49ci5DQ1ApLHtmb3JtYXQ6dCxjb21wb25lbnQ6bixhcmdzOm99fSxsPWZ1bmN0aW9uKGUsbixyLG8sYyx1KXt0aGlzLmNvbXBvbmVudD1lLHRoaXMubGV2ZWw9bix0aGlzLnRleHQ9cix0aGlzLnRpbWU9bmV3IERhdGUsdGhpcy50YWJJZD1udWxsPT09Yz9udWxsOmN8fHQuY29yZS50YWJJZCx0aGlzLmV4Y2VwdGlvbj1udWxsLHRoaXMub2JqZWN0cz1bXSx0aGlzLmxpbmU9MCx0aGlzLmFnZW50UmVzb3VyY2VJZD1udWxsO3RyeXt0LmFnZW50LmluaXRpYWxpemVkJiYodGhpcy5hZ2VudFJlc291cmNlSWQ9KG5ldyB0LkFnZW50KS5fZ2V0UmVzb3VyY2VJZCgpKX1jYXRjaChlKXtjb25zb2xlLmxvZygiSXNzdWUgZmluZGluZyBhZ2VudFJlc291cmNlSWQ6ICIsZSl9dGhpcy5sb2dnZXJJZD1vLHU/dGhpcy5jb250ZXh0TGF5ZXI9dTp0LmlzU2hhcmVkV29ya2VyKCk/dGhpcy5jb250ZXh0TGF5ZXI9czp0LmlzQ1JNKCk/dGhpcy5jb250ZXh0TGF5ZXI9YTp0LmlzQ0NQKCkmJih0aGlzLmNvbnRleHRMYXllcj1pKX07bC5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciB0PWUudGFiSWR8fG51bGwsbj1lLmNvbnRleHRMYXllcnx8bnVsbCxvPW5ldyBsKHIuQ0NQLGUubGV2ZWwsZS50ZXh0LGUubG9nZ2VySWQsdCxuKTtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS50aW1lKT9vLnRpbWU9bmV3IERhdGUoZS50aW1lLmdldFRpbWUoKSk6Im51bWJlciI9PXR5cGVvZiBlLnRpbWU/by50aW1lPW5ldyBEYXRlKGUudGltZSk6InN0cmluZyI9PXR5cGVvZiBlLnRpbWU/by50aW1lPURhdGUucGFyc2UoZS50aW1lKTpvLnRpbWU9bmV3IERhdGUsby5leGNlcHRpb249ZS5leGNlcHRpb24sby5vYmplY3RzPWUub2JqZWN0cyxvfTt2YXIgcD1mdW5jdGlvbihlKXt2YXIgdD0vQXV0aFRva2VuLipcPS9nO2UmJiJvYmplY3QiPT10eXBlb2YgZSYmT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7Im9iamVjdCI9PXR5cGVvZiBlW25dP3AoZVtuXSk6InN0cmluZyI9PXR5cGVvZiBlW25dJiYoInVybCI9PT1ufHwidGV4dCI9PT1uP2Vbbl09ZVtuXS5yZXBsYWNlKHQsIltyZWRhY3RlZF0iKTpbInF1aWNrQ29ubmVjdE5hbWUiXS5pbmNsdWRlcyhuKT9lW25dPSJbcmVkYWN0ZWRdIjpbImN1c3RvbWVySWQiLCJDdXN0b21lcklkIiwiU3BlYWtlcklkIiwiQ3VzdG9tZXJTcGVha2VySWQiXS5pbmNsdWRlcyhuKSYmKGVbbl09YFtvYmZ1c2NhdGVkIHZhbHVlXSAke21kNShlW25dKX1gKSl9KSl9LGQ9ZnVuY3Rpb24oZSl7aWYodGhpcy50eXBlPWUgaW5zdGFuY2VvZiBFcnJvcj9lLm5hbWU6ZS5jb2RlfHxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksdGhpcy5tZXNzYWdlPWUubWVzc2FnZSx0aGlzLnN0YWNrPVtdLGUuc3RhY2spdHJ5e0FycmF5LmlzQXJyYXkoZS5zdGFjayk/dGhpcy5zdGFjaz1lLnN0YWNrOiJvYmplY3QiPT10eXBlb2YgZS5zdGFjaz90aGlzLnN0YWNrPVtKU09OLnN0cmluZ2lmeShlLnN0YWNrKV06InN0cmluZyI9PXR5cGVvZiBlLnN0YWNrJiYodGhpcy5zdGFjaz1lLnN0YWNrLnNwbGl0KCJcbiIpKX1jYXRjaHt9fTtsLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0LnNwcmludGYoIlslc10gWyVzXSBbJXNdOiAlcyIsdGhpcy5nZXRUaW1lKCkmJnRoaXMuZ2V0VGltZSgpLnRvSVNPU3RyaW5nP3RoaXMuZ2V0VGltZSgpLnRvSVNPU3RyaW5nKCk6Ij8/PyIsdGhpcy5nZXRMZXZlbCgpLHRoaXMuZ2V0QWdlbnRSZXNvdXJjZUlkKCksdGhpcy5nZXRUZXh0KCkpfSxsLnByb3RvdHlwZS5nZXRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZX0sbC5wcm90b3R5cGUuZ2V0QWdlbnRSZXNvdXJjZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWdlbnRSZXNvdXJjZUlkfSxsLnByb3RvdHlwZS5nZXRUYWJJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRhYklkfSxsLnByb3RvdHlwZS5nZXRDb250ZXh0TGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZXh0TGF5ZXJ9LGwucHJvdG90eXBlLmdldExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGV2ZWx9LGwucHJvdG90eXBlLmdldFRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0fSxsLnByb3RvdHlwZS5nZXRDb21wb25lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnR9LGwucHJvdG90eXBlLndpdGhFeGNlcHRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZXhjZXB0aW9uPW5ldyBkKGUpLHRoaXN9LGwucHJvdG90eXBlLndpdGhPYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dC5kZWVwY29weShlKTtyZXR1cm4gcChuKSx0aGlzLm9iamVjdHMucHVzaChuKSx0aGlzfSxsLnByb3RvdHlwZS53aXRoQ3Jvc3NPcmlnaW5FdmVudE9iamVjdD1mdW5jdGlvbihlKXt2YXIgbj10LmRlZXBjb3B5Q3Jvc3NPcmlnaW5FdmVudChlKTtyZXR1cm4gcChuKSx0aGlzLm9iamVjdHMucHVzaChuKSx0aGlzfSxsLnByb3RvdHlwZS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcj1mdW5jdGlvbigpe3JldHVybiB0LmdldExvZygpLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5wdXNoKHRoaXMpLHRoaXN9O3ZhciBoPWZ1bmN0aW9uKCl7dGhpcy5fbG9ncz1bXSx0aGlzLl9yb2xsZWRMb2dzPVtdLHRoaXMuX2xvZ3NUb1B1c2g9W10sdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W10sdGhpcy5fZWNob0xldmVsPW8uSU5GTyx0aGlzLl9sb2dMZXZlbD1vLklORk8sdGhpcy5fbGluZUNvdW50PTAsdGhpcy5fbG9nUm9sbEludGVydmFsPTAsdGhpcy5fbG9nUm9sbFRpbWVyPW51bGwsdGhpcy5fbG9nZ2VySWQ9KG5ldyBEYXRlKS5nZXRUaW1lKCkrIi0iK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLHRoaXMuc2V0TG9nUm9sbEludGVydmFsKDE4ZTUpLHRoaXMuX3N0YXJ0TG9nSW5kZXhUb1B1c2g9MH07aC5wcm90b3R5cGUuc2V0TG9nUm9sbEludGVydmFsPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7dGhpcy5fbG9nUm9sbFRpbWVyJiZ0PT09dGhpcy5fbG9nUm9sbEludGVydmFsP3RoaXMud2FybigiTG9nZ2VyIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBnaXZlbiBpbnRlcnZhbDogJWQiLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbCk6KHRoaXMuX2xvZ1JvbGxUaW1lciYmZS5jbGVhckludGVydmFsKHRoaXMuX2xvZ1JvbGxUaW1lciksdGhpcy5fbG9nUm9sbEludGVydmFsPXQsdGhpcy5fbG9nUm9sbFRpbWVyPWUuc2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7bi5fcm9sbGVkTG9ncz1uLl9sb2dzLG4uX2xvZ3M9W10sbi5fc3RhcnRMb2dJbmRleFRvUHVzaD0wLG4uaW5mbygiTG9nIHJvbGwgaW50ZXJ2YWwgb2NjdXJyZWQuIil9KSx0aGlzLl9sb2dSb2xsSW50ZXJ2YWwpKX0saC5wcm90b3R5cGUuc2V0TG9nTGV2ZWw9ZnVuY3Rpb24oZSl7aWYoIShlIGluIG8pKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBsb2dnaW5nIGxldmVsOiAiK2UpO3RoaXMuX2xvZ0xldmVsPW9bZV19LGgucHJvdG90eXBlLnNldEVjaG9MZXZlbD1mdW5jdGlvbihlKXtpZighKGUgaW4gbykpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGxvZ2dpbmcgbGV2ZWw6ICIrZSk7dGhpcy5fZWNob0xldmVsPW9bZV19LGgucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgbChlLHQsbix0aGlzLmdldExvZ2dlcklkKCkpO3JldHVybiBwKHIpLHRoaXMuYWRkTG9nRW50cnkocikscn0saC5wcm90b3R5cGUuYWRkTG9nRW50cnk9ZnVuY3Rpb24oZSl7cChlKSx0aGlzLl9sb2dzLnB1c2goZSksci5TT0ZUUEhPTkU9PT1lLmNvbXBvbmVudCYmdGhpcy5fbG9nc1RvUHVzaC5wdXNoKGUpLGUubGV2ZWwgaW4gbyYmb1tlLmxldmVsXT49dGhpcy5fbG9nTGV2ZWwmJihvW2UubGV2ZWxdPj10aGlzLl9lY2hvTGV2ZWwmJmNbZS5nZXRMZXZlbCgpXShlLnRvU3RyaW5nKCkpLGUubGluZT10aGlzLl9saW5lQ291bnQrKyl9LGgucHJvdG90eXBlLnNlbmRJbnRlcm5hbExvZ0VudHJ5VG9TZXJ2ZXI9ZnVuY3Rpb24oZSl7dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MucHVzaChlKSxlLmxldmVsIGluIG8mJm9bZS5sZXZlbF0+PXRoaXMuX2xvZ0xldmVsJiYob1tlLmxldmVsXT49dGhpcy5fZWNob0xldmVsJiZjW2UuZ2V0TGV2ZWwoKV0oZS50b1N0cmluZygpKSxlLmxpbmU9dGhpcy5fbGluZUNvdW50KyspfSxoLnByb3RvdHlwZS5jbGVhck9iamVjdHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuX2xvZ3MubGVuZ3RoO2UrKyl0aGlzLl9sb2dzW2VdLm9iamVjdHMmJmRlbGV0ZSB0aGlzLl9sb2dzW2VdLm9iamVjdHN9LGgucHJvdG90eXBlLmNsZWFyRXhjZXB0aW9ucz1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5fbG9ncy5sZW5ndGg7ZSsrKXRoaXMuX2xvZ3NbZV0uZXhjZXB0aW9uJiZkZWxldGUgdGhpcy5fbG9nc1tlXS5leGNlcHRpb259LGgucHJvdG90eXBlLnRyYWNlPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uVFJBQ0UsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuZGVidWc9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5ERUJVRyx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5pbmZvPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uSU5GTyx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5MT0csdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUudGVzdD1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLlRFU1QsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUud2Fybj1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLldBUk4sdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5FUlJPUix0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5jcml0aWNhbD1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLkVSUk9SLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PHRoaXMuX2xvZ3MubGVuZ3RoO3QrKyllLnB1c2godGhpcy5fbG9nc1t0XS50b1N0cmluZygpKTtyZXR1cm4gZS5qb2luKCJcbiIpfSxoLnByb3RvdHlwZS5kb3dubG9hZD1mdW5jdGlvbih0KXt2YXIgbj0iYWdlbnQtbG9nIixyPSExOyJvYmplY3QiPT10eXBlb2YgdD8obj10LmxvZ05hbWV8fG4scj10LmZpbHRlckJ5TG9nTGV2ZWx8fHIpOiJzdHJpbmciPT10eXBlb2YgdCYmKG49dHx8bik7dmFyIGk9dGhpcyxzPXRoaXMuX3JvbGxlZExvZ3MuY29uY2F0KHRoaXMuX2xvZ3MpO3ImJihzPXMuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gb1tlLmxldmVsXT49aS5fbG9nTGV2ZWx9KSkpO3ZhciBhPW5ldyBlLkJsb2IoW0pTT04uc3RyaW5naWZ5KHMsdm9pZCAwLDQpXSxbInRleHQvcGxhaW4iXSksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7bj1ufHwiYWdlbnQtbG9nIixjLmhyZWY9ZS5VUkwuY3JlYXRlT2JqZWN0VVJMKGEpLGMuZG93bmxvYWQ9bisiLnR4dCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKSxjLmNsaWNrKCksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjKX0saC5wcm90b3R5cGUuc2NoZWR1bGVVcHN0cmVhbUxvZ1B1c2g9ZnVuY3Rpb24obil7dC51cHN0cmVhbUxvZ1B1c2hTY2hlZHVsZWR8fCh0LnVwc3RyZWFtTG9nUHVzaFNjaGVkdWxlZD0hMCxlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLnJlcG9ydE1hc3RlckxvZ3NVcFN0cmVhbSxuKSw1ZTMpKX0saC5wcm90b3R5cGUucmVwb3J0TWFzdGVyTG9nc1VwU3RyZWFtPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuX2xvZ3NUb1B1c2guc2xpY2UoKTt0aGlzLl9sb2dzVG9QdXNoPVtdLHQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU0VORF9MT0dTLChmdW5jdGlvbigpe24ubGVuZ3RoPjAmJmUuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFTkRfTE9HUyxuKX0pKX0saC5wcm90b3R5cGUuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1B1c2g9ZnVuY3Rpb24obil7ZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5wdXNoT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzVXBzdHJlYW0sbiksMWUzKX0saC5wcm90b3R5cGUuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUExvZ3NQdXNoPWZ1bmN0aW9uKG4pe2Uuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMucHVzaE91dGVyQ29udGV4dENDUExvZ3NVcHN0cmVhbSxuKSwxZTMpfSxoLnByb3RvdHlwZS5wdXNoT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzVXBzdHJlYW09ZnVuY3Rpb24oZSl7aWYodGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoPjApe2Zvcih2YXIgbj0wO248dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoO24rKyl0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9nc1tuXS50ZXh0PXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzW25dLnRleHQ7ZS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRyx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncyksdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W119fSxoLnByb3RvdHlwZS5wdXNoT3V0ZXJDb250ZXh0Q0NQTG9nc1Vwc3RyZWFtPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbj10aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoO248dGhpcy5fbG9ncy5sZW5ndGg7bisrKXRoaXMuX2xvZ3Nbbl0ubG9nZ2VySWQ9PT10aGlzLl9sb2dnZXJJZCYmZS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuTE9HLHRoaXMuX2xvZ3Nbbl0pO3RoaXMuX3N0YXJ0TG9nSW5kZXhUb1B1c2g9dGhpcy5fbG9ncy5sZW5ndGh9LGgucHJvdG90eXBlLmdldExvZ2dlcklkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvZ2dlcklkfSxoLnByb3RvdHlwZS5zY2hlZHVsZURvd25zdHJlYW1DbGllbnRTaWRlTG9nc1B1c2g9ZnVuY3Rpb24oKXtlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLnB1c2hDbGllbnRTaWRlTG9nc0Rvd25zdHJlYW0pLDVlMyl9LGgucHJvdG90eXBlLnB1c2hDbGllbnRTaWRlTG9nc0Rvd25zdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT1bXTt0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg8NTB8fCh0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg+NTAwP2U9dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Muc3BsaWNlKDAsNTAwKTooZT10aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncyx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncz1bXSksdC5wdWJsaXNoQ2xpZW50U2lkZUxvZ3MoZSkpfTt2YXIgZj1mdW5jdGlvbihuKXtoLmNhbGwodGhpcyksdGhpcy5jb25kdWl0PW4sZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5fcHVzaExvZ3NEb3duc3RyZWFtKSxmLkxPR19QVVNIX0lOVEVSVkFMKSxlLmNsZWFySW50ZXJ2YWwodGhpcy5fbG9nUm9sbFRpbWVyKSx0aGlzLl9sb2dSb2xsVGltZXI9bnVsbH07Zi5MT0dfUFVTSF9JTlRFUlZBTD0xZTMsZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShoLnByb3RvdHlwZSksZi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZixmLnByb3RvdHlwZS5wdXNoTG9nc0Rvd25zdHJlYW09ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztlLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csZSl9KSl9LGYucHJvdG90eXBlLl9wdXNoTG9nc0Rvd25zdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuX2xvZ3MuZm9yRWFjaCgoZnVuY3Rpb24obil7ZS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkxPRyxuKX0pKSx0aGlzLl9sb2dzPVtdO2Zvcih2YXIgbj0wO248dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoO24rKyl0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRyx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9nc1tuXSk7dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W119O3ZhciBnPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3RyeXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9Y2F0Y2goZSl7Yy5FUlJPUihlKX19fTt0LnJvb3RMb2dnZXI9bmV3IGgsZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpImZ1bmN0aW9uIj09dHlwZW9mIGVbdF0mJihlW3RdPWcoZVt0XSkpfSh0LnJvb3RMb2dnZXIpLCh0PXR8fHt9KS5nZXRMb2c9ZnVuY3Rpb24oKXtyZXR1cm4gdC5yb290TG9nZ2VyfSx0LkxvZ0VudHJ5PWwsdC5Mb2dnZXI9aCx0LkxvZ0xldmVsPW4sdC5Mb2dDb21wb25lbnQ9cix0LkRvd25zdHJlYW1Db25kdWl0TG9nZ2VyPWZ9KCl9LDE2MzpmdW5jdGlvbigpeyFmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCl7dmFyIG49KDY1NTM1JmUpKyg2NTUzNSZ0KTtyZXR1cm4oZT4+MTYpKyh0Pj4xNikrKG4+PjE2KTw8MTZ8NjU1MzUmbn1mdW5jdGlvbiBuKGUsbixyLG8saSxzKXtyZXR1cm4gdCgoYT10KHQobixlKSx0KG8scykpKTw8KGM9aSl8YT4+PjMyLWMscik7dmFyIGEsY31mdW5jdGlvbiByKGUsdCxyLG8saSxzLGEpe3JldHVybiBuKHQmcnx+dCZvLGUsdCxpLHMsYSl9ZnVuY3Rpb24gbyhlLHQscixvLGkscyxhKXtyZXR1cm4gbih0Jm98ciZ+byxlLHQsaSxzLGEpfWZ1bmN0aW9uIGkoZSx0LHIsbyxpLHMsYSl7cmV0dXJuIG4odF5yXm8sZSx0LGkscyxhKX1mdW5jdGlvbiBzKGUsdCxyLG8saSxzLGEpe3JldHVybiBuKHJeKHR8fm8pLGUsdCxpLHMsYSl9ZnVuY3Rpb24gYShlLG4pe3ZhciBhLGMsdSxsLHA7ZVtuPj41XXw9MTI4PDxuJTMyLGVbMTQrKG4rNjQ+Pj45PDw0KV09bjt2YXIgZD0xNzMyNTg0MTkzLGg9LTI3MTczMzg3OSxmPS0xNzMyNTg0MTk0LGc9MjcxNzMzODc4O2ZvcihhPTA7YTxlLmxlbmd0aDthKz0xNiljPWQsdT1oLGw9ZixwPWcsZD1yKGQsaCxmLGcsZVthXSw3LC02ODA4NzY5MzYpLGc9cihnLGQsaCxmLGVbYSsxXSwxMiwtMzg5NTY0NTg2KSxmPXIoZixnLGQsaCxlW2ErMl0sMTcsNjA2MTA1ODE5KSxoPXIoaCxmLGcsZCxlW2ErM10sMjIsLTEwNDQ1MjUzMzApLGQ9cihkLGgsZixnLGVbYSs0XSw3LC0xNzY0MTg4OTcpLGc9cihnLGQsaCxmLGVbYSs1XSwxMiwxMjAwMDgwNDI2KSxmPXIoZixnLGQsaCxlW2ErNl0sMTcsLTE0NzMyMzEzNDEpLGg9cihoLGYsZyxkLGVbYSs3XSwyMiwtNDU3MDU5ODMpLGQ9cihkLGgsZixnLGVbYSs4XSw3LDE3NzAwMzU0MTYpLGc9cihnLGQsaCxmLGVbYSs5XSwxMiwtMTk1ODQxNDQxNyksZj1yKGYsZyxkLGgsZVthKzEwXSwxNywtNDIwNjMpLGg9cihoLGYsZyxkLGVbYSsxMV0sMjIsLTE5OTA0MDQxNjIpLGQ9cihkLGgsZixnLGVbYSsxMl0sNywxODA0NjAzNjgyKSxnPXIoZyxkLGgsZixlW2ErMTNdLDEyLC00MDM0MTEwMSksZj1yKGYsZyxkLGgsZVthKzE0XSwxNywtMTUwMjAwMjI5MCksZD1vKGQsaD1yKGgsZixnLGQsZVthKzE1XSwyMiwxMjM2NTM1MzI5KSxmLGcsZVthKzFdLDUsLTE2NTc5NjUxMCksZz1vKGcsZCxoLGYsZVthKzZdLDksLTEwNjk1MDE2MzIpLGY9byhmLGcsZCxoLGVbYSsxMV0sMTQsNjQzNzE3NzEzKSxoPW8oaCxmLGcsZCxlW2FdLDIwLC0zNzM4OTczMDIpLGQ9byhkLGgsZixnLGVbYSs1XSw1LC03MDE1NTg2OTEpLGc9byhnLGQsaCxmLGVbYSsxMF0sOSwzODAxNjA4MyksZj1vKGYsZyxkLGgsZVthKzE1XSwxNCwtNjYwNDc4MzM1KSxoPW8oaCxmLGcsZCxlW2ErNF0sMjAsLTQwNTUzNzg0OCksZD1vKGQsaCxmLGcsZVthKzldLDUsNTY4NDQ2NDM4KSxnPW8oZyxkLGgsZixlW2ErMTRdLDksLTEwMTk4MDM2OTApLGY9byhmLGcsZCxoLGVbYSszXSwxNCwtMTg3MzYzOTYxKSxoPW8oaCxmLGcsZCxlW2ErOF0sMjAsMTE2MzUzMTUwMSksZD1vKGQsaCxmLGcsZVthKzEzXSw1LC0xNDQ0NjgxNDY3KSxnPW8oZyxkLGgsZixlW2ErMl0sOSwtNTE0MDM3ODQpLGY9byhmLGcsZCxoLGVbYSs3XSwxNCwxNzM1MzI4NDczKSxkPWkoZCxoPW8oaCxmLGcsZCxlW2ErMTJdLDIwLC0xOTI2NjA3NzM0KSxmLGcsZVthKzVdLDQsLTM3ODU1OCksZz1pKGcsZCxoLGYsZVthKzhdLDExLC0yMDIyNTc0NDYzKSxmPWkoZixnLGQsaCxlW2ErMTFdLDE2LDE4MzkwMzA1NjIpLGg9aShoLGYsZyxkLGVbYSsxNF0sMjMsLTM1MzA5NTU2KSxkPWkoZCxoLGYsZyxlW2ErMV0sNCwtMTUzMDk5MjA2MCksZz1pKGcsZCxoLGYsZVthKzRdLDExLDEyNzI4OTMzNTMpLGY9aShmLGcsZCxoLGVbYSs3XSwxNiwtMTU1NDk3NjMyKSxoPWkoaCxmLGcsZCxlW2ErMTBdLDIzLC0xMDk0NzMwNjQwKSxkPWkoZCxoLGYsZyxlW2ErMTNdLDQsNjgxMjc5MTc0KSxnPWkoZyxkLGgsZixlW2FdLDExLC0zNTg1MzcyMjIpLGY9aShmLGcsZCxoLGVbYSszXSwxNiwtNzIyNTIxOTc5KSxoPWkoaCxmLGcsZCxlW2ErNl0sMjMsNzYwMjkxODkpLGQ9aShkLGgsZixnLGVbYSs5XSw0LC02NDAzNjQ0ODcpLGc9aShnLGQsaCxmLGVbYSsxMl0sMTEsLTQyMTgxNTgzNSksZj1pKGYsZyxkLGgsZVthKzE1XSwxNiw1MzA3NDI1MjApLGQ9cyhkLGg9aShoLGYsZyxkLGVbYSsyXSwyMywtOTk1MzM4NjUxKSxmLGcsZVthXSw2LC0xOTg2MzA4NDQpLGc9cyhnLGQsaCxmLGVbYSs3XSwxMCwxMTI2ODkxNDE1KSxmPXMoZixnLGQsaCxlW2ErMTRdLDE1LC0xNDE2MzU0OTA1KSxoPXMoaCxmLGcsZCxlW2ErNV0sMjEsLTU3NDM0MDU1KSxkPXMoZCxoLGYsZyxlW2ErMTJdLDYsMTcwMDQ4NTU3MSksZz1zKGcsZCxoLGYsZVthKzNdLDEwLC0xODk0OTg2NjA2KSxmPXMoZixnLGQsaCxlW2ErMTBdLDE1LC0xMDUxNTIzKSxoPXMoaCxmLGcsZCxlW2ErMV0sMjEsLTIwNTQ5MjI3OTkpLGQ9cyhkLGgsZixnLGVbYSs4XSw2LDE4NzMzMTMzNTkpLGc9cyhnLGQsaCxmLGVbYSsxNV0sMTAsLTMwNjExNzQ0KSxmPXMoZixnLGQsaCxlW2ErNl0sMTUsLTE1NjAxOTgzODApLGg9cyhoLGYsZyxkLGVbYSsxM10sMjEsMTMwOTE1MTY0OSksZD1zKGQsaCxmLGcsZVthKzRdLDYsLTE0NTUyMzA3MCksZz1zKGcsZCxoLGYsZVthKzExXSwxMCwtMTEyMDIxMDM3OSksZj1zKGYsZyxkLGgsZVthKzJdLDE1LDcxODc4NzI1OSksaD1zKGgsZixnLGQsZVthKzldLDIxLC0zNDM0ODU1NTEpLGQ9dChkLGMpLGg9dChoLHUpLGY9dChmLGwpLGc9dChnLHApO3JldHVybltkLGgsZixnXX1mdW5jdGlvbiBjKGUpe3ZhciB0LG49IiIscj0zMiplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVt0Pj41XT4+PnQlMzImMjU1KTtyZXR1cm4gbn1mdW5jdGlvbiB1KGUpe3ZhciB0LG49W107Zm9yKG5bKGUubGVuZ3RoPj4yKS0xXT12b2lkIDAsdD0wO3Q8bi5sZW5ndGg7dCs9MSluW3RdPTA7dmFyIHI9OCplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW5bdD4+NV18PSgyNTUmZS5jaGFyQ29kZUF0KHQvOCkpPDx0JTMyO3JldHVybiBufWZ1bmN0aW9uIGwoZSl7dmFyIHQsbixyPSIwMTIzNDU2Nzg5YWJjZGVmIixvPSIiO2ZvcihuPTA7bjxlLmxlbmd0aDtuKz0xKXQ9ZS5jaGFyQ29kZUF0KG4pLG8rPXIuY2hhckF0KHQ+Pj40JjE1KStyLmNoYXJBdCgxNSZ0KTtyZXR1cm4gb31mdW5jdGlvbiBwKGUpe3JldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBjKGEodShlKSw4KmUubGVuZ3RoKSl9KHAoZSkpfWZ1bmN0aW9uIGgoZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbixyLG89dShlKSxpPVtdLHM9W107Zm9yKGlbMTVdPXNbMTVdPXZvaWQgMCxvLmxlbmd0aD4xNiYmKG89YShvLDgqZS5sZW5ndGgpKSxuPTA7bjwxNjtuKz0xKWlbbl09OTA5NTIyNDg2Xm9bbl0sc1tuXT0xNTQ5NTU2ODI4Xm9bbl07cmV0dXJuIHI9YShpLmNvbmNhdCh1KHQpKSw1MTIrOCp0Lmxlbmd0aCksYyhhKHMuY29uY2F0KHIpLDY0MCkpfShwKGUpLHAodCkpfSh0aGlzfHxnbG9iYWxUaGlzKS5tZDU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0P24/aCh0LGUpOmwoaCh0LGUpKTpuP2QoZSk6bChkKGUpKX19KCl9LDQzOTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuQ2hhdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbihlLG4pe3ZhciByPXQuZ2V0TG9nKCksbz10LkxvZ0NvbXBvbmVudC5DSEFULGk9ZnVuY3Rpb24obixyKXt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bixjb250YWN0SWQ6ZS5jb250YWN0SWQsZGF0YTpyfHxlfSl9LHM9ZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpb25Ccm9rZW4oKGZ1bmN0aW9uKGUpe3IuZXJyb3IobywiQ2hhdCBTZXNzaW9uIGNvbm5lY3Rpb24gYnJva2VuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIsZSl9KSksZS5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgoZnVuY3Rpb24oZSl7ci5pbmZvKG8sIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIixlKX0pKX07cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2koIkNoYXQgbWVkaWEgY29udHJvbGxlciBpbml0IixlLmNvbnRhY3RJZCksci5pbmZvKG8sIkNoYXQgbWVkaWEgY29udHJvbGxlciBpbml0Iikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuQ2hhdFNlc3Npb24uc2V0R2xvYmFsQ29uZmlnKHtsb2dnZXJDb25maWc6e2xvZ2dlcjpyfSxyZWdpb246bi5yZWdpb259KTt2YXIgYT10LkNoYXRTZXNzaW9uLmNyZWF0ZSh7Y2hhdERldGFpbHM6ZSx0eXBlOiJBR0VOVCIsd2Vic29ja2V0TWFuYWdlcjp0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpfSk7cmV0dXJuIHMoYSksYS5jb25uZWN0KCkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5mbyhvLCJDaGF0IFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIGZvciBjb250YWN0SWQgJXMiLGUuY29udGFjdElkKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQiLGUuY29udGFjdElkKSxhfSkpLmNhdGNoKChmdW5jdGlvbih0KXt0aHJvdyByLmVycm9yKG8sIkNoYXQgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQgZm9yIGNvbnRhY3QgJXMiLGUuY29udGFjdElkKS53aXRoRXhjZXB0aW9uKHQpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaSgiQ2hhdCBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCIsZS5jb250YWN0SWQsdCksdH0pKX0oKX19fX0oKX0sMjc5OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsdC5NZWRpYUZhY3Rvcnk9ZnVuY3Rpb24oZSl7dmFyIG49e30scj1uZXcgU2V0LG89dC5nZXRMb2coKSxpPXQuTG9nQ29tcG9uZW50LkNIQVQscz10Lm1lcmdlKHt9LGUpfHx7fTtzLnJlZ2lvbj1zLnJlZ2lvbnx8InVzLXdlc3QtMiI7dmFyIGE9ZnVuY3Rpb24oZSl7bltlXSYmIXIuaGFzKGUpJiYoby5pbmZvKGksIkRlc3Ryb3lpbmcgbWVkaWFDb250cm9sbGVyIGZvciAlcyIsZSksci5hZGQoZSksbltlXS50aGVuKChmdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgdC5jbGVhblVwJiZ0LmNsZWFuVXAoKSxkZWxldGUgbltlXSxyLmRlbGV0ZShlKX0pKS5jYXRjaCgoZnVuY3Rpb24oKXtkZWxldGUgbltlXSxyLmRlbGV0ZShlKX0pKSl9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KGUpP2Z1bmN0aW9uKGUpe3ZhciByPWUuZ2V0Q29ubmVjdGlvbklkKCk7aWYoIWUuZ2V0TWVkaWFJbmZvKCkpcmV0dXJuIG8uZXJyb3IoaSwiTWVkaWEgaW5mbyBkb2VzIG5vdCBleGlzdCBmb3IgYSBtZWRpYSB0eXBlICVzIixlLmdldE1lZGlhVHlwZSgpKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksUHJvbWlzZS5yZWplY3QoIk1lZGlhIGluZm8gZG9lcyBub3QgZXhpc3QgZm9yIHRoaXMgY29ubmVjdGlvbiIpO2lmKG5bcl0pcmV0dXJuIG5bcl07c3dpdGNoKG8uaW5mbyhpLCJtZWRpYSBjb250cm9sbGVyIG9mIHR5cGUgJXMgaW5pdCIsZS5nZXRNZWRpYVR5cGUoKSkud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuZ2V0TWVkaWFUeXBlKCkpe2Nhc2UgdC5NZWRpYVR5cGUuQ0hBVDpyZXR1cm4gbltyXT1uZXcgdC5DaGF0TWVkaWFDb250cm9sbGVyKGUuZ2V0TWVkaWFJbmZvKCkscykuZ2V0KCk7Y2FzZSB0Lk1lZGlhVHlwZS5TT0ZUUEhPTkU6cmV0dXJuIG5bcl09bmV3IHQuU29mdHBob25lTWVkaWFDb250cm9sbGVyKGUuZ2V0TWVkaWFJbmZvKCkpLmdldCgpO2Nhc2UgdC5NZWRpYVR5cGUuVEFTSzpyZXR1cm4gbltyXT1uZXcgdC5UYXNrTWVkaWFDb250cm9sbGVyKGUuZ2V0TWVkaWFJbmZvKCkpLmdldCgpO2RlZmF1bHQ6cmV0dXJuIG8uZXJyb3IoaSwiVW5yZWNvZ25pemVkIG1lZGlhIHR5cGUgJXMgIixlLmdldE1lZGlhVHlwZSgpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLFByb21pc2UucmVqZWN0KCl9fShlKTooYShlLmdldENvbm5lY3Rpb25JZCgpKSxQcm9taXNlLnJlamVjdCgiTWVkaWEgQ29udHJvbGxlciBpcyBubyBsb25nZXIgYXZhaWxhYmxlIGZvciB0aGlzIGNvbm5lY3Rpb24iKSl9LGRlc3Ryb3k6YX19fSgpfSw0MTg6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0LlNvZnRwaG9uZU1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbihlKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX19fX0oKX0sMTg3OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsdC5UYXNrTWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKGUpe3ZhciBuPXQuZ2V0TG9nKCkscj10LkxvZ0NvbXBvbmVudC5UQVNLLG89ZnVuY3Rpb24obixyKXt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bixjb250YWN0SWQ6ZS5jb250YWN0SWQsZGF0YTpyfHxlfSl9LGk9ZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpb25Ccm9rZW4oKGZ1bmN0aW9uKGUpe24uZXJyb3IociwiVGFzayBTZXNzaW9uIGNvbm5lY3Rpb24gYnJva2VuIikud2l0aEV4Y2VwdGlvbihlKSxvKCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iLGUpfSkpLGUub25Db25uZWN0aW9uRXN0YWJsaXNoZWQoKGZ1bmN0aW9uKGUpe24uaW5mbyhyLCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpLndpdGhPYmplY3QoZSksbygiVGFzayBTZXNzaW9uIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiLGUpfSkpfTtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7bygiVGFzayBtZWRpYSBjb250cm9sbGVyIGluaXQiLGUuY29udGFjdElkKSxuLmluZm8ociwiVGFzayBtZWRpYSBjb250cm9sbGVyIGluaXQiKS53aXRoT2JqZWN0KGUpO3ZhciBzPXQuVGFza1Nlc3Npb24uY3JlYXRlKHtjb250YWN0SWQ6ZS5jb250YWN0SWQsaW5pdGlhbENvbnRhY3RJZDplLmluaXRpYWxDb250YWN0SWQsd2Vic29ja2V0TWFuYWdlcjp0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpfSk7cmV0dXJuIGkocykscy5jb25uZWN0KCkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gbi5pbmZvKHIsIlRhc2sgU2Vzc2lvbiBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQgZm9yIGNvbnRhY3RJZCAlcyIsZS5jb250YWN0SWQpLG8oIlRhc2sgU2Vzc2lvbiBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQiLGUuY29udGFjdElkKSxzfSkpLmNhdGNoKChmdW5jdGlvbih0KXt0aHJvdyBuLmVycm9yKHIsIlRhc2sgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQgZm9yIGNvbnRhY3QgJXMiLGUuY29udGFjdElkKS53aXRoRXhjZXB0aW9uKHQpLG8oIkNoYXQgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQiLGUuY29udGFjdElkLHQpLHR9KSl9KCl9fX19KCl9LDE2MTooKT0+eyFmdW5jdGlvbigpe2NvbnN0IGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7Y29uc3Qgbj0iL3JlcXVlc3Qtc3RvcmFnZS1hY2Nlc3MiLHI9e2NhblJlcXVlc3Q6ITEsbW9kZToiZGVmYXVsdCIsY3VzdG9tOntoaWRlQ0NQOiEwfX07bGV0IG8saT17fSxzPSIiLGE9bnVsbCxjPSExO2NvbnN0IHU9e0lOSVQ6InN0b3JhZ2VBY2Nlc3M6OmluaXQiLEdSQU5URUQ6InN0b3JhZ2VBY2Nlc3M6OmdyYW50ZWQiLERFTklFRDoic3RvcmFnZUFjY2Vzczo6ZGVuaWVkIixSRVFVRVNUOiJzdG9yYWdlQWNjZXNzOjpyZXF1ZXN0In0sbD0oKT0+KHtzaG93OigpPT57YS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9LGhpZGU6KCk9PnthLnN0eWxlLmRpc3BsYXk9Im5vbmUifX0pLHA9KCk9PmkmJiJjdXN0b20iPT09aS5tb2RlLGQ9ZT0+ZS5tYXRjaCgvLmNvbm5lY3QuYXdzLmEyei5jb218Lm15LmNvbm5lY3QuYXdzfC5nb3ZjbG91ZC5jb25uZWN0LmF3c3wuYXdzYXBwcy5jb20vKSxoPWU9Pntjb25zdHtvcmlnaW46dCxwYXRobmFtZTpyfT1uZXcgVVJMKGUpO2lmKHQubWF0Y2goLy5hd3NhcHBzLmNvbS8pKXtsZXQgZT0iY29ubmVjdCI7cmV0dXJuIHIuc3RhcnRzV2l0aCgiL2Nvbm5lY3QtZ2FtbWEiKSYmKGU9ImNvbm5lY3QtZ2FtbWEiKSxgJHt0fS8ke2V9JHtufWB9cmV0dXJuYCR7dH0ke259YH0sZj1lPT5lLm1hdGNoKC9eaHR0cHM/OlwvXC9sb2NhbGhvc3QvKSxnPSgpPT57aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJbU3RvcmFnZUFjY2Vzc10gW2dldGxhbmRBdFBhdGhdIEludm9rZSBjb25uZWN0LnN0b3JhZ2VBY2Nlc3MuaW5pdCBmaXJzdCIpO2lmKGQocyl8fGYocykpe2NvbnN0e3BhdGhuYW1lOmV9PW5ldyBVUkwocyk7cmV0dXJuIGV9cmV0dXJuIi9jb25uZWN0L2NjcC12MiJ9LG09KHtvbkluaXQ6ZSxvbkRlbnk6bixvbkdyYW50OnJ9KT0+e2Z1bmN0aW9uIG8oe2RhdGE6aSxzb3VyY2U6c30pe2lmKHQuY29yZS5fZ2V0Q0NQSWZyYW1lKCkuY29udGVudFdpbmRvdyE9PXMpcmV0dXJuITE7c3dpdGNoKHQuY29yZS5pbml0aWFsaXplZCYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pLGkuZXZlbnQpe2Nhc2UgdS5JTklUOnQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW0lOSVRdIG1lc3NhZ2UgcmVjaWV2ZWQiKS53aXRoT2JqZWN0KGkpLGUmJmUoaSk7YnJlYWs7Y2FzZSB1LkdSQU5URUQ6dC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc11bR1JBTlRFRF0gbWVzc2FnZSByZWNpZXZlZCIpLndpdGhPYmplY3QoaSksciYmcihpKTticmVhaztjYXNlIHUuREVOSUVEOnQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW0RFTklFRF0gbWVzc2FnZSByZWNpZXZlZCIpLndpdGhPYmplY3QoaSksbiYmbihpKTticmVhaztkZWZhdWx0OnQuY29yZS5pbml0aWFsaXplZCYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pfX1yZXR1cm4gaS5jYW5SZXF1ZXN0JiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbykse3Vuc3Vic2NyaWJlOigpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pfX19O3Quc3RvcmFnZUFjY2Vzcz1PYmplY3QuZnJlZXplKHtjYW5SZXF1ZXN0OigpPT5pLmNhblJlcXVlc3Qsb3B0T3V0RnJvbVJlcXVlc3RBY2Nlc3M6KCk9PntyLmNhblJlcXVlc3Q9ITF9LG9wdEluRm9yUmVxdWVzdEFjY2VzczooKT0+e3IuY2FuUmVxdWVzdD0hMH0saW5pdDooZSxuLG89e30pPT57dC5hc3NlcnROb3ROdWxsKGUsImNjcFVybCIpLHQuYXNzZXJ0Tm90TnVsbChuLCJjb250YWluZXIiKSxhPW4scz1lLCgoZT17fSk9PntlLmN1c3RvbT1lLmN1c3RvbXx8e30saT17Li4uciwuLi5lLGN1c3RvbTp7Li4uci5jdXN0b20sLi4uZS5jdXN0b219fSxpLmNhblJlcXVlc3Q9ISgiZmFsc2UiPT09aS5jYW5SZXF1ZXN0fHwhMT09PWkuY2FuUmVxdWVzdCl9KShvKSx0LmdldExvZygpLmluZm8oYFtTdG9yYWdlQWNjZXNzXVtpbml0XSBSZXF1ZXN0IFN0b3JhZ2UgQWNjY2VzcyBpbml0IGNhbGxlZCB3aXRoIGNjcFVybCAtICR7ZX0gLSAke2kuY2FuUmVxdWVzdD8iUHJvY2VlZGluZyB3aXRoIHJlcXVlc3Rpbmcgc3RvcmFnZSBhY2Nlc3MiOiJ1c2VyIGhhcyBvcHRlZCBvdXQsIHNraXBwaW5nIHJlcXVlc3Qgc3RvcmFnZSBhY2Nlc3MifWApLndpdGhPYmplY3QoaSl9LHNldHVwUmVxdWVzdEhhbmRsZXJzOih7b25HcmFudDplfSk9PntvJiZvLnVuc3Vic2NyaWJlKCksbz1tKHtvbkluaXQ6ZT0+e2NvbnNvbGUubG9nKCIlY1tTdG9yYWdlQWNjZXNzXVtJTklUXSIsImJhY2tncm91bmQ6eWVsbG93OyBjb2xvcjpibGFjazsgZm9udC1zaXplOmxhcmdlIiksdC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc11bb25Jbml0XSBjYWxsYmFjayBleGVjdXRlZCIpLndpdGhPYmplY3QoZT8uZGF0YSksIWU/LmRhdGEuaGFzQWNjZXNzJiZwKCkmJmwoKS5zaG93KCl9LG9uRGVueTooKT0+e2NvbnNvbGUubG9nKCIlY1tTdG9yYWdlQWNjZXNzXVtERU5JRURdIiwiYmFja2dyb3VuZDpyZWQ7IGNvbG9yOmJsYWNrOyBmb250LXNpemU6bGFyZ2UiKSx0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtvbkRlbnldIGNhbGxiYWNrIGV4ZWN1dGVkIikscCgpJiZsKCkuc2hvdygpfSxvbkdyYW50OigpPT57Y29uc29sZS5sb2coIiVjW1N0b3JhZ2VBY2Nlc3NdW0dSQU5URURdIiwiYmFja2dyb3VuZDpsaW1lOyBjb2xvcjpibGFjazsgZm9udC1zaXplOmxhcmdlIiksdC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc11bb25HcmFudF0gY2FsbGJhY2sgZXhlY3V0ZWQiKSxwKCkmJmk/LmN1c3RvbT8uaGlkZUNDUCYmbCgpLmhpZGUoKSxjfHwoZSgpLGM9ITApfX0pfSxnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybDooKT0+e2lmKCFzKXRocm93IG5ldyBFcnJvcigiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gSW52b2tlIGNvbm5lY3Quc3RvcmFnZUFjY2Vzcy5pbml0IGZpcnN0Iik7aWYoZChzKSlyZXR1cm4gaChzKTtpZihmKHMpKXJldHVybiB0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXSBbQ0NQXSBMb2NhbCB0ZXN0aW5nIiksYCR7c30ke259YDtpZihpLmluc3RhbmNlVXJsJiZkKGkuaW5zdGFuY2VVcmwpKXJldHVybiB0LmdldExvZygpLmluZm8oYFtTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIEN1c3RvbWVyIGhhcyBwcm92aWRlZCBzdG9yYWdlUGFyYW1zLmluc3RhbmNlVXJsICR7aS5pbnN0YW5jZVVybH1gKSxoKGkuaW5zdGFuY2VVcmwpO2lmKGkuaW5zdGFuY2VVcmwmJmYoaS5pbnN0YW5jZVVybCkpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gTG9jYWwgdGVzdGluZyIpLGAke2kuaW5zdGFuY2VVcmx9JHtufWA7dGhyb3cgdC5nZXRMb2coKS5lcnJvcigiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gSW52YWxpZCBDb25uZWN0IGluc3RhbmNlL0NDUCBVUkwgcHJvdmlkZWQsIHBsZWFzZSBwYXNzIHRoZSBjb3JyZWN0IGNjcFVybCBvciBzdG9yYWdlQWNjZXNzLmluc3RhbmNlVXJsIHBhcmFtZXRlcnMiKSxuZXcgRXJyb3IoIltTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIEludmFsaWQgQ29ubmVjdCBpbnN0YW5jZS9DQ1AgVVJMIHByb3ZpZGVkLCBwbGVhc2UgcGFzcyB0aGUgdmFsaWQgQ29ubmVjdCBDQ1AgVVJMIG9yIGluIGNhc2UgQ0NQIFVSTCBpcyBjb25maWd1cmVkIHRvIGJlIHRoZSBTU08gVVJMIHRoZW4gdXNlIHN0b3JhZ2VBY2Nlc3MuaW5zdGFuY2VVcmwgYW5kIHBhc3MgdGhlIENvbm5lY3QgQ0NQIFVSTCIpfSxzdG9yYWdlQWNjZXNzRXZlbnRzOnUscmVzZXRTdG9yYWdlQWNjZXNzU3RhdGU6KCk9PntpPXt9LHM9IiIsYT1udWxsLGM9ITF9LGdldE9uR3JhbnRDYWxsYmFja0ludm9rZWQ6KCk9PmMsZ2V0U3RvcmFnZUFjY2Vzc1BhcmFtczooKT0+aSxvblJlcXVlc3Q6bSxyZXF1ZXN0OigpPT57dC5jb3JlLl9nZXRDQ1BJZnJhbWUoKS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHtldmVudDp1LlJFUVVFU1QsZGF0YTp7Li4uaSxsYW5kYXQ6ZygpfX0sIioiKX19KX0oKX0sNzQzOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49ZnVuY3Rpb24obil7dmFyIHI9dGhpcztpZih0aGlzLl9wcmV2Q29udGFjdElkPW51bGwsdC5hc3NlcnROb3ROdWxsKG4sInJpbmd0b25lQ29uZmlnIiksIW4ucmluZ3RvbmVVcmwpdGhyb3cgbmV3IEVycm9yKCJyaW5ndG9uZVVybCBpcyByZXF1aXJlZCEiKTtlLkF1ZGlvJiZ2b2lkIDAhPT1lLlByb21pc2U/dGhpcy5fcGxheWFibGVBdWRpb1Byb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsbyl7ci5fYXVkaW89bmV3IEF1ZGlvKG4ucmluZ3RvbmVVcmwpLHIuX2F1ZGlvLmxvb3A9ITAsci5fYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcigiY2FucGxheSIsKGZ1bmN0aW9uKCl7dC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBpcyByZWFkeSB0byBwbGF5OiAiLCtuLnJpbmd0b25lVXJsKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuX2F1ZGlvUGxheWFibGU9ITAsZShyLl9hdWRpbyl9KSl9KSk6KHRoaXMuX2F1ZGlvPW51bGwsdC5nZXRMb2coKS5lcnJvcigiVW5hYmxlIHRvIHByb3ZpZGUgYSByaW5ndG9uZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxyLl9kcml2ZVJpbmd0b25lKCl9O24ucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQuIil9LG4ucHJvdG90eXBlLl9zdGFydFJpbmd0b25lPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dGhpcy5fYXVkaW8mJih0aGlzLl9hdWRpby5wbGF5KCkudGhlbigoZnVuY3Rpb24oKXtuLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIFN0YXJ0IixlKSx0LmdldExvZygpLmluZm8oIlJpbmd0b25lIFN0YXJ0Iikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24ocil7bi5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBQbGF5YmFjayBGYWlsdXJlIixlKSx0LmdldExvZygpLmVycm9yKCJSaW5ndG9uZSBQbGF5YmFjayBGYWlsdXJlIikud2l0aEV4Y2VwdGlvbihyKS53aXRoT2JqZWN0KHtjdXJyZW50U3JjOm4uX2F1ZGlvLmN1cnJlbnRTcmMsc2lua0lkOm4uX2F1ZGlvLnNpbmtJZCx2b2x1bWU6bi5fYXVkaW8udm9sdW1lfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSx0LmdldExvZygpLmluZm8oYEF0dGVtcHRpbmcgdG8gc3RhcnQgcmluZ3RvbmUgdG8gZGV2aWNlICR7dGhpcy5fYXVkaW8uc2lua0lkfHwiJycifWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSxuLnByb3RvdHlwZS5fc3RvcFJpbmd0b25lPWZ1bmN0aW9uKGUpe3RoaXMuX2F1ZGlvJiYodGhpcy5fYXVkaW8ucGF1c2UoKSx0aGlzLl9hdWRpby5jdXJyZW50VGltZT0wLHRoaXMuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgU3RvcCIsZSksdC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBTdG9wIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LG4ucHJvdG90eXBlLnN0b3BSaW5ndG9uZT1mdW5jdGlvbigpe3RoaXMuX3N0b3BSaW5ndG9uZSgpfSxuLnByb3RvdHlwZS5fcmluZ3RvbmVTZXR1cD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuUklOR1RPTkUsKGZ1bmN0aW9uKCl7bi5fc3RhcnRSaW5ndG9uZShlKSxuLl9wcmV2Q29udGFjdElkPWUuZ2V0Q29udGFjdElkKCksZS5vbkNvbm5lY3RlZChsaWx5LmhpdGNoKG4sbi5fc3RvcFJpbmd0b25lKSksZS5vbkFjY2VwdGVkKGxpbHkuaGl0Y2gobixuLl9zdG9wUmluZ3RvbmUpKSxlLm9uRW5kZWQobGlseS5oaXRjaChuLG4uX3N0b3BSaW5ndG9uZSkpLGUub25SZWZyZXNoKChmdW5jdGlvbihlKXtlLmdldFN0YXR1cygpLnR5cGUhPT10LkNvbnRhY3RTdGF0dXNUeXBlLkNPTk5FQ1RJTkcmJmUuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuSU5DT01JTkcmJm4uX3N0b3BSaW5ndG9uZSgpfSkpfSkpfSxuLnByb3RvdHlwZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50PWZ1bmN0aW9uKGUsbil7biYmbi5nZXRDb250YWN0SWQoKSYmdC5wdWJsaXNoTWV0cmljKHtuYW1lOmUsY29udGFjdElkOm4uZ2V0Q29udGFjdElkKCl9KX0sbi5wcm90b3R5cGUuc2V0T3V0cHV0RGV2aWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wbGF5YWJsZUF1ZGlvUHJvbWlzZT9Qcm9taXNlLnJhY2UoW3RoaXMuX3BsYXlhYmxlQXVkaW9Qcm9taXNlLG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe2Uuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtuKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgcGxheWFibGUgYXVkaW8iKX0pLDNlMyl9KSldKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5zZXRTaW5rSWQ/ZS5zZXRTaW5rSWQodCkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoYFJpbmd0b25lRW5naW5lQmFzZS5zZXRPdXRwdXREZXZpY2UgZmFpbGVkOiBhdWRpby5zZXRTaW5rSWQoKSBmYWlsZWQgd2l0aCBlcnJvciAke2V9YCl9KSk6UHJvbWlzZS5yZWplY3QoYFJpbmd0b25lRW5naW5lQmFzZS5zZXRPdXRwdXREZXZpY2UgZmFpbGVkOiAke2U/ImF1ZGlvIjoiYXVkaW8uc2V0U2lua0lkIn0gbm90IGZvdW5kLmApfSkpOmUuUHJvbWlzZT9Qcm9taXNlLnJlamVjdCgiTm90IGVsaWdpYmxlIHJpbmd0b25lIG93bmVyIik6dm9pZCAwfTt2YXIgcj1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKG4pe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5WT0lDRSYmbi5pc1NvZnRwaG9uZUNhbGwoKSYmbi5pc0luYm91bmQoKSYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIlJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX07dC5jb250YWN0KChmdW5jdGlvbihlKXtlLm9uQ29ubmVjdGluZyhuKX0pKSwobmV3IHQuQWdlbnQpLmdldENvbnRhY3RzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZuKGUpfSkpfTt2YXIgbz1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKG4pe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5DSEFUJiZuLmlzSW5ib3VuZCgpJiYwPT09bi5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZT0+ZS5nZXRUeXBlKCk9PT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UJiZlLmlzU2lsZW50TW9uaXRvcigpKSkubGVuZ3RoJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIkNoYXQgUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJDaGF0IFJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX07dC5jb250YWN0KChmdW5jdGlvbihlKXtlLm9uQ29ubmVjdGluZyhuKX0pKX07dmFyIGk9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1mdW5jdGlvbihuKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuVEFTSyYmbi5pc0luYm91bmQoKSYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJUYXNrIFJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiVGFzayBSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9O3QuY29udGFjdCgoZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpbmcobil9KSl9O3ZhciBzPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpfTsocy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXMscy5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QuY29udGFjdCgoZnVuY3Rpb24obil7bi5vbkluY29taW5nKChmdW5jdGlvbigpe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5RVUVVRV9DQUxMQkFDSyYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJDYWxsYmFjayBSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIkNhbGxiYWNrIFJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0pKX0pKX0sdC5Wb2ljZVJpbmd0b25lRW5naW5lPXIsdC5DaGF0UmluZ3RvbmVFbmdpbmU9byx0LlRhc2tSaW5ndG9uZUVuZ2luZT1pLHQuUXVldWVDYWxsYmFja1Jpbmd0b25lRW5naW5lPXN9KCl9LDY0MjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LGUuY2NwVmVyc2lvbj0iVjIiO2NvbnN0IG49IkNJVFJJWCI7dmFyIHI9e307clt0LlNvZnRwaG9uZUNhbGxUeXBlLkFVRElPX09OTFldPSJBdWRpbyIsclt0LlNvZnRwaG9uZUNhbGxUeXBlLlZJREVPX09OTFldPSJWaWRlbyIsclt0LlNvZnRwaG9uZUNhbGxUeXBlLkFVRElPX1ZJREVPXT0iQXVkaW9WaWRlbyIsclt0LlNvZnRwaG9uZUNhbGxUeXBlLk5PTkVdPSJOb25lIjt2YXIgbz0iYXVkaW9faW5wdXQiLGk9ImF1ZGlvX291dHB1dCI7KHt9KVt0LkNvbnRhY3RUeXBlLlZPSUNFXT0iVm9pY2UiO3ZhciBzPVtdLGE9W10sYz1bXSx1PXt9LGw9e30scD0wLGQ9MCxoPTAsZj0wLGc9MCxtPW51bGwsdj1udWxsLHk9bnVsbCxFPXQuU29mdHBob25lRXJyb3JUeXBlcyxTPXt9LGI9dC5yYW5kb21JZCgpLEM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULGUse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7bihlLnNvZnRwaG9uZVRyYW5zcG9ydC5zb2Z0cGhvbmVNZWRpYUNvbm5lY3Rpb25zKX0sZmFpbHVyZTpmdW5jdGlvbihlKXtlLm1lc3NhZ2UmJmUubWVzc2FnZS5pbmNsdWRlcygiU29mdHBob25lQ29ubmVjdGlvbkxpbWl0QnJlYWNoZWRFeGNlcHRpb24iKSYmTSgibXVsdGlwbGVfc29mdHBob25lX2FjdGl2ZV9zZXNzaW9ucyIsIk51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgYXJlIG1vcmUgdGhlbiBhbGxvd2VkIGxpbWl0LiIsIiIpLHIoRXJyb3IoInJlcXVlc3RJY2VBY2Nlc3MgZmFpbGVkIikpfSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe3IoRXJyb3IoIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCB3aGlsZSByZXF1ZXN0SWNlQWNjZXNzIikpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24oKXtyKEVycm9yKCJBY2Nlc3MgRGVuaWVkIHdoaWxlIHJlcXVlc3RJY2VBY2Nlc3MiKSl9fSl9KSl9LFQ9ZnVuY3Rpb24oZT17fSl7dmFyIHI9dGhpcztsZXQgbztpZigoeT1uZXcgUSh0LmdldExvZygpKSkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBzb2Z0cGhvbmUgbWFuYWdlciBpbml0aWFsaXphdGlvbiBoYXMgYmVndW4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHkuaW5mbyhgW1NvZnRwaG9uZU1hbmFnZXJdIENsaWVudCBQcm92aWRlZCBTdHJhdGVneTogJHtlLlZESVBsYXRmb3JtfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5WRElQbGF0Zm9ybSl0cnl7aWYoZS5WRElQbGF0Zm9ybSE9PW4pdGhyb3cgbmV3IEVycm9yKCJWREkgU3RyYXRlZ3kgbm90IHN1cHBvcnRlZCIpO289bmV3IHQuQ2l0cml4VkRJU3RyYXRlZ3kseS5pbmZvKGBbU29mdHBob25lTWFuYWdlcl0gU3RyYXRlZ3kgY29uc3RydWN0b3IgcmV0cmlldmVkOiAke299YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1jYXRjaChlKXt0aHJvdyJWREkgU3RyYXRlZ3kgbm90IHN1cHBvcnRlZCI9PT1lLm1lc3NhZ2U/KE0oRS5WRElfU1RSQVRFR1lfTk9UX1NVUFBPUlRFRCxlLm1lc3NhZ2UsIiIpLGUpOiJDaXRyaXggV2ViUlRDIHJlZGlyZWN0aW9uIGZlYXR1cmUgaXMgTk9UIHN1cHBvcnRlZCEiPT09ZS5tZXNzYWdlPyhNKEUuVkRJX1JFRElSX05PVF9TVVBQT1JURUQsZS5tZXNzYWdlLCIiKSxlKTooTShFLk9USEVSLGUubWVzc2FnZSwiIiksZSl9dmFyIGk7dC5SdGNQZWVyQ29ubmVjdGlvbkZhY3RvcnkmJihpPW8/bmV3IHQuUnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5KHksdC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSxiLHQuaGl0Y2gocixDLHt0cmFuc3BvcnRUeXBlOiJzb2Z0cGhvbmUiLHNvZnRwaG9uZUNsaWVudElkOmJ9KSx0LmhpdGNoKHIsTSksbyk6bmV3IHQuUnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5KHksdC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSxiLHQuaGl0Y2gocixDLHt0cmFuc3BvcnRUeXBlOiJzb2Z0cGhvbmUiLHNvZnRwaG9uZUNsaWVudElkOmJ9KSx0LmhpdGNoKHIsTSkpKSxULmlzQnJvd3NlclNvZnRQaG9uZVN1cHBvcnRlZCgpfHxNKEUuVU5TVVBQT1JURURfQlJPV1NFUiwiQ29ubmVjdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYnJvd3Nlci4gU29tZSBmdW5jdGlvbmFsaXR5IG1heSBub3Qgd29yay4gIiwiIikseCh7c3VjY2VzczpmdW5jdGlvbihlKXtGKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOiJncmFudGVkIn0pfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe00oZSwiWW91ciBtaWNyb3Bob25lIGlzIG5vdCBlbmFibGVkIGluIHlvdXIgYnJvd3Nlci4gIiwiIiksRigiQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQiLG51bGwse2Nvbm5lY3Rpdml0eUNoZWNrVHlwZToiTWljcm9waG9uZVBlcm1pc3Npb24iLHN0YXR1czoiZGVuaWVkIn0pfX0pO2NvbnN0IHM9QSgpLGE9XygpLGM9dyghZS5kaXNhYmxlRWNob0NhbmNlbGxhdGlvbik7UigpLHRoaXMucmluZ3RvbmVFbmdpbmU9bnVsbDt2YXIgdT17fSxsPXt9LHA9ITEsZD1udWxsLGg9bnVsbCxmPWZ1bmN0aW9uKCl7cD0hMSxkPW51bGwsaD1udWxsfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oZSl7cmV0dXJuIHVbZV19LHRoaXMucmVwbGFjZUxvY2FsTWVkaWFUcmFjaz1mdW5jdGlvbihlLHQpe3ZhciBuPVNbZV0uc3RyZWFtO2lmKG4pe3ZhciByPW4uZ2V0QXVkaW9UcmFja3MoKVswXTt0LmVuYWJsZWQ9ci5lbmFibGVkLHIuZW5hYmxlZD0hMSxuLnJlbW92ZVRyYWNrKHIpLG4uYWRkVHJhY2sodCl9fTt2YXIgZz1mdW5jdGlvbihlKXtpZih1Lmhhc093blByb3BlcnR5KGUpKXt2YXIgdD11W2VdO25ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe2RlbGV0ZSB1W2VdLGRlbGV0ZSBsW2VdLHQuaGFuZ3VwKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2xpbHkuZ2V0TG9nKCkud2FybigiQ2xlYW4gdXAgdGhlIHNlc3Npb24gbG9jYWxseSAiK2UsdC5tZXNzYWdlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpfX07dGhpcy5zdGFydFNlc3Npb249ZnVuY3Rpb24obixyKXt2YXIgcz1wP2Q6bixhPXA/aDpyO2lmKHMmJmEpe2YoKSxsW2FdPSEwLHkuaW5mbygiU29mdHBob25lIGNhbGwgZGV0ZWN0ZWQ6IiwiY29udGFjdElkICIrcy5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrYSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxmdW5jdGlvbihlKXtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCl7Zm9yKHZhciB0IGluIGUpZS5oYXNPd25Qcm9wZXJ0eSh0KSYmKHEoIk11bHRpU2Vzc2lvbkhhbmdVcCIsZVt0XS5jYWxsSWQsdCksZyh0KSk7dGhyb3cgbmV3IEVycm9yKCJkdXBsaWNhdGUgc2Vzc2lvbiBkZXRlY3RlZCwgcmVmdXNpbmcgdG8gc2V0dXAgbmV3IGNvbm5lY3Rpb24iKX19KHUpLHMuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmRigiU29mdHBob25lIENvbm5lY3RpbmciLHMuZ2V0Q29udGFjdElkKCkpLFcoKTt2YXIgYyxtLHY9cy5nZXRBZ2VudENvbm5lY3Rpb24oKS5nZXRTb2Z0cGhvbmVNZWRpYUluZm8oKSxFPVAodi5jYWxsQ29uZmlnSnNvbik7RS51c2VXZWJTb2NrZXRQcm92aWRlciYmKGM9dC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSksKG09bz9uZXcgdC5SVENTZXNzaW9uKEUuc2lnbmFsaW5nRW5kcG9pbnQsRS5pY2VTZXJ2ZXJzLHYuY2FsbENvbnRleHRUb2tlbix5LHMuZ2V0Q29udGFjdElkKCksYSxjLG8pOm5ldyB0LlJUQ1Nlc3Npb24oRS5zaWduYWxpbmdFbmRwb2ludCxFLmljZVNlcnZlcnMsdi5jYWxsQ29udGV4dFRva2VuLHkscy5nZXRDb250YWN0SWQoKSxhLGMpKS5lY2hvQ2FuY2VsbGF0aW9uPSFlLmRpc2FibGVFY2hvQ2FuY2VsbGF0aW9uLHVbYV09bSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbm5lY3Rpb25FdmVudHMuU0VTU0lPTl9JTklULGRhdGE6e2Nvbm5lY3Rpb25JZDphfX0pLG0ub25TZXNzaW9uRmFpbGVkPWZ1bmN0aW9uKGUsdCl7ZGVsZXRlIHVbYV0sZGVsZXRlIGxbYV0sRChlLHQpLFUocy5nZXRDb250YWN0SWQoKSx0KSxZKHMsZS5zZXNzaW9uUmVwb3J0KX0sbS5vblNlc3Npb25Db25uZWN0ZWQ9ZnVuY3Rpb24oZSl7RigiU29mdHBob25lIFNlc3Npb24gQ29ubmVjdGVkIixzLmdldENvbnRhY3RJZCgpKSx0LmJlY29tZU1hc3Rlcih0Lk1hc3RlclRvcGljcy5TRU5EX0xPR1MpLGooZSksVihzKSxJKHMpfSxtLm9uU2Vzc2lvbkNvbXBsZXRlZD1mdW5jdGlvbihlKXtGKCJTb2Z0cGhvbmUgU2Vzc2lvbiBDb21wbGV0ZWQiLHMuZ2V0Q29udGFjdElkKCkpLGRlbGV0ZSB1W2FdLGRlbGV0ZSBsW2FdLFkocyxlLnNlc3Npb25SZXBvcnQpLGsoYSl9LG0ub25Mb2NhbFN0cmVhbUFkZGVkPWZ1bmN0aW9uKGUsbil7U1thXT17c3RyZWFtOm59LHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuTE9DQUxfTUVESUFfU1RSRUFNX0NSRUFURUQsZGF0YTp7Y29ubmVjdGlvbklkOmF9fSl9LG0ucmVtb3RlQXVkaW9FbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZW1vdGUtYXVkaW8iKXx8d2luZG93LnBhcmVudC5wYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpLGk/bS5jb25uZWN0KGkuZ2V0KEUuaWNlU2VydmVycykpOm0uY29ubmVjdCgpfX07dmFyIG09ZnVuY3Rpb24oZSxuKXt1W25dJiZmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5FTkRFRHx8ZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5FUlJPUnx8ZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5NSVNTRUR9KGUpJiYoZyhuKSxmKCkpLCFlLmlzU29mdHBob25lQ2FsbCgpfHxsW25dfHxlLmdldFN0YXR1cygpLnR5cGUhPT10LkNvbnRhY3RTdGF0dXNUeXBlLkNPTk5FQ1RJTkcmJmUuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuSU5DT01JTkd8fCh0LmlzRmlyZWZveEJyb3dzZXIoKSYmdC5oYXNPdGhlckNvbm5lY3RlZENDUHMoKT9mdW5jdGlvbihlLHQpe3A9ITAsZD1lLGg9dH0oZSxuKTpyLnN0YXJ0U2Vzc2lvbihlLG4pKX0sdj1mdW5jdGlvbihlKXt2YXIgdD1lLmdldEFnZW50Q29ubmVjdGlvbigpLmNvbm5lY3Rpb25JZDt5LmluZm8oIkNvbnRhY3QgZGV0ZWN0ZWQ6IiwiY29udGFjdElkICIrZS5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrdCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxsW3RdfHwoZS5vblJlZnJlc2goKGZ1bmN0aW9uKCl7bShlLHQpfSkpLGUub25EZXN0cm95KChmdW5jdGlvbigpeyFmdW5jdGlvbihlKXt1W2VdJiZnKGUpfSh0KX0pKSl9O3Iub25Jbml0Q29udGFjdFN1Yj10LmNvbnRhY3QodiksKG5ldyB0LkFnZW50KS5nZXRDb250YWN0cygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QWdlbnRDb25uZWN0aW9uKCkuY29ubmVjdGlvbklkO3kuaW5mbygiQ29udGFjdCBleGlzdCBpbiB0aGUgc25hcHNob3QuIFJlaW5pdGlhdGUgdGhlIENvbnRhY3QgYW5kIFJUQyBzZXNzaW9uIGNyZWF0aW9uIGZvciBjb250YWN0SWQiK2UuZ2V0Q29udGFjdElkKCksImFnZW50IGNvbm5lY3Rpb25JZCAiK3QpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdihlKSxtKGUsdCl9KSksdGhpcy50ZXJtaW5hdGU9KCk9PntyLm9uSW5pdENvbnRhY3RTdWImJnIub25Jbml0Q29udGFjdFN1Yi51bnN1YnNjcmliZSYmci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlKCkscyYmcy51bnN1YnNjcmliZSYmcy51bnN1YnNjcmliZSgpLGEmJmEudW5zdWJzY3JpYmUmJmEudW5zdWJzY3JpYmUoKSxjJiZjLnVuc3Vic2NyaWJlJiZjLnVuc3Vic2NyaWJlKCksaS5jbGVhcklkbGVSdGNQZWVyQ29ubmVjdGlvblRpbWVySWQmJmkuY2xlYXJJZGxlUnRjUGVlckNvbm5lY3Rpb25UaW1lcklkKCksaT1udWxsfX0sST1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0VXBzdHJlYW0oKSxyPWUuZ2V0QWdlbnRDb25uZWN0aW9uKCk7aWYocil7dmFyIG89ci5nZXRTb2Z0cGhvbmVNZWRpYUluZm8oKTtvPyEwPT09by5hdXRvQWNjZXB0Pyh5LmluZm8oIkF1dG8tYWNjZXB0IGlzIGVuYWJsZWQsIHNlbmRpbmcgb3V0IEFjY2VwdGVkIGV2ZW50IHRvIHN0b3AgcmluZ3RvbmUuLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsZGF0YTpuZXcgdC5Db250YWN0KGUuY29udGFjdElkKX0pLG4uc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVELGUuY29udGFjdElkKSxkYXRhOm5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpfSkpOnkuaW5mbygiQXV0by1hY2NlcHQgaXMgZGlzYWJsZWQsIHJpbmd0b25lIHdpbGwgYmUgc3RvcHBlZCBieSB1c2VyIGFjdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnkuaW5mbygiTm90IGFibGUgdG8gcmV0cmlldmUgdGhlIGF1dG8tYWNjZXB0IHNldHRpbmcgZnJvbSBudWxsIFNvZnRwaG9uZU1lZGlhSW5mbywgaWdub3JpbmcgZXZlbnQgcHVibGlzaC4uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1lbHNlIHkuaW5mbygiTm90IGFibGUgdG8gcmV0cmlldmUgdGhlIGF1dG8tYWNjZXB0IHNldHRpbmcgZnJvbSBudWxsIEFnZW50Q29ubmVjdGlvbiwgaWdub3JpbmcgZXZlbnQgcHVibGlzaC4uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sQT1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuTVVURSxMKX0sXz1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9TUEVBS0VSX0RFVklDRSxOKX0sdz1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfTUlDUk9QSE9ORV9ERVZJQ0UsKHQ9Pk8oey4uLnQsZW5hYmxlRWNob0NhbmNlbGxhdGlvbjplfSkpKX0sUj1mdW5jdGlvbigpe3RyeXt0LmlzQ2hyb21lQnJvd3NlcigpJiZ0LmdldENocm9tZUJyb3dzZXJWZXJzaW9uKCk+NDMmJm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7bmFtZToibWljcm9waG9uZSJ9KS50aGVuKChmdW5jdGlvbihlKXtlLm9uY2hhbmdlPWZ1bmN0aW9uKCl7eS5pbmZvKCJNaWNyb3Bob25lIFBlcm1pc3Npb246ICIrZS5zdGF0ZSksRigiQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQiLG51bGwse2Nvbm5lY3Rpdml0eUNoZWNrVHlwZToiTWljcm9waG9uZVBlcm1pc3Npb24iLHN0YXR1czplLnN0YXRlfSksImRlbmllZCI9PT1lLnN0YXRlJiZNKEUuTUlDUk9QSE9ORV9OT1RfU0hBUkVELCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKX19KSl9Y2F0Y2goZSl7eS5lcnJvcigiRmFpbGVkIGluIGRldGVjdGluZyBtaWNyb3Bob25lIHBlcm1pc3Npb24gc3RhdHVzOiAiK2UpfX0saz1mdW5jdGlvbihlKXtkZWxldGUgU1tlXSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkFnZW50RXZlbnRzLk1VVEVfVE9HR0xFLGRhdGE6e211dGVkOiExfX0pfSxMPWZ1bmN0aW9uKGUpe3ZhciBuO2lmKDAhPT10LmtleXMoUykubGVuZ3RoKXtmb3IodmFyIHIgaW4gZSYmdm9pZCAwIT09ZS5tdXRlJiYobj1lLm11dGUpLFMpaWYoUy5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIG89U1tyXS5zdHJlYW07aWYobyl7dmFyIGk9by5nZXRBdWRpb1RyYWNrcygpWzBdO3ZvaWQgMCE9PW4/KGkuZW5hYmxlZD0hbixTW3JdLm11dGVkPW4sbj95LmluZm8oIkFnZW50IGhhcyBtdXRlZCB0aGUgY29udGFjdCwgY29ubmVjdGlvbklkIC0gICIrcikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTp5LmluZm8oIkFnZW50IGhhcyB1bm11dGVkIHRoZSBjb250YWN0LCBjb25uZWN0aW9uSWQgLSAiK3IpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOm49U1tyXS5tdXRlZHx8ITF9fXQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZGF0YTp7bXV0ZWQ6bn19KX19LE49ZnVuY3Rpb24oZT17fSl7Y29uc3Qgbj1lLmRldmljZUlkfHwiIjtpZih0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEF0dGVtcHRpbmcgdG8gc2V0IHNwZWFrZXIgZGV2aWNlICR7bn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4pe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZW1vdGUtYXVkaW8iKXx8d2luZG93LnBhcmVudC5wYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpO3ImJiJmdW5jdGlvbiI9PXR5cGVvZiByLnNldFNpbmtJZD9yLnNldFNpbmtJZChuKS50aGVuKCgoKT0+e3QuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU3BlYWtlciBkZXZpY2UgJHtufSBzdWNjZXNzZnVsbHkgc2V0IHRvIHNwZWFrZXIgYXVkaW8gZWxlbWVudGApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNQRUFLRVJfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6bn19KX0pKS5jYXRjaCgoZT0+e3QuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgc3BlYWtlciBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSk6dC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyByZW1vdGVBdWRpb0VsZW1lbnQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2UgdC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBkZXZpY2VJZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LE89ZnVuY3Rpb24oZT17fSl7Y29uc3Qgbj1lLmRldmljZUlkfHwiIjtpZih0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEF0dGVtcHRpbmcgdG8gc2V0IG1pY3JvcGhvbmUgZGV2aWNlICR7bn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDAhPT10LmtleXMoUykubGVuZ3RoKWlmKG4pe3ZhciByPXQuY29yZS5nZXRTb2Z0cGhvbmVNYW5hZ2VyKCksbz17YXVkaW86e2RldmljZUlkOntleGFjdDpufX19O2UuZW5hYmxlRWNob0NhbmNlbGxhdGlvbnx8KG8uYXVkaW8uZWNob0NhbmNlbGxhdGlvbj0hMSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJlY2hvQ2FuY2VsbGF0aW9uQ2hlY2siLGRhdGE6e2NvdW50OjEsZGlzYWJsZUVjaG9DYW5jZWxsYXRpb246IWUuZW5hYmxlRWNob0NhbmNlbGxhdGlvbn19KSxuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShvKS50aGVuKChlPT57dHJ5e3ZhciBvPWUuZ2V0QXVkaW9UcmFja3MoKVswXTtmb3IodmFyIGkgaW4gUylTLmhhc093blByb3BlcnR5KGkpJiYoU1tpXS5zdHJlYW0sci5nZXRTZXNzaW9uKGkpLl9wYy5nZXRTZW5kZXJzKClbMF0ucmVwbGFjZVRyYWNrKG8pLnRoZW4oKGZ1bmN0aW9uKCl7ci5yZXBsYWNlTG9jYWxNZWRpYVRyYWNrKGksbyksdC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBNaWNyb3Bob25lIGRldmljZSAke259IHN1Y2Nlc3NmdWxseSBzZXQgdG8gbG9jYWwgbWVkaWEgc3RyZWFtIGluIFJUQ1J0cFNlbmRlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkpfWNhdGNoKGUpe3JldHVybiB2b2lkIHQuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLk1JQ1JPUEhPTkVfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6bn19KX0pKS5jYXRjaCgoZT0+e3QuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgbWljcm9waG9uZSBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIGRldmljZUlkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTtlbHNlIHQuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU2V0dGluZyBtaWNyb3Bob25lIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgbG9jYWxNZWRpYVN0cmVhbSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LEQ9ZnVuY3Rpb24oZSxuKXtpZihuPT09dC5SVENFcnJvcnMuSUNFX0NPTExFQ1RJT05fVElNRU9VVCl7Zm9yKHZhciByPSJcbiIsbz0wO288ZS5faWNlU2VydmVycy5sZW5ndGg7bysrKWZvcih2YXIgaT0wO2k8ZS5faWNlU2VydmVyc1tvXS51cmxzLmxlbmd0aDtpKyspcj1yK2UuX2ljZVNlcnZlcnNbb10udXJsc1tpXSsiXG4iO00oRS5JQ0VfQ09MTEVDVElPTl9USU1FT1VULCJJY2UgY29sbGVjdGlvbiB0aW1lZG91dC4gIixyKX1lbHNlIG49PT10LlJUQ0Vycm9ycy5VU0VSX0JVU1k/TShFLlVTRVJfQlVTWV9FUlJPUiwiU29mdHBob25lIGNhbGwgVXNlckJ1c3kgZXJyb3IuICIsIiIpOm49PT10LlJUQ0Vycm9ycy5TSUdOQUxMSU5HX0hBTkRTSEFLRV9GQUlMVVJFP00oRS5TSUdOQUxMSU5HX0hBTkRTSEFLRV9GQUlMVVJFLCJIYW5kc2hha2luZyB3aXRoIFNpZ25hbGxpbmcgU2VydmVyICIrZS5fc2lnbmFsaW5nVXJpKyIgZmFpbGVkLiAiLGUuX3NpZ25hbGluZ1VyaSk6bj09PXQuUlRDRXJyb3JzLkdVTV9USU1FT1VUX0ZBSUxVUkV8fG49PT10LlJUQ0Vycm9ycy5HVU1fT1RIRVJfRkFJTFVSRT9NKEUuTUlDUk9QSE9ORV9OT1RfU0hBUkVELCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKTpuPT09dC5SVENFcnJvcnMuU0lHTkFMTElOR19DT05ORUNUSU9OX0ZBSUxVUkU/TShFLlNJR05BTExJTkdfQ09OTkVDVElPTl9GQUlMVVJFLCJVUkwgIitlLl9zaWduYWxpbmdVcmkrIiBjYW5ub3QgYmUgcmVhY2hlZC4gIixlLl9zaWduYWxpbmdVcmkpOm49PT10LlJUQ0Vycm9ycy5DQUxMX05PVF9GT1VORD95LmVycm9yKCJTb2Z0cGhvbmUgY2FsbCBmYWlsZWQgZHVlIHRvIENhbGxOb3RGb3VuZEV4Y2VwdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOk0oRS5XRUJSVENfRVJST1IsIndlYnJ0YyBzeXN0ZW0gZXJyb3IuICIsIiIpfSxQPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvJnF1b3Q7L2csJyInKTtyZXR1cm4gSlNPTi5wYXJzZSh0KX0seD1mdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0LnN1Y2Nlc3M9dC5zdWNjZXNzfHxmdW5jdGlvbigpe30sdC5mYWlsdXJlPXQuZmFpbHVyZXx8ZnVuY3Rpb24oKXt9O3ZhciBuPXthdWRpbzohMH0scj1udWxsO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlKXtpZigib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMmJiJmdW5jdGlvbiI9PXR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSlyPW5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG4pO2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEpcmV0dXJuIHZvaWQgdC5mYWlsdXJlKEUuVU5TVVBQT1JURURfQlJPV1NFUik7cj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSx0KXtuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhKG4sZSx0KX0pKX1yZXR1cm4gci50aGVuKChmdW5jdGlvbihlKXt2YXIgbj1lLmdldEF1ZGlvVHJhY2tzKCk7biYmbi5sZW5ndGg+MD90LnN1Y2Nlc3MoZSk6dC5mYWlsdXJlKEUuTUlDUk9QSE9ORV9OT1RfU0hBUkVEKX0pLChmdW5jdGlvbihlKXt0LmZhaWx1cmUoRS5NSUNST1BIT05FX05PVF9TSEFSRUQpfSkpLHJ9dC5mYWlsdXJlKEUuVU5TVVBQT1JURURfQlJPV1NFUil9LE09ZnVuY3Rpb24oZSxuLHIpe3kuZXJyb3IoIlNvZnRwaG9uZSBlcnJvciBvY2N1cnJlZCA6ICIsZSxufHwiIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkFnZW50RXZlbnRzLlNPRlRQSE9ORV9FUlJPUixkYXRhOm5ldyB0LlNvZnRwaG9uZUVycm9yKGUsbixyKX0pfSxVPWZ1bmN0aW9uKGUsdCl7RigiU29mdHBob25lIFNlc3Npb24gRmFpbGVkIixlLHtmYWlsZWRSZWFzb246dH0pfSxGPWZ1bmN0aW9uKGUsbixyKXt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxjb250YWN0SWQ6bixkYXRhOnJ9KX0scT1mdW5jdGlvbihlLHQsbil7RihlLHQsW3tuYW1lOiJBZ2VudENvbm5lY3Rpb25JZCIsdmFsdWU6bn1dKSx5LmluZm8oIlB1Ymxpc2ggbXVsdGlwbGUgc2Vzc2lvbiBlcnJvciBtZXRyaWNzIixlLCJjb250YWN0SWQgIit0LCJhZ2VudCBjb25uZWN0aW9uSWQgIituKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTtULmlzQnJvd3NlclNvZnRQaG9uZVN1cHBvcnRlZD1mdW5jdGlvbigpe3JldHVybiEhKHQuaXNPcGVyYUJyb3dzZXIoKSYmdC5nZXRPcGVyYUJyb3dzZXJWZXJzaW9uKCk+MTcpfHwhISh0LmlzQ2hyb21lQnJvd3NlcigpJiZ0LmdldENocm9tZUJyb3dzZXJWZXJzaW9uKCk+MjIpfHwhISh0LmlzRmlyZWZveEJyb3dzZXIoKSYmdC5nZXRGaXJlZm94QnJvd3NlclZlcnNpb24oKT4yMSl9O3ZhciBCPWZ1bmN0aW9uKGUpe3ZhciB0PXMuc2xpY2UoKTtzPVtdLHQubGVuZ3RoPjAmJmUuc2VuZFNvZnRwaG9uZU1ldHJpY3ModCx7c3VjY2VzczpmdW5jdGlvbigpe3kuaW5mbygic2VuZFNvZnRwaG9uZU1ldHJpY3Mgc3VjY2VzcyIrSlNPTi5zdHJpbmdpZnkodCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7eS5lcnJvcigic2VuZFNvZnRwaG9uZU1ldHJpY3MgZmFpbGVkLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KX0saj1mdW5jdGlvbihlKXttPXdpbmRvdy5zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtlLmdldFVzZXJBdWRpb1N0YXRzKCkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9dSxuPUcodT1lLHQsbyk7cy5wdXNoKG4pLEgobil9KSwoZnVuY3Rpb24oZSl7eS5kZWJ1ZygiRmFpbGVkIHRvIGdldCB1c2VyIGF1ZGlvIHN0YXRzLiIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSxlLmdldFJlbW90ZUF1ZGlvU3RhdHMoKS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD1sLG49RyhsPWUsdCxpKTtzLnB1c2gobiksSChuKX0pLChmdW5jdGlvbihlKXt5LmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHJlbW90ZSBhdWRpbyBzdGF0cy4iLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSwxZTMpfSxWPWZ1bmN0aW9uKGUpe3Y9d2luZG93LnNldEludGVydmFsKChmdW5jdGlvbigpe0IoZSl9KSwzZTQpfSxXPWZ1bmN0aW9uKCl7dT1udWxsLGw9bnVsbCxzPVtdLGE9W10sYz1bXSxtPW51bGwsdj1udWxsLHA9MCxkPTAsaD0wLGY9MCxnPTB9LEc9ZnVuY3Rpb24oZSx0LG4pe2lmKHQmJmUpe3ZhciByPWUucGFja2V0c0xvc3Q+dC5wYWNrZXRzTG9zdD9lLnBhY2tldHNMb3N0LXQucGFja2V0c0xvc3Q6MCxvPWUucGFja2V0c0NvdW50PnQucGFja2V0c0NvdW50P2UucGFja2V0c0NvdW50LXQucGFja2V0c0NvdW50OjA7cmV0dXJuIHoobyxuKSxLKGUuYXVkaW9MZXZlbCxuKSxuZXcgJChlLnRpbWVzdGFtcCxyLG8sbixlLmF1ZGlvTGV2ZWwsZS5qYk1pbGxpc2Vjb25kcyxlLnJ0dE1pbGxpc2Vjb25kcyl9cmV0dXJuIG5ldyAkKGUudGltZXN0YW1wLGUucGFja2V0c0xvc3QsZS5wYWNrZXRzQ291bnQsbixlLmF1ZGlvTGV2ZWwsZS5qYk1pbGxpc2Vjb25kcyxlLnJ0dE1pbGxpc2Vjb25kcyl9LEg9ZnVuY3Rpb24oZSl7aWYoZS5zb2Z0cGhvbmVTdHJlYW1UeXBlPT09byl7Zm9yKDthLmxlbmd0aD49MTA4MDA7KWEuc2hpZnQoKTthLnB1c2goZSl9ZWxzZSBpZihlLnNvZnRwaG9uZVN0cmVhbVR5cGU9PT1pKXtmb3IoO2MubGVuZ3RoPj0xMDgwMDspYy5zaGlmdCgpO2MucHVzaChlKX19LHo9ZnVuY3Rpb24oZSx0KXt0PT09bz8oZysrLGU8PTA/cCsrOnA9MCk6dD09PWkmJihlPD0wP2grKzpoPTApfSxLPWZ1bmN0aW9uKGUsdCl7dD09PW8/bnVsbCE9PWUmJmU8PTE/ZCsrOmQ9MDp0PT09aSYmKG51bGwhPT1lJiZlPD0xP2YrKzpmPTApfSxYPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwoZSksbnVsbH0sWT1mdW5jdGlvbihuLHIpe209WChtKSx2PVgodiksZnVuY3Rpb24obixyLHMsdSl7ci5zdHJlYW1TdGF0cz1bSihzLG8pLEoodSxpKV07dmFyIGw9e2NhbGxTdGFydFRpbWU6ci5zZXNzaW9uU3RhcnRUaW1lLGNhbGxFbmRUaW1lOnIuc2Vzc2lvbkVuZFRpbWUsZ3VtVGltZU1pbGxpczpyLmd1bVRpbWVNaWxsaXMsaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzOnIuaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzLGljZUNvbGxlY3Rpb25UaW1lTWlsbGlzOnIuaWNlQ29sbGVjdGlvblRpbWVNaWxsaXMsc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzOnIuc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzLGhhbmRzaGFraW5nVGltZU1pbGxpczpyLmhhbmRzaGFraW5nVGltZU1pbGxpcyxwcmVUYWxraW5nVGltZU1pbGxpczpyLnByZVRhbGtpbmdUaW1lTWlsbGlzLHRhbGtpbmdUaW1lTWlsbGlzOnIudGFsa2luZ1RpbWVNaWxsaXMsY2xlYW51cFRpbWVNaWxsaXM6ci5jbGVhbnVwVGltZU1pbGxpcyxpY2VDb2xsZWN0aW9uRmFpbHVyZTpyLmljZUNvbGxlY3Rpb25GYWlsdXJlLHNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZTpyLnNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZSxoYW5kc2hha2luZ0ZhaWx1cmU6ci5oYW5kc2hha2luZ0ZhaWx1cmUsZ3VtT3RoZXJGYWlsdXJlOnIuZ3VtT3RoZXJGYWlsdXJlLGd1bVRpbWVvdXRGYWlsdXJlOnIuZ3VtVGltZW91dEZhaWx1cmUsY3JlYXRlT2ZmZXJGYWlsdXJlOnIuY3JlYXRlT2ZmZXJGYWlsdXJlLHNldExvY2FsRGVzY3JpcHRpb25GYWlsdXJlOnIuc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmUsdXNlckJ1c3lGYWlsdXJlOnIudXNlckJ1c3lGYWlsdXJlLGludmFsaWRSZW1vdGVTRFBGYWlsdXJlOnIuaW52YWxpZFJlbW90ZVNEUEZhaWx1cmUsbm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlOnIubm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlLHNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZTpyLnNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOnIuc3RyZWFtU3RhdHN9O24uc2VuZFNvZnRwaG9uZVJlcG9ydChsLHtzdWNjZXNzOmZ1bmN0aW9uKCl7eS5pbmZvKCJzZW5kU29mdHBob25lUmVwb3J0IHN1Y2Nlc3MiK0pTT04uc3RyaW5naWZ5KGwpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3kuZXJyb3IoInNlbmRTb2Z0cGhvbmVSZXBvcnQgZmFpbGVkLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KTt2YXIgbT17QVVESU9fSU5QVVQ6e3BhY2tldHNDb3VudDphLm1hcCgoZT0+ZS5wYWNrZXRzQ291bnQpKSxwYWNrZXRzTG9zdDphLm1hcCgoZT0+ZS5wYWNrZXRzTG9zdCkpLGF1ZGlvTGV2ZWw6YS5tYXAoKGU9PmUuYXVkaW9MZXZlbCkpLGppdHRlckJ1ZmZlck1pbGxpczphLm1hcCgoZT0+ZS5qaXR0ZXJCdWZmZXJNaWxsaXMpKX0sQVVESU9fT1VUUFVUOntwYWNrZXRzQ291bnQ6Yy5tYXAoKGU9PmUucGFja2V0c0NvdW50KSkscGFja2V0c0xvc3Q6Yy5tYXAoKGU9PmUucGFja2V0c0xvc3QpKSxhdWRpb0xldmVsOmMubWFwKChlPT5lLmF1ZGlvTGV2ZWwpKSxqaXR0ZXJCdWZmZXJNaWxsaXM6Yy5tYXAoKGU9PmUuaml0dGVyQnVmZmVyTWlsbGlzKSkscm91bmRUcmlwVGltZU1pbGxpczpjLm1hcCgoZT0+ZS5yb3VuZFRyaXBUaW1lTWlsbGlzKSl9fSx2PXsuLi5sLHNvZnRwaG9uZVN0cmVhbVBlclNlY29uZFN0YXRpc3RpY3M6bSxpY2VDb25uZWN0aW9uc0xvc3Q6ci5pY2VDb25uZWN0aW9uc0xvc3QsaWNlQ29ubmVjdGlvbnNGYWlsZWQ6ci5pY2VDb25uZWN0aW9uc0ZhaWxlZHx8bnVsbCxwZWVyQ29ubmVjdGlvbkZhaWxlZDpyLnBlZXJDb25uZWN0aW9uRmFpbGVkfHxudWxsLHJ0Y0pzVmVyc2lvbjpyLnJ0Y0pzVmVyc2lvbnx8bnVsbCxjb25zZWN1dGl2ZU5vQXVkaW9JbnB1dFBhY2tldHM6cCxjb25zZWN1dGl2ZUxvd0lucHV0QXVkaW9MZXZlbDpkLGNvbnNlY3V0aXZlTm9BdWRpb091dHB1dFBhY2tldHM6aCxjb25zZWN1dGl2ZUxvd091dHB1dEF1ZGlvTGV2ZWw6ZixhdWRpb0lucHV0Q29ubmVjdGVkRHVyYXRpb25TZWNvbmRzOmd9O3QucHVibGlzaFNvZnRwaG9uZVJlcG9ydCh7Y29udGFjdElkOm4uZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24scmVwb3J0OnZ9KSx5LmluZm8oInNlbnQgVGVsZW1ldHJ5Q2FsbFJlcG9ydCAiK0pTT04uc3RyaW5naWZ5KHYpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfShuLHIsSih1LG8pLEoobCxpKSksQihuKX0sJD1mdW5jdGlvbihlLHQsbixyLG8saSxzKXt0aGlzLnNvZnRwaG9uZVN0cmVhbVR5cGU9cix0aGlzLnRpbWVzdGFtcD1lLHRoaXMucGFja2V0c0xvc3Q9dCx0aGlzLnBhY2tldHNDb3VudD1uLHRoaXMuYXVkaW9MZXZlbD1vLHRoaXMuaml0dGVyQnVmZmVyTWlsbGlzPWksdGhpcy5yb3VuZFRyaXBUaW1lTWlsbGlzPXN9LEo9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3ICQoKGU9ZXx8e30pLnRpbWVzdGFtcCxlLnBhY2tldHNMb3N0LGUucGFja2V0c0NvdW50LHQsZS5hdWRpb0xldmVsKX0sUT1mdW5jdGlvbihlKXt0aGlzLl9vcmlnaW5hbExvZ2dlcj1lO3ZhciBuPXRoaXM7dGhpcy5fdGVlPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzWzBdKSxvPSIiO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKCl7bys9IiAlcyJ9KSksci5hcHBseShuLl9vcmlnaW5hbExvZ2dlcixbdC5Mb2dDb21wb25lbnQuU09GVFBIT05FLG9dLmNvbmNhdChlKSl9fX07US5wcm90b3R5cGUuZGVidWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDEsdGhpcy5fb3JpZ2luYWxMb2dnZXIuZGVidWcpKGFyZ3VtZW50cyl9LFEucHJvdG90eXBlLmluZm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDIsdGhpcy5fb3JpZ2luYWxMb2dnZXIuaW5mbykoYXJndW1lbnRzKX0sUS5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSgzLHRoaXMuX29yaWdpbmFsTG9nZ2VyLmxvZykoYXJndW1lbnRzKX0sUS5wcm90b3R5cGUud2Fybj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoNCx0aGlzLl9vcmlnaW5hbExvZ2dlci53YXJuKShhcmd1bWVudHMpfSxRLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoNSx0aGlzLl9vcmlnaW5hbExvZ2dlci5lcnJvcikoYXJndW1lbnRzKX0sdC5Tb2Z0cGhvbmVNYW5hZ2VyPVR9KCl9LDk0NDooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1mdW5jdGlvbigpe3JldHVybiB0LmNhY2hlLmhhc093blByb3BlcnR5KGFyZ3VtZW50c1swXSl8fCh0LmNhY2hlW2FyZ3VtZW50c1swXV09dC5wYXJzZShhcmd1bWVudHNbMF0pKSx0LmZvcm1hdC5jYWxsKG51bGwsdC5jYWNoZVthcmd1bWVudHNbMF1dLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHIoZSx0KXtmb3IodmFyIG49W107dD4wO25bLS10XT1lKTtyZXR1cm4gbi5qb2luKCIiKX10LmZvcm1hdD1mdW5jdGlvbihlLG8pe3ZhciBpLHMsYSxjLHUsbCxwLGQ9MSxoPWUubGVuZ3RoLGY9IiIsZz1bXTtmb3Iocz0wO3M8aDtzKyspaWYoInN0cmluZyI9PT0oZj1uKGVbc10pKSlnLnB1c2goZVtzXSk7ZWxzZSBpZigiYXJyYXkiPT09Zil7aWYoKGM9ZVtzXSlbMl0pZm9yKGk9b1tkXSxhPTA7YTxjWzJdLmxlbmd0aDthKyspe2lmKCFpLmhhc093blByb3BlcnR5KGNbMl1bYV0pKXRocm93IHQoJ1tzcHJpbnRmXSBwcm9wZXJ0eSAiJXMiIGRvZXMgbm90IGV4aXN0JyxjWzJdW2FdKTtpPWlbY1syXVthXV19ZWxzZSBpPWNbMV0/b1tjWzFdXTpvW2QrK107aWYoL1tec10vLnRlc3QoY1s4XSkmJiJudW1iZXIiIT1uKGkpKXRocm93IHQoIltzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlcyIsbihpKSk7c3dpdGNoKGNbOF0pe2Nhc2UiYiI6aT1pLnRvU3RyaW5nKDIpO2JyZWFrO2Nhc2UiYyI6aT1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpO2JyZWFrO2Nhc2UiZCI6aT1wYXJzZUludChpLDEwKTticmVhaztjYXNlImUiOmk9Y1s3XT9pLnRvRXhwb25lbnRpYWwoY1s3XSk6aS50b0V4cG9uZW50aWFsKCk7YnJlYWs7Y2FzZSJmIjppPWNbN10/cGFyc2VGbG9hdChpKS50b0ZpeGVkKGNbN10pOnBhcnNlRmxvYXQoaSk7YnJlYWs7Y2FzZSJvIjppPWkudG9TdHJpbmcoOCk7YnJlYWs7Y2FzZSJzIjppPShpPVN0cmluZyhpKSkmJmNbN10/aS5zdWJzdHJpbmcoMCxjWzddKTppO2JyZWFrO2Nhc2UidSI6aT4+Pj0wO2JyZWFrO2Nhc2UieCI6aT1pLnRvU3RyaW5nKDE2KTticmVhaztjYXNlIlgiOmk9aS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1pPS9bZGVmXS8udGVzdChjWzhdKSYmY1szXSYmaT49MD8iKyIraTppLGw9Y1s0XT8iMCI9PWNbNF0/IjAiOmNbNF0uY2hhckF0KDEpOiIgIixwPWNbNl0tU3RyaW5nKGkpLmxlbmd0aCx1PWNbNl0/cihsLHApOiIiLGcucHVzaChjWzVdP2krdTp1K2kpfXJldHVybiBnLmpvaW4oIiIpfSx0LmNhY2hlPXt9LHQucGFyc2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUsbj1bXSxyPVtdLG89MDt0Oyl7aWYobnVsbCE9PShuPS9eW15ceDI1XSsvLmV4ZWModCkpKXIucHVzaChuWzBdKTtlbHNlIGlmKG51bGwhPT0obj0vXlx4MjV7Mn0vLmV4ZWModCkpKXIucHVzaCgiJSIpO2Vsc2V7aWYobnVsbD09PShuPS9eXHgyNSg/OihbMS05XVxkKilcJHxcKChbXlwpXSspXCkpPyhcKyk/KDB8J1teJF0pPygtKT8oXGQrKT8oPzpcLihcZCspKT8oW2ItZm9zdXhYXSkvLmV4ZWModCkpKXRocm93IltzcHJpbnRmXSBodWg/IjtpZihuWzJdKXtvfD0xO3ZhciBpPVtdLHM9blsyXSxhPVtdO2lmKG51bGw9PT0oYT0vXihbYS16X11bYS16X1xkXSopL2kuZXhlYyhzKSkpdGhyb3ciW3NwcmludGZdIGh1aD8iO2ZvcihpLnB1c2goYVsxXSk7IiIhPT0ocz1zLnN1YnN0cmluZyhhWzBdLmxlbmd0aCkpOylpZihudWxsIT09KGE9L15cLihbYS16X11bYS16X1xkXSopL2kuZXhlYyhzKSkpaS5wdXNoKGFbMV0pO2Vsc2V7aWYobnVsbD09PShhPS9eXFsoXGQrKVxdLy5leGVjKHMpKSl0aHJvdyJbc3ByaW50Zl0gaHVoPyI7aS5wdXNoKGFbMV0pfW5bMl09aX1lbHNlIG98PTI7aWYoMz09PW8pdGhyb3ciW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCI7ci5wdXNoKG4pfXQ9dC5zdWJzdHJpbmcoblswXS5sZW5ndGgpfXJldHVybiByfSxlLnNwcmludGY9dCxlLnZzcHJpbnRmPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4ocj1uLnNsaWNlKDApKS5zcGxpY2UoMCwwLGUpLHQuYXBwbHkobnVsbCxyKX19KCl9LDgyOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcn0sbi5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyB0Lk5vdEltcGxlbWVudGVkRXJyb3J9O3ZhciByPWZ1bmN0aW9uKCl7bi5jYWxsKHRoaXMpfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe30sci5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt9O3ZhciBvPWZ1bmN0aW9uKGUsdCl7bi5jYWxsKHRoaXMpLHRoaXMud2luZG93PWUsdGhpcy5kb21haW49dHx8IioifTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLndpbmRvdy5wb3N0TWVzc2FnZShlLHRoaXMuZG9tYWluKX0sby5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGUpfTt2YXIgaT1mdW5jdGlvbihlLHQscil7bi5jYWxsKHRoaXMpLHRoaXMuaW5wdXQ9ZSx0aGlzLm91dHB1dD10LHRoaXMuZG9tYWluPXJ8fCIqIn07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhpcy5vdXRwdXQucG9zdE1lc3NhZ2UoZSx0aGlzLmRvbWFpbil9LGkucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCh0PT57dC5zb3VyY2U9PT10aGlzLm91dHB1dCYmZSh0KX0pKX07dmFyIHM9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMpLHRoaXMucG9ydD1lLHRoaXMuaWQ9dC5yYW5kb21JZCgpfTsocy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXMscy5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnBvcnQucG9zdE1lc3NhZ2UoZSl9LHMucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSl9LHMucHJvdG90eXBlLmdldElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9O3ZhciBhPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzKSx0aGlzLnN0cmVhbU1hcD1lP3QuaW5kZXgoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SWQoKX0pKTp7fSx0aGlzLm1lc3NhZ2VMaXN0ZW5lcnM9W119OyhhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMuZ2V0U3RyZWFtcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RyeXt0LnNlbmQoZSl9Y2F0Y2goZSl7fX0pKX0sYS5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMubWVzc2FnZUxpc3RlbmVycy5wdXNoKGUpLHRoaXMuZ2V0U3RyZWFtcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Qub25NZXNzYWdlKGUpfSkpfSxhLnByb3RvdHlwZS5hZGRTdHJlYW09ZnVuY3Rpb24oZSl7dGhpcy5zdHJlYW1NYXBbZS5nZXRJZCgpXT1lLHRoaXMubWVzc2FnZUxpc3RlbmVycy5mb3JFYWNoKChmdW5jdGlvbih0KXtlLm9uTWVzc2FnZSh0KX0pKX0sYS5wcm90b3R5cGUucmVtb3ZlU3RyZWFtPWZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzLnN0cmVhbU1hcFtlLmdldElkKCldfSxhLnByb3RvdHlwZS5nZXRTdHJlYW1zPWZ1bmN0aW9uKGUpe3JldHVybiB0LnZhbHVlcyh0aGlzLnN0cmVhbU1hcCl9LGEucHJvdG90eXBlLmdldFN0cmVhbUZvclBvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZmluZCh0aGlzLmdldFN0cmVhbXMoKSwoZnVuY3Rpb24odCl7cmV0dXJuIHQucG9ydD09PWV9KSl9O3ZhciBjPWZ1bmN0aW9uKGUsbixvKXt0aGlzLm5hbWU9ZSx0aGlzLnVwc3RyZWFtPW58fG5ldyByLHRoaXMuZG93bnN0cmVhbT1vfHxuZXcgcix0aGlzLmRvd25zdHJlYW1CdXM9bmV3IHQuRXZlbnRCdXMsdGhpcy51cHN0cmVhbUJ1cz1uZXcgdC5FdmVudEJ1cyx0aGlzLnVwc3RyZWFtLm9uTWVzc2FnZSh0LmhpdGNoKHRoaXMsdGhpcy5fZGlzcGF0Y2hFdmVudCx0aGlzLnVwc3RyZWFtQnVzKSksdGhpcy5kb3duc3RyZWFtLm9uTWVzc2FnZSh0LmhpdGNoKHRoaXMsdGhpcy5fZGlzcGF0Y2hFdmVudCx0aGlzLmRvd25zdHJlYW1CdXMpKX07Yy5wcm90b3R5cGUub25VcHN0cmVhbT1mdW5jdGlvbihlLG4pe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMudXBzdHJlYW1CdXMuc3Vic2NyaWJlKGUsbil9LGMucHJvdG90eXBlLm9uQWxsVXBzdHJlYW09ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihlKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLnVwc3RyZWFtQnVzLnN1YnNjcmliZUFsbChlKX0sYy5wcm90b3R5cGUub25Eb3duc3RyZWFtPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5kb3duc3RyZWFtQnVzLnN1YnNjcmliZShlLG4pfSxjLnByb3RvdHlwZS5vbkFsbERvd25zdHJlYW09ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihlKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLmRvd25zdHJlYW1CdXMuc3Vic2NyaWJlQWxsKGUpfSxjLnByb3RvdHlwZS5zZW5kVXBzdHJlYW09ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdGhpcy51cHN0cmVhbS5zZW5kKHtldmVudDplLGRhdGE6bn0pfSxjLnByb3RvdHlwZS5zZW5kRG93bnN0cmVhbT1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0aGlzLmRvd25zdHJlYW0uc2VuZCh7ZXZlbnQ6ZSxkYXRhOm59KX0sYy5wcm90b3R5cGUuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmRhdGE7bi5ldmVudCYmZS50cmlnZ2VyKG4uZXZlbnQsbi5kYXRhKX0sYy5wcm90b3R5cGUucGFzc1Vwc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtlLnVwc3RyZWFtLnNlbmQoe2V2ZW50Om4sZGF0YTp0fSl9fSxjLnByb3RvdHlwZS5wYXNzRG93bnN0cmVhbT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZS5kb3duc3RyZWFtLnNlbmQoe2V2ZW50Om4sZGF0YTp0fSl9fSxjLnByb3RvdHlwZS5zaHV0ZG93bj1mdW5jdGlvbigpe3RoaXMudXBzdHJlYW1CdXMudW5zdWJzY3JpYmVBbGwoKSx0aGlzLmRvd25zdHJlYW1CdXMudW5zdWJzY3JpYmVBbGwoKX07dmFyIHU9ZnVuY3Rpb24oZSx0LG4scil7Yy5jYWxsKHRoaXMsZSxuZXcgaSh0LG4uY29udGVudFdpbmRvdyxyfHwiKiIpLG51bGwpfTsodS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXUsdC5TdHJlYW09bix0Lk51bGxTdHJlYW09cix0LldpbmRvd1N0cmVhbT1vLHQuV2luZG93SU9TdHJlYW09aSx0LlBvcnRTdHJlYW09cyx0LlN0cmVhbU11bHRpcGxleGVyPWEsdC5Db25kdWl0PWMsdC5JRnJhbWVDb25kdWl0PXV9KCl9LDgzMzooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJ0b1N0YXRlIiksdGhpcy5mcm9tU3RhdGU9ZSx0aGlzLnRvU3RhdGU9bn07bi5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUpe3Rocm93IHQuTm90SW1wbGVtZW50ZWRFcnJvcigpfSxuLnByb3RvdHlwZS5nZXRGcm9tU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mcm9tU3RhdGV9LG4ucHJvdG90eXBlLmdldFRvU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0YXRlfTt2YXIgcj1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJ0b1N0YXRlIiksdC5hc3NlcnROb3ROdWxsKG8sImFzc29jaWF0aW9ucyIpLG4uY2FsbCh0aGlzLGUsciksdGhpcy5hc3NvY2lhdGlvbnM9b307KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbnN9O3ZhciBvPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKHIsInRvU3RhdGUiKSx0LmFzc2VydE5vdE51bGwobywiY2xvc3VyZSIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obyksImNsb3N1cmUgbXVzdCBiZSBhIGZ1bmN0aW9uIiksbi5jYWxsKHRoaXMsZSxyKSx0aGlzLmNsb3N1cmU9b307KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zdXJlKGUsdGhpcy5nZXRGcm9tU3RhdGUoKSx0aGlzLmdldFRvU3RhdGUoKSl9O3ZhciBpPWZ1bmN0aW9uKCl7dGhpcy5mcm9tTWFwPXt9fTtpLkFOWT0iPDxhbnk+PiIsaS5wcm90b3R5cGUuYXNzb2M9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJmcm9tU3RhdGVPYmogaXMgbm90IGRlZmluZWQuIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJ0b1N0YXRlT2JqIGlzIG5vdCBkZWZpbmVkLiIpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiYXNzb2NPYmogaXMgbm90IGRlZmluZWQuIik7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheT9lLmZvckVhY2goKGZ1bmN0aW9uKGUpe2kuYXNzb2MoZSx0LG4pfSkpOnQgaW5zdGFuY2VvZiBBcnJheT90LmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuYXNzb2MoZSx0LG4pfSkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP3RoaXMuX2FkZEFzc29jaWF0aW9uKG5ldyBvKGUsdCxuKSk6biBpbnN0YW5jZW9mIEFycmF5P3RoaXMuX2FkZEFzc29jaWF0aW9uKG5ldyByKGUsdCxuKSk6dGhpcy5fYWRkQXNzb2NpYXRpb24obmV3IHIoZSx0LFtuXSkpLHRoaXN9LGkucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlLG4scil7dC5hc3NlcnROb3ROdWxsKG4sImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJ0b1N0YXRlIik7dmFyIG89W10scz10aGlzLmZyb21NYXBbaS5BTlldfHx7fSxhPXRoaXMuZnJvbU1hcFtuXXx8e307cmV0dXJuIG89KG89by5jb25jYXQodGhpcy5fZ2V0QXNzb2NpYXRpb25zRnJvbU1hcChzLGUsbixyKSkpLmNvbmNhdCh0aGlzLl9nZXRBc3NvY2lhdGlvbnNGcm9tTWFwKGEsZSxuLHIpKX0saS5wcm90b3R5cGUuX2FkZEFzc29jaWF0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZnJvbU1hcFtlLmdldEZyb21TdGF0ZSgpXTt0fHwodD10aGlzLmZyb21NYXBbZS5nZXRGcm9tU3RhdGUoKV09e30pO3ZhciBuPXRbZS5nZXRUb1N0YXRlKCldO258fChuPXRbZS5nZXRUb1N0YXRlKCldPVtdKSxuLnB1c2goZSl9LGkucHJvdG90eXBlLl9nZXRBc3NvY2lhdGlvbnNGcm9tTWFwPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybihlW2kuQU5ZXXx8W10pLmNvbmNhdChlW3JdfHxbXSkucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiBlLmNvbmNhdChuLmdldEFzc29jaWF0aW9ucyh0KSl9KSxbXSl9LHQuRXZlbnRHcmFwaD1pfSgpfSw4OTE6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1uYXZpZ2F0b3IudXNlckFnZW50LHI9WyJidWJibGVzIiwiY2FuY2VsQnViYmxlIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwiZGF0YSIsImRlZmF1bHRQcmV2ZW50ZWQiLCJldmVudFBoYXNlIiwiaXNUcnVzdGVkIiwibGFzdEV2ZW50SWQiLCJvcmlnaW4iLCJyZXR1cm5WYWx1ZSIsInRpbWVTdGFtcCIsInR5cGUiXTt0LnNwcmludGY9ZS5zcHJpbnRmLHQudnNwcmludGY9ZS52c3ByaW50ZixkZWxldGUgZS5zcHJpbnRmLGRlbGV0ZSBlLnZzcHJpbnRmLHQuSFRUUF9TVEFUVVNfQ09ERVM9e1NVQ0NFU1M6MjAwLFVOQVVUSE9SSVpFRDo0MDEsQUNDRVNTX0RFTklFRDo0MDMsVE9PX01BTllfUkVRVUVTVFM6NDI5LElOVEVSTkFMX1NFUlZFUl9FUlJPUjo1MDB9LHQuVFJBTlNQT1JUX1RZUEVTPXtDSEFUX1RPS0VOOiJjaGF0X3Rva2VuIixXRUJfU09DS0VUOiJ3ZWJfc29ja2V0IixBR0VOVF9ESVNDT1ZFUlk6ImFnZW50X2Rpc2NvdmVyeSIsV0VCX1JUQzoid2ViX3J0YyJ9LHQuaGl0Y2g9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLG49ZS5zaGlmdCgpLHI9ZS5zaGlmdCgpO3JldHVybiB0LmFzc2VydE5vdE51bGwobiwic2NvcGUiKSx0LmFzc2VydE5vdE51bGwociwibWV0aG9kIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihyKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gci5hcHBseShuLGUuY29uY2F0KHQpKX19LHQuaXNGdW5jdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLmNvbnN0cnVjdG9yJiZlLmNhbGwmJmUuYXBwbHkpfSx0LmlzQXJyYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX0sdC5rZXlzPWZ1bmN0aW9uKGUpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiB0LmFzc2VydE5vdE51bGwoZSwibWFwIiksZSluLnB1c2gocik7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKGUpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiB0LmFzc2VydE5vdE51bGwoZSwibWFwIiksZSluLnB1c2goZVtyXSk7cmV0dXJuIG59LHQuZW50cmllcz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gZSl0LnB1c2goe2tleTpuLHZhbHVlOmVbbl19KTtyZXR1cm4gdH0sdC5tZXJnZT1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuZW50cmllcyhlKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW2Uua2V5XT1lLnZhbHVlfSkpfSkpLG59LHQubm93PWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHQuZmluZD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKHQoZVtuXSkpcmV0dXJuIGVbbl07cmV0dXJuIG51bGx9LHQuY29udGFpbnM9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P251bGwhPXQuZmluZChlLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW59KSk6biBpbiBlfSx0LmNvbnRhaW5zVmFsdWU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P251bGwhPXQuZmluZChlLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW59KSk6bnVsbCE9dC5maW5kKHQudmFsdWVzKGUpLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW59KSl9LHQucmFuZG9tSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdC5zcHJpbnRmKCIlcy0lcyIsdC5ub3coKSxNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSl9LHQubWFrZUVudW09ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKC9cLj8oW2Etel0rKV8/L2csKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKSsiXyJ9KSkucmVwbGFjZSgvXyQvLCIiKTt0W25dPWV9KSksdH0sdC5tYWtlTmFtZXNwYWNlZEVudW09ZnVuY3Rpb24oZSxuKXt2YXIgcj10Lm1ha2VFbnVtKG4pO3JldHVybiB0LmtleXMocikuZm9yRWFjaCgoZnVuY3Rpb24obil7cltuXT10LnNwcmludGYoIiVzOjolcyIsZSxyW25dKX0pKSxyfSx0Lm1ha2VHZW5lcmljTmFtZXNwYWNlZEVudW09ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQubWFrZUVudW0obik7cmV0dXJuIHQua2V5cyhvKS5mb3JFYWNoKChmdW5jdGlvbihuKXtvW25dPXQuc3ByaW50ZigiJXMiK3IrIiVzIixlLG9bbl0pfSkpLG99LHQuaXNDaHJvbWVCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIkNocm9tZSIpfSx0LmlzRmlyZWZveEJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiRmlyZWZveCIpfSx0LmlzT3BlcmFCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIk9wZXJhIil9LHQuaXNFZGdlQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09bi5pbmRleE9mKCJFZGciKX0sdC5nZXRDaHJvbWVCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW4uc3Vic3RyaW5nKG4uaW5kZXhPZigiQ2hyb21lIikrNyk7cmV0dXJuIGU/cGFyc2VGbG9hdChlKTotMX0sdC5nZXRGaXJlZm94QnJvd3NlclZlcnNpb249ZnVuY3Rpb24oKXt2YXIgZT1uLnN1YnN0cmluZyhuLmluZGV4T2YoIkZpcmVmb3giKSs4KTtyZXR1cm4gZT9wYXJzZUZsb2F0KGUpOi0xfSx0LmlzVmFsaWRMb2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuW3tpZDoiZW5fVVMiLGxhYmVsOiJFbmdsaXNoIn0se2lkOiJkZV9ERSIsbGFiZWw6IkRldXRzY2gifSx7aWQ6ImVzX0VTIixsYWJlbDoiRXNwYcOxb2wifSx7aWQ6ImZyX0ZSIixsYWJlbDoiRnJhbsOnYWlzIn0se2lkOiJqYV9KUCIsbGFiZWw6IuaXpeacrOiqniJ9LHtpZDoiaXRfSVQiLGxhYmVsOiJJdGFsaWFubyJ9LHtpZDoia29fS1IiLGxhYmVsOiLtlZzqta3slrQifSx7aWQ6InB0X0JSIixsYWJlbDoiUG9ydHVndcOqcyJ9LHtpZDoiemhfQ04iLGxhYmVsOiLkuK3mloco566A5L2TKSJ9LHtpZDoiemhfVFciLGxhYmVsOiLkuK3mloco57mB6auUKSJ9XS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkfSkpLmluY2x1ZGVzKGUpfSx0LmdldE9wZXJhQnJvd3NlclZlcnNpb249ZnVuY3Rpb24oKXt2YXIgZT1uLmluZGV4T2YoIk9wZXJhIiksdD0tMSE9PW4uaW5kZXhPZigiVmVyc2lvbiIpP24uc3Vic3RyaW5nKGUrOCk6bi5zdWJzdHJpbmcoZSs2KTtyZXR1cm4gdD9wYXJzZUZsb2F0KHQpOi0xfSx0LmluZGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7blt0KGUpXT1lfSkpLG59LHQuc2V0PWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbZV09MX0pKSx0fSx0LnJlbGF0aXZlQ29tcGxlbWVudD1mdW5jdGlvbihlLG4pe3ZhciByPXt9O3JldHVybiB0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dCBpbiBlfHwoclt0XT1uW3RdKX0pKSxyfSx0LmFzc2VydFRydWU9ZnVuY3Rpb24oZSxuKXtpZighZSl0aHJvdyBuZXcgdC5WYWx1ZUVycm9yKG4pfSx0LmFzc2VydE5vdE51bGw9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKG51bGwhPWUmJnZvaWQgMCE9PXR5cGVvZiBlLHQuc3ByaW50ZigiJXMgbXVzdCBiZSBwcm92aWRlZCIsbnx8IkEgdmFsdWUiKSksZX0sdC5kZWVwY29weT1mdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSl9LHQuZGVlcGNvcHlDcm9zc09yaWdpbkV2ZW50PWZ1bmN0aW9uKGUpe2NvbnN0IG49e307cmV0dXJuIHIuZm9yRWFjaCgocj0+e3RyeXtuW3JdPWVbcl19Y2F0Y2goZSl7dC5nZXRMb2coKS5pbmZvKCJkZWVwY29weUNyb3NzT3JpZ2luRXZlbnQgZmFpbGVkIG9uIGtleTogIixyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSx0LmRlZXBjb3B5KG4pfSx0LmdldEJhc2VVcmw9ZnVuY3Rpb24oKXt2YXIgbj1lLmxvY2F0aW9uO3JldHVybiB0LnNwcmludGYoIiVzLy8lczolcyIsbi5wcm90b2NvbCxuLmhvc3RuYW1lLG4ucG9ydCl9LHQuZ2V0VXJsV2l0aFByb3RvY29sPWZ1bmN0aW9uKG4pe3ZhciByPWUubG9jYXRpb24ucHJvdG9jb2w7cmV0dXJuIG4uc3Vic3RyKDAsci5sZW5ndGgpIT09cj90LnNwcmludGYoIiVzLy8lcyIscixuKTpufSx0LmlzRnJhbWVkPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB3aW5kb3cuc2VsZiE9PXdpbmRvdy50b3B9Y2F0Y2goZSl7cmV0dXJuITB9fSx0Lmhhc090aGVyQ29ubmVjdGVkQ0NQcz1mdW5jdGlvbigpe3JldHVybiB0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz4xfSx0LmZldGNoPWZ1bmN0aW9uKGUsbixyLG8pe3JldHVybiBvPW98fDUscj1yfHwxZTMsbj1ufHx7fSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXshZnVuY3Rpb24gbyhhKXtmZXRjaChlLG4pLnRoZW4oKGZ1bmN0aW9uKGUpe2Uuc3RhdHVzPT09dC5IVFRQX1NUQVRVU19DT0RFUy5TVUNDRVNTP2UuanNvbigpLnRoZW4oKGU9PmkoZSkpKS5jYXRjaCgoKCk9Pmkoe30pKSk6MSE9PWEmJihlLnN0YXR1cz49dC5IVFRQX1NUQVRVU19DT0RFUy5JTlRFUk5BTF9TRVJWRVJfRVJST1J8fGUuc3RhdHVzPT09dC5IVFRQX1NUQVRVU19DT0RFUy5UT09fTUFOWV9SRVFVRVNUUyk/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKC0tYSl9KSxyKTpzKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtzKGUpfSkpfShvKX0pKX0sdC5mZXRjaFdpdGhUaW1lb3V0PWFzeW5jIGZ1bmN0aW9uKGUsbixyLG8saSl7aWYocj1yfHx7fSwhbilyZXR1cm4gdC5mZXRjaChlLHIsbyxpKTtjb25zdCBzPW5ldyBBYm9ydENvbnRyb2xsZXIsYT1zZXRUaW1lb3V0KCgoKT0+cy5hYm9ydCgpKSxuKSxjPWF3YWl0IHQuZmV0Y2goZSx7Li4ucixzaWduYWw6cy5zaWduYWx9LG8saSk7cmV0dXJuIGNsZWFyVGltZW91dChhKSxjfSx0LmJhY2tvZmY9ZnVuY3Rpb24obixyLG8saSl7dC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZnVuYyBtdXN0IGJlIGEgRnVuY3Rpb24iKTt2YXIgcz10aGlzO24oe3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aSYmaS5zdWNjZXNzJiZpLnN1Y2Nlc3MoZSl9LGZhaWx1cmU6ZnVuY3Rpb24odCxhKXtpZihvPjApe3ZhciBjPTIqcipNYXRoLnJhbmRvbSgpO2Uuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzLmJhY2tvZmYobiwyKmMsLS1vLGkpfSksYyl9ZWxzZSBpJiZpLmZhaWx1cmUmJmkuZmFpbHVyZSh0LGEpfX0pfSx0LnB1Ymxpc2hNZXRyaWM9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuQ0xJRU5UX01FVFJJQyxkYXRhOmV9KX0sdC5wdWJsaXNoU29mdHBob25lU3RhdHM9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuU09GVFBIT05FX1NUQVRTLGRhdGE6ZX0pfSx0LnB1Ymxpc2hTb2Z0cGhvbmVSZXBvcnQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuU09GVFBIT05FX1JFUE9SVCxkYXRhOmV9KX0sdC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLkNMSUNLX1NUUkVBTV9EQVRBLGRhdGE6ZX0pfSx0LnB1Ymxpc2hDbGllbnRTaWRlTG9ncz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkNMSUVOVF9TSURFX0xPR1MsZSl9LHQuYWRkTmFtZXNwYWNlVG9Mb2dzPWZ1bmN0aW9uKGUpe1sibG9nIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImRlYnVnIl0uZm9yRWFjaCgodD0+e2NvbnN0IG49d2luZG93LmNvbnNvbGVbdF07d2luZG93LmNvbnNvbGVbdF09ZnVuY3Rpb24oKXtjb25zdCB0PUFycmF5LmZyb20oYXJndW1lbnRzKTt0LnVuc2hpZnQoYFske2V9XWApLG4uYXBwbHkod2luZG93LmNvbnNvbGUsdCl9fSkpfSx0LlBvcHVwTWFuYWdlcj1mdW5jdGlvbigpe30sdC5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW51bGw7aWYobil7dmFyIG89bi5oZWlnaHR8fDU3OCxpPW4ud2lkdGh8fDQzMyxzPW4udG9wfHwwLGE9bi5sZWZ0fHwwOyhyPXdpbmRvdy5vcGVuKCIiLHQsIndpZHRoPSIraSsiLCBoZWlnaHQ9IitvKyIsIHRvcD0iK3MrIiwgbGVmdD0iK2EpKS5sb2NhdGlvbiE9PWUmJihyPXdpbmRvdy5vcGVuKGUsdCwid2lkdGg9IitpKyIsIGhlaWdodD0iK28rIiwgdG9wPSIrcysiLCBsZWZ0PSIrYSkpfWVsc2Uocj13aW5kb3cub3BlbigiIix0KSkubG9jYXRpb24hPT1lJiYocj13aW5kb3cub3BlbihlLHQpKTtyZXR1cm4gcn0sdC5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2dldExvY2FsU3RvcmFnZUtleSh0KTtlLmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG4pfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuX2dldExhc3RPcGVuZWRUaW1lc3RhbXA9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZ2V0TG9jYWxTdG9yYWdlS2V5KHQpLHI9ZS5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShuKTtyZXR1cm4gcj9wYXJzZUludChyLDEwKTowfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuX3NldExhc3RPcGVuZWRUaW1lc3RhbXA9ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzLl9nZXRMb2NhbFN0b3JhZ2VLZXkodCk7ZS5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShyLCIiK24pfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuX2dldExvY2FsU3RvcmFnZUtleT1mdW5jdGlvbihlKXtyZXR1cm4iY29ubmVjdFBvcHVwTWFuYWdlcjo6IitlfTt2YXIgbz10Lm1ha2VFbnVtKFsiZ3JhbnRlZCIsImRlbmllZCIsImRlZmF1bHQiXSk7dC5Ob3RpZmljYXRpb25NYW5hZ2VyPWZ1bmN0aW9uKCl7dGhpcy5xdWV1ZT1bXSx0aGlzLnBlcm1pc3Npb249by5ERUZBVUxUfSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLnJlcXVlc3RQZXJtaXNzaW9uPWZ1bmN0aW9uKCl7dmFyIG49dGhpczsiTm90aWZpY2F0aW9uImluIGU/ZS5Ob3RpZmljYXRpb24ucGVybWlzc2lvbj09PW8uREVOSUVEPyh0LmdldExvZygpLndhcm4oIlRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgdG8gbm90IHJlY2VpdmUgbm90aWZpY2F0aW9ucy4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMucGVybWlzc2lvbj1vLkRFTklFRCk6dGhpcy5wZXJtaXNzaW9uIT09by5HUkFOVEVEJiZlLk5vdGlmaWNhdGlvbi5yZXF1ZXN0UGVybWlzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe24ucGVybWlzc2lvbj1lLGU9PT1vLkdSQU5URUQ/bi5fc2hvd1F1ZXVlZCgpOm4ucXVldWU9W119KSk6KHQuZ2V0TG9nKCkud2FybigiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBub3RpZmljYXRpb25zLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5wZXJtaXNzaW9uPW8uREVOSUVEKX0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKGUsbil7aWYodGhpcy5wZXJtaXNzaW9uPT09by5HUkFOVEVEKXJldHVybiB0aGlzLl9zaG93SW1wbCh7dGl0bGU6ZSxvcHRpb25zOm59KTtpZih0aGlzLnBlcm1pc3Npb249PT1vLkRFTklFRCl0LmdldExvZygpLndhcm4oIlVuYWJsZSB0byBzaG93IG5vdGlmaWNhdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe3RpdGxlOmUsb3B0aW9uczpufSk7ZWxzZXt2YXIgcj17dGl0bGU6ZSxvcHRpb25zOm59O3QuZ2V0TG9nKCkud2FybigiRGVmZXJyaW5nIG5vdGlmaWNhdGlvbiB1bnRpbCB1c2VyIGRlY2lkZXMgdG8gYWxsb3cgb3IgZGVueS4iKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5xdWV1ZS5wdXNoKHIpfX0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5fc2hvd1F1ZXVlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnF1ZXVlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX3Nob3dJbXBsKHQpfSkpO3JldHVybiB0aGlzLnF1ZXVlPVtdLHR9LHQuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUuX3Nob3dJbXBsPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBlLk5vdGlmaWNhdGlvbih0LnRpdGxlLHQub3B0aW9ucyk7cmV0dXJuIHQub3B0aW9ucy5jbGlja2VkJiYobi5vbmNsaWNrPWZ1bmN0aW9uKCl7dC5vcHRpb25zLmNsaWNrZWQuY2FsbChuKX0pLG59LHQuVmFsdWVFcnJvcj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPWUuc2hpZnQoKSxyPW5ldyBFcnJvcih0LnZzcHJpbnRmKG4sZSkpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yocix0LlZhbHVlRXJyb3IucHJvdG90eXBlKSxyfSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5WYWx1ZUVycm9yLnByb3RvdHlwZSxFcnJvci5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlZhbHVlRXJyb3IsRXJyb3IpLHQuVmFsdWVFcnJvci5wcm90b3R5cGUubmFtZT0iVmFsdWVFcnJvciIsdC5Ob3RJbXBsZW1lbnRlZEVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49ZS5zaGlmdCgpLHI9bmV3IEVycm9yKHQudnNwcmludGYobixlKSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLHQuTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUpLHJ9LE9iamVjdC5zZXRQcm90b3R5cGVPZih0Lk5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlLEVycm9yLnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuTm90SW1wbGVtZW50ZWRFcnJvcixFcnJvciksdC5Ob3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZS5uYW1lPSJOb3RJbXBsZW1lbnRlZEVycm9yIix0LlN0YXRlRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksbj1lLnNoaWZ0KCkscj1uZXcgRXJyb3IodC52c3ByaW50ZihuLGUpKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsdC5TdGF0ZUVycm9yLnByb3RvdHlwZSkscn0sT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuU3RhdGVFcnJvci5wcm90b3R5cGUsRXJyb3IucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5TdGF0ZUVycm9yLEVycm9yKSx0LlN0YXRlRXJyb3IucHJvdG90eXBlLm5hbWU9IlN0YXRlRXJyb3IiLHQuVm9pY2VJZEVycm9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyZXR1cm4gci50eXBlPWUsci5tZXNzYWdlPXQsci5zdGFjaz1FcnJvcih0KS5zdGFjayxyLmVycj1uLHJ9LHQuaXNDQ1A9ZnVuY3Rpb24oKXtyZXR1cm4hIXQuY29yZS51cHN0cmVhbSYmIkNvbm5lY3RTaGFyZWRXb3JrZXJDb25kdWl0Ij09PXQuY29yZS5nZXRVcHN0cmVhbSgpLm5hbWV9LHQuaXNTaGFyZWRXb3JrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC53b3JrZXImJiEhdC53b3JrZXIuY2xpZW50RW5naW5lfSx0LmlzQ1JNPWZ1bmN0aW9uKCl7cmV0dXJuISF0LmNvcmUudXBzdHJlYW0mJnQuY29yZS5nZXRVcHN0cmVhbSgpaW5zdGFuY2VvZiB0LklGcmFtZUNvbmR1aXR9fSgpfSw3MzY6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0Lndvcmtlcj17fTt2YXIgbj0iTEFEUy5HZXRBZ2VudEZhaWxvdmVyQ29uZmlndXJhdGlvbiI7Y29uc3Qgcj17Y3JlYXRlVGFza0NvbnRhY3Q6ImNyZWF0ZVRhc2tDb250YWN0IixjcmVhdGVPdXRib3VuZENvbnRhY3Q6ImNyZWF0ZU91dGJvdW5kQ29udGFjdCIsY3JlYXRlVGVtcGxhdGVkVGFzazoiY3JlYXRlVGVtcGxhdGVkVGFzayJ9O3ZhciBvPWZ1bmN0aW9uKCl7dGhpcy50b3BpY01hc3Rlck1hcD17fX07by5wcm90b3R5cGUuZ2V0TWFzdGVyPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwidG9waWMiKSx0aGlzLnRvcGljTWFzdGVyTWFwW2VdfHxudWxsfSxvLnByb3RvdHlwZS5zZXRNYXN0ZXI9ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwidG9waWMiKSx0LmFzc2VydE5vdE51bGwobiwiaWQiKSx0aGlzLnRvcGljTWFzdGVyTWFwW2VdPW59LG8ucHJvdG90eXBlLnJlbW92ZU1hc3Rlcj1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwiaWQiKTt2YXIgbj10aGlzO3QuZW50cmllcyh0aGlzLnRvcGljTWFzdGVyTWFwKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlPT09ZX0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtkZWxldGUgbi50b3BpY01hc3Rlck1hcFtlLmtleV19KSl9O3ZhciBpPWZ1bmN0aW9uKGUpe3QuQ2xpZW50QmFzZS5jYWxsKHRoaXMpLHRoaXMuY29uZHVpdD1lfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LkNsaWVudEJhc2UucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT0obmV3IERhdGUpLmdldFRpbWUoKTt0LmNvbnRhaW5zVmFsdWUodC5BZ2VudEFwcENsaWVudE1ldGhvZHMsZSk/dC5jb3JlLmdldEFnZW50QXBwQ2xpZW50KCkuX2NhbGxJbXBsKGUsbix7c3VjY2VzczpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuKSxyLnN1Y2Nlc3ModCl9LGZhaWx1cmU6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbix0KSxyLmZhaWx1cmUodCl9fSk6dC5jb250YWluc1ZhbHVlKHQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHMsZSk/dC5jb3JlLmdldFRhc2tUZW1wbGF0ZXNDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4pLHIuc3VjY2Vzcyh0KX0sZmFpbHVyZTpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuZmFpbHVyZSh0KX19KTp0LmNvcmUuZ2V0Q2xpZW50KCkuX2NhbGxJbXBsKGUsbix7c3VjY2VzczpmdW5jdGlvbih0LHMpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4pLHIuc3VjY2Vzcyh0LHMpfSxmYWlsdXJlOmZ1bmN0aW9uKHQscyl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbix0KSxyLmZhaWx1cmUodCxzKX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24odCxzKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuYXV0aEZhaWx1cmUoKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKHQscyl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbix0KSxyLmFjY2Vzc0RlbmllZCYmci5hY2Nlc3NEZW5pZWQoKX19KX0saS5wcm90b3R5cGUuX3JlY29yZEFQSUxhdGVuY3k9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89KG5ldyBEYXRlKS5nZXRUaW1lKCktdDt0aGlzLl9zZW5kQVBJTWV0cmljcyhlLG8sbixyKX0saS5wcm90b3R5cGUuX3NlbmRBUElNZXRyaWNzPWZ1bmN0aW9uKGUsbixvLGkpe2xldCBzPXtuYW1lOmUsdGltZTpuLGVycm9yOmksZXJyb3I1eHg6MH07Y29uc3QgYT1be25hbWU6IkNhdGVnb3J5Iix2YWx1ZToiQVBJIn1dLGM9aSYmaS5zdGF0dXNDb2RlfHwyMDAsdT1pJiZpLnJldHJ5U3RhdHVzfHx0LlJldHJ5U3RhdHVzLk5PTkUsbD1be25hbWU6Ikh0dHBTdGF0dXNDb2RlIix2YWx1ZTpjfSx7bmFtZToiSHR0cEdlbmVyaWNTdGF0dXNDb2RlIix2YWx1ZTpgJHtjLnRvU3RyaW5nKCkuY2hhckF0KDApfVhYYH0se25hbWU6IlJldHJ5U3RhdHVzIix2YWx1ZTp1fV07aWYoIjUiPT09Yy50b1N0cmluZygpLmNoYXJBdCgwKSYmKHMuZXJyb3I1eHg9MSksIjUiPT09Yy50b1N0cmluZygpLmNoYXJBdCgwKT9zLmZhdWx0PTE6IjIiPT09Yy50b1N0cmluZygpLmNoYXJBdCgwKSYmKHMuZmF1bHQ9MCkscltlXSYmbyYmby5yZWxhdGVkQ29udGFjdElkKXtsZXQgbj17bmFtZTpgJHtlfVdpdGhSZWxhdGVkQ29udGFjdElkYCx0aW1lOnMudGltZSxlcnJvcjpzLmVycm9yLGVycm9yNXh4OnMuZXJyb3I1eHh9O3RoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BUElfTUVUUklDLHsuLi5uLGRpbWVuc2lvbnM6YSxvcHRpb25hbERpbWVuc2lvbnM6bH0pfXRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BUElfTUVUUklDLHsuLi5zLGRpbWVuc2lvbnM6YSxvcHRpb25hbERpbWVuc2lvbnM6bH0pfTt2YXIgcz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5tdWx0aXBsZXhlcj1uZXcgdC5TdHJlYW1NdWx0aXBsZXhlcix0aGlzLmNvbmR1aXQ9bmV3IHQuQ29uZHVpdCgiQW1hem9uQ29ubmVjdFNoYXJlZFdvcmtlciIsbnVsbCx0aGlzLm11bHRpcGxleGVyKSx0aGlzLmNsaWVudD1uZXcgaSh0aGlzLmNvbmR1aXQpLHRoaXMudGltZW91dD1udWxsLHRoaXMuYWdlbnQ9bnVsbCx0aGlzLm5leHRUb2tlbj1udWxsLHRoaXMuaW5pdERhdGE9e30sdGhpcy5wb3J0Q29uZHVpdE1hcD17fSx0aGlzLnN0cmVhbU1hcEJ5VGFiSWQ9e30sdGhpcy5tYXN0ZXJDb29yZD1uZXcgbyx0aGlzLmxvZ3NCdWZmZXI9W10sdGhpcy5zdXBwcmVzcz0hMSx0aGlzLmZvcmNlT2ZmbGluZT0hMSx0aGlzLmxvbmdQb2xsaW5nT3B0aW9ucz17YWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGU6ITEsYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlOiExfSx0aGlzLmRyUG9sbGluZ1VybD1udWxsLHRoaXMudGhpc0Fybj1udWxsLHRoaXMub3RoZXJBcm49bnVsbCx0aGlzLnBlbmRpbmdGYWlsb3Zlcj1udWxsO3ZhciByPW51bGw7dC5yb290TG9nZ2VyPW5ldyB0LkRvd25zdHJlYW1Db25kdWl0TG9nZ2VyKHRoaXMuY29uZHVpdCksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5TRU5EX0xPR1MsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkucHVzaExvZ3NEb3duc3RyZWFtKGUpLG4ubG9nc0J1ZmZlcj1uLmxvZ3NCdWZmZXIuY29uY2F0KGUpLG4ubG9nc0J1ZmZlci5sZW5ndGg+NDAwJiZuLmhhbmRsZVNlbmRMb2dzUmVxdWVzdChuLmxvZ3NCdWZmZXIpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNVUFBSRVNTLChmdW5jdGlvbihlKXt0LmdldExvZygpLmRlYnVnKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFNldHRpbmcgU3VwcHJlc3MgdG8gJXMiLGUuc3VwcHJlc3MpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5zdXBwcmVzcz1lLnN1cHByZXNzfHwhMSxuLnN1cHByZXNzfHwobi5mb3JjZU9mZmxpbmU9ITEpLCh2b2lkIDA9PT1lLnNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW18fGUuc2hvdWxkU2VuZEZhaWxvdmVyRG93bnN0cmVhbSkmJm4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse2lzUHJpbWFyeTohbi5zdXBwcmVzc30pfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gU2V0dGluZyBGT1JDRV9PRkZMSU5FIHRvICVzIixlLm9mZmxpbmUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5mb3JjZU9mZmxpbmV8fChuLnBlbmRpbmdGYWlsb3Zlcj0hMSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtpc1ByaW1hcnk6ITEsbmV4dEFjdGl2ZUFybjplLm5leHRBY3RpdmVBcm59KSksbi5mb3JjZU9mZmxpbmU9ZS5vZmZsaW5lfHwhMX0pKSx0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HJiZ0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkcsKGZ1bmN0aW9uKGUpe3ZhciByPXQuZ2V0TG9nKCk7bi5kclBvbGxpbmdVcmw/KHIuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gQWRkaW5nIG5ldyBDQ1AgdG8gYWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZvciBpbnN0YW5jZSAke2UuaW5zdGFuY2VBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnBvbGxGb3JBY3RpdmVSZWdpb24oITAsITEpKTooci5pbmZvKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEluaXRpYWxpemluZyBhY3RpdmUgcmVnaW9uIHBvbGxpbmcgZm9yIGluc3RhbmNlICR7ZS5pbnN0YW5jZUFybn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4udGhpc0Fybj1lLmluc3RhbmNlQXJuLG4ub3RoZXJBcm49ZS5vdGhlckFybixuLmdldFByZXNpZ25lZERpc2NvdmVyeVVybCgpLnRoZW4oKGU9PntuLmRyUG9sbGluZ1VybD1lLG4ucG9sbEZvckFjdGl2ZVJlZ2lvbighMCwhMCl9KSwodD0+e3IuZXJyb3IoYFtEaXNhc3RlciBSZWNvdmVyeV0gRmFpbGVkIHRvIGdldCBwcmVzaWduZWQgVVJMIGZvciBpbnN0YW5jZSAke2UuaW5zdGFuY2VBcm59OyBzdXBwcmVzc2luZyBjb250YWN0c2ApLndpdGhFeGNlcHRpb24odCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnN1cHByZXNzPSEwfSkpKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24obyl7Y29uc29sZS5sb2coIkBAQCBjb25maWd1cmUgZXZlbnQgaGFuZGxlciIsbyk7dHJ5e28uYXV0aFRva2VuJiZvLmF1dGhUb2tlbiE9PW4uaW5pdERhdGEuYXV0aFRva2VuJiYobi5pbml0RGF0YT1vLHQuY29yZS5pbml0KG8pLG8ubG9uZ1BvbGxpbmdPcHRpb25zJiYoImJvb2xlYW4iPT10eXBlb2Ygby5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGUmJihuLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZT1vLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZSksImJvb2xlYW4iPT10eXBlb2Ygby5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlJiYobi5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlPW8ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdXZWJzb2NrZXRPbmx5TW9kZSkpLHI/dC5nZXRMb2coKS5pbmZvKCJOb3QgSW5pdGlhbGl6aW5nIGEgbmV3IFdlYnNvY2tldE1hbmFnZXIgaW5zdGFuY2UsIHNpbmNlIG9uZSBhbHJlYWR5IGV4aXN0cyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6KHQuZ2V0TG9nKCkuaW5mbygiQ3JlYXRpbmcgYSBuZXcgV2Vic29ja2V0IGNvbm5lY3Rpb24gZm9yIENDUCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5XZWJTb2NrZXRNYW5hZ2VyLnNldEdsb2JhbENvbmZpZyh7bG9nZ2VyQ29uZmlnOntsb2dnZXI6dC5nZXRMb2coKSxhZHZhbmNlZExvZ1dyaXRlcjoiaW5mbyIsbGV2ZWw6MTB9fSksKHI9dC5XZWJTb2NrZXRNYW5hZ2VyLmNyZWF0ZSgpKS5vbkluaXRGYWlsdXJlKChmdW5jdGlvbigpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUpfSkpLHIub25Db25uZWN0aW9uT3BlbigoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fT1BFTixlKX0pKSxyLm9uQ29ubmVjdGlvbkNsb3NlKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9DTE9TRSxlKX0pKSxyLm9uQ29ubmVjdGlvbkdhaW4oKGZ1bmN0aW9uKCl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuQWdlbnRFdmVudHMuV0VCU09DS0VUX0NPTk5FQ1RJT05fR0FJTkVEKSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9HQUlOKX0pKSxyLm9uQ29ubmVjdGlvbkxvc3QoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0xPU1QsZSksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fTE9TVCxlKX0pKSxyLm9uU3Vic2NyaXB0aW9uVXBkYXRlKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX1VQREFURSxlKX0pKSxyLm9uU3Vic2NyaXB0aW9uRmFpbHVyZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklQVElPTl9GQUlMVVJFLGUpfSkpLHIub25BbGxNZXNzYWdlKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQUxMX01FU1NBR0UsZSl9KSksbi5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TRU5ELChmdW5jdGlvbihlKXtyLnNlbmRNZXNzYWdlKGUpfSkpLG4uY29uZHVpdC5vbkRvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSUJFLChmdW5jdGlvbihlKXtyLnN1YnNjcmliZVRvcGljcyhlKX0pKSxyLmluaXQodC5oaXRjaChuLG4uZ2V0V2ViU29ja2V0VXJsKSkudGhlbigoZnVuY3Rpb24ocil7dHJ5e2lmKHImJiFyLndlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQpdC5nZXRMb2coKS5pbmZvKCJLaWNraW5nIG9mZiBhZ2VudCBwb2xsaW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnBvbGxGb3JBZ2VudCgpLHQuZ2V0TG9nKCkuaW5mbygiS2lja2luZyBvZmYgY29uZmlnIHBvbGxpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4ucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbih7cmVwZWF0Rm9yZXZlcjohMH0pLHQuZ2V0TG9nKCkuaW5mbygiS2lja2luZyBvZmYgYXV0aCB0b2tlbiBwb2xsaW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLnNldEludGVydmFsKHQuaGl0Y2gobixuLmNoZWNrQXV0aFRva2VuKSwzZTUpO2Vsc2UgaWYoIXQud2ViU29ja2V0SW5pdEZhaWxlZCl7Y29uc3QgZT10LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkU7dGhyb3cgbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKGUpLHQud2ViU29ja2V0SW5pdEZhaWxlZD0hMCxuZXcgRXJyb3IoZSl9fWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIldlYlNvY2tldCBmYWlsZWQgdG8gaW5pdGlhbGl6ZSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSkpKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKCJAQEAgZXJyb3IiLGUpfX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlRFUk1JTkFURSwoZnVuY3Rpb24oKXtuLmhhbmRsZVNlbmRMb2dzUmVxdWVzdChuLmxvZ3NCdWZmZXIpLHQuY29yZS50ZXJtaW5hdGUoKSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVEVSTUlOQVRFRCl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5TWU5DSFJPTklaRSwoZnVuY3Rpb24oKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0oZS5ldmVudCxlLmRhdGEpfSkpLGUub25jb25uZWN0PWZ1bmN0aW9uKGUpe3ZhciByPWUucG9ydHNbMF0sbz1uZXcgdC5Qb3J0U3RyZWFtKHIpO24ubXVsdGlwbGV4ZXIuYWRkU3RyZWFtKG8pLHIuc3RhcnQoKTt2YXIgaT1uZXcgdC5Db25kdWl0KG8uZ2V0SWQoKSxudWxsLG8pO2kuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0Use2lkOm8uZ2V0SWQoKX0pLG4ucG9ydENvbmR1aXRNYXBbby5nZXRJZCgpXT1pLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMse2xlbmd0aDpPYmplY3Qua2V5cyhuLnBvcnRDb25kdWl0TWFwKS5sZW5ndGh9KSxudWxsIT09bi5hZ2VudCYmbi51cGRhdGVBZ2VudCgpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9SRVFVRVNULHQuaGl0Y2gobixuLmhhbmRsZUFQSVJlcXVlc3QsaSkpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVFVRVNULHQuaGl0Y2gobixuLmhhbmRsZU1hc3RlclJlcXVlc3QsaSxvLmdldElkKCkpKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5SRUxPQURfQUdFTlRfQ09ORklHVVJBVElPTix0LmhpdGNoKG4sbi5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuVEFCX0lELHQuaGl0Y2gobixuLmhhbmRsZVRhYklkRXZlbnQsbykpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLkNMT1NFLHQuaGl0Y2gobixuLmhhbmRsZUNsb3NlRXZlbnQsbykpfX07cy5wcm90b3R5cGUucG9sbEZvckFjdGl2ZVJlZ2lvbj1mdW5jdGlvbihyLG8pe3ZhciBpPXRoaXMscz10LmdldExvZygpO2lmKCFpLmRyUG9sbGluZ1VybCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFRyaWVkIHRvIHBvbGwgZm9yIGFjdGl2ZSByZWdpb24gd2l0aG91dCBmaXJzdCBpbml0aWFsaXppbmcgRFIgcG9sbGluZyBpbiB0aGUgd29ya2VyLiIpO3MuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gUG9sbGluZyBmb3IgZmFpbG92ZXIgd2l0aCBwcmVzaWduZWQgVVJMIGZvciBpbnN0YW5jZSAke2kudGhpc0Fybn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3JldHVybiB0LmZldGNoV2l0aFRpbWVvdXQoaS5kclBvbGxpbmdVcmwsMWU0KS5jYXRjaCgoZT0+e2lmKGUuc3RhdHVzKXtpZihpLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShuLGEse3N0YXR1c0NvZGU6ZS5zdGF0dXN9KSxbdC5IVFRQX1NUQVRVU19DT0RFUy5BQ0NFU1NfREVOSUVELHQuSFRUUF9TVEFUVVNfQ09ERVMuVU5BVVRIT1JJWkVEXS5pbmNsdWRlcyhlLnN0YXR1cykpcmV0dXJuIHMuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBBY3RpdmUgcmVnaW9uIHBvbGxpbmcgZmFpbGVkOyB0cnlpbmcgdG8gZ2V0IGEgbmV3IFVSTCBmb3IgcG9sbGluZy4iKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5nZXRQcmVzaWduZWREaXNjb3ZlcnlVcmwoKS50aGVuKChlPT57aS5kclBvbGxpbmdVcmw9ZX0pKS50aGVuKCgoKT0+KGE9KG5ldyBEYXRlKS5nZXRUaW1lKCksdC5mZXRjaFdpdGhUaW1lb3V0KGkuZHJQb2xsaW5nVXJsLDFlNCkpKSk7dmFyIHI9YFtEaXNhc3RlciBSZWNvdmVyeV0gRmFpbGVkIHRvIHBvbGwgZm9yIGZhaWxvdmVyIGZvciBpbnN0YW5jZSAke2kudGhpc0Fybn0sIHJlY2VpdmVkIHVuZXhwZWN0ZWQgcmVzcG9uc2UgY29kZSAke2Uuc3RhdHVzfWA7dGhyb3cgcy5lcnJvcihyKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbmV3IEVycm9yKHIpfXRocm93IHI9YFtEaXNhc3RlciBSZWNvdmVyeV0gRmFpbGVkIHRvIHBvbGwgZm9yIGZhaWxvdmVyIGZvciBpbnN0YW5jZSAke2kudGhpc0Fybn0sIHJlcXVlc3QgdGltZWQgb3V0IG9yIGFib3J0ZWRgLGkuY2xpZW50Ll9yZWNvcmRBUElMYXRlbmN5KG4sYSx7c3RhdHVzQ29kZTotMX0pLHMuZXJyb3Iocikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG5ldyBFcnJvcihyKX0pKS50aGVuKChlPT57aWYoaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhKSwiYm9vbGVhbiI9PXR5cGVvZiBlLlRlcm1pbmF0ZUFjdGl2ZUNvbnRhY3RzKXt2YXIgYz0hZS5UZXJtaW5hdGVBY3RpdmVDb250YWN0cztpZihlLkluc3RhbmNlQXJuKWlmKHMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gU3VjY2Vzc2Z1bGx5IHBvbGxlZCBmb3IgYWN0aXZlIHJlZ2lvbi4gUHJpbWFyeSBpbnN0YW5jZSBBUk4gaXMgJHtlLkluc3RhbmNlQXJufSBhbmQgc29mdCBmYWlsb3ZlciBpcyBgKyhjPyJlbmFibGVkIjoiZGlzYWJsZWQiKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLnRoaXNBcm49PT1lLkluc3RhbmNlQXJuJiYhaS5zdXBwcmVzcyYmcilzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICR7aS50aGlzQXJufSBpcyBiZWluZyBzZXQgdG8gcHJpbWFyeWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7bmV4dEFjdGl2ZUFybjplLkluc3RhbmNlQXJufSk7ZWxzZSBpZihpLm90aGVyQXJuPT09ZS5JbnN0YW5jZUFybil7aWYoIWN8fG98fCFyfHxpLnN1cHByZXNzJiYhaS5wZW5kaW5nRmFpbG92ZXJ8fGkuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse25leHRBY3RpdmVBcm46aS50aGlzQXJufSksIWkuc3VwcHJlc3Mpe2kuc3VwcHJlc3M9ITA7Y29uc3Qgbj1jJiYhbztuPyhpLnBlbmRpbmdGYWlsb3Zlcj0hMCxzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICR7aS50aGlzQXJufSB3aWxsIGJlIHNldCB0byBzdGFuZC1ieSB1c2luZyBzb2Z0IGZhaWxvdmVyYCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSk6cy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAke2kudGhpc0Fybn0gaXMgYmVpbmcgc2V0IHRvIHN0YW5kLWJ5IGltbWVkaWF0ZWx5YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUse3NvZnRGYWlsb3ZlcjpuLG5leHRBY3RpdmVBcm46ZS5JbnN0YW5jZUFybn0pfX1lbHNlW2kudGhpc0FybixpLm90aGVyQXJuXS5pbmNsdWRlcyhlLkluc3RhbmNlQXJuKXx8cy5lcnJvcihgW0Rpc2FzdGVyIFJlY292ZXJ5XSBUaGUgY3VycmVudCBwcmltYXJ5IGluc3RhbmNlIGluIHRoaXMgYWdlbnQncyBmYWlsb3ZlciBncm91cCAke2UuSW5zdGFuY2VBcm59IGRvZXNuJ3QgbWF0Y2ggdGhpcyBpbnN0YW5jZSAke2kudGhpc0Fybn0gb3IgdGhlIG90aGVyIGluc3RhbmNlICR7aS5vdGhlckFybn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2Ugcy5lcnJvcigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBEUiBwb2xsaW5nIHJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBhIHRydXRoeSBhY3RpdmUgaW5zdGFuY2UgQVJOLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1lbHNlIHMuZXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gRFIgcG9sbGluZyByZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gYSB2YWxpZCB2YWx1ZSBmb3IgVGVybWluYXRlQWN0aXZlQ29udGFjdHMuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChlPT57ZS5zdGF0dXMmJmkuY2xpZW50Ll9yZWNvcmRBUElMYXRlbmN5KG4sYSx7Li4uZSxzdGF0dXNDb2RlOmUuc3RhdHVzfSkscy5lcnJvcihgW0Rpc2FzdGVyIFJlY292ZXJ5XSBBY3RpdmUgcmVnaW9uIHBvbGxpbmcgZmFpbGVkIGZvciBpbnN0YW5jZSAke2kudGhpc0Fybn0uYCkud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmZpbmFsbHkoKCgpPT57IW8mJnJ8fGUuc2V0VGltZW91dCh0LmhpdGNoKGksaS5wb2xsRm9yQWN0aXZlUmVnaW9uKSw2ZTQpfSkpfSxzLnByb3RvdHlwZS5nZXRQcmVzaWduZWREaXNjb3ZlcnlVcmw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoKG4scik9Pnt0LmdldExvZygpLmluZm8oYFtEaXNhc3RlciBSZWNvdmVyeV0gR2V0dGluZyBwcmVzaWduZWQgVVJMIGZvciBpbnN0YW5jZSAke2UudGhpc0Fybn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9UUkFOU1BPUlQse3RyYW5zcG9ydFR5cGU6dC5UUkFOU1BPUlRfVFlQRVMuQUdFTlRfRElTQ09WRVJZfSx7c3VjY2VzczpmdW5jdGlvbihlKXtlJiZlLmFnZW50RGlzY292ZXJ5VHJhbnNwb3J0JiZlLmFnZW50RGlzY292ZXJ5VHJhbnNwb3J0LnByZXNpZ25lZFVybD8odC5nZXRMb2coKS5pbmZvKCJnZXRQcmVzaWduZWREaXNjb3ZlcnlVcmwgc3VjY2VlZGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuKGUuYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQucHJlc2lnbmVkVXJsKSk6KHQuZ2V0TG9nKCkuaW5mbygiZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsIHJlY2VpdmVkIGVtcHR5L2ludmFsaWQgZGF0YSIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKEVycm9yKCJnZXRQcmVzaWduZWREaXNjb3ZlcnlVcmwgcmVjZWl2ZWQgZW1wdHkvaW52YWxpZCBkYXRhIikpKX0sZmFpbHVyZTpmdW5jdGlvbihuLG8pe3QuZ2V0TG9nKCkuZXJyb3IoYFtEaXNhc3RlciBSZWNvdmVyeV0gRmFpbGVkIHRvIGdldCBwcmVzaWduZWQgVVJMIGZvciBpbnN0YW5jZSAke2UudGhpc0Fybn1gKS53aXRoRXhjZXB0aW9uKG4pLndpdGhPYmplY3Qobykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKG5ldyBFcnJvcigiRmFpbGVkIHRvIGdldCBwcmVzaWduZWQgVVJMIikpfSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe3QuaGl0Y2goZSxlLmhhbmRsZUF1dGhGYWlsKSgpLHIobmV3IEVycm9yKCJFbmNvdW50ZXJlZCBhdXRoIGZhaWx1cmUgd2hlbiBnZXR0aW5nIHByZXNpZ25lZCBVUkwiKSl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbigpe3QuaGl0Y2goZSxlLmhhbmRsZUFjY2Vzc0RlbmllZCkoKSxyKG5ldyBFcnJvcigiRW5jb3VudGVyZWQgYWNjZXNzIGRlbmllZCB3aGVuIGdldHRpbmcgcHJlc2lnbmVkIFVSTCIpKX19KX0pKX0scy5wcm90b3R5cGUucG9sbEZvckFnZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPXQuaGl0Y2gobixuLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCk7dGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1NOQVBTSE9ULHtuZXh0VG9rZW46bi5uZXh0VG9rZW4sdGltZW91dDozZTR9LHtzdWNjZXNzOmZ1bmN0aW9uKHIsbyl7dHJ5e24uYWdlbnQ9bi5hZ2VudHx8e30sbi5hZ2VudC5zbmFwc2hvdD1yLnNuYXBzaG90LG4uYWdlbnQuc25hcHNob3QubG9jYWxUaW1lc3RhbXA9dC5ub3coKSxuLmFnZW50LnNuYXBzaG90LnNrZXc9bi5hZ2VudC5zbmFwc2hvdC5zbmFwc2hvdFRpbWVzdGFtcC1uLmFnZW50LnNuYXBzaG90LmxvY2FsVGltZXN0YW1wLG4ubmV4dFRva2VuPXIubmV4dFRva2VuLG8mJm8uaGFzT3duUHJvcGVydHkoImNvbnRlbnRMZW5ndGgiKSYmKG4uYWdlbnQuc25hcHNob3QuY29udGVudExlbmd0aD1vLmNvbnRlbnRMZW5ndGgpLHQuZ2V0TG9nKCkudHJhY2UoIkdFVF9BR0VOVF9TTkFQU0hPVCBzdWNjZWVkZWQuIikud2l0aE9iamVjdChyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4udXBkYXRlQWdlbnQoKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJMb25nIHBvbGwgZmFpbGVkIHRvIHVwZGF0ZSBhZ2VudC4iKS53aXRoT2JqZWN0KHIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1maW5hbGx5e2Uuc2V0VGltZW91dCh0LmhpdGNoKG4sbi5wb2xsRm9yQWdlbnQpLDEwMCl9fSxmYWlsdXJlOmZ1bmN0aW9uKHIsbyl7dHJ5e3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBnZXQgYWdlbnQgZGF0YS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjpyLGRhdGE6b30pfWZpbmFsbHl7ZS5zZXRUaW1lb3V0KHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudCksNWUzKX19LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7cigpfSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChuLG4uaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxzLnByb3RvdHlwZS5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKG4pe3ZhciByPXRoaXMsbz1ufHx7fSxpPXQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCk7dGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX0NPTkZJR1VSQVRJT04se30se3N1Y2Nlc3M6ZnVuY3Rpb24obil7dmFyIGk9bi5jb25maWd1cmF0aW9uO3IucG9sbEZvckFnZW50UGVybWlzc2lvbnMoaSksci5wb2xsRm9yQWdlbnRTdGF0ZXMoaSksci5wb2xsRm9yRGlhbGFibGVDb3VudHJ5Q29kZXMoaSksci5wb2xsRm9yUm91dGluZ1Byb2ZpbGVRdWV1ZXMoaSksby5yZXBlYXRGb3JldmVyJiZlLnNldFRpbWVvdXQodC5oaXRjaChyLHIucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbixvKSwzZTQpfSxmYWlsdXJlOmZ1bmN0aW9uKG4saSl7dHJ5e3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBhZ2VudCBjb25maWd1cmF0aW9uIGRhdGEuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6bixkYXRhOml9KX1maW5hbGx5e28ucmVwZWF0Rm9yZXZlciYmZS5zZXRUaW1lb3V0KHQuaGl0Y2gocixyLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24pLDNlNCxvKX19LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7aSgpfSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxzLnByb3RvdHlwZS5wb2xsRm9yQWdlbnRTdGF0ZXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1NUQVRFUyx7bmV4dFRva2VuOm8ubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbih0KXt0Lm5leHRUb2tlbj9yLnBvbGxGb3JBZ2VudFN0YXRlcyhlLHtzdGF0ZXM6KG8uc3RhdGVzfHxbXSkuY29uY2F0KHQuc3RhdGVzKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5hZ2VudFN0YXRlcz0oby5zdGF0ZXN8fFtdKS5jb25jYXQodC5zdGF0ZXMpLHIudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uKGUpKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBhZ2VudCBzdGF0ZXMgbGlzdC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpLGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLnBvbGxGb3JBZ2VudFBlcm1pc3Npb25zPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPW58fHt9O28ubWF4UmVzdWx0cz1vLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9QRVJNSVNTSU9OUyx7bmV4dFRva2VuOm8ubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbih0KXt0Lm5leHRUb2tlbj9yLnBvbGxGb3JBZ2VudFBlcm1pc3Npb25zKGUse3Blcm1pc3Npb25zOihvLnBlcm1pc3Npb25zfHxbXSkuY29uY2F0KHQucGVybWlzc2lvbnMpLG5leHRUb2tlbjp0Lm5leHRUb2tlbixtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30pOihlLnBlcm1pc3Npb25zPShvLnBlcm1pc3Npb25zfHxbXSkuY29uY2F0KHQucGVybWlzc2lvbnMpLHIudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uKGUpKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBhZ2VudCBwZXJtaXNzaW9ucyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUucG9sbEZvckRpYWxhYmxlQ291bnRyeUNvZGVzPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPW58fHt9O28ubWF4UmVzdWx0cz1vLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9ESUFMQUJMRV9DT1VOVFJZX0NPREVTLHtuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvckRpYWxhYmxlQ291bnRyeUNvZGVzKGUse2NvdW50cnlDb2Rlczooby5jb3VudHJ5Q29kZXN8fFtdKS5jb25jYXQodC5jb3VudHJ5Q29kZXMpLG5leHRUb2tlbjp0Lm5leHRUb2tlbixtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30pOihlLmRpYWxhYmxlQ291bnRyaWVzPShvLmNvdW50cnlDb2Rlc3x8W10pLmNvbmNhdCh0LmNvdW50cnlDb2Rlcyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGRpYWxhYmxlIGNvdW50cnkgY29kZXMgbGlzdC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpLGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLnBvbGxGb3JSb3V0aW5nUHJvZmlsZVF1ZXVlcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfUk9VVElOR19QUk9GSUxFX1FVRVVFUyx7cm91dGluZ1Byb2ZpbGVBUk46ZS5yb3V0aW5nUHJvZmlsZS5yb3V0aW5nUHJvZmlsZUFSTixuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvclJvdXRpbmdQcm9maWxlUXVldWVzKGUse2NvdW50cnlDb2Rlczooby5xdWV1ZXN8fFtdKS5jb25jYXQodC5xdWV1ZXMpLG5leHRUb2tlbjp0Lm5leHRUb2tlbixtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30pOihlLnJvdXRpbmdQcm9maWxlLnF1ZXVlcz0oby5xdWV1ZXN8fFtdKS5jb25jYXQodC5xdWV1ZXMpLHIudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uKGUpKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCByb3V0aW5nIHByb2ZpbGUgcXVldWVzIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxzLnByb3RvdHlwZS5oYW5kbGVBUElSZXF1ZXN0PWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpczt0aGlzLmNsaWVudC5jYWxsKG4ubWV0aG9kLG4ucGFyYW1zLHtzdWNjZXNzOmZ1bmN0aW9uKHIpe3ZhciBvPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlc3BvbnNlKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxuLHIpO2Uuc2VuZERvd25zdHJlYW0oby5ldmVudCxvKX0sZmFpbHVyZTpmdW5jdGlvbihvLGkpe3ZhciBzPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlc3BvbnNlKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxuLGksSlNPTi5zdHJpbmdpZnkobykpO2Uuc2VuZERvd25zdHJlYW0ocy5ldmVudCxzKSx0LmdldExvZygpLmVycm9yKCInJXMnIEFQSSByZXF1ZXN0IGZhaWxlZCIsbi5tZXRob2QpLndpdGhPYmplY3Qoe3JlcXVlc3Q6ci5maWx0ZXJBdXRoVG9rZW4obikscmVzcG9uc2U6c30pLndpdGhFeGNlcHRpb24obykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlQXV0aEZhaWwse2F1dGhvcml6ZTohMH0pfSl9LHMucHJvdG90eXBlLmhhbmRsZU1hc3RlclJlcXVlc3Q9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMuY29uZHVpdCxpPW51bGw7c3dpdGNoKHIubWV0aG9kKXtjYXNlIHQuTWFzdGVyTWV0aG9kcy5CRUNPTUVfTUFTVEVSOnZhciBzPXRoaXMubWFzdGVyQ29vcmQuZ2V0TWFzdGVyKHIucGFyYW1zLnRvcGljKSxhPUJvb2xlYW4ocykmJnMhPT1uO3RoaXMubWFzdGVyQ29vcmQuc2V0TWFzdGVyKHIucGFyYW1zLnRvcGljLG4pLGk9dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFLHIse21hc3RlcklkOm4sdGFrZU92ZXI6YSx0b3BpYzpyLnBhcmFtcy50b3BpY30pLGEmJm8uc2VuZERvd25zdHJlYW0oaS5ldmVudCxpKTticmVhaztjYXNlIHQuTWFzdGVyTWV0aG9kcy5DSEVDS19NQVNURVI6KHM9dGhpcy5tYXN0ZXJDb29yZC5nZXRNYXN0ZXIoci5wYXJhbXMudG9waWMpKXx8ci5wYXJhbXMuc2hvdWxkTm90QmVjb21lTWFzdGVySWZOb25lfHwodGhpcy5tYXN0ZXJDb29yZC5zZXRNYXN0ZXIoci5wYXJhbXMudG9waWMsbikscz1uKSxpPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlc3BvbnNlKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSxyLHttYXN0ZXJJZDpzLGlzTWFzdGVyOm49PT1zLHRvcGljOnIucGFyYW1zLnRvcGljfSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbWFzdGVyIG1ldGhvZDogIityLm1ldGhvZCl9ZS5zZW5kRG93bnN0cmVhbShpLmV2ZW50LGkpfSxzLnByb3RvdHlwZS5oYW5kbGVUYWJJZEV2ZW50PWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpczt0cnl7bGV0IG89bi50YWJJZCxpPXIuc3RyZWFtTWFwQnlUYWJJZFtvXSxzPWUuZ2V0SWQoKSxhPU9iamVjdC5rZXlzKHIuc3RyZWFtTWFwQnlUYWJJZCkuZmlsdGVyKChlPT5yLnN0cmVhbU1hcEJ5VGFiSWRbZV0ubGVuZ3RoPjApKS5sZW5ndGg7aWYoaSYmaS5sZW5ndGg+MCl7aWYoIWkuaW5jbHVkZXMocykpe3Iuc3RyZWFtTWFwQnlUYWJJZFtvXS5wdXNoKHMpO2xldCBlPXtsZW5ndGg6T2JqZWN0LmtleXMoci5wb3J0Q29uZHVpdE1hcCkubGVuZ3RoLHRhYklkOm8sc3RyZWFtc1RhYnNBY3Jvc3NCcm93c2VyOmF9O2Vbb109e2xlbmd0aDppLmxlbmd0aH0sci5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyxlKX19ZWxzZXtyLnN0cmVhbU1hcEJ5VGFiSWRbb109W2UuZ2V0SWQoKV07bGV0IG49e2xlbmd0aDpPYmplY3Qua2V5cyhyLnBvcnRDb25kdWl0TWFwKS5sZW5ndGgsdGFiSWQ6byxzdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI6YSsxfTtuW29dPXtsZW5ndGg6ci5zdHJlYW1NYXBCeVRhYklkW29dLmxlbmd0aH0sci5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyxuKX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW1RhYiBJZHNdIElzc3VlIHVwZGF0aW5nIGNvbm5lY3RlZCBDQ1BzIHdpdGhpbiB0aGUgc2FtZSB0YWIiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSxzLnByb3RvdHlwZS5oYW5kbGVDbG9zZUV2ZW50PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7bi5tdWx0aXBsZXhlci5yZW1vdmVTdHJlYW0oZSksZGVsZXRlIG4ucG9ydENvbmR1aXRNYXBbZS5nZXRJZCgpXSxuLm1hc3RlckNvb3JkLnJlbW92ZU1hc3RlcihlLmdldElkKCkpO2xldCByPXtsZW5ndGg6T2JqZWN0LmtleXMobi5wb3J0Q29uZHVpdE1hcCkubGVuZ3RofSxvPU9iamVjdC5rZXlzKG4uc3RyZWFtTWFwQnlUYWJJZCk7dHJ5e2xldCB0PW8uZmluZCgodD0+bi5zdHJlYW1NYXBCeVRhYklkW3RdLmluY2x1ZGVzKGUuZ2V0SWQoKSkpKTtpZih0KXtsZXQgbz1uLnN0cmVhbU1hcEJ5VGFiSWRbdF0uZmluZEluZGV4KCh0PT5lLmdldElkKCk9PT10KSk7bi5zdHJlYW1NYXBCeVRhYklkW3RdLnNwbGljZShvLDEpO2xldCBpPW4uc3RyZWFtTWFwQnlUYWJJZFt0XT9uLnN0cmVhbU1hcEJ5VGFiSWRbdF0ubGVuZ3RoOjA7clt0XT17bGVuZ3RoOml9LHIudGFiSWQ9dH1sZXQgaT1vLmZpbHRlcigoZT0+bi5zdHJlYW1NYXBCeVRhYklkW2VdLmxlbmd0aD4wKSkubGVuZ3RoO3Iuc3RyZWFtc1RhYnNBY3Jvc3NCcm93c2VyPWl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW1RhYiBJZHNdIElzc3VlIHVwZGF0aW5nIHRhYklkLXNwZWNpZmljIHN0cmVhbSBkYXRhIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfW4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMscil9LHMucHJvdG90eXBlLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlKXtlLnBlcm1pc3Npb25zJiZlLmRpYWxhYmxlQ291bnRyaWVzJiZlLmFnZW50U3RhdGVzJiZlLnJvdXRpbmdQcm9maWxlLnF1ZXVlcz8odGhpcy5hZ2VudD10aGlzLmFnZW50fHx7fSx0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb249ZSx0aGlzLnVwZGF0ZUFnZW50KCkpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IGNvbmZpZ3VyYXRpb24gdW50aWwgYWxsIGNvbmZpZyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0scy5wcm90b3R5cGUudXBkYXRlQWdlbnQ9ZnVuY3Rpb24oKXt0aGlzLmFnZW50P3RoaXMuYWdlbnQuc25hcHNob3Q/dGhpcy5hZ2VudC5jb25maWd1cmF0aW9uPyh0aGlzLmFnZW50LnNuYXBzaG90LnN0YXR1cz10aGlzLmFnZW50LnN0YXRlLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMmJnRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMubGVuZ3RoPjEmJnRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpLXQuc3RhdGUudGltZXN0YW1wLmdldFRpbWUoKX0pKSx0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2Uuc3RhdHVzPWUuc3RhdGUsZS5jb25uZWN0aW9ucy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmFkZHJlc3M9ZS5lbmRwb2ludH0pKX0pKSx0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUuZGVmYXVsdE91dGJvdW5kUXVldWUucXVldWVJZD10aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUuZGVmYXVsdE91dGJvdW5kUXVldWUucXVldWVBUk4sdGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnF1ZXVlcy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnF1ZXVlSWQ9ZS5xdWV1ZUFSTn0pKSx0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucXVldWUmJihlLnF1ZXVlLnF1ZXVlSWQ9ZS5xdWV1ZS5xdWV1ZUFSTil9KSksdGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlSWQ9dGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlQVJOLHRoaXMuc3VwcHJlc3MmJih0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzPXRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zdGF0ZS50eXBlPT10LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVEVEfHxlLnN0YXRlLnR5cGU9PXQuQ29udGFjdFN0YXRlVHlwZS5FTkRFRH0pKSx0aGlzLmZvcmNlT2ZmbGluZSYmdGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GT1JDRV9PRkZMSU5FKSksdGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuQWdlbnRFdmVudHMuVVBEQVRFLHRoaXMuYWdlbnQpKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCB1bnRpbCB0aGUgYWdlbnQgY29uZmlndXJhdGlvbiBpcyBhdmFpbGFibGUuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCB1bnRpbCB0aGUgYWdlbnQgc25hcHNob3QgaXMgYXZhaWxhYmxlLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgdW50aWwgdGhlIGFnZW50IGhhcyBiZWVuIGZ1bGx5IGNvbnN0cnVjdGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LHMucHJvdG90eXBlLmdldFdlYlNvY2tldFVybD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10LmNvcmUuZ2V0Q2xpZW50KCkscj10LmhpdGNoKGUsZS5oYW5kbGVBdXRoRmFpbCksbz10LmhpdGNoKGUsZS5oYW5kbGVBY2Nlc3NEZW5pZWQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxpKXtuLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9UUkFOU1BPUlQse3RyYW5zcG9ydFR5cGU6dC5UUkFOU1BPUlRfVFlQRVMuV0VCX1NPQ0tFVH0se3N1Y2Nlc3M6ZnVuY3Rpb24obil7dC5nZXRMb2coKS5pbmZvKCJnZXRXZWJTb2NrZXRVcmwgc3VjY2VlZGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlKG4pfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSksaSh7cmVhc29uOiJnZXRXZWJTb2NrZXRVcmwgZmFpbGVkIixfZGVidWc6ZX0pfSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe3QuZ2V0TG9nKCkuZXJyb3IoImdldFdlYlNvY2tldFVybCBBdXRoIEZhaWx1cmUiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoRXJyb3IoIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCB3aGlsZSBnZXR0aW5nIGdldFdlYlNvY2tldFVybCIpKSxyKCl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbigpe3QuZ2V0TG9nKCkuZXJyb3IoImdldFdlYlNvY2tldFVybCBBY2Nlc3MgRGVuaWVkIEZhaWx1cmUiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoRXJyb3IoIkFjY2VzcyBEZW5pZWQgRmFpbHVyZSB3aGlsZSBnZXR0aW5nIGdldFdlYlNvY2tldFVybCIpKSxvKCl9fSl9KSl9LHMucHJvdG90eXBlLmhhbmRsZVNlbmRMb2dzUmVxdWVzdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1bXSxyPWUubG9nc0J1ZmZlci5zbGljZSgpO2UubG9nc0J1ZmZlcj1bXSxyLmZvckVhY2goKGZ1bmN0aW9uKGUpe24ucHVzaCh7dGltZXN0YW1wOmUudGltZSxjb21wb25lbnQ6ZS5jb21wb25lbnQsbWVzc2FnZTplLnRleHR9KX0pKSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX0NMSUVOVF9MT0dTLHtsb2dFdmVudHM6bn0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJTZW5kTG9ncyByZXF1ZXN0IHN1Y2NlZWRlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiU2VuZExvZ3MgcmVxdWVzdCBmYWlsZWQuIikud2l0aE9iamVjdChuKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGF1dGhGYWlsdXJlOnQuaGl0Y2goZSxlLmhhbmRsZUF1dGhGYWlsKX0pfSxzLnByb3RvdHlwZS5oYW5kbGVBdXRoRmFpbD1mdW5jdGlvbihlKXtlP3RoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BVVRIX0ZBSUwsZSk6dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCl9LHMucHJvdG90eXBlLmhhbmRsZVBvbGxpbmdBdXRoRmFpbD1mdW5jdGlvbigpe3RoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5DVElfQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVEKX0scy5wcm90b3R5cGUuaGFuZGxlQWNjZXNzRGVuaWVkPWZ1bmN0aW9uKCl7dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFDQ0VTU19ERU5JRUQpfSxzLnByb3RvdHlwZS5jaGVja0F1dGhUb2tlbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1uZXcgRGF0ZShlLmluaXREYXRhLmF1dGhUb2tlbkV4cGlyYXRpb24pLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCk7bi5nZXRUaW1lKCk8cisxOGU1JiYodC5nZXRMb2coKS5pbmZvKCJBdXRoIHRva2VuIGV4cGlyZXMgYXQgIituKyIgU3RhcnQgcmVmcmVzaGluZyB0b2tlbiB3aXRoIHJldHJ5LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5iYWNrb2ZmKHQuaGl0Y2goZSxlLmF1dGhvcml6ZSksMWU0LDQpKX0scy5wcm90b3R5cGUuYXV0aG9yaXplPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dC5jb3JlLmF1dGhvcml6ZSh0aGlzLmluaXREYXRhLmF1dGhvcml6ZUVuZHBvaW50KS50aGVuKChmdW5jdGlvbihyKXt2YXIgbz1uZXcgRGF0ZShyLmV4cGlyYXRpb24pO3QuZ2V0TG9nKCkuaW5mbygiQXV0aG9yaXphdGlvbiBzdWNjZWVkZWQgYW5kIHRoZSB0b2tlbiBleHBpcmVzIGF0ICVzIixvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uaW5pdERhdGEuYXV0aFRva2VuPXIuYWNjZXNzVG9rZW4sbi5pbml0RGF0YS5hdXRoVG9rZW5FeHBpcmF0aW9uPW8sdC5jb3JlLmluaXRDbGllbnQobi5pbml0RGF0YSksdC5jb3JlLmluaXRBZ2VudEFwcENsaWVudChuLmluaXREYXRhKSxlLnN1Y2Nlc3MoKX0pKS5jYXRjaCgoZnVuY3Rpb24ocil7dC5nZXRMb2coKS5lcnJvcigiQXV0aG9yaXphdGlvbiBmYWlsZWQgd2l0aCBjb2RlICVzIixyLnN0YXR1cykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSw0MDE9PT1yLnN0YXR1cz9uLmhhbmRsZUF1dGhGYWlsKCk6ZS5mYWlsdXJlKCl9KSl9LHMucHJvdG90eXBlLmZpbHRlckF1dGhUb2tlbj1mdW5jdGlvbihlKXt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSlpZigicGFyYW1zIj09PW4pe3ZhciByPXt9O2Zvcih2YXIgbyBpbiBlLnBhcmFtcykiYXV0aGVudGljYXRpb24iIT09byYmKHJbb109ZS5wYXJhbXNbb10pO3QucGFyYW1zPXJ9ZWxzZSB0W25dPWVbbl07cmV0dXJuIHR9LHQud29ya2VyLm1haW49ZnVuY3Rpb24oKXt0Lndvcmtlci5jbGllbnRFbmdpbmU9bmV3IHN9fSgpfX0sdD17fTtmdW5jdGlvbiBuKHIpe3ZhciBvPXRbcl07aWYodm9pZCAwIT09bylyZXR1cm4gby5leHBvcnRzO3ZhciBpPXRbcl09e2V4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLG4pLGkuZXhwb3J0c31uLmc9ZnVuY3Rpb24oKXtpZigib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMpcmV0dXJuIGdsb2JhbFRoaXM7dHJ5e3JldHVybiB0aGlzfHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaChlKXtpZigib2JqZWN0Ij09dHlwZW9mIHdpbmRvdylyZXR1cm4gd2luZG93fX0oKSxuKDgyNyksbigxNjMpLG4oOTQ0KSxuKDE1MSksbig4OTEpLG4oNTkyKSxuKDgyKSxuKDc1NCksbig4MzMpLG4oMTYxKSxuKDk2NSksbigyODYpLG4oODk1KSxuKDc0Myksbig2NDIpLG4oNzM2KSxuKDQzOSksbigyNzkpLG4oNDE4KSxuKDE4Nyksbig4MjEpLG4oNTAwKX0pKCk7"),d=function(l){this.id=l.region,l.region=this._normalizeRegionString(l.region),this.height=l.height,this.style=l.iframe_style,this.ccp=this._createFramedCcp(l)};d.prototype._createFramedCcp=function(l){var Z=Z||"microphone; autoplay; clipboard-write",b=this.style||"margin: 0; border: 0; padding: 0px; width: 0px; height: 0px",d=document.createElement("iframe");return d.srcdoc=this.getContent(l),d.allow=Z,d.id=this.id,d.style=b,d.scrolling="no",d},d.prototype.getContent=function(l){return["","","","","