diff --git a/HelloUniMPDemo/HelloUniMPDemo.xcodeproj/project.pbxproj b/HelloUniMPDemo/HelloUniMPDemo.xcodeproj/project.pbxproj index 414ecc1808f8b0b98f5a06eca023b6257e6b2e52..c0c0bcab57043a9bb0db0434558a6f10833ba220 100644 --- a/HelloUniMPDemo/HelloUniMPDemo.xcodeproj/project.pbxproj +++ b/HelloUniMPDemo/HelloUniMPDemo.xcodeproj/project.pbxproj @@ -163,7 +163,7 @@ 2F8F66FE2B568AB4003E6DCC /* Sources */, 2F8F66FF2B568AB4003E6DCC /* Frameworks */, 2F8F67002B568AB4003E6DCC /* Resources */, - 0C76A5622B4094BA8E69DCB3 /* [CP] Copy Pods Resources */, + A951EBC6F1D70A7F2E4F0E42 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -223,43 +223,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 0C76A5622B4094BA8E69DCB3 /* [CP] Copy Pods Resources */ = { + 15E3B50BBE06F99B7E6CAAA5 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-HelloUniMPDemo/Pods-HelloUniMPDemo-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-HelloUniMPDemo/Pods-HelloUniMPDemo-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-HelloUniMPDemo-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloUniMPDemo/Pods-HelloUniMPDemo-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 15E3B50BBE06F99B7E6CAAA5 /* [CP] Check Pods Manifest.lock */ = { + A951EBC6F1D70A7F2E4F0E42 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-HelloUniMPDemo/Pods-HelloUniMPDemo-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-HelloUniMPDemo-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-HelloUniMPDemo/Pods-HelloUniMPDemo-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloUniMPDemo/Pods-HelloUniMPDemo-resources.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -443,6 +443,48 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-l\"SDWebImage\"", + "-l\"c++\"", + "-l\"coreSupport\"", + "-l\"iconv\"", + "-l\"libNativeObj\"", + "-l\"libNativeUI\"", + "-l\"libNavigator\"", + "-l\"libPDRCore\"", + "-l\"libStorage\"", + "-l\"libUI\"", + "-l\"libWeex\"", + "-framework", + "\"CFNetwork\"", + "-framework", + "\"CoreFoundation\"", + "-framework", + "\"CoreGraphics\"", + "-framework", + "\"CoreTelephony\"", + "-framework", + "\"CoreText\"", + "-framework", + "\"Foundation\"", + "-framework", + "\"ImageIO\"", + "-framework", + "\"JavaScriptCore\"", + "-framework", + "\"MediaPlayer\"", + "-framework", + "\"QuartzCore\"", + "-framework", + "\"QuickLook\"", + "-framework", + "\"UIKit\"", + "-framework", + "\"WebKit\"", + "-framework", + "\"storage\"", + ); PRODUCT_BUNDLE_IDENTIFIER = io.dcloud.HelloUniMPDemo; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = wildcard; @@ -477,6 +519,48 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-l\"SDWebImage\"", + "-l\"c++\"", + "-l\"coreSupport\"", + "-l\"iconv\"", + "-l\"libNativeObj\"", + "-l\"libNativeUI\"", + "-l\"libNavigator\"", + "-l\"libPDRCore\"", + "-l\"libStorage\"", + "-l\"libUI\"", + "-l\"libWeex\"", + "-framework", + "\"CFNetwork\"", + "-framework", + "\"CoreFoundation\"", + "-framework", + "\"CoreGraphics\"", + "-framework", + "\"CoreTelephony\"", + "-framework", + "\"CoreText\"", + "-framework", + "\"Foundation\"", + "-framework", + "\"ImageIO\"", + "-framework", + "\"JavaScriptCore\"", + "-framework", + "\"MediaPlayer\"", + "-framework", + "\"QuartzCore\"", + "-framework", + "\"QuickLook\"", + "-framework", + "\"UIKit\"", + "-framework", + "\"WebKit\"", + "-framework", + "\"storage\"", + ); PRODUCT_BUNDLE_IDENTIFIER = io.dcloud.HelloUniMPDemo; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = wildcard; diff --git a/UniMPSDK/Barcode/Libs/liblibBarcode.a b/UniMPSDK/Barcode/Libs/liblibBarcode.a index c3f51f4bc2eb5a46a38d047241414510601c8d0f..6ed568fcf1b1b3296dda33f16ad6cb2829851ca7 100644 Binary files a/UniMPSDK/Barcode/Libs/liblibBarcode.a and b/UniMPSDK/Barcode/Libs/liblibBarcode.a differ diff --git a/UniMPSDK/Core/Libs/libcoreSupport.a b/UniMPSDK/Core/Libs/libcoreSupport.a index 9cfc7ec68bdbcaef3241db251d6dc1bd0765515b..f0f81968d63fd04290213462b2adb3bf7849ac61 100644 Binary files a/UniMPSDK/Core/Libs/libcoreSupport.a and b/UniMPSDK/Core/Libs/libcoreSupport.a differ diff --git a/UniMPSDK/Core/Libs/liblibNativeObj.a b/UniMPSDK/Core/Libs/liblibNativeObj.a index ab6bd5e5f91cf8d9c933b6ff2d03d2389ddcf7d9..bf86ae6f285197158e10962ac9d7cb1a123cd40b 100644 Binary files a/UniMPSDK/Core/Libs/liblibNativeObj.a and b/UniMPSDK/Core/Libs/liblibNativeObj.a differ diff --git a/UniMPSDK/Core/Libs/liblibNativeUI.a b/UniMPSDK/Core/Libs/liblibNativeUI.a index e3c0a9e7cf4654681b5cdea949eac200c4c84c7a..345b3c6e07f140e1a38acea5bb08f5b9142464b2 100644 Binary files a/UniMPSDK/Core/Libs/liblibNativeUI.a and b/UniMPSDK/Core/Libs/liblibNativeUI.a differ diff --git a/UniMPSDK/Core/Libs/liblibNavigator.a b/UniMPSDK/Core/Libs/liblibNavigator.a index f0541fb69b3d8616d93e409e418e39f36ac825f5..a53f1600721a870121597f425e8d9f2d06c5ea96 100644 Binary files a/UniMPSDK/Core/Libs/liblibNavigator.a and b/UniMPSDK/Core/Libs/liblibNavigator.a differ diff --git a/UniMPSDK/Core/Libs/liblibPDRCore.a b/UniMPSDK/Core/Libs/liblibPDRCore.a index a9203e4caf5356d248088f52f43902687989944e..f0888f1874e05805deeaea7099292048aeafe944 100644 --- a/UniMPSDK/Core/Libs/liblibPDRCore.a +++ b/UniMPSDK/Core/Libs/liblibPDRCore.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:085b215fdac50d29591b8181b13929ccac66d87350847bc3c086eecb7688b108 -size 44273656 +oid sha256:3a16c088e49317347eed266c7a552d317aef98875b2520c3a0201cf6518e3353 +size 41570032 diff --git a/UniMPSDK/Core/Libs/liblibStorage.a b/UniMPSDK/Core/Libs/liblibStorage.a index fdea917069ab504061c195cdf5f63720bba97dc6..0d64e3d6a4db768eae114e9247d6ccf43a3a9ba4 100644 Binary files a/UniMPSDK/Core/Libs/liblibStorage.a and b/UniMPSDK/Core/Libs/liblibStorage.a differ diff --git a/UniMPSDK/Core/Libs/liblibUI.a b/UniMPSDK/Core/Libs/liblibUI.a index 00e454690112783cccf404c8da27a85ba8ac9ac1..5e1ec267d953194aa9bf7b6ba107e97a3171e5fc 100644 Binary files a/UniMPSDK/Core/Libs/liblibUI.a and b/UniMPSDK/Core/Libs/liblibUI.a differ diff --git a/UniMPSDK/Core/Libs/liblibWeex.a b/UniMPSDK/Core/Libs/liblibWeex.a index bc07b9297f0316838f5e1cb1dacc77667c7ef93c..dfefbd3e68325a3f343627266546e5bd9e5a39b3 100644 --- a/UniMPSDK/Core/Libs/liblibWeex.a +++ b/UniMPSDK/Core/Libs/liblibWeex.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a28739b29da6b5bca195a56cd7bbc2e6ae0de60b028eaa1e4071cf50bb6360c -size 84058200 +oid sha256:5d1d7f849274839b556382398da5f97a713dfdcb19c32f21867f9a18c5da33f1 +size 83427296 diff --git a/UniMPSDK/Core/Resources/uni-jsframework-vue3.js b/UniMPSDK/Core/Resources/uni-jsframework-vue3.js index 9cd3a1390941510fa7cbba20787cc19f6c830028..d51f0308f53826d53b040c52afc2b93da790c8d6 100644 --- a/UniMPSDK/Core/Resources/uni-jsframework-vue3.js +++ b/UniMPSDK/Core/Resources/uni-jsframework-vue3.js @@ -1,2 +1,2 @@ -//{"version":"3.99","encode":"base64"} -dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fID0gRGF0ZS5ub3coKTt2YXIgZ2xvYmFsPXRoaXM7IHZhciBwcm9jZXNzPXtlbnY6e319OyB2YXIgc2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dDsKKCgpPT57dmFyIFRwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgUHA9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczt2YXIgd0k9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxDST1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO3ZhciBJcD0oZixzLHApPT5zIGluIGY/VHAoZixzLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpwfSk6ZltzXT1wLE5wPShmLHMpPT57Zm9yKHZhciBwIGluIHN8fChzPXt9KSl3SS5jYWxsKHMscCkmJklwKGYscCxzW3BdKTtpZihQcClmb3IodmFyIHAgb2YgUHAocykpQ0kuY2FsbChzLHApJiZJcChmLHAsc1twXSk7cmV0dXJuIGZ9O3ZhciBBST0oZixzKT0+e2Zvcih2YXIgcCBpbiBzKVRwKGYscCx7Z2V0OnNbcF0sZW51bWVyYWJsZTohMH0pfTt2YXIgT2E9T2JqZWN0LmZyZWV6ZTtmdW5jdGlvbiBkYyh7Z2V0Q3VycmVudFBhZ2VzOmYsdW5pOnMsVW5pU2hhcmVkOnAsVnVlOncsVnVlU2hhcmVkOk59KXt2YXIgRT1mdW5jdGlvbihoLHksUixGZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEl0KCl7bGV0IHplPWYoKSxudD16ZS5sZW5ndGg7aWYobnQpcmV0dXJuIHplW250LTFdfWZ1bmN0aW9uIFZ0KCl7bGV0IHplPUl0KCk7aWYoemUpcmV0dXJuIHplLiR2bX1mdW5jdGlvbiBPdCh6ZSxudCxBdCl7aWYoUi5pc1N0cmluZyh6ZSkpQXQ9bnQsbnQ9emUsemU9VnQoKTtlbHNlIGlmKHR5cGVvZiB6ZT09Im51bWJlciIpe2xldCBUbj1mKCkuZmluZChzbj0+c24uJHBhZ2UuaWQ9PT16ZSk7VG4/emU9VG4uJHZtOnplPVZ0KCl9aWYoIXplKXJldHVybjtpZih6ZS5fX2NhbGxfaG9vaylyZXR1cm4gemUuX19jYWxsX2hvb2sobnQsQXQpO2xldCBRdD16ZS4kW250XTtyZXR1cm4gUXQmJnkuaW52b2tlQXJyYXlGbnMoUXQsQXQpfWZ1bmN0aW9uIFAoemUsbnQsQXQsUXQpe1IuaXNGdW5jdGlvbihudCkmJkZlLmluamVjdEhvb2soemUsbnQuYmluZChBdCksUXQpfWZ1bmN0aW9uIHd0KHplLG50LEF0KXt2YXIgUXQ7bGV0IFRuPXplLm1wVHlwZXx8QXQuJG1wVHlwZTtpZighKCFUbnx8VG49PT0iY29tcG9uZW50IikmJihPYmplY3Qua2V5cyh6ZSkuZm9yRWFjaChzbj0+e2lmKHkuaXNVbmlMaWZlY3ljbGVIb29rKHNuLHplW3NuXSwhMSkpe2xldCBvcj16ZVtzbl07Ui5pc0FycmF5KG9yKT9vci5mb3JFYWNoKFduPT5QKHNuLFduLEF0LG50KSk6UChzbixvcixBdCxudCl9fSksVG49PT0icGFnZSIpKXtudC5fX2lzVmlzaWJsZT0hMDt0cnl7T3QoQXQseS5PTl9MT0FELG50LmF0dHJzLl9fcGFnZVF1ZXJ5KSxkZWxldGUgbnQuYXR0cnMuX19wYWdlUXVlcnksKChRdD1BdC4kcGFnZSk9PT1udWxsfHxRdD09PXZvaWQgMD92b2lkIDA6UXQub3BlblR5cGUpIT09InByZWxvYWRQYWdlIiYmT3QoQXQseS5PTl9TSE9XKX1jYXRjaChzbil7Y29uc29sZS5lcnJvcihzbi5tZXNzYWdlK3kuTElORUZFRUQrc24uc3RhY2spfX19ZnVuY3Rpb24gSW4oemUsbnQpe290KG50LHplLiRyZW5kZXJqcyx6ZVsiJCIreS5SRU5ERVJKU19NT0RVTEVTXSl9ZnVuY3Rpb24gb3QoemUsbnQsQXQ9e30pe2lmKCFSLmlzQXJyYXkobnQpKXJldHVybjtsZXQgUXQ9emUudWlkLFRuPXplLiR3eHNNb2R1bGVzfHwoemUuJHd4c01vZHVsZXM9W10pLHNuPXplLmN0eDtudC5mb3JFYWNoKG9yPT57QXRbb3JdJiYoc25bb3JdPXooUXQsQXRbb3JdLG9yKSxUbi5wdXNoKG9yKSl9KX1mdW5jdGlvbiB6KHplLG50LEF0KXtsZXQgUXQ9e307cmV0dXJuIG5ldyBQcm94eShRdCx7Z2V0KFRuLHNuKXtyZXR1cm4gUXRbc25dfHwoUXRbc25dPUooemUsbnQsQXQsc24pKX19KX1mdW5jdGlvbiBKKHplLG50LEF0LFF0KXtsZXQgVG49KCk9Pnt9LHNuPSgpPT55LldYU19QUk9UT0NPTCtKU09OLnN0cmluZ2lmeShbemUsbnQsQXQrIi4iK1F0XSk7cmV0dXJuIG5ldyBQcm94eShUbix7Z2V0KG9yLFduKXtyZXR1cm4gV249PT0idG9KU09OIj9zbjpUbltXbl18fChUbltXbl09Sih6ZSxudCxBdCsiLiIrUXQsV24pKX0sYXBwbHkob3IsV24sQW4pe3JldHVybiB5LldYU19QUk9UT0NPTCtKU09OLnN0cmluZ2lmeShbemUsbnQsQXQrIi4iK1F0LFsuLi5Bbl1dKX19KX1mdW5jdGlvbiBobih6ZSxudCl7b3QobnQsemUuJHd4cyx6ZVsiJCIreS5XWFNfTU9EVUxFU10pfWZ1bmN0aW9uIHVuKHplLG50LEF0KXtobih6ZSxudCksSW4oemUsbnQpLHd0KHplLG50LEF0KX1mdW5jdGlvbiB5bih6ZSxudCxBdCl7cmV0dXJuIHplW250XT1BdH1mdW5jdGlvbiBKbih6ZSwuLi5udCl7bGV0IEF0PXRoaXNbemVdO3JldHVybiBBdD9BdCguLi5udCk6KGNvbnNvbGUuZXJyb3IoYG1ldGhvZCAke3plfSBub3QgZm91bmRgKSxudWxsKX1mdW5jdGlvbiBnaSh6ZSl7cmV0dXJuIGZ1bmN0aW9uKEF0LFF0LFRuKXtpZighUXQpdGhyb3cgQXQ7bGV0IHNuPXplLl9pbnN0YW5jZTtpZighc258fCFzbi5wcm94eSl0aHJvdyBBdDtPdChzbi5wcm94eSx5Lk9OX0VSUk9SLEF0KX19ZnVuY3Rpb24gcGkoemUsbnQpe3JldHVybiB6ZT9bLi4ubmV3IFNldChbXS5jb25jYXQoemUsbnQpKV06bnR9ZnVuY3Rpb24gcXIoemUpe3kuVW5pTGlmZWN5Y2xlSG9va3MuZm9yRWFjaChudD0+e3plW250XT1waX0pfWxldCBncixTbj0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLHByPS9eKD86W0EtWmEtelxkKy9dezR9KSo/KD86W0EtWmEtelxkKy9dezJ9KD86PT0pP3xbQS1aYS16XGQrL117M309Pyk/JC87dHlwZW9mIGF0b2IhPSJmdW5jdGlvbiI/Z3I9ZnVuY3Rpb24oemUpe2lmKHplPVN0cmluZyh6ZSkucmVwbGFjZSgvW1x0XG5cZlxyIF0rL2csIiIpLCFwci50ZXN0KHplKSl0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdhdG9iJyBvbiAnV2luZG93JzogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iKTt6ZSs9Ij09Ii5zbGljZSgyLSh6ZS5sZW5ndGgmMykpO2Zvcih2YXIgbnQsQXQ9IiIsUXQsVG4sc249MDtzbjx6ZS5sZW5ndGg7KW50PVNuLmluZGV4T2YoemUuY2hhckF0KHNuKyspKTw8MTh8U24uaW5kZXhPZih6ZS5jaGFyQXQoc24rKykpPDwxMnwoUXQ9U24uaW5kZXhPZih6ZS5jaGFyQXQoc24rKykpKTw8NnwoVG49U24uaW5kZXhPZih6ZS5jaGFyQXQoc24rKykpKSxBdCs9UXQ9PT02ND9TdHJpbmcuZnJvbUNoYXJDb2RlKG50Pj4xNiYyNTUpOlRuPT09NjQ/U3RyaW5nLmZyb21DaGFyQ29kZShudD4+MTYmMjU1LG50Pj44JjI1NSk6U3RyaW5nLmZyb21DaGFyQ29kZShudD4+MTYmMjU1LG50Pj44JjI1NSxudCYyNTUpO3JldHVybiBBdH06Z3I9YXRvYjtmdW5jdGlvbiBMcih6ZSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChncih6ZSkuc3BsaXQoIiIpLm1hcChmdW5jdGlvbihudCl7cmV0dXJuIiUiKygiMDAiK250LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSl9ZnVuY3Rpb24gSnIoKXtsZXQgemU9cy5nZXRTdG9yYWdlU3luYygidW5pX2lkX3Rva2VuIil8fCIiLG50PXplLnNwbGl0KCIuIik7aWYoIXplfHxudC5sZW5ndGghPT0zKXJldHVybnt1aWQ6bnVsbCxyb2xlOltdLHBlcm1pc3Npb246W10sdG9rZW5FeHBpcmVkOjB9O2xldCBBdDt0cnl7QXQ9SlNPTi5wYXJzZShMcihudFsxXSkpfWNhdGNoKFF0KXt0aHJvdyBuZXcgRXJyb3IoIlx1ODNCN1x1NTNENlx1NUY1M1x1NTI0RFx1NzUyOFx1NjIzN1x1NEZFMVx1NjA2Rlx1NTFGQVx1OTUxOVx1RkYwQ1x1OEJFNlx1N0VDNlx1OTUxOVx1OEJFRlx1NEZFMVx1NjA2Rlx1NEUzQVx1RkYxQSIrUXQubWVzc2FnZSl9cmV0dXJuIEF0LnRva2VuRXhwaXJlZD1BdC5leHAqMWUzLGRlbGV0ZSBBdC5leHAsZGVsZXRlIEF0LmlhdCxBdH1mdW5jdGlvbiB2aSh6ZSl7emUudW5pSURIYXNSb2xlPWZ1bmN0aW9uKG50KXtsZXR7cm9sZTpBdH09SnIoKTtyZXR1cm4gQXQuaW5kZXhPZihudCk+LTF9LHplLnVuaUlESGFzUGVybWlzc2lvbj1mdW5jdGlvbihudCl7bGV0e3Blcm1pc3Npb246QXR9PUpyKCk7cmV0dXJuIHRoaXMudW5pSURIYXNSb2xlKCJhZG1pbiIpfHxBdC5pbmRleE9mKG50KT4tMX0semUudW5pSURUb2tlblZhbGlkPWZ1bmN0aW9uKCl7bGV0e3Rva2VuRXhwaXJlZDpudH09SnIoKTtyZXR1cm4gbnQ+RGF0ZS5ub3coKX19ZnVuY3Rpb24gUG4oemUpe2xldCBudD16ZS5fY29udGV4dC5jb25maWc7bnQuZXJyb3JIYW5kbGVyPXkuaW52b2tlQ3JlYXRlRXJyb3JIYW5kbGVyKHplLGdpKSxxcihudC5vcHRpb25NZXJnZVN0cmF0ZWdpZXMpO2xldCBBdD1udC5nbG9iYWxQcm9wZXJ0aWVzO3ZpKEF0KSxBdC4kc2V0PXluLEF0LiRhcHBseU9wdGlvbnM9dW4sQXQuJGNhbGxNZXRob2Q9Sm4seS5pbnZva2VDcmVhdGVWdWVBcHBIb29rKHplKX1yZXR1cm4gaC5pbml0QXBwPVBuLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxofSh7fSxwLE4sdyk7cmV0dXJuIEV9ZnVuY3Rpb24gZXUoZix7bnZ1ZTpzLFVuaVNoYXJlZDpwLFZ1ZVNoYXJlZDp3LFZ1ZVJlYWN0aXZpdHk6Tn0pe2xldCBFPXtwbGF0Zm9ybTpzLmNvbmZpZy5lbnYucGxhdGZvcm0sVW5pU2hhcmVkOnAsVnVlU2hhcmVkOncsVnVlUmVhY3Rpdml0eTpOfTtyZXR1cm4gZihFLHMuZG9jdW1lbnQpfWZ1bmN0aW9uIE9JKHtzZXRUaW1lb3V0OmYsY2xlYXJUaW1lb3V0OnMsdW5pOnAsZ2V0Q3VycmVudFBhZ2VzOncsVnVlOk4sd2VleDpFLHBsdXM6aCxCcm9hZGNhc3RDaGFubmVsOnksVW5pVmlld0pTQnJpZGdlOlIsVnVlU2hhcmVkOkZlLFVuaVNoYXJlZDpJdCxfX3VuaUNvbmZpZzpWdH0pe3ZhciBPdD1mdW5jdGlvbihQLHd0LEluKXsidXNlIHN0cmljdCI7bGV0IG90PVsibmF2aWdhdGUiLCJyZWRpcmVjdCIsInN3aXRjaFRhYiIsInJlTGF1bmNoIiwibmF2aWdhdGVCYWNrIl0sej1bInNsaWRlLWluLXJpZ2h0Iiwic2xpZGUtaW4tbGVmdCIsInNsaWRlLWluLXRvcCIsInNsaWRlLWluLWJvdHRvbSIsImZhZGUtaW4iLCJ6b29tLW91dCIsInpvb20tZmFkZS1vdXQiLCJwb3AtaW4iLCJub25lIl0sSj1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLGhuPXtob3ZlckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJuYXZpZ2F0b3ItaG92ZXIifSx1cmw6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG9wZW5UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJuYXZpZ2F0ZSIsdmFsaWRhdG9yKHYpe3JldHVybiBCb29sZWFuKH5vdC5pbmRleE9mKHYpKX19LGRlbHRhOnt0eXBlOk51bWJlcixkZWZhdWx0OjF9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjUwfSxob3ZlclN0YXlUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjYwMH0sZXhpc3RzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGFuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yKHYpe3JldHVybiF2fHx6LmNvbmNhdChKKS5pbmNsdWRlcyh2KX19LGFuaW1hdGlvbkR1cmF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjMwMH19O2Z1bmN0aW9uIHVuKHYpe3JldHVybigpPT57aWYodi5vcGVuVHlwZSE9PSJuYXZpZ2F0ZUJhY2siJiYhdi51cmwpe2NvbnNvbGUuZXJyb3IoIjxuYXZpZ2F0b3IvPiBzaG91bGQgaGF2ZSB1cmwgYXR0cmlidXRlIHdoZW4gdXNpbmcgbmF2aWdhdGVUbywgcmVkaXJlY3RUbywgcmVMYXVuY2ggb3Igc3dpdGNoVGFiIik7cmV0dXJufWxldCB4PXBhcnNlSW50KHYuYW5pbWF0aW9uRHVyYXRpb24pO3N3aXRjaCh2Lm9wZW5UeXBlKXtjYXNlIm5hdmlnYXRlIjpwLm5hdmlnYXRlVG8oe3VybDp2LnVybCxhbmltYXRpb25UeXBlOnYuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246eH0pO2JyZWFrO2Nhc2UicmVkaXJlY3QiOnAucmVkaXJlY3RUbyh7dXJsOnYudXJsLGV4aXN0czp2LmV4aXN0c30pO2JyZWFrO2Nhc2Uic3dpdGNoVGFiIjpwLnN3aXRjaFRhYih7dXJsOnYudXJsfSk7YnJlYWs7Y2FzZSJyZUxhdW5jaCI6cC5yZUxhdW5jaCh7dXJsOnYudXJsfSk7YnJlYWs7Y2FzZSJuYXZpZ2F0ZUJhY2siOnAubmF2aWdhdGVCYWNrKHtkZWx0YTp2LmRlbHRhLGFuaW1hdGlvblR5cGU6di5hbmltYXRpb25UeXBlfHwicG9wLW91dCIsYW5pbWF0aW9uRHVyYXRpb246eH0pO2JyZWFrfX19ZnVuY3Rpb24geW4odil7aWYodi5ob3ZlckNsYXNzJiZ2LmhvdmVyQ2xhc3MhPT0ibm9uZSIpe2xldCB4PXtob3ZlckNsYXNzOnYuaG92ZXJDbGFzc307cmV0dXJuIHd0Lmhhc093bih2LCJob3ZlclN0YXJ0VGltZSIpJiYoeC5ob3ZlclN0YXJ0VGltZT12LmhvdmVyU3RhcnRUaW1lKSx3dC5oYXNPd24odiwiaG92ZXJTdGF5VGltZSIpJiYoeC5ob3ZlclN0YXlUaW1lPXYuaG92ZXJTdGF5VGltZSksd3QuaGFzT3duKHYsImhvdmVyU3RvcFByb3BhZ2F0aW9uIikmJih4LmhvdmVyU3RvcFByb3BhZ2F0aW9uPXYuaG92ZXJTdG9wUHJvcGFnYXRpb24pLHh9cmV0dXJue319ZnVuY3Rpb24gSm4odix4KXtyZXR1cm4gUC5jcmVhdGVFbGVtZW50Vk5vZGUoInUtdGV4dCIsd3QuZXh0ZW5kKHthcHBlbmRBc1RyZWU6ITB9LHgpLHYpfWxldCBnaT1beyJuYXZpZ2F0b3ItaG92ZXIiOnsiIjp7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDAuMSkiLG9wYWNpdHk6Ljd9fX1dLHBpPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJOYXZpZ2F0b3IiLHByb3BzOmhuLHN0eWxlczpnaSxzZXR1cCh2LHtzbG90czp4fSl7bGV0ICQ9dW4odik7cmV0dXJuKCk9PlAuY3JlYXRlVk5vZGUoInZpZXciLFAubWVyZ2VQcm9wcyh5bih2KSx7b25DbGljazokfSksW3guZGVmYXVsdCYmeC5kZWZhdWx0KCldKX19KTtmdW5jdGlvbiBxcih2KXtyZXR1cm4gU3ltYm9sKHYpfWZ1bmN0aW9uIGdyKCl7bGV0IHY7dHJ5e3Y9UC5nZXRDdXJyZW50SW5zdGFuY2UoKS5yb290LnByb3h5LiRwYWdlLmlkfWNhdGNoKHgpe2xldCAkPWgud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkO3Y9aXNOYU4oTnVtYmVyKCQpKT8kOk51bWJlcigkKX1yZXR1cm4gdn1sZXQgU24scHIsTHI7ZnVuY3Rpb24gSnIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz09Im9iamVjdCImJnR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZ0eXBlb2YgZG9jdW1lbnQ9PSJvYmplY3QiPyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIHZpKCl7cmV0dXJuIFNuLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH1sZXQgUG4semUsbnQ9e307ZnVuY3Rpb24gQXQodil7bGV0IHg9di5kYXRhJiZ2LmRhdGEuX19tZXNzYWdlO2lmKCF4fHwheC5fX3BhZ2UpcmV0dXJuO2xldCAkPXguX19wYWdlLFU9bnRbJF07VSYmVSh4KSx4LmtlZXB8fGRlbGV0ZSBudFskXX1mdW5jdGlvbiBRdCh2LHgpe0pyKCk9PT0idjgiP0xyPyhQbiYmUG4uY2xvc2UoKSxQbj1uZXcgTHIodmkoKSksUG4ub25tZXNzYWdlPUF0KTp6ZXx8KHplPXByLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IiksemUuYWRkRXZlbnRMaXN0ZW5lcigicGx1c01lc3NhZ2UiLEF0KSk6d2luZG93Ll9fcGx1c01lc3NhZ2U9QXQsbnRbdl09eH1jbGFzcyBUbntjb25zdHJ1Y3Rvcih4KXt0aGlzLndlYnZpZXc9eH1zZW5kTWVzc2FnZSh4KXtsZXQgJD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtfX21lc3NhZ2U6e2RhdGE6eH19KSksVT10aGlzLndlYnZpZXcuaWQ7THI/bmV3IExyKFUpLnBvc3RNZXNzYWdlKCQpOlNuLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3JiZTbi53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldygkLFUpfWNsb3NlKCl7dGhpcy53ZWJ2aWV3LmNsb3NlKCl9fWZ1bmN0aW9uIHNuKHtjb250ZXh0OnY9e30sdXJsOngsZGF0YTokPXt9LHN0eWxlOlU9e30sb25NZXNzYWdlOlosb25DbG9zZTpxfSl7bGV0IHRlPVZ0LmRhcmttb2RlO1NuPXYucGx1c3x8aCxwcj12LndlZXh8fCh0eXBlb2YgRT09Im9iamVjdCI/RTpudWxsKSxMcj12LkJyb2FkY2FzdENoYW5uZWx8fCh0eXBlb2YgeT09Im9iamVjdCI/eTpudWxsKTtsZXQgY2U9e2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LHBlPWBwYWdlJHtEYXRlLm5vdygpfWA7VT13dC5leHRlbmQoe30sVSksVS50aXRsZU5WaWV3IT09ITEmJlUudGl0bGVOVmlldyE9PSJub25lIiYmKFUudGl0bGVOVmlldz13dC5leHRlbmQoY2UsVS50aXRsZU5WaWV3KSk7bGV0IEllPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6YC8ke3h9LmpzYCxkZWZhdWx0Rm9udFNpemU6MTYsdmlld3BvcnQ6U24uc2NyZWVuLnJlc29sdXRpb25XaWR0aH19O1U9d3QuZXh0ZW5kKEllLFUpO2xldCBmZT1Tbi53ZWJ2aWV3LmNyZWF0ZSgiIixwZSxVLHtleHRyYXM6e2Zyb206dmkoKSxydW50aW1lOkpyKCksZGF0YTp3dC5leHRlbmQoe30sJCx7ZGFya21vZGU6dGV9KSx1c2VHbG9iYWxFdmVudDohTHJ9fSk7cmV0dXJuIGZlLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixxKSxRdChwZSxDZT0+e3d0LmlzRnVuY3Rpb24oWikmJlooQ2UuZGF0YSksQ2Uua2VlcHx8ZmUuY2xvc2UoImF1dG8iKX0pLGZlLnNob3coVS5hbmltYXRpb25UeXBlLFUuYW5pbWF0aW9uRHVyYXRpb24pLG5ldyBUbihmZSl9bGV0IG9yPXtmb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxXbj1xcigidWwiKTtmdW5jdGlvbiBBbigpe2xldCB2PVtdO3JldHVybiBQLnByb3ZpZGUoV24se2FkZEhhbmRsZXIoeCl7di5wdXNoKHgpfSxyZW1vdmVIYW5kbGVyKHgpe3Yuc3BsaWNlKHYuaW5kZXhPZih4KSwxKX19KSx2fWxldCBnbj1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiTGFiZWwiLHByb3BzOm9yLHN0eWxlczpbXSxzZXR1cCh2LHtzbG90czp4fSl7bGV0ICQ9Z3IoKSxVPUFuKCksWj1xPT57di5mb3I/Ui5lbWl0KGB1bmktbGFiZWwtY2xpY2stJHskfS0ke3YuZm9yfWAscSwhMCk6VS5sZW5ndGgmJlVbMF0ocSwhMCl9O3JldHVybigpPT5QLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7b25DbGljazpafSxbeC5kZWZhdWx0JiZ4LmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIHdyKHYseCl7S3Iodi5pZCx4KSxQLndhdGNoKCgpPT52LmlkLCgkLFUpPT57d28oVSx4LCEwKSxLcigkLHgsITApfSksUC5vblVubW91bnRlZCgoKT0+e3dvKHYuaWQseCl9KX1mdW5jdGlvbiBLcih2LHgsJCl7bGV0IFU9Z3IoKTskJiYhdnx8IXd0LmlzUGxhaW5PYmplY3QoeCl8fE9iamVjdC5rZXlzKHgpLmZvckVhY2goWj0+eyQ/Wi5pbmRleE9mKCJAIikhPT0wJiZaLmluZGV4T2YoInVuaS0iKSE9PTAmJlIub24oYHVuaS0ke1p9LSR7VX0tJHt2fWAseFtaXSk6Wi5pbmRleE9mKCJ1bmktIik9PT0wP1Iub24oWix4W1pdKTp2JiZSLm9uKGB1bmktJHtafS0ke1V9LSR7dn1gLHhbWl0pfSl9ZnVuY3Rpb24gd28odix4LCQpe2xldCBVPWdyKCk7JCYmIXZ8fCF3dC5pc1BsYWluT2JqZWN0KHgpfHxPYmplY3Qua2V5cyh4KS5mb3JFYWNoKFo9PnskP1ouaW5kZXhPZigiQCIpIT09MCYmWi5pbmRleE9mKCJ1bmktIikhPT0wJiZSLm9mZihgdW5pLSR7Wn0tJHtVfS0ke3Z9YCx4W1pdKTpaLmluZGV4T2YoInVuaS0iKT09PTA/Ui5vZmYoWix4W1pdKTp2JiZSLm9mZihgdW5pLSR7Wn0tJHtVfS0ke3Z9YCx4W1pdKX0pfWZ1bmN0aW9uIGRhKHYpe3JldHVybiBPYmplY3Qua2V5cyh2KS5tYXAoeD0+W3gsdlt4XV0pfWxldCBVaT1bImNsYXNzIiwic3R5bGUiXSxabz0vXm9uW0EtWl0rLyxYbz0odj17fSk9PntsZXR7ZXhjbHVkZUxpc3RlbmVyczp4PSExLGV4Y2x1ZGVLZXlzOiQ9W119PXYsVT1QLmdldEN1cnJlbnRJbnN0YW5jZSgpLFo9UC5zaGFsbG93UmVmKHt9KSxxPVAuc2hhbGxvd1JlZih7fSksdGU9UC5zaGFsbG93UmVmKHt9KSxjZT0kLmNvbmNhdChVaSk7cmV0dXJuIFUuYXR0cnM9UC5yZWFjdGl2ZShVLmF0dHJzKSxQLndhdGNoRWZmZWN0KCgpPT57bGV0IHBlPWRhKFUuYXR0cnMpLnJlZHVjZSgoSWUsW2ZlLENlXSk9PihjZS5pbmNsdWRlcyhmZSk/SWUuZXhjbHVkZVtmZV09Q2U6Wm8udGVzdChmZSk/KHh8fChJZS5hdHRyc1tmZV09Q2UpLEllLmxpc3RlbmVyc1tmZV09Q2UpOkllLmF0dHJzW2ZlXT1DZSxJZSkse2V4Y2x1ZGU6e30sYXR0cnM6e30sbGlzdGVuZXJzOnt9fSk7Wi52YWx1ZT1wZS5hdHRycyxxLnZhbHVlPXBlLmxpc3RlbmVycyx0ZS52YWx1ZT1wZS5leGNsdWRlfSkseyRhdHRyczpaLCRsaXN0ZW5lcnM6cSwkZXhjbHVkZUF0dHJzOnRlfX0sJGk9e2lkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxob3ZlckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJidXR0b24taG92ZXIifSxob3ZlclN0YXJ0VGltZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyMH0saG92ZXJTdGF5VGltZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo3MH0saG92ZXJTdG9wUHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGZvcm1UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbG9hZGluZzp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHBsYWluOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LHJpPXFyKCJ1ZiIpLENvPVt7dWI6eyIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIscG9zaXRpb246InJlbGF0aXZlIixwYWRkaW5nTGVmdDoiNSIscGFkZGluZ1JpZ2h0OiI1IixvdmVyZmxvdzoiaGlkZGVuIixjb2xvcjoiIzAwMDAwMCIsYmFja2dyb3VuZENvbG9yOiIjZjhmOGY4Iixib3JkZXJSYWRpdXM6IjUiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZGJkYmRiIn19LCJ1Yi10Ijp7IiI6e2NvbG9yOiIjMDAwMDAwIixmb250U2l6ZToiMTgiLHRleHREZWNvcmF0aW9uOiJub25lIixsaW5lSGVpZ2h0OiI0NiJ9fSwidWItZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNmOGY4ZjgifX0sInViLXAiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIixib3JkZXJDb2xvcjoiIzAwNjJjYyJ9fSwidWItdyI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNlNjQzNDAiLGJvcmRlckNvbG9yOiIjYjgzNjMzIn19LCJ1Yi1kLXQiOnsiIjp7Y29sb3I6IiMwMDAwMDAifX0sInViLXAtdCI6eyIiOntjb2xvcjoiI2ZmZmZmZiJ9fSwidWItdy10Ijp7IiI6e2NvbG9yOiIjZmZmZmZmIn19LCJ1Yi1kLWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjZjdmN2Y3In19LCJ1Yi1wLWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjNjNhY2ZjIixib3JkZXJDb2xvcjoiIzRmOGFjYSJ9fSwidWItdy1kIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2VjOGI4OSIsYm9yZGVyQ29sb3I6IiNiZDZmNmUifX0sInViLWQtdC1kIjp7IiI6e2NvbG9yOiIjY2NjY2NjIn19LCJ1Yi1wLXQtZCI6eyIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn19LCJ1Yi13LXQtZCI6eyIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn19LCJ1Yi1kLXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjMzUzNTM1IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXAtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiMwMDdhZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItdy1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiI2U2NDM0MCIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1kLXQtcGxhaW4iOnsiIjp7Y29sb3I6IiMzNTM1MzUifX0sInViLXAtdC1wbGFpbiI6eyIiOntjb2xvcjoiIzAwN2FmZiJ9fSwidWItdy10LXBsYWluIjp7IiI6e2NvbG9yOiIjZTY0MzQwIn19LCJ1Yi1kLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItcC1kLXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXctZC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1kLXQtZC1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn19LCJ1Yi1wLXQtZC1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn19LCJ1Yi13LXQtZC1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn19LCJ1Yi1taW5pIjp7IiI6e2xpbmVIZWlnaHQ6IjMwIixmb250U2l6ZToiMTMiLHBhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6IjE3LjUiLHBhZGRpbmdCb3R0b206MCxwYWRkaW5nTGVmdDoiMTcuNSJ9fSwidWItbG9hZGluZyI6eyIiOnt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLG1hcmdpblJpZ2h0OiIxMCJ9fSwidWItZC1sb2FkaW5nIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItcC1sb2FkaW5nIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItdy1sb2FkaW5nIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItZC1sb2FkaW5nLXBsYWluIjp7IiI6e2NvbG9yOiIjMzUzNTM1In19LCJ1Yi1wLWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiMwMDdhZmYiLGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9fSwidWItdy1sb2FkaW5nLXBsYWluIjp7IiI6e2NvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtaG92ZXIiOnsiIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiNkZWRlZGUifX0sInViLXAtaG92ZXIiOnsiIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiMwMDYyY2MifX0sInViLXctaG92ZXIiOnsiIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiNjZTNjMzkifX0sInViLWQtdC1ob3ZlciI6eyIiOntjb2xvcjoicmdiYSgwLDAsMCwwLjYpIn19LCJ1Yi1wLXQtaG92ZXIiOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9fSwidWItdy10LWhvdmVyIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLWQtaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoNTMsNTMsNTMsMC42KSIsYm9yZGVyQ29sb3I6InJnYmEoNTMsNTMsNTMsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWhvdmVyLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDI2LDE3MywyNSwwLjYpIixib3JkZXJDb2xvcjoicmdiYSgwLDEyMiwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LWhvdmVyLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixib3JkZXJDb2xvcjoicmdiYSgyMzAsNjcsNjQsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19fV0sQW89e2RlZmF1bHQ6ImQiLHByaW1hcnk6InAiLHdhcm46IncifSxPbz1QLmRlZmluZUNvbXBvbmVudCh7aW5oZXJpdEF0dHJzOiExLG5hbWU6IkJ1dHRvbiIscHJvcHM6d3QuZXh0ZW5kKCRpLHt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJkZWZhdWx0In0sc2l6ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiZGVmYXVsdCJ9fSksc3R5bGVzOkNvLHNldHVwKHYse3Nsb3RzOngsYXR0cnM6JH0pe2xldHskYXR0cnM6VSwkZXhjbHVkZUF0dHJzOlosJGxpc3RlbmVyczpxfT1Ybyh7ZXhjbHVkZUxpc3RlbmVyczohMH0pLHRlPXYudHlwZSxjZT1QLnJlZihudWxsKSxwZT1QLmluamVjdChyaSwhMSksSWU9KHl0LGplKT0+e2xldCBNdD1xLnZhbHVlLm9uQ2xpY2t8fCgoKT0+e30pO2lmKHYuZGlzYWJsZWQpcmV0dXJuO010KHl0KTtsZXQgZG49di5mb3JtVHlwZTtpZihkbil7aWYoIXBlKXJldHVybjtkbj09PSJzdWJtaXQiP3BlLnN1Ym1pdCh5dCk6ZG49PT0icmVzZXQiJiZwZS5yZXNldCh5dCl9fSxmZT15dD0+e2xldCBqZT0idWItIitBb1t0ZV0reXQ7cmV0dXJuIHYuZGlzYWJsZWQmJihqZSs9Ii1kIiksdi5wbGFpbiYmKGplKz0iLXBsYWluIiksdi5zaXplPT09Im1pbmkiJiZ5dD09PSItdCImJihqZSs9IiB1Yi1taW5pIiksamV9LENlPXl0PT57aWYodi5kaXNhYmxlZClyZXR1cm4iIjtsZXQgamU9InViLSIrQW9bdGVdK3l0KyItaG92ZXIiO3JldHVybiB2LnBsYWluJiYoamUrPSItcGxhaW4iKSxqZX0sY3Q9UC5pbmplY3QoV24sITEpO2N0JiYoY3QuYWRkSGFuZGxlcihJZSksUC5vbkJlZm9yZVVubW91bnQoKCk9PntjdC5yZW1vdmVIYW5kbGVyKEllKX0pKSx3cih2LHsibGFiZWwtY2xpY2siOkllfSk7bGV0IGd0PVAuY29tcHV0ZWQoKCk9PntsZXQgeXQ9e307Zm9yKGxldCBqZSBpbiBxLnZhbHVlKXtsZXQgTXQ9cS52YWx1ZVtqZV07amUhPT0ib25DbGljayImJih5dFtqZV09TXQpfXJldHVybiB5dH0pLEh0PSgpPT57aWYoIXguZGVmYXVsdClyZXR1cm5bXTtsZXQgeXQ9eC5kZWZhdWx0KCk7cmV0dXJuIHl0Lmxlbmd0aD09PTEmJnl0WzBdLnR5cGU9PT1QLlRleHQ/W0puKHl0WzBdLmNoaWxkcmVuLHtjbGFzczoidWItdCAiK2ZlKCItdCIpfSldOnl0fTtyZXR1cm4oKT0+e2xldCB5dD13dC5leHRlbmQoe30seW4odikse2hvdmVyQ2xhc3M6Q2UoIiIpfSxVLnZhbHVlLFoudmFsdWUsZ3QudmFsdWUpO3JldHVybiBQLmNyZWF0ZVZOb2RlKCJ2aWV3IixQLm1lcmdlUHJvcHMoe3JlZjpjZSxjbGFzczpbInViIixmZSgiIildLG9uQ2xpY2s6SWV9LHl0KSxbdi5sb2FkaW5nP1AuY3JlYXRlVk5vZGUoImxvYWRpbmctaW5kaWNhdG9yIixQLm1lcmdlUHJvcHMoe2NsYXNzOlsidWItbG9hZGluZyIsYHViLSR7QW9bdGVdfS1sb2FkaW5nYF19LHthcnJvdzoiZmFsc2UiLGFuaW1hdGluZzoidHJ1ZSJ9KSxudWxsKTpudWxsLC4uLkh0KCldKX19fSksWGk9e3NjYWxlQXJlYTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fTtmdW5jdGlvbiBtaSh2KXtsZXQgeD1bXTtyZXR1cm4gd3QuaXNBcnJheSh2KSYmdi5mb3JFYWNoKCQ9PntQLmlzVk5vZGUoJCk/JC50eXBlPT09UC5GcmFnbWVudD94LnB1c2goLi4ubWkoJC5jaGlsZHJlbikpOngucHVzaCgkKTp3dC5pc0FycmF5KCQpJiZ4LnB1c2goLi4ubWkoJCkpfSkseH1mdW5jdGlvbiBUbyh2KXtsZXQgeD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihVKXtyZXR1cm4geFtVXXx8KHhbVV09dihVKSl9fWxldCB1bz1UbyhmdW5jdGlvbih2KXtsZXQgeD17fSwkPS87KD8hW14oXSpcKSkvZyxVPS86KC4rKS87cmV0dXJuIHYuc3BsaXQoJCkuZm9yRWFjaChmdW5jdGlvbihaKXtpZihaKXtsZXQgcT1aLnNwbGl0KFUpO3EubGVuZ3RoPjEmJih4W3FbMF0udHJpbSgpXT1xWzFdLnRyaW0oKSl9fSkseH0pLGtuPXY9Pm5ldyBQcm9taXNlKCh4LCQpPT57aWYoIXYpcmV0dXJuIHgoe3dpZHRoOjAsaGVpZ2h0OjAsdG9wOjAsbGVmdDowfSk7RS5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHYsKHtzaXplOlp9KT0+e3goWil9KX0pLENyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJNb3ZhYmxlQXJlYSIscHJvcHM6WGksc3R5bGVzOlt7InVuaS1tb3ZhYmxlLWFyZWEiOnsiIjp7b3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6IjEwcHgiLGhlaWdodDoiMTBweCJ9fX1dLHNldHVwKHYse3Nsb3RzOnh9KXtsZXQgJD1QLnJlZigwKSxVPVAucmVmKDApLFo9UC5yZWYoMCkscT1QLnJlZigwKSx0ZT1QLnJlZighMSksY2U9UC5yZWYobnVsbCkscGU9W10sSWU9bnVsbCxmZT1qZT0+e0llPWplfSxDZT0oKT0+a24oY2UudmFsdWUpLnRoZW4oKHt3aWR0aDpqZSxoZWlnaHQ6TXQsdG9wOmRuLGxlZnQ6R3R9KT0+eyQudmFsdWU9amUsVS52YWx1ZT1NdCxaLnZhbHVlPWRuLHEudmFsdWU9R3R9KSxjdD0oKT0+e0NlKCkudGhlbigoKT0+e3BlLmZvckVhY2goZnVuY3Rpb24oamUpe2plLnNldFBhcmVudCgpfSl9KX07UC5vbk1vdW50ZWQoKCk9PntmKCgpPT57dGUudmFsdWU9ITAsY3QoKX0sMjAwKX0pO2xldCBndD17b25QYW5zdGFydChqZSl7SWUmJkllLnRvdWNoc3RhcnQoamUpfSxvblBhbm1vdmUoamUpe2plLnN0b3BQcm9wYWdhdGlvbigpLEllJiZJZS50b3VjaG1vdmUoamUpfSxvblBhbmVuZChqZSl7SWUmJkllLnRvdWNoZW5kKGplKSxJZT1udWxsfX0sSHQ9amU9PntwZS5wdXNoKGplKX0seXQ9amU9PntsZXQgTXQ9cGUuaW5kZXhPZihqZSk7TXQ+PTAmJnBlLnNwbGljZShNdCwxKX07cmV0dXJuIFAucHJvdmlkZSgiX2lzTW91bnRlZCIsdGUpLFAucHJvdmlkZSgicGFyZW50U2l6ZSIse3dpZHRoOiQsaGVpZ2h0OlUsdG9wOlosbGVmdDpxfSksUC5wcm92aWRlKCJhZGRNb3ZhYmxlVmlld0NvbnRleHQiLEh0KSxQLnByb3ZpZGUoInJlbW92ZU1vdmFibGVWaWV3Q29udGV4dCIseXQpLFAucHJvdmlkZSgic2V0VG91Y2hNb3ZhYmxlVmlld0NvbnRleHQiLGZlKSwoKT0+e2xldCBqZT14LmRlZmF1bHQmJnguZGVmYXVsdCgpLE10PW1pKGplKTtyZXR1cm4gUC5jcmVhdGVWTm9kZSgidmlldyIsUC5tZXJnZVByb3BzKHtyZWY6Y2UsY2xhc3M6InVuaS1tb3ZhYmxlLWFyZWEifSxndCksW010XSl9fX0pO2Z1bmN0aW9uIFFpKHYpe2xldCB4PXt9O2Z1bmN0aW9uICQoZmUsQ2Upe3hbZmVdJiZ4W2ZlXShDZSl9ZnVuY3Rpb24gVShmZSxDZSl7eFtmZV09ZnVuY3Rpb24oY3Qpe3d0LmlzRnVuY3Rpb24oQ2UpJiYoY3QudG91Y2hlcz1jdC5jaGFuZ2VkVG91Y2hlcyxDZShjdCk9PT0hMSYmY3Quc3RvcFByb3BhZ2F0aW9uKCkpfX1sZXQgWj0wLHE9MCx0ZT0wLGNlPTAscGU9ZnVuY3Rpb24oZmUsQ2UsY3QsZ3Qpe2lmKHYoe3RhcmdldDpmZS50YXJnZXQsY3VycmVudFRhcmdldDpmZS5jdXJyZW50VGFyZ2V0LHN0b3BQcm9wYWdhdGlvbjpmZS5zdG9wUHJvcGFnYXRpb24uYmluZChmZSksdG91Y2hlczpmZS50b3VjaGVzLGNoYW5nZWRUb3VjaGVzOmZlLmNoYW5nZWRUb3VjaGVzLGRldGFpbDp7c3RhdGU6Q2UseDpjdCx5Omd0LGR4OmN0LVosZHk6Z3QtcSxkZHg6Y3QtdGUsZGR5Omd0LWNlLHRpbWVTdGFtcDpmZS50aW1lU3RhbXB8fERhdGUubm93KCl9fSk9PT0hMSlyZXR1cm4hMX0sSWU9bnVsbDtyZXR1cm4gVSgidG91Y2hzdGFydCIsZnVuY3Rpb24oZmUpe2lmKCFJZSlyZXR1cm4gSWU9ZmUsWj10ZT1mZS50b3VjaGVzWzBdLnBhZ2VYLHE9Y2U9ZmUudG91Y2hlc1swXS5wYWdlWSxwZShmZSwic3RhcnQiLFoscSl9KSxVKCJ0b3VjaG1vdmUiLGZ1bmN0aW9uKGZlKXtpZihJZSl7bGV0IENlPXBlKGZlLCJtb3ZlIixmZS50b3VjaGVzWzBdLnBhZ2VYLGZlLnRvdWNoZXNbMF0ucGFnZVkpO3JldHVybiB0ZT1mZS50b3VjaGVzWzBdLnBhZ2VYLGNlPWZlLnRvdWNoZXNbMF0ucGFnZVksQ2V9fSksVSgidG91Y2hlbmQiLGZ1bmN0aW9uKGZlKXtpZihJZSlyZXR1cm4gSWU9bnVsbCxwZShmZSwiZW5kIixmZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCxmZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWSl9KSx7dG91Y2hzdGFydDpmdW5jdGlvbihmZSl7JCgidG91Y2hzdGFydCIsZmUpfSx0b3VjaG1vdmU6ZnVuY3Rpb24oZmUpeyQoInRvdWNobW92ZSIsZmUpfSx0b3VjaGVuZDpmdW5jdGlvbihmZSl7JCgidG91Y2hlbmQiLGZlKX19fWZ1bmN0aW9uIEtuKHYseCl7cmV0dXJuKCQsVSk9Pnt2LnZhbHVlJiZ4KCQsZW8oJCx2LnZhbHVlLFV8fHt9KSl9fWZ1bmN0aW9uIGVvKHYseCwkPXt9KXtyZXR1cm4geD1mbyh4KSx7dHlwZTp2LHRpbWVTdGFtcDpEYXRlLm5vdygpLHRhcmdldDp4LGN1cnJlbnRUYXJnZXQ6eCxkZXRhaWw6JH19bGV0IFBvPUluLmNhY2hlU3RyaW5nRnVuY3Rpb24odj0+di5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSt2LnNsaWNlKDEpKTtmdW5jdGlvbiBmbyh2KXtsZXR7b2Zmc2V0TGVmdDp4LG9mZnNldFRvcDokfT12LFU9di5hdHRyLFo9e307cmV0dXJuIE9iamVjdC5rZXlzKFV8fHt9KS5mb3JFYWNoKHE9PntxLmluZGV4T2YoImRhdGEiKT09PTAmJihaW1BvKHEucmVwbGFjZSgiZGF0YSIsIiIpKV09VVtxXSl9KSx7aWQ6VSYmVS5pZHx8IiIsZGF0YXNldDpaLG9mZnNldExlZnQ6eHx8MCxvZmZzZXRUb3A6JHx8MH19ZnVuY3Rpb24gaWkodix4LCQpe3JldHVybiB2PngtJCYmdjx4KyR9ZnVuY3Rpb24gYXIodix4KXtyZXR1cm4gaWkodiwwLHgpfWZ1bmN0aW9uIGtyKCl7fWtyLnByb3RvdHlwZS54PWZ1bmN0aW9uKHYpe3JldHVybiBNYXRoLnNxcnQodil9O2Z1bmN0aW9uIE5uKHYseCl7dGhpcy5fbT12LHRoaXMuX2Y9MWUzKngsdGhpcy5fc3RhcnRUaW1lPTAsdGhpcy5fdj0wfU5uLnByb3RvdHlwZS5zZXRWPWZ1bmN0aW9uKHYseCl7bGV0ICQ9TWF0aC5wb3coTWF0aC5wb3codiwyKStNYXRoLnBvdyh4LDIpLC41KTt0aGlzLl94X3Y9dix0aGlzLl95X3Y9eCx0aGlzLl94X2E9LXRoaXMuX2YqdGhpcy5feF92LyQsdGhpcy5feV9hPS10aGlzLl9mKnRoaXMuX3lfdi8kLHRoaXMuX3Q9TWF0aC5hYnModi90aGlzLl94X2EpfHxNYXRoLmFicyh4L3RoaXMuX3lfYSksdGhpcy5fbGFzdER0PW51bGwsdGhpcy5fc3RhcnRUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpfSxObi5wcm90b3R5cGUuc2V0Uz1mdW5jdGlvbih2LHgpe3RoaXMuX3hfcz12LHRoaXMuX3lfcz14fSxObi5wcm90b3R5cGUucz1mdW5jdGlvbih2KXt2PT09dm9pZCAwJiYodj0obmV3IERhdGUoKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHY+dGhpcy5fdCYmKHY9dGhpcy5fdCx0aGlzLl9sYXN0RHQ9dik7bGV0IHg9dGhpcy5feF92KnYrLjUqdGhpcy5feF9hKk1hdGgucG93KHYsMikrdGhpcy5feF9zLCQ9dGhpcy5feV92KnYrLjUqdGhpcy5feV9hKk1hdGgucG93KHYsMikrdGhpcy5feV9zO3JldHVybih0aGlzLl94X2E+MCYmeDx0aGlzLl9lbmRQb3NpdGlvblh8fHRoaXMuX3hfYTwwJiZ4PnRoaXMuX2VuZFBvc2l0aW9uWCkmJih4PXRoaXMuX2VuZFBvc2l0aW9uWCksKHRoaXMuX3lfYT4wJiYkPHRoaXMuX2VuZFBvc2l0aW9uWXx8dGhpcy5feV9hPDAmJiQ+dGhpcy5fZW5kUG9zaXRpb25ZKSYmKCQ9dGhpcy5fZW5kUG9zaXRpb25ZKSx7eCx5OiR9fSxObi5wcm90b3R5cGUuZHM9ZnVuY3Rpb24odil7cmV0dXJuIHY9PT12b2lkIDAmJih2PShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksdj50aGlzLl90JiYodj10aGlzLl90KSx7ZHg6dGhpcy5feF92K3RoaXMuX3hfYSp2LGR5OnRoaXMuX3lfdit0aGlzLl95X2Eqdn19LE5uLnByb3RvdHlwZS5kZWx0YT1mdW5jdGlvbigpe3JldHVybnt4Oi0xLjUqTWF0aC5wb3codGhpcy5feF92LDIpL3RoaXMuX3hfYXx8MCx5Oi0xLjUqTWF0aC5wb3codGhpcy5feV92LDIpL3RoaXMuX3lfYXx8MH19LE5uLnByb3RvdHlwZS5kdD1mdW5jdGlvbigpe3JldHVybi10aGlzLl94X3YvdGhpcy5feF9hfSxObi5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbigpe2xldCB2PWlpKHRoaXMucygpLngsdGhpcy5fZW5kUG9zaXRpb25YKXx8aWkodGhpcy5zKCkueSx0aGlzLl9lbmRQb3NpdGlvblkpfHx0aGlzLl9sYXN0RHQ9PT10aGlzLl90O3JldHVybiB0aGlzLl9sYXN0RHQ9bnVsbCx2fSxObi5wcm90b3R5cGUuc2V0RW5kPWZ1bmN0aW9uKHYseCl7dGhpcy5fZW5kUG9zaXRpb25YPXYsdGhpcy5fZW5kUG9zaXRpb25ZPXh9LE5uLnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbih2LHgpe3RoaXMuX209dix0aGlzLl9mPTFlMyp4fTtmdW5jdGlvbiBabih2LHgsJCl7dGhpcy5fbT12LHRoaXMuX2s9eCx0aGlzLl9jPSQsdGhpcy5fc29sdXRpb249bnVsbCx0aGlzLl9lbmRQb3NpdGlvbj0wLHRoaXMuX3N0YXJ0VGltZT0wfVpuLnByb3RvdHlwZS5fc29sdmU9ZnVuY3Rpb24odix4KXtsZXQgJD10aGlzLl9jLFU9dGhpcy5fbSxaPXRoaXMuX2sscT0kKiQtNCpVKlo7aWYocT09PTApe2xldCBmZT0tJC8oMipVKSxDZT12LGN0PXgvKGZlKnYpO3JldHVybnt4OmZ1bmN0aW9uKGd0KXtyZXR1cm4oQ2UrY3QqZ3QpKk1hdGgucG93KE1hdGguRSxmZSpndCl9LGR4OmZ1bmN0aW9uKGd0KXtsZXQgSHQ9TWF0aC5wb3coTWF0aC5FLGZlKmd0KTtyZXR1cm4gZmUqKENlK2N0Kmd0KSpIdCtjdCpIdH19fWlmKHE+MCl7bGV0IGZlPSgtJC1NYXRoLnNxcnQocSkpLygyKlUpLENlPSgtJCtNYXRoLnNxcnQocSkpLygyKlUpLGN0PSh4LWZlKnYpLyhDZS1mZSksZ3Q9di1jdDtyZXR1cm57eDpmdW5jdGlvbihIdCl7bGV0IHl0LGplO3JldHVybiBIdD09PXRoaXMuX3QmJih5dD10aGlzLl9wb3dFUjFULGplPXRoaXMuX3Bvd0VSMlQpLHRoaXMuX3Q9SHQseXR8fCh5dD10aGlzLl9wb3dFUjFUPU1hdGgucG93KE1hdGguRSxmZSpIdCkpLGplfHwoamU9dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsQ2UqSHQpKSxndCp5dCtjdCpqZX0sZHg6ZnVuY3Rpb24oSHQpe2xldCB5dCxqZTtyZXR1cm4gSHQ9PT10aGlzLl90JiYoeXQ9dGhpcy5fcG93RVIxVCxqZT10aGlzLl9wb3dFUjJUKSx0aGlzLl90PUh0LHl0fHwoeXQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsZmUqSHQpKSxqZXx8KGplPXRoaXMuX3Bvd0VSMlQ9TWF0aC5wb3coTWF0aC5FLENlKkh0KSksZ3QqZmUqeXQrY3QqQ2UqamV9fX1sZXQgdGU9TWF0aC5zcXJ0KDQqVSpaLSQqJCkvKDIqVSksY2U9LSQvMipVLHBlPXYsSWU9KHgtY2UqdikvdGU7cmV0dXJue3g6ZnVuY3Rpb24oZmUpe3JldHVybiBNYXRoLnBvdyhNYXRoLkUsY2UqZmUpKihwZSpNYXRoLmNvcyh0ZSpmZSkrSWUqTWF0aC5zaW4odGUqZmUpKX0sZHg6ZnVuY3Rpb24oZmUpe2xldCBDZT1NYXRoLnBvdyhNYXRoLkUsY2UqZmUpLGN0PU1hdGguY29zKHRlKmZlKSxndD1NYXRoLnNpbih0ZSpmZSk7cmV0dXJuIENlKihJZSp0ZSpjdC1wZSp0ZSpndCkrY2UqQ2UqKEllKmd0K3BlKmN0KX19fSxabi5wcm90b3R5cGUueD1mdW5jdGlvbih2KXtyZXR1cm4gdj09PXZvaWQgMCYmKHY9KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9lbmRQb3NpdGlvbit0aGlzLl9zb2x1dGlvbi54KHYpOjB9LFpuLnByb3RvdHlwZS5keD1mdW5jdGlvbih2KXtyZXR1cm4gdj09PXZvaWQgMCYmKHY9KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9zb2x1dGlvbi5keCh2KTowfSxabi5wcm90b3R5cGUuc2V0RW5kPWZ1bmN0aW9uKHYseCwkKXtpZigkfHwoJD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdiE9PXRoaXMuX2VuZFBvc2l0aW9ufHwhYXIoeCwuMSkpe3g9eHx8MDtsZXQgVT10aGlzLl9lbmRQb3NpdGlvbjt0aGlzLl9zb2x1dGlvbiYmKGFyKHgsLjEpJiYoeD10aGlzLl9zb2x1dGlvbi5keCgoJC10aGlzLl9zdGFydFRpbWUpLzFlMykpLFU9dGhpcy5fc29sdXRpb24ueCgoJC10aGlzLl9zdGFydFRpbWUpLzFlMyksYXIoeCwuMSkmJih4PTApLGFyKFUsLjEpJiYoVT0wKSxVKz10aGlzLl9lbmRQb3NpdGlvbiksdGhpcy5fc29sdXRpb24mJmFyKFUtdiwuMSkmJmFyKHgsLjEpfHwodGhpcy5fZW5kUG9zaXRpb249dix0aGlzLl9zb2x1dGlvbj10aGlzLl9zb2x2ZShVLXRoaXMuX2VuZFBvc2l0aW9uLHgpLHRoaXMuX3N0YXJ0VGltZT0kKX19LFpuLnByb3RvdHlwZS5zbmFwPWZ1bmN0aW9uKHYpe3RoaXMuX3N0YXJ0VGltZT1uZXcgRGF0ZSgpLmdldFRpbWUoKSx0aGlzLl9lbmRQb3NpdGlvbj12LHRoaXMuX3NvbHV0aW9uPXt4OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGR4OmZ1bmN0aW9uKCl7cmV0dXJuIDB9fX0sWm4ucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24odil7cmV0dXJuIHZ8fCh2PW5ldyBEYXRlKCkuZ2V0VGltZSgpKSxpaSh0aGlzLngoKSx0aGlzLl9lbmRQb3NpdGlvbiwuMSkmJmFyKHRoaXMuZHgoKSwuMSl9LFpuLnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbih2LHgsJCl7dGhpcy5fbT12LHRoaXMuX2s9eCx0aGlzLl9jPSQsdGhpcy5kb25lKCl8fCh0aGlzLl9zb2x1dGlvbj10aGlzLl9zb2x2ZSh0aGlzLngoKS10aGlzLl9lbmRQb3NpdGlvbix0aGlzLmR4KCkpLHRoaXMuX3N0YXJ0VGltZT1uZXcgRGF0ZSgpLmdldFRpbWUoKSl9LFpuLnByb3RvdHlwZS5zcHJpbmdDb25zdGFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9rfSxabi5wcm90b3R5cGUuZGFtcGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jfSxabi5wcm90b3R5cGUuY29uZmlndXJhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHYoJCxVKXskLnJlY29uZmlndXJlKDEsVSwkLmRhbXBpbmcoKSl9ZnVuY3Rpb24geCgkLFUpeyQucmVjb25maWd1cmUoMSwkLnNwcmluZ0NvbnN0YW50KCksVSl9cmV0dXJuW3tsYWJlbDoiU3ByaW5nIENvbnN0YW50IixyZWFkOnRoaXMuc3ByaW5nQ29uc3RhbnQuYmluZCh0aGlzKSx3cml0ZTp2LmJpbmQodGhpcyx0aGlzKSxtaW46MTAwLG1heDoxZTN9LHtsYWJlbDoiRGFtcGluZyIscmVhZDp0aGlzLmRhbXBpbmcuYmluZCh0aGlzKSx3cml0ZTp4LmJpbmQodGhpcyx0aGlzKSxtaW46MSxtYXg6NTAwfV19O2Z1bmN0aW9uIE5pKHYseCwkKXt0aGlzLl9zcHJpbmdYPW5ldyBabih2LHgsJCksdGhpcy5fc3ByaW5nWT1uZXcgWm4odix4LCQpLHRoaXMuX3NwcmluZ1NjYWxlPW5ldyBabih2LHgsJCksdGhpcy5fc3RhcnRUaW1lPTB9TmkucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbih2LHgsJCxVKXtsZXQgWj1uZXcgRGF0ZSgpLmdldFRpbWUoKTt0aGlzLl9zcHJpbmdYLnNldEVuZCh2LFUsWiksdGhpcy5fc3ByaW5nWS5zZXRFbmQoeCxVLFopLHRoaXMuX3NwcmluZ1NjYWxlLnNldEVuZCgkLFUsWiksdGhpcy5fc3RhcnRUaW1lPVp9LE5pLnByb3RvdHlwZS54PWZ1bmN0aW9uKCl7bGV0IHY9KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzO3JldHVybnt4OnRoaXMuX3NwcmluZ1gueCh2KSx5OnRoaXMuX3NwcmluZ1kueCh2KSxzY2FsZTp0aGlzLl9zcHJpbmdTY2FsZS54KHYpfX0sTmkucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXtsZXQgdj1uZXcgRGF0ZSgpLmdldFRpbWUoKTtyZXR1cm4gdGhpcy5fc3ByaW5nWC5kb25lKHYpJiZ0aGlzLl9zcHJpbmdZLmRvbmUodikmJnRoaXMuX3NwcmluZ1NjYWxlLmRvbmUodil9LE5pLnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbih2LHgsJCl7dGhpcy5fc3ByaW5nWC5yZWNvbmZpZ3VyZSh2LHgsJCksdGhpcy5fc3ByaW5nWS5yZWNvbmZpZ3VyZSh2LHgsJCksdGhpcy5fc3ByaW5nU2NhbGUucmVjb25maWd1cmUodix4LCQpfTtsZXQgSGk9e2RpcmVjdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibm9uZSJ9LGluZXJ0aWE6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxvdXRPZkJvdW5kczp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0seTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxkYW1waW5nOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxmcmljdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHNjYWxlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2NhbGVNaW46e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6LjV9LHNjYWxlTWF4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjEwfSxzY2FsZVZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGFuaW1hdGlvbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITB9fTtmdW5jdGlvbiBvaSh2LHgpe3JldHVybisoKDFlMyp2LTFlMyp4KS8xZTMpLnRvRml4ZWQoMSl9ZnVuY3Rpb24gRnIodix4LCQpe2xldCBVPXtpZDowLGNhbmNlbGxlZDohMX0sWj1mdW5jdGlvbih0ZSl7dGUmJnRlLmlkJiZWcih0ZS5pZCksdGUmJih0ZS5jYW5jZWxsZWQ9ITApfTtmdW5jdGlvbiBxKHRlLGNlLHBlLEllKXtpZighdGV8fCF0ZS5jYW5jZWxsZWQpe3BlKGNlKTtsZXQgZmU9Y2UuZG9uZSgpO2ZlfHx0ZS5jYW5jZWxsZWR8fCh0ZS5pZD1JbyhxLmJpbmQobnVsbCx0ZSxjZSxwZSxJZSkpKSxmZSYmSWUmJkllKGNlKX19cmV0dXJuIHEoVSx2LHgsJCkse2NhbmNlbDpaLmJpbmQobnVsbCxVKSxtb2RlbDp2fX1sZXQgdnI9ITE7ZnVuY3Rpb24ga2kodil7dnJ8fCh2cj0hMCxJbyhmdW5jdGlvbigpe3YoKSx2cj0hMX0pKX1mdW5jdGlvbiBJbyh2KXtyZXR1cm4gZih2LDE2KX1mdW5jdGlvbiBWcih2KXtzKHYpfWxldCBacj1FLnJlcXVpcmVNb2R1bGUoImFuaW1hdGlvbiIpLEFyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJNb3ZhYmxlVmlldyIscHJvcHM6SGksZW1pdHM6WyJjaGFuZ2UiLCJzY2FsZSJdLHN0eWxlczpbeyJ1bmktbW92YWJsZS12aWV3Ijp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiIwcHgiLGxlZnQ6IjBweCIsd2lkdGg6IjEwcHgiLGhlaWdodDoiMTBweCJ9fX1dLHNldHVwKHYse2VtaXQ6eCxzbG90czokfSl7bGV0IFU9UC5yZWYobnVsbCksWj1LbihVLHgpLHE9UC5pbmplY3QoInNldFRvdWNoTW92YWJsZVZpZXdDb250ZXh0IiwoKT0+e30pLHRlPXBuKHYsWixVLHEpO3JldHVybigpPT57bGV0IGNlPXtwcmV2ZW50R2VzdHVyZTohMH07cmV0dXJuIFAuY3JlYXRlVk5vZGUoInZpZXciLFAubWVyZ2VQcm9wcyh7cmVmOlUsb25Ub3VjaHN0YXJ0OnRlLGNsYXNzOiJ1bmktbW92YWJsZS12aWV3IixzdHlsZToidHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOyJ9LGNlKSxbJC5kZWZhdWx0JiYkLmRlZmF1bHQoKV0pfX19KTtmdW5jdGlvbiBwbih2LHgsJCxVKXtsZXQgWj1QLmluamVjdCgiX2lzTW91bnRlZCIsUC5yZWYoITEpKSxxPVAuaW5qZWN0KCJwYXJlbnRTaXplIix7d2lkdGg6UC5yZWYoMCksaGVpZ2h0OlAucmVmKDApLHRvcDpQLnJlZigwKSxsZWZ0OlAucmVmKDApfSksdGU9UC5pbmplY3QoImFkZE1vdmFibGVWaWV3Q29udGV4dCIsKCk9Pnt9KSxjZT1QLmluamVjdCgicmVtb3ZlTW92YWJsZVZpZXdDb250ZXh0IiwoKT0+e30pLHBlPXt0b3VjaHN0YXJ0OigpPT57fSx0b3VjaG1vdmU6KCk9Pnt9LHRvdWNoZW5kOigpPT57fX07ZnVuY3Rpb24gSWUoeGUpe3JldHVybiBOdW1iZXIoeGUpfHwwfWZ1bmN0aW9uIGZlKHhlKXtyZXR1cm4geGU9TnVtYmVyKHhlKSxpc05hTih4ZSk/MTp4ZX1sZXQgQ2U9UC5yZWYoSWUodi54KSksY3Q9UC5yZWYoSWUodi55KSksZ3Q9UC5yZWYoZmUoTnVtYmVyKHYuc2NhbGVWYWx1ZSkpKSxIdD1QLnJlZigwKSx5dD1QLnJlZigwKSxqZT1QLnJlZigwKSxNdD1QLnJlZigwKSxkbj1QLnJlZigwKSxHdD1QLnJlZigwKSxkdD1udWxsLGVuPW51bGwsQm49e3g6MCx5OjB9LFl0PXt4OjAseTowfSxqdD0xLFV0PTAscXQ9MCx0YT0hMSxjaSxlaSxxaT1udWxsLGphPW51bGwsVW49e3RvcDowLGxlZnQ6MCx3aWR0aDowLGhlaWdodDowfSwkbj1uZXcga3IsSXI9bmV3IGtyLEhuPXtoaXN0b3J5WDpbMCwwXSxoaXN0b3J5WTpbMCwwXSxoaXN0b3J5VDpbMCwwXX0seXI9UC5jb21wdXRlZCgoKT0+e2xldCB4ZT1OdW1iZXIodi5kYW1waW5nKTtyZXR1cm4gaXNOYU4oeGUpPzIwOnhlfSksenI9UC5jb21wdXRlZCgoKT0+e2xldCB4ZT1OdW1iZXIodi5mcmljdGlvbik7cmV0dXJuIGlzTmFOKHhlKXx8eGU8PTA/Mjp4ZX0pLG5hPVAuY29tcHV0ZWQoKCk9PntsZXQgeGU9TnVtYmVyKHYuc2NhbGVNaW4pO3JldHVybiBpc05hTih4ZSk/LjU6eGV9KSxjcz1QLmNvbXB1dGVkKCgpPT57bGV0IHhlPU51bWJlcih2LnNjYWxlTWF4KTtyZXR1cm4gaXNOYU4oeGUpPzEwOnhlfSksb249UC5jb21wdXRlZCgoKT0+di5kaXJlY3Rpb249PT0iYWxsInx8di5kaXJlY3Rpb249PT0iaG9yaXpvbnRhbCIpLF9uPVAuY29tcHV0ZWQoKCk9PnYuZGlyZWN0aW9uPT09ImFsbCJ8fHYuZGlyZWN0aW9uPT09InZlcnRpY2FsIiksam49bmV3IE5pKDEsOSpNYXRoLnBvdyh5ci52YWx1ZSwyKS80MCx5ci52YWx1ZSkscW49bmV3IE5uKDEsenIudmFsdWUpO1Aud2F0Y2goKCk9PnYueCx4ZT0+e0NlLnZhbHVlPUllKHhlKX0pLFAud2F0Y2goKCk9PnYueSx4ZT0+e2N0LnZhbHVlPUllKHhlKX0pLFAud2F0Y2goKCk9PnYuc2NhbGVWYWx1ZSx4ZT0+e2d0LnZhbHVlPWZlKE51bWJlcih4ZSkpfSksUC53YXRjaChDZSx1cyksUC53YXRjaChjdCx6YSksUC53YXRjaChndCxyYSksUC53YXRjaChuYSxJYSksUC53YXRjaChjcyxJYSk7ZnVuY3Rpb24gQWkoKXtlbiYmZW4uY2FuY2VsKCksZHQmJmR0LmNhbmNlbCgpfWZ1bmN0aW9uIHVzKHhlKXtpZihvbi52YWx1ZSl7aWYoeGUrWXQueD09PVV0KXJldHVybiBVdDtkdCYmZHQuY2FuY2VsKCksYm8oeGUrWXQueCxjdC52YWx1ZStZdC55LGp0KX1yZXR1cm4geGV9ZnVuY3Rpb24gemEoeGUpe2lmKF9uLnZhbHVlKXtpZih4ZStZdC55PT09cXQpcmV0dXJuIHF0O2R0JiZkdC5jYW5jZWwoKSxibyhDZS52YWx1ZStZdC54LHhlK1l0LnksanQpfXJldHVybiB4ZX1mdW5jdGlvbiBJYSgpe2lmKCF2LnNjYWxlKXJldHVybiExO0RpKGp0LCEwKX1mdW5jdGlvbiByYSh4ZSl7cmV0dXJuIHYuc2NhbGU/KHhlPV9vKHhlKSxEaSh4ZSwhMCkseGUpOiExfWZ1bmN0aW9uIHNvKCl7di5kaXNhYmxlZHx8KEFpKCksSG4uaGlzdG9yeVg9WzAsMF0sSG4uaGlzdG9yeVk9WzAsMF0sSG4uaGlzdG9yeVQ9WzAsMF0sb24udmFsdWUmJihjaT1VdCksX24udmFsdWUmJihlaT1xdCkscWk9bnVsbCxqYT1udWxsLHRhPSEwKX1mdW5jdGlvbiBXYSh4ZSl7aWYoIXYuZGlzYWJsZWQmJnRhKXtsZXQgTnQ9VXQsUHQ9cXQ7aWYoamE9PT1udWxsJiYoamE9TWF0aC5hYnMoeGUuZGV0YWlsLmR4L3hlLmRldGFpbC5keSk+MT8iaHRvdWNobW92ZSI6InZ0b3VjaG1vdmUiKSxvbi52YWx1ZSYmKE50PXhlLmRldGFpbC5keCtjaSxIbi5oaXN0b3J5WC5zaGlmdCgpLEhuLmhpc3RvcnlYLnB1c2goTnQpLCFfbi52YWx1ZSYmcWk9PT1udWxsJiYocWk9TWF0aC5hYnMoeGUuZGV0YWlsLmR4L3hlLmRldGFpbC5keSk8MSkpLF9uLnZhbHVlJiYoUHQ9eGUuZGV0YWlsLmR5K2VpLEhuLmhpc3RvcnlZLnNoaWZ0KCksSG4uaGlzdG9yeVkucHVzaChQdCksIW9uLnZhbHVlJiZxaT09PW51bGwmJihxaT1NYXRoLmFicyh4ZS5kZXRhaWwuZHkveGUuZGV0YWlsLmR4KTwxKSksSG4uaGlzdG9yeVQuc2hpZnQoKSxIbi5oaXN0b3J5VC5wdXNoKHhlLmRldGFpbC50aW1lU3RhbXApLCFxaSl7bGV0IHduPSJ0b3VjaCI7TnQ8amUudmFsdWU/di5vdXRPZkJvdW5kcz8od249InRvdWNoLW91dC1vZi1ib3VuZHMiLE50PWplLnZhbHVlLSRuLngoamUudmFsdWUtTnQpKTpOdD1qZS52YWx1ZTpOdD5kbi52YWx1ZSYmKHYub3V0T2ZCb3VuZHM/KHduPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixOdD1kbi52YWx1ZSskbi54KE50LWRuLnZhbHVlKSk6TnQ9ZG4udmFsdWUpLFB0PE10LnZhbHVlP3Yub3V0T2ZCb3VuZHM/KHduPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixQdD1NdC52YWx1ZS1Jci54KE10LnZhbHVlLVB0KSk6UHQ9TXQudmFsdWU6UHQ+R3QudmFsdWUmJih2Lm91dE9mQm91bmRzPyh3bj0idG91Y2gtb3V0LW9mLWJvdW5kcyIsUHQ9R3QudmFsdWUrSXIueChQdC1HdC52YWx1ZSkpOlB0PUd0LnZhbHVlKSxraShmdW5jdGlvbigpe1ZvKE50LFB0LGp0LHduKX0pfX19ZnVuY3Rpb24gZnMoKXtpZighdi5kaXNhYmxlZCYmdGEmJih0YT0hMSwhcWkmJiFkcygib3V0LW9mLWJvdW5kcyIpJiZ2LmluZXJ0aWEpKXtsZXQgeGU9MWUzKihIbi5oaXN0b3J5WFsxXS1Ibi5oaXN0b3J5WFswXSkvKEhuLmhpc3RvcnlUWzFdLUhuLmhpc3RvcnlUWzBdKSxOdD0xZTMqKEhuLmhpc3RvcnlZWzFdLUhuLmhpc3RvcnlZWzBdKS8oSG4uaGlzdG9yeVRbMV0tSG4uaGlzdG9yeVRbMF0pO3FuLnNldFYoeGUsTnQpLHFuLnNldFMoVXQscXQpO2xldCBQdD1xbi5kZWx0YSgpLngsd249cW4uZGVsdGEoKS55LEVyPVB0K1V0LE9pPXduK3F0O0VyPGplLnZhbHVlPyhFcj1qZS52YWx1ZSxPaT1xdCsoamUudmFsdWUtVXQpKnduL1B0KTpFcj5kbi52YWx1ZSYmKEVyPWRuLnZhbHVlLE9pPXF0Kyhkbi52YWx1ZS1VdCkqd24vUHQpLE9pPE10LnZhbHVlPyhPaT1NdC52YWx1ZSxFcj1VdCsoTXQudmFsdWUtcXQpKlB0L3duKTpPaT5HdC52YWx1ZSYmKE9pPUd0LnZhbHVlLEVyPVV0KyhHdC52YWx1ZS1xdCkqUHQvd24pLHFuLnNldEVuZChFcixPaSksZW49RnIocW4sZnVuY3Rpb24oKXtsZXQgSmk9cW4ucygpLFVvPUppLngsTmE9SmkueTtWbyhVbyxOYSxqdCwiZnJpY3Rpb24iKX0sZnVuY3Rpb24oKXtlbi5jYW5jZWwoKX0pfX1mdW5jdGlvbiBXcih4ZSxOdCl7bGV0IFB0PSExO3JldHVybiB4ZT5kbi52YWx1ZT8oeGU9ZG4udmFsdWUsUHQ9ITApOnhlPGplLnZhbHVlJiYoeGU9amUudmFsdWUsUHQ9ITApLE50Pkd0LnZhbHVlPyhOdD1HdC52YWx1ZSxQdD0hMCk6TnQ8TXQudmFsdWUmJihOdD1NdC52YWx1ZSxQdD0hMCkse3g6eGUseTpOdCxvdXRPZkJvdW5kczpQdH19ZnVuY3Rpb24gR2EoKXtCbi54PVVuLmxlZnQtcS5sZWZ0LnZhbHVlLEJuLnk9VW4udG9wLXEudG9wLnZhbHVlfWZ1bmN0aW9uIFlhKHhlKXt4ZT14ZXx8anQseGU9X28oeGUpLHl0LnZhbHVlPVVuLmhlaWdodC9qdCxIdC52YWx1ZT1Vbi53aWR0aC9qdDtsZXQgTnQ9eXQudmFsdWUqeGUsUHQ9SHQudmFsdWUqeGU7WXQueD0oUHQtSHQudmFsdWUpLzIsWXQueT0oTnQteXQudmFsdWUpLzJ9ZnVuY3Rpb24gRm8oKXtsZXQgeGU9MC1Cbi54K1l0LngsTnQ9cS53aWR0aC52YWx1ZS1IdC52YWx1ZS1Cbi54LVl0Lng7amUudmFsdWU9TWF0aC5taW4oeGUsTnQpLGRuLnZhbHVlPU1hdGgubWF4KHhlLE50KTtsZXQgUHQ9MC1Cbi55K1l0Lnksd249cS5oZWlnaHQudmFsdWUteXQudmFsdWUtQm4ueS1ZdC55O010LnZhbHVlPU1hdGgubWluKFB0LHduKSxHdC52YWx1ZT1NYXRoLm1heChQdCx3bil9ZnVuY3Rpb24gRGkoeGUsTnQpe2lmKHYuc2NhbGUpe3hlPV9vKHhlKSxZYSh4ZSksRm8oKTtsZXQgUHQ9V3IoVXQscXQpLHduPVB0LngsRXI9UHQueTtOdD9ibyh3bixFcix4ZSwiIiwhMCwhMCk6a2koZnVuY3Rpb24oKXtWbyh3bixFcix4ZSwiIiwhMCwhMCl9KX19ZnVuY3Rpb24gX28oeGUpe3JldHVybiB4ZT1NYXRoLm1heCguNSxuYS52YWx1ZSx4ZSkseGU9TWF0aC5taW4oMTAsY3MudmFsdWUseGUpLHhlfWZ1bmN0aW9uIGJvKHhlLE50LFB0LHduLEVyLE9pKXtBaSgpLG9uLnZhbHVlfHwoeGU9VXQpLF9uLnZhbHVlfHwoTnQ9cXQpLHYuc2NhbGV8fChQdD1qdCk7bGV0IEppPVdyKHhlLE50KTtpZih4ZT1KaS54LE50PUppLnksIXYuYW5pbWF0aW9uKXtWbyh4ZSxOdCxQdCx3bixFcixPaSk7cmV0dXJufWpuLl9zcHJpbmdYLl9zb2x1dGlvbj1udWxsLGpuLl9zcHJpbmdZLl9zb2x1dGlvbj1udWxsLGpuLl9zcHJpbmdTY2FsZS5fc29sdXRpb249bnVsbCxqbi5fc3ByaW5nWC5fZW5kUG9zaXRpb249VXQsam4uX3NwcmluZ1kuX2VuZFBvc2l0aW9uPXF0LGpuLl9zcHJpbmdTY2FsZS5fZW5kUG9zaXRpb249anQsam4uc2V0RW5kKHhlLE50LFB0LDEpLGR0PUZyKGpuLGZ1bmN0aW9uKCl7bGV0IFVvPWpuLngoKSxOYT1Vby54LGlhPVVvLnksZ3M9VW8uc2NhbGU7Vm8oTmEsaWEsZ3Msd24sRXIsT2kpfSxmdW5jdGlvbigpe2R0LmNhbmNlbCgpfSl9ZnVuY3Rpb24gZHMoeGUpe2xldCBOdD1XcihVdCxxdCksUHQ9TnQueCx3bj1OdC55LEVyPU50Lm91dE9mQm91bmRzO3JldHVybiBFciYmYm8oUHQsd24sanQseGUpLEVyfWZ1bmN0aW9uIFZvKHhlLE50LFB0LHduPSIiLEVyLE9pKXt4ZSE9PW51bGwmJnhlLnRvU3RyaW5nKCkhPT0iTmFOIiYmdHlwZW9mIHhlPT0ibnVtYmVyInx8KHhlPVV0fHwwKSxOdCE9PW51bGwmJk50LnRvU3RyaW5nKCkhPT0iTmFOIiYmdHlwZW9mIE50PT0ibnVtYmVyInx8KE50PXF0fHwwKSx4ZT1OdW1iZXIoeGUudG9GaXhlZCgxKSksTnQ9TnVtYmVyKE50LnRvRml4ZWQoMSkpLFB0PU51bWJlcihQdC50b0ZpeGVkKDEpKSxVdD09PXhlJiZxdD09PU50fHxFcnx8eCgiY2hhbmdlIix7eDpvaSh4ZSxZdC54KSx5Om9pKE50LFl0LnkpLHNvdXJjZTp3bn0pLHYuc2NhbGV8fChQdD1qdCksUHQ9X28oUHQpLFB0PStQdC50b0ZpeGVkKDMpLE9pJiZQdCE9PWp0JiZ4KCJzY2FsZSIse3g6eGUseTpOdCxzY2FsZTpQdH0pO2xldCBKaT1gdHJhbnNsYXRlKCR7eGV9cHgsICR7TnR9cHgpIHNjYWxlKCR7UHR9KWA7WnIudHJhbnNpdGlvbigkLnZhbHVlLHtzdHlsZXM6e3RyYW5zZm9ybTpKaX0sZHVyYXRpb246MCxkZWxheTowfSksVXQ9eGUscXQ9TnQsanQ9UHR9ZnVuY3Rpb24geHMoKXtyZXR1cm4ga24oJC52YWx1ZSkudGhlbih4ZT0+e1VuPXhlfSl9ZnVuY3Rpb24gaHMoKXtpZighWi52YWx1ZSlyZXR1cm47QWkoKTtsZXQgeGU9di5zY2FsZT9ndC52YWx1ZToxO0dhKCksWWEoeGUpLEZvKCksVXQ9Q2UudmFsdWUrWXQueCxxdD1jdC52YWx1ZStZdC55O2xldCBOdD1XcihVdCxxdCksUHQ9TnQueCx3bj1OdC55O1ZvKFB0LHduLHhlLCIiLCEwKX1yZXR1cm4gUC5vbk1vdW50ZWQoKCk9PntwZT1RaShOdD0+e3N3aXRjaChOdC5kZXRhaWwuc3RhdGUpe2Nhc2Uic3RhcnQiOnNvKCk7YnJlYWs7Y2FzZSJtb3ZlIjpXYShOdCk7YnJlYWs7Y2FzZSJlbmQiOmZzKCl9fSksZigoKT0+e3hzKCkudGhlbigoKT0+e2hzKCl9KX0sMTAwKSxxbi5yZWNvbmZpZ3VyZSgxLHpyLnZhbHVlKSxqbi5yZWNvbmZpZ3VyZSgxLDkqTWF0aC5wb3coeXIudmFsdWUsMikvNDAseXIudmFsdWUpO2xldCB4ZT17c2V0UGFyZW50OmhzfTt0ZSh4ZSksUC5vblVubW91bnRlZCgoKT0+e2NlKHhlKX0pfSksUC5vblVubW91bnRlZCgoKT0+e0FpKCl9KSwoKT0+e1UocGUpfX1sZXQgWHI9MTYsVXI9e2FjdGl2ZUNvbG9yOkluLlBSSU1BUllfQ09MT1IsYmFja2dyb3VuZENvbG9yOiIjRUJFQkVCIixhY3RpdmVNb2RlOiJiYWNrd2FyZHMifSxEdD17cGVyY2VudDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowLHZhbGlkYXRvcih2KXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdCh2KSl9fSxmb250U2l6ZTp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpYcn0sc2hvd0luZm86e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxzdHJva2VXaWR0aDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo2LHZhbGlkYXRvcih2KXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdCh2KSl9fSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpVci5hY3RpdmVDb2xvcn0sYWN0aXZlQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6VXIuYWN0aXZlQ29sb3J9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpVci5iYWNrZ3JvdW5kQ29sb3J9LGFjdGl2ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGFjdGl2ZU1vZGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6VXIuYWN0aXZlTW9kZX0sZHVyYXRpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MzAsdmFsaWRhdG9yKHYpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KHYpKX19LGJvcmRlclJhZGl1czp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfX0sVGU9W3sidW5pLXByb2dyZXNzIjp7IiI6e2ZsZXg6MSxmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciJ9fSwidW5pLXByb2dyZXNzLWJhciI6eyIiOntmbGV4OjF9fSwidW5pLXByb2dyZXNzLWlubmVyLWJhciI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUifX0sInVuaS1wcm9ncmVzcy1pbmZvIjp7IiI6e21hcmdpbkxlZnQ6IjE1cHgifX19XSxfaT1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUHJvZ3Jlc3MiLHByb3BzOkR0LHN0eWxlczpUZSxlbWl0czpbImFjdGl2ZWVuZCJdLHNldHVwKHYse2VtaXQ6eH0pe2xldCAkPVAucmVmKG51bGwpLFU9UC5yZWYobnVsbCksWj1LbigkLHgpLHE9Ymkodik7cmV0dXJuIFAud2F0Y2goKCk9PnEucmVhbFBlcmNlbnQsKHRlLGNlKT0+e3EubGFzdFBlcmNlbnQ9Y2V8fDAseWkocSx2LFopfSksUC5vbk1vdW50ZWQoKCk9PntmKCgpPT57a24oVS52YWx1ZSkudGhlbigoe3dpZHRoOnRlfSk9PntxLnByb2dyZXNzV2lkdGg9dGV8fDAseWkocSx2LFopfSl9LDUwKX0pLCgpPT57bGV0e3Nob3dJbmZvOnRlLGZvbnRTaXplOmNlfT12LHtvdXRlckJhclN0eWxlOnBlLGlubmVyQmFyU3R5bGU6SWUsY3VycmVudFBlcmNlbnQ6ZmV9PXE7cmV0dXJuIFAuY3JlYXRlVk5vZGUoImRpdiIse3JlZjokLGNsYXNzOiJ1bmktcHJvZ3Jlc3MifSxbUC5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOlUsc3R5bGU6cGUsY2xhc3M6InVuaS1wcm9ncmVzcy1iYXIifSxbUC5jcmVhdGVWTm9kZSgiZGl2Iix7c3R5bGU6SWUsY2xhc3M6InVuaS1wcm9ncmVzcy1pbm5lci1iYXIifSxudWxsKV0pLHRlP0puKGZlKyIlIix7Y2xhc3M6InVuaS1wcm9ncmVzcy1pbmZvIixzdHlsZTp7Zm9udFNpemU6Y2V9fSk6bnVsbF0pfX19KTtmdW5jdGlvbiBiaSh2KXtsZXQgeD1QLnJlZigwKSwkPVAucmVmKDApLFU9UC5jb21wdXRlZCgoKT0+KHtiYWNrZ3JvdW5kQ29sb3I6di5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyUmFkaXVzOnYuYm9yZGVyUmFkaXVzLGhlaWdodDp2LnN0cm9rZVdpZHRofSkpLFo9UC5jb21wdXRlZCgoKT0+e2xldCBjZT12LmNvbG9yIT09VXIuYWN0aXZlQ29sb3ImJnYuYWN0aXZlQ29sb3I9PT1Vci5hY3RpdmVDb2xvcj92LmNvbG9yOnYuYWN0aXZlQ29sb3I7cmV0dXJue3dpZHRoOngudmFsdWUqJC52YWx1ZS8xMDAsaGVpZ2h0OnYuc3Ryb2tlV2lkdGgsYmFja2dyb3VuZENvbG9yOmNlLGJvcmRlclJhZGl1czp2LmJvcmRlclJhZGl1c319KSxxPVAuY29tcHV0ZWQoKCk9PntsZXQgY2U9cGFyc2VGbG9hdCh2LnBlcmNlbnQpO3JldHVybiBjZTwwJiYoY2U9MCksY2U+MTAwJiYoY2U9MTAwKSxjZX0pO3JldHVybiBQLnJlYWN0aXZlKHtvdXRlckJhclN0eWxlOlUsaW5uZXJCYXJTdHlsZTpaLHJlYWxQZXJjZW50OnEsY3VycmVudFBlcmNlbnQ6eCxzdHJva2VUaW1lcjowLGxhc3RQZXJjZW50OjAscHJvZ3Jlc3NXaWR0aDokfSl9ZnVuY3Rpb24geWkodix4LCQpe3Yuc3Ryb2tlVGltZXImJmNsZWFySW50ZXJ2YWwodi5zdHJva2VUaW1lcikseC5hY3RpdmU/KHYuY3VycmVudFBlcmNlbnQ9eC5hY3RpdmVNb2RlPT09VXIuYWN0aXZlTW9kZT8wOnYubGFzdFBlcmNlbnQsdi5zdHJva2VUaW1lcj1zZXRJbnRlcnZhbCgoKT0+e3YuY3VycmVudFBlcmNlbnQrMT52LnJlYWxQZXJjZW50Pyh2LmN1cnJlbnRQZXJjZW50PXYucmVhbFBlcmNlbnQsdi5zdHJva2VUaW1lciYmY2xlYXJJbnRlcnZhbCh2LnN0cm9rZVRpbWVyKSwkKCJhY3RpdmVlbmQiLHt9KSk6di5jdXJyZW50UGVyY2VudCs9MX0scGFyc2VGbG9hdCh4LmR1cmF0aW9uKSkpOnYuY3VycmVudFBlcmNlbnQ9di5yZWFsUGVyY2VudH1sZXQgT3I9e3ZhbHVlOnt0eXBlOkFycmF5LGRlZmF1bHQoKXtyZXR1cm5bXX0sdmFsaWRhdG9yOmZ1bmN0aW9uKHYpe3JldHVybiB3dC5pc0FycmF5KHYpJiZ2LmZpbHRlcih4PT50eXBlb2YgeD09Im51bWJlciIpLmxlbmd0aD09PXYubGVuZ3RofX0saW5kaWNhdG9yU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGluZGljYXRvckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxtYXNrU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1hc2tDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LFJpPXd0LmV4dGVuZCh7fSxPcix7aGVpZ2h0Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1hc2tUb3BTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza0JvdHRvbVN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0pLFRyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJQaWNrZXJWaWV3Iixwcm9wczpSaSxlbWl0czpbImNoYW5nZSIsInVwZGF0ZTp2YWx1ZSJdLHNldHVwKHYse3Nsb3RzOngsZW1pdDokfSl7bGV0IFU9UC5yZWYobnVsbCksWj1Scih2KSxxPUtuKFUsJCksdGU9W10sY2U9SWU9PkFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGUuZmlsdGVyKGZlPT5mZS50eXBlIT09UC5Db21tZW50KSxJZSkscGU9SWU9PlAuY29tcHV0ZWQoe2dldCgpe2xldCBmZT1jZShJZS52bm9kZSk7cmV0dXJuIFoudmFsdWVbZmVdfHwwfSxzZXQoZmUpe2lmKCFJZS5kYXRhLl9pc01vdW50ZWQpcmV0dXJuO2xldCBDZT1jZShJZS52bm9kZSk7aWYoQ2U8MClyZXR1cm47aWYoWi52YWx1ZVtDZV0hPT1mZSl7Wi52YWx1ZVtDZV09ZmU7bGV0IGd0PVoudmFsdWUubWFwKEh0PT5IdCk7JCgidXBkYXRlOnZhbHVlIixndCkscSgiY2hhbmdlIix7dmFsdWU6Z3R9KX19fSk7cmV0dXJuIFAucHJvdmlkZSgiZ2V0UGlja2VyVmlld0NvbHVtbiIscGUpLFAucHJvdmlkZSgicGlja2VyVmlld1Byb3BzIix2KSwoKT0+e2xldCBJZT14LmRlZmF1bHQmJnguZGVmYXVsdCgpO3RlPW1pKEllKTtsZXQgZmU9di5oZWlnaHQ/e2hlaWdodDpgJHtwYXJzZUZsb2F0KHYuaGVpZ2h0KX1weGB9Ont9O3JldHVybiBQLmNyZWF0ZVZOb2RlKCJ2aWV3IixQLm1lcmdlUHJvcHMoe3JlZjpVLGNsYXNzOiJ1bmktcGlja2VyLXZpZXciLHN0eWxlOmZlfSx7cHJldmVudEdlc3R1cmU6ITB9KSxbUC5jcmVhdGVWTm9kZSgidmlldyIse2NsYXNzOiJ1bmktcGlja2VyLXZpZXctd3JhcHBlciJ9LFt0ZV0pXSl9fSxzdHlsZXM6W3sidW5pLXBpY2tlci12aWV3Ijp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9fSwidW5pLXBpY2tlci12aWV3LXdyYXBwZXIiOnsiIjp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoicm93Iixwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLG92ZXJmbG93OiJoaWRkZW4ifX19XX0pO2Z1bmN0aW9uIFJyKHYpe2xldCB4PVAucmVhY3RpdmUoWy4uLnYudmFsdWVdKSwkPVAucmVhY3RpdmUoe3ZhbHVlOnh9KTtyZXR1cm4gUC53YXRjaCgoKT0+di52YWx1ZSxVPT57JC52YWx1ZS5sZW5ndGg9VS5sZW5ndGgsUC5uZXh0VGljaygoKT0+e1UuZm9yRWFjaCgoWixxKT0+e1ohPT0kLnZhbHVlW3FdJiYkLnZhbHVlLnNwbGljZShxLDEsWil9KX0pfSksJH1sZXQgYWk9RS5yZXF1aXJlTW9kdWxlKCJkb20iKSxQcj1FLmNvbmZpZy5lbnYucGxhdGZvcm0udG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIjtmdW5jdGlvbiBFaSh2KXtyZXR1cm4gd3QuZXh0ZW5kKHt9LHd0LmlzU3RyaW5nKHYpP3VvKHYpOnYpfWxldCBmbj17bGVuZ3RoOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9fSxqaT1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUGlja2VyVmlld0NvbHVtbiIscHJvcHM6Zm4sZGF0YTooKT0+KHtfaXNNb3VudGVkOiExfSksc2V0dXAodix7c2xvdHM6eH0pe2xldCAkPVAuZ2V0Q3VycmVudEluc3RhbmNlKCksVT1QLnJlZihudWxsKSxaPVAucmVmKG51bGwpLHE9UC5yZWYobnVsbCksdGU9UC5yZWYobnVsbCksY2U9UC5pbmplY3QoInBpY2tlclZpZXdQcm9wcyIpLEllPVAuaW5qZWN0KCJnZXRQaWNrZXJWaWV3Q29sdW1uIikoJCksZmU9UC5jb21wdXRlZCgoKT0+RWkoY2UuaW5kaWNhdG9yU3R5bGUpKSxDZT1QLmNvbXB1dGVkKCgpPT5FaShjZS5tYXNrVG9wU3R5bGUpKSxjdD1QLmNvbXB1dGVkKCgpPT5FaShjZS5tYXNrQm90dG9tU3R5bGUpKSxndD1QLnJlZigwKTtndC52YWx1ZT0kcihmZS52YWx1ZSk7bGV0IEh0PVAucmVmKDApO0h0LnZhbHVlPXBhcnNlRmxvYXQoY2UuaGVpZ2h0KTtsZXR7c2V0Q3VycmVudDp5dCxvblNjcm9sbGVuZDpqZX09dG8odixJZSxaLGd0KSxNdD0oKT0+e2xldCBHdCxkdDtmKCgpPT57UHJvbWlzZS5hbGwoW2tuKFUudmFsdWUpLnRoZW4oKHtoZWlnaHQ6ZW59KT0+e0d0PUh0LnZhbHVlPWVufSksUHImJnYubGVuZ3RoP2tuKHEudmFsdWUpLnRoZW4oKHtoZWlnaHQ6ZW59KT0+e2R0PWd0LnZhbHVlPWVuL3BhcnNlRmxvYXQodi5sZW5ndGgpfSk6a24odGUudmFsdWUpLnRoZW4oKHtoZWlnaHQ6ZW59KT0+e2R0PWd0LnZhbHVlPWVufSldKS50aGVuKCgpPT57R3QmJmR0P2YoKCk9PnskLmRhdGEuX2lzTW91bnRlZD0hMCx5dChJZS52YWx1ZSwhMSwhMCl9LDUwKTpNdCgpfSl9LDUwKX07UC5vbk1vdW50ZWQoTXQpO2xldCBkbj1HdD0+R3Q/UHI/UC5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOnEsc3R5bGU6ImZsZXgtZGlyZWN0aW9uOmNvbHVtbjsifSxbR3RdKTpHdDpudWxsO3JldHVybigpPT57bGV0IEd0PXguZGVmYXVsdCYmeC5kZWZhdWx0KCksZHQ9KEh0LnZhbHVlLWd0LnZhbHVlKS8yLGVuPWAke0h0LnZhbHVlLWR0fXB4YCxCbj17c2hvd1Njcm9sbGJhcjohMSxzY3JvbGxUb0JlZ2luOiExLGRlY2VsZXJhdGlvblJhdGU6LjMsc2Nyb2xsWTohMH07cmV0dXJuIFByfHwoQm4uc2Nyb2xsVG9wPUllLnZhbHVlKmd0LnZhbHVlKSxQLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7cmVmOlUsY2xhc3M6InVuaS1waWNrZXItdmlldy1jb2x1bW4ifSxbUC5jcmVhdGVWTm9kZSgic2Nyb2xsLXZpZXciLFAubWVyZ2VQcm9wcyh7Y2xhc3M6InVuaS1waWNrZXItdmlldy1ncm91cCIsc3R5bGU6ImZsZXgtZGlyZWN0aW9uOmNvbHVtbjsiLG9uU2Nyb2xsZW5kOmplfSxCbiksW1AuY3JlYXRlVk5vZGUoInZpZXciLHtyZWY6WixjbGFzczoidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiLHN0eWxlOntwYWRkaW5nVG9wOmAke2R0fXB4YCxwYWRkaW5nQm90dG9tOmAke2R0fXB4YH19LFtkbihHdCldKV0pLFAuY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtjbGFzczoidW5pLXBpY2tlci12aWV3LW1hc2sifSxbUC5jcmVhdGVWTm9kZSgidS1zY2FsYWJsZSIse2NsYXNzOiJ1bmktcGlja2VyLXZpZXctbWFzayB1bmktcGlja2VyLXZpZXctbWFzay10b3AiLHN0eWxlOnd0LmV4dGVuZCh7fSxDZS52YWx1ZSx7Ym90dG9tOmVufSl9LG51bGwpLFAuY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtjbGFzczoidW5pLXBpY2tlci12aWV3LW1hc2sgdW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIixzdHlsZTp3dC5leHRlbmQoe30sY3QudmFsdWUse3RvcDplbn0pfSxudWxsKV0pLFAuY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtyZWY6dGUsY2xhc3M6InVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiLHN0eWxlOnd0LmV4dGVuZCh7fSxmZS52YWx1ZSx7dG9wOmAke2R0fXB4YH0pfSxudWxsKV0pfX0sc3R5bGVzOlt7InVuaS1waWNrZXItdmlldy1jb2x1bW4iOnsiIjp7ZmxleDoxLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYWxpZ25JdGVtczoic3RyZXRjaCIsb3ZlcmZsb3c6ImhpZGRlbiJ9fSwidW5pLXBpY2tlci12aWV3LW1hc2siOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxwb2ludGVyRXZlbnRzOiJub25lIn19LCJ1bmktcGlja2VyLXZpZXctbWFzay10b3AiOnsiIjp7Ym90dG9tOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9fSwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIjp7IiI6e3RvcDowLGJhY2tncm91bmRJbWFnZToibGluZWFyLWdyYWRpZW50KHRvIHRvcCxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkifX0sInVuaS1waWNrZXItdmlldy1ncm91cCI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowfX0sInVuaS1waWNrZXItdmlldy1jb250ZW50Ijp7IiI6e2ZsZXhEaXJlY3Rpb246ImNvbHVtbiIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDowLHBhZGRpbmdCb3R0b206MCxwYWRkaW5nTGVmdDowfX0sInVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCx0b3A6MCxoZWlnaHQ6IjM0cHgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGJvcmRlckNvbG9yOiIjZTVlNWU1Iixib3JkZXJUb3BXaWR0aDoiMXB4Iixib3JkZXJCb3R0b21XaWR0aDoiMXB4In19fV19KTtmdW5jdGlvbiAkcih2KXtsZXQgJD0odi5oZWlnaHR8fHYubGluZUhlaWdodHx8IiIpLm1hdGNoKC8oLT9bXGRcLl0rKXB4LyksVT0wO3JldHVybiAkJiYoVT1wYXJzZUZsb2F0KCRbMV0pKSxVfWZ1bmN0aW9uIHRvKHYseCwkLFUpe2xldCBaO2Z1bmN0aW9uIHEocGUsSWU9ITApe2FpLnNjcm9sbFRvRWxlbWVudCgkLnZhbHVlLHtvZmZzZXQ6cGUqVS52YWx1ZSxhbmltYXRlZDpJZX0pLEllJiYoWj1EYXRlLm5vdygpKX1QLndhdGNoKCgpPT52Lmxlbmd0aCwoKT0+e2YoKCk9Pnt0ZSh4LnZhbHVlLCEwLCEwKX0sMTUwKX0pLFAud2F0Y2goeCxwZT0+cShwZSkpO2xldCB0ZT0ocGUsSWU9ITAsZmUpPT57eC52YWx1ZT09PXBlJiYhZmV8fCh4LnZhbHVlPXBlLFByJiZxKHBlLEllKSl9O3JldHVybntzZXRDdXJyZW50OnRlLG9uU2Nyb2xsZW5kOnBlPT57aWYoRGF0ZS5ub3coKS1aPDM0MClyZXR1cm47bGV0IEllPXBlLmRldGFpbC5jb250ZW50T2Zmc2V0LnksZmU9TWF0aC5yb3VuZChJZS9VLnZhbHVlKTtJZSVVLnZhbHVlP3RlKGZlLCEwLCEwKTp4LnZhbHVlPWZlfX19bGV0IEVuPXtTRUxFQ1RPUjoic2VsZWN0b3IiLE1VTFRJU0VMRUNUT1I6Im11bHRpU2VsZWN0b3IiLFRJTUU6InRpbWUiLERBVEU6ImRhdGUifSxIcj17WUVBUjoieWVhciIsTU9OVEg6Im1vbnRoIixEQVk6ImRheSJ9O2Z1bmN0aW9uIHNyKHYpe3JldHVybiB2Pjk/djpgMCR7dn1gfWZ1bmN0aW9uIFNpKHYseCl7dj1TdHJpbmcodnx8IiIpO2xldCAkPW5ldyBEYXRlO2lmKHg9PT1Fbi5USU1FKXtsZXQgVT12LnNwbGl0KCI6Iik7VS5sZW5ndGg9PT0yJiYkLnNldEhvdXJzKHBhcnNlSW50KFVbMF0pLHBhcnNlSW50KFVbMV0pKX1lbHNle2xldCBVPXYuc3BsaXQoIi0iKTtVLmxlbmd0aD09PTMmJiQuc2V0RnVsbFllYXIocGFyc2VJbnQoVVswXSkscGFyc2VJbnQoU3RyaW5nKHBhcnNlRmxvYXQoVVsxXSktMSkpLHBhcnNlSW50KFVbMl0pKX1yZXR1cm4gJH1mdW5jdGlvbiB4aSh2KXtpZih2Lm1vZGU9PT1Fbi5USU1FKXJldHVybiIwMDowMCI7aWYodi5tb2RlPT09RW4uREFURSl7bGV0IHg9bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLTEwMDtzd2l0Y2godi5maWVsZHMpe2Nhc2UgSHIuWUVBUjpyZXR1cm4geDtjYXNlIEhyLk1PTlRIOnJldHVybiB4KyItMDEiO2RlZmF1bHQ6cmV0dXJuIHgrIi0wMS0wMSJ9fXJldHVybiIifWZ1bmN0aW9uIG1yKHYpe2lmKHYubW9kZT09PUVuLlRJTUUpcmV0dXJuIjIzOjU5IjtpZih2Lm1vZGU9PT1Fbi5EQVRFKXtsZXQgeD1uZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkrMTAwO3N3aXRjaCh2LmZpZWxkcyl7Y2FzZSBIci5ZRUFSOnJldHVybiB4O2Nhc2UgSHIuTU9OVEg6cmV0dXJuIHgrIi0xMiI7ZGVmYXVsdDpyZXR1cm4geCsiLTEyLTMxIn19cmV0dXJuIiJ9bGV0IFFyPXtuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxyYW5nZTp7dHlwZTpBcnJheSxkZWZhdWx0KCl7cmV0dXJuW119fSxyYW5nZUtleTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmcsQXJyYXldLGRlZmF1bHQ6MH0sbW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpFbi5TRUxFQ1RPUix2YWxpZGF0b3Iodil7cmV0dXJuIE9iamVjdC52YWx1ZXMoRW4pLmluZGV4T2Yodik+PTB9fSxmaWVsZHM6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHN0YXJ0Ont0eXBlOlN0cmluZyxkZWZhdWx0OnhpfSxlbmQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bXJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGVyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJQaWNrZXIiLHByb3BzOlFyLGVtaXRzOlsiY2hhbmdlIiwiY2FuY2VsIiwiY29sdW1uY2hhbmdlIl0sc2V0dXAodix7c2xvdHM6eCxlbWl0OiR9KXtsZXQgVT1QLnJlZihudWxsKSxaPUtuKFUsJCkscT1QLnJlZihudWxsKSx0ZT1QLnJlZihudWxsKSxjZT0oKT0+e2xldCB5dD12LnZhbHVlO3N3aXRjaCh2Lm1vZGUpe2Nhc2UgRW4uTVVMVElTRUxFQ1RPUjp7d3QuaXNBcnJheSh5dCl8fCh5dD1bXSksd3QuaXNBcnJheShxLnZhbHVlKXx8KHEudmFsdWU9W10pO2xldCBqZT1xLnZhbHVlLmxlbmd0aD1NYXRoLm1heCh5dC5sZW5ndGgsdi5yYW5nZS5sZW5ndGgpO2ZvcihsZXQgTXQ9MDtNdDxqZTtNdCsrKXtsZXQgZG49TnVtYmVyKHl0W010XSksR3Q9TnVtYmVyKHEudmFsdWVbTXRdKSxkdD1pc05hTihkbik/aXNOYU4oR3QpPzA6R3Q6ZG47cS52YWx1ZS5zcGxpY2UoTXQsMSxkdDwwPzA6ZHQpfX1icmVhaztjYXNlIEVuLlRJTUU6Y2FzZSBFbi5EQVRFOnEudmFsdWU9U3RyaW5nKHl0KTticmVhaztkZWZhdWx0OntsZXQgamU9TnVtYmVyKHl0KTtxLnZhbHVlPWplPDA/MDpqZTticmVha319fSxwZT15dD0+e3RlLnZhbHVlJiZ0ZS52YWx1ZS5zZW5kTWVzc2FnZSh5dCl9LEllPXl0PT57bGV0IGplPXtldmVudDoiY2FuY2VsIn07dGUudmFsdWU9c24oe3VybDoiX191bmlhcHBwaWNrZXIiLGRhdGE6eXQsc3R5bGU6e3RpdGxlTlZpZXc6ITEsYW5pbWF0aW9uVHlwZToibm9uZSIsYW5pbWF0aW9uRHVyYXRpb246MCxiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDApIixwb3BHZXN0dXJlOiJub25lIn0sb25NZXNzYWdlOk10PT57bGV0IGRuPU10LmV2ZW50O2lmKGRuPT09ImNyZWF0ZWQiKXtwZSh5dCk7cmV0dXJufWlmKGRuPT09ImNvbHVtbmNoYW5nZSIpe2RlbGV0ZSBNdC5ldmVudCxaKGRuLE10KTtyZXR1cm59amU9TXR9LG9uQ2xvc2U6KCk9Pnt0ZS52YWx1ZT1udWxsO2xldCBNdD1qZS5ldmVudDtkZWxldGUgamUuZXZlbnQsTXQmJlooTXQsamUpfX0pfSxmZT15dD0+e2gubmF0aXZlVUlbdi5tb2RlPT09RW4uVElNRT8icGlja1RpbWUiOiJwaWNrRGF0ZSJdKGplPT57bGV0IE10PWplLmRhdGU7WigiY2hhbmdlIix7dmFsdWU6di5tb2RlPT09RW4uVElNRT9gJHtzcihNdC5nZXRIb3VycygpKX06JHtzcihNdC5nZXRNaW51dGVzKCkpfWA6YCR7TXQuZ2V0RnVsbFllYXIoKX0tJHtzcihNdC5nZXRNb250aCgpKzEpfS0ke3NyKE10LmdldERhdGUoKSl9YH0pfSwoKT0+e1ooImNhbmNlbCIse30pfSx2Lm1vZGU9PT1Fbi5USU1FP3t0aW1lOlNpKHYudmFsdWUsRW4uVElNRSl9OntkYXRlOlNpKHYudmFsdWUsRW4uREFURSksbWluRGF0ZTpTaSh2LnN0YXJ0LEVuLkRBVEUpLG1heERhdGU6U2kodi5lbmQsRW4uREFURSl9KX0sQ2U9eXQ9PnsoeXQubW9kZT09PUVuLlRJTUV8fHl0Lm1vZGU9PT1Fbi5EQVRFKSYmIXl0LmZpZWxkcz9mZSgpOih5dC5maWVsZHM9T2JqZWN0LnZhbHVlcyhIcikuaW5jbHVkZXMoeXQuZmllbGRzKT95dC5maWVsZHM6SHIuREFZLEllKHl0KSl9LGN0PXl0PT57di5kaXNhYmxlZHx8Q2Uod3QuZXh0ZW5kKHt9LHYse3ZhbHVlOnEudmFsdWUsbG9jYWxlOnAuZ2V0TG9jYWxlKCl9KSl9LGd0PVAuaW5qZWN0KHJpLCExKSxIdD17c3VibWl0OigpPT5bdi5uYW1lLHEudmFsdWVdLHJlc2V0OigpPT57c3dpdGNoKHYubW9kZSl7Y2FzZSBFbi5TRUxFQ1RPUjpxLnZhbHVlPTA7YnJlYWs7Y2FzZSBFbi5NVUxUSVNFTEVDVE9SOnd0LmlzQXJyYXkodi52YWx1ZSkmJihxLnZhbHVlPXYudmFsdWUubWFwKHl0PT4wKSk7YnJlYWs7Y2FzZSBFbi5EQVRFOmNhc2UgRW4uVElNRTpxLnZhbHVlPSIiO2JyZWFrfX19O3JldHVybiBndCYmKGd0LmFkZEZpZWxkKEh0KSxQLm9uQmVmb3JlVW5tb3VudCgoKT0+Z3QucmVtb3ZlRmllbGQoSHQpKSksT2JqZWN0LmtleXModikuZm9yRWFjaCh5dD0+e1Aud2F0Y2goKCk9PnZbeXRdLGplPT57bGV0IE10PXt9O010W3l0XT1qZSxwZShNdCl9LHtkZWVwOiEwfSl9KSxQLndhdGNoKCgpPT52LnZhbHVlLGNlLHtkZWVwOiEwfSksY2UoKSwoKT0+UC5jcmVhdGVWTm9kZSgidmlldyIse3JlZjpVLG9uQ2xpY2s6Y3R9LFt4LmRlZmF1bHQmJnguZGVmYXVsdCgpXSl9fSksdHI9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1pbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxtYXg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MTAwfSx2YWx1ZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxzdGVwOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNlOWU5ZTkifSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNlOWU5ZTkifSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHNlbGVjdGVkQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSxibG9ja0NvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjZmZmZmZmIn0sYmxvY2tTaXplOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjI4fSxzaG93VmFsdWU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sR249W3sidW5pLXNsaWRlciI6eyIiOntmbGV4OjEsZmxleERpcmVjdGlvbjoiY29sdW1uIn19LCJ1bmktc2xpZGVyLXdyYXBwZXIiOnsiIjp7ZmxleERpcmVjdGlvbjoicm93IixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJjZW50ZXIifX0sInVuaS1zbGlkZXItdGFwLWFyZWEiOnsiIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIiLHBhZGRpbmdUb3A6IjE0IixwYWRkaW5nQm90dG9tOiIxNCJ9fSwidW5pLXNsaWRlci1oYW5kbGUtd3JhcHBlciI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxiYWNrZ3JvdW5kQ29sb3I6IiNlOWU5ZTkiLGhlaWdodDoiMiIsYm9yZGVyUmFkaXVzOiI1IixtYXJnaW5SaWdodDoiMTQiLG1hcmdpbkxlZnQ6IjE0In19LCJ1bmktc2xpZGVyLXRyYWNrIjp7IiI6e2hlaWdodDoiMiIsYm9yZGVyUmFkaXVzOiI2IixiYWNrZ3JvdW5kQ29sb3I6IiMwMDdhZmYifX0sInVuaS1zbGlkZXItdGh1bWIiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjEiLHdpZHRoOiIyOCIsaGVpZ2h0OiIyOCIsYm9yZGVyUmFkaXVzOjUwLGJveFNoYWRvdzoiMCAwIDRweCAjZWJlYmViIn19LCJ1bmktc2xpZGVyLXZhbHVlIjp7IiI6e2NvbG9yOiIjODg4ODg4Iixmb250U2l6ZToiMTYiLHdpZHRoOiIzMCJ9fX1dLG5yPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJVU2xpZGVyIixwcm9wczp0cixzdHlsZXM6R24sc2V0dXAodix7ZW1pdDp4fSl7bGV0ICQ9UC5yZWYobnVsbCksVT1QLnJlZihudWxsKSxaPUtuKCQseCkscT1jcih2KSx0ZT1obyh2LHEsWik7cmV0dXJuIGdvKHYscSksUC53YXRjaCgoKT0+di52YWx1ZSxjZT0+e3Euc2xpZGVyVmFsdWU9TnVtYmVyKGNlKX0pLFAub25Nb3VudGVkKCgpPT57ZigoKT0+e2tuKFUudmFsdWUpLnRoZW4oKHt3aWR0aDpjZSxsZWZ0OnBlfSk9PntxLnNsaWRlckxlZnQ9cGUscS5zbGlkZXJXaWR0aD1jZXx8MCxxLnNsaWRlclZhbHVlPU51bWJlcih2LnZhbHVlKX0pfSwxMDApfSksKCk9PntsZXR7c2hvd1ZhbHVlOmNlfT12LHt0cmFja1RhcFN0eWxlOnBlLHRyYWNrU3R5bGU6SWUsdHJhY2tBY3RpdmVTdHlsZTpmZSx0aHVtYlN0eWxlOkNlLHNsaWRlclZhbHVlOmN0fT1xO3JldHVybiBQLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlciIscmVmOiR9LFtQLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlci13cmFwcGVyIn0sW1AuY3JlYXRlVk5vZGUoImRpdiIsUC5tZXJnZVByb3BzKHtjbGFzczoidW5pLXNsaWRlci10YXAtYXJlYSIsc3R5bGU6cGV9LHRlKSxbUC5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXItaGFuZGxlLXdyYXBwZXIiLHN0eWxlOkllLHJlZjpVfSxbUC5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXItdHJhY2siLHN0eWxlOmZlfSxudWxsKV0pLFAuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyLXRodW1iIixzdHlsZTpDZX0sbnVsbCldKSxjZT9KbihjdCsiIix7Y2xhc3M6InVuaS1zbGlkZXItdmFsdWUifSk6bnVsbF0pXSl9fX0pO2Z1bmN0aW9uIGNyKHYpe2xldCB4PVAucmVmKDApLCQ9UC5yZWYoMCksVT1QLnJlZigwKSxaPSgpPT52LmJhY2tncm91bmRDb2xvciE9PSIjZTllOWU5Ij92LmJhY2tncm91bmRDb2xvcjp2LmNvbG9yIT09IiMwMDdhZmYiP3YuY29sb3I6IiMwMDdhZmYiLHE9KCk9PnYuYWN0aXZlQ29sb3IhPT0iIzAwN2FmZiI/di5hY3RpdmVDb2xvcjp2LnNlbGVjdGVkQ29sb3IhPT0iI2U5ZTllOSI/di5zZWxlY3RlZENvbG9yOiIjZTllOWU5Iix0ZT0oKT0+e2xldCBJZT1OdW1iZXIodi5tYXgpLGZlPU51bWJlcih2Lm1pbik7cmV0dXJuKFUudmFsdWUtZmUpLyhJZS1mZSkqJC52YWx1ZX0sY2U9TnVtYmVyKHYuYmxvY2tTaXplKS8yO3JldHVybiBQLnJlYWN0aXZlKHtzbGlkZXJMZWZ0Ongsc2xpZGVyV2lkdGg6JCxzbGlkZXJWYWx1ZTpVLHNsaWRlclRodW1iT2Zmc2V0OmNlLHRyYWNrVGFwU3R5bGU6UC5jb21wdXRlZCgoKT0+KHtwYWRkaW5nVG9wOmNlLHBhZGRpbmdCb3R0b206Y2V9KSksdHJhY2tTdHlsZTpQLmNvbXB1dGVkKCgpPT4oe2JhY2tncm91bmRDb2xvcjpaKCksbWFyZ2luTGVmdDpjZSxtYXJnaW5SaWdodDpjZX0pKSx0cmFja0FjdGl2ZVN0eWxlOlAuY29tcHV0ZWQoKCk9Pih7YmFja2dyb3VuZENvbG9yOnEoKSx3aWR0aDp0ZSgpfSkpLHRodW1iU3R5bGU6UC5jb21wdXRlZCgoKT0+KHt3aWR0aDp2LmJsb2NrU2l6ZSxoZWlnaHQ6di5ibG9ja1NpemUsYmFja2dyb3VuZENvbG9yOnYuYmxvY2tDb2xvcixsZWZ0OnRlKCl9KSl9KX1mdW5jdGlvbiBobyh2LHgsJCl7bGV0IFU9bnVsbDtmdW5jdGlvbiBaKGNlLHBlKXt2LmRpc2FibGVkfHwoY2U9PT0ibW92ZSI/KHEocGUpLCQoImNoYW5naW5nIix7dmFsdWU6eC5zbGlkZXJWYWx1ZX0pKTpjZT09PSJlbmQiJiYocShwZSksJCgiY2hhbmdlIix7dmFsdWU6eC5zbGlkZXJWYWx1ZX0pKSl9ZnVuY3Rpb24gcShjZSl7Y2UtPXguc2xpZGVyVGh1bWJPZmZzZXQsY2U8MCYmKGNlPTApLGNlPnguc2xpZGVyV2lkdGgmJihjZT14LnNsaWRlcldpZHRoKTtsZXQgcGU9TnVtYmVyKHYubWF4KSxJZT1OdW1iZXIodi5taW4pLGZlPU51bWJlcih2LnN0ZXApLENlPWNlL3guc2xpZGVyV2lkdGgqKHBlLUllKTtmZT4wJiZDZT5mZSYmQ2UlZmUvZmUhPT0wP0NlLT1DZSVmZTpDZT1wYXJzZUludChDZSsiIikseC5zbGlkZXJWYWx1ZT1DZStJZX1yZXR1cm57b25Ub3VjaHN0YXJ0KGNlKXtjZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT0xJiYhVSYmKFU9Y2UsWigic3RhcnQiLGNlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYKSl9LG9uVG91Y2htb3ZlKGNlKXtjZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT0xJiZVJiZaKCJtb3ZlIixjZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCl9LG9uVG91Y2hlbmQoY2Upe2NlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD09PTEmJlUmJihVPW51bGwsWigiZW5kIixjZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCkpfX19ZnVuY3Rpb24gZ28odix4KXtsZXQgJD1QLmluamVjdChyaSwhMSksVT17c3VibWl0OigpPT57bGV0IFo9WyIiLG51bGxdO3JldHVybiB2Lm5hbWUmJihaWzBdPXYubmFtZSxaWzFdPXguc2xpZGVyVmFsdWUpLFp9LHJlc2V0OigpPT57eC5zbGlkZXJWYWx1ZT1OdW1iZXIodi52YWx1ZSl9fTskJiYoJC5hZGRGaWVsZChVKSxQLm9uVW5tb3VudGVkKCgpPT57JC5yZW1vdmVGaWVsZChVKX0pKX1sZXQgTm89e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJzd2l0Y2gifSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9fSxubz17c3dpdGNoOiJzd2l0Y2giLGNoZWNrYm94OiJjaGVja2JveCJ9LGtvPXt3aWR0aDo1MixoZWlnaHQ6MzJ9LGpyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJTd2l0Y2giLHByb3BzOk5vLGVtaXRzOlsiY2hhbmdlIl0sc2V0dXAodix7ZW1pdDp4fSl7bGV0ICQ9UC5yZWYobnVsbCksVT1QLnJlZih2LmNoZWNrZWQpLFo9eHIodixVKSxxPUtuKCQseCk7UC53YXRjaCgoKT0+di5jaGVja2VkLGNlPT57VS52YWx1ZT1jZX0pO2xldCB0ZT0oY2UscGUpPT57di5kaXNhYmxlZHx8KFUudmFsdWU9Y2UuZGV0YWlsP2NlLmRldGFpbC52YWx1ZTohVS52YWx1ZSxxKCJjaGFuZ2UiLHt2YWx1ZTpVLnZhbHVlfSkpfTtyZXR1cm4gWiYmKFouYWRkSGFuZGxlcih0ZSksUC5vbkJlZm9yZVVubW91bnQoKCk9PntaLnJlbW92ZUhhbmRsZXIodGUpfSkpLHdyKHYseyJsYWJlbC1jbGljayI6dGV9KSwoKT0+e2xldHtjb2xvcjpjZSx0eXBlOnBlLGRpc2FibGVkOkllfT12O3JldHVybiBQLmNyZWF0ZVZOb2RlKCJkaXYiLHtyZWY6JH0sW3BlPT09bm8uc3dpdGNoP1AuY3JlYXRlVk5vZGUoImRjLXN3aXRjaCIsUC5tZXJnZVByb3BzKHtkYXRhVW5jVHlwZToidW5pLXN3aXRjaCJ9LHtvbkNoYW5nZTp0ZX0se2NoZWNrZWQ6VS52YWx1ZSxjb2xvcjpjZSxkaXNhYmxlZDpJZX0se3N0eWxlOmtvfSksbnVsbCk6bnVsbCxwZT09PW5vLmNoZWNrYm94P1AuY3JlYXRlVk5vZGUoUC5yZXNvbHZlQ29tcG9uZW50KCJjaGVja2JveCIpLFAubWVyZ2VQcm9wcyh7c3R5bGU6e2NvbG9yOmNlfX0se2NoZWNrZWQ6VS52YWx1ZSxkaXNhYmxlZDpJZX0se29uQ2xpY2s6dGV9KSxudWxsKTpudWxsXSl9fX0pO2Z1bmN0aW9uIHhyKHYseCl7bGV0ICQ9UC5pbmplY3QocmksITEpLFU9UC5pbmplY3QoV24sITEpLFo9e3N1Ym1pdDooKT0+e2xldCBxPVsiIixudWxsXTtyZXR1cm4gdi5uYW1lJiYocVswXT12Lm5hbWUscVsxXT14LnZhbHVlKSxxfSxyZXNldDooKT0+e3gudmFsdWU9ITF9fTtyZXR1cm4gJCYmKCQuYWRkRmllbGQoWiksUC5vblVubW91bnRlZCgoKT0+eyQucmVtb3ZlRmllbGQoWil9KSksVX1sZXQgcG89e2NoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sUm89cXIoInVjZyIpLHJvPXtuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sQmk9W3sidW5pLWNoZWNrYm94Ijp7IiI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn19LCJ1bmktY2hlY2tib3gtaW5wdXQiOnsiIjp7anVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLGJvcmRlcldpZHRoOiIxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsYm9yZGVyU3R5bGU6InNvbGlkIixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclJhZGl1czoiMyIsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIn19LCJ1bmktaWNvbiI6eyIiOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyIsZm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiIyIixtYXJnaW5Ub3A6IjIiLGNvbG9yOiIjMDA3YWZmIn19LCJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjZTFlMWUxIn19LCJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQtYmVmb3JlIjp7IiI6e2NvbG9yOiIjYWRhZGFkIn19LCJ1bmktY2hlY2tib3gtc2xvdCI6eyIiOntmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjUifX19XSx2bz1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQ2hlY2tib3giLHByb3BzOnBvLHN0eWxlczpCaSxzZXR1cCh2LHtzbG90czp4fSl7bGV0ICQ9UC5yZWYobnVsbCksVT1QLnJlZih2LmNoZWNrZWQpLFo9UC5yZWYodi52YWx1ZSkscT1QLmNvbXB1dGVkKCgpPT52LmRpc2FibGVkPyIjYWRhZGFkIjp2LmNvbG9yKSx0ZT0oKT0+e1UudmFsdWU9ITF9LGNlPShDZSxjdCk9Pnt2LmRpc2FibGVkfHwoVS52YWx1ZT0hVS52YWx1ZSxwZSYmcGUuY2hlY2tib3hDaGFuZ2UoQ2UpKX0se3VuaUNoZWNrR3JvdXA6cGUsdW5pTGFiZWw6SWV9PU1pKFUsWix0ZSk7SWUmJihJZS5hZGRIYW5kbGVyKGNlKSxQLm9uQmVmb3JlVW5tb3VudCgoKT0+e0llLnJlbW92ZUhhbmRsZXIoY2UpfSkpLHdyKHYseyJsYWJlbC1jbGljayI6Y2V9KSxQLndhdGNoKFsoKT0+di5jaGVja2VkLCgpPT52LnZhbHVlXSwoW0NlLGN0XSk9PntVLnZhbHVlPUNlLFoudmFsdWU9Y3R9KTtsZXQgZmU9KCk9PntpZigheC5kZWZhdWx0KXJldHVybltdO2xldCBDZT14LmRlZmF1bHQoKTtyZXR1cm4gQ2UubGVuZ3RoPT09MSYmQ2VbMF0udHlwZT09PVRleHQ/W0puKENlWzBdLmNoaWxkcmVuLHtjbGFzczoidW5pLWNoZWNrYm94LXNsb3QifSldOkNlfTtyZXR1cm4oKT0+UC5jcmVhdGVWTm9kZSgiZGl2IixQLm1lcmdlUHJvcHMoe3JlZjokfSx7ZGF0YVVuY1R5cGU6InVuaS1jaGVja2JveCJ9LHtvbkNsaWNrOmNlLGNsYXNzOiJ1bmktY2hlY2tib3gifSksW1AuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOlsidW5pLWNoZWNrYm94LWlucHV0Iix7InVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZCI6di5kaXNhYmxlZH1dfSxbVS52YWx1ZT9KbigiXHVFQTA4Iix7Y2xhc3M6InVuaS1pY29uIixzdHlsZTp7Y29sb3I6cS52YWx1ZX19KTpudWxsXSksLi4uZmUoKV0pfX0pO2Z1bmN0aW9uIE1pKHYseCwkKXtsZXQgVT1QLmNvbXB1dGVkKCgpPT4oe2NoZWNrYm94Q2hlY2tlZDpCb29sZWFuKHYudmFsdWUpLHZhbHVlOngudmFsdWV9KSksWj17cmVzZXQ6JH0scT1QLmluamVjdChSbywhMSk7cSYmcS5hZGRGaWVsZChVKTtsZXQgdGU9UC5pbmplY3QocmksITEpO3RlJiZ0ZS5hZGRGaWVsZChaKTtsZXQgY2U9UC5pbmplY3QoV24sITEpO3JldHVybiBQLm9uQmVmb3JlVW5tb3VudCgoKT0+e3EmJnEucmVtb3ZlRmllbGQoVSksdGUmJnRlLnJlbW92ZUZpZWxkKFopfSkse3VuaUNoZWNrR3JvdXA6cSx1bmlGb3JtOnRlLHVuaUxhYmVsOmNlfX1sZXQgemk9UC5kZWZpbmVDb21wb25lbnQoe25hbWU6IkNoZWNrYm94R3JvdXAiLHByb3BzOnJvLGVtaXRzOlsiY2hhbmdlIl0sc2V0dXAodix7c2xvdHM6eCxlbWl0OiR9KXtsZXQgVT1QLnJlZihudWxsKSxaPUtuKFUsJCk7cmV0dXJuIFFvKHYsWiksKCk9PlAuY3JlYXRlVk5vZGUoImRpdiIse3JlZjpVLGNsYXNzOiJ1bmktY2hlY2tib3gtZ3JvdXAifSxbeC5kZWZhdWx0JiZ4LmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIFFvKHYseCl7bGV0ICQ9W10sVT0oKT0+JC5yZWR1Y2UoKHEsdGUpPT4odGUudmFsdWUuY2hlY2tib3hDaGVja2VkJiZxLnB1c2godGUudmFsdWUudmFsdWUpLHEpLG5ldyBBcnJheSk7UC5wcm92aWRlKFJvLHthZGRGaWVsZChxKXskLnB1c2gocSl9LHJlbW92ZUZpZWxkKHEpeyQuc3BsaWNlKCQuaW5kZXhPZihxKSwxKX0sY2hlY2tib3hDaGFuZ2UocSl7eCgiY2hhbmdlIix7dmFsdWU6VSgpfSl9fSk7bGV0IFo9UC5pbmplY3QocmksITEpO3JldHVybiBaJiZaLmFkZEZpZWxkKHtzdWJtaXQ6KCk9PntsZXQgcT1bIiIsbnVsbF07cmV0dXJuIHYubmFtZSE9PSIiJiYocVswXT12Lm5hbWUscVsxXT1VKCkpLHF9fSksVX1sZXQgQj17Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxRPXFyKCJ1Y2ciKSxoZT17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGFlPVt7InVuaS1yYWRpbyI6eyIiOnthbGlnbkl0ZW1zOiJjZW50ZXIiLGZsZXhEaXJlY3Rpb246InJvdyJ9fSwidW5pLXJhZGlvLWlucHV0Ijp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixtYXJnaW5SaWdodDoiNSIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGJvcmRlclJhZGl1czo1MCx3aWR0aDoiMjIiLGhlaWdodDoiMjIiLG91dGxpbmU6MH19LCJ1bmktcmFkaW8taW5wdXQtaWNvbiI6eyIiOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyIsZm9udFNpemU6IjE0Iixjb2xvcjoiI2ZmZmZmZiJ9fSwidW5pLXJhZGlvLWlucHV0LWRpc2FibGVkIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGNvbG9yOiIjYWRhZGFkIn19LCJ1bmktcmFkaW8tc2xvdCI6eyIiOntmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjUifX19XSxkZT1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUmFkaW8iLHByb3BzOkIsc3R5bGVzOmFlLGVtaXRzOlsiY2hhbmdlIl0sc2V0dXAodix7c2xvdHM6eH0pe2xldCAkPVAucmVmKG51bGwpLFU9UC5yZWYodi5jaGVja2VkKSxaPVAucmVmKHYudmFsdWUpLHE9UC5jb21wdXRlZCgoKT0+e2xldCBjdD12LmRpc2FibGVkPyIjYWRhZGFkIjp2LmNvbG9yO3JldHVybiBVLnZhbHVlP3tiYWNrZ3JvdW5kQ29sb3I6Y3QsYm9yZGVyQ29sb3I6Y3R9Ontib3JkZXJDb2xvcjoiI2QxZDFkMSJ9fSksdGU9KCk9PntVLnZhbHVlPSExfSx7dW5pQ2hlY2tHcm91cDpjZSx1bmlMYWJlbDpwZSxmaWVsZDpJZX09dnQoVSxaLHRlKSxmZT0oY3QsZ3QpPT57di5kaXNhYmxlZHx8VS52YWx1ZXx8KFUudmFsdWU9IVUudmFsdWUsY2UmJmNlLnJhZGlvQ2hhbmdlKGN0LEllKSl9O3BlJiYocGUuYWRkSGFuZGxlcihmZSksUC5vbkJlZm9yZVVubW91bnQoKCk9PntwZS5yZW1vdmVIYW5kbGVyKGZlKX0pKSx3cih2LHsibGFiZWwtY2xpY2siOmZlfSksUC53YXRjaChbKCk9PnYuY2hlY2tlZCwoKT0+di52YWx1ZV0sKFtjdCxndF0pPT57VS52YWx1ZT1jdCxaLnZhbHVlPWd0fSk7bGV0IENlPSgpPT57aWYoIXguZGVmYXVsdClyZXR1cm5bXTtsZXQgY3Q9eC5kZWZhdWx0KCk7cmV0dXJuIGN0Lmxlbmd0aD09PTEmJmN0WzBdLnR5cGU9PT1UZXh0P1tKbihjdFswXS5jaGlsZHJlbix7Y2xhc3M6InVuaS1yYWRpby1zbG90In0pXTpjdH07cmV0dXJuKCk9PntsZXR7ZGlzYWJsZWQ6Y3R9PXY7cmV0dXJuIFAuY3JlYXRlVk5vZGUoImRpdiIsUC5tZXJnZVByb3BzKHtyZWY6JH0se2RhdGFVbmNUeXBlOiJ1bmktcmFkaW8ifSx7b25DbGljazpmZSxjbGFzczoidW5pLXJhZGlvIn0pLFtQLmNyZWF0ZVZOb2RlKCJkaXYiLHtzdHlsZTpxLnZhbHVlLGNsYXNzOlsidW5pLXJhZGlvLWlucHV0Iix7InVuaS1yYWRpby1pbnB1dC1kaXNhYmxlZCI6Y3R9XX0sW1UudmFsdWU/Sm4oIlx1RUEwOCIse2NsYXNzOiJ1bmktcmFkaW8taW5wdXQtaWNvbiJ9KTpudWxsXSksLi4uQ2UoKV0pfX19KTtmdW5jdGlvbiB2dCh2LHgsJCl7bGV0IFU9UC5jb21wdXRlZCh7Z2V0OigpPT4oe3JhZGlvQ2hlY2tlZDpCb29sZWFuKHYudmFsdWUpLHZhbHVlOngudmFsdWV9KSxzZXQ6KHtyYWRpb0NoZWNrZWQ6cGV9KT0+e3YudmFsdWU9cGV9fSksWj17cmVzZXQ6JH0scT1QLmluamVjdChRLCExKTtxJiZxLmFkZEZpZWxkKFUpO2xldCB0ZT1QLmluamVjdChyaSwhMSk7dGUmJnRlLmFkZEZpZWxkKFopO2xldCBjZT1QLmluamVjdChXbiwhMSk7cmV0dXJuIFAub25CZWZvcmVVbm1vdW50KCgpPT57cSYmcS5yZW1vdmVGaWVsZChVKSx0ZSYmdGUucmVtb3ZlRmllbGQoWil9KSx7dW5pQ2hlY2tHcm91cDpxLHVuaUZvcm06dGUsdW5pTGFiZWw6Y2UsZmllbGQ6VX19bGV0IGt0PVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJSYWRpb0dyb3VwIixwcm9wczpoZSxlbWl0czpbImNoYW5nZSJdLHNldHVwKHYse3Nsb3RzOngsZW1pdDokfSl7bGV0IFU9UC5yZWYobnVsbCksWj1LbihVLCQpO3JldHVybiBYKHYsWiksKCk9PlAuY3JlYXRlVk5vZGUoImRpdiIse3JlZjpVfSxbeC5kZWZhdWx0JiZ4LmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIFgodix4KXtsZXQgJD1bXTtQLm9uTW91bnRlZCgoKT0+e2NlKCQubGVuZ3RoLTEpfSk7bGV0IFU9KCk9Pnt2YXIgcGU7cmV0dXJuKHBlPSQuZmluZChJZT0+SWUudmFsdWUucmFkaW9DaGVja2VkKSk9PW51bGw/dm9pZCAwOnBlLnZhbHVlLnZhbHVlfTtQLnByb3ZpZGUoUSx7YWRkRmllbGQocGUpeyQucHVzaChwZSl9LHJlbW92ZUZpZWxkKHBlKXskLnNwbGljZSgkLmluZGV4T2YocGUpLDEpfSxyYWRpb0NoYW5nZShwZSxJZSl7bGV0IGZlPSQuaW5kZXhPZihJZSk7Y2UoZmUsITApLHgoImNoYW5nZSIse3ZhbHVlOlUoKX0pfX0pO2xldCBaPVAuaW5qZWN0KHJpLCExKSxxPXtzdWJtaXQ6KCk9PntsZXQgcGU9WyIiLG51bGxdO3JldHVybiB2Lm5hbWUhPT0iIiYmKHBlWzBdPXYubmFtZSxwZVsxXT1VKCkpLHBlfX07WiYmKFouYWRkRmllbGQocSksUC5vbkJlZm9yZVVubW91bnQoKCk9PntaLnJlbW92ZUZpZWxkKHEpfSkpO2Z1bmN0aW9uIHRlKHBlLEllKXtwZS52YWx1ZT17cmFkaW9DaGVja2VkOkllLHZhbHVlOnBlLnZhbHVlLnZhbHVlfX1mdW5jdGlvbiBjZShwZSxJZSl7JC5mb3JFYWNoKChmZSxDZSk9PntDZSE9PXBlJiZJZSYmdGUoJFtDZV0sITEpfSl9cmV0dXJuICR9bGV0IEs9WyJ1LWlucHV0IiwidS10ZXh0YXJlYSJdLGllPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJGb3JtIixlbWl0czpbInN1Ym1pdCIsInJlc2V0Il0sc2V0dXAoe30se3Nsb3RzOnYsZW1pdDp4fSl7bGV0ICQ9UC5yZWYobnVsbCksVT1LbigkLHgpLFo9W10scTtyZXR1cm4gUC5wcm92aWRlKHJpLHthZGRGaWVsZCh0ZSl7Wi5wdXNoKHRlKX0scmVtb3ZlRmllbGQodGUpe1ouc3BsaWNlKFouaW5kZXhPZih0ZSksMSl9LHN1Ym1pdCh0ZSl7bGV0IGNlPXt9O3EmJnEoY2UpO2xldCBwZT1aLnJlZHVjZSgoSWUsZmUpPT57aWYoZmUuc3VibWl0KXtsZXRbQ2UsY3RdPWZlLnN1Ym1pdCgpO0NlJiYoSWVbQ2VdPWN0KX1yZXR1cm4gSWV9LE9iamVjdC5jcmVhdGUobnVsbCkpO09iamVjdC5hc3NpZ24oY2UscGUpLFUoInN1Ym1pdCIse3ZhbHVlOmNlfSl9LHJlc2V0KHRlKXtxJiZxKCksWi5mb3JFYWNoKGNlPT5jZS5yZXNldCYmY2UucmVzZXQoKSksVSgicmVzZXQiLHRlKX19KSwoKT0+e2xldCB0ZT12LmRlZmF1bHQmJnYuZGVmYXVsdCgpO3JldHVybiBxPU5lKHRlKSxQLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7cmVmOiR9LFt0ZV0pfX19KTtmdW5jdGlvbiBOZSh2KXtsZXQgeD1FLnJlcXVpcmVNb2R1bGUoInBsdXMiKSwkPShVLFopPT57KFp8fHZ8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHEpe0suaW5kZXhPZihTdHJpbmcocS50eXBlKSk+PTAmJnEuZWwmJnEuZWwuYXR0ciYmcS5lbC5hdHRyLm5hbWUmJihVP1VbcS5lbC5hdHRyLm5hbWVdPXguZ2V0VmFsdWUocS5lbC5ub2RlSWQpOnEuZWwuc2V0VmFsdWUoIiIpKSx3dC5pc0FycmF5KHEuY2hpbGRyZW4pJiZxLmNoaWxkcmVuJiZxLmNoaWxkcmVuLmxlbmd0aCYmJChVLHEuY2hpbGRyZW4pfSl9O3JldHVybiAkfWxldCBzdD17dHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc2l6ZTp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDoyM30sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxYdD17c3VjY2VzczoiIzA5YmIwNyIsaW5mbzoiIzEwYWVmZiIsd2FybjoiI2Y3NjI2MCIsd2FpdGluZzoiIzEwYWVmZiIsc2FmZV9zdWNjZXNzOiIjMDliYjA3IixzYWZlX3dhcm46IiNmZmJlMDAiLHN1Y2Nlc3NfY2lyY2xlOiIjMDliYjA3IixzdWNjZXNzX25vX2NpcmNsZToiIzA5YmIwNyIsd2FpdGluZ19jaXJjbGU6IiMxMGFlZmYiLGNpcmNsZToiI2M5YzljOSIsZG93bmxvYWQ6IiMwOWJiMDciLGluZm9fY2lyY2xlOiIjMDliYjA3IixjYW5jZWw6IiNmNDM1MzAiLHNlYXJjaDoiI2IyYjJiMiIsY2xlYXI6IiNiMmIyYjIifSx4bj17c3VjY2VzczoiXHVFQTA2IixpbmZvOiJcdUVBMDMiLHdhcm46Ilx1RUEwQiIsd2FpdGluZzoiXHVFQTA5IixzYWZlX3N1Y2Nlc3M6Ilx1RUEwNCIsc2FmZV93YXJuOiJcdUVBMDUiLHN1Y2Nlc3NfY2lyY2xlOiJcdUVBMDciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiJcdUVBMDgiLHdhaXRpbmdfY2lyY2xlOiJcdUVBMEEiLGNpcmNsZToiXHVFQTAxIixkb3dubG9hZDoiXHVFQTAyIixpbmZvX2NpcmNsZToiXHVFQTBDIixjYW5jZWw6Ilx1RUEwRCIsc2VhcmNoOiJcdUVBMEUiLGNsZWFyOiJcdUVBMEYifSxEbj1beyJ1bmktaWNvbiI6eyIiOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyJ9fX1dLF9yPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJJY29uIixwcm9wczpzdCxzdHlsZXM6RG4sc2V0dXAodix7fSl7cmV0dXJuKCk9PkpuKHhuW3YudHlwZV0se2NsYXNzOiJ1bmktaWNvbiIsc3R5bGU6e2NvbG9yOnYuY29sb3J8fFh0W3YudHlwZV0sZm9udFNpemU6di5zaXplfX0pfX0pLEJyPXtpbmRpY2F0b3JEb3RzOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sdmVydGljYWw6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxhdXRvcGxheTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNpcmN1bGFyOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saW50ZXJ2YWw6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NWUzfSxkdXJhdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo1MDB9LGN1cnJlbnQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0saW5kaWNhdG9yQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6InJnYmEoMCwwLDAsLjMpIn0saW5kaWNhdG9yQWN0aXZlQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDAwMDAifSxwcmV2aW91c01hcmdpbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbmV4dE1hcmdpbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY3VycmVudEl0ZW1JZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc2tpcEhpZGRlbkl0ZW1MYXlvdXQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxkaXNwbGF5TXVsdGlwbGVJdGVtczp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxfSxkaXNhYmxlVG91Y2g6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sbW89RS5jb25maWcuZW52LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk9PT0iYW5kcm9pZCIseG89W3sidW5pLXN3aXBlciI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDoiMTUwcHgifX0sInVuaS1zd2lwZXItc2xpZGVyIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9fSwidW5pLXN3aXBlci1kb3RzIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHJpZ2h0OjAsYm90dG9tOiIxMCIsaGVpZ2h0OiIxMCJ9fX1dLEJvPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJTd2lwZXIiLHByb3BzOkJyLHN0eWxlczp4byxlbWl0czpbImNoYW5nZSIsInRyYW5zaXRpb24iLCJhbmltYXRpb25maW5pc2giXSxzZXR1cCh2LHtzbG90czp4LGVtaXQ6JH0pe2xldCBVPVAucmVmKG51bGwpLFo9W10scT1LbihVLCQpLHRlPUxuKHYpLGNlPVluKHRlLHYsWixxKTtyZXR1cm4gUC53YXRjaChbKCk9PnYuY3VycmVudCwoKT0+di5jdXJyZW50SXRlbUlkXSwoW3BlLEllXSk9PntGbih0ZSx2LFopfSksUC5vbk1vdW50ZWQoKCk9PntmKCgpPT57a24oVS52YWx1ZSkudGhlbigoe3dpZHRoOnBlLGhlaWdodDpJZX0pPT57dGUuc3dpcGVyV2lkdGg9cGUsdGUuc3dpcGVySGVpZ2h0PUllfSl9LDUwKX0pLCgpPT57bGV0IHBlPXguZGVmYXVsdCYmeC5kZWZhdWx0KCkse2luZGljYXRvclN0eWxlOkllLGN1cnJlbnRTeW5jOmZlfT10ZTtyZXR1cm4gWj1taShwZSksUC5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOlUsY2xhc3M6InVuaS1zd2lwZXIifSxbUC5jcmVhdGVWTm9kZSgic2xpZGVyIixQLm1lcmdlUHJvcHMoe2NsYXNzOiJ1bmktc3dpcGVyLXNsaWRlciJ9LHthdXRvUGxheTp2LmF1dG9wbGF5LGludGVydmFsOnYuaW50ZXJ2YWwsaW5kZXg6ZmUsa2VlcEluZGV4OiEwLHNob3dJbmRpY2F0b3JzOnYuaW5kaWNhdG9yRG90cyxpbmZpbml0ZTp2LmNpcmN1bGFyLHZlcnRpY2FsOnYudmVydGljYWwsc2Nyb2xsYWJsZTohdi5kaXNhYmxlVG91Y2h9LGNlKSxbWixQLmNyZWF0ZVZOb2RlKCJpbmRpY2F0b3IiLHtjbGFzczoidW5pLXN3aXBlci1kb3RzIixzdHlsZTpJZX0sbnVsbCldKV0pfX19KTtmdW5jdGlvbiBMbih2KXtsZXQgeD1QLnJlZigwKSwkPVAucmVmKDApLFU9UC5yZWYodi5jdXJyZW50KSxaPVAucmVmKCJhdXRvcGxheSIpLHE9UC5jb21wdXRlZCgoKT0+KHtpdGVtQ29sb3I6di5pbmRpY2F0b3JDb2xvcixpdGVtU2VsZWN0ZWRDb2xvcjp2LmluZGljYXRvckFjdGl2ZUNvbG9yLGl0ZW1TaXplOjgsb3BhY2l0eTp2LmluZGljYXRvckRvdHM/MTowfSkpO3JldHVybiBQLnJlYWN0aXZlKHtzd2lwZXJXaWR0aDp4LHN3aXBlckhlaWdodDokLGluZGljYXRvclN0eWxlOnEsY3VycmVudFN5bmM6VSxjdXJyZW50Q2hhbmdlU291cmNlOlp9KX1mdW5jdGlvbiBZbih2LHgsJCxVKXtsZXQgWj0wLHE9ZmU9PntsZXQgQ2U9ZmUuZGV0YWlsLGN0PXgudmVydGljYWwsZ3Q9KGN0P0NlLm9mZnNldFlSYXRpbzpDZS5vZmZzZXRYUmF0aW8pfHwwO2lmKChmZS5kcmFnfHxmZS5kcmFnKSYmKHYuY3VycmVudENoYW5nZVNvdXJjZT0idG91Y2giKSxndD09PTApe2xldCBIdD1NYXRoLmFicyhaKTtpZihIdD09PTEpcmV0dXJuO0h0Pi41JiYoZ3Q9MSl9Wj1ndCxVKCJ0cmFuc2l0aW9uIix7ZHg6Y3Q/MDotdi5zd2lwZXJXaWR0aCpndCxkeTpjdD8tdi5zd2lwZXJIZWlnaHQqZ3Q6MH0pfSx0ZT1mZT0+e2xldCBDZT0oKT0+e1UoImFuaW1hdGlvbmZpbmlzaCIscGUoKSksdi5jdXJyZW50Q2hhbmdlU291cmNlPSJhdXRvcGxheSJ9O21vP0NlKCk6ZihDZSw1MCl9LGNlPWZlPT57d3QuaXNTdHJpbmcoZmUuZGV0YWlsLnNvdXJjZSkmJih2LmN1cnJlbnRDaGFuZ2VTb3VyY2U9ZmUuZGV0YWlsLnNvdXJjZSksdi5jdXJyZW50U3luYz1mZS5kZXRhaWwuaW5kZXgsWj0wfTtmdW5jdGlvbiBwZSgpe2xldCBmZT1OdW1iZXIodi5jdXJyZW50U3luYyksQ2U9JFtmZV18fHt9LGN0PUNlLmNvbXBvbmVudEluc3RhbmNlJiZDZS5jb21wb25lbnRJbnN0YW5jZS5pdGVtSWR8fCIiO3JldHVybntjdXJyZW50OmZlLGN1cnJlbnRJdGVtSWQ6Y3Qsc291cmNlOnYuY3VycmVudENoYW5nZVNvdXJjZX19cmV0dXJuIFAud2F0Y2goKCk9PnYuY3VycmVudFN5bmMsZmU9PntVKCJjaGFuZ2UiLHBlKCkpfSkse29uU2Nyb2xsOnEsb25TY3JvbGxlbmQ6dGUsb25DaGFuZ2U6Y2V9fWZ1bmN0aW9uIEZuKHYseCwkKXtsZXQgVT0tMTtpZih4LmN1cnJlbnRJdGVtSWQpZm9yKGxldCBaPTAscT0kO1o8cS5sZW5ndGg7WisrKXtsZXQgdGU9cVtaXS5jb21wb25lbnRJbnN0YW5jZTtpZih0ZSYmdGUuaXRlbUlkPT09eC5jdXJyZW50SXRlbUlkKXtVPVo7YnJlYWt9fVU8MCYmKFU9TWF0aC5yb3VuZChOdW1iZXIoeC5jdXJyZW50KSl8fDApLFU9VTwwPzA6VSx2LmN1cnJlbnRTeW5jIT09VSYmKHYuY3VycmVudENoYW5nZVNvdXJjZT0iIix2LmN1cnJlbnRTeW5jPVUpfWxldCB3aT17aXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0saXM9UC5kZWZpbmVDb21wb25lbnQoe25hbWU6IlN3aXBlckl0ZW0iLHByb3BzOndpLHNldHVwKHYse3Nsb3RzOnh9KXtyZXR1cm4oKT0+UC5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zd2lwZXItaXRlbSIsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9fSxbeC5kZWZhdWx0JiZ4LmRlZmF1bHQoKV0pfX0pO3ZhciBoYT0vXjwoWy1BLVphLXowLTlfXSspKCg/OlxzK1thLXpBLVpfOl1bLWEtekEtWjAtOV86Ll0qKD86XHMqPVxzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccyooXC8/KT4vLGJyPS9ePFwvKFstQS1aYS16MC05X10rKVtePl0qPi8sVGE9LyhbYS16QS1aXzpdWy1hLXpBLVowLTlfOi5dKikoPzpccyo9XHMqKD86KD86IigoPzpcXC58W14iXSkqKSIpfCg/OicoKD86XFwufFteJ10pKiknKXwoW14+XHNdKykpKT8vZyxMYT1NbygiYXJlYSxiYXNlLGJhc2Vmb250LGJyLGNvbCxmcmFtZSxocixpbWcsaW5wdXQsbGluayxtZXRhLHBhcmFtLGVtYmVkLGNvbW1hbmQsa2V5Z2VuLHNvdXJjZSx0cmFjayx3YnIiKSxGYT1NbygiYSxhZGRyZXNzLGFydGljbGUsYXBwbGV0LGFzaWRlLGF1ZGlvLGJsb2NrcXVvdGUsYnV0dG9uLGNhbnZhcyxjZW50ZXIsZGQsZGVsLGRpcixkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sZnJhbWVzZXQsaDEsaDIsaDMsaDQsaDUsaDYsaGVhZGVyLGhncm91cCxocixpZnJhbWUsaXNpbmRleCxsaSxtYXAsbWVudSxub2ZyYW1lcyxub3NjcmlwdCxvYmplY3Qsb2wsb3V0cHV0LHAscHJlLHNlY3Rpb24sc2NyaXB0LHRhYmxlLHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRyLHVsLHZpZGVvIiksVmE9TW8oImFiYnIsYWNyb255bSxhcHBsZXQsYixiYXNlZm9udCxiZG8sYmlnLGJyLGJ1dHRvbixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaWZyYW1lLGltZyxpbnB1dCxpbnMsa2JkLGxhYmVsLG1hcCxvYmplY3QscSxzLHNhbXAsc2NyaXB0LHNlbGVjdCxzbWFsbCxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0ZXh0YXJlYSx0dCx1LHZhciIpLFVhPU1vKCJjb2xncm91cCxkZCxkdCxsaSxvcHRpb25zLHAsdGQsdGZvb3QsdGgsdGhlYWQsdHIiKSxnYT1NbygiY2hlY2tlZCxjb21wYWN0LGRlY2xhcmUsZGVmZXIsZGlzYWJsZWQsaXNtYXAsbXVsdGlwbGUsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm93cmFwLHJlYWRvbmx5LHNlbGVjdGVkIiksUGE9TW8oInNjcmlwdCxzdHlsZSIpO2Z1bmN0aW9uIFZuKHYseCl7dmFyICQsVSxaLHE9W10sdGU9djtmb3IocS5sYXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgtMV19O3Y7KXtpZihVPSEwLCFxLmxhc3QoKXx8IVBhW3EubGFzdCgpXSl7aWYodi5pbmRleE9mKCI8IS0tIik9PTA/KCQ9di5pbmRleE9mKCItLT4iKSwkPj0wJiYoeC5jb21tZW50JiZ4LmNvbW1lbnQodi5zdWJzdHJpbmcoNCwkKSksdj12LnN1YnN0cmluZygkKzMpLFU9ITEpKTp2LmluZGV4T2YoIjwvIik9PTA/KFo9di5tYXRjaChiciksWiYmKHY9di5zdWJzdHJpbmcoWlswXS5sZW5ndGgpLFpbMF0ucmVwbGFjZShicixJZSksVT0hMSkpOnYuaW5kZXhPZigiPCIpPT0wJiYoWj12Lm1hdGNoKGhhKSxaJiYodj12LnN1YnN0cmluZyhaWzBdLmxlbmd0aCksWlswXS5yZXBsYWNlKGhhLHBlKSxVPSExKSksVSl7JD12LmluZGV4T2YoIjwiKTt2YXIgY2U9JDwwP3Y6di5zdWJzdHJpbmcoMCwkKTt2PSQ8MD8iIjp2LnN1YnN0cmluZygkKSx4LmNoYXJzJiZ4LmNoYXJzKGNlKX19ZWxzZSB2PXYucmVwbGFjZShuZXcgUmVnRXhwKCIoW1xcc1xcU10qPyk8LyIrcS5sYXN0KCkrIltePl0qPiIpLGZ1bmN0aW9uKGZlLENlKXtyZXR1cm4gQ2U9Q2UucmVwbGFjZSgvPCEtLShbXHNcU10qPyktLT58PCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csIiQxJDIiKSx4LmNoYXJzJiZ4LmNoYXJzKENlKSwiIn0pLEllKCIiLHEubGFzdCgpKTtpZih2PT10ZSl0aHJvdyJQYXJzZSBFcnJvcjogIit2O3RlPXZ9SWUoKTtmdW5jdGlvbiBwZShmZSxDZSxjdCxndCl7aWYoQ2U9Q2UudG9Mb3dlckNhc2UoKSxGYVtDZV0pZm9yKDtxLmxhc3QoKSYmVmFbcS5sYXN0KCldOylJZSgiIixxLmxhc3QoKSk7aWYoVWFbQ2VdJiZxLmxhc3QoKT09Q2UmJkllKCIiLENlKSxndD1MYVtDZV18fCEhZ3QsZ3R8fHEucHVzaChDZSkseC5zdGFydCl7dmFyIEh0PVtdO2N0LnJlcGxhY2UoVGEsZnVuY3Rpb24oeXQsamUpe3ZhciBNdD1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOmFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTpnYVtqZV0/amU6IiI7SHQucHVzaCh7bmFtZTpqZSx2YWx1ZTpNdCxlc2NhcGVkOk10LnJlcGxhY2UoLyhefFteXFxdKSIvZywnJDFcXCInKX0pfSkseC5zdGFydCYmeC5zdGFydChDZSxIdCxndCl9fWZ1bmN0aW9uIEllKGZlLENlKXtpZihDZSlmb3IodmFyIGN0PXEubGVuZ3RoLTE7Y3Q+PTAmJnFbY3RdIT1DZTtjdC0tKTtlbHNlIHZhciBjdD0wO2lmKGN0Pj0wKXtmb3IodmFyIGd0PXEubGVuZ3RoLTE7Z3Q+PWN0O2d0LS0peC5lbmQmJnguZW5kKHFbZ3RdKTtxLmxlbmd0aD1jdH19fWZ1bmN0aW9uIE1vKHYpe2Zvcih2YXIgeD17fSwkPXYuc3BsaXQoIiwiKSxVPTA7VTwkLmxlbmd0aDtVKyspeFskW1VdXT0hMDtyZXR1cm4geH1mdW5jdGlvbiBlYSh2KXtyZXR1cm4gdi5yZXBsYWNlKC88XD94bWwuKlw/PlxuLywiIikucmVwbGFjZSgvPCFkb2N0eXBlLio+XG4vLCIiKS5yZXBsYWNlKC88IURPQ1RZUEUuKj5cbi8sIiIpfWZ1bmN0aW9uIFdpKHYpe3JldHVybiB2LnJlZHVjZShmdW5jdGlvbih4LCQpe2xldCBVPSQudmFsdWUsWj0kLm5hbWU7cmV0dXJuIFUubWF0Y2goLyAvKSYmWyJzdHlsZSIsInNyYyJdLmluZGV4T2YoWik9PT0tMSYmKFU9VS5zcGxpdCgiICIpKSx4W1pdP0FycmF5LmlzQXJyYXkoeFtaXSk/eFtaXS5wdXNoKFUpOnhbWl09W3hbWl0sVV06eFtaXT1VLHh9LHt9KX1mdW5jdGlvbiBvcyh2KXt2PWVhKHYpO2xldCB4PVtdLCQ9e25vZGU6InJvb3QiLGNoaWxkcmVuOltdfTtyZXR1cm4gVm4odix7c3RhcnQ6ZnVuY3Rpb24oVSxaLHEpe2xldCB0ZT17bmFtZTpVfTtpZihaLmxlbmd0aCE9PTAmJih0ZS5hdHRycz1XaShaKSkscSl7bGV0IGNlPXhbMF18fCQ7Y2UuY2hpbGRyZW58fChjZS5jaGlsZHJlbj1bXSksY2UuY2hpbGRyZW4ucHVzaCh0ZSl9ZWxzZSB4LnVuc2hpZnQodGUpfSxlbmQ6ZnVuY3Rpb24oVSl7bGV0IFo9eC5zaGlmdCgpO2lmKFoubmFtZSE9PVUmJmNvbnNvbGUuZXJyb3IoImludmFsaWQgc3RhdGU6IG1pc21hdGNoIGVuZCB0YWciKSx4Lmxlbmd0aD09PTApJC5jaGlsZHJlbi5wdXNoKFopO2Vsc2V7bGV0IHE9eFswXTtxLmNoaWxkcmVufHwocS5jaGlsZHJlbj1bXSkscS5jaGlsZHJlbi5wdXNoKFopfX0sY2hhcnM6ZnVuY3Rpb24oVSl7bGV0IFo9e3R5cGU6InRleHQiLHRleHQ6VX07aWYoeC5sZW5ndGg9PT0wKSQuY2hpbGRyZW4ucHVzaChaKTtlbHNle2xldCBxPXhbMF07cS5jaGlsZHJlbnx8KHEuY2hpbGRyZW49W10pLHEuY2hpbGRyZW4ucHVzaChaKX19LGNvbW1lbnQ6ZnVuY3Rpb24oVSl7bGV0IFo9e25vZGU6ImNvbW1lbnQiLHRleHQ6VX0scT14WzBdO3EuY2hpbGRyZW58fChxLmNoaWxkcmVuPVtdKSxxLmNoaWxkcmVuLnB1c2goWil9fSksJC5jaGlsZHJlbn1sZXQgYXM9e25vZGVzOnt0eXBlOltBcnJheSxTdHJpbmddLGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxEbz0xNixzcz1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUmljaFRleHQiLHByb3BzOmFzLHNldHVwKHYpe2xldCB4PVAuZ2V0Q3VycmVudEluc3RhbmNlKCk7cmV0dXJuKCk9PntsZXQgJD12Lm5vZGVzO3JldHVybiB3dC5pc1N0cmluZygkKSYmKCQ9b3MoJCkpLFAuY3JlYXRlVk5vZGUoInUtcmljaC10ZXh0Iix7dmFsdWU6aW8oJHx8W10seC5yb290LHtkZWZhdWx0Rm9udFNpemU6RG99KX0sbnVsbCl9fX0pO2Z1bmN0aW9uIGlvKHYseCwkKXtsZXQgVT1bInNwYW4iLCJhIiwiaW1hZ2UiLCJpbWciXSxaPXtibG9ja3F1b3RlOkNlLGJyOnl0LGRpdjpDZSxkbDpDZSxoMTpndCgyKSxoMjpndCgxLjUpLGgzOmd0KDEuMTcpLGg0Omd0KDEpLGg1Omd0KC44MyksaDY6Z3QoLjY3KSxocjpDZSxvbDpDZSxwOkNlLHN0cm9uZzpIdCx0YWJsZTpDZSx0Ym9keTpDZSx0Zm9vdDpDZSx0aGVhZDpDZSx1bDpDZX0scT0vJihhbXB8Z3R8bHR8bmJzcHxxdW90fGFwb3MpOy9nLHRlPXthbXA6IiYiLGd0OiI+IixsdDoiPCIsbmJzcDoiICIscXVvdDonIicsYXBvczoiJyJ9LGNlPXt0eXBlOiJzcGFuIixfX3R5cGU6ImJyZWFrIixhdHRyOnt2YWx1ZTpgCmB9fSxwZT17X19ibG9jazohMCxfX2JyZWFrOiEwLGNoaWxkcmVuOltdfSxJZT1udWxsO2Z1bmN0aW9uIGZlKGR0KXtsZXQgZW49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihkdC5hdHRycyl7bGV0IEJuPShkdC5hdHRycy5jbGFzc3x8IiIpLnNwbGl0KCIgIik7T2JqZWN0LmFzc2lnbihlbixQLnBhcnNlQ2xhc3NMaXN0KEJuLHgpLHVvKGR0LmF0dHJzLnN0eWxlfHwiIikpfWlmKGR0Lm5hbWU9PT0iaW1nInx8ZHQubmFtZT09PSJpbWFnZSIpe2xldCBCbj1kdC5hdHRycztlbi53aWR0aD1lbi53aWR0aHx8Qm4ud2lkdGgsZW4uaGVpZ2h0PWVuLmhlaWdodHx8Qm4uaGVpZ2h0fXJldHVybiBlbn1mdW5jdGlvbiBDZShkdCl7cmV0dXJuIGR0Ll9fYmxvY2s9ITAsZHR9ZnVuY3Rpb24gY3QoZHQsZW4pe3JldHVybiBkdC5zdHlsZSYmIWR0LnN0eWxlLmZvbnRTaXplJiYoZHQuc3R5bGUuZm9udFNpemU9JC5kZWZhdWx0Rm9udFNpemUqZW4pLENlKEh0KGR0KSl9ZnVuY3Rpb24gZ3QoZHQpe3JldHVybiBmdW5jdGlvbihlbil7cmV0dXJuIGN0KGVuLGR0KX19ZnVuY3Rpb24gSHQoZHQpe3JldHVybiBkdC5zdHlsZSYmIWR0LnN0eWxlLmZvbnRXZWlnaHQmJihkdC5zdHlsZS5mb250V2VpZ2h0PSJib2xkIiksZHR9ZnVuY3Rpb24geXQoZHQpe3JldHVybiBkdC5fX3ZhbHVlPSIgIixDZShkdCl9ZnVuY3Rpb24gamUoZHQpe3JldHVybiBkdC5yZXBsYWNlKHEsZnVuY3Rpb24oZW4sQm4pe3JldHVybiB0ZVtCbl19KX1mdW5jdGlvbiBNdChkdCl7bGV0IGVuPShkdC5uYW1lfHwiIikudG9Mb3dlckNhc2UoKSxCbj1lbixZdD1aW2VuXTtVLmluZGV4T2YoZW4pPT09LTEmJihlbj0ic3BhbiIpLGVuPT09ImltZyImJihlbj0iaW1hZ2UiKTtsZXQganQ9e3R5cGU6ZW4sX190eXBlOkJuLGF0dHI6T2JqZWN0LmNyZWF0ZShudWxsKX07cmV0dXJuKGR0LnR5cGU9PT0idGV4dCJ8fGR0LnRleHQpJiYoanQuX192YWx1ZT1qdC5hdHRyLnZhbHVlPWplKChkdC50ZXh0fHwiIikudHJpbSgpKSksZHQuYXR0cnMmJk9iamVjdC5rZXlzKGR0LmF0dHJzKS5mb3JFYWNoKFV0PT57VXQhPT0iY2xhc3MiJiZVdCE9PSJzdHlsZSImJihqdC5hdHRyW1V0XT1kdC5hdHRyc1tVdF0pfSksanQuc3R5bGU9ZmUoZHQpLFl0JiZZdChqdCksKHBlLl9fYmxvY2t8fGp0Ll9fYmxvY2spJiYoSWV8fChwZS5jaGlsZHJlbi5wdXNoKGNlKSxJZT1bcGUsY2VdKSkscGU9anQsKHBlLl9fdmFsdWV8fHBlLnR5cGU9PT0iaW1hZ2UiJiZwZS5hdHRyLnNyYykmJihJZT1udWxsKSxqdC5jaGlsZHJlbj1kbihkdC5jaGlsZHJlbikscGU9anQscGUuX19ibG9jayYmcGUuc3R5bGUuaGVpZ2h0JiYhL14wKHB4KT8kLy50ZXN0KHBlLnN0eWxlLmhlaWdodCkmJihJZT1udWxsKSxqdH1mdW5jdGlvbiBkbihkdCl7cmV0dXJuIHd0LmlzQXJyYXkoZHQpP2R0Lm1hcChlbj0+TXQoZW4pKTpbXX1sZXQgR3Q9ZG4odik7aWYoSWUpe2xldFtkdCxlbl09SWUsQm49ZHQuY2hpbGRyZW4sWXQ9Qm4uaW5kZXhPZihlbik7Qm4uc3BsaWNlKFl0LDEpfXJldHVybiBHdH1sZXQgc2k9e307ZnVuY3Rpb24gQ2kodix4LCQpe2xldHthZHBpZDpVLHdpZHRoOlp9PXYscT1VKyItIitaLHRlPXNpW3FdO2lmKHRlJiZ0ZS5sZW5ndGg+MCl7eCh0ZS5zcGxpY2UoMCwxKVswXSk7cmV0dXJufWguYWQuZ2V0QWRzKHYsY2U9PntsZXQgcGU9Y2UuYWRzO3gocGUuc3BsaWNlKDAsMSlbMF0pLHNpW3FdPXRlP3RlLmNvbmNhdChwZSk6cGV9LGNlPT57JCh7ZXJyQ29kZTpjZS5jb2RlLGVyck1zZzpjZS5tZXNzYWdlfSl9KX1sZXQgR2k9e2FkcGlkOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OiIifSxkYXRhOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSx3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY2hhbm5lbDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGxpPXtsb2FkOiJsb2FkIixjbG9zZToiY2xvc2UiLGVycm9yOiJlcnJvciIsZG93bmxvYWRjaGFuZ2U6ImRvd25sb2FkY2hhbmdlIn0sdXI9UC5kZWZpbmVDb21wb25lbnQoe25hbWU6IkFkIixwcm9wczpHaSxlbWl0czpbbGkubG9hZCxsaS5jbG9zZSxsaS5lcnJvcixsaS5kb3dubG9hZGNoYW5nZV0sc2V0dXAodix7ZW1pdDp4fSl7bGV0ICQ9UC5yZWYobnVsbCksVT1LbigkLHgpLFo9bHIoKTtQLndhdGNoKCgpPT52LmFkcGlkLHRlPT57JGEoWix2LFUpfSksUC53YXRjaCgoKT0+di5kYXRhLHRlPT57Wi5kYXRhPXRlfSksUC5vbk1vdW50ZWQoKCk9PntmKCgpPT57a24oJC52YWx1ZSkudGhlbigoe3dpZHRoOnRlfSk9PntaLndpZHRoPXRlPT09MD8tMTp0ZSwkYShaLHYsVSl9KX0sNTApfSk7bGV0IHE9e29uRG93bmxvYWRjaGFuZ2UodGUpe1UobGkuZG93bmxvYWRjaGFuZ2UsdGUpfSxvbkRpc2xpa2UodGUpe1UobGkuY2xvc2UsdGUpfX07cmV0dXJuKCk9PlAuY3JlYXRlVk5vZGUoInUtYWQiLFAubWVyZ2VQcm9wcyh7cmVmOiR9LHtkYXRhOlouZGF0YSxyZW5kZXJpbmc6ITB9LHEpLG51bGwpfX0pO2Z1bmN0aW9uIGxyKHYpe2xldCB4PVAucmVmKCIiKTtyZXR1cm4gUC5yZWFjdGl2ZSh7d2lkdGg6MCxkYXRhOnh9KX1mdW5jdGlvbiAkYSh2LHgsJCl7Q2koe2FkcGlkOnguYWRwaWQsd2lkdGg6di53aWR0aH0sVT0+e3YuZGF0YT1VLCQobGkubG9hZCx7fSl9LFU9PnskKGxpLmVycm9yLFUpfSl9bGV0IEhhPXt9O2Z1bmN0aW9uIFlpKHYseCwkLFUsWil7bGV0IHE9disiLSIreCx0ZT1IYVtxXTtpZih0ZSYmdGUubGVuZ3RoPjApe1UodGUuc3BsaWNlKDAsMSlbMF0pO3JldHVybn1oLmFkLmdldERyYXdBZHMoe2FkcGlkOlN0cmluZyh2KSxjb3VudDozLHdpZHRoOnh9LGNlPT57bGV0IHBlPWNlLmFkcztVKHBlLnNwbGljZSgwLDEpWzBdKSxIYVtxXT10ZT90ZS5jb25jYXQocGUpOnBlfSxjZT0+e1ooe2VyckNvZGU6Y2UuY29kZSxlcnJNc2c6Y2UubWVzc2FnZX0pfSl9bGV0IG9vPXthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sd2lkdGg6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxhbz17bG9hZDoibG9hZCIsY2xvc2U6ImNsb3NlIixlcnJvcjoiZXJyb3IifSxscz1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQWREcmF3Iixwcm9wczpvbyxlbWl0czpbYW8ubG9hZCxhby5jbG9zZSxhby5lcnJvcl0sc2V0dXAodix7ZW1pdDp4fSl7bGV0ICQ9UC5yZWYobnVsbCksVT1LbigkLHgpLFo9cGEoKTtQLndhdGNoKCgpPT52LmFkcGlkLHRlPT57TG8oWix2LFUpfSksUC53YXRjaCgoKT0+di5kYXRhLHRlPT57Wi5kYXRhPXRlfSk7bGV0IHE9e29uRGlzbGlrZSh0ZSl7VShhby5jbG9zZSx0ZSl9fTtyZXR1cm4gUC5vbk1vdW50ZWQoKCk9PntmKCgpPT57a24oJC52YWx1ZSkudGhlbigoe3dpZHRoOnRlLGhlaWdodDpjZX0pPT57Wi53aWR0aD10ZT09PTA/LTE6dGUsWi5oZWlnaHQ9Y2U9PT0wPy0xOmNlLExvKFosdixVKX0pfSw1MCl9KSwoKT0+e2xldHtkYXRhOnRlfT1aO3JldHVybiBQLmNyZWF0ZVZOb2RlKCJ1LWFkLWRyYXciLFAubWVyZ2VQcm9wcyh7cmVmOiR9LHtkYXRhOnRlLHJlbmRlcmluZzohMH0scSksbnVsbCl9fX0pO2Z1bmN0aW9uIHBhKHYpe2xldCB4PVAucmVmKCIiKTtyZXR1cm4gUC5yZWFjdGl2ZSh7d2lkdGg6MCxoZWlnaHQ6MCxkYXRhOnh9KX1mdW5jdGlvbiBMbyh2LHgsJCl7WWkoeC5hZHBpZCx2LndpZHRoLHYuaGVpZ2h0LFU9Pnt2LmRhdGE9VSwkKGFvLmxvYWQse30pfSxVPT57JChhby5lcnJvcixVKX0pfXJldHVybntOYXZpZ2F0b3I6cGksTGFiZWw6Z24sQnV0dG9uOk9vLE1vdmFibGVBcmVhOkNyLE1vdmFibGVWaWV3OkFyLFByb2dyZXNzOl9pLFBpY2tlclZpZXc6VHIsUGlja2VyVmlld0NvbHVtbjpqaSxQaWNrZXI6ZXIsVVNsaWRlcjpucixTd2l0Y2g6anIsQ2hlY2tib3g6dm8sQ2hlY2tib3hHcm91cDp6aSxSYWRpbzpkZSxSYWRpb0dyb3VwOmt0LEZvcm06aWUsSWNvbjpfcixTd2lwZXI6Qm8sU3dpcGVySXRlbTppcyxSaWNoVGV4dDpzcyxBZDp1cixBZERyYXc6bHN9fShOLEZlLEl0KTtyZXR1cm4gT3R9ZnVuY3Rpb24gVEkoZixzKXtsZXR7VW5pU2hhcmVkOnAsVnVlOnd9PXM7ZnVuY3Rpb24gTihoLHksUil7bGV0IEZlPWguJFt5XTtyZXR1cm4gRmUmJnAuaW52b2tlQXJyYXlGbnMoRmUsUil9bGV0IEU9Zi5zZXR1cDtyZXR1cm4gZi5pbmhlcml0QXR0cnM9ITEsZi5zZXR1cD0oaCx5KT0+e2xldHthdHRyczp7X19wYWdlSWQ6UixfX3BhZ2VQYXRoOkZlLF9fcGFnZVF1ZXJ5Okl0fX09eSxWdD1zLl9fdW5pUm91dGVzLmZpbmQod3Q9Pnd0Lm1ldGEucm91dGU9PT1GZSksT3Q9dy5nZXRDdXJyZW50SW5zdGFuY2UoKSxQPU90LnByb3h5O2lmKFZ0JiYoVnQubWV0YS5pc1N1Yk5WdWV8fFBJKFAscyx7X19wYWdlSWQ6UixfX3BhZ2VQYXRoOkZlfSkpLHcub25Nb3VudGVkKCgpPT57dy5uZXh0VGljaygoKT0+e04oUCxwLk9OX1JFQURZKX0pLE90Lm9uUGFnZVNjcm9sbCYmUC4kZWwuYWRkRXZlbnQoInNjcm9sbCIsd3Q9Pnt3dC5zY3JvbGxUb3A9d3QuZGV0YWlsLnNjcm9sbFRvcCxOKFAscC5PTl9QQUdFX1NDUk9MTCx3dCl9KSxPdC5vblJlYWNoQm90dG9tJiZQLiRlbC5hZGRFdmVudCgic2Nyb2xsdG9sb3dlciIsd3Q9PntOKFAscC5PTl9SRUFDSF9CT1RUT00sd3QpfSl9KSx3Lm9uQmVmb3JlVW5tb3VudCgoKT0+e04oUCxwLk9OX1VOTE9BRCl9KSxFKXJldHVybiBFKEl0LHkpfSxmfWZ1bmN0aW9uIFBJKGYscyx7X19wYWdlSWQ6cCxfX3BhZ2VQYXRoOnd9KXtsZXQgTj1zLmdldEN1cnJlbnRQYWdlcygpLEU9TltOLmxlbmd0aC0xXTtpZihFJiZFLl9fc2V0dXApRS5fX3NldHVwKGYsRSk7ZWxzZXtsZXQgaD0iLyIrdztyZXR1cm4gcy5fX3JlZ2lzdGVyUGFnZSh7dXJsOmgscGF0aDpoLHF1ZXJ5Ont9LG9wZW5UeXBlOiJsYXVuY2giLHdlYnZpZXc6e2lkOnArIiJ9LG52dWVQYWdlVm06Zn0pfX12YXIgTWw9e30sa3A7ZnVuY3Rpb24gUnAoZil7a3A9Zn12YXIgdHU7ZnVuY3Rpb24gSUkoZil7aWYodHUpcmV0dXJuIHR1O2xldCBzPW5ldyBmLkVtaXR0ZXI7cmV0dXJuIHR1PXtvbihwLHcpe3JldHVybiBzLm9uKHAsdyl9LG9uY2UocCx3KXtyZXR1cm4gcy5vbmNlKHAsdyl9LG9mZihwLHcpe3JldHVybiBzLm9mZihwLHcpfSxlbWl0KHAsLi4udyl7cmV0dXJuIHMuZW1pdChwLC4uLncpfX0sdHV9ZnVuY3Rpb24gTkkoZil7cmV0dXJuKHMscCx3KT0+e2xldHtudnVlOk59PXAsRT1ldShmLHApO3AuVnVlPUUsTWxbc109e2luc3RhbmNlSWQ6cyxjb25maWc6Ti5jb25maWcsZG9jdW1lbnQ6Ti5kb2N1bWVudCxkYXRhOnd9O2xldHtjcmVhdGVBcHA6aH09RTtFLmNyZWF0ZVZ1ZUFwcD1FLmNyZWF0ZUFwcD0oeSxSKT0+KHAuX191bmlDb25maWcuc3R5bGVzPXkuc3R5bGVzfHxbXSxoKHksUikudXNlKGtJLHMscCkpLEUuY3JlYXRlUGFnZUFwcD0oeSxSKT0+e1RJKHkscCk7bGV0IEZlPVIuJHN0b3JlO2RlbGV0ZSBSLiRzdG9yZTtsZXQgSXQ9aCh5LFIpO3JldHVybiBGZSYmSXQudXNlKEZlKSxJdC51c2UoeEksRSxzLHApfX19dmFyIGtJPXtpbnN0YWxsKGYscyxwKXtkYyhwKS5pbml0QXBwKGYpLFJJKGYscyxwKX19O2Z1bmN0aW9uIFJJKGYscyxwKXtsZXR7bW91bnQ6d309ZixOPU1sW3NdO3JldHVybiBmLm1vdW50PUU9PntsZXQgaD1FPT09IiNhcHAiLHk9Ti5hcHA9dyh4cChOLmRvY3VtZW50LHtpc1Jvb3Q6aH0pKTtyZXR1cm4gaCYmcC5fX3JlZ2lzdGVyQXBwKHkpLHl9LGZ9dmFyIHhJPXtpbnN0YWxsKGYscyxwLHcpe2xldHt3ZWV4Ok4scGx1czpFLEJyb2FkY2FzdENoYW5uZWw6aCxWdWVTaGFyZWQ6eSxVbmlTaGFyZWQ6UixnZXRDdXJyZW50UGFnZXM6RmUsc2V0VGltZW91dDpJdCxjbGVhclRpbWVvdXQ6VnQsX191bmlDb25maWc6T3R9PXc7Zi5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kcmVxdWlyZU5hdGl2ZVBsdWdpbj1OLnJlcXVpcmVNb2R1bGU7bGV0IFA9T0koe3VuaTprcCxWdWU6cyx3ZWV4Ok4scGx1czpFLEJyb2FkY2FzdENoYW5uZWw6aCxVbmlWaWV3SlNCcmlkZ2U6SUkoUiksVnVlU2hhcmVkOnksVW5pU2hhcmVkOlIsZ2V0Q3VycmVudFBhZ2VzOkZlLHNldFRpbWVvdXQ6SXQsY2xlYXJUaW1lb3V0OlZ0LF9fdW5pQ29uZmlnOk90fSk7T2JqZWN0LmtleXMoUCkuZm9yRWFjaCh3dD0+e2YuY29tcG9uZW50KHMuaHlwaGVuYXRlKHd0KSxQW3d0XSl9KSxkYyh3KS5pbml0QXBwKGYpLEJJKGYscCx3KX19O2Z1bmN0aW9uIEJJKGYscyx7bnZ1ZTpwfSl7bGV0e2NvbmZpZzp7Y29tcGlsZXJPcHRpb25zOnd9LG1vdW50Ok59PWY7dy5pc0N1c3RvbUVsZW1lbnQ9aD0+ISFwLnN1cHBvcnRzKGBAY29tcG9uZW50LyR7aH1gKTtsZXQgRT1NbFtzXTtyZXR1cm4gZi5tb3VudD1oPT57bGV0IHk9aD09PSIjcm9vdCIsUj1FLmFwcD1OKHhwKEUuZG9jdW1lbnQse2lzUm9vdDp5fSkpO2lmKHkpdHJ5e3AuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUZpbmlzaCJ9LFtdKX1jYXRjaChGZSl7fXJldHVybiBSfSxmfWZ1bmN0aW9uIHhwKGYse2lzUm9vdDpzfSl7aWYocylyZXR1cm4gZi5kb2N1bWVudEVsZW1lbnQ7bGV0IHA9Zi5jcmVhdGVDb21tZW50KCJyb290Iik7cmV0dXJuIGYuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHApLHB9ZnVuY3Rpb24gQnAoZil7bGV0IHM9TWxbZl07aWYocyYmcy5hcHAmJnMuZG9jdW1lbnQpe3RyeXtzLmFwcC4kLmFwcENvbnRleHQuYXBwLnVubW91bnQoKSxzLmRvY3VtZW50LmRlc3Ryb3koKX1jYXRjaChwKXt9ZGVsZXRlIHMuZG9jdW1lbnQsZGVsZXRlIHMuYXBwfWRlbGV0ZSBNbFtmXX1mdW5jdGlvbiBNcChmKXtsZXQgcz1NbFtmXTtpZighc3x8IXMuYXBwKXJldHVybiBuZXcgRXJyb3IoYHJlZnJlc2hJbnN0YW5jZTogaW5zdGFuY2UgJHtmfSBub3QgZm91bmQhYCk7cy5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoicmVmcmVzaEZpbmlzaCJ9LFtdKX1mdW5jdGlvbiBNSShmLHMpe2xldHtVbmlTaGFyZWQ6cCxWdWVTaGFyZWQ6dyxWdWVSZWFjdGl2aXR5Ok59PWY7dmFyIEU9ZnVuY3Rpb24oaCx5LFIsRmUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBJdChhKXt9ZnVuY3Rpb24gVnQoYSx1KXt9ZnVuY3Rpb24gT3QoYSx1LG0sUyl7dmFyIEk7dHJ5e0k9Uz9hKC4uLlMpOmEoKX1jYXRjaChPKXt3dChPLHUsbSl9cmV0dXJuIEl9ZnVuY3Rpb24gUChhLHUsbSxTKXtpZih5LmlzRnVuY3Rpb24oYSkpe3ZhciBJPU90KGEsdSxtLFMpO3JldHVybiBJJiZ5LmlzUHJvbWlzZShJKSYmSS5jYXRjaChXPT57d3QoVyx1LG0pfSksSX1mb3IodmFyIE89W10sRj0wO0Y8YS5sZW5ndGg7RisrKU8ucHVzaChQKGFbRl0sdSxtLFMpKTtyZXR1cm4gT31mdW5jdGlvbiB3dChhLHUsbSl7aWYodSYmdS52bm9kZSx1KXtmb3IodmFyIFM9dS5wYXJlbnQsST11LnByb3h5LE89bTtTOyl7dmFyIEY9Uy5lYztpZihGKXtmb3IodmFyIFc9MDtXPEYubGVuZ3RoO1crKylpZihGW1ddKGEsSSxPKT09PSExKXJldHVybn1TPVMucGFyZW50fXZhciBHPXUuYXBwQ29udGV4dC5jb25maWcuZXJyb3JIYW5kbGVyO2lmKEcpe090KEcsbnVsbCwxMCxbYSxJLE9dKTtyZXR1cm59fUluKGEpfWZ1bmN0aW9uIEluKGEsdSxtKXtjb25zb2xlLmVycm9yKGEpfXZhciBvdD0hMSx6PSExLEo9W10saG49MCx1bj1bXSx5bj1udWxsLEpuPTAsZ2k9UHJvbWlzZS5yZXNvbHZlKCkscGk9bnVsbDtmdW5jdGlvbiBxcihhKXt2YXIgdT1waXx8Z2k7cmV0dXJuIGE/dS50aGVuKHRoaXM/YS5iaW5kKHRoaXMpOmEpOnV9ZnVuY3Rpb24gZ3IoYSl7Zm9yKHZhciB1PWhuKzEsbT1KLmxlbmd0aDt1PG07KXt2YXIgUz11K20+Pj4xLEk9emUoSltTXSk7STxhP3U9UysxOm09U31yZXR1cm4gdX1mdW5jdGlvbiBTbihhKXsoIUoubGVuZ3RofHwhSi5pbmNsdWRlcyhhLG90JiZhLmFsbG93UmVjdXJzZT9obisxOmhuKSkmJihhLmlkPT1udWxsP0oucHVzaChhKTpKLnNwbGljZShncihhLmlkKSwwLGEpLHByKCkpfWZ1bmN0aW9uIHByKCl7IW90JiYheiYmKHo9ITAscGk9Z2kudGhlbihBdCkpfWZ1bmN0aW9uIExyKGEpe3ZhciB1PUouaW5kZXhPZihhKTt1PmhuJiZKLnNwbGljZSh1LDEpfWZ1bmN0aW9uIEpyKGEpe3kuaXNBcnJheShhKT91bi5wdXNoKC4uLmEpOigheW58fCF5bi5pbmNsdWRlcyhhLGEuYWxsb3dSZWN1cnNlP0puKzE6Sm4pKSYmdW4ucHVzaChhKSxwcigpfWZ1bmN0aW9uIHZpKGEpe2Zvcih2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06b3Q/aG4rMTowO3U8Si5sZW5ndGg7dSsrKXt2YXIgbT1KW3VdO20mJm0ucHJlJiYoSi5zcGxpY2UodSwxKSx1LS0sbSgpKX19ZnVuY3Rpb24gUG4oYSl7aWYodW4ubGVuZ3RoKXt2YXIgdT1bLi4ubmV3IFNldCh1bildO2lmKHVuLmxlbmd0aD0wLHluKXt5bi5wdXNoKC4uLnUpO3JldHVybn1mb3IoeW49dSx5bi5zb3J0KChtLFMpPT56ZShtKS16ZShTKSksSm49MDtKbjx5bi5sZW5ndGg7Sm4rKyl5bltKbl0oKTt5bj1udWxsLEpuPTB9fXZhciB6ZT1hPT5hLmlkPT1udWxsPzEvMDphLmlkLG50PShhLHUpPT57dmFyIG09emUoYSktemUodSk7aWYobT09PTApe2lmKGEucHJlJiYhdS5wcmUpcmV0dXJuLTE7aWYodS5wcmUmJiFhLnByZSlyZXR1cm4gMX1yZXR1cm4gbX07ZnVuY3Rpb24gQXQoYSl7ej0hMSxvdD0hMCxKLnNvcnQobnQpO3ZhciB1PXkuTk9PUDt0cnl7Zm9yKGhuPTA7aG48Si5sZW5ndGg7aG4rKyl7dmFyIG09Sltobl07bSYmbS5hY3RpdmUhPT0hMSYmT3QobSxudWxsLDE0KX19ZmluYWxseXtobj0wLEoubGVuZ3RoPTAsUG4oKSxvdD0hMSxwaT1udWxsLChKLmxlbmd0aHx8dW4ubGVuZ3RoKSYmQXQoKX19aC5kZXZ0b29scz12b2lkIDA7dmFyIFF0PVtdO2Z1bmN0aW9uIFRuKGEsdSl7dmFyIG0sUztpZihoLmRldnRvb2xzPWEsaC5kZXZ0b29scyloLmRldnRvb2xzLmVuYWJsZWQ9ITAsUXQuZm9yRWFjaChPPT57dmFye2V2ZW50OkYsYXJnczpXfT1PO3JldHVybiBoLmRldnRvb2xzLmVtaXQoRiwuLi5XKX0pLFF0PVtdO2Vsc2UgaWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5IVE1MRWxlbWVudCYmISgoUz0obT13aW5kb3cubmF2aWdhdG9yKT09PW51bGx8fG09PT12b2lkIDA/dm9pZCAwOm0udXNlckFnZW50KT09PW51bGx8fFM9PT12b2lkIDA/dm9pZCAwOlMuaW5jbHVkZXMoImpzZG9tIikpKXt2YXIgST11Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX189dS5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9ffHxbXTtJLnB1c2goTz0+e1RuKE8sdSl9KSxzZXRUaW1lb3V0KCgpPT57aC5kZXZ0b29sc3x8KHUuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz1udWxsLFF0PVtdKX0sM2UzKX1lbHNlIFF0PVtdfWZ1bmN0aW9uIHNuKGEsdSl7aWYoIWEuaXNVbm1vdW50ZWQpe2Zvcih2YXIgbT1hLnZub2RlLnByb3BzfHx5LkVNUFRZX09CSixTPWFyZ3VtZW50cy5sZW5ndGgsST1uZXcgQXJyYXkoUz4yP1MtMjowKSxPPTI7TzxTO08rKylJW08tMl09YXJndW1lbnRzW09dO3ZhciBGPUksVz11LnN0YXJ0c1dpdGgoInVwZGF0ZToiKSxHPVcmJnUuc2xpY2UoNyk7aWYoRyYmRyBpbiBtKXt2YXIgbGU9IiIuY29uY2F0KEc9PT0ibW9kZWxWYWx1ZSI/Im1vZGVsIjpHLCJNb2RpZmllcnMiKSx7bnVtYmVyOldlLHRyaW06aXR9PW1bbGVdfHx5LkVNUFRZX09CSjtpdCYmKEY9SS5tYXAobXQ9PnkuaXNTdHJpbmcobXQpP210LnRyaW0oKTptdCkpLFdlJiYoRj1JLm1hcCh5Lmxvb3NlVG9OdW1iZXIpKX12YXIgZ2UsWWU9bVtnZT15LnRvSGFuZGxlcktleSh1KV18fG1bZ2U9eS50b0hhbmRsZXJLZXkoeS5jYW1lbGl6ZSh1KSldOyFZZSYmVyYmKFllPW1bZ2U9eS50b0hhbmRsZXJLZXkoeS5oeXBoZW5hdGUodSkpXSksWWUmJlAoWWUsYSw2LEYpO3ZhciBKZT1tW2dlKyJPbmNlIl07aWYoSmUpe2lmKCFhLmVtaXR0ZWQpYS5lbWl0dGVkPXt9O2Vsc2UgaWYoYS5lbWl0dGVkW2dlXSlyZXR1cm47YS5lbWl0dGVkW2dlXT0hMCxQKEplLGEsNixGKX19fWZ1bmN0aW9uIG9yKGEsdSl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLFM9dS5lbWl0c0NhY2hlLEk9Uy5nZXQoYSk7aWYoSSE9PXZvaWQgMClyZXR1cm4gSTt2YXIgTz1hLmVtaXRzLEY9e30sVz0hMTtpZigheS5pc0Z1bmN0aW9uKGEpKXt2YXIgRz1sZT0+e3ZhciBXZT1vcihsZSx1LCEwKTtXZSYmKFc9ITAseS5leHRlbmQoRixXZSkpfTshbSYmdS5taXhpbnMubGVuZ3RoJiZ1Lm1peGlucy5mb3JFYWNoKEcpLGEuZXh0ZW5kcyYmRyhhLmV4dGVuZHMpLGEubWl4aW5zJiZhLm1peGlucy5mb3JFYWNoKEcpfXJldHVybiFPJiYhVz8oeS5pc09iamVjdChhKSYmUy5zZXQoYSxudWxsKSxudWxsKTooeS5pc0FycmF5KE8pP08uZm9yRWFjaChsZT0+RltsZV09bnVsbCk6eS5leHRlbmQoRixPKSx5LmlzT2JqZWN0KGEpJiZTLnNldChhLEYpLEYpfWZ1bmN0aW9uIFduKGEsdSl7cmV0dXJuIWF8fCF5LmlzT24odSk/ITE6KHU9dS5zbGljZSgyKS5yZXBsYWNlKC9PbmNlJC8sIiIpLHkuaGFzT3duKGEsdVswXS50b0xvd2VyQ2FzZSgpK3Uuc2xpY2UoMSkpfHx5Lmhhc093bihhLHkuaHlwaGVuYXRlKHUpKXx8eS5oYXNPd24oYSx1KSl9dmFyIEFuPW51bGwsZ249bnVsbDtmdW5jdGlvbiB3cihhKXt2YXIgdT1BbjtyZXR1cm4gQW49YSxnbj1hJiZhLnR5cGUuX19zY29wZUlkfHxudWxsLHV9ZnVuY3Rpb24gS3IoYSl7Z249YX1mdW5jdGlvbiB3bygpe2duPW51bGx9dmFyIGRhPWE9PlVpO2Z1bmN0aW9uIFVpKGEpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpBbjtpZighdXx8YS5fbilyZXR1cm4gYTt2YXIgbT1mdW5jdGlvbigpe20uX2QmJkh0KC0xKTt2YXIgUz13cih1KSxJO3RyeXtJPWEoLi4uYXJndW1lbnRzKX1maW5hbGx5e3dyKFMpLG0uX2QmJkh0KDEpfXJldHVybiBJfTtyZXR1cm4gbS5fbj0hMCxtLl9jPSEwLG0uX2Q9ITAsbX1mdW5jdGlvbiBabygpe31mdW5jdGlvbiBYbyhhKXt2YXJ7dHlwZTp1LHZub2RlOm0scHJveHk6Uyx3aXRoUHJveHk6SSxwcm9wczpPLHByb3BzT3B0aW9uczpbRl0sc2xvdHM6VyxhdHRyczpHLGVtaXQ6bGUscmVuZGVyOldlLHJlbmRlckNhY2hlOml0LGRhdGE6Z2Usc2V0dXBTdGF0ZTpZZSxjdHg6SmUsaW5oZXJpdEF0dHJzOm10fT1hLGF0LFNlLEVlPXdyKGEpO3RyeXtpZihtLnNoYXBlRmxhZyY0KXt2YXIgQWU9SXx8UzthdD1VbihXZS5jYWxsKEFlLEFlLGl0LE8sWWUsZ2UsSmUpKSxTZT1HfWVsc2V7dmFyIGx0PXU7YXQ9VW4obHQubGVuZ3RoPjE/bHQoTyx7YXR0cnM6RyxzbG90czpXLGVtaXQ6bGV9KTpsdChPLG51bGwpKSxTZT11LnByb3BzP0c6cmkoRyl9fWNhdGNoKGwpe0llLmxlbmd0aD0wLHd0KGwsYSwxKSxhdD1VdChjZSl9dmFyIFZlPWF0O2lmKFNlJiZtdCE9PSExKXt2YXIgVHQ9T2JqZWN0LmtleXMoU2UpLHtzaGFwZUZsYWc6aX09VmU7VHQubGVuZ3RoJiZpJigxfDYpJiYoRiYmVHQuc29tZSh5LmlzTW9kZWxMaXN0ZW5lcikmJihTZT1DbyhTZSxGKSksVmU9Y2koVmUsU2UpKX1yZXR1cm4gbS5kaXJzJiYoVmU9Y2koVmUpLFZlLmRpcnM9VmUuZGlycz9WZS5kaXJzLmNvbmNhdChtLmRpcnMpOm0uZGlycyksbS50cmFuc2l0aW9uJiYoVmUudHJhbnNpdGlvbj1tLnRyYW5zaXRpb24pLGF0PVZlLHdyKEVlKSxhdH1mdW5jdGlvbiAkaShhKXtmb3IodmFyIHUsbT0wO208YS5sZW5ndGg7bSsrKXt2YXIgUz1hW21dO2lmKGRuKFMpKXtpZihTLnR5cGUhPT1jZXx8Uy5jaGlsZHJlbj09PSJ2LWlmIil7aWYodSlyZXR1cm47dT1TfX1lbHNlIHJldHVybn1yZXR1cm4gdX12YXIgcmk9YT0+e3ZhciB1O2Zvcih2YXIgbSBpbiBhKShtPT09ImNsYXNzInx8bT09PSJzdHlsZSJ8fHkuaXNPbihtKSkmJigodXx8KHU9e30pKVttXT1hW21dKTtyZXR1cm4gdX0sQ289KGEsdSk9Pnt2YXIgbT17fTtmb3IodmFyIFMgaW4gYSkoIXkuaXNNb2RlbExpc3RlbmVyKFMpfHwhKFMuc2xpY2UoOSlpbiB1KSkmJihtW1NdPWFbU10pO3JldHVybiBtfTtmdW5jdGlvbiBBbyhhLHUsbSl7dmFye3Byb3BzOlMsY2hpbGRyZW46SSxjb21wb25lbnQ6T309YSx7cHJvcHM6RixjaGlsZHJlbjpXLHBhdGNoRmxhZzpHfT11LGxlPU8uZW1pdHNPcHRpb25zO2lmKHUuZGlyc3x8dS50cmFuc2l0aW9uKXJldHVybiEwO2lmKG0mJkc+PTApe2lmKEcmMTAyNClyZXR1cm4hMDtpZihHJjE2KXJldHVybiBTP09vKFMsRixsZSk6ISFGO2lmKEcmOClmb3IodmFyIFdlPXUuZHluYW1pY1Byb3BzLGl0PTA7aXQ8V2UubGVuZ3RoO2l0Kyspe3ZhciBnZT1XZVtpdF07aWYoRltnZV0hPT1TW2dlXSYmIVduKGxlLGdlKSlyZXR1cm4hMH19ZWxzZSByZXR1cm4oSXx8VykmJighV3x8IVcuJHN0YWJsZSk/ITA6Uz09PUY/ITE6Uz9GP09vKFMsRixsZSk6ITA6ISFGO3JldHVybiExfWZ1bmN0aW9uIE9vKGEsdSxtKXt2YXIgUz1PYmplY3Qua2V5cyh1KTtpZihTLmxlbmd0aCE9PU9iamVjdC5rZXlzKGEpLmxlbmd0aClyZXR1cm4hMDtmb3IodmFyIEk9MDtJPFMubGVuZ3RoO0krKyl7dmFyIE89U1tJXTtpZih1W09dIT09YVtPXSYmIVduKG0sTykpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gWGkoYSx1KXtmb3IodmFye3Zub2RlOm0scGFyZW50OlN9PWE7UyYmUy5zdWJUcmVlPT09bTspKG09Uy52bm9kZSkuZWw9dSxTPVMucGFyZW50fXZhciBtaT1hPT5hLl9faXNTdXNwZW5zZSxUbz17bmFtZToiU3VzcGVuc2UiLF9faXNTdXNwZW5zZTohMCxwcm9jZXNzKGEsdSxtLFMsSSxPLEYsVyxHLGxlKXthPT1udWxsP0NyKHUsbSxTLEksTyxGLFcsRyxsZSk6UWkoYSx1LG0sUyxJLEYsVyxHLGxlKX0saHlkcmF0ZTplbyxjcmVhdGU6S24sbm9ybWFsaXplOlBvfSx1bz1UbztmdW5jdGlvbiBrbihhLHUpe3ZhciBtPWEucHJvcHMmJmEucHJvcHNbdV07eS5pc0Z1bmN0aW9uKG0pJiZtKCl9ZnVuY3Rpb24gQ3IoYSx1LG0sUyxJLE8sRixXLEcpe3ZhcntwOmxlLG86e2NyZWF0ZUVsZW1lbnQ6V2V9fT1HLGl0PVdlKCJkaXYiKSxnZT1hLnN1c3BlbnNlPUtuKGEsSSxTLHUsaXQsbSxPLEYsVyxHKTtsZShudWxsLGdlLnBlbmRpbmdCcmFuY2g9YS5zc0NvbnRlbnQsaXQsbnVsbCxTLGdlLE8sRiksZ2UuZGVwcz4wPyhrbihhLCJvblBlbmRpbmciKSxrbihhLCJvbkZhbGxiYWNrIiksbGUobnVsbCxhLnNzRmFsbGJhY2ssdSxtLFMsbnVsbCxPLEYpLGFyKGdlLGEuc3NGYWxsYmFjaykpOmdlLnJlc29sdmUoKX1mdW5jdGlvbiBRaShhLHUsbSxTLEksTyxGLFcsRyl7dmFye3A6bGUsdW06V2Usbzp7Y3JlYXRlRWxlbWVudDppdH19PUcsZ2U9dS5zdXNwZW5zZT1hLnN1c3BlbnNlO2dlLnZub2RlPXUsdS5lbD1hLmVsO3ZhciBZZT11LnNzQ29udGVudCxKZT11LnNzRmFsbGJhY2sse2FjdGl2ZUJyYW5jaDptdCxwZW5kaW5nQnJhbmNoOmF0LGlzSW5GYWxsYmFjazpTZSxpc0h5ZHJhdGluZzpFZX09Z2U7aWYoYXQpZ2UucGVuZGluZ0JyYW5jaD1ZZSxHdChZZSxhdCk/KGxlKGF0LFllLGdlLmhpZGRlbkNvbnRhaW5lcixudWxsLEksZ2UsTyxGLFcpLGdlLmRlcHM8PTA/Z2UucmVzb2x2ZSgpOlNlJiYobGUobXQsSmUsbSxTLEksbnVsbCxPLEYsVyksYXIoZ2UsSmUpKSk6KGdlLnBlbmRpbmdJZCsrLEVlPyhnZS5pc0h5ZHJhdGluZz0hMSxnZS5hY3RpdmVCcmFuY2g9YXQpOldlKGF0LEksZ2UpLGdlLmRlcHM9MCxnZS5lZmZlY3RzLmxlbmd0aD0wLGdlLmhpZGRlbkNvbnRhaW5lcj1pdCgiZGl2IiksU2U/KGxlKG51bGwsWWUsZ2UuaGlkZGVuQ29udGFpbmVyLG51bGwsSSxnZSxPLEYsVyksZ2UuZGVwczw9MD9nZS5yZXNvbHZlKCk6KGxlKG10LEplLG0sUyxJLG51bGwsTyxGLFcpLGFyKGdlLEplKSkpOm10JiZHdChZZSxtdCk/KGxlKG10LFllLG0sUyxJLGdlLE8sRixXKSxnZS5yZXNvbHZlKCEwKSk6KGxlKG51bGwsWWUsZ2UuaGlkZGVuQ29udGFpbmVyLG51bGwsSSxnZSxPLEYsVyksZ2UuZGVwczw9MCYmZ2UucmVzb2x2ZSgpKSk7ZWxzZSBpZihtdCYmR3QoWWUsbXQpKWxlKG10LFllLG0sUyxJLGdlLE8sRixXKSxhcihnZSxZZSk7ZWxzZSBpZihrbih1LCJvblBlbmRpbmciKSxnZS5wZW5kaW5nQnJhbmNoPVllLGdlLnBlbmRpbmdJZCsrLGxlKG51bGwsWWUsZ2UuaGlkZGVuQ29udGFpbmVyLG51bGwsSSxnZSxPLEYsVyksZ2UuZGVwczw9MClnZS5yZXNvbHZlKCk7ZWxzZXt2YXJ7dGltZW91dDpBZSxwZW5kaW5nSWQ6bHR9PWdlO0FlPjA/c2V0VGltZW91dCgoKT0+e2dlLnBlbmRpbmdJZD09PWx0JiZnZS5mYWxsYmFjayhKZSl9LEFlKTpBZT09PTAmJmdlLmZhbGxiYWNrKEplKX19ZnVuY3Rpb24gS24oYSx1LG0sUyxJLE8sRixXLEcsbGUpe3ZhciBXZT1hcmd1bWVudHMubGVuZ3RoPjEwJiZhcmd1bWVudHNbMTBdIT09dm9pZCAwP2FyZ3VtZW50c1sxMF06ITEse3A6aXQsbTpnZSx1bTpZZSxuOkplLG86e3BhcmVudE5vZGU6bXQscmVtb3ZlOmF0fX09bGUsU2U9YS5wcm9wcz95LnRvTnVtYmVyKGEucHJvcHMudGltZW91dCk6dm9pZCAwLEVlPXt2bm9kZTphLHBhcmVudDp1LHBhcmVudENvbXBvbmVudDptLGlzU1ZHOkYsY29udGFpbmVyOlMsaGlkZGVuQ29udGFpbmVyOkksYW5jaG9yOk8sZGVwczowLHBlbmRpbmdJZDowLHRpbWVvdXQ6dHlwZW9mIFNlPT0ibnVtYmVyIj9TZTotMSxhY3RpdmVCcmFuY2g6bnVsbCxwZW5kaW5nQnJhbmNoOm51bGwsaXNJbkZhbGxiYWNrOiEwLGlzSHlkcmF0aW5nOldlLGlzVW5tb3VudGVkOiExLGVmZmVjdHM6W10scmVzb2x2ZSgpe3ZhciBBZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06ITEse3Zub2RlOmx0LGFjdGl2ZUJyYW5jaDpWZSxwZW5kaW5nQnJhbmNoOlR0LHBlbmRpbmdJZDppLGVmZmVjdHM6bCxwYXJlbnRDb21wb25lbnQ6ZCxjb250YWluZXI6X309RWU7aWYoRWUuaXNIeWRyYXRpbmcpRWUuaXNIeWRyYXRpbmc9ITE7ZWxzZSBpZighQWUpe3ZhciBBPVZlJiZUdC50cmFuc2l0aW9uJiZUdC50cmFuc2l0aW9uLm1vZGU9PT0ib3V0LWluIjtBJiYoVmUudHJhbnNpdGlvbi5hZnRlckxlYXZlPSgpPT57aT09PUVlLnBlbmRpbmdJZCYmZ2UoVHQsXyxDLDApfSk7dmFye2FuY2hvcjpDfT1FZTtWZSYmKEM9SmUoVmUpLFllKFZlLGQsRWUsITApKSxBfHxnZShUdCxfLEMsMCl9YXIoRWUsVHQpLEVlLnBlbmRpbmdCcmFuY2g9bnVsbCxFZS5pc0luRmFsbGJhY2s9ITE7Zm9yKHZhciBrPUVlLnBhcmVudCxEPSExO2s7KXtpZihrLnBlbmRpbmdCcmFuY2gpe2suZWZmZWN0cy5wdXNoKC4uLmwpLEQ9ITA7YnJlYWt9az1rLnBhcmVudH1EfHxKcihsKSxFZS5lZmZlY3RzPVtdLGtuKGx0LCJvblJlc29sdmUiKX0sZmFsbGJhY2soQWUpe2lmKCEhRWUucGVuZGluZ0JyYW5jaCl7dmFye3Zub2RlOmx0LGFjdGl2ZUJyYW5jaDpWZSxwYXJlbnRDb21wb25lbnQ6VHQsY29udGFpbmVyOmksaXNTVkc6bH09RWU7a24obHQsIm9uRmFsbGJhY2siKTt2YXIgZD1KZShWZSksXz0oKT0+eyFFZS5pc0luRmFsbGJhY2t8fChpdChudWxsLEFlLGksZCxUdCxudWxsLGwsVyxHKSxhcihFZSxBZSkpfSxBPUFlLnRyYW5zaXRpb24mJkFlLnRyYW5zaXRpb24ubW9kZT09PSJvdXQtaW4iO0EmJihWZS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9XyksRWUuaXNJbkZhbGxiYWNrPSEwLFllKFZlLFR0LG51bGwsITApLEF8fF8oKX19LG1vdmUoQWUsbHQsVmUpe0VlLmFjdGl2ZUJyYW5jaCYmZ2UoRWUuYWN0aXZlQnJhbmNoLEFlLGx0LFZlKSxFZS5jb250YWluZXI9QWV9LG5leHQoKXtyZXR1cm4gRWUuYWN0aXZlQnJhbmNoJiZKZShFZS5hY3RpdmVCcmFuY2gpfSxyZWdpc3RlckRlcChBZSxsdCl7dmFyIFZlPSEhRWUucGVuZGluZ0JyYW5jaDtWZSYmRWUuZGVwcysrO3ZhciBUdD1BZS52bm9kZS5lbDtBZS5hc3luY0RlcC5jYXRjaChpPT57d3QoaSxBZSwwKX0pLnRoZW4oaT0+e2lmKCEoQWUuaXNVbm1vdW50ZWR8fEVlLmlzVW5tb3VudGVkfHxFZS5wZW5kaW5nSWQhPT1BZS5zdXNwZW5zZUlkKSl7QWUuYXN5bmNSZXNvbHZlZD0hMDt2YXJ7dm5vZGU6bH09QWU7SWEoQWUsaSwhMSksVHQmJihsLmVsPVR0KTt2YXIgZD0hVHQmJkFlLnN1YlRyZWUuZWw7bHQoQWUsbCxtdChUdHx8QWUuc3ViVHJlZS5lbCksVHQ/bnVsbDpKZShBZS5zdWJUcmVlKSxFZSxGLEcpLGQmJmF0KGQpLFhpKEFlLGwuZWwpLFZlJiYtLUVlLmRlcHM9PT0wJiZFZS5yZXNvbHZlKCl9fSl9LHVubW91bnQoQWUsbHQpe0VlLmlzVW5tb3VudGVkPSEwLEVlLmFjdGl2ZUJyYW5jaCYmWWUoRWUuYWN0aXZlQnJhbmNoLG0sQWUsbHQpLEVlLnBlbmRpbmdCcmFuY2gmJlllKEVlLnBlbmRpbmdCcmFuY2gsbSxBZSxsdCl9fTtyZXR1cm4gRWV9ZnVuY3Rpb24gZW8oYSx1LG0sUyxJLE8sRixXLEcpe3ZhciBsZT11LnN1c3BlbnNlPUtuKHUsUyxtLGEucGFyZW50Tm9kZSxzLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG51bGwsSSxPLEYsVywhMCksV2U9RyhhLGxlLnBlbmRpbmdCcmFuY2g9dS5zc0NvbnRlbnQsbSxsZSxPLEYpO3JldHVybiBsZS5kZXBzPT09MCYmbGUucmVzb2x2ZSgpLFdlfWZ1bmN0aW9uIFBvKGEpe3ZhcntzaGFwZUZsYWc6dSxjaGlsZHJlbjptfT1hLFM9dSYzMjthLnNzQ29udGVudD1mbyhTP20uZGVmYXVsdDptKSxhLnNzRmFsbGJhY2s9Uz9mbyhtLmZhbGxiYWNrKTpVdChjZSl9ZnVuY3Rpb24gZm8oYSl7dmFyIHU7aWYoeS5pc0Z1bmN0aW9uKGEpKXt2YXIgbT1ndCYmYS5fYzttJiYoYS5fZD0hMSxDZSgpKSxhPWEoKSxtJiYoYS5fZD0hMCx1PWZlLGN0KCkpfWlmKHkuaXNBcnJheShhKSl7dmFyIFM9JGkoYSk7YT1TfXJldHVybiBhPVVuKGEpLHUmJiFhLmR5bmFtaWNDaGlsZHJlbiYmKGEuZHluYW1pY0NoaWxkcmVuPXUuZmlsdGVyKEk9PkkhPT1hKSksYX1mdW5jdGlvbiBpaShhLHUpe3UmJnUucGVuZGluZ0JyYW5jaD95LmlzQXJyYXkoYSk/dS5lZmZlY3RzLnB1c2goLi4uYSk6dS5lZmZlY3RzLnB1c2goYSk6SnIoYSl9ZnVuY3Rpb24gYXIoYSx1KXthLmFjdGl2ZUJyYW5jaD11O3Zhcnt2bm9kZTptLHBhcmVudENvbXBvbmVudDpTfT1hLEk9bS5lbD11LmVsO1MmJlMuc3ViVHJlZT09PW0mJihTLnZub2RlLmVsPUksWGkoUyxJKSl9ZnVuY3Rpb24ga3IoYSx1KXtpZihvbil7dmFyIG09b24ucHJvdmlkZXMsUz1vbi5wYXJlbnQmJm9uLnBhcmVudC5wcm92aWRlcztTPT09bSYmKG09b24ucHJvdmlkZXM9T2JqZWN0LmNyZWF0ZShTKSksbVthXT11LG9uLnR5cGUubXBUeXBlPT09ImFwcCImJm9uLmFwcENvbnRleHQuYXBwLnByb3ZpZGUoYSx1KX19ZnVuY3Rpb24gTm4oYSx1KXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsUz1vbnx8QW47aWYoUyl7dmFyIEk9Uy5wYXJlbnQ9PW51bGw/Uy52bm9kZS5hcHBDb250ZXh0JiZTLnZub2RlLmFwcENvbnRleHQucHJvdmlkZXM6Uy5wYXJlbnQucHJvdmlkZXM7aWYoSSYmYSBpbiBJKXJldHVybiBJW2FdO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlyZXR1cm4gbSYmeS5pc0Z1bmN0aW9uKHUpP3UuY2FsbChTLnByb3h5KTp1fX1mdW5jdGlvbiBabihhLHUpe3JldHVybiB2cihhLG51bGwsdSl9ZnVuY3Rpb24gTmkoYSx1KXtyZXR1cm4gdnIoYSxudWxsLHtmbHVzaDoicG9zdCJ9KX1mdW5jdGlvbiBIaShhLHUpe3JldHVybiB2cihhLG51bGwse2ZsdXNoOiJzeW5jIn0pfXZhciBvaT17fTtmdW5jdGlvbiBGcihhLHUsbSl7cmV0dXJuIHZyKGEsdSxtKX1mdW5jdGlvbiB2cihhLHUpe3ZhcntpbW1lZGlhdGU6bSxkZWVwOlMsZmx1c2g6SSxvblRyYWNrOk8sb25UcmlnZ2VyOkZ9PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp5LkVNUFRZX09CSixXPVIuZ2V0Q3VycmVudFNjb3BlKCk9PT0ob249PW51bGw/dm9pZCAwOm9uLnNjb3BlKT9vbjpudWxsLEcsbGU9ITEsV2U9ITE7aWYoUi5pc1JlZihhKT8oRz0oKT0+YS52YWx1ZSxsZT1SLmlzU2hhbGxvdyhhKSk6Ui5pc1JlYWN0aXZlKGEpPyhHPSgpPT5hLFM9ITApOnkuaXNBcnJheShhKT8oV2U9ITAsbGU9YS5zb21lKEFlPT5SLmlzUmVhY3RpdmUoQWUpfHxSLmlzU2hhbGxvdyhBZSkpLEc9KCk9PmEubWFwKEFlPT57aWYoUi5pc1JlZihBZSkpcmV0dXJuIEFlLnZhbHVlO2lmKFIuaXNSZWFjdGl2ZShBZSkpcmV0dXJuIFZyKEFlKTtpZih5LmlzRnVuY3Rpb24oQWUpKXJldHVybiBPdChBZSxXLDIpfSkpOnkuaXNGdW5jdGlvbihhKT91P0c9KCk9Pk90KGEsVywyKTpHPSgpPT57aWYoIShXJiZXLmlzVW5tb3VudGVkKSlyZXR1cm4gZ2UmJmdlKCksUChhLFcsMyxbWWVdKX06Rz15Lk5PT1AsdSYmUyl7dmFyIGl0PUc7Rz0oKT0+VnIoaXQoKSl9dmFyIGdlLFllPUFlPT57Z2U9U2Uub25TdG9wPSgpPT57T3QoQWUsVyw0KX19LEplPVdlP25ldyBBcnJheShhLmxlbmd0aCkuZmlsbChvaSk6b2ksbXQ9KCk9PntpZighIVNlLmFjdGl2ZSlpZih1KXt2YXIgQWU9U2UucnVuKCk7KFN8fGxlfHwoV2U/QWUuc29tZSgobHQsVmUpPT55Lmhhc0NoYW5nZWQobHQsSmVbVmVdKSk6eS5oYXNDaGFuZ2VkKEFlLEplKSkpJiYoZ2UmJmdlKCksUCh1LFcsMyxbQWUsSmU9PT1vaT92b2lkIDA6V2UmJkplWzBdPT09b2k/W106SmUsWWVdKSxKZT1BZSl9ZWxzZSBTZS5ydW4oKX07bXQuYWxsb3dSZWN1cnNlPSEhdTt2YXIgYXQ7ST09PSJzeW5jIj9hdD1tdDpJPT09InBvc3QiP2F0PSgpPT51cihtdCxXJiZXLnN1c3BlbnNlKToobXQucHJlPSEwLFcmJihtdC5pZD1XLnVpZCksYXQ9KCk9PlNuKG10KSk7dmFyIFNlPW5ldyBSLlJlYWN0aXZlRWZmZWN0KEcsYXQpO3U/bT9tdCgpOkplPVNlLnJ1bigpOkk9PT0icG9zdCI/dXIoU2UucnVuLmJpbmQoU2UpLFcmJlcuc3VzcGVuc2UpOlNlLnJ1bigpO3ZhciBFZT0oKT0+e1NlLnN0b3AoKSxXJiZXLnNjb3BlJiZ5LnJlbW92ZShXLnNjb3BlLmVmZmVjdHMsU2UpfTtyZXR1cm4gRWV9ZnVuY3Rpb24ga2koYSx1LG0pe3ZhciBTPXRoaXMucHJveHksST15LmlzU3RyaW5nKGEpP2EuaW5jbHVkZXMoIi4iKT9JbyhTLGEpOigpPT5TW2FdOmEuYmluZChTLFMpLE87eS5pc0Z1bmN0aW9uKHUpP089dTooTz11LmhhbmRsZXIsbT11KTt2YXIgRj1vbjtqbih0aGlzKTt2YXIgVz12cihJLE8uYmluZChTKSxtKTtyZXR1cm4gRj9qbihGKTpxbigpLFd9ZnVuY3Rpb24gSW8oYSx1KXt2YXIgbT11LnNwbGl0KCIuIik7cmV0dXJuKCk9Pntmb3IodmFyIFM9YSxJPTA7STxtLmxlbmd0aCYmUztJKyspUz1TW21bSV1dO3JldHVybiBTfX1mdW5jdGlvbiBWcihhLHUpe2lmKCF5LmlzT2JqZWN0KGEpfHxhLl9fdl9za2lwfHwodT11fHxuZXcgU2V0LHUuaGFzKGEpKSlyZXR1cm4gYTtpZih1LmFkZChhKSxSLmlzUmVmKGEpKVZyKGEudmFsdWUsdSk7ZWxzZSBpZih5LmlzQXJyYXkoYSkpZm9yKHZhciBtPTA7bTxhLmxlbmd0aDttKyspVnIoYVttXSx1KTtlbHNlIGlmKHkuaXNTZXQoYSl8fHkuaXNNYXAoYSkpYS5mb3JFYWNoKEk9PntWcihJLHUpfSk7ZWxzZSBpZih5LmlzUGxhaW5PYmplY3QoYSkpZm9yKHZhciBTIGluIGEpVnIoYVtTXSx1KTtyZXR1cm4gYX1mdW5jdGlvbiBacigpe3ZhciBhPXtpc01vdW50ZWQ6ITEsaXNMZWF2aW5nOiExLGlzVW5tb3VudGluZzohMSxsZWF2aW5nVk5vZGVzOm5ldyBNYXB9O3JldHVybiBlcigoKT0+e2EuaXNNb3VudGVkPSEwfSksbnIoKCk9PnthLmlzVW5tb3VudGluZz0hMH0pLGF9dmFyIEFyPVtGdW5jdGlvbixBcnJheV0scG49e21vZGU6U3RyaW5nLGFwcGVhcjpCb29sZWFuLHBlcnNpc3RlZDpCb29sZWFuLG9uQmVmb3JlRW50ZXI6QXIsb25FbnRlcjpBcixvbkFmdGVyRW50ZXI6QXIsb25FbnRlckNhbmNlbGxlZDpBcixvbkJlZm9yZUxlYXZlOkFyLG9uTGVhdmU6QXIsb25BZnRlckxlYXZlOkFyLG9uTGVhdmVDYW5jZWxsZWQ6QXIsb25CZWZvcmVBcHBlYXI6QXIsb25BcHBlYXI6QXIsb25BZnRlckFwcGVhcjpBcixvbkFwcGVhckNhbmNlbGxlZDpBcn0sWHI9e25hbWU6IkJhc2VUcmFuc2l0aW9uIixwcm9wczpwbixzZXR1cChhLHUpe3ZhcntzbG90czptfT11LFM9X24oKSxJPVpyKCksTztyZXR1cm4oKT0+e3ZhciBGPW0uZGVmYXVsdCYmT3IobS5kZWZhdWx0KCksITApO2lmKCEoIUZ8fCFGLmxlbmd0aCkpe3ZhciBXPUZbMF07aWYoRi5sZW5ndGg+MSl7Zm9yKHZhciBHIG9mIEYpaWYoRy50eXBlIT09Y2Upe1c9RzticmVha319dmFyIGxlPVIudG9SYXcoYSkse21vZGU6V2V9PWxlO2lmKEkuaXNMZWF2aW5nKXJldHVybiBfaShXKTt2YXIgaXQ9YmkoVyk7aWYoIWl0KXJldHVybiBfaShXKTt2YXIgZ2U9VGUoaXQsbGUsSSxTKTt5aShpdCxnZSk7dmFyIFllPVMuc3ViVHJlZSxKZT1ZZSYmYmkoWWUpLG10PSExLHtnZXRUcmFuc2l0aW9uS2V5OmF0fT1pdC50eXBlO2lmKGF0KXt2YXIgU2U9YXQoKTtPPT09dm9pZCAwP089U2U6U2UhPT1PJiYoTz1TZSxtdD0hMCl9aWYoSmUmJkplLnR5cGUhPT1jZSYmKCFHdChpdCxKZSl8fG10KSl7dmFyIEVlPVRlKEplLGxlLEksUyk7aWYoeWkoSmUsRWUpLFdlPT09Im91dC1pbiIpcmV0dXJuIEkuaXNMZWF2aW5nPSEwLEVlLmFmdGVyTGVhdmU9KCk9PntJLmlzTGVhdmluZz0hMSxTLnVwZGF0ZS5hY3RpdmUhPT0hMSYmUy51cGRhdGUoKX0sX2koVyk7V2U9PT0iaW4tb3V0IiYmaXQudHlwZSE9PWNlJiYoRWUuZGVsYXlMZWF2ZT0oQWUsbHQsVmUpPT57dmFyIFR0PUR0KEksSmUpO1R0W1N0cmluZyhKZS5rZXkpXT1KZSxBZS5fbGVhdmVDYj0oKT0+e2x0KCksQWUuX2xlYXZlQ2I9dm9pZCAwLGRlbGV0ZSBnZS5kZWxheWVkTGVhdmV9LGdlLmRlbGF5ZWRMZWF2ZT1WZX0pfXJldHVybiBXfX19fSxVcj1YcjtmdW5jdGlvbiBEdChhLHUpe3ZhcntsZWF2aW5nVk5vZGVzOm19PWEsUz1tLmdldCh1LnR5cGUpO3JldHVybiBTfHwoUz1PYmplY3QuY3JlYXRlKG51bGwpLG0uc2V0KHUudHlwZSxTKSksU31mdW5jdGlvbiBUZShhLHUsbSxTKXt2YXJ7YXBwZWFyOkksbW9kZTpPLHBlcnNpc3RlZDpGPSExLG9uQmVmb3JlRW50ZXI6VyxvbkVudGVyOkcsb25BZnRlckVudGVyOmxlLG9uRW50ZXJDYW5jZWxsZWQ6V2Usb25CZWZvcmVMZWF2ZTppdCxvbkxlYXZlOmdlLG9uQWZ0ZXJMZWF2ZTpZZSxvbkxlYXZlQ2FuY2VsbGVkOkplLG9uQmVmb3JlQXBwZWFyOm10LG9uQXBwZWFyOmF0LG9uQWZ0ZXJBcHBlYXI6U2Usb25BcHBlYXJDYW5jZWxsZWQ6RWV9PXUsQWU9U3RyaW5nKGEua2V5KSxsdD1EdChtLGEpLFZlPShsLGQpPT57bCYmUChsLFMsOSxkKX0sVHQ9KGwsZCk9Pnt2YXIgXz1kWzFdO1ZlKGwsZCkseS5pc0FycmF5KGwpP2wuZXZlcnkoQT0+QS5sZW5ndGg8PTEpJiZfKCk6bC5sZW5ndGg8PTEmJl8oKX0saT17bW9kZTpPLHBlcnNpc3RlZDpGLGJlZm9yZUVudGVyKGwpe3ZhciBkPVc7aWYoIW0uaXNNb3VudGVkKWlmKEkpZD1tdHx8VztlbHNlIHJldHVybjtsLl9sZWF2ZUNiJiZsLl9sZWF2ZUNiKCEwKTt2YXIgXz1sdFtBZV07XyYmR3QoYSxfKSYmXy5lbC5fbGVhdmVDYiYmXy5lbC5fbGVhdmVDYigpLFZlKGQsW2xdKX0sZW50ZXIobCl7dmFyIGQ9RyxfPWxlLEE9V2U7aWYoIW0uaXNNb3VudGVkKWlmKEkpZD1hdHx8RyxfPVNlfHxsZSxBPUVlfHxXZTtlbHNlIHJldHVybjt2YXIgQz0hMSxrPWwuX2VudGVyQ2I9RD0+e0N8fChDPSEwLEQ/VmUoQSxbbF0pOlZlKF8sW2xdKSxpLmRlbGF5ZWRMZWF2ZSYmaS5kZWxheWVkTGVhdmUoKSxsLl9lbnRlckNiPXZvaWQgMCl9O2Q/VHQoZCxbbCxrXSk6aygpfSxsZWF2ZShsLGQpe3ZhciBfPVN0cmluZyhhLmtleSk7aWYobC5fZW50ZXJDYiYmbC5fZW50ZXJDYighMCksbS5pc1VubW91bnRpbmcpcmV0dXJuIGQoKTtWZShpdCxbbF0pO3ZhciBBPSExLEM9bC5fbGVhdmVDYj1rPT57QXx8KEE9ITAsZCgpLGs/VmUoSmUsW2xdKTpWZShZZSxbbF0pLGwuX2xlYXZlQ2I9dm9pZCAwLGx0W19dPT09YSYmZGVsZXRlIGx0W19dKX07bHRbX109YSxnZT9UdChnZSxbbCxDXSk6QygpfSxjbG9uZShsKXtyZXR1cm4gVGUobCx1LG0sUyl9fTtyZXR1cm4gaX1mdW5jdGlvbiBfaShhKXtpZihQcihhKSlyZXR1cm4gYT1jaShhKSxhLmNoaWxkcmVuPW51bGwsYX1mdW5jdGlvbiBiaShhKXtyZXR1cm4gUHIoYSk/YS5jaGlsZHJlbj9hLmNoaWxkcmVuWzBdOnZvaWQgMDphfWZ1bmN0aW9uIHlpKGEsdSl7YS5zaGFwZUZsYWcmNiYmYS5jb21wb25lbnQ/eWkoYS5jb21wb25lbnQuc3ViVHJlZSx1KTphLnNoYXBlRmxhZyYxMjg/KGEuc3NDb250ZW50LnRyYW5zaXRpb249dS5jbG9uZShhLnNzQ29udGVudCksYS5zc0ZhbGxiYWNrLnRyYW5zaXRpb249dS5jbG9uZShhLnNzRmFsbGJhY2spKTphLnRyYW5zaXRpb249dX1mdW5jdGlvbiBPcihhKXtmb3IodmFyIHU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExLG09YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsUz1bXSxJPTAsTz0wO088YS5sZW5ndGg7TysrKXt2YXIgRj1hW09dLFc9bT09bnVsbD9GLmtleTpTdHJpbmcobSkrU3RyaW5nKEYua2V5IT1udWxsP0Yua2V5Ok8pO0YudHlwZT09PXE/KEYucGF0Y2hGbGFnJjEyOCYmSSsrLFM9Uy5jb25jYXQoT3IoRi5jaGlsZHJlbix1LFcpKSk6KHV8fEYudHlwZSE9PWNlKSYmUy5wdXNoKFchPW51bGw/Y2koRix7a2V5Old9KTpGKX1pZihJPjEpZm9yKHZhciBHPTA7RzxTLmxlbmd0aDtHKyspU1tHXS5wYXRjaEZsYWc9LTI7cmV0dXJuIFN9ZnVuY3Rpb24gUmkoYSl7cmV0dXJuIHkuaXNGdW5jdGlvbihhKT97c2V0dXA6YSxuYW1lOmEubmFtZX06YX12YXIgVHI9YT0+ISFhLnR5cGUuX19hc3luY0xvYWRlcjtmdW5jdGlvbiBScihhKXt5LmlzRnVuY3Rpb24oYSkmJihhPXtsb2FkZXI6YX0pO3Zhcntsb2FkZXI6dSxsb2FkaW5nQ29tcG9uZW50Om0sZXJyb3JDb21wb25lbnQ6UyxkZWxheTpJPTIwMCx0aW1lb3V0Ok8sc3VzcGVuc2libGU6Rj0hMCxvbkVycm9yOld9PWEsRz1udWxsLGxlLFdlPTAsaXQ9KCk9PihXZSsrLEc9bnVsbCxnZSgpKSxnZT0oKT0+e3ZhciBZZTtyZXR1cm4gR3x8KFllPUc9dSgpLmNhdGNoKEplPT57aWYoSmU9SmUgaW5zdGFuY2VvZiBFcnJvcj9KZTpuZXcgRXJyb3IoU3RyaW5nKEplKSksVylyZXR1cm4gbmV3IFByb21pc2UoKG10LGF0KT0+e3ZhciBTZT0oKT0+bXQoaXQoKSksRWU9KCk9PmF0KEplKTtXKEplLFNlLEVlLFdlKzEpfSk7dGhyb3cgSmV9KS50aGVuKEplPT5ZZSE9PUcmJkc/RzooSmUmJihKZS5fX2VzTW9kdWxlfHxKZVtTeW1ib2wudG9TdHJpbmdUYWddPT09Ik1vZHVsZSIpJiYoSmU9SmUuZGVmYXVsdCksbGU9SmUsSmUpKSl9O3JldHVybiBSaSh7bmFtZToiQXN5bmNDb21wb25lbnRXcmFwcGVyIixfX2FzeW5jTG9hZGVyOmdlLGdldCBfX2FzeW5jUmVzb2x2ZWQoKXtyZXR1cm4gbGV9LHNldHVwKCl7dmFyIFllPW9uO2lmKGxlKXJldHVybigpPT5haShsZSxZZSk7dmFyIEplPUVlPT57Rz1udWxsLHd0KEVlLFllLDEzKX07aWYoRiYmWWUuc3VzcGVuc2UpcmV0dXJuIGdlKCkudGhlbihFZT0+KCk9PmFpKEVlLFllKSkuY2F0Y2goRWU9PihKZShFZSksKCk9PlM/VXQoUyx7ZXJyb3I6RWV9KTpudWxsKSk7dmFyIG10PVIucmVmKCExKSxhdD1SLnJlZigpLFNlPVIucmVmKCEhSSk7cmV0dXJuIEkmJnNldFRpbWVvdXQoKCk9PntTZS52YWx1ZT0hMX0sSSksTyE9bnVsbCYmc2V0VGltZW91dCgoKT0+e2lmKCFtdC52YWx1ZSYmIWF0LnZhbHVlKXt2YXIgRWU9bmV3IEVycm9yKCJBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICIuY29uY2F0KE8sIm1zLiIpKTtKZShFZSksYXQudmFsdWU9RWV9fSxPKSxnZSgpLnRoZW4oKCk9PnttdC52YWx1ZT0hMCxZZS5wYXJlbnQmJlByKFllLnBhcmVudC52bm9kZSkmJlNuKFllLnBhcmVudC51cGRhdGUpfSkuY2F0Y2goRWU9PntKZShFZSksYXQudmFsdWU9RWV9KSwoKT0+e2lmKG10LnZhbHVlJiZsZSlyZXR1cm4gYWkobGUsWWUpO2lmKGF0LnZhbHVlJiZTKXJldHVybiBVdChTLHtlcnJvcjphdC52YWx1ZX0pO2lmKG0mJiFTZS52YWx1ZSlyZXR1cm4gVXQobSl9fX0pfWZ1bmN0aW9uIGFpKGEsdSl7dmFye3JlZjptLHByb3BzOlMsY2hpbGRyZW46SSxjZTpPfT11LnZub2RlLEY9VXQoYSxTLEkpO3JldHVybiBGLnJlZj1tLEYuY2U9TyxkZWxldGUgdS52bm9kZS5jZSxGfXZhciBQcj1hPT5hLnR5cGUuX19pc0tlZXBBbGl2ZSxFaT17bmFtZToiS2VlcEFsaXZlIixfX2lzS2VlcEFsaXZlOiEwLHByb3BzOntpbmNsdWRlOltTdHJpbmcsUmVnRXhwLEFycmF5XSxleGNsdWRlOltTdHJpbmcsUmVnRXhwLEFycmF5XSxtYXg6W1N0cmluZyxOdW1iZXJdfSxzZXR1cChhLHUpe3ZhcntzbG90czptfT11LFM9X24oKSxJPVMuY3R4LE89bmV3IE1hcCxGPW5ldyBTZXQsVz1udWxsLEc9Uy5zdXNwZW5zZSx7cmVuZGVyZXI6e3A6bGUsbTpXZSx1bTppdCxvOntjcmVhdGVFbGVtZW50OmdlfX19PUksWWU9Z2UoImRpdiIpO0kuYWN0aXZhdGU9KEFlLGx0LFZlLFR0LGkpPT57dmFyIGw9QWUuY29tcG9uZW50O1dlKEFlLGx0LFZlLDAsRyksbGUobC52bm9kZSxBZSxsdCxWZSxsLEcsVHQsQWUuc2xvdFNjb3BlSWRzLGkpLHVyKCgpPT57bC5pc0RlYWN0aXZhdGVkPSExLGwuYSYmeS5pbnZva2VBcnJheUZucyhsLmEpO3ZhciBkPUFlLnByb3BzJiZBZS5wcm9wcy5vblZub2RlTW91bnRlZDtkJiZ5cihkLGwucGFyZW50LEFlKX0sRyl9LEkuZGVhY3RpdmF0ZT1BZT0+e3ZhciBsdD1BZS5jb21wb25lbnQ7V2UoQWUsWWUsbnVsbCwxLEcpLHVyKCgpPT57bHQuZGEmJnkuaW52b2tlQXJyYXlGbnMobHQuZGEpO3ZhciBWZT1BZS5wcm9wcyYmQWUucHJvcHMub25Wbm9kZVVubW91bnRlZDtWZSYmeXIoVmUsbHQucGFyZW50LEFlKSxsdC5pc0RlYWN0aXZhdGVkPSEwfSxHKX07ZnVuY3Rpb24gSmUoQWUpe3NyKEFlKSxpdChBZSxTLEcsITApfWZ1bmN0aW9uIG10KEFlKXtPLmZvckVhY2goKGx0LFZlKT0+e3ZhciBUdD1EaShsdC50eXBlKTtUdCYmKCFBZXx8IUFlKFR0KSkmJmF0KFZlKX0pfWZ1bmN0aW9uIGF0KEFlKXt2YXIgbHQ9Ty5nZXQoQWUpOyFXfHwhR3QobHQsVyk/SmUobHQpOlcmJnNyKFcpLE8uZGVsZXRlKEFlKSxGLmRlbGV0ZShBZSl9RnIoKCk9PlthLmluY2x1ZGUsYS5leGNsdWRlXSxBZT0+e3ZhcltsdCxWZV09QWU7bHQmJm10KFR0PT5qaShsdCxUdCkpLFZlJiZtdChUdD0+IWppKFZlLFR0KSl9LHtmbHVzaDoicG9zdCIsZGVlcDohMH0pO3ZhciBTZT1udWxsLEVlPSgpPT57U2UhPW51bGwmJk8uc2V0KFNlLFNpKFMuc3ViVHJlZSkpfTtyZXR1cm4gZXIoRWUpLEduKEVlKSxucigoKT0+e08uZm9yRWFjaChBZT0+e3ZhcntzdWJUcmVlOmx0LHN1c3BlbnNlOlZlfT1TLFR0PVNpKGx0KTtpZihBZS50eXBlPT09VHQudHlwZSYmQWUua2V5PT09VHQua2V5KXtzcihUdCk7dmFyIGk9VHQuY29tcG9uZW50LmRhO2kmJnVyKGksVmUpO3JldHVybn1KZShBZSl9KX0pLCgpPT57aWYoU2U9bnVsbCwhbS5kZWZhdWx0KXJldHVybiBudWxsO3ZhciBBZT1tLmRlZmF1bHQoKSxsdD1BZVswXTtpZihBZS5sZW5ndGg+MSlyZXR1cm4gVz1udWxsLEFlO2lmKCFkbihsdCl8fCEobHQuc2hhcGVGbGFnJjQpJiYhKGx0LnNoYXBlRmxhZyYxMjgpKXJldHVybiBXPW51bGwsbHQ7dmFyIFZlPVNpKGx0KSxUdD1WZS50eXBlLGk9RGkoVHIoVmUpP1ZlLnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTpUdCkse2luY2x1ZGU6bCxleGNsdWRlOmQsbWF4Ol99PWE7aWYobCYmKCFpfHwhamkobCxpKSl8fGQmJmkmJmppKGQsaSkpcmV0dXJuIFc9VmUsbHQ7dmFyIEE9VmUua2V5PT1udWxsP1R0OlZlLmtleSxDPU8uZ2V0KEEpO3JldHVybiBWZS5lbCYmKFZlPWNpKFZlKSxsdC5zaGFwZUZsYWcmMTI4JiYobHQuc3NDb250ZW50PVZlKSksU2U9QSxDPyhWZS5lbD1DLmVsLFZlLmNvbXBvbmVudD1DLmNvbXBvbmVudCxWZS50cmFuc2l0aW9uJiZ5aShWZSxWZS50cmFuc2l0aW9uKSxWZS5zaGFwZUZsYWd8PTUxMixGLmRlbGV0ZShBKSxGLmFkZChBKSk6KEYuYWRkKEEpLF8mJkYuc2l6ZT5wYXJzZUludChfLDEwKSYmYXQoRi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpKSxWZS5zaGFwZUZsYWd8PTI1NixXPVZlLG1pKGx0LnR5cGUpP2x0OlZlfX19LGZuPUVpO2Z1bmN0aW9uIGppKGEsdSl7cmV0dXJuIHkuaXNBcnJheShhKT9hLnNvbWUobT0+amkobSx1KSk6eS5pc1N0cmluZyhhKT9hLnNwbGl0KCIsIikuaW5jbHVkZXModSk6eS5pc1JlZ0V4cChhKT9hLnRlc3QodSk6ITF9ZnVuY3Rpb24gJHIoYSx1KXtFbihhLCJhIix1KX1mdW5jdGlvbiB0byhhLHUpe0VuKGEsImRhIix1KX1mdW5jdGlvbiBFbihhLHUpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpvbixTPWEuX193ZGN8fChhLl9fd2RjPSgpPT57Zm9yKHZhciBPPW07Tzspe2lmKE8uaXNEZWFjdGl2YXRlZClyZXR1cm47Tz1PLnBhcmVudH1yZXR1cm4gYSgpfSk7aWYoeGkodSxTLG0pLG0pZm9yKHZhciBJPW0ucGFyZW50O0kmJkkucGFyZW50OylQcihJLnBhcmVudC52bm9kZSkmJkhyKFMsdSxtLEkpLEk9SS5wYXJlbnR9ZnVuY3Rpb24gSHIoYSx1LG0sUyl7dmFyIEk9eGkodSxhLFMsITApO2NyKCgpPT57eS5yZW1vdmUoU1t1XSxJKX0sbSl9ZnVuY3Rpb24gc3IoYSl7YS5zaGFwZUZsYWcmPX4yNTYsYS5zaGFwZUZsYWcmPX41MTJ9ZnVuY3Rpb24gU2koYSl7cmV0dXJuIGEuc2hhcGVGbGFnJjEyOD9hLnNzQ29udGVudDphfWZ1bmN0aW9uIHhpKGEsdSl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm9uLFM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2lmKG0pe2lmKEZlLmlzUm9vdEhvb2soYSkmJm0hPT1tLnJvb3QmJihtPW0ucm9vdCxGZS5pc1Jvb3RJbW1lZGlhdGVIb29rKGEpKSl7dmFyIEk9bS5wcm94eTtQKHUuYmluZChJKSxtLGEsRmUuT05fTE9BRD09PWE/W0kuJHBhZ2Uub3B0aW9uc106W10pfXZhciBPPW1bYV18fChtW2FdPVtdKSxGPXUuX193ZWh8fCh1Ll9fd2VoPWZ1bmN0aW9uKCl7aWYoIW0uaXNVbm1vdW50ZWQpe1IucGF1c2VUcmFja2luZygpLGpuKG0pO2Zvcih2YXIgVz1hcmd1bWVudHMubGVuZ3RoLEc9bmV3IEFycmF5KFcpLGxlPTA7bGU8VztsZSsrKUdbbGVdPWFyZ3VtZW50c1tsZV07dmFyIFdlPVAodSxtLGEsRyk7cmV0dXJuIHFuKCksUi5yZXNldFRyYWNraW5nKCksV2V9fSk7cmV0dXJuIFM/Ty51bnNoaWZ0KEYpOk8ucHVzaChGKSxGfX12YXIgbXI9YT0+ZnVuY3Rpb24odSl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm9uO3JldHVybighaC5pc0luU1NSQ29tcG9uZW50U2V0dXB8fGE9PT0ic3AiKSYmeGkoYSxmdW5jdGlvbigpe3JldHVybiB1KC4uLmFyZ3VtZW50cyl9LG0pfSxRcj1tcigiYm0iKSxlcj1tcigibSIpLHRyPW1yKCJidSIpLEduPW1yKCJ1IiksbnI9bXIoImJ1bSIpLGNyPW1yKCJ1bSIpLGhvPW1yKCJzcCIpLGdvPW1yKCJydGciKSxObz1tcigicnRjIik7ZnVuY3Rpb24gbm8oYSl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm9uO3hpKCJlYyIsYSx1KX1mdW5jdGlvbiBrbyhhLHUpe3ZhciBtPUFuO2lmKG09PT1udWxsKXJldHVybiBhO2Zvcih2YXIgUz1GbyhtKXx8bS5wcm94eSxJPWEuZGlyc3x8KGEuZGlycz1bXSksTz0wO088dS5sZW5ndGg7TysrKXt2YXJbRixXLEcsbGU9eS5FTVBUWV9PQkpdPXVbT107RiYmKHkuaXNGdW5jdGlvbihGKSYmKEY9e21vdW50ZWQ6Rix1cGRhdGVkOkZ9KSxGLmRlZXAmJlZyKFcpLEkucHVzaCh7ZGlyOkYsaW5zdGFuY2U6Uyx2YWx1ZTpXLG9sZFZhbHVlOnZvaWQgMCxhcmc6Ryxtb2RpZmllcnM6bGV9KSl9cmV0dXJuIGF9ZnVuY3Rpb24ganIoYSx1LG0sUyl7Zm9yKHZhciBJPWEuZGlycyxPPXUmJnUuZGlycyxGPTA7RjxJLmxlbmd0aDtGKyspe3ZhciBXPUlbRl07TyYmKFcub2xkVmFsdWU9T1tGXS52YWx1ZSk7dmFyIEc9Vy5kaXJbU107RyYmKFIucGF1c2VUcmFja2luZygpLFAoRyxtLDgsW2EuZWwsVyxhLHVdKSxSLnJlc2V0VHJhY2tpbmcoKSl9fXZhciB4cj0iY29tcG9uZW50cyIscG89ImRpcmVjdGl2ZXMiO2Z1bmN0aW9uIFJvKGEsdSl7cmV0dXJuIE1pKHhyLGEsITAsdSl8fGF9dmFyIHJvPVN5bWJvbCgpO2Z1bmN0aW9uIEJpKGEpe3JldHVybiB5LmlzU3RyaW5nKGEpP01pKHhyLGEsITEpfHxhOmF8fHJvfWZ1bmN0aW9uIHZvKGEpe3JldHVybiBNaShwbyxhKX1mdW5jdGlvbiBNaShhLHUpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxTPUFufHxvbjtpZihTKXt2YXIgST1TLnR5cGU7aWYoYT09PXhyKXt2YXIgTz1EaShJLCExKTtpZihPJiYoTz09PXV8fE89PT15LmNhbWVsaXplKHUpfHxPPT09eS5jYXBpdGFsaXplKHkuY2FtZWxpemUodSkpKSlyZXR1cm4gSX12YXIgRj16aShTW2FdfHxJW2FdLHUpfHx6aShTLmFwcENvbnRleHRbYV0sdSk7cmV0dXJuIUYmJm0/STpGfX1mdW5jdGlvbiB6aShhLHUpe3JldHVybiBhJiYoYVt1XXx8YVt5LmNhbWVsaXplKHUpXXx8YVt5LmNhcGl0YWxpemUoeS5jYW1lbGl6ZSh1KSldKX1mdW5jdGlvbiBRbyhhLHUsbSxTKXt2YXIgSSxPPW0mJm1bU107aWYoeS5pc0FycmF5KGEpfHx5LmlzU3RyaW5nKGEpKXtJPW5ldyBBcnJheShhLmxlbmd0aCk7Zm9yKHZhciBGPTAsVz1hLmxlbmd0aDtGPFc7RisrKUlbRl09dShhW0ZdLEYsdm9pZCAwLE8mJk9bRl0pfWVsc2UgaWYodHlwZW9mIGE9PSJudW1iZXIiKXtJPW5ldyBBcnJheShhKTtmb3IodmFyIEc9MDtHPGE7RysrKUlbR109dShHKzEsRyx2b2lkIDAsTyYmT1tHXSl9ZWxzZSBpZih5LmlzT2JqZWN0KGEpKWlmKGFbU3ltYm9sLml0ZXJhdG9yXSlJPUFycmF5LmZyb20oYSwoWWUsSmUpPT51KFllLEplLHZvaWQgMCxPJiZPW0plXSkpO2Vsc2V7dmFyIGxlPU9iamVjdC5rZXlzKGEpO0k9bmV3IEFycmF5KGxlLmxlbmd0aCk7Zm9yKHZhciBXZT0wLGl0PWxlLmxlbmd0aDtXZTxpdDtXZSsrKXt2YXIgZ2U9bGVbV2VdO0lbV2VdPXUoYVtnZV0sZ2UsV2UsTyYmT1tXZV0pfX1lbHNlIEk9W107cmV0dXJuIG0mJihtW1NdPUkpLEl9ZnVuY3Rpb24gQihhLHUpe2Zvcih2YXIgbT1mdW5jdGlvbihJKXt2YXIgTz11W0ldO2lmKHkuaXNBcnJheShPKSlmb3IodmFyIEY9MDtGPE8ubGVuZ3RoO0YrKylhW09bRl0ubmFtZV09T1tGXS5mbjtlbHNlIE8mJihhW08ubmFtZV09Ty5rZXk/ZnVuY3Rpb24oKXt2YXIgVz1PLmZuKC4uLmFyZ3VtZW50cyk7cmV0dXJuIFcmJihXLmtleT1PLmtleSksV306Ty5mbil9LFM9MDtTPHUubGVuZ3RoO1MrKyltKFMpO3JldHVybiBhfWZ1bmN0aW9uIFEoYSx1KXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sUz1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMCxJPWFyZ3VtZW50cy5sZW5ndGg+ND9hcmd1bWVudHNbNF06dm9pZCAwO2lmKEFuLmlzQ0V8fEFuLnBhcmVudCYmVHIoQW4ucGFyZW50KSYmQW4ucGFyZW50LmlzQ0UpcmV0dXJuIHUhPT0iZGVmYXVsdCImJihtLm5hbWU9dSksVXQoInNsb3QiLG0sUyYmUygpKTt2YXIgTz1hW3VdO08mJk8uX2MmJihPLl9kPSExKSxDZSgpO3ZhciBGPU8mJmhlKE8obSkpLFc9TXQocSx7a2V5Om0ua2V5fHxGJiZGLmtleXx8Il8iLmNvbmNhdCh1KX0sRnx8KFM/UygpOltdKSxGJiZhLl89PT0xPzY0Oi0yKTtyZXR1cm4hSSYmVy5zY29wZUlkJiYoVy5zbG90U2NvcGVJZHM9W1cuc2NvcGVJZCsiLXMiXSksTyYmTy5fYyYmKE8uX2Q9ITApLFd9ZnVuY3Rpb24gaGUoYSl7cmV0dXJuIGEuc29tZSh1PT5kbih1KT8hKHUudHlwZT09PWNlfHx1LnR5cGU9PT1xJiYhaGUodS5jaGlsZHJlbikpOiEwKT9hOm51bGx9ZnVuY3Rpb24gYWUoYSx1KXt2YXIgbT17fTtmb3IodmFyIFMgaW4gYSltW3UmJi9bQS1aXS8udGVzdChTKT8ib246Ii5jb25jYXQoUyk6eS50b0hhbmRsZXJLZXkoUyldPWFbU107cmV0dXJuIG19dmFyIGRlPWE9PmE/QWkoYSk/Rm8oYSl8fGEucHJveHk6ZGUoYS5wYXJlbnQpOm51bGwsdnQ9eS5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSx7JDphPT5hLCRlbDphPT5hLnZub2RlLmVsLCRkYXRhOmE9PmEuZGF0YSwkcHJvcHM6YT0+YS5wcm9wcywkYXR0cnM6YT0+YS5hdHRycywkc2xvdHM6YT0+YS5zbG90cywkcmVmczphPT5hLnJlZnMsJHBhcmVudDphPT5kZShhLnBhcmVudCksJHJvb3Q6YT0+ZGUoYS5yb290KSwkZW1pdDphPT5hLmVtaXQsJG9wdGlvbnM6YT0+RG4oYSksJGZvcmNlVXBkYXRlOmE9PmEuZnx8KGEuZj0oKT0+U24oYS51cGRhdGUpKSwkbmV4dFRpY2s6YT0+YS5ufHwoYS5uPXFyLmJpbmQoYS5wcm94eSkpLCR3YXRjaDphPT5raS5iaW5kKGEpfSksa3Q9KGEsdSk9PmEhPT15LkVNUFRZX09CSiYmIWEuX19pc1NjcmlwdFNldHVwJiZ5Lmhhc093bihhLHUpLFg9e2dldChhLHUpe3ZhcntfOm19PWEse2N0eDpTLHNldHVwU3RhdGU6SSxkYXRhOk8scHJvcHM6RixhY2Nlc3NDYWNoZTpXLHR5cGU6RyxhcHBDb250ZXh0OmxlfT1tLFdlO2lmKHVbMF0hPT0iJCIpe3ZhciBpdD1XW3VdO2lmKGl0IT09dm9pZCAwKXN3aXRjaChpdCl7Y2FzZSAxOnJldHVybiBJW3VdO2Nhc2UgMjpyZXR1cm4gT1t1XTtjYXNlIDQ6cmV0dXJuIFNbdV07Y2FzZSAzOnJldHVybiBGW3VdfWVsc2V7aWYoa3QoSSx1KSlyZXR1cm4gV1t1XT0xLElbdV07aWYoTyE9PXkuRU1QVFlfT0JKJiZ5Lmhhc093bihPLHUpKXJldHVybiBXW3VdPTIsT1t1XTtpZigoV2U9bS5wcm9wc09wdGlvbnNbMF0pJiZ5Lmhhc093bihXZSx1KSlyZXR1cm4gV1t1XT0zLEZbdV07aWYoUyE9PXkuRU1QVFlfT0JKJiZ5Lmhhc093bihTLHUpKXJldHVybiBXW3VdPTQsU1t1XTtpZSYmKFdbdV09MCl9fXZhciBnZT12dFt1XSxZZSxKZTtpZihnZSlyZXR1cm4gdT09PSIkYXR0cnMiJiZSLnRyYWNrKG0sImdldCIsdSksZ2UobSk7aWYoKFllPUcuX19jc3NNb2R1bGVzKSYmKFllPVllW3VdKSlyZXR1cm4gWWU7aWYoUyE9PXkuRU1QVFlfT0JKJiZ5Lmhhc093bihTLHUpKXJldHVybiBXW3VdPTQsU1t1XTtpZihKZT1sZS5jb25maWcuZ2xvYmFsUHJvcGVydGllcyx5Lmhhc093bihKZSx1KSlyZXR1cm4gSmVbdV19LHNldChhLHUsbSl7dmFye186U309YSx7ZGF0YTpJLHNldHVwU3RhdGU6TyxjdHg6Rn09UztyZXR1cm4ga3QoTyx1KT8oT1t1XT1tLCEwKTpJIT09eS5FTVBUWV9PQkomJnkuaGFzT3duKEksdSk/KElbdV09bSwhMCk6eS5oYXNPd24oUy5wcm9wcyx1KXx8dVswXT09PSIkIiYmdS5zbGljZSgxKWluIFM/ITE6KEZbdV09bSwhMCl9LGhhcyhhLHUpe3ZhcntfOntkYXRhOm0sc2V0dXBTdGF0ZTpTLGFjY2Vzc0NhY2hlOkksY3R4Ok8sYXBwQ29udGV4dDpGLHByb3BzT3B0aW9uczpXfX09YSxHO3JldHVybiEhSVt1XXx8bSE9PXkuRU1QVFlfT0JKJiZ5Lmhhc093bihtLHUpfHxrdChTLHUpfHwoRz1XWzBdKSYmeS5oYXNPd24oRyx1KXx8eS5oYXNPd24oTyx1KXx8eS5oYXNPd24odnQsdSl8fHkuaGFzT3duKEYuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsdSl9LGRlZmluZVByb3BlcnR5KGEsdSxtKXtyZXR1cm4gbS5nZXQhPW51bGw/YS5fLmFjY2Vzc0NhY2hlW3VdPTA6eS5oYXNPd24obSwidmFsdWUiKSYmdGhpcy5zZXQoYSx1LG0udmFsdWUsbnVsbCksUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShhLHUsbSl9fSxLPXkuZXh0ZW5kKHt9LFgse2dldChhLHUpe2lmKHUhPT1TeW1ib2wudW5zY29wYWJsZXMpcmV0dXJuIFguZ2V0KGEsdSxhKX0saGFzKGEsdSl7dmFyIG09dVswXSE9PSJfIiYmIXkuaXNHbG9iYWxseVdoaXRlbGlzdGVkKHUpO3JldHVybiBtfX0pLGllPSEwO2Z1bmN0aW9uIE5lKGEpe3ZhciB1PURuKGEpLG09YS5wcm94eSxTPWEuY3R4O2llPSExLHUuYmVmb3JlQ3JlYXRlJiZYdCh1LmJlZm9yZUNyZWF0ZSxhLCJiYyIpO3ZhcntkYXRhOkksY29tcHV0ZWQ6TyxtZXRob2RzOkYsd2F0Y2g6Vyxwcm92aWRlOkcsaW5qZWN0OmxlLGNyZWF0ZWQ6V2UsYmVmb3JlTW91bnQ6aXQsbW91bnRlZDpnZSxiZWZvcmVVcGRhdGU6WWUsdXBkYXRlZDpKZSxhY3RpdmF0ZWQ6bXQsZGVhY3RpdmF0ZWQ6YXQsYmVmb3JlRGVzdHJveTpTZSxiZWZvcmVVbm1vdW50OkVlLGRlc3Ryb3llZDpBZSx1bm1vdW50ZWQ6bHQscmVuZGVyOlZlLHJlbmRlclRyYWNrZWQ6VHQscmVuZGVyVHJpZ2dlcmVkOmksZXJyb3JDYXB0dXJlZDpsLHNlcnZlclByZWZldGNoOmQsZXhwb3NlOl8saW5oZXJpdEF0dHJzOkEsY29tcG9uZW50czpDLGRpcmVjdGl2ZXM6ayxmaWx0ZXJzOkR9PXUsSD1udWxsO2lmKGxlJiZzdChsZSxTLEgsYS5hcHBDb250ZXh0LmNvbmZpZy51bndyYXBJbmplY3RlZFJlZiksRilmb3IodmFyIG5lIGluIEYpe3ZhciB2ZT1GW25lXTt5LmlzRnVuY3Rpb24odmUpJiYoU1tuZV09dmUuYmluZChtKSl9aWYoSSl7dmFyIEJlPUkuY2FsbChtLG0pO3kuaXNPYmplY3QoQmUpJiYoYS5kYXRhPVIucmVhY3RpdmUoQmUpKX1pZihpZT0hMCxPKXt2YXIgdWU9ZnVuY3Rpb24oeWUpe3ZhciBMZT1PW3llXSxPZT15LmlzRnVuY3Rpb24oTGUpP0xlLmJpbmQobSxtKTp5LmlzRnVuY3Rpb24oTGUuZ2V0KT9MZS5nZXQuYmluZChtLG0pOnkuTk9PUCxidD0heS5pc0Z1bmN0aW9uKExlKSYmeS5pc0Z1bmN0aW9uKExlLnNldCk/TGUuc2V0LmJpbmQobSk6eS5OT09QLEN0PWJvKHtnZXQ6T2Usc2V0OmJ0fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFMseWUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+Q3QudmFsdWUsc2V0OktlPT5DdC52YWx1ZT1LZX0pfTtmb3IodmFyIGtlIGluIE8pdWUoa2UpfWlmKFcpZm9yKHZhciBHZSBpbiBXKXhuKFdbR2VdLFMsbSxHZSk7aWYoRyl7dmFyIHV0PXkuaXNGdW5jdGlvbihHKT9HLmNhbGwobSk6RztSZWZsZWN0Lm93bktleXModXQpLmZvckVhY2goeWU9Pntrcih5ZSx1dFt5ZV0pfSl9V2UmJlh0KFdlLGEsImMiKTtmdW5jdGlvbiBRZSh5ZSxMZSl7eS5pc0FycmF5KExlKT9MZS5mb3JFYWNoKE9lPT55ZShPZS5iaW5kKG0pKSk6TGUmJnllKExlLmJpbmQobSkpfWlmKFFlKFFyLGl0KSxRZShlcixnZSksUWUodHIsWWUpLFFlKEduLEplKSxRZSgkcixtdCksUWUodG8sYXQpLFFlKG5vLGwpLFFlKE5vLFR0KSxRZShnbyxpKSxRZShucixFZSksUWUoY3IsbHQpLFFlKGhvLGQpLHkuaXNBcnJheShfKSlpZihfLmxlbmd0aCl7dmFyIFJlPWEuZXhwb3NlZHx8KGEuZXhwb3NlZD17fSk7Xy5mb3JFYWNoKHllPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KFJlLHllLHtnZXQ6KCk9Pm1beWVdLHNldDpMZT0+bVt5ZV09TGV9KX0pfWVsc2UgYS5leHBvc2VkfHwoYS5leHBvc2VkPXt9KTtWZSYmYS5yZW5kZXI9PT15Lk5PT1AmJihhLnJlbmRlcj1WZSksQSE9bnVsbCYmKGEuaW5oZXJpdEF0dHJzPUEpLEMmJihhLmNvbXBvbmVudHM9QyksayYmKGEuZGlyZWN0aXZlcz1rKTt2YXIgbWU9YS5hcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLiRhcHBseU9wdGlvbnM7bWUmJm1lKHUsYSxtKX1mdW5jdGlvbiBzdChhLHUpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMTt5LmlzQXJyYXkoYSkmJihhPUJvKGEpKTt2YXIgUz1mdW5jdGlvbihPKXt2YXIgRj1hW09dLFc9dm9pZCAwO3kuaXNPYmplY3QoRik/ImRlZmF1bHQiaW4gRj9XPU5uKEYuZnJvbXx8TyxGLmRlZmF1bHQsITApOlc9Tm4oRi5mcm9tfHxPKTpXPU5uKEYpLFIuaXNSZWYoVykmJm0/T2JqZWN0LmRlZmluZVByb3BlcnR5KHUsTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5XLnZhbHVlLHNldDpHPT5XLnZhbHVlPUd9KTp1W09dPVd9O2Zvcih2YXIgSSBpbiBhKVMoSSl9ZnVuY3Rpb24gWHQoYSx1LG0pe1AoeS5pc0FycmF5KGEpP2EubWFwKFM9PlMuYmluZCh1LnByb3h5KSk6YS5iaW5kKHUucHJveHkpLHUsbSl9ZnVuY3Rpb24geG4oYSx1LG0sUyl7dmFyIEk9Uy5pbmNsdWRlcygiLiIpP0lvKG0sUyk6KCk9Pm1bU107aWYoeS5pc1N0cmluZyhhKSl7dmFyIE89dVthXTt5LmlzRnVuY3Rpb24oTykmJkZyKEksTyl9ZWxzZSBpZih5LmlzRnVuY3Rpb24oYSkpRnIoSSxhLmJpbmQobSkpO2Vsc2UgaWYoeS5pc09iamVjdChhKSlpZih5LmlzQXJyYXkoYSkpYS5mb3JFYWNoKFc9PnhuKFcsdSxtLFMpKTtlbHNle3ZhciBGPXkuaXNGdW5jdGlvbihhLmhhbmRsZXIpP2EuaGFuZGxlci5iaW5kKG0pOnVbYS5oYW5kbGVyXTt5LmlzRnVuY3Rpb24oRikmJkZyKEksRixhKX19ZnVuY3Rpb24gRG4oYSl7dmFyIHU9YS50eXBlLHttaXhpbnM6bSxleHRlbmRzOlN9PXUse21peGluczpJLG9wdGlvbnNDYWNoZTpPLGNvbmZpZzp7b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOkZ9fT1hLmFwcENvbnRleHQsVz1PLmdldCh1KSxHO3JldHVybiBXP0c9VzohSS5sZW5ndGgmJiFtJiYhUz9HPXU6KEc9e30sSS5sZW5ndGgmJkkuZm9yRWFjaChsZT0+X3IoRyxsZSxGLCEwKSksX3IoRyx1LEYpKSx5LmlzT2JqZWN0KHUpJiZPLnNldCh1LEcpLEd9ZnVuY3Rpb24gX3IoYSx1LG0pe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSx7bWl4aW5zOkksZXh0ZW5kczpPfT11O08mJl9yKGEsTyxtLCEwKSxJJiZJLmZvckVhY2goRz0+X3IoYSxHLG0sITApKTtmb3IodmFyIEYgaW4gdSlpZighKFMmJkY9PT0iZXhwb3NlIikpe3ZhciBXPUJyW0ZdfHxtJiZtW0ZdO2FbRl09Vz9XKGFbRl0sdVtGXSk6dVtGXX1yZXR1cm4gYX12YXIgQnI9e2RhdGE6bW8scHJvcHM6WW4sZW1pdHM6WW4sbWV0aG9kczpZbixjb21wdXRlZDpZbixiZWZvcmVDcmVhdGU6TG4sY3JlYXRlZDpMbixiZWZvcmVNb3VudDpMbixtb3VudGVkOkxuLGJlZm9yZVVwZGF0ZTpMbix1cGRhdGVkOkxuLGJlZm9yZURlc3Ryb3k6TG4sYmVmb3JlVW5tb3VudDpMbixkZXN0cm95ZWQ6TG4sdW5tb3VudGVkOkxuLGFjdGl2YXRlZDpMbixkZWFjdGl2YXRlZDpMbixlcnJvckNhcHR1cmVkOkxuLHNlcnZlclByZWZldGNoOkxuLGNvbXBvbmVudHM6WW4sZGlyZWN0aXZlczpZbix3YXRjaDpGbixwcm92aWRlOm1vLGluamVjdDp4b307ZnVuY3Rpb24gbW8oYSx1KXtyZXR1cm4gdT9hP2Z1bmN0aW9uKCl7cmV0dXJuIHkuZXh0ZW5kKHkuaXNGdW5jdGlvbihhKT9hLmNhbGwodGhpcyx0aGlzKTphLHkuaXNGdW5jdGlvbih1KT91LmNhbGwodGhpcyx0aGlzKTp1KX06dTphfWZ1bmN0aW9uIHhvKGEsdSl7cmV0dXJuIFluKEJvKGEpLEJvKHUpKX1mdW5jdGlvbiBCbyhhKXtpZih5LmlzQXJyYXkoYSkpe2Zvcih2YXIgdT17fSxtPTA7bTxhLmxlbmd0aDttKyspdVthW21dXT1hW21dO3JldHVybiB1fXJldHVybiBhfWZ1bmN0aW9uIExuKGEsdSl7cmV0dXJuIGE/Wy4uLm5ldyBTZXQoW10uY29uY2F0KGEsdSkpXTp1fWZ1bmN0aW9uIFluKGEsdSl7cmV0dXJuIGE/eS5leHRlbmQoeS5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxhKSx1KTp1fWZ1bmN0aW9uIEZuKGEsdSl7aWYoIWEpcmV0dXJuIHU7aWYoIXUpcmV0dXJuIGE7dmFyIG09eS5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxhKTtmb3IodmFyIFMgaW4gdSltW1NdPUxuKGFbU10sdVtTXSk7cmV0dXJuIG19ZnVuY3Rpb24gd2koYSx1LG0pe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxJPXt9LE89e307eS5kZWYoTyxlbiwxKSxhLnByb3BzRGVmYXVsdHM9T2JqZWN0LmNyZWF0ZShudWxsKSxoYShhLHUsSSxPKTtmb3IodmFyIEYgaW4gYS5wcm9wc09wdGlvbnNbMF0pRiBpbiBJfHwoSVtGXT12b2lkIDApO20/YS5wcm9wcz1TP0k6Ui5zaGFsbG93UmVhY3RpdmUoSSk6YS50eXBlLnByb3BzP2EucHJvcHM9STphLnByb3BzPU8sYS5hdHRycz1PfWZ1bmN0aW9uIGlzKGEsdSxtLFMpe3Zhcntwcm9wczpJLGF0dHJzOk8sdm5vZGU6e3BhdGNoRmxhZzpGfX09YSxXPVIudG9SYXcoSSksW0ddPWEucHJvcHNPcHRpb25zLGxlPSExO2lmKChTfHxGPjApJiYhKEYmMTYpKXtpZihGJjgpZm9yKHZhciBXZT1hLnZub2RlLmR5bmFtaWNQcm9wcyxpdD0wO2l0PFdlLmxlbmd0aDtpdCsrKXt2YXIgZ2U9V2VbaXRdO2lmKCFXbihhLmVtaXRzT3B0aW9ucyxnZSkpe3ZhciBZZT11W2dlXTtpZihHKWlmKHkuaGFzT3duKE8sZ2UpKVllIT09T1tnZV0mJihPW2dlXT1ZZSxsZT0hMCk7ZWxzZXt2YXIgSmU9eS5jYW1lbGl6ZShnZSk7SVtKZV09YnIoRyxXLEplLFllLGEsITEpfWVsc2UgWWUhPT1PW2dlXSYmKE9bZ2VdPVllLGxlPSEwKX19fWVsc2V7aGEoYSx1LEksTykmJihsZT0hMCk7dmFyIG10O2Zvcih2YXIgYXQgaW4gVykoIXV8fCF5Lmhhc093bih1LGF0KSYmKChtdD15Lmh5cGhlbmF0ZShhdCkpPT09YXR8fCF5Lmhhc093bih1LG10KSkpJiYoRz9tJiYobVthdF0hPT12b2lkIDB8fG1bbXRdIT09dm9pZCAwKSYmKElbYXRdPWJyKEcsVyxhdCx2b2lkIDAsYSwhMCkpOmRlbGV0ZSBJW2F0XSk7aWYoTyE9PVcpZm9yKHZhciBTZSBpbiBPKSghdXx8IXkuaGFzT3duKHUsU2UpJiYhMCkmJihkZWxldGUgT1tTZV0sbGU9ITApfWxlJiZSLnRyaWdnZXIoYSwic2V0IiwiJGF0dHJzIil9ZnVuY3Rpb24gaGEoYSx1LG0sUyl7dmFyW0ksT109YS5wcm9wc09wdGlvbnMsRj0hMSxXO2lmKHUpe2Zvcih2YXIgRyBpbiB1KWlmKCF5LmlzUmVzZXJ2ZWRQcm9wKEcpKXt2YXIgbGU9dVtHXSxXZT12b2lkIDA7SSYmeS5oYXNPd24oSSxXZT15LmNhbWVsaXplKEcpKT8hT3x8IU8uaW5jbHVkZXMoV2UpP21bV2VdPWxlOihXfHwoVz17fSkpW1dlXT1sZTpXbihhLmVtaXRzT3B0aW9ucyxHKXx8KCEoRyBpbiBTKXx8bGUhPT1TW0ddKSYmKFNbR109bGUsRj0hMCl9fWlmKE8pZm9yKHZhciBpdD1SLnRvUmF3KG0pLGdlPVd8fHkuRU1QVFlfT0JKLFllPTA7WWU8Ty5sZW5ndGg7WWUrKyl7dmFyIEplPU9bWWVdO21bSmVdPWJyKEksaXQsSmUsZ2VbSmVdLGEsIXkuaGFzT3duKGdlLEplKSl9cmV0dXJuIEZ9ZnVuY3Rpb24gYnIoYSx1LG0sUyxJLE8pe3ZhciBGPWFbbV07aWYoRiE9bnVsbCl7dmFyIFc9eS5oYXNPd24oRiwiZGVmYXVsdCIpO2lmKFcmJlM9PT12b2lkIDApe3ZhciBHPUYuZGVmYXVsdDtpZihGLnR5cGUhPT1GdW5jdGlvbiYmeS5pc0Z1bmN0aW9uKEcpKXt2YXJ7cHJvcHNEZWZhdWx0czpsZX09STttIGluIGxlP1M9bGVbbV06KGpuKEkpLFM9bGVbbV09Ry5jYWxsKG51bGwsdSkscW4oKSl9ZWxzZSBTPUd9RlswXSYmKE8mJiFXP1M9ITE6RlsxXSYmKFM9PT0iInx8Uz09PXkuaHlwaGVuYXRlKG0pKSYmKFM9ITApKX1yZXR1cm4gU31mdW5jdGlvbiBUYShhLHUpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxTPXUucHJvcHNDYWNoZSxJPVMuZ2V0KGEpO2lmKEkpcmV0dXJuIEk7dmFyIE89YS5wcm9wcyxGPXt9LFc9W10sRz0hMTtpZigheS5pc0Z1bmN0aW9uKGEpKXt2YXIgbGU9QWU9PntHPSEwO3ZhcltsdCxWZV09VGEoQWUsdSwhMCk7eS5leHRlbmQoRixsdCksVmUmJlcucHVzaCguLi5WZSl9OyFtJiZ1Lm1peGlucy5sZW5ndGgmJnUubWl4aW5zLmZvckVhY2gobGUpLGEuZXh0ZW5kcyYmbGUoYS5leHRlbmRzKSxhLm1peGlucyYmYS5taXhpbnMuZm9yRWFjaChsZSl9aWYoIU8mJiFHKXJldHVybiB5LmlzT2JqZWN0KGEpJiZTLnNldChhLHkuRU1QVFlfQVJSKSx5LkVNUFRZX0FSUjtpZih5LmlzQXJyYXkoTykpZm9yKHZhciBXZT0wO1dlPE8ubGVuZ3RoO1dlKyspe3ZhciBpdD15LmNhbWVsaXplKE9bV2VdKTtMYShpdCkmJihGW2l0XT15LkVNUFRZX09CSil9ZWxzZSBpZihPKWZvcih2YXIgZ2UgaW4gTyl7dmFyIFllPXkuY2FtZWxpemUoZ2UpO2lmKExhKFllKSl7dmFyIEplPU9bZ2VdLG10PUZbWWVdPXkuaXNBcnJheShKZSl8fHkuaXNGdW5jdGlvbihKZSk/e3R5cGU6SmV9Ok9iamVjdC5hc3NpZ24oe30sSmUpO2lmKG10KXt2YXIgYXQ9VWEoQm9vbGVhbixtdC50eXBlKSxTZT1VYShTdHJpbmcsbXQudHlwZSk7bXRbMF09YXQ+LTEsbXRbMV09U2U8MHx8YXQ8U2UsKGF0Pi0xfHx5Lmhhc093bihtdCwiZGVmYXVsdCIpKSYmVy5wdXNoKFllKX19fXZhciBFZT1bRixXXTtyZXR1cm4geS5pc09iamVjdChhKSYmUy5zZXQoYSxFZSksRWV9ZnVuY3Rpb24gTGEoYSl7cmV0dXJuIGFbMF0hPT0iJCJ9ZnVuY3Rpb24gRmEoYSl7dmFyIHU9YSYmYS50b1N0cmluZygpLm1hdGNoKC9eXHMqKGZ1bmN0aW9ufGNsYXNzKSAoXHcrKS8pO3JldHVybiB1P3VbMl06YT09PW51bGw/Im51bGwiOiIifWZ1bmN0aW9uIFZhKGEsdSl7cmV0dXJuIEZhKGEpPT09RmEodSl9ZnVuY3Rpb24gVWEoYSx1KXtyZXR1cm4geS5pc0FycmF5KHUpP3UuZmluZEluZGV4KG09PlZhKG0sYSkpOnkuaXNGdW5jdGlvbih1KSYmVmEodSxhKT8wOi0xfXZhciBnYT1hPT5hWzBdPT09Il8ifHxhPT09IiRzdGFibGUiLFBhPWE9PnkuaXNBcnJheShhKT9hLm1hcChVbik6W1VuKGEpXSxWbj0oYSx1LG0pPT57aWYodS5fbilyZXR1cm4gdTt2YXIgUz1VaShmdW5jdGlvbigpe3JldHVybiBQYSh1KC4uLmFyZ3VtZW50cykpfSxtKTtyZXR1cm4gUy5fYz0hMSxTfSxNbz0oYSx1LG0pPT57dmFyIFM9YS5fY3R4O2Zvcih2YXIgSSBpbiBhKWlmKCFnYShJKSl7dmFyIE89YVtJXTt5LmlzRnVuY3Rpb24oTyk/dVtJXT1WbihJLE8sUyk6TyE9bnVsbCYmZnVuY3Rpb24oKXt2YXIgRj1QYShPKTt1W0ldPSgpPT5GfSgpfX0sZWE9KGEsdSk9Pnt2YXIgbT1QYSh1KTthLnNsb3RzLmRlZmF1bHQ9KCk9Pm19LFdpPShhLHUpPT57aWYoYS52bm9kZS5zaGFwZUZsYWcmMzIpe3ZhciBtPXUuXzttPyhhLnNsb3RzPVIudG9SYXcodSkseS5kZWYodSwiXyIsbSkpOk1vKHUsYS5zbG90cz17fSl9ZWxzZSBhLnNsb3RzPXt9LHUmJmVhKGEsdSk7eS5kZWYoYS5zbG90cyxlbiwxKX0sb3M9KGEsdSxtKT0+e3Zhcnt2bm9kZTpTLHNsb3RzOkl9PWEsTz0hMCxGPXkuRU1QVFlfT0JKO2lmKFMuc2hhcGVGbGFnJjMyKXt2YXIgVz11Ll87Vz9tJiZXPT09MT9PPSExOih5LmV4dGVuZChJLHUpLCFtJiZXPT09MSYmZGVsZXRlIEkuXyk6KE89IXUuJHN0YWJsZSxNbyh1LEkpKSxGPXV9ZWxzZSB1JiYoZWEoYSx1KSxGPXtkZWZhdWx0OjF9KTtpZihPKWZvcih2YXIgRyBpbiBJKSFnYShHKSYmIShHIGluIEYpJiZkZWxldGUgSVtHXX07ZnVuY3Rpb24gYXMoKXtyZXR1cm57YXBwOm51bGwsY29uZmlnOntpc05hdGl2ZVRhZzp5Lk5PLHBlcmZvcm1hbmNlOiExLGdsb2JhbFByb3BlcnRpZXM6e30sb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOnt9LGVycm9ySGFuZGxlcjp2b2lkIDAsd2FybkhhbmRsZXI6dm9pZCAwLGNvbXBpbGVyT3B0aW9uczp7fX0sbWl4aW5zOltdLGNvbXBvbmVudHM6e30sZGlyZWN0aXZlczp7fSxwcm92aWRlczpPYmplY3QuY3JlYXRlKG51bGwpLG9wdGlvbnNDYWNoZTpuZXcgV2Vha01hcCxwcm9wc0NhY2hlOm5ldyBXZWFrTWFwLGVtaXRzQ2FjaGU6bmV3IFdlYWtNYXB9fXZhciBEbz0wO2Z1bmN0aW9uIHNzKGEsdSl7cmV0dXJuIGZ1bmN0aW9uKFMpe3ZhciBJPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsO3kuaXNGdW5jdGlvbihTKXx8KFM9T2JqZWN0LmFzc2lnbih7fSxTKSksSSE9bnVsbCYmIXkuaXNPYmplY3QoSSkmJihJPW51bGwpO3ZhciBPPWFzKCksRj1uZXcgU2V0LFc9ITEsRz1PLmFwcD17X3VpZDpEbysrLF9jb21wb25lbnQ6UyxfcHJvcHM6SSxfY29udGFpbmVyOm51bGwsX2NvbnRleHQ6TyxfaW5zdGFuY2U6bnVsbCx2ZXJzaW9uOnBzLGdldCBjb25maWcoKXtyZXR1cm4gTy5jb25maWd9LHNldCBjb25maWcobGUpe30sdXNlKGxlKXtmb3IodmFyIFdlPWFyZ3VtZW50cy5sZW5ndGgsaXQ9bmV3IEFycmF5KFdlPjE/V2UtMTowKSxnZT0xO2dlPFdlO2dlKyspaXRbZ2UtMV09YXJndW1lbnRzW2dlXTtyZXR1cm4gRi5oYXMobGUpfHwobGUmJnkuaXNGdW5jdGlvbihsZS5pbnN0YWxsKT8oRi5hZGQobGUpLGxlLmluc3RhbGwoRywuLi5pdCkpOnkuaXNGdW5jdGlvbihsZSkmJihGLmFkZChsZSksbGUoRywuLi5pdCkpKSxHfSxtaXhpbihsZSl7cmV0dXJuIE8ubWl4aW5zLmluY2x1ZGVzKGxlKXx8Ty5taXhpbnMucHVzaChsZSksR30sY29tcG9uZW50KGxlLFdlKXtyZXR1cm4gV2U/KE8uY29tcG9uZW50c1tsZV09V2UsRyk6Ty5jb21wb25lbnRzW2xlXX0sZGlyZWN0aXZlKGxlLFdlKXtyZXR1cm4gV2U/KE8uZGlyZWN0aXZlc1tsZV09V2UsRyk6Ty5kaXJlY3RpdmVzW2xlXX0sbW91bnQobGUsV2UsaXQpe2lmKCFXKXt2YXIgZ2U9VXQoUyxJKTtyZXR1cm4gZ2UuYXBwQ29udGV4dD1PLFdlJiZ1P3UoZ2UsbGUpOmEoZ2UsbGUsaXQpLFc9ITAsRy5fY29udGFpbmVyPWxlLGxlLl9fdnVlX2FwcF9fPUcsRy5faW5zdGFuY2U9Z2UuY29tcG9uZW50LEZvKGdlLmNvbXBvbmVudCl8fGdlLmNvbXBvbmVudC5wcm94eX19LHVubW91bnQoKXtXJiYoYShudWxsLEcuX2NvbnRhaW5lciksZGVsZXRlIEcuX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyl9LHByb3ZpZGUobGUsV2Upe3JldHVybiBPLnByb3ZpZGVzW2xlXT1XZSxHfX07cmV0dXJuIEd9fWZ1bmN0aW9uIGlvKGEsdSxtLFMpe3ZhciBJPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMTtpZih5LmlzQXJyYXkoYSkpe2EuZm9yRWFjaCgobXQsYXQpPT5pbyhtdCx1JiYoeS5pc0FycmF5KHUpP3VbYXRdOnUpLG0sUyxJKSk7cmV0dXJufWlmKCEoVHIoUykmJiFJKSl7dmFyIE89Uy5zaGFwZUZsYWcmND9GbyhTLmNvbXBvbmVudCl8fFMuY29tcG9uZW50LnByb3h5OlMuZWwsRj1JP251bGw6Tyx7aTpXLHI6R309YSxsZT11JiZ1LnIsV2U9Vy5yZWZzPT09eS5FTVBUWV9PQko/Vy5yZWZzPXt9OlcucmVmcyxpdD1XLnNldHVwU3RhdGU7aWYobGUhPW51bGwmJmxlIT09RyYmKHkuaXNTdHJpbmcobGUpPyhXZVtsZV09bnVsbCx5Lmhhc093bihpdCxsZSkmJihpdFtsZV09bnVsbCkpOlIuaXNSZWYobGUpJiYobGUudmFsdWU9bnVsbCkpLHkuaXNGdW5jdGlvbihHKSlPdChHLFcsMTIsW0YsV2VdKTtlbHNle3ZhciBnZT15LmlzU3RyaW5nKEcpLFllPVIuaXNSZWYoRyk7aWYoZ2V8fFllKXt2YXIgSmU9KCk9PntpZihhLmYpe3ZhciBtdD1nZT95Lmhhc093bihpdCxHKT9pdFtHXTpXZVtHXTpHLnZhbHVlO0k/eS5pc0FycmF5KG10KSYmeS5yZW1vdmUobXQsTyk6eS5pc0FycmF5KG10KT9tdC5pbmNsdWRlcyhPKXx8bXQucHVzaChPKTpnZT8oV2VbR109W09dLHkuaGFzT3duKGl0LEcpJiYoaXRbR109V2VbR10pKTooRy52YWx1ZT1bT10sYS5rJiYoV2VbYS5rXT1HLnZhbHVlKSl9ZWxzZSBnZT8oV2VbR109Rix5Lmhhc093bihpdCxHKSYmKGl0W0ddPUYpKTpZZSYmKEcudmFsdWU9RixhLmsmJihXZVthLmtdPUYpKX07Rj8oSmUuaWQ9LTEsdXIoSmUsbSkpOkplKCl9fX19dmFyIHNpPSExLENpPWE9Pi9zdmcvLnRlc3QoYS5uYW1lc3BhY2VVUkkpJiZhLnRhZ05hbWUhPT0iZm9yZWlnbk9iamVjdCIsR2k9YT0+YS5ub2RlVHlwZT09PTg7ZnVuY3Rpb24gbGkoYSl7dmFye210OnUscDptLG86e3BhdGNoUHJvcDpTLGNyZWF0ZVRleHQ6SSxuZXh0U2libGluZzpPLHBhcmVudE5vZGU6RixyZW1vdmU6VyxpbnNlcnQ6RyxjcmVhdGVDb21tZW50OmxlfX09YSxXZT0oU2UsRWUpPT57aWYoIUVlLmhhc0NoaWxkTm9kZXMoKSl7bShudWxsLFNlLEVlKSxQbigpLEVlLl92bm9kZT1TZTtyZXR1cm59c2k9ITEsaXQoRWUuZmlyc3RDaGlsZCxTZSxudWxsLG51bGwsbnVsbCksUG4oKSxFZS5fdm5vZGU9U2Usc2kmJmNvbnNvbGUuZXJyb3IoIkh5ZHJhdGlvbiBjb21wbGV0ZWQgYnV0IGNvbnRhaW5zIG1pc21hdGNoZXMuIil9LGl0PWZ1bmN0aW9uKFNlLEVlLEFlLGx0LFZlKXt2YXIgVHQ9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExLGk9R2koU2UpJiZTZS5kYXRhPT09IlsiLGw9KCk9Pm10KFNlLEVlLEFlLGx0LFZlLGkpLHt0eXBlOmQscmVmOl8sc2hhcGVGbGFnOkEscGF0Y2hGbGFnOkN9PUVlLGs9U2Uubm9kZVR5cGU7RWUuZWw9U2UsQz09PS0yJiYoVHQ9ITEsRWUuZHluYW1pY0NoaWxkcmVuPW51bGwpO3ZhciBEPW51bGw7c3dpdGNoKGQpe2Nhc2UgdGU6ayE9PTM/RWUuY2hpbGRyZW49PT0iIj8oRyhFZS5lbD1JKCIiKSxGKFNlKSxTZSksRD1TZSk6RD1sKCk6KFNlLmRhdGEhPT1FZS5jaGlsZHJlbiYmKHNpPSEwLFNlLmRhdGE9RWUuY2hpbGRyZW4pLEQ9TyhTZSkpO2JyZWFrO2Nhc2UgY2U6ayE9PTh8fGk/RD1sKCk6RD1PKFNlKTticmVhaztjYXNlIHBlOmlmKGkmJihTZT1PKFNlKSxrPVNlLm5vZGVUeXBlKSxrPT09MXx8az09PTMpe0Q9U2U7Zm9yKHZhciBIPSFFZS5jaGlsZHJlbi5sZW5ndGgsbmU9MDtuZTxFZS5zdGF0aWNDb3VudDtuZSsrKUgmJihFZS5jaGlsZHJlbis9RC5ub2RlVHlwZT09PTE/RC5vdXRlckhUTUw6RC5kYXRhKSxuZT09PUVlLnN0YXRpY0NvdW50LTEmJihFZS5hbmNob3I9RCksRD1PKEQpO3JldHVybiBpP08oRCk6RH1lbHNlIGwoKTticmVhaztjYXNlIHE6aT9EPUplKFNlLEVlLEFlLGx0LFZlLFR0KTpEPWwoKTticmVhaztkZWZhdWx0OmlmKEEmMSlrIT09MXx8RWUudHlwZS50b0xvd2VyQ2FzZSgpIT09U2UudGFnTmFtZS50b0xvd2VyQ2FzZSgpP0Q9bCgpOkQ9Z2UoU2UsRWUsQWUsbHQsVmUsVHQpO2Vsc2UgaWYoQSY2KXtFZS5zbG90U2NvcGVJZHM9VmU7dmFyIHZlPUYoU2UpO2lmKHUoRWUsdmUsbnVsbCxBZSxsdCxDaSh2ZSksVHQpLEQ9aT9hdChTZSk6TyhTZSksRCYmR2koRCkmJkQuZGF0YT09PSJ0ZWxlcG9ydCBlbmQiJiYoRD1PKEQpKSxUcihFZSkpe3ZhciBCZTtpPyhCZT1VdChxKSxCZS5hbmNob3I9RD9ELnByZXZpb3VzU2libGluZzp2ZS5sYXN0Q2hpbGQpOkJlPVNlLm5vZGVUeXBlPT09Mz9laSgiIik6VXQoImRpdiIpLEJlLmVsPVNlLEVlLmNvbXBvbmVudC5zdWJUcmVlPUJlfX1lbHNlIEEmNjQ/ayE9PTg/RD1sKCk6RD1FZS50eXBlLmh5ZHJhdGUoU2UsRWUsQWUsbHQsVmUsVHQsYSxZZSk6QSYxMjgmJihEPUVlLnR5cGUuaHlkcmF0ZShTZSxFZSxBZSxsdCxDaShGKFNlKSksVmUsVHQsYSxpdCkpfXJldHVybiBfIT1udWxsJiZpbyhfLG51bGwsbHQsRWUpLER9LGdlPShTZSxFZSxBZSxsdCxWZSxUdCk9PntUdD1UdHx8ISFFZS5keW5hbWljQ2hpbGRyZW47dmFye3R5cGU6aSxwcm9wczpsLHBhdGNoRmxhZzpkLHNoYXBlRmxhZzpfLGRpcnM6QX09RWUsQz1pPT09ImlucHV0IiYmQXx8aT09PSJvcHRpb24iO2lmKEN8fGQhPT0tMSl7aWYoQSYmanIoRWUsbnVsbCxBZSwiY3JlYXRlZCIpLGwpaWYoQ3x8IVR0fHxkJigxNnwzMikpZm9yKHZhciBrIGluIGwpKEMmJmsuZW5kc1dpdGgoInZhbHVlIil8fHkuaXNPbihrKSYmIXkuaXNSZXNlcnZlZFByb3AoaykpJiZTKFNlLGssbnVsbCxsW2tdLCExLHZvaWQgMCxBZSk7ZWxzZSBsLm9uQ2xpY2smJlMoU2UsIm9uQ2xpY2siLG51bGwsbC5vbkNsaWNrLCExLHZvaWQgMCxBZSk7dmFyIEQ7aWYoKEQ9bCYmbC5vblZub2RlQmVmb3JlTW91bnQpJiZ5cihELEFlLEVlKSxBJiZqcihFZSxudWxsLEFlLCJiZWZvcmVNb3VudCIpLCgoRD1sJiZsLm9uVm5vZGVNb3VudGVkKXx8QSkmJmlpKCgpPT57RCYmeXIoRCxBZSxFZSksQSYmanIoRWUsbnVsbCxBZSwibW91bnRlZCIpfSxsdCksXyYxNiYmIShsJiYobC5pbm5lckhUTUx8fGwudGV4dENvbnRlbnQpKSlmb3IodmFyIEg9WWUoU2UuZmlyc3RDaGlsZCxFZSxTZSxBZSxsdCxWZSxUdCk7SDspe3NpPSEwO3ZhciBuZT1IO0g9SC5uZXh0U2libGluZyxXKG5lKX1lbHNlIF8mOCYmU2UudGV4dENvbnRlbnQhPT1FZS5jaGlsZHJlbiYmKHNpPSEwLFNlLnRleHRDb250ZW50PUVlLmNoaWxkcmVuKX1yZXR1cm4gU2UubmV4dFNpYmxpbmd9LFllPShTZSxFZSxBZSxsdCxWZSxUdCxpKT0+e2k9aXx8ISFFZS5keW5hbWljQ2hpbGRyZW47Zm9yKHZhciBsPUVlLmNoaWxkcmVuLGQ9bC5sZW5ndGgsXz0wO188ZDtfKyspe3ZhciBBPWk/bFtfXTpsW19dPVVuKGxbX10pO2lmKFNlKVNlPWl0KFNlLEEsbHQsVmUsVHQsaSk7ZWxzZXtpZihBLnR5cGU9PT10ZSYmIUEuY2hpbGRyZW4pY29udGludWU7c2k9ITAsbShudWxsLEEsQWUsbnVsbCxsdCxWZSxDaShBZSksVHQpfX1yZXR1cm4gU2V9LEplPShTZSxFZSxBZSxsdCxWZSxUdCk9Pnt2YXJ7c2xvdFNjb3BlSWRzOml9PUVlO2kmJihWZT1WZT9WZS5jb25jYXQoaSk6aSk7dmFyIGw9RihTZSksZD1ZZShPKFNlKSxFZSxsLEFlLGx0LFZlLFR0KTtyZXR1cm4gZCYmR2koZCkmJmQuZGF0YT09PSJdIj9PKEVlLmFuY2hvcj1kKTooc2k9ITAsRyhFZS5hbmNob3I9bGUoIl0iKSxsLGQpLGQpfSxtdD0oU2UsRWUsQWUsbHQsVmUsVHQpPT57aWYoc2k9ITAsRWUuZWw9bnVsbCxUdClmb3IodmFyIGk9YXQoU2UpOzspe3ZhciBsPU8oU2UpO2lmKGwmJmwhPT1pKVcobCk7ZWxzZSBicmVha312YXIgZD1PKFNlKSxfPUYoU2UpO3JldHVybiBXKFNlKSxtKG51bGwsRWUsXyxkLEFlLGx0LENpKF8pLFZlKSxkfSxhdD1TZT0+e2Zvcih2YXIgRWU9MDtTZTspaWYoU2U9TyhTZSksU2UmJkdpKFNlKSYmKFNlLmRhdGE9PT0iWyImJkVlKyssU2UuZGF0YT09PSJdIikpe2lmKEVlPT09MClyZXR1cm4gTyhTZSk7RWUtLX1yZXR1cm4gU2V9O3JldHVybltXZSxpdF19dmFyIHVyPWlpO2Z1bmN0aW9uIGxyKGEpe3JldHVybiBIYShhKX1mdW5jdGlvbiAkYShhKXtyZXR1cm4gSGEoYSxsaSl9ZnVuY3Rpb24gSGEoYSx1KXt2YXIgbT15LmdldEdsb2JhbFRoaXMoKTttLl9fVlVFX189ITA7dmFye2luc2VydDpTLHJlbW92ZTpJLHBhdGNoUHJvcDpPLGZvcmNlUGF0Y2hQcm9wOkYsY3JlYXRlRWxlbWVudDpXLGNyZWF0ZVRleHQ6RyxjcmVhdGVDb21tZW50OmxlLHNldFRleHQ6V2Usc2V0RWxlbWVudFRleHQ6aXQscGFyZW50Tm9kZTpnZSxuZXh0U2libGluZzpZZSxzZXRTY29wZUlkOkplPXkuTk9PUCxpbnNlcnRTdGF0aWNDb250ZW50Om10fT1hLGF0PWZ1bmN0aW9uKE0saixzZSl7dmFyIHJlPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsLG9lPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLFVlPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTpudWxsLHJ0PWFyZ3VtZW50cy5sZW5ndGg+NiYmYXJndW1lbnRzWzZdIT09dm9pZCAwP2FyZ3VtZW50c1s2XTohMSxxZT1hcmd1bWVudHMubGVuZ3RoPjcmJmFyZ3VtZW50c1s3XSE9PXZvaWQgMD9hcmd1bWVudHNbN106bnVsbCxaZT1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06ISFqLmR5bmFtaWNDaGlsZHJlbjtpZihNIT09ail7TSYmIUd0KE0saikmJihyZT1PZShNKSxRZShNLG9lLFVlLCEwKSxNPW51bGwpLGoucGF0Y2hGbGFnPT09LTImJihaZT0hMSxqLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXJ7dHlwZTokZSxyZWY6JHQsc2hhcGVGbGFnOnB0fT1qO3N3aXRjaCgkZSl7Y2FzZSB0ZTpTZShNLGosc2UscmUpO2JyZWFrO2Nhc2UgY2U6RWUoTSxqLHNlLHJlKTticmVhaztjYXNlIHBlOk09PW51bGwmJkFlKGosc2UscmUscnQpO2JyZWFrO2Nhc2UgcTprKE0saixzZSxyZSxvZSxVZSxydCxxZSxaZSk7YnJlYWs7ZGVmYXVsdDpwdCYxP1R0KE0saixzZSxyZSxvZSxVZSxydCxxZSxaZSk6cHQmNj9EKE0saixzZSxyZSxvZSxVZSxydCxxZSxaZSk6KHB0JjY0fHxwdCYxMjgpJiYkZS5wcm9jZXNzKE0saixzZSxyZSxvZSxVZSxydCxxZSxaZSxDdCl9JHQhPW51bGwmJm9lJiZpbygkdCxNJiZNLnJlZixVZSxqfHxNLCFqKX19LFNlPShNLGosc2UscmUpPT57aWYoTT09bnVsbClTKGouZWw9RyhqLmNoaWxkcmVuKSxzZSxyZSk7ZWxzZXt2YXIgb2U9ai5lbD1NLmVsO2ouY2hpbGRyZW4hPT1NLmNoaWxkcmVuJiZXZShvZSxqLmNoaWxkcmVuKX19LEVlPShNLGosc2UscmUpPT57TT09bnVsbD9TKGouZWw9bGUoai5jaGlsZHJlbnx8IiIpLHNlLHJlKTpqLmVsPU0uZWx9LEFlPShNLGosc2UscmUpPT57W00uZWwsTS5hbmNob3JdPW10KE0uY2hpbGRyZW4saixzZSxyZSxNLmVsLE0uYW5jaG9yKX0sbHQ9KE0saixzZSk9Pntmb3IodmFye2VsOnJlLGFuY2hvcjpvZX09TSxVZTtyZSYmcmUhPT1vZTspVWU9WWUocmUpLFMocmUsaixzZSkscmU9VWU7UyhvZSxqLHNlKX0sVmU9TT0+e2Zvcih2YXJ7ZWw6aixhbmNob3I6c2V9PU0scmU7aiYmaiE9PXNlOylyZT1ZZShqKSxJKGopLGo9cmU7SShzZSl9LFR0PShNLGosc2UscmUsb2UsVWUscnQscWUsWmUpPT57cnQ9cnR8fGoudHlwZT09PSJzdmciLE09PW51bGw/aShqLHNlLHJlLG9lLFVlLHJ0LHFlLFplKTpfKE0saixvZSxVZSxydCxxZSxaZSl9LGk9KE0saixzZSxyZSxvZSxVZSxydCxxZSk9Pnt2YXIgWmUsJGUse3R5cGU6JHQscHJvcHM6cHQsc2hhcGVGbGFnOnh0LHRyYW5zaXRpb246QnQsZGlyczpNbn09TTtpZihaZT1NLmVsPVcoTS50eXBlLFVlLHB0JiZwdC5pcyxwdCkseHQmOD9pdChaZSxNLmNoaWxkcmVuKTp4dCYxNiYmZChNLmNoaWxkcmVuLFplLG51bGwscmUsb2UsVWUmJiR0IT09ImZvcmVpZ25PYmplY3QiLHJ0LHFlKSxNbiYmanIoTSxudWxsLHJlLCJjcmVhdGVkIiksbChaZSxNLE0uc2NvcGVJZCxydCxyZSkscHQpe2Zvcih2YXIgUm4gaW4gcHQpUm4hPT0idmFsdWUiJiYheS5pc1Jlc2VydmVkUHJvcChSbikmJk8oWmUsUm4sbnVsbCxwdFtSbl0sVWUsTS5jaGlsZHJlbixyZSxvZSxMZSxNLmhvc3RJbnN0YW5jZSk7InZhbHVlImluIHB0JiZPKFplLCJ2YWx1ZSIsbnVsbCxwdC52YWx1ZSwhMSxbXSxyZSxudWxsLHZvaWQgMCxNLmhvc3RJbnN0YW5jZSksKCRlPXB0Lm9uVm5vZGVCZWZvcmVNb3VudCkmJnlyKCRlLHJlLE0pfU1uJiZqcihNLG51bGwscmUsImJlZm9yZU1vdW50Iik7dmFyIHZuPSghb2V8fG9lJiYhb2UucGVuZGluZ0JyYW5jaCkmJkJ0JiYhQnQucGVyc2lzdGVkO3ZuJiZCdC5iZWZvcmVFbnRlcihaZSksUyhaZSxqLHNlKSwoKCRlPXB0JiZwdC5vblZub2RlTW91bnRlZCl8fHZufHxNbikmJnVyKCgpPT57JGUmJnlyKCRlLHJlLE0pLHZuJiZCdC5lbnRlcihaZSksTW4mJmpyKE0sbnVsbCxyZSwibW91bnRlZCIpfSxvZSl9LGw9KE0saixzZSxyZSxvZSk9PntpZihzZSYmSmUoTSxzZSkscmUpZm9yKHZhciBVZT0wO1VlPHJlLmxlbmd0aDtVZSsrKUplKE0scmVbVWVdKTtpZihvZSl7dmFyIHJ0PW9lLnN1YlRyZWU7aWYoaj09PXJ0KXt2YXIgcWU9b2Uudm5vZGU7bChNLHFlLHFlLnNjb3BlSWQscWUuc2xvdFNjb3BlSWRzLG9lLnBhcmVudCl9fX0sZD1mdW5jdGlvbihNLGosc2UscmUsb2UsVWUscnQscWUpe2Zvcih2YXIgWmU9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOjAsJGU9WmU7JGU8TS5sZW5ndGg7JGUrKyl7dmFyICR0PU1bJGVdPXFlPyRuKE1bJGVdKTpVbihNWyRlXSk7YXQobnVsbCwkdCxqLHNlLHJlLG9lLFVlLHJ0LHFlKX19LF89KE0saixzZSxyZSxvZSxVZSxydCk9Pnt2YXIgcWU9ai5lbD1NLmVsLHtwYXRjaEZsYWc6WmUsZHluYW1pY0NoaWxkcmVuOiRlLGRpcnM6JHR9PWo7WmV8PU0ucGF0Y2hGbGFnJjE2O3ZhciBwdD1NLnByb3BzfHx5LkVNUFRZX09CSix4dD1qLnByb3BzfHx5LkVNUFRZX09CSixCdDtzZSYmWWkoc2UsITEpLChCdD14dC5vblZub2RlQmVmb3JlVXBkYXRlKSYmeXIoQnQsc2UsaixNKSwkdCYmanIoaixNLHNlLCJiZWZvcmVVcGRhdGUiKSxzZSYmWWkoc2UsITApO3ZhciBNbj1vZSYmai50eXBlIT09ImZvcmVpZ25PYmplY3QiO2lmKCRlP0EoTS5keW5hbWljQ2hpbGRyZW4sJGUscWUsc2UscmUsTW4sVWUpOnJ0fHx1ZShNLGoscWUsbnVsbCxzZSxyZSxNbixVZSwhMSksWmU+MCl7aWYoWmUmMTYpQyhxZSxqLHB0LHh0LHNlLHJlLG9lKTtlbHNlIGlmKFplJjImJnB0LmNsYXNzIT09eHQuY2xhc3MmJk8ocWUsImNsYXNzIixudWxsLHh0LmNsYXNzLG9lLFtdLHNlLG51bGwsdm9pZCAwLGouaG9zdEluc3RhbmNlKSxaZSY0JiZPKHFlLCJzdHlsZSIscHQuc3R5bGUseHQuc3R5bGUsb2UsW10sc2UsbnVsbCx2b2lkIDAsai5ob3N0SW5zdGFuY2UpLFplJjgpZm9yKHZhciBSbj1qLmR5bmFtaWNQcm9wcyx2bj0wO3ZuPFJuLmxlbmd0aDt2bisrKXt2YXIgYm49Um5bdm5dLGZyPXB0W2JuXSxuaT14dFtibl07KG5pIT09ZnJ8fGJuPT09InZhbHVlInx8RiYmRihxZSxibikpJiZPKHFlLGJuLGZyLG5pLG9lLE0uY2hpbGRyZW4sc2UscmUsTGUsai5ob3N0SW5zdGFuY2UpfVplJjEmJk0uY2hpbGRyZW4hPT1qLmNoaWxkcmVuJiZpdChxZSxqLmNoaWxkcmVuKX1lbHNlIXJ0JiYkZT09bnVsbCYmQyhxZSxqLHB0LHh0LHNlLHJlLG9lKTsoKEJ0PXh0Lm9uVm5vZGVVcGRhdGVkKXx8JHQpJiZ1cigoKT0+e0J0JiZ5cihCdCxzZSxqLE0pLCR0JiZqcihqLE0sc2UsInVwZGF0ZWQiKX0scmUpfSxBPShNLGosc2UscmUsb2UsVWUscnQpPT57Zm9yKHZhciBxZT0wO3FlPGoubGVuZ3RoO3FlKyspe3ZhciBaZT1NW3FlXSwkZT1qW3FlXSwkdD1aZS5lbCYmKFplLnR5cGU9PT1xfHwhR3QoWmUsJGUpfHxaZS5zaGFwZUZsYWcmKDZ8NjQpKT9nZShaZS5lbCk6c2U7YXQoWmUsJGUsJHQsbnVsbCxyZSxvZSxVZSxydCwhMCl9fSxDPShNLGosc2UscmUsb2UsVWUscnQpPT57aWYoc2UhPT1yZSl7aWYoc2UhPT15LkVNUFRZX09CSilmb3IodmFyIHFlIGluIHNlKSF5LmlzUmVzZXJ2ZWRQcm9wKHFlKSYmIShxZSBpbiByZSkmJk8oTSxxZSxzZVtxZV0sbnVsbCxydCxqLmNoaWxkcmVuLG9lLFVlLExlLGouaG9zdEluc3RhbmNlKTtmb3IodmFyIFplIGluIHJlKWlmKCF5LmlzUmVzZXJ2ZWRQcm9wKFplKSl7dmFyICRlPXJlW1plXSwkdD1zZVtaZV07KCRlIT09JHQmJlplIT09InZhbHVlInx8RiYmRihNLFplKSkmJk8oTSxaZSwkdCwkZSxydCxqLmNoaWxkcmVuLG9lLFVlLExlLGouaG9zdEluc3RhbmNlKX0idmFsdWUiaW4gcmUmJk8oTSwidmFsdWUiLHNlLnZhbHVlLHJlLnZhbHVlLCExLFtdLG9lLG51bGwsdm9pZCAwLGouaG9zdEluc3RhbmNlKX19LGs9KE0saixzZSxyZSxvZSxVZSxydCxxZSxaZSk9Pnt2YXIgJGU9ai5lbD1NP00uZWw6RygiIiksJHQ9ai5hbmNob3I9TT9NLmFuY2hvcjpHKCIiKSx7cGF0Y2hGbGFnOnB0LGR5bmFtaWNDaGlsZHJlbjp4dCxzbG90U2NvcGVJZHM6QnR9PWo7QnQmJihxZT1xZT9xZS5jb25jYXQoQnQpOkJ0KSxNPT1udWxsPyhTKCRlLHNlLHJlKSxTKCR0LHNlLHJlKSxkKGouY2hpbGRyZW4sc2UsJHQsb2UsVWUscnQscWUsWmUpKTpwdD4wJiZwdCY2NCYmeHQmJk0uZHluYW1pY0NoaWxkcmVuPyhBKE0uZHluYW1pY0NoaWxkcmVuLHh0LHNlLG9lLFVlLHJ0LHFlKSwoai5rZXkhPW51bGx8fG9lJiZqPT09b2Uuc3ViVHJlZSkmJm9vKE0saiwhMCkpOnVlKE0saixzZSwkdCxvZSxVZSxydCxxZSxaZSl9LEQ9KE0saixzZSxyZSxvZSxVZSxydCxxZSxaZSk9PntqLnNsb3RTY29wZUlkcz1xZSxNPT1udWxsP2ouc2hhcGVGbGFnJjUxMj9vZS5jdHguYWN0aXZhdGUoaixzZSxyZSxydCxaZSk6SChqLHNlLHJlLG9lLFVlLHJ0LFplKTpuZShNLGosWmUpfSxIPShNLGosc2UscmUsb2UsVWUscnQpPT57dmFyIHFlPU0uY29tcG9uZW50PWNzKE0scmUsb2UpO2lmKFByKE0pJiYocWUuY3R4LnJlbmRlcmVyPUN0KSx1cyhxZSkscWUuYXN5bmNEZXApe2lmKG9lJiZvZS5yZWdpc3RlckRlcChxZSx2ZSksIU0uZWwpe3ZhciBaZT1xZS5zdWJUcmVlPVV0KGNlKTtFZShudWxsLFplLGosc2UpfXJldHVybn12ZShxZSxNLGosc2Usb2UsVWUscnQpfSxuZT0oTSxqLHNlKT0+e3ZhciByZT1qLmNvbXBvbmVudD1NLmNvbXBvbmVudDtpZihBbyhNLGosc2UpKWlmKHJlLmFzeW5jRGVwJiYhcmUuYXN5bmNSZXNvbHZlZCl7QmUocmUsaixzZSk7cmV0dXJufWVsc2UgcmUubmV4dD1qLExyKHJlLnVwZGF0ZSkscmUudXBkYXRlKCk7ZWxzZSBqLmVsPU0uZWwscmUudm5vZGU9an0sdmU9KE0saixzZSxyZSxvZSxVZSxydCk9Pnt2YXIgcWU9KCk9PntpZihNLmlzTW91bnRlZCl7dmFye25leHQ6SnQsYnU6YW4sdTpsbyxwYXJlbnQ6WSx2bm9kZTplZX09TSxiZT1KdCxNZTtZaShNLCExKSxKdD8oSnQuZWw9ZWUuZWwsQmUoTSxKdCxydCkpOkp0PWVlLGFuJiZ5Lmludm9rZUFycmF5Rm5zKGFuKSwoTWU9SnQucHJvcHMmJkp0LnByb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZ5cihNZSxZLEp0LGVlKSxZaShNLCEwKTt2YXIgRGU9WG8oTSksWGU9TS5zdWJUcmVlO00uc3ViVHJlZT1EZSxhdChYZSxEZSxnZShYZS5lbCksT2UoWGUpLE0sb2UsVWUpLEp0LmVsPURlLmVsLGJlPT09bnVsbCYmWGkoTSxEZS5lbCksbG8mJnVyKGxvLG9lKSwoTWU9SnQucHJvcHMmJkp0LnByb3BzLm9uVm5vZGVVcGRhdGVkKSYmdXIoKCk9PnlyKE1lLFksSnQsZWUpLG9lKX1lbHNle3ZhciAkdCx7ZWw6cHQscHJvcHM6eHR9PWose2JtOkJ0LG06TW4scGFyZW50OlJufT1NLHZuPVRyKGopO2lmKFlpKE0sITEpLEJ0JiZ5Lmludm9rZUFycmF5Rm5zKEJ0KSwhdm4mJigkdD14dCYmeHQub25Wbm9kZUJlZm9yZU1vdW50KSYmeXIoJHQsUm4saiksWWkoTSwhMCkscHQmJlJ0KXt2YXIgYm49KCk9PntNLnN1YlRyZWU9WG8oTSksUnQocHQsTS5zdWJUcmVlLE0sb2UsbnVsbCl9O3ZuP2oudHlwZS5fX2FzeW5jTG9hZGVyKCkudGhlbigoKT0+IU0uaXNVbm1vdW50ZWQmJmJuKCkpOmJuKCl9ZWxzZXt2YXIgZnI9TS5zdWJUcmVlPVhvKE0pO2F0KG51bGwsZnIsc2UscmUsTSxvZSxVZSksai5lbD1mci5lbH1pZihNbiYmdXIoTW4sb2UpLCF2biYmKCR0PXh0JiZ4dC5vblZub2RlTW91bnRlZCkpe3ZhciBuaT1qO3VyKCgpPT55cigkdCxSbixuaSksb2UpfShqLnNoYXBlRmxhZyYyNTZ8fFJuJiZUcihSbi52bm9kZSkmJlJuLnZub2RlLnNoYXBlRmxhZyYyNTYpJiZNLmEmJnVyKE0uYSxvZSksTS5pc01vdW50ZWQ9ITAsaj1zZT1yZT1udWxsfX0sWmU9TS5lZmZlY3Q9bmV3IFIuUmVhY3RpdmVFZmZlY3QocWUsKCk9PlNuKCRlKSxNLnNjb3BlKSwkZT1NLnVwZGF0ZT0oKT0+WmUucnVuKCk7JGUuaWQ9TS51aWQsWWkoTSwhMCksJGUoKX0sQmU9KE0saixzZSk9PntqLmNvbXBvbmVudD1NO3ZhciByZT1NLnZub2RlLnByb3BzO00udm5vZGU9aixNLm5leHQ9bnVsbCxpcyhNLGoucHJvcHMscmUsc2UpLG9zKE0sai5jaGlsZHJlbixzZSksUi5wYXVzZVRyYWNraW5nKCksdmkoKSxSLnJlc2V0VHJhY2tpbmcoKX0sdWU9ZnVuY3Rpb24oTSxqLHNlLHJlLG9lLFVlLHJ0LHFlKXt2YXIgWmU9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOiExLCRlPU0mJk0uY2hpbGRyZW4sJHQ9TT9NLnNoYXBlRmxhZzowLHB0PWouY2hpbGRyZW4se3BhdGNoRmxhZzp4dCxzaGFwZUZsYWc6QnR9PWo7aWYoeHQ+MCl7aWYoeHQmMTI4KXtHZSgkZSxwdCxzZSxyZSxvZSxVZSxydCxxZSxaZSk7cmV0dXJufWVsc2UgaWYoeHQmMjU2KXtrZSgkZSxwdCxzZSxyZSxvZSxVZSxydCxxZSxaZSk7cmV0dXJufX1CdCY4PygkdCYxNiYmTGUoJGUsb2UsVWUpLHB0IT09JGUmJml0KHNlLHB0KSk6JHQmMTY/QnQmMTY/R2UoJGUscHQsc2UscmUsb2UsVWUscnQscWUsWmUpOkxlKCRlLG9lLFVlLCEwKTooJHQmOCYmaXQoc2UsIiIpLEJ0JjE2JiZkKHB0LHNlLHJlLG9lLFVlLHJ0LHFlLFplKSl9LGtlPShNLGosc2UscmUsb2UsVWUscnQscWUsWmUpPT57TT1NfHx5LkVNUFRZX0FSUixqPWp8fHkuRU1QVFlfQVJSO3ZhciAkZT1NLmxlbmd0aCwkdD1qLmxlbmd0aCxwdD1NYXRoLm1pbigkZSwkdCkseHQ7Zm9yKHh0PTA7eHQ8cHQ7eHQrKyl7dmFyIEJ0PWpbeHRdPVplPyRuKGpbeHRdKTpVbihqW3h0XSk7YXQoTVt4dF0sQnQsc2UsbnVsbCxvZSxVZSxydCxxZSxaZSl9JGU+JHQ/TGUoTSxvZSxVZSwhMCwhMSxwdCk6ZChqLHNlLHJlLG9lLFVlLHJ0LHFlLFplLHB0KX0sR2U9KE0saixzZSxyZSxvZSxVZSxydCxxZSxaZSk9Pntmb3IodmFyICRlPTAsJHQ9ai5sZW5ndGgscHQ9TS5sZW5ndGgtMSx4dD0kdC0xOyRlPD1wdCYmJGU8PXh0Oyl7dmFyIEJ0PU1bJGVdLE1uPWpbJGVdPVplPyRuKGpbJGVdKTpVbihqWyRlXSk7aWYoR3QoQnQsTW4pKWF0KEJ0LE1uLHNlLG51bGwsb2UsVWUscnQscWUsWmUpO2Vsc2UgYnJlYWs7JGUrK31mb3IoOyRlPD1wdCYmJGU8PXh0Oyl7dmFyIFJuPU1bcHRdLHZuPWpbeHRdPVplPyRuKGpbeHRdKTpVbihqW3h0XSk7aWYoR3QoUm4sdm4pKWF0KFJuLHZuLHNlLG51bGwsb2UsVWUscnQscWUsWmUpO2Vsc2UgYnJlYWs7cHQtLSx4dC0tfWlmKCRlPnB0KXtpZigkZTw9eHQpZm9yKHZhciBibj14dCsxLGZyPWJuPCR0P2pbYm5dLmVsOnJlOyRlPD14dDspYXQobnVsbCxqWyRlXT1aZT8kbihqWyRlXSk6VW4oalskZV0pLHNlLGZyLG9lLFVlLHJ0LHFlLFplKSwkZSsrfWVsc2UgaWYoJGU+eHQpZm9yKDskZTw9cHQ7KVFlKE1bJGVdLG9lLFVlLCEwKSwkZSsrO2Vsc2V7dmFyIG5pPSRlLEp0PSRlLGFuPW5ldyBNYXA7Zm9yKCRlPUp0OyRlPD14dDskZSsrKXt2YXIgbG89alskZV09WmU/JG4oalskZV0pOlVuKGpbJGVdKTtsby5rZXkhPW51bGwmJmFuLnNldChsby5rZXksJGUpfXZhciBZLGVlPTAsYmU9eHQtSnQrMSxNZT0hMSxEZT0wLFhlPW5ldyBBcnJheShiZSk7Zm9yKCRlPTA7JGU8YmU7JGUrKylYZVskZV09MDtmb3IoJGU9bmk7JGU8PXB0OyRlKyspe3ZhciBfdD1NWyRlXTtpZihlZT49YmUpe1FlKF90LG9lLFVlLCEwKTtjb250aW51ZX12YXIgZXQ9dm9pZCAwO2lmKF90LmtleSE9bnVsbClldD1hbi5nZXQoX3Qua2V5KTtlbHNlIGZvcihZPUp0O1k8PXh0O1krKylpZihYZVtZLUp0XT09PTAmJkd0KF90LGpbWV0pKXtldD1ZO2JyZWFrfWV0PT09dm9pZCAwP1FlKF90LG9lLFVlLCEwKTooWGVbZXQtSnRdPSRlKzEsZXQ+PURlP0RlPWV0Ok1lPSEwLGF0KF90LGpbZXRdLHNlLG51bGwsb2UsVWUscnQscWUsWmUpLGVlKyspfXZhciB0dD1NZT9hbyhYZSk6eS5FTVBUWV9BUlI7Zm9yKFk9dHQubGVuZ3RoLTEsJGU9YmUtMTskZT49MDskZS0tKXt2YXIgSGU9SnQrJGUsenQ9altIZV0sTHQ9SGUrMTwkdD9qW0hlKzFdLmVsOnJlO1hlWyRlXT09PTA/YXQobnVsbCx6dCxzZSxMdCxvZSxVZSxydCxxZSxaZSk6TWUmJihZPDB8fCRlIT09dHRbWV0/dXQoenQsc2UsTHQsMik6WS0tKX19fSx1dD1mdW5jdGlvbihNLGosc2UscmUpe3ZhciBvZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCx7ZWw6VWUsdHlwZTpydCx0cmFuc2l0aW9uOnFlLGNoaWxkcmVuOlplLHNoYXBlRmxhZzokZX09TTtpZigkZSY2KXt1dChNLmNvbXBvbmVudC5zdWJUcmVlLGosc2UscmUpO3JldHVybn1pZigkZSYxMjgpe00uc3VzcGVuc2UubW92ZShqLHNlLHJlKTtyZXR1cm59aWYoJGUmNjQpe3J0Lm1vdmUoTSxqLHNlLEN0KTtyZXR1cm59aWYocnQ9PT1xKXtTKFVlLGosc2UpO2Zvcih2YXIgJHQ9MDskdDxaZS5sZW5ndGg7JHQrKyl1dChaZVskdF0saixzZSxyZSk7UyhNLmFuY2hvcixqLHNlKTtyZXR1cm59aWYocnQ9PT1wZSl7bHQoTSxqLHNlKTtyZXR1cm59dmFyIHB0PXJlIT09MiYmJGUmMSYmcWU7aWYocHQpaWYocmU9PT0wKXFlLmJlZm9yZUVudGVyKFVlKSxTKFVlLGosc2UpLHVyKCgpPT5xZS5lbnRlcihVZSksb2UpO2Vsc2V7dmFye2xlYXZlOnh0LGRlbGF5TGVhdmU6QnQsYWZ0ZXJMZWF2ZTpNbn09cWUsUm49KCk9PlMoVWUsaixzZSksdm49KCk9Pnt4dChVZSwoKT0+e1JuKCksTW4mJk1uKCl9KX07QnQ/QnQoVWUsUm4sdm4pOnZuKCl9ZWxzZSBTKFVlLGosc2UpfSxRZT1mdW5jdGlvbihNLGosc2Upe3ZhciByZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsb2U9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLHt0eXBlOlVlLHByb3BzOnJ0LHJlZjpxZSxjaGlsZHJlbjpaZSxkeW5hbWljQ2hpbGRyZW46JGUsc2hhcGVGbGFnOiR0LHBhdGNoRmxhZzpwdCxkaXJzOnh0fT1NO2lmKHFlIT1udWxsJiZpbyhxZSxudWxsLHNlLE0sITApLCR0JjI1Nil7ai5jdHguZGVhY3RpdmF0ZShNKTtyZXR1cm59dmFyIEJ0PSR0JjEmJnh0LE1uPSFUcihNKSxSbjtpZihNbiYmKFJuPXJ0JiZydC5vblZub2RlQmVmb3JlVW5tb3VudCkmJnlyKFJuLGosTSksJHQmNil5ZShNLmNvbXBvbmVudCxzZSxyZSk7ZWxzZXtpZigkdCYxMjgpe00uc3VzcGVuc2UudW5tb3VudChzZSxyZSk7cmV0dXJufUJ0JiZqcihNLG51bGwsaiwiYmVmb3JlVW5tb3VudCIpLCR0JjY0P00udHlwZS5yZW1vdmUoTSxqLHNlLG9lLEN0LHJlKTokZSYmKFVlIT09cXx8cHQ+MCYmcHQmNjQpP0xlKCRlLGosc2UsITEsITApOihVZT09PXEmJnB0JigxMjh8MjU2KXx8IW9lJiYkdCYxNikmJkxlKFplLGosc2UpLHJlJiZSZShNKX0oTW4mJihSbj1ydCYmcnQub25Wbm9kZVVubW91bnRlZCl8fEJ0KSYmdXIoKCk9PntSbiYmeXIoUm4saixNKSxCdCYmanIoTSxudWxsLGosInVubW91bnRlZCIpfSxzZSl9LFJlPU09Pnt2YXJ7dHlwZTpqLGVsOnNlLGFuY2hvcjpyZSx0cmFuc2l0aW9uOm9lfT1NO2lmKGo9PT1xKXttZShzZSxyZSk7cmV0dXJufWlmKGo9PT1wZSl7VmUoTSk7cmV0dXJufXZhciBVZT0oKT0+e0koc2UpLG9lJiYhb2UucGVyc2lzdGVkJiZvZS5hZnRlckxlYXZlJiZvZS5hZnRlckxlYXZlKCl9O2lmKE0uc2hhcGVGbGFnJjEmJm9lJiYhb2UucGVyc2lzdGVkKXt2YXJ7bGVhdmU6cnQsZGVsYXlMZWF2ZTpxZX09b2UsWmU9KCk9PnJ0KHNlLFVlKTtxZT9xZShNLmVsLFVlLFplKTpaZSgpfWVsc2UgVWUoKX0sbWU9KE0saik9Pntmb3IodmFyIHNlO00hPT1qOylzZT1ZZShNKSxJKE0pLE09c2U7SShqKX0seWU9KE0saixzZSk9Pnt2YXJ7YnVtOnJlLHNjb3BlOm9lLHVwZGF0ZTpVZSxzdWJUcmVlOnJ0LHVtOnFlfT1NO3JlJiZ5Lmludm9rZUFycmF5Rm5zKHJlKSxvZS5zdG9wKCksVWUmJihVZS5hY3RpdmU9ITEsUWUocnQsTSxqLHNlKSkscWUmJnVyKHFlLGopLHVyKCgpPT57TS5pc1VubW91bnRlZD0hMH0saiksaiYmai5wZW5kaW5nQnJhbmNoJiYhai5pc1VubW91bnRlZCYmTS5hc3luY0RlcCYmIU0uYXN5bmNSZXNvbHZlZCYmTS5zdXNwZW5zZUlkPT09ai5wZW5kaW5nSWQmJihqLmRlcHMtLSxqLmRlcHM9PT0wJiZqLnJlc29sdmUoKSl9LExlPWZ1bmN0aW9uKE0saixzZSl7Zm9yKHZhciByZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsb2U9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLFVlPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTowLHJ0PVVlO3J0PE0ubGVuZ3RoO3J0KyspUWUoTVtydF0saixzZSxyZSxvZSl9LE9lPU09Pk0uc2hhcGVGbGFnJjY/T2UoTS5jb21wb25lbnQuc3ViVHJlZSk6TS5zaGFwZUZsYWcmMTI4P00uc3VzcGVuc2UubmV4dCgpOlllKE0uYW5jaG9yfHxNLmVsKSxidD0oTSxqLHNlKT0+e009PW51bGw/ai5fdm5vZGUmJlFlKGouX3Zub2RlLG51bGwsbnVsbCwhMCk6YXQoai5fdm5vZGV8fG51bGwsTSxqLG51bGwsbnVsbCxudWxsLHNlKSx2aSgpLFBuKCksai5fdm5vZGU9TX0sQ3Q9e3A6YXQsdW06UWUsbTp1dCxyOlJlLG10OkgsbWM6ZCxwYzp1ZSxwYmM6QSxuOk9lLG86YX0sS2UsUnQ7cmV0dXJuIHUmJihbS2UsUnRdPXUoQ3QpKSx7cmVuZGVyOmJ0LGh5ZHJhdGU6S2UsY3JlYXRlQXBwOnNzKGJ0LEtlKX19ZnVuY3Rpb24gWWkoYSx1KXt2YXJ7ZWZmZWN0Om0sdXBkYXRlOlN9PWE7bS5hbGxvd1JlY3Vyc2U9Uy5hbGxvd1JlY3Vyc2U9dX1mdW5jdGlvbiBvbyhhLHUpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxTPWEuY2hpbGRyZW4sST11LmNoaWxkcmVuO2lmKHkuaXNBcnJheShTKSYmeS5pc0FycmF5KEkpKWZvcih2YXIgTz0wO088Uy5sZW5ndGg7TysrKXt2YXIgRj1TW09dLFc9SVtPXTtXLnNoYXBlRmxhZyYxJiYhVy5keW5hbWljQ2hpbGRyZW4mJigoVy5wYXRjaEZsYWc8PTB8fFcucGF0Y2hGbGFnPT09MzIpJiYoVz1JW09dPSRuKElbT10pLFcuZWw9Ri5lbCksbXx8b28oRixXKSksVy50eXBlPT09dGUmJihXLmVsPUYuZWwpfX1mdW5jdGlvbiBhbyhhKXt2YXIgdT1hLnNsaWNlKCksbT1bMF0sUyxJLE8sRixXLEc9YS5sZW5ndGg7Zm9yKFM9MDtTPEc7UysrKXt2YXIgbGU9YVtTXTtpZihsZSE9PTApe2lmKEk9bVttLmxlbmd0aC0xXSxhW0ldPGxlKXt1W1NdPUksbS5wdXNoKFMpO2NvbnRpbnVlfWZvcihPPTAsRj1tLmxlbmd0aC0xO088RjspVz1PK0Y+PjEsYVttW1ddXTxsZT9PPVcrMTpGPVc7bGU8YVttW09dXSYmKE8+MCYmKHVbU109bVtPLTFdKSxtW09dPVMpfX1mb3IoTz1tLmxlbmd0aCxGPW1bTy0xXTtPLS0gPjA7KW1bT109RixGPXVbRl07cmV0dXJuIG19dmFyIGxzPWE9PmEuX19pc1RlbGVwb3J0LHBhPWE9PmEmJihhLmRpc2FibGVkfHxhLmRpc2FibGVkPT09IiIpLExvPWE9PnR5cGVvZiBTVkdFbGVtZW50IT0idW5kZWZpbmVkIiYmYSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQsdmE9KGEsdSk9Pnt2YXIgbT1hJiZhLnRvO2lmKHkuaXNTdHJpbmcobSkpaWYodSl7dmFyIFM9dShtKTtyZXR1cm4gU31lbHNlIHJldHVybiBudWxsO2Vsc2UgcmV0dXJuIG19LHY9e19faXNUZWxlcG9ydDohMCxwcm9jZXNzKGEsdSxtLFMsSSxPLEYsVyxHLGxlKXt2YXJ7bWM6V2UscGM6aXQscGJjOmdlLG86e2luc2VydDpZZSxxdWVyeVNlbGVjdG9yOkplLGNyZWF0ZVRleHQ6bXQsY3JlYXRlQ29tbWVudDphdH19PWxlLFNlPXBhKHUucHJvcHMpLHtzaGFwZUZsYWc6RWUsY2hpbGRyZW46QWUsZHluYW1pY0NoaWxkcmVuOmx0fT11O2lmKGE9PW51bGwpe3ZhciBWZT11LmVsPW10KCIiKSxUdD11LmFuY2hvcj1tdCgiIik7WWUoVmUsbSxTKSxZZShUdCxtLFMpO3ZhciBpPXUudGFyZ2V0PXZhKHUucHJvcHMsSmUpLGw9dS50YXJnZXRBbmNob3I9bXQoIiIpO2kmJihZZShsLGkpLEY9Rnx8TG8oaSkpO3ZhciBkPSh2ZSxCZSk9PntFZSYxNiYmV2UoQWUsdmUsQmUsSSxPLEYsVyxHKX07U2U/ZChtLFR0KTppJiZkKGksbCl9ZWxzZXt1LmVsPWEuZWw7dmFyIF89dS5hbmNob3I9YS5hbmNob3IsQT11LnRhcmdldD1hLnRhcmdldCxDPXUudGFyZ2V0QW5jaG9yPWEudGFyZ2V0QW5jaG9yLGs9cGEoYS5wcm9wcyksRD1rP206QSxIPWs/XzpDO2lmKEY9Rnx8TG8oQSksbHQ/KGdlKGEuZHluYW1pY0NoaWxkcmVuLGx0LEQsSSxPLEYsVyksb28oYSx1LCEwKSk6R3x8aXQoYSx1LEQsSCxJLE8sRixXLCExKSxTZSlrfHx4KHUsbSxfLGxlLDEpO2Vsc2UgaWYoKHUucHJvcHMmJnUucHJvcHMudG8pIT09KGEucHJvcHMmJmEucHJvcHMudG8pKXt2YXIgbmU9dS50YXJnZXQ9dmEodS5wcm9wcyxKZSk7bmUmJngodSxuZSxudWxsLGxlLDApfWVsc2UgayYmeCh1LEEsQyxsZSwxKX1aKHUpfSxyZW1vdmUoYSx1LG0sUyxJLE8pe3Zhcnt1bTpGLG86e3JlbW92ZTpXfX09SSx7c2hhcGVGbGFnOkcsY2hpbGRyZW46bGUsYW5jaG9yOldlLHRhcmdldEFuY2hvcjppdCx0YXJnZXQ6Z2UscHJvcHM6WWV9PWE7aWYoZ2UmJlcoaXQpLChPfHwhcGEoWWUpKSYmKFcoV2UpLEcmMTYpKWZvcih2YXIgSmU9MDtKZTxsZS5sZW5ndGg7SmUrKyl7dmFyIG10PWxlW0plXTtGKG10LHUsbSwhMCwhIW10LmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOngsaHlkcmF0ZTokfTtmdW5jdGlvbiB4KGEsdSxtLFMpe3ZhcntvOntpbnNlcnQ6SX0sbTpPfT1TLEY9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOjI7Rj09PTAmJkkoYS50YXJnZXRBbmNob3IsdSxtKTt2YXJ7ZWw6VyxhbmNob3I6RyxzaGFwZUZsYWc6bGUsY2hpbGRyZW46V2UscHJvcHM6aXR9PWEsZ2U9Rj09PTI7aWYoZ2UmJkkoVyx1LG0pLCghZ2V8fHBhKGl0KSkmJmxlJjE2KWZvcih2YXIgWWU9MDtZZTxXZS5sZW5ndGg7WWUrKylPKFdlW1llXSx1LG0sMik7Z2UmJkkoRyx1LG0pfWZ1bmN0aW9uICQoYSx1LG0sUyxJLE8sRixXKXt2YXJ7bzp7bmV4dFNpYmxpbmc6RyxwYXJlbnROb2RlOmxlLHF1ZXJ5U2VsZWN0b3I6V2V9fT1GLGl0PXUudGFyZ2V0PXZhKHUucHJvcHMsV2UpO2lmKGl0KXt2YXIgZ2U9aXQuX2xwYXx8aXQuZmlyc3RDaGlsZDtpZih1LnNoYXBlRmxhZyYxNilpZihwYSh1LnByb3BzKSl1LmFuY2hvcj1XKEcoYSksdSxsZShhKSxtLFMsSSxPKSx1LnRhcmdldEFuY2hvcj1nZTtlbHNle3UuYW5jaG9yPUcoYSk7Zm9yKHZhciBZZT1nZTtZZTspaWYoWWU9RyhZZSksWWUmJlllLm5vZGVUeXBlPT09OCYmWWUuZGF0YT09PSJ0ZWxlcG9ydCBhbmNob3IiKXt1LnRhcmdldEFuY2hvcj1ZZSxpdC5fbHBhPXUudGFyZ2V0QW5jaG9yJiZHKHUudGFyZ2V0QW5jaG9yKTticmVha31XKGdlLHUsaXQsbSxTLEksTyl9Wih1KX1yZXR1cm4gdS5hbmNob3ImJkcodS5hbmNob3IpfXZhciBVPXY7ZnVuY3Rpb24gWihhKXt2YXIgdT1hLmN0eDtpZih1JiZ1LnV0KXtmb3IodmFyIG09YS5jaGlsZHJlblswXS5lbDttIT09YS50YXJnZXRBbmNob3I7KW0ubm9kZVR5cGU9PT0xJiZtLnNldEF0dHJpYnV0ZSgiZGF0YS12LW93bmVyIix1LnVpZCksbT1tLm5leHRTaWJsaW5nO3UudXQoKX19dmFyIHE9U3ltYm9sKHZvaWQgMCksdGU9U3ltYm9sKHZvaWQgMCksY2U9U3ltYm9sKHZvaWQgMCkscGU9U3ltYm9sKHZvaWQgMCksSWU9W10sZmU9bnVsbDtmdW5jdGlvbiBDZSgpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTohMTtJZS5wdXNoKGZlPWE/bnVsbDpbXSl9ZnVuY3Rpb24gY3QoKXtJZS5wb3AoKSxmZT1JZVtJZS5sZW5ndGgtMV18fG51bGx9dmFyIGd0PTE7ZnVuY3Rpb24gSHQoYSl7Z3QrPWF9ZnVuY3Rpb24geXQoYSl7cmV0dXJuIGEuZHluYW1pY0NoaWxkcmVuPWd0PjA/ZmV8fHkuRU1QVFlfQVJSOm51bGwsY3QoKSxndD4wJiZmZSYmZmUucHVzaChhKSxhfWZ1bmN0aW9uIGplKGEsdSxtLFMsSSxPKXtyZXR1cm4geXQoanQoYSx1LG0sUyxJLE8sITApKX1mdW5jdGlvbiBNdChhLHUsbSxTLEkpe3JldHVybiB5dChVdChhLHUsbSxTLEksITApKX1mdW5jdGlvbiBkbihhKXtyZXR1cm4gYT9hLl9fdl9pc1ZOb2RlPT09ITA6ITF9ZnVuY3Rpb24gR3QoYSx1KXtyZXR1cm4gYS50eXBlPT09dS50eXBlJiZhLmtleT09PXUua2V5fWZ1bmN0aW9uIGR0KGEpe312YXIgZW49Il9fdkludGVybmFsIixCbj1hPT57dmFye2tleTp1fT1hO3JldHVybiB1IT1udWxsP3U6bnVsbH0sWXQ9YT0+e3ZhcntyZWY6dSxyZWZfa2V5Om0scmVmX2ZvcjpTfT1hO3JldHVybiB1IT1udWxsP3kuaXNTdHJpbmcodSl8fFIuaXNSZWYodSl8fHkuaXNGdW5jdGlvbih1KT97aTpBbixyOnUsazptLGY6ISFTfTp1Om51bGx9O2Z1bmN0aW9uIGp0KGEpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsLG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwsUz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxJPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLE89YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOmE9PT1xPzA6MSxGPWFyZ3VtZW50cy5sZW5ndGg+NiYmYXJndW1lbnRzWzZdIT09dm9pZCAwP2FyZ3VtZW50c1s2XTohMSxXPWFyZ3VtZW50cy5sZW5ndGg+NyYmYXJndW1lbnRzWzddIT09dm9pZCAwP2FyZ3VtZW50c1s3XTohMSxHPXtfX3ZfaXNWTm9kZTohMCxfX3Zfc2tpcDohMCx0eXBlOmEscHJvcHM6dSxrZXk6dSYmQm4odSkscmVmOnUmJll0KHUpLHNjb3BlSWQ6Z24sc2xvdFNjb3BlSWRzOm51bGwsY2hpbGRyZW46bSxjb21wb25lbnQ6bnVsbCxzdXNwZW5zZTpudWxsLHNzQ29udGVudDpudWxsLHNzRmFsbGJhY2s6bnVsbCxkaXJzOm51bGwsdHJhbnNpdGlvbjpudWxsLGVsOm51bGwsYW5jaG9yOm51bGwsdGFyZ2V0Om51bGwsdGFyZ2V0QW5jaG9yOm51bGwsc3RhdGljQ291bnQ6MCxzaGFwZUZsYWc6TyxwYXRjaEZsYWc6UyxkeW5hbWljUHJvcHM6SSxkeW5hbWljQ2hpbGRyZW46bnVsbCxhcHBDb250ZXh0Om51bGwsaG9zdEluc3RhbmNlOkFuLGN0eDpBbn07cmV0dXJuIFc/KElyKEcsbSksTyYxMjgmJmEubm9ybWFsaXplKEcpKTptJiYoRy5zaGFwZUZsYWd8PXkuaXNTdHJpbmcobSk/ODoxNiksZ3Q+MCYmIUYmJmZlJiYoRy5wYXRjaEZsYWc+MHx8TyY2KSYmRy5wYXRjaEZsYWchPT0zMiYmZmUucHVzaChHKSxHfXZhciBVdD1xdDtmdW5jdGlvbiBxdChhKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbCxtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsLFM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOjAsST1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxPPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTohMTtpZigoIWF8fGE9PT1ybykmJihhPWNlKSxkbihhKSl7dmFyIEY9Y2koYSx1LCEwKTtyZXR1cm4gbSYmSXIoRixtKSxndD4wJiYhTyYmZmUmJihGLnNoYXBlRmxhZyY2P2ZlW2ZlLmluZGV4T2YoYSldPUY6ZmUucHVzaChGKSksRi5wYXRjaEZsYWd8PS0yLEZ9aWYoX28oYSkmJihhPWEuX192Y2NPcHRzKSx1KXt1PXRhKHUpO3ZhcntjbGFzczpXLHN0eWxlOkd9PXU7VyYmIXkuaXNTdHJpbmcoVykmJih1LmNsYXNzPXkubm9ybWFsaXplQ2xhc3MoVykpLHkuaXNPYmplY3QoRykmJihSLmlzUHJveHkoRykmJiF5LmlzQXJyYXkoRykmJihHPXkuZXh0ZW5kKHt9LEcpKSx1LnN0eWxlPXkubm9ybWFsaXplU3R5bGUoRykpfXZhciBsZT15LmlzU3RyaW5nKGEpPzE6bWkoYSk/MTI4OmxzKGEpPzY0OnkuaXNPYmplY3QoYSk/NDp5LmlzRnVuY3Rpb24oYSk/MjowO3JldHVybiBqdChhLHUsbSxTLEksbGUsTywhMCl9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGE/Ui5pc1Byb3h5KGEpfHxlbiBpbiBhP3kuZXh0ZW5kKHt9LGEpOmE6bnVsbH1mdW5jdGlvbiBjaShhLHUpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSx7cHJvcHM6UyxyZWY6SSxwYXRjaEZsYWc6TyxjaGlsZHJlbjpGfT1hLFc9dT9IbihTfHx7fSx1KTpTLEc9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6YS50eXBlLHByb3BzOlcsa2V5OlcmJkJuKFcpLHJlZjp1JiZ1LnJlZj9tJiZJP3kuaXNBcnJheShJKT9JLmNvbmNhdChZdCh1KSk6W0ksWXQodSldOll0KHUpOkksc2NvcGVJZDphLnNjb3BlSWQsc2xvdFNjb3BlSWRzOmEuc2xvdFNjb3BlSWRzLGNoaWxkcmVuOkYsdGFyZ2V0OmEudGFyZ2V0LHRhcmdldEFuY2hvcjphLnRhcmdldEFuY2hvcixzdGF0aWNDb3VudDphLnN0YXRpY0NvdW50LHNoYXBlRmxhZzphLnNoYXBlRmxhZyxwYXRjaEZsYWc6dSYmYS50eXBlIT09cT9PPT09LTE/MTY6T3wxNjpPLGR5bmFtaWNQcm9wczphLmR5bmFtaWNQcm9wcyxkeW5hbWljQ2hpbGRyZW46YS5keW5hbWljQ2hpbGRyZW4sYXBwQ29udGV4dDphLmFwcENvbnRleHQsaG9zdEluc3RhbmNlOmEuaG9zdEluc3RhbmNlLGRpcnM6YS5kaXJzLHRyYW5zaXRpb246YS50cmFuc2l0aW9uLGNvbXBvbmVudDphLmNvbXBvbmVudCxzdXNwZW5zZTphLnN1c3BlbnNlLHNzQ29udGVudDphLnNzQ29udGVudCYmY2koYS5zc0NvbnRlbnQpLHNzRmFsbGJhY2s6YS5zc0ZhbGxiYWNrJiZjaShhLnNzRmFsbGJhY2spLGVsOmEuZWwsYW5jaG9yOmEuYW5jaG9yLGN0eDphLmN0eCxjZTphLmNlfTtyZXR1cm4gR31mdW5jdGlvbiBlaSgpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiICIsdT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MDtyZXR1cm4gVXQodGUsbnVsbCxhLHUpfWZ1bmN0aW9uIHFpKGEsdSl7dmFyIG09VXQocGUsbnVsbCxhKTtyZXR1cm4gbS5zdGF0aWNDb3VudD11LG19ZnVuY3Rpb24gamEoKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06IiIsdT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIHU/KENlKCksTXQoY2UsbnVsbCxhKSk6VXQoY2UsbnVsbCxhKX1mdW5jdGlvbiBVbihhKXtyZXR1cm4gYT09bnVsbHx8dHlwZW9mIGE9PSJib29sZWFuIj9VdChjZSk6eS5pc0FycmF5KGEpP1V0KHEsbnVsbCxhLnNsaWNlKCkpOnR5cGVvZiBhPT0ib2JqZWN0Ij8kbihhKTpVdCh0ZSxudWxsLFN0cmluZyhhKSl9ZnVuY3Rpb24gJG4oYSl7cmV0dXJuIGEuZWw9PT1udWxsJiZhLnBhdGNoRmxhZyE9PS0xfHxhLm1lbW8/YTpjaShhKX1mdW5jdGlvbiBJcihhLHUpe3ZhciBtPTAse3NoYXBlRmxhZzpTfT1hO2lmKHU9PW51bGwpdT1udWxsO2Vsc2UgaWYoeS5pc0FycmF5KHUpKW09MTY7ZWxzZSBpZih0eXBlb2YgdT09Im9iamVjdCIpaWYoUyYoMXw2NCkpe3ZhciBJPXUuZGVmYXVsdDtJJiYoSS5fYyYmKEkuX2Q9ITEpLElyKGEsSSgpKSxJLl9jJiYoSS5fZD0hMCkpO3JldHVybn1lbHNle209MzI7dmFyIE89dS5fOyFPJiYhKGVuIGluIHUpP3UuX2N0eD1BbjpPPT09MyYmQW4mJihBbi5zbG90cy5fPT09MT91Ll89MToodS5fPTIsYS5wYXRjaEZsYWd8PTEwMjQpKX1lbHNlIHkuaXNGdW5jdGlvbih1KT8odT17ZGVmYXVsdDp1LF9jdHg6QW59LG09MzIpOih1PVN0cmluZyh1KSxTJjY0PyhtPTE2LHU9W2VpKHUpXSk6bT04KTthLmNoaWxkcmVuPXUsYS5zaGFwZUZsYWd8PW19ZnVuY3Rpb24gSG4oKXtmb3IodmFyIGE9e30sdT0wO3U8YXJndW1lbnRzLmxlbmd0aDt1Kyspe3ZhciBtPXU8MHx8YXJndW1lbnRzLmxlbmd0aDw9dT92b2lkIDA6YXJndW1lbnRzW3VdO2Zvcih2YXIgUyBpbiBtKWlmKFM9PT0iY2xhc3MiKWEuY2xhc3MhPT1tLmNsYXNzJiYoYS5jbGFzcz15Lm5vcm1hbGl6ZUNsYXNzKFthLmNsYXNzLG0uY2xhc3NdKSk7ZWxzZSBpZihTPT09InN0eWxlIilhLnN0eWxlPXkubm9ybWFsaXplU3R5bGUoW2Euc3R5bGUsbS5zdHlsZV0pO2Vsc2UgaWYoeS5pc09uKFMpKXt2YXIgST1hW1NdLE89bVtTXTtPJiZJIT09TyYmISh5LmlzQXJyYXkoSSkmJkkuaW5jbHVkZXMoTykpJiYoYVtTXT1JP1tdLmNvbmNhdChJLE8pOk8pfWVsc2UgUyE9PSIiJiYoYVtTXT1tW1NdKX1yZXR1cm4gYX1mdW5jdGlvbiB5cihhLHUsbSl7dmFyIFM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7UChhLHUsNyxbbSxTXSl9dmFyIHpyPWFzKCksbmE9MDtmdW5jdGlvbiBjcyhhLHUsbSl7dmFyIFM9YS50eXBlLEk9KHU/dS5hcHBDb250ZXh0OmEuYXBwQ29udGV4dCl8fHpyLE89e3VpZDpuYSsrLHZub2RlOmEsdHlwZTpTLHBhcmVudDp1LGFwcENvbnRleHQ6SSxyb290Om51bGwsbmV4dDpudWxsLHN1YlRyZWU6bnVsbCxlZmZlY3Q6bnVsbCx1cGRhdGU6bnVsbCxzY29wZTpuZXcgUi5FZmZlY3RTY29wZSghMCkscmVuZGVyOm51bGwscHJveHk6bnVsbCxleHBvc2VkOm51bGwsZXhwb3NlUHJveHk6bnVsbCx3aXRoUHJveHk6bnVsbCxwcm92aWRlczp1P3UucHJvdmlkZXM6T2JqZWN0LmNyZWF0ZShJLnByb3ZpZGVzKSxhY2Nlc3NDYWNoZTpudWxsLHJlbmRlckNhY2hlOltdLGNvbXBvbmVudHM6bnVsbCxkaXJlY3RpdmVzOm51bGwscHJvcHNPcHRpb25zOlRhKFMsSSksZW1pdHNPcHRpb25zOm9yKFMsSSksZW1pdDpudWxsLGVtaXR0ZWQ6bnVsbCxwcm9wc0RlZmF1bHRzOnkuRU1QVFlfT0JKLGluaGVyaXRBdHRyczpTLmluaGVyaXRBdHRycyxjdHg6eS5FTVBUWV9PQkosZGF0YTp5LkVNUFRZX09CSixwcm9wczp5LkVNUFRZX09CSixhdHRyczp5LkVNUFRZX09CSixzbG90czp5LkVNUFRZX09CSixyZWZzOnkuRU1QVFlfT0JKLHNldHVwU3RhdGU6eS5FTVBUWV9PQkosc2V0dXBDb250ZXh0Om51bGwsc3VzcGVuc2U6bSxzdXNwZW5zZUlkOm0/bS5wZW5kaW5nSWQ6MCxhc3luY0RlcDpudWxsLGFzeW5jUmVzb2x2ZWQ6ITEsaXNNb3VudGVkOiExLGlzVW5tb3VudGVkOiExLGlzRGVhY3RpdmF0ZWQ6ITEsYmM6bnVsbCxjOm51bGwsYm06bnVsbCxtOm51bGwsYnU6bnVsbCx1Om51bGwsdW06bnVsbCxidW06bnVsbCxkYTpudWxsLGE6bnVsbCxydGc6bnVsbCxydGM6bnVsbCxlYzpudWxsLHNwOm51bGx9O3JldHVybiBPLmN0eD17XzpPfSxPLnJvb3Q9dT91LnJvb3Q6TyxPLmVtaXQ9c24uYmluZChudWxsLE8pLGEuY2UmJmEuY2UoTyksT312YXIgb249bnVsbCxfbj0oKT0+b258fEFuLGpuPWE9Pntvbj1hLGEuc2NvcGUub24oKX0scW49KCk9PntvbiYmb24uc2NvcGUub2ZmKCksb249bnVsbH07ZnVuY3Rpb24gQWkoYSl7cmV0dXJuIGEudm5vZGUuc2hhcGVGbGFnJjR9aC5pc0luU1NSQ29tcG9uZW50U2V0dXA9ITE7ZnVuY3Rpb24gdXMoYSl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO2guaXNJblNTUkNvbXBvbmVudFNldHVwPXU7dmFye3Byb3BzOm0sY2hpbGRyZW46U309YS52bm9kZSxJPUFpKGEpO3dpKGEsbSxJLHUpLFdpKGEsUyk7dmFyIE89ST96YShhLHUpOnZvaWQgMDtyZXR1cm4gaC5pc0luU1NSQ29tcG9uZW50U2V0dXA9ITEsT31mdW5jdGlvbiB6YShhLHUpe3ZhciBtPWEudHlwZTthLmFjY2Vzc0NhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksYS5wcm94eT1SLm1hcmtSYXcobmV3IFByb3h5KGEuY3R4LFgpKTt2YXJ7c2V0dXA6U309bTtpZihTKXt2YXIgST1hLnNldHVwQ29udGV4dD1TLmxlbmd0aD4xP1lhKGEpOm51bGw7am4oYSksUi5wYXVzZVRyYWNraW5nKCk7dmFyIE89T3QoUyxhLDAsW2EucHJvcHMsSV0pO2lmKFIucmVzZXRUcmFja2luZygpLHFuKCkseS5pc1Byb21pc2UoTykpe2lmKE8udGhlbihxbixxbiksdSlyZXR1cm4gTy50aGVuKEY9PntJYShhLEYsdSl9KS5jYXRjaChGPT57d3QoRixhLDApfSk7YS5hc3luY0RlcD1PfWVsc2UgSWEoYSxPLHUpfWVsc2UgV3IoYSx1KX1mdW5jdGlvbiBJYShhLHUsbSl7eS5pc0Z1bmN0aW9uKHUpP2EucmVuZGVyPXU6eS5pc09iamVjdCh1KSYmKGEuc2V0dXBTdGF0ZT1SLnByb3h5UmVmcyh1KSksV3IoYSxtKX12YXIgcmEsc287ZnVuY3Rpb24gV2EoYSl7cmE9YSxzbz11PT57dS5yZW5kZXIuX3JjJiYodS53aXRoUHJveHk9bmV3IFByb3h5KHUuY3R4LEspKX19dmFyIGZzPSgpPT4hcmE7ZnVuY3Rpb24gV3IoYSx1LG0pe3ZhciBTPWEudHlwZTtpZighYS5yZW5kZXIpe2lmKCF1JiZyYSYmIVMucmVuZGVyKXt2YXIgST1TLnRlbXBsYXRlfHxEbihhKS50ZW1wbGF0ZTtpZihJKXt2YXJ7aXNDdXN0b21FbGVtZW50Ok8sY29tcGlsZXJPcHRpb25zOkZ9PWEuYXBwQ29udGV4dC5jb25maWcse2RlbGltaXRlcnM6Vyxjb21waWxlck9wdGlvbnM6R309UyxsZT15LmV4dGVuZCh5LmV4dGVuZCh7aXNDdXN0b21FbGVtZW50Ok8sZGVsaW1pdGVyczpXfSxGKSxHKTtTLnJlbmRlcj1yYShJLGxlKX19YS5yZW5kZXI9Uy5yZW5kZXJ8fHkuTk9PUCxzbyYmc28oYSl9am4oYSksUi5wYXVzZVRyYWNraW5nKCksTmUoYSksUi5yZXNldFRyYWNraW5nKCkscW4oKX1mdW5jdGlvbiBHYShhKXtyZXR1cm4gbmV3IFByb3h5KGEuYXR0cnMse2dldCh1LG0pe3JldHVybiBSLnRyYWNrKGEsImdldCIsIiRhdHRycyIpLHVbbV19fSl9ZnVuY3Rpb24gWWEoYSl7dmFyIHU9Uz0+e2EuZXhwb3NlZD1TfHx7fX0sbTtyZXR1cm57Z2V0IGF0dHJzKCl7cmV0dXJuIG18fChtPUdhKGEpKX0sc2xvdHM6YS5zbG90cyxlbWl0OmEuZW1pdCxleHBvc2U6dX19ZnVuY3Rpb24gRm8oYSl7aWYoYS5leHBvc2VkKXJldHVybiBhLmV4cG9zZVByb3h5fHwoYS5leHBvc2VQcm94eT1uZXcgUHJveHkoUi5wcm94eVJlZnMoUi5tYXJrUmF3KGEuZXhwb3NlZCkpLHtnZXQodSxtKXtpZihtIGluIHUpcmV0dXJuIHVbbV07aWYobSBpbiB2dClyZXR1cm4gdnRbbV0oYSl9LGhhcyh1LG0pe3JldHVybiBtIGluIHV8fG0gaW4gdnR9fSkpfWZ1bmN0aW9uIERpKGEpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMDtyZXR1cm4geS5pc0Z1bmN0aW9uKGEpP2EuZGlzcGxheU5hbWV8fGEubmFtZTphLm5hbWV8fHUmJmEuX19uYW1lfWZ1bmN0aW9uIF9vKGEpe3JldHVybiB5LmlzRnVuY3Rpb24oYSkmJiJfX3ZjY09wdHMiaW4gYX12YXIgYm89KGEsdSk9PlIuY29tcHV0ZWQoYSx1LGguaXNJblNTUkNvbXBvbmVudFNldHVwKTtmdW5jdGlvbiBkcygpe3JldHVybiBudWxsfWZ1bmN0aW9uIFZvKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24geHMoYSl7fWZ1bmN0aW9uIGhzKGEsdSl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gQnMoKXtyZXR1cm4gTnQoKS5zbG90c31mdW5jdGlvbiB4ZSgpe3JldHVybiBOdCgpLmF0dHJzfWZ1bmN0aW9uIE50KCl7dmFyIGE9X24oKTtyZXR1cm4gYS5zZXR1cENvbnRleHR8fChhLnNldHVwQ29udGV4dD1ZYShhKSl9ZnVuY3Rpb24gUHQoYSx1KXt2YXIgbT15LmlzQXJyYXkoYSk/YS5yZWR1Y2UoKE8sRik9PihPW0ZdPXt9LE8pLHt9KTphO2Zvcih2YXIgUyBpbiB1KXt2YXIgST1tW1NdO0k/eS5pc0FycmF5KEkpfHx5LmlzRnVuY3Rpb24oSSk/bVtTXT17dHlwZTpJLGRlZmF1bHQ6dVtTXX06SS5kZWZhdWx0PXVbU106ST09PW51bGwmJihtW1NdPXtkZWZhdWx0OnVbU119KX1yZXR1cm4gbX1mdW5jdGlvbiB3bihhLHUpe3ZhciBtPXt9LFM9ZnVuY3Rpb24oTyl7dS5pbmNsdWRlcyhPKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KG0sTyx7ZW51bWVyYWJsZTohMCxnZXQ6KCk9PmFbT119KX07Zm9yKHZhciBJIGluIGEpUyhJKTtyZXR1cm4gbX1mdW5jdGlvbiBFcihhKXt2YXIgdT1fbigpLG09YSgpO3JldHVybiBxbigpLHkuaXNQcm9taXNlKG0pJiYobT1tLmNhdGNoKFM9Pnt0aHJvdyBqbih1KSxTfSkpLFttLCgpPT5qbih1KV19ZnVuY3Rpb24gT2koYSx1LG0pe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIFM9PT0yP3kuaXNPYmplY3QodSkmJiF5LmlzQXJyYXkodSk/ZG4odSk/VXQoYSxudWxsLFt1XSk6VXQoYSx1KTpVdChhLG51bGwsdSk6KFM+Mz9tPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTpTPT09MyYmZG4obSkmJihtPVttXSksVXQoYSx1LG0pKX12YXIgSmk9U3ltYm9sKCIiKSxVbz0oKT0+e3t2YXIgYT1ObihKaSk7cmV0dXJuIGF9fTtmdW5jdGlvbiBOYSgpe31mdW5jdGlvbiBpYShhLHUsbSxTKXt2YXIgST1tW1NdO2lmKEkmJmdzKEksYSkpcmV0dXJuIEk7dmFyIE89dSgpO3JldHVybiBPLm1lbW89YS5zbGljZSgpLG1bU109T31mdW5jdGlvbiBncyhhLHUpe3ZhciBtPWEubWVtbztpZihtLmxlbmd0aCE9dS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBTPTA7UzxtLmxlbmd0aDtTKyspaWYoeS5oYXNDaGFuZ2VkKG1bU10sdVtTXSkpcmV0dXJuITE7cmV0dXJuIGd0PjAmJmZlJiZmZS5wdXNoKGEpLCEwfXZhciBwcz0iMy4yLjQ3IixkbD1udWxsLCRsPW51bGwsSGw9bnVsbCxNcz17aW5zZXJ0OihhLHUsbSk9Pm0/dS5pbnNlcnRCZWZvcmUoYSxtKTp1LmFwcGVuZENoaWxkKGEpLHJlbW92ZTphPT57dmFyIHU9YS5wYXJlbnROb2RlO3UmJnUucmVtb3ZlQ2hpbGQoYSl9LGNyZWF0ZUVsZW1lbnQ6YT0+cy5jcmVhdGVFbGVtZW50KGEpLGNyZWF0ZVRleHQ6YT0+cy5jcmVhdGVUZXh0KGEpLGNyZWF0ZUNvbW1lbnQ6YT0+cy5jcmVhdGVDb21tZW50KGEpLHNldFRleHQ6KGEsdSk9PnthLnNldEF0dHIoInZhbHVlIix1KX0sc2V0RWxlbWVudFRleHQ6KGEsdSk9PnthLnNldEF0dHIoInZhbHVlIix1KX0scGFyZW50Tm9kZTphPT5hLnBhcmVudE5vZGUsbmV4dFNpYmxpbmc6YT0+YS5uZXh0U2libGluZ307ZnVuY3Rpb24gJG8oYSl7cmV0dXJuIE9iamVjdC5rZXlzKGEpfWZ1bmN0aW9uIEhvKGEpe3ZhciB1PXt9O3JldHVybiB5LmlzQXJyYXkoYSkmJmEuZm9yRWFjaChtPT57JG8obSkuZm9yRWFjaChTPT57dmFyIEk9bVtTXSxPPXVbU118fCh1W1NdPXt9KTskbyhJKS5mb3JFYWNoKEY9Pnt2YXIgVz1JW0ZdLEc9T1tGXXx8KE9bRl09e30pOyRvKFcpLmZvckVhY2gobGU9PntsZVswXT09PSIhIj8oR1tsZV09V1tsZV0sZGVsZXRlIEdbbGUuc2xpY2UoMSldKTp5Lmhhc093bihHLCIhIitsZSl8fChHW2xlXT1XW2xlXSl9KX0pfSl9KSx1fWZ1bmN0aW9uIG9hKGEsdSl7dmFyIG09dSYmdS5jbGFzc0xpc3Q7cmV0dXJuIG0mJm0uaW5jbHVkZXMoYSl9dmFyIHFhPS9bK34+IF0kLyx2cz0icGFyZW50Tm9kZSIsam89InByZXZpb3VzU2libGluZyI7ZnVuY3Rpb24gRHMoYSx1KXtmb3IodmFyIG09YS5zcGxpdCgiLiIpLFM9bS5sZW5ndGgtMTtTPjA7Uy0tKXt2YXIgST1tW1NdLE89SVtJLmxlbmd0aC0xXSxGPUkucmVwbGFjZShxYSwiIik7aWYoTz09PSJ+Inx8Tz09PSIgIil7Zm9yKHZhciBXPU89PT0ifiI/am86dnM7dSYmKHU9dVtXXSwhb2EoRix1KSk7KTtpZighdSlyZXR1cm4hMX1lbHNlIGlmKE89PT0iPiI/dT11JiZ1W3ZzXTpPPT09IisiJiYodT11JiZ1W2pvXSksIW9hKEYsdSkpcmV0dXJuITF9cmV0dXJuITB9dmFyIGpsPTFlMztmdW5jdGlvbiBMcyhhLHUsbSl7dmFye3N0eWxlczpTLHdlaWdodHM6SX09YTskbyh1KS5mb3JFYWNoKE89PntpZighKE8mJm0mJiFEcyhPLG0pKSl7dmFyIEY9Ty5zcGxpdCgiLiIpLmxlbmd0aCxXPXVbT107JG8oVykuZm9yRWFjaChHPT57dmFyIGxlPVdbR10sV2U9R1swXT09PSIhIjtXZSYmKEc9Ry5zbGljZSgxKSk7dmFyIGl0PUlbR118fDAsZ2U9RisoV2U/amw6MCk7Z2U+PWl0JiYoSVtHXT1nZSxTW0ddPWxlKX0pfX0pfWZ1bmN0aW9uIG1zKGEsdSl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwsUz17c3R5bGVzOnt9LHdlaWdodHM6e319O3JldHVybiBhLmZvckVhY2goST0+e3ZhciBPPXVbSV07TyYmTHMoUyxPLG0pfSksUy5zdHlsZXN9ZnVuY3Rpb24gaGwoYSl7cmV0dXJuIG1zKGEuY2xhc3NMaXN0LGEuc3R5bGVTaGVldCxhKX1mdW5jdGlvbiBGcyhhLHUpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsO3JldHVybiBtcyhhLEphKHUpLG0pfWZ1bmN0aW9uIEphKGEpe3Zhcnt0eXBlOnUsYXBwQ29udGV4dDptfT1hLFM9dTtpZighUy5fX3N0eWxlcylpZihtJiZ5LmlzQXJyYXkobS5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcykmJihtLnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzPUhvKG0ucHJvdmlkZXMuX19nbG9iYWxTdHlsZXMpKSxTLm1wVHlwZT09PSJwYWdlIiYmbSlTLl9fc3R5bGVzPW0ucHJvdmlkZXMuX19nbG9iYWxTdHlsZXM7ZWxzZXt2YXIgST1bXTttJiZJLnB1c2gobS5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcykseS5pc0FycmF5KFMuc3R5bGVzKSYmUy5zdHlsZXMuZm9yRWFjaChPPT5JLnB1c2goTykpLFMuX19zdHlsZXM9SG8oSSl9cmV0dXJuIFMuX19zdHlsZXN9ZnVuY3Rpb24gX3MoYSx1LG0pe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO1MmJihbdSxtXT1hYShhLHUsbSxTKSksYS5zZXRBdHRyKHUsbSl9dmFyIFZzPSJob3ZlckNsYXNzIixVcz0icGxhY2Vob2xkZXJDbGFzcyIsZ2w9InBsYWNlaG9sZGVyU3R5bGUiLHpvPSJpbmRpY2F0b3JDbGFzcyIsS2E9ImluZGljYXRvclN0eWxlIixtYT0ibWFza0NsYXNzIixrYT0ibWFza1N0eWxlIix5bz17dmlldzp7Y2xhc3M6W1ZzXSxzdHlsZTpbXX0sYnV0dG9uOntjbGFzczpbVnNdLHN0eWxlOltdfSxuYXZpZ2F0b3I6e2NsYXNzOltWc10sc3R5bGU6W119LCJ1LWlucHV0Ijp7Y2xhc3M6W1VzXSxzdHlsZTpbZ2xdfSwidS10ZXh0YXJlYSI6e2NsYXNzOltVc10sc3R5bGU6W2dsXX0sInBpY2tlci12aWV3Ijp7Y2xhc3M6W3pvLG1hXSxzdHlsZTpbS2Esa2FdfX07ZnVuY3Rpb24gYWEoYSx1LG0sUyl7aWYoIW0pcmV0dXJuW3UsbV07dmFyIEk9eW9bYS50eXBlXTtpZihJKXt2YXIgTz15LmNhbWVsaXplKHUpO2lmKEkuY2xhc3MuaW5kZXhPZihPKT4tMSlyZXR1cm5bTyxGcyhbbV0sUyxhKV07aWYoSS5zdHlsZS5pbmRleE9mKHUpPi0xKXJldHVybiB5LmlzU3RyaW5nKG0pP1tPLHkucGFyc2VTdHJpbmdTdHlsZShtKV06W08seS5ub3JtYWxpemVTdHlsZShtKV19cmV0dXJuW3UsbV19ZnVuY3Rpb24gWmEoYSx1LG0pe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO2lmKCEhUyl7dmFyIEk9bT9tLnNwbGl0KCIgIik6W107YS5zZXRDbGFzc0xpc3QoSSksYS5zZXRTdHlsZVNoZWV0KEphKFMpKX19ZnVuY3Rpb24gJHMoYSx1LG0sUyl7YS5hZGRFdmVudCh1LG0pfWZ1bmN0aW9uIHBsKGEsdSl7YS5yZW1vdmVFdmVudCh1KX1mdW5jdGlvbiBzYShhLHUsbSxTKXt2YXIgST1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxPPWEuX3ZlaXx8KGEuX3ZlaT17fSksRj1PW3VdO2lmKFMmJkYpRi52YWx1ZT1TO2Vsc2V7dmFyW1csR109UWEodSk7aWYoUyl7dmFyIGxlPU9bdV09dGkoUyxJKTskcyhhLFcsbGUpfWVsc2UgRiYmKHBsKGEsVyksT1t1XT12b2lkIDApfX12YXIgWGE9Lyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO2Z1bmN0aW9uIEhzKGEpe3JldHVybiBhPT09Im9uLXBvc3QtbWVzc2FnZSI/Im9uUG9zdE1lc3NhZ2UiOmF9ZnVuY3Rpb24gUWEoYSl7dmFyIHU7aWYoWGEudGVzdChhKSl7dT17fTtmb3IodmFyIG07bT1hLm1hdGNoKFhhKTspYT1hLnNsaWNlKDAsYS5sZW5ndGgtbVswXS5sZW5ndGgpLHVbbVswXS50b0xvd2VyQ2FzZSgpXT0hMH12YXIgUz1hWzJdPT09IjoiP2Euc2xpY2UoMyk6YS5zbGljZSgyKTtyZXR1cm5bSHMoeS5oeXBoZW5hdGUoUykpLHVdfWZ1bmN0aW9uIHRpKGEsdSl7dmFyIG09ST0+e1AobS52YWx1ZSx1LDUsW0ldKX07bS52YWx1ZT1hO3ZhciBTPW5ldyBTZXQ7cmV0dXJuIHkuaXNBcnJheShtLnZhbHVlKT9tLnZhbHVlLmZvckVhY2goST0+e0kubW9kaWZpZXJzJiZJLm1vZGlmaWVycy5mb3JFYWNoKE89PntTLmFkZChPKX0pfSk6bS52YWx1ZS5tb2RpZmllcnMmJm0udmFsdWUubW9kaWZpZXJzLmZvckVhY2goST0+e1MuYWRkKEkpfSksbS5tb2RpZmllcnM9Wy4uLlNdLG19ZnVuY3Rpb24gTXIoYSx1LG0pe2lmKCEhbSl7eS5pc1N0cmluZyhtKSYmKG09eS5wYXJzZVN0cmluZ1N0eWxlKG0pKTt2YXIgUz17fSxJPXUmJiF5LmlzU3RyaW5nKHUpO2lmKEkpe2Zvcih2YXIgTyBpbiB1KW1bT109PW51bGwmJihTW3kuY2FtZWxpemUoTyldPSIiKTtmb3IodmFyIEYgaW4gbSl7dmFyIFc9bVtGXTtXIT09dVtGXSYmKFNbeS5jYW1lbGl6ZShGKV09Vyl9fWVsc2UgZm9yKHZhciBHIGluIG0pU1t5LmNhbWVsaXplKEcpXT1tW0ddO2Euc2V0U3R5bGVzKFMpfX12YXIgbGE9WyJ1LWlucHV0IiwidS10ZXh0YXJlYSJdLHZsPWZ1bmN0aW9uKGEsdSxtLFMpe3ZhciBJPWFyZ3VtZW50cy5sZW5ndGg+Nj9hcmd1bWVudHNbNl06dm9pZCAwLE89YXJndW1lbnRzLmxlbmd0aD45P2FyZ3VtZW50c1s5XTp2b2lkIDA7dT09PSJjbGFzcyI/WmEoYSxtLFMsT3x8SSk6dT09PSJzdHlsZSI/TXIoYSxtLFMpOnkuaXNPbih1KT95LmlzTW9kZWxMaXN0ZW5lcih1KXx8c2EoYSx1LG0sUyxJKTp1PT09Im1vZGVsVmFsdWUiJiZsYS5pbmNsdWRlcyhhLnR5cGUpP2Euc2V0QXR0cnMoe21vZGVsVmFsdWU6Uyx2YWx1ZTpTfSk6X3MoYSx1LFMsSSl9O2Z1bmN0aW9uIHpsKCl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIkc3R5bGUiO3t2YXIgdT1fbigpO2lmKCF1KXJldHVybiB5LkVNUFRZX09CSjt2YXIgbT11LnR5cGUuX19jc3NNb2R1bGVzO2lmKCFtKXJldHVybiB5LkVNUFRZX09CSjt2YXIgUz1tW2FdO3JldHVybiBTfHx5LkVNUFRZX09CSn19ZnVuY3Rpb24ganMoYSl7dmFyIHU9X24oKTtpZighIXUpe3ZhciBtPSgpPT5icyh1LnN1YlRyZWUsYSh1LnByb3h5KSk7ZXIoKCk9PlpuKG0se2ZsdXNoOiJwb3N0In0pKSxHbihtKX19ZnVuY3Rpb24gYnMoYSx1KXtpZihhLnNoYXBlRmxhZyYxMjgpe3ZhciBtPWEuc3VzcGVuc2U7YT1tLmFjdGl2ZUJyYW5jaCxtLnBlbmRpbmdCcmFuY2gmJiFtLmlzSHlkcmF0aW5nJiZtLmVmZmVjdHMucHVzaCgoKT0+e2JzKG0uYWN0aXZlQnJhbmNoLHUpfSl9Zm9yKDthLmNvbXBvbmVudDspYT1hLmNvbXBvbmVudC5zdWJUcmVlO2lmKGEuc2hhcGVGbGFnJjEmJmEuZWwpe3ZhciBTPWEuZWwuc3R5bGU7Zm9yKHZhciBJIGluIHUpUy5zZXRQcm9wZXJ0eSgiLS0iLmNvbmNhdChJKSx1W0ldKX1lbHNlIGEudHlwZT09PXEmJmEuY2hpbGRyZW4uZm9yRWFjaChPPT5icyhPLHUpKX12YXIgenM9WyJjdHJsIiwic2hpZnQiLCJhbHQiLCJtZXRhIl0sV3M9e3N0b3A6YT0+YS5zdG9wUHJvcGFnYXRpb24oKSxwcmV2ZW50OmE9PmEucHJldmVudERlZmF1bHQoKSxzZWxmOmE9PmEudGFyZ2V0IT09YS5jdXJyZW50VGFyZ2V0LGN0cmw6YT0+IWEuY3RybEtleSxzaGlmdDphPT4hYS5zaGlmdEtleSxhbHQ6YT0+IWEuYWx0S2V5LG1ldGE6YT0+IWEubWV0YUtleSxsZWZ0OmE9PiJidXR0b24iaW4gYSYmYS5idXR0b24hPT0wLG1pZGRsZTphPT4iYnV0dG9uImluIGEmJmEuYnV0dG9uIT09MSxyaWdodDphPT4iYnV0dG9uImluIGEmJmEuYnV0dG9uIT09MixleGFjdDooYSx1KT0+enMuc29tZShtPT5hWyIiLmNvbmNhdChtLCJLZXkiKV0mJiF1LmluY2x1ZGVzKG0pKX0sbWw9KGEsdSk9PmZ1bmN0aW9uKG0pe2Zvcih2YXIgUz0wO1M8dS5sZW5ndGg7UysrKXt2YXIgST1Xc1t1W1NdXTtpZihJJiZJKG0sdSkpcmV0dXJufWZvcih2YXIgTz1hcmd1bWVudHMubGVuZ3RoLEY9bmV3IEFycmF5KE8+MT9PLTE6MCksVz0xO1c8TztXKyspRltXLTFdPWFyZ3VtZW50c1tXXTtyZXR1cm4gYShtLC4uLkYpfSxHcz0oYSx1KT0+bT0+e2lmKCJrZXkiaW4gbSl7dmFyIFM9eS5oeXBoZW5hdGUobS5rZXkpO2lmKHUuc29tZShJPT5JPT09UykpcmV0dXJuIGEobSl9fSx5cz15LmV4dGVuZCh7cGF0Y2hQcm9wOnZsfSxNcyksRXM7ZnVuY3Rpb24gU3MoKXtyZXR1cm4gRXN8fChFcz1scih5cykpfXZhciBfbD1mdW5jdGlvbigpe1NzKCkucmVuZGVyKC4uLmFyZ3VtZW50cyl9LGJsPWZ1bmN0aW9uKCl7dmFyIGE9U3MoKS5jcmVhdGVBcHAoLi4uYXJndW1lbnRzKSx7bW91bnQ6dX09YTtyZXR1cm4gYS5tb3VudD1tPT51KG0pLGF9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwiY2FtZWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmNhbWVsaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJjYXBpdGFsaXplIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5jYXBpdGFsaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJoeXBoZW5hdGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5Lmh5cGhlbmF0ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwibm9ybWFsaXplQ2xhc3MiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5Lm5vcm1hbGl6ZUNsYXNzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJub3JtYWxpemVQcm9wcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkubm9ybWFsaXplUHJvcHN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsIm5vcm1hbGl6ZVN0eWxlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5ub3JtYWxpemVTdHlsZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwidG9EaXNwbGF5U3RyaW5nIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS50b0Rpc3BsYXlTdHJpbmd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInRvSGFuZGxlcktleSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkudG9IYW5kbGVyS2V5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJFZmZlY3RTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuRWZmZWN0U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsIlJlYWN0aXZlRWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5SZWFjdGl2ZUVmZmVjdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwiY3VzdG9tUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5jdXN0b21SZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImVmZmVjdCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuZWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJlZmZlY3RTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuZWZmZWN0U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImdldEN1cnJlbnRTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuZ2V0Q3VycmVudFNjb3BlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJpc1Byb3h5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5pc1Byb3h5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJpc1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5pc1JlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJpc1JlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5pc1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJpc1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuaXNSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImlzU2hhbGxvdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuaXNTaGFsbG93fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJtYXJrUmF3Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5tYXJrUmF3fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJvblNjb3BlRGlzcG9zZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIub25TY29wZURpc3Bvc2V9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInByb3h5UmVmcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIucHJveHlSZWZzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJyZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIucmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInJlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5yZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwicmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5yZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInNoYWxsb3dSZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuc2hhbGxvd1JlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJzaGFsbG93UmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLnNoYWxsb3dSZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwic2hhbGxvd1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuc2hhbGxvd1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwic3RvcCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuc3RvcH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwidG9SYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLnRvUmF3fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJ0b1JlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIudG9SZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInRvUmVmcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIudG9SZWZzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJ0cmlnZ2VyUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi50cmlnZ2VyUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJ1bnJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIudW5yZWZ9fSksaC5CYXNlVHJhbnNpdGlvbj1VcixoLkJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzPXBuLGguQ29tbWVudD1jZSxoLkZyYWdtZW50PXEsaC5LZWVwQWxpdmU9Zm4saC5TdGF0aWM9cGUsaC5TdXNwZW5zZT11byxoLlRlbGVwb3J0PVUsaC5UZXh0PXRlLGguYXNzZXJ0TnVtYmVyPVZ0LGguY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmc9UCxoLmNhbGxXaXRoRXJyb3JIYW5kbGluZz1PdCxoLmNsb25lVk5vZGU9Y2ksaC5jb21wYXRVdGlscz1IbCxoLmNvbXB1dGVkPWJvLGguY3JlYXRlQXBwPWJsLGguY3JlYXRlQmxvY2s9TXQsaC5jcmVhdGVDb21tZW50Vk5vZGU9amEsaC5jcmVhdGVFbGVtZW50QmxvY2s9amUsaC5jcmVhdGVFbGVtZW50Vk5vZGU9anQsaC5jcmVhdGVIeWRyYXRpb25SZW5kZXJlcj0kYSxoLmNyZWF0ZVByb3BzUmVzdFByb3h5PXduLGguY3JlYXRlUmVuZGVyZXI9bHIsaC5jcmVhdGVTbG90cz1CLGguY3JlYXRlU3RhdGljVk5vZGU9cWksaC5jcmVhdGVUZXh0Vk5vZGU9ZWksaC5jcmVhdGVWTm9kZT1VdCxoLmRlZmluZUFzeW5jQ29tcG9uZW50PVJyLGguZGVmaW5lQ29tcG9uZW50PVJpLGguZGVmaW5lRW1pdHM9Vm8saC5kZWZpbmVFeHBvc2U9eHMsaC5kZWZpbmVQcm9wcz1kcyxoLmdldEN1cnJlbnRJbnN0YW5jZT1fbixoLmdldFRyYW5zaXRpb25SYXdDaGlsZHJlbj1PcixoLmd1YXJkUmVhY3RpdmVQcm9wcz10YSxoLmg9T2ksaC5oYW5kbGVFcnJvcj13dCxoLmluaXRDdXN0b21Gb3JtYXR0ZXI9TmEsaC5pbmplY3Q9Tm4saC5pbmplY3RIb29rPXhpLGguaXNNZW1vU2FtZT1ncyxoLmlzUnVudGltZU9ubHk9ZnMsaC5pc1ZOb2RlPWRuLGgubWVyZ2VEZWZhdWx0cz1QdCxoLm1lcmdlUHJvcHM9SG4saC5uZXh0VGljaz1xcixoLm9uQWN0aXZhdGVkPSRyLGgub25CZWZvcmVNb3VudD1RcixoLm9uQmVmb3JlVW5tb3VudD1ucixoLm9uQmVmb3JlVXBkYXRlPXRyLGgub25EZWFjdGl2YXRlZD10byxoLm9uRXJyb3JDYXB0dXJlZD1ubyxoLm9uTW91bnRlZD1lcixoLm9uUmVuZGVyVHJhY2tlZD1ObyxoLm9uUmVuZGVyVHJpZ2dlcmVkPWdvLGgub25TZXJ2ZXJQcmVmZXRjaD1obyxoLm9uVW5tb3VudGVkPWNyLGgub25VcGRhdGVkPUduLGgub3BlbkJsb2NrPUNlLGgucGFyc2VDbGFzc0xpc3Q9RnMsaC5wYXJzZUNsYXNzU3R5bGVzPWhsLGgucG9wU2NvcGVJZD13byxoLnByb3ZpZGU9a3IsaC5wdXNoU2NvcGVJZD1LcixoLnF1ZXVlUG9zdEZsdXNoQ2I9SnIsaC5yZWdpc3RlclJ1bnRpbWVDb21waWxlcj1XYSxoLnJlbmRlcj1fbCxoLnJlbmRlckxpc3Q9UW8saC5yZW5kZXJTbG90PVEsaC5yZXNvbHZlQ29tcG9uZW50PVJvLGgucmVzb2x2ZURpcmVjdGl2ZT12byxoLnJlc29sdmVEeW5hbWljQ29tcG9uZW50PUJpLGgucmVzb2x2ZUZpbHRlcj0kbCxoLnJlc29sdmVUcmFuc2l0aW9uSG9va3M9VGUsaC5zZXRCbG9ja1RyYWNraW5nPUh0LGguc2V0RGV2dG9vbHNIb29rPVRuLGguc2V0VHJhbnNpdGlvbkhvb2tzPXlpLGguc3NyQ29udGV4dEtleT1KaSxoLnNzclV0aWxzPWRsLGgudG9IYW5kbGVycz1hZSxoLnRyYW5zZm9ybVZOb2RlQXJncz1kdCxoLnVzZUF0dHJzPXhlLGgudXNlQ3NzTW9kdWxlPXpsLGgudXNlQ3NzU3R5bGVzPUhvLGgudXNlQ3NzVmFycz1qcyxoLnVzZVNTUkNvbnRleHQ9VW8saC51c2VTbG90cz1CcyxoLnVzZVRyYW5zaXRpb25TdGF0ZT1acixoLnZlcnNpb249cHMsaC53YXJuPUl0LGgud2F0Y2g9RnIsaC53YXRjaEVmZmVjdD1abixoLndhdGNoUG9zdEVmZmVjdD1OaSxoLndhdGNoU3luY0VmZmVjdD1IaSxoLndpdGhBc3luY0NvbnRleHQ9RXIsaC53aXRoQ3R4PVVpLGgud2l0aERlZmF1bHRzPWhzLGgud2l0aERpcmVjdGl2ZXM9a28saC53aXRoS2V5cz1HcyxoLndpdGhNZW1vPWlhLGgud2l0aE1vZGlmaWVycz1tbCxoLndpdGhTY29wZUlkPWRhLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxofSh7fSx3LE4scCk7cmV0dXJuIEUuX19UWVBFX189Im52dWUiLEV9dmFyIERwPU5JKE1JKTt2YXIgaGM9e307QUkoaGMse0VNUFRZX0FSUjooKT0+SkksRU1QVFlfT0JKOigpPT5xSSxOTzooKT0+WkksTk9PUDooKT0+S0ksY2FtZWxpemU6KCk9PmZOLGNhcGl0YWxpemU6KCk9PnJ1LGRlZjooKT0+dk4sZXh0ZW5kOigpPT5GaSxnZXRHbG9iYWxUaGlzOigpPT5iTixoYXNDaGFuZ2VkOigpPT5nTixoYXNPd246KCk9PmlsLGh5cGhlbmF0ZTooKT0+ZmYsaW52b2tlQXJyYXlGbnM6KCk9PnBOLGlzQXJyYXk6KCk9PklpLGlzQnVpbHRJbkRpcmVjdGl2ZTooKT0+Y04saXNGdW5jdGlvbjooKT0+em4saXNHbG9iYWxseVdoaXRlbGlzdGVkOigpPT5GSSxpc0hUTUxUYWc6KCk9PldJLGlzSW50ZWdlcktleTooKT0+c04saXNNYXA6KCk9PlZwLGlzTW9kZWxMaXN0ZW5lcjooKT0+ZU4saXNPYmplY3Q6KCk9PkxsLGlzT246KCk9PlFJLGlzUGxhaW5PYmplY3Q6KCk9PkZsLGlzUHJvbWlzZTooKT0+b04saXNSZWdFeHA6KCk9PnJOLGlzUmVzZXJ2ZWRQcm9wOigpPT5sTixpc1NWR1RhZzooKT0+R0ksaXNTZXQ6KCk9PlVwLGlzU3RyaW5nOigpPT5oaSxpc1N5bWJvbDooKT0+aU4sbG9vc2VUb051bWJlcjooKT0+bU4sbWFrZU1hcDooKT0+RGwsbm9ybWFsaXplQ2xhc3M6KCk9PnVmLG5vcm1hbGl6ZVByb3BzOigpPT5ISSxub3JtYWxpemVTdHlsZTooKT0+Y2YscGFyc2VTdHJpbmdTdHlsZTooKT0+THAscmVtb3ZlOigpPT50Tix0b0Rpc3BsYXlTdHJpbmc6KCk9PllJLHRvSGFuZGxlcktleTooKT0+aE4sdG9OdW1iZXI6KCk9Pl9OLHRvUmF3VHlwZTooKT0+YU4sdG9UeXBlU3RyaW5nOigpPT5NYX0pO2Z1bmN0aW9uIERsKGYscyl7bGV0IHA9T2JqZWN0LmNyZWF0ZShudWxsKSx3PWYuc3BsaXQoIiwiKTtmb3IobGV0IE49MDtOPHcubGVuZ3RoO04rKylwW3dbTl1dPSEwO3JldHVybiBzP049PiEhcFtOLnRvTG93ZXJDYXNlKCldOk49PiEhcFtOXX12YXIgTEk9IkluZmluaXR5LHVuZGVmaW5lZCxOYU4saXNGaW5pdGUsaXNOYU4scGFyc2VGbG9hdCxwYXJzZUludCxkZWNvZGVVUkksZGVjb2RlVVJJQ29tcG9uZW50LGVuY29kZVVSSSxlbmNvZGVVUklDb21wb25lbnQsTWF0aCxOdW1iZXIsRGF0ZSxBcnJheSxPYmplY3QsQm9vbGVhbixTdHJpbmcsUmVnRXhwLE1hcCxTZXQsSlNPTixJbnRsLEJpZ0ludCIsRkk9RGwoTEkpO2Z1bmN0aW9uIGNmKGYpe2lmKElpKGYpKXtsZXQgcz17fTtmb3IobGV0IHA9MDtwPGYubGVuZ3RoO3ArKyl7bGV0IHc9ZltwXSxOPWhpKHcpP0xwKHcpOmNmKHcpO2lmKE4pZm9yKGxldCBFIGluIE4pc1tFXT1OW0VdfXJldHVybiBzfWVsc2V7aWYoaGkoZikpcmV0dXJuIGY7aWYoTGwoZikpcmV0dXJuIGZ9fXZhciBWST0vOyg/IVteKF0qXCkpL2csVUk9LzooW15dKykvLCRJPS9cL1wqLio/XCpcLy9ncztmdW5jdGlvbiBMcChmKXtsZXQgcz17fTtyZXR1cm4gZi5yZXBsYWNlKCRJLCIiKS5zcGxpdChWSSkuZm9yRWFjaChwPT57aWYocCl7bGV0IHc9cC5zcGxpdChVSSk7dy5sZW5ndGg+MSYmKHNbd1swXS50cmltKCldPXdbMV0udHJpbSgpKX19KSxzfWZ1bmN0aW9uIHVmKGYpe2xldCBzPSIiO2lmKGhpKGYpKXM9ZjtlbHNlIGlmKElpKGYpKWZvcihsZXQgcD0wO3A8Zi5sZW5ndGg7cCsrKXtsZXQgdz11ZihmW3BdKTt3JiYocys9dysiICIpfWVsc2UgaWYoTGwoZikpZm9yKGxldCBwIGluIGYpZltwXSYmKHMrPXArIiAiKTtyZXR1cm4gcy50cmltKCl9ZnVuY3Rpb24gSEkoZil7aWYoIWYpcmV0dXJuIG51bGw7bGV0e2NsYXNzOnMsc3R5bGU6cH09ZjtyZXR1cm4gcyYmIWhpKHMpJiYoZi5jbGFzcz11ZihzKSkscCYmKGYuc3R5bGU9Y2YocCkpLGZ9dmFyIGpJPSJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsaDEsaDIsaDMsaDQsaDUsaDYsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsc3VtbWFyeSx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIsekk9InN2ZyxhbmltYXRlLGFuaW1hdGVNb3Rpb24sYW5pbWF0ZVRyYW5zZm9ybSxjaXJjbGUsY2xpcFBhdGgsY29sb3ItcHJvZmlsZSxkZWZzLGRlc2MsZGlzY2FyZCxlbGxpcHNlLGZlQmxlbmQsZmVDb2xvck1hdHJpeCxmZUNvbXBvbmVudFRyYW5zZmVyLGZlQ29tcG9zaXRlLGZlQ29udm9sdmVNYXRyaXgsZmVEaWZmdXNlTGlnaHRpbmcsZmVEaXNwbGFjZW1lbnRNYXAsZmVEaXN0YW50TGlnaHQsZmVEcm9wU2hhZG93LGZlRmxvb2QsZmVGdW5jQSxmZUZ1bmNCLGZlRnVuY0csZmVGdW5jUixmZUdhdXNzaWFuQmx1cixmZUltYWdlLGZlTWVyZ2UsZmVNZXJnZU5vZGUsZmVNb3JwaG9sb2d5LGZlT2Zmc2V0LGZlUG9pbnRMaWdodCxmZVNwZWN1bGFyTGlnaHRpbmcsZmVTcG90TGlnaHQsZmVUaWxlLGZlVHVyYnVsZW5jZSxmaWx0ZXIsZm9yZWlnbk9iamVjdCxnLGhhdGNoLGhhdGNocGF0aCxpbWFnZSxsaW5lLGxpbmVhckdyYWRpZW50LG1hcmtlcixtYXNrLG1lc2gsbWVzaGdyYWRpZW50LG1lc2hwYXRjaCxtZXNocm93LG1ldGFkYXRhLG1wYXRoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJhZGlhbEdyYWRpZW50LHJlY3Qsc2V0LHNvbGlkY29sb3Isc3RvcCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dFBhdGgsdGl0bGUsdHNwYW4sdW5rbm93bix1c2UsdmlldyIsV0k9RGwoakkpLEdJPURsKHpJKSxZST1mPT5oaShmKT9mOmY9PW51bGw/IiI6SWkoZil8fExsKGYpJiYoZi50b1N0cmluZz09PSRwfHwhem4oZi50b1N0cmluZykpP0pTT04uc3RyaW5naWZ5KGYsRnAsMik6U3RyaW5nKGYpLEZwPShmLHMpPT5zJiZzLl9fdl9pc1JlZj9GcChmLHMudmFsdWUpOlZwKHMpP3tbYE1hcCgke3Muc2l6ZX0pYF06Wy4uLnMuZW50cmllcygpXS5yZWR1Y2UoKHAsW3csTl0pPT4ocFtgJHt3fSA9PmBdPU4scCkse30pfTpVcChzKT97W2BTZXQoJHtzLnNpemV9KWBdOlsuLi5zLnZhbHVlcygpXX06TGwocykmJiFJaShzKSYmIUZsKHMpP1N0cmluZyhzKTpzLHFJPXt9LEpJPVtdLEtJPSgpPT57fSxaST0oKT0+ITEsWEk9L15vblteYS16XS8sUUk9Zj0+WEkudGVzdChmKSxlTj1mPT5mLnN0YXJ0c1dpdGgoIm9uVXBkYXRlOiIpLEZpPU9iamVjdC5hc3NpZ24sdE49KGYscyk9PntsZXQgcD1mLmluZGV4T2Yocyk7cD4tMSYmZi5zcGxpY2UocCwxKX0sbk49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxpbD0oZixzKT0+bk4uY2FsbChmLHMpLElpPUFycmF5LmlzQXJyYXksVnA9Zj0+TWEoZik9PT0iW29iamVjdCBNYXBdIixVcD1mPT5NYShmKT09PSJbb2JqZWN0IFNldF0iLHJOPWY9Pk1hKGYpPT09IltvYmplY3QgUmVnRXhwXSIsem49Zj0+dHlwZW9mIGY9PSJmdW5jdGlvbiIsaGk9Zj0+dHlwZW9mIGY9PSJzdHJpbmciLGlOPWY9PnR5cGVvZiBmPT0ic3ltYm9sIixMbD1mPT5mIT09bnVsbCYmdHlwZW9mIGY9PSJvYmplY3QiLG9OPWY9PkxsKGYpJiZ6bihmLnRoZW4pJiZ6bihmLmNhdGNoKSwkcD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLE1hPWY9PiRwLmNhbGwoZiksYU49Zj0+TWEoZikuc2xpY2UoOCwtMSksRmw9Zj0+TWEoZik9PT0iW29iamVjdCBPYmplY3RdIixzTj1mPT5oaShmKSYmZiE9PSJOYU4iJiZmWzBdIT09Ii0iJiYiIitwYXJzZUludChmLDEwKT09PWYsbE49RGwoIixrZXkscmVmLHJlZl9mb3IscmVmX2tleSxvblZub2RlQmVmb3JlTW91bnQsb25Wbm9kZU1vdW50ZWQsb25Wbm9kZUJlZm9yZVVwZGF0ZSxvblZub2RlVXBkYXRlZCxvblZub2RlQmVmb3JlVW5tb3VudCxvblZub2RlVW5tb3VudGVkIiksY049RGwoImJpbmQsY2xvYWssZWxzZS1pZixlbHNlLGZvcixodG1sLGlmLG1vZGVsLG9uLG9uY2UscHJlLHNob3csc2xvdCx0ZXh0LG1lbW8iKSxudT1mPT57bGV0IHM9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gcD0+c1twXXx8KHNbcF09ZihwKSl9LHVOPS8tKFx3KS9nLGZOPW51KGY9PmYucmVwbGFjZSh1TiwocyxwKT0+cD9wLnRvVXBwZXJDYXNlKCk6IiIpKSxkTj0vXEIoW0EtWl0pL2csZmY9bnUoZj0+Zi5yZXBsYWNlKGROLCItJDEiKS50b0xvd2VyQ2FzZSgpKSxydT1udShmPT5mLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Yuc2xpY2UoMSkpLGhOPW51KGY9PmY/YG9uJHtydShmKX1gOiIiKSxnTj0oZixzKT0+IU9iamVjdC5pcyhmLHMpLHBOPShmLHMpPT57Zm9yKGxldCBwPTA7cDxmLmxlbmd0aDtwKyspZltwXShzKX0sdk49KGYscyxwKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLHMse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOnB9KX0sbU49Zj0+e2xldCBzPXBhcnNlRmxvYXQoZik7cmV0dXJuIGlzTmFOKHMpP2Y6c30sX049Zj0+e2xldCBzPWhpKGYpP051bWJlcihmKTpOYU47cmV0dXJuIGlzTmFOKHMpP2Y6c30sSHAsYk49KCk9PkhwfHwoSHA9dHlwZW9mIGdsb2JhbFRoaXMhPSJ1bmRlZmluZWQiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPSJ1bmRlZmluZWQiP2dsb2JhbDp7fSk7ZnVuY3Rpb24ganAoZil7dmFyIHM9ZnVuY3Rpb24ocCx3KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gTihCLC4uLlEpe2NvbnNvbGUud2FybihgW1Z1ZSB3YXJuXSAke0J9YCwuLi5RKX1sZXQgRTtjbGFzcyBoe2NvbnN0cnVjdG9yKFE9ITEpe3RoaXMuZGV0YWNoZWQ9USx0aGlzLl9hY3RpdmU9ITAsdGhpcy5lZmZlY3RzPVtdLHRoaXMuY2xlYW51cHM9W10sdGhpcy5wYXJlbnQ9RSwhUSYmRSYmKHRoaXMuaW5kZXg9KEUuc2NvcGVzfHwoRS5zY29wZXM9W10pKS5wdXNoKHRoaXMpLTEpfWdldCBhY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfXJ1bihRKXtpZih0aGlzLl9hY3RpdmUpe2xldCBoZT1FO3RyeXtyZXR1cm4gRT10aGlzLFEoKX1maW5hbGx5e0U9aGV9fX1vbigpe0U9dGhpc31vZmYoKXtFPXRoaXMucGFyZW50fXN0b3AoUSl7aWYodGhpcy5fYWN0aXZlKXtsZXQgaGUsYWU7Zm9yKGhlPTAsYWU9dGhpcy5lZmZlY3RzLmxlbmd0aDtoZTxhZTtoZSsrKXRoaXMuZWZmZWN0c1toZV0uc3RvcCgpO2ZvcihoZT0wLGFlPXRoaXMuY2xlYW51cHMubGVuZ3RoO2hlPGFlO2hlKyspdGhpcy5jbGVhbnVwc1toZV0oKTtpZih0aGlzLnNjb3Blcylmb3IoaGU9MCxhZT10aGlzLnNjb3Blcy5sZW5ndGg7aGU8YWU7aGUrKyl0aGlzLnNjb3Blc1toZV0uc3RvcCghMCk7aWYoIXRoaXMuZGV0YWNoZWQmJnRoaXMucGFyZW50JiYhUSl7bGV0IGRlPXRoaXMucGFyZW50LnNjb3Blcy5wb3AoKTtkZSYmZGUhPT10aGlzJiYodGhpcy5wYXJlbnQuc2NvcGVzW3RoaXMuaW5kZXhdPWRlLGRlLmluZGV4PXRoaXMuaW5kZXgpfXRoaXMucGFyZW50PXZvaWQgMCx0aGlzLl9hY3RpdmU9ITF9fX1mdW5jdGlvbiB5KEIpe3JldHVybiBuZXcgaChCKX1mdW5jdGlvbiBSKEIsUT1FKXtRJiZRLmFjdGl2ZSYmUS5lZmZlY3RzLnB1c2goQil9ZnVuY3Rpb24gRmUoKXtyZXR1cm4gRX1mdW5jdGlvbiBJdChCKXtFJiZFLmNsZWFudXBzLnB1c2goQil9bGV0IFZ0PUI9PntsZXQgUT1uZXcgU2V0KEIpO3JldHVybiBRLnc9MCxRLm49MCxRfSxPdD1CPT4oQi53JkopPjAsUD1CPT4oQi5uJkopPjAsd3Q9KHtkZXBzOkJ9KT0+e2lmKEIubGVuZ3RoKWZvcihsZXQgUT0wO1E8Qi5sZW5ndGg7USsrKUJbUV0ud3w9Sn0sSW49Qj0+e2xldHtkZXBzOlF9PUI7aWYoUS5sZW5ndGgpe2xldCBoZT0wO2ZvcihsZXQgYWU9MDthZTxRLmxlbmd0aDthZSsrKXtsZXQgZGU9UVthZV07T3QoZGUpJiYhUChkZSk/ZGUuZGVsZXRlKEIpOlFbaGUrK109ZGUsZGUudyY9fkosZGUubiY9fkp9US5sZW5ndGg9aGV9fSxvdD1uZXcgV2Vha01hcCx6PTAsSj0xLGhuPTMwLHVuLHluPVN5bWJvbCgiIiksSm49U3ltYm9sKCIiKTtjbGFzcyBnaXtjb25zdHJ1Y3RvcihRLGhlPW51bGwsYWUpe3RoaXMuZm49USx0aGlzLnNjaGVkdWxlcj1oZSx0aGlzLmFjdGl2ZT0hMCx0aGlzLmRlcHM9W10sdGhpcy5wYXJlbnQ9dm9pZCAwLFIodGhpcyxhZSl9cnVuKCl7aWYoIXRoaXMuYWN0aXZlKXJldHVybiB0aGlzLmZuKCk7bGV0IFE9dW4saGU9U247Zm9yKDtROyl7aWYoUT09PXRoaXMpcmV0dXJuO1E9US5wYXJlbnR9dHJ5e3JldHVybiB0aGlzLnBhcmVudD11bix1bj10aGlzLFNuPSEwLEo9MTw8Kyt6LHo8PWhuP3d0KHRoaXMpOnBpKHRoaXMpLHRoaXMuZm4oKX1maW5hbGx5e3o8PWhuJiZJbih0aGlzKSxKPTE8PC0teix1bj10aGlzLnBhcmVudCxTbj1oZSx0aGlzLnBhcmVudD12b2lkIDAsdGhpcy5kZWZlclN0b3AmJnRoaXMuc3RvcCgpfX1zdG9wKCl7dW49PT10aGlzP3RoaXMuZGVmZXJTdG9wPSEwOnRoaXMuYWN0aXZlJiYocGkodGhpcyksdGhpcy5vblN0b3AmJnRoaXMub25TdG9wKCksdGhpcy5hY3RpdmU9ITEpfX1mdW5jdGlvbiBwaShCKXtsZXR7ZGVwczpRfT1CO2lmKFEubGVuZ3RoKXtmb3IobGV0IGhlPTA7aGU8US5sZW5ndGg7aGUrKylRW2hlXS5kZWxldGUoQik7US5sZW5ndGg9MH19ZnVuY3Rpb24gcXIoQixRKXtCLmVmZmVjdCYmKEI9Qi5lZmZlY3QuZm4pO2xldCBoZT1uZXcgZ2koQik7USYmKHcuZXh0ZW5kKGhlLFEpLFEuc2NvcGUmJlIoaGUsUS5zY29wZSkpLCghUXx8IVEubGF6eSkmJmhlLnJ1bigpO2xldCBhZT1oZS5ydW4uYmluZChoZSk7cmV0dXJuIGFlLmVmZmVjdD1oZSxhZX1mdW5jdGlvbiBncihCKXtCLmVmZmVjdC5zdG9wKCl9bGV0IFNuPSEwLHByPVtdO2Z1bmN0aW9uIExyKCl7cHIucHVzaChTbiksU249ITF9ZnVuY3Rpb24gSnIoKXtwci5wdXNoKFNuKSxTbj0hMH1mdW5jdGlvbiB2aSgpe2xldCBCPXByLnBvcCgpO1NuPUI9PT12b2lkIDA/ITA6Qn1mdW5jdGlvbiBQbihCLFEsaGUpe2lmKFNuJiZ1bil7bGV0IGFlPW90LmdldChCKTthZXx8b3Quc2V0KEIsYWU9bmV3IE1hcCk7bGV0IGRlPWFlLmdldChoZSk7ZGV8fGFlLnNldChoZSxkZT1WdCgpKSx6ZShkZSx2b2lkIDApfX1mdW5jdGlvbiB6ZShCLFEpe2xldCBoZT0hMTt6PD1obj9QKEIpfHwoQi5ufD1KLGhlPSFPdChCKSk6aGU9IUIuaGFzKHVuKSxoZSYmKEIuYWRkKHVuKSx1bi5kZXBzLnB1c2goQikpfWZ1bmN0aW9uIG50KEIsUSxoZSxhZSxkZSx2dCl7bGV0IGt0PW90LmdldChCKTtpZigha3QpcmV0dXJuO2xldCBYPVtdO2lmKFE9PT0iY2xlYXIiKVg9Wy4uLmt0LnZhbHVlcygpXTtlbHNlIGlmKGhlPT09Imxlbmd0aCImJncuaXNBcnJheShCKSl7bGV0IGllPU51bWJlcihhZSk7a3QuZm9yRWFjaCgoTmUsc3QpPT57KHN0PT09Imxlbmd0aCJ8fHN0Pj1pZSkmJlgucHVzaChOZSl9KX1lbHNlIHN3aXRjaChoZSE9PXZvaWQgMCYmWC5wdXNoKGt0LmdldChoZSkpLFEpe2Nhc2UiYWRkIjp3LmlzQXJyYXkoQik/dy5pc0ludGVnZXJLZXkoaGUpJiZYLnB1c2goa3QuZ2V0KCJsZW5ndGgiKSk6KFgucHVzaChrdC5nZXQoeW4pKSx3LmlzTWFwKEIpJiZYLnB1c2goa3QuZ2V0KEpuKSkpO2JyZWFrO2Nhc2UiZGVsZXRlIjp3LmlzQXJyYXkoQil8fChYLnB1c2goa3QuZ2V0KHluKSksdy5pc01hcChCKSYmWC5wdXNoKGt0LmdldChKbikpKTticmVhaztjYXNlInNldCI6dy5pc01hcChCKSYmWC5wdXNoKGt0LmdldCh5bikpO2JyZWFrfWxldCBLPXZvaWQgMDtpZihYLmxlbmd0aD09PTEpWFswXSYmQXQoWFswXSk7ZWxzZXtsZXQgaWU9W107Zm9yKGxldCBOZSBvZiBYKU5lJiZpZS5wdXNoKC4uLk5lKTtBdChWdChpZSkpfX1mdW5jdGlvbiBBdChCLFEpe2xldCBoZT13LmlzQXJyYXkoQik/QjpbLi4uQl07Zm9yKGxldCBhZSBvZiBoZSlhZS5jb21wdXRlZCYmUXQoYWUsUSk7Zm9yKGxldCBhZSBvZiBoZSlhZS5jb21wdXRlZHx8UXQoYWUsUSl9ZnVuY3Rpb24gUXQoQixRKXsoQiE9PXVufHxCLmFsbG93UmVjdXJzZSkmJihCLnNjaGVkdWxlcj9CLnNjaGVkdWxlcigpOkIucnVuKCkpfWZ1bmN0aW9uIFRuKEIsUSl7dmFyIGhlO3JldHVybihoZT1vdC5nZXQoQikpPT09bnVsbHx8aGU9PT12b2lkIDA/dm9pZCAwOmhlLmdldChRKX1sZXQgc249dy5tYWtlTWFwKCJfX3Byb3RvX18sX192X2lzUmVmLF9faXNWdWUiKSxvcj1uZXcgU2V0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFN5bWJvbCkuZmlsdGVyKEI9PkIhPT0iYXJndW1lbnRzIiYmQiE9PSJjYWxsZXIiKS5tYXAoQj0+U3ltYm9sW0JdKS5maWx0ZXIody5pc1N5bWJvbCkpLFduPVVpKCksQW49VWkoITEsITApLGduPVVpKCEwKSx3cj1VaSghMCwhMCksS3I9d28oKTtmdW5jdGlvbiB3bygpe2xldCBCPXt9O3JldHVyblsiaW5jbHVkZXMiLCJpbmRleE9mIiwibGFzdEluZGV4T2YiXS5mb3JFYWNoKFE9PntCW1FdPWZ1bmN0aW9uKC4uLmhlKXtsZXQgYWU9Zm4odGhpcyk7Zm9yKGxldCB2dD0wLGt0PXRoaXMubGVuZ3RoO3Z0PGt0O3Z0KyspUG4oYWUsImdldCIsdnQrIiIpO2xldCBkZT1hZVtRXSguLi5oZSk7cmV0dXJuIGRlPT09LTF8fGRlPT09ITE/YWVbUV0oLi4uaGUubWFwKGZuKSk6ZGV9fSksWyJwdXNoIiwicG9wIiwic2hpZnQiLCJ1bnNoaWZ0Iiwic3BsaWNlIl0uZm9yRWFjaChRPT57QltRXT1mdW5jdGlvbiguLi5oZSl7THIoKTtsZXQgYWU9Zm4odGhpcylbUV0uYXBwbHkodGhpcyxoZSk7cmV0dXJuIHZpKCksYWV9fSksQn1mdW5jdGlvbiBkYShCKXtsZXQgUT1mbih0aGlzKTtyZXR1cm4gUG4oUSwiaGFzIixCKSxRLmhhc093blByb3BlcnR5KEIpfWZ1bmN0aW9uIFVpKEI9ITEsUT0hMSl7cmV0dXJuIGZ1bmN0aW9uKGFlLGRlLHZ0KXtpZihkZT09PSJfX3ZfaXNSZWFjdGl2ZSIpcmV0dXJuIUI7aWYoZGU9PT0iX192X2lzUmVhZG9ubHkiKXJldHVybiBCO2lmKGRlPT09Il9fdl9pc1NoYWxsb3ciKXJldHVybiBRO2lmKGRlPT09Il9fdl9yYXciJiZ2dD09PShCP1E/RHQ6VXI6UT9YcjpwbikuZ2V0KGFlKSlyZXR1cm4gYWU7bGV0IGt0PXcuaXNBcnJheShhZSk7aWYoIUIpe2lmKGt0JiZ3Lmhhc093bihLcixkZSkpcmV0dXJuIFJlZmxlY3QuZ2V0KEtyLGRlLHZ0KTtpZihkZT09PSJoYXNPd25Qcm9wZXJ0eSIpcmV0dXJuIGRhfWxldCBYPVJlZmxlY3QuZ2V0KGFlLGRlLHZ0KTtyZXR1cm4ody5pc1N5bWJvbChkZSk/b3IuaGFzKGRlKTpzbihkZSkpfHwoQnx8UG4oYWUsImdldCIsZGUpLFEpP1g6c3IoWCk/a3QmJncuaXNJbnRlZ2VyS2V5KGRlKT9YOlgudmFsdWU6dy5pc09iamVjdChYKT9CP09yKFgpOmJpKFgpOlh9fWxldCBabz0kaSgpLFhvPSRpKCEwKTtmdW5jdGlvbiAkaShCPSExKXtyZXR1cm4gZnVuY3Rpb24oaGUsYWUsZGUsdnQpe2xldCBrdD1oZVthZV07aWYoYWkoa3QpJiZzcihrdCkmJiFzcihkZSkpcmV0dXJuITE7aWYoIUImJighUHIoZGUpJiYhYWkoZGUpJiYoa3Q9Zm4oa3QpLGRlPWZuKGRlKSksIXcuaXNBcnJheShoZSkmJnNyKGt0KSYmIXNyKGRlKSkpcmV0dXJuIGt0LnZhbHVlPWRlLCEwO2xldCBYPXcuaXNBcnJheShoZSkmJncuaXNJbnRlZ2VyS2V5KGFlKT9OdW1iZXIoYWUpPGhlLmxlbmd0aDp3Lmhhc093bihoZSxhZSksSz1SZWZsZWN0LnNldChoZSxhZSxkZSx2dCk7cmV0dXJuIGhlPT09Zm4odnQpJiYoWD93Lmhhc0NoYW5nZWQoZGUsa3QpJiZudChoZSwic2V0IixhZSxkZSxrdCk6bnQoaGUsImFkZCIsYWUsZGUpKSxLfX1mdW5jdGlvbiByaShCLFEpe2xldCBoZT13Lmhhc093bihCLFEpLGFlPUJbUV0sZGU9UmVmbGVjdC5kZWxldGVQcm9wZXJ0eShCLFEpO3JldHVybiBkZSYmaGUmJm50KEIsImRlbGV0ZSIsUSx2b2lkIDAsYWUpLGRlfWZ1bmN0aW9uIENvKEIsUSl7bGV0IGhlPVJlZmxlY3QuaGFzKEIsUSk7cmV0dXJuKCF3LmlzU3ltYm9sKFEpfHwhb3IuaGFzKFEpKSYmUG4oQiwiaGFzIixRKSxoZX1mdW5jdGlvbiBBbyhCKXtyZXR1cm4gUG4oQiwiaXRlcmF0ZSIsdy5pc0FycmF5KEIpPyJsZW5ndGgiOnluKSxSZWZsZWN0Lm93bktleXMoQil9bGV0IE9vPXtnZXQ6V24sc2V0OlpvLGRlbGV0ZVByb3BlcnR5OnJpLGhhczpDbyxvd25LZXlzOkFvfSxYaT17Z2V0OmduLHNldChCLFEpe3JldHVybiEwfSxkZWxldGVQcm9wZXJ0eShCLFEpe3JldHVybiEwfX0sbWk9dy5leHRlbmQoe30sT28se2dldDpBbixzZXQ6WG99KSxUbz13LmV4dGVuZCh7fSxYaSx7Z2V0OndyfSksdW89Qj0+Qixrbj1CPT5SZWZsZWN0LmdldFByb3RvdHlwZU9mKEIpO2Z1bmN0aW9uIENyKEIsUSxoZT0hMSxhZT0hMSl7Qj1CLl9fdl9yYXc7bGV0IGRlPWZuKEIpLHZ0PWZuKFEpO2hlfHwoUSE9PXZ0JiZQbihkZSwiZ2V0IixRKSxQbihkZSwiZ2V0Iix2dCkpO2xldHtoYXM6a3R9PWtuKGRlKSxYPWFlP3VvOmhlP3RvOiRyO2lmKGt0LmNhbGwoZGUsUSkpcmV0dXJuIFgoQi5nZXQoUSkpO2lmKGt0LmNhbGwoZGUsdnQpKXJldHVybiBYKEIuZ2V0KHZ0KSk7QiE9PWRlJiZCLmdldChRKX1mdW5jdGlvbiBRaShCLFE9ITEpe2xldCBoZT10aGlzLl9fdl9yYXcsYWU9Zm4oaGUpLGRlPWZuKEIpO3JldHVybiBRfHwoQiE9PWRlJiZQbihhZSwiaGFzIixCKSxQbihhZSwiaGFzIixkZSkpLEI9PT1kZT9oZS5oYXMoQik6aGUuaGFzKEIpfHxoZS5oYXMoZGUpfWZ1bmN0aW9uIEtuKEIsUT0hMSl7cmV0dXJuIEI9Qi5fX3ZfcmF3LCFRJiZQbihmbihCKSwiaXRlcmF0ZSIseW4pLFJlZmxlY3QuZ2V0KEIsInNpemUiLEIpfWZ1bmN0aW9uIGVvKEIpe0I9Zm4oQik7bGV0IFE9Zm4odGhpcyk7cmV0dXJuIGtuKFEpLmhhcy5jYWxsKFEsQil8fChRLmFkZChCKSxudChRLCJhZGQiLEIsQikpLHRoaXN9ZnVuY3Rpb24gUG8oQixRKXtRPWZuKFEpO2xldCBoZT1mbih0aGlzKSx7aGFzOmFlLGdldDpkZX09a24oaGUpLHZ0PWFlLmNhbGwoaGUsQik7dnR8fChCPWZuKEIpLHZ0PWFlLmNhbGwoaGUsQikpO2xldCBrdD1kZS5jYWxsKGhlLEIpO3JldHVybiBoZS5zZXQoQixRKSx2dD93Lmhhc0NoYW5nZWQoUSxrdCkmJm50KGhlLCJzZXQiLEIsUSxrdCk6bnQoaGUsImFkZCIsQixRKSx0aGlzfWZ1bmN0aW9uIGZvKEIpe2xldCBRPWZuKHRoaXMpLHtoYXM6aGUsZ2V0OmFlfT1rbihRKSxkZT1oZS5jYWxsKFEsQik7ZGV8fChCPWZuKEIpLGRlPWhlLmNhbGwoUSxCKSk7bGV0IHZ0PWFlP2FlLmNhbGwoUSxCKTp2b2lkIDAsa3Q9US5kZWxldGUoQik7cmV0dXJuIGRlJiZudChRLCJkZWxldGUiLEIsdm9pZCAwLHZ0KSxrdH1mdW5jdGlvbiBpaSgpe2xldCBCPWZuKHRoaXMpLFE9Qi5zaXplIT09MCxoZT12b2lkIDAsYWU9Qi5jbGVhcigpO3JldHVybiBRJiZudChCLCJjbGVhciIsdm9pZCAwLHZvaWQgMCxoZSksYWV9ZnVuY3Rpb24gYXIoQixRKXtyZXR1cm4gZnVuY3Rpb24oYWUsZGUpe2xldCB2dD10aGlzLGt0PXZ0Ll9fdl9yYXcsWD1mbihrdCksSz1RP3VvOkI/dG86JHI7cmV0dXJuIUImJlBuKFgsIml0ZXJhdGUiLHluKSxrdC5mb3JFYWNoKChpZSxOZSk9PmFlLmNhbGwoZGUsSyhpZSksSyhOZSksdnQpKX19ZnVuY3Rpb24ga3IoQixRLGhlKXtyZXR1cm4gZnVuY3Rpb24oLi4uYWUpe2xldCBkZT10aGlzLl9fdl9yYXcsdnQ9Zm4oZGUpLGt0PXcuaXNNYXAodnQpLFg9Qj09PSJlbnRyaWVzInx8Qj09PVN5bWJvbC5pdGVyYXRvciYma3QsSz1CPT09ImtleXMiJiZrdCxpZT1kZVtCXSguLi5hZSksTmU9aGU/dW86UT90bzokcjtyZXR1cm4hUSYmUG4odnQsIml0ZXJhdGUiLEs/Sm46eW4pLHtuZXh0KCl7bGV0e3ZhbHVlOnN0LGRvbmU6WHR9PWllLm5leHQoKTtyZXR1cm4gWHQ/e3ZhbHVlOnN0LGRvbmU6WHR9Ont2YWx1ZTpYP1tOZShzdFswXSksTmUoc3RbMV0pXTpOZShzdCksZG9uZTpYdH19LFtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX19ZnVuY3Rpb24gTm4oQil7cmV0dXJuIGZ1bmN0aW9uKC4uLlEpe3JldHVybiBCPT09ImRlbGV0ZSI/ITE6dGhpc319ZnVuY3Rpb24gWm4oKXtsZXQgQj17Z2V0KHZ0KXtyZXR1cm4gQ3IodGhpcyx2dCl9LGdldCBzaXplKCl7cmV0dXJuIEtuKHRoaXMpfSxoYXM6UWksYWRkOmVvLHNldDpQbyxkZWxldGU6Zm8sY2xlYXI6aWksZm9yRWFjaDphcighMSwhMSl9LFE9e2dldCh2dCl7cmV0dXJuIENyKHRoaXMsdnQsITEsITApfSxnZXQgc2l6ZSgpe3JldHVybiBLbih0aGlzKX0saGFzOlFpLGFkZDplbyxzZXQ6UG8sZGVsZXRlOmZvLGNsZWFyOmlpLGZvckVhY2g6YXIoITEsITApfSxoZT17Z2V0KHZ0KXtyZXR1cm4gQ3IodGhpcyx2dCwhMCl9LGdldCBzaXplKCl7cmV0dXJuIEtuKHRoaXMsITApfSxoYXModnQpe3JldHVybiBRaS5jYWxsKHRoaXMsdnQsITApfSxhZGQ6Tm4oImFkZCIpLHNldDpObigic2V0IiksZGVsZXRlOk5uKCJkZWxldGUiKSxjbGVhcjpObigiY2xlYXIiKSxmb3JFYWNoOmFyKCEwLCExKX0sYWU9e2dldCh2dCl7cmV0dXJuIENyKHRoaXMsdnQsITAsITApfSxnZXQgc2l6ZSgpe3JldHVybiBLbih0aGlzLCEwKX0saGFzKHZ0KXtyZXR1cm4gUWkuY2FsbCh0aGlzLHZ0LCEwKX0sYWRkOk5uKCJhZGQiKSxzZXQ6Tm4oInNldCIpLGRlbGV0ZTpObigiZGVsZXRlIiksY2xlYXI6Tm4oImNsZWFyIiksZm9yRWFjaDphcighMCwhMCl9O3JldHVyblsia2V5cyIsInZhbHVlcyIsImVudHJpZXMiLFN5bWJvbC5pdGVyYXRvcl0uZm9yRWFjaCh2dD0+e0JbdnRdPWtyKHZ0LCExLCExKSxoZVt2dF09a3IodnQsITAsITEpLFFbdnRdPWtyKHZ0LCExLCEwKSxhZVt2dF09a3IodnQsITAsITApfSksW0IsaGUsUSxhZV19bGV0W05pLEhpLG9pLEZyXT1abigpO2Z1bmN0aW9uIHZyKEIsUSl7bGV0IGhlPVE/Qj9GcjpvaTpCP0hpOk5pO3JldHVybihhZSxkZSx2dCk9PmRlPT09Il9fdl9pc1JlYWN0aXZlIj8hQjpkZT09PSJfX3ZfaXNSZWFkb25seSI/QjpkZT09PSJfX3ZfcmF3Ij9hZTpSZWZsZWN0LmdldCh3Lmhhc093bihoZSxkZSkmJmRlIGluIGFlP2hlOmFlLGRlLHZ0KX1sZXQga2k9e2dldDp2cighMSwhMSl9LElvPXtnZXQ6dnIoITEsITApfSxWcj17Z2V0OnZyKCEwLCExKX0sWnI9e2dldDp2cighMCwhMCl9O2Z1bmN0aW9uIEFyKEIsUSxoZSl7bGV0IGFlPWZuKGhlKTtpZihhZSE9PWhlJiZRLmNhbGwoQixhZSkpe2xldCBkZT13LnRvUmF3VHlwZShCKTtjb25zb2xlLndhcm4oYFJlYWN0aXZlICR7ZGV9IGNvbnRhaW5zIGJvdGggdGhlIHJhdyBhbmQgcmVhY3RpdmUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgb2JqZWN0JHtkZT09PSJNYXAiPyIgYXMga2V5cyI6IiJ9LCB3aGljaCBjYW4gbGVhZCB0byBpbmNvbnNpc3RlbmNpZXMuIEF2b2lkIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIGFuIG9iamVjdCBhbmQgb25seSB1c2UgdGhlIHJlYWN0aXZlIHZlcnNpb24gaWYgcG9zc2libGUuYCl9fWxldCBwbj1uZXcgV2Vha01hcCxYcj1uZXcgV2Vha01hcCxVcj1uZXcgV2Vha01hcCxEdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBUZShCKXtzd2l0Y2goQil7Y2FzZSJPYmplY3QiOmNhc2UiQXJyYXkiOnJldHVybiAxO2Nhc2UiTWFwIjpjYXNlIlNldCI6Y2FzZSJXZWFrTWFwIjpjYXNlIldlYWtTZXQiOnJldHVybiAyO2RlZmF1bHQ6cmV0dXJuIDB9fWZ1bmN0aW9uIF9pKEIpe3JldHVybiBCLl9fdl9za2lwfHwhT2JqZWN0LmlzRXh0ZW5zaWJsZShCKT8wOlRlKHcudG9SYXdUeXBlKEIpKX1mdW5jdGlvbiBiaShCKXtyZXR1cm4gYWkoQik/QjpUcihCLCExLE9vLGtpLHBuKX1mdW5jdGlvbiB5aShCKXtyZXR1cm4gVHIoQiwhMSxtaSxJbyxYcil9ZnVuY3Rpb24gT3IoQil7cmV0dXJuIFRyKEIsITAsWGksVnIsVXIpfWZ1bmN0aW9uIFJpKEIpe3JldHVybiBUcihCLCEwLFRvLFpyLER0KX1mdW5jdGlvbiBUcihCLFEsaGUsYWUsZGUpe2lmKCF3LmlzT2JqZWN0KEIpfHxCLl9fdl9yYXcmJiEoUSYmQi5fX3ZfaXNSZWFjdGl2ZSkpcmV0dXJuIEI7bGV0IHZ0PWRlLmdldChCKTtpZih2dClyZXR1cm4gdnQ7bGV0IGt0PV9pKEIpO2lmKGt0PT09MClyZXR1cm4gQjtsZXQgWD1uZXcgUHJveHkoQixrdD09PTI/YWU6aGUpO3JldHVybiBkZS5zZXQoQixYKSxYfWZ1bmN0aW9uIFJyKEIpe3JldHVybiBhaShCKT9ScihCLl9fdl9yYXcpOiEhKEImJkIuX192X2lzUmVhY3RpdmUpfWZ1bmN0aW9uIGFpKEIpe3JldHVybiEhKEImJkIuX192X2lzUmVhZG9ubHkpfWZ1bmN0aW9uIFByKEIpe3JldHVybiEhKEImJkIuX192X2lzU2hhbGxvdyl9ZnVuY3Rpb24gRWkoQil7cmV0dXJuIFJyKEIpfHxhaShCKX1mdW5jdGlvbiBmbihCKXtsZXQgUT1CJiZCLl9fdl9yYXc7cmV0dXJuIFE/Zm4oUSk6Qn1mdW5jdGlvbiBqaShCKXtyZXR1cm4gdy5kZWYoQiwiX192X3NraXAiLCEwKSxCfWxldCAkcj1CPT53LmlzT2JqZWN0KEIpP2JpKEIpOkIsdG89Qj0+dy5pc09iamVjdChCKT9PcihCKTpCO2Z1bmN0aW9uIEVuKEIpe1NuJiZ1biYmKEI9Zm4oQiksemUoQi5kZXB8fChCLmRlcD1WdCgpKSkpfWZ1bmN0aW9uIEhyKEIsUSl7Qj1mbihCKTtsZXQgaGU9Qi5kZXA7aGUmJkF0KGhlKX1mdW5jdGlvbiBzcihCKXtyZXR1cm4hIShCJiZCLl9fdl9pc1JlZj09PSEwKX1mdW5jdGlvbiBTaShCKXtyZXR1cm4gbXIoQiwhMSl9ZnVuY3Rpb24geGkoQil7cmV0dXJuIG1yKEIsITApfWZ1bmN0aW9uIG1yKEIsUSl7cmV0dXJuIHNyKEIpP0I6bmV3IFFyKEIsUSl9Y2xhc3MgUXJ7Y29uc3RydWN0b3IoUSxoZSl7dGhpcy5fX3ZfaXNTaGFsbG93PWhlLHRoaXMuZGVwPXZvaWQgMCx0aGlzLl9fdl9pc1JlZj0hMCx0aGlzLl9yYXdWYWx1ZT1oZT9ROmZuKFEpLHRoaXMuX3ZhbHVlPWhlP1E6JHIoUSl9Z2V0IHZhbHVlKCl7cmV0dXJuIEVuKHRoaXMpLHRoaXMuX3ZhbHVlfXNldCB2YWx1ZShRKXtsZXQgaGU9dGhpcy5fX3ZfaXNTaGFsbG93fHxQcihRKXx8YWkoUSk7UT1oZT9ROmZuKFEpLHcuaGFzQ2hhbmdlZChRLHRoaXMuX3Jhd1ZhbHVlKSYmKHRoaXMuX3Jhd1ZhbHVlPVEsdGhpcy5fdmFsdWU9aGU/UTokcihRKSxIcih0aGlzLFEpKX19ZnVuY3Rpb24gZXIoQil7SHIoQix2b2lkIDApfWZ1bmN0aW9uIHRyKEIpe3JldHVybiBzcihCKT9CLnZhbHVlOkJ9bGV0IEduPXtnZXQ6KEIsUSxoZSk9PnRyKFJlZmxlY3QuZ2V0KEIsUSxoZSkpLHNldDooQixRLGhlLGFlKT0+e2xldCBkZT1CW1FdO3JldHVybiBzcihkZSkmJiFzcihoZSk/KGRlLnZhbHVlPWhlLCEwKTpSZWZsZWN0LnNldChCLFEsaGUsYWUpfX07ZnVuY3Rpb24gbnIoQil7cmV0dXJuIFJyKEIpP0I6bmV3IFByb3h5KEIsR24pfWNsYXNzIGNye2NvbnN0cnVjdG9yKFEpe3RoaXMuZGVwPXZvaWQgMCx0aGlzLl9fdl9pc1JlZj0hMDtsZXR7Z2V0OmhlLHNldDphZX09USgoKT0+RW4odGhpcyksKCk9PkhyKHRoaXMpKTt0aGlzLl9nZXQ9aGUsdGhpcy5fc2V0PWFlfWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9nZXQoKX1zZXQgdmFsdWUoUSl7dGhpcy5fc2V0KFEpfX1mdW5jdGlvbiBobyhCKXtyZXR1cm4gbmV3IGNyKEIpfWZ1bmN0aW9uIGdvKEIpe2xldCBRPXcuaXNBcnJheShCKT9uZXcgQXJyYXkoQi5sZW5ndGgpOnt9O2ZvcihsZXQgaGUgaW4gQilRW2hlXT1ubyhCLGhlKTtyZXR1cm4gUX1jbGFzcyBOb3tjb25zdHJ1Y3RvcihRLGhlLGFlKXt0aGlzLl9vYmplY3Q9USx0aGlzLl9rZXk9aGUsdGhpcy5fZGVmYXVsdFZhbHVlPWFlLHRoaXMuX192X2lzUmVmPSEwfWdldCB2YWx1ZSgpe2xldCBRPXRoaXMuX29iamVjdFt0aGlzLl9rZXldO3JldHVybiBRPT09dm9pZCAwP3RoaXMuX2RlZmF1bHRWYWx1ZTpRfXNldCB2YWx1ZShRKXt0aGlzLl9vYmplY3RbdGhpcy5fa2V5XT1RfWdldCBkZXAoKXtyZXR1cm4gVG4oZm4odGhpcy5fb2JqZWN0KSx0aGlzLl9rZXkpfX1mdW5jdGlvbiBubyhCLFEsaGUpe2xldCBhZT1CW1FdO3JldHVybiBzcihhZSk/YWU6bmV3IE5vKEIsUSxoZSl9dmFyIGtvO2NsYXNzIGpye2NvbnN0cnVjdG9yKFEsaGUsYWUsZGUpe3RoaXMuX3NldHRlcj1oZSx0aGlzLmRlcD12b2lkIDAsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpc1trb109ITEsdGhpcy5fZGlydHk9ITAsdGhpcy5lZmZlY3Q9bmV3IGdpKFEsKCk9Pnt0aGlzLl9kaXJ0eXx8KHRoaXMuX2RpcnR5PSEwLEhyKHRoaXMpKX0pLHRoaXMuZWZmZWN0LmNvbXB1dGVkPXRoaXMsdGhpcy5lZmZlY3QuYWN0aXZlPXRoaXMuX2NhY2hlYWJsZT0hZGUsdGhpcy5fX3ZfaXNSZWFkb25seT1hZX1nZXQgdmFsdWUoKXtsZXQgUT1mbih0aGlzKTtyZXR1cm4gRW4oUSksKFEuX2RpcnR5fHwhUS5fY2FjaGVhYmxlKSYmKFEuX2RpcnR5PSExLFEuX3ZhbHVlPVEuZWZmZWN0LnJ1bigpKSxRLl92YWx1ZX1zZXQgdmFsdWUoUSl7dGhpcy5fc2V0dGVyKFEpfX1rbz0iX192X2lzUmVhZG9ubHkiO2Z1bmN0aW9uIHhyKEIsUSxoZT0hMSl7bGV0IGFlLGRlLHZ0PXcuaXNGdW5jdGlvbihCKTtyZXR1cm4gdnQ/KGFlPUIsZGU9dy5OT09QKTooYWU9Qi5nZXQsZGU9Qi5zZXQpLG5ldyBqcihhZSxkZSx2dHx8IWRlLGhlKX12YXIgcG87bGV0IFJvPVByb21pc2UucmVzb2x2ZSgpLHJvPVtdLEJpPSExLHZvPUI9Pntyby5wdXNoKEIpLEJpfHwoQmk9ITAsUm8udGhlbihNaSkpfSxNaT0oKT0+e2ZvcihsZXQgQj0wO0I8cm8ubGVuZ3RoO0IrKylyb1tCXSgpO3JvLmxlbmd0aD0wLEJpPSExfTtjbGFzcyB6aXtjb25zdHJ1Y3RvcihRKXt0aGlzLmRlcD12b2lkIDAsdGhpcy5fZGlydHk9ITAsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpc1twb109ITA7bGV0IGhlLGFlPSExLGRlPSExO3RoaXMuZWZmZWN0PW5ldyBnaShRLHZ0PT57aWYodGhpcy5kZXApe2lmKHZ0KWhlPXRoaXMuX3ZhbHVlLGFlPSEwO2Vsc2UgaWYoIWRlKXtsZXQga3Q9YWU/aGU6dGhpcy5fdmFsdWU7ZGU9ITAsYWU9ITEsdm8oKCk9Pnt0aGlzLmVmZmVjdC5hY3RpdmUmJnRoaXMuX2dldCgpIT09a3QmJkhyKHRoaXMpLGRlPSExfSl9Zm9yKGxldCBrdCBvZiB0aGlzLmRlcClrdC5jb21wdXRlZCBpbnN0YW5jZW9mIHppJiZrdC5zY2hlZHVsZXIoITApfXRoaXMuX2RpcnR5PSEwfSksdGhpcy5lZmZlY3QuY29tcHV0ZWQ9dGhpc31fZ2V0KCl7cmV0dXJuIHRoaXMuX2RpcnR5Pyh0aGlzLl9kaXJ0eT0hMSx0aGlzLl92YWx1ZT10aGlzLmVmZmVjdC5ydW4oKSk6dGhpcy5fdmFsdWV9Z2V0IHZhbHVlKCl7cmV0dXJuIEVuKHRoaXMpLGZuKHRoaXMpLl9nZXQoKX19cG89Il9fdl9pc1JlYWRvbmx5IjtmdW5jdGlvbiBRbyhCKXtyZXR1cm4gbmV3IHppKEIpfXJldHVybiBwLkVmZmVjdFNjb3BlPWgscC5JVEVSQVRFX0tFWT15bixwLlJlYWN0aXZlRWZmZWN0PWdpLHAuY29tcHV0ZWQ9eHIscC5jdXN0b21SZWY9aG8scC5kZWZlcnJlZENvbXB1dGVkPVFvLHAuZWZmZWN0PXFyLHAuZWZmZWN0U2NvcGU9eSxwLmVuYWJsZVRyYWNraW5nPUpyLHAuZ2V0Q3VycmVudFNjb3BlPUZlLHAuaXNQcm94eT1FaSxwLmlzUmVhY3RpdmU9UnIscC5pc1JlYWRvbmx5PWFpLHAuaXNSZWY9c3IscC5pc1NoYWxsb3c9UHIscC5tYXJrUmF3PWppLHAub25TY29wZURpc3Bvc2U9SXQscC5wYXVzZVRyYWNraW5nPUxyLHAucHJveHlSZWZzPW5yLHAucmVhY3RpdmU9YmkscC5yZWFkb25seT1PcixwLnJlZj1TaSxwLnJlc2V0VHJhY2tpbmc9dmkscC5zaGFsbG93UmVhY3RpdmU9eWkscC5zaGFsbG93UmVhZG9ubHk9UmkscC5zaGFsbG93UmVmPXhpLHAuc3RvcD1ncixwLnRvUmF3PWZuLHAudG9SZWY9bm8scC50b1JlZnM9Z28scC50cmFjaz1QbixwLnRyaWdnZXI9bnQscC50cmlnZ2VyUmVmPWVyLHAudW5yZWY9dHIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHAsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHB9KHt9LGYpO3JldHVybiBzfWZ1bmN0aW9uIHpwKGYpe3ZhciBzPWZ1bmN0aW9uKHApeyJ1c2Ugc3RyaWN0IjtsZXQgdz1gCmAsTj00NCxFPTUwLGg9NTAseT1bIiUiLCIlIl0sUj0iIzAwN2FmZiIsRmU9L14oW2Etei1dKzopP1wvXC8vaSxJdD0vXmRhdGE6LiosLiovLFZ0PSJXRUJfSU5WT0tFX0FQUFNFUlZJQ0UiLE90PSJ3eHM6Ly8iLFA9Impzb246Ly8iLHd0PSJ3eHNNb2R1bGVzIixJbj0icmVuZGVyanNNb2R1bGVzIixvdD0ib25TaG93Iix6PSJvbkhpZGUiLEo9Im9uTGF1bmNoIixobj0ib25FcnJvciIsdW49Im9uVGhlbWVDaGFuZ2UiLHluPSJvZmZUaGVtZUNoYW5nZSIsSm49Im9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGdpPSJvblBhZ2VOb3RGb3VuZCIscGk9Im9uVW5oYW5kbGVkUmVqZWN0aW9uIixxcj0ib25FeGl0Iixncj0ib25Mb2FkIixTbj0ib25SZWFkeSIscHI9Im9uVW5sb2FkIixMcj0ib25Jbml0IixKcj0ib25TYXZlRXhpdFN0YXRlIix2aT0ib25SZXNpemUiLFBuPSJvbkJhY2tQcmVzcyIsemU9Im9uUGFnZVNjcm9sbCIsbnQ9Im9uVGFiSXRlbVRhcCIsQXQ9Im9uUmVhY2hCb3R0b20iLFF0PSJvblB1bGxEb3duUmVmcmVzaCIsVG49Im9uU2hhcmVUaW1lbGluZSIsc249Im9uQWRkVG9GYXZvcml0ZXMiLG9yPSJvblNoYXJlQXBwTWVzc2FnZSIsV249Im9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsQW49Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsZ249Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIsd3I9Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIixLcj0ib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQiLHdvPSJvbkFwcEVudGVyRm9yZWdyb3VuZCIsZGE9Im9uQXBwRW50ZXJCYWNrZ3JvdW5kIixVaT0ib25XeHNJbnZva2VDYWxsTWV0aG9kIjtmdW5jdGlvbiBabyhYKXtyZXR1cm4hIVguYXBwQ29udGV4dH1mdW5jdGlvbiBYbyhYKXtyZXR1cm4gWCYmKFpvKFgpP1gucHJveHk6WCl9ZnVuY3Rpb24gJGkoWCl7cmV0dXJuIFgubm9kZVR5cGU9PT0xfWZ1bmN0aW9uIHJpKFgsSz0hMSl7bGV0e3Zub2RlOmllfT1YO2lmKCRpKGllLmVsKSlyZXR1cm4gSz9pZS5lbD9baWUuZWxdOltdOmllLmVsO2xldHtzdWJUcmVlOk5lfT1YO2lmKE5lLnNoYXBlRmxhZyYxNil7bGV0IHN0PU5lLmNoaWxkcmVuLmZpbHRlcihYdD0+WHQuZWwmJiRpKFh0LmVsKSk7aWYoc3QubGVuZ3RoPjApcmV0dXJuIEs/c3QubWFwKFh0PT5YdC5lbCk6c3RbMF0uZWx9cmV0dXJuIEs/aWUuZWw/W2llLmVsXTpbXTppZS5lbH1sZXQgQ289MDtmdW5jdGlvbiBBbyhYLC4uLkspe2xldCBpZT1EYXRlLm5vdygpLE5lPUNvP2llLUNvOjA7cmV0dXJuIENvPWllLGBbJHtpZX1dWyR7TmV9bXNdWyR7WH1dXHVGRjFBJHtLLm1hcChzdD0+SlNPTi5zdHJpbmdpZnkoc3QpKS5qb2luKCIgIil9YH1mdW5jdGlvbiBPbyhYKXtsZXQgSz1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBpZT0+S1tpZV18fChLW2llXT1YKGllKSl9ZnVuY3Rpb24gWGkoWCl7cmV0dXJuIE9vKFgpfWZ1bmN0aW9uIG1pKFg9IiIpe3JldHVybigiIitYKS5yZXBsYWNlKC9bXlx4MDAtXHhmZl0vZywiKioiKS5sZW5ndGh9ZnVuY3Rpb24gVG8oWCl7cmV0dXJuIFguaW5kZXhPZigiLyIpPT09MH1mdW5jdGlvbiB1byhYKXtyZXR1cm4gVG8oWCk/WDoiLyIrWH1mdW5jdGlvbiBrbihYKXtyZXR1cm4gVG8oWCk/WC5zbGljZSgxKTpYfWxldCBDcj0oWCxLKT0+e2xldCBpZTtmb3IobGV0IE5lPTA7TmU8WC5sZW5ndGg7TmUrKylpZT1YW05lXShLKTtyZXR1cm4gaWV9O2Z1bmN0aW9uIFFpKFgsSz1udWxsKXtsZXQgaWU7cmV0dXJuKC4uLk5lKT0+KFgmJihpZT1YLmFwcGx5KEssTmUpLFg9bnVsbCksaWUpfWZ1bmN0aW9uIEtuKFgsSyl7WD1YfHx7fSxwLmlzU3RyaW5nKEspJiYoSz17ZXJyTXNnOkt9KSwvOm9rJC8udGVzdChLLmVyck1zZyk/cC5pc0Z1bmN0aW9uKFguc3VjY2VzcykmJlguc3VjY2VzcyhLKTpwLmlzRnVuY3Rpb24oWC5mYWlsKSYmWC5mYWlsKEspLHAuaXNGdW5jdGlvbihYLmNvbXBsZXRlKSYmWC5jb21wbGV0ZShLKX1mdW5jdGlvbiBlbyhYKXtsZXQgSz17fTtyZXR1cm4gcC5pc1BsYWluT2JqZWN0KFgpJiZPYmplY3Qua2V5cyhYKS5zb3J0KCkuZm9yRWFjaChpZT0+e2xldCBOZT1pZTtLW05lXT1YW05lXX0pLE9iamVjdC5rZXlzKEspP0s6WH1sZXQgUG89ZW5jb2RlVVJJQ29tcG9uZW50O2Z1bmN0aW9uIGZvKFgsSz1Qbyl7bGV0IGllPVg/T2JqZWN0LmtleXMoWCkubWFwKE5lPT57bGV0IHN0PVhbTmVdO3JldHVybiB0eXBlb2Ygc3Q9PT12b2lkIDB8fHN0PT09bnVsbD9zdD0iIjpwLmlzUGxhaW5PYmplY3Qoc3QpJiYoc3Q9SlNPTi5zdHJpbmdpZnkoc3QpKSxLKE5lKSsiPSIrSyhzdCl9KS5maWx0ZXIoTmU9Pk5lLmxlbmd0aD4wKS5qb2luKCImIik6bnVsbDtyZXR1cm4gaWU/YD8ke2llfWA6IiJ9ZnVuY3Rpb24gaWkoWCl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoIiIrWCl9Y2F0Y2goSyl7fXJldHVybiIiK1h9bGV0IGFyPS9cKy9nO2Z1bmN0aW9uIGtyKFgpe2xldCBLPXt9O2lmKFg9PT0iInx8WD09PSI/IilyZXR1cm4gSztsZXQgTmU9KFhbMF09PT0iPyI/WC5zbGljZSgxKTpYKS5zcGxpdCgiJiIpO2ZvcihsZXQgc3Q9MDtzdDxOZS5sZW5ndGg7KytzdCl7bGV0IFh0PU5lW3N0XS5yZXBsYWNlKGFyLCIgIikseG49WHQuaW5kZXhPZigiPSIpLERuPWlpKHhuPDA/WHQ6WHQuc2xpY2UoMCx4bikpLF9yPXhuPDA/bnVsbDppaShYdC5zbGljZSh4bisxKSk7aWYoRG4gaW4gSyl7bGV0IEJyPUtbRG5dO3AuaXNBcnJheShCcil8fChCcj1LW0RuXT1bQnJdKSxCci5wdXNoKF9yKX1lbHNlIEtbRG5dPV9yfXJldHVybiBLfWZ1bmN0aW9uIE5uKFgpe2xldFtLLGllXT1YLnNwbGl0KCI/IiwyKTtyZXR1cm57cGF0aDpLLHF1ZXJ5OmtyKGllfHwiIil9fWZ1bmN0aW9uIFpuKFgpe2xldCBLPXt9O3JldHVybiBYJiZPYmplY3Qua2V5cyhYKS5mb3JFYWNoKGllPT57aWUuaW5kZXhPZigiZGF0YS0iKT09PTAmJihLW2llLnJlcGxhY2UoImRhdGEtIiwiIildPVhbaWVdKX0pLEt9Y2xhc3MgTmkgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihLKXtzdXBlcihLKTt0aGlzLm5hbWU9IkRPTUV4Y2VwdGlvbiJ9fWZ1bmN0aW9uIEhpKFgsSyl7cmV0dXJuIEsmJihLLmNhcHR1cmUmJihYKz0iQ2FwdHVyZSIpLEsub25jZSYmKFgrPSJPbmNlIiksSy5wYXNzaXZlJiYoWCs9IlBhc3NpdmUiKSksYG9uJHtwLmNhcGl0YWxpemUocC5jYW1lbGl6ZShYKSl9YH1jbGFzcyBvaXtjb25zdHJ1Y3RvcihLLGllKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKSx0aGlzLl9zdG9wPSExLHRoaXMuX2VuZD0hMSx0aGlzLnR5cGU9Syx0aGlzLmJ1YmJsZXM9ISFpZS5idWJibGVzLHRoaXMuY2FuY2VsYWJsZT0hIWllLmNhbmNlbGFibGV9cHJldmVudERlZmF1bHQoKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl7dGhpcy5fZW5kPXRoaXMuX3N0b3A9ITB9c3RvcFByb3BhZ2F0aW9uKCl7dGhpcy5fc3RvcD0hMH19ZnVuY3Rpb24gRnIoWCl7aWYoWCBpbnN0YW5jZW9mIG9pKXJldHVybiBYO2xldFtLXT1JbyhYLnR5cGUpLGllPW5ldyBvaShLLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KTtyZXR1cm4gcC5leHRlbmQoaWUsWCksaWV9Y2xhc3MgdnJ7Y29uc3RydWN0b3IoKXt0aGlzLmxpc3RlbmVycz1PYmplY3QuY3JlYXRlKG51bGwpfWRpc3BhdGNoRXZlbnQoSyl7bGV0IGllPXRoaXMubGlzdGVuZXJzW0sudHlwZV07aWYoIWllKXJldHVybiExO2xldCBOZT1GcihLKSxzdD1pZS5sZW5ndGg7Zm9yKGxldCBYdD0wO1h0PHN0JiYoaWVbWHRdLmNhbGwodGhpcyxOZSksIU5lLl9lbmQpO1h0KyspO3JldHVybiBOZS5jYW5jZWxhYmxlJiZOZS5kZWZhdWx0UHJldmVudGVkfWFkZEV2ZW50TGlzdGVuZXIoSyxpZSxOZSl7Sz1IaShLLE5lKSwodGhpcy5saXN0ZW5lcnNbS118fCh0aGlzLmxpc3RlbmVyc1tLXT1bXSkpLnB1c2goaWUpfXJlbW92ZUV2ZW50TGlzdGVuZXIoSyxpZSxOZSl7Sz1IaShLLE5lKTtsZXQgc3Q9dGhpcy5saXN0ZW5lcnNbS107aWYoIXN0KXJldHVybjtsZXQgWHQ9c3QuaW5kZXhPZihpZSk7WHQ+LTEmJnN0LnNwbGljZShYdCwxKX19bGV0IGtpPS8oPzpPbmNlfFBhc3NpdmV8Q2FwdHVyZSkkLztmdW5jdGlvbiBJbyhYKXtsZXQgSztpZihraS50ZXN0KFgpKXtLPXt9O2xldCBpZTtmb3IoO2llPVgubWF0Y2goa2kpOylYPVguc2xpY2UoMCxYLmxlbmd0aC1pZVswXS5sZW5ndGgpLEtbaWVbMF0udG9Mb3dlckNhc2UoKV09ITB9cmV0dXJuW3AuaHlwaGVuYXRlKFguc2xpY2UoMikpLEtdfWxldCBWcj0oKCk9Pih7c3RvcDoxLHByZXZlbnQ6MTw8MSxzZWxmOjE8PDJ9KSkoKTtmdW5jdGlvbiBacihYKXtsZXQgSz0wO3JldHVybiBYLmluY2x1ZGVzKCJzdG9wIikmJihLfD1Wci5zdG9wKSxYLmluY2x1ZGVzKCJwcmV2ZW50IikmJihLfD1Wci5wcmV2ZW50KSxYLmluY2x1ZGVzKCJzZWxmIikmJihLfD1Wci5zZWxmKSxLfWxldCBBcj0wLHBuPTEsWHI9MyxVcj04O2Z1bmN0aW9uIER0KFgsSyl7bGV0e3BhcmVudE5vZGU6aWV9PVg7aWYoIWllKXJldHVybiBudWxsO2xldHtjaGlsZE5vZGVzOk5lfT1pZTtyZXR1cm4gTmVbTmUuaW5kZXhPZihYKSsoSz09PSJuIj8xOi0xKV18fG51bGx9ZnVuY3Rpb24gVGUoWCl7bGV0e3BhcmVudE5vZGU6S309WDtpZihLKXtsZXR7Y2hpbGROb2RlczppZX09SyxOZT1pZS5pbmRleE9mKFgpO05lPi0xJiYoWC5wYXJlbnROb2RlPW51bGwsaWUuc3BsaWNlKE5lLDEpKX19ZnVuY3Rpb24gX2koWCl7IVgubm9kZUlkJiZYLnBhZ2VOb2RlJiYoWC5ub2RlSWQ9WC5wYWdlTm9kZS5nZW5JZCgpKX1jbGFzcyBiaSBleHRlbmRzIHZye2NvbnN0cnVjdG9yKEssaWUsTmUpe3N1cGVyKCk7aWYodGhpcy5wYWdlTm9kZT1udWxsLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuX3RleHQ9bnVsbCxOZSl7bGV0e3BhZ2VOb2RlOnN0fT1OZTtzdCYmKHRoaXMucGFnZU5vZGU9c3QsdGhpcy5ub2RlSWQ9c3QuZ2VuSWQoKSwhc3QuaXNVbm1vdW50ZWQmJnN0Lm9uQ3JlYXRlKHRoaXMsaWUpKX10aGlzLm5vZGVUeXBlPUssdGhpcy5ub2RlTmFtZT1pZSx0aGlzLmNoaWxkTm9kZXM9W119Z2V0IGZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdfHxudWxsfWdldCBsYXN0Q2hpbGQoKXtsZXR7Y2hpbGROb2RlczpLfT10aGlzLGllPUsubGVuZ3RoO3JldHVybiBpZT9LW2llLTFdOm51bGx9Z2V0IG5leHRTaWJsaW5nKCl7cmV0dXJuIER0KHRoaXMsIm4iKX1nZXQgbm9kZVZhbHVlKCl7cmV0dXJuIG51bGx9c2V0IG5vZGVWYWx1ZShLKXt9Z2V0IHRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuX3RleHR8fCIifXNldCB0ZXh0Q29udGVudChLKXt0aGlzLl90ZXh0PUssdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25UZXh0Q29udGVudCh0aGlzLEspfWdldCBwYXJlbnRFbGVtZW50KCl7bGV0e3BhcmVudE5vZGU6S309dGhpcztyZXR1cm4gSyYmSy5ub2RlVHlwZT09PXBuP0s6bnVsbH1nZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIER0KHRoaXMsInAiKX1hcHBlbmRDaGlsZChLKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoSyxudWxsKX1jbG9uZU5vZGUoSyl7bGV0IGllPXAuZXh0ZW5kKE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKSx0aGlzKSx7YXR0cmlidXRlczpOZX09aWU7cmV0dXJuIE5lJiYoaWUuYXR0cmlidXRlcz1wLmV4dGVuZCh7fSxOZSkpLEsmJihpZS5jaGlsZE5vZGVzPWllLmNoaWxkTm9kZXMubWFwKHN0PT5zdC5jbG9uZU5vZGUoITApKSksaWV9aW5zZXJ0QmVmb3JlKEssaWUpe1RlKEspLEsucGFnZU5vZGU9dGhpcy5wYWdlTm9kZSxLLnBhcmVudE5vZGU9dGhpcyxfaShLKTtsZXR7Y2hpbGROb2RlczpOZX09dGhpcztpZihpZSl7bGV0IHN0PU5lLmluZGV4T2YoaWUpO2lmKHN0PT09LTEpdGhyb3cgbmV3IE5pKCJGYWlsZWQgdG8gZXhlY3V0ZSAnaW5zZXJ0QmVmb3JlJyBvbiAnTm9kZSc6IFRoZSBub2RlIGJlZm9yZSB3aGljaCB0aGUgbmV3IG5vZGUgaXMgdG8gYmUgaW5zZXJ0ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLiIpO05lLnNwbGljZShzdCwwLEspfWVsc2UgTmUucHVzaChLKTtyZXR1cm4gdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQ/dGhpcy5wYWdlTm9kZS5vbkluc2VydEJlZm9yZSh0aGlzLEssaWUpOkt9cmVtb3ZlQ2hpbGQoSyl7bGV0e2NoaWxkTm9kZXM6aWV9PXRoaXMsTmU9aWUuaW5kZXhPZihLKTtpZihOZT09PS0xKXRocm93IG5ldyBOaSgiRmFpbGVkIHRvIGV4ZWN1dGUgJ3JlbW92ZUNoaWxkJyBvbiAnTm9kZSc6IFRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLiIpO3JldHVybiBLLnBhcmVudE5vZGU9bnVsbCxpZS5zcGxpY2UoTmUsMSksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQ/dGhpcy5wYWdlTm9kZS5vblJlbW92ZUNoaWxkKEspOkt9fWxldCB5aT0iY2xhc3MiLE9yPSJzdHlsZSIsUmk9Ii52T3duZXJJZCIsVHI9Ii52UmVuZGVyanMiO2NsYXNzIFJyIGV4dGVuZHMgYml7Y29uc3RydWN0b3IoSyxpZSxOZSl7c3VwZXIoSyxpZSxOZSk7dGhpcy5hdHRyaWJ1dGVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5zdHlsZT1udWxsLHRoaXMudlNob3c9bnVsbCx0aGlzLl9odG1sPW51bGx9Z2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbeWldfHwiIn1zZXQgY2xhc3NOYW1lKEspe3RoaXMuc2V0QXR0cmlidXRlKHlpLEspfWdldCBpbm5lckhUTUwoKXtyZXR1cm4iIn1zZXQgaW5uZXJIVE1MKEspe3RoaXMuX2h0bWw9S31hZGRFdmVudExpc3RlbmVyKEssaWUsTmUpe3N1cGVyLmFkZEV2ZW50TGlzdGVuZXIoSyxpZSxOZSksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJihpZS53eHNFdmVudD90aGlzLnBhZ2VOb2RlLm9uQWRkV3hzRXZlbnQodGhpcyxIaShLLE5lKSxpZS53eHNFdmVudCxacihpZS5tb2RpZmllcnN8fFtdKSk6dGhpcy5wYWdlTm9kZS5vbkFkZEV2ZW50KHRoaXMsSGkoSyxOZSksWnIoaWUubW9kaWZpZXJzfHxbXSkpKX1yZW1vdmVFdmVudExpc3RlbmVyKEssaWUsTmUpe3N1cGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoSyxpZSxOZSksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25SZW1vdmVFdmVudCh0aGlzLEhpKEssTmUpKX1nZXRBdHRyaWJ1dGUoSyl7cmV0dXJuIEs9PT1Pcj90aGlzLnN0eWxlOnRoaXMuYXR0cmlidXRlc1tLXX1yZW1vdmVBdHRyaWJ1dGUoSyl7Sz09T3I/dGhpcy5zdHlsZT1udWxsOmRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbS10sdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25SZW1vdmVBdHRyaWJ1dGUodGhpcyxLKX1zZXRBdHRyaWJ1dGUoSyxpZSl7Sz09PU9yP3RoaXMuc3R5bGU9aWU6dGhpcy5hdHRyaWJ1dGVzW0tdPWllLHRoaXMucGFnZU5vZGUmJiF0aGlzLnBhZ2VOb2RlLmlzVW5tb3VudGVkJiZ0aGlzLnBhZ2VOb2RlLm9uU2V0QXR0cmlidXRlKHRoaXMsSyxpZSl9dG9KU09OKHthdHRyOkssbm9ybWFsaXplOmllfT17fSl7bGV0e2F0dHJpYnV0ZXM6TmUsc3R5bGU6c3QsbGlzdGVuZXJzOlh0LF90ZXh0OnhufT10aGlzLERuPXt9O09iamVjdC5rZXlzKE5lKS5sZW5ndGgmJihEbi5hPWllP2llKE5lKTpOZSk7bGV0IF9yPU9iamVjdC5rZXlzKFh0KTtpZihfci5sZW5ndGgpe2xldCBCcixtbz17fTtfci5mb3JFYWNoKHhvPT57bGV0IEJvPVh0W3hvXTtpZihCby5sZW5ndGgpe2xldHt3eHNFdmVudDpMbixtb2RpZmllcnM6WW59PUJvWzBdLEZuPVpyKFlufHxbXSk7TG4/KEJyfHwoQnI9e30pLEJyW3hvXT1baWU/aWUoTG4pOkxuLEZuXSk6bW9beG9dPUZufX0pLERuLmU9aWU/aWUobW8sITEpOm1vLEJyJiYoRG4udz1pZT9pZShCciwhMSk6QnIpfXJldHVybiBzdCE9PW51bGwmJihEbi5zPWllP2llKHN0KTpzdCksS3x8KERuLmk9dGhpcy5ub2RlSWQsRG4ubj10aGlzLm5vZGVOYW1lKSx4biE9PW51bGwmJihEbi50PWllP2llKHhuKTp4biksRG59fWNsYXNzIGFpIGV4dGVuZHMgYml7Y29uc3RydWN0b3IoSyxpZSl7c3VwZXIoVXIsIiNjb21tZW50IixpZSk7dGhpcy5fdGV4dD0iIn10b0pTT04oSz17fSl7cmV0dXJuIEsuYXR0cj97fTp7aTp0aGlzLm5vZGVJZH19fWNsYXNzIFByIGV4dGVuZHMgUnJ7Y29uc3RydWN0b3IoSyxpZSl7c3VwZXIocG4sSy50b1VwcGVyQ2FzZSgpLGllKTt0aGlzLnRhZ05hbWU9dGhpcy5ub2RlTmFtZX19Y2xhc3MgRWkgZXh0ZW5kcyBQcntnZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoInZhbHVlIil9c2V0IHZhbHVlKEspe3RoaXMuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsSyl9fWNsYXNzIGZuIGV4dGVuZHMgRWl7fWNsYXNzIGppIGV4dGVuZHMgUnJ7Y29uc3RydWN0b3IoSyxpZSl7c3VwZXIoWHIsIiN0ZXh0IixpZSk7dGhpcy5fdGV4dD1LfWdldCBub2RlVmFsdWUoKXtyZXR1cm4gdGhpcy5fdGV4dHx8IiJ9c2V0IG5vZGVWYWx1ZShLKXt0aGlzLl90ZXh0PUssdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25Ob2RlVmFsdWUodGhpcyxLKX19bGV0ICRyPXtBRDpbImRhdGEiXSwiQUQtRFJBVyI6WyJkYXRhIl0sIkxJVkUtUExBWUVSIjpbInBpY3R1cmUtaW4tcGljdHVyZS1tb2RlIl0sTUFQOlsibWFya2VycyIsInBvbHlsaW5lIiwiY2lyY2xlcyIsImNvbnRyb2xzIiwiaW5jbHVkZS1wb2ludHMiLCJwb2x5Z29ucyJdLFBJQ0tFUjpbInJhbmdlIiwidmFsdWUiXSwiUElDS0VSLVZJRVciOlsidmFsdWUiXSwiUklDSC1URVhUIjpbIm5vZGVzIl0sVklERU86WyJkYW5tdS1saXN0IiwiaGVhZGVyIl0sIldFQi1WSUVXIjpbIndlYnZpZXctc3R5bGVzIl19LHRvPVsiYW5pbWF0aW9uIl0sRW49KFgsSyk9PntpZih0by5pbmRleE9mKEspPi0xKXJldHVybiEwO2xldCBpZT0kcltYLm5vZGVOYW1lXTtyZXR1cm4hIShpZSYmaWUuaW5kZXhPZihLKT4tMSl9LEhyPTEsc3I9MixTaT0zLHhpPTQsbXI9NSxRcj02LGVyPTcsdHI9OCxHbj05LG5yPTEwLGNyPTEyLGhvPTE1LGdvPTIwO2Z1bmN0aW9uIE5vKFgsSyx7Y2xlYXJUaW1lb3V0OmllLHNldFRpbWVvdXQ6TmV9KXtsZXQgc3QsWHQ9ZnVuY3Rpb24oKXtpZShzdCksc3Q9TmUoKCk9PlguYXBwbHkodGhpcyxhcmd1bWVudHMpLEspfTtyZXR1cm4gWHQuY2FuY2VsPWZ1bmN0aW9uKCl7aWUoc3QpfSxYdH1jbGFzcyBub3tjb25zdHJ1Y3RvcihLLGllKXt0aGlzLmlkPUssdGhpcy5saXN0ZW5lcj17fSx0aGlzLmVtaXRDYWNoZT1bXSxpZSYmT2JqZWN0LmtleXMoaWUpLmZvckVhY2goTmU9Pnt0aGlzLm9uKE5lLGllW05lXSl9KX1lbWl0KEssLi4uaWUpe2xldCBOZT10aGlzLmxpc3RlbmVyW0tdO2lmKCFOZSlyZXR1cm4gdGhpcy5lbWl0Q2FjaGUucHVzaCh7ZXZlbnROYW1lOkssYXJnczppZX0pO05lLmZvckVhY2goc3Q9PntzdC5mbi5hcHBseShzdC5mbixpZSl9KSx0aGlzLmxpc3RlbmVyW0tdPU5lLmZpbHRlcihzdD0+c3QudHlwZSE9PSJvbmNlIil9b24oSyxpZSl7dGhpcy5fYWRkTGlzdGVuZXIoSywib24iLGllKSx0aGlzLl9jbGVhckNhY2hlKEspfW9uY2UoSyxpZSl7dGhpcy5fYWRkTGlzdGVuZXIoSywib25jZSIsaWUpLHRoaXMuX2NsZWFyQ2FjaGUoSyl9b2ZmKEssaWUpe2xldCBOZT10aGlzLmxpc3RlbmVyW0tdO2lmKCEhTmUpaWYoaWUpZm9yKGxldCBzdD0wO3N0PE5lLmxlbmd0aDspTmVbc3RdLmZuPT09aWUmJihOZS5zcGxpY2Uoc3QsMSksc3QtLSksc3QrKztlbHNlIGRlbGV0ZSB0aGlzLmxpc3RlbmVyW0tdfV9jbGVhckNhY2hlKEspe2ZvcihsZXQgaWU9MDtpZTx0aGlzLmVtaXRDYWNoZS5sZW5ndGg7aWUrKyl7bGV0IE5lPXRoaXMuZW1pdENhY2hlW2llXSxzdD1LP05lLmV2ZW50TmFtZT09PUs/SzpudWxsOk5lLmV2ZW50TmFtZTtpZighc3QpY29udGludWU7aWYodHlwZW9mIHRoaXMuZW1pdC5hcHBseSh0aGlzLFtzdCwuLi5OZS5hcmdzXSk9PSJudW1iZXIiKXt0aGlzLmVtaXRDYWNoZS5wb3AoKTtjb250aW51ZX10aGlzLmVtaXRDYWNoZS5zcGxpY2UoaWUsMSksaWUtLX19X2FkZExpc3RlbmVyKEssaWUsTmUpeyh0aGlzLmxpc3RlbmVyW0tdfHwodGhpcy5saXN0ZW5lcltLXT1bXSkpLnB1c2goe2ZuOk5lLHR5cGU6aWV9KX19bGV0IGtvPVtMcixncixvdCx6LHByLFBuLHplLG50LEF0LFF0LFRuLG9yLHNuLEpyLFduLEFuLGduLHdyLEtyXSxqcj1bZ3Isb3RdO2Z1bmN0aW9uIHhyKFgpe3JldHVybiBqci5pbmRleE9mKFgpPi0xfWZ1bmN0aW9uIHBvKFgpe3JldHVybiBrby5pbmRleE9mKFgpPi0xfWxldCBSbz1bb3QseixKLGhuLHVuLGdpLHBpLHFyLExyLGdyLFNuLHByLHZpLFBuLHplLG50LEF0LFF0LFRuLHNuLG9yLEpyLFduLEFuLGduLHdyLEtyXTtmdW5jdGlvbiBybyhYLEssaWU9ITApe3JldHVybiBpZSYmIXAuaXNGdW5jdGlvbihLKT8hMTpSby5pbmRleE9mKFgpPi0xPyEwOlguaW5kZXhPZigib24iKT09PTB9bGV0IEJpLHZvPVtdO2Z1bmN0aW9uIE1pKFgpe2lmKEJpKXJldHVybiBYKEJpKTt2by5wdXNoKFgpfWZ1bmN0aW9uIHppKFgpe0JpPVgsdm8uZm9yRWFjaChLPT5LKFgpKX1sZXQgUW89UWkoKFgsSyk9PntpZihwLmlzRnVuY3Rpb24oWC5fY29tcG9uZW50Lm9uRXJyb3IpKXJldHVybiBLKFgpfSksQj1mdW5jdGlvbigpe307Qi5wcm90b3R5cGU9e29uOmZ1bmN0aW9uKFgsSyxpZSl7dmFyIE5lPXRoaXMuZXx8KHRoaXMuZT17fSk7cmV0dXJuKE5lW1hdfHwoTmVbWF09W10pKS5wdXNoKHtmbjpLLGN0eDppZX0pLHRoaXN9LG9uY2U6ZnVuY3Rpb24oWCxLLGllKXt2YXIgTmU9dGhpcztmdW5jdGlvbiBzdCgpe05lLm9mZihYLHN0KSxLLmFwcGx5KGllLGFyZ3VtZW50cyl9cmV0dXJuIHN0Ll89Syx0aGlzLm9uKFgsc3QsaWUpfSxlbWl0OmZ1bmN0aW9uKFgpe3ZhciBLPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGllPSgodGhpcy5lfHwodGhpcy5lPXt9KSlbWF18fFtdKS5zbGljZSgpLE5lPTAsc3Q9aWUubGVuZ3RoO2ZvcihOZTtOZTxzdDtOZSsrKWllW05lXS5mbi5hcHBseShpZVtOZV0uY3R4LEspO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24oWCxLKXt2YXIgaWU9dGhpcy5lfHwodGhpcy5lPXt9KSxOZT1pZVtYXSxzdD1bXTtpZihOZSYmSylmb3IodmFyIFh0PTAseG49TmUubGVuZ3RoO1h0PHhuO1h0KyspTmVbWHRdLmZuIT09SyYmTmVbWHRdLmZuLl8hPT1LJiZzdC5wdXNoKE5lW1h0XSk7cmV0dXJuIHN0Lmxlbmd0aD9pZVtYXT1zdDpkZWxldGUgaWVbWF0sdGhpc319O3ZhciBRPUI7bGV0IGhlPXtibGFjazoicmdiYSgwLDAsMCwwLjQpIix3aGl0ZToicmdiYSgyNTUsMjU1LDI1NSwwLjQpIn07ZnVuY3Rpb24gYWUoWCl7cmV0dXJuIFgmJlggaW4gaGU/aGVbWF06WH1mdW5jdGlvbiBkZShYKXtyZXR1cm4gWD09PSJibGFjayI/IiMwMDAwMDAiOiIjZmZmZmZmIn1mdW5jdGlvbiB2dChYLEs9e30saWU9ImxpZ2h0Iil7bGV0IE5lPUtbaWVdLHN0PXt9O3JldHVybiBOZT8oT2JqZWN0LmtleXMoWCkuZm9yRWFjaChYdD0+e2xldCB4bj1YW1h0XTtzdFtYdF09KCgpPT57aWYocC5pc1BsYWluT2JqZWN0KHhuKSlyZXR1cm4gdnQoeG4sSyxpZSk7aWYocC5pc0FycmF5KHhuKSlyZXR1cm4geG4ubWFwKERuPT5wLmlzUGxhaW5PYmplY3QoRG4pP3Z0KERuLEssaWUpOkRuKTtpZihwLmlzU3RyaW5nKHhuKSYmeG4uc3RhcnRzV2l0aCgiQCIpKXtsZXQgRG49eG4ucmVwbGFjZSgiQCIsIiIpLF9yPU5lW0RuXXx8eG47c3dpdGNoKFh0KXtjYXNlInRpdGxlQ29sb3IiOl9yPWRlKF9yKTticmVhaztjYXNlImJvcmRlclN0eWxlIjpfcj1hZShfcik7YnJlYWt9cmV0dXJuIF9yfXJldHVybiB4bn0pKCl9KSxzdCk6WH12YXIga3Q9e2ludm9rZUFycmF5Rm5zOkNyLGlzVW5pTGlmZWN5Y2xlSG9vazpybyxPTl9MT0FEOmdyLE9OX1NIT1c6b3QsTElORUZFRUQ6dyxSRU5ERVJKU19NT0RVTEVTOkluLGZvcm1hdExvZzpBbyxXWFNfUFJPVE9DT0w6T3QsV1hTX01PRFVMRVM6d3QsVW5pTGlmZWN5Y2xlSG9va3M6Um8sT05fRVJST1I6aG4saW52b2tlQ3JlYXRlRXJyb3JIYW5kbGVyOlFvLGludm9rZUNyZWF0ZVZ1ZUFwcEhvb2s6emkscGFyc2VOVnVlRGF0YXNldDpabixvbmNlOlFpLEkxOE5fSlNPTl9ERUxJTUlURVJTOnksRW1pdHRlcjpRLG5vcm1hbGl6ZVN0eWxlczp2dCxhZGRMZWFkaW5nU2xhc2g6dW8scmVzb2x2ZUNvbXBvbmVudEluc3RhbmNlOlhvLHJlbW92ZUxlYWRpbmdTbGFzaDprbixPTl9SRVNJWkU6dmksT05fQVBQX0VOVEVSX0ZPUkVHUk9VTkQ6d28sT05fQVBQX0VOVEVSX0JBQ0tHUk9VTkQ6ZGEsT05fSElERTp6LE9OX1BBR0VfU0NST0xMOnplLE9OX1JFQUNIX0JPVFRPTTpBdCxTQ0hFTUVfUkU6RmUsREFUQV9SRTpJdCxjYWNoZVN0cmluZ0Z1bmN0aW9uOlhpLHBhcnNlUXVlcnk6a3IsY2FsbE9wdGlvbnM6S24sT05fVU5IQU5ETEVfUkVKRUNUSU9OOnBpLE9OX1BBR0VfTk9UX0ZPVU5EOmdpLFBSSU1BUllfQ09MT1I6UixnZXRMZW46bWksT05fVEhFTUVfQ0hBTkdFOnVuLFRBQkJBUl9IRUlHSFQ6RSxOQVZCQVJfSEVJR0hUOk4sc29ydE9iamVjdDplbyxPRkZfVEhFTUVfQ0hBTkdFOnluLE9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0U6Sm4sbm9ybWFsaXplVGFiQmFyU3R5bGVzOmFlLE9OX05BVklHQVRJT05fQkFSX0JVVFRPTl9UQVA6V24sc3RyaW5naWZ5UXVlcnk6Zm8sZGVib3VuY2U6Tm8sT05fUFVMTF9ET1dOX1JFRlJFU0g6UXQsT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NIQU5HRUQ6Z24sT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NPTkZJUk1FRDp3cixPTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfQ0xJQ0tFRDpBbixPTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfRk9DVVNfQ0hBTkdFRDpLcixPTl9CQUNLX1BSRVNTOlBuLFVuaU5vZGU6YmksTk9ERV9UWVBFX1BBR0U6QXIsQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEU6SHIsQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEVEOnNyLEFDVElPTl9UWVBFX1BBR0VfU0NST0xMOmhvLEFDVElPTl9UWVBFX0lOU0VSVDp4aSxBQ1RJT05fVFlQRV9DUkVBVEU6U2ksQUNUSU9OX1RZUEVfUkVNT1ZFOm1yLEFDVElPTl9UWVBFX0FERF9FVkVOVDp0cixBQ1RJT05fVFlQRV9BRERfV1hTX0VWRU5UOmNyLEFDVElPTl9UWVBFX1JFTU9WRV9FVkVOVDpHbixBQ1RJT05fVFlQRV9TRVRfQVRUUklCVVRFOlFyLEFDVElPTl9UWVBFX1JFTU9WRV9BVFRSSUJVVEU6ZXIsQUNUSU9OX1RZUEVfU0VUX1RFWFQ6bnIsT05fUkVBRFk6U24sT05fVU5MT0FEOnByLEV2ZW50Q2hhbm5lbDpubyxPTl9SRUFDSF9CT1RUT01fRElTVEFOQ0U6aCxwYXJzZVVybDpObixvbkNyZWF0ZVZ1ZUFwcDpNaSxPTl9UQUJfSVRFTV9UQVA6bnQsT05fTEFVTkNIOkosQUNUSU9OX1RZUEVfRVZFTlQ6Z28sY3JlYXRlVW5pRXZlbnQ6RnIsT05fV1hTX0lOVk9LRV9DQUxMX01FVEhPRDpVaSxXRUJfSU5WT0tFX0FQUFNFUlZJQ0U6VnQsaXNSb290SG9vazpwbyxpc1Jvb3RJbW1lZGlhdGVIb29rOnhyLFVuaUlucHV0RWxlbWVudDpFaSxVbmlUZXh0QXJlYUVsZW1lbnQ6Zm4sVW5pRWxlbWVudDpQcixVbmlUZXh0Tm9kZTpqaSxVbmlDb21tZW50Tm9kZTphaSxmb3JjZVBhdGNoUHJvcDpFbixKU09OX1BST1RPQ09MOlAscmVzb2x2ZU93bmVyRWw6cmksQVRUUl9WX09XTkVSX0lEOlJpLEFUVFJfVl9SRU5ERVJKUzpUcn07cmV0dXJuIGt0fShmKTtyZXR1cm4gc312YXIgeU49MTtmdW5jdGlvbiBXcCgpe3JldHVybih5TisrKS50b1N0cmluZygpfXZhciBkZj1mPT5mJiZKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGYpKXx8ZjtmdW5jdGlvbiBnYyhmKXtsZXQgcz1NYShmKTtyZXR1cm4gcy5zdWJzdHJpbmcoOCxzLmxlbmd0aC0xKX1mdW5jdGlvbiBoZihmKXtpZighem4oYnRvYSkpcmV0dXJuIiI7bGV0IHM9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGYpLHA9PlN0cmluZy5mcm9tQ2hhckNvZGUocCkpLmpvaW4oIiIpO3JldHVybiBidG9hKHMpfWZ1bmN0aW9uIHBjKGYpe2lmKCFmfHx0eXBlb2YgZiE9Im9iamVjdCIpcmV0dXJuITA7Zm9yKGxldCBzIGluIGYpaWYoaWwoZixzKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgaXU9WyJvZmYiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwibG9nIiwiZGVidWciXSxvdT17fTtmdW5jdGlvbiBHcCgpe2l1LmZvckVhY2goZj0+e2xldCBzPWl1LmluZGV4T2YoZik7b3VbZl09e30saXUuZm9yRWFjaChwPT57aXUuaW5kZXhPZihwKTw9cyYmKG91W2ZdW3BdPSEwKX0pfSl9ZnVuY3Rpb24gUW4oZil7bGV0IHM9Z2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsfHwibG9nIjtyZXR1cm4gb3Vbc10mJm91W3NdW2ZdfWZ1bmN0aW9uIFZpKGYpe2dsb2JhbC5uYXRpdmVMb2coInd4SW50ZXJhY3Rpb25BbmFseXplcjogW2pzZm1dIitmLCJfX0RFQlVHIil9ZnVuY3Rpb24gWXAoZixzLHApe3JldHVybmAke3N9QCR7cH0jJHtmfWB9dmFyIGF1PWNsYXNze2NvbnN0cnVjdG9yKHMpe3RoaXMuaW5zdGFuY2VJZD1TdHJpbmcocyksdGhpcy5sYXN0Q2FsbGJhY2tJZD0wLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319YWRkKHMpe3JldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkKyssdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF09cyx0aGlzLmxhc3RDYWxsYmFja0lkfXJlbW92ZShzKXtsZXQgcD10aGlzLmNhbGxiYWNrc1tzXTtyZXR1cm4gZGVsZXRlIHRoaXMuY2FsbGJhY2tzW3NdLHB9cmVnaXN0ZXJIb29rKHMscCx3LE4pe2xldCBFPVlwKHMscCx3KTt0aGlzLmhvb2tzW0VdJiZjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIE92ZXJyaWRlIGFuIGV4aXN0aW5nIGNvbXBvbmVudCBob29rICIke0V9Ii5gKSx0aGlzLmhvb2tzW0VdPU59dHJpZ2dlckhvb2socyxwLHcsTil7bGV0IEU9WXAocyxwLHcpLGg9dGhpcy5ob29rc1tFXTtpZighem4oaCkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEludmFsaWQgaG9vayBmdW5jdGlvbiB0eXBlICgke3R5cGVvZiBofSkgb24gIiR7RX0iLmApLG51bGw7bGV0IHk9bnVsbDt0cnl7eT1oLmFwcGx5KG51bGwsTnx8W10pfWNhdGNoKFIpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBob29rIGZ1bmN0aW9uIG9uICIke0V9Ii5gKSxSfXJldHVybiB5fWNvbnN1bWUocyxwLHcpe2xldCBOPXRoaXMuY2FsbGJhY2tzW3NdO2lmKCh0eXBlb2Ygdz09InVuZGVmaW5lZCJ8fHc9PT0hMSkmJmRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tzXSx6bihOKSl0cnl7cmV0dXJuIE4uY2FsbChudWxsLHAsdyl9Y2F0Y2goRSl7dGhyb3cgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOgogJHtFLnRvU3RyaW5nKCl9YCksRX1yZXR1cm4gbmV3IEVycm9yKGBpbnZhbGlkIGNhbGxiYWNrIGlkICIke3N9ImApfWNsb3NlKCl7dGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX19O3ZhciBzdT17fTtmdW5jdGlvbiBxcChmLHMpe2YmJihzdVtmXT1zKX1mdW5jdGlvbiBycyhmKXtyZXR1cm4gc3VbZl19ZnVuY3Rpb24gSnAoZil7ZGVsZXRlIHN1W2ZdfWZ1bmN0aW9uIERyKGYpe2lmKGYpe2xldCBzPXN1W2ZdO2lmKHMmJnMudGFza0NlbnRlcilyZXR1cm4gcy50YXNrQ2VudGVyfXJldHVybiBudWxsfWZ1bmN0aW9uIEVOKGYpe2YuY2FsY0NsYXNzTGlzdCYmZi5jYWxjQ2xhc3NMaXN0KCl9ZnVuY3Rpb24gZ2YoZixzLHApe2xldHtkb2N1bWVudEVsZW1lbnQ6d309ZjtpZih3LnB1cmVDaGlsZHJlbi5sZW5ndGg+MHx8cy5wYXJlbnROb2RlKXJldHVybjtsZXQgTj13LmNoaWxkcmVuLEU9cD9OLmluZGV4T2YocCk6LTE7RTwwP04ucHVzaChzKTpOLnNwbGljZShFLDAscykscy5ub2RlVHlwZT09PTE/KHMucm9sZT09PSJib2R5Ij8ocy5kb2NJZD1mLmlkLHMub3duZXJEb2N1bWVudD1mLHMucGFyZW50Tm9kZT13LG9sKHMsdykpOihzLmNoaWxkcmVuLmZvckVhY2goaD0+e2gucGFyZW50Tm9kZT1zfSkscGYoZixzKSxvbChzLHcpLGRlbGV0ZSBmLm5vZGVNYXBbcy5ub2RlSWRdKSx3LnB1cmVDaGlsZHJlbi5wdXNoKHMpLFNOKGYscykpOihzLnBhcmVudE5vZGU9dyxmLm5vZGVNYXBbcy5yZWZdPXMpfWZ1bmN0aW9uIFNOKGYscyl7bGV0IHA9cy50b0pTT04oKTtmJiZmLnRhc2tDZW50ZXImJnpuKGYudGFza0NlbnRlci5zZW5kKSYmZi50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoiY3JlYXRlQm9keSJ9LFtwXSl9ZnVuY3Rpb24gcGYoZixzKXtzLnJvbGU9ImJvZHkiLHMuZGVwdGg9MSxkZWxldGUgZi5ub2RlTWFwW3Mubm9kZUlkXSxzLnJlZj0iX3Jvb3QiLGYubm9kZU1hcC5fcm9vdD1zLGYuYm9keT1zfWZ1bmN0aW9uIG9sKGYscyl7Zi5wYXJlbnROb2RlPXMsRU4oZikscy5kb2NJZCYmKGYuZG9jSWQ9cy5kb2NJZCxmLm93bmVyRG9jdW1lbnQ9cy5vd25lckRvY3VtZW50LGYub3duZXJEb2N1bWVudC5ub2RlTWFwW2Yubm9kZUlkXT1mLGYuZGVwdGg9cy5kZXB0aCsxKSxmLmNoaWxkcmVuLmZvckVhY2gocD0+e29sKHAsZil9KX1mdW5jdGlvbiB2ZihmKXtmb3IoO2Y7KXtpZihmLm5vZGVUeXBlPT09MSlyZXR1cm4gZjtmPWYubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIG1mKGYpe2Zvcig7Zjspe2lmKGYubm9kZVR5cGU9PT0xKXJldHVybiBmO2Y9Zi5wcmV2aW91c1NpYmxpbmd9fWZ1bmN0aW9uIGFsKGYscyxwLHc9ITEpe3A8MCYmKHA9MCk7bGV0IE49c1twLTFdLEU9c1twXTtyZXR1cm4gcy5zcGxpY2UocCwwLGYpLHcmJihOJiYoTi5uZXh0U2libGluZz1mKSxmLnByZXZpb3VzU2libGluZz1OLGYubmV4dFNpYmxpbmc9RSxFJiYoRS5wcmV2aW91c1NpYmxpbmc9ZikpLHB9ZnVuY3Rpb24gc2woZixzLHAsdz0hMSl7bGV0IE49cy5pbmRleE9mKGYpO2lmKE48MClyZXR1cm4tMTtpZih3KXtsZXQgUj1zW04tMV0sRmU9c1tOKzFdO1ImJihSLm5leHRTaWJsaW5nPUZlKSxGZSYmKEZlLnByZXZpb3VzU2libGluZz1SKX1zLnNwbGljZShOLDEpO2xldCBFPXA7Tjw9cCYmKEU9cC0xKTtsZXQgaD1zW0UtMV0seT1zW0VdO3JldHVybiBzLnNwbGljZShFLDAsZiksdyYmKGgmJihoLm5leHRTaWJsaW5nPWYpLGYucHJldmlvdXNTaWJsaW5nPWgsZi5uZXh0U2libGluZz15LHkmJih5LnByZXZpb3VzU2libGluZz1mKSksTj09PUU/LTE6cH1mdW5jdGlvbiBfZihmLHMscD0hMSl7bGV0IHc9cy5pbmRleE9mKGYpO2lmKCEodzwwKSl7aWYocCl7bGV0IE49c1t3LTFdLEU9c1t3KzFdO04mJihOLm5leHRTaWJsaW5nPUUpLEUmJihFLnByZXZpb3VzU2libGluZz1OKX1zLnNwbGljZSh3LDEpfX12YXIgbGw9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmRlcHRoPTA7dGhpcy5ub2RlSWQ9V3AoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubmV4dFNpYmxpbmc9bnVsbCx0aGlzLnByZXZpb3VzU2libGluZz1udWxsfWRlc3Ryb3koKXtsZXQgcz1ycyh0aGlzLmRvY0lkKTtzJiYoZGVsZXRlIHRoaXMuZG9jSWQsZGVsZXRlIHMubm9kZU1hcFt0aGlzLm5vZGVJZF0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChwPT57cC5kZXN0cm95KCl9KX19O3ZhciBLcD17fTtmdW5jdGlvbiBiZihmLHMpe2lmKCFJaShzKXx8IXMubGVuZ3RoKXJldHVybjtjbGFzcyBwIGV4dGVuZHMgWml7fXMuZm9yRWFjaCh3PT57cC5wcm90b3R5cGVbd109ZnVuY3Rpb24oLi4uTil7bGV0IEU9RHIodGhpcy5kb2NJZCk7aWYoRSlyZXR1cm4gRS5zZW5kKCJjb21wb25lbnQiLHtyZWY6dGhpcy5yZWYsY29tcG9uZW50OmYsbWV0aG9kOnd9LE4pfX0pLEtwW2ZdPXB9ZnVuY3Rpb24gWnAoZil7cmV0dXJuIEtwW2ZdfWZ1bmN0aW9uIE5yKGYscyxwLHcsTil7bGV0IEU9e3R5cGU6ImRlY2wiLHByb3A6Zix2YWx1ZTpzLnRvU3RyaW5nKCkscmF3czp3LHNvdXJjZTpOfTtyZXR1cm4gcCYmKEUuaW1wb3J0YW50PSEwKSxFfXZhciB3Tj0iYmFja2dyb3VuZENvbG9yIixDTj0iYmFja2dyb3VuZEltYWdlIixBTj1mPT57bGV0e3ZhbHVlOnMsaW1wb3J0YW50OnAscmF3czp3LHNvdXJjZTpOfT1mO3JldHVybi9eIz9cUyskLy50ZXN0KHMpfHwvXnJnYmE/KC4rKSQvLnRlc3Qocyk/W05yKHdOLHMscCx3LE4pXTovXmxpbmVhci1ncmFkaWVudCguKykkLy50ZXN0KHMpP1tOcihDTixzLHAsdyxOKV06W2ZdfSxPTj0iV2lkdGgiLFROPSJTdHlsZSIsUE49IkNvbG9yIjtmdW5jdGlvbiBJTihmKXtyZXR1cm4gcz0+e2xldHtwcm9wOnAsdmFsdWU6dyxpbXBvcnRhbnQ6TixyYXdzOkUsc291cmNlOmh9PXMseT13LnJlcGxhY2UoL1xzKixccyovZywiLCIpLnNwbGl0KC9ccysvKSxSPVsvXltcZFwuXStcUyp8Xih0aGlufG1lZGl1bXx0aGljaykkLywvXihzb2xpZHxkYXNoZWR8ZG90dGVkfG5vbmUpJC8sL1xTKy9dLm1hcChGZT0+e2xldCBJdD15LmZpbmRJbmRleChWdD0+RmUudGVzdChWdCkpO3JldHVybiBJdDwwP251bGw6eS5zcGxpY2UoSXQsMSlbMF19KTtyZXR1cm4geS5sZW5ndGg/W3NdOltOcihwK09OLChSWzBdfHwoZi50eXBlPT09InV2dWUiPyJ0aGluIjoiMCIpKS50cmltKCksTixFLGgpLE5yKHArVE4sKFJbMV18fChmLnR5cGU9PT0idXZ1ZSI/Im5vbmUiOiJzb2xpZCIpKS50cmltKCksTixFLGgpLE5yKHArUE4sKFJbMl18fCIjMDAwMDAwIikudHJpbSgpLE4sRSxoKV19fXZhciBOTj0iYm9yZGVyVG9wIixrTj0iYm9yZGVyUmlnaHQiLFJOPSJib3JkZXJCb3R0b20iLHhOPSJib3JkZXJMZWZ0Iix5Zj1mPT57bGV0e3Byb3A6cyx2YWx1ZTpwLGltcG9ydGFudDp3LHJhd3M6Tixzb3VyY2U6RX09ZixoPWZmKHMpLnNwbGl0KCItIilbMV07aD1ydShoKTtsZXQgeT1wLnJlcGxhY2UoL1xzKixccyovZywiLCIpLnNwbGl0KC9ccysvKTtzd2l0Y2goeS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm5bZl07Y2FzZSAyOnkucHVzaCh5WzBdLHlbMV0pO2JyZWFrO2Nhc2UgMzp5LnB1c2goeVsxXSk7YnJlYWt9cmV0dXJuW05yKE5OK2gseVswXSx3LE4sRSksTnIoa04raCx5WzFdLHcsTixFKSxOcihSTitoLHlbMl0sdyxOLEUpLE5yKHhOK2gseVszXSx3LE4sRSldfSxCTj0iYm9yZGVyVG9wTGVmdFJhZGl1cyIsTU49ImJvcmRlclRvcFJpZ2h0UmFkaXVzIixETj0iYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLExOPSJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIixGTj1mPT57bGV0e3ZhbHVlOnMsaW1wb3J0YW50OnAscmF3czp3LHNvdXJjZTpOfT1mLEU9cy5zcGxpdCgvXHMrLyk7aWYocy5pbmNsdWRlcygiLyIpKXJldHVybltmXTtzd2l0Y2goRS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm5bZl07Y2FzZSAyOkUucHVzaChFWzBdLEVbMV0pO2JyZWFrO2Nhc2UgMzpFLnB1c2goRVsxXSk7YnJlYWt9cmV0dXJuW05yKEJOLEVbMF0scCx3LE4pLE5yKE1OLEVbMV0scCx3LE4pLE5yKEROLEVbMl0scCx3LE4pLE5yKExOLEVbM10scCx3LE4pXX0sVk49eWYsVU49eWYsJE49ImZsZXhEaXJlY3Rpb24iLEhOPSJmbGV4V3JhcCIsak49Zj0+e2xldHt2YWx1ZTpzLGltcG9ydGFudDpwLHJhd3M6dyxzb3VyY2U6Tn09ZixFPXMuc3BsaXQoL1xzKy8pLGg9Wy9eKGNvbHVtbnxjb2x1bW4tcmV2ZXJzZXxyb3d8cm93LXJldmVyc2UpJC8sL14obm93cmFwfHdyYXB8d3JhcC1yZXZlcnNlKSQvXS5tYXAoeT0+e2xldCBSPUUuZmluZEluZGV4KEZlPT55LnRlc3QoRmUpKTtyZXR1cm4gUjwwP251bGw6RS5zcGxpY2UoUiwxKVswXX0pO3JldHVybiBFLmxlbmd0aD9bZl06W05yKCROLGhbMF18fCJjb2x1bW4iLHAsdyxOKSxOcihITixoWzFdfHwibm93cmFwIixwLHcsTildfSx6Tj0iVG9wIixXTj0iUmlnaHQiLEdOPSJCb3R0b20iLFlOPSJMZWZ0IixYcD1mPT5zPT57bGV0e3ZhbHVlOnAsaW1wb3J0YW50OncscmF3czpOLHNvdXJjZTpFfT1zLGg9cC5zcGxpdCgvXHMrLyk7c3dpdGNoKGgubGVuZ3RoKXtjYXNlIDE6aC5wdXNoKGhbMF0saFswXSxoWzBdKTticmVhaztjYXNlIDI6aC5wdXNoKGhbMF0saFsxXSk7YnJlYWs7Y2FzZSAzOmgucHVzaChoWzFdKTticmVha31yZXR1cm5bTnIoZit6TixoWzBdLHcsTixFKSxOcihmK1dOLGhbMV0sdyxOLEUpLE5yKGYrR04saFsyXSx3LE4sRSksTnIoZitZTixoWzNdLHcsTixFKV19LHFOPVhwKCJtYXJnaW4iKSxKTj1YcCgicGFkZGluZyIpLEtOPSJ0cmFuc2l0aW9uUHJvcGVydHkiLFpOPSJ0cmFuc2l0aW9uRHVyYXRpb24iLFhOPSJ0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24iLFFOPSJ0cmFuc2l0aW9uRGVsYXkiLGVrPWY9PntsZXQgcz0vXihcUyopP1xzKihcZCpcLj9cZCsoPzptc3xzKT8pP1xzKihcUyopP1xzKihcZCpcLj9cZCsoPzptc3xzKT8pPyQvLHt2YWx1ZTpwLGltcG9ydGFudDp3LHJhd3M6Tixzb3VyY2U6RX09ZixoPVtdLHk9cC5tYXRjaChzKTtyZXR1cm4geSYmKHlbMV0mJmgucHVzaChOcihLTix5WzFdLHcsTixFKSkseVsyXSYmaC5wdXNoKE5yKFpOLHlbMl0sdyxOLEUpKSx5WzNdJiZoLnB1c2goTnIoWE4seVszXSx3LE4sRSkpLHlbNF0mJmgucHVzaChOcihRTix5WzRdLHcsTixFKSkpLGh9O2Z1bmN0aW9uIHRrKGYpe2xldCBzPUlOKGYpLHA9TnAoe3RyYW5zaXRpb246ZWssYm9yZGVyOnMsYmFja2dyb3VuZDpBTixib3JkZXJUb3A6cyxib3JkZXJSaWdodDpzLGJvcmRlckJvdHRvbTpzLGJvcmRlckxlZnQ6cyxib3JkZXJTdHlsZTpWTixib3JkZXJXaWR0aDpVTixib3JkZXJDb2xvcjp5Zixib3JkZXJSYWRpdXM6Rk59LGYudHlwZSE9PSJ1dnVlIj97bWFyZ2luOnFOLHBhZGRpbmc6Sk4sZmxleEZsb3c6ak59Ont9KSx3PXt9O3JldHVybiB3PXAsd312YXIgRWYsUXA9U3ltYm9sKCJleHBhbmRlZCIpO2Z1bmN0aW9uIGV2KGYpe3JldHVybntwb3N0Y3NzUGx1Z2luOiJudnVlOmV4cGFuZCIsRGVjbGFyYXRpb24ocCl7aWYocFtRcF0pcmV0dXJuO0VmfHwoRWY9dGsoZikpO2xldCB3PUVmW3AucHJvcF07aWYodyl7bGV0IE49dyhwKTtOLmxlbmd0aD09PTEmJk5bMF09PT1wfHxwLnJlcGxhY2VXaXRoKE4pfXBbUXBdPSEwfX19dmFyIG5rPWV2KHt0eXBlOiJudnVlIn0pLkRlY2xhcmF0aW9uO2Z1bmN0aW9uIFNmKGYscyl7bGV0IHA9Rmkoe3JlcGxhY2VXaXRoKE4pe3c9Tn19LHJrKGYscykpLHc9W3BdO3JldHVybiBuayhwKSx3fWZ1bmN0aW9uIHJrKGYscyl7bGV0IHA9cysiIjtyZXR1cm4gcC5pbmNsdWRlcygiIWltcG9ydGFudCIpP3twcm9wOmYsdmFsdWU6cC5yZXBsYWNlKC9ccyohaW1wb3J0YW50LywiIiksaW1wb3J0YW50OiEwfTp7cHJvcDpmLHZhbHVlOnAsaW1wb3J0YW50OiExfX12YXIgaWs9InZpZXciLG9rPVsiY2xpY2siLCJsb25ncHJlc3MiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJwYW5zdGFydCIsInBhbm1vdmUiLCJwYW5lbmQiLCJob3Jpem9udGFscGFuIiwidmVydGljYWxwYW4iLCJzd2lwZSJdO2Z1bmN0aW9uIHdmKGYscyl7bGV0IHA9cnMoZik7cC5ub2RlTWFwW3Mubm9kZUlkXT1zfXZhciBDZjtmdW5jdGlvbiB0dihmKXtDZnx8KENmPWYpfXZhciBaaT1jbGFzcyBleHRlbmRzIGxse2NvbnN0cnVjdG9yKHM9aWsscD17fSx3KXtzdXBlcigpO2xldCBOPVpwKHMpO2lmKE4mJiF3KXJldHVybiBuZXcgTihzLHAsITApO3RoaXMubm9kZVR5cGU9MSx0aGlzLnR5cGU9cyx0aGlzLmF0dHI9cC5hdHRyfHx7fSx0aGlzLnN0eWxlPXAuc3R5bGV8fHt9LHRoaXMuY2xhc3NTdHlsZT1wLmNsYXNzU3R5bGV8fHt9LHRoaXMuY2xhc3NMaXN0PXAuY2xhc3NMaXN0fHxbXSx0aGlzLnN0eWxlU2hlZXQ9cC5zdHlsZVNoZWV0fHx7fSx0aGlzLmV2ZW50PXt9fWFwcGVuZENoaWxkKHMpe2lmKCEocy5wYXJlbnROb2RlJiZzLnBhcmVudE5vZGUhPT10aGlzKSl7aWYocy5wYXJlbnROb2RlKXtpZihRbigiZGVidWciKSYmVmkoYFthcHBlbmRDaGlsZF0oJHt0aGlzLmRvY0lkfSwke3MudHlwZX0sJHtzLnJlZn0pIE1vdmUgPCR7cy50eXBlfT4gdG8gJHt0aGlzLmNoaWxkcmVuLmxlbmd0aH0gb2YgPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSxzbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLHMubm9kZVR5cGU9PT0xKXtsZXQgcD1zbChzLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksdz1Ecih0aGlzLmRvY0lkKTtpZih3JiZwPj0wKXJldHVybiB3LnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbcy5yZWYsdGhpcy5yZWYscF0pfX1lbHNlIGlmKFFuKCJkZWJ1ZyIpJiZWaShgW2FwcGVuZENoaWxkXSgke3RoaXMuZG9jSWR9LCR7cy50eXBlfSwke3MucmVmfSkgQXBwZW5kIDwke3MudHlwZX0+IHRvIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksb2wocyx0aGlzKSxhbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLHRoaXMuZG9jSWQmJndmKHRoaXMuZG9jSWQscykscy5ub2RlVHlwZT09PTEpe2FsKHMsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKTtsZXQgcD1Ecih0aGlzLmRvY0lkKTtpZihwKXJldHVybiBwLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixzLnRvSlNPTigpLC0xXSl9fX1pbnNlcnRCZWZvcmUocyxwKXtpZighKHMucGFyZW50Tm9kZSYmcy5wYXJlbnROb2RlIT09dGhpcykmJiEocz09PXB8fHMubmV4dFNpYmxpbmcmJnMubmV4dFNpYmxpbmc9PT1wKSl7aWYocy5wYXJlbnROb2RlKXtpZihzbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHApLCEwKSxzLm5vZGVUeXBlPT09MSl7bGV0IHc9dmYocCksTj1zbChzLHRoaXMucHVyZUNoaWxkcmVuLHc/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZih3KTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpLEU9RHIodGhpcy5kb2NJZCk7aWYoRSYmTj49MClyZXR1cm4gRS5zZW5kKCJkb20iLHthY3Rpb246Im1vdmVFbGVtZW50In0sW3MucmVmLHRoaXMucmVmLE5dKX19ZWxzZSBpZihRbigiZGVidWciKSYmVmkoYFtpbnNlcnRCZWZvcmVdKCR7dGhpcy5kb2NJZH0sJHtzLnR5cGV9LCR7cy5yZWZ9KSBJbnNlcnQgPCR7cy50eXBlfT4gdG8gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KSwgYmVmb3JlICgke3AucmVmfSkuYCksb2wocyx0aGlzKSxhbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHApLCEwKSx0aGlzLmRvY0lkJiZ3Zih0aGlzLmRvY0lkLHMpLHMubm9kZVR5cGU9PT0xKXtsZXQgdz12ZihwKSxOPWFsKHMsdGhpcy5wdXJlQ2hpbGRyZW4sdz90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKHcpOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksRT1Ecih0aGlzLmRvY0lkKTtpZihFKXJldHVybiBFLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixzLnRvSlNPTigpLE5dKX19fWluc2VydEFmdGVyKHMscCl7aWYoIShzLnBhcmVudE5vZGUmJnMucGFyZW50Tm9kZSE9PXRoaXMpJiYhKHM9PT1wfHxzLnByZXZpb3VzU2libGluZyYmcy5wcmV2aW91c1NpYmxpbmc9PT1wKSl7aWYocy5wYXJlbnROb2RlKXtpZihzbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHApKzEsITApLHMubm9kZVR5cGU9PT0xKXtsZXQgdz1zbChzLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YobWYocCkpKzEpLE49RHIodGhpcy5kb2NJZCk7aWYoTiYmdz49MClyZXR1cm4gTi5zZW5kKCJkb20iLHthY3Rpb246Im1vdmVFbGVtZW50In0sW3MucmVmLHRoaXMucmVmLHddKX19ZWxzZSBpZihRbigiZGVidWciKSYmVmkoYFtpbnNlcnRBZnRlcl0oJHt0aGlzLmRvY0lkfSwke3MudHlwZX0sJHtzLnJlZn0pIEluc2VydCA8JHtzLnR5cGV9PiB0byA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLCBhZnRlciAoJHtwLnJlZn0pLmApLG9sKHMsdGhpcyksYWwocyx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZihwKSsxLCEwKSx0aGlzLmRvY0lkJiZ3Zih0aGlzLmRvY0lkLHMpLHMubm9kZVR5cGU9PT0xKXtsZXQgdz1hbChzLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YobWYocCkpKzEpLE49RHIodGhpcy5kb2NJZCk7aWYoTilyZXR1cm4gTi5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYscy50b0pTT04oKSx3XSl9fX1yZW1vdmVDaGlsZChzLHApe2lmKHMucGFyZW50Tm9kZSYmKF9mKHMsdGhpcy5jaGlsZHJlbiwhMCkscy5ub2RlVHlwZT09PTEpKXtRbigiZGVidWciKSYmVmkoYFtyZW1vdmVDaGlsZF0oJHt0aGlzLmRvY0lkfSwke3MudHlwZX0sJHtzLnJlZn0pIFJlbW92ZSA8JHtzLnR5cGV9PiBmcm9tIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksX2Yocyx0aGlzLnB1cmVDaGlsZHJlbik7bGV0IHc9RHIodGhpcy5kb2NJZCk7dyYmdy5zZW5kKCJkb20iLHthY3Rpb246InJlbW92ZUVsZW1lbnQifSxbcy5yZWZdKX1wfHxzLmRlc3Ryb3koKX1jbGVhcigpe2xldCBzPURyKHRoaXMuZG9jSWQpO3MmJnRoaXMucHVyZUNoaWxkcmVuLmZvckVhY2gocD0+e3Muc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFbGVtZW50In0sW3AucmVmXSl9KSx0aGlzLmNoaWxkcmVuLmZvckVhY2gocD0+e3AuZGVzdHJveSgpfSksdGhpcy5jaGlsZHJlbi5sZW5ndGg9MCx0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGg9MH1zZXRBdHRyKHMscCx3KXtpZih0aGlzLmF0dHJbc109PT1wJiZ3IT09ITEpcmV0dXJuO3RoaXMuYXR0cltzXT1wO2xldCBOPURyKHRoaXMuZG9jSWQpOyF3JiZOJiZOLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlQXR0cnMifSxbdGhpcy5yZWYse1tzXTpwfV0pfXNldEF0dHJzKHMscCl7aWYocGMocykpcmV0dXJuO2xldCB3PXt9O2ZvcihsZXQgTiBpbiBzKXRoaXMuYXR0cltOXSE9PXNbTl0mJih0aGlzLmF0dHJbTl09c1tOXSx3W05dPXNbTl0pO2lmKCFwYyh3KSl7bGV0IE49RHIodGhpcy5kb2NJZCk7IXAmJk4mJk4uc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZix3XSl9fXNldFN0eWxlKHMscCx3KXtTZihzLHApLmZvckVhY2goKHtwcm9wOk4sdmFsdWU6RX0pPT57aWYodGhpcy5zdHlsZVtOXT09PUUmJnchPT0hMSlyZXR1cm47dGhpcy5zdHlsZVtOXT1FO2xldCBoPURyKHRoaXMuZG9jSWQpOyF3JiZoJiZoLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbdGhpcy5yZWYse1tOXTpFPT09IiImJk4gaW4gdGhpcy5jbGFzc1N0eWxlP3RoaXMuY2xhc3NTdHlsZVtOXTpFfV0pfSl9c2V0U3R5bGVzKHMscCl7aWYocGMocykpcmV0dXJuO2xldCB3PXt9O2ZvcihsZXQgTiBpbiBzKVNmKE4sc1tOXSkuZm9yRWFjaCgoe3Byb3A6RSx2YWx1ZTpofSk9Pnt0aGlzLnN0eWxlW0VdIT09aCYmKHRoaXMuc3R5bGVbRV09aCx3W0VdPWg9PT0iIiYmRSBpbiB0aGlzLmNsYXNzU3R5bGU/dGhpcy5jbGFzc1N0eWxlW0VdOmgpfSk7aWYoIXBjKHcpKXtsZXQgTj1Ecih0aGlzLmRvY0lkKTshcCYmTiYmTi5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLHddKX19c2V0Q2xhc3NTdHlsZShzKXtmb3IobGV0IHcgaW4gdGhpcy5jbGFzc1N0eWxlKXRoaXMuY2xhc3NTdHlsZVt3XT0iIjtGaSh0aGlzLmNsYXNzU3R5bGUscyk7bGV0IHA9RHIodGhpcy5kb2NJZCk7cCYmcC5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLHRoaXMudG9TdHlsZSgpXSl9c2V0Q2xhc3NMaXN0KHMpe3MubGVuZ3RoPT09dGhpcy5jbGFzc0xpc3QubGVuZ3RoJiZzLmZpbHRlcihwPT4hdGhpcy5jbGFzc0xpc3QuaW5jbHVkZXMocCkpLmxlbmd0aD09PTB8fCh0aGlzLmNsYXNzTGlzdD1zLHRoaXMucGFyZW50Tm9kZSYmdGhpcy5jYWxjQ2xhc3NMaXN0KCkpfWNhbGNDbGFzc0xpc3QoKXt0aGlzLnNldENsYXNzU3R5bGUoQ2YodGhpcykpfXNldFN0eWxlU2hlZXQocyl7dGhpcy5zdHlsZVNoZWV0PXN9YWRkRXZlbnQocyxwLHcpe2lmKHRoaXMuZXZlbnR8fCh0aGlzLmV2ZW50PXt9KSwhdGhpcy5ldmVudFtzXSl7UW4oImRlYnVnIikmJlZpKGBbYWRkRXZlbnRdKCR7dGhpcy5kb2NJZH0sJHt0aGlzLnR5cGV9LCR7dGhpcy5yZWZ9KSBBZGQgIiR7c30iIGV2ZW50IG9uIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksdGhpcy5ldmVudFtzXT17aGFuZGxlcjpwLHBhcmFtczp3fTtsZXQgTj1Ecih0aGlzLmRvY0lkKTtOJiZOLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRXZlbnQifSxbdGhpcy5yZWYsc10pfX1yZW1vdmVFdmVudChzKXtpZih0aGlzLmV2ZW50JiZ0aGlzLmV2ZW50W3NdKXtRbigiZGVidWciKSYmVmkoYFtyZW1vdmVFdmVudF0oJHt0aGlzLmRvY0lkfSwke3RoaXMudHlwZX0sJHt0aGlzLnJlZn0pIFJlbW92ZSAiJHtzfSIgZXZlbnQgb24gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSxkZWxldGUgdGhpcy5ldmVudFtzXTtsZXQgcD1Ecih0aGlzLmRvY0lkKTtwJiZwLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRXZlbnQifSxbdGhpcy5yZWYsc10pfX1maXJlRXZlbnQocyxwLHcsTil7bGV0IEU9bnVsbCxoPSExLHk9dGhpcy5ldmVudFtzXTtpZih5JiZwKXtRbigiZGVidWciKSYmVmkoYFtmaXJlRXZlbnRdKCR7dGhpcy5kb2NJZH0sJHt0aGlzLnR5cGV9LCR7dGhpcy5yZWZ9KSBGaXJlICIke3N9IiBldmVudCBvbiA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApO2xldCBSPXkuaGFuZGxlcjtwLnN0b3BQcm9wYWdhdGlvbj0oKT0+e2g9ITB9LHAucHJldmVudERlZmF1bHQ9KCk9Pnt9O3RyeXtOJiZOLnBhcmFtcz9FPVIuY2FsbCh0aGlzLC4uLk4ucGFyYW1zLHApOkU9Ui5jYWxsKHRoaXMscCl9Y2F0Y2goRmUpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBpbnZva2UgdGhlIGV2ZW50IGhhbmRsZXIgb2YgIiR7c30iIG9uICR7dGhpcy50eXBlfSAoJHt0aGlzLnJlZn0pOgogJHtGZS50b1N0cmluZygpfWApLEZlfX1yZXR1cm4haCYmdyYmb2suaW5kZXhPZihzKSE9PS0xJiZ0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQmJihwLmN1cnJlbnRUYXJnZXQ9dGhpcy5wYXJlbnROb2RlLHRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQocyxwLHcpKSxFfXRvU3R5bGUoKXtsZXQgcz1PYmplY3QuYXNzaWduKHt9LHRoaXMuY2xhc3NTdHlsZSkscD10aGlzLnN0eWxlO2ZvcihsZXQgdyBpbiBwKXtsZXQgTj1wW3ddO3Nbd109Tj09PSIiJiZ3IGluIHRoaXMuY2xhc3NTdHlsZT90aGlzLmNsYXNzU3R5bGVbd106Tn1yZXR1cm4gc310b0pTT04ocz0hMSl7bGV0IHA9e3JlZjp0aGlzLnJlZi50b1N0cmluZygpLHR5cGU6dGhpcy50eXBlLGF0dHI6dGhpcy5hdHRyLHN0eWxlOnRoaXMudG9TdHlsZSgpfSx3PVtdO2ZvcihsZXQgTiBpbiB0aGlzLmV2ZW50KXtsZXR7cGFyYW1zOkV9PXRoaXMuZXZlbnRbTl07RT93LnB1c2goe3R5cGU6TixwYXJhbXM6RX0pOncucHVzaChOKX1yZXR1cm4gdy5sZW5ndGgmJihwLmV2ZW50PXcpLCFzJiZ0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgmJihwLmNoaWxkcmVuPXRoaXMucHVyZUNoaWxkcmVuLm1hcChOPT5OLnRvSlNPTigpKSkscH10b1N0cmluZygpe3JldHVybiI8Iit0aGlzLnR5cGUrIiBhdHRyPSIrSlNPTi5zdHJpbmdpZnkodGhpcy5hdHRyKSsiIHN0eWxlPSIrSlNPTi5zdHJpbmdpZnkodGhpcy50b1N0eWxlKCkpKyI+Iit0aGlzLnB1cmVDaGlsZHJlbi5tYXAocz0+cy50b1N0cmluZygpKS5qb2luKCIiKSsiPC8iK3RoaXMudHlwZSsiPiJ9fTtmdW5jdGlvbiBudihmKXtsZXQgcz1mJiZmLl9fdl9yYXc7cmV0dXJuIHM/bnYocyk6Zn1mdW5jdGlvbiBydihmKXtsZXQgcz1nYyhmKTtzd2l0Y2gocyl7Y2FzZSJVbmRlZmluZWQiOmNhc2UiTnVsbCI6cmV0dXJuIiI7Y2FzZSJSZWdFeHAiOnJldHVybiBmLnRvU3RyaW5nKCk7Y2FzZSJEYXRlIjpyZXR1cm4gZi50b0lTT1N0cmluZygpO2Nhc2UiTnVtYmVyIjpjYXNlIlN0cmluZyI6Y2FzZSJCb29sZWFuIjpjYXNlIkFycmF5IjpjYXNlIk9iamVjdCI6cmV0dXJuIG52KGYpO2Nhc2UiQXJyYXlCdWZmZXIiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOnMsYmFzZTY0OmhmKGYpfTtjYXNlIkludDhBcnJheSI6Y2FzZSJVaW50OEFycmF5IjpjYXNlIlVpbnQ4Q2xhbXBlZEFycmF5IjpjYXNlIkludDE2QXJyYXkiOmNhc2UiVWludDE2QXJyYXkiOmNhc2UiSW50MzJBcnJheSI6Y2FzZSJVaW50MzJBcnJheSI6Y2FzZSJGbG9hdDMyQXJyYXkiOmNhc2UiRmxvYXQ2NEFycmF5IjpyZXR1cm57IkB0eXBlIjoiYmluYXJ5IixkYXRhVHlwZTpzLGJhc2U2NDpoZihmLmJ1ZmZlcil9O2RlZmF1bHQ6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGYpfX12YXIgbHU9ZnVuY3Rpb24oKXt9LFZsPWNsYXNze2NvbnN0cnVjdG9yKHMscCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImluc3RhbmNlSWQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOlN0cmluZyhzKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjYWxsYmFja01hbmFnZXIiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOm5ldyBhdShzKX0pLGx1PXB8fGZ1bmN0aW9uKCl7fX1jYWxsYmFjayhzLHAsdyl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNvbnN1bWUocyxwLHcpfXJlZ2lzdGVySG9vayhzLHAsdyxOKXtyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIucmVnaXN0ZXJIb29rKHMscCx3LE4pfXRyaWdnZXJIb29rKHMscCx3LE4pe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci50cmlnZ2VySG9vayhzLHAsdyxOKX11cGRhdGVEYXRhKHMscCx3KXt0aGlzLnNlbmQoIm1vZHVsZSIse21vZHVsZToiZG9tIixtZXRob2Q6InVwZGF0ZUNvbXBvbmVudERhdGEifSxbcyxwLHddKX1kZXN0cm95Q2FsbGJhY2soKXtyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuY2xvc2UoKX1ub3JtYWxpemUocyxwPSExKXtsZXQgdz1nYyhzKTtpZihzJiZzIGluc3RhbmNlb2YgWmkpcmV0dXJuIHMucmVmO2lmKHMmJnMuJGVsIGluc3RhbmNlb2YgWmkpcmV0dXJuIHMuJGVsLnJlZjtpZih3PT09IkZ1bmN0aW9uIilyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuYWRkKHMpLnRvU3RyaW5nKCk7aWYocCl7aWYodz09PSJPYmplY3QiKXtsZXQgTj17fTtmb3IobGV0IEUgaW4gcylOW0VdPXRoaXMubm9ybWFsaXplKHNbRV0sITApO3JldHVybiBOfWlmKHc9PT0iQXJyYXkiKXJldHVybiBzLm1hcChOPT50aGlzLm5vcm1hbGl6ZShOLCEwKSl9cmV0dXJuIHMmJnMucmVmJiZzWyJbW1ZpcnR1YWxFbGVtZW50XV0iXT9zLnJlZjpydihzKX1zZW5kKHMscCx3LE4pe2xldHthY3Rpb246RSxjb21wb25lbnQ6aCxyZWY6eSxtb2R1bGU6UixtZXRob2Q6RmV9PXA7c3dpdGNoKHc9dy5tYXAoSXQ9PnRoaXMubm9ybWFsaXplKEl0LHMhPT0ibW9kdWxlIikpLGdjKE4pPT09Ik9iamVjdCImJihOPXRoaXMubm9ybWFsaXplKE4sITApKSxzKXtjYXNlImRvbSI6cmV0dXJuIFFuKCJkZWJ1ZyIpJiZWaShgW3Rhc2tdKCR7dGhpcy5pbnN0YW5jZUlkfSwke3N9LCR7RX0pICR7SlNPTi5zdHJpbmdpZnkodyl9YCksdGhpc1tFXSh0aGlzLmluc3RhbmNlSWQsdyk7Y2FzZSJjb21wb25lbnQiOnJldHVybiB0aGlzLmNvbXBvbmVudEhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLHksRmUsdyxGaSh7Y29tcG9uZW50Omh9LE4pKTtkZWZhdWx0OnJldHVybiBRbigiZGVidWciKSYmVmkoYFt0YXNrXSgke3RoaXMuaW5zdGFuY2VJZH0sJHtSfSwke0ZlfSkgJHtKU09OLnN0cmluZ2lmeSh3KX1gKSx0aGlzLm1vZHVsZUhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLFIsRmUsdyxOKX19Y2FsbERPTShzLHApe3JldHVybiB0aGlzW3NdKHRoaXMuaW5zdGFuY2VJZCxwKX1jYWxsQ29tcG9uZW50KHMscCx3LE4pe3JldHVybiB0aGlzLmNvbXBvbmVudEhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLHMscCx3LE4pfWNhbGxNb2R1bGUocyxwLHcsTil7cmV0dXJuIHRoaXMubW9kdWxlSGFuZGxlcih0aGlzLmluc3RhbmNlSWQscyxwLHcsTil9fTtmdW5jdGlvbiBpdigpe2xldCBmPXtjcmVhdGVGaW5pc2g6Z2xvYmFsLmNhbGxDcmVhdGVGaW5pc2gsdXBkYXRlRmluaXNoOmdsb2JhbC5jYWxsVXBkYXRlRmluaXNoLHJlZnJlc2hGaW5pc2g6Z2xvYmFsLmNhbGxSZWZyZXNoRmluaXNoLGNyZWF0ZUJvZHk6Z2xvYmFsLmNhbGxDcmVhdGVCb2R5LGFkZEVsZW1lbnQ6Z2xvYmFsLmNhbGxBZGRFbGVtZW50LHJlbW92ZUVsZW1lbnQ6Z2xvYmFsLmNhbGxSZW1vdmVFbGVtZW50LG1vdmVFbGVtZW50Omdsb2JhbC5jYWxsTW92ZUVsZW1lbnQsdXBkYXRlQXR0cnM6Z2xvYmFsLmNhbGxVcGRhdGVBdHRycyx1cGRhdGVTdHlsZTpnbG9iYWwuY2FsbFVwZGF0ZVN0eWxlLGFkZEV2ZW50Omdsb2JhbC5jYWxsQWRkRXZlbnQscmVtb3ZlRXZlbnQ6Z2xvYmFsLmNhbGxSZW1vdmVFdmVudCxfX3VwZGF0ZUNvbXBvbmVudERhdGE6Z2xvYmFsLl9fdXBkYXRlQ29tcG9uZW50RGF0YX0scz1WbC5wcm90b3R5cGU7Zm9yKGxldCBwIGluIGYpe2xldCB3PWZbcF07c1twXT13PyhOLEUpPT53KE4sLi4uRSk6KE4sRSk9Pmx1KE4sW3ttb2R1bGU6ImRvbSIsbWV0aG9kOnAsYXJnczpFfV0sIi0xIil9cy5jb21wb25lbnRIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlQ29tcG9uZW50fHwoKHAsdyxOLEUsaCk9Pmx1KHAsW3tjb21wb25lbnQ6aC5jb21wb25lbnQscmVmOncsbWV0aG9kOk4sYXJnczpFfV0pKSxzLm1vZHVsZUhhbmRsZXI9Z2xvYmFsLmNhbGxOYXRpdmVNb2R1bGV8fCgocCx3LE4sRSk9Pmx1KHAsW3ttb2R1bGU6dyxtZXRob2Q6TixhcmdzOkV9XSkpfWZ1bmN0aW9uIGFrKGYscyxwLHcsTixFKXtsZXQgaD1mLmdldFJlZihzKTtpZihoKXJldHVybiBmLmZpcmVFdmVudChoLHAsdyxOLEUpO2lmKHcpcmV0dXJuIHcuX25vZGVJZD1zLGYuZmlyZUV2ZW50KGYuZ2V0UmVmKCJfZG9jdW1lbnRFbGVtZW50IikscCx3LE4sRSl9ZnVuY3Rpb24gc2soZixzLHAsdyl7cmV0dXJuIGYudGFza0NlbnRlci5jYWxsYmFjayhzLHAsdyl9ZnVuY3Rpb24gbGsoZixzLHAsdyxOKXtpZighZnx8IWYudGFza0NlbnRlcilyZXR1cm4gY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gQ2FuJ3QgZmluZCAiZG9jdW1lbnQiIG9yICJ0YXNrQ2VudGVyIi5gKSxudWxsO2xldCBFPW51bGw7dHJ5e0U9Zi50YXNrQ2VudGVyLnRyaWdnZXJIb29rKHMscCx3LE4pfWNhdGNoKGgpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byB0cmlnZ2VyIHRoZSAiJHtwfUAke3d9IiBob29rIG9uICR7c30uYCksaH1yZXR1cm4gRX1mdW5jdGlvbiBBZihmLHMpe2xldCBwPXJzKGYpO2lmKCFwKXJldHVybiBuZXcgRXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byByZWNlaXZlVGFza3MsIGluc3RhbmNlICgke2Z9KSBpcyBub3QgYXZhaWxhYmxlLmApO2lmKElpKHMpKXJldHVybiBzLm1hcCh3PT57c3dpdGNoKHcubWV0aG9kKXtjYXNlImNhbGxiYWNrIjpyZXR1cm4gc2socCwuLi53LmFyZ3MpO2Nhc2UiZmlyZUV2ZW50U3luYyI6Y2FzZSJmaXJlRXZlbnQiOnJldHVybiBhayhwLC4uLncuYXJncyk7Y2FzZSJjb21wb25lbnRIb29rIjpyZXR1cm4gbGsocCwuLi53LmFyZ3MpfX0pfXZhciBOcz17fTtmdW5jdGlvbiBvdihmPXt9KXtmb3IobGV0IHMgaW4gZilpbChOcyxzKXx8KE5zW3NdPXt9KSwhIUlpKGZbc10pJiZmW3NdLmZvckVhY2gocD0+e2hpKHApP05zW3NdW3BdPSEwOkZsKHApJiZoaShwLm5hbWUpJiYoTnNbc11bcC5uYW1lXT1wLmFyZ3N8fFtdKX0pfWZ1bmN0aW9uIGN1KGYscyl7cmV0dXJuIGhpKHMpPyEhKE5zW2ZdJiZOc1tmXVtzXSk6ISFOc1tmXX1mdW5jdGlvbiBhdihmKXtyZXR1cm4gTnNbZl19dmFyIE9mPXt9O2Z1bmN0aW9uIHN2KGYpeyFJaShmKXx8Zi5mb3JFYWNoKHM9Pnshc3x8KGhpKHMpP09mW3NdPSEwOkZsKHMpJiZoaShzLnR5cGUpJiYoT2Zbcy50eXBlXT1zLGJmKHMudHlwZSxzLm1ldGhvZHMpKSl9KX1mdW5jdGlvbiBUZihmKXtyZXR1cm4hIU9mW2ZdfXZhciBrcz1bXTtmdW5jdGlvbiB1dShmLHMpe1BmKGYpP2NvbnNvbGUud2FybihgU2VydmljZSAiJHtmfSIgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhbHJlYWR5IWApOihzPUZpKHt9LHMpLGtzLnB1c2goe25hbWU6ZixvcHRpb25zOnN9KSl9ZnVuY3Rpb24gZnUoZil7a3Muc29tZSgocyxwKT0+e2lmKHMubmFtZT09PWYpcmV0dXJuIGtzLnNwbGljZShwLDEpLCEwfSl9ZnVuY3Rpb24gUGYoZil7cmV0dXJuIGNrKGYpPj0wfWZ1bmN0aW9uIGNrKGYpe3JldHVybiBrcy5tYXAocz0+cy5uYW1lKS5pbmRleE9mKGYpfWZ1bmN0aW9uIHVrKGYpe3JldHVybiBzPT57bGV0IHA9ZXUoZixzKSx7Y3JlYXRlQXBwOnd9PXA7cC5jcmVhdGVWdWVBcHA9cC5jcmVhdGVBcHA9KE4sRSk9PncoTixFKS51c2UoZmsscykscy5WdWU9cH19dmFyIGZrPXtpbnN0YWxsKGYscyl7ZGsoZixzKSxkYyhzKS5pbml0QXBwKGYpfX07ZnVuY3Rpb24gZGsoZixzKXtsZXR7bW91bnQ6cH09ZjtmLm1vdW50PXc9PntsZXQgTj1wKHcpO3JldHVybiB3PT09IiNhcHAiJiZzLl9fcmVnaXN0ZXJBcHAoTiksTn19ZnVuY3Rpb24gaGsoZil7bGV0e1VuaVNoYXJlZDpzLFZ1ZVNoYXJlZDpwLFZ1ZVJlYWN0aXZpdHk6d309Zjt2YXIgTj1mdW5jdGlvbihFLGgseSxSKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gRmUoaSl7fWZ1bmN0aW9uIEl0KGksbCl7fWZ1bmN0aW9uIFZ0KGksbCxkLF8pe3ZhciBBO3RyeXtBPV8/aSguLi5fKTppKCl9Y2F0Y2goQyl7UChDLGwsZCl9cmV0dXJuIEF9ZnVuY3Rpb24gT3QoaSxsLGQsXyl7aWYoaC5pc0Z1bmN0aW9uKGkpKXt2YXIgQT1WdChpLGwsZCxfKTtyZXR1cm4gQSYmaC5pc1Byb21pc2UoQSkmJkEuY2F0Y2goRD0+e1AoRCxsLGQpfSksQX1mb3IodmFyIEM9W10saz0wO2s8aS5sZW5ndGg7aysrKUMucHVzaChPdChpW2tdLGwsZCxfKSk7cmV0dXJuIEN9ZnVuY3Rpb24gUChpLGwsZCl7aWYobCYmbC52bm9kZSxsKXtmb3IodmFyIF89bC5wYXJlbnQsQT1sLnByb3h5LEM9ZDtfOyl7dmFyIGs9Xy5lYztpZihrKXtmb3IodmFyIEQ9MDtEPGsubGVuZ3RoO0QrKylpZihrW0RdKGksQSxDKT09PSExKXJldHVybn1fPV8ucGFyZW50fXZhciBIPWwuYXBwQ29udGV4dC5jb25maWcuZXJyb3JIYW5kbGVyO2lmKEgpe1Z0KEgsbnVsbCwxMCxbaSxBLENdKTtyZXR1cm59fXd0KGkpfWZ1bmN0aW9uIHd0KGksbCxkKXtjb25zb2xlLmVycm9yKGkpfXZhciBJbj0hMSxvdD0hMSx6PVtdLEo9MCxobj1bXSx1bj1udWxsLHluPTAsSm49e3RoZW4oaSl7c2V0VGltZW91dCgoKT0+aSgpLDApfX0sZ2k9RS5wbGF0Zm9ybT09PSJpT1MiLHBpPWdpP0puOlByb21pc2UucmVzb2x2ZSgpLHFyPW51bGw7ZnVuY3Rpb24gZ3IoaSl7dmFyIGw9cXJ8fHBpO3JldHVybiBpP2wudGhlbih0aGlzP2kuYmluZCh0aGlzKTppKTpsfWZ1bmN0aW9uIFNuKGkpe2Zvcih2YXIgbD1KKzEsZD16Lmxlbmd0aDtsPGQ7KXt2YXIgXz1sK2Q+Pj4xLEE9bnQoeltfXSk7QTxpP2w9XysxOmQ9X31yZXR1cm4gbH1mdW5jdGlvbiBwcihpKXsoIXoubGVuZ3RofHwhei5pbmNsdWRlcyhpLEluJiZpLmFsbG93UmVjdXJzZT9KKzE6SikpJiYoaS5pZD09bnVsbD96LnB1c2goaSk6ei5zcGxpY2UoU24oaS5pZCksMCxpKSxMcigpKX1mdW5jdGlvbiBMcigpeyFJbiYmIW90JiYob3Q9ITAscXI9cGkudGhlbihRdCkpfWZ1bmN0aW9uIEpyKGkpe3ZhciBsPXouaW5kZXhPZihpKTtsPkomJnouc3BsaWNlKGwsMSl9ZnVuY3Rpb24gdmkoaSl7aC5pc0FycmF5KGkpP2huLnB1c2goLi4uaSk6KCF1bnx8IXVuLmluY2x1ZGVzKGksaS5hbGxvd1JlY3Vyc2U/eW4rMTp5bikpJiZobi5wdXNoKGkpLExyKCl9ZnVuY3Rpb24gUG4oaSl7Zm9yKHZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpJbj9KKzE6MDtsPHoubGVuZ3RoO2wrKyl7dmFyIGQ9eltsXTtkJiZkLnByZSYmKHouc3BsaWNlKGwsMSksbC0tLGQoKSl9fWZ1bmN0aW9uIHplKGkpe2lmKGhuLmxlbmd0aCl7dmFyIGw9Wy4uLm5ldyBTZXQoaG4pXTtpZihobi5sZW5ndGg9MCx1bil7dW4ucHVzaCguLi5sKTtyZXR1cm59Zm9yKHVuPWwsdW4uc29ydCgoZCxfKT0+bnQoZCktbnQoXykpLHluPTA7eW48dW4ubGVuZ3RoO3luKyspdW5beW5dKCk7dW49bnVsbCx5bj0wfX12YXIgbnQ9aT0+aS5pZD09bnVsbD8xLzA6aS5pZCxBdD0oaSxsKT0+e3ZhciBkPW50KGkpLW50KGwpO2lmKGQ9PT0wKXtpZihpLnByZSYmIWwucHJlKXJldHVybi0xO2lmKGwucHJlJiYhaS5wcmUpcmV0dXJuIDF9cmV0dXJuIGR9O2Z1bmN0aW9uIFF0KGkpe290PSExLEluPSEwLHouc29ydChBdCk7dmFyIGw9aC5OT09QO3RyeXtmb3IoSj0wO0o8ei5sZW5ndGg7SisrKXt2YXIgZD16W0pdO2QmJmQuYWN0aXZlIT09ITEmJlZ0KGQsbnVsbCwxNCl9fWZpbmFsbHl7Sj0wLHoubGVuZ3RoPTAsemUoKSxJbj0hMSxxcj1udWxsLCh6Lmxlbmd0aHx8aG4ubGVuZ3RoKSYmUXQoKX19RS5kZXZ0b29scz12b2lkIDA7dmFyIFRuPVtdO2Z1bmN0aW9uIHNuKGksbCl7dmFyIGQsXztpZihFLmRldnRvb2xzPWksRS5kZXZ0b29scylFLmRldnRvb2xzLmVuYWJsZWQ9ITAsVG4uZm9yRWFjaChDPT57dmFye2V2ZW50OmssYXJnczpEfT1DO3JldHVybiBFLmRldnRvb2xzLmVtaXQoaywuLi5EKX0pLFRuPVtdO2Vsc2UgaWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5IVE1MRWxlbWVudCYmISgoXz0oZD13aW5kb3cubmF2aWdhdG9yKT09PW51bGx8fGQ9PT12b2lkIDA/dm9pZCAwOmQudXNlckFnZW50KT09PW51bGx8fF89PT12b2lkIDA/dm9pZCAwOl8uaW5jbHVkZXMoImpzZG9tIikpKXt2YXIgQT1sLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX189bC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9ffHxbXTtBLnB1c2goQz0+e3NuKEMsbCl9KSxzZXRUaW1lb3V0KCgpPT57RS5kZXZ0b29sc3x8KGwuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz1udWxsLFRuPVtdKX0sM2UzKX1lbHNlIFRuPVtdfWZ1bmN0aW9uIG9yKGksbCl7aWYoIWkuaXNVbm1vdW50ZWQpe2Zvcih2YXIgZD1pLnZub2RlLnByb3BzfHxoLkVNUFRZX09CSixfPWFyZ3VtZW50cy5sZW5ndGgsQT1uZXcgQXJyYXkoXz4yP18tMjowKSxDPTI7QzxfO0MrKylBW0MtMl09YXJndW1lbnRzW0NdO3ZhciBrPUEsRD1sLnN0YXJ0c1dpdGgoInVwZGF0ZToiKSxIPUQmJmwuc2xpY2UoNyk7aWYoSCYmSCBpbiBkKXt2YXIgbmU9IiIuY29uY2F0KEg9PT0ibW9kZWxWYWx1ZSI/Im1vZGVsIjpILCJNb2RpZmllcnMiKSx7bnVtYmVyOnZlLHRyaW06QmV9PWRbbmVdfHxoLkVNUFRZX09CSjtCZSYmKGs9QS5tYXAodXQ9PmguaXNTdHJpbmcodXQpP3V0LnRyaW0oKTp1dCkpLHZlJiYoaz1BLm1hcChoLmxvb3NlVG9OdW1iZXIpKX12YXIgdWUsa2U9ZFt1ZT1oLnRvSGFuZGxlcktleShsKV18fGRbdWU9aC50b0hhbmRsZXJLZXkoaC5jYW1lbGl6ZShsKSldOyFrZSYmRCYmKGtlPWRbdWU9aC50b0hhbmRsZXJLZXkoaC5oeXBoZW5hdGUobCkpXSksa2UmJk90KGtlLGksNixrKTt2YXIgR2U9ZFt1ZSsiT25jZSJdO2lmKEdlKXtpZighaS5lbWl0dGVkKWkuZW1pdHRlZD17fTtlbHNlIGlmKGkuZW1pdHRlZFt1ZV0pcmV0dXJuO2kuZW1pdHRlZFt1ZV09ITAsT3QoR2UsaSw2LGspfX19ZnVuY3Rpb24gV24oaSxsKXt2YXIgZD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsXz1sLmVtaXRzQ2FjaGUsQT1fLmdldChpKTtpZihBIT09dm9pZCAwKXJldHVybiBBO3ZhciBDPWkuZW1pdHMsaz17fSxEPSExO2lmKCFoLmlzRnVuY3Rpb24oaSkpe3ZhciBIPW5lPT57dmFyIHZlPVduKG5lLGwsITApO3ZlJiYoRD0hMCxoLmV4dGVuZChrLHZlKSl9OyFkJiZsLm1peGlucy5sZW5ndGgmJmwubWl4aW5zLmZvckVhY2goSCksaS5leHRlbmRzJiZIKGkuZXh0ZW5kcyksaS5taXhpbnMmJmkubWl4aW5zLmZvckVhY2goSCl9cmV0dXJuIUMmJiFEPyhoLmlzT2JqZWN0KGkpJiZfLnNldChpLG51bGwpLG51bGwpOihoLmlzQXJyYXkoQyk/Qy5mb3JFYWNoKG5lPT5rW25lXT1udWxsKTpoLmV4dGVuZChrLEMpLGguaXNPYmplY3QoaSkmJl8uc2V0KGksayksayl9ZnVuY3Rpb24gQW4oaSxsKXtyZXR1cm4haXx8IWguaXNPbihsKT8hMToobD1sLnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywiIiksaC5oYXNPd24oaSxsWzBdLnRvTG93ZXJDYXNlKCkrbC5zbGljZSgxKSl8fGguaGFzT3duKGksaC5oeXBoZW5hdGUobCkpfHxoLmhhc093bihpLGwpKX12YXIgZ249bnVsbCx3cj1udWxsO2Z1bmN0aW9uIEtyKGkpe3ZhciBsPWduO3JldHVybiBnbj1pLHdyPWkmJmkudHlwZS5fX3Njb3BlSWR8fG51bGwsbH1mdW5jdGlvbiB3byhpKXt3cj1pfWZ1bmN0aW9uIGRhKCl7d3I9bnVsbH12YXIgVWk9aT0+Wm87ZnVuY3Rpb24gWm8oaSl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOmduO2lmKCFsfHxpLl9uKXJldHVybiBpO3ZhciBkPWZ1bmN0aW9uKCl7ZC5fZCYmeXQoLTEpO3ZhciBfPUtyKGwpLEE7dHJ5e0E9aSguLi5hcmd1bWVudHMpfWZpbmFsbHl7S3IoXyksZC5fZCYmeXQoMSl9cmV0dXJuIEF9O3JldHVybiBkLl9uPSEwLGQuX2M9ITAsZC5fZD0hMCxkfWZ1bmN0aW9uIFhvKCl7fWZ1bmN0aW9uICRpKGkpe3Zhcnt0eXBlOmwsdm5vZGU6ZCxwcm94eTpfLHdpdGhQcm94eTpBLHByb3BzOkMscHJvcHNPcHRpb25zOltrXSxzbG90czpELGF0dHJzOkgsZW1pdDpuZSxyZW5kZXI6dmUscmVuZGVyQ2FjaGU6QmUsZGF0YTp1ZSxzZXR1cFN0YXRlOmtlLGN0eDpHZSxpbmhlcml0QXR0cnM6dXR9PWksUWUsUmUsbWU9S3IoaSk7dHJ5e2lmKGQuc2hhcGVGbGFnJjQpe3ZhciB5ZT1BfHxfO1FlPSRuKHZlLmNhbGwoeWUseWUsQmUsQyxrZSx1ZSxHZSkpLFJlPUh9ZWxzZXt2YXIgTGU9bDtRZT0kbihMZS5sZW5ndGg+MT9MZShDLHthdHRyczpILHNsb3RzOkQsZW1pdDpuZX0pOkxlKEMsbnVsbCkpLFJlPWwucHJvcHM/SDpDbyhIKX19Y2F0Y2goS2Upe2ZlLmxlbmd0aD0wLFAoS2UsaSwxKSxRZT1xdChwZSl9dmFyIE9lPVFlO2lmKFJlJiZ1dCE9PSExKXt2YXIgYnQ9T2JqZWN0LmtleXMoUmUpLHtzaGFwZUZsYWc6Q3R9PU9lO2J0Lmxlbmd0aCYmQ3QmKDF8NikmJihrJiZidC5zb21lKGguaXNNb2RlbExpc3RlbmVyKSYmKFJlPUFvKFJlLGspKSxPZT1laShPZSxSZSkpfXJldHVybiBkLmRpcnMmJihPZT1laShPZSksT2UuZGlycz1PZS5kaXJzP09lLmRpcnMuY29uY2F0KGQuZGlycyk6ZC5kaXJzKSxkLnRyYW5zaXRpb24mJihPZS50cmFuc2l0aW9uPWQudHJhbnNpdGlvbiksUWU9T2UsS3IobWUpLFFlfWZ1bmN0aW9uIHJpKGkpe2Zvcih2YXIgbCxkPTA7ZDxpLmxlbmd0aDtkKyspe3ZhciBfPWlbZF07aWYoR3QoXykpe2lmKF8udHlwZSE9PXBlfHxfLmNoaWxkcmVuPT09InYtaWYiKXtpZihsKXJldHVybjtsPV99fWVsc2UgcmV0dXJufXJldHVybiBsfXZhciBDbz1pPT57dmFyIGw7Zm9yKHZhciBkIGluIGkpKGQ9PT0iY2xhc3MifHxkPT09InN0eWxlInx8aC5pc09uKGQpKSYmKChsfHwobD17fSkpW2RdPWlbZF0pO3JldHVybiBsfSxBbz0oaSxsKT0+e3ZhciBkPXt9O2Zvcih2YXIgXyBpbiBpKSghaC5pc01vZGVsTGlzdGVuZXIoXyl8fCEoXy5zbGljZSg5KWluIGwpKSYmKGRbX109aVtfXSk7cmV0dXJuIGR9O2Z1bmN0aW9uIE9vKGksbCxkKXt2YXJ7cHJvcHM6XyxjaGlsZHJlbjpBLGNvbXBvbmVudDpDfT1pLHtwcm9wczprLGNoaWxkcmVuOkQscGF0Y2hGbGFnOkh9PWwsbmU9Qy5lbWl0c09wdGlvbnM7aWYobC5kaXJzfHxsLnRyYW5zaXRpb24pcmV0dXJuITA7aWYoZCYmSD49MCl7aWYoSCYxMDI0KXJldHVybiEwO2lmKEgmMTYpcmV0dXJuIF8/WGkoXyxrLG5lKTohIWs7aWYoSCY4KWZvcih2YXIgdmU9bC5keW5hbWljUHJvcHMsQmU9MDtCZTx2ZS5sZW5ndGg7QmUrKyl7dmFyIHVlPXZlW0JlXTtpZihrW3VlXSE9PV9bdWVdJiYhQW4obmUsdWUpKXJldHVybiEwfX1lbHNlIHJldHVybihBfHxEKSYmKCFEfHwhRC4kc3RhYmxlKT8hMDpfPT09az8hMTpfP2s/WGkoXyxrLG5lKTohMDohIWs7cmV0dXJuITF9ZnVuY3Rpb24gWGkoaSxsLGQpe3ZhciBfPU9iamVjdC5rZXlzKGwpO2lmKF8ubGVuZ3RoIT09T2JqZWN0LmtleXMoaSkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgQT0wO0E8Xy5sZW5ndGg7QSsrKXt2YXIgQz1fW0FdO2lmKGxbQ10hPT1pW0NdJiYhQW4oZCxDKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBtaShpLGwpe2Zvcih2YXJ7dm5vZGU6ZCxwYXJlbnQ6X309aTtfJiZfLnN1YlRyZWU9PT1kOykoZD1fLnZub2RlKS5lbD1sLF89Xy5wYXJlbnR9dmFyIFRvPWk9PmkuX19pc1N1c3BlbnNlLHVvPXtuYW1lOiJTdXNwZW5zZSIsX19pc1N1c3BlbnNlOiEwLHByb2Nlc3MoaSxsLGQsXyxBLEMsayxELEgsbmUpe2k9PW51bGw/UWkobCxkLF8sQSxDLGssRCxILG5lKTpLbihpLGwsZCxfLEEsayxELEgsbmUpfSxoeWRyYXRlOlBvLGNyZWF0ZTplbyxub3JtYWxpemU6Zm99LGtuPXVvO2Z1bmN0aW9uIENyKGksbCl7dmFyIGQ9aS5wcm9wcyYmaS5wcm9wc1tsXTtoLmlzRnVuY3Rpb24oZCkmJmQoKX1mdW5jdGlvbiBRaShpLGwsZCxfLEEsQyxrLEQsSCl7dmFye3A6bmUsbzp7Y3JlYXRlRWxlbWVudDp2ZX19PUgsQmU9dmUoImRpdiIsbCksdWU9aS5zdXNwZW5zZT1lbyhpLEEsXyxsLEJlLGQsQyxrLEQsSCk7bmUobnVsbCx1ZS5wZW5kaW5nQnJhbmNoPWkuc3NDb250ZW50LEJlLG51bGwsXyx1ZSxDLGspLHVlLmRlcHM+MD8oQ3IoaSwib25QZW5kaW5nIiksQ3IoaSwib25GYWxsYmFjayIpLG5lKG51bGwsaS5zc0ZhbGxiYWNrLGwsZCxfLG51bGwsQyxrKSxrcih1ZSxpLnNzRmFsbGJhY2spKTp1ZS5yZXNvbHZlKCl9ZnVuY3Rpb24gS24oaSxsLGQsXyxBLEMsayxELEgpe3ZhcntwOm5lLHVtOnZlLG86e2NyZWF0ZUVsZW1lbnQ6QmV9fT1ILHVlPWwuc3VzcGVuc2U9aS5zdXNwZW5zZTt1ZS52bm9kZT1sLGwuZWw9aS5lbDt2YXIga2U9bC5zc0NvbnRlbnQsR2U9bC5zc0ZhbGxiYWNrLHthY3RpdmVCcmFuY2g6dXQscGVuZGluZ0JyYW5jaDpRZSxpc0luRmFsbGJhY2s6UmUsaXNIeWRyYXRpbmc6bWV9PXVlO2lmKFFlKXVlLnBlbmRpbmdCcmFuY2g9a2UsZHQoa2UsUWUpPyhuZShRZSxrZSx1ZS5oaWRkZW5Db250YWluZXIsbnVsbCxBLHVlLEMsayxEKSx1ZS5kZXBzPD0wP3VlLnJlc29sdmUoKTpSZSYmKG5lKHV0LEdlLGQsXyxBLG51bGwsQyxrLEQpLGtyKHVlLEdlKSkpOih1ZS5wZW5kaW5nSWQrKyxtZT8odWUuaXNIeWRyYXRpbmc9ITEsdWUuYWN0aXZlQnJhbmNoPVFlKTp2ZShRZSxBLHVlKSx1ZS5kZXBzPTAsdWUuZWZmZWN0cy5sZW5ndGg9MCx1ZS5oaWRkZW5Db250YWluZXI9QmUoImRpdiIsZCksUmU/KG5lKG51bGwsa2UsdWUuaGlkZGVuQ29udGFpbmVyLG51bGwsQSx1ZSxDLGssRCksdWUuZGVwczw9MD91ZS5yZXNvbHZlKCk6KG5lKHV0LEdlLGQsXyxBLG51bGwsQyxrLEQpLGtyKHVlLEdlKSkpOnV0JiZkdChrZSx1dCk/KG5lKHV0LGtlLGQsXyxBLHVlLEMsayxEKSx1ZS5yZXNvbHZlKCEwKSk6KG5lKG51bGwsa2UsdWUuaGlkZGVuQ29udGFpbmVyLG51bGwsQSx1ZSxDLGssRCksdWUuZGVwczw9MCYmdWUucmVzb2x2ZSgpKSk7ZWxzZSBpZih1dCYmZHQoa2UsdXQpKW5lKHV0LGtlLGQsXyxBLHVlLEMsayxEKSxrcih1ZSxrZSk7ZWxzZSBpZihDcihsLCJvblBlbmRpbmciKSx1ZS5wZW5kaW5nQnJhbmNoPWtlLHVlLnBlbmRpbmdJZCsrLG5lKG51bGwsa2UsdWUuaGlkZGVuQ29udGFpbmVyLG51bGwsQSx1ZSxDLGssRCksdWUuZGVwczw9MCl1ZS5yZXNvbHZlKCk7ZWxzZXt2YXJ7dGltZW91dDp5ZSxwZW5kaW5nSWQ6TGV9PXVlO3llPjA/c2V0VGltZW91dCgoKT0+e3VlLnBlbmRpbmdJZD09PUxlJiZ1ZS5mYWxsYmFjayhHZSl9LHllKTp5ZT09PTAmJnVlLmZhbGxiYWNrKEdlKX19ZnVuY3Rpb24gZW8oaSxsLGQsXyxBLEMsayxELEgsbmUpe3ZhciB2ZT1hcmd1bWVudHMubGVuZ3RoPjEwJiZhcmd1bWVudHNbMTBdIT09dm9pZCAwP2FyZ3VtZW50c1sxMF06ITEse3A6QmUsbTp1ZSx1bTprZSxuOkdlLG86e3BhcmVudE5vZGU6dXQscmVtb3ZlOlFlfX09bmUsUmU9aS5wcm9wcz9oLnRvTnVtYmVyKGkucHJvcHMudGltZW91dCk6dm9pZCAwLG1lPXt2bm9kZTppLHBhcmVudDpsLHBhcmVudENvbXBvbmVudDpkLGlzU1ZHOmssY29udGFpbmVyOl8saGlkZGVuQ29udGFpbmVyOkEsYW5jaG9yOkMsZGVwczowLHBlbmRpbmdJZDowLHRpbWVvdXQ6dHlwZW9mIFJlPT0ibnVtYmVyIj9SZTotMSxhY3RpdmVCcmFuY2g6bnVsbCxwZW5kaW5nQnJhbmNoOm51bGwsaXNJbkZhbGxiYWNrOiEwLGlzSHlkcmF0aW5nOnZlLGlzVW5tb3VudGVkOiExLGVmZmVjdHM6W10scmVzb2x2ZSgpe3ZhciB5ZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06ITEse3Zub2RlOkxlLGFjdGl2ZUJyYW5jaDpPZSxwZW5kaW5nQnJhbmNoOmJ0LHBlbmRpbmdJZDpDdCxlZmZlY3RzOktlLHBhcmVudENvbXBvbmVudDpSdCxjb250YWluZXI6TX09bWU7aWYobWUuaXNIeWRyYXRpbmcpbWUuaXNIeWRyYXRpbmc9ITE7ZWxzZSBpZigheWUpe3ZhciBqPU9lJiZidC50cmFuc2l0aW9uJiZidC50cmFuc2l0aW9uLm1vZGU9PT0ib3V0LWluIjtqJiYoT2UudHJhbnNpdGlvbi5hZnRlckxlYXZlPSgpPT57Q3Q9PT1tZS5wZW5kaW5nSWQmJnVlKGJ0LE0sc2UsMCl9KTt2YXJ7YW5jaG9yOnNlfT1tZTtPZSYmKHNlPUdlKE9lKSxrZShPZSxSdCxtZSwhMCkpLGp8fHVlKGJ0LE0sc2UsMCl9a3IobWUsYnQpLG1lLnBlbmRpbmdCcmFuY2g9bnVsbCxtZS5pc0luRmFsbGJhY2s9ITE7Zm9yKHZhciByZT1tZS5wYXJlbnQsb2U9ITE7cmU7KXtpZihyZS5wZW5kaW5nQnJhbmNoKXtyZS5lZmZlY3RzLnB1c2goLi4uS2UpLG9lPSEwO2JyZWFrfXJlPXJlLnBhcmVudH1vZXx8dmkoS2UpLG1lLmVmZmVjdHM9W10sQ3IoTGUsIm9uUmVzb2x2ZSIpfSxmYWxsYmFjayh5ZSl7aWYoISFtZS5wZW5kaW5nQnJhbmNoKXt2YXJ7dm5vZGU6TGUsYWN0aXZlQnJhbmNoOk9lLHBhcmVudENvbXBvbmVudDpidCxjb250YWluZXI6Q3QsaXNTVkc6S2V9PW1lO0NyKExlLCJvbkZhbGxiYWNrIik7dmFyIFJ0PUdlKE9lKSxNPSgpPT57IW1lLmlzSW5GYWxsYmFja3x8KEJlKG51bGwseWUsQ3QsUnQsYnQsbnVsbCxLZSxELEgpLGtyKG1lLHllKSl9LGo9eWUudHJhbnNpdGlvbiYmeWUudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7aiYmKE9lLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZT1NKSxtZS5pc0luRmFsbGJhY2s9ITAsa2UoT2UsYnQsbnVsbCwhMCksanx8TSgpfX0sbW92ZSh5ZSxMZSxPZSl7bWUuYWN0aXZlQnJhbmNoJiZ1ZShtZS5hY3RpdmVCcmFuY2gseWUsTGUsT2UpLG1lLmNvbnRhaW5lcj15ZX0sbmV4dCgpe3JldHVybiBtZS5hY3RpdmVCcmFuY2gmJkdlKG1lLmFjdGl2ZUJyYW5jaCl9LHJlZ2lzdGVyRGVwKHllLExlKXt2YXIgT2U9ISFtZS5wZW5kaW5nQnJhbmNoO09lJiZtZS5kZXBzKys7dmFyIGJ0PXllLnZub2RlLmVsO3llLmFzeW5jRGVwLmNhdGNoKEN0PT57UChDdCx5ZSwwKX0pLnRoZW4oQ3Q9PntpZighKHllLmlzVW5tb3VudGVkfHxtZS5pc1VubW91bnRlZHx8bWUucGVuZGluZ0lkIT09eWUuc3VzcGVuc2VJZCkpe3llLmFzeW5jUmVzb2x2ZWQ9ITA7dmFye3Zub2RlOktlfT15ZTtyYSh5ZSxDdCwhMSksYnQmJihLZS5lbD1idCk7dmFyIFJ0PSFidCYmeWUuc3ViVHJlZS5lbDtMZSh5ZSxLZSx1dChidHx8eWUuc3ViVHJlZS5lbCksYnQ/bnVsbDpHZSh5ZS5zdWJUcmVlKSxtZSxrLEgpLFJ0JiZRZShSdCksbWkoeWUsS2UuZWwpLE9lJiYtLW1lLmRlcHM9PT0wJiZtZS5yZXNvbHZlKCl9fSl9LHVubW91bnQoeWUsTGUpe21lLmlzVW5tb3VudGVkPSEwLG1lLmFjdGl2ZUJyYW5jaCYma2UobWUuYWN0aXZlQnJhbmNoLGQseWUsTGUpLG1lLnBlbmRpbmdCcmFuY2gmJmtlKG1lLnBlbmRpbmdCcmFuY2gsZCx5ZSxMZSl9fTtyZXR1cm4gbWV9ZnVuY3Rpb24gUG8oaSxsLGQsXyxBLEMsayxELEgpe3ZhciBuZT1sLnN1c3BlbnNlPWVvKGwsXyxkLGkucGFyZW50Tm9kZSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxudWxsLEEsQyxrLEQsITApLHZlPUgoaSxuZS5wZW5kaW5nQnJhbmNoPWwuc3NDb250ZW50LGQsbmUsQyxrKTtyZXR1cm4gbmUuZGVwcz09PTAmJm5lLnJlc29sdmUoKSx2ZX1mdW5jdGlvbiBmbyhpKXt2YXJ7c2hhcGVGbGFnOmwsY2hpbGRyZW46ZH09aSxfPWwmMzI7aS5zc0NvbnRlbnQ9aWkoXz9kLmRlZmF1bHQ6ZCksaS5zc0ZhbGxiYWNrPV8/aWkoZC5mYWxsYmFjayk6cXQocGUpfWZ1bmN0aW9uIGlpKGkpe3ZhciBsO2lmKGguaXNGdW5jdGlvbihpKSl7dmFyIGQ9SHQmJmkuX2M7ZCYmKGkuX2Q9ITEsY3QoKSksaT1pKCksZCYmKGkuX2Q9ITAsbD1DZSxndCgpKX1pZihoLmlzQXJyYXkoaSkpe3ZhciBfPXJpKGkpO2k9X31yZXR1cm4gaT0kbihpKSxsJiYhaS5keW5hbWljQ2hpbGRyZW4mJihpLmR5bmFtaWNDaGlsZHJlbj1sLmZpbHRlcihBPT5BIT09aSkpLGl9ZnVuY3Rpb24gYXIoaSxsKXtsJiZsLnBlbmRpbmdCcmFuY2g/aC5pc0FycmF5KGkpP2wuZWZmZWN0cy5wdXNoKC4uLmkpOmwuZWZmZWN0cy5wdXNoKGkpOnZpKGkpfWZ1bmN0aW9uIGtyKGksbCl7aS5hY3RpdmVCcmFuY2g9bDt2YXJ7dm5vZGU6ZCxwYXJlbnRDb21wb25lbnQ6X309aSxBPWQuZWw9bC5lbDtfJiZfLnN1YlRyZWU9PT1kJiYoXy52bm9kZS5lbD1BLG1pKF8sQSkpfWZ1bmN0aW9uIE5uKGksbCl7aWYoX24pe3ZhciBkPV9uLnByb3ZpZGVzLF89X24ucGFyZW50JiZfbi5wYXJlbnQucHJvdmlkZXM7Xz09PWQmJihkPV9uLnByb3ZpZGVzPU9iamVjdC5jcmVhdGUoXykpLGRbaV09bCxfbi50eXBlLm1wVHlwZT09PSJhcHAiJiZfbi5hcHBDb250ZXh0LmFwcC5wcm92aWRlKGksbCl9fWZ1bmN0aW9uIFpuKGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLF89X258fGduO2lmKF8pe3ZhciBBPV8ucGFyZW50PT1udWxsP18udm5vZGUuYXBwQ29udGV4dCYmXy52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOl8ucGFyZW50LnByb3ZpZGVzO2lmKEEmJmkgaW4gQSlyZXR1cm4gQVtpXTtpZihhcmd1bWVudHMubGVuZ3RoPjEpcmV0dXJuIGQmJmguaXNGdW5jdGlvbihsKT9sLmNhbGwoXy5wcm94eSk6bH19ZnVuY3Rpb24gTmkoaSxsKXtyZXR1cm4ga2koaSxudWxsLGwpfWZ1bmN0aW9uIEhpKGksbCl7cmV0dXJuIGtpKGksbnVsbCx7Zmx1c2g6InBvc3QifSl9ZnVuY3Rpb24gb2koaSxsKXtyZXR1cm4ga2koaSxudWxsLHtmbHVzaDoic3luYyJ9KX12YXIgRnI9e307ZnVuY3Rpb24gdnIoaSxsLGQpe3JldHVybiBraShpLGwsZCl9ZnVuY3Rpb24ga2koaSxsKXt2YXJ7aW1tZWRpYXRlOmQsZGVlcDpfLGZsdXNoOkEsb25UcmFjazpDLG9uVHJpZ2dlcjprfT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06aC5FTVBUWV9PQkosRD15LmdldEN1cnJlbnRTY29wZSgpPT09KF9uPT1udWxsP3ZvaWQgMDpfbi5zY29wZSk/X246bnVsbCxILG5lPSExLHZlPSExO2lmKHkuaXNSZWYoaSk/KEg9KCk9PmkudmFsdWUsbmU9eS5pc1NoYWxsb3coaSkpOnkuaXNSZWFjdGl2ZShpKT8oSD0oKT0+aSxfPSEwKTpoLmlzQXJyYXkoaSk/KHZlPSEwLG5lPWkuc29tZShPZT0+eS5pc1JlYWN0aXZlKE9lKXx8eS5pc1NoYWxsb3coT2UpKSxIPSgpPT5pLm1hcChPZT0+e2lmKHkuaXNSZWYoT2UpKXJldHVybiBPZS52YWx1ZTtpZih5LmlzUmVhY3RpdmUoT2UpKXJldHVybiBacihPZSk7aWYoaC5pc0Z1bmN0aW9uKE9lKSlyZXR1cm4gVnQoT2UsRCwyKX0pKTpoLmlzRnVuY3Rpb24oaSk/bD9IPSgpPT5WdChpLEQsMik6SD0oKT0+e2lmKCEoRCYmRC5pc1VubW91bnRlZCkpcmV0dXJuIHVlJiZ1ZSgpLE90KGksRCwzLFtrZV0pfTpIPWguTk9PUCxsJiZfKXt2YXIgQmU9SDtIPSgpPT5acihCZSgpKX12YXIgdWUsa2U9T2U9Pnt1ZT15ZS5vblN0b3A9KCk9PntWdChPZSxELDQpfX0sR2U7aWYoRS5pc0luU1NSQ29tcG9uZW50U2V0dXApaWYoa2U9aC5OT09QLGw/ZCYmT3QobCxELDMsW0goKSx2ZT9bXTp2b2lkIDAsa2VdKTpIKCksQT09PSJzeW5jIil7dmFyIHV0PU5hKCk7R2U9dXQuX193YXRjaGVySGFuZGxlc3x8KHV0Ll9fd2F0Y2hlckhhbmRsZXM9W10pfWVsc2UgcmV0dXJuIGguTk9PUDt2YXIgUWU9dmU/bmV3IEFycmF5KGkubGVuZ3RoKS5maWxsKEZyKTpGcixSZT0oKT0+e2lmKCEheWUuYWN0aXZlKWlmKGwpe3ZhciBPZT15ZS5ydW4oKTsoX3x8bmV8fCh2ZT9PZS5zb21lKChidCxDdCk9PmguaGFzQ2hhbmdlZChidCxRZVtDdF0pKTpoLmhhc0NoYW5nZWQoT2UsUWUpKSkmJih1ZSYmdWUoKSxPdChsLEQsMyxbT2UsUWU9PT1Gcj92b2lkIDA6dmUmJlFlWzBdPT09RnI/W106UWUsa2VdKSxRZT1PZSl9ZWxzZSB5ZS5ydW4oKX07UmUuYWxsb3dSZWN1cnNlPSEhbDt2YXIgbWU7QT09PSJzeW5jIj9tZT1SZTpBPT09InBvc3QiP21lPSgpPT5scihSZSxEJiZELnN1c3BlbnNlKTooUmUucHJlPSEwLEQmJihSZS5pZD1ELnVpZCksbWU9KCk9PnByKFJlKSk7dmFyIHllPW5ldyB5LlJlYWN0aXZlRWZmZWN0KEgsbWUpO2w/ZD9SZSgpOlFlPXllLnJ1bigpOkE9PT0icG9zdCI/bHIoeWUucnVuLmJpbmQoeWUpLEQmJkQuc3VzcGVuc2UpOnllLnJ1bigpO3ZhciBMZT0oKT0+e3llLnN0b3AoKSxEJiZELnNjb3BlJiZoLnJlbW92ZShELnNjb3BlLmVmZmVjdHMseWUpfTtyZXR1cm4gR2UmJkdlLnB1c2goTGUpLExlfWZ1bmN0aW9uIElvKGksbCxkKXt2YXIgXz10aGlzLnByb3h5LEE9aC5pc1N0cmluZyhpKT9pLmluY2x1ZGVzKCIuIik/VnIoXyxpKTooKT0+X1tpXTppLmJpbmQoXyxfKSxDO2guaXNGdW5jdGlvbihsKT9DPWw6KEM9bC5oYW5kbGVyLGQ9bCk7dmFyIGs9X247cW4odGhpcyk7dmFyIEQ9a2koQSxDLmJpbmQoXyksZCk7cmV0dXJuIGs/cW4oayk6QWkoKSxEfWZ1bmN0aW9uIFZyKGksbCl7dmFyIGQ9bC5zcGxpdCgiLiIpO3JldHVybigpPT57Zm9yKHZhciBfPWksQT0wO0E8ZC5sZW5ndGgmJl87QSsrKV89X1tkW0FdXTtyZXR1cm4gX319ZnVuY3Rpb24gWnIoaSxsKXtpZighaC5pc09iamVjdChpKXx8aS5fX3Zfc2tpcHx8KGw9bHx8bmV3IFNldCxsLmhhcyhpKSkpcmV0dXJuIGk7aWYobC5hZGQoaSkseS5pc1JlZihpKSlacihpLnZhbHVlLGwpO2Vsc2UgaWYoaC5pc0FycmF5KGkpKWZvcih2YXIgZD0wO2Q8aS5sZW5ndGg7ZCsrKVpyKGlbZF0sbCk7ZWxzZSBpZihoLmlzU2V0KGkpfHxoLmlzTWFwKGkpKWkuZm9yRWFjaChBPT57WnIoQSxsKX0pO2Vsc2UgaWYoaC5pc1BsYWluT2JqZWN0KGkpKWZvcih2YXIgXyBpbiBpKVpyKGlbX10sbCk7cmV0dXJuIGl9ZnVuY3Rpb24gQXIoKXt2YXIgaT17aXNNb3VudGVkOiExLGlzTGVhdmluZzohMSxpc1VubW91bnRpbmc6ITEsbGVhdmluZ1ZOb2RlczpuZXcgTWFwfTtyZXR1cm4gdHIoKCk9PntpLmlzTW91bnRlZD0hMH0pLGNyKCgpPT57aS5pc1VubW91bnRpbmc9ITB9KSxpfXZhciBwbj1bRnVuY3Rpb24sQXJyYXldLFhyPXttb2RlOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixwZXJzaXN0ZWQ6Qm9vbGVhbixvbkJlZm9yZUVudGVyOnBuLG9uRW50ZXI6cG4sb25BZnRlckVudGVyOnBuLG9uRW50ZXJDYW5jZWxsZWQ6cG4sb25CZWZvcmVMZWF2ZTpwbixvbkxlYXZlOnBuLG9uQWZ0ZXJMZWF2ZTpwbixvbkxlYXZlQ2FuY2VsbGVkOnBuLG9uQmVmb3JlQXBwZWFyOnBuLG9uQXBwZWFyOnBuLG9uQWZ0ZXJBcHBlYXI6cG4sb25BcHBlYXJDYW5jZWxsZWQ6cG59LFVyPXtuYW1lOiJCYXNlVHJhbnNpdGlvbiIscHJvcHM6WHIsc2V0dXAoaSxsKXt2YXJ7c2xvdHM6ZH09bCxfPWpuKCksQT1BcigpLEM7cmV0dXJuKCk9Pnt2YXIgaz1kLmRlZmF1bHQmJlJpKGQuZGVmYXVsdCgpLCEwKTtpZighKCFrfHwhay5sZW5ndGgpKXt2YXIgRD1rWzBdO2lmKGsubGVuZ3RoPjEpe2Zvcih2YXIgSCBvZiBrKWlmKEgudHlwZSE9PXBlKXtEPUg7YnJlYWt9fXZhciBuZT15LnRvUmF3KGkpLHttb2RlOnZlfT1uZTtpZihBLmlzTGVhdmluZylyZXR1cm4gYmkoRCk7dmFyIEJlPXlpKEQpO2lmKCFCZSlyZXR1cm4gYmkoRCk7dmFyIHVlPV9pKEJlLG5lLEEsXyk7T3IoQmUsdWUpO3ZhciBrZT1fLnN1YlRyZWUsR2U9a2UmJnlpKGtlKSx1dD0hMSx7Z2V0VHJhbnNpdGlvbktleTpRZX09QmUudHlwZTtpZihRZSl7dmFyIFJlPVFlKCk7Qz09PXZvaWQgMD9DPVJlOlJlIT09QyYmKEM9UmUsdXQ9ITApfWlmKEdlJiZHZS50eXBlIT09cGUmJighZHQoQmUsR2UpfHx1dCkpe3ZhciBtZT1faShHZSxuZSxBLF8pO2lmKE9yKEdlLG1lKSx2ZT09PSJvdXQtaW4iKXJldHVybiBBLmlzTGVhdmluZz0hMCxtZS5hZnRlckxlYXZlPSgpPT57QS5pc0xlYXZpbmc9ITEsXy51cGRhdGUuYWN0aXZlIT09ITEmJl8udXBkYXRlKCl9LGJpKEQpO3ZlPT09ImluLW91dCImJkJlLnR5cGUhPT1wZSYmKG1lLmRlbGF5TGVhdmU9KHllLExlLE9lKT0+e3ZhciBidD1UZShBLEdlKTtidFtTdHJpbmcoR2Uua2V5KV09R2UseWUuX2xlYXZlQ2I9KCk9PntMZSgpLHllLl9sZWF2ZUNiPXZvaWQgMCxkZWxldGUgdWUuZGVsYXllZExlYXZlfSx1ZS5kZWxheWVkTGVhdmU9T2V9KX1yZXR1cm4gRH19fX0sRHQ9VXI7ZnVuY3Rpb24gVGUoaSxsKXt2YXJ7bGVhdmluZ1ZOb2RlczpkfT1pLF89ZC5nZXQobC50eXBlKTtyZXR1cm4gX3x8KF89T2JqZWN0LmNyZWF0ZShudWxsKSxkLnNldChsLnR5cGUsXykpLF99ZnVuY3Rpb24gX2koaSxsLGQsXyl7dmFye2FwcGVhcjpBLG1vZGU6QyxwZXJzaXN0ZWQ6az0hMSxvbkJlZm9yZUVudGVyOkQsb25FbnRlcjpILG9uQWZ0ZXJFbnRlcjpuZSxvbkVudGVyQ2FuY2VsbGVkOnZlLG9uQmVmb3JlTGVhdmU6QmUsb25MZWF2ZTp1ZSxvbkFmdGVyTGVhdmU6a2Usb25MZWF2ZUNhbmNlbGxlZDpHZSxvbkJlZm9yZUFwcGVhcjp1dCxvbkFwcGVhcjpRZSxvbkFmdGVyQXBwZWFyOlJlLG9uQXBwZWFyQ2FuY2VsbGVkOm1lfT1sLHllPVN0cmluZyhpLmtleSksTGU9VGUoZCxpKSxPZT0oS2UsUnQpPT57S2UmJk90KEtlLF8sOSxSdCl9LGJ0PShLZSxSdCk9Pnt2YXIgTT1SdFsxXTtPZShLZSxSdCksaC5pc0FycmF5KEtlKT9LZS5ldmVyeShqPT5qLmxlbmd0aDw9MSkmJk0oKTpLZS5sZW5ndGg8PTEmJk0oKX0sQ3Q9e21vZGU6QyxwZXJzaXN0ZWQ6ayxiZWZvcmVFbnRlcihLZSl7dmFyIFJ0PUQ7aWYoIWQuaXNNb3VudGVkKWlmKEEpUnQ9dXR8fEQ7ZWxzZSByZXR1cm47S2UuX2xlYXZlQ2ImJktlLl9sZWF2ZUNiKCEwKTt2YXIgTT1MZVt5ZV07TSYmZHQoaSxNKSYmTS5lbC5fbGVhdmVDYiYmTS5lbC5fbGVhdmVDYigpLE9lKFJ0LFtLZV0pfSxlbnRlcihLZSl7dmFyIFJ0PUgsTT1uZSxqPXZlO2lmKCFkLmlzTW91bnRlZClpZihBKVJ0PVFlfHxILE09UmV8fG5lLGo9bWV8fHZlO2Vsc2UgcmV0dXJuO3ZhciBzZT0hMSxyZT1LZS5fZW50ZXJDYj1vZT0+e3NlfHwoc2U9ITAsb2U/T2UoaixbS2VdKTpPZShNLFtLZV0pLEN0LmRlbGF5ZWRMZWF2ZSYmQ3QuZGVsYXllZExlYXZlKCksS2UuX2VudGVyQ2I9dm9pZCAwKX07UnQ/YnQoUnQsW0tlLHJlXSk6cmUoKX0sbGVhdmUoS2UsUnQpe3ZhciBNPVN0cmluZyhpLmtleSk7aWYoS2UuX2VudGVyQ2ImJktlLl9lbnRlckNiKCEwKSxkLmlzVW5tb3VudGluZylyZXR1cm4gUnQoKTtPZShCZSxbS2VdKTt2YXIgaj0hMSxzZT1LZS5fbGVhdmVDYj1yZT0+e2p8fChqPSEwLFJ0KCkscmU/T2UoR2UsW0tlXSk6T2Uoa2UsW0tlXSksS2UuX2xlYXZlQ2I9dm9pZCAwLExlW01dPT09aSYmZGVsZXRlIExlW01dKX07TGVbTV09aSx1ZT9idCh1ZSxbS2Usc2VdKTpzZSgpfSxjbG9uZShLZSl7cmV0dXJuIF9pKEtlLGwsZCxfKX19O3JldHVybiBDdH1mdW5jdGlvbiBiaShpKXtpZihFaShpKSlyZXR1cm4gaT1laShpKSxpLmNoaWxkcmVuPW51bGwsaX1mdW5jdGlvbiB5aShpKXtyZXR1cm4gRWkoaSk/aS5jaGlsZHJlbj9pLmNoaWxkcmVuWzBdOnZvaWQgMDppfWZ1bmN0aW9uIE9yKGksbCl7aS5zaGFwZUZsYWcmNiYmaS5jb21wb25lbnQ/T3IoaS5jb21wb25lbnQuc3ViVHJlZSxsKTppLnNoYXBlRmxhZyYxMjg/KGkuc3NDb250ZW50LnRyYW5zaXRpb249bC5jbG9uZShpLnNzQ29udGVudCksaS5zc0ZhbGxiYWNrLnRyYW5zaXRpb249bC5jbG9uZShpLnNzRmFsbGJhY2spKTppLnRyYW5zaXRpb249bH1mdW5jdGlvbiBSaShpKXtmb3IodmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExLGQ9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsXz1bXSxBPTAsQz0wO0M8aS5sZW5ndGg7QysrKXt2YXIgaz1pW0NdLEQ9ZD09bnVsbD9rLmtleTpTdHJpbmcoZCkrU3RyaW5nKGsua2V5IT1udWxsP2sua2V5OkMpO2sudHlwZT09PXRlPyhrLnBhdGNoRmxhZyYxMjgmJkErKyxfPV8uY29uY2F0KFJpKGsuY2hpbGRyZW4sbCxEKSkpOihsfHxrLnR5cGUhPT1wZSkmJl8ucHVzaChEIT1udWxsP2VpKGsse2tleTpEfSk6ayl9aWYoQT4xKWZvcih2YXIgSD0wO0g8Xy5sZW5ndGg7SCsrKV9bSF0ucGF0Y2hGbGFnPS0yO3JldHVybiBffWZ1bmN0aW9uIFRyKGkpe3JldHVybiBoLmlzRnVuY3Rpb24oaSk/e3NldHVwOmksbmFtZTppLm5hbWV9Oml9dmFyIFJyPWk9PiEhaS50eXBlLl9fYXN5bmNMb2FkZXI7ZnVuY3Rpb24gYWkoaSl7aC5pc0Z1bmN0aW9uKGkpJiYoaT17bG9hZGVyOml9KTt2YXJ7bG9hZGVyOmwsbG9hZGluZ0NvbXBvbmVudDpkLGVycm9yQ29tcG9uZW50Ol8sZGVsYXk6QT0yMDAsdGltZW91dDpDLHN1c3BlbnNpYmxlOms9ITAsb25FcnJvcjpEfT1pLEg9bnVsbCxuZSx2ZT0wLEJlPSgpPT4odmUrKyxIPW51bGwsdWUoKSksdWU9KCk9Pnt2YXIga2U7cmV0dXJuIEh8fChrZT1IPWwoKS5jYXRjaChHZT0+e2lmKEdlPUdlIGluc3RhbmNlb2YgRXJyb3I/R2U6bmV3IEVycm9yKFN0cmluZyhHZSkpLEQpcmV0dXJuIG5ldyBQcm9taXNlKCh1dCxRZSk9Pnt2YXIgUmU9KCk9PnV0KEJlKCkpLG1lPSgpPT5RZShHZSk7RChHZSxSZSxtZSx2ZSsxKX0pO3Rocm93IEdlfSkudGhlbihHZT0+a2UhPT1IJiZIP0g6KEdlJiYoR2UuX19lc01vZHVsZXx8R2VbU3ltYm9sLnRvU3RyaW5nVGFnXT09PSJNb2R1bGUiKSYmKEdlPUdlLmRlZmF1bHQpLG5lPUdlLEdlKSkpfTtyZXR1cm4gVHIoe25hbWU6IkFzeW5jQ29tcG9uZW50V3JhcHBlciIsX19hc3luY0xvYWRlcjp1ZSxnZXQgX19hc3luY1Jlc29sdmVkKCl7cmV0dXJuIG5lfSxzZXR1cCgpe3ZhciBrZT1fbjtpZihuZSlyZXR1cm4oKT0+UHIobmUsa2UpO3ZhciBHZT1tZT0+e0g9bnVsbCxQKG1lLGtlLDEzKX07aWYoayYma2Uuc3VzcGVuc2V8fEUuaXNJblNTUkNvbXBvbmVudFNldHVwKXJldHVybiB1ZSgpLnRoZW4obWU9PigpPT5QcihtZSxrZSkpLmNhdGNoKG1lPT4oR2UobWUpLCgpPT5fP3F0KF8se2Vycm9yOm1lfSk6bnVsbCkpO3ZhciB1dD15LnJlZighMSksUWU9eS5yZWYoKSxSZT15LnJlZighIUEpO3JldHVybiBBJiZzZXRUaW1lb3V0KCgpPT57UmUudmFsdWU9ITF9LEEpLEMhPW51bGwmJnNldFRpbWVvdXQoKCk9PntpZighdXQudmFsdWUmJiFRZS52YWx1ZSl7dmFyIG1lPW5ldyBFcnJvcigiQXN5bmMgY29tcG9uZW50IHRpbWVkIG91dCBhZnRlciAiLmNvbmNhdChDLCJtcy4iKSk7R2UobWUpLFFlLnZhbHVlPW1lfX0sQyksdWUoKS50aGVuKCgpPT57dXQudmFsdWU9ITAsa2UucGFyZW50JiZFaShrZS5wYXJlbnQudm5vZGUpJiZwcihrZS5wYXJlbnQudXBkYXRlKX0pLmNhdGNoKG1lPT57R2UobWUpLFFlLnZhbHVlPW1lfSksKCk9PntpZih1dC52YWx1ZSYmbmUpcmV0dXJuIFByKG5lLGtlKTtpZihRZS52YWx1ZSYmXylyZXR1cm4gcXQoXyx7ZXJyb3I6UWUudmFsdWV9KTtpZihkJiYhUmUudmFsdWUpcmV0dXJuIHF0KGQpfX19KX1mdW5jdGlvbiBQcihpLGwpe3ZhcntyZWY6ZCxwcm9wczpfLGNoaWxkcmVuOkEsY2U6Q309bC52bm9kZSxrPXF0KGksXyxBKTtyZXR1cm4gay5yZWY9ZCxrLmNlPUMsZGVsZXRlIGwudm5vZGUuY2Usa312YXIgRWk9aT0+aS50eXBlLl9faXNLZWVwQWxpdmUsZm49e25hbWU6IktlZXBBbGl2ZSIsX19pc0tlZXBBbGl2ZTohMCxwcm9wczp7aW5jbHVkZTpbU3RyaW5nLFJlZ0V4cCxBcnJheV0sZXhjbHVkZTpbU3RyaW5nLFJlZ0V4cCxBcnJheV0sbWF4OltTdHJpbmcsTnVtYmVyXX0sc2V0dXAoaSxsKXt2YXJ7c2xvdHM6ZH09bCxfPWpuKCksQT1fLmN0eDtpZighQS5yZW5kZXJlcilyZXR1cm4oKT0+e3ZhciB5ZT1kLmRlZmF1bHQmJmQuZGVmYXVsdCgpO3JldHVybiB5ZSYmeWUubGVuZ3RoPT09MT95ZVswXTp5ZX07dmFyIEM9bmV3IE1hcCxrPW5ldyBTZXQsRD1udWxsLEg9Xy5zdXNwZW5zZSx7cmVuZGVyZXI6e3A6bmUsbTp2ZSx1bTpCZSxvOntjcmVhdGVFbGVtZW50OnVlfX19PUEsa2U9dWUoImRpdiIsbnVsbCk7QS5hY3RpdmF0ZT0oeWUsTGUsT2UsYnQsQ3QpPT57dmFyIEtlPXllLmNvbXBvbmVudDt2ZSh5ZSxMZSxPZSwwLEgpLG5lKEtlLnZub2RlLHllLExlLE9lLEtlLEgsYnQseWUuc2xvdFNjb3BlSWRzLEN0KSxscigoKT0+e0tlLmlzRGVhY3RpdmF0ZWQ9ITEsS2UuYSYmaC5pbnZva2VBcnJheUZucyhLZS5hKTt2YXIgUnQ9eWUucHJvcHMmJnllLnByb3BzLm9uVm5vZGVNb3VudGVkO1J0JiZ6cihSdCxLZS5wYXJlbnQseWUpfSxIKX0sQS5kZWFjdGl2YXRlPXllPT57dmFyIExlPXllLmNvbXBvbmVudDt2ZSh5ZSxrZSxudWxsLDEsSCksbHIoKCk9PntMZS5kYSYmaC5pbnZva2VBcnJheUZucyhMZS5kYSk7dmFyIE9lPXllLnByb3BzJiZ5ZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO09lJiZ6cihPZSxMZS5wYXJlbnQseWUpLExlLmlzRGVhY3RpdmF0ZWQ9ITB9LEgpfTtmdW5jdGlvbiBHZSh5ZSl7U2koeWUpLEJlKHllLF8sSCwhMCl9ZnVuY3Rpb24gdXQoeWUpe0MuZm9yRWFjaCgoTGUsT2UpPT57dmFyIGJ0PV9vKExlLnR5cGUpO2J0JiYoIXllfHwheWUoYnQpKSYmUWUoT2UpfSl9ZnVuY3Rpb24gUWUoeWUpe3ZhciBMZT1DLmdldCh5ZSk7IUR8fCFkdChMZSxEKT9HZShMZSk6RCYmU2koRCksQy5kZWxldGUoeWUpLGsuZGVsZXRlKHllKX12cigoKT0+W2kuaW5jbHVkZSxpLmV4Y2x1ZGVdLHllPT57dmFyW0xlLE9lXT15ZTtMZSYmdXQoYnQ9PiRyKExlLGJ0KSksT2UmJnV0KGJ0PT4hJHIoT2UsYnQpKX0se2ZsdXNoOiJwb3N0IixkZWVwOiEwfSk7dmFyIFJlPW51bGwsbWU9KCk9PntSZSE9bnVsbCYmQy5zZXQoUmUseGkoXy5zdWJUcmVlKSl9O3JldHVybiB0cihtZSksbnIobWUpLGNyKCgpPT57Qy5mb3JFYWNoKHllPT57dmFye3N1YlRyZWU6TGUsc3VzcGVuc2U6T2V9PV8sYnQ9eGkoTGUpO2lmKHllLnR5cGU9PT1idC50eXBlJiZ5ZS5rZXk9PT1idC5rZXkpe1NpKGJ0KTt2YXIgQ3Q9YnQuY29tcG9uZW50LmRhO0N0JiZscihDdCxPZSk7cmV0dXJufUdlKHllKX0pfSksKCk9PntpZihSZT1udWxsLCFkLmRlZmF1bHQpcmV0dXJuIG51bGw7dmFyIHllPWQuZGVmYXVsdCgpLExlPXllWzBdO2lmKHllLmxlbmd0aD4xKXJldHVybiBEPW51bGwseWU7aWYoIUd0KExlKXx8IShMZS5zaGFwZUZsYWcmNCkmJiEoTGUuc2hhcGVGbGFnJjEyOCkpcmV0dXJuIEQ9bnVsbCxMZTt2YXIgT2U9eGkoTGUpLGJ0PU9lLnR5cGUsQ3Q9X28oUnIoT2UpP09lLnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTpidCkse2luY2x1ZGU6S2UsZXhjbHVkZTpSdCxtYXg6TX09aTtpZihLZSYmKCFDdHx8ISRyKEtlLEN0KSl8fFJ0JiZDdCYmJHIoUnQsQ3QpKXJldHVybiBEPU9lLExlO3ZhciBqPU9lLmtleT09bnVsbD9idDpPZS5rZXksc2U9Qy5nZXQoaik7cmV0dXJuIE9lLmVsJiYoT2U9ZWkoT2UpLExlLnNoYXBlRmxhZyYxMjgmJihMZS5zc0NvbnRlbnQ9T2UpKSxSZT1qLHNlPyhPZS5lbD1zZS5lbCxPZS5jb21wb25lbnQ9c2UuY29tcG9uZW50LE9lLnRyYW5zaXRpb24mJk9yKE9lLE9lLnRyYW5zaXRpb24pLE9lLnNoYXBlRmxhZ3w9NTEyLGsuZGVsZXRlKGopLGsuYWRkKGopKTooay5hZGQoaiksTSYmay5zaXplPnBhcnNlSW50KE0sMTApJiZRZShrLnZhbHVlcygpLm5leHQoKS52YWx1ZSkpLE9lLnNoYXBlRmxhZ3w9MjU2LEQ9T2UsVG8oTGUudHlwZSk/TGU6T2V9fX0samk9Zm47ZnVuY3Rpb24gJHIoaSxsKXtyZXR1cm4gaC5pc0FycmF5KGkpP2kuc29tZShkPT4kcihkLGwpKTpoLmlzU3RyaW5nKGkpP2kuc3BsaXQoIiwiKS5pbmNsdWRlcyhsKTpoLmlzUmVnRXhwKGkpP2kudGVzdChsKTohMX1mdW5jdGlvbiB0byhpLGwpe0hyKGksImEiLGwpfWZ1bmN0aW9uIEVuKGksbCl7SHIoaSwiZGEiLGwpfWZ1bmN0aW9uIEhyKGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOl9uLF89aS5fX3dkY3x8KGkuX193ZGM9KCk9Pntmb3IodmFyIEM9ZDtDOyl7aWYoQy5pc0RlYWN0aXZhdGVkKXJldHVybjtDPUMucGFyZW50fXJldHVybiBpKCl9KTtpZihtcihsLF8sZCksZClmb3IodmFyIEE9ZC5wYXJlbnQ7QSYmQS5wYXJlbnQ7KUVpKEEucGFyZW50LnZub2RlKSYmc3IoXyxsLGQsQSksQT1BLnBhcmVudH1mdW5jdGlvbiBzcihpLGwsZCxfKXt2YXIgQT1tcihsLGksXywhMCk7aG8oKCk9PntoLnJlbW92ZShfW2xdLEEpfSxkKX1mdW5jdGlvbiBTaShpKXtpLnNoYXBlRmxhZyY9fjI1NixpLnNoYXBlRmxhZyY9fjUxMn1mdW5jdGlvbiB4aShpKXtyZXR1cm4gaS5zaGFwZUZsYWcmMTI4P2kuc3NDb250ZW50Oml9ZnVuY3Rpb24gbXIoaSxsKXt2YXIgZD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06X24sXz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITE7aWYoZCl7aWYoUi5pc1Jvb3RIb29rKGkpJiZkIT09ZC5yb290JiYoZD1kLnJvb3QsUi5pc1Jvb3RJbW1lZGlhdGVIb29rKGkpKSl7dmFyIEE9ZC5wcm94eTtPdChsLmJpbmQoQSksZCxpLFIuT05fTE9BRD09PWk/W0EuJHBhZ2Uub3B0aW9uc106W10pfXZhcntfX3BhZ2VfY29udGFpbmVyX186Q309ZC5yb290LnZub2RlO0MmJkMub25JbmplY3RIb29rKGkpO3ZhciBrPWRbaV18fChkW2ldPVtdKSxEPWwuX193ZWh8fChsLl9fd2VoPWZ1bmN0aW9uKCl7aWYoIWQuaXNVbm1vdW50ZWQpe3kucGF1c2VUcmFja2luZygpLHFuKGQpO2Zvcih2YXIgSD1hcmd1bWVudHMubGVuZ3RoLG5lPW5ldyBBcnJheShIKSx2ZT0wO3ZlPEg7dmUrKyluZVt2ZV09YXJndW1lbnRzW3ZlXTt2YXIgQmU9T3QobCxkLGksbmUpO3JldHVybiBBaSgpLHkucmVzZXRUcmFja2luZygpLEJlfX0pO3JldHVybiBfP2sudW5zaGlmdChEKTprLnB1c2goRCksRH19dmFyIFFyPWk9PmZ1bmN0aW9uKGwpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpfbjtyZXR1cm4oIUUuaXNJblNTUkNvbXBvbmVudFNldHVwfHxpPT09InNwIikmJm1yKGksZnVuY3Rpb24oKXtyZXR1cm4gbCguLi5hcmd1bWVudHMpfSxkKX0sZXI9UXIoImJtIiksdHI9UXIoIm0iKSxHbj1RcigiYnUiKSxucj1RcigidSIpLGNyPVFyKCJidW0iKSxobz1RcigidW0iKSxnbz1Rcigic3AiKSxObz1RcigicnRnIiksbm89UXIoInJ0YyIpO2Z1bmN0aW9uIGtvKGkpe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpfbjttcigiZWMiLGksbCl9ZnVuY3Rpb24ganIoaSxsKXt2YXIgZD1nbjtpZihkPT09bnVsbClyZXR1cm4gaTtmb3IodmFyIF89RGkoZCl8fGQucHJveHksQT1pLmRpcnN8fChpLmRpcnM9W10pLEM9MDtDPGwubGVuZ3RoO0MrKyl7dmFyW2ssRCxILG5lPWguRU1QVFlfT0JKXT1sW0NdO2smJihoLmlzRnVuY3Rpb24oaykmJihrPXttb3VudGVkOmssdXBkYXRlZDprfSksay5kZWVwJiZacihEKSxBLnB1c2goe2RpcjprLGluc3RhbmNlOl8sdmFsdWU6RCxvbGRWYWx1ZTp2b2lkIDAsYXJnOkgsbW9kaWZpZXJzOm5lfSkpfXJldHVybiBpfWZ1bmN0aW9uIHhyKGksbCxkLF8pe2Zvcih2YXIgQT1pLmRpcnMsQz1sJiZsLmRpcnMsaz0wO2s8QS5sZW5ndGg7aysrKXt2YXIgRD1BW2tdO0MmJihELm9sZFZhbHVlPUNba10udmFsdWUpO3ZhciBIPUQuZGlyW19dO0gmJih5LnBhdXNlVHJhY2tpbmcoKSxPdChILGQsOCxbaS5lbCxELGksbF0pLHkucmVzZXRUcmFja2luZygpKX19dmFyIHBvPSJjb21wb25lbnRzIixSbz0iZGlyZWN0aXZlcyI7ZnVuY3Rpb24gcm8oaSxsKXtyZXR1cm4gemkocG8saSwhMCxsKXx8aX12YXIgQmk9U3ltYm9sKCk7ZnVuY3Rpb24gdm8oaSl7cmV0dXJuIGguaXNTdHJpbmcoaSk/emkocG8saSwhMSl8fGk6aXx8Qml9ZnVuY3Rpb24gTWkoaSl7cmV0dXJuIHppKFJvLGkpfWZ1bmN0aW9uIHppKGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLF89Z258fF9uO2lmKF8pe3ZhciBBPV8udHlwZTtpZihpPT09cG8pe3ZhciBDPV9vKEEsITEpO2lmKEMmJihDPT09bHx8Qz09PWguY2FtZWxpemUobCl8fEM9PT1oLmNhcGl0YWxpemUoaC5jYW1lbGl6ZShsKSkpKXJldHVybiBBfXZhciBrPVFvKF9baV18fEFbaV0sbCl8fFFvKF8uYXBwQ29udGV4dFtpXSxsKTtyZXR1cm4hayYmZD9BOmt9fWZ1bmN0aW9uIFFvKGksbCl7cmV0dXJuIGkmJihpW2xdfHxpW2guY2FtZWxpemUobCldfHxpW2guY2FwaXRhbGl6ZShoLmNhbWVsaXplKGwpKV0pfWZ1bmN0aW9uIEIoaSxsLGQsXyl7dmFyIEEsQz1kJiZkW19dO2lmKGguaXNBcnJheShpKXx8aC5pc1N0cmluZyhpKSl7QT1uZXcgQXJyYXkoaS5sZW5ndGgpO2Zvcih2YXIgaz0wLEQ9aS5sZW5ndGg7azxEO2srKylBW2tdPWwoaVtrXSxrLHZvaWQgMCxDJiZDW2tdKX1lbHNlIGlmKHR5cGVvZiBpPT0ibnVtYmVyIil7QT1uZXcgQXJyYXkoaSk7Zm9yKHZhciBIPTA7SDxpO0grKylBW0hdPWwoSCsxLEgsdm9pZCAwLEMmJkNbSF0pfWVsc2UgaWYoaC5pc09iamVjdChpKSlpZihpW1N5bWJvbC5pdGVyYXRvcl0pQT1BcnJheS5mcm9tKGksKGtlLEdlKT0+bChrZSxHZSx2b2lkIDAsQyYmQ1tHZV0pKTtlbHNle3ZhciBuZT1PYmplY3Qua2V5cyhpKTtBPW5ldyBBcnJheShuZS5sZW5ndGgpO2Zvcih2YXIgdmU9MCxCZT1uZS5sZW5ndGg7dmU8QmU7dmUrKyl7dmFyIHVlPW5lW3ZlXTtBW3ZlXT1sKGlbdWVdLHVlLHZlLEMmJkNbdmVdKX19ZWxzZSBBPVtdO3JldHVybiBkJiYoZFtfXT1BKSxBfWZ1bmN0aW9uIFEoaSxsKXtmb3IodmFyIGQ9ZnVuY3Rpb24oQSl7dmFyIEM9bFtBXTtpZihoLmlzQXJyYXkoQykpZm9yKHZhciBrPTA7azxDLmxlbmd0aDtrKyspaVtDW2tdLm5hbWVdPUNba10uZm47ZWxzZSBDJiYoaVtDLm5hbWVdPUMua2V5P2Z1bmN0aW9uKCl7dmFyIEQ9Qy5mbiguLi5hcmd1bWVudHMpO3JldHVybiBEJiYoRC5rZXk9Qy5rZXkpLER9OkMuZm4pfSxfPTA7XzxsLmxlbmd0aDtfKyspZChfKTtyZXR1cm4gaX1mdW5jdGlvbiBoZShpLGwpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fSxfPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwLEE9YXJndW1lbnRzLmxlbmd0aD40P2FyZ3VtZW50c1s0XTp2b2lkIDA7aWYoZ24uaXNDRXx8Z24ucGFyZW50JiZScihnbi5wYXJlbnQpJiZnbi5wYXJlbnQuaXNDRSlyZXR1cm4gbCE9PSJkZWZhdWx0IiYmKGQubmFtZT1sKSxxdCgic2xvdCIsZCxfJiZfKCkpO3ZhciBDPWlbbF07QyYmQy5fYyYmKEMuX2Q9ITEpLGN0KCk7dmFyIGs9QyYmYWUoQyhkKSksRD1kbih0ZSx7a2V5OmQua2V5fHxrJiZrLmtleXx8Il8iLmNvbmNhdChsKX0sa3x8KF8/XygpOltdKSxrJiZpLl89PT0xPzY0Oi0yKTtyZXR1cm4hQSYmRC5zY29wZUlkJiYoRC5zbG90U2NvcGVJZHM9W0Quc2NvcGVJZCsiLXMiXSksQyYmQy5fYyYmKEMuX2Q9ITApLER9ZnVuY3Rpb24gYWUoaSl7cmV0dXJuIGkuc29tZShsPT5HdChsKT8hKGwudHlwZT09PXBlfHxsLnR5cGU9PT10ZSYmIWFlKGwuY2hpbGRyZW4pKTohMCk/aTpudWxsfWZ1bmN0aW9uIGRlKGksbCl7dmFyIGQ9e307Zm9yKHZhciBfIGluIGkpZFtsJiYvW0EtWl0vLnRlc3QoXyk/Im9uOiIuY29uY2F0KF8pOmgudG9IYW5kbGVyS2V5KF8pXT1pW19dO3JldHVybiBkfXZhciB2dD1pPT5pP3VzKGkpP0RpKGkpfHxpLnByb3h5OnZ0KGkucGFyZW50KTpudWxsLGt0PWguZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCkseyQ6aT0+aSwkZWw6aT0+aS52bm9kZS5lbCwkZGF0YTppPT5pLmRhdGEsJHByb3BzOmk9PmkucHJvcHMsJGF0dHJzOmk9PmkuYXR0cnMsJHNsb3RzOmk9Pmkuc2xvdHMsJHJlZnM6aT0+aS5yZWZzLCRwYXJlbnQ6aT0+dnQoaS5wYXJlbnQpLCRyb290Omk9PnZ0KGkucm9vdCksJGVtaXQ6aT0+aS5lbWl0LCRvcHRpb25zOmk9Pl9yKGkpLCRmb3JjZVVwZGF0ZTppPT5pLmZ8fChpLmY9KCk9PnByKGkudXBkYXRlKSksJG5leHRUaWNrOmk9Pmkubnx8KGkubj1nci5iaW5kKGkucHJveHkpKSwkd2F0Y2g6aT0+SW8uYmluZChpKX0pLFg9KGksbCk9PmkhPT1oLkVNUFRZX09CSiYmIWkuX19pc1NjcmlwdFNldHVwJiZoLmhhc093bihpLGwpLEs9e2dldChpLGwpe3ZhcntfOmR9PWkse2N0eDpfLHNldHVwU3RhdGU6QSxkYXRhOkMscHJvcHM6ayxhY2Nlc3NDYWNoZTpELHR5cGU6SCxhcHBDb250ZXh0Om5lfT1kLHZlO2lmKGxbMF0hPT0iJCIpe3ZhciBCZT1EW2xdO2lmKEJlIT09dm9pZCAwKXN3aXRjaChCZSl7Y2FzZSAxOnJldHVybiBBW2xdO2Nhc2UgMjpyZXR1cm4gQ1tsXTtjYXNlIDQ6cmV0dXJuIF9bbF07Y2FzZSAzOnJldHVybiBrW2xdfWVsc2V7aWYoWChBLGwpKXJldHVybiBEW2xdPTEsQVtsXTtpZihDIT09aC5FTVBUWV9PQkomJmguaGFzT3duKEMsbCkpcmV0dXJuIERbbF09MixDW2xdO2lmKCh2ZT1kLnByb3BzT3B0aW9uc1swXSkmJmguaGFzT3duKHZlLGwpKXJldHVybiBEW2xdPTMsa1tsXTtpZihfIT09aC5FTVBUWV9PQkomJmguaGFzT3duKF8sbCkpcmV0dXJuIERbbF09NCxfW2xdO05lJiYoRFtsXT0wKX19dmFyIHVlPWt0W2xdLGtlLEdlO2lmKHVlKXJldHVybiBsPT09IiRhdHRycyImJnkudHJhY2soZCwiZ2V0IixsKSx1ZShkKTtpZigoa2U9SC5fX2Nzc01vZHVsZXMpJiYoa2U9a2VbbF0pKXJldHVybiBrZTtpZihfIT09aC5FTVBUWV9PQkomJmguaGFzT3duKF8sbCkpcmV0dXJuIERbbF09NCxfW2xdO2lmKEdlPW5lLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGguaGFzT3duKEdlLGwpKXJldHVybiBHZVtsXX0sc2V0KGksbCxkKXt2YXJ7X309aSx7ZGF0YTpBLHNldHVwU3RhdGU6QyxjdHg6a309XztyZXR1cm4gWChDLGwpPyhDW2xdPWQsITApOkEhPT1oLkVNUFRZX09CSiYmaC5oYXNPd24oQSxsKT8oQVtsXT1kLCEwKTpoLmhhc093bihfLnByb3BzLGwpfHxsWzBdPT09IiQiJiZsLnNsaWNlKDEpaW4gXz8hMTooa1tsXT1kLCEwKX0saGFzKGksbCl7dmFye186e2RhdGE6ZCxzZXR1cFN0YXRlOl8sYWNjZXNzQ2FjaGU6QSxjdHg6QyxhcHBDb250ZXh0OmsscHJvcHNPcHRpb25zOkR9fT1pLEg7cmV0dXJuISFBW2xdfHxkIT09aC5FTVBUWV9PQkomJmguaGFzT3duKGQsbCl8fFgoXyxsKXx8KEg9RFswXSkmJmguaGFzT3duKEgsbCl8fGguaGFzT3duKEMsbCl8fGguaGFzT3duKGt0LGwpfHxoLmhhc093bihrLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGwpfSxkZWZpbmVQcm9wZXJ0eShpLGwsZCl7cmV0dXJuIGQuZ2V0IT1udWxsP2kuXy5hY2Nlc3NDYWNoZVtsXT0wOmguaGFzT3duKGQsInZhbHVlIikmJnRoaXMuc2V0KGksbCxkLnZhbHVlLG51bGwpLFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoaSxsLGQpfX0saWU9aC5leHRlbmQoe30sSyx7Z2V0KGksbCl7aWYobCE9PVN5bWJvbC51bnNjb3BhYmxlcylyZXR1cm4gSy5nZXQoaSxsLGkpfSxoYXMoaSxsKXt2YXIgZD1sWzBdIT09Il8iJiYhaC5pc0dsb2JhbGx5V2hpdGVsaXN0ZWQobCk7cmV0dXJuIGR9fSksTmU9ITA7ZnVuY3Rpb24gc3QoaSl7dmFyIGw9X3IoaSksZD1pLnByb3h5LF89aS5jdHg7TmU9ITEsbC5iZWZvcmVDcmVhdGUmJnhuKGwuYmVmb3JlQ3JlYXRlLGksImJjIik7dmFye2RhdGE6QSxjb21wdXRlZDpDLG1ldGhvZHM6ayx3YXRjaDpELHByb3ZpZGU6SCxpbmplY3Q6bmUsY3JlYXRlZDp2ZSxiZWZvcmVNb3VudDpCZSxtb3VudGVkOnVlLGJlZm9yZVVwZGF0ZTprZSx1cGRhdGVkOkdlLGFjdGl2YXRlZDp1dCxkZWFjdGl2YXRlZDpRZSxiZWZvcmVEZXN0cm95OlJlLGJlZm9yZVVubW91bnQ6bWUsZGVzdHJveWVkOnllLHVubW91bnRlZDpMZSxyZW5kZXI6T2UscmVuZGVyVHJhY2tlZDpidCxyZW5kZXJUcmlnZ2VyZWQ6Q3QsZXJyb3JDYXB0dXJlZDpLZSxzZXJ2ZXJQcmVmZXRjaDpSdCxleHBvc2U6TSxpbmhlcml0QXR0cnM6aixjb21wb25lbnRzOnNlLGRpcmVjdGl2ZXM6cmUsZmlsdGVyczpvZX09bCxVZT1udWxsO2lmKG5lJiZYdChuZSxfLFVlLGkuYXBwQ29udGV4dC5jb25maWcudW53cmFwSW5qZWN0ZWRSZWYpLGspZm9yKHZhciBydCBpbiBrKXt2YXIgcWU9a1tydF07aC5pc0Z1bmN0aW9uKHFlKSYmKF9bcnRdPXFlLmJpbmQoZCkpfWlmKEEpe3ZhciBaZT1BLmNhbGwoZCxkKTtoLmlzT2JqZWN0KFplKSYmKGkuZGF0YT15LnJlYWN0aXZlKFplKSl9aWYoTmU9ITAsQyl7dmFyICRlPWZ1bmN0aW9uKHZuKXt2YXIgYm49Q1t2bl0sZnI9aC5pc0Z1bmN0aW9uKGJuKT9ibi5iaW5kKGQsZCk6aC5pc0Z1bmN0aW9uKGJuLmdldCk/Ym4uZ2V0LmJpbmQoZCxkKTpoLk5PT1Asbmk9IWguaXNGdW5jdGlvbihibikmJmguaXNGdW5jdGlvbihibi5zZXQpP2JuLnNldC5iaW5kKGQpOmguTk9PUCxKdD1kcyh7Z2V0OmZyLHNldDpuaX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShfLHZuLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9Pkp0LnZhbHVlLHNldDphbj0+SnQudmFsdWU9YW59KX07Zm9yKHZhciAkdCBpbiBDKSRlKCR0KX1pZihEKWZvcih2YXIgcHQgaW4gRClEbihEW3B0XSxfLGQscHQpO2lmKEgpe3ZhciB4dD1oLmlzRnVuY3Rpb24oSCk/SC5jYWxsKGQpOkg7UmVmbGVjdC5vd25LZXlzKHh0KS5mb3JFYWNoKHZuPT57Tm4odm4seHRbdm5dKX0pfXZlJiZ4bih2ZSxpLCJjIik7ZnVuY3Rpb24gQnQodm4sYm4pe2guaXNBcnJheShibik/Ym4uZm9yRWFjaChmcj0+dm4oZnIuYmluZChkKSkpOmJuJiZ2bihibi5iaW5kKGQpKX1pZihCdChlcixCZSksQnQodHIsdWUpLEJ0KEduLGtlKSxCdChucixHZSksQnQodG8sdXQpLEJ0KEVuLFFlKSxCdChrbyxLZSksQnQobm8sYnQpLEJ0KE5vLEN0KSxCdChjcixtZSksQnQoaG8sTGUpLEJ0KGdvLFJ0KSxoLmlzQXJyYXkoTSkpaWYoTS5sZW5ndGgpe3ZhciBNbj1pLmV4cG9zZWR8fChpLmV4cG9zZWQ9e30pO00uZm9yRWFjaCh2bj0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShNbix2bix7Z2V0OigpPT5kW3ZuXSxzZXQ6Ym49PmRbdm5dPWJufSl9KX1lbHNlIGkuZXhwb3NlZHx8KGkuZXhwb3NlZD17fSk7T2UmJmkucmVuZGVyPT09aC5OT09QJiYoaS5yZW5kZXI9T2UpLGohPW51bGwmJihpLmluaGVyaXRBdHRycz1qKSxzZSYmKGkuY29tcG9uZW50cz1zZSkscmUmJihpLmRpcmVjdGl2ZXM9cmUpO3ZhciBSbj1pLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJGFwcGx5T3B0aW9ucztSbiYmUm4obCxpLGQpfWZ1bmN0aW9uIFh0KGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2guaXNBcnJheShpKSYmKGk9TG4oaSkpO3ZhciBfPWZ1bmN0aW9uKEMpe3ZhciBrPWlbQ10sRD12b2lkIDA7aC5pc09iamVjdChrKT8iZGVmYXVsdCJpbiBrP0Q9Wm4oay5mcm9tfHxDLGsuZGVmYXVsdCwhMCk6RD1abihrLmZyb218fEMpOkQ9Wm4oaykseS5pc1JlZihEKSYmZD9PYmplY3QuZGVmaW5lUHJvcGVydHkobCxDLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PkQudmFsdWUsc2V0Okg9PkQudmFsdWU9SH0pOmxbQ109RH07Zm9yKHZhciBBIGluIGkpXyhBKX1mdW5jdGlvbiB4bihpLGwsZCl7T3QoaC5pc0FycmF5KGkpP2kubWFwKF89Pl8uYmluZChsLnByb3h5KSk6aS5iaW5kKGwucHJveHkpLGwsZCl9ZnVuY3Rpb24gRG4oaSxsLGQsXyl7dmFyIEE9Xy5pbmNsdWRlcygiLiIpP1ZyKGQsXyk6KCk9PmRbX107aWYoaC5pc1N0cmluZyhpKSl7dmFyIEM9bFtpXTtoLmlzRnVuY3Rpb24oQykmJnZyKEEsQyl9ZWxzZSBpZihoLmlzRnVuY3Rpb24oaSkpdnIoQSxpLmJpbmQoZCkpO2Vsc2UgaWYoaC5pc09iamVjdChpKSlpZihoLmlzQXJyYXkoaSkpaS5mb3JFYWNoKEQ9PkRuKEQsbCxkLF8pKTtlbHNle3ZhciBrPWguaXNGdW5jdGlvbihpLmhhbmRsZXIpP2kuaGFuZGxlci5iaW5kKGQpOmxbaS5oYW5kbGVyXTtoLmlzRnVuY3Rpb24oaykmJnZyKEEsayxpKX19ZnVuY3Rpb24gX3IoaSl7dmFyIGw9aS50eXBlLHttaXhpbnM6ZCxleHRlbmRzOl99PWwse21peGluczpBLG9wdGlvbnNDYWNoZTpDLGNvbmZpZzp7b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOmt9fT1pLmFwcENvbnRleHQsRD1DLmdldChsKSxIO3JldHVybiBEP0g9RDohQS5sZW5ndGgmJiFkJiYhXz9IPWw6KEg9e30sQS5sZW5ndGgmJkEuZm9yRWFjaChuZT0+QnIoSCxuZSxrLCEwKSksQnIoSCxsLGspKSxoLmlzT2JqZWN0KGwpJiZDLnNldChsLEgpLEh9ZnVuY3Rpb24gQnIoaSxsLGQpe3ZhciBfPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSx7bWl4aW5zOkEsZXh0ZW5kczpDfT1sO0MmJkJyKGksQyxkLCEwKSxBJiZBLmZvckVhY2goSD0+QnIoaSxILGQsITApKTtmb3IodmFyIGsgaW4gbClpZighKF8mJms9PT0iZXhwb3NlIikpe3ZhciBEPW1vW2tdfHxkJiZkW2tdO2lba109RD9EKGlba10sbFtrXSk6bFtrXX1yZXR1cm4gaX12YXIgbW89e2RhdGE6eG8scHJvcHM6Rm4sZW1pdHM6Rm4sbWV0aG9kczpGbixjb21wdXRlZDpGbixiZWZvcmVDcmVhdGU6WW4sY3JlYXRlZDpZbixiZWZvcmVNb3VudDpZbixtb3VudGVkOlluLGJlZm9yZVVwZGF0ZTpZbix1cGRhdGVkOlluLGJlZm9yZURlc3Ryb3k6WW4sYmVmb3JlVW5tb3VudDpZbixkZXN0cm95ZWQ6WW4sdW5tb3VudGVkOlluLGFjdGl2YXRlZDpZbixkZWFjdGl2YXRlZDpZbixlcnJvckNhcHR1cmVkOlluLHNlcnZlclByZWZldGNoOlluLGNvbXBvbmVudHM6Rm4sZGlyZWN0aXZlczpGbix3YXRjaDp3aSxwcm92aWRlOnhvLGluamVjdDpCb307ZnVuY3Rpb24geG8oaSxsKXtyZXR1cm4gbD9pP2Z1bmN0aW9uKCl7cmV0dXJuIGguZXh0ZW5kKGguaXNGdW5jdGlvbihpKT9pLmNhbGwodGhpcyx0aGlzKTppLGguaXNGdW5jdGlvbihsKT9sLmNhbGwodGhpcyx0aGlzKTpsKX06bDppfWZ1bmN0aW9uIEJvKGksbCl7cmV0dXJuIEZuKExuKGkpLExuKGwpKX1mdW5jdGlvbiBMbihpKXtpZihoLmlzQXJyYXkoaSkpe2Zvcih2YXIgbD17fSxkPTA7ZDxpLmxlbmd0aDtkKyspbFtpW2RdXT1pW2RdO3JldHVybiBsfXJldHVybiBpfWZ1bmN0aW9uIFluKGksbCl7cmV0dXJuIGk/Wy4uLm5ldyBTZXQoW10uY29uY2F0KGksbCkpXTpsfWZ1bmN0aW9uIEZuKGksbCl7cmV0dXJuIGk/aC5leHRlbmQoaC5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxpKSxsKTpsfWZ1bmN0aW9uIHdpKGksbCl7aWYoIWkpcmV0dXJuIGw7aWYoIWwpcmV0dXJuIGk7dmFyIGQ9aC5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxpKTtmb3IodmFyIF8gaW4gbClkW19dPVluKGlbX10sbFtfXSk7cmV0dXJuIGR9ZnVuY3Rpb24gaXMoaSxsLGQpe3ZhciBfPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxBPXt9LEM9e307aC5kZWYoQyxCbiwxKSxpLnByb3BzRGVmYXVsdHM9T2JqZWN0LmNyZWF0ZShudWxsKSxicihpLGwsQSxDKTtmb3IodmFyIGsgaW4gaS5wcm9wc09wdGlvbnNbMF0payBpbiBBfHwoQVtrXT12b2lkIDApO2Q/aS5wcm9wcz1fP0E6eS5zaGFsbG93UmVhY3RpdmUoQSk6aS50eXBlLnByb3BzP2kucHJvcHM9QTppLnByb3BzPUMsaS5hdHRycz1DfWZ1bmN0aW9uIGhhKGksbCxkLF8pe3Zhcntwcm9wczpBLGF0dHJzOkMsdm5vZGU6e3BhdGNoRmxhZzprfX09aSxEPXkudG9SYXcoQSksW0hdPWkucHJvcHNPcHRpb25zLG5lPSExO2lmKChffHxrPjApJiYhKGsmMTYpKXtpZihrJjgpZm9yKHZhciB2ZT1pLnZub2RlLmR5bmFtaWNQcm9wcyxCZT0wO0JlPHZlLmxlbmd0aDtCZSsrKXt2YXIgdWU9dmVbQmVdO2lmKCFBbihpLmVtaXRzT3B0aW9ucyx1ZSkpe3ZhciBrZT1sW3VlXTtpZihIKWlmKGguaGFzT3duKEMsdWUpKWtlIT09Q1t1ZV0mJihDW3VlXT1rZSxuZT0hMCk7ZWxzZXt2YXIgR2U9aC5jYW1lbGl6ZSh1ZSk7QVtHZV09VGEoSCxELEdlLGtlLGksITEpfWVsc2Uga2UhPT1DW3VlXSYmKENbdWVdPWtlLG5lPSEwKX19fWVsc2V7YnIoaSxsLEEsQykmJihuZT0hMCk7dmFyIHV0O2Zvcih2YXIgUWUgaW4gRCkoIWx8fCFoLmhhc093bihsLFFlKSYmKCh1dD1oLmh5cGhlbmF0ZShRZSkpPT09UWV8fCFoLmhhc093bihsLHV0KSkpJiYoSD9kJiYoZFtRZV0hPT12b2lkIDB8fGRbdXRdIT09dm9pZCAwKSYmKEFbUWVdPVRhKEgsRCxRZSx2b2lkIDAsaSwhMCkpOmRlbGV0ZSBBW1FlXSk7aWYoQyE9PUQpZm9yKHZhciBSZSBpbiBDKSghbHx8IWguaGFzT3duKGwsUmUpJiYhMCkmJihkZWxldGUgQ1tSZV0sbmU9ITApfW5lJiZ5LnRyaWdnZXIoaSwic2V0IiwiJGF0dHJzIil9ZnVuY3Rpb24gYnIoaSxsLGQsXyl7dmFyW0EsQ109aS5wcm9wc09wdGlvbnMsaz0hMSxEO2lmKGwpe2Zvcih2YXIgSCBpbiBsKWlmKCFoLmlzUmVzZXJ2ZWRQcm9wKEgpKXt2YXIgbmU9bFtIXSx2ZT12b2lkIDA7QSYmaC5oYXNPd24oQSx2ZT1oLmNhbWVsaXplKEgpKT8hQ3x8IUMuaW5jbHVkZXModmUpP2RbdmVdPW5lOihEfHwoRD17fSkpW3ZlXT1uZTpBbihpLmVtaXRzT3B0aW9ucyxIKXx8KCEoSCBpbiBfKXx8bmUhPT1fW0hdKSYmKF9bSF09bmUsaz0hMCl9fWlmKEMpZm9yKHZhciBCZT15LnRvUmF3KGQpLHVlPUR8fGguRU1QVFlfT0JKLGtlPTA7a2U8Qy5sZW5ndGg7a2UrKyl7dmFyIEdlPUNba2VdO2RbR2VdPVRhKEEsQmUsR2UsdWVbR2VdLGksIWguaGFzT3duKHVlLEdlKSl9cmV0dXJuIGt9ZnVuY3Rpb24gVGEoaSxsLGQsXyxBLEMpe3ZhciBrPWlbZF07aWYoayE9bnVsbCl7dmFyIEQ9aC5oYXNPd24oaywiZGVmYXVsdCIpO2lmKEQmJl89PT12b2lkIDApe3ZhciBIPWsuZGVmYXVsdDtpZihrLnR5cGUhPT1GdW5jdGlvbiYmaC5pc0Z1bmN0aW9uKEgpKXt2YXJ7cHJvcHNEZWZhdWx0czpuZX09QTtkIGluIG5lP189bmVbZF06KHFuKEEpLF89bmVbZF09SC5jYWxsKG51bGwsbCksQWkoKSl9ZWxzZSBfPUh9a1swXSYmKEMmJiFEP189ITE6a1sxXSYmKF89PT0iInx8Xz09PWguaHlwaGVuYXRlKGQpKSYmKF89ITApKX1yZXR1cm4gX31mdW5jdGlvbiBMYShpLGwpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxfPWwucHJvcHNDYWNoZSxBPV8uZ2V0KGkpO2lmKEEpcmV0dXJuIEE7dmFyIEM9aS5wcm9wcyxrPXt9LEQ9W10sSD0hMTtpZighaC5pc0Z1bmN0aW9uKGkpKXt2YXIgbmU9eWU9PntIPSEwO3ZhcltMZSxPZV09TGEoeWUsbCwhMCk7aC5leHRlbmQoayxMZSksT2UmJkQucHVzaCguLi5PZSl9OyFkJiZsLm1peGlucy5sZW5ndGgmJmwubWl4aW5zLmZvckVhY2gobmUpLGkuZXh0ZW5kcyYmbmUoaS5leHRlbmRzKSxpLm1peGlucyYmaS5taXhpbnMuZm9yRWFjaChuZSl9aWYoIUMmJiFIKXJldHVybiBoLmlzT2JqZWN0KGkpJiZfLnNldChpLGguRU1QVFlfQVJSKSxoLkVNUFRZX0FSUjtpZihoLmlzQXJyYXkoQykpZm9yKHZhciB2ZT0wO3ZlPEMubGVuZ3RoO3ZlKyspe3ZhciBCZT1oLmNhbWVsaXplKENbdmVdKTtGYShCZSkmJihrW0JlXT1oLkVNUFRZX09CSil9ZWxzZSBpZihDKWZvcih2YXIgdWUgaW4gQyl7dmFyIGtlPWguY2FtZWxpemUodWUpO2lmKEZhKGtlKSl7dmFyIEdlPUNbdWVdLHV0PWtba2VdPWguaXNBcnJheShHZSl8fGguaXNGdW5jdGlvbihHZSk/e3R5cGU6R2V9Ok9iamVjdC5hc3NpZ24oe30sR2UpO2lmKHV0KXt2YXIgUWU9Z2EoQm9vbGVhbix1dC50eXBlKSxSZT1nYShTdHJpbmcsdXQudHlwZSk7dXRbMF09UWU+LTEsdXRbMV09UmU8MHx8UWU8UmUsKFFlPi0xfHxoLmhhc093bih1dCwiZGVmYXVsdCIpKSYmRC5wdXNoKGtlKX19fXZhciBtZT1bayxEXTtyZXR1cm4gaC5pc09iamVjdChpKSYmXy5zZXQoaSxtZSksbWV9ZnVuY3Rpb24gRmEoaSl7cmV0dXJuIGlbMF0hPT0iJCJ9ZnVuY3Rpb24gVmEoaSl7dmFyIGw9aSYmaS50b1N0cmluZygpLm1hdGNoKC9eXHMqKGZ1bmN0aW9ufGNsYXNzKSAoXHcrKS8pO3JldHVybiBsP2xbMl06aT09PW51bGw/Im51bGwiOiIifWZ1bmN0aW9uIFVhKGksbCl7cmV0dXJuIFZhKGkpPT09VmEobCl9ZnVuY3Rpb24gZ2EoaSxsKXtyZXR1cm4gaC5pc0FycmF5KGwpP2wuZmluZEluZGV4KGQ9PlVhKGQsaSkpOmguaXNGdW5jdGlvbihsKSYmVWEobCxpKT8wOi0xfXZhciBQYT1pPT5pWzBdPT09Il8ifHxpPT09IiRzdGFibGUiLFZuPWk9PmguaXNBcnJheShpKT9pLm1hcCgkbik6WyRuKGkpXSxNbz0oaSxsLGQpPT57aWYobC5fbilyZXR1cm4gbDt2YXIgXz1abyhmdW5jdGlvbigpe3JldHVybiBWbihsKC4uLmFyZ3VtZW50cykpfSxkKTtyZXR1cm4gXy5fYz0hMSxffSxlYT0oaSxsLGQpPT57dmFyIF89aS5fY3R4O2Zvcih2YXIgQSBpbiBpKWlmKCFQYShBKSl7dmFyIEM9aVtBXTtoLmlzRnVuY3Rpb24oQyk/bFtBXT1NbyhBLEMsXyk6QyE9bnVsbCYmZnVuY3Rpb24oKXt2YXIgaz1WbihDKTtsW0FdPSgpPT5rfSgpfX0sV2k9KGksbCk9Pnt2YXIgZD1WbihsKTtpLnNsb3RzLmRlZmF1bHQ9KCk9PmR9LG9zPShpLGwpPT57aWYoaS52bm9kZS5zaGFwZUZsYWcmMzIpe3ZhciBkPWwuXztkPyhpLnNsb3RzPXkudG9SYXcobCksaC5kZWYobCwiXyIsZCkpOmVhKGwsaS5zbG90cz17fSl9ZWxzZSBpLnNsb3RzPXt9LGwmJldpKGksbCk7aC5kZWYoaS5zbG90cyxCbiwxKX0sYXM9KGksbCxkKT0+e3Zhcnt2bm9kZTpfLHNsb3RzOkF9PWksQz0hMCxrPWguRU1QVFlfT0JKO2lmKF8uc2hhcGVGbGFnJjMyKXt2YXIgRD1sLl87RD9kJiZEPT09MT9DPSExOihoLmV4dGVuZChBLGwpLCFkJiZEPT09MSYmZGVsZXRlIEEuXyk6KEM9IWwuJHN0YWJsZSxlYShsLEEpKSxrPWx9ZWxzZSBsJiYoV2koaSxsKSxrPXtkZWZhdWx0OjF9KTtpZihDKWZvcih2YXIgSCBpbiBBKSFQYShIKSYmIShIIGluIGspJiZkZWxldGUgQVtIXX07ZnVuY3Rpb24gRG8oKXtyZXR1cm57YXBwOm51bGwsY29uZmlnOntpc05hdGl2ZVRhZzpoLk5PLHBlcmZvcm1hbmNlOiExLGdsb2JhbFByb3BlcnRpZXM6e30sb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOnt9LGVycm9ySGFuZGxlcjp2b2lkIDAsd2FybkhhbmRsZXI6dm9pZCAwLGNvbXBpbGVyT3B0aW9uczp7fX0sbWl4aW5zOltdLGNvbXBvbmVudHM6e30sZGlyZWN0aXZlczp7fSxwcm92aWRlczpPYmplY3QuY3JlYXRlKG51bGwpLG9wdGlvbnNDYWNoZTpuZXcgV2Vha01hcCxwcm9wc0NhY2hlOm5ldyBXZWFrTWFwLGVtaXRzQ2FjaGU6bmV3IFdlYWtNYXB9fXZhciBzcz0wO2Z1bmN0aW9uIGlvKGksbCl7cmV0dXJuIGZ1bmN0aW9uKF8pe3ZhciBBPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsO2guaXNGdW5jdGlvbihfKXx8KF89T2JqZWN0LmFzc2lnbih7fSxfKSksQSE9bnVsbCYmIWguaXNPYmplY3QoQSkmJihBPW51bGwpO3ZhciBDPURvKCksaz1uZXcgU2V0LEQ9ITEsSD1DLmFwcD17X3VpZDpzcysrLF9jb21wb25lbnQ6XyxfcHJvcHM6QSxfY29udGFpbmVyOm51bGwsX2NvbnRleHQ6QyxfaW5zdGFuY2U6bnVsbCx2ZXJzaW9uOmRsLGdldCBjb25maWcoKXtyZXR1cm4gQy5jb25maWd9LHNldCBjb25maWcobmUpe30sdXNlKG5lKXtmb3IodmFyIHZlPWFyZ3VtZW50cy5sZW5ndGgsQmU9bmV3IEFycmF5KHZlPjE/dmUtMTowKSx1ZT0xO3VlPHZlO3VlKyspQmVbdWUtMV09YXJndW1lbnRzW3VlXTtyZXR1cm4gay5oYXMobmUpfHwobmUmJmguaXNGdW5jdGlvbihuZS5pbnN0YWxsKT8oay5hZGQobmUpLG5lLmluc3RhbGwoSCwuLi5CZSkpOmguaXNGdW5jdGlvbihuZSkmJihrLmFkZChuZSksbmUoSCwuLi5CZSkpKSxIfSxtaXhpbihuZSl7cmV0dXJuIEMubWl4aW5zLmluY2x1ZGVzKG5lKXx8Qy5taXhpbnMucHVzaChuZSksSH0sY29tcG9uZW50KG5lLHZlKXtyZXR1cm4gdmU/KEMuY29tcG9uZW50c1tuZV09dmUsSCk6Qy5jb21wb25lbnRzW25lXX0sZGlyZWN0aXZlKG5lLHZlKXtyZXR1cm4gdmU/KEMuZGlyZWN0aXZlc1tuZV09dmUsSCk6Qy5kaXJlY3RpdmVzW25lXX0sbW91bnQobmUsdmUsQmUpe2lmKCFEKXt2YXIgdWU9cXQoXyxBKTtyZXR1cm4gdWUuYXBwQ29udGV4dD1DLHZlJiZsP2wodWUsbmUpOmkodWUsbmUsQmUpLEQ9ITAsSC5fY29udGFpbmVyPW5lLG5lLl9fdnVlX2FwcF9fPUgsSC5faW5zdGFuY2U9dWUuY29tcG9uZW50LERpKHVlLmNvbXBvbmVudCl8fHVlLmNvbXBvbmVudC5wcm94eX19LHVubW91bnQoKXtEJiYoaShudWxsLEguX2NvbnRhaW5lciksZGVsZXRlIEguX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyl9LHByb3ZpZGUobmUsdmUpe3JldHVybiBDLnByb3ZpZGVzW25lXT12ZSxIfX07cmV0dXJuIEh9fWZ1bmN0aW9uIHNpKGksbCxkLF8pe3ZhciBBPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMTtpZihoLmlzQXJyYXkoaSkpe2kuZm9yRWFjaCgodXQsUWUpPT5zaSh1dCxsJiYoaC5pc0FycmF5KGwpP2xbUWVdOmwpLGQsXyxBKSk7cmV0dXJufWlmKCEoUnIoXykmJiFBKSl7dmFyIEM9Xy5zaGFwZUZsYWcmND9EaShfLmNvbXBvbmVudCl8fF8uY29tcG9uZW50LnByb3h5Ol8uZWwsaz1BP251bGw6Qyx7aTpELHI6SH09aSxuZT1sJiZsLnIsdmU9RC5yZWZzPT09aC5FTVBUWV9PQko/RC5yZWZzPXt9OkQucmVmcyxCZT1ELnNldHVwU3RhdGU7aWYobmUhPW51bGwmJm5lIT09SCYmKGguaXNTdHJpbmcobmUpPyh2ZVtuZV09bnVsbCxoLmhhc093bihCZSxuZSkmJihCZVtuZV09bnVsbCkpOnkuaXNSZWYobmUpJiYobmUudmFsdWU9bnVsbCkpLGguaXNGdW5jdGlvbihIKSlWdChILEQsMTIsW2ssdmVdKTtlbHNle3ZhciB1ZT1oLmlzU3RyaW5nKEgpLGtlPXkuaXNSZWYoSCk7aWYodWV8fGtlKXt2YXIgR2U9KCk9PntpZihpLmYpe3ZhciB1dD11ZT9oLmhhc093bihCZSxIKT9CZVtIXTp2ZVtIXTpILnZhbHVlO0E/aC5pc0FycmF5KHV0KSYmaC5yZW1vdmUodXQsQyk6aC5pc0FycmF5KHV0KT91dC5pbmNsdWRlcyhDKXx8dXQucHVzaChDKTp1ZT8odmVbSF09W0NdLGguaGFzT3duKEJlLEgpJiYoQmVbSF09dmVbSF0pKTooSC52YWx1ZT1bQ10saS5rJiYodmVbaS5rXT1ILnZhbHVlKSl9ZWxzZSB1ZT8odmVbSF09ayxoLmhhc093bihCZSxIKSYmKEJlW0hdPWspKTprZSYmKEgudmFsdWU9ayxpLmsmJih2ZVtpLmtdPWspKX07az8oR2UuaWQ9LTEsbHIoR2UsZCkpOkdlKCl9fX19dmFyIENpPSExLEdpPWk9Pi9zdmcvLnRlc3QoaS5uYW1lc3BhY2VVUkkpJiZpLnRhZ05hbWUhPT0iZm9yZWlnbk9iamVjdCIsbGk9aT0+aS5ub2RlVHlwZT09PTg7ZnVuY3Rpb24gdXIoaSl7dmFye210OmwscDpkLG86e3BhdGNoUHJvcDpfLGNyZWF0ZVRleHQ6QSxuZXh0U2libGluZzpDLHBhcmVudE5vZGU6ayxyZW1vdmU6RCxpbnNlcnQ6SCxjcmVhdGVDb21tZW50Om5lfX09aSx2ZT0oUmUsbWUpPT57aWYoIW1lLmhhc0NoaWxkTm9kZXMoKSl7ZChudWxsLFJlLG1lKSx6ZSgpLG1lLl92bm9kZT1SZTtyZXR1cm59Q2k9ITEsQmUobWUuZmlyc3RDaGlsZCxSZSxudWxsLG51bGwsbnVsbCksemUoKSxtZS5fdm5vZGU9UmUsQ2kmJmNvbnNvbGUuZXJyb3IoIkh5ZHJhdGlvbiBjb21wbGV0ZWQgYnV0IGNvbnRhaW5zIG1pc21hdGNoZXMuIil9LEJlPWZ1bmN0aW9uKFJlLG1lLHllLExlLE9lKXt2YXIgYnQ9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExLEN0PWxpKFJlKSYmUmUuZGF0YT09PSJbIixLZT0oKT0+dXQoUmUsbWUseWUsTGUsT2UsQ3QpLHt0eXBlOlJ0LHJlZjpNLHNoYXBlRmxhZzpqLHBhdGNoRmxhZzpzZX09bWUscmU9UmUubm9kZVR5cGU7bWUuZWw9UmUsc2U9PT0tMiYmKGJ0PSExLG1lLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXIgb2U9bnVsbDtzd2l0Y2goUnQpe2Nhc2UgY2U6cmUhPT0zP21lLmNoaWxkcmVuPT09IiI/KEgobWUuZWw9QSgiIixSZS5wYXJlbnROb2RlKSxrKFJlKSxSZSksb2U9UmUpOm9lPUtlKCk6KFJlLmRhdGEhPT1tZS5jaGlsZHJlbiYmKENpPSEwLFJlLmRhdGE9bWUuY2hpbGRyZW4pLG9lPUMoUmUpKTticmVhaztjYXNlIHBlOnJlIT09OHx8Q3Q/b2U9S2UoKTpvZT1DKFJlKTticmVhaztjYXNlIEllOmlmKEN0JiYoUmU9QyhSZSkscmU9UmUubm9kZVR5cGUpLHJlPT09MXx8cmU9PT0zKXtvZT1SZTtmb3IodmFyIFVlPSFtZS5jaGlsZHJlbi5sZW5ndGgscnQ9MDtydDxtZS5zdGF0aWNDb3VudDtydCsrKVVlJiYobWUuY2hpbGRyZW4rPW9lLm5vZGVUeXBlPT09MT9vZS5vdXRlckhUTUw6b2UuZGF0YSkscnQ9PT1tZS5zdGF0aWNDb3VudC0xJiYobWUuYW5jaG9yPW9lKSxvZT1DKG9lKTtyZXR1cm4gQ3Q/QyhvZSk6b2V9ZWxzZSBLZSgpO2JyZWFrO2Nhc2UgdGU6Q3Q/b2U9R2UoUmUsbWUseWUsTGUsT2UsYnQpOm9lPUtlKCk7YnJlYWs7ZGVmYXVsdDppZihqJjEpcmUhPT0xfHxtZS50eXBlLnRvTG93ZXJDYXNlKCkhPT1SZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk/b2U9S2UoKTpvZT11ZShSZSxtZSx5ZSxMZSxPZSxidCk7ZWxzZSBpZihqJjYpe21lLnNsb3RTY29wZUlkcz1PZTt2YXIgcWU9ayhSZSk7aWYobChtZSxxZSxudWxsLHllLExlLEdpKHFlKSxidCksb2U9Q3Q/UWUoUmUpOkMoUmUpLG9lJiZsaShvZSkmJm9lLmRhdGE9PT0idGVsZXBvcnQgZW5kIiYmKG9lPUMob2UpKSxScihtZSkpe3ZhciBaZTtDdD8oWmU9cXQodGUpLFplLmFuY2hvcj1vZT9vZS5wcmV2aW91c1NpYmxpbmc6cWUubGFzdENoaWxkKTpaZT1SZS5ub2RlVHlwZT09PTM/cWkoIiIpOnF0KCJkaXYiKSxaZS5lbD1SZSxtZS5jb21wb25lbnQuc3ViVHJlZT1aZX19ZWxzZSBqJjY0P3JlIT09OD9vZT1LZSgpOm9lPW1lLnR5cGUuaHlkcmF0ZShSZSxtZSx5ZSxMZSxPZSxidCxpLGtlKTpqJjEyOCYmKG9lPW1lLnR5cGUuaHlkcmF0ZShSZSxtZSx5ZSxMZSxHaShrKFJlKSksT2UsYnQsaSxCZSkpfXJldHVybiBNIT1udWxsJiZzaShNLG51bGwsTGUsbWUpLG9lfSx1ZT0oUmUsbWUseWUsTGUsT2UsYnQpPT57YnQ9YnR8fCEhbWUuZHluYW1pY0NoaWxkcmVuO3Zhcnt0eXBlOkN0LHByb3BzOktlLHBhdGNoRmxhZzpSdCxzaGFwZUZsYWc6TSxkaXJzOmp9PW1lLHNlPUN0PT09ImlucHV0IiYmanx8Q3Q9PT0ib3B0aW9uIjtpZihzZXx8UnQhPT0tMSl7aWYoaiYmeHIobWUsbnVsbCx5ZSwiY3JlYXRlZCIpLEtlKWlmKHNlfHwhYnR8fFJ0JigxNnwzMikpZm9yKHZhciByZSBpbiBLZSkoc2UmJnJlLmVuZHNXaXRoKCJ2YWx1ZSIpfHxoLmlzT24ocmUpJiYhaC5pc1Jlc2VydmVkUHJvcChyZSkpJiZfKFJlLHJlLG51bGwsS2VbcmVdLCExLHZvaWQgMCx5ZSk7ZWxzZSBLZS5vbkNsaWNrJiZfKFJlLCJvbkNsaWNrIixudWxsLEtlLm9uQ2xpY2ssITEsdm9pZCAwLHllKTt2YXIgb2U7aWYoKG9lPUtlJiZLZS5vblZub2RlQmVmb3JlTW91bnQpJiZ6cihvZSx5ZSxtZSksaiYmeHIobWUsbnVsbCx5ZSwiYmVmb3JlTW91bnQiKSwoKG9lPUtlJiZLZS5vblZub2RlTW91bnRlZCl8fGopJiZhcigoKT0+e29lJiZ6cihvZSx5ZSxtZSksaiYmeHIobWUsbnVsbCx5ZSwibW91bnRlZCIpfSxMZSksTSYxNiYmIShLZSYmKEtlLmlubmVySFRNTHx8S2UudGV4dENvbnRlbnQpKSlmb3IodmFyIFVlPWtlKFJlLmZpcnN0Q2hpbGQsbWUsUmUseWUsTGUsT2UsYnQpO1VlOyl7Q2k9ITA7dmFyIHJ0PVVlO1VlPVVlLm5leHRTaWJsaW5nLEQocnQpfWVsc2UgTSY4JiZSZS50ZXh0Q29udGVudCE9PW1lLmNoaWxkcmVuJiYoQ2k9ITAsUmUudGV4dENvbnRlbnQ9bWUuY2hpbGRyZW4pfXJldHVybiBSZS5uZXh0U2libGluZ30sa2U9KFJlLG1lLHllLExlLE9lLGJ0LEN0KT0+e0N0PUN0fHwhIW1lLmR5bmFtaWNDaGlsZHJlbjtmb3IodmFyIEtlPW1lLmNoaWxkcmVuLFJ0PUtlLmxlbmd0aCxNPTA7TTxSdDtNKyspe3ZhciBqPUN0P0tlW01dOktlW01dPSRuKEtlW01dKTtpZihSZSlSZT1CZShSZSxqLExlLE9lLGJ0LEN0KTtlbHNle2lmKGoudHlwZT09PWNlJiYhai5jaGlsZHJlbiljb250aW51ZTtDaT0hMCxkKG51bGwsaix5ZSxudWxsLExlLE9lLEdpKHllKSxidCl9fXJldHVybiBSZX0sR2U9KFJlLG1lLHllLExlLE9lLGJ0KT0+e3ZhcntzbG90U2NvcGVJZHM6Q3R9PW1lO0N0JiYoT2U9T2U/T2UuY29uY2F0KEN0KTpDdCk7dmFyIEtlPWsoUmUpLFJ0PWtlKEMoUmUpLG1lLEtlLHllLExlLE9lLGJ0KTtyZXR1cm4gUnQmJmxpKFJ0KSYmUnQuZGF0YT09PSJdIj9DKG1lLmFuY2hvcj1SdCk6KENpPSEwLEgobWUuYW5jaG9yPW5lKCJdIixLZSksS2UsUnQpLFJ0KX0sdXQ9KFJlLG1lLHllLExlLE9lLGJ0KT0+e2lmKENpPSEwLG1lLmVsPW51bGwsYnQpZm9yKHZhciBDdD1RZShSZSk7Oyl7dmFyIEtlPUMoUmUpO2lmKEtlJiZLZSE9PUN0KUQoS2UpO2Vsc2UgYnJlYWt9dmFyIFJ0PUMoUmUpLE09ayhSZSk7cmV0dXJuIEQoUmUpLGQobnVsbCxtZSxNLFJ0LHllLExlLEdpKE0pLE9lKSxSdH0sUWU9UmU9Pntmb3IodmFyIG1lPTA7UmU7KWlmKFJlPUMoUmUpLFJlJiZsaShSZSkmJihSZS5kYXRhPT09IlsiJiZtZSsrLFJlLmRhdGE9PT0iXSIpKXtpZihtZT09PTApcmV0dXJuIEMoUmUpO21lLS19cmV0dXJuIFJlfTtyZXR1cm5bdmUsQmVdfXZhciBscj1hcjtmdW5jdGlvbiAkYShpKXtyZXR1cm4gWWkoaSl9ZnVuY3Rpb24gSGEoaSl7cmV0dXJuIFlpKGksdXIpfWZ1bmN0aW9uIFlpKGksbCl7dmFyIGQ9aC5nZXRHbG9iYWxUaGlzKCk7ZC5fX1ZVRV9fPSEwO3ZhcntpbnNlcnQ6XyxyZW1vdmU6QSxwYXRjaFByb3A6Qyxmb3JjZVBhdGNoUHJvcDprLGNyZWF0ZUVsZW1lbnQ6RCxjcmVhdGVUZXh0OkgsY3JlYXRlQ29tbWVudDpuZSxzZXRUZXh0OnZlLHNldEVsZW1lbnRUZXh0OkJlLHBhcmVudE5vZGU6dWUsbmV4dFNpYmxpbmc6a2Usc2V0U2NvcGVJZDpHZT1oLk5PT1AsaW5zZXJ0U3RhdGljQ29udGVudDp1dH09aSxRZT1mdW5jdGlvbihZLGVlLGJlKXt2YXIgTWU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGwsRGU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsWGU9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOm51bGwsX3Q9YXJndW1lbnRzLmxlbmd0aD42JiZhcmd1bWVudHNbNl0hPT12b2lkIDA/YXJndW1lbnRzWzZdOiExLGV0PWFyZ3VtZW50cy5sZW5ndGg+NyYmYXJndW1lbnRzWzddIT09dm9pZCAwP2FyZ3VtZW50c1s3XTpudWxsLHR0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTohIWVlLmR5bmFtaWNDaGlsZHJlbjtpZihZIT09ZWUpe1kmJiFkdChZLGVlKSYmKE1lPWZyKFkpLEJ0KFksRGUsWGUsITApLFk9bnVsbCksZWUucGF0Y2hGbGFnPT09LTImJih0dD0hMSxlZS5keW5hbWljQ2hpbGRyZW49bnVsbCk7dmFye3R5cGU6SGUscmVmOnp0LHNoYXBlRmxhZzpMdH09ZWU7c3dpdGNoKEhlKXtjYXNlIGNlOlJlKFksZWUsYmUsTWUpO2JyZWFrO2Nhc2UgcGU6bWUoWSxlZSxiZSxNZSk7YnJlYWs7Y2FzZSBJZTpZPT1udWxsJiZ5ZShlZSxiZSxNZSxfdCk7YnJlYWs7Y2FzZSB0ZTpyZShZLGVlLGJlLE1lLERlLFhlLF90LGV0LHR0KTticmVhaztkZWZhdWx0Okx0JjE/YnQoWSxlZSxiZSxNZSxEZSxYZSxfdCxldCx0dCk6THQmNj9vZShZLGVlLGJlLE1lLERlLFhlLF90LGV0LHR0KTooTHQmNjR8fEx0JjEyOCkmJkhlLnByb2Nlc3MoWSxlZSxiZSxNZSxEZSxYZSxfdCxldCx0dCxKdCl9enQhPW51bGwmJkRlJiZzaSh6dCxZJiZZLnJlZixYZSxlZXx8WSwhZWUpfX0sUmU9KFksZWUsYmUsTWUpPT57aWYoWT09bnVsbClfKGVlLmVsPUgoZWUuY2hpbGRyZW4sYmUpLGJlLE1lKTtlbHNle3ZhciBEZT1lZS5lbD1ZLmVsO2VlLmNoaWxkcmVuIT09WS5jaGlsZHJlbiYmdmUoRGUsZWUuY2hpbGRyZW4pfX0sbWU9KFksZWUsYmUsTWUpPT57WT09bnVsbD9fKGVlLmVsPW5lKGVlLmNoaWxkcmVufHwiIixiZSksYmUsTWUpOmVlLmVsPVkuZWx9LHllPShZLGVlLGJlLE1lKT0+e1tZLmVsLFkuYW5jaG9yXT11dChZLmNoaWxkcmVuLGVlLGJlLE1lLFkuZWwsWS5hbmNob3IpfSxMZT0oWSxlZSxiZSk9Pntmb3IodmFye2VsOk1lLGFuY2hvcjpEZX09WSxYZTtNZSYmTWUhPT1EZTspWGU9a2UoTWUpLF8oTWUsZWUsYmUpLE1lPVhlO18oRGUsZWUsYmUpfSxPZT1ZPT57Zm9yKHZhcntlbDplZSxhbmNob3I6YmV9PVksTWU7ZWUmJmVlIT09YmU7KU1lPWtlKGVlKSxBKGVlKSxlZT1NZTtBKGJlKX0sYnQ9KFksZWUsYmUsTWUsRGUsWGUsX3QsZXQsdHQpPT57X3Q9X3R8fGVlLnR5cGU9PT0ic3ZnIixZPT1udWxsP0N0KGVlLGJlLE1lLERlLFhlLF90LGV0LHR0KTpNKFksZWUsRGUsWGUsX3QsZXQsdHQpfSxDdD0oWSxlZSxiZSxNZSxEZSxYZSxfdCxldCk9Pnt2YXIgdHQsSGUse3R5cGU6enQscHJvcHM6THQsc2hhcGVGbGFnOld0LHRyYW5zaXRpb246T24sZGlyczpHcn09WTtpZih0dD1ZLmVsPUQoWS50eXBlLGVlKSxXdCY4P0JlKHR0LFkuY2hpbGRyZW4pOld0JjE2JiZSdChZLmNoaWxkcmVuLHR0LG51bGwsTWUsRGUsWGUmJnp0IT09ImZvcmVpZ25PYmplY3QiLF90LGV0KSxHciYmeHIoWSxudWxsLE1lLCJjcmVhdGVkIiksS2UodHQsWSxZLnNjb3BlSWQsX3QsTWUpLEx0KXtmb3IodmFyIFhuIGluIEx0KVhuIT09InZhbHVlIiYmIWguaXNSZXNlcnZlZFByb3AoWG4pJiZDKHR0LFhuLG51bGwsTHRbWG5dLFhlLFkuY2hpbGRyZW4sTWUsRGUsYm4pOyJ2YWx1ZSJpbiBMdCYmQyh0dCwidmFsdWUiLG51bGwsTHQudmFsdWUpLChIZT1MdC5vblZub2RlQmVmb3JlTW91bnQpJiZ6cihIZSxNZSxZKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodHQsIl9fdnVlUGFyZW50Q29tcG9uZW50Iix7dmFsdWU6TWUsZW51bWVyYWJsZTohMX0pLEdyJiZ4cihZLG51bGwsTWUsImJlZm9yZU1vdW50Iik7dmFyIHVpPSghRGV8fERlJiYhRGUucGVuZGluZ0JyYW5jaCkmJk9uJiYhT24ucGVyc2lzdGVkO3VpJiZPbi5iZWZvcmVFbnRlcih0dCksXyh0dCxlZSxiZSksKChIZT1MdCYmTHQub25Wbm9kZU1vdW50ZWQpfHx1aXx8R3IpJiZscigoKT0+e0hlJiZ6cihIZSxNZSxZKSx1aSYmT24uZW50ZXIodHQpLEdyJiZ4cihZLG51bGwsTWUsIm1vdW50ZWQiKX0sRGUpfSxLZT0oWSxlZSxiZSxNZSxEZSk9PntpZihiZSYmR2UoWSxiZSksTWUpZm9yKHZhciBYZT0wO1hlPE1lLmxlbmd0aDtYZSsrKUdlKFksTWVbWGVdKTtpZihEZSl7dmFyIF90PURlLnN1YlRyZWU7aWYoZWU9PT1fdCl7dmFyIGV0PURlLnZub2RlO0tlKFksZXQsZXQuc2NvcGVJZCxldC5zbG90U2NvcGVJZHMsRGUucGFyZW50KX19fSxSdD1mdW5jdGlvbihZLGVlLGJlLE1lLERlLFhlLF90LGV0KXtmb3IodmFyIHR0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTowLEhlPXR0O0hlPFkubGVuZ3RoO0hlKyspe3ZhciB6dD1ZW0hlXT1ldD9JcihZW0hlXSk6JG4oWVtIZV0pO1FlKG51bGwsenQsZWUsYmUsTWUsRGUsWGUsX3QsZXQpfX0sTT0oWSxlZSxiZSxNZSxEZSxYZSxfdCk9Pnt2YXIgZXQ9ZWUuZWw9WS5lbCx7cGF0Y2hGbGFnOnR0LGR5bmFtaWNDaGlsZHJlbjpIZSxkaXJzOnp0fT1lZTt0dHw9WS5wYXRjaEZsYWcmMTY7dmFyIEx0PVkucHJvcHN8fGguRU1QVFlfT0JKLFd0PWVlLnByb3BzfHxoLkVNUFRZX09CSixPbjtiZSYmb28oYmUsITEpLChPbj1XdC5vblZub2RlQmVmb3JlVXBkYXRlKSYmenIoT24sYmUsZWUsWSksenQmJnhyKGVlLFksYmUsImJlZm9yZVVwZGF0ZSIpLGJlJiZvbyhiZSwhMCk7dmFyIEdyPURlJiZlZS50eXBlIT09ImZvcmVpZ25PYmplY3QiO2lmKEhlP2ooWS5keW5hbWljQ2hpbGRyZW4sSGUsZXQsYmUsTWUsR3IsWGUpOl90fHwkZShZLGVlLGV0LG51bGwsYmUsTWUsR3IsWGUsITEpLHR0PjApe2lmKHR0JjE2KXNlKGV0LGVlLEx0LFd0LGJlLE1lLERlKTtlbHNlIGlmKHR0JjImJkx0LmNsYXNzIT09V3QuY2xhc3MmJkMoZXQsImNsYXNzIixudWxsLFd0LmNsYXNzLERlKSx0dCY0JiZDKGV0LCJzdHlsZSIsTHQuc3R5bGUsV3Quc3R5bGUsRGUpLHR0JjgpZm9yKHZhciBYbj1lZS5keW5hbWljUHJvcHMsdWk9MDt1aTxYbi5sZW5ndGg7dWkrKyl7dmFyIFdvPVhuW3VpXSxlcz1MdFtXb10sd3M9V3RbV29dOyh3cyE9PWVzfHxXbz09PSJ2YWx1ZSJ8fGsmJmsoZXQsV28pKSYmQyhldCxXbyxlcyx3cyxEZSxZLmNoaWxkcmVuLGJlLE1lLGJuKX10dCYxJiZZLmNoaWxkcmVuIT09ZWUuY2hpbGRyZW4mJkJlKGV0LGVlLmNoaWxkcmVuKX1lbHNlIV90JiZIZT09bnVsbCYmc2UoZXQsZWUsTHQsV3QsYmUsTWUsRGUpOygoT249V3Qub25Wbm9kZVVwZGF0ZWQpfHx6dCkmJmxyKCgpPT57T24mJnpyKE9uLGJlLGVlLFkpLHp0JiZ4cihlZSxZLGJlLCJ1cGRhdGVkIil9LE1lKX0saj0oWSxlZSxiZSxNZSxEZSxYZSxfdCk9Pntmb3IodmFyIGV0PTA7ZXQ8ZWUubGVuZ3RoO2V0Kyspe3ZhciB0dD1ZW2V0XSxIZT1lZVtldF0senQ9dHQuZWwmJih0dC50eXBlPT09dGV8fCFkdCh0dCxIZSl8fHR0LnNoYXBlRmxhZyYoNnw2NCkpP3VlKHR0LmVsKTpiZTtRZSh0dCxIZSx6dCxudWxsLE1lLERlLFhlLF90LCEwKX19LHNlPShZLGVlLGJlLE1lLERlLFhlLF90KT0+e2lmKGJlIT09TWUpe2lmKGJlIT09aC5FTVBUWV9PQkopZm9yKHZhciBldCBpbiBiZSkhaC5pc1Jlc2VydmVkUHJvcChldCkmJiEoZXQgaW4gTWUpJiZDKFksZXQsYmVbZXRdLG51bGwsX3QsZWUuY2hpbGRyZW4sRGUsWGUsYm4pO2Zvcih2YXIgdHQgaW4gTWUpaWYoIWguaXNSZXNlcnZlZFByb3AodHQpKXt2YXIgSGU9TWVbdHRdLHp0PWJlW3R0XTsoSGUhPT16dCYmdHQhPT0idmFsdWUifHxrJiZrKFksdHQpKSYmQyhZLHR0LHp0LEhlLF90LGVlLmNoaWxkcmVuLERlLFhlLGJuKX0idmFsdWUiaW4gTWUmJkMoWSwidmFsdWUiLGJlLnZhbHVlLE1lLnZhbHVlKX19LHJlPShZLGVlLGJlLE1lLERlLFhlLF90LGV0LHR0KT0+e3ZhciBIZT1lZS5lbD1ZP1kuZWw6SCgiIixiZSksenQ9ZWUuYW5jaG9yPVk/WS5hbmNob3I6SCgiIixiZSkse3BhdGNoRmxhZzpMdCxkeW5hbWljQ2hpbGRyZW46V3Qsc2xvdFNjb3BlSWRzOk9ufT1lZTtPbiYmKGV0PWV0P2V0LmNvbmNhdChPbik6T24pLFk9PW51bGw/KF8oSGUsYmUsTWUpLF8oenQsYmUsTWUpLFJ0KGVlLmNoaWxkcmVuLGJlLHp0LERlLFhlLF90LGV0LHR0KSk6THQ+MCYmTHQmNjQmJld0JiZZLmR5bmFtaWNDaGlsZHJlbj8oaihZLmR5bmFtaWNDaGlsZHJlbixXdCxiZSxEZSxYZSxfdCxldCksKGVlLmtleSE9bnVsbHx8RGUmJmVlPT09RGUuc3ViVHJlZSkmJmFvKFksZWUsITApKTokZShZLGVlLGJlLHp0LERlLFhlLF90LGV0LHR0KX0sb2U9KFksZWUsYmUsTWUsRGUsWGUsX3QsZXQsdHQpPT57ZWUuc2xvdFNjb3BlSWRzPWV0LFk9PW51bGw/ZWUuc2hhcGVGbGFnJjUxMj9EZS5jdHguYWN0aXZhdGUoZWUsYmUsTWUsX3QsdHQpOlVlKGVlLGJlLE1lLERlLFhlLF90LHR0KTpydChZLGVlLHR0KX0sVWU9KFksZWUsYmUsTWUsRGUsWGUsX3QpPT57dmFyIGV0PVkuY29tcG9uZW50PW9uKFksTWUsRGUpO2lmKEVpKFkpJiYoZXQuY3R4LnJlbmRlcmVyPUp0KSx6YShldCksZXQuYXN5bmNEZXApe2lmKERlJiZEZS5yZWdpc3RlckRlcChldCxxZSksIVkuZWwpe3ZhciB0dD1ldC5zdWJUcmVlPXF0KHBlKTttZShudWxsLHR0LGVlLGJlKX1yZXR1cm59aWYocWUoZXQsWSxlZSxiZSxEZSxYZSxfdCksZXQuJHd4c01vZHVsZXMpe3ZhciBIZT1SLnJlc29sdmVPd25lckVsKGV0LCEwKTtIZS5sZW5ndGgmJkhlLmZvckVhY2goenQ9Pnt6dC5zZXRBdHRyaWJ1dGUoUi5BVFRSX1ZfT1dORVJfSUQsZXQudWlkKTt2YXJ7JHJlbmRlcmpzTW9kdWxlczpMdH09ZXQudHlwZTtMdCYmenQuc2V0QXR0cmlidXRlKFIuQVRUUl9WX1JFTkRFUkpTLEx0KX0pfX0scnQ9KFksZWUsYmUpPT57dmFyIE1lPWVlLmNvbXBvbmVudD1ZLmNvbXBvbmVudDtpZihPbyhZLGVlLGJlKSlpZihNZS5hc3luY0RlcCYmIU1lLmFzeW5jUmVzb2x2ZWQpe1plKE1lLGVlLGJlKTtyZXR1cm59ZWxzZSBNZS5uZXh0PWVlLEpyKE1lLnVwZGF0ZSksTWUudXBkYXRlKCk7ZWxzZSBlZS5lbD1ZLmVsLE1lLnZub2RlPWVlfSxxZT0oWSxlZSxiZSxNZSxEZSxYZSxfdCk9Pnt2YXIgZXQ9KCk9PntpZihZLmlzTW91bnRlZCl7dmFye25leHQ6cnIsYnU6UmEsdTpDcyxwYXJlbnQ6S2ksdm5vZGU6R299PVksY289cnIsX2E7b28oWSwhMSkscnI/KHJyLmVsPUdvLmVsLFplKFkscnIsX3QpKTpycj1HbyxSYSYmaC5pbnZva2VBcnJheUZucyhSYSksKF9hPXJyLnByb3BzJiZyci5wcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSYmenIoX2EsS2kscnIsR28pLG9vKFksITApO3ZhciB0cz0kaShZKSxjYT1ZLnN1YlRyZWU7WS5zdWJUcmVlPXRzLFFlKGNhLHRzLHVlKGNhLmVsKSxmcihjYSksWSxEZSxYZSkscnIuZWw9dHMuZWwsY289PT1udWxsJiZtaShZLHRzLmVsKSxDcyYmbHIoQ3MsRGUpLChfYT1yci5wcm9wcyYmcnIucHJvcHMub25Wbm9kZVVwZGF0ZWQpJiZscigoKT0+enIoX2EsS2kscnIsR28pLERlKX1lbHNle3ZhciB6dCx7ZWw6THQscHJvcHM6V3R9PWVlLHtibTpPbixtOkdyLHBhcmVudDpYbn09WSx1aT1ScihlZSk7aWYob28oWSwhMSksT24mJmguaW52b2tlQXJyYXlGbnMoT24pLCF1aSYmKHp0PVd0JiZXdC5vblZub2RlQmVmb3JlTW91bnQpJiZ6cih6dCxYbixlZSksb28oWSwhMCksTHQmJmxvKXt2YXIgV289KCk9PntZLnN1YlRyZWU9JGkoWSksbG8oTHQsWS5zdWJUcmVlLFksRGUsbnVsbCl9O3VpP2VlLnR5cGUuX19hc3luY0xvYWRlcigpLnRoZW4oKCk9PiFZLmlzVW5tb3VudGVkJiZXbygpKTpXbygpfWVsc2V7dmFyIGVzPVkuc3ViVHJlZT0kaShZKTtRZShudWxsLGVzLGJlLE1lLFksRGUsWGUpLGVlLmVsPWVzLmVsfWlmKEdyJiZscihHcixEZSksIXVpJiYoenQ9V3QmJld0Lm9uVm5vZGVNb3VudGVkKSl7dmFyIHdzPWVlO2xyKCgpPT56cih6dCxYbix3cyksRGUpfShlZS5zaGFwZUZsYWcmMjU2fHxYbiYmUnIoWG4udm5vZGUpJiZYbi52bm9kZS5zaGFwZUZsYWcmMjU2KSYmWS5hJiZscihZLmEsRGUpLFkuaXNNb3VudGVkPSEwLGVlPWJlPU1lPW51bGx9fSx0dD1ZLmVmZmVjdD1uZXcgeS5SZWFjdGl2ZUVmZmVjdChldCwoKT0+cHIoSGUpLFkuc2NvcGUpLEhlPVkudXBkYXRlPSgpPT50dC5ydW4oKTtIZS5pZD1ZLnVpZCxvbyhZLCEwKSxIZSgpfSxaZT0oWSxlZSxiZSk9PntlZS5jb21wb25lbnQ9WTt2YXIgTWU9WS52bm9kZS5wcm9wcztZLnZub2RlPWVlLFkubmV4dD1udWxsLGhhKFksZWUucHJvcHMsTWUsYmUpLGFzKFksZWUuY2hpbGRyZW4sYmUpLHkucGF1c2VUcmFja2luZygpLFBuKCkseS5yZXNldFRyYWNraW5nKCl9LCRlPWZ1bmN0aW9uKFksZWUsYmUsTWUsRGUsWGUsX3QsZXQpe3ZhciB0dD1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06ITEsSGU9WSYmWS5jaGlsZHJlbix6dD1ZP1kuc2hhcGVGbGFnOjAsTHQ9ZWUuY2hpbGRyZW4se3BhdGNoRmxhZzpXdCxzaGFwZUZsYWc6T259PWVlO2lmKFd0PjApe2lmKFd0JjEyOCl7cHQoSGUsTHQsYmUsTWUsRGUsWGUsX3QsZXQsdHQpO3JldHVybn1lbHNlIGlmKFd0JjI1Nil7JHQoSGUsTHQsYmUsTWUsRGUsWGUsX3QsZXQsdHQpO3JldHVybn19T24mOD8oenQmMTYmJmJuKEhlLERlLFhlKSxMdCE9PUhlJiZCZShiZSxMdCkpOnp0JjE2P09uJjE2P3B0KEhlLEx0LGJlLE1lLERlLFhlLF90LGV0LHR0KTpibihIZSxEZSxYZSwhMCk6KHp0JjgmJkJlKGJlLCIiKSxPbiYxNiYmUnQoTHQsYmUsTWUsRGUsWGUsX3QsZXQsdHQpKX0sJHQ9KFksZWUsYmUsTWUsRGUsWGUsX3QsZXQsdHQpPT57WT1ZfHxoLkVNUFRZX0FSUixlZT1lZXx8aC5FTVBUWV9BUlI7dmFyIEhlPVkubGVuZ3RoLHp0PWVlLmxlbmd0aCxMdD1NYXRoLm1pbihIZSx6dCksV3Q7Zm9yKFd0PTA7V3Q8THQ7V3QrKyl7dmFyIE9uPWVlW1d0XT10dD9JcihlZVtXdF0pOiRuKGVlW1d0XSk7UWUoWVtXdF0sT24sYmUsbnVsbCxEZSxYZSxfdCxldCx0dCl9SGU+enQ/Ym4oWSxEZSxYZSwhMCwhMSxMdCk6UnQoZWUsYmUsTWUsRGUsWGUsX3QsZXQsdHQsTHQpfSxwdD0oWSxlZSxiZSxNZSxEZSxYZSxfdCxldCx0dCk9Pntmb3IodmFyIEhlPTAsenQ9ZWUubGVuZ3RoLEx0PVkubGVuZ3RoLTEsV3Q9enQtMTtIZTw9THQmJkhlPD1XdDspe3ZhciBPbj1ZW0hlXSxHcj1lZVtIZV09dHQ/SXIoZWVbSGVdKTokbihlZVtIZV0pO2lmKGR0KE9uLEdyKSlRZShPbixHcixiZSxudWxsLERlLFhlLF90LGV0LHR0KTtlbHNlIGJyZWFrO0hlKyt9Zm9yKDtIZTw9THQmJkhlPD1XdDspe3ZhciBYbj1ZW0x0XSx1aT1lZVtXdF09dHQ/SXIoZWVbV3RdKTokbihlZVtXdF0pO2lmKGR0KFhuLHVpKSlRZShYbix1aSxiZSxudWxsLERlLFhlLF90LGV0LHR0KTtlbHNlIGJyZWFrO0x0LS0sV3QtLX1pZihIZT5MdCl7aWYoSGU8PVd0KWZvcih2YXIgV289V3QrMSxlcz1Xbzx6dD9lZVtXb10uZWw6TWU7SGU8PVd0OylRZShudWxsLGVlW0hlXT10dD9JcihlZVtIZV0pOiRuKGVlW0hlXSksYmUsZXMsRGUsWGUsX3QsZXQsdHQpLEhlKyt9ZWxzZSBpZihIZT5XdClmb3IoO0hlPD1MdDspQnQoWVtIZV0sRGUsWGUsITApLEhlKys7ZWxzZXt2YXIgd3M9SGUscnI9SGUsUmE9bmV3IE1hcDtmb3IoSGU9cnI7SGU8PVd0O0hlKyspe3ZhciBDcz1lZVtIZV09dHQ/SXIoZWVbSGVdKTokbihlZVtIZV0pO0NzLmtleSE9bnVsbCYmUmEuc2V0KENzLmtleSxIZSl9dmFyIEtpLEdvPTAsY289V3QtcnIrMSxfYT0hMSx0cz0wLGNhPW5ldyBBcnJheShjbyk7Zm9yKEhlPTA7SGU8Y287SGUrKyljYVtIZV09MDtmb3IoSGU9d3M7SGU8PUx0O0hlKyspe3ZhciB1YT1ZW0hlXTtpZihHbz49Y28pe0J0KHVhLERlLFhlLCEwKTtjb250aW51ZX12YXIgWW89dm9pZCAwO2lmKHVhLmtleSE9bnVsbClZbz1SYS5nZXQodWEua2V5KTtlbHNlIGZvcihLaT1ycjtLaTw9V3Q7S2krKylpZihjYVtLaS1ycl09PT0wJiZkdCh1YSxlZVtLaV0pKXtZbz1LaTticmVha31Zbz09PXZvaWQgMD9CdCh1YSxEZSxYZSwhMCk6KGNhW1lvLXJyXT1IZSsxLFlvPj10cz90cz1ZbzpfYT0hMCxRZSh1YSxlZVtZb10sYmUsbnVsbCxEZSxYZSxfdCxldCx0dCksR28rKyl9dmFyIHlsPV9hP2xzKGNhKTpoLkVNUFRZX0FSUjtmb3IoS2k9eWwubGVuZ3RoLTEsSGU9Y28tMTtIZT49MDtIZS0tKXt2YXIgWXM9cnIrSGUsYmM9ZWVbWXNdLFdsPVlzKzE8enQ/ZWVbWXMrMV0uZWw6TWU7Y2FbSGVdPT09MD9RZShudWxsLGJjLGJlLFdsLERlLFhlLF90LGV0LHR0KTpfYSYmKEtpPDB8fEhlIT09eWxbS2ldP3h0KGJjLGJlLFdsLDIpOktpLS0pfX19LHh0PWZ1bmN0aW9uKFksZWUsYmUsTWUpe3ZhciBEZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCx7ZWw6WGUsdHlwZTpfdCx0cmFuc2l0aW9uOmV0LGNoaWxkcmVuOnR0LHNoYXBlRmxhZzpIZX09WTtpZihIZSY2KXt4dChZLmNvbXBvbmVudC5zdWJUcmVlLGVlLGJlLE1lKTtyZXR1cm59aWYoSGUmMTI4KXtZLnN1c3BlbnNlLm1vdmUoZWUsYmUsTWUpO3JldHVybn1pZihIZSY2NCl7X3QubW92ZShZLGVlLGJlLEp0KTtyZXR1cm59aWYoX3Q9PT10ZSl7XyhYZSxlZSxiZSk7Zm9yKHZhciB6dD0wO3p0PHR0Lmxlbmd0aDt6dCsrKXh0KHR0W3p0XSxlZSxiZSxNZSk7XyhZLmFuY2hvcixlZSxiZSk7cmV0dXJufWlmKF90PT09SWUpe0xlKFksZWUsYmUpO3JldHVybn12YXIgTHQ9TWUhPT0yJiZIZSYxJiZldDtpZihMdClpZihNZT09PTApZXQuYmVmb3JlRW50ZXIoWGUpLF8oWGUsZWUsYmUpLGxyKCgpPT5ldC5lbnRlcihYZSksRGUpO2Vsc2V7dmFye2xlYXZlOld0LGRlbGF5TGVhdmU6T24sYWZ0ZXJMZWF2ZTpHcn09ZXQsWG49KCk9Pl8oWGUsZWUsYmUpLHVpPSgpPT57V3QoWGUsKCk9PntYbigpLEdyJiZHcigpfSl9O09uP09uKFhlLFhuLHVpKTp1aSgpfWVsc2UgXyhYZSxlZSxiZSl9LEJ0PWZ1bmN0aW9uKFksZWUsYmUpe3ZhciBNZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsRGU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLHt0eXBlOlhlLHByb3BzOl90LHJlZjpldCxjaGlsZHJlbjp0dCxkeW5hbWljQ2hpbGRyZW46SGUsc2hhcGVGbGFnOnp0LHBhdGNoRmxhZzpMdCxkaXJzOld0fT1ZO2lmKGV0IT1udWxsJiZzaShldCxudWxsLGJlLFksITApLHp0JjI1Nil7ZWUuY3R4LmRlYWN0aXZhdGUoWSk7cmV0dXJufXZhciBPbj16dCYxJiZXdCxHcj0hUnIoWSksWG47aWYoR3ImJihYbj1fdCYmX3Qub25Wbm9kZUJlZm9yZVVubW91bnQpJiZ6cihYbixlZSxZKSx6dCY2KXZuKFkuY29tcG9uZW50LGJlLE1lKTtlbHNle2lmKHp0JjEyOCl7WS5zdXNwZW5zZS51bm1vdW50KGJlLE1lKTtyZXR1cm59T24mJnhyKFksbnVsbCxlZSwiYmVmb3JlVW5tb3VudCIpLHp0JjY0P1kudHlwZS5yZW1vdmUoWSxlZSxiZSxEZSxKdCxNZSk6SGUmJihYZSE9PXRlfHxMdD4wJiZMdCY2NCk/Ym4oSGUsZWUsYmUsITEsITApOihYZT09PXRlJiZMdCYoMTI4fDI1Nil8fCFEZSYmenQmMTYpJiZibih0dCxlZSxiZSksTWUmJk1uKFkpfShHciYmKFhuPV90JiZfdC5vblZub2RlVW5tb3VudGVkKXx8T24pJiZscigoKT0+e1huJiZ6cihYbixlZSxZKSxPbiYmeHIoWSxudWxsLGVlLCJ1bm1vdW50ZWQiKX0sYmUpfSxNbj1ZPT57dmFye3R5cGU6ZWUsZWw6YmUsYW5jaG9yOk1lLHRyYW5zaXRpb246RGV9PVk7aWYoZWU9PT10ZSl7Um4oYmUsTWUpO3JldHVybn1pZihlZT09PUllKXtPZShZKTtyZXR1cm59dmFyIFhlPSgpPT57QShiZSksRGUmJiFEZS5wZXJzaXN0ZWQmJkRlLmFmdGVyTGVhdmUmJkRlLmFmdGVyTGVhdmUoKX07aWYoWS5zaGFwZUZsYWcmMSYmRGUmJiFEZS5wZXJzaXN0ZWQpe3ZhcntsZWF2ZTpfdCxkZWxheUxlYXZlOmV0fT1EZSx0dD0oKT0+X3QoYmUsWGUpO2V0P2V0KFkuZWwsWGUsdHQpOnR0KCl9ZWxzZSBYZSgpfSxSbj0oWSxlZSk9Pntmb3IodmFyIGJlO1khPT1lZTspYmU9a2UoWSksQShZKSxZPWJlO0EoZWUpfSx2bj0oWSxlZSxiZSk9Pnt2YXJ7YnVtOk1lLHNjb3BlOkRlLHVwZGF0ZTpYZSxzdWJUcmVlOl90LHVtOmV0fT1ZO01lJiZoLmludm9rZUFycmF5Rm5zKE1lKSxEZS5zdG9wKCksWGUmJihYZS5hY3RpdmU9ITEsQnQoX3QsWSxlZSxiZSkpLGV0JiZscihldCxlZSksbHIoKCk9PntZLmlzVW5tb3VudGVkPSEwfSxlZSksZWUmJmVlLnBlbmRpbmdCcmFuY2gmJiFlZS5pc1VubW91bnRlZCYmWS5hc3luY0RlcCYmIVkuYXN5bmNSZXNvbHZlZCYmWS5zdXNwZW5zZUlkPT09ZWUucGVuZGluZ0lkJiYoZWUuZGVwcy0tLGVlLmRlcHM9PT0wJiZlZS5yZXNvbHZlKCkpfSxibj1mdW5jdGlvbihZLGVlLGJlKXtmb3IodmFyIE1lPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxEZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06ITEsWGU9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOjAsX3Q9WGU7X3Q8WS5sZW5ndGg7X3QrKylCdChZW190XSxlZSxiZSxNZSxEZSl9LGZyPVk9Plkuc2hhcGVGbGFnJjY/ZnIoWS5jb21wb25lbnQuc3ViVHJlZSk6WS5zaGFwZUZsYWcmMTI4P1kuc3VzcGVuc2UubmV4dCgpOmtlKFkuYW5jaG9yfHxZLmVsKSxuaT0oWSxlZSxiZSk9PntZPT1udWxsP2VlLl92bm9kZSYmQnQoZWUuX3Zub2RlLG51bGwsbnVsbCwhMCk6UWUoZWUuX3Zub2RlfHxudWxsLFksZWUsbnVsbCxudWxsLG51bGwsYmUpLFBuKCksemUoKSxlZS5fdm5vZGU9WX0sSnQ9e3A6UWUsdW06QnQsbTp4dCxyOk1uLG10OlVlLG1jOlJ0LHBjOiRlLHBiYzpqLG46ZnIsbzppfSxhbixsbztyZXR1cm4gbCYmKFthbixsb109bChKdCkpLHtyZW5kZXI6bmksaHlkcmF0ZTphbixjcmVhdGVBcHA6aW8obmksYW4pfX1mdW5jdGlvbiBvbyhpLGwpe3ZhcntlZmZlY3Q6ZCx1cGRhdGU6X309aTtkLmFsbG93UmVjdXJzZT1fLmFsbG93UmVjdXJzZT1sfWZ1bmN0aW9uIGFvKGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLF89aS5jaGlsZHJlbixBPWwuY2hpbGRyZW47aWYoaC5pc0FycmF5KF8pJiZoLmlzQXJyYXkoQSkpZm9yKHZhciBDPTA7QzxfLmxlbmd0aDtDKyspe3ZhciBrPV9bQ10sRD1BW0NdO0Quc2hhcGVGbGFnJjEmJiFELmR5bmFtaWNDaGlsZHJlbiYmKChELnBhdGNoRmxhZzw9MHx8RC5wYXRjaEZsYWc9PT0zMikmJihEPUFbQ109SXIoQVtDXSksRC5lbD1rLmVsKSxkfHxhbyhrLEQpKSxELnR5cGU9PT1jZSYmKEQuZWw9ay5lbCl9fWZ1bmN0aW9uIGxzKGkpe3ZhciBsPWkuc2xpY2UoKSxkPVswXSxfLEEsQyxrLEQsSD1pLmxlbmd0aDtmb3IoXz0wO188SDtfKyspe3ZhciBuZT1pW19dO2lmKG5lIT09MCl7aWYoQT1kW2QubGVuZ3RoLTFdLGlbQV08bmUpe2xbX109QSxkLnB1c2goXyk7Y29udGludWV9Zm9yKEM9MCxrPWQubGVuZ3RoLTE7QzxrOylEPUMraz4+MSxpW2RbRF1dPG5lP0M9RCsxOms9RDtuZTxpW2RbQ11dJiYoQz4wJiYobFtfXT1kW0MtMV0pLGRbQ109Xyl9fWZvcihDPWQubGVuZ3RoLGs9ZFtDLTFdO0MtLSA+MDspZFtDXT1rLGs9bFtrXTtyZXR1cm4gZH12YXIgcGE9aT0+aS5fX2lzVGVsZXBvcnQsTG89aT0+aSYmKGkuZGlzYWJsZWR8fGkuZGlzYWJsZWQ9PT0iIiksdmE9aT0+dHlwZW9mIFNWR0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgU1ZHRWxlbWVudCx2PShpLGwpPT57dmFyIGQ9aSYmaS50bztpZihoLmlzU3RyaW5nKGQpKWlmKGwpe3ZhciBfPWwoZCk7cmV0dXJuIF99ZWxzZSByZXR1cm4gbnVsbDtlbHNlIHJldHVybiBkfSx4PXtfX2lzVGVsZXBvcnQ6ITAscHJvY2VzcyhpLGwsZCxfLEEsQyxrLEQsSCxuZSl7dmFye21jOnZlLHBjOkJlLHBiYzp1ZSxvOntpbnNlcnQ6a2UscXVlcnlTZWxlY3RvcjpHZSxjcmVhdGVUZXh0OnV0LGNyZWF0ZUNvbW1lbnQ6UWV9fT1uZSxSZT1MbyhsLnByb3BzKSx7c2hhcGVGbGFnOm1lLGNoaWxkcmVuOnllLGR5bmFtaWNDaGlsZHJlbjpMZX09bDtpZihpPT1udWxsKXt2YXIgT2U9bC5lbD11dCgiIixkKSxidD1sLmFuY2hvcj11dCgiIixkKTtrZShPZSxkLF8pLGtlKGJ0LGQsXyk7dmFyIEN0PWwudGFyZ2V0PXYobC5wcm9wcyxHZSksS2U9bC50YXJnZXRBbmNob3I9dXQoIiIsZCk7Q3QmJihrZShLZSxDdCksaz1rfHx2YShDdCkpO3ZhciBSdD0ocWUsWmUpPT57bWUmMTYmJnZlKHllLHFlLFplLEEsQyxrLEQsSCl9O1JlP1J0KGQsYnQpOkN0JiZSdChDdCxLZSl9ZWxzZXtsLmVsPWkuZWw7dmFyIE09bC5hbmNob3I9aS5hbmNob3Isaj1sLnRhcmdldD1pLnRhcmdldCxzZT1sLnRhcmdldEFuY2hvcj1pLnRhcmdldEFuY2hvcixyZT1MbyhpLnByb3BzKSxvZT1yZT9kOmosVWU9cmU/TTpzZTtpZihrPWt8fHZhKGopLExlPyh1ZShpLmR5bmFtaWNDaGlsZHJlbixMZSxvZSxBLEMsayxEKSxhbyhpLGwsITApKTpIfHxCZShpLGwsb2UsVWUsQSxDLGssRCwhMSksUmUpcmV8fCQobCxkLE0sbmUsMSk7ZWxzZSBpZigobC5wcm9wcyYmbC5wcm9wcy50bykhPT0oaS5wcm9wcyYmaS5wcm9wcy50bykpe3ZhciBydD1sLnRhcmdldD12KGwucHJvcHMsR2UpO3J0JiYkKGwscnQsbnVsbCxuZSwwKX1lbHNlIHJlJiYkKGwsaixzZSxuZSwxKX1xKGwpfSxyZW1vdmUoaSxsLGQsXyxBLEMpe3Zhcnt1bTprLG86e3JlbW92ZTpEfX09QSx7c2hhcGVGbGFnOkgsY2hpbGRyZW46bmUsYW5jaG9yOnZlLHRhcmdldEFuY2hvcjpCZSx0YXJnZXQ6dWUscHJvcHM6a2V9PWk7aWYodWUmJkQoQmUpLChDfHwhTG8oa2UpKSYmKEQodmUpLEgmMTYpKWZvcih2YXIgR2U9MDtHZTxuZS5sZW5ndGg7R2UrKyl7dmFyIHV0PW5lW0dlXTtrKHV0LGwsZCwhMCwhIXV0LmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOiQsaHlkcmF0ZTpVfTtmdW5jdGlvbiAkKGksbCxkLF8pe3ZhcntvOntpbnNlcnQ6QX0sbTpDfT1fLGs9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOjI7az09PTAmJkEoaS50YXJnZXRBbmNob3IsbCxkKTt2YXJ7ZWw6RCxhbmNob3I6SCxzaGFwZUZsYWc6bmUsY2hpbGRyZW46dmUscHJvcHM6QmV9PWksdWU9az09PTI7aWYodWUmJkEoRCxsLGQpLCghdWV8fExvKEJlKSkmJm5lJjE2KWZvcih2YXIga2U9MDtrZTx2ZS5sZW5ndGg7a2UrKylDKHZlW2tlXSxsLGQsMik7dWUmJkEoSCxsLGQpfWZ1bmN0aW9uIFUoaSxsLGQsXyxBLEMsayxEKXt2YXJ7bzp7bmV4dFNpYmxpbmc6SCxwYXJlbnROb2RlOm5lLHF1ZXJ5U2VsZWN0b3I6dmV9fT1rLEJlPWwudGFyZ2V0PXYobC5wcm9wcyx2ZSk7aWYoQmUpe3ZhciB1ZT1CZS5fbHBhfHxCZS5maXJzdENoaWxkO2lmKGwuc2hhcGVGbGFnJjE2KWlmKExvKGwucHJvcHMpKWwuYW5jaG9yPUQoSChpKSxsLG5lKGkpLGQsXyxBLEMpLGwudGFyZ2V0QW5jaG9yPXVlO2Vsc2V7bC5hbmNob3I9SChpKTtmb3IodmFyIGtlPXVlO2tlOylpZihrZT1IKGtlKSxrZSYma2Uubm9kZVR5cGU9PT04JiZrZS5kYXRhPT09InRlbGVwb3J0IGFuY2hvciIpe2wudGFyZ2V0QW5jaG9yPWtlLEJlLl9scGE9bC50YXJnZXRBbmNob3ImJkgobC50YXJnZXRBbmNob3IpO2JyZWFrfUQodWUsbCxCZSxkLF8sQSxDKX1xKGwpfXJldHVybiBsLmFuY2hvciYmSChsLmFuY2hvcil9dmFyIFo9eDtmdW5jdGlvbiBxKGkpe3ZhciBsPWkuY3R4O2lmKGwmJmwudXQpe2Zvcih2YXIgZD1pLmNoaWxkcmVuWzBdLmVsO2QhPT1pLnRhcmdldEFuY2hvcjspZC5ub2RlVHlwZT09PTEmJmQuc2V0QXR0cmlidXRlKCJkYXRhLXYtb3duZXIiLGwudWlkKSxkPWQubmV4dFNpYmxpbmc7bC51dCgpfX12YXIgdGU9U3ltYm9sKHZvaWQgMCksY2U9U3ltYm9sKHZvaWQgMCkscGU9U3ltYm9sKHZvaWQgMCksSWU9U3ltYm9sKHZvaWQgMCksZmU9W10sQ2U9bnVsbDtmdW5jdGlvbiBjdCgpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTohMTtmZS5wdXNoKENlPWk/bnVsbDpbXSl9ZnVuY3Rpb24gZ3QoKXtmZS5wb3AoKSxDZT1mZVtmZS5sZW5ndGgtMV18fG51bGx9dmFyIEh0PTE7ZnVuY3Rpb24geXQoaSl7SHQrPWl9ZnVuY3Rpb24gamUoaSl7cmV0dXJuIGkuZHluYW1pY0NoaWxkcmVuPUh0PjA/Q2V8fGguRU1QVFlfQVJSOm51bGwsZ3QoKSxIdD4wJiZDZSYmQ2UucHVzaChpKSxpfWZ1bmN0aW9uIE10KGksbCxkLF8sQSxDKXtyZXR1cm4gamUoVXQoaSxsLGQsXyxBLEMsITApKX1mdW5jdGlvbiBkbihpLGwsZCxfLEEpe3JldHVybiBqZShxdChpLGwsZCxfLEEsITApKX1mdW5jdGlvbiBHdChpKXtyZXR1cm4gaT9pLl9fdl9pc1ZOb2RlPT09ITA6ITF9ZnVuY3Rpb24gZHQoaSxsKXtyZXR1cm4gaS50eXBlPT09bC50eXBlJiZpLmtleT09PWwua2V5fWZ1bmN0aW9uIGVuKGkpe312YXIgQm49Il9fdkludGVybmFsIixZdD1pPT57dmFye2tleTpsfT1pO3JldHVybiBsIT1udWxsP2w6bnVsbH0sanQ9aT0+e3ZhcntyZWY6bCxyZWZfa2V5OmQscmVmX2ZvcjpffT1pO3JldHVybiBsIT1udWxsP2guaXNTdHJpbmcobCl8fHkuaXNSZWYobCl8fGguaXNGdW5jdGlvbihsKT97aTpnbixyOmwsazpkLGY6ISFffTpsOm51bGx9O2Z1bmN0aW9uIFV0KGkpe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsLGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwsXz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxBPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLEM9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOmk9PT10ZT8wOjEsaz1hcmd1bWVudHMubGVuZ3RoPjYmJmFyZ3VtZW50c1s2XSE9PXZvaWQgMD9hcmd1bWVudHNbNl06ITEsRD1hcmd1bWVudHMubGVuZ3RoPjcmJmFyZ3VtZW50c1s3XSE9PXZvaWQgMD9hcmd1bWVudHNbN106ITEsSD17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTppLHByb3BzOmwsa2V5OmwmJll0KGwpLHJlZjpsJiZqdChsKSxzY29wZUlkOndyLHNsb3RTY29wZUlkczpudWxsLGNoaWxkcmVuOmQsY29tcG9uZW50Om51bGwsc3VzcGVuc2U6bnVsbCxzc0NvbnRlbnQ6bnVsbCxzc0ZhbGxiYWNrOm51bGwsZGlyczpudWxsLHRyYW5zaXRpb246bnVsbCxlbDpudWxsLGFuY2hvcjpudWxsLHRhcmdldDpudWxsLHRhcmdldEFuY2hvcjpudWxsLHN0YXRpY0NvdW50OjAsc2hhcGVGbGFnOkMscGF0Y2hGbGFnOl8sZHluYW1pY1Byb3BzOkEsZHluYW1pY0NoaWxkcmVuOm51bGwsYXBwQ29udGV4dDpudWxsLGN0eDpnbn07cmV0dXJuIEQ/KEhuKEgsZCksQyYxMjgmJmkubm9ybWFsaXplKEgpKTpkJiYoSC5zaGFwZUZsYWd8PWguaXNTdHJpbmcoZCk/ODoxNiksSHQ+MCYmIWsmJkNlJiYoSC5wYXRjaEZsYWc+MHx8QyY2KSYmSC5wYXRjaEZsYWchPT0zMiYmQ2UucHVzaChIKSxIfXZhciBxdD10YTtmdW5jdGlvbiB0YShpKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbCxkPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsLF89YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOjAsQT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxDPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTohMTtpZigoIWl8fGk9PT1CaSkmJihpPXBlKSxHdChpKSl7dmFyIGs9ZWkoaSxsLCEwKTtyZXR1cm4gZCYmSG4oayxkKSxIdD4wJiYhQyYmQ2UmJihrLnNoYXBlRmxhZyY2P0NlW0NlLmluZGV4T2YoaSldPWs6Q2UucHVzaChrKSksay5wYXRjaEZsYWd8PS0yLGt9aWYoYm8oaSkmJihpPWkuX192Y2NPcHRzKSxsKXtsPWNpKGwpO3ZhcntjbGFzczpELHN0eWxlOkh9PWw7RCYmIWguaXNTdHJpbmcoRCkmJihsLmNsYXNzPWgubm9ybWFsaXplQ2xhc3MoRCkpLGguaXNPYmplY3QoSCkmJih5LmlzUHJveHkoSCkmJiFoLmlzQXJyYXkoSCkmJihIPWguZXh0ZW5kKHt9LEgpKSxsLnN0eWxlPWgubm9ybWFsaXplU3R5bGUoSCkpfXZhciBuZT1oLmlzU3RyaW5nKGkpPzE6VG8oaSk/MTI4OnBhKGkpPzY0OmguaXNPYmplY3QoaSk/NDpoLmlzRnVuY3Rpb24oaSk/MjowO3JldHVybiBVdChpLGwsZCxfLEEsbmUsQywhMCl9ZnVuY3Rpb24gY2koaSl7cmV0dXJuIGk/eS5pc1Byb3h5KGkpfHxCbiBpbiBpP2guZXh0ZW5kKHt9LGkpOmk6bnVsbH1mdW5jdGlvbiBlaShpLGwpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSx7cHJvcHM6XyxyZWY6QSxwYXRjaEZsYWc6QyxjaGlsZHJlbjprfT1pLEQ9bD95cihffHx7fSxsKTpfLEg9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6aS50eXBlLHByb3BzOkQsa2V5OkQmJll0KEQpLHJlZjpsJiZsLnJlZj9kJiZBP2guaXNBcnJheShBKT9BLmNvbmNhdChqdChsKSk6W0EsanQobCldOmp0KGwpOkEsc2NvcGVJZDppLnNjb3BlSWQsc2xvdFNjb3BlSWRzOmkuc2xvdFNjb3BlSWRzLGNoaWxkcmVuOmssdGFyZ2V0OmkudGFyZ2V0LHRhcmdldEFuY2hvcjppLnRhcmdldEFuY2hvcixzdGF0aWNDb3VudDppLnN0YXRpY0NvdW50LHNoYXBlRmxhZzppLnNoYXBlRmxhZyxwYXRjaEZsYWc6bCYmaS50eXBlIT09dGU/Qz09PS0xPzE2OkN8MTY6QyxkeW5hbWljUHJvcHM6aS5keW5hbWljUHJvcHMsZHluYW1pY0NoaWxkcmVuOmkuZHluYW1pY0NoaWxkcmVuLGFwcENvbnRleHQ6aS5hcHBDb250ZXh0LGRpcnM6aS5kaXJzLHRyYW5zaXRpb246aS50cmFuc2l0aW9uLGNvbXBvbmVudDppLmNvbXBvbmVudCxzdXNwZW5zZTppLnN1c3BlbnNlLHNzQ29udGVudDppLnNzQ29udGVudCYmZWkoaS5zc0NvbnRlbnQpLHNzRmFsbGJhY2s6aS5zc0ZhbGxiYWNrJiZlaShpLnNzRmFsbGJhY2spLGVsOmkuZWwsYW5jaG9yOmkuYW5jaG9yLGN0eDppLmN0eCxjZTppLmNlfTtyZXR1cm4gSH1mdW5jdGlvbiBxaSgpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiICIsbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MDtyZXR1cm4gcXQoY2UsbnVsbCxpLGwpfWZ1bmN0aW9uIGphKGksbCl7dmFyIGQ9cXQoSWUsbnVsbCxpKTtyZXR1cm4gZC5zdGF0aWNDb3VudD1sLGR9ZnVuY3Rpb24gVW4oKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06IiIsbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGw/KGN0KCksZG4ocGUsbnVsbCxpKSk6cXQocGUsbnVsbCxpKX1mdW5jdGlvbiAkbihpKXtyZXR1cm4gaT09bnVsbHx8dHlwZW9mIGk9PSJib29sZWFuIj9xdChwZSk6aC5pc0FycmF5KGkpP3F0KHRlLG51bGwsaS5zbGljZSgpKTp0eXBlb2YgaT09Im9iamVjdCI/SXIoaSk6cXQoY2UsbnVsbCxTdHJpbmcoaSkpfWZ1bmN0aW9uIElyKGkpe3JldHVybiBpLmVsPT09bnVsbCYmaS5wYXRjaEZsYWchPT0tMXx8aS5tZW1vP2k6ZWkoaSl9ZnVuY3Rpb24gSG4oaSxsKXt2YXIgZD0wLHtzaGFwZUZsYWc6X309aTtpZihsPT1udWxsKWw9bnVsbDtlbHNlIGlmKGguaXNBcnJheShsKSlkPTE2O2Vsc2UgaWYodHlwZW9mIGw9PSJvYmplY3QiKWlmKF8mKDF8NjQpKXt2YXIgQT1sLmRlZmF1bHQ7QSYmKEEuX2MmJihBLl9kPSExKSxIbihpLEEoKSksQS5fYyYmKEEuX2Q9ITApKTtyZXR1cm59ZWxzZXtkPTMyO3ZhciBDPWwuXzshQyYmIShCbiBpbiBsKT9sLl9jdHg9Z246Qz09PTMmJmduJiYoZ24uc2xvdHMuXz09PTE/bC5fPTE6KGwuXz0yLGkucGF0Y2hGbGFnfD0xMDI0KSl9ZWxzZSBoLmlzRnVuY3Rpb24obCk/KGw9e2RlZmF1bHQ6bCxfY3R4OmdufSxkPTMyKToobD1TdHJpbmcobCksXyY2ND8oZD0xNixsPVtxaShsKV0pOmQ9OCk7aS5jaGlsZHJlbj1sLGkuc2hhcGVGbGFnfD1kfWZ1bmN0aW9uIHlyKCl7Zm9yKHZhciBpPXt9LGw9MDtsPGFyZ3VtZW50cy5sZW5ndGg7bCsrKXt2YXIgZD1sPDB8fGFyZ3VtZW50cy5sZW5ndGg8PWw/dm9pZCAwOmFyZ3VtZW50c1tsXTtmb3IodmFyIF8gaW4gZClpZihfPT09ImNsYXNzIilpLmNsYXNzIT09ZC5jbGFzcyYmKGkuY2xhc3M9aC5ub3JtYWxpemVDbGFzcyhbaS5jbGFzcyxkLmNsYXNzXSkpO2Vsc2UgaWYoXz09PSJzdHlsZSIpaS5zdHlsZT1oLm5vcm1hbGl6ZVN0eWxlKFtpLnN0eWxlLGQuc3R5bGVdKTtlbHNlIGlmKGguaXNPbihfKSl7dmFyIEE9aVtfXSxDPWRbX107QyYmQSE9PUMmJiEoaC5pc0FycmF5KEEpJiZBLmluY2x1ZGVzKEMpKSYmKGlbX109QT9bXS5jb25jYXQoQSxDKTpDKX1lbHNlIF8hPT0iIiYmKGlbX109ZFtfXSl9cmV0dXJuIGl9ZnVuY3Rpb24genIoaSxsLGQpe3ZhciBfPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO090KGksbCw3LFtkLF9dKX12YXIgbmE9RG8oKSxjcz0wO2Z1bmN0aW9uIG9uKGksbCxkKXt2YXIgXz1pLnR5cGUsQT0obD9sLmFwcENvbnRleHQ6aS5hcHBDb250ZXh0KXx8bmEsQz17dWlkOmNzKyssdm5vZGU6aSx0eXBlOl8scGFyZW50OmwsYXBwQ29udGV4dDpBLHJvb3Q6bnVsbCxuZXh0Om51bGwsc3ViVHJlZTpudWxsLGVmZmVjdDpudWxsLHVwZGF0ZTpudWxsLHNjb3BlOm5ldyB5LkVmZmVjdFNjb3BlKCEwKSxyZW5kZXI6bnVsbCxwcm94eTpudWxsLGV4cG9zZWQ6bnVsbCxleHBvc2VQcm94eTpudWxsLHdpdGhQcm94eTpudWxsLHByb3ZpZGVzOmw/bC5wcm92aWRlczpPYmplY3QuY3JlYXRlKEEucHJvdmlkZXMpLGFjY2Vzc0NhY2hlOm51bGwscmVuZGVyQ2FjaGU6W10sY29tcG9uZW50czpudWxsLGRpcmVjdGl2ZXM6bnVsbCxwcm9wc09wdGlvbnM6TGEoXyxBKSxlbWl0c09wdGlvbnM6V24oXyxBKSxlbWl0Om51bGwsZW1pdHRlZDpudWxsLHByb3BzRGVmYXVsdHM6aC5FTVBUWV9PQkosaW5oZXJpdEF0dHJzOl8uaW5oZXJpdEF0dHJzLGN0eDpoLkVNUFRZX09CSixkYXRhOmguRU1QVFlfT0JKLHByb3BzOmguRU1QVFlfT0JKLGF0dHJzOmguRU1QVFlfT0JKLHNsb3RzOmguRU1QVFlfT0JKLHJlZnM6aC5FTVBUWV9PQkosc2V0dXBTdGF0ZTpoLkVNUFRZX09CSixzZXR1cENvbnRleHQ6bnVsbCxzdXNwZW5zZTpkLHN1c3BlbnNlSWQ6ZD9kLnBlbmRpbmdJZDowLGFzeW5jRGVwOm51bGwsYXN5bmNSZXNvbHZlZDohMSxpc01vdW50ZWQ6ITEsaXNVbm1vdW50ZWQ6ITEsaXNEZWFjdGl2YXRlZDohMSxiYzpudWxsLGM6bnVsbCxibTpudWxsLG06bnVsbCxidTpudWxsLHU6bnVsbCx1bTpudWxsLGJ1bTpudWxsLGRhOm51bGwsYTpudWxsLHJ0ZzpudWxsLHJ0YzpudWxsLGVjOm51bGwsc3A6bnVsbH07cmV0dXJuIEMuY3R4PXtfOkN9LEMucm9vdD1sP2wucm9vdDpDLEMuZW1pdD1vci5iaW5kKG51bGwsQyksaS5jZSYmaS5jZShDKSxDfXZhciBfbj1udWxsLGpuPSgpPT5fbnx8Z24scW49aT0+e19uPWksaS5zY29wZS5vbigpfSxBaT0oKT0+e19uJiZfbi5zY29wZS5vZmYoKSxfbj1udWxsfTtmdW5jdGlvbiB1cyhpKXtyZXR1cm4gaS52bm9kZS5zaGFwZUZsYWcmNH1FLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMTtmdW5jdGlvbiB6YShpKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7RS5pc0luU1NSQ29tcG9uZW50U2V0dXA9bDt2YXJ7cHJvcHM6ZCxjaGlsZHJlbjpffT1pLnZub2RlLEE9dXMoaSk7aXMoaSxkLEEsbCksb3MoaSxfKTt2YXIgQz1BP0lhKGksbCk6dm9pZCAwO3JldHVybiBFLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMSxDfWZ1bmN0aW9uIElhKGksbCl7dmFyIGQ9aS50eXBlO2kuYWNjZXNzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSxpLnByb3h5PXkubWFya1JhdyhuZXcgUHJveHkoaS5jdHgsSykpO3ZhcntzZXR1cDpffT1kO2lmKF8pe3ZhciBBPWkuc2V0dXBDb250ZXh0PV8ubGVuZ3RoPjE/Rm8oaSk6bnVsbDtxbihpKSx5LnBhdXNlVHJhY2tpbmcoKTt2YXIgQz1WdChfLGksMCxbaS5wcm9wcyxBXSk7aWYoeS5yZXNldFRyYWNraW5nKCksQWkoKSxoLmlzUHJvbWlzZShDKSl7aWYoQy50aGVuKEFpLEFpKSxsKXJldHVybiBDLnRoZW4oaz0+e3JhKGksayxsKX0pLmNhdGNoKGs9PntQKGssaSwwKX0pO2kuYXN5bmNEZXA9Q31lbHNlIHJhKGksQyxsKX1lbHNlIEdhKGksbCl9ZnVuY3Rpb24gcmEoaSxsLGQpe2guaXNGdW5jdGlvbihsKT9pLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/aS5zc3JSZW5kZXI9bDppLnJlbmRlcj1sOmguaXNPYmplY3QobCkmJihpLnNldHVwU3RhdGU9eS5wcm94eVJlZnMobCkpLEdhKGksZCl9dmFyIHNvLFdhO2Z1bmN0aW9uIGZzKGkpe3NvPWksV2E9bD0+e2wucmVuZGVyLl9yYyYmKGwud2l0aFByb3h5PW5ldyBQcm94eShsLmN0eCxpZSkpfX12YXIgV3I9KCk9PiFzbztmdW5jdGlvbiBHYShpLGwsZCl7dmFyIF89aS50eXBlO2lmKCFpLnJlbmRlcil7aWYoIWwmJnNvJiYhXy5yZW5kZXIpe3ZhciBBPV8udGVtcGxhdGV8fF9yKGkpLnRlbXBsYXRlO2lmKEEpe3Zhcntpc0N1c3RvbUVsZW1lbnQ6Qyxjb21waWxlck9wdGlvbnM6a309aS5hcHBDb250ZXh0LmNvbmZpZyx7ZGVsaW1pdGVyczpELGNvbXBpbGVyT3B0aW9uczpIfT1fLG5lPWguZXh0ZW5kKGguZXh0ZW5kKHtpc0N1c3RvbUVsZW1lbnQ6QyxkZWxpbWl0ZXJzOkR9LGspLEgpO18ucmVuZGVyPXNvKEEsbmUpfX1pLnJlbmRlcj1fLnJlbmRlcnx8aC5OT09QLFdhJiZXYShpKX1xbihpKSx5LnBhdXNlVHJhY2tpbmcoKSxzdChpKSx5LnJlc2V0VHJhY2tpbmcoKSxBaSgpfWZ1bmN0aW9uIFlhKGkpe3JldHVybiBuZXcgUHJveHkoaS5hdHRycyx7Z2V0KGwsZCl7cmV0dXJuIHkudHJhY2soaSwiZ2V0IiwiJGF0dHJzIiksbFtkXX19KX1mdW5jdGlvbiBGbyhpKXt2YXIgbD1fPT57aS5leHBvc2VkPV98fHt9fSxkO3JldHVybntnZXQgYXR0cnMoKXtyZXR1cm4gZHx8KGQ9WWEoaSkpfSxzbG90czppLnNsb3RzLGVtaXQ6aS5lbWl0LGV4cG9zZTpsfX1mdW5jdGlvbiBEaShpKXtpZihpLmV4cG9zZWQpcmV0dXJuIGkuZXhwb3NlUHJveHl8fChpLmV4cG9zZVByb3h5PW5ldyBQcm94eSh5LnByb3h5UmVmcyh5Lm1hcmtSYXcoaS5leHBvc2VkKSkse2dldChsLGQpe2lmKGQgaW4gbClyZXR1cm4gbFtkXTtpZihkIGluIGt0KXJldHVybiBrdFtkXShpKX0saGFzKGwsZCl7cmV0dXJuIGQgaW4gbHx8ZCBpbiBrdH19KSl9ZnVuY3Rpb24gX28oaSl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiBoLmlzRnVuY3Rpb24oaSk/aS5kaXNwbGF5TmFtZXx8aS5uYW1lOmkubmFtZXx8bCYmaS5fX25hbWV9ZnVuY3Rpb24gYm8oaSl7cmV0dXJuIGguaXNGdW5jdGlvbihpKSYmIl9fdmNjT3B0cyJpbiBpfXZhciBkcz0oaSxsKT0+eS5jb21wdXRlZChpLGwsRS5pc0luU1NSQ29tcG9uZW50U2V0dXApO2Z1bmN0aW9uIFZvKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24geHMoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBocyhpKXt9ZnVuY3Rpb24gQnMoaSxsKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiB4ZSgpe3JldHVybiBQdCgpLnNsb3RzfWZ1bmN0aW9uIE50KCl7cmV0dXJuIFB0KCkuYXR0cnN9ZnVuY3Rpb24gUHQoKXt2YXIgaT1qbigpO3JldHVybiBpLnNldHVwQ29udGV4dHx8KGkuc2V0dXBDb250ZXh0PUZvKGkpKX1mdW5jdGlvbiB3bihpLGwpe3ZhciBkPWguaXNBcnJheShpKT9pLnJlZHVjZSgoQyxrKT0+KENba109e30sQykse30pOmk7Zm9yKHZhciBfIGluIGwpe3ZhciBBPWRbX107QT9oLmlzQXJyYXkoQSl8fGguaXNGdW5jdGlvbihBKT9kW19dPXt0eXBlOkEsZGVmYXVsdDpsW19dfTpBLmRlZmF1bHQ9bFtfXTpBPT09bnVsbCYmKGRbX109e2RlZmF1bHQ6bFtfXX0pfXJldHVybiBkfWZ1bmN0aW9uIEVyKGksbCl7dmFyIGQ9e30sXz1mdW5jdGlvbihDKXtsLmluY2x1ZGVzKEMpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCxDLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+aVtDXX0pfTtmb3IodmFyIEEgaW4gaSlfKEEpO3JldHVybiBkfWZ1bmN0aW9uIE9pKGkpe3ZhciBsPWpuKCksZD1pKCk7cmV0dXJuIEFpKCksaC5pc1Byb21pc2UoZCkmJihkPWQuY2F0Y2goXz0+e3Rocm93IHFuKGwpLF99KSksW2QsKCk9PnFuKGwpXX1mdW5jdGlvbiBKaShpLGwsZCl7dmFyIF89YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gXz09PTI/aC5pc09iamVjdChsKSYmIWguaXNBcnJheShsKT9HdChsKT9xdChpLG51bGwsW2xdKTpxdChpLGwpOnF0KGksbnVsbCxsKTooXz4zP2Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpOl89PT0zJiZHdChkKSYmKGQ9W2RdKSxxdChpLGwsZCkpfXZhciBVbz1TeW1ib2woIiIpLE5hPSgpPT57e3ZhciBpPVpuKFVvKTtyZXR1cm4gaX19O2Z1bmN0aW9uIGlhKCl7fWZ1bmN0aW9uIGdzKGksbCxkLF8pe3ZhciBBPWRbX107aWYoQSYmcHMoQSxpKSlyZXR1cm4gQTt2YXIgQz1sKCk7cmV0dXJuIEMubWVtbz1pLnNsaWNlKCksZFtfXT1DfWZ1bmN0aW9uIHBzKGksbCl7dmFyIGQ9aS5tZW1vO2lmKGQubGVuZ3RoIT1sLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIF89MDtfPGQubGVuZ3RoO18rKylpZihoLmhhc0NoYW5nZWQoZFtfXSxsW19dKSlyZXR1cm4hMTtyZXR1cm4gSHQ+MCYmQ2UmJkNlLnB1c2goaSksITB9dmFyIGRsPSIzLjIuNDciLCRsPXtjcmVhdGVDb21wb25lbnRJbnN0YW5jZTpvbixzZXR1cENvbXBvbmVudDp6YSxyZW5kZXJDb21wb25lbnRSb290OiRpLHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTpLcixpc1ZOb2RlOkd0LG5vcm1hbGl6ZVZOb2RlOiRufSxIbD0kbCxNcz1udWxsLCRvPW51bGw7ZnVuY3Rpb24gSG8oaSxsKXtyZXR1cm4gaT09PSJpbnB1dCI/bmV3IFIuVW5pSW5wdXRFbGVtZW50KGksbCk6aT09PSJ0ZXh0YXJlYSI/bmV3IFIuVW5pVGV4dEFyZWFFbGVtZW50KGksbCk6bmV3IFIuVW5pRWxlbWVudChpLGwpfWZ1bmN0aW9uIG9hKGksbCl7cmV0dXJuIG5ldyBSLlVuaVRleHROb2RlKGksbCl9ZnVuY3Rpb24gcWEoaSxsKXtyZXR1cm4gbmV3IFIuVW5pQ29tbWVudE5vZGUoaSxsKX12YXIgdnMsam89e2luc2VydDooaSxsLGQpPT57bC5pbnNlcnRCZWZvcmUoaSxkfHxudWxsKX0scmVtb3ZlOmk9Pnt2YXIgbD1pLnBhcmVudE5vZGU7bCYmbC5yZW1vdmVDaGlsZChpKX0sY3JlYXRlRWxlbWVudDooaSxsKT0+SG8oaSxsKSxjcmVhdGVUZXh0OihpLGwpPT5vYShpLGwpLGNyZWF0ZUNvbW1lbnQ6KGksbCk9PnFhKGksbCksc2V0VGV4dDooaSxsKT0+e2kubm9kZVZhbHVlPWx9LHNldEVsZW1lbnRUZXh0OihpLGwpPT57aS50ZXh0Q29udGVudD1sfSxwYXJlbnROb2RlOmk9PmkucGFyZW50Tm9kZSxuZXh0U2libGluZzppPT5pLm5leHRTaWJsaW5nLHNldFNjb3BlSWQoaSxsKXtpLnNldEF0dHJpYnV0ZShsLCIiKX0sY2xvbmVOb2RlKGkpe3ZhciBsPWkuY2xvbmVOb2RlKCEwKTtyZXR1cm4iX3ZhbHVlImluIGkmJihsLl92YWx1ZT1pLl92YWx1ZSksbH0saW5zZXJ0U3RhdGljQ29udGVudChpLGwsZCl7dmFyIF89dnN8fCh2cz1IbygiZGl2IikpO18uaW5uZXJIVE1MPWk7Zm9yKHZhciBBPV8uZmlyc3RDaGlsZCxDPUEsaz1DO0M7KWs9Qyxqby5pbnNlcnQoQyxsLGQpLEM9Xy5maXJzdENoaWxkO3JldHVybltBLGtdfX07ZnVuY3Rpb24gRHMoaSxsKXtsPT1udWxsJiYobD0iIiksaS5zZXRBdHRyaWJ1dGUoImNsYXNzIixsKX1mdW5jdGlvbiBqbChpLGwsZCl7aWYoIWQpaS5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7ZWxzZSBpZihoLmlzU3RyaW5nKGQpKWwhPT1kJiZpLnNldEF0dHJpYnV0ZSgic3R5bGUiLGQpO2Vsc2V7dmFyIF89e30sQT1sJiYhaC5pc1N0cmluZyhsKTtpZihBKXtmb3IodmFyIEMgaW4gbClkW0NdPT1udWxsJiYoX1tDXT0iIik7Zm9yKHZhciBrIGluIGQpe3ZhciBEPWRba107RCE9PWxba10mJihfW2tdPUQpfX1lbHNlIGZvcih2YXIgSCBpbiBkKV9bSF09ZFtIXTtPYmplY3Qua2V5cyhfKS5sZW5ndGgmJmkuc2V0QXR0cmlidXRlKCJzdHlsZSIsXyl9fWZ1bmN0aW9uIExzKGksbCxkKXtkPT1udWxsP2kucmVtb3ZlQXR0cmlidXRlKGwpOmkuc2V0QXR0cmlidXRlKGwsZCl9ZnVuY3Rpb24gbXMoaSxsLGQsXyl7aS5hZGRFdmVudExpc3RlbmVyKGwsZCxfKX1mdW5jdGlvbiBobChpLGwsZCxfKXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIobCxkLF8pfWZ1bmN0aW9uIEZzKGksbCxkLF8pe3ZhciBBPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLEM9aS5fdmVpfHwoaS5fdmVpPXt9KSxrPUNbbF07aWYoXyYmaylrLnZhbHVlPV87ZWxzZXt2YXJbRCxIXT1fcyhsKTtpZihfKXt2YXIgbmU9Q1tsXT1WcyhfLEEpO21zKGksRCxuZSxIKX1lbHNlIGsmJihobChpLEQsayxIKSxDW2xdPXZvaWQgMCl9fXZhciBKYT0vKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87ZnVuY3Rpb24gX3MoaSl7dmFyIGw7aWYoSmEudGVzdChpKSl7bD17fTtmb3IodmFyIGQ7ZD1pLm1hdGNoKEphKTspaT1pLnNsaWNlKDAsaS5sZW5ndGgtZFswXS5sZW5ndGgpLGxbZFswXS50b0xvd2VyQ2FzZSgpXT0hMH1yZXR1cm5baC5oeXBoZW5hdGUoaS5zbGljZSgyKSksbF19ZnVuY3Rpb24gVnMoaSxsKXt2YXIgZD1BPT57T3QoZC52YWx1ZSxsLDUsW0FdKX07ZC52YWx1ZT1pO3ZhciBfPW5ldyBTZXQ7cmV0dXJuIGguaXNBcnJheShkLnZhbHVlKT9kLnZhbHVlLmZvckVhY2goQT0+e0EubW9kaWZpZXJzJiZBLm1vZGlmaWVycy5mb3JFYWNoKEM9PntfLmFkZChDKX0pfSk6KGQudmFsdWUubW9kaWZpZXJzJiZkLnZhbHVlLm1vZGlmaWVycy5mb3JFYWNoKEE9PntfLmFkZChBKX0pLFVzKGQsbCkpLGQubW9kaWZpZXJzPVsuLi5fXSxkfWZ1bmN0aW9uIFVzKGksbCl7aWYoISFsKXt2YXJ7JHd4c01vZHVsZXM6ZH09bDtpZighIWQpe3ZhciBfPWkudmFsdWUudG9TdHJpbmcoKTshZC5maW5kKEE9Pl8uaW5kZXhPZigiLiIrQSsiLiIpPi0xKXx8KGkud3hzRXZlbnQ9aS52YWx1ZSgpKX19fXZhciBnbD1mdW5jdGlvbihpLGwsZCxfKXt2YXIgQT1hcmd1bWVudHMubGVuZ3RoPjY/YXJndW1lbnRzWzZdOnZvaWQgMDtzd2l0Y2gobCl7Y2FzZSJjbGFzcyI6RHMoaSxfKTticmVhaztjYXNlInN0eWxlIjpqbChpLGQsXyk7YnJlYWs7ZGVmYXVsdDppZihoLmlzT24obCkpaC5pc01vZGVsTGlzdGVuZXIobCl8fEZzKGksbCxkLF8sQSk7ZWxzZXtpZihoLmlzT2JqZWN0KF8pKXt2YXIgQz1kPT09XztpZihfPVIuSlNPTl9QUk9UT0NPTCtKU09OLnN0cmluZ2lmeShfKSxDJiZpLmdldEF0dHJpYnV0ZShsKT09PV8pcmV0dXJufWVsc2UgaWYoZD09PV8pcmV0dXJuO0xzKGksbCxfKX1icmVha319O2Z1bmN0aW9uIHpvKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIkc3R5bGUiO3t2YXIgbD1qbigpO2lmKCFsKXJldHVybiBoLkVNUFRZX09CSjt2YXIgZD1sLnR5cGUuX19jc3NNb2R1bGVzO2lmKCFkKXJldHVybiBoLkVNUFRZX09CSjt2YXIgXz1kW2ldO3JldHVybiBffHxoLkVNUFRZX09CSn19ZnVuY3Rpb24gS2EoaSl7dmFyIGw9am4oKTtpZighIWwpe3ZhciBkPSgpPT5tYShsLnN1YlRyZWUsaShsLnByb3h5KSk7dHIoKCk9Pk5pKGQse2ZsdXNoOiJwb3N0In0pKSxucihkKX19ZnVuY3Rpb24gbWEoaSxsKXtpZihpLnNoYXBlRmxhZyYxMjgpe3ZhciBkPWkuc3VzcGVuc2U7aT1kLmFjdGl2ZUJyYW5jaCxkLnBlbmRpbmdCcmFuY2gmJiFkLmlzSHlkcmF0aW5nJiZkLmVmZmVjdHMucHVzaCgoKT0+e21hKGQuYWN0aXZlQnJhbmNoLGwpfSl9Zm9yKDtpLmNvbXBvbmVudDspaT1pLmNvbXBvbmVudC5zdWJUcmVlO2lmKGkuc2hhcGVGbGFnJjEmJmkuZWwpa2EoaS5lbCxsKTtlbHNlIGlmKGkudHlwZT09PXRlKWkuY2hpbGRyZW4uZm9yRWFjaChDPT5tYShDLGwpKTtlbHNlIGlmKGkudHlwZT09PUllKWZvcih2YXJ7ZWw6XyxhbmNob3I6QX09aTtfJiYoa2EoXyxsKSxfIT09QSk7KV89Xy5uZXh0U2libGluZ31mdW5jdGlvbiBrYShpLGwpe2lmKGkubm9kZVR5cGU9PT0xKWZvcih2YXIgZCBpbiBsKWkuc2V0QXR0cmlidXRlKCItLSIuY29uY2F0KGQpLGxbZF0pfXZhciB5bz0idHJhbnNpdGlvbiIsYWE9ImFuaW1hdGlvbiIsWmE9KGksbCk9Pnt2YXJ7c2xvdHM6ZH09bDtyZXR1cm4gSmkoRHQsSHMoaSksZCl9O1phLmRpc3BsYXlOYW1lPSJUcmFuc2l0aW9uIjt2YXIgJHM9e25hbWU6U3RyaW5nLHR5cGU6U3RyaW5nLGNzczp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LGR1cmF0aW9uOltTdHJpbmcsTnVtYmVyLE9iamVjdF0sZW50ZXJGcm9tQ2xhc3M6U3RyaW5nLGVudGVyQWN0aXZlQ2xhc3M6U3RyaW5nLGVudGVyVG9DbGFzczpTdHJpbmcsYXBwZWFyRnJvbUNsYXNzOlN0cmluZyxhcHBlYXJBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyVG9DbGFzczpTdHJpbmcsbGVhdmVGcm9tQ2xhc3M6U3RyaW5nLGxlYXZlQWN0aXZlQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmd9LHBsPVphLnByb3BzPWguZXh0ZW5kKHt9LER0LnByb3BzLCRzKSxzYT1mdW5jdGlvbihpKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06W107aC5pc0FycmF5KGkpP2kuZm9yRWFjaChkPT5kKC4uLmwpKTppJiZpKC4uLmwpfSxYYT1pPT5pP2guaXNBcnJheShpKT9pLnNvbWUobD0+bC5sZW5ndGg+MSk6aS5sZW5ndGg+MTohMTtmdW5jdGlvbiBIcyhpKXt2YXIgbD17fTtmb3IodmFyIGQgaW4gaSlkIGluICRzfHwobFtkXT1pW2RdKTtpZihpLmNzcz09PSExKXJldHVybiBsO3ZhcntuYW1lOl89InYiLHR5cGU6QSxkdXJhdGlvbjpDLGVudGVyRnJvbUNsYXNzOms9IiIuY29uY2F0KF8sIi1lbnRlci1mcm9tIiksZW50ZXJBY3RpdmVDbGFzczpEPSIiLmNvbmNhdChfLCItZW50ZXItYWN0aXZlIiksZW50ZXJUb0NsYXNzOkg9IiIuY29uY2F0KF8sIi1lbnRlci10byIpLGFwcGVhckZyb21DbGFzczpuZT1rLGFwcGVhckFjdGl2ZUNsYXNzOnZlPUQsYXBwZWFyVG9DbGFzczpCZT1ILGxlYXZlRnJvbUNsYXNzOnVlPSIiLmNvbmNhdChfLCItbGVhdmUtZnJvbSIpLGxlYXZlQWN0aXZlQ2xhc3M6a2U9IiIuY29uY2F0KF8sIi1sZWF2ZS1hY3RpdmUiKSxsZWF2ZVRvQ2xhc3M6R2U9IiIuY29uY2F0KF8sIi1sZWF2ZS10byIpfT1pLHV0PVFhKEMpLFFlPXV0JiZ1dFswXSxSZT11dCYmdXRbMV0se29uQmVmb3JlRW50ZXI6bWUsb25FbnRlcjp5ZSxvbkVudGVyQ2FuY2VsbGVkOkxlLG9uTGVhdmU6T2Usb25MZWF2ZUNhbmNlbGxlZDpidCxvbkJlZm9yZUFwcGVhcjpDdD1tZSxvbkFwcGVhcjpLZT15ZSxvbkFwcGVhckNhbmNlbGxlZDpSdD1MZX09bCxNPShyZSxvZSxVZSk9PntsYShyZSxvZT9CZTpIKSxsYShyZSxvZT92ZTpEKSxVZSYmVWUoKX0saj0ocmUsb2UpPT57bGEocmUsR2UpLGxhKHJlLGtlKSxvZSYmb2UoKX0sc2U9cmU9PihvZSxVZSk9Pnt2YXIgcnQ9cmU/S2U6eWUscWU9KCk9Pk0ob2UscmUsVWUpO3NhKHJ0LFtvZSxxZV0pLHZsKCgpPT57bGEob2UscmU/bmU6ayksTXIob2UscmU/QmU6SCksWGEocnQpfHxqcyhvZSxBLFFlLHFlKX0pfTtyZXR1cm4gaC5leHRlbmQobCx7b25CZWZvcmVFbnRlcihyZSl7c2EobWUsW3JlXSksTXIocmUsayksTXIocmUsRCl9LG9uQmVmb3JlQXBwZWFyKHJlKXtzYShDdCxbcmVdKSxNcihyZSxuZSksTXIocmUsdmUpfSxvbkVudGVyOnNlKCExKSxvbkFwcGVhcjpzZSghMCksb25MZWF2ZShyZSxvZSl7dmFyIFVlPSgpPT5qKHJlLG9lKTtNcihyZSx1ZSksbWwoKSxNcihyZSxrZSksdmwoKCk9PntsYShyZSx1ZSksTXIocmUsR2UpLFhhKE9lKXx8anMocmUsQSxSZSxVZSl9KSxzYShPZSxbcmUsVWVdKX0sb25FbnRlckNhbmNlbGxlZChyZSl7TShyZSwhMSksc2EoTGUsW3JlXSl9LG9uQXBwZWFyQ2FuY2VsbGVkKHJlKXtNKHJlLCEwKSxzYShSdCxbcmVdKX0sb25MZWF2ZUNhbmNlbGxlZChyZSl7aihyZSksc2EoYnQsW3JlXSl9fSl9ZnVuY3Rpb24gUWEoaSl7aWYoaT09bnVsbClyZXR1cm4gbnVsbDtpZihoLmlzT2JqZWN0KGkpKXJldHVyblt0aShpLmVudGVyKSx0aShpLmxlYXZlKV07dmFyIGw9dGkoaSk7cmV0dXJuW2wsbF19ZnVuY3Rpb24gdGkoaSl7dmFyIGw9aC50b051bWJlcihpKTtyZXR1cm4gbH1mdW5jdGlvbiBNcihpLGwpe2wuc3BsaXQoL1xzKy8pLmZvckVhY2goZD0+ZCYmaS5jbGFzc0xpc3QuYWRkKGQpKSwoaS5fdnRjfHwoaS5fdnRjPW5ldyBTZXQpKS5hZGQobCl9ZnVuY3Rpb24gbGEoaSxsKXtsLnNwbGl0KC9ccysvKS5mb3JFYWNoKF89Pl8mJmkuY2xhc3NMaXN0LnJlbW92ZShfKSk7dmFye192dGM6ZH09aTtkJiYoZC5kZWxldGUobCksZC5zaXplfHwoaS5fdnRjPXZvaWQgMCkpfWZ1bmN0aW9uIHZsKGkpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShpKX0pfXZhciB6bD0wO2Z1bmN0aW9uIGpzKGksbCxkLF8pe3ZhciBBPWkuX2VuZElkPSsremwsQz0oKT0+e0E9PT1pLl9lbmRJZCYmXygpfTtpZihkKXJldHVybiBzZXRUaW1lb3V0KEMsZCk7dmFye3R5cGU6ayx0aW1lb3V0OkQscHJvcENvdW50Okh9PWJzKGksbCk7aWYoIWspcmV0dXJuIF8oKTt2YXIgbmU9aysiZW5kIix2ZT0wLEJlPSgpPT57aS5yZW1vdmVFdmVudExpc3RlbmVyKG5lLHVlKSxDKCl9LHVlPWtlPT57a2UudGFyZ2V0PT09aSYmKyt2ZT49SCYmQmUoKX07c2V0VGltZW91dCgoKT0+e3ZlPEgmJkJlKCl9LEQrMSksaS5hZGRFdmVudExpc3RlbmVyKG5lLHVlKX1mdW5jdGlvbiBicyhpLGwpe3ZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGkpLF89R2U9PihkW0dlXXx8IiIpLnNwbGl0KCIsICIpLEE9Xyh5bysiRGVsYXkiKSxDPV8oeW8rIkR1cmF0aW9uIiksaz16cyhBLEMpLEQ9XyhhYSsiRGVsYXkiKSxIPV8oYWErIkR1cmF0aW9uIiksbmU9enMoRCxIKSx2ZT1udWxsLEJlPTAsdWU9MDtsPT09eW8/az4wJiYodmU9eW8sQmU9ayx1ZT1DLmxlbmd0aCk6bD09PWFhP25lPjAmJih2ZT1hYSxCZT1uZSx1ZT1ILmxlbmd0aCk6KEJlPU1hdGgubWF4KGssbmUpLHZlPUJlPjA/az5uZT95bzphYTpudWxsLHVlPXZlP3ZlPT09eW8/Qy5sZW5ndGg6SC5sZW5ndGg6MCk7dmFyIGtlPXZlPT09eW8mJi9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLy50ZXN0KGRbeW8rIlByb3BlcnR5Il0pO3JldHVybnt0eXBlOnZlLHRpbWVvdXQ6QmUscHJvcENvdW50OnVlLGhhc1RyYW5zZm9ybTprZX19ZnVuY3Rpb24genMoaSxsKXtmb3IoO2kubGVuZ3RoPGwubGVuZ3RoOylpPWkuY29uY2F0KGkpO3JldHVybiBNYXRoLm1heCguLi5sLm1hcCgoZCxfKT0+V3MoZCkrV3MoaVtfXSkpKX1mdW5jdGlvbiBXcyhpKXtyZXR1cm4gTnVtYmVyKGkuc2xpY2UoMCwtMSkucmVwbGFjZSgiLCIsIi4iKSkqMWUzfWZ1bmN0aW9uIG1sKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXZhciBHcz1uZXcgV2Vha01hcCx5cz1uZXcgV2Vha01hcCxFcz17bmFtZToiVHJhbnNpdGlvbkdyb3VwIixwcm9wczpoLmV4dGVuZCh7fSxwbCx7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSksc2V0dXAoaSxsKXt2YXJ7c2xvdHM6ZH09bCxfPWpuKCksQT1BcigpLEMsaztyZXR1cm4gbnIoKCk9PntpZighIUMubGVuZ3RoKXt2YXIgRD1pLm1vdmVDbGFzc3x8IiIuY29uY2F0KGkubmFtZXx8InYiLCItbW92ZSIpO2lmKCEhbShDWzBdLmVsLF8udm5vZGUuZWwsRCkpe0MuZm9yRWFjaChibCksQy5mb3JFYWNoKGEpO3ZhciBIPUMuZmlsdGVyKHUpO21sKCksSC5mb3JFYWNoKG5lPT57dmFyIHZlPW5lLmVsLEJlPXZlLnN0eWxlO01yKHZlLEQpLEJlLnRyYW5zZm9ybT1CZS53ZWJraXRUcmFuc2Zvcm09QmUudHJhbnNpdGlvbkR1cmF0aW9uPSIiO3ZhciB1ZT12ZS5fbW92ZUNiPWtlPT57a2UmJmtlLnRhcmdldCE9PXZlfHwoIWtlfHwvdHJhbnNmb3JtJC8udGVzdChrZS5wcm9wZXJ0eU5hbWUpKSYmKHZlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLHVlKSx2ZS5fbW92ZUNiPW51bGwsbGEodmUsRCkpfTt2ZS5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIix1ZSl9KX19fSksKCk9Pnt2YXIgRD15LnRvUmF3KGkpLEg9SHMoRCksbmU9RC50YWd8fHRlO0M9ayxrPWQuZGVmYXVsdD9SaShkLmRlZmF1bHQoKSk6W107Zm9yKHZhciB2ZT0wO3ZlPGsubGVuZ3RoO3ZlKyspe3ZhciBCZT1rW3ZlXTtCZS5rZXkhPW51bGwmJk9yKEJlLF9pKEJlLEgsQSxfKSl9aWYoQylmb3IodmFyIHVlPTA7dWU8Qy5sZW5ndGg7dWUrKyl7dmFyIGtlPUNbdWVdO09yKGtlLF9pKGtlLEgsQSxfKSksR3Muc2V0KGtlLGtlLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX1yZXR1cm4gcXQobmUsbnVsbCxrKX19fSxTcz1pPT5kZWxldGUgaS5tb2RlO0VzLnByb3BzO3ZhciBfbD1FcztmdW5jdGlvbiBibChpKXt2YXIgbD1pLmVsO2wuX21vdmVDYiYmbC5fbW92ZUNiKCksbC5fZW50ZXJDYiYmbC5fZW50ZXJDYigpfWZ1bmN0aW9uIGEoaSl7eXMuc2V0KGksaS5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9ZnVuY3Rpb24gdShpKXt2YXIgbD1Hcy5nZXQoaSksZD15cy5nZXQoaSksXz1sLmxlZnQtZC5sZWZ0LEE9bC50b3AtZC50b3A7aWYoX3x8QSl7dmFyIEM9aS5lbC5zdHlsZTtyZXR1cm4gQy50cmFuc2Zvcm09Qy53ZWJraXRUcmFuc2Zvcm09InRyYW5zbGF0ZSgiLmNvbmNhdChfLCJweCwiKS5jb25jYXQoQSwicHgpIiksQy50cmFuc2l0aW9uRHVyYXRpb249IjBzIixpfX1mdW5jdGlvbiBtKGksbCxkKXt2YXIgXz1pLmNsb25lTm9kZSgpO2kuX3Z0YyYmaS5fdnRjLmZvckVhY2goaz0+e2suc3BsaXQoL1xzKy8pLmZvckVhY2goRD0+RCYmXy5jbGFzc0xpc3QucmVtb3ZlKEQpKX0pLGQuc3BsaXQoL1xzKy8pLmZvckVhY2goaz0+ayYmXy5jbGFzc0xpc3QuYWRkKGspKSxfLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBBPWwubm9kZVR5cGU9PT0xP2w6bC5wYXJlbnROb2RlO0EuYXBwZW5kQ2hpbGQoXyk7dmFye2hhc1RyYW5zZm9ybTpDfT1icyhfKTtyZXR1cm4gQS5yZW1vdmVDaGlsZChfKSxDfXZhciBTPWk9Pnt2YXIgbD1pLnByb3BzWyJvblVwZGF0ZTptb2RlbFZhbHVlIl07cmV0dXJuIGguaXNBcnJheShsKT9kPT5oLmludm9rZUFycmF5Rm5zKGwsZCk6bH0sST17Y3JlYXRlZChpLGwsZCl7dmFye3ZhbHVlOl8sbW9kaWZpZXJzOnt0cmltOkEsbnVtYmVyOkN9fT1sO2kudmFsdWU9Xz09bnVsbD8iIjpfLGkuX2Fzc2lnbj1TKGQpLG1zKGksImlucHV0IixrPT57dmFyIEQ9ay5kZXRhaWwudmFsdWUsSD1pLnBhZ2VOb2RlO2kucGFnZU5vZGU9bnVsbCxpLnZhbHVlPUQsaS5wYWdlTm9kZT1ILEE/RD1ELnRyaW0oKTpDJiYoRD1oLnRvTnVtYmVyKEQpKSxpLl9hc3NpZ24oRCl9KX0sYmVmb3JlVXBkYXRlKGksbCxkKXt2YXJ7dmFsdWU6X309bDtpLl9hc3NpZ249UyhkKTt2YXIgQT1fPT1udWxsPyIiOl87aS52YWx1ZSE9PUEmJihpLnZhbHVlPUEpfX0sTz1JLEY9WyJjdHJsIiwic2hpZnQiLCJhbHQiLCJtZXRhIl0sVz17c3RvcDppPT5pLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6aT0+aS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6aT0+aS50YXJnZXQhPT1pLmN1cnJlbnRUYXJnZXQsY3RybDppPT4haS5jdHJsS2V5LHNoaWZ0Omk9PiFpLnNoaWZ0S2V5LGFsdDppPT4haS5hbHRLZXksbWV0YTppPT4haS5tZXRhS2V5LGxlZnQ6aT0+ImJ1dHRvbiJpbiBpJiZpLmJ1dHRvbiE9PTAsbWlkZGxlOmk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0xLHJpZ2h0Omk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0yLGV4YWN0OihpLGwpPT5GLnNvbWUoZD0+aVsiIi5jb25jYXQoZCwiS2V5IildJiYhbC5pbmNsdWRlcyhkKSl9LEc9KGksbCk9Pnt2YXIgZD1mdW5jdGlvbihfKXtmb3IodmFyIEE9MDtBPGwubGVuZ3RoO0ErKyl7dmFyIEM9V1tsW0FdXTtpZihDJiZDKF8sbCkpcmV0dXJufWZvcih2YXIgaz1hcmd1bWVudHMubGVuZ3RoLEQ9bmV3IEFycmF5KGs+MT9rLTE6MCksSD0xO0g8aztIKyspRFtILTFdPWFyZ3VtZW50c1tIXTtyZXR1cm4gaShfLC4uLkQpfTtyZXR1cm4gZC5tb2RpZmllcnM9bCxkfSxsZT17ZXNjOiJlc2NhcGUiLHNwYWNlOiIgIix1cDoiYXJyb3ctdXAiLGxlZnQ6ImFycm93LWxlZnQiLHJpZ2h0OiJhcnJvdy1yaWdodCIsZG93bjoiYXJyb3ctZG93biIsZGVsZXRlOiJiYWNrc3BhY2UifSxXZT0oaSxsKT0+ZD0+e2lmKCJrZXkiaW4gZCl7dmFyIF89aC5oeXBoZW5hdGUoZC5rZXkpO2lmKGwuc29tZShBPT5BPT09X3x8bGVbQV09PT1fKSlyZXR1cm4gaShkKX19LGl0PXtiZWZvcmVNb3VudChpLGwpe3Zhcnt2YWx1ZTpkfT1sO2dlKGksZCl9LHVwZGF0ZWQoaSxsKXt2YXJ7dmFsdWU6ZCxvbGRWYWx1ZTpffT1sOyFkIT0hXyYmZ2UoaSxkKX0sYmVmb3JlVW5tb3VudChpLGwpe3Zhcnt2YWx1ZTpkfT1sO2dlKGksZCl9fTtmdW5jdGlvbiBnZShpLGwpe2kuc2V0QXR0cmlidXRlKCIudlNob3ciLCEhbCl9dmFyIFllPWguZXh0ZW5kKHtwYXRjaFByb3A6Z2wsZm9yY2VQYXRjaFByb3A6Ui5mb3JjZVBhdGNoUHJvcH0sam8pLEplO2Z1bmN0aW9uIG10KCl7cmV0dXJuIEplfHwoSmU9JGEoWWUpKX12YXIgYXQ9ZnVuY3Rpb24oKXttdCgpLnJlbmRlciguLi5hcmd1bWVudHMpfSxTZT1mdW5jdGlvbigpe3ZhciBpPW10KCkuY3JlYXRlQXBwKC4uLmFyZ3VtZW50cykse21vdW50Omx9PWk7cmV0dXJuIGkubW91bnQ9ZD0+KGguaXNTdHJpbmcoZCkmJihkPXFhKGQpKSxkJiZsKGQsITEsITEpKSxpfSxFZT1TZTtmdW5jdGlvbiBBZSgpe31mdW5jdGlvbiBsdCgpe31mdW5jdGlvbiBWZShpKXtyZXR1cm4gaC5pc09iamVjdChpKT9SLkpTT05fUFJPVE9DT0wrSlNPTi5zdHJpbmdpZnkoaSk6aX12YXIgVHQ9aT0+VmUoaSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJjYW1lbGl6ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FtZWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEUsImNhcGl0YWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoLmNhcGl0YWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEUsIm5vcm1hbGl6ZUNsYXNzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaC5ub3JtYWxpemVDbGFzc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwibm9ybWFsaXplUHJvcHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoLm5vcm1hbGl6ZVByb3BzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJub3JtYWxpemVTdHlsZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgubm9ybWFsaXplU3R5bGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEUsInRvRGlzcGxheVN0cmluZyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgudG9EaXNwbGF5U3RyaW5nfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJ0b0hhbmRsZXJLZXkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoLnRvSGFuZGxlcktleX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwiRWZmZWN0U2NvcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LkVmZmVjdFNjb3BlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJSZWFjdGl2ZUVmZmVjdCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuUmVhY3RpdmVFZmZlY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEUsImN1c3RvbVJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuY3VzdG9tUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJlZmZlY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmVmZmVjdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwiZWZmZWN0U2NvcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmVmZmVjdFNjb3BlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJnZXRDdXJyZW50U2NvcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmdldEN1cnJlbnRTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwiaXNQcm94eSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuaXNQcm94eX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwiaXNSZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuaXNSZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwiaXNSZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuaXNSZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwiaXNSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmlzUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJpc1NoYWxsb3ciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmlzU2hhbGxvd319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwibWFya1JhdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkubWFya1Jhd319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwib25TY29wZURpc3Bvc2UiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5Lm9uU2NvcGVEaXNwb3NlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJwcm94eVJlZnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnByb3h5UmVmc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwicmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnJlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJyZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkucmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEUsInJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkucmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJzaGFsbG93UmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnNoYWxsb3dSZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwic2hhbGxvd1JlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5zaGFsbG93UmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEUsInNoYWxsb3dSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnNoYWxsb3dSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEUsInN0b3AiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnN0b3B9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEUsInRvUmF3Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS50b1Jhd319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwidG9SZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnRvUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLCJ0b1JlZnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnRvUmVmc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwidHJpZ2dlclJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkudHJpZ2dlclJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwidW5yZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnVucmVmfX0pLEUuQmFzZVRyYW5zaXRpb249RHQsRS5CYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycz1YcixFLkNvbW1lbnQ9cGUsRS5GcmFnbWVudD10ZSxFLktlZXBBbGl2ZT1qaSxFLlN0YXRpYz1JZSxFLlN1c3BlbnNlPWtuLEUuVGVsZXBvcnQ9WixFLlRleHQ9Y2UsRS5UcmFuc2l0aW9uPVphLEUuVHJhbnNpdGlvbkdyb3VwPV9sLEUuYXNzZXJ0TnVtYmVyPUl0LEUuY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmc9T3QsRS5jYWxsV2l0aEVycm9ySGFuZGxpbmc9VnQsRS5jbG9uZVZOb2RlPWVpLEUuY29tcGF0VXRpbHM9JG8sRS5jb21wdXRlZD1kcyxFLmNyZWF0ZUFwcD1TZSxFLmNyZWF0ZUJsb2NrPWRuLEUuY3JlYXRlQ29tbWVudD1xYSxFLmNyZWF0ZUNvbW1lbnRWTm9kZT1VbixFLmNyZWF0ZUVsZW1lbnQ9SG8sRS5jcmVhdGVFbGVtZW50QmxvY2s9TXQsRS5jcmVhdGVFbGVtZW50Vk5vZGU9VXQsRS5jcmVhdGVIeWRyYXRpb25SZW5kZXJlcj1IYSxFLmNyZWF0ZVByb3BzUmVzdFByb3h5PUVyLEUuY3JlYXRlUmVuZGVyZXI9JGEsRS5jcmVhdGVTU1JBcHA9RWUsRS5jcmVhdGVTbG90cz1RLEUuY3JlYXRlU3RhdGljVk5vZGU9amEsRS5jcmVhdGVUZXh0Tm9kZT1vYSxFLmNyZWF0ZVRleHRWTm9kZT1xaSxFLmNyZWF0ZVZOb2RlPXF0LEUuY3JlYXRlVnVlQXBwPVNlLEUuZGVmaW5lQXN5bmNDb21wb25lbnQ9YWksRS5kZWZpbmVDb21wb25lbnQ9VHIsRS5kZWZpbmVFbWl0cz14cyxFLmRlZmluZUV4cG9zZT1ocyxFLmRlZmluZVByb3BzPVZvLEUuZ2V0Q3VycmVudEluc3RhbmNlPWpuLEUuZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuPVJpLEUuZ3VhcmRSZWFjdGl2ZVByb3BzPWNpLEUuaD1KaSxFLmhhbmRsZUVycm9yPVAsRS5pbml0Q3VzdG9tRm9ybWF0dGVyPWlhLEUuaW5qZWN0PVpuLEUuaW5qZWN0SG9vaz1tcixFLmlzTWVtb1NhbWU9cHMsRS5pc1J1bnRpbWVPbmx5PVdyLEUuaXNWTm9kZT1HdCxFLm1lcmdlRGVmYXVsdHM9d24sRS5tZXJnZVByb3BzPXlyLEUubmV4dFRpY2s9Z3IsRS5vbkFjdGl2YXRlZD10byxFLm9uQmVmb3JlQWN0aXZhdGU9QWUsRS5vbkJlZm9yZURlYWN0aXZhdGU9bHQsRS5vbkJlZm9yZU1vdW50PWVyLEUub25CZWZvcmVVbm1vdW50PWNyLEUub25CZWZvcmVVcGRhdGU9R24sRS5vbkRlYWN0aXZhdGVkPUVuLEUub25FcnJvckNhcHR1cmVkPWtvLEUub25Nb3VudGVkPXRyLEUub25SZW5kZXJUcmFja2VkPW5vLEUub25SZW5kZXJUcmlnZ2VyZWQ9Tm8sRS5vblNlcnZlclByZWZldGNoPWdvLEUub25Vbm1vdW50ZWQ9aG8sRS5vblVwZGF0ZWQ9bnIsRS5vcGVuQmxvY2s9Y3QsRS5wb3BTY29wZUlkPWRhLEUucHJvdmlkZT1ObixFLnB1c2hTY29wZUlkPXdvLEUucXVldWVQb3N0Rmx1c2hDYj12aSxFLnJlZ2lzdGVyUnVudGltZUNvbXBpbGVyPWZzLEUucmVuZGVyPWF0LEUucmVuZGVyTGlzdD1CLEUucmVuZGVyU2xvdD1oZSxFLnJlc29sdmVDb21wb25lbnQ9cm8sRS5yZXNvbHZlRGlyZWN0aXZlPU1pLEUucmVzb2x2ZUR5bmFtaWNDb21wb25lbnQ9dm8sRS5yZXNvbHZlRmlsdGVyPU1zLEUucmVzb2x2ZVRyYW5zaXRpb25Ib29rcz1faSxFLnNldEJsb2NrVHJhY2tpbmc9eXQsRS5zZXREZXZ0b29sc0hvb2s9c24sRS5zZXRUcmFuc2l0aW9uSG9va3M9T3IsRS5zc3JDb250ZXh0S2V5PVVvLEUuc3NyVXRpbHM9SGwsRS50b0hhbmRsZXJzPWRlLEUudHJhbnNmb3JtVk5vZGVBcmdzPWVuLEUudXNlQXR0cnM9TnQsRS51c2VDc3NNb2R1bGU9em8sRS51c2VDc3NWYXJzPUthLEUudXNlU1NSQ29udGV4dD1OYSxFLnVzZVNsb3RzPXhlLEUudXNlVHJhbnNpdGlvblN0YXRlPUFyLEUudk1vZGVsRHluYW1pYz1PLEUudk1vZGVsVGV4dD1JLEUudlNob3c9aXQsRS52ZXJzaW9uPWRsLEUud2Fybj1GZSxFLndhdGNoPXZyLEUud2F0Y2hFZmZlY3Q9TmksRS53YXRjaFBvc3RFZmZlY3Q9SGksRS53YXRjaFN5bmNFZmZlY3Q9b2ksRS53aXRoQXN5bmNDb250ZXh0PU9pLEUud2l0aEN0eD1abyxFLndpdGhEZWZhdWx0cz1CcyxFLndpdGhEaXJlY3RpdmVzPWpyLEUud2l0aEtleXM9V2UsRS53aXRoTWVtbz1ncyxFLndpdGhNb2RpZmllcnM9RyxFLndpdGhTY29wZUlkPVVpLEUud3A9VHQsT2JqZWN0LmRlZmluZVByb3BlcnR5KEUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLEV9KHt9LHAsdyxzKTtyZXR1cm4gTi5fX1RZUEVfXz0idnVlIixOfWZ1bmN0aW9uIGx2KGYscyxwKXtsZXQgdz1wLlZ1ZSxOPXAuc2V0VGltZW91dCxFPXAuY2xlYXJUaW1lb3V0LGg9cC5zZXRJbnRlcnZhbCx5PXAuY2xlYXJJbnRlcnZhbCxSPXAuX191bmlDb25maWcsRmU9cC5fX3VuaVJvdXRlcyxJdD1wLlZ1ZVNoYXJlZCxWdD1wLlVuaVNoYXJlZDt2YXIgT3Q9ZnVuY3Rpb24oeixKLGhuKXsidXNlIHN0cmljdCI7dmFyIHVuPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIix5bj1mdW5jdGlvbigpe2xldCBlPW5ldyBVaW50OEFycmF5KDI1Nik7Zm9yKHZhciB0PTA7dDx1bi5sZW5ndGg7dCsrKWVbdW4uY2hhckNvZGVBdCh0KV09dDtyZXR1cm4gZX0oKTtmdW5jdGlvbiBKbihlKXt2YXIgdD1uZXcgVWludDhBcnJheShlKSxuLHI9dC5sZW5ndGgsbz0iIjtmb3Iobj0wO248cjtuKz0zKW8rPXVuW3Rbbl0+PjJdLG8rPXVuWyh0W25dJjMpPDw0fHRbbisxXT4+NF0sbys9dW5bKHRbbisxXSYxNSk8PDJ8dFtuKzJdPj42XSxvKz11blt0W24rMl0mNjNdO3JldHVybiByJTM9PT0yP289by5zdWJzdHJpbmcoMCxvLmxlbmd0aC0xKSsiPSI6ciUzPT09MSYmKG89by5zdWJzdHJpbmcoMCxvLmxlbmd0aC0yKSsiPT0iKSxvfWZ1bmN0aW9uIGdpKGUpe3ZhciB0PWUubGVuZ3RoKi43NSxuPWUubGVuZ3RoLHIsbz0wLGMsZyxiLFY7ZVtlLmxlbmd0aC0xXT09PSI9IiYmKHQtLSxlW2UubGVuZ3RoLTJdPT09Ij0iJiZ0LS0pO3ZhciBUPW5ldyBBcnJheUJ1ZmZlcih0KSxMPW5ldyBVaW50OEFycmF5KFQpO2ZvcihyPTA7cjxuO3IrPTQpYz15bltlLmNoYXJDb2RlQXQocildLGc9eW5bZS5jaGFyQ29kZUF0KHIrMSldLGI9eW5bZS5jaGFyQ29kZUF0KHIrMildLFY9eW5bZS5jaGFyQ29kZUF0KHIrMyldLExbbysrXT1jPDwyfGc+PjQsTFtvKytdPShnJjE1KTw8NHxiPj4yLExbbysrXT0oYiYzKTw8NnxWJjYzO3JldHVybiBUfWxldCBwaT1bIm9yaWdpbmFsIiwiY29tcHJlc3NlZCJdLHFyPVsiYWxidW0iLCJjYW1lcmEiXSxncj1bIkdFVCIsIk9QVElPTlMiLCJIRUFEIiwiUE9TVCIsIlBVVCIsIkRFTEVURSIsIlRSQUNFIiwiQ09OTkVDVCIsIlBBVENIIl07ZnVuY3Rpb24gU24oZSx0KXtyZXR1cm4hZXx8dC5pbmRleE9mKGUpPT09LTE/dFswXTplfWZ1bmN0aW9uIHByKGUsdCl7cmV0dXJuIXouaXNBcnJheShlKXx8ZS5sZW5ndGg9PT0wfHxlLmZpbmQobj0+dC5pbmRleE9mKG4pPT09LTEpP3Q6ZX1mdW5jdGlvbiBMcihlLHQpe2NvbnNvbGUud2FybihgJHtlfTogJHt0fWApfWZ1bmN0aW9uIEpyKGUsdCxuLHIpe3J8fChyPUxyKTtmb3IobGV0IG8gaW4gbil7bGV0IGM9UG4obyx0W29dLG5bb10sIXouaGFzT3duKHQsbykpO3ouaXNTdHJpbmcoYykmJnIoZSxjKX19ZnVuY3Rpb24gdmkoZSx0LG4scil7aWYoIW4pcmV0dXJuO2lmKCF6LmlzQXJyYXkobikpcmV0dXJuIEpyKGUsdFswXXx8T2JqZWN0LmNyZWF0ZShudWxsKSxuLHIpO2xldCBvPW4ubGVuZ3RoLGM9dC5sZW5ndGg7Zm9yKGxldCBnPTA7ZzxvO2crKyl7bGV0IGI9bltnXSxWPU9iamVjdC5jcmVhdGUobnVsbCk7Yz5nJiYoVltiLm5hbWVdPXRbZ10pLEpyKGUsVix7W2IubmFtZV06Yn0scil9fWZ1bmN0aW9uIFBuKGUsdCxuLHIpe3ouaXNQbGFpbk9iamVjdChuKXx8KG49e3R5cGU6bn0pO2xldHt0eXBlOm8scmVxdWlyZWQ6Yyx2YWxpZGF0b3I6Z309bjtpZihjJiZyKXJldHVybidNaXNzaW5nIHJlcXVpcmVkIGFyZ3M6ICInK2UrJyInO2lmKCEodD09bnVsbCYmIWMpKXtpZihvIT1udWxsKXtsZXQgYj0hMSxWPXouaXNBcnJheShvKT9vOltvXSxUPVtdO2ZvcihsZXQgTD0wO0w8Vi5sZW5ndGgmJiFiO0wrKyl7bGV0e3ZhbGlkOl9lLGV4cGVjdGVkVHlwZTp3ZX09bnQodCxWW0xdKTtULnB1c2god2V8fCIiKSxiPV9lfWlmKCFiKXJldHVybiBBdChlLHQsVCl9aWYoZylyZXR1cm4gZyh0KX19bGV0IHplPXoubWFrZU1hcCgiU3RyaW5nLE51bWJlcixCb29sZWFuLEZ1bmN0aW9uLFN5bWJvbCIpO2Z1bmN0aW9uIG50KGUsdCl7bGV0IG4scj1RdCh0KTtpZih6ZShyKSl7bGV0IG89dHlwZW9mIGU7bj1vPT09ci50b0xvd2VyQ2FzZSgpLCFuJiZvPT09Im9iamVjdCImJihuPWUgaW5zdGFuY2VvZiB0KX1lbHNlIHI9PT0iT2JqZWN0Ij9uPXouaXNPYmplY3QoZSk6cj09PSJBcnJheSI/bj16LmlzQXJyYXkoZSk6bj1lIGluc3RhbmNlb2YgdHx8ei50b1Jhd1R5cGUoZSk9PT1RdCh0KTtyZXR1cm57dmFsaWQ6bixleHBlY3RlZFR5cGU6cn19ZnVuY3Rpb24gQXQoZSx0LG4pe2xldCByPWBJbnZhbGlkIGFyZ3M6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBhcmdzICIke2V9Ii4gRXhwZWN0ZWQgJHtuLm1hcCh6LmNhcGl0YWxpemUpLmpvaW4oIiwgIil9YCxvPW5bMF0sYz16LnRvUmF3VHlwZSh0KSxnPVRuKHQsbyksYj1Ubih0LGMpO3JldHVybiBuLmxlbmd0aD09PTEmJnNuKG8pJiYhb3IobyxjKSYmKHIrPWAgd2l0aCB2YWx1ZSAke2d9YCkscis9YCwgZ290ICR7Y30gYCxzbihjKSYmKHIrPWB3aXRoIHZhbHVlICR7Yn0uYCkscn1mdW5jdGlvbiBRdChlKXtsZXQgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvbiAoXHcrKS8pO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gVG4oZSx0KXtyZXR1cm4gdD09PSJTdHJpbmciP2AiJHtlfSJgOnQ9PT0iTnVtYmVyIj9gJHtOdW1iZXIoZSl9YDpgJHtlfWB9ZnVuY3Rpb24gc24oZSl7cmV0dXJuWyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl0uc29tZShuPT5lLnRvTG93ZXJDYXNlKCk9PT1uKX1mdW5jdGlvbiBvciguLi5lKXtyZXR1cm4gZS5zb21lKHQ9PnQudG9Mb3dlckNhc2UoKT09PSJib29sZWFuIil9ZnVuY3Rpb24gV24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpfX19bGV0IEFuPTEsZ249e307ZnVuY3Rpb24gd3IoZSx0LG4scj0hMSl7cmV0dXJuIGduW2VdPXtuYW1lOnQsa2VlcEFsaXZlOnIsY2FsbGJhY2s6bn0sZX1mdW5jdGlvbiBLcihlLHQsbil7aWYodHlwZW9mIGU9PSJudW1iZXIiKXtsZXQgcj1nbltlXTtpZihyKXJldHVybiByLmtlZXBBbGl2ZXx8ZGVsZXRlIGduW2VdLHIuY2FsbGJhY2sodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiB3byhlKXtmb3IobGV0IHQgaW4gZ24paWYoZ25bdF0ubmFtZT09PWUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZGEoZSx0KXtmb3IobGV0IG4gaW4gZ24pe2xldCByPWduW25dO3IuY2FsbGJhY2s9PT10JiZyLm5hbWU9PT1lJiZkZWxldGUgZ25bbl19fWZ1bmN0aW9uIFVpKGUpe290Lm9mZigiYXBpLiIrZSl9ZnVuY3Rpb24gWm8oZSl7b3Qub24oImFwaS4iK2UsdD0+e2ZvcihsZXQgbiBpbiBnbil7bGV0IHI9Z25bbl07ci5uYW1lPT09ZSYmci5jYWxsYmFjayh0KX19KX1mdW5jdGlvbiBYbyhlLHQpe3JldHVybiB3cihBbisrLGUsdCwhMCl9bGV0ICRpPSJzdWNjZXNzIixyaT0iZmFpbCIsQ289ImNvbXBsZXRlIjtmdW5jdGlvbiBBbyhlKXtsZXQgdD17fTtmb3IobGV0IG4gaW4gZSl7bGV0IHI9ZVtuXTt6LmlzRnVuY3Rpb24ocikmJih0W25dPVduKHIpLGRlbGV0ZSBlW25dKX1yZXR1cm4gdH1mdW5jdGlvbiBPbyhlLHQpe3JldHVybiFlfHxlLmluZGV4T2YoIjpmYWlsIik9PT0tMT90KyI6b2siOnQrZS5zdWJzdHJpbmcoZS5pbmRleE9mKCI6ZmFpbCIpKX1mdW5jdGlvbiBYaShlLHQ9e30se2JlZm9yZUFsbDpuLGJlZm9yZVN1Y2Nlc3M6cn09e30pe3ouaXNQbGFpbk9iamVjdCh0KXx8KHQ9e30pO2xldHtzdWNjZXNzOm8sZmFpbDpjLGNvbXBsZXRlOmd9PUFvKHQpLGI9ei5pc0Z1bmN0aW9uKG8pLFY9ei5pc0Z1bmN0aW9uKGMpLFQ9ei5pc0Z1bmN0aW9uKGcpLEw9QW4rKztyZXR1cm4gd3IoTCxlLF9lPT57X2U9X2V8fHt9LF9lLmVyck1zZz1PbyhfZS5lcnJNc2csZSksei5pc0Z1bmN0aW9uKG4pJiZuKF9lKSxfZS5lcnJNc2c9PT1lKyI6b2siPyh6LmlzRnVuY3Rpb24ocikmJnIoX2UsdCksYiYmbyhfZSkpOlYmJmMoX2UpLFQmJmcoX2UpfSksTH1sZXQgbWk9InN1Y2Nlc3MiLFRvPSJmYWlsIix1bz0iY29tcGxldGUiLGtuPXt9LENyPXt9O2Z1bmN0aW9uIFFpKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlKG4sdCl8fG59fWZ1bmN0aW9uIEtuKGUsdCxuKXtsZXQgcj0hMTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7bGV0IGM9ZVtvXTtpZihyKXI9UHJvbWlzZS5yZXNvbHZlKFFpKGMsbikpO2Vsc2V7bGV0IGc9Yyh0LG4pO2lmKHouaXNQcm9taXNlKGcpJiYocj1Qcm9taXNlLnJlc29sdmUoZykpLGc9PT0hMSlyZXR1cm57dGhlbigpe30sY2F0Y2goKXt9fX19cmV0dXJuIHJ8fHt0aGVuKG8pe3JldHVybiBvKHQpfSxjYXRjaCgpe319fWZ1bmN0aW9uIGVvKGUsdD17fSl7cmV0dXJuW21pLFRvLHVvXS5mb3JFYWNoKG49PntsZXQgcj1lW25dO2lmKCF6LmlzQXJyYXkocikpcmV0dXJuO2xldCBvPXRbbl07dFtuXT1mdW5jdGlvbihnKXtLbihyLGcsdCkudGhlbihiPT56LmlzRnVuY3Rpb24obykmJm8oYil8fGIpfX0pLHR9ZnVuY3Rpb24gUG8oZSx0KXtsZXQgbj1bXTt6LmlzQXJyYXkoa24ucmV0dXJuVmFsdWUpJiZuLnB1c2goLi4ua24ucmV0dXJuVmFsdWUpO2xldCByPUNyW2VdO3JldHVybiByJiZ6LmlzQXJyYXkoci5yZXR1cm5WYWx1ZSkmJm4ucHVzaCguLi5yLnJldHVyblZhbHVlKSxuLmZvckVhY2gobz0+e3Q9byh0KXx8dH0pLHR9ZnVuY3Rpb24gZm8oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtPYmplY3Qua2V5cyhrbikuZm9yRWFjaChyPT57ciE9PSJyZXR1cm5WYWx1ZSImJih0W3JdPWtuW3JdLnNsaWNlKCkpfSk7bGV0IG49Q3JbZV07cmV0dXJuIG4mJk9iamVjdC5rZXlzKG4pLmZvckVhY2gocj0+e3IhPT0icmV0dXJuVmFsdWUiJiYodFtyXT0odFtyXXx8W10pLmNvbmNhdChuW3JdKSl9KSx0fWZ1bmN0aW9uIGlpKGUsdCxuLHIpe2xldCBvPWZvKGUpO3JldHVybiBvJiZPYmplY3Qua2V5cyhvKS5sZW5ndGg/ei5pc0FycmF5KG8uaW52b2tlKT9LbihvLmludm9rZSxuKS50aGVuKGc9PnQoZW8oZm8oZSksZyksLi4ucikpOnQoZW8obyxuKSwuLi5yKTp0KG4sLi4ucil9ZnVuY3Rpb24gYXIoZSl7cmV0dXJuISEoei5pc1BsYWluT2JqZWN0KGUpJiZbJGkscmksQ29dLmZpbmQodD0+ei5pc0Z1bmN0aW9uKGVbdF0pKSl9ZnVuY3Rpb24ga3IoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gTm4oZSx0KXtyZXR1cm4obj17fSwuLi5yKT0+YXIobik/UG8oZSxpaShlLHQsbixyKSk6UG8oZSxuZXcgUHJvbWlzZSgobyxjKT0+e2lpKGUsdCx6LmV4dGVuZChuLHtzdWNjZXNzOm8sZmFpbDpjfSkscil9KSl9ZnVuY3Rpb24gWm4oZSx0KXtsZXQgbj1lWzBdO2lmKCF0fHwhei5pc1BsYWluT2JqZWN0KHQuZm9ybWF0QXJncykmJnouaXNQbGFpbk9iamVjdChuKSlyZXR1cm47bGV0IHI9dC5mb3JtYXRBcmdzLG89T2JqZWN0LmtleXMocik7Zm9yKGxldCBjPTA7YzxvLmxlbmd0aDtjKyspe2xldCBnPW9bY10sYj1yW2ddO2lmKHouaXNGdW5jdGlvbihiKSl7bGV0IFY9YihlWzBdW2ddLG4pO2lmKHouaXNTdHJpbmcoVikpcmV0dXJuIFZ9ZWxzZSB6Lmhhc093bihuLGcpfHwobltnXT1iKX19ZnVuY3Rpb24gTmkoZSx0LG4pe3JldHVybiBLcihlLHouZXh0ZW5kKG58fHt9LHtlcnJNc2c6dCsiOm9rIn0pKX1mdW5jdGlvbiBIaShlLHQsbixyKXtyZXR1cm4gS3IoZSx6LmV4dGVuZCh7ZXJyTXNnOnQrIjpmYWlsIisobj8iICIrbjoiIil9LHIpKX1mdW5jdGlvbiBvaShlLHQsbixyKXtpZihyJiZyLmJlZm9yZUludm9rZSl7bGV0IGM9ci5iZWZvcmVJbnZva2UodCk7aWYoei5pc1N0cmluZyhjKSlyZXR1cm4gY31sZXQgbz1abih0LHIpO2lmKG8pcmV0dXJuIG99ZnVuY3Rpb24gRnIoZSl7aWYoIXouaXNGdW5jdGlvbihlKSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJnczogdHlwZSBjaGVjayBmYWlsZWQgZm9yIGFyZ3MgImNhbGxiYWNrIi4gRXhwZWN0ZWQgRnVuY3Rpb24nKX1mdW5jdGlvbiB2cihlLHQsbil7cmV0dXJuIHI9PntGcihyKTtsZXQgbz1vaShlLFtyXSx2b2lkIDAsbik7aWYobyl0aHJvdyBuZXcgRXJyb3Iobyk7bGV0IGM9IXdvKGUpO1hvKGUsciksYyYmKFpvKGUpLHQoKSl9fWZ1bmN0aW9uIGtpKGUsdCxuKXtyZXR1cm4gcj0+e0ZyKHIpO2xldCBvPW9pKGUsW3JdLHZvaWQgMCxuKTtpZihvKXRocm93IG5ldyBFcnJvcihvKTtlPWUucmVwbGFjZSgib2ZmIiwib24iKSxkYShlLHIpLHdvKGUpfHwoVWkoZSksdCgpKX19ZnVuY3Rpb24gSW8oZSl7cmV0dXJuIWV8fHouaXNTdHJpbmcoZSk/ZTplLnN0YWNrPyhjb25zb2xlLmVycm9yKGUubWVzc2FnZStKLkxJTkVGRUVEK2Uuc3RhY2spLGUubWVzc2FnZSk6ZX1mdW5jdGlvbiBWcihlLHQsbixyKXtyZXR1cm4gbz0+e2xldCBjPVhpKGUsbyxyKSxnPW9pKGUsW29dLG4scik7cmV0dXJuIGc/SGkoYyxlLGcpOnQobyx7cmVzb2x2ZTpiPT5OaShjLGUsYikscmVqZWN0OihiLFYpPT5IaShjLGUsSW8oYiksVil9KX19ZnVuY3Rpb24gWnIoZSx0LG4scil7cmV0dXJuKC4uLm8pPT57bGV0IGM9b2koZSxvLG4scik7aWYoYyl0aHJvdyBuZXcgRXJyb3IoYyk7cmV0dXJuIHQuYXBwbHkobnVsbCxvKX19ZnVuY3Rpb24gQXIoZSx0LG4scil7cmV0dXJuIFZyKGUsdCxuLHIpfWZ1bmN0aW9uIHBuKGUsdCxuKXtyZXR1cm4gdnIoZSx0LG4pfWZ1bmN0aW9uIFhyKGUsdCxuKXtyZXR1cm4ga2koZSx0LG4pfWZ1bmN0aW9uIFVyKGUsdCxuLHIpe3JldHVybiBObihlLFZyKGUsdCx2b2lkIDAscikpfWZ1bmN0aW9uIER0KGUsdCxuLHIpe3JldHVybiBacihlLHQsdm9pZCAwLHIpfWZ1bmN0aW9uIFRlKGUsdCxuLHIpe3JldHVybiBObihlLEFyKGUsdCx2b2lkIDAscikpfWxldCBfaT0iYmFzZTY0VG9BcnJheUJ1ZmZlciIsYmk9W3tuYW1lOiJiYXNlNjQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0seWk9ImFycmF5QnVmZmVyVG9CYXNlNjQiLE9yPVt7bmFtZToiYXJyYXlCdWZmZXIiLHR5cGU6W0FycmF5QnVmZmVyLFVpbnQ4QXJyYXldLHJlcXVpcmVkOiEwfV0sUmk9RHQoX2ksZT0+Z2koZSksYmkpLFRyPUR0KHlpLGU9PkpuKGUpLE9yKTtmdW5jdGlvbiBScigpe2lmKHR5cGVvZiBfX1NZU1RFTV9JTkZPX18hPSJ1bmRlZmluZWQiKXJldHVybiB3aW5kb3cuX19TWVNURU1fSU5GT19fO2xldHtyZXNvbHV0aW9uV2lkdGg6ZX09cy5zY3JlZW4uZ2V0Q3VycmVudFNpemUoKXx8e3Jlc29sdXRpb25XaWR0aDowfTtyZXR1cm57cGxhdGZvcm06KHMub3MubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCkscGl4ZWxSYXRpbzpzLnNjcmVlbi5zY2FsZSx3aW5kb3dXaWR0aDpNYXRoLnJvdW5kKGUpfX1mdW5jdGlvbiBhaShlLHQsbil7ZS4kcGFnZS5tZXRhLmlzTlZ1ZT9FaShlLHQsbik6UHIoZSx0LG4pfWZ1bmN0aW9uIFByKGUsdCxuKXtvdC5pbnZva2VWaWV3TWV0aG9kKCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIse3JlcXM6dC5tYXAocj0+KHIuY29tcG9uZW50JiYoci5jb21wb25lbnQ9ci5jb21wb25lbnQuJGVsLm5vZGVJZCkscikpfSxlLiRwYWdlLmlkLG4pfWZ1bmN0aW9uIEVpKGUsdCxuKXtsZXQgcj1mbih0KSxvPW5ldyBBcnJheShyLmxlbmd0aCk7amkocixlLiRlbCxvKSwkcihlLiRyZXF1aXJlTmF0aXZlUGx1Z2luKCJkb20iKSxvLDAsW10sYz0+e24oYyl9KX1mdW5jdGlvbiBmbihlKXtsZXQgdD1bXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXS5zZWxlY3RvcjtyLmluZGV4T2YoIiMiKT09PTAmJnQucHVzaChyLnN1YnN0cmluZygxKSl9cmV0dXJuIHR9ZnVuY3Rpb24gamkoZSx0LG4pe2xldCByPXQuY2hpbGRyZW47aWYoIXouaXNBcnJheShyKSlyZXR1cm4hMTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7bGV0IGM9cltvXTtpZihjLmF0dHIpe2xldCBnPWUuaW5kZXhPZihjLmF0dHIuaWQpO2lmKGc+PTAmJihuW2ddPXtpZDplW2ddLHJlZjpjLnJlZixkYXRhc2V0OkoucGFyc2VOVnVlRGF0YXNldChjLmF0dHIpfSxlLmxlbmd0aD09PTEpKWJyZWFrfWMuY2hpbGRyZW4mJmppKGUsYyxuKX19ZnVuY3Rpb24gJHIoZSx0LG4scixvKXtsZXQgYz10W25dO2UuZ2V0Q29tcG9uZW50UmVjdChjLnJlZixnPT57Zy5zaXplLmlkPWMuaWQsZy5zaXplLmRhdGFzZXQ9Yy5kYXRhc2V0LHIucHVzaChnLnNpemUpLG4rPTEsbjx0Lmxlbmd0aD8kcihlLHQsbixyLG8pOm8ocil9KX1mdW5jdGlvbiB0byhlLHQpe290Lmludm9rZVZpZXdNZXRob2QoInNldFBhZ2VNZXRhIix0LGUuJHBhZ2UuaWQpfWxldCBFbj1lPT5lIT09bnVsbCYmdHlwZW9mIGU9PSJvYmplY3QiLEhyPVsieyIsIn0iXTtjbGFzcyBzcntjb25zdHJ1Y3Rvcigpe3RoaXMuX2NhY2hlcz1PYmplY3QuY3JlYXRlKG51bGwpfWludGVycG9sYXRlKHQsbixyPUhyKXtpZighbilyZXR1cm5bdF07bGV0IG89dGhpcy5fY2FjaGVzW3RdO3JldHVybiBvfHwobz1tcih0LHIpLHRoaXMuX2NhY2hlc1t0XT1vKSxRcihvLG4pfX1sZXQgU2k9L14oPzpcZCkrLyx4aT0vXig/Olx3KSsvO2Z1bmN0aW9uIG1yKGUsW3Qsbl0pe2xldCByPVtdLG89MCxjPSIiO2Zvcig7bzxlLmxlbmd0aDspe2xldCBnPWVbbysrXTtpZihnPT09dCl7YyYmci5wdXNoKHt0eXBlOiJ0ZXh0Iix2YWx1ZTpjfSksYz0iIjtsZXQgYj0iIjtmb3IoZz1lW28rK107ZyE9PXZvaWQgMCYmZyE9PW47KWIrPWcsZz1lW28rK107bGV0IFY9Zz09PW4sVD1TaS50ZXN0KGIpPyJsaXN0IjpWJiZ4aS50ZXN0KGIpPyJuYW1lZCI6InVua25vd24iO3IucHVzaCh7dmFsdWU6Yix0eXBlOlR9KX1lbHNlIGMrPWd9cmV0dXJuIGMmJnIucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6Y30pLHJ9ZnVuY3Rpb24gUXIoZSx0KXtsZXQgbj1bXSxyPTAsbz1BcnJheS5pc0FycmF5KHQpPyJsaXN0IjpFbih0KT8ibmFtZWQiOiJ1bmtub3duIjtpZihvPT09InVua25vd24iKXJldHVybiBuO2Zvcig7cjxlLmxlbmd0aDspe2xldCBjPWVbcl07c3dpdGNoKGMudHlwZSl7Y2FzZSJ0ZXh0IjpuLnB1c2goYy52YWx1ZSk7YnJlYWs7Y2FzZSJsaXN0IjpuLnB1c2godFtwYXJzZUludChjLnZhbHVlLDEwKV0pO2JyZWFrO2Nhc2UibmFtZWQiOm89PT0ibmFtZWQiJiZuLnB1c2godFtjLnZhbHVlXSk7YnJlYWs7Y2FzZSJ1bmtub3duIjpicmVha31yKyt9cmV0dXJuIG59bGV0IGVyPSJ6aC1IYW5zIix0cj0iemgtSGFudCIsR249ImVuIixucj0iZnIiLGNyPSJlcyIsaG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxnbz0oZSx0KT0+aG8uY2FsbChlLHQpLE5vPW5ldyBzcjtmdW5jdGlvbiBubyhlLHQpe3JldHVybiEhdC5maW5kKG49PmUuaW5kZXhPZihuKSE9PS0xKX1mdW5jdGlvbiBrbyhlLHQpe3JldHVybiB0LmZpbmQobj0+ZS5pbmRleE9mKG4pPT09MCl9ZnVuY3Rpb24ganIoZSx0KXtpZighZSlyZXR1cm47aWYoZT1lLnRyaW0oKS5yZXBsYWNlKC9fL2csIi0iKSx0JiZ0W2VdKXJldHVybiBlO2lmKGU9ZS50b0xvd2VyQ2FzZSgpLGU9PT0iY2hpbmVzZSIpcmV0dXJuIGVyO2lmKGUuaW5kZXhPZigiemgiKT09PTApcmV0dXJuIGUuaW5kZXhPZigiLWhhbnMiKT4tMT9lcjplLmluZGV4T2YoIi1oYW50Iik+LTF8fG5vKGUsWyItdHciLCItaGsiLCItbW8iLCItY2h0Il0pP3RyOmVyO2xldCBuPVtHbixucixjcl07dCYmT2JqZWN0LmtleXModCkubGVuZ3RoPjAmJihuPU9iamVjdC5rZXlzKHQpKTtsZXQgcj1rbyhlLG4pO2lmKHIpcmV0dXJuIHJ9Y2xhc3MgeHJ7Y29uc3RydWN0b3Ioe2xvY2FsZTp0LGZhbGxiYWNrTG9jYWxlOm4sbWVzc2FnZXM6cix3YXRjaGVyOm8sZm9ybWF0ZXI6Y30pe3RoaXMubG9jYWxlPUduLHRoaXMuZmFsbGJhY2tMb2NhbGU9R24sdGhpcy5tZXNzYWdlPXt9LHRoaXMubWVzc2FnZXM9e30sdGhpcy53YXRjaGVycz1bXSxuJiYodGhpcy5mYWxsYmFja0xvY2FsZT1uKSx0aGlzLmZvcm1hdGVyPWN8fE5vLHRoaXMubWVzc2FnZXM9cnx8e30sdGhpcy5zZXRMb2NhbGUodHx8R24pLG8mJnRoaXMud2F0Y2hMb2NhbGUobyl9c2V0TG9jYWxlKHQpe2xldCBuPXRoaXMubG9jYWxlO3RoaXMubG9jYWxlPWpyKHQsdGhpcy5tZXNzYWdlcyl8fHRoaXMuZmFsbGJhY2tMb2NhbGUsdGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV18fCh0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXT17fSksdGhpcy5tZXNzYWdlPXRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdLG4hPT10aGlzLmxvY2FsZSYmdGhpcy53YXRjaGVycy5mb3JFYWNoKHI9PntyKHRoaXMubG9jYWxlLG4pfSl9Z2V0TG9jYWxlKCl7cmV0dXJuIHRoaXMubG9jYWxlfXdhdGNoTG9jYWxlKHQpe2xldCBuPXRoaXMud2F0Y2hlcnMucHVzaCh0KS0xO3JldHVybigpPT57dGhpcy53YXRjaGVycy5zcGxpY2UobiwxKX19YWRkKHQsbixyPSEwKXtsZXQgbz10aGlzLm1lc3NhZ2VzW3RdO28/cj9PYmplY3QuYXNzaWduKG8sbik6T2JqZWN0LmtleXMobikuZm9yRWFjaChjPT57Z28obyxjKXx8KG9bY109bltjXSl9KTp0aGlzLm1lc3NhZ2VzW3RdPW59Zih0LG4scil7cmV0dXJuIHRoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUodCxuLHIpLmpvaW4oIiIpfXQodCxuLHIpe2xldCBvPXRoaXMubWVzc2FnZTtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmciPyhuPWpyKG4sdGhpcy5tZXNzYWdlcyksbiYmKG89dGhpcy5tZXNzYWdlc1tuXSkpOnI9bixnbyhvLHQpP3RoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUob1t0XSxyKS5qb2luKCIiKTooY29uc29sZS53YXJuKGBDYW5ub3QgdHJhbnNsYXRlIHRoZSB2YWx1ZSBvZiBrZXlwYXRoICR7dH0uIFVzZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCBhcyBkZWZhdWx0LmApLHQpfX1mdW5jdGlvbiBwbyhlLHQpe2UuJHdhdGNoTG9jYWxlP2UuJHdhdGNoTG9jYWxlKG49Pnt0LnNldExvY2FsZShuKX0pOmUuJHdhdGNoKCgpPT5lLiRsb2NhbGUsbj0+e3Quc2V0TG9jYWxlKG4pfSl9ZnVuY3Rpb24gUm8oKXtyZXR1cm4gdHlwZW9mIFAhPSJ1bmRlZmluZWQiJiZQLmdldExvY2FsZT9QLmdldExvY2FsZSgpOnR5cGVvZiBnbG9iYWwhPSJ1bmRlZmluZWQiJiZnbG9iYWwuZ2V0TG9jYWxlP2dsb2JhbC5nZXRMb2NhbGUoKTpHbn1mdW5jdGlvbiBybyhlLHQ9e30sbixyKXt0eXBlb2YgZSE9InN0cmluZyImJihbZSx0XT1bdCxlXSksdHlwZW9mIGUhPSJzdHJpbmciJiYoZT1SbygpKSx0eXBlb2YgbiE9InN0cmluZyImJihuPXR5cGVvZiBSIT0idW5kZWZpbmVkIiYmUi5mYWxsYmFja0xvY2FsZXx8R24pO2xldCBvPW5ldyB4cih7bG9jYWxlOmUsZmFsbGJhY2tMb2NhbGU6bixtZXNzYWdlczp0LHdhdGNoZXI6cn0pLGM9KGcsYik9PntpZih0eXBlb2Ygd3QhPSJmdW5jdGlvbiIpYz1mdW5jdGlvbihWLFQpe3JldHVybiBvLnQoVixUKX07ZWxzZXtsZXQgVj0hMTtjPWZ1bmN0aW9uKFQsTCl7bGV0IF9lPXd0KCkuJHZtO3JldHVybiBfZSYmKF9lLiRsb2NhbGUsVnx8KFY9ITAscG8oX2UsbykpKSxvLnQoVCxMKX19cmV0dXJuIGMoZyxiKX07cmV0dXJue2kxOG46byxmKGcsYixWKXtyZXR1cm4gby5mKGcsYixWKX0sdChnLGIpe3JldHVybiBjKGcsYil9LGFkZChnLGIsVj0hMCl7cmV0dXJuIG8uYWRkKGcsYixWKX0sd2F0Y2goZyl7cmV0dXJuIG8ud2F0Y2hMb2NhbGUoZyl9LGdldExvY2FsZSgpe3JldHVybiBvLmdldExvY2FsZSgpfSxzZXRMb2NhbGUoZyl7cmV0dXJuIG8uc2V0TG9jYWxlKGcpfX19ZnVuY3Rpb24gQmkoZSx0KXtyZXR1cm4gZS5pbmRleE9mKHRbMF0pPi0xfWxldCB2bz1KLm9uY2UoKCk9PnR5cGVvZiBSIT0idW5kZWZpbmVkIiYmUi5sb2NhbGVzJiYhIU9iamVjdC5rZXlzKFIubG9jYWxlcykubGVuZ3RoKSxNaTtmdW5jdGlvbiB6aSgpe2xldCBlPVAuZ2V0TG9jYWxlKCksdD1SLmxvY2FsZXM7cmV0dXJuIHRbZV18fHRbUi5mYWxsYmFja0xvY2FsZV18fHQuZW58fHt9fWZ1bmN0aW9uIFFvKGUpe3JldHVybiBCaShlLEouSTE4Tl9KU09OX0RFTElNSVRFUlMpP2FlKCkuZihlLHppKCksSi5JMThOX0pTT05fREVMSU1JVEVSUyk6ZX1mdW5jdGlvbiBCKGUsdCl7aWYodC5sZW5ndGg9PT0xKXtpZihlKXtsZXQgcj1iPT56LmlzU3RyaW5nKGIpJiZCaShiLEouSTE4Tl9KU09OX0RFTElNSVRFUlMpLG89dFswXSxjPVtdO2lmKHouaXNBcnJheShlKSYmKGM9ZS5maWx0ZXIoYj0+cihiW29dKSkpLmxlbmd0aClyZXR1cm4gYztsZXQgZz1lW3RbMF1dO2lmKHIoZykpcmV0dXJuIGV9cmV0dXJufWxldCBuPXQuc2hpZnQoKTtyZXR1cm4gQihlJiZlW25dLHQpfWZ1bmN0aW9uIFEoZSx0KXtyZXR1cm4gdC5tYXAobj0+aGUoZSxuKSl9ZnVuY3Rpb24gaGUoZSx0KXtsZXQgbj1CKGUsdCk7aWYoIW4pcmV0dXJuITE7bGV0IHI9dFt0Lmxlbmd0aC0xXTtpZih6LmlzQXJyYXkobikpbi5mb3JFYWNoKG89PmhlKG8sW3JdKSk7ZWxzZXtsZXQgbz1uW3JdO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse2dldCgpe3JldHVybiBRbyhvKX0sc2V0KGMpe289Y319KX1yZXR1cm4hMH1mdW5jdGlvbiBhZSgpe2lmKCFNaSl7bGV0IGU7aWYodHlwZW9mIHd0PT0iZnVuY3Rpb24iP2U9Zi5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKTplPXMud2Vidmlldy5jdXJyZW50V2VidmlldygpLmdldFN0eWxlKCkubG9jYWxlLE1pPXJvKGUpLHZvKCkpe2xldCB0PU9iamVjdC5rZXlzKFIubG9jYWxlc3x8e30pO3QubGVuZ3RoJiZ0LmZvckVhY2gobj0+TWkuYWRkKG4sUi5sb2NhbGVzW25dKSksTWkuc2V0TG9jYWxlKGUpfX1yZXR1cm4gTWl9ZnVuY3Rpb24gZGUoZSx0LG4pe3JldHVybiB0LnJlZHVjZSgocixvLGMpPT4ocltlK29dPW5bY10scikse30pfWxldCB2dD1KLm9uY2UoKCk9PntsZXQgZT0idW5pLmFwcC4iLHQ9WyJxdWl0Il07YWUoKS5hZGQoR24sZGUoZSx0LFsiUHJlc3MgYmFjayBidXR0b24gYWdhaW4gdG8gZXhpdCJdKSwhMSksYWUoKS5hZGQoY3IsZGUoZSx0LFsiUHVsc2Ugb3RyYSB2ZXogcGFyYSBzYWxpciJdKSwhMSksYWUoKS5hZGQobnIsZGUoZSx0LFsiQXBwdXlleiBceEUwIG5vdXZlYXUgcG91ciBxdWl0dGVyIGwnYXBwbGljYXRpb24iXSksITEpLGFlKCkuYWRkKGVyLGRlKGUsdCxbIlx1NTE4RFx1NjMwOVx1NEUwMFx1NkIyMVx1OTAwMFx1NTFGQVx1NUU5NFx1NzUyOCJdKSwhMSksYWUoKS5hZGQodHIsZGUoZSx0LFsiXHU1MThEXHU2MzA5XHU0RTAwXHU2QjIxXHU5MDAwXHU1MUZBXHU2MUM5XHU3NTI4Il0pLCExKX0pLGt0PUoub25jZSgoKT0+e2xldCBlPSJ1bmkuc2hvd0FjdGlvblNoZWV0LiIsdD1bImNhbmNlbCJdO2FlKCkuYWRkKEduLGRlKGUsdCxbIkNhbmNlbCJdKSwhMSksYWUoKS5hZGQoY3IsZGUoZSx0LFsiQ2FuY2VsYXIiXSksITEpLGFlKCkuYWRkKG5yLGRlKGUsdCxbIkFubnVsZXIiXSksITEpLGFlKCkuYWRkKGVyLGRlKGUsdCxbIlx1NTNENlx1NkQ4OCJdKSwhMSksYWUoKS5hZGQodHIsZGUoZSx0LFsiXHU1M0Q2XHU2RDg4Il0pLCExKX0pLFg9Si5vbmNlKCgpPT57bGV0IGU9InVuaS5zaG93TW9kYWwuIix0PVsiY2FuY2VsIiwiY29uZmlybSJdO2FlKCkuYWRkKEduLGRlKGUsdCxbIkNhbmNlbCIsIk9LIl0pLCExKSxhZSgpLmFkZChjcixkZShlLHQsWyJDYW5jZWxhciIsIk9LIl0pLCExKSxhZSgpLmFkZChucixkZShlLHQsWyJBbm51bGVyIiwiT0siXSksITEpLGFlKCkuYWRkKGVyLGRlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1Nzg2RVx1NUI5QSJdKSwhMSksYWUoKS5hZGQodHIsZGUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU3OEJBXHU1QjlBIl0pLCExKX0pLEs9Si5vbmNlKCgpPT57bGV0IGU9InVuaS5jaG9vc2VJbWFnZS4iLHQ9WyJjYW5jZWwiLCJzb3VyY2VUeXBlLmFsYnVtIiwic291cmNlVHlwZS5jYW1lcmEiXTthZSgpLmFkZChHbixkZShlLHQsWyJDYW5jZWwiLCJBbGJ1bSIsIkNhbWVyYSJdKSwhMSksYWUoKS5hZGQoY3IsZGUoZSx0LFsiQ2FuY2VsYXIiLCJceEMxbGJ1bSIsIkNceEUxbWFyYSJdKSwhMSksYWUoKS5hZGQobnIsZGUoZSx0LFsiQW5udWxlciIsIkFsYnVtIiwiQ2FtXHhFOXJhIl0pLCExKSxhZSgpLmFkZChlcixkZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTRFQ0VcdTc2RjhcdTUxOENcdTkwMDlcdTYyRTkiLCJcdTYyQ0RcdTY0NDQiXSksITEpLGFlKCkuYWRkKHRyLGRlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NUY5RVx1NzZGOFx1NTE4QVx1OTA3OFx1NjRDNyIsIlx1NjJDRFx1NjUxRCJdKSwhMSl9KSxpZT1KLm9uY2UoKCk9PntsZXQgZT0idW5pLmNob29zZVZpZGVvLiIsdD1bImNhbmNlbCIsInNvdXJjZVR5cGUuYWxidW0iLCJzb3VyY2VUeXBlLmNhbWVyYSJdO2FlKCkuYWRkKEduLGRlKGUsdCxbIkNhbmNlbCIsIkFsYnVtIiwiQ2FtZXJhIl0pLCExKSxhZSgpLmFkZChjcixkZShlLHQsWyJDYW5jZWxhciIsIlx4QzFsYnVtIiwiQ1x4RTFtYXJhIl0pLCExKSxhZSgpLmFkZChucixkZShlLHQsWyJBbm51bGVyIiwiQWxidW0iLCJDYW1ceEU5cmEiXSksITEpLGFlKCkuYWRkKGVyLGRlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NEVDRVx1NzZGOFx1NTE4Q1x1OTAwOVx1NjJFOSIsIlx1NjJDRFx1NjQ0NCJdKSwhMSksYWUoKS5hZGQodHIsZGUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU1RjlFXHU3NkY4XHU1MThBXHU5MDc4XHU2NEM3IiwiXHU2MkNEXHU2NTFEIl0pLCExKX0pLE5lPUoub25jZSgoKT0+e2xldCBlPSJ1bmkucHJldmlld0ltYWdlLiIsdD1bImNhbmNlbCIsImJ1dHRvbi5zYXZlIiwic2F2ZS5zdWNjZXNzIiwic2F2ZS5mYWlsIl07YWUoKS5hZGQoR24sZGUoZSx0LFsiQ2FuY2VsIiwiU2F2ZSBJbWFnZSIsIlNhdmVkIHN1Y2Nlc3NmdWxseSIsIlNhdmUgZmFpbGVkIl0pLCExKSxhZSgpLmFkZChjcixkZShlLHQsWyJDYW5jZWxhciIsIkd1YXJkYXIgaW1hZ2VuIiwiR3VhcmRhZG8gZXhpdG9zYW1lbnRlIiwiRXJyb3IgYWwgZ3VhcmRhciJdKSwhMSksYWUoKS5hZGQobnIsZGUoZSx0LFsiQW5udWxlciIsIkd1YXJkYXIgaW1hZ2VuIiwiRW5yZWdpc3RyXHhFOSBhdmVjIHN1Y2NceEU4cyIsIlx4QzljaGVjIGRlIGxhIHNhdXZlZ2FyZGUiXSksITEpLGFlKCkuYWRkKGVyLGRlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NEZERFx1NUI1OFx1NTZGRVx1NTBDRiIsIlx1NEZERFx1NUI1OFx1NTZGRVx1NTBDRlx1NTIzMFx1NzZGOFx1NTE4Q1x1NjIxMFx1NTI5RiIsIlx1NEZERFx1NUI1OFx1NTZGRVx1NTBDRlx1NTIzMFx1NzZGOFx1NTE4Q1x1NTkzMVx1OEQyNSJdKSwhMSksYWUoKS5hZGQodHIsZGUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RkREXHU1QjU4XHU1NzE2XHU1MENGIiwiXHU0RkREXHU1QjU4XHU1NzE2XHU1MENGXHU1MjMwXHU3NkY4XHU1MThBXHU2MjEwXHU1MjlGIiwiXHU0RkREXHU1QjU4XHU1NzE2XHU1MENGXHU1MjMwXHU3NkY4XHU1MThBXHU1OTMxXHU2NTU3Il0pLCExKX0pLHN0PUoub25jZSgoKT0+e2xldCBlPSJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS4iLHQ9WyJzdWNjZXNzIiwiZmFpbCJdO2FlKCkuYWRkKEduLGRlKGUsdCxbIkNvbnRlbnQgY29waWVkIiwiQ29weSBmYWlsZWQsIHBsZWFzZSBjb3B5IG1hbnVhbGx5Il0pLCExKSxhZSgpLmFkZChjcixkZShlLHQsWyJDb250ZW5pZG8gY29waWFkbyIsIkVycm9yIGFsIGNvcGlhciwgY29waWUgbWFudWFsbWVudGUiXSksITEpLGFlKCkuYWRkKG5yLGRlKGUsdCxbIkNvbnRlbnUgY29waVx4RTkiLCJceEM5Y2hlYyBkZSBsYSBjb3BpZSwgY29waWV6IG1hbnVlbGxlbWVudCJdKSwhMSksYWUoKS5hZGQoZXIsZGUoZSx0LFsiXHU1MTg1XHU1QkI5XHU1REYyXHU1OTBEXHU1MjM2IiwiXHU1OTBEXHU1MjM2XHU1OTMxXHU4RDI1XHVGRjBDXHU4QkY3XHU2MjRCXHU1MkE4XHU1OTBEXHU1MjM2Il0pLCExKSxhZSgpLmFkZCh0cixkZShlLHQsWyJcdTUxNjdcdTVCQjlcdTVERjJcdTVGQTlcdTUyMzYiLCJcdTVGQTlcdTUyMzZcdTU5MzFcdTY1NTdcdUZGMENcdThBQ0JcdTYyNEJcdTUyRDVcdTVGQTlcdTg4RkQiXSksITEpfSksWHQ9Si5vbmNlKCgpPT57bGV0IGU9InVuaS5zY2FuQ29kZS4iLHQ9WyJ0aXRsZSIsImFsYnVtIiwiZmFpbCIsImZsYXNoLm9uIiwiZmxhc2gub2ZmIl07YWUoKS5hZGQoR24sZGUoZSx0LFsiU2NhbiBjb2RlIiwiQWxidW0iLCJSZWNvZ25pdGlvbiBmYWlsdXJlIiwiVGFwIHRvIHR1cm4gbGlnaHQgb24iLCJUYXAgdG8gdHVybiBsaWdodCBvZmYiXSksITEpLGFlKCkuYWRkKGNyLGRlKGUsdCxbIkNceEYzZGlnbyBkZSBlc2NhbmVvIiwiXHhDMWxidW0iLCJceEM5Y2hlYyBkZSBsYSByZWNvbm5haXNzYW5jZSIsIlRvcXVlIHBhcmEgZW5jZW5kZXIgbGEgbHV6IiwiVG9xdWUgcGFyYSBhcGFnYXIgbGEgbHV6Il0pLCExKSxhZSgpLmFkZChucixkZShlLHQsWyJDb2RlIGRcdTIwMTlhbmFseXNlIiwiQWxidW0iLCJGYWxsbyBkZSByZWNvbm9jaW1pZW50byIsIkFwcHV5ZXogcG91ciBhY3RpdmVyIGwnXHhFOWNsYWlyYWdlIiwiQXBwdXlleiBwb3VyIGRceEU5c2FjdGl2ZXIgbCdceEU5Y2xhaXJhZ2UiXSksITEpLGFlKCkuYWRkKGVyLGRlKGUsdCxbIlx1NjI2Qlx1NzgwMSIsIlx1NzZGOFx1NTE4QyIsIlx1OEJDNlx1NTIyQlx1NTkzMVx1OEQyNSIsIlx1OEY3Qlx1ODlFNlx1NzE2N1x1NEVBRSIsIlx1OEY3Qlx1ODlFNlx1NTE3M1x1OTVFRCJdKSwhMSksYWUoKS5hZGQodHIsZGUoZSx0LFsiXHU2MzgzXHU3OEJDIiwiXHU3NkY4XHU1MThBIiwiXHU4QjU4XHU1MjI1XHU1OTMxXHU2NTU3IiwiXHU4RjE1XHU4OUY4XHU3MTY3XHU0RUFFIiwiXHU4RjE1XHU4OUY4XHU5NURDXHU5NTg5Il0pLCExKX0pLHhuPUoub25jZSgoKT0+e2xldCBlPSJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLiIsdD1bImF1dGhDb250ZW50Iiwid2FpdGluZ0NvbnRlbnQiXTthZSgpLmFkZChHbixkZShlLHQsWyJGaW5nZXJwcmludCByZWNvZ25pdGlvbiIsIlVucmVjb2duaXphYmxlIl0pLCExKSxhZSgpLmFkZChjcixkZShlLHQsWyJSZWNvbm9jaW1pZW50byBkZSBodWVsbGFzIGRhY3RpbGFyZXMiLCJJcnJlY29ub2NpYmxlIl0pLCExKSxhZSgpLmFkZChucixkZShlLHQsWyJSZWNvbm5haXNzYW5jZSBkZSBsJ2VtcHJlaW50ZSBkaWdpdGFsZSIsIk1ceEU5Y29ubmFpc3NhYmxlIl0pLCExKSxhZSgpLmFkZChlcixkZShlLHQsWyJcdTYzMDdcdTdFQjlcdThCQzZcdTUyMkJcdTRFMkQuLi4iLCJcdTY1RTBcdTZDRDVcdThCQzZcdTUyMkIiXSksITEpLGFlKCkuYWRkKHRyLGRlKGUsdCxbIlx1NjMwN1x1N0QwQlx1OEI1OFx1NTIyNVx1NEUyRC4uLiIsIlx1NzEyMVx1NkNENVx1OEI1OFx1NTIyNSJdKSwhMSl9KTtmdW5jdGlvbiBEbihlKXtpZih2bygpKXJldHVybiBRKGUsW1sidGl0bGVUZXh0Il0sWyJzZWFyY2hJbnB1dCIsInBsYWNlaG9sZGVyIl0sWyJidXR0b25zIiwidGV4dCJdXSl9ZnVuY3Rpb24gX3IoZSl7aWYodm8oKSl7bGV0IHQ9ImNhcHRpb24iO3JldHVybiBRKGUsW1siY29udGVudGRvd24iLHRdLFsiY29udGVudG92ZXIiLHRdLFsiY29udGVudHJlZnJlc2giLHRdXSl9fWZ1bmN0aW9uIEJyKGUpe2xldCB0PW5ldyBKLkVtaXR0ZXI7cmV0dXJue29uKG4scil7cmV0dXJuIHQub24obixyKX0sb25jZShuLHIpe3JldHVybiB0Lm9uY2UobixyKX0sb2ZmKG4scil7cmV0dXJuIHQub2ZmKG4scil9LGVtaXQobiwuLi5yKXtyZXR1cm4gdC5lbWl0KG4sLi4ucil9LHN1YnNjcmliZShuLHIsbz0hMSl7dFtvPyJvbmNlIjoib24iXShgJHtlfS4ke259YCxyKX0sdW5zdWJzY3JpYmUobixyKXt0Lm9mZihgJHtlfS4ke259YCxyKX0sc3Vic2NyaWJlSGFuZGxlcihuLHIsbyl7dC5lbWl0KGAke2V9LiR7bn1gLHIsbyl9fX1sZXQgbW89Imludm9rZVZpZXdBcGkiLHhvPSJpbnZva2VTZXJ2aWNlQXBpIjtmdW5jdGlvbiBCbyhlKXtyZXR1cm4gZT1lKyIiLGUuaW5kZXhPZigicnB4IikhPT0tMXx8ZS5pbmRleE9mKCJ1cHgiKSE9PS0xfWZ1bmN0aW9uIExuKGUsdD0hMSl7aWYodClyZXR1cm4gWW4oZSk7aWYoei5pc1N0cmluZyhlKSl7bGV0IG49cGFyc2VJbnQoZSl8fDA7cmV0dXJuIEJvKGUpP1AudXB4MnB4KG4pOm59cmV0dXJuIGV9ZnVuY3Rpb24gWW4oZSl7cmV0dXJuIEJvKGUpP2UucmVwbGFjZSgvKFxkKyhcLlxkKyk/KVtydV1weC9nLCh0LG4pPT5QLnVweDJweChwYXJzZUZsb2F0KG4pKSsicHgiKTplfWZ1bmN0aW9uIEZuKGUpe2xldCB0PUoucmVzb2x2ZUNvbXBvbmVudEluc3RhbmNlKGUpO2lmKHQuJHBhZ2UpcmV0dXJuIHQuJHBhZ2UuaWQ7aWYoIXQuJClyZXR1cm47bGV0IG49dC4kLnJvb3QucHJveHk7aWYobiYmbi4kcGFnZSlyZXR1cm4gbi4kcGFnZS5pZH1mdW5jdGlvbiB3aSgpe2xldCBlPUluKCksdD1lLmxlbmd0aDtpZih0KXJldHVybiBlW3QtMV19ZnVuY3Rpb24gaXMoKXtsZXQgZT13aSgpO2lmKGUpcmV0dXJuIGUuJHBhZ2UubWV0YX1mdW5jdGlvbiBoYSgpe2xldCBlPWlzKCk7cmV0dXJuIGU/ZS5pZDotMX1mdW5jdGlvbiBicigpe2xldCBlPXdpKCk7aWYoZSlyZXR1cm4gZS4kdm19bGV0IFRhPVsibmF2aWdhdGlvbkJhciIsInB1bGxUb1JlZnJlc2giXTtmdW5jdGlvbiBMYSgpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFIuZ2xvYmFsU3R5bGV8fHt9KSl9ZnVuY3Rpb24gRmEoZSx0KXtsZXQgbj1MYSgpLHI9ei5leHRlbmQoe2lkOnR9LG4sZSk7VGEuZm9yRWFjaChjPT57cltjXT16LmV4dGVuZCh7fSxuW2NdLGVbY10pfSk7bGV0e25hdmlnYXRpb25CYXI6b309cjtyZXR1cm4gby50aXRsZVRleHQmJm8udGl0bGVJbWFnZSYmKG8udGl0bGVUZXh0PSIiKSxyfWZ1bmN0aW9uIFZhKGUpe3JldHVybiBKU09OLnBhcnNlKExuKEpTT04uc3RyaW5naWZ5KGUpLCEwKSl9ZnVuY3Rpb24gVWEoZSl7cmV0dXJuIGUub2Zmc2V0JiYoZS5vZmZzZXQ9TG4oZS5vZmZzZXQpKSxlLmhlaWdodCYmKGUuaGVpZ2h0PUxuKGUuaGVpZ2h0KSksZS5yYW5nZSYmKGUucmFuZ2U9TG4oZS5yYW5nZSkpLGV9ZnVuY3Rpb24gZ2EoZSx0LG4scixvLGMpe2xldHtpZDpnLHJvdXRlOmJ9PXIsVj1KLm5vcm1hbGl6ZVN0eWxlcyhyLm5hdmlnYXRpb25CYXIsUi50aGVtZUNvbmZpZyxjKS50aXRsZUNvbG9yO3JldHVybntpZDpnLHBhdGg6Si5hZGRMZWFkaW5nU2xhc2goYikscm91dGU6YixmdWxsUGF0aDp0LG9wdGlvbnM6bixtZXRhOnIsb3BlblR5cGU6ZSxldmVudENoYW5uZWw6byxzdGF0dXNCYXJTdHlsZTpWPT09IiNmZmZmZmYiPyJsaWdodCI6ImRhcmsifX1mdW5jdGlvbiBQYShlLHQsbil7bGV0IHI9ZS4kW3RdOyF6LmlzQXJyYXkocil8fG4uX193ZWgmJnoucmVtb3ZlKHIsbi5fX3dlaCl9ZnVuY3Rpb24gVm4oZSx0LG4pe2lmKHouaXNTdHJpbmcoZSkpbj10LHQ9ZSxlPWJyKCk7ZWxzZSBpZih0eXBlb2YgZT09Im51bWJlciIpe2xldCBvPUluKCkuZmluZChjPT5jLiRwYWdlLmlkPT09ZSk7bz9lPW8uJHZtOmU9YnIoKX1pZighZSlyZXR1cm47aWYoZS5fX2NhbGxfaG9vaylyZXR1cm4gZS5fX2NhbGxfaG9vayh0LG4pO2xldCByPWUuJFt0XTtyZXR1cm4gciYmSi5pbnZva2VBcnJheUZucyhyLG4pfWZ1bmN0aW9uIE1vKGUpe2lmKGUuaW5kZXhPZigiLyIpPT09MClyZXR1cm4gZTtsZXQgdD0iIixuPUluKCk7cmV0dXJuIG4ubGVuZ3RoJiYodD1uW24ubGVuZ3RoLTFdLiRwYWdlLnJvdXRlKSxlYSh0LGUpfWZ1bmN0aW9uIGVhKGUsdCl7aWYodC5pbmRleE9mKCIvIik9PT0wKXJldHVybiB0O2lmKHQuaW5kZXhPZigiLi8iKT09PTApcmV0dXJuIGVhKGUsdC5zbGljZSgyKSk7bGV0IG49dC5zcGxpdCgiLyIpLHI9bi5sZW5ndGgsbz0wO2Zvcig7bzxyJiZuW29dPT09Ii4uIjtvKyspO24uc3BsaWNlKDAsbyksdD1uLmpvaW4oIi8iKTtsZXQgYz1lLmxlbmd0aD4wP2Uuc3BsaXQoIi8iKTpbXTtyZXR1cm4gYy5zcGxpY2UoYy5sZW5ndGgtby0xLG8rMSksSi5hZGRMZWFkaW5nU2xhc2goYy5jb25jYXQobikuam9pbigiLyIpKX1mdW5jdGlvbiBXaShlLHQ9ITEpe3JldHVybiB0P0ZlLmZpbmQobj0+bi5wYXRoPT09ZXx8bi5hbGlhcz09PWUpOkZlLmZpbmQobj0+bi5wYXRoPT09ZSl9ZnVuY3Rpb24gb3MoZSl7bGV0IHQ9V2koZSk7aWYodClyZXR1cm4gdC5tZXRhfWZ1bmN0aW9uIGFzKGUsdCxuKXtsZXQgcj1XaShKLmFkZExlYWRpbmdTbGFzaCh0KSk7aWYocil7bGV0e21ldGE6Y309cjtkZWxldGUgYy50YWJCYXJJbmRleCxjLmlzUXVpdD1jLmlzVGFiQmFyPSExfWxldCBvPVdpKEouYWRkTGVhZGluZ1NsYXNoKG4pKTtpZihvKXtsZXR7bWV0YTpjfT1vO2MudGFiQmFySW5kZXg9ZSxjLmlzUXVpdD1jLmlzVGFiQmFyPSEwO2xldCBnPVIudGFiQmFyO2cmJmcubGlzdCYmZy5saXN0W2VdJiYoZy5saXN0W2VdLnBhZ2VQYXRoPUoucmVtb3ZlTGVhZGluZ1NsYXNoKG4pKX19bGV0IERvLHNzLGlvO2Z1bmN0aW9uIHNpKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiZ0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmdHlwZW9mIGRvY3VtZW50PT0ib2JqZWN0Ij8id2VidmlldyI6InY4In1mdW5jdGlvbiBDaSgpe3JldHVybiBEby53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWR9bGV0IEdpLGxpLHVyPXt9O2Z1bmN0aW9uIGxyKGUpe2xldCB0PWUuZGF0YSYmZS5kYXRhLl9fbWVzc2FnZTtpZighdHx8IXQuX19wYWdlKXJldHVybjtsZXQgbj10Ll9fcGFnZSxyPXVyW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgdXJbbl19ZnVuY3Rpb24gJGEoZSx0KXtzaSgpPT09InY4Ij9pbz8oR2kmJkdpLmNsb3NlKCksR2k9bmV3IGlvKENpKCkpLEdpLm9ubWVzc2FnZT1scik6bGl8fChsaT1zcy5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLGxpLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIixscikpOndpbmRvdy5fX3BsdXNNZXNzYWdlPWxyLHVyW2VdPXR9Y2xhc3MgSGF7Y29uc3RydWN0b3IodCl7dGhpcy53ZWJ2aWV3PXR9c2VuZE1lc3NhZ2UodCl7bGV0IG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOnR9fSkpLHI9dGhpcy53ZWJ2aWV3LmlkO2lvP25ldyBpbyhyKS5wb3N0TWVzc2FnZShuKTpEby53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyYmRG8ud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcobixyKX1jbG9zZSgpe3RoaXMud2Vidmlldy5jbG9zZSgpfX1mdW5jdGlvbiBZaSh7Y29udGV4dDplPXt9LHVybDp0LGRhdGE6bj17fSxzdHlsZTpyPXt9LG9uTWVzc2FnZTpvLG9uQ2xvc2U6Y30pe2xldCBnPVIuZGFya21vZGU7RG89ZS5wbHVzfHxzLHNzPWUud2VleHx8KHR5cGVvZiBmPT0ib2JqZWN0Ij9mOm51bGwpLGlvPWUuQnJvYWRjYXN0Q2hhbm5lbHx8KHR5cGVvZiBCcm9hZGNhc3RDaGFubmVsPT0ib2JqZWN0Ij9Ccm9hZGNhc3RDaGFubmVsOm51bGwpO2xldCBiPXthdXRvQmFja0J1dHRvbjohMCx0aXRsZVNpemU6IjE3cHgifSxWPWBwYWdlJHtEYXRlLm5vdygpfWA7cj16LmV4dGVuZCh7fSxyKSxyLnRpdGxlTlZpZXchPT0hMSYmci50aXRsZU5WaWV3IT09Im5vbmUiJiYoci50aXRsZU5WaWV3PXouZXh0ZW5kKGIsci50aXRsZU5WaWV3KSk7bGV0IFQ9e3RvcDowLGJvdHRvbTowLHVzaW5nQ29tcG9uZW50czp7fSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIixhbmltYXRpb25UeXBlOiJwb3AtaW4iLGFuaW1hdGlvbkR1cmF0aW9uOjIwMCx1bmlOVmlldzp7cGF0aDpgLyR7dH0uanNgLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpEby5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07cj16LmV4dGVuZChULHIpO2xldCBMPURvLndlYnZpZXcuY3JlYXRlKCIiLFYscix7ZXh0cmFzOntmcm9tOkNpKCkscnVudGltZTpzaSgpLGRhdGE6ei5leHRlbmQoe30sbix7ZGFya21vZGU6Z30pLHVzZUdsb2JhbEV2ZW50OiFpb319KTtyZXR1cm4gTC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsYyksJGEoVixfZT0+e3ouaXNGdW5jdGlvbihvKSYmbyhfZS5kYXRhKSxfZS5rZWVwfHxMLmNsb3NlKCJhdXRvIil9KSxMLnNob3coci5hbmltYXRpb25UeXBlLHIuYW5pbWF0aW9uRHVyYXRpb24pLG5ldyBIYShMKX1sZXQgb289KGUsdCk9Pm90LmVtaXQoImFwaS4iK2UsdCksYW89MTtmdW5jdGlvbiBscyhlKXtyZXR1cm4oZXx8aGEoKSkrIi4iK21vfWxldCBwYT0oZSx0LG4scik9PntsZXR7c3Vic2NyaWJlOm8scHVibGlzaEhhbmRsZXI6Y309b3QsZz1yP2FvKys6MDtyJiZvKG1vKyIuIitnLHIsITApLGMobHMobikse2lkOmcsbmFtZTplLGFyZ3M6dH0sbil9LExvPShlLHQsbixyKT0+e2xldHtzdWJzY3JpYmU6byx1bnN1YnNjcmliZTpjLHB1Ymxpc2hIYW5kbGVyOmd9PW90LGI9YW8rKyxWPW1vKyIuIitiO3JldHVybiBvKFYsbiksZyhscyhyKSx7aWQ6YixuYW1lOmUsYXJnczp0fSxyKSwoKT0+e2MoVil9fSx2YT1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHYoKXtvdC5zdWJzY3JpYmUoeG8sJCl9ZnVuY3Rpb24geChlLHQpe3ZhW2VdfHwodmFbZV09dCl9ZnVuY3Rpb24gJCh7aWQ6ZSxuYW1lOnQsYXJnczpufSxyKXtsZXQgbz1nPT57ZSYmb3QucHVibGlzaEhhbmRsZXIoeG8rIi4iK2UsZyxyKX0sYz12YVt0XTtjP2MobixvKTpvKHt9KX1sZXQgVT16LmV4dGVuZChCcigidmlldyIpLHtpbnZva2VPbkNhbGxiYWNrOm9vLGludm9rZVZpZXdNZXRob2Q6cGEsaW52b2tlVmlld01ldGhvZEtlZXBBbGl2ZTpMb30pO2Z1bmN0aW9uIFooKXtsZXR7b246ZX09b3Q7ZShKLk9OX1JFU0laRSxxKSxlKEouT05fQVBQX0VOVEVSX0ZPUkVHUk9VTkQsdGUpLGUoSi5PTl9BUFBfRU5URVJfQkFDS0dST1VORCxjZSl9ZnVuY3Rpb24gcShlKXtWbih3aSgpLEouT05fUkVTSVpFLGUpLG90Lmludm9rZU9uQ2FsbGJhY2soIm9uV2luZG93UmVzaXplIixlKX1mdW5jdGlvbiB0ZShlKXtsZXQgdD13aSgpO1ZuKHd0KCksSi5PTl9TSE9XLGUpLFZuKHQsSi5PTl9TSE9XKX1mdW5jdGlvbiBjZSgpe1ZuKHd0KCksSi5PTl9ISURFKSxWbih3aSgpLEouT05fSElERSl9bGV0IHBlPVtKLk9OX1BBR0VfU0NST0xMLEouT05fUkVBQ0hfQk9UVE9NXTtmdW5jdGlvbiBJZSgpe3BlLmZvckVhY2goZT0+b3Quc3Vic2NyaWJlKGUsZmUoZSkpKX1mdW5jdGlvbiBmZShlKXtyZXR1cm4odCxuKT0+e1ZuKHBhcnNlSW50KG4pLGUsdCl9fWZ1bmN0aW9uIENlKCl7WigpLEllKCl9ZnVuY3Rpb24gY3QoZSl7ZS4kdm09ZSxlLiRtcFR5cGU9ImFwcCI7bGV0IHQ9aG4ucmVmKGFlKCkuZ2V0TG9jYWxlKCkpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCIkbG9jYWxlIix7Z2V0KCl7cmV0dXJuIHQudmFsdWV9LHNldChuKXt0LnZhbHVlPW59fSl9ZnVuY3Rpb24gZ3QoZSx0KXtlLnJvdXRlPXQucm91dGUsZS4kdm09ZSxlLiRwYWdlPXQsZS4kbXBUeXBlPSJwYWdlIix0Lm1ldGEuaXNUYWJCYXImJihlLiQuX19pc1RhYkJhcj0hMCxlLiQuX19pc0FjdGl2ZT0hMCl9ZnVuY3Rpb24gSHQoKXtyZXR1cm57cGF0aDoiIixxdWVyeTp7fSxzY2VuZToxMDAxLHJlZmVycmVySW5mbzp7YXBwSWQ6IiIsZXh0cmFEYXRhOnt9fX19ZnVuY3Rpb24geXQoZSx0KXtsZXQgbj1lLiRvcHRpb25zfHx7fTtuLmdsb2JhbERhdGE9ei5leHRlbmQobi5nbG9iYWxEYXRhfHx7fSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZ2xvYmFsRGF0YSIse2dldCgpe3JldHVybiBuLmdsb2JhbERhdGF9LHNldChyKXtuLmdsb2JhbERhdGE9cn19KX1mdW5jdGlvbiBqZShlKXtpZihlLmluZGV4T2YoIi8vIik9PT0wKXJldHVybiJodHRwczoiK2U7aWYoSi5TQ0hFTUVfUkUudGVzdChlKXx8Si5EQVRBX1JFLnRlc3QoZSkpcmV0dXJuIGU7aWYoZG4oZSkpcmV0dXJuImZpbGU6Ly8iK010KGUpO2xldCB0PSJmaWxlOi8vIitNdCgiX3d3dyIpO2lmKGUuaW5kZXhPZigiLyIpPT09MClyZXR1cm4gZS5zdGFydHNXaXRoKCIvc3RvcmFnZS8iKXx8ZS5zdGFydHNXaXRoKCIvc2RjYXJkLyIpfHxlLmluY2x1ZGVzKCIvQ29udGFpbmVycy9EYXRhL0FwcGxpY2F0aW9uLyIpPyJmaWxlOi8vIitlOnQrZTtpZihlLmluZGV4T2YoIi4uLyIpPT09MHx8ZS5pbmRleE9mKCIuLyIpPT09MCl7aWYodHlwZW9mIF9faWRfXz09InN0cmluZyIpcmV0dXJuIHQrZWEoSi5hZGRMZWFkaW5nU2xhc2goX19pZF9fKSxlKTt7bGV0IG49d2koKTtpZihuKXJldHVybiB0K2VhKEouYWRkTGVhZGluZ1NsYXNoKG4ucm91dGUpLGUpfX1yZXR1cm4gZX1sZXQgTXQ9Si5jYWNoZVN0cmluZ0Z1bmN0aW9uKGU9PnMuaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKS5yZXBsYWNlKC9eXC8/YXBwc1wvLywiL2FuZHJvaWRfYXNzZXQvYXBwcy8iKS5yZXBsYWNlKC9cLyQvLCIiKSk7ZnVuY3Rpb24gZG4oZSl7cmV0dXJuIGUuaW5kZXhPZigiX3d3dyIpPT09MHx8ZS5pbmRleE9mKCJfZG9jIik9PT0wfHxlLmluZGV4T2YoIl9kb2N1bWVudHMiKT09PTB8fGUuaW5kZXhPZigiX2Rvd25sb2FkcyIpPT09MH1sZXQgR3Q9InN1Y2Nlc3MiLGR0PSJmYWlsIixCbj1bR3QsZHQsImNvbXBsZXRlIl07ZnVuY3Rpb24gWXQoZSx0LG4scil7aWYoIWUpcmV0dXJuO2lmKHR5cGVvZiBuPT0idW5kZWZpbmVkIilyZXR1cm4gZVt0XSgpO2xldFssb109dGEobixyKTtyZXR1cm4gT2JqZWN0LmtleXMobykubGVuZ3RoP2VbdF0oY2kodCxvKSk6ZVt0XSgpfWZ1bmN0aW9uIGp0KGUsdCxuLHIpe2lmKCFlKXJldHVybjtsZXRbbyxjXT10YShuLHIpO3JldHVybiBPYmplY3Qua2V5cyhjKS5sZW5ndGg/ZVt0XShvLGNpKHQsYykpOmVbdF0obyl9ZnVuY3Rpb24gVXQoZSx0KXtsZXQgbj1xdChlLHQuJGVsKTtyZXR1cm4gbnx8Y29uc29sZS5lcnJvcigiQ2FuIG5vdCBmaW5kIGAiK2UrImAiKX1mdW5jdGlvbiBxdChlLHQpe2lmKCFlfHwhdClyZXR1cm47aWYodC5hdHRyJiZ0LmF0dHIuaWQ9PT1lKXJldHVybiB0O2xldCBuPXQuY2hpbGRyZW47aWYoISFuKWZvcihsZXQgcj0wLG89bi5sZW5ndGg7cjxvO3IrKyl7bGV0IGM9cXQoZSxuW3JdKTtpZihjKXJldHVybiBjfX1mdW5jdGlvbiB0YShlPXt9LHQpe2xldCBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1mdW5jdGlvbihjKXtsZXQgZz1lW2NdO3ouaXNGdW5jdGlvbihnKSYmKG5bY109ZyxkZWxldGUgZVtjXSl9O3JldHVybiBCbi5mb3JFYWNoKHIpLHQmJnQuZm9yRWFjaChyKSxbZSxuXX1mdW5jdGlvbiBjaShlLHQpe3JldHVybiBmdW5jdGlvbihyKXtsZXQgbz1yLnR5cGU7ZGVsZXRlIHIudHlwZTtsZXQgYz10W29dO2lmKG89PT1HdD9yLmVyck1zZz1gJHtlfTpva2A6bz09PWR0JiYoci5lcnJNc2c9ZSsiOmZhaWwgIisoci5tc2c/IiAiK3IubXNnOiIiKSksZGVsZXRlIHIuY29kZSxkZWxldGUgci5tc2csei5pc0Z1bmN0aW9uKGMpJiZjKHIpLG89PT1HdHx8bz09PWR0KXtsZXQgZz10LmNvbXBsZXRlO3ouaXNGdW5jdGlvbihnKSYmZyhyKX19fWxldCBlaTtmdW5jdGlvbiBxaSgpe3JldHVybiBlaX1mdW5jdGlvbiBqYShlKXtsZXQgdD1lLiQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQuY3R4LCIkY2hpbGRyZW4iLHtnZXQoKXtyZXR1cm4gSG4oKS5tYXAocj0+ci4kdm0pfX0pO2xldCBuPXQuYXBwQ29udGV4dDtlaT16LmV4dGVuZChuLmFwcCx7bW91bnRQYWdlKHIsbyxjKXtsZXQgZz1obi5jcmVhdGVWTm9kZShyLG8pO2cuYXBwQ29udGV4dD1uLGcuX19wYWdlX2NvbnRhaW5lcl9fPWMsaG4ucmVuZGVyKGcsYyk7bGV0IGI9Zy5jb21wb25lbnQucHJveHk7cmV0dXJuIGIuX19wYWdlX2NvbnRhaW5lcl9fPWMsYn0sdW5tb3VudFBhZ2U6cj0+e2xldHtfX3BhZ2VfY29udGFpbmVyX186b309cjtvJiYoby5pc1VubW91bnRlZD0hMCxobi5yZW5kZXIobnVsbCxvKSl9fSl9bGV0IFVuPVtdO2Z1bmN0aW9uICRuKGUpe2lmKCFlLiRwYWdlLm1ldGEuaXNOVnVlKXJldHVybiBVbi5wdXNoKGUpO2xldCBuPVVuLmZpbmRJbmRleChyPT5yLiRwYWdlLmlkPT09ZS4kcGFnZS5pZCk7bj4tMT9Vbi5zcGxpY2UobiwxLGUpOlVuLnB1c2goZSl9ZnVuY3Rpb24gSXIoZSl7cmV0dXJuIFVuLmZpbmQodD0+dC4kcGFnZS5pZD09PWUpfWZ1bmN0aW9uIEhuKCl7cmV0dXJuIFVufWZ1bmN0aW9uIHlyKCl7bGV0IGU9W107cmV0dXJuIFVuLmZvckVhY2godD0+e3QuJC5fX2lzVGFiQmFyP3QuJC5fX2lzQWN0aXZlJiZlLnB1c2godCk6ZS5wdXNoKHQpfSksZX1mdW5jdGlvbiB6cigpe2xldCBlPXdpKCk7IWV8fG5hKGUpfWZ1bmN0aW9uIG5hKGUpe2xldCB0PVVuLmZpbmRJbmRleChuPT5uPT09ZSk7dCE9PS0xJiYoZS4kcGFnZS5tZXRhLmlzTlZ1ZXx8cWkoKS51bm1vdW50UGFnZShlKSxVbi5zcGxpY2UodCwxKSl9bGV0IGNzPXtwbGF5KGUpe3JldHVybiBZdChlLCJwbGF5Iil9LHBhdXNlKGUpe3JldHVybiBZdChlLCJwYXVzZSIpfSxzZWVrKGUsdCl7cmV0dXJuIGp0KGUsInNlZWsiLHQucG9zaXRpb24pfSxzdG9wKGUpe3JldHVybiBZdChlLCJzdG9wIil9LHNlbmREYW5tdShlLHQpe3JldHVybiBqdChlLCJzZW5kRGFubXUiLHQpfSxwbGF5YmFja1JhdGUoZSx0KXtyZXR1cm4ganQoZSwicGxheWJhY2tSYXRlIix0LnJhdGUpfSxyZXF1ZXN0RnVsbFNjcmVlbihlLHQ9e30pe3JldHVybiBqdChlLCJyZXF1ZXN0RnVsbFNjcmVlbiIsdCl9LGV4aXRGdWxsU2NyZWVuKGUpe3JldHVybiBZdChlLCJleGl0RnVsbFNjcmVlbiIpfSxzaG93U3RhdHVzQmFyKGUpe3JldHVybiBZdChlLCJzaG93U3RhdHVzQmFyIil9LGhpZGVTdGF0dXNCYXIoZSl7cmV0dXJuIFl0KGUsImhpZGVTdGF0dXNCYXIiKX19O2Z1bmN0aW9uIG9uKGUsdCxuLHIpe2xldCBvPUlyKHQpO2lmKG89PW51bGw/dm9pZCAwOm8uJHBhZ2UubWV0YS5pc05WdWUpe2xldCBjPW8uJHZtO3JldHVybiBjc1tuXShVdChlLGMpLHIpfW90Lmludm9rZVZpZXdNZXRob2QoInZpZGVvLiIrZSx7dmlkZW9JZDplLHR5cGU6bixkYXRhOnJ9LHQpfWxldCBfbj17Z2V0Q2VudGVyTG9jYXRpb24oZSx0KXtyZXR1cm4gWXQoZSwiZ2V0Q2VudGVyTG9jYXRpb24iLHQpfSxtb3ZlVG9Mb2NhdGlvbihlLHQpe3JldHVybiBqdChlLCJtb3ZlVG9Mb2NhdGlvbiIsdCl9LHRyYW5zbGF0ZU1hcmtlcihlLHQpe3JldHVybiBqdChlLCJ0cmFuc2xhdGVNYXJrZXIiLHQsWyJhbmltYXRpb25FbmQiXSl9LGluY2x1ZGVQb2ludHMoZSx0KXtyZXR1cm4ganQoZSwiaW5jbHVkZVBvaW50cyIsdCl9LGdldFJlZ2lvbihlLHQpe3JldHVybiBZdChlLCJnZXRSZWdpb24iLHQpfSxnZXRTY2FsZShlLHQpe3JldHVybiBZdChlLCJnZXRTY2FsZSIsdCl9LGFkZEN1c3RvbUxheWVyKGUsdCl7cmV0dXJuIGp0KGUsImFkZEN1c3RvbUxheWVyIix0KX0scmVtb3ZlQ3VzdG9tTGF5ZXIoZSx0KXtyZXR1cm4ganQoZSwicmVtb3ZlQ3VzdG9tTGF5ZXIiLHQpfSxhZGRHcm91bmRPdmVybGF5KGUsdCl7cmV0dXJuIGp0KGUsImFkZEdyb3VuZE92ZXJsYXkiLHQpfSxyZW1vdmVHcm91bmRPdmVybGF5KGUsdCl7cmV0dXJuIGp0KGUsInJlbW92ZUdyb3VuZE92ZXJsYXkiLHQpfSx1cGRhdGVHcm91bmRPdmVybGF5KGUsdCl7cmV0dXJuIGp0KGUsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLHQpfSxpbml0TWFya2VyQ2x1c3RlcihlLHQpe3JldHVybiBqdChlLCJpbml0TWFya2VyQ2x1c3RlciIsdCl9LGFkZE1hcmtlcnMoZSx0KXtyZXR1cm4ganQoZSwiYWRkTWFya2VycyIsdCl9LHJlbW92ZU1hcmtlcnMoZSx0KXtyZXR1cm4ganQoZSwicmVtb3ZlTWFya2VycyIsdCl9LG1vdmVBbG9uZyhlLHQpe3JldHVybiBqdChlLCJtb3ZlQWxvbmciLHQpfSxzZXRMb2NNYXJrZXJJY29uKGUsdCl7cmV0dXJuIGp0KGUsInNldExvY01hcmtlckljb24iLHQpfSxvcGVuTWFwQXBwKGUsdCl7cmV0dXJuIGp0KGUsIm9wZW5NYXBBcHAiLHQpfSxvbihlLHQpe3JldHVybiBlLm9uKHQubmFtZSx0LmNhbGxiYWNrKX19O2Z1bmN0aW9uIGpuKGUsdCxuLHIsbyl7bGV0IGM9SXIodCk7aWYoYz09bnVsbD92b2lkIDA6Yy4kcGFnZS5tZXRhLmlzTlZ1ZSl7bGV0IGc9Yy4kdm07cmV0dXJuIF9uW25dKFV0KGUsZykscil9b3QuaW52b2tlVmlld01ldGhvZCgibWFwLiIrZSx7dHlwZTpuLGRhdGE6cn0sdCxvKX1mdW5jdGlvbiBxbihlKXtyZXR1cm5gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIuJHtlfWB9ZnVuY3Rpb24gQWkoe3JlcUlkOmUsY29tcG9uZW50OnQsb3B0aW9uczpuLGNhbGxiYWNrOnJ9LG8pe2xldCBjPXFuKGUpO290Lmludm9rZVZpZXdNZXRob2QoImFkZEludGVyc2VjdGlvbk9ic2VydmVyIix7cmVxSWQ6ZSxjb21wb25lbnQ6dC4kZWwubm9kZUlkLG9wdGlvbnM6bixldmVudE5hbWU6Y30sbyksb3Quc3Vic2NyaWJlKGMscil9ZnVuY3Rpb24gdXMoe3JlcUlkOmUsY29tcG9uZW50OnR9LG4pe290Lmludm9rZVZpZXdNZXRob2QoInJlbW92ZUludGVyc2VjdGlvbk9ic2VydmVyIix7cmVxSWQ6ZSxjb21wb25lbnQ6dC4kZWwubm9kZUlkfSxuKSxvdC51bnN1YnNjcmliZShxbihlKSl9ZnVuY3Rpb24gemEoZSl7cmV0dXJuYE1lZGlhUXVlcnlPYnNlcnZlci4ke2V9YH1mdW5jdGlvbiBJYSh7cmVxSWQ6ZSxjb21wb25lbnQ6dCxvcHRpb25zOm4sY2FsbGJhY2s6cn0sbyl7bGV0IGM9emEoZSk7b3QuaW52b2tlVmlld01ldGhvZCgiYWRkTWVkaWFRdWVyeU9ic2VydmVyIix7cmVxSWQ6ZSxjb21wb25lbnQ6dC4kZWwubm9kZUlkLG9wdGlvbnM6bixldmVudE5hbWU6Y30sbyksb3Quc3Vic2NyaWJlKGMscil9ZnVuY3Rpb24gcmEoe3JlcUlkOmUsY29tcG9uZW50OnR9LG4pe290Lmludm9rZVZpZXdNZXRob2QoInJlbW92ZU1lZGlhUXVlcnlPYnNlcnZlciIse3JlcUlkOmUsY29tcG9uZW50OnQuJGVsLm5vZGVJZH0sbiksb3QudW5zdWJzY3JpYmUoemEoZSkpfWxldCBzbz0yMDAsV2E9WyJ1bmtub3duIiwibm9uZSIsImV0aGVybmV0Iiwid2lmaSIsIjJnIiwiM2ciLCI0ZyIsIjVnIl0sZnM9Il9kb2MvdW5pYXBwX3RlbXAiLFdyPWAke2ZzfV8ke0RhdGUubm93KCl9YDtmdW5jdGlvbiBHYShlKXtsZXQgdD1lLnNwbGl0KCIvIik7cmV0dXJuIHRbdC5sZW5ndGgtMV19ZnVuY3Rpb24gWWEoZSl7bGV0IHQ9ZS5zcGxpdCgiLiIpO3JldHVybiB0Lmxlbmd0aD4xPyIuIit0W3QubGVuZ3RoLTFdOiIifWxldCBGbz0iYmFja2J1dHRvbiI7ZnVuY3Rpb24gRGkoKXtQLm5hdmlnYXRlQmFjayh7ZnJvbToiYmFja2J1dHRvbiIsc3VjY2Vzcygpe319KX1sZXQgX289SHQoKSxibz1IdCgpO2Z1bmN0aW9uIGRzKCl7cmV0dXJuIHouZXh0ZW5kKHt9LGJvKX1mdW5jdGlvbiBWbygpe3JldHVybiB6LmV4dGVuZCh7fSxfbyl9ZnVuY3Rpb24geHMoe3BhdGg6ZSxxdWVyeTp0LHJlZmVycmVySW5mbzpufSl7ei5leHRlbmQoX28se3BhdGg6ZSxxdWVyeTp0P0oucGFyc2VRdWVyeSh0KTp7fSxyZWZlcnJlckluZm86bnx8e319KX1mdW5jdGlvbiBocyh7cGF0aDplLHF1ZXJ5OnQscmVmZXJyZXJJbmZvOm59KXtyZXR1cm4gei5leHRlbmQoYm8se3BhdGg6ZSxxdWVyeTp0P0oucGFyc2VRdWVyeSh0KTp7fSxyZWZlcnJlckluZm86bnx8e30sY2hhbm5lbDpzLnJ1bnRpbWUuY2hhbm5lbCxsYXVuY2hlcjpzLnJ1bnRpbWUubGF1bmNoZXJ9KSx6LmV4dGVuZChfbyxibyksei5leHRlbmQoe30sYm8pfWZ1bmN0aW9uIEJzKCl7bGV0IGU9Zi5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aWYoZS5nZXRSZWRpcmVjdEluZm8pe2xldHtwYXRoOnQscXVlcnk6bixleHRyYURhdGE6cix1c2VyQWN0aW9uOm8sZnJvbUFwcGlkOmN9PWUuZ2V0UmVkaXJlY3RJbmZvKCl8fHt9LGc9e2FwcElkOmMsZXh0cmFEYXRhOnt9fTtyZXR1cm4gciYmKGcuZXh0cmFEYXRhPXIpLHtwYXRoOnR8fCIiLHF1ZXJ5Om4/Ij8iK246IiIscmVmZXJyZXJJbmZvOmcsdXNlckFjdGlvbjpvfX19dmFyIHhlPXt9OyhmdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgVWludDhBcnJheSE9InVuZGVmaW5lZCImJnR5cGVvZiBVaW50MTZBcnJheSE9InVuZGVmaW5lZCImJnR5cGVvZiBJbnQzMkFycmF5IT0idW5kZWZpbmVkIjtmdW5jdGlvbiBuKGMsZyl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjLGcpfWUuYXNzaWduPWZ1bmN0aW9uKGMpe2Zvcih2YXIgZz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7Zy5sZW5ndGg7KXt2YXIgYj1nLnNoaWZ0KCk7aWYoISFiKXtpZih0eXBlb2YgYiE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcihiKyJtdXN0IGJlIG5vbi1vYmplY3QiKTtmb3IodmFyIFYgaW4gYiluKGIsVikmJihjW1ZdPWJbVl0pfX1yZXR1cm4gY30sZS5zaHJpbmtCdWY9ZnVuY3Rpb24oYyxnKXtyZXR1cm4gYy5sZW5ndGg9PT1nP2M6Yy5zdWJhcnJheT9jLnN1YmFycmF5KDAsZyk6KGMubGVuZ3RoPWcsYyl9O3ZhciByPXthcnJheVNldDpmdW5jdGlvbihjLGcsYixWLFQpe2lmKGcuc3ViYXJyYXkmJmMuc3ViYXJyYXkpe2Muc2V0KGcuc3ViYXJyYXkoYixiK1YpLFQpO3JldHVybn1mb3IodmFyIEw9MDtMPFY7TCsrKWNbVCtMXT1nW2IrTF19LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oYyl7dmFyIGcsYixWLFQsTCxfZTtmb3IoVj0wLGc9MCxiPWMubGVuZ3RoO2c8YjtnKyspVis9Y1tnXS5sZW5ndGg7Zm9yKF9lPW5ldyBVaW50OEFycmF5KFYpLFQ9MCxnPTAsYj1jLmxlbmd0aDtnPGI7ZysrKUw9Y1tnXSxfZS5zZXQoTCxUKSxUKz1MLmxlbmd0aDtyZXR1cm4gX2V9fSxvPXthcnJheVNldDpmdW5jdGlvbihjLGcsYixWLFQpe2Zvcih2YXIgTD0wO0w8VjtMKyspY1tUK0xdPWdbYitMXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihjKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sYyl9fTtlLnNldFR5cGVkPWZ1bmN0aW9uKGMpe2M/KGUuQnVmOD1VaW50OEFycmF5LGUuQnVmMTY9VWludDE2QXJyYXksZS5CdWYzMj1JbnQzMkFycmF5LGUuYXNzaWduKGUscikpOihlLkJ1Zjg9QXJyYXksZS5CdWYxNj1BcnJheSxlLkJ1ZjMyPUFycmF5LGUuYXNzaWduKGUsbykpfSxlLnNldFR5cGVkKHQpfSkoeGUpO3ZhciBOdD17fSxQdD17fSx3bj17fSxFcj14ZSxPaT00LEppPTAsVW89MSxOYT0yO2Z1bmN0aW9uIGlhKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDstLXQ+PTA7KWVbdF09MH12YXIgZ3M9MCxwcz0xLGRsPTIsJGw9MyxIbD0yNTgsTXM9MjksJG89MjU2LEhvPSRvKzErTXMsb2E9MzAscWE9MTksdnM9MipIbysxLGpvPTE1LERzPTE2LGpsPTcsTHM9MjU2LG1zPTE2LGhsPTE3LEZzPTE4LEphPVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdLF9zPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSxWcz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sVXM9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLGdsPTUxMix6bz1uZXcgQXJyYXkoKEhvKzIpKjIpO2lhKHpvKTt2YXIgS2E9bmV3IEFycmF5KG9hKjIpO2lhKEthKTt2YXIgbWE9bmV3IEFycmF5KGdsKTtpYShtYSk7dmFyIGthPW5ldyBBcnJheShIbC0kbCsxKTtpYShrYSk7dmFyIHlvPW5ldyBBcnJheShNcyk7aWEoeW8pO3ZhciBhYT1uZXcgQXJyYXkob2EpO2lhKGFhKTtmdW5jdGlvbiBaYShlLHQsbixyLG8pe3RoaXMuc3RhdGljX3RyZWU9ZSx0aGlzLmV4dHJhX2JpdHM9dCx0aGlzLmV4dHJhX2Jhc2U9bix0aGlzLmVsZW1zPXIsdGhpcy5tYXhfbGVuZ3RoPW8sdGhpcy5oYXNfc3RyZWU9ZSYmZS5sZW5ndGh9dmFyICRzLHBsLHNhO2Z1bmN0aW9uIFhhKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fWZ1bmN0aW9uIEhzKGUpe3JldHVybiBlPDI1Nj9tYVtlXTptYVsyNTYrKGU+Pj43KV19ZnVuY3Rpb24gUWEoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10JjI1NSxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9ZnVuY3Rpb24gdGkoZSx0LG4pe2UuYmlfdmFsaWQ+RHMtbj8oZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsUWEoZSxlLmJpX2J1ZiksZS5iaV9idWY9dD4+RHMtZS5iaV92YWxpZCxlLmJpX3ZhbGlkKz1uLURzKTooZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZS5iaV92YWxpZCs9bil9ZnVuY3Rpb24gTXIoZSx0LG4pe3RpKGUsblt0KjJdLG5bdCoyKzFdKX1mdW5jdGlvbiBsYShlLHQpe3ZhciBuPTA7ZG8gbnw9ZSYxLGU+Pj49MSxuPDw9MTt3aGlsZSgtLXQ+MCk7cmV0dXJuIG4+Pj4xfWZ1bmN0aW9uIHZsKGUpe2UuYmlfdmFsaWQ9PT0xNj8oUWEoZSxlLmJpX2J1ZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTApOmUuYmlfdmFsaWQ+PTgmJihlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1lLmJpX2J1ZiYyNTUsZS5iaV9idWY+Pj04LGUuYmlfdmFsaWQtPTgpfWZ1bmN0aW9uIHpsKGUsdCl7dmFyIG49dC5keW5fdHJlZSxyPXQubWF4X2NvZGUsbz10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxjPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxnPXQuc3RhdF9kZXNjLmV4dHJhX2JpdHMsYj10LnN0YXRfZGVzYy5leHRyYV9iYXNlLFY9dC5zdGF0X2Rlc2MubWF4X2xlbmd0aCxULEwsX2Usd2UsUGUsZnQsaHQ9MDtmb3Iod2U9MDt3ZTw9am87d2UrKyllLmJsX2NvdW50W3dlXT0wO2ZvcihuW2UuaGVhcFtlLmhlYXBfbWF4XSoyKzFdPTAsVD1lLmhlYXBfbWF4KzE7VDx2cztUKyspTD1lLmhlYXBbVF0sd2U9bltuW0wqMisxXSoyKzFdKzEsd2U+ViYmKHdlPVYsaHQrKyksbltMKjIrMV09d2UsIShMPnIpJiYoZS5ibF9jb3VudFt3ZV0rKyxQZT0wLEw+PWImJihQZT1nW0wtYl0pLGZ0PW5bTCoyXSxlLm9wdF9sZW4rPWZ0Kih3ZStQZSksYyYmKGUuc3RhdGljX2xlbis9ZnQqKG9bTCoyKzFdK1BlKSkpO2lmKGh0IT09MCl7ZG97Zm9yKHdlPVYtMTtlLmJsX2NvdW50W3dlXT09PTA7KXdlLS07ZS5ibF9jb3VudFt3ZV0tLSxlLmJsX2NvdW50W3dlKzFdKz0yLGUuYmxfY291bnRbVl0tLSxodC09Mn13aGlsZShodD4wKTtmb3Iod2U9Vjt3ZSE9PTA7d2UtLSlmb3IoTD1lLmJsX2NvdW50W3dlXTtMIT09MDspX2U9ZS5oZWFwWy0tVF0sIShfZT5yKSYmKG5bX2UqMisxXSE9PXdlJiYoZS5vcHRfbGVuKz0od2UtbltfZSoyKzFdKSpuW19lKjJdLG5bX2UqMisxXT13ZSksTC0tKX19ZnVuY3Rpb24ganMoZSx0LG4pe3ZhciByPW5ldyBBcnJheShqbysxKSxvPTAsYyxnO2ZvcihjPTE7Yzw9am87YysrKXJbY109bz1vK25bYy0xXTw8MTtmb3IoZz0wO2c8PXQ7ZysrKXt2YXIgYj1lW2cqMisxXTtiIT09MCYmKGVbZyoyXT1sYShyW2JdKyssYikpfX1mdW5jdGlvbiBicygpe3ZhciBlLHQsbixyLG8sYz1uZXcgQXJyYXkoam8rMSk7Zm9yKG49MCxyPTA7cjxNcy0xO3IrKylmb3IoeW9bcl09bixlPTA7ZTwxPDxKYVtyXTtlKyspa2FbbisrXT1yO2ZvcihrYVtuLTFdPXIsbz0wLHI9MDtyPDE2O3IrKylmb3IoYWFbcl09byxlPTA7ZTwxPDxfc1tyXTtlKyspbWFbbysrXT1yO2ZvcihvPj49NztyPG9hO3IrKylmb3IoYWFbcl09bzw8NyxlPTA7ZTwxPDxfc1tyXS03O2UrKyltYVsyNTYrbysrXT1yO2Zvcih0PTA7dDw9am87dCsrKWNbdF09MDtmb3IoZT0wO2U8PTE0Mzspem9bZSoyKzFdPTgsZSsrLGNbOF0rKztmb3IoO2U8PTI1NTspem9bZSoyKzFdPTksZSsrLGNbOV0rKztmb3IoO2U8PTI3OTspem9bZSoyKzFdPTcsZSsrLGNbN10rKztmb3IoO2U8PTI4Nzspem9bZSoyKzFdPTgsZSsrLGNbOF0rKztmb3IoanMoem8sSG8rMSxjKSxlPTA7ZTxvYTtlKyspS2FbZSoyKzFdPTUsS2FbZSoyXT1sYShlLDUpOyRzPW5ldyBaYSh6byxKYSwkbysxLEhvLGpvKSxwbD1uZXcgWmEoS2EsX3MsMCxvYSxqbyksc2E9bmV3IFphKG5ldyBBcnJheSgwKSxWcywwLHFhLGpsKX1mdW5jdGlvbiB6cyhlKXt2YXIgdDtmb3IodD0wO3Q8SG87dCsrKWUuZHluX2x0cmVlW3QqMl09MDtmb3IodD0wO3Q8b2E7dCsrKWUuZHluX2R0cmVlW3QqMl09MDtmb3IodD0wO3Q8cWE7dCsrKWUuYmxfdHJlZVt0KjJdPTA7ZS5keW5fbHRyZWVbTHMqMl09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH1mdW5jdGlvbiBXcyhlKXtlLmJpX3ZhbGlkPjg/UWEoZSxlLmJpX2J1Zik6ZS5iaV92YWxpZD4wJiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wfWZ1bmN0aW9uIG1sKGUsdCxuLHIpe1dzKGUpLHImJihRYShlLG4pLFFhKGUsfm4pKSxFci5hcnJheVNldChlLnBlbmRpbmdfYnVmLGUud2luZG93LHQsbixlLnBlbmRpbmcpLGUucGVuZGluZys9bn1mdW5jdGlvbiBHcyhlLHQsbixyKXt2YXIgbz10KjIsYz1uKjI7cmV0dXJuIGVbb108ZVtjXXx8ZVtvXT09PWVbY10mJnJbdF08PXJbbl19ZnVuY3Rpb24geXMoZSx0LG4pe2Zvcih2YXIgcj1lLmhlYXBbbl0sbz1uPDwxO288PWUuaGVhcF9sZW4mJihvPGUuaGVhcF9sZW4mJkdzKHQsZS5oZWFwW28rMV0sZS5oZWFwW29dLGUuZGVwdGgpJiZvKyssIUdzKHQscixlLmhlYXBbb10sZS5kZXB0aCkpOyllLmhlYXBbbl09ZS5oZWFwW29dLG49byxvPDw9MTtlLmhlYXBbbl09cn1mdW5jdGlvbiBFcyhlLHQsbil7dmFyIHIsbyxjPTAsZyxiO2lmKGUubGFzdF9saXQhPT0wKWRvIHI9ZS5wZW5kaW5nX2J1ZltlLmRfYnVmK2MqMl08PDh8ZS5wZW5kaW5nX2J1ZltlLmRfYnVmK2MqMisxXSxvPWUucGVuZGluZ19idWZbZS5sX2J1ZitjXSxjKysscj09PTA/TXIoZSxvLHQpOihnPWthW29dLE1yKGUsZyskbysxLHQpLGI9SmFbZ10sYiE9PTAmJihvLT15b1tnXSx0aShlLG8sYikpLHItLSxnPUhzKHIpLE1yKGUsZyxuKSxiPV9zW2ddLGIhPT0wJiYoci09YWFbZ10sdGkoZSxyLGIpKSk7d2hpbGUoYzxlLmxhc3RfbGl0KTtNcihlLExzLHQpfWZ1bmN0aW9uIFNzKGUsdCl7dmFyIG49dC5keW5fdHJlZSxyPXQuc3RhdF9kZXNjLnN0YXRpY190cmVlLG89dC5zdGF0X2Rlc2MuaGFzX3N0cmVlLGM9dC5zdGF0X2Rlc2MuZWxlbXMsZyxiLFY9LTEsVDtmb3IoZS5oZWFwX2xlbj0wLGUuaGVhcF9tYXg9dnMsZz0wO2c8YztnKyspbltnKjJdIT09MD8oZS5oZWFwWysrZS5oZWFwX2xlbl09Vj1nLGUuZGVwdGhbZ109MCk6bltnKjIrMV09MDtmb3IoO2UuaGVhcF9sZW48MjspVD1lLmhlYXBbKytlLmhlYXBfbGVuXT1WPDI/KytWOjAsbltUKjJdPTEsZS5kZXB0aFtUXT0wLGUub3B0X2xlbi0tLG8mJihlLnN0YXRpY19sZW4tPXJbVCoyKzFdKTtmb3IodC5tYXhfY29kZT1WLGc9ZS5oZWFwX2xlbj4+MTtnPj0xO2ctLSl5cyhlLG4sZyk7VD1jO2RvIGc9ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSx5cyhlLG4sMSksYj1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09ZyxlLmhlYXBbLS1lLmhlYXBfbWF4XT1iLG5bVCoyXT1uW2cqMl0rbltiKjJdLGUuZGVwdGhbVF09KGUuZGVwdGhbZ10+PWUuZGVwdGhbYl0/ZS5kZXB0aFtnXTplLmRlcHRoW2JdKSsxLG5bZyoyKzFdPW5bYioyKzFdPVQsZS5oZWFwWzFdPVQrKyx5cyhlLG4sMSk7d2hpbGUoZS5oZWFwX2xlbj49Mik7ZS5oZWFwWy0tZS5oZWFwX21heF09ZS5oZWFwWzFdLHpsKGUsdCksanMobixWLGUuYmxfY291bnQpfWZ1bmN0aW9uIF9sKGUsdCxuKXt2YXIgcixvPS0xLGMsZz10WzAqMisxXSxiPTAsVj03LFQ9NDtmb3IoZz09PTAmJihWPTEzOCxUPTMpLHRbKG4rMSkqMisxXT02NTUzNSxyPTA7cjw9bjtyKyspYz1nLGc9dFsocisxKSoyKzFdLCEoKytiPFYmJmM9PT1nKSYmKGI8VD9lLmJsX3RyZWVbYyoyXSs9YjpjIT09MD8oYyE9PW8mJmUuYmxfdHJlZVtjKjJdKyssZS5ibF90cmVlW21zKjJdKyspOmI8PTEwP2UuYmxfdHJlZVtobCoyXSsrOmUuYmxfdHJlZVtGcyoyXSsrLGI9MCxvPWMsZz09PTA/KFY9MTM4LFQ9Myk6Yz09PWc/KFY9NixUPTMpOihWPTcsVD00KSl9ZnVuY3Rpb24gYmwoZSx0LG4pe3ZhciByLG89LTEsYyxnPXRbMCoyKzFdLGI9MCxWPTcsVD00O2ZvcihnPT09MCYmKFY9MTM4LFQ9Mykscj0wO3I8PW47cisrKWlmKGM9ZyxnPXRbKHIrMSkqMisxXSwhKCsrYjxWJiZjPT09Zykpe2lmKGI8VClkbyBNcihlLGMsZS5ibF90cmVlKTt3aGlsZSgtLWIhPT0wKTtlbHNlIGMhPT0wPyhjIT09byYmKE1yKGUsYyxlLmJsX3RyZWUpLGItLSksTXIoZSxtcyxlLmJsX3RyZWUpLHRpKGUsYi0zLDIpKTpiPD0xMD8oTXIoZSxobCxlLmJsX3RyZWUpLHRpKGUsYi0zLDMpKTooTXIoZSxGcyxlLmJsX3RyZWUpLHRpKGUsYi0xMSw3KSk7Yj0wLG89YyxnPT09MD8oVj0xMzgsVD0zKTpjPT09Zz8oVj02LFQ9Myk6KFY9NyxUPTQpfX1mdW5jdGlvbiBhKGUpe3ZhciB0O2ZvcihfbChlLGUuZHluX2x0cmVlLGUubF9kZXNjLm1heF9jb2RlKSxfbChlLGUuZHluX2R0cmVlLGUuZF9kZXNjLm1heF9jb2RlKSxTcyhlLGUuYmxfZGVzYyksdD1xYS0xO3Q+PTMmJmUuYmxfdHJlZVtVc1t0XSoyKzFdPT09MDt0LS0pO3JldHVybiBlLm9wdF9sZW4rPTMqKHQrMSkrNSs1KzQsdH1mdW5jdGlvbiB1KGUsdCxuLHIpe3ZhciBvO2Zvcih0aShlLHQtMjU3LDUpLHRpKGUsbi0xLDUpLHRpKGUsci00LDQpLG89MDtvPHI7bysrKXRpKGUsZS5ibF90cmVlW1VzW29dKjIrMV0sMyk7YmwoZSxlLmR5bl9sdHJlZSx0LTEpLGJsKGUsZS5keW5fZHRyZWUsbi0xKX1mdW5jdGlvbiBtKGUpe3ZhciB0PTQwOTM2MjQ0NDcsbjtmb3Iobj0wO248PTMxO24rKyx0Pj4+PTEpaWYodCYxJiZlLmR5bl9sdHJlZVtuKjJdIT09MClyZXR1cm4gSmk7aWYoZS5keW5fbHRyZWVbOSoyXSE9PTB8fGUuZHluX2x0cmVlWzEwKjJdIT09MHx8ZS5keW5fbHRyZWVbMTMqMl0hPT0wKXJldHVybiBVbztmb3Iobj0zMjtuPCRvO24rKylpZihlLmR5bl9sdHJlZVtuKjJdIT09MClyZXR1cm4gVW87cmV0dXJuIEppfXZhciBTPSExO2Z1bmN0aW9uIEkoZSl7U3x8KGJzKCksUz0hMCksZS5sX2Rlc2M9bmV3IFhhKGUuZHluX2x0cmVlLCRzKSxlLmRfZGVzYz1uZXcgWGEoZS5keW5fZHRyZWUscGwpLGUuYmxfZGVzYz1uZXcgWGEoZS5ibF90cmVlLHNhKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MCx6cyhlKX1mdW5jdGlvbiBPKGUsdCxuLHIpe3RpKGUsKGdzPDwxKSsocj8xOjApLDMpLG1sKGUsdCxuLCEwKX1mdW5jdGlvbiBGKGUpe3RpKGUscHM8PDEsMyksTXIoZSxMcyx6byksdmwoZSl9ZnVuY3Rpb24gVyhlLHQsbixyKXt2YXIgbyxjLGc9MDtlLmxldmVsPjA/KGUuc3RybS5kYXRhX3R5cGU9PT1OYSYmKGUuc3RybS5kYXRhX3R5cGU9bShlKSksU3MoZSxlLmxfZGVzYyksU3MoZSxlLmRfZGVzYyksZz1hKGUpLG89ZS5vcHRfbGVuKzMrNz4+PjMsYz1lLnN0YXRpY19sZW4rMys3Pj4+MyxjPD1vJiYobz1jKSk6bz1jPW4rNSxuKzQ8PW8mJnQhPT0tMT9PKGUsdCxuLHIpOmUuc3RyYXRlZ3k9PT1PaXx8Yz09PW8/KHRpKGUsKHBzPDwxKSsocj8xOjApLDMpLEVzKGUsem8sS2EpKToodGkoZSwoZGw8PDEpKyhyPzE6MCksMyksdShlLGUubF9kZXNjLm1heF9jb2RlKzEsZS5kX2Rlc2MubWF4X2NvZGUrMSxnKzEpLEVzKGUsZS5keW5fbHRyZWUsZS5keW5fZHRyZWUpKSx6cyhlKSxyJiZXcyhlKX1mdW5jdGlvbiBHKGUsdCxuKXtyZXR1cm4gZS5wZW5kaW5nX2J1ZltlLmRfYnVmK2UubGFzdF9saXQqMl09dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5kX2J1ZitlLmxhc3RfbGl0KjIrMV09dCYyNTUsZS5wZW5kaW5nX2J1ZltlLmxfYnVmK2UubGFzdF9saXRdPW4mMjU1LGUubGFzdF9saXQrKyx0PT09MD9lLmR5bl9sdHJlZVtuKjJdKys6KGUubWF0Y2hlcysrLHQtLSxlLmR5bl9sdHJlZVsoa2Fbbl0rJG8rMSkqMl0rKyxlLmR5bl9kdHJlZVtIcyh0KSoyXSsrKSxlLmxhc3RfbGl0PT09ZS5saXRfYnVmc2l6ZS0xfXduLl90cl9pbml0PUksd24uX3RyX3N0b3JlZF9ibG9jaz1PLHduLl90cl9mbHVzaF9ibG9jaz1XLHduLl90cl90YWxseT1HLHduLl90cl9hbGlnbj1GO2Z1bmN0aW9uIGxlKGUsdCxuLHIpe2Zvcih2YXIgbz1lJjY1NTM1fDAsYz1lPj4+MTYmNjU1MzV8MCxnPTA7biE9PTA7KXtnPW4+MmUzPzJlMzpuLG4tPWc7ZG8gbz1vK3RbcisrXXwwLGM9YytvfDA7d2hpbGUoLS1nKTtvJT02NTUyMSxjJT02NTUyMX1yZXR1cm4gb3xjPDwxNnwwfXZhciBXZT1sZTtmdW5jdGlvbiBpdCgpe2Zvcih2YXIgZSx0PVtdLG49MDtuPDI1NjtuKyspe2U9bjtmb3IodmFyIHI9MDtyPDg7cisrKWU9ZSYxPzM5ODgyOTIzODReZT4+PjE6ZT4+PjE7dFtuXT1lfXJldHVybiB0fXZhciBnZT1pdCgpO2Z1bmN0aW9uIFllKGUsdCxuLHIpe3ZhciBvPWdlLGM9cituO2VePS0xO2Zvcih2YXIgZz1yO2c8YztnKyspZT1lPj4+OF5vWyhlXnRbZ10pJjI1NV07cmV0dXJuIGVeLTF9dmFyIEplPVllLG10PXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn0sYXQ9eGUsU2U9d24sRWU9V2UsQWU9SmUsbHQ9bXQsVmU9MCxUdD0xLGk9MyxsPTQsZD01LF89MCxBPTEsQz0tMixrPS0zLEQ9LTUsSD0tMSxuZT0xLHZlPTIsQmU9Myx1ZT00LGtlPTAsR2U9Mix1dD04LFFlPTksUmU9MTUsbWU9OCx5ZT0yOSxMZT0yNTYsT2U9TGUrMSt5ZSxidD0zMCxDdD0xOSxLZT0yKk9lKzEsUnQ9MTUsTT0zLGo9MjU4LHNlPWorTSsxLHJlPTMyLG9lPTQyLFVlPTY5LHJ0PTczLHFlPTkxLFplPTEwMywkZT0xMTMsJHQ9NjY2LHB0PTEseHQ9MixCdD0zLE1uPTQsUm49MztmdW5jdGlvbiB2bihlLHQpe3JldHVybiBlLm1zZz1sdFt0XSx0fWZ1bmN0aW9uIGJuKGUpe3JldHVybihlPDwxKS0oZT40Pzk6MCl9ZnVuY3Rpb24gZnIoZSl7Zm9yKHZhciB0PWUubGVuZ3RoOy0tdD49MDspZVt0XT0wfWZ1bmN0aW9uIG5pKGUpe3ZhciB0PWUuc3RhdGUsbj10LnBlbmRpbmc7bj5lLmF2YWlsX291dCYmKG49ZS5hdmFpbF9vdXQpLG4hPT0wJiYoYXQuYXJyYXlTZXQoZS5vdXRwdXQsdC5wZW5kaW5nX2J1Zix0LnBlbmRpbmdfb3V0LG4sZS5uZXh0X291dCksZS5uZXh0X291dCs9bix0LnBlbmRpbmdfb3V0Kz1uLGUudG90YWxfb3V0Kz1uLGUuYXZhaWxfb3V0LT1uLHQucGVuZGluZy09bix0LnBlbmRpbmc9PT0wJiYodC5wZW5kaW5nX291dD0wKSl9ZnVuY3Rpb24gSnQoZSx0KXtTZS5fdHJfZmx1c2hfYmxvY2soZSxlLmJsb2NrX3N0YXJ0Pj0wP2UuYmxvY2tfc3RhcnQ6LTEsZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0LHQpLGUuYmxvY2tfc3RhcnQ9ZS5zdHJzdGFydCxuaShlLnN0cm0pfWZ1bmN0aW9uIGFuKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dH1mdW5jdGlvbiBsbyhlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10JjI1NX1mdW5jdGlvbiBZKGUsdCxuLHIpe3ZhciBvPWUuYXZhaWxfaW47cmV0dXJuIG8+ciYmKG89ciksbz09PTA/MDooZS5hdmFpbF9pbi09byxhdC5hcnJheVNldCh0LGUuaW5wdXQsZS5uZXh0X2luLG8sbiksZS5zdGF0ZS53cmFwPT09MT9lLmFkbGVyPUVlKGUuYWRsZXIsdCxvLG4pOmUuc3RhdGUud3JhcD09PTImJihlLmFkbGVyPUFlKGUuYWRsZXIsdCxvLG4pKSxlLm5leHRfaW4rPW8sZS50b3RhbF9pbis9byxvKX1mdW5jdGlvbiBlZShlLHQpe3ZhciBuPWUubWF4X2NoYWluX2xlbmd0aCxyPWUuc3Ryc3RhcnQsbyxjLGc9ZS5wcmV2X2xlbmd0aCxiPWUubmljZV9tYXRjaCxWPWUuc3Ryc3RhcnQ+ZS53X3NpemUtc2U/ZS5zdHJzdGFydC0oZS53X3NpemUtc2UpOjAsVD1lLndpbmRvdyxMPWUud19tYXNrLF9lPWUucHJldix3ZT1lLnN0cnN0YXJ0K2osUGU9VFtyK2ctMV0sZnQ9VFtyK2ddO2UucHJldl9sZW5ndGg+PWUuZ29vZF9tYXRjaCYmKG4+Pj0yKSxiPmUubG9va2FoZWFkJiYoYj1lLmxvb2thaGVhZCk7ZG8gaWYobz10LCEoVFtvK2ddIT09ZnR8fFRbbytnLTFdIT09UGV8fFRbb10hPT1UW3JdfHxUWysrb10hPT1UW3IrMV0pKXtyKz0yLG8rKztkbzt3aGlsZShUWysrcl09PT1UWysrb10mJlRbKytyXT09PVRbKytvXSYmVFsrK3JdPT09VFsrK29dJiZUWysrcl09PT1UWysrb10mJlRbKytyXT09PVRbKytvXSYmVFsrK3JdPT09VFsrK29dJiZUWysrcl09PT1UWysrb10mJlRbKytyXT09PVRbKytvXSYmcjx3ZSk7aWYoYz1qLSh3ZS1yKSxyPXdlLWosYz5nKXtpZihlLm1hdGNoX3N0YXJ0PXQsZz1jLGM+PWIpYnJlYWs7UGU9VFtyK2ctMV0sZnQ9VFtyK2ddfX13aGlsZSgodD1fZVt0JkxdKT5WJiYtLW4hPT0wKTtyZXR1cm4gZzw9ZS5sb29rYWhlYWQ/ZzplLmxvb2thaGVhZH1mdW5jdGlvbiBiZShlKXt2YXIgdD1lLndfc2l6ZSxuLHIsbyxjLGc7ZG97aWYoYz1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49dCsodC1zZSkpe2F0LmFycmF5U2V0KGUud2luZG93LGUud2luZG93LHQsdCwwKSxlLm1hdGNoX3N0YXJ0LT10LGUuc3Ryc3RhcnQtPXQsZS5ibG9ja19zdGFydC09dCxyPWUuaGFzaF9zaXplLG49cjtkbyBvPWUuaGVhZFstLW5dLGUuaGVhZFtuXT1vPj10P28tdDowO3doaWxlKC0tcik7cj10LG49cjtkbyBvPWUucHJldlstLW5dLGUucHJldltuXT1vPj10P28tdDowO3doaWxlKC0tcik7Yys9dH1pZihlLnN0cm0uYXZhaWxfaW49PT0wKWJyZWFrO2lmKHI9WShlLnN0cm0sZS53aW5kb3csZS5zdHJzdGFydCtlLmxvb2thaGVhZCxjKSxlLmxvb2thaGVhZCs9cixlLmxvb2thaGVhZCtlLmluc2VydD49TSlmb3IoZz1lLnN0cnN0YXJ0LWUuaW5zZXJ0LGUuaW5zX2g9ZS53aW5kb3dbZ10sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2crMV0pJmUuaGFzaF9tYXNrO2UuaW5zZXJ0JiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2crTS0xXSkmZS5oYXNoX21hc2ssZS5wcmV2W2cmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZyxnKyssZS5pbnNlcnQtLSwhKGUubG9va2FoZWFkK2UuaW5zZXJ0PE0pKTspO313aGlsZShlLmxvb2thaGVhZDxzZSYmZS5zdHJtLmF2YWlsX2luIT09MCl9ZnVuY3Rpb24gTWUoZSx0KXt2YXIgbj02NTUzNTtmb3Iobj5lLnBlbmRpbmdfYnVmX3NpemUtNSYmKG49ZS5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKGUubG9va2FoZWFkPD0xKXtpZihiZShlKSxlLmxvb2thaGVhZD09PTAmJnQ9PT1WZSlyZXR1cm4gcHQ7aWYoZS5sb29rYWhlYWQ9PT0wKWJyZWFrfWUuc3Ryc3RhcnQrPWUubG9va2FoZWFkLGUubG9va2FoZWFkPTA7dmFyIHI9ZS5ibG9ja19zdGFydCtuO2lmKChlLnN0cnN0YXJ0PT09MHx8ZS5zdHJzdGFydD49cikmJihlLmxvb2thaGVhZD1lLnN0cnN0YXJ0LXIsZS5zdHJzdGFydD1yLEp0KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKXx8ZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0Pj1lLndfc2l6ZS1zZSYmKEp0KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gcHR9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PWw/KEp0KGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP0J0Ok1uKTooZS5zdHJzdGFydD5lLmJsb2NrX3N0YXJ0JiYoSnQoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApLHB0KX1mdW5jdGlvbiBEZShlLHQpe2Zvcih2YXIgbixyOzspe2lmKGUubG9va2FoZWFkPHNlKXtpZihiZShlKSxlLmxvb2thaGVhZDxzZSYmdD09PVZlKXJldHVybiBwdDtpZihlLmxvb2thaGVhZD09PTApYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1NJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrTS0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSxuIT09MCYmZS5zdHJzdGFydC1uPD1lLndfc2l6ZS1zZSYmKGUubWF0Y2hfbGVuZ3RoPWVlKGUsbikpLGUubWF0Y2hfbGVuZ3RoPj1NKWlmKHI9U2UuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0LGUubWF0Y2hfbGVuZ3RoLU0pLGUubG9va2FoZWFkLT1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aDw9ZS5tYXhfbGF6eV9tYXRjaCYmZS5sb29rYWhlYWQ+PU0pe2UubWF0Y2hfbGVuZ3RoLS07ZG8gZS5zdHJzdGFydCsrLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K00tMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydDt3aGlsZSgtLWUubWF0Y2hfbGVuZ3RoIT09MCk7ZS5zdHJzdGFydCsrfWVsc2UgZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCxlLmluc19oPWUud2luZG93W2Uuc3Ryc3RhcnRdLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0KzFdKSZlLmhhc2hfbWFzaztlbHNlIHI9U2UuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0Kys7aWYociYmKEp0KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gcHR9cmV0dXJuIGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8TS0xP2Uuc3Ryc3RhcnQ6TS0xLHQ9PT1sPyhKdChlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD9CdDpNbik6ZS5sYXN0X2xpdCYmKEp0KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT9wdDp4dH1mdW5jdGlvbiBYZShlLHQpe2Zvcih2YXIgbixyLG87Oyl7aWYoZS5sb29rYWhlYWQ8c2Upe2lmKGJlKGUpLGUubG9va2FoZWFkPHNlJiZ0PT09VmUpcmV0dXJuIHB0O2lmKGUubG9va2FoZWFkPT09MClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PU0mJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtNLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9TS0xLG4hPT0wJiZlLnByZXZfbGVuZ3RoPGUubWF4X2xhenlfbWF0Y2gmJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUtc2UmJihlLm1hdGNoX2xlbmd0aD1lZShlLG4pLGUubWF0Y2hfbGVuZ3RoPD01JiYoZS5zdHJhdGVneT09PW5lfHxlLm1hdGNoX2xlbmd0aD09PU0mJmUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydD40MDk2KSYmKGUubWF0Y2hfbGVuZ3RoPU0tMSkpLGUucHJldl9sZW5ndGg+PU0mJmUubWF0Y2hfbGVuZ3RoPD1lLnByZXZfbGVuZ3RoKXtvPWUuc3Ryc3RhcnQrZS5sb29rYWhlYWQtTSxyPVNlLl90cl90YWxseShlLGUuc3Ryc3RhcnQtMS1lLnByZXZfbWF0Y2gsZS5wcmV2X2xlbmd0aC1NKSxlLmxvb2thaGVhZC09ZS5wcmV2X2xlbmd0aC0xLGUucHJldl9sZW5ndGgtPTI7ZG8rK2Uuc3Ryc3RhcnQ8PW8mJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtNLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpO3doaWxlKC0tZS5wcmV2X2xlbmd0aCE9PTApO2lmKGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5tYXRjaF9sZW5ndGg9TS0xLGUuc3Ryc3RhcnQrKyxyJiYoSnQoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiBwdH1lbHNlIGlmKGUubWF0Y2hfYXZhaWxhYmxlKXtpZihyPVNlLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksciYmSnQoZSwhMSksZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS0sZS5zdHJtLmF2YWlsX291dD09PTApcmV0dXJuIHB0fWVsc2UgZS5tYXRjaF9hdmFpbGFibGU9MSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLX1yZXR1cm4gZS5tYXRjaF9hdmFpbGFibGUmJihyPVNlLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDxNLTE/ZS5zdHJzdGFydDpNLTEsdD09PWw/KEp0KGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP0J0Ok1uKTplLmxhc3RfbGl0JiYoSnQoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP3B0Onh0fWZ1bmN0aW9uIF90KGUsdCl7Zm9yKHZhciBuLHIsbyxjLGc9ZS53aW5kb3c7Oyl7aWYoZS5sb29rYWhlYWQ8PWope2lmKGJlKGUpLGUubG9va2FoZWFkPD1qJiZ0PT09VmUpcmV0dXJuIHB0O2lmKGUubG9va2FoZWFkPT09MClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj1NJiZlLnN0cnN0YXJ0PjAmJihvPWUuc3Ryc3RhcnQtMSxyPWdbb10scj09PWdbKytvXSYmcj09PWdbKytvXSYmcj09PWdbKytvXSkpe2M9ZS5zdHJzdGFydCtqO2RvO3doaWxlKHI9PT1nWysrb10mJnI9PT1nWysrb10mJnI9PT1nWysrb10mJnI9PT1nWysrb10mJnI9PT1nWysrb10mJnI9PT1nWysrb10mJnI9PT1nWysrb10mJnI9PT1nWysrb10mJm88Yyk7ZS5tYXRjaF9sZW5ndGg9ai0oYy1vKSxlLm1hdGNoX2xlbmd0aD5lLmxvb2thaGVhZCYmKGUubWF0Y2hfbGVuZ3RoPWUubG9va2FoZWFkKX1pZihlLm1hdGNoX2xlbmd0aD49TT8obj1TZS5fdHJfdGFsbHkoZSwxLGUubWF0Y2hfbGVuZ3RoLU0pLGUubG9va2FoZWFkLT1lLm1hdGNoX2xlbmd0aCxlLnN0cnN0YXJ0Kz1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aD0wKToobj1TZS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyksbiYmKEp0KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gcHR9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PWw/KEp0KGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP0J0Ok1uKTplLmxhc3RfbGl0JiYoSnQoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP3B0Onh0fWZ1bmN0aW9uIGV0KGUsdCl7Zm9yKHZhciBuOzspe2lmKGUubG9va2FoZWFkPT09MCYmKGJlKGUpLGUubG9va2FoZWFkPT09MCkpe2lmKHQ9PT1WZSlyZXR1cm4gcHQ7YnJlYWt9aWYoZS5tYXRjaF9sZW5ndGg9MCxuPVNlLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrLG4mJihKdChlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIHB0fXJldHVybiBlLmluc2VydD0wLHQ9PT1sPyhKdChlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD9CdDpNbik6ZS5sYXN0X2xpdCYmKEp0KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT9wdDp4dH1mdW5jdGlvbiB0dChlLHQsbixyLG8pe3RoaXMuZ29vZF9sZW5ndGg9ZSx0aGlzLm1heF9sYXp5PXQsdGhpcy5uaWNlX2xlbmd0aD1uLHRoaXMubWF4X2NoYWluPXIsdGhpcy5mdW5jPW99dmFyIEhlO0hlPVtuZXcgdHQoMCwwLDAsMCxNZSksbmV3IHR0KDQsNCw4LDQsRGUpLG5ldyB0dCg0LDUsMTYsOCxEZSksbmV3IHR0KDQsNiwzMiwzMixEZSksbmV3IHR0KDQsNCwxNiwxNixYZSksbmV3IHR0KDgsMTYsMzIsMzIsWGUpLG5ldyB0dCg4LDE2LDEyOCwxMjgsWGUpLG5ldyB0dCg4LDMyLDEyOCwyNTYsWGUpLG5ldyB0dCgzMiwxMjgsMjU4LDEwMjQsWGUpLG5ldyB0dCgzMiwyNTgsMjU4LDQwOTYsWGUpXTtmdW5jdGlvbiB6dChlKXtlLndpbmRvd19zaXplPTIqZS53X3NpemUsZnIoZS5oZWFkKSxlLm1heF9sYXp5X21hdGNoPUhlW2UubGV2ZWxdLm1heF9sYXp5LGUuZ29vZF9tYXRjaD1IZVtlLmxldmVsXS5nb29kX2xlbmd0aCxlLm5pY2VfbWF0Y2g9SGVbZS5sZXZlbF0ubmljZV9sZW5ndGgsZS5tYXhfY2hhaW5fbGVuZ3RoPUhlW2UubGV2ZWxdLm1heF9jaGFpbixlLnN0cnN0YXJ0PTAsZS5ibG9ja19zdGFydD0wLGUubG9va2FoZWFkPTAsZS5pbnNlcnQ9MCxlLm1hdGNoX2xlbmd0aD1lLnByZXZfbGVuZ3RoPU0tMSxlLm1hdGNoX2F2YWlsYWJsZT0wLGUuaW5zX2g9MH1mdW5jdGlvbiBMdCgpe3RoaXMuc3RybT1udWxsLHRoaXMuc3RhdHVzPTAsdGhpcy5wZW5kaW5nX2J1Zj1udWxsLHRoaXMucGVuZGluZ19idWZfc2l6ZT0wLHRoaXMucGVuZGluZ19vdXQ9MCx0aGlzLnBlbmRpbmc9MCx0aGlzLndyYXA9MCx0aGlzLmd6aGVhZD1udWxsLHRoaXMuZ3ppbmRleD0wLHRoaXMubWV0aG9kPXV0LHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBhdC5CdWYxNihLZSoyKSx0aGlzLmR5bl9kdHJlZT1uZXcgYXQuQnVmMTYoKDIqYnQrMSkqMiksdGhpcy5ibF90cmVlPW5ldyBhdC5CdWYxNigoMipDdCsxKSoyKSxmcih0aGlzLmR5bl9sdHJlZSksZnIodGhpcy5keW5fZHRyZWUpLGZyKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IGF0LkJ1ZjE2KFJ0KzEpLHRoaXMuaGVhcD1uZXcgYXQuQnVmMTYoMipPZSsxKSxmcih0aGlzLmhlYXApLHRoaXMuaGVhcF9sZW49MCx0aGlzLmhlYXBfbWF4PTAsdGhpcy5kZXB0aD1uZXcgYXQuQnVmMTYoMipPZSsxKSxmcih0aGlzLmRlcHRoKSx0aGlzLmxfYnVmPTAsdGhpcy5saXRfYnVmc2l6ZT0wLHRoaXMubGFzdF9saXQ9MCx0aGlzLmRfYnVmPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1mdW5jdGlvbiBXdChlKXt2YXIgdDtyZXR1cm4hZXx8IWUuc3RhdGU/dm4oZSxDKTooZS50b3RhbF9pbj1lLnRvdGFsX291dD0wLGUuZGF0YV90eXBlPUdlLHQ9ZS5zdGF0ZSx0LnBlbmRpbmc9MCx0LnBlbmRpbmdfb3V0PTAsdC53cmFwPDAmJih0LndyYXA9LXQud3JhcCksdC5zdGF0dXM9dC53cmFwP29lOiRlLGUuYWRsZXI9dC53cmFwPT09Mj8wOjEsdC5sYXN0X2ZsdXNoPVZlLFNlLl90cl9pbml0KHQpLF8pfWZ1bmN0aW9uIE9uKGUpe3ZhciB0PVd0KGUpO3JldHVybiB0PT09XyYmenQoZS5zdGF0ZSksdH1mdW5jdGlvbiBHcihlLHQpe3JldHVybiFlfHwhZS5zdGF0ZXx8ZS5zdGF0ZS53cmFwIT09Mj9DOihlLnN0YXRlLmd6aGVhZD10LF8pfWZ1bmN0aW9uIFhuKGUsdCxuLHIsbyxjKXtpZighZSlyZXR1cm4gQzt2YXIgZz0xO2lmKHQ9PT1IJiYodD02KSxyPDA/KGc9MCxyPS1yKTpyPjE1JiYoZz0yLHItPTE2KSxvPDF8fG8+UWV8fG4hPT11dHx8cjw4fHxyPjE1fHx0PDB8fHQ+OXx8YzwwfHxjPnVlKXJldHVybiB2bihlLEMpO3I9PT04JiYocj05KTt2YXIgYj1uZXcgTHQ7cmV0dXJuIGUuc3RhdGU9YixiLnN0cm09ZSxiLndyYXA9ZyxiLmd6aGVhZD1udWxsLGIud19iaXRzPXIsYi53X3NpemU9MTw8Yi53X2JpdHMsYi53X21hc2s9Yi53X3NpemUtMSxiLmhhc2hfYml0cz1vKzcsYi5oYXNoX3NpemU9MTw8Yi5oYXNoX2JpdHMsYi5oYXNoX21hc2s9Yi5oYXNoX3NpemUtMSxiLmhhc2hfc2hpZnQ9fn4oKGIuaGFzaF9iaXRzK00tMSkvTSksYi53aW5kb3c9bmV3IGF0LkJ1ZjgoYi53X3NpemUqMiksYi5oZWFkPW5ldyBhdC5CdWYxNihiLmhhc2hfc2l6ZSksYi5wcmV2PW5ldyBhdC5CdWYxNihiLndfc2l6ZSksYi5saXRfYnVmc2l6ZT0xPDxvKzYsYi5wZW5kaW5nX2J1Zl9zaXplPWIubGl0X2J1ZnNpemUqNCxiLnBlbmRpbmdfYnVmPW5ldyBhdC5CdWY4KGIucGVuZGluZ19idWZfc2l6ZSksYi5kX2J1Zj0xKmIubGl0X2J1ZnNpemUsYi5sX2J1Zj0oMSsyKSpiLmxpdF9idWZzaXplLGIubGV2ZWw9dCxiLnN0cmF0ZWd5PWMsYi5tZXRob2Q9bixPbihlKX1mdW5jdGlvbiB1aShlLHQpe3JldHVybiBYbihlLHQsdXQsUmUsbWUsa2UpfWZ1bmN0aW9uIFdvKGUsdCl7dmFyIG4scixvLGM7aWYoIWV8fCFlLnN0YXRlfHx0PmR8fHQ8MClyZXR1cm4gZT92bihlLEMpOkM7aWYocj1lLnN0YXRlLCFlLm91dHB1dHx8IWUuaW5wdXQmJmUuYXZhaWxfaW4hPT0wfHxyLnN0YXR1cz09PSR0JiZ0IT09bClyZXR1cm4gdm4oZSxlLmF2YWlsX291dD09PTA/RDpDKTtpZihyLnN0cm09ZSxuPXIubGFzdF9mbHVzaCxyLmxhc3RfZmx1c2g9dCxyLnN0YXR1cz09PW9lKWlmKHIud3JhcD09PTIpZS5hZGxlcj0wLGFuKHIsMzEpLGFuKHIsMTM5KSxhbihyLDgpLHIuZ3poZWFkPyhhbihyLChyLmd6aGVhZC50ZXh0PzE6MCkrKHIuZ3poZWFkLmhjcmM/MjowKSsoci5nemhlYWQuZXh0cmE/NDowKSsoci5nemhlYWQubmFtZT84OjApKyhyLmd6aGVhZC5jb21tZW50PzE2OjApKSxhbihyLHIuZ3poZWFkLnRpbWUmMjU1KSxhbihyLHIuZ3poZWFkLnRpbWU+PjgmMjU1KSxhbihyLHIuZ3poZWFkLnRpbWU+PjE2JjI1NSksYW4ocixyLmd6aGVhZC50aW1lPj4yNCYyNTUpLGFuKHIsci5sZXZlbD09PTk/MjpyLnN0cmF0ZWd5Pj12ZXx8ci5sZXZlbDwyPzQ6MCksYW4ocixyLmd6aGVhZC5vcyYyNTUpLHIuZ3poZWFkLmV4dHJhJiZyLmd6aGVhZC5leHRyYS5sZW5ndGgmJihhbihyLHIuZ3poZWFkLmV4dHJhLmxlbmd0aCYyNTUpLGFuKHIsci5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLHIuZ3poZWFkLmhjcmMmJihlLmFkbGVyPUFlKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmcsMCkpLHIuZ3ppbmRleD0wLHIuc3RhdHVzPVVlKTooYW4ociwwKSxhbihyLDApLGFuKHIsMCksYW4ociwwKSxhbihyLDApLGFuKHIsci5sZXZlbD09PTk/MjpyLnN0cmF0ZWd5Pj12ZXx8ci5sZXZlbDwyPzQ6MCksYW4ocixSbiksci5zdGF0dXM9JGUpO2Vsc2V7dmFyIGc9dXQrKHIud19iaXRzLTg8PDQpPDw4LGI9LTE7ci5zdHJhdGVneT49dmV8fHIubGV2ZWw8Mj9iPTA6ci5sZXZlbDw2P2I9MTpyLmxldmVsPT09Nj9iPTI6Yj0zLGd8PWI8PDYsci5zdHJzdGFydCE9PTAmJihnfD1yZSksZys9MzEtZyUzMSxyLnN0YXR1cz0kZSxsbyhyLGcpLHIuc3Ryc3RhcnQhPT0wJiYobG8ocixlLmFkbGVyPj4+MTYpLGxvKHIsZS5hZGxlciY2NTUzNSkpLGUuYWRsZXI9MX1pZihyLnN0YXR1cz09PVVlKWlmKHIuZ3poZWFkLmV4dHJhKXtmb3Iobz1yLnBlbmRpbmc7ci5nemluZGV4PChyLmd6aGVhZC5leHRyYS5sZW5ndGgmNjU1MzUpJiYhKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5vJiYoZS5hZGxlcj1BZShlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW8sbykpLG5pKGUpLG89ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpOylhbihyLHIuZ3poZWFkLmV4dHJhW3IuZ3ppbmRleF0mMjU1KSxyLmd6aW5kZXgrKztyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+byYmKGUuYWRsZXI9QWUoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1vLG8pKSxyLmd6aW5kZXg9PT1yLmd6aGVhZC5leHRyYS5sZW5ndGgmJihyLmd6aW5kZXg9MCxyLnN0YXR1cz1ydCl9ZWxzZSByLnN0YXR1cz1ydDtpZihyLnN0YXR1cz09PXJ0KWlmKHIuZ3poZWFkLm5hbWUpe289ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5vJiYoZS5hZGxlcj1BZShlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW8sbykpLG5pKGUpLG89ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe2M9MTticmVha31yLmd6aW5kZXg8ci5nemhlYWQubmFtZS5sZW5ndGg/Yz1yLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoci5nemluZGV4KyspJjI1NTpjPTAsYW4ocixjKX13aGlsZShjIT09MCk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPm8mJihlLmFkbGVyPUFlKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctbyxvKSksYz09PTAmJihyLmd6aW5kZXg9MCxyLnN0YXR1cz1xZSl9ZWxzZSByLnN0YXR1cz1xZTtpZihyLnN0YXR1cz09PXFlKWlmKHIuZ3poZWFkLmNvbW1lbnQpe289ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5vJiYoZS5hZGxlcj1BZShlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW8sbykpLG5pKGUpLG89ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe2M9MTticmVha31yLmd6aW5kZXg8ci5nemhlYWQuY29tbWVudC5sZW5ndGg/Yz1yLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQoci5nemluZGV4KyspJjI1NTpjPTAsYW4ocixjKX13aGlsZShjIT09MCk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPm8mJihlLmFkbGVyPUFlKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctbyxvKSksYz09PTAmJihyLnN0YXR1cz1aZSl9ZWxzZSByLnN0YXR1cz1aZTtpZihyLnN0YXR1cz09PVplJiYoci5nemhlYWQuaGNyYz8oci5wZW5kaW5nKzI+ci5wZW5kaW5nX2J1Zl9zaXplJiZuaShlKSxyLnBlbmRpbmcrMjw9ci5wZW5kaW5nX2J1Zl9zaXplJiYoYW4ocixlLmFkbGVyJjI1NSksYW4ocixlLmFkbGVyPj44JjI1NSksZS5hZGxlcj0wLHIuc3RhdHVzPSRlKSk6ci5zdGF0dXM9JGUpLHIucGVuZGluZyE9PTApe2lmKG5pKGUpLGUuYXZhaWxfb3V0PT09MClyZXR1cm4gci5sYXN0X2ZsdXNoPS0xLF99ZWxzZSBpZihlLmF2YWlsX2luPT09MCYmYm4odCk8PWJuKG4pJiZ0IT09bClyZXR1cm4gdm4oZSxEKTtpZihyLnN0YXR1cz09PSR0JiZlLmF2YWlsX2luIT09MClyZXR1cm4gdm4oZSxEKTtpZihlLmF2YWlsX2luIT09MHx8ci5sb29rYWhlYWQhPT0wfHx0IT09VmUmJnIuc3RhdHVzIT09JHQpe3ZhciBWPXIuc3RyYXRlZ3k9PT12ZT9ldChyLHQpOnIuc3RyYXRlZ3k9PT1CZT9fdChyLHQpOkhlW3IubGV2ZWxdLmZ1bmMocix0KTtpZigoVj09PUJ0fHxWPT09TW4pJiYoci5zdGF0dXM9JHQpLFY9PT1wdHx8Vj09PUJ0KXJldHVybiBlLmF2YWlsX291dD09PTAmJihyLmxhc3RfZmx1c2g9LTEpLF87aWYoVj09PXh0JiYodD09PVR0P1NlLl90cl9hbGlnbihyKTp0IT09ZCYmKFNlLl90cl9zdG9yZWRfYmxvY2sociwwLDAsITEpLHQ9PT1pJiYoZnIoci5oZWFkKSxyLmxvb2thaGVhZD09PTAmJihyLnN0cnN0YXJ0PTAsci5ibG9ja19zdGFydD0wLHIuaW5zZXJ0PTApKSksbmkoZSksZS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gci5sYXN0X2ZsdXNoPS0xLF99cmV0dXJuIHQhPT1sP186ci53cmFwPD0wP0E6KHIud3JhcD09PTI/KGFuKHIsZS5hZGxlciYyNTUpLGFuKHIsZS5hZGxlcj4+OCYyNTUpLGFuKHIsZS5hZGxlcj4+MTYmMjU1KSxhbihyLGUuYWRsZXI+PjI0JjI1NSksYW4ocixlLnRvdGFsX2luJjI1NSksYW4ocixlLnRvdGFsX2luPj44JjI1NSksYW4ocixlLnRvdGFsX2luPj4xNiYyNTUpLGFuKHIsZS50b3RhbF9pbj4+MjQmMjU1KSk6KGxvKHIsZS5hZGxlcj4+PjE2KSxsbyhyLGUuYWRsZXImNjU1MzUpKSxuaShlKSxyLndyYXA+MCYmKHIud3JhcD0tci53cmFwKSxyLnBlbmRpbmchPT0wP186QSl9ZnVuY3Rpb24gZXMoZSl7dmFyIHQ7cmV0dXJuIWV8fCFlLnN0YXRlP0M6KHQ9ZS5zdGF0ZS5zdGF0dXMsdCE9PW9lJiZ0IT09VWUmJnQhPT1ydCYmdCE9PXFlJiZ0IT09WmUmJnQhPT0kZSYmdCE9PSR0P3ZuKGUsQyk6KGUuc3RhdGU9bnVsbCx0PT09JGU/dm4oZSxrKTpfKSl9ZnVuY3Rpb24gd3MoZSx0KXt2YXIgbj10Lmxlbmd0aCxyLG8sYyxnLGIsVixULEw7aWYoIWV8fCFlLnN0YXRlfHwocj1lLnN0YXRlLGc9ci53cmFwLGc9PT0yfHxnPT09MSYmci5zdGF0dXMhPT1vZXx8ci5sb29rYWhlYWQpKXJldHVybiBDO2ZvcihnPT09MSYmKGUuYWRsZXI9RWUoZS5hZGxlcix0LG4sMCkpLHIud3JhcD0wLG4+PXIud19zaXplJiYoZz09PTAmJihmcihyLmhlYWQpLHIuc3Ryc3RhcnQ9MCxyLmJsb2NrX3N0YXJ0PTAsci5pbnNlcnQ9MCksTD1uZXcgYXQuQnVmOChyLndfc2l6ZSksYXQuYXJyYXlTZXQoTCx0LG4tci53X3NpemUsci53X3NpemUsMCksdD1MLG49ci53X3NpemUpLGI9ZS5hdmFpbF9pbixWPWUubmV4dF9pbixUPWUuaW5wdXQsZS5hdmFpbF9pbj1uLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxiZShyKTtyLmxvb2thaGVhZD49TTspe289ci5zdHJzdGFydCxjPXIubG9va2FoZWFkLShNLTEpO2RvIHIuaW5zX2g9KHIuaW5zX2g8PHIuaGFzaF9zaGlmdF5yLndpbmRvd1tvK00tMV0pJnIuaGFzaF9tYXNrLHIucHJldltvJnIud19tYXNrXT1yLmhlYWRbci5pbnNfaF0sci5oZWFkW3IuaW5zX2hdPW8sbysrO3doaWxlKC0tYyk7ci5zdHJzdGFydD1vLHIubG9va2FoZWFkPU0tMSxiZShyKX1yZXR1cm4gci5zdHJzdGFydCs9ci5sb29rYWhlYWQsci5ibG9ja19zdGFydD1yLnN0cnN0YXJ0LHIuaW5zZXJ0PXIubG9va2FoZWFkLHIubG9va2FoZWFkPTAsci5tYXRjaF9sZW5ndGg9ci5wcmV2X2xlbmd0aD1NLTEsci5tYXRjaF9hdmFpbGFibGU9MCxlLm5leHRfaW49VixlLmlucHV0PVQsZS5hdmFpbF9pbj1iLHIud3JhcD1nLF99UHQuZGVmbGF0ZUluaXQ9dWksUHQuZGVmbGF0ZUluaXQyPVhuLFB0LmRlZmxhdGVSZXNldD1PbixQdC5kZWZsYXRlUmVzZXRLZWVwPVd0LFB0LmRlZmxhdGVTZXRIZWFkZXI9R3IsUHQuZGVmbGF0ZT1XbyxQdC5kZWZsYXRlRW5kPWVzLFB0LmRlZmxhdGVTZXREaWN0aW9uYXJ5PXdzLFB0LmRlZmxhdGVJbmZvPSJwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIjt2YXIgcnI9e30sUmE9eGUsQ3M9ITAsS2k9ITA7dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxbMF0pfWNhdGNoKGUpe0NzPSExfXRyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoKGUpe0tpPSExfWZvcih2YXIgR289bmV3IFJhLkJ1ZjgoMjU2KSxjbz0wO2NvPDI1NjtjbysrKUdvW2NvXT1jbz49MjUyPzY6Y28+PTI0OD81OmNvPj0yNDA/NDpjbz49MjI0PzM6Y28+PTE5Mj8yOjE7R29bMjU0XT1Hb1syNTRdPTEscnIuc3RyaW5nMmJ1Zj1mdW5jdGlvbihlKXt2YXIgdCxuLHIsbyxjLGc9ZS5sZW5ndGgsYj0wO2ZvcihvPTA7bzxnO28rKyluPWUuY2hhckNvZGVBdChvKSwobiY2NDUxMik9PT01NTI5NiYmbysxPGcmJihyPWUuY2hhckNvZGVBdChvKzEpLChyJjY0NTEyKT09PTU2MzIwJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxvKyspKSxiKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PW5ldyBSYS5CdWY4KGIpLGM9MCxvPTA7YzxiO28rKyluPWUuY2hhckNvZGVBdChvKSwobiY2NDUxMik9PT01NTI5NiYmbysxPGcmJihyPWUuY2hhckNvZGVBdChvKzEpLChyJjY0NTEyKT09PTU2MzIwJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxvKyspKSxuPDEyOD90W2MrK109bjpuPDIwNDg/KHRbYysrXT0xOTJ8bj4+PjYsdFtjKytdPTEyOHxuJjYzKTpuPDY1NTM2Pyh0W2MrK109MjI0fG4+Pj4xMix0W2MrK109MTI4fG4+Pj42JjYzLHRbYysrXT0xMjh8biY2Myk6KHRbYysrXT0yNDB8bj4+PjE4LHRbYysrXT0xMjh8bj4+PjEyJjYzLHRbYysrXT0xMjh8bj4+PjYmNjMsdFtjKytdPTEyOHxuJjYzKTtyZXR1cm4gdH07ZnVuY3Rpb24gX2EoZSx0KXtpZih0PDY1NTM0JiYoZS5zdWJhcnJheSYmS2l8fCFlLnN1YmFycmF5JiZDcykpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxSYS5zaHJpbmtCdWYoZSx0KSk7Zm9yKHZhciBuPSIiLHI9MDtyPHQ7cisrKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtyXSk7cmV0dXJuIG59cnIuYnVmMmJpbnN0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gX2EoZSxlLmxlbmd0aCl9LHJyLmJpbnN0cmluZzJidWY9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW5ldyBSYS5CdWY4KGUubGVuZ3RoKSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXRbbl09ZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fSxyci5idWYyc3RyaW5nPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGMsZz10fHxlLmxlbmd0aCxiPW5ldyBBcnJheShnKjIpO2ZvcihyPTAsbj0wO248Zzspe2lmKG89ZVtuKytdLG88MTI4KXtiW3IrK109bztjb250aW51ZX1pZihjPUdvW29dLGM+NCl7YltyKytdPTY1NTMzLG4rPWMtMTtjb250aW51ZX1mb3IobyY9Yz09PTI/MzE6Yz09PTM/MTU6NztjPjEmJm48Zzspbz1vPDw2fGVbbisrXSY2MyxjLS07aWYoYz4xKXtiW3IrK109NjU1MzM7Y29udGludWV9bzw2NTUzNj9iW3IrK109bzooby09NjU1MzYsYltyKytdPTU1Mjk2fG8+PjEwJjEwMjMsYltyKytdPTU2MzIwfG8mMTAyMyl9cmV0dXJuIF9hKGIscil9LHJyLnV0Zjhib3JkZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IodD10fHxlLmxlbmd0aCx0PmUubGVuZ3RoJiYodD1lLmxlbmd0aCksbj10LTE7bj49MCYmKGVbbl0mMTkyKT09PTEyODspbi0tO3JldHVybiBuPDB8fG49PT0wP3Q6bitHb1tlW25dXT50P246dH07ZnVuY3Rpb24gdHMoKXt0aGlzLmlucHV0PW51bGwsdGhpcy5uZXh0X2luPTAsdGhpcy5hdmFpbF9pbj0wLHRoaXMudG90YWxfaW49MCx0aGlzLm91dHB1dD1udWxsLHRoaXMubmV4dF9vdXQ9MCx0aGlzLmF2YWlsX291dD0wLHRoaXMudG90YWxfb3V0PTAsdGhpcy5tc2c9IiIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfXZhciBjYT10cyx1YT1QdCxZbz14ZSx5bD1ycixZcz1tdCxiYz1jYSxXbD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFh2PTAscHU9NCxFbD0wLFVmPTEsJGY9MixRdj0tMSxlbT0wLHRtPTg7ZnVuY3Rpb24gcXMoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcXMpKXJldHVybiBuZXcgcXMoZSk7dGhpcy5vcHRpb25zPVlvLmFzc2lnbih7bGV2ZWw6UXYsbWV0aG9kOnRtLGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6ZW0sdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJnQud2luZG93Qml0cz4wP3Qud2luZG93Qml0cz0tdC53aW5kb3dCaXRzOnQuZ3ppcCYmdC53aW5kb3dCaXRzPjAmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cys9MTYpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IGJjLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbj11YS5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLHQubGV2ZWwsdC5tZXRob2QsdC53aW5kb3dCaXRzLHQubWVtTGV2ZWwsdC5zdHJhdGVneSk7aWYobiE9PUVsKXRocm93IG5ldyBFcnJvcihZc1tuXSk7aWYodC5oZWFkZXImJnVhLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLHQuaGVhZGVyKSx0LmRpY3Rpb25hcnkpe3ZhciByO2lmKHR5cGVvZiB0LmRpY3Rpb25hcnk9PSJzdHJpbmciP3I9eWwuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOldsLmNhbGwodC5kaWN0aW9uYXJ5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/cj1uZXcgVWludDhBcnJheSh0LmRpY3Rpb25hcnkpOnI9dC5kaWN0aW9uYXJ5LG49dWEuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHIpLG4hPT1FbCl0aHJvdyBuZXcgRXJyb3IoWXNbbl0pO3RoaXMuX2RpY3Rfc2V0PSEwfX1xcy5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc3RybSxyPXRoaXMub3B0aW9ucy5jaHVua1NpemUsbyxjO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7Yz10PT09fn50P3Q6dD09PSEwP3B1Olh2LHR5cGVvZiBlPT0ic3RyaW5nIj9uLmlucHV0PXlsLnN0cmluZzJidWYoZSk6V2wuY2FsbChlKT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bi5pbnB1dD1uZXcgVWludDhBcnJheShlKTpuLmlucHV0PWUsbi5uZXh0X2luPTAsbi5hdmFpbF9pbj1uLmlucHV0Lmxlbmd0aDtkb3tpZihuLmF2YWlsX291dD09PTAmJihuLm91dHB1dD1uZXcgWW8uQnVmOChyKSxuLm5leHRfb3V0PTAsbi5hdmFpbF9vdXQ9ciksbz11YS5kZWZsYXRlKG4sYyksbyE9PVVmJiZvIT09RWwpcmV0dXJuIHRoaXMub25FbmQobyksdGhpcy5lbmRlZD0hMCwhMTsobi5hdmFpbF9vdXQ9PT0wfHxuLmF2YWlsX2luPT09MCYmKGM9PT1wdXx8Yz09PSRmKSkmJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLm9uRGF0YSh5bC5idWYyYmluc3RyaW5nKFlvLnNocmlua0J1ZihuLm91dHB1dCxuLm5leHRfb3V0KSkpOnRoaXMub25EYXRhKFlvLnNocmlua0J1ZihuLm91dHB1dCxuLm5leHRfb3V0KSkpfXdoaWxlKChuLmF2YWlsX2luPjB8fG4uYXZhaWxfb3V0PT09MCkmJm8hPT1VZik7cmV0dXJuIGM9PT1wdT8obz11YS5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChvKSx0aGlzLmVuZGVkPSEwLG89PT1FbCk6KGM9PT0kZiYmKHRoaXMub25FbmQoRWwpLG4uYXZhaWxfb3V0PTApLCEwKX0scXMucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxxcy5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PUVsJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9WW8uZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307ZnVuY3Rpb24gdnUoZSx0KXt2YXIgbj1uZXcgcXModCk7aWYobi5wdXNoKGUsITApLG4uZXJyKXRocm93IG4ubXNnfHxZc1tuLmVycl07cmV0dXJuIG4ucmVzdWx0fWZ1bmN0aW9uIG5tKGUsdCl7cmV0dXJuIHQ9dHx8e30sdC5yYXc9ITAsdnUoZSx0KX1mdW5jdGlvbiBybShlLHQpe3JldHVybiB0PXR8fHt9LHQuZ3ppcD0hMCx2dShlLHQpfU50LkRlZmxhdGU9cXMsTnQuZGVmbGF0ZT12dSxOdC5kZWZsYXRlUmF3PW5tLE50Lmd6aXA9cm07dmFyIEdsPXt9LGJhPXt9LHljPTMwLGltPTEyLG9tPWZ1bmN0aW9uKHQsbil7dmFyIHIsbyxjLGcsYixWLFQsTCxfZSx3ZSxQZSxmdCxodCxGdCxTdCxtbix0bixubixFdCxLdCxjbixadCxDbixocixybjtyPXQuc3RhdGUsbz10Lm5leHRfaW4saHI9dC5pbnB1dCxjPW8rKHQuYXZhaWxfaW4tNSksZz10Lm5leHRfb3V0LHJuPXQub3V0cHV0LGI9Zy0obi10LmF2YWlsX291dCksVj1nKyh0LmF2YWlsX291dC0yNTcpLFQ9ci5kbWF4LEw9ci53c2l6ZSxfZT1yLndoYXZlLHdlPXIud25leHQsUGU9ci53aW5kb3csZnQ9ci5ob2xkLGh0PXIuYml0cyxGdD1yLmxlbmNvZGUsU3Q9ci5kaXN0Y29kZSxtbj0oMTw8ci5sZW5iaXRzKS0xLHRuPSgxPDxyLmRpc3RiaXRzKS0xO2U6ZG97aHQ8MTUmJihmdCs9aHJbbysrXTw8aHQsaHQrPTgsZnQrPWhyW28rK108PGh0LGh0Kz04KSxubj1GdFtmdCZtbl07dDpmb3IoOzspe2lmKEV0PW5uPj4+MjQsZnQ+Pj49RXQsaHQtPUV0LEV0PW5uPj4+MTYmMjU1LEV0PT09MClybltnKytdPW5uJjY1NTM1O2Vsc2UgaWYoRXQmMTYpe0t0PW5uJjY1NTM1LEV0Jj0xNSxFdCYmKGh0PEV0JiYoZnQrPWhyW28rK108PGh0LGh0Kz04KSxLdCs9ZnQmKDE8PEV0KS0xLGZ0Pj4+PUV0LGh0LT1FdCksaHQ8MTUmJihmdCs9aHJbbysrXTw8aHQsaHQrPTgsZnQrPWhyW28rK108PGh0LGh0Kz04KSxubj1TdFtmdCZ0bl07bjpmb3IoOzspe2lmKEV0PW5uPj4+MjQsZnQ+Pj49RXQsaHQtPUV0LEV0PW5uPj4+MTYmMjU1LEV0JjE2KXtpZihjbj1ubiY2NTUzNSxFdCY9MTUsaHQ8RXQmJihmdCs9aHJbbysrXTw8aHQsaHQrPTgsaHQ8RXQmJihmdCs9aHJbbysrXTw8aHQsaHQrPTgpKSxjbis9ZnQmKDE8PEV0KS0xLGNuPlQpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsci5tb2RlPXljO2JyZWFrIGV9aWYoZnQ+Pj49RXQsaHQtPUV0LEV0PWctYixjbj5FdCl7aWYoRXQ9Y24tRXQsRXQ+X2UmJnIuc2FuZSl7dC5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixyLm1vZGU9eWM7YnJlYWsgZX1pZihadD0wLENuPVBlLHdlPT09MCl7aWYoWnQrPUwtRXQsRXQ8S3Qpe0t0LT1FdDtkbyBybltnKytdPVBlW1p0KytdO3doaWxlKC0tRXQpO1p0PWctY24sQ249cm59fWVsc2UgaWYod2U8RXQpe2lmKFp0Kz1MK3dlLUV0LEV0LT13ZSxFdDxLdCl7S3QtPUV0O2RvIHJuW2crK109UGVbWnQrK107d2hpbGUoLS1FdCk7aWYoWnQ9MCx3ZTxLdCl7RXQ9d2UsS3QtPUV0O2RvIHJuW2crK109UGVbWnQrK107d2hpbGUoLS1FdCk7WnQ9Zy1jbixDbj1ybn19fWVsc2UgaWYoWnQrPXdlLUV0LEV0PEt0KXtLdC09RXQ7ZG8gcm5bZysrXT1QZVtadCsrXTt3aGlsZSgtLUV0KTtadD1nLWNuLENuPXJufWZvcig7S3Q+Mjspcm5bZysrXT1DbltadCsrXSxybltnKytdPUNuW1p0KytdLHJuW2crK109Q25bWnQrK10sS3QtPTM7S3QmJihybltnKytdPUNuW1p0KytdLEt0PjEmJihybltnKytdPUNuW1p0KytdKSl9ZWxzZXtadD1nLWNuO2RvIHJuW2crK109cm5bWnQrK10scm5bZysrXT1ybltadCsrXSxybltnKytdPXJuW1p0KytdLEt0LT0zO3doaWxlKEt0PjIpO0t0JiYocm5bZysrXT1ybltadCsrXSxLdD4xJiYocm5bZysrXT1ybltadCsrXSkpfX1lbHNlIGlmKChFdCY2NCk9PT0wKXtubj1TdFsobm4mNjU1MzUpKyhmdCYoMTw8RXQpLTEpXTtjb250aW51ZSBufWVsc2V7dC5tc2c9ImludmFsaWQgZGlzdGFuY2UgY29kZSIsci5tb2RlPXljO2JyZWFrIGV9YnJlYWt9fWVsc2UgaWYoKEV0JjY0KT09PTApe25uPUZ0WyhubiY2NTUzNSkrKGZ0JigxPDxFdCktMSldO2NvbnRpbnVlIHR9ZWxzZSBpZihFdCYzMil7ci5tb2RlPWltO2JyZWFrIGV9ZWxzZXt0Lm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixyLm1vZGU9eWM7YnJlYWsgZX1icmVha319d2hpbGUobzxjJiZnPFYpO0t0PWh0Pj4zLG8tPUt0LGh0LT1LdDw8MyxmdCY9KDE8PGh0KS0xLHQubmV4dF9pbj1vLHQubmV4dF9vdXQ9Zyx0LmF2YWlsX2luPW88Yz81KyhjLW8pOjUtKG8tYyksdC5hdmFpbF9vdXQ9ZzxWPzI1NysoVi1nKToyNTctKGctViksci5ob2xkPWZ0LHIuYml0cz1odH0sSGY9eGUsU2w9MTUsamY9ODUyLHpmPTU5MixXZj0wLG11PTEsR2Y9MixhbT1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLHNtPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sbG09WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdLGNtPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0sdW09ZnVuY3Rpb24odCxuLHIsbyxjLGcsYixWKXt2YXIgVD1WLmJpdHMsTD0wLF9lPTAsd2U9MCxQZT0wLGZ0PTAsaHQ9MCxGdD0wLFN0PTAsbW49MCx0bj0wLG5uLEV0LEt0LGNuLFp0LENuPW51bGwsaHI9MCxybixBYT1uZXcgSGYuQnVmMTYoU2wrMSksS2M9bmV3IEhmLkJ1ZjE2KFNsKzEpLFpjPW51bGwsQXA9MCxPcCxYYyxRYztmb3IoTD0wO0w8PVNsO0wrKylBYVtMXT0wO2ZvcihfZT0wO19lPG87X2UrKylBYVtuW3IrX2VdXSsrO2ZvcihmdD1ULFBlPVNsO1BlPj0xJiZBYVtQZV09PT0wO1BlLS0pO2lmKGZ0PlBlJiYoZnQ9UGUpLFBlPT09MClyZXR1cm4gY1tnKytdPTE8PDI0fDY0PDwxNnwwLGNbZysrXT0xPDwyNHw2NDw8MTZ8MCxWLmJpdHM9MSwwO2Zvcih3ZT0xO3dlPFBlJiZBYVt3ZV09PT0wO3dlKyspO2ZvcihmdDx3ZSYmKGZ0PXdlKSxTdD0xLEw9MTtMPD1TbDtMKyspaWYoU3Q8PD0xLFN0LT1BYVtMXSxTdDwwKXJldHVybi0xO2lmKFN0PjAmJih0PT09V2Z8fFBlIT09MSkpcmV0dXJuLTE7Zm9yKEtjWzFdPTAsTD0xO0w8U2w7TCsrKUtjW0wrMV09S2NbTF0rQWFbTF07Zm9yKF9lPTA7X2U8bztfZSsrKW5bcitfZV0hPT0wJiYoYltLY1tuW3IrX2VdXSsrXT1fZSk7aWYodD09PVdmPyhDbj1aYz1iLHJuPTE5KTp0PT09bXU/KENuPWFtLGhyLT0yNTcsWmM9c20sQXAtPTI1Nyxybj0yNTYpOihDbj1sbSxaYz1jbSxybj0tMSksdG49MCxfZT0wLEw9d2UsWnQ9ZyxodD1mdCxGdD0wLEt0PS0xLG1uPTE8PGZ0LGNuPW1uLTEsdD09PW11JiZtbj5qZnx8dD09PUdmJiZtbj56ZilyZXR1cm4gMTtmb3IoOzspe09wPUwtRnQsYltfZV08cm4/KFhjPTAsUWM9YltfZV0pOmJbX2VdPnJuPyhYYz1aY1tBcCtiW19lXV0sUWM9Q25baHIrYltfZV1dKTooWGM9MzIrNjQsUWM9MCksbm49MTw8TC1GdCxFdD0xPDxodCx3ZT1FdDtkbyBFdC09bm4sY1tadCsodG4+PkZ0KStFdF09T3A8PDI0fFhjPDwxNnxRY3wwO3doaWxlKEV0IT09MCk7Zm9yKG5uPTE8PEwtMTt0biZubjspbm4+Pj0xO2lmKG5uIT09MD8odG4mPW5uLTEsdG4rPW5uKTp0bj0wLF9lKyssLS1BYVtMXT09PTApe2lmKEw9PT1QZSlicmVhaztMPW5bcitiW19lXV19aWYoTD5mdCYmKHRuJmNuKSE9PUt0KXtmb3IoRnQ9PT0wJiYoRnQ9ZnQpLFp0Kz13ZSxodD1MLUZ0LFN0PTE8PGh0O2h0K0Z0PFBlJiYoU3QtPUFhW2h0K0Z0XSwhKFN0PD0wKSk7KWh0KyssU3Q8PD0xO2lmKG1uKz0xPDxodCx0PT09bXUmJm1uPmpmfHx0PT09R2YmJm1uPnpmKXJldHVybiAxO0t0PXRuJmNuLGNbS3RdPWZ0PDwyNHxodDw8MTZ8WnQtZ3wwfX1yZXR1cm4gdG4hPT0wJiYoY1tadCt0bl09TC1GdDw8MjR8NjQ8PDE2fDApLFYuYml0cz1mdCwwfSxxbz14ZSxfdT1XZSx4YT1KZSxmbT1vbSxZbD11bSxkbT0wLFlmPTEscWY9MixKZj00LGhtPTUsRWM9NixKcz0wLGdtPTEscG09MixmYT0tMixLZj0tMyxaZj0tNCx2bT0tNSxYZj04LFFmPTEsZWQ9Mix0ZD0zLG5kPTQscmQ9NSxpZD02LG9kPTcsYWQ9OCxzZD05LGxkPTEwLFNjPTExLG5zPTEyLGJ1PTEzLGNkPTE0LHl1PTE1LHVkPTE2LGZkPTE3LGRkPTE4LGhkPTE5LHdjPTIwLENjPTIxLGdkPTIyLHBkPTIzLHZkPTI0LG1kPTI1LF9kPTI2LEV1PTI3LGJkPTI4LHlkPTI5LFNyPTMwLEVkPTMxLG1tPTMyLF9tPTg1MixibT01OTIseW09MTUsRW09eW07ZnVuY3Rpb24gU2QoZSl7cmV0dXJuKGU+Pj4yNCYyNTUpKyhlPj4+OCY2NTI4MCkrKChlJjY1MjgwKTw8OCkrKChlJjI1NSk8PDI0KX1mdW5jdGlvbiBTbSgpe3RoaXMubW9kZT0wLHRoaXMubGFzdD0hMSx0aGlzLndyYXA9MCx0aGlzLmhhdmVkaWN0PSExLHRoaXMuZmxhZ3M9MCx0aGlzLmRtYXg9MCx0aGlzLmNoZWNrPTAsdGhpcy50b3RhbD0wLHRoaXMuaGVhZD1udWxsLHRoaXMud2JpdHM9MCx0aGlzLndzaXplPTAsdGhpcy53aGF2ZT0wLHRoaXMud25leHQ9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMuaG9sZD0wLHRoaXMuYml0cz0wLHRoaXMubGVuZ3RoPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmV4dHJhPTAsdGhpcy5sZW5jb2RlPW51bGwsdGhpcy5kaXN0Y29kZT1udWxsLHRoaXMubGVuYml0cz0wLHRoaXMuZGlzdGJpdHM9MCx0aGlzLm5jb2RlPTAsdGhpcy5ubGVuPTAsdGhpcy5uZGlzdD0wLHRoaXMuaGF2ZT0wLHRoaXMubmV4dD1udWxsLHRoaXMubGVucz1uZXcgcW8uQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IHFvLkJ1ZjE2KDI4OCksdGhpcy5sZW5keW49bnVsbCx0aGlzLmRpc3RkeW49bnVsbCx0aGlzLnNhbmU9MCx0aGlzLmJhY2s9MCx0aGlzLndhcz0wfWZ1bmN0aW9uIHdkKGUpe3ZhciB0O3JldHVybiFlfHwhZS5zdGF0ZT9mYToodD1lLnN0YXRlLGUudG90YWxfaW49ZS50b3RhbF9vdXQ9dC50b3RhbD0wLGUubXNnPSIiLHQud3JhcCYmKGUuYWRsZXI9dC53cmFwJjEpLHQubW9kZT1RZix0Lmxhc3Q9MCx0LmhhdmVkaWN0PTAsdC5kbWF4PTMyNzY4LHQuaGVhZD1udWxsLHQuaG9sZD0wLHQuYml0cz0wLHQubGVuY29kZT10LmxlbmR5bj1uZXcgcW8uQnVmMzIoX20pLHQuZGlzdGNvZGU9dC5kaXN0ZHluPW5ldyBxby5CdWYzMihibSksdC5zYW5lPTEsdC5iYWNrPS0xLEpzKX1mdW5jdGlvbiBDZChlKXt2YXIgdDtyZXR1cm4hZXx8IWUuc3RhdGU/ZmE6KHQ9ZS5zdGF0ZSx0LndzaXplPTAsdC53aGF2ZT0wLHQud25leHQ9MCx3ZChlKSl9ZnVuY3Rpb24gQWQoZSx0KXt2YXIgbixyO3JldHVybiFlfHwhZS5zdGF0ZXx8KHI9ZS5zdGF0ZSx0PDA/KG49MCx0PS10KToobj0odD4+NCkrMSx0PDQ4JiYodCY9MTUpKSx0JiYodDw4fHx0PjE1KSk/ZmE6KHIud2luZG93IT09bnVsbCYmci53Yml0cyE9PXQmJihyLndpbmRvdz1udWxsKSxyLndyYXA9bixyLndiaXRzPXQsQ2QoZSkpfWZ1bmN0aW9uIE9kKGUsdCl7dmFyIG4scjtyZXR1cm4gZT8ocj1uZXcgU20sZS5zdGF0ZT1yLHIud2luZG93PW51bGwsbj1BZChlLHQpLG4hPT1KcyYmKGUuc3RhdGU9bnVsbCksbik6ZmF9ZnVuY3Rpb24gd20oZSl7cmV0dXJuIE9kKGUsRW0pfXZhciBUZD0hMCxTdSx3dTtmdW5jdGlvbiBDbShlKXtpZihUZCl7dmFyIHQ7Zm9yKFN1PW5ldyBxby5CdWYzMig1MTIpLHd1PW5ldyBxby5CdWYzMigzMiksdD0wO3Q8MTQ0OyllLmxlbnNbdCsrXT04O2Zvcig7dDwyNTY7KWUubGVuc1t0KytdPTk7Zm9yKDt0PDI4MDspZS5sZW5zW3QrK109Nztmb3IoO3Q8Mjg4OyllLmxlbnNbdCsrXT04O2ZvcihZbChZZixlLmxlbnMsMCwyODgsU3UsMCxlLndvcmsse2JpdHM6OX0pLHQ9MDt0PDMyOyllLmxlbnNbdCsrXT01O1lsKHFmLGUubGVucywwLDMyLHd1LDAsZS53b3JrLHtiaXRzOjV9KSxUZD0hMX1lLmxlbmNvZGU9U3UsZS5sZW5iaXRzPTksZS5kaXN0Y29kZT13dSxlLmRpc3RiaXRzPTV9ZnVuY3Rpb24gUGQoZSx0LG4scil7dmFyIG8sYz1lLnN0YXRlO3JldHVybiBjLndpbmRvdz09PW51bGwmJihjLndzaXplPTE8PGMud2JpdHMsYy53bmV4dD0wLGMud2hhdmU9MCxjLndpbmRvdz1uZXcgcW8uQnVmOChjLndzaXplKSkscj49Yy53c2l6ZT8ocW8uYXJyYXlTZXQoYy53aW5kb3csdCxuLWMud3NpemUsYy53c2l6ZSwwKSxjLnduZXh0PTAsYy53aGF2ZT1jLndzaXplKToobz1jLndzaXplLWMud25leHQsbz5yJiYobz1yKSxxby5hcnJheVNldChjLndpbmRvdyx0LG4tcixvLGMud25leHQpLHItPW8scj8ocW8uYXJyYXlTZXQoYy53aW5kb3csdCxuLXIsciwwKSxjLnduZXh0PXIsYy53aGF2ZT1jLndzaXplKTooYy53bmV4dCs9byxjLnduZXh0PT09Yy53c2l6ZSYmKGMud25leHQ9MCksYy53aGF2ZTxjLndzaXplJiYoYy53aGF2ZSs9bykpKSwwfWZ1bmN0aW9uIEFtKGUsdCl7dmFyIG4scixvLGMsZyxiLFYsVCxMLF9lLHdlLFBlLGZ0LGh0LEZ0PTAsU3QsbW4sdG4sbm4sRXQsS3QsY24sWnQsQ249bmV3IHFvLkJ1ZjgoNCksaHIscm4sQWE9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO2lmKCFlfHwhZS5zdGF0ZXx8IWUub3V0cHV0fHwhZS5pbnB1dCYmZS5hdmFpbF9pbiE9PTApcmV0dXJuIGZhO249ZS5zdGF0ZSxuLm1vZGU9PT1ucyYmKG4ubW9kZT1idSksZz1lLm5leHRfb3V0LG89ZS5vdXRwdXQsVj1lLmF2YWlsX291dCxjPWUubmV4dF9pbixyPWUuaW5wdXQsYj1lLmF2YWlsX2luLFQ9bi5ob2xkLEw9bi5iaXRzLF9lPWIsd2U9VixadD1KcztlOmZvcig7Oylzd2l0Y2gobi5tb2RlKXtjYXNlIFFmOmlmKG4ud3JhcD09PTApe24ubW9kZT1idTticmVha31mb3IoO0w8MTY7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEwsTCs9OH1pZihuLndyYXAmMiYmVD09PTM1NjE1KXtuLmNoZWNrPTAsQ25bMF09VCYyNTUsQ25bMV09VD4+PjgmMjU1LG4uY2hlY2s9eGEobi5jaGVjayxDbiwyLDApLFQ9MCxMPTAsbi5tb2RlPWVkO2JyZWFrfWlmKG4uZmxhZ3M9MCxuLmhlYWQmJihuLmhlYWQuZG9uZT0hMSksIShuLndyYXAmMSl8fCgoKFQmMjU1KTw8OCkrKFQ+PjgpKSUzMSl7ZS5tc2c9ImluY29ycmVjdCBoZWFkZXIgY2hlY2siLG4ubW9kZT1TcjticmVha31pZigoVCYxNSkhPT1YZil7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9U3I7YnJlYWt9aWYoVD4+Pj00LEwtPTQsY249KFQmMTUpKzgsbi53Yml0cz09PTApbi53Yml0cz1jbjtlbHNlIGlmKGNuPm4ud2JpdHMpe2UubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIixuLm1vZGU9U3I7YnJlYWt9bi5kbWF4PTE8PGNuLGUuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT1UJjUxMj9sZDpucyxUPTAsTD0wO2JyZWFrO2Nhc2UgZWQ6Zm9yKDtMPDE2Oyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxMLEwrPTh9aWYobi5mbGFncz1ULChuLmZsYWdzJjI1NSkhPT1YZil7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9U3I7YnJlYWt9aWYobi5mbGFncyY1NzM0NCl7ZS5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsbi5tb2RlPVNyO2JyZWFrfW4uaGVhZCYmKG4uaGVhZC50ZXh0PVQ+PjgmMSksbi5mbGFncyY1MTImJihDblswXT1UJjI1NSxDblsxXT1UPj4+OCYyNTUsbi5jaGVjaz14YShuLmNoZWNrLENuLDIsMCkpLFQ9MCxMPTAsbi5tb2RlPXRkO2Nhc2UgdGQ6Zm9yKDtMPDMyOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxMLEwrPTh9bi5oZWFkJiYobi5oZWFkLnRpbWU9VCksbi5mbGFncyY1MTImJihDblswXT1UJjI1NSxDblsxXT1UPj4+OCYyNTUsQ25bMl09VD4+PjE2JjI1NSxDblszXT1UPj4+MjQmMjU1LG4uY2hlY2s9eGEobi5jaGVjayxDbiw0LDApKSxUPTAsTD0wLG4ubW9kZT1uZDtjYXNlIG5kOmZvcig7TDwxNjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8TCxMKz04fW4uaGVhZCYmKG4uaGVhZC54ZmxhZ3M9VCYyNTUsbi5oZWFkLm9zPVQ+PjgpLG4uZmxhZ3MmNTEyJiYoQ25bMF09VCYyNTUsQ25bMV09VD4+PjgmMjU1LG4uY2hlY2s9eGEobi5jaGVjayxDbiwyLDApKSxUPTAsTD0wLG4ubW9kZT1yZDtjYXNlIHJkOmlmKG4uZmxhZ3MmMTAyNCl7Zm9yKDtMPDE2Oyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxMLEwrPTh9bi5sZW5ndGg9VCxuLmhlYWQmJihuLmhlYWQuZXh0cmFfbGVuPVQpLG4uZmxhZ3MmNTEyJiYoQ25bMF09VCYyNTUsQ25bMV09VD4+PjgmMjU1LG4uY2hlY2s9eGEobi5jaGVjayxDbiwyLDApKSxUPTAsTD0wfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmV4dHJhPW51bGwpO24ubW9kZT1pZDtjYXNlIGlkOmlmKG4uZmxhZ3MmMTAyNCYmKFBlPW4ubGVuZ3RoLFBlPmImJihQZT1iKSxQZSYmKG4uaGVhZCYmKGNuPW4uaGVhZC5leHRyYV9sZW4tbi5sZW5ndGgsbi5oZWFkLmV4dHJhfHwobi5oZWFkLmV4dHJhPW5ldyBBcnJheShuLmhlYWQuZXh0cmFfbGVuKSkscW8uYXJyYXlTZXQobi5oZWFkLmV4dHJhLHIsYyxQZSxjbikpLG4uZmxhZ3MmNTEyJiYobi5jaGVjaz14YShuLmNoZWNrLHIsUGUsYykpLGItPVBlLGMrPVBlLG4ubGVuZ3RoLT1QZSksbi5sZW5ndGgpKWJyZWFrIGU7bi5sZW5ndGg9MCxuLm1vZGU9b2Q7Y2FzZSBvZDppZihuLmZsYWdzJjIwNDgpe2lmKGI9PT0wKWJyZWFrIGU7UGU9MDtkbyBjbj1yW2MrUGUrK10sbi5oZWFkJiZjbiYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShjbikpO3doaWxlKGNuJiZQZTxiKTtpZihuLmZsYWdzJjUxMiYmKG4uY2hlY2s9eGEobi5jaGVjayxyLFBlLGMpKSxiLT1QZSxjKz1QZSxjbilicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLm5hbWU9bnVsbCk7bi5sZW5ndGg9MCxuLm1vZGU9YWQ7Y2FzZSBhZDppZihuLmZsYWdzJjQwOTYpe2lmKGI9PT0wKWJyZWFrIGU7UGU9MDtkbyBjbj1yW2MrUGUrK10sbi5oZWFkJiZjbiYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShjbikpO3doaWxlKGNuJiZQZTxiKTtpZihuLmZsYWdzJjUxMiYmKG4uY2hlY2s9eGEobi5jaGVjayxyLFBlLGMpKSxiLT1QZSxjKz1QZSxjbilicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmNvbW1lbnQ9bnVsbCk7bi5tb2RlPXNkO2Nhc2Ugc2Q6aWYobi5mbGFncyY1MTIpe2Zvcig7TDwxNjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8TCxMKz04fWlmKFQhPT0obi5jaGVjayY2NTUzNSkpe2UubXNnPSJoZWFkZXIgY3JjIG1pc21hdGNoIixuLm1vZGU9U3I7YnJlYWt9VD0wLEw9MH1uLmhlYWQmJihuLmhlYWQuaGNyYz1uLmZsYWdzPj45JjEsbi5oZWFkLmRvbmU9ITApLGUuYWRsZXI9bi5jaGVjaz0wLG4ubW9kZT1uczticmVhaztjYXNlIGxkOmZvcig7TDwzMjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8TCxMKz04fWUuYWRsZXI9bi5jaGVjaz1TZChUKSxUPTAsTD0wLG4ubW9kZT1TYztjYXNlIFNjOmlmKG4uaGF2ZWRpY3Q9PT0wKXJldHVybiBlLm5leHRfb3V0PWcsZS5hdmFpbF9vdXQ9VixlLm5leHRfaW49YyxlLmF2YWlsX2luPWIsbi5ob2xkPVQsbi5iaXRzPUwscG07ZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPW5zO2Nhc2UgbnM6aWYodD09PWhtfHx0PT09RWMpYnJlYWsgZTtjYXNlIGJ1OmlmKG4ubGFzdCl7VD4+Pj1MJjcsTC09TCY3LG4ubW9kZT1FdTticmVha31mb3IoO0w8Mzspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8TCxMKz04fXN3aXRjaChuLmxhc3Q9VCYxLFQ+Pj49MSxMLT0xLFQmMyl7Y2FzZSAwOm4ubW9kZT1jZDticmVhaztjYXNlIDE6aWYoQ20obiksbi5tb2RlPXdjLHQ9PT1FYyl7VD4+Pj0yLEwtPTI7YnJlYWsgZX1icmVhaztjYXNlIDI6bi5tb2RlPWZkO2JyZWFrO2Nhc2UgMzplLm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixuLm1vZGU9U3J9VD4+Pj0yLEwtPTI7YnJlYWs7Y2FzZSBjZDpmb3IoVD4+Pj1MJjcsTC09TCY3O0w8MzI7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEwsTCs9OH1pZigoVCY2NTUzNSkhPT0oVD4+PjE2XjY1NTM1KSl7ZS5tc2c9ImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiLG4ubW9kZT1TcjticmVha31pZihuLmxlbmd0aD1UJjY1NTM1LFQ9MCxMPTAsbi5tb2RlPXl1LHQ9PT1FYylicmVhayBlO2Nhc2UgeXU6bi5tb2RlPXVkO2Nhc2UgdWQ6aWYoUGU9bi5sZW5ndGgsUGUpe2lmKFBlPmImJihQZT1iKSxQZT5WJiYoUGU9ViksUGU9PT0wKWJyZWFrIGU7cW8uYXJyYXlTZXQobyxyLGMsUGUsZyksYi09UGUsYys9UGUsVi09UGUsZys9UGUsbi5sZW5ndGgtPVBlO2JyZWFrfW4ubW9kZT1uczticmVhaztjYXNlIGZkOmZvcig7TDwxNDspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8TCxMKz04fWlmKG4ubmxlbj0oVCYzMSkrMjU3LFQ+Pj49NSxMLT01LG4ubmRpc3Q9KFQmMzEpKzEsVD4+Pj01LEwtPTUsbi5uY29kZT0oVCYxNSkrNCxUPj4+PTQsTC09NCxuLm5sZW4+Mjg2fHxuLm5kaXN0PjMwKXtlLm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLG4ubW9kZT1TcjticmVha31uLmhhdmU9MCxuLm1vZGU9ZGQ7Y2FzZSBkZDpmb3IoO24uaGF2ZTxuLm5jb2RlOyl7Zm9yKDtMPDM7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEwsTCs9OH1uLmxlbnNbQWFbbi5oYXZlKytdXT1UJjcsVD4+Pj0zLEwtPTN9Zm9yKDtuLmhhdmU8MTk7KW4ubGVuc1tBYVtuLmhhdmUrK11dPTA7aWYobi5sZW5jb2RlPW4ubGVuZHluLG4ubGVuYml0cz03LGhyPXtiaXRzOm4ubGVuYml0c30sWnQ9WWwoZG0sbi5sZW5zLDAsMTksbi5sZW5jb2RlLDAsbi53b3JrLGhyKSxuLmxlbmJpdHM9aHIuYml0cyxadCl7ZS5tc2c9ImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsbi5tb2RlPVNyO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT1oZDtjYXNlIGhkOmZvcig7bi5oYXZlPG4ubmxlbituLm5kaXN0Oyl7Zm9yKDtGdD1uLmxlbmNvZGVbVCYoMTw8bi5sZW5iaXRzKS0xXSxTdD1GdD4+PjI0LG1uPUZ0Pj4+MTYmMjU1LHRuPUZ0JjY1NTM1LCEoU3Q8PUwpOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxMLEwrPTh9aWYodG48MTYpVD4+Pj1TdCxMLT1TdCxuLmxlbnNbbi5oYXZlKytdPXRuO2Vsc2V7aWYodG49PT0xNil7Zm9yKHJuPVN0KzI7TDxybjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8TCxMKz04fWlmKFQ+Pj49U3QsTC09U3Qsbi5oYXZlPT09MCl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT1TcjticmVha31jbj1uLmxlbnNbbi5oYXZlLTFdLFBlPTMrKFQmMyksVD4+Pj0yLEwtPTJ9ZWxzZSBpZih0bj09PTE3KXtmb3Iocm49U3QrMztMPHJuOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxMLEwrPTh9VD4+Pj1TdCxMLT1TdCxjbj0wLFBlPTMrKFQmNyksVD4+Pj0zLEwtPTN9ZWxzZXtmb3Iocm49U3QrNztMPHJuOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxMLEwrPTh9VD4+Pj1TdCxMLT1TdCxjbj0wLFBlPTExKyhUJjEyNyksVD4+Pj03LEwtPTd9aWYobi5oYXZlK1BlPm4ubmxlbituLm5kaXN0KXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPVNyO2JyZWFrfWZvcig7UGUtLTspbi5sZW5zW24uaGF2ZSsrXT1jbn19aWYobi5tb2RlPT09U3IpYnJlYWs7aWYobi5sZW5zWzI1Nl09PT0wKXtlLm1zZz0iaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIixuLm1vZGU9U3I7YnJlYWt9aWYobi5sZW5iaXRzPTksaHI9e2JpdHM6bi5sZW5iaXRzfSxadD1ZbChZZixuLmxlbnMsMCxuLm5sZW4sbi5sZW5jb2RlLDAsbi53b3JrLGhyKSxuLmxlbmJpdHM9aHIuYml0cyxadCl7ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCIsbi5tb2RlPVNyO2JyZWFrfWlmKG4uZGlzdGJpdHM9NixuLmRpc3Rjb2RlPW4uZGlzdGR5bixocj17Yml0czpuLmRpc3RiaXRzfSxadD1ZbChxZixuLmxlbnMsbi5ubGVuLG4ubmRpc3Qsbi5kaXN0Y29kZSwwLG4ud29yayxociksbi5kaXN0Yml0cz1oci5iaXRzLFp0KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixuLm1vZGU9U3I7YnJlYWt9aWYobi5tb2RlPXdjLHQ9PT1FYylicmVhayBlO2Nhc2Ugd2M6bi5tb2RlPUNjO2Nhc2UgQ2M6aWYoYj49NiYmVj49MjU4KXtlLm5leHRfb3V0PWcsZS5hdmFpbF9vdXQ9VixlLm5leHRfaW49YyxlLmF2YWlsX2luPWIsbi5ob2xkPVQsbi5iaXRzPUwsZm0oZSx3ZSksZz1lLm5leHRfb3V0LG89ZS5vdXRwdXQsVj1lLmF2YWlsX291dCxjPWUubmV4dF9pbixyPWUuaW5wdXQsYj1lLmF2YWlsX2luLFQ9bi5ob2xkLEw9bi5iaXRzLG4ubW9kZT09PW5zJiYobi5iYWNrPS0xKTticmVha31mb3Iobi5iYWNrPTA7RnQ9bi5sZW5jb2RlW1QmKDE8PG4ubGVuYml0cyktMV0sU3Q9RnQ+Pj4yNCxtbj1GdD4+PjE2JjI1NSx0bj1GdCY2NTUzNSwhKFN0PD1MKTspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8TCxMKz04fWlmKG1uJiYobW4mMjQwKT09PTApe2Zvcihubj1TdCxFdD1tbixLdD10bjtGdD1uLmxlbmNvZGVbS3QrKChUJigxPDxubitFdCktMSk+Pm5uKV0sU3Q9RnQ+Pj4yNCxtbj1GdD4+PjE2JjI1NSx0bj1GdCY2NTUzNSwhKG5uK1N0PD1MKTspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8TCxMKz04fVQ+Pj49bm4sTC09bm4sbi5iYWNrKz1ubn1pZihUPj4+PVN0LEwtPVN0LG4uYmFjays9U3Qsbi5sZW5ndGg9dG4sbW49PT0wKXtuLm1vZGU9X2Q7YnJlYWt9aWYobW4mMzIpe24uYmFjaz0tMSxuLm1vZGU9bnM7YnJlYWt9aWYobW4mNjQpe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLG4ubW9kZT1TcjticmVha31uLmV4dHJhPW1uJjE1LG4ubW9kZT1nZDtjYXNlIGdkOmlmKG4uZXh0cmEpe2Zvcihybj1uLmV4dHJhO0w8cm47KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEwsTCs9OH1uLmxlbmd0aCs9VCYoMTw8bi5leHRyYSktMSxUPj4+PW4uZXh0cmEsTC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9bi53YXM9bi5sZW5ndGgsbi5tb2RlPXBkO2Nhc2UgcGQ6Zm9yKDtGdD1uLmRpc3Rjb2RlW1QmKDE8PG4uZGlzdGJpdHMpLTFdLFN0PUZ0Pj4+MjQsbW49RnQ+Pj4xNiYyNTUsdG49RnQmNjU1MzUsIShTdDw9TCk7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEwsTCs9OH1pZigobW4mMjQwKT09PTApe2Zvcihubj1TdCxFdD1tbixLdD10bjtGdD1uLmRpc3Rjb2RlW0t0KygoVCYoMTw8bm4rRXQpLTEpPj5ubildLFN0PUZ0Pj4+MjQsbW49RnQ+Pj4xNiYyNTUsdG49RnQmNjU1MzUsIShubitTdDw9TCk7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEwsTCs9OH1UPj4+PW5uLEwtPW5uLG4uYmFjays9bm59aWYoVD4+Pj1TdCxMLT1TdCxuLmJhY2srPVN0LG1uJjY0KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixuLm1vZGU9U3I7YnJlYWt9bi5vZmZzZXQ9dG4sbi5leHRyYT1tbiYxNSxuLm1vZGU9dmQ7Y2FzZSB2ZDppZihuLmV4dHJhKXtmb3Iocm49bi5leHRyYTtMPHJuOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxMLEwrPTh9bi5vZmZzZXQrPVQmKDE8PG4uZXh0cmEpLTEsVD4+Pj1uLmV4dHJhLEwtPW4uZXh0cmEsbi5iYWNrKz1uLmV4dHJhfWlmKG4ub2Zmc2V0Pm4uZG1heCl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9U3I7YnJlYWt9bi5tb2RlPW1kO2Nhc2UgbWQ6aWYoVj09PTApYnJlYWsgZTtpZihQZT13ZS1WLG4ub2Zmc2V0PlBlKXtpZihQZT1uLm9mZnNldC1QZSxQZT5uLndoYXZlJiZuLnNhbmUpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPVNyO2JyZWFrfVBlPm4ud25leHQ/KFBlLT1uLnduZXh0LGZ0PW4ud3NpemUtUGUpOmZ0PW4ud25leHQtUGUsUGU+bi5sZW5ndGgmJihQZT1uLmxlbmd0aCksaHQ9bi53aW5kb3d9ZWxzZSBodD1vLGZ0PWctbi5vZmZzZXQsUGU9bi5sZW5ndGg7UGU+ViYmKFBlPVYpLFYtPVBlLG4ubGVuZ3RoLT1QZTtkbyBvW2crK109aHRbZnQrK107d2hpbGUoLS1QZSk7bi5sZW5ndGg9PT0wJiYobi5tb2RlPUNjKTticmVhaztjYXNlIF9kOmlmKFY9PT0wKWJyZWFrIGU7b1tnKytdPW4ubGVuZ3RoLFYtLSxuLm1vZGU9Q2M7YnJlYWs7Y2FzZSBFdTppZihuLndyYXApe2Zvcig7TDwzMjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFR8PXJbYysrXTw8TCxMKz04fWlmKHdlLT1WLGUudG90YWxfb3V0Kz13ZSxuLnRvdGFsKz13ZSx3ZSYmKGUuYWRsZXI9bi5jaGVjaz1uLmZsYWdzP3hhKG4uY2hlY2ssbyx3ZSxnLXdlKTpfdShuLmNoZWNrLG8sd2UsZy13ZSkpLHdlPVYsKG4uZmxhZ3M/VDpTZChUKSkhPT1uLmNoZWNrKXtlLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLG4ubW9kZT1TcjticmVha31UPTAsTD0wfW4ubW9kZT1iZDtjYXNlIGJkOmlmKG4ud3JhcCYmbi5mbGFncyl7Zm9yKDtMPDMyOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxMLEwrPTh9aWYoVCE9PShuLnRvdGFsJjQyOTQ5NjcyOTUpKXtlLm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsbi5tb2RlPVNyO2JyZWFrfVQ9MCxMPTB9bi5tb2RlPXlkO2Nhc2UgeWQ6WnQ9Z207YnJlYWsgZTtjYXNlIFNyOlp0PUtmO2JyZWFrIGU7Y2FzZSBFZDpyZXR1cm4gWmY7Y2FzZSBtbTpkZWZhdWx0OnJldHVybiBmYX1yZXR1cm4gZS5uZXh0X291dD1nLGUuYXZhaWxfb3V0PVYsZS5uZXh0X2luPWMsZS5hdmFpbF9pbj1iLG4uaG9sZD1ULG4uYml0cz1MLChuLndzaXplfHx3ZSE9PWUuYXZhaWxfb3V0JiZuLm1vZGU8U3ImJihuLm1vZGU8RXV8fHQhPT1KZikpJiZQZChlLGUub3V0cHV0LGUubmV4dF9vdXQsd2UtZS5hdmFpbF9vdXQpLF9lLT1lLmF2YWlsX2luLHdlLT1lLmF2YWlsX291dCxlLnRvdGFsX2luKz1fZSxlLnRvdGFsX291dCs9d2Usbi50b3RhbCs9d2Usbi53cmFwJiZ3ZSYmKGUuYWRsZXI9bi5jaGVjaz1uLmZsYWdzP3hhKG4uY2hlY2ssbyx3ZSxlLm5leHRfb3V0LXdlKTpfdShuLmNoZWNrLG8sd2UsZS5uZXh0X291dC13ZSkpLGUuZGF0YV90eXBlPW4uYml0cysobi5sYXN0PzY0OjApKyhuLm1vZGU9PT1ucz8xMjg6MCkrKG4ubW9kZT09PXdjfHxuLm1vZGU9PT15dT8yNTY6MCksKF9lPT09MCYmd2U9PT0wfHx0PT09SmYpJiZadD09PUpzJiYoWnQ9dm0pLFp0fWZ1bmN0aW9uIE9tKGUpe2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gZmE7dmFyIHQ9ZS5zdGF0ZTtyZXR1cm4gdC53aW5kb3cmJih0LndpbmRvdz1udWxsKSxlLnN0YXRlPW51bGwsSnN9ZnVuY3Rpb24gVG0oZSx0KXt2YXIgbjtyZXR1cm4hZXx8IWUuc3RhdGV8fChuPWUuc3RhdGUsKG4ud3JhcCYyKT09PTApP2ZhOihuLmhlYWQ9dCx0LmRvbmU9ITEsSnMpfWZ1bmN0aW9uIFBtKGUsdCl7dmFyIG49dC5sZW5ndGgscixvLGM7cmV0dXJuIWV8fCFlLnN0YXRlfHwocj1lLnN0YXRlLHIud3JhcCE9PTAmJnIubW9kZSE9PVNjKT9mYTpyLm1vZGU9PT1TYyYmKG89MSxvPV91KG8sdCxuLDApLG8hPT1yLmNoZWNrKT9LZjooYz1QZChlLHQsbixuKSxjPyhyLm1vZGU9RWQsWmYpOihyLmhhdmVkaWN0PTEsSnMpKX1iYS5pbmZsYXRlUmVzZXQ9Q2QsYmEuaW5mbGF0ZVJlc2V0Mj1BZCxiYS5pbmZsYXRlUmVzZXRLZWVwPXdkLGJhLmluZmxhdGVJbml0PXdtLGJhLmluZmxhdGVJbml0Mj1PZCxiYS5pbmZsYXRlPUFtLGJhLmluZmxhdGVFbmQ9T20sYmEuaW5mbGF0ZUdldEhlYWRlcj1UbSxiYS5pbmZsYXRlU2V0RGljdGlvbmFyeT1QbSxiYS5pbmZsYXRlSW5mbz0icGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSI7dmFyIElkPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9O2Z1bmN0aW9uIEltKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9dmFyIE5tPUltLHdsPWJhLHFsPXhlLEFjPXJyLFlyPUlkLEN1PW10LGttPWNhLFJtPU5tLE5kPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gS3MoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgS3MpKXJldHVybiBuZXcgS3MoZSk7dGhpcy5vcHRpb25zPXFsLmFzc2lnbih7Y2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MCx0bzoiIn0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmdC53aW5kb3dCaXRzPj0wJiZ0LndpbmRvd0JpdHM8MTYmJih0LndpbmRvd0JpdHM9LXQud2luZG93Qml0cyx0LndpbmRvd0JpdHM9PT0wJiYodC53aW5kb3dCaXRzPS0xNSkpLHQud2luZG93Qml0cz49MCYmdC53aW5kb3dCaXRzPDE2JiYhKGUmJmUud2luZG93Qml0cykmJih0LndpbmRvd0JpdHMrPTMyKSx0LndpbmRvd0JpdHM+MTUmJnQud2luZG93Qml0czw0OCYmKHQud2luZG93Qml0cyYxNSk9PT0wJiYodC53aW5kb3dCaXRzfD0xNSksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcga20sdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPXdsLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sdC53aW5kb3dCaXRzKTtpZihuIT09WXIuWl9PSyl0aHJvdyBuZXcgRXJyb3IoQ3Vbbl0pO2lmKHRoaXMuaGVhZGVyPW5ldyBSbSx3bC5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSx0aGlzLmhlYWRlciksdC5kaWN0aW9uYXJ5JiYodHlwZW9mIHQuZGljdGlvbmFyeT09InN0cmluZyI/dC5kaWN0aW9uYXJ5PUFjLnN0cmluZzJidWYodC5kaWN0aW9uYXJ5KTpOZC5jYWxsKHQuZGljdGlvbmFyeSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iJiYodC5kaWN0aW9uYXJ5PW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSkpLHQucmF3JiYobj13bC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdC5kaWN0aW9uYXJ5KSxuIT09WXIuWl9PSykpKXRocm93IG5ldyBFcnJvcihDdVtuXSl9S3MucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnN0cm0scj10aGlzLm9wdGlvbnMuY2h1bmtTaXplLG89dGhpcy5vcHRpb25zLmRpY3Rpb25hcnksYyxnLGIsVixULEw9ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtnPXQ9PT1+fnQ/dDp0PT09ITA/WXIuWl9GSU5JU0g6WXIuWl9OT19GTFVTSCx0eXBlb2YgZT09InN0cmluZyI/bi5pbnB1dD1BYy5iaW5zdHJpbmcyYnVmKGUpOk5kLmNhbGwoZSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP24uaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6bi5pbnB1dD1lLG4ubmV4dF9pbj0wLG4uYXZhaWxfaW49bi5pbnB1dC5sZW5ndGg7ZG97aWYobi5hdmFpbF9vdXQ9PT0wJiYobi5vdXRwdXQ9bmV3IHFsLkJ1Zjgociksbi5uZXh0X291dD0wLG4uYXZhaWxfb3V0PXIpLGM9d2wuaW5mbGF0ZShuLFlyLlpfTk9fRkxVU0gpLGM9PT1Zci5aX05FRURfRElDVCYmbyYmKGM9d2wuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLG8pKSxjPT09WXIuWl9CVUZfRVJST1ImJkw9PT0hMCYmKGM9WXIuWl9PSyxMPSExKSxjIT09WXIuWl9TVFJFQU1fRU5EJiZjIT09WXIuWl9PSylyZXR1cm4gdGhpcy5vbkVuZChjKSx0aGlzLmVuZGVkPSEwLCExO24ubmV4dF9vdXQmJihuLmF2YWlsX291dD09PTB8fGM9PT1Zci5aX1NUUkVBTV9FTkR8fG4uYXZhaWxfaW49PT0wJiYoZz09PVlyLlpfRklOSVNIfHxnPT09WXIuWl9TWU5DX0ZMVVNIKSkmJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj8oYj1BYy51dGY4Ym9yZGVyKG4ub3V0cHV0LG4ubmV4dF9vdXQpLFY9bi5uZXh0X291dC1iLFQ9QWMuYnVmMnN0cmluZyhuLm91dHB1dCxiKSxuLm5leHRfb3V0PVYsbi5hdmFpbF9vdXQ9ci1WLFYmJnFsLmFycmF5U2V0KG4ub3V0cHV0LG4ub3V0cHV0LGIsViwwKSx0aGlzLm9uRGF0YShUKSk6dGhpcy5vbkRhdGEocWwuc2hyaW5rQnVmKG4ub3V0cHV0LG4ubmV4dF9vdXQpKSksbi5hdmFpbF9pbj09PTAmJm4uYXZhaWxfb3V0PT09MCYmKEw9ITApfXdoaWxlKChuLmF2YWlsX2luPjB8fG4uYXZhaWxfb3V0PT09MCkmJmMhPT1Zci5aX1NUUkVBTV9FTkQpO3JldHVybiBjPT09WXIuWl9TVFJFQU1fRU5EJiYoZz1Zci5aX0ZJTklTSCksZz09PVlyLlpfRklOSVNIPyhjPXdsLmluZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGMpLHRoaXMuZW5kZWQ9ITAsYz09PVlyLlpfT0spOihnPT09WXIuWl9TWU5DX0ZMVVNIJiYodGhpcy5vbkVuZChZci5aX09LKSxuLmF2YWlsX291dD0wKSwhMCl9LEtzLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0sS3MucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1Zci5aX09LJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9cWwuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307ZnVuY3Rpb24gQXUoZSx0KXt2YXIgbj1uZXcgS3ModCk7aWYobi5wdXNoKGUsITApLG4uZXJyKXRocm93IG4ubXNnfHxDdVtuLmVycl07cmV0dXJuIG4ucmVzdWx0fWZ1bmN0aW9uIHhtKGUsdCl7cmV0dXJuIHQ9dHx8e30sdC5yYXc9ITAsQXUoZSx0KX1HbC5JbmZsYXRlPUtzLEdsLmluZmxhdGU9QXUsR2wuaW5mbGF0ZVJhdz14bSxHbC51bmd6aXA9QXU7dmFyIEJtPXhlLmFzc2lnbixNbT1OdCxEbT1HbCxMbT1JZCxrZD17fTtCbShrZCxNbSxEbSxMbSk7dmFyIFJkPWtkO2xldCBGbT0idXB4MnB4IixWbT1be25hbWU6InVweCIsdHlwZTpbTnVtYmVyLFN0cmluZ10scmVxdWlyZWQ6ITB9XSxVbT0xZS00LCRtPTc1MCx4ZD0hMSxPdT0wLEJkPTAsTWQ9OTYwLERkPTM3NSxMZD03NTA7ZnVuY3Rpb24gSG0oKXtsZXR7cGxhdGZvcm06ZSxwaXhlbFJhdGlvOnQsd2luZG93V2lkdGg6bn09UnIoKTtPdT1uLEJkPXQseGQ9ZT09PSJpb3MifWZ1bmN0aW9uIFR1KGUsdCl7bGV0IG49TnVtYmVyKGUpO3JldHVybiBpc05hTihuKT90Om59ZnVuY3Rpb24gam0oKXtsZXQgZT1SLmdsb2JhbFN0eWxlfHx7fTtNZD1UdShlLnJweENhbGNNYXhEZXZpY2VXaWR0aCw5NjApLERkPVR1KGUucnB4Q2FsY0Jhc2VEZXZpY2VXaWR0aCwzNzUpLExkPVR1KGUucnB4Q2FsY0Jhc2VEZXZpY2VXaWR0aCw3NTApfWxldCB6bT1EdChGbSwoZSx0KT0+e2lmKE91PT09MCYmKEhtKCksam0oKSksZT1OdW1iZXIoZSksZT09PTApcmV0dXJuIDA7bGV0IG49dHx8T3U7bj1lPT09TGR8fG48PU1kP246RGQ7bGV0IHI9ZS8kbSpuO3JldHVybiByPDAmJihyPS1yKSxyPU1hdGguZmxvb3IocitVbSkscj09PTAmJihCZD09PTF8fCF4ZD9yPTE6cj0uNSksZTwwPy1yOnJ9LFZtKSxXbT0iYWRkSW50ZXJjZXB0b3IiLEdtPSJyZW1vdmVJbnRlcmNlcHRvciIsRmQ9W3tuYW1lOiJtZXRob2QiLHR5cGU6W1N0cmluZyxPYmplY3RdLHJlcXVpcmVkOiEwfV0sWW09RmQ7ZnVuY3Rpb24gVmQoZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG49Pnt6LmlzRnVuY3Rpb24odFtuXSkmJihlW25dPXFtKGVbbl0sdFtuXSkpfSl9ZnVuY3Rpb24gVWQoZSx0KXshZXx8IXR8fE9iamVjdC5rZXlzKHQpLmZvckVhY2gobj0+e2xldCByPWVbbl0sbz10W25dO3ouaXNBcnJheShyKSYmei5pc0Z1bmN0aW9uKG8pJiZ6LnJlbW92ZShyLG8pfSl9ZnVuY3Rpb24gcW0oZSx0KXtsZXQgbj10P2U/ZS5jb25jYXQodCk6ei5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4mJkptKG4pfWZ1bmN0aW9uIEptKGUpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQuaW5kZXhPZihlW25dKT09PS0xJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9bGV0IEttPUR0KFdtLChlLHQpPT57ei5pc1N0cmluZyhlKSYmei5pc1BsYWluT2JqZWN0KHQpP1ZkKENyW2VdfHwoQ3JbZV09e30pLHQpOnouaXNQbGFpbk9iamVjdChlKSYmVmQoa24sZSl9LEZkKSxabT1EdChHbSwoZSx0KT0+e3ouaXNTdHJpbmcoZSk/ei5pc1BsYWluT2JqZWN0KHQpP1VkKENyW2VdLHQpOmRlbGV0ZSBDcltlXTp6LmlzUGxhaW5PYmplY3QoZSkmJlVkKGtuLGUpfSxZbSksWG09e30sUW09IiRvbiIsJGQ9W3tuYW1lOiJldmVudCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHtuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMH1dLGVfPSIkb25jZSIsdF89JGQsbl89IiRvZmYiLHJfPVt7bmFtZToiZXZlbnQiLHR5cGU6W1N0cmluZyxBcnJheV19LHtuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbn1dLGlfPSIkZW1pdCIsb189W3tuYW1lOiJldmVudCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxacz1uZXcgSi5FbWl0dGVyLGFfPUR0KFFtLChlLHQpPT4oWnMub24oZSx0KSwoKT0+WnMub2ZmKGUsdCkpLCRkKSxzXz1EdChlXywoZSx0KT0+KFpzLm9uY2UoZSx0KSwoKT0+WnMub2ZmKGUsdCkpLHRfKSxsXz1EdChuXywoZSx0KT0+e2lmKCFlKXtacy5lPXt9O3JldHVybn16LmlzQXJyYXkoZSl8fChlPVtlXSksZS5mb3JFYWNoKG49PlpzLm9mZihuLHQpKX0scl8pLGNfPUR0KGlfLChlLC4uLnQpPT57WnMuZW1pdChlLC4uLnQpfSxvXyksSGQ9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSx1Xz0iY3JlYXRlVmlkZW9Db250ZXh0IixmXz0iY3JlYXRlTWFwQ29udGV4dCIsZF89SGQsaF89ImNyZWF0ZUNhbnZhc0NvbnRleHQiLGdfPVt7bmFtZToiY2FudmFzSWQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fV0scF89ImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0Iix2Xz0iY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiLG1fPUhkLmNvbmNhdCh7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fSksX189Wy41LC44LDEsMS4yNSwxLjUsMl07Y2xhc3MgUHV7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1wbGF5KCl7b24odGhpcy5pZCx0aGlzLnBhZ2VJZCwicGxheSIpfXBhdXNlKCl7b24odGhpcy5pZCx0aGlzLnBhZ2VJZCwicGF1c2UiKX1zdG9wKCl7b24odGhpcy5pZCx0aGlzLnBhZ2VJZCwic3RvcCIpfXNlZWsodCl7b24odGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VlayIse3Bvc2l0aW9uOnR9KX1zZW5kRGFubXUodCl7b24odGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VuZERhbm11Iix0KX1wbGF5YmFja1JhdGUodCl7fl9fLmluZGV4T2YodCl8fCh0PTEpLG9uKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBsYXliYWNrUmF0ZSIse3JhdGU6dH0pfXJlcXVlc3RGdWxsU2NyZWVuKHQ9e30pe29uKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlcXVlc3RGdWxsU2NyZWVuIix0KX1leGl0RnVsbFNjcmVlbigpe29uKHRoaXMuaWQsdGhpcy5wYWdlSWQsImV4aXRGdWxsU2NyZWVuIil9c2hvd1N0YXR1c0Jhcigpe29uKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNob3dTdGF0dXNCYXIiKX1oaWRlU3RhdHVzQmFyKCl7b24odGhpcy5pZCx0aGlzLnBhZ2VJZCwiaGlkZVN0YXR1c0JhciIpfX1sZXQgYl89RHQodV8sKGUsdCk9PnQ/bmV3IFB1KGUsRm4odCkpOm5ldyBQdShlLEZuKGJyKCkpKSkseV89KGUsdCk9PntsZXQgbj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KG4pP2UuZmFpbCYmZS5mYWlsKHQpOmUuc3VjY2VzcyYmZS5zdWNjZXNzKHQpLGUuY29tcGxldGUmJmUuY29tcGxldGUodCl9LFRpPShlLHQsbixyKT0+e2puKGUsdCxuLHIsbz0+e3ImJnlfKHIsbyl9KX07Y2xhc3MgSXV7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1nZXRDZW50ZXJMb2NhdGlvbih0KXtUaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9bW92ZVRvTG9jYXRpb24odCl7VGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwibW92ZVRvTG9jYXRpb24iLHQpfWdldFNjYWxlKHQpe1RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImdldFNjYWxlIix0KX1nZXRSZWdpb24odCl7VGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiZ2V0UmVnaW9uIix0KX1pbmNsdWRlUG9pbnRzKHQpe1RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluY2x1ZGVQb2ludHMiLHQpfXRyYW5zbGF0ZU1hcmtlcih0KXtUaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJ0cmFuc2xhdGVNYXJrZXIiLHQpfSRnZXRBcHBNYXAoKXtyZXR1cm4gcy5tYXBzLmdldE1hcEJ5SWQodGhpcy5wYWdlSWQrIi1tYXAtIit0aGlzLmlkKX1hZGRDdXN0b21MYXllcih0KXtUaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJhZGRDdXN0b21MYXllciIsdCl9cmVtb3ZlQ3VzdG9tTGF5ZXIodCl7VGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlQ3VzdG9tTGF5ZXIiLHQpfWFkZEdyb3VuZE92ZXJsYXkodCl7VGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9cmVtb3ZlR3JvdW5kT3ZlcmxheSh0KXtUaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX11cGRhdGVHcm91bmRPdmVybGF5KHQpe1RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLHQpfWluaXRNYXJrZXJDbHVzdGVyKHQpe1RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluaXRNYXJrZXJDbHVzdGVyIix0KX1hZGRNYXJrZXJzKHQpe1RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImFkZE1hcmtlcnMiLHQpfXJlbW92ZU1hcmtlcnModCl7VGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlTWFya2VycyIsdCl9bW92ZUFsb25nKHQpe1RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm1vdmVBbG9uZyIsdCl9c2V0TG9jTWFya2VySWNvbih0KXtUaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJzZXRMb2NNYXJrZXJJY29uIix0KX1vcGVuTWFwQXBwKHQpe1RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm9wZW5NYXBBcHAiLHQpfW9uKHQsbil7VGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwib24iLHtuYW1lOnQsY2FsbGJhY2s6bn0pfX1sZXQgRV89RHQoZl8sKGUsdCk9PnQ/bmV3IEl1KGUsRm4odCkpOm5ldyBJdShlLEZuKGJyKCkpKSxkXyk7ZnVuY3Rpb24gQXMoZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyKXtuP3JbZV09TWF0aC5yb3VuZChuKTp0eXBlb2YgdCE9InVuZGVmaW5lZCImJihyW2VdPXQpfX1sZXQgamQ9QXMoIndpZHRoIiksemQ9QXMoImhlaWdodCIpLFNfPSJjYW52YXNHZXRJbWFnZURhdGEiLFdkPXtmb3JtYXRBcmdzOnt4OkFzKCJ4IikseTpBcygieSIpLHdpZHRoOmpkLGhlaWdodDp6ZH19LEdkPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSx5Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMH0sd2lkdGg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfX0sd189ImNhbnZhc1B1dEltYWdlRGF0YSIsQ189V2QsQV89ei5leHRlbmQoe2RhdGE6e3R5cGU6VWludDhDbGFtcGVkQXJyYXkscmVxdWlyZWQ6ITB9fSxHZCx7aGVpZ2h0Ont0eXBlOk51bWJlcn19KSxZZD17UE5HOiJwbmciLEpQRzoianBnIixKUEVHOiJqcGcifSxPXz0iY2FudmFzVG9UZW1wRmlsZVBhdGgiLFRfPXtmb3JtYXRBcmdzOnt4OkFzKCJ4IiwwKSx5OkFzKCJ5IiwwKSx3aWR0aDpqZCxoZWlnaHQ6emQsZGVzdFdpZHRoOkFzKCJkZXN0V2lkdGgiKSxkZXN0SGVpZ2h0OkFzKCJkZXN0SGVpZ2h0IiksZmlsZVR5cGUoZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKTtsZXQgbj1ZZFtlXTtufHwobj1ZZC5QTkcpLHQuZmlsZVR5cGU9bn0scXVhbGl0eShlLHQpe3QucXVhbGl0eT1lJiZlPjAmJmU8MT9lOjF9fX0sUF89e3g6TnVtYmVyLHk6TnVtYmVyLHdpZHRoOk51bWJlcixoZWlnaHQ6TnVtYmVyLGRlc3RXaWR0aDpOdW1iZXIsZGVzdEhlaWdodDpOdW1iZXIsY2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlVHlwZTpTdHJpbmcscXVhbGl0eTpOdW1iZXJ9O2Z1bmN0aW9uIE9jKGUsdCxuLHIsbyl7b3QuaW52b2tlVmlld01ldGhvZChgY2FudmFzLiR7ZX1gLHt0eXBlOm4sZGF0YTpyfSx0LGM9PntvJiZvKGMpfSl9dmFyIElfPVsic2NhbGUiLCJyb3RhdGUiLCJ0cmFuc2xhdGUiLCJzZXRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXSxOXz1bImRyYXdJbWFnZSIsImZpbGxUZXh0IiwiZmlsbCIsInN0cm9rZSIsImZpbGxSZWN0Iiwic3Ryb2tlUmVjdCIsImNsZWFyUmVjdCIsInN0cm9rZVRleHQiXSxrXz1bInNldEZpbGxTdHlsZSIsInNldFRleHRBbGlnbiIsInNldFN0cm9rZVN0eWxlIiwic2V0R2xvYmFsQWxwaGEiLCJzZXRTaGFkb3ciLCJzZXRGb250U2l6ZSIsInNldExpbmVDYXAiLCJzZXRMaW5lSm9pbiIsInNldExpbmVXaWR0aCIsInNldE1pdGVyTGltaXQiLCJzZXRUZXh0QmFzZWxpbmUiLCJzZXRMaW5lRGFzaCJdO2Z1bmN0aW9uIFJfKGUsdCl7bGV0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gci5mb250PXQsci5tZWFzdXJlVGV4dChlKS53aWR0aHx8MH1sZXQgcWQ9e2FsaWNlYmx1ZToiI2YwZjhmZiIsYW50aXF1ZXdoaXRlOiIjZmFlYmQ3IixhcXVhOiIjMDBmZmZmIixhcXVhbWFyaW5lOiIjN2ZmZmQ0IixhenVyZToiI2YwZmZmZiIsYmVpZ2U6IiNmNWY1ZGMiLGJpc3F1ZToiI2ZmZTRjNCIsYmxhY2s6IiMwMDAwMDAiLGJsYW5jaGVkYWxtb25kOiIjZmZlYmNkIixibHVlOiIjMDAwMGZmIixibHVldmlvbGV0OiIjOGEyYmUyIixicm93bjoiI2E1MmEyYSIsYnVybHl3b29kOiIjZGViODg3IixjYWRldGJsdWU6IiM1ZjllYTAiLGNoYXJ0cmV1c2U6IiM3ZmZmMDAiLGNob2NvbGF0ZToiI2QyNjkxZSIsY29yYWw6IiNmZjdmNTAiLGNvcm5mbG93ZXJibHVlOiIjNjQ5NWVkIixjb3Juc2lsazoiI2ZmZjhkYyIsY3JpbXNvbjoiI2RjMTQzYyIsY3lhbjoiIzAwZmZmZiIsZGFya2JsdWU6IiMwMDAwOGIiLGRhcmtjeWFuOiIjMDA4YjhiIixkYXJrZ29sZGVucm9kOiIjYjg4NjBiIixkYXJrZ3JheToiI2E5YTlhOSIsZGFya2dyZXk6IiNhOWE5YTkiLGRhcmtncmVlbjoiIzAwNjQwMCIsZGFya2toYWtpOiIjYmRiNzZiIixkYXJrbWFnZW50YToiIzhiMDA4YiIsZGFya29saXZlZ3JlZW46IiM1NTZiMmYiLGRhcmtvcmFuZ2U6IiNmZjhjMDAiLGRhcmtvcmNoaWQ6IiM5OTMyY2MiLGRhcmtyZWQ6IiM4YjAwMDAiLGRhcmtzYWxtb246IiNlOTk2N2EiLGRhcmtzZWFncmVlbjoiIzhmYmM4ZiIsZGFya3NsYXRlYmx1ZToiIzQ4M2Q4YiIsZGFya3NsYXRlZ3JheToiIzJmNGY0ZiIsZGFya3NsYXRlZ3JleToiIzJmNGY0ZiIsZGFya3R1cnF1b2lzZToiIzAwY2VkMSIsZGFya3Zpb2xldDoiIzk0MDBkMyIsZGVlcHBpbms6IiNmZjE0OTMiLGRlZXBza3libHVlOiIjMDBiZmZmIixkaW1ncmF5OiIjNjk2OTY5IixkaW1ncmV5OiIjNjk2OTY5Iixkb2RnZXJibHVlOiIjMWU5MGZmIixmaXJlYnJpY2s6IiNiMjIyMjIiLGZsb3JhbHdoaXRlOiIjZmZmYWYwIixmb3Jlc3RncmVlbjoiIzIyOGIyMiIsZnVjaHNpYToiI2ZmMDBmZiIsZ2FpbnNib3JvOiIjZGNkY2RjIixnaG9zdHdoaXRlOiIjZjhmOGZmIixnb2xkOiIjZmZkNzAwIixnb2xkZW5yb2Q6IiNkYWE1MjAiLGdyYXk6IiM4MDgwODAiLGdyZXk6IiM4MDgwODAiLGdyZWVuOiIjMDA4MDAwIixncmVlbnllbGxvdzoiI2FkZmYyZiIsaG9uZXlkZXc6IiNmMGZmZjAiLGhvdHBpbms6IiNmZjY5YjQiLGluZGlhbnJlZDoiI2NkNWM1YyIsaW5kaWdvOiIjNGIwMDgyIixpdm9yeToiI2ZmZmZmMCIsa2hha2k6IiNmMGU2OGMiLGxhdmVuZGVyOiIjZTZlNmZhIixsYXZlbmRlcmJsdXNoOiIjZmZmMGY1IixsYXduZ3JlZW46IiM3Y2ZjMDAiLGxlbW9uY2hpZmZvbjoiI2ZmZmFjZCIsbGlnaHRibHVlOiIjYWRkOGU2IixsaWdodGNvcmFsOiIjZjA4MDgwIixsaWdodGN5YW46IiNlMGZmZmYiLGxpZ2h0Z29sZGVucm9keWVsbG93OiIjZmFmYWQyIixsaWdodGdyYXk6IiNkM2QzZDMiLGxpZ2h0Z3JleToiI2QzZDNkMyIsbGlnaHRncmVlbjoiIzkwZWU5MCIsbGlnaHRwaW5rOiIjZmZiNmMxIixsaWdodHNhbG1vbjoiI2ZmYTA3YSIsbGlnaHRzZWFncmVlbjoiIzIwYjJhYSIsbGlnaHRza3libHVlOiIjODdjZWZhIixsaWdodHNsYXRlZ3JheToiIzc3ODg5OSIsbGlnaHRzbGF0ZWdyZXk6IiM3Nzg4OTkiLGxpZ2h0c3RlZWxibHVlOiIjYjBjNGRlIixsaWdodHllbGxvdzoiI2ZmZmZlMCIsbGltZToiIzAwZmYwMCIsbGltZWdyZWVuOiIjMzJjZDMyIixsaW5lbjoiI2ZhZjBlNiIsbWFnZW50YToiI2ZmMDBmZiIsbWFyb29uOiIjODAwMDAwIixtZWRpdW1hcXVhbWFyaW5lOiIjNjZjZGFhIixtZWRpdW1ibHVlOiIjMDAwMGNkIixtZWRpdW1vcmNoaWQ6IiNiYTU1ZDMiLG1lZGl1bXB1cnBsZToiIzkzNzBkYiIsbWVkaXVtc2VhZ3JlZW46IiMzY2IzNzEiLG1lZGl1bXNsYXRlYmx1ZToiIzdiNjhlZSIsbWVkaXVtc3ByaW5nZ3JlZW46IiMwMGZhOWEiLG1lZGl1bXR1cnF1b2lzZToiIzQ4ZDFjYyIsbWVkaXVtdmlvbGV0cmVkOiIjYzcxNTg1IixtaWRuaWdodGJsdWU6IiMxOTE5NzAiLG1pbnRjcmVhbToiI2Y1ZmZmYSIsbWlzdHlyb3NlOiIjZmZlNGUxIixtb2NjYXNpbjoiI2ZmZTRiNSIsbmF2YWpvd2hpdGU6IiNmZmRlYWQiLG5hdnk6IiMwMDAwODAiLG9sZGxhY2U6IiNmZGY1ZTYiLG9saXZlOiIjODA4MDAwIixvbGl2ZWRyYWI6IiM2YjhlMjMiLG9yYW5nZToiI2ZmYTUwMCIsb3JhbmdlcmVkOiIjZmY0NTAwIixvcmNoaWQ6IiNkYTcwZDYiLHBhbGVnb2xkZW5yb2Q6IiNlZWU4YWEiLHBhbGVncmVlbjoiIzk4ZmI5OCIscGFsZXR1cnF1b2lzZToiI2FmZWVlZSIscGFsZXZpb2xldHJlZDoiI2RiNzA5MyIscGFwYXlhd2hpcDoiI2ZmZWZkNSIscGVhY2hwdWZmOiIjZmZkYWI5IixwZXJ1OiIjY2Q4NTNmIixwaW5rOiIjZmZjMGNiIixwbHVtOiIjZGRhMGRkIixwb3dkZXJibHVlOiIjYjBlMGU2IixwdXJwbGU6IiM4MDAwODAiLHJlYmVjY2FwdXJwbGU6IiM2NjMzOTkiLHJlZDoiI2ZmMDAwMCIscm9zeWJyb3duOiIjYmM4ZjhmIixyb3lhbGJsdWU6IiM0MTY5ZTEiLHNhZGRsZWJyb3duOiIjOGI0NTEzIixzYWxtb246IiNmYTgwNzIiLHNhbmR5YnJvd246IiNmNGE0NjAiLHNlYWdyZWVuOiIjMmU4YjU3IixzZWFzaGVsbDoiI2ZmZjVlZSIsc2llbm5hOiIjYTA1MjJkIixzaWx2ZXI6IiNjMGMwYzAiLHNreWJsdWU6IiM4N2NlZWIiLHNsYXRlYmx1ZToiIzZhNWFjZCIsc2xhdGVncmF5OiIjNzA4MDkwIixzbGF0ZWdyZXk6IiM3MDgwOTAiLHNub3c6IiNmZmZhZmEiLHNwcmluZ2dyZWVuOiIjMDBmZjdmIixzdGVlbGJsdWU6IiM0NjgyYjQiLHRhbjoiI2QyYjQ4YyIsdGVhbDoiIzAwODA4MCIsdGhpc3RsZToiI2Q4YmZkOCIsdG9tYXRvOiIjZmY2MzQ3Iix0dXJxdW9pc2U6IiM0MGUwZDAiLHZpb2xldDoiI2VlODJlZSIsd2hlYXQ6IiNmNWRlYjMiLHdoaXRlOiIjZmZmZmZmIix3aGl0ZXNtb2tlOiIjZjVmNWY1Iix5ZWxsb3c6IiNmZmZmMDAiLHllbGxvd2dyZWVuOiIjOWFjZDMyIix0cmFuc3BhcmVudDoiIzAwMDAwMDAwIn07ZnVuY3Rpb24gTnUoZSl7ZT1lfHwiIzAwMDAwMCI7dmFyIHQ9bnVsbDtpZigodD0vXiMoWzAtOXxBLUZ8YS1mXXs2fSkkLy5leGVjKGUpKSE9bnVsbCl7bGV0IHI9cGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxvPXBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNiksYz1wYXJzZUludCh0WzFdLnNsaWNlKDQpLDE2KTtyZXR1cm5bcixvLGMsMjU1XX1pZigodD0vXiMoWzAtOXxBLUZ8YS1mXXszfSkkLy5leGVjKGUpKSE9bnVsbCl7bGV0IHI9dFsxXS5zbGljZSgwLDEpLG89dFsxXS5zbGljZSgxLDIpLGM9dFsxXS5zbGljZSgyLDMpO3JldHVybiByPXBhcnNlSW50KHIrciwxNiksbz1wYXJzZUludChvK28sMTYpLGM9cGFyc2VJbnQoYytjLDE2KSxbcixvLGMsMjU1XX1pZigodD0vXnJnYlwoKC4rKVwpJC8uZXhlYyhlKSkhPW51bGwpcmV0dXJuIHRbMV0uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIE1hdGgubWluKDI1NSxwYXJzZUludChyLnRyaW0oKSkpfSkuY29uY2F0KDI1NSk7aWYoKHQ9L15yZ2JhXCgoLispXCkkLy5leGVjKGUpKSE9bnVsbClyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihyLG8pe3JldHVybiBvPT09Mz9NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KHIudHJpbSgpKSk6TWF0aC5taW4oMjU1LHBhcnNlSW50KHIudHJpbSgpKSl9KTt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7aWYoei5oYXNPd24ocWQsbikpe3Q9L14jKFswLTl8QS1GfGEtZl17Niw4fSkkLy5leGVjKHFkW25dKTtsZXQgcj1wYXJzZUludCh0WzFdLnNsaWNlKDAsMiksMTYpLG89cGFyc2VJbnQodFsxXS5zbGljZSgyLDQpLDE2KSxjPXBhcnNlSW50KHRbMV0uc2xpY2UoNCw2KSwxNiksZz1wYXJzZUludCh0WzFdLnNsaWNlKDYsOCksMTYpO3JldHVybiBnPWc+PTA/ZzoyNTUsW3IsbyxjLGddfXJldHVybiBjb25zb2xlLmVycm9yKCJ1bnN1cHBvcnRlZCBjb2xvcjoiK2UpLFswLDAsMCwyNTVdfWNsYXNzIEpke2NvbnN0cnVjdG9yKHQsbil7dGhpcy50eXBlPXQsdGhpcy5kYXRhPW4sdGhpcy5jb2xvclN0b3A9W119YWRkQ29sb3JTdG9wKHQsbil7dGhpcy5jb2xvclN0b3AucHVzaChbdCxOdShuKV0pfX1jbGFzcyB4X3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudHlwZT0icGF0dGVybiIsdGhpcy5kYXRhPXQsdGhpcy5jb2xvclN0b3A9bn19Y2xhc3MgQl97Y29uc3RydWN0b3IodCl7dGhpcy53aWR0aD10fX1jbGFzcyBKbHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaWQ9dCx0aGlzLnBhZ2VJZD1uLHRoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdLHRoaXMuZHJhd2luZ1N0YXRlPVtdLHRoaXMuc3RhdGU9e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX1kcmF3KHQ9ITEsbil7dmFyIHI9Wy4uLnRoaXMuYWN0aW9uc107dGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSxPYyh0aGlzLmlkLHRoaXMucGFnZUlkLCJhY3Rpb25zQ2hhbmdlZCIse2FjdGlvbnM6cixyZXNlcnZlOnR9LG4pfWNyZWF0ZUxpbmVhckdyYWRpZW50KHQsbixyLG8pe3JldHVybiBuZXcgSmQoImxpbmVhciIsW3QsbixyLG9dKX1jcmVhdGVDaXJjdWxhckdyYWRpZW50KHQsbixyKXtyZXR1cm4gbmV3IEpkKCJyYWRpYWwiLFt0LG4scl0pfWNyZWF0ZVBhdHRlcm4odCxuKXtpZihuPT09dm9pZCAwKWNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IDIgYXJndW1lbnRzIHJlcXVpcmVkLCBidXQgb25seSAxIHByZXNlbnQuIik7ZWxzZSBpZihbInJlcGVhdCIsInJlcGVhdC14IiwicmVwZWF0LXkiLCJuby1yZXBlYXQiXS5pbmRleE9mKG4pPDApY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogVGhlIHByb3ZpZGVkIHR5cGUgKCciK24rIicpIGlzIG5vdCBvbmUgb2YgJ3JlcGVhdCcsICduby1yZXBlYXQnLCAncmVwZWF0LXgnLCBvciAncmVwZWF0LXknLiIpO2Vsc2UgcmV0dXJuIG5ldyB4Xyh0LG4pfW1lYXN1cmVUZXh0KHQpe2xldCBuPXRoaXMuc3RhdGUuZm9udCxyPTA7e2xldCBvPXMud2Vidmlldy5hbGwoKS5maW5kKGM9PmMuZ2V0VVJMKCkuZW5kc1dpdGgoInd3dy9fX3VuaWFwcHZpZXcuaHRtbCIpKTtvJiYocj1OdW1iZXIoby5ldmFsSlNTeW5jKGAoJHtSXy50b1N0cmluZygpfSkoJHtKU09OLnN0cmluZ2lmeSh0KX0sJHtKU09OLnN0cmluZ2lmeShuKX0pYCkpKX1yZXR1cm4gbmV3IEJfKHIpfXNhdmUoKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzYXZlIixkYXRhOltdfSksdGhpcy5kcmF3aW5nU3RhdGUucHVzaCh0aGlzLnN0YXRlKX1yZXN0b3JlKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoicmVzdG9yZSIsZGF0YTpbXX0pLHRoaXMuc3RhdGU9dGhpcy5kcmF3aW5nU3RhdGUucG9wKCl8fHtsaW5lRGFzaDpbMCwwXSxzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WTowLHNoYWRvd0JsdXI6MCxzaGFkb3dDb2xvcjpbMCwwLDAsMF0sZm9udDoiMTBweCBzYW5zLXNlcmlmIixmb250U2l6ZToxMCxmb250V2VpZ2h0OiJub3JtYWwiLGZvbnRTdHlsZToibm9ybWFsIixmb250RmFtaWx5OiJzYW5zLXNlcmlmIn19YmVnaW5QYXRoKCl7dGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJiZWdpblBhdGgiLGRhdGE6W119KX1tb3ZlVG8odCxuKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W3Qsbl19KSx0aGlzLnN1YnBhdGg9W1t0LG5dXX1saW5lVG8odCxuKXt0aGlzLnBhdGgubGVuZ3RoPT09MCYmdGhpcy5zdWJwYXRoLmxlbmd0aD09PTA/dGhpcy5wYXRoLnB1c2goe21ldGhvZDoibW92ZVRvIixkYXRhOlt0LG5dfSk6dGhpcy5wYXRoLnB1c2goe21ldGhvZDoibGluZVRvIixkYXRhOlt0LG5dfSksdGhpcy5zdWJwYXRoLnB1c2goW3Qsbl0pfXF1YWRyYXRpY0N1cnZlVG8odCxuLHIsbyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicXVhZHJhdGljQ3VydmVUbyIsZGF0YTpbdCxuLHIsb119KSx0aGlzLnN1YnBhdGgucHVzaChbcixvXSl9YmV6aWVyQ3VydmVUbyh0LG4scixvLGMsZyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmV6aWVyQ3VydmVUbyIsZGF0YTpbdCxuLHIsbyxjLGddfSksdGhpcy5zdWJwYXRoLnB1c2goW2MsZ10pfWFyYyh0LG4scixvLGMsZz0hMSl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYXJjIixkYXRhOlt0LG4scixvLGMsZ119KSx0aGlzLnN1YnBhdGgucHVzaChbdCxuXSl9cmVjdCh0LG4scixvKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJyZWN0IixkYXRhOlt0LG4scixvXX0pLHRoaXMuc3VicGF0aD1bW3Qsbl1dfWFyY1RvKHQsbixyLG8sYyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYXJjVG8iLGRhdGE6W3QsbixyLG8sY119KSx0aGlzLnN1YnBhdGgucHVzaChbcixvXSl9Y2xpcCgpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImNsaXAiLGRhdGE6Wy4uLnRoaXMucGF0aF19KX1jbG9zZVBhdGgoKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJjbG9zZVBhdGgiLGRhdGE6W119KSx0aGlzLnN1YnBhdGgubGVuZ3RoJiYodGhpcy5zdWJwYXRoPVt0aGlzLnN1YnBhdGguc2hpZnQoKV0pfWNsZWFyQWN0aW9ucygpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdfWdldEFjdGlvbnMoKXt2YXIgdD1bLi4udGhpcy5hY3Rpb25zXTtyZXR1cm4gdGhpcy5jbGVhckFjdGlvbnMoKSx0fXNldCBsaW5lRGFzaE9mZnNldCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lRGFzaE9mZnNldCIsZGF0YTpbdF19KX1zZXQgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsZGF0YTpbdF19KX1zZXQgc2hhZG93Qmx1cih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dCbHVyIixkYXRhOlt0XX0pfXNldCBzaGFkb3dDb2xvcih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dDb2xvciIsZGF0YTpbdF19KX1zZXQgc2hhZG93T2Zmc2V0WCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dPZmZzZXRYIixkYXRhOlt0XX0pfXNldCBzaGFkb3dPZmZzZXRZKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFkiLGRhdGE6W3RdfSl9c2V0IGZvbnQodCl7dmFyIG49dGhpczt0aGlzLnN0YXRlLmZvbnQ9dDt2YXIgcj10Lm1hdGNoKC9eKChbXHdcLV0rXHMpKikoXGQrcj9weCkoXC8oXGQrXC4/XGQqKHI/cHgpPykpP1xzKyguKikvKTtpZihyKXt2YXIgbz1yWzFdLnRyaW0oKS5zcGxpdCgvXHMvKSxjPXBhcnNlRmxvYXQoclszXSksZz1yWzddLGI9W107by5mb3JFYWNoKGZ1bmN0aW9uKFQsTCl7WyJpdGFsaWMiLCJvYmxpcXVlIiwibm9ybWFsIl0uaW5kZXhPZihUKT4tMT8oYi5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbVF19KSxuLnN0YXRlLmZvbnRTdHlsZT1UKTpbImJvbGQiLCJub3JtYWwiXS5pbmRleE9mKFQpPi0xPyhiLnB1c2goe21ldGhvZDoic2V0Rm9udFdlaWdodCIsZGF0YTpbVF19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9VCk6TD09PTA/KGIucHVzaCh7bWV0aG9kOiJzZXRGb250U3R5bGUiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFN0eWxlPSJub3JtYWwiKTpMPT09MSYmVigpfSksby5sZW5ndGg9PT0xJiZWKCksbz1iLm1hcChmdW5jdGlvbihUKXtyZXR1cm4gVC5kYXRhWzBdfSkuam9pbigiICIpLHRoaXMuc3RhdGUuZm9udFNpemU9Yyx0aGlzLnN0YXRlLmZvbnRGYW1pbHk9Zyx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRGb250IixkYXRhOltgJHtvfSAke2N9cHggJHtnfWBdfSl9ZWxzZSBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBzZXQgJ2ZvbnQnIG9uICdDYW52YXNDb250ZXh0JzogaW52YWxpZCBmb3JtYXQuIik7ZnVuY3Rpb24gVigpe2IucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOlsibm9ybWFsIl19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9Im5vcm1hbCJ9fWdldCBmb250KCl7cmV0dXJuIHRoaXMuc3RhdGUuZm9udH1zZXQgZmlsbFN0eWxlKHQpe3RoaXMuc2V0RmlsbFN0eWxlKHQpfXNldCBzdHJva2VTdHlsZSh0KXt0aGlzLnNldFN0cm9rZVN0eWxlKHQpfXNldCBnbG9iYWxBbHBoYSh0KXt0PU1hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQodCkpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEdsb2JhbEFscGhhIixkYXRhOlt0XX0pfXNldCB0ZXh0QWxpZ24odCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0VGV4dEFsaWduIixkYXRhOlt0XX0pfXNldCBsaW5lQ2FwKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVDYXAiLGRhdGE6W3RdfSl9c2V0IGxpbmVKb2luKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVKb2luIixkYXRhOlt0XX0pfXNldCBsaW5lV2lkdGgodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZVdpZHRoIixkYXRhOlt0XX0pfXNldCBtaXRlckxpbWl0KHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldE1pdGVyTGltaXQiLGRhdGE6W3RdfSl9c2V0IHRleHRCYXNlbGluZSh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QmFzZWxpbmUiLGRhdGE6W3RdfSl9fWxldCBNXz1KLm9uY2UoKCk9PntbLi4uSV8sLi4uTl9dLmZvckVhY2goZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtzd2l0Y2gobil7Y2FzZSJmaWxsIjpjYXNlInN0cm9rZSI6cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuKyJQYXRoIixkYXRhOlsuLi50aGlzLnBhdGhdfSl9O2Nhc2UiZmlsbFJlY3QiOnJldHVybiBmdW5jdGlvbihyLG8sYyxnKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJmaWxsUGF0aCIsZGF0YTpbe21ldGhvZDoicmVjdCIsZGF0YTpbcixvLGMsZ119XX0pfTtjYXNlInN0cm9rZVJlY3QiOnJldHVybiBmdW5jdGlvbihyLG8sYyxnKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzdHJva2VQYXRoIixkYXRhOlt7bWV0aG9kOiJyZWN0IixkYXRhOltyLG8sYyxnXX1dfSl9O2Nhc2UiZmlsbFRleHQiOmNhc2Uic3Ryb2tlVGV4dCI6cmV0dXJuIGZ1bmN0aW9uKHIsbyxjLGcpe3ZhciBiPVtyLnRvU3RyaW5nKCksbyxjXTt0eXBlb2YgZz09Im51bWJlciImJmIucHVzaChnKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpifSl9O2Nhc2UiZHJhd0ltYWdlIjpyZXR1cm4gZnVuY3Rpb24ocixvLGMsZyxiLFYsVCxMLF9lKXtfZT09PXZvaWQgMCYmKFY9byxUPWMsTD1nLF9lPWIsbz12b2lkIDAsYz12b2lkIDAsZz12b2lkIDAsYj12b2lkIDApO3ZhciB3ZTtmdW5jdGlvbiBQZShmdCl7cmV0dXJuIHR5cGVvZiBmdD09Im51bWJlciJ9d2U9UGUobykmJlBlKGMpJiZQZShnKSYmUGUoYik/W3IsVixULEwsX2UsbyxjLGcsYl06UGUoTCkmJlBlKF9lKT9bcixWLFQsTCxfZV06W3IsVixUXSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTp3ZX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbiguLi5yKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpyfSl9fX1KbC5wcm90b3R5cGVbZV09dChlKX0pLGtfLmZvckVhY2goZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtzd2l0Y2gobil7Y2FzZSJzZXRGaWxsU3R5bGUiOmNhc2Uic2V0U3Ryb2tlU3R5bGUiOnJldHVybiBmdW5jdGlvbihyKXt0eXBlb2YgciE9Im9iamVjdCI/dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6WyJub3JtYWwiLE51KHIpXX0pOnRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyLnR5cGUsci5kYXRhLHIuY29sb3JTdG9wXX0pfTtjYXNlInNldEdsb2JhbEFscGhhIjpyZXR1cm4gZnVuY3Rpb24ocil7cj1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KHIpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbcl19KX07Y2FzZSJzZXRTaGFkb3ciOnJldHVybiBmdW5jdGlvbihyLG8sYyxnKXtnPU51KGcpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyLG8sYyxnXX0pLHRoaXMuc3RhdGUuc2hhZG93Qmx1cj1jLHRoaXMuc3RhdGUuc2hhZG93Q29sb3I9Zyx0aGlzLnN0YXRlLnNoYWRvd09mZnNldFg9cix0aGlzLnN0YXRlLnNoYWRvd09mZnNldFk9b307Y2FzZSJzZXRMaW5lRGFzaCI6cmV0dXJuIGZ1bmN0aW9uKHIsbyl7cj1yfHxbMCwwXSxvPW98fDAsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6W3Isb119KSx0aGlzLnN0YXRlLmxpbmVEYXNoPXJ9O2Nhc2Uic2V0Rm9udFNpemUiOnJldHVybiBmdW5jdGlvbihyKXt0aGlzLnN0YXRlLmZvbnQ9dGhpcy5zdGF0ZS5mb250LnJlcGxhY2UoL1xkK1wuP1xkKnB4LyxyKyJweCIpLHRoaXMuc3RhdGUuZm9udFNpemU9cix0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbcl19KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oLi4ucil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6cn0pfX19SmwucHJvdG90eXBlW2VdPXQoZSl9KX0pLERfPUR0KGhfLChlLHQpPT57aWYoTV8oKSx0KXJldHVybiBuZXcgSmwoZSxGbih0KSk7bGV0IG49Rm4oYnIoKSk7aWYobilyZXR1cm4gbmV3IEpsKGUsbik7b3QuZW1pdChKLk9OX0VSUk9SLCJjcmVhdGVDYW52YXNDb250ZXh0OmZhaWwiKX0sZ18pLExfPVRlKFNfLCh7Y2FudmFzSWQ6ZSx4OnQseTpuLHdpZHRoOnIsaGVpZ2h0Om99LHtyZXNvbHZlOmMscmVqZWN0Omd9KT0+e2xldCBiPUZuKGJyKCkpO2lmKCFiKXtnKCk7cmV0dXJufWZ1bmN0aW9uIFYoVCl7aWYoVC5lcnJNc2cmJlQuZXJyTXNnLmluZGV4T2YoImZhaWwiKSE9PS0xKXtnKCIiLFQpO3JldHVybn1sZXQgTD1ULmRhdGE7TCYmTC5sZW5ndGgmJihULmNvbXByZXNzZWQmJihMPVJkLmluZmxhdGVSYXcoTCkpLFQuZGF0YT1uZXcgVWludDhDbGFtcGVkQXJyYXkoTCkpLGRlbGV0ZSBULmNvbXByZXNzZWQsYyhUKX1PYyhlLGIsImdldEltYWdlRGF0YSIse3g6dCx5Om4sd2lkdGg6cixoZWlnaHQ6b30sVil9LEdkLFdkKSxGXz1UZSh3Xywoe2NhbnZhc0lkOmUsZGF0YTp0LHg6bix5OnIsd2lkdGg6byxoZWlnaHQ6Y30se3Jlc29sdmU6ZyxyZWplY3Q6Yn0pPT57dmFyIFY9Rm4oYnIoKSk7aWYoIVYpe2IoKTtyZXR1cm59bGV0IFQsTD0oKT0+e09jKGUsViwicHV0SW1hZ2VEYXRhIix7ZGF0YTp0LHg6bix5OnIsd2lkdGg6byxoZWlnaHQ6Yyxjb21wcmVzc2VkOlR9LF9lPT57aWYoX2UuZXJyTXNnJiZfZS5lcnJNc2cuaW5kZXhPZigiZmFpbCIpIT09LTEpe2IoKTtyZXR1cm59ZyhfZSl9KX07cy5vcy5uYW1lIT09ImlPUyJ8fHR5cGVvZiBfX1dFRVhfREVWVE9PTF9fPT0iYm9vbGVhbiI/KHQ9UmQuZGVmbGF0ZVJhdyh0LHt0bzoic3RyaW5nIn0pLFQ9ITApOnQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCksTCgpfSxBXyxDXyksVl89VGUoT18sKHt4OmU9MCx5OnQ9MCx3aWR0aDpuLGhlaWdodDpyLGRlc3RXaWR0aDpvLGRlc3RIZWlnaHQ6YyxjYW52YXNJZDpnLGZpbGVUeXBlOmIscXVhbGl0eTpWfSx7cmVzb2x2ZTpULHJlamVjdDpMfSk9Pnt2YXIgX2U9Rm4oYnIoKSk7aWYoIV9lKXtMKCk7cmV0dXJufWxldCB3ZT1gJHtXcn0vY2FudmFzYDtPYyhnLF9lLCJ0b1RlbXBGaWxlUGF0aCIse3g6ZSx5OnQsd2lkdGg6bixoZWlnaHQ6cixkZXN0V2lkdGg6byxkZXN0SGVpZ2h0OmMsZmlsZVR5cGU6YixxdWFsaXR5OlYsZGlybmFtZTp3ZX0sUGU9PntpZihQZS5lcnJNc2cmJlBlLmVyck1zZy5pbmRleE9mKCJmYWlsIikhPT0tMSl7TCgiIixQZSk7cmV0dXJufVQoUGUpfSl9LFBfLFRfKSxLZD1bIm9uQ2FucGxheSIsIm9uUGxheSIsIm9uUGF1c2UiLCJvblN0b3AiLCJvbkVuZGVkIiwib25UaW1lVXBkYXRlIiwib25FcnJvciIsIm9uV2FpdGluZyIsIm9uU2Vla2luZyIsIm9uU2Vla2VkIl0sVV89WyJvZmZDYW5wbGF5Iiwib2ZmUGxheSIsIm9mZlBhdXNlIiwib2ZmU3RvcCIsIm9mZkVuZGVkIiwib2ZmVGltZVVwZGF0ZSIsIm9mZkVycm9yIiwib2ZmV2FpdGluZyIsIm9mZlNlZWtpbmciLCJvZmZTZWVrZWQiXSwkXz17dGhyZXNob2xkczpbMF0saW5pdGlhbFJhdGlvOjAsb2JzZXJ2ZUFsbDohMX0sSF89WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSxqXz0xO2Z1bmN0aW9uIFpkKGU9e30pe3JldHVybiBIXy5tYXAodD0+YCR7TnVtYmVyKGVbdF0pfHwwfXB4YCkuam9pbigiICIpfWNsYXNzIFhke2NvbnN0cnVjdG9yKHQsbil7dGhpcy5fcGFnZUlkPUZuKHQpLHRoaXMuX2NvbXBvbmVudD10LHRoaXMuX29wdGlvbnM9ei5leHRlbmQoe30sJF8sbil9cmVsYXRpdmVUbyh0LG4pe3JldHVybiB0aGlzLl9vcHRpb25zLnJlbGF0aXZlVG9TZWxlY3Rvcj10LHRoaXMuX29wdGlvbnMucm9vdE1hcmdpbj1aZChuKSx0aGlzfXJlbGF0aXZlVG9WaWV3cG9ydCh0KXtyZXR1cm4gdGhpcy5fb3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9dm9pZCAwLHRoaXMuX29wdGlvbnMucm9vdE1hcmdpbj1aZCh0KSx0aGlzfW9ic2VydmUodCxuKXshei5pc0Z1bmN0aW9uKG4pfHwodGhpcy5fb3B0aW9ucy5zZWxlY3Rvcj10LHRoaXMuX3JlcUlkPWpfKyssQWkoe3JlcUlkOnRoaXMuX3JlcUlkLGNvbXBvbmVudDp0aGlzLl9jb21wb25lbnQsb3B0aW9uczp0aGlzLl9vcHRpb25zLGNhbGxiYWNrOm59LHRoaXMuX3BhZ2VJZCkpfWRpc2Nvbm5lY3QoKXt0aGlzLl9yZXFJZCYmdXMoe3JlcUlkOnRoaXMuX3JlcUlkLGNvbXBvbmVudDp0aGlzLl9jb21wb25lbnR9LHRoaXMuX3BhZ2VJZCl9fWxldCB6Xz1EdCgiY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLChlLHQpPT4oZT1KLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZShlKSxlJiYhRm4oZSkmJih0PWUsZT1udWxsKSxlP25ldyBYZChlLHQpOm5ldyBYZChicigpLHQpKSksV189MTtjbGFzcyBRZHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9wYWdlSWQ9dC4kcGFnZSYmdC4kcGFnZS5pZCx0aGlzLl9jb21wb25lbnQ9dH1vYnNlcnZlKHQsbil7IXouaXNGdW5jdGlvbihuKXx8KHRoaXMuX3JlcUlkPVdfKyssSWEoe3JlcUlkOnRoaXMuX3JlcUlkLGNvbXBvbmVudDp0aGlzLl9jb21wb25lbnQsb3B0aW9uczp0LGNhbGxiYWNrOm59LHRoaXMuX3BhZ2VJZCkpfWRpc2Nvbm5lY3QoKXt0aGlzLl9yZXFJZCYmcmEoe3JlcUlkOnRoaXMuX3JlcUlkLGNvbXBvbmVudDp0aGlzLl9jb21wb25lbnR9LHRoaXMuX3BhZ2VJZCl9fWxldCBHXz1EdCgiY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyIixlPT4oZT1KLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZShlKSxlJiYhRm4oZSkmJihlPW51bGwpLGU/bmV3IFFkKGUpOm5ldyBRZChicigpKSkpLFlfPTAsa3U9e307ZnVuY3Rpb24gcV8oZSx0LG4scil7bGV0IG89e29wdGlvbnM6cn0sYz1yJiYoInN1Y2Nlc3MiaW4gcnx8ImZhaWwiaW4gcnx8ImNvbXBsZXRlImluIHIpO2lmKGMpe2xldCBnPVN0cmluZyhZXysrKTtvLmNhbGxiYWNrSWQ9ZyxrdVtnXT1yfW90Lmludm9rZVZpZXdNZXRob2QoYGVkaXRvci4ke2V9YCx7dHlwZTpuLGRhdGE6b30sdCwoe2NhbGxiYWNrSWQ6ZyxkYXRhOmJ9KT0+e2MmJihKLmNhbGxPcHRpb25zKGt1W2ddLGIpLGRlbGV0ZSBrdVtnXSl9KX1jbGFzcyBKX3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaWQ9dCx0aGlzLnBhZ2VJZD1ufWZvcm1hdCh0LG4pe3RoaXMuX2V4ZWMoImZvcm1hdCIse25hbWU6dCx2YWx1ZTpufSl9aW5zZXJ0RGl2aWRlcigpe3RoaXMuX2V4ZWMoImluc2VydERpdmlkZXIiKX1pbnNlcnRJbWFnZSh0KXt0aGlzLl9leGVjKCJpbnNlcnRJbWFnZSIsdCl9aW5zZXJ0VGV4dCh0KXt0aGlzLl9leGVjKCJpbnNlcnRUZXh0Iix0KX1zZXRDb250ZW50cyh0KXt0aGlzLl9leGVjKCJzZXRDb250ZW50cyIsdCl9Z2V0Q29udGVudHModCl7dGhpcy5fZXhlYygiZ2V0Q29udGVudHMiLHQpfWNsZWFyKHQpe3RoaXMuX2V4ZWMoImNsZWFyIix0KX1yZW1vdmVGb3JtYXQodCl7dGhpcy5fZXhlYygicmVtb3ZlRm9ybWF0Iix0KX11bmRvKHQpe3RoaXMuX2V4ZWMoInVuZG8iLHQpfXJlZG8odCl7dGhpcy5fZXhlYygicmVkbyIsdCl9Ymx1cih0KXt0aGlzLl9leGVjKCJibHVyIix0KX1nZXRTZWxlY3Rpb25UZXh0KHQpe3RoaXMuX2V4ZWMoImdldFNlbGVjdGlvblRleHQiLHQpfXNjcm9sbEludG9WaWV3KHQpe3RoaXMuX2V4ZWMoInNjcm9sbEludG9WaWV3Iix0KX1fZXhlYyh0LG4pe3FfKHRoaXMuaWQsdGhpcy5wYWdlSWQsdCxuKX19bGV0IEtfPXtjYW52YXM6SmwsbWFwOkl1LHZpZGVvOlB1LGVkaXRvcjpKX307ZnVuY3Rpb24gZWgoZSl7aWYoZSYmZS5jb250ZXh0SW5mbyl7bGV0e2lkOnQsdHlwZTpuLHBhZ2U6cn09ZS5jb250ZXh0SW5mbyxvPUtfW25dO2UuY29udGV4dD1uZXcgbyh0LHIpLGRlbGV0ZSBlLmNvbnRleHRJbmZvfX1jbGFzcyBSdXtjb25zdHJ1Y3Rvcih0LG4scixvKXt0aGlzLl9zZWxlY3RvclF1ZXJ5PXQsdGhpcy5fY29tcG9uZW50PW4sdGhpcy5fc2VsZWN0b3I9cix0aGlzLl9zaW5nbGU9b31ib3VuZGluZ0NsaWVudFJlY3QodCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7aWQ6ITAsZGF0YXNldDohMCxyZWN0OiEwLHNpemU6ITB9LHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9ZmllbGRzKHQsbil7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx0LG4pLHRoaXMuX3NlbGVjdG9yUXVlcnl9c2Nyb2xsT2Zmc2V0KHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAsc2Nyb2xsT2Zmc2V0OiEwfSx0KSx0aGlzLl9zZWxlY3RvclF1ZXJ5fWNvbnRleHQodCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7Y29udGV4dDohMH0sdCksdGhpcy5fc2VsZWN0b3JRdWVyeX1ub2RlKHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5fX1jbGFzcyBaX3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jb21wb25lbnQ9dm9pZCAwLHRoaXMuX3BhZ2U9dCx0aGlzLl9xdWV1ZT1bXSx0aGlzLl9xdWV1ZUNiPVtdfWV4ZWModCl7cmV0dXJuIGFpKHRoaXMuX3BhZ2UsdGhpcy5fcXVldWUsbj0+e2xldCByPXRoaXMuX3F1ZXVlQ2I7bi5mb3JFYWNoKChvLGMpPT57ei5pc0FycmF5KG8pP28uZm9yRWFjaChlaCk6ZWgobyk7bGV0IGc9cltjXTt6LmlzRnVuY3Rpb24oZykmJmcuY2FsbCh0aGlzLG8pfSksei5pc0Z1bmN0aW9uKHQpJiZ0LmNhbGwodGhpcyxuKX0pLHRoaXMuX25vZGVzUmVmfWluKHQpe3JldHVybiB0aGlzLl9jb21wb25lbnQ9Si5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UodCksdGhpc31zZWxlY3QodCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBSdSh0aGlzLHRoaXMuX2NvbXBvbmVudCx0LCEwKX1zZWxlY3RBbGwodCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBSdSh0aGlzLHRoaXMuX2NvbXBvbmVudCx0LCExKX1zZWxlY3RWaWV3cG9ydCgpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgUnUodGhpcyxudWxsLCIiLCEwKX1fcHVzaCh0LG4scixvLGMpe3RoaXMuX3F1ZXVlLnB1c2goe2NvbXBvbmVudDpuLHNlbGVjdG9yOnQsc2luZ2xlOnIsZmllbGRzOm99KSx0aGlzLl9xdWV1ZUNiLnB1c2goYyl9fWxldCBYXz1EdCgiY3JlYXRlU2VsZWN0b3JRdWVyeSIsZT0+KGU9Si5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSksZSYmIUZuKGUpJiYoZT1udWxsKSxuZXcgWl8oZXx8YnIoKSkpKSxRXz0iY3JlYXRlQW5pbWF0aW9uIixlYj17Zm9ybWF0QXJnczp7fX0sdGI9e2R1cmF0aW9uOk51bWJlcix0aW1pbmdGdW5jdGlvbjpTdHJpbmcsZGVsYXk6TnVtYmVyLHRyYW5zZm9ybU9yaWdpbjpTdHJpbmd9LG5iPXtkdXJhdGlvbjo0MDAsdGltaW5nRnVuY3Rpb246ImxpbmVhciIsZGVsYXk6MCx0cmFuc2Zvcm1PcmlnaW46IjUwJSA1MCUgMCJ9O2NsYXNzIHRoe2NvbnN0cnVjdG9yKHQpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09e30sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMub3B0aW9uPXouZXh0ZW5kKHt9LG5iLHQpfV9nZXRPcHRpb24odCl7bGV0IG49e3RyYW5zaXRpb246ei5leHRlbmQoe30sdGhpcy5vcHRpb24sdCksdHJhbnNmb3JtT3JpZ2luOiIifTtyZXR1cm4gbi50cmFuc2Zvcm1PcmlnaW49bi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixkZWxldGUgbi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixufV9wdXNoQW5pbWF0ZXModCxuKXt0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMucHVzaCh7dHlwZTp0LGFyZ3M6bn0pfV9jb252ZXJUeXBlKHQpe3JldHVybiB0LnJlcGxhY2UoL1tBLVpdL2csbj0+YC0ke24udG9Mb3dlckNhc2UoKX1gKX1fZ2V0VmFsdWUodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj9gJHt0fXB4YDp0fWV4cG9ydCgpe2xldCB0PXRoaXMuYWN0aW9ucztyZXR1cm4gdGhpcy5hY3Rpb25zPVtdLHthY3Rpb25zOnR9fXN0ZXAodCl7cmV0dXJuIHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcy5mb3JFYWNoKG49PntuLnR5cGUhPT0ic3R5bGUiP3RoaXMuY3VycmVudFRyYW5zZm9ybVtuLnR5cGVdPW46dGhpcy5jdXJyZW50VHJhbnNmb3JtW2Ake24udHlwZX0uJHtuLmFyZ3NbMF19YF09bn0pLHRoaXMuYWN0aW9ucy5wdXNoKHthbmltYXRlczpPYmplY3QudmFsdWVzKHRoaXMuY3VycmVudFRyYW5zZm9ybSksb3B0aW9uOnRoaXMuX2dldE9wdGlvbih0KX0pLHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcz1bXSx0aGlzfX1sZXQgcmI9Si5vbmNlKCgpPT57bGV0IGU9WyJtYXRyaXgiLCJtYXRyaXgzZCIsInJvdGF0ZSIsInJvdGF0ZTNkIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwic2NhbGUiLCJzY2FsZTNkIiwic2NhbGVYIiwic2NhbGVZIiwic2NhbGVaIiwic2tldyIsInNrZXdYIiwic2tld1kiLCJ0cmFuc2xhdGUiLCJ0cmFuc2xhdGUzZCIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiJdLHQ9WyJvcGFjaXR5IiwiYmFja2dyb3VuZENvbG9yIl0sbj1bIndpZHRoIiwiaGVpZ2h0IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl07ZS5jb25jYXQodCxuKS5mb3JFYWNoKHI9Pnt0aC5wcm90b3R5cGVbcl09ZnVuY3Rpb24oLi4ubyl7cmV0dXJuIHQuY29uY2F0KG4pLmluY2x1ZGVzKHIpP3RoaXMuX3B1c2hBbmltYXRlcygic3R5bGUiLFt0aGlzLl9jb252ZXJUeXBlKHIpLG4uaW5jbHVkZXMocik/dGhpcy5fZ2V0VmFsdWUob1swXSk6b1swXV0pOnRoaXMuX3B1c2hBbmltYXRlcyhyLG8pLHRoaXN9fSl9KSxpYj1EdChRXyxlPT4ocmIoKSxuZXcgdGgoZSkpLHRiLGViKSxuaD0ib25UYWJCYXJNaWRCdXR0b25UYXAiLG9iPXBuKG5oLCgpPT57fSksYWI9Im9uV2luZG93UmVzaXplIixzYj0ib2ZmV2luZG93UmVzaXplIixsYj1wbihhYiwoKT0+e30pLGNiPVhyKHNiLCgpPT57fSkscmg9InNldExvY2FsZSIsdWI9ImdldExvY2FsZSIsaWg9Im9uTG9jYWxlQ2hhbmdlIixLbD1EdCh1YiwoKT0+e2xldCBlPXd0KHthbGxvd0RlZmF1bHQ6ITB9KTtyZXR1cm4gZSYmZS4kdm0/ZS4kdm0uJGxvY2FsZTphZSgpLmdldExvY2FsZSgpfSksZmI9cG4oaWgsKCk9Pnt9KSxkYj1EdChyaCxlPT57bGV0IHQ9d3QoKTtyZXR1cm4gdCYmdC4kdm0uJGxvY2FsZSE9PWU/KHQuJHZtLiRsb2NhbGU9ZSxJbigpLmZvckVhY2gobz0+e290LnB1Ymxpc2hIYW5kbGVyKHJoLGUsby4kcGFnZS5pZCl9KSxmLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZXRMYW5ndWFnZShlKSxvdC5pbnZva2VPbkNhbGxiYWNrKGloLHtsb2NhbGU6ZX0pLCEwKTohMX0pLGhiPVRlKCJzZXRQYWdlTWV0YSIsKGUse3Jlc29sdmU6dH0pPT57dCh0byhicigpLGUpKX0pLG9oPSJnZXRTZWxlY3RlZFRleHRSYW5nZSIsZ2I9VGUob2gsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57b3QuaW52b2tlVmlld01ldGhvZChvaCx7fSxoYSgpLHI9Pnt0eXBlb2Ygci5lbmQ9PSJ1bmRlZmluZWQiJiZ0eXBlb2Ygci5zdGFydD09InVuZGVmaW5lZCI/bigibm8gZm9jdXNlZCIpOnQocil9KX0pLFRjPXtbSi5PTl9VTkhBTkRMRV9SRUpFQ1RJT05dOltdLFtKLk9OX1BBR0VfTk9UX0ZPVU5EXTpbXSxbSi5PTl9FUlJPUl06W10sW0ouT05fU0hPV106W10sW0ouT05fSElERV06W119O2Z1bmN0aW9uIFpsKGUsdCl7bGV0IG49d3Qoe2FsbG93RGVmYXVsdDohMH0pO2lmKG4mJm4uJHZtKXJldHVybiBobi5pbmplY3RIb29rKGUsdCxuLiR2bS4kKTtUY1tlXS5wdXNoKHQpfWZ1bmN0aW9uIHBiKGUpe09iamVjdC5rZXlzKFRjKS5mb3JFYWNoKHQ9PntUY1t0XS5mb3JFYWNoKG49Pntobi5pbmplY3RIb29rKHQsbixlKX0pfSl9ZnVuY3Rpb24gWGwoZSx0KXtsZXQgbj13dCh7YWxsb3dEZWZhdWx0OiEwfSk7aWYobiYmbi4kdm0pcmV0dXJuIFBhKG4uJHZtLGUsdCk7ei5yZW1vdmUoVGNbZV0sdCl9ZnVuY3Rpb24gdmIoZSl7WmwoSi5PTl9VTkhBTkRMRV9SRUpFQ1RJT04sZSl9ZnVuY3Rpb24gbWIoZSl7WGwoSi5PTl9VTkhBTkRMRV9SRUpFQ1RJT04sZSl9ZnVuY3Rpb24gX2IoZSl7WmwoSi5PTl9QQUdFX05PVF9GT1VORCxlKX1mdW5jdGlvbiBiYihlKXtYbChKLk9OX1BBR0VfTk9UX0ZPVU5ELGUpfWZ1bmN0aW9uIHliKGUpe1psKEouT05fRVJST1IsZSl9ZnVuY3Rpb24gRWIoZSl7WGwoSi5PTl9FUlJPUixlKX1mdW5jdGlvbiBTYihlKXtabChKLk9OX1NIT1csZSl9ZnVuY3Rpb24gd2IoZSl7WGwoSi5PTl9TSE9XLGUpfWZ1bmN0aW9uIENiKGUpe1psKEouT05fSElERSxlKX1mdW5jdGlvbiBBYihlKXtYbChKLk9OX0hJREUsZSl9bGV0IE9iPUR0KCJnZXRFbnRlck9wdGlvbnNTeW5jIiwoKT0+Vm8oKSksVGI9RHQoImdldExhdW5jaE9wdGlvbnNTeW5jIiwoKT0+ZHMoKSksUWwseHUsQnUsYWg7ZnVuY3Rpb24gc2goZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBNdShlKXtpZihlLnR5cGU9PT0iZW5hYmxlZCIpQnU9ITAsYWg9ZS5vZmZsaW5lO2Vsc2UgaWYoZS50eXBlPT09ImNsaWVudElkIilRbD1lLmNpZCx4dT1lLmVyck1zZyxsaChRbCxlLmVyck1zZyk7ZWxzZSBpZihlLnR5cGU9PT0icHVzaE1zZyIpe2xldCB0PXt0eXBlOiJyZWNlaXZlIixkYXRhOnNoKGUubWVzc2FnZSl9O2ZvcihsZXQgbj0wO248T3MubGVuZ3RoJiYoT3Nbbl0odCksIXQuc3RvcHBlZCk7bisrKTt9ZWxzZSBlLnR5cGU9PT0iY2xpY2siJiZPcy5mb3JFYWNoKHQ9Pnt0KHt0eXBlOiJjbGljayIsZGF0YTpzaChlLm1lc3NhZ2UpfSl9KX1sZXQgRHU9W107ZnVuY3Rpb24gbGgoZSx0KXtEdS5mb3JFYWNoKG49PntuKGUsdCl9KSxEdS5sZW5ndGg9MH1sZXQgUGI9VGUoImdldFB1c2hDbGllbnRJZCIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57aWYoYWgpe3MucHVzaC5nZXRDbGllbnRJbmZvQXN5bmMocj0+e3Qoe2NpZDpyLmNsaWVudGlkfSl9LHI9PntuKHIuY29kZSsiOiAiK3IubWVzc2FnZSl9KTtyZXR1cm59UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3R5cGVvZiBCdT09InVuZGVmaW5lZCImJihCdT0hMSxRbD0iIix4dT0idW5pUHVzaCBpcyBub3QgZW5hYmxlZCIpLER1LnB1c2goKHIsbyk9PntyP3Qoe2NpZDpyfSk6bihvKX0pLHR5cGVvZiBRbCE9InVuZGVmaW5lZCImJmxoKFFsLHh1KX0pfSksT3M9W10sY2g9ITEsSWI9ZT0+e09zLmluZGV4T2YoZSk9PT0tMSYmT3MucHVzaChlKSxjaHx8KGNoPSEwLHMucHVzaC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdD0+e011KHt0eXBlOiJjbGljayIsbWVzc2FnZTp0fSl9KSxzLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigicmVjZWl2ZSIsdD0+e011KHt0eXBlOiJwdXNoTXNnIixtZXNzYWdlOnR9KX0pKX0sTmI9ZT0+e2lmKCFlKU9zLmxlbmd0aD0wO2Vsc2V7bGV0IHQ9T3MuaW5kZXhPZihlKTt0Pi0xJiZPcy5zcGxpY2UodCwxKX19LGtiPSJjYW5JVXNlIixSYj1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSx4Yj0iZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsQmI9Im1ha2VQaG9uZUNhbGwiLE1iPXtwaG9uZU51bWJlcjpTdHJpbmd9LERiPSJhZGRQaG9uZUNvbnRhY3QiLExiPXtmb3JtYXRBcmdzOntmaXJzdE5hbWUoZSl7aWYoIWUpcmV0dXJuImFkZFBob25lQ29udGFjdDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLmZpcnN0TmFtZSBzaG91bGQgbm90IGJlIGVtcHR5OyJ9fX0sRmI9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHBob3RvRmlsZVBhdGg6U3RyaW5nLG5pY2tOYW1lOlN0cmluZyxsYXN0TmFtZTpTdHJpbmcsbWlkZGxlTmFtZTpTdHJpbmcscmVtYXJrOlN0cmluZyxtb2JpbGVQaG9uZU51bWJlcjpTdHJpbmcsd2VDaGF0TnVtYmVyOlN0cmluZyxhZGRyZXNzQ291bnRyeTpTdHJpbmcsYWRkcmVzc1N0YXRlOlN0cmluZyxhZGRyZXNzQ2l0eTpTdHJpbmcsYWRkcmVzc1N0cmVldDpTdHJpbmcsYWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLG9yZ2FuaXphdGlvbjpTdHJpbmcsdGl0bGU6U3RyaW5nLHdvcmtGYXhOdW1iZXI6U3RyaW5nLHdvcmtQaG9uZU51bWJlcjpTdHJpbmcsaG9zdE51bWJlcjpTdHJpbmcsZW1haWw6U3RyaW5nLHVybDpTdHJpbmcsd29ya0FkZHJlc3NDb3VudHJ5OlN0cmluZyx3b3JrQWRkcmVzc1N0YXRlOlN0cmluZyx3b3JrQWRkcmVzc0NpdHk6U3RyaW5nLHdvcmtBZGRyZXNzU3RyZWV0OlN0cmluZyx3b3JrQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLGhvbWVGYXhOdW1iZXI6U3RyaW5nLGhvbWVQaG9uZU51bWJlcjpTdHJpbmcsaG9tZUFkZHJlc3NDb3VudHJ5OlN0cmluZyxob21lQWRkcmVzc1N0YXRlOlN0cmluZyxob21lQWRkcmVzc0NpdHk6U3RyaW5nLGhvbWVBZGRyZXNzU3RyZWV0OlN0cmluZyxob21lQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nfSxWYj0iZ2V0Q2xpcGJvYXJkRGF0YSIsVWI9InNldENsaXBib2FyZERhdGEiLCRiPXtmb3JtYXRBcmdzOntzaG93VG9hc3Q6ITB9LGJlZm9yZUludm9rZSgpe3N0KCl9LGJlZm9yZVN1Y2Nlc3MoZSx0KXtpZighdC5zaG93VG9hc3QpcmV0dXJuO2xldHt0Om59PWFlKCkscj1uKCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIik7ciYmUC5zaG93VG9hc3Qoe3RpdGxlOnIsaWNvbjoic3VjY2VzcyIsbWFzazohMX0pfX0sSGI9e2RhdGE6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzaG93VG9hc3Q6e3R5cGU6Qm9vbGVhbn19LHVoPSJvbkFjY2VsZXJvbWV0ZXIiLGpiPSJvZmZBY2NlbGVyb21ldGVyIix6Yj0ic3RhcnRBY2NlbGVyb21ldGVyIixXYj0ic3RvcEFjY2VsZXJvbWV0ZXIiLGZoPSJvbkNvbXBhc3MiLEdiPSJvZmZDb21wYXNzIixZYj0ic3RhcnRDb21wYXNzIixxYj0ic3RvcENvbXBhc3MiLEpiPSJ2aWJyYXRlU2hvcnQiLEtiPSJ2aWJyYXRlTG9uZyIsZGg9Im9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiLGhoPSJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIsZ2g9Im9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIixwaD0ib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIixaYj0ic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IixYYj17c2VydmljZXM6QXJyYXksYWxsb3dEdXBsaWNhdGVzS2V5OkJvb2xlYW4saW50ZXJ2YWw6TnVtYmVyfSxRYj0iZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsZTA9e3NlcnZpY2VzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfX0sdDA9ImNyZWF0ZUJMRUNvbm5lY3Rpb24iLG4wPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxyMD0iY2xvc2VCTEVDb25uZWN0aW9uIixpMD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sbzA9ImdldEJMRURldmljZVNlcnZpY2VzIixhMD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sczA9ImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsbDA9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGMwPSJub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIix1MD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc3RhdGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMH19LGYwPSJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsZDA9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sY2hhcmFjdGVyaXN0aWNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxoMD0id3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIixnMD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sdmFsdWU6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9fSxwMD0ic2V0QkxFTVRVIix2MD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxtdHU6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfX0sbTA9ImdldEJMRURldmljZVJTU0kiLF8wPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSx2aD0ib25CZWFjb25VcGRhdGUiLG1oPSJvbkJlYWNvblNlcnZpY2VDaGFuZ2UiLGIwPSJnZXRCZWFjb25zIix5MD0ic3RhcnRCZWFjb25EaXNjb3ZlcnkiLEUwPXt1dWlkczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH19LFMwPSJzdG9wQmVhY29uRGlzY292ZXJ5Iix3MD0iZ2V0U2NyZWVuQnJpZ2h0bmVzcyIsQzA9InNldFNjcmVlbkJyaWdodG5lc3MiLEEwPSJzZXRLZWVwU2NyZWVuT24iLE8wPSJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb24iLFQwPSJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlIixQMD1bImZpbmdlclByaW50IiwiZmFjaWFsIiwic3BlZWNoIl0sSTA9e2Zvcm1hdEFyZ3M6e2NoZWNrQXV0aE1vZGUoZSx0KXtpZighZXx8IVAwLmluY2x1ZGVzKGUpKXJldHVybiJjaGVja0F1dGhNb2RlIFx1NTg2Qlx1NTE5OVx1OTUxOVx1OEJFRiJ9fX0sTjA9e2NoZWNrQXV0aE1vZGU6U3RyaW5nfSxrMD0ic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uIixSMD17Zm9ybWF0QXJnczp7cmVxdWVzdEF1dGhNb2RlcyhlLHQpe2lmKCFlLmluY2x1ZGVzKCJmaW5nZXJQcmludCIpJiYhZS5pbmNsdWRlcygiZmFjaWFsIikpcmV0dXJuInJlcXVlc3RBdXRoTW9kZXMgXHU1ODZCXHU1MTk5XHU5NTE5XHU4QkVGIn19fSx4MD17cmVxdWVzdEF1dGhNb2Rlczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH0sY2hhbGxlbmdlOlN0cmluZyxhdXRoQ29udGVudDpTdHJpbmd9LEIwPSJzY2FuQ29kZSIsTTA9e29ubHlGcm9tQ2FtZXJhOkJvb2xlYW4sc2NhblR5cGU6QXJyYXksYXV0b0RlY29kZUNoYXJTZXQ6Qm9vbGVhbixzb3VuZDpTdHJpbmcsYXV0b1pvb206Qm9vbGVhbn0sRDA9WyJkZWZhdWx0Iiwibm9uZSJdLEwwPXtmb3JtYXRBcmdzOntzb3VuZChlLHQpe0QwLmluY2x1ZGVzKGUpfHwodC5zb3VuZD0ibm9uZSIpfSxhdXRvWm9vbShlLHQpe3R5cGVvZiBlPT0idW5kZWZpbmVkIiYmKHQuYXV0b1pvb209ITApfX19LEYwPSJnZXRTeXN0ZW1TZXR0aW5nIixWMD0iZ2V0QXBwQXV0aG9yaXplU2V0dGluZyIsVTA9Im9wZW5BcHBBdXRob3JpemVTZXR0aW5nIiwkMD0iZ2V0U3RvcmFnZSIsX2g9e2tleTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxIMD0iZ2V0U3RvcmFnZVN5bmMiLGJoPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLGowPSJzZXRTdG9yYWdlIix6MD17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGF0YTp7cmVxdWlyZWQ6ITB9fSxXMD0ic2V0U3RvcmFnZVN5bmMiLEcwPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImRhdGEiLHJlcXVpcmVkOiEwfV0seWg9InJlbW92ZVN0b3JhZ2UiLFkwPV9oLHEwPWJoLEowPSJzYXZlRmlsZSIsSzA9e2Zvcm1hdEFyZ3M6e3RlbXBGaWxlUGF0aChlLHQpe3QudGVtcEZpbGVQYXRoPWplKGUpfX19LFowPXt0ZW1wRmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sWDA9ImdldFNhdmVkRmlsZUxpc3QiLFEwPSJyZW1vdmVTYXZlZEZpbGUiLGV5PXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9amUoZSl9fX0sdHk9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LG55PSJnZXRGaWxlSW5mbyIscnk9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1qZShlKX19fSxpeT17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sb3k9ImdldFNhdmVkRmlsZUluZm8iLGF5PXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9amUoZSl9fX0sc3k9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGx5PSJvcGVuRG9jdW1lbnQiLGN5PXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9amUoZSl9fX0sdXk9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6U3RyaW5nfSxmeT0iaGlkZUtleWJvYXJkIixkeT0ic2hvd0tleWJvYXJkIixoeT0iY2hvb3NlTG9jYXRpb24iLGd5PXtrZXl3b3JkOlN0cmluZyxsYXRpdHVkZTpOdW1iZXIsbG9uZ2l0dWRlOk51bWJlcn0scHk9ImdldExvY2F0aW9uIixFaD1bIndnczg0IiwiZ2NqMDIiXSx2eT17Zm9ybWF0QXJnczp7dHlwZShlLHQpe2U9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLEVoLmluZGV4T2YoZSk9PT0tMT90LnR5cGU9RWhbMF06dC50eXBlPWV9LGFsdGl0dWRlKGUsdCl7dC5hbHRpdHVkZT1lfHwhMX19fSxteT17dHlwZTpTdHJpbmcsYWx0aXR1ZGU6Qm9vbGVhbn0sX3k9Im9wZW5Mb2NhdGlvbiIsU2g9KGUsdCk9PntpZih0PT09dm9pZCAwKXJldHVybmAke2V9IHNob3VsZCBub3QgYmUgZW1wdHkuYDtpZih0eXBlb2YgdCE9Im51bWJlciIpe2xldCBuPXR5cGVvZiB0O3JldHVybiBuPW5bMF0udG9VcHBlckNhc2UoKStuLnN1YnN0cmluZygxKSxgRXhwZWN0ZWQgTnVtYmVyLCBnb3QgJHtufSB3aXRoIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkodCl9LmB9fSxieT17Zm9ybWF0QXJnczp7bGF0aXR1ZGUoZSx0KXtsZXQgbj1TaCgibGF0aXR1ZGUiLGUpO2lmKG4pcmV0dXJuIG47dC5sYXRpdHVkZT1lfSxsb25naXR1ZGUoZSx0KXtsZXQgbj1TaCgibG9uZ2l0dWRlIixlKTtpZihuKXJldHVybiBuO3QubG9uZ2l0dWRlPWV9LHNjYWxlKGUsdCl7ZT1NYXRoLmZsb29yKGUpLHQuc2NhbGU9ZT49NSYmZTw9MTg/ZToxOH19fSx5eT17bGF0aXR1ZGU6TnVtYmVyLGxvbmdpdHVkZTpOdW1iZXIsc2NhbGU6TnVtYmVyLG5hbWU6U3RyaW5nLGFkZHJlc3M6U3RyaW5nfSxFeT0iY2hvb3NlSW1hZ2UiLFN5PXtmb3JtYXRBcmdzOntjb3VudChlLHQpeyghZXx8ZTw9MCkmJih0LmNvdW50PTkpfSxzaXplVHlwZShlLHQpe3Quc2l6ZVR5cGU9cHIoZSxwaSl9LHNvdXJjZVR5cGUoZSx0KXt0LnNvdXJjZVR5cGU9cHIoZSxxcil9LGV4dGVuc2lvbihlLHQpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSYmZS5sZW5ndGg9PT0wKXJldHVybiJwYXJhbSBleHRlbnNpb24gc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2V8fCh0LmV4dGVuc2lvbj1bIioiXSl9fX0sd3k9e2NvdW50Ok51bWJlcixzaXplVHlwZTpbQXJyYXksU3RyaW5nXSxzb3VyY2VUeXBlOkFycmF5LGV4dGVuc2lvbjpBcnJheX0sQ3k9ImNob29zZVZpZGVvIixBeT17Zm9ybWF0QXJnczp7c291cmNlVHlwZShlLHQpe3Quc291cmNlVHlwZT1wcihlLHFyKX0sY29tcHJlc3NlZDohMCxtYXhEdXJhdGlvbjo2MCxjYW1lcmE6ImJhY2siLGV4dGVuc2lvbihlLHQpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSYmZS5sZW5ndGg9PT0wKXJldHVybiJwYXJhbSBleHRlbnNpb24gc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2V8fCh0LmV4dGVuc2lvbj1bIioiXSl9fX0sT3k9e3NvdXJjZVR5cGU6QXJyYXksY29tcHJlc3NlZDpCb29sZWFuLG1heER1cmF0aW9uOk51bWJlcixjYW1lcmE6U3RyaW5nLGV4dGVuc2lvbjpBcnJheX0sVHk9ImdldEltYWdlSW5mbyIsUHk9e2Zvcm1hdEFyZ3M6e3NyYyhlLHQpe3Quc3JjPWplKGUpfX19LEl5PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sTnk9InByZXZpZXdJbWFnZSIsa3k9e2Zvcm1hdEFyZ3M6e3VybHMoZSx0KXt0LnVybHM9ZS5tYXAobj0+ei5pc1N0cmluZyhuKSYmbj9qZShuKToiIil9LGN1cnJlbnQoZSx0KXt0eXBlb2YgZT09Im51bWJlciI/dC5jdXJyZW50PWU+MCYmZTx0LnVybHMubGVuZ3RoP2U6MDp6LmlzU3RyaW5nKGUpJiZlJiYodC5jdXJyZW50PWplKGUpKX19fSxSeT17dXJsczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH0sY3VycmVudDp7dHlwZTpbTnVtYmVyLFN0cmluZ119fSx4eT0iY2xvc2VQcmV2aWV3SW1hZ2UiLEJ5PSJnZXRWaWRlb0luZm8iLE15PXtmb3JtYXRBcmdzOntzcmMoZSx0KXt0LnNyYz1qZShlKX19fSxEeT17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LEx5PSJzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtIixGeT17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPWplKGUpfX19LFZ5PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxVeT0ic2F2ZVZpZGVvVG9QaG90b3NBbGJ1bSIsJHk9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1qZShlKX19fSxIeT17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sank9ImdldFJlY29yZGVyTWFuYWdlciIsenk9ImNvbXByZXNzSW1hZ2UiLFd5PXtmb3JtYXRBcmdzOntzcmMoZSx0KXt0LnNyYz1qZShlKX19fSxHeT17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFl5PSJjb21wcmVzc1ZpZGVvIixxeT17Zm9ybWF0QXJnczp7c3JjKGUsdCl7dC5zcmM9amUoZSl9fX0sSnk9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHF1YWxpdHk6U3RyaW5nLGJpdHJhdGU6TnVtYmVyLGZwczpOdW1iZXIscmVzb2x1dGlvbjpOdW1iZXJ9LEt5PSJyZXF1ZXN0IixaeT17SlNPTjoianNvbiJ9LFh5PVsidGV4dCIsImFycmF5YnVmZmVyIl0sUXk9InRleHQiLHdoPWVuY29kZVVSSUNvbXBvbmVudDtmdW5jdGlvbiBlRShlLHQpe2xldCBuPWUuc3BsaXQoIiMiKSxyPW5bMV18fCIiO249blswXS5zcGxpdCgiPyIpO2xldCBvPW5bMV18fCIiO2U9blswXTtsZXQgYz1vLnNwbGl0KCImIikuZmlsdGVyKGI9PmIpLGc9e307Yy5mb3JFYWNoKGI9PntsZXQgVj1iLnNwbGl0KCI9Iik7Z1tWWzBdXT1WWzFdfSk7Zm9yKGxldCBiIGluIHQpaWYoei5oYXNPd24odCxiKSl7bGV0IFY9dFtiXTt0eXBlb2YgVj09InVuZGVmaW5lZCJ8fFY9PT1udWxsP1Y9IiI6ei5pc1BsYWluT2JqZWN0KFYpJiYoVj1KU09OLnN0cmluZ2lmeShWKSksZ1t3aChiKV09d2goVil9cmV0dXJuIG89T2JqZWN0LmtleXMoZykubWFwKGI9PmAke2J9PSR7Z1tiXX1gKS5qb2luKCImIiksZSsobz8iPyIrbzoiIikrKHI/IiMiK3I6IiIpfWxldCB0RT17bWV0aG9kOlN0cmluZyxkYXRhOltPYmplY3QsU3RyaW5nLEFycmF5LEFycmF5QnVmZmVyXSx1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6T2JqZWN0LGRhdGFUeXBlOlN0cmluZyxyZXNwb25zZVR5cGU6U3RyaW5nLHdpdGhDcmVkZW50aWFsczpCb29sZWFufSxuRT17Zm9ybWF0QXJnczp7bWV0aG9kKGUsdCl7dC5tZXRob2Q9U24oKGV8fCIiKS50b1VwcGVyQ2FzZSgpLGdyKX0sZGF0YShlLHQpe3QuZGF0YT1lfHwiIn0sdXJsKGUsdCl7dC5tZXRob2Q9PT1nclswXSYmei5pc1BsYWluT2JqZWN0KHQuZGF0YSkmJk9iamVjdC5rZXlzKHQuZGF0YSkubGVuZ3RoJiYodC51cmw9ZUUoZSx0LmRhdGEpKX0saGVhZGVyKGUsdCl7bGV0IG49dC5oZWFkZXI9ZXx8e307dC5tZXRob2QhPT1nclswXSYmKE9iamVjdC5rZXlzKG4pLmZpbmQocj0+ci50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSIpfHwoblsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL2pzb24iKSl9LGRhdGFUeXBlKGUsdCl7dC5kYXRhVHlwZT0oZXx8WnkuSlNPTikudG9Mb3dlckNhc2UoKX0scmVzcG9uc2VUeXBlKGUsdCl7dC5yZXNwb25zZVR5cGU9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLFh5LmluZGV4T2YodC5yZXNwb25zZVR5cGUpPT09LTEmJih0LnJlc3BvbnNlVHlwZT1ReSl9fX0sckU9ImNvbmZpZ01UTFMiLGlFPXtjZXJ0aWZpY2F0ZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9fSxvRT17Zm9ybWF0QXJnczp7Y2VydGlmaWNhdGVzKGUpe2lmKGUuc29tZSh0PT56LnRvUmF3VHlwZSh0Lmhvc3QpIT09IlN0cmluZyIpKXJldHVybiJcdTUzQzJcdTY1NzBcdTkxNERcdTdGNkVcdTk1MTlcdThCRUZcdUZGMENcdThCRjdcdTc4NkVcdThCQTRcdTU0MEVcdTkxQ0RcdThCRDUifX19LGFFPSJkb3dubG9hZEZpbGUiLHNFPXtmb3JtYXRBcmdzOntoZWFkZXIoZSx0KXt0LmhlYWRlcj1lfHx7fX19fSxsRT17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOk9iamVjdCx0aW1lb3V0Ok51bWJlcn0sY0U9InVwbG9hZEZpbGUiLHVFPXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe2UmJih0LmZpbGVQYXRoPWplKGUpKX0saGVhZGVyKGUsdCl7dC5oZWFkZXI9ZXx8e319LGZvcm1EYXRhKGUsdCl7dC5mb3JtRGF0YT1lfHx7fX19fSxmRT17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZXM6QXJyYXksZmlsZVBhdGg6U3RyaW5nLG5hbWU6U3RyaW5nLGhlYWRlcjpPYmplY3QsZm9ybURhdGE6T2JqZWN0LHRpbWVvdXQ6TnVtYmVyfSxkRT0iY29ubmVjdFNvY2tldCIsaEU9e2Zvcm1hdEFyZ3M6e2hlYWRlcihlLHQpe3QuaGVhZGVyPWV8fHt9fSxtZXRob2QoZSx0KXt0Lm1ldGhvZD1TbigoZXx8IiIpLnRvVXBwZXJDYXNlKCksZ3IpfSxwcm90b2NvbHMoZSx0KXt6LmlzU3RyaW5nKGUpJiYodC5wcm90b2NvbHM9W2VdKX19fSxnRT17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOnt0eXBlOk9iamVjdH0sbWV0aG9kOlN0cmluZyxwcm90b2NvbHM6W0FycmF5LFN0cmluZ119LHBFPSJzZW5kU29ja2V0TWVzc2FnZSIsdkU9e2RhdGE6W1N0cmluZyxBcnJheUJ1ZmZlcl19LG1FPSJjbG9zZVNvY2tldCIsX0U9e2NvZGU6TnVtYmVyLHJlYXNvbjpTdHJpbmd9LGJFPSJzdGFydExvY2F0aW9uVXBkYXRlIixDaD0ib25Mb2NhdGlvbkNoYW5nZSIseUU9InN0b3BMb2NhdGlvblVwZGF0ZSIsRUU9Im9mZkxvY2F0aW9uQ2hhbmdlIixTRT0ib2ZmTG9jYXRpb25DaGFuZ2VFcnJvciIsQWg9Im9uTG9jYXRpb25DaGFuZ2VFcnJvciIsT2g9WyJ3Z3M4NCIsImdjajAyIl0sd0U9e3R5cGU6U3RyaW5nfSxDRT17Zm9ybWF0QXJnczp7dHlwZShlLHQpe2U9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLE9oLmluZGV4T2YoZSk9PT0tMT90LnR5cGU9T2hbMV06dC50eXBlPWV9fX07ZnVuY3Rpb24gQUUoZSl7aWYoIXouaXNTdHJpbmcoZSkpcmV0dXJuIGU7bGV0IHQ9ZS5pbmRleE9mKCI/Iik7aWYodD09PS0xKXJldHVybiBlO2xldCBuPWUuc2xpY2UodCsxKS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIik7aWYoIW4pcmV0dXJuIGU7ZT1lLnNsaWNlKDAsdCk7bGV0IHI9W107cmV0dXJuIG4uc3BsaXQoIiYiKS5mb3JFYWNoKG89PntsZXQgYz1vLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLGc9Yy5zaGlmdCgpLGI9Yy5sZW5ndGg+MD9jLmpvaW4oIj0iKToiIjtyLnB1c2goZysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKX0pLHIubGVuZ3RoP2UrIj8iK3Iuam9pbigiJiIpOmV9bGV0IE9FPVsic2xpZGUtaW4tcmlnaHQiLCJzbGlkZS1pbi1sZWZ0Iiwic2xpZGUtaW4tdG9wIiwic2xpZGUtaW4tYm90dG9tIiwiZmFkZS1pbiIsInpvb20tb3V0Iiwiem9vbS1mYWRlLW91dCIsInBvcC1pbiIsIm5vbmUiXSxURT1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLENsPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sTHU9Im5hdmlnYXRlVG8iLEZ1PSJyZWRpcmVjdFRvIixUaD0icmVMYXVuY2giLFBjPSJzd2l0Y2hUYWIiLFBFPSJuYXZpZ2F0ZUJhY2siLFZ1PSJwcmVsb2FkUGFnZSIsUGg9InVuUHJlbG9hZFBhZ2UiLElFPXouZXh0ZW5kKHt9LENsLEloKE9FKSksTkU9ei5leHRlbmQoe2RlbHRhOnt0eXBlOk51bWJlcn19LEloKFRFKSksa0U9Q2wsUkU9Q2wseEU9Q2wsQkU9Q2wsTUU9Q2wsREU9TmMoTHUpLExFPU5jKEZ1KSxGRT1OYyhUaCksVkU9TmMoUGMpLFVFPXtmb3JtYXRBcmdzOntkZWx0YShlLHQpe2U9cGFyc2VJbnQoZSsiIil8fDEsdC5kZWx0YT1NYXRoLm1pbihJbigpLmxlbmd0aC0xLGUpfX19O2Z1bmN0aW9uIEloKGUpe3JldHVybnthbmltYXRpb25UeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3IodCl7aWYodCYmZS5pbmRleE9mKHQpPT09LTEpcmV0dXJuImAiK3QrImAgaXMgbm90IHN1cHBvcnRlZCBmb3IgYGFuaW1hdGlvblR5cGVgIChzdXBwb3J0ZWQgdmFsdWVzIGFyZTogYCIrZS5qb2luKCJgfGAiKSsiYCkifX0sYW5pbWF0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyfX19bGV0IEljO2Z1bmN0aW9uICRFKCl7SWM9IiJ9ZnVuY3Rpb24gTmMoZSl7cmV0dXJue2Zvcm1hdEFyZ3M6e3VybDpIRShlKX0sYmVmb3JlQWxsOiRFfX1mdW5jdGlvbiBIRShlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZighbilyZXR1cm4nTWlzc2luZyByZXF1aXJlZCBhcmdzOiAidXJsIic7bj1NbyhuKTtsZXQgbz1uLnNwbGl0KCI/IilbMF0sYz1XaShvLCEwKTtpZighYylyZXR1cm4icGFnZSBgIituKyJgIGlzIG5vdCBmb3VuZCI7aWYoZT09PUx1fHxlPT09RnUpe2lmKGMubWV0YS5pc1RhYkJhcilyZXR1cm5gY2FuIG5vdCAke2V9IGEgdGFiYmFyIHBhZ2VgfWVsc2UgaWYoZT09PVBjJiYhYy5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90IHN3aXRjaCB0byBuby10YWJCYXIgcGFnZSI7aWYoKGU9PT1QY3x8ZT09PVZ1KSYmYy5tZXRhLmlzVGFiQmFyJiZyLm9wZW5UeXBlIT09ImFwcExhdW5jaCImJihuPW8pLGMubWV0YS5pc0VudHJ5JiYobj1uLnJlcGxhY2UoYy5hbGlhcywiLyIpKSxyLnVybD1BRShuKSxlIT09UGgpe2lmKGU9PT1WdSl7aWYoIWMubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYoYy5tZXRhLmlzVGFiQmFyKXtsZXQgZz1JbigpLGI9Yy5wYXRoLnNsaWNlKDEpO2lmKGcuZmluZChWPT5WLnJvdXRlPT09YikpcmV0dXJuInRhYkJhciBwYWdlIGAiK2IrImAgYWxyZWFkeSBleGlzdHMifXJldHVybn1pZihJYz09PW4mJnIub3BlblR5cGUhPT0iYXBwTGF1bmNoIilyZXR1cm5gJHtJY30gbG9ja2VkYDtSLnJlYWR5JiYoSWM9bil9fX1sZXQgakU9ImhpZGVMb2FkaW5nIix6RT0iaGlkZVRvYXN0IixOaD0ibG9hZEZvbnRGYWNlIixXRT17ZmFtaWx5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc291cmNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzYzpPYmplY3R9LEdFPVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxZRT0ic2V0TmF2aWdhdGlvbkJhckNvbG9yIixxRT17Zm9ybWF0QXJnczp7YW5pbWF0aW9uKGUsdCl7ZXx8KGU9e2R1cmF0aW9uOjAsdGltaW5nRnVuYzoibGluZWFyIn0pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0sSkU9e2Zyb250Q29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcihlKXtpZihHRS5pbmRleE9mKGUpPT09LTEpcmV0dXJuYGludmFsaWQgZnJvbnRDb2xvciAiJHtlfSJgfX0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sYW5pbWF0aW9uOk9iamVjdH0sS0U9InNldE5hdmlnYXRpb25CYXJUaXRsZSIsWkU9e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFhFPSJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmciLFFFPSJoaWRlTmF2aWdhdGlvbkJhckxvYWRpbmciLGtoPSJwYWdlU2Nyb2xsVG8iLGVTPXtzY3JvbGxUb3A6TnVtYmVyLHNlbGVjdG9yOlN0cmluZyxkdXJhdGlvbjpOdW1iZXJ9LHRTPXtmb3JtYXRBcmdzOntkdXJhdGlvbjozMDB9fSxuUz0ic2hvd0FjdGlvblNoZWV0IixyUz17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHRpdGxlOlN0cmluZyxpdGVtQ29sb3I6U3RyaW5nLHBvcG92ZXI6T2JqZWN0fSxpUz17Zm9ybWF0QXJnczp7aXRlbUNvbG9yOiIjMDAwIn19LG9TPSJzaG93TG9hZGluZyIsYVM9e3RpdGxlOlN0cmluZyxtYXNrOkJvb2xlYW59LHNTPXtmb3JtYXRBcmdzOnt0aXRsZToiIixtYXNrOiExfX0sbFM9InNob3dNb2RhbCIsY1M9e3RpdGxlOlN0cmluZyxjb250ZW50OlN0cmluZyxzaG93Q2FuY2VsOkJvb2xlYW4sY2FuY2VsVGV4dDpTdHJpbmcsY2FuY2VsQ29sb3I6U3RyaW5nLGNvbmZpcm1UZXh0OlN0cmluZyxjb25maXJtQ29sb3I6U3RyaW5nfSx1Uz17YmVmb3JlSW52b2tlKCl7WCgpfSxmb3JtYXRBcmdzOnt0aXRsZToiIixjb250ZW50OiIiLHBsYWNlaG9sZGVyVGV4dDoiIixzaG93Q2FuY2VsOiEwLGVkaXRhYmxlOiExLGNhbmNlbFRleHQoZSx0KXtpZighei5oYXNPd24odCwiY2FuY2VsVGV4dCIpKXtsZXR7dDpufT1hZSgpO3QuY2FuY2VsVGV4dD1uKCJ1bmkuc2hvd01vZGFsLmNhbmNlbCIpfX0sY2FuY2VsQ29sb3I6IiMwMDAiLGNvbmZpcm1UZXh0KGUsdCl7aWYoIXouaGFzT3duKHQsImNvbmZpcm1UZXh0Iikpe2xldHt0Om59PWFlKCk7dC5jb25maXJtVGV4dD1uKCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iKX19LGNvbmZpcm1Db2xvcjpKLlBSSU1BUllfQ09MT1J9fSxmUz0ic2hvd1RvYXN0IixkUz1bInN1Y2Nlc3MiLCJsb2FkaW5nIiwibm9uZSIsImVycm9yIl0saFM9e3RpdGxlOlN0cmluZyxpY29uOlN0cmluZyxpbWFnZTpTdHJpbmcsZHVyYXRpb246TnVtYmVyLG1hc2s6Qm9vbGVhbn0sZ1M9e2Zvcm1hdEFyZ3M6e3RpdGxlOiIiLGljb24oZSx0KXt0Lmljb249U24oZSxkUyl9LGltYWdlKGUsdCl7ZT90LmltYWdlPWplKGUpOnQuaW1hZ2U9IiJ9LGR1cmF0aW9uOjE1MDAsbWFzazohMX19LHBTPSJzdGFydFB1bGxEb3duUmVmcmVzaCIsdlM9InN0b3BQdWxsRG93blJlZnJlc2giLGVjPXtpbmRleDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9fSxUcz17YmVmb3JlSW52b2tlKCl7bGV0IGU9aXMoKTtpZihlJiYhZS5pc1RhYkJhcilyZXR1cm4ibm90IFRhYkJhciBwYWdlIn0sZm9ybWF0QXJnczp7aW5kZXgoZSl7aWYoIVIudGFiQmFyLmxpc3RbZV0pcmV0dXJuInRhYmJhciBpdGVtIG5vdCBmb3VuZCJ9fX0sbVM9InNldFRhYkJhckl0ZW0iLF9TPXouZXh0ZW5kKHt0ZXh0OlN0cmluZyxpY29uUGF0aDpTdHJpbmcsc2VsZWN0ZWRJY29uUGF0aDpTdHJpbmcscGFnZVBhdGg6U3RyaW5nfSxlYyksYlM9e2JlZm9yZUludm9rZTpUcy5iZWZvcmVJbnZva2UsZm9ybWF0QXJnczp6LmV4dGVuZCh7cGFnZVBhdGgoZSx0KXtlJiYodC5wYWdlUGF0aD1KLnJlbW92ZUxlYWRpbmdTbGFzaChlKSl9fSxUcy5mb3JtYXRBcmdzKX0seVM9InNldFRhYkJhclN0eWxlIixFUz17Y29sb3I6U3RyaW5nLHNlbGVjdGVkQ29sb3I6U3RyaW5nLGJhY2tncm91bmRDb2xvcjpTdHJpbmcsYmFja2dyb3VuZEltYWdlOlN0cmluZyxiYWNrZ3JvdW5kUmVwZWF0OlN0cmluZyxib3JkZXJTdHlsZTpTdHJpbmd9LFNTPS9eKGxpbmVhcnxyYWRpYWwpLWdyYWRpZW50XCguKz9cKTs/JC8sd1M9e2JlZm9yZUludm9rZTpUcy5iZWZvcmVJbnZva2UsZm9ybWF0QXJnczp7YmFja2dyb3VuZEltYWdlKGUsdCl7ZSYmIVNTLnRlc3QoZSkmJih0LmJhY2tncm91bmRJbWFnZT1qZShlKSl9LGJvcmRlclN0eWxlKGUsdCl7ZSYmKHQuYm9yZGVyU3R5bGU9ZT09PSJ3aGl0ZSI/IndoaXRlIjoiYmxhY2siKX19fSxDUz0iaGlkZVRhYkJhciIsUmg9e2FuaW1hdGlvbjpCb29sZWFufSxBUz0ic2hvd1RhYkJhciIsT1M9UmgsVFM9ImhpZGVUYWJCYXJSZWREb3QiLFBTPWVjLElTPVRzLE5TPSJzaG93VGFiQmFyUmVkRG90IixrUz1lYyxSUz1Ucyx4Uz0icmVtb3ZlVGFiQmFyQmFkZ2UiLEJTPWVjLE1TPVRzLERTPSJzZXRUYWJCYXJCYWRnZSIsTFM9ei5leHRlbmQoe3RleHQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sZWMpLEZTPXtiZWZvcmVJbnZva2U6VHMuYmVmb3JlSW52b2tlLGZvcm1hdEFyZ3M6ei5leHRlbmQoe3RleHQoZSx0KXtKLmdldExlbihlKT49NCYmKHQudGV4dD0iLi4uIil9fSxUcy5mb3JtYXRBcmdzKX0sVlM9ImdldFByb3ZpZGVyIixVUz17c2VydmljZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSwkUz0ibG9naW4iLEhTPXtwcm92aWRlcjpTdHJpbmcsc2NvcGVzOltTdHJpbmcsQXJyYXldLHRpbWVvdXQ6TnVtYmVyLHVuaXZlcmlmeVN0eWxlOk9iamVjdCxvbmx5QXV0aG9yaXplOkJvb2xlYW59LGpTPSJnZXRVc2VySW5mbyIselM9e3Byb3ZpZGVyOlN0cmluZyx3aXRoQ3JlZGVudGlhbHM6Qm9vbGVhbix0aW1lb3V0Ok51bWJlcixsYW5nOlN0cmluZ30sV1M9ImdnZXRVc2VyUHJvZmlsZWdldFVzZXJQcm9maWxlIixHUz17cHJvdmlkZXI6U3RyaW5nLHdpdGhDcmVkZW50aWFsczpCb29sZWFuLHRpbWVvdXQ6TnVtYmVyLGxhbmc6U3RyaW5nfSxZUz0icHJlTG9naW4iLHFTPXtVTklWRVJJRlk6InVuaXZlcmlmeSJ9LEpTPXtmb3JtYXRBcmdzOntwcm92aWRlcihlLHQpe2lmKE9iamVjdC52YWx1ZXMocVMpLmluZGV4T2YoU3RyaW5nKGUpKTwwKXJldHVybiJwcm92aWRlciBlcnJvciJ9fX0sS1M9e3Byb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFpTPSJjbG9zZUF1dGhWaWV3IixYUz0iZ2V0Q2hlY2tCb3hTdGF0ZSIsUVM9ImdldFVuaXZlcmlmeU1hbmFnZXIiLGV3PSJzaGFyZSIseGg9WyJXWFNjZW5lU2Vzc2lvbiIsIldYU2NlbmVUaW1lbGluZSIsIldYU2NlbmVGYXZvcml0ZSJdLHR3PXtmb3JtYXRBcmdzOntzY2VuZShlLHQpe2xldHtwcm92aWRlcjpuLG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OnJ9PXQ7aWYobj09PSJ3ZWl4aW4iJiYhciYmKCFlfHwheGguaW5jbHVkZXMoZSkpKXJldHVybmBcdTUyMDZcdTRFQUJcdTUyMzBcdTVGQUVcdTRGRTFcdTY1RjZcdUZGMENzY2VuZVx1NUZDNVx1OTg3Qlx1NEUzQVx1NEVFNVx1NEUwQlx1NTE3Nlx1NEUyRFx1NEUwMFx1NEUyQVx1RkYxQSR7eGguam9pbigiXHUzMDAxIil9YH0sc3VtbWFyeShlLHQpe2lmKHQudHlwZT09PTEmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTdFQUZcdTY1ODdcdTY3MkNcdTY1RjZcdUZGMENzdW1tYXJ5XHU1RkM1XHU1ODZCIn0saHJlZihlLHQpe2lmKHQudHlwZT09PTAmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTU2RkVcdTY1ODdcdTY1RjZcdUZGMENocmVmXHU1RkM1XHU1ODZCIn0saW1hZ2VVcmwoZSx0KXtpZihbMCwyLDVdLmluY2x1ZGVzKE51bWJlcih0LnR5cGUpKSYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1NTZGRVx1NjU4N1x1MzAwMVx1N0VBRlx1NTZGRVx1NzI0N1x1MzAwMVx1NUMwRlx1N0EwQlx1NUU4Rlx1NjVGNlx1RkYwQ2ltYWdlVXJsXHU1RkM1XHU1ODZCXHVGRjBDXHU2M0E4XHU4MzUwXHU0RjdGXHU3NTI4XHU1QzBGXHU0RThFMjBLYlx1NzY4NFx1NTZGRVx1NzI0NyJ9LG1lZGlhVXJsKGUsdCl7aWYoWzMsNF0uaW5jbHVkZXMoTnVtYmVyKHQudHlwZSkpJiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU5N0YzXHU0RTUwXHUzMDAxXHU4OUM2XHU5ODkxXHU2NUY2XHVGRjBDbWVkaWFVcmxcdTVGQzVcdTU4NkIifSxtaW5pUHJvZ3JhbShlLHQpe2lmKHQudHlwZT09PTUmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTVDMEZcdTdBMEJcdTVFOEZcdTY1RjZcdUZGMENtaW5pUHJvZ3JhbVx1NUZDNVx1NTg2QiJ9LGNvcnBpZChlLHQpe2lmKHQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQmJiFlKXJldHVybiJcdTRGN0ZcdTc1MjhcdTYyNTNcdTVGMDBcdTVCQTJcdTY3MERcdTUyOUZcdTgwRkRcdTY1RjYgY29ycGlkIFx1NUZDNVx1NTg2QiJ9LGN1c3RvbWVyVXJsKGUsdCl7aWYodC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdCYmIWUpcmV0dXJuIlx1NEY3Rlx1NzUyOFx1NjI1M1x1NUYwMFx1NUJBMlx1NjcwRFx1NTI5Rlx1ODBGRFx1NjVGNiBjdXN0b21lclVybCBcdTVGQzVcdTU4NkIifX19LG53PXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHR5cGU6TnVtYmVyLHRpdGxlOlN0cmluZyxzY2VuZTpTdHJpbmcsc3VtbWFyeTpTdHJpbmcsaHJlZjpTdHJpbmcsaW1hZ2VVcmw6U3RyaW5nLG1lZGlhVXJsOlN0cmluZyxtaW5pUHJvZ3JhbTpPYmplY3R9LHJ3PSJzaGFyZVdpdGhTeXN0ZW0iLEJoPVsidGV4dCIsImltYWdlIl0saXc9e2Zvcm1hdEFyZ3M6e3R5cGUoZSx0KXtpZihlJiYhQmguaW5jbHVkZXMoZSkpcmV0dXJuIlx1NTIwNlx1NEVBQlx1NTNDMlx1NjU3MCB0eXBlIFx1NEUwRFx1NkI2M1x1Nzg2RVx1MzAwMlx1NTNFQVx1NjUyRlx1NjMwMXRleHRcdTMwMDFpbWFnZSI7dC50eXBlPVNuKGUsQmgpfX19LG93PXt0eXBlOlN0cmluZyxzdW1tYXJ5OlN0cmluZyxocmVmOlN0cmluZyxpbWFnZVVybDpTdHJpbmd9LGF3PSJyZXF1ZXN0UGF5bWVudCIsc3c9e3Byb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sb3JkZXJJbmZvOnt0eXBlOltTdHJpbmcsT2JqZWN0XSxyZXF1aXJlZDohMH0sdGltZVN0YW1wOlN0cmluZyxub25jZVN0cjpTdHJpbmcscGFja2FnZTpTdHJpbmcsc2lnblR5cGU6U3RyaW5nLHBheVNpZ246U3RyaW5nfSxsdz0iY3JlYXRlUHVzaE1lc3NhZ2UiLGN3PXtmb3JtYXRBcmdzOntjb250ZW50KGUpe2lmKCFlKXJldHVybiJjb250ZW50IGlzIHJlcXVpcmVkIn19fSx1dz0iY3JlYXRlUmV3YXJkZWRWaWRlb0FkIixmdz17Zm9ybWF0QXJnczp7YWRwaWQ6IiIsYWRVbml0SWQ6IiJ9fSxkdz17YWRwaWQ6U3RyaW5nLGFkVW5pdElkOlN0cmluZ30saHc9ImNyZWF0ZUZ1bGxTY3JlZW5WaWRlb0FkIixndz17Zm9ybWF0QXJnczp7YWRwaWQ6IiJ9fSxwdz17YWRwaWQ6U3RyaW5nfSx2dz0iY3JlYXRlSW50ZXJzdGl0aWFsQWQiLG13PXtmb3JtYXRBcmdzOnthZHBpZDoiIixhZFVuaXRJZDoiIn19LF93PXthZHBpZDpTdHJpbmcsYWRVbml0SWQ6U3RyaW5nfSxidz0iY3JlYXRlSW50ZXJhY3RpdmVBZCIseXc9e2Zvcm1hdEFyZ3M6e2FkcGlkKGUsdCl7aWYoIWUpcmV0dXJuImFkcGlkIHNob3VsZCBub3QgYmUgZW1wdHkuIjtlJiYodC5hZHBpZD1lKX0scHJvdmlkZXIoZSx0KXtpZighZSlyZXR1cm4icHJvdmlkZXIgc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2UmJih0LnByb3ZpZGVyPWUpfX19LEV3PXthZHBpZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHByb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19O2Z1bmN0aW9uIFhzKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe2RlbGV0ZSByLmNvZGUsZGVsZXRlIHIubWVzc2FnZSx6LmlzRnVuY3Rpb24odCkmJihyPXQocikpLGUocil9fWZ1bmN0aW9uIGRyKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3I9cnx8e30sdD1yLm1lc3NhZ2V8fHR8fCIiLGRlbGV0ZSByLm1lc3NhZ2UsZSh0LHouZXh0ZW5kKHtjb2RlOjB9LHIpKX19ZnVuY3Rpb24gQWwoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtlKCkoZnVuY3Rpb24ocil7ciYmKGRlbGV0ZSByLmNvZGUsZGVsZXRlIHIubWVzc2FnZSksb3QuaW52b2tlT25DYWxsYmFjayh0LHIpfSl9fWZ1bmN0aW9uIGZpKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocix7cmVzb2x2ZTpvLHJlamVjdDpjfSl7ZSgpKHouZXh0ZW5kKHt9LHouaXNGdW5jdGlvbih0KT90KHIpOnIse3N1Y2Nlc3M6WHMobyxuKSxmYWlsOmRyKGMpfSkpfX1mdW5jdGlvbiB0YyhlPSIiKXtpZighKFIudGFiQmFyJiZ6LmlzQXJyYXkoUi50YWJCYXIubGlzdCkpKXJldHVybiExO3RyeXtpZighZSl7bGV0IG49SW4oKTtpZighbi5sZW5ndGgpcmV0dXJuITE7bGV0IHI9bltuLmxlbmd0aC0xXTtyZXR1cm4gcj9yLiRwYWdlLm1ldGEuaXNUYWJCYXI6ITF9L15cLy8udGVzdChlKXx8KGU9Si5hZGRMZWFkaW5nU2xhc2goZSkpO2xldCB0PVdpKGUpO3JldHVybiB0JiZ0Lm1ldGEuaXNUYWJCYXJ9Y2F0Y2godCl7fXJldHVybiExfWxldCB5YT0iX19UWVBFIixTdz0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24gVXUoZSl7bGV0IHQ9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl07dHJ5e2xldCBuPXouaXNTdHJpbmcoZSk/SlNPTi5wYXJzZShlKTplLHI9bi50eXBlO2lmKHQuaW5kZXhPZihyKT49MCl7bGV0IG89T2JqZWN0LmtleXMobik7aWYoby5sZW5ndGg9PT0yJiYiZGF0YSJpbiBuKXtpZih0eXBlb2Ygbi5kYXRhPT09cilyZXR1cm4gbi5kYXRhO2lmKHI9PT0ib2JqZWN0IiYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KG4uZGF0YSkpcmV0dXJuIG5ldyBEYXRlKG4uZGF0YSl9ZWxzZSBpZihvLmxlbmd0aD09PTEpcmV0dXJuIiJ9fWNhdGNoKG4pe319bGV0IHd3PUR0KFcwLChlLHQpPT57bGV0IG49dHlwZW9mIHQscj1uPT09InN0cmluZyI/dDpKU09OLnN0cmluZ2lmeSh7dHlwZTpuLGRhdGE6dH0pO3RyeXtuPT09InN0cmluZyImJlV1KHIpIT09dm9pZCAwP3Muc3RvcmFnZS5zZXRJdGVtKGUreWEsbik6cy5zdG9yYWdlLnJlbW92ZUl0ZW0oZSt5YSkscy5zdG9yYWdlLnNldEl0ZW0oZSxyKX1jYXRjaChvKXt9fSxHMCksQ3c9VGUoajAsKHtrZXk6ZSxkYXRhOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBvPXR5cGVvZiB0LGM9bz09PSJzdHJpbmciP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6byxkYXRhOnR9KTt0cnl7bGV0IGc9cy5zdG9yYWdlO289PT0ic3RyaW5nIiYmVXUoYykhPT12b2lkIDA/Zy5zZXRJdGVtQXN5bmMoZSt5YSxvLCgpPT57fSk6Zy5yZW1vdmVJdGVtQXN5bmMoZSt5YSwoKT0+e30pLGcuc2V0SXRlbUFzeW5jKGUsYyxuLGRyKHIpKX1jYXRjaChnKXtyKGcubWVzc2FnZSl9fSx6MCk7ZnVuY3Rpb24gJHUoZSx0KXtsZXQgbj10O2lmKGUhPT0ic3RyaW5nInx8ZT09PSJzdHJpbmciJiZ0PT09J3sidHlwZSI6InVuZGVmaW5lZCJ9Jyl0cnl7bGV0IHI9SlNPTi5wYXJzZSh0KSxvPVV1KHIpO2lmKG8hPT12b2lkIDApbj1vO2Vsc2UgaWYoZSYmKG49cix6LmlzU3RyaW5nKHIpKSl7cj1KU09OLnBhcnNlKHIpO2xldCBjPXR5cGVvZiByO2M9PT0ibnVtYmVyIiYmZT09PSJkYXRlIj9uPW5ldyBEYXRlKHIpOmM9PT0oWyJudWxsIiwiYXJyYXkiXS5pbmRleE9mKGUpPDA/ZToib2JqZWN0IikmJihuPXIpfX1jYXRjaChyKXt9cmV0dXJuIG59bGV0IEF3PUR0KEgwLGU9PntsZXQgdD1zLnN0b3JhZ2UuZ2V0SXRlbShlKSxyPShzLnN0b3JhZ2UuZ2V0SXRlbShlK3lhKXx8IiIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHouaXNTdHJpbmcodCk/JHUocix0KToiIn0sYmgpLE93PVRlKCQwLCh7a2V5OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPXMuc3RvcmFnZTtyLmdldEl0ZW1Bc3luYyhlLGZ1bmN0aW9uKG8pe3IuZ2V0SXRlbUFzeW5jKGUreWEsZnVuY3Rpb24oYyl7bGV0IGI9KGMuZGF0YXx8IiIpLnRvTG93ZXJDYXNlKCk7dCh7ZGF0YTokdShiLG8uZGF0YSl9KX0sZnVuY3Rpb24oKXt0KHtkYXRhOiR1KCIiLG8uZGF0YSl9KX0pfSxkcihuKSl9LF9oKSxUdz1EdCh5aCxlPT57cy5zdG9yYWdlLnJlbW92ZUl0ZW0oZSt5YSkscy5zdG9yYWdlLnJlbW92ZUl0ZW0oZSl9LHEwKSxQdz1UZSh5aCwoe2tleTplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntzLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKGUreWEsKCk9Pnt9KSxzLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKGUsdCxkcihuKSl9LFkwKSxJdz1EdCgiY2xlYXJTdG9yYWdlU3luYyIsKCk9PntzLnN0b3JhZ2UuY2xlYXIoKX0pLE53PVRlKCJjbGVhclN0b3JhZ2UiLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3Muc3RvcmFnZS5jbGVhckFzeW5jKHQsZHIobikpfSksTWg9RHQoImdldFN0b3JhZ2VJbmZvU3luYyIsKCk9PntsZXQgZT1zLnN0b3JhZ2UuZ2V0TGVuZ3RoKCl8fDAsdD1bXSxuPTA7Zm9yKGxldCByPTA7cjxlO3IrKyl7bGV0IG89cy5zdG9yYWdlLmtleShyKTtpZihvIT09U3cmJihvLmluZGV4T2YoeWEpPDB8fG8uaW5kZXhPZih5YSkreWEubGVuZ3RoIT09by5sZW5ndGgpKXtsZXQgYz1zLnN0b3JhZ2UuZ2V0SXRlbShvKTtuKz1vLmxlbmd0aCtjLmxlbmd0aCx0LnB1c2gobyl9fXJldHVybntrZXlzOnQsY3VycmVudFNpemU6TWF0aC5jZWlsKG4qMi8xMDI0KSxsaW1pdFNpemU6TnVtYmVyLk1BWF9WQUxVRX19KSxrdz1UZSgiZ2V0U3RvcmFnZUluZm8iLChlLHtyZXNvbHZlOnR9KT0+e3QoTWgoKSl9KSxSdz1UZShueSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntzLmlvLmdldEZpbGVJbmZvKHouZXh0ZW5kKGUse3N1Y2Nlc3M6WHModCksZmFpbDpkcihuKX0pKX0saXkscnkpLHh3PTAsRGg9InVuaWFwcF9zYXZlIixCdz1gX2RvYy8ke0RofWA7ZnVuY3Rpb24gTXcoZSx0KXt0PXR8fGZ1bmN0aW9uKCl7fSxzLmlvLnJlcXVlc3RGaWxlU3lzdGVtKHMuaW8uUFJJVkFURV9ET0Msbj0+e24ucm9vdC5nZXREaXJlY3RvcnkoRGgse2NyZWF0ZTohMH0sZSx0KX0sdCl9bGV0IER3PVRlKEowLCh7dGVtcEZpbGVQYXRoOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWRyKG4pLG89YCR7RGF0ZS5ub3coKX0ke3h3Kyt9JHtZYShlKX1gO3MuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChlLGM9PntNdyhnPT57Yy5jb3B5VG8oZyxvLCgpPT57bGV0IGI9QncrIi8iK287dCh7c2F2ZWRGaWxlUGF0aDpifSl9LHIpfSxyKX0scil9LFowLEswKSxMdz0idW5pYXBwX3NhdmUiO2Z1bmN0aW9uIEZ3KGUsdCl7dD10fHxmdW5jdGlvbigpe30scy5pby5yZXF1ZXN0RmlsZVN5c3RlbShzLmlvLlBSSVZBVEVfRE9DLG49PntuLnJvb3QuZ2V0RGlyZWN0b3J5KEx3LHtjcmVhdGU6ITB9LGUsdCl9LHQpfWxldCBWdz1UZShYMCwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1kcihuKTtGdyhvPT57dmFyIGM9by5jcmVhdGVSZWFkZXIoKSxnPVtdO2MucmVhZEVudHJpZXMoYj0+e2ImJmIubGVuZ3RoP2IuZm9yRWFjaChWPT57Vi5nZXRNZXRhZGF0YShUPT57Zy5wdXNoKHtmaWxlUGF0aDpzLmlvLmNvbnZlcnRBYnNvbHV0ZUZpbGVTeXN0ZW0oVi5mdWxsUGF0aCksY3JlYXRlVGltZTpULm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6VC5zaXplfSksZy5sZW5ndGg9PT1iLmxlbmd0aCYmdCh7ZmlsZUxpc3Q6Z30pfSxyLCExKX0pOnQoe2ZpbGVMaXN0Omd9KX0scil9LHIpfSksVXc9VGUob3ksKHtmaWxlUGF0aDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1kcihuKTtzLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwoZSxvPT57by5nZXRNZXRhZGF0YShjPT57dCh7Y3JlYXRlVGltZTpjLm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6Yy5zaXplfSl9LHIsITEpfSxyKX0sc3ksYXkpLCR3PVRlKFEwLCh7ZmlsZVBhdGg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZHIobik7cy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUsbz0+e28ucmVtb3ZlKCgpPT57dCgpfSxyKX0scil9LHR5LGV5KSxIdz1UZShseSwoe2ZpbGVQYXRoOmUsZmlsZVR5cGU6dH0se3Jlc29sdmU6bixyZWplY3Q6cn0pPT57bGV0IG89ZHIocik7cy5ydW50aW1lLm9wZW5Eb2N1bWVudChqZShlKSx2b2lkIDAsbixvKX0sdXksY3kpLGp3PUR0KGtiLGU9PiEhei5oYXNPd24oUCxlKSxSYiksbmMsTGg9cy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU7ZnVuY3Rpb24gencoZSl7TGg9ZX1mdW5jdGlvbiBGaChlKXtuYz1lLExoKGUpfXMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlPUZoO2Z1bmN0aW9uIEJhKGUpe2lmKCFlKXtsZXQgdD13aSgpO2lmKCF0fHwoZT10LiRwYWdlLnN0YXR1c0JhclN0eWxlLCFlfHxlPT09bmMpKXJldHVybn1lIT09bmMmJihuYz1lLHMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKGUpKX1mdW5jdGlvbiBWaChlKXtvdC5vbihKLk9OX1RIRU1FX0NIQU5HRSxlKX1mdW5jdGlvbiBXdyhlKXtvdC5vZmYoSi5PTl9USEVNRV9DSEFOR0UsZSl9ZnVuY3Rpb24gR3coKXtyZXR1cm4gVWgoKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIn1mdW5jdGlvbiBVaCgpe3JldHVybiBzLm5hdmlnYXRvci5nZXRVSVN0eWxlKCl9ZnVuY3Rpb24gWXcoKXtpZihSLmRhcmttb2RlKXtsZXQgZT1HdygpO0JhKGUpLEhuKCkuZm9yRWFjaChuPT57bi4kcGFnZS5zdGF0dXNCYXJTdHlsZT1lfSl9fWZ1bmN0aW9uIEh1KGUpe2lmKFIuZGFya21vZGUpe2xldCB0PXt9LG49cy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpLHI9aWMoKTtyZXR1cm4gciYmci5ob3N0VGhlbWUmJihuPXIuaG9zdFRoZW1lKSx0PUoubm9ybWFsaXplU3R5bGVzKGUsUi50aGVtZUNvbmZpZyxuKSx0fXJldHVybiBlfWZ1bmN0aW9uIHF3KGUsdCl7aWYoUi5kYXJrbW9kZSl7bGV0IG49KCk9PntsZXR7bGlzdDpyPVtdLGNvbG9yOm8sc2VsZWN0ZWRDb2xvcjpjLGJhY2tncm91bmRDb2xvcjpnLGJvcmRlclN0eWxlOmJ9PUh1KHQpO2UmJmUuc2V0VGFiQmFyU3R5bGUoe2NvbG9yOm8sc2VsZWN0ZWRDb2xvcjpjLGJhY2tncm91bmRDb2xvcjpnLGJvcmRlclN0eWxlOmJ9KSxlJiZlLnNldFRhYkJhckl0ZW1zKHtsaXN0OnIubWFwKFY9Pih7aWNvblBhdGg6Vi5pY29uUGF0aCxzZWxlY3RlZEljb25QYXRoOlYuc2VsZWN0ZWRJY29uUGF0aCx2aXNpYmxlOlYudmlzaWJsZX0pKX0pfTtuKCksVmgobil9fWZ1bmN0aW9uICRoKGUsdCl7aWYoUi5kYXJrbW9kZSl7bGV0IG49KCk9PntsZXQgcj10KCk7ci5hbmltYXRpb25BbHBoYUJHQ29sb3Isci5iYWNrZ3JvdW5kLHIuYmFja2dyb3VuZENvbG9yQm90dG9tLHIuYmFja2dyb3VuZENvbG9yVG9wO3ZhciBvPXIudGl0bGVOVmlldzt0eXBlb2YgbyE9InVuZGVmaW5lZCImJnR5cGVvZiBvPT0ib2JqZWN0IiYmKG8uYmFja2dyb3VuZENvbG9yLG8udGl0bGVDb2xvciksZSYmZS5zZXRTdHlsZShyKX07VmgobiksZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9Pld3KG4pKX19bGV0IHJjLGp1PSEwLGlyO2Z1bmN0aW9uIEp3KGUsdCxuKXshaXJ8fChlPT09Im5vbmUiPyhpci5oaWRlVGFiQmFyUmVkRG90KHtpbmRleDp0fSksaXIucmVtb3ZlVGFiQmFyQmFkZ2Uoe2luZGV4OnR9KSk6ZT09PSJ0ZXh0Ij9pci5zZXRUYWJCYXJCYWRnZSh7aW5kZXg6dCx0ZXh0Om59KTplPT09InJlZERvdCImJmlyLnNob3dUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSl9ZnVuY3Rpb24gS3coZSl7aXImJmlyLnNldFRhYkJhckl0ZW1zKGUpfWZ1bmN0aW9uIFp3KGUsdCxuLHIsbyxjKXtsZXQgZz17aW5kZXg6ZX07aWYodCE9PXZvaWQgMCYmKGcudGV4dD10KSxuJiYoZy5pY29uUGF0aD1qZShuKSksciYmKGcuc2VsZWN0ZWRJY29uUGF0aD1qZShyKSksYyE9PXZvaWQgMCYmKGcuaWNvbmZvbnQ9YyksbyE9PXZvaWQgMCl7Zy52aXNpYmxlPXJjLmxpc3RbZV0udmlzaWJsZT1vLGRlbGV0ZSBnLmluZGV4O2xldCBiPXJjLmxpc3QubWFwKFY9Pih7dmlzaWJsZTpWLnZpc2libGV9KSk7YltlXT1nLEt3KHtsaXN0OmJ9KX1lbHNlIGlyJiZpci5zZXRUYWJCYXJJdGVtKGcpfWZ1bmN0aW9uIFh3KGUpe2lyJiZpci5zZXRUYWJCYXJTdHlsZShlKX1mdW5jdGlvbiBRdyhlKXtqdT0hMSxpciYmaXIuaGlkZVRhYkJhcih7YW5pbWF0aW9uOmV9KX1mdW5jdGlvbiBlQyhlKXtqdT0hMCxpciYmaXIuc2hvd1RhYkJhcih7YW5pbWF0aW9uOmV9KX1sZXQga2M9W107dmFyIGRpPXtpZDoiMCIsaW5pdChlLHQpe2UmJmUubGlzdC5sZW5ndGgmJihyYz1lKTt0cnl7aXI9Zi5yZXF1aXJlTW9kdWxlKCJ1bmktdGFidmlldyIpfWNhdGNoKG4pe2NvbnNvbGUubG9nKGB1bmkucmVxdWlyZU5hdGl2ZVBsdWdpbigidW5pLXRhYnZpZXciKSBlcnJvciAke259YCl9aXIub25NYXNrQ2xpY2soKCk9PntrYy5mb3JFYWNoKG49PntuKCl9KX0pLGlyJiZpci5vbkNsaWNrKCh7aW5kZXg6bn0pPT57dChyYy5saXN0W25dLG4pfSksaXImJmlyLm9uTWlkQnV0dG9uQ2xpY2soKCk9Pm90Lmludm9rZU9uQ2FsbGJhY2sobmgpKSxxdyhpcixlKX0saW5kZXhPZihlKXtsZXQgdD10aGlzLmNvbmZpZyxuPXQmJnQubGlzdCYmdC5saXN0Lmxlbmd0aDtpZihuKXtmb3IobGV0IHI9MDtyPG47cisrKWlmKHQubGlzdFtyXS5wYWdlUGF0aD09PWV8fHQubGlzdFtyXS5wYWdlUGF0aD09PWAke2V9Lmh0bWxgKXJldHVybiByfXJldHVybi0xfSxzd2l0Y2hUYWIoZSl7bGV0IHQ9dGhpcy5pbmRleE9mKGUpO3JldHVybiB0Pj0wPyhpciYmaXIuc3dpdGNoU2VsZWN0KHtpbmRleDp0fSksITApOiExfSxzZXRUYWJCYXJCYWRnZTpKdyxzZXRUYWJCYXJJdGVtOlp3LHNldFRhYkJhclN0eWxlOlh3LGhpZGVUYWJCYXI6UXcsc2hvd1RhYkJhcjplQyxhcHBlbmQoZSl7aXImJmlyLmFwcGVuZCh7aWQ6ZS5pZH0sKHtjb2RlOnR9KT0+e3QhPT0wJiZOKCgpPT57dGhpcy5hcHBlbmQoZSl9LDIwKX0pfSxnZXQgY29uZmlnKCl7cmV0dXJuIHJjfHxSLnRhYkJhcn0sZ2V0IHZpc2libGUoKXtyZXR1cm4ganV9LGdldCBoZWlnaHQoKXtsZXQgZT10aGlzLmNvbmZpZztyZXR1cm4oZSYmZS5oZWlnaHQ/cGFyc2VGbG9hdChlLmhlaWdodCk6Si5UQUJCQVJfSEVJR0hUKStzLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLmRldmljZUJvdHRvbX0sZ2V0IGNvdmVyKCl7bGV0IGU9dGhpcy5jb25maWc7cmV0dXJuIGUmJlsiZXh0cmFsaWdodCIsImxpZ2h0IiwiZGFyayJdLmluZGV4T2YoZS5ibHVyRWZmZWN0KT49MH0sc2V0U3R5bGUoe21hc2s6ZX0pe2lyLnNldE1hc2soe2NvbG9yOmV9KX0sYWRkRXZlbnRMaXN0ZW5lcihlLHQpe2tjLnB1c2godCl9LHJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgbj1rYy5pbmRleE9mKHQpO2tjLnNwbGljZShuLDEpfX07ZnVuY3Rpb24gUmMoKXtsZXQgZT13aSgpO3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpudWxsfWZ1bmN0aW9uIEhoKGUpe3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpSYygpfWxldCBqaD1udWxsO2Z1bmN0aW9uIHpoKCl7cmV0dXJuIGpofWZ1bmN0aW9uIHp1KGUpe2poPWV9ZnVuY3Rpb24gV3UoKXtyZXR1cm4gcy5uYXZpZ2F0b3IuaXNJbW1lcnNlZFN0YXR1c2JhcigpP01hdGgucm91bmQocy5vcy5uYW1lPT09ImlPUyI/cy5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS50b3A6cy5uYXZpZ2F0b3IuZ2V0U3RhdHVzYmFySGVpZ2h0KCkpOjB9ZnVuY3Rpb24gV2goKXtsZXQgZT1zLm5hdmlnYXRvci5nZXRTdGF0dXNCYXJTdHlsZSgpO3JldHVybiBlPT09IlVJU3RhdHVzQmFyU3R5bGVCbGFja1RyYW5zbHVjZW50Inx8ZT09PSJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUifHxlPT09Im51bGwiP2U9ImxpZ2h0IjplPT09IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0IiYmKGU9ImRhcmsiKSxlfWZ1bmN0aW9uIHRDKCl7bGV0e3Jlc29sdXRpb25XaWR0aDplLHJlc29sdXRpb25IZWlnaHQ6dH09cy5zY3JlZW4uZ2V0Q3VycmVudFNpemUoKXx8e3Jlc29sdXRpb25XaWR0aDowLHJlc29sdXRpb25IZWlnaHQ6MH07cmV0dXJue3NjcmVlbldpZHRoOk1hdGgucm91bmQoZSksc2NyZWVuSGVpZ2h0Ok1hdGgucm91bmQodCl9fWxldCBHaD1EdCgiZ2V0V2luZG93SW5mbyIsKCk9PntsZXQgZT1zLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJpb3MiLHtzY3JlZW5XaWR0aDp0LHNjcmVlbkhlaWdodDpufT10QygpLHI9V3UoKSxvLGM9e2hlaWdodDowLGNvdmVyOiExfSxnPVJjKCk7aWYoZyl7bGV0IGZ0PWcuZ2V0U3R5bGUoKSxodD1mdCYmZnQudGl0bGVOVmlldztodCYmaHQudHlwZSYmaHQudHlwZSE9PSJub25lIiYmKGMuaGVpZ2h0PWh0LnR5cGU9PT0idHJhbnNwYXJlbnQiPzA6citKLk5BVkJBUl9IRUlHSFQsYy5jb3Zlcj1odC50eXBlPT09InRyYW5zcGFyZW50Inx8aHQudHlwZT09PSJmbG9hdCIpLG89Zy5nZXRTYWZlQXJlYUluc2V0cygpfWVsc2Ugbz1zLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpO2xldCBiPXtoZWlnaHQ6MCxjb3ZlcjohMX07dGMoKSYmKGIuaGVpZ2h0PWRpLnZpc2libGU/ZGkuaGVpZ2h0OjAsYi5jb3Zlcj1kaS5jb3Zlcik7bGV0IFY9Yy5jb3Zlcj9jLmhlaWdodDowLFQ9Yi5jb3Zlcj9iLmhlaWdodDowLEw9bi1jLmhlaWdodC1iLmhlaWdodCxfZT1uLShjLmNvdmVyPzA6Yy5oZWlnaHQpLShiLmNvdmVyPzA6Yi5oZWlnaHQpLHdlPXQ7KCFiLmhlaWdodHx8Yi5jb3ZlcikmJiFvLmJvdHRvbSYmby5kZXZpY2VCb3R0b20mJihMLT1vLmRldmljZUJvdHRvbSxfZS09by5kZXZpY2VCb3R0b20pLG89ZT9vOntsZWZ0OjAscmlnaHQ6MCx0b3A6Yy5oZWlnaHQmJiFjLmNvdmVyPzA6cixib3R0b206MH07bGV0IFBlPXtsZWZ0Om8ubGVmdCxyaWdodDp3ZS1vLnJpZ2h0LHRvcDpvLnRvcCxib3R0b206X2Utby5ib3R0b20sd2lkdGg6d2Utby5sZWZ0LW8ucmlnaHQsaGVpZ2h0Ol9lLW8udG9wLW8uYm90dG9tfTtyZXR1cm57cGl4ZWxSYXRpbzpzLnNjcmVlbi5zY2FsZSxzY3JlZW5XaWR0aDp0LHNjcmVlbkhlaWdodDpuLHdpbmRvd1dpZHRoOndlLHdpbmRvd0hlaWdodDpMLHN0YXR1c0JhckhlaWdodDpyLHNhZmVBcmVhOlBlLHNhZmVBcmVhSW5zZXRzOnt0b3A6by50b3AscmlnaHQ6by5yaWdodCxib3R0b206by5ib3R0b20sbGVmdDpvLmxlZnR9LHdpbmRvd1RvcDpWLHdpbmRvd0JvdHRvbTpULHNjcmVlblRvcDpuLUx9fSksRWEseGM9ITA7ZnVuY3Rpb24gaWMoKXtpZigheGMpcmV0dXJuO2xldHtnZXRTeXN0ZW1JbmZvU3luYzplfT1mLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtpZihFYT1lKCksei5pc1N0cmluZyhFYSkpdHJ5e0VhPUpTT04ucGFyc2UoRWEpfWNhdGNoKHQpe31yZXR1cm4gRWF9bGV0IFloPUR0KCJnZXREZXZpY2VJbmZvIiwoKT0+e2ljKCk7bGV0e2RldmljZUJyYW5kOmU9IiIsZGV2aWNlTW9kZWw6dCxvc05hbWU6bixvc1ZlcnNpb246cixkZXZpY2VPcmllbnRhdGlvbjpvLGRldmljZVR5cGU6YyxkZXZpY2VJZDpnfT1FYSxiPWUudG9Mb3dlckNhc2UoKSxWPW4udG9Mb3dlckNhc2UoKTtyZXR1cm57YnJhbmQ6YixkZXZpY2VCcmFuZDpiLGRldmljZU1vZGVsOnQsZGV2aWNlUGl4ZWxSYXRpbzpzLnNjcmVlbi5zY2FsZSxkZXZpY2VJZDpnLGRldmljZU9yaWVudGF0aW9uOm8sZGV2aWNlVHlwZTpjLG1vZGVsOnQscGxhdGZvcm06VixzeXN0ZW06YCR7Vj09PSJpb3MiPyJpT1MiOiJBbmRyb2lkIn0gJHtyfWB9fSkscWg9RHQoImdldEFwcEJhc2VJbmZvIiwoKT0+e2ljKCk7bGV0e2hvc3RQYWNrYWdlTmFtZTplLGhvc3ROYW1lOnQsaG9zdFZlcnNpb246bixob3N0TGFuZ3VhZ2U6cixvc0xhbmd1YWdlOm8saG9zdFRoZW1lOmMsYXBwSWQ6ZyxhcHBOYW1lOmIsYXBwVmVyc2lvbjpWLGFwcFZlcnNpb25Db2RlOlQsYXBwV2d0VmVyc2lvbjpMfT1FYTtyZXR1cm57YXBwSWQ6ZyxhcHBOYW1lOmIsYXBwVmVyc2lvbjpWLGFwcFZlcnNpb25Db2RlOlQsYXBwV2d0VmVyc2lvbjpMLGFwcExhbmd1YWdlOktsP0tsKCk6byxlbmFibGVEZWJ1ZzohMSxob3N0UGFja2FnZU5hbWU6ZSxob3N0TmFtZTp0LGhvc3RWZXJzaW9uOm4saG9zdExhbmd1YWdlOnIsaG9zdFRoZW1lOmMsaG9zdEZvbnRTaXplU2V0dGluZzp2b2lkIDAsaG9zdFNES1ZlcnNpb246dm9pZCAwLGxhbmd1YWdlOm8sU0RLVmVyc2lvbjoiIix0aGVtZTpVaCgpLHZlcnNpb246cy5ydW50aW1lLmlubmVyVmVyc2lvbn19KSxKaD1EdCgiZ2V0U3lzdGVtSW5mb1N5bmMiLCgpPT57eGM9ITAsaWMoKSx4Yz0hMTtsZXQgZT1HaCgpLHQ9WWgoKSxuPXFoKCk7eGM9ITA7bGV0IHI9e2ZvbnRTaXplU2V0dGluZzpuLmhvc3RGb250U2l6ZVNldHRpbmcsb3NOYW1lOkVhLm9zTmFtZS50b0xvd2VyQ2FzZSgpfTtFYS5ob3N0TmFtZSYmKHIuaG9zdFNES1ZlcnNpb249RWEudW5pUnVudGltZVZlcnNpb24pO2xldCBvPXouZXh0ZW5kKEVhLGUsdCxuLHIpO3JldHVybiBkZWxldGUgby5zY3JlZW5Ub3AsZGVsZXRlIG8uZW5hYmxlRGVidWcsUi5kYXJrbW9kZXx8ZGVsZXRlIG8udGhlbWUsSi5zb3J0T2JqZWN0KG8pfSksbkM9VGUoImdldFN5c3RlbUluZm8iLChlLHtyZXNvbHZlOnR9KT0+dChKaCgpKSksT2w9bnVsbCxyQz1wbihmaCwoKT0+e0toKCl9KSxpQz1YcihHYiwoKT0+e1poKCl9KSxLaD1UZShZYiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntPbHx8KE9sPXMub3JpZW50YXRpb24ud2F0Y2hPcmllbnRhdGlvbihyPT57b3QuaW52b2tlT25DYWxsYmFjayhmaCx7ZGlyZWN0aW9uOnIubWFnbmV0aWNIZWFkaW5nfSl9LHI9PntuKHIubWVzc2FnZSksT2w9bnVsbH0se2ZyZXF1ZW5jeTpzb30pKSxOKHQsc28pfSksWmg9VGUocWIsKGUse3Jlc29sdmU6dH0pPT57T2wmJihzLm9yaWVudGF0aW9uLmNsZWFyV2F0Y2goT2wpLE9sPW51bGwpLHQoKX0pLG9DPVRlKEpiLChlLHtyZXNvbHZlOnR9KT0+e3MuZGV2aWNlLnZpYnJhdGUoMTUpLHQoKX0pLGFDPVRlKEtiLChlLHtyZXNvbHZlOnR9KT0+e3MuZGV2aWNlLnZpYnJhdGUoNDAwKSx0KCl9KSxUbD1udWxsLHNDPXBuKHVoLCgpPT57WGgoKX0pLGxDPVhyKGpiLCgpPT57UWgoKX0pLFhoPVRlKHpiLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e1RsfHwoVGw9cy5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKHI9PntvdC5pbnZva2VPbkNhbGxiYWNrKHVoLHt4OnImJnIueEF4aXN8fDAseTpyJiZyLnlBeGlzfHwwLHo6ciYmci56QXhpc3x8MH0pfSxyPT57VGw9bnVsbCxuKGBzdGFydEFjY2VsZXJvbWV0ZXI6ZmFpbCAke3IubWVzc2FnZX1gKX0se2ZyZXF1ZW5jeTpzb30pKSxOKHQsc28pfSksUWg9VGUoV2IsKGUse3Jlc29sdmU6dH0pPT57VGwmJihzLmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaChUbCksVGw9bnVsbCksdCgpfSksY0M9cG4oZGgsQWwoKCk9PnMuYmx1ZXRvb3RoLm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQuYmluZChzLmJsdWV0b290aCksZGgpKSx1Qz1wbihoaCxBbCgoKT0+cy5ibHVldG9vdGgub25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UuYmluZChzLmJsdWV0b290aCksaGgpKSxmQz1wbihnaCxBbCgoKT0+cy5ibHVldG9vdGgub25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UuYmluZChzLmJsdWV0b290aCksZ2gpKSxkQz1wbihwaCxBbCgoKT0+cy5ibHVldG9vdGgub25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlLmJpbmQocy5ibHVldG9vdGgpLHBoKSksaEM9VGUoIm9wZW5CbHVldG9vdGhBZGFwdGVyIixmaSgoKT0+cy5ibHVldG9vdGgub3BlbkJsdWV0b290aEFkYXB0ZXIuYmluZChzLmJsdWV0b290aCkpKSxnQz1UZSgiY2xvc2VCbHVldG9vdGhBZGFwdGVyIixmaSgoKT0+cy5ibHVldG9vdGguY2xvc2VCbHVldG9vdGhBZGFwdGVyLmJpbmQocy5ibHVldG9vdGgpKSkscEM9VGUoImdldEJsdWV0b290aEFkYXB0ZXJTdGF0ZSIsZmkoKCk9PnMuYmx1ZXRvb3RoLmdldEJsdWV0b290aEFkYXB0ZXJTdGF0ZS5iaW5kKHMuYmx1ZXRvb3RoKSkpLHZDPVRlKFpiLGZpKCgpPT5zLmJsdWV0b290aC5zdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkuYmluZChzLmJsdWV0b290aCkpLFhiKSxtQz1UZSgic3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLGZpKCgpPT5zLmJsdWV0b290aC5zdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeS5iaW5kKHMuYmx1ZXRvb3RoKSkpLF9DPVRlKCJnZXRCbHVldG9vdGhEZXZpY2VzIixmaSgoKT0+cy5ibHVldG9vdGguZ2V0Qmx1ZXRvb3RoRGV2aWNlcy5iaW5kKHMuYmx1ZXRvb3RoKSkpLGJDPVRlKFFiLGZpKCgpPT5zLmJsdWV0b290aC5nZXRDb25uZWN0ZWRCbHVldG9vdGhEZXZpY2VzLmJpbmQocy5ibHVldG9vdGgpKSxlMCkseUM9VGUodDAsZmkoKCk9PnMuYmx1ZXRvb3RoLmNyZWF0ZUJMRUNvbm5lY3Rpb24uYmluZChzLmJsdWV0b290aCkpLG4wKSxFQz1UZShyMCxmaSgoKT0+cy5ibHVldG9vdGguY2xvc2VCTEVDb25uZWN0aW9uLmJpbmQocy5ibHVldG9vdGgpKSxpMCksU0M9VGUobzAsZmkoKCk9PnMuYmx1ZXRvb3RoLmdldEJMRURldmljZVNlcnZpY2VzLmJpbmQocy5ibHVldG9vdGgpKSxhMCksd0M9VGUoczAsZmkoKCk9PnMuYmx1ZXRvb3RoLmdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcy5iaW5kKHMuYmx1ZXRvb3RoKSksbDApLENDPVRlKGMwLGZpKCgpPT5zLmJsdWV0b290aC5ub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlLmJpbmQocy5ibHVldG9vdGgpKSx1MCksQUM9VGUoZjAsZmkoKCk9PnMuYmx1ZXRvb3RoLnJlYWRCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlLmJpbmQocy5ibHVldG9vdGgpKSxkMCksT0M9VGUoaDAsZmkoKCk9PnMuYmx1ZXRvb3RoLndyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZS5iaW5kKHMuYmx1ZXRvb3RoKSksZzApLFRDPVRlKHAwLGZpKCgpPT5zLmJsdWV0b290aC5zZXRCTEVNVFUuYmluZChzLmJsdWV0b290aCkpLHYwKSxQQz1UZShtMCxmaSgoKT0+cy5ibHVldG9vdGguZ2V0QkxFRGV2aWNlUlNTSS5iaW5kKHMuYmx1ZXRvb3RoKSksXzApLElDPXBuKHZoLEFsKCgpPT5zLmliZWFjb24ub25CZWFjb25VcGRhdGUuYmluZChzLmliZWFjb24pLHZoKSksTkM9cG4obWgsQWwoKCk9PnMuaWJlYWNvbi5vbkJlYWNvblNlcnZpY2VDaGFuZ2UuYmluZChzLmliZWFjb24pLG1oKSksa0M9VGUoYjAsZmkoKCk9PnMuaWJlYWNvbi5nZXRCZWFjb25zLmJpbmQocy5pYmVhY29uKSkpLFJDPVRlKHkwLGZpKCgpPT5zLmliZWFjb24uc3RhcnRCZWFjb25EaXNjb3ZlcnkuYmluZChzLmliZWFjb24pKSxFMCkseEM9VGUoUzAsZmkoKCk9PnMuaWJlYWNvbi5zdG9wQmVhY29uRGlzY292ZXJ5LmJpbmQocy5pYmVhY29uKSkpLEJDPVRlKEJiLCh7cGhvbmVOdW1iZXI6ZX0se3Jlc29sdmU6dH0pPT4ocy5kZXZpY2UuZGlhbChlKSx0KCkpLE1iKSxNQz17bmFtZTp7Z2l2ZW5OYW1lOiJmaXJzdE5hbWUiLG1pZGRsZU5hbWU6Im1pZGRsZU5hbWUiLGZhbWlseU5hbWU6Imxhc3ROYW1lIn0sbmlja25hbWU6Im5pY2tOYW1lIixwaG90b3M6e3R5cGU6InVybCIsdmFsdWU6InBob3RvRmlsZVBhdGgifSxub3RlOiJyZW1hcmsiLHBob25lTnVtYmVyczpbe3R5cGU6Im1vYmlsZSIsdmFsdWU6Im1vYmlsZVBob25lTnVtYmVyIn0se3R5cGU6IndvcmsiLHZhbHVlOiJ3b3JrUGhvbmVOdW1iZXIifSx7dHlwZToiY29tcGFueSIsdmFsdWU6Imhvc3ROdW1iZXIifSx7dHlwZToiaG9tZSBmYXgiLHZhbHVlOiJob21lRmF4TnVtYmVyIn0se3R5cGU6IndvcmsgZmF4Iix2YWx1ZToid29ya0ZheE51bWJlciJ9XSxlbWFpbHM6W3t0eXBlOiJob21lIix2YWx1ZToiZW1haWwifV0sdXJsczpbe3R5cGU6Im90aGVyIix2YWx1ZToidXJsIn1dLG9yZ2FuaXphdGlvbnM6W3t0eXBlOiJjb21wYW55IixuYW1lOiJvcmdhbml6YXRpb24iLHRpdGxlOiJ0aXRsZSJ9XSxpbXM6W3t0eXBlOiJvdGhlciIsdmFsdWU6IndlQ2hhdE51bWJlciJ9XSxhZGRyZXNzZXM6W3t0eXBlOiJvdGhlciIscHJlZmVycmVkOiEwLGNvdW50cnk6ImFkZHJlc3NDb3VudHJ5IixyZWdpb246ImFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJhZGRyZXNzU3RyZWV0Iixwb3N0YWxDb2RlOiJhZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJob21lIixjb3VudHJ5OiJob21lQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiaG9tZUFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImhvbWVBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoiaG9tZUFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImhvbWVBZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJjb21wYW55Iixjb3VudHJ5OiJ3b3JrQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoid29ya0FkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6IndvcmtBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoid29ya0FkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6IndvcmtBZGRyZXNzUG9zdGFsQ29kZSJ9XX0sREM9WyJ0eXBlIiwicHJlZmVycmVkIl07ZnVuY3Rpb24gR3UoZSx0LG4pe2xldCByPTA7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2gobz0+e2xldCBjPW5bb107dHlwZW9mIGMhPT0ib2JqZWN0Ij9EQy5pbmRleE9mKG8pIT09LTE/ZVtvXT1uW29dOnR5cGVvZiB0W2NdIT0idW5kZWZpbmVkIj8ocisrLGVbb109dFtjXSk6ZGVsZXRlIGVbb106YyBpbnN0YW5jZW9mIEFycmF5PyhlW29dPVtdLGMuZm9yRWFjaChiPT57bGV0IFY9e307R3UoVix0LGIpJiZlW29dLnB1c2goVil9KSxlW29dLmxlbmd0aD9yKys6ZGVsZXRlIGVbb10pOihlW29dPXt9LEd1KGVbb10sdCxjKT9yKys6ZGVsZXRlIGVbb10pfSkscn1sZXQgTEM9VGUoRGIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57IWUucGhvdG9GaWxlUGF0aCYmKGUucGhvdG9GaWxlUGF0aD0iIikscy5jb250YWN0cy5nZXRBZGRyZXNzQm9vayhzLmNvbnRhY3RzLkFERFJFU1NCT09LX1BIT05FLHI9PntsZXQgbz1yLmNyZWF0ZSgpO0d1KG8sZSxNQyksby5zYXZlKCgpPT50KCksYz0+bigpKX0scj0+bigpKX0sRmIsTGIpO2Z1bmN0aW9uIEpvKGUpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCI/Zi5yZXF1aXJlTW9kdWxlKGUpOl9fcmVxdWlyZU5hdGl2ZVBsdWdpbl9fKGUpfWZ1bmN0aW9uIGVnKGUsdCxuKXtyZXR1cm4gSm8oInBsdXMiKS5zZW5kTmF0aXZlRXZlbnQoZSx0LG4pfWxldCBGQz1UZShWYiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntKbygiY2xpcGJvYXJkIikuZ2V0U3RyaW5nKG89PntvLnJlc3VsdD09PSJzdWNjZXNzIj90KHtkYXRhOm8uZGF0YX0pOm4oImdldENsaXBib2FyZERhdGE6ZmFpbCIpfSl9KSxWQz1UZShVYiwoZSx7cmVzb2x2ZTp0fSk9PntKbygiY2xpcGJvYXJkIikuc2V0U3RyaW5nKGUuZGF0YSksdCgpfSxIYiwkYiksdGc9Im9uTmV0d29ya1N0YXR1c0NoYW5nZSI7ZnVuY3Rpb24gbmcoKXtyZygpLnRoZW4oKHtuZXR3b3JrVHlwZTplfSk9PntvdC5pbnZva2VPbkNhbGxiYWNrKHRnLHtpc0Nvbm5lY3RlZDplIT09Im5vbmUiLG5ldHdvcmtUeXBlOmV9KX0pfWxldCBVQz1wbih0ZywoKT0+e3MuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigibmV0Y2hhbmdlIixuZyl9KSwkQz1Ycigib2ZmTmV0d29ya1N0YXR1c0NoYW5nZSIsKCk9PntzLmdsb2JhbEV2ZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm5ldGNoYW5nZSIsbmcpfSkscmc9VGUoImdldE5ldHdvcmtUeXBlIiwoZSx7cmVzb2x2ZTp0fSk9PntsZXQgbj1XYVtzLm5ldHdvcmtpbmZvLmdldEN1cnJlbnRUeXBlKCldfHwidW5rbm93biI7cmV0dXJuIHQoe25ldHdvcmtUeXBlOm59KX0pO2Z1bmN0aW9uIGlnKCl7aWYocy5vcy5uYW1lLnRvTG93ZXJDYXNlKCkhPT0iaW9zIilyZXR1cm4hMTtsZXQgdD1KbygiZmFjZUlEIik7cmV0dXJuISEodCYmdC5pc1N1cHBvcnQoKSl9ZnVuY3Rpb24gb2coKXtyZXR1cm4hIShzLmZpbmdlcnByaW50JiZzLmZpbmdlcnByaW50LmlzU3VwcG9ydCgpKX1sZXQgYWc9ZT0+e2xldCB0PVtdO3JldHVybiBvZygpJiZ0LnB1c2goImZpbmdlclByaW50IiksaWcoKSYmdC5wdXNoKCJmYWNpYWwiKSxlJiZlKHtzdXBwb3J0TW9kZTp0fSkse3N1cHBvcnRNb2RlOnQsZXJyTXNnOiJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb246b2sifX0sSEM9VGUoTzAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57YWcodCl9KSxzZz0oe2NoZWNrQXV0aE1vZGU6ZSxyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPShjLGcpPT5uJiZuKGMsZyksbz1jPT50JiZ0KGMpO2lmKGU9PT0iZmluZ2VyUHJpbnQiKXtpZihvZygpKXtsZXQgYz1zLmZpbmdlcnByaW50LmlzS2V5Z3VhcmRTZWN1cmUoKSYmcy5maW5nZXJwcmludC5pc0Vucm9sbGVkRmluZ2VycHJpbnRzKCk7cmV0dXJuIG8oe2lzRW5yb2xsZWQ6Y30pLHtpc0Vucm9sbGVkOmMsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOm9rIn19cmV0dXJuIHIoIm5vdCBzdXBwb3J0Iix7aXNFbnJvbGxlZDohMX0pLHtpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19ZWxzZSBpZihlPT09ImZhY2lhbCIpe2lmKGlnKCkpe2xldCBjPUpvKCJmYWNlSUQiKSxnPWMmJmMuaXNLZXlndWFyZFNlY3VyZSgpJiZjLmlzRW5yb2xsZWRGYWNlSUQoKTtyZXR1cm4gbyh7aXNFbnJvbGxlZDpnfSkse2lzRW5yb2xsZWQ6ZyxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifX1yZXR1cm4gcigibm90IHN1cHBvcnQiLHtpc0Vucm9sbGVkOiExfSkse2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX1yZXR1cm4gcigibm90IHN1cHBvcnQiLHtpc0Vucm9sbGVkOiExfSkse2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX0sakM9VGUoVDAsKHtjaGVja0F1dGhNb2RlOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3NnKHtjaGVja0F1dGhNb2RlOmUscmVzb2x2ZTp0LHJlamVjdDpufSl9LE4wLEkwKSx6Qz1UZShrMCwoe3JlcXVlc3RBdXRoTW9kZXM6ZSxjaGFsbGVuZ2U6dD0hMSxhdXRoQ29udGVudDpufSx7cmVzb2x2ZTpyLHJlamVjdDpvfSk9Pnt4bigpO2xldHt0OmN9PWFlKCkse3N1cHBvcnRNb2RlOmd9PWFnKCk7aWYoIWcubGVuZ3RoKXJldHVybiBvKCJub3Qgc3VwcG9ydCIse2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMX0pO2xldCBiPVtdO2lmKGUuZm9yRWFjaChmdD0+e2cuaW5kZXhPZihmdCk+LTEmJmIucHVzaChmdCl9KSwhYi5sZW5ndGgpcmV0dXJuIG8oInN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vIGNvcnJlc3BvbmRpbmcgbW9kZSIse2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwM30pO2xldCBWPVtdO2lmKGIuZm9yRWFjaChmdD0+e3NnKHtjaGVja0F1dGhNb2RlOmZ0fSkuaXNFbnJvbGxlZCYmVi5wdXNoKGZ0KX0pLCFWLmxlbmd0aClyZXR1cm4gbyhgc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm8gJHtiWzBdfSBlbnJvbGxlZGAse2F1dGhNb2RlOmJbMF0sZXJyQ29kZTo5MDAxMX0pO2xldCBUPVZbMF0sTD1udWxsLF9lLHdlPW58fGMoInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiKSxQZT1mdD0+e2xldHtjb2RlOmh0fT1mdCxGdD17YXV0aE1vZGU6VH0sU3Q9ezQ6KCk9PntMPyhFKF9lKSxMLnNldFRpdGxlKGMoInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiKSksX2U9TigoKT0+e0wmJkwuc2V0VGl0bGUod2UpfSwxZTMpKTpvKCIiLHouZXh0ZW5kKEZ0LHtlcnJDb2RlOjkwMDA5fSkpfSw1OigpPT57cy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxvKCJhdXRoZW50aWNhdGUgZnJlZXplLiBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIix6LmV4dGVuZChGdCx7ZXJyQ29kZTo5MDAxMH0pKX0sNjooKT0+e3MubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksbygiY2FuY2VsIix6LmV4dGVuZChGdCx7ZXJyQ29kZTo5MDAwOH0pKX19O2h0JiZTdFtodF0/U3RbaHRdKCk6KHMubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksbygiIix6LmV4dGVuZChGdCx7ZXJyQ29kZTo5MDAwN30pKSl9O1Q9PT0iZmluZ2VyUHJpbnQiPyhzLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIiYmKEw9cy5uYXRpdmVVSS5zaG93V2FpdGluZyh3ZSksTC5vbmNsb3NlPWZ1bmN0aW9uKCl7cy5maW5nZXJwcmludC5jYW5jZWwoKX0pLHMuZmluZ2VycHJpbnQuYXV0aGVudGljYXRlKCgpPT57cy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxyKHthdXRoTW9kZTpULGVyckNvZGU6MH0pfSxQZSx7bWVzc2FnZTp3ZX0pKTpUPT09ImZhY2lhbCImJkpvKCJmYWNlSUQiKS5hdXRoZW50aWNhdGUoe21lc3NhZ2U6d2V9LGh0PT57aHQudHlwZT09PSJzdWNjZXNzIiYmaHQuY29kZT09PTA/cih7YXV0aE1vZGU6VCxlcnJDb2RlOjB9KTpQZShodCl9KX0seDAsUjApLFdDPVRlKEIwLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e1h0KCk7bGV0e3Q6cn09YWUoKSxjPVdoKCkhPT0ibGlnaHQiLGcsYj0hMSxWPVlpKHt1cmw6Il9fdW5pYXBwc2NhbiIsZGF0YTpPYmplY3QuYXNzaWduKHt9LGUse21lc3NhZ2VzOntmYWlsOnIoInVuaS5zY2FuQ29kZS5mYWlsIiksImZsYXNoLm9uIjpyKCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iKSwiZmxhc2gub2ZmIjpyKCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIil9fSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwicG9wLWluIix0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0eXBlOiJmbG9hdCIsdGl0bGVUZXh0OmUudGl0bGVUZXh0fHxyKCJ1bmkuc2NhbkNvZGUudGl0bGUiKSx0aXRsZUNvbG9yOiIjZmZmZmZmIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLGJ1dHRvbnM6ZS5vbmx5RnJvbUNhbWVyYT9bXTpbe3RleHQ6ZS5hbGJ1bVRleHR8fHIoInVuaS5zY2FuQ29kZS5hbGJ1bSIpLGZvbnRTaXplOiIxN3B4Iix3aWR0aDoiNjBweCIsb25jbGljazooKT0+e1Yuc2VuZE1lc3NhZ2Uoe3R5cGU6ImdhbGxlcnkifSl9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrZ3JvdW5kOiIjMDAwMDAwIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25NZXNzYWdlKHtldmVudDpULGRldGFpbDpMfSl7Zz1MLGI9VD09PSJtYXJrZWQifSxvbkNsb3NlKCl7YyYmcy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxnP2I/KGRlbGV0ZSBnLm1lc3NhZ2UsdChnKSk6bihnLm1lc3NhZ2UpOm4oImNhbmNlbCIpfX0pO2MmJihzLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxWLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsKHt0eXBlOlQscmVzdWx0Okx9KT0+e1Q9PT0ic3RhcnQiP3MubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6VD09PSJlbmQiJiYhTCYmcy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSl9LE0wLEwwKSxsZz1lPT57b3QuaW52b2tlT25DYWxsYmFjayhKLk9OX1RIRU1FX0NIQU5HRSxlKX0sR0M9cG4oSi5PTl9USEVNRV9DSEFOR0UsKCk9PntvdC5vbihKLk9OX1RIRU1FX0NIQU5HRSxsZyl9KSxZQz1YcihKLk9GRl9USEVNRV9DSEFOR0UsKCk9PntvdC5vZmYoSi5PTl9USEVNRV9DSEFOR0UsbGcpfSkscUM9VGUodzAsKGUse3Jlc29sdmU6dH0pPT57bGV0IG49cy5zY3JlZW4uZ2V0QnJpZ2h0bmVzcyghMSk7dCh7dmFsdWU6bn0pfSksSkM9VGUoQzAsKGUse3Jlc29sdmU6dH0pPT57cy5zY3JlZW4uc2V0QnJpZ2h0bmVzcyhlLnZhbHVlLCExKSx0KCl9KSxLQz1UZShBMCwoZSx7cmVzb2x2ZTp0fSk9PntzLmRldmljZS5zZXRXYWtlbG9jayghIWUua2VlcFNjcmVlbk9uKSx0KCl9KSxaQz1EdChGMCwoKT0+e2xldHtnZXRTeXN0ZW1TZXR0aW5nOmV9PWYucmVxdWlyZU1vZHVsZSgicGx1cyIpLHQ9ZSgpO3RyeXt0eXBlb2YgdD09InN0cmluZyImJih0PUpTT04ucGFyc2UodCkpfWNhdGNoKG4pe31yZXR1cm4gdH0pLGNnPUR0KFYwLCgpPT57bGV0e2dldEFwcEF1dGhvcml6ZVNldHRpbmc6ZX09Zi5yZXF1aXJlTW9kdWxlKCJwbHVzIiksdD1lKCk7dHJ5e3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9SlNPTi5wYXJzZSh0KSl9Y2F0Y2gobil7fWZvcihsZXQgbiBpbiB0KXouaGFzT3duKHQsbikmJnRbbl09PT0idW5kZWZpbmVkIiYmKHRbbl09dm9pZCAwKTtyZXR1cm4gdH0pLFhDPVRlKFUwLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpyfT1mLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtyKGM9PntjLnR5cGU9PT0ic3VjY2VzcyI/dCgpOm4oKX0pfSksUUM9VGUoVHksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9V3IrIi9kb3dubG9hZC8iO3MuaW8uZ2V0SW1hZ2VJbmZvKHouZXh0ZW5kKGUse3NhdmVQYXRoOnIsZmlsZW5hbWU6cixzdWNjZXNzOlhzKHQpLGZhaWw6ZHIobil9KSl9LEl5LFB5KSxlQT1UZShCeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntzLmlvLmdldFZpZGVvSW5mbyh7ZmlsZVBhdGg6ZS5zcmMsc3VjY2VzczpyPT57dCh7b3JpZW50YXRpb246ci5vcmllbnRhdGlvbix0eXBlOnIudHlwZSxkdXJhdGlvbjpyLmR1cmF0aW9uLHNpemU6ci5zaXplLGhlaWdodDpyLmhlaWdodCx3aWR0aDpyLndpZHRoLGZwczpyLmZwc3x8MzAsYml0cmF0ZTpyLmJpdHJhdGV9KX0sZmFpbDpkcihuKX0pfSxEeSxNeSksdEE9VGUoTnksKHtjdXJyZW50OmU9MCxpbmRpY2F0b3I6dD0ibnVtYmVyIixsb29wOm49ITEsdXJsczpyLGxvbmdQcmVzc0FjdGlvbnM6b30se3Jlc29sdmU6YyxyZWplY3Q6Z30pPT57TmUoKTtsZXR7dDpifT1hZSgpO3I9ci5tYXAoVD0+amUoVCkpO2xldCBWPU51bWJlcihlKTtpc05hTihWKT8oZT1yLmluZGV4T2YoamUoZSkpLGU9ZTwwPzA6ZSk6ZT1WLHMubmF0aXZlVUkucHJldmlld0ltYWdlKHIse2N1cnJlbnQ6ZSxpbmRpY2F0b3I6dCxsb29wOm4sb25Mb25nUHJlc3M6ZnVuY3Rpb24oVCl7bGV0IEw9W10sX2U9IiIsd2U9byYmei5pc1BsYWluT2JqZWN0KG8pO3dlPyhMPW8uaXRlbUxpc3Q/by5pdGVtTGlzdDpbXSxfZT1vLml0ZW1Db2xvcj9vLml0ZW1Db2xvcjoiIzAwMDAwMCIpOihMPVtiKCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIildLF9lPSIjMDAwMDAwIik7bGV0IFBlPXtidXR0b25zOkwubWFwKGZ0PT4oe3RpdGxlOmZ0LGNvbG9yOl9lfSkpLGNhbmNlbDpiKCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCIpfTtzLm5hdGl2ZVVJLmFjdGlvblNoZWV0KFBlLGZ0PT57aWYoZnQuaW5kZXg+MCl7aWYod2Upe3ouaXNGdW5jdGlvbihvLnN1Y2Nlc3MpJiZvLnN1Y2Nlc3Moe3RhcEluZGV4OmZ0LmluZGV4LTEsaW5kZXg6VC5pbmRleH0pO3JldHVybn1zLmdhbGxlcnkuc2F2ZShULnVybCwoKT0+e3MubmF0aXZlVUkudG9hc3QoYigidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiKSl9LGZ1bmN0aW9uKCl7cy5uYXRpdmVVSS50b2FzdChiKCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCIpKX0pfWVsc2Ugd2UmJnouaXNGdW5jdGlvbihvLmZhaWwpJiZvLmZhaWwoe2Vyck1zZzoic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIn0pfSl9fSksYygpfSxSeSxreSksbkE9VGUoeHksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57dHJ5e3MubmF0aXZlVUkuY2xvc2VQcmV2aWV3SW1hZ2UoKSx0KCl9Y2F0Y2gocil7bigpfX0pLFl1LFBsPSExLHF1LElsPShlLHQ9e30pPT57ckEoei5leHRlbmQoe3N0YXRlOmV9LHQpKX0sb2M9e3N0YXJ0KHtkdXJhdGlvbjplPTZlNCxzYW1wbGVSYXRlOnQsbnVtYmVyT2ZDaGFubmVsczpuLGVuY29kZUJpdFJhdGU6cixmb3JtYXQ6bz0ibXAzIixmcmFtZVNpemU6Y309e30pe2lmKFBsKXJldHVybiBJbCgic3RhcnQiKTtZdT1zLmF1ZGlvLmdldFJlY29yZGVyKCksWXUucmVjb3JkKHtmb3JtYXQ6byxzYW1wbGVyYXRlOnQ/U3RyaW5nKHQpOnZvaWQgMCxmaWxlbmFtZTpXcisiL3JlY29yZGVyLyJ9LGc9PklsKCJzdG9wIix7dGVtcEZpbGVQYXRoOmd9KSxnPT5JbCgiZXJyb3IiLHtlcnJNc2c6Zy5tZXNzYWdlfSkpLHF1PU4oKCk9PntvYy5zdG9wKCl9LGUpLElsKCJzdGFydCIpLFBsPSEwfSxzdG9wKCl7UGwmJihZdS5zdG9wKCksUGw9ITEscXUmJkUocXUpKX0scGF1c2UoKXtQbCYmSWwoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHBhdXNlIn0pfSxyZXN1bWUoKXtQbCYmSWwoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHJlc3VtZSJ9KX19LFFzPXtwYXVzZTpudWxsLHJlc3VtZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsLGVycm9yOm51bGx9O2Z1bmN0aW9uIHJBKGUpe2xldCB0PWUuc3RhdGU7ZGVsZXRlIGUuc3RhdGUsZGVsZXRlIGUuZXJyTXNnLHQmJnouaXNGdW5jdGlvbihRc1t0XSkmJlFzW3RdKGUpfWNsYXNzIGlBe2NvbnN0cnVjdG9yKCl7fW9uRXJyb3IodCl7UXMuZXJyb3I9dH1vbkZyYW1lUmVjb3JkZWQodCl7fW9uSW50ZXJydXB0aW9uQmVnaW4odCl7fW9uSW50ZXJydXB0aW9uRW5kKHQpe31vblBhdXNlKHQpe1FzLnBhdXNlPXR9b25SZXN1bWUodCl7UXMucmVzdW1lPXR9b25TdGFydCh0KXtRcy5zdGFydD10fW9uU3RvcCh0KXtRcy5zdG9wPXR9cGF1c2UoKXtvYy5wYXVzZSgpfXJlc3VtZSgpe29jLnJlc3VtZSgpfXN0YXJ0KHQ9e30pe29jLnN0YXJ0KHQpfXN0b3AoKXtvYy5zdG9wKCl9fWxldCB1ZyxvQT1EdChqeSwoKT0+dWd8fCh1Zz1uZXcgaUEpKSxhQT1UZShVeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntzLmdhbGxlcnkuc2F2ZShlLmZpbGVQYXRoLFhzKHQpLGRyKG4pKX0sSHksJHkpLHNBPVRlKEx5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3MuZ2FsbGVyeS5zYXZlKGUuZmlsZVBhdGgsWHModCksZHIobikpfSxWeSxGeSksbEE9VGUoenksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9YCR7V3J9L2NvbXByZXNzZWQvJHtEYXRlLm5vdygpfV8ke0dhKGUuc3JjKX1gLHtjb21wcmVzc2VkV2lkdGg6byxjb21wcmVzc2VkSGVpZ2h0OmN9PWU7dHlwZW9mIG89PSJudW1iZXIiJiYoZS53aWR0aD1vKyJweCIpLHR5cGVvZiBjPT0ibnVtYmVyIiYmKGUuaGVpZ2h0PWMrInB4Iikscy56aXAuY29tcHJlc3NJbWFnZSh6LmV4dGVuZCh7fSxlLHtkc3Q6cn0pLCgpPT57dCh7dGVtcEZpbGVQYXRoOnJ9KX0sbil9LEd5LFd5KSxjQT1UZShZeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1gJHtXcn0vY29tcHJlc3NlZC8ke0RhdGUubm93KCl9XyR7R2EoZS5zcmMpfWA7cy56aXAuY29tcHJlc3NWaWRlbyh6LmV4dGVuZCh7fSxlLHtmaWxlbmFtZTpyfSksbz0+e3Qoe3RlbXBGaWxlUGF0aDpyLHNpemU6by5zaXplfSl9LG4pfSxKeSxxeSk7ZnVuY3Rpb24gdUEoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57cy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUsZnVuY3Rpb24ocil7ci5nZXRNZXRhZGF0YSh0LG4sITEpfSxuKX0pfWxldCBmQT1UZShFeSwoe2NvdW50OmUsc2l6ZVR5cGU6dCxzb3VyY2VUeXBlOm4sY3JvcDpyfT17fSx7cmVzb2x2ZTpvLHJlamVjdDpjfSk9PntLKCk7bGV0e3Q6Z309YWUoKSxiPWRyKGMpO2Z1bmN0aW9uIFYoX2Upe2xldCB3ZT1bXSxQZT1bXTtQcm9taXNlLmFsbChfZS5tYXAoZnQ9PnVBKGZ0KSkpLnRoZW4oZnQ9PntmdC5mb3JFYWNoKChodCxGdCk9PntsZXQgU3Q9X2VbRnRdO1BlLnB1c2goU3QpLHdlLnB1c2goe3BhdGg6U3Qsc2l6ZTpodC5zaXplfSl9KSxvKHt0ZW1wRmlsZVBhdGhzOlBlLHRlbXBGaWxlczp3ZX0pfSkuY2F0Y2goYil9ZnVuY3Rpb24gVCgpe3MuY2FtZXJhLmdldENhbWVyYSgpLmNhcHR1cmVJbWFnZSh3ZT0+Vihbd2VdKSxiLHtmaWxlbmFtZTpXcisiL2NhbWVyYS8iLHJlc29sdXRpb246ImhpZ2giLGNyb3A6cixzaXplVHlwZTp0fSl9ZnVuY3Rpb24gTCgpe3MuZ2FsbGVyeS5waWNrKCh7ZmlsZXM6X2V9KT0+VihfZSksYix7bWF4aW11bTplLG11bHRpcGxlOiEwLHN5c3RlbTohMSxmaWxlbmFtZTpXcisiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsY3JvcDpyLHNpemVUeXBlOnR9KX1pZihuLmxlbmd0aD09PTEpe2lmKG4uaW5jbHVkZXMoImFsYnVtIikpe0woKTtyZXR1cm59ZWxzZSBpZihuLmluY2x1ZGVzKCJjYW1lcmEiKSl7VCgpO3JldHVybn19cy5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmcoInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6ZygidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpnKCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSIpfV19LF9lPT57c3dpdGNoKF9lLmluZGV4KXtjYXNlIDE6VCgpO2JyZWFrO2Nhc2UgMjpMKCk7YnJlYWs7ZGVmYXVsdDpiKCk7YnJlYWt9fSl9LHd5LFN5KSxkQT1UZShDeSwoe3NvdXJjZVR5cGU6ZSxjb21wcmVzc2VkOnQsbWF4RHVyYXRpb246bixjYW1lcmE6cn0se3Jlc29sdmU6byxyZWplY3Q6Y30pPT57aWUoKTtsZXR7dDpnfT1hZSgpLGI9ZHIoYyk7ZnVuY3Rpb24gVihfZSl7cy5pby5nZXRWaWRlb0luZm8oe2ZpbGVQYXRoOl9lLHN1Y2Nlc3Mod2Upe2xldCBQZT17ZXJyTXNnOiJjaG9vc2VWaWRlbzpvayIsdGVtcEZpbGVQYXRoOl9lLHNpemU6d2Uuc2l6ZSxkdXJhdGlvbjp3ZS5kdXJhdGlvbix3aWR0aDp3ZS53aWR0aCxoZWlnaHQ6d2UuaGVpZ2h0fTtvKFBlKX0sZmFpbDpifSl9ZnVuY3Rpb24gVCgpe3MuZ2FsbGVyeS5waWNrKCh7ZmlsZXM6X2V9KT0+VihfZVswXSksYix7ZmlsdGVyOiJ2aWRlbyIsc3lzdGVtOiExLG11bHRpcGxlOiEwLG1heGltdW06MSxmaWxlbmFtZTpXcisiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsdmlkZW9Db21wcmVzczp0fSl9ZnVuY3Rpb24gTCgpe3MuY2FtZXJhLmdldENhbWVyYSgpLnN0YXJ0VmlkZW9DYXB0dXJlKFYsYix7aW5kZXg6cj09PSJmcm9udCI/IjIiOiIxIix2aWRlb01heGltdW1EdXJhdGlvbjpuLGZpbGVuYW1lOldyKyIvY2FtZXJhLyIsdmlkZW9Db21wcmVzczp0fSl9aWYoZS5sZW5ndGg9PT0xKXtpZihlLmluY2x1ZGVzKCJhbGJ1bSIpKXtUKCk7cmV0dXJufWVsc2UgaWYoZS5pbmNsdWRlcygiY2FtZXJhIikpe0woKTtyZXR1cm59fXMubmF0aXZlVUkuYWN0aW9uU2hlZXQoe2NhbmNlbDpnKCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIiksYnV0dG9uczpbe3RpdGxlOmcoInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSIpfSx7dGl0bGU6ZygidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iKX1dfSxfZT0+e3N3aXRjaChfZS5pbmRleCl7Y2FzZSAxOkwoKTticmVhaztjYXNlIDI6VCgpO2JyZWFrO2RlZmF1bHQ6YigpO2JyZWFrfX0pfSxPeSxBeSksaEE9VGUoZHksKGUse3Jlc29sdmU6dH0pPT57cy5rZXkuc2hvd1NvZnRLZXlib3JkKCksdCgpfSksZ0E9VGUoZnksKGUse3Jlc29sdmU6dH0pPT57cy5rZXkuaGlkZVNvZnRLZXlib3JkKCksdCgpfSk7ZnVuY3Rpb24gZmcoZSl7b3QuaW52b2tlT25DYWxsYmFjayhKLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsZSl9bGV0IHBBPXBuKEouT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSwoKT0+e290Lm9uKEouT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSxmZyl9KSx2QT1YcihKLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsKCk9PntvdC5vZmYoSi5PTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFLGZnKX0pO2NsYXNzIG1Be2NvbnN0cnVjdG9yKHQpe3RoaXMuX2NhbGxiYWNrcz1bXSx0aGlzLl9kb3dubG9hZGVyPXQsdC5hZGRFdmVudExpc3RlbmVyKCJzdGF0ZWNoYW5nZWQiLChuLHIpPT57bi5kb3dubG9hZGVkU2l6ZSYmbi50b3RhbFNpemUmJnRoaXMuX2NhbGxiYWNrcy5mb3JFYWNoKG89PntvKHtwcm9ncmVzczpNYXRoLnJvdW5kKG4uZG93bmxvYWRlZFNpemUvbi50b3RhbFNpemUqMTAwKSx0b3RhbEJ5dGVzV3JpdHRlbjpuLmRvd25sb2FkZWRTaXplLHRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGU6bi50b3RhbFNpemV9KX0pfSl9YWJvcnQoKXt0aGlzLl9kb3dubG9hZGVyLmFib3J0KCl9b25Qcm9ncmVzc1VwZGF0ZSh0KXshei5pc0Z1bmN0aW9uKHQpfHx0aGlzLl9jYWxsYmFja3MucHVzaCh0KX1vZmZQcm9ncmVzc1VwZGF0ZSh0KXtsZXQgbj10aGlzLl9jYWxsYmFja3MuaW5kZXhPZih0KTtuPj0wJiZ0aGlzLl9jYWxsYmFja3Muc3BsaWNlKG4sMSl9b25IZWFkZXJzUmVjZWl2ZWQodCl7dGhyb3cgbmV3IEVycm9yKCJNZXRob2Qgbm90IGltcGxlbWVudGVkLiIpfW9mZkhlYWRlcnNSZWNlaXZlZCh0KXt0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIil9fWxldCBfQT1VcihhRSwoe3VybDplLGhlYWRlcjp0LHRpbWVvdXQ6bn0se3Jlc29sdmU6cixyZWplY3Q6b30pPT57bj0obnx8Ui5uZXR3b3JrVGltZW91dCYmUi5uZXR3b3JrVGltZW91dC5yZXF1ZXN0fHw2MCoxZTMpLzFlMztsZXQgYz1zLmRvd25sb2FkZXIuY3JlYXRlRG93bmxvYWQoZSx7dGltZW91dDpuLGZpbGVuYW1lOldyKyIvZG93bmxvYWQvIixyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sKGIsVik9PntWP3Ioe3RlbXBGaWxlUGF0aDpiLmZpbGVuYW1lLHN0YXR1c0NvZGU6Vn0pOm8oYHN0YXR1c0NvZGU6ICR7Vn1gKX0pLGc9bmV3IG1BKGMpO2ZvcihsZXQgYiBpbiB0KXouaGFzT3duKHQsYikmJmMuc2V0UmVxdWVzdEhlYWRlcihiLHRbYl0pO3JldHVybiBjLnN0YXJ0KCksZ30sbEUsc0UpLGJBPWU9PntsZXQgdD1lWyJTZXQtQ29va2llIl18fGVbInNldC1jb29raWUiXSxuPVtdO2lmKCF0KXJldHVybltdO3RbMF09PT0iWyImJnRbdC5sZW5ndGgtMV09PT0iXSImJih0PXQuc2xpY2UoMSwtMSkpO2xldCByPXQuc3BsaXQoIjsiKTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKylyW29dLmluZGV4T2YoIkV4cGlyZXM9IikhPT0tMXx8cltvXS5pbmRleE9mKCJleHBpcmVzPSIpIT09LTE/bi5wdXNoKHJbb10ucmVwbGFjZSgiLCIsIiIpKTpuLnB1c2gocltvXSk7cmV0dXJuIG49bi5qb2luKCI7Iikuc3BsaXQoIiwiKSxufTtmdW5jdGlvbiB5QShlLHQpe2lmKHouaXNTdHJpbmcoZS5kYXRhKSYmZS5kYXRhLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKGUuZGF0YT1lLmRhdGEuc2xpY2UoMSkpLGUuc3RhdHVzQ29kZT1wYXJzZUludChTdHJpbmcoZS5zdGF0dXNDb2RlKSwxMCksei5pc1BsYWluT2JqZWN0KGUuaGVhZGVyKSYmKGUuaGVhZGVyPU9iamVjdC5rZXlzKGUuaGVhZGVyKS5yZWR1Y2UoZnVuY3Rpb24obixyKXtsZXQgbz1lLmhlYWRlcltyXTtyZXR1cm4gei5pc0FycmF5KG8pP25bcl09by5qb2luKCIsIik6ei5pc1N0cmluZyhvKSYmKG5bcl09byksbn0se30pKSx0LmRhdGFUeXBlJiZ0LmRhdGFUeXBlLnRvTG93ZXJDYXNlKCk9PT0ianNvbiIpdHJ5e2UuZGF0YT1KU09OLnBhcnNlKGUuZGF0YSl9Y2F0Y2gobil7fXJldHVybiBlfWNsYXNzIEVBe2NvbnN0cnVjdG9yKHQpe3RoaXMuX3JlcXVlc3RUYXNrPXR9YWJvcnQoKXt0aGlzLl9yZXF1ZXN0VGFzay5hYm9ydCgpfW9mZkhlYWRlcnNSZWNlaXZlZCgpe31vbkhlYWRlcnNSZWNlaXZlZCgpe319bGV0IFNBPVVyKEt5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtoZWFkZXI6cixtZXRob2Q6byxkYXRhOmMsdGltZW91dDpnLHVybDpiLHJlc3BvbnNlVHlwZTpWLHNzbFZlcmlmeTpULGZpcnN0SXB2NDpMLHRsczpfZX09ZSx3ZTtmb3IobGV0IEV0IGluIHIpaWYoRXQudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiKXt3ZT1yW0V0XTticmVha31vIT09IkdFVCImJndlLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKT09PTAmJnouaXNQbGFpbk9iamVjdChjKSYmKGM9SlNPTi5zdHJpbmdpZnkoYykpO2xldCBQZT1Kbygic3RyZWFtIiksZnQ9e30saHQsRnQsU3Q9ITE7Zm9yKGxldCBFdCBpbiByKWlmKCFTdCYmRXQudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiKXtpZihTdD0hMCxmdFsiQ29udGVudC1UeXBlIl09cltFdF0sbyE9PSJHRVQiJiZyW0V0XS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT09PTAmJiF6LmlzU3RyaW5nKGMpJiYhKGMgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpe2xldCBLdD1bXTtmb3IobGV0IGNuIGluIGMpei5oYXNPd24oYyxjbikmJkt0LnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGNuKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGNbY25dKSk7Yz1LdC5qb2luKCImIil9fWVsc2UgZnRbRXRdPXJbRXRdOyFTdCYmbz09PSJQT1NUIiYmKGZ0WyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IiksZyYmKGh0PU4oKCk9PntGdD0hMCxuKCJ0aW1lb3V0Iil9LGcrMjAwKSk7bGV0IG1uPXttZXRob2Q6byx1cmw6Yi50cmltKCksaGVhZGVyczpmdCx0eXBlOlY9PT0iYXJyYXlidWZmZXIiPyJiYXNlNjQiOiJ0ZXh0Iix0aW1lb3V0Omd8fDZlNSxzc2xWZXJpZnk6IVQsZmlyc3RJcHY0OkwsdGxzOl9lfSx0bj0hMTtvIT09IkdFVCImJih0b1N0cmluZy5jYWxsKGMpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj90bj0hMDptbi5ib2R5PXouaXNTdHJpbmcoYyk/YzpKU09OLnN0cmluZ2lmeShjKSk7bGV0IG5uPSh7b2s6RXQsc3RhdHVzOkt0LGRhdGE6Y24saGVhZGVyczpadCxlcnJvck1zZzpDbn0pPT57aWYoRnQpcmV0dXJuO2h0JiZFKGh0KTtsZXQgaHI9S3Q7aWYoaHI+MCl0KHlBKHtkYXRhOkV0JiZWPT09ImFycmF5YnVmZmVyIj9SaShjbik6Y24sc3RhdHVzQ29kZTpocixoZWFkZXI6WnQsY29va2llczpiQShadCl9LGUpKTtlbHNle2xldCBybj0iYWJvcnQgc3RhdHVzQ29kZToiK2hyO0NuJiYocm49cm4rIiAiK0NuKSxuKHJuKX19O3JldHVybiB0bj9QZS5mZXRjaFdpdGhBcnJheUJ1ZmZlcih7IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6VHIoYyl9LG1uLG5uKTpQZS5mZXRjaChtbixubiksbmV3IEVBKHthYm9ydCgpe0Z0PSEwLGh0JiZFKGh0KSxuKCJhYm9ydCIpfX0pfSx0RSxuRSksd0E9VGUockUsKHtjZXJ0aWZpY2F0ZXM6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57Sm8oInN0cmVhbSIpLmNvbmZpZ01UTFMoZSwoe3R5cGU6byxjb2RlOmMsbWVzc2FnZTpnfSk9Pntzd2l0Y2gobyl7Y2FzZSJzdWNjZXNzIjp0KHtjb2RlOmN9KTticmVhaztjYXNlImZhaWwiOm4oZyx7Y29kZTpjfSk7YnJlYWt9fSl9LGlFLG9FKSxObD1bXSxrbD17fSxKdT17b3BlbjoiIixjbG9zZToiIixlcnJvcjoiIixtZXNzYWdlOiIifSxhYztmdW5jdGlvbiBDQShlKXtsZXQgdD1TdHJpbmcoRGF0ZS5ub3coKSksbjt0cnl7YWN8fChhYz1KbygidW5pLXdlYlNvY2tldCIpLEFBKGFjKSksYWMuV2ViU29ja2V0KHtpZDp0LHVybDplLnVybCxwcm90b2NvbDp6LmlzQXJyYXkoZS5wcm90b2NvbHMpP2UucHJvdG9jb2xzLmpvaW4oIiwiKTplLnByb3RvY29scyxoZWFkZXI6ZS5oZWFkZXJ9KX1jYXRjaChyKXtuPXJ9cmV0dXJue3NvY2tldDphYyxzb2NrZXRJZDp0LGVyck1zZzpufX1mdW5jdGlvbiBBQShlKXtlLm9ub3Blbih0PT57bGV0IG49a2xbdC5pZF07IW58fG4uX3NvY2tldE9uT3BlbigpfSksZS5vbm1lc3NhZ2UodD0+e2xldCBuPWtsW3QuaWRdOyFufHxuLl9zb2NrZXRPbk1lc3NhZ2UodCl9KSxlLm9uZXJyb3IodD0+e2xldCBuPWtsW3QuaWRdOyFufHxuLl9zb2NrZXRPbkVycm9yKCl9KSxlLm9uY2xvc2UodD0+e2xldHtpZDpuLGNvZGU6cixyZWFzb246b309dCxjPWtsW25dOyFjfHxjLl9zb2NrZXRPbkNsb3NlKHtjb2RlOnIscmVhc29uOm99KX0pfWNsYXNzIE9Be2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD1uLHRoaXMuX3NvY2tldD10LHRoaXMuX2NhbGxiYWNrcz17b3BlbjpbXSxjbG9zZTpbXSxlcnJvcjpbXSxtZXNzYWdlOltdfSx0aGlzLkNMT1NFRD0zLHRoaXMuQ0xPU0lORz0yLHRoaXMuQ09OTkVDVElORz0wLHRoaXMuT1BFTj0xLHRoaXMucmVhZHlTdGF0ZT10aGlzLkNMT1NFRCwhIXRoaXMuX3NvY2tldH1fc29ja2V0T25PcGVuKCl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuT1BFTix0aGlzLnNvY2tldFN0YXRlQ2hhbmdlKCJvcGVuIil9X3NvY2tldE9uTWVzc2FnZSh0KXt0aGlzLnNvY2tldFN0YXRlQ2hhbmdlKCJtZXNzYWdlIix7ZGF0YTp0eXBlb2YgdC5kYXRhPT0ib2JqZWN0Ij9SaSh0LmRhdGEuYmFzZTY0KTp0LmRhdGF9KX1fc29ja2V0T25FcnJvcigpe3RoaXMuc29ja2V0U3RhdGVDaGFuZ2UoImVycm9yIiksdGhpcy5vbkVycm9yT3JDbG9zZSgpfV9zb2NrZXRPbkNsb3NlKHQpe3RoaXMuc29ja2V0U3RhdGVDaGFuZ2UoImNsb3NlIix0KSx0aGlzLm9uRXJyb3JPckNsb3NlKCl9b25FcnJvck9yQ2xvc2UoKXt0aGlzLnJlYWR5U3RhdGU9dGhpcy5DTE9TRUQsZGVsZXRlIGtsW3RoaXMuaWRdO2xldCB0PU5sLmluZGV4T2YodGhpcyk7dD49MCYmTmwuc3BsaWNlKHQsMSl9c29ja2V0U3RhdGVDaGFuZ2UodCxuPXt9KXtsZXR7Y29kZTpyLHJlYXNvbjpvfT1uLGM9dD09PSJtZXNzYWdlIj97ZGF0YTpuLmRhdGF9OnQ9PT0iY2xvc2UiP3tjb2RlOnIscmVhc29uOm99Ont9O3RoaXM9PT1ObFswXSYmSnVbdF0mJm90Lmludm9rZU9uQ2FsbGJhY2soSnVbdF0sYyksdGhpcy5fY2FsbGJhY2tzW3RdLmZvckVhY2goZz0+e3ouaXNGdW5jdGlvbihnKSYmZyhjKX0pfXNlbmQodCxuPSEwKXt0aGlzLnJlYWR5U3RhdGUhPT10aGlzLk9QRU4mJkouY2FsbE9wdGlvbnModCwic2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCBXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCIpO3RyeXt0aGlzLl9zb2NrZXQuc2VuZCh7aWQ6dGhpcy5pZCxkYXRhOnR5cGVvZiB0LmRhdGE9PSJvYmplY3QiP3siQHR5cGUiOiJiaW5hcnkiLGJhc2U2NDpUcih0LmRhdGEpfTp0LmRhdGF9KSxuJiZKLmNhbGxPcHRpb25zKHQsInNlbmRTb2NrZXRNZXNzYWdlOm9rIil9Y2F0Y2gocil7biYmSi5jYWxsT3B0aW9ucyh0LGBzZW5kU29ja2V0TWVzc2FnZTpmYWlsICR7cn1gKX19Y2xvc2UodCxuPSEwKXt0aGlzLnJlYWR5U3RhdGU9dGhpcy5DTE9TSU5HO3RyeXt0aGlzLl9zb2NrZXQuY2xvc2Uoei5leHRlbmQoe2lkOnRoaXMuaWQsYXJnczp0fSkpLG4mJkouY2FsbE9wdGlvbnModCwiY2xvc2VTb2NrZXQ6b2siKX1jYXRjaChyKXtuJiZKLmNhbGxPcHRpb25zKHQsYGNsb3NlU29ja2V0OmZhaWwgJHtyfWApfX1vbk9wZW4odCl7dGhpcy5fY2FsbGJhY2tzLm9wZW4ucHVzaCh0KX1vbkNsb3NlKHQpe3RoaXMuX2NhbGxiYWNrcy5jbG9zZS5wdXNoKHQpfW9uRXJyb3IodCl7dGhpcy5fY2FsbGJhY2tzLmVycm9yLnB1c2godCl9b25NZXNzYWdlKHQpe3RoaXMuX2NhbGxiYWNrcy5tZXNzYWdlLnB1c2godCl9fWxldCBUQT1VcihkRSwoe3VybDplLHByb3RvY29sczp0LGhlYWRlcjpuLG1ldGhvZDpyfSx7cmVzb2x2ZTpvLHJlamVjdDpjfSk9PntsZXR7c29ja2V0Omcsc29ja2V0SWQ6YixlcnJNc2c6Vn09Q0Eoe3VybDplLHByb3RvY29sczp0LGhlYWRlcjpuLG1ldGhvZDpyfSksVD1uZXcgT0EoZyxiKTtyZXR1cm4gVj9OKCgpPT57YyhWKX0sMCk6KE5sLnB1c2goVCksa2xbYl09VCksTigoKT0+e28oKX0sMCksVH0sZ0UsaEUpLFBBPVRlKHBFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPU5sWzBdO2lmKCFyfHxyLnJlYWR5U3RhdGUhPT1yLk9QRU4pe24oIldlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIik7cmV0dXJufXIuc2VuZCh7ZGF0YTplLmRhdGF9LCExKSx0KCl9LHZFKSxJQT1UZShtRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1ObFswXTtpZighcil7bigiV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTtyZXR1cm59ci5yZWFkeVN0YXRlPXIuQ0xPU0lORyxyLmNsb3NlKGUsITEpLHQoKX0sX0UpO2Z1bmN0aW9uIEJjKGUpe2xldCB0PWBvblNvY2tldCR7ei5jYXBpdGFsaXplKGUpfWA7cmV0dXJuIHBuKHQsKCk9PntKdVtlXT10fSl9bGV0IE5BPUJjKCJvcGVuIiksa0E9QmMoImVycm9yIiksUkE9QmMoIm1lc3NhZ2UiKSx4QT1CYygiY2xvc2UiKTtjbGFzcyBCQXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jYWxsYmFja3M9W10sdGhpcy5fdXBsb2FkZXI9dCx0LmFkZEV2ZW50TGlzdGVuZXIoInN0YXRlY2hhbmdlZCIsKG4scik9PntuLnVwbG9hZGVkU2l6ZSYmbi50b3RhbFNpemUmJnRoaXMuX2NhbGxiYWNrcy5mb3JFYWNoKG89PntvKHtwcm9ncmVzczpwYXJzZUludChTdHJpbmcobi51cGxvYWRlZFNpemUvbi50b3RhbFNpemUqMTAwKSksdG90YWxCeXRlc1NlbnQ6bi51cGxvYWRlZFNpemUsdG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kOm4udG90YWxTaXplfSl9KX0pfWFib3J0KCl7dGhpcy5fdXBsb2FkZXIuYWJvcnQoKX1vblByb2dyZXNzVXBkYXRlKHQpeyF6LmlzRnVuY3Rpb24odCl8fHRoaXMuX2NhbGxiYWNrcy5wdXNoKHQpfW9uSGVhZGVyc1JlY2VpdmVkKCl7fW9mZlByb2dyZXNzVXBkYXRlKHQpe2xldCBuPXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKHQpO24+PTAmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UobiwxKX1vZmZIZWFkZXJzUmVjZWl2ZWQoKXt9fWxldCBNQT1VcihjRSwoe3VybDplLHRpbWVvdXQ6dCxoZWFkZXI6bixmb3JtRGF0YTpyLGZpbGVzOm8sZmlsZVBhdGg6YyxuYW1lOmd9LHtyZXNvbHZlOmIscmVqZWN0OlZ9KT0+e3Q9KHR8fFIubmV0d29ya1RpbWVvdXQmJlIubmV0d29ya1RpbWVvdXQudXBsb2FkRmlsZXx8NjAqMWUzKS8xZTM7bGV0IFQ9cy51cGxvYWRlci5jcmVhdGVVcGxvYWQoZSx7dGltZW91dDp0LHJldHJ5OjAscmV0cnlJbnRlcnZhbDowfSwoX2Usd2UpPT57d2U/Yih7ZGF0YTpfZS5yZXNwb25zZVRleHQsc3RhdHVzQ29kZTp3ZX0pOlYoYHN0YXR1c0NvZGU6ICR7d2V9YCl9KTtmb3IobGV0IF9lIGluIG4pei5oYXNPd24obixfZSkmJlQuc2V0UmVxdWVzdEhlYWRlcihfZSxTdHJpbmcobltfZV0pKTtmb3IobGV0IF9lIGluIHIpei5oYXNPd24ocixfZSkmJlQuYWRkRGF0YShfZSxTdHJpbmcocltfZV0pKTtvJiZvLmxlbmd0aD9vLmZvckVhY2goX2U9PntULmFkZEZpbGUoamUoX2UudXJpKSx7a2V5Ol9lLm5hbWV8fCJmaWxlIn0pfSk6VC5hZGRGaWxlKGplKGMpLHtrZXk6Z30pO2xldCBMPW5ldyBCQShUKTtyZXR1cm4gVC5zdGFydCgpLEx9LGZFLHVFKSxQcz17fSxEQT1bInBsYXkiLCJjYW5wbGF5IiwiZW5kZWQiLCJzdG9wIiwid2FpdGluZyIsInNlZWtpbmciLCJzZWVrZWQiLCJwYXVzZSJdLGRnPSJwbGF5YmFjayIsTEE9MjAwLEZBPWU9PntsZXQgdD1Qc1tlXTshdHx8dC5pbml0U3RhdGVDaGFnZXx8KHQuaW5pdFN0YXRlQ2hhZ2U9ITAsdC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsbj0+e2hnKHtzdGF0ZToiZXJyb3IiLGF1ZGlvSWQ6ZSxlcnJNc2c6Ik1lZGlhRXJyb3IiLGVyckNvZGU6bi5jb2RlfSl9KSxEQS5mb3JFYWNoKG49Pnt0LmFkZEV2ZW50TGlzdGVuZXIobiwoKT0+e249PT0icGxheSI/dC5pc1N0b3BwZWQ9ITE6bj09PSJzdG9wIiYmKHQuaXNTdG9wcGVkPSEwKSxoZyh7c3RhdGU6bixhdWRpb0lkOmV9KX0pfSkpfTtmdW5jdGlvbiBWQSgpe2xldCBlPWAke0RhdGUubm93KCl9JHtNYXRoLnJhbmRvbSgpfWAsdD1Qc1tlXT1zLmF1ZGlvLmNyZWF0ZVBsYXllcigiIik7cmV0dXJuIHQuc3JjPSIiLHQudm9sdW1lPTEsdC5zdGFydFRpbWU9MCx0LnNldFNlc3Npb25DYXRlZ29yeShkZykse2Vyck1zZzoiY3JlYXRlQXVkaW9JbnN0YW5jZTpvayIsYXVkaW9JZDplfX1mdW5jdGlvbiBVQSh7YXVkaW9JZDplLHNyYzp0LHN0YXJ0VGltZTpuLGF1dG9wbGF5OnI9ITEsbG9vcDpvPSExLG9iZXlNdXRlU3dpdGNoOmMsdm9sdW1lOmcsc2Vzc2lvbkNhdGVnb3J5OmI9ZGcscGxheWJhY2tSYXRlOlZ9KXtsZXQgVD1Qc1tlXTtpZihUKXtsZXQgTD17bG9vcDpvLGF1dG9wbGF5OnJ9O2lmKHQpe2xldCBfZT1qZSh0KTtULnNyYyE9PV9lJiYoVC5zcmM9TC5zcmM9X2UpfW4mJihULnN0YXJ0VGltZT1MLnN0YXJ0VGltZT1uKSx0eXBlb2YgZz09Im51bWJlciImJihULnZvbHVtZT1MLnZvbHVtZT1nKSxULnNldFN0eWxlcyhMKSxiJiZULnNldFNlc3Npb25DYXRlZ29yeShiKSxWJiZULnBsYXliYWNrUmF0ZSYmVC5wbGF5YmFja1JhdGUoViksRkEoZSl9cmV0dXJue2Vyck1zZzoic2V0QXVkaW9TdGF0ZTpvayJ9fWZ1bmN0aW9uICRBKHthdWRpb0lkOmV9KXtsZXQgdD1Qc1tlXTtpZighdClyZXR1cm57ZXJyTXNnOiJnZXRBdWRpb1N0YXRlOmZhaWwifTtsZXR7c3JjOm4sc3RhcnRUaW1lOnIsdm9sdW1lOm99PXQ7cmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpvayIsZHVyYXRpb246MWUzKih0LmdldER1cmF0aW9uKCl8fDApLGN1cnJlbnRUaW1lOnQuaXNTdG9wcGVkPzA6MWUzKnQuZ2V0UG9zaXRpb24oKSxwYXVzZWQ6dC5pc1BhdXNlZCgpLHNyYzpuLHZvbHVtZTpvLHN0YXJ0VGltZToxZTMqcixidWZmZXJlZDoxZTMqdC5nZXRCdWZmZXJlZCgpfX1mdW5jdGlvbiBIQSh7b3BlcmF0aW9uVHlwZTplLGF1ZGlvSWQ6dCxjdXJyZW50VGltZTpufSl7bGV0IHI9UHNbdF07c3dpdGNoKGUpe2Nhc2UicGxheSI6Y2FzZSJwYXVzZSI6Y2FzZSJzdG9wIjpyW2U9PT0icGxheSImJnIuaXNQYXVzZWQoKT8icmVzdW1lIjplXSgpO2JyZWFrO2Nhc2Uic2VlayI6dHlwZW9mIG4hPSJ1bmRlZmluZWQiJiZyLnNlZWtUbyhuLzFlMyk7YnJlYWt9cmV0dXJue2Vyck1zZzoib3BlcmF0ZUF1ZGlvOm9rIn19bGV0IEt1PU9iamVjdC5jcmVhdGUobnVsbCksaGc9KHtzdGF0ZTplLGF1ZGlvSWQ6dCxlcnJNc2c6bixlcnJDb2RlOnJ9KT0+e2xldCBvPUt1W3RdO2lmKG8paWYoWHUobyxlLG4sciksZT09PSJwbGF5Iil7bGV0IGM9by5jdXJyZW50VGltZTtYdShvLCJ0aW1lVXBkYXRlIiksby5fX3RpbWluZz1oKCgpPT57by5jdXJyZW50VGltZSE9PWMmJlh1KG8sInRpbWVVcGRhdGUiKX0sTEEpfWVsc2UoZT09PSJwYXVzZSJ8fGU9PT0ic3RvcCJ8fGU9PT0iZXJyb3IiKSYmeShvLl9fdGltaW5nKX0sakE9W3tuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJhdXRvcGxheSIsZGVmYXVsdDohMSxjYWNoZTohMH0se25hbWU6Imxvb3AiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJvYmV5TXV0ZVN3aXRjaCIsZGVmYXVsdDohMCxyZWFkb25seTohMCxjYWNoZTohMH0se25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ2b2x1bWUifSx7bmFtZToicGxheWJhY2tSYXRlIixjYWNoZTohMH1dO2NsYXNzIFp1e2NvbnN0cnVjdG9yKHQpe3RoaXMuaWQ9dCx0aGlzLl9jYWxsYmFja3M9e30sdGhpcy5fb3B0aW9ucz17fSxLZC5mb3JFYWNoKG49Pnt0aGlzLl9jYWxsYmFja3Nbbl09W119KSxqQS5mb3JFYWNoKG49PntsZXQgcj1uLm5hbWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMscix7Z2V0OigpPT57bGV0IG89bi5jYWNoZT90aGlzLl9vcHRpb25zOiRBKHthdWRpb0lkOnRoaXMuaWR9KSxjPXIgaW4gbz9vW3JdOm4uZGVmYXVsdDtyZXR1cm4gdHlwZW9mIGM9PSJudW1iZXIiJiZyIT09InZvbHVtZSI/Yy8xZTM6Y30sc2V0Om4ucmVhZG9ubHk/dm9pZCAwOm89Pnt0aGlzLl9vcHRpb25zW3JdPW8sVUEoei5leHRlbmQoe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSkpfX0pfSksekEoKX1wbGF5KCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfXBhdXNlKCl7dGhpcy5fb3BlcmF0ZSgicGF1c2UiKX1zdG9wKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfXNlZWsodCl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOnQqMWUzfSl9ZGVzdHJveSgpe3kodGhpcy5fX3RpbWluZyksUHNbdGhpcy5pZF0mJihQc1t0aGlzLmlkXS5jbG9zZSgpLGRlbGV0ZSBQc1t0aGlzLmlkXSksZGVsZXRlIEt1W3RoaXMuaWRdfV9vcGVyYXRlKHQsbil7SEEoei5leHRlbmQoe30sbix7YXVkaW9JZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6dH0pKX19bGV0IHpBPUoub25jZSgoKT0+e0tkLmZvckVhY2goZT0+e1p1LnByb3RvdHlwZVtlXT1mdW5jdGlvbih0KXt6LmlzRnVuY3Rpb24odCkmJnRoaXMuX2NhbGxiYWNrc1tlXS5wdXNoKHQpfX0pLFVfLmZvckVhY2goZT0+e1p1LnByb3RvdHlwZVtlXT1mdW5jdGlvbih0KXtsZXQgbj10aGlzLl9jYWxsYmFja3NbZV0scj1uLmluZGV4T2YodCk7cj49MCYmbi5zcGxpY2UociwxKX19KX0pO2Z1bmN0aW9uIFh1KGUsdCxuLHIpe2xldCBvPWBvbiR7ei5jYXBpdGFsaXplKHQpfWA7ZS5fY2FsbGJhY2tzW29dLmZvckVhY2goYz0+e3ouaXNGdW5jdGlvbihjKSYmYyh0PT09ImVycm9yIj97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX1sZXQgV0E9RHQocF8sKCk9PntsZXR7YXVkaW9JZDplfT1WQSgpLHQ9bmV3IFp1KGUpO3JldHVybiBLdVtlXT10LHR9KSxHQT1bImNhbnBsYXkiLCJwbGF5IiwicGF1c2UiLCJzdG9wIiwiZW5kZWQiLCJ0aW1lVXBkYXRlIiwicHJldiIsIm5leHQiLCJlcnJvciIsIndhaXRpbmciXSxnZz17Y2FucGxheTpbXSxwbGF5OltdLHBhdXNlOltdLHN0b3A6W10sZW5kZWQ6W10sdGltZVVwZGF0ZTpbXSxwcmV2OltdLG5leHQ6W10sZXJyb3I6W10sd2FpdGluZzpbXX0sbG4sUXU9bnVsbCxZQT0yNTAscUE9WyJwbGF5IiwicGF1c2UiLCJlbmRlZCIsInN0b3AiLCJjYW5wbGF5Il07ZnVuY3Rpb24gSkEoKXtNYygpLGVsKHtzdGF0ZToidGltZVVwZGF0ZSJ9KSxRdT1oKCgpPT57ZWwoe3N0YXRlOiJ0aW1lVXBkYXRlIn0pfSxZQSl9ZnVuY3Rpb24gTWMoKXtRdSE9PW51bGwmJnkoUXUpfWZ1bmN0aW9uIEtBKCl7aWYobG4pcmV0dXJuO2xldCBlPW90Lmludm9rZU9uQ2FsbGJhY2s7bG49cy5hdWRpby5jcmVhdGVQbGF5ZXIoe2F1dG9wbGF5OiEwLGJhY2tncm91bmRDb250cm9sOiEwfSksbG4uc3JjPWxuLnRpdGxlPWxuLmVwbmFtZT1sbi5zaW5nZXI9bG4uY292ZXJJbWdVcmw9bG4ud2ViVXJsPSIiLGxuLnN0YXJ0VGltZT0wLHFBLmZvckVhY2godD0+e2xuLmFkZEV2ZW50TGlzdGVuZXIodCwoKT0+e3Q9PT0icGxheSI/KGxuLmlzU3RvcHBlZD0hMSxKQSgpKTp0PT09InN0b3AiJiYobG4uaXNTdG9wcGVkPSEwKSwodD09PSJwYXVzZSJ8fHQ9PT0iZW5kZWQifHx0PT09InN0b3AiKSYmTWMoKTtsZXQgbj1gb25NdXNpYyR7dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSl9YDtlKG4se2RhdGFVcmw6bG4uc3JjLGVyck1zZzpgJHtufTpva2B9KSxlbCh7c3RhdGU6dCxkYXRhVXJsOmxuLnNyY30pfSl9KSxsbi5hZGRFdmVudExpc3RlbmVyKCJ3YWl0aW5nIiwoKT0+e01jKCksZWwoe3N0YXRlOiJ3YWl0aW5nIixkYXRhVXJsOmxuLnNyY30pfSksbG4uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHQ9PntNYygpLGUoIm9uTXVzaWNFcnJvciIse2RhdGFVcmw6bG4uc3JjLGVyck1zZzoiRXJyb3I6Iit0Lm1lc3NhZ2V9KSxlbCh7c3RhdGU6ImVycm9yIixkYXRhVXJsOmxuLnNyYyxlcnJNc2c6dC5tZXNzYWdlLGVyckNvZGU6dC5jb2RlfSl9KSxsbi5hZGRFdmVudExpc3RlbmVyKCJwcmV2IiwoKT0+e2VsKHtzdGF0ZToicHJldiJ9KX0pLGxuLmFkZEV2ZW50TGlzdGVuZXIoIm5leHQiLCgpPT57ZWwoe3N0YXRlOiJuZXh0In0pfSl9ZnVuY3Rpb24gWkEoKXtsZXQgZT17ZHVyYXRpb246MCxjdXJyZW50VGltZTowLHBhdXNlZDohMSxzcmM6IiIsYnVmZmVyZWQ6MCx0aXRsZToiIixlcG5hbWU6IiIsc2luZ2VyOiIiLGNvdmVySW1nVXJsOiIiLHdlYlVybDoiIixzdGFydFRpbWU6MCxlcnJNc2c6ImdldEJhY2tncm91bmRBdWRpb1N0YXRlOm9rIn07aWYobG4pe2xldCB0PXtkdXJhdGlvbjpsbi5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRUaW1lOmxuLmlzU3RvcHBlZD8wOmxuLmdldFBvc2l0aW9uKCkscGF1c2VkOmxuLmlzUGF1c2VkKCksc3JjOmxuLnNyYyxidWZmZXJlZDpsbi5nZXRCdWZmZXJlZCgpLHRpdGxlOmxuLnRpdGxlLGVwbmFtZTpsbi5lcG5hbWUsc2luZ2VyOmxuLnNpbmdlcixjb3ZlckltZ1VybDpsbi5jb3ZlckltZ1VybCx3ZWJVcmw6bG4ud2ViVXJsLHN0YXJ0VGltZTpsbi5zdGFydFRpbWV9O2U9ei5leHRlbmQoZSx0KX1yZXR1cm4gZX1mdW5jdGlvbiBwZyhlLHQpe0tBKCk7bGV0IG49WyJzcmMiLCJzdGFydFRpbWUiLCJjb3ZlckltZ1VybCIsIndlYlVybCIsInNpbmdlciIsImVwbmFtZSIsInRpdGxlIl07aWYodD09PSJwbGF5YmFja1JhdGUiKXtsZXQgbz1lW3RdO2xuLnBsYXliYWNrUmF0ZSYmbG4ucGxheWJhY2tSYXRlKHBhcnNlRmxvYXQobykpO3JldHVybn1sZXQgcj17fTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKG89PntpZihuLmluZGV4T2Yobyk+PTApe2xldCBjPWVbb107bz09PW5bMF0mJmMmJihjPWplKGMpKSxsbltvXT1yW29dPWN9fSksbG4uc2V0U3R5bGVzKHIpfWZ1bmN0aW9uIFhBKHtvcGVyYXRpb25UeXBlOmUsc3JjOnQscG9zaXRpb246bixhcGk6cj0ib3BlcmF0ZU11c2ljUGxheWVyIix0aXRsZTpvLGNvdmVySW1nVXJsOmN9KXt2YXIgZz1bInJlc3VtZSIsInBhdXNlIiwic3RvcCJdO3JldHVybiBnLmluZGV4T2YoZSk+MD9sbiYmbG5bZV0oKTplPT09InBsYXkiPyhwZyh7c3JjOnQsc3RhcnRUaW1lOm4sdGl0bGU6byxjb3ZlckltZ1VybDpjfSksbG4ucGxheSgpKTplPT09InNlZWsiJiZsbiYmbG4uc2Vla1RvKG4pLHtlcnJNc2c6YCR7cn06b2tgfX1mdW5jdGlvbiBRQSh7b3BlcmF0aW9uVHlwZTplLHNyYzp0LHN0YXJ0VGltZTpuLGN1cnJlbnRUaW1lOnJ9KXtyZXR1cm4gWEEoe29wZXJhdGlvblR5cGU6ZSxzcmM6dCxwb3NpdGlvbjpufHxyfHwwLGFwaToib3BlcmF0ZUJhY2tncm91bmRBdWRpbyJ9KX1mdW5jdGlvbiBlbCh7c3RhdGU6ZSxlcnJNc2c6dCxlcnJDb2RlOm4sZGF0YVVybDpyfSl7Z2dbZV0uZm9yRWFjaChvPT57ei5pc0Z1bmN0aW9uKG8pJiZvKGU9PT0iZXJyb3IiP3tlcnJNc2c6dCxlcnJDb2RlOm59Ont9KX0pfWxldCBlTz1KLm9uY2UoKCk9PntHQS5mb3JFYWNoKGU9Pnt2Zy5wcm90b3R5cGVbYG9uJHt6LmNhcGl0YWxpemUoZSl9YF09ZnVuY3Rpb24odCl7Z2dbZV0ucHVzaCh0KX19KX0pLHRPPVt7bmFtZToiZHVyYXRpb24iLHJlYWRvbmx5OiEwfSx7bmFtZToiY3VycmVudFRpbWUiLHJlYWRvbmx5OiEwfSx7bmFtZToicGF1c2VkIixyZWFkb25seTohMH0se25hbWU6InNyYyIsY2FjaGU6ITB9LHtuYW1lOiJzdGFydFRpbWUiLGRlZmF1bHQ6MCxjYWNoZTohMH0se25hbWU6ImJ1ZmZlcmVkIixyZWFkb25seTohMH0se25hbWU6InRpdGxlIixjYWNoZTohMH0se25hbWU6ImVwbmFtZSIsY2FjaGU6ITB9LHtuYW1lOiJzaW5nZXIiLGNhY2hlOiEwfSx7bmFtZToiY292ZXJJbWdVcmwiLGNhY2hlOiEwfSx7bmFtZToid2ViVXJsIixjYWNoZTohMH0se25hbWU6InByb3RvY29sIixyZWFkb25seTohMCxkZWZhdWx0OiJodHRwIn0se25hbWU6InBsYXliYWNrUmF0ZSIsZGVmYXVsdDoxLGNhY2hlOiEwfV07Y2xhc3Mgdmd7Y29uc3RydWN0b3IoKXt0aGlzLl9vcHRpb25zPXt9LHRPLmZvckVhY2godD0+e2xldCBuPXQubmFtZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxuLHtnZXQ6KCk9PntsZXQgcj10LmNhY2hlP3RoaXMuX29wdGlvbnM6WkEoKTtyZXR1cm4gbiBpbiByP3Jbbl06dC5kZWZhdWx0fSxzZXQ6dC5yZWFkb25seT92b2lkIDA6cj0+e3RoaXMuX29wdGlvbnNbbl09cixwZyh0aGlzLl9vcHRpb25zLG4pfX0pfSksZU8oKX1wbGF5KCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfXBhdXNlKCl7dGhpcy5fb3BlcmF0ZSgicGF1c2UiKX1zdG9wKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfXNlZWsodCl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOnR9KX1fb3BlcmF0ZSh0LG4pe1FBKHouZXh0ZW5kKHt9LG4se29wZXJhdGlvblR5cGU6dH0pKX19bGV0IG1nLG5PPUR0KHhiLCgpPT5tZ3x8KG1nPW5ldyB2ZykpO2NsYXNzIHJPe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMuY3R4PW59c3RhcnQodCl7cmV0dXJuIFl0KHRoaXMuY3R4LCJzdGFydCIsdCl9c3RvcCh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInN0b3AiLHQpfXBhdXNlKHQpe3JldHVybiBZdCh0aGlzLmN0eCwicGF1c2UiLHQpfXJlc3VtZSh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInJlc3VtZSIsdCl9c3dpdGNoQ2FtZXJhKHQpe3JldHVybiBZdCh0aGlzLmN0eCwic3dpdGNoQ2FtZXJhIix0KX1zbmFwc2hvdCh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInNuYXBzaG90Iix0KX10b2dnbGVUb3JjaCh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInRvZ2dsZVRvcmNoIix0KX1wbGF5QkdNKHQpe3JldHVybiBqdCh0aGlzLmN0eCwicGxheUJHTSIsdCl9c3RvcEJHTSh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInN0b3BCR00iLHQpfXBhdXNlQkdNKHQpe3JldHVybiBZdCh0aGlzLmN0eCwicGF1c2VCR00iLHQpfXJlc3VtZUJHTSh0KXtyZXR1cm4gWXQodGhpcy5jdHgsInJlc3VtZUJHTSIsdCl9c2V0QkdNVm9sdW1lKHQpe3JldHVybiBqdCh0aGlzLmN0eCwic2V0QkdNVm9sdW1lIix0KX1zdGFydFByZXZpZXcodCl7cmV0dXJuIFl0KHRoaXMuY3R4LCJzdGFydFByZXZpZXciLHQpfXN0b3BQcmV2aWV3KHQpe3JldHVybiBZdCh0aGlzLmN0eCwic3RvcFByZXZpZXciLHQpfX1mdW5jdGlvbiBJcyhlLHQsbixyKXtvdC5pbnZva2VWaWV3TWV0aG9kKCJsaXZlcHVzaGVyLiIrZSx7bGl2ZVB1c2hlcklkOmUsdHlwZTpuLGRhdGE6cn0sdCl9Y2xhc3MgaU97Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1zdGFydCgpe0lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN0YXJ0Iil9c3RvcCgpe0lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN0b3AiKX1wYXVzZSgpe0lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBhdXNlIil9cmVzdW1lKCl7SXModGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVzdW1lIil9c3dpdGNoQ2FtZXJhKCl7SXModGhpcy5pZCx0aGlzLnBhZ2VJZCwic3dpdGNoQ2FtZXJhIil9c3RhcnRQcmV2aWV3KCl7SXModGhpcy5pZCx0aGlzLnBhZ2VJZCwicHJldmlldyIpfXN0b3BQcmV2aWV3KCl7SXModGhpcy5pZCx0aGlzLnBhZ2VJZCwic3RvcCIpfXNuYXBzaG90KCl7SXModGhpcy5pZCx0aGlzLnBhZ2VJZCwic25hcHNob3QiKX19bGV0IG9PPUR0KHZfLChlLHQpPT57aWYodC4kcGFnZS5tZXRhLmlzTlZ1ZSl7aWYoIXQpcmV0dXJuIGNvbnNvbGUud2FybigidW5pLmNyZWF0ZUxpdmVQdXNoZXJDb250ZXh0OiAyIGFyZ3VtZW50cyByZXF1aXJlZCwgYnV0IG9ubHkgMSBwcmVzZW50Iik7bGV0IG49VXQoZSx0KTtyZXR1cm4gbj9uZXcgck8oZSxuKTpjb25zb2xlLndhcm4oIkNhbiBub3QgZmluZCBgIitlKyJgIil9cmV0dXJuIG5ldyBpTyhlLHQuJHBhZ2UuaWQpfSxtXyksUGk9My4xNDE1OTI2NTM1ODk3OTMsRGM9NjM3ODI0NSxMYz0uMDA2NjkzNDIxNjIyOTY1OTQzO2Z1bmN0aW9uIGFPKGUsdCl7aWYodD0rdCxlPStlLF9nKGUsdCkpcmV0dXJuW2UsdF07bGV0IG49YmcoZS0xMDUsdC0zNSkscj15ZyhlLTEwNSx0LTM1KSxvPXQvMTgwKlBpLGM9TWF0aC5zaW4obyk7Yz0xLUxjKmMqYztsZXQgZz1NYXRoLnNxcnQoYyk7bj1uKjE4MC8oRGMqKDEtTGMpLyhjKmcpKlBpKSxyPXIqMTgwLyhEYy9nKk1hdGguY29zKG8pKlBpKTtsZXQgYj10K24sVj1lK3I7cmV0dXJuW2UqMi1WLHQqMi1iXX1mdW5jdGlvbiBzTyhlLHQpe2lmKHQ9K3QsZT0rZSxfZyhlLHQpKXJldHVybltlLHRdO2xldCBuPWJnKGUtMTA1LHQtMzUpLHI9eWcoZS0xMDUsdC0zNSksbz10LzE4MCpQaSxjPU1hdGguc2luKG8pO2M9MS1MYypjKmM7bGV0IGc9TWF0aC5zcXJ0KGMpO249bioxODAvKERjKigxLUxjKS8oYypnKSpQaSkscj1yKjE4MC8oRGMvZypNYXRoLmNvcyhvKSpQaSk7bGV0IGI9dCtuO3JldHVybltlK3IsYl19bGV0IF9nPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU8NzIuMDA0fHxlPjEzNy44MzQ3fHx0PC44MjkzfHx0PjU1LjgyNzF8fCExfSxiZz1mdW5jdGlvbihlLHQpe2xldCBuPS0xMDArMiplKzMqdCsuMip0KnQrLjEqZSp0Ky4yKk1hdGguc3FydChNYXRoLmFicyhlKSk7cmV0dXJuIG4rPSgyMCpNYXRoLnNpbig2KmUqUGkpKzIwKk1hdGguc2luKDIqZSpQaSkpKjIvMyxuKz0oMjAqTWF0aC5zaW4odCpQaSkrNDAqTWF0aC5zaW4odC8zKlBpKSkqMi8zLG4rPSgxNjAqTWF0aC5zaW4odC8xMipQaSkrMzIwKk1hdGguc2luKHQqUGkvMzApKSoyLzMsbn0seWc9ZnVuY3Rpb24oZSx0KXtsZXQgbj0zMDArZSsyKnQrLjEqZSplKy4xKmUqdCsuMSpNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0oMjAqTWF0aC5zaW4oNiplKlBpKSsyMCpNYXRoLnNpbigyKmUqUGkpKSoyLzMsbis9KDIwKk1hdGguc2luKGUqUGkpKzQwKk1hdGguc2luKGUvMypQaSkpKjIvMyxuKz0oMTUwKk1hdGguc2luKGUvMTIqUGkpKzMwMCpNYXRoLnNpbihlLzMwKlBpKSkqMi8zLG59O2Z1bmN0aW9uIEVnKGUsdCxuKXtsZXQgcj10LmNvb3JkcztpZihlIT09dC5jb29yZHNUeXBlKXtsZXQgbztlPT09Indnczg0Ij9vPWFPKHIubG9uZ2l0dWRlLHIubGF0aXR1ZGUpOmU9PT0iZ2NqMDIiJiYobz1zTyhyLmxvbmdpdHVkZSxyLmxhdGl0dWRlKSksbyYmKHIubG9uZ2l0dWRlPW9bMF0sci5sYXRpdHVkZT1vWzFdKX1uKHt0eXBlOmUsYWx0aXR1ZGU6ci5hbHRpdHVkZXx8MCxsYXRpdHVkZTpyLmxhdGl0dWRlLGxvbmdpdHVkZTpyLmxvbmdpdHVkZSxzcGVlZDpyLnNwZWVkLGFjY3VyYWN5OnIuYWNjdXJhY3ksYWRkcmVzczp0LmFkZHJlc3MsZXJyTXNnOiJnZXRMb2NhdGlvbjpvayJ9KX1sZXQgbE89VGUocHksKHt0eXBlOmU9Indnczg0IixnZW9jb2RlOnQ9ITEsYWx0aXR1ZGU6bj0hMSxoaWdoQWNjdXJhY3lFeHBpcmVUaW1lOnIsaXNIaWdoQWNjdXJhY3k6bz0hMX0se3Jlc29sdmU6YyxyZWplY3Q6Z30pPT57cy5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oYj0+e0VnKGUsYixjKX0sYj0+e2lmKGIuY29kZT09PTE1MDEpe0VnKGUsYixjKTtyZXR1cm59ZygiZ2V0TG9jYXRpb246ZmFpbCAiK2IubWVzc2FnZSl9LHtnZW9jb2RlOnQsZW5hYmxlSGlnaEFjY3VyYWN5Om98fG4sdGltZW91dDpyLGNvb3Jkc1R5cGU6ZX0pfSxteSx2eSksY089VGUoaHksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IG89V2goKSE9PSJsaWdodCIsYyxnPVlpKHt1cmw6Il9fdW5pYXBwY2hvb3NlbG9jYXRpb24iLGRhdGE6ei5leHRlbmQoe30sZSx7bG9jYWxlOktsKCl9KSxzdHlsZTp7YW5pbWF0aW9uVHlwZTplLmFuaW1hdGlvblR5cGV8fCJzbGlkZS1pbi1ib3R0b20iLHRpdGxlTlZpZXc6ITEscG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSJ9LG9uTWVzc2FnZSh7ZXZlbnQ6YixkZXRhaWw6Vn0pe2I9PT0ic2VsZWN0ZWQiJiYoYz1WKX0sb25DbG9zZSgpe28mJnMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksYz90KGMpOm4oImNhbmNlbCIpfX0pO28mJihzLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxnLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsKHt0eXBlOmIscmVzdWx0OlZ9KT0+e2I9PT0ic3RhcnQiP3MubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6Yj09PSJlbmQiJiYhViYmcy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSl9LGd5KSx1Tz1UZShfeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PihZaSh7dXJsOiJfX3VuaWFwcG9wZW5sb2NhdGlvbiIsZGF0YTp6LmV4dGVuZCh7fSxlLHtsb2NhbGU6S2woKX0pLHN0eWxlOnt0aXRsZU5WaWV3Ont0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25DbG9zZSgpe24oImNhbmNlbCIpfX0pLHQoKSkseXksYnkpLEZjPSExLHNjPTAsZk89VGUoYkUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57c2M9c2N8fHMuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihyPT57RmM9ITAsb3QuaW52b2tlT25DYWxsYmFjayhDaCxyLmNvb3Jkcyl9LHI9PntGY3x8KG4oci5tZXNzYWdlKSxGYz0hMCksb3QuaW52b2tlT25DYWxsYmFjayhBaCx7ZXJyTXNnOmBvbkxvY2F0aW9uQ2hhbmdlOmZhaWwgJHtyLm1lc3NhZ2V9YH0pfSx7Y29vcmRzVHlwZTplPT1udWxsP3ZvaWQgMDplLnR5cGV9KSxOKHQsMTAwKX0sd0UsQ0UpLGRPPVRlKHlFLChlLHtyZXNvbHZlOnR9KT0+e3NjJiYocy5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKHNjKSxGYz0hMSxzYz0wKSx0KCl9KSxoTz1wbihDaCwoKT0+e30pLGdPPVhyKEVFLCgpPT57fSkscE89cG4oQWgsKCk9Pnt9KSx2Tz1YcihTRSwoKT0+e30pLG1PPVRlKGxTLCh7dGl0bGU6ZT0iIixjb250ZW50OnQ9IiIsc2hvd0NhbmNlbDpuPSEwLGNhbmNlbFRleHQ6cixjYW5jZWxDb2xvcjpvLGNvbmZpcm1UZXh0OmMsY29uZmlybUNvbG9yOmcsZWRpdGFibGU6Yj0hMSxwbGFjZWhvbGRlclRleHQ6Vj0iIn09e30se3Jlc29sdmU6VH0pPT57bGV0IEw9bj9bcixjXTpbY10sX2U9Yj9WOkw7dD10fHwiICIscy5uYXRpdmVVSVtiPyJwcm9tcHQiOiJjb25maXJtIl0odCx3ZT0+e2lmKG4pe2xldCBQZT13ZS5pbmRleD09PTEsZnQ9e2NvbmZpcm06UGUsY2FuY2VsOndlLmluZGV4PT09MHx8d2UuaW5kZXg9PT0tMX07UGUmJmImJihmdC5jb250ZW50PXdlLnZhbHVlKSxUKGZ0KX1lbHNle2xldCBQZT17Y29uZmlybTp3ZS5pbmRleD09PTAsY2FuY2VsOiExfTtiJiYoUGUuY29udGVudD13ZS52YWx1ZSksVChQZSl9fSxlLF9lLEwpfSxjUyx1UyksX089e2xpZ2h0OntpdGVtQ29sb3I6IiMwMDAwMDAifSxkYXJrOntpdGVtQ29sb3I6InJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KSJ9fSxiTz1UZShuUywoe2l0ZW1MaXN0OmU9W10saXRlbUNvbG9yOnQsdGl0bGU6bj0iIixwb3BvdmVyOnJ9LHtyZXNvbHZlOm8scmVqZWN0OmN9KT0+e3Q9PT0iIzAwMCImJlIuZGFya21vZGUmJih0PV9PW3MubmF2aWdhdG9yLmdldFVJU3R5bGUoKV0uaXRlbUNvbG9yKSxrdCgpO2xldHt0Omd9PWFlKCksYj17dGl0bGU6bixjYW5jZWw6ZygidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiKSxidXR0b25zOmUubWFwKFY9Pih7dGl0bGU6Vixjb2xvcjp0fSkpfTtzLm5hdGl2ZVVJLmFjdGlvblNoZWV0KHouZXh0ZW5kKGIse3BvcG92ZXI6cn0pLFY9PntWLmluZGV4PjA/byh7dGFwSW5kZXg6Vi5pbmRleC0xfSk6Yygic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIil9KX0sclMsaVMpLGxjLGVmPSExLFZjPSIiLFVjLHlPPVRlKG9TLChlLHQpPT5TZyh6LmV4dGVuZCh7fSxlLHt0eXBlOiJsb2FkaW5nIixpY29uOiJsb2FkaW5nIn0pLHQpLGFTLHNTKSxTZz0oe3RpdGxlOmU9IiIsaWNvbjp0PSJzdWNjZXNzIixpbWFnZTpuPSIiLGR1cmF0aW9uOnI9MTUwMCxtYXNrOm89ITEscG9zaXRpb246Yyx0eXBlOmc9InRvYXN0IixzdHlsZTpifSx7cmVzb2x2ZTpWLHJlamVjdDpUfSk9PntpZigkYygiIiksVmM9ZyxbInRvcCIsImNlbnRlciIsImJvdHRvbSJdLmluY2x1ZGVzKFN0cmluZyhjKSkpcy5uYXRpdmVVSS50b2FzdChlLHt2ZXJ0aWNhbEFsaWduOmN9KSxlZj0hMDtlbHNle3QmJiF+WyJzdWNjZXNzIiwibG9hZGluZyIsImVycm9yIiwibm9uZSJdLmluZGV4T2YodCkmJih0PSJzdWNjZXNzIik7bGV0IEw9e21vZGFsOm8sYmFjazoidHJhbnNtaXQiLHBhZGRpbmc6IjEwcHgiLHNpemU6IjE2cHgifTshbiYmKCF0fHx0PT09Im5vbmUiKT9MLmxvYWRpbmc9e2Rpc3BsYXk6Im5vbmUifTooTC53aWR0aD0iMTQwcHgiLEwuaGVpZ2h0PSIxMTJweCIpLG4/TC5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOm4saW50ZXJ2YWw6cn06WyJzdWNjZXNzIiwiZXJyb3IiXS5pbmRleE9mKHQpIT09LTEmJihMLmxvYWRpbmc9e2Rpc3BsYXk6ImJsb2NrIixoZWlnaHQ6IjU1cHgiLGljb246dD09PSJzdWNjZXNzIj8iX191bmlhcHBzdWNjZXNzLnBuZyI6Il9fdW5pYXBwZXJyb3IucG5nIixpbnRlcnZhbDpyfSk7dHJ5e2xjPXMubmF0aXZlVUkuc2hvd1dhaXRpbmcoZSx6LmV4dGVuZChMLGIpKX1jYXRjaChfZSl7VChgJHtfZX1gKX19cmV0dXJuIFZjPT09InRvYXN0IiYmKFVjPU4oKCk9PnskYygiIil9LHIpKSxWKCl9LEVPPVRlKGZTLFNnLGhTLGdTKSxTTz1UZSh6RSwoZSx0KT0+JGMoInRvYXN0Iix0KSksd089VGUoakUsKGUsdCk9PiRjKCJsb2FkaW5nIix0KSk7ZnVuY3Rpb24gJGMoZT0idG9hc3QiLHQpe3JldHVybiBlJiZlIT09VmN8fChVYyYmKEUoVWMpLFVjPW51bGwpLGVmP3MubmF0aXZlVUkuY2xvc2VUb2FzdCgpOmxjJiZsYy5jbG9zZSYmbGMuY2xvc2UoKSxsYz1udWxsLGVmPSExLFZjPSIiKSx0JiZ0LnJlc29sdmUoKX1sZXQgQ089VGUocFMsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9emgoKTtpZihyJiZyLmVuZFB1bGxUb1JlZnJlc2goKSxyPVJjKCksIXIpcmV0dXJuIG4oKTtyLmJlZ2luUHVsbFRvUmVmcmVzaCgpLHp1KHIpLHQoKX0pLEFPPVRlKHZTLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPXpoKCl8fFJjKCk7aWYoIXIpcmV0dXJuIG4oKTtyLmVuZFB1bGxUb1JlZnJlc2goKSx6dShudWxsKSx0KCl9KSxPTz1UZShOaCwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1GbihicigpKTtvdC5pbnZva2VWaWV3TWV0aG9kKE5oLGUscixvPT57bz9uKG8pOnQoKX0pfSxXRSksVE89VGUoa2gsKGUse3Jlc29sdmU6dH0pPT57bGV0IG49Rm4oYnIoKSk7b3QuaW52b2tlVmlld01ldGhvZChraCxlLG4sdCl9LGVTLHRTKSxQTz1UZShLRSwoe19fcGFnZV9fOmUsdGl0bGU6dH0se3Jlc29sdmU6bixyZWplY3Q6cn0pPT57bGV0IG89SGgoZSk7aWYobyl7bGV0IGM9by5nZXRTdHlsZSgpO2MmJmMudGl0bGVOVmlldyYmby5zZXRTdHlsZSh7dGl0bGVOVmlldzp7dGl0bGVUZXh0OnR9fSksbigpfWVsc2UgcigpfSxaRSksSU89VGUoWEUsKGUse3Jlc29sdmU6dH0pPT57cy5uYXRpdmVVSS5zaG93V2FpdGluZygiIix7bW9kYWw6ITF9KSx0KCl9KSxOTz1UZShRRSwoZSx7cmVzb2x2ZTp0fSk9PntzLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHQoKX0pO2Z1bmN0aW9uIGtPKGUpe2xldCB0PUluKCk7IXQubGVuZ3RofHwodFt0Lmxlbmd0aC0xXS4kcGFnZS5zdGF0dXNCYXJTdHlsZT1lKX1sZXQgUk89VGUoWUUsKHtfX3BhZ2VfXzplLGZyb250Q29sb3I6dCxiYWNrZ3JvdW5kQ29sb3I6bn0se3Jlc29sdmU6cixyZWplY3Q6b30pPT57bGV0IGM9SGgoZSk7aWYoYyl7bGV0IGc9e307dCYmKGcudGl0bGVDb2xvcj10KSxuJiYoZy5iYWNrZ3JvdW5kQ29sb3I9bik7bGV0IGI9dD09PSIjMDAwMDAwIj8iZGFyayI6ImxpZ2h0IjtzLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShiKSxrTyhiKTtsZXQgVj1jLmdldFN0eWxlKCk7ViYmVi50aXRsZU5WaWV3JiYoVi50aXRsZU5WaWV3LmF1dG9CYWNrQnV0dG9uJiYoZy5iYWNrQnV0dG9uPWcuYmFja0J1dHRvbnx8e30sZy5iYWNrQnV0dG9uLmNvbG9yPXQpLGMuc2V0U3R5bGUoe3RpdGxlTlZpZXc6Z30pKSxyKCl9ZWxzZSBvKCl9LEpFLHFFKSx4Tz1UZShEUywoe2luZGV4OmUsdGV4dDp0fSx7cmVzb2x2ZTpuLHJlamVjdDpyfSk9PntkaS5zZXRUYWJCYXJCYWRnZSgidGV4dCIsZSx0KSxuKCl9LExTLEZTKSxCTz1UZShtUywoe2luZGV4OmUsdGV4dDp0LGljb25QYXRoOm4sc2VsZWN0ZWRJY29uUGF0aDpyLHBhZ2VQYXRoOm8sdmlzaWJsZTpjLGljb25mb250Omd9LHtyZXNvbHZlOmJ9KT0+e2lmKGRpLnNldFRhYkJhckl0ZW0oZSx0LG4scixjLGcpLG8pe2xldCBWPVIudGFiQmFyLmxpc3RbZV07aWYoVil7bGV0IFQ9Vi5wYWdlUGF0aCxMPUoucmVtb3ZlTGVhZGluZ1NsYXNoKG8pO0whPT1UJiZhcyhlLFQsTCl9fWIoKX0sX1MsYlMpLE1PPVRlKHlTLChlPXt9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2lmKCF0YygpKXJldHVybiBuKCJub3QgVGFiQmFyIHBhZ2UiKTtlLmJvcmRlclN0eWxlPUoubm9ybWFsaXplVGFiQmFyU3R5bGVzKGUuYm9yZGVyU3R5bGUpLGRpLnNldFRhYkJhclN0eWxlKGUpLHQoKX0sRVMsd1MpLERPPVRlKENTLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWUmJmUuYW5pbWF0aW9uO2lmKCF0YygpKXJldHVybiBuKCJub3QgVGFiQmFyIHBhZ2UiKTtkaS5oaWRlVGFiQmFyKEJvb2xlYW4ocikpLHQoKX0sUmgpLExPPVRlKEFTLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWUmJmUuYW5pbWF0aW9uO2lmKCF0YygpKXJldHVybiBuKCJub3QgVGFiQmFyIHBhZ2UiKTtkaS5zaG93VGFiQmFyKEJvb2xlYW4ocikpLHQoKX0sT1MpLEZPPVRlKE5TLCh7aW5kZXg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57ZGkuc2V0VGFiQmFyQmFkZ2UoInJlZERvdCIsZSksdCgpfSxrUyxSUyksd2c9ZT0+ZGkuc2V0VGFiQmFyQmFkZ2UoIm5vbmUiLGUpLFZPPVRlKHhTLCh7aW5kZXg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57d2coZSksdCgpfSxCUyxNUyksVU89VGUoVFMsKHtpbmRleDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9Pnt3ZyhlKSx0KCl9LFBTLElTKSxDZz0idmRTeW5jIiwkTz0iX191bmlhcHBfX3NlcnZpY2UiLFJsPSJvbldlYnZpZXdSZWFkeSIsSE89MCxqTz0id2Vidmlld0luc2VydGVkIix6Tz0id2Vidmlld1JlbW92ZWQiLEFnPSJVbmlBcHBTdWJOVnVlIjtjbGFzcyBXT3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuY2FsbGJhY2tzPVtdO2xldCByPXRoaXMud2Vidmlldz1zLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodCk7aWYodGhpcy5pc1N1Yj1ufHwhMSxyLl9fdW5pYXBwX21hc2tfaWQpe2xldCBvPXRoaXMubWFza1dlYnZpZXc9ci5fX3VuaWFwcF9tYXNrX2lkPT09IjAiP3tzZXRTdHlsZSh7bWFzazpnfSl7Sm8oInVuaS10YWJ2aWV3Iikuc2V0TWFzayh7Y29sb3I6Z30pfX06cy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHIuX191bmlhcHBfbWFza19pZCksYz1mdW5jdGlvbigpe28uc2V0U3R5bGUoe21hc2s6Im5vbmUifSl9O3IuYWRkRXZlbnRMaXN0ZW5lcigiaGlkZSIsYyksci5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsYyl9fXNob3coLi4udCl7aWYodGhpcy5tYXNrV2Vidmlldyl7bGV0IG49dGhpcy53ZWJ2aWV3Ll9fdW5pYXBwX21hc2s7dGhpcy5tYXNrV2Vidmlldy5zZXRTdHlsZSh7bWFzazpufSl9dGhpcy53ZWJ2aWV3LnNob3coLi4udCl9aGlkZSguLi50KXt0aGlzLndlYnZpZXcuaGlkZSguLi50KX1zZXRTdHlsZSh0KXt0aGlzLndlYnZpZXcuc2V0U3R5bGUodCl9aW5pdE1lc3NhZ2UoKXtpZih0aGlzLm1lc3NhZ2VSZWFkeSlyZXR1cm47dGhpcy5tZXNzYWdlUmVhZHk9ITA7bGV0IHQ9cj0+e2lmKHIuZGF0YSYmci5kYXRhLnR5cGU9PT1BZyl7bGV0IG89ci5kYXRhLnRhcmdldDtvLmlkPT09dGhpcy53ZWJ2aWV3LmlkJiZvLmlzU3ViPT09dGhpcy5pc1N1YiYmdGhpcy5jYWxsYmFja3MuZm9yRWFjaChjPT57Yyh7b3JpZ2luOnRoaXMud2Vidmlldy5fX3VuaWFwcF9ob3N0LGRhdGE6ci5kYXRhLmRhdGF9KX0pfX07Sm8oImdsb2JhbEV2ZW50IikuYWRkRXZlbnRMaXN0ZW5lcigicGx1c01lc3NhZ2UiLHQpLHRoaXMud2Vidmlldy5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9Pnt0aGlzLmNhbGxiYWNrcy5sZW5ndGg9MH0pfXBvc3RNZXNzYWdlKHQpe3Mud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcoe3R5cGU6QWcsZGF0YTp0LHRhcmdldDp7aWQ6dGhpcy53ZWJ2aWV3LmlkLGlzU3ViOiF0aGlzLmlzU3VifX0sJE8pfW9uTWVzc2FnZSh0KXt0aGlzLmluaXRNZXNzYWdlKCksdGhpcy5jYWxsYmFja3MucHVzaCh0KX19bGV0IEdPPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBXTyhlLHQpfTtmdW5jdGlvbiBZTyhlLHQsbixyLG8sYyxnKXtzIT09biYmKHc9aG49ZSxmPXQscz1uLHp3KHMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKSxzLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1GaCxOPXIsRT1vLGg9Yyx5PWcpLFIuc2VydmljZVJlYWR5PSEwfWZ1bmN0aW9uIHFPKCl7bGV0IGU9WyJBcnJheUJ1ZmZlciIsIkludDhBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkJpZ0ludDY0QXJyYXkiLCJCaWdVaW50NjRBcnJheSJdLHQ9e307Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl07dFtyXT1nbG9iYWxbcl19cmV0dXJuIHR9ZnVuY3Rpb24gSk8oZSl7ei5leHRlbmQoZ2xvYmFsLGUpfWxldCBPZz17b2F1dGgoZSl7cy5vYXV0aC5nZXRTZXJ2aWNlcyh0PT57dD10O2xldCBuPVtdO3QuZm9yRWFjaCgoe2lkOnJ9KT0+e24ucHVzaChyKX0pLGUobnVsbCxuLHQpfSx0PT57dD10LGUodCl9KX0sc2hhcmUoZSl7cy5zaGFyZS5nZXRTZXJ2aWNlcyh0PT57dD10O2xldCBuPVtdO3QuZm9yRWFjaCgoe2lkOnJ9KT0+e24ucHVzaChyKX0pLGUobnVsbCxuLHQpfSx0PT57ZSh0KX0pfSxwYXltZW50KGUpe3MucGF5bWVudC5nZXRDaGFubmVscyh0PT57bGV0IG49W107dC5mb3JFYWNoKCh7aWQ6cn0pPT57bi5wdXNoKHIpfSksZShudWxsLG4sdCl9LHQ9PntlKHQpfSl9LHB1c2goZSl7aWYodHlwZW9mIGYhPSJ1bmRlZmluZWQifHx0eXBlb2YgcyE9InVuZGVmaW5lZCIpe2xldCB0PXMucHVzaC5nZXRDbGllbnRJbmZvKCk7ZShudWxsLFt0LmlkXSxbdF0pfWVsc2UgZShudWxsLFtdKX19LEtPPVRlKFZTLCh7c2VydmljZTplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntPZ1tlXT9PZ1tlXSgocixvPVtdLGM9W10pPT57cj9uKHIubWVzc2FnZSk6dCh7c2VydmljZTplLHByb3ZpZGVyOm8scHJvdmlkZXJzOmMubWFwKGc9Pih0eXBlb2YgZy5zZXJ2aWNlUmVhZHk9PSJib29sZWFuIiYmKGcuaXNBcHBFeGlzdD1nLnNlcnZpY2VSZWFkeSksdHlwZW9mIGcubmF0aXZlQ2xpZW50PT0iYm9vbGVhbiImJihnLmlzQXBwRXhpc3Q9Zy5uYXRpdmVDbGllbnQpLGcpKX0pfSk6bigic2VydmljZSBub3QgZm91bmQiKX0sVVMpLEhjO2Z1bmN0aW9uIGNjKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3Mub2F1dGguZ2V0U2VydmljZXMocj0+e2xldCBvPXIuZmluZCgoe2lkOmN9KT0+Yz09PWUpO28/dChvKTpuKG5ldyBFcnJvcigicHJvdmlkZXIgbm90IGZpbmQiKSl9LG4pfSl9bGV0IFRnPVRlKCRTLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWUucHJvdmlkZXJ8fCJ3ZWl4aW4iLG89ZHIobiksYz1yPT09ImFwcGxlIixnPWM/e3Njb3BlOiJlbWFpbCJ9OmUudW5pdmVyaWZ5U3R5bGU/e3VuaXZlcmlmeVN0eWxlOlFPKGUudW5pdmVyaWZ5U3R5bGUsbyl9Ont9O2NjKHIpLnRoZW4oYj0+e2Z1bmN0aW9uIFYoKXtpZihlLm9ubHlBdXRob3JpemUmJnI9PT0id2VpeGluIil7Yi5hdXRob3JpemUoKHtjb2RlOlR9KT0+e3Qoe2NvZGU6VCxhdXRoUmVzdWx0OiIifSl9LG8pO3JldHVybn1iLmxvZ2luKFQ9PntsZXQgTD1ULnRhcmdldC5hdXRoUmVzdWx0LF9lPVQudGFyZ2V0LmFwcGxlSW5mbzt0KHtjb2RlOkwuY29kZSxhdXRoUmVzdWx0OkwsYXBwbGVJbmZvOl9lfSl9LG8sZyl9Y3x8cj09PSJ1bml2ZXJpZnkiP1YoKTpiLmxvZ291dChWLFYpfSkuY2F0Y2gobyl9LEhTKSxQZz0oZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyfHwid2VpeGluIixvPWRyKG4pO2NjKHIpLnRoZW4oYz0+e2MuZ2V0VXNlckluZm8oZz0+e2xldCBiPXtuaWNrTmFtZToiIn07aWYocj09PSJ3ZWl4aW4iKXtsZXQgVD1jLnVzZXJJbmZvO1QmJihiPXtvcGVuSWQ6VC5vcGVuaWQsbmlja05hbWU6VC5uaWNrbmFtZSxnZW5kZXI6VC5zZXgsY2l0eTpULmNpdHkscHJvdmluY2U6VC5wcm92aW5jZSxjb3VudHJ5OlQuY291bnRyeSxhdmF0YXJVcmw6VC5oZWFkaW1ndXJsLHVuaW9uSWQ6VC51bmlvbmlkfSl9ZWxzZSBpZihyPT09ImFwcGxlIil7bGV0IFQ9Yy5hcHBsZUluZm87VCYmKGI9e29wZW5JZDpULnVzZXIsZnVsbE5hbWU6VC5mdWxsTmFtZSxlbWFpbDpULmVtYWlsLGF1dGhvcml6YXRpb25Db2RlOlQuYXV0aG9yaXphdGlvbkNvZGUsaWRlbnRpdHlUb2tlbjpULmlkZW50aXR5VG9rZW4scmVhbFVzZXJTdGF0dXM6VC5yZWFsVXNlclN0YXR1c30pfWVsc2UgYj1jLnVzZXJJbmZvLGImJihiLm9wZW5JZD1iLm9wZW5JZHx8Yi5vcGVuaWR8fGMuYXV0aFJlc3VsdC5vcGVuaWQsYi5uaWNrTmFtZT1iLm5pY2tOYW1lfHxiLm5pY2tuYW1lLGIuYXZhdGFyVXJsPWIuYXZhdGFyVXJsfHxiLmhlYWRpbWd1cmwpO2xldCBWPXt9O2UuZGF0YSYmZS5kYXRhLmFwaV9uYW1lPT09IndlYmFwaV9nZXR1c2VyaW5mbyI/Vi5kYXRhPXtkYXRhOkpTT04uc3RyaW5naWZ5KGIpLHJhd0RhdGE6IiIsc2lnbmF0dXJlOiIiLGVuY3J5cHRlZERhdGE6IiIsaXY6IiJ9OlYudXNlckluZm89Yix0KFYpfSxvKX0pLmNhdGNoKCgpPT57bigiXHU4QkY3XHU1MTQ4XHU4QzAzXHU3NTI4IHVuaS5sb2dpbiIpfSl9LFpPPVRlKGpTLFBnLHpTKSxYTz1UZShXUyxQZyxHUyksSWc9VGUoWVMsKHtwcm92aWRlcjplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1Ycyh0KSxvPWRyKG4pO2NjKGUpLnRoZW4oYz0+Yy5wcmVMb2dpbihyLG8pKS5jYXRjaChvKX0sS1MsSlMpLE5nPSgpPT5jYygidW5pdmVyaWZ5IikudGhlbihlPT5lLmNsb3NlQXV0aFZpZXcoKSksa2c9RHQoWlMsTmcpLFJnPVRlKFhTLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPVhzKHQpLG89ZHIobik7dHJ5e2NjKCJ1bml2ZXJpZnkiKS50aGVuKGM9PntsZXQgZz1jLmdldENoZWNrQm94U3RhdGUoKTtyKHtzdGF0ZTpnfSl9KX1jYXRjaChjKXtvKGMpfX0pO2Z1bmN0aW9uIFFPKGUsdCl7cmV0dXJuIHouaXNQbGFpbk9iamVjdChlKSYmei5pc1BsYWluT2JqZWN0KGUuYnV0dG9ucykmJnoudG9UeXBlU3RyaW5nKGUuYnV0dG9ucy5saXN0KT09PSJbb2JqZWN0IEFycmF5XSImJmUuYnV0dG9ucy5saXN0LmZvckVhY2goKG4scik9PntlLmJ1dHRvbnMubGlzdFtyXS5vbmNsaWNrPWZ1bmN0aW9uKCl7bGV0IG89e2NvZGU6IjMwMDA4IixtZXNzYWdlOiJcdTc1MjhcdTYyMzdcdTcwQjlcdTUxRkJcdTRFODZcdTgxRUFcdTVCOUFcdTRFNDlcdTYzMDlcdTk0QUUiLGluZGV4OnIscHJvdmlkZXI6bi5wcm92aWRlcn07ei5pc1BsYWluT2JqZWN0KEhjKT9IYy5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljayhvKTpOZygpLnRoZW4oKCk9Pnt0KG8pfSl9fSksZX1jbGFzcyBlVHtjb25zdHJ1Y3Rvcigpe3RoaXMucHJvdmlkZXI9InVuaXZlcmlmeSIsdGhpcy5ldmVudE5hbWU9ImFwaS51bml2ZXJpZnlCdXR0b25zQ2xpY2sifWNsb3NlKCl7cmV0dXJuIGtnKCl9bG9naW4odCl7cmV0dXJuIFRnKHRoaXMuX2dldE9wdGlvbnModCkpfWdldENoZWNrQm94U3RhdGUodCl7cmV0dXJuIFJnKHQpfXByZUxvZ2luKHQpe3JldHVybiBJZyh0aGlzLl9nZXRPcHRpb25zKHQpKX1vbkJ1dHRvbnNDbGljayh0KXtvdC5vbih0aGlzLmV2ZW50TmFtZSx0KX1vZmZCdXR0b25zQ2xpY2sodCl7b3Qub2ZmKHRoaXMuZXZlbnROYW1lLHQpfV90cmlnZ2VyVW5pdmVyaWZ5QnV0dG9uc0NsaWNrKHQpe290LmVtaXQodGhpcy5ldmVudE5hbWUsdCl9X2dldE9wdGlvbnModD17fSl7cmV0dXJuIHouZXh0ZW5kKHt9LHQse3Byb3ZpZGVyOnRoaXMucHJvdmlkZXJ9KX19bGV0IHRUPUR0KFFTLCgpPT5IY3x8KEhjPW5ldyBlVCkpLG5UPVRlKGx3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWNnKCk7aWYoci5ub3RpZmljYXRpb25BdXRob3JpemVkIT09ImF1dGhvcml6ZWQiKXJldHVybiBuKCJub3RpZmljYXRpb25BdXRob3JpemVkOiAiK3Iubm90aWZpY2F0aW9uQXV0aG9yaXplZCk7bGV0IG89ei5leHRlbmQoe30sZSk7ZGVsZXRlIG8uY29udGVudCxkZWxldGUgby5wYXlsb2FkLHMucHVzaC5jcmVhdGVNZXNzYWdlKGUuY29udGVudCxlLnBheWxvYWQsbyksdCgpfSx2b2lkIDAsY3cpLHJUPUR0KCJyZWdpc3RlclJ1bnRpbWUiLGU9Pnt6LmV4dGVuZChqc1J1bnRpbWUsZSl9KSxpVD17MDp7bmFtZToid2ViIix0aXRsZToiXHU1NkZFXHU2NTg3In0sMTp7bmFtZToidGV4dCIsdGl0bGU6Ilx1N0VBRlx1NjU4N1x1NUI1NyJ9LDI6e25hbWU6ImltYWdlIix0aXRsZToiXHU3RUFGXHU1NkZFXHU3MjQ3In0sMzp7bmFtZToibXVzaWMiLHRpdGxlOiJcdTk3RjNcdTRFNTAifSw0OntuYW1lOiJ2aWRlbyIsdGl0bGU6Ilx1ODlDNlx1OTg5MSJ9LDU6e25hbWU6Im1pbmlQcm9ncmFtIix0aXRsZToiXHU1QzBGXHU3QTBCXHU1RThGIn19LG9UPWU9PntlLnR5cGU9ZS50eXBlfHwwO2xldHtwcm92aWRlcjp0LHR5cGU6bix0aXRsZTpyLHN1bW1hcnk6byxocmVmOmMsaW1hZ2VVcmw6ZyxtZWRpYVVybDpiLHNjZW5lOlYsbWluaVByb2dyYW06VCxvcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdDpMLGNvcnBpZDpfZSxjdXN0b21lclVybDp3ZX09ZTt6LmlzU3RyaW5nKGcpJiZnJiYoZz1qZShnKSk7bGV0IFBlPWlUW25dO2lmKFBlKXtsZXQgZnQ9e3Byb3ZpZGVyOnQsdHlwZTpQZS5uYW1lLHRpdGxlOnIsY29udGVudDpvLGhyZWY6YyxwaWN0dXJlczpbZ10sdGh1bWJzOmc/W2ddOnZvaWQgMCxtZWRpYTpiLG1pbmlQcm9ncmFtOlQsZXh0cmE6e3NjZW5lOlZ9LG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OkwsY29ycGlkOl9lLHVybDp3ZX07cmV0dXJuIHQ9PT0id2VpeGluIiYmKG49PT0xfHxuPT09MikmJmRlbGV0ZSBmdC50aHVtYnMsZnR9cmV0dXJuIlx1NTIwNlx1NEVBQlx1NTNDMlx1NjU3MCB0eXBlIFx1NEUwRFx1NkI2M1x1Nzg2RSJ9LHhnPWZ1bmN0aW9uKGUsdCxuLHIsbz0ic2hhcmUiKXtsZXQgYz1kcihyKSxnPXQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQ/Im9wZW5DdXN0b21lclNlcnZpY2VDaGF0Ijoic2VuZCI7dHJ5e2VbZ10odCwoKT0+e24oKX0sYyl9Y2F0Y2goYil7Yyh7bWVzc2FnZTpgJHt0LnByb3ZpZGVyfSAke2d9IFx1NjVCOVx1NkNENVx1OEMwM1x1NzUyOFx1NTkzMVx1OEQyNWB9KX19LGFUPVRlKGV3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPW9UKGUpLG89ZHIobik7aWYoei5pc1N0cmluZyhyKSlyZXR1cm4gbihyKTtzLnNoYXJlLmdldFNlcnZpY2VzKGM9PntsZXQgZz1jLmZpbmQoKHtpZDpifSk9PmI9PT1yLnByb3ZpZGVyKTtnP2cuYXV0aGVudGljYXRlZD94ZyhnLHIsdCxuKTpnLmF1dGhvcml6ZSgoKT0+eGcoZyxyLHQsbiksbyk6bigic2VydmljZSBub3QgZm91bmQiKX0sbyl9LG53LHR3KSxzVD1UZShydywoe3R5cGU6ZSxpbWFnZVVybDp0LHN1bW1hcnk6bixocmVmOnJ9LHtyZXNvbHZlOm8scmVqZWN0OmN9KT0+e2xldCBnPWRyKGMpO3ouaXNTdHJpbmcodCkmJnQmJih0PWplKHQpKSxzLnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOmUscGljdHVyZXM6dD9bdF06dm9pZCAwLGNvbnRlbnQ6bixocmVmOnJ9LCgpPT5vKCksZyl9LG93LGl3KSxsVD1UZShhdywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyLG89ZHIobik7cy5wYXltZW50LmdldENoYW5uZWxzKGM9PntsZXQgZz1jLmZpbmQoKHtpZDpifSk9PmI9PT1yKTtnP3MucGF5bWVudC5yZXF1ZXN0KGcsZS5vcmRlckluZm8sYj0+e3QoYil9LG8pOm4oInNlcnZpY2Ugbm90IGZvdW5kIil9LG8pfSxzdyksQmc9ZWcsY1Q9VGUoIm5hdmlnYXRlVG9NaW5pUHJvZ3JhbSIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57QmcoIm5hdmlnYXRlVG9VbmlNUCIsZSxyPT57aWYoci5lcnJNc2cmJnIuZXJyTXNnLmluZGV4T2YoIjpvayIpPT09LTEpcmV0dXJuIG4oci5lcnJNc2cuc3BsaXQoIiAiKVsxXSk7dCgpfSl9KSxNZz1bXTtmdW5jdGlvbiBEZyhlKXtNZy5wdXNoKGUpfWxldCB1VD1EZztmdW5jdGlvbiBmVChlLHQpe01nLmZvckVhY2gobj0+bihlLHQpKX1mdW5jdGlvbiBkVChlLHQsLi4ubil7bGV0IHI9cFQoZSx0LG4pO3ImJmNvbnNvbGVbZV0ocil9ZnVuY3Rpb24gaFQoKXtyZXR1cm4gdHlwZW9mIF9fY2hhbm5lbElkX189PSJzdHJpbmciJiZfX2NoYW5uZWxJZF9ffWZ1bmN0aW9uIGdUKGUsdCl7c3dpdGNoKHoudG9SYXdUeXBlKHQpKXtjYXNlIkZ1bmN0aW9uIjpyZXR1cm4iZnVuY3Rpb24oKSB7IFtuYXRpdmUgY29kZV0gfSI7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gcFQoZSx0LG4pe3JldHVybiBoVCgpPyhuLnB1c2godC5yZXBsYWNlKCJhdCAiLCJ1bmktYXBwOi8vLyIpKSxjb25zb2xlW2VdLmFwcGx5KGNvbnNvbGUsbikpOm4ubWFwKGZ1bmN0aW9uKG8pe2xldCBjPXoudG9UeXBlU3RyaW5nKG8pLnRvTG93ZXJDYXNlKCk7aWYoWyJbb2JqZWN0IG9iamVjdF0iLCJbb2JqZWN0IGFycmF5XSIsIltvYmplY3QgbW9kdWxlXSJdLmluZGV4T2YoYykhPT0tMSl0cnl7bz0iLS0tQkVHSU46SlNPTi0tLSIrSlNPTi5zdHJpbmdpZnkobyxnVCkrIi0tLUVORDpKU09OLS0tIn1jYXRjaChnKXtvPWN9ZWxzZSBpZihvPT09bnVsbClvPSItLS1OVUxMLS0tIjtlbHNlIGlmKG89PT12b2lkIDApbz0iLS0tVU5ERUZJTkVELS0tIjtlbHNle2xldCBnPXoudG9SYXdUeXBlKG8pLnRvVXBwZXJDYXNlKCk7Zz09PSJOVU1CRVIifHxnPT09IkJPT0xFQU4iP289Ii0tLUJFR0lOOiIrZysiLS0tIitvKyItLS1FTkQ6IitnKyItLS0iOm89U3RyaW5nKG8pfXJldHVybiBvfSkuam9pbigiLS0tQ09NTUEtLS0iKSsiICIrdH1sZXQgdlQ9MSx0Zix1Yz17fTtmdW5jdGlvbiBMZyhlKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIil7bGV0IHQ9T2JqZWN0LmtleXModWMpLmZpbmQocj0+dWNbcl09PT1lKSxuPXQ/cGFyc2VJbnQodCk6dlQrKztyZXR1cm4gdWNbbl09ZSxufWVsc2Ugei5pc1BsYWluT2JqZWN0KGUpJiZPYmplY3Qua2V5cyhlKS5mb3JFYWNoKHQ9PntlW3RdPUxnKGVbdF0pfSk7cmV0dXJuIGV9ZnVuY3Rpb24gbVQoZSx0LG4scil7cmV0dXJuIHJmKGUsdCxuLHIpfWZ1bmN0aW9uIG5mKCl7cmV0dXJuIHRmfHwodGY9UC5yZXF1aXJlTmF0aXZlUGx1Z2luKCJVVFMtUHJveHkiKSksdGZ9ZnVuY3Rpb24gRmcoZSx0LG4scixvKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlx1OEZENFx1NTZERVx1NTAzQ1x1NEUzQVx1RkYxQSIrSlNPTi5zdHJpbmdpZnkodCkrIlx1RkYxQlx1OEJGN1x1NkM0Mlx1NTNDMlx1NjU3MFx1NEUzQVx1RkYxQSIrSlNPTi5zdHJpbmdpZnkoZSkpO2lmKHouaXNTdHJpbmcodCkpdHJ5e3Q9SlNPTi5wYXJzZSh0KX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoYEpTT04ucGFyc2UoJHt0fSk6IGArYyl9aWYodC5lcnJNc2cpdGhyb3cgbmV3IEVycm9yKHQuZXJyTXNnKTtpZihuJiZuLnR5cGU9PT0iaW50ZXJmYWNlIiYmdHlwZW9mIHQucGFyYW1zPT0ibnVtYmVyIil7aWYoIXQucGFyYW1zKXJldHVybiBudWxsO2lmKHQucGFyYW1zPT09ciYmbylyZXR1cm4gbztpZihvZltuLm9wdGlvbnNdKXtsZXQgYz1IZyh6LmV4dGVuZCh7aW5zdGFuY2VJZDp0LnBhcmFtc30sb2Zbbi5vcHRpb25zXSkpO3JldHVybiBuZXcgY319cmV0dXJuIHQucGFyYW1zfWZ1bmN0aW9uIFZnKGUpe2lmKGUuZXJyTXNnKXRocm93IG5ldyBFcnJvcihlLmVyck1zZyk7cmV0dXJuIGRlbGV0ZSBlLmVyck1zZyxGZyhlLG5mKCkuaW52b2tlU3luYyhlLCgpPT57fSkpfWZ1bmN0aW9uIHJmKGUse21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4scGFja2FnZTpyLGNsYXNzOm8sbmFtZTpjLG1ldGhvZDpnLGNvbXBhbmlvbjpiLHBhcmFtczpWLHJldHVybjpULGVyck1zZzpMfSxfZSx3ZSl7bGV0IFBlPSh7aWQ6aHQsbmFtZTpGdCxwYXJhbXM6U3Qsa2VlcEFsaXZlOm1ufSk9PntsZXQgdG49dWNbaHRdO3RuPyh0biguLi5TdCksbW58fGRlbGV0ZSB1Y1todF0pOmNvbnNvbGUuZXJyb3IoYCR7cn0ke299LiR7Y30gJHtGdH0gaXMgbm90IGZvdW5kYCl9LGZ0PV9lP3ttb2R1bGVOYW1lOnQsbW9kdWxlVHlwZTpuLGlkOl9lLG5hbWU6YyxtZXRob2Q6Vn06e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4scGFja2FnZTpyLGNsYXNzOm8sbmFtZTpnfHxjLGNvbXBhbmlvbjpiLG1ldGhvZDpWfTtyZXR1cm4oLi4uaHQpPT57aWYoTCl0aHJvdyBuZXcgRXJyb3IoTCk7bGV0IEZ0PXouZXh0ZW5kKHt9LGZ0LHtwYXJhbXM6aHQubWFwKFN0PT5MZyhTdCkpfSk7cmV0dXJuIGU/bmV3IFByb21pc2UoKFN0LG1uKT0+e25mKCkuaW52b2tlQXN5bmMoRnQsdG49Pnt0bi50eXBlIT09InJldHVybiI/UGUodG4pOnRuLmVyck1zZz9tbih0bi5lcnJNc2cpOlN0KHRuLnBhcmFtcyl9KX0pOkZnKEZ0LG5mKCkuaW52b2tlU3luYyhGdCxQZSksVCxfZSx3ZSl9fWZ1bmN0aW9uIFVnKGUsdCl7cmV0dXJuIHQubWFpbiYmIXQubWV0aG9kJiZ0eXBlb2YgcyE9InVuZGVmaW5lZCImJnMub3MubmFtZT09PSJpT1MiJiYodC5tZXRob2Q9InNfIit0Lm5hbWUpLHJmKGUsdCwwKX1sZXQgX1Q9VWc7ZnVuY3Rpb24gJGcoZSx0KXtyZXR1cm4gei5oYXNPd24odCxlKyJCeUpzIik/ZSsiQnlKcyI6ZX1mdW5jdGlvbiBiVChlKXtyZXR1cm4gdHlwZW9mIGU9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIHlUKGUpe3JldHVybiFiVChlLmluc3RhbmNlSWQpfWZ1bmN0aW9uIEhnKGUpe2xldHttb2R1bGVOYW1lOnQsbW9kdWxlVHlwZTpuLHBhY2thZ2U6cixjbGFzczpvLG1ldGhvZHM6Yyxwcm9wczpnLGVyck1zZzpifT1lLFY9e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4scGFja2FnZTpyLGNsYXNzOm8sZXJyTXNnOmJ9LFQsTD1bXSxfZT17fSx3ZT1bXSxQZT0hMTt5VChlKT8oUGU9ITAsVD1lLmluc3RhbmNlSWQpOihMPWUuY29uc3RydWN0b3IucGFyYW1zLF9lPWUuc3RhdGljTWV0aG9kcyx3ZT1lLnN0YXRpY1Byb3BzKSx0eXBlb2YgcyE9InVuZGVmaW5lZCImJnMub3MubmFtZT09PSJpT1MiJiZMLmZpbmQoRnQ9PkZ0LnR5cGU9PT0iVVRTQ2FsbGJhY2sifHxGdC50eXBlLmluZGV4T2YoIkpTT05PYmplY3QiKT4wKSYmTC5wdXNoKHtuYW1lOiJfYnlKcyIsdHlwZToiYm9vbGVhbiJ9KTtsZXQgZnQ9Y2xhc3N7Y29uc3RydWN0b3IoLi4uU3Qpe2lmKHRoaXMuX19pbnN0YW5jZUlkPTAsYil0aHJvdyBuZXcgRXJyb3IoYik7bGV0IG1uPXt9O2lmKFBlP3R5cGVvZiBUPT0ibnVtYmVyIiYmKHRoaXMuX19pbnN0YW5jZUlkPVQpOnRoaXMuX19pbnN0YW5jZUlkPXJmKCExLHouZXh0ZW5kKHtuYW1lOiJjb25zdHJ1Y3RvciIscGFyYW1zOkx9LFYpLDApLmFwcGx5KG51bGwsU3QpLCF0aGlzLl9faW5zdGFuY2VJZCl0aHJvdyBuZXcgRXJyb3IoYG5ldyAke299IGlzIGZhaWxlZGApO2xldCB0bj10aGlzLG5uPW5ldyBQcm94eSh0bix7Z2V0KEV0LEt0KXtpZighbW5bS3RdKXtpZihLdD0kZyhLdCxjKSx6Lmhhc093bihjLEt0KSl7bGV0e2FzeW5jOmNuLHBhcmFtczpadCxyZXR1cm46Q259PWNbS3RdO21uW0t0XT1tVCghIWNuLHouZXh0ZW5kKHtuYW1lOkt0LHBhcmFtczpadCxyZXR1cm46Q259LFYpLHRuLl9faW5zdGFuY2VJZCxubil9ZWxzZSBpZihnLmluY2x1ZGVzKEt0KSlyZXR1cm4gVmcoe21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4saWQ6dG4uX19pbnN0YW5jZUlkLG5hbWU6S3QsZXJyTXNnOmJ9KX1yZXR1cm4gbW5bS3RdfX0pO3JldHVybiBubn19LGh0PXt9O3JldHVybiBuZXcgUHJveHkoZnQse2dldChGdCxTdCxtbil7aWYoU3Q9JGcoU3QsX2UpLHouaGFzT3duKF9lLFN0KSl7aWYoIWh0W1N0XSl7bGV0e2FzeW5jOnRuLHBhcmFtczpubixyZXR1cm46RXR9PV9lW1N0XTtodFtTdF09VWcoISF0bix6LmV4dGVuZCh7bmFtZTpTdCxjb21wYW5pb246ITAscGFyYW1zOm5uLHJldHVybjpFdH0sVikpfXJldHVybiBodFtTdF19cmV0dXJuIHdlLmluY2x1ZGVzKFN0KT9WZyh6LmV4dGVuZCh7bmFtZTpTdCxjb21wYW5pb246ITB9LFYpKTpSZWZsZWN0LmdldChGdCxTdCxtbil9fSl9ZnVuY3Rpb24gRVQoZSx0KXtyZXR1cm4gdHlwZW9mIHMhPSJ1bmRlZmluZWQiJiZzLm9zLm5hbWU9PT0iQW5kcm9pZCI/InV0cy5zZGsuIisodD8ibW9kdWxlcy4iOiIiKStlOiIifWZ1bmN0aW9uIFNUKGUsdCl7cmV0dXJuIHR5cGVvZiBzPT0idW5kZWZpbmVkIj8iIjpqZyhlLHMub3MubmFtZT09PSJpT1MiPyJJbmRleFN3aWZ0IjoiSW5kZXhLdCIsdCl9ZnVuY3Rpb24gamcoZSx0LG4pe3JldHVybiB0eXBlb2Ygcz09InVuZGVmaW5lZCI/IiI6cy5vcy5uYW1lPT09IkFuZHJvaWQiP3Q6cy5vcy5uYW1lPT09ImlPUyI/IlVUU1NESyIrKG4/Ik1vZHVsZXMiOiIiKSt6LmNhcGl0YWxpemUoZSkrei5jYXBpdGFsaXplKHQpOiIifWxldCBvZj17fTtmdW5jdGlvbiB3VChlLHQpe29mW2VdPXR9bGV0IHpnPXt9O2Z1bmN0aW9uIENUKGUsdCl7emdbZV09dH1mdW5jdGlvbiBBVChlKXtsZXQgdD16Z1tlXTtyZXR1cm4gdHx8Y29uc29sZS5lcnJvcihgJHtlfSBpcyBub3QgZm91bmRgKSx0fWxldCBFbz17bG9hZDoibG9hZCIsY2xvc2U6ImNsb3NlIixlcnJvcjoiZXJyb3IiLGFkQ2xpY2tlZDoiYWRDbGlja2VkIn07Y2xhc3MgV2d7Y29uc3RydWN0b3IoKXt0aGlzLl9jYWxsYmFja3M9e319b25Mb2FkKHQpe3RoaXMuX2FkZEV2ZW50TGlzdGVuZXIoRW8ubG9hZCx0KX1vbkNsb3NlKHQpe3RoaXMuX2FkZEV2ZW50TGlzdGVuZXIoRW8uY2xvc2UsdCl9b25FcnJvcih0KXt0aGlzLl9hZGRFdmVudExpc3RlbmVyKEVvLmVycm9yLHQpfW9mZkxvYWQodCl7dGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcihFby5sb2FkLHQpfW9mZkNsb3NlKHQpe3RoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIoRW8uY2xvc2UsdCl9b2ZmRXJyb3IodCl7dGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcihFby5lcnJvcix0KX1fYWRkRXZlbnRMaXN0ZW5lcih0LG4peyF6LmlzRnVuY3Rpb24obil8fCh0aGlzLl9jYWxsYmFja3NbdF18fCh0aGlzLl9jYWxsYmFja3NbdF09W10pLHRoaXMuX2NhbGxiYWNrc1t0XS5wdXNoKG4pKX1fcmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pe2xldCByPXRoaXMuX2NhbGxiYWNrc1t0XSxvPXIuaW5kZXhPZihuKTtvPi0xJiZyLnNwbGljZShvLDEpfV9kaXNwYXRjaEV2ZW50KHQsbil7dGhpcy5fY2FsbGJhY2tzW3RdLmZvckVhY2gocj0+e3Iobnx8e30pfSl9fWNsYXNzIGFmIGV4dGVuZHMgV2d7Y29uc3RydWN0b3IodCxuKXtzdXBlcigpO3RoaXMucHJlbG9hZD0hMCx0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsLHRoaXMucHJlbG9hZD1uLnByZWxvYWQhPT12b2lkIDA/bi5wcmVsb2FkOiExO2xldCByPXRoaXMuX2FkSW5zdGFuY2U9dDtyLm9uTG9hZCgoKT0+e3RoaXMuX2lzTG9hZGVkPSEwLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmUhPW51bGwmJih0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmUoKSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCksdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlIT1udWxsJiYodGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlKCksdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd0FkKCkpLHRoaXMuX2Rpc3BhdGNoRXZlbnQoRW8ubG9hZCx7fSl9KSxyLm9uQ2xvc2Uobz0+e3RoaXMuX2lzTG9hZGVkPSExLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9kaXNwYXRjaEV2ZW50KEVvLmNsb3NlLG8pLHRoaXMucHJlbG9hZD09PSEwJiZ0aGlzLl9sb2FkQWQoKX0pLHIub25FcnJvcihvPT57dGhpcy5faXNMb2FkaW5nPSExO2xldCBjPXtjb2RlOm8uY29kZSxlcnJNc2c6by5tZXNzYWdlfTt0aGlzLl9kaXNwYXRjaEV2ZW50KEVvLmVycm9yLGMpO2xldCBnPW5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShjKSk7dGhpcy5fbG9hZFByb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9sb2FkUHJvbWlzZVJlamVjdChnKSx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsKSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdCE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0KGcpLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpfSksci5vbkFkQ2xpY2tlZCYmci5vbkFkQ2xpY2tlZCgoKT0+e3RoaXMuX2Rpc3BhdGNoRXZlbnQoRW8uYWRDbGlja2VkLHt9KX0pfWdldFByb3ZpZGVyKCl7cmV0dXJuIHRoaXMuX2FkSW5zdGFuY2UuZ2V0UHJvdmlkZXIoKX1sb2FkKCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57dGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPXQsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9biwhdGhpcy5faXNMb2FkaW5nJiYodGhpcy5faXNMb2FkZWQ/dCgiIik6dGhpcy5fbG9hZEFkKCkpfSl9c2hvdygpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3RoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT10LHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyYmKHRoaXMuX2lzTG9hZGVkPyh0aGlzLl9zaG93QWQoKSx0KCIiKSk6dGhpcy5fbG9hZEFkKCkpfSl9ZGVzdHJveSgpe3RoaXMuX2FkSW5zdGFuY2UuZGVzdHJveSgpfV9sb2FkQWQoKXt0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITAsdGhpcy5fYWRJbnN0YW5jZS5sb2FkKCl9X3Nob3dBZCgpe3RoaXMuX2FkSW5zdGFuY2Uuc2hvdygpfX1jbGFzcyBPVCBleHRlbmRzIGFme2NvbnN0cnVjdG9yKHQpe3N1cGVyKHMuYWQuY3JlYXRlUmV3YXJkZWRWaWRlb0FkKHQpLHQpO3RoaXMuX2xvYWRBZCgpfX1sZXQgVFQ9RHQodXcsZT0+bmV3IE9UKGUpLGR3LGZ3KTtjbGFzcyBQVCBleHRlbmRzIGFme2NvbnN0cnVjdG9yKHQpe3N1cGVyKHMuYWQuY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQodCksdCk7dGhpcy5wcmVsb2FkPSExfX1sZXQgSVQ9RHQoaHcsZT0+bmV3IFBUKGUpLHB3LGd3KTtjbGFzcyBOVCBleHRlbmRzIGFme2NvbnN0cnVjdG9yKHQpe3N1cGVyKHMuYWQuY3JlYXRlSW50ZXJzdGl0aWFsQWQodCksdCk7dGhpcy5wcmVsb2FkPSExLHRoaXMuX2xvYWRBZCgpfX1sZXQga1Q9RHQodncsZT0+bmV3IE5UKGUpLF93LG13KSxTYT17fSx0bD17fTtmdW5jdGlvbiBSVChlKXtsZXQgdD1lLnByb3ZpZGVyO2lmKFNhW3RdfHwoU2FbdF09e30pLHR5cGVvZiBTYVt0XS5wbHVnaW49PSJvYmplY3QiKXtlLnN1Y2Nlc3MoU2FbdF0ucGx1Z2luKTtyZXR1cm59aWYodGxbdF18fCh0bFt0XT1bXSksdGxbdF0ucHVzaChlKSxTYVt0XS5zdGF0dXM9PT0hMCl7ZS5fX3BsdWdpbj1TYVt0XS5wbHVnaW47cmV0dXJufVNhW3RdLnN0YXR1cz0hMDtsZXQgbj1Kbyh0KTtpZighbnx8IW4uaW5pdFNESyl7dGxbdF0uZm9yRWFjaChyPT57ci5mYWlsKHtjb2RlOi0xLG1lc3NhZ2U6InByb3ZpZGVyIFsiK3QrIl0gaW52YWxpZCJ9KX0pLHRsW3RdLmxlbmd0aD0wLFNhW3RdLnN0YXR1cz0hMTtyZXR1cm59U2FbdF0ucGx1Z2luPW4sZS5fX3BsdWdpbj1uLG4uaW5pdFNESyhyPT57bGV0IG89ci5jb2RlPT09MXx8ci5jb2RlPT09IjEiO28/U2FbdF0ucGx1Z2luPW46U2FbdF0uc3RhdHVzPSExLHRsW3RdLmZvckVhY2goYz0+e28/Yy5zdWNjZXNzKGMuX19wbHVnaW4pOmMuZmFpbChyKX0pLHRsW3RdLmxlbmd0aD0wfSl9Y2xhc3MgeFQgZXh0ZW5kcyBXZ3tjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO3RoaXMuX2FkcGlkPSIiLHRoaXMuX3Byb3ZpZGVyPSIiLHRoaXMuX3VzZXJEYXRhPW51bGwsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9hZEluc3RhbmNlPW51bGwsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9hZHBpZD10LmFkcGlkLHRoaXMuX3Byb3ZpZGVyPXQucHJvdmlkZXIsdGhpcy5fdXNlckRhdGE9dC51c2VyRGF0YSxOKCgpPT57dGhpcy5faW5pdCgpfSl9X2luaXQoKXt0aGlzLl9hZEVycm9yPSIiLFJUKHtwcm92aWRlcjp0aGlzLl9wcm92aWRlcixzdWNjZXNzOnQ9Pnt0aGlzLl9hZEluc3RhbmNlPXQsdGhpcy5fdXNlckRhdGEmJnRoaXMuYmluZFVzZXJEYXRhKHRoaXMuX3VzZXJEYXRhKSx0aGlzLl9sb2FkQWQoKX0sZmFpbDp0PT57dGhpcy5fYWRFcnJvcj10LHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZWplY3QodGhpcy5fY3JlYXRlRXJyb3IodCkpLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwpLHRoaXMuX2Rpc3BhdGNoRXZlbnQoRW8uZXJyb3IsdCl9fSl9Z2V0UHJvdmlkZXIoKXtyZXR1cm4gdGhpcy5fcHJvdmlkZXJ9bG9hZCgpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2lmKHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT10LHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyl7aWYodGhpcy5fYWRFcnJvcil7dGhpcy5faW5pdCgpO3JldHVybn10aGlzLl9pc0xvYWRlZD90KCIiKTp0aGlzLl9sb2FkQWQoKX19KX1zaG93KCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57aWYodGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPXQsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9biwhdGhpcy5faXNMb2FkaW5nKXtpZih0aGlzLl9hZEVycm9yKXt0aGlzLl9pbml0KCk7cmV0dXJufXRoaXMuX2lzTG9hZGVkPyh0aGlzLl9zaG93QWQoKSx0KCIiKSk6dGhpcy5fbG9hZEFkKCl9fSl9cmVwb3J0RXhwb3N1cmUoKXt0aGlzLl9hZEluc3RhbmNlIT09bnVsbCYmdGhpcy5fYWRJbnN0YW5jZS5yZXBvcnRFeHBvc3VyZSgpfWJpbmRVc2VyRGF0YSh0KXt0aGlzLl9hZEluc3RhbmNlIT09bnVsbCYmdGhpcy5fYWRJbnN0YW5jZS5iaW5kVXNlckRhdGEodCl9ZGVzdHJveSgpe3RoaXMuX2FkSW5zdGFuY2UhPT1udWxsJiZ0aGlzLl9hZEluc3RhbmNlLmRlc3Ryb3kmJnRoaXMuX2FkSW5zdGFuY2UuZGVzdHJveSh7YWRwaWQ6dGhpcy5fYWRwaWR9KX1fbG9hZEFkKCl7aWYodGhpcy5fYWRJbnN0YW5jZSE9PW51bGwpe2lmKHRoaXMuX2lzTG9hZGluZz09PSEwKXJldHVybjt0aGlzLl9pc0xvYWRpbmc9ITAsdGhpcy5fYWRJbnN0YW5jZS5sb2FkRGF0YSh7YWRwaWQ6dGhpcy5fYWRwaWR9LHQ9Pnt0aGlzLl9pc0xvYWRlZD0hMCx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlIT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZXNvbHZlKCksdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSgpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dBZCgpKSx0aGlzLl9kaXNwYXRjaEV2ZW50KEVvLmxvYWQsdCl9LHQ9Pnt0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fc2hvd1Byb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlamVjdCh0aGlzLl9jcmVhdGVFcnJvcih0KSksdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCksdGhpcy5fZGlzcGF0Y2hFdmVudChFby5lcnJvcix0KX0pfX1fc2hvd0FkKCl7dGhpcy5fYWRJbnN0YW5jZSE9PW51bGwmJnRoaXMuX2lzTG9hZGVkPT09ITAmJnRoaXMuX2FkSW5zdGFuY2Uuc2hvdyh7YWRwaWQ6dGhpcy5fYWRwaWR9LCgpPT57dGhpcy5faXNMb2FkZWQ9ITF9LHQ9Pnt0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdCE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0KHRoaXMuX2NyZWF0ZUVycm9yKHQpKSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKSx0aGlzLl9kaXNwYXRjaEV2ZW50KEVvLmVycm9yLHQpfSl9X2NyZWF0ZUVycm9yKHQpe3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodCkpfX1sZXQgQlQ9RHQoYncsZT0+bmV3IHhUKGUpLEV3LHl3KSxHZz1zLm9zLm5hbWU9PT0iQW5kcm9pZCImJnBhcnNlSW50KHMub3MudmVyc2lvbik8NixNVD1HZz8ic2xpZGUtaW4tcmlnaHQiOiJwb3AtaW4iLGpjPTMwMCxZZz1HZz8ic2xpZGUtb3V0LXJpZ2h0IjoicG9wLW91dCIsRFQ9Il93d3cvX191bmlhcHB2aWV3Lmh0bWwiLExUPSJ3ZWJ2aWV3SWQiLEZUPSJ1bmlNUE5hdGl2ZUV2ZW50IjtmdW5jdGlvbiBWVChlLHQsbil7biYmdC5pc05WdWUmJihlLnVuaU5WaWV3PXtwYXRoOm4sZGVmYXVsdEZvbnRTaXplOlIuZGVmYXVsdEZvbnRTaXplLHZpZXdwb3J0OlIudmlld3BvcnR9KX1sZXQgVVQ9L14jW2EtejAtOV17Nn0kL2k7ZnVuY3Rpb24gJFQoZSl7cmV0dXJuIGUmJihVVC50ZXN0KGUpfHxlPT09InRyYW5zcGFyZW50Iil9ZnVuY3Rpb24gSFQoZSx0KXtsZXR7YmFja2dyb3VuZENvbG9yOm59PXQ7IW58fCEkVChuKXx8KGUuYmFja2dyb3VuZD9uPWUuYmFja2dyb3VuZDplLmJhY2tncm91bmQ9bixlLmJhY2tncm91bmRDb2xvclRvcHx8KGUuYmFja2dyb3VuZENvbG9yVG9wPW4pLGUuYmFja2dyb3VuZENvbG9yQm90dG9tfHwoZS5iYWNrZ3JvdW5kQ29sb3JCb3R0b209biksZS5hbmltYXRpb25BbHBoYUJHQ29sb3J8fChlLmFuaW1hdGlvbkFscGhhQkdDb2xvcj1uKSx0eXBlb2YgZS53ZWJ2aWV3QkdUcmFuc3BhcmVudD09InVuZGVmaW5lZCImJihlLndlYnZpZXdCR1RyYW5zcGFyZW50PSEwKSl9ZnVuY3Rpb24galQoZSx0KXtlLnBvcEdlc3R1cmU9PT0iaGlkZSImJmRlbGV0ZSBlLnBvcEdlc3R1cmUsdC5pc1F1aXQmJihlLnBvcEdlc3R1cmU9cy5vcy5uYW1lPT09ImlPUyI/ImFwcGJhY2siOiJub25lIil9ZnVuY3Rpb24gelQoZSx0KXtpZighdC5lbmFibGVQdWxsRG93blJlZnJlc2gpcmV0dXJuO2xldCBuPVVhKHouZXh0ZW5kKHt9LHMub3MubmFtZT09PSJBbmRyb2lkIj9HVDpZVCx0LnB1bGxUb1JlZnJlc2gpKTtlLnB1bGxUb1JlZnJlc2g9V1Qobix0KX1mdW5jdGlvbiBXVChlLHQpe2xldCBuPV9yKGUpO2lmKCFuKXJldHVybiBlO2xldFtyLG8sY109bjtyZXR1cm4ocnx8b3x8YykmJlAub25Mb2NhbGVDaGFuZ2UoKCk9PntsZXQgZz1zLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodC5pZCsiIik7aWYoIWcpcmV0dXJuO2xldCBiPXtzdXBwb3J0OiEwfTtyJiYoYi5jb250ZW50ZG93bj17Y2FwdGlvbjplLmNvbnRlbnRkb3duLmNhcHRpb259KSxvJiYoYi5jb250ZW50b3Zlcj17Y2FwdGlvbjplLmNvbnRlbnRvdmVyLmNhcHRpb259KSxjJiYoYi5jb250ZW50cmVmcmVzaD17Y2FwdGlvbjplLmNvbnRlbnRyZWZyZXNoLmNhcHRpb259KSxnLnNldFN0eWxlKHtwdWxsVG9SZWZyZXNoOmJ9KX0pLGV9bGV0IEdUPXtzdXBwb3J0OiEwLHN0eWxlOiJjaXJjbGUifSxZVD17c3VwcG9ydDohMCxzdHlsZToiZGVmYXVsdCIsaGVpZ2h0OiI1MHB4IixyYW5nZToiMjAwcHgiLGNvbnRlbnRkb3duOntjYXB0aW9uOiIifSxjb250ZW50b3Zlcjp7Y2FwdGlvbjoiIn0sY29udGVudHJlZnJlc2g6e2NhcHRpb246IiJ9fTtmdW5jdGlvbiBxVChlLHQpe2xldHtuYXZpZ2F0aW9uQmFyOm59PXQ7aWYobi5zdHlsZT09PSJjdXN0b20iKXJldHVybiExO2xldCByPSEwO3QuaXNRdWl0JiYocj0hMSk7bGV0IG89e2F1dG9CYWNrQnV0dG9uOnJ9O09iamVjdC5rZXlzKG4pLmZvckVhY2goYz0+e2xldCBnPW5bY107Yz09PSJ0aXRsZUltYWdlIiYmZz9vLnRhZ3M9S1QoZyk6Yz09PSJidXR0b25zIiYmei5pc0FycmF5KGcpP28uYnV0dG9ucz1nLm1hcCgoYixWKT0+KGIub25jbGljaz1aVChWKSxiKSk6b1tjXT1nfSksZS50aXRsZU5WaWV3PUpUKG8sdCl9ZnVuY3Rpb24gSlQoZSx0KXtsZXQgbj1EbihlKTtpZighbilyZXR1cm4gZTtsZXRbcixvXT1uO3JldHVybihyfHxvKSYmUC5vbkxvY2FsZUNoYW5nZSgoKT0+e2xldCBjPXMud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh0LmlkKyIiKTtpZighYylyZXR1cm47bGV0IGc9e307ciYmKGcudGl0bGVUZXh0PWUudGl0bGVUZXh0KSxvJiYoZy5zZWFyY2hJbnB1dD17cGxhY2Vob2xkZXI6ZS5zZWFyY2hJbnB1dC5wbGFjZWhvbGRlcn0pLGMuc2V0U3R5bGUoe3RpdGxlTlZpZXc6Z30pfSksZX1mdW5jdGlvbiBLVChlKXtyZXR1cm5be3RhZzoiaW1nIixzcmM6ZSxwb3NpdGlvbjp7bGVmdDoiYXV0byIsdG9wOiJhdXRvIix3aWR0aDoiYXV0byIsaGVpZ2h0OiIyNnB4In19XX1mdW5jdGlvbiBaVChlKXtyZXR1cm4gZnVuY3Rpb24obil7bi5pbmRleD1lLFZuKEouT05fTkFWSUdBVElPTl9CQVJfQlVUVE9OX1RBUCxuKX19ZnVuY3Rpb24gcWcoZSx0LG4pe2xldCByPXtib3VuY2U6InZlcnRpY2FsIn07cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2gobz0+e1hULmluZGV4T2Yobyk9PT0tMSYmKHJbb109dFtvXSl9KSxuLmlkIT09IjEiJiZWVChyLHQsZSksalQocix0KSxIVChyLHQpLHFUKHIsdCkselQocix0KSxyfWxldCBYVD1bImlkIiwicm91dGUiLCJpc05WdWUiLCJpc1F1aXQiLCJpc0VudHJ5IiwiaXNUYWJCYXIiLCJ0YWJCYXJJbmRleCIsIndpbmRvd1RvcCIsInRvcFdpbmRvdyIsImxlZnRXaW5kb3ciLCJyaWdodFdpbmRvdyIsIm1heFdpZHRoIiwidXNpbmdDb21wb25lbnRzIiwiZGlzYWJsZVNjcm9sbCIsImVuYWJsZVB1bGxEb3duUmVmcmVzaCIsIm5hdmlnYXRpb25CYXIiLCJwdWxsVG9SZWZyZXNoIiwib25SZWFjaEJvdHRvbURpc3RhbmNlIiwicGFnZU9yaWVudGF0aW9uIiwiYmFja2dyb3VuZENvbG9yIl0sSmc9MjtmdW5jdGlvbiBLZygpe3JldHVybiBKZ31mdW5jdGlvbiBaZygpe3JldHVybiBKZysrfWZ1bmN0aW9uIFhnKGUpe3JldHVybiBlfWZ1bmN0aW9uIFFnKGUsdCl7bGV0IG49dD9KLnN0cmluZ2lmeVF1ZXJ5KHQsWGcpOiIiO3JldHVybntwYXRoOmUuc2xpY2UoMSkscXVlcnk6biYmbi5zbGljZSgxKX19ZnVuY3Rpb24gUVQoZSx0LG4pe2xldCByPW4/Si5zdHJpbmdpZnlRdWVyeShuLFhnKToiIjtyZXR1cm57aXNUYWI6ZSxhcmd1bWVudHM6SlNPTi5zdHJpbmdpZnkoe3BhdGg6dC5zbGljZSgxKSxxdWVyeTpyJiZyLnNsaWNlKDEpfSl9fWZ1bmN0aW9uIGVQKHtwYXRoOmUscXVlcnk6dCxyb3V0ZU9wdGlvbnM6bix3ZWJ2aWV3RXh0cmFzOnJ9KXtsZXQgbz0oKT0+cWcoZSxIdShuLm1ldGEpLHtpZDpjKyIifSksYz1aZygpLGc9bygpO2cudW5pUGFnZVVybD1RZyhlLHQpLGcuaXNUYWI9ISFuLm1ldGEuaXNUYWJCYXI7bGV0IGI9cy53ZWJ2aWV3LmNyZWF0ZSgiIixTdHJpbmcoYyksZyx6LmV4dGVuZCh7bnZ1ZTohMCxfX3BhdGhfXzplLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeSh0KX0scikpO3JldHVybiAkaChiLG8pLGJ9bGV0IExpO2Z1bmN0aW9uIGVwKGUpe0xpPWV9ZnVuY3Rpb24gdFAoKXtyZXR1cm4gTGl9ZnVuY3Rpb24gblAoKXtyZXR1cm4oIUxpfHxMaS5fX3VuaWFwcF9yb3V0ZSkmJihMaT1zLndlYnZpZXcuY3JlYXRlKERULFN0cmluZyhaZygpKSx7Y29udGVudEFkanVzdDohMX0pKSxMaX1mdW5jdGlvbiByUChlKXtsZXR7cG9wdXBTdWJOVnVlV2Vidmlld3M6dH09ZTshdHx8ZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PntPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG49Pnt0W25dLmNsb3NlKCJub25lIil9KX0pfWZ1bmN0aW9uIHRwKGUpe3JldHVybiBSLnJlYWxFbnRyeVBhZ2VQYXRoJiZlLiRwYWdlLnJvdXRlPT09Ui5lbnRyeVBhZ2VQYXRofWZ1bmN0aW9uIG5wKCl7Ui5lbnRyeVBhZ2VQYXRoPVIucmVhbEVudHJ5UGFnZVBhdGgsZGVsZXRlIFIucmVhbEVudHJ5UGFnZVBhdGgsUC5yZUxhdW5jaCh7dXJsOkouYWRkTGVhZGluZ1NsYXNoKFIuZW50cnlQYWdlUGF0aCl9KX1mdW5jdGlvbiBpUChlKXtsZXQgdDtlLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLG49PntpZihuLnR5cGU9PT0ic3RhcnQiKXtsZXQgcj1JbigpLG89cltyLmxlbmd0aC0yXTt0PW5jO2xldCBjPW8mJm8uJHBhZ2Uuc3RhdHVzQmFyU3R5bGU7YyYmQmEoYyl9ZWxzZSBpZihuLnR5cGU9PT0iZW5kIiYmIW4ucmVzdWx0KUJhKHQpO2Vsc2UgaWYobi50eXBlPT09ImVuZCImJm4ucmVzdWx0KXtsZXQgcj1JbigpLmxlbmd0aCxvPXdpKCk7enIoKSxCYSgpLG8mJnI9PT0xJiZ0cChvKT9ucCgpOlZuKEouT05fU0hPVyl9fSl9ZnVuY3Rpb24gb1AoZSl7aWYoZS5udnVlKXJldHVybjtsZXQgdD1lLmlkLHtzdWJzY3JpYmU6bix1bnN1YnNjcmliZTpyfT1vdCxvPShjLGcpPT57aWYodCE9PWcpcmV0dXJuO3IoUmwsbyk7bGV0IGI9SXIocGFyc2VJbnQoZykpO2ImJmIuX19wYWdlX2NvbnRhaW5lcl9fLnJlc3RvcmUoKX07ZS5hZGRFdmVudExpc3RlbmVyKCJyZWNvdmVyeSIsKCk9PntuKFJsLG8pfSl9ZnVuY3Rpb24gYVAoZSl7bGV0e2VtaXQ6dH09b3Qsbj1mdW5jdGlvbih7d2lkdGg6cixoZWlnaHQ6b30pe2xldCBnPXtkZXZpY2VPcmllbnRhdGlvbjpNYXRoLmFicyhzLm5hdmlnYXRvci5nZXRPcmllbnRhdGlvbigpKT09PTkwPyJsYW5kc2NhcGUiOiJwb3J0cmFpdCIsc2l6ZTp7d2luZG93V2lkdGg6TWF0aC5jZWlsKHIpLHdpbmRvd0hlaWdodDpNYXRoLmNlaWwobyl9fTt0KEouT05fUkVTSVpFLGcscGFyc2VJbnQoZS5pZCkpfTtlLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsSi5kZWJvdW5jZShuLDUwLHtzZXRUaW1lb3V0Ok4sY2xlYXJUaW1lb3V0OkV9KSl9bGV0IHJwPXtwdWxsVG9SZWZyZXNoOkouT05fUFVMTF9ET1dOX1JFRlJFU0gsdGl0bGVOVmlld1NlYXJjaElucHV0Q2hhbmdlZDpKLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DSEFOR0VELHRpdGxlTlZpZXdTZWFyY2hJbnB1dENvbmZpcm1lZDpKLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DT05GSVJNRUQsdGl0bGVOVmlld1NlYXJjaElucHV0Q2xpY2tlZDpKLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DTElDS0VELHRpdGxlTlZpZXdTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZDpKLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9GT0NVU19DSEFOR0VEfTtmdW5jdGlvbiBzUChlKXtsZXQgdD1wYXJzZUludChlLmlkKTtPYmplY3Qua2V5cyhycCkuZm9yRWFjaChuPT57bGV0IHI9cnBbbl07ZS5hZGRFdmVudExpc3RlbmVyKG4sbz0+e3I9PT1KLk9OX1BVTExfRE9XTl9SRUZSRVNIJiZ6dShlKSxWbih0LHIsbyl9KX0pLHJQKGUpLGFQKGUpLHMub3MubmFtZT09PSJpT1MiJiYob1AoZSksaVAoZSkpfWZ1bmN0aW9uIGxQKGUsdCxuLHIpe2xldCBvPSgpPT5xZyh0LEh1KHIpLGUpLGM9bygpO2MudW5pUGFnZVVybD1RZyh0LG4pO2xldCBnPSEhci5pc1RhYkJhcjtyLmlzTlZ1ZT9jLmlzVGFiPWc6Yy5kZWJ1Z1JlZnJlc2g9UVQoZyx0LG4pLGMubG9jYWxlPWYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldExhbmd1YWdlKCksJGgoZSxvKSxlLnNldFN0eWxlKGMpfWZ1bmN0aW9uIGNQKGUsdCxuKXsobi5zdWJOVnVlc3x8W10pLmZvckVhY2gobz0+e2lmKCFvLnBhdGgpcmV0dXJuO2xldCBjPVZhKG8uc3R5bGV8fHt9KSxnPW8udHlwZT09PSJuYXZpZ2F0aW9uQmFyIixiPW8udHlwZT09PSJwb3B1cCI7Yy51bmlOVmlldz17cGF0aDpvLnBhdGgucmVwbGFjZSgiLm52dWUiLCIuanMiKSxkZWZhdWx0Rm9udFNpemU6Ui5kZWZhdWx0Rm9udFNpemUsdmlld3BvcnQ6Ui52aWV3cG9ydH07bGV0IFY9e19fdW5pYXBwX2hvc3Q6dCxfX3VuaWFwcF9vcmlnaW46Yy51bmlOVmlldy5wYXRoLnNwbGl0KCI/IilbMF0ucmVwbGFjZSgiLmpzIiwiIiksX191bmlhcHBfb3JpZ2luX2lkOmUuaWQsX191bmlhcHBfb3JpZ2luX3R5cGU6ZS5fX3VuaWFwcF90eXBlfSxUO2c/KGMucG9zaXRpb249ImRvY2siLGMuZG9jaz0idG9wIixjLnRvcD0iMCIsYy53aWR0aD0iMTAwJSIsYy5oZWlnaHQ9U3RyaW5nKEouTkFWQkFSX0hFSUdIVCtXdSgpKSxkZWxldGUgYy5sZWZ0LGRlbGV0ZSBjLnJpZ2h0LGRlbGV0ZSBjLmJvdHRvbSxkZWxldGUgYy5tYXJnaW4pOmImJihjLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGModCk/VD1kaTpUPWUsVi5fX3VuaWFwcF9tYXNrPWMubWFza3x8InJnYmEoMCwwLDAsMC41KSIsVi5fX3VuaWFwcF9tYXNrX2lkPVQuaWQpLGRlbGV0ZSBjLm1hc2s7bGV0IEw9cy53ZWJ2aWV3LmNyZWF0ZSgiIixvLmlkLGMsVik7aWYoYil7VC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c3x8KFQucG9wdXBTdWJOVnVlV2Vidmlld3M9e30pLFQucG9wdXBTdWJOVnVlV2Vidmlld3NbTC5pZF09TDtsZXQgX2U9ZnVuY3Rpb24oKXtULnNldFN0eWxlKHttYXNrOiJub25lIn0pLEwuaGlkZSgiYXV0byIpfTtULmFkZEV2ZW50TGlzdGVuZXIoIm1hc2tDbGljayIsX2UpO2xldCB3ZT0hMTtMLmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLCgpPT57d2V8fChzLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixEaSkscy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsX2UpLHdlPSEwKX0pLEwuYWRkRXZlbnRMaXN0ZW5lcigiaGlkZSIsKCk9Pnt3ZSYmKHMua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLF9lKSxzLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixEaSksd2U9ITEpfSksTC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PntkZWxldGUgVC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tMLmlkXSx3ZSYmKHMua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLF9lKSxzLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixEaSksd2U9ITEpfSl9ZWxzZSBlLmFwcGVuZChMKX0pfWZ1bmN0aW9uIHVQKGUsdCxuLHIpeyhlLmlkPT09IjEifHwhci5pc05WdWUpJiZsUChlLHQsbixyKSxjUChlLHQsciksc1AoZSl9ZnVuY3Rpb24gaXAoZSl7cmV0dXJuIGUucm91dGVPcHRpb25zLm1ldGEuaXNOVnVlP2VQKGUpOktnKCk9PT0yP3Mud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCk6dFAoKX1mdW5jdGlvbiBvcChlLHQpe290Lm9uY2UoUmwrIi4iK2UsdCl9bGV0IHdhPSExO2Z1bmN0aW9uIGFwKGUsdCxuKXt3YT17cGF0aDplLG52dWU6b3MoZSkuaXNOVnVlLGNhbGxiYWNrOnR9fWZ1bmN0aW9uIHNwKGUsdCxuKXtuYShlKSxubChlLiRnZXRBcHBXZWJ2aWV3KCksdCxuKX1mdW5jdGlvbiB6YyhlLHQsbj0hMSl7aWYoIW4mJndhKXJldHVybiBjb25zb2xlLmVycm9yKGBXYWl0aW5nIHRvIG5hdmlnYXRlIHRvOiAke3dhLnBhdGh9LCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICR7ZX0uYCk7aWYoUi5yZW5kZXJlcj09PSJuYXRpdmUiKXJldHVybiBJbigpLmxlbmd0aD09PTA/YXAoZSx0LCJ3YWl0Rm9yUmVhZHkiKTp0KCk7bGV0IHI9IUxpfHxMaSYmTGkuX191bmlhcHBfcm91dGUsbz1MaSYmIUxpLmxvYWRlZDtyfHxvP2FwKGUsdCxyPyJ3YWl0Rm9yQ3JlYXRlIjoid2FpdEZvclJlYWR5Iik6dCgpLG8mJm9wKExpLmlkLFdjKX1mdW5jdGlvbiBXYygpe2lmKCF3YSlyZXR1cm47bGV0e2NhbGxiYWNrOmV9PXdhO3JldHVybiB3YT0hMSxlKCl9ZnVuY3Rpb24gbHAoKXtpZihSLnJlbmRlcmVyPT09Im5hdGl2ZSIpcmV0dXJuIHdhJiZ3YS5udnVlP1djKCk6dm9pZCAwO2xldCBlPW5QKCk7aWYoISF3YSl7aWYod2EubnZ1ZSlyZXR1cm4gV2MoKTtlLmxvYWRlZD93YS5jYWxsYmFjaygpOm9wKGUuaWQsV2MpfX1mdW5jdGlvbiBubChlLHQsbil7ZVtlLl9fcHJlbG9hZF9fPyJoaWRlIjoiY2xvc2UiXSh0LG4pfWZ1bmN0aW9uIEdjKGUsdCxuLHIsbyl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiYobz1lLm52dWU/MDoxMDApO2xldCBjPWZ1bmN0aW9uKCl7Yy5fY2FsbGVkfHwoYy5fY2FsbGVkPSEwLHImJnIoKSxscCgpKX07Yy5fY2FsbGVkPSExLE4oKCk9PntsZXQgZz1OKCgpPT57YygpfSxuKzE1MCk7ZS5zaG93KHQsbiwoKT0+e2MuX2NhbGxlZHx8RShnKSxjKCl9KX0sbyl9ZnVuY3Rpb24gZlAoZSx0KXtsZXQgbj1lLmNoaWxkcmVuKCk7aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gdCgpO2xldCByPW4uZmluZChvPT5vLmlkLmluZGV4T2YoTFQpPT09MCl8fG5bMF07ci5jYW5CYWNrKCh7Y2FuQmFjazpvfSk9PntvP3IuYmFjaygpOnQoKX0pfWxldCBkUD1UZShQRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj13aSgpO2lmKCFyKXJldHVybiBuKCJnZXRDdXJyZW50UGFnZXMgaXMgZW1wdHkiKTtpZihWbihyLEouT05fQkFDS19QUkVTUyx7ZnJvbTplLmZyb218fCJuYXZpZ2F0ZUJhY2sifSkpcmV0dXJuIHQoKTtpZihQLmhpZGVUb2FzdCgpLFAuaGlkZUxvYWRpbmcoKSxyLiRwYWdlLm1ldGEuaXNRdWl0KWhQKCk7ZWxzZSBpZih0cChyKSlucCgpO2Vsc2V7bGV0e2RlbHRhOm8sYW5pbWF0aW9uVHlwZTpjLGFuaW1hdGlvbkR1cmF0aW9uOmd9PWU7Z1AobyxjLGcpfXJldHVybiB0KCl9LE5FLFVFKSxZYz0wO2Z1bmN0aW9uIGhQKCl7dnQoKSxZYz9EYXRlLm5vdygpLVljPDJlMyYmcy5ydW50aW1lLnF1aXQoKTooWWM9RGF0ZS5ub3coKSxzLm5hdGl2ZVVJLnRvYXN0KGFlKCkudCgidW5pLmFwcC5xdWl0IikpLE4oKCk9PntZYz0wfSwyZTMpKX1mdW5jdGlvbiBnUChlLHQsbil7bGV0IHI9SW4oKSxvPXIubGVuZ3RoLGM9cltvLTFdO2U+MSYmci5zbGljZShvLWUsby0xKS5yZXZlcnNlKCkuZm9yRWFjaChWPT57bmwocy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKFYuJHBhZ2UuaWQrIiIpLCJub25lIiwwKX0pO2xldCBnPWZ1bmN0aW9uKFYpe3Q/bmwoVix0LG58fGpjKTpjLiRwYWdlLm9wZW5UeXBlPT09InJlZGlyZWN0VG8iP25sKFYsWWcsamMpOm5sKFYsImF1dG8iKSxyLnNsaWNlKG8tZSxvKS5mb3JFYWNoKFQ9Pm5hKFQpKSxCYSgpLFZuKEouT05fU0hPVyl9LGI9cy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKGMuJHBhZ2UuaWQrIiIpO2lmKCFjLl9fdW5pYXBwX3dlYnZpZXcpcmV0dXJuIGcoYik7ZlAoYiwoKT0+e2coYil9KX1jbGFzcyBwUCBleHRlbmRzIEouVW5pTm9kZXtjb25zdHJ1Y3Rvcih0LG4scj0hMSl7c3VwZXIoSi5OT0RFX1RZUEVfUEFHRSwiI3BhZ2UiLG51bGwpO3RoaXMuX2lkPTEsdGhpcy5fY3JlYXRlZD0hMSx0aGlzLl91cGRhdGluZz0hMSx0aGlzLl9jcmVhdGVBY3Rpb25NYXA9bmV3IE1hcCx0aGlzLnVwZGF0ZUFjdGlvbnM9W10sdGhpcy5kaWN0cz1bXSx0aGlzLm5vZGVJZD0wLHRoaXMucGFnZUlkPXQsdGhpcy5wYWdlTm9kZT10aGlzLHRoaXMub3B0aW9ucz1uLHRoaXMuaXNVbm1vdW50ZWQ9ITEsdGhpcy5jcmVhdGVBY3Rpb249W0ouQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEUsbl0sdGhpcy5jcmVhdGVkQWN0aW9uPVtKLkFDVElPTl9UWVBFX1BBR0VfQ1JFQVRFRF0sdGhpcy5ub3JtYWxpemVEaWN0PXRoaXMuX25vcm1hbGl6ZURpY3QuYmluZCh0aGlzKSx0aGlzLl91cGRhdGU9dGhpcy51cGRhdGUuYmluZCh0aGlzKSxyJiZ0aGlzLnNldHVwKCl9X25vcm1hbGl6ZURpY3QodCxuPSEwKXtpZighei5pc1BsYWluT2JqZWN0KHQpKXJldHVybiB0aGlzLmFkZERpY3QodCk7bGV0IHI9W107cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2gobz0+e2xldCBjPVt0aGlzLmFkZERpY3QobyldLGc9dFtvXTtuP2MucHVzaCh0aGlzLmFkZERpY3QoZykpOmMucHVzaChnKSxyLnB1c2goYyl9KSxyfWFkZERpY3QodCl7bGV0e2RpY3RzOm59PXRoaXMscj1uLmluZGV4T2YodCk7cmV0dXJuIHI+LTE/cjpuLnB1c2godCktMX1vbkluamVjdEhvb2sodCl7KHQ9PT1KLk9OX1BBR0VfU0NST0xMfHx0PT09Si5PTl9SRUFDSF9CT1RUT00pJiYhdGhpcy5zY3JvbGxBY3Rpb24mJih0aGlzLnNjcm9sbEFjdGlvbj1bSi5BQ1RJT05fVFlQRV9QQUdFX1NDUk9MTCx0aGlzLm9wdGlvbnMub25SZWFjaEJvdHRvbURpc3RhbmNlXSx0aGlzLnB1c2godGhpcy5zY3JvbGxBY3Rpb24pKX1vbkNyZWF0ZSh0LG4pe3JldHVybiBfUCh0aGlzLHQubm9kZUlkLG4pLHR9b25JbnNlcnRCZWZvcmUodCxuLHIpe3JldHVybiBiUCh0aGlzLG4sdC5ub2RlSWQsciYmci5ub2RlSWR8fC0xKSxufW9uUmVtb3ZlQ2hpbGQodCl7cmV0dXJuIHlQKHRoaXMsdC5ub2RlSWQpLHR9b25BZGRFdmVudCh0LG4scil7dC5wYXJlbnROb2RlJiZFUCh0aGlzLHQubm9kZUlkLG4scil9b25BZGRXeHNFdmVudCh0LG4scixvKXt0LnBhcmVudE5vZGUmJlNQKHRoaXMsdC5ub2RlSWQsbixyLG8pfW9uUmVtb3ZlRXZlbnQodCxuKXt0LnBhcmVudE5vZGUmJndQKHRoaXMsdC5ub2RlSWQsbil9b25TZXRBdHRyaWJ1dGUodCxuLHIpe3QucGFyZW50Tm9kZSYmQVAodGhpcyx0Lm5vZGVJZCxuLHIpfW9uUmVtb3ZlQXR0cmlidXRlKHQsbil7dC5wYXJlbnROb2RlJiZPUCh0aGlzLHQubm9kZUlkLG4pfW9uVGV4dENvbnRlbnQodCxuKXt0LnBhcmVudE5vZGUmJnVwKHRoaXMsdC5ub2RlSWQsbil9b25Ob2RlVmFsdWUodCxuKXt0LnBhcmVudE5vZGUmJnVwKHRoaXMsdC5ub2RlSWQsbil9Z2VuSWQoKXtyZXR1cm4gdGhpcy5faWQrK31wdXNoKHQsbil7aWYoIXRoaXMuaXNVbm1vdW50ZWQpe3N3aXRjaCh0WzBdKXtjYXNlIEouQUNUSU9OX1RZUEVfQ1JFQVRFOnRoaXMuX2NyZWF0ZUFjdGlvbk1hcC5zZXQodFsxXSx0KTticmVhaztjYXNlIEouQUNUSU9OX1RZUEVfSU5TRVJUOmxldCByPXRoaXMuX2NyZWF0ZUFjdGlvbk1hcC5nZXQodFsxXSk7cj8oclszXT10WzJdLHJbNF09dFszXSxuJiYocls1XT1uKSk6KG4mJih0WzRdPW4pLHRoaXMudXBkYXRlQWN0aW9ucy5wdXNoKHQpKTticmVha310WzBdIT09Si5BQ1RJT05fVFlQRV9JTlNFUlQmJnRoaXMudXBkYXRlQWN0aW9ucy5wdXNoKHQpLHRoaXMuX3VwZGF0aW5nfHwodGhpcy5fdXBkYXRpbmc9ITAsaG4ucXVldWVQb3N0Rmx1c2hDYih0aGlzLl91cGRhdGUpKX19cmVzdG9yZSgpe3RoaXMuY2xlYXIoKSx0aGlzLnNldHVwKCksdGhpcy5zY3JvbGxBY3Rpb24mJnRoaXMucHVzaCh0aGlzLnNjcm9sbEFjdGlvbik7bGV0IHQ9bj0+e3RoaXMub25DcmVhdGUobixuLm5vZGVOYW1lKSx0aGlzLm9uSW5zZXJ0QmVmb3JlKG4ucGFyZW50Tm9kZSxuLG51bGwpLG4uY2hpbGROb2Rlcy5mb3JFYWNoKHI9Pnt0KHIpfSl9O3RoaXMuY2hpbGROb2Rlcy5mb3JFYWNoKG49PnQobikpLHRoaXMucHVzaCh0aGlzLmNyZWF0ZWRBY3Rpb24pfXNldHVwKCl7dGhpcy5zZW5kKFt0aGlzLmNyZWF0ZUFjdGlvbl0pfXVwZGF0ZSgpe2xldHtkaWN0czp0LHVwZGF0ZUFjdGlvbnM6bixfY3JlYXRlQWN0aW9uTWFwOnJ9PXRoaXM7dGhpcy5fY3JlYXRlZHx8KHRoaXMuX2NyZWF0ZWQ9ITAsbi5wdXNoKHRoaXMuY3JlYXRlZEFjdGlvbikpLG4ubGVuZ3RoJiYodC5sZW5ndGgmJm4udW5zaGlmdChbSE8sdF0pLHRoaXMuc2VuZChuKSksdGhpcy5jbGVhcigpfWNsZWFyKCl7dGhpcy5kaWN0cy5sZW5ndGg9MCx0aGlzLnVwZGF0ZUFjdGlvbnMubGVuZ3RoPTAsdGhpcy5fdXBkYXRpbmc9ITEsdGhpcy5fY3JlYXRlQWN0aW9uTWFwLmNsZWFyKCl9c2VuZCh0KXtvdC5wdWJsaXNoSGFuZGxlcihDZyx0LHRoaXMucGFnZUlkKX1maXJlRXZlbnQodCxuKXtsZXQgcj1jcCh0LHRoaXMpO3ImJnIuZGlzcGF0Y2hFdmVudChuKX19ZnVuY3Rpb24gdlAoZSl7bGV0IHQ9SXIoZSk7cmV0dXJuIHQ/dC5fX3BhZ2VfY29udGFpbmVyX186bnVsbH1mdW5jdGlvbiBzZihlLHQsbil7aWYodHlwZW9mIG49PSJudW1iZXIiJiYobj12UChuKSksbltlXT09PXQpcmV0dXJuIG47bGV0e2NoaWxkTm9kZXM6cn09bjtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7bGV0IGM9c2YoZSx0LHJbb10pO2lmKGMpcmV0dXJuIGN9cmV0dXJuIG51bGx9ZnVuY3Rpb24gY3AoZSx0KXtyZXR1cm4gc2YoIm5vZGVJZCIsZSx0KX1mdW5jdGlvbiBtUChlLHQpe3JldHVybiBzZigibm9kZU5hbWUiLGUudG9VcHBlckNhc2UoKSx0KX1mdW5jdGlvbiBfUChlLHQsbil7ZS5wdXNoKFtKLkFDVElPTl9UWVBFX0NSRUFURSx0LGUuYWRkRGljdChuKSwtMSwtMV0pfWZ1bmN0aW9uIGJQKGUsdCxuLHIpe2xldCBvPXQudG9KU09OKHthdHRyOiEwLG5vcm1hbGl6ZTplLm5vcm1hbGl6ZURpY3R9KTtlLnB1c2goW0ouQUNUSU9OX1RZUEVfSU5TRVJULHQubm9kZUlkLG4scl0sT2JqZWN0LmtleXMobykubGVuZ3RoP286dm9pZCAwKX1mdW5jdGlvbiB5UChlLHQpe2UucHVzaChbSi5BQ1RJT05fVFlQRV9SRU1PVkUsdF0pfWZ1bmN0aW9uIEVQKGUsdCxuLHIpe2UucHVzaChbSi5BQ1RJT05fVFlQRV9BRERfRVZFTlQsdCxlLmFkZERpY3Qobikscl0pfWZ1bmN0aW9uIFNQKGUsdCxuLHIsbyl7ZS5wdXNoKFtKLkFDVElPTl9UWVBFX0FERF9XWFNfRVZFTlQsdCxlLmFkZERpY3QobiksZS5hZGREaWN0KHIpLG9dKX1mdW5jdGlvbiB3UChlLHQsbil7ZS5wdXNoKFtKLkFDVElPTl9UWVBFX1JFTU9WRV9FVkVOVCx0LGUuYWRkRGljdChuKV0pfWZ1bmN0aW9uIENQKGUsdCxuKXtyZXR1cm4gdD09PSJzdHlsZSImJnouaXNQbGFpbk9iamVjdChuKT9lLm5vcm1hbGl6ZURpY3Qobik6ZS5hZGREaWN0KG4pfWZ1bmN0aW9uIEFQKGUsdCxuLHIpe2UucHVzaChbSi5BQ1RJT05fVFlQRV9TRVRfQVRUUklCVVRFLHQsZS5hZGREaWN0KG4pLENQKGUsbixyKV0pfWZ1bmN0aW9uIE9QKGUsdCxuKXtlLnB1c2goW0ouQUNUSU9OX1RZUEVfUkVNT1ZFX0FUVFJJQlVURSx0LGUuYWRkRGljdChuKV0pfWZ1bmN0aW9uIHVwKGUsdCxuKXtlLnB1c2goW0ouQUNUSU9OX1RZUEVfU0VUX1RFWFQsdCxlLmFkZERpY3QobildKX1mdW5jdGlvbiBUUChlLHQsbil7cmV0dXJuIG5ldyBwUChlLHQsbil9ZnVuY3Rpb24gZnAoZSl7bGV0IHQ9ZS5zZXR1cDtyZXR1cm4gZS5pbmhlcml0QXR0cnM9ITEsZS5zZXR1cD0obixyKT0+e2xldHthdHRyczp7X19wYWdlSWQ6byxfX3BhZ2VQYXRoOmMsX19wYWdlUXVlcnk6ZyxfX3BhZ2VJbnN0YW5jZTpifX09cixUPWhuLmdldEN1cnJlbnRJbnN0YW5jZSgpLnByb3h5O2lmKGd0KFQsYiksJG4oZHAobyxULGIpKSxobi5vbk1vdW50ZWQoKCk9Pntobi5uZXh0VGljaygoKT0+e1ZuKFQsSi5PTl9SRUFEWSl9KX0pLGhuLm9uQmVmb3JlVW5tb3VudCgoKT0+e1ZuKFQsSi5PTl9VTkxPQUQpfSksdClyZXR1cm4gdChnLHIpfSxlfWZ1bmN0aW9uIGRwKGUsdCxuKXt7bGV0IHI9KCk9PnMud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChlKyIiKTt0LiRnZXRBcHBXZWJ2aWV3PXIsdC4kLmN0eC4kc2NvcGU9eyRnZXRBcHBXZWJ2aWV3OnJ9fXJldHVybiB0LmdldE9wZW5lckV2ZW50Q2hhbm5lbD0oKT0+KG4uZXZlbnRDaGFubmVsfHwobi5ldmVudENoYW5uZWw9bmV3IEouRXZlbnRDaGFubmVsKGUpKSxuLmV2ZW50Q2hhbm5lbCksdH1mdW5jdGlvbiBQUChlKXtyZXR1cm4gei5pc0Z1bmN0aW9uKGUpfWxldCBocD1uZXcgTWFwO2Z1bmN0aW9uIElQKGUsdCl7aHAuc2V0KGUsSi5vbmNlKGtQKHQpKSl9ZnVuY3Rpb24gTlAoZSx0LG4scixvKXtsZXQgYz1UUChlLG8sITApLGc9cWkoKSxiPWhwLmdldCh0KSgpLFY9VD0+Zy5tb3VudFBhZ2UoVCx7X19wYWdlSWQ6ZSxfX3BhZ2VQYXRoOnQsX19wYWdlUXVlcnk6bixfX3BhZ2VJbnN0YW5jZTpyfSxjKTtyZXR1cm4gei5pc1Byb21pc2UoYik/Yi50aGVuKFQ9PlYoVCkpOlYoYil9ZnVuY3Rpb24ga1AoZSl7cmV0dXJuKCk9PlBQKGUpP2UoKS50aGVuKHQ9PmZwKHQpKTpmcChlKX1sZXQgZ3A9ITE7ZnVuY3Rpb24gcHAoKXtpZihncClyZXR1cm47Z3A9ITA7bGV0IGUsdDtpZihmLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRSZWRpcmVjdEluZm8pe2xldHtwYXRoOmMscXVlcnk6ZyxyZWZlcnJlckluZm86Yn09QnMoKTtjJiYoZT1jLHQ9ZyksUi5yZWZlcnJlckluZm89Yn1lbHNle2xldCBjPXMucnVudGltZS5hcmd1bWVudHM7aWYoIWMpcmV0dXJuO3RyeXtsZXQgZz1KU09OLnBhcnNlKGMpO2U9Zy5wYXRofHxnLnBhdGhOYW1lLHQ9Zy5xdWVyeT8iPyIrZy5xdWVyeToiIn1jYXRjaChnKXt9fWlmKCFlfHxlPT09Ui5lbnRyeVBhZ2VQYXRoKXt0JiYoUi5lbnRyeVBhZ2VRdWVyeT10KTtyZXR1cm59bGV0IHI9Si5hZGRMZWFkaW5nU2xhc2goZSksbz1XaShyKTshb3x8KG8ubWV0YS5pc1RhYkJhcnx8KFIucmVhbEVudHJ5UGFnZVBhdGg9Ui5yZWFsRW50cnlQYWdlUGF0aHx8Ui5lbnRyeVBhZ2VQYXRoKSxSLmVudHJ5UGFnZVBhdGg9ZSxSLmVudHJ5UGFnZVF1ZXJ5PXQpfWZ1bmN0aW9uIHFjKGUsdCl7bGV0IG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShXaShlKSkpO3JldHVybiBuLm1ldGE9RmEobi5tZXRhKSx0IT09InByZWxvYWRQYWdlIiYmIVIucmVhbEVudHJ5UGFnZVBhdGgmJih0PT09InJlTGF1bmNoInx8SW4oKS5sZW5ndGg9PT0wKT9uLm1ldGEuaXNRdWl0PSEwOm4ubWV0YS5pc1RhYkJhcnx8KG4ubWV0YS5pc1F1aXQ9ITEpLG59bGV0IENhPXt9O2Z1bmN0aW9uIFJQKGUpe2xldCB0PU9iamVjdC5rZXlzKENhKS5maW5kKG49PkNhW25dLmlkPT09ZS5pZCk7dCYmZGVsZXRlIENhW3RdfWZ1bmN0aW9uIHhQKHt1cmw6ZX0pe2xldCB0PUNhW2VdO3JldHVybiB0JiYodC5fX3BhZ2VfXyYmSW4oKS5maW5kKG49Pm49PT10Ll9fcGFnZV9fKT90Ll9fcHJlbG9hZF9fPSExOnQuY2xvc2UoIm5vbmUiKSxkZWxldGUgQ2FbZV0pLHR9ZnVuY3Rpb24gQlAoe3VybDplLHBhdGg6dCxxdWVyeTpufSl7aWYoIUNhW2VdKXtsZXQgcj1xYyh0LCJwcmVsb2FkUGFnZSIpO0NhW2VdPWlwKHtwYXRoOnQscm91dGVPcHRpb25zOnIscXVlcnk6bix3ZWJ2aWV3RXh0cmFzOntfX3ByZWxvYWRfXzohMH19KX1yZXR1cm4gQ2FbZV19ZnVuY3Rpb24gZmMoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOnIsd2VidmlldzpvLG52dWVQYWdlVm06YyxldmVudENoYW5uZWw6Z30pe2lmKG8mJnBwKCksQ2FbZV0pe289Q2FbZV07bGV0IHdlPW87aWYod2UuX19wYWdlX18paWYoSW4oKS5maW5kKFBlPT5QZT09PXdlLl9fcGFnZV9fKSlvPXZvaWQgMDtlbHNlIHJldHVybiBnJiYod2UuX19wYWdlX18uJHBhZ2UuZXZlbnRDaGFubmVsPWcpLHI9PT0ibGF1bmNoIj9NUChlLHQsbix3ZSxjLGcpOiRuKHdlLl9fcGFnZV9fKSx3ZX1sZXQgYj1xYyh0LHIpO28/KG89cy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG8uaWQpLG8ubnZ1ZT1iLm1ldGEuaXNOVnVlKTpvPWlwKHtwYXRoOnQscm91dGVPcHRpb25zOmIscXVlcnk6bn0pLGIubWV0YS5pZD1wYXJzZUludChvLmlkKSwhIWIubWV0YS5pc1RhYkJhciYmZGkuYXBwZW5kKG8pLHVQKG8sdCxuLGIubWV0YSk7bGV0IFQ9dC5zbGljZSgxKTtvLl9fdW5pYXBwX3JvdXRlPVQ7bGV0IEw9Z2EocixlLG4sYi5tZXRhLGcsUi5kYXJrbW9kZT9zLm5hdmlnYXRvci5nZXRVSVN0eWxlKCk6ImxpZ2h0IiksX2U9cGFyc2VJbnQoby5pZCk7cmV0dXJuIG8ubnZ1ZT9jP0xQKF9lLGMsTCk6dnAoX2UsbyxMKTpOUChfZSxULG4sTCxEUChiKSksb31mdW5jdGlvbiBNUChlLHQsbixyLG8sYyl7bGV0IGc9cWModCwicHJlbG9hZFBhZ2UiKTtnLm1ldGEuaWQ9cGFyc2VJbnQoci5pZCk7bGV0IGI9Z2EoInByZWxvYWRQYWdlIixlLG4sZy5tZXRhLGMsUi5kYXJrbW9kZT9zLm5hdmlnYXRvci5nZXRVSVN0eWxlKCk6ImxpZ2h0Iik7Z3QobyxiKSxyLl9fcGFnZV9fPW99ZnVuY3Rpb24gRFAoe21ldGE6ZX0pe2xldCB0PVd1KCkse3BsYXRmb3JtOm4scGl4ZWxSYXRpbzpyLHdpbmRvd1dpZHRoOm99PVJyKCk7cmV0dXJue2NzczohMCxyb3V0ZTplLnJvdXRlLHZlcnNpb246MSxsb2NhbGU6IiIscGxhdGZvcm06bixwaXhlbFJhdGlvOnIsd2luZG93V2lkdGg6byxkaXNhYmxlU2Nyb2xsOmUuZGlzYWJsZVNjcm9sbD09PSEwLG9uUGFnZVNjcm9sbDohMSxvblBhZ2VSZWFjaEJvdHRvbTohMSxvblJlYWNoQm90dG9tRGlzdGFuY2U6ei5oYXNPd24oZSwib25SZWFjaEJvdHRvbURpc3RhbmNlIik/ZS5vblJlYWNoQm90dG9tRGlzdGFuY2U6Si5PTl9SRUFDSF9CT1RUT01fRElTVEFOQ0Usc3RhdHVzYmFySGVpZ2h0OnQsd2luZG93VG9wOmUubmF2aWdhdGlvbkJhci50eXBlPT09ImZsb2F0Ij90K0ouTkFWQkFSX0hFSUdIVDowLHdpbmRvd0JvdHRvbTpkaS5pbmRleE9mKGUucm91dGUpPj0wJiZkaS5jb3Zlcj9kaS5oZWlnaHQ6MH19ZnVuY3Rpb24gTFAoZSx0LG4pe2d0KHQsbiksJG4oZHAoZSx0LG4pKSxlPT09MSYmKFIuc3BsYXNoc2NyZWVuJiZSLnNwbGFzaHNjcmVlbi5hdXRvY2xvc2UmJiFSLnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZzLm5hdmlnYXRvci5jbG9zZVNwbGFzaHNjcmVlbigpLFIub25SZWFkeShmdW5jdGlvbigpe2xwKCl9KSl9ZnVuY3Rpb24gdnAoZSx0LG4pe2xldCByPXskOnt9LCRnZXRBcHBXZWJ2aWV3KCl7cmV0dXJuIHR9LGdldE9wZW5lckV2ZW50Q2hhbm5lbCgpe3JldHVybiBuLmV2ZW50Q2hhbm5lbHx8KG4uZXZlbnRDaGFubmVsPW5ldyBKLkV2ZW50Q2hhbm5lbChlKSksbi5ldmVudENoYW5uZWx9LF9fc2V0dXAobyxjKXtvLiRnZXRBcHBXZWJ2aWV3PSgpPT50LG8uZ2V0T3BlbmVyRXZlbnRDaGFubmVsPWMuZ2V0T3BlbmVyRXZlbnRDaGFubmVsLGd0KG8sbiksdC5fX3ByZWxvYWRfXyYmKHQuX19wYWdlX189byk7bGV0IGc9SG4oKSxiPWcuZmluZEluZGV4KFY9PlY9PT1jKTtiPi0xJiZnLnNwbGljZShiLDEsbyl9fTtndChyLG4pLHQuX19wcmVsb2FkX18/KHQuX19wYWdlX189cix0LmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLCgpPT57Vm4odC5fX3BhZ2VfXyxKLk9OX1NIT1cpfSksdC5hZGRFdmVudExpc3RlbmVyKCJoaWRlIiwoKT0+e1ZuKHQuX19wYWdlX18sSi5PTl9ISURFKX0pKTokbihyKX1sZXQgbXA9KGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3VybDpyLGV2ZW50czpvLGFuaW1hdGlvblR5cGU6YyxhbmltYXRpb25EdXJhdGlvbjpnfT1lLHtwYXRoOmIscXVlcnk6Vn09Si5wYXJzZVVybChyKSxbVCxMXT1VUChiLGMsZyk7emMoYiwoKT0+e1ZQKHt1cmw6cixwYXRoOmIscXVlcnk6VixldmVudHM6byxhbmlUeXBlOlQsYW5pRHVyYXRpb246TH0pLnRoZW4odCkuY2F0Y2gobil9LGUub3BlblR5cGU9PT0iYXBwTGF1bmNoIil9LEZQPVRlKEx1LG1wLElFLERFKTtmdW5jdGlvbiBWUCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sZXZlbnRzOnIsYW5pVHlwZTpvLGFuaUR1cmF0aW9uOmN9KXtWbihKLk9OX0hJREUpO2xldCBnPW5ldyBKLkV2ZW50Q2hhbm5lbChLZygpKzEscik7cmV0dXJuIG5ldyBQcm9taXNlKGI9PntHYyhmYyh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6Im5hdmlnYXRlVG8iLGV2ZW50Q2hhbm5lbDpnfSksbyxjLCgpPT57Yih7ZXZlbnRDaGFubmVsOmd9KX0pLEJhKCl9KX1mdW5jdGlvbiBVUChlLHQsbil7bGV0e2dsb2JhbFN0eWxlOnJ9PVIsbz1vcyhlKTtyZXR1cm5bdHx8by5hbmltYXRpb25UeXBlfHxyLmFuaW1hdGlvblR5cGV8fE1ULG58fG8uYW5pbWF0aW9uRHVyYXRpb258fHIuYW5pbWF0aW9uRHVyYXRpb258fGpjXX1sZXQgJFA9VGUoRnUsKHt1cmw6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3BhdGg6cixxdWVyeTpvfT1KLnBhcnNlVXJsKGUpO3pjKHIsKCk9PntIUCh7dXJsOmUscGF0aDpyLHF1ZXJ5Om99KS50aGVuKHQpLmNhdGNoKG4pfSl9LGtFLExFKTtmdW5jdGlvbiBIUCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtsZXQgcj13aSgpO3JldHVybiByJiZuYShyKSxuZXcgUHJvbWlzZShvPT57R2MoZmMoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJyZWRpcmVjdFRvIn0pLCJub25lIiwwLCgpPT57aWYocil7bGV0IGM9ci4kZ2V0QXBwV2VidmlldygpO2MuX19wcmVsb2FkX18mJlJQKGMpLGMuY2xvc2UoIm5vbmUiKX1vKHZvaWQgMCl9KSxCYSgpfSl9bGV0IGpQPSh7dXJsOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtwYXRoOnIscXVlcnk6b309Si5wYXJzZVVybChlKTt6YyhyLCgpPT57elAoe3VybDplLHBhdGg6cixxdWVyeTpvfSkudGhlbih0KS5jYXRjaChuKX0pfTtmdW5jdGlvbiB6UCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2xldCBvPUhuKCkuc2xpY2UoMCk7RmUuZmluZChnPT5nLnBhdGg9PT10KS5tZXRhLmlzVGFiQmFyJiZkaS5zd2l0Y2hUYWIodC5zbGljZSgxKSksR2MoZmMoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJyZUxhdW5jaCJ9KSwibm9uZSIsMCwoKT0+e28uZm9yRWFjaChnPT5zcChnLCJub25lIikpLHIodm9pZCAwKX0pLEJhKCl9KX1sZXQgV1A9VGUoVGgsalAsUkUsRkUpLF9wPShlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHt1cmw6cn09ZSx7cGF0aDpvLHF1ZXJ5OmN9PUoucGFyc2VVcmwocik7emMobywoKT0+e1lQKHt1cmw6cixwYXRoOm8scXVlcnk6Y30pLnRoZW4odCkuY2F0Y2gobil9LGUub3BlblR5cGU9PT0iYXBwTGF1bmNoIil9LEdQPVRlKFBjLF9wLHhFLFZFKTtmdW5jdGlvbiBZUCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtkaS5zd2l0Y2hUYWIodC5zbGljZSgxKSk7bGV0IHI9SW4oKSxvPXIubGVuZ3RoLGM9ITEsZz0hMSxiO28+PTEmJihiPXJbby0xXSxiJiYhYi4kLl9faXNUYWJCYXI/KGc9ITAsci5yZXZlcnNlKCkuZm9yRWFjaChUPT57IVQuJC5fX2lzVGFiQmFyJiZUIT09YiYmc3AoVCwibm9uZSIpfSksbmEoYiksTigoKT0+e2IuJHBhZ2Uub3BlblR5cGU9PT0icmVkaXJlY3RUbyI/bmwoYi4kZ2V0QXBwV2VidmlldygpLFlnLGpjKTpubChiLiRnZXRBcHBXZWJ2aWV3KCksImF1dG8iKX0sMTAwKSk6Yz0hMCk7bGV0IFY7cmV0dXJuIEhuKCkuZm9yRWFjaChUPT57Si5hZGRMZWFkaW5nU2xhc2goVC5yb3V0ZSk9PT10PyhULiQuX19pc0FjdGl2ZXx8KGc9ITApLFQuJC5fX2lzQWN0aXZlPSEwLFY9VCk6VC4kLl9faXNUYWJCYXImJihULiQuX19pc0FjdGl2ZT0hMSl9KSxiPT09ViYmKGM9ITEpLGImJmMmJlZuKGIsSi5PTl9ISURFKSxuZXcgUHJvbWlzZShUPT57aWYoVil7bGV0IEw9Vi4kZ2V0QXBwV2VidmlldygpO0wuc2hvdygibm9uZSIpLGcmJiFMLl9fcHJlbG9hZF9fJiZWbihWLEouT05fU0hPVyksQmEoKSxUKHZvaWQgMCl9ZWxzZSBHYyhmYyh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6InN3aXRjaFRhYiJ9KSwibm9uZSIsMCwoKT0+e0JhKCksVCh2b2lkIDApfSw3MCl9KX1sZXQgcVA9RHQoUGgsKHt1cmw6ZX0pPT57bGV0IHQ9eFAoe3VybDplfSk7cmV0dXJuIHQ/e2lkOnQuaWQsdXJsOmUsZXJyTXNnOiJ1blByZWxvYWRQYWdlOm9rIn06e3VybDplLGVyck1zZzoidW5QcmVsb2FkUGFnZTpmYWlsIG5vdCBmb3VuZCJ9fSxNRSksSlA9VGUoVnUsKHt1cmw6ZX0se3Jlc29sdmU6dH0pPT57aWYoQ2FbZV0pcmV0dXJuO2xldCBuPWUuc3BsaXQoIj8iKSxyPW5bMF0sbz1KLnBhcnNlUXVlcnkoblsxXXx8IiIpLGM9QlAoe3VybDplLHBhdGg6cixxdWVyeTpvfSksZz1xYyhyLCJwcmVsb2FkUGFnZSIpO2cubWV0YS5pZD1wYXJzZUludChjLmlkKTtsZXQgYj1nYSgicHJlbG9hZFBhZ2UiLGUsbyxnLm1ldGEsdm9pZCAwLFIuZGFya21vZGU/cy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpOiJsaWdodCIpO3ZwKHBhcnNlSW50KGMuaWQpLGMsYiksdCh7aWQ6Yy5pZCx1cmw6ZSxlcnJNc2c6InByZWxvYWRQYWdlOm9rIn0pfSxCRSk7dmFyIEtQPXtfX3Byb3RvX186bnVsbCwkZW1pdDpjXywkb2ZmOmxfLCRvbjphXywkb25jZTpzXyxfX2xvZ19fOmRULGFkZEludGVyY2VwdG9yOkttLGFkZFBob25lQ29udGFjdDpMQyxhcnJheUJ1ZmZlclRvQmFzZTY0OlRyLGJhc2U2NFRvQXJyYXlCdWZmZXI6UmksY2FuSVVzZTpqdyxjYW52YXNHZXRJbWFnZURhdGE6TF8sY2FudmFzUHV0SW1hZ2VEYXRhOkZfLGNhbnZhc1RvVGVtcEZpbGVQYXRoOlZfLGNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6akMsY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOkhDLGNob29zZUltYWdlOmZBLGNob29zZUxvY2F0aW9uOmNPLGNob29zZVZpZGVvOmRBLGNsZWFyU3RvcmFnZTpOdyxjbGVhclN0b3JhZ2VTeW5jOkl3LGNsb3NlQXV0aFZpZXc6a2csY2xvc2VCTEVDb25uZWN0aW9uOkVDLGNsb3NlQmx1ZXRvb3RoQWRhcHRlcjpnQyxjbG9zZVByZXZpZXdJbWFnZTpuQSxjbG9zZVNvY2tldDpJQSxjb21wcmVzc0ltYWdlOmxBLGNvbXByZXNzVmlkZW86Y0EsY29uZmlnTVRMUzp3QSxjb25uZWN0U29ja2V0OlRBLGNyZWF0ZUFuaW1hdGlvbjppYixjcmVhdGVCTEVDb25uZWN0aW9uOnlDLGNyZWF0ZUNhbnZhc0NvbnRleHQ6RF8sY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQ6SVQsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6V0EsY3JlYXRlSW50ZXJhY3RpdmVBZDpCVCxjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcjp6XyxjcmVhdGVJbnRlcnN0aXRpYWxBZDprVCxjcmVhdGVMaXZlUHVzaGVyQ29udGV4dDpvTyxjcmVhdGVNYXBDb250ZXh0OkVfLGNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcjpHXyxjcmVhdGVQdXNoTWVzc2FnZTpuVCxjcmVhdGVSZXdhcmRlZFZpZGVvQWQ6VFQsY3JlYXRlU2VsZWN0b3JRdWVyeTpYXyxjcmVhdGVWaWRlb0NvbnRleHQ6Yl8sZG93bmxvYWRGaWxlOl9BLGdldEFwcEF1dGhvcml6ZVNldHRpbmc6Y2csZ2V0QXBwQmFzZUluZm86cWgsZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOndDLGdldEJMRURldmljZVJTU0k6UEMsZ2V0QkxFRGV2aWNlU2VydmljZXM6U0MsZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlcjpuTyxnZXRCZWFjb25zOmtDLGdldEJsdWV0b290aEFkYXB0ZXJTdGF0ZTpwQyxnZXRCbHVldG9vdGhEZXZpY2VzOl9DLGdldENoZWNrQm94U3RhdGU6UmcsZ2V0Q2xpcGJvYXJkRGF0YTpGQyxnZXRDb25uZWN0ZWRCbHVldG9vdGhEZXZpY2VzOmJDLGdldERldmljZUluZm86WWgsZ2V0RW50ZXJPcHRpb25zU3luYzpPYixnZXRGaWxlSW5mbzpSdyxnZXRJbWFnZUluZm86UUMsZ2V0TGF1bmNoT3B0aW9uc1N5bmM6VGIsZ2V0TG9jYWxlOktsLGdldExvY2F0aW9uOmxPLGdldE5ldHdvcmtUeXBlOnJnLGdldFByb3ZpZGVyOktPLGdldFB1c2hDbGllbnRJZDpQYixnZXRSZWNvcmRlck1hbmFnZXI6b0EsZ2V0U2F2ZWRGaWxlSW5mbzpVdyxnZXRTYXZlZEZpbGVMaXN0OlZ3LGdldFNjcmVlbkJyaWdodG5lc3M6cUMsZ2V0U2VsZWN0ZWRUZXh0UmFuZ2U6Z2IsZ2V0U3RvcmFnZTpPdyxnZXRTdG9yYWdlSW5mbzprdyxnZXRTdG9yYWdlSW5mb1N5bmM6TWgsZ2V0U3RvcmFnZVN5bmM6QXcsZ2V0U3ViTlZ1ZUJ5SWQ6R08sZ2V0U3lzdGVtSW5mbzpuQyxnZXRTeXN0ZW1JbmZvU3luYzpKaCxnZXRTeXN0ZW1TZXR0aW5nOlpDLGdldFVuaXZlcmlmeU1hbmFnZXI6dFQsZ2V0VXNlckluZm86Wk8sZ2V0VXNlclByb2ZpbGU6WE8sZ2V0VmlkZW9JbmZvOmVBLGdldFdpbmRvd0luZm86R2gsaGlkZUtleWJvYXJkOmdBLGhpZGVMb2FkaW5nOndPLGhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzpOTyxoaWRlVGFiQmFyOkRPLGhpZGVUYWJCYXJSZWREb3Q6VU8saGlkZVRvYXN0OlNPLGluaXRVVFNDbGFzc05hbWU6amcsaW5pdFVUU0luZGV4Q2xhc3NOYW1lOlNULGluaXRVVFNQYWNrYWdlTmFtZTpFVCxpbml0VVRTUHJveHlDbGFzczpIZyxpbml0VVRTUHJveHlGdW5jdGlvbjpfVCxpbnRlcmNlcHRvcnM6WG0saW52b2tlUHVzaENhbGxiYWNrOk11LGxvYWRGb250RmFjZTpPTyxsb2dpbjpUZyxtYWtlUGhvbmVDYWxsOkJDLG5hdmlnYXRlQmFjazpkUCxuYXZpZ2F0ZVRvOkZQLG5hdmlnYXRlVG9NaW5pUHJvZ3JhbTpjVCxub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOkNDLG9mZkFjY2VsZXJvbWV0ZXJDaGFuZ2U6bEMsb2ZmQXBwSGlkZTpBYixvZmZBcHBTaG93OndiLG9mZkNvbXBhc3NDaGFuZ2U6aUMsb2ZmRXJyb3I6RWIsb2ZmS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6dkEsb2ZmTG9jYXRpb25DaGFuZ2U6Z08sb2ZmTG9jYXRpb25DaGFuZ2VFcnJvcjp2TyxvZmZOZXR3b3JrU3RhdHVzQ2hhbmdlOiRDLG9mZlBhZ2VOb3RGb3VuZDpiYixvZmZQdXNoTWVzc2FnZTpOYixvZmZUaGVtZUNoYW5nZTpZQyxvZmZVbmhhbmRsZWRSZWplY3Rpb246bWIsb2ZmV2luZG93UmVzaXplOmNiLG9uQWNjZWxlcm9tZXRlckNoYW5nZTpzQyxvbkFwcEhpZGU6Q2Isb25BcHBTaG93OlNiLG9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpkQyxvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZTpmQyxvbkJlYWNvblNlcnZpY2VDaGFuZ2U6TkMsb25CZWFjb25VcGRhdGU6SUMsb25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2U6dUMsb25CbHVldG9vdGhEZXZpY2VGb3VuZDpjQyxvbkNvbXBhc3NDaGFuZ2U6ckMsb25DcmVhdGVWdWVBcHA6Si5vbkNyZWF0ZVZ1ZUFwcCxvbkVycm9yOnliLG9uSG9zdEV2ZW50UmVjZWl2ZTpEZyxvbktleWJvYXJkSGVpZ2h0Q2hhbmdlOnBBLG9uTG9jYWxlQ2hhbmdlOmZiLG9uTG9jYXRpb25DaGFuZ2U6aE8sb25Mb2NhdGlvbkNoYW5nZUVycm9yOnBPLG9uTmF0aXZlRXZlbnRSZWNlaXZlOnVULG9uTmV0d29ya1N0YXR1c0NoYW5nZTpVQyxvblBhZ2VOb3RGb3VuZDpfYixvblB1c2hNZXNzYWdlOkliLG9uU29ja2V0Q2xvc2U6eEEsb25Tb2NrZXRFcnJvcjprQSxvblNvY2tldE1lc3NhZ2U6UkEsb25Tb2NrZXRPcGVuOk5BLG9uVGFiQmFyTWlkQnV0dG9uVGFwOm9iLG9uVGhlbWVDaGFuZ2U6R0Msb25VbmhhbmRsZWRSZWplY3Rpb246dmIsb25XaW5kb3dSZXNpemU6bGIsb3BlbkFwcEF1dGhvcml6ZVNldHRpbmc6WEMsb3BlbkJsdWV0b290aEFkYXB0ZXI6aEMsb3BlbkRvY3VtZW50Okh3LG9wZW5Mb2NhdGlvbjp1TyxwYWdlU2Nyb2xsVG86VE8scHJlTG9naW46SWcscHJlbG9hZFBhZ2U6SlAscHJldmlld0ltYWdlOnRBLHJlTGF1bmNoOldQLHJlYWRCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlOkFDLHJlZGlyZWN0VG86JFAscmVnaXN0ZXJSdW50aW1lOnJULHJlZ2lzdGVyVVRTSW50ZXJmYWNlOndULHJlZ2lzdGVyVVRTUGx1Z2luOkNULHJlbW92ZUludGVyY2VwdG9yOlptLHJlbW92ZVNhdmVkRmlsZTokdyxyZW1vdmVTdG9yYWdlOlB3LHJlbW92ZVN0b3JhZ2VTeW5jOlR3LHJlbW92ZVRhYkJhckJhZGdlOlZPLHJlcXVlc3Q6U0EscmVxdWVzdFBheW1lbnQ6bFQscmVxdWlyZUdsb2JhbDpxTyxyZXF1aXJlTmF0aXZlUGx1Z2luOkpvLHJlcXVpcmVVVFNQbHVnaW46QVQscmVzdG9yZUdsb2JhbDpZTyxzYXZlRmlsZTpEdyxzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtOnNBLHNhdmVWaWRlb1RvUGhvdG9zQWxidW06YUEsc2NhbkNvZGU6V0Msc2VuZEhvc3RFdmVudDpCZyxzZW5kTmF0aXZlRXZlbnQ6ZWcsc2VuZFNvY2tldE1lc3NhZ2U6UEEsc2V0QkxFTVRVOlRDLHNldENsaXBib2FyZERhdGE6VkMsc2V0S2VlcFNjcmVlbk9uOktDLHNldExvY2FsZTpkYixzZXROYXZpZ2F0aW9uQmFyQ29sb3I6Uk8sc2V0TmF2aWdhdGlvbkJhclRpdGxlOlBPLHNldFBhZ2VNZXRhOmhiLHNldFNjcmVlbkJyaWdodG5lc3M6SkMsc2V0U3RvcmFnZTpDdyxzZXRTdG9yYWdlU3luYzp3dyxzZXRUYWJCYXJCYWRnZTp4TyxzZXRUYWJCYXJJdGVtOkJPLHNldFRhYkJhclN0eWxlOk1PLHNoYXJlOmFULHNoYXJlV2l0aFN5c3RlbTpzVCxzaG93QWN0aW9uU2hlZXQ6Yk8sc2hvd0tleWJvYXJkOmhBLHNob3dMb2FkaW5nOnlPLHNob3dNb2RhbDptTyxzaG93TmF2aWdhdGlvbkJhckxvYWRpbmc6SU8sc2hvd1RhYkJhcjpMTyxzaG93VGFiQmFyUmVkRG90OkZPLHNob3dUb2FzdDpFTyxzdGFydEFjY2VsZXJvbWV0ZXI6WGgsc3RhcnRCZWFjb25EaXNjb3Zlcnk6UkMsc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5OnZDLHN0YXJ0Q29tcGFzczpLaCxzdGFydExvY2F0aW9uVXBkYXRlOmZPLHN0YXJ0UHVsbERvd25SZWZyZXNoOkNPLHN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjp6QyxzdG9wQWNjZWxlcm9tZXRlcjpRaCxzdG9wQmVhY29uRGlzY292ZXJ5OnhDLHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Om1DLHN0b3BDb21wYXNzOlpoLHN0b3BMb2NhdGlvblVwZGF0ZTpkTyxzdG9wUHVsbERvd25SZWZyZXNoOkFPLHN3aXRjaFRhYjpHUCxzeW5jRGF0YVRvR2xvYmFsOkpPLHVuUHJlbG9hZFBhZ2U6cVAsdXBsb2FkRmlsZTpNQSx1cHgycHg6em0sdmlicmF0ZUxvbmc6YUMsdmlicmF0ZVNob3J0Om9DLHdlZXhHZXRTeXN0ZW1JbmZvU3luYzppYyx3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWU6T0N9O2xldCBaUD16LmV4dGVuZChVLHtwdWJsaXNoSGFuZGxlcjpYUH0pO2Z1bmN0aW9uIFhQKGUsdCxuKXt0PUpTT04uc3RyaW5naWZ5KHQpLHouaXNBcnJheShuKXx8KG49W25dKTtsZXQgcj1gdHlwZW9mIFVuaVZpZXdKU0JyaWRnZSAhPT0gJ3VuZGVmaW5lZCcgJiYgVW5pVmlld0pTQnJpZGdlLnN1YnNjcmliZUhhbmRsZXIoIiR7ZX0iLCR7dH0sX19QQUdFX0lEX18pYDtuLmZvckVhY2gobz0+e2xldCBjPVN0cmluZyhvKSxnPXMud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChjKTtnJiZnLmV2YWxKUyhyLnJlcGxhY2UoIl9fUEFHRV9JRF9fIixjKSl9KX1mdW5jdGlvbiBRUCgpe2xldHt0YWJCYXI6ZX09UjtpZighKGUmJmUubGlzdCYmZS5saXN0Lmxlbmd0aCkpcmV0dXJuO2xldHtlbnRyeVBhZ2VQYXRoOm59PVI7ZS5zZWxlY3RlZEluZGV4PTA7bGV0IHI9ZS5saXN0LmZpbmRJbmRleChvPT5vLnBhZ2VQYXRoPT09bik7ZGkuaW5pdChlLChvLGMpPT57UC5zd2l0Y2hUYWIoe3VybDpKLmFkZExlYWRpbmdTbGFzaChvLnBhZ2VQYXRoKSxvcGVuVHlwZToic3dpdGNoVGFiIixmcm9tOiJ0YWJCYXIiLHN1Y2Nlc3MoKXtWbihKLk9OX1RBQl9JVEVNX1RBUCx7aW5kZXg6Yyx0ZXh0Om8udGV4dCxwYWdlUGF0aDpvLnBhZ2VQYXRofSl9fSl9KSxyIT09LTEmJihlLnNlbGVjdGVkSW5kZXg9cixyIT09MCYmZGkuc3dpdGNoVGFiKG4pKX1mdW5jdGlvbiBlSSgpe2xldCBlPXMuZ2xvYmFsRXZlbnQsdD1mLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50Iikse2VtaXQ6bixwdWJsaXNoSGFuZGxlcjpyfT1vdDtmLmNvbmZpZy5wcmVsb2FkP3Mua2V5LmFkZEV2ZW50TGlzdGVuZXIoRm8sRGkpOmUuYWRkRXZlbnRMaXN0ZW5lcigic3BsYXNoY2xvc2VkIiwoKT0+e3Mua2V5LmFkZEV2ZW50TGlzdGVuZXIoRm8sRGkpfSksZS5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsKCk9PntuKEouT05fQVBQX0VOVEVSX0JBQ0tHUk9VTkQpfSksZS5hZGRFdmVudExpc3RlbmVyKCJyZXN1bWUiLCgpPT57bGV0IGM9QnMoKTtjJiZjLnVzZXJBY3Rpb24mJnhzKGMpLG4oSi5PTl9BUFBfRU5URVJfRk9SRUdST1VORCxWbygpKX0pLHQuYWRkRXZlbnRMaXN0ZW5lcigidWlzdHlsZWNoYW5nZSIsZnVuY3Rpb24oYyl7bGV0IGc9e3RoZW1lOmMudWlzdHlsZX07bihKLk9OX1RIRU1FX0NIQU5HRSxnKSxyKEouT05fVEhFTUVfQ0hBTkdFLGcsaGEoKSksWXcoKX0pO2xldCBvPTA7ZS5hZGRFdmVudExpc3RlbmVyKCJLZXlib2FyZEhlaWdodENoYW5nZSIsZnVuY3Rpb24oYyl7byE9PWMuaGVpZ2h0JiYobz1jLmhlaWdodCxuKEouT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSx7aGVpZ2h0Om99KSl9KSx0LmFkZEV2ZW50TGlzdGVuZXIoRlQsZnVuY3Rpb24oYyl7YyYmYy5ldmVudCYmZlQoYy5ldmVudCxjLmRhdGEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsYnApLGUuYWRkRXZlbnRMaXN0ZW5lcigiV2Vidmlld1Bvc3RNZXNzYWdlIixicCl9ZnVuY3Rpb24gYnAoe2RhdGE6ZX0pe2UmJmUudHlwZSYmb3Quc3Vic2NyaWJlSGFuZGxlcigicGx1c01lc3NhZ2UuIitlLnR5cGUsZS5hcmdzKX1mdW5jdGlvbiB5cChlLHQsbj0hMSl7b3Quc3Vic2NyaWJlKCJwbHVzTWVzc2FnZS4iK2UsdCxuKX1mdW5jdGlvbiB0SShlKXtwYihlLiQpO2xldHtlbnRyeVBhZ2VQYXRoOnQsZW50cnlQYWdlUXVlcnk6bixyZWZlcnJlckluZm86cn09UixvPWhzKHtwYXRoOnQscXVlcnk6bixyZWZlcnJlckluZm86cn0pO1ZuKGUsSi5PTl9MQVVOQ0gsbyksVm4oZSxKLk9OX1NIT1csbyk7bGV0IGM9Zi5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0QXBwU3RhdGU7KGMmJk51bWJlcihjKCkpKT09PTImJlZuKGUsSi5PTl9ISURFLG8pfWZ1bmN0aW9uIEVwKGUpe3JldHVybiBlPWUucmVwbGFjZSgvXC8kLywiIiksZS5pbmRleE9mKCJfIik9PT0wP3MuaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKTplfWZ1bmN0aW9uIG5JKCl7bGV0IGU9RXAoZnMpLHQ9RXAoV3IpLG49dC5zcGxpdCgiLyIpO24ucG9wKCk7bGV0IHI9bi5qb2luKCIvIik7cy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHMuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbShyKSxvPT57by5jcmVhdGVSZWFkZXIoKS5yZWFkRW50cmllcyhmdW5jdGlvbihnKXtsZXQgYj1nO2ImJmIubGVuZ3RoJiZiLmZvckVhY2goZnVuY3Rpb24oVil7Vi5pc0RpcmVjdG9yeSYmVi5mdWxsUGF0aC5pbmRleE9mKGUpPT09MCYmVi5mdWxsUGF0aC5pbmRleE9mKHQpIT09MCYmVi5yZW1vdmVSZWN1cnNpdmVseSgpfSl9KX0pfWxldCBTcD0wLHhsPTAsSmM9bnVsbCxybD1udWxsO2Z1bmN0aW9uIHJJKGUsdCl7aWYoSmM9bnVsbCxybCYmKEUocmwpLHJsPW51bGwpLGUudHlwZT09PSJvbkZvY3VzIilpZih4bD4wKWUuZGV0YWlsLmhlaWdodD14bDtlbHNle3JsPU4oZnVuY3Rpb24oKXtlLmRldGFpbC5oZWlnaHQ9eGwsdChlKX0sU3ApLEpjPWZ1bmN0aW9uKCl7cmwmJihFKHJsKSxybD1udWxsKSxlLmRldGFpbC5oZWlnaHQ9eGwsdChlKX07cmV0dXJufXQoZSl9ZnVuY3Rpb24gaUkoKXtTcD1zLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIj8zMDA6NzAwLG90Lm9uKEouT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSx0PT57aWYoeGw9dC5oZWlnaHQseGw+MCl7bGV0IG49SmM7SmM9bnVsbCxuJiZuKCl9fSl9ZnVuY3Rpb24gb0koZSx0LG4pe2xldCByPXQudHlwZTtyPT09Im9uRm9jdXMifHxyPT09Im9uQmx1ciI/ckkodCxvPT57bi5maXJlRXZlbnQoZSxvKX0pOm4uZmlyZUV2ZW50KGUsdCl9ZnVuY3Rpb24gYUkoZSx0KXtsZXQgbj1JcihwYXJzZUludCh0KSk7aWYoIW4pcmV0dXJuO2xldCByPW4uX19wYWdlX2NvbnRhaW5lcl9fO2UuZm9yRWFjaChvPT57c3dpdGNoKG9bMF0pe2Nhc2UgSi5BQ1RJT05fVFlQRV9FVkVOVDpvSShvWzFdLG9bMl0scik7YnJlYWt9fSl9bGV0IHdwPXt9O2Z1bmN0aW9uIHNJKGUsdCxuKXtsZXR7YWRwaWQ6cix3aWR0aDpvfT1lLGM9cisiLSIrbyxnPXdwW2NdO2lmKGcmJmcubGVuZ3RoPjApe3QoZy5zcGxpY2UoMCwxKVswXSk7cmV0dXJufXMuYWQuZ2V0QWRzKGUsYj0+e2xldCBWPWIuYWRzO3QoVi5zcGxpY2UoMCwxKVswXSksd3BbY109Zz9nLmNvbmNhdChWKTpWfSxiPT57bih7ZXJyQ29kZTpiLmNvZGUsZXJyTXNnOmIubWVzc2FnZX0pfSl9ZnVuY3Rpb24gbEkoKXt4KCJnZXRBZERhdGEiLChlLHQpPT57c0koZSxuPT57dCh7Y29kZTowLGRhdGE6bn0pfSxuPT57dCh7Y29kZToxLG1lc3NhZ2U6bn0pfSl9KX1sZXQgY0k9WyJzd2l0Y2hUYWIiLCJyZUxhdW5jaCIsInJlZGlyZWN0VG8iLCJuYXZpZ2F0ZVRvIiwibmF2aWdhdGVCYWNrIl07ZnVuY3Rpb24gdUkoKXtjSS5mb3JFYWNoKGU9Pnt4KGUsdD0+e1BbZV0oei5leHRlbmQodCx7ZmFpbChuKXtjb25zb2xlLmVycm9yKG4uZXJyTXNnKX19KSl9KX0pfWxldCBDcD0hMTtmdW5jdGlvbiBmSShlLHQpe2xldCBuPXQ9PT0iMSI7aWYoIShuJiZDcCkpe2lmKG4/KENwPSEwLGVwKHMud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCkpKTpMaXx8ZXAocy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQpKSwhTGkubG9hZGVkKXtpZihMaS5pZCE9PXQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYHdlYnZpZXdSZWFkeVske0xpLmlkfV1bJHt0fV0gbm90IG1hdGNoYCk7TGkubG9hZGVkPSEwfW90LmVtaXQoUmwrIi4iK3QpLG4mJmRJKCl9fWZ1bmN0aW9uIGRJKCl7bGV0e2F1dG9jbG9zZTplLGFsd2F5c1Nob3dCZWZvcmVSZW5kZXI6dH09Ui5zcGxhc2hzY3JlZW47ZSYmIXQmJnMubmF2aWdhdG9yLmNsb3NlU3BsYXNoc2NyZWVuKCk7bGV0IG49Si5hZGRMZWFkaW5nU2xhc2goUi5lbnRyeVBhZ2VQYXRoKSxyPVdpKG4pO2lmKCFyLm1ldGEuaXNOVnVlKXtsZXQgbz17dXJsOm4rKFIuZW50cnlQYWdlUXVlcnl8fCIiKSxvcGVuVHlwZToiYXBwTGF1bmNoIn0sYz17cmVzb2x2ZSgpe30scmVqZWN0KCl7fX07cmV0dXJuIHIubWV0YS5pc1RhYkJhcj9fcChvLGMpOm1wKG8sYyl9fWZ1bmN0aW9uIGhJKGUsdCl7bGV0IG49SXIocGFyc2VJbnQodCkpO24mJihuLl9fdW5pYXBwX3dlYnZpZXc9ITApfWZ1bmN0aW9uIGdJKGUsdCl7bGV0IG49SXIocGFyc2VJbnQodCkpO24mJmRlbGV0ZSBuLl9fdW5pYXBwX3dlYnZpZXd9bGV0IHBJPSh7bmFtZTplLGFyZzp0fSxuKT0+e2U9PT0icG9zdE1lc3NhZ2UiP3ZJKG5bMF0sdCk6UFtlXSh6LmV4dGVuZCh0LHtmYWlsKHIpe2NvbnNvbGUuZXJyb3Ioci5lcnJNc2cpfX0pKX07ZnVuY3Rpb24gdkkoZSx0KXtsZXQgbj1tUCgid2ViLXZpZXciLHBhcnNlSW50KGUpKTtuJiZuLmRpc3BhdGNoRXZlbnQoSi5jcmVhdGVVbmlFdmVudCh7dHlwZToib25NZXNzYWdlIix0YXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSxjdXJyZW50VGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksZGV0YWlsOntkYXRhOlt0XX19KSl9ZnVuY3Rpb24gbUkoe25vZGVJZDplLG93bmVySWQ6dCxtZXRob2Q6bixhcmdzOnJ9LG8pe2xldCBjPWNwKGUscGFyc2VJbnQobykpO2lmKCFjKXJldHVybjtsZXQgZz1fSSh0LGMuX192dWVQYXJlbnRDb21wb25lbnQpOyFnfHwhZ1tuXXx8Z1tuXShyKX1mdW5jdGlvbiBfSShlLHQpe2lmKCF0KXJldHVybiBudWxsO2lmKHQudWlkPT09ZSlyZXR1cm4gdC5wcm94eTtsZXQgbj10LnBhcmVudDtmb3IoO247KXtpZihuLnVpZD09PWUpcmV0dXJuIG4ucHJveHk7bj1uLnBhcmVudH1yZXR1cm4gdC5wcm94eX1mdW5jdGlvbiBiSSgpe2xldHtzdWJzY3JpYmU6ZSxzdWJzY3JpYmVIYW5kbGVyOnQscHVibGlzaEhhbmRsZXI6bn09b3Q7aWYoeXAoInN1YnNjcmliZUhhbmRsZXIiLCh7dHlwZTpyLGRhdGE6byxwYWdlSWQ6Y30pPT57dChyLG8sYyl9KSx5cChKLldFQl9JTlZPS0VfQVBQU0VSVklDRSwoe2RhdGE6cix3ZWJ2aWV3SWRzOm99KT0+e3BJKHIsbyl9KSxSLnJlbmRlcmVyIT09Im5hdGl2ZSIpe2UoUmwsZkkpLGUoQ2csYUkpLHYoKSxsSSgpLHVJKCksZShqTyxoSSksZSh6TyxnSSksZShKLk9OX1dYU19JTlZPS0VfQ0FMTF9NRVRIT0QsbUkpO2xldCByPVdpKEouYWRkTGVhZGluZ1NsYXNoKFIuZW50cnlQYWdlUGF0aCkpO3ImJiFyLm1ldGEuaXNOVnVlJiZuKFJsLHt9LDEpfX1sZXQgQmwsbGY9e2dsb2JhbERhdGE6e319O2Z1bmN0aW9uIHlJKHthbGxvd0RlZmF1bHQ6ZT0hMX09e30pe2lmKEJsKXJldHVybiBCbDtpZihlKXJldHVybiBsZjtjb25zb2xlLmVycm9yKCJbd2Fybl06IGdldEFwcCgpIGZhaWxlZC4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLmlvL2NvbGxvY2F0aW9uL2ZyYW1lL3dpbmRvdz9pZD1nZXRhcHAuIil9ZnVuY3Rpb24gRUkoZSl7aWYoUC5WdWV4JiZlLiRzdG9yZSl7bGV0e3VzZVN0b3JlOnR9PVAuVnVleDtQLlZ1ZXgudXNlU3RvcmU9bj0+bj90KG4pOmUuJHN0b3JlfWphKGUpLEJsPWUsY3QoQmwpLHouZXh0ZW5kKEJsLGxmKSx5dChCbCxsZi5nbG9iYWxEYXRhKSxDZSgpLHBwKCksUVAoKSxlSSgpLGlJKCksYkkoKSx0SShlKSxOKG5JLDFlNCksUi5yZWFkeT0hMH12YXIgU0k9e3VuaTpLUCxnZXRBcHA6eUksZ2V0Q3VycmVudFBhZ2VzOnlyLF9fZGVmaW5lUGFnZTpJUCxfX3JlZ2lzdGVyQXBwOkVJLF9fcmVnaXN0ZXJQYWdlOmZjLFVuaVNlcnZpY2VKU0JyaWRnZTpaUH07cmV0dXJuIFNJfShJdCxWdCx3KTtPdD1PdC5kZWZhdWx0fHxPdDtsZXQgUD1PdC51bmksd3Q9T3QuZ2V0QXBwLEluPU90LmdldEN1cnJlbnRQYWdlcyxvdD1PdC5VbmlTZXJ2aWNlSlNCcmlkZ2U7cmV0dXJuIE90fXZhciBjdj11ayhoayk7ZnVuY3Rpb24gdXYoZil7fXZhciBmdj1mPT57fTt2YXIgZHY9Zj0+e2xldHtyZWdpc3RlclVUU0ludGVyZmFjZTpzLGluaXRVVFNQcm94eUNsYXNzOnAsaW5pdFVUU1Byb3h5RnVuY3Rpb246dyxpbml0VVRTUGFja2FnZU5hbWU6Tixpbml0VVRTSW5kZXhDbGFzc05hbWU6RSxpbml0VVRTQ2xhc3NOYW1lOmh9PWYseT0iRENsb3VkVW5pRXhpdCIsUj0idW5pLWV4aXQiLEZlPSJidWlsdC1pbiIsSXQ9IiIsVnQ9ITAsT3Q9Tih5LFZ0KSxQPUUoeSxWdCk7Zi5leGl0PXcoITEse21vZHVsZU5hbWU6Uixtb2R1bGVUeXBlOkZlLGVyck1zZzpJdCxtYWluOiEwLHBhY2thZ2U6T3QsY2xhc3M6UCxuYW1lOiJleGl0QnlKcyIscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUV4aXRFeGl0T3B0aW9uc0pTT05PYmplY3QiLGRlZmF1bHQ6IlVUU051bGwifV0scmV0dXJuOiIifSl9O3ZhciBodj1mPT57bGV0e3JlZ2lzdGVyVVRTSW50ZXJmYWNlOnMsaW5pdFVUU1Byb3h5Q2xhc3M6cCxpbml0VVRTUHJveHlGdW5jdGlvbjp3LGluaXRVVFNQYWNrYWdlTmFtZTpOLGluaXRVVFNJbmRleENsYXNzTmFtZTpFLGluaXRVVFNDbGFzc05hbWU6aH09Zix5PSJEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeSIsUj0iRmFjaWFsUmVjb2duaXRpb25WZXJpZnkoXHU1QjlFXHU0RUJBXHU4QkE0XHU4QkMxKSIsRmU9ImJ1aWx0LWluIixJdD0iIixWdD0hMCxPdD1OKHksVnQpLFA9RSh5LFZ0KTtmLnN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnk9dyghMSx7bW9kdWxlTmFtZTpSLG1vZHVsZVR5cGU6RmUsZXJyTXNnOkl0LG1haW46ITAscGFja2FnZTpPdCxjbGFzczpQLG5hbWU6InN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlCeUpzIixwYXJhbXM6W3tuYW1lOiJmYWNlU3R5bGUiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeVN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KSxmLmdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm89dyghMSx7bW9kdWxlTmFtZTpSLG1vZHVsZVR5cGU6RmUsZXJyTXNnOkl0LG1haW46ITAscGFja2FnZTpPdCxjbGFzczpQLG5hbWU6ImdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm9CeUpzIixwYXJhbXM6W10scmV0dXJuOiIifSl9O3ZhciBndj1mPT57bGV0e3JlZ2lzdGVyVVRTSW50ZXJmYWNlOnMsaW5pdFVUU1Byb3h5Q2xhc3M6cCxpbml0VVRTUHJveHlGdW5jdGlvbjp3LGluaXRVVFNQYWNrYWdlTmFtZTpOLGluaXRVVFNJbmRleENsYXNzTmFtZTpFLGluaXRVVFNDbGFzc05hbWU6aH09Zix5PSJEQ2xvdWRVbmlGaWxlU3lzdGVtTWFuYWdlciIsUj0idW5pLWZpbGUtbWFuYWdlciIsRmU9ImJ1aWx0LWluIixJdD0iIixWdD0hMCxPdD1OKHksVnQpLFA9RSh5LFZ0KTtzKCJGaWxlU3lzdGVtTWFuYWdlck9wdGlvbnMiLE9iamVjdC5hc3NpZ24oe21vZHVsZU5hbWU6Uixtb2R1bGVUeXBlOkZlLGVyck1zZzpJdCxwYWNrYWdlOk90LGNsYXNzOmgoeSwiRmlsZVN5c3RlbU1hbmFnZXJCeUpzUHJveHkiLFZ0KX0se21ldGhvZHM6e3JlYWRGaWxlQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZpbGVTeXN0ZW1NYW5hZ2VyUmVhZEZpbGVPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46e319LHdyaXRlRmlsZUJ5SnM6e2FzeW5jOiExLHBhcmFtczpbe25hbWU6Im9wdGlvbnMiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGaWxlU3lzdGVtTWFuYWdlcldyaXRlRmlsZU9wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjp7fX0sdW5saW5rQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZpbGVTeXN0ZW1NYW5hZ2VyVW5MaW5rT3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOnt9fSxta2RpckJ5SnM6e2FzeW5jOiExLHBhcmFtczpbe25hbWU6Im9wdGlvbnMiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGaWxlU3lzdGVtTWFuYWdlck1rRGlyT3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOnt9fSxybWRpckJ5SnM6e2FzeW5jOiExLHBhcmFtczpbe25hbWU6Im9wdGlvbnMiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGaWxlU3lzdGVtTWFuYWdlclJtRGlyT3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOnt9fSxyZWFkZGlyQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZpbGVTeXN0ZW1NYW5hZ2VyUmVhZERpck9wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjp7fX0sYWNjZXNzQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZpbGVTeXN0ZW1NYW5hZ2VyQWNjZXNzT3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOnt9fSxyZW5hbWVCeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pRmlsZVN5c3RlbU1hbmFnZXJSZW5hbWVPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46e319LGNvcHlGaWxlQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZpbGVTeXN0ZW1NYW5hZ2VyQ29weUZpbGVPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46e319LGdldEZpbGVJbmZvQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZpbGVTeXN0ZW1NYW5hZ2VyR2V0RmlsZUluZm9PcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46e319LHN0YXRCeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pRmlsZVN5c3RlbU1hbmFnZXJTdGF0T3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOnt9fX0scHJvcHM6W119KSksZi5nZXRGaWxlU3lzdGVtTWFuYWdlcj13KCExLHttb2R1bGVOYW1lOlIsbW9kdWxlVHlwZTpGZSxlcnJNc2c6SXQsbWFpbjohMCxwYWNrYWdlOk90LGNsYXNzOlAsbmFtZToiZ2V0RmlsZVN5c3RlbU1hbmFnZXJCeUpzIixwYXJhbXM6W10scmV0dXJuOnt0eXBlOiJpbnRlcmZhY2UiLG9wdGlvbnM6IkZpbGVTeXN0ZW1NYW5hZ2VyT3B0aW9ucyJ9fSl9O3ZhciBwdj1mPT57fTt2YXIgdnY9Zj0+e307dmFyIG12PWY9Pnt9O3ZhciBfdj1mPT57fTt2YXIgYnY9Zj0+e307dmFyIHl2PWY9Pnt9O3ZhciBFdj1mPT57fTt2YXIgU3Y9Zj0+e307dmFyIHd2PWY9PntsZXR7cmVnaXN0ZXJVVFNJbnRlcmZhY2U6cyxpbml0VVRTUHJveHlDbGFzczpwLGluaXRVVFNQcm94eUZ1bmN0aW9uOncsaW5pdFVUU1BhY2thZ2VOYW1lOk4saW5pdFVUU0luZGV4Q2xhc3NOYW1lOkUsaW5pdFVUU0NsYXNzTmFtZTpofT1mLHk9IkRDbG91ZFVuaUluc3RhbGxBcGsiLFI9InVuaS1pbnN0YWxsQXBrIixGZT0iYnVpbHQtaW4iLEl0PSIiLFZ0PSEwLE90PU4oeSxWdCksUD1FKHksVnQpO2YuaW5zdGFsbEFwaz13KCExLHttb2R1bGVOYW1lOlIsbW9kdWxlVHlwZTpGZSxlcnJNc2c6SXQsbWFpbjohMCxwYWNrYWdlOk90LGNsYXNzOlAsbmFtZToiaW5zdGFsbEFwa0J5SnMiLHBhcmFtczpbe25hbWU6Im9wdGlvbnMiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlJbnN0YWxsQXBrSW5zdGFsbEFwa09wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjoiIn0pfTt2YXIgQ3Y9Zj0+e307dmFyIEF2PWY9Pnt9O3ZhciBPdj1mPT57fTt2YXIgVHY9Zj0+e307dmFyIFB2PWY9Pnt9O3ZhciBJdj1mPT57fTt2YXIgTnY9Zj0+e307dmFyIGt2PWY9Pnt9O2Z1bmN0aW9uIFJ2KGYpe2Z2KGYpLGR2KGYpLGh2KGYpLGd2KGYpLHB2KGYpLHZ2KGYpLG12KGYpLF92KGYpLGJ2KGYpLHl2KGYpLEV2KGYpLFN2KGYpLHd2KGYpLEN2KGYpLEF2KGYpLE92KGYpLFR2KGYpLFB2KGYpLEl2KGYpLE52KGYpLGt2KGYpLHV2KGYpfXZhciBJZixOZixrZixEYSxSZix4ZixCZjtmdW5jdGlvbiB4digpe3JldHVybiBEYT97X19kZWZpbmVQYWdlOklmLF9fcmVnaXN0ZXJBcHA6TmYsX19yZWdpc3RlclBhZ2U6a2YsdW5pOkRhLHd4OkRhLGdldEFwcDpSZixnZXRDdXJyZW50UGFnZXM6eGYsVW5pU2VydmljZUpTQnJpZGdlOkJmfTp7fX1mdW5jdGlvbiBCdihmKXtsZXR7d2VleDpzLHBsdXM6cCxWdWVTaGFyZWQ6d309ZjtyZXR1cm4gRGF8fCh7X19kZWZpbmVQYWdlOklmLF9fcmVnaXN0ZXJBcHA6TmYsX19yZWdpc3RlclBhZ2U6a2YsdW5pOkRhLGdldEFwcDpSZixnZXRDdXJyZW50UGFnZXM6eGYsVW5pU2VydmljZUpTQnJpZGdlOkJmfT1sdihzLHAsZiksRGEuVnVlU2hhcmVkPXcsUnYoRGEpLFJwKERhKSkse19fZGVmaW5lUGFnZTpJZixfX3JlZ2lzdGVyQXBwOk5mLF9fcmVnaXN0ZXJQYWdlOmtmLHBsdXM6cCx1bmk6RGEsd3g6RGEsZ2V0QXBwOlJmLGdldEN1cnJlbnRQYWdlczp4ZixVbmlTZXJ2aWNlSlNCcmlkZ2U6QmZ9fWZ1bmN0aW9uIE12KGYscyl7bGV0e19fdW5pQ29uZmlnOnB9PXM7aWYoIXApcmV0dXJuO2xldCB3PXMud2VleDt3LmRvY3VtZW50Ll9fJGF1dG9tYXRvcl9fPSEhcC5hdXRvbWF0b3I7bGV0IE49cC5yZW5kZXJlciE9PSJuYXRpdmUiJiZ3LmNvbmZpZy5idW5kbGVVcmwuaW5kZXhPZigiYXBwLXNlcnZpY2UuanMiKSE9PS0xO2lmKEZpKHMseHYoKSksTj9jdihzKTooRHAoZixzKSx0dihzLlZ1ZS5wYXJzZUNsYXNzU3R5bGVzKSksRmkocyxCdihzKSksdy5jb25maWcucGx1c193ZWJfaWQ9PT0iMSIpe2xldCBSPXcucmVxdWlyZU1vZHVsZSgicGx1cyIpO1Iuc2V0RGVmYXVsdEZvbnRTaXplJiZSLnNldERlZmF1bHRGb250U2l6ZShNYXRoLnJvdW5kKHMucGx1cy5zY3JlZW4ucmVzb2x1dGlvbldpZHRoLzIwKSl9bGV0e3NjYWxlOkUsZGV2aWNlV2lkdGg6aCxwbGF0Zm9ybTp5fT1nbG9iYWwuV1hFbnZpcm9ubWVudDtpZih5LnRvTG93ZXJDYXNlKCk9PT0iaW9zIil7bGV0IFI9TWF0aC5jZWlsKGgvRSk7dy5yZXF1aXJlTW9kdWxlKCJtZXRhIikuc2V0Vmlld3BvcnQoe3dpZHRoOlIscm91bmRPZmZEZXZpYXRpb246ITF9KX19dmFyIGNsPWNsYXNzIGV4dGVuZHMgbGx7Y29uc3RydWN0b3Iocyl7c3VwZXIoKTt0aGlzLm5vZGVUeXBlPTg7dGhpcy50eXBlPSJjb21tZW50Ijt0aGlzLnZhbHVlPSIiO3RoaXMudmFsdWU9c310b1N0cmluZygpe3JldHVybiI8IS0tICIrdGhpcy52YWx1ZSsiIC0tPiJ9fTtmdW5jdGlvbiBTbyhmLHM9W10pe3JldHVybnttb2R1bGU6ImRvbSIsbWV0aG9kOmYsYXJnczpzfX12YXIgVWw9Y2xhc3N7Y29uc3RydWN0b3IocyxwKXt0aGlzLmlkPXMsdGhpcy5iYXRjaGVkPSExLHRoaXMudXBkYXRlcz1bXSx6bihwKT9PYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaGFuZGxlciIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnB9KTpjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gaW52YWxpZCBwYXJhbWV0ZXIsIGhhbmRsZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9Y3JlYXRlRmluaXNoKHMpe3JldHVybiB0aGlzLmhhbmRsZXIoW1NvKCJjcmVhdGVGaW5pc2giKV0scyl9dXBkYXRlRmluaXNoKHMpe3JldHVybiB0aGlzLmhhbmRsZXIoW1NvKCJ1cGRhdGVGaW5pc2giKV0scyl9cmVmcmVzaEZpbmlzaChzKXtyZXR1cm4gdGhpcy5oYW5kbGVyKFtTbygicmVmcmVzaEZpbmlzaCIpXSxzKX1jcmVhdGVCb2R5KHMpe2xldCBwPXMudG9KU09OKCksdz1wLmNoaWxkcmVuO2RlbGV0ZSBwLmNoaWxkcmVuO2xldCBOPVtTbygiY3JlYXRlQm9keSIsW3BdKV07cmV0dXJuIHcmJk4ucHVzaC5hcHBseShOLHcubWFwKEU9PlNvKCJhZGRFbGVtZW50IixbcC5yZWYsRSwtMV0pKSksdGhpcy5hZGRBY3Rpb25zKE4pfWFkZEVsZW1lbnQocyxwLHcpe3JldHVybiB3Pj0wfHwodz0tMSksdGhpcy5hZGRBY3Rpb25zKFNvKCJhZGRFbGVtZW50IixbcCxzLnRvSlNPTigpLHddKSl9cmVtb3ZlRWxlbWVudChzKXtpZihJaShzKSl7bGV0IHA9cy5tYXAodz0+U28oInJlbW92ZUVsZW1lbnQiLFt3XSkpO3JldHVybiB0aGlzLmFkZEFjdGlvbnMocCl9cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhTbygicmVtb3ZlRWxlbWVudCIsW3NdKSl9bW92ZUVsZW1lbnQocyxwLHcpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoU28oIm1vdmVFbGVtZW50IixbcyxwLHddKSl9c2V0QXR0cihzLHAsdyl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhTbygidXBkYXRlQXR0cnMiLFtzLHtbcF06d31dKSl9c2V0U3R5bGUocyxwLHcpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoU28oInVwZGF0ZVN0eWxlIixbcyx7W3BdOnd9XSkpfXNldFN0eWxlcyhzLHApe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoU28oInVwZGF0ZVN0eWxlIixbcyxwXSkpfWFkZEV2ZW50KHMscCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhTbygiYWRkRXZlbnQiLFtzLHBdKSl9cmVtb3ZlRXZlbnQocyxwKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKFNvKCJyZW1vdmVFdmVudCIsW3MscF0pKX1oYW5kbGVyKHMscCl7cmV0dXJuIHAmJnAoKX1hZGRBY3Rpb25zKHMpe2xldCBwPXRoaXMudXBkYXRlcyx3PXRoaXMuaGFuZGxlcjtpZihJaShzKXx8KHM9W3NdKSx0aGlzLmJhdGNoZWQpcC5wdXNoLmFwcGx5KHAscyk7ZWxzZSByZXR1cm4gdyhzKX19O3ZhciBNZj17Y3JlYXRlQm9keToiY2FsbENyZWF0ZUJvZHkiLGFkZEVsZW1lbnQ6ImNhbGxBZGRFbGVtZW50IixyZW1vdmVFbGVtZW50OiJjYWxsUmVtb3ZlRWxlbWVudCIsbW92ZUVsZW1lbnQ6ImNhbGxNb3ZlRWxlbWVudCIsdXBkYXRlQXR0cnM6ImNhbGxVcGRhdGVBdHRycyIsdXBkYXRlU3R5bGU6ImNhbGxVcGRhdGVTdHlsZSIsYWRkRXZlbnQ6ImNhbGxBZGRFdmVudCIscmVtb3ZlRXZlbnQ6ImNhbGxSZW1vdmVFdmVudCJ9O2Z1bmN0aW9uIER2KGYscyl7bGV0IHA9c3x8Z2xvYmFsLmNhbGxOYXRpdmU7cmV0dXJuIHpuKHApfHxjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyIiksZnVuY3Rpb24oTil7SWkoTil8fChOPVtOXSk7Zm9yKGxldCBFPTA7RTxOLmxlbmd0aDtFKyspe2xldCBoPXBrKGYsTltFXSxwKTtpZihoPT09LTEpcmV0dXJuIGh9fX1mdW5jdGlvbiBnayhmLHMpe3JldHVybiBmPT09ImRvbSImJk1mW3NdJiZ6bihnbG9iYWxbTWZbc11dKX1mdW5jdGlvbiBwayhmLHMscCl7bGV0e21vZHVsZTp3LG1ldGhvZDpOLGFyZ3M6RX09cztyZXR1cm4gZ2sodyxOKT9nbG9iYWxbTWZbTl1dKGYsLi4uRSwiLTEiKTpwKGYsW3NdLCItMSIpfXZhciBkdT1jbGFzcyBleHRlbmRzIFppe2NvbnN0cnVjdG9yKHMpe3N1cGVyKCk7dGhpcy52YWx1ZT1zLHRoaXMubm9kZVR5cGU9Myx0aGlzLnR5cGU9InRleHQiLHRoaXMudmFsdWU9IiJ9dG9TdHJpbmcoKXtyZXR1cm4iIit0aGlzLnZhbHVlfX07dmFyIEx2PXtzbGlkZXI6e2NoYW5nZTpmdW5jdGlvbihmKXtyZXR1cm57aW5kZXg6Zi5pbmRleCxzb3VyY2U6Zi5zb3VyY2V9fSxzY3JvbGw6ZnVuY3Rpb24oZil7cmV0dXJue29mZnNldFhSYXRpbzpmLm9mZnNldFhSYXRpbyxvZmZzZXRZUmF0aW86Zi5vZmZzZXRZUmF0aW8sZHJhZzpmLmRyYWd9fX0sInNjcm9sbC12aWV3Ijp7c2Nyb2xsZW5kOmZ1bmN0aW9uKGYpe3JldHVybntjb250ZW50T2Zmc2V0OmYuY29udGVudE9mZnNldH19fX07ZnVuY3Rpb24gRnYoZil7bGV0e2F0dHI6cyxvZmZzZXRMZWZ0OnAsb2Zmc2V0VG9wOnd9PWYsTj17fTtyZXR1cm4gcyYmT2JqZWN0LmtleXMocykuZm9yRWFjaChFPT57RS5pbmRleE9mKCJkYXRhLSIpPT09MCYmKE5bRS5yZXBsYWNlKCJkYXRhLSIsIiIpXT1zW0VdKX0pLHtpZDpzJiZzLmlkfHwiIixkYXRhc2V0Ok4sb2Zmc2V0TGVmdDpwfHwwLG9mZnNldFRvcDp3fHwwfX12YXIgdms9WyJhIiwiZGl2IiwibGlzdCIsImNlbGwiLCJsb2FkaW5nIiwicmVmcmVzaCIsInJlY3ljbGUtbGlzdCIsInNjcm9sbGVyIiwiaW5kaWNhdG9yIiwid2F0ZXJmYWxsIiwid2ViIiwicmljaHRleHQiXSxtaz1bInZpZXdhcHBlYXIiLCJ2aWV3ZGlzYXBwZWFyIl0sX2s9e21hcmtlcnRhcDpbIm1hcmtlcklkIl0sY29udHJvbHRhcDpbImNvbnRyb2xJZCJdLHJlZ2lvbmNoYW5nZTpbImNhdXNlZEJ5Il0sZW5kOlsiY2F1c2VkQnkiXSxhcHBlYXI6WyJkaXJlY3Rpb24iXSxkaXNhcHBlYXI6WyJkaXJlY3Rpb24iXX07ZnVuY3Rpb24gVnYoZixzKXtsZXQgcD1mLnR5cGU7aWYobWsuaW5kZXhPZihwKSE9PS0xKXJldHVybiBmO2xldCB3PWYuY3VycmVudFRhcmdldCxOPXcudHlwZS5yZXBsYWNlKCJ1LSIsIiIpO2lmKHZrLmluZGV4T2YoTikhPT0tMSlyZXR1cm4gZjtsZXR7dGltZXN0YW1wOkUsdGFyZ2V0Omh9PWY7aWYoIXMpe2xldCBGZT1MdltOXTtGZT96bihGZVtwXSk/cz1GZVtwXShmKTpzPWYuZGV0YWlsfHx7fTpzPWYuZGV0YWlsfHx7fX1sZXQgeT17dHlwZTpwLHRpbWVTdGFtcDpFLHRhcmdldDpGdihoKSxjdXJyZW50VGFyZ2V0OkZ2KHcpLGRldGFpbDpzLHRvdWNoZXM6cD09PSJ0b3VjaGVuZCJ8fHA9PT0icGFuZW5kIj9bXTpmLmNoYW5nZWRUb3VjaGVzLGNoYW5nZWRUb3VjaGVzOmYuY2hhbmdlZFRvdWNoZXN9O2YuY29tcG9uZW50SWQmJih5LmNvbXBvbmVudElkPWYuY29tcG9uZW50SWQpO2xldCBSPV9rW3BdO3JldHVybiBSJiZSLmZvckVhY2goRmU9PntpbChmLEZlKSYmKHlbRmVdPWZbRmVdKX0pLHl9ZnVuY3Rpb24gYmsoZixzKXtsZXQgcD1zLmF0dHJzfHx7fTtmb3IobGV0IE4gaW4gcClmLnNldEF0dHIoTixwW05dLCEwKTtsZXQgdz1zLnN0eWxlfHx7fTtmb3IobGV0IE4gaW4gdylmLnNldFN0eWxlKE4sd1tOXSwhMCl9dmFyIEtvPWNsYXNze2NvbnN0cnVjdG9yKHMscD0iIix3KXtzPXM/cy50b1N0cmluZygpOiIiLHRoaXMuaWQ9cyx0aGlzLlVSTD1wLHFwKHMsdGhpcyksdGhpcy5ub2RlTWFwPXt9O2xldCBOPUtvLkxpc3RlbmVyfHxVbDt0aGlzLmxpc3RlbmVyPW5ldyBOKHMsd3x8RHYocyxLby5oYW5kbGVyKSksdGhpcy50YXNrQ2VudGVyPW5ldyBWbChzLHc/KEUsaCk9PncoaCk6S28uaGFuZGxlciksdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX1nZXRSZWYocyl7cmV0dXJuIHRoaXMubm9kZU1hcFtzXX1vcGVuKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSExfWNsb3NlKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSEwfWNyZWF0ZURvY3VtZW50RWxlbWVudCgpe2lmKCF0aGlzLmRvY3VtZW50RWxlbWVudCl7bGV0IHM9bmV3IFppKCJkb2N1bWVudCIpO3MuZG9jSWQ9dGhpcy5pZCxzLm93bmVyRG9jdW1lbnQ9dGhpcyxzLnJvbGU9ImRvY3VtZW50RWxlbWVudCIscy5yZWY9Il9kb2N1bWVudEVsZW1lbnQiLHRoaXMubm9kZU1hcC5fZG9jdW1lbnRFbGVtZW50PXMsdGhpcy5kb2N1bWVudEVsZW1lbnQ9cyxPYmplY3QuZGVmaW5lUHJvcGVydHkocywiYXBwZW5kQ2hpbGQiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpwPT57Z2YodGhpcyxwKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocywiaW5zZXJ0QmVmb3JlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6KHAsdyk9PntnZih0aGlzLHAsdyl9fSksUW4oImRlYnVnIikmJlZpKGBDcmVhdGUgZG9jdW1lbnQgZWxlbWVudCAoaWQ6ICIke3MuZG9jSWR9IiwgcmVmOiAiJHtzLnJlZn0iKWApfXJldHVybiB0aGlzLmRvY3VtZW50RWxlbWVudH1jcmVhdGVCb2R5KHMscCl7aWYoIXRoaXMuYm9keSl7bGV0IHc9bmV3IFppKHMscCk7cGYodGhpcyx3KSxRbigiZGVidWciKSYmVmkoYFtjcmVhdGVCb2R5XSgke3RoaXMuaWR9LCR7dy50eXBlfSwke3cucmVmfSkgKCR7SlNPTi5zdHJpbmdpZnkody50b0pTT04oITApKX0pLmApfXJldHVybiB0aGlzLmJvZHl9Y3JlYXRlRWxlbWVudChzLHApe2xldCB3PW5ldyBaaShzLHApO3JldHVybiBRbigiZGVidWciKSYmVmkoYFtjcmVhdGVFbGVtZW50XSgke3RoaXMuaWR9LCR7dy50eXBlfSwke3cucmVmfSkgKCR7SlNPTi5zdHJpbmdpZnkody50b0pTT04oITApKX0pLmApLHd9Y3JlYXRlQ29tbWVudChzKXtyZXR1cm4gbmV3IGNsKHMpfWNyZWF0ZVRleHQocyl7cmV0dXJuIG5ldyBkdShzKX1maXJlRXZlbnQocyxwLHcsTixFKXtpZighcylyZXR1cm47dz13fHx7fSx3LnR5cGU9dy50eXBlfHxwLHcudGFyZ2V0PXMsdy5jdXJyZW50VGFyZ2V0PXMsdy50aW1lc3RhbXA9RGF0ZS5ub3coKSxOJiZiayhzLE4pO2xldCBoPSEwLHk9dGhpcy5nZXRSZWYoIl9yb290Iik7aWYoeSYmeS5hdHRyKXtsZXQgUj15LmF0dHIuYnViYmxlO2g9Uj09PSJ0cnVlInx8Uj09PSEwfHxoJiZSPT09dm9pZCAwfXJldHVybiB3PVZ2KHcpLHMuZmlyZUV2ZW50KHAsdyxoLEUpfWRlc3Ryb3koKXtRbigiZGVidWciKSYmVmkoYFtkZXN0cm95XSgke3RoaXMuaWR9LGRvY3VtZW50KSBEZXN0cm95IGRvY3VtZW50IChpZDogIiR7dGhpcy5pZH0iLCBVUkw6ICIke3RoaXMuVVJMfSIpYCksdGhpcy50YXNrQ2VudGVyLmRlc3Ryb3lDYWxsYmFjaygpLGRlbGV0ZSB0aGlzLmxpc3RlbmVyLGRlbGV0ZSB0aGlzLm5vZGVNYXAsZGVsZXRlIHRoaXMudGFza0NlbnRlcixKcCh0aGlzLmlkKX19O0tvLmhhbmRsZXI9bnVsbDt2YXIgVXY9e0lucHV0RWxlbWVudERpdjoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsSW5wdXRFbGVtZW50UmVnRXhwOiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixSZXNlcnZlZFdvcmQ6IjxLZXl3b3JkPnw8TnVsbExpdGVyYWw+fDxCb29sZWFuTGl0ZXJhbD4iLFdoaXRlU3BhY2U6L1tcdFx2XGZcdTAwMjBcdTAwQTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVmXHUzMDAwXHVGRUZGXS8sTGluZVRlcm1pbmF0b3I6L1tcblxyXHUyMDI4XHUyMDI5XS8sS2V5d29yZDovbmV3KD8hW18kYS16QS1aMC05XSl8dm9pZCg/IVtfJGEtekEtWjAtOV0pfGRlbGV0ZSg/IVtfJGEtekEtWjAtOV0pfGluKD8hW18kYS16QS1aMC05XSl8aW5zdGFuY2VvZig/IVtfJGEtekEtWjAtOV0pfHR5cGVvZig/IVtfJGEtekEtWjAtOV0pLyxOdWxsTGl0ZXJhbDovbnVsbCg/IVtfJGEtekEtWjAtOV0pLyxCb29sZWFuTGl0ZXJhbDovKD86dHJ1ZXxmYWxzZSkoPyFbXyRhLXpBLVowLTldKS8sSWRlbnRpZmllcjovW18kYS16QS1aXVtfJGEtekEtWjAtOV0qLyxQdW5jdHVhdG9yOi9cL3w9PnxcKlwqfD4+Pj18Pj49fDw8PXw9PT18IT09fD4+Pnw8PHwlPXxcKj18LT18XCs9fDw9fD49fD09fCE9fFxePXxcfD18XHxcfHwmJnwmPXw+PnxcK1wrfC0tfFw6fH18XCp8JnxcfHxcXnwhfH58LXxcK3xcP3wlfD18Pnw8fCx8O3xcLig/IVswLTldKXxcXXxcW3xcKXxcKHx7LyxEaXZQdW5jdHVhdG9yOi9cLz18XC8vLE51bWVyaWNMaXRlcmFsOi8oPzowW3hYXVswLTlhLWZBLUZdKnxcLlswLTldK3woPzpbMS05XStbMC05XSp8MCkoPzpcLlswLTldKnxcLik/KSg/OltlRV1bKy1dezAsMX1bMC05XSspPyg/IVtfJGEtekEtWjAtOV0pLyxTdHJpbmdMaXRlcmFsOi8iKD86W14iXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKiJ8Jyg/OlteJ1xuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSonLyxSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWw6L1wvKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W14qXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkoPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKlwvWzAtOWEtekEtWl0qL307ZnVuY3Rpb24gJHYoZixzLHApe3ZhciB3PVtzXTtmdW5jdGlvbiBOKGgpe3ZhciB5PW5ldyBSZWdFeHA7cmV0dXJuIHkuY29tcGlsZShoLnJlcGxhY2UoLzwoW14+XSspPi9nLGZ1bmN0aW9uKFIsRmUpe3JldHVybiBmW0ZlXT8ody5wdXNoKEZlKSxmW0ZlXWluc3RhbmNlb2YgUmVnRXhwPyIoIitmW0ZlXS5zb3VyY2UrIikiOiIoIitOKGZbRmVdKS5zb3VyY2UrIikiKToiIn0pLHApLHl9dmFyIEU9TihmW3NdKTt0aGlzLmV4ZWM9ZnVuY3Rpb24oaCl7dmFyIHk9RS5leGVjKGgpO2lmKHk9PW51bGwpcmV0dXJuIG51bGw7Zm9yKHZhciBSPW5ldyBTdHJpbmcoeVswXSksRmU9MDtGZTx3Lmxlbmd0aDtGZSsrKXlbRmVdJiYoUlt3W0ZlXV09eVtGZV0pO3JldHVybiBSfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibGFzdEluZGV4Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUubGFzdEluZGV4fSxzZXQ6ZnVuY3Rpb24oaCl7RS5sYXN0SW5kZXg9aH19KX1mdW5jdGlvbiB5aygpe3ZhciBmPW5ldyAkdihVdiwiSW5wdXRFbGVtZW50RGl2IiwiZyIpLHM9bmV3ICR2KFV2LCJJbnB1dEVsZW1lbnRSZWdFeHAiLCJnIikscDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic291cmNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHB9LHNldDpmdW5jdGlvbih3KXtwPXcsZi5sYXN0SW5kZXg9MCxzLmxhc3RJbmRleD0wfX0pLHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtmLmxhc3RJbmRleD0wLHMubGFzdEluZGV4PTB9LHRoaXMuZ2V0TmV4dFRva2VuPWZ1bmN0aW9uKHcpe3ZhciBOPWYubGFzdEluZGV4LEU7dz9FPWY6RT1zO3ZhciBoPUUuZXhlYyhwKTtpZihoJiZFLmxhc3RJbmRleC1OPmgubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBJTExFR0FMIik7cmV0dXJuIGYubGFzdEluZGV4PUUubGFzdEluZGV4LHMubGFzdEluZGV4PUUubGFzdEluZGV4LGh9fXZhciBIdj17SWRlbnRpZmllck5hbWU6W1siSWRlbnRpZmllciJdXSxMaXRlcmFsOltbIk51bGxMaXRlcmFsIl0sWyJCb29sZWFuTGl0ZXJhbCJdLFsiTnVtZXJpY0xpdGVyYWwiXSxbIlN0cmluZ0xpdGVyYWwiXSxbIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCJdXSxQcmltYXJ5RXhwcmVzc2lvbjpbWyJJZGVudGlmaWVyIl0sWyJMaXRlcmFsIl0sWyIoIiwiRXhwcmVzc2lvbiIsIikiXV0sQ2FsbEV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iLCJBcmd1bWVudHMiXSxbIkNhbGxFeHByZXNzaW9uIiwiQXJndW1lbnRzIl1dLEFyZ3VtZW50czpbWyIoIiwiKSJdLFsiKCIsIkFyZ3VtZW50TGlzdCIsIikiXV0sQXJndW1lbnRMaXN0OltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiQXJndW1lbnRMaXN0IiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxMZWZ0SGFuZFNpZGVFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIl0sWyJDYWxsRXhwcmVzc2lvbiJdXSxVbmFyeUV4cHJlc3Npb246W1siTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiJdLFsidm9pZCIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiKyIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiLSIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsifiIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiISIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxFeHBvbmVudGlhdGlvbkV4cHJlc3Npb246W1siVW5hcnlFeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iLCIqKiIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiLyIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIqIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIlIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl1dLEFkZGl0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIisiLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIi0iLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXV0sU2hpZnRFeHByZXNzaW9uOltbIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPDwiLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+Pj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXV0sUmVsYXRpb25hbEV4cHJlc3Npb246W1siU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjwiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbnN0YW5jZW9mIiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluIiwiU2hpZnRFeHByZXNzaW9uIl1dLEVxdWFsaXR5RXhwcmVzc2lvbjpbWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl1dLEJpdHdpc2VBTkRFeHByZXNzaW9uOltbIkVxdWFsaXR5RXhwcmVzc2lvbiJdLFsiQml0d2lzZUFOREV4cHJlc3Npb24iLCImIiwiRXF1YWxpdHlFeHByZXNzaW9uIl1dLEJpdHdpc2VYT1JFeHByZXNzaW9uOltbIkJpdHdpc2VBTkRFeHByZXNzaW9uIl0sWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiIsIl4iLCJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdXSxCaXR3aXNlT1JFeHByZXNzaW9uOltbIkJpdHdpc2VYT1JFeHByZXNzaW9uIl0sWyJCaXR3aXNlT1JFeHByZXNzaW9uIiwifCIsIkJpdHdpc2VYT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxBTkRFeHByZXNzaW9uOltbIkJpdHdpc2VPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIiwiJiYiLCJCaXR3aXNlT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxPUkV4cHJlc3Npb246W1siTG9naWNhbEFOREV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCJ8fCIsIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl1dLENvbmRpdGlvbmFsRXhwcmVzc2lvbjpbWyJMb2dpY2FsT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwiPyIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI6IiwiTG9naWNhbE9SRXhwcmVzc2lvbiJdXSxFeHByZXNzaW9uOltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXhwcmVzc2lvbiIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sUHJvZ3JhbTpbWyJFeHByZXNzaW9uIl1dfTtmdW5jdGlvbiB2YyhmLHMpe3RoaXMubmFtZT1mLHRoaXMudG9rZW49cyx0aGlzLmNoaWxkTm9kZXM9W10sdGhpcy50b1N0cmluZz1mdW5jdGlvbihwKXtpZihwfHwocD0iIiksdGhpcy5jaGlsZE5vZGVzLmxlbmd0aD09MSlyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdLnRvU3RyaW5nKHApO2Zvcih2YXIgdz1wK3RoaXMubmFtZSsodGhpcy50b2tlbiE9bnVsbCYmdGhpcy5uYW1lIT10aGlzLnRva2VuPyI6Iit0aGlzLnRva2VuOiIiKStgCmAsTj0wO048dGhpcy5jaGlsZE5vZGVzLmxlbmd0aDtOKyspdys9dGhpcy5jaGlsZE5vZGVzW05dLnRvU3RyaW5nKHArIiAgICAiKTtyZXR1cm4gd319ZnVuY3Rpb24gRWsoKXt2YXIgZixzPXtQcm9ncmFtOiIkIn0scD17fTtmdW5jdGlvbiB3KHkpe3BbSlNPTi5zdHJpbmdpZnkoeSldPXk7Zm9yKHZhciBSPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHkpO1IubGVuZ3RoOyl7dmFyIEZlPVIuc2hpZnQoKTshSHZbRmVdfHxIdltGZV0uZm9yRWFjaChmdW5jdGlvbihWdCl7eVtWdFswXV18fFIucHVzaChWdFswXSk7dmFyIE90PXksUD1udWxsO1Z0LmZvckVhY2goZnVuY3Rpb24od3Qpe090W3d0XXx8KE90W3d0XT17fSksUD1PdCxPdD1PdFt3dF19KSx5W0ZlXS4kZGl2JiYoT3QuJGRpdj0hMCksT3QuJHJlZHVjZT1GZSxPdC4kY291bnQ9VnQubGVuZ3RofSl9Zm9yKHZhciBJdCBpbiB5KXR5cGVvZiB5W0l0XSE9Im9iamVjdCJ8fEl0LmNoYXJBdCgwKT09IiQifHx5W0l0XS4kY2xvc3VyZXx8KHBbSlNPTi5zdHJpbmdpZnkoeVtJdF0pXT95W0l0XT1wW0pTT04uc3RyaW5naWZ5KHlbSXRdKV06dyh5W0l0XSkpO3kuJGNsb3N1cmU9ITB9dyhzKTt2YXIgTj1bXSxFPVtzXSxoPXM7dGhpcy5pbnNlcnRTeW1ib2w9ZnVuY3Rpb24oUixGZSl7Zm9yKDshaFtSLm5hbWVdJiZoLiRyZWR1Y2U7KXtmb3IodmFyIEl0PWguJGNvdW50LFZ0PW5ldyB2YyhoLiRyZWR1Y2UpO0l0LS07KVZ0LmNoaWxkTm9kZXMucHVzaChOLnBvcCgpKSxFLnBvcCgpO2g9RVtFLmxlbmd0aC0xXSx0aGlzLmluc2VydFN5bWJvbChWdCl9aWYoaD1oW1IubmFtZV0sTi5wdXNoKFIpLEUucHVzaChoKSwhaCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGguJGRpdn0sdGhpcy5yZXNldD1mdW5jdGlvbigpe2g9cyxOPVtdLEU9W3NdfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ3JhbW1hclRyZWUiLHtnZXQ6ZnVuY3Rpb24oKXt0cnl7Zm9yKDtoLiRyZWR1Y2U7KXtmb3IodmFyIHk9aC4kY291bnQsUj1uZXcgdmMoaC4kcmVkdWNlKTt5LS07KVIuY2hpbGROb2Rlcy5wdXNoKE4ucG9wKCkpLEUucG9wKCk7aD1FW0UubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKFIpfWlmKE4ubGVuZ3RoPjAmJmhbIjsiXSlyZXR1cm4gdGhpcy5pbnNlcnRTeW1ib2wobmV3IHZjKCI7IiwiOyIpKSx0aGlzLmdyYW1tYXJUcmVlO2lmKE4ubGVuZ3RoIT0xfHxOWzBdLm5hbWUhPSJQcm9ncmFtIil0aHJvdyBuZXcgRXJyb3J9Y2F0Y2goRmUpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKX1yZXR1cm4gTlswXX19KX1mdW5jdGlvbiBTaygpe3RoaXMubGV4aWNhbFBhcnNlcj1uZXcgeWssdGhpcy5zeW50YWN0aWNhbFBhcnNlcj1uZXcgRWs7dmFyIGY9WyJOdWxsTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVtZXJpY0xpdGVyYWwiLCJTdHJpbmdMaXRlcmFsIiwiUmVndWxhckV4cHJlc3Npb25MaXRlcmFsIiwiSWRlbnRpZmllciIsIioqIiwiPT4iLCJ7IiwifSIsIigiLCIpIiwiWyIsIl0iLCIuIiwiOyIsIiwiLCI8IiwiPiIsIjw9IiwiPj0iLCI9PSIsIiE9IiwiPT09IiwiIT09IiwiKyIsIi0iLCIqIiwiJSIsIisrIiwiLS0iLCI8PCIsIj4+IiwiPj4+IiwiJiIsInwiLCJeIiwiISIsIn4iLCImJiIsInx8IiwiPyIsIjoiLCI9IiwiKz0iLCItPSIsIio9IiwiJT0iLCI8PD0iLCI+Pj0iLCI+Pj49IiwiJj0iLCJ8PSIsIl49IiwiLyIsIi89IiwiaW5zdGFuY2VvZiIsInR5cGVvZiIsIm5ldyIsInZvaWQiLCJkZWJ1Z2dlciIsInRoaXMiLCJkZWxldGUiLCJpbiJdLHM9e307Zi5mb3JFYWNoKGZ1bmN0aW9uKHApe09iamVjdC5kZWZpbmVQcm9wZXJ0eShzLHAse30pfSksdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGV4aWNhbFBhcnNlci5yZXNldCgpLHRoaXMuc3ludGFjdGljYWxQYXJzZXIucmVzZXQoKX0sdGhpcy5wYXJzZT1mdW5jdGlvbihwLHcpe3ZhciBOLEU9ITE7dGhpcy5sZXhpY2FsUGFyc2VyLnNvdXJjZT1wO2Zvcih2YXIgaD0hMTtOPXRoaXMubGV4aWNhbFBhcnNlci5nZXROZXh0VG9rZW4oaCk7KXt3JiZ3KE4pO3RyeXtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhOKS5zb21lKHk9PnMuaGFzT3duUHJvcGVydHkoeSk/KGg9dGhpcy5zeW50YWN0aWNhbFBhcnNlci5pbnNlcnRTeW1ib2wobmV3IHZjKHksTiksRSksRT0hMSwhMCk6ITEpKWNvbnRpbnVlOyhOLktleXdvcmR8fE4uUHVuY3R1YXRvcnx8Ti5EaXZQdW5jdHVhdG9yKSYmcy5oYXNPd25Qcm9wZXJ0eShOLnRvU3RyaW5nKCkpJiYoaD10aGlzLnN5bnRhY3RpY2FsUGFyc2VyLmluc2VydFN5bWJvbChuZXcgdmMoTi50b1N0cmluZygpLE4pLEUpKX1jYXRjaCh5KXt0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gIitOKX19cmV0dXJuIHRoaXMuc3ludGFjdGljYWxQYXJzZXIuZ3JhbW1hclRyZWV9fXZhciBqdj1uZXcgU2s7ZnVuY3Rpb24gd2soZil7anYucmVzZXQoKSx0aGlzLnRyZWU9anYucGFyc2UoZiksdGhpcy5wYXRocz1bXTt2YXIgcz1PYmplY3QuY3JlYXRlKG51bGwpLHA9dGhpcyx3PU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5pc1NpbXBsZSx0aGlzLmlzQ29uc3QsRSh0aGlzLnRyZWUpLE4odGhpcy50cmVlKSx0aGlzLnBhdGhzLmxlbmd0aD09PTAmJih0aGlzLmlzQ29uc3Q9ITApLHRoaXMuc2V0dGVyPWZ1bmN0aW9uKFIpe2Zvcih2YXIgRmU9cyxJdD0wO0l0PFIubGVuZ3RoLTE7SXQrKylGZVtSW0l0XV18fChGZVtSW0l0XV09T2JqZWN0LmNyZWF0ZShudWxsKSksRmU9RmVbUltJdF1dO3JldHVybntpc0NvbXBsZXRlZDpmdW5jdGlvbigpe2Zvcih2YXIgVnQgaW4gdylpZighd1tWdF0pcmV0dXJuITE7cmV0dXJuITB9LHNldDpmdW5jdGlvbihWdCl7aWYod1tSLmpvaW4oIi4iKV18fCh3W1Iuam9pbigiLiIpXT0hMCksRmVbUltJdF1dPVZ0LHRoaXMuaXNDb21wbGV0ZWQoKSlyZXR1cm4gcC5leGVjKCl9fX0sdGhpcy52YWx1ZU9mPXRoaXMuZXhlYz1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4oMCxldmFsKShmKX0uY2FsbChzKX1jYXRjaChSKXt9fTtmdW5jdGlvbiBOKFIpe2Zvcih2YXIgRmU9UjtGZS5jaGlsZE5vZGVzLmxlbmd0aDw9MSYmRmUubmFtZSE9PSJNZW1iZXJFeHByZXNzaW9uIjspRmU9RmUuY2hpbGROb2Rlc1swXTtGZS5uYW1lPT09Ik1lbWJlckV4cHJlc3Npb24iP3AuaXNTaW1wbGU9ITA6cC5pc1NpbXBsZT0hMX1mdW5jdGlvbiBFKFIpe2lmKFIubmFtZT09PSJDYWxsRXhwcmVzc2lvbiImJlIuY2hpbGROb2Rlc1tSLmNoaWxkTm9kZXMubGVuZ3RoLTFdLm5hbWUhPT0iQ2FsbEV4cHJlc3Npb24iKXt2YXIgRmU9aChSLmNoaWxkTm9kZXNbMV0pO0UoUi5jaGlsZE5vZGVzWzBdKX1lbHNlIGlmKFIubmFtZT09PSJOZXdFeHByZXNzaW9uIiYmUi5jaGlsZE5vZGVzLmxlbmd0aD09PTEpdmFyIEZlPWgoUi5jaGlsZE5vZGVzWzBdKTtlbHNlIGlmKFIubmFtZT09PSJNZW1iZXJFeHByZXNzaW9uIiYmUi5jaGlsZE5vZGVzLmxlbmd0aD09PTEpdmFyIEZlPWgoUik7ZWxzZSBmb3IodmFyIEl0PTA7SXQ8Ui5jaGlsZE5vZGVzLmxlbmd0aDtJdCsrKUUoUi5jaGlsZE5vZGVzW0l0XSl9ZnVuY3Rpb24gaChSKXtpZihSLmNoaWxkTm9kZXNbMF0ubmFtZT09PSJJZGVudGlmaWVyTmFtZSIpe3ZhciBGZT1oKFIuY2hpbGROb2Rlc1syXSk7cmV0dXJuIEZlJiYoRmU9RmUuY29uY2F0KFIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnRva2VuLnRvU3RyaW5nKCkpKSx5KEZlKSxGZX1lbHNlIGlmKFIuY2hpbGROb2Rlc1swXS5uYW1lPT09IlByaW1hcnlFeHByZXNzaW9uIilpZihSLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5uYW1lPT09IklkZW50aWZpZXIiKXt2YXIgRmU9W1IuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnRva2VuLnRvU3RyaW5nKCldO3JldHVybiB5KEZlKSxGZX1lbHNlIHJldHVybiBudWxsO2Vsc2V7aWYoUi5jaGlsZE5vZGVzWzBdLm5hbWU9PT0iXSIpcmV0dXJuIGgoUi5jaGlsZE5vZGVzWzNdKSxFKFIuY2hpbGROb2Rlc1sxXSksbnVsbDtpZihSLmNoaWxkTm9kZXNbMF0ubmFtZT09PSJBcmd1bWVudHMiKXJldHVybiBFKFIuY2hpbGROb2Rlc1swXSksRShSLmNoaWxkTm9kZXNbMV0pLG51bGw7Zm9yKHZhciBJdD0wO0l0PFIuY2hpbGROb2Rlcy5sZW5ndGg7SXQrKylFKFIuY2hpbGROb2Rlc1tJdF0pfX1mdW5jdGlvbiB5KFIpe2Zvcih2YXIgRmU9cyxJdD0wO0l0PFIubGVuZ3RoLTE7SXQrKylGZVtSW0l0XV18fChGZVtSW0l0XV09T2JqZWN0LmNyZWF0ZShudWxsKSksRmU9RmVbUltJdF1dO3AucGF0aHMucHVzaChSKSx3W1Iuam9pbigiLiIpXT0hMX19ZnVuY3Rpb24gdWwoZil7dmFyIHM9Zi5jaGlsZE5vZGVzLnNsaWNlKCkucmV2ZXJzZSgpLHA9cy5maWx0ZXIoUj0+IVIudG9rZW58fCFSLnRva2VuLlB1bmN0dWF0b3IpO2lmKGYubmFtZT09PSJVbmFyeUV4cHJlc3Npb24iJiZzLmxlbmd0aD09PTImJnNbMF0ubmFtZT09PSItIiYmcC5sZW5ndGg9PT0xKXt2YXIgdz11bChwWzBdKTtyZXR1cm4gdy52YWx1ZT0tdy52YWx1ZSx3fWlmKGYubmFtZT09PSJBcmd1bWVudHMiKXtmb3IodmFyIE49W10sRT1wWzBdO0U7KUUuY2hpbGROb2Rlcy5sZW5ndGg9PT0zJiYoTi51bnNoaWZ0KEUuY2hpbGROb2Rlc1swXSksRT1FLmNoaWxkTm9kZXNbMl0pLEUuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiYoTi51bnNoaWZ0KEUuY2hpbGROb2Rlc1swXSksRT1udWxsKTtyZXR1cm57dHlwZToiQXJndW1lbnRzIixjaGlsZHJlbjpOLm1hcChSPT51bChSKSl9fWlmKHAmJnAubGVuZ3RoPT09MSl7dmFyIHc9dWwocFswXSk7cmV0dXJuIHd9aWYoZi50b2tlbiYmWyJOdWxsTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVtZXJpY0xpdGVyYWwiLCJTdHJpbmdMaXRlcmFsIiwiSWRlbnRpZmllciJdLnNvbWUoUj0+Zi50b2tlbltSXSkpe3ZhciBoPU9iamVjdC5rZXlzKGYudG9rZW4pLmZpbHRlcihSPT5SLm1hdGNoKC9MaXRlcmFsLyl8fFIubWF0Y2goL0lkZW50aWZpZXIvKSlbMF0seT17TnVsbExpdGVyYWw6bnVsbCxCb29sZWFuTGl0ZXJhbDpCb29sZWFuKGYudG9rZW4pLE51bWVyaWNMaXRlcmFsOk51bWJlcihmLnRva2VuKSxTdHJpbmdMaXRlcmFsOmYudG9rZW4sSWRlbnRpZmllcjpmLnRva2VufVtoXTtyZXR1cm57dHlwZTpoLHZhbHVlOnl9fXJldHVybiBmLm5hbWU9PT0iQ2FsbEV4cHJlc3Npb24iP3t0eXBlOiJDYWxsRXhwcmVzc2lvbiIsY2hpbGRyZW46W3VsKHNbMF0pLHVsKHNbMV0pXX06e3R5cGU6cy5maWx0ZXIoUj0+Ui50b2tlbiYmUi50b2tlbi5QdW5jdHVhdG9yKVswXS5uYW1lLGNoaWxkcmVuOnMuZmlsdGVyKFI9PiFSLnRva2VufHwhUi50b2tlbi5QdW5jdHVhdG9yKS5tYXAoUj0+dWwoUikpfX1mdW5jdGlvbiB6dihmKXt2YXIgcz1uZXcgd2soZik7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHVsKHMudHJlZSksbnVsbCl9ZnVuY3Rpb24gQ2soZixzKXtyZXR1cm4gcz09PSJiaW5kIiYmKGY9PT0iYmluZGluZ3gifHxmPT09ImJpbmRpbmciKX1mdW5jdGlvbiBXdihmKXtpZighZilyZXR1cm47dHJ5e2Y9SlNPTi5wYXJzZShmKX1jYXRjaChwKXt9bGV0IHM9e307aWYoaGkoZik/cy5vcmlnaW49ZjpmJiYocy5vcmlnaW49Zi5vcmlnaW4scy50cmFuc2Zvcm1lZD1mLnRyYW5zZm9ybWVkKSwhKCFzLnRyYW5zZm9ybWVkJiYhcy5vcmlnaW4pKXJldHVybiBzLnRyYW5zZm9ybWVkPXMudHJhbnNmb3JtZWR8fHp2KHMub3JpZ2luKSxzfWZ1bmN0aW9uIEFrKGYpe3JldHVybiBmJiYoZi5leGl0RXhwcmVzc2lvbj1XdihmLmV4aXRFeHByZXNzaW9uKSxmLnByb3BzJiZmLnByb3BzLmZvckVhY2gocz0+e3MuZXhwcmVzc2lvbj1XdihzLmV4cHJlc3Npb24pfSksZil9ZnVuY3Rpb24gT2soZil7cmV0dXJuIGZ1bmN0aW9uKHM9e30pe2lmKHpuKGYpKXJldHVybiBmKHtzdGF0ZTpzLnN0YXRlPT09ImVuZCI/ImV4aXQiOnMuc3RhdGUsdDpzLnQhPT12b2lkIDA/cy50OnMuZGVsdGFUfSl9fWZ1bmN0aW9uIEd2KGYscyxwKXtyZXR1cm4gcCYmKENrKGYscyk/ZnVuY3Rpb24odyxOPWZ1bmN0aW9uKCl7fSl7aWYoIXcpdGhyb3cgbmV3IEVycm9yKCJzaG91bGQgcGFzcyBvcHRpb25zIGZvciBiaW5kaW5nIik7cmV0dXJuIEFrKHcpLHAodyx3JiZ3LmV2ZW50VHlwZT09PSJ0aW1pbmciP09rKE4pOk4pfTpwKX1mdW5jdGlvbiBUayhmLHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iLHt2YWx1ZTpzfSl9ZnVuY3Rpb24gWXYoZil7cmV0dXJuIGZbIltbQ3VycmVudEluc3RhbmNlSWRdXSJdfWZ1bmN0aW9uIFBrKGYscyxwKXtsZXQgdz1EcihmKTtyZXR1cm4hd3x8IXpuKHcuc2VuZCk/KGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCR7Zn0pLmApLG51bGwpOiguLi5OKT0+dy5zZW5kKCJtb2R1bGUiLHttb2R1bGU6cyxtZXRob2Q6cH0sTil9ZnVuY3Rpb24gSWsoZixzLHAsdyl7bGV0IE49RHIoZik7cmV0dXJuIU58fCF6bihOLnNlbmQpPyhjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZmluZCB0YXNrQ2VudGVyICgke2Z9KS5gKSxudWxsKTp6bih3KT9FPT5OLnNlbmQoIm1vZHVsZSIse21vZHVsZTpzLG1ldGhvZDpwfSxbRV0pOihjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSAke3N9LiR7cH0gbXVzdCBiZSBhc3NpZ25lZCBhcyBhIGZ1bmN0aW9uLmApLG51bGwpfXZhciBodT1jbGFzc3tjb25zdHJ1Y3RvcihzLHApe1RrKHRoaXMsU3RyaW5nKHMpKSx0aGlzLmNvbmZpZz1wfHx7fSx0aGlzLmRvY3VtZW50PW5ldyBLbyhzLHRoaXMuY29uZmlnLmJ1bmRsZVVybCksdGhpcy5yZXF1aXJlTW9kdWxlPXRoaXMucmVxdWlyZU1vZHVsZS5iaW5kKHRoaXMpLHRoaXMuaW1wb3J0U2NyaXB0PXRoaXMuaW1wb3J0U2NyaXB0LmJpbmQodGhpcyksdGhpcy5pc1JlZ2lzdGVyZWRNb2R1bGU9Y3UsdGhpcy5pc1JlZ2lzdGVyZWRDb21wb25lbnQ9VGZ9cmVxdWlyZU1vZHVsZShzKXtsZXQgcD1Zdih0aGlzKTtpZighKHAmJnRoaXMuZG9jdW1lbnQmJnRoaXMuZG9jdW1lbnQudGFza0NlbnRlcikpe2NvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byByZXF1aXJlTW9kdWxlKCIke3N9IiksIGluc3RhbmNlICgke3B9KSBkb2Vzbid0IGV4aXN0IGFueW1vcmUuYCk7cmV0dXJufWlmKCFjdShzKSl7Y29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSBcdTVGNTNcdTUyNERcdThGRDBcdTg4NENcdTc2ODRcdTU3RkFcdTVFQTdcdTRFMERcdTUzMDVcdTU0MkJcdTUzOUZcdTc1MUZcdTYzRDJcdTRFRjZbJHtzfV1cdUZGMENcdThCRjdcdTU3MjhtYW5pZmVzdFx1NEUyRFx1OTE0RFx1N0Y2RVx1OEJFNVx1NjNEMlx1NEVGNlx1RkYwQ1x1OTFDRFx1NjVCMFx1NTIzNlx1NEY1Q1x1NTMwNVx1NjJFQ1x1OEJFNVx1NTM5Rlx1NzUxRlx1NjNEMlx1NEVGNlx1NzY4NFx1ODFFQVx1NUI5QVx1NEU0OVx1OEZEMFx1ODg0Q1x1NTdGQVx1NUVBN2ApO3JldHVybn1sZXQgdz17fSxOPWF2KHMpO2ZvcihsZXQgRSBpbiBOKU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3LEUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+R3YocyxFLFBrKHAscyxFKSksc2V0Omg9PklrKHAscyxFLGgpfSk7cmV0dXJuIHd9c3VwcG9ydHMocyl7aWYoIWhpKHMpKXJldHVybiBudWxsO2xldCBwPXMubWF0Y2goL15AKFx3KylcLyhbXHctXSspKFwuKFx3KykpPyQvaSk7aWYocCl7bGV0IHc9cFsxXSxOPXBbMl0sRT1wWzRdO3N3aXRjaCh3KXtjYXNlIm1vZHVsZSI6cmV0dXJuIGN1KE4sRSk7Y2FzZSJjb21wb25lbnQiOnJldHVybiBUZihOKX19cmV0dXJuIG51bGx9aW1wb3J0U2NyaXB0KHMscD17fSl7bGV0IHc9WXYodGhpcyksTj1Ecih3KTtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oRSxoKXtpZighTnx8IXpuKE4uc2VuZCkpcmV0dXJuIGgobmV3IEVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gaW1wb3J0IHNjcmlwdCAiJHtzfSIsIG5vIHRhc2tDZW50ZXIgKCR7d30pIG1hdGNoZWQuYCkpO3RyeXtOLnNlbmQoIm1vZHVsZSIse21vZHVsZToic2NyaXB0IixtZXRob2Q6ImltcG9ydFNjcmlwdCJ9LFtzLHBdLHtjYWxsYmFjazpbeT0+RSh5KSx5PT5oKHkpXX0pfWNhdGNoKHkpe2goeSl9fSl9fTtmdW5jdGlvbiBOayhmLHMpe2xldCBwPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIHAuc2VydmljZT1PYmplY3QuY3JlYXRlKG51bGwpLGtzLmZvckVhY2goKHtuYW1lOncsb3B0aW9uczpOfSk9PntsZXQgRT1OLmNyZWF0ZTtpZihFKXRyeXtsZXQgaD1FKGYscyk7RmkocC5zZXJ2aWNlLGgpLEZpKHAsaC5pbnN0YW5jZSl9Y2F0Y2goaCl7Y29uc29sZS5lcnJvcihgW0pTIFJ1bnRpbWVdIEZhaWxlZCB0byBjcmVhdGUgc2VydmljZSAke3d9LmApfX0pLGRlbGV0ZSBwLnNlcnZpY2UuaW5zdGFuY2UsT2EocC5zZXJ2aWNlKSxwfXZhciBraz17dWlkOjB9LFJrPXpwKGhjKSx4az1qcChoYyk7ZnVuY3Rpb24gcXYoZixzLHApe2xldCB3PW5ldyBodShmLHMpLE49IlZ1ZSIsRT1OayhmLHt3ZWV4OncsbnZ1ZTp3LGNvbmZpZzpzLGNyZWF0ZWQ6RGF0ZS5ub3coKSxmcmFtZXdvcms6Tn0pO09hKEUpO2xldCBoPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEZpKGgsVWsodykpLEZpKGgsRSx7U2hhcmVkT2JqZWN0OmtrLHdlZXg6dyxudnVlOncscmVxdWlyZU1vZHVsZTp5PT53LnJlcXVpcmVNb2R1bGUoeSksX19XRUVYX0NBTExfSkFWQVNDUklQVF9fOkFmLHNlcnZpY2VzOkV9KSxoLnBsdXM9bmV3IGguV2VleFBsdXModyksaC5WdWVTaGFyZWQ9aGMsaC5VbmlTaGFyZWQ9UmssaC5WdWVSZWFjdGl2aXR5PXhrLE12KGYsaCksT2EoaCksaH1mdW5jdGlvbiBCayhmLHMscD17fSl7bGV0IHc9IlZ1ZSI7cD1kZihwKSxwLmVudj1kZihnbG9iYWwuV1hFbnZpcm9ubWVudHx8e30pLHAuYnVuZGxlVHlwZT13O2xldCBOPXF2KGYscCk7TWsocyxOKX1mdW5jdGlvbiBNayhmLHMpe2xldCBwPVtdLHc9W107Zm9yKGxldCBoIGluIHMpcC5wdXNoKGgpLHcucHVzaChzW2hdKTtsZXQgRT0iKGZ1bmN0aW9uIChnbG9iYWwpIHsgIitgCmdsb2JhbCA9IChmdW5jdGlvbiAoKSB7CiAgdmFyIGcKICAvLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZQogIGcgPSAoZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXMKICB9KSgpCiAgdHJ5IHsKICAgIC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKQogICAgZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCkKICB9IGNhdGNoIChlKSB7CiAgICAvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZQogICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiKSBnID0gd2luZG93CiAgfQogIHJldHVybiBnCn0pKCkgfHwgZ2xvYmFsOwpgK2YrIiB9KShPYmplY3QuY3JlYXRlKHRoaXMpKSI7cmV0dXJuIG5ldyBGdW5jdGlvbiguLi5wLEUpKC4uLncpfWZ1bmN0aW9uIERrKGYpe2xldCBzPXJzKGYpO3RyeXtpZihzJiZzLmJvZHkpcmV0dXJuIHMuYm9keS50b0pTT04oKX1jYXRjaChwKXtjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZ2V0IHRoZSB2aXJ0dWFsIGRvbSB0cmVlLiIpO3JldHVybn19ZnVuY3Rpb24gTGsoZil7QnAoZiksa3MuZm9yRWFjaChzPT57bGV0IHA9cy5vcHRpb25zLmRlc3Ryb3k7cCYmcChmKX0pfWZ1bmN0aW9uIEZrKGYpe01wKGYpLGtzLmZvckVhY2gocz0+e2xldCBwPXMub3B0aW9ucy5yZWZyZXNoO3AmJnAoZil9KX12YXIgVms9e2NyZWF0ZUluc3RhbmNlOkJrLGNyZWF0ZUluc3RhbmNlQ29udGV4dDpxdixnZXRSb290OkRrLGdldERvY3VtZW50OnJzLHJlZ2lzdGVyU2VydmljZTp1dSx1bnJlZ2lzdGVyU2VydmljZTpmdSxjYWxsSlMoZixzKXtyZXR1cm4gQWYoZixzKX0scmVnaXN0ZXJDb21wb25lbnRzOnN2LHJlZ2lzdGVyTW9kdWxlczpvdixkZXN0cm95SW5zdGFuY2U6TGsscmVmcmVzaEluc3RhbmNlOkZrfTtmdW5jdGlvbiBEZigpe3JldHVybiBpdigpLFZrfWZ1bmN0aW9uIFVrKGYpe2lmKGdsb2JhbC5zZXRUaW1lb3V0JiZnbG9iYWwuc2V0SW50ZXJ2YWwpcmV0dXJue3NldFRpbWVvdXQ6Z2xvYmFsLnNldFRpbWVvdXQsc2V0SW50ZXJ2YWw6Z2xvYmFsLnNldEludGVydmFsLGNsZWFyVGltZW91dDpnbG9iYWwuY2xlYXJUaW1lb3V0LGNsZWFySW50ZXJ2YWw6Z2xvYmFsLmNsZWFySW50ZXJ2YWx9O2xldCBzPWYucmVxdWlyZU1vZHVsZSgidGltZXIiKTtyZXR1cm57c2V0VGltZW91dDooLi4udyk9PntsZXQgTj1mdW5jdGlvbigpe3dbMF0oLi4udy5zbGljZSgyKSl9O3JldHVybiBzLnNldFRpbWVvdXQoTix3WzFdKSxmLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKCl9LHNldEludGVydmFsOiguLi53KT0+e2xldCBOPWZ1bmN0aW9uKCl7d1swXSguLi53LnNsaWNlKDIpKX07cmV0dXJuIHMuc2V0SW50ZXJ2YWwoTix3WzFdKSxmLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKCl9LGNsZWFyVGltZW91dDp3PT57cy5jbGVhclRpbWVvdXQodyl9LGNsZWFySW50ZXJ2YWw6dz0+e3MuY2xlYXJJbnRlcnZhbCh3KX19fXZhciBKdj17RG9jdW1lbnQ6S28sRWxlbWVudDpaaSxDb21tZW50OmNsLExpc3RlbmVyOlVsLFRhc2tDZW50ZXI6Vmwsc2VuZFRhc2tzKC4uLmYpe3JldHVybiB6bihjYWxsTmF0aXZlKT9jYWxsTmF0aXZlKC4uLmYpOihnbG9iYWwuY2FsbE5hdGl2ZXx8KCgpPT57fSkpKC4uLmYpfX07S28uaGFuZGxlcj1Kdi5zZW5kVGFza3M7dmFyIGZsPUp2O2Z1bmN0aW9uICRrKCl7T2EoZmwuQ29tbWVudCksT2EoZmwuTGlzdGVuZXIpLE9hKGZsLkRvY3VtZW50LnByb3RvdHlwZSksT2EoZmwuQ29tbWVudC5wcm90b3R5cGUpLE9hKGZsLkxpc3RlbmVyLnByb3RvdHlwZSl9dmFyIGd1PXtzZXJ2aWNlOntyZWdpc3Rlcjp1dSx1bnJlZ2lzdGVyOmZ1LGhhczpQZn0sZnJlZXplUHJvdG90eXBlOiRrLGluaXQ6RGYsY29uZmlnOmZsfTt2YXIgTGY9Y2xhc3N7Y29uc3RydWN0b3IocyxwPXt9KXt0aGlzLnR5cGU9c3x8Im1lc3NhZ2UiLHRoaXMuZGF0YT1wLmRhdGF8fG51bGwsdGhpcy5vcmlnaW49cC5vcmlnaW58fCIiLHRoaXMuc291cmNlPXAuc291cmNlfHxudWxsLHRoaXMucG9ydHM9cC5wb3J0c3x8W10sdGhpcy50YXJnZXQ9bnVsbCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfX07dmFyIFJzPXt9LG1jPXt9O2Z1bmN0aW9uIEZmKCl7fUZmLnByb3RvdHlwZS5wb3N0TWVzc2FnZT1mdW5jdGlvbihmKXtpZih0aGlzLl9jbG9zZWQpdGhyb3cgbmV3IEVycm9yKGBCcm9hZGNhc3RDaGFubmVsICIke3RoaXMubmFtZX0iIGlzIGNsb3NlZC5gKTtsZXQgcz1Sc1t0aGlzLm5hbWVdO2lmKHMmJnMubGVuZ3RoKWZvcihsZXQgcD0wO3A8cy5sZW5ndGg7KytwKXtsZXQgdz1zW3BdO3cuX2Nsb3NlZHx8dz09PXRoaXN8fHpuKHcub25tZXNzYWdlKSYmdy5vbm1lc3NhZ2UobmV3IExmKCJtZXNzYWdlIix7ZGF0YTpmfSkpfX07RmYucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Nsb3NlZCYmKHRoaXMuX2Nsb3NlZD0hMCxSc1t0aGlzLm5hbWVdKSl7bGV0IGY9UnNbdGhpcy5uYW1lXS5maWx0ZXIocz0+cyE9PXRoaXMpO2YubGVuZ3RoP1JzW3RoaXMubmFtZV09ZjpkZWxldGUgUnNbdGhpcy5uYW1lXX19O3ZhciBLdj17Y3JlYXRlOmY9PntpZihtY1tmXT1bXSx6bihnbG9iYWwuQnJvYWRjYXN0Q2hhbm5lbCkpcmV0dXJue307bGV0IHM9e0Jyb2FkY2FzdENoYW5uZWw6ZnVuY3Rpb24ocCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm5hbWUiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMSx2YWx1ZTpTdHJpbmcocCl9KSx0aGlzLl9jbG9zZWQ9ITEsdGhpcy5vbm1lc3NhZ2U9bnVsbCxSc1t0aGlzLm5hbWVdfHwoUnNbdGhpcy5uYW1lXT1bXSksUnNbdGhpcy5uYW1lXS5wdXNoKHRoaXMpLG1jW2ZdLnB1c2godGhpcyl9fTtyZXR1cm4gcy5Ccm9hZGNhc3RDaGFubmVsLnByb3RvdHlwZT1GZi5wcm90b3R5cGUse2luc3RhbmNlOnN9fSxkZXN0cm95OmY9PnttY1tmXSYmKG1jW2ZdLmZvckVhY2gocz0+cy5jbG9zZSgpKSxkZWxldGUgbWNbZl0pfX07ZnVuY3Rpb24gVmYoKXtsZXR7aW5pdDpmfT1ndTtndS5zZXJ2aWNlLnJlZ2lzdGVyKCJCcm9hZGNhc3RDaGFubmVsIixLdiksZ3UuZnJlZXplUHJvdG90eXBlKCk7bGV0IHM9ZigpO2ZvcihsZXQgcCBpbiBzKWdsb2JhbFtwXT0oLi4udyk9PntsZXQgTj1zW3BdKC4uLncpO3JldHVybiBOIGluc3RhbmNlb2YgRXJyb3ImJmNvbnNvbGUuZXJyb3IoTi50b1N0cmluZygpKSxOfX12YXIgQ0I9Z2xvYmFsLmNvbnNvbGU7ZnVuY3Rpb24gWnYoKXtpZihHcCgpLGdsb2JhbC5XWEVudmlyb25tZW50JiZnbG9iYWwuV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSE9PSJXZWIiKWdsb2JhbC5jb25zb2xlPXtkZWJ1ZzooLi4uZik9PntRbigiZGVidWciKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi5fYyhmKSwiX19ERUJVRyIpfSxsb2c6KC4uLmYpPT57UW4oImxvZyIpJiZnbG9iYWwubmF0aXZlTG9nKC4uLl9jKGYpLCJfX0xPRyIpfSxpbmZvOiguLi5mKT0+e1FuKCJpbmZvIikmJmdsb2JhbC5uYXRpdmVMb2coLi4uX2MoZiksIl9fSU5GTyIpfSx3YXJuOiguLi5mKT0+e1FuKCJ3YXJuIikmJmdsb2JhbC5uYXRpdmVMb2coLi4uX2MoZiksIl9fV0FSTiIpfSxlcnJvcjooLi4uZik9PntRbigiZXJyb3IiKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi5fYyhmKSwiX19FUlJPUiIpfX07ZWxzZXtsZXR7ZGVidWc6Zixsb2c6cyxpbmZvOnAsd2Fybjp3LGVycm9yOk59PWNvbnNvbGU7Y29uc29sZS5fX29yaV9fPXtkZWJ1ZzpmLGxvZzpzLGluZm86cCx3YXJuOncsZXJyb3I6Tn0sY29uc29sZS5kZWJ1Zz0oLi4uRSk9PntRbigiZGVidWciKSYmY29uc29sZS5fX29yaV9fLmRlYnVnLmFwcGx5KGNvbnNvbGUsRSl9LGNvbnNvbGUubG9nPSguLi5FKT0+e1FuKCJsb2ciKSYmY29uc29sZS5fX29yaV9fLmxvZy5hcHBseShjb25zb2xlLEUpfSxjb25zb2xlLmluZm89KC4uLkUpPT57UW4oImluZm8iKSYmY29uc29sZS5fX29yaV9fLmluZm8uYXBwbHkoY29uc29sZSxFKX0sY29uc29sZS53YXJuPSguLi5FKT0+e1FuKCJ3YXJuIikmJmNvbnNvbGUuX19vcmlfXy53YXJuLmFwcGx5KGNvbnNvbGUsRSl9LGNvbnNvbGUuZXJyb3I9KC4uLkUpPT57UW4oImVycm9yIikmJmNvbnNvbGUuX19vcmlfXy5lcnJvci5hcHBseShjb25zb2xlLEUpfX19ZnVuY3Rpb24gX2MoZil7cmV0dXJuIGYubWFwKHM9PntpZihNYShzKS50b0xvd2VyQ2FzZSgpPT09IltvYmplY3Qgb2JqZWN0XSIpdHJ5e3M9SlNPTi5zdHJpbmdpZnkocyl9Y2F0Y2godyl7cz0iW29iamVjdCBvYmplY3RdIn1lbHNlIHM9U3RyaW5nKHMpO3JldHVybiBzfSl9WnYoKTtWZigpO30pKCk7Cg== \ No newline at end of file +//{"version":"4.08","encode":"base64"} +dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fID0gRGF0ZS5ub3coKTt2YXIgZ2xvYmFsPXRoaXM7IHZhciBwcm9jZXNzPXtlbnY6e319OyB2YXIgc2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dDsKKCgpPT57dmFyIFJwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgeHA9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczt2YXIgQkk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxNST1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO3ZhciBCcD0oZixzLHApPT5zIGluIGY/UnAoZixzLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpwfSk6ZltzXT1wLE1wPShmLHMpPT57Zm9yKHZhciBwIGluIHN8fChzPXt9KSlCSS5jYWxsKHMscCkmJkJwKGYscCxzW3BdKTtpZih4cClmb3IodmFyIHAgb2YgeHAocykpTUkuY2FsbChzLHApJiZCcChmLHAsc1twXSk7cmV0dXJuIGZ9O3ZhciBMST0oZixzKT0+e2Zvcih2YXIgcCBpbiBzKVJwKGYscCx7Z2V0OnNbcF0sZW51bWVyYWJsZTohMH0pfTt2YXIgT2E9T2JqZWN0LmZyZWV6ZTtmdW5jdGlvbiBkYyh7Z2V0Q3VycmVudFBhZ2VzOmYsdW5pOnMsVW5pU2hhcmVkOnAsVnVlOncsVnVlU2hhcmVkOk59KXt2YXIgeT1mdW5jdGlvbihoLEUsUixEZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIE50KCl7bGV0IGplPWYoKSxudD1qZS5sZW5ndGg7aWYobnQpcmV0dXJuIGplW250LTFdfWZ1bmN0aW9uIFV0KCl7bGV0IGplPU50KCk7aWYoamUpcmV0dXJuIGplLiR2bX1mdW5jdGlvbiBUdChqZSxudCxPdCl7aWYoUi5pc1N0cmluZyhqZSkpT3Q9bnQsbnQ9amUsamU9VXQoKTtlbHNlIGlmKHR5cGVvZiBqZT09Im51bWJlciIpe2xldCBObj1mKCkuZmluZCh1bj0+dW4uJHBhZ2UuaWQ9PT1qZSk7Tm4/amU9Tm4uJHZtOmplPVV0KCl9aWYoIWplKXJldHVybjtpZihqZS5fX2NhbGxfaG9vaylyZXR1cm4gamUuX19jYWxsX2hvb2sobnQsT3QpO2xldCBubj1qZS4kW250XTtyZXR1cm4gbm4mJkUuaW52b2tlQXJyYXlGbnMobm4sT3QpfWZ1bmN0aW9uIFAoamUsbnQsT3Qsbm4pe1IuaXNGdW5jdGlvbihudCkmJkRlLmluamVjdEhvb2soamUsbnQuYmluZChPdCksbm4pfWZ1bmN0aW9uIEN0KGplLG50LE90KXt2YXIgbm47bGV0IE5uPWplLm1wVHlwZXx8T3QuJG1wVHlwZTtpZighKCFObnx8Tm49PT0iY29tcG9uZW50IikmJihPYmplY3Qua2V5cyhqZSkuZm9yRWFjaCh1bj0+e2lmKEUuaXNVbmlMaWZlY3ljbGVIb29rKHVuLGplW3VuXSwhMSkpe2xldCBhcj1qZVt1bl07Ui5pc0FycmF5KGFyKT9hci5mb3JFYWNoKFZuPT5QKHVuLFZuLE90LG50KSk6UCh1bixhcixPdCxudCl9fSksTm49PT0icGFnZSIpKXtudC5fX2lzVmlzaWJsZT0hMDt0cnl7VHQoT3QsRS5PTl9MT0FELG50LmF0dHJzLl9fcGFnZVF1ZXJ5KSxkZWxldGUgbnQuYXR0cnMuX19wYWdlUXVlcnksKChubj1PdC4kcGFnZSk9PT1udWxsfHxubj09PXZvaWQgMD92b2lkIDA6bm4ub3BlblR5cGUpIT09InByZWxvYWRQYWdlIiYmVHQoT3QsRS5PTl9TSE9XKX1jYXRjaCh1bil7Y29uc29sZS5lcnJvcih1bi5tZXNzYWdlK0UuTElORUZFRUQrdW4uc3RhY2spfX19ZnVuY3Rpb24gUm4oamUsbnQpe290KG50LGplLiRyZW5kZXJqcyxqZVsiJCIrRS5SRU5ERVJKU19NT0RVTEVTXSl9ZnVuY3Rpb24gb3QoamUsbnQsT3Q9e30pe2lmKCFSLmlzQXJyYXkobnQpKXJldHVybjtsZXQgbm49amUudWlkLE5uPWplLiR3eHNNb2R1bGVzfHwoamUuJHd4c01vZHVsZXM9W10pLHVuPWplLmN0eDtudC5mb3JFYWNoKGFyPT57T3RbYXJdJiYodW5bYXJdPXoobm4sT3RbYXJdLGFyKSxObi5wdXNoKGFyKSl9KX1mdW5jdGlvbiB6KGplLG50LE90KXtsZXQgbm49e307cmV0dXJuIG5ldyBQcm94eShubix7Z2V0KE5uLHVuKXtyZXR1cm4gbm5bdW5dfHwobm5bdW5dPUsoamUsbnQsT3QsdW4pKX19KX1mdW5jdGlvbiBLKGplLG50LE90LG5uKXtsZXQgTm49KCk9Pnt9LHVuPSgpPT5FLldYU19QUk9UT0NPTCtKU09OLnN0cmluZ2lmeShbamUsbnQsT3QrIi4iK25uXSk7cmV0dXJuIG5ldyBQcm94eShObix7Z2V0KGFyLFZuKXtyZXR1cm4gVm49PT0idG9KU09OIj91bjpObltWbl18fChObltWbl09SyhqZSxudCxPdCsiLiIrbm4sVm4pKX0sYXBwbHkoYXIsVm4sUG4pe3JldHVybiBFLldYU19QUk9UT0NPTCtKU09OLnN0cmluZ2lmeShbamUsbnQsT3QrIi4iK25uLFsuLi5Qbl1dKX19KX1mdW5jdGlvbiBtbihqZSxudCl7b3QobnQsamUuJHd4cyxqZVsiJCIrRS5XWFNfTU9EVUxFU10pfWZ1bmN0aW9uIGhuKGplLG50LE90KXttbihqZSxudCksUm4oamUsbnQpLEN0KGplLG50LE90KX1mdW5jdGlvbiB3bihqZSxudCxPdCl7cmV0dXJuIGplW250XT1PdH1mdW5jdGlvbiBYbihqZSwuLi5udCl7bGV0IE90PXRoaXNbamVdO3JldHVybiBPdD9PdCguLi5udCk6KGNvbnNvbGUuZXJyb3IoYG1ldGhvZCAke2plfSBub3QgZm91bmRgKSxudWxsKX1mdW5jdGlvbiBzaShqZSl7cmV0dXJuIGZ1bmN0aW9uKE90LG5uLE5uKXtpZighbm4pdGhyb3cgT3Q7bGV0IHVuPWplLl9pbnN0YW5jZTtpZighdW58fCF1bi5wcm94eSl0aHJvdyBPdDtUdCh1bi5wcm94eSxFLk9OX0VSUk9SLE90KX19ZnVuY3Rpb24gRWkoamUsbnQpe3JldHVybiBqZT9bLi4ubmV3IFNldChbXS5jb25jYXQoamUsbnQpKV06bnR9ZnVuY3Rpb24gWHIoamUpe0UuVW5pTGlmZWN5Y2xlSG9va3MuZm9yRWFjaChudD0+e2plW250XT1FaX0pfWxldCBtcixDbj0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLF9yPS9eKD86W0EtWmEtelxkKy9dezR9KSo/KD86W0EtWmEtelxkKy9dezJ9KD86PT0pP3xbQS1aYS16XGQrL117M309Pyk/JC87dHlwZW9mIGF0b2IhPSJmdW5jdGlvbiI/bXI9ZnVuY3Rpb24oamUpe2lmKGplPVN0cmluZyhqZSkucmVwbGFjZSgvW1x0XG5cZlxyIF0rL2csIiIpLCFfci50ZXN0KGplKSl0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdhdG9iJyBvbiAnV2luZG93JzogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iKTtqZSs9Ij09Ii5zbGljZSgyLShqZS5sZW5ndGgmMykpO2Zvcih2YXIgbnQsT3Q9IiIsbm4sTm4sdW49MDt1bjxqZS5sZW5ndGg7KW50PUNuLmluZGV4T2YoamUuY2hhckF0KHVuKyspKTw8MTh8Q24uaW5kZXhPZihqZS5jaGFyQXQodW4rKykpPDwxMnwobm49Q24uaW5kZXhPZihqZS5jaGFyQXQodW4rKykpKTw8NnwoTm49Q24uaW5kZXhPZihqZS5jaGFyQXQodW4rKykpKSxPdCs9bm49PT02ND9TdHJpbmcuZnJvbUNoYXJDb2RlKG50Pj4xNiYyNTUpOk5uPT09NjQ/U3RyaW5nLmZyb21DaGFyQ29kZShudD4+MTYmMjU1LG50Pj44JjI1NSk6U3RyaW5nLmZyb21DaGFyQ29kZShudD4+MTYmMjU1LG50Pj44JjI1NSxudCYyNTUpO3JldHVybiBPdH06bXI9YXRvYjtmdW5jdGlvbiAkcihqZSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChtcihqZSkuc3BsaXQoIiIpLm1hcChmdW5jdGlvbihudCl7cmV0dXJuIiUiKygiMDAiK250LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSl9ZnVuY3Rpb24gUXIoKXtsZXQgamU9cy5nZXRTdG9yYWdlU3luYygidW5pX2lkX3Rva2VuIil8fCIiLG50PWplLnNwbGl0KCIuIik7aWYoIWplfHxudC5sZW5ndGghPT0zKXJldHVybnt1aWQ6bnVsbCxyb2xlOltdLHBlcm1pc3Npb246W10sdG9rZW5FeHBpcmVkOjB9O2xldCBPdDt0cnl7T3Q9SlNPTi5wYXJzZSgkcihudFsxXSkpfWNhdGNoKG5uKXt0aHJvdyBuZXcgRXJyb3IoIlx1ODNCN1x1NTNENlx1NUY1M1x1NTI0RFx1NzUyOFx1NjIzN1x1NEZFMVx1NjA2Rlx1NTFGQVx1OTUxOVx1RkYwQ1x1OEJFNlx1N0VDNlx1OTUxOVx1OEJFRlx1NEZFMVx1NjA2Rlx1NEUzQVx1RkYxQSIrbm4ubWVzc2FnZSl9cmV0dXJuIE90LnRva2VuRXhwaXJlZD1PdC5leHAqMWUzLGRlbGV0ZSBPdC5leHAsZGVsZXRlIE90LmlhdCxPdH1mdW5jdGlvbiB5aShqZSl7amUudW5pSURIYXNSb2xlPWZ1bmN0aW9uKG50KXtsZXR7cm9sZTpPdH09UXIoKTtyZXR1cm4gT3QuaW5kZXhPZihudCk+LTF9LGplLnVuaUlESGFzUGVybWlzc2lvbj1mdW5jdGlvbihudCl7bGV0e3Blcm1pc3Npb246T3R9PVFyKCk7cmV0dXJuIHRoaXMudW5pSURIYXNSb2xlKCJhZG1pbiIpfHxPdC5pbmRleE9mKG50KT4tMX0samUudW5pSURUb2tlblZhbGlkPWZ1bmN0aW9uKCl7bGV0e3Rva2VuRXhwaXJlZDpudH09UXIoKTtyZXR1cm4gbnQ+RGF0ZS5ub3coKX19ZnVuY3Rpb24ga24oamUpe2xldCBudD1qZS5fY29udGV4dC5jb25maWc7bnQuZXJyb3JIYW5kbGVyPUUuaW52b2tlQ3JlYXRlRXJyb3JIYW5kbGVyKGplLHNpKSxYcihudC5vcHRpb25NZXJnZVN0cmF0ZWdpZXMpO2xldCBPdD1udC5nbG9iYWxQcm9wZXJ0aWVzO3lpKE90KSxPdC4kc2V0PXduLE90LiRhcHBseU9wdGlvbnM9aG4sT3QuJGNhbGxNZXRob2Q9WG4sRS5pbnZva2VDcmVhdGVWdWVBcHBIb29rKGplKX1yZXR1cm4gaC5pbml0QXBwPWtuLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxofSh7fSxwLE4sdyk7cmV0dXJuIHl9ZnVuY3Rpb24gdHUoZix7bnZ1ZTpzLFVuaVNoYXJlZDpwLFZ1ZVNoYXJlZDp3LFZ1ZVJlYWN0aXZpdHk6Tn0pe2xldCB5PXtwbGF0Zm9ybTpzLmNvbmZpZy5lbnYucGxhdGZvcm0sVW5pU2hhcmVkOnAsVnVlU2hhcmVkOncsVnVlUmVhY3Rpdml0eTpOfTtyZXR1cm4gZih5LHMuZG9jdW1lbnQpfWZ1bmN0aW9uIERJKHtzZXRUaW1lb3V0OmYsY2xlYXJUaW1lb3V0OnMsdW5pOnAsZ2V0Q3VycmVudFBhZ2VzOncsVnVlOk4sd2VleDp5LHBsdXM6aCxCcm9hZGNhc3RDaGFubmVsOkUsVW5pVmlld0pTQnJpZGdlOlIsVnVlU2hhcmVkOkRlLFVuaVNoYXJlZDpOdCxfX3VuaUNvbmZpZzpVdH0pe3ZhciBUdD1mdW5jdGlvbihQLEN0LFJuKXsidXNlIHN0cmljdCI7bGV0IG90PVsibmF2aWdhdGUiLCJyZWRpcmVjdCIsInN3aXRjaFRhYiIsInJlTGF1bmNoIiwibmF2aWdhdGVCYWNrIl0sej1bInNsaWRlLWluLXJpZ2h0Iiwic2xpZGUtaW4tbGVmdCIsInNsaWRlLWluLXRvcCIsInNsaWRlLWluLWJvdHRvbSIsImZhZGUtaW4iLCJ6b29tLW91dCIsInpvb20tZmFkZS1vdXQiLCJwb3AtaW4iLCJub25lIl0sSz1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLG1uPXtob3ZlckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJuYXZpZ2F0b3ItaG92ZXIifSx1cmw6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG9wZW5UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJuYXZpZ2F0ZSIsdmFsaWRhdG9yKHYpe3JldHVybiBCb29sZWFuKH5vdC5pbmRleE9mKHYpKX19LGRlbHRhOnt0eXBlOk51bWJlcixkZWZhdWx0OjF9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjUwfSxob3ZlclN0YXlUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjYwMH0sZXhpc3RzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGFuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yKHYpe3JldHVybiF2fHx6LmNvbmNhdChLKS5pbmNsdWRlcyh2KX19LGFuaW1hdGlvbkR1cmF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjMwMH19O2Z1bmN0aW9uIGhuKHYpe3JldHVybigpPT57aWYodi5vcGVuVHlwZSE9PSJuYXZpZ2F0ZUJhY2siJiYhdi51cmwpe2NvbnNvbGUuZXJyb3IoIjxuYXZpZ2F0b3IvPiBzaG91bGQgaGF2ZSB1cmwgYXR0cmlidXRlIHdoZW4gdXNpbmcgbmF2aWdhdGVUbywgcmVkaXJlY3RUbywgcmVMYXVuY2ggb3Igc3dpdGNoVGFiIik7cmV0dXJufWxldCB4PXBhcnNlSW50KHYuYW5pbWF0aW9uRHVyYXRpb24pO3N3aXRjaCh2Lm9wZW5UeXBlKXtjYXNlIm5hdmlnYXRlIjpwLm5hdmlnYXRlVG8oe3VybDp2LnVybCxhbmltYXRpb25UeXBlOnYuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246eH0pO2JyZWFrO2Nhc2UicmVkaXJlY3QiOnAucmVkaXJlY3RUbyh7dXJsOnYudXJsLGV4aXN0czp2LmV4aXN0c30pO2JyZWFrO2Nhc2Uic3dpdGNoVGFiIjpwLnN3aXRjaFRhYih7dXJsOnYudXJsfSk7YnJlYWs7Y2FzZSJyZUxhdW5jaCI6cC5yZUxhdW5jaCh7dXJsOnYudXJsfSk7YnJlYWs7Y2FzZSJuYXZpZ2F0ZUJhY2siOnAubmF2aWdhdGVCYWNrKHtkZWx0YTp2LmRlbHRhLGFuaW1hdGlvblR5cGU6di5hbmltYXRpb25UeXBlfHwicG9wLW91dCIsYW5pbWF0aW9uRHVyYXRpb246eH0pO2JyZWFrfX19ZnVuY3Rpb24gd24odil7aWYodi5ob3ZlckNsYXNzJiZ2LmhvdmVyQ2xhc3MhPT0ibm9uZSIpe2xldCB4PXtob3ZlckNsYXNzOnYuaG92ZXJDbGFzc307cmV0dXJuIEN0Lmhhc093bih2LCJob3ZlclN0YXJ0VGltZSIpJiYoeC5ob3ZlclN0YXJ0VGltZT12LmhvdmVyU3RhcnRUaW1lKSxDdC5oYXNPd24odiwiaG92ZXJTdGF5VGltZSIpJiYoeC5ob3ZlclN0YXlUaW1lPXYuaG92ZXJTdGF5VGltZSksQ3QuaGFzT3duKHYsImhvdmVyU3RvcFByb3BhZ2F0aW9uIikmJih4LmhvdmVyU3RvcFByb3BhZ2F0aW9uPXYuaG92ZXJTdG9wUHJvcGFnYXRpb24pLHh9cmV0dXJue319ZnVuY3Rpb24gWG4odix4KXtyZXR1cm4gUC5jcmVhdGVFbGVtZW50Vk5vZGUoInUtdGV4dCIsQ3QuZXh0ZW5kKHthcHBlbmRBc1RyZWU6ITB9LHgpLHYpfWxldCBzaT1beyJuYXZpZ2F0b3ItaG92ZXIiOnsiIjp7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDAuMSkiLG9wYWNpdHk6Ljd9fX1dLEVpPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJOYXZpZ2F0b3IiLHByb3BzOm1uLHN0eWxlczpzaSxzZXR1cCh2LHtzbG90czp4fSl7bGV0ICQ9aG4odik7cmV0dXJuKCk9PlAuY3JlYXRlVk5vZGUoInZpZXciLFAubWVyZ2VQcm9wcyh3bih2KSx7b25DbGljazokfSksW3guZGVmYXVsdCYmeC5kZWZhdWx0KCldKX19KTtmdW5jdGlvbiBYcih2KXtyZXR1cm4gU3ltYm9sKHYpfWZ1bmN0aW9uIG1yKCl7bGV0IHY7dHJ5e3Y9UC5nZXRDdXJyZW50SW5zdGFuY2UoKS5yb290LnByb3h5LiRwYWdlLmlkfWNhdGNoKHgpe2xldCAkPWgud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkO3Y9aXNOYU4oTnVtYmVyKCQpKT8kOk51bWJlcigkKX1yZXR1cm4gdn1sZXQgQ24sX3IsJHI7ZnVuY3Rpb24gUXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz09Im9iamVjdCImJnR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZ0eXBlb2YgZG9jdW1lbnQ9PSJvYmplY3QiPyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIHlpKCl7cmV0dXJuIENuLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH1sZXQga24samUsbnQ9e307ZnVuY3Rpb24gT3Qodil7bGV0IHg9di5kYXRhJiZ2LmRhdGEuX19tZXNzYWdlO2lmKCF4fHwheC5fX3BhZ2UpcmV0dXJuO2xldCAkPXguX19wYWdlLFU9bnRbJF07VSYmVSh4KSx4LmtlZXB8fGRlbGV0ZSBudFskXX1mdW5jdGlvbiBubih2LHgpe1FyKCk9PT0idjgiPyRyPyhrbiYma24uY2xvc2UoKSxrbj1uZXcgJHIoeWkoKSksa24ub25tZXNzYWdlPU90KTpqZXx8KGplPV9yLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IiksamUuYWRkRXZlbnRMaXN0ZW5lcigicGx1c01lc3NhZ2UiLE90KSk6d2luZG93Ll9fcGx1c01lc3NhZ2U9T3QsbnRbdl09eH1jbGFzcyBObntjb25zdHJ1Y3Rvcih4KXt0aGlzLndlYnZpZXc9eH1zZW5kTWVzc2FnZSh4KXtsZXQgJD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtfX21lc3NhZ2U6e2RhdGE6eH19KSksVT10aGlzLndlYnZpZXcuaWQ7JHI/bmV3ICRyKFUpLnBvc3RNZXNzYWdlKCQpOkNuLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3JiZDbi53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldygkLFUpfWNsb3NlKCl7dGhpcy53ZWJ2aWV3LmNsb3NlKCl9fWZ1bmN0aW9uIHVuKHtjb250ZXh0OnY9e30sdXJsOngsZGF0YTokPXt9LHN0eWxlOlU9e30sb25NZXNzYWdlOlosb25DbG9zZTpKfSl7bGV0IGVlPVV0LmRhcmttb2RlO0NuPXYucGx1c3x8aCxfcj12LndlZXh8fCh0eXBlb2YgeT09Im9iamVjdCI/eTpudWxsKSwkcj12LkJyb2FkY2FzdENoYW5uZWx8fCh0eXBlb2YgRT09Im9iamVjdCI/RTpudWxsKTtsZXQgY2U9e2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGhlPWBwYWdlJHtEYXRlLm5vdygpfWA7VT1DdC5leHRlbmQoe30sVSksVS50aXRsZU5WaWV3IT09ITEmJlUudGl0bGVOVmlldyE9PSJub25lIiYmKFUudGl0bGVOVmlldz1DdC5leHRlbmQoY2UsVS50aXRsZU5WaWV3KSk7bGV0IFRlPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6YC8ke3h9LmpzYCxkZWZhdWx0Rm9udFNpemU6MTYsdmlld3BvcnQ6Q24uc2NyZWVuLnJlc29sdXRpb25XaWR0aH19O1U9Q3QuZXh0ZW5kKFRlLFUpO2xldCBmZT1Dbi53ZWJ2aWV3LmNyZWF0ZSgiIixoZSxVLHtleHRyYXM6e2Zyb206eWkoKSxydW50aW1lOlFyKCksZGF0YTpDdC5leHRlbmQoe30sJCx7ZGFya21vZGU6ZWV9KSx1c2VHbG9iYWxFdmVudDohJHJ9fSk7cmV0dXJuIGZlLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixKKSxubihoZSx3ZT0+e0N0LmlzRnVuY3Rpb24oWikmJlood2UuZGF0YSksd2Uua2VlcHx8ZmUuY2xvc2UoImF1dG8iKX0pLGZlLnNob3coVS5hbmltYXRpb25UeXBlLFUuYW5pbWF0aW9uRHVyYXRpb24pLG5ldyBObihmZSl9bGV0IGFyPXtmb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxWbj1YcigidWwiKTtmdW5jdGlvbiBQbigpe2xldCB2PVtdO3JldHVybiBQLnByb3ZpZGUoVm4se2FkZEhhbmRsZXIoeCl7di5wdXNoKHgpfSxyZW1vdmVIYW5kbGVyKHgpe3Yuc3BsaWNlKHYuaW5kZXhPZih4KSwxKX19KSx2fWxldCBfbj1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiTGFiZWwiLHByb3BzOmFyLHN0eWxlczpbXSxzZXR1cCh2LHtzbG90czp4fSl7bGV0ICQ9bXIoKSxVPVBuKCksWj1KPT57di5mb3I/Ui5lbWl0KGB1bmktbGFiZWwtY2xpY2stJHskfS0ke3YuZm9yfWAsSiwhMCk6VS5sZW5ndGgmJlVbMF0oSiwhMCl9O3JldHVybigpPT5QLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7b25DbGljazpafSxbeC5kZWZhdWx0JiZ4LmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIGJyKHYseCl7ZWkodi5pZCx4KSxQLndhdGNoKCgpPT52LmlkLCgkLFUpPT57Z28oVSx4LCEwKSxlaSgkLHgsITApfSksUC5vblVubW91bnRlZCgoKT0+e2dvKHYuaWQseCl9KX1mdW5jdGlvbiBlaSh2LHgsJCl7bGV0IFU9bXIoKTskJiYhdnx8IUN0LmlzUGxhaW5PYmplY3QoeCl8fE9iamVjdC5rZXlzKHgpLmZvckVhY2goWj0+eyQ/Wi5pbmRleE9mKCJAIikhPT0wJiZaLmluZGV4T2YoInVuaS0iKSE9PTAmJlIub24oYHVuaS0ke1p9LSR7VX0tJHt2fWAseFtaXSk6Wi5pbmRleE9mKCJ1bmktIik9PT0wP1Iub24oWix4W1pdKTp2JiZSLm9uKGB1bmktJHtafS0ke1V9LSR7dn1gLHhbWl0pfSl9ZnVuY3Rpb24gZ28odix4LCQpe2xldCBVPW1yKCk7JCYmIXZ8fCFDdC5pc1BsYWluT2JqZWN0KHgpfHxPYmplY3Qua2V5cyh4KS5mb3JFYWNoKFo9PnskP1ouaW5kZXhPZigiQCIpIT09MCYmWi5pbmRleE9mKCJ1bmktIikhPT0wJiZSLm9mZihgdW5pLSR7Wn0tJHtVfS0ke3Z9YCx4W1pdKTpaLmluZGV4T2YoInVuaS0iKT09PTA/Ui5vZmYoWix4W1pdKTp2JiZSLm9mZihgdW5pLSR7Wn0tJHtVfS0ke3Z9YCx4W1pdKX0pfWZ1bmN0aW9uIGZhKHYpe3JldHVybiBPYmplY3Qua2V5cyh2KS5tYXAoeD0+W3gsdlt4XV0pfWxldCBBbz1bImNsYXNzIiwic3R5bGUiXSxKbz0vXm9uW0EtWl0rLyxLbz0odj17fSk9PntsZXR7ZXhjbHVkZUxpc3RlbmVyczp4PSExLGV4Y2x1ZGVLZXlzOiQ9W119PXYsVT1QLmdldEN1cnJlbnRJbnN0YW5jZSgpLFo9UC5zaGFsbG93UmVmKHt9KSxKPVAuc2hhbGxvd1JlZih7fSksZWU9UC5zaGFsbG93UmVmKHt9KSxjZT0kLmNvbmNhdChBbyk7cmV0dXJuIFUuYXR0cnM9UC5yZWFjdGl2ZShVLmF0dHJzKSxQLndhdGNoRWZmZWN0KCgpPT57bGV0IGhlPWZhKFUuYXR0cnMpLnJlZHVjZSgoVGUsW2ZlLHdlXSk9PihjZS5pbmNsdWRlcyhmZSk/VGUuZXhjbHVkZVtmZV09d2U6Sm8udGVzdChmZSk/KHh8fChUZS5hdHRyc1tmZV09d2UpLFRlLmxpc3RlbmVyc1tmZV09d2UpOlRlLmF0dHJzW2ZlXT13ZSxUZSkse2V4Y2x1ZGU6e30sYXR0cnM6e30sbGlzdGVuZXJzOnt9fSk7Wi52YWx1ZT1oZS5hdHRycyxKLnZhbHVlPWhlLmxpc3RlbmVycyxlZS52YWx1ZT1oZS5leGNsdWRlfSkseyRhdHRyczpaLCRsaXN0ZW5lcnM6SiwkZXhjbHVkZUF0dHJzOmVlfX0sUmk9e2lkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxob3ZlckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJidXR0b24taG92ZXIifSxob3ZlclN0YXJ0VGltZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyMH0saG92ZXJTdGF5VGltZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo3MH0saG92ZXJTdG9wUHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGZvcm1UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbG9hZGluZzp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHBsYWluOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LFJyPVhyKCJ1ZiIpLHppPVt7dWI6eyIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIscG9zaXRpb246InJlbGF0aXZlIixwYWRkaW5nTGVmdDoiNSIscGFkZGluZ1JpZ2h0OiI1IixvdmVyZmxvdzoiaGlkZGVuIixjb2xvcjoiIzAwMDAwMCIsYmFja2dyb3VuZENvbG9yOiIjZjhmOGY4Iixib3JkZXJSYWRpdXM6IjUiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZGJkYmRiIn19LCJ1Yi10Ijp7IiI6e2NvbG9yOiIjMDAwMDAwIixmb250U2l6ZToiMTgiLHRleHREZWNvcmF0aW9uOiJub25lIixsaW5lSGVpZ2h0OiI0NiJ9fSwidWItZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNmOGY4ZjgifX0sInViLXAiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIixib3JkZXJDb2xvcjoiIzAwNjJjYyJ9fSwidWItdyI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNlNjQzNDAiLGJvcmRlckNvbG9yOiIjYjgzNjMzIn19LCJ1Yi1kLXQiOnsiIjp7Y29sb3I6IiMwMDAwMDAifX0sInViLXAtdCI6eyIiOntjb2xvcjoiI2ZmZmZmZiJ9fSwidWItdy10Ijp7IiI6e2NvbG9yOiIjZmZmZmZmIn19LCJ1Yi1kLWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjZjdmN2Y3In19LCJ1Yi1wLWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjNjNhY2ZjIixib3JkZXJDb2xvcjoiIzRmOGFjYSJ9fSwidWItdy1kIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2VjOGI4OSIsYm9yZGVyQ29sb3I6IiNiZDZmNmUifX0sInViLWQtdC1kIjp7IiI6e2NvbG9yOiIjY2NjY2NjIn19LCJ1Yi1wLXQtZCI6eyIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn19LCJ1Yi13LXQtZCI6eyIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn19LCJ1Yi1kLXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjMzUzNTM1IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXAtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiMwMDdhZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItdy1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiI2U2NDM0MCIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1kLXQtcGxhaW4iOnsiIjp7Y29sb3I6IiMzNTM1MzUifX0sInViLXAtdC1wbGFpbiI6eyIiOntjb2xvcjoiIzAwN2FmZiJ9fSwidWItdy10LXBsYWluIjp7IiI6e2NvbG9yOiIjZTY0MzQwIn19LCJ1Yi1kLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItcC1kLXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXctZC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1kLXQtZC1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn19LCJ1Yi1wLXQtZC1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn19LCJ1Yi13LXQtZC1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn19LCJ1Yi1taW5pIjp7IiI6e2xpbmVIZWlnaHQ6IjMwIixmb250U2l6ZToiMTMiLHBhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6IjE3LjUiLHBhZGRpbmdCb3R0b206MCxwYWRkaW5nTGVmdDoiMTcuNSJ9fSwidWItbG9hZGluZyI6eyIiOnt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLG1hcmdpblJpZ2h0OiIxMCJ9fSwidWItZC1sb2FkaW5nIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItcC1sb2FkaW5nIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItdy1sb2FkaW5nIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItZC1sb2FkaW5nLXBsYWluIjp7IiI6e2NvbG9yOiIjMzUzNTM1In19LCJ1Yi1wLWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiMwMDdhZmYiLGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9fSwidWItdy1sb2FkaW5nLXBsYWluIjp7IiI6e2NvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtaG92ZXIiOnsiIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiNkZWRlZGUifX0sInViLXAtaG92ZXIiOnsiIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiMwMDYyY2MifX0sInViLXctaG92ZXIiOnsiIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiNjZTNjMzkifX0sInViLWQtdC1ob3ZlciI6eyIiOntjb2xvcjoicmdiYSgwLDAsMCwwLjYpIn19LCJ1Yi1wLXQtaG92ZXIiOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9fSwidWItdy10LWhvdmVyIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLWQtaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoNTMsNTMsNTMsMC42KSIsYm9yZGVyQ29sb3I6InJnYmEoNTMsNTMsNTMsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWhvdmVyLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDI2LDE3MywyNSwwLjYpIixib3JkZXJDb2xvcjoicmdiYSgwLDEyMiwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LWhvdmVyLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixib3JkZXJDb2xvcjoicmdiYSgyMzAsNjcsNjQsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19fV0sV2k9e2RlZmF1bHQ6ImQiLHByaW1hcnk6InAiLHdhcm46IncifSxybz1QLmRlZmluZUNvbXBvbmVudCh7aW5oZXJpdEF0dHJzOiExLG5hbWU6IkJ1dHRvbiIscHJvcHM6Q3QuZXh0ZW5kKFJpLHt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJkZWZhdWx0In0sc2l6ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiZGVmYXVsdCJ9fSksc3R5bGVzOnppLHNldHVwKHYse3Nsb3RzOngsYXR0cnM6JH0pe2xldHskYXR0cnM6VSwkZXhjbHVkZUF0dHJzOlosJGxpc3RlbmVyczpKfT1Lbyh7ZXhjbHVkZUxpc3RlbmVyczohMH0pLGVlPXYudHlwZSxjZT1QLnJlZihudWxsKSxoZT1QLmluamVjdChSciwhMSksVGU9KHl0LEhlKT0+e2xldCBEdD1KLnZhbHVlLm9uQ2xpY2t8fCgoKT0+e30pO2lmKHYuZGlzYWJsZWQpcmV0dXJuO0R0KHl0KTtsZXQgdm49di5mb3JtVHlwZTtpZih2bil7aWYoIWhlKXJldHVybjt2bj09PSJzdWJtaXQiP2hlLnN1Ym1pdCh5dCk6dm49PT0icmVzZXQiJiZoZS5yZXNldCh5dCl9fSxmZT15dD0+e2xldCBIZT0idWItIitXaVtlZV0reXQ7cmV0dXJuIHYuZGlzYWJsZWQmJihIZSs9Ii1kIiksdi5wbGFpbiYmKEhlKz0iLXBsYWluIiksdi5zaXplPT09Im1pbmkiJiZ5dD09PSItdCImJihIZSs9IiB1Yi1taW5pIiksSGV9LHdlPXl0PT57aWYodi5kaXNhYmxlZClyZXR1cm4iIjtsZXQgSGU9InViLSIrV2lbZWVdK3l0KyItaG92ZXIiO3JldHVybiB2LnBsYWluJiYoSGUrPSItcGxhaW4iKSxIZX0sbHQ9UC5pbmplY3QoVm4sITEpO2x0JiYobHQuYWRkSGFuZGxlcihUZSksUC5vbkJlZm9yZVVubW91bnQoKCk9PntsdC5yZW1vdmVIYW5kbGVyKFRlKX0pKSxicih2LHsibGFiZWwtY2xpY2siOlRlfSk7bGV0IHB0PVAuY29tcHV0ZWQoKCk9PntsZXQgeXQ9e307Zm9yKGxldCBIZSBpbiBKLnZhbHVlKXtsZXQgRHQ9Si52YWx1ZVtIZV07SGUhPT0ib25DbGljayImJih5dFtIZV09RHQpfXJldHVybiB5dH0pLGp0PSgpPT57aWYoIXguZGVmYXVsdClyZXR1cm5bXTtsZXQgeXQ9eC5kZWZhdWx0KCk7cmV0dXJuIHl0Lmxlbmd0aD09PTEmJnl0WzBdLnR5cGU9PT1QLlRleHQ/W1huKHl0WzBdLmNoaWxkcmVuLHtjbGFzczoidWItdCAiK2ZlKCItdCIpfSldOnl0fTtyZXR1cm4oKT0+e2xldCB5dD1DdC5leHRlbmQoe30sd24odikse2hvdmVyQ2xhc3M6d2UoIiIpfSxVLnZhbHVlLFoudmFsdWUscHQudmFsdWUpO3JldHVybiBQLmNyZWF0ZVZOb2RlKCJ2aWV3IixQLm1lcmdlUHJvcHMoe3JlZjpjZSxjbGFzczpbInViIixmZSgiIildLG9uQ2xpY2s6VGV9LHl0KSxbdi5sb2FkaW5nP1AuY3JlYXRlVk5vZGUoImxvYWRpbmctaW5kaWNhdG9yIixQLm1lcmdlUHJvcHMoe2NsYXNzOlsidWItbG9hZGluZyIsYHViLSR7V2lbZWVdfS1sb2FkaW5nYF19LHthcnJvdzoiZmFsc2UiLGFuaW1hdGluZzoidHJ1ZSJ9KSxudWxsKTpudWxsLC4uLmp0KCldKX19fSksaW89e3NjYWxlQXJlYTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fTtmdW5jdGlvbiBsaSh2KXtsZXQgeD1bXTtyZXR1cm4gQ3QuaXNBcnJheSh2KSYmdi5mb3JFYWNoKCQ9PntQLmlzVk5vZGUoJCk/JC50eXBlPT09UC5GcmFnbWVudD94LnB1c2goLi4ubGkoJC5jaGlsZHJlbikpOngucHVzaCgkKTpDdC5pc0FycmF5KCQpJiZ4LnB1c2goLi4ubGkoJCkpfSkseH1mdW5jdGlvbiBwbyh2KXtsZXQgeD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihVKXtyZXR1cm4geFtVXXx8KHhbVV09dihVKSl9fWxldCBPbz1wbyhmdW5jdGlvbih2KXtsZXQgeD17fSwkPS87KD8hW14oXSpcKSkvZyxVPS86KC4rKS87cmV0dXJuIHYuc3BsaXQoJCkuZm9yRWFjaChmdW5jdGlvbihaKXtpZihaKXtsZXQgSj1aLnNwbGl0KFUpO0oubGVuZ3RoPjEmJih4W0pbMF0udHJpbSgpXT1KWzFdLnRyaW0oKSl9fSkseH0pLHhuPXY9Pm5ldyBQcm9taXNlKCh4LCQpPT57aWYoIXYpcmV0dXJuIHgoe3dpZHRoOjAsaGVpZ2h0OjAsdG9wOjAsbGVmdDowfSk7eS5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHYsKHtzaXplOlp9KT0+e3goWil9KX0pLFRyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJNb3ZhYmxlQXJlYSIscHJvcHM6aW8sc3R5bGVzOlt7InVuaS1tb3ZhYmxlLWFyZWEiOnsiIjp7b3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6IjEwcHgiLGhlaWdodDoiMTBweCJ9fX1dLHNldHVwKHYse3Nsb3RzOnh9KXtsZXQgJD1QLnJlZigwKSxVPVAucmVmKDApLFo9UC5yZWYoMCksSj1QLnJlZigwKSxlZT1QLnJlZighMSksY2U9UC5yZWYobnVsbCksaGU9W10sVGU9bnVsbCxmZT1IZT0+e1RlPUhlfSx3ZT0oKT0+eG4oY2UudmFsdWUpLnRoZW4oKHt3aWR0aDpIZSxoZWlnaHQ6RHQsdG9wOnZuLGxlZnQ6cXR9KT0+eyQudmFsdWU9SGUsVS52YWx1ZT1EdCxaLnZhbHVlPXZuLEoudmFsdWU9cXR9KSxsdD0oKT0+e3dlKCkudGhlbigoKT0+e2hlLmZvckVhY2goZnVuY3Rpb24oSGUpe0hlLnNldFBhcmVudCgpfSl9KX07UC5vbk1vdW50ZWQoKCk9PntmKCgpPT57ZWUudmFsdWU9ITAsbHQoKX0sMjAwKX0pO2xldCBwdD17b25QYW5zdGFydChIZSl7VGUmJlRlLnRvdWNoc3RhcnQoSGUpfSxvblBhbm1vdmUoSGUpe0hlLnN0b3BQcm9wYWdhdGlvbigpLFRlJiZUZS50b3VjaG1vdmUoSGUpfSxvblBhbmVuZChIZSl7VGUmJlRlLnRvdWNoZW5kKEhlKSxUZT1udWxsfX0sanQ9SGU9PntoZS5wdXNoKEhlKX0seXQ9SGU9PntsZXQgRHQ9aGUuaW5kZXhPZihIZSk7RHQ+PTAmJmhlLnNwbGljZShEdCwxKX07cmV0dXJuIFAucHJvdmlkZSgiX2lzTW91bnRlZCIsZWUpLFAucHJvdmlkZSgicGFyZW50U2l6ZSIse3dpZHRoOiQsaGVpZ2h0OlUsdG9wOlosbGVmdDpKfSksUC5wcm92aWRlKCJhZGRNb3ZhYmxlVmlld0NvbnRleHQiLGp0KSxQLnByb3ZpZGUoInJlbW92ZU1vdmFibGVWaWV3Q29udGV4dCIseXQpLFAucHJvdmlkZSgic2V0VG91Y2hNb3ZhYmxlVmlld0NvbnRleHQiLGZlKSwoKT0+e2xldCBIZT14LmRlZmF1bHQmJnguZGVmYXVsdCgpLER0PWxpKEhlKTtyZXR1cm4gUC5jcmVhdGVWTm9kZSgidmlldyIsUC5tZXJnZVByb3BzKHtyZWY6Y2UsY2xhc3M6InVuaS1tb3ZhYmxlLWFyZWEifSxwdCksW0R0XSl9fX0pO2Z1bmN0aW9uIGNpKHYpe2xldCB4PXt9O2Z1bmN0aW9uICQoZmUsd2Upe3hbZmVdJiZ4W2ZlXSh3ZSl9ZnVuY3Rpb24gVShmZSx3ZSl7eFtmZV09ZnVuY3Rpb24obHQpe0N0LmlzRnVuY3Rpb24od2UpJiYobHQudG91Y2hlcz1sdC5jaGFuZ2VkVG91Y2hlcyx3ZShsdCk9PT0hMSYmbHQuc3RvcFByb3BhZ2F0aW9uKCkpfX1sZXQgWj0wLEo9MCxlZT0wLGNlPTAsaGU9ZnVuY3Rpb24oZmUsd2UsbHQscHQpe2lmKHYoe3RhcmdldDpmZS50YXJnZXQsY3VycmVudFRhcmdldDpmZS5jdXJyZW50VGFyZ2V0LHN0b3BQcm9wYWdhdGlvbjpmZS5zdG9wUHJvcGFnYXRpb24uYmluZChmZSksdG91Y2hlczpmZS50b3VjaGVzLGNoYW5nZWRUb3VjaGVzOmZlLmNoYW5nZWRUb3VjaGVzLGRldGFpbDp7c3RhdGU6d2UseDpsdCx5OnB0LGR4Omx0LVosZHk6cHQtSixkZHg6bHQtZWUsZGR5OnB0LWNlLHRpbWVTdGFtcDpmZS50aW1lU3RhbXB8fERhdGUubm93KCl9fSk9PT0hMSlyZXR1cm4hMX0sVGU9bnVsbDtyZXR1cm4gVSgidG91Y2hzdGFydCIsZnVuY3Rpb24oZmUpe2lmKCFUZSlyZXR1cm4gVGU9ZmUsWj1lZT1mZS50b3VjaGVzWzBdLnBhZ2VYLEo9Y2U9ZmUudG91Y2hlc1swXS5wYWdlWSxoZShmZSwic3RhcnQiLFosSil9KSxVKCJ0b3VjaG1vdmUiLGZ1bmN0aW9uKGZlKXtpZihUZSl7bGV0IHdlPWhlKGZlLCJtb3ZlIixmZS50b3VjaGVzWzBdLnBhZ2VYLGZlLnRvdWNoZXNbMF0ucGFnZVkpO3JldHVybiBlZT1mZS50b3VjaGVzWzBdLnBhZ2VYLGNlPWZlLnRvdWNoZXNbMF0ucGFnZVksd2V9fSksVSgidG91Y2hlbmQiLGZ1bmN0aW9uKGZlKXtpZihUZSlyZXR1cm4gVGU9bnVsbCxoZShmZSwiZW5kIixmZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCxmZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWSl9KSx7dG91Y2hzdGFydDpmdW5jdGlvbihmZSl7JCgidG91Y2hzdGFydCIsZmUpfSx0b3VjaG1vdmU6ZnVuY3Rpb24oZmUpeyQoInRvdWNobW92ZSIsZmUpfSx0b3VjaGVuZDpmdW5jdGlvbihmZSl7JCgidG91Y2hlbmQiLGZlKX19fWZ1bmN0aW9uIGZyKHYseCl7cmV0dXJuKCQsVSk9Pnt2LnZhbHVlJiZ4KCQsdm8oJCx2LnZhbHVlLFV8fHt9KSl9fWZ1bmN0aW9uIHZvKHYseCwkPXt9KXtyZXR1cm4geD1Ubyh4KSx7dHlwZTp2LHRpbWVTdGFtcDpEYXRlLm5vdygpLHRhcmdldDp4LGN1cnJlbnRUYXJnZXQ6eCxkZXRhaWw6JH19bGV0IFpvPVJuLmNhY2hlU3RyaW5nRnVuY3Rpb24odj0+di5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSt2LnNsaWNlKDEpKTtmdW5jdGlvbiBUbyh2KXtsZXR7b2Zmc2V0TGVmdDp4LG9mZnNldFRvcDokfT12LFU9di5hdHRyLFo9e307cmV0dXJuIE9iamVjdC5rZXlzKFV8fHt9KS5mb3JFYWNoKEo9PntKLmluZGV4T2YoImRhdGEiKT09PTAmJihaW1pvKEoucmVwbGFjZSgiZGF0YSIsIiIpKV09VVtKXSl9KSx7aWQ6VSYmVS5pZHx8IiIsZGF0YXNldDpaLG9mZnNldExlZnQ6eHx8MCxvZmZzZXRUb3A6JHx8MH19ZnVuY3Rpb24gU2kodix4LCQpe3JldHVybiB2PngtJCYmdjx4KyR9ZnVuY3Rpb24gc3Iodix4KXtyZXR1cm4gU2kodiwwLHgpfWZ1bmN0aW9uIHVpKCl7fXVpLnByb3RvdHlwZS54PWZ1bmN0aW9uKHYpe3JldHVybiBNYXRoLnNxcnQodil9O2Z1bmN0aW9uIGxyKHYseCl7dGhpcy5fbT12LHRoaXMuX2Y9MWUzKngsdGhpcy5fc3RhcnRUaW1lPTAsdGhpcy5fdj0wfWxyLnByb3RvdHlwZS5zZXRWPWZ1bmN0aW9uKHYseCl7bGV0ICQ9TWF0aC5wb3coTWF0aC5wb3codiwyKStNYXRoLnBvdyh4LDIpLC41KTt0aGlzLl94X3Y9dix0aGlzLl95X3Y9eCx0aGlzLl94X2E9LXRoaXMuX2YqdGhpcy5feF92LyQsdGhpcy5feV9hPS10aGlzLl9mKnRoaXMuX3lfdi8kLHRoaXMuX3Q9TWF0aC5hYnModi90aGlzLl94X2EpfHxNYXRoLmFicyh4L3RoaXMuX3lfYSksdGhpcy5fbGFzdER0PW51bGwsdGhpcy5fc3RhcnRUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpfSxsci5wcm90b3R5cGUuc2V0Uz1mdW5jdGlvbih2LHgpe3RoaXMuX3hfcz12LHRoaXMuX3lfcz14fSxsci5wcm90b3R5cGUucz1mdW5jdGlvbih2KXt2PT09dm9pZCAwJiYodj0obmV3IERhdGUoKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHY+dGhpcy5fdCYmKHY9dGhpcy5fdCx0aGlzLl9sYXN0RHQ9dik7bGV0IHg9dGhpcy5feF92KnYrLjUqdGhpcy5feF9hKk1hdGgucG93KHYsMikrdGhpcy5feF9zLCQ9dGhpcy5feV92KnYrLjUqdGhpcy5feV9hKk1hdGgucG93KHYsMikrdGhpcy5feV9zO3JldHVybih0aGlzLl94X2E+MCYmeDx0aGlzLl9lbmRQb3NpdGlvblh8fHRoaXMuX3hfYTwwJiZ4PnRoaXMuX2VuZFBvc2l0aW9uWCkmJih4PXRoaXMuX2VuZFBvc2l0aW9uWCksKHRoaXMuX3lfYT4wJiYkPHRoaXMuX2VuZFBvc2l0aW9uWXx8dGhpcy5feV9hPDAmJiQ+dGhpcy5fZW5kUG9zaXRpb25ZKSYmKCQ9dGhpcy5fZW5kUG9zaXRpb25ZKSx7eCx5OiR9fSxsci5wcm90b3R5cGUuZHM9ZnVuY3Rpb24odil7cmV0dXJuIHY9PT12b2lkIDAmJih2PShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksdj50aGlzLl90JiYodj10aGlzLl90KSx7ZHg6dGhpcy5feF92K3RoaXMuX3hfYSp2LGR5OnRoaXMuX3lfdit0aGlzLl95X2Eqdn19LGxyLnByb3RvdHlwZS5kZWx0YT1mdW5jdGlvbigpe3JldHVybnt4Oi0xLjUqTWF0aC5wb3codGhpcy5feF92LDIpL3RoaXMuX3hfYXx8MCx5Oi0xLjUqTWF0aC5wb3codGhpcy5feV92LDIpL3RoaXMuX3lfYXx8MH19LGxyLnByb3RvdHlwZS5kdD1mdW5jdGlvbigpe3JldHVybi10aGlzLl94X3YvdGhpcy5feF9hfSxsci5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbigpe2xldCB2PVNpKHRoaXMucygpLngsdGhpcy5fZW5kUG9zaXRpb25YKXx8U2kodGhpcy5zKCkueSx0aGlzLl9lbmRQb3NpdGlvblkpfHx0aGlzLl9sYXN0RHQ9PT10aGlzLl90O3JldHVybiB0aGlzLl9sYXN0RHQ9bnVsbCx2fSxsci5wcm90b3R5cGUuc2V0RW5kPWZ1bmN0aW9uKHYseCl7dGhpcy5fZW5kUG9zaXRpb25YPXYsdGhpcy5fZW5kUG9zaXRpb25ZPXh9LGxyLnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbih2LHgpe3RoaXMuX209dix0aGlzLl9mPTFlMyp4fTtmdW5jdGlvbiBRbih2LHgsJCl7dGhpcy5fbT12LHRoaXMuX2s9eCx0aGlzLl9jPSQsdGhpcy5fc29sdXRpb249bnVsbCx0aGlzLl9lbmRQb3NpdGlvbj0wLHRoaXMuX3N0YXJ0VGltZT0wfVFuLnByb3RvdHlwZS5fc29sdmU9ZnVuY3Rpb24odix4KXtsZXQgJD10aGlzLl9jLFU9dGhpcy5fbSxaPXRoaXMuX2ssSj0kKiQtNCpVKlo7aWYoSj09PTApe2xldCBmZT0tJC8oMipVKSx3ZT12LGx0PXgvKGZlKnYpO3JldHVybnt4OmZ1bmN0aW9uKHB0KXtyZXR1cm4od2UrbHQqcHQpKk1hdGgucG93KE1hdGguRSxmZSpwdCl9LGR4OmZ1bmN0aW9uKHB0KXtsZXQganQ9TWF0aC5wb3coTWF0aC5FLGZlKnB0KTtyZXR1cm4gZmUqKHdlK2x0KnB0KSpqdCtsdCpqdH19fWlmKEo+MCl7bGV0IGZlPSgtJC1NYXRoLnNxcnQoSikpLygyKlUpLHdlPSgtJCtNYXRoLnNxcnQoSikpLygyKlUpLGx0PSh4LWZlKnYpLyh3ZS1mZSkscHQ9di1sdDtyZXR1cm57eDpmdW5jdGlvbihqdCl7bGV0IHl0LEhlO3JldHVybiBqdD09PXRoaXMuX3QmJih5dD10aGlzLl9wb3dFUjFULEhlPXRoaXMuX3Bvd0VSMlQpLHRoaXMuX3Q9anQseXR8fCh5dD10aGlzLl9wb3dFUjFUPU1hdGgucG93KE1hdGguRSxmZSpqdCkpLEhlfHwoSGU9dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsd2UqanQpKSxwdCp5dCtsdCpIZX0sZHg6ZnVuY3Rpb24oanQpe2xldCB5dCxIZTtyZXR1cm4ganQ9PT10aGlzLl90JiYoeXQ9dGhpcy5fcG93RVIxVCxIZT10aGlzLl9wb3dFUjJUKSx0aGlzLl90PWp0LHl0fHwoeXQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsZmUqanQpKSxIZXx8KEhlPXRoaXMuX3Bvd0VSMlQ9TWF0aC5wb3coTWF0aC5FLHdlKmp0KSkscHQqZmUqeXQrbHQqd2UqSGV9fX1sZXQgZWU9TWF0aC5zcXJ0KDQqVSpaLSQqJCkvKDIqVSksY2U9LSQvMipVLGhlPXYsVGU9KHgtY2UqdikvZWU7cmV0dXJue3g6ZnVuY3Rpb24oZmUpe3JldHVybiBNYXRoLnBvdyhNYXRoLkUsY2UqZmUpKihoZSpNYXRoLmNvcyhlZSpmZSkrVGUqTWF0aC5zaW4oZWUqZmUpKX0sZHg6ZnVuY3Rpb24oZmUpe2xldCB3ZT1NYXRoLnBvdyhNYXRoLkUsY2UqZmUpLGx0PU1hdGguY29zKGVlKmZlKSxwdD1NYXRoLnNpbihlZSpmZSk7cmV0dXJuIHdlKihUZSplZSpsdC1oZSplZSpwdCkrY2Uqd2UqKFRlKnB0K2hlKmx0KX19fSxRbi5wcm90b3R5cGUueD1mdW5jdGlvbih2KXtyZXR1cm4gdj09PXZvaWQgMCYmKHY9KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9lbmRQb3NpdGlvbit0aGlzLl9zb2x1dGlvbi54KHYpOjB9LFFuLnByb3RvdHlwZS5keD1mdW5jdGlvbih2KXtyZXR1cm4gdj09PXZvaWQgMCYmKHY9KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9zb2x1dGlvbi5keCh2KTowfSxRbi5wcm90b3R5cGUuc2V0RW5kPWZ1bmN0aW9uKHYseCwkKXtpZigkfHwoJD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdiE9PXRoaXMuX2VuZFBvc2l0aW9ufHwhc3IoeCwuMSkpe3g9eHx8MDtsZXQgVT10aGlzLl9lbmRQb3NpdGlvbjt0aGlzLl9zb2x1dGlvbiYmKHNyKHgsLjEpJiYoeD10aGlzLl9zb2x1dGlvbi5keCgoJC10aGlzLl9zdGFydFRpbWUpLzFlMykpLFU9dGhpcy5fc29sdXRpb24ueCgoJC10aGlzLl9zdGFydFRpbWUpLzFlMyksc3IoeCwuMSkmJih4PTApLHNyKFUsLjEpJiYoVT0wKSxVKz10aGlzLl9lbmRQb3NpdGlvbiksdGhpcy5fc29sdXRpb24mJnNyKFUtdiwuMSkmJnNyKHgsLjEpfHwodGhpcy5fZW5kUG9zaXRpb249dix0aGlzLl9zb2x1dGlvbj10aGlzLl9zb2x2ZShVLXRoaXMuX2VuZFBvc2l0aW9uLHgpLHRoaXMuX3N0YXJ0VGltZT0kKX19LFFuLnByb3RvdHlwZS5zbmFwPWZ1bmN0aW9uKHYpe3RoaXMuX3N0YXJ0VGltZT1uZXcgRGF0ZSgpLmdldFRpbWUoKSx0aGlzLl9lbmRQb3NpdGlvbj12LHRoaXMuX3NvbHV0aW9uPXt4OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGR4OmZ1bmN0aW9uKCl7cmV0dXJuIDB9fX0sUW4ucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24odil7cmV0dXJuIHZ8fCh2PW5ldyBEYXRlKCkuZ2V0VGltZSgpKSxTaSh0aGlzLngoKSx0aGlzLl9lbmRQb3NpdGlvbiwuMSkmJnNyKHRoaXMuZHgoKSwuMSl9LFFuLnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbih2LHgsJCl7dGhpcy5fbT12LHRoaXMuX2s9eCx0aGlzLl9jPSQsdGhpcy5kb25lKCl8fCh0aGlzLl9zb2x1dGlvbj10aGlzLl9zb2x2ZSh0aGlzLngoKS10aGlzLl9lbmRQb3NpdGlvbix0aGlzLmR4KCkpLHRoaXMuX3N0YXJ0VGltZT1uZXcgRGF0ZSgpLmdldFRpbWUoKSl9LFFuLnByb3RvdHlwZS5zcHJpbmdDb25zdGFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9rfSxRbi5wcm90b3R5cGUuZGFtcGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jfSxRbi5wcm90b3R5cGUuY29uZmlndXJhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHYoJCxVKXskLnJlY29uZmlndXJlKDEsVSwkLmRhbXBpbmcoKSl9ZnVuY3Rpb24geCgkLFUpeyQucmVjb25maWd1cmUoMSwkLnNwcmluZ0NvbnN0YW50KCksVSl9cmV0dXJuW3tsYWJlbDoiU3ByaW5nIENvbnN0YW50IixyZWFkOnRoaXMuc3ByaW5nQ29uc3RhbnQuYmluZCh0aGlzKSx3cml0ZTp2LmJpbmQodGhpcyx0aGlzKSxtaW46MTAwLG1heDoxZTN9LHtsYWJlbDoiRGFtcGluZyIscmVhZDp0aGlzLmRhbXBpbmcuYmluZCh0aGlzKSx3cml0ZTp4LmJpbmQodGhpcyx0aGlzKSxtaW46MSxtYXg6NTAwfV19O2Z1bmN0aW9uIHhpKHYseCwkKXt0aGlzLl9zcHJpbmdYPW5ldyBRbih2LHgsJCksdGhpcy5fc3ByaW5nWT1uZXcgUW4odix4LCQpLHRoaXMuX3NwcmluZ1NjYWxlPW5ldyBRbih2LHgsJCksdGhpcy5fc3RhcnRUaW1lPTB9eGkucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbih2LHgsJCxVKXtsZXQgWj1uZXcgRGF0ZSgpLmdldFRpbWUoKTt0aGlzLl9zcHJpbmdYLnNldEVuZCh2LFUsWiksdGhpcy5fc3ByaW5nWS5zZXRFbmQoeCxVLFopLHRoaXMuX3NwcmluZ1NjYWxlLnNldEVuZCgkLFUsWiksdGhpcy5fc3RhcnRUaW1lPVp9LHhpLnByb3RvdHlwZS54PWZ1bmN0aW9uKCl7bGV0IHY9KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzO3JldHVybnt4OnRoaXMuX3NwcmluZ1gueCh2KSx5OnRoaXMuX3NwcmluZ1kueCh2KSxzY2FsZTp0aGlzLl9zcHJpbmdTY2FsZS54KHYpfX0seGkucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXtsZXQgdj1uZXcgRGF0ZSgpLmdldFRpbWUoKTtyZXR1cm4gdGhpcy5fc3ByaW5nWC5kb25lKHYpJiZ0aGlzLl9zcHJpbmdZLmRvbmUodikmJnRoaXMuX3NwcmluZ1NjYWxlLmRvbmUodil9LHhpLnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbih2LHgsJCl7dGhpcy5fc3ByaW5nWC5yZWNvbmZpZ3VyZSh2LHgsJCksdGhpcy5fc3ByaW5nWS5yZWNvbmZpZ3VyZSh2LHgsJCksdGhpcy5fc3ByaW5nU2NhbGUucmVjb25maWd1cmUodix4LCQpfTtsZXQgb289e2RpcmVjdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibm9uZSJ9LGluZXJ0aWE6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxvdXRPZkJvdW5kczp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0seTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxkYW1waW5nOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxmcmljdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHNjYWxlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2NhbGVNaW46e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6LjV9LHNjYWxlTWF4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjEwfSxzY2FsZVZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGFuaW1hdGlvbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITB9fTtmdW5jdGlvbiB0aSh2LHgpe3JldHVybisoKDFlMyp2LTFlMyp4KS8xZTMpLnRvRml4ZWQoMSl9ZnVuY3Rpb24geHIodix4LCQpe2xldCBVPXtpZDowLGNhbmNlbGxlZDohMX0sWj1mdW5jdGlvbihlZSl7ZWUmJmVlLmlkJiZIcihlZS5pZCksZWUmJihlZS5jYW5jZWxsZWQ9ITApfTtmdW5jdGlvbiBKKGVlLGNlLGhlLFRlKXtpZighZWV8fCFlZS5jYW5jZWxsZWQpe2hlKGNlKTtsZXQgZmU9Y2UuZG9uZSgpO2ZlfHxlZS5jYW5jZWxsZWR8fChlZS5pZD1QbyhKLmJpbmQobnVsbCxlZSxjZSxoZSxUZSkpKSxmZSYmVGUmJlRlKGNlKX19cmV0dXJuIEooVSx2LHgsJCkse2NhbmNlbDpaLmJpbmQobnVsbCxVKSxtb2RlbDp2fX1sZXQgQnI9ITE7ZnVuY3Rpb24gd2kodil7QnJ8fChCcj0hMCxQbyhmdW5jdGlvbigpe3YoKSxCcj0hMX0pKX1mdW5jdGlvbiBQbyh2KXtyZXR1cm4gZih2LDE2KX1mdW5jdGlvbiBIcih2KXtzKHYpfWxldCBNcj15LnJlcXVpcmVNb2R1bGUoImFuaW1hdGlvbiIpLEVyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJNb3ZhYmxlVmlldyIscHJvcHM6b28sZW1pdHM6WyJjaGFuZ2UiLCJzY2FsZSJdLHN0eWxlczpbeyJ1bmktbW92YWJsZS12aWV3Ijp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiIwcHgiLGxlZnQ6IjBweCIsd2lkdGg6IjEwcHgiLGhlaWdodDoiMTBweCJ9fX1dLHNldHVwKHYse2VtaXQ6eCxzbG90czokfSl7bGV0IFU9UC5yZWYobnVsbCksWj1mcihVLHgpLEo9UC5pbmplY3QoInNldFRvdWNoTW92YWJsZVZpZXdDb250ZXh0IiwoKT0+e30pLGVlPWduKHYsWixVLEopO3JldHVybigpPT57bGV0IGNlPXtwcmV2ZW50R2VzdHVyZTohMH07cmV0dXJuIFAuY3JlYXRlVk5vZGUoInZpZXciLFAubWVyZ2VQcm9wcyh7cmVmOlUsb25Ub3VjaHN0YXJ0OmVlLGNsYXNzOiJ1bmktbW92YWJsZS12aWV3IixzdHlsZToidHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOyJ9LGNlKSxbJC5kZWZhdWx0JiYkLmRlZmF1bHQoKV0pfX19KTtmdW5jdGlvbiBnbih2LHgsJCxVKXtsZXQgWj1QLmluamVjdCgiX2lzTW91bnRlZCIsUC5yZWYoITEpKSxKPVAuaW5qZWN0KCJwYXJlbnRTaXplIix7d2lkdGg6UC5yZWYoMCksaGVpZ2h0OlAucmVmKDApLHRvcDpQLnJlZigwKSxsZWZ0OlAucmVmKDApfSksZWU9UC5pbmplY3QoImFkZE1vdmFibGVWaWV3Q29udGV4dCIsKCk9Pnt9KSxjZT1QLmluamVjdCgicmVtb3ZlTW92YWJsZVZpZXdDb250ZXh0IiwoKT0+e30pLGhlPXt0b3VjaHN0YXJ0OigpPT57fSx0b3VjaG1vdmU6KCk9Pnt9LHRvdWNoZW5kOigpPT57fX07ZnVuY3Rpb24gVGUoTmUpe3JldHVybiBOdW1iZXIoTmUpfHwwfWZ1bmN0aW9uIGZlKE5lKXtyZXR1cm4gTmU9TnVtYmVyKE5lKSxpc05hTihOZSk/MTpOZX1sZXQgd2U9UC5yZWYoVGUodi54KSksbHQ9UC5yZWYoVGUodi55KSkscHQ9UC5yZWYoZmUoTnVtYmVyKHYuc2NhbGVWYWx1ZSkpKSxqdD1QLnJlZigwKSx5dD1QLnJlZigwKSxIZT1QLnJlZigwKSxEdD1QLnJlZigwKSx2bj1QLnJlZigwKSxxdD1QLnJlZigwKSxkdD1udWxsLHJuPW51bGwsTG49e3g6MCx5OjB9LEp0PXt4OjAseTowfSx6dD0xLCR0PTAsWnQ9MCxlYT0hMSxwaSxpaSxRaT1udWxsLGphPW51bGwsem49e3RvcDowLGxlZnQ6MCx3aWR0aDowLGhlaWdodDowfSxXbj1uZXcgdWksTnI9bmV3IHVpLEduPXtoaXN0b3J5WDpbMCwwXSxoaXN0b3J5WTpbMCwwXSxoaXN0b3J5VDpbMCwwXX0sQ3I9UC5jb21wdXRlZCgoKT0+e2xldCBOZT1OdW1iZXIodi5kYW1waW5nKTtyZXR1cm4gaXNOYU4oTmUpPzIwOk5lfSkscXI9UC5jb21wdXRlZCgoKT0+e2xldCBOZT1OdW1iZXIodi5mcmljdGlvbik7cmV0dXJuIGlzTmFOKE5lKXx8TmU8PTA/MjpOZX0pLHRhPVAuY29tcHV0ZWQoKCk9PntsZXQgTmU9TnVtYmVyKHYuc2NhbGVNaW4pO3JldHVybiBpc05hTihOZSk/LjU6TmV9KSxjcz1QLmNvbXB1dGVkKCgpPT57bGV0IE5lPU51bWJlcih2LnNjYWxlTWF4KTtyZXR1cm4gaXNOYU4oTmUpPzEwOk5lfSksbG49UC5jb21wdXRlZCgoKT0+di5kaXJlY3Rpb249PT0iYWxsInx8di5kaXJlY3Rpb249PT0iaG9yaXpvbnRhbCIpLHluPVAuY29tcHV0ZWQoKCk9PnYuZGlyZWN0aW9uPT09ImFsbCJ8fHYuZGlyZWN0aW9uPT09InZlcnRpY2FsIiksWW49bmV3IHhpKDEsOSpNYXRoLnBvdyhDci52YWx1ZSwyKS80MCxDci52YWx1ZSksWm49bmV3IGxyKDEscXIudmFsdWUpO1Aud2F0Y2goKCk9PnYueCxOZT0+e3dlLnZhbHVlPVRlKE5lKX0pLFAud2F0Y2goKCk9PnYueSxOZT0+e2x0LnZhbHVlPVRlKE5lKX0pLFAud2F0Y2goKCk9PnYuc2NhbGVWYWx1ZSxOZT0+e3B0LnZhbHVlPWZlKE51bWJlcihOZSkpfSksUC53YXRjaCh3ZSx1cyksUC53YXRjaChsdCx6YSksUC53YXRjaChwdCxuYSksUC53YXRjaCh0YSxJYSksUC53YXRjaChjcyxJYSk7ZnVuY3Rpb24gVGkoKXtybiYmcm4uY2FuY2VsKCksZHQmJmR0LmNhbmNlbCgpfWZ1bmN0aW9uIHVzKE5lKXtpZihsbi52YWx1ZSl7aWYoTmUrSnQueD09PSR0KXJldHVybiAkdDtkdCYmZHQuY2FuY2VsKCkseW8oTmUrSnQueCxsdC52YWx1ZStKdC55LHp0KX1yZXR1cm4gTmV9ZnVuY3Rpb24gemEoTmUpe2lmKHluLnZhbHVlKXtpZihOZStKdC55PT09WnQpcmV0dXJuIFp0O2R0JiZkdC5jYW5jZWwoKSx5byh3ZS52YWx1ZStKdC54LE5lK0p0LnksenQpfXJldHVybiBOZX1mdW5jdGlvbiBJYSgpe2lmKCF2LnNjYWxlKXJldHVybiExO1VpKHp0LCEwKX1mdW5jdGlvbiBuYShOZSl7cmV0dXJuIHYuc2NhbGU/KE5lPUVvKE5lKSxVaShOZSwhMCksTmUpOiExfWZ1bmN0aW9uIHVvKCl7di5kaXNhYmxlZHx8KFRpKCksR24uaGlzdG9yeVg9WzAsMF0sR24uaGlzdG9yeVk9WzAsMF0sR24uaGlzdG9yeVQ9WzAsMF0sbG4udmFsdWUmJihwaT0kdCkseW4udmFsdWUmJihpaT1adCksUWk9bnVsbCxqYT1udWxsLGVhPSEwKX1mdW5jdGlvbiBXYShOZSl7aWYoIXYuZGlzYWJsZWQmJmVhKXtsZXQga3Q9JHQsSXQ9WnQ7aWYoamE9PT1udWxsJiYoamE9TWF0aC5hYnMoTmUuZGV0YWlsLmR4L05lLmRldGFpbC5keSk+MT8iaHRvdWNobW92ZSI6InZ0b3VjaG1vdmUiKSxsbi52YWx1ZSYmKGt0PU5lLmRldGFpbC5keCtwaSxHbi5oaXN0b3J5WC5zaGlmdCgpLEduLmhpc3RvcnlYLnB1c2goa3QpLCF5bi52YWx1ZSYmUWk9PT1udWxsJiYoUWk9TWF0aC5hYnMoTmUuZGV0YWlsLmR4L05lLmRldGFpbC5keSk8MSkpLHluLnZhbHVlJiYoSXQ9TmUuZGV0YWlsLmR5K2lpLEduLmhpc3RvcnlZLnNoaWZ0KCksR24uaGlzdG9yeVkucHVzaChJdCksIWxuLnZhbHVlJiZRaT09PW51bGwmJihRaT1NYXRoLmFicyhOZS5kZXRhaWwuZHkvTmUuZGV0YWlsLmR4KTwxKSksR24uaGlzdG9yeVQuc2hpZnQoKSxHbi5oaXN0b3J5VC5wdXNoKE5lLmRldGFpbC50aW1lU3RhbXApLCFRaSl7bGV0IE9uPSJ0b3VjaCI7a3Q8SGUudmFsdWU/di5vdXRPZkJvdW5kcz8oT249InRvdWNoLW91dC1vZi1ib3VuZHMiLGt0PUhlLnZhbHVlLVduLngoSGUudmFsdWUta3QpKTprdD1IZS52YWx1ZTprdD52bi52YWx1ZSYmKHYub3V0T2ZCb3VuZHM/KE9uPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixrdD12bi52YWx1ZStXbi54KGt0LXZuLnZhbHVlKSk6a3Q9dm4udmFsdWUpLEl0PER0LnZhbHVlP3Yub3V0T2ZCb3VuZHM/KE9uPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixJdD1EdC52YWx1ZS1Oci54KER0LnZhbHVlLUl0KSk6SXQ9RHQudmFsdWU6SXQ+cXQudmFsdWUmJih2Lm91dE9mQm91bmRzPyhPbj0idG91Y2gtb3V0LW9mLWJvdW5kcyIsSXQ9cXQudmFsdWUrTnIueChJdC1xdC52YWx1ZSkpOkl0PXF0LnZhbHVlKSx3aShmdW5jdGlvbigpe0RvKGt0LEl0LHp0LE9uKX0pfX19ZnVuY3Rpb24gZnMoKXtpZighdi5kaXNhYmxlZCYmZWEmJihlYT0hMSwhUWkmJiFkcygib3V0LW9mLWJvdW5kcyIpJiZ2LmluZXJ0aWEpKXtsZXQgTmU9MWUzKihHbi5oaXN0b3J5WFsxXS1Hbi5oaXN0b3J5WFswXSkvKEduLmhpc3RvcnlUWzFdLUduLmhpc3RvcnlUWzBdKSxrdD0xZTMqKEduLmhpc3RvcnlZWzFdLUduLmhpc3RvcnlZWzBdKS8oR24uaGlzdG9yeVRbMV0tR24uaGlzdG9yeVRbMF0pO1puLnNldFYoTmUsa3QpLFpuLnNldFMoJHQsWnQpO2xldCBJdD1abi5kZWx0YSgpLngsT249Wm4uZGVsdGEoKS55LEFyPUl0KyR0LFBpPU9uK1p0O0FyPEhlLnZhbHVlPyhBcj1IZS52YWx1ZSxQaT1adCsoSGUudmFsdWUtJHQpKk9uL0l0KTpBcj52bi52YWx1ZSYmKEFyPXZuLnZhbHVlLFBpPVp0Kyh2bi52YWx1ZS0kdCkqT24vSXQpLFBpPER0LnZhbHVlPyhQaT1EdC52YWx1ZSxBcj0kdCsoRHQudmFsdWUtWnQpKkl0L09uKTpQaT5xdC52YWx1ZSYmKFBpPXF0LnZhbHVlLEFyPSR0KyhxdC52YWx1ZS1adCkqSXQvT24pLFpuLnNldEVuZChBcixQaSkscm49eHIoWm4sZnVuY3Rpb24oKXtsZXQgZW89Wm4ucygpLEZvPWVvLngsTmE9ZW8ueTtEbyhGbyxOYSx6dCwiZnJpY3Rpb24iKX0sZnVuY3Rpb24oKXtybi5jYW5jZWwoKX0pfX1mdW5jdGlvbiBKcihOZSxrdCl7bGV0IEl0PSExO3JldHVybiBOZT52bi52YWx1ZT8oTmU9dm4udmFsdWUsSXQ9ITApOk5lPEhlLnZhbHVlJiYoTmU9SGUudmFsdWUsSXQ9ITApLGt0PnF0LnZhbHVlPyhrdD1xdC52YWx1ZSxJdD0hMCk6a3Q8RHQudmFsdWUmJihrdD1EdC52YWx1ZSxJdD0hMCkse3g6TmUseTprdCxvdXRPZkJvdW5kczpJdH19ZnVuY3Rpb24gR2EoKXtMbi54PXpuLmxlZnQtSi5sZWZ0LnZhbHVlLExuLnk9em4udG9wLUoudG9wLnZhbHVlfWZ1bmN0aW9uIFlhKE5lKXtOZT1OZXx8enQsTmU9RW8oTmUpLHl0LnZhbHVlPXpuLmhlaWdodC96dCxqdC52YWx1ZT16bi53aWR0aC96dDtsZXQga3Q9eXQudmFsdWUqTmUsSXQ9anQudmFsdWUqTmU7SnQueD0oSXQtanQudmFsdWUpLzIsSnQueT0oa3QteXQudmFsdWUpLzJ9ZnVuY3Rpb24gTG8oKXtsZXQgTmU9MC1Mbi54K0p0Lngsa3Q9Si53aWR0aC52YWx1ZS1qdC52YWx1ZS1Mbi54LUp0Lng7SGUudmFsdWU9TWF0aC5taW4oTmUsa3QpLHZuLnZhbHVlPU1hdGgubWF4KE5lLGt0KTtsZXQgSXQ9MC1Mbi55K0p0LnksT249Si5oZWlnaHQudmFsdWUteXQudmFsdWUtTG4ueS1KdC55O0R0LnZhbHVlPU1hdGgubWluKEl0LE9uKSxxdC52YWx1ZT1NYXRoLm1heChJdCxPbil9ZnVuY3Rpb24gVWkoTmUsa3Qpe2lmKHYuc2NhbGUpe05lPUVvKE5lKSxZYShOZSksTG8oKTtsZXQgSXQ9SnIoJHQsWnQpLE9uPUl0LngsQXI9SXQueTtrdD95byhPbixBcixOZSwiIiwhMCwhMCk6d2koZnVuY3Rpb24oKXtEbyhPbixBcixOZSwiIiwhMCwhMCl9KX19ZnVuY3Rpb24gRW8oTmUpe3JldHVybiBOZT1NYXRoLm1heCguNSx0YS52YWx1ZSxOZSksTmU9TWF0aC5taW4oMTAsY3MudmFsdWUsTmUpLE5lfWZ1bmN0aW9uIHlvKE5lLGt0LEl0LE9uLEFyLFBpKXtUaSgpLGxuLnZhbHVlfHwoTmU9JHQpLHluLnZhbHVlfHwoa3Q9WnQpLHYuc2NhbGV8fChJdD16dCk7bGV0IGVvPUpyKE5lLGt0KTtpZihOZT1lby54LGt0PWVvLnksIXYuYW5pbWF0aW9uKXtEbyhOZSxrdCxJdCxPbixBcixQaSk7cmV0dXJufVluLl9zcHJpbmdYLl9zb2x1dGlvbj1udWxsLFluLl9zcHJpbmdZLl9zb2x1dGlvbj1udWxsLFluLl9zcHJpbmdTY2FsZS5fc29sdXRpb249bnVsbCxZbi5fc3ByaW5nWC5fZW5kUG9zaXRpb249JHQsWW4uX3NwcmluZ1kuX2VuZFBvc2l0aW9uPVp0LFluLl9zcHJpbmdTY2FsZS5fZW5kUG9zaXRpb249enQsWW4uc2V0RW5kKE5lLGt0LEl0LDEpLGR0PXhyKFluLGZ1bmN0aW9uKCl7bGV0IEZvPVluLngoKSxOYT1Gby54LHJhPUZvLnksZ3M9Rm8uc2NhbGU7RG8oTmEscmEsZ3MsT24sQXIsUGkpfSxmdW5jdGlvbigpe2R0LmNhbmNlbCgpfSl9ZnVuY3Rpb24gZHMoTmUpe2xldCBrdD1KcigkdCxadCksSXQ9a3QueCxPbj1rdC55LEFyPWt0Lm91dE9mQm91bmRzO3JldHVybiBBciYmeW8oSXQsT24senQsTmUpLEFyfWZ1bmN0aW9uIERvKE5lLGt0LEl0LE9uPSIiLEFyLFBpKXtOZSE9PW51bGwmJk5lLnRvU3RyaW5nKCkhPT0iTmFOIiYmdHlwZW9mIE5lPT0ibnVtYmVyInx8KE5lPSR0fHwwKSxrdCE9PW51bGwmJmt0LnRvU3RyaW5nKCkhPT0iTmFOIiYmdHlwZW9mIGt0PT0ibnVtYmVyInx8KGt0PVp0fHwwKSxOZT1OdW1iZXIoTmUudG9GaXhlZCgxKSksa3Q9TnVtYmVyKGt0LnRvRml4ZWQoMSkpLEl0PU51bWJlcihJdC50b0ZpeGVkKDEpKSwkdD09PU5lJiZadD09PWt0fHxBcnx8eCgiY2hhbmdlIix7eDp0aShOZSxKdC54KSx5OnRpKGt0LEp0LnkpLHNvdXJjZTpPbn0pLHYuc2NhbGV8fChJdD16dCksSXQ9RW8oSXQpLEl0PStJdC50b0ZpeGVkKDMpLFBpJiZJdCE9PXp0JiZ4KCJzY2FsZSIse3g6TmUseTprdCxzY2FsZTpJdH0pO2xldCBlbz1gdHJhbnNsYXRlKCR7TmV9cHgsICR7a3R9cHgpIHNjYWxlKCR7SXR9KWA7TXIudHJhbnNpdGlvbigkLnZhbHVlLHtzdHlsZXM6e3RyYW5zZm9ybTplb30sZHVyYXRpb246MCxkZWxheTowfSksJHQ9TmUsWnQ9a3QsenQ9SXR9ZnVuY3Rpb24geHMoKXtyZXR1cm4geG4oJC52YWx1ZSkudGhlbihOZT0+e3puPU5lfSl9ZnVuY3Rpb24gaHMoKXtpZighWi52YWx1ZSlyZXR1cm47VGkoKTtsZXQgTmU9di5zY2FsZT9wdC52YWx1ZToxO0dhKCksWWEoTmUpLExvKCksJHQ9d2UudmFsdWUrSnQueCxadD1sdC52YWx1ZStKdC55O2xldCBrdD1KcigkdCxadCksSXQ9a3QueCxPbj1rdC55O0RvKEl0LE9uLE5lLCIiLCEwKX1yZXR1cm4gUC5vbk1vdW50ZWQoKCk9PntoZT1jaShrdD0+e3N3aXRjaChrdC5kZXRhaWwuc3RhdGUpe2Nhc2Uic3RhcnQiOnVvKCk7YnJlYWs7Y2FzZSJtb3ZlIjpXYShrdCk7YnJlYWs7Y2FzZSJlbmQiOmZzKCl9fSksZigoKT0+e3hzKCkudGhlbigoKT0+e2hzKCl9KX0sMTAwKSxabi5yZWNvbmZpZ3VyZSgxLHFyLnZhbHVlKSxZbi5yZWNvbmZpZ3VyZSgxLDkqTWF0aC5wb3coQ3IudmFsdWUsMikvNDAsQ3IudmFsdWUpO2xldCBOZT17c2V0UGFyZW50OmhzfTtlZShOZSksUC5vblVubW91bnRlZCgoKT0+e2NlKE5lKX0pfSksUC5vblVubW91bnRlZCgoKT0+e1RpKCl9KSwoKT0+e1UoaGUpfX1sZXQgZmk9MTYsUHI9e2FjdGl2ZUNvbG9yOlJuLlBSSU1BUllfQ09MT1IsYmFja2dyb3VuZENvbG9yOiIjRUJFQkVCIixhY3RpdmVNb2RlOiJiYWNrd2FyZHMifSxMdD17cGVyY2VudDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowLHZhbGlkYXRvcih2KXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdCh2KSl9fSxmb250U2l6ZTp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmaX0sc2hvd0luZm86e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxzdHJva2VXaWR0aDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo2LHZhbGlkYXRvcih2KXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdCh2KSl9fSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpQci5hY3RpdmVDb2xvcn0sYWN0aXZlQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6UHIuYWN0aXZlQ29sb3J9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpQci5iYWNrZ3JvdW5kQ29sb3J9LGFjdGl2ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGFjdGl2ZU1vZGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6UHIuYWN0aXZlTW9kZX0sZHVyYXRpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MzAsdmFsaWRhdG9yKHYpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KHYpKX19LGJvcmRlclJhZGl1czp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfX0sRWU9W3sidW5pLXByb2dyZXNzIjp7IiI6e2ZsZXg6MSxmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciJ9fSwidW5pLXByb2dyZXNzLWJhciI6eyIiOntmbGV4OjF9fSwidW5pLXByb2dyZXNzLWlubmVyLWJhciI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUifX0sInVuaS1wcm9ncmVzcy1pbmZvIjp7IiI6e21hcmdpbkxlZnQ6IjE1cHgifX19XSxuaT1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUHJvZ3Jlc3MiLHByb3BzOkx0LHN0eWxlczpFZSxlbWl0czpbImFjdGl2ZWVuZCJdLHNldHVwKHYse2VtaXQ6eH0pe2xldCAkPVAucmVmKG51bGwpLFU9UC5yZWYobnVsbCksWj1mcigkLHgpLEo9R2kodik7cmV0dXJuIFAud2F0Y2goKCk9PkoucmVhbFBlcmNlbnQsKGVlLGNlKT0+e0oubGFzdFBlcmNlbnQ9Y2V8fDAsS3QoSix2LFopfSksUC5vbk1vdW50ZWQoKCk9PntmKCgpPT57eG4oVS52YWx1ZSkudGhlbigoe3dpZHRoOmVlfSk9PntKLnByb2dyZXNzV2lkdGg9ZWV8fDAsS3QoSix2LFopfSl9LDUwKX0pLCgpPT57bGV0e3Nob3dJbmZvOmVlLGZvbnRTaXplOmNlfT12LHtvdXRlckJhclN0eWxlOmhlLGlubmVyQmFyU3R5bGU6VGUsY3VycmVudFBlcmNlbnQ6ZmV9PUo7cmV0dXJuIFAuY3JlYXRlVk5vZGUoImRpdiIse3JlZjokLGNsYXNzOiJ1bmktcHJvZ3Jlc3MifSxbUC5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOlUsc3R5bGU6aGUsY2xhc3M6InVuaS1wcm9ncmVzcy1iYXIifSxbUC5jcmVhdGVWTm9kZSgiZGl2Iix7c3R5bGU6VGUsY2xhc3M6InVuaS1wcm9ncmVzcy1pbm5lci1iYXIifSxudWxsKV0pLGVlP1huKGZlKyIlIix7Y2xhc3M6InVuaS1wcm9ncmVzcy1pbmZvIixzdHlsZTp7Zm9udFNpemU6Y2V9fSk6bnVsbF0pfX19KTtmdW5jdGlvbiBHaSh2KXtsZXQgeD1QLnJlZigwKSwkPVAucmVmKDApLFU9UC5jb21wdXRlZCgoKT0+KHtiYWNrZ3JvdW5kQ29sb3I6di5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyUmFkaXVzOnYuYm9yZGVyUmFkaXVzLGhlaWdodDp2LnN0cm9rZVdpZHRofSkpLFo9UC5jb21wdXRlZCgoKT0+e2xldCBjZT12LmNvbG9yIT09UHIuYWN0aXZlQ29sb3ImJnYuYWN0aXZlQ29sb3I9PT1Qci5hY3RpdmVDb2xvcj92LmNvbG9yOnYuYWN0aXZlQ29sb3I7cmV0dXJue3dpZHRoOngudmFsdWUqJC52YWx1ZS8xMDAsaGVpZ2h0OnYuc3Ryb2tlV2lkdGgsYmFja2dyb3VuZENvbG9yOmNlLGJvcmRlclJhZGl1czp2LmJvcmRlclJhZGl1c319KSxKPVAuY29tcHV0ZWQoKCk9PntsZXQgY2U9cGFyc2VGbG9hdCh2LnBlcmNlbnQpO3JldHVybiBjZTwwJiYoY2U9MCksY2U+MTAwJiYoY2U9MTAwKSxjZX0pO3JldHVybiBQLnJlYWN0aXZlKHtvdXRlckJhclN0eWxlOlUsaW5uZXJCYXJTdHlsZTpaLHJlYWxQZXJjZW50OkosY3VycmVudFBlcmNlbnQ6eCxzdHJva2VUaW1lcjowLGxhc3RQZXJjZW50OjAscHJvZ3Jlc3NXaWR0aDokfSl9ZnVuY3Rpb24gS3Qodix4LCQpe3Yuc3Ryb2tlVGltZXImJmNsZWFySW50ZXJ2YWwodi5zdHJva2VUaW1lcikseC5hY3RpdmU/KHYuY3VycmVudFBlcmNlbnQ9eC5hY3RpdmVNb2RlPT09UHIuYWN0aXZlTW9kZT8wOnYubGFzdFBlcmNlbnQsdi5zdHJva2VUaW1lcj1zZXRJbnRlcnZhbCgoKT0+e3YuY3VycmVudFBlcmNlbnQrMT52LnJlYWxQZXJjZW50Pyh2LmN1cnJlbnRQZXJjZW50PXYucmVhbFBlcmNlbnQsdi5zdHJva2VUaW1lciYmY2xlYXJJbnRlcnZhbCh2LnN0cm9rZVRpbWVyKSwkKCJhY3RpdmVlbmQiLHt9KSk6di5jdXJyZW50UGVyY2VudCs9MX0scGFyc2VGbG9hdCh4LmR1cmF0aW9uKSkpOnYuY3VycmVudFBlcmNlbnQ9di5yZWFsUGVyY2VudH1sZXQganI9e3ZhbHVlOnt0eXBlOkFycmF5LGRlZmF1bHQoKXtyZXR1cm5bXX0sdmFsaWRhdG9yOmZ1bmN0aW9uKHYpe3JldHVybiBDdC5pc0FycmF5KHYpJiZ2LmZpbHRlcih4PT50eXBlb2YgeD09Im51bWJlciIpLmxlbmd0aD09PXYubGVuZ3RofX0saW5kaWNhdG9yU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGluZGljYXRvckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxtYXNrU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1hc2tDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LHpyPUN0LmV4dGVuZCh7fSxqcix7aGVpZ2h0Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1hc2tUb3BTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza0JvdHRvbVN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0pLExyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJQaWNrZXJWaWV3Iixwcm9wczp6cixlbWl0czpbImNoYW5nZSIsInVwZGF0ZTp2YWx1ZSJdLHNldHVwKHYse3Nsb3RzOngsZW1pdDokfSl7bGV0IFU9UC5yZWYobnVsbCksWj1Ecih2KSxKPWZyKFUsJCksZWU9W10sY2U9VGU9PkFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZWUuZmlsdGVyKGZlPT5mZS50eXBlIT09UC5Db21tZW50KSxUZSksaGU9VGU9PlAuY29tcHV0ZWQoe2dldCgpe2xldCBmZT1jZShUZS52bm9kZSk7cmV0dXJuIFoudmFsdWVbZmVdfHwwfSxzZXQoZmUpe2lmKCFUZS5kYXRhLl9pc01vdW50ZWQpcmV0dXJuO2xldCB3ZT1jZShUZS52bm9kZSk7aWYod2U8MClyZXR1cm47aWYoWi52YWx1ZVt3ZV0hPT1mZSl7Wi52YWx1ZVt3ZV09ZmU7bGV0IHB0PVoudmFsdWUubWFwKGp0PT5qdCk7JCgidXBkYXRlOnZhbHVlIixwdCksSigiY2hhbmdlIix7dmFsdWU6cHR9KX19fSk7cmV0dXJuIFAucHJvdmlkZSgiZ2V0UGlja2VyVmlld0NvbHVtbiIsaGUpLFAucHJvdmlkZSgicGlja2VyVmlld1Byb3BzIix2KSwoKT0+e2xldCBUZT14LmRlZmF1bHQmJnguZGVmYXVsdCgpO2VlPWxpKFRlKTtsZXQgZmU9di5oZWlnaHQ/e2hlaWdodDpgJHtwYXJzZUZsb2F0KHYuaGVpZ2h0KX1weGB9Ont9O3JldHVybiBQLmNyZWF0ZVZOb2RlKCJ2aWV3IixQLm1lcmdlUHJvcHMoe3JlZjpVLGNsYXNzOiJ1bmktcGlja2VyLXZpZXciLHN0eWxlOmZlfSx7cHJldmVudEdlc3R1cmU6ITB9KSxbUC5jcmVhdGVWTm9kZSgidmlldyIse2NsYXNzOiJ1bmktcGlja2VyLXZpZXctd3JhcHBlciJ9LFtlZV0pXSl9fSxzdHlsZXM6W3sidW5pLXBpY2tlci12aWV3Ijp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9fSwidW5pLXBpY2tlci12aWV3LXdyYXBwZXIiOnsiIjp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoicm93Iixwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLG92ZXJmbG93OiJoaWRkZW4ifX19XX0pO2Z1bmN0aW9uIERyKHYpe2xldCB4PVAucmVhY3RpdmUoWy4uLnYudmFsdWVdKSwkPVAucmVhY3RpdmUoe3ZhbHVlOnh9KTtyZXR1cm4gUC53YXRjaCgoKT0+di52YWx1ZSxVPT57JC52YWx1ZS5sZW5ndGg9VS5sZW5ndGgsUC5uZXh0VGljaygoKT0+e1UuZm9yRWFjaCgoWixKKT0+e1ohPT0kLnZhbHVlW0pdJiYkLnZhbHVlLnNwbGljZShKLDEsWil9KX0pfSksJH1sZXQgQmk9eS5yZXF1aXJlTW9kdWxlKCJkb20iKSxCbj15LmNvbmZpZy5lbnYucGxhdGZvcm0udG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIjtmdW5jdGlvbiBkaSh2KXtyZXR1cm4gQ3QuZXh0ZW5kKHt9LEN0LmlzU3RyaW5nKHYpP09vKHYpOnYpfWxldCBkYT17bGVuZ3RoOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9fSxNaT1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUGlja2VyVmlld0NvbHVtbiIscHJvcHM6ZGEsZGF0YTooKT0+KHtfaXNNb3VudGVkOiExfSksc2V0dXAodix7c2xvdHM6eH0pe2xldCAkPVAuZ2V0Q3VycmVudEluc3RhbmNlKCksVT1QLnJlZihudWxsKSxaPVAucmVmKG51bGwpLEo9UC5yZWYobnVsbCksZWU9UC5yZWYobnVsbCksY2U9UC5pbmplY3QoInBpY2tlclZpZXdQcm9wcyIpLFRlPVAuaW5qZWN0KCJnZXRQaWNrZXJWaWV3Q29sdW1uIikoJCksZmU9UC5jb21wdXRlZCgoKT0+ZGkoY2UuaW5kaWNhdG9yU3R5bGUpKSx3ZT1QLmNvbXB1dGVkKCgpPT5kaShjZS5tYXNrVG9wU3R5bGUpKSxsdD1QLmNvbXB1dGVkKCgpPT5kaShjZS5tYXNrQm90dG9tU3R5bGUpKSxwdD1QLnJlZigwKTtwdC52YWx1ZT1MaShmZS52YWx1ZSk7bGV0IGp0PVAucmVmKDApO2p0LnZhbHVlPXBhcnNlRmxvYXQoY2UuaGVpZ2h0KTtsZXR7c2V0Q3VycmVudDp5dCxvblNjcm9sbGVuZDpIZX09SW8odixUZSxaLHB0KSxEdD0oKT0+e2xldCBxdCxkdDtmKCgpPT57UHJvbWlzZS5hbGwoW3huKFUudmFsdWUpLnRoZW4oKHtoZWlnaHQ6cm59KT0+e3F0PWp0LnZhbHVlPXJufSksQm4mJnYubGVuZ3RoP3huKEoudmFsdWUpLnRoZW4oKHtoZWlnaHQ6cm59KT0+e2R0PXB0LnZhbHVlPXJuL3BhcnNlRmxvYXQodi5sZW5ndGgpfSk6eG4oZWUudmFsdWUpLnRoZW4oKHtoZWlnaHQ6cm59KT0+e2R0PXB0LnZhbHVlPXJufSldKS50aGVuKCgpPT57cXQmJmR0P2YoKCk9PnskLmRhdGEuX2lzTW91bnRlZD0hMCx5dChUZS52YWx1ZSwhMSwhMCl9LDUwKTpEdCgpfSl9LDUwKX07UC5vbk1vdW50ZWQoRHQpO2xldCB2bj1xdD0+cXQ/Qm4/UC5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOkosc3R5bGU6ImZsZXgtZGlyZWN0aW9uOmNvbHVtbjsifSxbcXRdKTpxdDpudWxsO3JldHVybigpPT57bGV0IHF0PXguZGVmYXVsdCYmeC5kZWZhdWx0KCksZHQ9KGp0LnZhbHVlLXB0LnZhbHVlKS8yLHJuPWAke2p0LnZhbHVlLWR0fXB4YCxMbj17c2hvd1Njcm9sbGJhcjohMSxzY3JvbGxUb0JlZ2luOiExLGRlY2VsZXJhdGlvblJhdGU6LjMsc2Nyb2xsWTohMH07cmV0dXJuIEJufHwoTG4uc2Nyb2xsVG9wPVRlLnZhbHVlKnB0LnZhbHVlKSxQLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7cmVmOlUsY2xhc3M6InVuaS1waWNrZXItdmlldy1jb2x1bW4ifSxbUC5jcmVhdGVWTm9kZSgic2Nyb2xsLXZpZXciLFAubWVyZ2VQcm9wcyh7Y2xhc3M6InVuaS1waWNrZXItdmlldy1ncm91cCIsc3R5bGU6ImZsZXgtZGlyZWN0aW9uOmNvbHVtbjsiLG9uU2Nyb2xsZW5kOkhlfSxMbiksW1AuY3JlYXRlVk5vZGUoInZpZXciLHtyZWY6WixjbGFzczoidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiLHN0eWxlOntwYWRkaW5nVG9wOmAke2R0fXB4YCxwYWRkaW5nQm90dG9tOmAke2R0fXB4YH19LFt2bihxdCldKV0pLFAuY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtjbGFzczoidW5pLXBpY2tlci12aWV3LW1hc2sifSxbUC5jcmVhdGVWTm9kZSgidS1zY2FsYWJsZSIse2NsYXNzOiJ1bmktcGlja2VyLXZpZXctbWFzayB1bmktcGlja2VyLXZpZXctbWFzay10b3AiLHN0eWxlOkN0LmV4dGVuZCh7fSx3ZS52YWx1ZSx7Ym90dG9tOnJufSl9LG51bGwpLFAuY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtjbGFzczoidW5pLXBpY2tlci12aWV3LW1hc2sgdW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIixzdHlsZTpDdC5leHRlbmQoe30sbHQudmFsdWUse3RvcDpybn0pfSxudWxsKV0pLFAuY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtyZWY6ZWUsY2xhc3M6InVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiLHN0eWxlOkN0LmV4dGVuZCh7fSxmZS52YWx1ZSx7dG9wOmAke2R0fXB4YH0pfSxudWxsKV0pfX0sc3R5bGVzOlt7InVuaS1waWNrZXItdmlldy1jb2x1bW4iOnsiIjp7ZmxleDoxLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYWxpZ25JdGVtczoic3RyZXRjaCIsb3ZlcmZsb3c6ImhpZGRlbiJ9fSwidW5pLXBpY2tlci12aWV3LW1hc2siOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxwb2ludGVyRXZlbnRzOiJub25lIn19LCJ1bmktcGlja2VyLXZpZXctbWFzay10b3AiOnsiIjp7Ym90dG9tOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9fSwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIjp7IiI6e3RvcDowLGJhY2tncm91bmRJbWFnZToibGluZWFyLWdyYWRpZW50KHRvIHRvcCxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkifX0sInVuaS1waWNrZXItdmlldy1ncm91cCI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowfX0sInVuaS1waWNrZXItdmlldy1jb250ZW50Ijp7IiI6e2ZsZXhEaXJlY3Rpb246ImNvbHVtbiIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDowLHBhZGRpbmdCb3R0b206MCxwYWRkaW5nTGVmdDowfX0sInVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCx0b3A6MCxoZWlnaHQ6IjM0cHgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGJvcmRlckNvbG9yOiIjZTVlNWU1Iixib3JkZXJUb3BXaWR0aDoiMXB4Iixib3JkZXJCb3R0b21XaWR0aDoiMXB4In19fV19KTtmdW5jdGlvbiBMaSh2KXtsZXQgJD0odi5oZWlnaHR8fHYubGluZUhlaWdodHx8IiIpLm1hdGNoKC8oLT9bXGRcLl0rKXB4LyksVT0wO3JldHVybiAkJiYoVT1wYXJzZUZsb2F0KCRbMV0pKSxVfWZ1bmN0aW9uIElvKHYseCwkLFUpe2xldCBaO2Z1bmN0aW9uIEooaGUsVGU9ITApe0JpLnNjcm9sbFRvRWxlbWVudCgkLnZhbHVlLHtvZmZzZXQ6aGUqVS52YWx1ZSxhbmltYXRlZDpUZX0pLFRlJiYoWj1EYXRlLm5vdygpKX1QLndhdGNoKCgpPT52Lmxlbmd0aCwoKT0+e2YoKCk9PntlZSh4LnZhbHVlLCEwLCEwKX0sMTUwKX0pLFAud2F0Y2goeCxoZT0+SihoZSkpO2xldCBlZT0oaGUsVGU9ITAsZmUpPT57eC52YWx1ZT09PWhlJiYhZmV8fCh4LnZhbHVlPWhlLEJuJiZKKGhlLFRlKSl9O3JldHVybntzZXRDdXJyZW50OmVlLG9uU2Nyb2xsZW5kOmhlPT57aWYoRGF0ZS5ub3coKS1aPDM0MClyZXR1cm47bGV0IFRlPWhlLmRldGFpbC5jb250ZW50T2Zmc2V0LnksZmU9TWF0aC5yb3VuZChUZS9VLnZhbHVlKTtUZSVVLnZhbHVlP2VlKGZlLCEwLCEwKTp4LnZhbHVlPWZlfX19bGV0IEFuPXtTRUxFQ1RPUjoic2VsZWN0b3IiLE1VTFRJU0VMRUNUT1I6Im11bHRpU2VsZWN0b3IiLFRJTUU6InRpbWUiLERBVEU6ImRhdGUifSxEaT17WUVBUjoieWVhciIsTU9OVEg6Im1vbnRoIixEQVk6ImRheSJ9O2Z1bmN0aW9uIFlpKHYpe3JldHVybiB2Pjk/djpgMCR7dn1gfWZ1bmN0aW9uIENpKHYseCl7dj1TdHJpbmcodnx8IiIpO2xldCAkPW5ldyBEYXRlO2lmKHg9PT1Bbi5USU1FKXtsZXQgVT12LnNwbGl0KCI6Iik7VS5sZW5ndGg9PT0yJiYkLnNldEhvdXJzKHBhcnNlSW50KFVbMF0pLHBhcnNlSW50KFVbMV0pKX1lbHNle2xldCBVPXYuc3BsaXQoIi0iKTtVLmxlbmd0aD09PTMmJiQuc2V0RnVsbFllYXIocGFyc2VJbnQoVVswXSkscGFyc2VJbnQoU3RyaW5nKHBhcnNlRmxvYXQoVVsxXSktMSkpLHBhcnNlSW50KFVbMl0pKX1yZXR1cm4gJH1mdW5jdGlvbiBGaSh2KXtpZih2Lm1vZGU9PT1Bbi5USU1FKXJldHVybiIwMDowMCI7aWYodi5tb2RlPT09QW4uREFURSl7bGV0IHg9bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLTEwMDtzd2l0Y2godi5maWVsZHMpe2Nhc2UgRGkuWUVBUjpyZXR1cm4geDtjYXNlIERpLk1PTlRIOnJldHVybiB4KyItMDEiO2RlZmF1bHQ6cmV0dXJuIHgrIi0wMS0wMSJ9fXJldHVybiIifWZ1bmN0aW9uIElyKHYpe2lmKHYubW9kZT09PUFuLlRJTUUpcmV0dXJuIjIzOjU5IjtpZih2Lm1vZGU9PT1Bbi5EQVRFKXtsZXQgeD1uZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkrMTAwO3N3aXRjaCh2LmZpZWxkcyl7Y2FzZSBEaS5ZRUFSOnJldHVybiB4O2Nhc2UgRGkuTU9OVEg6cmV0dXJuIHgrIi0xMiI7ZGVmYXVsdDpyZXR1cm4geCsiLTEyLTMxIn19cmV0dXJuIiJ9bGV0IHJpPXtuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxyYW5nZTp7dHlwZTpBcnJheSxkZWZhdWx0KCl7cmV0dXJuW119fSxyYW5nZUtleTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmcsQXJyYXldLGRlZmF1bHQ6MH0sbW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpBbi5TRUxFQ1RPUix2YWxpZGF0b3Iodil7cmV0dXJuIE9iamVjdC52YWx1ZXMoQW4pLmluZGV4T2Yodik+PTB9fSxmaWVsZHM6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHN0YXJ0Ont0eXBlOlN0cmluZyxkZWZhdWx0OkZpfSxlbmQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6SXJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LHJyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJQaWNrZXIiLHByb3BzOnJpLGVtaXRzOlsiY2hhbmdlIiwiY2FuY2VsIiwiY29sdW1uY2hhbmdlIl0sc2V0dXAodix7c2xvdHM6eCxlbWl0OiR9KXtsZXQgVT1QLnJlZihudWxsKSxaPWZyKFUsJCksSj1QLnJlZihudWxsKSxlZT1QLnJlZihudWxsKSxjZT0oKT0+e2xldCB5dD12LnZhbHVlO3N3aXRjaCh2Lm1vZGUpe2Nhc2UgQW4uTVVMVElTRUxFQ1RPUjp7Q3QuaXNBcnJheSh5dCl8fCh5dD1bXSksQ3QuaXNBcnJheShKLnZhbHVlKXx8KEoudmFsdWU9W10pO2xldCBIZT1KLnZhbHVlLmxlbmd0aD1NYXRoLm1heCh5dC5sZW5ndGgsdi5yYW5nZS5sZW5ndGgpO2ZvcihsZXQgRHQ9MDtEdDxIZTtEdCsrKXtsZXQgdm49TnVtYmVyKHl0W0R0XSkscXQ9TnVtYmVyKEoudmFsdWVbRHRdKSxkdD1pc05hTih2bik/aXNOYU4ocXQpPzA6cXQ6dm47Si52YWx1ZS5zcGxpY2UoRHQsMSxkdDwwPzA6ZHQpfX1icmVhaztjYXNlIEFuLlRJTUU6Y2FzZSBBbi5EQVRFOkoudmFsdWU9U3RyaW5nKHl0KTticmVhaztkZWZhdWx0OntsZXQgSGU9TnVtYmVyKHl0KTtKLnZhbHVlPUhlPDA/MDpIZTticmVha319fSxoZT15dD0+e2VlLnZhbHVlJiZlZS52YWx1ZS5zZW5kTWVzc2FnZSh5dCl9LFRlPXl0PT57bGV0IEhlPXtldmVudDoiY2FuY2VsIn07ZWUudmFsdWU9dW4oe3VybDoiX191bmlhcHBwaWNrZXIiLGRhdGE6eXQsc3R5bGU6e3RpdGxlTlZpZXc6ITEsYW5pbWF0aW9uVHlwZToibm9uZSIsYW5pbWF0aW9uRHVyYXRpb246MCxiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDApIixwb3BHZXN0dXJlOiJub25lIn0sb25NZXNzYWdlOkR0PT57bGV0IHZuPUR0LmV2ZW50O2lmKHZuPT09ImNyZWF0ZWQiKXtoZSh5dCk7cmV0dXJufWlmKHZuPT09ImNvbHVtbmNoYW5nZSIpe2RlbGV0ZSBEdC5ldmVudCxaKHZuLER0KTtyZXR1cm59SGU9RHR9LG9uQ2xvc2U6KCk9PntlZS52YWx1ZT1udWxsO2xldCBEdD1IZS5ldmVudDtkZWxldGUgSGUuZXZlbnQsRHQmJlooRHQsSGUpfX0pfSxmZT15dD0+e2gubmF0aXZlVUlbdi5tb2RlPT09QW4uVElNRT8icGlja1RpbWUiOiJwaWNrRGF0ZSJdKEhlPT57bGV0IER0PUhlLmRhdGU7WigiY2hhbmdlIix7dmFsdWU6di5tb2RlPT09QW4uVElNRT9gJHtZaShEdC5nZXRIb3VycygpKX06JHtZaShEdC5nZXRNaW51dGVzKCkpfWA6YCR7RHQuZ2V0RnVsbFllYXIoKX0tJHtZaShEdC5nZXRNb250aCgpKzEpfS0ke1lpKER0LmdldERhdGUoKSl9YH0pfSwoKT0+e1ooImNhbmNlbCIse30pfSx2Lm1vZGU9PT1Bbi5USU1FP3t0aW1lOkNpKHYudmFsdWUsQW4uVElNRSl9OntkYXRlOkNpKHYudmFsdWUsQW4uREFURSksbWluRGF0ZTpDaSh2LnN0YXJ0LEFuLkRBVEUpLG1heERhdGU6Q2kodi5lbmQsQW4uREFURSl9KX0sd2U9eXQ9PnsoeXQubW9kZT09PUFuLlRJTUV8fHl0Lm1vZGU9PT1Bbi5EQVRFKSYmIXl0LmZpZWxkcz9mZSgpOih5dC5maWVsZHM9T2JqZWN0LnZhbHVlcyhEaSkuaW5jbHVkZXMoeXQuZmllbGRzKT95dC5maWVsZHM6RGkuREFZLFRlKHl0KSl9LGx0PXl0PT57di5kaXNhYmxlZHx8d2UoQ3QuZXh0ZW5kKHt9LHYse3ZhbHVlOkoudmFsdWUsbG9jYWxlOnAuZ2V0TG9jYWxlKCl9KSl9LHB0PVAuaW5qZWN0KFJyLCExKSxqdD17c3VibWl0OigpPT5bdi5uYW1lLEoudmFsdWVdLHJlc2V0OigpPT57c3dpdGNoKHYubW9kZSl7Y2FzZSBBbi5TRUxFQ1RPUjpKLnZhbHVlPTA7YnJlYWs7Y2FzZSBBbi5NVUxUSVNFTEVDVE9SOkN0LmlzQXJyYXkodi52YWx1ZSkmJihKLnZhbHVlPXYudmFsdWUubWFwKHl0PT4wKSk7YnJlYWs7Y2FzZSBBbi5EQVRFOmNhc2UgQW4uVElNRTpKLnZhbHVlPSIiO2JyZWFrfX19O3JldHVybiBwdCYmKHB0LmFkZEZpZWxkKGp0KSxQLm9uQmVmb3JlVW5tb3VudCgoKT0+cHQucmVtb3ZlRmllbGQoanQpKSksT2JqZWN0LmtleXModikuZm9yRWFjaCh5dD0+e1Aud2F0Y2goKCk9PnZbeXRdLEhlPT57bGV0IER0PXt9O0R0W3l0XT1IZSxoZShEdCl9LHtkZWVwOiEwfSl9KSxQLndhdGNoKCgpPT52LnZhbHVlLGNlLHtkZWVwOiEwfSksY2UoKSwoKT0+UC5jcmVhdGVWTm9kZSgidmlldyIse3JlZjpVLG9uQ2xpY2s6bHR9LFt4LmRlZmF1bHQmJnguZGVmYXVsdCgpXSl9fSksY3I9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1pbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxtYXg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MTAwfSx2YWx1ZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxzdGVwOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNlOWU5ZTkifSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNlOWU5ZTkifSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHNlbGVjdGVkQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSxibG9ja0NvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjZmZmZmZmIn0sYmxvY2tTaXplOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjI4fSxzaG93VmFsdWU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0scW49W3sidW5pLXNsaWRlciI6eyIiOntmbGV4OjEsZmxleERpcmVjdGlvbjoiY29sdW1uIn19LCJ1bmktc2xpZGVyLXdyYXBwZXIiOnsiIjp7ZmxleERpcmVjdGlvbjoicm93IixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJjZW50ZXIifX0sInVuaS1zbGlkZXItdGFwLWFyZWEiOnsiIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIiLHBhZGRpbmdUb3A6IjE0IixwYWRkaW5nQm90dG9tOiIxNCJ9fSwidW5pLXNsaWRlci1oYW5kbGUtd3JhcHBlciI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxiYWNrZ3JvdW5kQ29sb3I6IiNlOWU5ZTkiLGhlaWdodDoiMiIsYm9yZGVyUmFkaXVzOiI1IixtYXJnaW5SaWdodDoiMTQiLG1hcmdpbkxlZnQ6IjE0In19LCJ1bmktc2xpZGVyLXRyYWNrIjp7IiI6e2hlaWdodDoiMiIsYm9yZGVyUmFkaXVzOiI2IixiYWNrZ3JvdW5kQ29sb3I6IiMwMDdhZmYifX0sInVuaS1zbGlkZXItdGh1bWIiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjEiLHdpZHRoOiIyOCIsaGVpZ2h0OiIyOCIsYm9yZGVyUmFkaXVzOjUwLGJveFNoYWRvdzoiMCAwIDRweCAjZWJlYmViIn19LCJ1bmktc2xpZGVyLXZhbHVlIjp7IiI6e2NvbG9yOiIjODg4ODg4Iixmb250U2l6ZToiMTYiLHdpZHRoOiIzMCJ9fX1dLGVyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJVU2xpZGVyIixwcm9wczpjcixzdHlsZXM6cW4sc2V0dXAodix7ZW1pdDp4fSl7bGV0ICQ9UC5yZWYobnVsbCksVT1QLnJlZihudWxsKSxaPWZyKCQseCksSj1kcih2KSxlZT1tbyh2LEosWik7cmV0dXJuIF9vKHYsSiksUC53YXRjaCgoKT0+di52YWx1ZSxjZT0+e0ouc2xpZGVyVmFsdWU9TnVtYmVyKGNlKX0pLFAub25Nb3VudGVkKCgpPT57ZigoKT0+e3huKFUudmFsdWUpLnRoZW4oKHt3aWR0aDpjZSxsZWZ0OmhlfSk9PntKLnNsaWRlckxlZnQ9aGUsSi5zbGlkZXJXaWR0aD1jZXx8MCxKLnNsaWRlclZhbHVlPU51bWJlcih2LnZhbHVlKX0pfSwxMDApfSksKCk9PntsZXR7c2hvd1ZhbHVlOmNlfT12LHt0cmFja1RhcFN0eWxlOmhlLHRyYWNrU3R5bGU6VGUsdHJhY2tBY3RpdmVTdHlsZTpmZSx0aHVtYlN0eWxlOndlLHNsaWRlclZhbHVlOmx0fT1KO3JldHVybiBQLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlciIscmVmOiR9LFtQLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlci13cmFwcGVyIn0sW1AuY3JlYXRlVk5vZGUoImRpdiIsUC5tZXJnZVByb3BzKHtjbGFzczoidW5pLXNsaWRlci10YXAtYXJlYSIsc3R5bGU6aGV9LGVlKSxbUC5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXItaGFuZGxlLXdyYXBwZXIiLHN0eWxlOlRlLHJlZjpVfSxbUC5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXItdHJhY2siLHN0eWxlOmZlfSxudWxsKV0pLFAuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyLXRodW1iIixzdHlsZTp3ZX0sbnVsbCldKSxjZT9YbihsdCsiIix7Y2xhc3M6InVuaS1zbGlkZXItdmFsdWUifSk6bnVsbF0pXSl9fX0pO2Z1bmN0aW9uIGRyKHYpe2xldCB4PVAucmVmKDApLCQ9UC5yZWYoMCksVT1QLnJlZigwKSxaPSgpPT52LmJhY2tncm91bmRDb2xvciE9PSIjZTllOWU5Ij92LmJhY2tncm91bmRDb2xvcjp2LmNvbG9yIT09IiMwMDdhZmYiP3YuY29sb3I6IiMwMDdhZmYiLEo9KCk9PnYuYWN0aXZlQ29sb3IhPT0iIzAwN2FmZiI/di5hY3RpdmVDb2xvcjp2LnNlbGVjdGVkQ29sb3IhPT0iI2U5ZTllOSI/di5zZWxlY3RlZENvbG9yOiIjZTllOWU5IixlZT0oKT0+e2xldCBUZT1OdW1iZXIodi5tYXgpLGZlPU51bWJlcih2Lm1pbik7cmV0dXJuKFUudmFsdWUtZmUpLyhUZS1mZSkqJC52YWx1ZX0sY2U9TnVtYmVyKHYuYmxvY2tTaXplKS8yO3JldHVybiBQLnJlYWN0aXZlKHtzbGlkZXJMZWZ0Ongsc2xpZGVyV2lkdGg6JCxzbGlkZXJWYWx1ZTpVLHNsaWRlclRodW1iT2Zmc2V0OmNlLHRyYWNrVGFwU3R5bGU6UC5jb21wdXRlZCgoKT0+KHtwYWRkaW5nVG9wOmNlLHBhZGRpbmdCb3R0b206Y2V9KSksdHJhY2tTdHlsZTpQLmNvbXB1dGVkKCgpPT4oe2JhY2tncm91bmRDb2xvcjpaKCksbWFyZ2luTGVmdDpjZSxtYXJnaW5SaWdodDpjZX0pKSx0cmFja0FjdGl2ZVN0eWxlOlAuY29tcHV0ZWQoKCk9Pih7YmFja2dyb3VuZENvbG9yOkooKSx3aWR0aDplZSgpfSkpLHRodW1iU3R5bGU6UC5jb21wdXRlZCgoKT0+KHt3aWR0aDp2LmJsb2NrU2l6ZSxoZWlnaHQ6di5ibG9ja1NpemUsYmFja2dyb3VuZENvbG9yOnYuYmxvY2tDb2xvcixsZWZ0OmVlKCl9KSl9KX1mdW5jdGlvbiBtbyh2LHgsJCl7bGV0IFU9bnVsbDtmdW5jdGlvbiBaKGNlLGhlKXt2LmRpc2FibGVkfHwoY2U9PT0ibW92ZSI/KEooaGUpLCQoImNoYW5naW5nIix7dmFsdWU6eC5zbGlkZXJWYWx1ZX0pKTpjZT09PSJlbmQiJiYoSihoZSksJCgiY2hhbmdlIix7dmFsdWU6eC5zbGlkZXJWYWx1ZX0pKSl9ZnVuY3Rpb24gSihjZSl7Y2UtPXguc2xpZGVyVGh1bWJPZmZzZXQsY2U8MCYmKGNlPTApLGNlPnguc2xpZGVyV2lkdGgmJihjZT14LnNsaWRlcldpZHRoKTtsZXQgaGU9TnVtYmVyKHYubWF4KSxUZT1OdW1iZXIodi5taW4pLGZlPU51bWJlcih2LnN0ZXApLHdlPWNlL3guc2xpZGVyV2lkdGgqKGhlLVRlKTtmZT4wJiZ3ZT5mZSYmd2UlZmUvZmUhPT0wP3dlLT13ZSVmZTp3ZT1wYXJzZUludCh3ZSsiIikseC5zbGlkZXJWYWx1ZT13ZStUZX1yZXR1cm57b25Ub3VjaHN0YXJ0KGNlKXtjZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT0xJiYhVSYmKFU9Y2UsWigic3RhcnQiLGNlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYKSl9LG9uVG91Y2htb3ZlKGNlKXtjZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT0xJiZVJiZaKCJtb3ZlIixjZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCl9LG9uVG91Y2hlbmQoY2Upe2NlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD09PTEmJlUmJihVPW51bGwsWigiZW5kIixjZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCkpfX19ZnVuY3Rpb24gX28odix4KXtsZXQgJD1QLmluamVjdChSciwhMSksVT17c3VibWl0OigpPT57bGV0IFo9WyIiLG51bGxdO3JldHVybiB2Lm5hbWUmJihaWzBdPXYubmFtZSxaWzFdPXguc2xpZGVyVmFsdWUpLFp9LHJlc2V0OigpPT57eC5zbGlkZXJWYWx1ZT1OdW1iZXIodi52YWx1ZSl9fTskJiYoJC5hZGRGaWVsZChVKSxQLm9uVW5tb3VudGVkKCgpPT57JC5yZW1vdmVGaWVsZChVKX0pKX1sZXQgcWk9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJzd2l0Y2gifSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9fSxKaT17c3dpdGNoOiJzd2l0Y2giLGNoZWNrYm94OiJjaGVja2JveCJ9LFhvPXt3aWR0aDo1MixoZWlnaHQ6MzJ9LFdyPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJTd2l0Y2giLHByb3BzOnFpLGVtaXRzOlsiY2hhbmdlIl0sc2V0dXAodix7ZW1pdDp4fSl7bGV0ICQ9UC5yZWYobnVsbCksVT1QLnJlZih2LmNoZWNrZWQpLFo9eXIodixVKSxKPWZyKCQseCk7UC53YXRjaCgoKT0+di5jaGVja2VkLGNlPT57VS52YWx1ZT1jZX0pO2xldCBlZT0oY2UsaGUpPT57di5kaXNhYmxlZHx8KFUudmFsdWU9Y2UuZGV0YWlsP2NlLmRldGFpbC52YWx1ZTohVS52YWx1ZSxKKCJjaGFuZ2UiLHt2YWx1ZTpVLnZhbHVlfSkpfTtyZXR1cm4gWiYmKFouYWRkSGFuZGxlcihlZSksUC5vbkJlZm9yZVVubW91bnQoKCk9PntaLnJlbW92ZUhhbmRsZXIoZWUpfSkpLGJyKHYseyJsYWJlbC1jbGljayI6ZWV9KSwoKT0+e2xldHtjb2xvcjpjZSx0eXBlOmhlLGRpc2FibGVkOlRlfT12O3JldHVybiBQLmNyZWF0ZVZOb2RlKCJkaXYiLHtyZWY6JH0sW2hlPT09Smkuc3dpdGNoP1AuY3JlYXRlVk5vZGUoImRjLXN3aXRjaCIsUC5tZXJnZVByb3BzKHtkYXRhVW5jVHlwZToidW5pLXN3aXRjaCJ9LHtvbkNoYW5nZTplZX0se2NoZWNrZWQ6VS52YWx1ZSxjb2xvcjpjZSxkaXNhYmxlZDpUZX0se3N0eWxlOlhvfSksbnVsbCk6bnVsbCxoZT09PUppLmNoZWNrYm94P1AuY3JlYXRlVk5vZGUoUC5yZXNvbHZlQ29tcG9uZW50KCJjaGVja2JveCIpLFAubWVyZ2VQcm9wcyh7c3R5bGU6e2NvbG9yOmNlfX0se2NoZWNrZWQ6VS52YWx1ZSxkaXNhYmxlZDpUZX0se29uQ2xpY2s6ZWV9KSxudWxsKTpudWxsXSl9fX0pO2Z1bmN0aW9uIHlyKHYseCl7bGV0ICQ9UC5pbmplY3QoUnIsITEpLFU9UC5pbmplY3QoVm4sITEpLFo9e3N1Ym1pdDooKT0+e2xldCBKPVsiIixudWxsXTtyZXR1cm4gdi5uYW1lJiYoSlswXT12Lm5hbWUsSlsxXT14LnZhbHVlKSxKfSxyZXNldDooKT0+e3gudmFsdWU9ITF9fTtyZXR1cm4gJCYmKCQuYWRkRmllbGQoWiksUC5vblVubW91bnRlZCgoKT0+eyQucmVtb3ZlRmllbGQoWil9KSksVX1sZXQgTm89e2NoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sQj1YcigidWNnIiksWT17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LHJlPVt7InVuaS1jaGVja2JveCI6eyIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciJ9fSwidW5pLWNoZWNrYm94LWlucHV0Ijp7IiI6e2p1c3RpZnlDb250ZW50OiJjZW50ZXIiLGFsaWduSXRlbXM6ImNlbnRlciIscG9zaXRpb246InJlbGF0aXZlIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGJvcmRlclN0eWxlOiJzb2xpZCIsYmFja2dyb3VuZENvbG9yOiIjZmZmZmZmIixib3JkZXJSYWRpdXM6IjMiLHdpZHRoOiIyMiIsaGVpZ2h0OiIyMiJ9fSwidW5pLWljb24iOnsiIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMiLGZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiMiIsbWFyZ2luVG9wOiIyIixjb2xvcjoiIzAwN2FmZiJ9fSwidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSJ9fSwidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkLWJlZm9yZSI6eyIiOntjb2xvcjoiI2FkYWRhZCJ9fSwidW5pLWNoZWNrYm94LXNsb3QiOnsiIjp7Zm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiI1In19fV0seGU9UC5kZWZpbmVDb21wb25lbnQoe25hbWU6IkNoZWNrYm94Iixwcm9wczpObyxzdHlsZXM6cmUsc2V0dXAodix7c2xvdHM6eH0pe2xldCAkPVAucmVmKG51bGwpLFU9UC5yZWYodi5jaGVja2VkKSxaPVAucmVmKHYudmFsdWUpLEo9UC5jb21wdXRlZCgoKT0+di5kaXNhYmxlZD8iI2FkYWRhZCI6di5jb2xvciksZWU9KCk9PntVLnZhbHVlPSExfSxjZT0od2UsbHQpPT57di5kaXNhYmxlZHx8KFUudmFsdWU9IVUudmFsdWUsaGUmJmhlLmNoZWNrYm94Q2hhbmdlKHdlKSl9LHt1bmlDaGVja0dyb3VwOmhlLHVuaUxhYmVsOlRlfT1aZShVLFosZWUpO1RlJiYoVGUuYWRkSGFuZGxlcihjZSksUC5vbkJlZm9yZVVubW91bnQoKCk9PntUZS5yZW1vdmVIYW5kbGVyKGNlKX0pKSxicih2LHsibGFiZWwtY2xpY2siOmNlfSksUC53YXRjaChbKCk9PnYuY2hlY2tlZCwoKT0+di52YWx1ZV0sKFt3ZSxsdF0pPT57VS52YWx1ZT13ZSxaLnZhbHVlPWx0fSk7bGV0IGZlPSgpPT57aWYoIXguZGVmYXVsdClyZXR1cm5bXTtsZXQgd2U9eC5kZWZhdWx0KCk7cmV0dXJuIHdlLmxlbmd0aD09PTEmJndlWzBdLnR5cGU9PT1UZXh0P1tYbih3ZVswXS5jaGlsZHJlbix7Y2xhc3M6InVuaS1jaGVja2JveC1zbG90In0pXTp3ZX07cmV0dXJuKCk9PlAuY3JlYXRlVk5vZGUoImRpdiIsUC5tZXJnZVByb3BzKHtyZWY6JH0se2RhdGFVbmNUeXBlOiJ1bmktY2hlY2tib3gifSx7b25DbGljazpjZSxjbGFzczoidW5pLWNoZWNrYm94In0pLFtQLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczpbInVuaS1jaGVja2JveC1pbnB1dCIseyJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOnYuZGlzYWJsZWR9XX0sW1UudmFsdWU/WG4oIlx1RUEwOCIse2NsYXNzOiJ1bmktaWNvbiIsc3R5bGU6e2NvbG9yOkoudmFsdWV9fSk6bnVsbF0pLC4uLmZlKCldKX19KTtmdW5jdGlvbiBaZSh2LHgsJCl7bGV0IFU9UC5jb21wdXRlZCgoKT0+KHtjaGVja2JveENoZWNrZWQ6Qm9vbGVhbih2LnZhbHVlKSx2YWx1ZTp4LnZhbHVlfSkpLFo9e3Jlc2V0OiR9LEo9UC5pbmplY3QoQiwhMSk7SiYmSi5hZGRGaWVsZChVKTtsZXQgZWU9UC5pbmplY3QoUnIsITEpO2VlJiZlZS5hZGRGaWVsZChaKTtsZXQgY2U9UC5pbmplY3QoVm4sITEpO3JldHVybiBQLm9uQmVmb3JlVW5tb3VudCgoKT0+e0omJkoucmVtb3ZlRmllbGQoVSksZWUmJmVlLnJlbW92ZUZpZWxkKFopfSkse3VuaUNoZWNrR3JvdXA6Six1bmlGb3JtOmVlLHVuaUxhYmVsOmNlfX1sZXQgY3Q9UC5kZWZpbmVDb21wb25lbnQoe25hbWU6IkNoZWNrYm94R3JvdXAiLHByb3BzOlksZW1pdHM6WyJjaGFuZ2UiXSxzZXR1cCh2LHtzbG90czp4LGVtaXQ6JH0pe2xldCBVPVAucmVmKG51bGwpLFo9ZnIoVSwkKTtyZXR1cm4gWXQodixaKSwoKT0+UC5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOlUsY2xhc3M6InVuaS1jaGVja2JveC1ncm91cCJ9LFt4LmRlZmF1bHQmJnguZGVmYXVsdCgpXSl9fSk7ZnVuY3Rpb24gWXQodix4KXtsZXQgJD1bXSxVPSgpPT4kLnJlZHVjZSgoSixlZSk9PihlZS52YWx1ZS5jaGVja2JveENoZWNrZWQmJkoucHVzaChlZS52YWx1ZS52YWx1ZSksSiksbmV3IEFycmF5KTtQLnByb3ZpZGUoQix7YWRkRmllbGQoSil7JC5wdXNoKEopfSxyZW1vdmVGaWVsZChKKXskLnNwbGljZSgkLmluZGV4T2YoSiksMSl9LGNoZWNrYm94Q2hhbmdlKEope3goImNoYW5nZSIse3ZhbHVlOlUoKX0pfX0pO2xldCBaPVAuaW5qZWN0KFJyLCExKTtyZXR1cm4gWiYmWi5hZGRGaWVsZCh7c3VibWl0OigpPT57bGV0IEo9WyIiLG51bGxdO3JldHVybiB2Lm5hbWUhPT0iIiYmKEpbMF09di5uYW1lLEpbMV09VSgpKSxKfX0pLFV9bGV0IFF0PXtjaGVja2VkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSx2YWx1ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LFZpPVhyKCJ1Y2ciKSxHcj17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGd0PVt7InVuaS1yYWRpbyI6eyIiOnthbGlnbkl0ZW1zOiJjZW50ZXIiLGZsZXhEaXJlY3Rpb246InJvdyJ9fSwidW5pLXJhZGlvLWlucHV0Ijp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixtYXJnaW5SaWdodDoiNSIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGJvcmRlclJhZGl1czo1MCx3aWR0aDoiMjIiLGhlaWdodDoiMjIiLG91dGxpbmU6MH19LCJ1bmktcmFkaW8taW5wdXQtaWNvbiI6eyIiOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyIsZm9udFNpemU6IjE0Iixjb2xvcjoiI2ZmZmZmZiJ9fSwidW5pLXJhZGlvLWlucHV0LWRpc2FibGVkIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGNvbG9yOiIjYWRhZGFkIn19LCJ1bmktcmFkaW8tc2xvdCI6eyIiOntmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjUifX19XSxSdD1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUmFkaW8iLHByb3BzOlF0LHN0eWxlczpndCxlbWl0czpbImNoYW5nZSJdLHNldHVwKHYse3Nsb3RzOnh9KXtsZXQgJD1QLnJlZihudWxsKSxVPVAucmVmKHYuY2hlY2tlZCksWj1QLnJlZih2LnZhbHVlKSxKPVAuY29tcHV0ZWQoKCk9PntsZXQgbHQ9di5kaXNhYmxlZD8iI2FkYWRhZCI6di5jb2xvcjtyZXR1cm4gVS52YWx1ZT97YmFja2dyb3VuZENvbG9yOmx0LGJvcmRlckNvbG9yOmx0fTp7Ym9yZGVyQ29sb3I6IiNkMWQxZDEifX0pLGVlPSgpPT57VS52YWx1ZT0hMX0se3VuaUNoZWNrR3JvdXA6Y2UsdW5pTGFiZWw6aGUsZmllbGQ6VGV9PVlyKFUsWixlZSksZmU9KGx0LHB0KT0+e3YuZGlzYWJsZWR8fFUudmFsdWV8fChVLnZhbHVlPSFVLnZhbHVlLGNlJiZjZS5yYWRpb0NoYW5nZShsdCxUZSkpfTtoZSYmKGhlLmFkZEhhbmRsZXIoZmUpLFAub25CZWZvcmVVbm1vdW50KCgpPT57aGUucmVtb3ZlSGFuZGxlcihmZSl9KSksYnIodix7ImxhYmVsLWNsaWNrIjpmZX0pLFAud2F0Y2goWygpPT52LmNoZWNrZWQsKCk9PnYudmFsdWVdLChbbHQscHRdKT0+e1UudmFsdWU9bHQsWi52YWx1ZT1wdH0pO2xldCB3ZT0oKT0+e2lmKCF4LmRlZmF1bHQpcmV0dXJuW107bGV0IGx0PXguZGVmYXVsdCgpO3JldHVybiBsdC5sZW5ndGg9PT0xJiZsdFswXS50eXBlPT09VGV4dD9bWG4obHRbMF0uY2hpbGRyZW4se2NsYXNzOiJ1bmktcmFkaW8tc2xvdCJ9KV06bHR9O3JldHVybigpPT57bGV0e2Rpc2FibGVkOmx0fT12O3JldHVybiBQLmNyZWF0ZVZOb2RlKCJkaXYiLFAubWVyZ2VQcm9wcyh7cmVmOiR9LHtkYXRhVW5jVHlwZToidW5pLXJhZGlvIn0se29uQ2xpY2s6ZmUsY2xhc3M6InVuaS1yYWRpbyJ9KSxbUC5jcmVhdGVWTm9kZSgiZGl2Iix7c3R5bGU6Si52YWx1ZSxjbGFzczpbInVuaS1yYWRpby1pbnB1dCIseyJ1bmktcmFkaW8taW5wdXQtZGlzYWJsZWQiOmx0fV19LFtVLnZhbHVlP1huKCJcdUVBMDgiLHtjbGFzczoidW5pLXJhZGlvLWlucHV0LWljb24ifSk6bnVsbF0pLC4uLndlKCldKX19fSk7ZnVuY3Rpb24gWXIodix4LCQpe2xldCBVPVAuY29tcHV0ZWQoe2dldDooKT0+KHtyYWRpb0NoZWNrZWQ6Qm9vbGVhbih2LnZhbHVlKSx2YWx1ZTp4LnZhbHVlfSksc2V0Oih7cmFkaW9DaGVja2VkOmhlfSk9Pnt2LnZhbHVlPWhlfX0pLFo9e3Jlc2V0OiR9LEo9UC5pbmplY3QoVmksITEpO0omJkouYWRkRmllbGQoVSk7bGV0IGVlPVAuaW5qZWN0KFJyLCExKTtlZSYmZWUuYWRkRmllbGQoWik7bGV0IGNlPVAuaW5qZWN0KFZuLCExKTtyZXR1cm4gUC5vbkJlZm9yZVVubW91bnQoKCk9PntKJiZKLnJlbW92ZUZpZWxkKFUpLGVlJiZlZS5yZW1vdmVGaWVsZChaKX0pLHt1bmlDaGVja0dyb3VwOkosdW5pRm9ybTplZSx1bmlMYWJlbDpjZSxmaWVsZDpVfX1sZXQgYW89UC5kZWZpbmVDb21wb25lbnQoe25hbWU6IlJhZGlvR3JvdXAiLHByb3BzOkdyLGVtaXRzOlsiY2hhbmdlIl0sc2V0dXAodix7c2xvdHM6eCxlbWl0OiR9KXtsZXQgVT1QLnJlZihudWxsKSxaPWZyKFUsJCk7cmV0dXJuIG9lKHYsWiksKCk9PlAuY3JlYXRlVk5vZGUoImRpdiIse3JlZjpVfSxbeC5kZWZhdWx0JiZ4LmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIG9lKHYseCl7bGV0ICQ9W107UC5vbk1vdW50ZWQoKCk9PntjZSgkLmxlbmd0aC0xKX0pO2xldCBVPSgpPT57dmFyIGhlO3JldHVybihoZT0kLmZpbmQoVGU9PlRlLnZhbHVlLnJhZGlvQ2hlY2tlZCkpPT1udWxsP3ZvaWQgMDpoZS52YWx1ZS52YWx1ZX07UC5wcm92aWRlKFZpLHthZGRGaWVsZChoZSl7JC5wdXNoKGhlKX0scmVtb3ZlRmllbGQoaGUpeyQuc3BsaWNlKCQuaW5kZXhPZihoZSksMSl9LHJhZGlvQ2hhbmdlKGhlLFRlKXtsZXQgZmU9JC5pbmRleE9mKFRlKTtjZShmZSwhMCkseCgiY2hhbmdlIix7dmFsdWU6VSgpfSl9fSk7bGV0IFo9UC5pbmplY3QoUnIsITEpLEo9e3N1Ym1pdDooKT0+e2xldCBoZT1bIiIsbnVsbF07cmV0dXJuIHYubmFtZSE9PSIiJiYoaGVbMF09di5uYW1lLGhlWzFdPVUoKSksaGV9fTtaJiYoWi5hZGRGaWVsZChKKSxQLm9uQmVmb3JlVW5tb3VudCgoKT0+e1oucmVtb3ZlRmllbGQoSil9KSk7ZnVuY3Rpb24gZWUoaGUsVGUpe2hlLnZhbHVlPXtyYWRpb0NoZWNrZWQ6VGUsdmFsdWU6aGUudmFsdWUudmFsdWV9fWZ1bmN0aW9uIGNlKGhlLFRlKXskLmZvckVhY2goKGZlLHdlKT0+e3dlIT09aGUmJlRlJiZlZSgkW3dlXSwhMSl9KX1yZXR1cm4gJH1sZXQgWD1bInUtaW5wdXQiLCJ1LXRleHRhcmVhIl0sc2U9UC5kZWZpbmVDb21wb25lbnQoe25hbWU6IkZvcm0iLGVtaXRzOlsic3VibWl0IiwicmVzZXQiXSxzZXR1cCh7fSx7c2xvdHM6dixlbWl0Onh9KXtsZXQgJD1QLnJlZihudWxsKSxVPWZyKCQseCksWj1bXSxKO3JldHVybiBQLnByb3ZpZGUoUnIse2FkZEZpZWxkKGVlKXtaLnB1c2goZWUpfSxyZW1vdmVGaWVsZChlZSl7Wi5zcGxpY2UoWi5pbmRleE9mKGVlKSwxKX0sc3VibWl0KGVlKXtsZXQgY2U9e307SiYmSihjZSk7bGV0IGhlPVoucmVkdWNlKChUZSxmZSk9PntpZihmZS5zdWJtaXQpe2xldFt3ZSxsdF09ZmUuc3VibWl0KCk7d2UmJihUZVt3ZV09bHQpfXJldHVybiBUZX0sT2JqZWN0LmNyZWF0ZShudWxsKSk7T2JqZWN0LmFzc2lnbihjZSxoZSksVSgic3VibWl0Iix7dmFsdWU6Y2V9KX0scmVzZXQoZWUpe0omJkooKSxaLmZvckVhY2goY2U9PmNlLnJlc2V0JiZjZS5yZXNldCgpKSxVKCJyZXNldCIsZWUpfX0pLCgpPT57bGV0IGVlPXYuZGVmYXVsdCYmdi5kZWZhdWx0KCk7cmV0dXJuIEo9QmUoZWUpLFAuY3JlYXRlVk5vZGUoInZpZXciLHtyZWY6JH0sW2VlXSl9fX0pO2Z1bmN0aW9uIEJlKHYpe2xldCB4PXkucmVxdWlyZU1vZHVsZSgicGx1cyIpLCQ9KFUsWik9PnsoWnx8dnx8W10pLmZvckVhY2goZnVuY3Rpb24oSil7WC5pbmRleE9mKFN0cmluZyhKLnR5cGUpKT49MCYmSi5lbCYmSi5lbC5hdHRyJiZKLmVsLmF0dHIubmFtZSYmKFU/VVtKLmVsLmF0dHIubmFtZV09eC5nZXRWYWx1ZShKLmVsLm5vZGVJZCk6Si5lbC5zZXRWYWx1ZSgiIikpLEN0LmlzQXJyYXkoSi5jaGlsZHJlbikmJkouY2hpbGRyZW4mJkouY2hpbGRyZW4ubGVuZ3RoJiYkKFUsSi5jaGlsZHJlbil9KX07cmV0dXJuICR9bGV0IG10PXt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxzaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjIzfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LHBuPXtzdWNjZXNzOiIjMDliYjA3IixpbmZvOiIjMTBhZWZmIix3YXJuOiIjZjc2MjYwIix3YWl0aW5nOiIjMTBhZWZmIixzYWZlX3N1Y2Nlc3M6IiMwOWJiMDciLHNhZmVfd2FybjoiI2ZmYmUwMCIsc3VjY2Vzc19jaXJjbGU6IiMwOWJiMDciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiIjMDliYjA3Iix3YWl0aW5nX2NpcmNsZToiIzEwYWVmZiIsY2lyY2xlOiIjYzljOWM5Iixkb3dubG9hZDoiIzA5YmIwNyIsaW5mb19jaXJjbGU6IiMwOWJiMDciLGNhbmNlbDoiI2Y0MzUzMCIsc2VhcmNoOiIjYjJiMmIyIixjbGVhcjoiI2IyYjJiMiJ9LEpuPXtzdWNjZXNzOiJcdUVBMDYiLGluZm86Ilx1RUEwMyIsd2FybjoiXHVFQTBCIix3YWl0aW5nOiJcdUVBMDkiLHNhZmVfc3VjY2VzczoiXHVFQTA0IixzYWZlX3dhcm46Ilx1RUEwNSIsc3VjY2Vzc19jaXJjbGU6Ilx1RUEwNyIsc3VjY2Vzc19ub19jaXJjbGU6Ilx1RUEwOCIsd2FpdGluZ19jaXJjbGU6Ilx1RUEwQSIsY2lyY2xlOiJcdUVBMDEiLGRvd25sb2FkOiJcdUVBMDIiLGluZm9fY2lyY2xlOiJcdUVBMEMiLGNhbmNlbDoiXHVFQTBEIixzZWFyY2g6Ilx1RUEwRSIsY2xlYXI6Ilx1RUEwRiJ9LFVuPVt7InVuaS1pY29uIjp7IiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIn19fV0sU3I9UC5kZWZpbmVDb21wb25lbnQoe25hbWU6Ikljb24iLHByb3BzOm10LHN0eWxlczpVbixzZXR1cCh2LHt9KXtyZXR1cm4oKT0+WG4oSm5bdi50eXBlXSx7Y2xhc3M6InVuaS1pY29uIixzdHlsZTp7Y29sb3I6di5jb2xvcnx8cG5bdi50eXBlXSxmb250U2l6ZTp2LnNpemV9fSl9fSksRnI9e2luZGljYXRvckRvdHM6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx2ZXJ0aWNhbDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGF1dG9wbGF5Ont0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY2lyY3VsYXI6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpbnRlcnZhbDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo1ZTN9LGR1cmF0aW9uOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjUwMH0sY3VycmVudDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxpbmRpY2F0b3JDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoicmdiYSgwLDAsMCwuMykifSxpbmRpY2F0b3JBY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMDAwMCJ9LHByZXZpb3VzTWFyZ2luOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxuZXh0TWFyZ2luOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjdXJyZW50SXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxza2lwSGlkZGVuSXRlbUxheW91dDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGRpc3BsYXlNdWx0aXBsZUl0ZW1zOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGRpc2FibGVUb3VjaDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxibz15LmNvbmZpZy5lbnYucGxhdGZvcm0udG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIixrbz1beyJ1bmktc3dpcGVyIjp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OiIxNTBweCJ9fSwidW5pLXN3aXBlci1zbGlkZXIiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH19LCJ1bmktc3dpcGVyLWRvdHMiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCxib3R0b206IjEwIixoZWlnaHQ6IjEwIn19fV0sUm89UC5kZWZpbmVDb21wb25lbnQoe25hbWU6IlN3aXBlciIscHJvcHM6RnIsc3R5bGVzOmtvLGVtaXRzOlsiY2hhbmdlIiwidHJhbnNpdGlvbiIsImFuaW1hdGlvbmZpbmlzaCJdLHNldHVwKHYse3Nsb3RzOngsZW1pdDokfSl7bGV0IFU9UC5yZWYobnVsbCksWj1bXSxKPWZyKFUsJCksZWU9JG4odiksY2U9S24oZWUsdixaLEopO3JldHVybiBQLndhdGNoKFsoKT0+di5jdXJyZW50LCgpPT52LmN1cnJlbnRJdGVtSWRdLChbaGUsVGVdKT0+e0huKGVlLHYsWil9KSxQLm9uTW91bnRlZCgoKT0+e2YoKCk9Pnt4bihVLnZhbHVlKS50aGVuKCh7d2lkdGg6aGUsaGVpZ2h0OlRlfSk9PntlZS5zd2lwZXJXaWR0aD1oZSxlZS5zd2lwZXJIZWlnaHQ9VGV9KX0sNTApfSksKCk9PntsZXQgaGU9eC5kZWZhdWx0JiZ4LmRlZmF1bHQoKSx7aW5kaWNhdG9yU3R5bGU6VGUsY3VycmVudFN5bmM6ZmV9PWVlO3JldHVybiBaPWxpKGhlKSxQLmNyZWF0ZVZOb2RlKCJkaXYiLHtyZWY6VSxjbGFzczoidW5pLXN3aXBlciJ9LFtQLmNyZWF0ZVZOb2RlKCJzbGlkZXIiLFAubWVyZ2VQcm9wcyh7Y2xhc3M6InVuaS1zd2lwZXItc2xpZGVyIn0se2F1dG9QbGF5OnYuYXV0b3BsYXksaW50ZXJ2YWw6di5pbnRlcnZhbCxpbmRleDpmZSxrZWVwSW5kZXg6ITAsc2hvd0luZGljYXRvcnM6di5pbmRpY2F0b3JEb3RzLGluZmluaXRlOnYuY2lyY3VsYXIsdmVydGljYWw6di52ZXJ0aWNhbCxzY3JvbGxhYmxlOiF2LmRpc2FibGVUb3VjaH0sY2UpLFtaLFAuY3JlYXRlVk5vZGUoImluZGljYXRvciIse2NsYXNzOiJ1bmktc3dpcGVyLWRvdHMiLHN0eWxlOlRlfSxudWxsKV0pXSl9fX0pO2Z1bmN0aW9uICRuKHYpe2xldCB4PVAucmVmKDApLCQ9UC5yZWYoMCksVT1QLnJlZih2LmN1cnJlbnQpLFo9UC5yZWYoImF1dG9wbGF5IiksSj1QLmNvbXB1dGVkKCgpPT4oe2l0ZW1Db2xvcjp2LmluZGljYXRvckNvbG9yLGl0ZW1TZWxlY3RlZENvbG9yOnYuaW5kaWNhdG9yQWN0aXZlQ29sb3IsaXRlbVNpemU6OCxvcGFjaXR5OnYuaW5kaWNhdG9yRG90cz8xOjB9KSk7cmV0dXJuIFAucmVhY3RpdmUoe3N3aXBlcldpZHRoOngsc3dpcGVySGVpZ2h0OiQsaW5kaWNhdG9yU3R5bGU6SixjdXJyZW50U3luYzpVLGN1cnJlbnRDaGFuZ2VTb3VyY2U6Wn0pfWZ1bmN0aW9uIEtuKHYseCwkLFUpe2xldCBaPTAsSj1mZT0+e2xldCB3ZT1mZS5kZXRhaWwsbHQ9eC52ZXJ0aWNhbCxwdD0obHQ/d2Uub2Zmc2V0WVJhdGlvOndlLm9mZnNldFhSYXRpbyl8fDA7aWYoKGZlLmRyYWd8fGZlLmRyYWcpJiYodi5jdXJyZW50Q2hhbmdlU291cmNlPSJ0b3VjaCIpLHB0PT09MCl7bGV0IGp0PU1hdGguYWJzKFopO2lmKGp0PT09MSlyZXR1cm47anQ+LjUmJihwdD0xKX1aPXB0LFUoInRyYW5zaXRpb24iLHtkeDpsdD8wOi12LnN3aXBlcldpZHRoKnB0LGR5Omx0Py12LnN3aXBlckhlaWdodCpwdDowfSl9LGVlPWZlPT57bGV0IHdlPSgpPT57VSgiYW5pbWF0aW9uZmluaXNoIixoZSgpKSx2LmN1cnJlbnRDaGFuZ2VTb3VyY2U9ImF1dG9wbGF5In07Ym8/d2UoKTpmKHdlLDUwKX0sY2U9ZmU9PntDdC5pc1N0cmluZyhmZS5kZXRhaWwuc291cmNlKSYmKHYuY3VycmVudENoYW5nZVNvdXJjZT1mZS5kZXRhaWwuc291cmNlKSx2LmN1cnJlbnRTeW5jPWZlLmRldGFpbC5pbmRleCxaPTB9O2Z1bmN0aW9uIGhlKCl7bGV0IGZlPU51bWJlcih2LmN1cnJlbnRTeW5jKSx3ZT0kW2ZlXXx8e30sbHQ9d2UuY29tcG9uZW50SW5zdGFuY2UmJndlLmNvbXBvbmVudEluc3RhbmNlLml0ZW1JZHx8IiI7cmV0dXJue2N1cnJlbnQ6ZmUsY3VycmVudEl0ZW1JZDpsdCxzb3VyY2U6di5jdXJyZW50Q2hhbmdlU291cmNlfX1yZXR1cm4gUC53YXRjaCgoKT0+di5jdXJyZW50U3luYyxmZT0+e1UoImNoYW5nZSIsaGUoKSl9KSx7b25TY3JvbGw6SixvblNjcm9sbGVuZDplZSxvbkNoYW5nZTpjZX19ZnVuY3Rpb24gSG4odix4LCQpe2xldCBVPS0xO2lmKHguY3VycmVudEl0ZW1JZClmb3IobGV0IFo9MCxKPSQ7WjxKLmxlbmd0aDtaKyspe2xldCBlZT1KW1pdLmNvbXBvbmVudEluc3RhbmNlO2lmKGVlJiZlZS5pdGVtSWQ9PT14LmN1cnJlbnRJdGVtSWQpe1U9WjticmVha319VTwwJiYoVT1NYXRoLnJvdW5kKE51bWJlcih4LmN1cnJlbnQpKXx8MCksVT1VPDA/MDpVLHYuY3VycmVudFN5bmMhPT1VJiYodi5jdXJyZW50Q2hhbmdlU291cmNlPSIiLHYuY3VycmVudFN5bmM9VSl9bGV0IEFpPXtpdGVtSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxpcz1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiU3dpcGVySXRlbSIscHJvcHM6QWksc2V0dXAodix7c2xvdHM6eH0pe3JldHVybigpPT5QLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXN3aXBlci1pdGVtIixzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MCxvdmVyZmxvdzoiaGlkZGVuIn19LFt4LmRlZmF1bHQmJnguZGVmYXVsdCgpXSl9fSk7dmFyIGhhPS9ePChbLUEtWmEtejAtOV9dKykoKD86XHMrW2EtekEtWl86XVstYS16QS1aMC05XzouXSooPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKihcLz8pPi8sd3I9L148XC8oWy1BLVphLXowLTlfXSspW14+XSo+LyxUYT0vKFthLXpBLVpfOl1bLWEtekEtWjAtOV86Ll0qKSg/OlxzKj1ccyooPzooPzoiKCg/OlxcLnxbXiJdKSopIil8KD86JygoPzpcXC58W14nXSkqKScpfChbXj5cc10rKSkpPy9nLERhPXhvKCJhcmVhLGJhc2UsYmFzZWZvbnQsYnIsY29sLGZyYW1lLGhyLGltZyxpbnB1dCxsaW5rLG1ldGEscGFyYW0sZW1iZWQsY29tbWFuZCxrZXlnZW4sc291cmNlLHRyYWNrLHdiciIpLEZhPXhvKCJhLGFkZHJlc3MsYXJ0aWNsZSxhcHBsZXQsYXNpZGUsYXVkaW8sYmxvY2txdW90ZSxidXR0b24sY2FudmFzLGNlbnRlcixkZCxkZWwsZGlyLGRpdixkbCxkdCxmaWVsZHNldCxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsZm9ybSxmcmFtZXNldCxoMSxoMixoMyxoNCxoNSxoNixoZWFkZXIsaGdyb3VwLGhyLGlmcmFtZSxpc2luZGV4LGxpLG1hcCxtZW51LG5vZnJhbWVzLG5vc2NyaXB0LG9iamVjdCxvbCxvdXRwdXQscCxwcmUsc2VjdGlvbixzY3JpcHQsdGFibGUsdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdHIsdWwsdmlkZW8iKSxWYT14bygiYWJicixhY3JvbnltLGFwcGxldCxiLGJhc2Vmb250LGJkbyxiaWcsYnIsYnV0dG9uLGNpdGUsY29kZSxkZWwsZGZuLGVtLGZvbnQsaSxpZnJhbWUsaW1nLGlucHV0LGlucyxrYmQsbGFiZWwsbWFwLG9iamVjdCxxLHMsc2FtcCxzY3JpcHQsc2VsZWN0LHNtYWxsLHNwYW4sc3RyaWtlLHN0cm9uZyxzdWIsc3VwLHRleHRhcmVhLHR0LHUsdmFyIiksVWE9eG8oImNvbGdyb3VwLGRkLGR0LGxpLG9wdGlvbnMscCx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpLGdhPXhvKCJjaGVja2VkLGNvbXBhY3QsZGVjbGFyZSxkZWZlcixkaXNhYmxlZCxpc21hcCxtdWx0aXBsZSxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3dyYXAscmVhZG9ubHksc2VsZWN0ZWQiKSxQYT14bygic2NyaXB0LHN0eWxlIik7ZnVuY3Rpb24gam4odix4KXt2YXIgJCxVLFosSj1bXSxlZT12O2ZvcihKLmxhc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0aGlzLmxlbmd0aC0xXX07djspe2lmKFU9ITAsIUoubGFzdCgpfHwhUGFbSi5sYXN0KCldKXtpZih2LmluZGV4T2YoIjwhLS0iKT09MD8oJD12LmluZGV4T2YoIi0tPiIpLCQ+PTAmJih4LmNvbW1lbnQmJnguY29tbWVudCh2LnN1YnN0cmluZyg0LCQpKSx2PXYuc3Vic3RyaW5nKCQrMyksVT0hMSkpOnYuaW5kZXhPZigiPC8iKT09MD8oWj12Lm1hdGNoKHdyKSxaJiYodj12LnN1YnN0cmluZyhaWzBdLmxlbmd0aCksWlswXS5yZXBsYWNlKHdyLFRlKSxVPSExKSk6di5pbmRleE9mKCI8Iik9PTAmJihaPXYubWF0Y2goaGEpLFomJih2PXYuc3Vic3RyaW5nKFpbMF0ubGVuZ3RoKSxaWzBdLnJlcGxhY2UoaGEsaGUpLFU9ITEpKSxVKXskPXYuaW5kZXhPZigiPCIpO3ZhciBjZT0kPDA/djp2LnN1YnN0cmluZygwLCQpO3Y9JDwwPyIiOnYuc3Vic3RyaW5nKCQpLHguY2hhcnMmJnguY2hhcnMoY2UpfX1lbHNlIHY9di5yZXBsYWNlKG5ldyBSZWdFeHAoIihbXFxzXFxTXSo/KTwvIitKLmxhc3QoKSsiW14+XSo+IiksZnVuY3Rpb24oZmUsd2Upe3JldHVybiB3ZT13ZS5yZXBsYWNlKC88IS0tKFtcc1xTXSo/KS0tPnw8IVxbQ0RBVEFcWyhbXHNcU10qPyldXT4vZywiJDEkMiIpLHguY2hhcnMmJnguY2hhcnMod2UpLCIifSksVGUoIiIsSi5sYXN0KCkpO2lmKHY9PWVlKXRocm93IlBhcnNlIEVycm9yOiAiK3Y7ZWU9dn1UZSgpO2Z1bmN0aW9uIGhlKGZlLHdlLGx0LHB0KXtpZih3ZT13ZS50b0xvd2VyQ2FzZSgpLEZhW3dlXSlmb3IoO0oubGFzdCgpJiZWYVtKLmxhc3QoKV07KVRlKCIiLEoubGFzdCgpKTtpZihVYVt3ZV0mJkoubGFzdCgpPT13ZSYmVGUoIiIsd2UpLHB0PURhW3dlXXx8ISFwdCxwdHx8Si5wdXNoKHdlKSx4LnN0YXJ0KXt2YXIganQ9W107bHQucmVwbGFjZShUYSxmdW5jdGlvbih5dCxIZSl7dmFyIER0PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTphcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOmdhW0hlXT9IZToiIjtqdC5wdXNoKHtuYW1lOkhlLHZhbHVlOkR0LGVzY2FwZWQ6RHQucmVwbGFjZSgvKF58W15cXF0pIi9nLCckMVxcIicpfSl9KSx4LnN0YXJ0JiZ4LnN0YXJ0KHdlLGp0LHB0KX19ZnVuY3Rpb24gVGUoZmUsd2Upe2lmKHdlKWZvcih2YXIgbHQ9Si5sZW5ndGgtMTtsdD49MCYmSltsdF0hPXdlO2x0LS0pO2Vsc2UgdmFyIGx0PTA7aWYobHQ+PTApe2Zvcih2YXIgcHQ9Si5sZW5ndGgtMTtwdD49bHQ7cHQtLSl4LmVuZCYmeC5lbmQoSltwdF0pO0oubGVuZ3RoPWx0fX19ZnVuY3Rpb24geG8odil7Zm9yKHZhciB4PXt9LCQ9di5zcGxpdCgiLCIpLFU9MDtVPCQubGVuZ3RoO1UrKyl4WyRbVV1dPSEwO3JldHVybiB4fWZ1bmN0aW9uIFFvKHYpe3JldHVybiB2LnJlcGxhY2UoLzxcP3htbC4qXD8+XG4vLCIiKS5yZXBsYWNlKC88IWRvY3R5cGUuKj5cbi8sIiIpLnJlcGxhY2UoLzwhRE9DVFlQRS4qPlxuLywiIil9ZnVuY3Rpb24gS2kodil7cmV0dXJuIHYucmVkdWNlKGZ1bmN0aW9uKHgsJCl7bGV0IFU9JC52YWx1ZSxaPSQubmFtZTtyZXR1cm4gVS5tYXRjaCgvIC8pJiZbInN0eWxlIiwic3JjIl0uaW5kZXhPZihaKT09PS0xJiYoVT1VLnNwbGl0KCIgIikpLHhbWl0/QXJyYXkuaXNBcnJheSh4W1pdKT94W1pdLnB1c2goVSk6eFtaXT1beFtaXSxVXTp4W1pdPVUseH0se30pfWZ1bmN0aW9uIG9zKHYpe3Y9UW8odik7bGV0IHg9W10sJD17bm9kZToicm9vdCIsY2hpbGRyZW46W119O3JldHVybiBqbih2LHtzdGFydDpmdW5jdGlvbihVLFosSil7bGV0IGVlPXtuYW1lOlV9O2lmKFoubGVuZ3RoIT09MCYmKGVlLmF0dHJzPUtpKFopKSxKKXtsZXQgY2U9eFswXXx8JDtjZS5jaGlsZHJlbnx8KGNlLmNoaWxkcmVuPVtdKSxjZS5jaGlsZHJlbi5wdXNoKGVlKX1lbHNlIHgudW5zaGlmdChlZSl9LGVuZDpmdW5jdGlvbihVKXtsZXQgWj14LnNoaWZ0KCk7aWYoWi5uYW1lIT09VSYmY29uc29sZS5lcnJvcigiaW52YWxpZCBzdGF0ZTogbWlzbWF0Y2ggZW5kIHRhZyIpLHgubGVuZ3RoPT09MCkkLmNoaWxkcmVuLnB1c2goWik7ZWxzZXtsZXQgSj14WzBdO0ouY2hpbGRyZW58fChKLmNoaWxkcmVuPVtdKSxKLmNoaWxkcmVuLnB1c2goWil9fSxjaGFyczpmdW5jdGlvbihVKXtsZXQgWj17dHlwZToidGV4dCIsdGV4dDpVfTtpZih4Lmxlbmd0aD09PTApJC5jaGlsZHJlbi5wdXNoKFopO2Vsc2V7bGV0IEo9eFswXTtKLmNoaWxkcmVufHwoSi5jaGlsZHJlbj1bXSksSi5jaGlsZHJlbi5wdXNoKFopfX0sY29tbWVudDpmdW5jdGlvbihVKXtsZXQgWj17bm9kZToiY29tbWVudCIsdGV4dDpVfSxKPXhbMF07Si5jaGlsZHJlbnx8KEouY2hpbGRyZW49W10pLEouY2hpbGRyZW4ucHVzaChaKX19KSwkLmNoaWxkcmVufWxldCBhcz17bm9kZXM6e3R5cGU6W0FycmF5LFN0cmluZ10sZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybltdfX19LEJvPTE2LHNzPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJSaWNoVGV4dCIscHJvcHM6YXMsc2V0dXAodil7bGV0IHg9UC5nZXRDdXJyZW50SW5zdGFuY2UoKTtyZXR1cm4oKT0+e2xldCAkPXYubm9kZXM7cmV0dXJuIEN0LmlzU3RyaW5nKCQpJiYoJD1vcygkKSksUC5jcmVhdGVWTm9kZSgidS1yaWNoLXRleHQiLHt2YWx1ZTpzbygkfHxbXSx4LnJvb3Qse2RlZmF1bHRGb250U2l6ZTpCb30pfSxudWxsKX19fSk7ZnVuY3Rpb24gc28odix4LCQpe2xldCBVPVsic3BhbiIsImEiLCJpbWFnZSIsImltZyJdLFo9e2Jsb2NrcXVvdGU6d2UsYnI6eXQsZGl2OndlLGRsOndlLGgxOnB0KDIpLGgyOnB0KDEuNSksaDM6cHQoMS4xNyksaDQ6cHQoMSksaDU6cHQoLjgzKSxoNjpwdCguNjcpLGhyOndlLG9sOndlLHA6d2Usc3Ryb25nOmp0LHRhYmxlOndlLHRib2R5OndlLHRmb290OndlLHRoZWFkOndlLHVsOndlfSxKPS8mKGFtcHxndHxsdHxuYnNwfHF1b3R8YXBvcyk7L2csZWU9e2FtcDoiJiIsZ3Q6Ij4iLGx0OiI8IixuYnNwOiIgIixxdW90OiciJyxhcG9zOiInIn0sY2U9e3R5cGU6InNwYW4iLF9fdHlwZToiYnJlYWsiLGF0dHI6e3ZhbHVlOmAKYH19LGhlPXtfX2Jsb2NrOiEwLF9fYnJlYWs6ITAsY2hpbGRyZW46W119LFRlPW51bGw7ZnVuY3Rpb24gZmUoZHQpe2xldCBybj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGR0LmF0dHJzKXtsZXQgTG49KGR0LmF0dHJzLmNsYXNzfHwiIikuc3BsaXQoIiAiKTtPYmplY3QuYXNzaWduKHJuLFAucGFyc2VDbGFzc0xpc3QoTG4seCksT28oZHQuYXR0cnMuc3R5bGV8fCIiKSl9aWYoZHQubmFtZT09PSJpbWcifHxkdC5uYW1lPT09ImltYWdlIil7bGV0IExuPWR0LmF0dHJzO3JuLndpZHRoPXJuLndpZHRofHxMbi53aWR0aCxybi5oZWlnaHQ9cm4uaGVpZ2h0fHxMbi5oZWlnaHR9cmV0dXJuIHJufWZ1bmN0aW9uIHdlKGR0KXtyZXR1cm4gZHQuX19ibG9jaz0hMCxkdH1mdW5jdGlvbiBsdChkdCxybil7cmV0dXJuIGR0LnN0eWxlJiYhZHQuc3R5bGUuZm9udFNpemUmJihkdC5zdHlsZS5mb250U2l6ZT0kLmRlZmF1bHRGb250U2l6ZSpybiksd2UoanQoZHQpKX1mdW5jdGlvbiBwdChkdCl7cmV0dXJuIGZ1bmN0aW9uKHJuKXtyZXR1cm4gbHQocm4sZHQpfX1mdW5jdGlvbiBqdChkdCl7cmV0dXJuIGR0LnN0eWxlJiYhZHQuc3R5bGUuZm9udFdlaWdodCYmKGR0LnN0eWxlLmZvbnRXZWlnaHQ9ImJvbGQiKSxkdH1mdW5jdGlvbiB5dChkdCl7cmV0dXJuIGR0Ll9fdmFsdWU9IiAiLHdlKGR0KX1mdW5jdGlvbiBIZShkdCl7cmV0dXJuIGR0LnJlcGxhY2UoSixmdW5jdGlvbihybixMbil7cmV0dXJuIGVlW0xuXX0pfWZ1bmN0aW9uIER0KGR0KXtsZXQgcm49KGR0Lm5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpLExuPXJuLEp0PVpbcm5dO1UuaW5kZXhPZihybik9PT0tMSYmKHJuPSJzcGFuIikscm49PT0iaW1nIiYmKHJuPSJpbWFnZSIpO2xldCB6dD17dHlwZTpybixfX3R5cGU6TG4sYXR0cjpPYmplY3QuY3JlYXRlKG51bGwpfTtyZXR1cm4oZHQudHlwZT09PSJ0ZXh0Inx8ZHQudGV4dCkmJih6dC5fX3ZhbHVlPXp0LmF0dHIudmFsdWU9SGUoKGR0LnRleHR8fCIiKS50cmltKCkpKSxkdC5hdHRycyYmT2JqZWN0LmtleXMoZHQuYXR0cnMpLmZvckVhY2goJHQ9PnskdCE9PSJjbGFzcyImJiR0IT09InN0eWxlIiYmKHp0LmF0dHJbJHRdPWR0LmF0dHJzWyR0XSl9KSx6dC5zdHlsZT1mZShkdCksSnQmJkp0KHp0KSwoaGUuX19ibG9ja3x8enQuX19ibG9jaykmJihUZXx8KGhlLmNoaWxkcmVuLnB1c2goY2UpLFRlPVtoZSxjZV0pKSxoZT16dCwoaGUuX192YWx1ZXx8aGUudHlwZT09PSJpbWFnZSImJmhlLmF0dHIuc3JjKSYmKFRlPW51bGwpLHp0LmNoaWxkcmVuPXZuKGR0LmNoaWxkcmVuKSxoZT16dCxoZS5fX2Jsb2NrJiZoZS5zdHlsZS5oZWlnaHQmJiEvXjAocHgpPyQvLnRlc3QoaGUuc3R5bGUuaGVpZ2h0KSYmKFRlPW51bGwpLHp0fWZ1bmN0aW9uIHZuKGR0KXtyZXR1cm4gQ3QuaXNBcnJheShkdCk/ZHQubWFwKHJuPT5EdChybikpOltdfWxldCBxdD12bih2KTtpZihUZSl7bGV0W2R0LHJuXT1UZSxMbj1kdC5jaGlsZHJlbixKdD1Mbi5pbmRleE9mKHJuKTtMbi5zcGxpY2UoSnQsMSl9cmV0dXJuIHF0fWxldCBoaT17fTtmdW5jdGlvbiBPaSh2LHgsJCl7bGV0e2FkcGlkOlUsd2lkdGg6Wn09dixKPVUrIi0iK1osZWU9aGlbSl07aWYoZWUmJmVlLmxlbmd0aD4wKXt4KGVlLnNwbGljZSgwLDEpWzBdKTtyZXR1cm59aC5hZC5nZXRBZHModixjZT0+e2xldCBoZT1jZS5hZHM7eChoZS5zcGxpY2UoMCwxKVswXSksaGlbSl09ZWU/ZWUuY29uY2F0KGhlKTpoZX0sY2U9PnskKHtlcnJDb2RlOmNlLmNvZGUsZXJyTXNnOmNlLm1lc3NhZ2V9KX0pfWxldCBaaT17YWRwaWQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6IiJ9LGRhdGE6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHdpZHRoOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjaGFubmVsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZ2k9e2xvYWQ6ImxvYWQiLGNsb3NlOiJjbG9zZSIsZXJyb3I6ImVycm9yIixkb3dubG9hZGNoYW5nZToiZG93bmxvYWRjaGFuZ2UifSxocj1QLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQWQiLHByb3BzOlppLGVtaXRzOltnaS5sb2FkLGdpLmNsb3NlLGdpLmVycm9yLGdpLmRvd25sb2FkY2hhbmdlXSxzZXR1cCh2LHtlbWl0Onh9KXtsZXQgJD1QLnJlZihudWxsKSxVPWZyKCQseCksWj11cigpO1Aud2F0Y2goKCk9PnYuYWRwaWQsZWU9PnskYShaLHYsVSl9KSxQLndhdGNoKCgpPT52LmRhdGEsZWU9PntaLmRhdGE9ZWV9KSxQLm9uTW91bnRlZCgoKT0+e2YoKCk9Pnt4bigkLnZhbHVlKS50aGVuKCh7d2lkdGg6ZWV9KT0+e1oud2lkdGg9ZWU9PT0wPy0xOmVlLCRhKFosdixVKX0pfSw1MCl9KTtsZXQgSj17b25Eb3dubG9hZGNoYW5nZShlZSl7VShnaS5kb3dubG9hZGNoYW5nZSxlZSl9LG9uRGlzbGlrZShlZSl7VShnaS5jbG9zZSxlZSl9fTtyZXR1cm4oKT0+UC5jcmVhdGVWTm9kZSgidS1hZCIsUC5tZXJnZVByb3BzKHtyZWY6JH0se2RhdGE6Wi5kYXRhLHJlbmRlcmluZzohMH0sSiksbnVsbCl9fSk7ZnVuY3Rpb24gdXIodil7bGV0IHg9UC5yZWYoIiIpO3JldHVybiBQLnJlYWN0aXZlKHt3aWR0aDowLGRhdGE6eH0pfWZ1bmN0aW9uICRhKHYseCwkKXtPaSh7YWRwaWQ6eC5hZHBpZCx3aWR0aDp2LndpZHRofSxVPT57di5kYXRhPVUsJChnaS5sb2FkLHt9KX0sVT0+eyQoZ2kuZXJyb3IsVSl9KX1sZXQgSGE9e307ZnVuY3Rpb24gWGkodix4LCQsVSxaKXtsZXQgSj12KyItIit4LGVlPUhhW0pdO2lmKGVlJiZlZS5sZW5ndGg+MCl7VShlZS5zcGxpY2UoMCwxKVswXSk7cmV0dXJufWguYWQuZ2V0RHJhd0Fkcyh7YWRwaWQ6U3RyaW5nKHYpLGNvdW50OjMsd2lkdGg6eH0sY2U9PntsZXQgaGU9Y2UuYWRzO1UoaGUuc3BsaWNlKDAsMSlbMF0pLEhhW0pdPWVlP2VlLmNvbmNhdChoZSk6aGV9LGNlPT57Wih7ZXJyQ29kZTpjZS5jb2RlLGVyck1zZzpjZS5tZXNzYWdlfSl9KX1sZXQgbG89e2FkcGlkOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OiIifSxkYXRhOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSx3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGNvPXtsb2FkOiJsb2FkIixjbG9zZToiY2xvc2UiLGVycm9yOiJlcnJvciJ9LGxzPVAuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJBZERyYXciLHByb3BzOmxvLGVtaXRzOltjby5sb2FkLGNvLmNsb3NlLGNvLmVycm9yXSxzZXR1cCh2LHtlbWl0Onh9KXtsZXQgJD1QLnJlZihudWxsKSxVPWZyKCQseCksWj1wYSgpO1Aud2F0Y2goKCk9PnYuYWRwaWQsZWU9PntNbyhaLHYsVSl9KSxQLndhdGNoKCgpPT52LmRhdGEsZWU9PntaLmRhdGE9ZWV9KTtsZXQgSj17b25EaXNsaWtlKGVlKXtVKGNvLmNsb3NlLGVlKX19O3JldHVybiBQLm9uTW91bnRlZCgoKT0+e2YoKCk9Pnt4bigkLnZhbHVlKS50aGVuKCh7d2lkdGg6ZWUsaGVpZ2h0OmNlfSk9PntaLndpZHRoPWVlPT09MD8tMTplZSxaLmhlaWdodD1jZT09PTA/LTE6Y2UsTW8oWix2LFUpfSl9LDUwKX0pLCgpPT57bGV0e2RhdGE6ZWV9PVo7cmV0dXJuIFAuY3JlYXRlVk5vZGUoInUtYWQtZHJhdyIsUC5tZXJnZVByb3BzKHtyZWY6JH0se2RhdGE6ZWUscmVuZGVyaW5nOiEwfSxKKSxudWxsKX19fSk7ZnVuY3Rpb24gcGEodil7bGV0IHg9UC5yZWYoIiIpO3JldHVybiBQLnJlYWN0aXZlKHt3aWR0aDowLGhlaWdodDowLGRhdGE6eH0pfWZ1bmN0aW9uIE1vKHYseCwkKXtYaSh4LmFkcGlkLHYud2lkdGgsdi5oZWlnaHQsVT0+e3YuZGF0YT1VLCQoY28ubG9hZCx7fSl9LFU9PnskKGNvLmVycm9yLFUpfSl9cmV0dXJue05hdmlnYXRvcjpFaSxMYWJlbDpfbixCdXR0b246cm8sTW92YWJsZUFyZWE6VHIsTW92YWJsZVZpZXc6RXIsUHJvZ3Jlc3M6bmksUGlja2VyVmlldzpMcixQaWNrZXJWaWV3Q29sdW1uOk1pLFBpY2tlcjpycixVU2xpZGVyOmVyLFN3aXRjaDpXcixDaGVja2JveDp4ZSxDaGVja2JveEdyb3VwOmN0LFJhZGlvOlJ0LFJhZGlvR3JvdXA6YW8sRm9ybTpzZSxJY29uOlNyLFN3aXBlcjpSbyxTd2lwZXJJdGVtOmlzLFJpY2hUZXh0OnNzLEFkOmhyLEFkRHJhdzpsc319KE4sRGUsTnQpO3JldHVybiBUdH1mdW5jdGlvbiBGSShmLHMpe2xldHtVbmlTaGFyZWQ6cCxWdWU6d309cztmdW5jdGlvbiBOKGgsRSxSKXtsZXQgRGU9aC4kW0VdO3JldHVybiBEZSYmcC5pbnZva2VBcnJheUZucyhEZSxSKX1sZXQgeT1mLnNldHVwO3JldHVybiBmLmluaGVyaXRBdHRycz0hMSxmLnNldHVwPShoLEUpPT57bGV0e2F0dHJzOntfX3BhZ2VJZDpSLF9fcGFnZVBhdGg6RGUsX19wYWdlUXVlcnk6TnR9fT1FLFV0PXMuX191bmlSb3V0ZXMuZmluZChDdD0+Q3QubWV0YS5yb3V0ZT09PURlKSxUdD13LmdldEN1cnJlbnRJbnN0YW5jZSgpLFA9VHQucHJveHk7aWYoVXQmJihVdC5tZXRhLmlzU3ViTlZ1ZXx8VkkoUCxzLHtfX3BhZ2VJZDpSLF9fcGFnZVBhdGg6RGV9KSksdy5vbk1vdW50ZWQoKCk9Pnt3Lm5leHRUaWNrKCgpPT57TihQLHAuT05fUkVBRFkpfSksVHQub25QYWdlU2Nyb2xsJiZQLiRlbC5hZGRFdmVudCgic2Nyb2xsIixDdD0+e0N0LnNjcm9sbFRvcD1DdC5kZXRhaWwuc2Nyb2xsVG9wLE4oUCxwLk9OX1BBR0VfU0NST0xMLEN0KX0pLFR0Lm9uUmVhY2hCb3R0b20mJlAuJGVsLmFkZEV2ZW50KCJzY3JvbGx0b2xvd2VyIixDdD0+e04oUCxwLk9OX1JFQUNIX0JPVFRPTSxDdCl9KX0pLHcub25CZWZvcmVVbm1vdW50KCgpPT57TihQLHAuT05fVU5MT0FEKX0pLHkpcmV0dXJuIHkoTnQsRSl9LGZ9ZnVuY3Rpb24gVkkoZixzLHtfX3BhZ2VJZDpwLF9fcGFnZVBhdGg6d30pe2xldCBOPXMuZ2V0Q3VycmVudFBhZ2VzKCkseT1OW04ubGVuZ3RoLTFdO2lmKHkmJnkuX19zZXR1cCl5Ll9fc2V0dXAoZix5KTtlbHNle2xldCBoPSIvIit3O3JldHVybiBzLl9fcmVnaXN0ZXJQYWdlKHt1cmw6aCxwYXRoOmgscXVlcnk6e30sb3BlblR5cGU6ImxhdW5jaCIsd2Vidmlldzp7aWQ6cCsiIn0sbnZ1ZVBhZ2VWbTpmfSl9fXZhciBNbD17fSxMcDtmdW5jdGlvbiBEcChmKXtMcD1mfXZhciBudTtmdW5jdGlvbiBVSShmKXtpZihudSlyZXR1cm4gbnU7bGV0IHM9bmV3IGYuRW1pdHRlcjtyZXR1cm4gbnU9e29uKHAsdyl7cmV0dXJuIHMub24ocCx3KX0sb25jZShwLHcpe3JldHVybiBzLm9uY2UocCx3KX0sb2ZmKHAsdyl7cmV0dXJuIHMub2ZmKHAsdyl9LGVtaXQocCwuLi53KXtyZXR1cm4gcy5lbWl0KHAsLi4udyl9fSxudX1mdW5jdGlvbiAkSShmKXtyZXR1cm4ocyxwLHcpPT57bGV0e252dWU6Tn09cCx5PXR1KGYscCk7cC5WdWU9eSxNbFtzXT17aW5zdGFuY2VJZDpzLGNvbmZpZzpOLmNvbmZpZyxkb2N1bWVudDpOLmRvY3VtZW50LGRhdGE6d307bGV0e2NyZWF0ZUFwcDpofT15O3kuY3JlYXRlVnVlQXBwPXkuY3JlYXRlQXBwPShFLFIpPT4ocC5fX3VuaUNvbmZpZy5zdHlsZXM9RS5zdHlsZXN8fFtdLGgoRSxSKS51c2UoSEkscyxwKSkseS5jcmVhdGVQYWdlQXBwPShFLFIpPT57RkkoRSxwKTtsZXQgRGU9Ui4kc3RvcmU7ZGVsZXRlIFIuJHN0b3JlO2xldCBOdD1oKEUsUik7cmV0dXJuIERlJiZOdC51c2UoRGUpLE50LnVzZSh6SSx5LHMscCl9fX12YXIgSEk9e2luc3RhbGwoZixzLHApe2RjKHApLmluaXRBcHAoZiksakkoZixzLHApfX07ZnVuY3Rpb24gakkoZixzLHApe2xldHttb3VudDp3fT1mLE49TWxbc107cmV0dXJuIGYubW91bnQ9eT0+e2xldCBoPXk9PT0iI2FwcCIsRT1OLmFwcD13KEZwKE4uZG9jdW1lbnQse2lzUm9vdDpofSkpO3JldHVybiBoJiZwLl9fcmVnaXN0ZXJBcHAoRSksRX0sZn12YXIgekk9e2luc3RhbGwoZixzLHAsdyl7bGV0e3dlZXg6TixwbHVzOnksQnJvYWRjYXN0Q2hhbm5lbDpoLFZ1ZVNoYXJlZDpFLFVuaVNoYXJlZDpSLGdldEN1cnJlbnRQYWdlczpEZSxzZXRUaW1lb3V0Ok50LGNsZWFyVGltZW91dDpVdCxfX3VuaUNvbmZpZzpUdH09dztmLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLiRyZXF1aXJlTmF0aXZlUGx1Z2luPU4ucmVxdWlyZU1vZHVsZTtsZXQgUD1ESSh7dW5pOkxwLFZ1ZTpzLHdlZXg6TixwbHVzOnksQnJvYWRjYXN0Q2hhbm5lbDpoLFVuaVZpZXdKU0JyaWRnZTpVSShSKSxWdWVTaGFyZWQ6RSxVbmlTaGFyZWQ6UixnZXRDdXJyZW50UGFnZXM6RGUsc2V0VGltZW91dDpOdCxjbGVhclRpbWVvdXQ6VXQsX191bmlDb25maWc6VHR9KTtPYmplY3Qua2V5cyhQKS5mb3JFYWNoKEN0PT57Zi5jb21wb25lbnQocy5oeXBoZW5hdGUoQ3QpLFBbQ3RdKX0pLGRjKHcpLmluaXRBcHAoZiksV0koZixwLHcpfX07ZnVuY3Rpb24gV0koZixzLHtudnVlOnB9KXtsZXR7Y29uZmlnOntjb21waWxlck9wdGlvbnM6d30sbW91bnQ6Tn09Zjt3LmlzQ3VzdG9tRWxlbWVudD1oPT4hIXAuc3VwcG9ydHMoYEBjb21wb25lbnQvJHtofWApO2xldCB5PU1sW3NdO3JldHVybiBmLm1vdW50PWg9PntsZXQgRT1oPT09IiNyb290IixSPXkuYXBwPU4oRnAoeS5kb2N1bWVudCx7aXNSb290OkV9KSk7aWYoRSl0cnl7cC5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoiY3JlYXRlRmluaXNoIn0sW10pfWNhdGNoKERlKXt9cmV0dXJuIFJ9LGZ9ZnVuY3Rpb24gRnAoZix7aXNSb290OnN9KXtpZihzKXJldHVybiBmLmRvY3VtZW50RWxlbWVudDtsZXQgcD1mLmNyZWF0ZUNvbW1lbnQoInJvb3QiKTtyZXR1cm4gZi5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocCkscH1mdW5jdGlvbiBWcChmKXtsZXQgcz1NbFtmXTtpZihzJiZzLmFwcCYmcy5kb2N1bWVudCl7dHJ5e3MuYXBwLiQuYXBwQ29udGV4dC5hcHAudW5tb3VudCgpLHMuZG9jdW1lbnQuZGVzdHJveSgpfWNhdGNoKHApe31kZWxldGUgcy5kb2N1bWVudCxkZWxldGUgcy5hcHB9ZGVsZXRlIE1sW2ZdfWZ1bmN0aW9uIFVwKGYpe2xldCBzPU1sW2ZdO2lmKCFzfHwhcy5hcHApcmV0dXJuIG5ldyBFcnJvcihgcmVmcmVzaEluc3RhbmNlOiBpbnN0YW5jZSAke2Z9IG5vdCBmb3VuZCFgKTtzLmRvY3VtZW50LnRhc2tDZW50ZXIuc2VuZCgiZG9tIix7YWN0aW9uOiJyZWZyZXNoRmluaXNoIn0sW10pfWZ1bmN0aW9uIEdJKGYscyl7bGV0e1VuaVNoYXJlZDpwLFZ1ZVNoYXJlZDp3LFZ1ZVJlYWN0aXZpdHk6Tn09Zjt2YXIgeT1mdW5jdGlvbihoLEUsUixEZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIE50KGEpe31mdW5jdGlvbiBVdChhLHUpe31mdW5jdGlvbiBUdChhLHUsbSxTKXt2YXIgSTt0cnl7ST1TP2EoLi4uUyk6YSgpfWNhdGNoKE8pe0N0KE8sdSxtKX1yZXR1cm4gSX1mdW5jdGlvbiBQKGEsdSxtLFMpe2lmKEUuaXNGdW5jdGlvbihhKSl7dmFyIEk9VHQoYSx1LG0sUyk7cmV0dXJuIEkmJkUuaXNQcm9taXNlKEkpJiZJLmNhdGNoKFc9PntDdChXLHUsbSl9KSxJfWZvcih2YXIgTz1bXSxGPTA7RjxhLmxlbmd0aDtGKyspTy5wdXNoKFAoYVtGXSx1LG0sUykpO3JldHVybiBPfWZ1bmN0aW9uIEN0KGEsdSxtKXtpZih1JiZ1LnZub2RlLHUpe2Zvcih2YXIgUz11LnBhcmVudCxJPXUucHJveHksTz1tO1M7KXt2YXIgRj1TLmVjO2lmKEYpe2Zvcih2YXIgVz0wO1c8Ri5sZW5ndGg7VysrKWlmKEZbV10oYSxJLE8pPT09ITEpcmV0dXJufVM9Uy5wYXJlbnR9dmFyIEc9dS5hcHBDb250ZXh0LmNvbmZpZy5lcnJvckhhbmRsZXI7aWYoRyl7VHQoRyxudWxsLDEwLFthLEksT10pO3JldHVybn19Um4oYSl9ZnVuY3Rpb24gUm4oYSx1LG0pe2NvbnNvbGUuZXJyb3IoYSl9dmFyIG90PSExLHo9ITEsSz1bXSxtbj0wLGhuPVtdLHduPW51bGwsWG49MCxzaT1Qcm9taXNlLnJlc29sdmUoKSxFaT1udWxsO2Z1bmN0aW9uIFhyKGEpe3ZhciB1PUVpfHxzaTtyZXR1cm4gYT91LnRoZW4odGhpcz9hLmJpbmQodGhpcyk6YSk6dX1mdW5jdGlvbiBtcihhKXtmb3IodmFyIHU9bW4rMSxtPUsubGVuZ3RoO3U8bTspe3ZhciBTPXUrbT4+PjEsST1qZShLW1NdKTtJPGE/dT1TKzE6bT1TfXJldHVybiB1fWZ1bmN0aW9uIENuKGEpeyghSy5sZW5ndGh8fCFLLmluY2x1ZGVzKGEsb3QmJmEuYWxsb3dSZWN1cnNlP21uKzE6bW4pKSYmKGEuaWQ9PW51bGw/Sy5wdXNoKGEpOksuc3BsaWNlKG1yKGEuaWQpLDAsYSksX3IoKSl9ZnVuY3Rpb24gX3IoKXshb3QmJiF6JiYoej0hMCxFaT1zaS50aGVuKE90KSl9ZnVuY3Rpb24gJHIoYSl7dmFyIHU9Sy5pbmRleE9mKGEpO3U+bW4mJksuc3BsaWNlKHUsMSl9ZnVuY3Rpb24gUXIoYSl7RS5pc0FycmF5KGEpP2huLnB1c2goLi4uYSk6KCF3bnx8IXduLmluY2x1ZGVzKGEsYS5hbGxvd1JlY3Vyc2U/WG4rMTpYbikpJiZobi5wdXNoKGEpLF9yKCl9ZnVuY3Rpb24geWkoYSl7Zm9yKHZhciB1PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpvdD9tbisxOjA7dTxLLmxlbmd0aDt1Kyspe3ZhciBtPUtbdV07bSYmbS5wcmUmJihLLnNwbGljZSh1LDEpLHUtLSxtKCkpfX1mdW5jdGlvbiBrbihhKXtpZihobi5sZW5ndGgpe3ZhciB1PVsuLi5uZXcgU2V0KGhuKV07aWYoaG4ubGVuZ3RoPTAsd24pe3duLnB1c2goLi4udSk7cmV0dXJufWZvcih3bj11LHduLnNvcnQoKG0sUyk9PmplKG0pLWplKFMpKSxYbj0wO1huPHduLmxlbmd0aDtYbisrKXduW1huXSgpO3duPW51bGwsWG49MH19dmFyIGplPWE9PmEuaWQ9PW51bGw/MS8wOmEuaWQsbnQ9KGEsdSk9Pnt2YXIgbT1qZShhKS1qZSh1KTtpZihtPT09MCl7aWYoYS5wcmUmJiF1LnByZSlyZXR1cm4tMTtpZih1LnByZSYmIWEucHJlKXJldHVybiAxfXJldHVybiBtfTtmdW5jdGlvbiBPdChhKXt6PSExLG90PSEwLEsuc29ydChudCk7dmFyIHU9RS5OT09QO3RyeXtmb3IobW49MDttbjxLLmxlbmd0aDttbisrKXt2YXIgbT1LW21uXTttJiZtLmFjdGl2ZSE9PSExJiZUdChtLG51bGwsMTQpfX1maW5hbGx5e21uPTAsSy5sZW5ndGg9MCxrbigpLG90PSExLEVpPW51bGwsKEsubGVuZ3RofHxobi5sZW5ndGgpJiZPdCgpfX1oLmRldnRvb2xzPXZvaWQgMDt2YXIgbm49W107ZnVuY3Rpb24gTm4oYSx1KXt2YXIgbSxTO2lmKGguZGV2dG9vbHM9YSxoLmRldnRvb2xzKWguZGV2dG9vbHMuZW5hYmxlZD0hMCxubi5mb3JFYWNoKE89Pnt2YXJ7ZXZlbnQ6RixhcmdzOld9PU87cmV0dXJuIGguZGV2dG9vbHMuZW1pdChGLC4uLlcpfSksbm49W107ZWxzZSBpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LkhUTUxFbGVtZW50JiYhKChTPShtPXdpbmRvdy5uYXZpZ2F0b3IpPT09bnVsbHx8bT09PXZvaWQgMD92b2lkIDA6bS51c2VyQWdlbnQpPT09bnVsbHx8Uz09PXZvaWQgMD92b2lkIDA6Uy5pbmNsdWRlcygianNkb20iKSkpe3ZhciBJPXUuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz11Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX198fFtdO0kucHVzaChPPT57Tm4oTyx1KX0pLHNldFRpbWVvdXQoKCk9PntoLmRldnRvb2xzfHwodS5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fPW51bGwsbm49W10pfSwzZTMpfWVsc2Ugbm49W119ZnVuY3Rpb24gdW4oYSx1KXtpZighYS5pc1VubW91bnRlZCl7Zm9yKHZhciBtPWEudm5vZGUucHJvcHN8fEUuRU1QVFlfT0JKLFM9YXJndW1lbnRzLmxlbmd0aCxJPW5ldyBBcnJheShTPjI/Uy0yOjApLE89MjtPPFM7TysrKUlbTy0yXT1hcmd1bWVudHNbT107dmFyIEY9SSxXPXUuc3RhcnRzV2l0aCgidXBkYXRlOiIpLEc9VyYmdS5zbGljZSg3KTtpZihHJiZHIGluIG0pe3ZhciBsZT0iIi5jb25jYXQoRz09PSJtb2RlbFZhbHVlIj8ibW9kZWwiOkcsIk1vZGlmaWVycyIpLHtudW1iZXI6emUsdHJpbTppdH09bVtsZV18fEUuRU1QVFlfT0JKO2l0JiYoRj1JLm1hcChfdD0+RS5pc1N0cmluZyhfdCk/X3QudHJpbSgpOl90KSksemUmJihGPUkubWFwKEUubG9vc2VUb051bWJlcikpfXZhciBkZSxHZT1tW2RlPUUudG9IYW5kbGVyS2V5KHUpXXx8bVtkZT1FLnRvSGFuZGxlcktleShFLmNhbWVsaXplKHUpKV07IUdlJiZXJiYoR2U9bVtkZT1FLnRvSGFuZGxlcktleShFLmh5cGhlbmF0ZSh1KSldKSxHZSYmUChHZSxhLDYsRik7dmFyIHFlPW1bZGUrIk9uY2UiXTtpZihxZSl7aWYoIWEuZW1pdHRlZClhLmVtaXR0ZWQ9e307ZWxzZSBpZihhLmVtaXR0ZWRbZGVdKXJldHVybjthLmVtaXR0ZWRbZGVdPSEwLFAocWUsYSw2LEYpfX19ZnVuY3Rpb24gYXIoYSx1KXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsUz11LmVtaXRzQ2FjaGUsST1TLmdldChhKTtpZihJIT09dm9pZCAwKXJldHVybiBJO3ZhciBPPWEuZW1pdHMsRj17fSxXPSExO2lmKCFFLmlzRnVuY3Rpb24oYSkpe3ZhciBHPWxlPT57dmFyIHplPWFyKGxlLHUsITApO3plJiYoVz0hMCxFLmV4dGVuZChGLHplKSl9OyFtJiZ1Lm1peGlucy5sZW5ndGgmJnUubWl4aW5zLmZvckVhY2goRyksYS5leHRlbmRzJiZHKGEuZXh0ZW5kcyksYS5taXhpbnMmJmEubWl4aW5zLmZvckVhY2goRyl9cmV0dXJuIU8mJiFXPyhFLmlzT2JqZWN0KGEpJiZTLnNldChhLG51bGwpLG51bGwpOihFLmlzQXJyYXkoTyk/Ty5mb3JFYWNoKGxlPT5GW2xlXT1udWxsKTpFLmV4dGVuZChGLE8pLEUuaXNPYmplY3QoYSkmJlMuc2V0KGEsRiksRil9ZnVuY3Rpb24gVm4oYSx1KXtyZXR1cm4hYXx8IUUuaXNPbih1KT8hMToodT11LnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywiIiksRS5oYXNPd24oYSx1WzBdLnRvTG93ZXJDYXNlKCkrdS5zbGljZSgxKSl8fEUuaGFzT3duKGEsRS5oeXBoZW5hdGUodSkpfHxFLmhhc093bihhLHUpKX12YXIgUG49bnVsbCxfbj1udWxsO2Z1bmN0aW9uIGJyKGEpe3ZhciB1PVBuO3JldHVybiBQbj1hLF9uPWEmJmEudHlwZS5fX3Njb3BlSWR8fG51bGwsdX1mdW5jdGlvbiBlaShhKXtfbj1hfWZ1bmN0aW9uIGdvKCl7X249bnVsbH12YXIgZmE9YT0+QW87ZnVuY3Rpb24gQW8oYSl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOlBuO2lmKCF1fHxhLl9uKXJldHVybiBhO3ZhciBtPWZ1bmN0aW9uKCl7bS5fZCYmanQoLTEpO3ZhciBTPWJyKHUpLEk7dHJ5e0k9YSguLi5hcmd1bWVudHMpfWZpbmFsbHl7YnIoUyksbS5fZCYmanQoMSl9cmV0dXJuIEl9O3JldHVybiBtLl9uPSEwLG0uX2M9ITAsbS5fZD0hMCxtfWZ1bmN0aW9uIEpvKCl7fWZ1bmN0aW9uIEtvKGEpe3Zhcnt0eXBlOnUsdm5vZGU6bSxwcm94eTpTLHdpdGhQcm94eTpJLHByb3BzOk8scHJvcHNPcHRpb25zOltGXSxzbG90czpXLGF0dHJzOkcsZW1pdDpsZSxyZW5kZXI6emUscmVuZGVyQ2FjaGU6aXQsZGF0YTpkZSxzZXR1cFN0YXRlOkdlLGN0eDpxZSxpbmhlcml0QXR0cnM6X3R9PWEsYXQsU2UsYmU9YnIoYSk7dHJ5e2lmKG0uc2hhcGVGbGFnJjQpe3ZhciBDZT1JfHxTO2F0PXpuKHplLmNhbGwoQ2UsQ2UsaXQsTyxHZSxkZSxxZSkpLFNlPUd9ZWxzZXt2YXIgc3Q9dTthdD16bihzdC5sZW5ndGg+MT9zdChPLHthdHRyczpHLHNsb3RzOlcsZW1pdDpsZX0pOnN0KE8sbnVsbCkpLFNlPXUucHJvcHM/RzpScihHKX19Y2F0Y2gobCl7VGUubGVuZ3RoPTAsQ3QobCxhLDEpLGF0PSR0KGNlKX12YXIgRmU9YXQ7aWYoU2UmJl90IT09ITEpe3ZhciBQdD1PYmplY3Qua2V5cyhTZSkse3NoYXBlRmxhZzppfT1GZTtQdC5sZW5ndGgmJmkmKDF8NikmJihGJiZQdC5zb21lKEUuaXNNb2RlbExpc3RlbmVyKSYmKFNlPXppKFNlLEYpKSxGZT1waShGZSxTZSkpfXJldHVybiBtLmRpcnMmJihGZT1waShGZSksRmUuZGlycz1GZS5kaXJzP0ZlLmRpcnMuY29uY2F0KG0uZGlycyk6bS5kaXJzKSxtLnRyYW5zaXRpb24mJihGZS50cmFuc2l0aW9uPW0udHJhbnNpdGlvbiksYXQ9RmUsYnIoYmUpLGF0fWZ1bmN0aW9uIFJpKGEpe2Zvcih2YXIgdSxtPTA7bTxhLmxlbmd0aDttKyspe3ZhciBTPWFbbV07aWYodm4oUykpe2lmKFMudHlwZSE9PWNlfHxTLmNoaWxkcmVuPT09InYtaWYiKXtpZih1KXJldHVybjt1PVN9fWVsc2UgcmV0dXJufXJldHVybiB1fXZhciBScj1hPT57dmFyIHU7Zm9yKHZhciBtIGluIGEpKG09PT0iY2xhc3MifHxtPT09InN0eWxlInx8RS5pc09uKG0pKSYmKCh1fHwodT17fSkpW21dPWFbbV0pO3JldHVybiB1fSx6aT0oYSx1KT0+e3ZhciBtPXt9O2Zvcih2YXIgUyBpbiBhKSghRS5pc01vZGVsTGlzdGVuZXIoUyl8fCEoUy5zbGljZSg5KWluIHUpKSYmKG1bU109YVtTXSk7cmV0dXJuIG19O2Z1bmN0aW9uIFdpKGEsdSxtKXt2YXJ7cHJvcHM6UyxjaGlsZHJlbjpJLGNvbXBvbmVudDpPfT1hLHtwcm9wczpGLGNoaWxkcmVuOlcscGF0Y2hGbGFnOkd9PXUsbGU9Ty5lbWl0c09wdGlvbnM7aWYodS5kaXJzfHx1LnRyYW5zaXRpb24pcmV0dXJuITA7aWYobSYmRz49MCl7aWYoRyYxMDI0KXJldHVybiEwO2lmKEcmMTYpcmV0dXJuIFM/cm8oUyxGLGxlKTohIUY7aWYoRyY4KWZvcih2YXIgemU9dS5keW5hbWljUHJvcHMsaXQ9MDtpdDx6ZS5sZW5ndGg7aXQrKyl7dmFyIGRlPXplW2l0XTtpZihGW2RlXSE9PVNbZGVdJiYhVm4obGUsZGUpKXJldHVybiEwfX1lbHNlIHJldHVybihJfHxXKSYmKCFXfHwhVy4kc3RhYmxlKT8hMDpTPT09Rj8hMTpTP0Y/cm8oUyxGLGxlKTohMDohIUY7cmV0dXJuITF9ZnVuY3Rpb24gcm8oYSx1LG0pe3ZhciBTPU9iamVjdC5rZXlzKHUpO2lmKFMubGVuZ3RoIT09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgST0wO0k8Uy5sZW5ndGg7SSsrKXt2YXIgTz1TW0ldO2lmKHVbT10hPT1hW09dJiYhVm4obSxPKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBpbyhhLHUpe2Zvcih2YXJ7dm5vZGU6bSxwYXJlbnQ6U309YTtTJiZTLnN1YlRyZWU9PT1tOykobT1TLnZub2RlKS5lbD11LFM9Uy5wYXJlbnR9dmFyIGxpPWE9PmEuX19pc1N1c3BlbnNlLHBvPXtuYW1lOiJTdXNwZW5zZSIsX19pc1N1c3BlbnNlOiEwLHByb2Nlc3MoYSx1LG0sUyxJLE8sRixXLEcsbGUpe2E9PW51bGw/VHIodSxtLFMsSSxPLEYsVyxHLGxlKTpjaShhLHUsbSxTLEksRixXLEcsbGUpfSxoeWRyYXRlOnZvLGNyZWF0ZTpmcixub3JtYWxpemU6Wm99LE9vPXBvO2Z1bmN0aW9uIHhuKGEsdSl7dmFyIG09YS5wcm9wcyYmYS5wcm9wc1t1XTtFLmlzRnVuY3Rpb24obSkmJm0oKX1mdW5jdGlvbiBUcihhLHUsbSxTLEksTyxGLFcsRyl7dmFye3A6bGUsbzp7Y3JlYXRlRWxlbWVudDp6ZX19PUcsaXQ9emUoImRpdiIpLGRlPWEuc3VzcGVuc2U9ZnIoYSxJLFMsdSxpdCxtLE8sRixXLEcpO2xlKG51bGwsZGUucGVuZGluZ0JyYW5jaD1hLnNzQ29udGVudCxpdCxudWxsLFMsZGUsTyxGKSxkZS5kZXBzPjA/KHhuKGEsIm9uUGVuZGluZyIpLHhuKGEsIm9uRmFsbGJhY2siKSxsZShudWxsLGEuc3NGYWxsYmFjayx1LG0sUyxudWxsLE8sRiksc3IoZGUsYS5zc0ZhbGxiYWNrKSk6ZGUucmVzb2x2ZSgpfWZ1bmN0aW9uIGNpKGEsdSxtLFMsSSxPLEYsVyxHKXt2YXJ7cDpsZSx1bTp6ZSxvOntjcmVhdGVFbGVtZW50Oml0fX09RyxkZT11LnN1c3BlbnNlPWEuc3VzcGVuc2U7ZGUudm5vZGU9dSx1LmVsPWEuZWw7dmFyIEdlPXUuc3NDb250ZW50LHFlPXUuc3NGYWxsYmFjayx7YWN0aXZlQnJhbmNoOl90LHBlbmRpbmdCcmFuY2g6YXQsaXNJbkZhbGxiYWNrOlNlLGlzSHlkcmF0aW5nOmJlfT1kZTtpZihhdClkZS5wZW5kaW5nQnJhbmNoPUdlLHF0KEdlLGF0KT8obGUoYXQsR2UsZGUuaGlkZGVuQ29udGFpbmVyLG51bGwsSSxkZSxPLEYsVyksZGUuZGVwczw9MD9kZS5yZXNvbHZlKCk6U2UmJihsZShfdCxxZSxtLFMsSSxudWxsLE8sRixXKSxzcihkZSxxZSkpKTooZGUucGVuZGluZ0lkKyssYmU/KGRlLmlzSHlkcmF0aW5nPSExLGRlLmFjdGl2ZUJyYW5jaD1hdCk6emUoYXQsSSxkZSksZGUuZGVwcz0wLGRlLmVmZmVjdHMubGVuZ3RoPTAsZGUuaGlkZGVuQ29udGFpbmVyPWl0KCJkaXYiKSxTZT8obGUobnVsbCxHZSxkZS5oaWRkZW5Db250YWluZXIsbnVsbCxJLGRlLE8sRixXKSxkZS5kZXBzPD0wP2RlLnJlc29sdmUoKToobGUoX3QscWUsbSxTLEksbnVsbCxPLEYsVyksc3IoZGUscWUpKSk6X3QmJnF0KEdlLF90KT8obGUoX3QsR2UsbSxTLEksZGUsTyxGLFcpLGRlLnJlc29sdmUoITApKToobGUobnVsbCxHZSxkZS5oaWRkZW5Db250YWluZXIsbnVsbCxJLGRlLE8sRixXKSxkZS5kZXBzPD0wJiZkZS5yZXNvbHZlKCkpKTtlbHNlIGlmKF90JiZxdChHZSxfdCkpbGUoX3QsR2UsbSxTLEksZGUsTyxGLFcpLHNyKGRlLEdlKTtlbHNlIGlmKHhuKHUsIm9uUGVuZGluZyIpLGRlLnBlbmRpbmdCcmFuY2g9R2UsZGUucGVuZGluZ0lkKyssbGUobnVsbCxHZSxkZS5oaWRkZW5Db250YWluZXIsbnVsbCxJLGRlLE8sRixXKSxkZS5kZXBzPD0wKWRlLnJlc29sdmUoKTtlbHNle3Zhcnt0aW1lb3V0OkNlLHBlbmRpbmdJZDpzdH09ZGU7Q2U+MD9zZXRUaW1lb3V0KCgpPT57ZGUucGVuZGluZ0lkPT09c3QmJmRlLmZhbGxiYWNrKHFlKX0sQ2UpOkNlPT09MCYmZGUuZmFsbGJhY2socWUpfX1mdW5jdGlvbiBmcihhLHUsbSxTLEksTyxGLFcsRyxsZSl7dmFyIHplPWFyZ3VtZW50cy5sZW5ndGg+MTAmJmFyZ3VtZW50c1sxMF0hPT12b2lkIDA/YXJndW1lbnRzWzEwXTohMSx7cDppdCxtOmRlLHVtOkdlLG46cWUsbzp7cGFyZW50Tm9kZTpfdCxyZW1vdmU6YXR9fT1sZSxTZT1hLnByb3BzP0UudG9OdW1iZXIoYS5wcm9wcy50aW1lb3V0KTp2b2lkIDAsYmU9e3Zub2RlOmEscGFyZW50OnUscGFyZW50Q29tcG9uZW50Om0saXNTVkc6Rixjb250YWluZXI6UyxoaWRkZW5Db250YWluZXI6SSxhbmNob3I6TyxkZXBzOjAscGVuZGluZ0lkOjAsdGltZW91dDp0eXBlb2YgU2U9PSJudW1iZXIiP1NlOi0xLGFjdGl2ZUJyYW5jaDpudWxsLHBlbmRpbmdCcmFuY2g6bnVsbCxpc0luRmFsbGJhY2s6ITAsaXNIeWRyYXRpbmc6emUsaXNVbm1vdW50ZWQ6ITEsZWZmZWN0czpbXSxyZXNvbHZlKCl7dmFyIENlPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTohMSx7dm5vZGU6c3QsYWN0aXZlQnJhbmNoOkZlLHBlbmRpbmdCcmFuY2g6UHQscGVuZGluZ0lkOmksZWZmZWN0czpsLHBhcmVudENvbXBvbmVudDpkLGNvbnRhaW5lcjpffT1iZTtpZihiZS5pc0h5ZHJhdGluZyliZS5pc0h5ZHJhdGluZz0hMTtlbHNlIGlmKCFDZSl7dmFyIEE9RmUmJlB0LnRyYW5zaXRpb24mJlB0LnRyYW5zaXRpb24ubW9kZT09PSJvdXQtaW4iO0EmJihGZS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9KCk9PntpPT09YmUucGVuZGluZ0lkJiZkZShQdCxfLEMsMCl9KTt2YXJ7YW5jaG9yOkN9PWJlO0ZlJiYoQz1xZShGZSksR2UoRmUsZCxiZSwhMCkpLEF8fGRlKFB0LF8sQywwKX1zcihiZSxQdCksYmUucGVuZGluZ0JyYW5jaD1udWxsLGJlLmlzSW5GYWxsYmFjaz0hMTtmb3IodmFyIGs9YmUucGFyZW50LEw9ITE7azspe2lmKGsucGVuZGluZ0JyYW5jaCl7ay5lZmZlY3RzLnB1c2goLi4ubCksTD0hMDticmVha31rPWsucGFyZW50fUx8fFFyKGwpLGJlLmVmZmVjdHM9W10seG4oc3QsIm9uUmVzb2x2ZSIpfSxmYWxsYmFjayhDZSl7aWYoISFiZS5wZW5kaW5nQnJhbmNoKXt2YXJ7dm5vZGU6c3QsYWN0aXZlQnJhbmNoOkZlLHBhcmVudENvbXBvbmVudDpQdCxjb250YWluZXI6aSxpc1NWRzpsfT1iZTt4bihzdCwib25GYWxsYmFjayIpO3ZhciBkPXFlKEZlKSxfPSgpPT57IWJlLmlzSW5GYWxsYmFja3x8KGl0KG51bGwsQ2UsaSxkLFB0LG51bGwsbCxXLEcpLHNyKGJlLENlKSl9LEE9Q2UudHJhbnNpdGlvbiYmQ2UudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7QSYmKEZlLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZT1fKSxiZS5pc0luRmFsbGJhY2s9ITAsR2UoRmUsUHQsbnVsbCwhMCksQXx8XygpfX0sbW92ZShDZSxzdCxGZSl7YmUuYWN0aXZlQnJhbmNoJiZkZShiZS5hY3RpdmVCcmFuY2gsQ2Usc3QsRmUpLGJlLmNvbnRhaW5lcj1DZX0sbmV4dCgpe3JldHVybiBiZS5hY3RpdmVCcmFuY2gmJnFlKGJlLmFjdGl2ZUJyYW5jaCl9LHJlZ2lzdGVyRGVwKENlLHN0KXt2YXIgRmU9ISFiZS5wZW5kaW5nQnJhbmNoO0ZlJiZiZS5kZXBzKys7dmFyIFB0PUNlLnZub2RlLmVsO0NlLmFzeW5jRGVwLmNhdGNoKGk9PntDdChpLENlLDApfSkudGhlbihpPT57aWYoIShDZS5pc1VubW91bnRlZHx8YmUuaXNVbm1vdW50ZWR8fGJlLnBlbmRpbmdJZCE9PUNlLnN1c3BlbnNlSWQpKXtDZS5hc3luY1Jlc29sdmVkPSEwO3Zhcnt2bm9kZTpsfT1DZTtJYShDZSxpLCExKSxQdCYmKGwuZWw9UHQpO3ZhciBkPSFQdCYmQ2Uuc3ViVHJlZS5lbDtzdChDZSxsLF90KFB0fHxDZS5zdWJUcmVlLmVsKSxQdD9udWxsOnFlKENlLnN1YlRyZWUpLGJlLEYsRyksZCYmYXQoZCksaW8oQ2UsbC5lbCksRmUmJi0tYmUuZGVwcz09PTAmJmJlLnJlc29sdmUoKX19KX0sdW5tb3VudChDZSxzdCl7YmUuaXNVbm1vdW50ZWQ9ITAsYmUuYWN0aXZlQnJhbmNoJiZHZShiZS5hY3RpdmVCcmFuY2gsbSxDZSxzdCksYmUucGVuZGluZ0JyYW5jaCYmR2UoYmUucGVuZGluZ0JyYW5jaCxtLENlLHN0KX19O3JldHVybiBiZX1mdW5jdGlvbiB2byhhLHUsbSxTLEksTyxGLFcsRyl7dmFyIGxlPXUuc3VzcGVuc2U9ZnIodSxTLG0sYS5wYXJlbnROb2RlLHMuY3JlYXRlRWxlbWVudCgiZGl2IiksbnVsbCxJLE8sRixXLCEwKSx6ZT1HKGEsbGUucGVuZGluZ0JyYW5jaD11LnNzQ29udGVudCxtLGxlLE8sRik7cmV0dXJuIGxlLmRlcHM9PT0wJiZsZS5yZXNvbHZlKCksemV9ZnVuY3Rpb24gWm8oYSl7dmFye3NoYXBlRmxhZzp1LGNoaWxkcmVuOm19PWEsUz11JjMyO2Euc3NDb250ZW50PVRvKFM/bS5kZWZhdWx0Om0pLGEuc3NGYWxsYmFjaz1TP1RvKG0uZmFsbGJhY2spOiR0KGNlKX1mdW5jdGlvbiBUbyhhKXt2YXIgdTtpZihFLmlzRnVuY3Rpb24oYSkpe3ZhciBtPXB0JiZhLl9jO20mJihhLl9kPSExLHdlKCkpLGE9YSgpLG0mJihhLl9kPSEwLHU9ZmUsbHQoKSl9aWYoRS5pc0FycmF5KGEpKXt2YXIgUz1SaShhKTthPVN9cmV0dXJuIGE9em4oYSksdSYmIWEuZHluYW1pY0NoaWxkcmVuJiYoYS5keW5hbWljQ2hpbGRyZW49dS5maWx0ZXIoST0+SSE9PWEpKSxhfWZ1bmN0aW9uIFNpKGEsdSl7dSYmdS5wZW5kaW5nQnJhbmNoP0UuaXNBcnJheShhKT91LmVmZmVjdHMucHVzaCguLi5hKTp1LmVmZmVjdHMucHVzaChhKTpRcihhKX1mdW5jdGlvbiBzcihhLHUpe2EuYWN0aXZlQnJhbmNoPXU7dmFye3Zub2RlOm0scGFyZW50Q29tcG9uZW50OlN9PWEsST1tLmVsPXUuZWw7UyYmUy5zdWJUcmVlPT09bSYmKFMudm5vZGUuZWw9SSxpbyhTLEkpKX1mdW5jdGlvbiB1aShhLHUpe2lmKGxuKXt2YXIgbT1sbi5wcm92aWRlcyxTPWxuLnBhcmVudCYmbG4ucGFyZW50LnByb3ZpZGVzO1M9PT1tJiYobT1sbi5wcm92aWRlcz1PYmplY3QuY3JlYXRlKFMpKSxtW2FdPXUsbG4udHlwZS5tcFR5cGU9PT0iYXBwIiYmbG4uYXBwQ29udGV4dC5hcHAucHJvdmlkZShhLHUpfX1mdW5jdGlvbiBscihhLHUpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxTPWxufHxQbjtpZihTKXt2YXIgST1TLnBhcmVudD09bnVsbD9TLnZub2RlLmFwcENvbnRleHQmJlMudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlczpTLnBhcmVudC5wcm92aWRlcztpZihJJiZhIGluIEkpcmV0dXJuIElbYV07aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiBtJiZFLmlzRnVuY3Rpb24odSk/dS5jYWxsKFMucHJveHkpOnV9fWZ1bmN0aW9uIFFuKGEsdSl7cmV0dXJuIEJyKGEsbnVsbCx1KX1mdW5jdGlvbiB4aShhLHUpe3JldHVybiBCcihhLG51bGwse2ZsdXNoOiJwb3N0In0pfWZ1bmN0aW9uIG9vKGEsdSl7cmV0dXJuIEJyKGEsbnVsbCx7Zmx1c2g6InN5bmMifSl9dmFyIHRpPXt9O2Z1bmN0aW9uIHhyKGEsdSxtKXtyZXR1cm4gQnIoYSx1LG0pfWZ1bmN0aW9uIEJyKGEsdSl7dmFye2ltbWVkaWF0ZTptLGRlZXA6UyxmbHVzaDpJLG9uVHJhY2s6TyxvblRyaWdnZXI6Rn09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOkUuRU1QVFlfT0JKLFc9Ui5nZXRDdXJyZW50U2NvcGUoKT09PShsbj09bnVsbD92b2lkIDA6bG4uc2NvcGUpP2xuOm51bGwsRyxsZT0hMSx6ZT0hMTtpZihSLmlzUmVmKGEpPyhHPSgpPT5hLnZhbHVlLGxlPVIuaXNTaGFsbG93KGEpKTpSLmlzUmVhY3RpdmUoYSk/KEc9KCk9PmEsUz0hMCk6RS5pc0FycmF5KGEpPyh6ZT0hMCxsZT1hLnNvbWUoQ2U9PlIuaXNSZWFjdGl2ZShDZSl8fFIuaXNTaGFsbG93KENlKSksRz0oKT0+YS5tYXAoQ2U9PntpZihSLmlzUmVmKENlKSlyZXR1cm4gQ2UudmFsdWU7aWYoUi5pc1JlYWN0aXZlKENlKSlyZXR1cm4gSHIoQ2UpO2lmKEUuaXNGdW5jdGlvbihDZSkpcmV0dXJuIFR0KENlLFcsMil9KSk6RS5pc0Z1bmN0aW9uKGEpP3U/Rz0oKT0+VHQoYSxXLDIpOkc9KCk9PntpZighKFcmJlcuaXNVbm1vdW50ZWQpKXJldHVybiBkZSYmZGUoKSxQKGEsVywzLFtHZV0pfTpHPUUuTk9PUCx1JiZTKXt2YXIgaXQ9RztHPSgpPT5IcihpdCgpKX12YXIgZGUsR2U9Q2U9PntkZT1TZS5vblN0b3A9KCk9PntUdChDZSxXLDQpfX0scWU9emU/bmV3IEFycmF5KGEubGVuZ3RoKS5maWxsKHRpKTp0aSxfdD0oKT0+e2lmKCEhU2UuYWN0aXZlKWlmKHUpe3ZhciBDZT1TZS5ydW4oKTsoU3x8bGV8fCh6ZT9DZS5zb21lKChzdCxGZSk9PkUuaGFzQ2hhbmdlZChzdCxxZVtGZV0pKTpFLmhhc0NoYW5nZWQoQ2UscWUpKSkmJihkZSYmZGUoKSxQKHUsVywzLFtDZSxxZT09PXRpP3ZvaWQgMDp6ZSYmcWVbMF09PT10aT9bXTpxZSxHZV0pLHFlPUNlKX1lbHNlIFNlLnJ1bigpfTtfdC5hbGxvd1JlY3Vyc2U9ISF1O3ZhciBhdDtJPT09InN5bmMiP2F0PV90Okk9PT0icG9zdCI/YXQ9KCk9PmhyKF90LFcmJlcuc3VzcGVuc2UpOihfdC5wcmU9ITAsVyYmKF90LmlkPVcudWlkKSxhdD0oKT0+Q24oX3QpKTt2YXIgU2U9bmV3IFIuUmVhY3RpdmVFZmZlY3QoRyxhdCk7dT9tP190KCk6cWU9U2UucnVuKCk6ST09PSJwb3N0Ij9ocihTZS5ydW4uYmluZChTZSksVyYmVy5zdXNwZW5zZSk6U2UucnVuKCk7dmFyIGJlPSgpPT57U2Uuc3RvcCgpLFcmJlcuc2NvcGUmJkUucmVtb3ZlKFcuc2NvcGUuZWZmZWN0cyxTZSl9O3JldHVybiBiZX1mdW5jdGlvbiB3aShhLHUsbSl7dmFyIFM9dGhpcy5wcm94eSxJPUUuaXNTdHJpbmcoYSk/YS5pbmNsdWRlcygiLiIpP1BvKFMsYSk6KCk9PlNbYV06YS5iaW5kKFMsUyksTztFLmlzRnVuY3Rpb24odSk/Tz11OihPPXUuaGFuZGxlcixtPXUpO3ZhciBGPWxuO1luKHRoaXMpO3ZhciBXPUJyKEksTy5iaW5kKFMpLG0pO3JldHVybiBGP1luKEYpOlpuKCksV31mdW5jdGlvbiBQbyhhLHUpe3ZhciBtPXUuc3BsaXQoIi4iKTtyZXR1cm4oKT0+e2Zvcih2YXIgUz1hLEk9MDtJPG0ubGVuZ3RoJiZTO0krKylTPVNbbVtJXV07cmV0dXJuIFN9fWZ1bmN0aW9uIEhyKGEsdSl7aWYoIUUuaXNPYmplY3QoYSl8fGEuX192X3NraXB8fCh1PXV8fG5ldyBTZXQsdS5oYXMoYSkpKXJldHVybiBhO2lmKHUuYWRkKGEpLFIuaXNSZWYoYSkpSHIoYS52YWx1ZSx1KTtlbHNlIGlmKEUuaXNBcnJheShhKSlmb3IodmFyIG09MDttPGEubGVuZ3RoO20rKylIcihhW21dLHUpO2Vsc2UgaWYoRS5pc1NldChhKXx8RS5pc01hcChhKSlhLmZvckVhY2goST0+e0hyKEksdSl9KTtlbHNlIGlmKEUuaXNQbGFpbk9iamVjdChhKSlmb3IodmFyIFMgaW4gYSlIcihhW1NdLHUpO3JldHVybiBhfWZ1bmN0aW9uIE1yKCl7dmFyIGE9e2lzTW91bnRlZDohMSxpc0xlYXZpbmc6ITEsaXNVbm1vdW50aW5nOiExLGxlYXZpbmdWTm9kZXM6bmV3IE1hcH07cmV0dXJuIHJyKCgpPT57YS5pc01vdW50ZWQ9ITB9KSxlcigoKT0+e2EuaXNVbm1vdW50aW5nPSEwfSksYX12YXIgRXI9W0Z1bmN0aW9uLEFycmF5XSxnbj17bW9kZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4scGVyc2lzdGVkOkJvb2xlYW4sb25CZWZvcmVFbnRlcjpFcixvbkVudGVyOkVyLG9uQWZ0ZXJFbnRlcjpFcixvbkVudGVyQ2FuY2VsbGVkOkVyLG9uQmVmb3JlTGVhdmU6RXIsb25MZWF2ZTpFcixvbkFmdGVyTGVhdmU6RXIsb25MZWF2ZUNhbmNlbGxlZDpFcixvbkJlZm9yZUFwcGVhcjpFcixvbkFwcGVhcjpFcixvbkFmdGVyQXBwZWFyOkVyLG9uQXBwZWFyQ2FuY2VsbGVkOkVyfSxmaT17bmFtZToiQmFzZVRyYW5zaXRpb24iLHByb3BzOmduLHNldHVwKGEsdSl7dmFye3Nsb3RzOm19PXUsUz15bigpLEk9TXIoKSxPO3JldHVybigpPT57dmFyIEY9bS5kZWZhdWx0JiZqcihtLmRlZmF1bHQoKSwhMCk7aWYoISghRnx8IUYubGVuZ3RoKSl7dmFyIFc9RlswXTtpZihGLmxlbmd0aD4xKXtmb3IodmFyIEcgb2YgRilpZihHLnR5cGUhPT1jZSl7Vz1HO2JyZWFrfX12YXIgbGU9Ui50b1JhdyhhKSx7bW9kZTp6ZX09bGU7aWYoSS5pc0xlYXZpbmcpcmV0dXJuIG5pKFcpO3ZhciBpdD1HaShXKTtpZighaXQpcmV0dXJuIG5pKFcpO3ZhciBkZT1FZShpdCxsZSxJLFMpO0t0KGl0LGRlKTt2YXIgR2U9Uy5zdWJUcmVlLHFlPUdlJiZHaShHZSksX3Q9ITEse2dldFRyYW5zaXRpb25LZXk6YXR9PWl0LnR5cGU7aWYoYXQpe3ZhciBTZT1hdCgpO089PT12b2lkIDA/Tz1TZTpTZSE9PU8mJihPPVNlLF90PSEwKX1pZihxZSYmcWUudHlwZSE9PWNlJiYoIXF0KGl0LHFlKXx8X3QpKXt2YXIgYmU9RWUocWUsbGUsSSxTKTtpZihLdChxZSxiZSksemU9PT0ib3V0LWluIilyZXR1cm4gSS5pc0xlYXZpbmc9ITAsYmUuYWZ0ZXJMZWF2ZT0oKT0+e0kuaXNMZWF2aW5nPSExLFMudXBkYXRlLmFjdGl2ZSE9PSExJiZTLnVwZGF0ZSgpfSxuaShXKTt6ZT09PSJpbi1vdXQiJiZpdC50eXBlIT09Y2UmJihiZS5kZWxheUxlYXZlPShDZSxzdCxGZSk9Pnt2YXIgUHQ9THQoSSxxZSk7UHRbU3RyaW5nKHFlLmtleSldPXFlLENlLl9sZWF2ZUNiPSgpPT57c3QoKSxDZS5fbGVhdmVDYj12b2lkIDAsZGVsZXRlIGRlLmRlbGF5ZWRMZWF2ZX0sZGUuZGVsYXllZExlYXZlPUZlfSl9cmV0dXJuIFd9fX19LFByPWZpO2Z1bmN0aW9uIEx0KGEsdSl7dmFye2xlYXZpbmdWTm9kZXM6bX09YSxTPW0uZ2V0KHUudHlwZSk7cmV0dXJuIFN8fChTPU9iamVjdC5jcmVhdGUobnVsbCksbS5zZXQodS50eXBlLFMpKSxTfWZ1bmN0aW9uIEVlKGEsdSxtLFMpe3ZhcnthcHBlYXI6SSxtb2RlOk8scGVyc2lzdGVkOkY9ITEsb25CZWZvcmVFbnRlcjpXLG9uRW50ZXI6RyxvbkFmdGVyRW50ZXI6bGUsb25FbnRlckNhbmNlbGxlZDp6ZSxvbkJlZm9yZUxlYXZlOml0LG9uTGVhdmU6ZGUsb25BZnRlckxlYXZlOkdlLG9uTGVhdmVDYW5jZWxsZWQ6cWUsb25CZWZvcmVBcHBlYXI6X3Qsb25BcHBlYXI6YXQsb25BZnRlckFwcGVhcjpTZSxvbkFwcGVhckNhbmNlbGxlZDpiZX09dSxDZT1TdHJpbmcoYS5rZXkpLHN0PUx0KG0sYSksRmU9KGwsZCk9PntsJiZQKGwsUyw5LGQpfSxQdD0obCxkKT0+e3ZhciBfPWRbMV07RmUobCxkKSxFLmlzQXJyYXkobCk/bC5ldmVyeShBPT5BLmxlbmd0aDw9MSkmJl8oKTpsLmxlbmd0aDw9MSYmXygpfSxpPXttb2RlOk8scGVyc2lzdGVkOkYsYmVmb3JlRW50ZXIobCl7dmFyIGQ9VztpZighbS5pc01vdW50ZWQpaWYoSSlkPV90fHxXO2Vsc2UgcmV0dXJuO2wuX2xlYXZlQ2ImJmwuX2xlYXZlQ2IoITApO3ZhciBfPXN0W0NlXTtfJiZxdChhLF8pJiZfLmVsLl9sZWF2ZUNiJiZfLmVsLl9sZWF2ZUNiKCksRmUoZCxbbF0pfSxlbnRlcihsKXt2YXIgZD1HLF89bGUsQT16ZTtpZighbS5pc01vdW50ZWQpaWYoSSlkPWF0fHxHLF89U2V8fGxlLEE9YmV8fHplO2Vsc2UgcmV0dXJuO3ZhciBDPSExLGs9bC5fZW50ZXJDYj1MPT57Q3x8KEM9ITAsTD9GZShBLFtsXSk6RmUoXyxbbF0pLGkuZGVsYXllZExlYXZlJiZpLmRlbGF5ZWRMZWF2ZSgpLGwuX2VudGVyQ2I9dm9pZCAwKX07ZD9QdChkLFtsLGtdKTprKCl9LGxlYXZlKGwsZCl7dmFyIF89U3RyaW5nKGEua2V5KTtpZihsLl9lbnRlckNiJiZsLl9lbnRlckNiKCEwKSxtLmlzVW5tb3VudGluZylyZXR1cm4gZCgpO0ZlKGl0LFtsXSk7dmFyIEE9ITEsQz1sLl9sZWF2ZUNiPWs9PntBfHwoQT0hMCxkKCksaz9GZShxZSxbbF0pOkZlKEdlLFtsXSksbC5fbGVhdmVDYj12b2lkIDAsc3RbX109PT1hJiZkZWxldGUgc3RbX10pfTtzdFtfXT1hLGRlP1B0KGRlLFtsLENdKTpDKCl9LGNsb25lKGwpe3JldHVybiBFZShsLHUsbSxTKX19O3JldHVybiBpfWZ1bmN0aW9uIG5pKGEpe2lmKEJuKGEpKXJldHVybiBhPXBpKGEpLGEuY2hpbGRyZW49bnVsbCxhfWZ1bmN0aW9uIEdpKGEpe3JldHVybiBCbihhKT9hLmNoaWxkcmVuP2EuY2hpbGRyZW5bMF06dm9pZCAwOmF9ZnVuY3Rpb24gS3QoYSx1KXthLnNoYXBlRmxhZyY2JiZhLmNvbXBvbmVudD9LdChhLmNvbXBvbmVudC5zdWJUcmVlLHUpOmEuc2hhcGVGbGFnJjEyOD8oYS5zc0NvbnRlbnQudHJhbnNpdGlvbj11LmNsb25lKGEuc3NDb250ZW50KSxhLnNzRmFsbGJhY2sudHJhbnNpdGlvbj11LmNsb25lKGEuc3NGYWxsYmFjaykpOmEudHJhbnNpdGlvbj11fWZ1bmN0aW9uIGpyKGEpe2Zvcih2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITEsbT1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCxTPVtdLEk9MCxPPTA7TzxhLmxlbmd0aDtPKyspe3ZhciBGPWFbT10sVz1tPT1udWxsP0Yua2V5OlN0cmluZyhtKStTdHJpbmcoRi5rZXkhPW51bGw/Ri5rZXk6Tyk7Ri50eXBlPT09Sj8oRi5wYXRjaEZsYWcmMTI4JiZJKyssUz1TLmNvbmNhdChqcihGLmNoaWxkcmVuLHUsVykpKToodXx8Ri50eXBlIT09Y2UpJiZTLnB1c2goVyE9bnVsbD9waShGLHtrZXk6V30pOkYpfWlmKEk+MSlmb3IodmFyIEc9MDtHPFMubGVuZ3RoO0crKylTW0ddLnBhdGNoRmxhZz0tMjtyZXR1cm4gU31mdW5jdGlvbiB6cihhKXtyZXR1cm4gRS5pc0Z1bmN0aW9uKGEpP3tzZXR1cDphLG5hbWU6YS5uYW1lfTphfXZhciBMcj1hPT4hIWEudHlwZS5fX2FzeW5jTG9hZGVyO2Z1bmN0aW9uIERyKGEpe0UuaXNGdW5jdGlvbihhKSYmKGE9e2xvYWRlcjphfSk7dmFye2xvYWRlcjp1LGxvYWRpbmdDb21wb25lbnQ6bSxlcnJvckNvbXBvbmVudDpTLGRlbGF5Okk9MjAwLHRpbWVvdXQ6TyxzdXNwZW5zaWJsZTpGPSEwLG9uRXJyb3I6V309YSxHPW51bGwsbGUsemU9MCxpdD0oKT0+KHplKyssRz1udWxsLGRlKCkpLGRlPSgpPT57dmFyIEdlO3JldHVybiBHfHwoR2U9Rz11KCkuY2F0Y2gocWU9PntpZihxZT1xZSBpbnN0YW5jZW9mIEVycm9yP3FlOm5ldyBFcnJvcihTdHJpbmcocWUpKSxXKXJldHVybiBuZXcgUHJvbWlzZSgoX3QsYXQpPT57dmFyIFNlPSgpPT5fdChpdCgpKSxiZT0oKT0+YXQocWUpO1cocWUsU2UsYmUsemUrMSl9KTt0aHJvdyBxZX0pLnRoZW4ocWU9PkdlIT09RyYmRz9HOihxZSYmKHFlLl9fZXNNb2R1bGV8fHFlW1N5bWJvbC50b1N0cmluZ1RhZ109PT0iTW9kdWxlIikmJihxZT1xZS5kZWZhdWx0KSxsZT1xZSxxZSkpKX07cmV0dXJuIHpyKHtuYW1lOiJBc3luY0NvbXBvbmVudFdyYXBwZXIiLF9fYXN5bmNMb2FkZXI6ZGUsZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiBsZX0sc2V0dXAoKXt2YXIgR2U9bG47aWYobGUpcmV0dXJuKCk9PkJpKGxlLEdlKTt2YXIgcWU9YmU9PntHPW51bGwsQ3QoYmUsR2UsMTMpfTtpZihGJiZHZS5zdXNwZW5zZSlyZXR1cm4gZGUoKS50aGVuKGJlPT4oKT0+QmkoYmUsR2UpKS5jYXRjaChiZT0+KHFlKGJlKSwoKT0+Uz8kdChTLHtlcnJvcjpiZX0pOm51bGwpKTt2YXIgX3Q9Ui5yZWYoITEpLGF0PVIucmVmKCksU2U9Ui5yZWYoISFJKTtyZXR1cm4gSSYmc2V0VGltZW91dCgoKT0+e1NlLnZhbHVlPSExfSxJKSxPIT1udWxsJiZzZXRUaW1lb3V0KCgpPT57aWYoIV90LnZhbHVlJiYhYXQudmFsdWUpe3ZhciBiZT1uZXcgRXJyb3IoIkFzeW5jIGNvbXBvbmVudCB0aW1lZCBvdXQgYWZ0ZXIgIi5jb25jYXQoTywibXMuIikpO3FlKGJlKSxhdC52YWx1ZT1iZX19LE8pLGRlKCkudGhlbigoKT0+e190LnZhbHVlPSEwLEdlLnBhcmVudCYmQm4oR2UucGFyZW50LnZub2RlKSYmQ24oR2UucGFyZW50LnVwZGF0ZSl9KS5jYXRjaChiZT0+e3FlKGJlKSxhdC52YWx1ZT1iZX0pLCgpPT57aWYoX3QudmFsdWUmJmxlKXJldHVybiBCaShsZSxHZSk7aWYoYXQudmFsdWUmJlMpcmV0dXJuICR0KFMse2Vycm9yOmF0LnZhbHVlfSk7aWYobSYmIVNlLnZhbHVlKXJldHVybiAkdChtKX19fSl9ZnVuY3Rpb24gQmkoYSx1KXt2YXJ7cmVmOm0scHJvcHM6UyxjaGlsZHJlbjpJLGNlOk99PXUudm5vZGUsRj0kdChhLFMsSSk7cmV0dXJuIEYucmVmPW0sRi5jZT1PLGRlbGV0ZSB1LnZub2RlLmNlLEZ9dmFyIEJuPWE9PmEudHlwZS5fX2lzS2VlcEFsaXZlLGRpPXtuYW1lOiJLZWVwQWxpdmUiLF9faXNLZWVwQWxpdmU6ITAscHJvcHM6e2luY2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLGV4Y2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLG1heDpbU3RyaW5nLE51bWJlcl19LHNldHVwKGEsdSl7dmFye3Nsb3RzOm19PXUsUz15bigpLEk9Uy5jdHgsTz1uZXcgTWFwLEY9bmV3IFNldCxXPW51bGwsRz1TLnN1c3BlbnNlLHtyZW5kZXJlcjp7cDpsZSxtOnplLHVtOml0LG86e2NyZWF0ZUVsZW1lbnQ6ZGV9fX09SSxHZT1kZSgiZGl2Iik7SS5hY3RpdmF0ZT0oQ2Usc3QsRmUsUHQsaSk9Pnt2YXIgbD1DZS5jb21wb25lbnQ7emUoQ2Usc3QsRmUsMCxHKSxsZShsLnZub2RlLENlLHN0LEZlLGwsRyxQdCxDZS5zbG90U2NvcGVJZHMsaSksaHIoKCk9PntsLmlzRGVhY3RpdmF0ZWQ9ITEsbC5hJiZFLmludm9rZUFycmF5Rm5zKGwuYSk7dmFyIGQ9Q2UucHJvcHMmJkNlLnByb3BzLm9uVm5vZGVNb3VudGVkO2QmJkNyKGQsbC5wYXJlbnQsQ2UpfSxHKX0sSS5kZWFjdGl2YXRlPUNlPT57dmFyIHN0PUNlLmNvbXBvbmVudDt6ZShDZSxHZSxudWxsLDEsRyksaHIoKCk9PntzdC5kYSYmRS5pbnZva2VBcnJheUZucyhzdC5kYSk7dmFyIEZlPUNlLnByb3BzJiZDZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO0ZlJiZDcihGZSxzdC5wYXJlbnQsQ2UpLHN0LmlzRGVhY3RpdmF0ZWQ9ITB9LEcpfTtmdW5jdGlvbiBxZShDZSl7WWkoQ2UpLGl0KENlLFMsRywhMCl9ZnVuY3Rpb24gX3QoQ2Upe08uZm9yRWFjaCgoc3QsRmUpPT57dmFyIFB0PVVpKHN0LnR5cGUpO1B0JiYoIUNlfHwhQ2UoUHQpKSYmYXQoRmUpfSl9ZnVuY3Rpb24gYXQoQ2Upe3ZhciBzdD1PLmdldChDZSk7IVd8fCFxdChzdCxXKT9xZShzdCk6VyYmWWkoVyksTy5kZWxldGUoQ2UpLEYuZGVsZXRlKENlKX14cigoKT0+W2EuaW5jbHVkZSxhLmV4Y2x1ZGVdLENlPT57dmFyW3N0LEZlXT1DZTtzdCYmX3QoUHQ9Pk1pKHN0LFB0KSksRmUmJl90KFB0PT4hTWkoRmUsUHQpKX0se2ZsdXNoOiJwb3N0IixkZWVwOiEwfSk7dmFyIFNlPW51bGwsYmU9KCk9PntTZSE9bnVsbCYmTy5zZXQoU2UsQ2koUy5zdWJUcmVlKSl9O3JldHVybiBycihiZSkscW4oYmUpLGVyKCgpPT57Ty5mb3JFYWNoKENlPT57dmFye3N1YlRyZWU6c3Qsc3VzcGVuc2U6RmV9PVMsUHQ9Q2koc3QpO2lmKENlLnR5cGU9PT1QdC50eXBlJiZDZS5rZXk9PT1QdC5rZXkpe1lpKFB0KTt2YXIgaT1QdC5jb21wb25lbnQuZGE7aSYmaHIoaSxGZSk7cmV0dXJufXFlKENlKX0pfSksKCk9PntpZihTZT1udWxsLCFtLmRlZmF1bHQpcmV0dXJuIG51bGw7dmFyIENlPW0uZGVmYXVsdCgpLHN0PUNlWzBdO2lmKENlLmxlbmd0aD4xKXJldHVybiBXPW51bGwsQ2U7aWYoIXZuKHN0KXx8IShzdC5zaGFwZUZsYWcmNCkmJiEoc3Quc2hhcGVGbGFnJjEyOCkpcmV0dXJuIFc9bnVsbCxzdDt2YXIgRmU9Q2koc3QpLFB0PUZlLnR5cGUsaT1VaShMcihGZSk/RmUudHlwZS5fX2FzeW5jUmVzb2x2ZWR8fHt9OlB0KSx7aW5jbHVkZTpsLGV4Y2x1ZGU6ZCxtYXg6X309YTtpZihsJiYoIWl8fCFNaShsLGkpKXx8ZCYmaSYmTWkoZCxpKSlyZXR1cm4gVz1GZSxzdDt2YXIgQT1GZS5rZXk9PW51bGw/UHQ6RmUua2V5LEM9Ty5nZXQoQSk7cmV0dXJuIEZlLmVsJiYoRmU9cGkoRmUpLHN0LnNoYXBlRmxhZyYxMjgmJihzdC5zc0NvbnRlbnQ9RmUpKSxTZT1BLEM/KEZlLmVsPUMuZWwsRmUuY29tcG9uZW50PUMuY29tcG9uZW50LEZlLnRyYW5zaXRpb24mJkt0KEZlLEZlLnRyYW5zaXRpb24pLEZlLnNoYXBlRmxhZ3w9NTEyLEYuZGVsZXRlKEEpLEYuYWRkKEEpKTooRi5hZGQoQSksXyYmRi5zaXplPnBhcnNlSW50KF8sMTApJiZhdChGLnZhbHVlcygpLm5leHQoKS52YWx1ZSkpLEZlLnNoYXBlRmxhZ3w9MjU2LFc9RmUsbGkoc3QudHlwZSk/c3Q6RmV9fX0sZGE9ZGk7ZnVuY3Rpb24gTWkoYSx1KXtyZXR1cm4gRS5pc0FycmF5KGEpP2Euc29tZShtPT5NaShtLHUpKTpFLmlzU3RyaW5nKGEpP2Euc3BsaXQoIiwiKS5pbmNsdWRlcyh1KTpFLmlzUmVnRXhwKGEpP2EudGVzdCh1KTohMX1mdW5jdGlvbiBMaShhLHUpe0FuKGEsImEiLHUpfWZ1bmN0aW9uIElvKGEsdSl7QW4oYSwiZGEiLHUpfWZ1bmN0aW9uIEFuKGEsdSl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOmxuLFM9YS5fX3dkY3x8KGEuX193ZGM9KCk9Pntmb3IodmFyIE89bTtPOyl7aWYoTy5pc0RlYWN0aXZhdGVkKXJldHVybjtPPU8ucGFyZW50fXJldHVybiBhKCl9KTtpZihGaSh1LFMsbSksbSlmb3IodmFyIEk9bS5wYXJlbnQ7SSYmSS5wYXJlbnQ7KUJuKEkucGFyZW50LnZub2RlKSYmRGkoUyx1LG0sSSksST1JLnBhcmVudH1mdW5jdGlvbiBEaShhLHUsbSxTKXt2YXIgST1GaSh1LGEsUywhMCk7ZHIoKCk9PntFLnJlbW92ZShTW3VdLEkpfSxtKX1mdW5jdGlvbiBZaShhKXthLnNoYXBlRmxhZyY9fjI1NixhLnNoYXBlRmxhZyY9fjUxMn1mdW5jdGlvbiBDaShhKXtyZXR1cm4gYS5zaGFwZUZsYWcmMTI4P2Euc3NDb250ZW50OmF9ZnVuY3Rpb24gRmkoYSx1KXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bG4sUz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITE7aWYobSl7aWYoRGUuaXNSb290SG9vayhhKSYmbSE9PW0ucm9vdCYmKG09bS5yb290LERlLmlzUm9vdEltbWVkaWF0ZUhvb2soYSkpKXt2YXIgST1tLnByb3h5O1AodS5iaW5kKEkpLG0sYSxEZS5PTl9MT0FEPT09YT9bSS4kcGFnZS5vcHRpb25zXTpbXSl9dmFyIE89bVthXXx8KG1bYV09W10pLEY9dS5fX3dlaHx8KHUuX193ZWg9ZnVuY3Rpb24oKXtpZighbS5pc1VubW91bnRlZCl7Ui5wYXVzZVRyYWNraW5nKCksWW4obSk7Zm9yKHZhciBXPWFyZ3VtZW50cy5sZW5ndGgsRz1uZXcgQXJyYXkoVyksbGU9MDtsZTxXO2xlKyspR1tsZV09YXJndW1lbnRzW2xlXTt2YXIgemU9UCh1LG0sYSxHKTtyZXR1cm4gWm4oKSxSLnJlc2V0VHJhY2tpbmcoKSx6ZX19KTtyZXR1cm4gUz9PLnVuc2hpZnQoRik6Ty5wdXNoKEYpLEZ9fXZhciBJcj1hPT5mdW5jdGlvbih1KXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bG47cmV0dXJuKCFoLmlzSW5TU1JDb21wb25lbnRTZXR1cHx8YT09PSJzcCIpJiZGaShhLGZ1bmN0aW9uKCl7cmV0dXJuIHUoLi4uYXJndW1lbnRzKX0sbSl9LHJpPUlyKCJibSIpLHJyPUlyKCJtIiksY3I9SXIoImJ1IikscW49SXIoInUiKSxlcj1JcigiYnVtIiksZHI9SXIoInVtIiksbW89SXIoInNwIiksX289SXIoInJ0ZyIpLHFpPUlyKCJydGMiKTtmdW5jdGlvbiBKaShhKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bG47RmkoImVjIixhLHUpfWZ1bmN0aW9uIFhvKGEsdSl7dmFyIG09UG47aWYobT09PW51bGwpcmV0dXJuIGE7Zm9yKHZhciBTPUxvKG0pfHxtLnByb3h5LEk9YS5kaXJzfHwoYS5kaXJzPVtdKSxPPTA7Tzx1Lmxlbmd0aDtPKyspe3ZhcltGLFcsRyxsZT1FLkVNUFRZX09CSl09dVtPXTtGJiYoRS5pc0Z1bmN0aW9uKEYpJiYoRj17bW91bnRlZDpGLHVwZGF0ZWQ6Rn0pLEYuZGVlcCYmSHIoVyksSS5wdXNoKHtkaXI6RixpbnN0YW5jZTpTLHZhbHVlOlcsb2xkVmFsdWU6dm9pZCAwLGFyZzpHLG1vZGlmaWVyczpsZX0pKX1yZXR1cm4gYX1mdW5jdGlvbiBXcihhLHUsbSxTKXtmb3IodmFyIEk9YS5kaXJzLE89dSYmdS5kaXJzLEY9MDtGPEkubGVuZ3RoO0YrKyl7dmFyIFc9SVtGXTtPJiYoVy5vbGRWYWx1ZT1PW0ZdLnZhbHVlKTt2YXIgRz1XLmRpcltTXTtHJiYoUi5wYXVzZVRyYWNraW5nKCksUChHLG0sOCxbYS5lbCxXLGEsdV0pLFIucmVzZXRUcmFja2luZygpKX19dmFyIHlyPSJjb21wb25lbnRzIixObz0iZGlyZWN0aXZlcyI7ZnVuY3Rpb24gQihhLHUpe3JldHVybiBaZSh5cixhLCEwLHUpfHxhfXZhciBZPVN5bWJvbCgpO2Z1bmN0aW9uIHJlKGEpe3JldHVybiBFLmlzU3RyaW5nKGEpP1plKHlyLGEsITEpfHxhOmF8fFl9ZnVuY3Rpb24geGUoYSl7cmV0dXJuIFplKE5vLGEpfWZ1bmN0aW9uIFplKGEsdSl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLFM9UG58fGxuO2lmKFMpe3ZhciBJPVMudHlwZTtpZihhPT09eXIpe3ZhciBPPVVpKEksITEpO2lmKE8mJihPPT09dXx8Tz09PUUuY2FtZWxpemUodSl8fE89PT1FLmNhcGl0YWxpemUoRS5jYW1lbGl6ZSh1KSkpKXJldHVybiBJfXZhciBGPWN0KFNbYV18fElbYV0sdSl8fGN0KFMuYXBwQ29udGV4dFthXSx1KTtyZXR1cm4hRiYmbT9JOkZ9fWZ1bmN0aW9uIGN0KGEsdSl7cmV0dXJuIGEmJihhW3VdfHxhW0UuY2FtZWxpemUodSldfHxhW0UuY2FwaXRhbGl6ZShFLmNhbWVsaXplKHUpKV0pfWZ1bmN0aW9uIFl0KGEsdSxtLFMpe3ZhciBJLE89bSYmbVtTXTtpZihFLmlzQXJyYXkoYSl8fEUuaXNTdHJpbmcoYSkpe0k9bmV3IEFycmF5KGEubGVuZ3RoKTtmb3IodmFyIEY9MCxXPWEubGVuZ3RoO0Y8VztGKyspSVtGXT11KGFbRl0sRix2b2lkIDAsTyYmT1tGXSl9ZWxzZSBpZih0eXBlb2YgYT09Im51bWJlciIpe0k9bmV3IEFycmF5KGEpO2Zvcih2YXIgRz0wO0c8YTtHKyspSVtHXT11KEcrMSxHLHZvaWQgMCxPJiZPW0ddKX1lbHNlIGlmKEUuaXNPYmplY3QoYSkpaWYoYVtTeW1ib2wuaXRlcmF0b3JdKUk9QXJyYXkuZnJvbShhLChHZSxxZSk9PnUoR2UscWUsdm9pZCAwLE8mJk9bcWVdKSk7ZWxzZXt2YXIgbGU9T2JqZWN0LmtleXMoYSk7ST1uZXcgQXJyYXkobGUubGVuZ3RoKTtmb3IodmFyIHplPTAsaXQ9bGUubGVuZ3RoO3plPGl0O3plKyspe3ZhciBkZT1sZVt6ZV07SVt6ZV09dShhW2RlXSxkZSx6ZSxPJiZPW3plXSl9fWVsc2UgST1bXTtyZXR1cm4gbSYmKG1bU109SSksSX1mdW5jdGlvbiBRdChhLHUpe2Zvcih2YXIgbT1mdW5jdGlvbihJKXt2YXIgTz11W0ldO2lmKEUuaXNBcnJheShPKSlmb3IodmFyIEY9MDtGPE8ubGVuZ3RoO0YrKylhW09bRl0ubmFtZV09T1tGXS5mbjtlbHNlIE8mJihhW08ubmFtZV09Ty5rZXk/ZnVuY3Rpb24oKXt2YXIgVz1PLmZuKC4uLmFyZ3VtZW50cyk7cmV0dXJuIFcmJihXLmtleT1PLmtleSksV306Ty5mbil9LFM9MDtTPHUubGVuZ3RoO1MrKyltKFMpO3JldHVybiBhfWZ1bmN0aW9uIFZpKGEsdSl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9LFM9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDAsST1hcmd1bWVudHMubGVuZ3RoPjQ/YXJndW1lbnRzWzRdOnZvaWQgMDtpZihQbi5pc0NFfHxQbi5wYXJlbnQmJkxyKFBuLnBhcmVudCkmJlBuLnBhcmVudC5pc0NFKXJldHVybiB1IT09ImRlZmF1bHQiJiYobS5uYW1lPXUpLCR0KCJzbG90IixtLFMmJlMoKSk7dmFyIE89YVt1XTtPJiZPLl9jJiYoTy5fZD0hMSksd2UoKTt2YXIgRj1PJiZHcihPKG0pKSxXPUR0KEose2tleTptLmtleXx8RiYmRi5rZXl8fCJfIi5jb25jYXQodSl9LEZ8fChTP1MoKTpbXSksRiYmYS5fPT09MT82NDotMik7cmV0dXJuIUkmJlcuc2NvcGVJZCYmKFcuc2xvdFNjb3BlSWRzPVtXLnNjb3BlSWQrIi1zIl0pLE8mJk8uX2MmJihPLl9kPSEwKSxXfWZ1bmN0aW9uIEdyKGEpe3JldHVybiBhLnNvbWUodT0+dm4odSk/ISh1LnR5cGU9PT1jZXx8dS50eXBlPT09SiYmIUdyKHUuY2hpbGRyZW4pKTohMCk/YTpudWxsfWZ1bmN0aW9uIGd0KGEsdSl7dmFyIG09e307Zm9yKHZhciBTIGluIGEpbVt1JiYvW0EtWl0vLnRlc3QoUyk/Im9uOiIuY29uY2F0KFMpOkUudG9IYW5kbGVyS2V5KFMpXT1hW1NdO3JldHVybiBtfXZhciBSdD1hPT5hP1RpKGEpP0xvKGEpfHxhLnByb3h5OlJ0KGEucGFyZW50KTpudWxsLFlyPUUuZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCkseyQ6YT0+YSwkZWw6YT0+YS52bm9kZS5lbCwkZGF0YTphPT5hLmRhdGEsJHByb3BzOmE9PmEucHJvcHMsJGF0dHJzOmE9PmEuYXR0cnMsJHNsb3RzOmE9PmEuc2xvdHMsJHJlZnM6YT0+YS5yZWZzLCRwYXJlbnQ6YT0+UnQoYS5wYXJlbnQpLCRyb290OmE9PlJ0KGEucm9vdCksJGVtaXQ6YT0+YS5lbWl0LCRvcHRpb25zOmE9PlVuKGEpLCRmb3JjZVVwZGF0ZTphPT5hLmZ8fChhLmY9KCk9PkNuKGEudXBkYXRlKSksJG5leHRUaWNrOmE9PmEubnx8KGEubj1Yci5iaW5kKGEucHJveHkpKSwkd2F0Y2g6YT0+d2kuYmluZChhKX0pLGFvPShhLHUpPT5hIT09RS5FTVBUWV9PQkomJiFhLl9faXNTY3JpcHRTZXR1cCYmRS5oYXNPd24oYSx1KSxvZT17Z2V0KGEsdSl7dmFye186bX09YSx7Y3R4OlMsc2V0dXBTdGF0ZTpJLGRhdGE6Tyxwcm9wczpGLGFjY2Vzc0NhY2hlOlcsdHlwZTpHLGFwcENvbnRleHQ6bGV9PW0semU7aWYodVswXSE9PSIkIil7dmFyIGl0PVdbdV07aWYoaXQhPT12b2lkIDApc3dpdGNoKGl0KXtjYXNlIDE6cmV0dXJuIElbdV07Y2FzZSAyOnJldHVybiBPW3VdO2Nhc2UgNDpyZXR1cm4gU1t1XTtjYXNlIDM6cmV0dXJuIEZbdV19ZWxzZXtpZihhbyhJLHUpKXJldHVybiBXW3VdPTEsSVt1XTtpZihPIT09RS5FTVBUWV9PQkomJkUuaGFzT3duKE8sdSkpcmV0dXJuIFdbdV09MixPW3VdO2lmKCh6ZT1tLnByb3BzT3B0aW9uc1swXSkmJkUuaGFzT3duKHplLHUpKXJldHVybiBXW3VdPTMsRlt1XTtpZihTIT09RS5FTVBUWV9PQkomJkUuaGFzT3duKFMsdSkpcmV0dXJuIFdbdV09NCxTW3VdO3NlJiYoV1t1XT0wKX19dmFyIGRlPVlyW3VdLEdlLHFlO2lmKGRlKXJldHVybiB1PT09IiRhdHRycyImJlIudHJhY2sobSwiZ2V0Iix1KSxkZShtKTtpZigoR2U9Ry5fX2Nzc01vZHVsZXMpJiYoR2U9R2VbdV0pKXJldHVybiBHZTtpZihTIT09RS5FTVBUWV9PQkomJkUuaGFzT3duKFMsdSkpcmV0dXJuIFdbdV09NCxTW3VdO2lmKHFlPWxlLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLEUuaGFzT3duKHFlLHUpKXJldHVybiBxZVt1XX0sc2V0KGEsdSxtKXt2YXJ7XzpTfT1hLHtkYXRhOkksc2V0dXBTdGF0ZTpPLGN0eDpGfT1TO3JldHVybiBhbyhPLHUpPyhPW3VdPW0sITApOkkhPT1FLkVNUFRZX09CSiYmRS5oYXNPd24oSSx1KT8oSVt1XT1tLCEwKTpFLmhhc093bihTLnByb3BzLHUpfHx1WzBdPT09IiQiJiZ1LnNsaWNlKDEpaW4gUz8hMTooRlt1XT1tLCEwKX0saGFzKGEsdSl7dmFye186e2RhdGE6bSxzZXR1cFN0YXRlOlMsYWNjZXNzQ2FjaGU6SSxjdHg6TyxhcHBDb250ZXh0OkYscHJvcHNPcHRpb25zOld9fT1hLEc7cmV0dXJuISFJW3VdfHxtIT09RS5FTVBUWV9PQkomJkUuaGFzT3duKG0sdSl8fGFvKFMsdSl8fChHPVdbMF0pJiZFLmhhc093bihHLHUpfHxFLmhhc093bihPLHUpfHxFLmhhc093bihZcix1KXx8RS5oYXNPd24oRi5jb25maWcuZ2xvYmFsUHJvcGVydGllcyx1KX0sZGVmaW5lUHJvcGVydHkoYSx1LG0pe3JldHVybiBtLmdldCE9bnVsbD9hLl8uYWNjZXNzQ2FjaGVbdV09MDpFLmhhc093bihtLCJ2YWx1ZSIpJiZ0aGlzLnNldChhLHUsbS52YWx1ZSxudWxsKSxSZWZsZWN0LmRlZmluZVByb3BlcnR5KGEsdSxtKX19LFg9RS5leHRlbmQoe30sb2Use2dldChhLHUpe2lmKHUhPT1TeW1ib2wudW5zY29wYWJsZXMpcmV0dXJuIG9lLmdldChhLHUsYSl9LGhhcyhhLHUpe3ZhciBtPXVbMF0hPT0iXyImJiFFLmlzR2xvYmFsbHlXaGl0ZWxpc3RlZCh1KTtyZXR1cm4gbX19KSxzZT0hMDtmdW5jdGlvbiBCZShhKXt2YXIgdT1VbihhKSxtPWEucHJveHksUz1hLmN0eDtzZT0hMSx1LmJlZm9yZUNyZWF0ZSYmcG4odS5iZWZvcmVDcmVhdGUsYSwiYmMiKTt2YXJ7ZGF0YTpJLGNvbXB1dGVkOk8sbWV0aG9kczpGLHdhdGNoOlcscHJvdmlkZTpHLGluamVjdDpsZSxjcmVhdGVkOnplLGJlZm9yZU1vdW50Oml0LG1vdW50ZWQ6ZGUsYmVmb3JlVXBkYXRlOkdlLHVwZGF0ZWQ6cWUsYWN0aXZhdGVkOl90LGRlYWN0aXZhdGVkOmF0LGJlZm9yZURlc3Ryb3k6U2UsYmVmb3JlVW5tb3VudDpiZSxkZXN0cm95ZWQ6Q2UsdW5tb3VudGVkOnN0LHJlbmRlcjpGZSxyZW5kZXJUcmFja2VkOlB0LHJlbmRlclRyaWdnZXJlZDppLGVycm9yQ2FwdHVyZWQ6bCxzZXJ2ZXJQcmVmZXRjaDpkLGV4cG9zZTpfLGluaGVyaXRBdHRyczpBLGNvbXBvbmVudHM6QyxkaXJlY3RpdmVzOmssZmlsdGVyczpMfT11LEg9bnVsbDtpZihsZSYmbXQobGUsUyxILGEuYXBwQ29udGV4dC5jb25maWcudW53cmFwSW5qZWN0ZWRSZWYpLEYpZm9yKHZhciB0ZSBpbiBGKXt2YXIgZ2U9Rlt0ZV07RS5pc0Z1bmN0aW9uKGdlKSYmKFNbdGVdPWdlLmJpbmQobSkpfWlmKEkpe3ZhciBrZT1JLmNhbGwobSxtKTtFLmlzT2JqZWN0KGtlKSYmKGEuZGF0YT1SLnJlYWN0aXZlKGtlKSl9aWYoc2U9ITAsTyl7dmFyIHVlPWZ1bmN0aW9uKF9lKXt2YXIgTGU9T1tfZV0sQWU9RS5pc0Z1bmN0aW9uKExlKT9MZS5iaW5kKG0sbSk6RS5pc0Z1bmN0aW9uKExlLmdldCk/TGUuZ2V0LmJpbmQobSxtKTpFLk5PT1AsRXQ9IUUuaXNGdW5jdGlvbihMZSkmJkUuaXNGdW5jdGlvbihMZS5zZXQpP0xlLnNldC5iaW5kKG0pOkUuTk9PUCxBdD15byh7Z2V0OkFlLHNldDpFdH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShTLF9lLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PkF0LnZhbHVlLHNldDpKZT0+QXQudmFsdWU9SmV9KX07Zm9yKHZhciBQZSBpbiBPKXVlKFBlKX1pZihXKWZvcih2YXIgV2UgaW4gVylKbihXW1dlXSxTLG0sV2UpO2lmKEcpe3ZhciB1dD1FLmlzRnVuY3Rpb24oRyk/Ry5jYWxsKG0pOkc7UmVmbGVjdC5vd25LZXlzKHV0KS5mb3JFYWNoKF9lPT57dWkoX2UsdXRbX2VdKX0pfXplJiZwbih6ZSxhLCJjIik7ZnVuY3Rpb24gUWUoX2UsTGUpe0UuaXNBcnJheShMZSk/TGUuZm9yRWFjaChBZT0+X2UoQWUuYmluZChtKSkpOkxlJiZfZShMZS5iaW5kKG0pKX1pZihRZShyaSxpdCksUWUocnIsZGUpLFFlKGNyLEdlKSxRZShxbixxZSksUWUoTGksX3QpLFFlKElvLGF0KSxRZShKaSxsKSxRZShxaSxQdCksUWUoX28saSksUWUoZXIsYmUpLFFlKGRyLHN0KSxRZShtbyxkKSxFLmlzQXJyYXkoXykpaWYoXy5sZW5ndGgpe3ZhciBJZT1hLmV4cG9zZWR8fChhLmV4cG9zZWQ9e30pO18uZm9yRWFjaChfZT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShJZSxfZSx7Z2V0OigpPT5tW19lXSxzZXQ6TGU9Pm1bX2VdPUxlfSl9KX1lbHNlIGEuZXhwb3NlZHx8KGEuZXhwb3NlZD17fSk7RmUmJmEucmVuZGVyPT09RS5OT09QJiYoYS5yZW5kZXI9RmUpLEEhPW51bGwmJihhLmluaGVyaXRBdHRycz1BKSxDJiYoYS5jb21wb25lbnRzPUMpLGsmJihhLmRpcmVjdGl2ZXM9ayk7dmFyIHBlPWEuYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kYXBwbHlPcHRpb25zO3BlJiZwZSh1LGEsbSl9ZnVuY3Rpb24gbXQoYSx1KXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITE7RS5pc0FycmF5KGEpJiYoYT1SbyhhKSk7dmFyIFM9ZnVuY3Rpb24oTyl7dmFyIEY9YVtPXSxXPXZvaWQgMDtFLmlzT2JqZWN0KEYpPyJkZWZhdWx0ImluIEY/Vz1scihGLmZyb218fE8sRi5kZWZhdWx0LCEwKTpXPWxyKEYuZnJvbXx8Tyk6Vz1scihGKSxSLmlzUmVmKFcpJiZtP09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LE8se2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+Vy52YWx1ZSxzZXQ6Rz0+Vy52YWx1ZT1HfSk6dVtPXT1XfTtmb3IodmFyIEkgaW4gYSlTKEkpfWZ1bmN0aW9uIHBuKGEsdSxtKXtQKEUuaXNBcnJheShhKT9hLm1hcChTPT5TLmJpbmQodS5wcm94eSkpOmEuYmluZCh1LnByb3h5KSx1LG0pfWZ1bmN0aW9uIEpuKGEsdSxtLFMpe3ZhciBJPVMuaW5jbHVkZXMoIi4iKT9QbyhtLFMpOigpPT5tW1NdO2lmKEUuaXNTdHJpbmcoYSkpe3ZhciBPPXVbYV07RS5pc0Z1bmN0aW9uKE8pJiZ4cihJLE8pfWVsc2UgaWYoRS5pc0Z1bmN0aW9uKGEpKXhyKEksYS5iaW5kKG0pKTtlbHNlIGlmKEUuaXNPYmplY3QoYSkpaWYoRS5pc0FycmF5KGEpKWEuZm9yRWFjaChXPT5KbihXLHUsbSxTKSk7ZWxzZXt2YXIgRj1FLmlzRnVuY3Rpb24oYS5oYW5kbGVyKT9hLmhhbmRsZXIuYmluZChtKTp1W2EuaGFuZGxlcl07RS5pc0Z1bmN0aW9uKEYpJiZ4cihJLEYsYSl9fWZ1bmN0aW9uIFVuKGEpe3ZhciB1PWEudHlwZSx7bWl4aW5zOm0sZXh0ZW5kczpTfT11LHttaXhpbnM6SSxvcHRpb25zQ2FjaGU6Tyxjb25maWc6e29wdGlvbk1lcmdlU3RyYXRlZ2llczpGfX09YS5hcHBDb250ZXh0LFc9Ty5nZXQodSksRztyZXR1cm4gVz9HPVc6IUkubGVuZ3RoJiYhbSYmIVM/Rz11OihHPXt9LEkubGVuZ3RoJiZJLmZvckVhY2gobGU9PlNyKEcsbGUsRiwhMCkpLFNyKEcsdSxGKSksRS5pc09iamVjdCh1KSYmTy5zZXQodSxHKSxHfWZ1bmN0aW9uIFNyKGEsdSxtKXt2YXIgUz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEse21peGluczpJLGV4dGVuZHM6T309dTtPJiZTcihhLE8sbSwhMCksSSYmSS5mb3JFYWNoKEc9PlNyKGEsRyxtLCEwKSk7Zm9yKHZhciBGIGluIHUpaWYoIShTJiZGPT09ImV4cG9zZSIpKXt2YXIgVz1GcltGXXx8bSYmbVtGXTthW0ZdPVc/VyhhW0ZdLHVbRl0pOnVbRl19cmV0dXJuIGF9dmFyIEZyPXtkYXRhOmJvLHByb3BzOktuLGVtaXRzOktuLG1ldGhvZHM6S24sY29tcHV0ZWQ6S24sYmVmb3JlQ3JlYXRlOiRuLGNyZWF0ZWQ6JG4sYmVmb3JlTW91bnQ6JG4sbW91bnRlZDokbixiZWZvcmVVcGRhdGU6JG4sdXBkYXRlZDokbixiZWZvcmVEZXN0cm95OiRuLGJlZm9yZVVubW91bnQ6JG4sZGVzdHJveWVkOiRuLHVubW91bnRlZDokbixhY3RpdmF0ZWQ6JG4sZGVhY3RpdmF0ZWQ6JG4sZXJyb3JDYXB0dXJlZDokbixzZXJ2ZXJQcmVmZXRjaDokbixjb21wb25lbnRzOktuLGRpcmVjdGl2ZXM6S24sd2F0Y2g6SG4scHJvdmlkZTpibyxpbmplY3Q6a299O2Z1bmN0aW9uIGJvKGEsdSl7cmV0dXJuIHU/YT9mdW5jdGlvbigpe3JldHVybiBFLmV4dGVuZChFLmlzRnVuY3Rpb24oYSk/YS5jYWxsKHRoaXMsdGhpcyk6YSxFLmlzRnVuY3Rpb24odSk/dS5jYWxsKHRoaXMsdGhpcyk6dSl9OnU6YX1mdW5jdGlvbiBrbyhhLHUpe3JldHVybiBLbihSbyhhKSxSbyh1KSl9ZnVuY3Rpb24gUm8oYSl7aWYoRS5pc0FycmF5KGEpKXtmb3IodmFyIHU9e30sbT0wO208YS5sZW5ndGg7bSsrKXVbYVttXV09YVttXTtyZXR1cm4gdX1yZXR1cm4gYX1mdW5jdGlvbiAkbihhLHUpe3JldHVybiBhP1suLi5uZXcgU2V0KFtdLmNvbmNhdChhLHUpKV06dX1mdW5jdGlvbiBLbihhLHUpe3JldHVybiBhP0UuZXh0ZW5kKEUuZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCksYSksdSk6dX1mdW5jdGlvbiBIbihhLHUpe2lmKCFhKXJldHVybiB1O2lmKCF1KXJldHVybiBhO3ZhciBtPUUuZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCksYSk7Zm9yKHZhciBTIGluIHUpbVtTXT0kbihhW1NdLHVbU10pO3JldHVybiBtfWZ1bmN0aW9uIEFpKGEsdSxtKXt2YXIgUz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsST17fSxPPXt9O0UuZGVmKE8scm4sMSksYS5wcm9wc0RlZmF1bHRzPU9iamVjdC5jcmVhdGUobnVsbCksaGEoYSx1LEksTyk7Zm9yKHZhciBGIGluIGEucHJvcHNPcHRpb25zWzBdKUYgaW4gSXx8KElbRl09dm9pZCAwKTttP2EucHJvcHM9Uz9JOlIuc2hhbGxvd1JlYWN0aXZlKEkpOmEudHlwZS5wcm9wcz9hLnByb3BzPUk6YS5wcm9wcz1PLGEuYXR0cnM9T31mdW5jdGlvbiBpcyhhLHUsbSxTKXt2YXJ7cHJvcHM6SSxhdHRyczpPLHZub2RlOntwYXRjaEZsYWc6Rn19PWEsVz1SLnRvUmF3KEkpLFtHXT1hLnByb3BzT3B0aW9ucyxsZT0hMTtpZigoU3x8Rj4wKSYmIShGJjE2KSl7aWYoRiY4KWZvcih2YXIgemU9YS52bm9kZS5keW5hbWljUHJvcHMsaXQ9MDtpdDx6ZS5sZW5ndGg7aXQrKyl7dmFyIGRlPXplW2l0XTtpZighVm4oYS5lbWl0c09wdGlvbnMsZGUpKXt2YXIgR2U9dVtkZV07aWYoRylpZihFLmhhc093bihPLGRlKSlHZSE9PU9bZGVdJiYoT1tkZV09R2UsbGU9ITApO2Vsc2V7dmFyIHFlPUUuY2FtZWxpemUoZGUpO0lbcWVdPXdyKEcsVyxxZSxHZSxhLCExKX1lbHNlIEdlIT09T1tkZV0mJihPW2RlXT1HZSxsZT0hMCl9fX1lbHNle2hhKGEsdSxJLE8pJiYobGU9ITApO3ZhciBfdDtmb3IodmFyIGF0IGluIFcpKCF1fHwhRS5oYXNPd24odSxhdCkmJigoX3Q9RS5oeXBoZW5hdGUoYXQpKT09PWF0fHwhRS5oYXNPd24odSxfdCkpKSYmKEc/bSYmKG1bYXRdIT09dm9pZCAwfHxtW190XSE9PXZvaWQgMCkmJihJW2F0XT13cihHLFcsYXQsdm9pZCAwLGEsITApKTpkZWxldGUgSVthdF0pO2lmKE8hPT1XKWZvcih2YXIgU2UgaW4gTykoIXV8fCFFLmhhc093bih1LFNlKSYmITApJiYoZGVsZXRlIE9bU2VdLGxlPSEwKX1sZSYmUi50cmlnZ2VyKGEsInNldCIsIiRhdHRycyIpfWZ1bmN0aW9uIGhhKGEsdSxtLFMpe3ZhcltJLE9dPWEucHJvcHNPcHRpb25zLEY9ITEsVztpZih1KXtmb3IodmFyIEcgaW4gdSlpZighRS5pc1Jlc2VydmVkUHJvcChHKSl7dmFyIGxlPXVbR10semU9dm9pZCAwO0kmJkUuaGFzT3duKEksemU9RS5jYW1lbGl6ZShHKSk/IU98fCFPLmluY2x1ZGVzKHplKT9tW3plXT1sZTooV3x8KFc9e30pKVt6ZV09bGU6Vm4oYS5lbWl0c09wdGlvbnMsRyl8fCghKEcgaW4gUyl8fGxlIT09U1tHXSkmJihTW0ddPWxlLEY9ITApfX1pZihPKWZvcih2YXIgaXQ9Ui50b1JhdyhtKSxkZT1XfHxFLkVNUFRZX09CSixHZT0wO0dlPE8ubGVuZ3RoO0dlKyspe3ZhciBxZT1PW0dlXTttW3FlXT13cihJLGl0LHFlLGRlW3FlXSxhLCFFLmhhc093bihkZSxxZSkpfXJldHVybiBGfWZ1bmN0aW9uIHdyKGEsdSxtLFMsSSxPKXt2YXIgRj1hW21dO2lmKEYhPW51bGwpe3ZhciBXPUUuaGFzT3duKEYsImRlZmF1bHQiKTtpZihXJiZTPT09dm9pZCAwKXt2YXIgRz1GLmRlZmF1bHQ7aWYoRi50eXBlIT09RnVuY3Rpb24mJkUuaXNGdW5jdGlvbihHKSl7dmFye3Byb3BzRGVmYXVsdHM6bGV9PUk7bSBpbiBsZT9TPWxlW21dOihZbihJKSxTPWxlW21dPUcuY2FsbChudWxsLHUpLFpuKCkpfWVsc2UgUz1HfUZbMF0mJihPJiYhVz9TPSExOkZbMV0mJihTPT09IiJ8fFM9PT1FLmh5cGhlbmF0ZShtKSkmJihTPSEwKSl9cmV0dXJuIFN9ZnVuY3Rpb24gVGEoYSx1KXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsUz11LnByb3BzQ2FjaGUsST1TLmdldChhKTtpZihJKXJldHVybiBJO3ZhciBPPWEucHJvcHMsRj17fSxXPVtdLEc9ITE7aWYoIUUuaXNGdW5jdGlvbihhKSl7dmFyIGxlPUNlPT57Rz0hMDt2YXJbc3QsRmVdPVRhKENlLHUsITApO0UuZXh0ZW5kKEYsc3QpLEZlJiZXLnB1c2goLi4uRmUpfTshbSYmdS5taXhpbnMubGVuZ3RoJiZ1Lm1peGlucy5mb3JFYWNoKGxlKSxhLmV4dGVuZHMmJmxlKGEuZXh0ZW5kcyksYS5taXhpbnMmJmEubWl4aW5zLmZvckVhY2gobGUpfWlmKCFPJiYhRylyZXR1cm4gRS5pc09iamVjdChhKSYmUy5zZXQoYSxFLkVNUFRZX0FSUiksRS5FTVBUWV9BUlI7aWYoRS5pc0FycmF5KE8pKWZvcih2YXIgemU9MDt6ZTxPLmxlbmd0aDt6ZSsrKXt2YXIgaXQ9RS5jYW1lbGl6ZShPW3plXSk7RGEoaXQpJiYoRltpdF09RS5FTVBUWV9PQkopfWVsc2UgaWYoTylmb3IodmFyIGRlIGluIE8pe3ZhciBHZT1FLmNhbWVsaXplKGRlKTtpZihEYShHZSkpe3ZhciBxZT1PW2RlXSxfdD1GW0dlXT1FLmlzQXJyYXkocWUpfHxFLmlzRnVuY3Rpb24ocWUpP3t0eXBlOnFlfTpPYmplY3QuYXNzaWduKHt9LHFlKTtpZihfdCl7dmFyIGF0PVVhKEJvb2xlYW4sX3QudHlwZSksU2U9VWEoU3RyaW5nLF90LnR5cGUpO190WzBdPWF0Pi0xLF90WzFdPVNlPDB8fGF0PFNlLChhdD4tMXx8RS5oYXNPd24oX3QsImRlZmF1bHQiKSkmJlcucHVzaChHZSl9fX12YXIgYmU9W0YsV107cmV0dXJuIEUuaXNPYmplY3QoYSkmJlMuc2V0KGEsYmUpLGJlfWZ1bmN0aW9uIERhKGEpe3JldHVybiBhWzBdIT09IiQifWZ1bmN0aW9uIEZhKGEpe3ZhciB1PWEmJmEudG9TdHJpbmcoKS5tYXRjaCgvXlxzKihmdW5jdGlvbnxjbGFzcykgKFx3KykvKTtyZXR1cm4gdT91WzJdOmE9PT1udWxsPyJudWxsIjoiIn1mdW5jdGlvbiBWYShhLHUpe3JldHVybiBGYShhKT09PUZhKHUpfWZ1bmN0aW9uIFVhKGEsdSl7cmV0dXJuIEUuaXNBcnJheSh1KT91LmZpbmRJbmRleChtPT5WYShtLGEpKTpFLmlzRnVuY3Rpb24odSkmJlZhKHUsYSk/MDotMX12YXIgZ2E9YT0+YVswXT09PSJfInx8YT09PSIkc3RhYmxlIixQYT1hPT5FLmlzQXJyYXkoYSk/YS5tYXAoem4pOlt6bihhKV0sam49KGEsdSxtKT0+e2lmKHUuX24pcmV0dXJuIHU7dmFyIFM9QW8oZnVuY3Rpb24oKXtyZXR1cm4gUGEodSguLi5hcmd1bWVudHMpKX0sbSk7cmV0dXJuIFMuX2M9ITEsU30seG89KGEsdSxtKT0+e3ZhciBTPWEuX2N0eDtmb3IodmFyIEkgaW4gYSlpZighZ2EoSSkpe3ZhciBPPWFbSV07RS5pc0Z1bmN0aW9uKE8pP3VbSV09am4oSSxPLFMpOk8hPW51bGwmJmZ1bmN0aW9uKCl7dmFyIEY9UGEoTyk7dVtJXT0oKT0+Rn0oKX19LFFvPShhLHUpPT57dmFyIG09UGEodSk7YS5zbG90cy5kZWZhdWx0PSgpPT5tfSxLaT0oYSx1KT0+e2lmKGEudm5vZGUuc2hhcGVGbGFnJjMyKXt2YXIgbT11Ll87bT8oYS5zbG90cz1SLnRvUmF3KHUpLEUuZGVmKHUsIl8iLG0pKTp4byh1LGEuc2xvdHM9e30pfWVsc2UgYS5zbG90cz17fSx1JiZRbyhhLHUpO0UuZGVmKGEuc2xvdHMscm4sMSl9LG9zPShhLHUsbSk9Pnt2YXJ7dm5vZGU6UyxzbG90czpJfT1hLE89ITAsRj1FLkVNUFRZX09CSjtpZihTLnNoYXBlRmxhZyYzMil7dmFyIFc9dS5fO1c/bSYmVz09PTE/Tz0hMTooRS5leHRlbmQoSSx1KSwhbSYmVz09PTEmJmRlbGV0ZSBJLl8pOihPPSF1LiRzdGFibGUseG8odSxJKSksRj11fWVsc2UgdSYmKFFvKGEsdSksRj17ZGVmYXVsdDoxfSk7aWYoTylmb3IodmFyIEcgaW4gSSkhZ2EoRykmJiEoRyBpbiBGKSYmZGVsZXRlIElbR119O2Z1bmN0aW9uIGFzKCl7cmV0dXJue2FwcDpudWxsLGNvbmZpZzp7aXNOYXRpdmVUYWc6RS5OTyxwZXJmb3JtYW5jZTohMSxnbG9iYWxQcm9wZXJ0aWVzOnt9LG9wdGlvbk1lcmdlU3RyYXRlZ2llczp7fSxlcnJvckhhbmRsZXI6dm9pZCAwLHdhcm5IYW5kbGVyOnZvaWQgMCxjb21waWxlck9wdGlvbnM6e319LG1peGluczpbXSxjb21wb25lbnRzOnt9LGRpcmVjdGl2ZXM6e30scHJvdmlkZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxvcHRpb25zQ2FjaGU6bmV3IFdlYWtNYXAscHJvcHNDYWNoZTpuZXcgV2Vha01hcCxlbWl0c0NhY2hlOm5ldyBXZWFrTWFwfX12YXIgQm89MDtmdW5jdGlvbiBzcyhhLHUpe3JldHVybiBmdW5jdGlvbihTKXt2YXIgST1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbDtFLmlzRnVuY3Rpb24oUyl8fChTPU9iamVjdC5hc3NpZ24oe30sUykpLEkhPW51bGwmJiFFLmlzT2JqZWN0KEkpJiYoST1udWxsKTt2YXIgTz1hcygpLEY9bmV3IFNldCxXPSExLEc9Ty5hcHA9e191aWQ6Qm8rKyxfY29tcG9uZW50OlMsX3Byb3BzOkksX2NvbnRhaW5lcjpudWxsLF9jb250ZXh0Ok8sX2luc3RhbmNlOm51bGwsdmVyc2lvbjpwcyxnZXQgY29uZmlnKCl7cmV0dXJuIE8uY29uZmlnfSxzZXQgY29uZmlnKGxlKXt9LHVzZShsZSl7Zm9yKHZhciB6ZT1hcmd1bWVudHMubGVuZ3RoLGl0PW5ldyBBcnJheSh6ZT4xP3plLTE6MCksZGU9MTtkZTx6ZTtkZSsrKWl0W2RlLTFdPWFyZ3VtZW50c1tkZV07cmV0dXJuIEYuaGFzKGxlKXx8KGxlJiZFLmlzRnVuY3Rpb24obGUuaW5zdGFsbCk/KEYuYWRkKGxlKSxsZS5pbnN0YWxsKEcsLi4uaXQpKTpFLmlzRnVuY3Rpb24obGUpJiYoRi5hZGQobGUpLGxlKEcsLi4uaXQpKSksR30sbWl4aW4obGUpe3JldHVybiBPLm1peGlucy5pbmNsdWRlcyhsZSl8fE8ubWl4aW5zLnB1c2gobGUpLEd9LGNvbXBvbmVudChsZSx6ZSl7cmV0dXJuIHplPyhPLmNvbXBvbmVudHNbbGVdPXplLEcpOk8uY29tcG9uZW50c1tsZV19LGRpcmVjdGl2ZShsZSx6ZSl7cmV0dXJuIHplPyhPLmRpcmVjdGl2ZXNbbGVdPXplLEcpOk8uZGlyZWN0aXZlc1tsZV19LG1vdW50KGxlLHplLGl0KXtpZighVyl7dmFyIGRlPSR0KFMsSSk7cmV0dXJuIGRlLmFwcENvbnRleHQ9Tyx6ZSYmdT91KGRlLGxlKTphKGRlLGxlLGl0KSxXPSEwLEcuX2NvbnRhaW5lcj1sZSxsZS5fX3Z1ZV9hcHBfXz1HLEcuX2luc3RhbmNlPWRlLmNvbXBvbmVudCxMbyhkZS5jb21wb25lbnQpfHxkZS5jb21wb25lbnQucHJveHl9fSx1bm1vdW50KCl7VyYmKGEobnVsbCxHLl9jb250YWluZXIpLGRlbGV0ZSBHLl9jb250YWluZXIuX192dWVfYXBwX18pfSxwcm92aWRlKGxlLHplKXtyZXR1cm4gTy5wcm92aWRlc1tsZV09emUsR319O3JldHVybiBHfX1mdW5jdGlvbiBzbyhhLHUsbSxTKXt2YXIgST1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06ITE7aWYoRS5pc0FycmF5KGEpKXthLmZvckVhY2goKF90LGF0KT0+c28oX3QsdSYmKEUuaXNBcnJheSh1KT91W2F0XTp1KSxtLFMsSSkpO3JldHVybn1pZighKExyKFMpJiYhSSkpe3ZhciBPPVMuc2hhcGVGbGFnJjQ/TG8oUy5jb21wb25lbnQpfHxTLmNvbXBvbmVudC5wcm94eTpTLmVsLEY9ST9udWxsOk8se2k6VyxyOkd9PWEsbGU9dSYmdS5yLHplPVcucmVmcz09PUUuRU1QVFlfT0JKP1cucmVmcz17fTpXLnJlZnMsaXQ9Vy5zZXR1cFN0YXRlO2lmKGxlIT1udWxsJiZsZSE9PUcmJihFLmlzU3RyaW5nKGxlKT8oemVbbGVdPW51bGwsRS5oYXNPd24oaXQsbGUpJiYoaXRbbGVdPW51bGwpKTpSLmlzUmVmKGxlKSYmKGxlLnZhbHVlPW51bGwpKSxFLmlzRnVuY3Rpb24oRykpVHQoRyxXLDEyLFtGLHplXSk7ZWxzZXt2YXIgZGU9RS5pc1N0cmluZyhHKSxHZT1SLmlzUmVmKEcpO2lmKGRlfHxHZSl7dmFyIHFlPSgpPT57aWYoYS5mKXt2YXIgX3Q9ZGU/RS5oYXNPd24oaXQsRyk/aXRbR106emVbR106Ry52YWx1ZTtJP0UuaXNBcnJheShfdCkmJkUucmVtb3ZlKF90LE8pOkUuaXNBcnJheShfdCk/X3QuaW5jbHVkZXMoTyl8fF90LnB1c2goTyk6ZGU/KHplW0ddPVtPXSxFLmhhc093bihpdCxHKSYmKGl0W0ddPXplW0ddKSk6KEcudmFsdWU9W09dLGEuayYmKHplW2Eua109Ry52YWx1ZSkpfWVsc2UgZGU/KHplW0ddPUYsRS5oYXNPd24oaXQsRykmJihpdFtHXT1GKSk6R2UmJihHLnZhbHVlPUYsYS5rJiYoemVbYS5rXT1GKSl9O0Y/KHFlLmlkPS0xLGhyKHFlLG0pKTpxZSgpfX19fXZhciBoaT0hMSxPaT1hPT4vc3ZnLy50ZXN0KGEubmFtZXNwYWNlVVJJKSYmYS50YWdOYW1lIT09ImZvcmVpZ25PYmplY3QiLFppPWE9PmEubm9kZVR5cGU9PT04O2Z1bmN0aW9uIGdpKGEpe3ZhcnttdDp1LHA6bSxvOntwYXRjaFByb3A6UyxjcmVhdGVUZXh0OkksbmV4dFNpYmxpbmc6TyxwYXJlbnROb2RlOkYscmVtb3ZlOlcsaW5zZXJ0OkcsY3JlYXRlQ29tbWVudDpsZX19PWEsemU9KFNlLGJlKT0+e2lmKCFiZS5oYXNDaGlsZE5vZGVzKCkpe20obnVsbCxTZSxiZSksa24oKSxiZS5fdm5vZGU9U2U7cmV0dXJufWhpPSExLGl0KGJlLmZpcnN0Q2hpbGQsU2UsbnVsbCxudWxsLG51bGwpLGtuKCksYmUuX3Zub2RlPVNlLGhpJiZjb25zb2xlLmVycm9yKCJIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLiIpfSxpdD1mdW5jdGlvbihTZSxiZSxDZSxzdCxGZSl7dmFyIFB0PWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTohMSxpPVppKFNlKSYmU2UuZGF0YT09PSJbIixsPSgpPT5fdChTZSxiZSxDZSxzdCxGZSxpKSx7dHlwZTpkLHJlZjpfLHNoYXBlRmxhZzpBLHBhdGNoRmxhZzpDfT1iZSxrPVNlLm5vZGVUeXBlO2JlLmVsPVNlLEM9PT0tMiYmKFB0PSExLGJlLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXIgTD1udWxsO3N3aXRjaChkKXtjYXNlIGVlOmshPT0zP2JlLmNoaWxkcmVuPT09IiI/KEcoYmUuZWw9SSgiIiksRihTZSksU2UpLEw9U2UpOkw9bCgpOihTZS5kYXRhIT09YmUuY2hpbGRyZW4mJihoaT0hMCxTZS5kYXRhPWJlLmNoaWxkcmVuKSxMPU8oU2UpKTticmVhaztjYXNlIGNlOmshPT04fHxpP0w9bCgpOkw9TyhTZSk7YnJlYWs7Y2FzZSBoZTppZihpJiYoU2U9TyhTZSksaz1TZS5ub2RlVHlwZSksaz09PTF8fGs9PT0zKXtMPVNlO2Zvcih2YXIgSD0hYmUuY2hpbGRyZW4ubGVuZ3RoLHRlPTA7dGU8YmUuc3RhdGljQ291bnQ7dGUrKylIJiYoYmUuY2hpbGRyZW4rPUwubm9kZVR5cGU9PT0xP0wub3V0ZXJIVE1MOkwuZGF0YSksdGU9PT1iZS5zdGF0aWNDb3VudC0xJiYoYmUuYW5jaG9yPUwpLEw9TyhMKTtyZXR1cm4gaT9PKEwpOkx9ZWxzZSBsKCk7YnJlYWs7Y2FzZSBKOmk/TD1xZShTZSxiZSxDZSxzdCxGZSxQdCk6TD1sKCk7YnJlYWs7ZGVmYXVsdDppZihBJjEpayE9PTF8fGJlLnR5cGUudG9Mb3dlckNhc2UoKSE9PVNlLnRhZ05hbWUudG9Mb3dlckNhc2UoKT9MPWwoKTpMPWRlKFNlLGJlLENlLHN0LEZlLFB0KTtlbHNlIGlmKEEmNil7YmUuc2xvdFNjb3BlSWRzPUZlO3ZhciBnZT1GKFNlKTtpZih1KGJlLGdlLG51bGwsQ2Usc3QsT2koZ2UpLFB0KSxMPWk/YXQoU2UpOk8oU2UpLEwmJlppKEwpJiZMLmRhdGE9PT0idGVsZXBvcnQgZW5kIiYmKEw9TyhMKSksTHIoYmUpKXt2YXIga2U7aT8oa2U9JHQoSiksa2UuYW5jaG9yPUw/TC5wcmV2aW91c1NpYmxpbmc6Z2UubGFzdENoaWxkKTprZT1TZS5ub2RlVHlwZT09PTM/aWkoIiIpOiR0KCJkaXYiKSxrZS5lbD1TZSxiZS5jb21wb25lbnQuc3ViVHJlZT1rZX19ZWxzZSBBJjY0P2shPT04P0w9bCgpOkw9YmUudHlwZS5oeWRyYXRlKFNlLGJlLENlLHN0LEZlLFB0LGEsR2UpOkEmMTI4JiYoTD1iZS50eXBlLmh5ZHJhdGUoU2UsYmUsQ2Usc3QsT2koRihTZSkpLEZlLFB0LGEsaXQpKX1yZXR1cm4gXyE9bnVsbCYmc28oXyxudWxsLHN0LGJlKSxMfSxkZT0oU2UsYmUsQ2Usc3QsRmUsUHQpPT57UHQ9UHR8fCEhYmUuZHluYW1pY0NoaWxkcmVuO3Zhcnt0eXBlOmkscHJvcHM6bCxwYXRjaEZsYWc6ZCxzaGFwZUZsYWc6XyxkaXJzOkF9PWJlLEM9aT09PSJpbnB1dCImJkF8fGk9PT0ib3B0aW9uIjtpZihDfHxkIT09LTEpe2lmKEEmJldyKGJlLG51bGwsQ2UsImNyZWF0ZWQiKSxsKWlmKEN8fCFQdHx8ZCYoMTZ8MzIpKWZvcih2YXIgayBpbiBsKShDJiZrLmVuZHNXaXRoKCJ2YWx1ZSIpfHxFLmlzT24oaykmJiFFLmlzUmVzZXJ2ZWRQcm9wKGspKSYmUyhTZSxrLG51bGwsbFtrXSwhMSx2b2lkIDAsQ2UpO2Vsc2UgbC5vbkNsaWNrJiZTKFNlLCJvbkNsaWNrIixudWxsLGwub25DbGljaywhMSx2b2lkIDAsQ2UpO3ZhciBMO2lmKChMPWwmJmwub25Wbm9kZUJlZm9yZU1vdW50KSYmQ3IoTCxDZSxiZSksQSYmV3IoYmUsbnVsbCxDZSwiYmVmb3JlTW91bnQiKSwoKEw9bCYmbC5vblZub2RlTW91bnRlZCl8fEEpJiZTaSgoKT0+e0wmJkNyKEwsQ2UsYmUpLEEmJldyKGJlLG51bGwsQ2UsIm1vdW50ZWQiKX0sc3QpLF8mMTYmJiEobCYmKGwuaW5uZXJIVE1MfHxsLnRleHRDb250ZW50KSkpZm9yKHZhciBIPUdlKFNlLmZpcnN0Q2hpbGQsYmUsU2UsQ2Usc3QsRmUsUHQpO0g7KXtoaT0hMDt2YXIgdGU9SDtIPUgubmV4dFNpYmxpbmcsVyh0ZSl9ZWxzZSBfJjgmJlNlLnRleHRDb250ZW50IT09YmUuY2hpbGRyZW4mJihoaT0hMCxTZS50ZXh0Q29udGVudD1iZS5jaGlsZHJlbil9cmV0dXJuIFNlLm5leHRTaWJsaW5nfSxHZT0oU2UsYmUsQ2Usc3QsRmUsUHQsaSk9PntpPWl8fCEhYmUuZHluYW1pY0NoaWxkcmVuO2Zvcih2YXIgbD1iZS5jaGlsZHJlbixkPWwubGVuZ3RoLF89MDtfPGQ7XysrKXt2YXIgQT1pP2xbX106bFtfXT16bihsW19dKTtpZihTZSlTZT1pdChTZSxBLHN0LEZlLFB0LGkpO2Vsc2V7aWYoQS50eXBlPT09ZWUmJiFBLmNoaWxkcmVuKWNvbnRpbnVlO2hpPSEwLG0obnVsbCxBLENlLG51bGwsc3QsRmUsT2koQ2UpLFB0KX19cmV0dXJuIFNlfSxxZT0oU2UsYmUsQ2Usc3QsRmUsUHQpPT57dmFye3Nsb3RTY29wZUlkczppfT1iZTtpJiYoRmU9RmU/RmUuY29uY2F0KGkpOmkpO3ZhciBsPUYoU2UpLGQ9R2UoTyhTZSksYmUsbCxDZSxzdCxGZSxQdCk7cmV0dXJuIGQmJlppKGQpJiZkLmRhdGE9PT0iXSI/TyhiZS5hbmNob3I9ZCk6KGhpPSEwLEcoYmUuYW5jaG9yPWxlKCJdIiksbCxkKSxkKX0sX3Q9KFNlLGJlLENlLHN0LEZlLFB0KT0+e2lmKGhpPSEwLGJlLmVsPW51bGwsUHQpZm9yKHZhciBpPWF0KFNlKTs7KXt2YXIgbD1PKFNlKTtpZihsJiZsIT09aSlXKGwpO2Vsc2UgYnJlYWt9dmFyIGQ9TyhTZSksXz1GKFNlKTtyZXR1cm4gVyhTZSksbShudWxsLGJlLF8sZCxDZSxzdCxPaShfKSxGZSksZH0sYXQ9U2U9Pntmb3IodmFyIGJlPTA7U2U7KWlmKFNlPU8oU2UpLFNlJiZaaShTZSkmJihTZS5kYXRhPT09IlsiJiZiZSsrLFNlLmRhdGE9PT0iXSIpKXtpZihiZT09PTApcmV0dXJuIE8oU2UpO2JlLS19cmV0dXJuIFNlfTtyZXR1cm5bemUsaXRdfXZhciBocj1TaTtmdW5jdGlvbiB1cihhKXtyZXR1cm4gSGEoYSl9ZnVuY3Rpb24gJGEoYSl7cmV0dXJuIEhhKGEsZ2kpfWZ1bmN0aW9uIEhhKGEsdSl7dmFyIG09RS5nZXRHbG9iYWxUaGlzKCk7bS5fX1ZVRV9fPSEwO3ZhcntpbnNlcnQ6UyxyZW1vdmU6SSxwYXRjaFByb3A6Tyxmb3JjZVBhdGNoUHJvcDpGLGNyZWF0ZUVsZW1lbnQ6VyxjcmVhdGVUZXh0OkcsY3JlYXRlQ29tbWVudDpsZSxzZXRUZXh0OnplLHNldEVsZW1lbnRUZXh0Oml0LHBhcmVudE5vZGU6ZGUsbmV4dFNpYmxpbmc6R2Usc2V0U2NvcGVJZDpxZT1FLk5PT1AsaW5zZXJ0U3RhdGljQ29udGVudDpfdH09YSxhdD1mdW5jdGlvbihNLGosYWUpe3ZhciBuZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106bnVsbCxpZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxWZT1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06bnVsbCxydD1hcmd1bWVudHMubGVuZ3RoPjYmJmFyZ3VtZW50c1s2XSE9PXZvaWQgMD9hcmd1bWVudHNbNl06ITEsWWU9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOm51bGwsS2U9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOiEhai5keW5hbWljQ2hpbGRyZW47aWYoTSE9PWope00mJiFxdChNLGopJiYobmU9QWUoTSksUWUoTSxpZSxWZSwhMCksTT1udWxsKSxqLnBhdGNoRmxhZz09PS0yJiYoS2U9ITEsai5keW5hbWljQ2hpbGRyZW49bnVsbCk7dmFye3R5cGU6VWUscmVmOkh0LHNoYXBlRmxhZzp2dH09ajtzd2l0Y2goVWUpe2Nhc2UgZWU6U2UoTSxqLGFlLG5lKTticmVhaztjYXNlIGNlOmJlKE0saixhZSxuZSk7YnJlYWs7Y2FzZSBoZTpNPT1udWxsJiZDZShqLGFlLG5lLHJ0KTticmVhaztjYXNlIEo6ayhNLGosYWUsbmUsaWUsVmUscnQsWWUsS2UpO2JyZWFrO2RlZmF1bHQ6dnQmMT9QdChNLGosYWUsbmUsaWUsVmUscnQsWWUsS2UpOnZ0JjY/TChNLGosYWUsbmUsaWUsVmUscnQsWWUsS2UpOih2dCY2NHx8dnQmMTI4KSYmVWUucHJvY2VzcyhNLGosYWUsbmUsaWUsVmUscnQsWWUsS2UsQXQpfUh0IT1udWxsJiZpZSYmc28oSHQsTSYmTS5yZWYsVmUsanx8TSwhail9fSxTZT0oTSxqLGFlLG5lKT0+e2lmKE09PW51bGwpUyhqLmVsPUcoai5jaGlsZHJlbiksYWUsbmUpO2Vsc2V7dmFyIGllPWouZWw9TS5lbDtqLmNoaWxkcmVuIT09TS5jaGlsZHJlbiYmemUoaWUsai5jaGlsZHJlbil9fSxiZT0oTSxqLGFlLG5lKT0+e009PW51bGw/UyhqLmVsPWxlKGouY2hpbGRyZW58fCIiKSxhZSxuZSk6ai5lbD1NLmVsfSxDZT0oTSxqLGFlLG5lKT0+e1tNLmVsLE0uYW5jaG9yXT1fdChNLmNoaWxkcmVuLGosYWUsbmUsTS5lbCxNLmFuY2hvcil9LHN0PShNLGosYWUpPT57Zm9yKHZhcntlbDpuZSxhbmNob3I6aWV9PU0sVmU7bmUmJm5lIT09aWU7KVZlPUdlKG5lKSxTKG5lLGosYWUpLG5lPVZlO1MoaWUsaixhZSl9LEZlPU09Pntmb3IodmFye2VsOmosYW5jaG9yOmFlfT1NLG5lO2omJmohPT1hZTspbmU9R2UoaiksSShqKSxqPW5lO0koYWUpfSxQdD0oTSxqLGFlLG5lLGllLFZlLHJ0LFllLEtlKT0+e3J0PXJ0fHxqLnR5cGU9PT0ic3ZnIixNPT1udWxsP2koaixhZSxuZSxpZSxWZSxydCxZZSxLZSk6XyhNLGosaWUsVmUscnQsWWUsS2UpfSxpPShNLGosYWUsbmUsaWUsVmUscnQsWWUpPT57dmFyIEtlLFVlLHt0eXBlOkh0LHByb3BzOnZ0LHNoYXBlRmxhZzpCdCx0cmFuc2l0aW9uOk10LGRpcnM6RG59PU07aWYoS2U9TS5lbD1XKE0udHlwZSxWZSx2dCYmdnQuaXMsdnQpLEJ0Jjg/aXQoS2UsTS5jaGlsZHJlbik6QnQmMTYmJmQoTS5jaGlsZHJlbixLZSxudWxsLG5lLGllLFZlJiZIdCE9PSJmb3JlaWduT2JqZWN0IixydCxZZSksRG4mJldyKE0sbnVsbCxuZSwiY3JlYXRlZCIpLGwoS2UsTSxNLnNjb3BlSWQscnQsbmUpLHZ0KXtmb3IodmFyIE1uIGluIHZ0KU1uIT09InZhbHVlIiYmIUUuaXNSZXNlcnZlZFByb3AoTW4pJiZPKEtlLE1uLG51bGwsdnRbTW5dLFZlLE0uY2hpbGRyZW4sbmUsaWUsTGUsTS5ob3N0SW5zdGFuY2UpOyJ2YWx1ZSJpbiB2dCYmTyhLZSwidmFsdWUiLG51bGwsdnQudmFsdWUsITEsW10sbmUsbnVsbCx2b2lkIDAsTS5ob3N0SW5zdGFuY2UpLChVZT12dC5vblZub2RlQmVmb3JlTW91bnQpJiZDcihVZSxuZSxNKX1EbiYmV3IoTSxudWxsLG5lLCJiZWZvcmVNb3VudCIpO3ZhciBibj0oIWllfHxpZSYmIWllLnBlbmRpbmdCcmFuY2gpJiZNdCYmIU10LnBlcnNpc3RlZDtibiYmTXQuYmVmb3JlRW50ZXIoS2UpLFMoS2UsaixhZSksKChVZT12dCYmdnQub25Wbm9kZU1vdW50ZWQpfHxibnx8RG4pJiZocigoKT0+e1VlJiZDcihVZSxuZSxNKSxibiYmTXQuZW50ZXIoS2UpLERuJiZXcihNLG51bGwsbmUsIm1vdW50ZWQiKX0saWUpfSxsPShNLGosYWUsbmUsaWUpPT57aWYoYWUmJnFlKE0sYWUpLG5lKWZvcih2YXIgVmU9MDtWZTxuZS5sZW5ndGg7VmUrKylxZShNLG5lW1ZlXSk7aWYoaWUpe3ZhciBydD1pZS5zdWJUcmVlO2lmKGo9PT1ydCl7dmFyIFllPWllLnZub2RlO2woTSxZZSxZZS5zY29wZUlkLFllLnNsb3RTY29wZUlkcyxpZS5wYXJlbnQpfX19LGQ9ZnVuY3Rpb24oTSxqLGFlLG5lLGllLFZlLHJ0LFllKXtmb3IodmFyIEtlPWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTowLFVlPUtlO1VlPE0ubGVuZ3RoO1VlKyspe3ZhciBIdD1NW1VlXT1ZZT9XbihNW1VlXSk6em4oTVtVZV0pO2F0KG51bGwsSHQsaixhZSxuZSxpZSxWZSxydCxZZSl9fSxfPShNLGosYWUsbmUsaWUsVmUscnQpPT57dmFyIFllPWouZWw9TS5lbCx7cGF0Y2hGbGFnOktlLGR5bmFtaWNDaGlsZHJlbjpVZSxkaXJzOkh0fT1qO0tlfD1NLnBhdGNoRmxhZyYxNjt2YXIgdnQ9TS5wcm9wc3x8RS5FTVBUWV9PQkosQnQ9ai5wcm9wc3x8RS5FTVBUWV9PQkosTXQ7YWUmJlhpKGFlLCExKSwoTXQ9QnQub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJkNyKE10LGFlLGosTSksSHQmJldyKGosTSxhZSwiYmVmb3JlVXBkYXRlIiksYWUmJlhpKGFlLCEwKTt2YXIgRG49aWUmJmoudHlwZSE9PSJmb3JlaWduT2JqZWN0IjtpZihVZT9BKE0uZHluYW1pY0NoaWxkcmVuLFVlLFllLGFlLG5lLERuLFZlKTpydHx8dWUoTSxqLFllLG51bGwsYWUsbmUsRG4sVmUsITEpLEtlPjApe2lmKEtlJjE2KUMoWWUsaix2dCxCdCxhZSxuZSxpZSk7ZWxzZSBpZihLZSYyJiZ2dC5jbGFzcyE9PUJ0LmNsYXNzJiZPKFllLCJjbGFzcyIsbnVsbCxCdC5jbGFzcyxpZSxbXSxhZSxudWxsLHZvaWQgMCxqLmhvc3RJbnN0YW5jZSksS2UmNCYmTyhZZSwic3R5bGUiLHZ0LnN0eWxlLEJ0LnN0eWxlLGllLFtdLGFlLG51bGwsdm9pZCAwLGouaG9zdEluc3RhbmNlKSxLZSY4KWZvcih2YXIgTW49ai5keW5hbWljUHJvcHMsYm49MDtibjxNbi5sZW5ndGg7Ym4rKyl7dmFyIFNuPU1uW2JuXSxncj12dFtTbl0sYWk9QnRbU25dOyhhaSE9PWdyfHxTbj09PSJ2YWx1ZSJ8fEYmJkYoWWUsU24pKSYmTyhZZSxTbixncixhaSxpZSxNLmNoaWxkcmVuLGFlLG5lLExlLGouaG9zdEluc3RhbmNlKX1LZSYxJiZNLmNoaWxkcmVuIT09ai5jaGlsZHJlbiYmaXQoWWUsai5jaGlsZHJlbil9ZWxzZSFydCYmVWU9PW51bGwmJkMoWWUsaix2dCxCdCxhZSxuZSxpZSk7KChNdD1CdC5vblZub2RlVXBkYXRlZCl8fEh0KSYmaHIoKCk9PntNdCYmQ3IoTXQsYWUsaixNKSxIdCYmV3IoaixNLGFlLCJ1cGRhdGVkIil9LG5lKX0sQT0oTSxqLGFlLG5lLGllLFZlLHJ0KT0+e2Zvcih2YXIgWWU9MDtZZTxqLmxlbmd0aDtZZSsrKXt2YXIgS2U9TVtZZV0sVWU9altZZV0sSHQ9S2UuZWwmJihLZS50eXBlPT09Snx8IXF0KEtlLFVlKXx8S2Uuc2hhcGVGbGFnJig2fDY0KSk/ZGUoS2UuZWwpOmFlO2F0KEtlLFVlLEh0LG51bGwsbmUsaWUsVmUscnQsITApfX0sQz0oTSxqLGFlLG5lLGllLFZlLHJ0KT0+e2lmKGFlIT09bmUpe2lmKGFlIT09RS5FTVBUWV9PQkopZm9yKHZhciBZZSBpbiBhZSkhRS5pc1Jlc2VydmVkUHJvcChZZSkmJiEoWWUgaW4gbmUpJiZPKE0sWWUsYWVbWWVdLG51bGwscnQsai5jaGlsZHJlbixpZSxWZSxMZSxqLmhvc3RJbnN0YW5jZSk7Zm9yKHZhciBLZSBpbiBuZSlpZighRS5pc1Jlc2VydmVkUHJvcChLZSkpe3ZhciBVZT1uZVtLZV0sSHQ9YWVbS2VdOyhVZSE9PUh0JiZLZSE9PSJ2YWx1ZSJ8fEYmJkYoTSxLZSkpJiZPKE0sS2UsSHQsVWUscnQsai5jaGlsZHJlbixpZSxWZSxMZSxqLmhvc3RJbnN0YW5jZSl9InZhbHVlImluIG5lJiZPKE0sInZhbHVlIixhZS52YWx1ZSxuZS52YWx1ZSwhMSxbXSxpZSxudWxsLHZvaWQgMCxqLmhvc3RJbnN0YW5jZSl9fSxrPShNLGosYWUsbmUsaWUsVmUscnQsWWUsS2UpPT57dmFyIFVlPWouZWw9TT9NLmVsOkcoIiIpLEh0PWouYW5jaG9yPU0/TS5hbmNob3I6RygiIikse3BhdGNoRmxhZzp2dCxkeW5hbWljQ2hpbGRyZW46QnQsc2xvdFNjb3BlSWRzOk10fT1qO010JiYoWWU9WWU/WWUuY29uY2F0KE10KTpNdCksTT09bnVsbD8oUyhVZSxhZSxuZSksUyhIdCxhZSxuZSksZChqLmNoaWxkcmVuLGFlLEh0LGllLFZlLHJ0LFllLEtlKSk6dnQ+MCYmdnQmNjQmJkJ0JiZNLmR5bmFtaWNDaGlsZHJlbj8oQShNLmR5bmFtaWNDaGlsZHJlbixCdCxhZSxpZSxWZSxydCxZZSksKGoua2V5IT1udWxsfHxpZSYmaj09PWllLnN1YlRyZWUpJiZsbyhNLGosITApKTp1ZShNLGosYWUsSHQsaWUsVmUscnQsWWUsS2UpfSxMPShNLGosYWUsbmUsaWUsVmUscnQsWWUsS2UpPT57ai5zbG90U2NvcGVJZHM9WWUsTT09bnVsbD9qLnNoYXBlRmxhZyY1MTI/aWUuY3R4LmFjdGl2YXRlKGosYWUsbmUscnQsS2UpOkgoaixhZSxuZSxpZSxWZSxydCxLZSk6dGUoTSxqLEtlKX0sSD0oTSxqLGFlLG5lLGllLFZlLHJ0KT0+e3ZhciBZZT1NLmNvbXBvbmVudD1jcyhNLG5lLGllKTtpZihCbihNKSYmKFllLmN0eC5yZW5kZXJlcj1BdCksdXMoWWUpLFllLmFzeW5jRGVwKXtpZihpZSYmaWUucmVnaXN0ZXJEZXAoWWUsZ2UpLCFNLmVsKXt2YXIgS2U9WWUuc3ViVHJlZT0kdChjZSk7YmUobnVsbCxLZSxqLGFlKX1yZXR1cm59Z2UoWWUsTSxqLGFlLGllLFZlLHJ0KX0sdGU9KE0saixhZSk9Pnt2YXIgbmU9ai5jb21wb25lbnQ9TS5jb21wb25lbnQ7aWYoV2koTSxqLGFlKSlpZihuZS5hc3luY0RlcCYmIW5lLmFzeW5jUmVzb2x2ZWQpe2tlKG5lLGosYWUpO3JldHVybn1lbHNlIG5lLm5leHQ9aiwkcihuZS51cGRhdGUpLG5lLnVwZGF0ZSgpO2Vsc2Ugai5lbD1NLmVsLG5lLnZub2RlPWp9LGdlPShNLGosYWUsbmUsaWUsVmUscnQpPT57dmFyIFllPSgpPT57aWYoTS5pc01vdW50ZWQpe3ZhcntuZXh0OmVuLGJ1OmNuLHU6Zm8scGFyZW50OnEsdm5vZGU6UX09TSxtZT1lbixSZTtYaShNLCExKSxlbj8oZW4uZWw9US5lbCxrZShNLGVuLHJ0KSk6ZW49USxjbiYmRS5pbnZva2VBcnJheUZucyhjbiksKFJlPWVuLnByb3BzJiZlbi5wcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSYmQ3IoUmUscSxlbixRKSxYaShNLCEwKTt2YXIgTWU9S28oTSksWGU9TS5zdWJUcmVlO00uc3ViVHJlZT1NZSxhdChYZSxNZSxkZShYZS5lbCksQWUoWGUpLE0saWUsVmUpLGVuLmVsPU1lLmVsLG1lPT09bnVsbCYmaW8oTSxNZS5lbCksZm8mJmhyKGZvLGllKSwoUmU9ZW4ucHJvcHMmJmVuLnByb3BzLm9uVm5vZGVVcGRhdGVkKSYmaHIoKCk9PkNyKFJlLHEsZW4sUSksaWUpfWVsc2V7dmFyIEh0LHtlbDp2dCxwcm9wczpCdH09aix7Ym06TXQsbTpEbixwYXJlbnQ6TW59PU0sYm49THIoaik7aWYoWGkoTSwhMSksTXQmJkUuaW52b2tlQXJyYXlGbnMoTXQpLCFibiYmKEh0PUJ0JiZCdC5vblZub2RlQmVmb3JlTW91bnQpJiZDcihIdCxNbixqKSxYaShNLCEwKSx2dCYmeHQpe3ZhciBTbj0oKT0+e00uc3ViVHJlZT1LbyhNKSx4dCh2dCxNLnN1YlRyZWUsTSxpZSxudWxsKX07Ym4/ai50eXBlLl9fYXN5bmNMb2FkZXIoKS50aGVuKCgpPT4hTS5pc1VubW91bnRlZCYmU24oKSk6U24oKX1lbHNle3ZhciBncj1NLnN1YlRyZWU9S28oTSk7YXQobnVsbCxncixhZSxuZSxNLGllLFZlKSxqLmVsPWdyLmVsfWlmKERuJiZocihEbixpZSksIWJuJiYoSHQ9QnQmJkJ0Lm9uVm5vZGVNb3VudGVkKSl7dmFyIGFpPWo7aHIoKCk9PkNyKEh0LE1uLGFpKSxpZSl9KGouc2hhcGVGbGFnJjI1Nnx8TW4mJkxyKE1uLnZub2RlKSYmTW4udm5vZGUuc2hhcGVGbGFnJjI1NikmJk0uYSYmaHIoTS5hLGllKSxNLmlzTW91bnRlZD0hMCxqPWFlPW5lPW51bGx9fSxLZT1NLmVmZmVjdD1uZXcgUi5SZWFjdGl2ZUVmZmVjdChZZSwoKT0+Q24oVWUpLE0uc2NvcGUpLFVlPU0udXBkYXRlPSgpPT5LZS5ydW4oKTtVZS5pZD1NLnVpZCxYaShNLCEwKSxVZSgpfSxrZT0oTSxqLGFlKT0+e2ouY29tcG9uZW50PU07dmFyIG5lPU0udm5vZGUucHJvcHM7TS52bm9kZT1qLE0ubmV4dD1udWxsLGlzKE0sai5wcm9wcyxuZSxhZSksb3MoTSxqLmNoaWxkcmVuLGFlKSxSLnBhdXNlVHJhY2tpbmcoKSx5aSgpLFIucmVzZXRUcmFja2luZygpfSx1ZT1mdW5jdGlvbihNLGosYWUsbmUsaWUsVmUscnQsWWUpe3ZhciBLZT1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06ITEsVWU9TSYmTS5jaGlsZHJlbixIdD1NP00uc2hhcGVGbGFnOjAsdnQ9ai5jaGlsZHJlbix7cGF0Y2hGbGFnOkJ0LHNoYXBlRmxhZzpNdH09ajtpZihCdD4wKXtpZihCdCYxMjgpe1dlKFVlLHZ0LGFlLG5lLGllLFZlLHJ0LFllLEtlKTtyZXR1cm59ZWxzZSBpZihCdCYyNTYpe1BlKFVlLHZ0LGFlLG5lLGllLFZlLHJ0LFllLEtlKTtyZXR1cm59fU10Jjg/KEh0JjE2JiZMZShVZSxpZSxWZSksdnQhPT1VZSYmaXQoYWUsdnQpKTpIdCYxNj9NdCYxNj9XZShVZSx2dCxhZSxuZSxpZSxWZSxydCxZZSxLZSk6TGUoVWUsaWUsVmUsITApOihIdCY4JiZpdChhZSwiIiksTXQmMTYmJmQodnQsYWUsbmUsaWUsVmUscnQsWWUsS2UpKX0sUGU9KE0saixhZSxuZSxpZSxWZSxydCxZZSxLZSk9PntNPU18fEUuRU1QVFlfQVJSLGo9anx8RS5FTVBUWV9BUlI7dmFyIFVlPU0ubGVuZ3RoLEh0PWoubGVuZ3RoLHZ0PU1hdGgubWluKFVlLEh0KSxCdDtmb3IoQnQ9MDtCdDx2dDtCdCsrKXt2YXIgTXQ9altCdF09S2U/V24oaltCdF0pOnpuKGpbQnRdKTthdChNW0J0XSxNdCxhZSxudWxsLGllLFZlLHJ0LFllLEtlKX1VZT5IdD9MZShNLGllLFZlLCEwLCExLHZ0KTpkKGosYWUsbmUsaWUsVmUscnQsWWUsS2UsdnQpfSxXZT0oTSxqLGFlLG5lLGllLFZlLHJ0LFllLEtlKT0+e2Zvcih2YXIgVWU9MCxIdD1qLmxlbmd0aCx2dD1NLmxlbmd0aC0xLEJ0PUh0LTE7VWU8PXZ0JiZVZTw9QnQ7KXt2YXIgTXQ9TVtVZV0sRG49altVZV09S2U/V24oaltVZV0pOnpuKGpbVWVdKTtpZihxdChNdCxEbikpYXQoTXQsRG4sYWUsbnVsbCxpZSxWZSxydCxZZSxLZSk7ZWxzZSBicmVhaztVZSsrfWZvcig7VWU8PXZ0JiZVZTw9QnQ7KXt2YXIgTW49TVt2dF0sYm49altCdF09S2U/V24oaltCdF0pOnpuKGpbQnRdKTtpZihxdChNbixibikpYXQoTW4sYm4sYWUsbnVsbCxpZSxWZSxydCxZZSxLZSk7ZWxzZSBicmVhazt2dC0tLEJ0LS19aWYoVWU+dnQpe2lmKFVlPD1CdClmb3IodmFyIFNuPUJ0KzEsZ3I9U248SHQ/altTbl0uZWw6bmU7VWU8PUJ0OylhdChudWxsLGpbVWVdPUtlP1duKGpbVWVdKTp6bihqW1VlXSksYWUsZ3IsaWUsVmUscnQsWWUsS2UpLFVlKyt9ZWxzZSBpZihVZT5CdClmb3IoO1VlPD12dDspUWUoTVtVZV0saWUsVmUsITApLFVlKys7ZWxzZXt2YXIgYWk9VWUsZW49VWUsY249bmV3IE1hcDtmb3IoVWU9ZW47VWU8PUJ0O1VlKyspe3ZhciBmbz1qW1VlXT1LZT9XbihqW1VlXSk6em4oaltVZV0pO2ZvLmtleSE9bnVsbCYmY24uc2V0KGZvLmtleSxVZSl9dmFyIHEsUT0wLG1lPUJ0LWVuKzEsUmU9ITEsTWU9MCxYZT1uZXcgQXJyYXkobWUpO2ZvcihVZT0wO1VlPG1lO1VlKyspWGVbVWVdPTA7Zm9yKFVlPWFpO1VlPD12dDtVZSsrKXt2YXIgYnQ9TVtVZV07aWYoUT49bWUpe1FlKGJ0LGllLFZlLCEwKTtjb250aW51ZX12YXIgZXQ9dm9pZCAwO2lmKGJ0LmtleSE9bnVsbClldD1jbi5nZXQoYnQua2V5KTtlbHNlIGZvcihxPWVuO3E8PUJ0O3ErKylpZihYZVtxLWVuXT09PTAmJnF0KGJ0LGpbcV0pKXtldD1xO2JyZWFrfWV0PT09dm9pZCAwP1FlKGJ0LGllLFZlLCEwKTooWGVbZXQtZW5dPVVlKzEsZXQ+PU1lP01lPWV0OlJlPSEwLGF0KGJ0LGpbZXRdLGFlLG51bGwsaWUsVmUscnQsWWUsS2UpLFErKyl9dmFyIHR0PVJlP2NvKFhlKTpFLkVNUFRZX0FSUjtmb3IocT10dC5sZW5ndGgtMSxVZT1tZS0xO1VlPj0wO1VlLS0pe3ZhciAkZT1lbitVZSxXdD1qWyRlXSxGdD0kZSsxPEh0P2pbJGUrMV0uZWw6bmU7WGVbVWVdPT09MD9hdChudWxsLFd0LGFlLEZ0LGllLFZlLHJ0LFllLEtlKTpSZSYmKHE8MHx8VWUhPT10dFtxXT91dChXdCxhZSxGdCwyKTpxLS0pfX19LHV0PWZ1bmN0aW9uKE0saixhZSxuZSl7dmFyIGllPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLHtlbDpWZSx0eXBlOnJ0LHRyYW5zaXRpb246WWUsY2hpbGRyZW46S2Usc2hhcGVGbGFnOlVlfT1NO2lmKFVlJjYpe3V0KE0uY29tcG9uZW50LnN1YlRyZWUsaixhZSxuZSk7cmV0dXJufWlmKFVlJjEyOCl7TS5zdXNwZW5zZS5tb3ZlKGosYWUsbmUpO3JldHVybn1pZihVZSY2NCl7cnQubW92ZShNLGosYWUsQXQpO3JldHVybn1pZihydD09PUope1MoVmUsaixhZSk7Zm9yKHZhciBIdD0wO0h0PEtlLmxlbmd0aDtIdCsrKXV0KEtlW0h0XSxqLGFlLG5lKTtTKE0uYW5jaG9yLGosYWUpO3JldHVybn1pZihydD09PWhlKXtzdChNLGosYWUpO3JldHVybn12YXIgdnQ9bmUhPT0yJiZVZSYxJiZZZTtpZih2dClpZihuZT09PTApWWUuYmVmb3JlRW50ZXIoVmUpLFMoVmUsaixhZSksaHIoKCk9PlllLmVudGVyKFZlKSxpZSk7ZWxzZXt2YXJ7bGVhdmU6QnQsZGVsYXlMZWF2ZTpNdCxhZnRlckxlYXZlOkRufT1ZZSxNbj0oKT0+UyhWZSxqLGFlKSxibj0oKT0+e0J0KFZlLCgpPT57TW4oKSxEbiYmRG4oKX0pfTtNdD9NdChWZSxNbixibik6Ym4oKX1lbHNlIFMoVmUsaixhZSl9LFFlPWZ1bmN0aW9uKE0saixhZSl7dmFyIG5lPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxpZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06ITEse3R5cGU6VmUscHJvcHM6cnQscmVmOlllLGNoaWxkcmVuOktlLGR5bmFtaWNDaGlsZHJlbjpVZSxzaGFwZUZsYWc6SHQscGF0Y2hGbGFnOnZ0LGRpcnM6QnR9PU07aWYoWWUhPW51bGwmJnNvKFllLG51bGwsYWUsTSwhMCksSHQmMjU2KXtqLmN0eC5kZWFjdGl2YXRlKE0pO3JldHVybn12YXIgTXQ9SHQmMSYmQnQsRG49IUxyKE0pLE1uO2lmKERuJiYoTW49cnQmJnJ0Lm9uVm5vZGVCZWZvcmVVbm1vdW50KSYmQ3IoTW4saixNKSxIdCY2KV9lKE0uY29tcG9uZW50LGFlLG5lKTtlbHNle2lmKEh0JjEyOCl7TS5zdXNwZW5zZS51bm1vdW50KGFlLG5lKTtyZXR1cm59TXQmJldyKE0sbnVsbCxqLCJiZWZvcmVVbm1vdW50IiksSHQmNjQ/TS50eXBlLnJlbW92ZShNLGosYWUsaWUsQXQsbmUpOlVlJiYoVmUhPT1KfHx2dD4wJiZ2dCY2NCk/TGUoVWUsaixhZSwhMSwhMCk6KFZlPT09SiYmdnQmKDEyOHwyNTYpfHwhaWUmJkh0JjE2KSYmTGUoS2UsaixhZSksbmUmJkllKE0pfShEbiYmKE1uPXJ0JiZydC5vblZub2RlVW5tb3VudGVkKXx8TXQpJiZocigoKT0+e01uJiZDcihNbixqLE0pLE10JiZXcihNLG51bGwsaiwidW5tb3VudGVkIil9LGFlKX0sSWU9TT0+e3Zhcnt0eXBlOmosZWw6YWUsYW5jaG9yOm5lLHRyYW5zaXRpb246aWV9PU07aWYoaj09PUope3BlKGFlLG5lKTtyZXR1cm59aWYoaj09PWhlKXtGZShNKTtyZXR1cm59dmFyIFZlPSgpPT57SShhZSksaWUmJiFpZS5wZXJzaXN0ZWQmJmllLmFmdGVyTGVhdmUmJmllLmFmdGVyTGVhdmUoKX07aWYoTS5zaGFwZUZsYWcmMSYmaWUmJiFpZS5wZXJzaXN0ZWQpe3ZhcntsZWF2ZTpydCxkZWxheUxlYXZlOlllfT1pZSxLZT0oKT0+cnQoYWUsVmUpO1llP1llKE0uZWwsVmUsS2UpOktlKCl9ZWxzZSBWZSgpfSxwZT0oTSxqKT0+e2Zvcih2YXIgYWU7TSE9PWo7KWFlPUdlKE0pLEkoTSksTT1hZTtJKGopfSxfZT0oTSxqLGFlKT0+e3ZhcntidW06bmUsc2NvcGU6aWUsdXBkYXRlOlZlLHN1YlRyZWU6cnQsdW06WWV9PU07bmUmJkUuaW52b2tlQXJyYXlGbnMobmUpLGllLnN0b3AoKSxWZSYmKFZlLmFjdGl2ZT0hMSxRZShydCxNLGosYWUpKSxZZSYmaHIoWWUsaiksaHIoKCk9PntNLmlzVW5tb3VudGVkPSEwfSxqKSxqJiZqLnBlbmRpbmdCcmFuY2gmJiFqLmlzVW5tb3VudGVkJiZNLmFzeW5jRGVwJiYhTS5hc3luY1Jlc29sdmVkJiZNLnN1c3BlbnNlSWQ9PT1qLnBlbmRpbmdJZCYmKGouZGVwcy0tLGouZGVwcz09PTAmJmoucmVzb2x2ZSgpKX0sTGU9ZnVuY3Rpb24oTSxqLGFlKXtmb3IodmFyIG5lPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxpZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06ITEsVmU9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOjAscnQ9VmU7cnQ8TS5sZW5ndGg7cnQrKylRZShNW3J0XSxqLGFlLG5lLGllKX0sQWU9TT0+TS5zaGFwZUZsYWcmNj9BZShNLmNvbXBvbmVudC5zdWJUcmVlKTpNLnNoYXBlRmxhZyYxMjg/TS5zdXNwZW5zZS5uZXh0KCk6R2UoTS5hbmNob3J8fE0uZWwpLEV0PShNLGosYWUpPT57TT09bnVsbD9qLl92bm9kZSYmUWUoai5fdm5vZGUsbnVsbCxudWxsLCEwKTphdChqLl92bm9kZXx8bnVsbCxNLGosbnVsbCxudWxsLG51bGwsYWUpLHlpKCksa24oKSxqLl92bm9kZT1NfSxBdD17cDphdCx1bTpRZSxtOnV0LHI6SWUsbXQ6SCxtYzpkLHBjOnVlLHBiYzpBLG46QWUsbzphfSxKZSx4dDtyZXR1cm4gdSYmKFtKZSx4dF09dShBdCkpLHtyZW5kZXI6RXQsaHlkcmF0ZTpKZSxjcmVhdGVBcHA6c3MoRXQsSmUpfX1mdW5jdGlvbiBYaShhLHUpe3ZhcntlZmZlY3Q6bSx1cGRhdGU6U309YTttLmFsbG93UmVjdXJzZT1TLmFsbG93UmVjdXJzZT11fWZ1bmN0aW9uIGxvKGEsdSl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLFM9YS5jaGlsZHJlbixJPXUuY2hpbGRyZW47aWYoRS5pc0FycmF5KFMpJiZFLmlzQXJyYXkoSSkpZm9yKHZhciBPPTA7TzxTLmxlbmd0aDtPKyspe3ZhciBGPVNbT10sVz1JW09dO1cuc2hhcGVGbGFnJjEmJiFXLmR5bmFtaWNDaGlsZHJlbiYmKChXLnBhdGNoRmxhZzw9MHx8Vy5wYXRjaEZsYWc9PT0zMikmJihXPUlbT109V24oSVtPXSksVy5lbD1GLmVsKSxtfHxsbyhGLFcpKSxXLnR5cGU9PT1lZSYmKFcuZWw9Ri5lbCl9fWZ1bmN0aW9uIGNvKGEpe3ZhciB1PWEuc2xpY2UoKSxtPVswXSxTLEksTyxGLFcsRz1hLmxlbmd0aDtmb3IoUz0wO1M8RztTKyspe3ZhciBsZT1hW1NdO2lmKGxlIT09MCl7aWYoST1tW20ubGVuZ3RoLTFdLGFbSV08bGUpe3VbU109SSxtLnB1c2goUyk7Y29udGludWV9Zm9yKE89MCxGPW0ubGVuZ3RoLTE7TzxGOylXPU8rRj4+MSxhW21bV11dPGxlP089VysxOkY9VztsZTxhW21bT11dJiYoTz4wJiYodVtTXT1tW08tMV0pLG1bT109Uyl9fWZvcihPPW0ubGVuZ3RoLEY9bVtPLTFdO08tLSA+MDspbVtPXT1GLEY9dVtGXTtyZXR1cm4gbX12YXIgbHM9YT0+YS5fX2lzVGVsZXBvcnQscGE9YT0+YSYmKGEuZGlzYWJsZWR8fGEuZGlzYWJsZWQ9PT0iIiksTW89YT0+dHlwZW9mIFNWR0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZhIGluc3RhbmNlb2YgU1ZHRWxlbWVudCx2YT0oYSx1KT0+e3ZhciBtPWEmJmEudG87aWYoRS5pc1N0cmluZyhtKSlpZih1KXt2YXIgUz11KG0pO3JldHVybiBTfWVsc2UgcmV0dXJuIG51bGw7ZWxzZSByZXR1cm4gbX0sdj17X19pc1RlbGVwb3J0OiEwLHByb2Nlc3MoYSx1LG0sUyxJLE8sRixXLEcsbGUpe3ZhcnttYzp6ZSxwYzppdCxwYmM6ZGUsbzp7aW5zZXJ0OkdlLHF1ZXJ5U2VsZWN0b3I6cWUsY3JlYXRlVGV4dDpfdCxjcmVhdGVDb21tZW50OmF0fX09bGUsU2U9cGEodS5wcm9wcykse3NoYXBlRmxhZzpiZSxjaGlsZHJlbjpDZSxkeW5hbWljQ2hpbGRyZW46c3R9PXU7aWYoYT09bnVsbCl7dmFyIEZlPXUuZWw9X3QoIiIpLFB0PXUuYW5jaG9yPV90KCIiKTtHZShGZSxtLFMpLEdlKFB0LG0sUyk7dmFyIGk9dS50YXJnZXQ9dmEodS5wcm9wcyxxZSksbD11LnRhcmdldEFuY2hvcj1fdCgiIik7aSYmKEdlKGwsaSksRj1GfHxNbyhpKSk7dmFyIGQ9KGdlLGtlKT0+e2JlJjE2JiZ6ZShDZSxnZSxrZSxJLE8sRixXLEcpfTtTZT9kKG0sUHQpOmkmJmQoaSxsKX1lbHNle3UuZWw9YS5lbDt2YXIgXz11LmFuY2hvcj1hLmFuY2hvcixBPXUudGFyZ2V0PWEudGFyZ2V0LEM9dS50YXJnZXRBbmNob3I9YS50YXJnZXRBbmNob3Isaz1wYShhLnByb3BzKSxMPWs/bTpBLEg9az9fOkM7aWYoRj1GfHxNbyhBKSxzdD8oZGUoYS5keW5hbWljQ2hpbGRyZW4sc3QsTCxJLE8sRixXKSxsbyhhLHUsITApKTpHfHxpdChhLHUsTCxILEksTyxGLFcsITEpLFNlKWt8fHgodSxtLF8sbGUsMSk7ZWxzZSBpZigodS5wcm9wcyYmdS5wcm9wcy50bykhPT0oYS5wcm9wcyYmYS5wcm9wcy50bykpe3ZhciB0ZT11LnRhcmdldD12YSh1LnByb3BzLHFlKTt0ZSYmeCh1LHRlLG51bGwsbGUsMCl9ZWxzZSBrJiZ4KHUsQSxDLGxlLDEpfVoodSl9LHJlbW92ZShhLHUsbSxTLEksTyl7dmFye3VtOkYsbzp7cmVtb3ZlOld9fT1JLHtzaGFwZUZsYWc6RyxjaGlsZHJlbjpsZSxhbmNob3I6emUsdGFyZ2V0QW5jaG9yOml0LHRhcmdldDpkZSxwcm9wczpHZX09YTtpZihkZSYmVyhpdCksKE98fCFwYShHZSkpJiYoVyh6ZSksRyYxNikpZm9yKHZhciBxZT0wO3FlPGxlLmxlbmd0aDtxZSsrKXt2YXIgX3Q9bGVbcWVdO0YoX3QsdSxtLCEwLCEhX3QuZHluYW1pY0NoaWxkcmVuKX19LG1vdmU6eCxoeWRyYXRlOiR9O2Z1bmN0aW9uIHgoYSx1LG0sUyl7dmFye286e2luc2VydDpJfSxtOk99PVMsRj1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06MjtGPT09MCYmSShhLnRhcmdldEFuY2hvcix1LG0pO3ZhcntlbDpXLGFuY2hvcjpHLHNoYXBlRmxhZzpsZSxjaGlsZHJlbjp6ZSxwcm9wczppdH09YSxkZT1GPT09MjtpZihkZSYmSShXLHUsbSksKCFkZXx8cGEoaXQpKSYmbGUmMTYpZm9yKHZhciBHZT0wO0dlPHplLmxlbmd0aDtHZSsrKU8oemVbR2VdLHUsbSwyKTtkZSYmSShHLHUsbSl9ZnVuY3Rpb24gJChhLHUsbSxTLEksTyxGLFcpe3ZhcntvOntuZXh0U2libGluZzpHLHBhcmVudE5vZGU6bGUscXVlcnlTZWxlY3Rvcjp6ZX19PUYsaXQ9dS50YXJnZXQ9dmEodS5wcm9wcyx6ZSk7aWYoaXQpe3ZhciBkZT1pdC5fbHBhfHxpdC5maXJzdENoaWxkO2lmKHUuc2hhcGVGbGFnJjE2KWlmKHBhKHUucHJvcHMpKXUuYW5jaG9yPVcoRyhhKSx1LGxlKGEpLG0sUyxJLE8pLHUudGFyZ2V0QW5jaG9yPWRlO2Vsc2V7dS5hbmNob3I9RyhhKTtmb3IodmFyIEdlPWRlO0dlOylpZihHZT1HKEdlKSxHZSYmR2Uubm9kZVR5cGU9PT04JiZHZS5kYXRhPT09InRlbGVwb3J0IGFuY2hvciIpe3UudGFyZ2V0QW5jaG9yPUdlLGl0Ll9scGE9dS50YXJnZXRBbmNob3ImJkcodS50YXJnZXRBbmNob3IpO2JyZWFrfVcoZGUsdSxpdCxtLFMsSSxPKX1aKHUpfXJldHVybiB1LmFuY2hvciYmRyh1LmFuY2hvcil9dmFyIFU9djtmdW5jdGlvbiBaKGEpe3ZhciB1PWEuY3R4O2lmKHUmJnUudXQpe2Zvcih2YXIgbT1hLmNoaWxkcmVuWzBdLmVsO20hPT1hLnRhcmdldEFuY2hvcjspbS5ub2RlVHlwZT09PTEmJm0uc2V0QXR0cmlidXRlKCJkYXRhLXYtb3duZXIiLHUudWlkKSxtPW0ubmV4dFNpYmxpbmc7dS51dCgpfX12YXIgSj1TeW1ib2wodm9pZCAwKSxlZT1TeW1ib2wodm9pZCAwKSxjZT1TeW1ib2wodm9pZCAwKSxoZT1TeW1ib2wodm9pZCAwKSxUZT1bXSxmZT1udWxsO2Z1bmN0aW9uIHdlKCl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiExO1RlLnB1c2goZmU9YT9udWxsOltdKX1mdW5jdGlvbiBsdCgpe1RlLnBvcCgpLGZlPVRlW1RlLmxlbmd0aC0xXXx8bnVsbH12YXIgcHQ9MTtmdW5jdGlvbiBqdChhKXtwdCs9YX1mdW5jdGlvbiB5dChhKXtyZXR1cm4gYS5keW5hbWljQ2hpbGRyZW49cHQ+MD9mZXx8RS5FTVBUWV9BUlI6bnVsbCxsdCgpLHB0PjAmJmZlJiZmZS5wdXNoKGEpLGF9ZnVuY3Rpb24gSGUoYSx1LG0sUyxJLE8pe3JldHVybiB5dCh6dChhLHUsbSxTLEksTywhMCkpfWZ1bmN0aW9uIER0KGEsdSxtLFMsSSl7cmV0dXJuIHl0KCR0KGEsdSxtLFMsSSwhMCkpfWZ1bmN0aW9uIHZuKGEpe3JldHVybiBhP2EuX192X2lzVk5vZGU9PT0hMDohMX1mdW5jdGlvbiBxdChhLHUpe3JldHVybiBhLnR5cGU9PT11LnR5cGUmJmEua2V5PT09dS5rZXl9ZnVuY3Rpb24gZHQoYSl7fXZhciBybj0iX192SW50ZXJuYWwiLExuPWE9Pnt2YXJ7a2V5OnV9PWE7cmV0dXJuIHUhPW51bGw/dTpudWxsfSxKdD1hPT57dmFye3JlZjp1LHJlZl9rZXk6bSxyZWZfZm9yOlN9PWE7cmV0dXJuIHUhPW51bGw/RS5pc1N0cmluZyh1KXx8Ui5pc1JlZih1KXx8RS5pc0Z1bmN0aW9uKHUpP3tpOlBuLHI6dSxrOm0sZjohIVN9OnU6bnVsbH07ZnVuY3Rpb24genQoYSl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGwsbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxTPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLEk9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsTz1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06YT09PUo/MDoxLEY9YXJndW1lbnRzLmxlbmd0aD42JiZhcmd1bWVudHNbNl0hPT12b2lkIDA/YXJndW1lbnRzWzZdOiExLFc9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOiExLEc9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6YSxwcm9wczp1LGtleTp1JiZMbih1KSxyZWY6dSYmSnQodSksc2NvcGVJZDpfbixzbG90U2NvcGVJZHM6bnVsbCxjaGlsZHJlbjptLGNvbXBvbmVudDpudWxsLHN1c3BlbnNlOm51bGwsc3NDb250ZW50Om51bGwsc3NGYWxsYmFjazpudWxsLGRpcnM6bnVsbCx0cmFuc2l0aW9uOm51bGwsZWw6bnVsbCxhbmNob3I6bnVsbCx0YXJnZXQ6bnVsbCx0YXJnZXRBbmNob3I6bnVsbCxzdGF0aWNDb3VudDowLHNoYXBlRmxhZzpPLHBhdGNoRmxhZzpTLGR5bmFtaWNQcm9wczpJLGR5bmFtaWNDaGlsZHJlbjpudWxsLGFwcENvbnRleHQ6bnVsbCxob3N0SW5zdGFuY2U6UG4sY3R4OlBufTtyZXR1cm4gVz8oTnIoRyxtKSxPJjEyOCYmYS5ub3JtYWxpemUoRykpOm0mJihHLnNoYXBlRmxhZ3w9RS5pc1N0cmluZyhtKT84OjE2KSxwdD4wJiYhRiYmZmUmJihHLnBhdGNoRmxhZz4wfHxPJjYpJiZHLnBhdGNoRmxhZyE9PTMyJiZmZS5wdXNoKEcpLEd9dmFyICR0PVp0O2Z1bmN0aW9uIFp0KGEpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsLG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwsUz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxJPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLE89YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExO2lmKCghYXx8YT09PVkpJiYoYT1jZSksdm4oYSkpe3ZhciBGPXBpKGEsdSwhMCk7cmV0dXJuIG0mJk5yKEYsbSkscHQ+MCYmIU8mJmZlJiYoRi5zaGFwZUZsYWcmNj9mZVtmZS5pbmRleE9mKGEpXT1GOmZlLnB1c2goRikpLEYucGF0Y2hGbGFnfD0tMixGfWlmKEVvKGEpJiYoYT1hLl9fdmNjT3B0cyksdSl7dT1lYSh1KTt2YXJ7Y2xhc3M6VyxzdHlsZTpHfT11O1cmJiFFLmlzU3RyaW5nKFcpJiYodS5jbGFzcz1FLm5vcm1hbGl6ZUNsYXNzKFcpKSxFLmlzT2JqZWN0KEcpJiYoUi5pc1Byb3h5KEcpJiYhRS5pc0FycmF5KEcpJiYoRz1FLmV4dGVuZCh7fSxHKSksdS5zdHlsZT1FLm5vcm1hbGl6ZVN0eWxlKEcpKX12YXIgbGU9RS5pc1N0cmluZyhhKT8xOmxpKGEpPzEyODpscyhhKT82NDpFLmlzT2JqZWN0KGEpPzQ6RS5pc0Z1bmN0aW9uKGEpPzI6MDtyZXR1cm4genQoYSx1LG0sUyxJLGxlLE8sITApfWZ1bmN0aW9uIGVhKGEpe3JldHVybiBhP1IuaXNQcm94eShhKXx8cm4gaW4gYT9FLmV4dGVuZCh7fSxhKTphOm51bGx9ZnVuY3Rpb24gcGkoYSx1KXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEse3Byb3BzOlMscmVmOkkscGF0Y2hGbGFnOk8sY2hpbGRyZW46Rn09YSxXPXU/R24oU3x8e30sdSk6UyxHPXtfX3ZfaXNWTm9kZTohMCxfX3Zfc2tpcDohMCx0eXBlOmEudHlwZSxwcm9wczpXLGtleTpXJiZMbihXKSxyZWY6dSYmdS5yZWY/bSYmST9FLmlzQXJyYXkoSSk/SS5jb25jYXQoSnQodSkpOltJLEp0KHUpXTpKdCh1KTpJLHNjb3BlSWQ6YS5zY29wZUlkLHNsb3RTY29wZUlkczphLnNsb3RTY29wZUlkcyxjaGlsZHJlbjpGLHRhcmdldDphLnRhcmdldCx0YXJnZXRBbmNob3I6YS50YXJnZXRBbmNob3Isc3RhdGljQ291bnQ6YS5zdGF0aWNDb3VudCxzaGFwZUZsYWc6YS5zaGFwZUZsYWcscGF0Y2hGbGFnOnUmJmEudHlwZSE9PUo/Tz09PS0xPzE2Ok98MTY6TyxkeW5hbWljUHJvcHM6YS5keW5hbWljUHJvcHMsZHluYW1pY0NoaWxkcmVuOmEuZHluYW1pY0NoaWxkcmVuLGFwcENvbnRleHQ6YS5hcHBDb250ZXh0LGhvc3RJbnN0YW5jZTphLmhvc3RJbnN0YW5jZSxkaXJzOmEuZGlycyx0cmFuc2l0aW9uOmEudHJhbnNpdGlvbixjb21wb25lbnQ6YS5jb21wb25lbnQsc3VzcGVuc2U6YS5zdXNwZW5zZSxzc0NvbnRlbnQ6YS5zc0NvbnRlbnQmJnBpKGEuc3NDb250ZW50KSxzc0ZhbGxiYWNrOmEuc3NGYWxsYmFjayYmcGkoYS5zc0ZhbGxiYWNrKSxlbDphLmVsLGFuY2hvcjphLmFuY2hvcixjdHg6YS5jdHgsY2U6YS5jZX07cmV0dXJuIEd9ZnVuY3Rpb24gaWkoKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06IiAiLHU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjA7cmV0dXJuICR0KGVlLG51bGwsYSx1KX1mdW5jdGlvbiBRaShhLHUpe3ZhciBtPSR0KGhlLG51bGwsYSk7cmV0dXJuIG0uc3RhdGljQ291bnQ9dSxtfWZ1bmN0aW9uIGphKCl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIiLHU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiB1Pyh3ZSgpLER0KGNlLG51bGwsYSkpOiR0KGNlLG51bGwsYSl9ZnVuY3Rpb24gem4oYSl7cmV0dXJuIGE9PW51bGx8fHR5cGVvZiBhPT0iYm9vbGVhbiI/JHQoY2UpOkUuaXNBcnJheShhKT8kdChKLG51bGwsYS5zbGljZSgpKTp0eXBlb2YgYT09Im9iamVjdCI/V24oYSk6JHQoZWUsbnVsbCxTdHJpbmcoYSkpfWZ1bmN0aW9uIFduKGEpe3JldHVybiBhLmVsPT09bnVsbCYmYS5wYXRjaEZsYWchPT0tMXx8YS5tZW1vP2E6cGkoYSl9ZnVuY3Rpb24gTnIoYSx1KXt2YXIgbT0wLHtzaGFwZUZsYWc6U309YTtpZih1PT1udWxsKXU9bnVsbDtlbHNlIGlmKEUuaXNBcnJheSh1KSltPTE2O2Vsc2UgaWYodHlwZW9mIHU9PSJvYmplY3QiKWlmKFMmKDF8NjQpKXt2YXIgST11LmRlZmF1bHQ7SSYmKEkuX2MmJihJLl9kPSExKSxOcihhLEkoKSksSS5fYyYmKEkuX2Q9ITApKTtyZXR1cm59ZWxzZXttPTMyO3ZhciBPPXUuXzshTyYmIShybiBpbiB1KT91Ll9jdHg9UG46Tz09PTMmJlBuJiYoUG4uc2xvdHMuXz09PTE/dS5fPTE6KHUuXz0yLGEucGF0Y2hGbGFnfD0xMDI0KSl9ZWxzZSBFLmlzRnVuY3Rpb24odSk/KHU9e2RlZmF1bHQ6dSxfY3R4OlBufSxtPTMyKToodT1TdHJpbmcodSksUyY2ND8obT0xNix1PVtpaSh1KV0pOm09OCk7YS5jaGlsZHJlbj11LGEuc2hhcGVGbGFnfD1tfWZ1bmN0aW9uIEduKCl7Zm9yKHZhciBhPXt9LHU9MDt1PGFyZ3VtZW50cy5sZW5ndGg7dSsrKXt2YXIgbT11PDB8fGFyZ3VtZW50cy5sZW5ndGg8PXU/dm9pZCAwOmFyZ3VtZW50c1t1XTtmb3IodmFyIFMgaW4gbSlpZihTPT09ImNsYXNzIilhLmNsYXNzIT09bS5jbGFzcyYmKGEuY2xhc3M9RS5ub3JtYWxpemVDbGFzcyhbYS5jbGFzcyxtLmNsYXNzXSkpO2Vsc2UgaWYoUz09PSJzdHlsZSIpYS5zdHlsZT1FLm5vcm1hbGl6ZVN0eWxlKFthLnN0eWxlLG0uc3R5bGVdKTtlbHNlIGlmKEUuaXNPbihTKSl7dmFyIEk9YVtTXSxPPW1bU107TyYmSSE9PU8mJiEoRS5pc0FycmF5KEkpJiZJLmluY2x1ZGVzKE8pKSYmKGFbU109ST9bXS5jb25jYXQoSSxPKTpPKX1lbHNlIFMhPT0iIiYmKGFbU109bVtTXSl9cmV0dXJuIGF9ZnVuY3Rpb24gQ3IoYSx1LG0pe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO1AoYSx1LDcsW20sU10pfXZhciBxcj1hcygpLHRhPTA7ZnVuY3Rpb24gY3MoYSx1LG0pe3ZhciBTPWEudHlwZSxJPSh1P3UuYXBwQ29udGV4dDphLmFwcENvbnRleHQpfHxxcixPPXt1aWQ6dGErKyx2bm9kZTphLHR5cGU6UyxwYXJlbnQ6dSxhcHBDb250ZXh0Okkscm9vdDpudWxsLG5leHQ6bnVsbCxzdWJUcmVlOm51bGwsZWZmZWN0Om51bGwsdXBkYXRlOm51bGwsc2NvcGU6bmV3IFIuRWZmZWN0U2NvcGUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6dT91LnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoSS5wcm92aWRlcyksYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpUYShTLEkpLGVtaXRzT3B0aW9uczphcihTLEkpLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czpFLkVNUFRZX09CSixpbmhlcml0QXR0cnM6Uy5pbmhlcml0QXR0cnMsY3R4OkUuRU1QVFlfT0JKLGRhdGE6RS5FTVBUWV9PQkoscHJvcHM6RS5FTVBUWV9PQkosYXR0cnM6RS5FTVBUWV9PQkosc2xvdHM6RS5FTVBUWV9PQkoscmVmczpFLkVNUFRZX09CSixzZXR1cFN0YXRlOkUuRU1QVFlfT0JKLHNldHVwQ29udGV4dDpudWxsLHN1c3BlbnNlOm0sc3VzcGVuc2VJZDptP20ucGVuZGluZ0lkOjAsYXN5bmNEZXA6bnVsbCxhc3luY1Jlc29sdmVkOiExLGlzTW91bnRlZDohMSxpc1VubW91bnRlZDohMSxpc0RlYWN0aXZhdGVkOiExLGJjOm51bGwsYzpudWxsLGJtOm51bGwsbTpudWxsLGJ1Om51bGwsdTpudWxsLHVtOm51bGwsYnVtOm51bGwsZGE6bnVsbCxhOm51bGwscnRnOm51bGwscnRjOm51bGwsZWM6bnVsbCxzcDpudWxsfTtyZXR1cm4gTy5jdHg9e186T30sTy5yb290PXU/dS5yb290Ok8sTy5lbWl0PXVuLmJpbmQobnVsbCxPKSxhLmNlJiZhLmNlKE8pLE99dmFyIGxuPW51bGwseW49KCk9PmxufHxQbixZbj1hPT57bG49YSxhLnNjb3BlLm9uKCl9LFpuPSgpPT57bG4mJmxuLnNjb3BlLm9mZigpLGxuPW51bGx9O2Z1bmN0aW9uIFRpKGEpe3JldHVybiBhLnZub2RlLnNoYXBlRmxhZyY0fWguaXNJblNTUkNvbXBvbmVudFNldHVwPSExO2Z1bmN0aW9uIHVzKGEpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtoLmlzSW5TU1JDb21wb25lbnRTZXR1cD11O3Zhcntwcm9wczptLGNoaWxkcmVuOlN9PWEudm5vZGUsST1UaShhKTtBaShhLG0sSSx1KSxLaShhLFMpO3ZhciBPPUk/emEoYSx1KTp2b2lkIDA7cmV0dXJuIGguaXNJblNTUkNvbXBvbmVudFNldHVwPSExLE99ZnVuY3Rpb24gemEoYSx1KXt2YXIgbT1hLnR5cGU7YS5hY2Nlc3NDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLGEucHJveHk9Ui5tYXJrUmF3KG5ldyBQcm94eShhLmN0eCxvZSkpO3ZhcntzZXR1cDpTfT1tO2lmKFMpe3ZhciBJPWEuc2V0dXBDb250ZXh0PVMubGVuZ3RoPjE/WWEoYSk6bnVsbDtZbihhKSxSLnBhdXNlVHJhY2tpbmcoKTt2YXIgTz1UdChTLGEsMCxbYS5wcm9wcyxJXSk7aWYoUi5yZXNldFRyYWNraW5nKCksWm4oKSxFLmlzUHJvbWlzZShPKSl7aWYoTy50aGVuKFpuLFpuKSx1KXJldHVybiBPLnRoZW4oRj0+e0lhKGEsRix1KX0pLmNhdGNoKEY9PntDdChGLGEsMCl9KTthLmFzeW5jRGVwPU99ZWxzZSBJYShhLE8sdSl9ZWxzZSBKcihhLHUpfWZ1bmN0aW9uIElhKGEsdSxtKXtFLmlzRnVuY3Rpb24odSk/YS5yZW5kZXI9dTpFLmlzT2JqZWN0KHUpJiYoYS5zZXR1cFN0YXRlPVIucHJveHlSZWZzKHUpKSxKcihhLG0pfXZhciBuYSx1bztmdW5jdGlvbiBXYShhKXtuYT1hLHVvPXU9Pnt1LnJlbmRlci5fcmMmJih1LndpdGhQcm94eT1uZXcgUHJveHkodS5jdHgsWCkpfX12YXIgZnM9KCk9PiFuYTtmdW5jdGlvbiBKcihhLHUsbSl7dmFyIFM9YS50eXBlO2lmKCFhLnJlbmRlcil7aWYoIXUmJm5hJiYhUy5yZW5kZXIpe3ZhciBJPVMudGVtcGxhdGV8fFVuKGEpLnRlbXBsYXRlO2lmKEkpe3Zhcntpc0N1c3RvbUVsZW1lbnQ6Tyxjb21waWxlck9wdGlvbnM6Rn09YS5hcHBDb250ZXh0LmNvbmZpZyx7ZGVsaW1pdGVyczpXLGNvbXBpbGVyT3B0aW9uczpHfT1TLGxlPUUuZXh0ZW5kKEUuZXh0ZW5kKHtpc0N1c3RvbUVsZW1lbnQ6TyxkZWxpbWl0ZXJzOld9LEYpLEcpO1MucmVuZGVyPW5hKEksbGUpfX1hLnJlbmRlcj1TLnJlbmRlcnx8RS5OT09QLHVvJiZ1byhhKX1ZbihhKSxSLnBhdXNlVHJhY2tpbmcoKSxCZShhKSxSLnJlc2V0VHJhY2tpbmcoKSxabigpfWZ1bmN0aW9uIEdhKGEpe3JldHVybiBuZXcgUHJveHkoYS5hdHRycyx7Z2V0KHUsbSl7cmV0dXJuIFIudHJhY2soYSwiZ2V0IiwiJGF0dHJzIiksdVttXX19KX1mdW5jdGlvbiBZYShhKXt2YXIgdT1TPT57YS5leHBvc2VkPVN8fHt9fSxtO3JldHVybntnZXQgYXR0cnMoKXtyZXR1cm4gbXx8KG09R2EoYSkpfSxzbG90czphLnNsb3RzLGVtaXQ6YS5lbWl0LGV4cG9zZTp1fX1mdW5jdGlvbiBMbyhhKXtpZihhLmV4cG9zZWQpcmV0dXJuIGEuZXhwb3NlUHJveHl8fChhLmV4cG9zZVByb3h5PW5ldyBQcm94eShSLnByb3h5UmVmcyhSLm1hcmtSYXcoYS5leHBvc2VkKSkse2dldCh1LG0pe2lmKG0gaW4gdSlyZXR1cm4gdVttXTtpZihtIGluIFlyKXJldHVybiBZclttXShhKX0saGFzKHUsbSl7cmV0dXJuIG0gaW4gdXx8bSBpbiBZcn19KSl9ZnVuY3Rpb24gVWkoYSl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiBFLmlzRnVuY3Rpb24oYSk/YS5kaXNwbGF5TmFtZXx8YS5uYW1lOmEubmFtZXx8dSYmYS5fX25hbWV9ZnVuY3Rpb24gRW8oYSl7cmV0dXJuIEUuaXNGdW5jdGlvbihhKSYmIl9fdmNjT3B0cyJpbiBhfXZhciB5bz0oYSx1KT0+Ui5jb21wdXRlZChhLHUsaC5pc0luU1NSQ29tcG9uZW50U2V0dXApO2Z1bmN0aW9uIGRzKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gRG8oKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiB4cyhhKXt9ZnVuY3Rpb24gaHMoYSx1KXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBCcygpe3JldHVybiBrdCgpLnNsb3RzfWZ1bmN0aW9uIE5lKCl7cmV0dXJuIGt0KCkuYXR0cnN9ZnVuY3Rpb24ga3QoKXt2YXIgYT15bigpO3JldHVybiBhLnNldHVwQ29udGV4dHx8KGEuc2V0dXBDb250ZXh0PVlhKGEpKX1mdW5jdGlvbiBJdChhLHUpe3ZhciBtPUUuaXNBcnJheShhKT9hLnJlZHVjZSgoTyxGKT0+KE9bRl09e30sTykse30pOmE7Zm9yKHZhciBTIGluIHUpe3ZhciBJPW1bU107ST9FLmlzQXJyYXkoSSl8fEUuaXNGdW5jdGlvbihJKT9tW1NdPXt0eXBlOkksZGVmYXVsdDp1W1NdfTpJLmRlZmF1bHQ9dVtTXTpJPT09bnVsbCYmKG1bU109e2RlZmF1bHQ6dVtTXX0pfXJldHVybiBtfWZ1bmN0aW9uIE9uKGEsdSl7dmFyIG09e30sUz1mdW5jdGlvbihPKXt1LmluY2x1ZGVzKE8pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkobSxPLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+YVtPXX0pfTtmb3IodmFyIEkgaW4gYSlTKEkpO3JldHVybiBtfWZ1bmN0aW9uIEFyKGEpe3ZhciB1PXluKCksbT1hKCk7cmV0dXJuIFpuKCksRS5pc1Byb21pc2UobSkmJihtPW0uY2F0Y2goUz0+e3Rocm93IFluKHUpLFN9KSksW20sKCk9PlluKHUpXX1mdW5jdGlvbiBQaShhLHUsbSl7dmFyIFM9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gUz09PTI/RS5pc09iamVjdCh1KSYmIUUuaXNBcnJheSh1KT92bih1KT8kdChhLG51bGwsW3VdKTokdChhLHUpOiR0KGEsbnVsbCx1KTooUz4zP209QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpOlM9PT0zJiZ2bihtKSYmKG09W21dKSwkdChhLHUsbSkpfXZhciBlbz1TeW1ib2woIiIpLEZvPSgpPT57e3ZhciBhPWxyKGVvKTtyZXR1cm4gYX19O2Z1bmN0aW9uIE5hKCl7fWZ1bmN0aW9uIHJhKGEsdSxtLFMpe3ZhciBJPW1bU107aWYoSSYmZ3MoSSxhKSlyZXR1cm4gSTt2YXIgTz11KCk7cmV0dXJuIE8ubWVtbz1hLnNsaWNlKCksbVtTXT1PfWZ1bmN0aW9uIGdzKGEsdSl7dmFyIG09YS5tZW1vO2lmKG0ubGVuZ3RoIT11Lmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIFM9MDtTPG0ubGVuZ3RoO1MrKylpZihFLmhhc0NoYW5nZWQobVtTXSx1W1NdKSlyZXR1cm4hMTtyZXR1cm4gcHQ+MCYmZmUmJmZlLnB1c2goYSksITB9dmFyIHBzPSIzLjIuNDciLGRsPW51bGwsJGw9bnVsbCxIbD1udWxsLE1zPXtpbnNlcnQ6KGEsdSxtKT0+bT91Lmluc2VydEJlZm9yZShhLG0pOnUuYXBwZW5kQ2hpbGQoYSkscmVtb3ZlOmE9Pnt2YXIgdT1hLnBhcmVudE5vZGU7dSYmdS5yZW1vdmVDaGlsZChhKX0sY3JlYXRlRWxlbWVudDphPT5zLmNyZWF0ZUVsZW1lbnQoYSksY3JlYXRlVGV4dDphPT5zLmNyZWF0ZVRleHQoYSksY3JlYXRlQ29tbWVudDphPT5zLmNyZWF0ZUNvbW1lbnQoYSksc2V0VGV4dDooYSx1KT0+e2Euc2V0QXR0cigidmFsdWUiLHUpfSxzZXRFbGVtZW50VGV4dDooYSx1KT0+e2Euc2V0QXR0cigidmFsdWUiLHUpfSxwYXJlbnROb2RlOmE9PmEucGFyZW50Tm9kZSxuZXh0U2libGluZzphPT5hLm5leHRTaWJsaW5nfTtmdW5jdGlvbiBWbyhhKXtyZXR1cm4gT2JqZWN0LmtleXMoYSl9ZnVuY3Rpb24gVW8oYSl7dmFyIHU9e307cmV0dXJuIEUuaXNBcnJheShhKSYmYS5mb3JFYWNoKG09PntWbyhtKS5mb3JFYWNoKFM9Pnt2YXIgST1tW1NdLE89dVtTXXx8KHVbU109e30pO1ZvKEkpLmZvckVhY2goRj0+e3ZhciBXPUlbRl0sRz1PW0ZdfHwoT1tGXT17fSk7Vm8oVykuZm9yRWFjaChsZT0+e2xlWzBdPT09IiEiPyhHW2xlXT1XW2xlXSxkZWxldGUgR1tsZS5zbGljZSgxKV0pOkUuaGFzT3duKEcsIiEiK2xlKXx8KEdbbGVdPVdbbGVdKX0pfSl9KX0pLHV9ZnVuY3Rpb24gaWEoYSx1KXt2YXIgbT11JiZ1LmNsYXNzTGlzdDtyZXR1cm4gbSYmbS5pbmNsdWRlcyhhKX12YXIgcWE9L1srfj4gXSQvLHZzPSJwYXJlbnROb2RlIiwkbz0icHJldmlvdXNTaWJsaW5nIjtmdW5jdGlvbiBMcyhhLHUpe2Zvcih2YXIgbT1hLnNwbGl0KCIuIiksUz1tLmxlbmd0aC0xO1M+MDtTLS0pe3ZhciBJPW1bU10sTz1JW0kubGVuZ3RoLTFdLEY9SS5yZXBsYWNlKHFhLCIiKTtpZihPPT09In4ifHxPPT09IiAiKXtmb3IodmFyIFc9Tz09PSJ+Ij8kbzp2czt1JiYodT11W1ddLCFpYShGLHUpKTspO2lmKCF1KXJldHVybiExfWVsc2UgaWYoTz09PSI+Ij91PXUmJnVbdnNdOk89PT0iKyImJih1PXUmJnVbJG9dKSwhaWEoRix1KSlyZXR1cm4hMX1yZXR1cm4hMH12YXIgamw9MWUzO2Z1bmN0aW9uIERzKGEsdSxtKXt2YXJ7c3R5bGVzOlMsd2VpZ2h0czpJfT1hO1ZvKHUpLmZvckVhY2goTz0+e2lmKCEoTyYmbSYmIUxzKE8sbSkpKXt2YXIgRj1PLnNwbGl0KCIuIikubGVuZ3RoLFc9dVtPXTtWbyhXKS5mb3JFYWNoKEc9Pnt2YXIgbGU9V1tHXSx6ZT1HWzBdPT09IiEiO3plJiYoRz1HLnNsaWNlKDEpKTt2YXIgaXQ9SVtHXXx8MCxkZT1GKyh6ZT9qbDowKTtkZT49aXQmJihJW0ddPWRlLFNbR109bGUpfSl9fSl9ZnVuY3Rpb24gbXMoYSx1KXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxTPXtzdHlsZXM6e30sd2VpZ2h0czp7fX07cmV0dXJuIGEuZm9yRWFjaChJPT57dmFyIE89dVtJXTtPJiZEcyhTLE8sbSl9KSxTLnN0eWxlc31mdW5jdGlvbiBobChhKXtyZXR1cm4gbXMoYS5jbGFzc0xpc3QsYS5zdHlsZVNoZWV0LGEpfWZ1bmN0aW9uIEZzKGEsdSl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7cmV0dXJuIG1zKGEsSmEodSksbSl9ZnVuY3Rpb24gSmEoYSl7dmFye3R5cGU6dSxhcHBDb250ZXh0Om19PWEsUz11O2lmKCFTLl9fc3R5bGVzKWlmKG0mJkUuaXNBcnJheShtLnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzKSYmKG0ucHJvdmlkZXMuX19nbG9iYWxTdHlsZXM9VW8obS5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcykpLFMubXBUeXBlPT09InBhZ2UiJiZtKVMuX19zdHlsZXM9bS5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcztlbHNle3ZhciBJPVtdO20mJkkucHVzaChtLnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzKSxFLmlzQXJyYXkoUy5zdHlsZXMpJiZTLnN0eWxlcy5mb3JFYWNoKE89PkkucHVzaChPKSksUy5fX3N0eWxlcz1VbyhJKX1yZXR1cm4gUy5fX3N0eWxlc31mdW5jdGlvbiBfcyhhLHUsbSl7dmFyIFM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7UyYmKFt1LG1dPW9hKGEsdSxtLFMpKSxhLnNldEF0dHIodSxtKX12YXIgVnM9ImhvdmVyQ2xhc3MiLFVzPSJwbGFjZWhvbGRlckNsYXNzIixnbD0icGxhY2Vob2xkZXJTdHlsZSIsSG89ImluZGljYXRvckNsYXNzIixLYT0iaW5kaWNhdG9yU3R5bGUiLG1hPSJtYXNrQ2xhc3MiLGthPSJtYXNrU3R5bGUiLFNvPXt2aWV3OntjbGFzczpbVnNdLHN0eWxlOltdfSxidXR0b246e2NsYXNzOltWc10sc3R5bGU6W119LG5hdmlnYXRvcjp7Y2xhc3M6W1ZzXSxzdHlsZTpbXX0sInUtaW5wdXQiOntjbGFzczpbVXNdLHN0eWxlOltnbF19LCJ1LXRleHRhcmVhIjp7Y2xhc3M6W1VzXSxzdHlsZTpbZ2xdfSwicGlja2VyLXZpZXciOntjbGFzczpbSG8sbWFdLHN0eWxlOltLYSxrYV19fTtmdW5jdGlvbiBvYShhLHUsbSxTKXtpZighbSlyZXR1cm5bdSxtXTt2YXIgST1Tb1thLnR5cGVdO2lmKEkpe3ZhciBPPUUuY2FtZWxpemUodSk7aWYoSS5jbGFzcy5pbmRleE9mKE8pPi0xKXJldHVybltPLEZzKFttXSxTLGEpXTtpZihJLnN0eWxlLmluZGV4T2YodSk+LTEpcmV0dXJuIEUuaXNTdHJpbmcobSk/W08sRS5wYXJzZVN0cmluZ1N0eWxlKG0pXTpbTyxFLm5vcm1hbGl6ZVN0eWxlKG0pXX1yZXR1cm5bdSxtXX1mdW5jdGlvbiBaYShhLHUsbSl7dmFyIFM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7aWYoISFTKXt2YXIgST1tP20uc3BsaXQoIiAiKTpbXTthLnNldENsYXNzTGlzdChJKSxhLnNldFN0eWxlU2hlZXQoSmEoUykpfX1mdW5jdGlvbiAkcyhhLHUsbSxTKXthLmFkZEV2ZW50KHUsbSl9ZnVuY3Rpb24gcGwoYSx1KXthLnJlbW92ZUV2ZW50KHUpfWZ1bmN0aW9uIGFhKGEsdSxtLFMpe3ZhciBJPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLE89YS5fdmVpfHwoYS5fdmVpPXt9KSxGPU9bdV07aWYoUyYmRilGLnZhbHVlPVM7ZWxzZXt2YXJbVyxHXT1RYSh1KTtpZihTKXt2YXIgbGU9T1t1XT1vaShTLEkpOyRzKGEsVyxsZSl9ZWxzZSBGJiYocGwoYSxXKSxPW3VdPXZvaWQgMCl9fXZhciBYYT0vKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87ZnVuY3Rpb24gSHMoYSl7cmV0dXJuIGE9PT0ib24tcG9zdC1tZXNzYWdlIj8ib25Qb3N0TWVzc2FnZSI6YX1mdW5jdGlvbiBRYShhKXt2YXIgdTtpZihYYS50ZXN0KGEpKXt1PXt9O2Zvcih2YXIgbTttPWEubWF0Y2goWGEpOylhPWEuc2xpY2UoMCxhLmxlbmd0aC1tWzBdLmxlbmd0aCksdVttWzBdLnRvTG93ZXJDYXNlKCldPSEwfXZhciBTPWFbMl09PT0iOiI/YS5zbGljZSgzKTphLnNsaWNlKDIpO3JldHVybltIcyhFLmh5cGhlbmF0ZShTKSksdV19ZnVuY3Rpb24gb2koYSx1KXt2YXIgbT1JPT57UChtLnZhbHVlLHUsNSxbSV0pfTttLnZhbHVlPWE7dmFyIFM9bmV3IFNldDtyZXR1cm4gRS5pc0FycmF5KG0udmFsdWUpP20udmFsdWUuZm9yRWFjaChJPT57SS5tb2RpZmllcnMmJkkubW9kaWZpZXJzLmZvckVhY2goTz0+e1MuYWRkKE8pfSl9KTptLnZhbHVlLm1vZGlmaWVycyYmbS52YWx1ZS5tb2RpZmllcnMuZm9yRWFjaChJPT57Uy5hZGQoSSl9KSxtLm1vZGlmaWVycz1bLi4uU10sbX1mdW5jdGlvbiBWcihhLHUsbSl7aWYoISFtKXtFLmlzU3RyaW5nKG0pJiYobT1FLnBhcnNlU3RyaW5nU3R5bGUobSkpO3ZhciBTPXt9LEk9dSYmIUUuaXNTdHJpbmcodSk7aWYoSSl7Zm9yKHZhciBPIGluIHUpbVtPXT09bnVsbCYmKFNbRS5jYW1lbGl6ZShPKV09IiIpO2Zvcih2YXIgRiBpbiBtKXt2YXIgVz1tW0ZdO1chPT11W0ZdJiYoU1tFLmNhbWVsaXplKEYpXT1XKX19ZWxzZSBmb3IodmFyIEcgaW4gbSlTW0UuY2FtZWxpemUoRyldPW1bR107YS5zZXRTdHlsZXMoUyl9fXZhciBzYT1bInUtaW5wdXQiLCJ1LXRleHRhcmVhIl0sdmw9ZnVuY3Rpb24oYSx1LG0sUyl7dmFyIEk9YXJndW1lbnRzLmxlbmd0aD42P2FyZ3VtZW50c1s2XTp2b2lkIDAsTz1hcmd1bWVudHMubGVuZ3RoPjk/YXJndW1lbnRzWzldOnZvaWQgMDt1PT09ImNsYXNzIj9aYShhLG0sUyxPfHxJKTp1PT09InN0eWxlIj9WcihhLG0sUyk6RS5pc09uKHUpP0UuaXNNb2RlbExpc3RlbmVyKHUpfHxhYShhLHUsbSxTLEkpOnU9PT0ibW9kZWxWYWx1ZSImJnNhLmluY2x1ZGVzKGEudHlwZSk/YS5zZXRBdHRycyh7bW9kZWxWYWx1ZTpTLHZhbHVlOlN9KTpfcyhhLHUsUyxJKX07ZnVuY3Rpb24gemwoKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06IiRzdHlsZSI7e3ZhciB1PXluKCk7aWYoIXUpcmV0dXJuIEUuRU1QVFlfT0JKO3ZhciBtPXUudHlwZS5fX2Nzc01vZHVsZXM7aWYoIW0pcmV0dXJuIEUuRU1QVFlfT0JKO3ZhciBTPW1bYV07cmV0dXJuIFN8fEUuRU1QVFlfT0JKfX1mdW5jdGlvbiBqcyhhKXt2YXIgdT15bigpO2lmKCEhdSl7dmFyIG09KCk9PmJzKHUuc3ViVHJlZSxhKHUucHJveHkpKTtycigoKT0+UW4obSx7Zmx1c2g6InBvc3QifSkpLHFuKG0pfX1mdW5jdGlvbiBicyhhLHUpe2lmKGEuc2hhcGVGbGFnJjEyOCl7dmFyIG09YS5zdXNwZW5zZTthPW0uYWN0aXZlQnJhbmNoLG0ucGVuZGluZ0JyYW5jaCYmIW0uaXNIeWRyYXRpbmcmJm0uZWZmZWN0cy5wdXNoKCgpPT57YnMobS5hY3RpdmVCcmFuY2gsdSl9KX1mb3IoO2EuY29tcG9uZW50OylhPWEuY29tcG9uZW50LnN1YlRyZWU7aWYoYS5zaGFwZUZsYWcmMSYmYS5lbCl7dmFyIFM9YS5lbC5zdHlsZTtmb3IodmFyIEkgaW4gdSlTLnNldFByb3BlcnR5KCItLSIuY29uY2F0KEkpLHVbSV0pfWVsc2UgYS50eXBlPT09SiYmYS5jaGlsZHJlbi5mb3JFYWNoKE89PmJzKE8sdSkpfXZhciB6cz1bImN0cmwiLCJzaGlmdCIsImFsdCIsIm1ldGEiXSxXcz17c3RvcDphPT5hLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6YT0+YS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6YT0+YS50YXJnZXQhPT1hLmN1cnJlbnRUYXJnZXQsY3RybDphPT4hYS5jdHJsS2V5LHNoaWZ0OmE9PiFhLnNoaWZ0S2V5LGFsdDphPT4hYS5hbHRLZXksbWV0YTphPT4hYS5tZXRhS2V5LGxlZnQ6YT0+ImJ1dHRvbiJpbiBhJiZhLmJ1dHRvbiE9PTAsbWlkZGxlOmE9PiJidXR0b24iaW4gYSYmYS5idXR0b24hPT0xLHJpZ2h0OmE9PiJidXR0b24iaW4gYSYmYS5idXR0b24hPT0yLGV4YWN0OihhLHUpPT56cy5zb21lKG09PmFbIiIuY29uY2F0KG0sIktleSIpXSYmIXUuaW5jbHVkZXMobSkpfSxtbD0oYSx1KT0+ZnVuY3Rpb24obSl7Zm9yKHZhciBTPTA7Uzx1Lmxlbmd0aDtTKyspe3ZhciBJPVdzW3VbU11dO2lmKEkmJkkobSx1KSlyZXR1cm59Zm9yKHZhciBPPWFyZ3VtZW50cy5sZW5ndGgsRj1uZXcgQXJyYXkoTz4xP08tMTowKSxXPTE7VzxPO1crKylGW1ctMV09YXJndW1lbnRzW1ddO3JldHVybiBhKG0sLi4uRil9LEdzPShhLHUpPT5tPT57aWYoImtleSJpbiBtKXt2YXIgUz1FLmh5cGhlbmF0ZShtLmtleSk7aWYodS5zb21lKEk9Pkk9PT1TKSlyZXR1cm4gYShtKX19LEVzPUUuZXh0ZW5kKHtwYXRjaFByb3A6dmx9LE1zKSx5cztmdW5jdGlvbiBTcygpe3JldHVybiB5c3x8KHlzPXVyKEVzKSl9dmFyIF9sPWZ1bmN0aW9uKCl7U3MoKS5yZW5kZXIoLi4uYXJndW1lbnRzKX0sYmw9ZnVuY3Rpb24oKXt2YXIgYT1TcygpLmNyZWF0ZUFwcCguLi5hcmd1bWVudHMpLHttb3VudDp1fT1hO3JldHVybiBhLm1vdW50PW09PnUobSksYX07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJjYW1lbGl6ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUuY2FtZWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImNhcGl0YWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLmNhcGl0YWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImh5cGhlbmF0ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUuaHlwaGVuYXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJub3JtYWxpemVDbGFzcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUubm9ybWFsaXplQ2xhc3N9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsIm5vcm1hbGl6ZVByb3BzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRS5ub3JtYWxpemVQcm9wc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwibm9ybWFsaXplU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLm5vcm1hbGl6ZVN0eWxlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJ0b0Rpc3BsYXlTdHJpbmciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLnRvRGlzcGxheVN0cmluZ319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwidG9IYW5kbGVyS2V5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRS50b0hhbmRsZXJLZXl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsIkVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5FZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwiUmVhY3RpdmVFZmZlY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLlJlYWN0aXZlRWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJjdXN0b21SZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLmN1c3RvbVJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwiZWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5lZmZlY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5lZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwiZ2V0Q3VycmVudFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5nZXRDdXJyZW50U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImlzUHJveHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLmlzUHJveHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImlzUmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLmlzUmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImlzUmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLmlzUmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsImlzUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5pc1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwiaXNTaGFsbG93Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5pc1NoYWxsb3d9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsIm1hcmtSYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLm1hcmtSYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsIm9uU2NvcGVEaXNwb3NlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5vblNjb3BlRGlzcG9zZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwicHJveHlSZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5wcm94eVJlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInJlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5yZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwicmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLnJlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJyZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLnJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwic2hhbGxvd1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5zaGFsbG93UmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInNoYWxsb3dSZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuc2hhbGxvd1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJzaGFsbG93UmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5zaGFsbG93UmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJzdG9wIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5zdG9wfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJ0b1JhdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIudG9SYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInRvUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi50b1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCwidG9SZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi50b1JlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInRyaWdnZXJSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLnRyaWdnZXJSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInVucmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi51bnJlZn19KSxoLkJhc2VUcmFuc2l0aW9uPVByLGguQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnM9Z24saC5Db21tZW50PWNlLGguRnJhZ21lbnQ9SixoLktlZXBBbGl2ZT1kYSxoLlN0YXRpYz1oZSxoLlN1c3BlbnNlPU9vLGguVGVsZXBvcnQ9VSxoLlRleHQ9ZWUsaC5hc3NlcnROdW1iZXI9VXQsaC5jYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZz1QLGguY2FsbFdpdGhFcnJvckhhbmRsaW5nPVR0LGguY2xvbmVWTm9kZT1waSxoLmNvbXBhdFV0aWxzPUhsLGguY29tcHV0ZWQ9eW8saC5jcmVhdGVBcHA9YmwsaC5jcmVhdGVCbG9jaz1EdCxoLmNyZWF0ZUNvbW1lbnRWTm9kZT1qYSxoLmNyZWF0ZUVsZW1lbnRCbG9jaz1IZSxoLmNyZWF0ZUVsZW1lbnRWTm9kZT16dCxoLmNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyPSRhLGguY3JlYXRlUHJvcHNSZXN0UHJveHk9T24saC5jcmVhdGVSZW5kZXJlcj11cixoLmNyZWF0ZVNsb3RzPVF0LGguY3JlYXRlU3RhdGljVk5vZGU9UWksaC5jcmVhdGVUZXh0Vk5vZGU9aWksaC5jcmVhdGVWTm9kZT0kdCxoLmRlZmluZUFzeW5jQ29tcG9uZW50PURyLGguZGVmaW5lQ29tcG9uZW50PXpyLGguZGVmaW5lRW1pdHM9RG8saC5kZWZpbmVFeHBvc2U9eHMsaC5kZWZpbmVQcm9wcz1kcyxoLmdldEN1cnJlbnRJbnN0YW5jZT15bixoLmdldFRyYW5zaXRpb25SYXdDaGlsZHJlbj1qcixoLmd1YXJkUmVhY3RpdmVQcm9wcz1lYSxoLmg9UGksaC5oYW5kbGVFcnJvcj1DdCxoLmluaXRDdXN0b21Gb3JtYXR0ZXI9TmEsaC5pbmplY3Q9bHIsaC5pbmplY3RIb29rPUZpLGguaXNNZW1vU2FtZT1ncyxoLmlzUnVudGltZU9ubHk9ZnMsaC5pc1ZOb2RlPXZuLGgubWVyZ2VEZWZhdWx0cz1JdCxoLm1lcmdlUHJvcHM9R24saC5uZXh0VGljaz1YcixoLm9uQWN0aXZhdGVkPUxpLGgub25CZWZvcmVNb3VudD1yaSxoLm9uQmVmb3JlVW5tb3VudD1lcixoLm9uQmVmb3JlVXBkYXRlPWNyLGgub25EZWFjdGl2YXRlZD1JbyxoLm9uRXJyb3JDYXB0dXJlZD1KaSxoLm9uTW91bnRlZD1ycixoLm9uUmVuZGVyVHJhY2tlZD1xaSxoLm9uUmVuZGVyVHJpZ2dlcmVkPV9vLGgub25TZXJ2ZXJQcmVmZXRjaD1tbyxoLm9uVW5tb3VudGVkPWRyLGgub25VcGRhdGVkPXFuLGgub3BlbkJsb2NrPXdlLGgucGFyc2VDbGFzc0xpc3Q9RnMsaC5wYXJzZUNsYXNzU3R5bGVzPWhsLGgucG9wU2NvcGVJZD1nbyxoLnByb3ZpZGU9dWksaC5wdXNoU2NvcGVJZD1laSxoLnF1ZXVlUG9zdEZsdXNoQ2I9UXIsaC5yZWdpc3RlclJ1bnRpbWVDb21waWxlcj1XYSxoLnJlbmRlcj1fbCxoLnJlbmRlckxpc3Q9WXQsaC5yZW5kZXJTbG90PVZpLGgucmVzb2x2ZUNvbXBvbmVudD1CLGgucmVzb2x2ZURpcmVjdGl2ZT14ZSxoLnJlc29sdmVEeW5hbWljQ29tcG9uZW50PXJlLGgucmVzb2x2ZUZpbHRlcj0kbCxoLnJlc29sdmVUcmFuc2l0aW9uSG9va3M9RWUsaC5zZXRCbG9ja1RyYWNraW5nPWp0LGguc2V0RGV2dG9vbHNIb29rPU5uLGguc2V0VHJhbnNpdGlvbkhvb2tzPUt0LGguc3NyQ29udGV4dEtleT1lbyxoLnNzclV0aWxzPWRsLGgudG9IYW5kbGVycz1ndCxoLnRyYW5zZm9ybVZOb2RlQXJncz1kdCxoLnVzZUF0dHJzPU5lLGgudXNlQ3NzTW9kdWxlPXpsLGgudXNlQ3NzU3R5bGVzPVVvLGgudXNlQ3NzVmFycz1qcyxoLnVzZVNTUkNvbnRleHQ9Rm8saC51c2VTbG90cz1CcyxoLnVzZVRyYW5zaXRpb25TdGF0ZT1NcixoLnZlcnNpb249cHMsaC53YXJuPU50LGgud2F0Y2g9eHIsaC53YXRjaEVmZmVjdD1RbixoLndhdGNoUG9zdEVmZmVjdD14aSxoLndhdGNoU3luY0VmZmVjdD1vbyxoLndpdGhBc3luY0NvbnRleHQ9QXIsaC53aXRoQ3R4PUFvLGgud2l0aERlZmF1bHRzPWhzLGgud2l0aERpcmVjdGl2ZXM9WG8saC53aXRoS2V5cz1HcyxoLndpdGhNZW1vPXJhLGgud2l0aE1vZGlmaWVycz1tbCxoLndpdGhTY29wZUlkPWZhLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxofSh7fSx3LE4scCk7cmV0dXJuIHkuX19UWVBFX189Im52dWUiLHl9dmFyICRwPSRJKEdJKTt2YXIgaGM9e307TEkoaGMse0VNUFRZX0FSUjooKT0+SkksRU1QVFlfT0JKOigpPT5xSSxOTzooKT0+WkksTk9PUDooKT0+S0ksY2FtZWxpemU6KCk9PmNOLGNhcGl0YWxpemU6KCk9Pml1LGRlZjooKT0+Z04sZXh0ZW5kOigpPT5IaSxnZXRHbG9iYWxUaGlzOigpPT5tTixoYXNDaGFuZ2VkOigpPT5kTixoYXNPd246KCk9PmlsLGh5cGhlbmF0ZTooKT0+ZmYsaW52b2tlQXJyYXlGbnM6KCk9PmhOLGlzQXJyYXk6KCk9PmtpLGlzQnVpbHRJbkRpcmVjdGl2ZTooKT0+c04saXNGdW5jdGlvbjooKT0+Rm4saXNHbG9iYWxseVdoaXRlbGlzdGVkOigpPT5FTixpc0hUTUxUYWc6KCk9PlROLGlzSW50ZWdlcktleTooKT0+b04saXNNYXA6KCk9PkhwLGlzTW9kZWxMaXN0ZW5lcjooKT0+UUksaXNPYmplY3Q6KCk9PkRsLGlzT246KCk9PlhJLGlzUGxhaW5PYmplY3Q6KCk9PkZsLGlzUHJvbWlzZTooKT0+ck4saXNSZWdFeHA6KCk9Pm5OLGlzUmVzZXJ2ZWRQcm9wOigpPT5hTixpc1NWR1RhZzooKT0+UE4saXNTZXQ6KCk9PmpwLGlzU3RyaW5nOigpPT5iaSxpc1N5bWJvbDooKT0+dWYsbG9vc2VUb051bWJlcjooKT0+cE4sbWFrZU1hcDooKT0+TGwsbm9ybWFsaXplQ2xhc3M6KCk9PmhmLG5vcm1hbGl6ZVByb3BzOigpPT5DTixub3JtYWxpemVTdHlsZTooKT0+ZGYscGFyc2VTdHJpbmdTdHlsZTooKT0+R3AscmVtb3ZlOigpPT5lTix0b0Rpc3BsYXlTdHJpbmc6KCk9PklOLHRvSGFuZGxlcktleTooKT0+Zk4sdG9OdW1iZXI6KCk9PnZOLHRvUmF3VHlwZTooKT0+aU4sdG9UeXBlU3RyaW5nOigpPT5NYX0pO2Z1bmN0aW9uIExsKGYscyl7bGV0IHA9T2JqZWN0LmNyZWF0ZShudWxsKSx3PWYuc3BsaXQoIiwiKTtmb3IobGV0IE49MDtOPHcubGVuZ3RoO04rKylwW3dbTl1dPSEwO3JldHVybiBzP049PiEhcFtOLnRvTG93ZXJDYXNlKCldOk49PiEhcFtOXX12YXIgcUk9e30sSkk9W10sS0k9KCk9Pnt9LFpJPSgpPT4hMSxYST1mPT5mLmNoYXJDb2RlQXQoMCk9PT0xMTEmJmYuY2hhckNvZGVBdCgxKT09PTExMCYmKGYuY2hhckNvZGVBdCgyKT4xMjJ8fGYuY2hhckNvZGVBdCgyKTw5NyksUUk9Zj0+Zi5zdGFydHNXaXRoKCJvblVwZGF0ZToiKSxIaT1PYmplY3QuYXNzaWduLGVOPShmLHMpPT57bGV0IHA9Zi5pbmRleE9mKHMpO3A+LTEmJmYuc3BsaWNlKHAsMSl9LHROPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksaWw9KGYscyk9PnROLmNhbGwoZixzKSxraT1BcnJheS5pc0FycmF5LEhwPWY9Pk1hKGYpPT09IltvYmplY3QgTWFwXSIsanA9Zj0+TWEoZik9PT0iW29iamVjdCBTZXRdIixuTj1mPT5NYShmKT09PSJbb2JqZWN0IFJlZ0V4cF0iLEZuPWY9PnR5cGVvZiBmPT0iZnVuY3Rpb24iLGJpPWY9PnR5cGVvZiBmPT0ic3RyaW5nIix1Zj1mPT50eXBlb2YgZj09InN5bWJvbCIsRGw9Zj0+ZiE9PW51bGwmJnR5cGVvZiBmPT0ib2JqZWN0IixyTj1mPT4oRGwoZil8fEZuKGYpKSYmRm4oZi50aGVuKSYmRm4oZi5jYXRjaCksenA9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxNYT1mPT56cC5jYWxsKGYpLGlOPWY9Pk1hKGYpLnNsaWNlKDgsLTEpLEZsPWY9Pk1hKGYpPT09IltvYmplY3QgT2JqZWN0XSIsb049Zj0+YmkoZikmJmYhPT0iTmFOIiYmZlswXSE9PSItIiYmIiIrcGFyc2VJbnQoZiwxMCk9PT1mLGFOPUxsKCIsa2V5LHJlZixyZWZfZm9yLHJlZl9rZXksb25Wbm9kZUJlZm9yZU1vdW50LG9uVm5vZGVNb3VudGVkLG9uVm5vZGVCZWZvcmVVcGRhdGUsb25Wbm9kZVVwZGF0ZWQsb25Wbm9kZUJlZm9yZVVubW91bnQsb25Wbm9kZVVubW91bnRlZCIpLHNOPUxsKCJiaW5kLGNsb2FrLGVsc2UtaWYsZWxzZSxmb3IsaHRtbCxpZixtb2RlbCxvbixvbmNlLHByZSxzaG93LHNsb3QsdGV4dCxtZW1vIikscnU9Zj0+e2xldCBzPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIHA9PnNbcF18fChzW3BdPWYocCkpfSxsTj0vLShcdykvZyxjTj1ydShmPT5mLnJlcGxhY2UobE4sKHMscCk9PnA/cC50b1VwcGVyQ2FzZSgpOiIiKSksdU49L1xCKFtBLVpdKS9nLGZmPXJ1KGY9PmYucmVwbGFjZSh1TiwiLSQxIikudG9Mb3dlckNhc2UoKSksaXU9cnUoZj0+Zi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStmLnNsaWNlKDEpKSxmTj1ydShmPT5mP2BvbiR7aXUoZil9YDoiIiksZE49KGYscyk9PiFPYmplY3QuaXMoZixzKSxoTj0oZixzKT0+e2ZvcihsZXQgcD0wO3A8Zi5sZW5ndGg7cCsrKWZbcF0ocyl9LGdOPShmLHMscCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoZixzLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpwfSl9LHBOPWY9PntsZXQgcz1wYXJzZUZsb2F0KGYpO3JldHVybiBpc05hTihzKT9mOnN9LHZOPWY9PntsZXQgcz1iaShmKT9OdW1iZXIoZik6TmFOO3JldHVybiBpc05hTihzKT9mOnN9LFdwLG1OPSgpPT5XcHx8KFdwPXR5cGVvZiBnbG9iYWxUaGlzIT0idW5kZWZpbmVkIj9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIj9zZWxmOnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT0idW5kZWZpbmVkIj9nbG9iYWw6e30pLF9OPSJJbmZpbml0eSx1bmRlZmluZWQsTmFOLGlzRmluaXRlLGlzTmFOLHBhcnNlRmxvYXQscGFyc2VJbnQsZGVjb2RlVVJJLGRlY29kZVVSSUNvbXBvbmVudCxlbmNvZGVVUkksZW5jb2RlVVJJQ29tcG9uZW50LE1hdGgsTnVtYmVyLERhdGUsQXJyYXksT2JqZWN0LEJvb2xlYW4sU3RyaW5nLFJlZ0V4cCxNYXAsU2V0LEpTT04sSW50bCxCaWdJbnQsY29uc29sZSIsYk49TGwoX04pLEVOPWJOO2Z1bmN0aW9uIGRmKGYpe2lmKGtpKGYpKXtsZXQgcz17fTtmb3IobGV0IHA9MDtwPGYubGVuZ3RoO3ArKyl7bGV0IHc9ZltwXSxOPWJpKHcpP0dwKHcpOmRmKHcpO2lmKE4pZm9yKGxldCB5IGluIE4pc1t5XT1OW3ldfXJldHVybiBzfWVsc2UgaWYoYmkoZil8fERsKGYpKXJldHVybiBmfXZhciB5Tj0vOyg/IVteKF0qXCkpL2csU049LzooW15dKykvLHdOPS9cL1wqW15dKj9cKlwvL2c7ZnVuY3Rpb24gR3AoZil7bGV0IHM9e307cmV0dXJuIGYucmVwbGFjZSh3TiwiIikuc3BsaXQoeU4pLmZvckVhY2gocD0+e2lmKHApe2xldCB3PXAuc3BsaXQoU04pO3cubGVuZ3RoPjEmJihzW3dbMF0udHJpbSgpXT13WzFdLnRyaW0oKSl9fSksc31mdW5jdGlvbiBoZihmKXtsZXQgcz0iIjtpZihiaShmKSlzPWY7ZWxzZSBpZihraShmKSlmb3IobGV0IHA9MDtwPGYubGVuZ3RoO3ArKyl7bGV0IHc9aGYoZltwXSk7dyYmKHMrPXcrIiAiKX1lbHNlIGlmKERsKGYpKWZvcihsZXQgcCBpbiBmKWZbcF0mJihzKz1wKyIgIik7cmV0dXJuIHMudHJpbSgpfWZ1bmN0aW9uIENOKGYpe2lmKCFmKXJldHVybiBudWxsO2xldHtjbGFzczpzLHN0eWxlOnB9PWY7cmV0dXJuIHMmJiFiaShzKSYmKGYuY2xhc3M9aGYocykpLHAmJihmLnN0eWxlPWRmKHApKSxmfXZhciBBTj0iaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaGdyb3VwLGgxLGgyLGgzLGg0LGg1LGg2LG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LHN1bW1hcnksdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiLE9OPSJzdmcsYW5pbWF0ZSxhbmltYXRlTW90aW9uLGFuaW1hdGVUcmFuc2Zvcm0sY2lyY2xlLGNsaXBQYXRoLGNvbG9yLXByb2ZpbGUsZGVmcyxkZXNjLGRpc2NhcmQsZWxsaXBzZSxmZUJsZW5kLGZlQ29sb3JNYXRyaXgsZmVDb21wb25lbnRUcmFuc2ZlcixmZUNvbXBvc2l0ZSxmZUNvbnZvbHZlTWF0cml4LGZlRGlmZnVzZUxpZ2h0aW5nLGZlRGlzcGxhY2VtZW50TWFwLGZlRGlzdGFudExpZ2h0LGZlRHJvcFNoYWRvdyxmZUZsb29kLGZlRnVuY0EsZmVGdW5jQixmZUZ1bmNHLGZlRnVuY1IsZmVHYXVzc2lhbkJsdXIsZmVJbWFnZSxmZU1lcmdlLGZlTWVyZ2VOb2RlLGZlTW9ycGhvbG9neSxmZU9mZnNldCxmZVBvaW50TGlnaHQsZmVTcGVjdWxhckxpZ2h0aW5nLGZlU3BvdExpZ2h0LGZlVGlsZSxmZVR1cmJ1bGVuY2UsZmlsdGVyLGZvcmVpZ25PYmplY3QsZyxoYXRjaCxoYXRjaHBhdGgsaW1hZ2UsbGluZSxsaW5lYXJHcmFkaWVudCxtYXJrZXIsbWFzayxtZXNoLG1lc2hncmFkaWVudCxtZXNocGF0Y2gsbWVzaHJvdyxtZXRhZGF0YSxtcGF0aCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyYWRpYWxHcmFkaWVudCxyZWN0LHNldCxzb2xpZGNvbG9yLHN0b3Asc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRQYXRoLHRpdGxlLHRzcGFuLHVua25vd24sdXNlLHZpZXciLFROPUxsKEFOKSxQTj1MbChPTiksSU49Zj0+YmkoZik/ZjpmPT1udWxsPyIiOmtpKGYpfHxEbChmKSYmKGYudG9TdHJpbmc9PT16cHx8IUZuKGYudG9TdHJpbmcpKT9KU09OLnN0cmluZ2lmeShmLFlwLDIpOlN0cmluZyhmKSxZcD0oZixzKT0+cyYmcy5fX3ZfaXNSZWY/WXAoZixzLnZhbHVlKTpIcChzKT97W2BNYXAoJHtzLnNpemV9KWBdOlsuLi5zLmVudHJpZXMoKV0ucmVkdWNlKChwLFt3LE5dLHkpPT4ocFtnZih3LHkpKyIgPT4iXT1OLHApLHt9KX06anAocyk/e1tgU2V0KCR7cy5zaXplfSlgXTpbLi4ucy52YWx1ZXMoKV0ubWFwKHA9PmdmKHApKX06dWYocyk/Z2Yocyk6RGwocykmJiFraShzKSYmIUZsKHMpP1N0cmluZyhzKTpzLGdmPShmLHM9IiIpPT57dmFyIHA7cmV0dXJuIHVmKGYpP2BTeW1ib2woJHsocD1mLmRlc2NyaXB0aW9uKSE9bnVsbD9wOnN9KWA6Zn07ZnVuY3Rpb24gcXAoZil7dmFyIHM9ZnVuY3Rpb24ocCx3KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gTihCLC4uLlkpe2NvbnNvbGUud2FybihgW1Z1ZSB3YXJuXSAke0J9YCwuLi5ZKX1sZXQgeTtjbGFzcyBoe2NvbnN0cnVjdG9yKFk9ITEpe3RoaXMuZGV0YWNoZWQ9WSx0aGlzLl9hY3RpdmU9ITAsdGhpcy5lZmZlY3RzPVtdLHRoaXMuY2xlYW51cHM9W10sdGhpcy5wYXJlbnQ9eSwhWSYmeSYmKHRoaXMuaW5kZXg9KHkuc2NvcGVzfHwoeS5zY29wZXM9W10pKS5wdXNoKHRoaXMpLTEpfWdldCBhY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfXJ1bihZKXtpZih0aGlzLl9hY3RpdmUpe2xldCByZT15O3RyeXtyZXR1cm4geT10aGlzLFkoKX1maW5hbGx5e3k9cmV9fX1vbigpe3k9dGhpc31vZmYoKXt5PXRoaXMucGFyZW50fXN0b3AoWSl7aWYodGhpcy5fYWN0aXZlKXtsZXQgcmUseGU7Zm9yKHJlPTAseGU9dGhpcy5lZmZlY3RzLmxlbmd0aDtyZTx4ZTtyZSsrKXRoaXMuZWZmZWN0c1tyZV0uc3RvcCgpO2ZvcihyZT0wLHhlPXRoaXMuY2xlYW51cHMubGVuZ3RoO3JlPHhlO3JlKyspdGhpcy5jbGVhbnVwc1tyZV0oKTtpZih0aGlzLnNjb3Blcylmb3IocmU9MCx4ZT10aGlzLnNjb3Blcy5sZW5ndGg7cmU8eGU7cmUrKyl0aGlzLnNjb3Blc1tyZV0uc3RvcCghMCk7aWYoIXRoaXMuZGV0YWNoZWQmJnRoaXMucGFyZW50JiYhWSl7bGV0IFplPXRoaXMucGFyZW50LnNjb3Blcy5wb3AoKTtaZSYmWmUhPT10aGlzJiYodGhpcy5wYXJlbnQuc2NvcGVzW3RoaXMuaW5kZXhdPVplLFplLmluZGV4PXRoaXMuaW5kZXgpfXRoaXMucGFyZW50PXZvaWQgMCx0aGlzLl9hY3RpdmU9ITF9fX1mdW5jdGlvbiBFKEIpe3JldHVybiBuZXcgaChCKX1mdW5jdGlvbiBSKEIsWT15KXtZJiZZLmFjdGl2ZSYmWS5lZmZlY3RzLnB1c2goQil9ZnVuY3Rpb24gRGUoKXtyZXR1cm4geX1mdW5jdGlvbiBOdChCKXt5JiZ5LmNsZWFudXBzLnB1c2goQil9bGV0IFV0PUI9PntsZXQgWT1uZXcgU2V0KEIpO3JldHVybiBZLnc9MCxZLm49MCxZfSxUdD1CPT4oQi53JkspPjAsUD1CPT4oQi5uJkspPjAsQ3Q9KHtkZXBzOkJ9KT0+e2lmKEIubGVuZ3RoKWZvcihsZXQgWT0wO1k8Qi5sZW5ndGg7WSsrKUJbWV0ud3w9S30sUm49Qj0+e2xldHtkZXBzOll9PUI7aWYoWS5sZW5ndGgpe2xldCByZT0wO2ZvcihsZXQgeGU9MDt4ZTxZLmxlbmd0aDt4ZSsrKXtsZXQgWmU9WVt4ZV07VHQoWmUpJiYhUChaZSk/WmUuZGVsZXRlKEIpOllbcmUrK109WmUsWmUudyY9fkssWmUubiY9fkt9WS5sZW5ndGg9cmV9fSxvdD1uZXcgV2Vha01hcCx6PTAsSz0xLG1uPTMwLGhuLHduPVN5bWJvbCgiIiksWG49U3ltYm9sKCIiKTtjbGFzcyBzaXtjb25zdHJ1Y3RvcihZLHJlPW51bGwseGUpe3RoaXMuZm49WSx0aGlzLnNjaGVkdWxlcj1yZSx0aGlzLmFjdGl2ZT0hMCx0aGlzLmRlcHM9W10sdGhpcy5wYXJlbnQ9dm9pZCAwLFIodGhpcyx4ZSl9cnVuKCl7aWYoIXRoaXMuYWN0aXZlKXJldHVybiB0aGlzLmZuKCk7bGV0IFk9aG4scmU9Q247Zm9yKDtZOyl7aWYoWT09PXRoaXMpcmV0dXJuO1k9WS5wYXJlbnR9dHJ5e3JldHVybiB0aGlzLnBhcmVudD1obixobj10aGlzLENuPSEwLEs9MTw8Kyt6LHo8PW1uP0N0KHRoaXMpOkVpKHRoaXMpLHRoaXMuZm4oKX1maW5hbGx5e3o8PW1uJiZSbih0aGlzKSxLPTE8PC0teixobj10aGlzLnBhcmVudCxDbj1yZSx0aGlzLnBhcmVudD12b2lkIDAsdGhpcy5kZWZlclN0b3AmJnRoaXMuc3RvcCgpfX1zdG9wKCl7aG49PT10aGlzP3RoaXMuZGVmZXJTdG9wPSEwOnRoaXMuYWN0aXZlJiYoRWkodGhpcyksdGhpcy5vblN0b3AmJnRoaXMub25TdG9wKCksdGhpcy5hY3RpdmU9ITEpfX1mdW5jdGlvbiBFaShCKXtsZXR7ZGVwczpZfT1CO2lmKFkubGVuZ3RoKXtmb3IobGV0IHJlPTA7cmU8WS5sZW5ndGg7cmUrKylZW3JlXS5kZWxldGUoQik7WS5sZW5ndGg9MH19ZnVuY3Rpb24gWHIoQixZKXtCLmVmZmVjdCBpbnN0YW5jZW9mIHNpJiYoQj1CLmVmZmVjdC5mbik7bGV0IHJlPW5ldyBzaShCKTtZJiYody5leHRlbmQocmUsWSksWS5zY29wZSYmUihyZSxZLnNjb3BlKSksKCFZfHwhWS5sYXp5KSYmcmUucnVuKCk7bGV0IHhlPXJlLnJ1bi5iaW5kKHJlKTtyZXR1cm4geGUuZWZmZWN0PXJlLHhlfWZ1bmN0aW9uIG1yKEIpe0IuZWZmZWN0LnN0b3AoKX1sZXQgQ249ITAsX3I9W107ZnVuY3Rpb24gJHIoKXtfci5wdXNoKENuKSxDbj0hMX1mdW5jdGlvbiBRcigpe19yLnB1c2goQ24pLENuPSEwfWZ1bmN0aW9uIHlpKCl7bGV0IEI9X3IucG9wKCk7Q249Qj09PXZvaWQgMD8hMDpCfWZ1bmN0aW9uIGtuKEIsWSxyZSl7aWYoQ24mJmhuKXtsZXQgeGU9b3QuZ2V0KEIpO3hlfHxvdC5zZXQoQix4ZT1uZXcgTWFwKTtsZXQgWmU9eGUuZ2V0KHJlKTtaZXx8eGUuc2V0KHJlLFplPVV0KCkpLGplKFplLHZvaWQgMCl9fWZ1bmN0aW9uIGplKEIsWSl7bGV0IHJlPSExO3o8PW1uP1AoQil8fChCLm58PUsscmU9IVR0KEIpKTpyZT0hQi5oYXMoaG4pLHJlJiYoQi5hZGQoaG4pLGhuLmRlcHMucHVzaChCKSl9ZnVuY3Rpb24gbnQoQixZLHJlLHhlLFplLGN0KXtsZXQgWXQ9b3QuZ2V0KEIpO2lmKCFZdClyZXR1cm47bGV0IFF0PVtdO2lmKFk9PT0iY2xlYXIiKVF0PVsuLi5ZdC52YWx1ZXMoKV07ZWxzZSBpZihyZT09PSJsZW5ndGgiJiZ3LmlzQXJyYXkoQikpe2xldCBHcj1OdW1iZXIoeGUpO1l0LmZvckVhY2goKGd0LFJ0KT0+eyhSdD09PSJsZW5ndGgifHwhdy5pc1N5bWJvbChSdCkmJlJ0Pj1HcikmJlF0LnB1c2goZ3QpfSl9ZWxzZSBzd2l0Y2gocmUhPT12b2lkIDAmJlF0LnB1c2goWXQuZ2V0KHJlKSksWSl7Y2FzZSJhZGQiOncuaXNBcnJheShCKT93LmlzSW50ZWdlcktleShyZSkmJlF0LnB1c2goWXQuZ2V0KCJsZW5ndGgiKSk6KFF0LnB1c2goWXQuZ2V0KHduKSksdy5pc01hcChCKSYmUXQucHVzaChZdC5nZXQoWG4pKSk7YnJlYWs7Y2FzZSJkZWxldGUiOncuaXNBcnJheShCKXx8KFF0LnB1c2goWXQuZ2V0KHduKSksdy5pc01hcChCKSYmUXQucHVzaChZdC5nZXQoWG4pKSk7YnJlYWs7Y2FzZSJzZXQiOncuaXNNYXAoQikmJlF0LnB1c2goWXQuZ2V0KHduKSk7YnJlYWt9bGV0IFZpPXZvaWQgMDtpZihRdC5sZW5ndGg9PT0xKVF0WzBdJiZPdChRdFswXSk7ZWxzZXtsZXQgR3I9W107Zm9yKGxldCBndCBvZiBRdClndCYmR3IucHVzaCguLi5ndCk7T3QoVXQoR3IpKX19ZnVuY3Rpb24gT3QoQixZKXtsZXQgcmU9dy5pc0FycmF5KEIpP0I6Wy4uLkJdO2ZvcihsZXQgeGUgb2YgcmUpeGUuY29tcHV0ZWQmJm5uKHhlLFkpO2ZvcihsZXQgeGUgb2YgcmUpeGUuY29tcHV0ZWR8fG5uKHhlLFkpfWZ1bmN0aW9uIG5uKEIsWSl7KEIhPT1obnx8Qi5hbGxvd1JlY3Vyc2UpJiYoQi5zY2hlZHVsZXI/Qi5zY2hlZHVsZXIoKTpCLnJ1bigpKX1mdW5jdGlvbiBObihCLFkpe3ZhciByZTtyZXR1cm4ocmU9b3QuZ2V0KEIpKT09bnVsbD92b2lkIDA6cmUuZ2V0KFkpfWxldCB1bj13Lm1ha2VNYXAoIl9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZSIpLGFyPW5ldyBTZXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoQj0+QiE9PSJhcmd1bWVudHMiJiZCIT09ImNhbGxlciIpLm1hcChCPT5TeW1ib2xbQl0pLmZpbHRlcih3LmlzU3ltYm9sKSksVm49UG4oKTtmdW5jdGlvbiBQbigpe2xldCBCPXt9O3JldHVyblsiaW5jbHVkZXMiLCJpbmRleE9mIiwibGFzdEluZGV4T2YiXS5mb3JFYWNoKFk9PntCW1ldPWZ1bmN0aW9uKC4uLnJlKXtsZXQgeGU9S3QodGhpcyk7Zm9yKGxldCBjdD0wLFl0PXRoaXMubGVuZ3RoO2N0PFl0O2N0Kyspa24oeGUsImdldCIsY3QrIiIpO2xldCBaZT14ZVtZXSguLi5yZSk7cmV0dXJuIFplPT09LTF8fFplPT09ITE/eGVbWV0oLi4ucmUubWFwKEt0KSk6WmV9fSksWyJwdXNoIiwicG9wIiwic2hpZnQiLCJ1bnNoaWZ0Iiwic3BsaWNlIl0uZm9yRWFjaChZPT57QltZXT1mdW5jdGlvbiguLi5yZSl7JHIoKTtsZXQgeGU9S3QodGhpcylbWV0uYXBwbHkodGhpcyxyZSk7cmV0dXJuIHlpKCkseGV9fSksQn1mdW5jdGlvbiBfbihCKXtsZXQgWT1LdCh0aGlzKTtyZXR1cm4ga24oWSwiaGFzIixCKSxZLmhhc093blByb3BlcnR5KEIpfWNsYXNzIGJye2NvbnN0cnVjdG9yKFk9ITEscmU9ITEpe3RoaXMuX2lzUmVhZG9ubHk9WSx0aGlzLl9zaGFsbG93PXJlfWdldChZLHJlLHhlKXtsZXQgWmU9dGhpcy5faXNSZWFkb25seSxjdD10aGlzLl9zaGFsbG93O2lmKHJlPT09Il9fdl9pc1JlYWN0aXZlIilyZXR1cm4hWmU7aWYocmU9PT0iX192X2lzUmVhZG9ubHkiKXJldHVybiBaZTtpZihyZT09PSJfX3ZfaXNTaGFsbG93IilyZXR1cm4gY3Q7aWYocmU9PT0iX192X3JhdyIpcmV0dXJuIHhlPT09KFplP2N0P3dpOkJyOmN0P3hyOnRpKS5nZXQoWSl8fE9iamVjdC5nZXRQcm90b3R5cGVPZihZKT09PU9iamVjdC5nZXRQcm90b3R5cGVPZih4ZSk/WTp2b2lkIDA7bGV0IFl0PXcuaXNBcnJheShZKTtpZighWmUpe2lmKFl0JiZ3Lmhhc093bihWbixyZSkpcmV0dXJuIFJlZmxlY3QuZ2V0KFZuLHJlLHhlKTtpZihyZT09PSJoYXNPd25Qcm9wZXJ0eSIpcmV0dXJuIF9ufWxldCBRdD1SZWZsZWN0LmdldChZLHJlLHhlKTtyZXR1cm4ody5pc1N5bWJvbChyZSk/YXIuaGFzKHJlKTp1bihyZSkpfHwoWmV8fGtuKFksImdldCIscmUpLGN0KT9RdDpCbihRdCk/WXQmJncuaXNJbnRlZ2VyS2V5KHJlKT9RdDpRdC52YWx1ZTp3LmlzT2JqZWN0KFF0KT9aZT9nbihRdCk6TXIoUXQpOlF0fX1jbGFzcyBlaSBleHRlbmRzIGJye2NvbnN0cnVjdG9yKFk9ITEpe3N1cGVyKCExLFkpfXNldChZLHJlLHhlLFplKXtsZXQgY3Q9WVtyZV07aWYoRWUoY3QpJiZCbihjdCkmJiFCbih4ZSkpcmV0dXJuITE7aWYoIXRoaXMuX3NoYWxsb3cmJighbmkoeGUpJiYhRWUoeGUpJiYoY3Q9S3QoY3QpLHhlPUt0KHhlKSksIXcuaXNBcnJheShZKSYmQm4oY3QpJiYhQm4oeGUpKSlyZXR1cm4gY3QudmFsdWU9eGUsITA7bGV0IFl0PXcuaXNBcnJheShZKSYmdy5pc0ludGVnZXJLZXkocmUpP051bWJlcihyZSk8WS5sZW5ndGg6dy5oYXNPd24oWSxyZSksUXQ9UmVmbGVjdC5zZXQoWSxyZSx4ZSxaZSk7cmV0dXJuIFk9PT1LdChaZSkmJihZdD93Lmhhc0NoYW5nZWQoeGUsY3QpJiZudChZLCJzZXQiLHJlLHhlLGN0KTpudChZLCJhZGQiLHJlLHhlKSksUXR9ZGVsZXRlUHJvcGVydHkoWSxyZSl7bGV0IHhlPXcuaGFzT3duKFkscmUpLFplPVlbcmVdLGN0PVJlZmxlY3QuZGVsZXRlUHJvcGVydHkoWSxyZSk7cmV0dXJuIGN0JiZ4ZSYmbnQoWSwiZGVsZXRlIixyZSx2b2lkIDAsWmUpLGN0fWhhcyhZLHJlKXtsZXQgeGU9UmVmbGVjdC5oYXMoWSxyZSk7cmV0dXJuKCF3LmlzU3ltYm9sKHJlKXx8IWFyLmhhcyhyZSkpJiZrbihZLCJoYXMiLHJlKSx4ZX1vd25LZXlzKFkpe3JldHVybiBrbihZLCJpdGVyYXRlIix3LmlzQXJyYXkoWSk/Imxlbmd0aCI6d24pLFJlZmxlY3Qub3duS2V5cyhZKX19Y2xhc3MgZ28gZXh0ZW5kcyBicntjb25zdHJ1Y3RvcihZPSExKXtzdXBlcighMCxZKX1zZXQoWSxyZSl7cmV0dXJuITB9ZGVsZXRlUHJvcGVydHkoWSxyZSl7cmV0dXJuITB9fWxldCBmYT1uZXcgZWksQW89bmV3IGdvLEpvPW5ldyBlaSghMCksS289bmV3IGdvKCEwKSxSaT1CPT5CLFJyPUI9PlJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoQik7ZnVuY3Rpb24gemkoQixZLHJlPSExLHhlPSExKXtCPUIuX192X3JhdztsZXQgWmU9S3QoQiksY3Q9S3QoWSk7cmV8fCh3Lmhhc0NoYW5nZWQoWSxjdCkmJmtuKFplLCJnZXQiLFkpLGtuKFplLCJnZXQiLGN0KSk7bGV0e2hhczpZdH09UnIoWmUpLFF0PXhlP1JpOnJlP0xyOnpyO2lmKFl0LmNhbGwoWmUsWSkpcmV0dXJuIFF0KEIuZ2V0KFkpKTtpZihZdC5jYWxsKFplLGN0KSlyZXR1cm4gUXQoQi5nZXQoY3QpKTtCIT09WmUmJkIuZ2V0KFkpfWZ1bmN0aW9uIFdpKEIsWT0hMSl7bGV0IHJlPXRoaXMuX192X3Jhdyx4ZT1LdChyZSksWmU9S3QoQik7cmV0dXJuIFl8fCh3Lmhhc0NoYW5nZWQoQixaZSkmJmtuKHhlLCJoYXMiLEIpLGtuKHhlLCJoYXMiLFplKSksQj09PVplP3JlLmhhcyhCKTpyZS5oYXMoQil8fHJlLmhhcyhaZSl9ZnVuY3Rpb24gcm8oQixZPSExKXtyZXR1cm4gQj1CLl9fdl9yYXcsIVkmJmtuKEt0KEIpLCJpdGVyYXRlIix3biksUmVmbGVjdC5nZXQoQiwic2l6ZSIsQil9ZnVuY3Rpb24gaW8oQil7Qj1LdChCKTtsZXQgWT1LdCh0aGlzKTtyZXR1cm4gUnIoWSkuaGFzLmNhbGwoWSxCKXx8KFkuYWRkKEIpLG50KFksImFkZCIsQixCKSksdGhpc31mdW5jdGlvbiBsaShCLFkpe1k9S3QoWSk7bGV0IHJlPUt0KHRoaXMpLHtoYXM6eGUsZ2V0OlplfT1ScihyZSksY3Q9eGUuY2FsbChyZSxCKTtjdHx8KEI9S3QoQiksY3Q9eGUuY2FsbChyZSxCKSk7bGV0IFl0PVplLmNhbGwocmUsQik7cmV0dXJuIHJlLnNldChCLFkpLGN0P3cuaGFzQ2hhbmdlZChZLFl0KSYmbnQocmUsInNldCIsQixZLFl0KTpudChyZSwiYWRkIixCLFkpLHRoaXN9ZnVuY3Rpb24gcG8oQil7bGV0IFk9S3QodGhpcykse2hhczpyZSxnZXQ6eGV9PVJyKFkpLFplPXJlLmNhbGwoWSxCKTtaZXx8KEI9S3QoQiksWmU9cmUuY2FsbChZLEIpKTtsZXQgY3Q9eGU/eGUuY2FsbChZLEIpOnZvaWQgMCxZdD1ZLmRlbGV0ZShCKTtyZXR1cm4gWmUmJm50KFksImRlbGV0ZSIsQix2b2lkIDAsY3QpLFl0fWZ1bmN0aW9uIE9vKCl7bGV0IEI9S3QodGhpcyksWT1CLnNpemUhPT0wLHJlPXZvaWQgMCx4ZT1CLmNsZWFyKCk7cmV0dXJuIFkmJm50KEIsImNsZWFyIix2b2lkIDAsdm9pZCAwLHJlKSx4ZX1mdW5jdGlvbiB4bihCLFkpe3JldHVybiBmdW5jdGlvbih4ZSxaZSl7bGV0IGN0PXRoaXMsWXQ9Y3QuX192X3JhdyxRdD1LdChZdCksVmk9WT9SaTpCP0xyOnpyO3JldHVybiFCJiZrbihRdCwiaXRlcmF0ZSIsd24pLFl0LmZvckVhY2goKEdyLGd0KT0+eGUuY2FsbChaZSxWaShHciksVmkoZ3QpLGN0KSl9fWZ1bmN0aW9uIFRyKEIsWSxyZSl7cmV0dXJuIGZ1bmN0aW9uKC4uLnhlKXtsZXQgWmU9dGhpcy5fX3ZfcmF3LGN0PUt0KFplKSxZdD13LmlzTWFwKGN0KSxRdD1CPT09ImVudHJpZXMifHxCPT09U3ltYm9sLml0ZXJhdG9yJiZZdCxWaT1CPT09ImtleXMiJiZZdCxHcj1aZVtCXSguLi54ZSksZ3Q9cmU/Umk6WT9Mcjp6cjtyZXR1cm4hWSYma24oY3QsIml0ZXJhdGUiLFZpP1huOnduKSx7bmV4dCgpe2xldHt2YWx1ZTpSdCxkb25lOllyfT1Hci5uZXh0KCk7cmV0dXJuIFlyP3t2YWx1ZTpSdCxkb25lOllyfTp7dmFsdWU6UXQ/W2d0KFJ0WzBdKSxndChSdFsxXSldOmd0KFJ0KSxkb25lOllyfX0sW1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fX1mdW5jdGlvbiBjaShCKXtyZXR1cm4gZnVuY3Rpb24oLi4uWSl7cmV0dXJuIEI9PT0iZGVsZXRlIj8hMTpCPT09ImNsZWFyIj92b2lkIDA6dGhpc319ZnVuY3Rpb24gZnIoKXtsZXQgQj17Z2V0KGN0KXtyZXR1cm4gemkodGhpcyxjdCl9LGdldCBzaXplKCl7cmV0dXJuIHJvKHRoaXMpfSxoYXM6V2ksYWRkOmlvLHNldDpsaSxkZWxldGU6cG8sY2xlYXI6T28sZm9yRWFjaDp4bighMSwhMSl9LFk9e2dldChjdCl7cmV0dXJuIHppKHRoaXMsY3QsITEsITApfSxnZXQgc2l6ZSgpe3JldHVybiBybyh0aGlzKX0saGFzOldpLGFkZDppbyxzZXQ6bGksZGVsZXRlOnBvLGNsZWFyOk9vLGZvckVhY2g6eG4oITEsITApfSxyZT17Z2V0KGN0KXtyZXR1cm4gemkodGhpcyxjdCwhMCl9LGdldCBzaXplKCl7cmV0dXJuIHJvKHRoaXMsITApfSxoYXMoY3Qpe3JldHVybiBXaS5jYWxsKHRoaXMsY3QsITApfSxhZGQ6Y2koImFkZCIpLHNldDpjaSgic2V0IiksZGVsZXRlOmNpKCJkZWxldGUiKSxjbGVhcjpjaSgiY2xlYXIiKSxmb3JFYWNoOnhuKCEwLCExKX0seGU9e2dldChjdCl7cmV0dXJuIHppKHRoaXMsY3QsITAsITApfSxnZXQgc2l6ZSgpe3JldHVybiBybyh0aGlzLCEwKX0saGFzKGN0KXtyZXR1cm4gV2kuY2FsbCh0aGlzLGN0LCEwKX0sYWRkOmNpKCJhZGQiKSxzZXQ6Y2koInNldCIpLGRlbGV0ZTpjaSgiZGVsZXRlIiksY2xlYXI6Y2koImNsZWFyIiksZm9yRWFjaDp4bighMCwhMCl9O3JldHVyblsia2V5cyIsInZhbHVlcyIsImVudHJpZXMiLFN5bWJvbC5pdGVyYXRvcl0uZm9yRWFjaChjdD0+e0JbY3RdPVRyKGN0LCExLCExKSxyZVtjdF09VHIoY3QsITAsITEpLFlbY3RdPVRyKGN0LCExLCEwKSx4ZVtjdF09VHIoY3QsITAsITApfSksW0IscmUsWSx4ZV19bGV0W3ZvLFpvLFRvLFNpXT1mcigpO2Z1bmN0aW9uIHNyKEIsWSl7bGV0IHJlPVk/Qj9TaTpUbzpCP1pvOnZvO3JldHVybih4ZSxaZSxjdCk9PlplPT09Il9fdl9pc1JlYWN0aXZlIj8hQjpaZT09PSJfX3ZfaXNSZWFkb25seSI/QjpaZT09PSJfX3ZfcmF3Ij94ZTpSZWZsZWN0LmdldCh3Lmhhc093bihyZSxaZSkmJlplIGluIHhlP3JlOnhlLFplLGN0KX1sZXQgdWk9e2dldDpzcighMSwhMSl9LGxyPXtnZXQ6c3IoITEsITApfSxRbj17Z2V0OnNyKCEwLCExKX0seGk9e2dldDpzcighMCwhMCl9O2Z1bmN0aW9uIG9vKEIsWSxyZSl7bGV0IHhlPUt0KHJlKTtpZih4ZSE9PXJlJiZZLmNhbGwoQix4ZSkpe2xldCBaZT13LnRvUmF3VHlwZShCKTtjb25zb2xlLndhcm4oYFJlYWN0aXZlICR7WmV9IGNvbnRhaW5zIGJvdGggdGhlIHJhdyBhbmQgcmVhY3RpdmUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgb2JqZWN0JHtaZT09PSJNYXAiPyIgYXMga2V5cyI6IiJ9LCB3aGljaCBjYW4gbGVhZCB0byBpbmNvbnNpc3RlbmNpZXMuIEF2b2lkIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIGFuIG9iamVjdCBhbmQgb25seSB1c2UgdGhlIHJlYWN0aXZlIHZlcnNpb24gaWYgcG9zc2libGUuYCl9fWxldCB0aT1uZXcgV2Vha01hcCx4cj1uZXcgV2Vha01hcCxCcj1uZXcgV2Vha01hcCx3aT1uZXcgV2Vha01hcDtmdW5jdGlvbiBQbyhCKXtzd2l0Y2goQil7Y2FzZSJPYmplY3QiOmNhc2UiQXJyYXkiOnJldHVybiAxO2Nhc2UiTWFwIjpjYXNlIlNldCI6Y2FzZSJXZWFrTWFwIjpjYXNlIldlYWtTZXQiOnJldHVybiAyO2RlZmF1bHQ6cmV0dXJuIDB9fWZ1bmN0aW9uIEhyKEIpe3JldHVybiBCLl9fdl9za2lwfHwhT2JqZWN0LmlzRXh0ZW5zaWJsZShCKT8wOlBvKHcudG9SYXdUeXBlKEIpKX1mdW5jdGlvbiBNcihCKXtyZXR1cm4gRWUoQik/QjpQcihCLCExLGZhLHVpLHRpKX1mdW5jdGlvbiBFcihCKXtyZXR1cm4gUHIoQiwhMSxKbyxscix4cil9ZnVuY3Rpb24gZ24oQil7cmV0dXJuIFByKEIsITAsQW8sUW4sQnIpfWZ1bmN0aW9uIGZpKEIpe3JldHVybiBQcihCLCEwLEtvLHhpLHdpKX1mdW5jdGlvbiBQcihCLFkscmUseGUsWmUpe2lmKCF3LmlzT2JqZWN0KEIpfHxCLl9fdl9yYXcmJiEoWSYmQi5fX3ZfaXNSZWFjdGl2ZSkpcmV0dXJuIEI7bGV0IGN0PVplLmdldChCKTtpZihjdClyZXR1cm4gY3Q7bGV0IFl0PUhyKEIpO2lmKFl0PT09MClyZXR1cm4gQjtsZXQgUXQ9bmV3IFByb3h5KEIsWXQ9PT0yP3hlOnJlKTtyZXR1cm4gWmUuc2V0KEIsUXQpLFF0fWZ1bmN0aW9uIEx0KEIpe3JldHVybiBFZShCKT9MdChCLl9fdl9yYXcpOiEhKEImJkIuX192X2lzUmVhY3RpdmUpfWZ1bmN0aW9uIEVlKEIpe3JldHVybiEhKEImJkIuX192X2lzUmVhZG9ubHkpfWZ1bmN0aW9uIG5pKEIpe3JldHVybiEhKEImJkIuX192X2lzU2hhbGxvdyl9ZnVuY3Rpb24gR2koQil7cmV0dXJuIEx0KEIpfHxFZShCKX1mdW5jdGlvbiBLdChCKXtsZXQgWT1CJiZCLl9fdl9yYXc7cmV0dXJuIFk/S3QoWSk6Qn1mdW5jdGlvbiBqcihCKXtyZXR1cm4gdy5kZWYoQiwiX192X3NraXAiLCEwKSxCfWxldCB6cj1CPT53LmlzT2JqZWN0KEIpP01yKEIpOkIsTHI9Qj0+dy5pc09iamVjdChCKT9nbihCKTpCO2Z1bmN0aW9uIERyKEIpe0NuJiZobiYmKEI9S3QoQiksamUoQi5kZXB8fChCLmRlcD1VdCgpKSkpfWZ1bmN0aW9uIEJpKEIsWSl7Qj1LdChCKTtsZXQgcmU9Qi5kZXA7cmUmJk90KHJlKX1mdW5jdGlvbiBCbihCKXtyZXR1cm4hIShCJiZCLl9fdl9pc1JlZj09PSEwKX1mdW5jdGlvbiBkaShCKXtyZXR1cm4gTWkoQiwhMSl9ZnVuY3Rpb24gZGEoQil7cmV0dXJuIE1pKEIsITApfWZ1bmN0aW9uIE1pKEIsWSl7cmV0dXJuIEJuKEIpP0I6bmV3IExpKEIsWSl9Y2xhc3MgTGl7Y29uc3RydWN0b3IoWSxyZSl7dGhpcy5fX3ZfaXNTaGFsbG93PXJlLHRoaXMuZGVwPXZvaWQgMCx0aGlzLl9fdl9pc1JlZj0hMCx0aGlzLl9yYXdWYWx1ZT1yZT9ZOkt0KFkpLHRoaXMuX3ZhbHVlPXJlP1k6enIoWSl9Z2V0IHZhbHVlKCl7cmV0dXJuIERyKHRoaXMpLHRoaXMuX3ZhbHVlfXNldCB2YWx1ZShZKXtsZXQgcmU9dGhpcy5fX3ZfaXNTaGFsbG93fHxuaShZKXx8RWUoWSk7WT1yZT9ZOkt0KFkpLHcuaGFzQ2hhbmdlZChZLHRoaXMuX3Jhd1ZhbHVlKSYmKHRoaXMuX3Jhd1ZhbHVlPVksdGhpcy5fdmFsdWU9cmU/WTp6cihZKSxCaSh0aGlzLFkpKX19ZnVuY3Rpb24gSW8oQil7QmkoQix2b2lkIDApfWZ1bmN0aW9uIEFuKEIpe3JldHVybiBCbihCKT9CLnZhbHVlOkJ9ZnVuY3Rpb24gRGkoQil7cmV0dXJuIHcuaXNGdW5jdGlvbihCKT9CKCk6QW4oQil9bGV0IFlpPXtnZXQ6KEIsWSxyZSk9PkFuKFJlZmxlY3QuZ2V0KEIsWSxyZSkpLHNldDooQixZLHJlLHhlKT0+e2xldCBaZT1CW1ldO3JldHVybiBCbihaZSkmJiFCbihyZSk/KFplLnZhbHVlPXJlLCEwKTpSZWZsZWN0LnNldChCLFkscmUseGUpfX07ZnVuY3Rpb24gQ2koQil7cmV0dXJuIEx0KEIpP0I6bmV3IFByb3h5KEIsWWkpfWNsYXNzIEZpe2NvbnN0cnVjdG9yKFkpe3RoaXMuZGVwPXZvaWQgMCx0aGlzLl9fdl9pc1JlZj0hMDtsZXR7Z2V0OnJlLHNldDp4ZX09WSgoKT0+RHIodGhpcyksKCk9PkJpKHRoaXMpKTt0aGlzLl9nZXQ9cmUsdGhpcy5fc2V0PXhlfWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9nZXQoKX1zZXQgdmFsdWUoWSl7dGhpcy5fc2V0KFkpfX1mdW5jdGlvbiBJcihCKXtyZXR1cm4gbmV3IEZpKEIpfWZ1bmN0aW9uIHJpKEIpe2xldCBZPXcuaXNBcnJheShCKT9uZXcgQXJyYXkoQi5sZW5ndGgpOnt9O2ZvcihsZXQgcmUgaW4gQilZW3JlXT1lcihCLHJlKTtyZXR1cm4gWX1jbGFzcyBycntjb25zdHJ1Y3RvcihZLHJlLHhlKXt0aGlzLl9vYmplY3Q9WSx0aGlzLl9rZXk9cmUsdGhpcy5fZGVmYXVsdFZhbHVlPXhlLHRoaXMuX192X2lzUmVmPSEwfWdldCB2YWx1ZSgpe2xldCBZPXRoaXMuX29iamVjdFt0aGlzLl9rZXldO3JldHVybiBZPT09dm9pZCAwP3RoaXMuX2RlZmF1bHRWYWx1ZTpZfXNldCB2YWx1ZShZKXt0aGlzLl9vYmplY3RbdGhpcy5fa2V5XT1ZfWdldCBkZXAoKXtyZXR1cm4gTm4oS3QodGhpcy5fb2JqZWN0KSx0aGlzLl9rZXkpfX1jbGFzcyBjcntjb25zdHJ1Y3RvcihZKXt0aGlzLl9nZXR0ZXI9WSx0aGlzLl9fdl9pc1JlZj0hMCx0aGlzLl9fdl9pc1JlYWRvbmx5PSEwfWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9nZXR0ZXIoKX19ZnVuY3Rpb24gcW4oQixZLHJlKXtyZXR1cm4gQm4oQik/Qjp3LmlzRnVuY3Rpb24oQik/bmV3IGNyKEIpOncuaXNPYmplY3QoQikmJmFyZ3VtZW50cy5sZW5ndGg+MT9lcihCLFkscmUpOmRpKEIpfWZ1bmN0aW9uIGVyKEIsWSxyZSl7bGV0IHhlPUJbWV07cmV0dXJuIEJuKHhlKT94ZTpuZXcgcnIoQixZLHJlKX1jbGFzcyBkcntjb25zdHJ1Y3RvcihZLHJlLHhlLFplKXt0aGlzLl9zZXR0ZXI9cmUsdGhpcy5kZXA9dm9pZCAwLHRoaXMuX192X2lzUmVmPSEwLHRoaXMuX192X2lzUmVhZG9ubHk9ITEsdGhpcy5fZGlydHk9ITAsdGhpcy5lZmZlY3Q9bmV3IHNpKFksKCk9Pnt0aGlzLl9kaXJ0eXx8KHRoaXMuX2RpcnR5PSEwLEJpKHRoaXMpKX0pLHRoaXMuZWZmZWN0LmNvbXB1dGVkPXRoaXMsdGhpcy5lZmZlY3QuYWN0aXZlPXRoaXMuX2NhY2hlYWJsZT0hWmUsdGhpcy5fX3ZfaXNSZWFkb25seT14ZX1nZXQgdmFsdWUoKXtsZXQgWT1LdCh0aGlzKTtyZXR1cm4gRHIoWSksKFkuX2RpcnR5fHwhWS5fY2FjaGVhYmxlKSYmKFkuX2RpcnR5PSExLFkuX3ZhbHVlPVkuZWZmZWN0LnJ1bigpKSxZLl92YWx1ZX1zZXQgdmFsdWUoWSl7dGhpcy5fc2V0dGVyKFkpfX1mdW5jdGlvbiBtbyhCLFkscmU9ITEpe2xldCB4ZSxaZSxjdD13LmlzRnVuY3Rpb24oQik7cmV0dXJuIGN0Pyh4ZT1CLFplPXcuTk9PUCk6KHhlPUIuZ2V0LFplPUIuc2V0KSxuZXcgZHIoeGUsWmUsY3R8fCFaZSxyZSl9bGV0IF9vPVByb21pc2UucmVzb2x2ZSgpLHFpPVtdLEppPSExLFhvPUI9PntxaS5wdXNoKEIpLEppfHwoSmk9ITAsX28udGhlbihXcikpfSxXcj0oKT0+e2ZvcihsZXQgQj0wO0I8cWkubGVuZ3RoO0IrKylxaVtCXSgpO3FpLmxlbmd0aD0wLEppPSExfTtjbGFzcyB5cntjb25zdHJ1Y3RvcihZKXt0aGlzLmRlcD12b2lkIDAsdGhpcy5fZGlydHk9ITAsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5fX3ZfaXNSZWFkb25seT0hMDtsZXQgcmUseGU9ITEsWmU9ITE7dGhpcy5lZmZlY3Q9bmV3IHNpKFksY3Q9PntpZih0aGlzLmRlcCl7aWYoY3QpcmU9dGhpcy5fdmFsdWUseGU9ITA7ZWxzZSBpZighWmUpe2xldCBZdD14ZT9yZTp0aGlzLl92YWx1ZTtaZT0hMCx4ZT0hMSxYbygoKT0+e3RoaXMuZWZmZWN0LmFjdGl2ZSYmdGhpcy5fZ2V0KCkhPT1ZdCYmQmkodGhpcyksWmU9ITF9KX1mb3IobGV0IFl0IG9mIHRoaXMuZGVwKVl0LmNvbXB1dGVkIGluc3RhbmNlb2YgeXImJll0LnNjaGVkdWxlcighMCl9dGhpcy5fZGlydHk9ITB9KSx0aGlzLmVmZmVjdC5jb21wdXRlZD10aGlzfV9nZXQoKXtyZXR1cm4gdGhpcy5fZGlydHk/KHRoaXMuX2RpcnR5PSExLHRoaXMuX3ZhbHVlPXRoaXMuZWZmZWN0LnJ1bigpKTp0aGlzLl92YWx1ZX1nZXQgdmFsdWUoKXtyZXR1cm4gRHIodGhpcyksS3QodGhpcykuX2dldCgpfX1mdW5jdGlvbiBObyhCKXtyZXR1cm4gbmV3IHlyKEIpfXJldHVybiBwLkVmZmVjdFNjb3BlPWgscC5JVEVSQVRFX0tFWT13bixwLlJlYWN0aXZlRWZmZWN0PXNpLHAuY29tcHV0ZWQ9bW8scC5jdXN0b21SZWY9SXIscC5kZWZlcnJlZENvbXB1dGVkPU5vLHAuZWZmZWN0PVhyLHAuZWZmZWN0U2NvcGU9RSxwLmVuYWJsZVRyYWNraW5nPVFyLHAuZ2V0Q3VycmVudFNjb3BlPURlLHAuaXNQcm94eT1HaSxwLmlzUmVhY3RpdmU9THQscC5pc1JlYWRvbmx5PUVlLHAuaXNSZWY9Qm4scC5pc1NoYWxsb3c9bmkscC5tYXJrUmF3PWpyLHAub25TY29wZURpc3Bvc2U9TnQscC5wYXVzZVRyYWNraW5nPSRyLHAucHJveHlSZWZzPUNpLHAucmVhY3RpdmU9TXIscC5yZWFkb25seT1nbixwLnJlZj1kaSxwLnJlc2V0VHJhY2tpbmc9eWkscC5zaGFsbG93UmVhY3RpdmU9RXIscC5zaGFsbG93UmVhZG9ubHk9ZmkscC5zaGFsbG93UmVmPWRhLHAuc3RvcD1tcixwLnRvUmF3PUt0LHAudG9SZWY9cW4scC50b1JlZnM9cmkscC50b1ZhbHVlPURpLHAudHJhY2s9a24scC50cmlnZ2VyPW50LHAudHJpZ2dlclJlZj1JbyxwLnVucmVmPUFuLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxwfSh7fSxmKTtyZXR1cm4gc31mdW5jdGlvbiBKcChmKXt2YXIgcz1mdW5jdGlvbihwKXsidXNlIHN0cmljdCI7bGV0IHc9YApgLE49NDQseT01MCxoPTUwLEU9WyIlIiwiJSJdLFI9IiMwMDdhZmYiLERlPS9eKFthLXotXSs6KT9cL1wvL2ksTnQ9L15kYXRhOi4qLC4qLyxVdD0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIixUdD0id3hzOi8vIixQPSJqc29uOi8vIixDdD0id3hzTW9kdWxlcyIsUm49InJlbmRlcmpzTW9kdWxlcyIsb3Q9Im9uU2hvdyIsej0ib25IaWRlIixLPSJvbkxhdW5jaCIsbW49Im9uRXJyb3IiLGhuPSJvblRoZW1lQ2hhbmdlIix3bj0ib2ZmVGhlbWVDaGFuZ2UiLFhuPSJvbktleWJvYXJkSGVpZ2h0Q2hhbmdlIixzaT0ib25QYWdlTm90Rm91bmQiLEVpPSJvblVuaGFuZGxlZFJlamVjdGlvbiIsWHI9Im9uRXhpdCIsbXI9Im9uTG9hZCIsQ249Im9uUmVhZHkiLF9yPSJvblVubG9hZCIsJHI9Im9uSW5pdCIsUXI9Im9uU2F2ZUV4aXRTdGF0ZSIseWk9Im9uUmVzaXplIixrbj0ib25CYWNrUHJlc3MiLGplPSJvblBhZ2VTY3JvbGwiLG50PSJvblRhYkl0ZW1UYXAiLE90PSJvblJlYWNoQm90dG9tIixubj0ib25QdWxsRG93blJlZnJlc2giLE5uPSJvblNoYXJlVGltZWxpbmUiLHVuPSJvbkFkZFRvRmF2b3JpdGVzIixhcj0ib25TaGFyZUFwcE1lc3NhZ2UiLFZuPSJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLFBuPSJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENsaWNrZWQiLF9uPSJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLGJyPSJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsZWk9Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIixnbz0ib25BcHBFbnRlckZvcmVncm91bmQiLGZhPSJvbkFwcEVudGVyQmFja2dyb3VuZCIsQW89Im9uV3hzSW52b2tlQ2FsbE1ldGhvZCI7ZnVuY3Rpb24gSm8ob2Upe3JldHVybiEhb2UuYXBwQ29udGV4dH1mdW5jdGlvbiBLbyhvZSl7cmV0dXJuIG9lJiYoSm8ob2UpP29lLnByb3h5Om9lKX1mdW5jdGlvbiBSaShvZSl7cmV0dXJuIG9lLm5vZGVUeXBlPT09MX1mdW5jdGlvbiBScihvZSxYPSExKXtsZXR7dm5vZGU6c2V9PW9lO2lmKFJpKHNlLmVsKSlyZXR1cm4gWD9zZS5lbD9bc2UuZWxdOltdOnNlLmVsO2xldHtzdWJUcmVlOkJlfT1vZTtpZihCZS5zaGFwZUZsYWcmMTYpe2xldCBtdD1CZS5jaGlsZHJlbi5maWx0ZXIocG49PnBuLmVsJiZSaShwbi5lbCkpO2lmKG10Lmxlbmd0aD4wKXJldHVybiBYP210Lm1hcChwbj0+cG4uZWwpOm10WzBdLmVsfXJldHVybiBYP3NlLmVsP1tzZS5lbF06W106c2UuZWx9bGV0IHppPTA7ZnVuY3Rpb24gV2kob2UsLi4uWCl7bGV0IHNlPURhdGUubm93KCksQmU9emk/c2Utemk6MDtyZXR1cm4gemk9c2UsYFske3NlfV1bJHtCZX1tc11bJHtvZX1dXHVGRjFBJHtYLm1hcChtdD0+SlNPTi5zdHJpbmdpZnkobXQpKS5qb2luKCIgIil9YH1mdW5jdGlvbiBybyhvZSl7bGV0IFg9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gc2U9Plhbc2VdfHwoWFtzZV09b2Uoc2UpKX1mdW5jdGlvbiBpbyhvZSl7cmV0dXJuIHJvKG9lKX1mdW5jdGlvbiBsaShvZT0iIil7cmV0dXJuKCIiK29lKS5yZXBsYWNlKC9bXlx4MDAtXHhmZl0vZywiKioiKS5sZW5ndGh9ZnVuY3Rpb24gcG8ob2Upe3JldHVybiBvZS5pbmRleE9mKCIvIik9PT0wfWZ1bmN0aW9uIE9vKG9lKXtyZXR1cm4gcG8ob2UpP29lOiIvIitvZX1mdW5jdGlvbiB4bihvZSl7cmV0dXJuIHBvKG9lKT9vZS5zbGljZSgxKTpvZX1sZXQgVHI9KG9lLFgpPT57bGV0IHNlO2ZvcihsZXQgQmU9MDtCZTxvZS5sZW5ndGg7QmUrKylzZT1vZVtCZV0oWCk7cmV0dXJuIHNlfTtmdW5jdGlvbiBjaShvZSxYPW51bGwpe2xldCBzZTtyZXR1cm4oLi4uQmUpPT4ob2UmJihzZT1vZS5hcHBseShYLEJlKSxvZT1udWxsKSxzZSl9ZnVuY3Rpb24gZnIob2UsWCl7b2U9b2V8fHt9LHAuaXNTdHJpbmcoWCkmJihYPXtlcnJNc2c6WH0pLC86b2skLy50ZXN0KFguZXJyTXNnKT9wLmlzRnVuY3Rpb24ob2Uuc3VjY2VzcykmJm9lLnN1Y2Nlc3MoWCk6cC5pc0Z1bmN0aW9uKG9lLmZhaWwpJiZvZS5mYWlsKFgpLHAuaXNGdW5jdGlvbihvZS5jb21wbGV0ZSkmJm9lLmNvbXBsZXRlKFgpfWZ1bmN0aW9uIHZvKG9lKXtsZXQgWD17fTtyZXR1cm4gcC5pc1BsYWluT2JqZWN0KG9lKSYmT2JqZWN0LmtleXMob2UpLnNvcnQoKS5mb3JFYWNoKHNlPT57bGV0IEJlPXNlO1hbQmVdPW9lW0JlXX0pLE9iamVjdC5rZXlzKFgpP1g6b2V9bGV0IFpvPWVuY29kZVVSSUNvbXBvbmVudDtmdW5jdGlvbiBUbyhvZSxYPVpvKXtsZXQgc2U9b2U/T2JqZWN0LmtleXMob2UpLm1hcChCZT0+e2xldCBtdD1vZVtCZV07cmV0dXJuIHR5cGVvZiBtdD09PXZvaWQgMHx8bXQ9PT1udWxsP210PSIiOnAuaXNQbGFpbk9iamVjdChtdCkmJihtdD1KU09OLnN0cmluZ2lmeShtdCkpLFgoQmUpKyI9IitYKG10KX0pLmZpbHRlcihCZT0+QmUubGVuZ3RoPjApLmpvaW4oIiYiKTpudWxsO3JldHVybiBzZT9gPyR7c2V9YDoiIn1mdW5jdGlvbiBTaShvZSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoIiIrb2UpfWNhdGNoKFgpe31yZXR1cm4iIitvZX1sZXQgc3I9L1wrL2c7ZnVuY3Rpb24gdWkob2Upe2xldCBYPXt9O2lmKG9lPT09IiJ8fG9lPT09Ij8iKXJldHVybiBYO2xldCBCZT0ob2VbMF09PT0iPyI/b2Uuc2xpY2UoMSk6b2UpLnNwbGl0KCImIik7Zm9yKGxldCBtdD0wO210PEJlLmxlbmd0aDsrK210KXtsZXQgcG49QmVbbXRdLnJlcGxhY2Uoc3IsIiAiKSxKbj1wbi5pbmRleE9mKCI9IiksVW49U2koSm48MD9wbjpwbi5zbGljZSgwLEpuKSksU3I9Sm48MD9udWxsOlNpKHBuLnNsaWNlKEpuKzEpKTtpZihVbiBpbiBYKXtsZXQgRnI9WFtVbl07cC5pc0FycmF5KEZyKXx8KEZyPVhbVW5dPVtGcl0pLEZyLnB1c2goU3IpfWVsc2UgWFtVbl09U3J9cmV0dXJuIFh9ZnVuY3Rpb24gbHIob2Upe2xldFtYLHNlXT1vZS5zcGxpdCgiPyIsMik7cmV0dXJue3BhdGg6WCxxdWVyeTp1aShzZXx8IiIpfX1mdW5jdGlvbiBRbihvZSl7bGV0IFg9e307cmV0dXJuIG9lJiZPYmplY3Qua2V5cyhvZSkuZm9yRWFjaChzZT0+e3NlLmluZGV4T2YoImRhdGEtIik9PT0wJiYoWFtzZS5yZXBsYWNlKCJkYXRhLSIsIiIpXT1vZVtzZV0pfSksWH1jbGFzcyB4aSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKFgpe3N1cGVyKFgpO3RoaXMubmFtZT0iRE9NRXhjZXB0aW9uIn19ZnVuY3Rpb24gb28ob2UsWCl7cmV0dXJuIFgmJihYLmNhcHR1cmUmJihvZSs9IkNhcHR1cmUiKSxYLm9uY2UmJihvZSs9Ik9uY2UiKSxYLnBhc3NpdmUmJihvZSs9IlBhc3NpdmUiKSksYG9uJHtwLmNhcGl0YWxpemUocC5jYW1lbGl6ZShvZSkpfWB9Y2xhc3MgdGl7Y29uc3RydWN0b3IoWCxzZSl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMudGltZVN0YW1wPURhdGUubm93KCksdGhpcy5fc3RvcD0hMSx0aGlzLl9lbmQ9ITEsdGhpcy50eXBlPVgsdGhpcy5idWJibGVzPSEhc2UuYnViYmxlcyx0aGlzLmNhbmNlbGFibGU9ISFzZS5jYW5jZWxhYmxlfXByZXZlbnREZWZhdWx0KCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwfXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpe3RoaXMuX2VuZD10aGlzLl9zdG9wPSEwfXN0b3BQcm9wYWdhdGlvbigpe3RoaXMuX3N0b3A9ITB9fWZ1bmN0aW9uIHhyKG9lKXtpZihvZSBpbnN0YW5jZW9mIHRpKXJldHVybiBvZTtsZXRbWF09UG8ob2UudHlwZSksc2U9bmV3IHRpKFgse2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMX0pO3JldHVybiBwLmV4dGVuZChzZSxvZSksc2V9Y2xhc3MgQnJ7Y29uc3RydWN0b3IoKXt0aGlzLmxpc3RlbmVycz1PYmplY3QuY3JlYXRlKG51bGwpfWRpc3BhdGNoRXZlbnQoWCl7bGV0IHNlPXRoaXMubGlzdGVuZXJzW1gudHlwZV07aWYoIXNlKXJldHVybiExO2xldCBCZT14cihYKSxtdD1zZS5sZW5ndGg7Zm9yKGxldCBwbj0wO3BuPG10JiYoc2VbcG5dLmNhbGwodGhpcyxCZSksIUJlLl9lbmQpO3BuKyspO3JldHVybiBCZS5jYW5jZWxhYmxlJiZCZS5kZWZhdWx0UHJldmVudGVkfWFkZEV2ZW50TGlzdGVuZXIoWCxzZSxCZSl7WD1vbyhYLEJlKSwodGhpcy5saXN0ZW5lcnNbWF18fCh0aGlzLmxpc3RlbmVyc1tYXT1bXSkpLnB1c2goc2UpfXJlbW92ZUV2ZW50TGlzdGVuZXIoWCxzZSxCZSl7WD1vbyhYLEJlKTtsZXQgbXQ9dGhpcy5saXN0ZW5lcnNbWF07aWYoIW10KXJldHVybjtsZXQgcG49bXQuaW5kZXhPZihzZSk7cG4+LTEmJm10LnNwbGljZShwbiwxKX19bGV0IHdpPS8oPzpPbmNlfFBhc3NpdmV8Q2FwdHVyZSkkLztmdW5jdGlvbiBQbyhvZSl7bGV0IFg7aWYod2kudGVzdChvZSkpe1g9e307bGV0IHNlO2Zvcig7c2U9b2UubWF0Y2god2kpOylvZT1vZS5zbGljZSgwLG9lLmxlbmd0aC1zZVswXS5sZW5ndGgpLFhbc2VbMF0udG9Mb3dlckNhc2UoKV09ITB9cmV0dXJuW3AuaHlwaGVuYXRlKG9lLnNsaWNlKDIpKSxYXX1sZXQgSHI9KCgpPT4oe3N0b3A6MSxwcmV2ZW50OjE8PDEsc2VsZjoxPDwyfSkpKCk7ZnVuY3Rpb24gTXIob2Upe2xldCBYPTA7cmV0dXJuIG9lLmluY2x1ZGVzKCJzdG9wIikmJihYfD1Ici5zdG9wKSxvZS5pbmNsdWRlcygicHJldmVudCIpJiYoWHw9SHIucHJldmVudCksb2UuaW5jbHVkZXMoInNlbGYiKSYmKFh8PUhyLnNlbGYpLFh9bGV0IEVyPTAsZ249MSxmaT0zLFByPTg7ZnVuY3Rpb24gTHQob2UsWCl7bGV0e3BhcmVudE5vZGU6c2V9PW9lO2lmKCFzZSlyZXR1cm4gbnVsbDtsZXR7Y2hpbGROb2RlczpCZX09c2U7cmV0dXJuIEJlW0JlLmluZGV4T2Yob2UpKyhYPT09Im4iPzE6LTEpXXx8bnVsbH1mdW5jdGlvbiBFZShvZSl7bGV0e3BhcmVudE5vZGU6WH09b2U7aWYoWCl7bGV0e2NoaWxkTm9kZXM6c2V9PVgsQmU9c2UuaW5kZXhPZihvZSk7QmU+LTEmJihvZS5wYXJlbnROb2RlPW51bGwsc2Uuc3BsaWNlKEJlLDEpKX19ZnVuY3Rpb24gbmkob2UpeyFvZS5ub2RlSWQmJm9lLnBhZ2VOb2RlJiYob2Uubm9kZUlkPW9lLnBhZ2VOb2RlLmdlbklkKCkpfWNsYXNzIEdpIGV4dGVuZHMgQnJ7Y29uc3RydWN0b3IoWCxzZSxCZSl7c3VwZXIoKTtpZih0aGlzLnBhZ2VOb2RlPW51bGwsdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5fdGV4dD1udWxsLEJlKXtsZXR7cGFnZU5vZGU6bXR9PUJlO210JiYodGhpcy5wYWdlTm9kZT1tdCx0aGlzLm5vZGVJZD1tdC5nZW5JZCgpLCFtdC5pc1VubW91bnRlZCYmbXQub25DcmVhdGUodGhpcyxzZSkpfXRoaXMubm9kZVR5cGU9WCx0aGlzLm5vZGVOYW1lPXNlLHRoaXMuY2hpbGROb2Rlcz1bXX1nZXQgZmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkTm9kZXNbMF18fG51bGx9Z2V0IGxhc3RDaGlsZCgpe2xldHtjaGlsZE5vZGVzOlh9PXRoaXMsc2U9WC5sZW5ndGg7cmV0dXJuIHNlP1hbc2UtMV06bnVsbH1nZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gTHQodGhpcywibiIpfWdldCBub2RlVmFsdWUoKXtyZXR1cm4gbnVsbH1zZXQgbm9kZVZhbHVlKFgpe31nZXQgdGV4dENvbnRlbnQoKXtyZXR1cm4gdGhpcy5fdGV4dHx8IiJ9c2V0IHRleHRDb250ZW50KFgpe3RoaXMuX3RleHQ9WCx0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZCYmdGhpcy5wYWdlTm9kZS5vblRleHRDb250ZW50KHRoaXMsWCl9Z2V0IHBhcmVudEVsZW1lbnQoKXtsZXR7cGFyZW50Tm9kZTpYfT10aGlzO3JldHVybiBYJiZYLm5vZGVUeXBlPT09Z24/WDpudWxsfWdldCBwcmV2aW91c1NpYmxpbmcoKXtyZXR1cm4gTHQodGhpcywicCIpfWFwcGVuZENoaWxkKFgpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShYLG51bGwpfWNsb25lTm9kZShYKXtsZXQgc2U9cC5leHRlbmQoT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpLHRoaXMpLHthdHRyaWJ1dGVzOkJlfT1zZTtyZXR1cm4gQmUmJihzZS5hdHRyaWJ1dGVzPXAuZXh0ZW5kKHt9LEJlKSksWCYmKHNlLmNoaWxkTm9kZXM9c2UuY2hpbGROb2Rlcy5tYXAobXQ9Pm10LmNsb25lTm9kZSghMCkpKSxzZX1pbnNlcnRCZWZvcmUoWCxzZSl7RWUoWCksWC5wYWdlTm9kZT10aGlzLnBhZ2VOb2RlLFgucGFyZW50Tm9kZT10aGlzLG5pKFgpO2xldHtjaGlsZE5vZGVzOkJlfT10aGlzO2lmKHNlKXtsZXQgbXQ9QmUuaW5kZXhPZihzZSk7aWYobXQ9PT0tMSl0aHJvdyBuZXcgeGkoIkZhaWxlZCB0byBleGVjdXRlICdpbnNlcnRCZWZvcmUnIG9uICdOb2RlJzogVGhlIG5vZGUgYmVmb3JlIHdoaWNoIHRoZSBuZXcgbm9kZSBpcyB0byBiZSBpbnNlcnRlZCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIG5vZGUuIik7QmUuc3BsaWNlKG10LDAsWCl9ZWxzZSBCZS5wdXNoKFgpO3JldHVybiB0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZD90aGlzLnBhZ2VOb2RlLm9uSW5zZXJ0QmVmb3JlKHRoaXMsWCxzZSk6WH1yZW1vdmVDaGlsZChYKXtsZXR7Y2hpbGROb2RlczpzZX09dGhpcyxCZT1zZS5pbmRleE9mKFgpO2lmKEJlPT09LTEpdGhyb3cgbmV3IHhpKCJGYWlsZWQgdG8gZXhlY3V0ZSAncmVtb3ZlQ2hpbGQnIG9uICdOb2RlJzogVGhlIG5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIG5vZGUuIik7cmV0dXJuIFgucGFyZW50Tm9kZT1udWxsLHNlLnNwbGljZShCZSwxKSx0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZD90aGlzLnBhZ2VOb2RlLm9uUmVtb3ZlQ2hpbGQoWCk6WH19bGV0IEt0PSJjbGFzcyIsanI9InN0eWxlIix6cj0iLnZPd25lcklkIixMcj0iLnZSZW5kZXJqcyI7Y2xhc3MgRHIgZXh0ZW5kcyBHaXtjb25zdHJ1Y3RvcihYLHNlLEJlKXtzdXBlcihYLHNlLEJlKTt0aGlzLmF0dHJpYnV0ZXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLnN0eWxlPW51bGwsdGhpcy52U2hvdz1udWxsLHRoaXMuX2h0bWw9bnVsbH1nZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1tLdF18fCIifXNldCBjbGFzc05hbWUoWCl7dGhpcy5zZXRBdHRyaWJ1dGUoS3QsWCl9Z2V0IGlubmVySFRNTCgpe3JldHVybiIifXNldCBpbm5lckhUTUwoWCl7dGhpcy5faHRtbD1YfWFkZEV2ZW50TGlzdGVuZXIoWCxzZSxCZSl7c3VwZXIuYWRkRXZlbnRMaXN0ZW5lcihYLHNlLEJlKSx0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZCYmKHNlLnd4c0V2ZW50P3RoaXMucGFnZU5vZGUub25BZGRXeHNFdmVudCh0aGlzLG9vKFgsQmUpLHNlLnd4c0V2ZW50LE1yKHNlLm1vZGlmaWVyc3x8W10pKTp0aGlzLnBhZ2VOb2RlLm9uQWRkRXZlbnQodGhpcyxvbyhYLEJlKSxNcihzZS5tb2RpZmllcnN8fFtdKSkpfXJlbW92ZUV2ZW50TGlzdGVuZXIoWCxzZSxCZSl7c3VwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihYLHNlLEJlKSx0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZCYmdGhpcy5wYWdlTm9kZS5vblJlbW92ZUV2ZW50KHRoaXMsb28oWCxCZSkpfWdldEF0dHJpYnV0ZShYKXtyZXR1cm4gWD09PWpyP3RoaXMuc3R5bGU6dGhpcy5hdHRyaWJ1dGVzW1hdfXJlbW92ZUF0dHJpYnV0ZShYKXtYPT1qcj90aGlzLnN0eWxlPW51bGw6ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1tYXSx0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZCYmdGhpcy5wYWdlTm9kZS5vblJlbW92ZUF0dHJpYnV0ZSh0aGlzLFgpfXNldEF0dHJpYnV0ZShYLHNlKXtYPT09anI/dGhpcy5zdHlsZT1zZTp0aGlzLmF0dHJpYnV0ZXNbWF09c2UsdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25TZXRBdHRyaWJ1dGUodGhpcyxYLHNlKX10b0pTT04oe2F0dHI6WCxub3JtYWxpemU6c2V9PXt9KXtsZXR7YXR0cmlidXRlczpCZSxzdHlsZTptdCxsaXN0ZW5lcnM6cG4sX3RleHQ6Sm59PXRoaXMsVW49e307T2JqZWN0LmtleXMoQmUpLmxlbmd0aCYmKFVuLmE9c2U/c2UoQmUpOkJlKTtsZXQgU3I9T2JqZWN0LmtleXMocG4pO2lmKFNyLmxlbmd0aCl7bGV0IEZyLGJvPXt9O1NyLmZvckVhY2goa289PntsZXQgUm89cG5ba29dO2lmKFJvLmxlbmd0aCl7bGV0e3d4c0V2ZW50OiRuLG1vZGlmaWVyczpLbn09Um9bMF0sSG49TXIoS258fFtdKTskbj8oRnJ8fChGcj17fSksRnJba29dPVtzZT9zZSgkbik6JG4sSG5dKTpib1trb109SG59fSksVW4uZT1zZT9zZShibywhMSk6Ym8sRnImJihVbi53PXNlP3NlKEZyLCExKTpGcil9cmV0dXJuIG10IT09bnVsbCYmKFVuLnM9c2U/c2UobXQpOm10KSxYfHwoVW4uaT10aGlzLm5vZGVJZCxVbi5uPXRoaXMubm9kZU5hbWUpLEpuIT09bnVsbCYmKFVuLnQ9c2U/c2UoSm4pOkpuKSxVbn19Y2xhc3MgQmkgZXh0ZW5kcyBHaXtjb25zdHJ1Y3RvcihYLHNlKXtzdXBlcihQciwiI2NvbW1lbnQiLHNlKTt0aGlzLl90ZXh0PSIifXRvSlNPTihYPXt9KXtyZXR1cm4gWC5hdHRyP3t9OntpOnRoaXMubm9kZUlkfX19Y2xhc3MgQm4gZXh0ZW5kcyBEcntjb25zdHJ1Y3RvcihYLHNlKXtzdXBlcihnbixYLnRvVXBwZXJDYXNlKCksc2UpO3RoaXMudGFnTmFtZT10aGlzLm5vZGVOYW1lfX1jbGFzcyBkaSBleHRlbmRzIEJue2dldCB2YWx1ZSgpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgidmFsdWUiKX1zZXQgdmFsdWUoWCl7dGhpcy5zZXRBdHRyaWJ1dGUoInZhbHVlIixYKX19Y2xhc3MgZGEgZXh0ZW5kcyBkaXt9Y2xhc3MgTWkgZXh0ZW5kcyBEcntjb25zdHJ1Y3RvcihYLHNlKXtzdXBlcihmaSwiI3RleHQiLHNlKTt0aGlzLl90ZXh0PVh9Z2V0IG5vZGVWYWx1ZSgpe3JldHVybiB0aGlzLl90ZXh0fHwiIn1zZXQgbm9kZVZhbHVlKFgpe3RoaXMuX3RleHQ9WCx0aGlzLnBhZ2VOb2RlJiYhdGhpcy5wYWdlTm9kZS5pc1VubW91bnRlZCYmdGhpcy5wYWdlTm9kZS5vbk5vZGVWYWx1ZSh0aGlzLFgpfX1sZXQgTGk9e0FEOlsiZGF0YSJdLCJBRC1EUkFXIjpbImRhdGEiXSwiTElWRS1QTEFZRVIiOlsicGljdHVyZS1pbi1waWN0dXJlLW1vZGUiXSxNQVA6WyJtYXJrZXJzIiwicG9seWxpbmUiLCJjaXJjbGVzIiwiY29udHJvbHMiLCJpbmNsdWRlLXBvaW50cyIsInBvbHlnb25zIl0sUElDS0VSOlsicmFuZ2UiLCJ2YWx1ZSJdLCJQSUNLRVItVklFVyI6WyJ2YWx1ZSJdLCJSSUNILVRFWFQiOlsibm9kZXMiXSxWSURFTzpbImRhbm11LWxpc3QiLCJoZWFkZXIiXSwiV0VCLVZJRVciOlsid2Vidmlldy1zdHlsZXMiXX0sSW89WyJhbmltYXRpb24iXSxBbj0ob2UsWCk9PntpZihJby5pbmRleE9mKFgpPi0xKXJldHVybiEwO2xldCBzZT1MaVtvZS5ub2RlTmFtZV07cmV0dXJuISEoc2UmJnNlLmluZGV4T2YoWCk+LTEpfSxEaT0xLFlpPTIsQ2k9MyxGaT00LElyPTUscmk9Nixycj03LGNyPTgscW49OSxlcj0xMCxkcj0xMixtbz0xNSxfbz0yMDtmdW5jdGlvbiBxaShvZSxYLHtjbGVhclRpbWVvdXQ6c2Usc2V0VGltZW91dDpCZX0pe2xldCBtdCxwbj1mdW5jdGlvbigpe3NlKG10KSxtdD1CZSgoKT0+b2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLFgpfTtyZXR1cm4gcG4uY2FuY2VsPWZ1bmN0aW9uKCl7c2UobXQpfSxwbn1jbGFzcyBKaXtjb25zdHJ1Y3RvcihYLHNlKXt0aGlzLmlkPVgsdGhpcy5saXN0ZW5lcj17fSx0aGlzLmVtaXRDYWNoZT1bXSxzZSYmT2JqZWN0LmtleXMoc2UpLmZvckVhY2goQmU9Pnt0aGlzLm9uKEJlLHNlW0JlXSl9KX1lbWl0KFgsLi4uc2Upe2xldCBCZT10aGlzLmxpc3RlbmVyW1hdO2lmKCFCZSlyZXR1cm4gdGhpcy5lbWl0Q2FjaGUucHVzaCh7ZXZlbnROYW1lOlgsYXJnczpzZX0pO0JlLmZvckVhY2gobXQ9PnttdC5mbi5hcHBseShtdC5mbixzZSl9KSx0aGlzLmxpc3RlbmVyW1hdPUJlLmZpbHRlcihtdD0+bXQudHlwZSE9PSJvbmNlIil9b24oWCxzZSl7dGhpcy5fYWRkTGlzdGVuZXIoWCwib24iLHNlKSx0aGlzLl9jbGVhckNhY2hlKFgpfW9uY2UoWCxzZSl7dGhpcy5fYWRkTGlzdGVuZXIoWCwib25jZSIsc2UpLHRoaXMuX2NsZWFyQ2FjaGUoWCl9b2ZmKFgsc2Upe2xldCBCZT10aGlzLmxpc3RlbmVyW1hdO2lmKCEhQmUpaWYoc2UpZm9yKGxldCBtdD0wO210PEJlLmxlbmd0aDspQmVbbXRdLmZuPT09c2UmJihCZS5zcGxpY2UobXQsMSksbXQtLSksbXQrKztlbHNlIGRlbGV0ZSB0aGlzLmxpc3RlbmVyW1hdfV9jbGVhckNhY2hlKFgpe2ZvcihsZXQgc2U9MDtzZTx0aGlzLmVtaXRDYWNoZS5sZW5ndGg7c2UrKyl7bGV0IEJlPXRoaXMuZW1pdENhY2hlW3NlXSxtdD1YP0JlLmV2ZW50TmFtZT09PVg/WDpudWxsOkJlLmV2ZW50TmFtZTtpZighbXQpY29udGludWU7aWYodHlwZW9mIHRoaXMuZW1pdC5hcHBseSh0aGlzLFttdCwuLi5CZS5hcmdzXSk9PSJudW1iZXIiKXt0aGlzLmVtaXRDYWNoZS5wb3AoKTtjb250aW51ZX10aGlzLmVtaXRDYWNoZS5zcGxpY2Uoc2UsMSksc2UtLX19X2FkZExpc3RlbmVyKFgsc2UsQmUpeyh0aGlzLmxpc3RlbmVyW1hdfHwodGhpcy5saXN0ZW5lcltYXT1bXSkpLnB1c2goe2ZuOkJlLHR5cGU6c2V9KX19bGV0IFhvPVskcixtcixvdCx6LF9yLGtuLGplLG50LE90LG5uLE5uLGFyLHVuLFFyLFZuLFBuLF9uLGJyLGVpXSxXcj1bbXIsb3RdO2Z1bmN0aW9uIHlyKG9lKXtyZXR1cm4gV3IuaW5kZXhPZihvZSk+LTF9ZnVuY3Rpb24gTm8ob2Upe3JldHVybiBYby5pbmRleE9mKG9lKT4tMX1sZXQgQj1bb3QseixLLG1uLGhuLHNpLEVpLFhyLCRyLG1yLENuLF9yLHlpLGtuLGplLG50LE90LG5uLE5uLHVuLGFyLFFyLFZuLFBuLF9uLGJyLGVpXTtmdW5jdGlvbiBZKG9lLFgsc2U9ITApe3JldHVybiBzZSYmIXAuaXNGdW5jdGlvbihYKT8hMTpCLmluZGV4T2Yob2UpPi0xPyEwOm9lLmluZGV4T2YoIm9uIik9PT0wfWxldCByZSx4ZT1bXTtmdW5jdGlvbiBaZShvZSl7aWYocmUpcmV0dXJuIG9lKHJlKTt4ZS5wdXNoKG9lKX1mdW5jdGlvbiBjdChvZSl7cmU9b2UseGUuZm9yRWFjaChYPT5YKG9lKSl9bGV0IFl0PWNpKChvZSxYKT0+e2lmKHAuaXNGdW5jdGlvbihvZS5fY29tcG9uZW50Lm9uRXJyb3IpKXJldHVybiBYKG9lKX0pLFF0PWZ1bmN0aW9uKCl7fTtRdC5wcm90b3R5cGU9e29uOmZ1bmN0aW9uKG9lLFgsc2Upe3ZhciBCZT10aGlzLmV8fCh0aGlzLmU9e30pO3JldHVybihCZVtvZV18fChCZVtvZV09W10pKS5wdXNoKHtmbjpYLGN0eDpzZX0pLHRoaXN9LG9uY2U6ZnVuY3Rpb24ob2UsWCxzZSl7dmFyIEJlPXRoaXM7ZnVuY3Rpb24gbXQoKXtCZS5vZmYob2UsbXQpLFguYXBwbHkoc2UsYXJndW1lbnRzKX1yZXR1cm4gbXQuXz1YLHRoaXMub24ob2UsbXQsc2UpfSxlbWl0OmZ1bmN0aW9uKG9lKXt2YXIgWD1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxzZT0oKHRoaXMuZXx8KHRoaXMuZT17fSkpW29lXXx8W10pLnNsaWNlKCksQmU9MCxtdD1zZS5sZW5ndGg7Zm9yKEJlO0JlPG10O0JlKyspc2VbQmVdLmZuLmFwcGx5KHNlW0JlXS5jdHgsWCk7cmV0dXJuIHRoaXN9LG9mZjpmdW5jdGlvbihvZSxYKXt2YXIgc2U9dGhpcy5lfHwodGhpcy5lPXt9KSxCZT1zZVtvZV0sbXQ9W107aWYoQmUmJlgpe2Zvcih2YXIgcG49QmUubGVuZ3RoLTE7cG4+PTA7cG4tLSlpZihCZVtwbl0uZm49PT1YfHxCZVtwbl0uZm4uXz09PVgpe0JlLnNwbGljZShwbiwxKTticmVha31tdD1CZX1yZXR1cm4gbXQubGVuZ3RoP3NlW29lXT1tdDpkZWxldGUgc2Vbb2VdLHRoaXN9fTt2YXIgVmk9UXQ7bGV0IEdyPXtibGFjazoicmdiYSgwLDAsMCwwLjQpIix3aGl0ZToicmdiYSgyNTUsMjU1LDI1NSwwLjQpIn07ZnVuY3Rpb24gZ3Qob2Upe3JldHVybiBvZSYmb2UgaW4gR3I/R3Jbb2VdOm9lfWZ1bmN0aW9uIFJ0KG9lKXtyZXR1cm4gb2U9PT0iYmxhY2siPyIjMDAwMDAwIjoiI2ZmZmZmZiJ9ZnVuY3Rpb24gWXIob2UsWD17fSxzZT0ibGlnaHQiKXtsZXQgQmU9WFtzZV0sbXQ9e307cmV0dXJuIEJlPyhPYmplY3Qua2V5cyhvZSkuZm9yRWFjaChwbj0+e2xldCBKbj1vZVtwbl07bXRbcG5dPSgoKT0+e2lmKHAuaXNQbGFpbk9iamVjdChKbikpcmV0dXJuIFlyKEpuLFgsc2UpO2lmKHAuaXNBcnJheShKbikpcmV0dXJuIEpuLm1hcChVbj0+cC5pc1BsYWluT2JqZWN0KFVuKT9ZcihVbixYLHNlKTpVbik7aWYocC5pc1N0cmluZyhKbikmJkpuLnN0YXJ0c1dpdGgoIkAiKSl7bGV0IFVuPUpuLnJlcGxhY2UoIkAiLCIiKSxTcj1CZVtVbl18fEpuO3N3aXRjaChwbil7Y2FzZSJ0aXRsZUNvbG9yIjpTcj1SdChTcik7YnJlYWs7Y2FzZSJib3JkZXJTdHlsZSI6U3I9Z3QoU3IpO2JyZWFrfXJldHVybiBTcn1yZXR1cm4gSm59KSgpfSksbXQpOm9lfXZhciBhbz17aW52b2tlQXJyYXlGbnM6VHIsaXNVbmlMaWZlY3ljbGVIb29rOlksT05fTE9BRDptcixPTl9TSE9XOm90LExJTkVGRUVEOncsUkVOREVSSlNfTU9EVUxFUzpSbixmb3JtYXRMb2c6V2ksV1hTX1BST1RPQ09MOlR0LFdYU19NT0RVTEVTOkN0LFVuaUxpZmVjeWNsZUhvb2tzOkIsT05fRVJST1I6bW4saW52b2tlQ3JlYXRlRXJyb3JIYW5kbGVyOll0LGludm9rZUNyZWF0ZVZ1ZUFwcEhvb2s6Y3QscGFyc2VOVnVlRGF0YXNldDpRbixvbmNlOmNpLEkxOE5fSlNPTl9ERUxJTUlURVJTOkUsRW1pdHRlcjpWaSxub3JtYWxpemVTdHlsZXM6WXIsYWRkTGVhZGluZ1NsYXNoOk9vLHJlc29sdmVDb21wb25lbnRJbnN0YW5jZTpLbyxyZW1vdmVMZWFkaW5nU2xhc2g6eG4sT05fUkVTSVpFOnlpLE9OX0FQUF9FTlRFUl9GT1JFR1JPVU5EOmdvLE9OX0FQUF9FTlRFUl9CQUNLR1JPVU5EOmZhLE9OX0hJREU6eixPTl9QQUdFX1NDUk9MTDpqZSxPTl9SRUFDSF9CT1RUT006T3QsU0NIRU1FX1JFOkRlLERBVEFfUkU6TnQsY2FjaGVTdHJpbmdGdW5jdGlvbjppbyxwYXJzZVF1ZXJ5OnVpLGNhbGxPcHRpb25zOmZyLE9OX1VOSEFORExFX1JFSkVDVElPTjpFaSxPTl9QQUdFX05PVF9GT1VORDpzaSxQUklNQVJZX0NPTE9SOlIsZ2V0TGVuOmxpLE9OX1RIRU1FX0NIQU5HRTpobixUQUJCQVJfSEVJR0hUOnksTkFWQkFSX0hFSUdIVDpOLHNvcnRPYmplY3Q6dm8sT0ZGX1RIRU1FX0NIQU5HRTp3bixPTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFOlhuLG5vcm1hbGl6ZVRhYkJhclN0eWxlczpndCxPTl9OQVZJR0FUSU9OX0JBUl9CVVRUT05fVEFQOlZuLHN0cmluZ2lmeVF1ZXJ5OlRvLGRlYm91bmNlOnFpLE9OX1BVTExfRE9XTl9SRUZSRVNIOm5uLE9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DSEFOR0VEOl9uLE9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DT05GSVJNRUQ6YnIsT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NMSUNLRUQ6UG4sT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0ZPQ1VTX0NIQU5HRUQ6ZWksT05fQkFDS19QUkVTUzprbixVbmlOb2RlOkdpLE5PREVfVFlQRV9QQUdFOkVyLEFDVElPTl9UWVBFX1BBR0VfQ1JFQVRFOkRpLEFDVElPTl9UWVBFX1BBR0VfQ1JFQVRFRDpZaSxBQ1RJT05fVFlQRV9QQUdFX1NDUk9MTDptbyxBQ1RJT05fVFlQRV9JTlNFUlQ6RmksQUNUSU9OX1RZUEVfQ1JFQVRFOkNpLEFDVElPTl9UWVBFX1JFTU9WRTpJcixBQ1RJT05fVFlQRV9BRERfRVZFTlQ6Y3IsQUNUSU9OX1RZUEVfQUREX1dYU19FVkVOVDpkcixBQ1RJT05fVFlQRV9SRU1PVkVfRVZFTlQ6cW4sQUNUSU9OX1RZUEVfU0VUX0FUVFJJQlVURTpyaSxBQ1RJT05fVFlQRV9SRU1PVkVfQVRUUklCVVRFOnJyLEFDVElPTl9UWVBFX1NFVF9URVhUOmVyLE9OX1JFQURZOkNuLE9OX1VOTE9BRDpfcixFdmVudENoYW5uZWw6SmksT05fUkVBQ0hfQk9UVE9NX0RJU1RBTkNFOmgscGFyc2VVcmw6bHIsb25DcmVhdGVWdWVBcHA6WmUsT05fVEFCX0lURU1fVEFQOm50LE9OX0xBVU5DSDpLLEFDVElPTl9UWVBFX0VWRU5UOl9vLGNyZWF0ZVVuaUV2ZW50OnhyLE9OX1dYU19JTlZPS0VfQ0FMTF9NRVRIT0Q6QW8sV0VCX0lOVk9LRV9BUFBTRVJWSUNFOlV0LGlzUm9vdEhvb2s6Tm8saXNSb290SW1tZWRpYXRlSG9vazp5cixVbmlJbnB1dEVsZW1lbnQ6ZGksVW5pVGV4dEFyZWFFbGVtZW50OmRhLFVuaUVsZW1lbnQ6Qm4sVW5pVGV4dE5vZGU6TWksVW5pQ29tbWVudE5vZGU6QmksZm9yY2VQYXRjaFByb3A6QW4sSlNPTl9QUk9UT0NPTDpQLHJlc29sdmVPd25lckVsOlJyLEFUVFJfVl9PV05FUl9JRDp6cixBVFRSX1ZfUkVOREVSSlM6THJ9O3JldHVybiBhb30oZik7cmV0dXJuIHN9dmFyIE5OPTE7ZnVuY3Rpb24gS3AoKXtyZXR1cm4oTk4rKykudG9TdHJpbmcoKX12YXIgcGY9Zj0+ZiYmSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShmKSl8fGY7ZnVuY3Rpb24gZ2MoZil7bGV0IHM9TWEoZik7cmV0dXJuIHMuc3Vic3RyaW5nKDgscy5sZW5ndGgtMSl9ZnVuY3Rpb24gdmYoZil7aWYoIUZuKGJ0b2EpKXJldHVybiIiO2xldCBzPUFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChuZXcgVWludDhBcnJheShmKSxwPT5TdHJpbmcuZnJvbUNoYXJDb2RlKHApKS5qb2luKCIiKTtyZXR1cm4gYnRvYShzKX1mdW5jdGlvbiBwYyhmKXtpZighZnx8dHlwZW9mIGYhPSJvYmplY3QiKXJldHVybiEwO2ZvcihsZXQgcyBpbiBmKWlmKGlsKGYscykpcmV0dXJuITE7cmV0dXJuITB9dmFyIG91PVsib2ZmIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImxvZyIsImRlYnVnIl0sYXU9e307ZnVuY3Rpb24gWnAoKXtvdS5mb3JFYWNoKGY9PntsZXQgcz1vdS5pbmRleE9mKGYpO2F1W2ZdPXt9LG91LmZvckVhY2gocD0+e291LmluZGV4T2YocCk8PXMmJihhdVtmXVtwXT0hMCl9KX0pfWZ1bmN0aW9uIG5yKGYpe2xldCBzPWdsb2JhbC5XWEVudmlyb25tZW50JiZnbG9iYWwuV1hFbnZpcm9ubWVudC5sb2dMZXZlbHx8ImxvZyI7cmV0dXJuIGF1W3NdJiZhdVtzXVtmXX1mdW5jdGlvbiBqaShmKXtnbG9iYWwubmF0aXZlTG9nKCJ3eEludGVyYWN0aW9uQW5hbHl6ZXI6IFtqc2ZtXSIrZiwiX19ERUJVRyIpfWZ1bmN0aW9uIFhwKGYscyxwKXtyZXR1cm5gJHtzfUAke3B9IyR7Zn1gfXZhciBzdT1jbGFzc3tjb25zdHJ1Y3RvcihzKXt0aGlzLmluc3RhbmNlSWQ9U3RyaW5nKHMpLHRoaXMubGFzdENhbGxiYWNrSWQ9MCx0aGlzLmNhbGxiYWNrcz17fSx0aGlzLmhvb2tzPXt9fWFkZChzKXtyZXR1cm4gdGhpcy5sYXN0Q2FsbGJhY2tJZCsrLHRoaXMuY2FsbGJhY2tzW3RoaXMubGFzdENhbGxiYWNrSWRdPXMsdGhpcy5sYXN0Q2FsbGJhY2tJZH1yZW1vdmUocyl7bGV0IHA9dGhpcy5jYWxsYmFja3Nbc107cmV0dXJuIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tzXSxwfXJlZ2lzdGVySG9vayhzLHAsdyxOKXtsZXQgeT1YcChzLHAsdyk7dGhpcy5ob29rc1t5XSYmY29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSBPdmVycmlkZSBhbiBleGlzdGluZyBjb21wb25lbnQgaG9vayAiJHt5fSIuYCksdGhpcy5ob29rc1t5XT1OfXRyaWdnZXJIb29rKHMscCx3LE4pe2xldCB5PVhwKHMscCx3KSxoPXRoaXMuaG9va3NbeV07aWYoIUZuKGgpKXJldHVybiBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGhvb2sgZnVuY3Rpb24gdHlwZSAoJHt0eXBlb2YgaH0pIG9uICIke3l9Ii5gKSxudWxsO2xldCBFPW51bGw7dHJ5e0U9aC5hcHBseShudWxsLE58fFtdKX1jYXRjaChSKXt0aHJvdyBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZXhlY3V0ZSB0aGUgaG9vayBmdW5jdGlvbiBvbiAiJHt5fSIuYCksUn1yZXR1cm4gRX1jb25zdW1lKHMscCx3KXtsZXQgTj10aGlzLmNhbGxiYWNrc1tzXTtpZigodHlwZW9mIHc9PSJ1bmRlZmluZWQifHx3PT09ITEpJiZkZWxldGUgdGhpcy5jYWxsYmFja3Nbc10sRm4oTikpdHJ5e3JldHVybiBOLmNhbGwobnVsbCxwLHcpfWNhdGNoKHkpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbjoKICR7eS50b1N0cmluZygpfWApLHl9cmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBjYWxsYmFjayBpZCAiJHtzfSJgKX1jbG9zZSgpe3RoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319fTt2YXIgbHU9e307ZnVuY3Rpb24gUXAoZixzKXtmJiYobHVbZl09cyl9ZnVuY3Rpb24gcnMoZil7cmV0dXJuIGx1W2ZdfWZ1bmN0aW9uIGV2KGYpe2RlbGV0ZSBsdVtmXX1mdW5jdGlvbiBVcihmKXtpZihmKXtsZXQgcz1sdVtmXTtpZihzJiZzLnRhc2tDZW50ZXIpcmV0dXJuIHMudGFza0NlbnRlcn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBrTihmKXtmLmNhbGNDbGFzc0xpc3QmJmYuY2FsY0NsYXNzTGlzdCgpfWZ1bmN0aW9uIG1mKGYscyxwKXtsZXR7ZG9jdW1lbnRFbGVtZW50Ond9PWY7aWYody5wdXJlQ2hpbGRyZW4ubGVuZ3RoPjB8fHMucGFyZW50Tm9kZSlyZXR1cm47bGV0IE49dy5jaGlsZHJlbix5PXA/Ti5pbmRleE9mKHApOi0xO3k8MD9OLnB1c2gocyk6Ti5zcGxpY2UoeSwwLHMpLHMubm9kZVR5cGU9PT0xPyhzLnJvbGU9PT0iYm9keSI/KHMuZG9jSWQ9Zi5pZCxzLm93bmVyRG9jdW1lbnQ9ZixzLnBhcmVudE5vZGU9dyxvbChzLHcpKToocy5jaGlsZHJlbi5mb3JFYWNoKGg9PntoLnBhcmVudE5vZGU9c30pLF9mKGYscyksb2wocyx3KSxkZWxldGUgZi5ub2RlTWFwW3Mubm9kZUlkXSksdy5wdXJlQ2hpbGRyZW4ucHVzaChzKSxSTihmLHMpKToocy5wYXJlbnROb2RlPXcsZi5ub2RlTWFwW3MucmVmXT1zKX1mdW5jdGlvbiBSTihmLHMpe2xldCBwPXMudG9KU09OKCk7ZiYmZi50YXNrQ2VudGVyJiZGbihmLnRhc2tDZW50ZXIuc2VuZCkmJmYudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUJvZHkifSxbcF0pfWZ1bmN0aW9uIF9mKGYscyl7cy5yb2xlPSJib2R5IixzLmRlcHRoPTEsZGVsZXRlIGYubm9kZU1hcFtzLm5vZGVJZF0scy5yZWY9Il9yb290IixmLm5vZGVNYXAuX3Jvb3Q9cyxmLmJvZHk9c31mdW5jdGlvbiBvbChmLHMpe2YucGFyZW50Tm9kZT1zLGtOKGYpLHMuZG9jSWQmJihmLmRvY0lkPXMuZG9jSWQsZi5vd25lckRvY3VtZW50PXMub3duZXJEb2N1bWVudCxmLm93bmVyRG9jdW1lbnQubm9kZU1hcFtmLm5vZGVJZF09ZixmLmRlcHRoPXMuZGVwdGgrMSksZi5jaGlsZHJlbi5mb3JFYWNoKHA9PntvbChwLGYpfSl9ZnVuY3Rpb24gYmYoZil7Zm9yKDtmOyl7aWYoZi5ub2RlVHlwZT09PTEpcmV0dXJuIGY7Zj1mLm5leHRTaWJsaW5nfX1mdW5jdGlvbiBFZihmKXtmb3IoO2Y7KXtpZihmLm5vZGVUeXBlPT09MSlyZXR1cm4gZjtmPWYucHJldmlvdXNTaWJsaW5nfX1mdW5jdGlvbiBhbChmLHMscCx3PSExKXtwPDAmJihwPTApO2xldCBOPXNbcC0xXSx5PXNbcF07cmV0dXJuIHMuc3BsaWNlKHAsMCxmKSx3JiYoTiYmKE4ubmV4dFNpYmxpbmc9ZiksZi5wcmV2aW91c1NpYmxpbmc9TixmLm5leHRTaWJsaW5nPXkseSYmKHkucHJldmlvdXNTaWJsaW5nPWYpKSxwfWZ1bmN0aW9uIHNsKGYscyxwLHc9ITEpe2xldCBOPXMuaW5kZXhPZihmKTtpZihOPDApcmV0dXJuLTE7aWYodyl7bGV0IFI9c1tOLTFdLERlPXNbTisxXTtSJiYoUi5uZXh0U2libGluZz1EZSksRGUmJihEZS5wcmV2aW91c1NpYmxpbmc9Uil9cy5zcGxpY2UoTiwxKTtsZXQgeT1wO048PXAmJih5PXAtMSk7bGV0IGg9c1t5LTFdLEU9c1t5XTtyZXR1cm4gcy5zcGxpY2UoeSwwLGYpLHcmJihoJiYoaC5uZXh0U2libGluZz1mKSxmLnByZXZpb3VzU2libGluZz1oLGYubmV4dFNpYmxpbmc9RSxFJiYoRS5wcmV2aW91c1NpYmxpbmc9ZikpLE49PT15Py0xOnB9ZnVuY3Rpb24geWYoZixzLHA9ITEpe2xldCB3PXMuaW5kZXhPZihmKTtpZighKHc8MCkpe2lmKHApe2xldCBOPXNbdy0xXSx5PXNbdysxXTtOJiYoTi5uZXh0U2libGluZz15KSx5JiYoeS5wcmV2aW91c1NpYmxpbmc9Til9cy5zcGxpY2UodywxKX19dmFyIGxsPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5kZXB0aD0wO3RoaXMubm9kZUlkPUtwKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLm5leHRTaWJsaW5nPW51bGwsdGhpcy5wcmV2aW91c1NpYmxpbmc9bnVsbH1kZXN0cm95KCl7bGV0IHM9cnModGhpcy5kb2NJZCk7cyYmKGRlbGV0ZSB0aGlzLmRvY0lkLGRlbGV0ZSBzLm5vZGVNYXBbdGhpcy5ub2RlSWRdKSx0aGlzLmNoaWxkcmVuLmZvckVhY2gocD0+e3AuZGVzdHJveSgpfSl9fTt2YXIgdHY9e307ZnVuY3Rpb24gU2YoZixzKXtpZigha2kocyl8fCFzLmxlbmd0aClyZXR1cm47Y2xhc3MgcCBleHRlbmRzIG5ve31zLmZvckVhY2godz0+e3AucHJvdG90eXBlW3ddPWZ1bmN0aW9uKC4uLk4pe2xldCB5PVVyKHRoaXMuZG9jSWQpO2lmKHkpcmV0dXJuIHkuc2VuZCgiY29tcG9uZW50Iix7cmVmOnRoaXMucmVmLGNvbXBvbmVudDpmLG1ldGhvZDp3fSxOKX19KSx0dltmXT1wfWZ1bmN0aW9uIG52KGYpe3JldHVybiB0dltmXX1mdW5jdGlvbiBrcihmLHMscCx3LE4pe2xldCB5PXt0eXBlOiJkZWNsIixwcm9wOmYsdmFsdWU6cy50b1N0cmluZygpLHJhd3M6dyxzb3VyY2U6Tn07cmV0dXJuIHAmJih5LmltcG9ydGFudD0hMCkseX12YXIgeE49ImJhY2tncm91bmRDb2xvciIsQk49ImJhY2tncm91bmRJbWFnZSIsTU49Zj0+e2xldHt2YWx1ZTpzLGltcG9ydGFudDpwLHJhd3M6dyxzb3VyY2U6Tn09ZjtyZXR1cm4vXiM/XFMrJC8udGVzdChzKXx8L15yZ2JhPyguKykkLy50ZXN0KHMpP1trcih4TixzLHAsdyxOKV06L15saW5lYXItZ3JhZGllbnQoLispJC8udGVzdChzKT9ba3IoQk4scyxwLHcsTildOltmXX0sTE49IldpZHRoIixETj0iU3R5bGUiLEZOPSJDb2xvciI7ZnVuY3Rpb24gVk4oZil7cmV0dXJuIHM9PntsZXR7cHJvcDpwLHZhbHVlOncsaW1wb3J0YW50Ok4scmF3czp5LHNvdXJjZTpofT1zLEU9dy5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyksUj1bL15bXGRcLl0rXFMqfF4odGhpbnxtZWRpdW18dGhpY2spJC8sL14oc29saWR8ZGFzaGVkfGRvdHRlZHxub25lKSQvLC9cUysvXS5tYXAoRGU9PntsZXQgTnQ9RS5maW5kSW5kZXgoVXQ9PkRlLnRlc3QoVXQpKTtyZXR1cm4gTnQ8MD9udWxsOkUuc3BsaWNlKE50LDEpWzBdfSk7cmV0dXJuIEUubGVuZ3RoP1tzXTpba3IocCtMTiwoUlswXXx8KGYudHlwZT09PSJ1dnVlIj8ibWVkaXVtIjoiMCIpKS50cmltKCksTix5LGgpLGtyKHArRE4sKFJbMV18fChmLnR5cGU9PT0idXZ1ZSI/Im5vbmUiOiJzb2xpZCIpKS50cmltKCksTix5LGgpLGtyKHArRk4sKFJbMl18fCIjMDAwMDAwIikudHJpbSgpLE4seSxoKV19fXZhciBVTj0iYm9yZGVyVG9wIiwkTj0iYm9yZGVyUmlnaHQiLEhOPSJib3JkZXJCb3R0b20iLGpOPSJib3JkZXJMZWZ0Iix3Zj1mPT57bGV0e3Byb3A6cyx2YWx1ZTpwLGltcG9ydGFudDp3LHJhd3M6Tixzb3VyY2U6eX09ZixoPWZmKHMpLnNwbGl0KCItIilbMV07aD1pdShoKTtsZXQgRT1wLnJlcGxhY2UoL1xzKixccyovZywiLCIpLnNwbGl0KC9ccysvKTtzd2l0Y2goRS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm5bZl07Y2FzZSAyOkUucHVzaChFWzBdLEVbMV0pO2JyZWFrO2Nhc2UgMzpFLnB1c2goRVsxXSk7YnJlYWt9cmV0dXJuW2tyKFVOK2gsRVswXSx3LE4seSksa3IoJE4raCxFWzFdLHcsTix5KSxrcihITitoLEVbMl0sdyxOLHkpLGtyKGpOK2gsRVszXSx3LE4seSldfSx6Tj0iYm9yZGVyVG9wTGVmdFJhZGl1cyIsV049ImJvcmRlclRvcFJpZ2h0UmFkaXVzIixHTj0iYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLFlOPSJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIixxTj1mPT57bGV0e3ZhbHVlOnMsaW1wb3J0YW50OnAscmF3czp3LHNvdXJjZTpOfT1mLHk9cy5zcGxpdCgvXHMrLyk7aWYocy5pbmNsdWRlcygiLyIpKXJldHVybltmXTtzd2l0Y2goeS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm5bZl07Y2FzZSAyOnkucHVzaCh5WzBdLHlbMV0pO2JyZWFrO2Nhc2UgMzp5LnB1c2goeVsxXSk7YnJlYWt9cmV0dXJuW2tyKHpOLHlbMF0scCx3LE4pLGtyKFdOLHlbMV0scCx3LE4pLGtyKEdOLHlbMl0scCx3LE4pLGtyKFlOLHlbM10scCx3LE4pXX0sSk49d2YsS049d2YsWk49ImZsZXhEaXJlY3Rpb24iLFhOPSJmbGV4V3JhcCIsUU49Zj0+e2xldHt2YWx1ZTpzLGltcG9ydGFudDpwLHJhd3M6dyxzb3VyY2U6Tn09Zix5PXMuc3BsaXQoL1xzKy8pLGg9Wy9eKGNvbHVtbnxjb2x1bW4tcmV2ZXJzZXxyb3d8cm93LXJldmVyc2UpJC8sL14obm93cmFwfHdyYXB8d3JhcC1yZXZlcnNlKSQvXS5tYXAoRT0+e2xldCBSPXkuZmluZEluZGV4KERlPT5FLnRlc3QoRGUpKTtyZXR1cm4gUjwwP251bGw6eS5zcGxpY2UoUiwxKVswXX0pO3JldHVybiB5Lmxlbmd0aD9bZl06W2tyKFpOLGhbMF18fCJjb2x1bW4iLHAsdyxOKSxrcihYTixoWzFdfHwibm93cmFwIixwLHcsTildfSxlaz0iVG9wIix0az0iUmlnaHQiLG5rPSJCb3R0b20iLHJrPSJMZWZ0Iixydj1mPT5zPT57bGV0e3ZhbHVlOnAsaW1wb3J0YW50OncscmF3czpOLHNvdXJjZTp5fT1zLGg9cC5zcGxpdCgvXHMrLyk7c3dpdGNoKGgubGVuZ3RoKXtjYXNlIDE6aC5wdXNoKGhbMF0saFswXSxoWzBdKTticmVhaztjYXNlIDI6aC5wdXNoKGhbMF0saFsxXSk7YnJlYWs7Y2FzZSAzOmgucHVzaChoWzFdKTticmVha31yZXR1cm5ba3IoZitlayxoWzBdLHcsTix5KSxrcihmK3RrLGhbMV0sdyxOLHkpLGtyKGYrbmssaFsyXSx3LE4seSksa3IoZityayxoWzNdLHcsTix5KV19LGlrPXJ2KCJtYXJnaW4iKSxvaz1ydigicGFkZGluZyIpLGFrPSJ0cmFuc2l0aW9uUHJvcGVydHkiLHNrPSJ0cmFuc2l0aW9uRHVyYXRpb24iLGxrPSJ0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24iLGNrPSJ0cmFuc2l0aW9uRGVsYXkiLHVrPWY9PntsZXQgcz0vXihcUyopP1xzKihcZCpcLj9cZCsoPzptc3xzKT8pP1xzKihcUyopP1xzKihcZCpcLj9cZCsoPzptc3xzKT8pPyQvLHt2YWx1ZTpwLGltcG9ydGFudDp3LHJhd3M6Tixzb3VyY2U6eX09ZixoPVtdLEU9cC5tYXRjaChzKTtyZXR1cm4gRSYmKEVbMV0mJmgucHVzaChrcihhayxFWzFdLHcsTix5KSksRVsyXSYmaC5wdXNoKGtyKHNrLEVbMl0sdyxOLHkpKSxFWzNdJiZoLnB1c2goa3IobGssRVszXSx3LE4seSkpLEVbNF0mJmgucHVzaChrcihjayxFWzRdLHcsTix5KSkpLGh9O2Z1bmN0aW9uIGZrKGYpe2xldCBzPVZOKGYpLHA9TXAoe3RyYW5zaXRpb246dWssYm9yZGVyOnMsYmFja2dyb3VuZDpNTixib3JkZXJUb3A6cyxib3JkZXJSaWdodDpzLGJvcmRlckJvdHRvbTpzLGJvcmRlckxlZnQ6cyxib3JkZXJTdHlsZTpKTixib3JkZXJXaWR0aDpLTixib3JkZXJDb2xvcjp3Zixib3JkZXJSYWRpdXM6cU4sbWFyZ2luOmlrLHBhZGRpbmc6b2t9LGYudHlwZSE9PSJ1dnVlIj97ZmxleEZsb3c6UU59Ont9KSx3PXt9O3JldHVybiB3PXAsd312YXIgQ2YsaXY9U3ltYm9sKCJleHBhbmRlZCIpO2Z1bmN0aW9uIG92KGYpe3JldHVybntwb3N0Y3NzUGx1Z2luOiJudnVlOmV4cGFuZCIsRGVjbGFyYXRpb24ocCl7aWYocFtpdl0pcmV0dXJuO0NmfHwoQ2Y9ZmsoZikpO2xldCB3PUNmW3AucHJvcF07aWYodyl7bGV0IE49dyhwKTtOLmxlbmd0aD09PTEmJk5bMF09PT1wfHxwLnJlcGxhY2VXaXRoKE4pfXBbaXZdPSEwfX19dmFyIGRrPW92KHt0eXBlOiJudnVlIn0pLkRlY2xhcmF0aW9uO2Z1bmN0aW9uIEFmKGYscyl7bGV0IHA9SGkoe3JlcGxhY2VXaXRoKE4pe3c9Tn19LGhrKGYscykpLHc9W3BdO3JldHVybiBkayhwKSx3fWZ1bmN0aW9uIGhrKGYscyl7bGV0IHA9cysiIjtyZXR1cm4gcC5pbmNsdWRlcygiIWltcG9ydGFudCIpP3twcm9wOmYsdmFsdWU6cC5yZXBsYWNlKC9ccyohaW1wb3J0YW50LywiIiksaW1wb3J0YW50OiEwfTp7cHJvcDpmLHZhbHVlOnAsaW1wb3J0YW50OiExfX12YXIgZ2s9InZpZXciLHBrPVsiY2xpY2siLCJsb25ncHJlc3MiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJwYW5zdGFydCIsInBhbm1vdmUiLCJwYW5lbmQiLCJob3Jpem9udGFscGFuIiwidmVydGljYWxwYW4iLCJzd2lwZSJdO2Z1bmN0aW9uIE9mKGYscyl7bGV0IHA9cnMoZik7cC5ub2RlTWFwW3Mubm9kZUlkXT1zfXZhciBUZjtmdW5jdGlvbiBhdihmKXtUZnx8KFRmPWYpfXZhciBubz1jbGFzcyBleHRlbmRzIGxse2NvbnN0cnVjdG9yKHM9Z2sscD17fSx3KXtzdXBlcigpO2xldCBOPW52KHMpO2lmKE4mJiF3KXJldHVybiBuZXcgTihzLHAsITApO3RoaXMubm9kZVR5cGU9MSx0aGlzLnR5cGU9cyx0aGlzLmF0dHI9cC5hdHRyfHx7fSx0aGlzLnN0eWxlPXAuc3R5bGV8fHt9LHRoaXMuY2xhc3NTdHlsZT1wLmNsYXNzU3R5bGV8fHt9LHRoaXMuY2xhc3NMaXN0PXAuY2xhc3NMaXN0fHxbXSx0aGlzLnN0eWxlU2hlZXQ9cC5zdHlsZVNoZWV0fHx7fSx0aGlzLmV2ZW50PXt9fWFwcGVuZENoaWxkKHMpe2lmKCEocy5wYXJlbnROb2RlJiZzLnBhcmVudE5vZGUhPT10aGlzKSl7aWYocy5wYXJlbnROb2RlKXtpZihucigiZGVidWciKSYmamkoYFthcHBlbmRDaGlsZF0oJHt0aGlzLmRvY0lkfSwke3MudHlwZX0sJHtzLnJlZn0pIE1vdmUgPCR7cy50eXBlfT4gdG8gJHt0aGlzLmNoaWxkcmVuLmxlbmd0aH0gb2YgPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSxzbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLHMubm9kZVR5cGU9PT0xKXtsZXQgcD1zbChzLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksdz1Vcih0aGlzLmRvY0lkKTtpZih3JiZwPj0wKXJldHVybiB3LnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbcy5yZWYsdGhpcy5yZWYscF0pfX1lbHNlIGlmKG5yKCJkZWJ1ZyIpJiZqaShgW2FwcGVuZENoaWxkXSgke3RoaXMuZG9jSWR9LCR7cy50eXBlfSwke3MucmVmfSkgQXBwZW5kIDwke3MudHlwZX0+IHRvIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksb2wocyx0aGlzKSxhbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLHRoaXMuZG9jSWQmJk9mKHRoaXMuZG9jSWQscykscy5ub2RlVHlwZT09PTEpe2FsKHMsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKTtsZXQgcD1Vcih0aGlzLmRvY0lkKTtpZihwKXJldHVybiBwLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixzLnRvSlNPTigpLC0xXSl9fX1pbnNlcnRCZWZvcmUocyxwKXtpZighKHMucGFyZW50Tm9kZSYmcy5wYXJlbnROb2RlIT09dGhpcykmJiEocz09PXB8fHMubmV4dFNpYmxpbmcmJnMubmV4dFNpYmxpbmc9PT1wKSl7aWYocy5wYXJlbnROb2RlKXtpZihzbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHApLCEwKSxzLm5vZGVUeXBlPT09MSl7bGV0IHc9YmYocCksTj1zbChzLHRoaXMucHVyZUNoaWxkcmVuLHc/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZih3KTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpLHk9VXIodGhpcy5kb2NJZCk7aWYoeSYmTj49MClyZXR1cm4geS5zZW5kKCJkb20iLHthY3Rpb246Im1vdmVFbGVtZW50In0sW3MucmVmLHRoaXMucmVmLE5dKX19ZWxzZSBpZihucigiZGVidWciKSYmamkoYFtpbnNlcnRCZWZvcmVdKCR7dGhpcy5kb2NJZH0sJHtzLnR5cGV9LCR7cy5yZWZ9KSBJbnNlcnQgPCR7cy50eXBlfT4gdG8gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KSwgYmVmb3JlICgke3AucmVmfSkuYCksb2wocyx0aGlzKSxhbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHApLCEwKSx0aGlzLmRvY0lkJiZPZih0aGlzLmRvY0lkLHMpLHMubm9kZVR5cGU9PT0xKXtsZXQgdz1iZihwKSxOPWFsKHMsdGhpcy5wdXJlQ2hpbGRyZW4sdz90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKHcpOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCkseT1Vcih0aGlzLmRvY0lkKTtpZih5KXJldHVybiB5LnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixzLnRvSlNPTigpLE5dKX19fWluc2VydEFmdGVyKHMscCl7aWYoIShzLnBhcmVudE5vZGUmJnMucGFyZW50Tm9kZSE9PXRoaXMpJiYhKHM9PT1wfHxzLnByZXZpb3VzU2libGluZyYmcy5wcmV2aW91c1NpYmxpbmc9PT1wKSl7aWYocy5wYXJlbnROb2RlKXtpZihzbChzLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHApKzEsITApLHMubm9kZVR5cGU9PT0xKXtsZXQgdz1zbChzLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoRWYocCkpKzEpLE49VXIodGhpcy5kb2NJZCk7aWYoTiYmdz49MClyZXR1cm4gTi5zZW5kKCJkb20iLHthY3Rpb246Im1vdmVFbGVtZW50In0sW3MucmVmLHRoaXMucmVmLHddKX19ZWxzZSBpZihucigiZGVidWciKSYmamkoYFtpbnNlcnRBZnRlcl0oJHt0aGlzLmRvY0lkfSwke3MudHlwZX0sJHtzLnJlZn0pIEluc2VydCA8JHtzLnR5cGV9PiB0byA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLCBhZnRlciAoJHtwLnJlZn0pLmApLG9sKHMsdGhpcyksYWwocyx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZihwKSsxLCEwKSx0aGlzLmRvY0lkJiZPZih0aGlzLmRvY0lkLHMpLHMubm9kZVR5cGU9PT0xKXtsZXQgdz1hbChzLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoRWYocCkpKzEpLE49VXIodGhpcy5kb2NJZCk7aWYoTilyZXR1cm4gTi5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYscy50b0pTT04oKSx3XSl9fX1yZW1vdmVDaGlsZChzLHApe2lmKHMucGFyZW50Tm9kZSYmKHlmKHMsdGhpcy5jaGlsZHJlbiwhMCkscy5ub2RlVHlwZT09PTEpKXtucigiZGVidWciKSYmamkoYFtyZW1vdmVDaGlsZF0oJHt0aGlzLmRvY0lkfSwke3MudHlwZX0sJHtzLnJlZn0pIFJlbW92ZSA8JHtzLnR5cGV9PiBmcm9tIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCkseWYocyx0aGlzLnB1cmVDaGlsZHJlbik7bGV0IHc9VXIodGhpcy5kb2NJZCk7dyYmdy5zZW5kKCJkb20iLHthY3Rpb246InJlbW92ZUVsZW1lbnQifSxbcy5yZWZdKX1wfHxzLmRlc3Ryb3koKX1jbGVhcigpe2xldCBzPVVyKHRoaXMuZG9jSWQpO3MmJnRoaXMucHVyZUNoaWxkcmVuLmZvckVhY2gocD0+e3Muc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFbGVtZW50In0sW3AucmVmXSl9KSx0aGlzLmNoaWxkcmVuLmZvckVhY2gocD0+e3AuZGVzdHJveSgpfSksdGhpcy5jaGlsZHJlbi5sZW5ndGg9MCx0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGg9MH1zZXRBdHRyKHMscCx3KXtpZih0aGlzLmF0dHJbc109PT1wJiZ3IT09ITEpcmV0dXJuO3RoaXMuYXR0cltzXT1wO2xldCBOPVVyKHRoaXMuZG9jSWQpOyF3JiZOJiZOLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlQXR0cnMifSxbdGhpcy5yZWYse1tzXTpwfV0pfXNldEF0dHJzKHMscCl7aWYocGMocykpcmV0dXJuO2xldCB3PXt9O2ZvcihsZXQgTiBpbiBzKXRoaXMuYXR0cltOXSE9PXNbTl0mJih0aGlzLmF0dHJbTl09c1tOXSx3W05dPXNbTl0pO2lmKCFwYyh3KSl7bGV0IE49VXIodGhpcy5kb2NJZCk7IXAmJk4mJk4uc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZix3XSl9fXNldFN0eWxlKHMscCx3KXtBZihzLHApLmZvckVhY2goKHtwcm9wOk4sdmFsdWU6eX0pPT57aWYodGhpcy5zdHlsZVtOXT09PXkmJnchPT0hMSlyZXR1cm47dGhpcy5zdHlsZVtOXT15O2xldCBoPVVyKHRoaXMuZG9jSWQpOyF3JiZoJiZoLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbdGhpcy5yZWYse1tOXTp5PT09IiImJk4gaW4gdGhpcy5jbGFzc1N0eWxlP3RoaXMuY2xhc3NTdHlsZVtOXTp5fV0pfSl9c2V0U3R5bGVzKHMscCl7aWYocGMocykpcmV0dXJuO2xldCB3PXt9O2ZvcihsZXQgTiBpbiBzKUFmKE4sc1tOXSkuZm9yRWFjaCgoe3Byb3A6eSx2YWx1ZTpofSk9Pnt0aGlzLnN0eWxlW3ldIT09aCYmKHRoaXMuc3R5bGVbeV09aCx3W3ldPWg9PT0iIiYmeSBpbiB0aGlzLmNsYXNzU3R5bGU/dGhpcy5jbGFzc1N0eWxlW3ldOmgpfSk7aWYoIXBjKHcpKXtsZXQgTj1Vcih0aGlzLmRvY0lkKTshcCYmTiYmTi5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLHddKX19c2V0Q2xhc3NTdHlsZShzKXtmb3IobGV0IHcgaW4gdGhpcy5jbGFzc1N0eWxlKXRoaXMuY2xhc3NTdHlsZVt3XT0iIjtIaSh0aGlzLmNsYXNzU3R5bGUscyk7bGV0IHA9VXIodGhpcy5kb2NJZCk7cCYmcC5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLHRoaXMudG9TdHlsZSgpXSl9c2V0Q2xhc3NMaXN0KHMpe3MubGVuZ3RoPT09dGhpcy5jbGFzc0xpc3QubGVuZ3RoJiZzLmZpbHRlcihwPT4hdGhpcy5jbGFzc0xpc3QuaW5jbHVkZXMocCkpLmxlbmd0aD09PTB8fCh0aGlzLmNsYXNzTGlzdD1zLHRoaXMucGFyZW50Tm9kZSYmdGhpcy5jYWxjQ2xhc3NMaXN0KCkpfWNhbGNDbGFzc0xpc3QoKXt0aGlzLnNldENsYXNzU3R5bGUoVGYodGhpcykpfXNldFN0eWxlU2hlZXQocyl7dGhpcy5zdHlsZVNoZWV0PXN9YWRkRXZlbnQocyxwLHcpe2lmKHRoaXMuZXZlbnR8fCh0aGlzLmV2ZW50PXt9KSwhdGhpcy5ldmVudFtzXSl7bnIoImRlYnVnIikmJmppKGBbYWRkRXZlbnRdKCR7dGhpcy5kb2NJZH0sJHt0aGlzLnR5cGV9LCR7dGhpcy5yZWZ9KSBBZGQgIiR7c30iIGV2ZW50IG9uIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksdGhpcy5ldmVudFtzXT17aGFuZGxlcjpwLHBhcmFtczp3fTtsZXQgTj1Vcih0aGlzLmRvY0lkKTtOJiZOLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRXZlbnQifSxbdGhpcy5yZWYsc10pfX1yZW1vdmVFdmVudChzKXtpZih0aGlzLmV2ZW50JiZ0aGlzLmV2ZW50W3NdKXtucigiZGVidWciKSYmamkoYFtyZW1vdmVFdmVudF0oJHt0aGlzLmRvY0lkfSwke3RoaXMudHlwZX0sJHt0aGlzLnJlZn0pIFJlbW92ZSAiJHtzfSIgZXZlbnQgb24gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSxkZWxldGUgdGhpcy5ldmVudFtzXTtsZXQgcD1Vcih0aGlzLmRvY0lkKTtwJiZwLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRXZlbnQifSxbdGhpcy5yZWYsc10pfX1maXJlRXZlbnQocyxwLHcsTil7bGV0IHk9bnVsbCxoPSExLEU9dGhpcy5ldmVudFtzXTtpZihFJiZwKXtucigiZGVidWciKSYmamkoYFtmaXJlRXZlbnRdKCR7dGhpcy5kb2NJZH0sJHt0aGlzLnR5cGV9LCR7dGhpcy5yZWZ9KSBGaXJlICIke3N9IiBldmVudCBvbiA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApO2xldCBSPUUuaGFuZGxlcjtwLnN0b3BQcm9wYWdhdGlvbj0oKT0+e2g9ITB9LHAucHJldmVudERlZmF1bHQ9KCk9Pnt9O3RyeXtOJiZOLnBhcmFtcz95PVIuY2FsbCh0aGlzLC4uLk4ucGFyYW1zLHApOnk9Ui5jYWxsKHRoaXMscCl9Y2F0Y2goRGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBpbnZva2UgdGhlIGV2ZW50IGhhbmRsZXIgb2YgIiR7c30iIG9uICR7dGhpcy50eXBlfSAoJHt0aGlzLnJlZn0pOgogJHtEZS50b1N0cmluZygpfWApLERlfX1yZXR1cm4haCYmdyYmcGsuaW5kZXhPZihzKSE9PS0xJiZ0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQmJihwLmN1cnJlbnRUYXJnZXQ9dGhpcy5wYXJlbnROb2RlLHRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQocyxwLHcpKSx5fXRvU3R5bGUoKXtsZXQgcz1PYmplY3QuYXNzaWduKHt9LHRoaXMuY2xhc3NTdHlsZSkscD10aGlzLnN0eWxlO2ZvcihsZXQgdyBpbiBwKXtsZXQgTj1wW3ddO3Nbd109Tj09PSIiJiZ3IGluIHRoaXMuY2xhc3NTdHlsZT90aGlzLmNsYXNzU3R5bGVbd106Tn1yZXR1cm4gc310b0pTT04ocz0hMSl7bGV0IHA9e3JlZjp0aGlzLnJlZi50b1N0cmluZygpLHR5cGU6dGhpcy50eXBlLGF0dHI6dGhpcy5hdHRyLHN0eWxlOnRoaXMudG9TdHlsZSgpfSx3PVtdO2ZvcihsZXQgTiBpbiB0aGlzLmV2ZW50KXtsZXR7cGFyYW1zOnl9PXRoaXMuZXZlbnRbTl07eT93LnB1c2goe3R5cGU6TixwYXJhbXM6eX0pOncucHVzaChOKX1yZXR1cm4gdy5sZW5ndGgmJihwLmV2ZW50PXcpLCFzJiZ0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgmJihwLmNoaWxkcmVuPXRoaXMucHVyZUNoaWxkcmVuLm1hcChOPT5OLnRvSlNPTigpKSkscH10b1N0cmluZygpe3JldHVybiI8Iit0aGlzLnR5cGUrIiBhdHRyPSIrSlNPTi5zdHJpbmdpZnkodGhpcy5hdHRyKSsiIHN0eWxlPSIrSlNPTi5zdHJpbmdpZnkodGhpcy50b1N0eWxlKCkpKyI+Iit0aGlzLnB1cmVDaGlsZHJlbi5tYXAocz0+cy50b1N0cmluZygpKS5qb2luKCIiKSsiPC8iK3RoaXMudHlwZSsiPiJ9fTtmdW5jdGlvbiBzdihmKXtsZXQgcz1mJiZmLl9fdl9yYXc7cmV0dXJuIHM/c3Yocyk6Zn1mdW5jdGlvbiBsdihmKXtsZXQgcz1nYyhmKTtzd2l0Y2gocyl7Y2FzZSJVbmRlZmluZWQiOmNhc2UiTnVsbCI6cmV0dXJuIiI7Y2FzZSJSZWdFeHAiOnJldHVybiBmLnRvU3RyaW5nKCk7Y2FzZSJEYXRlIjpyZXR1cm4gZi50b0lTT1N0cmluZygpO2Nhc2UiTnVtYmVyIjpjYXNlIlN0cmluZyI6Y2FzZSJCb29sZWFuIjpjYXNlIkFycmF5IjpjYXNlIk9iamVjdCI6cmV0dXJuIHN2KGYpO2Nhc2UiQXJyYXlCdWZmZXIiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOnMsYmFzZTY0OnZmKGYpfTtjYXNlIkludDhBcnJheSI6Y2FzZSJVaW50OEFycmF5IjpjYXNlIlVpbnQ4Q2xhbXBlZEFycmF5IjpjYXNlIkludDE2QXJyYXkiOmNhc2UiVWludDE2QXJyYXkiOmNhc2UiSW50MzJBcnJheSI6Y2FzZSJVaW50MzJBcnJheSI6Y2FzZSJGbG9hdDMyQXJyYXkiOmNhc2UiRmxvYXQ2NEFycmF5IjpyZXR1cm57IkB0eXBlIjoiYmluYXJ5IixkYXRhVHlwZTpzLGJhc2U2NDp2ZihmLmJ1ZmZlcil9O2RlZmF1bHQ6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGYpfX12YXIgY3U9ZnVuY3Rpb24oKXt9LFZsPWNsYXNze2NvbnN0cnVjdG9yKHMscCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImluc3RhbmNlSWQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOlN0cmluZyhzKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjYWxsYmFja01hbmFnZXIiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOm5ldyBzdShzKX0pLGN1PXB8fGZ1bmN0aW9uKCl7fX1jYWxsYmFjayhzLHAsdyl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNvbnN1bWUocyxwLHcpfXJlZ2lzdGVySG9vayhzLHAsdyxOKXtyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIucmVnaXN0ZXJIb29rKHMscCx3LE4pfXRyaWdnZXJIb29rKHMscCx3LE4pe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci50cmlnZ2VySG9vayhzLHAsdyxOKX11cGRhdGVEYXRhKHMscCx3KXt0aGlzLnNlbmQoIm1vZHVsZSIse21vZHVsZToiZG9tIixtZXRob2Q6InVwZGF0ZUNvbXBvbmVudERhdGEifSxbcyxwLHddKX1kZXN0cm95Q2FsbGJhY2soKXtyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuY2xvc2UoKX1ub3JtYWxpemUocyxwPSExKXtsZXQgdz1nYyhzKTtpZihzJiZzIGluc3RhbmNlb2Ygbm8pcmV0dXJuIHMucmVmO2lmKHMmJnMuJGVsIGluc3RhbmNlb2Ygbm8pcmV0dXJuIHMuJGVsLnJlZjtpZih3PT09IkZ1bmN0aW9uIilyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuYWRkKHMpLnRvU3RyaW5nKCk7aWYocCl7aWYodz09PSJPYmplY3QiKXtsZXQgTj17fTtmb3IobGV0IHkgaW4gcylOW3ldPXRoaXMubm9ybWFsaXplKHNbeV0sITApO3JldHVybiBOfWlmKHc9PT0iQXJyYXkiKXJldHVybiBzLm1hcChOPT50aGlzLm5vcm1hbGl6ZShOLCEwKSl9cmV0dXJuIHMmJnMucmVmJiZzWyJbW1ZpcnR1YWxFbGVtZW50XV0iXT9zLnJlZjpsdihzKX1zZW5kKHMscCx3LE4pe2xldHthY3Rpb246eSxjb21wb25lbnQ6aCxyZWY6RSxtb2R1bGU6UixtZXRob2Q6RGV9PXA7c3dpdGNoKHc9dy5tYXAoTnQ9PnRoaXMubm9ybWFsaXplKE50LHMhPT0ibW9kdWxlIikpLGdjKE4pPT09Ik9iamVjdCImJihOPXRoaXMubm9ybWFsaXplKE4sITApKSxzKXtjYXNlImRvbSI6cmV0dXJuIG5yKCJkZWJ1ZyIpJiZqaShgW3Rhc2tdKCR7dGhpcy5pbnN0YW5jZUlkfSwke3N9LCR7eX0pICR7SlNPTi5zdHJpbmdpZnkodyl9YCksdGhpc1t5XSh0aGlzLmluc3RhbmNlSWQsdyk7Y2FzZSJjb21wb25lbnQiOnJldHVybiB0aGlzLmNvbXBvbmVudEhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLEUsRGUsdyxIaSh7Y29tcG9uZW50Omh9LE4pKTtkZWZhdWx0OnJldHVybiBucigiZGVidWciKSYmamkoYFt0YXNrXSgke3RoaXMuaW5zdGFuY2VJZH0sJHtSfSwke0RlfSkgJHtKU09OLnN0cmluZ2lmeSh3KX1gKSx0aGlzLm1vZHVsZUhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLFIsRGUsdyxOKX19Y2FsbERPTShzLHApe3JldHVybiB0aGlzW3NdKHRoaXMuaW5zdGFuY2VJZCxwKX1jYWxsQ29tcG9uZW50KHMscCx3LE4pe3JldHVybiB0aGlzLmNvbXBvbmVudEhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLHMscCx3LE4pfWNhbGxNb2R1bGUocyxwLHcsTil7cmV0dXJuIHRoaXMubW9kdWxlSGFuZGxlcih0aGlzLmluc3RhbmNlSWQscyxwLHcsTil9fTtmdW5jdGlvbiBjdigpe2xldCBmPXtjcmVhdGVGaW5pc2g6Z2xvYmFsLmNhbGxDcmVhdGVGaW5pc2gsdXBkYXRlRmluaXNoOmdsb2JhbC5jYWxsVXBkYXRlRmluaXNoLHJlZnJlc2hGaW5pc2g6Z2xvYmFsLmNhbGxSZWZyZXNoRmluaXNoLGNyZWF0ZUJvZHk6Z2xvYmFsLmNhbGxDcmVhdGVCb2R5LGFkZEVsZW1lbnQ6Z2xvYmFsLmNhbGxBZGRFbGVtZW50LHJlbW92ZUVsZW1lbnQ6Z2xvYmFsLmNhbGxSZW1vdmVFbGVtZW50LG1vdmVFbGVtZW50Omdsb2JhbC5jYWxsTW92ZUVsZW1lbnQsdXBkYXRlQXR0cnM6Z2xvYmFsLmNhbGxVcGRhdGVBdHRycyx1cGRhdGVTdHlsZTpnbG9iYWwuY2FsbFVwZGF0ZVN0eWxlLGFkZEV2ZW50Omdsb2JhbC5jYWxsQWRkRXZlbnQscmVtb3ZlRXZlbnQ6Z2xvYmFsLmNhbGxSZW1vdmVFdmVudCxfX3VwZGF0ZUNvbXBvbmVudERhdGE6Z2xvYmFsLl9fdXBkYXRlQ29tcG9uZW50RGF0YX0scz1WbC5wcm90b3R5cGU7Zm9yKGxldCBwIGluIGYpe2xldCB3PWZbcF07c1twXT13PyhOLHkpPT53KE4sLi4ueSk6KE4seSk9PmN1KE4sW3ttb2R1bGU6ImRvbSIsbWV0aG9kOnAsYXJnczp5fV0sIi0xIil9cy5jb21wb25lbnRIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlQ29tcG9uZW50fHwoKHAsdyxOLHksaCk9PmN1KHAsW3tjb21wb25lbnQ6aC5jb21wb25lbnQscmVmOncsbWV0aG9kOk4sYXJnczp5fV0pKSxzLm1vZHVsZUhhbmRsZXI9Z2xvYmFsLmNhbGxOYXRpdmVNb2R1bGV8fCgocCx3LE4seSk9PmN1KHAsW3ttb2R1bGU6dyxtZXRob2Q6TixhcmdzOnl9XSkpfWZ1bmN0aW9uIHZrKGYscyxwLHcsTix5KXtsZXQgaD1mLmdldFJlZihzKTtpZihoKXJldHVybiBmLmZpcmVFdmVudChoLHAsdyxOLHkpO2lmKHcpcmV0dXJuIHcuX25vZGVJZD1zLGYuZmlyZUV2ZW50KGYuZ2V0UmVmKCJfZG9jdW1lbnRFbGVtZW50IikscCx3LE4seSl9ZnVuY3Rpb24gbWsoZixzLHAsdyl7cmV0dXJuIGYudGFza0NlbnRlci5jYWxsYmFjayhzLHAsdyl9ZnVuY3Rpb24gX2soZixzLHAsdyxOKXtpZighZnx8IWYudGFza0NlbnRlcilyZXR1cm4gY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gQ2FuJ3QgZmluZCAiZG9jdW1lbnQiIG9yICJ0YXNrQ2VudGVyIi5gKSxudWxsO2xldCB5PW51bGw7dHJ5e3k9Zi50YXNrQ2VudGVyLnRyaWdnZXJIb29rKHMscCx3LE4pfWNhdGNoKGgpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byB0cmlnZ2VyIHRoZSAiJHtwfUAke3d9IiBob29rIG9uICR7c30uYCksaH1yZXR1cm4geX1mdW5jdGlvbiBQZihmLHMpe2xldCBwPXJzKGYpO2lmKCFwKXJldHVybiBuZXcgRXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byByZWNlaXZlVGFza3MsIGluc3RhbmNlICgke2Z9KSBpcyBub3QgYXZhaWxhYmxlLmApO2lmKGtpKHMpKXJldHVybiBzLm1hcCh3PT57c3dpdGNoKHcubWV0aG9kKXtjYXNlImNhbGxiYWNrIjpyZXR1cm4gbWsocCwuLi53LmFyZ3MpO2Nhc2UiZmlyZUV2ZW50U3luYyI6Y2FzZSJmaXJlRXZlbnQiOnJldHVybiB2ayhwLC4uLncuYXJncyk7Y2FzZSJjb21wb25lbnRIb29rIjpyZXR1cm4gX2socCwuLi53LmFyZ3MpfX0pfXZhciBOcz17fTtmdW5jdGlvbiB1dihmPXt9KXtmb3IobGV0IHMgaW4gZilpbChOcyxzKXx8KE5zW3NdPXt9KSwhIWtpKGZbc10pJiZmW3NdLmZvckVhY2gocD0+e2JpKHApP05zW3NdW3BdPSEwOkZsKHApJiZiaShwLm5hbWUpJiYoTnNbc11bcC5uYW1lXT1wLmFyZ3N8fFtdKX0pfWZ1bmN0aW9uIHV1KGYscyl7cmV0dXJuIGJpKHMpPyEhKE5zW2ZdJiZOc1tmXVtzXSk6ISFOc1tmXX1mdW5jdGlvbiBmdihmKXtyZXR1cm4gTnNbZl19dmFyIElmPXt9O2Z1bmN0aW9uIGR2KGYpeyFraShmKXx8Zi5mb3JFYWNoKHM9Pnshc3x8KGJpKHMpP0lmW3NdPSEwOkZsKHMpJiZiaShzLnR5cGUpJiYoSWZbcy50eXBlXT1zLFNmKHMudHlwZSxzLm1ldGhvZHMpKSl9KX1mdW5jdGlvbiBOZihmKXtyZXR1cm4hIUlmW2ZdfXZhciBrcz1bXTtmdW5jdGlvbiBmdShmLHMpe2tmKGYpP2NvbnNvbGUud2FybihgU2VydmljZSAiJHtmfSIgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhbHJlYWR5IWApOihzPUhpKHt9LHMpLGtzLnB1c2goe25hbWU6ZixvcHRpb25zOnN9KSl9ZnVuY3Rpb24gZHUoZil7a3Muc29tZSgocyxwKT0+e2lmKHMubmFtZT09PWYpcmV0dXJuIGtzLnNwbGljZShwLDEpLCEwfSl9ZnVuY3Rpb24ga2YoZil7cmV0dXJuIGJrKGYpPj0wfWZ1bmN0aW9uIGJrKGYpe3JldHVybiBrcy5tYXAocz0+cy5uYW1lKS5pbmRleE9mKGYpfWZ1bmN0aW9uIEVrKGYpe3JldHVybiBzPT57bGV0IHA9dHUoZixzKSx7Y3JlYXRlQXBwOnd9PXA7cC5jcmVhdGVWdWVBcHA9cC5jcmVhdGVBcHA9KE4seSk9PncoTix5KS51c2UoeWsscykscy5WdWU9cH19dmFyIHlrPXtpbnN0YWxsKGYscyl7U2soZixzKSxkYyhzKS5pbml0QXBwKGYpfX07ZnVuY3Rpb24gU2soZixzKXtsZXR7bW91bnQ6cH09ZjtmLm1vdW50PXc9PntsZXQgTj1wKHcpO3JldHVybiB3PT09IiNhcHAiJiZzLl9fcmVnaXN0ZXJBcHAoTiksTn19ZnVuY3Rpb24gd2soZil7bGV0e1VuaVNoYXJlZDpzLFZ1ZVNoYXJlZDpwLFZ1ZVJlYWN0aXZpdHk6d309Zjt2YXIgTj1mdW5jdGlvbih5LGgsRSxSKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gRGUoaSl7fWZ1bmN0aW9uIE50KGksbCl7fWZ1bmN0aW9uIFV0KGksbCxkLF8pe3ZhciBBO3RyeXtBPV8/aSguLi5fKTppKCl9Y2F0Y2goQyl7UChDLGwsZCl9cmV0dXJuIEF9ZnVuY3Rpb24gVHQoaSxsLGQsXyl7aWYoaC5pc0Z1bmN0aW9uKGkpKXt2YXIgQT1VdChpLGwsZCxfKTtyZXR1cm4gQSYmaC5pc1Byb21pc2UoQSkmJkEuY2F0Y2goTD0+e1AoTCxsLGQpfSksQX1mb3IodmFyIEM9W10saz0wO2s8aS5sZW5ndGg7aysrKUMucHVzaChUdChpW2tdLGwsZCxfKSk7cmV0dXJuIEN9ZnVuY3Rpb24gUChpLGwsZCl7aWYobCYmbC52bm9kZSxsKXtmb3IodmFyIF89bC5wYXJlbnQsQT1sLnByb3h5LEM9ZDtfOyl7dmFyIGs9Xy5lYztpZihrKXtmb3IodmFyIEw9MDtMPGsubGVuZ3RoO0wrKylpZihrW0xdKGksQSxDKT09PSExKXJldHVybn1fPV8ucGFyZW50fXZhciBIPWwuYXBwQ29udGV4dC5jb25maWcuZXJyb3JIYW5kbGVyO2lmKEgpe1V0KEgsbnVsbCwxMCxbaSxBLENdKTtyZXR1cm59fUN0KGkpfWZ1bmN0aW9uIEN0KGksbCxkKXtjb25zb2xlLmVycm9yKGkpfXZhciBSbj0hMSxvdD0hMSx6PVtdLEs9MCxtbj1bXSxobj1udWxsLHduPTAsWG49e3RoZW4oaSl7c2V0VGltZW91dCgoKT0+aSgpLDApfX0sc2k9eS5wbGF0Zm9ybT09PSJpT1MiLEVpPXNpP1huOlByb21pc2UucmVzb2x2ZSgpLFhyPW51bGw7ZnVuY3Rpb24gbXIoaSl7dmFyIGw9WHJ8fEVpO3JldHVybiBpP2wudGhlbih0aGlzP2kuYmluZCh0aGlzKTppKTpsfWZ1bmN0aW9uIENuKGkpe2Zvcih2YXIgbD1LKzEsZD16Lmxlbmd0aDtsPGQ7KXt2YXIgXz1sK2Q+Pj4xLEE9bnQoeltfXSk7QTxpP2w9XysxOmQ9X31yZXR1cm4gbH1mdW5jdGlvbiBfcihpKXsoIXoubGVuZ3RofHwhei5pbmNsdWRlcyhpLFJuJiZpLmFsbG93UmVjdXJzZT9LKzE6SykpJiYoaS5pZD09bnVsbD96LnB1c2goaSk6ei5zcGxpY2UoQ24oaS5pZCksMCxpKSwkcigpKX1mdW5jdGlvbiAkcigpeyFSbiYmIW90JiYob3Q9ITAsWHI9RWkudGhlbihubikpfWZ1bmN0aW9uIFFyKGkpe3ZhciBsPXouaW5kZXhPZihpKTtsPksmJnouc3BsaWNlKGwsMSl9ZnVuY3Rpb24geWkoaSl7aC5pc0FycmF5KGkpP21uLnB1c2goLi4uaSk6KCFobnx8IWhuLmluY2x1ZGVzKGksaS5hbGxvd1JlY3Vyc2U/d24rMTp3bikpJiZtbi5wdXNoKGkpLCRyKCl9ZnVuY3Rpb24ga24oaSl7Zm9yKHZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpSbj9LKzE6MDtsPHoubGVuZ3RoO2wrKyl7dmFyIGQ9eltsXTtkJiZkLnByZSYmKHouc3BsaWNlKGwsMSksbC0tLGQoKSl9fWZ1bmN0aW9uIGplKGkpe2lmKG1uLmxlbmd0aCl7dmFyIGw9Wy4uLm5ldyBTZXQobW4pXTtpZihtbi5sZW5ndGg9MCxobil7aG4ucHVzaCguLi5sKTtyZXR1cm59Zm9yKGhuPWwsaG4uc29ydCgoZCxfKT0+bnQoZCktbnQoXykpLHduPTA7d248aG4ubGVuZ3RoO3duKyspaG5bd25dKCk7aG49bnVsbCx3bj0wfX12YXIgbnQ9aT0+aS5pZD09bnVsbD8xLzA6aS5pZCxPdD0oaSxsKT0+e3ZhciBkPW50KGkpLW50KGwpO2lmKGQ9PT0wKXtpZihpLnByZSYmIWwucHJlKXJldHVybi0xO2lmKGwucHJlJiYhaS5wcmUpcmV0dXJuIDF9cmV0dXJuIGR9O2Z1bmN0aW9uIG5uKGkpe290PSExLFJuPSEwLHouc29ydChPdCk7dmFyIGw9aC5OT09QO3RyeXtmb3IoSz0wO0s8ei5sZW5ndGg7SysrKXt2YXIgZD16W0tdO2QmJmQuYWN0aXZlIT09ITEmJlV0KGQsbnVsbCwxNCl9fWZpbmFsbHl7Sz0wLHoubGVuZ3RoPTAsamUoKSxSbj0hMSxYcj1udWxsLCh6Lmxlbmd0aHx8bW4ubGVuZ3RoKSYmbm4oKX19eS5kZXZ0b29scz12b2lkIDA7dmFyIE5uPVtdO2Z1bmN0aW9uIHVuKGksbCl7dmFyIGQsXztpZih5LmRldnRvb2xzPWkseS5kZXZ0b29scyl5LmRldnRvb2xzLmVuYWJsZWQ9ITAsTm4uZm9yRWFjaChDPT57dmFye2V2ZW50OmssYXJnczpMfT1DO3JldHVybiB5LmRldnRvb2xzLmVtaXQoaywuLi5MKX0pLE5uPVtdO2Vsc2UgaWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5IVE1MRWxlbWVudCYmISgoXz0oZD13aW5kb3cubmF2aWdhdG9yKT09PW51bGx8fGQ9PT12b2lkIDA/dm9pZCAwOmQudXNlckFnZW50KT09PW51bGx8fF89PT12b2lkIDA/dm9pZCAwOl8uaW5jbHVkZXMoImpzZG9tIikpKXt2YXIgQT1sLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX189bC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9ffHxbXTtBLnB1c2goQz0+e3VuKEMsbCl9KSxzZXRUaW1lb3V0KCgpPT57eS5kZXZ0b29sc3x8KGwuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz1udWxsLE5uPVtdKX0sM2UzKX1lbHNlIE5uPVtdfWZ1bmN0aW9uIGFyKGksbCl7aWYoIWkuaXNVbm1vdW50ZWQpe2Zvcih2YXIgZD1pLnZub2RlLnByb3BzfHxoLkVNUFRZX09CSixfPWFyZ3VtZW50cy5sZW5ndGgsQT1uZXcgQXJyYXkoXz4yP18tMjowKSxDPTI7QzxfO0MrKylBW0MtMl09YXJndW1lbnRzW0NdO3ZhciBrPUEsTD1sLnN0YXJ0c1dpdGgoInVwZGF0ZToiKSxIPUwmJmwuc2xpY2UoNyk7aWYoSCYmSCBpbiBkKXt2YXIgdGU9IiIuY29uY2F0KEg9PT0ibW9kZWxWYWx1ZSI/Im1vZGVsIjpILCJNb2RpZmllcnMiKSx7bnVtYmVyOmdlLHRyaW06a2V9PWRbdGVdfHxoLkVNUFRZX09CSjtrZSYmKGs9QS5tYXAodXQ9PmguaXNTdHJpbmcodXQpP3V0LnRyaW0oKTp1dCkpLGdlJiYoaz1BLm1hcChoLmxvb3NlVG9OdW1iZXIpKX12YXIgdWUsUGU9ZFt1ZT1oLnRvSGFuZGxlcktleShsKV18fGRbdWU9aC50b0hhbmRsZXJLZXkoaC5jYW1lbGl6ZShsKSldOyFQZSYmTCYmKFBlPWRbdWU9aC50b0hhbmRsZXJLZXkoaC5oeXBoZW5hdGUobCkpXSksUGUmJlR0KFBlLGksNixrKTt2YXIgV2U9ZFt1ZSsiT25jZSJdO2lmKFdlKXtpZighaS5lbWl0dGVkKWkuZW1pdHRlZD17fTtlbHNlIGlmKGkuZW1pdHRlZFt1ZV0pcmV0dXJuO2kuZW1pdHRlZFt1ZV09ITAsVHQoV2UsaSw2LGspfX19ZnVuY3Rpb24gVm4oaSxsKXt2YXIgZD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsXz1sLmVtaXRzQ2FjaGUsQT1fLmdldChpKTtpZihBIT09dm9pZCAwKXJldHVybiBBO3ZhciBDPWkuZW1pdHMsaz17fSxMPSExO2lmKCFoLmlzRnVuY3Rpb24oaSkpe3ZhciBIPXRlPT57dmFyIGdlPVZuKHRlLGwsITApO2dlJiYoTD0hMCxoLmV4dGVuZChrLGdlKSl9OyFkJiZsLm1peGlucy5sZW5ndGgmJmwubWl4aW5zLmZvckVhY2goSCksaS5leHRlbmRzJiZIKGkuZXh0ZW5kcyksaS5taXhpbnMmJmkubWl4aW5zLmZvckVhY2goSCl9cmV0dXJuIUMmJiFMPyhoLmlzT2JqZWN0KGkpJiZfLnNldChpLG51bGwpLG51bGwpOihoLmlzQXJyYXkoQyk/Qy5mb3JFYWNoKHRlPT5rW3RlXT1udWxsKTpoLmV4dGVuZChrLEMpLGguaXNPYmplY3QoaSkmJl8uc2V0KGksayksayl9ZnVuY3Rpb24gUG4oaSxsKXtyZXR1cm4haXx8IWguaXNPbihsKT8hMToobD1sLnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywiIiksaC5oYXNPd24oaSxsWzBdLnRvTG93ZXJDYXNlKCkrbC5zbGljZSgxKSl8fGguaGFzT3duKGksaC5oeXBoZW5hdGUobCkpfHxoLmhhc093bihpLGwpKX12YXIgX249bnVsbCxicj1udWxsO2Z1bmN0aW9uIGVpKGkpe3ZhciBsPV9uO3JldHVybiBfbj1pLGJyPWkmJmkudHlwZS5fX3Njb3BlSWR8fG51bGwsbH1mdW5jdGlvbiBnbyhpKXticj1pfWZ1bmN0aW9uIGZhKCl7YnI9bnVsbH12YXIgQW89aT0+Sm87ZnVuY3Rpb24gSm8oaSl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOl9uO2lmKCFsfHxpLl9uKXJldHVybiBpO3ZhciBkPWZ1bmN0aW9uKCl7ZC5fZCYmeXQoLTEpO3ZhciBfPWVpKGwpLEE7dHJ5e0E9aSguLi5hcmd1bWVudHMpfWZpbmFsbHl7ZWkoXyksZC5fZCYmeXQoMSl9cmV0dXJuIEF9O3JldHVybiBkLl9uPSEwLGQuX2M9ITAsZC5fZD0hMCxkfWZ1bmN0aW9uIEtvKCl7fWZ1bmN0aW9uIFJpKGkpe3Zhcnt0eXBlOmwsdm5vZGU6ZCxwcm94eTpfLHdpdGhQcm94eTpBLHByb3BzOkMscHJvcHNPcHRpb25zOltrXSxzbG90czpMLGF0dHJzOkgsZW1pdDp0ZSxyZW5kZXI6Z2UscmVuZGVyQ2FjaGU6a2UsZGF0YTp1ZSxzZXR1cFN0YXRlOlBlLGN0eDpXZSxpbmhlcml0QXR0cnM6dXR9PWksUWUsSWUscGU9ZWkoaSk7dHJ5e2lmKGQuc2hhcGVGbGFnJjQpe3ZhciBfZT1BfHxfO1FlPVduKGdlLmNhbGwoX2UsX2Usa2UsQyxQZSx1ZSxXZSkpLEllPUh9ZWxzZXt2YXIgTGU9bDtRZT1XbihMZS5sZW5ndGg+MT9MZShDLHthdHRyczpILHNsb3RzOkwsZW1pdDp0ZX0pOkxlKEMsbnVsbCkpLEllPWwucHJvcHM/SDp6aShIKX19Y2F0Y2goSmUpe2ZlLmxlbmd0aD0wLFAoSmUsaSwxKSxRZT1adChoZSl9dmFyIEFlPVFlO2lmKEllJiZ1dCE9PSExKXt2YXIgRXQ9T2JqZWN0LmtleXMoSWUpLHtzaGFwZUZsYWc6QXR9PUFlO0V0Lmxlbmd0aCYmQXQmKDF8NikmJihrJiZFdC5zb21lKGguaXNNb2RlbExpc3RlbmVyKSYmKEllPVdpKEllLGspKSxBZT1paShBZSxJZSkpfXJldHVybiBkLmRpcnMmJihBZT1paShBZSksQWUuZGlycz1BZS5kaXJzP0FlLmRpcnMuY29uY2F0KGQuZGlycyk6ZC5kaXJzKSxkLnRyYW5zaXRpb24mJihBZS50cmFuc2l0aW9uPWQudHJhbnNpdGlvbiksUWU9QWUsZWkocGUpLFFlfWZ1bmN0aW9uIFJyKGkpe2Zvcih2YXIgbCxkPTA7ZDxpLmxlbmd0aDtkKyspe3ZhciBfPWlbZF07aWYocXQoXykpe2lmKF8udHlwZSE9PWhlfHxfLmNoaWxkcmVuPT09InYtaWYiKXtpZihsKXJldHVybjtsPV99fWVsc2UgcmV0dXJufXJldHVybiBsfXZhciB6aT1pPT57dmFyIGw7Zm9yKHZhciBkIGluIGkpKGQ9PT0iY2xhc3MifHxkPT09InN0eWxlInx8aC5pc09uKGQpKSYmKChsfHwobD17fSkpW2RdPWlbZF0pO3JldHVybiBsfSxXaT0oaSxsKT0+e3ZhciBkPXt9O2Zvcih2YXIgXyBpbiBpKSghaC5pc01vZGVsTGlzdGVuZXIoXyl8fCEoXy5zbGljZSg5KWluIGwpKSYmKGRbX109aVtfXSk7cmV0dXJuIGR9O2Z1bmN0aW9uIHJvKGksbCxkKXt2YXJ7cHJvcHM6XyxjaGlsZHJlbjpBLGNvbXBvbmVudDpDfT1pLHtwcm9wczprLGNoaWxkcmVuOkwscGF0Y2hGbGFnOkh9PWwsdGU9Qy5lbWl0c09wdGlvbnM7aWYobC5kaXJzfHxsLnRyYW5zaXRpb24pcmV0dXJuITA7aWYoZCYmSD49MCl7aWYoSCYxMDI0KXJldHVybiEwO2lmKEgmMTYpcmV0dXJuIF8/aW8oXyxrLHRlKTohIWs7aWYoSCY4KWZvcih2YXIgZ2U9bC5keW5hbWljUHJvcHMsa2U9MDtrZTxnZS5sZW5ndGg7a2UrKyl7dmFyIHVlPWdlW2tlXTtpZihrW3VlXSE9PV9bdWVdJiYhUG4odGUsdWUpKXJldHVybiEwfX1lbHNlIHJldHVybihBfHxMKSYmKCFMfHwhTC4kc3RhYmxlKT8hMDpfPT09az8hMTpfP2s/aW8oXyxrLHRlKTohMDohIWs7cmV0dXJuITF9ZnVuY3Rpb24gaW8oaSxsLGQpe3ZhciBfPU9iamVjdC5rZXlzKGwpO2lmKF8ubGVuZ3RoIT09T2JqZWN0LmtleXMoaSkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgQT0wO0E8Xy5sZW5ndGg7QSsrKXt2YXIgQz1fW0FdO2lmKGxbQ10hPT1pW0NdJiYhUG4oZCxDKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBsaShpLGwpe2Zvcih2YXJ7dm5vZGU6ZCxwYXJlbnQ6X309aTtfJiZfLnN1YlRyZWU9PT1kOykoZD1fLnZub2RlKS5lbD1sLF89Xy5wYXJlbnR9dmFyIHBvPWk9PmkuX19pc1N1c3BlbnNlLE9vPXtuYW1lOiJTdXNwZW5zZSIsX19pc1N1c3BlbnNlOiEwLHByb2Nlc3MoaSxsLGQsXyxBLEMsayxMLEgsdGUpe2k9PW51bGw/Y2kobCxkLF8sQSxDLGssTCxILHRlKTpmcihpLGwsZCxfLEEsayxMLEgsdGUpfSxoeWRyYXRlOlpvLGNyZWF0ZTp2byxub3JtYWxpemU6VG99LHhuPU9vO2Z1bmN0aW9uIFRyKGksbCl7dmFyIGQ9aS5wcm9wcyYmaS5wcm9wc1tsXTtoLmlzRnVuY3Rpb24oZCkmJmQoKX1mdW5jdGlvbiBjaShpLGwsZCxfLEEsQyxrLEwsSCl7dmFye3A6dGUsbzp7Y3JlYXRlRWxlbWVudDpnZX19PUgsa2U9Z2UoImRpdiIsbCksdWU9aS5zdXNwZW5zZT12byhpLEEsXyxsLGtlLGQsQyxrLEwsSCk7dGUobnVsbCx1ZS5wZW5kaW5nQnJhbmNoPWkuc3NDb250ZW50LGtlLG51bGwsXyx1ZSxDLGspLHVlLmRlcHM+MD8oVHIoaSwib25QZW5kaW5nIiksVHIoaSwib25GYWxsYmFjayIpLHRlKG51bGwsaS5zc0ZhbGxiYWNrLGwsZCxfLG51bGwsQyxrKSx1aSh1ZSxpLnNzRmFsbGJhY2spKTp1ZS5yZXNvbHZlKCl9ZnVuY3Rpb24gZnIoaSxsLGQsXyxBLEMsayxMLEgpe3ZhcntwOnRlLHVtOmdlLG86e2NyZWF0ZUVsZW1lbnQ6a2V9fT1ILHVlPWwuc3VzcGVuc2U9aS5zdXNwZW5zZTt1ZS52bm9kZT1sLGwuZWw9aS5lbDt2YXIgUGU9bC5zc0NvbnRlbnQsV2U9bC5zc0ZhbGxiYWNrLHthY3RpdmVCcmFuY2g6dXQscGVuZGluZ0JyYW5jaDpRZSxpc0luRmFsbGJhY2s6SWUsaXNIeWRyYXRpbmc6cGV9PXVlO2lmKFFlKXVlLnBlbmRpbmdCcmFuY2g9UGUsZHQoUGUsUWUpPyh0ZShRZSxQZSx1ZS5oaWRkZW5Db250YWluZXIsbnVsbCxBLHVlLEMsayxMKSx1ZS5kZXBzPD0wP3VlLnJlc29sdmUoKTpJZSYmKHRlKHV0LFdlLGQsXyxBLG51bGwsQyxrLEwpLHVpKHVlLFdlKSkpOih1ZS5wZW5kaW5nSWQrKyxwZT8odWUuaXNIeWRyYXRpbmc9ITEsdWUuYWN0aXZlQnJhbmNoPVFlKTpnZShRZSxBLHVlKSx1ZS5kZXBzPTAsdWUuZWZmZWN0cy5sZW5ndGg9MCx1ZS5oaWRkZW5Db250YWluZXI9a2UoImRpdiIsZCksSWU/KHRlKG51bGwsUGUsdWUuaGlkZGVuQ29udGFpbmVyLG51bGwsQSx1ZSxDLGssTCksdWUuZGVwczw9MD91ZS5yZXNvbHZlKCk6KHRlKHV0LFdlLGQsXyxBLG51bGwsQyxrLEwpLHVpKHVlLFdlKSkpOnV0JiZkdChQZSx1dCk/KHRlKHV0LFBlLGQsXyxBLHVlLEMsayxMKSx1ZS5yZXNvbHZlKCEwKSk6KHRlKG51bGwsUGUsdWUuaGlkZGVuQ29udGFpbmVyLG51bGwsQSx1ZSxDLGssTCksdWUuZGVwczw9MCYmdWUucmVzb2x2ZSgpKSk7ZWxzZSBpZih1dCYmZHQoUGUsdXQpKXRlKHV0LFBlLGQsXyxBLHVlLEMsayxMKSx1aSh1ZSxQZSk7ZWxzZSBpZihUcihsLCJvblBlbmRpbmciKSx1ZS5wZW5kaW5nQnJhbmNoPVBlLHVlLnBlbmRpbmdJZCsrLHRlKG51bGwsUGUsdWUuaGlkZGVuQ29udGFpbmVyLG51bGwsQSx1ZSxDLGssTCksdWUuZGVwczw9MCl1ZS5yZXNvbHZlKCk7ZWxzZXt2YXJ7dGltZW91dDpfZSxwZW5kaW5nSWQ6TGV9PXVlO19lPjA/c2V0VGltZW91dCgoKT0+e3VlLnBlbmRpbmdJZD09PUxlJiZ1ZS5mYWxsYmFjayhXZSl9LF9lKTpfZT09PTAmJnVlLmZhbGxiYWNrKFdlKX19ZnVuY3Rpb24gdm8oaSxsLGQsXyxBLEMsayxMLEgsdGUpe3ZhciBnZT1hcmd1bWVudHMubGVuZ3RoPjEwJiZhcmd1bWVudHNbMTBdIT09dm9pZCAwP2FyZ3VtZW50c1sxMF06ITEse3A6a2UsbTp1ZSx1bTpQZSxuOldlLG86e3BhcmVudE5vZGU6dXQscmVtb3ZlOlFlfX09dGUsSWU9aS5wcm9wcz9oLnRvTnVtYmVyKGkucHJvcHMudGltZW91dCk6dm9pZCAwLHBlPXt2bm9kZTppLHBhcmVudDpsLHBhcmVudENvbXBvbmVudDpkLGlzU1ZHOmssY29udGFpbmVyOl8saGlkZGVuQ29udGFpbmVyOkEsYW5jaG9yOkMsZGVwczowLHBlbmRpbmdJZDowLHRpbWVvdXQ6dHlwZW9mIEllPT0ibnVtYmVyIj9JZTotMSxhY3RpdmVCcmFuY2g6bnVsbCxwZW5kaW5nQnJhbmNoOm51bGwsaXNJbkZhbGxiYWNrOiEwLGlzSHlkcmF0aW5nOmdlLGlzVW5tb3VudGVkOiExLGVmZmVjdHM6W10scmVzb2x2ZSgpe3ZhciBfZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06ITEse3Zub2RlOkxlLGFjdGl2ZUJyYW5jaDpBZSxwZW5kaW5nQnJhbmNoOkV0LHBlbmRpbmdJZDpBdCxlZmZlY3RzOkplLHBhcmVudENvbXBvbmVudDp4dCxjb250YWluZXI6TX09cGU7aWYocGUuaXNIeWRyYXRpbmcpcGUuaXNIeWRyYXRpbmc9ITE7ZWxzZSBpZighX2Upe3ZhciBqPUFlJiZFdC50cmFuc2l0aW9uJiZFdC50cmFuc2l0aW9uLm1vZGU9PT0ib3V0LWluIjtqJiYoQWUudHJhbnNpdGlvbi5hZnRlckxlYXZlPSgpPT57QXQ9PT1wZS5wZW5kaW5nSWQmJnVlKEV0LE0sYWUsMCl9KTt2YXJ7YW5jaG9yOmFlfT1wZTtBZSYmKGFlPVdlKEFlKSxQZShBZSx4dCxwZSwhMCkpLGp8fHVlKEV0LE0sYWUsMCl9dWkocGUsRXQpLHBlLnBlbmRpbmdCcmFuY2g9bnVsbCxwZS5pc0luRmFsbGJhY2s9ITE7Zm9yKHZhciBuZT1wZS5wYXJlbnQsaWU9ITE7bmU7KXtpZihuZS5wZW5kaW5nQnJhbmNoKXtuZS5lZmZlY3RzLnB1c2goLi4uSmUpLGllPSEwO2JyZWFrfW5lPW5lLnBhcmVudH1pZXx8eWkoSmUpLHBlLmVmZmVjdHM9W10sVHIoTGUsIm9uUmVzb2x2ZSIpfSxmYWxsYmFjayhfZSl7aWYoISFwZS5wZW5kaW5nQnJhbmNoKXt2YXJ7dm5vZGU6TGUsYWN0aXZlQnJhbmNoOkFlLHBhcmVudENvbXBvbmVudDpFdCxjb250YWluZXI6QXQsaXNTVkc6SmV9PXBlO1RyKExlLCJvbkZhbGxiYWNrIik7dmFyIHh0PVdlKEFlKSxNPSgpPT57IXBlLmlzSW5GYWxsYmFja3x8KGtlKG51bGwsX2UsQXQseHQsRXQsbnVsbCxKZSxMLEgpLHVpKHBlLF9lKSl9LGo9X2UudHJhbnNpdGlvbiYmX2UudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7aiYmKEFlLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZT1NKSxwZS5pc0luRmFsbGJhY2s9ITAsUGUoQWUsRXQsbnVsbCwhMCksanx8TSgpfX0sbW92ZShfZSxMZSxBZSl7cGUuYWN0aXZlQnJhbmNoJiZ1ZShwZS5hY3RpdmVCcmFuY2gsX2UsTGUsQWUpLHBlLmNvbnRhaW5lcj1fZX0sbmV4dCgpe3JldHVybiBwZS5hY3RpdmVCcmFuY2gmJldlKHBlLmFjdGl2ZUJyYW5jaCl9LHJlZ2lzdGVyRGVwKF9lLExlKXt2YXIgQWU9ISFwZS5wZW5kaW5nQnJhbmNoO0FlJiZwZS5kZXBzKys7dmFyIEV0PV9lLnZub2RlLmVsO19lLmFzeW5jRGVwLmNhdGNoKEF0PT57UChBdCxfZSwwKX0pLnRoZW4oQXQ9PntpZighKF9lLmlzVW5tb3VudGVkfHxwZS5pc1VubW91bnRlZHx8cGUucGVuZGluZ0lkIT09X2Uuc3VzcGVuc2VJZCkpe19lLmFzeW5jUmVzb2x2ZWQ9ITA7dmFye3Zub2RlOkplfT1fZTtuYShfZSxBdCwhMSksRXQmJihKZS5lbD1FdCk7dmFyIHh0PSFFdCYmX2Uuc3ViVHJlZS5lbDtMZShfZSxKZSx1dChFdHx8X2Uuc3ViVHJlZS5lbCksRXQ/bnVsbDpXZShfZS5zdWJUcmVlKSxwZSxrLEgpLHh0JiZRZSh4dCksbGkoX2UsSmUuZWwpLEFlJiYtLXBlLmRlcHM9PT0wJiZwZS5yZXNvbHZlKCl9fSl9LHVubW91bnQoX2UsTGUpe3BlLmlzVW5tb3VudGVkPSEwLHBlLmFjdGl2ZUJyYW5jaCYmUGUocGUuYWN0aXZlQnJhbmNoLGQsX2UsTGUpLHBlLnBlbmRpbmdCcmFuY2gmJlBlKHBlLnBlbmRpbmdCcmFuY2gsZCxfZSxMZSl9fTtyZXR1cm4gcGV9ZnVuY3Rpb24gWm8oaSxsLGQsXyxBLEMsayxMLEgpe3ZhciB0ZT1sLnN1c3BlbnNlPXZvKGwsXyxkLGkucGFyZW50Tm9kZSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxudWxsLEEsQyxrLEwsITApLGdlPUgoaSx0ZS5wZW5kaW5nQnJhbmNoPWwuc3NDb250ZW50LGQsdGUsQyxrKTtyZXR1cm4gdGUuZGVwcz09PTAmJnRlLnJlc29sdmUoKSxnZX1mdW5jdGlvbiBUbyhpKXt2YXJ7c2hhcGVGbGFnOmwsY2hpbGRyZW46ZH09aSxfPWwmMzI7aS5zc0NvbnRlbnQ9U2koXz9kLmRlZmF1bHQ6ZCksaS5zc0ZhbGxiYWNrPV8/U2koZC5mYWxsYmFjayk6WnQoaGUpfWZ1bmN0aW9uIFNpKGkpe3ZhciBsO2lmKGguaXNGdW5jdGlvbihpKSl7dmFyIGQ9anQmJmkuX2M7ZCYmKGkuX2Q9ITEsbHQoKSksaT1pKCksZCYmKGkuX2Q9ITAsbD13ZSxwdCgpKX1pZihoLmlzQXJyYXkoaSkpe3ZhciBfPVJyKGkpO2k9X31yZXR1cm4gaT1XbihpKSxsJiYhaS5keW5hbWljQ2hpbGRyZW4mJihpLmR5bmFtaWNDaGlsZHJlbj1sLmZpbHRlcihBPT5BIT09aSkpLGl9ZnVuY3Rpb24gc3IoaSxsKXtsJiZsLnBlbmRpbmdCcmFuY2g/aC5pc0FycmF5KGkpP2wuZWZmZWN0cy5wdXNoKC4uLmkpOmwuZWZmZWN0cy5wdXNoKGkpOnlpKGkpfWZ1bmN0aW9uIHVpKGksbCl7aS5hY3RpdmVCcmFuY2g9bDt2YXJ7dm5vZGU6ZCxwYXJlbnRDb21wb25lbnQ6X309aSxBPWQuZWw9bC5lbDtfJiZfLnN1YlRyZWU9PT1kJiYoXy52bm9kZS5lbD1BLGxpKF8sQSkpfWZ1bmN0aW9uIGxyKGksbCl7aWYoeW4pe3ZhciBkPXluLnByb3ZpZGVzLF89eW4ucGFyZW50JiZ5bi5wYXJlbnQucHJvdmlkZXM7Xz09PWQmJihkPXluLnByb3ZpZGVzPU9iamVjdC5jcmVhdGUoXykpLGRbaV09bCx5bi50eXBlLm1wVHlwZT09PSJhcHAiJiZ5bi5hcHBDb250ZXh0LmFwcC5wcm92aWRlKGksbCl9fWZ1bmN0aW9uIFFuKGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLF89eW58fF9uO2lmKF8pe3ZhciBBPV8ucGFyZW50PT1udWxsP18udm5vZGUuYXBwQ29udGV4dCYmXy52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOl8ucGFyZW50LnByb3ZpZGVzO2lmKEEmJmkgaW4gQSlyZXR1cm4gQVtpXTtpZihhcmd1bWVudHMubGVuZ3RoPjEpcmV0dXJuIGQmJmguaXNGdW5jdGlvbihsKT9sLmNhbGwoXy5wcm94eSk6bH19ZnVuY3Rpb24geGkoaSxsKXtyZXR1cm4gd2koaSxudWxsLGwpfWZ1bmN0aW9uIG9vKGksbCl7cmV0dXJuIHdpKGksbnVsbCx7Zmx1c2g6InBvc3QifSl9ZnVuY3Rpb24gdGkoaSxsKXtyZXR1cm4gd2koaSxudWxsLHtmbHVzaDoic3luYyJ9KX12YXIgeHI9e307ZnVuY3Rpb24gQnIoaSxsLGQpe3JldHVybiB3aShpLGwsZCl9ZnVuY3Rpb24gd2koaSxsKXt2YXJ7aW1tZWRpYXRlOmQsZGVlcDpfLGZsdXNoOkEsb25UcmFjazpDLG9uVHJpZ2dlcjprfT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06aC5FTVBUWV9PQkosTD1FLmdldEN1cnJlbnRTY29wZSgpPT09KHluPT1udWxsP3ZvaWQgMDp5bi5zY29wZSk/eW46bnVsbCxILHRlPSExLGdlPSExO2lmKEUuaXNSZWYoaSk/KEg9KCk9PmkudmFsdWUsdGU9RS5pc1NoYWxsb3coaSkpOkUuaXNSZWFjdGl2ZShpKT8oSD0oKT0+aSxfPSEwKTpoLmlzQXJyYXkoaSk/KGdlPSEwLHRlPWkuc29tZShBZT0+RS5pc1JlYWN0aXZlKEFlKXx8RS5pc1NoYWxsb3coQWUpKSxIPSgpPT5pLm1hcChBZT0+e2lmKEUuaXNSZWYoQWUpKXJldHVybiBBZS52YWx1ZTtpZihFLmlzUmVhY3RpdmUoQWUpKXJldHVybiBNcihBZSk7aWYoaC5pc0Z1bmN0aW9uKEFlKSlyZXR1cm4gVXQoQWUsTCwyKX0pKTpoLmlzRnVuY3Rpb24oaSk/bD9IPSgpPT5VdChpLEwsMik6SD0oKT0+e2lmKCEoTCYmTC5pc1VubW91bnRlZCkpcmV0dXJuIHVlJiZ1ZSgpLFR0KGksTCwzLFtQZV0pfTpIPWguTk9PUCxsJiZfKXt2YXIga2U9SDtIPSgpPT5NcihrZSgpKX12YXIgdWUsUGU9QWU9Pnt1ZT1fZS5vblN0b3A9KCk9PntVdChBZSxMLDQpfX0sV2U7aWYoeS5pc0luU1NSQ29tcG9uZW50U2V0dXApaWYoUGU9aC5OT09QLGw/ZCYmVHQobCxMLDMsW0goKSxnZT9bXTp2b2lkIDAsUGVdKTpIKCksQT09PSJzeW5jIil7dmFyIHV0PU5hKCk7V2U9dXQuX193YXRjaGVySGFuZGxlc3x8KHV0Ll9fd2F0Y2hlckhhbmRsZXM9W10pfWVsc2UgcmV0dXJuIGguTk9PUDt2YXIgUWU9Z2U/bmV3IEFycmF5KGkubGVuZ3RoKS5maWxsKHhyKTp4cixJZT0oKT0+e2lmKCEhX2UuYWN0aXZlKWlmKGwpe3ZhciBBZT1fZS5ydW4oKTsoX3x8dGV8fChnZT9BZS5zb21lKChFdCxBdCk9PmguaGFzQ2hhbmdlZChFdCxRZVtBdF0pKTpoLmhhc0NoYW5nZWQoQWUsUWUpKSkmJih1ZSYmdWUoKSxUdChsLEwsMyxbQWUsUWU9PT14cj92b2lkIDA6Z2UmJlFlWzBdPT09eHI/W106UWUsUGVdKSxRZT1BZSl9ZWxzZSBfZS5ydW4oKX07SWUuYWxsb3dSZWN1cnNlPSEhbDt2YXIgcGU7QT09PSJzeW5jIj9wZT1JZTpBPT09InBvc3QiP3BlPSgpPT51cihJZSxMJiZMLnN1c3BlbnNlKTooSWUucHJlPSEwLEwmJihJZS5pZD1MLnVpZCkscGU9KCk9Pl9yKEllKSk7dmFyIF9lPW5ldyBFLlJlYWN0aXZlRWZmZWN0KEgscGUpO2w/ZD9JZSgpOlFlPV9lLnJ1bigpOkE9PT0icG9zdCI/dXIoX2UucnVuLmJpbmQoX2UpLEwmJkwuc3VzcGVuc2UpOl9lLnJ1bigpO3ZhciBMZT0oKT0+e19lLnN0b3AoKSxMJiZMLnNjb3BlJiZoLnJlbW92ZShMLnNjb3BlLmVmZmVjdHMsX2UpfTtyZXR1cm4gV2UmJldlLnB1c2goTGUpLExlfWZ1bmN0aW9uIFBvKGksbCxkKXt2YXIgXz10aGlzLnByb3h5LEE9aC5pc1N0cmluZyhpKT9pLmluY2x1ZGVzKCIuIik/SHIoXyxpKTooKT0+X1tpXTppLmJpbmQoXyxfKSxDO2guaXNGdW5jdGlvbihsKT9DPWw6KEM9bC5oYW5kbGVyLGQ9bCk7dmFyIGs9eW47Wm4odGhpcyk7dmFyIEw9d2koQSxDLmJpbmQoXyksZCk7cmV0dXJuIGs/Wm4oayk6VGkoKSxMfWZ1bmN0aW9uIEhyKGksbCl7dmFyIGQ9bC5zcGxpdCgiLiIpO3JldHVybigpPT57Zm9yKHZhciBfPWksQT0wO0E8ZC5sZW5ndGgmJl87QSsrKV89X1tkW0FdXTtyZXR1cm4gX319ZnVuY3Rpb24gTXIoaSxsKXtpZighaC5pc09iamVjdChpKXx8aS5fX3Zfc2tpcHx8KGw9bHx8bmV3IFNldCxsLmhhcyhpKSkpcmV0dXJuIGk7aWYobC5hZGQoaSksRS5pc1JlZihpKSlNcihpLnZhbHVlLGwpO2Vsc2UgaWYoaC5pc0FycmF5KGkpKWZvcih2YXIgZD0wO2Q8aS5sZW5ndGg7ZCsrKU1yKGlbZF0sbCk7ZWxzZSBpZihoLmlzU2V0KGkpfHxoLmlzTWFwKGkpKWkuZm9yRWFjaChBPT57TXIoQSxsKX0pO2Vsc2UgaWYoaC5pc1BsYWluT2JqZWN0KGkpKWZvcih2YXIgXyBpbiBpKU1yKGlbX10sbCk7cmV0dXJuIGl9ZnVuY3Rpb24gRXIoKXt2YXIgaT17aXNNb3VudGVkOiExLGlzTGVhdmluZzohMSxpc1VubW91bnRpbmc6ITEsbGVhdmluZ1ZOb2RlczpuZXcgTWFwfTtyZXR1cm4gY3IoKCk9PntpLmlzTW91bnRlZD0hMH0pLGRyKCgpPT57aS5pc1VubW91bnRpbmc9ITB9KSxpfXZhciBnbj1bRnVuY3Rpb24sQXJyYXldLGZpPXttb2RlOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixwZXJzaXN0ZWQ6Qm9vbGVhbixvbkJlZm9yZUVudGVyOmduLG9uRW50ZXI6Z24sb25BZnRlckVudGVyOmduLG9uRW50ZXJDYW5jZWxsZWQ6Z24sb25CZWZvcmVMZWF2ZTpnbixvbkxlYXZlOmduLG9uQWZ0ZXJMZWF2ZTpnbixvbkxlYXZlQ2FuY2VsbGVkOmduLG9uQmVmb3JlQXBwZWFyOmduLG9uQXBwZWFyOmduLG9uQWZ0ZXJBcHBlYXI6Z24sb25BcHBlYXJDYW5jZWxsZWQ6Z259LFByPXtuYW1lOiJCYXNlVHJhbnNpdGlvbiIscHJvcHM6Zmksc2V0dXAoaSxsKXt2YXJ7c2xvdHM6ZH09bCxfPVluKCksQT1FcigpLEM7cmV0dXJuKCk9Pnt2YXIgaz1kLmRlZmF1bHQmJnpyKGQuZGVmYXVsdCgpLCEwKTtpZighKCFrfHwhay5sZW5ndGgpKXt2YXIgTD1rWzBdO2lmKGsubGVuZ3RoPjEpe2Zvcih2YXIgSCBvZiBrKWlmKEgudHlwZSE9PWhlKXtMPUg7YnJlYWt9fXZhciB0ZT1FLnRvUmF3KGkpLHttb2RlOmdlfT10ZTtpZihBLmlzTGVhdmluZylyZXR1cm4gR2koTCk7dmFyIGtlPUt0KEwpO2lmKCFrZSlyZXR1cm4gR2koTCk7dmFyIHVlPW5pKGtlLHRlLEEsXyk7anIoa2UsdWUpO3ZhciBQZT1fLnN1YlRyZWUsV2U9UGUmJkt0KFBlKSx1dD0hMSx7Z2V0VHJhbnNpdGlvbktleTpRZX09a2UudHlwZTtpZihRZSl7dmFyIEllPVFlKCk7Qz09PXZvaWQgMD9DPUllOkllIT09QyYmKEM9SWUsdXQ9ITApfWlmKFdlJiZXZS50eXBlIT09aGUmJighZHQoa2UsV2UpfHx1dCkpe3ZhciBwZT1uaShXZSx0ZSxBLF8pO2lmKGpyKFdlLHBlKSxnZT09PSJvdXQtaW4iKXJldHVybiBBLmlzTGVhdmluZz0hMCxwZS5hZnRlckxlYXZlPSgpPT57QS5pc0xlYXZpbmc9ITEsXy51cGRhdGUuYWN0aXZlIT09ITEmJl8udXBkYXRlKCl9LEdpKEwpO2dlPT09ImluLW91dCImJmtlLnR5cGUhPT1oZSYmKHBlLmRlbGF5TGVhdmU9KF9lLExlLEFlKT0+e3ZhciBFdD1FZShBLFdlKTtFdFtTdHJpbmcoV2Uua2V5KV09V2UsX2UuX2xlYXZlQ2I9KCk9PntMZSgpLF9lLl9sZWF2ZUNiPXZvaWQgMCxkZWxldGUgdWUuZGVsYXllZExlYXZlfSx1ZS5kZWxheWVkTGVhdmU9QWV9KX1yZXR1cm4gTH19fX0sTHQ9UHI7ZnVuY3Rpb24gRWUoaSxsKXt2YXJ7bGVhdmluZ1ZOb2RlczpkfT1pLF89ZC5nZXQobC50eXBlKTtyZXR1cm4gX3x8KF89T2JqZWN0LmNyZWF0ZShudWxsKSxkLnNldChsLnR5cGUsXykpLF99ZnVuY3Rpb24gbmkoaSxsLGQsXyl7dmFye2FwcGVhcjpBLG1vZGU6QyxwZXJzaXN0ZWQ6az0hMSxvbkJlZm9yZUVudGVyOkwsb25FbnRlcjpILG9uQWZ0ZXJFbnRlcjp0ZSxvbkVudGVyQ2FuY2VsbGVkOmdlLG9uQmVmb3JlTGVhdmU6a2Usb25MZWF2ZTp1ZSxvbkFmdGVyTGVhdmU6UGUsb25MZWF2ZUNhbmNlbGxlZDpXZSxvbkJlZm9yZUFwcGVhcjp1dCxvbkFwcGVhcjpRZSxvbkFmdGVyQXBwZWFyOkllLG9uQXBwZWFyQ2FuY2VsbGVkOnBlfT1sLF9lPVN0cmluZyhpLmtleSksTGU9RWUoZCxpKSxBZT0oSmUseHQpPT57SmUmJlR0KEplLF8sOSx4dCl9LEV0PShKZSx4dCk9Pnt2YXIgTT14dFsxXTtBZShKZSx4dCksaC5pc0FycmF5KEplKT9KZS5ldmVyeShqPT5qLmxlbmd0aDw9MSkmJk0oKTpKZS5sZW5ndGg8PTEmJk0oKX0sQXQ9e21vZGU6QyxwZXJzaXN0ZWQ6ayxiZWZvcmVFbnRlcihKZSl7dmFyIHh0PUw7aWYoIWQuaXNNb3VudGVkKWlmKEEpeHQ9dXR8fEw7ZWxzZSByZXR1cm47SmUuX2xlYXZlQ2ImJkplLl9sZWF2ZUNiKCEwKTt2YXIgTT1MZVtfZV07TSYmZHQoaSxNKSYmTS5lbC5fbGVhdmVDYiYmTS5lbC5fbGVhdmVDYigpLEFlKHh0LFtKZV0pfSxlbnRlcihKZSl7dmFyIHh0PUgsTT10ZSxqPWdlO2lmKCFkLmlzTW91bnRlZClpZihBKXh0PVFlfHxILE09SWV8fHRlLGo9cGV8fGdlO2Vsc2UgcmV0dXJuO3ZhciBhZT0hMSxuZT1KZS5fZW50ZXJDYj1pZT0+e2FlfHwoYWU9ITAsaWU/QWUoaixbSmVdKTpBZShNLFtKZV0pLEF0LmRlbGF5ZWRMZWF2ZSYmQXQuZGVsYXllZExlYXZlKCksSmUuX2VudGVyQ2I9dm9pZCAwKX07eHQ/RXQoeHQsW0plLG5lXSk6bmUoKX0sbGVhdmUoSmUseHQpe3ZhciBNPVN0cmluZyhpLmtleSk7aWYoSmUuX2VudGVyQ2ImJkplLl9lbnRlckNiKCEwKSxkLmlzVW5tb3VudGluZylyZXR1cm4geHQoKTtBZShrZSxbSmVdKTt2YXIgaj0hMSxhZT1KZS5fbGVhdmVDYj1uZT0+e2p8fChqPSEwLHh0KCksbmU/QWUoV2UsW0plXSk6QWUoUGUsW0plXSksSmUuX2xlYXZlQ2I9dm9pZCAwLExlW01dPT09aSYmZGVsZXRlIExlW01dKX07TGVbTV09aSx1ZT9FdCh1ZSxbSmUsYWVdKTphZSgpfSxjbG9uZShKZSl7cmV0dXJuIG5pKEplLGwsZCxfKX19O3JldHVybiBBdH1mdW5jdGlvbiBHaShpKXtpZihkaShpKSlyZXR1cm4gaT1paShpKSxpLmNoaWxkcmVuPW51bGwsaX1mdW5jdGlvbiBLdChpKXtyZXR1cm4gZGkoaSk/aS5jaGlsZHJlbj9pLmNoaWxkcmVuWzBdOnZvaWQgMDppfWZ1bmN0aW9uIGpyKGksbCl7aS5zaGFwZUZsYWcmNiYmaS5jb21wb25lbnQ/anIoaS5jb21wb25lbnQuc3ViVHJlZSxsKTppLnNoYXBlRmxhZyYxMjg/KGkuc3NDb250ZW50LnRyYW5zaXRpb249bC5jbG9uZShpLnNzQ29udGVudCksaS5zc0ZhbGxiYWNrLnRyYW5zaXRpb249bC5jbG9uZShpLnNzRmFsbGJhY2spKTppLnRyYW5zaXRpb249bH1mdW5jdGlvbiB6cihpKXtmb3IodmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExLGQ9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsXz1bXSxBPTAsQz0wO0M8aS5sZW5ndGg7QysrKXt2YXIgaz1pW0NdLEw9ZD09bnVsbD9rLmtleTpTdHJpbmcoZCkrU3RyaW5nKGsua2V5IT1udWxsP2sua2V5OkMpO2sudHlwZT09PWVlPyhrLnBhdGNoRmxhZyYxMjgmJkErKyxfPV8uY29uY2F0KHpyKGsuY2hpbGRyZW4sbCxMKSkpOihsfHxrLnR5cGUhPT1oZSkmJl8ucHVzaChMIT1udWxsP2lpKGsse2tleTpMfSk6ayl9aWYoQT4xKWZvcih2YXIgSD0wO0g8Xy5sZW5ndGg7SCsrKV9bSF0ucGF0Y2hGbGFnPS0yO3JldHVybiBffWZ1bmN0aW9uIExyKGkpe3JldHVybiBoLmlzRnVuY3Rpb24oaSk/e3NldHVwOmksbmFtZTppLm5hbWV9Oml9dmFyIERyPWk9PiEhaS50eXBlLl9fYXN5bmNMb2FkZXI7ZnVuY3Rpb24gQmkoaSl7aC5pc0Z1bmN0aW9uKGkpJiYoaT17bG9hZGVyOml9KTt2YXJ7bG9hZGVyOmwsbG9hZGluZ0NvbXBvbmVudDpkLGVycm9yQ29tcG9uZW50Ol8sZGVsYXk6QT0yMDAsdGltZW91dDpDLHN1c3BlbnNpYmxlOms9ITAsb25FcnJvcjpMfT1pLEg9bnVsbCx0ZSxnZT0wLGtlPSgpPT4oZ2UrKyxIPW51bGwsdWUoKSksdWU9KCk9Pnt2YXIgUGU7cmV0dXJuIEh8fChQZT1IPWwoKS5jYXRjaChXZT0+e2lmKFdlPVdlIGluc3RhbmNlb2YgRXJyb3I/V2U6bmV3IEVycm9yKFN0cmluZyhXZSkpLEwpcmV0dXJuIG5ldyBQcm9taXNlKCh1dCxRZSk9Pnt2YXIgSWU9KCk9PnV0KGtlKCkpLHBlPSgpPT5RZShXZSk7TChXZSxJZSxwZSxnZSsxKX0pO3Rocm93IFdlfSkudGhlbihXZT0+UGUhPT1IJiZIP0g6KFdlJiYoV2UuX19lc01vZHVsZXx8V2VbU3ltYm9sLnRvU3RyaW5nVGFnXT09PSJNb2R1bGUiKSYmKFdlPVdlLmRlZmF1bHQpLHRlPVdlLFdlKSkpfTtyZXR1cm4gTHIoe25hbWU6IkFzeW5jQ29tcG9uZW50V3JhcHBlciIsX19hc3luY0xvYWRlcjp1ZSxnZXQgX19hc3luY1Jlc29sdmVkKCl7cmV0dXJuIHRlfSxzZXR1cCgpe3ZhciBQZT15bjtpZih0ZSlyZXR1cm4oKT0+Qm4odGUsUGUpO3ZhciBXZT1wZT0+e0g9bnVsbCxQKHBlLFBlLDEzKX07aWYoayYmUGUuc3VzcGVuc2V8fHkuaXNJblNTUkNvbXBvbmVudFNldHVwKXJldHVybiB1ZSgpLnRoZW4ocGU9PigpPT5CbihwZSxQZSkpLmNhdGNoKHBlPT4oV2UocGUpLCgpPT5fP1p0KF8se2Vycm9yOnBlfSk6bnVsbCkpO3ZhciB1dD1FLnJlZighMSksUWU9RS5yZWYoKSxJZT1FLnJlZighIUEpO3JldHVybiBBJiZzZXRUaW1lb3V0KCgpPT57SWUudmFsdWU9ITF9LEEpLEMhPW51bGwmJnNldFRpbWVvdXQoKCk9PntpZighdXQudmFsdWUmJiFRZS52YWx1ZSl7dmFyIHBlPW5ldyBFcnJvcigiQXN5bmMgY29tcG9uZW50IHRpbWVkIG91dCBhZnRlciAiLmNvbmNhdChDLCJtcy4iKSk7V2UocGUpLFFlLnZhbHVlPXBlfX0sQyksdWUoKS50aGVuKCgpPT57dXQudmFsdWU9ITAsUGUucGFyZW50JiZkaShQZS5wYXJlbnQudm5vZGUpJiZfcihQZS5wYXJlbnQudXBkYXRlKX0pLmNhdGNoKHBlPT57V2UocGUpLFFlLnZhbHVlPXBlfSksKCk9PntpZih1dC52YWx1ZSYmdGUpcmV0dXJuIEJuKHRlLFBlKTtpZihRZS52YWx1ZSYmXylyZXR1cm4gWnQoXyx7ZXJyb3I6UWUudmFsdWV9KTtpZihkJiYhSWUudmFsdWUpcmV0dXJuIFp0KGQpfX19KX1mdW5jdGlvbiBCbihpLGwpe3ZhcntyZWY6ZCxwcm9wczpfLGNoaWxkcmVuOkEsY2U6Q309bC52bm9kZSxrPVp0KGksXyxBKTtyZXR1cm4gay5yZWY9ZCxrLmNlPUMsZGVsZXRlIGwudm5vZGUuY2Usa312YXIgZGk9aT0+aS50eXBlLl9faXNLZWVwQWxpdmUsZGE9e25hbWU6IktlZXBBbGl2ZSIsX19pc0tlZXBBbGl2ZTohMCxwcm9wczp7aW5jbHVkZTpbU3RyaW5nLFJlZ0V4cCxBcnJheV0sZXhjbHVkZTpbU3RyaW5nLFJlZ0V4cCxBcnJheV0sbWF4OltTdHJpbmcsTnVtYmVyXX0sc2V0dXAoaSxsKXt2YXJ7c2xvdHM6ZH09bCxfPVluKCksQT1fLmN0eDtpZighQS5yZW5kZXJlcilyZXR1cm4oKT0+e3ZhciBfZT1kLmRlZmF1bHQmJmQuZGVmYXVsdCgpO3JldHVybiBfZSYmX2UubGVuZ3RoPT09MT9fZVswXTpfZX07dmFyIEM9bmV3IE1hcCxrPW5ldyBTZXQsTD1udWxsLEg9Xy5zdXNwZW5zZSx7cmVuZGVyZXI6e3A6dGUsbTpnZSx1bTprZSxvOntjcmVhdGVFbGVtZW50OnVlfX19PUEsUGU9dWUoImRpdiIsbnVsbCk7QS5hY3RpdmF0ZT0oX2UsTGUsQWUsRXQsQXQpPT57dmFyIEplPV9lLmNvbXBvbmVudDtnZShfZSxMZSxBZSwwLEgpLHRlKEplLnZub2RlLF9lLExlLEFlLEplLEgsRXQsX2Uuc2xvdFNjb3BlSWRzLEF0KSx1cigoKT0+e0plLmlzRGVhY3RpdmF0ZWQ9ITEsSmUuYSYmaC5pbnZva2VBcnJheUZucyhKZS5hKTt2YXIgeHQ9X2UucHJvcHMmJl9lLnByb3BzLm9uVm5vZGVNb3VudGVkO3h0JiZxcih4dCxKZS5wYXJlbnQsX2UpfSxIKX0sQS5kZWFjdGl2YXRlPV9lPT57dmFyIExlPV9lLmNvbXBvbmVudDtnZShfZSxQZSxudWxsLDEsSCksdXIoKCk9PntMZS5kYSYmaC5pbnZva2VBcnJheUZucyhMZS5kYSk7dmFyIEFlPV9lLnByb3BzJiZfZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO0FlJiZxcihBZSxMZS5wYXJlbnQsX2UpLExlLmlzRGVhY3RpdmF0ZWQ9ITB9LEgpfTtmdW5jdGlvbiBXZShfZSl7Q2koX2UpLGtlKF9lLF8sSCwhMCl9ZnVuY3Rpb24gdXQoX2Upe0MuZm9yRWFjaCgoTGUsQWUpPT57dmFyIEV0PUVvKExlLnR5cGUpO0V0JiYoIV9lfHwhX2UoRXQpKSYmUWUoQWUpfSl9ZnVuY3Rpb24gUWUoX2Upe3ZhciBMZT1DLmdldChfZSk7IUx8fCFkdChMZSxMKT9XZShMZSk6TCYmQ2koTCksQy5kZWxldGUoX2UpLGsuZGVsZXRlKF9lKX1CcigoKT0+W2kuaW5jbHVkZSxpLmV4Y2x1ZGVdLF9lPT57dmFyW0xlLEFlXT1fZTtMZSYmdXQoRXQ9PkxpKExlLEV0KSksQWUmJnV0KEV0PT4hTGkoQWUsRXQpKX0se2ZsdXNoOiJwb3N0IixkZWVwOiEwfSk7dmFyIEllPW51bGwscGU9KCk9PntJZSE9bnVsbCYmQy5zZXQoSWUsRmkoXy5zdWJUcmVlKSl9O3JldHVybiBjcihwZSksZXIocGUpLGRyKCgpPT57Qy5mb3JFYWNoKF9lPT57dmFye3N1YlRyZWU6TGUsc3VzcGVuc2U6QWV9PV8sRXQ9RmkoTGUpO2lmKF9lLnR5cGU9PT1FdC50eXBlJiZfZS5rZXk9PT1FdC5rZXkpe0NpKEV0KTt2YXIgQXQ9RXQuY29tcG9uZW50LmRhO0F0JiZ1cihBdCxBZSk7cmV0dXJufVdlKF9lKX0pfSksKCk9PntpZihJZT1udWxsLCFkLmRlZmF1bHQpcmV0dXJuIG51bGw7dmFyIF9lPWQuZGVmYXVsdCgpLExlPV9lWzBdO2lmKF9lLmxlbmd0aD4xKXJldHVybiBMPW51bGwsX2U7aWYoIXF0KExlKXx8IShMZS5zaGFwZUZsYWcmNCkmJiEoTGUuc2hhcGVGbGFnJjEyOCkpcmV0dXJuIEw9bnVsbCxMZTt2YXIgQWU9RmkoTGUpLEV0PUFlLnR5cGUsQXQ9RW8oRHIoQWUpP0FlLnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTpFdCkse2luY2x1ZGU6SmUsZXhjbHVkZTp4dCxtYXg6TX09aTtpZihKZSYmKCFBdHx8IUxpKEplLEF0KSl8fHh0JiZBdCYmTGkoeHQsQXQpKXJldHVybiBMPUFlLExlO3ZhciBqPUFlLmtleT09bnVsbD9FdDpBZS5rZXksYWU9Qy5nZXQoaik7cmV0dXJuIEFlLmVsJiYoQWU9aWkoQWUpLExlLnNoYXBlRmxhZyYxMjgmJihMZS5zc0NvbnRlbnQ9QWUpKSxJZT1qLGFlPyhBZS5lbD1hZS5lbCxBZS5jb21wb25lbnQ9YWUuY29tcG9uZW50LEFlLnRyYW5zaXRpb24mJmpyKEFlLEFlLnRyYW5zaXRpb24pLEFlLnNoYXBlRmxhZ3w9NTEyLGsuZGVsZXRlKGopLGsuYWRkKGopKTooay5hZGQoaiksTSYmay5zaXplPnBhcnNlSW50KE0sMTApJiZRZShrLnZhbHVlcygpLm5leHQoKS52YWx1ZSkpLEFlLnNoYXBlRmxhZ3w9MjU2LEw9QWUscG8oTGUudHlwZSk/TGU6QWV9fX0sTWk9ZGE7ZnVuY3Rpb24gTGkoaSxsKXtyZXR1cm4gaC5pc0FycmF5KGkpP2kuc29tZShkPT5MaShkLGwpKTpoLmlzU3RyaW5nKGkpP2kuc3BsaXQoIiwiKS5pbmNsdWRlcyhsKTpoLmlzUmVnRXhwKGkpP2kudGVzdChsKTohMX1mdW5jdGlvbiBJbyhpLGwpe0RpKGksImEiLGwpfWZ1bmN0aW9uIEFuKGksbCl7RGkoaSwiZGEiLGwpfWZ1bmN0aW9uIERpKGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnluLF89aS5fX3dkY3x8KGkuX193ZGM9KCk9Pntmb3IodmFyIEM9ZDtDOyl7aWYoQy5pc0RlYWN0aXZhdGVkKXJldHVybjtDPUMucGFyZW50fXJldHVybiBpKCl9KTtpZihJcihsLF8sZCksZClmb3IodmFyIEE9ZC5wYXJlbnQ7QSYmQS5wYXJlbnQ7KWRpKEEucGFyZW50LnZub2RlKSYmWWkoXyxsLGQsQSksQT1BLnBhcmVudH1mdW5jdGlvbiBZaShpLGwsZCxfKXt2YXIgQT1JcihsLGksXywhMCk7bW8oKCk9PntoLnJlbW92ZShfW2xdLEEpfSxkKX1mdW5jdGlvbiBDaShpKXtpLnNoYXBlRmxhZyY9fjI1NixpLnNoYXBlRmxhZyY9fjUxMn1mdW5jdGlvbiBGaShpKXtyZXR1cm4gaS5zaGFwZUZsYWcmMTI4P2kuc3NDb250ZW50Oml9ZnVuY3Rpb24gSXIoaSxsKXt2YXIgZD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06eW4sXz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITE7aWYoZCl7aWYoUi5pc1Jvb3RIb29rKGkpJiZkIT09ZC5yb290JiYoZD1kLnJvb3QsUi5pc1Jvb3RJbW1lZGlhdGVIb29rKGkpKSl7dmFyIEE9ZC5wcm94eTtUdChsLmJpbmQoQSksZCxpLFIuT05fTE9BRD09PWk/W0EuJHBhZ2Uub3B0aW9uc106W10pfXZhcntfX3BhZ2VfY29udGFpbmVyX186Q309ZC5yb290LnZub2RlO0MmJkMub25JbmplY3RIb29rKGkpO3ZhciBrPWRbaV18fChkW2ldPVtdKSxMPWwuX193ZWh8fChsLl9fd2VoPWZ1bmN0aW9uKCl7aWYoIWQuaXNVbm1vdW50ZWQpe0UucGF1c2VUcmFja2luZygpLFpuKGQpO2Zvcih2YXIgSD1hcmd1bWVudHMubGVuZ3RoLHRlPW5ldyBBcnJheShIKSxnZT0wO2dlPEg7Z2UrKyl0ZVtnZV09YXJndW1lbnRzW2dlXTt2YXIga2U9VHQobCxkLGksdGUpO3JldHVybiBUaSgpLEUucmVzZXRUcmFja2luZygpLGtlfX0pO3JldHVybiBfP2sudW5zaGlmdChMKTprLnB1c2goTCksTH19dmFyIHJpPWk9PmZ1bmN0aW9uKGwpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp5bjtyZXR1cm4oIXkuaXNJblNTUkNvbXBvbmVudFNldHVwfHxpPT09InNwIikmJklyKGksZnVuY3Rpb24oKXtyZXR1cm4gbCguLi5hcmd1bWVudHMpfSxkKX0scnI9cmkoImJtIiksY3I9cmkoIm0iKSxxbj1yaSgiYnUiKSxlcj1yaSgidSIpLGRyPXJpKCJidW0iKSxtbz1yaSgidW0iKSxfbz1yaSgic3AiKSxxaT1yaSgicnRnIiksSmk9cmkoInJ0YyIpO2Z1bmN0aW9uIFhvKGkpe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp5bjtJcigiZWMiLGksbCl9ZnVuY3Rpb24gV3IoaSxsKXt2YXIgZD1fbjtpZihkPT09bnVsbClyZXR1cm4gaTtmb3IodmFyIF89VWkoZCl8fGQucHJveHksQT1pLmRpcnN8fChpLmRpcnM9W10pLEM9MDtDPGwubGVuZ3RoO0MrKyl7dmFyW2ssTCxILHRlPWguRU1QVFlfT0JKXT1sW0NdO2smJihoLmlzRnVuY3Rpb24oaykmJihrPXttb3VudGVkOmssdXBkYXRlZDprfSksay5kZWVwJiZNcihMKSxBLnB1c2goe2RpcjprLGluc3RhbmNlOl8sdmFsdWU6TCxvbGRWYWx1ZTp2b2lkIDAsYXJnOkgsbW9kaWZpZXJzOnRlfSkpfXJldHVybiBpfWZ1bmN0aW9uIHlyKGksbCxkLF8pe2Zvcih2YXIgQT1pLmRpcnMsQz1sJiZsLmRpcnMsaz0wO2s8QS5sZW5ndGg7aysrKXt2YXIgTD1BW2tdO0MmJihMLm9sZFZhbHVlPUNba10udmFsdWUpO3ZhciBIPUwuZGlyW19dO0gmJihFLnBhdXNlVHJhY2tpbmcoKSxUdChILGQsOCxbaS5lbCxMLGksbF0pLEUucmVzZXRUcmFja2luZygpKX19dmFyIE5vPSJjb21wb25lbnRzIixCPSJkaXJlY3RpdmVzIjtmdW5jdGlvbiBZKGksbCl7cmV0dXJuIGN0KE5vLGksITAsbCl8fGl9dmFyIHJlPVN5bWJvbCgpO2Z1bmN0aW9uIHhlKGkpe3JldHVybiBoLmlzU3RyaW5nKGkpP2N0KE5vLGksITEpfHxpOml8fHJlfWZ1bmN0aW9uIFplKGkpe3JldHVybiBjdChCLGkpfWZ1bmN0aW9uIGN0KGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLF89X258fHluO2lmKF8pe3ZhciBBPV8udHlwZTtpZihpPT09Tm8pe3ZhciBDPUVvKEEsITEpO2lmKEMmJihDPT09bHx8Qz09PWguY2FtZWxpemUobCl8fEM9PT1oLmNhcGl0YWxpemUoaC5jYW1lbGl6ZShsKSkpKXJldHVybiBBfXZhciBrPVl0KF9baV18fEFbaV0sbCl8fFl0KF8uYXBwQ29udGV4dFtpXSxsKTtyZXR1cm4hayYmZD9BOmt9fWZ1bmN0aW9uIFl0KGksbCl7cmV0dXJuIGkmJihpW2xdfHxpW2guY2FtZWxpemUobCldfHxpW2guY2FwaXRhbGl6ZShoLmNhbWVsaXplKGwpKV0pfWZ1bmN0aW9uIFF0KGksbCxkLF8pe3ZhciBBLEM9ZCYmZFtfXTtpZihoLmlzQXJyYXkoaSl8fGguaXNTdHJpbmcoaSkpe0E9bmV3IEFycmF5KGkubGVuZ3RoKTtmb3IodmFyIGs9MCxMPWkubGVuZ3RoO2s8TDtrKyspQVtrXT1sKGlba10sayx2b2lkIDAsQyYmQ1trXSl9ZWxzZSBpZih0eXBlb2YgaT09Im51bWJlciIpe0E9bmV3IEFycmF5KGkpO2Zvcih2YXIgSD0wO0g8aTtIKyspQVtIXT1sKEgrMSxILHZvaWQgMCxDJiZDW0hdKX1lbHNlIGlmKGguaXNPYmplY3QoaSkpaWYoaVtTeW1ib2wuaXRlcmF0b3JdKUE9QXJyYXkuZnJvbShpLChQZSxXZSk9PmwoUGUsV2Usdm9pZCAwLEMmJkNbV2VdKSk7ZWxzZXt2YXIgdGU9T2JqZWN0LmtleXMoaSk7QT1uZXcgQXJyYXkodGUubGVuZ3RoKTtmb3IodmFyIGdlPTAsa2U9dGUubGVuZ3RoO2dlPGtlO2dlKyspe3ZhciB1ZT10ZVtnZV07QVtnZV09bChpW3VlXSx1ZSxnZSxDJiZDW2dlXSl9fWVsc2UgQT1bXTtyZXR1cm4gZCYmKGRbX109QSksQX1mdW5jdGlvbiBWaShpLGwpe2Zvcih2YXIgZD1mdW5jdGlvbihBKXt2YXIgQz1sW0FdO2lmKGguaXNBcnJheShDKSlmb3IodmFyIGs9MDtrPEMubGVuZ3RoO2srKylpW0Nba10ubmFtZV09Q1trXS5mbjtlbHNlIEMmJihpW0MubmFtZV09Qy5rZXk/ZnVuY3Rpb24oKXt2YXIgTD1DLmZuKC4uLmFyZ3VtZW50cyk7cmV0dXJuIEwmJihMLmtleT1DLmtleSksTH06Qy5mbil9LF89MDtfPGwubGVuZ3RoO18rKylkKF8pO3JldHVybiBpfWZ1bmN0aW9uIEdyKGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9LF89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDAsQT1hcmd1bWVudHMubGVuZ3RoPjQ/YXJndW1lbnRzWzRdOnZvaWQgMDtpZihfbi5pc0NFfHxfbi5wYXJlbnQmJkRyKF9uLnBhcmVudCkmJl9uLnBhcmVudC5pc0NFKXJldHVybiBsIT09ImRlZmF1bHQiJiYoZC5uYW1lPWwpLFp0KCJzbG90IixkLF8mJl8oKSk7dmFyIEM9aVtsXTtDJiZDLl9jJiYoQy5fZD0hMSksbHQoKTt2YXIgaz1DJiZndChDKGQpKSxMPXZuKGVlLHtrZXk6ZC5rZXl8fGsmJmsua2V5fHwiXyIuY29uY2F0KGwpfSxrfHwoXz9fKCk6W10pLGsmJmkuXz09PTE/NjQ6LTIpO3JldHVybiFBJiZMLnNjb3BlSWQmJihMLnNsb3RTY29wZUlkcz1bTC5zY29wZUlkKyItcyJdKSxDJiZDLl9jJiYoQy5fZD0hMCksTH1mdW5jdGlvbiBndChpKXtyZXR1cm4gaS5zb21lKGw9PnF0KGwpPyEobC50eXBlPT09aGV8fGwudHlwZT09PWVlJiYhZ3QobC5jaGlsZHJlbikpOiEwKT9pOm51bGx9ZnVuY3Rpb24gUnQoaSxsKXt2YXIgZD17fTtmb3IodmFyIF8gaW4gaSlkW2wmJi9bQS1aXS8udGVzdChfKT8ib246Ii5jb25jYXQoXyk6aC50b0hhbmRsZXJLZXkoXyldPWlbX107cmV0dXJuIGR9dmFyIFlyPWk9Pmk/dXMoaSk/VWkoaSl8fGkucHJveHk6WXIoaS5wYXJlbnQpOm51bGwsYW89aC5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSx7JDppPT5pLCRlbDppPT5pLnZub2RlLmVsLCRkYXRhOmk9PmkuZGF0YSwkcHJvcHM6aT0+aS5wcm9wcywkYXR0cnM6aT0+aS5hdHRycywkc2xvdHM6aT0+aS5zbG90cywkcmVmczppPT5pLnJlZnMsJHBhcmVudDppPT5ZcihpLnBhcmVudCksJHJvb3Q6aT0+WXIoaS5yb290KSwkZW1pdDppPT5pLmVtaXQsJG9wdGlvbnM6aT0+U3IoaSksJGZvcmNlVXBkYXRlOmk9PmkuZnx8KGkuZj0oKT0+X3IoaS51cGRhdGUpKSwkbmV4dFRpY2s6aT0+aS5ufHwoaS5uPW1yLmJpbmQoaS5wcm94eSkpLCR3YXRjaDppPT5Qby5iaW5kKGkpfSksb2U9KGksbCk9PmkhPT1oLkVNUFRZX09CSiYmIWkuX19pc1NjcmlwdFNldHVwJiZoLmhhc093bihpLGwpLFg9e2dldChpLGwpe3ZhcntfOmR9PWkse2N0eDpfLHNldHVwU3RhdGU6QSxkYXRhOkMscHJvcHM6ayxhY2Nlc3NDYWNoZTpMLHR5cGU6SCxhcHBDb250ZXh0OnRlfT1kLGdlO2lmKGxbMF0hPT0iJCIpe3ZhciBrZT1MW2xdO2lmKGtlIT09dm9pZCAwKXN3aXRjaChrZSl7Y2FzZSAxOnJldHVybiBBW2xdO2Nhc2UgMjpyZXR1cm4gQ1tsXTtjYXNlIDQ6cmV0dXJuIF9bbF07Y2FzZSAzOnJldHVybiBrW2xdfWVsc2V7aWYob2UoQSxsKSlyZXR1cm4gTFtsXT0xLEFbbF07aWYoQyE9PWguRU1QVFlfT0JKJiZoLmhhc093bihDLGwpKXJldHVybiBMW2xdPTIsQ1tsXTtpZigoZ2U9ZC5wcm9wc09wdGlvbnNbMF0pJiZoLmhhc093bihnZSxsKSlyZXR1cm4gTFtsXT0zLGtbbF07aWYoXyE9PWguRU1QVFlfT0JKJiZoLmhhc093bihfLGwpKXJldHVybiBMW2xdPTQsX1tsXTtCZSYmKExbbF09MCl9fXZhciB1ZT1hb1tsXSxQZSxXZTtpZih1ZSlyZXR1cm4gbD09PSIkYXR0cnMiJiZFLnRyYWNrKGQsImdldCIsbCksdWUoZCk7aWYoKFBlPUguX19jc3NNb2R1bGVzKSYmKFBlPVBlW2xdKSlyZXR1cm4gUGU7aWYoXyE9PWguRU1QVFlfT0JKJiZoLmhhc093bihfLGwpKXJldHVybiBMW2xdPTQsX1tsXTtpZihXZT10ZS5jb25maWcuZ2xvYmFsUHJvcGVydGllcyxoLmhhc093bihXZSxsKSlyZXR1cm4gV2VbbF19LHNldChpLGwsZCl7dmFye199PWkse2RhdGE6QSxzZXR1cFN0YXRlOkMsY3R4Omt9PV87cmV0dXJuIG9lKEMsbCk/KENbbF09ZCwhMCk6QSE9PWguRU1QVFlfT0JKJiZoLmhhc093bihBLGwpPyhBW2xdPWQsITApOmguaGFzT3duKF8ucHJvcHMsbCl8fGxbMF09PT0iJCImJmwuc2xpY2UoMSlpbiBfPyExOihrW2xdPWQsITApfSxoYXMoaSxsKXt2YXJ7Xzp7ZGF0YTpkLHNldHVwU3RhdGU6XyxhY2Nlc3NDYWNoZTpBLGN0eDpDLGFwcENvbnRleHQ6ayxwcm9wc09wdGlvbnM6TH19PWksSDtyZXR1cm4hIUFbbF18fGQhPT1oLkVNUFRZX09CSiYmaC5oYXNPd24oZCxsKXx8b2UoXyxsKXx8KEg9TFswXSkmJmguaGFzT3duKEgsbCl8fGguaGFzT3duKEMsbCl8fGguaGFzT3duKGFvLGwpfHxoLmhhc093bihrLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGwpfSxkZWZpbmVQcm9wZXJ0eShpLGwsZCl7cmV0dXJuIGQuZ2V0IT1udWxsP2kuXy5hY2Nlc3NDYWNoZVtsXT0wOmguaGFzT3duKGQsInZhbHVlIikmJnRoaXMuc2V0KGksbCxkLnZhbHVlLG51bGwpLFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoaSxsLGQpfX0sc2U9aC5leHRlbmQoe30sWCx7Z2V0KGksbCl7aWYobCE9PVN5bWJvbC51bnNjb3BhYmxlcylyZXR1cm4gWC5nZXQoaSxsLGkpfSxoYXMoaSxsKXt2YXIgZD1sWzBdIT09Il8iJiYhaC5pc0dsb2JhbGx5V2hpdGVsaXN0ZWQobCk7cmV0dXJuIGR9fSksQmU9ITA7ZnVuY3Rpb24gbXQoaSl7dmFyIGw9U3IoaSksZD1pLnByb3h5LF89aS5jdHg7QmU9ITEsbC5iZWZvcmVDcmVhdGUmJkpuKGwuYmVmb3JlQ3JlYXRlLGksImJjIik7dmFye2RhdGE6QSxjb21wdXRlZDpDLG1ldGhvZHM6ayx3YXRjaDpMLHByb3ZpZGU6SCxpbmplY3Q6dGUsY3JlYXRlZDpnZSxiZWZvcmVNb3VudDprZSxtb3VudGVkOnVlLGJlZm9yZVVwZGF0ZTpQZSx1cGRhdGVkOldlLGFjdGl2YXRlZDp1dCxkZWFjdGl2YXRlZDpRZSxiZWZvcmVEZXN0cm95OkllLGJlZm9yZVVubW91bnQ6cGUsZGVzdHJveWVkOl9lLHVubW91bnRlZDpMZSxyZW5kZXI6QWUscmVuZGVyVHJhY2tlZDpFdCxyZW5kZXJUcmlnZ2VyZWQ6QXQsZXJyb3JDYXB0dXJlZDpKZSxzZXJ2ZXJQcmVmZXRjaDp4dCxleHBvc2U6TSxpbmhlcml0QXR0cnM6aixjb21wb25lbnRzOmFlLGRpcmVjdGl2ZXM6bmUsZmlsdGVyczppZX09bCxWZT1udWxsO2lmKHRlJiZwbih0ZSxfLFZlLGkuYXBwQ29udGV4dC5jb25maWcudW53cmFwSW5qZWN0ZWRSZWYpLGspZm9yKHZhciBydCBpbiBrKXt2YXIgWWU9a1tydF07aC5pc0Z1bmN0aW9uKFllKSYmKF9bcnRdPVllLmJpbmQoZCkpfWlmKEEpe3ZhciBLZT1BLmNhbGwoZCxkKTtoLmlzT2JqZWN0KEtlKSYmKGkuZGF0YT1FLnJlYWN0aXZlKEtlKSl9aWYoQmU9ITAsQyl7dmFyIFVlPWZ1bmN0aW9uKGJuKXt2YXIgU249Q1tibl0sZ3I9aC5pc0Z1bmN0aW9uKFNuKT9Tbi5iaW5kKGQsZCk6aC5pc0Z1bmN0aW9uKFNuLmdldCk/U24uZ2V0LmJpbmQoZCxkKTpoLk5PT1AsYWk9IWguaXNGdW5jdGlvbihTbikmJmguaXNGdW5jdGlvbihTbi5zZXQpP1NuLnNldC5iaW5kKGQpOmguTk9PUCxlbj1kcyh7Z2V0OmdyLHNldDphaX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShfLGJuLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PmVuLnZhbHVlLHNldDpjbj0+ZW4udmFsdWU9Y259KX07Zm9yKHZhciBIdCBpbiBDKVVlKEh0KX1pZihMKWZvcih2YXIgdnQgaW4gTClVbihMW3Z0XSxfLGQsdnQpO2lmKEgpe3ZhciBCdD1oLmlzRnVuY3Rpb24oSCk/SC5jYWxsKGQpOkg7UmVmbGVjdC5vd25LZXlzKEJ0KS5mb3JFYWNoKGJuPT57bHIoYm4sQnRbYm5dKX0pfWdlJiZKbihnZSxpLCJjIik7ZnVuY3Rpb24gTXQoYm4sU24pe2guaXNBcnJheShTbik/U24uZm9yRWFjaChncj0+Ym4oZ3IuYmluZChkKSkpOlNuJiZibihTbi5iaW5kKGQpKX1pZihNdChycixrZSksTXQoY3IsdWUpLE10KHFuLFBlKSxNdChlcixXZSksTXQoSW8sdXQpLE10KEFuLFFlKSxNdChYbyxKZSksTXQoSmksRXQpLE10KHFpLEF0KSxNdChkcixwZSksTXQobW8sTGUpLE10KF9vLHh0KSxoLmlzQXJyYXkoTSkpaWYoTS5sZW5ndGgpe3ZhciBEbj1pLmV4cG9zZWR8fChpLmV4cG9zZWQ9e30pO00uZm9yRWFjaChibj0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShEbixibix7Z2V0OigpPT5kW2JuXSxzZXQ6U249PmRbYm5dPVNufSl9KX1lbHNlIGkuZXhwb3NlZHx8KGkuZXhwb3NlZD17fSk7QWUmJmkucmVuZGVyPT09aC5OT09QJiYoaS5yZW5kZXI9QWUpLGohPW51bGwmJihpLmluaGVyaXRBdHRycz1qKSxhZSYmKGkuY29tcG9uZW50cz1hZSksbmUmJihpLmRpcmVjdGl2ZXM9bmUpO3ZhciBNbj1pLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJGFwcGx5T3B0aW9ucztNbiYmTW4obCxpLGQpfWZ1bmN0aW9uIHBuKGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2guaXNBcnJheShpKSYmKGk9JG4oaSkpO3ZhciBfPWZ1bmN0aW9uKEMpe3ZhciBrPWlbQ10sTD12b2lkIDA7aC5pc09iamVjdChrKT8iZGVmYXVsdCJpbiBrP0w9UW4oay5mcm9tfHxDLGsuZGVmYXVsdCwhMCk6TD1RbihrLmZyb218fEMpOkw9UW4oayksRS5pc1JlZihMKSYmZD9PYmplY3QuZGVmaW5lUHJvcGVydHkobCxDLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PkwudmFsdWUsc2V0Okg9PkwudmFsdWU9SH0pOmxbQ109TH07Zm9yKHZhciBBIGluIGkpXyhBKX1mdW5jdGlvbiBKbihpLGwsZCl7VHQoaC5pc0FycmF5KGkpP2kubWFwKF89Pl8uYmluZChsLnByb3h5KSk6aS5iaW5kKGwucHJveHkpLGwsZCl9ZnVuY3Rpb24gVW4oaSxsLGQsXyl7dmFyIEE9Xy5pbmNsdWRlcygiLiIpP0hyKGQsXyk6KCk9PmRbX107aWYoaC5pc1N0cmluZyhpKSl7dmFyIEM9bFtpXTtoLmlzRnVuY3Rpb24oQykmJkJyKEEsQyl9ZWxzZSBpZihoLmlzRnVuY3Rpb24oaSkpQnIoQSxpLmJpbmQoZCkpO2Vsc2UgaWYoaC5pc09iamVjdChpKSlpZihoLmlzQXJyYXkoaSkpaS5mb3JFYWNoKEw9PlVuKEwsbCxkLF8pKTtlbHNle3ZhciBrPWguaXNGdW5jdGlvbihpLmhhbmRsZXIpP2kuaGFuZGxlci5iaW5kKGQpOmxbaS5oYW5kbGVyXTtoLmlzRnVuY3Rpb24oaykmJkJyKEEsayxpKX19ZnVuY3Rpb24gU3IoaSl7dmFyIGw9aS50eXBlLHttaXhpbnM6ZCxleHRlbmRzOl99PWwse21peGluczpBLG9wdGlvbnNDYWNoZTpDLGNvbmZpZzp7b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOmt9fT1pLmFwcENvbnRleHQsTD1DLmdldChsKSxIO3JldHVybiBMP0g9TDohQS5sZW5ndGgmJiFkJiYhXz9IPWw6KEg9e30sQS5sZW5ndGgmJkEuZm9yRWFjaCh0ZT0+RnIoSCx0ZSxrLCEwKSksRnIoSCxsLGspKSxoLmlzT2JqZWN0KGwpJiZDLnNldChsLEgpLEh9ZnVuY3Rpb24gRnIoaSxsLGQpe3ZhciBfPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSx7bWl4aW5zOkEsZXh0ZW5kczpDfT1sO0MmJkZyKGksQyxkLCEwKSxBJiZBLmZvckVhY2goSD0+RnIoaSxILGQsITApKTtmb3IodmFyIGsgaW4gbClpZighKF8mJms9PT0iZXhwb3NlIikpe3ZhciBMPWJvW2tdfHxkJiZkW2tdO2lba109TD9MKGlba10sbFtrXSk6bFtrXX1yZXR1cm4gaX12YXIgYm89e2RhdGE6a28scHJvcHM6SG4sZW1pdHM6SG4sbWV0aG9kczpIbixjb21wdXRlZDpIbixiZWZvcmVDcmVhdGU6S24sY3JlYXRlZDpLbixiZWZvcmVNb3VudDpLbixtb3VudGVkOktuLGJlZm9yZVVwZGF0ZTpLbix1cGRhdGVkOktuLGJlZm9yZURlc3Ryb3k6S24sYmVmb3JlVW5tb3VudDpLbixkZXN0cm95ZWQ6S24sdW5tb3VudGVkOktuLGFjdGl2YXRlZDpLbixkZWFjdGl2YXRlZDpLbixlcnJvckNhcHR1cmVkOktuLHNlcnZlclByZWZldGNoOktuLGNvbXBvbmVudHM6SG4sZGlyZWN0aXZlczpIbix3YXRjaDpBaSxwcm92aWRlOmtvLGluamVjdDpSb307ZnVuY3Rpb24ga28oaSxsKXtyZXR1cm4gbD9pP2Z1bmN0aW9uKCl7cmV0dXJuIGguZXh0ZW5kKGguaXNGdW5jdGlvbihpKT9pLmNhbGwodGhpcyx0aGlzKTppLGguaXNGdW5jdGlvbihsKT9sLmNhbGwodGhpcyx0aGlzKTpsKX06bDppfWZ1bmN0aW9uIFJvKGksbCl7cmV0dXJuIEhuKCRuKGkpLCRuKGwpKX1mdW5jdGlvbiAkbihpKXtpZihoLmlzQXJyYXkoaSkpe2Zvcih2YXIgbD17fSxkPTA7ZDxpLmxlbmd0aDtkKyspbFtpW2RdXT1pW2RdO3JldHVybiBsfXJldHVybiBpfWZ1bmN0aW9uIEtuKGksbCl7cmV0dXJuIGk/Wy4uLm5ldyBTZXQoW10uY29uY2F0KGksbCkpXTpsfWZ1bmN0aW9uIEhuKGksbCl7cmV0dXJuIGk/aC5leHRlbmQoaC5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxpKSxsKTpsfWZ1bmN0aW9uIEFpKGksbCl7aWYoIWkpcmV0dXJuIGw7aWYoIWwpcmV0dXJuIGk7dmFyIGQ9aC5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxpKTtmb3IodmFyIF8gaW4gbClkW19dPUtuKGlbX10sbFtfXSk7cmV0dXJuIGR9ZnVuY3Rpb24gaXMoaSxsLGQpe3ZhciBfPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxBPXt9LEM9e307aC5kZWYoQyxMbiwxKSxpLnByb3BzRGVmYXVsdHM9T2JqZWN0LmNyZWF0ZShudWxsKSx3cihpLGwsQSxDKTtmb3IodmFyIGsgaW4gaS5wcm9wc09wdGlvbnNbMF0payBpbiBBfHwoQVtrXT12b2lkIDApO2Q/aS5wcm9wcz1fP0E6RS5zaGFsbG93UmVhY3RpdmUoQSk6aS50eXBlLnByb3BzP2kucHJvcHM9QTppLnByb3BzPUMsaS5hdHRycz1DfWZ1bmN0aW9uIGhhKGksbCxkLF8pe3Zhcntwcm9wczpBLGF0dHJzOkMsdm5vZGU6e3BhdGNoRmxhZzprfX09aSxMPUUudG9SYXcoQSksW0hdPWkucHJvcHNPcHRpb25zLHRlPSExO2lmKChffHxrPjApJiYhKGsmMTYpKXtpZihrJjgpZm9yKHZhciBnZT1pLnZub2RlLmR5bmFtaWNQcm9wcyxrZT0wO2tlPGdlLmxlbmd0aDtrZSsrKXt2YXIgdWU9Z2Vba2VdO2lmKCFQbihpLmVtaXRzT3B0aW9ucyx1ZSkpe3ZhciBQZT1sW3VlXTtpZihIKWlmKGguaGFzT3duKEMsdWUpKVBlIT09Q1t1ZV0mJihDW3VlXT1QZSx0ZT0hMCk7ZWxzZXt2YXIgV2U9aC5jYW1lbGl6ZSh1ZSk7QVtXZV09VGEoSCxMLFdlLFBlLGksITEpfWVsc2UgUGUhPT1DW3VlXSYmKENbdWVdPVBlLHRlPSEwKX19fWVsc2V7d3IoaSxsLEEsQykmJih0ZT0hMCk7dmFyIHV0O2Zvcih2YXIgUWUgaW4gTCkoIWx8fCFoLmhhc093bihsLFFlKSYmKCh1dD1oLmh5cGhlbmF0ZShRZSkpPT09UWV8fCFoLmhhc093bihsLHV0KSkpJiYoSD9kJiYoZFtRZV0hPT12b2lkIDB8fGRbdXRdIT09dm9pZCAwKSYmKEFbUWVdPVRhKEgsTCxRZSx2b2lkIDAsaSwhMCkpOmRlbGV0ZSBBW1FlXSk7aWYoQyE9PUwpZm9yKHZhciBJZSBpbiBDKSghbHx8IWguaGFzT3duKGwsSWUpJiYhMCkmJihkZWxldGUgQ1tJZV0sdGU9ITApfXRlJiZFLnRyaWdnZXIoaSwic2V0IiwiJGF0dHJzIil9ZnVuY3Rpb24gd3IoaSxsLGQsXyl7dmFyW0EsQ109aS5wcm9wc09wdGlvbnMsaz0hMSxMO2lmKGwpe2Zvcih2YXIgSCBpbiBsKWlmKCFoLmlzUmVzZXJ2ZWRQcm9wKEgpKXt2YXIgdGU9bFtIXSxnZT12b2lkIDA7QSYmaC5oYXNPd24oQSxnZT1oLmNhbWVsaXplKEgpKT8hQ3x8IUMuaW5jbHVkZXMoZ2UpP2RbZ2VdPXRlOihMfHwoTD17fSkpW2dlXT10ZTpQbihpLmVtaXRzT3B0aW9ucyxIKXx8KCEoSCBpbiBfKXx8dGUhPT1fW0hdKSYmKF9bSF09dGUsaz0hMCl9fWlmKEMpZm9yKHZhciBrZT1FLnRvUmF3KGQpLHVlPUx8fGguRU1QVFlfT0JKLFBlPTA7UGU8Qy5sZW5ndGg7UGUrKyl7dmFyIFdlPUNbUGVdO2RbV2VdPVRhKEEsa2UsV2UsdWVbV2VdLGksIWguaGFzT3duKHVlLFdlKSl9cmV0dXJuIGt9ZnVuY3Rpb24gVGEoaSxsLGQsXyxBLEMpe3ZhciBrPWlbZF07aWYoayE9bnVsbCl7dmFyIEw9aC5oYXNPd24oaywiZGVmYXVsdCIpO2lmKEwmJl89PT12b2lkIDApe3ZhciBIPWsuZGVmYXVsdDtpZihrLnR5cGUhPT1GdW5jdGlvbiYmaC5pc0Z1bmN0aW9uKEgpKXt2YXJ7cHJvcHNEZWZhdWx0czp0ZX09QTtkIGluIHRlP189dGVbZF06KFpuKEEpLF89dGVbZF09SC5jYWxsKG51bGwsbCksVGkoKSl9ZWxzZSBfPUh9a1swXSYmKEMmJiFMP189ITE6a1sxXSYmKF89PT0iInx8Xz09PWguaHlwaGVuYXRlKGQpKSYmKF89ITApKX1yZXR1cm4gX31mdW5jdGlvbiBEYShpLGwpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxfPWwucHJvcHNDYWNoZSxBPV8uZ2V0KGkpO2lmKEEpcmV0dXJuIEE7dmFyIEM9aS5wcm9wcyxrPXt9LEw9W10sSD0hMTtpZighaC5pc0Z1bmN0aW9uKGkpKXt2YXIgdGU9X2U9PntIPSEwO3ZhcltMZSxBZV09RGEoX2UsbCwhMCk7aC5leHRlbmQoayxMZSksQWUmJkwucHVzaCguLi5BZSl9OyFkJiZsLm1peGlucy5sZW5ndGgmJmwubWl4aW5zLmZvckVhY2godGUpLGkuZXh0ZW5kcyYmdGUoaS5leHRlbmRzKSxpLm1peGlucyYmaS5taXhpbnMuZm9yRWFjaCh0ZSl9aWYoIUMmJiFIKXJldHVybiBoLmlzT2JqZWN0KGkpJiZfLnNldChpLGguRU1QVFlfQVJSKSxoLkVNUFRZX0FSUjtpZihoLmlzQXJyYXkoQykpZm9yKHZhciBnZT0wO2dlPEMubGVuZ3RoO2dlKyspe3ZhciBrZT1oLmNhbWVsaXplKENbZ2VdKTtGYShrZSkmJihrW2tlXT1oLkVNUFRZX09CSil9ZWxzZSBpZihDKWZvcih2YXIgdWUgaW4gQyl7dmFyIFBlPWguY2FtZWxpemUodWUpO2lmKEZhKFBlKSl7dmFyIFdlPUNbdWVdLHV0PWtbUGVdPWguaXNBcnJheShXZSl8fGguaXNGdW5jdGlvbihXZSk/e3R5cGU6V2V9Ok9iamVjdC5hc3NpZ24oe30sV2UpO2lmKHV0KXt2YXIgUWU9Z2EoQm9vbGVhbix1dC50eXBlKSxJZT1nYShTdHJpbmcsdXQudHlwZSk7dXRbMF09UWU+LTEsdXRbMV09SWU8MHx8UWU8SWUsKFFlPi0xfHxoLmhhc093bih1dCwiZGVmYXVsdCIpKSYmTC5wdXNoKFBlKX19fXZhciBwZT1bayxMXTtyZXR1cm4gaC5pc09iamVjdChpKSYmXy5zZXQoaSxwZSkscGV9ZnVuY3Rpb24gRmEoaSl7cmV0dXJuIGlbMF0hPT0iJCJ9ZnVuY3Rpb24gVmEoaSl7dmFyIGw9aSYmaS50b1N0cmluZygpLm1hdGNoKC9eXHMqKGZ1bmN0aW9ufGNsYXNzKSAoXHcrKS8pO3JldHVybiBsP2xbMl06aT09PW51bGw/Im51bGwiOiIifWZ1bmN0aW9uIFVhKGksbCl7cmV0dXJuIFZhKGkpPT09VmEobCl9ZnVuY3Rpb24gZ2EoaSxsKXtyZXR1cm4gaC5pc0FycmF5KGwpP2wuZmluZEluZGV4KGQ9PlVhKGQsaSkpOmguaXNGdW5jdGlvbihsKSYmVWEobCxpKT8wOi0xfXZhciBQYT1pPT5pWzBdPT09Il8ifHxpPT09IiRzdGFibGUiLGpuPWk9PmguaXNBcnJheShpKT9pLm1hcChXbik6W1duKGkpXSx4bz0oaSxsLGQpPT57aWYobC5fbilyZXR1cm4gbDt2YXIgXz1KbyhmdW5jdGlvbigpe3JldHVybiBqbihsKC4uLmFyZ3VtZW50cykpfSxkKTtyZXR1cm4gXy5fYz0hMSxffSxRbz0oaSxsLGQpPT57dmFyIF89aS5fY3R4O2Zvcih2YXIgQSBpbiBpKWlmKCFQYShBKSl7dmFyIEM9aVtBXTtoLmlzRnVuY3Rpb24oQyk/bFtBXT14byhBLEMsXyk6QyE9bnVsbCYmZnVuY3Rpb24oKXt2YXIgaz1qbihDKTtsW0FdPSgpPT5rfSgpfX0sS2k9KGksbCk9Pnt2YXIgZD1qbihsKTtpLnNsb3RzLmRlZmF1bHQ9KCk9PmR9LG9zPShpLGwpPT57aWYoaS52bm9kZS5zaGFwZUZsYWcmMzIpe3ZhciBkPWwuXztkPyhpLnNsb3RzPUUudG9SYXcobCksaC5kZWYobCwiXyIsZCkpOlFvKGwsaS5zbG90cz17fSl9ZWxzZSBpLnNsb3RzPXt9LGwmJktpKGksbCk7aC5kZWYoaS5zbG90cyxMbiwxKX0sYXM9KGksbCxkKT0+e3Zhcnt2bm9kZTpfLHNsb3RzOkF9PWksQz0hMCxrPWguRU1QVFlfT0JKO2lmKF8uc2hhcGVGbGFnJjMyKXt2YXIgTD1sLl87TD9kJiZMPT09MT9DPSExOihoLmV4dGVuZChBLGwpLCFkJiZMPT09MSYmZGVsZXRlIEEuXyk6KEM9IWwuJHN0YWJsZSxRbyhsLEEpKSxrPWx9ZWxzZSBsJiYoS2koaSxsKSxrPXtkZWZhdWx0OjF9KTtpZihDKWZvcih2YXIgSCBpbiBBKSFQYShIKSYmIShIIGluIGspJiZkZWxldGUgQVtIXX07ZnVuY3Rpb24gQm8oKXtyZXR1cm57YXBwOm51bGwsY29uZmlnOntpc05hdGl2ZVRhZzpoLk5PLHBlcmZvcm1hbmNlOiExLGdsb2JhbFByb3BlcnRpZXM6e30sb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOnt9LGVycm9ySGFuZGxlcjp2b2lkIDAsd2FybkhhbmRsZXI6dm9pZCAwLGNvbXBpbGVyT3B0aW9uczp7fX0sbWl4aW5zOltdLGNvbXBvbmVudHM6e30sZGlyZWN0aXZlczp7fSxwcm92aWRlczpPYmplY3QuY3JlYXRlKG51bGwpLG9wdGlvbnNDYWNoZTpuZXcgV2Vha01hcCxwcm9wc0NhY2hlOm5ldyBXZWFrTWFwLGVtaXRzQ2FjaGU6bmV3IFdlYWtNYXB9fXZhciBzcz0wO2Z1bmN0aW9uIHNvKGksbCl7cmV0dXJuIGZ1bmN0aW9uKF8pe3ZhciBBPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsO2guaXNGdW5jdGlvbihfKXx8KF89T2JqZWN0LmFzc2lnbih7fSxfKSksQSE9bnVsbCYmIWguaXNPYmplY3QoQSkmJihBPW51bGwpO3ZhciBDPUJvKCksaz1uZXcgU2V0LEw9ITEsSD1DLmFwcD17X3VpZDpzcysrLF9jb21wb25lbnQ6XyxfcHJvcHM6QSxfY29udGFpbmVyOm51bGwsX2NvbnRleHQ6QyxfaW5zdGFuY2U6bnVsbCx2ZXJzaW9uOmRsLGdldCBjb25maWcoKXtyZXR1cm4gQy5jb25maWd9LHNldCBjb25maWcodGUpe30sdXNlKHRlKXtmb3IodmFyIGdlPWFyZ3VtZW50cy5sZW5ndGgsa2U9bmV3IEFycmF5KGdlPjE/Z2UtMTowKSx1ZT0xO3VlPGdlO3VlKyspa2VbdWUtMV09YXJndW1lbnRzW3VlXTtyZXR1cm4gay5oYXModGUpfHwodGUmJmguaXNGdW5jdGlvbih0ZS5pbnN0YWxsKT8oay5hZGQodGUpLHRlLmluc3RhbGwoSCwuLi5rZSkpOmguaXNGdW5jdGlvbih0ZSkmJihrLmFkZCh0ZSksdGUoSCwuLi5rZSkpKSxIfSxtaXhpbih0ZSl7cmV0dXJuIEMubWl4aW5zLmluY2x1ZGVzKHRlKXx8Qy5taXhpbnMucHVzaCh0ZSksSH0sY29tcG9uZW50KHRlLGdlKXtyZXR1cm4gZ2U/KEMuY29tcG9uZW50c1t0ZV09Z2UsSCk6Qy5jb21wb25lbnRzW3RlXX0sZGlyZWN0aXZlKHRlLGdlKXtyZXR1cm4gZ2U/KEMuZGlyZWN0aXZlc1t0ZV09Z2UsSCk6Qy5kaXJlY3RpdmVzW3RlXX0sbW91bnQodGUsZ2Usa2Upe2lmKCFMKXt2YXIgdWU9WnQoXyxBKTtyZXR1cm4gdWUuYXBwQ29udGV4dD1DLGdlJiZsP2wodWUsdGUpOmkodWUsdGUsa2UpLEw9ITAsSC5fY29udGFpbmVyPXRlLHRlLl9fdnVlX2FwcF9fPUgsSC5faW5zdGFuY2U9dWUuY29tcG9uZW50LFVpKHVlLmNvbXBvbmVudCl8fHVlLmNvbXBvbmVudC5wcm94eX19LHVubW91bnQoKXtMJiYoaShudWxsLEguX2NvbnRhaW5lciksZGVsZXRlIEguX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyl9LHByb3ZpZGUodGUsZ2Upe3JldHVybiBDLnByb3ZpZGVzW3RlXT1nZSxIfX07cmV0dXJuIEh9fWZ1bmN0aW9uIGhpKGksbCxkLF8pe3ZhciBBPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMTtpZihoLmlzQXJyYXkoaSkpe2kuZm9yRWFjaCgodXQsUWUpPT5oaSh1dCxsJiYoaC5pc0FycmF5KGwpP2xbUWVdOmwpLGQsXyxBKSk7cmV0dXJufWlmKCEoRHIoXykmJiFBKSl7dmFyIEM9Xy5zaGFwZUZsYWcmND9VaShfLmNvbXBvbmVudCl8fF8uY29tcG9uZW50LnByb3h5Ol8uZWwsaz1BP251bGw6Qyx7aTpMLHI6SH09aSx0ZT1sJiZsLnIsZ2U9TC5yZWZzPT09aC5FTVBUWV9PQko/TC5yZWZzPXt9OkwucmVmcyxrZT1MLnNldHVwU3RhdGU7aWYodGUhPW51bGwmJnRlIT09SCYmKGguaXNTdHJpbmcodGUpPyhnZVt0ZV09bnVsbCxoLmhhc093bihrZSx0ZSkmJihrZVt0ZV09bnVsbCkpOkUuaXNSZWYodGUpJiYodGUudmFsdWU9bnVsbCkpLGguaXNGdW5jdGlvbihIKSlVdChILEwsMTIsW2ssZ2VdKTtlbHNle3ZhciB1ZT1oLmlzU3RyaW5nKEgpLFBlPUUuaXNSZWYoSCk7aWYodWV8fFBlKXt2YXIgV2U9KCk9PntpZihpLmYpe3ZhciB1dD11ZT9oLmhhc093bihrZSxIKT9rZVtIXTpnZVtIXTpILnZhbHVlO0E/aC5pc0FycmF5KHV0KSYmaC5yZW1vdmUodXQsQyk6aC5pc0FycmF5KHV0KT91dC5pbmNsdWRlcyhDKXx8dXQucHVzaChDKTp1ZT8oZ2VbSF09W0NdLGguaGFzT3duKGtlLEgpJiYoa2VbSF09Z2VbSF0pKTooSC52YWx1ZT1bQ10saS5rJiYoZ2VbaS5rXT1ILnZhbHVlKSl9ZWxzZSB1ZT8oZ2VbSF09ayxoLmhhc093bihrZSxIKSYmKGtlW0hdPWspKTpQZSYmKEgudmFsdWU9ayxpLmsmJihnZVtpLmtdPWspKX07az8oV2UuaWQ9LTEsdXIoV2UsZCkpOldlKCl9fX19dmFyIE9pPSExLFppPWk9Pi9zdmcvLnRlc3QoaS5uYW1lc3BhY2VVUkkpJiZpLnRhZ05hbWUhPT0iZm9yZWlnbk9iamVjdCIsZ2k9aT0+aS5ub2RlVHlwZT09PTg7ZnVuY3Rpb24gaHIoaSl7dmFye210OmwscDpkLG86e3BhdGNoUHJvcDpfLGNyZWF0ZVRleHQ6QSxuZXh0U2libGluZzpDLHBhcmVudE5vZGU6ayxyZW1vdmU6TCxpbnNlcnQ6SCxjcmVhdGVDb21tZW50OnRlfX09aSxnZT0oSWUscGUpPT57aWYoIXBlLmhhc0NoaWxkTm9kZXMoKSl7ZChudWxsLEllLHBlKSxqZSgpLHBlLl92bm9kZT1JZTtyZXR1cm59T2k9ITEsa2UocGUuZmlyc3RDaGlsZCxJZSxudWxsLG51bGwsbnVsbCksamUoKSxwZS5fdm5vZGU9SWUsT2kmJmNvbnNvbGUuZXJyb3IoIkh5ZHJhdGlvbiBjb21wbGV0ZWQgYnV0IGNvbnRhaW5zIG1pc21hdGNoZXMuIil9LGtlPWZ1bmN0aW9uKEllLHBlLF9lLExlLEFlKXt2YXIgRXQ9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExLEF0PWdpKEllKSYmSWUuZGF0YT09PSJbIixKZT0oKT0+dXQoSWUscGUsX2UsTGUsQWUsQXQpLHt0eXBlOnh0LHJlZjpNLHNoYXBlRmxhZzpqLHBhdGNoRmxhZzphZX09cGUsbmU9SWUubm9kZVR5cGU7cGUuZWw9SWUsYWU9PT0tMiYmKEV0PSExLHBlLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXIgaWU9bnVsbDtzd2l0Y2goeHQpe2Nhc2UgY2U6bmUhPT0zP3BlLmNoaWxkcmVuPT09IiI/KEgocGUuZWw9QSgiIixJZS5wYXJlbnROb2RlKSxrKEllKSxJZSksaWU9SWUpOmllPUplKCk6KEllLmRhdGEhPT1wZS5jaGlsZHJlbiYmKE9pPSEwLEllLmRhdGE9cGUuY2hpbGRyZW4pLGllPUMoSWUpKTticmVhaztjYXNlIGhlOm5lIT09OHx8QXQ/aWU9SmUoKTppZT1DKEllKTticmVhaztjYXNlIFRlOmlmKEF0JiYoSWU9QyhJZSksbmU9SWUubm9kZVR5cGUpLG5lPT09MXx8bmU9PT0zKXtpZT1JZTtmb3IodmFyIFZlPSFwZS5jaGlsZHJlbi5sZW5ndGgscnQ9MDtydDxwZS5zdGF0aWNDb3VudDtydCsrKVZlJiYocGUuY2hpbGRyZW4rPWllLm5vZGVUeXBlPT09MT9pZS5vdXRlckhUTUw6aWUuZGF0YSkscnQ9PT1wZS5zdGF0aWNDb3VudC0xJiYocGUuYW5jaG9yPWllKSxpZT1DKGllKTtyZXR1cm4gQXQ/QyhpZSk6aWV9ZWxzZSBKZSgpO2JyZWFrO2Nhc2UgZWU6QXQ/aWU9V2UoSWUscGUsX2UsTGUsQWUsRXQpOmllPUplKCk7YnJlYWs7ZGVmYXVsdDppZihqJjEpbmUhPT0xfHxwZS50eXBlLnRvTG93ZXJDYXNlKCkhPT1JZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk/aWU9SmUoKTppZT11ZShJZSxwZSxfZSxMZSxBZSxFdCk7ZWxzZSBpZihqJjYpe3BlLnNsb3RTY29wZUlkcz1BZTt2YXIgWWU9ayhJZSk7aWYobChwZSxZZSxudWxsLF9lLExlLFppKFllKSxFdCksaWU9QXQ/UWUoSWUpOkMoSWUpLGllJiZnaShpZSkmJmllLmRhdGE9PT0idGVsZXBvcnQgZW5kIiYmKGllPUMoaWUpKSxEcihwZSkpe3ZhciBLZTtBdD8oS2U9WnQoZWUpLEtlLmFuY2hvcj1pZT9pZS5wcmV2aW91c1NpYmxpbmc6WWUubGFzdENoaWxkKTpLZT1JZS5ub2RlVHlwZT09PTM/UWkoIiIpOlp0KCJkaXYiKSxLZS5lbD1JZSxwZS5jb21wb25lbnQuc3ViVHJlZT1LZX19ZWxzZSBqJjY0P25lIT09OD9pZT1KZSgpOmllPXBlLnR5cGUuaHlkcmF0ZShJZSxwZSxfZSxMZSxBZSxFdCxpLFBlKTpqJjEyOCYmKGllPXBlLnR5cGUuaHlkcmF0ZShJZSxwZSxfZSxMZSxaaShrKEllKSksQWUsRXQsaSxrZSkpfXJldHVybiBNIT1udWxsJiZoaShNLG51bGwsTGUscGUpLGllfSx1ZT0oSWUscGUsX2UsTGUsQWUsRXQpPT57RXQ9RXR8fCEhcGUuZHluYW1pY0NoaWxkcmVuO3Zhcnt0eXBlOkF0LHByb3BzOkplLHBhdGNoRmxhZzp4dCxzaGFwZUZsYWc6TSxkaXJzOmp9PXBlLGFlPUF0PT09ImlucHV0IiYmanx8QXQ9PT0ib3B0aW9uIjtpZihhZXx8eHQhPT0tMSl7aWYoaiYmeXIocGUsbnVsbCxfZSwiY3JlYXRlZCIpLEplKWlmKGFlfHwhRXR8fHh0JigxNnwzMikpZm9yKHZhciBuZSBpbiBKZSkoYWUmJm5lLmVuZHNXaXRoKCJ2YWx1ZSIpfHxoLmlzT24obmUpJiYhaC5pc1Jlc2VydmVkUHJvcChuZSkpJiZfKEllLG5lLG51bGwsSmVbbmVdLCExLHZvaWQgMCxfZSk7ZWxzZSBKZS5vbkNsaWNrJiZfKEllLCJvbkNsaWNrIixudWxsLEplLm9uQ2xpY2ssITEsdm9pZCAwLF9lKTt2YXIgaWU7aWYoKGllPUplJiZKZS5vblZub2RlQmVmb3JlTW91bnQpJiZxcihpZSxfZSxwZSksaiYmeXIocGUsbnVsbCxfZSwiYmVmb3JlTW91bnQiKSwoKGllPUplJiZKZS5vblZub2RlTW91bnRlZCl8fGopJiZzcigoKT0+e2llJiZxcihpZSxfZSxwZSksaiYmeXIocGUsbnVsbCxfZSwibW91bnRlZCIpfSxMZSksTSYxNiYmIShKZSYmKEplLmlubmVySFRNTHx8SmUudGV4dENvbnRlbnQpKSlmb3IodmFyIFZlPVBlKEllLmZpcnN0Q2hpbGQscGUsSWUsX2UsTGUsQWUsRXQpO1ZlOyl7T2k9ITA7dmFyIHJ0PVZlO1ZlPVZlLm5leHRTaWJsaW5nLEwocnQpfWVsc2UgTSY4JiZJZS50ZXh0Q29udGVudCE9PXBlLmNoaWxkcmVuJiYoT2k9ITAsSWUudGV4dENvbnRlbnQ9cGUuY2hpbGRyZW4pfXJldHVybiBJZS5uZXh0U2libGluZ30sUGU9KEllLHBlLF9lLExlLEFlLEV0LEF0KT0+e0F0PUF0fHwhIXBlLmR5bmFtaWNDaGlsZHJlbjtmb3IodmFyIEplPXBlLmNoaWxkcmVuLHh0PUplLmxlbmd0aCxNPTA7TTx4dDtNKyspe3ZhciBqPUF0P0plW01dOkplW01dPVduKEplW01dKTtpZihJZSlJZT1rZShJZSxqLExlLEFlLEV0LEF0KTtlbHNle2lmKGoudHlwZT09PWNlJiYhai5jaGlsZHJlbiljb250aW51ZTtPaT0hMCxkKG51bGwsaixfZSxudWxsLExlLEFlLFppKF9lKSxFdCl9fXJldHVybiBJZX0sV2U9KEllLHBlLF9lLExlLEFlLEV0KT0+e3ZhcntzbG90U2NvcGVJZHM6QXR9PXBlO0F0JiYoQWU9QWU/QWUuY29uY2F0KEF0KTpBdCk7dmFyIEplPWsoSWUpLHh0PVBlKEMoSWUpLHBlLEplLF9lLExlLEFlLEV0KTtyZXR1cm4geHQmJmdpKHh0KSYmeHQuZGF0YT09PSJdIj9DKHBlLmFuY2hvcj14dCk6KE9pPSEwLEgocGUuYW5jaG9yPXRlKCJdIixKZSksSmUseHQpLHh0KX0sdXQ9KEllLHBlLF9lLExlLEFlLEV0KT0+e2lmKE9pPSEwLHBlLmVsPW51bGwsRXQpZm9yKHZhciBBdD1RZShJZSk7Oyl7dmFyIEplPUMoSWUpO2lmKEplJiZKZSE9PUF0KUwoSmUpO2Vsc2UgYnJlYWt9dmFyIHh0PUMoSWUpLE09ayhJZSk7cmV0dXJuIEwoSWUpLGQobnVsbCxwZSxNLHh0LF9lLExlLFppKE0pLEFlKSx4dH0sUWU9SWU9Pntmb3IodmFyIHBlPTA7SWU7KWlmKEllPUMoSWUpLEllJiZnaShJZSkmJihJZS5kYXRhPT09IlsiJiZwZSsrLEllLmRhdGE9PT0iXSIpKXtpZihwZT09PTApcmV0dXJuIEMoSWUpO3BlLS19cmV0dXJuIEllfTtyZXR1cm5bZ2Usa2VdfXZhciB1cj1zcjtmdW5jdGlvbiAkYShpKXtyZXR1cm4gWGkoaSl9ZnVuY3Rpb24gSGEoaSl7cmV0dXJuIFhpKGksaHIpfWZ1bmN0aW9uIFhpKGksbCl7dmFyIGQ9aC5nZXRHbG9iYWxUaGlzKCk7ZC5fX1ZVRV9fPSEwO3ZhcntpbnNlcnQ6XyxyZW1vdmU6QSxwYXRjaFByb3A6Qyxmb3JjZVBhdGNoUHJvcDprLGNyZWF0ZUVsZW1lbnQ6TCxjcmVhdGVUZXh0OkgsY3JlYXRlQ29tbWVudDp0ZSxzZXRUZXh0OmdlLHNldEVsZW1lbnRUZXh0OmtlLHBhcmVudE5vZGU6dWUsbmV4dFNpYmxpbmc6UGUsc2V0U2NvcGVJZDpXZT1oLk5PT1AsaW5zZXJ0U3RhdGljQ29udGVudDp1dH09aSxRZT1mdW5jdGlvbihxLFEsbWUpe3ZhciBSZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106bnVsbCxNZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxYZT1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06bnVsbCxidD1hcmd1bWVudHMubGVuZ3RoPjYmJmFyZ3VtZW50c1s2XSE9PXZvaWQgMD9hcmd1bWVudHNbNl06ITEsZXQ9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOm51bGwsdHQ9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOiEhUS5keW5hbWljQ2hpbGRyZW47aWYocSE9PVEpe3EmJiFkdChxLFEpJiYoUmU9Z3IocSksTXQocSxNZSxYZSwhMCkscT1udWxsKSxRLnBhdGNoRmxhZz09PS0yJiYodHQ9ITEsUS5keW5hbWljQ2hpbGRyZW49bnVsbCk7dmFye3R5cGU6JGUscmVmOld0LHNoYXBlRmxhZzpGdH09UTtzd2l0Y2goJGUpe2Nhc2UgY2U6SWUocSxRLG1lLFJlKTticmVhaztjYXNlIGhlOnBlKHEsUSxtZSxSZSk7YnJlYWs7Y2FzZSBUZTpxPT1udWxsJiZfZShRLG1lLFJlLGJ0KTticmVhaztjYXNlIGVlOm5lKHEsUSxtZSxSZSxNZSxYZSxidCxldCx0dCk7YnJlYWs7ZGVmYXVsdDpGdCYxP0V0KHEsUSxtZSxSZSxNZSxYZSxidCxldCx0dCk6RnQmNj9pZShxLFEsbWUsUmUsTWUsWGUsYnQsZXQsdHQpOihGdCY2NHx8RnQmMTI4KSYmJGUucHJvY2VzcyhxLFEsbWUsUmUsTWUsWGUsYnQsZXQsdHQsZW4pfVd0IT1udWxsJiZNZSYmaGkoV3QscSYmcS5yZWYsWGUsUXx8cSwhUSl9fSxJZT0ocSxRLG1lLFJlKT0+e2lmKHE9PW51bGwpXyhRLmVsPUgoUS5jaGlsZHJlbixtZSksbWUsUmUpO2Vsc2V7dmFyIE1lPVEuZWw9cS5lbDtRLmNoaWxkcmVuIT09cS5jaGlsZHJlbiYmZ2UoTWUsUS5jaGlsZHJlbil9fSxwZT0ocSxRLG1lLFJlKT0+e3E9PW51bGw/XyhRLmVsPXRlKFEuY2hpbGRyZW58fCIiLG1lKSxtZSxSZSk6US5lbD1xLmVsfSxfZT0ocSxRLG1lLFJlKT0+e1txLmVsLHEuYW5jaG9yXT11dChxLmNoaWxkcmVuLFEsbWUsUmUscS5lbCxxLmFuY2hvcil9LExlPShxLFEsbWUpPT57Zm9yKHZhcntlbDpSZSxhbmNob3I6TWV9PXEsWGU7UmUmJlJlIT09TWU7KVhlPVBlKFJlKSxfKFJlLFEsbWUpLFJlPVhlO18oTWUsUSxtZSl9LEFlPXE9Pntmb3IodmFye2VsOlEsYW5jaG9yOm1lfT1xLFJlO1EmJlEhPT1tZTspUmU9UGUoUSksQShRKSxRPVJlO0EobWUpfSxFdD0ocSxRLG1lLFJlLE1lLFhlLGJ0LGV0LHR0KT0+e2J0PWJ0fHxRLnR5cGU9PT0ic3ZnIixxPT1udWxsP0F0KFEsbWUsUmUsTWUsWGUsYnQsZXQsdHQpOk0ocSxRLE1lLFhlLGJ0LGV0LHR0KX0sQXQ9KHEsUSxtZSxSZSxNZSxYZSxidCxldCk9Pnt2YXIgdHQsJGUse3R5cGU6V3QscHJvcHM6RnQsc2hhcGVGbGFnOkd0LHRyYW5zaXRpb246SW4sZGlyczpLcn09cTtpZih0dD1xLmVsPUwocS50eXBlLFEpLEd0Jjg/a2UodHQscS5jaGlsZHJlbik6R3QmMTYmJnh0KHEuY2hpbGRyZW4sdHQsbnVsbCxSZSxNZSxYZSYmV3QhPT0iZm9yZWlnbk9iamVjdCIsYnQsZXQpLEtyJiZ5cihxLG51bGwsUmUsImNyZWF0ZWQiKSxKZSh0dCxxLHEuc2NvcGVJZCxidCxSZSksRnQpe2Zvcih2YXIgdHIgaW4gRnQpdHIhPT0idmFsdWUiJiYhaC5pc1Jlc2VydmVkUHJvcCh0cikmJkModHQsdHIsbnVsbCxGdFt0cl0sWGUscS5jaGlsZHJlbixSZSxNZSxTbik7InZhbHVlImluIEZ0JiZDKHR0LCJ2YWx1ZSIsbnVsbCxGdC52YWx1ZSksKCRlPUZ0Lm9uVm5vZGVCZWZvcmVNb3VudCkmJnFyKCRlLFJlLHEpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0dCwiX192dWVQYXJlbnRDb21wb25lbnQiLHt2YWx1ZTpSZSxlbnVtZXJhYmxlOiExfSksS3ImJnlyKHEsbnVsbCxSZSwiYmVmb3JlTW91bnQiKTt2YXIgdmk9KCFNZXx8TWUmJiFNZS5wZW5kaW5nQnJhbmNoKSYmSW4mJiFJbi5wZXJzaXN0ZWQ7dmkmJkluLmJlZm9yZUVudGVyKHR0KSxfKHR0LFEsbWUpLCgoJGU9RnQmJkZ0Lm9uVm5vZGVNb3VudGVkKXx8dml8fEtyKSYmdXIoKCk9PnskZSYmcXIoJGUsUmUscSksdmkmJkluLmVudGVyKHR0KSxLciYmeXIocSxudWxsLFJlLCJtb3VudGVkIil9LE1lKX0sSmU9KHEsUSxtZSxSZSxNZSk9PntpZihtZSYmV2UocSxtZSksUmUpZm9yKHZhciBYZT0wO1hlPFJlLmxlbmd0aDtYZSsrKVdlKHEsUmVbWGVdKTtpZihNZSl7dmFyIGJ0PU1lLnN1YlRyZWU7aWYoUT09PWJ0KXt2YXIgZXQ9TWUudm5vZGU7SmUocSxldCxldC5zY29wZUlkLGV0LnNsb3RTY29wZUlkcyxNZS5wYXJlbnQpfX19LHh0PWZ1bmN0aW9uKHEsUSxtZSxSZSxNZSxYZSxidCxldCl7Zm9yKHZhciB0dD1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06MCwkZT10dDskZTxxLmxlbmd0aDskZSsrKXt2YXIgV3Q9cVskZV09ZXQ/TnIocVskZV0pOlduKHFbJGVdKTtRZShudWxsLFd0LFEsbWUsUmUsTWUsWGUsYnQsZXQpfX0sTT0ocSxRLG1lLFJlLE1lLFhlLGJ0KT0+e3ZhciBldD1RLmVsPXEuZWwse3BhdGNoRmxhZzp0dCxkeW5hbWljQ2hpbGRyZW46JGUsZGlyczpXdH09UTt0dHw9cS5wYXRjaEZsYWcmMTY7dmFyIEZ0PXEucHJvcHN8fGguRU1QVFlfT0JKLEd0PVEucHJvcHN8fGguRU1QVFlfT0JKLEluO21lJiZsbyhtZSwhMSksKEluPUd0Lm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZxcihJbixtZSxRLHEpLFd0JiZ5cihRLHEsbWUsImJlZm9yZVVwZGF0ZSIpLG1lJiZsbyhtZSwhMCk7dmFyIEtyPU1lJiZRLnR5cGUhPT0iZm9yZWlnbk9iamVjdCI7aWYoJGU/aihxLmR5bmFtaWNDaGlsZHJlbiwkZSxldCxtZSxSZSxLcixYZSk6YnR8fFVlKHEsUSxldCxudWxsLG1lLFJlLEtyLFhlLCExKSx0dD4wKXtpZih0dCYxNilhZShldCxRLEZ0LEd0LG1lLFJlLE1lKTtlbHNlIGlmKHR0JjImJkZ0LmNsYXNzIT09R3QuY2xhc3MmJkMoZXQsImNsYXNzIixudWxsLEd0LmNsYXNzLE1lKSx0dCY0JiZDKGV0LCJzdHlsZSIsRnQuc3R5bGUsR3Quc3R5bGUsTWUpLHR0JjgpZm9yKHZhciB0cj1RLmR5bmFtaWNQcm9wcyx2aT0wO3ZpPHRyLmxlbmd0aDt2aSsrKXt2YXIgam89dHJbdmldLGVzPUZ0W2pvXSx3cz1HdFtqb107KHdzIT09ZXN8fGpvPT09InZhbHVlInx8ayYmayhldCxqbykpJiZDKGV0LGpvLGVzLHdzLE1lLHEuY2hpbGRyZW4sbWUsUmUsU24pfXR0JjEmJnEuY2hpbGRyZW4hPT1RLmNoaWxkcmVuJiZrZShldCxRLmNoaWxkcmVuKX1lbHNlIWJ0JiYkZT09bnVsbCYmYWUoZXQsUSxGdCxHdCxtZSxSZSxNZSk7KChJbj1HdC5vblZub2RlVXBkYXRlZCl8fFd0KSYmdXIoKCk9PntJbiYmcXIoSW4sbWUsUSxxKSxXdCYmeXIoUSxxLG1lLCJ1cGRhdGVkIil9LFJlKX0saj0ocSxRLG1lLFJlLE1lLFhlLGJ0KT0+e2Zvcih2YXIgZXQ9MDtldDxRLmxlbmd0aDtldCsrKXt2YXIgdHQ9cVtldF0sJGU9UVtldF0sV3Q9dHQuZWwmJih0dC50eXBlPT09ZWV8fCFkdCh0dCwkZSl8fHR0LnNoYXBlRmxhZyYoNnw2NCkpP3VlKHR0LmVsKTptZTtRZSh0dCwkZSxXdCxudWxsLFJlLE1lLFhlLGJ0LCEwKX19LGFlPShxLFEsbWUsUmUsTWUsWGUsYnQpPT57aWYobWUhPT1SZSl7aWYobWUhPT1oLkVNUFRZX09CSilmb3IodmFyIGV0IGluIG1lKSFoLmlzUmVzZXJ2ZWRQcm9wKGV0KSYmIShldCBpbiBSZSkmJkMocSxldCxtZVtldF0sbnVsbCxidCxRLmNoaWxkcmVuLE1lLFhlLFNuKTtmb3IodmFyIHR0IGluIFJlKWlmKCFoLmlzUmVzZXJ2ZWRQcm9wKHR0KSl7dmFyICRlPVJlW3R0XSxXdD1tZVt0dF07KCRlIT09V3QmJnR0IT09InZhbHVlInx8ayYmayhxLHR0KSkmJkMocSx0dCxXdCwkZSxidCxRLmNoaWxkcmVuLE1lLFhlLFNuKX0idmFsdWUiaW4gUmUmJkMocSwidmFsdWUiLG1lLnZhbHVlLFJlLnZhbHVlKX19LG5lPShxLFEsbWUsUmUsTWUsWGUsYnQsZXQsdHQpPT57dmFyICRlPVEuZWw9cT9xLmVsOkgoIiIsbWUpLFd0PVEuYW5jaG9yPXE/cS5hbmNob3I6SCgiIixtZSkse3BhdGNoRmxhZzpGdCxkeW5hbWljQ2hpbGRyZW46R3Qsc2xvdFNjb3BlSWRzOklufT1RO0luJiYoZXQ9ZXQ/ZXQuY29uY2F0KEluKTpJbikscT09bnVsbD8oXygkZSxtZSxSZSksXyhXdCxtZSxSZSkseHQoUS5jaGlsZHJlbixtZSxXdCxNZSxYZSxidCxldCx0dCkpOkZ0PjAmJkZ0JjY0JiZHdCYmcS5keW5hbWljQ2hpbGRyZW4/KGoocS5keW5hbWljQ2hpbGRyZW4sR3QsbWUsTWUsWGUsYnQsZXQpLChRLmtleSE9bnVsbHx8TWUmJlE9PT1NZS5zdWJUcmVlKSYmY28ocSxRLCEwKSk6VWUocSxRLG1lLFd0LE1lLFhlLGJ0LGV0LHR0KX0saWU9KHEsUSxtZSxSZSxNZSxYZSxidCxldCx0dCk9PntRLnNsb3RTY29wZUlkcz1ldCxxPT1udWxsP1Euc2hhcGVGbGFnJjUxMj9NZS5jdHguYWN0aXZhdGUoUSxtZSxSZSxidCx0dCk6VmUoUSxtZSxSZSxNZSxYZSxidCx0dCk6cnQocSxRLHR0KX0sVmU9KHEsUSxtZSxSZSxNZSxYZSxidCk9Pnt2YXIgZXQ9cS5jb21wb25lbnQ9bG4ocSxSZSxNZSk7aWYoZGkocSkmJihldC5jdHgucmVuZGVyZXI9ZW4pLHphKGV0KSxldC5hc3luY0RlcCl7aWYoTWUmJk1lLnJlZ2lzdGVyRGVwKGV0LFllKSwhcS5lbCl7dmFyIHR0PWV0LnN1YlRyZWU9WnQoaGUpO3BlKG51bGwsdHQsUSxtZSl9cmV0dXJufWlmKFllKGV0LHEsUSxtZSxNZSxYZSxidCksZXQuJHd4c01vZHVsZXMpe3ZhciAkZT1SLnJlc29sdmVPd25lckVsKGV0LCEwKTskZS5sZW5ndGgmJiRlLmZvckVhY2goV3Q9PntXdC5zZXRBdHRyaWJ1dGUoUi5BVFRSX1ZfT1dORVJfSUQsZXQudWlkKTt2YXJ7JHJlbmRlcmpzTW9kdWxlczpGdH09ZXQudHlwZTtGdCYmV3Quc2V0QXR0cmlidXRlKFIuQVRUUl9WX1JFTkRFUkpTLEZ0KX0pfX0scnQ9KHEsUSxtZSk9Pnt2YXIgUmU9US5jb21wb25lbnQ9cS5jb21wb25lbnQ7aWYocm8ocSxRLG1lKSlpZihSZS5hc3luY0RlcCYmIVJlLmFzeW5jUmVzb2x2ZWQpe0tlKFJlLFEsbWUpO3JldHVybn1lbHNlIFJlLm5leHQ9USxRcihSZS51cGRhdGUpLFJlLnVwZGF0ZSgpO2Vsc2UgUS5lbD1xLmVsLFJlLnZub2RlPVF9LFllPShxLFEsbWUsUmUsTWUsWGUsYnQpPT57dmFyIGV0PSgpPT57aWYocS5pc01vdW50ZWQpe3ZhcntuZXh0OmlyLGJ1OlJhLHU6Q3MscGFyZW50OnRvLHZub2RlOnpvfT1xLGhvPWlyLF9hO2xvKHEsITEpLGlyPyhpci5lbD16by5lbCxLZShxLGlyLGJ0KSk6aXI9em8sUmEmJmguaW52b2tlQXJyYXlGbnMoUmEpLChfYT1pci5wcm9wcyYmaXIucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJnFyKF9hLHRvLGlyLHpvKSxsbyhxLCEwKTt2YXIgdHM9UmkocSksbGE9cS5zdWJUcmVlO3Euc3ViVHJlZT10cyxRZShsYSx0cyx1ZShsYS5lbCksZ3IobGEpLHEsTWUsWGUpLGlyLmVsPXRzLmVsLGhvPT09bnVsbCYmbGkocSx0cy5lbCksQ3MmJnVyKENzLE1lKSwoX2E9aXIucHJvcHMmJmlyLnByb3BzLm9uVm5vZGVVcGRhdGVkKSYmdXIoKCk9PnFyKF9hLHRvLGlyLHpvKSxNZSl9ZWxzZXt2YXIgV3Qse2VsOkZ0LHByb3BzOkd0fT1RLHtibTpJbixtOktyLHBhcmVudDp0cn09cSx2aT1EcihRKTtpZihsbyhxLCExKSxJbiYmaC5pbnZva2VBcnJheUZucyhJbiksIXZpJiYoV3Q9R3QmJkd0Lm9uVm5vZGVCZWZvcmVNb3VudCkmJnFyKFd0LHRyLFEpLGxvKHEsITApLEZ0JiZmbyl7dmFyIGpvPSgpPT57cS5zdWJUcmVlPVJpKHEpLGZvKEZ0LHEuc3ViVHJlZSxxLE1lLG51bGwpfTt2aT9RLnR5cGUuX19hc3luY0xvYWRlcigpLnRoZW4oKCk9PiFxLmlzVW5tb3VudGVkJiZqbygpKTpqbygpfWVsc2V7dmFyIGVzPXEuc3ViVHJlZT1SaShxKTtRZShudWxsLGVzLG1lLFJlLHEsTWUsWGUpLFEuZWw9ZXMuZWx9aWYoS3ImJnVyKEtyLE1lKSwhdmkmJihXdD1HdCYmR3Qub25Wbm9kZU1vdW50ZWQpKXt2YXIgd3M9UTt1cigoKT0+cXIoV3QsdHIsd3MpLE1lKX0oUS5zaGFwZUZsYWcmMjU2fHx0ciYmRHIodHIudm5vZGUpJiZ0ci52bm9kZS5zaGFwZUZsYWcmMjU2KSYmcS5hJiZ1cihxLmEsTWUpLHEuaXNNb3VudGVkPSEwLFE9bWU9UmU9bnVsbH19LHR0PXEuZWZmZWN0PW5ldyBFLlJlYWN0aXZlRWZmZWN0KGV0LCgpPT5fcigkZSkscS5zY29wZSksJGU9cS51cGRhdGU9KCk9PnR0LnJ1bigpOyRlLmlkPXEudWlkLGxvKHEsITApLCRlKCl9LEtlPShxLFEsbWUpPT57US5jb21wb25lbnQ9cTt2YXIgUmU9cS52bm9kZS5wcm9wcztxLnZub2RlPVEscS5uZXh0PW51bGwsaGEocSxRLnByb3BzLFJlLG1lKSxhcyhxLFEuY2hpbGRyZW4sbWUpLEUucGF1c2VUcmFja2luZygpLGtuKCksRS5yZXNldFRyYWNraW5nKCl9LFVlPWZ1bmN0aW9uKHEsUSxtZSxSZSxNZSxYZSxidCxldCl7dmFyIHR0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTohMSwkZT1xJiZxLmNoaWxkcmVuLFd0PXE/cS5zaGFwZUZsYWc6MCxGdD1RLmNoaWxkcmVuLHtwYXRjaEZsYWc6R3Qsc2hhcGVGbGFnOklufT1RO2lmKEd0PjApe2lmKEd0JjEyOCl7dnQoJGUsRnQsbWUsUmUsTWUsWGUsYnQsZXQsdHQpO3JldHVybn1lbHNlIGlmKEd0JjI1Nil7SHQoJGUsRnQsbWUsUmUsTWUsWGUsYnQsZXQsdHQpO3JldHVybn19SW4mOD8oV3QmMTYmJlNuKCRlLE1lLFhlKSxGdCE9PSRlJiZrZShtZSxGdCkpOld0JjE2P0luJjE2P3Z0KCRlLEZ0LG1lLFJlLE1lLFhlLGJ0LGV0LHR0KTpTbigkZSxNZSxYZSwhMCk6KFd0JjgmJmtlKG1lLCIiKSxJbiYxNiYmeHQoRnQsbWUsUmUsTWUsWGUsYnQsZXQsdHQpKX0sSHQ9KHEsUSxtZSxSZSxNZSxYZSxidCxldCx0dCk9PntxPXF8fGguRU1QVFlfQVJSLFE9UXx8aC5FTVBUWV9BUlI7dmFyICRlPXEubGVuZ3RoLFd0PVEubGVuZ3RoLEZ0PU1hdGgubWluKCRlLFd0KSxHdDtmb3IoR3Q9MDtHdDxGdDtHdCsrKXt2YXIgSW49UVtHdF09dHQ/TnIoUVtHdF0pOlduKFFbR3RdKTtRZShxW0d0XSxJbixtZSxudWxsLE1lLFhlLGJ0LGV0LHR0KX0kZT5XdD9TbihxLE1lLFhlLCEwLCExLEZ0KTp4dChRLG1lLFJlLE1lLFhlLGJ0LGV0LHR0LEZ0KX0sdnQ9KHEsUSxtZSxSZSxNZSxYZSxidCxldCx0dCk9Pntmb3IodmFyICRlPTAsV3Q9US5sZW5ndGgsRnQ9cS5sZW5ndGgtMSxHdD1XdC0xOyRlPD1GdCYmJGU8PUd0Oyl7dmFyIEluPXFbJGVdLEtyPVFbJGVdPXR0P05yKFFbJGVdKTpXbihRWyRlXSk7aWYoZHQoSW4sS3IpKVFlKEluLEtyLG1lLG51bGwsTWUsWGUsYnQsZXQsdHQpO2Vsc2UgYnJlYWs7JGUrK31mb3IoOyRlPD1GdCYmJGU8PUd0Oyl7dmFyIHRyPXFbRnRdLHZpPVFbR3RdPXR0P05yKFFbR3RdKTpXbihRW0d0XSk7aWYoZHQodHIsdmkpKVFlKHRyLHZpLG1lLG51bGwsTWUsWGUsYnQsZXQsdHQpO2Vsc2UgYnJlYWs7RnQtLSxHdC0tfWlmKCRlPkZ0KXtpZigkZTw9R3QpZm9yKHZhciBqbz1HdCsxLGVzPWpvPFd0P1Fbam9dLmVsOlJlOyRlPD1HdDspUWUobnVsbCxRWyRlXT10dD9OcihRWyRlXSk6V24oUVskZV0pLG1lLGVzLE1lLFhlLGJ0LGV0LHR0KSwkZSsrfWVsc2UgaWYoJGU+R3QpZm9yKDskZTw9RnQ7KU10KHFbJGVdLE1lLFhlLCEwKSwkZSsrO2Vsc2V7dmFyIHdzPSRlLGlyPSRlLFJhPW5ldyBNYXA7Zm9yKCRlPWlyOyRlPD1HdDskZSsrKXt2YXIgQ3M9UVskZV09dHQ/TnIoUVskZV0pOlduKFFbJGVdKTtDcy5rZXkhPW51bGwmJlJhLnNldChDcy5rZXksJGUpfXZhciB0byx6bz0wLGhvPUd0LWlyKzEsX2E9ITEsdHM9MCxsYT1uZXcgQXJyYXkoaG8pO2ZvcigkZT0wOyRlPGhvOyRlKyspbGFbJGVdPTA7Zm9yKCRlPXdzOyRlPD1GdDskZSsrKXt2YXIgY2E9cVskZV07aWYoem8+PWhvKXtNdChjYSxNZSxYZSwhMCk7Y29udGludWV9dmFyIFdvPXZvaWQgMDtpZihjYS5rZXkhPW51bGwpV289UmEuZ2V0KGNhLmtleSk7ZWxzZSBmb3IodG89aXI7dG88PUd0O3RvKyspaWYobGFbdG8taXJdPT09MCYmZHQoY2EsUVt0b10pKXtXbz10bzticmVha31Xbz09PXZvaWQgMD9NdChjYSxNZSxYZSwhMCk6KGxhW1dvLWlyXT0kZSsxLFdvPj10cz90cz1XbzpfYT0hMCxRZShjYSxRW1dvXSxtZSxudWxsLE1lLFhlLGJ0LGV0LHR0KSx6bysrKX12YXIgRWw9X2E/bHMobGEpOmguRU1QVFlfQVJSO2Zvcih0bz1FbC5sZW5ndGgtMSwkZT1oby0xOyRlPj0wOyRlLS0pe3ZhciBZcz1pciskZSxiYz1RW1lzXSxXbD1ZcysxPFd0P1FbWXMrMV0uZWw6UmU7bGFbJGVdPT09MD9RZShudWxsLGJjLG1lLFdsLE1lLFhlLGJ0LGV0LHR0KTpfYSYmKHRvPDB8fCRlIT09RWxbdG9dP0J0KGJjLG1lLFdsLDIpOnRvLS0pfX19LEJ0PWZ1bmN0aW9uKHEsUSxtZSxSZSl7dmFyIE1lPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLHtlbDpYZSx0eXBlOmJ0LHRyYW5zaXRpb246ZXQsY2hpbGRyZW46dHQsc2hhcGVGbGFnOiRlfT1xO2lmKCRlJjYpe0J0KHEuY29tcG9uZW50LnN1YlRyZWUsUSxtZSxSZSk7cmV0dXJufWlmKCRlJjEyOCl7cS5zdXNwZW5zZS5tb3ZlKFEsbWUsUmUpO3JldHVybn1pZigkZSY2NCl7YnQubW92ZShxLFEsbWUsZW4pO3JldHVybn1pZihidD09PWVlKXtfKFhlLFEsbWUpO2Zvcih2YXIgV3Q9MDtXdDx0dC5sZW5ndGg7V3QrKylCdCh0dFtXdF0sUSxtZSxSZSk7XyhxLmFuY2hvcixRLG1lKTtyZXR1cm59aWYoYnQ9PT1UZSl7TGUocSxRLG1lKTtyZXR1cm59dmFyIEZ0PVJlIT09MiYmJGUmMSYmZXQ7aWYoRnQpaWYoUmU9PT0wKWV0LmJlZm9yZUVudGVyKFhlKSxfKFhlLFEsbWUpLHVyKCgpPT5ldC5lbnRlcihYZSksTWUpO2Vsc2V7dmFye2xlYXZlOkd0LGRlbGF5TGVhdmU6SW4sYWZ0ZXJMZWF2ZTpLcn09ZXQsdHI9KCk9Pl8oWGUsUSxtZSksdmk9KCk9PntHdChYZSwoKT0+e3RyKCksS3ImJktyKCl9KX07SW4/SW4oWGUsdHIsdmkpOnZpKCl9ZWxzZSBfKFhlLFEsbWUpfSxNdD1mdW5jdGlvbihxLFEsbWUpe3ZhciBSZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsTWU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLHt0eXBlOlhlLHByb3BzOmJ0LHJlZjpldCxjaGlsZHJlbjp0dCxkeW5hbWljQ2hpbGRyZW46JGUsc2hhcGVGbGFnOld0LHBhdGNoRmxhZzpGdCxkaXJzOkd0fT1xO2lmKGV0IT1udWxsJiZoaShldCxudWxsLG1lLHEsITApLFd0JjI1Nil7US5jdHguZGVhY3RpdmF0ZShxKTtyZXR1cm59dmFyIEluPVd0JjEmJkd0LEtyPSFEcihxKSx0cjtpZihLciYmKHRyPWJ0JiZidC5vblZub2RlQmVmb3JlVW5tb3VudCkmJnFyKHRyLFEscSksV3QmNilibihxLmNvbXBvbmVudCxtZSxSZSk7ZWxzZXtpZihXdCYxMjgpe3Euc3VzcGVuc2UudW5tb3VudChtZSxSZSk7cmV0dXJufUluJiZ5cihxLG51bGwsUSwiYmVmb3JlVW5tb3VudCIpLFd0JjY0P3EudHlwZS5yZW1vdmUocSxRLG1lLE1lLGVuLFJlKTokZSYmKFhlIT09ZWV8fEZ0PjAmJkZ0JjY0KT9TbigkZSxRLG1lLCExLCEwKTooWGU9PT1lZSYmRnQmKDEyOHwyNTYpfHwhTWUmJld0JjE2KSYmU24odHQsUSxtZSksUmUmJkRuKHEpfShLciYmKHRyPWJ0JiZidC5vblZub2RlVW5tb3VudGVkKXx8SW4pJiZ1cigoKT0+e3RyJiZxcih0cixRLHEpLEluJiZ5cihxLG51bGwsUSwidW5tb3VudGVkIil9LG1lKX0sRG49cT0+e3Zhcnt0eXBlOlEsZWw6bWUsYW5jaG9yOlJlLHRyYW5zaXRpb246TWV9PXE7aWYoUT09PWVlKXtNbihtZSxSZSk7cmV0dXJufWlmKFE9PT1UZSl7QWUocSk7cmV0dXJufXZhciBYZT0oKT0+e0EobWUpLE1lJiYhTWUucGVyc2lzdGVkJiZNZS5hZnRlckxlYXZlJiZNZS5hZnRlckxlYXZlKCl9O2lmKHEuc2hhcGVGbGFnJjEmJk1lJiYhTWUucGVyc2lzdGVkKXt2YXJ7bGVhdmU6YnQsZGVsYXlMZWF2ZTpldH09TWUsdHQ9KCk9PmJ0KG1lLFhlKTtldD9ldChxLmVsLFhlLHR0KTp0dCgpfWVsc2UgWGUoKX0sTW49KHEsUSk9Pntmb3IodmFyIG1lO3EhPT1ROyltZT1QZShxKSxBKHEpLHE9bWU7QShRKX0sYm49KHEsUSxtZSk9Pnt2YXJ7YnVtOlJlLHNjb3BlOk1lLHVwZGF0ZTpYZSxzdWJUcmVlOmJ0LHVtOmV0fT1xO1JlJiZoLmludm9rZUFycmF5Rm5zKFJlKSxNZS5zdG9wKCksWGUmJihYZS5hY3RpdmU9ITEsTXQoYnQscSxRLG1lKSksZXQmJnVyKGV0LFEpLHVyKCgpPT57cS5pc1VubW91bnRlZD0hMH0sUSksUSYmUS5wZW5kaW5nQnJhbmNoJiYhUS5pc1VubW91bnRlZCYmcS5hc3luY0RlcCYmIXEuYXN5bmNSZXNvbHZlZCYmcS5zdXNwZW5zZUlkPT09US5wZW5kaW5nSWQmJihRLmRlcHMtLSxRLmRlcHM9PT0wJiZRLnJlc29sdmUoKSl9LFNuPWZ1bmN0aW9uKHEsUSxtZSl7Zm9yKHZhciBSZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsTWU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLFhlPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTowLGJ0PVhlO2J0PHEubGVuZ3RoO2J0KyspTXQocVtidF0sUSxtZSxSZSxNZSl9LGdyPXE9PnEuc2hhcGVGbGFnJjY/Z3IocS5jb21wb25lbnQuc3ViVHJlZSk6cS5zaGFwZUZsYWcmMTI4P3Euc3VzcGVuc2UubmV4dCgpOlBlKHEuYW5jaG9yfHxxLmVsKSxhaT0ocSxRLG1lKT0+e3E9PW51bGw/US5fdm5vZGUmJk10KFEuX3Zub2RlLG51bGwsbnVsbCwhMCk6UWUoUS5fdm5vZGV8fG51bGwscSxRLG51bGwsbnVsbCxudWxsLG1lKSxrbigpLGplKCksUS5fdm5vZGU9cX0sZW49e3A6UWUsdW06TXQsbTpCdCxyOkRuLG10OlZlLG1jOnh0LHBjOlVlLHBiYzpqLG46Z3IsbzppfSxjbixmbztyZXR1cm4gbCYmKFtjbixmb109bChlbikpLHtyZW5kZXI6YWksaHlkcmF0ZTpjbixjcmVhdGVBcHA6c28oYWksY24pfX1mdW5jdGlvbiBsbyhpLGwpe3ZhcntlZmZlY3Q6ZCx1cGRhdGU6X309aTtkLmFsbG93UmVjdXJzZT1fLmFsbG93UmVjdXJzZT1sfWZ1bmN0aW9uIGNvKGksbCl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLF89aS5jaGlsZHJlbixBPWwuY2hpbGRyZW47aWYoaC5pc0FycmF5KF8pJiZoLmlzQXJyYXkoQSkpZm9yKHZhciBDPTA7QzxfLmxlbmd0aDtDKyspe3ZhciBrPV9bQ10sTD1BW0NdO0wuc2hhcGVGbGFnJjEmJiFMLmR5bmFtaWNDaGlsZHJlbiYmKChMLnBhdGNoRmxhZzw9MHx8TC5wYXRjaEZsYWc9PT0zMikmJihMPUFbQ109TnIoQVtDXSksTC5lbD1rLmVsKSxkfHxjbyhrLEwpKSxMLnR5cGU9PT1jZSYmKEwuZWw9ay5lbCl9fWZ1bmN0aW9uIGxzKGkpe3ZhciBsPWkuc2xpY2UoKSxkPVswXSxfLEEsQyxrLEwsSD1pLmxlbmd0aDtmb3IoXz0wO188SDtfKyspe3ZhciB0ZT1pW19dO2lmKHRlIT09MCl7aWYoQT1kW2QubGVuZ3RoLTFdLGlbQV08dGUpe2xbX109QSxkLnB1c2goXyk7Y29udGludWV9Zm9yKEM9MCxrPWQubGVuZ3RoLTE7QzxrOylMPUMraz4+MSxpW2RbTF1dPHRlP0M9TCsxOms9TDt0ZTxpW2RbQ11dJiYoQz4wJiYobFtfXT1kW0MtMV0pLGRbQ109Xyl9fWZvcihDPWQubGVuZ3RoLGs9ZFtDLTFdO0MtLSA+MDspZFtDXT1rLGs9bFtrXTtyZXR1cm4gZH12YXIgcGE9aT0+aS5fX2lzVGVsZXBvcnQsTW89aT0+aSYmKGkuZGlzYWJsZWR8fGkuZGlzYWJsZWQ9PT0iIiksdmE9aT0+dHlwZW9mIFNWR0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgU1ZHRWxlbWVudCx2PShpLGwpPT57dmFyIGQ9aSYmaS50bztpZihoLmlzU3RyaW5nKGQpKWlmKGwpe3ZhciBfPWwoZCk7cmV0dXJuIF99ZWxzZSByZXR1cm4gbnVsbDtlbHNlIHJldHVybiBkfSx4PXtfX2lzVGVsZXBvcnQ6ITAscHJvY2VzcyhpLGwsZCxfLEEsQyxrLEwsSCx0ZSl7dmFye21jOmdlLHBjOmtlLHBiYzp1ZSxvOntpbnNlcnQ6UGUscXVlcnlTZWxlY3RvcjpXZSxjcmVhdGVUZXh0OnV0LGNyZWF0ZUNvbW1lbnQ6UWV9fT10ZSxJZT1NbyhsLnByb3BzKSx7c2hhcGVGbGFnOnBlLGNoaWxkcmVuOl9lLGR5bmFtaWNDaGlsZHJlbjpMZX09bDtpZihpPT1udWxsKXt2YXIgQWU9bC5lbD11dCgiIixkKSxFdD1sLmFuY2hvcj11dCgiIixkKTtQZShBZSxkLF8pLFBlKEV0LGQsXyk7dmFyIEF0PWwudGFyZ2V0PXYobC5wcm9wcyxXZSksSmU9bC50YXJnZXRBbmNob3I9dXQoIiIsZCk7QXQmJihQZShKZSxBdCksaz1rfHx2YShBdCkpO3ZhciB4dD0oWWUsS2UpPT57cGUmMTYmJmdlKF9lLFllLEtlLEEsQyxrLEwsSCl9O0llP3h0KGQsRXQpOkF0JiZ4dChBdCxKZSl9ZWxzZXtsLmVsPWkuZWw7dmFyIE09bC5hbmNob3I9aS5hbmNob3Isaj1sLnRhcmdldD1pLnRhcmdldCxhZT1sLnRhcmdldEFuY2hvcj1pLnRhcmdldEFuY2hvcixuZT1NbyhpLnByb3BzKSxpZT1uZT9kOmosVmU9bmU/TTphZTtpZihrPWt8fHZhKGopLExlPyh1ZShpLmR5bmFtaWNDaGlsZHJlbixMZSxpZSxBLEMsayxMKSxjbyhpLGwsITApKTpIfHxrZShpLGwsaWUsVmUsQSxDLGssTCwhMSksSWUpbmV8fCQobCxkLE0sdGUsMSk7ZWxzZSBpZigobC5wcm9wcyYmbC5wcm9wcy50bykhPT0oaS5wcm9wcyYmaS5wcm9wcy50bykpe3ZhciBydD1sLnRhcmdldD12KGwucHJvcHMsV2UpO3J0JiYkKGwscnQsbnVsbCx0ZSwwKX1lbHNlIG5lJiYkKGwsaixhZSx0ZSwxKX1KKGwpfSxyZW1vdmUoaSxsLGQsXyxBLEMpe3Zhcnt1bTprLG86e3JlbW92ZTpMfX09QSx7c2hhcGVGbGFnOkgsY2hpbGRyZW46dGUsYW5jaG9yOmdlLHRhcmdldEFuY2hvcjprZSx0YXJnZXQ6dWUscHJvcHM6UGV9PWk7aWYodWUmJkwoa2UpLChDfHwhTW8oUGUpKSYmKEwoZ2UpLEgmMTYpKWZvcih2YXIgV2U9MDtXZTx0ZS5sZW5ndGg7V2UrKyl7dmFyIHV0PXRlW1dlXTtrKHV0LGwsZCwhMCwhIXV0LmR5bmFtaWNDaGlsZHJlbil9fSxtb3ZlOiQsaHlkcmF0ZTpVfTtmdW5jdGlvbiAkKGksbCxkLF8pe3ZhcntvOntpbnNlcnQ6QX0sbTpDfT1fLGs9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOjI7az09PTAmJkEoaS50YXJnZXRBbmNob3IsbCxkKTt2YXJ7ZWw6TCxhbmNob3I6SCxzaGFwZUZsYWc6dGUsY2hpbGRyZW46Z2UscHJvcHM6a2V9PWksdWU9az09PTI7aWYodWUmJkEoTCxsLGQpLCghdWV8fE1vKGtlKSkmJnRlJjE2KWZvcih2YXIgUGU9MDtQZTxnZS5sZW5ndGg7UGUrKylDKGdlW1BlXSxsLGQsMik7dWUmJkEoSCxsLGQpfWZ1bmN0aW9uIFUoaSxsLGQsXyxBLEMsayxMKXt2YXJ7bzp7bmV4dFNpYmxpbmc6SCxwYXJlbnROb2RlOnRlLHF1ZXJ5U2VsZWN0b3I6Z2V9fT1rLGtlPWwudGFyZ2V0PXYobC5wcm9wcyxnZSk7aWYoa2Upe3ZhciB1ZT1rZS5fbHBhfHxrZS5maXJzdENoaWxkO2lmKGwuc2hhcGVGbGFnJjE2KWlmKE1vKGwucHJvcHMpKWwuYW5jaG9yPUwoSChpKSxsLHRlKGkpLGQsXyxBLEMpLGwudGFyZ2V0QW5jaG9yPXVlO2Vsc2V7bC5hbmNob3I9SChpKTtmb3IodmFyIFBlPXVlO1BlOylpZihQZT1IKFBlKSxQZSYmUGUubm9kZVR5cGU9PT04JiZQZS5kYXRhPT09InRlbGVwb3J0IGFuY2hvciIpe2wudGFyZ2V0QW5jaG9yPVBlLGtlLl9scGE9bC50YXJnZXRBbmNob3ImJkgobC50YXJnZXRBbmNob3IpO2JyZWFrfUwodWUsbCxrZSxkLF8sQSxDKX1KKGwpfXJldHVybiBsLmFuY2hvciYmSChsLmFuY2hvcil9dmFyIFo9eDtmdW5jdGlvbiBKKGkpe3ZhciBsPWkuY3R4O2lmKGwmJmwudXQpe2Zvcih2YXIgZD1pLmNoaWxkcmVuWzBdLmVsO2QhPT1pLnRhcmdldEFuY2hvcjspZC5ub2RlVHlwZT09PTEmJmQuc2V0QXR0cmlidXRlKCJkYXRhLXYtb3duZXIiLGwudWlkKSxkPWQubmV4dFNpYmxpbmc7bC51dCgpfX12YXIgZWU9U3ltYm9sKHZvaWQgMCksY2U9U3ltYm9sKHZvaWQgMCksaGU9U3ltYm9sKHZvaWQgMCksVGU9U3ltYm9sKHZvaWQgMCksZmU9W10sd2U9bnVsbDtmdW5jdGlvbiBsdCgpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTohMTtmZS5wdXNoKHdlPWk/bnVsbDpbXSl9ZnVuY3Rpb24gcHQoKXtmZS5wb3AoKSx3ZT1mZVtmZS5sZW5ndGgtMV18fG51bGx9dmFyIGp0PTE7ZnVuY3Rpb24geXQoaSl7anQrPWl9ZnVuY3Rpb24gSGUoaSl7cmV0dXJuIGkuZHluYW1pY0NoaWxkcmVuPWp0PjA/d2V8fGguRU1QVFlfQVJSOm51bGwscHQoKSxqdD4wJiZ3ZSYmd2UucHVzaChpKSxpfWZ1bmN0aW9uIER0KGksbCxkLF8sQSxDKXtyZXR1cm4gSGUoJHQoaSxsLGQsXyxBLEMsITApKX1mdW5jdGlvbiB2bihpLGwsZCxfLEEpe3JldHVybiBIZShadChpLGwsZCxfLEEsITApKX1mdW5jdGlvbiBxdChpKXtyZXR1cm4gaT9pLl9fdl9pc1ZOb2RlPT09ITA6ITF9ZnVuY3Rpb24gZHQoaSxsKXtyZXR1cm4gaS50eXBlPT09bC50eXBlJiZpLmtleT09PWwua2V5fWZ1bmN0aW9uIHJuKGkpe312YXIgTG49Il9fdkludGVybmFsIixKdD1pPT57dmFye2tleTpsfT1pO3JldHVybiBsIT1udWxsP2w6bnVsbH0senQ9aT0+e3ZhcntyZWY6bCxyZWZfa2V5OmQscmVmX2ZvcjpffT1pO3JldHVybiBsIT1udWxsP2guaXNTdHJpbmcobCl8fEUuaXNSZWYobCl8fGguaXNGdW5jdGlvbihsKT97aTpfbixyOmwsazpkLGY6ISFffTpsOm51bGx9O2Z1bmN0aW9uICR0KGkpe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsLGQ9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwsXz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxBPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLEM9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOmk9PT1lZT8wOjEsaz1hcmd1bWVudHMubGVuZ3RoPjYmJmFyZ3VtZW50c1s2XSE9PXZvaWQgMD9hcmd1bWVudHNbNl06ITEsTD1hcmd1bWVudHMubGVuZ3RoPjcmJmFyZ3VtZW50c1s3XSE9PXZvaWQgMD9hcmd1bWVudHNbN106ITEsSD17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTppLHByb3BzOmwsa2V5OmwmJkp0KGwpLHJlZjpsJiZ6dChsKSxzY29wZUlkOmJyLHNsb3RTY29wZUlkczpudWxsLGNoaWxkcmVuOmQsY29tcG9uZW50Om51bGwsc3VzcGVuc2U6bnVsbCxzc0NvbnRlbnQ6bnVsbCxzc0ZhbGxiYWNrOm51bGwsZGlyczpudWxsLHRyYW5zaXRpb246bnVsbCxlbDpudWxsLGFuY2hvcjpudWxsLHRhcmdldDpudWxsLHRhcmdldEFuY2hvcjpudWxsLHN0YXRpY0NvdW50OjAsc2hhcGVGbGFnOkMscGF0Y2hGbGFnOl8sZHluYW1pY1Byb3BzOkEsZHluYW1pY0NoaWxkcmVuOm51bGwsYXBwQ29udGV4dDpudWxsLGN0eDpfbn07cmV0dXJuIEw/KEduKEgsZCksQyYxMjgmJmkubm9ybWFsaXplKEgpKTpkJiYoSC5zaGFwZUZsYWd8PWguaXNTdHJpbmcoZCk/ODoxNiksanQ+MCYmIWsmJndlJiYoSC5wYXRjaEZsYWc+MHx8QyY2KSYmSC5wYXRjaEZsYWchPT0zMiYmd2UucHVzaChIKSxIfXZhciBadD1lYTtmdW5jdGlvbiBlYShpKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbCxkPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsLF89YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOjAsQT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxDPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTohMTtpZigoIWl8fGk9PT1yZSkmJihpPWhlKSxxdChpKSl7dmFyIGs9aWkoaSxsLCEwKTtyZXR1cm4gZCYmR24oayxkKSxqdD4wJiYhQyYmd2UmJihrLnNoYXBlRmxhZyY2P3dlW3dlLmluZGV4T2YoaSldPWs6d2UucHVzaChrKSksay5wYXRjaEZsYWd8PS0yLGt9aWYoeW8oaSkmJihpPWkuX192Y2NPcHRzKSxsKXtsPXBpKGwpO3ZhcntjbGFzczpMLHN0eWxlOkh9PWw7TCYmIWguaXNTdHJpbmcoTCkmJihsLmNsYXNzPWgubm9ybWFsaXplQ2xhc3MoTCkpLGguaXNPYmplY3QoSCkmJihFLmlzUHJveHkoSCkmJiFoLmlzQXJyYXkoSCkmJihIPWguZXh0ZW5kKHt9LEgpKSxsLnN0eWxlPWgubm9ybWFsaXplU3R5bGUoSCkpfXZhciB0ZT1oLmlzU3RyaW5nKGkpPzE6cG8oaSk/MTI4OnBhKGkpPzY0OmguaXNPYmplY3QoaSk/NDpoLmlzRnVuY3Rpb24oaSk/MjowO3JldHVybiAkdChpLGwsZCxfLEEsdGUsQywhMCl9ZnVuY3Rpb24gcGkoaSl7cmV0dXJuIGk/RS5pc1Byb3h5KGkpfHxMbiBpbiBpP2guZXh0ZW5kKHt9LGkpOmk6bnVsbH1mdW5jdGlvbiBpaShpLGwpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSx7cHJvcHM6XyxyZWY6QSxwYXRjaEZsYWc6QyxjaGlsZHJlbjprfT1pLEw9bD9DcihffHx7fSxsKTpfLEg9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6aS50eXBlLHByb3BzOkwsa2V5OkwmJkp0KEwpLHJlZjpsJiZsLnJlZj9kJiZBP2guaXNBcnJheShBKT9BLmNvbmNhdCh6dChsKSk6W0EsenQobCldOnp0KGwpOkEsc2NvcGVJZDppLnNjb3BlSWQsc2xvdFNjb3BlSWRzOmkuc2xvdFNjb3BlSWRzLGNoaWxkcmVuOmssdGFyZ2V0OmkudGFyZ2V0LHRhcmdldEFuY2hvcjppLnRhcmdldEFuY2hvcixzdGF0aWNDb3VudDppLnN0YXRpY0NvdW50LHNoYXBlRmxhZzppLnNoYXBlRmxhZyxwYXRjaEZsYWc6bCYmaS50eXBlIT09ZWU/Qz09PS0xPzE2OkN8MTY6QyxkeW5hbWljUHJvcHM6aS5keW5hbWljUHJvcHMsZHluYW1pY0NoaWxkcmVuOmkuZHluYW1pY0NoaWxkcmVuLGFwcENvbnRleHQ6aS5hcHBDb250ZXh0LGRpcnM6aS5kaXJzLHRyYW5zaXRpb246aS50cmFuc2l0aW9uLGNvbXBvbmVudDppLmNvbXBvbmVudCxzdXNwZW5zZTppLnN1c3BlbnNlLHNzQ29udGVudDppLnNzQ29udGVudCYmaWkoaS5zc0NvbnRlbnQpLHNzRmFsbGJhY2s6aS5zc0ZhbGxiYWNrJiZpaShpLnNzRmFsbGJhY2spLGVsOmkuZWwsYW5jaG9yOmkuYW5jaG9yLGN0eDppLmN0eCxjZTppLmNlfTtyZXR1cm4gSH1mdW5jdGlvbiBRaSgpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiICIsbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MDtyZXR1cm4gWnQoY2UsbnVsbCxpLGwpfWZ1bmN0aW9uIGphKGksbCl7dmFyIGQ9WnQoVGUsbnVsbCxpKTtyZXR1cm4gZC5zdGF0aWNDb3VudD1sLGR9ZnVuY3Rpb24gem4oKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06IiIsbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGw/KGx0KCksdm4oaGUsbnVsbCxpKSk6WnQoaGUsbnVsbCxpKX1mdW5jdGlvbiBXbihpKXtyZXR1cm4gaT09bnVsbHx8dHlwZW9mIGk9PSJib29sZWFuIj9adChoZSk6aC5pc0FycmF5KGkpP1p0KGVlLG51bGwsaS5zbGljZSgpKTp0eXBlb2YgaT09Im9iamVjdCI/TnIoaSk6WnQoY2UsbnVsbCxTdHJpbmcoaSkpfWZ1bmN0aW9uIE5yKGkpe3JldHVybiBpLmVsPT09bnVsbCYmaS5wYXRjaEZsYWchPT0tMXx8aS5tZW1vP2k6aWkoaSl9ZnVuY3Rpb24gR24oaSxsKXt2YXIgZD0wLHtzaGFwZUZsYWc6X309aTtpZihsPT1udWxsKWw9bnVsbDtlbHNlIGlmKGguaXNBcnJheShsKSlkPTE2O2Vsc2UgaWYodHlwZW9mIGw9PSJvYmplY3QiKWlmKF8mKDF8NjQpKXt2YXIgQT1sLmRlZmF1bHQ7QSYmKEEuX2MmJihBLl9kPSExKSxHbihpLEEoKSksQS5fYyYmKEEuX2Q9ITApKTtyZXR1cm59ZWxzZXtkPTMyO3ZhciBDPWwuXzshQyYmIShMbiBpbiBsKT9sLl9jdHg9X246Qz09PTMmJl9uJiYoX24uc2xvdHMuXz09PTE/bC5fPTE6KGwuXz0yLGkucGF0Y2hGbGFnfD0xMDI0KSl9ZWxzZSBoLmlzRnVuY3Rpb24obCk/KGw9e2RlZmF1bHQ6bCxfY3R4Ol9ufSxkPTMyKToobD1TdHJpbmcobCksXyY2ND8oZD0xNixsPVtRaShsKV0pOmQ9OCk7aS5jaGlsZHJlbj1sLGkuc2hhcGVGbGFnfD1kfWZ1bmN0aW9uIENyKCl7Zm9yKHZhciBpPXt9LGw9MDtsPGFyZ3VtZW50cy5sZW5ndGg7bCsrKXt2YXIgZD1sPDB8fGFyZ3VtZW50cy5sZW5ndGg8PWw/dm9pZCAwOmFyZ3VtZW50c1tsXTtmb3IodmFyIF8gaW4gZClpZihfPT09ImNsYXNzIilpLmNsYXNzIT09ZC5jbGFzcyYmKGkuY2xhc3M9aC5ub3JtYWxpemVDbGFzcyhbaS5jbGFzcyxkLmNsYXNzXSkpO2Vsc2UgaWYoXz09PSJzdHlsZSIpaS5zdHlsZT1oLm5vcm1hbGl6ZVN0eWxlKFtpLnN0eWxlLGQuc3R5bGVdKTtlbHNlIGlmKGguaXNPbihfKSl7dmFyIEE9aVtfXSxDPWRbX107QyYmQSE9PUMmJiEoaC5pc0FycmF5KEEpJiZBLmluY2x1ZGVzKEMpKSYmKGlbX109QT9bXS5jb25jYXQoQSxDKTpDKX1lbHNlIF8hPT0iIiYmKGlbX109ZFtfXSl9cmV0dXJuIGl9ZnVuY3Rpb24gcXIoaSxsLGQpe3ZhciBfPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO1R0KGksbCw3LFtkLF9dKX12YXIgdGE9Qm8oKSxjcz0wO2Z1bmN0aW9uIGxuKGksbCxkKXt2YXIgXz1pLnR5cGUsQT0obD9sLmFwcENvbnRleHQ6aS5hcHBDb250ZXh0KXx8dGEsQz17dWlkOmNzKyssdm5vZGU6aSx0eXBlOl8scGFyZW50OmwsYXBwQ29udGV4dDpBLHJvb3Q6bnVsbCxuZXh0Om51bGwsc3ViVHJlZTpudWxsLGVmZmVjdDpudWxsLHVwZGF0ZTpudWxsLHNjb3BlOm5ldyBFLkVmZmVjdFNjb3BlKCEwKSxyZW5kZXI6bnVsbCxwcm94eTpudWxsLGV4cG9zZWQ6bnVsbCxleHBvc2VQcm94eTpudWxsLHdpdGhQcm94eTpudWxsLHByb3ZpZGVzOmw/bC5wcm92aWRlczpPYmplY3QuY3JlYXRlKEEucHJvdmlkZXMpLGFjY2Vzc0NhY2hlOm51bGwscmVuZGVyQ2FjaGU6W10sY29tcG9uZW50czpudWxsLGRpcmVjdGl2ZXM6bnVsbCxwcm9wc09wdGlvbnM6RGEoXyxBKSxlbWl0c09wdGlvbnM6Vm4oXyxBKSxlbWl0Om51bGwsZW1pdHRlZDpudWxsLHByb3BzRGVmYXVsdHM6aC5FTVBUWV9PQkosaW5oZXJpdEF0dHJzOl8uaW5oZXJpdEF0dHJzLGN0eDpoLkVNUFRZX09CSixkYXRhOmguRU1QVFlfT0JKLHByb3BzOmguRU1QVFlfT0JKLGF0dHJzOmguRU1QVFlfT0JKLHNsb3RzOmguRU1QVFlfT0JKLHJlZnM6aC5FTVBUWV9PQkosc2V0dXBTdGF0ZTpoLkVNUFRZX09CSixzZXR1cENvbnRleHQ6bnVsbCxzdXNwZW5zZTpkLHN1c3BlbnNlSWQ6ZD9kLnBlbmRpbmdJZDowLGFzeW5jRGVwOm51bGwsYXN5bmNSZXNvbHZlZDohMSxpc01vdW50ZWQ6ITEsaXNVbm1vdW50ZWQ6ITEsaXNEZWFjdGl2YXRlZDohMSxiYzpudWxsLGM6bnVsbCxibTpudWxsLG06bnVsbCxidTpudWxsLHU6bnVsbCx1bTpudWxsLGJ1bTpudWxsLGRhOm51bGwsYTpudWxsLHJ0ZzpudWxsLHJ0YzpudWxsLGVjOm51bGwsc3A6bnVsbH07cmV0dXJuIEMuY3R4PXtfOkN9LEMucm9vdD1sP2wucm9vdDpDLEMuZW1pdD1hci5iaW5kKG51bGwsQyksaS5jZSYmaS5jZShDKSxDfXZhciB5bj1udWxsLFluPSgpPT55bnx8X24sWm49aT0+e3luPWksaS5zY29wZS5vbigpfSxUaT0oKT0+e3luJiZ5bi5zY29wZS5vZmYoKSx5bj1udWxsfTtmdW5jdGlvbiB1cyhpKXtyZXR1cm4gaS52bm9kZS5zaGFwZUZsYWcmNH15LmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMTtmdW5jdGlvbiB6YShpKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7eS5pc0luU1NSQ29tcG9uZW50U2V0dXA9bDt2YXJ7cHJvcHM6ZCxjaGlsZHJlbjpffT1pLnZub2RlLEE9dXMoaSk7aXMoaSxkLEEsbCksb3MoaSxfKTt2YXIgQz1BP0lhKGksbCk6dm9pZCAwO3JldHVybiB5LmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMSxDfWZ1bmN0aW9uIElhKGksbCl7dmFyIGQ9aS50eXBlO2kuYWNjZXNzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSxpLnByb3h5PUUubWFya1JhdyhuZXcgUHJveHkoaS5jdHgsWCkpO3ZhcntzZXR1cDpffT1kO2lmKF8pe3ZhciBBPWkuc2V0dXBDb250ZXh0PV8ubGVuZ3RoPjE/TG8oaSk6bnVsbDtabihpKSxFLnBhdXNlVHJhY2tpbmcoKTt2YXIgQz1VdChfLGksMCxbaS5wcm9wcyxBXSk7aWYoRS5yZXNldFRyYWNraW5nKCksVGkoKSxoLmlzUHJvbWlzZShDKSl7aWYoQy50aGVuKFRpLFRpKSxsKXJldHVybiBDLnRoZW4oaz0+e25hKGksayxsKX0pLmNhdGNoKGs9PntQKGssaSwwKX0pO2kuYXN5bmNEZXA9Q31lbHNlIG5hKGksQyxsKX1lbHNlIEdhKGksbCl9ZnVuY3Rpb24gbmEoaSxsLGQpe2guaXNGdW5jdGlvbihsKT9pLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/aS5zc3JSZW5kZXI9bDppLnJlbmRlcj1sOmguaXNPYmplY3QobCkmJihpLnNldHVwU3RhdGU9RS5wcm94eVJlZnMobCkpLEdhKGksZCl9dmFyIHVvLFdhO2Z1bmN0aW9uIGZzKGkpe3VvPWksV2E9bD0+e2wucmVuZGVyLl9yYyYmKGwud2l0aFByb3h5PW5ldyBQcm94eShsLmN0eCxzZSkpfX12YXIgSnI9KCk9PiF1bztmdW5jdGlvbiBHYShpLGwsZCl7dmFyIF89aS50eXBlO2lmKCFpLnJlbmRlcil7aWYoIWwmJnVvJiYhXy5yZW5kZXIpe3ZhciBBPV8udGVtcGxhdGV8fFNyKGkpLnRlbXBsYXRlO2lmKEEpe3Zhcntpc0N1c3RvbUVsZW1lbnQ6Qyxjb21waWxlck9wdGlvbnM6a309aS5hcHBDb250ZXh0LmNvbmZpZyx7ZGVsaW1pdGVyczpMLGNvbXBpbGVyT3B0aW9uczpIfT1fLHRlPWguZXh0ZW5kKGguZXh0ZW5kKHtpc0N1c3RvbUVsZW1lbnQ6QyxkZWxpbWl0ZXJzOkx9LGspLEgpO18ucmVuZGVyPXVvKEEsdGUpfX1pLnJlbmRlcj1fLnJlbmRlcnx8aC5OT09QLFdhJiZXYShpKX1abihpKSxFLnBhdXNlVHJhY2tpbmcoKSxtdChpKSxFLnJlc2V0VHJhY2tpbmcoKSxUaSgpfWZ1bmN0aW9uIFlhKGkpe3JldHVybiBuZXcgUHJveHkoaS5hdHRycyx7Z2V0KGwsZCl7cmV0dXJuIEUudHJhY2soaSwiZ2V0IiwiJGF0dHJzIiksbFtkXX19KX1mdW5jdGlvbiBMbyhpKXt2YXIgbD1fPT57aS5leHBvc2VkPV98fHt9fSxkO3JldHVybntnZXQgYXR0cnMoKXtyZXR1cm4gZHx8KGQ9WWEoaSkpfSxzbG90czppLnNsb3RzLGVtaXQ6aS5lbWl0LGV4cG9zZTpsfX1mdW5jdGlvbiBVaShpKXtpZihpLmV4cG9zZWQpcmV0dXJuIGkuZXhwb3NlUHJveHl8fChpLmV4cG9zZVByb3h5PW5ldyBQcm94eShFLnByb3h5UmVmcyhFLm1hcmtSYXcoaS5leHBvc2VkKSkse2dldChsLGQpe2lmKGQgaW4gbClyZXR1cm4gbFtkXTtpZihkIGluIGFvKXJldHVybiBhb1tkXShpKX0saGFzKGwsZCl7cmV0dXJuIGQgaW4gbHx8ZCBpbiBhb319KSl9ZnVuY3Rpb24gRW8oaSl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiBoLmlzRnVuY3Rpb24oaSk/aS5kaXNwbGF5TmFtZXx8aS5uYW1lOmkubmFtZXx8bCYmaS5fX25hbWV9ZnVuY3Rpb24geW8oaSl7cmV0dXJuIGguaXNGdW5jdGlvbihpKSYmIl9fdmNjT3B0cyJpbiBpfXZhciBkcz0oaSxsKT0+RS5jb21wdXRlZChpLGwseS5pc0luU1NSQ29tcG9uZW50U2V0dXApO2Z1bmN0aW9uIERvKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24geHMoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBocyhpKXt9ZnVuY3Rpb24gQnMoaSxsKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBOZSgpe3JldHVybiBJdCgpLnNsb3RzfWZ1bmN0aW9uIGt0KCl7cmV0dXJuIEl0KCkuYXR0cnN9ZnVuY3Rpb24gSXQoKXt2YXIgaT1ZbigpO3JldHVybiBpLnNldHVwQ29udGV4dHx8KGkuc2V0dXBDb250ZXh0PUxvKGkpKX1mdW5jdGlvbiBPbihpLGwpe3ZhciBkPWguaXNBcnJheShpKT9pLnJlZHVjZSgoQyxrKT0+KENba109e30sQykse30pOmk7Zm9yKHZhciBfIGluIGwpe3ZhciBBPWRbX107QT9oLmlzQXJyYXkoQSl8fGguaXNGdW5jdGlvbihBKT9kW19dPXt0eXBlOkEsZGVmYXVsdDpsW19dfTpBLmRlZmF1bHQ9bFtfXTpBPT09bnVsbCYmKGRbX109e2RlZmF1bHQ6bFtfXX0pfXJldHVybiBkfWZ1bmN0aW9uIEFyKGksbCl7dmFyIGQ9e30sXz1mdW5jdGlvbihDKXtsLmluY2x1ZGVzKEMpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCxDLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+aVtDXX0pfTtmb3IodmFyIEEgaW4gaSlfKEEpO3JldHVybiBkfWZ1bmN0aW9uIFBpKGkpe3ZhciBsPVluKCksZD1pKCk7cmV0dXJuIFRpKCksaC5pc1Byb21pc2UoZCkmJihkPWQuY2F0Y2goXz0+e3Rocm93IFpuKGwpLF99KSksW2QsKCk9PlpuKGwpXX1mdW5jdGlvbiBlbyhpLGwsZCl7dmFyIF89YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gXz09PTI/aC5pc09iamVjdChsKSYmIWguaXNBcnJheShsKT9xdChsKT9adChpLG51bGwsW2xdKTpadChpLGwpOlp0KGksbnVsbCxsKTooXz4zP2Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpOl89PT0zJiZxdChkKSYmKGQ9W2RdKSxadChpLGwsZCkpfXZhciBGbz1TeW1ib2woIiIpLE5hPSgpPT57e3ZhciBpPVFuKEZvKTtyZXR1cm4gaX19O2Z1bmN0aW9uIHJhKCl7fWZ1bmN0aW9uIGdzKGksbCxkLF8pe3ZhciBBPWRbX107aWYoQSYmcHMoQSxpKSlyZXR1cm4gQTt2YXIgQz1sKCk7cmV0dXJuIEMubWVtbz1pLnNsaWNlKCksZFtfXT1DfWZ1bmN0aW9uIHBzKGksbCl7dmFyIGQ9aS5tZW1vO2lmKGQubGVuZ3RoIT1sLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIF89MDtfPGQubGVuZ3RoO18rKylpZihoLmhhc0NoYW5nZWQoZFtfXSxsW19dKSlyZXR1cm4hMTtyZXR1cm4ganQ+MCYmd2UmJndlLnB1c2goaSksITB9dmFyIGRsPSIzLjIuNDciLCRsPXtjcmVhdGVDb21wb25lbnRJbnN0YW5jZTpsbixzZXR1cENvbXBvbmVudDp6YSxyZW5kZXJDb21wb25lbnRSb290OlJpLHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTplaSxpc1ZOb2RlOnF0LG5vcm1hbGl6ZVZOb2RlOldufSxIbD0kbCxNcz1udWxsLFZvPW51bGw7ZnVuY3Rpb24gVW8oaSxsKXtyZXR1cm4gaT09PSJpbnB1dCI/bmV3IFIuVW5pSW5wdXRFbGVtZW50KGksbCk6aT09PSJ0ZXh0YXJlYSI/bmV3IFIuVW5pVGV4dEFyZWFFbGVtZW50KGksbCk6bmV3IFIuVW5pRWxlbWVudChpLGwpfWZ1bmN0aW9uIGlhKGksbCl7cmV0dXJuIG5ldyBSLlVuaVRleHROb2RlKGksbCl9ZnVuY3Rpb24gcWEoaSxsKXtyZXR1cm4gbmV3IFIuVW5pQ29tbWVudE5vZGUoaSxsKX12YXIgdnMsJG89e2luc2VydDooaSxsLGQpPT57bC5pbnNlcnRCZWZvcmUoaSxkfHxudWxsKX0scmVtb3ZlOmk9Pnt2YXIgbD1pLnBhcmVudE5vZGU7bCYmbC5yZW1vdmVDaGlsZChpKX0sY3JlYXRlRWxlbWVudDooaSxsKT0+VW8oaSxsKSxjcmVhdGVUZXh0OihpLGwpPT5pYShpLGwpLGNyZWF0ZUNvbW1lbnQ6KGksbCk9PnFhKGksbCksc2V0VGV4dDooaSxsKT0+e2kubm9kZVZhbHVlPWx9LHNldEVsZW1lbnRUZXh0OihpLGwpPT57aS50ZXh0Q29udGVudD1sfSxwYXJlbnROb2RlOmk9PmkucGFyZW50Tm9kZSxuZXh0U2libGluZzppPT5pLm5leHRTaWJsaW5nLHNldFNjb3BlSWQoaSxsKXtpLnNldEF0dHJpYnV0ZShsLCIiKX0sY2xvbmVOb2RlKGkpe3ZhciBsPWkuY2xvbmVOb2RlKCEwKTtyZXR1cm4iX3ZhbHVlImluIGkmJihsLl92YWx1ZT1pLl92YWx1ZSksbH0saW5zZXJ0U3RhdGljQ29udGVudChpLGwsZCl7dmFyIF89dnN8fCh2cz1VbygiZGl2IikpO18uaW5uZXJIVE1MPWk7Zm9yKHZhciBBPV8uZmlyc3RDaGlsZCxDPUEsaz1DO0M7KWs9Qywkby5pbnNlcnQoQyxsLGQpLEM9Xy5maXJzdENoaWxkO3JldHVybltBLGtdfX07ZnVuY3Rpb24gTHMoaSxsKXtsPT1udWxsJiYobD0iIiksaS5zZXRBdHRyaWJ1dGUoImNsYXNzIixsKX1mdW5jdGlvbiBqbChpLGwsZCl7aWYoIWQpaS5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7ZWxzZSBpZihoLmlzU3RyaW5nKGQpKWwhPT1kJiZpLnNldEF0dHJpYnV0ZSgic3R5bGUiLGQpO2Vsc2V7dmFyIF89e30sQT1sJiYhaC5pc1N0cmluZyhsKTtpZihBKXtmb3IodmFyIEMgaW4gbClkW0NdPT1udWxsJiYoX1tDXT0iIik7Zm9yKHZhciBrIGluIGQpe3ZhciBMPWRba107TCE9PWxba10mJihfW2tdPUwpfX1lbHNlIGZvcih2YXIgSCBpbiBkKV9bSF09ZFtIXTtPYmplY3Qua2V5cyhfKS5sZW5ndGgmJmkuc2V0QXR0cmlidXRlKCJzdHlsZSIsXyl9fWZ1bmN0aW9uIERzKGksbCxkKXtkPT1udWxsP2kucmVtb3ZlQXR0cmlidXRlKGwpOmkuc2V0QXR0cmlidXRlKGwsZCl9ZnVuY3Rpb24gbXMoaSxsLGQsXyl7aS5hZGRFdmVudExpc3RlbmVyKGwsZCxfKX1mdW5jdGlvbiBobChpLGwsZCxfKXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIobCxkLF8pfWZ1bmN0aW9uIEZzKGksbCxkLF8pe3ZhciBBPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLEM9aS5fdmVpfHwoaS5fdmVpPXt9KSxrPUNbbF07aWYoXyYmaylrLnZhbHVlPV87ZWxzZXt2YXJbTCxIXT1fcyhsKTtpZihfKXt2YXIgdGU9Q1tsXT1WcyhfLEEpO21zKGksTCx0ZSxIKX1lbHNlIGsmJihobChpLEwsayxIKSxDW2xdPXZvaWQgMCl9fXZhciBKYT0vKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87ZnVuY3Rpb24gX3MoaSl7dmFyIGw7aWYoSmEudGVzdChpKSl7bD17fTtmb3IodmFyIGQ7ZD1pLm1hdGNoKEphKTspaT1pLnNsaWNlKDAsaS5sZW5ndGgtZFswXS5sZW5ndGgpLGxbZFswXS50b0xvd2VyQ2FzZSgpXT0hMH1yZXR1cm5baC5oeXBoZW5hdGUoaS5zbGljZSgyKSksbF19ZnVuY3Rpb24gVnMoaSxsKXt2YXIgZD1BPT57VHQoZC52YWx1ZSxsLDUsW0FdKX07ZC52YWx1ZT1pO3ZhciBfPW5ldyBTZXQ7cmV0dXJuIGguaXNBcnJheShkLnZhbHVlKT9kLnZhbHVlLmZvckVhY2goQT0+e0EubW9kaWZpZXJzJiZBLm1vZGlmaWVycy5mb3JFYWNoKEM9PntfLmFkZChDKX0pfSk6KGQudmFsdWUubW9kaWZpZXJzJiZkLnZhbHVlLm1vZGlmaWVycy5mb3JFYWNoKEE9PntfLmFkZChBKX0pLFVzKGQsbCkpLGQubW9kaWZpZXJzPVsuLi5fXSxkfWZ1bmN0aW9uIFVzKGksbCl7aWYoISFsKXt2YXJ7JHd4c01vZHVsZXM6ZH09bDtpZighIWQpe3ZhciBfPWkudmFsdWUudG9TdHJpbmcoKTshZC5maW5kKEE9Pl8uaW5kZXhPZigiLiIrQSsiLiIpPi0xKXx8KGkud3hzRXZlbnQ9aS52YWx1ZSgpKX19fXZhciBnbD1mdW5jdGlvbihpLGwsZCxfKXt2YXIgQT1hcmd1bWVudHMubGVuZ3RoPjY/YXJndW1lbnRzWzZdOnZvaWQgMDtzd2l0Y2gobCl7Y2FzZSJjbGFzcyI6THMoaSxfKTticmVhaztjYXNlInN0eWxlIjpqbChpLGQsXyk7YnJlYWs7ZGVmYXVsdDppZihoLmlzT24obCkpaC5pc01vZGVsTGlzdGVuZXIobCl8fEZzKGksbCxkLF8sQSk7ZWxzZXtpZihoLmlzT2JqZWN0KF8pKXt2YXIgQz1kPT09XztpZihfPVIuSlNPTl9QUk9UT0NPTCtKU09OLnN0cmluZ2lmeShfKSxDJiZpLmdldEF0dHJpYnV0ZShsKT09PV8pcmV0dXJufWVsc2UgaWYoZD09PV8pcmV0dXJuO0RzKGksbCxfKX1icmVha319O2Z1bmN0aW9uIEhvKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIkc3R5bGUiO3t2YXIgbD1ZbigpO2lmKCFsKXJldHVybiBoLkVNUFRZX09CSjt2YXIgZD1sLnR5cGUuX19jc3NNb2R1bGVzO2lmKCFkKXJldHVybiBoLkVNUFRZX09CSjt2YXIgXz1kW2ldO3JldHVybiBffHxoLkVNUFRZX09CSn19ZnVuY3Rpb24gS2EoaSl7dmFyIGw9WW4oKTtpZighIWwpe3ZhciBkPSgpPT5tYShsLnN1YlRyZWUsaShsLnByb3h5KSk7Y3IoKCk9PnhpKGQse2ZsdXNoOiJwb3N0In0pKSxlcihkKX19ZnVuY3Rpb24gbWEoaSxsKXtpZihpLnNoYXBlRmxhZyYxMjgpe3ZhciBkPWkuc3VzcGVuc2U7aT1kLmFjdGl2ZUJyYW5jaCxkLnBlbmRpbmdCcmFuY2gmJiFkLmlzSHlkcmF0aW5nJiZkLmVmZmVjdHMucHVzaCgoKT0+e21hKGQuYWN0aXZlQnJhbmNoLGwpfSl9Zm9yKDtpLmNvbXBvbmVudDspaT1pLmNvbXBvbmVudC5zdWJUcmVlO2lmKGkuc2hhcGVGbGFnJjEmJmkuZWwpa2EoaS5lbCxsKTtlbHNlIGlmKGkudHlwZT09PWVlKWkuY2hpbGRyZW4uZm9yRWFjaChDPT5tYShDLGwpKTtlbHNlIGlmKGkudHlwZT09PVRlKWZvcih2YXJ7ZWw6XyxhbmNob3I6QX09aTtfJiYoa2EoXyxsKSxfIT09QSk7KV89Xy5uZXh0U2libGluZ31mdW5jdGlvbiBrYShpLGwpe2lmKGkubm9kZVR5cGU9PT0xKWZvcih2YXIgZCBpbiBsKWkuc2V0QXR0cmlidXRlKCItLSIuY29uY2F0KGQpLGxbZF0pfXZhciBTbz0idHJhbnNpdGlvbiIsb2E9ImFuaW1hdGlvbiIsWmE9KGksbCk9Pnt2YXJ7c2xvdHM6ZH09bDtyZXR1cm4gZW8oTHQsSHMoaSksZCl9O1phLmRpc3BsYXlOYW1lPSJUcmFuc2l0aW9uIjt2YXIgJHM9e25hbWU6U3RyaW5nLHR5cGU6U3RyaW5nLGNzczp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LGR1cmF0aW9uOltTdHJpbmcsTnVtYmVyLE9iamVjdF0sZW50ZXJGcm9tQ2xhc3M6U3RyaW5nLGVudGVyQWN0aXZlQ2xhc3M6U3RyaW5nLGVudGVyVG9DbGFzczpTdHJpbmcsYXBwZWFyRnJvbUNsYXNzOlN0cmluZyxhcHBlYXJBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyVG9DbGFzczpTdHJpbmcsbGVhdmVGcm9tQ2xhc3M6U3RyaW5nLGxlYXZlQWN0aXZlQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmd9LHBsPVphLnByb3BzPWguZXh0ZW5kKHt9LEx0LnByb3BzLCRzKSxhYT1mdW5jdGlvbihpKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06W107aC5pc0FycmF5KGkpP2kuZm9yRWFjaChkPT5kKC4uLmwpKTppJiZpKC4uLmwpfSxYYT1pPT5pP2guaXNBcnJheShpKT9pLnNvbWUobD0+bC5sZW5ndGg+MSk6aS5sZW5ndGg+MTohMTtmdW5jdGlvbiBIcyhpKXt2YXIgbD17fTtmb3IodmFyIGQgaW4gaSlkIGluICRzfHwobFtkXT1pW2RdKTtpZihpLmNzcz09PSExKXJldHVybiBsO3ZhcntuYW1lOl89InYiLHR5cGU6QSxkdXJhdGlvbjpDLGVudGVyRnJvbUNsYXNzOms9IiIuY29uY2F0KF8sIi1lbnRlci1mcm9tIiksZW50ZXJBY3RpdmVDbGFzczpMPSIiLmNvbmNhdChfLCItZW50ZXItYWN0aXZlIiksZW50ZXJUb0NsYXNzOkg9IiIuY29uY2F0KF8sIi1lbnRlci10byIpLGFwcGVhckZyb21DbGFzczp0ZT1rLGFwcGVhckFjdGl2ZUNsYXNzOmdlPUwsYXBwZWFyVG9DbGFzczprZT1ILGxlYXZlRnJvbUNsYXNzOnVlPSIiLmNvbmNhdChfLCItbGVhdmUtZnJvbSIpLGxlYXZlQWN0aXZlQ2xhc3M6UGU9IiIuY29uY2F0KF8sIi1sZWF2ZS1hY3RpdmUiKSxsZWF2ZVRvQ2xhc3M6V2U9IiIuY29uY2F0KF8sIi1sZWF2ZS10byIpfT1pLHV0PVFhKEMpLFFlPXV0JiZ1dFswXSxJZT11dCYmdXRbMV0se29uQmVmb3JlRW50ZXI6cGUsb25FbnRlcjpfZSxvbkVudGVyQ2FuY2VsbGVkOkxlLG9uTGVhdmU6QWUsb25MZWF2ZUNhbmNlbGxlZDpFdCxvbkJlZm9yZUFwcGVhcjpBdD1wZSxvbkFwcGVhcjpKZT1fZSxvbkFwcGVhckNhbmNlbGxlZDp4dD1MZX09bCxNPShuZSxpZSxWZSk9PntzYShuZSxpZT9rZTpIKSxzYShuZSxpZT9nZTpMKSxWZSYmVmUoKX0saj0obmUsaWUpPT57c2EobmUsV2UpLHNhKG5lLFBlKSxpZSYmaWUoKX0sYWU9bmU9PihpZSxWZSk9Pnt2YXIgcnQ9bmU/SmU6X2UsWWU9KCk9Pk0oaWUsbmUsVmUpO2FhKHJ0LFtpZSxZZV0pLHZsKCgpPT57c2EoaWUsbmU/dGU6ayksVnIoaWUsbmU/a2U6SCksWGEocnQpfHxqcyhpZSxBLFFlLFllKX0pfTtyZXR1cm4gaC5leHRlbmQobCx7b25CZWZvcmVFbnRlcihuZSl7YWEocGUsW25lXSksVnIobmUsayksVnIobmUsTCl9LG9uQmVmb3JlQXBwZWFyKG5lKXthYShBdCxbbmVdKSxWcihuZSx0ZSksVnIobmUsZ2UpfSxvbkVudGVyOmFlKCExKSxvbkFwcGVhcjphZSghMCksb25MZWF2ZShuZSxpZSl7dmFyIFZlPSgpPT5qKG5lLGllKTtWcihuZSx1ZSksbWwoKSxWcihuZSxQZSksdmwoKCk9PntzYShuZSx1ZSksVnIobmUsV2UpLFhhKEFlKXx8anMobmUsQSxJZSxWZSl9KSxhYShBZSxbbmUsVmVdKX0sb25FbnRlckNhbmNlbGxlZChuZSl7TShuZSwhMSksYWEoTGUsW25lXSl9LG9uQXBwZWFyQ2FuY2VsbGVkKG5lKXtNKG5lLCEwKSxhYSh4dCxbbmVdKX0sb25MZWF2ZUNhbmNlbGxlZChuZSl7aihuZSksYWEoRXQsW25lXSl9fSl9ZnVuY3Rpb24gUWEoaSl7aWYoaT09bnVsbClyZXR1cm4gbnVsbDtpZihoLmlzT2JqZWN0KGkpKXJldHVybltvaShpLmVudGVyKSxvaShpLmxlYXZlKV07dmFyIGw9b2koaSk7cmV0dXJuW2wsbF19ZnVuY3Rpb24gb2koaSl7dmFyIGw9aC50b051bWJlcihpKTtyZXR1cm4gbH1mdW5jdGlvbiBWcihpLGwpe2wuc3BsaXQoL1xzKy8pLmZvckVhY2goZD0+ZCYmaS5jbGFzc0xpc3QuYWRkKGQpKSwoaS5fdnRjfHwoaS5fdnRjPW5ldyBTZXQpKS5hZGQobCl9ZnVuY3Rpb24gc2EoaSxsKXtsLnNwbGl0KC9ccysvKS5mb3JFYWNoKF89Pl8mJmkuY2xhc3NMaXN0LnJlbW92ZShfKSk7dmFye192dGM6ZH09aTtkJiYoZC5kZWxldGUobCksZC5zaXplfHwoaS5fdnRjPXZvaWQgMCkpfWZ1bmN0aW9uIHZsKGkpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShpKX0pfXZhciB6bD0wO2Z1bmN0aW9uIGpzKGksbCxkLF8pe3ZhciBBPWkuX2VuZElkPSsremwsQz0oKT0+e0E9PT1pLl9lbmRJZCYmXygpfTtpZihkKXJldHVybiBzZXRUaW1lb3V0KEMsZCk7dmFye3R5cGU6ayx0aW1lb3V0OkwscHJvcENvdW50Okh9PWJzKGksbCk7aWYoIWspcmV0dXJuIF8oKTt2YXIgdGU9aysiZW5kIixnZT0wLGtlPSgpPT57aS5yZW1vdmVFdmVudExpc3RlbmVyKHRlLHVlKSxDKCl9LHVlPVBlPT57UGUudGFyZ2V0PT09aSYmKytnZT49SCYma2UoKX07c2V0VGltZW91dCgoKT0+e2dlPEgmJmtlKCl9LEwrMSksaS5hZGRFdmVudExpc3RlbmVyKHRlLHVlKX1mdW5jdGlvbiBicyhpLGwpe3ZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGkpLF89V2U9PihkW1dlXXx8IiIpLnNwbGl0KCIsICIpLEE9XyhTbysiRGVsYXkiKSxDPV8oU28rIkR1cmF0aW9uIiksaz16cyhBLEMpLEw9XyhvYSsiRGVsYXkiKSxIPV8ob2ErIkR1cmF0aW9uIiksdGU9enMoTCxIKSxnZT1udWxsLGtlPTAsdWU9MDtsPT09U28/az4wJiYoZ2U9U28sa2U9ayx1ZT1DLmxlbmd0aCk6bD09PW9hP3RlPjAmJihnZT1vYSxrZT10ZSx1ZT1ILmxlbmd0aCk6KGtlPU1hdGgubWF4KGssdGUpLGdlPWtlPjA/az50ZT9TbzpvYTpudWxsLHVlPWdlP2dlPT09U28/Qy5sZW5ndGg6SC5sZW5ndGg6MCk7dmFyIFBlPWdlPT09U28mJi9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLy50ZXN0KGRbU28rIlByb3BlcnR5Il0pO3JldHVybnt0eXBlOmdlLHRpbWVvdXQ6a2UscHJvcENvdW50OnVlLGhhc1RyYW5zZm9ybTpQZX19ZnVuY3Rpb24genMoaSxsKXtmb3IoO2kubGVuZ3RoPGwubGVuZ3RoOylpPWkuY29uY2F0KGkpO3JldHVybiBNYXRoLm1heCguLi5sLm1hcCgoZCxfKT0+V3MoZCkrV3MoaVtfXSkpKX1mdW5jdGlvbiBXcyhpKXtyZXR1cm4gTnVtYmVyKGkuc2xpY2UoMCwtMSkucmVwbGFjZSgiLCIsIi4iKSkqMWUzfWZ1bmN0aW9uIG1sKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXZhciBHcz1uZXcgV2Vha01hcCxFcz1uZXcgV2Vha01hcCx5cz17bmFtZToiVHJhbnNpdGlvbkdyb3VwIixwcm9wczpoLmV4dGVuZCh7fSxwbCx7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSksc2V0dXAoaSxsKXt2YXJ7c2xvdHM6ZH09bCxfPVluKCksQT1FcigpLEMsaztyZXR1cm4gZXIoKCk9PntpZighIUMubGVuZ3RoKXt2YXIgTD1pLm1vdmVDbGFzc3x8IiIuY29uY2F0KGkubmFtZXx8InYiLCItbW92ZSIpO2lmKCEhbShDWzBdLmVsLF8udm5vZGUuZWwsTCkpe0MuZm9yRWFjaChibCksQy5mb3JFYWNoKGEpO3ZhciBIPUMuZmlsdGVyKHUpO21sKCksSC5mb3JFYWNoKHRlPT57dmFyIGdlPXRlLmVsLGtlPWdlLnN0eWxlO1ZyKGdlLEwpLGtlLnRyYW5zZm9ybT1rZS53ZWJraXRUcmFuc2Zvcm09a2UudHJhbnNpdGlvbkR1cmF0aW9uPSIiO3ZhciB1ZT1nZS5fbW92ZUNiPVBlPT57UGUmJlBlLnRhcmdldCE9PWdlfHwoIVBlfHwvdHJhbnNmb3JtJC8udGVzdChQZS5wcm9wZXJ0eU5hbWUpKSYmKGdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLHVlKSxnZS5fbW92ZUNiPW51bGwsc2EoZ2UsTCkpfTtnZS5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIix1ZSl9KX19fSksKCk9Pnt2YXIgTD1FLnRvUmF3KGkpLEg9SHMoTCksdGU9TC50YWd8fGVlO0M9ayxrPWQuZGVmYXVsdD96cihkLmRlZmF1bHQoKSk6W107Zm9yKHZhciBnZT0wO2dlPGsubGVuZ3RoO2dlKyspe3ZhciBrZT1rW2dlXTtrZS5rZXkhPW51bGwmJmpyKGtlLG5pKGtlLEgsQSxfKSl9aWYoQylmb3IodmFyIHVlPTA7dWU8Qy5sZW5ndGg7dWUrKyl7dmFyIFBlPUNbdWVdO2pyKFBlLG5pKFBlLEgsQSxfKSksR3Muc2V0KFBlLFBlLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX1yZXR1cm4gWnQodGUsbnVsbCxrKX19fSxTcz1pPT5kZWxldGUgaS5tb2RlO3lzLnByb3BzO3ZhciBfbD15cztmdW5jdGlvbiBibChpKXt2YXIgbD1pLmVsO2wuX21vdmVDYiYmbC5fbW92ZUNiKCksbC5fZW50ZXJDYiYmbC5fZW50ZXJDYigpfWZ1bmN0aW9uIGEoaSl7RXMuc2V0KGksaS5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9ZnVuY3Rpb24gdShpKXt2YXIgbD1Hcy5nZXQoaSksZD1Fcy5nZXQoaSksXz1sLmxlZnQtZC5sZWZ0LEE9bC50b3AtZC50b3A7aWYoX3x8QSl7dmFyIEM9aS5lbC5zdHlsZTtyZXR1cm4gQy50cmFuc2Zvcm09Qy53ZWJraXRUcmFuc2Zvcm09InRyYW5zbGF0ZSgiLmNvbmNhdChfLCJweCwiKS5jb25jYXQoQSwicHgpIiksQy50cmFuc2l0aW9uRHVyYXRpb249IjBzIixpfX1mdW5jdGlvbiBtKGksbCxkKXt2YXIgXz1pLmNsb25lTm9kZSgpO2kuX3Z0YyYmaS5fdnRjLmZvckVhY2goaz0+e2suc3BsaXQoL1xzKy8pLmZvckVhY2goTD0+TCYmXy5jbGFzc0xpc3QucmVtb3ZlKEwpKX0pLGQuc3BsaXQoL1xzKy8pLmZvckVhY2goaz0+ayYmXy5jbGFzc0xpc3QuYWRkKGspKSxfLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBBPWwubm9kZVR5cGU9PT0xP2w6bC5wYXJlbnROb2RlO0EuYXBwZW5kQ2hpbGQoXyk7dmFye2hhc1RyYW5zZm9ybTpDfT1icyhfKTtyZXR1cm4gQS5yZW1vdmVDaGlsZChfKSxDfXZhciBTPWk9Pnt2YXIgbD1pLnByb3BzWyJvblVwZGF0ZTptb2RlbFZhbHVlIl07cmV0dXJuIGguaXNBcnJheShsKT9kPT5oLmludm9rZUFycmF5Rm5zKGwsZCk6bH0sST17Y3JlYXRlZChpLGwsZCl7dmFye3ZhbHVlOl8sbW9kaWZpZXJzOnt0cmltOkEsbnVtYmVyOkN9fT1sO2kudmFsdWU9Xz09bnVsbD8iIjpfLGkuX2Fzc2lnbj1TKGQpLG1zKGksImlucHV0IixrPT57dmFyIEw9ay5kZXRhaWwudmFsdWUsSD1pLnBhZ2VOb2RlO2kucGFnZU5vZGU9bnVsbCxpLnZhbHVlPUwsaS5wYWdlTm9kZT1ILEE/TD1MLnRyaW0oKTpDJiYoTD1oLnRvTnVtYmVyKEwpKSxpLl9hc3NpZ24oTCl9KX0sYmVmb3JlVXBkYXRlKGksbCxkKXt2YXJ7dmFsdWU6X309bDtpLl9hc3NpZ249UyhkKTt2YXIgQT1fPT1udWxsPyIiOl87aS52YWx1ZSE9PUEmJihpLnZhbHVlPUEpfX0sTz1JLEY9WyJjdHJsIiwic2hpZnQiLCJhbHQiLCJtZXRhIl0sVz17c3RvcDppPT5pLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6aT0+aS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6aT0+aS50YXJnZXQhPT1pLmN1cnJlbnRUYXJnZXQsY3RybDppPT4haS5jdHJsS2V5LHNoaWZ0Omk9PiFpLnNoaWZ0S2V5LGFsdDppPT4haS5hbHRLZXksbWV0YTppPT4haS5tZXRhS2V5LGxlZnQ6aT0+ImJ1dHRvbiJpbiBpJiZpLmJ1dHRvbiE9PTAsbWlkZGxlOmk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0xLHJpZ2h0Omk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0yLGV4YWN0OihpLGwpPT5GLnNvbWUoZD0+aVsiIi5jb25jYXQoZCwiS2V5IildJiYhbC5pbmNsdWRlcyhkKSl9LEc9KGksbCk9Pnt2YXIgZD1mdW5jdGlvbihfKXtmb3IodmFyIEE9MDtBPGwubGVuZ3RoO0ErKyl7dmFyIEM9V1tsW0FdXTtpZihDJiZDKF8sbCkpcmV0dXJufWZvcih2YXIgaz1hcmd1bWVudHMubGVuZ3RoLEw9bmV3IEFycmF5KGs+MT9rLTE6MCksSD0xO0g8aztIKyspTFtILTFdPWFyZ3VtZW50c1tIXTtyZXR1cm4gaShfLC4uLkwpfTtyZXR1cm4gZC5tb2RpZmllcnM9bCxkfSxsZT17ZXNjOiJlc2NhcGUiLHNwYWNlOiIgIix1cDoiYXJyb3ctdXAiLGxlZnQ6ImFycm93LWxlZnQiLHJpZ2h0OiJhcnJvdy1yaWdodCIsZG93bjoiYXJyb3ctZG93biIsZGVsZXRlOiJiYWNrc3BhY2UifSx6ZT0oaSxsKT0+ZD0+e2lmKCJrZXkiaW4gZCl7dmFyIF89aC5oeXBoZW5hdGUoZC5rZXkpO2lmKGwuc29tZShBPT5BPT09X3x8bGVbQV09PT1fKSlyZXR1cm4gaShkKX19LGl0PXtiZWZvcmVNb3VudChpLGwpe3Zhcnt2YWx1ZTpkfT1sO2RlKGksZCl9LHVwZGF0ZWQoaSxsKXt2YXJ7dmFsdWU6ZCxvbGRWYWx1ZTpffT1sOyFkIT0hXyYmZGUoaSxkKX0sYmVmb3JlVW5tb3VudChpLGwpe3Zhcnt2YWx1ZTpkfT1sO2RlKGksZCl9fTtmdW5jdGlvbiBkZShpLGwpe2kuc2V0QXR0cmlidXRlKCIudlNob3ciLCEhbCl9dmFyIEdlPWguZXh0ZW5kKHtwYXRjaFByb3A6Z2wsZm9yY2VQYXRjaFByb3A6Ui5mb3JjZVBhdGNoUHJvcH0sJG8pLHFlO2Z1bmN0aW9uIF90KCl7cmV0dXJuIHFlfHwocWU9JGEoR2UpKX12YXIgYXQ9ZnVuY3Rpb24oKXtfdCgpLnJlbmRlciguLi5hcmd1bWVudHMpfSxTZT1mdW5jdGlvbigpe3ZhciBpPV90KCkuY3JlYXRlQXBwKC4uLmFyZ3VtZW50cykse21vdW50Omx9PWk7cmV0dXJuIGkubW91bnQ9ZD0+KGguaXNTdHJpbmcoZCkmJihkPXFhKGQpKSxkJiZsKGQsITEsITEpKSxpfSxiZT1TZTtmdW5jdGlvbiBDZSgpe31mdW5jdGlvbiBzdCgpe31mdW5jdGlvbiBGZShpKXtyZXR1cm4gaC5pc09iamVjdChpKT9SLkpTT05fUFJPVE9DT0wrSlNPTi5zdHJpbmdpZnkoaSk6aX12YXIgUHQ9aT0+RmUoaSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJjYW1lbGl6ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FtZWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksImNhcGl0YWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoLmNhcGl0YWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIm5vcm1hbGl6ZUNsYXNzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaC5ub3JtYWxpemVDbGFzc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwibm9ybWFsaXplUHJvcHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoLm5vcm1hbGl6ZVByb3BzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJub3JtYWxpemVTdHlsZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgubm9ybWFsaXplU3R5bGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksInRvRGlzcGxheVN0cmluZyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgudG9EaXNwbGF5U3RyaW5nfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJ0b0hhbmRsZXJLZXkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoLnRvSGFuZGxlcktleX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRWZmZWN0U2NvcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLkVmZmVjdFNjb3BlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJSZWFjdGl2ZUVmZmVjdCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUuUmVhY3RpdmVFZmZlY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksImN1c3RvbVJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUuY3VzdG9tUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJlZmZlY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLmVmZmVjdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiZWZmZWN0U2NvcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLmVmZmVjdFNjb3BlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJnZXRDdXJyZW50U2NvcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLmdldEN1cnJlbnRTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiaXNQcm94eSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUuaXNQcm94eX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiaXNSZWFjdGl2ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUuaXNSZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiaXNSZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUuaXNSZWFkb25seX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiaXNSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLmlzUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJpc1NoYWxsb3ciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLmlzU2hhbGxvd319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwibWFya1JhdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUubWFya1Jhd319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwib25TY29wZURpc3Bvc2UiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLm9uU2NvcGVEaXNwb3NlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJwcm94eVJlZnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLnByb3h5UmVmc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwicmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLnJlYWN0aXZlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJyZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUucmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksInJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUucmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJzaGFsbG93UmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLnNoYWxsb3dSZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwic2hhbGxvd1JlYWRvbmx5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRS5zaGFsbG93UmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksInNoYWxsb3dSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLnNoYWxsb3dSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksInN0b3AiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLnN0b3B9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksInRvUmF3Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRS50b1Jhd319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwidG9SZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLnRvUmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJ0b1JlZnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLnRvUmVmc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwidHJpZ2dlclJlZiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEUudHJpZ2dlclJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwidW5yZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFLnVucmVmfX0pLHkuQmFzZVRyYW5zaXRpb249THQseS5CYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycz1maSx5LkNvbW1lbnQ9aGUseS5GcmFnbWVudD1lZSx5LktlZXBBbGl2ZT1NaSx5LlN0YXRpYz1UZSx5LlN1c3BlbnNlPXhuLHkuVGVsZXBvcnQ9Wix5LlRleHQ9Y2UseS5UcmFuc2l0aW9uPVphLHkuVHJhbnNpdGlvbkdyb3VwPV9sLHkuYXNzZXJ0TnVtYmVyPU50LHkuY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmc9VHQseS5jYWxsV2l0aEVycm9ySGFuZGxpbmc9VXQseS5jbG9uZVZOb2RlPWlpLHkuY29tcGF0VXRpbHM9Vm8seS5jb21wdXRlZD1kcyx5LmNyZWF0ZUFwcD1TZSx5LmNyZWF0ZUJsb2NrPXZuLHkuY3JlYXRlQ29tbWVudD1xYSx5LmNyZWF0ZUNvbW1lbnRWTm9kZT16bix5LmNyZWF0ZUVsZW1lbnQ9VW8seS5jcmVhdGVFbGVtZW50QmxvY2s9RHQseS5jcmVhdGVFbGVtZW50Vk5vZGU9JHQseS5jcmVhdGVIeWRyYXRpb25SZW5kZXJlcj1IYSx5LmNyZWF0ZVByb3BzUmVzdFByb3h5PUFyLHkuY3JlYXRlUmVuZGVyZXI9JGEseS5jcmVhdGVTU1JBcHA9YmUseS5jcmVhdGVTbG90cz1WaSx5LmNyZWF0ZVN0YXRpY1ZOb2RlPWphLHkuY3JlYXRlVGV4dE5vZGU9aWEseS5jcmVhdGVUZXh0Vk5vZGU9UWkseS5jcmVhdGVWTm9kZT1adCx5LmNyZWF0ZVZ1ZUFwcD1TZSx5LmRlZmluZUFzeW5jQ29tcG9uZW50PUJpLHkuZGVmaW5lQ29tcG9uZW50PUxyLHkuZGVmaW5lRW1pdHM9eHMseS5kZWZpbmVFeHBvc2U9aHMseS5kZWZpbmVQcm9wcz1Ebyx5LmdldEN1cnJlbnRJbnN0YW5jZT1Zbix5LmdldFRyYW5zaXRpb25SYXdDaGlsZHJlbj16cix5Lmd1YXJkUmVhY3RpdmVQcm9wcz1waSx5Lmg9ZW8seS5oYW5kbGVFcnJvcj1QLHkuaW5pdEN1c3RvbUZvcm1hdHRlcj1yYSx5LmluamVjdD1Rbix5LmluamVjdEhvb2s9SXIseS5pc01lbW9TYW1lPXBzLHkuaXNSdW50aW1lT25seT1Kcix5LmlzVk5vZGU9cXQseS5tZXJnZURlZmF1bHRzPU9uLHkubWVyZ2VQcm9wcz1Dcix5Lm5leHRUaWNrPW1yLHkub25BY3RpdmF0ZWQ9SW8seS5vbkJlZm9yZUFjdGl2YXRlPUNlLHkub25CZWZvcmVEZWFjdGl2YXRlPXN0LHkub25CZWZvcmVNb3VudD1ycix5Lm9uQmVmb3JlVW5tb3VudD1kcix5Lm9uQmVmb3JlVXBkYXRlPXFuLHkub25EZWFjdGl2YXRlZD1Bbix5Lm9uRXJyb3JDYXB0dXJlZD1Ybyx5Lm9uTW91bnRlZD1jcix5Lm9uUmVuZGVyVHJhY2tlZD1KaSx5Lm9uUmVuZGVyVHJpZ2dlcmVkPXFpLHkub25TZXJ2ZXJQcmVmZXRjaD1fbyx5Lm9uVW5tb3VudGVkPW1vLHkub25VcGRhdGVkPWVyLHkub3BlbkJsb2NrPWx0LHkucG9wU2NvcGVJZD1mYSx5LnByb3ZpZGU9bHIseS5wdXNoU2NvcGVJZD1nbyx5LnF1ZXVlUG9zdEZsdXNoQ2I9eWkseS5yZWdpc3RlclJ1bnRpbWVDb21waWxlcj1mcyx5LnJlbmRlcj1hdCx5LnJlbmRlckxpc3Q9UXQseS5yZW5kZXJTbG90PUdyLHkucmVzb2x2ZUNvbXBvbmVudD1ZLHkucmVzb2x2ZURpcmVjdGl2ZT1aZSx5LnJlc29sdmVEeW5hbWljQ29tcG9uZW50PXhlLHkucmVzb2x2ZUZpbHRlcj1Ncyx5LnJlc29sdmVUcmFuc2l0aW9uSG9va3M9bmkseS5zZXRCbG9ja1RyYWNraW5nPXl0LHkuc2V0RGV2dG9vbHNIb29rPXVuLHkuc2V0VHJhbnNpdGlvbkhvb2tzPWpyLHkuc3NyQ29udGV4dEtleT1Gbyx5LnNzclV0aWxzPUhsLHkudG9IYW5kbGVycz1SdCx5LnRyYW5zZm9ybVZOb2RlQXJncz1ybix5LnVzZUF0dHJzPWt0LHkudXNlQ3NzTW9kdWxlPUhvLHkudXNlQ3NzVmFycz1LYSx5LnVzZVNTUkNvbnRleHQ9TmEseS51c2VTbG90cz1OZSx5LnVzZVRyYW5zaXRpb25TdGF0ZT1Fcix5LnZNb2RlbER5bmFtaWM9Tyx5LnZNb2RlbFRleHQ9SSx5LnZTaG93PWl0LHkudmVyc2lvbj1kbCx5Lndhcm49RGUseS53YXRjaD1Ccix5LndhdGNoRWZmZWN0PXhpLHkud2F0Y2hQb3N0RWZmZWN0PW9vLHkud2F0Y2hTeW5jRWZmZWN0PXRpLHkud2l0aEFzeW5jQ29udGV4dD1QaSx5LndpdGhDdHg9Sm8seS53aXRoRGVmYXVsdHM9QnMseS53aXRoRGlyZWN0aXZlcz1Xcix5LndpdGhLZXlzPXplLHkud2l0aE1lbW89Z3MseS53aXRoTW9kaWZpZXJzPUcseS53aXRoU2NvcGVJZD1Bbyx5LndwPVB0LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx5fSh7fSxwLHcscyk7cmV0dXJuIE4uX19UWVBFX189InZ1ZSIsTn1mdW5jdGlvbiBodihmLHMscCl7bGV0IHc9cC5WdWUsTj1wLnNldFRpbWVvdXQseT1wLmNsZWFyVGltZW91dCxoPXAuc2V0SW50ZXJ2YWwsRT1wLmNsZWFySW50ZXJ2YWwsUj1wLl9fdW5pQ29uZmlnLERlPXAuX191bmlSb3V0ZXMsTnQ9cC5WdWVTaGFyZWQsVXQ9cC5VbmlTaGFyZWQ7dmFyIFR0PWZ1bmN0aW9uKHosSyxtbil7InVzZSBzdHJpY3QiO3ZhciBobj0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsd249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgVWludDhBcnJheSgyNTYpO2Zvcih2YXIgdD0wO3Q8aG4ubGVuZ3RoO3QrKyllW2huLmNoYXJDb2RlQXQodCldPXQ7cmV0dXJuIGV9KCk7ZnVuY3Rpb24gWG4oZSl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoZSksbixyPXQubGVuZ3RoLG89IiI7Zm9yKG49MDtuPHI7bis9MylvKz1oblt0W25dPj4yXSxvKz1oblsodFtuXSYzKTw8NHx0W24rMV0+PjRdLG8rPWhuWyh0W24rMV0mMTUpPDwyfHRbbisyXT4+Nl0sbys9aG5bdFtuKzJdJjYzXTtyZXR1cm4gciUzPT09Mj9vPW8uc3Vic3RyaW5nKDAsby5sZW5ndGgtMSkrIj0iOnIlMz09PTEmJihvPW8uc3Vic3RyaW5nKDAsby5sZW5ndGgtMikrIj09Iiksb31mdW5jdGlvbiBzaShlKXt2YXIgdD1lLmxlbmd0aCouNzUsbj1lLmxlbmd0aCxyLG89MCxjLGcsYixWO2VbZS5sZW5ndGgtMV09PT0iPSImJih0LS0sZVtlLmxlbmd0aC0yXT09PSI9IiYmdC0tKTt2YXIgVD1uZXcgQXJyYXlCdWZmZXIodCksRD1uZXcgVWludDhBcnJheShUKTtmb3Iocj0wO3I8bjtyKz00KWM9d25bZS5jaGFyQ29kZUF0KHIpXSxnPXduW2UuY2hhckNvZGVBdChyKzEpXSxiPXduW2UuY2hhckNvZGVBdChyKzIpXSxWPXduW2UuY2hhckNvZGVBdChyKzMpXSxEW28rK109Yzw8MnxnPj40LERbbysrXT0oZyYxNSk8PDR8Yj4+MixEW28rK109KGImMyk8PDZ8ViY2MztyZXR1cm4gVH1sZXQgRWk9WyJvcmlnaW5hbCIsImNvbXByZXNzZWQiXSxYcj1bImFsYnVtIiwiY2FtZXJhIl0sbXI9WyJHRVQiLCJPUFRJT05TIiwiSEVBRCIsIlBPU1QiLCJQVVQiLCJERUxFVEUiLCJUUkFDRSIsIkNPTk5FQ1QiLCJQQVRDSCJdO2Z1bmN0aW9uIENuKGUsdCl7cmV0dXJuIWV8fHQuaW5kZXhPZihlKT09PS0xP3RbMF06ZX1mdW5jdGlvbiBfcihlLHQpe3JldHVybiF6LmlzQXJyYXkoZSl8fGUubGVuZ3RoPT09MHx8ZS5maW5kKG49PnQuaW5kZXhPZihuKT09PS0xKT90OmV9ZnVuY3Rpb24gJHIoZSx0KXtjb25zb2xlLndhcm4oYCR7ZX06ICR7dH1gKX1mdW5jdGlvbiBRcihlLHQsbixyKXtyfHwocj0kcik7Zm9yKGxldCBvIGluIG4pe2xldCBjPWtuKG8sdFtvXSxuW29dLCF6Lmhhc093bih0LG8pKTt6LmlzU3RyaW5nKGMpJiZyKGUsYyl9fWZ1bmN0aW9uIHlpKGUsdCxuLHIpe2lmKCFuKXJldHVybjtpZighei5pc0FycmF5KG4pKXJldHVybiBRcihlLHRbMF18fE9iamVjdC5jcmVhdGUobnVsbCksbixyKTtsZXQgbz1uLmxlbmd0aCxjPXQubGVuZ3RoO2ZvcihsZXQgZz0wO2c8bztnKyspe2xldCBiPW5bZ10sVj1PYmplY3QuY3JlYXRlKG51bGwpO2M+ZyYmKFZbYi5uYW1lXT10W2ddKSxRcihlLFYse1tiLm5hbWVdOmJ9LHIpfX1mdW5jdGlvbiBrbihlLHQsbixyKXt6LmlzUGxhaW5PYmplY3Qobil8fChuPXt0eXBlOm59KTtsZXR7dHlwZTpvLHJlcXVpcmVkOmMsdmFsaWRhdG9yOmd9PW47aWYoYyYmcilyZXR1cm4nTWlzc2luZyByZXF1aXJlZCBhcmdzOiAiJytlKyciJztpZighKHQ9PW51bGwmJiFjKSl7aWYobyE9bnVsbCl7bGV0IGI9ITEsVj16LmlzQXJyYXkobyk/bzpbb10sVD1bXTtmb3IobGV0IEQ9MDtEPFYubGVuZ3RoJiYhYjtEKyspe2xldHt2YWxpZDp2ZSxleHBlY3RlZFR5cGU6eWV9PW50KHQsVltEXSk7VC5wdXNoKHllfHwiIiksYj12ZX1pZighYilyZXR1cm4gT3QoZSx0LFQpfWlmKGcpcmV0dXJuIGcodCl9fWxldCBqZT16Lm1ha2VNYXAoIlN0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wiKTtmdW5jdGlvbiBudChlLHQpe2xldCBuLHI9bm4odCk7aWYoamUocikpe2xldCBvPXR5cGVvZiBlO249bz09PXIudG9Mb3dlckNhc2UoKSwhbiYmbz09PSJvYmplY3QiJiYobj1lIGluc3RhbmNlb2YgdCl9ZWxzZSByPT09Ik9iamVjdCI/bj16LmlzT2JqZWN0KGUpOnI9PT0iQXJyYXkiP249ei5pc0FycmF5KGUpOm49ZSBpbnN0YW5jZW9mIHR8fHoudG9SYXdUeXBlKGUpPT09bm4odCk7cmV0dXJue3ZhbGlkOm4sZXhwZWN0ZWRUeXBlOnJ9fWZ1bmN0aW9uIE90KGUsdCxuKXtsZXQgcj1gSW52YWxpZCBhcmdzOiB0eXBlIGNoZWNrIGZhaWxlZCBmb3IgYXJncyAiJHtlfSIuIEV4cGVjdGVkICR7bi5tYXAoei5jYXBpdGFsaXplKS5qb2luKCIsICIpfWAsbz1uWzBdLGM9ei50b1Jhd1R5cGUodCksZz1Obih0LG8pLGI9Tm4odCxjKTtyZXR1cm4gbi5sZW5ndGg9PT0xJiZ1bihvKSYmIWFyKG8sYykmJihyKz1gIHdpdGggdmFsdWUgJHtnfWApLHIrPWAsIGdvdCAke2N9IGAsdW4oYykmJihyKz1gd2l0aCB2YWx1ZSAke2J9LmApLHJ9ZnVuY3Rpb24gbm4oZSl7bGV0IHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gdD90WzFdOiIifWZ1bmN0aW9uIE5uKGUsdCl7cmV0dXJuIHQ9PT0iU3RyaW5nIj9gIiR7ZX0iYDp0PT09Ik51bWJlciI/YCR7TnVtYmVyKGUpfWA6YCR7ZX1gfWZ1bmN0aW9uIHVuKGUpe3JldHVyblsic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiJdLnNvbWUobj0+ZS50b0xvd2VyQ2FzZSgpPT09bil9ZnVuY3Rpb24gYXIoLi4uZSl7cmV0dXJuIGUuc29tZSh0PT50LnRvTG93ZXJDYXNlKCk9PT0iYm9vbGVhbiIpfWZ1bmN0aW9uIFZuKGUpe3JldHVybiBmdW5jdGlvbigpe3RyeXtyZXR1cm4gZS5hcHBseShlLGFyZ3VtZW50cyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcih0KX19fWxldCBQbj0xLF9uPXt9O2Z1bmN0aW9uIGJyKGUsdCxuLHI9ITEpe3JldHVybiBfbltlXT17bmFtZTp0LGtlZXBBbGl2ZTpyLGNhbGxiYWNrOm59LGV9ZnVuY3Rpb24gZWkoZSx0LG4pe2lmKHR5cGVvZiBlPT0ibnVtYmVyIil7bGV0IHI9X25bZV07aWYocilyZXR1cm4gci5rZWVwQWxpdmV8fGRlbGV0ZSBfbltlXSxyLmNhbGxiYWNrKHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gZ28oZSl7Zm9yKGxldCB0IGluIF9uKWlmKF9uW3RdLm5hbWU9PT1lKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGZhKGUsdCl7Zm9yKGxldCBuIGluIF9uKXtsZXQgcj1fbltuXTtyLmNhbGxiYWNrPT09dCYmci5uYW1lPT09ZSYmZGVsZXRlIF9uW25dfX1mdW5jdGlvbiBBbyhlKXtvdC5vZmYoImFwaS4iK2UpfWZ1bmN0aW9uIEpvKGUpe290Lm9uKCJhcGkuIitlLHQ9Pntmb3IobGV0IG4gaW4gX24pe2xldCByPV9uW25dO3IubmFtZT09PWUmJnIuY2FsbGJhY2sodCl9fSl9ZnVuY3Rpb24gS28oZSx0KXtyZXR1cm4gYnIoUG4rKyxlLHQsITApfWxldCBSaT0ic3VjY2VzcyIsUnI9ImZhaWwiLHppPSJjb21wbGV0ZSI7ZnVuY3Rpb24gV2koZSl7bGV0IHQ9e307Zm9yKGxldCBuIGluIGUpe2xldCByPWVbbl07ei5pc0Z1bmN0aW9uKHIpJiYodFtuXT1WbihyKSxkZWxldGUgZVtuXSl9cmV0dXJuIHR9ZnVuY3Rpb24gcm8oZSx0KXtyZXR1cm4hZXx8ZS5pbmRleE9mKCI6ZmFpbCIpPT09LTE/dCsiOm9rIjp0K2Uuc3Vic3RyaW5nKGUuaW5kZXhPZigiOmZhaWwiKSl9ZnVuY3Rpb24gaW8oZSx0PXt9LHtiZWZvcmVBbGw6bixiZWZvcmVTdWNjZXNzOnJ9PXt9KXt6LmlzUGxhaW5PYmplY3QodCl8fCh0PXt9KTtsZXR7c3VjY2VzczpvLGZhaWw6Yyxjb21wbGV0ZTpnfT1XaSh0KSxiPXouaXNGdW5jdGlvbihvKSxWPXouaXNGdW5jdGlvbihjKSxUPXouaXNGdW5jdGlvbihnKSxEPVBuKys7cmV0dXJuIGJyKEQsZSx2ZT0+e3ZlPXZlfHx7fSx2ZS5lcnJNc2c9cm8odmUuZXJyTXNnLGUpLHouaXNGdW5jdGlvbihuKSYmbih2ZSksdmUuZXJyTXNnPT09ZSsiOm9rIj8oei5pc0Z1bmN0aW9uKHIpJiZyKHZlLHQpLGImJm8odmUpKTpWJiZjKHZlKSxUJiZnKHZlKX0pLER9bGV0IGxpPSJzdWNjZXNzIixwbz0iZmFpbCIsT289ImNvbXBsZXRlIix4bj17fSxUcj17fTtmdW5jdGlvbiBjaShlLHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gZShuLHQpfHxufX1mdW5jdGlvbiBmcihlLHQsbil7bGV0IHI9ITE7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspe2xldCBjPWVbb107aWYocilyPVByb21pc2UucmVzb2x2ZShjaShjLG4pKTtlbHNle2xldCBnPWModCxuKTtpZih6LmlzUHJvbWlzZShnKSYmKHI9UHJvbWlzZS5yZXNvbHZlKGcpKSxnPT09ITEpcmV0dXJue3RoZW4oKXt9LGNhdGNoKCl7fX19fXJldHVybiByfHx7dGhlbihvKXtyZXR1cm4gbyh0KX0sY2F0Y2goKXt9fX1mdW5jdGlvbiB2byhlLHQ9e30pe3JldHVybltsaSxwbyxPb10uZm9yRWFjaChuPT57bGV0IHI9ZVtuXTtpZighei5pc0FycmF5KHIpKXJldHVybjtsZXQgbz10W25dO3Rbbl09ZnVuY3Rpb24oZyl7ZnIocixnLHQpLnRoZW4oYj0+ei5pc0Z1bmN0aW9uKG8pJiZvKGIpfHxiKX19KSx0fWZ1bmN0aW9uIFpvKGUsdCl7bGV0IG49W107ei5pc0FycmF5KHhuLnJldHVyblZhbHVlKSYmbi5wdXNoKC4uLnhuLnJldHVyblZhbHVlKTtsZXQgcj1UcltlXTtyZXR1cm4gciYmei5pc0FycmF5KHIucmV0dXJuVmFsdWUpJiZuLnB1c2goLi4uci5yZXR1cm5WYWx1ZSksbi5mb3JFYWNoKG89Pnt0PW8odCl8fHR9KSx0fWZ1bmN0aW9uIFRvKGUpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmtleXMoeG4pLmZvckVhY2gocj0+e3IhPT0icmV0dXJuVmFsdWUiJiYodFtyXT14bltyXS5zbGljZSgpKX0pO2xldCBuPVRyW2VdO3JldHVybiBuJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKHI9PntyIT09InJldHVyblZhbHVlIiYmKHRbcl09KHRbcl18fFtdKS5jb25jYXQobltyXSkpfSksdH1mdW5jdGlvbiBTaShlLHQsbixyKXtsZXQgbz1UbyhlKTtyZXR1cm4gbyYmT2JqZWN0LmtleXMobykubGVuZ3RoP3ouaXNBcnJheShvLmludm9rZSk/ZnIoby5pbnZva2UsbikudGhlbihnPT50KHZvKFRvKGUpLGcpLC4uLnIpKTp0KHZvKG8sbiksLi4ucik6dChuLC4uLnIpfWZ1bmN0aW9uIHNyKGUpe3JldHVybiEhKHouaXNQbGFpbk9iamVjdChlKSYmW1JpLFJyLHppXS5maW5kKHQ9PnouaXNGdW5jdGlvbihlW3RdKSkpfWZ1bmN0aW9uIHVpKGUpe3JldHVybiBlfWZ1bmN0aW9uIGxyKGUsdCl7cmV0dXJuKG49e30sLi4ucik9PnNyKG4pP1pvKGUsU2koZSx0LG4scikpOlpvKGUsbmV3IFByb21pc2UoKG8sYyk9PntTaShlLHQsei5leHRlbmQobix7c3VjY2VzczpvLGZhaWw6Y30pLHIpfSkpfWZ1bmN0aW9uIFFuKGUsdCl7bGV0IG49ZVswXTtpZighdHx8IXouaXNQbGFpbk9iamVjdCh0LmZvcm1hdEFyZ3MpJiZ6LmlzUGxhaW5PYmplY3QobikpcmV0dXJuO2xldCByPXQuZm9ybWF0QXJncyxvPU9iamVjdC5rZXlzKHIpO2ZvcihsZXQgYz0wO2M8by5sZW5ndGg7YysrKXtsZXQgZz1vW2NdLGI9cltnXTtpZih6LmlzRnVuY3Rpb24oYikpe2xldCBWPWIoZVswXVtnXSxuKTtpZih6LmlzU3RyaW5nKFYpKXJldHVybiBWfWVsc2Ugei5oYXNPd24obixnKXx8KG5bZ109Yil9fWZ1bmN0aW9uIHhpKGUsdCxuKXtsZXQgcj17ZXJyTXNnOnQrIjpvayJ9O3JldHVybiBlaShlLHouZXh0ZW5kKG58fHt9LHIpKX1mdW5jdGlvbiBvbyhlLHQsbixyPXt9KXtsZXQgbz10KyI6ZmFpbCIrKG4/IiAiK246IiIpO3JldHVybiBkZWxldGUgci5lcnJDb2RlLGVpKGUsdHlwZW9mIFVuaUVycm9yIT0idW5kZWZpbmVkIj90eXBlb2Ygci5lcnJDb2RlIT0idW5kZWZpbmVkIj9uZXcgVW5pRXJyb3IodCxyLmVyckNvZGUsbyk6bmV3IFVuaUVycm9yKG8scik6ei5leHRlbmQoe2Vyck1zZzpvfSxyKSl9ZnVuY3Rpb24gdGkoZSx0LG4scil7aWYociYmci5iZWZvcmVJbnZva2Upe2xldCBjPXIuYmVmb3JlSW52b2tlKHQpO2lmKHouaXNTdHJpbmcoYykpcmV0dXJuIGN9bGV0IG89UW4odCxyKTtpZihvKXJldHVybiBvfWZ1bmN0aW9uIHhyKGUpe2lmKCF6LmlzRnVuY3Rpb24oZSkpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3M6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBhcmdzICJjYWxsYmFjayIuIEV4cGVjdGVkIEZ1bmN0aW9uJyl9ZnVuY3Rpb24gQnIoZSx0LG4pe3JldHVybiByPT57eHIocik7bGV0IG89dGkoZSxbcl0sdm9pZCAwLG4pO2lmKG8pdGhyb3cgbmV3IEVycm9yKG8pO2xldCBjPSFnbyhlKTtLbyhlLHIpLGMmJihKbyhlKSx0KCkpfX1mdW5jdGlvbiB3aShlLHQsbil7cmV0dXJuIHI9Pnt4cihyKTtsZXQgbz10aShlLFtyXSx2b2lkIDAsbik7aWYobyl0aHJvdyBuZXcgRXJyb3Iobyk7ZT1lLnJlcGxhY2UoIm9mZiIsIm9uIiksZmEoZSxyKSxnbyhlKXx8KEFvKGUpLHQoKSl9fWZ1bmN0aW9uIFBvKGUpe3JldHVybiFlfHx6LmlzU3RyaW5nKGUpP2U6ZS5zdGFjaz8oY29uc29sZS5lcnJvcihlLm1lc3NhZ2UrSy5MSU5FRkVFRCtlLnN0YWNrKSxlLm1lc3NhZ2UpOmV9ZnVuY3Rpb24gSHIoZSx0LG4scil7cmV0dXJuIG89PntsZXQgYz1pbyhlLG8sciksZz10aShlLFtvXSxuLHIpO3JldHVybiBnP29vKGMsZSxnKTp0KG8se3Jlc29sdmU6Yj0+eGkoYyxlLGIpLHJlamVjdDooYixWKT0+b28oYyxlLFBvKGIpLFYpfSl9fWZ1bmN0aW9uIE1yKGUsdCxuLHIpe3JldHVybiguLi5vKT0+e2xldCBjPXRpKGUsbyxuLHIpO2lmKGMpdGhyb3cgbmV3IEVycm9yKGMpO3JldHVybiB0LmFwcGx5KG51bGwsbyl9fWZ1bmN0aW9uIEVyKGUsdCxuLHIpe3JldHVybiBIcihlLHQsbixyKX1mdW5jdGlvbiBnbihlLHQsbil7cmV0dXJuIEJyKGUsdCxuKX1mdW5jdGlvbiBmaShlLHQsbil7cmV0dXJuIHdpKGUsdCxuKX1mdW5jdGlvbiBQcihlLHQsbixyKXtyZXR1cm4gbHIoZSxIcihlLHQsdm9pZCAwLHIpKX1mdW5jdGlvbiBMdChlLHQsbixyKXtyZXR1cm4gTXIoZSx0LHZvaWQgMCxyKX1mdW5jdGlvbiBFZShlLHQsbixyKXtyZXR1cm4gbHIoZSxFcihlLHQsdm9pZCAwLHIpKX1sZXQgbmk9ImJhc2U2NFRvQXJyYXlCdWZmZXIiLEdpPVt7bmFtZToiYmFzZTY0Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLEt0PSJhcnJheUJ1ZmZlclRvQmFzZTY0Iixqcj1be25hbWU6ImFycmF5QnVmZmVyIix0eXBlOltBcnJheUJ1ZmZlcixVaW50OEFycmF5XSxyZXF1aXJlZDohMH1dLHpyPUx0KG5pLGU9PnNpKGUpLEdpKSxMcj1MdChLdCxlPT5YbihlKSxqcik7ZnVuY3Rpb24gRHIoKXtpZih0eXBlb2YgX19TWVNURU1fSU5GT19fIT0idW5kZWZpbmVkIilyZXR1cm4gd2luZG93Ll9fU1lTVEVNX0lORk9fXztsZXR7cmVzb2x1dGlvbldpZHRoOmV9PXMuc2NyZWVuLmdldEN1cnJlbnRTaXplKCl8fHtyZXNvbHV0aW9uV2lkdGg6MH07cmV0dXJue3BsYXRmb3JtOihzLm9zLm5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpLHBpeGVsUmF0aW86cy5zY3JlZW4uc2NhbGUsd2luZG93V2lkdGg6TWF0aC5yb3VuZChlKX19ZnVuY3Rpb24gQmkoZSx0LG4pe2UuJHBhZ2UubWV0YS5pc05WdWU/ZGkoZSx0LG4pOkJuKGUsdCxuKX1mdW5jdGlvbiBCbihlLHQsbil7b3QuaW52b2tlVmlld01ldGhvZCgicmVxdWVzdENvbXBvbmVudEluZm8iLHtyZXFzOnQubWFwKHI9PihyLmNvbXBvbmVudCYmKHIuY29tcG9uZW50PXIuY29tcG9uZW50LiRlbC5ub2RlSWQpLHIpKX0sZS4kcGFnZS5pZCxuKX1mdW5jdGlvbiBkaShlLHQsbil7bGV0IHI9ZGEodCksbz1uZXcgQXJyYXkoci5sZW5ndGgpO01pKHIsZS4kZWwsbyksTGkoZS4kcmVxdWlyZU5hdGl2ZVBsdWdpbigiZG9tIiksbywwLFtdLGM9PntuKGMpfSl9ZnVuY3Rpb24gZGEoZSl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl0uc2VsZWN0b3I7ci5pbmRleE9mKCIjIik9PT0wJiZ0LnB1c2goci5zdWJzdHJpbmcoMSkpfXJldHVybiB0fWZ1bmN0aW9uIE1pKGUsdCxuKXtsZXQgcj10LmNoaWxkcmVuO2lmKCF6LmlzQXJyYXkocikpcmV0dXJuITE7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspe2xldCBjPXJbb107aWYoYy5hdHRyKXtsZXQgZz1lLmluZGV4T2YoYy5hdHRyLmlkKTtpZihnPj0wJiYobltnXT17aWQ6ZVtnXSxyZWY6Yy5yZWYsZGF0YXNldDpLLnBhcnNlTlZ1ZURhdGFzZXQoYy5hdHRyKX0sZS5sZW5ndGg9PT0xKSlicmVha31jLmNoaWxkcmVuJiZNaShlLGMsbil9fWZ1bmN0aW9uIExpKGUsdCxuLHIsbyl7bGV0IGM9dFtuXTtlLmdldENvbXBvbmVudFJlY3QoYy5yZWYsZz0+e2cuc2l6ZS5pZD1jLmlkLGcuc2l6ZS5kYXRhc2V0PWMuZGF0YXNldCxyLnB1c2goZy5zaXplKSxuKz0xLG48dC5sZW5ndGg/TGkoZSx0LG4scixvKTpvKHIpfSl9ZnVuY3Rpb24gSW8oZSx0KXtvdC5pbnZva2VWaWV3TWV0aG9kKCJzZXRQYWdlTWV0YSIsdCxlLiRwYWdlLmlkKX1sZXQgQW49ZT0+ZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0IixEaT1bInsiLCJ9Il07Y2xhc3MgWWl7Y29uc3RydWN0b3IoKXt0aGlzLl9jYWNoZXM9T2JqZWN0LmNyZWF0ZShudWxsKX1pbnRlcnBvbGF0ZSh0LG4scj1EaSl7aWYoIW4pcmV0dXJuW3RdO2xldCBvPXRoaXMuX2NhY2hlc1t0XTtyZXR1cm4gb3x8KG89SXIodCxyKSx0aGlzLl9jYWNoZXNbdF09bykscmkobyxuKX19bGV0IENpPS9eKD86XGQpKy8sRmk9L14oPzpcdykrLztmdW5jdGlvbiBJcihlLFt0LG5dKXtsZXQgcj1bXSxvPTAsYz0iIjtmb3IoO288ZS5sZW5ndGg7KXtsZXQgZz1lW28rK107aWYoZz09PXQpe2MmJnIucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6Y30pLGM9IiI7bGV0IGI9IiI7Zm9yKGc9ZVtvKytdO2chPT12b2lkIDAmJmchPT1uOyliKz1nLGc9ZVtvKytdO2xldCBWPWc9PT1uLFQ9Q2kudGVzdChiKT8ibGlzdCI6ViYmRmkudGVzdChiKT8ibmFtZWQiOiJ1bmtub3duIjtyLnB1c2goe3ZhbHVlOmIsdHlwZTpUfSl9ZWxzZSBjKz1nfXJldHVybiBjJiZyLnB1c2goe3R5cGU6InRleHQiLHZhbHVlOmN9KSxyfWZ1bmN0aW9uIHJpKGUsdCl7bGV0IG49W10scj0wLG89QXJyYXkuaXNBcnJheSh0KT8ibGlzdCI6QW4odCk/Im5hbWVkIjoidW5rbm93biI7aWYobz09PSJ1bmtub3duIilyZXR1cm4gbjtmb3IoO3I8ZS5sZW5ndGg7KXtsZXQgYz1lW3JdO3N3aXRjaChjLnR5cGUpe2Nhc2UidGV4dCI6bi5wdXNoKGMudmFsdWUpO2JyZWFrO2Nhc2UibGlzdCI6bi5wdXNoKHRbcGFyc2VJbnQoYy52YWx1ZSwxMCldKTticmVhaztjYXNlIm5hbWVkIjpvPT09Im5hbWVkIiYmbi5wdXNoKHRbYy52YWx1ZV0pO2JyZWFrO2Nhc2UidW5rbm93biI6YnJlYWt9cisrfXJldHVybiBufWxldCBycj0iemgtSGFucyIsY3I9InpoLUhhbnQiLHFuPSJlbiIsZXI9ImZyIixkcj0iZXMiLG1vPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksX289KGUsdCk9Pm1vLmNhbGwoZSx0KSxxaT1uZXcgWWk7ZnVuY3Rpb24gSmkoZSx0KXtyZXR1cm4hIXQuZmluZChuPT5lLmluZGV4T2YobikhPT0tMSl9ZnVuY3Rpb24gWG8oZSx0KXtyZXR1cm4gdC5maW5kKG49PmUuaW5kZXhPZihuKT09PTApfWZ1bmN0aW9uIFdyKGUsdCl7aWYoIWUpcmV0dXJuO2lmKGU9ZS50cmltKCkucmVwbGFjZSgvXy9nLCItIiksdCYmdFtlXSlyZXR1cm4gZTtpZihlPWUudG9Mb3dlckNhc2UoKSxlPT09ImNoaW5lc2UiKXJldHVybiBycjtpZihlLmluZGV4T2YoInpoIik9PT0wKXJldHVybiBlLmluZGV4T2YoIi1oYW5zIik+LTE/cnI6ZS5pbmRleE9mKCItaGFudCIpPi0xfHxKaShlLFsiLXR3IiwiLWhrIiwiLW1vIiwiLWNodCJdKT9jcjpycjtsZXQgbj1bcW4sZXIsZHJdO3QmJk9iamVjdC5rZXlzKHQpLmxlbmd0aD4wJiYobj1PYmplY3Qua2V5cyh0KSk7bGV0IHI9WG8oZSxuKTtpZihyKXJldHVybiByfWNsYXNzIHlye2NvbnN0cnVjdG9yKHtsb2NhbGU6dCxmYWxsYmFja0xvY2FsZTpuLG1lc3NhZ2VzOnIsd2F0Y2hlcjpvLGZvcm1hdGVyOmN9KXt0aGlzLmxvY2FsZT1xbix0aGlzLmZhbGxiYWNrTG9jYWxlPXFuLHRoaXMubWVzc2FnZT17fSx0aGlzLm1lc3NhZ2VzPXt9LHRoaXMud2F0Y2hlcnM9W10sbiYmKHRoaXMuZmFsbGJhY2tMb2NhbGU9biksdGhpcy5mb3JtYXRlcj1jfHxxaSx0aGlzLm1lc3NhZ2VzPXJ8fHt9LHRoaXMuc2V0TG9jYWxlKHR8fHFuKSxvJiZ0aGlzLndhdGNoTG9jYWxlKG8pfXNldExvY2FsZSh0KXtsZXQgbj10aGlzLmxvY2FsZTt0aGlzLmxvY2FsZT1Xcih0LHRoaXMubWVzc2FnZXMpfHx0aGlzLmZhbGxiYWNrTG9jYWxlLHRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdfHwodGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV09e30pLHRoaXMubWVzc2FnZT10aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXSxuIT09dGhpcy5sb2NhbGUmJnRoaXMud2F0Y2hlcnMuZm9yRWFjaChyPT57cih0aGlzLmxvY2FsZSxuKX0pfWdldExvY2FsZSgpe3JldHVybiB0aGlzLmxvY2FsZX13YXRjaExvY2FsZSh0KXtsZXQgbj10aGlzLndhdGNoZXJzLnB1c2godCktMTtyZXR1cm4oKT0+e3RoaXMud2F0Y2hlcnMuc3BsaWNlKG4sMSl9fWFkZCh0LG4scj0hMCl7bGV0IG89dGhpcy5tZXNzYWdlc1t0XTtvP3I/T2JqZWN0LmFzc2lnbihvLG4pOk9iamVjdC5rZXlzKG4pLmZvckVhY2goYz0+e19vKG8sYyl8fChvW2NdPW5bY10pfSk6dGhpcy5tZXNzYWdlc1t0XT1ufWYodCxuLHIpe3JldHVybiB0aGlzLmZvcm1hdGVyLmludGVycG9sYXRlKHQsbixyKS5qb2luKCIiKX10KHQsbixyKXtsZXQgbz10aGlzLm1lc3NhZ2U7cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIj8obj1XcihuLHRoaXMubWVzc2FnZXMpLG4mJihvPXRoaXMubWVzc2FnZXNbbl0pKTpyPW4sX28obyx0KT90aGlzLmZvcm1hdGVyLmludGVycG9sYXRlKG9bdF0scikuam9pbigiIik6KGNvbnNvbGUud2FybihgQ2Fubm90IHRyYW5zbGF0ZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCAke3R9LiBVc2UgdGhlIHZhbHVlIG9mIGtleXBhdGggYXMgZGVmYXVsdC5gKSx0KX19ZnVuY3Rpb24gTm8oZSx0KXtlLiR3YXRjaExvY2FsZT9lLiR3YXRjaExvY2FsZShuPT57dC5zZXRMb2NhbGUobil9KTplLiR3YXRjaCgoKT0+ZS4kbG9jYWxlLG49Pnt0LnNldExvY2FsZShuKX0pfWZ1bmN0aW9uIEIoKXtyZXR1cm4gdHlwZW9mIFAhPSJ1bmRlZmluZWQiJiZQLmdldExvY2FsZT9QLmdldExvY2FsZSgpOnR5cGVvZiBnbG9iYWwhPSJ1bmRlZmluZWQiJiZnbG9iYWwuZ2V0TG9jYWxlP2dsb2JhbC5nZXRMb2NhbGUoKTpxbn1mdW5jdGlvbiBZKGUsdD17fSxuLHIpe3R5cGVvZiBlIT0ic3RyaW5nIiYmKFtlLHRdPVt0LGVdKSx0eXBlb2YgZSE9InN0cmluZyImJihlPUIoKSksdHlwZW9mIG4hPSJzdHJpbmciJiYobj10eXBlb2YgUiE9InVuZGVmaW5lZCImJlIuZmFsbGJhY2tMb2NhbGV8fHFuKTtsZXQgbz1uZXcgeXIoe2xvY2FsZTplLGZhbGxiYWNrTG9jYWxlOm4sbWVzc2FnZXM6dCx3YXRjaGVyOnJ9KSxjPShnLGIpPT57aWYodHlwZW9mIEN0IT0iZnVuY3Rpb24iKWM9ZnVuY3Rpb24oVixUKXtyZXR1cm4gby50KFYsVCl9O2Vsc2V7bGV0IFY9ITE7Yz1mdW5jdGlvbihULEQpe2xldCB2ZT1DdCgpLiR2bTtyZXR1cm4gdmUmJih2ZS4kbG9jYWxlLFZ8fChWPSEwLE5vKHZlLG8pKSksby50KFQsRCl9fXJldHVybiBjKGcsYil9O3JldHVybntpMThuOm8sZihnLGIsVil7cmV0dXJuIG8uZihnLGIsVil9LHQoZyxiKXtyZXR1cm4gYyhnLGIpfSxhZGQoZyxiLFY9ITApe3JldHVybiBvLmFkZChnLGIsVil9LHdhdGNoKGcpe3JldHVybiBvLndhdGNoTG9jYWxlKGcpfSxnZXRMb2NhbGUoKXtyZXR1cm4gby5nZXRMb2NhbGUoKX0sc2V0TG9jYWxlKGcpe3JldHVybiBvLnNldExvY2FsZShnKX19fWZ1bmN0aW9uIHJlKGUsdCl7cmV0dXJuIGUuaW5kZXhPZih0WzBdKT4tMX1sZXQgeGU9Sy5vbmNlKCgpPT50eXBlb2YgUiE9InVuZGVmaW5lZCImJlIubG9jYWxlcyYmISFPYmplY3Qua2V5cyhSLmxvY2FsZXMpLmxlbmd0aCksWmU7ZnVuY3Rpb24gY3QoKXtsZXQgZT1QLmdldExvY2FsZSgpLHQ9Ui5sb2NhbGVzO3JldHVybiB0W2VdfHx0W1IuZmFsbGJhY2tMb2NhbGVdfHx0LmVufHx7fX1mdW5jdGlvbiBZdChlKXtyZXR1cm4gcmUoZSxLLkkxOE5fSlNPTl9ERUxJTUlURVJTKT9ndCgpLmYoZSxjdCgpLEsuSTE4Tl9KU09OX0RFTElNSVRFUlMpOmV9ZnVuY3Rpb24gUXQoZSx0KXtpZih0Lmxlbmd0aD09PTEpe2lmKGUpe2xldCByPWI9PnouaXNTdHJpbmcoYikmJnJlKGIsSy5JMThOX0pTT05fREVMSU1JVEVSUyksbz10WzBdLGM9W107aWYoei5pc0FycmF5KGUpJiYoYz1lLmZpbHRlcihiPT5yKGJbb10pKSkubGVuZ3RoKXJldHVybiBjO2xldCBnPWVbdFswXV07aWYocihnKSlyZXR1cm4gZX1yZXR1cm59bGV0IG49dC5zaGlmdCgpO3JldHVybiBRdChlJiZlW25dLHQpfWZ1bmN0aW9uIFZpKGUsdCl7cmV0dXJuIHQubWFwKG49PkdyKGUsbikpfWZ1bmN0aW9uIEdyKGUsdCl7bGV0IG49UXQoZSx0KTtpZighbilyZXR1cm4hMTtsZXQgcj10W3QubGVuZ3RoLTFdO2lmKHouaXNBcnJheShuKSluLmZvckVhY2gobz0+R3Iobyxbcl0pKTtlbHNle2xldCBvPW5bcl07T2JqZWN0LmRlZmluZVByb3BlcnR5KG4scix7Z2V0KCl7cmV0dXJuIFl0KG8pfSxzZXQoYyl7bz1jfX0pfXJldHVybiEwfWZ1bmN0aW9uIGd0KCl7aWYoIVplKXtsZXQgZTtpZih0eXBlb2YgQ3Q9PSJmdW5jdGlvbiI/ZT1mLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRMYW5ndWFnZSgpOmU9cy53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuZ2V0U3R5bGUoKS5sb2NhbGUsWmU9WShlKSx4ZSgpKXtsZXQgdD1PYmplY3Qua2V5cyhSLmxvY2FsZXN8fHt9KTt0Lmxlbmd0aCYmdC5mb3JFYWNoKG49PlplLmFkZChuLFIubG9jYWxlc1tuXSkpLFplLnNldExvY2FsZShlKX19cmV0dXJuIFplfWZ1bmN0aW9uIFJ0KGUsdCxuKXtyZXR1cm4gdC5yZWR1Y2UoKHIsbyxjKT0+KHJbZStvXT1uW2NdLHIpLHt9KX1sZXQgWXI9Sy5vbmNlKCgpPT57bGV0IGU9InVuaS5hcHAuIix0PVsicXVpdCJdO2d0KCkuYWRkKHFuLFJ0KGUsdCxbIlByZXNzIGJhY2sgYnV0dG9uIGFnYWluIHRvIGV4aXQiXSksITEpLGd0KCkuYWRkKGRyLFJ0KGUsdCxbIlB1bHNlIG90cmEgdmV6IHBhcmEgc2FsaXIiXSksITEpLGd0KCkuYWRkKGVyLFJ0KGUsdCxbIkFwcHV5ZXogXHhFMCBub3V2ZWF1IHBvdXIgcXVpdHRlciBsJ2FwcGxpY2F0aW9uIl0pLCExKSxndCgpLmFkZChycixSdChlLHQsWyJcdTUxOERcdTYzMDlcdTRFMDBcdTZCMjFcdTkwMDBcdTUxRkFcdTVFOTRcdTc1MjgiXSksITEpLGd0KCkuYWRkKGNyLFJ0KGUsdCxbIlx1NTE4RFx1NjMwOVx1NEUwMFx1NkIyMVx1OTAwMFx1NTFGQVx1NjFDOVx1NzUyOCJdKSwhMSl9KSxhbz1LLm9uY2UoKCk9PntsZXQgZT0idW5pLnNob3dBY3Rpb25TaGVldC4iLHQ9WyJjYW5jZWwiXTtndCgpLmFkZChxbixSdChlLHQsWyJDYW5jZWwiXSksITEpLGd0KCkuYWRkKGRyLFJ0KGUsdCxbIkNhbmNlbGFyIl0pLCExKSxndCgpLmFkZChlcixSdChlLHQsWyJBbm51bGVyIl0pLCExKSxndCgpLmFkZChycixSdChlLHQsWyJcdTUzRDZcdTZEODgiXSksITEpLGd0KCkuYWRkKGNyLFJ0KGUsdCxbIlx1NTNENlx1NkQ4OCJdKSwhMSl9KSxvZT1LLm9uY2UoKCk9PntsZXQgZT0idW5pLnNob3dNb2RhbC4iLHQ9WyJjYW5jZWwiLCJjb25maXJtIl07Z3QoKS5hZGQocW4sUnQoZSx0LFsiQ2FuY2VsIiwiT0siXSksITEpLGd0KCkuYWRkKGRyLFJ0KGUsdCxbIkNhbmNlbGFyIiwiT0siXSksITEpLGd0KCkuYWRkKGVyLFJ0KGUsdCxbIkFubnVsZXIiLCJPSyJdKSwhMSksZ3QoKS5hZGQocnIsUnQoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU3ODZFXHU1QjlBIl0pLCExKSxndCgpLmFkZChjcixSdChlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTc4QkFcdTVCOUEiXSksITEpfSksWD1LLm9uY2UoKCk9PntsZXQgZT0idW5pLmNob29zZUltYWdlLiIsdD1bImNhbmNlbCIsInNvdXJjZVR5cGUuYWxidW0iLCJzb3VyY2VUeXBlLmNhbWVyYSJdO2d0KCkuYWRkKHFuLFJ0KGUsdCxbIkNhbmNlbCIsIkFsYnVtIiwiQ2FtZXJhIl0pLCExKSxndCgpLmFkZChkcixSdChlLHQsWyJDYW5jZWxhciIsIlx4QzFsYnVtIiwiQ1x4RTFtYXJhIl0pLCExKSxndCgpLmFkZChlcixSdChlLHQsWyJBbm51bGVyIiwiQWxidW0iLCJDYW1ceEU5cmEiXSksITEpLGd0KCkuYWRkKHJyLFJ0KGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NEVDRVx1NzZGOFx1NTE4Q1x1OTAwOVx1NjJFOSIsIlx1NjJDRFx1NjQ0NCJdKSwhMSksZ3QoKS5hZGQoY3IsUnQoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU1RjlFXHU3NkY4XHU1MThBXHU5MDc4XHU2NEM3IiwiXHU2MkNEXHU2NTFEIl0pLCExKX0pLHNlPUsub25jZSgoKT0+e2xldCBlPSJ1bmkuY2hvb3NlVmlkZW8uIix0PVsiY2FuY2VsIiwic291cmNlVHlwZS5hbGJ1bSIsInNvdXJjZVR5cGUuY2FtZXJhIl07Z3QoKS5hZGQocW4sUnQoZSx0LFsiQ2FuY2VsIiwiQWxidW0iLCJDYW1lcmEiXSksITEpLGd0KCkuYWRkKGRyLFJ0KGUsdCxbIkNhbmNlbGFyIiwiXHhDMWxidW0iLCJDXHhFMW1hcmEiXSksITEpLGd0KCkuYWRkKGVyLFJ0KGUsdCxbIkFubnVsZXIiLCJBbGJ1bSIsIkNhbVx4RTlyYSJdKSwhMSksZ3QoKS5hZGQocnIsUnQoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RUNFXHU3NkY4XHU1MThDXHU5MDA5XHU2MkU5IiwiXHU2MkNEXHU2NDQ0Il0pLCExKSxndCgpLmFkZChjcixSdChlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTVGOUVcdTc2RjhcdTUxOEFcdTkwNzhcdTY0QzciLCJcdTYyQ0RcdTY1MUQiXSksITEpfSksQmU9Sy5vbmNlKCgpPT57bGV0IGU9InVuaS5wcmV2aWV3SW1hZ2UuIix0PVsiY2FuY2VsIiwiYnV0dG9uLnNhdmUiLCJzYXZlLnN1Y2Nlc3MiLCJzYXZlLmZhaWwiXTtndCgpLmFkZChxbixSdChlLHQsWyJDYW5jZWwiLCJTYXZlIEltYWdlIiwiU2F2ZWQgc3VjY2Vzc2Z1bGx5IiwiU2F2ZSBmYWlsZWQiXSksITEpLGd0KCkuYWRkKGRyLFJ0KGUsdCxbIkNhbmNlbGFyIiwiR3VhcmRhciBpbWFnZW4iLCJHdWFyZGFkbyBleGl0b3NhbWVudGUiLCJFcnJvciBhbCBndWFyZGFyIl0pLCExKSxndCgpLmFkZChlcixSdChlLHQsWyJBbm51bGVyIiwiR3VhcmRhciBpbWFnZW4iLCJFbnJlZ2lzdHJceEU5IGF2ZWMgc3VjY1x4RThzIiwiXHhDOWNoZWMgZGUgbGEgc2F1dmVnYXJkZSJdKSwhMSksZ3QoKS5hZGQocnIsUnQoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RkREXHU1QjU4XHU1NkZFXHU1MENGIiwiXHU0RkREXHU1QjU4XHU1NkZFXHU1MENGXHU1MjMwXHU3NkY4XHU1MThDXHU2MjEwXHU1MjlGIiwiXHU0RkREXHU1QjU4XHU1NkZFXHU1MENGXHU1MjMwXHU3NkY4XHU1MThDXHU1OTMxXHU4RDI1Il0pLCExKSxndCgpLmFkZChjcixSdChlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTRGRERcdTVCNThcdTU3MTZcdTUwQ0YiLCJcdTRGRERcdTVCNThcdTU3MTZcdTUwQ0ZcdTUyMzBcdTc2RjhcdTUxOEFcdTYyMTBcdTUyOUYiLCJcdTRGRERcdTVCNThcdTU3MTZcdTUwQ0ZcdTUyMzBcdTc2RjhcdTUxOEFcdTU5MzFcdTY1NTciXSksITEpfSksbXQ9Sy5vbmNlKCgpPT57bGV0IGU9InVuaS5zZXRDbGlwYm9hcmREYXRhLiIsdD1bInN1Y2Nlc3MiLCJmYWlsIl07Z3QoKS5hZGQocW4sUnQoZSx0LFsiQ29udGVudCBjb3BpZWQiLCJDb3B5IGZhaWxlZCwgcGxlYXNlIGNvcHkgbWFudWFsbHkiXSksITEpLGd0KCkuYWRkKGRyLFJ0KGUsdCxbIkNvbnRlbmlkbyBjb3BpYWRvIiwiRXJyb3IgYWwgY29waWFyLCBjb3BpZSBtYW51YWxtZW50ZSJdKSwhMSksZ3QoKS5hZGQoZXIsUnQoZSx0LFsiQ29udGVudSBjb3BpXHhFOSIsIlx4QzljaGVjIGRlIGxhIGNvcGllLCBjb3BpZXogbWFudWVsbGVtZW50Il0pLCExKSxndCgpLmFkZChycixSdChlLHQsWyJcdTUxODVcdTVCQjlcdTVERjJcdTU5MERcdTUyMzYiLCJcdTU5MERcdTUyMzZcdTU5MzFcdThEMjVcdUZGMENcdThCRjdcdTYyNEJcdTUyQThcdTU5MERcdTUyMzYiXSksITEpLGd0KCkuYWRkKGNyLFJ0KGUsdCxbIlx1NTE2N1x1NUJCOVx1NURGMlx1NUZBOVx1NTIzNiIsIlx1NUZBOVx1NTIzNlx1NTkzMVx1NjU1N1x1RkYwQ1x1OEFDQlx1NjI0Qlx1NTJENVx1NUZBOVx1ODhGRCJdKSwhMSl9KSxwbj1LLm9uY2UoKCk9PntsZXQgZT0idW5pLnNjYW5Db2RlLiIsdD1bInRpdGxlIiwiYWxidW0iLCJmYWlsIiwiZmxhc2gub24iLCJmbGFzaC5vZmYiXTtndCgpLmFkZChxbixSdChlLHQsWyJTY2FuIGNvZGUiLCJBbGJ1bSIsIlJlY29nbml0aW9uIGZhaWx1cmUiLCJUYXAgdG8gdHVybiBsaWdodCBvbiIsIlRhcCB0byB0dXJuIGxpZ2h0IG9mZiJdKSwhMSksZ3QoKS5hZGQoZHIsUnQoZSx0LFsiQ1x4RjNkaWdvIGRlIGVzY2FuZW8iLCJceEMxbGJ1bSIsIlx4QzljaGVjIGRlIGxhIHJlY29ubmFpc3NhbmNlIiwiVG9xdWUgcGFyYSBlbmNlbmRlciBsYSBsdXoiLCJUb3F1ZSBwYXJhIGFwYWdhciBsYSBsdXoiXSksITEpLGd0KCkuYWRkKGVyLFJ0KGUsdCxbIkNvZGUgZFx1MjAxOWFuYWx5c2UiLCJBbGJ1bSIsIkZhbGxvIGRlIHJlY29ub2NpbWllbnRvIiwiQXBwdXlleiBwb3VyIGFjdGl2ZXIgbCdceEU5Y2xhaXJhZ2UiLCJBcHB1eWV6IHBvdXIgZFx4RTlzYWN0aXZlciBsJ1x4RTljbGFpcmFnZSJdKSwhMSksZ3QoKS5hZGQocnIsUnQoZSx0LFsiXHU2MjZCXHU3ODAxIiwiXHU3NkY4XHU1MThDIiwiXHU4QkM2XHU1MjJCXHU1OTMxXHU4RDI1IiwiXHU4RjdCXHU4OUU2XHU3MTY3XHU0RUFFIiwiXHU4RjdCXHU4OUU2XHU1MTczXHU5NUVEIl0pLCExKSxndCgpLmFkZChjcixSdChlLHQsWyJcdTYzODNcdTc4QkMiLCJcdTc2RjhcdTUxOEEiLCJcdThCNThcdTUyMjVcdTU5MzFcdTY1NTciLCJcdThGMTVcdTg5RjhcdTcxNjdcdTRFQUUiLCJcdThGMTVcdTg5RjhcdTk1RENcdTk1ODkiXSksITEpfSksSm49Sy5vbmNlKCgpPT57bGV0IGU9InVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uIix0PVsiYXV0aENvbnRlbnQiLCJ3YWl0aW5nQ29udGVudCJdO2d0KCkuYWRkKHFuLFJ0KGUsdCxbIkZpbmdlcnByaW50IHJlY29nbml0aW9uIiwiVW5yZWNvZ25pemFibGUiXSksITEpLGd0KCkuYWRkKGRyLFJ0KGUsdCxbIlJlY29ub2NpbWllbnRvIGRlIGh1ZWxsYXMgZGFjdGlsYXJlcyIsIklycmVjb25vY2libGUiXSksITEpLGd0KCkuYWRkKGVyLFJ0KGUsdCxbIlJlY29ubmFpc3NhbmNlIGRlIGwnZW1wcmVpbnRlIGRpZ2l0YWxlIiwiTVx4RTljb25uYWlzc2FibGUiXSksITEpLGd0KCkuYWRkKHJyLFJ0KGUsdCxbIlx1NjMwN1x1N0VCOVx1OEJDNlx1NTIyQlx1NEUyRC4uLiIsIlx1NjVFMFx1NkNENVx1OEJDNlx1NTIyQiJdKSwhMSksZ3QoKS5hZGQoY3IsUnQoZSx0LFsiXHU2MzA3XHU3RDBCXHU4QjU4XHU1MjI1XHU0RTJELi4uIiwiXHU3MTIxXHU2Q0Q1XHU4QjU4XHU1MjI1Il0pLCExKX0pO2Z1bmN0aW9uIFVuKGUpe2lmKHhlKCkpcmV0dXJuIFZpKGUsW1sidGl0bGVUZXh0Il0sWyJzZWFyY2hJbnB1dCIsInBsYWNlaG9sZGVyIl0sWyJidXR0b25zIiwidGV4dCJdXSl9ZnVuY3Rpb24gU3IoZSl7aWYoeGUoKSl7bGV0IHQ9ImNhcHRpb24iO3JldHVybiBWaShlLFtbImNvbnRlbnRkb3duIix0XSxbImNvbnRlbnRvdmVyIix0XSxbImNvbnRlbnRyZWZyZXNoIix0XV0pfX1mdW5jdGlvbiBGcihlKXtsZXQgdD1uZXcgSy5FbWl0dGVyO3JldHVybntvbihuLHIpe3JldHVybiB0Lm9uKG4scil9LG9uY2UobixyKXtyZXR1cm4gdC5vbmNlKG4scil9LG9mZihuLHIpe3JldHVybiB0Lm9mZihuLHIpfSxlbWl0KG4sLi4ucil7cmV0dXJuIHQuZW1pdChuLC4uLnIpfSxzdWJzY3JpYmUobixyLG89ITEpe3Rbbz8ib25jZSI6Im9uIl0oYCR7ZX0uJHtufWAscil9LHVuc3Vic2NyaWJlKG4scil7dC5vZmYoYCR7ZX0uJHtufWAscil9LHN1YnNjcmliZUhhbmRsZXIobixyLG8pe3QuZW1pdChgJHtlfS4ke259YCxyLG8pfX19bGV0IGJvPSJpbnZva2VWaWV3QXBpIixrbz0iaW52b2tlU2VydmljZUFwaSI7ZnVuY3Rpb24gUm8oZSl7cmV0dXJuIGU9ZSsiIixlLmluZGV4T2YoInJweCIpIT09LTF8fGUuaW5kZXhPZigidXB4IikhPT0tMX1mdW5jdGlvbiAkbihlLHQ9ITEpe2lmKHQpcmV0dXJuIEtuKGUpO2lmKHouaXNTdHJpbmcoZSkpe2xldCBuPXBhcnNlSW50KGUpfHwwO3JldHVybiBSbyhlKT9QLnVweDJweChuKTpufXJldHVybiBlfWZ1bmN0aW9uIEtuKGUpe3JldHVybiBSbyhlKT9lLnJlcGxhY2UoLyhcZCsoXC5cZCspPylbcnVdcHgvZywodCxuKT0+UC51cHgycHgocGFyc2VGbG9hdChuKSkrInB4Iik6ZX1mdW5jdGlvbiBIbihlKXtsZXQgdD1LLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZShlKTtpZih0LiRwYWdlKXJldHVybiB0LiRwYWdlLmlkO2lmKCF0LiQpcmV0dXJuO2xldCBuPXQuJC5yb290LnByb3h5O2lmKG4mJm4uJHBhZ2UpcmV0dXJuIG4uJHBhZ2UuaWR9ZnVuY3Rpb24gQWkoKXtsZXQgZT1SbigpLHQ9ZS5sZW5ndGg7aWYodClyZXR1cm4gZVt0LTFdfWZ1bmN0aW9uIGlzKCl7bGV0IGU9QWkoKTtpZihlKXJldHVybiBlLiRwYWdlLm1ldGF9ZnVuY3Rpb24gaGEoKXtsZXQgZT1pcygpO3JldHVybiBlP2UuaWQ6LTF9ZnVuY3Rpb24gd3IoKXtsZXQgZT1BaSgpO2lmKGUpcmV0dXJuIGUuJHZtfWxldCBUYT1bIm5hdmlnYXRpb25CYXIiLCJwdWxsVG9SZWZyZXNoIl07ZnVuY3Rpb24gRGEoKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShSLmdsb2JhbFN0eWxlfHx7fSkpfWZ1bmN0aW9uIEZhKGUsdCl7bGV0IG49RGEoKSxyPXouZXh0ZW5kKHtpZDp0fSxuLGUpO1RhLmZvckVhY2goYz0+e3JbY109ei5leHRlbmQoe30sbltjXSxlW2NdKX0pO2xldHtuYXZpZ2F0aW9uQmFyOm99PXI7cmV0dXJuIG8udGl0bGVUZXh0JiZvLnRpdGxlSW1hZ2UmJihvLnRpdGxlVGV4dD0iIikscn1mdW5jdGlvbiBWYShlKXtyZXR1cm4gSlNPTi5wYXJzZSgkbihKU09OLnN0cmluZ2lmeShlKSwhMCkpfWZ1bmN0aW9uIFVhKGUpe3JldHVybiBlLm9mZnNldCYmKGUub2Zmc2V0PSRuKGUub2Zmc2V0KSksZS5oZWlnaHQmJihlLmhlaWdodD0kbihlLmhlaWdodCkpLGUucmFuZ2UmJihlLnJhbmdlPSRuKGUucmFuZ2UpKSxlfWZ1bmN0aW9uIGdhKGUsdCxuLHIsbyxjKXtsZXR7aWQ6Zyxyb3V0ZTpifT1yLFY9Sy5ub3JtYWxpemVTdHlsZXMoci5uYXZpZ2F0aW9uQmFyLFIudGhlbWVDb25maWcsYykudGl0bGVDb2xvcjtyZXR1cm57aWQ6ZyxwYXRoOksuYWRkTGVhZGluZ1NsYXNoKGIpLHJvdXRlOmIsZnVsbFBhdGg6dCxvcHRpb25zOm4sbWV0YTpyLG9wZW5UeXBlOmUsZXZlbnRDaGFubmVsOm8sc3RhdHVzQmFyU3R5bGU6Vj09PSIjZmZmZmZmIj8ibGlnaHQiOiJkYXJrIn19ZnVuY3Rpb24gUGEoZSx0LG4pe2xldCByPWUuJFt0XTshei5pc0FycmF5KHIpfHxuLl9fd2VoJiZ6LnJlbW92ZShyLG4uX193ZWgpfWZ1bmN0aW9uIGpuKGUsdCxuKXtpZih6LmlzU3RyaW5nKGUpKW49dCx0PWUsZT13cigpO2Vsc2UgaWYodHlwZW9mIGU9PSJudW1iZXIiKXtsZXQgbz1SbigpLmZpbmQoYz0+Yy4kcGFnZS5pZD09PWUpO28/ZT1vLiR2bTplPXdyKCl9aWYoIWUpcmV0dXJuO2lmKGUuX19jYWxsX2hvb2spcmV0dXJuIGUuX19jYWxsX2hvb2sodCxuKTtsZXQgcj1lLiRbdF07cmV0dXJuIHImJksuaW52b2tlQXJyYXlGbnMocixuKX1mdW5jdGlvbiB4byhlKXtpZihlLmluZGV4T2YoIi8iKT09PTApcmV0dXJuIGU7bGV0IHQ9IiIsbj1SbigpO3JldHVybiBuLmxlbmd0aCYmKHQ9bltuLmxlbmd0aC0xXS4kcGFnZS5yb3V0ZSksUW8odCxlKX1mdW5jdGlvbiBRbyhlLHQpe2lmKHQuaW5kZXhPZigiLyIpPT09MClyZXR1cm4gdDtpZih0LmluZGV4T2YoIi4vIik9PT0wKXJldHVybiBRbyhlLHQuc2xpY2UoMikpO2xldCBuPXQuc3BsaXQoIi8iKSxyPW4ubGVuZ3RoLG89MDtmb3IoO288ciYmbltvXT09PSIuLiI7bysrKTtuLnNwbGljZSgwLG8pLHQ9bi5qb2luKCIvIik7bGV0IGM9ZS5sZW5ndGg+MD9lLnNwbGl0KCIvIik6W107cmV0dXJuIGMuc3BsaWNlKGMubGVuZ3RoLW8tMSxvKzEpLEsuYWRkTGVhZGluZ1NsYXNoKGMuY29uY2F0KG4pLmpvaW4oIi8iKSl9ZnVuY3Rpb24gS2koZSx0PSExKXtyZXR1cm4gdD9EZS5maW5kKG49Pm4ucGF0aD09PWV8fG4uYWxpYXM9PT1lKTpEZS5maW5kKG49Pm4ucGF0aD09PWUpfWZ1bmN0aW9uIG9zKGUpe2xldCB0PUtpKGUpO2lmKHQpcmV0dXJuIHQubWV0YX1mdW5jdGlvbiBhcyhlLHQsbil7bGV0IHI9S2koSy5hZGRMZWFkaW5nU2xhc2godCkpO2lmKHIpe2xldHttZXRhOmN9PXI7ZGVsZXRlIGMudGFiQmFySW5kZXgsYy5pc1F1aXQ9Yy5pc1RhYkJhcj0hMX1sZXQgbz1LaShLLmFkZExlYWRpbmdTbGFzaChuKSk7aWYobyl7bGV0e21ldGE6Y309bztjLnRhYkJhckluZGV4PWUsYy5pc1F1aXQ9Yy5pc1RhYkJhcj0hMDtsZXQgZz1SLnRhYkJhcjtnJiZnLmxpc3QmJmcubGlzdFtlXSYmKGcubGlzdFtlXS5wYWdlUGF0aD1LLnJlbW92ZUxlYWRpbmdTbGFzaChuKSl9fWxldCBCbyxzcyxzbztmdW5jdGlvbiBoaSgpe3JldHVybiB0eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmdHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJnR5cGVvZiBkb2N1bWVudD09Im9iamVjdCI/IndlYnZpZXciOiJ2OCJ9ZnVuY3Rpb24gT2koKXtyZXR1cm4gQm8ud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkfWxldCBaaSxnaSxocj17fTtmdW5jdGlvbiB1cihlKXtsZXQgdD1lLmRhdGEmJmUuZGF0YS5fX21lc3NhZ2U7aWYoIXR8fCF0Ll9fcGFnZSlyZXR1cm47bGV0IG49dC5fX3BhZ2Uscj1ocltuXTtyJiZyKHQpLHQua2VlcHx8ZGVsZXRlIGhyW25dfWZ1bmN0aW9uICRhKGUsdCl7aGkoKT09PSJ2OCI/c28/KFppJiZaaS5jbG9zZSgpLFppPW5ldyBzbyhPaSgpKSxaaS5vbm1lc3NhZ2U9dXIpOmdpfHwoZ2k9c3MucmVxdWlyZU1vZHVsZSgiZ2xvYmFsRXZlbnQiKSxnaS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsdXIpKTp3aW5kb3cuX19wbHVzTWVzc2FnZT11cixocltlXT10fWNsYXNzIEhhe2NvbnN0cnVjdG9yKHQpe3RoaXMud2Vidmlldz10fXNlbmRNZXNzYWdlKHQpe2xldCBuPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe19fbWVzc2FnZTp7ZGF0YTp0fX0pKSxyPXRoaXMud2Vidmlldy5pZDtzbz9uZXcgc28ocikucG9zdE1lc3NhZ2Uobik6Qm8ud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcmJkJvLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3KG4scil9Y2xvc2UoKXt0aGlzLndlYnZpZXcuY2xvc2UoKX19ZnVuY3Rpb24gWGkoe2NvbnRleHQ6ZT17fSx1cmw6dCxkYXRhOm49e30sc3R5bGU6cj17fSxvbk1lc3NhZ2U6byxvbkNsb3NlOmN9KXtsZXQgZz1SLmRhcmttb2RlO0JvPWUucGx1c3x8cyxzcz1lLndlZXh8fCh0eXBlb2YgZj09Im9iamVjdCI/ZjpudWxsKSxzbz1lLkJyb2FkY2FzdENoYW5uZWx8fCh0eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbD09Im9iamVjdCI/QnJvYWRjYXN0Q2hhbm5lbDpudWxsKTtsZXQgYj17YXV0b0JhY2tCdXR0b246ITAsdGl0bGVTaXplOiIxN3B4In0sVj1gcGFnZSR7RGF0ZS5ub3coKX1gO3I9ei5leHRlbmQoe30sciksci50aXRsZU5WaWV3IT09ITEmJnIudGl0bGVOVmlldyE9PSJub25lIiYmKHIudGl0bGVOVmlldz16LmV4dGVuZChiLHIudGl0bGVOVmlldykpO2xldCBUPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6YC8ke3R9LmpzYCxkZWZhdWx0Rm9udFNpemU6MTYsdmlld3BvcnQ6Qm8uc2NyZWVuLnJlc29sdXRpb25XaWR0aH19O3I9ei5leHRlbmQoVCxyKTtsZXQgRD1Cby53ZWJ2aWV3LmNyZWF0ZSgiIixWLHIse2V4dHJhczp7ZnJvbTpPaSgpLHJ1bnRpbWU6aGkoKSxkYXRhOnouZXh0ZW5kKHt9LG4se2Rhcmttb2RlOmd9KSx1c2VHbG9iYWxFdmVudDohc299fSk7cmV0dXJuIEQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGMpLCRhKFYsdmU9Pnt6LmlzRnVuY3Rpb24obykmJm8odmUuZGF0YSksdmUua2VlcHx8RC5jbG9zZSgiYXV0byIpfSksRC5zaG93KHIuYW5pbWF0aW9uVHlwZSxyLmFuaW1hdGlvbkR1cmF0aW9uKSxuZXcgSGEoRCl9bGV0IGxvPShlLHQpPT5vdC5lbWl0KCJhcGkuIitlLHQpLGNvPTE7ZnVuY3Rpb24gbHMoZSl7cmV0dXJuKGV8fGhhKCkpKyIuIitib31sZXQgcGE9KGUsdCxuLHIpPT57bGV0e3N1YnNjcmliZTpvLHB1Ymxpc2hIYW5kbGVyOmN9PW90LGc9cj9jbysrOjA7ciYmbyhibysiLiIrZyxyLCEwKSxjKGxzKG4pLHtpZDpnLG5hbWU6ZSxhcmdzOnR9LG4pfSxNbz0oZSx0LG4scik9PntsZXR7c3Vic2NyaWJlOm8sdW5zdWJzY3JpYmU6YyxwdWJsaXNoSGFuZGxlcjpnfT1vdCxiPWNvKyssVj1ibysiLiIrYjtyZXR1cm4gbyhWLG4pLGcobHMocikse2lkOmIsbmFtZTplLGFyZ3M6dH0sciksKCk9PntjKFYpfX0sdmE9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiB2KCl7b3Quc3Vic2NyaWJlKGtvLCQpfWZ1bmN0aW9uIHgoZSx0KXt2YVtlXXx8KHZhW2VdPXQpfWZ1bmN0aW9uICQoe2lkOmUsbmFtZTp0LGFyZ3M6bn0scil7bGV0IG89Zz0+e2UmJm90LnB1Ymxpc2hIYW5kbGVyKGtvKyIuIitlLGcscil9LGM9dmFbdF07Yz9jKG4sbyk6byh7fSl9bGV0IFU9ei5leHRlbmQoRnIoInZpZXciKSx7aW52b2tlT25DYWxsYmFjazpsbyxpbnZva2VWaWV3TWV0aG9kOnBhLGludm9rZVZpZXdNZXRob2RLZWVwQWxpdmU6TW99KTtmdW5jdGlvbiBaKCl7bGV0e29uOmV9PW90O2UoSy5PTl9SRVNJWkUsSiksZShLLk9OX0FQUF9FTlRFUl9GT1JFR1JPVU5ELGVlKSxlKEsuT05fQVBQX0VOVEVSX0JBQ0tHUk9VTkQsY2UpfWZ1bmN0aW9uIEooZSl7am4oQWkoKSxLLk9OX1JFU0laRSxlKSxvdC5pbnZva2VPbkNhbGxiYWNrKCJvbldpbmRvd1Jlc2l6ZSIsZSl9ZnVuY3Rpb24gZWUoZSl7bGV0IHQ9QWkoKTtqbihDdCgpLEsuT05fU0hPVyxlKSxqbih0LEsuT05fU0hPVyl9ZnVuY3Rpb24gY2UoKXtqbihDdCgpLEsuT05fSElERSksam4oQWkoKSxLLk9OX0hJREUpfWxldCBoZT1bSy5PTl9QQUdFX1NDUk9MTCxLLk9OX1JFQUNIX0JPVFRPTV07ZnVuY3Rpb24gVGUoKXtoZS5mb3JFYWNoKGU9Pm90LnN1YnNjcmliZShlLGZlKGUpKSl9ZnVuY3Rpb24gZmUoZSl7cmV0dXJuKHQsbik9PntqbihwYXJzZUludChuKSxlLHQpfX1mdW5jdGlvbiB3ZSgpe1ooKSxUZSgpfWZ1bmN0aW9uIGx0KGUpe2UuJHZtPWUsZS4kbXBUeXBlPSJhcHAiO2xldCB0PW1uLnJlZihndCgpLmdldExvY2FsZSgpKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiJGxvY2FsZSIse2dldCgpe3JldHVybiB0LnZhbHVlfSxzZXQobil7dC52YWx1ZT1ufX0pfWZ1bmN0aW9uIHB0KGUsdCl7ZS5yb3V0ZT10LnJvdXRlLGUuJHZtPWUsZS4kcGFnZT10LGUuJG1wVHlwZT0icGFnZSIsdC5tZXRhLmlzVGFiQmFyJiYoZS4kLl9faXNUYWJCYXI9ITAsZS4kLl9faXNBY3RpdmU9ITApfWZ1bmN0aW9uIGp0KCl7cmV0dXJue3BhdGg6IiIscXVlcnk6e30sc2NlbmU6MTAwMSxyZWZlcnJlckluZm86e2FwcElkOiIiLGV4dHJhRGF0YTp7fX19fWZ1bmN0aW9uIHl0KGUsdCl7bGV0IG49ZS4kb3B0aW9uc3x8e307bi5nbG9iYWxEYXRhPXouZXh0ZW5kKG4uZ2xvYmFsRGF0YXx8e30sdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImdsb2JhbERhdGEiLHtnZXQoKXtyZXR1cm4gbi5nbG9iYWxEYXRhfSxzZXQocil7bi5nbG9iYWxEYXRhPXJ9fSl9ZnVuY3Rpb24gSGUoZSl7aWYoZS5pbmRleE9mKCIvLyIpPT09MClyZXR1cm4iaHR0cHM6IitlO2lmKEsuU0NIRU1FX1JFLnRlc3QoZSl8fEsuREFUQV9SRS50ZXN0KGUpKXJldHVybiBlO2lmKHZuKGUpKXJldHVybiJmaWxlOi8vIitEdChlKTtsZXQgdD0iZmlsZTovLyIrRHQoIl93d3ciKTtpZihlLmluZGV4T2YoIi8iKT09PTApcmV0dXJuIGUuc3RhcnRzV2l0aCgiL3N0b3JhZ2UvIil8fGUuc3RhcnRzV2l0aCgiL3NkY2FyZC8iKXx8ZS5pbmNsdWRlcygiL0NvbnRhaW5lcnMvRGF0YS9BcHBsaWNhdGlvbi8iKT8iZmlsZTovLyIrZTp0K2U7aWYoZS5pbmRleE9mKCIuLi8iKT09PTB8fGUuaW5kZXhPZigiLi8iKT09PTApe2lmKHR5cGVvZiBfX2lkX189PSJzdHJpbmciKXJldHVybiB0K1FvKEsuYWRkTGVhZGluZ1NsYXNoKF9faWRfXyksZSk7e2xldCBuPUFpKCk7aWYobilyZXR1cm4gdCtRbyhLLmFkZExlYWRpbmdTbGFzaChuLnJvdXRlKSxlKX19cmV0dXJuIGV9bGV0IER0PUsuY2FjaGVTdHJpbmdGdW5jdGlvbihlPT5zLmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSkucmVwbGFjZSgvXlwvP2FwcHNcLy8sIi9hbmRyb2lkX2Fzc2V0L2FwcHMvIikucmVwbGFjZSgvXC8kLywiIikpO2Z1bmN0aW9uIHZuKGUpe3JldHVybiBlLmluZGV4T2YoIl93d3ciKT09PTB8fGUuaW5kZXhPZigiX2RvYyIpPT09MHx8ZS5pbmRleE9mKCJfZG9jdW1lbnRzIik9PT0wfHxlLmluZGV4T2YoIl9kb3dubG9hZHMiKT09PTB9bGV0IHF0PSJzdWNjZXNzIixkdD0iZmFpbCIsTG49W3F0LGR0LCJjb21wbGV0ZSJdO2Z1bmN0aW9uIEp0KGUsdCxuLHIpe2lmKCFlKXJldHVybjtpZih0eXBlb2Ygbj09InVuZGVmaW5lZCIpcmV0dXJuIGVbdF0oKTtsZXRbLG9dPWVhKG4scik7cmV0dXJuIE9iamVjdC5rZXlzKG8pLmxlbmd0aD9lW3RdKHBpKHQsbykpOmVbdF0oKX1mdW5jdGlvbiB6dChlLHQsbixyKXtpZighZSlyZXR1cm47bGV0W28sY109ZWEobixyKTtyZXR1cm4gT2JqZWN0LmtleXMoYykubGVuZ3RoP2VbdF0obyxwaSh0LGMpKTplW3RdKG8pfWZ1bmN0aW9uICR0KGUsdCl7bGV0IG49WnQoZSx0LiRlbCk7cmV0dXJuIG58fGNvbnNvbGUuZXJyb3IoIkNhbiBub3QgZmluZCBgIitlKyJgIil9ZnVuY3Rpb24gWnQoZSx0KXtpZighZXx8IXQpcmV0dXJuO2lmKHQuYXR0ciYmdC5hdHRyLmlkPT09ZSlyZXR1cm4gdDtsZXQgbj10LmNoaWxkcmVuO2lmKCEhbilmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2xldCBjPVp0KGUsbltyXSk7aWYoYylyZXR1cm4gY319ZnVuY3Rpb24gZWEoZT17fSx0KXtsZXQgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9ZnVuY3Rpb24oYyl7bGV0IGc9ZVtjXTt6LmlzRnVuY3Rpb24oZykmJihuW2NdPWcsZGVsZXRlIGVbY10pfTtyZXR1cm4gTG4uZm9yRWFjaChyKSx0JiZ0LmZvckVhY2gociksW2Usbl19ZnVuY3Rpb24gcGkoZSx0KXtyZXR1cm4gZnVuY3Rpb24ocil7bGV0IG89ci50eXBlO2RlbGV0ZSByLnR5cGU7bGV0IGM9dFtvXTtpZihvPT09cXQ/ci5lcnJNc2c9YCR7ZX06b2tgOm89PT1kdCYmKHIuZXJyTXNnPWUrIjpmYWlsICIrKHIubXNnPyIgIityLm1zZzoiIikpLGRlbGV0ZSByLmNvZGUsZGVsZXRlIHIubXNnLHouaXNGdW5jdGlvbihjKSYmYyhyKSxvPT09cXR8fG89PT1kdCl7bGV0IGc9dC5jb21wbGV0ZTt6LmlzRnVuY3Rpb24oZykmJmcocil9fX1sZXQgaWk7ZnVuY3Rpb24gUWkoKXtyZXR1cm4gaWl9ZnVuY3Rpb24gamEoZSl7bGV0IHQ9ZS4kO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LmN0eCwiJGNoaWxkcmVuIix7Z2V0KCl7cmV0dXJuIEduKCkubWFwKHI9PnIuJHZtKX19KTtsZXQgbj10LmFwcENvbnRleHQ7aWk9ei5leHRlbmQobi5hcHAse21vdW50UGFnZShyLG8sYyl7bGV0IGc9bW4uY3JlYXRlVk5vZGUocixvKTtnLmFwcENvbnRleHQ9bixnLl9fcGFnZV9jb250YWluZXJfXz1jLG1uLnJlbmRlcihnLGMpO2xldCBiPWcuY29tcG9uZW50LnByb3h5O3JldHVybiBiLl9fcGFnZV9jb250YWluZXJfXz1jLGJ9LHVubW91bnRQYWdlOnI9PntsZXR7X19wYWdlX2NvbnRhaW5lcl9fOm99PXI7byYmKG8uaXNVbm1vdW50ZWQ9ITAsbW4ucmVuZGVyKG51bGwsbykpfX0pfWxldCB6bj1bXTtmdW5jdGlvbiBXbihlKXtpZighZS4kcGFnZS5tZXRhLmlzTlZ1ZSlyZXR1cm4gem4ucHVzaChlKTtsZXQgbj16bi5maW5kSW5kZXgocj0+ci4kcGFnZS5pZD09PWUuJHBhZ2UuaWQpO24+LTE/em4uc3BsaWNlKG4sMSxlKTp6bi5wdXNoKGUpfWZ1bmN0aW9uIE5yKGUpe3JldHVybiB6bi5maW5kKHQ9PnQuJHBhZ2UuaWQ9PT1lKX1mdW5jdGlvbiBHbigpe3JldHVybiB6bn1mdW5jdGlvbiBDcigpe2xldCBlPVtdO3JldHVybiB6bi5mb3JFYWNoKHQ9Pnt0LiQuX19pc1RhYkJhcj90LiQuX19pc0FjdGl2ZSYmZS5wdXNoKHQpOmUucHVzaCh0KX0pLGV9ZnVuY3Rpb24gcXIoKXtsZXQgZT1BaSgpOyFlfHx0YShlKX1mdW5jdGlvbiB0YShlKXtsZXQgdD16bi5maW5kSW5kZXgobj0+bj09PWUpO3QhPT0tMSYmKGUuJHBhZ2UubWV0YS5pc05WdWV8fFFpKCkudW5tb3VudFBhZ2UoZSksem4uc3BsaWNlKHQsMSkpfWxldCBjcz17cGxheShlKXtyZXR1cm4gSnQoZSwicGxheSIpfSxwYXVzZShlKXtyZXR1cm4gSnQoZSwicGF1c2UiKX0sc2VlayhlLHQpe3JldHVybiB6dChlLCJzZWVrIix0LnBvc2l0aW9uKX0sc3RvcChlKXtyZXR1cm4gSnQoZSwic3RvcCIpfSxzZW5kRGFubXUoZSx0KXtyZXR1cm4genQoZSwic2VuZERhbm11Iix0KX0scGxheWJhY2tSYXRlKGUsdCl7cmV0dXJuIHp0KGUsInBsYXliYWNrUmF0ZSIsdC5yYXRlKX0scmVxdWVzdEZ1bGxTY3JlZW4oZSx0PXt9KXtyZXR1cm4genQoZSwicmVxdWVzdEZ1bGxTY3JlZW4iLHQpfSxleGl0RnVsbFNjcmVlbihlKXtyZXR1cm4gSnQoZSwiZXhpdEZ1bGxTY3JlZW4iKX0sc2hvd1N0YXR1c0JhcihlKXtyZXR1cm4gSnQoZSwic2hvd1N0YXR1c0JhciIpfSxoaWRlU3RhdHVzQmFyKGUpe3JldHVybiBKdChlLCJoaWRlU3RhdHVzQmFyIil9fTtmdW5jdGlvbiBsbihlLHQsbixyKXtsZXQgbz1Ocih0KTtpZihvPT1udWxsP3ZvaWQgMDpvLiRwYWdlLm1ldGEuaXNOVnVlKXtsZXQgYz1vLiR2bTtyZXR1cm4gY3Nbbl0oJHQoZSxjKSxyKX1vdC5pbnZva2VWaWV3TWV0aG9kKCJ2aWRlby4iK2Use3ZpZGVvSWQ6ZSx0eXBlOm4sZGF0YTpyfSx0KX1sZXQgeW49e2dldENlbnRlckxvY2F0aW9uKGUsdCl7cmV0dXJuIEp0KGUsImdldENlbnRlckxvY2F0aW9uIix0KX0sbW92ZVRvTG9jYXRpb24oZSx0KXtyZXR1cm4genQoZSwibW92ZVRvTG9jYXRpb24iLHQpfSx0cmFuc2xhdGVNYXJrZXIoZSx0KXtyZXR1cm4genQoZSwidHJhbnNsYXRlTWFya2VyIix0LFsiYW5pbWF0aW9uRW5kIl0pfSxpbmNsdWRlUG9pbnRzKGUsdCl7cmV0dXJuIHp0KGUsImluY2x1ZGVQb2ludHMiLHQpfSxnZXRSZWdpb24oZSx0KXtyZXR1cm4gSnQoZSwiZ2V0UmVnaW9uIix0KX0sZ2V0U2NhbGUoZSx0KXtyZXR1cm4gSnQoZSwiZ2V0U2NhbGUiLHQpfSxhZGRDdXN0b21MYXllcihlLHQpe3JldHVybiB6dChlLCJhZGRDdXN0b21MYXllciIsdCl9LHJlbW92ZUN1c3RvbUxheWVyKGUsdCl7cmV0dXJuIHp0KGUsInJlbW92ZUN1c3RvbUxheWVyIix0KX0sYWRkR3JvdW5kT3ZlcmxheShlLHQpe3JldHVybiB6dChlLCJhZGRHcm91bmRPdmVybGF5Iix0KX0scmVtb3ZlR3JvdW5kT3ZlcmxheShlLHQpe3JldHVybiB6dChlLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX0sdXBkYXRlR3JvdW5kT3ZlcmxheShlLHQpe3JldHVybiB6dChlLCJ1cGRhdGVHcm91bmRPdmVybGF5Iix0KX0saW5pdE1hcmtlckNsdXN0ZXIoZSx0KXtyZXR1cm4genQoZSwiaW5pdE1hcmtlckNsdXN0ZXIiLHQpfSxhZGRNYXJrZXJzKGUsdCl7cmV0dXJuIHp0KGUsImFkZE1hcmtlcnMiLHQpfSxyZW1vdmVNYXJrZXJzKGUsdCl7cmV0dXJuIHp0KGUsInJlbW92ZU1hcmtlcnMiLHQpfSxtb3ZlQWxvbmcoZSx0KXtyZXR1cm4genQoZSwibW92ZUFsb25nIix0KX0sc2V0TG9jTWFya2VySWNvbihlLHQpe3JldHVybiB6dChlLCJzZXRMb2NNYXJrZXJJY29uIix0KX0sb3Blbk1hcEFwcChlLHQpe3JldHVybiB6dChlLCJvcGVuTWFwQXBwIix0KX0sb24oZSx0KXtyZXR1cm4gZS5vbih0Lm5hbWUsdC5jYWxsYmFjayl9fTtmdW5jdGlvbiBZbihlLHQsbixyLG8pe2xldCBjPU5yKHQpO2lmKGM9PW51bGw/dm9pZCAwOmMuJHBhZ2UubWV0YS5pc05WdWUpe2xldCBnPWMuJHZtO3JldHVybiB5bltuXSgkdChlLGcpLHIpfW90Lmludm9rZVZpZXdNZXRob2QoIm1hcC4iK2Use3R5cGU6bixkYXRhOnJ9LHQsbyl9ZnVuY3Rpb24gWm4oZSl7cmV0dXJuYEludGVyc2VjdGlvbk9ic2VydmVyLiR7ZX1gfWZ1bmN0aW9uIFRpKHtyZXFJZDplLGNvbXBvbmVudDp0LG9wdGlvbnM6bixjYWxsYmFjazpyfSxvKXtsZXQgYz1abihlKTtvdC5pbnZva2VWaWV3TWV0aG9kKCJhZGRJbnRlcnNlY3Rpb25PYnNlcnZlciIse3JlcUlkOmUsY29tcG9uZW50OnQuJGVsLm5vZGVJZCxvcHRpb25zOm4sZXZlbnROYW1lOmN9LG8pLG90LnN1YnNjcmliZShjLHIpfWZ1bmN0aW9uIHVzKHtyZXFJZDplLGNvbXBvbmVudDp0fSxuKXtvdC5pbnZva2VWaWV3TWV0aG9kKCJyZW1vdmVJbnRlcnNlY3Rpb25PYnNlcnZlciIse3JlcUlkOmUsY29tcG9uZW50OnQuJGVsLm5vZGVJZH0sbiksb3QudW5zdWJzY3JpYmUoWm4oZSkpfWZ1bmN0aW9uIHphKGUpe3JldHVybmBNZWRpYVF1ZXJ5T2JzZXJ2ZXIuJHtlfWB9ZnVuY3Rpb24gSWEoe3JlcUlkOmUsY29tcG9uZW50OnQsb3B0aW9uczpuLGNhbGxiYWNrOnJ9LG8pe2xldCBjPXphKGUpO290Lmludm9rZVZpZXdNZXRob2QoImFkZE1lZGlhUXVlcnlPYnNlcnZlciIse3JlcUlkOmUsY29tcG9uZW50OnQuJGVsLm5vZGVJZCxvcHRpb25zOm4sZXZlbnROYW1lOmN9LG8pLG90LnN1YnNjcmliZShjLHIpfWZ1bmN0aW9uIG5hKHtyZXFJZDplLGNvbXBvbmVudDp0fSxuKXtvdC5pbnZva2VWaWV3TWV0aG9kKCJyZW1vdmVNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWR9LG4pLG90LnVuc3Vic2NyaWJlKHphKGUpKX1sZXQgdW89MjAwLFdhPVsidW5rbm93biIsIm5vbmUiLCJldGhlcm5ldCIsIndpZmkiLCIyZyIsIjNnIiwiNGciLCI1ZyJdLGZzPSJfZG9jL3VuaWFwcF90ZW1wIixKcj1gJHtmc31fJHtEYXRlLm5vdygpfWA7ZnVuY3Rpb24gR2EoZSl7bGV0IHQ9ZS5zcGxpdCgiLyIpO3JldHVybiB0W3QubGVuZ3RoLTFdfWZ1bmN0aW9uIFlhKGUpe2xldCB0PWUuc3BsaXQoIi4iKTtyZXR1cm4gdC5sZW5ndGg+MT8iLiIrdFt0Lmxlbmd0aC0xXToiIn1sZXQgTG89ImJhY2tidXR0b24iO2Z1bmN0aW9uIFVpKCl7UC5uYXZpZ2F0ZUJhY2soe2Zyb206ImJhY2tidXR0b24iLHN1Y2Nlc3MoKXt9fSl9bGV0IEVvPWp0KCkseW89anQoKTtmdW5jdGlvbiBkcygpe3JldHVybiB6LmV4dGVuZCh7fSx5byl9ZnVuY3Rpb24gRG8oKXtyZXR1cm4gei5leHRlbmQoe30sRW8pfWZ1bmN0aW9uIHhzKHtwYXRoOmUscXVlcnk6dCxyZWZlcnJlckluZm86bn0pe3ouZXh0ZW5kKEVvLHtwYXRoOmUscXVlcnk6dD9LLnBhcnNlUXVlcnkodCk6e30scmVmZXJyZXJJbmZvOm58fHt9fSl9ZnVuY3Rpb24gaHMoe3BhdGg6ZSxxdWVyeTp0LHJlZmVycmVySW5mbzpufSl7cmV0dXJuIHouZXh0ZW5kKHlvLHtwYXRoOmUscXVlcnk6dD9LLnBhcnNlUXVlcnkodCk6e30scmVmZXJyZXJJbmZvOm58fHt9LGNoYW5uZWw6cy5ydW50aW1lLmNoYW5uZWwsbGF1bmNoZXI6cy5ydW50aW1lLmxhdW5jaGVyfSksei5leHRlbmQoRW8seW8pLHouZXh0ZW5kKHt9LHlvKX1mdW5jdGlvbiBCcygpe2xldCBlPWYucmVxdWlyZU1vZHVsZSgicGx1cyIpO2lmKGUuZ2V0UmVkaXJlY3RJbmZvKXtsZXR7cGF0aDp0LHF1ZXJ5Om4sZXh0cmFEYXRhOnIsdXNlckFjdGlvbjpvLGZyb21BcHBpZDpjfT1lLmdldFJlZGlyZWN0SW5mbygpfHx7fSxnPXthcHBJZDpjLGV4dHJhRGF0YTp7fX07cmV0dXJuIHImJihnLmV4dHJhRGF0YT1yKSx7cGF0aDp0fHwiIixxdWVyeTpuPyI/IituOiIiLHJlZmVycmVySW5mbzpnLHVzZXJBY3Rpb246b319fXZhciBOZT17fTsoZnVuY3Rpb24oZSl7dmFyIHQ9dHlwZW9mIFVpbnQ4QXJyYXkhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgVWludDE2QXJyYXkhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgSW50MzJBcnJheSE9InVuZGVmaW5lZCI7ZnVuY3Rpb24gbihjLGcpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYyxnKX1lLmFzc2lnbj1mdW5jdGlvbihjKXtmb3IodmFyIGc9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2cubGVuZ3RoOyl7dmFyIGI9Zy5zaGlmdCgpO2lmKCEhYil7aWYodHlwZW9mIGIhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IoYisibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBWIGluIGIpbihiLFYpJiYoY1tWXT1iW1ZdKX19cmV0dXJuIGN9LGUuc2hyaW5rQnVmPWZ1bmN0aW9uKGMsZyl7cmV0dXJuIGMubGVuZ3RoPT09Zz9jOmMuc3ViYXJyYXk/Yy5zdWJhcnJheSgwLGcpOihjLmxlbmd0aD1nLGMpfTt2YXIgcj17YXJyYXlTZXQ6ZnVuY3Rpb24oYyxnLGIsVixUKXtpZihnLnN1YmFycmF5JiZjLnN1YmFycmF5KXtjLnNldChnLnN1YmFycmF5KGIsYitWKSxUKTtyZXR1cm59Zm9yKHZhciBEPTA7RDxWO0QrKyljW1QrRF09Z1tiK0RdfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKGMpe3ZhciBnLGIsVixULEQsdmU7Zm9yKFY9MCxnPTAsYj1jLmxlbmd0aDtnPGI7ZysrKVYrPWNbZ10ubGVuZ3RoO2Zvcih2ZT1uZXcgVWludDhBcnJheShWKSxUPTAsZz0wLGI9Yy5sZW5ndGg7ZzxiO2crKylEPWNbZ10sdmUuc2V0KEQsVCksVCs9RC5sZW5ndGg7cmV0dXJuIHZlfX0sbz17YXJyYXlTZXQ6ZnVuY3Rpb24oYyxnLGIsVixUKXtmb3IodmFyIEQ9MDtEPFY7RCsrKWNbVCtEXT1nW2IrRF19LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oYyl7cmV0dXJuW10uY29uY2F0LmFwcGx5KFtdLGMpfX07ZS5zZXRUeXBlZD1mdW5jdGlvbihjKXtjPyhlLkJ1Zjg9VWludDhBcnJheSxlLkJ1ZjE2PVVpbnQxNkFycmF5LGUuQnVmMzI9SW50MzJBcnJheSxlLmFzc2lnbihlLHIpKTooZS5CdWY4PUFycmF5LGUuQnVmMTY9QXJyYXksZS5CdWYzMj1BcnJheSxlLmFzc2lnbihlLG8pKX0sZS5zZXRUeXBlZCh0KX0pKE5lKTt2YXIga3Q9e30sSXQ9e30sT249e30sQXI9TmUsUGk9NCxlbz0wLEZvPTEsTmE9MjtmdW5jdGlvbiByYShlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7LS10Pj0wOyllW3RdPTB9dmFyIGdzPTAscHM9MSxkbD0yLCRsPTMsSGw9MjU4LE1zPTI5LFZvPTI1NixVbz1WbysxK01zLGlhPTMwLHFhPTE5LHZzPTIqVW8rMSwkbz0xNSxMcz0xNixqbD03LERzPTI1Nixtcz0xNixobD0xNyxGcz0xOCxKYT1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXSxfcz1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sVnM9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddLFVzPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxnbD01MTIsSG89bmV3IEFycmF5KChVbysyKSoyKTtyYShIbyk7dmFyIEthPW5ldyBBcnJheShpYSoyKTtyYShLYSk7dmFyIG1hPW5ldyBBcnJheShnbCk7cmEobWEpO3ZhciBrYT1uZXcgQXJyYXkoSGwtJGwrMSk7cmEoa2EpO3ZhciBTbz1uZXcgQXJyYXkoTXMpO3JhKFNvKTt2YXIgb2E9bmV3IEFycmF5KGlhKTtyYShvYSk7ZnVuY3Rpb24gWmEoZSx0LG4scixvKXt0aGlzLnN0YXRpY190cmVlPWUsdGhpcy5leHRyYV9iaXRzPXQsdGhpcy5leHRyYV9iYXNlPW4sdGhpcy5lbGVtcz1yLHRoaXMubWF4X2xlbmd0aD1vLHRoaXMuaGFzX3N0cmVlPWUmJmUubGVuZ3RofXZhciAkcyxwbCxhYTtmdW5jdGlvbiBYYShlLHQpe3RoaXMuZHluX3RyZWU9ZSx0aGlzLm1heF9jb2RlPTAsdGhpcy5zdGF0X2Rlc2M9dH1mdW5jdGlvbiBIcyhlKXtyZXR1cm4gZTwyNTY/bWFbZV06bWFbMjU2KyhlPj4+NyldfWZ1bmN0aW9uIFFhKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1fWZ1bmN0aW9uIG9pKGUsdCxuKXtlLmJpX3ZhbGlkPkxzLW4/KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LFFhKGUsZS5iaV9idWYpLGUuYmlfYnVmPXQ+PkxzLWUuYmlfdmFsaWQsZS5iaV92YWxpZCs9bi1Mcyk6KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LGUuYmlfdmFsaWQrPW4pfWZ1bmN0aW9uIFZyKGUsdCxuKXtvaShlLG5bdCoyXSxuW3QqMisxXSl9ZnVuY3Rpb24gc2EoZSx0KXt2YXIgbj0wO2RvIG58PWUmMSxlPj4+PTEsbjw8PTE7d2hpbGUoLS10PjApO3JldHVybiBuPj4+MX1mdW5jdGlvbiB2bChlKXtlLmJpX3ZhbGlkPT09MTY/KFFhKGUsZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wKTplLmJpX3ZhbGlkPj04JiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYmMjU1LGUuYmlfYnVmPj49OCxlLmJpX3ZhbGlkLT04KX1mdW5jdGlvbiB6bChlLHQpe3ZhciBuPXQuZHluX3RyZWUscj10Lm1heF9jb2RlLG89dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsYz10LnN0YXRfZGVzYy5oYXNfc3RyZWUsZz10LnN0YXRfZGVzYy5leHRyYV9iaXRzLGI9dC5zdGF0X2Rlc2MuZXh0cmFfYmFzZSxWPXQuc3RhdF9kZXNjLm1heF9sZW5ndGgsVCxELHZlLHllLE9lLGZ0LGh0PTA7Zm9yKHllPTA7eWU8PSRvO3llKyspZS5ibF9jb3VudFt5ZV09MDtmb3IobltlLmhlYXBbZS5oZWFwX21heF0qMisxXT0wLFQ9ZS5oZWFwX21heCsxO1Q8dnM7VCsrKUQ9ZS5oZWFwW1RdLHllPW5bbltEKjIrMV0qMisxXSsxLHllPlYmJih5ZT1WLGh0KyspLG5bRCoyKzFdPXllLCEoRD5yKSYmKGUuYmxfY291bnRbeWVdKyssT2U9MCxEPj1iJiYoT2U9Z1tELWJdKSxmdD1uW0QqMl0sZS5vcHRfbGVuKz1mdCooeWUrT2UpLGMmJihlLnN0YXRpY19sZW4rPWZ0KihvW0QqMisxXStPZSkpKTtpZihodCE9PTApe2Rve2Zvcih5ZT1WLTE7ZS5ibF9jb3VudFt5ZV09PT0wOyl5ZS0tO2UuYmxfY291bnRbeWVdLS0sZS5ibF9jb3VudFt5ZSsxXSs9MixlLmJsX2NvdW50W1ZdLS0saHQtPTJ9d2hpbGUoaHQ+MCk7Zm9yKHllPVY7eWUhPT0wO3llLS0pZm9yKEQ9ZS5ibF9jb3VudFt5ZV07RCE9PTA7KXZlPWUuaGVhcFstLVRdLCEodmU+cikmJihuW3ZlKjIrMV0hPT15ZSYmKGUub3B0X2xlbis9KHllLW5bdmUqMisxXSkqblt2ZSoyXSxuW3ZlKjIrMV09eWUpLEQtLSl9fWZ1bmN0aW9uIGpzKGUsdCxuKXt2YXIgcj1uZXcgQXJyYXkoJG8rMSksbz0wLGMsZztmb3IoYz0xO2M8PSRvO2MrKylyW2NdPW89bytuW2MtMV08PDE7Zm9yKGc9MDtnPD10O2crKyl7dmFyIGI9ZVtnKjIrMV07YiE9PTAmJihlW2cqMl09c2EocltiXSsrLGIpKX19ZnVuY3Rpb24gYnMoKXt2YXIgZSx0LG4scixvLGM9bmV3IEFycmF5KCRvKzEpO2ZvcihuPTAscj0wO3I8TXMtMTtyKyspZm9yKFNvW3JdPW4sZT0wO2U8MTw8SmFbcl07ZSsrKWthW24rK109cjtmb3Ioa2Fbbi0xXT1yLG89MCxyPTA7cjwxNjtyKyspZm9yKG9hW3JdPW8sZT0wO2U8MTw8X3Nbcl07ZSsrKW1hW28rK109cjtmb3Iobz4+PTc7cjxpYTtyKyspZm9yKG9hW3JdPW88PDcsZT0wO2U8MTw8X3Nbcl0tNztlKyspbWFbMjU2K28rK109cjtmb3IodD0wO3Q8PSRvO3QrKyljW3RdPTA7Zm9yKGU9MDtlPD0xNDM7KUhvW2UqMisxXT04LGUrKyxjWzhdKys7Zm9yKDtlPD0yNTU7KUhvW2UqMisxXT05LGUrKyxjWzldKys7Zm9yKDtlPD0yNzk7KUhvW2UqMisxXT03LGUrKyxjWzddKys7Zm9yKDtlPD0yODc7KUhvW2UqMisxXT04LGUrKyxjWzhdKys7Zm9yKGpzKEhvLFVvKzEsYyksZT0wO2U8aWE7ZSsrKUthW2UqMisxXT01LEthW2UqMl09c2EoZSw1KTskcz1uZXcgWmEoSG8sSmEsVm8rMSxVbywkbykscGw9bmV3IFphKEthLF9zLDAsaWEsJG8pLGFhPW5ldyBaYShuZXcgQXJyYXkoMCksVnMsMCxxYSxqbCl9ZnVuY3Rpb24genMoZSl7dmFyIHQ7Zm9yKHQ9MDt0PFVvO3QrKyllLmR5bl9sdHJlZVt0KjJdPTA7Zm9yKHQ9MDt0PGlhO3QrKyllLmR5bl9kdHJlZVt0KjJdPTA7Zm9yKHQ9MDt0PHFhO3QrKyllLmJsX3RyZWVbdCoyXT0wO2UuZHluX2x0cmVlW0RzKjJdPTEsZS5vcHRfbGVuPWUuc3RhdGljX2xlbj0wLGUubGFzdF9saXQ9ZS5tYXRjaGVzPTB9ZnVuY3Rpb24gV3MoZSl7ZS5iaV92YWxpZD44P1FhKGUsZS5iaV9idWYpOmUuYmlfdmFsaWQ+MCYmKGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPWUuYmlfYnVmKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MH1mdW5jdGlvbiBtbChlLHQsbixyKXtXcyhlKSxyJiYoUWEoZSxuKSxRYShlLH5uKSksQXIuYXJyYXlTZXQoZS5wZW5kaW5nX2J1ZixlLndpbmRvdyx0LG4sZS5wZW5kaW5nKSxlLnBlbmRpbmcrPW59ZnVuY3Rpb24gR3MoZSx0LG4scil7dmFyIG89dCoyLGM9bioyO3JldHVybiBlW29dPGVbY118fGVbb109PT1lW2NdJiZyW3RdPD1yW25dfWZ1bmN0aW9uIEVzKGUsdCxuKXtmb3IodmFyIHI9ZS5oZWFwW25dLG89bjw8MTtvPD1lLmhlYXBfbGVuJiYobzxlLmhlYXBfbGVuJiZHcyh0LGUuaGVhcFtvKzFdLGUuaGVhcFtvXSxlLmRlcHRoKSYmbysrLCFHcyh0LHIsZS5oZWFwW29dLGUuZGVwdGgpKTspZS5oZWFwW25dPWUuaGVhcFtvXSxuPW8sbzw8PTE7ZS5oZWFwW25dPXJ9ZnVuY3Rpb24geXMoZSx0LG4pe3ZhciByLG8sYz0wLGcsYjtpZihlLmxhc3RfbGl0IT09MClkbyByPWUucGVuZGluZ19idWZbZS5kX2J1ZitjKjJdPDw4fGUucGVuZGluZ19idWZbZS5kX2J1ZitjKjIrMV0sbz1lLnBlbmRpbmdfYnVmW2UubF9idWYrY10sYysrLHI9PT0wP1ZyKGUsbyx0KTooZz1rYVtvXSxWcihlLGcrVm8rMSx0KSxiPUphW2ddLGIhPT0wJiYoby09U29bZ10sb2koZSxvLGIpKSxyLS0sZz1IcyhyKSxWcihlLGcsbiksYj1fc1tnXSxiIT09MCYmKHItPW9hW2ddLG9pKGUscixiKSkpO3doaWxlKGM8ZS5sYXN0X2xpdCk7VnIoZSxEcyx0KX1mdW5jdGlvbiBTcyhlLHQpe3ZhciBuPXQuZHluX3RyZWUscj10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxvPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxjPXQuc3RhdF9kZXNjLmVsZW1zLGcsYixWPS0xLFQ7Zm9yKGUuaGVhcF9sZW49MCxlLmhlYXBfbWF4PXZzLGc9MDtnPGM7ZysrKW5bZyoyXSE9PTA/KGUuaGVhcFsrK2UuaGVhcF9sZW5dPVY9ZyxlLmRlcHRoW2ddPTApOm5bZyoyKzFdPTA7Zm9yKDtlLmhlYXBfbGVuPDI7KVQ9ZS5oZWFwWysrZS5oZWFwX2xlbl09VjwyPysrVjowLG5bVCoyXT0xLGUuZGVwdGhbVF09MCxlLm9wdF9sZW4tLSxvJiYoZS5zdGF0aWNfbGVuLT1yW1QqMisxXSk7Zm9yKHQubWF4X2NvZGU9VixnPWUuaGVhcF9sZW4+PjE7Zz49MTtnLS0pRXMoZSxuLGcpO1Q9YztkbyBnPWUuaGVhcFsxXSxlLmhlYXBbMV09ZS5oZWFwW2UuaGVhcF9sZW4tLV0sRXMoZSxuLDEpLGI9ZS5oZWFwWzFdLGUuaGVhcFstLWUuaGVhcF9tYXhdPWcsZS5oZWFwWy0tZS5oZWFwX21heF09YixuW1QqMl09bltnKjJdK25bYioyXSxlLmRlcHRoW1RdPShlLmRlcHRoW2ddPj1lLmRlcHRoW2JdP2UuZGVwdGhbZ106ZS5kZXB0aFtiXSkrMSxuW2cqMisxXT1uW2IqMisxXT1ULGUuaGVhcFsxXT1UKyssRXMoZSxuLDEpO3doaWxlKGUuaGVhcF9sZW4+PTIpO2UuaGVhcFstLWUuaGVhcF9tYXhdPWUuaGVhcFsxXSx6bChlLHQpLGpzKG4sVixlLmJsX2NvdW50KX1mdW5jdGlvbiBfbChlLHQsbil7dmFyIHIsbz0tMSxjLGc9dFswKjIrMV0sYj0wLFY9NyxUPTQ7Zm9yKGc9PT0wJiYoVj0xMzgsVD0zKSx0WyhuKzEpKjIrMV09NjU1MzUscj0wO3I8PW47cisrKWM9ZyxnPXRbKHIrMSkqMisxXSwhKCsrYjxWJiZjPT09ZykmJihiPFQ/ZS5ibF90cmVlW2MqMl0rPWI6YyE9PTA/KGMhPT1vJiZlLmJsX3RyZWVbYyoyXSsrLGUuYmxfdHJlZVttcyoyXSsrKTpiPD0xMD9lLmJsX3RyZWVbaGwqMl0rKzplLmJsX3RyZWVbRnMqMl0rKyxiPTAsbz1jLGc9PT0wPyhWPTEzOCxUPTMpOmM9PT1nPyhWPTYsVD0zKTooVj03LFQ9NCkpfWZ1bmN0aW9uIGJsKGUsdCxuKXt2YXIgcixvPS0xLGMsZz10WzAqMisxXSxiPTAsVj03LFQ9NDtmb3IoZz09PTAmJihWPTEzOCxUPTMpLHI9MDtyPD1uO3IrKylpZihjPWcsZz10WyhyKzEpKjIrMV0sISgrK2I8ViYmYz09PWcpKXtpZihiPFQpZG8gVnIoZSxjLGUuYmxfdHJlZSk7d2hpbGUoLS1iIT09MCk7ZWxzZSBjIT09MD8oYyE9PW8mJihWcihlLGMsZS5ibF90cmVlKSxiLS0pLFZyKGUsbXMsZS5ibF90cmVlKSxvaShlLGItMywyKSk6Yjw9MTA/KFZyKGUsaGwsZS5ibF90cmVlKSxvaShlLGItMywzKSk6KFZyKGUsRnMsZS5ibF90cmVlKSxvaShlLGItMTEsNykpO2I9MCxvPWMsZz09PTA/KFY9MTM4LFQ9Myk6Yz09PWc/KFY9NixUPTMpOihWPTcsVD00KX19ZnVuY3Rpb24gYShlKXt2YXIgdDtmb3IoX2woZSxlLmR5bl9sdHJlZSxlLmxfZGVzYy5tYXhfY29kZSksX2woZSxlLmR5bl9kdHJlZSxlLmRfZGVzYy5tYXhfY29kZSksU3MoZSxlLmJsX2Rlc2MpLHQ9cWEtMTt0Pj0zJiZlLmJsX3RyZWVbVXNbdF0qMisxXT09PTA7dC0tKTtyZXR1cm4gZS5vcHRfbGVuKz0zKih0KzEpKzUrNSs0LHR9ZnVuY3Rpb24gdShlLHQsbixyKXt2YXIgbztmb3Iob2koZSx0LTI1Nyw1KSxvaShlLG4tMSw1KSxvaShlLHItNCw0KSxvPTA7bzxyO28rKylvaShlLGUuYmxfdHJlZVtVc1tvXSoyKzFdLDMpO2JsKGUsZS5keW5fbHRyZWUsdC0xKSxibChlLGUuZHluX2R0cmVlLG4tMSl9ZnVuY3Rpb24gbShlKXt2YXIgdD00MDkzNjI0NDQ3LG47Zm9yKG49MDtuPD0zMTtuKyssdD4+Pj0xKWlmKHQmMSYmZS5keW5fbHRyZWVbbioyXSE9PTApcmV0dXJuIGVvO2lmKGUuZHluX2x0cmVlWzkqMl0hPT0wfHxlLmR5bl9sdHJlZVsxMCoyXSE9PTB8fGUuZHluX2x0cmVlWzEzKjJdIT09MClyZXR1cm4gRm87Zm9yKG49MzI7bjxWbztuKyspaWYoZS5keW5fbHRyZWVbbioyXSE9PTApcmV0dXJuIEZvO3JldHVybiBlb312YXIgUz0hMTtmdW5jdGlvbiBJKGUpe1N8fChicygpLFM9ITApLGUubF9kZXNjPW5ldyBYYShlLmR5bl9sdHJlZSwkcyksZS5kX2Rlc2M9bmV3IFhhKGUuZHluX2R0cmVlLHBsKSxlLmJsX2Rlc2M9bmV3IFhhKGUuYmxfdHJlZSxhYSksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTAsenMoZSl9ZnVuY3Rpb24gTyhlLHQsbixyKXtvaShlLChnczw8MSkrKHI/MTowKSwzKSxtbChlLHQsbiwhMCl9ZnVuY3Rpb24gRihlKXtvaShlLHBzPDwxLDMpLFZyKGUsRHMsSG8pLHZsKGUpfWZ1bmN0aW9uIFcoZSx0LG4scil7dmFyIG8sYyxnPTA7ZS5sZXZlbD4wPyhlLnN0cm0uZGF0YV90eXBlPT09TmEmJihlLnN0cm0uZGF0YV90eXBlPW0oZSkpLFNzKGUsZS5sX2Rlc2MpLFNzKGUsZS5kX2Rlc2MpLGc9YShlKSxvPWUub3B0X2xlbiszKzc+Pj4zLGM9ZS5zdGF0aWNfbGVuKzMrNz4+PjMsYzw9byYmKG89YykpOm89Yz1uKzUsbis0PD1vJiZ0IT09LTE/TyhlLHQsbixyKTplLnN0cmF0ZWd5PT09UGl8fGM9PT1vPyhvaShlLChwczw8MSkrKHI/MTowKSwzKSx5cyhlLEhvLEthKSk6KG9pKGUsKGRsPDwxKSsocj8xOjApLDMpLHUoZSxlLmxfZGVzYy5tYXhfY29kZSsxLGUuZF9kZXNjLm1heF9jb2RlKzEsZysxKSx5cyhlLGUuZHluX2x0cmVlLGUuZHluX2R0cmVlKSksenMoZSksciYmV3MoZSl9ZnVuY3Rpb24gRyhlLHQsbil7cmV0dXJuIGUucGVuZGluZ19idWZbZS5kX2J1ZitlLmxhc3RfbGl0KjJdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UuZF9idWYrZS5sYXN0X2xpdCoyKzFdPXQmMjU1LGUucGVuZGluZ19idWZbZS5sX2J1ZitlLmxhc3RfbGl0XT1uJjI1NSxlLmxhc3RfbGl0KyssdD09PTA/ZS5keW5fbHRyZWVbbioyXSsrOihlLm1hdGNoZXMrKyx0LS0sZS5keW5fbHRyZWVbKGthW25dK1ZvKzEpKjJdKyssZS5keW5fZHRyZWVbSHModCkqMl0rKyksZS5sYXN0X2xpdD09PWUubGl0X2J1ZnNpemUtMX1Pbi5fdHJfaW5pdD1JLE9uLl90cl9zdG9yZWRfYmxvY2s9TyxPbi5fdHJfZmx1c2hfYmxvY2s9VyxPbi5fdHJfdGFsbHk9RyxPbi5fdHJfYWxpZ249RjtmdW5jdGlvbiBsZShlLHQsbixyKXtmb3IodmFyIG89ZSY2NTUzNXwwLGM9ZT4+PjE2JjY1NTM1fDAsZz0wO24hPT0wOyl7Zz1uPjJlMz8yZTM6bixuLT1nO2RvIG89byt0W3IrK118MCxjPWMrb3wwO3doaWxlKC0tZyk7byU9NjU1MjEsYyU9NjU1MjF9cmV0dXJuIG98Yzw8MTZ8MH12YXIgemU9bGU7ZnVuY3Rpb24gaXQoKXtmb3IodmFyIGUsdD1bXSxuPTA7bjwyNTY7bisrKXtlPW47Zm9yKHZhciByPTA7cjw4O3IrKyllPWUmMT8zOTg4MjkyMzg0XmU+Pj4xOmU+Pj4xO3Rbbl09ZX1yZXR1cm4gdH12YXIgZGU9aXQoKTtmdW5jdGlvbiBHZShlLHQsbixyKXt2YXIgbz1kZSxjPXIrbjtlXj0tMTtmb3IodmFyIGc9cjtnPGM7ZysrKWU9ZT4+Pjheb1soZV50W2ddKSYyNTVdO3JldHVybiBlXi0xfXZhciBxZT1HZSxfdD17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9LGF0PU5lLFNlPU9uLGJlPXplLENlPXFlLHN0PV90LEZlPTAsUHQ9MSxpPTMsbD00LGQ9NSxfPTAsQT0xLEM9LTIsaz0tMyxMPS01LEg9LTEsdGU9MSxnZT0yLGtlPTMsdWU9NCxQZT0wLFdlPTIsdXQ9OCxRZT05LEllPTE1LHBlPTgsX2U9MjksTGU9MjU2LEFlPUxlKzErX2UsRXQ9MzAsQXQ9MTksSmU9MipBZSsxLHh0PTE1LE09MyxqPTI1OCxhZT1qK00rMSxuZT0zMixpZT00MixWZT02OSxydD03MyxZZT05MSxLZT0xMDMsVWU9MTEzLEh0PTY2Nix2dD0xLEJ0PTIsTXQ9MyxEbj00LE1uPTM7ZnVuY3Rpb24gYm4oZSx0KXtyZXR1cm4gZS5tc2c9c3RbdF0sdH1mdW5jdGlvbiBTbihlKXtyZXR1cm4oZTw8MSktKGU+ND85OjApfWZ1bmN0aW9uIGdyKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDstLXQ+PTA7KWVbdF09MH1mdW5jdGlvbiBhaShlKXt2YXIgdD1lLnN0YXRlLG49dC5wZW5kaW5nO24+ZS5hdmFpbF9vdXQmJihuPWUuYXZhaWxfb3V0KSxuIT09MCYmKGF0LmFycmF5U2V0KGUub3V0cHV0LHQucGVuZGluZ19idWYsdC5wZW5kaW5nX291dCxuLGUubmV4dF9vdXQpLGUubmV4dF9vdXQrPW4sdC5wZW5kaW5nX291dCs9bixlLnRvdGFsX291dCs9bixlLmF2YWlsX291dC09bix0LnBlbmRpbmctPW4sdC5wZW5kaW5nPT09MCYmKHQucGVuZGluZ19vdXQ9MCkpfWZ1bmN0aW9uIGVuKGUsdCl7U2UuX3RyX2ZsdXNoX2Jsb2NrKGUsZS5ibG9ja19zdGFydD49MD9lLmJsb2NrX3N0YXJ0Oi0xLGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydCx0KSxlLmJsb2NrX3N0YXJ0PWUuc3Ryc3RhcnQsYWkoZS5zdHJtKX1mdW5jdGlvbiBjbihlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXR9ZnVuY3Rpb24gZm8oZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dCYyNTV9ZnVuY3Rpb24gcShlLHQsbixyKXt2YXIgbz1lLmF2YWlsX2luO3JldHVybiBvPnImJihvPXIpLG89PT0wPzA6KGUuYXZhaWxfaW4tPW8sYXQuYXJyYXlTZXQodCxlLmlucHV0LGUubmV4dF9pbixvLG4pLGUuc3RhdGUud3JhcD09PTE/ZS5hZGxlcj1iZShlLmFkbGVyLHQsbyxuKTplLnN0YXRlLndyYXA9PT0yJiYoZS5hZGxlcj1DZShlLmFkbGVyLHQsbyxuKSksZS5uZXh0X2luKz1vLGUudG90YWxfaW4rPW8sbyl9ZnVuY3Rpb24gUShlLHQpe3ZhciBuPWUubWF4X2NoYWluX2xlbmd0aCxyPWUuc3Ryc3RhcnQsbyxjLGc9ZS5wcmV2X2xlbmd0aCxiPWUubmljZV9tYXRjaCxWPWUuc3Ryc3RhcnQ+ZS53X3NpemUtYWU/ZS5zdHJzdGFydC0oZS53X3NpemUtYWUpOjAsVD1lLndpbmRvdyxEPWUud19tYXNrLHZlPWUucHJldix5ZT1lLnN0cnN0YXJ0K2osT2U9VFtyK2ctMV0sZnQ9VFtyK2ddO2UucHJldl9sZW5ndGg+PWUuZ29vZF9tYXRjaCYmKG4+Pj0yKSxiPmUubG9va2FoZWFkJiYoYj1lLmxvb2thaGVhZCk7ZG8gaWYobz10LCEoVFtvK2ddIT09ZnR8fFRbbytnLTFdIT09T2V8fFRbb10hPT1UW3JdfHxUWysrb10hPT1UW3IrMV0pKXtyKz0yLG8rKztkbzt3aGlsZShUWysrcl09PT1UWysrb10mJlRbKytyXT09PVRbKytvXSYmVFsrK3JdPT09VFsrK29dJiZUWysrcl09PT1UWysrb10mJlRbKytyXT09PVRbKytvXSYmVFsrK3JdPT09VFsrK29dJiZUWysrcl09PT1UWysrb10mJlRbKytyXT09PVRbKytvXSYmcjx5ZSk7aWYoYz1qLSh5ZS1yKSxyPXllLWosYz5nKXtpZihlLm1hdGNoX3N0YXJ0PXQsZz1jLGM+PWIpYnJlYWs7T2U9VFtyK2ctMV0sZnQ9VFtyK2ddfX13aGlsZSgodD12ZVt0JkRdKT5WJiYtLW4hPT0wKTtyZXR1cm4gZzw9ZS5sb29rYWhlYWQ/ZzplLmxvb2thaGVhZH1mdW5jdGlvbiBtZShlKXt2YXIgdD1lLndfc2l6ZSxuLHIsbyxjLGc7ZG97aWYoYz1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49dCsodC1hZSkpe2F0LmFycmF5U2V0KGUud2luZG93LGUud2luZG93LHQsdCwwKSxlLm1hdGNoX3N0YXJ0LT10LGUuc3Ryc3RhcnQtPXQsZS5ibG9ja19zdGFydC09dCxyPWUuaGFzaF9zaXplLG49cjtkbyBvPWUuaGVhZFstLW5dLGUuaGVhZFtuXT1vPj10P28tdDowO3doaWxlKC0tcik7cj10LG49cjtkbyBvPWUucHJldlstLW5dLGUucHJldltuXT1vPj10P28tdDowO3doaWxlKC0tcik7Yys9dH1pZihlLnN0cm0uYXZhaWxfaW49PT0wKWJyZWFrO2lmKHI9cShlLnN0cm0sZS53aW5kb3csZS5zdHJzdGFydCtlLmxvb2thaGVhZCxjKSxlLmxvb2thaGVhZCs9cixlLmxvb2thaGVhZCtlLmluc2VydD49TSlmb3IoZz1lLnN0cnN0YXJ0LWUuaW5zZXJ0LGUuaW5zX2g9ZS53aW5kb3dbZ10sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2crMV0pJmUuaGFzaF9tYXNrO2UuaW5zZXJ0JiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2crTS0xXSkmZS5oYXNoX21hc2ssZS5wcmV2W2cmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZyxnKyssZS5pbnNlcnQtLSwhKGUubG9va2FoZWFkK2UuaW5zZXJ0PE0pKTspO313aGlsZShlLmxvb2thaGVhZDxhZSYmZS5zdHJtLmF2YWlsX2luIT09MCl9ZnVuY3Rpb24gUmUoZSx0KXt2YXIgbj02NTUzNTtmb3Iobj5lLnBlbmRpbmdfYnVmX3NpemUtNSYmKG49ZS5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKGUubG9va2FoZWFkPD0xKXtpZihtZShlKSxlLmxvb2thaGVhZD09PTAmJnQ9PT1GZSlyZXR1cm4gdnQ7aWYoZS5sb29rYWhlYWQ9PT0wKWJyZWFrfWUuc3Ryc3RhcnQrPWUubG9va2FoZWFkLGUubG9va2FoZWFkPTA7dmFyIHI9ZS5ibG9ja19zdGFydCtuO2lmKChlLnN0cnN0YXJ0PT09MHx8ZS5zdHJzdGFydD49cikmJihlLmxvb2thaGVhZD1lLnN0cnN0YXJ0LXIsZS5zdHJzdGFydD1yLGVuKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKXx8ZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0Pj1lLndfc2l6ZS1hZSYmKGVuKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gdnR9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PWw/KGVuKGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP010OkRuKTooZS5zdHJzdGFydD5lLmJsb2NrX3N0YXJ0JiYoZW4oZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApLHZ0KX1mdW5jdGlvbiBNZShlLHQpe2Zvcih2YXIgbixyOzspe2lmKGUubG9va2FoZWFkPGFlKXtpZihtZShlKSxlLmxvb2thaGVhZDxhZSYmdD09PUZlKXJldHVybiB2dDtpZihlLmxvb2thaGVhZD09PTApYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1NJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrTS0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSxuIT09MCYmZS5zdHJzdGFydC1uPD1lLndfc2l6ZS1hZSYmKGUubWF0Y2hfbGVuZ3RoPVEoZSxuKSksZS5tYXRjaF9sZW5ndGg+PU0paWYocj1TZS5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGgtTSksZS5sb29rYWhlYWQtPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPD1lLm1heF9sYXp5X21hdGNoJiZlLmxvb2thaGVhZD49TSl7ZS5tYXRjaF9sZW5ndGgtLTtkbyBlLnN0cnN0YXJ0KyssZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrTS0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0O3doaWxlKC0tZS5tYXRjaF9sZW5ndGghPT0wKTtlLnN0cnN0YXJ0Kyt9ZWxzZSBlLnN0cnN0YXJ0Kz1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aD0wLGUuaW5zX2g9ZS53aW5kb3dbZS5zdHJzdGFydF0sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrMV0pJmUuaGFzaF9tYXNrO2Vsc2Ugcj1TZS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKztpZihyJiYoZW4oZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiB2dH1yZXR1cm4gZS5pbnNlcnQ9ZS5zdHJzdGFydDxNLTE/ZS5zdHJzdGFydDpNLTEsdD09PWw/KGVuKGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP010OkRuKTplLmxhc3RfbGl0JiYoZW4oZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP3Z0OkJ0fWZ1bmN0aW9uIFhlKGUsdCl7Zm9yKHZhciBuLHIsbzs7KXtpZihlLmxvb2thaGVhZDxhZSl7aWYobWUoZSksZS5sb29rYWhlYWQ8YWUmJnQ9PT1GZSlyZXR1cm4gdnQ7aWYoZS5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKG49MCxlLmxvb2thaGVhZD49TSYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K00tMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksZS5wcmV2X2xlbmd0aD1lLm1hdGNoX2xlbmd0aCxlLnByZXZfbWF0Y2g9ZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aD1NLTEsbiE9PTAmJmUucHJldl9sZW5ndGg8ZS5tYXhfbGF6eV9tYXRjaCYmZS5zdHJzdGFydC1uPD1lLndfc2l6ZS1hZSYmKGUubWF0Y2hfbGVuZ3RoPVEoZSxuKSxlLm1hdGNoX2xlbmd0aDw9NSYmKGUuc3RyYXRlZ3k9PT10ZXx8ZS5tYXRjaF9sZW5ndGg9PT1NJiZlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQ+NDA5NikmJihlLm1hdGNoX2xlbmd0aD1NLTEpKSxlLnByZXZfbGVuZ3RoPj1NJiZlLm1hdGNoX2xlbmd0aDw9ZS5wcmV2X2xlbmd0aCl7bz1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLU0scj1TZS5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LTEtZS5wcmV2X21hdGNoLGUucHJldl9sZW5ndGgtTSksZS5sb29rYWhlYWQtPWUucHJldl9sZW5ndGgtMSxlLnByZXZfbGVuZ3RoLT0yO2RvKytlLnN0cnN0YXJ0PD1vJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrTS0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KTt3aGlsZSgtLWUucHJldl9sZW5ndGghPT0wKTtpZihlLm1hdGNoX2F2YWlsYWJsZT0wLGUubWF0Y2hfbGVuZ3RoPU0tMSxlLnN0cnN0YXJ0KyssciYmKGVuKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gdnR9ZWxzZSBpZihlLm1hdGNoX2F2YWlsYWJsZSl7aWYocj1TZS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pLHImJmVuKGUsITEpLGUuc3Ryc3RhcnQrKyxlLmxvb2thaGVhZC0tLGUuc3RybS5hdmFpbF9vdXQ9PT0wKXJldHVybiB2dH1lbHNlIGUubWF0Y2hfYXZhaWxhYmxlPTEsZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS19cmV0dXJuIGUubWF0Y2hfYXZhaWxhYmxlJiYocj1TZS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pLGUubWF0Y2hfYXZhaWxhYmxlPTApLGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8TS0xP2Uuc3Ryc3RhcnQ6TS0xLHQ9PT1sPyhlbihlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD9NdDpEbik6ZS5sYXN0X2xpdCYmKGVuKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT92dDpCdH1mdW5jdGlvbiBidChlLHQpe2Zvcih2YXIgbixyLG8sYyxnPWUud2luZG93Ozspe2lmKGUubG9va2FoZWFkPD1qKXtpZihtZShlKSxlLmxvb2thaGVhZDw9aiYmdD09PUZlKXJldHVybiB2dDtpZihlLmxvb2thaGVhZD09PTApYnJlYWt9aWYoZS5tYXRjaF9sZW5ndGg9MCxlLmxvb2thaGVhZD49TSYmZS5zdHJzdGFydD4wJiYobz1lLnN0cnN0YXJ0LTEscj1nW29dLHI9PT1nWysrb10mJnI9PT1nWysrb10mJnI9PT1nWysrb10pKXtjPWUuc3Ryc3RhcnQrajtkbzt3aGlsZShyPT09Z1srK29dJiZyPT09Z1srK29dJiZyPT09Z1srK29dJiZyPT09Z1srK29dJiZyPT09Z1srK29dJiZyPT09Z1srK29dJiZyPT09Z1srK29dJiZyPT09Z1srK29dJiZvPGMpO2UubWF0Y2hfbGVuZ3RoPWotKGMtbyksZS5tYXRjaF9sZW5ndGg+ZS5sb29rYWhlYWQmJihlLm1hdGNoX2xlbmd0aD1lLmxvb2thaGVhZCl9aWYoZS5tYXRjaF9sZW5ndGg+PU0/KG49U2UuX3RyX3RhbGx5KGUsMSxlLm1hdGNoX2xlbmd0aC1NKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCk6KG49U2UuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyspLG4mJihlbihlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIHZ0fXJldHVybiBlLmluc2VydD0wLHQ9PT1sPyhlbihlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD9NdDpEbik6ZS5sYXN0X2xpdCYmKGVuKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT92dDpCdH1mdW5jdGlvbiBldChlLHQpe2Zvcih2YXIgbjs7KXtpZihlLmxvb2thaGVhZD09PTAmJihtZShlKSxlLmxvb2thaGVhZD09PTApKXtpZih0PT09RmUpcmV0dXJuIHZ0O2JyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsbj1TZS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyxuJiYoZW4oZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiB2dH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09bD8oZW4oZSwhMCksZS5zdHJtLmF2YWlsX291dD09PTA/TXQ6RG4pOmUubGFzdF9saXQmJihlbihlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCk/dnQ6QnR9ZnVuY3Rpb24gdHQoZSx0LG4scixvKXt0aGlzLmdvb2RfbGVuZ3RoPWUsdGhpcy5tYXhfbGF6eT10LHRoaXMubmljZV9sZW5ndGg9bix0aGlzLm1heF9jaGFpbj1yLHRoaXMuZnVuYz1vfXZhciAkZTskZT1bbmV3IHR0KDAsMCwwLDAsUmUpLG5ldyB0dCg0LDQsOCw0LE1lKSxuZXcgdHQoNCw1LDE2LDgsTWUpLG5ldyB0dCg0LDYsMzIsMzIsTWUpLG5ldyB0dCg0LDQsMTYsMTYsWGUpLG5ldyB0dCg4LDE2LDMyLDMyLFhlKSxuZXcgdHQoOCwxNiwxMjgsMTI4LFhlKSxuZXcgdHQoOCwzMiwxMjgsMjU2LFhlKSxuZXcgdHQoMzIsMTI4LDI1OCwxMDI0LFhlKSxuZXcgdHQoMzIsMjU4LDI1OCw0MDk2LFhlKV07ZnVuY3Rpb24gV3QoZSl7ZS53aW5kb3dfc2l6ZT0yKmUud19zaXplLGdyKGUuaGVhZCksZS5tYXhfbGF6eV9tYXRjaD0kZVtlLmxldmVsXS5tYXhfbGF6eSxlLmdvb2RfbWF0Y2g9JGVbZS5sZXZlbF0uZ29vZF9sZW5ndGgsZS5uaWNlX21hdGNoPSRlW2UubGV2ZWxdLm5pY2VfbGVuZ3RoLGUubWF4X2NoYWluX2xlbmd0aD0kZVtlLmxldmVsXS5tYXhfY2hhaW4sZS5zdHJzdGFydD0wLGUuYmxvY2tfc3RhcnQ9MCxlLmxvb2thaGVhZD0wLGUuaW5zZXJ0PTAsZS5tYXRjaF9sZW5ndGg9ZS5wcmV2X2xlbmd0aD1NLTEsZS5tYXRjaF9hdmFpbGFibGU9MCxlLmluc19oPTB9ZnVuY3Rpb24gRnQoKXt0aGlzLnN0cm09bnVsbCx0aGlzLnN0YXR1cz0wLHRoaXMucGVuZGluZ19idWY9bnVsbCx0aGlzLnBlbmRpbmdfYnVmX3NpemU9MCx0aGlzLnBlbmRpbmdfb3V0PTAsdGhpcy5wZW5kaW5nPTAsdGhpcy53cmFwPTAsdGhpcy5nemhlYWQ9bnVsbCx0aGlzLmd6aW5kZXg9MCx0aGlzLm1ldGhvZD11dCx0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgYXQuQnVmMTYoSmUqMiksdGhpcy5keW5fZHRyZWU9bmV3IGF0LkJ1ZjE2KCgyKkV0KzEpKjIpLHRoaXMuYmxfdHJlZT1uZXcgYXQuQnVmMTYoKDIqQXQrMSkqMiksZ3IodGhpcy5keW5fbHRyZWUpLGdyKHRoaXMuZHluX2R0cmVlKSxncih0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyBhdC5CdWYxNih4dCsxKSx0aGlzLmhlYXA9bmV3IGF0LkJ1ZjE2KDIqQWUrMSksZ3IodGhpcy5oZWFwKSx0aGlzLmhlYXBfbGVuPTAsdGhpcy5oZWFwX21heD0wLHRoaXMuZGVwdGg9bmV3IGF0LkJ1ZjE2KDIqQWUrMSksZ3IodGhpcy5kZXB0aCksdGhpcy5sX2J1Zj0wLHRoaXMubGl0X2J1ZnNpemU9MCx0aGlzLmxhc3RfbGl0PTAsdGhpcy5kX2J1Zj0wLHRoaXMub3B0X2xlbj0wLHRoaXMuc3RhdGljX2xlbj0wLHRoaXMubWF0Y2hlcz0wLHRoaXMuaW5zZXJ0PTAsdGhpcy5iaV9idWY9MCx0aGlzLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gR3QoZSl7dmFyIHQ7cmV0dXJuIWV8fCFlLnN0YXRlP2JuKGUsQyk6KGUudG90YWxfaW49ZS50b3RhbF9vdXQ9MCxlLmRhdGFfdHlwZT1XZSx0PWUuc3RhdGUsdC5wZW5kaW5nPTAsdC5wZW5kaW5nX291dD0wLHQud3JhcDwwJiYodC53cmFwPS10LndyYXApLHQuc3RhdHVzPXQud3JhcD9pZTpVZSxlLmFkbGVyPXQud3JhcD09PTI/MDoxLHQubGFzdF9mbHVzaD1GZSxTZS5fdHJfaW5pdCh0KSxfKX1mdW5jdGlvbiBJbihlKXt2YXIgdD1HdChlKTtyZXR1cm4gdD09PV8mJld0KGUuc3RhdGUpLHR9ZnVuY3Rpb24gS3IoZSx0KXtyZXR1cm4hZXx8IWUuc3RhdGV8fGUuc3RhdGUud3JhcCE9PTI/QzooZS5zdGF0ZS5nemhlYWQ9dCxfKX1mdW5jdGlvbiB0cihlLHQsbixyLG8sYyl7aWYoIWUpcmV0dXJuIEM7dmFyIGc9MTtpZih0PT09SCYmKHQ9NikscjwwPyhnPTAscj0tcik6cj4xNSYmKGc9MixyLT0xNiksbzwxfHxvPlFlfHxuIT09dXR8fHI8OHx8cj4xNXx8dDwwfHx0Pjl8fGM8MHx8Yz51ZSlyZXR1cm4gYm4oZSxDKTtyPT09OCYmKHI9OSk7dmFyIGI9bmV3IEZ0O3JldHVybiBlLnN0YXRlPWIsYi5zdHJtPWUsYi53cmFwPWcsYi5nemhlYWQ9bnVsbCxiLndfYml0cz1yLGIud19zaXplPTE8PGIud19iaXRzLGIud19tYXNrPWIud19zaXplLTEsYi5oYXNoX2JpdHM9bys3LGIuaGFzaF9zaXplPTE8PGIuaGFzaF9iaXRzLGIuaGFzaF9tYXNrPWIuaGFzaF9zaXplLTEsYi5oYXNoX3NoaWZ0PX5+KChiLmhhc2hfYml0cytNLTEpL00pLGIud2luZG93PW5ldyBhdC5CdWY4KGIud19zaXplKjIpLGIuaGVhZD1uZXcgYXQuQnVmMTYoYi5oYXNoX3NpemUpLGIucHJldj1uZXcgYXQuQnVmMTYoYi53X3NpemUpLGIubGl0X2J1ZnNpemU9MTw8bys2LGIucGVuZGluZ19idWZfc2l6ZT1iLmxpdF9idWZzaXplKjQsYi5wZW5kaW5nX2J1Zj1uZXcgYXQuQnVmOChiLnBlbmRpbmdfYnVmX3NpemUpLGIuZF9idWY9MSpiLmxpdF9idWZzaXplLGIubF9idWY9KDErMikqYi5saXRfYnVmc2l6ZSxiLmxldmVsPXQsYi5zdHJhdGVneT1jLGIubWV0aG9kPW4sSW4oZSl9ZnVuY3Rpb24gdmkoZSx0KXtyZXR1cm4gdHIoZSx0LHV0LEllLHBlLFBlKX1mdW5jdGlvbiBqbyhlLHQpe3ZhciBuLHIsbyxjO2lmKCFlfHwhZS5zdGF0ZXx8dD5kfHx0PDApcmV0dXJuIGU/Ym4oZSxDKTpDO2lmKHI9ZS5zdGF0ZSwhZS5vdXRwdXR8fCFlLmlucHV0JiZlLmF2YWlsX2luIT09MHx8ci5zdGF0dXM9PT1IdCYmdCE9PWwpcmV0dXJuIGJuKGUsZS5hdmFpbF9vdXQ9PT0wP0w6Qyk7aWYoci5zdHJtPWUsbj1yLmxhc3RfZmx1c2gsci5sYXN0X2ZsdXNoPXQsci5zdGF0dXM9PT1pZSlpZihyLndyYXA9PT0yKWUuYWRsZXI9MCxjbihyLDMxKSxjbihyLDEzOSksY24ociw4KSxyLmd6aGVhZD8oY24ociwoci5nemhlYWQudGV4dD8xOjApKyhyLmd6aGVhZC5oY3JjPzI6MCkrKHIuZ3poZWFkLmV4dHJhPzQ6MCkrKHIuZ3poZWFkLm5hbWU/ODowKSsoci5nemhlYWQuY29tbWVudD8xNjowKSksY24ocixyLmd6aGVhZC50aW1lJjI1NSksY24ocixyLmd6aGVhZC50aW1lPj44JjI1NSksY24ocixyLmd6aGVhZC50aW1lPj4xNiYyNTUpLGNuKHIsci5nemhlYWQudGltZT4+MjQmMjU1KSxjbihyLHIubGV2ZWw9PT05PzI6ci5zdHJhdGVneT49Z2V8fHIubGV2ZWw8Mj80OjApLGNuKHIsci5nemhlYWQub3MmMjU1KSxyLmd6aGVhZC5leHRyYSYmci5nemhlYWQuZXh0cmEubGVuZ3RoJiYoY24ocixyLmd6aGVhZC5leHRyYS5sZW5ndGgmMjU1KSxjbihyLHIuZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYyNTUpKSxyLmd6aGVhZC5oY3JjJiYoZS5hZGxlcj1DZShlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLDApKSxyLmd6aW5kZXg9MCxyLnN0YXR1cz1WZSk6KGNuKHIsMCksY24ociwwKSxjbihyLDApLGNuKHIsMCksY24ociwwKSxjbihyLHIubGV2ZWw9PT05PzI6ci5zdHJhdGVneT49Z2V8fHIubGV2ZWw8Mj80OjApLGNuKHIsTW4pLHIuc3RhdHVzPVVlKTtlbHNle3ZhciBnPXV0KyhyLndfYml0cy04PDw0KTw8OCxiPS0xO3Iuc3RyYXRlZ3k+PWdlfHxyLmxldmVsPDI/Yj0wOnIubGV2ZWw8Nj9iPTE6ci5sZXZlbD09PTY/Yj0yOmI9MyxnfD1iPDw2LHIuc3Ryc3RhcnQhPT0wJiYoZ3w9bmUpLGcrPTMxLWclMzEsci5zdGF0dXM9VWUsZm8ocixnKSxyLnN0cnN0YXJ0IT09MCYmKGZvKHIsZS5hZGxlcj4+PjE2KSxmbyhyLGUuYWRsZXImNjU1MzUpKSxlLmFkbGVyPTF9aWYoci5zdGF0dXM9PT1WZSlpZihyLmd6aGVhZC5leHRyYSl7Zm9yKG89ci5wZW5kaW5nO3IuZ3ppbmRleDwoci5nemhlYWQuZXh0cmEubGVuZ3RoJjY1NTM1KSYmIShyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+byYmKGUuYWRsZXI9Q2UoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1vLG8pKSxhaShlKSxvPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKTspY24ocixyLmd6aGVhZC5leHRyYVtyLmd6aW5kZXhdJjI1NSksci5nemluZGV4Kys7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPm8mJihlLmFkbGVyPUNlKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctbyxvKSksci5nemluZGV4PT09ci5nemhlYWQuZXh0cmEubGVuZ3RoJiYoci5nemluZGV4PTAsci5zdGF0dXM9cnQpfWVsc2Ugci5zdGF0dXM9cnQ7aWYoci5zdGF0dXM9PT1ydClpZihyLmd6aGVhZC5uYW1lKXtvPXIucGVuZGluZztkb3tpZihyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+byYmKGUuYWRsZXI9Q2UoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1vLG8pKSxhaShlKSxvPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKXtjPTE7YnJlYWt9ci5nemluZGV4PHIuZ3poZWFkLm5hbWUubGVuZ3RoP2M9ci5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKSYyNTU6Yz0wLGNuKHIsYyl9d2hpbGUoYyE9PTApO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5vJiYoZS5hZGxlcj1DZShlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW8sbykpLGM9PT0wJiYoci5nemluZGV4PTAsci5zdGF0dXM9WWUpfWVsc2Ugci5zdGF0dXM9WWU7aWYoci5zdGF0dXM9PT1ZZSlpZihyLmd6aGVhZC5jb21tZW50KXtvPXIucGVuZGluZztkb3tpZihyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+byYmKGUuYWRsZXI9Q2UoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1vLG8pKSxhaShlKSxvPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKXtjPTE7YnJlYWt9ci5nemluZGV4PHIuZ3poZWFkLmNvbW1lbnQubGVuZ3RoP2M9ci5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKSYyNTU6Yz0wLGNuKHIsYyl9d2hpbGUoYyE9PTApO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5vJiYoZS5hZGxlcj1DZShlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW8sbykpLGM9PT0wJiYoci5zdGF0dXM9S2UpfWVsc2Ugci5zdGF0dXM9S2U7aWYoci5zdGF0dXM9PT1LZSYmKHIuZ3poZWFkLmhjcmM/KHIucGVuZGluZysyPnIucGVuZGluZ19idWZfc2l6ZSYmYWkoZSksci5wZW5kaW5nKzI8PXIucGVuZGluZ19idWZfc2l6ZSYmKGNuKHIsZS5hZGxlciYyNTUpLGNuKHIsZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MCxyLnN0YXR1cz1VZSkpOnIuc3RhdHVzPVVlKSxyLnBlbmRpbmchPT0wKXtpZihhaShlKSxlLmF2YWlsX291dD09PTApcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxffWVsc2UgaWYoZS5hdmFpbF9pbj09PTAmJlNuKHQpPD1TbihuKSYmdCE9PWwpcmV0dXJuIGJuKGUsTCk7aWYoci5zdGF0dXM9PT1IdCYmZS5hdmFpbF9pbiE9PTApcmV0dXJuIGJuKGUsTCk7aWYoZS5hdmFpbF9pbiE9PTB8fHIubG9va2FoZWFkIT09MHx8dCE9PUZlJiZyLnN0YXR1cyE9PUh0KXt2YXIgVj1yLnN0cmF0ZWd5PT09Z2U/ZXQocix0KTpyLnN0cmF0ZWd5PT09a2U/YnQocix0KTokZVtyLmxldmVsXS5mdW5jKHIsdCk7aWYoKFY9PT1NdHx8Vj09PURuKSYmKHIuc3RhdHVzPUh0KSxWPT09dnR8fFY9PT1NdClyZXR1cm4gZS5hdmFpbF9vdXQ9PT0wJiYoci5sYXN0X2ZsdXNoPS0xKSxfO2lmKFY9PT1CdCYmKHQ9PT1QdD9TZS5fdHJfYWxpZ24ocik6dCE9PWQmJihTZS5fdHJfc3RvcmVkX2Jsb2NrKHIsMCwwLCExKSx0PT09aSYmKGdyKHIuaGVhZCksci5sb29rYWhlYWQ9PT0wJiYoci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSkpLGFpKGUpLGUuYXZhaWxfb3V0PT09MCkpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxffXJldHVybiB0IT09bD9fOnIud3JhcDw9MD9BOihyLndyYXA9PT0yPyhjbihyLGUuYWRsZXImMjU1KSxjbihyLGUuYWRsZXI+PjgmMjU1KSxjbihyLGUuYWRsZXI+PjE2JjI1NSksY24ocixlLmFkbGVyPj4yNCYyNTUpLGNuKHIsZS50b3RhbF9pbiYyNTUpLGNuKHIsZS50b3RhbF9pbj4+OCYyNTUpLGNuKHIsZS50b3RhbF9pbj4+MTYmMjU1KSxjbihyLGUudG90YWxfaW4+PjI0JjI1NSkpOihmbyhyLGUuYWRsZXI+Pj4xNiksZm8ocixlLmFkbGVyJjY1NTM1KSksYWkoZSksci53cmFwPjAmJihyLndyYXA9LXIud3JhcCksci5wZW5kaW5nIT09MD9fOkEpfWZ1bmN0aW9uIGVzKGUpe3ZhciB0O3JldHVybiFlfHwhZS5zdGF0ZT9DOih0PWUuc3RhdGUuc3RhdHVzLHQhPT1pZSYmdCE9PVZlJiZ0IT09cnQmJnQhPT1ZZSYmdCE9PUtlJiZ0IT09VWUmJnQhPT1IdD9ibihlLEMpOihlLnN0YXRlPW51bGwsdD09PVVlP2JuKGUsayk6XykpfWZ1bmN0aW9uIHdzKGUsdCl7dmFyIG49dC5sZW5ndGgscixvLGMsZyxiLFYsVCxEO2lmKCFlfHwhZS5zdGF0ZXx8KHI9ZS5zdGF0ZSxnPXIud3JhcCxnPT09Mnx8Zz09PTEmJnIuc3RhdHVzIT09aWV8fHIubG9va2FoZWFkKSlyZXR1cm4gQztmb3IoZz09PTEmJihlLmFkbGVyPWJlKGUuYWRsZXIsdCxuLDApKSxyLndyYXA9MCxuPj1yLndfc2l6ZSYmKGc9PT0wJiYoZ3Ioci5oZWFkKSxyLnN0cnN0YXJ0PTAsci5ibG9ja19zdGFydD0wLHIuaW5zZXJ0PTApLEQ9bmV3IGF0LkJ1Zjgoci53X3NpemUpLGF0LmFycmF5U2V0KEQsdCxuLXIud19zaXplLHIud19zaXplLDApLHQ9RCxuPXIud19zaXplKSxiPWUuYXZhaWxfaW4sVj1lLm5leHRfaW4sVD1lLmlucHV0LGUuYXZhaWxfaW49bixlLm5leHRfaW49MCxlLmlucHV0PXQsbWUocik7ci5sb29rYWhlYWQ+PU07KXtvPXIuc3Ryc3RhcnQsYz1yLmxvb2thaGVhZC0oTS0xKTtkbyByLmluc19oPShyLmluc19oPDxyLmhhc2hfc2hpZnReci53aW5kb3dbbytNLTFdKSZyLmhhc2hfbWFzayxyLnByZXZbbyZyLndfbWFza109ci5oZWFkW3IuaW5zX2hdLHIuaGVhZFtyLmluc19oXT1vLG8rKzt3aGlsZSgtLWMpO3Iuc3Ryc3RhcnQ9byxyLmxvb2thaGVhZD1NLTEsbWUocil9cmV0dXJuIHIuc3Ryc3RhcnQrPXIubG9va2FoZWFkLHIuYmxvY2tfc3RhcnQ9ci5zdHJzdGFydCxyLmluc2VydD1yLmxvb2thaGVhZCxyLmxvb2thaGVhZD0wLHIubWF0Y2hfbGVuZ3RoPXIucHJldl9sZW5ndGg9TS0xLHIubWF0Y2hfYXZhaWxhYmxlPTAsZS5uZXh0X2luPVYsZS5pbnB1dD1ULGUuYXZhaWxfaW49YixyLndyYXA9ZyxffUl0LmRlZmxhdGVJbml0PXZpLEl0LmRlZmxhdGVJbml0Mj10cixJdC5kZWZsYXRlUmVzZXQ9SW4sSXQuZGVmbGF0ZVJlc2V0S2VlcD1HdCxJdC5kZWZsYXRlU2V0SGVhZGVyPUtyLEl0LmRlZmxhdGU9am8sSXQuZGVmbGF0ZUVuZD1lcyxJdC5kZWZsYXRlU2V0RGljdGlvbmFyeT13cyxJdC5kZWZsYXRlSW5mbz0icGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSI7dmFyIGlyPXt9LFJhPU5lLENzPSEwLHRvPSEwO3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsWzBdKX1jYXRjaChlKXtDcz0hMX10cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKX1jYXRjaChlKXt0bz0hMX1mb3IodmFyIHpvPW5ldyBSYS5CdWY4KDI1NiksaG89MDtobzwyNTY7aG8rKyl6b1tob109aG8+PTI1Mj82OmhvPj0yNDg/NTpobz49MjQwPzQ6aG8+PTIyND8zOmhvPj0xOTI/MjoxO3pvWzI1NF09em9bMjU0XT0xLGlyLnN0cmluZzJidWY9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8sYyxnPWUubGVuZ3RoLGI9MDtmb3Iobz0wO288ZztvKyspbj1lLmNoYXJDb2RlQXQobyksKG4mNjQ1MTIpPT09NTUyOTYmJm8rMTxnJiYocj1lLmNoYXJDb2RlQXQobysxKSwociY2NDUxMik9PT01NjMyMCYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksbysrKSksYis9bjwxMjg/MTpuPDIwNDg/MjpuPDY1NTM2PzM6NDtmb3IodD1uZXcgUmEuQnVmOChiKSxjPTAsbz0wO2M8YjtvKyspbj1lLmNoYXJDb2RlQXQobyksKG4mNjQ1MTIpPT09NTUyOTYmJm8rMTxnJiYocj1lLmNoYXJDb2RlQXQobysxKSwociY2NDUxMik9PT01NjMyMCYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksbysrKSksbjwxMjg/dFtjKytdPW46bjwyMDQ4Pyh0W2MrK109MTkyfG4+Pj42LHRbYysrXT0xMjh8biY2Myk6bjw2NTUzNj8odFtjKytdPTIyNHxuPj4+MTIsdFtjKytdPTEyOHxuPj4+NiY2Myx0W2MrK109MTI4fG4mNjMpOih0W2MrK109MjQwfG4+Pj4xOCx0W2MrK109MTI4fG4+Pj4xMiY2Myx0W2MrK109MTI4fG4+Pj42JjYzLHRbYysrXT0xMjh8biY2Myk7cmV0dXJuIHR9O2Z1bmN0aW9uIF9hKGUsdCl7aWYodDw2NTUzNCYmKGUuc3ViYXJyYXkmJnRvfHwhZS5zdWJhcnJheSYmQ3MpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsUmEuc2hyaW5rQnVmKGUsdCkpO2Zvcih2YXIgbj0iIixyPTA7cjx0O3IrKyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbcl0pO3JldHVybiBufWlyLmJ1ZjJiaW5zdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIF9hKGUsZS5sZW5ndGgpfSxpci5iaW5zdHJpbmcyYnVmPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1uZXcgUmEuQnVmOChlLmxlbmd0aCksbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl0W25dPWUuY2hhckNvZGVBdChuKTtyZXR1cm4gdH0saXIuYnVmMnN0cmluZz1mdW5jdGlvbihlLHQpe3ZhciBuLHIsbyxjLGc9dHx8ZS5sZW5ndGgsYj1uZXcgQXJyYXkoZyoyKTtmb3Iocj0wLG49MDtuPGc7KXtpZihvPWVbbisrXSxvPDEyOCl7YltyKytdPW87Y29udGludWV9aWYoYz16b1tvXSxjPjQpe2JbcisrXT02NTUzMyxuKz1jLTE7Y29udGludWV9Zm9yKG8mPWM9PT0yPzMxOmM9PT0zPzE1Ojc7Yz4xJiZuPGc7KW89bzw8NnxlW24rK10mNjMsYy0tO2lmKGM+MSl7YltyKytdPTY1NTMzO2NvbnRpbnVlfW88NjU1MzY/YltyKytdPW86KG8tPTY1NTM2LGJbcisrXT01NTI5NnxvPj4xMCYxMDIzLGJbcisrXT01NjMyMHxvJjEwMjMpfXJldHVybiBfYShiLHIpfSxpci51dGY4Ym9yZGVyPWZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKHQ9dHx8ZS5sZW5ndGgsdD5lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLG49dC0xO24+PTAmJihlW25dJjE5Mik9PT0xMjg7KW4tLTtyZXR1cm4gbjwwfHxuPT09MD90Om4rem9bZVtuXV0+dD9uOnR9O2Z1bmN0aW9uIHRzKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH12YXIgbGE9dHMsY2E9SXQsV289TmUsRWw9aXIsWXM9X3QsYmM9bGEsV2w9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxzbT0wLHZ1PTQseWw9MCxqZj0xLHpmPTIsbG09LTEsY209MCx1bT04O2Z1bmN0aW9uIHFzKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHFzKSlyZXR1cm4gbmV3IHFzKGUpO3RoaXMub3B0aW9ucz1Xby5hc3NpZ24oe2xldmVsOmxtLG1ldGhvZDp1bSxjaHVua1NpemU6MTYzODQsd2luZG93Qml0czoxNSxtZW1MZXZlbDo4LHN0cmF0ZWd5OmNtLHRvOiIifSxlfHx7fSk7dmFyIHQ9dGhpcy5vcHRpb25zO3QucmF3JiZ0LndpbmRvd0JpdHM+MD90LndpbmRvd0JpdHM9LXQud2luZG93Qml0czp0Lmd6aXAmJnQud2luZG93Qml0cz4wJiZ0LndpbmRvd0JpdHM8MTYmJih0LndpbmRvd0JpdHMrPTE2KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyBiYyx0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIG49Y2EuZGVmbGF0ZUluaXQyKHRoaXMuc3RybSx0LmxldmVsLHQubWV0aG9kLHQud2luZG93Qml0cyx0Lm1lbUxldmVsLHQuc3RyYXRlZ3kpO2lmKG4hPT15bCl0aHJvdyBuZXcgRXJyb3IoWXNbbl0pO2lmKHQuaGVhZGVyJiZjYS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSx0LmhlYWRlciksdC5kaWN0aW9uYXJ5KXt2YXIgcjtpZih0eXBlb2YgdC5kaWN0aW9uYXJ5PT0ic3RyaW5nIj9yPUVsLnN0cmluZzJidWYodC5kaWN0aW9uYXJ5KTpXbC5jYWxsKHQuZGljdGlvbmFyeSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP3I9bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KTpyPXQuZGljdGlvbmFyeSxuPWNhLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSxyKSxuIT09eWwpdGhyb3cgbmV3IEVycm9yKFlzW25dKTt0aGlzLl9kaWN0X3NldD0hMH19cXMucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnN0cm0scj10aGlzLm9wdGlvbnMuY2h1bmtTaXplLG8sYztpZih0aGlzLmVuZGVkKXJldHVybiExO2M9dD09PX5+dD90OnQ9PT0hMD92dTpzbSx0eXBlb2YgZT09InN0cmluZyI/bi5pbnB1dD1FbC5zdHJpbmcyYnVmKGUpOldsLmNhbGwoZSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP24uaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6bi5pbnB1dD1lLG4ubmV4dF9pbj0wLG4uYXZhaWxfaW49bi5pbnB1dC5sZW5ndGg7ZG97aWYobi5hdmFpbF9vdXQ9PT0wJiYobi5vdXRwdXQ9bmV3IFdvLkJ1Zjgociksbi5uZXh0X291dD0wLG4uYXZhaWxfb3V0PXIpLG89Y2EuZGVmbGF0ZShuLGMpLG8hPT1qZiYmbyE9PXlsKXJldHVybiB0aGlzLm9uRW5kKG8pLHRoaXMuZW5kZWQ9ITAsITE7KG4uYXZhaWxfb3V0PT09MHx8bi5hdmFpbF9pbj09PTAmJihjPT09dnV8fGM9PT16ZikpJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5vbkRhdGEoRWwuYnVmMmJpbnN0cmluZyhXby5zaHJpbmtCdWYobi5vdXRwdXQsbi5uZXh0X291dCkpKTp0aGlzLm9uRGF0YShXby5zaHJpbmtCdWYobi5vdXRwdXQsbi5uZXh0X291dCkpKX13aGlsZSgobi5hdmFpbF9pbj4wfHxuLmF2YWlsX291dD09PTApJiZvIT09amYpO3JldHVybiBjPT09dnU/KG89Y2EuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQobyksdGhpcy5lbmRlZD0hMCxvPT09eWwpOihjPT09emYmJih0aGlzLm9uRW5kKHlsKSxuLmF2YWlsX291dD0wKSwhMCl9LHFzLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0scXMucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT15bCYmKHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PVdvLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj1lLHRoaXMubXNnPXRoaXMuc3RybS5tc2d9O2Z1bmN0aW9uIG11KGUsdCl7dmFyIG49bmV3IHFzKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8WXNbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1mdW5jdGlvbiBmbShlLHQpe3JldHVybiB0PXR8fHt9LHQucmF3PSEwLG11KGUsdCl9ZnVuY3Rpb24gZG0oZSx0KXtyZXR1cm4gdD10fHx7fSx0Lmd6aXA9ITAsbXUoZSx0KX1rdC5EZWZsYXRlPXFzLGt0LmRlZmxhdGU9bXUsa3QuZGVmbGF0ZVJhdz1mbSxrdC5nemlwPWRtO3ZhciBHbD17fSxiYT17fSxFYz0zMCxobT0xMixnbT1mdW5jdGlvbih0LG4pe3ZhciByLG8sYyxnLGIsVixULEQsdmUseWUsT2UsZnQsaHQsVnQsd3QsRW4sb24sYW4sU3QsWHQsZG4sdG4sVG4sdnIsc247cj10LnN0YXRlLG89dC5uZXh0X2luLHZyPXQuaW5wdXQsYz1vKyh0LmF2YWlsX2luLTUpLGc9dC5uZXh0X291dCxzbj10Lm91dHB1dCxiPWctKG4tdC5hdmFpbF9vdXQpLFY9ZysodC5hdmFpbF9vdXQtMjU3KSxUPXIuZG1heCxEPXIud3NpemUsdmU9ci53aGF2ZSx5ZT1yLnduZXh0LE9lPXIud2luZG93LGZ0PXIuaG9sZCxodD1yLmJpdHMsVnQ9ci5sZW5jb2RlLHd0PXIuZGlzdGNvZGUsRW49KDE8PHIubGVuYml0cyktMSxvbj0oMTw8ci5kaXN0Yml0cyktMTtlOmRve2h0PDE1JiYoZnQrPXZyW28rK108PGh0LGh0Kz04LGZ0Kz12cltvKytdPDxodCxodCs9OCksYW49VnRbZnQmRW5dO3Q6Zm9yKDs7KXtpZihTdD1hbj4+PjI0LGZ0Pj4+PVN0LGh0LT1TdCxTdD1hbj4+PjE2JjI1NSxTdD09PTApc25bZysrXT1hbiY2NTUzNTtlbHNlIGlmKFN0JjE2KXtYdD1hbiY2NTUzNSxTdCY9MTUsU3QmJihodDxTdCYmKGZ0Kz12cltvKytdPDxodCxodCs9OCksWHQrPWZ0JigxPDxTdCktMSxmdD4+Pj1TdCxodC09U3QpLGh0PDE1JiYoZnQrPXZyW28rK108PGh0LGh0Kz04LGZ0Kz12cltvKytdPDxodCxodCs9OCksYW49d3RbZnQmb25dO246Zm9yKDs7KXtpZihTdD1hbj4+PjI0LGZ0Pj4+PVN0LGh0LT1TdCxTdD1hbj4+PjE2JjI1NSxTdCYxNil7aWYoZG49YW4mNjU1MzUsU3QmPTE1LGh0PFN0JiYoZnQrPXZyW28rK108PGh0LGh0Kz04LGh0PFN0JiYoZnQrPXZyW28rK108PGh0LGh0Kz04KSksZG4rPWZ0JigxPDxTdCktMSxkbj5UKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLHIubW9kZT1FYzticmVhayBlfWlmKGZ0Pj4+PVN0LGh0LT1TdCxTdD1nLWIsZG4+U3Qpe2lmKFN0PWRuLVN0LFN0PnZlJiZyLnNhbmUpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsci5tb2RlPUVjO2JyZWFrIGV9aWYodG49MCxUbj1PZSx5ZT09PTApe2lmKHRuKz1ELVN0LFN0PFh0KXtYdC09U3Q7ZG8gc25bZysrXT1PZVt0bisrXTt3aGlsZSgtLVN0KTt0bj1nLWRuLFRuPXNufX1lbHNlIGlmKHllPFN0KXtpZih0bis9RCt5ZS1TdCxTdC09eWUsU3Q8WHQpe1h0LT1TdDtkbyBzbltnKytdPU9lW3RuKytdO3doaWxlKC0tU3QpO2lmKHRuPTAseWU8WHQpe1N0PXllLFh0LT1TdDtkbyBzbltnKytdPU9lW3RuKytdO3doaWxlKC0tU3QpO3RuPWctZG4sVG49c259fX1lbHNlIGlmKHRuKz15ZS1TdCxTdDxYdCl7WHQtPVN0O2RvIHNuW2crK109T2VbdG4rK107d2hpbGUoLS1TdCk7dG49Zy1kbixUbj1zbn1mb3IoO1h0PjI7KXNuW2crK109VG5bdG4rK10sc25bZysrXT1Ublt0bisrXSxzbltnKytdPVRuW3RuKytdLFh0LT0zO1h0JiYoc25bZysrXT1Ublt0bisrXSxYdD4xJiYoc25bZysrXT1Ublt0bisrXSkpfWVsc2V7dG49Zy1kbjtkbyBzbltnKytdPXNuW3RuKytdLHNuW2crK109c25bdG4rK10sc25bZysrXT1zblt0bisrXSxYdC09Mzt3aGlsZShYdD4yKTtYdCYmKHNuW2crK109c25bdG4rK10sWHQ+MSYmKHNuW2crK109c25bdG4rK10pKX19ZWxzZSBpZigoU3QmNjQpPT09MCl7YW49d3RbKGFuJjY1NTM1KSsoZnQmKDE8PFN0KS0xKV07Y29udGludWUgbn1lbHNle3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLHIubW9kZT1FYzticmVhayBlfWJyZWFrfX1lbHNlIGlmKChTdCY2NCk9PT0wKXthbj1WdFsoYW4mNjU1MzUpKyhmdCYoMTw8U3QpLTEpXTtjb250aW51ZSB0fWVsc2UgaWYoU3QmMzIpe3IubW9kZT1obTticmVhayBlfWVsc2V7dC5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsci5tb2RlPUVjO2JyZWFrIGV9YnJlYWt9fXdoaWxlKG88YyYmZzxWKTtYdD1odD4+MyxvLT1YdCxodC09WHQ8PDMsZnQmPSgxPDxodCktMSx0Lm5leHRfaW49byx0Lm5leHRfb3V0PWcsdC5hdmFpbF9pbj1vPGM/NSsoYy1vKTo1LShvLWMpLHQuYXZhaWxfb3V0PWc8Vj8yNTcrKFYtZyk6MjU3LShnLVYpLHIuaG9sZD1mdCxyLmJpdHM9aHR9LFdmPU5lLFNsPTE1LEdmPTg1MixZZj01OTIscWY9MCxfdT0xLEpmPTIscG09WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx2bT1bMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTcsMTcsMTcsMTcsMTgsMTgsMTgsMTgsMTksMTksMTksMTksMjAsMjAsMjAsMjAsMjEsMjEsMjEsMjEsMTYsNzIsNzhdLG1tPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsMCwwXSxfbT1bMTYsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjIsMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjcsMjcsMjgsMjgsMjksMjksNjQsNjRdLGJtPWZ1bmN0aW9uKHQsbixyLG8sYyxnLGIsVil7dmFyIFQ9Vi5iaXRzLEQ9MCx2ZT0wLHllPTAsT2U9MCxmdD0wLGh0PTAsVnQ9MCx3dD0wLEVuPTAsb249MCxhbixTdCxYdCxkbix0bixUbj1udWxsLHZyPTAsc24sQWE9bmV3IFdmLkJ1ZjE2KFNsKzEpLFpjPW5ldyBXZi5CdWYxNihTbCsxKSxYYz1udWxsLE5wPTAsa3AsUWMsZXU7Zm9yKEQ9MDtEPD1TbDtEKyspQWFbRF09MDtmb3IodmU9MDt2ZTxvO3ZlKyspQWFbbltyK3ZlXV0rKztmb3IoZnQ9VCxPZT1TbDtPZT49MSYmQWFbT2VdPT09MDtPZS0tKTtpZihmdD5PZSYmKGZ0PU9lKSxPZT09PTApcmV0dXJuIGNbZysrXT0xPDwyNHw2NDw8MTZ8MCxjW2crK109MTw8MjR8NjQ8PDE2fDAsVi5iaXRzPTEsMDtmb3IoeWU9MTt5ZTxPZSYmQWFbeWVdPT09MDt5ZSsrKTtmb3IoZnQ8eWUmJihmdD15ZSksd3Q9MSxEPTE7RDw9U2w7RCsrKWlmKHd0PDw9MSx3dC09QWFbRF0sd3Q8MClyZXR1cm4tMTtpZih3dD4wJiYodD09PXFmfHxPZSE9PTEpKXJldHVybi0xO2ZvcihaY1sxXT0wLEQ9MTtEPFNsO0QrKylaY1tEKzFdPVpjW0RdK0FhW0RdO2Zvcih2ZT0wO3ZlPG87dmUrKyluW3IrdmVdIT09MCYmKGJbWmNbbltyK3ZlXV0rK109dmUpO2lmKHQ9PT1xZj8oVG49WGM9Yixzbj0xOSk6dD09PV91PyhUbj1wbSx2ci09MjU3LFhjPXZtLE5wLT0yNTcsc249MjU2KTooVG49bW0sWGM9X20sc249LTEpLG9uPTAsdmU9MCxEPXllLHRuPWcsaHQ9ZnQsVnQ9MCxYdD0tMSxFbj0xPDxmdCxkbj1Fbi0xLHQ9PT1fdSYmRW4+R2Z8fHQ9PT1KZiYmRW4+WWYpcmV0dXJuIDE7Zm9yKDs7KXtrcD1ELVZ0LGJbdmVdPHNuPyhRYz0wLGV1PWJbdmVdKTpiW3ZlXT5zbj8oUWM9WGNbTnArYlt2ZV1dLGV1PVRuW3ZyK2JbdmVdXSk6KFFjPTMyKzY0LGV1PTApLGFuPTE8PEQtVnQsU3Q9MTw8aHQseWU9U3Q7ZG8gU3QtPWFuLGNbdG4rKG9uPj5WdCkrU3RdPWtwPDwyNHxRYzw8MTZ8ZXV8MDt3aGlsZShTdCE9PTApO2Zvcihhbj0xPDxELTE7b24mYW47KWFuPj49MTtpZihhbiE9PTA/KG9uJj1hbi0xLG9uKz1hbik6b249MCx2ZSsrLC0tQWFbRF09PT0wKXtpZihEPT09T2UpYnJlYWs7RD1uW3IrYlt2ZV1dfWlmKEQ+ZnQmJihvbiZkbikhPT1YdCl7Zm9yKFZ0PT09MCYmKFZ0PWZ0KSx0bis9eWUsaHQ9RC1WdCx3dD0xPDxodDtodCtWdDxPZSYmKHd0LT1BYVtodCtWdF0sISh3dDw9MCkpOylodCsrLHd0PDw9MTtpZihFbis9MTw8aHQsdD09PV91JiZFbj5HZnx8dD09PUpmJiZFbj5ZZilyZXR1cm4gMTtYdD1vbiZkbixjW1h0XT1mdDw8MjR8aHQ8PDE2fHRuLWd8MH19cmV0dXJuIG9uIT09MCYmKGNbdG4rb25dPUQtVnQ8PDI0fDY0PDwxNnwwKSxWLmJpdHM9ZnQsMH0sR289TmUsYnU9emUseGE9cWUsRW09Z20sWWw9Ym0seW09MCxLZj0xLFpmPTIsWGY9NCxTbT01LHljPTYsSnM9MCx3bT0xLENtPTIsdWE9LTIsUWY9LTMsZWQ9LTQsQW09LTUsdGQ9OCxuZD0xLHJkPTIsaWQ9MyxvZD00LGFkPTUsc2Q9NixsZD03LGNkPTgsdWQ9OSxmZD0xMCxTYz0xMSxucz0xMixFdT0xMyxkZD0xNCx5dT0xNSxoZD0xNixnZD0xNyxwZD0xOCx2ZD0xOSx3Yz0yMCxDYz0yMSxtZD0yMixfZD0yMyxiZD0yNCxFZD0yNSx5ZD0yNixTdT0yNyxTZD0yOCx3ZD0yOSxPcj0zMCxDZD0zMSxPbT0zMixUbT04NTIsUG09NTkyLEltPTE1LE5tPUltO2Z1bmN0aW9uIEFkKGUpe3JldHVybihlPj4+MjQmMjU1KSsoZT4+PjgmNjUyODApKygoZSY2NTI4MCk8PDgpKygoZSYyNTUpPDwyNCl9ZnVuY3Rpb24ga20oKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IEdvLkJ1ZjE2KDMyMCksdGhpcy53b3JrPW5ldyBHby5CdWYxNigyODgpLHRoaXMubGVuZHluPW51bGwsdGhpcy5kaXN0ZHluPW51bGwsdGhpcy5zYW5lPTAsdGhpcy5iYWNrPTAsdGhpcy53YXM9MH1mdW5jdGlvbiBPZChlKXt2YXIgdDtyZXR1cm4hZXx8IWUuc3RhdGU/dWE6KHQ9ZS5zdGF0ZSxlLnRvdGFsX2luPWUudG90YWxfb3V0PXQudG90YWw9MCxlLm1zZz0iIix0LndyYXAmJihlLmFkbGVyPXQud3JhcCYxKSx0Lm1vZGU9bmQsdC5sYXN0PTAsdC5oYXZlZGljdD0wLHQuZG1heD0zMjc2OCx0LmhlYWQ9bnVsbCx0LmhvbGQ9MCx0LmJpdHM9MCx0LmxlbmNvZGU9dC5sZW5keW49bmV3IEdvLkJ1ZjMyKFRtKSx0LmRpc3Rjb2RlPXQuZGlzdGR5bj1uZXcgR28uQnVmMzIoUG0pLHQuc2FuZT0xLHQuYmFjaz0tMSxKcyl9ZnVuY3Rpb24gVGQoZSl7dmFyIHQ7cmV0dXJuIWV8fCFlLnN0YXRlP3VhOih0PWUuc3RhdGUsdC53c2l6ZT0wLHQud2hhdmU9MCx0LnduZXh0PTAsT2QoZSkpfWZ1bmN0aW9uIFBkKGUsdCl7dmFyIG4scjtyZXR1cm4hZXx8IWUuc3RhdGV8fChyPWUuc3RhdGUsdDwwPyhuPTAsdD0tdCk6KG49KHQ+PjQpKzEsdDw0OCYmKHQmPTE1KSksdCYmKHQ8OHx8dD4xNSkpP3VhOihyLndpbmRvdyE9PW51bGwmJnIud2JpdHMhPT10JiYoci53aW5kb3c9bnVsbCksci53cmFwPW4sci53Yml0cz10LFRkKGUpKX1mdW5jdGlvbiBJZChlLHQpe3ZhciBuLHI7cmV0dXJuIGU/KHI9bmV3IGttLGUuc3RhdGU9cixyLndpbmRvdz1udWxsLG49UGQoZSx0KSxuIT09SnMmJihlLnN0YXRlPW51bGwpLG4pOnVhfWZ1bmN0aW9uIFJtKGUpe3JldHVybiBJZChlLE5tKX12YXIgTmQ9ITAsd3UsQ3U7ZnVuY3Rpb24geG0oZSl7aWYoTmQpe3ZhciB0O2Zvcih3dT1uZXcgR28uQnVmMzIoNTEyKSxDdT1uZXcgR28uQnVmMzIoMzIpLHQ9MDt0PDE0NDspZS5sZW5zW3QrK109ODtmb3IoO3Q8MjU2OyllLmxlbnNbdCsrXT05O2Zvcig7dDwyODA7KWUubGVuc1t0KytdPTc7Zm9yKDt0PDI4ODspZS5sZW5zW3QrK109ODtmb3IoWWwoS2YsZS5sZW5zLDAsMjg4LHd1LDAsZS53b3JrLHtiaXRzOjl9KSx0PTA7dDwzMjspZS5sZW5zW3QrK109NTtZbChaZixlLmxlbnMsMCwzMixDdSwwLGUud29yayx7Yml0czo1fSksTmQ9ITF9ZS5sZW5jb2RlPXd1LGUubGVuYml0cz05LGUuZGlzdGNvZGU9Q3UsZS5kaXN0Yml0cz01fWZ1bmN0aW9uIGtkKGUsdCxuLHIpe3ZhciBvLGM9ZS5zdGF0ZTtyZXR1cm4gYy53aW5kb3c9PT1udWxsJiYoYy53c2l6ZT0xPDxjLndiaXRzLGMud25leHQ9MCxjLndoYXZlPTAsYy53aW5kb3c9bmV3IEdvLkJ1ZjgoYy53c2l6ZSkpLHI+PWMud3NpemU/KEdvLmFycmF5U2V0KGMud2luZG93LHQsbi1jLndzaXplLGMud3NpemUsMCksYy53bmV4dD0wLGMud2hhdmU9Yy53c2l6ZSk6KG89Yy53c2l6ZS1jLnduZXh0LG8+ciYmKG89ciksR28uYXJyYXlTZXQoYy53aW5kb3csdCxuLXIsbyxjLnduZXh0KSxyLT1vLHI/KEdvLmFycmF5U2V0KGMud2luZG93LHQsbi1yLHIsMCksYy53bmV4dD1yLGMud2hhdmU9Yy53c2l6ZSk6KGMud25leHQrPW8sYy53bmV4dD09PWMud3NpemUmJihjLnduZXh0PTApLGMud2hhdmU8Yy53c2l6ZSYmKGMud2hhdmUrPW8pKSksMH1mdW5jdGlvbiBCbShlLHQpe3ZhciBuLHIsbyxjLGcsYixWLFQsRCx2ZSx5ZSxPZSxmdCxodCxWdD0wLHd0LEVuLG9uLGFuLFN0LFh0LGRuLHRuLFRuPW5ldyBHby5CdWY4KDQpLHZyLHNuLEFhPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTtpZighZXx8IWUuc3RhdGV8fCFlLm91dHB1dHx8IWUuaW5wdXQmJmUuYXZhaWxfaW4hPT0wKXJldHVybiB1YTtuPWUuc3RhdGUsbi5tb2RlPT09bnMmJihuLm1vZGU9RXUpLGc9ZS5uZXh0X291dCxvPWUub3V0cHV0LFY9ZS5hdmFpbF9vdXQsYz1lLm5leHRfaW4scj1lLmlucHV0LGI9ZS5hdmFpbF9pbixUPW4uaG9sZCxEPW4uYml0cyx2ZT1iLHllPVYsdG49SnM7ZTpmb3IoOzspc3dpdGNoKG4ubW9kZSl7Y2FzZSBuZDppZihuLndyYXA9PT0wKXtuLm1vZGU9RXU7YnJlYWt9Zm9yKDtEPDE2Oyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxELEQrPTh9aWYobi53cmFwJjImJlQ9PT0zNTYxNSl7bi5jaGVjaz0wLFRuWzBdPVQmMjU1LFRuWzFdPVQ+Pj44JjI1NSxuLmNoZWNrPXhhKG4uY2hlY2ssVG4sMiwwKSxUPTAsRD0wLG4ubW9kZT1yZDticmVha31pZihuLmZsYWdzPTAsbi5oZWFkJiYobi5oZWFkLmRvbmU9ITEpLCEobi53cmFwJjEpfHwoKChUJjI1NSk8PDgpKyhUPj44KSklMzEpe2UubXNnPSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIixuLm1vZGU9T3I7YnJlYWt9aWYoKFQmMTUpIT09dGQpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPU9yO2JyZWFrfWlmKFQ+Pj49NCxELT00LGRuPShUJjE1KSs4LG4ud2JpdHM9PT0wKW4ud2JpdHM9ZG47ZWxzZSBpZihkbj5uLndiaXRzKXtlLm1zZz0iaW52YWxpZCB3aW5kb3cgc2l6ZSIsbi5tb2RlPU9yO2JyZWFrfW4uZG1heD0xPDxkbixlLmFkbGVyPW4uY2hlY2s9MSxuLm1vZGU9VCY1MTI/ZmQ6bnMsVD0wLEQ9MDticmVhaztjYXNlIHJkOmZvcig7RDwxNjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8RCxEKz04fWlmKG4uZmxhZ3M9VCwobi5mbGFncyYyNTUpIT09dGQpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPU9yO2JyZWFrfWlmKG4uZmxhZ3MmNTczNDQpe2UubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLG4ubW9kZT1PcjticmVha31uLmhlYWQmJihuLmhlYWQudGV4dD1UPj44JjEpLG4uZmxhZ3MmNTEyJiYoVG5bMF09VCYyNTUsVG5bMV09VD4+PjgmMjU1LG4uY2hlY2s9eGEobi5jaGVjayxUbiwyLDApKSxUPTAsRD0wLG4ubW9kZT1pZDtjYXNlIGlkOmZvcig7RDwzMjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8RCxEKz04fW4uaGVhZCYmKG4uaGVhZC50aW1lPVQpLG4uZmxhZ3MmNTEyJiYoVG5bMF09VCYyNTUsVG5bMV09VD4+PjgmMjU1LFRuWzJdPVQ+Pj4xNiYyNTUsVG5bM109VD4+PjI0JjI1NSxuLmNoZWNrPXhhKG4uY2hlY2ssVG4sNCwwKSksVD0wLEQ9MCxuLm1vZGU9b2Q7Y2FzZSBvZDpmb3IoO0Q8MTY7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEQsRCs9OH1uLmhlYWQmJihuLmhlYWQueGZsYWdzPVQmMjU1LG4uaGVhZC5vcz1UPj44KSxuLmZsYWdzJjUxMiYmKFRuWzBdPVQmMjU1LFRuWzFdPVQ+Pj44JjI1NSxuLmNoZWNrPXhhKG4uY2hlY2ssVG4sMiwwKSksVD0wLEQ9MCxuLm1vZGU9YWQ7Y2FzZSBhZDppZihuLmZsYWdzJjEwMjQpe2Zvcig7RDwxNjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8RCxEKz04fW4ubGVuZ3RoPVQsbi5oZWFkJiYobi5oZWFkLmV4dHJhX2xlbj1UKSxuLmZsYWdzJjUxMiYmKFRuWzBdPVQmMjU1LFRuWzFdPVQ+Pj44JjI1NSxuLmNoZWNrPXhhKG4uY2hlY2ssVG4sMiwwKSksVD0wLEQ9MH1lbHNlIG4uaGVhZCYmKG4uaGVhZC5leHRyYT1udWxsKTtuLm1vZGU9c2Q7Y2FzZSBzZDppZihuLmZsYWdzJjEwMjQmJihPZT1uLmxlbmd0aCxPZT5iJiYoT2U9YiksT2UmJihuLmhlYWQmJihkbj1uLmhlYWQuZXh0cmFfbGVuLW4ubGVuZ3RoLG4uaGVhZC5leHRyYXx8KG4uaGVhZC5leHRyYT1uZXcgQXJyYXkobi5oZWFkLmV4dHJhX2xlbikpLEdvLmFycmF5U2V0KG4uaGVhZC5leHRyYSxyLGMsT2UsZG4pKSxuLmZsYWdzJjUxMiYmKG4uY2hlY2s9eGEobi5jaGVjayxyLE9lLGMpKSxiLT1PZSxjKz1PZSxuLmxlbmd0aC09T2UpLG4ubGVuZ3RoKSlicmVhayBlO24ubGVuZ3RoPTAsbi5tb2RlPWxkO2Nhc2UgbGQ6aWYobi5mbGFncyYyMDQ4KXtpZihiPT09MClicmVhayBlO09lPTA7ZG8gZG49cltjK09lKytdLG4uaGVhZCYmZG4mJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLm5hbWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoZG4pKTt3aGlsZShkbiYmT2U8Yik7aWYobi5mbGFncyY1MTImJihuLmNoZWNrPXhhKG4uY2hlY2sscixPZSxjKSksYi09T2UsYys9T2UsZG4pYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5uYW1lPW51bGwpO24ubGVuZ3RoPTAsbi5tb2RlPWNkO2Nhc2UgY2Q6aWYobi5mbGFncyY0MDk2KXtpZihiPT09MClicmVhayBlO09lPTA7ZG8gZG49cltjK09lKytdLG4uaGVhZCYmZG4mJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUoZG4pKTt3aGlsZShkbiYmT2U8Yik7aWYobi5mbGFncyY1MTImJihuLmNoZWNrPXhhKG4uY2hlY2sscixPZSxjKSksYi09T2UsYys9T2UsZG4pYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5jb21tZW50PW51bGwpO24ubW9kZT11ZDtjYXNlIHVkOmlmKG4uZmxhZ3MmNTEyKXtmb3IoO0Q8MTY7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEQsRCs9OH1pZihUIT09KG4uY2hlY2smNjU1MzUpKXtlLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsbi5tb2RlPU9yO2JyZWFrfVQ9MCxEPTB9bi5oZWFkJiYobi5oZWFkLmhjcmM9bi5mbGFncz4+OSYxLG4uaGVhZC5kb25lPSEwKSxlLmFkbGVyPW4uY2hlY2s9MCxuLm1vZGU9bnM7YnJlYWs7Y2FzZSBmZDpmb3IoO0Q8MzI7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEQsRCs9OH1lLmFkbGVyPW4uY2hlY2s9QWQoVCksVD0wLEQ9MCxuLm1vZGU9U2M7Y2FzZSBTYzppZihuLmhhdmVkaWN0PT09MClyZXR1cm4gZS5uZXh0X291dD1nLGUuYXZhaWxfb3V0PVYsZS5uZXh0X2luPWMsZS5hdmFpbF9pbj1iLG4uaG9sZD1ULG4uYml0cz1ELENtO2UuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT1ucztjYXNlIG5zOmlmKHQ9PT1TbXx8dD09PXljKWJyZWFrIGU7Y2FzZSBFdTppZihuLmxhc3Qpe1Q+Pj49RCY3LEQtPUQmNyxuLm1vZGU9U3U7YnJlYWt9Zm9yKDtEPDM7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEQsRCs9OH1zd2l0Y2gobi5sYXN0PVQmMSxUPj4+PTEsRC09MSxUJjMpe2Nhc2UgMDpuLm1vZGU9ZGQ7YnJlYWs7Y2FzZSAxOmlmKHhtKG4pLG4ubW9kZT13Yyx0PT09eWMpe1Q+Pj49MixELT0yO2JyZWFrIGV9YnJlYWs7Y2FzZSAyOm4ubW9kZT1nZDticmVhaztjYXNlIDM6ZS5tc2c9ImludmFsaWQgYmxvY2sgdHlwZSIsbi5tb2RlPU9yfVQ+Pj49MixELT0yO2JyZWFrO2Nhc2UgZGQ6Zm9yKFQ+Pj49RCY3LEQtPUQmNztEPDMyOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxELEQrPTh9aWYoKFQmNjU1MzUpIT09KFQ+Pj4xNl42NTUzNSkpe2UubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIixuLm1vZGU9T3I7YnJlYWt9aWYobi5sZW5ndGg9VCY2NTUzNSxUPTAsRD0wLG4ubW9kZT15dSx0PT09eWMpYnJlYWsgZTtjYXNlIHl1Om4ubW9kZT1oZDtjYXNlIGhkOmlmKE9lPW4ubGVuZ3RoLE9lKXtpZihPZT5iJiYoT2U9YiksT2U+ViYmKE9lPVYpLE9lPT09MClicmVhayBlO0dvLmFycmF5U2V0KG8scixjLE9lLGcpLGItPU9lLGMrPU9lLFYtPU9lLGcrPU9lLG4ubGVuZ3RoLT1PZTticmVha31uLm1vZGU9bnM7YnJlYWs7Y2FzZSBnZDpmb3IoO0Q8MTQ7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEQsRCs9OH1pZihuLm5sZW49KFQmMzEpKzI1NyxUPj4+PTUsRC09NSxuLm5kaXN0PShUJjMxKSsxLFQ+Pj49NSxELT01LG4ubmNvZGU9KFQmMTUpKzQsVD4+Pj00LEQtPTQsbi5ubGVuPjI4Nnx8bi5uZGlzdD4zMCl7ZS5tc2c9InRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIixuLm1vZGU9T3I7YnJlYWt9bi5oYXZlPTAsbi5tb2RlPXBkO2Nhc2UgcGQ6Zm9yKDtuLmhhdmU8bi5uY29kZTspe2Zvcig7RDwzOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxELEQrPTh9bi5sZW5zW0FhW24uaGF2ZSsrXV09VCY3LFQ+Pj49MyxELT0zfWZvcig7bi5oYXZlPDE5OyluLmxlbnNbQWFbbi5oYXZlKytdXT0wO2lmKG4ubGVuY29kZT1uLmxlbmR5bixuLmxlbmJpdHM9Nyx2cj17Yml0czpuLmxlbmJpdHN9LHRuPVlsKHltLG4ubGVucywwLDE5LG4ubGVuY29kZSwwLG4ud29yayx2ciksbi5sZW5iaXRzPXZyLmJpdHMsdG4pe2UubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLG4ubW9kZT1PcjticmVha31uLmhhdmU9MCxuLm1vZGU9dmQ7Y2FzZSB2ZDpmb3IoO24uaGF2ZTxuLm5sZW4rbi5uZGlzdDspe2Zvcig7VnQ9bi5sZW5jb2RlW1QmKDE8PG4ubGVuYml0cyktMV0sd3Q9VnQ+Pj4yNCxFbj1WdD4+PjE2JjI1NSxvbj1WdCY2NTUzNSwhKHd0PD1EKTspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8RCxEKz04fWlmKG9uPDE2KVQ+Pj49d3QsRC09d3Qsbi5sZW5zW24uaGF2ZSsrXT1vbjtlbHNle2lmKG9uPT09MTYpe2Zvcihzbj13dCsyO0Q8c247KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEQsRCs9OH1pZihUPj4+PXd0LEQtPXd0LG4uaGF2ZT09PTApe2UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixuLm1vZGU9T3I7YnJlYWt9ZG49bi5sZW5zW24uaGF2ZS0xXSxPZT0zKyhUJjMpLFQ+Pj49MixELT0yfWVsc2UgaWYob249PT0xNyl7Zm9yKHNuPXd0KzM7RDxzbjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8RCxEKz04fVQ+Pj49d3QsRC09d3QsZG49MCxPZT0zKyhUJjcpLFQ+Pj49MyxELT0zfWVsc2V7Zm9yKHNuPXd0Kzc7RDxzbjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8RCxEKz04fVQ+Pj49d3QsRC09d3QsZG49MCxPZT0xMSsoVCYxMjcpLFQ+Pj49NyxELT03fWlmKG4uaGF2ZStPZT5uLm5sZW4rbi5uZGlzdCl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT1PcjticmVha31mb3IoO09lLS07KW4ubGVuc1tuLmhhdmUrK109ZG59fWlmKG4ubW9kZT09PU9yKWJyZWFrO2lmKG4ubGVuc1syNTZdPT09MCl7ZS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsbi5tb2RlPU9yO2JyZWFrfWlmKG4ubGVuYml0cz05LHZyPXtiaXRzOm4ubGVuYml0c30sdG49WWwoS2Ysbi5sZW5zLDAsbi5ubGVuLG4ubGVuY29kZSwwLG4ud29yayx2ciksbi5sZW5iaXRzPXZyLmJpdHMsdG4pe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiLG4ubW9kZT1PcjticmVha31pZihuLmRpc3RiaXRzPTYsbi5kaXN0Y29kZT1uLmRpc3RkeW4sdnI9e2JpdHM6bi5kaXN0Yml0c30sdG49WWwoWmYsbi5sZW5zLG4ubmxlbixuLm5kaXN0LG4uZGlzdGNvZGUsMCxuLndvcmssdnIpLG4uZGlzdGJpdHM9dnIuYml0cyx0bil7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2VzIHNldCIsbi5tb2RlPU9yO2JyZWFrfWlmKG4ubW9kZT13Yyx0PT09eWMpYnJlYWsgZTtjYXNlIHdjOm4ubW9kZT1DYztjYXNlIENjOmlmKGI+PTYmJlY+PTI1OCl7ZS5uZXh0X291dD1nLGUuYXZhaWxfb3V0PVYsZS5uZXh0X2luPWMsZS5hdmFpbF9pbj1iLG4uaG9sZD1ULG4uYml0cz1ELEVtKGUseWUpLGc9ZS5uZXh0X291dCxvPWUub3V0cHV0LFY9ZS5hdmFpbF9vdXQsYz1lLm5leHRfaW4scj1lLmlucHV0LGI9ZS5hdmFpbF9pbixUPW4uaG9sZCxEPW4uYml0cyxuLm1vZGU9PT1ucyYmKG4uYmFjaz0tMSk7YnJlYWt9Zm9yKG4uYmFjaz0wO1Z0PW4ubGVuY29kZVtUJigxPDxuLmxlbmJpdHMpLTFdLHd0PVZ0Pj4+MjQsRW49VnQ+Pj4xNiYyNTUsb249VnQmNjU1MzUsISh3dDw9RCk7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEQsRCs9OH1pZihFbiYmKEVuJjI0MCk9PT0wKXtmb3IoYW49d3QsU3Q9RW4sWHQ9b247VnQ9bi5sZW5jb2RlW1h0KygoVCYoMTw8YW4rU3QpLTEpPj5hbildLHd0PVZ0Pj4+MjQsRW49VnQ+Pj4xNiYyNTUsb249VnQmNjU1MzUsIShhbit3dDw9RCk7KXtpZihiPT09MClicmVhayBlO2ItLSxUKz1yW2MrK108PEQsRCs9OH1UPj4+PWFuLEQtPWFuLG4uYmFjays9YW59aWYoVD4+Pj13dCxELT13dCxuLmJhY2srPXd0LG4ubGVuZ3RoPW9uLEVuPT09MCl7bi5tb2RlPXlkO2JyZWFrfWlmKEVuJjMyKXtuLmJhY2s9LTEsbi5tb2RlPW5zO2JyZWFrfWlmKEVuJjY0KXtlLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixuLm1vZGU9T3I7YnJlYWt9bi5leHRyYT1FbiYxNSxuLm1vZGU9bWQ7Y2FzZSBtZDppZihuLmV4dHJhKXtmb3Ioc249bi5leHRyYTtEPHNuOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxELEQrPTh9bi5sZW5ndGgrPVQmKDE8PG4uZXh0cmEpLTEsVD4+Pj1uLmV4dHJhLEQtPW4uZXh0cmEsbi5iYWNrKz1uLmV4dHJhfW4ud2FzPW4ubGVuZ3RoLG4ubW9kZT1fZDtjYXNlIF9kOmZvcig7VnQ9bi5kaXN0Y29kZVtUJigxPDxuLmRpc3RiaXRzKS0xXSx3dD1WdD4+PjI0LEVuPVZ0Pj4+MTYmMjU1LG9uPVZ0JjY1NTM1LCEod3Q8PUQpOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxELEQrPTh9aWYoKEVuJjI0MCk9PT0wKXtmb3IoYW49d3QsU3Q9RW4sWHQ9b247VnQ9bi5kaXN0Y29kZVtYdCsoKFQmKDE8PGFuK1N0KS0xKT4+YW4pXSx3dD1WdD4+PjI0LEVuPVZ0Pj4+MTYmMjU1LG9uPVZ0JjY1NTM1LCEoYW4rd3Q8PUQpOyl7aWYoYj09PTApYnJlYWsgZTtiLS0sVCs9cltjKytdPDxELEQrPTh9VD4+Pj1hbixELT1hbixuLmJhY2srPWFufWlmKFQ+Pj49d3QsRC09d3Qsbi5iYWNrKz13dCxFbiY2NCl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgY29kZSIsbi5tb2RlPU9yO2JyZWFrfW4ub2Zmc2V0PW9uLG4uZXh0cmE9RW4mMTUsbi5tb2RlPWJkO2Nhc2UgYmQ6aWYobi5leHRyYSl7Zm9yKHNuPW4uZXh0cmE7RDxzbjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8RCxEKz04fW4ub2Zmc2V0Kz1UJigxPDxuLmV4dHJhKS0xLFQ+Pj49bi5leHRyYSxELT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1pZihuLm9mZnNldD5uLmRtYXgpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPU9yO2JyZWFrfW4ubW9kZT1FZDtjYXNlIEVkOmlmKFY9PT0wKWJyZWFrIGU7aWYoT2U9eWUtVixuLm9mZnNldD5PZSl7aWYoT2U9bi5vZmZzZXQtT2UsT2U+bi53aGF2ZSYmbi5zYW5lKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT1PcjticmVha31PZT5uLnduZXh0PyhPZS09bi53bmV4dCxmdD1uLndzaXplLU9lKTpmdD1uLnduZXh0LU9lLE9lPm4ubGVuZ3RoJiYoT2U9bi5sZW5ndGgpLGh0PW4ud2luZG93fWVsc2UgaHQ9byxmdD1nLW4ub2Zmc2V0LE9lPW4ubGVuZ3RoO09lPlYmJihPZT1WKSxWLT1PZSxuLmxlbmd0aC09T2U7ZG8gb1tnKytdPWh0W2Z0KytdO3doaWxlKC0tT2UpO24ubGVuZ3RoPT09MCYmKG4ubW9kZT1DYyk7YnJlYWs7Y2FzZSB5ZDppZihWPT09MClicmVhayBlO29bZysrXT1uLmxlbmd0aCxWLS0sbi5tb2RlPUNjO2JyZWFrO2Nhc2UgU3U6aWYobi53cmFwKXtmb3IoO0Q8MzI7KXtpZihiPT09MClicmVhayBlO2ItLSxUfD1yW2MrK108PEQsRCs9OH1pZih5ZS09VixlLnRvdGFsX291dCs9eWUsbi50b3RhbCs9eWUseWUmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz94YShuLmNoZWNrLG8seWUsZy15ZSk6YnUobi5jaGVjayxvLHllLGcteWUpKSx5ZT1WLChuLmZsYWdzP1Q6QWQoVCkpIT09bi5jaGVjayl7ZS5tc2c9ImluY29ycmVjdCBkYXRhIGNoZWNrIixuLm1vZGU9T3I7YnJlYWt9VD0wLEQ9MH1uLm1vZGU9U2Q7Y2FzZSBTZDppZihuLndyYXAmJm4uZmxhZ3Mpe2Zvcig7RDwzMjspe2lmKGI9PT0wKWJyZWFrIGU7Yi0tLFQrPXJbYysrXTw8RCxEKz04fWlmKFQhPT0obi50b3RhbCY0Mjk0OTY3Mjk1KSl7ZS5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLG4ubW9kZT1PcjticmVha31UPTAsRD0wfW4ubW9kZT13ZDtjYXNlIHdkOnRuPXdtO2JyZWFrIGU7Y2FzZSBPcjp0bj1RZjticmVhayBlO2Nhc2UgQ2Q6cmV0dXJuIGVkO2Nhc2UgT206ZGVmYXVsdDpyZXR1cm4gdWF9cmV0dXJuIGUubmV4dF9vdXQ9ZyxlLmF2YWlsX291dD1WLGUubmV4dF9pbj1jLGUuYXZhaWxfaW49YixuLmhvbGQ9VCxuLmJpdHM9RCwobi53c2l6ZXx8eWUhPT1lLmF2YWlsX291dCYmbi5tb2RlPE9yJiYobi5tb2RlPFN1fHx0IT09WGYpKSYma2QoZSxlLm91dHB1dCxlLm5leHRfb3V0LHllLWUuYXZhaWxfb3V0KSx2ZS09ZS5hdmFpbF9pbix5ZS09ZS5hdmFpbF9vdXQsZS50b3RhbF9pbis9dmUsZS50b3RhbF9vdXQrPXllLG4udG90YWwrPXllLG4ud3JhcCYmeWUmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz94YShuLmNoZWNrLG8seWUsZS5uZXh0X291dC15ZSk6YnUobi5jaGVjayxvLHllLGUubmV4dF9vdXQteWUpKSxlLmRhdGFfdHlwZT1uLmJpdHMrKG4ubGFzdD82NDowKSsobi5tb2RlPT09bnM/MTI4OjApKyhuLm1vZGU9PT13Y3x8bi5tb2RlPT09eXU/MjU2OjApLCh2ZT09PTAmJnllPT09MHx8dD09PVhmKSYmdG49PT1KcyYmKHRuPUFtKSx0bn1mdW5jdGlvbiBNbShlKXtpZighZXx8IWUuc3RhdGUpcmV0dXJuIHVhO3ZhciB0PWUuc3RhdGU7cmV0dXJuIHQud2luZG93JiYodC53aW5kb3c9bnVsbCksZS5zdGF0ZT1udWxsLEpzfWZ1bmN0aW9uIExtKGUsdCl7dmFyIG47cmV0dXJuIWV8fCFlLnN0YXRlfHwobj1lLnN0YXRlLChuLndyYXAmMik9PT0wKT91YToobi5oZWFkPXQsdC5kb25lPSExLEpzKX1mdW5jdGlvbiBEbShlLHQpe3ZhciBuPXQubGVuZ3RoLHIsbyxjO3JldHVybiFlfHwhZS5zdGF0ZXx8KHI9ZS5zdGF0ZSxyLndyYXAhPT0wJiZyLm1vZGUhPT1TYyk/dWE6ci5tb2RlPT09U2MmJihvPTEsbz1idShvLHQsbiwwKSxvIT09ci5jaGVjayk/UWY6KGM9a2QoZSx0LG4sbiksYz8oci5tb2RlPUNkLGVkKTooci5oYXZlZGljdD0xLEpzKSl9YmEuaW5mbGF0ZVJlc2V0PVRkLGJhLmluZmxhdGVSZXNldDI9UGQsYmEuaW5mbGF0ZVJlc2V0S2VlcD1PZCxiYS5pbmZsYXRlSW5pdD1SbSxiYS5pbmZsYXRlSW5pdDI9SWQsYmEuaW5mbGF0ZT1CbSxiYS5pbmZsYXRlRW5kPU1tLGJhLmluZmxhdGVHZXRIZWFkZXI9TG0sYmEuaW5mbGF0ZVNldERpY3Rpb25hcnk9RG0sYmEuaW5mbGF0ZUluZm89InBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkiO3ZhciBSZD17Wl9OT19GTFVTSDowLFpfUEFSVElBTF9GTFVTSDoxLFpfU1lOQ19GTFVTSDoyLFpfRlVMTF9GTFVTSDozLFpfRklOSVNIOjQsWl9CTE9DSzo1LFpfVFJFRVM6NixaX09LOjAsWl9TVFJFQU1fRU5EOjEsWl9ORUVEX0RJQ1Q6MixaX0VSUk5POi0xLFpfU1RSRUFNX0VSUk9SOi0yLFpfREFUQV9FUlJPUjotMyxaX0JVRl9FUlJPUjotNSxaX05PX0NPTVBSRVNTSU9OOjAsWl9CRVNUX1NQRUVEOjEsWl9CRVNUX0NPTVBSRVNTSU9OOjksWl9ERUZBVUxUX0NPTVBSRVNTSU9OOi0xLFpfRklMVEVSRUQ6MSxaX0hVRkZNQU5fT05MWToyLFpfUkxFOjMsWl9GSVhFRDo0LFpfREVGQVVMVF9TVFJBVEVHWTowLFpfQklOQVJZOjAsWl9URVhUOjEsWl9VTktOT1dOOjIsWl9ERUZMQVRFRDo4fTtmdW5jdGlvbiBGbSgpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfXZhciBWbT1GbSx3bD1iYSxxbD1OZSxBYz1pcixacj1SZCxBdT1fdCxVbT1sYSwkbT1WbSx4ZD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEtzKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEtzKSlyZXR1cm4gbmV3IEtzKGUpO3RoaXMub3B0aW9ucz1xbC5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJnQud2luZG93Qml0cz49MCYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHMsdC53aW5kb3dCaXRzPT09MCYmKHQud2luZG93Qml0cz0tMTUpKSx0LndpbmRvd0JpdHM+PTAmJnQud2luZG93Qml0czwxNiYmIShlJiZlLndpbmRvd0JpdHMpJiYodC53aW5kb3dCaXRzKz0zMiksdC53aW5kb3dCaXRzPjE1JiZ0LndpbmRvd0JpdHM8NDgmJih0LndpbmRvd0JpdHMmMTUpPT09MCYmKHQud2luZG93Qml0c3w9MTUpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IFVtLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbj13bC5pbmZsYXRlSW5pdDIodGhpcy5zdHJtLHQud2luZG93Qml0cyk7aWYobiE9PVpyLlpfT0spdGhyb3cgbmV3IEVycm9yKEF1W25dKTtpZih0aGlzLmhlYWRlcj1uZXcgJG0sd2wuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sdGhpcy5oZWFkZXIpLHQuZGljdGlvbmFyeSYmKHR5cGVvZiB0LmRpY3Rpb25hcnk9PSJzdHJpbmciP3QuZGljdGlvbmFyeT1BYy5zdHJpbmcyYnVmKHQuZGljdGlvbmFyeSk6eGQuY2FsbCh0LmRpY3Rpb25hcnkpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIiYmKHQuZGljdGlvbmFyeT1uZXcgVWludDhBcnJheSh0LmRpY3Rpb25hcnkpKSx0LnJhdyYmKG49d2wuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHQuZGljdGlvbmFyeSksbiE9PVpyLlpfT0spKSl0aHJvdyBuZXcgRXJyb3IoQXVbbl0pfUtzLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zdHJtLHI9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSxvPXRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5LGMsZyxiLFYsVCxEPSExO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7Zz10PT09fn50P3Q6dD09PSEwP1pyLlpfRklOSVNIOlpyLlpfTk9fRkxVU0gsdHlwZW9mIGU9PSJzdHJpbmciP24uaW5wdXQ9QWMuYmluc3RyaW5nMmJ1ZihlKTp4ZC5jYWxsKGUpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9uLmlucHV0PW5ldyBVaW50OEFycmF5KGUpOm4uaW5wdXQ9ZSxuLm5leHRfaW49MCxuLmF2YWlsX2luPW4uaW5wdXQubGVuZ3RoO2Rve2lmKG4uYXZhaWxfb3V0PT09MCYmKG4ub3V0cHV0PW5ldyBxbC5CdWY4KHIpLG4ubmV4dF9vdXQ9MCxuLmF2YWlsX291dD1yKSxjPXdsLmluZmxhdGUobixaci5aX05PX0ZMVVNIKSxjPT09WnIuWl9ORUVEX0RJQ1QmJm8mJihjPXdsLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSxvKSksYz09PVpyLlpfQlVGX0VSUk9SJiZEPT09ITAmJihjPVpyLlpfT0ssRD0hMSksYyE9PVpyLlpfU1RSRUFNX0VORCYmYyE9PVpyLlpfT0spcmV0dXJuIHRoaXMub25FbmQoYyksdGhpcy5lbmRlZD0hMCwhMTtuLm5leHRfb3V0JiYobi5hdmFpbF9vdXQ9PT0wfHxjPT09WnIuWl9TVFJFQU1fRU5EfHxuLmF2YWlsX2luPT09MCYmKGc9PT1aci5aX0ZJTklTSHx8Zz09PVpyLlpfU1lOQ19GTFVTSCkpJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/KGI9QWMudXRmOGJvcmRlcihuLm91dHB1dCxuLm5leHRfb3V0KSxWPW4ubmV4dF9vdXQtYixUPUFjLmJ1ZjJzdHJpbmcobi5vdXRwdXQsYiksbi5uZXh0X291dD1WLG4uYXZhaWxfb3V0PXItVixWJiZxbC5hcnJheVNldChuLm91dHB1dCxuLm91dHB1dCxiLFYsMCksdGhpcy5vbkRhdGEoVCkpOnRoaXMub25EYXRhKHFsLnNocmlua0J1ZihuLm91dHB1dCxuLm5leHRfb3V0KSkpLG4uYXZhaWxfaW49PT0wJiZuLmF2YWlsX291dD09PTAmJihEPSEwKX13aGlsZSgobi5hdmFpbF9pbj4wfHxuLmF2YWlsX291dD09PTApJiZjIT09WnIuWl9TVFJFQU1fRU5EKTtyZXR1cm4gYz09PVpyLlpfU1RSRUFNX0VORCYmKGc9WnIuWl9GSU5JU0gpLGc9PT1aci5aX0ZJTklTSD8oYz13bC5pbmZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChjKSx0aGlzLmVuZGVkPSEwLGM9PT1aci5aX09LKTooZz09PVpyLlpfU1lOQ19GTFVTSCYmKHRoaXMub25FbmQoWnIuWl9PSyksbi5hdmFpbF9vdXQ9MCksITApfSxLcy5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGUpe3RoaXMuY2h1bmtzLnB1c2goZSl9LEtzLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbihlKXtlPT09WnIuWl9PSyYmKHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PXFsLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj1lLHRoaXMubXNnPXRoaXMuc3RybS5tc2d9O2Z1bmN0aW9uIE91KGUsdCl7dmFyIG49bmV3IEtzKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8QXVbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1mdW5jdGlvbiBIbShlLHQpe3JldHVybiB0PXR8fHt9LHQucmF3PSEwLE91KGUsdCl9R2wuSW5mbGF0ZT1LcyxHbC5pbmZsYXRlPU91LEdsLmluZmxhdGVSYXc9SG0sR2wudW5nemlwPU91O3ZhciBqbT1OZS5hc3NpZ24sem09a3QsV209R2wsR209UmQsQmQ9e307am0oQmQsem0sV20sR20pO3ZhciBNZD1CZDtsZXQgWW09InVweDJweCIscW09W3tuYW1lOiJ1cHgiLHR5cGU6W051bWJlcixTdHJpbmddLHJlcXVpcmVkOiEwfV0sSm09MWUtNCxLbT03NTAsTGQ9ITEsVHU9MCxEZD0wLEZkPTk2MCxWZD0zNzUsVWQ9NzUwO2Z1bmN0aW9uIFptKCl7bGV0e3BsYXRmb3JtOmUscGl4ZWxSYXRpbzp0LHdpbmRvd1dpZHRoOm59PURyKCk7VHU9bixEZD10LExkPWU9PT0iaW9zIn1mdW5jdGlvbiBQdShlLHQpe2xldCBuPU51bWJlcihlKTtyZXR1cm4gaXNOYU4obik/dDpufWZ1bmN0aW9uIFhtKCl7bGV0IGU9Ui5nbG9iYWxTdHlsZXx8e307RmQ9UHUoZS5ycHhDYWxjTWF4RGV2aWNlV2lkdGgsOTYwKSxWZD1QdShlLnJweENhbGNCYXNlRGV2aWNlV2lkdGgsMzc1KSxVZD1QdShlLnJweENhbGNCYXNlRGV2aWNlV2lkdGgsNzUwKX1sZXQgUW09THQoWW0sKGUsdCk9PntpZihUdT09PTAmJihabSgpLFhtKCkpLGU9TnVtYmVyKGUpLGU9PT0wKXJldHVybiAwO2xldCBuPXR8fFR1O249ZT09PVVkfHxuPD1GZD9uOlZkO2xldCByPWUvS20qbjtyZXR1cm4gcjwwJiYocj0tcikscj1NYXRoLmZsb29yKHIrSm0pLHI9PT0wJiYoRGQ9PT0xfHwhTGQ/cj0xOnI9LjUpLGU8MD8tcjpyfSxxbSksZV89ImFkZEludGVyY2VwdG9yIix0Xz0icmVtb3ZlSW50ZXJjZXB0b3IiLCRkPVt7bmFtZToibWV0aG9kIix0eXBlOltTdHJpbmcsT2JqZWN0XSxyZXF1aXJlZDohMH1dLG5fPSRkO2Z1bmN0aW9uIEhkKGUsdCl7T2JqZWN0LmtleXModCkuZm9yRWFjaChuPT57ei5pc0Z1bmN0aW9uKHRbbl0pJiYoZVtuXT1yXyhlW25dLHRbbl0pKX0pfWZ1bmN0aW9uIGpkKGUsdCl7IWV8fCF0fHxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG49PntsZXQgcj1lW25dLG89dFtuXTt6LmlzQXJyYXkocikmJnouaXNGdW5jdGlvbihvKSYmei5yZW1vdmUocixvKX0pfWZ1bmN0aW9uIHJfKGUsdCl7bGV0IG49dD9lP2UuY29uY2F0KHQpOnouaXNBcnJheSh0KT90Olt0XTplO3JldHVybiBuJiZpXyhuKX1mdW5jdGlvbiBpXyhlKXtsZXQgdD1bXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0LmluZGV4T2YoZVtuXSk9PT0tMSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fWxldCBvXz1MdChlXywoZSx0KT0+e3ouaXNTdHJpbmcoZSkmJnouaXNQbGFpbk9iamVjdCh0KT9IZChUcltlXXx8KFRyW2VdPXt9KSx0KTp6LmlzUGxhaW5PYmplY3QoZSkmJkhkKHhuLGUpfSwkZCksYV89THQodF8sKGUsdCk9Pnt6LmlzU3RyaW5nKGUpP3ouaXNQbGFpbk9iamVjdCh0KT9qZChUcltlXSx0KTpkZWxldGUgVHJbZV06ei5pc1BsYWluT2JqZWN0KGUpJiZqZCh4bixlKX0sbl8pLHNfPXt9LGxfPSIkb24iLHpkPVt7bmFtZToiZXZlbnQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx7bmFtZToiY2FsbGJhY2siLHR5cGU6RnVuY3Rpb24scmVxdWlyZWQ6ITB9XSxjXz0iJG9uY2UiLHVfPXpkLGZfPSIkb2ZmIixkXz1be25hbWU6ImV2ZW50Iix0eXBlOltTdHJpbmcsQXJyYXldfSx7bmFtZToiY2FsbGJhY2siLHR5cGU6RnVuY3Rpb259XSxoXz0iJGVtaXQiLGdfPVt7bmFtZToiZXZlbnQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sWnM9bmV3IEsuRW1pdHRlcixwXz1MdChsXywoZSx0KT0+KFpzLm9uKGUsdCksKCk9PlpzLm9mZihlLHQpKSx6ZCksdl89THQoY18sKGUsdCk9Pihacy5vbmNlKGUsdCksKCk9PlpzLm9mZihlLHQpKSx1XyksbV89THQoZl8sKGUsdCk9PntpZighZSl7WnMuZT17fTtyZXR1cm59ei5pc0FycmF5KGUpfHwoZT1bZV0pLGUuZm9yRWFjaChuPT5acy5vZmYobix0KSl9LGRfKSxfXz1MdChoXywoZSwuLi50KT0+e1pzLmVtaXQoZSwuLi50KX0sZ18pLFdkPVt7bmFtZToiaWQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sYl89ImNyZWF0ZVZpZGVvQ29udGV4dCIsRV89ImNyZWF0ZU1hcENvbnRleHQiLHlfPVdkLFNfPSJjcmVhdGVDYW52YXNDb250ZXh0Iix3Xz1be25hbWU6ImNhbnZhc0lkIix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNvbXBvbmVudEluc3RhbmNlIix0eXBlOk9iamVjdH1dLENfPSJjcmVhdGVJbm5lckF1ZGlvQ29udGV4dCIsQV89ImNyZWF0ZUxpdmVQdXNoZXJDb250ZXh0IixPXz1XZC5jb25jYXQoe25hbWU6ImNvbXBvbmVudEluc3RhbmNlIix0eXBlOk9iamVjdH0pLFRfPVsuNSwuOCwxLDEuMjUsMS41LDJdO2NsYXNzIEl1e2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW59cGxheSgpe2xuKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBsYXkiKX1wYXVzZSgpe2xuKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBhdXNlIil9c3RvcCgpe2xuKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN0b3AiKX1zZWVrKHQpe2xuKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNlZWsiLHtwb3NpdGlvbjp0fSl9c2VuZERhbm11KHQpe2xuKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNlbmREYW5tdSIsdCl9cGxheWJhY2tSYXRlKHQpe35UXy5pbmRleE9mKHQpfHwodD0xKSxsbih0aGlzLmlkLHRoaXMucGFnZUlkLCJwbGF5YmFja1JhdGUiLHtyYXRlOnR9KX1yZXF1ZXN0RnVsbFNjcmVlbih0PXt9KXtsbih0aGlzLmlkLHRoaXMucGFnZUlkLCJyZXF1ZXN0RnVsbFNjcmVlbiIsdCl9ZXhpdEZ1bGxTY3JlZW4oKXtsbih0aGlzLmlkLHRoaXMucGFnZUlkLCJleGl0RnVsbFNjcmVlbiIpfXNob3dTdGF0dXNCYXIoKXtsbih0aGlzLmlkLHRoaXMucGFnZUlkLCJzaG93U3RhdHVzQmFyIil9aGlkZVN0YXR1c0Jhcigpe2xuKHRoaXMuaWQsdGhpcy5wYWdlSWQsImhpZGVTdGF0dXNCYXIiKX19bGV0IFBfPUx0KGJfLChlLHQpPT50P25ldyBJdShlLEhuKHQpKTpuZXcgSXUoZSxIbih3cigpKSkpLElfPShlLHQpPT57bGV0IG49dC5lcnJNc2d8fCIiO25ldyBSZWdFeHAoIlxcOlxccypmYWlsIikudGVzdChuKT9lLmZhaWwmJmUuZmFpbCh0KTplLnN1Y2Nlc3MmJmUuc3VjY2Vzcyh0KSxlLmNvbXBsZXRlJiZlLmNvbXBsZXRlKHQpfSxJaT0oZSx0LG4scik9PntZbihlLHQsbixyLG89PntyJiZJXyhyLG8pfSl9O2NsYXNzIE51e2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW59Z2V0Q2VudGVyTG9jYXRpb24odCl7SWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiZ2V0Q2VudGVyTG9jYXRpb24iLHQpfW1vdmVUb0xvY2F0aW9uKHQpe0lpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm1vdmVUb0xvY2F0aW9uIix0KX1nZXRTY2FsZSh0KXtJaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJnZXRTY2FsZSIsdCl9Z2V0UmVnaW9uKHQpe0lpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImdldFJlZ2lvbiIsdCl9aW5jbHVkZVBvaW50cyh0KXtJaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJpbmNsdWRlUG9pbnRzIix0KX10cmFuc2xhdGVNYXJrZXIodCl7SWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwidHJhbnNsYXRlTWFya2VyIix0KX0kZ2V0QXBwTWFwKCl7cmV0dXJuIHMubWFwcy5nZXRNYXBCeUlkKHRoaXMucGFnZUlkKyItbWFwLSIrdGhpcy5pZCl9YWRkQ3VzdG9tTGF5ZXIodCl7SWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWRkQ3VzdG9tTGF5ZXIiLHQpfXJlbW92ZUN1c3RvbUxheWVyKHQpe0lpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlbW92ZUN1c3RvbUxheWVyIix0KX1hZGRHcm91bmRPdmVybGF5KHQpe0lpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImFkZEdyb3VuZE92ZXJsYXkiLHQpfXJlbW92ZUdyb3VuZE92ZXJsYXkodCl7SWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlR3JvdW5kT3ZlcmxheSIsdCl9dXBkYXRlR3JvdW5kT3ZlcmxheSh0KXtJaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJ1cGRhdGVHcm91bmRPdmVybGF5Iix0KX1pbml0TWFya2VyQ2x1c3Rlcih0KXtJaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJpbml0TWFya2VyQ2x1c3RlciIsdCl9YWRkTWFya2Vycyh0KXtJaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJhZGRNYXJrZXJzIix0KX1yZW1vdmVNYXJrZXJzKHQpe0lpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlbW92ZU1hcmtlcnMiLHQpfW1vdmVBbG9uZyh0KXtJaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJtb3ZlQWxvbmciLHQpfXNldExvY01hcmtlckljb24odCl7SWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwic2V0TG9jTWFya2VySWNvbiIsdCl9b3Blbk1hcEFwcCh0KXtJaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJvcGVuTWFwQXBwIix0KX1vbih0LG4pe0lpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm9uIix7bmFtZTp0LGNhbGxiYWNrOm59KX19bGV0IE5fPUx0KEVfLChlLHQpPT50P25ldyBOdShlLEhuKHQpKTpuZXcgTnUoZSxIbih3cigpKSkseV8pO2Z1bmN0aW9uIEFzKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4scil7bj9yW2VdPU1hdGgucm91bmQobik6dHlwZW9mIHQhPSJ1bmRlZmluZWQiJiYocltlXT10KX19bGV0IEdkPUFzKCJ3aWR0aCIpLFlkPUFzKCJoZWlnaHQiKSxrXz0iY2FudmFzR2V0SW1hZ2VEYXRhIixxZD17Zm9ybWF0QXJnczp7eDpBcygieCIpLHk6QXMoInkiKSx3aWR0aDpHZCxoZWlnaHQ6WWR9fSxKZD17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMH0seTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LHdpZHRoOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMH0saGVpZ2h0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMH19LFJfPSJjYW52YXNQdXRJbWFnZURhdGEiLHhfPXFkLEJfPXouZXh0ZW5kKHtkYXRhOnt0eXBlOlVpbnQ4Q2xhbXBlZEFycmF5LHJlcXVpcmVkOiEwfX0sSmQse2hlaWdodDp7dHlwZTpOdW1iZXJ9fSksS2Q9e1BORzoicG5nIixKUEc6ImpwZyIsSlBFRzoianBnIn0sTV89ImNhbnZhc1RvVGVtcEZpbGVQYXRoIixMXz17Zm9ybWF0QXJnczp7eDpBcygieCIsMCkseTpBcygieSIsMCksd2lkdGg6R2QsaGVpZ2h0OllkLGRlc3RXaWR0aDpBcygiZGVzdFdpZHRoIiksZGVzdEhlaWdodDpBcygiZGVzdEhlaWdodCIpLGZpbGVUeXBlKGUsdCl7ZT0oZXx8IiIpLnRvVXBwZXJDYXNlKCk7bGV0IG49S2RbZV07bnx8KG49S2QuUE5HKSx0LmZpbGVUeXBlPW59LHF1YWxpdHkoZSx0KXt0LnF1YWxpdHk9ZSYmZT4wJiZlPDE/ZToxfX19LERfPXt4Ok51bWJlcix5Ok51bWJlcix3aWR0aDpOdW1iZXIsaGVpZ2h0Ok51bWJlcixkZXN0V2lkdGg6TnVtYmVyLGRlc3RIZWlnaHQ6TnVtYmVyLGNhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6U3RyaW5nLHF1YWxpdHk6TnVtYmVyfTtmdW5jdGlvbiBPYyhlLHQsbixyLG8pe290Lmludm9rZVZpZXdNZXRob2QoYGNhbnZhcy4ke2V9YCx7dHlwZTpuLGRhdGE6cn0sdCxjPT57byYmbyhjKX0pfXZhciBGXz1bInNjYWxlIiwicm90YXRlIiwidHJhbnNsYXRlIiwic2V0VHJhbnNmb3JtIiwidHJhbnNmb3JtIl0sVl89WyJkcmF3SW1hZ2UiLCJmaWxsVGV4dCIsImZpbGwiLCJzdHJva2UiLCJmaWxsUmVjdCIsInN0cm9rZVJlY3QiLCJjbGVhclJlY3QiLCJzdHJva2VUZXh0Il0sVV89WyJzZXRGaWxsU3R5bGUiLCJzZXRUZXh0QWxpZ24iLCJzZXRTdHJva2VTdHlsZSIsInNldEdsb2JhbEFscGhhIiwic2V0U2hhZG93Iiwic2V0Rm9udFNpemUiLCJzZXRMaW5lQ2FwIiwic2V0TGluZUpvaW4iLCJzZXRMaW5lV2lkdGgiLCJzZXRNaXRlckxpbWl0Iiwic2V0VGV4dEJhc2VsaW5lIiwic2V0TGluZURhc2giXTtmdW5jdGlvbiAkXyhlLHQpe2xldCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7cmV0dXJuIHIuZm9udD10LHIubWVhc3VyZVRleHQoZSkud2lkdGh8fDB9bGV0IFpkPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmV5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0Z3JlZW46IiM5MGVlOTAiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZGIiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkYjcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWJlY2NhcHVycGxlOiIjNjYzMzk5IixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiIsdHJhbnNwYXJlbnQ6IiMwMDAwMDAwMCJ9O2Z1bmN0aW9uIGt1KGUpe2U9ZXx8IiMwMDAwMDAiO3ZhciB0PW51bGw7aWYoKHQ9L14jKFswLTl8QS1GfGEtZl17Nn0pJC8uZXhlYyhlKSkhPW51bGwpe2xldCByPXBhcnNlSW50KHRbMV0uc2xpY2UoMCwyKSwxNiksbz1wYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLGM9cGFyc2VJbnQodFsxXS5zbGljZSg0KSwxNik7cmV0dXJuW3IsbyxjLDI1NV19aWYoKHQ9L14jKFswLTl8QS1GfGEtZl17M30pJC8uZXhlYyhlKSkhPW51bGwpe2xldCByPXRbMV0uc2xpY2UoMCwxKSxvPXRbMV0uc2xpY2UoMSwyKSxjPXRbMV0uc2xpY2UoMiwzKTtyZXR1cm4gcj1wYXJzZUludChyK3IsMTYpLG89cGFyc2VJbnQobytvLDE2KSxjPXBhcnNlSW50KGMrYywxNiksW3IsbyxjLDI1NV19aWYoKHQ9L15yZ2JcKCguKylcKSQvLmV4ZWMoZSkpIT1udWxsKXJldHVybiB0WzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLm1pbigyNTUscGFyc2VJbnQoci50cmltKCkpKX0pLmNvbmNhdCgyNTUpO2lmKCh0PS9ecmdiYVwoKC4rKVwpJC8uZXhlYyhlKSkhPW51bGwpcmV0dXJuIHRbMV0uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24ocixvKXtyZXR1cm4gbz09PTM/TWF0aC5mbG9vcigyNTUqcGFyc2VGbG9hdChyLnRyaW0oKSkpOk1hdGgubWluKDI1NSxwYXJzZUludChyLnRyaW0oKSkpfSk7dmFyIG49ZS50b0xvd2VyQ2FzZSgpO2lmKHouaGFzT3duKFpkLG4pKXt0PS9eIyhbMC05fEEtRnxhLWZdezYsOH0pJC8uZXhlYyhaZFtuXSk7bGV0IHI9cGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxvPXBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNiksYz1wYXJzZUludCh0WzFdLnNsaWNlKDQsNiksMTYpLGc9cGFyc2VJbnQodFsxXS5zbGljZSg2LDgpLDE2KTtyZXR1cm4gZz1nPj0wP2c6MjU1LFtyLG8sYyxnXX1yZXR1cm4gY29uc29sZS5lcnJvcigidW5zdXBwb3J0ZWQgY29sb3I6IitlKSxbMCwwLDAsMjU1XX1jbGFzcyBYZHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudHlwZT10LHRoaXMuZGF0YT1uLHRoaXMuY29sb3JTdG9wPVtdfWFkZENvbG9yU3RvcCh0LG4pe3RoaXMuY29sb3JTdG9wLnB1c2goW3Qsa3UobildKX19Y2xhc3MgSF97Y29uc3RydWN0b3IodCxuKXt0aGlzLnR5cGU9InBhdHRlcm4iLHRoaXMuZGF0YT10LHRoaXMuY29sb3JTdG9wPW59fWNsYXNzIGpfe2NvbnN0cnVjdG9yKHQpe3RoaXMud2lkdGg9dH19Y2xhc3MgSmx7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bix0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLmRyYXdpbmdTdGF0ZT1bXSx0aGlzLnN0YXRlPXtsaW5lRGFzaDpbMCwwXSxzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WTowLHNoYWRvd0JsdXI6MCxzaGFkb3dDb2xvcjpbMCwwLDAsMF0sZm9udDoiMTBweCBzYW5zLXNlcmlmIixmb250U2l6ZToxMCxmb250V2VpZ2h0OiJub3JtYWwiLGZvbnRTdHlsZToibm9ybWFsIixmb250RmFtaWx5OiJzYW5zLXNlcmlmIn19ZHJhdyh0PSExLG4pe3ZhciByPVsuLi50aGlzLmFjdGlvbnNdO3RoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sT2ModGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWN0aW9uc0NoYW5nZWQiLHthY3Rpb25zOnIscmVzZXJ2ZTp0fSxuKX1jcmVhdGVMaW5lYXJHcmFkaWVudCh0LG4scixvKXtyZXR1cm4gbmV3IFhkKCJsaW5lYXIiLFt0LG4scixvXSl9Y3JlYXRlQ2lyY3VsYXJHcmFkaWVudCh0LG4scil7cmV0dXJuIG5ldyBYZCgicmFkaWFsIixbdCxuLHJdKX1jcmVhdGVQYXR0ZXJuKHQsbil7aWYobj09PXZvaWQgMCljb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnY3JlYXRlUGF0dGVybicgb24gJ0NhbnZhc0NvbnRleHQnOiAyIGFyZ3VtZW50cyByZXF1aXJlZCwgYnV0IG9ubHkgMSBwcmVzZW50LiIpO2Vsc2UgaWYoWyJyZXBlYXQiLCJyZXBlYXQteCIsInJlcGVhdC15Iiwibm8tcmVwZWF0Il0uaW5kZXhPZihuKTwwKWNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IFRoZSBwcm92aWRlZCB0eXBlICgnIituKyInKSBpcyBub3Qgb25lIG9mICdyZXBlYXQnLCAnbm8tcmVwZWF0JywgJ3JlcGVhdC14Jywgb3IgJ3JlcGVhdC15Jy4iKTtlbHNlIHJldHVybiBuZXcgSF8odCxuKX1tZWFzdXJlVGV4dCh0KXtsZXQgbj10aGlzLnN0YXRlLmZvbnQscj0wO3tsZXQgbz1zLndlYnZpZXcuYWxsKCkuZmluZChjPT5jLmdldFVSTCgpLmVuZHNXaXRoKCJ3d3cvX191bmlhcHB2aWV3Lmh0bWwiKSk7byYmKHI9TnVtYmVyKG8uZXZhbEpTU3luYyhgKCR7JF8udG9TdHJpbmcoKX0pKCR7SlNPTi5zdHJpbmdpZnkodCl9LCR7SlNPTi5zdHJpbmdpZnkobil9KWApKSl9cmV0dXJuIG5ldyBqXyhyKX1zYXZlKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2F2ZSIsZGF0YTpbXX0pLHRoaXMuZHJhd2luZ1N0YXRlLnB1c2godGhpcy5zdGF0ZSl9cmVzdG9yZSgpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InJlc3RvcmUiLGRhdGE6W119KSx0aGlzLnN0YXRlPXRoaXMuZHJhd2luZ1N0YXRlLnBvcCgpfHx7bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fWJlZ2luUGF0aCgpe3RoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmVnaW5QYXRoIixkYXRhOltdfSl9bW92ZVRvKHQsbil7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoibW92ZVRvIixkYXRhOlt0LG5dfSksdGhpcy5zdWJwYXRoPVtbdCxuXV19bGluZVRvKHQsbil7dGhpcy5wYXRoLmxlbmd0aD09PTAmJnRoaXMuc3VicGF0aC5sZW5ndGg9PT0wP3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbdCxuXX0pOnRoaXMucGF0aC5wdXNoKHttZXRob2Q6ImxpbmVUbyIsZGF0YTpbdCxuXX0pLHRoaXMuc3VicGF0aC5wdXNoKFt0LG5dKX1xdWFkcmF0aWNDdXJ2ZVRvKHQsbixyLG8pe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InF1YWRyYXRpY0N1cnZlVG8iLGRhdGE6W3QsbixyLG9dfSksdGhpcy5zdWJwYXRoLnB1c2goW3Isb10pfWJlemllckN1cnZlVG8odCxuLHIsbyxjLGcpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImJlemllckN1cnZlVG8iLGRhdGE6W3QsbixyLG8sYyxnXX0pLHRoaXMuc3VicGF0aC5wdXNoKFtjLGddKX1hcmModCxuLHIsbyxjLGc9ITEpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyYyIsZGF0YTpbdCxuLHIsbyxjLGddfSksdGhpcy5zdWJwYXRoLnB1c2goW3Qsbl0pfXJlY3QodCxuLHIsbyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicmVjdCIsZGF0YTpbdCxuLHIsb119KSx0aGlzLnN1YnBhdGg9W1t0LG5dXX1hcmNUbyh0LG4scixvLGMpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyY1RvIixkYXRhOlt0LG4scixvLGNdfSksdGhpcy5zdWJwYXRoLnB1c2goW3Isb10pfWNsaXAoKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJjbGlwIixkYXRhOlsuLi50aGlzLnBhdGhdfSl9Y2xvc2VQYXRoKCl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiY2xvc2VQYXRoIixkYXRhOltdfSksdGhpcy5zdWJwYXRoLmxlbmd0aCYmKHRoaXMuc3VicGF0aD1bdGhpcy5zdWJwYXRoLnNoaWZ0KCldKX1jbGVhckFjdGlvbnMoKXt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXX1nZXRBY3Rpb25zKCl7dmFyIHQ9Wy4uLnRoaXMuYWN0aW9uc107cmV0dXJuIHRoaXMuY2xlYXJBY3Rpb25zKCksdH1zZXQgbGluZURhc2hPZmZzZXQodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZURhc2hPZmZzZXQiLGRhdGE6W3RdfSl9c2V0IGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLGRhdGE6W3RdfSl9c2V0IHNoYWRvd0JsdXIodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Qmx1ciIsZGF0YTpbdF19KX1zZXQgc2hhZG93Q29sb3IodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Q29sb3IiLGRhdGE6W3RdfSl9c2V0IHNoYWRvd09mZnNldFgodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WCIsZGF0YTpbdF19KX1zZXQgc2hhZG93T2Zmc2V0WSh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dPZmZzZXRZIixkYXRhOlt0XX0pfXNldCBmb250KHQpe3ZhciBuPXRoaXM7dGhpcy5zdGF0ZS5mb250PXQ7dmFyIHI9dC5tYXRjaCgvXigoW1x3XC1dK1xzKSopKFxkK3I/cHgpKFwvKFxkK1wuP1xkKihyP3B4KT8pKT9ccysoLiopLyk7aWYocil7dmFyIG89clsxXS50cmltKCkuc3BsaXQoL1xzLyksYz1wYXJzZUZsb2F0KHJbM10pLGc9cls3XSxiPVtdO28uZm9yRWFjaChmdW5jdGlvbihULEQpe1siaXRhbGljIiwib2JsaXF1ZSIsIm5vcm1hbCJdLmluZGV4T2YoVCk+LTE/KGIucHVzaCh7bWV0aG9kOiJzZXRGb250U3R5bGUiLGRhdGE6W1RdfSksbi5zdGF0ZS5mb250U3R5bGU9VCk6WyJib2xkIiwibm9ybWFsIl0uaW5kZXhPZihUKT4tMT8oYi5wdXNoKHttZXRob2Q6InNldEZvbnRXZWlnaHQiLGRhdGE6W1RdfSksbi5zdGF0ZS5mb250V2VpZ2h0PVQpOkQ9PT0wPyhiLnB1c2goe21ldGhvZDoic2V0Rm9udFN0eWxlIixkYXRhOlsibm9ybWFsIl19KSxuLnN0YXRlLmZvbnRTdHlsZT0ibm9ybWFsIik6RD09PTEmJlYoKX0pLG8ubGVuZ3RoPT09MSYmVigpLG89Yi5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIFQuZGF0YVswXX0pLmpvaW4oIiAiKSx0aGlzLnN0YXRlLmZvbnRTaXplPWMsdGhpcy5zdGF0ZS5mb250RmFtaWx5PWcsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0Rm9udCIsZGF0YTpbYCR7b30gJHtjfXB4ICR7Z31gXX0pfWVsc2UgY29uc29sZS53YXJuKCJGYWlsZWQgdG8gc2V0ICdmb250JyBvbiAnQ2FudmFzQ29udGV4dCc6IGludmFsaWQgZm9ybWF0LiIpO2Z1bmN0aW9uIFYoKXtiLnB1c2goe21ldGhvZDoic2V0Rm9udFdlaWdodCIsZGF0YTpbIm5vcm1hbCJdfSksbi5zdGF0ZS5mb250V2VpZ2h0PSJub3JtYWwifX1nZXQgZm9udCgpe3JldHVybiB0aGlzLnN0YXRlLmZvbnR9c2V0IGZpbGxTdHlsZSh0KXt0aGlzLnNldEZpbGxTdHlsZSh0KX1zZXQgc3Ryb2tlU3R5bGUodCl7dGhpcy5zZXRTdHJva2VTdHlsZSh0KX1zZXQgZ2xvYmFsQWxwaGEodCl7dD1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KHQpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxBbHBoYSIsZGF0YTpbdF19KX1zZXQgdGV4dEFsaWduKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFRleHRBbGlnbiIsZGF0YTpbdF19KX1zZXQgbGluZUNhcCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lQ2FwIixkYXRhOlt0XX0pfXNldCBsaW5lSm9pbih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lSm9pbiIsZGF0YTpbdF19KX1zZXQgbGluZVdpZHRoKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVXaWR0aCIsZGF0YTpbdF19KX1zZXQgbWl0ZXJMaW1pdCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRNaXRlckxpbWl0IixkYXRhOlt0XX0pfXNldCB0ZXh0QmFzZWxpbmUodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0VGV4dEJhc2VsaW5lIixkYXRhOlt0XX0pfX1sZXQgel89Sy5vbmNlKCgpPT57Wy4uLkZfLC4uLlZfXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7c3dpdGNoKG4pe2Nhc2UiZmlsbCI6Y2FzZSJzdHJva2UiOnJldHVybiBmdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bisiUGF0aCIsZGF0YTpbLi4udGhpcy5wYXRoXX0pfTtjYXNlImZpbGxSZWN0IjpyZXR1cm4gZnVuY3Rpb24ocixvLGMsZyl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoiZmlsbFBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W3IsbyxjLGddfV19KX07Y2FzZSJzdHJva2VSZWN0IjpyZXR1cm4gZnVuY3Rpb24ocixvLGMsZyl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic3Ryb2tlUGF0aCIsZGF0YTpbe21ldGhvZDoicmVjdCIsZGF0YTpbcixvLGMsZ119XX0pfTtjYXNlImZpbGxUZXh0IjpjYXNlInN0cm9rZVRleHQiOnJldHVybiBmdW5jdGlvbihyLG8sYyxnKXt2YXIgYj1bci50b1N0cmluZygpLG8sY107dHlwZW9mIGc9PSJudW1iZXIiJiZiLnB1c2goZyksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6Yn0pfTtjYXNlImRyYXdJbWFnZSI6cmV0dXJuIGZ1bmN0aW9uKHIsbyxjLGcsYixWLFQsRCx2ZSl7dmU9PT12b2lkIDAmJihWPW8sVD1jLEQ9Zyx2ZT1iLG89dm9pZCAwLGM9dm9pZCAwLGc9dm9pZCAwLGI9dm9pZCAwKTt2YXIgeWU7ZnVuY3Rpb24gT2UoZnQpe3JldHVybiB0eXBlb2YgZnQ9PSJudW1iZXIifXllPU9lKG8pJiZPZShjKSYmT2UoZykmJk9lKGIpP1tyLFYsVCxELHZlLG8sYyxnLGJdOk9lKEQpJiZPZSh2ZSk/W3IsVixULEQsdmVdOltyLFYsVF0sdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6eWV9KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oLi4ucil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6cn0pfX19SmwucHJvdG90eXBlW2VdPXQoZSl9KSxVXy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7c3dpdGNoKG4pe2Nhc2Uic2V0RmlsbFN0eWxlIjpjYXNlInNldFN0cm9rZVN0eWxlIjpyZXR1cm4gZnVuY3Rpb24ocil7dHlwZW9mIHIhPSJvYmplY3QiP3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOlsibm9ybWFsIixrdShyKV19KTp0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbci50eXBlLHIuZGF0YSxyLmNvbG9yU3RvcF19KX07Y2FzZSJzZXRHbG9iYWxBbHBoYSI6cmV0dXJuIGZ1bmN0aW9uKHIpe3I9TWF0aC5mbG9vcigyNTUqcGFyc2VGbG9hdChyKSksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6W3JdfSl9O2Nhc2Uic2V0U2hhZG93IjpyZXR1cm4gZnVuY3Rpb24ocixvLGMsZyl7Zz1rdShnKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbcixvLGMsZ119KSx0aGlzLnN0YXRlLnNoYWRvd0JsdXI9Yyx0aGlzLnN0YXRlLnNoYWRvd0NvbG9yPWcsdGhpcy5zdGF0ZS5zaGFkb3dPZmZzZXRYPXIsdGhpcy5zdGF0ZS5zaGFkb3dPZmZzZXRZPW99O2Nhc2Uic2V0TGluZURhc2giOnJldHVybiBmdW5jdGlvbihyLG8pe3I9cnx8WzAsMF0sbz1vfHwwLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyLG9dfSksdGhpcy5zdGF0ZS5saW5lRGFzaD1yfTtjYXNlInNldEZvbnRTaXplIjpyZXR1cm4gZnVuY3Rpb24ocil7dGhpcy5zdGF0ZS5mb250PXRoaXMuc3RhdGUuZm9udC5yZXBsYWNlKC9cZCtcLj9cZCpweC8scisicHgiKSx0aGlzLnN0YXRlLmZvbnRTaXplPXIsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6W3JdfSl9O2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKC4uLnIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOnJ9KX19fUpsLnByb3RvdHlwZVtlXT10KGUpfSl9KSxXXz1MdChTXywoZSx0KT0+e2lmKHpfKCksdClyZXR1cm4gbmV3IEpsKGUsSG4odCkpO2xldCBuPUhuKHdyKCkpO2lmKG4pcmV0dXJuIG5ldyBKbChlLG4pO290LmVtaXQoSy5PTl9FUlJPUiwiY3JlYXRlQ2FudmFzQ29udGV4dDpmYWlsIil9LHdfKSxHXz1FZShrXywoe2NhbnZhc0lkOmUseDp0LHk6bix3aWR0aDpyLGhlaWdodDpvfSx7cmVzb2x2ZTpjLHJlamVjdDpnfSk9PntsZXQgYj1Ibih3cigpKTtpZighYil7ZygpO3JldHVybn1mdW5jdGlvbiBWKFQpe2lmKFQuZXJyTXNnJiZULmVyck1zZy5pbmRleE9mKCJmYWlsIikhPT0tMSl7ZygiIixUKTtyZXR1cm59bGV0IEQ9VC5kYXRhO0QmJkQubGVuZ3RoJiYoVC5jb21wcmVzc2VkJiYoRD1NZC5pbmZsYXRlUmF3KEQpKSxULmRhdGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KEQpKSxkZWxldGUgVC5jb21wcmVzc2VkLGMoVCl9T2MoZSxiLCJnZXRJbWFnZURhdGEiLHt4OnQseTpuLHdpZHRoOnIsaGVpZ2h0Om99LFYpfSxKZCxxZCksWV89RWUoUl8sKHtjYW52YXNJZDplLGRhdGE6dCx4Om4seTpyLHdpZHRoOm8saGVpZ2h0OmN9LHtyZXNvbHZlOmcscmVqZWN0OmJ9KT0+e3ZhciBWPUhuKHdyKCkpO2lmKCFWKXtiKCk7cmV0dXJufWxldCBULEQ9KCk9PntPYyhlLFYsInB1dEltYWdlRGF0YSIse2RhdGE6dCx4Om4seTpyLHdpZHRoOm8saGVpZ2h0OmMsY29tcHJlc3NlZDpUfSx2ZT0+e2lmKHZlLmVyck1zZyYmdmUuZXJyTXNnLmluZGV4T2YoImZhaWwiKSE9PS0xKXtiKCk7cmV0dXJufWcodmUpfSl9O3Mub3MubmFtZSE9PSJpT1MifHx0eXBlb2YgX19XRUVYX0RFVlRPT0xfXz09ImJvb2xlYW4iPyh0PU1kLmRlZmxhdGVSYXcodCx7dG86InN0cmluZyJ9KSxUPSEwKTp0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpLEQoKX0sQl8seF8pLHFfPUVlKE1fLCh7eDplPTAseTp0PTAsd2lkdGg6bixoZWlnaHQ6cixkZXN0V2lkdGg6byxkZXN0SGVpZ2h0OmMsY2FudmFzSWQ6ZyxmaWxlVHlwZTpiLHF1YWxpdHk6Vn0se3Jlc29sdmU6VCxyZWplY3Q6RH0pPT57dmFyIHZlPUhuKHdyKCkpO2lmKCF2ZSl7RCgpO3JldHVybn1sZXQgeWU9YCR7SnJ9L2NhbnZhc2A7T2MoZyx2ZSwidG9UZW1wRmlsZVBhdGgiLHt4OmUseTp0LHdpZHRoOm4saGVpZ2h0OnIsZGVzdFdpZHRoOm8sZGVzdEhlaWdodDpjLGZpbGVUeXBlOmIscXVhbGl0eTpWLGRpcm5hbWU6eWV9LE9lPT57aWYoT2UuZXJyTXNnJiZPZS5lcnJNc2cuaW5kZXhPZigiZmFpbCIpIT09LTEpe0QoIiIsT2UpO3JldHVybn1UKE9lKX0pfSxEXyxMXyksUWQ9WyJvbkNhbnBsYXkiLCJvblBsYXkiLCJvblBhdXNlIiwib25TdG9wIiwib25FbmRlZCIsIm9uVGltZVVwZGF0ZSIsIm9uRXJyb3IiLCJvbldhaXRpbmciLCJvblNlZWtpbmciLCJvblNlZWtlZCJdLEpfPVsib2ZmQ2FucGxheSIsIm9mZlBsYXkiLCJvZmZQYXVzZSIsIm9mZlN0b3AiLCJvZmZFbmRlZCIsIm9mZlRpbWVVcGRhdGUiLCJvZmZFcnJvciIsIm9mZldhaXRpbmciLCJvZmZTZWVraW5nIiwib2ZmU2Vla2VkIl0sS189e3RocmVzaG9sZHM6WzBdLGluaXRpYWxSYXRpbzowLG9ic2VydmVBbGw6ITF9LFpfPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0sWF89MTtmdW5jdGlvbiBlaChlPXt9KXtyZXR1cm4gWl8ubWFwKHQ9PmAke051bWJlcihlW3RdKXx8MH1weGApLmpvaW4oIiAiKX1jbGFzcyB0aHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX3BhZ2VJZD1Ibih0KSx0aGlzLl9jb21wb25lbnQ9dCx0aGlzLl9vcHRpb25zPXouZXh0ZW5kKHt9LEtfLG4pfXJlbGF0aXZlVG8odCxuKXtyZXR1cm4gdGhpcy5fb3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9dCx0aGlzLl9vcHRpb25zLnJvb3RNYXJnaW49ZWgobiksdGhpc31yZWxhdGl2ZVRvVmlld3BvcnQodCl7cmV0dXJuIHRoaXMuX29wdGlvbnMucmVsYXRpdmVUb1NlbGVjdG9yPXZvaWQgMCx0aGlzLl9vcHRpb25zLnJvb3RNYXJnaW49ZWgodCksdGhpc31vYnNlcnZlKHQsbil7IXouaXNGdW5jdGlvbihuKXx8KHRoaXMuX29wdGlvbnMuc2VsZWN0b3I9dCx0aGlzLl9yZXFJZD1YXysrLFRpKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50LG9wdGlvbnM6dGhpcy5fb3B0aW9ucyxjYWxsYmFjazpufSx0aGlzLl9wYWdlSWQpKX1kaXNjb25uZWN0KCl7dGhpcy5fcmVxSWQmJnVzKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50fSx0aGlzLl9wYWdlSWQpfX1sZXQgUV89THQoImNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyIiwoZSx0KT0+KGU9Sy5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSksZSYmIUhuKGUpJiYodD1lLGU9bnVsbCksZT9uZXcgdGgoZSx0KTpuZXcgdGgod3IoKSx0KSkpLGViPTE7Y2xhc3Mgbmh7Y29uc3RydWN0b3IodCl7dGhpcy5fcGFnZUlkPXQuJHBhZ2UmJnQuJHBhZ2UuaWQsdGhpcy5fY29tcG9uZW50PXR9b2JzZXJ2ZSh0LG4peyF6LmlzRnVuY3Rpb24obil8fCh0aGlzLl9yZXFJZD1lYisrLElhKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50LG9wdGlvbnM6dCxjYWxsYmFjazpufSx0aGlzLl9wYWdlSWQpKX1kaXNjb25uZWN0KCl7dGhpcy5fcmVxSWQmJm5hKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50fSx0aGlzLl9wYWdlSWQpfX1sZXQgdGI9THQoImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIsZT0+KGU9Sy5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSksZSYmIUhuKGUpJiYoZT1udWxsKSxlP25ldyBuaChlKTpuZXcgbmgod3IoKSkpKSxuYj0wLFJ1PXt9O2Z1bmN0aW9uIHJiKGUsdCxuLHIpe2xldCBvPXtvcHRpb25zOnJ9LGM9ciYmKCJzdWNjZXNzImluIHJ8fCJmYWlsImluIHJ8fCJjb21wbGV0ZSJpbiByKTtpZihjKXtsZXQgZz1TdHJpbmcobmIrKyk7by5jYWxsYmFja0lkPWcsUnVbZ109cn1vdC5pbnZva2VWaWV3TWV0aG9kKGBlZGl0b3IuJHtlfWAse3R5cGU6bixkYXRhOm99LHQsKHtjYWxsYmFja0lkOmcsZGF0YTpifSk9PntjJiYoSy5jYWxsT3B0aW9ucyhSdVtnXSxiKSxkZWxldGUgUnVbZ10pfSl9Y2xhc3MgaWJ7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1mb3JtYXQodCxuKXt0aGlzLl9leGVjKCJmb3JtYXQiLHtuYW1lOnQsdmFsdWU6bn0pfWluc2VydERpdmlkZXIoKXt0aGlzLl9leGVjKCJpbnNlcnREaXZpZGVyIil9aW5zZXJ0SW1hZ2UodCl7dGhpcy5fZXhlYygiaW5zZXJ0SW1hZ2UiLHQpfWluc2VydFRleHQodCl7dGhpcy5fZXhlYygiaW5zZXJ0VGV4dCIsdCl9c2V0Q29udGVudHModCl7dGhpcy5fZXhlYygic2V0Q29udGVudHMiLHQpfWdldENvbnRlbnRzKHQpe3RoaXMuX2V4ZWMoImdldENvbnRlbnRzIix0KX1jbGVhcih0KXt0aGlzLl9leGVjKCJjbGVhciIsdCl9cmVtb3ZlRm9ybWF0KHQpe3RoaXMuX2V4ZWMoInJlbW92ZUZvcm1hdCIsdCl9dW5kbyh0KXt0aGlzLl9leGVjKCJ1bmRvIix0KX1yZWRvKHQpe3RoaXMuX2V4ZWMoInJlZG8iLHQpfWJsdXIodCl7dGhpcy5fZXhlYygiYmx1ciIsdCl9Z2V0U2VsZWN0aW9uVGV4dCh0KXt0aGlzLl9leGVjKCJnZXRTZWxlY3Rpb25UZXh0Iix0KX1zY3JvbGxJbnRvVmlldyh0KXt0aGlzLl9leGVjKCJzY3JvbGxJbnRvVmlldyIsdCl9X2V4ZWModCxuKXtyYih0aGlzLmlkLHRoaXMucGFnZUlkLHQsbil9fWxldCBvYj17Y2FudmFzOkpsLG1hcDpOdSx2aWRlbzpJdSxlZGl0b3I6aWJ9O2Z1bmN0aW9uIHJoKGUpe2lmKGUmJmUuY29udGV4dEluZm8pe2xldHtpZDp0LHR5cGU6bixwYWdlOnJ9PWUuY29udGV4dEluZm8sbz1vYltuXTtlLmNvbnRleHQ9bmV3IG8odCxyKSxkZWxldGUgZS5jb250ZXh0SW5mb319Y2xhc3MgeHV7Y29uc3RydWN0b3IodCxuLHIsbyl7dGhpcy5fc2VsZWN0b3JRdWVyeT10LHRoaXMuX2NvbXBvbmVudD1uLHRoaXMuX3NlbGVjdG9yPXIsdGhpcy5fc2luZ2xlPW99Ym91bmRpbmdDbGllbnRSZWN0KHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAscmVjdDohMCxzaXplOiEwfSx0KSx0aGlzLl9zZWxlY3RvclF1ZXJ5fWZpZWxkcyh0LG4pe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUsdCxuKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fXNjcm9sbE9mZnNldCh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtpZDohMCxkYXRhc2V0OiEwLHNjcm9sbE9mZnNldDohMH0sdCksdGhpcy5fc2VsZWN0b3JRdWVyeX1jb250ZXh0KHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2NvbnRleHQ6ITB9LHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9bm9kZSh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtub2RlOiEwfSx0KSx0aGlzLl9zZWxlY3RvclF1ZXJ5fX1jbGFzcyBhYntjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jb21wb25lbnQ9dm9pZCAwLHRoaXMuX3BhZ2U9dCx0aGlzLl9xdWV1ZT1bXSx0aGlzLl9xdWV1ZUNiPVtdfWV4ZWModCl7cmV0dXJuIEJpKHRoaXMuX3BhZ2UsdGhpcy5fcXVldWUsbj0+e2xldCByPXRoaXMuX3F1ZXVlQ2I7bi5mb3JFYWNoKChvLGMpPT57ei5pc0FycmF5KG8pP28uZm9yRWFjaChyaCk6cmgobyk7bGV0IGc9cltjXTt6LmlzRnVuY3Rpb24oZykmJmcuY2FsbCh0aGlzLG8pfSksei5pc0Z1bmN0aW9uKHQpJiZ0LmNhbGwodGhpcyxuKX0pLHRoaXMuX25vZGVzUmVmfWluKHQpe3JldHVybiB0aGlzLl9jb21wb25lbnQ9Sy5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UodCksdGhpc31zZWxlY3QodCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyB4dSh0aGlzLHRoaXMuX2NvbXBvbmVudCx0LCEwKX1zZWxlY3RBbGwodCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyB4dSh0aGlzLHRoaXMuX2NvbXBvbmVudCx0LCExKX1zZWxlY3RWaWV3cG9ydCgpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgeHUodGhpcyxudWxsLCIiLCEwKX1fcHVzaCh0LG4scixvLGMpe3RoaXMuX3F1ZXVlLnB1c2goe2NvbXBvbmVudDpuLHNlbGVjdG9yOnQsc2luZ2xlOnIsZmllbGRzOm99KSx0aGlzLl9xdWV1ZUNiLnB1c2goYyl9fWxldCBzYj1MdCgiY3JlYXRlU2VsZWN0b3JRdWVyeSIsZT0+KGU9Sy5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSksZSYmIUhuKGUpJiYoZT1udWxsKSxuZXcgYWIoZXx8d3IoKSkpKSxsYj0iY3JlYXRlQW5pbWF0aW9uIixjYj17Zm9ybWF0QXJnczp7fX0sdWI9e2R1cmF0aW9uOk51bWJlcix0aW1pbmdGdW5jdGlvbjpTdHJpbmcsZGVsYXk6TnVtYmVyLHRyYW5zZm9ybU9yaWdpbjpTdHJpbmd9LGZiPXtkdXJhdGlvbjo0MDAsdGltaW5nRnVuY3Rpb246ImxpbmVhciIsZGVsYXk6MCx0cmFuc2Zvcm1PcmlnaW46IjUwJSA1MCUgMCJ9O2NsYXNzIGloe2NvbnN0cnVjdG9yKHQpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09e30sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMub3B0aW9uPXouZXh0ZW5kKHt9LGZiLHQpfV9nZXRPcHRpb24odCl7bGV0IG49e3RyYW5zaXRpb246ei5leHRlbmQoe30sdGhpcy5vcHRpb24sdCksdHJhbnNmb3JtT3JpZ2luOiIifTtyZXR1cm4gbi50cmFuc2Zvcm1PcmlnaW49bi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixkZWxldGUgbi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixufV9wdXNoQW5pbWF0ZXModCxuKXt0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMucHVzaCh7dHlwZTp0LGFyZ3M6bn0pfV9jb252ZXJUeXBlKHQpe3JldHVybiB0LnJlcGxhY2UoL1tBLVpdL2csbj0+YC0ke24udG9Mb3dlckNhc2UoKX1gKX1fZ2V0VmFsdWUodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj9gJHt0fXB4YDp0fWV4cG9ydCgpe2xldCB0PXRoaXMuYWN0aW9ucztyZXR1cm4gdGhpcy5hY3Rpb25zPVtdLHthY3Rpb25zOnR9fXN0ZXAodCl7cmV0dXJuIHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcy5mb3JFYWNoKG49PntuLnR5cGUhPT0ic3R5bGUiP3RoaXMuY3VycmVudFRyYW5zZm9ybVtuLnR5cGVdPW46dGhpcy5jdXJyZW50VHJhbnNmb3JtW2Ake24udHlwZX0uJHtuLmFyZ3NbMF19YF09bn0pLHRoaXMuYWN0aW9ucy5wdXNoKHthbmltYXRlczpPYmplY3QudmFsdWVzKHRoaXMuY3VycmVudFRyYW5zZm9ybSksb3B0aW9uOnRoaXMuX2dldE9wdGlvbih0KX0pLHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcz1bXSx0aGlzfX1sZXQgZGI9Sy5vbmNlKCgpPT57bGV0IGU9WyJtYXRyaXgiLCJtYXRyaXgzZCIsInJvdGF0ZSIsInJvdGF0ZTNkIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwic2NhbGUiLCJzY2FsZTNkIiwic2NhbGVYIiwic2NhbGVZIiwic2NhbGVaIiwic2tldyIsInNrZXdYIiwic2tld1kiLCJ0cmFuc2xhdGUiLCJ0cmFuc2xhdGUzZCIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiJdLHQ9WyJvcGFjaXR5IiwiYmFja2dyb3VuZENvbG9yIl0sbj1bIndpZHRoIiwiaGVpZ2h0IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl07ZS5jb25jYXQodCxuKS5mb3JFYWNoKHI9PntpaC5wcm90b3R5cGVbcl09ZnVuY3Rpb24oLi4ubyl7cmV0dXJuIHQuY29uY2F0KG4pLmluY2x1ZGVzKHIpP3RoaXMuX3B1c2hBbmltYXRlcygic3R5bGUiLFt0aGlzLl9jb252ZXJUeXBlKHIpLG4uaW5jbHVkZXMocik/dGhpcy5fZ2V0VmFsdWUob1swXSk6b1swXV0pOnRoaXMuX3B1c2hBbmltYXRlcyhyLG8pLHRoaXN9fSl9KSxoYj1MdChsYixlPT4oZGIoKSxuZXcgaWgoZSkpLHViLGNiKSxvaD0ib25UYWJCYXJNaWRCdXR0b25UYXAiLGdiPWduKG9oLCgpPT57fSkscGI9Im9uV2luZG93UmVzaXplIix2Yj0ib2ZmV2luZG93UmVzaXplIixtYj1nbihwYiwoKT0+e30pLF9iPWZpKHZiLCgpPT57fSksYWg9InNldExvY2FsZSIsYmI9ImdldExvY2FsZSIsc2g9Im9uTG9jYWxlQ2hhbmdlIixLbD1MdChiYiwoKT0+e2xldCBlPUN0KHthbGxvd0RlZmF1bHQ6ITB9KTtyZXR1cm4gZSYmZS4kdm0/ZS4kdm0uJGxvY2FsZTpndCgpLmdldExvY2FsZSgpfSksRWI9Z24oc2gsKCk9Pnt9KSx5Yj1MdChhaCxlPT57bGV0IHQ9Q3QoKTtyZXR1cm4gdCYmdC4kdm0uJGxvY2FsZSE9PWU/KHQuJHZtLiRsb2NhbGU9ZSxSbigpLmZvckVhY2gobz0+e290LnB1Ymxpc2hIYW5kbGVyKGFoLGUsby4kcGFnZS5pZCl9KSxmLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZXRMYW5ndWFnZShlKSxvdC5pbnZva2VPbkNhbGxiYWNrKHNoLHtsb2NhbGU6ZX0pLCEwKTohMX0pLFNiPUVlKCJzZXRQYWdlTWV0YSIsKGUse3Jlc29sdmU6dH0pPT57dChJbyh3cigpLGUpKX0pLGxoPSJnZXRTZWxlY3RlZFRleHRSYW5nZSIsd2I9RWUobGgsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57b3QuaW52b2tlVmlld01ldGhvZChsaCx7fSxoYSgpLHI9Pnt0eXBlb2Ygci5lbmQ9PSJ1bmRlZmluZWQiJiZ0eXBlb2Ygci5zdGFydD09InVuZGVmaW5lZCI/bigibm8gZm9jdXNlZCIpOnQocil9KX0pLFRjPXtbSy5PTl9VTkhBTkRMRV9SRUpFQ1RJT05dOltdLFtLLk9OX1BBR0VfTk9UX0ZPVU5EXTpbXSxbSy5PTl9FUlJPUl06W10sW0suT05fU0hPV106W10sW0suT05fSElERV06W119O2Z1bmN0aW9uIFpsKGUsdCl7bGV0IG49Q3Qoe2FsbG93RGVmYXVsdDohMH0pO2lmKG4mJm4uJHZtKXJldHVybiBtbi5pbmplY3RIb29rKGUsdCxuLiR2bS4kKTtUY1tlXS5wdXNoKHQpfWZ1bmN0aW9uIENiKGUpe09iamVjdC5rZXlzKFRjKS5mb3JFYWNoKHQ9PntUY1t0XS5mb3JFYWNoKG49Pnttbi5pbmplY3RIb29rKHQsbixlKX0pfSl9ZnVuY3Rpb24gWGwoZSx0KXtsZXQgbj1DdCh7YWxsb3dEZWZhdWx0OiEwfSk7aWYobiYmbi4kdm0pcmV0dXJuIFBhKG4uJHZtLGUsdCk7ei5yZW1vdmUoVGNbZV0sdCl9ZnVuY3Rpb24gQWIoZSl7WmwoSy5PTl9VTkhBTkRMRV9SRUpFQ1RJT04sZSl9ZnVuY3Rpb24gT2IoZSl7WGwoSy5PTl9VTkhBTkRMRV9SRUpFQ1RJT04sZSl9ZnVuY3Rpb24gVGIoZSl7WmwoSy5PTl9QQUdFX05PVF9GT1VORCxlKX1mdW5jdGlvbiBQYihlKXtYbChLLk9OX1BBR0VfTk9UX0ZPVU5ELGUpfWZ1bmN0aW9uIEliKGUpe1psKEsuT05fRVJST1IsZSl9ZnVuY3Rpb24gTmIoZSl7WGwoSy5PTl9FUlJPUixlKX1mdW5jdGlvbiBrYihlKXtabChLLk9OX1NIT1csZSl9ZnVuY3Rpb24gUmIoZSl7WGwoSy5PTl9TSE9XLGUpfWZ1bmN0aW9uIHhiKGUpe1psKEsuT05fSElERSxlKX1mdW5jdGlvbiBCYihlKXtYbChLLk9OX0hJREUsZSl9bGV0IE1iPUx0KCJnZXRFbnRlck9wdGlvbnNTeW5jIiwoKT0+RG8oKSksTGI9THQoImdldExhdW5jaE9wdGlvbnNTeW5jIiwoKT0+ZHMoKSksUWwsQnUsTXUsY2g7ZnVuY3Rpb24gdWgoZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBMdShlKXtpZihlLnR5cGU9PT0iZW5hYmxlZCIpTXU9ITAsY2g9ZS5vZmZsaW5lO2Vsc2UgaWYoZS50eXBlPT09ImNsaWVudElkIilRbD1lLmNpZCxCdT1lLmVyck1zZyxmaChRbCxlLmVyck1zZyk7ZWxzZSBpZihlLnR5cGU9PT0icHVzaE1zZyIpe2xldCB0PXt0eXBlOiJyZWNlaXZlIixkYXRhOnVoKGUubWVzc2FnZSl9O2ZvcihsZXQgbj0wO248T3MubGVuZ3RoJiYoT3Nbbl0odCksIXQuc3RvcHBlZCk7bisrKTt9ZWxzZSBlLnR5cGU9PT0iY2xpY2siJiZPcy5mb3JFYWNoKHQ9Pnt0KHt0eXBlOiJjbGljayIsZGF0YTp1aChlLm1lc3NhZ2UpfSl9KX1sZXQgRHU9W107ZnVuY3Rpb24gZmgoZSx0KXtEdS5mb3JFYWNoKG49PntuKGUsdCl9KSxEdS5sZW5ndGg9MH1sZXQgRGI9RWUoImdldFB1c2hDbGllbnRJZCIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57aWYoY2gpe3MucHVzaC5nZXRDbGllbnRJbmZvQXN5bmMocj0+e3Qoe2NpZDpyLmNsaWVudGlkfSl9LHI9PntuKHIuY29kZSsiOiAiK3IubWVzc2FnZSl9KTtyZXR1cm59UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3R5cGVvZiBNdT09InVuZGVmaW5lZCImJihNdT0hMSxRbD0iIixCdT0idW5pUHVzaCBpcyBub3QgZW5hYmxlZCIpLER1LnB1c2goKHIsbyk9PntyP3Qoe2NpZDpyfSk6bihvKX0pLHR5cGVvZiBRbCE9InVuZGVmaW5lZCImJmZoKFFsLEJ1KX0pfSksT3M9W10sZGg9ITEsRmI9ZT0+e09zLmluZGV4T2YoZSk9PT0tMSYmT3MucHVzaChlKSxkaHx8KGRoPSEwLHMucHVzaC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdD0+e0x1KHt0eXBlOiJjbGljayIsbWVzc2FnZTp0fSl9KSxzLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigicmVjZWl2ZSIsdD0+e0x1KHt0eXBlOiJwdXNoTXNnIixtZXNzYWdlOnR9KX0pKX0sVmI9ZT0+e2lmKCFlKU9zLmxlbmd0aD0wO2Vsc2V7bGV0IHQ9T3MuaW5kZXhPZihlKTt0Pi0xJiZPcy5zcGxpY2UodCwxKX19LFViPSJjYW5JVXNlIiwkYj1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxIYj0iZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsamI9Im1ha2VQaG9uZUNhbGwiLHpiPXtwaG9uZU51bWJlcjpTdHJpbmd9LFdiPSJhZGRQaG9uZUNvbnRhY3QiLEdiPXtmb3JtYXRBcmdzOntmaXJzdE5hbWUoZSl7aWYoIWUpcmV0dXJuImFkZFBob25lQ29udGFjdDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLmZpcnN0TmFtZSBzaG91bGQgbm90IGJlIGVtcHR5OyJ9fX0sWWI9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHBob3RvRmlsZVBhdGg6U3RyaW5nLG5pY2tOYW1lOlN0cmluZyxsYXN0TmFtZTpTdHJpbmcsbWlkZGxlTmFtZTpTdHJpbmcscmVtYXJrOlN0cmluZyxtb2JpbGVQaG9uZU51bWJlcjpTdHJpbmcsd2VDaGF0TnVtYmVyOlN0cmluZyxhZGRyZXNzQ291bnRyeTpTdHJpbmcsYWRkcmVzc1N0YXRlOlN0cmluZyxhZGRyZXNzQ2l0eTpTdHJpbmcsYWRkcmVzc1N0cmVldDpTdHJpbmcsYWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLG9yZ2FuaXphdGlvbjpTdHJpbmcsdGl0bGU6U3RyaW5nLHdvcmtGYXhOdW1iZXI6U3RyaW5nLHdvcmtQaG9uZU51bWJlcjpTdHJpbmcsaG9zdE51bWJlcjpTdHJpbmcsZW1haWw6U3RyaW5nLHVybDpTdHJpbmcsd29ya0FkZHJlc3NDb3VudHJ5OlN0cmluZyx3b3JrQWRkcmVzc1N0YXRlOlN0cmluZyx3b3JrQWRkcmVzc0NpdHk6U3RyaW5nLHdvcmtBZGRyZXNzU3RyZWV0OlN0cmluZyx3b3JrQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLGhvbWVGYXhOdW1iZXI6U3RyaW5nLGhvbWVQaG9uZU51bWJlcjpTdHJpbmcsaG9tZUFkZHJlc3NDb3VudHJ5OlN0cmluZyxob21lQWRkcmVzc1N0YXRlOlN0cmluZyxob21lQWRkcmVzc0NpdHk6U3RyaW5nLGhvbWVBZGRyZXNzU3RyZWV0OlN0cmluZyxob21lQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nfSxxYj0iZ2V0Q2xpcGJvYXJkRGF0YSIsSmI9InNldENsaXBib2FyZERhdGEiLEtiPXtmb3JtYXRBcmdzOntzaG93VG9hc3Q6ITB9LGJlZm9yZUludm9rZSgpe210KCl9LGJlZm9yZVN1Y2Nlc3MoZSx0KXtpZighdC5zaG93VG9hc3QpcmV0dXJuO2xldHt0Om59PWd0KCkscj1uKCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIik7ciYmUC5zaG93VG9hc3Qoe3RpdGxlOnIsaWNvbjoic3VjY2VzcyIsbWFzazohMX0pfX0sWmI9e2RhdGE6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzaG93VG9hc3Q6e3R5cGU6Qm9vbGVhbn19LGhoPSJvbkFjY2VsZXJvbWV0ZXIiLFhiPSJvZmZBY2NlbGVyb21ldGVyIixRYj0ic3RhcnRBY2NlbGVyb21ldGVyIixlMD0ic3RvcEFjY2VsZXJvbWV0ZXIiLGdoPSJvbkNvbXBhc3MiLHQwPSJvZmZDb21wYXNzIixuMD0ic3RhcnRDb21wYXNzIixyMD0ic3RvcENvbXBhc3MiLGkwPSJ2aWJyYXRlU2hvcnQiLG8wPSJ2aWJyYXRlTG9uZyIscGg9Im9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiLHZoPSJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIsbWg9Im9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIixfaD0ib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIixhMD0ic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IixzMD17c2VydmljZXM6QXJyYXksYWxsb3dEdXBsaWNhdGVzS2V5OkJvb2xlYW4saW50ZXJ2YWw6TnVtYmVyfSxsMD0iZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsYzA9e3NlcnZpY2VzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfX0sdTA9ImNyZWF0ZUJMRUNvbm5lY3Rpb24iLGYwPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxkMD0iY2xvc2VCTEVDb25uZWN0aW9uIixoMD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sZzA9ImdldEJMRURldmljZVNlcnZpY2VzIixwMD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sdjA9ImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsbTA9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LF8wPSJub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIixiMD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc3RhdGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMH19LEUwPSJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIseTA9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sY2hhcmFjdGVyaXN0aWNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxTMD0id3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIix3MD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sdmFsdWU6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9fSxDMD0ic2V0QkxFTVRVIixBMD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxtdHU6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfX0sTzA9ImdldEJMRURldmljZVJTU0kiLFQwPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxiaD0ib25CZWFjb25VcGRhdGUiLEVoPSJvbkJlYWNvblNlcnZpY2VDaGFuZ2UiLFAwPSJnZXRCZWFjb25zIixJMD0ic3RhcnRCZWFjb25EaXNjb3ZlcnkiLE4wPXt1dWlkczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH19LGswPSJzdG9wQmVhY29uRGlzY292ZXJ5IixSMD0iZ2V0U2NyZWVuQnJpZ2h0bmVzcyIseDA9InNldFNjcmVlbkJyaWdodG5lc3MiLEIwPSJzZXRLZWVwU2NyZWVuT24iLE0wPSJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb24iLEwwPSJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlIixEMD1bImZpbmdlclByaW50IiwiZmFjaWFsIiwic3BlZWNoIl0sRjA9e2Zvcm1hdEFyZ3M6e2NoZWNrQXV0aE1vZGUoZSx0KXtpZighZXx8IUQwLmluY2x1ZGVzKGUpKXJldHVybiJjaGVja0F1dGhNb2RlIFx1NTg2Qlx1NTE5OVx1OTUxOVx1OEJFRiJ9fX0sVjA9e2NoZWNrQXV0aE1vZGU6U3RyaW5nfSxVMD0ic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uIiwkMD17Zm9ybWF0QXJnczp7cmVxdWVzdEF1dGhNb2RlcyhlLHQpe2lmKCFlLmluY2x1ZGVzKCJmaW5nZXJQcmludCIpJiYhZS5pbmNsdWRlcygiZmFjaWFsIikpcmV0dXJuInJlcXVlc3RBdXRoTW9kZXMgXHU1ODZCXHU1MTk5XHU5NTE5XHU4QkVGIn19fSxIMD17cmVxdWVzdEF1dGhNb2Rlczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH0sY2hhbGxlbmdlOlN0cmluZyxhdXRoQ29udGVudDpTdHJpbmd9LGowPSJzY2FuQ29kZSIsejA9e29ubHlGcm9tQ2FtZXJhOkJvb2xlYW4sc2NhblR5cGU6QXJyYXksYXV0b0RlY29kZUNoYXJTZXQ6Qm9vbGVhbixzb3VuZDpTdHJpbmcsYXV0b1pvb206Qm9vbGVhbn0sVzA9WyJkZWZhdWx0Iiwibm9uZSJdLEcwPXtmb3JtYXRBcmdzOntzb3VuZChlLHQpe1cwLmluY2x1ZGVzKGUpfHwodC5zb3VuZD0ibm9uZSIpfSxhdXRvWm9vbShlLHQpe3R5cGVvZiBlPT0idW5kZWZpbmVkIiYmKHQuYXV0b1pvb209ITApfX19LFkwPSJnZXRTeXN0ZW1TZXR0aW5nIixxMD0iZ2V0QXBwQXV0aG9yaXplU2V0dGluZyIsSjA9Im9wZW5BcHBBdXRob3JpemVTZXR0aW5nIixLMD0iZ2V0U3RvcmFnZSIseWg9e2tleTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxaMD0iZ2V0U3RvcmFnZVN5bmMiLFNoPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLFgwPSJzZXRTdG9yYWdlIixRMD17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGF0YTp7cmVxdWlyZWQ6ITB9fSxlRT0ic2V0U3RvcmFnZVN5bmMiLHRFPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImRhdGEiLHJlcXVpcmVkOiEwfV0sd2g9InJlbW92ZVN0b3JhZ2UiLG5FPXloLHJFPVNoLGlFPSJzYXZlRmlsZSIsb0U9e2Zvcm1hdEFyZ3M6e3RlbXBGaWxlUGF0aChlLHQpe3QudGVtcEZpbGVQYXRoPUhlKGUpfX19LGFFPXt0ZW1wRmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sc0U9ImdldFNhdmVkRmlsZUxpc3QiLGxFPSJyZW1vdmVTYXZlZEZpbGUiLGNFPXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9SGUoZSl9fX0sdUU9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGZFPSJnZXRGaWxlSW5mbyIsZEU9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1IZShlKX19fSxoRT17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sZ0U9ImdldFNhdmVkRmlsZUluZm8iLHBFPXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9SGUoZSl9fX0sdkU9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LG1FPSJvcGVuRG9jdW1lbnQiLF9FPXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9SGUoZSl9fX0sYkU9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6U3RyaW5nfSxFRT0iaGlkZUtleWJvYXJkIix5RT0ic2hvd0tleWJvYXJkIixTRT0iY2hvb3NlTG9jYXRpb24iLHdFPXtrZXl3b3JkOlN0cmluZyxsYXRpdHVkZTpOdW1iZXIsbG9uZ2l0dWRlOk51bWJlcn0sQ0U9ImdldExvY2F0aW9uIixDaD1bIndnczg0IiwiZ2NqMDIiXSxBRT17Zm9ybWF0QXJnczp7dHlwZShlLHQpe2U9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLENoLmluZGV4T2YoZSk9PT0tMT90LnR5cGU9Q2hbMF06dC50eXBlPWV9LGFsdGl0dWRlKGUsdCl7dC5hbHRpdHVkZT1lfHwhMX19fSxPRT17dHlwZTpTdHJpbmcsYWx0aXR1ZGU6Qm9vbGVhbn0sVEU9Im9wZW5Mb2NhdGlvbiIsQWg9KGUsdCk9PntpZih0PT09dm9pZCAwKXJldHVybmAke2V9IHNob3VsZCBub3QgYmUgZW1wdHkuYDtpZih0eXBlb2YgdCE9Im51bWJlciIpe2xldCBuPXR5cGVvZiB0O3JldHVybiBuPW5bMF0udG9VcHBlckNhc2UoKStuLnN1YnN0cmluZygxKSxgRXhwZWN0ZWQgTnVtYmVyLCBnb3QgJHtufSB3aXRoIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkodCl9LmB9fSxQRT17Zm9ybWF0QXJnczp7bGF0aXR1ZGUoZSx0KXtsZXQgbj1BaCgibGF0aXR1ZGUiLGUpO2lmKG4pcmV0dXJuIG47dC5sYXRpdHVkZT1lfSxsb25naXR1ZGUoZSx0KXtsZXQgbj1BaCgibG9uZ2l0dWRlIixlKTtpZihuKXJldHVybiBuO3QubG9uZ2l0dWRlPWV9LHNjYWxlKGUsdCl7ZT1NYXRoLmZsb29yKGUpLHQuc2NhbGU9ZT49NSYmZTw9MTg/ZToxOH19fSxJRT17bGF0aXR1ZGU6TnVtYmVyLGxvbmdpdHVkZTpOdW1iZXIsc2NhbGU6TnVtYmVyLG5hbWU6U3RyaW5nLGFkZHJlc3M6U3RyaW5nfSxORT0iY2hvb3NlSW1hZ2UiLGtFPXtmb3JtYXRBcmdzOntjb3VudChlLHQpeyghZXx8ZTw9MCkmJih0LmNvdW50PTkpfSxzaXplVHlwZShlLHQpe3Quc2l6ZVR5cGU9X3IoZSxFaSl9LHNvdXJjZVR5cGUoZSx0KXt0LnNvdXJjZVR5cGU9X3IoZSxYcil9LGV4dGVuc2lvbihlLHQpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSYmZS5sZW5ndGg9PT0wKXJldHVybiJwYXJhbSBleHRlbnNpb24gc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2V8fCh0LmV4dGVuc2lvbj1bIioiXSl9fX0sUkU9e2NvdW50Ok51bWJlcixzaXplVHlwZTpbQXJyYXksU3RyaW5nXSxzb3VyY2VUeXBlOkFycmF5LGV4dGVuc2lvbjpBcnJheX0seEU9ImNob29zZVZpZGVvIixCRT17Zm9ybWF0QXJnczp7c291cmNlVHlwZShlLHQpe3Quc291cmNlVHlwZT1fcihlLFhyKX0sY29tcHJlc3NlZDohMCxtYXhEdXJhdGlvbjo2MCxjYW1lcmE6ImJhY2siLGV4dGVuc2lvbihlLHQpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSYmZS5sZW5ndGg9PT0wKXJldHVybiJwYXJhbSBleHRlbnNpb24gc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2V8fCh0LmV4dGVuc2lvbj1bIioiXSl9fX0sTUU9e3NvdXJjZVR5cGU6QXJyYXksY29tcHJlc3NlZDpCb29sZWFuLG1heER1cmF0aW9uOk51bWJlcixjYW1lcmE6U3RyaW5nLGV4dGVuc2lvbjpBcnJheX0sTEU9ImdldEltYWdlSW5mbyIsREU9e2Zvcm1hdEFyZ3M6e3NyYyhlLHQpe3Quc3JjPUhlKGUpfX19LEZFPXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sVkU9InByZXZpZXdJbWFnZSIsVUU9e2Zvcm1hdEFyZ3M6e3VybHMoZSx0KXt0LnVybHM9ZS5tYXAobj0+ei5pc1N0cmluZyhuKSYmbj9IZShuKToiIil9LGN1cnJlbnQoZSx0KXt0eXBlb2YgZT09Im51bWJlciI/dC5jdXJyZW50PWU+MCYmZTx0LnVybHMubGVuZ3RoP2U6MDp6LmlzU3RyaW5nKGUpJiZlJiYodC5jdXJyZW50PUhlKGUpKX19fSwkRT17dXJsczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH0sY3VycmVudDp7dHlwZTpbTnVtYmVyLFN0cmluZ119fSxIRT0iY2xvc2VQcmV2aWV3SW1hZ2UiLGpFPSJnZXRWaWRlb0luZm8iLHpFPXtmb3JtYXRBcmdzOntzcmMoZSx0KXt0LnNyYz1IZShlKX19fSxXRT17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LEdFPSJzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtIixZRT17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPUhlKGUpfX19LHFFPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxKRT0ic2F2ZVZpZGVvVG9QaG90b3NBbGJ1bSIsS0U9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1IZShlKX19fSxaRT17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sWEU9ImdldFJlY29yZGVyTWFuYWdlciIsUUU9ImNvbXByZXNzSW1hZ2UiLGV5PXtmb3JtYXRBcmdzOntzcmMoZSx0KXt0LnNyYz1IZShlKX19fSx0eT17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LG55PSJjb21wcmVzc1ZpZGVvIixyeT17Zm9ybWF0QXJnczp7c3JjKGUsdCl7dC5zcmM9SGUoZSl9fX0saXk9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHF1YWxpdHk6U3RyaW5nLGJpdHJhdGU6TnVtYmVyLGZwczpOdW1iZXIscmVzb2x1dGlvbjpOdW1iZXJ9LG95PSJyZXF1ZXN0IixheT17SlNPTjoianNvbiJ9LHN5PVsidGV4dCIsImFycmF5YnVmZmVyIl0sbHk9InRleHQiLE9oPWVuY29kZVVSSUNvbXBvbmVudDtmdW5jdGlvbiBjeShlLHQpe2xldCBuPWUuc3BsaXQoIiMiKSxyPW5bMV18fCIiO249blswXS5zcGxpdCgiPyIpO2xldCBvPW5bMV18fCIiO2U9blswXTtsZXQgYz1vLnNwbGl0KCImIikuZmlsdGVyKGI9PmIpLGc9e307Yy5mb3JFYWNoKGI9PntsZXQgVj1iLnNwbGl0KCI9Iik7Z1tWWzBdXT1WWzFdfSk7Zm9yKGxldCBiIGluIHQpaWYoei5oYXNPd24odCxiKSl7bGV0IFY9dFtiXTt0eXBlb2YgVj09InVuZGVmaW5lZCJ8fFY9PT1udWxsP1Y9IiI6ei5pc1BsYWluT2JqZWN0KFYpJiYoVj1KU09OLnN0cmluZ2lmeShWKSksZ1tPaChiKV09T2goVil9cmV0dXJuIG89T2JqZWN0LmtleXMoZykubWFwKGI9PmAke2J9PSR7Z1tiXX1gKS5qb2luKCImIiksZSsobz8iPyIrbzoiIikrKHI/IiMiK3I6IiIpfWxldCB1eT17bWV0aG9kOlN0cmluZyxkYXRhOltPYmplY3QsU3RyaW5nLEFycmF5LEFycmF5QnVmZmVyXSx1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6T2JqZWN0LGRhdGFUeXBlOlN0cmluZyxyZXNwb25zZVR5cGU6U3RyaW5nLHdpdGhDcmVkZW50aWFsczpCb29sZWFufSxmeT17Zm9ybWF0QXJnczp7bWV0aG9kKGUsdCl7dC5tZXRob2Q9Q24oKGV8fCIiKS50b1VwcGVyQ2FzZSgpLG1yKX0sZGF0YShlLHQpe3QuZGF0YT1lfHwiIn0sdXJsKGUsdCl7dC5tZXRob2Q9PT1tclswXSYmei5pc1BsYWluT2JqZWN0KHQuZGF0YSkmJk9iamVjdC5rZXlzKHQuZGF0YSkubGVuZ3RoJiYodC51cmw9Y3koZSx0LmRhdGEpKX0saGVhZGVyKGUsdCl7bGV0IG49dC5oZWFkZXI9ZXx8e307dC5tZXRob2QhPT1tclswXSYmKE9iamVjdC5rZXlzKG4pLmZpbmQocj0+ci50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSIpfHwoblsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL2pzb24iKSl9LGRhdGFUeXBlKGUsdCl7dC5kYXRhVHlwZT0oZXx8YXkuSlNPTikudG9Mb3dlckNhc2UoKX0scmVzcG9uc2VUeXBlKGUsdCl7dC5yZXNwb25zZVR5cGU9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLHN5LmluZGV4T2YodC5yZXNwb25zZVR5cGUpPT09LTEmJih0LnJlc3BvbnNlVHlwZT1seSl9fX0sZHk9ImNvbmZpZ01UTFMiLGh5PXtjZXJ0aWZpY2F0ZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9fSxneT17Zm9ybWF0QXJnczp7Y2VydGlmaWNhdGVzKGUpe2lmKGUuc29tZSh0PT56LnRvUmF3VHlwZSh0Lmhvc3QpIT09IlN0cmluZyIpKXJldHVybiJcdTUzQzJcdTY1NzBcdTkxNERcdTdGNkVcdTk1MTlcdThCRUZcdUZGMENcdThCRjdcdTc4NkVcdThCQTRcdTU0MEVcdTkxQ0RcdThCRDUifX19LHB5PSJkb3dubG9hZEZpbGUiLHZ5PXtmb3JtYXRBcmdzOntoZWFkZXIoZSx0KXt0LmhlYWRlcj1lfHx7fX19fSxteT17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOk9iamVjdCx0aW1lb3V0Ok51bWJlcn0sX3k9InVwbG9hZEZpbGUiLGJ5PXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe2UmJih0LmZpbGVQYXRoPUhlKGUpKX0saGVhZGVyKGUsdCl7dC5oZWFkZXI9ZXx8e319LGZvcm1EYXRhKGUsdCl7dC5mb3JtRGF0YT1lfHx7fX19fSxFeT17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZXM6QXJyYXksZmlsZVBhdGg6U3RyaW5nLG5hbWU6U3RyaW5nLGhlYWRlcjpPYmplY3QsZm9ybURhdGE6T2JqZWN0LHRpbWVvdXQ6TnVtYmVyfSx5eT0iY29ubmVjdFNvY2tldCIsU3k9e2Zvcm1hdEFyZ3M6e2hlYWRlcihlLHQpe3QuaGVhZGVyPWV8fHt9fSxtZXRob2QoZSx0KXt0Lm1ldGhvZD1DbigoZXx8IiIpLnRvVXBwZXJDYXNlKCksbXIpfSxwcm90b2NvbHMoZSx0KXt6LmlzU3RyaW5nKGUpJiYodC5wcm90b2NvbHM9W2VdKX19fSx3eT17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOnt0eXBlOk9iamVjdH0sbWV0aG9kOlN0cmluZyxwcm90b2NvbHM6W0FycmF5LFN0cmluZ119LEN5PSJzZW5kU29ja2V0TWVzc2FnZSIsQXk9e2RhdGE6W1N0cmluZyxBcnJheUJ1ZmZlcl19LE95PSJjbG9zZVNvY2tldCIsVHk9e2NvZGU6TnVtYmVyLHJlYXNvbjpTdHJpbmd9LFB5PSJzdGFydExvY2F0aW9uVXBkYXRlIixUaD0ib25Mb2NhdGlvbkNoYW5nZSIsSXk9InN0b3BMb2NhdGlvblVwZGF0ZSIsTnk9Im9mZkxvY2F0aW9uQ2hhbmdlIixreT0ib2ZmTG9jYXRpb25DaGFuZ2VFcnJvciIsUGg9Im9uTG9jYXRpb25DaGFuZ2VFcnJvciIsSWg9WyJ3Z3M4NCIsImdjajAyIl0sUnk9e3R5cGU6U3RyaW5nfSx4eT17Zm9ybWF0QXJnczp7dHlwZShlLHQpe2U9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLEloLmluZGV4T2YoZSk9PT0tMT90LnR5cGU9SWhbMV06dC50eXBlPWV9fX07ZnVuY3Rpb24gQnkoZSl7aWYoIXouaXNTdHJpbmcoZSkpcmV0dXJuIGU7bGV0IHQ9ZS5pbmRleE9mKCI/Iik7aWYodD09PS0xKXJldHVybiBlO2xldCBuPWUuc2xpY2UodCsxKS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIik7aWYoIW4pcmV0dXJuIGU7ZT1lLnNsaWNlKDAsdCk7bGV0IHI9W107cmV0dXJuIG4uc3BsaXQoIiYiKS5mb3JFYWNoKG89PntsZXQgYz1vLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLGc9Yy5zaGlmdCgpLGI9Yy5sZW5ndGg+MD9jLmpvaW4oIj0iKToiIjtyLnB1c2goZysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKX0pLHIubGVuZ3RoP2UrIj8iK3Iuam9pbigiJiIpOmV9bGV0IE15PVsic2xpZGUtaW4tcmlnaHQiLCJzbGlkZS1pbi1sZWZ0Iiwic2xpZGUtaW4tdG9wIiwic2xpZGUtaW4tYm90dG9tIiwiZmFkZS1pbiIsInpvb20tb3V0Iiwiem9vbS1mYWRlLW91dCIsInBvcC1pbiIsIm5vbmUiXSxMeT1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLENsPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sRnU9Im5hdmlnYXRlVG8iLFZ1PSJyZWRpcmVjdFRvIixOaD0icmVMYXVuY2giLFBjPSJzd2l0Y2hUYWIiLER5PSJuYXZpZ2F0ZUJhY2siLFV1PSJwcmVsb2FkUGFnZSIsa2g9InVuUHJlbG9hZFBhZ2UiLEZ5PXouZXh0ZW5kKHt9LENsLFJoKE15KSksVnk9ei5leHRlbmQoe2RlbHRhOnt0eXBlOk51bWJlcn19LFJoKEx5KSksVXk9Q2wsJHk9Q2wsSHk9Q2wsank9Q2wsenk9Q2wsV3k9TmMoRnUpLEd5PU5jKFZ1KSxZeT1OYyhOaCkscXk9TmMoUGMpLEp5PXtmb3JtYXRBcmdzOntkZWx0YShlLHQpe2U9cGFyc2VJbnQoZSsiIil8fDEsdC5kZWx0YT1NYXRoLm1pbihSbigpLmxlbmd0aC0xLGUpfX19O2Z1bmN0aW9uIFJoKGUpe3JldHVybnthbmltYXRpb25UeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3IodCl7aWYodCYmZS5pbmRleE9mKHQpPT09LTEpcmV0dXJuImAiK3QrImAgaXMgbm90IHN1cHBvcnRlZCBmb3IgYGFuaW1hdGlvblR5cGVgIChzdXBwb3J0ZWQgdmFsdWVzIGFyZTogYCIrZS5qb2luKCJgfGAiKSsiYCkifX0sYW5pbWF0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyfX19bGV0IEljO2Z1bmN0aW9uIEt5KCl7SWM9IiJ9ZnVuY3Rpb24gTmMoZSl7cmV0dXJue2Zvcm1hdEFyZ3M6e3VybDpaeShlKX0sYmVmb3JlQWxsOkt5fX1mdW5jdGlvbiBaeShlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZighbilyZXR1cm4nTWlzc2luZyByZXF1aXJlZCBhcmdzOiAidXJsIic7bj14byhuKTtsZXQgbz1uLnNwbGl0KCI/IilbMF0sYz1LaShvLCEwKTtpZighYylyZXR1cm4icGFnZSBgIituKyJgIGlzIG5vdCBmb3VuZCI7aWYoZT09PUZ1fHxlPT09VnUpe2lmKGMubWV0YS5pc1RhYkJhcilyZXR1cm5gY2FuIG5vdCAke2V9IGEgdGFiYmFyIHBhZ2VgfWVsc2UgaWYoZT09PVBjJiYhYy5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90IHN3aXRjaCB0byBuby10YWJCYXIgcGFnZSI7aWYoKGU9PT1QY3x8ZT09PVV1KSYmYy5tZXRhLmlzVGFiQmFyJiZyLm9wZW5UeXBlIT09ImFwcExhdW5jaCImJihuPW8pLGMubWV0YS5pc0VudHJ5JiYobj1uLnJlcGxhY2UoYy5hbGlhcywiLyIpKSxyLnVybD1CeShuKSxlIT09a2gpe2lmKGU9PT1VdSl7aWYoIWMubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYoYy5tZXRhLmlzVGFiQmFyKXtsZXQgZz1SbigpLGI9Yy5wYXRoLnNsaWNlKDEpO2lmKGcuZmluZChWPT5WLnJvdXRlPT09YikpcmV0dXJuInRhYkJhciBwYWdlIGAiK2IrImAgYWxyZWFkeSBleGlzdHMifXJldHVybn1pZihJYz09PW4mJnIub3BlblR5cGUhPT0iYXBwTGF1bmNoIilyZXR1cm5gJHtJY30gbG9ja2VkYDtSLnJlYWR5JiYoSWM9bil9fX1sZXQgWHk9ImhpZGVMb2FkaW5nIixReT0iaGlkZVRvYXN0Iix4aD0ibG9hZEZvbnRGYWNlIixlUz17ZmFtaWx5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc291cmNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzYzpPYmplY3R9LHRTPVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxuUz0ic2V0TmF2aWdhdGlvbkJhckNvbG9yIixyUz17Zm9ybWF0QXJnczp7YW5pbWF0aW9uKGUsdCl7ZXx8KGU9e2R1cmF0aW9uOjAsdGltaW5nRnVuYzoibGluZWFyIn0pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0saVM9e2Zyb250Q29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcihlKXtpZih0Uy5pbmRleE9mKGUpPT09LTEpcmV0dXJuYGludmFsaWQgZnJvbnRDb2xvciAiJHtlfSJgfX0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sYW5pbWF0aW9uOk9iamVjdH0sb1M9InNldE5hdmlnYXRpb25CYXJUaXRsZSIsYVM9e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LHNTPSJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmciLGxTPSJoaWRlTmF2aWdhdGlvbkJhckxvYWRpbmciLEJoPSJwYWdlU2Nyb2xsVG8iLGNTPXtzY3JvbGxUb3A6TnVtYmVyLHNlbGVjdG9yOlN0cmluZyxkdXJhdGlvbjpOdW1iZXJ9LHVTPXtmb3JtYXRBcmdzOntkdXJhdGlvbjozMDB9fSxmUz0ic2hvd0FjdGlvblNoZWV0IixkUz17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHRpdGxlOlN0cmluZyxpdGVtQ29sb3I6U3RyaW5nLHBvcG92ZXI6T2JqZWN0fSxoUz17Zm9ybWF0QXJnczp7aXRlbUNvbG9yOiIjMDAwIn19LGdTPSJzaG93TG9hZGluZyIscFM9e3RpdGxlOlN0cmluZyxtYXNrOkJvb2xlYW59LHZTPXtmb3JtYXRBcmdzOnt0aXRsZToiIixtYXNrOiExfX0sbVM9InNob3dNb2RhbCIsX1M9e3RpdGxlOlN0cmluZyxjb250ZW50OlN0cmluZyxzaG93Q2FuY2VsOkJvb2xlYW4sY2FuY2VsVGV4dDpTdHJpbmcsY2FuY2VsQ29sb3I6U3RyaW5nLGNvbmZpcm1UZXh0OlN0cmluZyxjb25maXJtQ29sb3I6U3RyaW5nfSxiUz17YmVmb3JlSW52b2tlKCl7b2UoKX0sZm9ybWF0QXJnczp7dGl0bGU6IiIsY29udGVudDoiIixwbGFjZWhvbGRlclRleHQ6IiIsc2hvd0NhbmNlbDohMCxlZGl0YWJsZTohMSxjYW5jZWxUZXh0KGUsdCl7aWYoIXouaGFzT3duKHQsImNhbmNlbFRleHQiKSl7bGV0e3Q6bn09Z3QoKTt0LmNhbmNlbFRleHQ9bigidW5pLnNob3dNb2RhbC5jYW5jZWwiKX19LGNhbmNlbENvbG9yOiIjMDAwIixjb25maXJtVGV4dChlLHQpe2lmKCF6Lmhhc093bih0LCJjb25maXJtVGV4dCIpKXtsZXR7dDpufT1ndCgpO3QuY29uZmlybVRleHQ9bigidW5pLnNob3dNb2RhbC5jb25maXJtIil9fSxjb25maXJtQ29sb3I6Sy5QUklNQVJZX0NPTE9SfX0sRVM9InNob3dUb2FzdCIseVM9WyJzdWNjZXNzIiwibG9hZGluZyIsIm5vbmUiLCJlcnJvciJdLFNTPXt0aXRsZTpTdHJpbmcsaWNvbjpTdHJpbmcsaW1hZ2U6U3RyaW5nLGR1cmF0aW9uOk51bWJlcixtYXNrOkJvb2xlYW59LHdTPXtmb3JtYXRBcmdzOnt0aXRsZToiIixpY29uKGUsdCl7dC5pY29uPUNuKGUseVMpfSxpbWFnZShlLHQpe2U/dC5pbWFnZT1IZShlKTp0LmltYWdlPSIifSxkdXJhdGlvbjoxNTAwLG1hc2s6ITF9fSxDUz0ic3RhcnRQdWxsRG93blJlZnJlc2giLEFTPSJzdG9wUHVsbERvd25SZWZyZXNoIixlYz17aW5kZXg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfX0sVHM9e2JlZm9yZUludm9rZSgpe2xldCBlPWlzKCk7aWYoZSYmIWUuaXNUYWJCYXIpcmV0dXJuIm5vdCBUYWJCYXIgcGFnZSJ9LGZvcm1hdEFyZ3M6e2luZGV4KGUpe2lmKCFSLnRhYkJhci5saXN0W2VdKXJldHVybiJ0YWJiYXIgaXRlbSBub3QgZm91bmQifX19LE9TPSJzZXRUYWJCYXJJdGVtIixUUz16LmV4dGVuZCh7dGV4dDpTdHJpbmcsaWNvblBhdGg6U3RyaW5nLHNlbGVjdGVkSWNvblBhdGg6U3RyaW5nLHBhZ2VQYXRoOlN0cmluZ30sZWMpLFBTPXtiZWZvcmVJbnZva2U6VHMuYmVmb3JlSW52b2tlLGZvcm1hdEFyZ3M6ei5leHRlbmQoe3BhZ2VQYXRoKGUsdCl7ZSYmKHQucGFnZVBhdGg9Sy5yZW1vdmVMZWFkaW5nU2xhc2goZSkpfX0sVHMuZm9ybWF0QXJncyl9LElTPSJzZXRUYWJCYXJTdHlsZSIsTlM9e2NvbG9yOlN0cmluZyxzZWxlY3RlZENvbG9yOlN0cmluZyxiYWNrZ3JvdW5kQ29sb3I6U3RyaW5nLGJhY2tncm91bmRJbWFnZTpTdHJpbmcsYmFja2dyb3VuZFJlcGVhdDpTdHJpbmcsYm9yZGVyU3R5bGU6U3RyaW5nfSxrUz0vXihsaW5lYXJ8cmFkaWFsKS1ncmFkaWVudFwoLis/XCk7PyQvLFJTPXtiZWZvcmVJbnZva2U6VHMuYmVmb3JlSW52b2tlLGZvcm1hdEFyZ3M6e2JhY2tncm91bmRJbWFnZShlLHQpe2UmJiFrUy50ZXN0KGUpJiYodC5iYWNrZ3JvdW5kSW1hZ2U9SGUoZSkpfSxib3JkZXJTdHlsZShlLHQpe2UmJih0LmJvcmRlclN0eWxlPWU9PT0id2hpdGUiPyJ3aGl0ZSI6ImJsYWNrIil9fX0seFM9ImhpZGVUYWJCYXIiLE1oPXthbmltYXRpb246Qm9vbGVhbn0sQlM9InNob3dUYWJCYXIiLE1TPU1oLExTPSJoaWRlVGFiQmFyUmVkRG90IixEUz1lYyxGUz1UcyxWUz0ic2hvd1RhYkJhclJlZERvdCIsVVM9ZWMsJFM9VHMsSFM9InJlbW92ZVRhYkJhckJhZGdlIixqUz1lYyx6Uz1UcyxXUz0ic2V0VGFiQmFyQmFkZ2UiLEdTPXouZXh0ZW5kKHt0ZXh0Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGVjKSxZUz17YmVmb3JlSW52b2tlOlRzLmJlZm9yZUludm9rZSxmb3JtYXRBcmdzOnouZXh0ZW5kKHt0ZXh0KGUsdCl7Sy5nZXRMZW4oZSk+PTQmJih0LnRleHQ9Ii4uLiIpfX0sVHMuZm9ybWF0QXJncyl9LHFTPSJnZXRQcm92aWRlciIsSlM9e3NlcnZpY2U6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sS1M9ImxvZ2luIixaUz17cHJvdmlkZXI6U3RyaW5nLHNjb3BlczpbU3RyaW5nLEFycmF5XSx0aW1lb3V0Ok51bWJlcix1bml2ZXJpZnlTdHlsZTpPYmplY3Qsb25seUF1dGhvcml6ZTpCb29sZWFufSxYUz0iZ2V0VXNlckluZm8iLFFTPXtwcm92aWRlcjpTdHJpbmcsd2l0aENyZWRlbnRpYWxzOkJvb2xlYW4sdGltZW91dDpOdW1iZXIsbGFuZzpTdHJpbmd9LGV3PSJnZ2V0VXNlclByb2ZpbGVnZXRVc2VyUHJvZmlsZSIsdHc9e3Byb3ZpZGVyOlN0cmluZyx3aXRoQ3JlZGVudGlhbHM6Qm9vbGVhbix0aW1lb3V0Ok51bWJlcixsYW5nOlN0cmluZ30sbnc9InByZUxvZ2luIixydz17VU5JVkVSSUZZOiJ1bml2ZXJpZnkifSxpdz17Zm9ybWF0QXJnczp7cHJvdmlkZXIoZSx0KXtpZihPYmplY3QudmFsdWVzKHJ3KS5pbmRleE9mKFN0cmluZyhlKSk8MClyZXR1cm4icHJvdmlkZXIgZXJyb3IifX19LG93PXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxhdz0iY2xvc2VBdXRoVmlldyIsc3c9ImdldENoZWNrQm94U3RhdGUiLGx3PSJnZXRVbml2ZXJpZnlNYW5hZ2VyIixjdz0ic2hhcmUiLExoPVsiV1hTY2VuZVNlc3Npb24iLCJXWFNjZW5lVGltZWxpbmUiLCJXWFNjZW5lRmF2b3JpdGUiXSx1dz17Zm9ybWF0QXJnczp7c2NlbmUoZSx0KXtsZXR7cHJvdmlkZXI6bixvcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdDpyfT10O2lmKG49PT0id2VpeGluIiYmIXImJighZXx8IUxoLmluY2x1ZGVzKGUpKSlyZXR1cm5gXHU1MjA2XHU0RUFCXHU1MjMwXHU1RkFFXHU0RkUxXHU2NUY2XHVGRjBDc2NlbmVcdTVGQzVcdTk4N0JcdTRFM0FcdTRFRTVcdTRFMEJcdTUxNzZcdTRFMkRcdTRFMDBcdTRFMkFcdUZGMUEke0xoLmpvaW4oIlx1MzAwMSIpfWB9LHN1bW1hcnkoZSx0KXtpZih0LnR5cGU9PT0xJiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU3RUFGXHU2NTg3XHU2NzJDXHU2NUY2XHVGRjBDc3VtbWFyeVx1NUZDNVx1NTg2QiJ9LGhyZWYoZSx0KXtpZih0LnR5cGU9PT0wJiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU1NkZFXHU2NTg3XHU2NUY2XHVGRjBDaHJlZlx1NUZDNVx1NTg2QiJ9LGltYWdlVXJsKGUsdCl7aWYoWzAsMiw1XS5pbmNsdWRlcyhOdW1iZXIodC50eXBlKSkmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTU2RkVcdTY1ODdcdTMwMDFcdTdFQUZcdTU2RkVcdTcyNDdcdTMwMDFcdTVDMEZcdTdBMEJcdTVFOEZcdTY1RjZcdUZGMENpbWFnZVVybFx1NUZDNVx1NTg2Qlx1RkYwQ1x1NjNBOFx1ODM1MFx1NEY3Rlx1NzUyOFx1NUMwRlx1NEU4RTIwS2JcdTc2ODRcdTU2RkVcdTcyNDcifSxtZWRpYVVybChlLHQpe2lmKFszLDRdLmluY2x1ZGVzKE51bWJlcih0LnR5cGUpKSYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1OTdGM1x1NEU1MFx1MzAwMVx1ODlDNlx1OTg5MVx1NjVGNlx1RkYwQ21lZGlhVXJsXHU1RkM1XHU1ODZCIn0sbWluaVByb2dyYW0oZSx0KXtpZih0LnR5cGU9PT01JiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU1QzBGXHU3QTBCXHU1RThGXHU2NUY2XHVGRjBDbWluaVByb2dyYW1cdTVGQzVcdTU4NkIifSxjb3JwaWQoZSx0KXtpZih0Lm9wZW5DdXN0b21lclNlcnZpY2VDaGF0JiYhZSlyZXR1cm4iXHU0RjdGXHU3NTI4XHU2MjUzXHU1RjAwXHU1QkEyXHU2NzBEXHU1MjlGXHU4MEZEXHU2NUY2IGNvcnBpZCBcdTVGQzVcdTU4NkIifSxjdXN0b21lclVybChlLHQpe2lmKHQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQmJiFlKXJldHVybiJcdTRGN0ZcdTc1MjhcdTYyNTNcdTVGMDBcdTVCQTJcdTY3MERcdTUyOUZcdTgwRkRcdTY1RjYgY3VzdG9tZXJVcmwgXHU1RkM1XHU1ODZCIn19fSxmdz17cHJvdmlkZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx0eXBlOk51bWJlcix0aXRsZTpTdHJpbmcsc2NlbmU6U3RyaW5nLHN1bW1hcnk6U3RyaW5nLGhyZWY6U3RyaW5nLGltYWdlVXJsOlN0cmluZyxtZWRpYVVybDpTdHJpbmcsbWluaVByb2dyYW06T2JqZWN0fSxkdz0ic2hhcmVXaXRoU3lzdGVtIixEaD1bInRleHQiLCJpbWFnZSJdLGh3PXtmb3JtYXRBcmdzOnt0eXBlKGUsdCl7aWYoZSYmIURoLmluY2x1ZGVzKGUpKXJldHVybiJcdTUyMDZcdTRFQUJcdTUzQzJcdTY1NzAgdHlwZSBcdTRFMERcdTZCNjNcdTc4NkVcdTMwMDJcdTUzRUFcdTY1MkZcdTYzMDF0ZXh0XHUzMDAxaW1hZ2UiO3QudHlwZT1DbihlLERoKX19fSxndz17dHlwZTpTdHJpbmcsc3VtbWFyeTpTdHJpbmcsaHJlZjpTdHJpbmcsaW1hZ2VVcmw6U3RyaW5nfSxwdz0icmVxdWVzdFBheW1lbnQiLHZ3PXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LG9yZGVySW5mbzp7dHlwZTpbU3RyaW5nLE9iamVjdF0scmVxdWlyZWQ6ITB9LHRpbWVTdGFtcDpTdHJpbmcsbm9uY2VTdHI6U3RyaW5nLHBhY2thZ2U6U3RyaW5nLHNpZ25UeXBlOlN0cmluZyxwYXlTaWduOlN0cmluZ30sbXc9ImNyZWF0ZVB1c2hNZXNzYWdlIixfdz17Zm9ybWF0QXJnczp7Y29udGVudChlKXtpZighZSlyZXR1cm4iY29udGVudCBpcyByZXF1aXJlZCJ9fX0sYnc9ImdldENoYW5uZWxNYW5hZ2VyIixFdz0iY3JlYXRlUmV3YXJkZWRWaWRlb0FkIix5dz17Zm9ybWF0QXJnczp7YWRwaWQ6IiIsYWRVbml0SWQ6IiJ9fSxTdz17YWRwaWQ6U3RyaW5nLGFkVW5pdElkOlN0cmluZ30sd3c9ImNyZWF0ZUZ1bGxTY3JlZW5WaWRlb0FkIixDdz17Zm9ybWF0QXJnczp7YWRwaWQ6IiJ9fSxBdz17YWRwaWQ6U3RyaW5nfSxPdz0iY3JlYXRlSW50ZXJzdGl0aWFsQWQiLFR3PXtmb3JtYXRBcmdzOnthZHBpZDoiIixhZFVuaXRJZDoiIn19LFB3PXthZHBpZDpTdHJpbmcsYWRVbml0SWQ6U3RyaW5nfSxJdz0iY3JlYXRlSW50ZXJhY3RpdmVBZCIsTnc9e2Zvcm1hdEFyZ3M6e2FkcGlkKGUsdCl7aWYoIWUpcmV0dXJuImFkcGlkIHNob3VsZCBub3QgYmUgZW1wdHkuIjtlJiYodC5hZHBpZD1lKX0scHJvdmlkZXIoZSx0KXtpZighZSlyZXR1cm4icHJvdmlkZXIgc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2UmJih0LnByb3ZpZGVyPWUpfX19LGt3PXthZHBpZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHByb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19O2Z1bmN0aW9uIFhzKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe2RlbGV0ZSByLmNvZGUsZGVsZXRlIHIubWVzc2FnZSx6LmlzRnVuY3Rpb24odCkmJihyPXQocikpLGUocil9fWZ1bmN0aW9uIHByKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3I9cnx8e30sdD1yLm1lc3NhZ2V8fHR8fCIiLGRlbGV0ZSByLm1lc3NhZ2UsZSh0LHouZXh0ZW5kKHtjb2RlOjB9LHIpKX19ZnVuY3Rpb24gQWwoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtlKCkoZnVuY3Rpb24ocil7ciYmKGRlbGV0ZSByLmNvZGUsZGVsZXRlIHIubWVzc2FnZSksb3QuaW52b2tlT25DYWxsYmFjayh0LHIpfSl9fWZ1bmN0aW9uIG1pKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocix7cmVzb2x2ZTpvLHJlamVjdDpjfSl7ZSgpKHouZXh0ZW5kKHt9LHouaXNGdW5jdGlvbih0KT90KHIpOnIse3N1Y2Nlc3M6WHMobyxuKSxmYWlsOnByKGMpfSkpfX1mdW5jdGlvbiB0YyhlPSIiKXtpZighKFIudGFiQmFyJiZ6LmlzQXJyYXkoUi50YWJCYXIubGlzdCkpKXJldHVybiExO3RyeXtpZighZSl7bGV0IG49Um4oKTtpZighbi5sZW5ndGgpcmV0dXJuITE7bGV0IHI9bltuLmxlbmd0aC0xXTtyZXR1cm4gcj9yLiRwYWdlLm1ldGEuaXNUYWJCYXI6ITF9L15cLy8udGVzdChlKXx8KGU9Sy5hZGRMZWFkaW5nU2xhc2goZSkpO2xldCB0PUtpKGUpO3JldHVybiB0JiZ0Lm1ldGEuaXNUYWJCYXJ9Y2F0Y2godCl7fXJldHVybiExfWxldCBFYT0iX19UWVBFIixSdz0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24gJHUoZSl7bGV0IHQ9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl07dHJ5e2xldCBuPXouaXNTdHJpbmcoZSk/SlNPTi5wYXJzZShlKTplLHI9bi50eXBlO2lmKHQuaW5kZXhPZihyKT49MCl7bGV0IG89T2JqZWN0LmtleXMobik7aWYoby5sZW5ndGg9PT0yJiYiZGF0YSJpbiBuKXtpZih0eXBlb2Ygbi5kYXRhPT09cilyZXR1cm4gbi5kYXRhO2lmKHI9PT0ib2JqZWN0IiYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KG4uZGF0YSkpcmV0dXJuIG5ldyBEYXRlKG4uZGF0YSl9ZWxzZSBpZihvLmxlbmd0aD09PTEpcmV0dXJuIiJ9fWNhdGNoKG4pe319bGV0IHh3PUx0KGVFLChlLHQpPT57bGV0IG49dHlwZW9mIHQscj1uPT09InN0cmluZyI/dDpKU09OLnN0cmluZ2lmeSh7dHlwZTpuLGRhdGE6dH0pO3RyeXtuPT09InN0cmluZyImJiR1KHIpIT09dm9pZCAwP3Muc3RvcmFnZS5zZXRJdGVtKGUrRWEsbik6cy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStFYSkscy5zdG9yYWdlLnNldEl0ZW0oZSxyKX1jYXRjaChvKXt9fSx0RSksQnc9RWUoWDAsKHtrZXk6ZSxkYXRhOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBvPXR5cGVvZiB0LGM9bz09PSJzdHJpbmciP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6byxkYXRhOnR9KTt0cnl7bGV0IGc9cy5zdG9yYWdlO289PT0ic3RyaW5nIiYmJHUoYykhPT12b2lkIDA/Zy5zZXRJdGVtQXN5bmMoZStFYSxvLCgpPT57fSk6Zy5yZW1vdmVJdGVtQXN5bmMoZStFYSwoKT0+e30pLGcuc2V0SXRlbUFzeW5jKGUsYyxuLHByKHIpKX1jYXRjaChnKXtyKGcubWVzc2FnZSl9fSxRMCk7ZnVuY3Rpb24gSHUoZSx0KXtsZXQgbj10O2lmKGUhPT0ic3RyaW5nInx8ZT09PSJzdHJpbmciJiZ0PT09J3sidHlwZSI6InVuZGVmaW5lZCJ9Jyl0cnl7bGV0IHI9SlNPTi5wYXJzZSh0KSxvPSR1KHIpO2lmKG8hPT12b2lkIDApbj1vO2Vsc2UgaWYoZSYmKG49cix6LmlzU3RyaW5nKHIpKSl7cj1KU09OLnBhcnNlKHIpO2xldCBjPXR5cGVvZiByO2M9PT0ibnVtYmVyIiYmZT09PSJkYXRlIj9uPW5ldyBEYXRlKHIpOmM9PT0oWyJudWxsIiwiYXJyYXkiXS5pbmRleE9mKGUpPDA/ZToib2JqZWN0IikmJihuPXIpfX1jYXRjaChyKXt9cmV0dXJuIG59bGV0IE13PUx0KFowLGU9PntsZXQgdD1zLnN0b3JhZ2UuZ2V0SXRlbShlKSxyPShzLnN0b3JhZ2UuZ2V0SXRlbShlK0VhKXx8IiIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHouaXNTdHJpbmcodCk/SHUocix0KToiIn0sU2gpLEx3PUVlKEswLCh7a2V5OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPXMuc3RvcmFnZTtyLmdldEl0ZW1Bc3luYyhlLGZ1bmN0aW9uKG8pe3IuZ2V0SXRlbUFzeW5jKGUrRWEsZnVuY3Rpb24oYyl7bGV0IGI9KGMuZGF0YXx8IiIpLnRvTG93ZXJDYXNlKCk7dCh7ZGF0YTpIdShiLG8uZGF0YSl9KX0sZnVuY3Rpb24oKXt0KHtkYXRhOkh1KCIiLG8uZGF0YSl9KX0pfSxwcihuKSl9LHloKSxEdz1MdCh3aCxlPT57cy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStFYSkscy5zdG9yYWdlLnJlbW92ZUl0ZW0oZSl9LHJFKSxGdz1FZSh3aCwoe2tleTplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntzLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKGUrRWEsKCk9Pnt9KSxzLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKGUsdCxwcihuKSl9LG5FKSxWdz1MdCgiY2xlYXJTdG9yYWdlU3luYyIsKCk9PntzLnN0b3JhZ2UuY2xlYXIoKX0pLFV3PUVlKCJjbGVhclN0b3JhZ2UiLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3Muc3RvcmFnZS5jbGVhckFzeW5jKHQscHIobikpfSksRmg9THQoImdldFN0b3JhZ2VJbmZvU3luYyIsKCk9PntsZXQgZT1zLnN0b3JhZ2UuZ2V0TGVuZ3RoKCl8fDAsdD1bXSxuPTA7Zm9yKGxldCByPTA7cjxlO3IrKyl7bGV0IG89cy5zdG9yYWdlLmtleShyKTtpZihvIT09UncmJihvLmluZGV4T2YoRWEpPDB8fG8uaW5kZXhPZihFYSkrRWEubGVuZ3RoIT09by5sZW5ndGgpKXtsZXQgYz1zLnN0b3JhZ2UuZ2V0SXRlbShvKTtuKz1vLmxlbmd0aCtjLmxlbmd0aCx0LnB1c2gobyl9fXJldHVybntrZXlzOnQsY3VycmVudFNpemU6TWF0aC5jZWlsKG4qMi8xMDI0KSxsaW1pdFNpemU6TnVtYmVyLk1BWF9WQUxVRX19KSwkdz1FZSgiZ2V0U3RvcmFnZUluZm8iLChlLHtyZXNvbHZlOnR9KT0+e3QoRmgoKSl9KSxIdz1FZShmRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntzLmlvLmdldEZpbGVJbmZvKHouZXh0ZW5kKGUse3N1Y2Nlc3M6WHModCksZmFpbDpwcihuKX0pKX0saEUsZEUpLGp3PTAsVmg9InVuaWFwcF9zYXZlIix6dz1gX2RvYy8ke1ZofWA7ZnVuY3Rpb24gV3coZSx0KXt0PXR8fGZ1bmN0aW9uKCl7fSxzLmlvLnJlcXVlc3RGaWxlU3lzdGVtKHMuaW8uUFJJVkFURV9ET0Msbj0+e24ucm9vdC5nZXREaXJlY3RvcnkoVmgse2NyZWF0ZTohMH0sZSx0KX0sdCl9bGV0IEd3PUVlKGlFLCh7dGVtcEZpbGVQYXRoOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPXByKG4pLG89YCR7RGF0ZS5ub3coKX0ke2p3Kyt9JHtZYShlKX1gO3MuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChlLGM9PntXdyhnPT57Yy5jb3B5VG8oZyxvLCgpPT57bGV0IGI9encrIi8iK287dCh7c2F2ZWRGaWxlUGF0aDpifSl9LHIpfSxyKX0scil9LGFFLG9FKSxZdz0idW5pYXBwX3NhdmUiO2Z1bmN0aW9uIHF3KGUsdCl7dD10fHxmdW5jdGlvbigpe30scy5pby5yZXF1ZXN0RmlsZVN5c3RlbShzLmlvLlBSSVZBVEVfRE9DLG49PntuLnJvb3QuZ2V0RGlyZWN0b3J5KFl3LHtjcmVhdGU6ITB9LGUsdCl9LHQpfWxldCBKdz1FZShzRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1wcihuKTtxdyhvPT57dmFyIGM9by5jcmVhdGVSZWFkZXIoKSxnPVtdO2MucmVhZEVudHJpZXMoYj0+e2ImJmIubGVuZ3RoP2IuZm9yRWFjaChWPT57Vi5nZXRNZXRhZGF0YShUPT57Zy5wdXNoKHtmaWxlUGF0aDpzLmlvLmNvbnZlcnRBYnNvbHV0ZUZpbGVTeXN0ZW0oVi5mdWxsUGF0aCksY3JlYXRlVGltZTpULm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6VC5zaXplfSksZy5sZW5ndGg9PT1iLmxlbmd0aCYmdCh7ZmlsZUxpc3Q6Z30pfSxyLCExKX0pOnQoe2ZpbGVMaXN0Omd9KX0scil9LHIpfSksS3c9RWUoZ0UsKHtmaWxlUGF0aDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1wcihuKTtzLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwoZSxvPT57by5nZXRNZXRhZGF0YShjPT57dCh7Y3JlYXRlVGltZTpjLm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6Yy5zaXplfSl9LHIsITEpfSxyKX0sdkUscEUpLFp3PUVlKGxFLCh7ZmlsZVBhdGg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9cHIobik7cy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUsbz0+e28ucmVtb3ZlKCgpPT57dCgpfSxyKX0scil9LHVFLGNFKSxYdz1FZShtRSwoe2ZpbGVQYXRoOmUsZmlsZVR5cGU6dH0se3Jlc29sdmU6bixyZWplY3Q6cn0pPT57bGV0IG89cHIocik7cy5ydW50aW1lLm9wZW5Eb2N1bWVudChIZShlKSx2b2lkIDAsbixvKX0sYkUsX0UpLFF3PUx0KFViLGU9PiEhei5oYXNPd24oUCxlKSwkYiksbmMsVWg9cy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU7ZnVuY3Rpb24gZUMoZSl7VWg9ZX1mdW5jdGlvbiAkaChlKXtuYz1lLFVoKGUpfXMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlPSRoO2Z1bmN0aW9uIEJhKGUpe2lmKCFlKXtsZXQgdD1BaSgpO2lmKCF0fHwoZT10LiRwYWdlLnN0YXR1c0JhclN0eWxlLCFlfHxlPT09bmMpKXJldHVybn1lIT09bmMmJihuYz1lLHMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKGUpKX1mdW5jdGlvbiBIaChlKXtvdC5vbihLLk9OX1RIRU1FX0NIQU5HRSxlKX1mdW5jdGlvbiB0QyhlKXtvdC5vZmYoSy5PTl9USEVNRV9DSEFOR0UsZSl9ZnVuY3Rpb24gbkMoKXtyZXR1cm4gamgoKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIn1mdW5jdGlvbiBqaCgpe3JldHVybiBzLm5hdmlnYXRvci5nZXRVSVN0eWxlKCl9ZnVuY3Rpb24gckMoKXtpZihSLmRhcmttb2RlKXtsZXQgZT1uQygpO0JhKGUpLEduKCkuZm9yRWFjaChuPT57bi4kcGFnZS5zdGF0dXNCYXJTdHlsZT1lfSl9fWZ1bmN0aW9uIGp1KGUpe2lmKFIuZGFya21vZGUpe2xldCB0PXt9LG49cy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpLHI9aWMoKTtyZXR1cm4gciYmci5ob3N0VGhlbWUmJihuPXIuaG9zdFRoZW1lKSx0PUsubm9ybWFsaXplU3R5bGVzKGUsUi50aGVtZUNvbmZpZyxuKSx0fXJldHVybiBlfWZ1bmN0aW9uIGlDKGUsdCl7aWYoUi5kYXJrbW9kZSl7bGV0IG49KCk9PntsZXR7bGlzdDpyPVtdLGNvbG9yOm8sc2VsZWN0ZWRDb2xvcjpjLGJhY2tncm91bmRDb2xvcjpnLGJvcmRlclN0eWxlOmJ9PWp1KHQpO2UmJmUuc2V0VGFiQmFyU3R5bGUoe2NvbG9yOm8sc2VsZWN0ZWRDb2xvcjpjLGJhY2tncm91bmRDb2xvcjpnLGJvcmRlclN0eWxlOmJ9KSxlJiZlLnNldFRhYkJhckl0ZW1zKHtsaXN0OnIubWFwKFY9Pih7aWNvblBhdGg6Vi5pY29uUGF0aCxzZWxlY3RlZEljb25QYXRoOlYuc2VsZWN0ZWRJY29uUGF0aCx2aXNpYmxlOlYudmlzaWJsZX0pKX0pfTtuKCksSGgobil9fWZ1bmN0aW9uIHpoKGUsdCl7aWYoUi5kYXJrbW9kZSl7bGV0IG49KCk9PntsZXQgcj10KCk7ci5hbmltYXRpb25BbHBoYUJHQ29sb3Isci5iYWNrZ3JvdW5kLHIuYmFja2dyb3VuZENvbG9yQm90dG9tLHIuYmFja2dyb3VuZENvbG9yVG9wO3ZhciBvPXIudGl0bGVOVmlldzt0eXBlb2YgbyE9InVuZGVmaW5lZCImJnR5cGVvZiBvPT0ib2JqZWN0IiYmKG8uYmFja2dyb3VuZENvbG9yLG8udGl0bGVDb2xvciksZSYmZS5zZXRTdHlsZShyKX07SGgobiksZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PnRDKG4pKX19bGV0IHJjLHp1PSEwLG9yO2Z1bmN0aW9uIG9DKGUsdCxuKXshb3J8fChlPT09Im5vbmUiPyhvci5oaWRlVGFiQmFyUmVkRG90KHtpbmRleDp0fSksb3IucmVtb3ZlVGFiQmFyQmFkZ2Uoe2luZGV4OnR9KSk6ZT09PSJ0ZXh0Ij9vci5zZXRUYWJCYXJCYWRnZSh7aW5kZXg6dCx0ZXh0Om59KTplPT09InJlZERvdCImJm9yLnNob3dUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSl9ZnVuY3Rpb24gYUMoZSl7b3ImJm9yLnNldFRhYkJhckl0ZW1zKGUpfWZ1bmN0aW9uIHNDKGUsdCxuLHIsbyxjKXtsZXQgZz17aW5kZXg6ZX07aWYodCE9PXZvaWQgMCYmKGcudGV4dD10KSxuJiYoZy5pY29uUGF0aD1IZShuKSksciYmKGcuc2VsZWN0ZWRJY29uUGF0aD1IZShyKSksYyE9PXZvaWQgMCYmKGcuaWNvbmZvbnQ9YyksbyE9PXZvaWQgMCl7Zy52aXNpYmxlPXJjLmxpc3RbZV0udmlzaWJsZT1vLGRlbGV0ZSBnLmluZGV4O2xldCBiPXJjLmxpc3QubWFwKFY9Pih7dmlzaWJsZTpWLnZpc2libGV9KSk7YltlXT1nLGFDKHtsaXN0OmJ9KX1lbHNlIG9yJiZvci5zZXRUYWJCYXJJdGVtKGcpfWZ1bmN0aW9uIGxDKGUpe29yJiZvci5zZXRUYWJCYXJTdHlsZShlKX1mdW5jdGlvbiBjQyhlKXt6dT0hMSxvciYmb3IuaGlkZVRhYkJhcih7YW5pbWF0aW9uOmV9KX1mdW5jdGlvbiB1QyhlKXt6dT0hMCxvciYmb3Iuc2hvd1RhYkJhcih7YW5pbWF0aW9uOmV9KX1sZXQga2M9W107dmFyIF9pPXtpZDoiMCIsaW5pdChlLHQpe2UmJmUubGlzdC5sZW5ndGgmJihyYz1lKTt0cnl7b3I9Zi5yZXF1aXJlTW9kdWxlKCJ1bmktdGFidmlldyIpfWNhdGNoKG4pe2NvbnNvbGUubG9nKGB1bmkucmVxdWlyZU5hdGl2ZVBsdWdpbigidW5pLXRhYnZpZXciKSBlcnJvciAke259YCl9b3Iub25NYXNrQ2xpY2soKCk9PntrYy5mb3JFYWNoKG49PntuKCl9KX0pLG9yJiZvci5vbkNsaWNrKCh7aW5kZXg6bn0pPT57dChyYy5saXN0W25dLG4pfSksb3ImJm9yLm9uTWlkQnV0dG9uQ2xpY2soKCk9Pm90Lmludm9rZU9uQ2FsbGJhY2sob2gpKSxpQyhvcixlKX0saW5kZXhPZihlKXtsZXQgdD10aGlzLmNvbmZpZyxuPXQmJnQubGlzdCYmdC5saXN0Lmxlbmd0aDtpZihuKXtmb3IobGV0IHI9MDtyPG47cisrKWlmKHQubGlzdFtyXS5wYWdlUGF0aD09PWV8fHQubGlzdFtyXS5wYWdlUGF0aD09PWAke2V9Lmh0bWxgKXJldHVybiByfXJldHVybi0xfSxzd2l0Y2hUYWIoZSl7bGV0IHQ9dGhpcy5pbmRleE9mKGUpO3JldHVybiB0Pj0wPyhvciYmb3Iuc3dpdGNoU2VsZWN0KHtpbmRleDp0fSksITApOiExfSxzZXRUYWJCYXJCYWRnZTpvQyxzZXRUYWJCYXJJdGVtOnNDLHNldFRhYkJhclN0eWxlOmxDLGhpZGVUYWJCYXI6Y0Msc2hvd1RhYkJhcjp1QyxhcHBlbmQoZSl7b3ImJm9yLmFwcGVuZCh7aWQ6ZS5pZH0sKHtjb2RlOnR9KT0+e3QhPT0wJiZOKCgpPT57dGhpcy5hcHBlbmQoZSl9LDIwKX0pfSxnZXQgY29uZmlnKCl7cmV0dXJuIHJjfHxSLnRhYkJhcn0sZ2V0IHZpc2libGUoKXtyZXR1cm4genV9LGdldCBoZWlnaHQoKXtsZXQgZT10aGlzLmNvbmZpZztyZXR1cm4oZSYmZS5oZWlnaHQ/cGFyc2VGbG9hdChlLmhlaWdodCk6Sy5UQUJCQVJfSEVJR0hUKStzLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLmRldmljZUJvdHRvbX0sZ2V0IGNvdmVyKCl7bGV0IGU9dGhpcy5jb25maWc7cmV0dXJuIGUmJlsiZXh0cmFsaWdodCIsImxpZ2h0IiwiZGFyayJdLmluZGV4T2YoZS5ibHVyRWZmZWN0KT49MH0sc2V0U3R5bGUoe21hc2s6ZX0pe29yLnNldE1hc2soe2NvbG9yOmV9KX0sYWRkRXZlbnRMaXN0ZW5lcihlLHQpe2tjLnB1c2godCl9LHJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgbj1rYy5pbmRleE9mKHQpO2tjLnNwbGljZShuLDEpfX07ZnVuY3Rpb24gUmMoKXtsZXQgZT1BaSgpO3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpudWxsfWZ1bmN0aW9uIFdoKGUpe3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpSYygpfWxldCBHaD1udWxsO2Z1bmN0aW9uIFloKCl7cmV0dXJuIEdofWZ1bmN0aW9uIFd1KGUpe0doPWV9ZnVuY3Rpb24gR3UoKXtyZXR1cm4gcy5uYXZpZ2F0b3IuaXNJbW1lcnNlZFN0YXR1c2JhcigpP01hdGgucm91bmQocy5vcy5uYW1lPT09ImlPUyI/cy5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS50b3A6cy5uYXZpZ2F0b3IuZ2V0U3RhdHVzYmFySGVpZ2h0KCkpOjB9ZnVuY3Rpb24gcWgoKXtsZXQgZT1zLm5hdmlnYXRvci5nZXRTdGF0dXNCYXJTdHlsZSgpO3JldHVybiBlPT09IlVJU3RhdHVzQmFyU3R5bGVCbGFja1RyYW5zbHVjZW50Inx8ZT09PSJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUifHxlPT09Im51bGwiP2U9ImxpZ2h0IjplPT09IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0IiYmKGU9ImRhcmsiKSxlfWZ1bmN0aW9uIGZDKCl7bGV0e3Jlc29sdXRpb25XaWR0aDplLHJlc29sdXRpb25IZWlnaHQ6dH09cy5zY3JlZW4uZ2V0Q3VycmVudFNpemUoKXx8e3Jlc29sdXRpb25XaWR0aDowLHJlc29sdXRpb25IZWlnaHQ6MH07cmV0dXJue3NjcmVlbldpZHRoOk1hdGgucm91bmQoZSksc2NyZWVuSGVpZ2h0Ok1hdGgucm91bmQodCl9fWxldCBKaD1MdCgiZ2V0V2luZG93SW5mbyIsKCk9PntsZXQgZT1zLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJpb3MiLHtzY3JlZW5XaWR0aDp0LHNjcmVlbkhlaWdodDpufT1mQygpLHI9R3UoKSxvLGM9e2hlaWdodDowLGNvdmVyOiExfSxnPVJjKCk7aWYoZyl7bGV0IGZ0PWcuZ2V0U3R5bGUoKSxodD1mdCYmZnQudGl0bGVOVmlldztodCYmaHQudHlwZSYmaHQudHlwZSE9PSJub25lIiYmKGMuaGVpZ2h0PWh0LnR5cGU9PT0idHJhbnNwYXJlbnQiPzA6citLLk5BVkJBUl9IRUlHSFQsYy5jb3Zlcj1odC50eXBlPT09InRyYW5zcGFyZW50Inx8aHQudHlwZT09PSJmbG9hdCIpLG89Zy5nZXRTYWZlQXJlYUluc2V0cygpfWVsc2Ugbz1zLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpO2xldCBiPXtoZWlnaHQ6MCxjb3ZlcjohMX07dGMoKSYmKGIuaGVpZ2h0PV9pLnZpc2libGU/X2kuaGVpZ2h0OjAsYi5jb3Zlcj1faS5jb3Zlcik7bGV0IFY9Yy5jb3Zlcj9jLmhlaWdodDowLFQ9Yi5jb3Zlcj9iLmhlaWdodDowLEQ9bi1jLmhlaWdodC1iLmhlaWdodCx2ZT1uLShjLmNvdmVyPzA6Yy5oZWlnaHQpLShiLmNvdmVyPzA6Yi5oZWlnaHQpLHllPXQ7KCFiLmhlaWdodHx8Yi5jb3ZlcikmJiFvLmJvdHRvbSYmby5kZXZpY2VCb3R0b20mJihELT1vLmRldmljZUJvdHRvbSx2ZS09by5kZXZpY2VCb3R0b20pLG89ZT9vOntsZWZ0OjAscmlnaHQ6MCx0b3A6Yy5oZWlnaHQmJiFjLmNvdmVyPzA6cixib3R0b206MH07bGV0IE9lPXtsZWZ0Om8ubGVmdCxyaWdodDp5ZS1vLnJpZ2h0LHRvcDpvLnRvcCxib3R0b206dmUtby5ib3R0b20sd2lkdGg6eWUtby5sZWZ0LW8ucmlnaHQsaGVpZ2h0OnZlLW8udG9wLW8uYm90dG9tfTtyZXR1cm57cGl4ZWxSYXRpbzpzLnNjcmVlbi5zY2FsZSxzY3JlZW5XaWR0aDp0LHNjcmVlbkhlaWdodDpuLHdpbmRvd1dpZHRoOnllLHdpbmRvd0hlaWdodDpELHN0YXR1c0JhckhlaWdodDpyLHNhZmVBcmVhOk9lLHNhZmVBcmVhSW5zZXRzOnt0b3A6by50b3AscmlnaHQ6by5yaWdodCxib3R0b206by5ib3R0b20sbGVmdDpvLmxlZnR9LHdpbmRvd1RvcDpWLHdpbmRvd0JvdHRvbTpULHNjcmVlblRvcDpuLUR9fSkseWEseGM9ITA7ZnVuY3Rpb24gaWMoKXtpZigheGMpcmV0dXJuO2xldHtnZXRTeXN0ZW1JbmZvU3luYzplfT1mLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtpZih5YT1lKCksei5pc1N0cmluZyh5YSkpdHJ5e3lhPUpTT04ucGFyc2UoeWEpfWNhdGNoKHQpe31yZXR1cm4geWF9bGV0IEtoPUx0KCJnZXREZXZpY2VJbmZvIiwoKT0+e2ljKCk7bGV0e2RldmljZUJyYW5kOmU9IiIsZGV2aWNlTW9kZWw6dCxvc05hbWU6bixvc1ZlcnNpb246cixkZXZpY2VPcmllbnRhdGlvbjpvLGRldmljZVR5cGU6YyxkZXZpY2VJZDpnfT15YSxiPWUudG9Mb3dlckNhc2UoKSxWPW4udG9Mb3dlckNhc2UoKTtyZXR1cm57YnJhbmQ6YixkZXZpY2VCcmFuZDpiLGRldmljZU1vZGVsOnQsZGV2aWNlUGl4ZWxSYXRpbzpzLnNjcmVlbi5zY2FsZSxkZXZpY2VJZDpnLGRldmljZU9yaWVudGF0aW9uOm8sZGV2aWNlVHlwZTpjLG1vZGVsOnQscGxhdGZvcm06VixzeXN0ZW06YCR7Vj09PSJpb3MiPyJpT1MiOiJBbmRyb2lkIn0gJHtyfWB9fSksWmg9THQoImdldEFwcEJhc2VJbmZvIiwoKT0+e2ljKCk7bGV0e2hvc3RQYWNrYWdlTmFtZTplLGhvc3ROYW1lOnQsaG9zdFZlcnNpb246bixob3N0TGFuZ3VhZ2U6cixvc0xhbmd1YWdlOm8saG9zdFRoZW1lOmMsYXBwSWQ6ZyxhcHBOYW1lOmIsYXBwVmVyc2lvbjpWLGFwcFZlcnNpb25Db2RlOlQsYXBwV2d0VmVyc2lvbjpEfT15YTtyZXR1cm57YXBwSWQ6ZyxhcHBOYW1lOmIsYXBwVmVyc2lvbjpWLGFwcFZlcnNpb25Db2RlOlQsYXBwV2d0VmVyc2lvbjpELGFwcExhbmd1YWdlOktsP0tsKCk6byxlbmFibGVEZWJ1ZzohMSxob3N0UGFja2FnZU5hbWU6ZSxob3N0TmFtZTp0LGhvc3RWZXJzaW9uOm4saG9zdExhbmd1YWdlOnIsaG9zdFRoZW1lOmMsaG9zdEZvbnRTaXplU2V0dGluZzp2b2lkIDAsaG9zdFNES1ZlcnNpb246dm9pZCAwLGxhbmd1YWdlOm8sU0RLVmVyc2lvbjoiIix0aGVtZTpqaCgpLHZlcnNpb246cy5ydW50aW1lLmlubmVyVmVyc2lvbn19KSxYaD1MdCgiZ2V0U3lzdGVtSW5mb1N5bmMiLCgpPT57eGM9ITAsaWMoKSx4Yz0hMTtsZXQgZT1KaCgpLHQ9S2goKSxuPVpoKCk7eGM9ITA7bGV0IHI9e2ZvbnRTaXplU2V0dGluZzpuLmhvc3RGb250U2l6ZVNldHRpbmcsb3NOYW1lOnlhLm9zTmFtZS50b0xvd2VyQ2FzZSgpfTt5YS5ob3N0TmFtZSYmKHIuaG9zdFNES1ZlcnNpb249eWEudW5pUnVudGltZVZlcnNpb24pO2xldCBvPXouZXh0ZW5kKHlhLGUsdCxuLHIpO3JldHVybiBkZWxldGUgby5zY3JlZW5Ub3AsZGVsZXRlIG8uZW5hYmxlRGVidWcsUi5kYXJrbW9kZXx8ZGVsZXRlIG8udGhlbWUsSy5zb3J0T2JqZWN0KG8pfSksZEM9RWUoImdldFN5c3RlbUluZm8iLChlLHtyZXNvbHZlOnR9KT0+dChYaCgpKSksT2w9bnVsbCxoQz1nbihnaCwoKT0+e1FoKCl9KSxnQz1maSh0MCwoKT0+e2VnKCl9KSxRaD1FZShuMCwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntPbHx8KE9sPXMub3JpZW50YXRpb24ud2F0Y2hPcmllbnRhdGlvbihyPT57b3QuaW52b2tlT25DYWxsYmFjayhnaCx7ZGlyZWN0aW9uOnIubWFnbmV0aWNIZWFkaW5nfSl9LHI9PntuKHIubWVzc2FnZSksT2w9bnVsbH0se2ZyZXF1ZW5jeTp1b30pKSxOKHQsdW8pfSksZWc9RWUocjAsKGUse3Jlc29sdmU6dH0pPT57T2wmJihzLm9yaWVudGF0aW9uLmNsZWFyV2F0Y2goT2wpLE9sPW51bGwpLHQoKX0pLHBDPUVlKGkwLChlLHtyZXNvbHZlOnR9KT0+e3MuZGV2aWNlLnZpYnJhdGUoMTUpLHQoKX0pLHZDPUVlKG8wLChlLHtyZXNvbHZlOnR9KT0+e3MuZGV2aWNlLnZpYnJhdGUoNDAwKSx0KCl9KSxUbD1udWxsLG1DPWduKGhoLCgpPT57dGcoKX0pLF9DPWZpKFhiLCgpPT57bmcoKX0pLHRnPUVlKFFiLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e1RsfHwoVGw9cy5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKHI9PntvdC5pbnZva2VPbkNhbGxiYWNrKGhoLHt4OnImJnIueEF4aXN8fDAseTpyJiZyLnlBeGlzfHwwLHo6ciYmci56QXhpc3x8MH0pfSxyPT57VGw9bnVsbCxuKGBzdGFydEFjY2VsZXJvbWV0ZXI6ZmFpbCAke3IubWVzc2FnZX1gKX0se2ZyZXF1ZW5jeTp1b30pKSxOKHQsdW8pfSksbmc9RWUoZTAsKGUse3Jlc29sdmU6dH0pPT57VGwmJihzLmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaChUbCksVGw9bnVsbCksdCgpfSksYkM9Z24ocGgsQWwoKCk9PnMuYmx1ZXRvb3RoLm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQuYmluZChzLmJsdWV0b290aCkscGgpKSxFQz1nbih2aCxBbCgoKT0+cy5ibHVldG9vdGgub25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UuYmluZChzLmJsdWV0b290aCksdmgpKSx5Qz1nbihtaCxBbCgoKT0+cy5ibHVldG9vdGgub25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UuYmluZChzLmJsdWV0b290aCksbWgpKSxTQz1nbihfaCxBbCgoKT0+cy5ibHVldG9vdGgub25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlLmJpbmQocy5ibHVldG9vdGgpLF9oKSksd0M9RWUoIm9wZW5CbHVldG9vdGhBZGFwdGVyIixtaSgoKT0+cy5ibHVldG9vdGgub3BlbkJsdWV0b290aEFkYXB0ZXIuYmluZChzLmJsdWV0b290aCkpKSxDQz1FZSgiY2xvc2VCbHVldG9vdGhBZGFwdGVyIixtaSgoKT0+cy5ibHVldG9vdGguY2xvc2VCbHVldG9vdGhBZGFwdGVyLmJpbmQocy5ibHVldG9vdGgpKSksQUM9RWUoImdldEJsdWV0b290aEFkYXB0ZXJTdGF0ZSIsbWkoKCk9PnMuYmx1ZXRvb3RoLmdldEJsdWV0b290aEFkYXB0ZXJTdGF0ZS5iaW5kKHMuYmx1ZXRvb3RoKSkpLE9DPUVlKGEwLG1pKCgpPT5zLmJsdWV0b290aC5zdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkuYmluZChzLmJsdWV0b290aCkpLHMwKSxUQz1FZSgic3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLG1pKCgpPT5zLmJsdWV0b290aC5zdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeS5iaW5kKHMuYmx1ZXRvb3RoKSkpLFBDPUVlKCJnZXRCbHVldG9vdGhEZXZpY2VzIixtaSgoKT0+cy5ibHVldG9vdGguZ2V0Qmx1ZXRvb3RoRGV2aWNlcy5iaW5kKHMuYmx1ZXRvb3RoKSkpLElDPUVlKGwwLG1pKCgpPT5zLmJsdWV0b290aC5nZXRDb25uZWN0ZWRCbHVldG9vdGhEZXZpY2VzLmJpbmQocy5ibHVldG9vdGgpKSxjMCksTkM9RWUodTAsbWkoKCk9PnMuYmx1ZXRvb3RoLmNyZWF0ZUJMRUNvbm5lY3Rpb24uYmluZChzLmJsdWV0b290aCkpLGYwKSxrQz1FZShkMCxtaSgoKT0+cy5ibHVldG9vdGguY2xvc2VCTEVDb25uZWN0aW9uLmJpbmQocy5ibHVldG9vdGgpKSxoMCksUkM9RWUoZzAsbWkoKCk9PnMuYmx1ZXRvb3RoLmdldEJMRURldmljZVNlcnZpY2VzLmJpbmQocy5ibHVldG9vdGgpKSxwMCkseEM9RWUodjAsbWkoKCk9PnMuYmx1ZXRvb3RoLmdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcy5iaW5kKHMuYmx1ZXRvb3RoKSksbTApLEJDPUVlKF8wLG1pKCgpPT5zLmJsdWV0b290aC5ub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlLmJpbmQocy5ibHVldG9vdGgpKSxiMCksTUM9RWUoRTAsbWkoKCk9PnMuYmx1ZXRvb3RoLnJlYWRCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlLmJpbmQocy5ibHVldG9vdGgpKSx5MCksTEM9RWUoUzAsbWkoKCk9PnMuYmx1ZXRvb3RoLndyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZS5iaW5kKHMuYmx1ZXRvb3RoKSksdzApLERDPUVlKEMwLG1pKCgpPT5zLmJsdWV0b290aC5zZXRCTEVNVFUuYmluZChzLmJsdWV0b290aCkpLEEwKSxGQz1FZShPMCxtaSgoKT0+cy5ibHVldG9vdGguZ2V0QkxFRGV2aWNlUlNTSS5iaW5kKHMuYmx1ZXRvb3RoKSksVDApLFZDPWduKGJoLEFsKCgpPT5zLmliZWFjb24ub25CZWFjb25VcGRhdGUuYmluZChzLmliZWFjb24pLGJoKSksVUM9Z24oRWgsQWwoKCk9PnMuaWJlYWNvbi5vbkJlYWNvblNlcnZpY2VDaGFuZ2UuYmluZChzLmliZWFjb24pLEVoKSksJEM9RWUoUDAsbWkoKCk9PnMuaWJlYWNvbi5nZXRCZWFjb25zLmJpbmQocy5pYmVhY29uKSkpLEhDPUVlKEkwLG1pKCgpPT5zLmliZWFjb24uc3RhcnRCZWFjb25EaXNjb3ZlcnkuYmluZChzLmliZWFjb24pKSxOMCksakM9RWUoazAsbWkoKCk9PnMuaWJlYWNvbi5zdG9wQmVhY29uRGlzY292ZXJ5LmJpbmQocy5pYmVhY29uKSkpLHpDPUVlKGpiLCh7cGhvbmVOdW1iZXI6ZX0se3Jlc29sdmU6dH0pPT4ocy5kZXZpY2UuZGlhbChlKSx0KCkpLHpiKSxXQz17bmFtZTp7Z2l2ZW5OYW1lOiJmaXJzdE5hbWUiLG1pZGRsZU5hbWU6Im1pZGRsZU5hbWUiLGZhbWlseU5hbWU6Imxhc3ROYW1lIn0sbmlja25hbWU6Im5pY2tOYW1lIixwaG90b3M6e3R5cGU6InVybCIsdmFsdWU6InBob3RvRmlsZVBhdGgifSxub3RlOiJyZW1hcmsiLHBob25lTnVtYmVyczpbe3R5cGU6Im1vYmlsZSIsdmFsdWU6Im1vYmlsZVBob25lTnVtYmVyIn0se3R5cGU6IndvcmsiLHZhbHVlOiJ3b3JrUGhvbmVOdW1iZXIifSx7dHlwZToiY29tcGFueSIsdmFsdWU6Imhvc3ROdW1iZXIifSx7dHlwZToiaG9tZSBmYXgiLHZhbHVlOiJob21lRmF4TnVtYmVyIn0se3R5cGU6IndvcmsgZmF4Iix2YWx1ZToid29ya0ZheE51bWJlciJ9XSxlbWFpbHM6W3t0eXBlOiJob21lIix2YWx1ZToiZW1haWwifV0sdXJsczpbe3R5cGU6Im90aGVyIix2YWx1ZToidXJsIn1dLG9yZ2FuaXphdGlvbnM6W3t0eXBlOiJjb21wYW55IixuYW1lOiJvcmdhbml6YXRpb24iLHRpdGxlOiJ0aXRsZSJ9XSxpbXM6W3t0eXBlOiJvdGhlciIsdmFsdWU6IndlQ2hhdE51bWJlciJ9XSxhZGRyZXNzZXM6W3t0eXBlOiJvdGhlciIscHJlZmVycmVkOiEwLGNvdW50cnk6ImFkZHJlc3NDb3VudHJ5IixyZWdpb246ImFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJhZGRyZXNzU3RyZWV0Iixwb3N0YWxDb2RlOiJhZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJob21lIixjb3VudHJ5OiJob21lQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiaG9tZUFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImhvbWVBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoiaG9tZUFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImhvbWVBZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJjb21wYW55Iixjb3VudHJ5OiJ3b3JrQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoid29ya0FkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6IndvcmtBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoid29ya0FkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6IndvcmtBZGRyZXNzUG9zdGFsQ29kZSJ9XX0sR0M9WyJ0eXBlIiwicHJlZmVycmVkIl07ZnVuY3Rpb24gWXUoZSx0LG4pe2xldCByPTA7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2gobz0+e2xldCBjPW5bb107dHlwZW9mIGMhPT0ib2JqZWN0Ij9HQy5pbmRleE9mKG8pIT09LTE/ZVtvXT1uW29dOnR5cGVvZiB0W2NdIT0idW5kZWZpbmVkIj8ocisrLGVbb109dFtjXSk6ZGVsZXRlIGVbb106YyBpbnN0YW5jZW9mIEFycmF5PyhlW29dPVtdLGMuZm9yRWFjaChiPT57bGV0IFY9e307WXUoVix0LGIpJiZlW29dLnB1c2goVil9KSxlW29dLmxlbmd0aD9yKys6ZGVsZXRlIGVbb10pOihlW29dPXt9LFl1KGVbb10sdCxjKT9yKys6ZGVsZXRlIGVbb10pfSkscn1sZXQgWUM9RWUoV2IsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57IWUucGhvdG9GaWxlUGF0aCYmKGUucGhvdG9GaWxlUGF0aD0iIikscy5jb250YWN0cy5nZXRBZGRyZXNzQm9vayhzLmNvbnRhY3RzLkFERFJFU1NCT09LX1BIT05FLHI9PntsZXQgbz1yLmNyZWF0ZSgpO1l1KG8sZSxXQyksby5zYXZlKCgpPT50KCksYz0+bigpKX0scj0+bigpKX0sWWIsR2IpO2Z1bmN0aW9uIFlvKGUpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCI/Zi5yZXF1aXJlTW9kdWxlKGUpOl9fcmVxdWlyZU5hdGl2ZVBsdWdpbl9fKGUpfWZ1bmN0aW9uIHJnKGUsdCxuKXtyZXR1cm4gWW8oInBsdXMiKS5zZW5kTmF0aXZlRXZlbnQoZSx0LG4pfWxldCBxQz1FZShxYiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntZbygiY2xpcGJvYXJkIikuZ2V0U3RyaW5nKG89PntvLnJlc3VsdD09PSJzdWNjZXNzIj90KHtkYXRhOm8uZGF0YX0pOm4oImdldENsaXBib2FyZERhdGE6ZmFpbCIpfSl9KSxKQz1FZShKYiwoZSx7cmVzb2x2ZTp0fSk9PntZbygiY2xpcGJvYXJkIikuc2V0U3RyaW5nKGUuZGF0YSksdCgpfSxaYixLYiksaWc9Im9uTmV0d29ya1N0YXR1c0NoYW5nZSI7ZnVuY3Rpb24gb2coKXthZygpLnRoZW4oKHtuZXR3b3JrVHlwZTplfSk9PntvdC5pbnZva2VPbkNhbGxiYWNrKGlnLHtpc0Nvbm5lY3RlZDplIT09Im5vbmUiLG5ldHdvcmtUeXBlOmV9KX0pfWxldCBLQz1nbihpZywoKT0+e3MuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigibmV0Y2hhbmdlIixvZyl9KSxaQz1maSgib2ZmTmV0d29ya1N0YXR1c0NoYW5nZSIsKCk9PntzLmdsb2JhbEV2ZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm5ldGNoYW5nZSIsb2cpfSksYWc9RWUoImdldE5ldHdvcmtUeXBlIiwoZSx7cmVzb2x2ZTp0fSk9PntsZXQgbj1XYVtzLm5ldHdvcmtpbmZvLmdldEN1cnJlbnRUeXBlKCldfHwidW5rbm93biI7cmV0dXJuIHQoe25ldHdvcmtUeXBlOm59KX0pO2Z1bmN0aW9uIHNnKCl7aWYocy5vcy5uYW1lLnRvTG93ZXJDYXNlKCkhPT0iaW9zIilyZXR1cm4hMTtsZXQgdD1ZbygiZmFjZUlEIik7cmV0dXJuISEodCYmdC5pc1N1cHBvcnQoKSl9ZnVuY3Rpb24gbGcoKXtyZXR1cm4hIShzLmZpbmdlcnByaW50JiZzLmZpbmdlcnByaW50LmlzU3VwcG9ydCgpKX1sZXQgY2c9ZT0+e2xldCB0PVtdO3JldHVybiBsZygpJiZ0LnB1c2goImZpbmdlclByaW50Iiksc2coKSYmdC5wdXNoKCJmYWNpYWwiKSxlJiZlKHtzdXBwb3J0TW9kZTp0fSkse3N1cHBvcnRNb2RlOnQsZXJyTXNnOiJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb246b2sifX0sWEM9RWUoTTAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57Y2codCl9KSx1Zz0oe2NoZWNrQXV0aE1vZGU6ZSxyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPShjLGcpPT5uJiZuKGMsZyksbz1jPT50JiZ0KGMpO2lmKGU9PT0iZmluZ2VyUHJpbnQiKXtpZihsZygpKXtsZXQgYz1zLmZpbmdlcnByaW50LmlzS2V5Z3VhcmRTZWN1cmUoKSYmcy5maW5nZXJwcmludC5pc0Vucm9sbGVkRmluZ2VycHJpbnRzKCk7cmV0dXJuIG8oe2lzRW5yb2xsZWQ6Y30pLHtpc0Vucm9sbGVkOmMsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOm9rIn19cmV0dXJuIHIoIm5vdCBzdXBwb3J0Iix7aXNFbnJvbGxlZDohMX0pLHtpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19ZWxzZSBpZihlPT09ImZhY2lhbCIpe2lmKHNnKCkpe2xldCBjPVlvKCJmYWNlSUQiKSxnPWMmJmMuaXNLZXlndWFyZFNlY3VyZSgpJiZjLmlzRW5yb2xsZWRGYWNlSUQoKTtyZXR1cm4gbyh7aXNFbnJvbGxlZDpnfSkse2lzRW5yb2xsZWQ6ZyxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifX1yZXR1cm4gcigibm90IHN1cHBvcnQiLHtpc0Vucm9sbGVkOiExfSkse2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX1yZXR1cm4gcigibm90IHN1cHBvcnQiLHtpc0Vucm9sbGVkOiExfSkse2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX0sUUM9RWUoTDAsKHtjaGVja0F1dGhNb2RlOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3VnKHtjaGVja0F1dGhNb2RlOmUscmVzb2x2ZTp0LHJlamVjdDpufSl9LFYwLEYwKSxlQT1FZShVMCwoe3JlcXVlc3RBdXRoTW9kZXM6ZSxjaGFsbGVuZ2U6dD0hMSxhdXRoQ29udGVudDpufSx7cmVzb2x2ZTpyLHJlamVjdDpvfSk9PntKbigpO2xldHt0OmN9PWd0KCkse3N1cHBvcnRNb2RlOmd9PWNnKCk7aWYoIWcubGVuZ3RoKXJldHVybiBvKCJub3Qgc3VwcG9ydCIse2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMX0pO2xldCBiPVtdO2lmKGUuZm9yRWFjaChmdD0+e2cuaW5kZXhPZihmdCk+LTEmJmIucHVzaChmdCl9KSwhYi5sZW5ndGgpcmV0dXJuIG8oInN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vIGNvcnJlc3BvbmRpbmcgbW9kZSIse2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwM30pO2xldCBWPVtdO2lmKGIuZm9yRWFjaChmdD0+e3VnKHtjaGVja0F1dGhNb2RlOmZ0fSkuaXNFbnJvbGxlZCYmVi5wdXNoKGZ0KX0pLCFWLmxlbmd0aClyZXR1cm4gbyhgc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm8gJHtiWzBdfSBlbnJvbGxlZGAse2F1dGhNb2RlOmJbMF0sZXJyQ29kZTo5MDAxMX0pO2xldCBUPVZbMF0sRD1udWxsLHZlLHllPW58fGMoInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiKSxPZT1mdD0+e2xldHtjb2RlOmh0fT1mdCxWdD17YXV0aE1vZGU6VH0sd3Q9ezQ6KCk9PntEPyh5KHZlKSxELnNldFRpdGxlKGMoInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiKSksdmU9TigoKT0+e0QmJkQuc2V0VGl0bGUoeWUpfSwxZTMpKTpvKCIiLHouZXh0ZW5kKFZ0LHtlcnJDb2RlOjkwMDA5fSkpfSw1OigpPT57cy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxvKCJhdXRoZW50aWNhdGUgZnJlZXplLiBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIix6LmV4dGVuZChWdCx7ZXJyQ29kZTo5MDAxMH0pKX0sNjooKT0+e3MubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksbygiY2FuY2VsIix6LmV4dGVuZChWdCx7ZXJyQ29kZTo5MDAwOH0pKX19O2h0JiZ3dFtodF0/d3RbaHRdKCk6KHMubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksbygiIix6LmV4dGVuZChWdCx7ZXJyQ29kZTo5MDAwN30pKSl9O1Q9PT0iZmluZ2VyUHJpbnQiPyhzLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIiYmKEQ9cy5uYXRpdmVVSS5zaG93V2FpdGluZyh5ZSksRC5vbmNsb3NlPWZ1bmN0aW9uKCl7cy5maW5nZXJwcmludC5jYW5jZWwoKX0pLHMuZmluZ2VycHJpbnQuYXV0aGVudGljYXRlKCgpPT57cy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxyKHthdXRoTW9kZTpULGVyckNvZGU6MH0pfSxPZSx7bWVzc2FnZTp5ZX0pKTpUPT09ImZhY2lhbCImJllvKCJmYWNlSUQiKS5hdXRoZW50aWNhdGUoe21lc3NhZ2U6eWV9LGh0PT57aHQudHlwZT09PSJzdWNjZXNzIiYmaHQuY29kZT09PTA/cih7YXV0aE1vZGU6VCxlcnJDb2RlOjB9KTpPZShodCl9KX0sSDAsJDApLHRBPUVlKGowLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3BuKCk7bGV0e3Q6cn09Z3QoKSxjPXFoKCkhPT0ibGlnaHQiLGcsYj0hMSxWPVhpKHt1cmw6Il9fdW5pYXBwc2NhbiIsZGF0YTpPYmplY3QuYXNzaWduKHt9LGUse21lc3NhZ2VzOntmYWlsOnIoInVuaS5zY2FuQ29kZS5mYWlsIiksImZsYXNoLm9uIjpyKCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iKSwiZmxhc2gub2ZmIjpyKCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIil9fSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwicG9wLWluIix0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0eXBlOiJmbG9hdCIsdGl0bGVUZXh0OmUudGl0bGVUZXh0fHxyKCJ1bmkuc2NhbkNvZGUudGl0bGUiKSx0aXRsZUNvbG9yOiIjZmZmZmZmIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLGJ1dHRvbnM6ZS5vbmx5RnJvbUNhbWVyYT9bXTpbe3RleHQ6ZS5hbGJ1bVRleHR8fHIoInVuaS5zY2FuQ29kZS5hbGJ1bSIpLGZvbnRTaXplOiIxN3B4Iix3aWR0aDoiNjBweCIsb25jbGljazooKT0+e1Yuc2VuZE1lc3NhZ2Uoe3R5cGU6ImdhbGxlcnkifSl9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrZ3JvdW5kOiIjMDAwMDAwIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25NZXNzYWdlKHtldmVudDpULGRldGFpbDpEfSl7Zz1ELGI9VD09PSJtYXJrZWQifSxvbkNsb3NlKCl7YyYmcy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxnP2I/KGRlbGV0ZSBnLm1lc3NhZ2UsdChnKSk6bihnLm1lc3NhZ2UpOm4oImNhbmNlbCIpfX0pO2MmJihzLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxWLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsKHt0eXBlOlQscmVzdWx0OkR9KT0+e1Q9PT0ic3RhcnQiP3MubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6VD09PSJlbmQiJiYhRCYmcy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSl9LHowLEcwKSxmZz1lPT57b3QuaW52b2tlT25DYWxsYmFjayhLLk9OX1RIRU1FX0NIQU5HRSxlKX0sbkE9Z24oSy5PTl9USEVNRV9DSEFOR0UsKCk9PntvdC5vbihLLk9OX1RIRU1FX0NIQU5HRSxmZyl9KSxyQT1maShLLk9GRl9USEVNRV9DSEFOR0UsKCk9PntvdC5vZmYoSy5PTl9USEVNRV9DSEFOR0UsZmcpfSksaUE9RWUoUjAsKGUse3Jlc29sdmU6dH0pPT57bGV0IG49cy5zY3JlZW4uZ2V0QnJpZ2h0bmVzcyghMSk7dCh7dmFsdWU6bn0pfSksb0E9RWUoeDAsKGUse3Jlc29sdmU6dH0pPT57cy5zY3JlZW4uc2V0QnJpZ2h0bmVzcyhlLnZhbHVlLCExKSx0KCl9KSxhQT1FZShCMCwoZSx7cmVzb2x2ZTp0fSk9PntzLmRldmljZS5zZXRXYWtlbG9jayghIWUua2VlcFNjcmVlbk9uKSx0KCl9KSxzQT1MdChZMCwoKT0+e2xldHtnZXRTeXN0ZW1TZXR0aW5nOmV9PWYucmVxdWlyZU1vZHVsZSgicGx1cyIpLHQ9ZSgpO3RyeXt0eXBlb2YgdD09InN0cmluZyImJih0PUpTT04ucGFyc2UodCkpfWNhdGNoKG4pe31yZXR1cm4gdH0pLGRnPUx0KHEwLCgpPT57bGV0e2dldEFwcEF1dGhvcml6ZVNldHRpbmc6ZX09Zi5yZXF1aXJlTW9kdWxlKCJwbHVzIiksdD1lKCk7dHJ5e3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9SlNPTi5wYXJzZSh0KSl9Y2F0Y2gobil7fWZvcihsZXQgbiBpbiB0KXouaGFzT3duKHQsbikmJnRbbl09PT0idW5kZWZpbmVkIiYmKHRbbl09dm9pZCAwKTtyZXR1cm4gdH0pLGxBPUVlKEowLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpyfT1mLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtyKGM9PntjLnR5cGU9PT0ic3VjY2VzcyI/dCgpOm4oKX0pfSksY0E9RWUoTEUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9SnIrIi9kb3dubG9hZC8iO3MuaW8uZ2V0SW1hZ2VJbmZvKHouZXh0ZW5kKGUse3NhdmVQYXRoOnIsZmlsZW5hbWU6cixzdWNjZXNzOlhzKHQpLGZhaWw6cHIobil9KSl9LEZFLERFKSx1QT1FZShqRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntzLmlvLmdldFZpZGVvSW5mbyh7ZmlsZVBhdGg6ZS5zcmMsc3VjY2VzczpyPT57dCh7b3JpZW50YXRpb246ci5vcmllbnRhdGlvbix0eXBlOnIudHlwZSxkdXJhdGlvbjpyLmR1cmF0aW9uLHNpemU6ci5zaXplLGhlaWdodDpyLmhlaWdodCx3aWR0aDpyLndpZHRoLGZwczpyLmZwc3x8MzAsYml0cmF0ZTpyLmJpdHJhdGV9KX0sZmFpbDpwcihuKX0pfSxXRSx6RSksZkE9RWUoVkUsKHtjdXJyZW50OmU9MCxpbmRpY2F0b3I6dD0ibnVtYmVyIixsb29wOm49ITEsdXJsczpyLGxvbmdQcmVzc0FjdGlvbnM6b30se3Jlc29sdmU6YyxyZWplY3Q6Z30pPT57QmUoKTtsZXR7dDpifT1ndCgpO3I9ci5tYXAoVD0+SGUoVCkpO2xldCBWPU51bWJlcihlKTtpc05hTihWKT8oZT1yLmluZGV4T2YoSGUoZSkpLGU9ZTwwPzA6ZSk6ZT1WLHMubmF0aXZlVUkucHJldmlld0ltYWdlKHIse2N1cnJlbnQ6ZSxpbmRpY2F0b3I6dCxsb29wOm4sb25Mb25nUHJlc3M6ZnVuY3Rpb24oVCl7bGV0IEQ9W10sdmU9IiIseWU9byYmei5pc1BsYWluT2JqZWN0KG8pO3llPyhEPW8uaXRlbUxpc3Q/by5pdGVtTGlzdDpbXSx2ZT1vLml0ZW1Db2xvcj9vLml0ZW1Db2xvcjoiIzAwMDAwMCIpOihEPVtiKCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIildLHZlPSIjMDAwMDAwIik7bGV0IE9lPXtidXR0b25zOkQubWFwKGZ0PT4oe3RpdGxlOmZ0LGNvbG9yOnZlfSkpLGNhbmNlbDpiKCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCIpfTtzLm5hdGl2ZVVJLmFjdGlvblNoZWV0KE9lLGZ0PT57aWYoZnQuaW5kZXg+MCl7aWYoeWUpe3ouaXNGdW5jdGlvbihvLnN1Y2Nlc3MpJiZvLnN1Y2Nlc3Moe3RhcEluZGV4OmZ0LmluZGV4LTEsaW5kZXg6VC5pbmRleH0pO3JldHVybn1zLmdhbGxlcnkuc2F2ZShULnVybCwoKT0+e3MubmF0aXZlVUkudG9hc3QoYigidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiKSl9LGZ1bmN0aW9uKCl7cy5uYXRpdmVVSS50b2FzdChiKCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCIpKX0pfWVsc2UgeWUmJnouaXNGdW5jdGlvbihvLmZhaWwpJiZvLmZhaWwoe2Vyck1zZzoic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIn0pfSl9fSksYygpfSwkRSxVRSksZEE9RWUoSEUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57dHJ5e3MubmF0aXZlVUkuY2xvc2VQcmV2aWV3SW1hZ2UoKSx0KCl9Y2F0Y2gocil7bigpfX0pLHF1LFBsPSExLEp1LElsPShlLHQ9e30pPT57aEEoei5leHRlbmQoe3N0YXRlOmV9LHQpKX0sb2M9e3N0YXJ0KHtkdXJhdGlvbjplPTZlNCxzYW1wbGVSYXRlOnQsbnVtYmVyT2ZDaGFubmVsczpuLGVuY29kZUJpdFJhdGU6cixmb3JtYXQ6bz0ibXAzIixmcmFtZVNpemU6Y309e30pe2lmKFBsKXJldHVybiBJbCgic3RhcnQiKTtxdT1zLmF1ZGlvLmdldFJlY29yZGVyKCkscXUucmVjb3JkKHtmb3JtYXQ6byxzYW1wbGVyYXRlOnQ/U3RyaW5nKHQpOnZvaWQgMCxmaWxlbmFtZTpKcisiL3JlY29yZGVyLyJ9LGc9PklsKCJzdG9wIix7dGVtcEZpbGVQYXRoOmd9KSxnPT5JbCgiZXJyb3IiLHtlcnJNc2c6Zy5tZXNzYWdlfSkpLEp1PU4oKCk9PntvYy5zdG9wKCl9LGUpLElsKCJzdGFydCIpLFBsPSEwfSxzdG9wKCl7UGwmJihxdS5zdG9wKCksUGw9ITEsSnUmJnkoSnUpKX0scGF1c2UoKXtQbCYmSWwoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHBhdXNlIn0pfSxyZXN1bWUoKXtQbCYmSWwoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHJlc3VtZSJ9KX19LFFzPXtwYXVzZTpudWxsLHJlc3VtZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsLGVycm9yOm51bGx9O2Z1bmN0aW9uIGhBKGUpe2xldCB0PWUuc3RhdGU7ZGVsZXRlIGUuc3RhdGUsZGVsZXRlIGUuZXJyTXNnLHQmJnouaXNGdW5jdGlvbihRc1t0XSkmJlFzW3RdKGUpfWNsYXNzIGdBe2NvbnN0cnVjdG9yKCl7fW9uRXJyb3IodCl7UXMuZXJyb3I9dH1vbkZyYW1lUmVjb3JkZWQodCl7fW9uSW50ZXJydXB0aW9uQmVnaW4odCl7fW9uSW50ZXJydXB0aW9uRW5kKHQpe31vblBhdXNlKHQpe1FzLnBhdXNlPXR9b25SZXN1bWUodCl7UXMucmVzdW1lPXR9b25TdGFydCh0KXtRcy5zdGFydD10fW9uU3RvcCh0KXtRcy5zdG9wPXR9cGF1c2UoKXtvYy5wYXVzZSgpfXJlc3VtZSgpe29jLnJlc3VtZSgpfXN0YXJ0KHQ9e30pe29jLnN0YXJ0KHQpfXN0b3AoKXtvYy5zdG9wKCl9fWxldCBoZyxwQT1MdChYRSwoKT0+aGd8fChoZz1uZXcgZ0EpKSx2QT1FZShKRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntzLmdhbGxlcnkuc2F2ZShlLmZpbGVQYXRoLFhzKHQpLHByKG4pKX0sWkUsS0UpLG1BPUVlKEdFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3MuZ2FsbGVyeS5zYXZlKGUuZmlsZVBhdGgsWHModCkscHIobikpfSxxRSxZRSksX0E9RWUoUUUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9YCR7SnJ9L2NvbXByZXNzZWQvJHtEYXRlLm5vdygpfV8ke0dhKGUuc3JjKX1gLHtjb21wcmVzc2VkV2lkdGg6byxjb21wcmVzc2VkSGVpZ2h0OmN9PWU7dHlwZW9mIG89PSJudW1iZXIiJiYoZS53aWR0aD1vKyJweCIpLHR5cGVvZiBjPT0ibnVtYmVyIiYmKGUuaGVpZ2h0PWMrInB4Iikscy56aXAuY29tcHJlc3NJbWFnZSh6LmV4dGVuZCh7fSxlLHtkc3Q6cn0pLCgpPT57dCh7dGVtcEZpbGVQYXRoOnJ9KX0sbil9LHR5LGV5KSxiQT1FZShueSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1gJHtKcn0vY29tcHJlc3NlZC8ke0RhdGUubm93KCl9XyR7R2EoZS5zcmMpfWA7cy56aXAuY29tcHJlc3NWaWRlbyh6LmV4dGVuZCh7fSxlLHtmaWxlbmFtZTpyfSksbz0+e3Qoe3RlbXBGaWxlUGF0aDpyLHNpemU6by5zaXplfSl9LG4pfSxpeSxyeSk7ZnVuY3Rpb24gRUEoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57cy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUsZnVuY3Rpb24ocil7ci5nZXRNZXRhZGF0YSh0LG4sITEpfSxuKX0pfWxldCB5QT1FZShORSwoe2NvdW50OmUsc2l6ZVR5cGU6dCxzb3VyY2VUeXBlOm4sY3JvcDpyfT17fSx7cmVzb2x2ZTpvLHJlamVjdDpjfSk9PntYKCk7bGV0e3Q6Z309Z3QoKSxiPXByKGMpO2Z1bmN0aW9uIFYodmUpe2xldCB5ZT1bXSxPZT1bXTtQcm9taXNlLmFsbCh2ZS5tYXAoZnQ9PkVBKGZ0KSkpLnRoZW4oZnQ9PntmdC5mb3JFYWNoKChodCxWdCk9PntsZXQgd3Q9dmVbVnRdO09lLnB1c2god3QpLHllLnB1c2goe3BhdGg6d3Qsc2l6ZTpodC5zaXplfSl9KSxvKHt0ZW1wRmlsZVBhdGhzOk9lLHRlbXBGaWxlczp5ZX0pfSkuY2F0Y2goYil9ZnVuY3Rpb24gVCgpe3MuY2FtZXJhLmdldENhbWVyYSgpLmNhcHR1cmVJbWFnZSh5ZT0+VihbeWVdKSxiLHtmaWxlbmFtZTpKcisiL2NhbWVyYS8iLHJlc29sdXRpb246ImhpZ2giLGNyb3A6cixzaXplVHlwZTp0fSl9ZnVuY3Rpb24gRCgpe3MuZ2FsbGVyeS5waWNrKCh7ZmlsZXM6dmV9KT0+Vih2ZSksYix7bWF4aW11bTplLG11bHRpcGxlOiEwLHN5c3RlbTohMSxmaWxlbmFtZTpKcisiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsY3JvcDpyLHNpemVUeXBlOnR9KX1pZihuLmxlbmd0aD09PTEpe2lmKG4uaW5jbHVkZXMoImFsYnVtIikpe0QoKTtyZXR1cm59ZWxzZSBpZihuLmluY2x1ZGVzKCJjYW1lcmEiKSl7VCgpO3JldHVybn19cy5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmcoInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6ZygidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpnKCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSIpfV19LHZlPT57c3dpdGNoKHZlLmluZGV4KXtjYXNlIDE6VCgpO2JyZWFrO2Nhc2UgMjpEKCk7YnJlYWs7ZGVmYXVsdDpiKCk7YnJlYWt9fSl9LFJFLGtFKSxTQT1FZSh4RSwoe3NvdXJjZVR5cGU6ZSxjb21wcmVzc2VkOnQsbWF4RHVyYXRpb246bixjYW1lcmE6cn0se3Jlc29sdmU6byxyZWplY3Q6Y30pPT57c2UoKTtsZXR7dDpnfT1ndCgpLGI9cHIoYyk7ZnVuY3Rpb24gVih2ZSl7cy5pby5nZXRWaWRlb0luZm8oe2ZpbGVQYXRoOnZlLHN1Y2Nlc3MoeWUpe2xldCBPZT17ZXJyTXNnOiJjaG9vc2VWaWRlbzpvayIsdGVtcEZpbGVQYXRoOnZlLHNpemU6eWUuc2l6ZSxkdXJhdGlvbjp5ZS5kdXJhdGlvbix3aWR0aDp5ZS53aWR0aCxoZWlnaHQ6eWUuaGVpZ2h0fTtvKE9lKX0sZmFpbDpifSl9ZnVuY3Rpb24gVCgpe3MuZ2FsbGVyeS5waWNrKCh7ZmlsZXM6dmV9KT0+Vih2ZVswXSksYix7ZmlsdGVyOiJ2aWRlbyIsc3lzdGVtOiExLG11bHRpcGxlOiEwLG1heGltdW06MSxmaWxlbmFtZTpKcisiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsdmlkZW9Db21wcmVzczp0fSl9ZnVuY3Rpb24gRCgpe3MuY2FtZXJhLmdldENhbWVyYSgpLnN0YXJ0VmlkZW9DYXB0dXJlKFYsYix7aW5kZXg6cj09PSJmcm9udCI/IjIiOiIxIix2aWRlb01heGltdW1EdXJhdGlvbjpuLGZpbGVuYW1lOkpyKyIvY2FtZXJhLyIsdmlkZW9Db21wcmVzczp0fSl9aWYoZS5sZW5ndGg9PT0xKXtpZihlLmluY2x1ZGVzKCJhbGJ1bSIpKXtUKCk7cmV0dXJufWVsc2UgaWYoZS5pbmNsdWRlcygiY2FtZXJhIikpe0QoKTtyZXR1cm59fXMubmF0aXZlVUkuYWN0aW9uU2hlZXQoe2NhbmNlbDpnKCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIiksYnV0dG9uczpbe3RpdGxlOmcoInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSIpfSx7dGl0bGU6ZygidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iKX1dfSx2ZT0+e3N3aXRjaCh2ZS5pbmRleCl7Y2FzZSAxOkQoKTticmVhaztjYXNlIDI6VCgpO2JyZWFrO2RlZmF1bHQ6YigpO2JyZWFrfX0pfSxNRSxCRSksd0E9RWUoeUUsKGUse3Jlc29sdmU6dH0pPT57cy5rZXkuc2hvd1NvZnRLZXlib3JkKCksdCgpfSksQ0E9RWUoRUUsKGUse3Jlc29sdmU6dH0pPT57cy5rZXkuaGlkZVNvZnRLZXlib3JkKCksdCgpfSk7ZnVuY3Rpb24gZ2coZSl7b3QuaW52b2tlT25DYWxsYmFjayhLLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsZSl9bGV0IEFBPWduKEsuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSwoKT0+e290Lm9uKEsuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSxnZyl9KSxPQT1maShLLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsKCk9PntvdC5vZmYoSy5PTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFLGdnKX0pO2NsYXNzIFRBe2NvbnN0cnVjdG9yKHQpe3RoaXMuX2NhbGxiYWNrcz1bXSx0aGlzLl9kb3dubG9hZGVyPXQsdC5hZGRFdmVudExpc3RlbmVyKCJzdGF0ZWNoYW5nZWQiLChuLHIpPT57bi5kb3dubG9hZGVkU2l6ZSYmbi50b3RhbFNpemUmJnRoaXMuX2NhbGxiYWNrcy5mb3JFYWNoKG89PntvKHtwcm9ncmVzczpNYXRoLnJvdW5kKG4uZG93bmxvYWRlZFNpemUvbi50b3RhbFNpemUqMTAwKSx0b3RhbEJ5dGVzV3JpdHRlbjpuLmRvd25sb2FkZWRTaXplLHRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGU6bi50b3RhbFNpemV9KX0pfSl9YWJvcnQoKXt0aGlzLl9kb3dubG9hZGVyLmFib3J0KCl9b25Qcm9ncmVzc1VwZGF0ZSh0KXshei5pc0Z1bmN0aW9uKHQpfHx0aGlzLl9jYWxsYmFja3MucHVzaCh0KX1vZmZQcm9ncmVzc1VwZGF0ZSh0KXtsZXQgbj10aGlzLl9jYWxsYmFja3MuaW5kZXhPZih0KTtuPj0wJiZ0aGlzLl9jYWxsYmFja3Muc3BsaWNlKG4sMSl9b25IZWFkZXJzUmVjZWl2ZWQodCl7dGhyb3cgbmV3IEVycm9yKCJNZXRob2Qgbm90IGltcGxlbWVudGVkLiIpfW9mZkhlYWRlcnNSZWNlaXZlZCh0KXt0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIil9fWxldCBQQT1QcihweSwoe3VybDplLGhlYWRlcjp0LHRpbWVvdXQ6bn0se3Jlc29sdmU6cixyZWplY3Q6b30pPT57bj0obnx8Ui5uZXR3b3JrVGltZW91dCYmUi5uZXR3b3JrVGltZW91dC5yZXF1ZXN0fHw2MCoxZTMpLzFlMztsZXQgYz1zLmRvd25sb2FkZXIuY3JlYXRlRG93bmxvYWQoZSx7dGltZW91dDpuLGZpbGVuYW1lOkpyKyIvZG93bmxvYWQvIixyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sKGIsVik9PntWP3Ioe3RlbXBGaWxlUGF0aDpiLmZpbGVuYW1lLHN0YXR1c0NvZGU6Vn0pOm8oYHN0YXR1c0NvZGU6ICR7Vn1gKX0pLGc9bmV3IFRBKGMpO2ZvcihsZXQgYiBpbiB0KXouaGFzT3duKHQsYikmJmMuc2V0UmVxdWVzdEhlYWRlcihiLHRbYl0pO3JldHVybiBjLnN0YXJ0KCksZ30sbXksdnkpLElBPWU9PntsZXQgdD1lWyJTZXQtQ29va2llIl18fGVbInNldC1jb29raWUiXSxuPVtdO2lmKCF0KXJldHVybltdO3RbMF09PT0iWyImJnRbdC5sZW5ndGgtMV09PT0iXSImJih0PXQuc2xpY2UoMSwtMSkpO2xldCByPXQuc3BsaXQoIjsiKTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKylyW29dLmluZGV4T2YoIkV4cGlyZXM9IikhPT0tMXx8cltvXS5pbmRleE9mKCJleHBpcmVzPSIpIT09LTE/bi5wdXNoKHJbb10ucmVwbGFjZSgiLCIsIiIpKTpuLnB1c2gocltvXSk7cmV0dXJuIG49bi5qb2luKCI7Iikuc3BsaXQoIiwiKSxufTtmdW5jdGlvbiBOQShlLHQpe2lmKHouaXNTdHJpbmcoZS5kYXRhKSYmZS5kYXRhLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKGUuZGF0YT1lLmRhdGEuc2xpY2UoMSkpLGUuc3RhdHVzQ29kZT1wYXJzZUludChTdHJpbmcoZS5zdGF0dXNDb2RlKSwxMCksei5pc1BsYWluT2JqZWN0KGUuaGVhZGVyKSYmKGUuaGVhZGVyPU9iamVjdC5rZXlzKGUuaGVhZGVyKS5yZWR1Y2UoZnVuY3Rpb24obixyKXtsZXQgbz1lLmhlYWRlcltyXTtyZXR1cm4gei5pc0FycmF5KG8pP25bcl09by5qb2luKCIsIik6ei5pc1N0cmluZyhvKSYmKG5bcl09byksbn0se30pKSx0LmRhdGFUeXBlJiZ0LmRhdGFUeXBlLnRvTG93ZXJDYXNlKCk9PT0ianNvbiIpdHJ5e2UuZGF0YT1KU09OLnBhcnNlKGUuZGF0YSl9Y2F0Y2gobil7fXJldHVybiBlfWNsYXNzIGtBe2NvbnN0cnVjdG9yKHQpe3RoaXMuX3JlcXVlc3RUYXNrPXR9YWJvcnQoKXt0aGlzLl9yZXF1ZXN0VGFzay5hYm9ydCgpfW9mZkhlYWRlcnNSZWNlaXZlZCgpe31vbkhlYWRlcnNSZWNlaXZlZCgpe319bGV0IFJBPVByKG95LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtoZWFkZXI6cixtZXRob2Q6byxkYXRhOmMsdGltZW91dDpnLHVybDpiLHJlc3BvbnNlVHlwZTpWLHNzbFZlcmlmeTpULGZpcnN0SXB2NDpELHRsczp2ZX09ZSx5ZTtmb3IobGV0IFN0IGluIHIpaWYoU3QudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiKXt5ZT1yW1N0XTticmVha31vIT09IkdFVCImJnllJiZ5ZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uIik9PT0wJiZ6LmlzUGxhaW5PYmplY3QoYykmJihjPUpTT04uc3RyaW5naWZ5KGMpKTtsZXQgT2U9WW8oInN0cmVhbSIpLGZ0PXt9LGh0LFZ0LHd0PSExO2ZvcihsZXQgU3QgaW4gcilpZighd3QmJlN0LnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIil7aWYod3Q9ITAsZnRbIkNvbnRlbnQtVHlwZSJdPXJbU3RdLG8hPT0iR0VUIiYmcltTdF0uaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik9PT0wJiYhei5pc1N0cmluZyhjKSYmIShjIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXtsZXQgWHQ9W107Zm9yKGxldCBkbiBpbiBjKXouaGFzT3duKGMsZG4pJiZYdC5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChkbikrIj0iK2VuY29kZVVSSUNvbXBvbmVudChjW2RuXSkpO2M9WHQuam9pbigiJiIpfX1lbHNlIGZ0W1N0XT1yW1N0XTshd3QmJm89PT0iUE9TVCImJihmdFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIpLGcmJihodD1OKCgpPT57VnQ9ITAsbigidGltZW91dCIpfSxnKzIwMCkpO2xldCBFbj17bWV0aG9kOm8sdXJsOmIudHJpbSgpLGhlYWRlcnM6ZnQsdHlwZTpWPT09ImFycmF5YnVmZmVyIj8iYmFzZTY0IjoidGV4dCIsdGltZW91dDpnfHw2ZTUsc3NsVmVyaWZ5OiFULGZpcnN0SXB2NDpELHRsczp2ZX0sb249ITE7byE9PSJHRVQiJiYodG9TdHJpbmcuY2FsbChjKT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/b249ITA6RW4uYm9keT16LmlzU3RyaW5nKGMpP2M6SlNPTi5zdHJpbmdpZnkoYykpO2xldCBhbj0oe29rOlN0LHN0YXR1czpYdCxkYXRhOmRuLGhlYWRlcnM6dG4sZXJyb3JNc2c6VG59KT0+e2lmKFZ0KXJldHVybjtodCYmeShodCk7bGV0IHZyPVh0O2lmKHZyPjApdChOQSh7ZGF0YTpTdCYmVj09PSJhcnJheWJ1ZmZlciI/enIoZG4pOmRuLHN0YXR1c0NvZGU6dnIsaGVhZGVyOnRuLGNvb2tpZXM6SUEodG4pfSxlKSk7ZWxzZXtsZXQgc249ImFib3J0IHN0YXR1c0NvZGU6Iit2cjtUbiYmKHNuPXNuKyIgIitUbiksbihzbil9fTtyZXR1cm4gb24/T2UuZmV0Y2hXaXRoQXJyYXlCdWZmZXIoeyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OkxyKGMpfSxFbixhbik6T2UuZmV0Y2goRW4sYW4pLG5ldyBrQSh7YWJvcnQoKXtWdD0hMCxodCYmeShodCksbigiYWJvcnQiKX19KX0sdXksZnkpLHhBPUVlKGR5LCh7Y2VydGlmaWNhdGVzOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e1lvKCJzdHJlYW0iKS5jb25maWdNVExTKGUsKHt0eXBlOm8sY29kZTpjLG1lc3NhZ2U6Z30pPT57c3dpdGNoKG8pe2Nhc2Uic3VjY2VzcyI6dCh7Y29kZTpjfSk7YnJlYWs7Y2FzZSJmYWlsIjpuKGcse2NvZGU6Y30pO2JyZWFrfX0pfSxoeSxneSksTmw9W10sa2w9e30sS3U9e29wZW46IiIsY2xvc2U6IiIsZXJyb3I6IiIsbWVzc2FnZToiIn0sYWM7ZnVuY3Rpb24gQkEoZSl7bGV0IHQ9U3RyaW5nKERhdGUubm93KCkpLG47dHJ5e2FjfHwoYWM9WW8oInVuaS13ZWJTb2NrZXQiKSxNQShhYykpLGFjLldlYlNvY2tldCh7aWQ6dCx1cmw6ZS51cmwscHJvdG9jb2w6ei5pc0FycmF5KGUucHJvdG9jb2xzKT9lLnByb3RvY29scy5qb2luKCIsIik6ZS5wcm90b2NvbHMsaGVhZGVyOmUuaGVhZGVyfSl9Y2F0Y2gocil7bj1yfXJldHVybntzb2NrZXQ6YWMsc29ja2V0SWQ6dCxlcnJNc2c6bn19ZnVuY3Rpb24gTUEoZSl7ZS5vbm9wZW4odD0+e2xldCBuPWtsW3QuaWRdOyFufHxuLl9zb2NrZXRPbk9wZW4oKX0pLGUub25tZXNzYWdlKHQ9PntsZXQgbj1rbFt0LmlkXTshbnx8bi5fc29ja2V0T25NZXNzYWdlKHQpfSksZS5vbmVycm9yKHQ9PntsZXQgbj1rbFt0LmlkXTshbnx8bi5fc29ja2V0T25FcnJvcigpfSksZS5vbmNsb3NlKHQ9PntsZXR7aWQ6bixjb2RlOnIscmVhc29uOm99PXQsYz1rbFtuXTshY3x8Yy5fc29ja2V0T25DbG9zZSh7Y29kZTpyLHJlYXNvbjpvfSl9KX1jbGFzcyBMQXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaWQ9bix0aGlzLl9zb2NrZXQ9dCx0aGlzLl9jYWxsYmFja3M9e29wZW46W10sY2xvc2U6W10sZXJyb3I6W10sbWVzc2FnZTpbXX0sdGhpcy5DTE9TRUQ9Myx0aGlzLkNMT1NJTkc9Mix0aGlzLkNPTk5FQ1RJTkc9MCx0aGlzLk9QRU49MSx0aGlzLnJlYWR5U3RhdGU9dGhpcy5DTE9TRUQsISF0aGlzLl9zb2NrZXR9X3NvY2tldE9uT3Blbigpe3RoaXMucmVhZHlTdGF0ZT10aGlzLk9QRU4sdGhpcy5zb2NrZXRTdGF0ZUNoYW5nZSgib3BlbiIpfV9zb2NrZXRPbk1lc3NhZ2UodCl7dGhpcy5zb2NrZXRTdGF0ZUNoYW5nZSgibWVzc2FnZSIse2RhdGE6dHlwZW9mIHQuZGF0YT09Im9iamVjdCI/enIodC5kYXRhLmJhc2U2NCk6dC5kYXRhfSl9X3NvY2tldE9uRXJyb3IoKXt0aGlzLnNvY2tldFN0YXRlQ2hhbmdlKCJlcnJvciIpLHRoaXMub25FcnJvck9yQ2xvc2UoKX1fc29ja2V0T25DbG9zZSh0KXt0aGlzLnNvY2tldFN0YXRlQ2hhbmdlKCJjbG9zZSIsdCksdGhpcy5vbkVycm9yT3JDbG9zZSgpfW9uRXJyb3JPckNsb3NlKCl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VELGRlbGV0ZSBrbFt0aGlzLmlkXTtsZXQgdD1ObC5pbmRleE9mKHRoaXMpO3Q+PTAmJk5sLnNwbGljZSh0LDEpfXNvY2tldFN0YXRlQ2hhbmdlKHQsbj17fSl7bGV0e2NvZGU6cixyZWFzb246b309bixjPXQ9PT0ibWVzc2FnZSI/e2RhdGE6bi5kYXRhfTp0PT09ImNsb3NlIj97Y29kZTpyLHJlYXNvbjpvfTp7fTt0aGlzPT09TmxbMF0mJkt1W3RdJiZvdC5pbnZva2VPbkNhbGxiYWNrKEt1W3RdLGMpLHRoaXMuX2NhbGxiYWNrc1t0XS5mb3JFYWNoKGc9Pnt6LmlzRnVuY3Rpb24oZykmJmcoYyl9KX1zZW5kKHQsbj0hMCl7dGhpcy5yZWFkeVN0YXRlIT09dGhpcy5PUEVOJiZLLmNhbGxPcHRpb25zKHQsInNlbmRTb2NrZXRNZXNzYWdlOmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTt0cnl7dGhpcy5fc29ja2V0LnNlbmQoe2lkOnRoaXMuaWQsZGF0YTp0eXBlb2YgdC5kYXRhPT0ib2JqZWN0Ij97IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6THIodC5kYXRhKX06dC5kYXRhfSksbiYmSy5jYWxsT3B0aW9ucyh0LCJzZW5kU29ja2V0TWVzc2FnZTpvayIpfWNhdGNoKHIpe24mJksuY2FsbE9wdGlvbnModCxgc2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCAke3J9YCl9fWNsb3NlKHQsbj0hMCl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0lORzt0cnl7dGhpcy5fc29ja2V0LmNsb3NlKHouZXh0ZW5kKHtpZDp0aGlzLmlkLGFyZ3M6dH0pKSxuJiZLLmNhbGxPcHRpb25zKHQsImNsb3NlU29ja2V0Om9rIil9Y2F0Y2gocil7biYmSy5jYWxsT3B0aW9ucyh0LGBjbG9zZVNvY2tldDpmYWlsICR7cn1gKX19b25PcGVuKHQpe3RoaXMuX2NhbGxiYWNrcy5vcGVuLnB1c2godCl9b25DbG9zZSh0KXt0aGlzLl9jYWxsYmFja3MuY2xvc2UucHVzaCh0KX1vbkVycm9yKHQpe3RoaXMuX2NhbGxiYWNrcy5lcnJvci5wdXNoKHQpfW9uTWVzc2FnZSh0KXt0aGlzLl9jYWxsYmFja3MubWVzc2FnZS5wdXNoKHQpfX1sZXQgREE9UHIoeXksKHt1cmw6ZSxwcm90b2NvbHM6dCxoZWFkZXI6bixtZXRob2Q6cn0se3Jlc29sdmU6byxyZWplY3Q6Y30pPT57bGV0e3NvY2tldDpnLHNvY2tldElkOmIsZXJyTXNnOlZ9PUJBKHt1cmw6ZSxwcm90b2NvbHM6dCxoZWFkZXI6bixtZXRob2Q6cn0pLFQ9bmV3IExBKGcsYik7cmV0dXJuIFY/TigoKT0+e2MoVil9LDApOihObC5wdXNoKFQpLGtsW2JdPVQpLE4oKCk9PntvKCl9LDApLFR9LHd5LFN5KSxGQT1FZShDeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1ObFswXTtpZighcnx8ci5yZWFkeVN0YXRlIT09ci5PUEVOKXtuKCJXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCIpO3JldHVybn1yLnNlbmQoe2RhdGE6ZS5kYXRhfSwhMSksdCgpfSxBeSksVkE9RWUoT3ksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9TmxbMF07aWYoIXIpe24oIldlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIik7cmV0dXJufXIucmVhZHlTdGF0ZT1yLkNMT1NJTkcsci5jbG9zZShlLCExKSx0KCl9LFR5KTtmdW5jdGlvbiBCYyhlKXtsZXQgdD1gb25Tb2NrZXQke3ouY2FwaXRhbGl6ZShlKX1gO3JldHVybiBnbih0LCgpPT57S3VbZV09dH0pfWxldCBVQT1CYygib3BlbiIpLCRBPUJjKCJlcnJvciIpLEhBPUJjKCJtZXNzYWdlIiksakE9QmMoImNsb3NlIik7Y2xhc3MgekF7Y29uc3RydWN0b3IodCl7dGhpcy5fY2FsbGJhY2tzPVtdLHRoaXMuX3VwbG9hZGVyPXQsdC5hZGRFdmVudExpc3RlbmVyKCJzdGF0ZWNoYW5nZWQiLChuLHIpPT57bi51cGxvYWRlZFNpemUmJm4udG90YWxTaXplJiZ0aGlzLl9jYWxsYmFja3MuZm9yRWFjaChvPT57byh7cHJvZ3Jlc3M6cGFyc2VJbnQoU3RyaW5nKG4udXBsb2FkZWRTaXplL24udG90YWxTaXplKjEwMCkpLHRvdGFsQnl0ZXNTZW50Om4udXBsb2FkZWRTaXplLHRvdGFsQnl0ZXNFeHBlY3RlZFRvU2VuZDpuLnRvdGFsU2l6ZX0pfSl9KX1hYm9ydCgpe3RoaXMuX3VwbG9hZGVyLmFib3J0KCl9b25Qcm9ncmVzc1VwZGF0ZSh0KXshei5pc0Z1bmN0aW9uKHQpfHx0aGlzLl9jYWxsYmFja3MucHVzaCh0KX1vbkhlYWRlcnNSZWNlaXZlZCgpe31vZmZQcm9ncmVzc1VwZGF0ZSh0KXtsZXQgbj10aGlzLl9jYWxsYmFja3MuaW5kZXhPZih0KTtuPj0wJiZ0aGlzLl9jYWxsYmFja3Muc3BsaWNlKG4sMSl9b2ZmSGVhZGVyc1JlY2VpdmVkKCl7fX1sZXQgV0E9UHIoX3ksKHt1cmw6ZSx0aW1lb3V0OnQsaGVhZGVyOm4sZm9ybURhdGE6cixmaWxlczpvLGZpbGVQYXRoOmMsbmFtZTpnfSx7cmVzb2x2ZTpiLHJlamVjdDpWfSk9Pnt0PSh0fHxSLm5ldHdvcmtUaW1lb3V0JiZSLm5ldHdvcmtUaW1lb3V0LnVwbG9hZEZpbGV8fDYwKjFlMykvMWUzO2xldCBUPXMudXBsb2FkZXIuY3JlYXRlVXBsb2FkKGUse3RpbWVvdXQ6dCxyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sKHZlLHllKT0+e3llP2Ioe2RhdGE6dmUucmVzcG9uc2VUZXh0LHN0YXR1c0NvZGU6eWV9KTpWKGBzdGF0dXNDb2RlOiAke3llfWApfSk7Zm9yKGxldCB2ZSBpbiBuKXouaGFzT3duKG4sdmUpJiZULnNldFJlcXVlc3RIZWFkZXIodmUsU3RyaW5nKG5bdmVdKSk7Zm9yKGxldCB2ZSBpbiByKXouaGFzT3duKHIsdmUpJiZULmFkZERhdGEodmUsU3RyaW5nKHJbdmVdKSk7byYmby5sZW5ndGg/by5mb3JFYWNoKHZlPT57VC5hZGRGaWxlKEhlKHZlLnVyaSkse2tleTp2ZS5uYW1lfHwiZmlsZSJ9KX0pOlQuYWRkRmlsZShIZShjKSx7a2V5Omd9KTtsZXQgRD1uZXcgekEoVCk7cmV0dXJuIFQuc3RhcnQoKSxEfSxFeSxieSksUHM9e30sR0E9WyJwbGF5IiwiY2FucGxheSIsImVuZGVkIiwic3RvcCIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIiwicGF1c2UiXSxwZz0icGxheWJhY2siLFlBPTIwMCxxQT1lPT57bGV0IHQ9UHNbZV07IXR8fHQuaW5pdFN0YXRlQ2hhZ2V8fCh0LmluaXRTdGF0ZUNoYWdlPSEwLHQuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG49Pnt2Zyh7c3RhdGU6ImVycm9yIixhdWRpb0lkOmUsZXJyTXNnOiJNZWRpYUVycm9yIixlcnJDb2RlOm4uY29kZX0pfSksR0EuZm9yRWFjaChuPT57dC5hZGRFdmVudExpc3RlbmVyKG4sKCk9PntuPT09InBsYXkiP3QuaXNTdG9wcGVkPSExOm49PT0ic3RvcCImJih0LmlzU3RvcHBlZD0hMCksdmcoe3N0YXRlOm4sYXVkaW9JZDplfSl9KX0pKX07ZnVuY3Rpb24gSkEoKXtsZXQgZT1gJHtEYXRlLm5vdygpfSR7TWF0aC5yYW5kb20oKX1gLHQ9UHNbZV09cy5hdWRpby5jcmVhdGVQbGF5ZXIoIiIpO3JldHVybiB0LnNyYz0iIix0LnZvbHVtZT0xLHQuc3RhcnRUaW1lPTAsdC5zZXRTZXNzaW9uQ2F0ZWdvcnkocGcpLHtlcnJNc2c6ImNyZWF0ZUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6ZX19ZnVuY3Rpb24gS0Eoe2F1ZGlvSWQ6ZSxzcmM6dCxzdGFydFRpbWU6bixhdXRvcGxheTpyPSExLGxvb3A6bz0hMSxvYmV5TXV0ZVN3aXRjaDpjLHZvbHVtZTpnLHNlc3Npb25DYXRlZ29yeTpiPXBnLHBsYXliYWNrUmF0ZTpWfSl7bGV0IFQ9UHNbZV07aWYoVCl7bGV0IEQ9e2xvb3A6byxhdXRvcGxheTpyfTtpZih0KXtsZXQgdmU9SGUodCk7VC5zcmMhPT12ZSYmKFQuc3JjPUQuc3JjPXZlKX1uJiYoVC5zdGFydFRpbWU9RC5zdGFydFRpbWU9biksdHlwZW9mIGc9PSJudW1iZXIiJiYoVC52b2x1bWU9RC52b2x1bWU9ZyksVC5zZXRTdHlsZXMoRCksYiYmVC5zZXRTZXNzaW9uQ2F0ZWdvcnkoYiksViYmVC5wbGF5YmFja1JhdGUmJlQucGxheWJhY2tSYXRlKFYpLHFBKGUpfXJldHVybntlcnJNc2c6InNldEF1ZGlvU3RhdGU6b2sifX1mdW5jdGlvbiBaQSh7YXVkaW9JZDplfSl7bGV0IHQ9UHNbZV07aWYoIXQpcmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpmYWlsIn07bGV0e3NyYzpuLHN0YXJ0VGltZTpyLHZvbHVtZTpvfT10O3JldHVybntlcnJNc2c6ImdldEF1ZGlvU3RhdGU6b2siLGR1cmF0aW9uOjFlMyoodC5nZXREdXJhdGlvbigpfHwwKSxjdXJyZW50VGltZTp0LmlzU3RvcHBlZD8wOjFlMyp0LmdldFBvc2l0aW9uKCkscGF1c2VkOnQuaXNQYXVzZWQoKSxzcmM6bix2b2x1bWU6byxzdGFydFRpbWU6MWUzKnIsYnVmZmVyZWQ6MWUzKnQuZ2V0QnVmZmVyZWQoKX19ZnVuY3Rpb24gWEEoe29wZXJhdGlvblR5cGU6ZSxhdWRpb0lkOnQsY3VycmVudFRpbWU6bn0pe2xldCByPVBzW3RdO3N3aXRjaChlKXtjYXNlInBsYXkiOmNhc2UicGF1c2UiOmNhc2Uic3RvcCI6cltlPT09InBsYXkiJiZyLmlzUGF1c2VkKCk/InJlc3VtZSI6ZV0oKTticmVhaztjYXNlInNlZWsiOnR5cGVvZiBuIT0idW5kZWZpbmVkIiYmci5zZWVrVG8obi8xZTMpO2JyZWFrfXJldHVybntlcnJNc2c6Im9wZXJhdGVBdWRpbzpvayJ9fWxldCBadT1PYmplY3QuY3JlYXRlKG51bGwpLHZnPSh7c3RhdGU6ZSxhdWRpb0lkOnQsZXJyTXNnOm4sZXJyQ29kZTpyfSk9PntsZXQgbz1adVt0XTtpZihvKWlmKFF1KG8sZSxuLHIpLGU9PT0icGxheSIpe2xldCBjPW8uY3VycmVudFRpbWU7UXUobywidGltZVVwZGF0ZSIpLG8uX190aW1pbmc9aCgoKT0+e28uY3VycmVudFRpbWUhPT1jJiZRdShvLCJ0aW1lVXBkYXRlIil9LFlBKX1lbHNlKGU9PT0icGF1c2UifHxlPT09InN0b3AifHxlPT09ImVycm9yIikmJkUoby5fX3RpbWluZyl9LFFBPVt7bmFtZToic3JjIixjYWNoZTohMH0se25hbWU6InN0YXJ0VGltZSIsZGVmYXVsdDowLGNhY2hlOiEwfSx7bmFtZToiYXV0b3BsYXkiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJsb29wIixkZWZhdWx0OiExLGNhY2hlOiEwfSx7bmFtZToib2JleU11dGVTd2l0Y2giLGRlZmF1bHQ6ITAscmVhZG9ubHk6ITAsY2FjaGU6ITB9LHtuYW1lOiJkdXJhdGlvbiIscmVhZG9ubHk6ITB9LHtuYW1lOiJjdXJyZW50VGltZSIscmVhZG9ubHk6ITB9LHtuYW1lOiJwYXVzZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToiYnVmZmVyZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToidm9sdW1lIn0se25hbWU6InBsYXliYWNrUmF0ZSIsY2FjaGU6ITB9XTtjbGFzcyBYdXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmlkPXQsdGhpcy5fY2FsbGJhY2tzPXt9LHRoaXMuX29wdGlvbnM9e30sUWQuZm9yRWFjaChuPT57dGhpcy5fY2FsbGJhY2tzW25dPVtdfSksUUEuZm9yRWFjaChuPT57bGV0IHI9bi5uYW1lO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHIse2dldDooKT0+e2xldCBvPW4uY2FjaGU/dGhpcy5fb3B0aW9uczpaQSh7YXVkaW9JZDp0aGlzLmlkfSksYz1yIGluIG8/b1tyXTpuLmRlZmF1bHQ7cmV0dXJuIHR5cGVvZiBjPT0ibnVtYmVyIiYmciE9PSJ2b2x1bWUiP2MvMWUzOmN9LHNldDpuLnJlYWRvbmx5P3ZvaWQgMDpvPT57dGhpcy5fb3B0aW9uc1tyXT1vLEtBKHouZXh0ZW5kKHt9LHRoaXMuX29wdGlvbnMse2F1ZGlvSWQ6dGhpcy5pZH0pKX19KX0pLGVPKCl9cGxheSgpe3RoaXMuX29wZXJhdGUoInBsYXkiKX1wYXVzZSgpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9c3RvcCgpe3RoaXMuX29wZXJhdGUoInN0b3AiKX1zZWVrKHQpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZTp0KjFlM30pfWRlc3Ryb3koKXtFKHRoaXMuX190aW1pbmcpLFBzW3RoaXMuaWRdJiYoUHNbdGhpcy5pZF0uY2xvc2UoKSxkZWxldGUgUHNbdGhpcy5pZF0pLGRlbGV0ZSBadVt0aGlzLmlkXX1fb3BlcmF0ZSh0LG4pe1hBKHouZXh0ZW5kKHt9LG4se2F1ZGlvSWQ6dGhpcy5pZCxvcGVyYXRpb25UeXBlOnR9KSl9fWxldCBlTz1LLm9uY2UoKCk9PntRZC5mb3JFYWNoKGU9PntYdS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCl7ei5pc0Z1bmN0aW9uKHQpJiZ0aGlzLl9jYWxsYmFja3NbZV0ucHVzaCh0KX19KSxKXy5mb3JFYWNoKGU9PntYdS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCl7bGV0IG49dGhpcy5fY2FsbGJhY2tzW2VdLHI9bi5pbmRleE9mKHQpO3I+PTAmJm4uc3BsaWNlKHIsMSl9fSl9KTtmdW5jdGlvbiBRdShlLHQsbixyKXtsZXQgbz1gb24ke3ouY2FwaXRhbGl6ZSh0KX1gO2UuX2NhbGxiYWNrc1tvXS5mb3JFYWNoKGM9Pnt6LmlzRnVuY3Rpb24oYykmJmModD09PSJlcnJvciI/e2Vyck1zZzpuLGVyckNvZGU6cn06e30pfSl9bGV0IHRPPUx0KENfLCgpPT57bGV0e2F1ZGlvSWQ6ZX09SkEoKSx0PW5ldyBYdShlKTtyZXR1cm4gWnVbZV09dCx0fSksbk89WyJjYW5wbGF5IiwicGxheSIsInBhdXNlIiwic3RvcCIsImVuZGVkIiwidGltZVVwZGF0ZSIsInByZXYiLCJuZXh0IiwiZXJyb3IiLCJ3YWl0aW5nIl0sbWc9e2NhbnBsYXk6W10scGxheTpbXSxwYXVzZTpbXSxzdG9wOltdLGVuZGVkOltdLHRpbWVVcGRhdGU6W10scHJldjpbXSxuZXh0OltdLGVycm9yOltdLHdhaXRpbmc6W119LGZuLGVmPW51bGwsck89MjUwLGlPPVsicGxheSIsInBhdXNlIiwiZW5kZWQiLCJzdG9wIiwiY2FucGxheSJdO2Z1bmN0aW9uIG9PKCl7TWMoKSxlbCh7c3RhdGU6InRpbWVVcGRhdGUifSksZWY9aCgoKT0+e2VsKHtzdGF0ZToidGltZVVwZGF0ZSJ9KX0sck8pfWZ1bmN0aW9uIE1jKCl7ZWYhPT1udWxsJiZFKGVmKX1mdW5jdGlvbiBhTygpe2lmKGZuKXJldHVybjtsZXQgZT1vdC5pbnZva2VPbkNhbGxiYWNrO2ZuPXMuYXVkaW8uY3JlYXRlUGxheWVyKHthdXRvcGxheTohMCxiYWNrZ3JvdW5kQ29udHJvbDohMH0pLGZuLnNyYz1mbi50aXRsZT1mbi5lcG5hbWU9Zm4uc2luZ2VyPWZuLmNvdmVySW1nVXJsPWZuLndlYlVybD0iIixmbi5zdGFydFRpbWU9MCxpTy5mb3JFYWNoKHQ9Pntmbi5hZGRFdmVudExpc3RlbmVyKHQsKCk9Pnt0PT09InBsYXkiPyhmbi5pc1N0b3BwZWQ9ITEsb08oKSk6dD09PSJzdG9wIiYmKGZuLmlzU3RvcHBlZD0hMCksKHQ9PT0icGF1c2UifHx0PT09ImVuZGVkInx8dD09PSJzdG9wIikmJk1jKCk7bGV0IG49YG9uTXVzaWMke3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfWA7ZShuLHtkYXRhVXJsOmZuLnNyYyxlcnJNc2c6YCR7bn06b2tgfSksZWwoe3N0YXRlOnQsZGF0YVVybDpmbi5zcmN9KX0pfSksZm4uYWRkRXZlbnRMaXN0ZW5lcigid2FpdGluZyIsKCk9PntNYygpLGVsKHtzdGF0ZToid2FpdGluZyIsZGF0YVVybDpmbi5zcmN9KX0pLGZuLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0PT57TWMoKSxlKCJvbk11c2ljRXJyb3IiLHtkYXRhVXJsOmZuLnNyYyxlcnJNc2c6IkVycm9yOiIrdC5tZXNzYWdlfSksZWwoe3N0YXRlOiJlcnJvciIsZGF0YVVybDpmbi5zcmMsZXJyTXNnOnQubWVzc2FnZSxlcnJDb2RlOnQuY29kZX0pfSksZm4uYWRkRXZlbnRMaXN0ZW5lcigicHJldiIsKCk9PntlbCh7c3RhdGU6InByZXYifSl9KSxmbi5hZGRFdmVudExpc3RlbmVyKCJuZXh0IiwoKT0+e2VsKHtzdGF0ZToibmV4dCJ9KX0pfWZ1bmN0aW9uIHNPKCl7bGV0IGU9e2R1cmF0aW9uOjAsY3VycmVudFRpbWU6MCxwYXVzZWQ6ITEsc3JjOiIiLGJ1ZmZlcmVkOjAsdGl0bGU6IiIsZXBuYW1lOiIiLHNpbmdlcjoiIixjb3ZlckltZ1VybDoiIix3ZWJVcmw6IiIsc3RhcnRUaW1lOjAsZXJyTXNnOiJnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpvayJ9O2lmKGZuKXtsZXQgdD17ZHVyYXRpb246Zm4uZ2V0RHVyYXRpb24oKXx8MCxjdXJyZW50VGltZTpmbi5pc1N0b3BwZWQ/MDpmbi5nZXRQb3NpdGlvbigpLHBhdXNlZDpmbi5pc1BhdXNlZCgpLHNyYzpmbi5zcmMsYnVmZmVyZWQ6Zm4uZ2V0QnVmZmVyZWQoKSx0aXRsZTpmbi50aXRsZSxlcG5hbWU6Zm4uZXBuYW1lLHNpbmdlcjpmbi5zaW5nZXIsY292ZXJJbWdVcmw6Zm4uY292ZXJJbWdVcmwsd2ViVXJsOmZuLndlYlVybCxzdGFydFRpbWU6Zm4uc3RhcnRUaW1lfTtlPXouZXh0ZW5kKGUsdCl9cmV0dXJuIGV9ZnVuY3Rpb24gX2coZSx0KXthTygpO2xldCBuPVsic3JjIiwic3RhcnRUaW1lIiwiY292ZXJJbWdVcmwiLCJ3ZWJVcmwiLCJzaW5nZXIiLCJlcG5hbWUiLCJ0aXRsZSJdO2lmKHQ9PT0icGxheWJhY2tSYXRlIil7bGV0IG89ZVt0XTtmbi5wbGF5YmFja1JhdGUmJmZuLnBsYXliYWNrUmF0ZShwYXJzZUZsb2F0KG8pKTtyZXR1cm59bGV0IHI9e307T2JqZWN0LmtleXMoZSkuZm9yRWFjaChvPT57aWYobi5pbmRleE9mKG8pPj0wKXtsZXQgYz1lW29dO289PT1uWzBdJiZjJiYoYz1IZShjKSksZm5bb109cltvXT1jfX0pLGZuLnNldFN0eWxlcyhyKX1mdW5jdGlvbiBsTyh7b3BlcmF0aW9uVHlwZTplLHNyYzp0LHBvc2l0aW9uOm4sYXBpOnI9Im9wZXJhdGVNdXNpY1BsYXllciIsdGl0bGU6byxjb3ZlckltZ1VybDpjfSl7dmFyIGc9WyJyZXN1bWUiLCJwYXVzZSIsInN0b3AiXTtyZXR1cm4gZy5pbmRleE9mKGUpPjA/Zm4mJmZuW2VdKCk6ZT09PSJwbGF5Ij8oX2coe3NyYzp0LHN0YXJ0VGltZTpuLHRpdGxlOm8sY292ZXJJbWdVcmw6Y30pLGZuLnBsYXkoKSk6ZT09PSJzZWVrIiYmZm4mJmZuLnNlZWtUbyhuKSx7ZXJyTXNnOmAke3J9Om9rYH19ZnVuY3Rpb24gY08oe29wZXJhdGlvblR5cGU6ZSxzcmM6dCxzdGFydFRpbWU6bixjdXJyZW50VGltZTpyfSl7cmV0dXJuIGxPKHtvcGVyYXRpb25UeXBlOmUsc3JjOnQscG9zaXRpb246bnx8cnx8MCxhcGk6Im9wZXJhdGVCYWNrZ3JvdW5kQXVkaW8ifSl9ZnVuY3Rpb24gZWwoe3N0YXRlOmUsZXJyTXNnOnQsZXJyQ29kZTpuLGRhdGFVcmw6cn0pe21nW2VdLmZvckVhY2gobz0+e3ouaXNGdW5jdGlvbihvKSYmbyhlPT09ImVycm9yIj97ZXJyTXNnOnQsZXJyQ29kZTpufTp7fSl9KX1sZXQgdU89Sy5vbmNlKCgpPT57bk8uZm9yRWFjaChlPT57YmcucHJvdG90eXBlW2BvbiR7ei5jYXBpdGFsaXplKGUpfWBdPWZ1bmN0aW9uKHQpe21nW2VdLnB1c2godCl9fSl9KSxmTz1be25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ0aXRsZSIsY2FjaGU6ITB9LHtuYW1lOiJlcG5hbWUiLGNhY2hlOiEwfSx7bmFtZToic2luZ2VyIixjYWNoZTohMH0se25hbWU6ImNvdmVySW1nVXJsIixjYWNoZTohMH0se25hbWU6IndlYlVybCIsY2FjaGU6ITB9LHtuYW1lOiJwcm90b2NvbCIscmVhZG9ubHk6ITAsZGVmYXVsdDoiaHR0cCJ9LHtuYW1lOiJwbGF5YmFja1JhdGUiLGRlZmF1bHQ6MSxjYWNoZTohMH1dO2NsYXNzIGJne2NvbnN0cnVjdG9yKCl7dGhpcy5fb3B0aW9ucz17fSxmTy5mb3JFYWNoKHQ9PntsZXQgbj10Lm5hbWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsbix7Z2V0OigpPT57bGV0IHI9dC5jYWNoZT90aGlzLl9vcHRpb25zOnNPKCk7cmV0dXJuIG4gaW4gcj9yW25dOnQuZGVmYXVsdH0sc2V0OnQucmVhZG9ubHk/dm9pZCAwOnI9Pnt0aGlzLl9vcHRpb25zW25dPXIsX2codGhpcy5fb3B0aW9ucyxuKX19KX0pLHVPKCl9cGxheSgpe3RoaXMuX29wZXJhdGUoInBsYXkiKX1wYXVzZSgpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9c3RvcCgpe3RoaXMuX29wZXJhdGUoInN0b3AiKX1zZWVrKHQpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZTp0fSl9X29wZXJhdGUodCxuKXtjTyh6LmV4dGVuZCh7fSxuLHtvcGVyYXRpb25UeXBlOnR9KSl9fWxldCBFZyxkTz1MdChIYiwoKT0+RWd8fChFZz1uZXcgYmcpKTtjbGFzcyBoT3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaWQ9dCx0aGlzLmN0eD1ufXN0YXJ0KHQpe3JldHVybiBKdCh0aGlzLmN0eCwic3RhcnQiLHQpfXN0b3AodCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJzdG9wIix0KX1wYXVzZSh0KXtyZXR1cm4gSnQodGhpcy5jdHgsInBhdXNlIix0KX1yZXN1bWUodCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJyZXN1bWUiLHQpfXN3aXRjaENhbWVyYSh0KXtyZXR1cm4gSnQodGhpcy5jdHgsInN3aXRjaENhbWVyYSIsdCl9c25hcHNob3QodCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJzbmFwc2hvdCIsdCl9dG9nZ2xlVG9yY2godCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJ0b2dnbGVUb3JjaCIsdCl9cGxheUJHTSh0KXtyZXR1cm4genQodGhpcy5jdHgsInBsYXlCR00iLHQpfXN0b3BCR00odCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJzdG9wQkdNIix0KX1wYXVzZUJHTSh0KXtyZXR1cm4gSnQodGhpcy5jdHgsInBhdXNlQkdNIix0KX1yZXN1bWVCR00odCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJyZXN1bWVCR00iLHQpfXNldEJHTVZvbHVtZSh0KXtyZXR1cm4genQodGhpcy5jdHgsInNldEJHTVZvbHVtZSIsdCl9c3RhcnRQcmV2aWV3KHQpe3JldHVybiBKdCh0aGlzLmN0eCwic3RhcnRQcmV2aWV3Iix0KX1zdG9wUHJldmlldyh0KXtyZXR1cm4gSnQodGhpcy5jdHgsInN0b3BQcmV2aWV3Iix0KX19ZnVuY3Rpb24gSXMoZSx0LG4scil7b3QuaW52b2tlVmlld01ldGhvZCgibGl2ZXB1c2hlci4iK2Use2xpdmVQdXNoZXJJZDplLHR5cGU6bixkYXRhOnJ9LHQpfWNsYXNzIGdPe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW59c3RhcnQoKXtJcyh0aGlzLmlkLHRoaXMucGFnZUlkLCJzdGFydCIpfXN0b3AoKXtJcyh0aGlzLmlkLHRoaXMucGFnZUlkLCJzdG9wIil9cGF1c2UoKXtJcyh0aGlzLmlkLHRoaXMucGFnZUlkLCJwYXVzZSIpfXJlc3VtZSgpe0lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlc3VtZSIpfXN3aXRjaENhbWVyYSgpe0lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN3aXRjaENhbWVyYSIpfXN0YXJ0UHJldmlldygpe0lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInByZXZpZXciKX1zdG9wUHJldmlldygpe0lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN0b3AiKX1zbmFwc2hvdCgpe0lzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNuYXBzaG90Iil9fWxldCBwTz1MdChBXywoZSx0KT0+e2lmKHQuJHBhZ2UubWV0YS5pc05WdWUpe2lmKCF0KXJldHVybiBjb25zb2xlLndhcm4oInVuaS5jcmVhdGVMaXZlUHVzaGVyQ29udGV4dDogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudCIpO2xldCBuPSR0KGUsdCk7cmV0dXJuIG4/bmV3IGhPKGUsbik6Y29uc29sZS53YXJuKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfXJldHVybiBuZXcgZ08oZSx0LiRwYWdlLmlkKX0sT18pLE5pPTMuMTQxNTkyNjUzNTg5NzkzLExjPTYzNzgyNDUsRGM9LjAwNjY5MzQyMTYyMjk2NTk0MztmdW5jdGlvbiB2TyhlLHQpe2lmKHQ9K3QsZT0rZSx5ZyhlLHQpKXJldHVybltlLHRdO2xldCBuPVNnKGUtMTA1LHQtMzUpLHI9d2coZS0xMDUsdC0zNSksbz10LzE4MCpOaSxjPU1hdGguc2luKG8pO2M9MS1EYypjKmM7bGV0IGc9TWF0aC5zcXJ0KGMpO249bioxODAvKExjKigxLURjKS8oYypnKSpOaSkscj1yKjE4MC8oTGMvZypNYXRoLmNvcyhvKSpOaSk7bGV0IGI9dCtuLFY9ZStyO3JldHVybltlKjItVix0KjItYl19ZnVuY3Rpb24gbU8oZSx0KXtpZih0PSt0LGU9K2UseWcoZSx0KSlyZXR1cm5bZSx0XTtsZXQgbj1TZyhlLTEwNSx0LTM1KSxyPXdnKGUtMTA1LHQtMzUpLG89dC8xODAqTmksYz1NYXRoLnNpbihvKTtjPTEtRGMqYypjO2xldCBnPU1hdGguc3FydChjKTtuPW4qMTgwLyhMYyooMS1EYykvKGMqZykqTmkpLHI9cioxODAvKExjL2cqTWF0aC5jb3MobykqTmkpO2xldCBiPXQrbjtyZXR1cm5bZStyLGJdfWxldCB5Zz1mdW5jdGlvbihlLHQpe3JldHVybiBlPDcyLjAwNHx8ZT4xMzcuODM0N3x8dDwuODI5M3x8dD41NS44MjcxfHwhMX0sU2c9ZnVuY3Rpb24oZSx0KXtsZXQgbj0tMTAwKzIqZSszKnQrLjIqdCp0Ky4xKmUqdCsuMipNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0oMjAqTWF0aC5zaW4oNiplKk5pKSsyMCpNYXRoLnNpbigyKmUqTmkpKSoyLzMsbis9KDIwKk1hdGguc2luKHQqTmkpKzQwKk1hdGguc2luKHQvMypOaSkpKjIvMyxuKz0oMTYwKk1hdGguc2luKHQvMTIqTmkpKzMyMCpNYXRoLnNpbih0Kk5pLzMwKSkqMi8zLG59LHdnPWZ1bmN0aW9uKGUsdCl7bGV0IG49MzAwK2UrMip0Ky4xKmUqZSsuMSplKnQrLjEqTWF0aC5zcXJ0KE1hdGguYWJzKGUpKTtyZXR1cm4gbis9KDIwKk1hdGguc2luKDYqZSpOaSkrMjAqTWF0aC5zaW4oMiplKk5pKSkqMi8zLG4rPSgyMCpNYXRoLnNpbihlKk5pKSs0MCpNYXRoLnNpbihlLzMqTmkpKSoyLzMsbis9KDE1MCpNYXRoLnNpbihlLzEyKk5pKSszMDAqTWF0aC5zaW4oZS8zMCpOaSkpKjIvMyxufTtmdW5jdGlvbiBDZyhlLHQsbil7bGV0IHI9dC5jb29yZHM7aWYoZSE9PXQuY29vcmRzVHlwZSl7bGV0IG87ZT09PSJ3Z3M4NCI/bz12TyhyLmxvbmdpdHVkZSxyLmxhdGl0dWRlKTplPT09ImdjajAyIiYmKG89bU8oci5sb25naXR1ZGUsci5sYXRpdHVkZSkpLG8mJihyLmxvbmdpdHVkZT1vWzBdLHIubGF0aXR1ZGU9b1sxXSl9bih7dHlwZTplLGFsdGl0dWRlOnIuYWx0aXR1ZGV8fDAsbGF0aXR1ZGU6ci5sYXRpdHVkZSxsb25naXR1ZGU6ci5sb25naXR1ZGUsc3BlZWQ6ci5zcGVlZCxhY2N1cmFjeTpyLmFjY3VyYWN5LGFkZHJlc3M6dC5hZGRyZXNzLGVyck1zZzoiZ2V0TG9jYXRpb246b2sifSl9bGV0IF9PPUVlKENFLCh7dHlwZTplPSJ3Z3M4NCIsZ2VvY29kZTp0PSExLGFsdGl0dWRlOm49ITEsaGlnaEFjY3VyYWN5RXhwaXJlVGltZTpyLGlzSGlnaEFjY3VyYWN5Om89ITF9LHtyZXNvbHZlOmMscmVqZWN0Omd9KT0+e3MuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGI9PntDZyhlLGIsYyl9LGI9PntpZihiLmNvZGU9PT0xNTAxKXtDZyhlLGIsYyk7cmV0dXJufWcoImdldExvY2F0aW9uOmZhaWwgIitiLm1lc3NhZ2UpfSx7Z2VvY29kZTp0LGVuYWJsZUhpZ2hBY2N1cmFjeTpvfHxuLHRpbWVvdXQ6cixjb29yZHNUeXBlOmV9KX0sT0UsQUUpLGJPPUVlKFNFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCBvPXFoKCkhPT0ibGlnaHQiLGMsZz1YaSh7dXJsOiJfX3VuaWFwcGNob29zZWxvY2F0aW9uIixkYXRhOnouZXh0ZW5kKHt9LGUse2xvY2FsZTpLbCgpfSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwic2xpZGUtaW4tYm90dG9tIix0aXRsZU5WaWV3OiExLHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSxvbk1lc3NhZ2Uoe2V2ZW50OmIsZGV0YWlsOlZ9KXtiPT09InNlbGVjdGVkIiYmKGM9Vil9LG9uQ2xvc2UoKXtvJiZzLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLGM/dChjKTpuKCJjYW5jZWwiKX19KTtvJiYocy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IiksZy53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLCh7dHlwZTpiLHJlc3VsdDpWfSk9PntiPT09InN0YXJ0Ij9zLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOmI9PT0iZW5kIiYmIVYmJnMubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfSx3RSksRU89RWUoVEUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT4oWGkoe3VybDoiX191bmlhcHBvcGVubG9jYXRpb24iLGRhdGE6ei5leHRlbmQoe30sZSx7bG9jYWxlOktsKCl9KSxzdHlsZTp7dGl0bGVOVmlldzp7dHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uQ2xvc2UoKXtuKCJjYW5jZWwiKX19KSx0KCkpLElFLFBFKSxGYz0hMSxzYz0wLHlPPUVlKFB5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3NjPXNjfHxzLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24ocj0+e0ZjPSEwLG90Lmludm9rZU9uQ2FsbGJhY2soVGgsci5jb29yZHMpfSxyPT57RmN8fChuKHIubWVzc2FnZSksRmM9ITApLG90Lmludm9rZU9uQ2FsbGJhY2soUGgse2Vyck1zZzpgb25Mb2NhdGlvbkNoYW5nZTpmYWlsICR7ci5tZXNzYWdlfWB9KX0se2Nvb3Jkc1R5cGU6ZT09bnVsbD92b2lkIDA6ZS50eXBlfSksTih0LDEwMCl9LFJ5LHh5KSxTTz1FZShJeSwoZSx7cmVzb2x2ZTp0fSk9PntzYyYmKHMuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaChzYyksRmM9ITEsc2M9MCksdCgpfSksd089Z24oVGgsKCk9Pnt9KSxDTz1maShOeSwoKT0+e30pLEFPPWduKFBoLCgpPT57fSksT089Zmkoa3ksKCk9Pnt9KSxUTz1FZShtUywoe3RpdGxlOmU9IiIsY29udGVudDp0PSIiLHNob3dDYW5jZWw6bj0hMCxjYW5jZWxUZXh0OnIsY2FuY2VsQ29sb3I6byxjb25maXJtVGV4dDpjLGNvbmZpcm1Db2xvcjpnLGVkaXRhYmxlOmI9ITEscGxhY2Vob2xkZXJUZXh0OlY9IiJ9PXt9LHtyZXNvbHZlOlR9KT0+e2xldCBEPW4/W3IsY106W2NdLHZlPWI/VjpEO3Q9dHx8IiAiLHMubmF0aXZlVUlbYj8icHJvbXB0IjoiY29uZmlybSJdKHQseWU9PntpZihuKXtsZXQgT2U9eWUuaW5kZXg9PT0xLGZ0PXtjb25maXJtOk9lLGNhbmNlbDp5ZS5pbmRleD09PTB8fHllLmluZGV4PT09LTF9O09lJiZiJiYoZnQuY29udGVudD15ZS52YWx1ZSksVChmdCl9ZWxzZXtsZXQgT2U9e2NvbmZpcm06eWUuaW5kZXg9PT0wLGNhbmNlbDohMX07YiYmKE9lLmNvbnRlbnQ9eWUudmFsdWUpLFQoT2UpfX0sZSx2ZSxEKX0sX1MsYlMpLFBPPXtsaWdodDp7aXRlbUNvbG9yOiIjMDAwMDAwIn0sZGFyazp7aXRlbUNvbG9yOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCkifX0sSU89RWUoZlMsKHtpdGVtTGlzdDplPVtdLGl0ZW1Db2xvcjp0LHRpdGxlOm49IiIscG9wb3ZlcjpyfSx7cmVzb2x2ZTpvLHJlamVjdDpjfSk9Pnt0PT09IiMwMDAiJiZSLmRhcmttb2RlJiYodD1QT1tzLm5hdmlnYXRvci5nZXRVSVN0eWxlKCldLml0ZW1Db2xvciksYW8oKTtsZXR7dDpnfT1ndCgpLGI9e3RpdGxlOm4sY2FuY2VsOmcoInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIiksYnV0dG9uczplLm1hcChWPT4oe3RpdGxlOlYsY29sb3I6dH0pKX07cy5uYXRpdmVVSS5hY3Rpb25TaGVldCh6LmV4dGVuZChiLHtwb3BvdmVyOnJ9KSxWPT57Vi5pbmRleD4wP28oe3RhcEluZGV4OlYuaW5kZXgtMX0pOmMoInNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCIpfSl9LGRTLGhTKSxsYyx0Zj0hMSxWYz0iIixVYyxOTz1FZShnUywoZSx0KT0+QWcoei5leHRlbmQoe30sZSx7dHlwZToibG9hZGluZyIsaWNvbjoibG9hZGluZyJ9KSx0KSxwUyx2UyksQWc9KHt0aXRsZTplPSIiLGljb246dD0ic3VjY2VzcyIsaW1hZ2U6bj0iIixkdXJhdGlvbjpyPTE1MDAsbWFzazpvPSExLHBvc2l0aW9uOmMsdHlwZTpnPSJ0b2FzdCIsc3R5bGU6Yn0se3Jlc29sdmU6VixyZWplY3Q6VH0pPT57aWYoJGMoIiIpLFZjPWcsWyJ0b3AiLCJjZW50ZXIiLCJib3R0b20iXS5pbmNsdWRlcyhTdHJpbmcoYykpKXMubmF0aXZlVUkudG9hc3QoZSx7dmVydGljYWxBbGlnbjpjfSksdGY9ITA7ZWxzZXt0JiYhflsic3VjY2VzcyIsImxvYWRpbmciLCJlcnJvciIsIm5vbmUiXS5pbmRleE9mKHQpJiYodD0ic3VjY2VzcyIpO2xldCBEPXttb2RhbDpvLGJhY2s6InRyYW5zbWl0IixwYWRkaW5nOiIxMHB4IixzaXplOiIxNnB4In07IW4mJighdHx8dD09PSJub25lIik/RC5sb2FkaW5nPXtkaXNwbGF5OiJub25lIn06KEQud2lkdGg9IjE0MHB4IixELmhlaWdodD0iMTEycHgiKSxuP0QubG9hZGluZz17ZGlzcGxheToiYmxvY2siLGhlaWdodDoiNTVweCIsaWNvbjpuLGludGVydmFsOnJ9Olsic3VjY2VzcyIsImVycm9yIl0uaW5kZXhPZih0KSE9PS0xJiYoRC5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOnQ9PT0ic3VjY2VzcyI/Il9fdW5pYXBwc3VjY2Vzcy5wbmciOiJfX3VuaWFwcGVycm9yLnBuZyIsaW50ZXJ2YWw6cn0pO3RyeXtsYz1zLm5hdGl2ZVVJLnNob3dXYWl0aW5nKGUsei5leHRlbmQoRCxiKSl9Y2F0Y2godmUpe1QoYCR7dmV9YCl9fXJldHVybiBWYz09PSJ0b2FzdCImJihVYz1OKCgpPT57JGMoIiIpfSxyKSksVigpfSxrTz1FZShFUyxBZyxTUyx3UyksUk89RWUoUXksKGUsdCk9PiRjKCJ0b2FzdCIsdCkpLHhPPUVlKFh5LChlLHQpPT4kYygibG9hZGluZyIsdCkpO2Z1bmN0aW9uICRjKGU9InRvYXN0Iix0KXtyZXR1cm4gZSYmZSE9PVZjfHwoVWMmJih5KFVjKSxVYz1udWxsKSx0Zj9zLm5hdGl2ZVVJLmNsb3NlVG9hc3QoKTpsYyYmbGMuY2xvc2UmJmxjLmNsb3NlKCksbGM9bnVsbCx0Zj0hMSxWYz0iIiksdCYmdC5yZXNvbHZlKCl9bGV0IEJPPUVlKENTLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPVloKCk7aWYociYmci5lbmRQdWxsVG9SZWZyZXNoKCkscj1SYygpLCFyKXJldHVybiBuKCk7ci5iZWdpblB1bGxUb1JlZnJlc2goKSxXdShyKSx0KCl9KSxNTz1FZShBUywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1ZaCgpfHxSYygpO2lmKCFyKXJldHVybiBuKCk7ci5lbmRQdWxsVG9SZWZyZXNoKCksV3UobnVsbCksdCgpfSksTE89RWUoeGgsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9SG4od3IoKSk7b3QuaW52b2tlVmlld01ldGhvZCh4aCxlLHIsbz0+e28/bihvKTp0KCl9KX0sZVMpLERPPUVlKEJoLChlLHtyZXNvbHZlOnR9KT0+e2xldCBuPUhuKHdyKCkpO290Lmludm9rZVZpZXdNZXRob2QoQmgsZSxuLHQpfSxjUyx1UyksRk89RWUob1MsKHtfX3BhZ2VfXzplLHRpdGxlOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBvPVdoKGUpO2lmKG8pe2xldCBjPW8uZ2V0U3R5bGUoKTtjJiZjLnRpdGxlTlZpZXcmJm8uc2V0U3R5bGUoe3RpdGxlTlZpZXc6e3RpdGxlVGV4dDp0fX0pLG4oKX1lbHNlIHIoKX0sYVMpLFZPPUVlKHNTLChlLHtyZXNvbHZlOnR9KT0+e3MubmF0aXZlVUkuc2hvd1dhaXRpbmcoIiIse21vZGFsOiExfSksdCgpfSksVU89RWUobFMsKGUse3Jlc29sdmU6dH0pPT57cy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSx0KCl9KTtmdW5jdGlvbiAkTyhlKXtsZXQgdD1SbigpOyF0Lmxlbmd0aHx8KHRbdC5sZW5ndGgtMV0uJHBhZ2Uuc3RhdHVzQmFyU3R5bGU9ZSl9bGV0IEhPPUVlKG5TLCh7X19wYWdlX186ZSxmcm9udENvbG9yOnQsYmFja2dyb3VuZENvbG9yOm59LHtyZXNvbHZlOnIscmVqZWN0Om99KT0+e2xldCBjPVdoKGUpO2lmKGMpe2xldCBnPXt9O3QmJihnLnRpdGxlQ29sb3I9dCksbiYmKGcuYmFja2dyb3VuZENvbG9yPW4pO2xldCBiPXQ9PT0iIzAwMDAwMCI/ImRhcmsiOiJsaWdodCI7cy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoYiksJE8oYik7bGV0IFY9Yy5nZXRTdHlsZSgpO1YmJlYudGl0bGVOVmlldyYmKFYudGl0bGVOVmlldy5hdXRvQmFja0J1dHRvbiYmKGcuYmFja0J1dHRvbj1nLmJhY2tCdXR0b258fHt9LGcuYmFja0J1dHRvbi5jb2xvcj10KSxjLnNldFN0eWxlKHt0aXRsZU5WaWV3Omd9KSkscigpfWVsc2UgbygpfSxpUyxyUyksak89RWUoV1MsKHtpbmRleDplLHRleHQ6dH0se3Jlc29sdmU6bixyZWplY3Q6cn0pPT57X2kuc2V0VGFiQmFyQmFkZ2UoInRleHQiLGUsdCksbigpfSxHUyxZUyksek89RWUoT1MsKHtpbmRleDplLHRleHQ6dCxpY29uUGF0aDpuLHNlbGVjdGVkSWNvblBhdGg6cixwYWdlUGF0aDpvLHZpc2libGU6YyxpY29uZm9udDpnfSx7cmVzb2x2ZTpifSk9PntpZihfaS5zZXRUYWJCYXJJdGVtKGUsdCxuLHIsYyxnKSxvKXtsZXQgVj1SLnRhYkJhci5saXN0W2VdO2lmKFYpe2xldCBUPVYucGFnZVBhdGgsRD1LLnJlbW92ZUxlYWRpbmdTbGFzaChvKTtEIT09VCYmYXMoZSxULEQpfX1iKCl9LFRTLFBTKSxXTz1FZShJUywoZT17fSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntpZighdGMoKSlyZXR1cm4gbigibm90IFRhYkJhciBwYWdlIik7ZS5ib3JkZXJTdHlsZT1LLm5vcm1hbGl6ZVRhYkJhclN0eWxlcyhlLmJvcmRlclN0eWxlKSxfaS5zZXRUYWJCYXJTdHlsZShlKSx0KCl9LE5TLFJTKSxHTz1FZSh4UywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lJiZlLmFuaW1hdGlvbjtpZighdGMoKSlyZXR1cm4gbigibm90IFRhYkJhciBwYWdlIik7X2kuaGlkZVRhYkJhcihCb29sZWFuKHIpKSx0KCl9LE1oKSxZTz1FZShCUywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lJiZlLmFuaW1hdGlvbjtpZighdGMoKSlyZXR1cm4gbigibm90IFRhYkJhciBwYWdlIik7X2kuc2hvd1RhYkJhcihCb29sZWFuKHIpKSx0KCl9LE1TKSxxTz1FZShWUywoe2luZGV4OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e19pLnNldFRhYkJhckJhZGdlKCJyZWREb3QiLGUpLHQoKX0sVVMsJFMpLE9nPWU9Pl9pLnNldFRhYkJhckJhZGdlKCJub25lIixlKSxKTz1FZShIUywoe2luZGV4OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e09nKGUpLHQoKX0salMselMpLEtPPUVlKExTLCh7aW5kZXg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57T2coZSksdCgpfSxEUyxGUyksVGc9InZkU3luYyIsWk89Il9fdW5pYXBwX19zZXJ2aWNlIixSbD0ib25XZWJ2aWV3UmVhZHkiLFhPPTAsUU89IndlYnZpZXdJbnNlcnRlZCIsZVQ9IndlYnZpZXdSZW1vdmVkIixQZz0iVW5pQXBwU3ViTlZ1ZSI7Y2xhc3MgdFR7Y29uc3RydWN0b3IodCxuKXt0aGlzLmNhbGxiYWNrcz1bXTtsZXQgcj10aGlzLndlYnZpZXc9cy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQpO2lmKHRoaXMuaXNTdWI9bnx8ITEsci5fX3VuaWFwcF9tYXNrX2lkKXtsZXQgbz10aGlzLm1hc2tXZWJ2aWV3PXIuX191bmlhcHBfbWFza19pZD09PSIwIj97c2V0U3R5bGUoe21hc2s6Z30pe1lvKCJ1bmktdGFidmlldyIpLnNldE1hc2soe2NvbG9yOmd9KX19OnMud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChyLl9fdW5pYXBwX21hc2tfaWQpLGM9ZnVuY3Rpb24oKXtvLnNldFN0eWxlKHttYXNrOiJub25lIn0pfTtyLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGMpLHIuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGMpfX1zaG93KC4uLnQpe2lmKHRoaXMubWFza1dlYnZpZXcpe2xldCBuPXRoaXMud2Vidmlldy5fX3VuaWFwcF9tYXNrO3RoaXMubWFza1dlYnZpZXcuc2V0U3R5bGUoe21hc2s6bn0pfXRoaXMud2Vidmlldy5zaG93KC4uLnQpfWhpZGUoLi4udCl7dGhpcy53ZWJ2aWV3LmhpZGUoLi4udCl9c2V0U3R5bGUodCl7dGhpcy53ZWJ2aWV3LnNldFN0eWxlKHQpfWluaXRNZXNzYWdlKCl7aWYodGhpcy5tZXNzYWdlUmVhZHkpcmV0dXJuO3RoaXMubWVzc2FnZVJlYWR5PSEwO2xldCB0PXI9PntpZihyLmRhdGEmJnIuZGF0YS50eXBlPT09UGcpe2xldCBvPXIuZGF0YS50YXJnZXQ7by5pZD09PXRoaXMud2Vidmlldy5pZCYmby5pc1N1Yj09PXRoaXMuaXNTdWImJnRoaXMuY2FsbGJhY2tzLmZvckVhY2goYz0+e2Moe29yaWdpbjp0aGlzLndlYnZpZXcuX191bmlhcHBfaG9zdCxkYXRhOnIuZGF0YS5kYXRhfSl9KX19O1lvKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIix0KSx0aGlzLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCgpPT57dGhpcy5jYWxsYmFja3MubGVuZ3RoPTB9KX1wb3N0TWVzc2FnZSh0KXtzLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3KHt0eXBlOlBnLGRhdGE6dCx0YXJnZXQ6e2lkOnRoaXMud2Vidmlldy5pZCxpc1N1YjohdGhpcy5pc1N1Yn19LFpPKX1vbk1lc3NhZ2UodCl7dGhpcy5pbml0TWVzc2FnZSgpLHRoaXMuY2FsbGJhY2tzLnB1c2godCl9fWxldCBuVD1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdFQoZSx0KX07ZnVuY3Rpb24gclQoZSx0LG4scixvLGMsZyl7cyE9PW4mJih3PW1uPWUsZj10LHM9bixlQyhzLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSkscy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU9JGgsTj1yLHk9byxoPWMsRT1nKSxSLnNlcnZpY2VSZWFkeT0hMH1mdW5jdGlvbiBpVCgpe2xldCBlPVsiQXJyYXlCdWZmZXIiLCJJbnQ4QXJyYXkiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJCaWdJbnQ2NEFycmF5IiwiQmlnVWludDY0QXJyYXkiXSx0PXt9O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fWZ1bmN0aW9uIG9UKGUpe3ouZXh0ZW5kKGdsb2JhbCxlKX1sZXQgSWc9e29hdXRoKGUpe3Mub2F1dGguZ2V0U2VydmljZXModD0+e3Q9dDtsZXQgbj1bXTt0LmZvckVhY2goKHtpZDpyfSk9PntuLnB1c2gocil9KSxlKG51bGwsbix0KX0sdD0+e3Q9dCxlKHQpfSl9LHNoYXJlKGUpe3Muc2hhcmUuZ2V0U2VydmljZXModD0+e3Q9dDtsZXQgbj1bXTt0LmZvckVhY2goKHtpZDpyfSk9PntuLnB1c2gocil9KSxlKG51bGwsbix0KX0sdD0+e2UodCl9KX0scGF5bWVudChlKXtzLnBheW1lbnQuZ2V0Q2hhbm5lbHModD0+e2xldCBuPVtdO3QuZm9yRWFjaCgoe2lkOnJ9KT0+e24ucHVzaChyKX0pLGUobnVsbCxuLHQpfSx0PT57ZSh0KX0pfSxwdXNoKGUpe2lmKHR5cGVvZiBmIT0idW5kZWZpbmVkInx8dHlwZW9mIHMhPSJ1bmRlZmluZWQiKXtsZXQgdD1zLnB1c2guZ2V0Q2xpZW50SW5mbygpO2UobnVsbCxbdC5pZF0sW3RdKX1lbHNlIGUobnVsbCxbXSl9fSxhVD1FZShxUywoe3NlcnZpY2U6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57SWdbZV0/SWdbZV0oKHIsbz1bXSxjPVtdKT0+e3I/bihyLm1lc3NhZ2UpOnQoe3NlcnZpY2U6ZSxwcm92aWRlcjpvLHByb3ZpZGVyczpjLm1hcChnPT4odHlwZW9mIGcuc2VydmljZVJlYWR5PT0iYm9vbGVhbiImJihnLmlzQXBwRXhpc3Q9Zy5zZXJ2aWNlUmVhZHkpLHR5cGVvZiBnLm5hdGl2ZUNsaWVudD09ImJvb2xlYW4iJiYoZy5pc0FwcEV4aXN0PWcubmF0aXZlQ2xpZW50KSxnKSl9KX0pOm4oInNlcnZpY2Ugbm90IGZvdW5kIil9LEpTKSxIYztmdW5jdGlvbiBjYyhlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntzLm9hdXRoLmdldFNlcnZpY2VzKHI9PntsZXQgbz1yLmZpbmQoKHtpZDpjfSk9PmM9PT1lKTtvP3Qobyk6bihuZXcgRXJyb3IoInByb3ZpZGVyIG5vdCBmaW5kIikpfSxuKX0pfWxldCBOZz1FZShLUywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyfHwid2VpeGluIixvPXByKG4pLGM9cj09PSJhcHBsZSIsZz1jP3tzY29wZToiZW1haWwifTplLnVuaXZlcmlmeVN0eWxlP3t1bml2ZXJpZnlTdHlsZTpjVChlLnVuaXZlcmlmeVN0eWxlLG8pfTp7fTtjYyhyKS50aGVuKGI9PntmdW5jdGlvbiBWKCl7aWYoZS5vbmx5QXV0aG9yaXplJiZyPT09IndlaXhpbiIpe2IuYXV0aG9yaXplKCh7Y29kZTpUfSk9Pnt0KHtjb2RlOlQsYXV0aFJlc3VsdDoiIn0pfSxvKTtyZXR1cm59Yi5sb2dpbihUPT57bGV0IEQ9VC50YXJnZXQuYXV0aFJlc3VsdCx2ZT1ULnRhcmdldC5hcHBsZUluZm87dCh7Y29kZTpELmNvZGUsYXV0aFJlc3VsdDpELGFwcGxlSW5mbzp2ZX0pfSxvLGcpfWN8fHI9PT0idW5pdmVyaWZ5Ij9WKCk6Yi5sb2dvdXQoVixWKX0pLmNhdGNoKG8pfSxaUyksa2c9KGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZS5wcm92aWRlcnx8IndlaXhpbiIsbz1wcihuKTtjYyhyKS50aGVuKGM9PntjLmdldFVzZXJJbmZvKGc9PntsZXQgYj17bmlja05hbWU6IiJ9O2lmKHI9PT0id2VpeGluIil7bGV0IFQ9Yy51c2VySW5mbztUJiYoYj17b3BlbklkOlQub3BlbmlkLG5pY2tOYW1lOlQubmlja25hbWUsZ2VuZGVyOlQuc2V4LGNpdHk6VC5jaXR5LHByb3ZpbmNlOlQucHJvdmluY2UsY291bnRyeTpULmNvdW50cnksYXZhdGFyVXJsOlQuaGVhZGltZ3VybCx1bmlvbklkOlQudW5pb25pZH0pfWVsc2UgaWYocj09PSJhcHBsZSIpe2xldCBUPWMuYXBwbGVJbmZvO1QmJihiPXtvcGVuSWQ6VC51c2VyLGZ1bGxOYW1lOlQuZnVsbE5hbWUsZW1haWw6VC5lbWFpbCxhdXRob3JpemF0aW9uQ29kZTpULmF1dGhvcml6YXRpb25Db2RlLGlkZW50aXR5VG9rZW46VC5pZGVudGl0eVRva2VuLHJlYWxVc2VyU3RhdHVzOlQucmVhbFVzZXJTdGF0dXN9KX1lbHNlIGI9Yy51c2VySW5mbyxiJiYoYi5vcGVuSWQ9Yi5vcGVuSWR8fGIub3BlbmlkfHxjLmF1dGhSZXN1bHQub3BlbmlkLGIubmlja05hbWU9Yi5uaWNrTmFtZXx8Yi5uaWNrbmFtZSxiLmF2YXRhclVybD1iLmF2YXRhclVybHx8Yi5oZWFkaW1ndXJsKTtsZXQgVj17fTtlLmRhdGEmJmUuZGF0YS5hcGlfbmFtZT09PSJ3ZWJhcGlfZ2V0dXNlcmluZm8iP1YuZGF0YT17ZGF0YTpKU09OLnN0cmluZ2lmeShiKSxyYXdEYXRhOiIiLHNpZ25hdHVyZToiIixlbmNyeXB0ZWREYXRhOiIiLGl2OiIifTpWLnVzZXJJbmZvPWIsdChWKX0sbyl9KS5jYXRjaCgoKT0+e24oIlx1OEJGN1x1NTE0OFx1OEMwM1x1NzUyOCB1bmkubG9naW4iKX0pfSxzVD1FZShYUyxrZyxRUyksbFQ9RWUoZXcsa2csdHcpLFJnPUVlKG53LCh7cHJvdmlkZXI6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9WHModCksbz1wcihuKTtjYyhlKS50aGVuKGM9PmMucHJlTG9naW4ocixvKSkuY2F0Y2gobyl9LG93LGl3KSx4Zz0oKT0+Y2MoInVuaXZlcmlmeSIpLnRoZW4oZT0+ZS5jbG9zZUF1dGhWaWV3KCkpLEJnPUx0KGF3LHhnKSxNZz1FZShzdywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1Ycyh0KSxvPXByKG4pO3RyeXtjYygidW5pdmVyaWZ5IikudGhlbihjPT57bGV0IGc9Yy5nZXRDaGVja0JveFN0YXRlKCk7cih7c3RhdGU6Z30pfSl9Y2F0Y2goYyl7byhjKX19KTtmdW5jdGlvbiBjVChlLHQpe3JldHVybiB6LmlzUGxhaW5PYmplY3QoZSkmJnouaXNQbGFpbk9iamVjdChlLmJ1dHRvbnMpJiZ6LnRvVHlwZVN0cmluZyhlLmJ1dHRvbnMubGlzdCk9PT0iW29iamVjdCBBcnJheV0iJiZlLmJ1dHRvbnMubGlzdC5mb3JFYWNoKChuLHIpPT57ZS5idXR0b25zLmxpc3Rbcl0ub25jbGljaz1mdW5jdGlvbigpe2xldCBvPXtjb2RlOiIzMDAwOCIsbWVzc2FnZToiXHU3NTI4XHU2MjM3XHU3MEI5XHU1MUZCXHU0RTg2XHU4MUVBXHU1QjlBXHU0RTQ5XHU2MzA5XHU5NEFFIixpbmRleDpyLHByb3ZpZGVyOm4ucHJvdmlkZXJ9O3ouaXNQbGFpbk9iamVjdChIYyk/SGMuX3RyaWdnZXJVbml2ZXJpZnlCdXR0b25zQ2xpY2sobyk6eGcoKS50aGVuKCgpPT57dChvKX0pfX0pLGV9Y2xhc3MgdVR7Y29uc3RydWN0b3IoKXt0aGlzLnByb3ZpZGVyPSJ1bml2ZXJpZnkiLHRoaXMuZXZlbnROYW1lPSJhcGkudW5pdmVyaWZ5QnV0dG9uc0NsaWNrIn1jbG9zZSgpe3JldHVybiBCZygpfWxvZ2luKHQpe3JldHVybiBOZyh0aGlzLl9nZXRPcHRpb25zKHQpKX1nZXRDaGVja0JveFN0YXRlKHQpe3JldHVybiBNZyh0KX1wcmVMb2dpbih0KXtyZXR1cm4gUmcodGhpcy5fZ2V0T3B0aW9ucyh0KSl9b25CdXR0b25zQ2xpY2sodCl7b3Qub24odGhpcy5ldmVudE5hbWUsdCl9b2ZmQnV0dG9uc0NsaWNrKHQpe290Lm9mZih0aGlzLmV2ZW50TmFtZSx0KX1fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljayh0KXtvdC5lbWl0KHRoaXMuZXZlbnROYW1lLHQpfV9nZXRPcHRpb25zKHQ9e30pe3JldHVybiB6LmV4dGVuZCh7fSx0LHtwcm92aWRlcjp0aGlzLnByb3ZpZGVyfSl9fWxldCBmVD1MdChsdywoKT0+SGN8fChIYz1uZXcgdVQpKSxkVD1FZShtdywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1kZygpO2lmKHIubm90aWZpY2F0aW9uQXV0aG9yaXplZCE9PSJhdXRob3JpemVkIilyZXR1cm4gbigibm90aWZpY2F0aW9uQXV0aG9yaXplZDogIityLm5vdGlmaWNhdGlvbkF1dGhvcml6ZWQpO2xldCBvPXouZXh0ZW5kKHt9LGUpO2RlbGV0ZSBvLmNvbnRlbnQsZGVsZXRlIG8ucGF5bG9hZCxzLnB1c2guY3JlYXRlTWVzc2FnZShlLmNvbnRlbnQsZS5wYXlsb2FkLG8pLHQoKX0sdm9pZCAwLF93KSxMZyxoVD1MdChidywoKT0+TGd8fChMZz1zLnB1c2guZ2V0Q2hhbm5lbE1hbmFnZXIoKSkpLGdUPUx0KCJyZWdpc3RlclJ1bnRpbWUiLGU9Pnt6LmV4dGVuZChqc1J1bnRpbWUsZSl9KSxwVD17MDp7bmFtZToid2ViIix0aXRsZToiXHU1NkZFXHU2NTg3In0sMTp7bmFtZToidGV4dCIsdGl0bGU6Ilx1N0VBRlx1NjU4N1x1NUI1NyJ9LDI6e25hbWU6ImltYWdlIix0aXRsZToiXHU3RUFGXHU1NkZFXHU3MjQ3In0sMzp7bmFtZToibXVzaWMiLHRpdGxlOiJcdTk3RjNcdTRFNTAifSw0OntuYW1lOiJ2aWRlbyIsdGl0bGU6Ilx1ODlDNlx1OTg5MSJ9LDU6e25hbWU6Im1pbmlQcm9ncmFtIix0aXRsZToiXHU1QzBGXHU3QTBCXHU1RThGIn19LHZUPWU9PntlLnR5cGU9ZS50eXBlfHwwO2xldHtwcm92aWRlcjp0LHR5cGU6bix0aXRsZTpyLHN1bW1hcnk6byxocmVmOmMsaW1hZ2VVcmw6ZyxtZWRpYVVybDpiLHNjZW5lOlYsbWluaVByb2dyYW06VCxvcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdDpELGNvcnBpZDp2ZSxjdXN0b21lclVybDp5ZX09ZTt6LmlzU3RyaW5nKGcpJiZnJiYoZz1IZShnKSk7bGV0IE9lPXBUW25dO2lmKE9lKXtsZXQgZnQ9e3Byb3ZpZGVyOnQsdHlwZTpPZS5uYW1lLHRpdGxlOnIsY29udGVudDpvLGhyZWY6YyxwaWN0dXJlczpbZ10sdGh1bWJzOmc/W2ddOnZvaWQgMCxtZWRpYTpiLG1pbmlQcm9ncmFtOlQsZXh0cmE6e3NjZW5lOlZ9LG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OkQsY29ycGlkOnZlLHVybDp5ZX07cmV0dXJuIHQ9PT0id2VpeGluIiYmKG49PT0xfHxuPT09MikmJmRlbGV0ZSBmdC50aHVtYnMsZnR9cmV0dXJuIlx1NTIwNlx1NEVBQlx1NTNDMlx1NjU3MCB0eXBlIFx1NEUwRFx1NkI2M1x1Nzg2RSJ9LERnPWZ1bmN0aW9uKGUsdCxuLHIsbz0ic2hhcmUiKXtsZXQgYz1wcihyKSxnPXQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQ/Im9wZW5DdXN0b21lclNlcnZpY2VDaGF0Ijoic2VuZCI7dHJ5e2VbZ10odCwoKT0+e24oKX0sYyl9Y2F0Y2goYil7Yyh7bWVzc2FnZTpgJHt0LnByb3ZpZGVyfSAke2d9IFx1NjVCOVx1NkNENVx1OEMwM1x1NzUyOFx1NTkzMVx1OEQyNWB9KX19LG1UPUVlKGN3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPXZUKGUpLG89cHIobik7aWYoei5pc1N0cmluZyhyKSlyZXR1cm4gbihyKTtzLnNoYXJlLmdldFNlcnZpY2VzKGM9PntsZXQgZz1jLmZpbmQoKHtpZDpifSk9PmI9PT1yLnByb3ZpZGVyKTtnP2cuYXV0aGVudGljYXRlZD9EZyhnLHIsdCxuKTpnLmF1dGhvcml6ZSgoKT0+RGcoZyxyLHQsbiksbyk6bigic2VydmljZSBub3QgZm91bmQiKX0sbyl9LGZ3LHV3KSxfVD1FZShkdywoe3R5cGU6ZSxpbWFnZVVybDp0LHN1bW1hcnk6bixocmVmOnJ9LHtyZXNvbHZlOm8scmVqZWN0OmN9KT0+e2xldCBnPXByKGMpO3ouaXNTdHJpbmcodCkmJnQmJih0PUhlKHQpKSxzLnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOmUscGljdHVyZXM6dD9bdF06dm9pZCAwLGNvbnRlbnQ6bixocmVmOnJ9LCgpPT5vKCksZyl9LGd3LGh3KSxiVD1FZShwdywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyLG89cHIobik7cy5wYXltZW50LmdldENoYW5uZWxzKGM9PntsZXQgZz1jLmZpbmQoKHtpZDpifSk9PmI9PT1yKTtnP3MucGF5bWVudC5yZXF1ZXN0KGcsZS5vcmRlckluZm8sYj0+e3QoYil9LG8pOm4oInNlcnZpY2Ugbm90IGZvdW5kIil9LG8pfSx2dyksRmc9cmcsRVQ9RWUoIm5hdmlnYXRlVG9NaW5pUHJvZ3JhbSIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57RmcoIm5hdmlnYXRlVG9VbmlNUCIsZSxyPT57aWYoci5lcnJNc2cmJnIuZXJyTXNnLmluZGV4T2YoIjpvayIpPT09LTEpcmV0dXJuIG4oci5lcnJNc2cuc3BsaXQoIiAiKVsxXSk7dCgpfSl9KSxWZz1bXTtmdW5jdGlvbiBVZyhlKXtWZy5wdXNoKGUpfWxldCB5VD1VZztmdW5jdGlvbiBTVChlLHQpe1ZnLmZvckVhY2gobj0+bihlLHQpKX1mdW5jdGlvbiB3VChlLHQsLi4ubil7bGV0IHI9T1QoZSx0LG4pO3ImJmNvbnNvbGVbZV0ocil9ZnVuY3Rpb24gQ1QoKXtyZXR1cm4gdHlwZW9mIF9fY2hhbm5lbElkX189PSJzdHJpbmciJiZfX2NoYW5uZWxJZF9ffWZ1bmN0aW9uIEFUKGUsdCl7c3dpdGNoKHoudG9SYXdUeXBlKHQpKXtjYXNlIkZ1bmN0aW9uIjpyZXR1cm4iZnVuY3Rpb24oKSB7IFtuYXRpdmUgY29kZV0gfSI7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gT1QoZSx0LG4pe3JldHVybiBDVCgpPyhuLnB1c2godC5yZXBsYWNlKCJhdCAiLCJ1bmktYXBwOi8vLyIpKSxjb25zb2xlW2VdLmFwcGx5KGNvbnNvbGUsbikpOm4ubWFwKGZ1bmN0aW9uKG8pe2xldCBjPXoudG9UeXBlU3RyaW5nKG8pLnRvTG93ZXJDYXNlKCk7aWYoWyJbb2JqZWN0IG9iamVjdF0iLCJbb2JqZWN0IGFycmF5XSIsIltvYmplY3QgbW9kdWxlXSJdLmluZGV4T2YoYykhPT0tMSl0cnl7bz0iLS0tQkVHSU46SlNPTi0tLSIrSlNPTi5zdHJpbmdpZnkobyxBVCkrIi0tLUVORDpKU09OLS0tIn1jYXRjaChnKXtvPWN9ZWxzZSBpZihvPT09bnVsbClvPSItLS1OVUxMLS0tIjtlbHNlIGlmKG89PT12b2lkIDApbz0iLS0tVU5ERUZJTkVELS0tIjtlbHNle2xldCBnPXoudG9SYXdUeXBlKG8pLnRvVXBwZXJDYXNlKCk7Zz09PSJOVU1CRVIifHxnPT09IkJPT0xFQU4iP289Ii0tLUJFR0lOOiIrZysiLS0tIitvKyItLS1FTkQ6IitnKyItLS0iOm89U3RyaW5nKG8pfXJldHVybiBvfSkuam9pbigiLS0tQ09NTUEtLS0iKSsiICIrdH1sZXQgVFQ9MSxuZix1Yz17fTtmdW5jdGlvbiAkZyhlKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIil7bGV0IHQ9T2JqZWN0LmtleXModWMpLmZpbmQocj0+dWNbcl09PT1lKSxuPXQ/cGFyc2VJbnQodCk6VFQrKztyZXR1cm4gdWNbbl09ZSxufWVsc2Ugei5pc1BsYWluT2JqZWN0KGUpJiZPYmplY3Qua2V5cyhlKS5mb3JFYWNoKHQ9PntlW3RdPSRnKGVbdF0pfSk7cmV0dXJuIGV9ZnVuY3Rpb24gUFQoZSx0LG4scil7cmV0dXJuIG9mKGUsdCxuLHIpfWZ1bmN0aW9uIHJmKCl7cmV0dXJuIG5mfHwobmY9UC5yZXF1aXJlTmF0aXZlUGx1Z2luKCJVVFMtUHJveHkiKSksbmZ9ZnVuY3Rpb24gSGcoZSx0LG4scixvKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlx1OEZENFx1NTZERVx1NTAzQ1x1NEUzQVx1RkYxQSIrSlNPTi5zdHJpbmdpZnkodCkrIlx1RkYxQlx1OEJGN1x1NkM0Mlx1NTNDMlx1NjU3MFx1NEUzQVx1RkYxQSIrSlNPTi5zdHJpbmdpZnkoZSkpO2lmKHouaXNTdHJpbmcodCkpdHJ5e3Q9SlNPTi5wYXJzZSh0KX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoYEpTT04ucGFyc2UoJHt0fSk6IGArYyl9aWYodC5lcnJNc2cpdGhyb3cgbmV3IEVycm9yKHQuZXJyTXNnKTtpZihuJiZuLnR5cGU9PT0iaW50ZXJmYWNlIiYmdHlwZW9mIHQucGFyYW1zPT0ibnVtYmVyIil7aWYoIXQucGFyYW1zKXJldHVybiBudWxsO2lmKHQucGFyYW1zPT09ciYmbylyZXR1cm4gbztpZihhZltuLm9wdGlvbnNdKXtsZXQgYz1HZyh6LmV4dGVuZCh7aW5zdGFuY2VJZDp0LnBhcmFtc30sYWZbbi5vcHRpb25zXSkpO3JldHVybiBuZXcgY319cmV0dXJuIHQucGFyYW1zfWZ1bmN0aW9uIGpnKGUpe2lmKGUuZXJyTXNnKXRocm93IG5ldyBFcnJvcihlLmVyck1zZyk7cmV0dXJuIGRlbGV0ZSBlLmVyck1zZyxIZyhlLHJmKCkuaW52b2tlU3luYyhlLCgpPT57fSkpfWZ1bmN0aW9uIG9mKGUse21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4scGFja2FnZTpyLGNsYXNzOm8sbmFtZTpjLG1ldGhvZDpnLGNvbXBhbmlvbjpiLHBhcmFtczpWLHJldHVybjpULGVyck1zZzpEfSx2ZSx5ZSl7bGV0IE9lPSh7aWQ6aHQsbmFtZTpWdCxwYXJhbXM6d3Qsa2VlcEFsaXZlOkVufSk9PntsZXQgb249dWNbaHRdO29uPyhvbiguLi53dCksRW58fGRlbGV0ZSB1Y1todF0pOmNvbnNvbGUuZXJyb3IoYCR7cn0ke299LiR7Y30gJHtWdH0gaXMgbm90IGZvdW5kYCl9LGZ0PXZlP3ttb2R1bGVOYW1lOnQsbW9kdWxlVHlwZTpuLGlkOnZlLG5hbWU6YyxtZXRob2Q6Vn06e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4scGFja2FnZTpyLGNsYXNzOm8sbmFtZTpnfHxjLGNvbXBhbmlvbjpiLG1ldGhvZDpWfTtyZXR1cm4oLi4uaHQpPT57aWYoRCl0aHJvdyBuZXcgRXJyb3IoRCk7bGV0IFZ0PXouZXh0ZW5kKHt9LGZ0LHtwYXJhbXM6aHQubWFwKHd0PT4kZyh3dCkpfSk7cmV0dXJuIGU/bmV3IFByb21pc2UoKHd0LEVuKT0+e3JmKCkuaW52b2tlQXN5bmMoVnQsb249Pntvbi50eXBlIT09InJldHVybiI/T2Uob24pOm9uLmVyck1zZz9Fbihvbi5lcnJNc2cpOnd0KG9uLnBhcmFtcyl9KX0pOkhnKFZ0LHJmKCkuaW52b2tlU3luYyhWdCxPZSksVCx2ZSx5ZSl9fWZ1bmN0aW9uIHpnKGUsdCl7cmV0dXJuIHQubWFpbiYmIXQubWV0aG9kJiZZZygpJiYodC5tZXRob2Q9InNfIit0Lm5hbWUpLG9mKGUsdCwwKX1sZXQgSVQ9emc7ZnVuY3Rpb24gV2coZSx0KXtyZXR1cm4gei5oYXNPd24odCxlKyJCeUpzIik/ZSsiQnlKcyI6ZX1mdW5jdGlvbiBOVChlKXtyZXR1cm4gdHlwZW9mIGU9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIGtUKGUpe3JldHVybiFOVChlLmluc3RhbmNlSWQpfWZ1bmN0aW9uIEdnKGUpe2xldHttb2R1bGVOYW1lOnQsbW9kdWxlVHlwZTpuLHBhY2thZ2U6cixjbGFzczpvLG1ldGhvZHM6Yyxwcm9wczpnLGVyck1zZzpifT1lLFY9e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4scGFja2FnZTpyLGNsYXNzOm8sZXJyTXNnOmJ9LFQsRD1bXSx2ZT17fSx5ZT1bXSxPZT0hMTtrVChlKT8oT2U9ITAsVD1lLmluc3RhbmNlSWQpOihEPWUuY29uc3RydWN0b3IucGFyYW1zLHZlPWUuc3RhdGljTWV0aG9kcyx5ZT1lLnN0YXRpY1Byb3BzKSxZZygpJiZELmZpbmQoVnQ9PlZ0LnR5cGU9PT0iVVRTQ2FsbGJhY2sifHxWdC50eXBlLmluZGV4T2YoIkpTT05PYmplY3QiKT4wKSYmRC5wdXNoKHtuYW1lOiJfYnlKcyIsdHlwZToiYm9vbGVhbiJ9KTtsZXQgZnQ9Y2xhc3N7Y29uc3RydWN0b3IoLi4ud3Qpe2lmKHRoaXMuX19pbnN0YW5jZUlkPTAsYil0aHJvdyBuZXcgRXJyb3IoYik7bGV0IEVuPXt9O2lmKE9lP3R5cGVvZiBUPT0ibnVtYmVyIiYmKHRoaXMuX19pbnN0YW5jZUlkPVQpOnRoaXMuX19pbnN0YW5jZUlkPW9mKCExLHouZXh0ZW5kKHtuYW1lOiJjb25zdHJ1Y3RvciIscGFyYW1zOkR9LFYpLDApLmFwcGx5KG51bGwsd3QpLCF0aGlzLl9faW5zdGFuY2VJZCl0aHJvdyBuZXcgRXJyb3IoYG5ldyAke299IGlzIGZhaWxlZGApO2xldCBvbj10aGlzLGFuPW5ldyBQcm94eShvbix7Z2V0KFN0LFh0KXtpZihYdD09PSJfX3Zfc2tpcCIpcmV0dXJuITA7aWYoIUVuW1h0XSl7aWYoWHQ9V2coWHQsYyksei5oYXNPd24oYyxYdCkpe2xldHthc3luYzpkbixwYXJhbXM6dG4scmV0dXJuOlRufT1jW1h0XTtFbltYdF09UFQoISFkbix6LmV4dGVuZCh7bmFtZTpYdCxwYXJhbXM6dG4scmV0dXJuOlRufSxWKSxvbi5fX2luc3RhbmNlSWQsYW4pfWVsc2UgaWYoZy5pbmNsdWRlcyhYdCkpcmV0dXJuIGpnKHttb2R1bGVOYW1lOnQsbW9kdWxlVHlwZTpuLGlkOm9uLl9faW5zdGFuY2VJZCxuYW1lOlh0LGVyck1zZzpifSl9cmV0dXJuIEVuW1h0XX19KTtyZXR1cm4gYW59fSxodD17fTtyZXR1cm4gbmV3IFByb3h5KGZ0LHtnZXQoVnQsd3QsRW4pe2lmKHd0PVdnKHd0LHZlKSx6Lmhhc093bih2ZSx3dCkpe2lmKCFodFt3dF0pe2xldHthc3luYzpvbixwYXJhbXM6YW4scmV0dXJuOlN0fT12ZVt3dF07aHRbd3RdPXpnKCEhb24sei5leHRlbmQoe25hbWU6d3QsY29tcGFuaW9uOiEwLHBhcmFtczphbixyZXR1cm46U3R9LFYpKX1yZXR1cm4gaHRbd3RdfXJldHVybiB5ZS5pbmNsdWRlcyh3dCk/amcoei5leHRlbmQoe25hbWU6d3QsY29tcGFuaW9uOiEwfSxWKSk6UmVmbGVjdC5nZXQoVnQsd3QsRW4pfX0pfWZ1bmN0aW9uIGpjKCl7cmV0dXJuIHR5cGVvZiBzIT0idW5kZWZpbmVkIiYmcy5vcy5uYW1lPT09IkFuZHJvaWQifWZ1bmN0aW9uIFlnKCl7cmV0dXJuIWpjKCl9ZnVuY3Rpb24gUlQoZSx0KXtyZXR1cm4gamMoKT8idXRzLnNkay4iKyh0PyJtb2R1bGVzLiI6IiIpK2U6IiJ9ZnVuY3Rpb24geFQoZSx0KXtyZXR1cm4gcWcoZSxqYygpPyJJbmRleEt0IjoiSW5kZXhTd2lmdCIsdCl9ZnVuY3Rpb24gcWcoZSx0LG4pe3JldHVybiBqYygpP3Q6IlVUU1NESyIrKG4/Ik1vZHVsZXMiOiIiKSt6LmNhcGl0YWxpemUoZSkrei5jYXBpdGFsaXplKHQpfWxldCBhZj17fTtmdW5jdGlvbiBCVChlLHQpe2FmW2VdPXR9bGV0IEpnPXt9O2Z1bmN0aW9uIE1UKGUsdCl7SmdbZV09dH1mdW5jdGlvbiBMVChlKXtsZXQgdD1KZ1tlXTtyZXR1cm4gdHx8Y29uc29sZS5lcnJvcihgJHtlfSBpcyBub3QgZm91bmRgKSx0fWxldCB3bz17bG9hZDoibG9hZCIsY2xvc2U6ImNsb3NlIixlcnJvcjoiZXJyb3IiLGFkQ2xpY2tlZDoiYWRDbGlja2VkIn07Y2xhc3MgS2d7Y29uc3RydWN0b3IoKXt0aGlzLl9jYWxsYmFja3M9e319b25Mb2FkKHQpe3RoaXMuX2FkZEV2ZW50TGlzdGVuZXIod28ubG9hZCx0KX1vbkNsb3NlKHQpe3RoaXMuX2FkZEV2ZW50TGlzdGVuZXIod28uY2xvc2UsdCl9b25FcnJvcih0KXt0aGlzLl9hZGRFdmVudExpc3RlbmVyKHdvLmVycm9yLHQpfW9mZkxvYWQodCl7dGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcih3by5sb2FkLHQpfW9mZkNsb3NlKHQpe3RoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIod28uY2xvc2UsdCl9b2ZmRXJyb3IodCl7dGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcih3by5lcnJvcix0KX1fYWRkRXZlbnRMaXN0ZW5lcih0LG4peyF6LmlzRnVuY3Rpb24obil8fCh0aGlzLl9jYWxsYmFja3NbdF18fCh0aGlzLl9jYWxsYmFja3NbdF09W10pLHRoaXMuX2NhbGxiYWNrc1t0XS5wdXNoKG4pKX1fcmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pe2xldCByPXRoaXMuX2NhbGxiYWNrc1t0XSxvPXIuaW5kZXhPZihuKTtvPi0xJiZyLnNwbGljZShvLDEpfV9kaXNwYXRjaEV2ZW50KHQsbil7dGhpcy5fY2FsbGJhY2tzW3RdLmZvckVhY2gocj0+e3Iobnx8e30pfSl9fWNsYXNzIHNmIGV4dGVuZHMgS2d7Y29uc3RydWN0b3IodCxuKXtzdXBlcigpO3RoaXMucHJlbG9hZD0hMCx0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsLHRoaXMucHJlbG9hZD1uLnByZWxvYWQhPT12b2lkIDA/bi5wcmVsb2FkOiExO2xldCByPXRoaXMuX2FkSW5zdGFuY2U9dDtyLm9uTG9hZCgoKT0+e3RoaXMuX2lzTG9hZGVkPSEwLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmUhPW51bGwmJih0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmUoKSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCksdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlIT1udWxsJiYodGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlKCksdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd0FkKCkpLHRoaXMuX2Rpc3BhdGNoRXZlbnQod28ubG9hZCx7fSl9KSxyLm9uQ2xvc2Uobz0+e3RoaXMuX2lzTG9hZGVkPSExLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9kaXNwYXRjaEV2ZW50KHdvLmNsb3NlLG8pLHRoaXMucHJlbG9hZD09PSEwJiZ0aGlzLl9sb2FkQWQoKX0pLHIub25FcnJvcihvPT57dGhpcy5faXNMb2FkaW5nPSExO2xldCBjPXtjb2RlOm8uY29kZSxlcnJNc2c6by5tZXNzYWdlfTt0aGlzLl9kaXNwYXRjaEV2ZW50KHdvLmVycm9yLGMpO2xldCBnPW5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShjKSk7dGhpcy5fbG9hZFByb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9sb2FkUHJvbWlzZVJlamVjdChnKSx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsKSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdCE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0KGcpLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpfSksci5vbkFkQ2xpY2tlZCYmci5vbkFkQ2xpY2tlZCgoKT0+e3RoaXMuX2Rpc3BhdGNoRXZlbnQod28uYWRDbGlja2VkLHt9KX0pfWdldFByb3ZpZGVyKCl7cmV0dXJuIHRoaXMuX2FkSW5zdGFuY2UuZ2V0UHJvdmlkZXIoKX1sb2FkKCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57dGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPXQsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9biwhdGhpcy5faXNMb2FkaW5nJiYodGhpcy5faXNMb2FkZWQ/dCgiIik6dGhpcy5fbG9hZEFkKCkpfSl9c2hvdygpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3RoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT10LHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyYmKHRoaXMuX2lzTG9hZGVkPyh0aGlzLl9zaG93QWQoKSx0KCIiKSk6dGhpcy5fbG9hZEFkKCkpfSl9ZGVzdHJveSgpe3RoaXMuX2FkSW5zdGFuY2UuZGVzdHJveSgpfV9sb2FkQWQoKXt0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITAsdGhpcy5fYWRJbnN0YW5jZS5sb2FkKCl9X3Nob3dBZCgpe3RoaXMuX2FkSW5zdGFuY2Uuc2hvdygpfX1jbGFzcyBEVCBleHRlbmRzIHNme2NvbnN0cnVjdG9yKHQpe3N1cGVyKHMuYWQuY3JlYXRlUmV3YXJkZWRWaWRlb0FkKHQpLHQpO3RoaXMuX2xvYWRBZCgpfX1sZXQgRlQ9THQoRXcsZT0+bmV3IERUKGUpLFN3LHl3KTtjbGFzcyBWVCBleHRlbmRzIHNme2NvbnN0cnVjdG9yKHQpe3N1cGVyKHMuYWQuY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQodCksdCk7dGhpcy5wcmVsb2FkPSExfX1sZXQgVVQ9THQod3csZT0+bmV3IFZUKGUpLEF3LEN3KTtjbGFzcyAkVCBleHRlbmRzIHNme2NvbnN0cnVjdG9yKHQpe3N1cGVyKHMuYWQuY3JlYXRlSW50ZXJzdGl0aWFsQWQodCksdCk7dGhpcy5wcmVsb2FkPSExLHRoaXMuX2xvYWRBZCgpfX1sZXQgSFQ9THQoT3csZT0+bmV3ICRUKGUpLFB3LFR3KSxTYT17fSx0bD17fTtmdW5jdGlvbiBqVChlKXtsZXQgdD1lLnByb3ZpZGVyO2lmKFNhW3RdfHwoU2FbdF09e30pLHR5cGVvZiBTYVt0XS5wbHVnaW49PSJvYmplY3QiKXtlLnN1Y2Nlc3MoU2FbdF0ucGx1Z2luKTtyZXR1cm59aWYodGxbdF18fCh0bFt0XT1bXSksdGxbdF0ucHVzaChlKSxTYVt0XS5zdGF0dXM9PT0hMCl7ZS5fX3BsdWdpbj1TYVt0XS5wbHVnaW47cmV0dXJufVNhW3RdLnN0YXR1cz0hMDtsZXQgbj1Zbyh0KTtpZighbnx8IW4uaW5pdFNESyl7dGxbdF0uZm9yRWFjaChyPT57ci5mYWlsKHtjb2RlOi0xLG1lc3NhZ2U6InByb3ZpZGVyIFsiK3QrIl0gaW52YWxpZCJ9KX0pLHRsW3RdLmxlbmd0aD0wLFNhW3RdLnN0YXR1cz0hMTtyZXR1cm59U2FbdF0ucGx1Z2luPW4sZS5fX3BsdWdpbj1uLG4uaW5pdFNESyhyPT57bGV0IG89ci5jb2RlPT09MXx8ci5jb2RlPT09IjEiO28/U2FbdF0ucGx1Z2luPW46U2FbdF0uc3RhdHVzPSExLHRsW3RdLmZvckVhY2goYz0+e28/Yy5zdWNjZXNzKGMuX19wbHVnaW4pOmMuZmFpbChyKX0pLHRsW3RdLmxlbmd0aD0wfSl9Y2xhc3MgelQgZXh0ZW5kcyBLZ3tjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO3RoaXMuX2FkcGlkPSIiLHRoaXMuX3Byb3ZpZGVyPSIiLHRoaXMuX3VzZXJEYXRhPW51bGwsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9hZEluc3RhbmNlPW51bGwsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9hZHBpZD10LmFkcGlkLHRoaXMuX3Byb3ZpZGVyPXQucHJvdmlkZXIsdGhpcy5fdXNlckRhdGE9dC51c2VyRGF0YSxOKCgpPT57dGhpcy5faW5pdCgpfSl9X2luaXQoKXt0aGlzLl9hZEVycm9yPSIiLGpUKHtwcm92aWRlcjp0aGlzLl9wcm92aWRlcixzdWNjZXNzOnQ9Pnt0aGlzLl9hZEluc3RhbmNlPXQsdGhpcy5fdXNlckRhdGEmJnRoaXMuYmluZFVzZXJEYXRhKHRoaXMuX3VzZXJEYXRhKSx0aGlzLl9sb2FkQWQoKX0sZmFpbDp0PT57dGhpcy5fYWRFcnJvcj10LHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZWplY3QodGhpcy5fY3JlYXRlRXJyb3IodCkpLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwpLHRoaXMuX2Rpc3BhdGNoRXZlbnQod28uZXJyb3IsdCl9fSl9Z2V0UHJvdmlkZXIoKXtyZXR1cm4gdGhpcy5fcHJvdmlkZXJ9bG9hZCgpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2lmKHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT10LHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyl7aWYodGhpcy5fYWRFcnJvcil7dGhpcy5faW5pdCgpO3JldHVybn10aGlzLl9pc0xvYWRlZD90KCIiKTp0aGlzLl9sb2FkQWQoKX19KX1zaG93KCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57aWYodGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPXQsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9biwhdGhpcy5faXNMb2FkaW5nKXtpZih0aGlzLl9hZEVycm9yKXt0aGlzLl9pbml0KCk7cmV0dXJufXRoaXMuX2lzTG9hZGVkPyh0aGlzLl9zaG93QWQoKSx0KCIiKSk6dGhpcy5fbG9hZEFkKCl9fSl9cmVwb3J0RXhwb3N1cmUoKXt0aGlzLl9hZEluc3RhbmNlIT09bnVsbCYmdGhpcy5fYWRJbnN0YW5jZS5yZXBvcnRFeHBvc3VyZSgpfWJpbmRVc2VyRGF0YSh0KXt0aGlzLl9hZEluc3RhbmNlIT09bnVsbCYmdGhpcy5fYWRJbnN0YW5jZS5iaW5kVXNlckRhdGEodCl9ZGVzdHJveSgpe3RoaXMuX2FkSW5zdGFuY2UhPT1udWxsJiZ0aGlzLl9hZEluc3RhbmNlLmRlc3Ryb3kmJnRoaXMuX2FkSW5zdGFuY2UuZGVzdHJveSh7YWRwaWQ6dGhpcy5fYWRwaWR9KX1fbG9hZEFkKCl7aWYodGhpcy5fYWRJbnN0YW5jZSE9PW51bGwpe2lmKHRoaXMuX2lzTG9hZGluZz09PSEwKXJldHVybjt0aGlzLl9pc0xvYWRpbmc9ITAsdGhpcy5fYWRJbnN0YW5jZS5sb2FkRGF0YSh7YWRwaWQ6dGhpcy5fYWRwaWR9LHQ9Pnt0aGlzLl9pc0xvYWRlZD0hMCx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlIT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZXNvbHZlKCksdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSgpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dBZCgpKSx0aGlzLl9kaXNwYXRjaEV2ZW50KHdvLmxvYWQsdCl9LHQ9Pnt0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fc2hvd1Byb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlamVjdCh0aGlzLl9jcmVhdGVFcnJvcih0KSksdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCksdGhpcy5fZGlzcGF0Y2hFdmVudCh3by5lcnJvcix0KX0pfX1fc2hvd0FkKCl7dGhpcy5fYWRJbnN0YW5jZSE9PW51bGwmJnRoaXMuX2lzTG9hZGVkPT09ITAmJnRoaXMuX2FkSW5zdGFuY2Uuc2hvdyh7YWRwaWQ6dGhpcy5fYWRwaWR9LCgpPT57dGhpcy5faXNMb2FkZWQ9ITF9LHQ9Pnt0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdCE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0KHRoaXMuX2NyZWF0ZUVycm9yKHQpKSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKSx0aGlzLl9kaXNwYXRjaEV2ZW50KHdvLmVycm9yLHQpfSl9X2NyZWF0ZUVycm9yKHQpe3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodCkpfX1sZXQgV1Q9THQoSXcsZT0+bmV3IHpUKGUpLGt3LE53KSxaZz1zLm9zLm5hbWU9PT0iQW5kcm9pZCImJnBhcnNlSW50KHMub3MudmVyc2lvbik8NixHVD1aZz8ic2xpZGUtaW4tcmlnaHQiOiJwb3AtaW4iLHpjPTMwMCxYZz1aZz8ic2xpZGUtb3V0LXJpZ2h0IjoicG9wLW91dCIsWVQ9Il93d3cvX191bmlhcHB2aWV3Lmh0bWwiLHFUPSJ3ZWJ2aWV3SWQiLEpUPSJ1bmlNUE5hdGl2ZUV2ZW50IjtmdW5jdGlvbiBLVChlLHQsbil7biYmdC5pc05WdWUmJihlLnVuaU5WaWV3PXtwYXRoOm4sZGVmYXVsdEZvbnRTaXplOlIuZGVmYXVsdEZvbnRTaXplLHZpZXdwb3J0OlIudmlld3BvcnR9KX1sZXQgWlQ9L14jW2EtejAtOV17Nn0kL2k7ZnVuY3Rpb24gWFQoZSl7cmV0dXJuIGUmJihaVC50ZXN0KGUpfHxlPT09InRyYW5zcGFyZW50Iil9ZnVuY3Rpb24gUVQoZSx0KXtsZXR7YmFja2dyb3VuZENvbG9yOm59PXQ7IW58fCFYVChuKXx8KGUuYmFja2dyb3VuZD9uPWUuYmFja2dyb3VuZDplLmJhY2tncm91bmQ9bixlLmJhY2tncm91bmRDb2xvclRvcHx8KGUuYmFja2dyb3VuZENvbG9yVG9wPW4pLGUuYmFja2dyb3VuZENvbG9yQm90dG9tfHwoZS5iYWNrZ3JvdW5kQ29sb3JCb3R0b209biksZS5hbmltYXRpb25BbHBoYUJHQ29sb3J8fChlLmFuaW1hdGlvbkFscGhhQkdDb2xvcj1uKSx0eXBlb2YgZS53ZWJ2aWV3QkdUcmFuc3BhcmVudD09InVuZGVmaW5lZCImJihlLndlYnZpZXdCR1RyYW5zcGFyZW50PSEwKSl9ZnVuY3Rpb24gZVAoZSx0KXtlLnBvcEdlc3R1cmU9PT0iaGlkZSImJmRlbGV0ZSBlLnBvcEdlc3R1cmUsdC5pc1F1aXQmJihlLnBvcEdlc3R1cmU9cy5vcy5uYW1lPT09ImlPUyI/ImFwcGJhY2siOiJub25lIil9ZnVuY3Rpb24gdFAoZSx0KXtpZighdC5lbmFibGVQdWxsRG93blJlZnJlc2gpcmV0dXJuO2xldCBuPVVhKHouZXh0ZW5kKHt9LHMub3MubmFtZT09PSJBbmRyb2lkIj9yUDppUCx0LnB1bGxUb1JlZnJlc2gpKTtlLnB1bGxUb1JlZnJlc2g9blAobix0KX1mdW5jdGlvbiBuUChlLHQpe2xldCBuPVNyKGUpO2lmKCFuKXJldHVybiBlO2xldFtyLG8sY109bjtyZXR1cm4ocnx8b3x8YykmJlAub25Mb2NhbGVDaGFuZ2UoKCk9PntsZXQgZz1zLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodC5pZCsiIik7aWYoIWcpcmV0dXJuO2xldCBiPXtzdXBwb3J0OiEwfTtyJiYoYi5jb250ZW50ZG93bj17Y2FwdGlvbjplLmNvbnRlbnRkb3duLmNhcHRpb259KSxvJiYoYi5jb250ZW50b3Zlcj17Y2FwdGlvbjplLmNvbnRlbnRvdmVyLmNhcHRpb259KSxjJiYoYi5jb250ZW50cmVmcmVzaD17Y2FwdGlvbjplLmNvbnRlbnRyZWZyZXNoLmNhcHRpb259KSxnLnNldFN0eWxlKHtwdWxsVG9SZWZyZXNoOmJ9KX0pLGV9bGV0IHJQPXtzdXBwb3J0OiEwLHN0eWxlOiJjaXJjbGUifSxpUD17c3VwcG9ydDohMCxzdHlsZToiZGVmYXVsdCIsaGVpZ2h0OiI1MHB4IixyYW5nZToiMjAwcHgiLGNvbnRlbnRkb3duOntjYXB0aW9uOiIifSxjb250ZW50b3Zlcjp7Y2FwdGlvbjoiIn0sY29udGVudHJlZnJlc2g6e2NhcHRpb246IiJ9fTtmdW5jdGlvbiBvUChlLHQpe2xldHtuYXZpZ2F0aW9uQmFyOm59PXQ7aWYobi5zdHlsZT09PSJjdXN0b20iKXJldHVybiExO2xldCByPSEwO3QuaXNRdWl0JiYocj0hMSk7bGV0IG89e2F1dG9CYWNrQnV0dG9uOnJ9O09iamVjdC5rZXlzKG4pLmZvckVhY2goYz0+e2xldCBnPW5bY107Yz09PSJ0aXRsZUltYWdlIiYmZz9vLnRhZ3M9c1AoZyk6Yz09PSJidXR0b25zIiYmei5pc0FycmF5KGcpP28uYnV0dG9ucz1nLm1hcCgoYixWKT0+KGIub25jbGljaz1sUChWKSxiKSk6b1tjXT1nfSksZS50aXRsZU5WaWV3PWFQKG8sdCl9ZnVuY3Rpb24gYVAoZSx0KXtsZXQgbj1VbihlKTtpZighbilyZXR1cm4gZTtsZXRbcixvXT1uO3JldHVybihyfHxvKSYmUC5vbkxvY2FsZUNoYW5nZSgoKT0+e2xldCBjPXMud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh0LmlkKyIiKTtpZighYylyZXR1cm47bGV0IGc9e307ciYmKGcudGl0bGVUZXh0PWUudGl0bGVUZXh0KSxvJiYoZy5zZWFyY2hJbnB1dD17cGxhY2Vob2xkZXI6ZS5zZWFyY2hJbnB1dC5wbGFjZWhvbGRlcn0pLGMuc2V0U3R5bGUoe3RpdGxlTlZpZXc6Z30pfSksZX1mdW5jdGlvbiBzUChlKXtyZXR1cm5be3RhZzoiaW1nIixzcmM6ZSxwb3NpdGlvbjp7bGVmdDoiYXV0byIsdG9wOiJhdXRvIix3aWR0aDoiYXV0byIsaGVpZ2h0OiIyNnB4In19XX1mdW5jdGlvbiBsUChlKXtyZXR1cm4gZnVuY3Rpb24obil7bi5pbmRleD1lLGpuKEsuT05fTkFWSUdBVElPTl9CQVJfQlVUVE9OX1RBUCxuKX19ZnVuY3Rpb24gUWcoZSx0LG4pe2xldCByPXtib3VuY2U6InZlcnRpY2FsIn07cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2gobz0+e2NQLmluZGV4T2Yobyk9PT0tMSYmKHJbb109dFtvXSl9KSxuLmlkIT09IjEiJiZLVChyLHQsZSksZVAocix0KSxRVChyLHQpLG9QKHIsdCksdFAocix0KSxyfWxldCBjUD1bImlkIiwicm91dGUiLCJpc05WdWUiLCJpc1F1aXQiLCJpc0VudHJ5IiwiaXNUYWJCYXIiLCJ0YWJCYXJJbmRleCIsIndpbmRvd1RvcCIsInRvcFdpbmRvdyIsImxlZnRXaW5kb3ciLCJyaWdodFdpbmRvdyIsIm1heFdpZHRoIiwidXNpbmdDb21wb25lbnRzIiwiZGlzYWJsZVNjcm9sbCIsImVuYWJsZVB1bGxEb3duUmVmcmVzaCIsIm5hdmlnYXRpb25CYXIiLCJwdWxsVG9SZWZyZXNoIiwib25SZWFjaEJvdHRvbURpc3RhbmNlIiwicGFnZU9yaWVudGF0aW9uIiwiYmFja2dyb3VuZENvbG9yIl0sZXA9MjtmdW5jdGlvbiB0cCgpe3JldHVybiBlcH1mdW5jdGlvbiBucCgpe3JldHVybiBlcCsrfWZ1bmN0aW9uIHJwKGUpe3JldHVybiBlfWZ1bmN0aW9uIGlwKGUsdCl7bGV0IG49dD9LLnN0cmluZ2lmeVF1ZXJ5KHQscnApOiIiO3JldHVybntwYXRoOmUuc2xpY2UoMSkscXVlcnk6biYmbi5zbGljZSgxKX19ZnVuY3Rpb24gdVAoZSx0LG4pe2xldCByPW4/Sy5zdHJpbmdpZnlRdWVyeShuLHJwKToiIjtyZXR1cm57aXNUYWI6ZSxhcmd1bWVudHM6SlNPTi5zdHJpbmdpZnkoe3BhdGg6dC5zbGljZSgxKSxxdWVyeTpyJiZyLnNsaWNlKDEpfSl9fWZ1bmN0aW9uIGZQKHtwYXRoOmUscXVlcnk6dCxyb3V0ZU9wdGlvbnM6bix3ZWJ2aWV3RXh0cmFzOnJ9KXtsZXQgbz0oKT0+UWcoZSxqdShuLm1ldGEpLHtpZDpjKyIifSksYz1ucCgpLGc9bygpO2cudW5pUGFnZVVybD1pcChlLHQpLGcuaXNUYWI9ISFuLm1ldGEuaXNUYWJCYXI7bGV0IGI9cy53ZWJ2aWV3LmNyZWF0ZSgiIixTdHJpbmcoYyksZyx6LmV4dGVuZCh7bnZ1ZTohMCxfX3BhdGhfXzplLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeSh0KX0scikpO3JldHVybiB6aChiLG8pLGJ9bGV0ICRpO2Z1bmN0aW9uIG9wKGUpeyRpPWV9ZnVuY3Rpb24gZFAoKXtyZXR1cm4gJGl9ZnVuY3Rpb24gaFAoKXtyZXR1cm4oISRpfHwkaS5fX3VuaWFwcF9yb3V0ZSkmJigkaT1zLndlYnZpZXcuY3JlYXRlKFlULFN0cmluZyhucCgpKSx7Y29udGVudEFkanVzdDohMX0pKSwkaX1mdW5jdGlvbiBnUChlKXtsZXR7cG9wdXBTdWJOVnVlV2Vidmlld3M6dH09ZTshdHx8ZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PntPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG49Pnt0W25dLmNsb3NlKCJub25lIil9KX0pfWZ1bmN0aW9uIGFwKGUpe3JldHVybiBSLnJlYWxFbnRyeVBhZ2VQYXRoJiZlLiRwYWdlLnJvdXRlPT09Ui5lbnRyeVBhZ2VQYXRofWZ1bmN0aW9uIHNwKCl7Ui5lbnRyeVBhZ2VQYXRoPVIucmVhbEVudHJ5UGFnZVBhdGgsZGVsZXRlIFIucmVhbEVudHJ5UGFnZVBhdGgsUC5yZUxhdW5jaCh7dXJsOksuYWRkTGVhZGluZ1NsYXNoKFIuZW50cnlQYWdlUGF0aCl9KX1mdW5jdGlvbiBwUChlKXtsZXQgdDtlLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLG49PntpZihuLnR5cGU9PT0ic3RhcnQiKXtsZXQgcj1SbigpLG89cltyLmxlbmd0aC0yXTt0PW5jO2xldCBjPW8mJm8uJHBhZ2Uuc3RhdHVzQmFyU3R5bGU7YyYmQmEoYyl9ZWxzZSBpZihuLnR5cGU9PT0iZW5kIiYmIW4ucmVzdWx0KUJhKHQpO2Vsc2UgaWYobi50eXBlPT09ImVuZCImJm4ucmVzdWx0KXtsZXQgcj1SbigpLmxlbmd0aCxvPUFpKCk7cXIoKSxCYSgpLG8mJnI9PT0xJiZhcChvKT9zcCgpOmpuKEsuT05fU0hPVyl9fSl9ZnVuY3Rpb24gdlAoZSl7aWYoZS5udnVlKXJldHVybjtsZXQgdD1lLmlkLHtzdWJzY3JpYmU6bix1bnN1YnNjcmliZTpyfT1vdCxvPShjLGcpPT57aWYodCE9PWcpcmV0dXJuO3IoUmwsbyk7bGV0IGI9TnIocGFyc2VJbnQoZykpO2ImJmIuX19wYWdlX2NvbnRhaW5lcl9fLnJlc3RvcmUoKX07ZS5hZGRFdmVudExpc3RlbmVyKCJyZWNvdmVyeSIsKCk9PntuKFJsLG8pfSl9ZnVuY3Rpb24gbVAoZSl7bGV0e2VtaXQ6dH09b3Qsbj1mdW5jdGlvbih7d2lkdGg6cixoZWlnaHQ6b30pe2xldCBnPXtkZXZpY2VPcmllbnRhdGlvbjpNYXRoLmFicyhzLm5hdmlnYXRvci5nZXRPcmllbnRhdGlvbigpKT09PTkwPyJsYW5kc2NhcGUiOiJwb3J0cmFpdCIsc2l6ZTp7d2luZG93V2lkdGg6TWF0aC5jZWlsKHIpLHdpbmRvd0hlaWdodDpNYXRoLmNlaWwobyl9fTt0KEsuT05fUkVTSVpFLGcscGFyc2VJbnQoZS5pZCkpfTtlLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsSy5kZWJvdW5jZShuLDUwLHtzZXRUaW1lb3V0Ok4sY2xlYXJUaW1lb3V0Onl9KSl9bGV0IGxwPXtwdWxsVG9SZWZyZXNoOksuT05fUFVMTF9ET1dOX1JFRlJFU0gsdGl0bGVOVmlld1NlYXJjaElucHV0Q2hhbmdlZDpLLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DSEFOR0VELHRpdGxlTlZpZXdTZWFyY2hJbnB1dENvbmZpcm1lZDpLLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DT05GSVJNRUQsdGl0bGVOVmlld1NlYXJjaElucHV0Q2xpY2tlZDpLLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DTElDS0VELHRpdGxlTlZpZXdTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZDpLLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9GT0NVU19DSEFOR0VEfTtmdW5jdGlvbiBfUChlKXtsZXQgdD1wYXJzZUludChlLmlkKTtPYmplY3Qua2V5cyhscCkuZm9yRWFjaChuPT57bGV0IHI9bHBbbl07ZS5hZGRFdmVudExpc3RlbmVyKG4sbz0+e3I9PT1LLk9OX1BVTExfRE9XTl9SRUZSRVNIJiZXdShlKSxqbih0LHIsbyl9KX0pLGdQKGUpLG1QKGUpLHMub3MubmFtZT09PSJpT1MiJiYodlAoZSkscFAoZSkpfWZ1bmN0aW9uIGJQKGUsdCxuLHIpe2xldCBvPSgpPT5RZyh0LGp1KHIpLGUpLGM9bygpO2MudW5pUGFnZVVybD1pcCh0LG4pO2xldCBnPSEhci5pc1RhYkJhcjtyLmlzTlZ1ZT9jLmlzVGFiPWc6Yy5kZWJ1Z1JlZnJlc2g9dVAoZyx0LG4pLGMubG9jYWxlPWYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldExhbmd1YWdlKCksemgoZSxvKSxlLnNldFN0eWxlKGMpfWZ1bmN0aW9uIEVQKGUsdCxuKXsobi5zdWJOVnVlc3x8W10pLmZvckVhY2gobz0+e2lmKCFvLnBhdGgpcmV0dXJuO2xldCBjPVZhKG8uc3R5bGV8fHt9KSxnPW8udHlwZT09PSJuYXZpZ2F0aW9uQmFyIixiPW8udHlwZT09PSJwb3B1cCI7Yy51bmlOVmlldz17cGF0aDpvLnBhdGgucmVwbGFjZSgiLm52dWUiLCIuanMiKSxkZWZhdWx0Rm9udFNpemU6Ui5kZWZhdWx0Rm9udFNpemUsdmlld3BvcnQ6Ui52aWV3cG9ydH07bGV0IFY9e19fdW5pYXBwX2hvc3Q6dCxfX3VuaWFwcF9vcmlnaW46Yy51bmlOVmlldy5wYXRoLnNwbGl0KCI/IilbMF0ucmVwbGFjZSgiLmpzIiwiIiksX191bmlhcHBfb3JpZ2luX2lkOmUuaWQsX191bmlhcHBfb3JpZ2luX3R5cGU6ZS5fX3VuaWFwcF90eXBlfSxUO2c/KGMucG9zaXRpb249ImRvY2siLGMuZG9jaz0idG9wIixjLnRvcD0iMCIsYy53aWR0aD0iMTAwJSIsYy5oZWlnaHQ9U3RyaW5nKEsuTkFWQkFSX0hFSUdIVCtHdSgpKSxkZWxldGUgYy5sZWZ0LGRlbGV0ZSBjLnJpZ2h0LGRlbGV0ZSBjLmJvdHRvbSxkZWxldGUgYy5tYXJnaW4pOmImJihjLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGModCk/VD1faTpUPWUsVi5fX3VuaWFwcF9tYXNrPWMubWFza3x8InJnYmEoMCwwLDAsMC41KSIsVi5fX3VuaWFwcF9tYXNrX2lkPVQuaWQpLGRlbGV0ZSBjLm1hc2s7bGV0IEQ9cy53ZWJ2aWV3LmNyZWF0ZSgiIixvLmlkLGMsVik7aWYoYil7VC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c3x8KFQucG9wdXBTdWJOVnVlV2Vidmlld3M9e30pLFQucG9wdXBTdWJOVnVlV2Vidmlld3NbRC5pZF09RDtsZXQgdmU9ZnVuY3Rpb24oKXtULnNldFN0eWxlKHttYXNrOiJub25lIn0pLEQuaGlkZSgiYXV0byIpfTtULmFkZEV2ZW50TGlzdGVuZXIoIm1hc2tDbGljayIsdmUpO2xldCB5ZT0hMTtELmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLCgpPT57eWV8fChzLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixVaSkscy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsdmUpLHllPSEwKX0pLEQuYWRkRXZlbnRMaXN0ZW5lcigiaGlkZSIsKCk9Pnt5ZSYmKHMua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLHZlKSxzLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixVaSkseWU9ITEpfSksRC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PntkZWxldGUgVC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tELmlkXSx5ZSYmKHMua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLHZlKSxzLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixVaSkseWU9ITEpfSl9ZWxzZSBlLmFwcGVuZChEKX0pfWZ1bmN0aW9uIHlQKGUsdCxuLHIpeyhlLmlkPT09IjEifHwhci5pc05WdWUpJiZiUChlLHQsbixyKSxFUChlLHQsciksX1AoZSl9ZnVuY3Rpb24gY3AoZSl7cmV0dXJuIGUucm91dGVPcHRpb25zLm1ldGEuaXNOVnVlP2ZQKGUpOnRwKCk9PT0yP3Mud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCk6ZFAoKX1mdW5jdGlvbiB1cChlLHQpe290Lm9uY2UoUmwrIi4iK2UsdCl9bGV0IHdhPSExO2Z1bmN0aW9uIGZwKGUsdCxuKXt3YT17cGF0aDplLG52dWU6b3MoZSkuaXNOVnVlLGNhbGxiYWNrOnR9fWZ1bmN0aW9uIGRwKGUsdCxuKXt0YShlKSxubChlLiRnZXRBcHBXZWJ2aWV3KCksdCxuKX1mdW5jdGlvbiBXYyhlLHQsbj0hMSl7aWYoIW4mJndhKXJldHVybiBjb25zb2xlLmVycm9yKGBXYWl0aW5nIHRvIG5hdmlnYXRlIHRvOiAke3dhLnBhdGh9LCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICR7ZX0uYCk7aWYoUi5yZW5kZXJlcj09PSJuYXRpdmUiKXJldHVybiBSbigpLmxlbmd0aD09PTA/ZnAoZSx0LCJ3YWl0Rm9yUmVhZHkiKTp0KCk7bGV0IHI9ISRpfHwkaSYmJGkuX191bmlhcHBfcm91dGUsbz0kaSYmISRpLmxvYWRlZDtyfHxvP2ZwKGUsdCxyPyJ3YWl0Rm9yQ3JlYXRlIjoid2FpdEZvclJlYWR5Iik6dCgpLG8mJnVwKCRpLmlkLEdjKX1mdW5jdGlvbiBHYygpe2lmKCF3YSlyZXR1cm47bGV0e2NhbGxiYWNrOmV9PXdhO3JldHVybiB3YT0hMSxlKCl9ZnVuY3Rpb24gaHAoKXtpZihSLnJlbmRlcmVyPT09Im5hdGl2ZSIpcmV0dXJuIHdhJiZ3YS5udnVlP0djKCk6dm9pZCAwO2xldCBlPWhQKCk7aWYoISF3YSl7aWYod2EubnZ1ZSlyZXR1cm4gR2MoKTtlLmxvYWRlZD93YS5jYWxsYmFjaygpOnVwKGUuaWQsR2MpfX1mdW5jdGlvbiBubChlLHQsbil7ZVtlLl9fcHJlbG9hZF9fPyJoaWRlIjoiY2xvc2UiXSh0LG4pfWZ1bmN0aW9uIFljKGUsdCxuLHIsbyl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiYobz1lLm52dWU/MDoxMDApO2xldCBjPWZ1bmN0aW9uKCl7Yy5fY2FsbGVkfHwoYy5fY2FsbGVkPSEwLHImJnIoKSxocCgpKX07Yy5fY2FsbGVkPSExLE4oKCk9PntsZXQgZz1OKCgpPT57YygpfSxuKzE1MCk7ZS5zaG93KHQsbiwoKT0+e2MuX2NhbGxlZHx8eShnKSxjKCl9KX0sbyl9ZnVuY3Rpb24gU1AoZSx0KXtsZXQgbj1lLmNoaWxkcmVuKCk7aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gdCgpO2xldCByPW4uZmluZChvPT5vLmlkLmluZGV4T2YocVQpPT09MCl8fG5bMF07ci5jYW5CYWNrKCh7Y2FuQmFjazpvfSk9PntvP3IuYmFjaygpOnQoKX0pfWxldCB3UD1FZShEeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1BaSgpO2lmKCFyKXJldHVybiBuKCJnZXRDdXJyZW50UGFnZXMgaXMgZW1wdHkiKTtpZihqbihyLEsuT05fQkFDS19QUkVTUyx7ZnJvbTplLmZyb218fCJuYXZpZ2F0ZUJhY2sifSkpcmV0dXJuIHQoKTtpZihQLmhpZGVUb2FzdCgpLFAuaGlkZUxvYWRpbmcoKSxyLiRwYWdlLm1ldGEuaXNRdWl0KUNQKCk7ZWxzZSBpZihhcChyKSlzcCgpO2Vsc2V7bGV0e2RlbHRhOm8sYW5pbWF0aW9uVHlwZTpjLGFuaW1hdGlvbkR1cmF0aW9uOmd9PWU7QVAobyxjLGcpfXJldHVybiB0KCl9LFZ5LEp5KSxxYz0wO2Z1bmN0aW9uIENQKCl7WXIoKSxxYz9EYXRlLm5vdygpLXFjPDJlMyYmcy5ydW50aW1lLnF1aXQoKToocWM9RGF0ZS5ub3coKSxzLm5hdGl2ZVVJLnRvYXN0KGd0KCkudCgidW5pLmFwcC5xdWl0IikpLE4oKCk9PntxYz0wfSwyZTMpKX1mdW5jdGlvbiBBUChlLHQsbil7bGV0IHI9Um4oKSxvPXIubGVuZ3RoLGM9cltvLTFdO2U+MSYmci5zbGljZShvLWUsby0xKS5yZXZlcnNlKCkuZm9yRWFjaChWPT57bmwocy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKFYuJHBhZ2UuaWQrIiIpLCJub25lIiwwKX0pO2xldCBnPWZ1bmN0aW9uKFYpe3Q/bmwoVix0LG58fHpjKTpjLiRwYWdlLm9wZW5UeXBlPT09InJlZGlyZWN0VG8iP25sKFYsWGcsemMpOm5sKFYsImF1dG8iKSxyLnNsaWNlKG8tZSxvKS5mb3JFYWNoKFQ9PnRhKFQpKSxCYSgpLGpuKEsuT05fU0hPVyl9LGI9cy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKGMuJHBhZ2UuaWQrIiIpO2lmKCFjLl9fdW5pYXBwX3dlYnZpZXcpcmV0dXJuIGcoYik7U1AoYiwoKT0+e2coYil9KX1jbGFzcyBPUCBleHRlbmRzIEsuVW5pTm9kZXtjb25zdHJ1Y3Rvcih0LG4scj0hMSl7c3VwZXIoSy5OT0RFX1RZUEVfUEFHRSwiI3BhZ2UiLG51bGwpO3RoaXMuX2lkPTEsdGhpcy5fY3JlYXRlZD0hMSx0aGlzLl91cGRhdGluZz0hMSx0aGlzLl9jcmVhdGVBY3Rpb25NYXA9bmV3IE1hcCx0aGlzLnVwZGF0ZUFjdGlvbnM9W10sdGhpcy5kaWN0cz1bXSx0aGlzLm5vZGVJZD0wLHRoaXMucGFnZUlkPXQsdGhpcy5wYWdlTm9kZT10aGlzLHRoaXMub3B0aW9ucz1uLHRoaXMuaXNVbm1vdW50ZWQ9ITEsdGhpcy5jcmVhdGVBY3Rpb249W0suQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEUsbl0sdGhpcy5jcmVhdGVkQWN0aW9uPVtLLkFDVElPTl9UWVBFX1BBR0VfQ1JFQVRFRF0sdGhpcy5ub3JtYWxpemVEaWN0PXRoaXMuX25vcm1hbGl6ZURpY3QuYmluZCh0aGlzKSx0aGlzLl91cGRhdGU9dGhpcy51cGRhdGUuYmluZCh0aGlzKSxyJiZ0aGlzLnNldHVwKCl9X25vcm1hbGl6ZURpY3QodCxuPSEwKXtpZighei5pc1BsYWluT2JqZWN0KHQpKXJldHVybiB0aGlzLmFkZERpY3QodCk7bGV0IHI9W107cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2gobz0+e2xldCBjPVt0aGlzLmFkZERpY3QobyldLGc9dFtvXTtuP2MucHVzaCh0aGlzLmFkZERpY3QoZykpOmMucHVzaChnKSxyLnB1c2goYyl9KSxyfWFkZERpY3QodCl7bGV0e2RpY3RzOm59PXRoaXMscj1uLmluZGV4T2YodCk7cmV0dXJuIHI+LTE/cjpuLnB1c2godCktMX1vbkluamVjdEhvb2sodCl7KHQ9PT1LLk9OX1BBR0VfU0NST0xMfHx0PT09Sy5PTl9SRUFDSF9CT1RUT00pJiYhdGhpcy5zY3JvbGxBY3Rpb24mJih0aGlzLnNjcm9sbEFjdGlvbj1bSy5BQ1RJT05fVFlQRV9QQUdFX1NDUk9MTCx0aGlzLm9wdGlvbnMub25SZWFjaEJvdHRvbURpc3RhbmNlXSx0aGlzLnB1c2godGhpcy5zY3JvbGxBY3Rpb24pKX1vbkNyZWF0ZSh0LG4pe3JldHVybiBJUCh0aGlzLHQubm9kZUlkLG4pLHR9b25JbnNlcnRCZWZvcmUodCxuLHIpe3JldHVybiBOUCh0aGlzLG4sdC5ub2RlSWQsciYmci5ub2RlSWR8fC0xKSxufW9uUmVtb3ZlQ2hpbGQodCl7cmV0dXJuIGtQKHRoaXMsdC5ub2RlSWQpLHR9b25BZGRFdmVudCh0LG4scil7dC5wYXJlbnROb2RlJiZSUCh0aGlzLHQubm9kZUlkLG4scil9b25BZGRXeHNFdmVudCh0LG4scixvKXt0LnBhcmVudE5vZGUmJnhQKHRoaXMsdC5ub2RlSWQsbixyLG8pfW9uUmVtb3ZlRXZlbnQodCxuKXt0LnBhcmVudE5vZGUmJkJQKHRoaXMsdC5ub2RlSWQsbil9b25TZXRBdHRyaWJ1dGUodCxuLHIpe3QucGFyZW50Tm9kZSYmTFAodGhpcyx0Lm5vZGVJZCxuLHIpfW9uUmVtb3ZlQXR0cmlidXRlKHQsbil7dC5wYXJlbnROb2RlJiZEUCh0aGlzLHQubm9kZUlkLG4pfW9uVGV4dENvbnRlbnQodCxuKXt0LnBhcmVudE5vZGUmJnBwKHRoaXMsdC5ub2RlSWQsbil9b25Ob2RlVmFsdWUodCxuKXt0LnBhcmVudE5vZGUmJnBwKHRoaXMsdC5ub2RlSWQsbil9Z2VuSWQoKXtyZXR1cm4gdGhpcy5faWQrK31wdXNoKHQsbil7aWYoIXRoaXMuaXNVbm1vdW50ZWQpe3N3aXRjaCh0WzBdKXtjYXNlIEsuQUNUSU9OX1RZUEVfQ1JFQVRFOnRoaXMuX2NyZWF0ZUFjdGlvbk1hcC5zZXQodFsxXSx0KTticmVhaztjYXNlIEsuQUNUSU9OX1RZUEVfSU5TRVJUOmxldCByPXRoaXMuX2NyZWF0ZUFjdGlvbk1hcC5nZXQodFsxXSk7cj8oclszXT10WzJdLHJbNF09dFszXSxuJiYocls1XT1uKSk6KG4mJih0WzRdPW4pLHRoaXMudXBkYXRlQWN0aW9ucy5wdXNoKHQpKTticmVha310WzBdIT09Sy5BQ1RJT05fVFlQRV9JTlNFUlQmJnRoaXMudXBkYXRlQWN0aW9ucy5wdXNoKHQpLHRoaXMuX3VwZGF0aW5nfHwodGhpcy5fdXBkYXRpbmc9ITAsbW4ucXVldWVQb3N0Rmx1c2hDYih0aGlzLl91cGRhdGUpKX19cmVzdG9yZSgpe3RoaXMuY2xlYXIoKSx0aGlzLnNldHVwKCksdGhpcy5zY3JvbGxBY3Rpb24mJnRoaXMucHVzaCh0aGlzLnNjcm9sbEFjdGlvbik7bGV0IHQ9bj0+e3RoaXMub25DcmVhdGUobixuLm5vZGVOYW1lKSx0aGlzLm9uSW5zZXJ0QmVmb3JlKG4ucGFyZW50Tm9kZSxuLG51bGwpLG4uY2hpbGROb2Rlcy5mb3JFYWNoKHI9Pnt0KHIpfSl9O3RoaXMuY2hpbGROb2Rlcy5mb3JFYWNoKG49PnQobikpLHRoaXMucHVzaCh0aGlzLmNyZWF0ZWRBY3Rpb24pfXNldHVwKCl7dGhpcy5zZW5kKFt0aGlzLmNyZWF0ZUFjdGlvbl0pfXVwZGF0ZSgpe2xldHtkaWN0czp0LHVwZGF0ZUFjdGlvbnM6bixfY3JlYXRlQWN0aW9uTWFwOnJ9PXRoaXM7dGhpcy5fY3JlYXRlZHx8KHRoaXMuX2NyZWF0ZWQ9ITAsbi5wdXNoKHRoaXMuY3JlYXRlZEFjdGlvbikpLG4ubGVuZ3RoJiYodC5sZW5ndGgmJm4udW5zaGlmdChbWE8sdF0pLHRoaXMuc2VuZChuKSksdGhpcy5jbGVhcigpfWNsZWFyKCl7dGhpcy5kaWN0cy5sZW5ndGg9MCx0aGlzLnVwZGF0ZUFjdGlvbnMubGVuZ3RoPTAsdGhpcy5fdXBkYXRpbmc9ITEsdGhpcy5fY3JlYXRlQWN0aW9uTWFwLmNsZWFyKCl9c2VuZCh0KXtvdC5wdWJsaXNoSGFuZGxlcihUZyx0LHRoaXMucGFnZUlkKX1maXJlRXZlbnQodCxuKXtsZXQgcj1ncCh0LHRoaXMpO3ImJnIuZGlzcGF0Y2hFdmVudChuKX19ZnVuY3Rpb24gVFAoZSl7bGV0IHQ9TnIoZSk7cmV0dXJuIHQ/dC5fX3BhZ2VfY29udGFpbmVyX186bnVsbH1mdW5jdGlvbiBsZihlLHQsbil7aWYodHlwZW9mIG49PSJudW1iZXIiJiYobj1UUChuKSksbltlXT09PXQpcmV0dXJuIG47bGV0e2NoaWxkTm9kZXM6cn09bjtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7bGV0IGM9bGYoZSx0LHJbb10pO2lmKGMpcmV0dXJuIGN9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZ3AoZSx0KXtyZXR1cm4gbGYoIm5vZGVJZCIsZSx0KX1mdW5jdGlvbiBQUChlLHQpe3JldHVybiBsZigibm9kZU5hbWUiLGUudG9VcHBlckNhc2UoKSx0KX1mdW5jdGlvbiBJUChlLHQsbil7ZS5wdXNoKFtLLkFDVElPTl9UWVBFX0NSRUFURSx0LGUuYWRkRGljdChuKSwtMSwtMV0pfWZ1bmN0aW9uIE5QKGUsdCxuLHIpe2xldCBvPXQudG9KU09OKHthdHRyOiEwLG5vcm1hbGl6ZTplLm5vcm1hbGl6ZURpY3R9KTtlLnB1c2goW0suQUNUSU9OX1RZUEVfSU5TRVJULHQubm9kZUlkLG4scl0sT2JqZWN0LmtleXMobykubGVuZ3RoP286dm9pZCAwKX1mdW5jdGlvbiBrUChlLHQpe2UucHVzaChbSy5BQ1RJT05fVFlQRV9SRU1PVkUsdF0pfWZ1bmN0aW9uIFJQKGUsdCxuLHIpe2UucHVzaChbSy5BQ1RJT05fVFlQRV9BRERfRVZFTlQsdCxlLmFkZERpY3Qobikscl0pfWZ1bmN0aW9uIHhQKGUsdCxuLHIsbyl7ZS5wdXNoKFtLLkFDVElPTl9UWVBFX0FERF9XWFNfRVZFTlQsdCxlLmFkZERpY3QobiksZS5hZGREaWN0KHIpLG9dKX1mdW5jdGlvbiBCUChlLHQsbil7ZS5wdXNoKFtLLkFDVElPTl9UWVBFX1JFTU9WRV9FVkVOVCx0LGUuYWRkRGljdChuKV0pfWZ1bmN0aW9uIE1QKGUsdCxuKXtyZXR1cm4gdD09PSJzdHlsZSImJnouaXNQbGFpbk9iamVjdChuKT9lLm5vcm1hbGl6ZURpY3Qobik6ZS5hZGREaWN0KG4pfWZ1bmN0aW9uIExQKGUsdCxuLHIpe2UucHVzaChbSy5BQ1RJT05fVFlQRV9TRVRfQVRUUklCVVRFLHQsZS5hZGREaWN0KG4pLE1QKGUsbixyKV0pfWZ1bmN0aW9uIERQKGUsdCxuKXtlLnB1c2goW0suQUNUSU9OX1RZUEVfUkVNT1ZFX0FUVFJJQlVURSx0LGUuYWRkRGljdChuKV0pfWZ1bmN0aW9uIHBwKGUsdCxuKXtlLnB1c2goW0suQUNUSU9OX1RZUEVfU0VUX1RFWFQsdCxlLmFkZERpY3QobildKX1mdW5jdGlvbiBGUChlLHQsbil7cmV0dXJuIG5ldyBPUChlLHQsbil9ZnVuY3Rpb24gdnAoZSl7bGV0IHQ9ZS5zZXR1cDtyZXR1cm4gZS5pbmhlcml0QXR0cnM9ITEsZS5zZXR1cD0obixyKT0+e2xldHthdHRyczp7X19wYWdlSWQ6byxfX3BhZ2VQYXRoOmMsX19wYWdlUXVlcnk6ZyxfX3BhZ2VJbnN0YW5jZTpifX09cixUPW1uLmdldEN1cnJlbnRJbnN0YW5jZSgpLnByb3h5O2lmKHB0KFQsYiksV24obXAobyxULGIpKSxtbi5vbk1vdW50ZWQoKCk9Pnttbi5uZXh0VGljaygoKT0+e2puKFQsSy5PTl9SRUFEWSl9KX0pLG1uLm9uQmVmb3JlVW5tb3VudCgoKT0+e2puKFQsSy5PTl9VTkxPQUQpfSksdClyZXR1cm4gdChnLHIpfSxlfWZ1bmN0aW9uIG1wKGUsdCxuKXt7bGV0IHI9KCk9PnMud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChlKyIiKTt0LiRnZXRBcHBXZWJ2aWV3PXIsdC4kLmN0eC4kc2NvcGU9eyRnZXRBcHBXZWJ2aWV3OnJ9fXJldHVybiB0LmdldE9wZW5lckV2ZW50Q2hhbm5lbD0oKT0+KG4uZXZlbnRDaGFubmVsfHwobi5ldmVudENoYW5uZWw9bmV3IEsuRXZlbnRDaGFubmVsKGUpKSxuLmV2ZW50Q2hhbm5lbCksdH1mdW5jdGlvbiBWUChlKXtyZXR1cm4gei5pc0Z1bmN0aW9uKGUpfWxldCBfcD1uZXcgTWFwO2Z1bmN0aW9uIFVQKGUsdCl7X3Auc2V0KGUsSy5vbmNlKEhQKHQpKSl9ZnVuY3Rpb24gJFAoZSx0LG4scixvKXtsZXQgYz1GUChlLG8sITApLGc9UWkoKSxiPV9wLmdldCh0KSgpLFY9VD0+Zy5tb3VudFBhZ2UoVCx7X19wYWdlSWQ6ZSxfX3BhZ2VQYXRoOnQsX19wYWdlUXVlcnk6bixfX3BhZ2VJbnN0YW5jZTpyfSxjKTtyZXR1cm4gei5pc1Byb21pc2UoYik/Yi50aGVuKFQ9PlYoVCkpOlYoYil9ZnVuY3Rpb24gSFAoZSl7cmV0dXJuKCk9PlZQKGUpP2UoKS50aGVuKHQ9PnZwKHQpKTp2cChlKX1sZXQgYnA9ITE7ZnVuY3Rpb24gRXAoKXtpZihicClyZXR1cm47YnA9ITA7bGV0IGUsdDtpZihmLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRSZWRpcmVjdEluZm8pe2xldHtwYXRoOmMscXVlcnk6ZyxyZWZlcnJlckluZm86Yn09QnMoKTtjJiYoZT1jLHQ9ZyksUi5yZWZlcnJlckluZm89Yn1lbHNle2xldCBjPXMucnVudGltZS5hcmd1bWVudHM7aWYoIWMpcmV0dXJuO3RyeXtsZXQgZz1KU09OLnBhcnNlKGMpO2U9Zy5wYXRofHxnLnBhdGhOYW1lLHQ9Zy5xdWVyeT8iPyIrZy5xdWVyeToiIn1jYXRjaChnKXt9fWlmKCFlfHxlPT09Ui5lbnRyeVBhZ2VQYXRoKXt0JiYoUi5lbnRyeVBhZ2VRdWVyeT10KTtyZXR1cm59bGV0IHI9Sy5hZGRMZWFkaW5nU2xhc2goZSksbz1LaShyKTshb3x8KG8ubWV0YS5pc1RhYkJhcnx8KFIucmVhbEVudHJ5UGFnZVBhdGg9Ui5yZWFsRW50cnlQYWdlUGF0aHx8Ui5lbnRyeVBhZ2VQYXRoKSxSLmVudHJ5UGFnZVBhdGg9ZSxSLmVudHJ5UGFnZVF1ZXJ5PXQpfWZ1bmN0aW9uIEpjKGUsdCl7bGV0IG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShLaShlKSkpO3JldHVybiBuLm1ldGE9RmEobi5tZXRhKSx0IT09InByZWxvYWRQYWdlIiYmIVIucmVhbEVudHJ5UGFnZVBhdGgmJih0PT09InJlTGF1bmNoInx8Um4oKS5sZW5ndGg9PT0wKT9uLm1ldGEuaXNRdWl0PSEwOm4ubWV0YS5pc1RhYkJhcnx8KG4ubWV0YS5pc1F1aXQ9ITEpLG59bGV0IENhPXt9O2Z1bmN0aW9uIGpQKGUpe2xldCB0PU9iamVjdC5rZXlzKENhKS5maW5kKG49PkNhW25dLmlkPT09ZS5pZCk7dCYmZGVsZXRlIENhW3RdfWZ1bmN0aW9uIHpQKHt1cmw6ZX0pe2xldCB0PUNhW2VdO3JldHVybiB0JiYodC5fX3BhZ2VfXyYmUm4oKS5maW5kKG49Pm49PT10Ll9fcGFnZV9fKT90Ll9fcHJlbG9hZF9fPSExOnQuY2xvc2UoIm5vbmUiKSxkZWxldGUgQ2FbZV0pLHR9ZnVuY3Rpb24gV1Aoe3VybDplLHBhdGg6dCxxdWVyeTpufSl7aWYoIUNhW2VdKXtsZXQgcj1KYyh0LCJwcmVsb2FkUGFnZSIpO0NhW2VdPWNwKHtwYXRoOnQscm91dGVPcHRpb25zOnIscXVlcnk6bix3ZWJ2aWV3RXh0cmFzOntfX3ByZWxvYWRfXzohMH19KX1yZXR1cm4gQ2FbZV19ZnVuY3Rpb24gZmMoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOnIsd2VidmlldzpvLG52dWVQYWdlVm06YyxldmVudENoYW5uZWw6Z30pe2lmKG8mJkVwKCksQ2FbZV0pe289Q2FbZV07bGV0IHllPW87aWYoeWUuX19wYWdlX18paWYoUm4oKS5maW5kKE9lPT5PZT09PXllLl9fcGFnZV9fKSlvPXZvaWQgMDtlbHNlIHJldHVybiBnJiYoeWUuX19wYWdlX18uJHBhZ2UuZXZlbnRDaGFubmVsPWcpLHI9PT0ibGF1bmNoIj9HUChlLHQsbix5ZSxjLGcpOlduKHllLl9fcGFnZV9fKSx5ZX1sZXQgYj1KYyh0LHIpO28/KG89cy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG8uaWQpLG8ubnZ1ZT1iLm1ldGEuaXNOVnVlKTpvPWNwKHtwYXRoOnQscm91dGVPcHRpb25zOmIscXVlcnk6bn0pLGIubWV0YS5pZD1wYXJzZUludChvLmlkKSwhIWIubWV0YS5pc1RhYkJhciYmX2kuYXBwZW5kKG8pLHlQKG8sdCxuLGIubWV0YSk7bGV0IFQ9dC5zbGljZSgxKTtvLl9fdW5pYXBwX3JvdXRlPVQ7bGV0IEQ9Z2EocixlLG4sYi5tZXRhLGcsUi5kYXJrbW9kZT9zLm5hdmlnYXRvci5nZXRVSVN0eWxlKCk6ImxpZ2h0IiksdmU9cGFyc2VJbnQoby5pZCk7cmV0dXJuIG8ubnZ1ZT9jP3FQKHZlLGMsRCk6eXAodmUsbyxEKTokUCh2ZSxULG4sRCxZUChiKSksb31mdW5jdGlvbiBHUChlLHQsbixyLG8sYyl7bGV0IGc9SmModCwicHJlbG9hZFBhZ2UiKTtnLm1ldGEuaWQ9cGFyc2VJbnQoci5pZCk7bGV0IGI9Z2EoInByZWxvYWRQYWdlIixlLG4sZy5tZXRhLGMsUi5kYXJrbW9kZT9zLm5hdmlnYXRvci5nZXRVSVN0eWxlKCk6ImxpZ2h0Iik7cHQobyxiKSxyLl9fcGFnZV9fPW99ZnVuY3Rpb24gWVAoe21ldGE6ZX0pe2xldCB0PUd1KCkse3BsYXRmb3JtOm4scGl4ZWxSYXRpbzpyLHdpbmRvd1dpZHRoOm99PURyKCk7cmV0dXJue2NzczohMCxyb3V0ZTplLnJvdXRlLHZlcnNpb246MSxsb2NhbGU6IiIscGxhdGZvcm06bixwaXhlbFJhdGlvOnIsd2luZG93V2lkdGg6byxkaXNhYmxlU2Nyb2xsOmUuZGlzYWJsZVNjcm9sbD09PSEwLG9uUGFnZVNjcm9sbDohMSxvblBhZ2VSZWFjaEJvdHRvbTohMSxvblJlYWNoQm90dG9tRGlzdGFuY2U6ei5oYXNPd24oZSwib25SZWFjaEJvdHRvbURpc3RhbmNlIik/ZS5vblJlYWNoQm90dG9tRGlzdGFuY2U6Sy5PTl9SRUFDSF9CT1RUT01fRElTVEFOQ0Usc3RhdHVzYmFySGVpZ2h0OnQsd2luZG93VG9wOmUubmF2aWdhdGlvbkJhci50eXBlPT09ImZsb2F0Ij90K0suTkFWQkFSX0hFSUdIVDowLHdpbmRvd0JvdHRvbTpfaS5pbmRleE9mKGUucm91dGUpPj0wJiZfaS5jb3Zlcj9faS5oZWlnaHQ6MH19ZnVuY3Rpb24gcVAoZSx0LG4pe3B0KHQsbiksV24obXAoZSx0LG4pKSxlPT09MSYmKFIuc3BsYXNoc2NyZWVuJiZSLnNwbGFzaHNjcmVlbi5hdXRvY2xvc2UmJiFSLnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZzLm5hdmlnYXRvci5jbG9zZVNwbGFzaHNjcmVlbigpLFIub25SZWFkeShmdW5jdGlvbigpe2hwKCl9KSl9ZnVuY3Rpb24geXAoZSx0LG4pe2xldCByPXskOnt9LCRnZXRBcHBXZWJ2aWV3KCl7cmV0dXJuIHR9LGdldE9wZW5lckV2ZW50Q2hhbm5lbCgpe3JldHVybiBuLmV2ZW50Q2hhbm5lbHx8KG4uZXZlbnRDaGFubmVsPW5ldyBLLkV2ZW50Q2hhbm5lbChlKSksbi5ldmVudENoYW5uZWx9LF9fc2V0dXAobyxjKXtvLiRnZXRBcHBXZWJ2aWV3PSgpPT50LG8uZ2V0T3BlbmVyRXZlbnRDaGFubmVsPWMuZ2V0T3BlbmVyRXZlbnRDaGFubmVsLHB0KG8sbiksdC5fX3ByZWxvYWRfXyYmKHQuX19wYWdlX189byk7bGV0IGc9R24oKSxiPWcuZmluZEluZGV4KFY9PlY9PT1jKTtiPi0xJiZnLnNwbGljZShiLDEsbyl9fTtwdChyLG4pLHQuX19wcmVsb2FkX18/KHQuX19wYWdlX189cix0LmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLCgpPT57am4odC5fX3BhZ2VfXyxLLk9OX1NIT1cpfSksdC5hZGRFdmVudExpc3RlbmVyKCJoaWRlIiwoKT0+e2puKHQuX19wYWdlX18sSy5PTl9ISURFKX0pKTpXbihyKX1sZXQgU3A9KGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3VybDpyLGV2ZW50czpvLGFuaW1hdGlvblR5cGU6YyxhbmltYXRpb25EdXJhdGlvbjpnfT1lLHtwYXRoOmIscXVlcnk6Vn09Sy5wYXJzZVVybChyKSxbVCxEXT1aUChiLGMsZyk7V2MoYiwoKT0+e0tQKHt1cmw6cixwYXRoOmIscXVlcnk6VixldmVudHM6byxhbmlUeXBlOlQsYW5pRHVyYXRpb246RH0pLnRoZW4odCkuY2F0Y2gobil9LGUub3BlblR5cGU9PT0iYXBwTGF1bmNoIil9LEpQPUVlKEZ1LFNwLEZ5LFd5KTtmdW5jdGlvbiBLUCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sZXZlbnRzOnIsYW5pVHlwZTpvLGFuaUR1cmF0aW9uOmN9KXtqbihLLk9OX0hJREUpO2xldCBnPW5ldyBLLkV2ZW50Q2hhbm5lbCh0cCgpKzEscik7cmV0dXJuIG5ldyBQcm9taXNlKGI9PntZYyhmYyh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6Im5hdmlnYXRlVG8iLGV2ZW50Q2hhbm5lbDpnfSksbyxjLCgpPT57Yih7ZXZlbnRDaGFubmVsOmd9KX0pLEJhKCl9KX1mdW5jdGlvbiBaUChlLHQsbil7bGV0e2dsb2JhbFN0eWxlOnJ9PVIsbz1vcyhlKTtyZXR1cm5bdHx8by5hbmltYXRpb25UeXBlfHxyLmFuaW1hdGlvblR5cGV8fEdULG58fG8uYW5pbWF0aW9uRHVyYXRpb258fHIuYW5pbWF0aW9uRHVyYXRpb258fHpjXX1sZXQgWFA9RWUoVnUsKHt1cmw6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3BhdGg6cixxdWVyeTpvfT1LLnBhcnNlVXJsKGUpO1djKHIsKCk9PntRUCh7dXJsOmUscGF0aDpyLHF1ZXJ5Om99KS50aGVuKHQpLmNhdGNoKG4pfSl9LFV5LEd5KTtmdW5jdGlvbiBRUCh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtsZXQgcj1BaSgpO3JldHVybiByJiZ0YShyKSxuZXcgUHJvbWlzZShvPT57WWMoZmMoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJyZWRpcmVjdFRvIn0pLCJub25lIiwwLCgpPT57aWYocil7bGV0IGM9ci4kZ2V0QXBwV2VidmlldygpO2MuX19wcmVsb2FkX18mJmpQKGMpLGMuY2xvc2UoIm5vbmUiKX1vKHZvaWQgMCl9KSxCYSgpfSl9bGV0IGVJPSh7dXJsOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtwYXRoOnIscXVlcnk6b309Sy5wYXJzZVVybChlKTtXYyhyLCgpPT57dEkoe3VybDplLHBhdGg6cixxdWVyeTpvfSkudGhlbih0KS5jYXRjaChuKX0pfTtmdW5jdGlvbiB0SSh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2xldCBvPUduKCkuc2xpY2UoMCk7RGUuZmluZChnPT5nLnBhdGg9PT10KS5tZXRhLmlzVGFiQmFyJiZfaS5zd2l0Y2hUYWIodC5zbGljZSgxKSksWWMoZmMoe3VybDplLHBhdGg6dCxxdWVyeTpuLG9wZW5UeXBlOiJyZUxhdW5jaCJ9KSwibm9uZSIsMCwoKT0+e28uZm9yRWFjaChnPT5kcChnLCJub25lIikpLHIodm9pZCAwKX0pLEJhKCl9KX1sZXQgbkk9RWUoTmgsZUksJHksWXkpLHdwPShlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHt1cmw6cn09ZSx7cGF0aDpvLHF1ZXJ5OmN9PUsucGFyc2VVcmwocik7V2MobywoKT0+e2lJKHt1cmw6cixwYXRoOm8scXVlcnk6Y30pLnRoZW4odCkuY2F0Y2gobil9LGUub3BlblR5cGU9PT0iYXBwTGF1bmNoIil9LHJJPUVlKFBjLHdwLEh5LHF5KTtmdW5jdGlvbiBpSSh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtfaS5zd2l0Y2hUYWIodC5zbGljZSgxKSk7bGV0IHI9Um4oKSxvPXIubGVuZ3RoLGM9ITEsZz0hMSxiO28+PTEmJihiPXJbby0xXSxiJiYhYi4kLl9faXNUYWJCYXI/KGc9ITAsci5yZXZlcnNlKCkuZm9yRWFjaChUPT57IVQuJC5fX2lzVGFiQmFyJiZUIT09YiYmZHAoVCwibm9uZSIpfSksdGEoYiksTigoKT0+e2IuJHBhZ2Uub3BlblR5cGU9PT0icmVkaXJlY3RUbyI/bmwoYi4kZ2V0QXBwV2VidmlldygpLFhnLHpjKTpubChiLiRnZXRBcHBXZWJ2aWV3KCksImF1dG8iKX0sMTAwKSk6Yz0hMCk7bGV0IFY7cmV0dXJuIEduKCkuZm9yRWFjaChUPT57Sy5hZGRMZWFkaW5nU2xhc2goVC5yb3V0ZSk9PT10PyhULiQuX19pc0FjdGl2ZXx8KGc9ITApLFQuJC5fX2lzQWN0aXZlPSEwLFY9VCk6VC4kLl9faXNUYWJCYXImJihULiQuX19pc0FjdGl2ZT0hMSl9KSxiPT09ViYmKGM9ITEpLGImJmMmJmpuKGIsSy5PTl9ISURFKSxuZXcgUHJvbWlzZShUPT57aWYoVil7bGV0IEQ9Vi4kZ2V0QXBwV2VidmlldygpO0Quc2hvdygibm9uZSIpLGcmJiFELl9fcHJlbG9hZF9fJiZqbihWLEsuT05fU0hPVyksQmEoKSxUKHZvaWQgMCl9ZWxzZSBZYyhmYyh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6InN3aXRjaFRhYiJ9KSwibm9uZSIsMCwoKT0+e0JhKCksVCh2b2lkIDApfSw3MCl9KX1sZXQgb0k9THQoa2gsKHt1cmw6ZX0pPT57bGV0IHQ9elAoe3VybDplfSk7cmV0dXJuIHQ/e2lkOnQuaWQsdXJsOmUsZXJyTXNnOiJ1blByZWxvYWRQYWdlOm9rIn06e3VybDplLGVyck1zZzoidW5QcmVsb2FkUGFnZTpmYWlsIG5vdCBmb3VuZCJ9fSx6eSksYUk9RWUoVXUsKHt1cmw6ZX0se3Jlc29sdmU6dH0pPT57aWYoQ2FbZV0pcmV0dXJuO2xldCBuPWUuc3BsaXQoIj8iKSxyPW5bMF0sbz1LLnBhcnNlUXVlcnkoblsxXXx8IiIpLGM9V1Aoe3VybDplLHBhdGg6cixxdWVyeTpvfSksZz1KYyhyLCJwcmVsb2FkUGFnZSIpO2cubWV0YS5pZD1wYXJzZUludChjLmlkKTtsZXQgYj1nYSgicHJlbG9hZFBhZ2UiLGUsbyxnLm1ldGEsdm9pZCAwLFIuZGFya21vZGU/cy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpOiJsaWdodCIpO3lwKHBhcnNlSW50KGMuaWQpLGMsYiksdCh7aWQ6Yy5pZCx1cmw6ZSxlcnJNc2c6InByZWxvYWRQYWdlOm9rIn0pfSxqeSk7dmFyIHNJPXtfX3Byb3RvX186bnVsbCwkZW1pdDpfXywkb2ZmOm1fLCRvbjpwXywkb25jZTp2XyxfX2xvZ19fOndULGFkZEludGVyY2VwdG9yOm9fLGFkZFBob25lQ29udGFjdDpZQyxhcnJheUJ1ZmZlclRvQmFzZTY0OkxyLGJhc2U2NFRvQXJyYXlCdWZmZXI6enIsY2FuSVVzZTpRdyxjYW52YXNHZXRJbWFnZURhdGE6R18sY2FudmFzUHV0SW1hZ2VEYXRhOllfLGNhbnZhc1RvVGVtcEZpbGVQYXRoOnFfLGNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6UUMsY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOlhDLGNob29zZUltYWdlOnlBLGNob29zZUxvY2F0aW9uOmJPLGNob29zZVZpZGVvOlNBLGNsZWFyU3RvcmFnZTpVdyxjbGVhclN0b3JhZ2VTeW5jOlZ3LGNsb3NlQXV0aFZpZXc6QmcsY2xvc2VCTEVDb25uZWN0aW9uOmtDLGNsb3NlQmx1ZXRvb3RoQWRhcHRlcjpDQyxjbG9zZVByZXZpZXdJbWFnZTpkQSxjbG9zZVNvY2tldDpWQSxjb21wcmVzc0ltYWdlOl9BLGNvbXByZXNzVmlkZW86YkEsY29uZmlnTVRMUzp4QSxjb25uZWN0U29ja2V0OkRBLGNyZWF0ZUFuaW1hdGlvbjpoYixjcmVhdGVCTEVDb25uZWN0aW9uOk5DLGNyZWF0ZUNhbnZhc0NvbnRleHQ6V18sY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQ6VVQsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6dE8sY3JlYXRlSW50ZXJhY3RpdmVBZDpXVCxjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcjpRXyxjcmVhdGVJbnRlcnN0aXRpYWxBZDpIVCxjcmVhdGVMaXZlUHVzaGVyQ29udGV4dDpwTyxjcmVhdGVNYXBDb250ZXh0Ok5fLGNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcjp0YixjcmVhdGVQdXNoTWVzc2FnZTpkVCxjcmVhdGVSZXdhcmRlZFZpZGVvQWQ6RlQsY3JlYXRlU2VsZWN0b3JRdWVyeTpzYixjcmVhdGVWaWRlb0NvbnRleHQ6UF8sZG93bmxvYWRGaWxlOlBBLGdldEFwcEF1dGhvcml6ZVNldHRpbmc6ZGcsZ2V0QXBwQmFzZUluZm86WmgsZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOnhDLGdldEJMRURldmljZVJTU0k6RkMsZ2V0QkxFRGV2aWNlU2VydmljZXM6UkMsZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlcjpkTyxnZXRCZWFjb25zOiRDLGdldEJsdWV0b290aEFkYXB0ZXJTdGF0ZTpBQyxnZXRCbHVldG9vdGhEZXZpY2VzOlBDLGdldENoYW5uZWxNYW5hZ2VyOmhULGdldENoZWNrQm94U3RhdGU6TWcsZ2V0Q2xpcGJvYXJkRGF0YTpxQyxnZXRDb25uZWN0ZWRCbHVldG9vdGhEZXZpY2VzOklDLGdldERldmljZUluZm86S2gsZ2V0RW50ZXJPcHRpb25zU3luYzpNYixnZXRGaWxlSW5mbzpIdyxnZXRJbWFnZUluZm86Y0EsZ2V0TGF1bmNoT3B0aW9uc1N5bmM6TGIsZ2V0TG9jYWxlOktsLGdldExvY2F0aW9uOl9PLGdldE5ldHdvcmtUeXBlOmFnLGdldFByb3ZpZGVyOmFULGdldFB1c2hDbGllbnRJZDpEYixnZXRSZWNvcmRlck1hbmFnZXI6cEEsZ2V0U2F2ZWRGaWxlSW5mbzpLdyxnZXRTYXZlZEZpbGVMaXN0Okp3LGdldFNjcmVlbkJyaWdodG5lc3M6aUEsZ2V0U2VsZWN0ZWRUZXh0UmFuZ2U6d2IsZ2V0U3RvcmFnZTpMdyxnZXRTdG9yYWdlSW5mbzokdyxnZXRTdG9yYWdlSW5mb1N5bmM6RmgsZ2V0U3RvcmFnZVN5bmM6TXcsZ2V0U3ViTlZ1ZUJ5SWQ6blQsZ2V0U3lzdGVtSW5mbzpkQyxnZXRTeXN0ZW1JbmZvU3luYzpYaCxnZXRTeXN0ZW1TZXR0aW5nOnNBLGdldFVuaXZlcmlmeU1hbmFnZXI6ZlQsZ2V0VXNlckluZm86c1QsZ2V0VXNlclByb2ZpbGU6bFQsZ2V0VmlkZW9JbmZvOnVBLGdldFdpbmRvd0luZm86SmgsaGlkZUtleWJvYXJkOkNBLGhpZGVMb2FkaW5nOnhPLGhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzpVTyxoaWRlVGFiQmFyOkdPLGhpZGVUYWJCYXJSZWREb3Q6S08saGlkZVRvYXN0OlJPLGluaXRVVFNDbGFzc05hbWU6cWcsaW5pdFVUU0luZGV4Q2xhc3NOYW1lOnhULGluaXRVVFNQYWNrYWdlTmFtZTpSVCxpbml0VVRTUHJveHlDbGFzczpHZyxpbml0VVRTUHJveHlGdW5jdGlvbjpJVCxpbnRlcmNlcHRvcnM6c18saW52b2tlUHVzaENhbGxiYWNrOkx1LGxvYWRGb250RmFjZTpMTyxsb2dpbjpOZyxtYWtlUGhvbmVDYWxsOnpDLG5hdmlnYXRlQmFjazp3UCxuYXZpZ2F0ZVRvOkpQLG5hdmlnYXRlVG9NaW5pUHJvZ3JhbTpFVCxub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOkJDLG9mZkFjY2VsZXJvbWV0ZXJDaGFuZ2U6X0Msb2ZmQXBwSGlkZTpCYixvZmZBcHBTaG93OlJiLG9mZkNvbXBhc3NDaGFuZ2U6Z0Msb2ZmRXJyb3I6TmIsb2ZmS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6T0Esb2ZmTG9jYXRpb25DaGFuZ2U6Q08sb2ZmTG9jYXRpb25DaGFuZ2VFcnJvcjpPTyxvZmZOZXR3b3JrU3RhdHVzQ2hhbmdlOlpDLG9mZlBhZ2VOb3RGb3VuZDpQYixvZmZQdXNoTWVzc2FnZTpWYixvZmZUaGVtZUNoYW5nZTpyQSxvZmZVbmhhbmRsZWRSZWplY3Rpb246T2Isb2ZmV2luZG93UmVzaXplOl9iLG9uQWNjZWxlcm9tZXRlckNoYW5nZTptQyxvbkFwcEhpZGU6eGIsb25BcHBTaG93OmtiLG9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpTQyxvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZTp5QyxvbkJlYWNvblNlcnZpY2VDaGFuZ2U6VUMsb25CZWFjb25VcGRhdGU6VkMsb25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2U6RUMsb25CbHVldG9vdGhEZXZpY2VGb3VuZDpiQyxvbkNvbXBhc3NDaGFuZ2U6aEMsb25DcmVhdGVWdWVBcHA6Sy5vbkNyZWF0ZVZ1ZUFwcCxvbkVycm9yOkliLG9uSG9zdEV2ZW50UmVjZWl2ZTpVZyxvbktleWJvYXJkSGVpZ2h0Q2hhbmdlOkFBLG9uTG9jYWxlQ2hhbmdlOkViLG9uTG9jYXRpb25DaGFuZ2U6d08sb25Mb2NhdGlvbkNoYW5nZUVycm9yOkFPLG9uTmF0aXZlRXZlbnRSZWNlaXZlOnlULG9uTmV0d29ya1N0YXR1c0NoYW5nZTpLQyxvblBhZ2VOb3RGb3VuZDpUYixvblB1c2hNZXNzYWdlOkZiLG9uU29ja2V0Q2xvc2U6akEsb25Tb2NrZXRFcnJvcjokQSxvblNvY2tldE1lc3NhZ2U6SEEsb25Tb2NrZXRPcGVuOlVBLG9uVGFiQmFyTWlkQnV0dG9uVGFwOmdiLG9uVGhlbWVDaGFuZ2U6bkEsb25VbmhhbmRsZWRSZWplY3Rpb246QWIsb25XaW5kb3dSZXNpemU6bWIsb3BlbkFwcEF1dGhvcml6ZVNldHRpbmc6bEEsb3BlbkJsdWV0b290aEFkYXB0ZXI6d0Msb3BlbkRvY3VtZW50Olh3LG9wZW5Mb2NhdGlvbjpFTyxwYWdlU2Nyb2xsVG86RE8scHJlTG9naW46UmcscHJlbG9hZFBhZ2U6YUkscHJldmlld0ltYWdlOmZBLHJlTGF1bmNoOm5JLHJlYWRCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlOk1DLHJlZGlyZWN0VG86WFAscmVnaXN0ZXJSdW50aW1lOmdULHJlZ2lzdGVyVVRTSW50ZXJmYWNlOkJULHJlZ2lzdGVyVVRTUGx1Z2luOk1ULHJlbW92ZUludGVyY2VwdG9yOmFfLHJlbW92ZVNhdmVkRmlsZTpadyxyZW1vdmVTdG9yYWdlOkZ3LHJlbW92ZVN0b3JhZ2VTeW5jOkR3LHJlbW92ZVRhYkJhckJhZGdlOkpPLHJlcXVlc3Q6UkEscmVxdWVzdFBheW1lbnQ6YlQscmVxdWlyZUdsb2JhbDppVCxyZXF1aXJlTmF0aXZlUGx1Z2luOllvLHJlcXVpcmVVVFNQbHVnaW46TFQscmVzdG9yZUdsb2JhbDpyVCxzYXZlRmlsZTpHdyxzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtOm1BLHNhdmVWaWRlb1RvUGhvdG9zQWxidW06dkEsc2NhbkNvZGU6dEEsc2VuZEhvc3RFdmVudDpGZyxzZW5kTmF0aXZlRXZlbnQ6cmcsc2VuZFNvY2tldE1lc3NhZ2U6RkEsc2V0QkxFTVRVOkRDLHNldENsaXBib2FyZERhdGE6SkMsc2V0S2VlcFNjcmVlbk9uOmFBLHNldExvY2FsZTp5YixzZXROYXZpZ2F0aW9uQmFyQ29sb3I6SE8sc2V0TmF2aWdhdGlvbkJhclRpdGxlOkZPLHNldFBhZ2VNZXRhOlNiLHNldFNjcmVlbkJyaWdodG5lc3M6b0Esc2V0U3RvcmFnZTpCdyxzZXRTdG9yYWdlU3luYzp4dyxzZXRUYWJCYXJCYWRnZTpqTyxzZXRUYWJCYXJJdGVtOnpPLHNldFRhYkJhclN0eWxlOldPLHNoYXJlOm1ULHNoYXJlV2l0aFN5c3RlbTpfVCxzaG93QWN0aW9uU2hlZXQ6SU8sc2hvd0tleWJvYXJkOndBLHNob3dMb2FkaW5nOk5PLHNob3dNb2RhbDpUTyxzaG93TmF2aWdhdGlvbkJhckxvYWRpbmc6Vk8sc2hvd1RhYkJhcjpZTyxzaG93VGFiQmFyUmVkRG90OnFPLHNob3dUb2FzdDprTyxzdGFydEFjY2VsZXJvbWV0ZXI6dGcsc3RhcnRCZWFjb25EaXNjb3Zlcnk6SEMsc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Ok9DLHN0YXJ0Q29tcGFzczpRaCxzdGFydExvY2F0aW9uVXBkYXRlOnlPLHN0YXJ0UHVsbERvd25SZWZyZXNoOkJPLHN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjplQSxzdG9wQWNjZWxlcm9tZXRlcjpuZyxzdG9wQmVhY29uRGlzY292ZXJ5OmpDLHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5OlRDLHN0b3BDb21wYXNzOmVnLHN0b3BMb2NhdGlvblVwZGF0ZTpTTyxzdG9wUHVsbERvd25SZWZyZXNoOk1PLHN3aXRjaFRhYjpySSxzeW5jRGF0YVRvR2xvYmFsOm9ULHVuUHJlbG9hZFBhZ2U6b0ksdXBsb2FkRmlsZTpXQSx1cHgycHg6UW0sdmlicmF0ZUxvbmc6dkMsdmlicmF0ZVNob3J0OnBDLHdlZXhHZXRTeXN0ZW1JbmZvU3luYzppYyx3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWU6TEN9O2xldCBsST16LmV4dGVuZChVLHtwdWJsaXNoSGFuZGxlcjpjSX0pO2Z1bmN0aW9uIGNJKGUsdCxuKXt0PUpTT04uc3RyaW5naWZ5KHQpLHouaXNBcnJheShuKXx8KG49W25dKTtsZXQgcj1gdHlwZW9mIFVuaVZpZXdKU0JyaWRnZSAhPT0gJ3VuZGVmaW5lZCcgJiYgVW5pVmlld0pTQnJpZGdlLnN1YnNjcmliZUhhbmRsZXIoIiR7ZX0iLCR7dH0sX19QQUdFX0lEX18pYDtuLmZvckVhY2gobz0+e2xldCBjPVN0cmluZyhvKSxnPXMud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChjKTtnJiZnLmV2YWxKUyhyLnJlcGxhY2UoIl9fUEFHRV9JRF9fIixjKSl9KX1mdW5jdGlvbiB1SSgpe2xldHt0YWJCYXI6ZX09UjtpZighKGUmJmUubGlzdCYmZS5saXN0Lmxlbmd0aCkpcmV0dXJuO2xldHtlbnRyeVBhZ2VQYXRoOm59PVI7ZS5zZWxlY3RlZEluZGV4PTA7bGV0IHI9ZS5saXN0LmZpbmRJbmRleChvPT5vLnBhZ2VQYXRoPT09bik7X2kuaW5pdChlLChvLGMpPT57UC5zd2l0Y2hUYWIoe3VybDpLLmFkZExlYWRpbmdTbGFzaChvLnBhZ2VQYXRoKSxvcGVuVHlwZToic3dpdGNoVGFiIixmcm9tOiJ0YWJCYXIiLHN1Y2Nlc3MoKXtqbihLLk9OX1RBQl9JVEVNX1RBUCx7aW5kZXg6Yyx0ZXh0Om8udGV4dCxwYWdlUGF0aDpvLnBhZ2VQYXRofSl9fSl9KSxyIT09LTEmJihlLnNlbGVjdGVkSW5kZXg9cixyIT09MCYmX2kuc3dpdGNoVGFiKG4pKX1mdW5jdGlvbiBmSSgpe2xldCBlPXMuZ2xvYmFsRXZlbnQsdD1mLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50Iikse2VtaXQ6bixwdWJsaXNoSGFuZGxlcjpyfT1vdDtmLmNvbmZpZy5wcmVsb2FkP3Mua2V5LmFkZEV2ZW50TGlzdGVuZXIoTG8sVWkpOmUuYWRkRXZlbnRMaXN0ZW5lcigic3BsYXNoY2xvc2VkIiwoKT0+e3Mua2V5LmFkZEV2ZW50TGlzdGVuZXIoTG8sVWkpfSksZS5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsKCk9PntuKEsuT05fQVBQX0VOVEVSX0JBQ0tHUk9VTkQpfSksZS5hZGRFdmVudExpc3RlbmVyKCJyZXN1bWUiLCgpPT57bGV0IGM9QnMoKTtjJiZjLnVzZXJBY3Rpb24mJnhzKGMpLG4oSy5PTl9BUFBfRU5URVJfRk9SRUdST1VORCxEbygpKX0pLHQuYWRkRXZlbnRMaXN0ZW5lcigidWlzdHlsZWNoYW5nZSIsZnVuY3Rpb24oYyl7bGV0IGc9e3RoZW1lOmMudWlzdHlsZX07bihLLk9OX1RIRU1FX0NIQU5HRSxnKSxyKEsuT05fVEhFTUVfQ0hBTkdFLGcsaGEoKSksckMoKX0pO2xldCBvPTA7ZS5hZGRFdmVudExpc3RlbmVyKCJLZXlib2FyZEhlaWdodENoYW5nZSIsZnVuY3Rpb24oYyl7byE9PWMuaGVpZ2h0JiYobz1jLmhlaWdodCxuKEsuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSx7aGVpZ2h0Om99KSl9KSx0LmFkZEV2ZW50TGlzdGVuZXIoSlQsZnVuY3Rpb24oYyl7YyYmYy5ldmVudCYmU1QoYy5ldmVudCxjLmRhdGEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsQ3ApLGUuYWRkRXZlbnRMaXN0ZW5lcigiV2Vidmlld1Bvc3RNZXNzYWdlIixDcCl9ZnVuY3Rpb24gQ3Aoe2RhdGE6ZX0pe2UmJmUudHlwZSYmb3Quc3Vic2NyaWJlSGFuZGxlcigicGx1c01lc3NhZ2UuIitlLnR5cGUsZS5hcmdzKX1mdW5jdGlvbiBBcChlLHQsbj0hMSl7b3Quc3Vic2NyaWJlKCJwbHVzTWVzc2FnZS4iK2UsdCxuKX1mdW5jdGlvbiBkSShlKXtDYihlLiQpO2xldHtlbnRyeVBhZ2VQYXRoOnQsZW50cnlQYWdlUXVlcnk6bixyZWZlcnJlckluZm86cn09UixvPWhzKHtwYXRoOnQscXVlcnk6bixyZWZlcnJlckluZm86cn0pO2puKGUsSy5PTl9MQVVOQ0gsbyksam4oZSxLLk9OX1NIT1csbyk7bGV0IGM9Zi5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0QXBwU3RhdGU7KGMmJk51bWJlcihjKCkpKT09PTImJmpuKGUsSy5PTl9ISURFLG8pfWZ1bmN0aW9uIE9wKGUpe3JldHVybiBlPWUucmVwbGFjZSgvXC8kLywiIiksZS5pbmRleE9mKCJfIik9PT0wP3MuaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKTplfWZ1bmN0aW9uIGhJKCl7bGV0IGU9T3AoZnMpLHQ9T3AoSnIpLG49dC5zcGxpdCgiLyIpO24ucG9wKCk7bGV0IHI9bi5qb2luKCIvIik7cy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHMuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbShyKSxvPT57by5jcmVhdGVSZWFkZXIoKS5yZWFkRW50cmllcyhmdW5jdGlvbihnKXtsZXQgYj1nO2ImJmIubGVuZ3RoJiZiLmZvckVhY2goZnVuY3Rpb24oVil7Vi5pc0RpcmVjdG9yeSYmVi5mdWxsUGF0aC5pbmRleE9mKGUpPT09MCYmVi5mdWxsUGF0aC5pbmRleE9mKHQpIT09MCYmVi5yZW1vdmVSZWN1cnNpdmVseSgpfSl9KX0pfWxldCBUcD0wLHhsPTAsS2M9bnVsbCxybD1udWxsO2Z1bmN0aW9uIGdJKGUsdCl7aWYoS2M9bnVsbCxybCYmKHkocmwpLHJsPW51bGwpLGUudHlwZT09PSJvbkZvY3VzIilpZih4bD4wKWUuZGV0YWlsLmhlaWdodD14bDtlbHNle3JsPU4oZnVuY3Rpb24oKXtlLmRldGFpbC5oZWlnaHQ9eGwsdChlKX0sVHApLEtjPWZ1bmN0aW9uKCl7cmwmJih5KHJsKSxybD1udWxsKSxlLmRldGFpbC5oZWlnaHQ9eGwsdChlKX07cmV0dXJufXQoZSl9ZnVuY3Rpb24gcEkoKXtUcD1zLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIj8zMDA6NzAwLG90Lm9uKEsuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSx0PT57aWYoeGw9dC5oZWlnaHQseGw+MCl7bGV0IG49S2M7S2M9bnVsbCxuJiZuKCl9fSl9ZnVuY3Rpb24gdkkoZSx0LG4pe2xldCByPXQudHlwZTtyPT09Im9uRm9jdXMifHxyPT09Im9uQmx1ciI/Z0kodCxvPT57bi5maXJlRXZlbnQoZSxvKX0pOm4uZmlyZUV2ZW50KGUsdCl9ZnVuY3Rpb24gbUkoZSx0KXtsZXQgbj1OcihwYXJzZUludCh0KSk7aWYoIW4pcmV0dXJuO2xldCByPW4uX19wYWdlX2NvbnRhaW5lcl9fO2UuZm9yRWFjaChvPT57c3dpdGNoKG9bMF0pe2Nhc2UgSy5BQ1RJT05fVFlQRV9FVkVOVDp2SShvWzFdLG9bMl0scik7YnJlYWt9fSl9bGV0IFBwPXt9O2Z1bmN0aW9uIF9JKGUsdCxuKXtsZXR7YWRwaWQ6cix3aWR0aDpvfT1lLGM9cisiLSIrbyxnPVBwW2NdO2lmKGcmJmcubGVuZ3RoPjApe3QoZy5zcGxpY2UoMCwxKVswXSk7cmV0dXJufXMuYWQuZ2V0QWRzKGUsYj0+e2xldCBWPWIuYWRzO3QoVi5zcGxpY2UoMCwxKVswXSksUHBbY109Zz9nLmNvbmNhdChWKTpWfSxiPT57bih7ZXJyQ29kZTpiLmNvZGUsZXJyTXNnOmIubWVzc2FnZX0pfSl9ZnVuY3Rpb24gYkkoKXt4KCJnZXRBZERhdGEiLChlLHQpPT57X0koZSxuPT57dCh7Y29kZTowLGRhdGE6bn0pfSxuPT57dCh7Y29kZToxLG1lc3NhZ2U6bn0pfSl9KX1sZXQgRUk9WyJzd2l0Y2hUYWIiLCJyZUxhdW5jaCIsInJlZGlyZWN0VG8iLCJuYXZpZ2F0ZVRvIiwibmF2aWdhdGVCYWNrIl07ZnVuY3Rpb24geUkoKXtFSS5mb3JFYWNoKGU9Pnt4KGUsdD0+e1BbZV0oei5leHRlbmQodCx7ZmFpbChuKXtjb25zb2xlLmVycm9yKG4uZXJyTXNnKX19KSl9KX0pfWxldCBJcD0hMTtmdW5jdGlvbiBTSShlLHQpe2xldCBuPXQ9PT0iMSI7aWYoIShuJiZJcCkpe2lmKG4/KElwPSEwLG9wKHMud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCkpKTokaXx8b3Aocy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQpKSwhJGkubG9hZGVkKXtpZigkaS5pZCE9PXQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYHdlYnZpZXdSZWFkeVskeyRpLmlkfV1bJHt0fV0gbm90IG1hdGNoYCk7JGkubG9hZGVkPSEwfW90LmVtaXQoUmwrIi4iK3QpLG4mJndJKCl9fWZ1bmN0aW9uIHdJKCl7bGV0e2F1dG9jbG9zZTplLGFsd2F5c1Nob3dCZWZvcmVSZW5kZXI6dH09Ui5zcGxhc2hzY3JlZW47ZSYmIXQmJnMubmF2aWdhdG9yLmNsb3NlU3BsYXNoc2NyZWVuKCk7bGV0IG49Sy5hZGRMZWFkaW5nU2xhc2goUi5lbnRyeVBhZ2VQYXRoKSxyPUtpKG4pO2lmKCFyLm1ldGEuaXNOVnVlKXtsZXQgbz17dXJsOm4rKFIuZW50cnlQYWdlUXVlcnl8fCIiKSxvcGVuVHlwZToiYXBwTGF1bmNoIn0sYz17cmVzb2x2ZSgpe30scmVqZWN0KCl7fX07cmV0dXJuIHIubWV0YS5pc1RhYkJhcj93cChvLGMpOlNwKG8sYyl9fWZ1bmN0aW9uIENJKGUsdCl7bGV0IG49TnIocGFyc2VJbnQodCkpO24mJihuLl9fdW5pYXBwX3dlYnZpZXc9ITApfWZ1bmN0aW9uIEFJKGUsdCl7bGV0IG49TnIocGFyc2VJbnQodCkpO24mJmRlbGV0ZSBuLl9fdW5pYXBwX3dlYnZpZXd9bGV0IE9JPSh7bmFtZTplLGFyZzp0fSxuKT0+e2U9PT0icG9zdE1lc3NhZ2UiP1RJKG5bMF0sdCk6UFtlXSh6LmV4dGVuZCh0LHtmYWlsKHIpe2NvbnNvbGUuZXJyb3Ioci5lcnJNc2cpfX0pKX07ZnVuY3Rpb24gVEkoZSx0KXtsZXQgbj1QUCgid2ViLXZpZXciLHBhcnNlSW50KGUpKTtuJiZuLmRpc3BhdGNoRXZlbnQoSy5jcmVhdGVVbmlFdmVudCh7dHlwZToib25NZXNzYWdlIix0YXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSxjdXJyZW50VGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksZGV0YWlsOntkYXRhOlt0XX19KSl9ZnVuY3Rpb24gUEkoe25vZGVJZDplLG93bmVySWQ6dCxtZXRob2Q6bixhcmdzOnJ9LG8pe2xldCBjPWdwKGUscGFyc2VJbnQobykpO2lmKCFjKXJldHVybjtsZXQgZz1JSSh0LGMuX192dWVQYXJlbnRDb21wb25lbnQpOyFnfHwhZ1tuXXx8Z1tuXShyKX1mdW5jdGlvbiBJSShlLHQpe2lmKCF0KXJldHVybiBudWxsO2lmKHQudWlkPT09ZSlyZXR1cm4gdC5wcm94eTtsZXQgbj10LnBhcmVudDtmb3IoO247KXtpZihuLnVpZD09PWUpcmV0dXJuIG4ucHJveHk7bj1uLnBhcmVudH1yZXR1cm4gdC5wcm94eX1mdW5jdGlvbiBOSSgpe2xldHtzdWJzY3JpYmU6ZSxzdWJzY3JpYmVIYW5kbGVyOnQscHVibGlzaEhhbmRsZXI6bn09b3Q7aWYoQXAoInN1YnNjcmliZUhhbmRsZXIiLCh7dHlwZTpyLGRhdGE6byxwYWdlSWQ6Y30pPT57dChyLG8sYyl9KSxBcChLLldFQl9JTlZPS0VfQVBQU0VSVklDRSwoe2RhdGE6cix3ZWJ2aWV3SWRzOm99KT0+e09JKHIsbyl9KSxSLnJlbmRlcmVyIT09Im5hdGl2ZSIpe2UoUmwsU0kpLGUoVGcsbUkpLHYoKSxiSSgpLHlJKCksZShRTyxDSSksZShlVCxBSSksZShLLk9OX1dYU19JTlZPS0VfQ0FMTF9NRVRIT0QsUEkpO2xldCByPUtpKEsuYWRkTGVhZGluZ1NsYXNoKFIuZW50cnlQYWdlUGF0aCkpO3ImJiFyLm1ldGEuaXNOVnVlJiZuKFJsLHt9LDEpfX1sZXQgQmwsY2Y9e2dsb2JhbERhdGE6e319O2Z1bmN0aW9uIGtJKHthbGxvd0RlZmF1bHQ6ZT0hMX09e30pe2lmKEJsKXJldHVybiBCbDtpZihlKXJldHVybiBjZjtjb25zb2xlLmVycm9yKCJbd2Fybl06IGdldEFwcCgpIGZhaWxlZC4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLmlvL2NvbGxvY2F0aW9uL2ZyYW1lL3dpbmRvdz9pZD1nZXRhcHAuIil9ZnVuY3Rpb24gUkkoZSl7aWYoUC5WdWV4JiZlLiRzdG9yZSl7bGV0e3VzZVN0b3JlOnR9PVAuVnVleDtQLlZ1ZXgudXNlU3RvcmU9bj0+bj90KG4pOmUuJHN0b3JlfWphKGUpLEJsPWUsbHQoQmwpLHouZXh0ZW5kKEJsLGNmKSx5dChCbCxjZi5nbG9iYWxEYXRhKSx3ZSgpLEVwKCksdUkoKSxmSSgpLHBJKCksTkkoKSxkSShlKSxOKGhJLDFlNCksUi5yZWFkeT0hMH12YXIgeEk9e3VuaTpzSSxnZXRBcHA6a0ksZ2V0Q3VycmVudFBhZ2VzOkNyLF9fZGVmaW5lUGFnZTpVUCxfX3JlZ2lzdGVyQXBwOlJJLF9fcmVnaXN0ZXJQYWdlOmZjLFVuaVNlcnZpY2VKU0JyaWRnZTpsSX07cmV0dXJuIHhJfShOdCxVdCx3KTtUdD1UdC5kZWZhdWx0fHxUdDtsZXQgUD1UdC51bmksQ3Q9VHQuZ2V0QXBwLFJuPVR0LmdldEN1cnJlbnRQYWdlcyxvdD1UdC5VbmlTZXJ2aWNlSlNCcmlkZ2U7cmV0dXJuIFR0fXZhciBndj1Fayh3ayk7ZnVuY3Rpb24gcHYoZil7fXZhciB2dj1mPT57fTt2YXIgbXY9Zj0+e2xldHtyZWdpc3RlclVUU0ludGVyZmFjZTpzLGluaXRVVFNQcm94eUNsYXNzOnAsaW5pdFVUU1Byb3h5RnVuY3Rpb246dyxpbml0VVRTUGFja2FnZU5hbWU6Tixpbml0VVRTSW5kZXhDbGFzc05hbWU6eSxpbml0VVRTQ2xhc3NOYW1lOmh9PWYsRT0iRENsb3VkVW5pQ3JlYXRlUmVxdWVzdFBlcm1pc3Npb25MaXN0ZW5lciIsUj0idW5pLWNyZWF0ZVJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXIiLERlPSJidWlsdC1pbiIsTnQ9IiIsVXQ9ITAsVHQ9TihFLFV0KSxQPXkoRSxVdCk7cygiUmVxdWVzdFBlcm1pc3Npb25MaXN0ZW5lck9wdGlvbnMiLE9iamVjdC5hc3NpZ24oe21vZHVsZU5hbWU6Uixtb2R1bGVUeXBlOkRlLGVyck1zZzpOdCxwYWNrYWdlOlR0LGNsYXNzOmgoRSwiUmVxdWVzdFBlcm1pc3Npb25MaXN0ZW5lckJ5SnNQcm94eSIsVXQpfSx7bWV0aG9kczp7b25SZXF1ZXN0QnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToiY2FsbGJhY2siLHR5cGU6IlVUU0NhbGxiYWNrIn1dLHJldHVybjp7fX0sb25Db25maXJtQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToiY2FsbGJhY2siLHR5cGU6IlVUU0NhbGxiYWNrIn1dLHJldHVybjp7fX0sb25Db21wbGV0ZUJ5SnM6e2FzeW5jOiExLHBhcmFtczpbe25hbWU6ImNhbGxiYWNrIix0eXBlOiJVVFNDYWxsYmFjayJ9XSxyZXR1cm46e319LHN0b3BCeUpzOnthc3luYzohMSxwYXJhbXM6W10scmV0dXJuOnt9fX0scHJvcHM6W119KSksZi5jcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyPXcoITEse21vZHVsZU5hbWU6Uixtb2R1bGVUeXBlOkRlLGVyck1zZzpOdCxtYWluOiEwLHBhY2thZ2U6VHQsY2xhc3M6UCxuYW1lOiJjcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyQnlKcyIscGFyYW1zOltdLHJldHVybjp7dHlwZToiaW50ZXJmYWNlIixvcHRpb25zOiJSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyT3B0aW9ucyJ9fSl9O3ZhciBfdj1mPT57fTt2YXIgYnY9Zj0+e2xldHtyZWdpc3RlclVUU0ludGVyZmFjZTpzLGluaXRVVFNQcm94eUNsYXNzOnAsaW5pdFVUU1Byb3h5RnVuY3Rpb246dyxpbml0VVRTUGFja2FnZU5hbWU6Tixpbml0VVRTSW5kZXhDbGFzc05hbWU6eSxpbml0VVRTQ2xhc3NOYW1lOmh9PWYsRT0iRENsb3VkVW5pRXhpdCIsUj0idW5pLWV4aXQiLERlPSJidWlsdC1pbiIsTnQ9IiIsVXQ9ITAsVHQ9TihFLFV0KSxQPXkoRSxVdCk7Zi5leGl0PXcoITEse21vZHVsZU5hbWU6Uixtb2R1bGVUeXBlOkRlLGVyck1zZzpOdCxtYWluOiEwLHBhY2thZ2U6VHQsY2xhc3M6UCxuYW1lOiJleGl0QnlKcyIscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUV4aXRFeGl0T3B0aW9uc0pTT05PYmplY3QiLGRlZmF1bHQ6IlVUU051bGwifV0scmV0dXJuOiIifSl9O3ZhciBFdj1mPT57bGV0e3JlZ2lzdGVyVVRTSW50ZXJmYWNlOnMsaW5pdFVUU1Byb3h5Q2xhc3M6cCxpbml0VVRTUHJveHlGdW5jdGlvbjp3LGluaXRVVFNQYWNrYWdlTmFtZTpOLGluaXRVVFNJbmRleENsYXNzTmFtZTp5LGluaXRVVFNDbGFzc05hbWU6aH09ZixFPSJEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeSIsUj0iRmFjaWFsUmVjb2duaXRpb25WZXJpZnkoXHU1QjlFXHU0RUJBXHU4QkE0XHU4QkMxKSIsRGU9ImJ1aWx0LWluIixOdD0iIixVdD0hMCxUdD1OKEUsVXQpLFA9eShFLFV0KTtmLnN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnk9dyghMSx7bW9kdWxlTmFtZTpSLG1vZHVsZVR5cGU6RGUsZXJyTXNnOk50LG1haW46ITAscGFja2FnZTpUdCxjbGFzczpQLG5hbWU6InN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlCeUpzIixwYXJhbXM6W3tuYW1lOiJmYWNlU3R5bGUiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeVN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KSxmLmdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm89dyghMSx7bW9kdWxlTmFtZTpSLG1vZHVsZVR5cGU6RGUsZXJyTXNnOk50LG1haW46ITAscGFja2FnZTpUdCxjbGFzczpQLG5hbWU6ImdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm9CeUpzIixwYXJhbXM6W10scmV0dXJuOiIifSl9O3ZhciB5dj1mPT57fTt2YXIgU3Y9Zj0+e307dmFyIHd2PWY9Pnt9O3ZhciBDdj1mPT57fTt2YXIgQXY9Zj0+e307dmFyIE92PWY9Pnt9O3ZhciBUdj1mPT57fTt2YXIgUHY9Zj0+e307dmFyIEl2PWY9Pnt9O3ZhciBOdj1mPT57bGV0e3JlZ2lzdGVyVVRTSW50ZXJmYWNlOnMsaW5pdFVUU1Byb3h5Q2xhc3M6cCxpbml0VVRTUHJveHlGdW5jdGlvbjp3LGluaXRVVFNQYWNrYWdlTmFtZTpOLGluaXRVVFNJbmRleENsYXNzTmFtZTp5LGluaXRVVFNDbGFzc05hbWU6aH09ZixFPSJEQ2xvdWRVbmlJbnN0YWxsQXBrIixSPSJ1bmktaW5zdGFsbEFwayIsRGU9ImJ1aWx0LWluIixOdD0iIixVdD0hMCxUdD1OKEUsVXQpLFA9eShFLFV0KTtmLmluc3RhbGxBcGs9dyghMSx7bW9kdWxlTmFtZTpSLG1vZHVsZVR5cGU6RGUsZXJyTXNnOk50LG1haW46ITAscGFja2FnZTpUdCxjbGFzczpQLG5hbWU6Imluc3RhbGxBcGtCeUpzIixwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pSW5zdGFsbEFwa0luc3RhbGxBcGtPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KX07dmFyIGt2PWY9Pnt9O3ZhciBSdj1mPT57fTt2YXIgeHY9Zj0+e307dmFyIEJ2PWY9Pnt9O3ZhciBNdj1mPT57fTt2YXIgTHY9Zj0+e307dmFyIER2PWY9Pnt9O3ZhciBGdj1mPT57fTt2YXIgVnY9Zj0+e307dmFyIFV2PWY9Pnt9O2Z1bmN0aW9uICR2KGYpe3Z2KGYpLG12KGYpLF92KGYpLGJ2KGYpLEV2KGYpLHl2KGYpLFN2KGYpLHd2KGYpLEN2KGYpLEF2KGYpLE92KGYpLFR2KGYpLFB2KGYpLEl2KGYpLE52KGYpLGt2KGYpLFJ2KGYpLHh2KGYpLEJ2KGYpLE12KGYpLEx2KGYpLER2KGYpLEZ2KGYpLFZ2KGYpLFV2KGYpLHB2KGYpfXZhciBSZix4ZixCZixMYSxNZixMZixEZjtmdW5jdGlvbiBIdigpe3JldHVybiBMYT97X19kZWZpbmVQYWdlOlJmLF9fcmVnaXN0ZXJBcHA6eGYsX19yZWdpc3RlclBhZ2U6QmYsdW5pOkxhLHd4OkxhLGdldEFwcDpNZixnZXRDdXJyZW50UGFnZXM6TGYsVW5pU2VydmljZUpTQnJpZGdlOkRmfTp7fX1mdW5jdGlvbiBqdihmKXtsZXR7d2VleDpzLHBsdXM6cCxWdWVTaGFyZWQ6d309ZjtyZXR1cm4gTGF8fCh7X19kZWZpbmVQYWdlOlJmLF9fcmVnaXN0ZXJBcHA6eGYsX19yZWdpc3RlclBhZ2U6QmYsdW5pOkxhLGdldEFwcDpNZixnZXRDdXJyZW50UGFnZXM6TGYsVW5pU2VydmljZUpTQnJpZGdlOkRmfT1odihzLHAsZiksTGEuVnVlU2hhcmVkPXcsJHYoTGEpLERwKExhKSkse19fZGVmaW5lUGFnZTpSZixfX3JlZ2lzdGVyQXBwOnhmLF9fcmVnaXN0ZXJQYWdlOkJmLHBsdXM6cCx1bmk6TGEsd3g6TGEsZ2V0QXBwOk1mLGdldEN1cnJlbnRQYWdlczpMZixVbmlTZXJ2aWNlSlNCcmlkZ2U6RGZ9fWZ1bmN0aW9uIHp2KGYscyl7bGV0e19fdW5pQ29uZmlnOnB9PXM7aWYoIXApcmV0dXJuO2xldCB3PXMud2VleDt3LmRvY3VtZW50Ll9fJGF1dG9tYXRvcl9fPSEhcC5hdXRvbWF0b3I7bGV0IE49cC5yZW5kZXJlciE9PSJuYXRpdmUiJiZ3LmNvbmZpZy5idW5kbGVVcmwuaW5kZXhPZigiYXBwLXNlcnZpY2UuanMiKSE9PS0xO2lmKEhpKHMsSHYoKSksTj9ndihzKTooJHAoZixzKSxhdihzLlZ1ZS5wYXJzZUNsYXNzU3R5bGVzKSksSGkocyxqdihzKSksdy5jb25maWcucGx1c193ZWJfaWQ9PT0iMSIpe2xldCBSPXcucmVxdWlyZU1vZHVsZSgicGx1cyIpO1Iuc2V0RGVmYXVsdEZvbnRTaXplJiZSLnNldERlZmF1bHRGb250U2l6ZShNYXRoLnJvdW5kKHMucGx1cy5zY3JlZW4ucmVzb2x1dGlvbldpZHRoLzIwKSl9bGV0e3NjYWxlOnksZGV2aWNlV2lkdGg6aCxwbGF0Zm9ybTpFfT1nbG9iYWwuV1hFbnZpcm9ubWVudDtpZihFLnRvTG93ZXJDYXNlKCk9PT0iaW9zIil7bGV0IFI9TWF0aC5jZWlsKGgveSk7dy5yZXF1aXJlTW9kdWxlKCJtZXRhIikuc2V0Vmlld3BvcnQoe3dpZHRoOlIscm91bmRPZmZEZXZpYXRpb246ITF9KX19dmFyIGNsPWNsYXNzIGV4dGVuZHMgbGx7Y29uc3RydWN0b3Iocyl7c3VwZXIoKTt0aGlzLm5vZGVUeXBlPTg7dGhpcy50eXBlPSJjb21tZW50Ijt0aGlzLnZhbHVlPSIiO3RoaXMudmFsdWU9c310b1N0cmluZygpe3JldHVybiI8IS0tICIrdGhpcy52YWx1ZSsiIC0tPiJ9fTtmdW5jdGlvbiBDbyhmLHM9W10pe3JldHVybnttb2R1bGU6ImRvbSIsbWV0aG9kOmYsYXJnczpzfX12YXIgVWw9Y2xhc3N7Y29uc3RydWN0b3IocyxwKXt0aGlzLmlkPXMsdGhpcy5iYXRjaGVkPSExLHRoaXMudXBkYXRlcz1bXSxGbihwKT9PYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaGFuZGxlciIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnB9KTpjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gaW52YWxpZCBwYXJhbWV0ZXIsIGhhbmRsZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9Y3JlYXRlRmluaXNoKHMpe3JldHVybiB0aGlzLmhhbmRsZXIoW0NvKCJjcmVhdGVGaW5pc2giKV0scyl9dXBkYXRlRmluaXNoKHMpe3JldHVybiB0aGlzLmhhbmRsZXIoW0NvKCJ1cGRhdGVGaW5pc2giKV0scyl9cmVmcmVzaEZpbmlzaChzKXtyZXR1cm4gdGhpcy5oYW5kbGVyKFtDbygicmVmcmVzaEZpbmlzaCIpXSxzKX1jcmVhdGVCb2R5KHMpe2xldCBwPXMudG9KU09OKCksdz1wLmNoaWxkcmVuO2RlbGV0ZSBwLmNoaWxkcmVuO2xldCBOPVtDbygiY3JlYXRlQm9keSIsW3BdKV07cmV0dXJuIHcmJk4ucHVzaC5hcHBseShOLHcubWFwKHk9PkNvKCJhZGRFbGVtZW50IixbcC5yZWYseSwtMV0pKSksdGhpcy5hZGRBY3Rpb25zKE4pfWFkZEVsZW1lbnQocyxwLHcpe3JldHVybiB3Pj0wfHwodz0tMSksdGhpcy5hZGRBY3Rpb25zKENvKCJhZGRFbGVtZW50IixbcCxzLnRvSlNPTigpLHddKSl9cmVtb3ZlRWxlbWVudChzKXtpZihraShzKSl7bGV0IHA9cy5tYXAodz0+Q28oInJlbW92ZUVsZW1lbnQiLFt3XSkpO3JldHVybiB0aGlzLmFkZEFjdGlvbnMocCl9cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhDbygicmVtb3ZlRWxlbWVudCIsW3NdKSl9bW92ZUVsZW1lbnQocyxwLHcpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoQ28oIm1vdmVFbGVtZW50IixbcyxwLHddKSl9c2V0QXR0cihzLHAsdyl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhDbygidXBkYXRlQXR0cnMiLFtzLHtbcF06d31dKSl9c2V0U3R5bGUocyxwLHcpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoQ28oInVwZGF0ZVN0eWxlIixbcyx7W3BdOnd9XSkpfXNldFN0eWxlcyhzLHApe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoQ28oInVwZGF0ZVN0eWxlIixbcyxwXSkpfWFkZEV2ZW50KHMscCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhDbygiYWRkRXZlbnQiLFtzLHBdKSl9cmVtb3ZlRXZlbnQocyxwKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKENvKCJyZW1vdmVFdmVudCIsW3MscF0pKX1oYW5kbGVyKHMscCl7cmV0dXJuIHAmJnAoKX1hZGRBY3Rpb25zKHMpe2xldCBwPXRoaXMudXBkYXRlcyx3PXRoaXMuaGFuZGxlcjtpZihraShzKXx8KHM9W3NdKSx0aGlzLmJhdGNoZWQpcC5wdXNoLmFwcGx5KHAscyk7ZWxzZSByZXR1cm4gdyhzKX19O3ZhciBGZj17Y3JlYXRlQm9keToiY2FsbENyZWF0ZUJvZHkiLGFkZEVsZW1lbnQ6ImNhbGxBZGRFbGVtZW50IixyZW1vdmVFbGVtZW50OiJjYWxsUmVtb3ZlRWxlbWVudCIsbW92ZUVsZW1lbnQ6ImNhbGxNb3ZlRWxlbWVudCIsdXBkYXRlQXR0cnM6ImNhbGxVcGRhdGVBdHRycyIsdXBkYXRlU3R5bGU6ImNhbGxVcGRhdGVTdHlsZSIsYWRkRXZlbnQ6ImNhbGxBZGRFdmVudCIscmVtb3ZlRXZlbnQ6ImNhbGxSZW1vdmVFdmVudCJ9O2Z1bmN0aW9uIFd2KGYscyl7bGV0IHA9c3x8Z2xvYmFsLmNhbGxOYXRpdmU7cmV0dXJuIEZuKHApfHxjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyIiksZnVuY3Rpb24oTil7a2koTil8fChOPVtOXSk7Zm9yKGxldCB5PTA7eTxOLmxlbmd0aDt5Kyspe2xldCBoPUFrKGYsTlt5XSxwKTtpZihoPT09LTEpcmV0dXJuIGh9fX1mdW5jdGlvbiBDayhmLHMpe3JldHVybiBmPT09ImRvbSImJkZmW3NdJiZGbihnbG9iYWxbRmZbc11dKX1mdW5jdGlvbiBBayhmLHMscCl7bGV0e21vZHVsZTp3LG1ldGhvZDpOLGFyZ3M6eX09cztyZXR1cm4gQ2sodyxOKT9nbG9iYWxbRmZbTl1dKGYsLi4ueSwiLTEiKTpwKGYsW3NdLCItMSIpfXZhciBodT1jbGFzcyBleHRlbmRzIG5ve2NvbnN0cnVjdG9yKHMpe3N1cGVyKCk7dGhpcy52YWx1ZT1zLHRoaXMubm9kZVR5cGU9Myx0aGlzLnR5cGU9InRleHQiLHRoaXMudmFsdWU9IiJ9dG9TdHJpbmcoKXtyZXR1cm4iIit0aGlzLnZhbHVlfX07dmFyIEd2PXtzbGlkZXI6e2NoYW5nZTpmdW5jdGlvbihmKXtyZXR1cm57aW5kZXg6Zi5pbmRleCxzb3VyY2U6Zi5zb3VyY2V9fSxzY3JvbGw6ZnVuY3Rpb24oZil7cmV0dXJue29mZnNldFhSYXRpbzpmLm9mZnNldFhSYXRpbyxvZmZzZXRZUmF0aW86Zi5vZmZzZXRZUmF0aW8sZHJhZzpmLmRyYWd9fX0sInNjcm9sbC12aWV3Ijp7c2Nyb2xsZW5kOmZ1bmN0aW9uKGYpe3JldHVybntjb250ZW50T2Zmc2V0OmYuY29udGVudE9mZnNldH19fX07ZnVuY3Rpb24gWXYoZil7bGV0e2F0dHI6cyxvZmZzZXRMZWZ0OnAsb2Zmc2V0VG9wOnd9PWYsTj17fTtyZXR1cm4gcyYmT2JqZWN0LmtleXMocykuZm9yRWFjaCh5PT57eS5pbmRleE9mKCJkYXRhLSIpPT09MCYmKE5beS5yZXBsYWNlKCJkYXRhLSIsIiIpXT1zW3ldKX0pLHtpZDpzJiZzLmlkfHwiIixkYXRhc2V0Ok4sb2Zmc2V0TGVmdDpwfHwwLG9mZnNldFRvcDp3fHwwfX12YXIgT2s9WyJhIiwiZGl2IiwibGlzdCIsImNlbGwiLCJsb2FkaW5nIiwicmVmcmVzaCIsInJlY3ljbGUtbGlzdCIsInNjcm9sbGVyIiwiaW5kaWNhdG9yIiwid2F0ZXJmYWxsIiwid2ViIiwicmljaHRleHQiXSxUaz1bInZpZXdhcHBlYXIiLCJ2aWV3ZGlzYXBwZWFyIl0sUGs9e21hcmtlcnRhcDpbIm1hcmtlcklkIl0sY29udHJvbHRhcDpbImNvbnRyb2xJZCJdLHJlZ2lvbmNoYW5nZTpbImNhdXNlZEJ5Il0sZW5kOlsiY2F1c2VkQnkiXSxhcHBlYXI6WyJkaXJlY3Rpb24iXSxkaXNhcHBlYXI6WyJkaXJlY3Rpb24iXX07ZnVuY3Rpb24gcXYoZixzKXtsZXQgcD1mLnR5cGU7aWYoVGsuaW5kZXhPZihwKSE9PS0xKXJldHVybiBmO2xldCB3PWYuY3VycmVudFRhcmdldCxOPXcudHlwZS5yZXBsYWNlKCJ1LSIsIiIpO2lmKE9rLmluZGV4T2YoTikhPT0tMSlyZXR1cm4gZjtsZXR7dGltZXN0YW1wOnksdGFyZ2V0Omh9PWY7aWYoIXMpe2xldCBEZT1HdltOXTtEZT9GbihEZVtwXSk/cz1EZVtwXShmKTpzPWYuZGV0YWlsfHx7fTpzPWYuZGV0YWlsfHx7fX1sZXQgRT17dHlwZTpwLHRpbWVTdGFtcDp5LHRhcmdldDpZdihoKSxjdXJyZW50VGFyZ2V0Oll2KHcpLGRldGFpbDpzLHRvdWNoZXM6cD09PSJ0b3VjaGVuZCJ8fHA9PT0icGFuZW5kIj9bXTpmLmNoYW5nZWRUb3VjaGVzLGNoYW5nZWRUb3VjaGVzOmYuY2hhbmdlZFRvdWNoZXN9O2YuY29tcG9uZW50SWQmJihFLmNvbXBvbmVudElkPWYuY29tcG9uZW50SWQpO2xldCBSPVBrW3BdO3JldHVybiBSJiZSLmZvckVhY2goRGU9PntpbChmLERlKSYmKEVbRGVdPWZbRGVdKX0pLEV9ZnVuY3Rpb24gSWsoZixzKXtsZXQgcD1zLmF0dHJzfHx7fTtmb3IobGV0IE4gaW4gcClmLnNldEF0dHIoTixwW05dLCEwKTtsZXQgdz1zLnN0eWxlfHx7fTtmb3IobGV0IE4gaW4gdylmLnNldFN0eWxlKE4sd1tOXSwhMCl9dmFyIHFvPWNsYXNze2NvbnN0cnVjdG9yKHMscD0iIix3KXtzPXM/cy50b1N0cmluZygpOiIiLHRoaXMuaWQ9cyx0aGlzLlVSTD1wLFFwKHMsdGhpcyksdGhpcy5ub2RlTWFwPXt9O2xldCBOPXFvLkxpc3RlbmVyfHxVbDt0aGlzLmxpc3RlbmVyPW5ldyBOKHMsd3x8V3Yocyxxby5oYW5kbGVyKSksdGhpcy50YXNrQ2VudGVyPW5ldyBWbChzLHc/KHksaCk9PncoaCk6cW8uaGFuZGxlciksdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX1nZXRSZWYocyl7cmV0dXJuIHRoaXMubm9kZU1hcFtzXX1vcGVuKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSExfWNsb3NlKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSEwfWNyZWF0ZURvY3VtZW50RWxlbWVudCgpe2lmKCF0aGlzLmRvY3VtZW50RWxlbWVudCl7bGV0IHM9bmV3IG5vKCJkb2N1bWVudCIpO3MuZG9jSWQ9dGhpcy5pZCxzLm93bmVyRG9jdW1lbnQ9dGhpcyxzLnJvbGU9ImRvY3VtZW50RWxlbWVudCIscy5yZWY9Il9kb2N1bWVudEVsZW1lbnQiLHRoaXMubm9kZU1hcC5fZG9jdW1lbnRFbGVtZW50PXMsdGhpcy5kb2N1bWVudEVsZW1lbnQ9cyxPYmplY3QuZGVmaW5lUHJvcGVydHkocywiYXBwZW5kQ2hpbGQiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpwPT57bWYodGhpcyxwKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocywiaW5zZXJ0QmVmb3JlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6KHAsdyk9PnttZih0aGlzLHAsdyl9fSksbnIoImRlYnVnIikmJmppKGBDcmVhdGUgZG9jdW1lbnQgZWxlbWVudCAoaWQ6ICIke3MuZG9jSWR9IiwgcmVmOiAiJHtzLnJlZn0iKWApfXJldHVybiB0aGlzLmRvY3VtZW50RWxlbWVudH1jcmVhdGVCb2R5KHMscCl7aWYoIXRoaXMuYm9keSl7bGV0IHc9bmV3IG5vKHMscCk7X2YodGhpcyx3KSxucigiZGVidWciKSYmamkoYFtjcmVhdGVCb2R5XSgke3RoaXMuaWR9LCR7dy50eXBlfSwke3cucmVmfSkgKCR7SlNPTi5zdHJpbmdpZnkody50b0pTT04oITApKX0pLmApfXJldHVybiB0aGlzLmJvZHl9Y3JlYXRlRWxlbWVudChzLHApe2xldCB3PW5ldyBubyhzLHApO3JldHVybiBucigiZGVidWciKSYmamkoYFtjcmVhdGVFbGVtZW50XSgke3RoaXMuaWR9LCR7dy50eXBlfSwke3cucmVmfSkgKCR7SlNPTi5zdHJpbmdpZnkody50b0pTT04oITApKX0pLmApLHd9Y3JlYXRlQ29tbWVudChzKXtyZXR1cm4gbmV3IGNsKHMpfWNyZWF0ZVRleHQocyl7cmV0dXJuIG5ldyBodShzKX1maXJlRXZlbnQocyxwLHcsTix5KXtpZighcylyZXR1cm47dz13fHx7fSx3LnR5cGU9dy50eXBlfHxwLHcudGFyZ2V0PXMsdy5jdXJyZW50VGFyZ2V0PXMsdy50aW1lc3RhbXA9RGF0ZS5ub3coKSxOJiZJayhzLE4pO2xldCBoPSEwLEU9dGhpcy5nZXRSZWYoIl9yb290Iik7aWYoRSYmRS5hdHRyKXtsZXQgUj1FLmF0dHIuYnViYmxlO2g9Uj09PSJ0cnVlInx8Uj09PSEwfHxoJiZSPT09dm9pZCAwfXJldHVybiB3PXF2KHcpLHMuZmlyZUV2ZW50KHAsdyxoLHkpfWRlc3Ryb3koKXtucigiZGVidWciKSYmamkoYFtkZXN0cm95XSgke3RoaXMuaWR9LGRvY3VtZW50KSBEZXN0cm95IGRvY3VtZW50IChpZDogIiR7dGhpcy5pZH0iLCBVUkw6ICIke3RoaXMuVVJMfSIpYCksdGhpcy50YXNrQ2VudGVyLmRlc3Ryb3lDYWxsYmFjaygpLGRlbGV0ZSB0aGlzLmxpc3RlbmVyLGRlbGV0ZSB0aGlzLm5vZGVNYXAsZGVsZXRlIHRoaXMudGFza0NlbnRlcixldih0aGlzLmlkKX19O3FvLmhhbmRsZXI9bnVsbDt2YXIgSnY9e0lucHV0RWxlbWVudERpdjoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsSW5wdXRFbGVtZW50UmVnRXhwOiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixSZXNlcnZlZFdvcmQ6IjxLZXl3b3JkPnw8TnVsbExpdGVyYWw+fDxCb29sZWFuTGl0ZXJhbD4iLFdoaXRlU3BhY2U6L1tcdFx2XGZcdTAwMjBcdTAwQTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVmXHUzMDAwXHVGRUZGXS8sTGluZVRlcm1pbmF0b3I6L1tcblxyXHUyMDI4XHUyMDI5XS8sS2V5d29yZDovbmV3KD8hW18kYS16QS1aMC05XSl8dm9pZCg/IVtfJGEtekEtWjAtOV0pfGRlbGV0ZSg/IVtfJGEtekEtWjAtOV0pfGluKD8hW18kYS16QS1aMC05XSl8aW5zdGFuY2VvZig/IVtfJGEtekEtWjAtOV0pfHR5cGVvZig/IVtfJGEtekEtWjAtOV0pLyxOdWxsTGl0ZXJhbDovbnVsbCg/IVtfJGEtekEtWjAtOV0pLyxCb29sZWFuTGl0ZXJhbDovKD86dHJ1ZXxmYWxzZSkoPyFbXyRhLXpBLVowLTldKS8sSWRlbnRpZmllcjovW18kYS16QS1aXVtfJGEtekEtWjAtOV0qLyxQdW5jdHVhdG9yOi9cL3w9PnxcKlwqfD4+Pj18Pj49fDw8PXw9PT18IT09fD4+Pnw8PHwlPXxcKj18LT18XCs9fDw9fD49fD09fCE9fFxePXxcfD18XHxcfHwmJnwmPXw+PnxcK1wrfC0tfFw6fH18XCp8JnxcfHxcXnwhfH58LXxcK3xcP3wlfD18Pnw8fCx8O3xcLig/IVswLTldKXxcXXxcW3xcKXxcKHx7LyxEaXZQdW5jdHVhdG9yOi9cLz18XC8vLE51bWVyaWNMaXRlcmFsOi8oPzowW3hYXVswLTlhLWZBLUZdKnxcLlswLTldK3woPzpbMS05XStbMC05XSp8MCkoPzpcLlswLTldKnxcLik/KSg/OltlRV1bKy1dezAsMX1bMC05XSspPyg/IVtfJGEtekEtWjAtOV0pLyxTdHJpbmdMaXRlcmFsOi8iKD86W14iXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKiJ8Jyg/OlteJ1xuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSonLyxSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWw6L1wvKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W14qXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkoPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKlwvWzAtOWEtekEtWl0qL307ZnVuY3Rpb24gS3YoZixzLHApe3ZhciB3PVtzXTtmdW5jdGlvbiBOKGgpe3ZhciBFPW5ldyBSZWdFeHA7cmV0dXJuIEUuY29tcGlsZShoLnJlcGxhY2UoLzwoW14+XSspPi9nLGZ1bmN0aW9uKFIsRGUpe3JldHVybiBmW0RlXT8ody5wdXNoKERlKSxmW0RlXWluc3RhbmNlb2YgUmVnRXhwPyIoIitmW0RlXS5zb3VyY2UrIikiOiIoIitOKGZbRGVdKS5zb3VyY2UrIikiKToiIn0pLHApLEV9dmFyIHk9TihmW3NdKTt0aGlzLmV4ZWM9ZnVuY3Rpb24oaCl7dmFyIEU9eS5leGVjKGgpO2lmKEU9PW51bGwpcmV0dXJuIG51bGw7Zm9yKHZhciBSPW5ldyBTdHJpbmcoRVswXSksRGU9MDtEZTx3Lmxlbmd0aDtEZSsrKUVbRGVdJiYoUlt3W0RlXV09RVtEZV0pO3JldHVybiBSfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibGFzdEluZGV4Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkubGFzdEluZGV4fSxzZXQ6ZnVuY3Rpb24oaCl7eS5sYXN0SW5kZXg9aH19KX1mdW5jdGlvbiBOaygpe3ZhciBmPW5ldyBLdihKdiwiSW5wdXRFbGVtZW50RGl2IiwiZyIpLHM9bmV3IEt2KEp2LCJJbnB1dEVsZW1lbnRSZWdFeHAiLCJnIikscDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic291cmNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHB9LHNldDpmdW5jdGlvbih3KXtwPXcsZi5sYXN0SW5kZXg9MCxzLmxhc3RJbmRleD0wfX0pLHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtmLmxhc3RJbmRleD0wLHMubGFzdEluZGV4PTB9LHRoaXMuZ2V0TmV4dFRva2VuPWZ1bmN0aW9uKHcpe3ZhciBOPWYubGFzdEluZGV4LHk7dz95PWY6eT1zO3ZhciBoPXkuZXhlYyhwKTtpZihoJiZ5Lmxhc3RJbmRleC1OPmgubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBJTExFR0FMIik7cmV0dXJuIGYubGFzdEluZGV4PXkubGFzdEluZGV4LHMubGFzdEluZGV4PXkubGFzdEluZGV4LGh9fXZhciBadj17SWRlbnRpZmllck5hbWU6W1siSWRlbnRpZmllciJdXSxMaXRlcmFsOltbIk51bGxMaXRlcmFsIl0sWyJCb29sZWFuTGl0ZXJhbCJdLFsiTnVtZXJpY0xpdGVyYWwiXSxbIlN0cmluZ0xpdGVyYWwiXSxbIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCJdXSxQcmltYXJ5RXhwcmVzc2lvbjpbWyJJZGVudGlmaWVyIl0sWyJMaXRlcmFsIl0sWyIoIiwiRXhwcmVzc2lvbiIsIikiXV0sQ2FsbEV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iLCJBcmd1bWVudHMiXSxbIkNhbGxFeHByZXNzaW9uIiwiQXJndW1lbnRzIl1dLEFyZ3VtZW50czpbWyIoIiwiKSJdLFsiKCIsIkFyZ3VtZW50TGlzdCIsIikiXV0sQXJndW1lbnRMaXN0OltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiQXJndW1lbnRMaXN0IiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxMZWZ0SGFuZFNpZGVFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIl0sWyJDYWxsRXhwcmVzc2lvbiJdXSxVbmFyeUV4cHJlc3Npb246W1siTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiJdLFsidm9pZCIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiKyIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiLSIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsifiIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiISIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxFeHBvbmVudGlhdGlvbkV4cHJlc3Npb246W1siVW5hcnlFeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iLCIqKiIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiLyIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIqIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIlIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl1dLEFkZGl0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIisiLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIi0iLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXV0sU2hpZnRFeHByZXNzaW9uOltbIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPDwiLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+Pj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXV0sUmVsYXRpb25hbEV4cHJlc3Npb246W1siU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjwiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbnN0YW5jZW9mIiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluIiwiU2hpZnRFeHByZXNzaW9uIl1dLEVxdWFsaXR5RXhwcmVzc2lvbjpbWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl1dLEJpdHdpc2VBTkRFeHByZXNzaW9uOltbIkVxdWFsaXR5RXhwcmVzc2lvbiJdLFsiQml0d2lzZUFOREV4cHJlc3Npb24iLCImIiwiRXF1YWxpdHlFeHByZXNzaW9uIl1dLEJpdHdpc2VYT1JFeHByZXNzaW9uOltbIkJpdHdpc2VBTkRFeHByZXNzaW9uIl0sWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiIsIl4iLCJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdXSxCaXR3aXNlT1JFeHByZXNzaW9uOltbIkJpdHdpc2VYT1JFeHByZXNzaW9uIl0sWyJCaXR3aXNlT1JFeHByZXNzaW9uIiwifCIsIkJpdHdpc2VYT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxBTkRFeHByZXNzaW9uOltbIkJpdHdpc2VPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIiwiJiYiLCJCaXR3aXNlT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxPUkV4cHJlc3Npb246W1siTG9naWNhbEFOREV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCJ8fCIsIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl1dLENvbmRpdGlvbmFsRXhwcmVzc2lvbjpbWyJMb2dpY2FsT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwiPyIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI6IiwiTG9naWNhbE9SRXhwcmVzc2lvbiJdXSxFeHByZXNzaW9uOltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXhwcmVzc2lvbiIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sUHJvZ3JhbTpbWyJFeHByZXNzaW9uIl1dfTtmdW5jdGlvbiB2YyhmLHMpe3RoaXMubmFtZT1mLHRoaXMudG9rZW49cyx0aGlzLmNoaWxkTm9kZXM9W10sdGhpcy50b1N0cmluZz1mdW5jdGlvbihwKXtpZihwfHwocD0iIiksdGhpcy5jaGlsZE5vZGVzLmxlbmd0aD09MSlyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdLnRvU3RyaW5nKHApO2Zvcih2YXIgdz1wK3RoaXMubmFtZSsodGhpcy50b2tlbiE9bnVsbCYmdGhpcy5uYW1lIT10aGlzLnRva2VuPyI6Iit0aGlzLnRva2VuOiIiKStgCmAsTj0wO048dGhpcy5jaGlsZE5vZGVzLmxlbmd0aDtOKyspdys9dGhpcy5jaGlsZE5vZGVzW05dLnRvU3RyaW5nKHArIiAgICAiKTtyZXR1cm4gd319ZnVuY3Rpb24ga2soKXt2YXIgZixzPXtQcm9ncmFtOiIkIn0scD17fTtmdW5jdGlvbiB3KEUpe3BbSlNPTi5zdHJpbmdpZnkoRSldPUU7Zm9yKHZhciBSPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEUpO1IubGVuZ3RoOyl7dmFyIERlPVIuc2hpZnQoKTshWnZbRGVdfHxadltEZV0uZm9yRWFjaChmdW5jdGlvbihVdCl7RVtVdFswXV18fFIucHVzaChVdFswXSk7dmFyIFR0PUUsUD1udWxsO1V0LmZvckVhY2goZnVuY3Rpb24oQ3Qpe1R0W0N0XXx8KFR0W0N0XT17fSksUD1UdCxUdD1UdFtDdF19KSxFW0RlXS4kZGl2JiYoVHQuJGRpdj0hMCksVHQuJHJlZHVjZT1EZSxUdC4kY291bnQ9VXQubGVuZ3RofSl9Zm9yKHZhciBOdCBpbiBFKXR5cGVvZiBFW050XSE9Im9iamVjdCJ8fE50LmNoYXJBdCgwKT09IiQifHxFW050XS4kY2xvc3VyZXx8KHBbSlNPTi5zdHJpbmdpZnkoRVtOdF0pXT9FW050XT1wW0pTT04uc3RyaW5naWZ5KEVbTnRdKV06dyhFW050XSkpO0UuJGNsb3N1cmU9ITB9dyhzKTt2YXIgTj1bXSx5PVtzXSxoPXM7dGhpcy5pbnNlcnRTeW1ib2w9ZnVuY3Rpb24oUixEZSl7Zm9yKDshaFtSLm5hbWVdJiZoLiRyZWR1Y2U7KXtmb3IodmFyIE50PWguJGNvdW50LFV0PW5ldyB2YyhoLiRyZWR1Y2UpO050LS07KVV0LmNoaWxkTm9kZXMucHVzaChOLnBvcCgpKSx5LnBvcCgpO2g9eVt5Lmxlbmd0aC0xXSx0aGlzLmluc2VydFN5bWJvbChVdCl9aWYoaD1oW1IubmFtZV0sTi5wdXNoKFIpLHkucHVzaChoKSwhaCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGguJGRpdn0sdGhpcy5yZXNldD1mdW5jdGlvbigpe2g9cyxOPVtdLHk9W3NdfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ3JhbW1hclRyZWUiLHtnZXQ6ZnVuY3Rpb24oKXt0cnl7Zm9yKDtoLiRyZWR1Y2U7KXtmb3IodmFyIEU9aC4kY291bnQsUj1uZXcgdmMoaC4kcmVkdWNlKTtFLS07KVIuY2hpbGROb2Rlcy5wdXNoKE4ucG9wKCkpLHkucG9wKCk7aD15W3kubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKFIpfWlmKE4ubGVuZ3RoPjAmJmhbIjsiXSlyZXR1cm4gdGhpcy5pbnNlcnRTeW1ib2wobmV3IHZjKCI7IiwiOyIpKSx0aGlzLmdyYW1tYXJUcmVlO2lmKE4ubGVuZ3RoIT0xfHxOWzBdLm5hbWUhPSJQcm9ncmFtIil0aHJvdyBuZXcgRXJyb3J9Y2F0Y2goRGUpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKX1yZXR1cm4gTlswXX19KX1mdW5jdGlvbiBSaygpe3RoaXMubGV4aWNhbFBhcnNlcj1uZXcgTmssdGhpcy5zeW50YWN0aWNhbFBhcnNlcj1uZXcga2s7dmFyIGY9WyJOdWxsTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVtZXJpY0xpdGVyYWwiLCJTdHJpbmdMaXRlcmFsIiwiUmVndWxhckV4cHJlc3Npb25MaXRlcmFsIiwiSWRlbnRpZmllciIsIioqIiwiPT4iLCJ7IiwifSIsIigiLCIpIiwiWyIsIl0iLCIuIiwiOyIsIiwiLCI8IiwiPiIsIjw9IiwiPj0iLCI9PSIsIiE9IiwiPT09IiwiIT09IiwiKyIsIi0iLCIqIiwiJSIsIisrIiwiLS0iLCI8PCIsIj4+IiwiPj4+IiwiJiIsInwiLCJeIiwiISIsIn4iLCImJiIsInx8IiwiPyIsIjoiLCI9IiwiKz0iLCItPSIsIio9IiwiJT0iLCI8PD0iLCI+Pj0iLCI+Pj49IiwiJj0iLCJ8PSIsIl49IiwiLyIsIi89IiwiaW5zdGFuY2VvZiIsInR5cGVvZiIsIm5ldyIsInZvaWQiLCJkZWJ1Z2dlciIsInRoaXMiLCJkZWxldGUiLCJpbiJdLHM9e307Zi5mb3JFYWNoKGZ1bmN0aW9uKHApe09iamVjdC5kZWZpbmVQcm9wZXJ0eShzLHAse30pfSksdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGV4aWNhbFBhcnNlci5yZXNldCgpLHRoaXMuc3ludGFjdGljYWxQYXJzZXIucmVzZXQoKX0sdGhpcy5wYXJzZT1mdW5jdGlvbihwLHcpe3ZhciBOLHk9ITE7dGhpcy5sZXhpY2FsUGFyc2VyLnNvdXJjZT1wO2Zvcih2YXIgaD0hMTtOPXRoaXMubGV4aWNhbFBhcnNlci5nZXROZXh0VG9rZW4oaCk7KXt3JiZ3KE4pO3RyeXtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhOKS5zb21lKEU9PnMuaGFzT3duUHJvcGVydHkoRSk/KGg9dGhpcy5zeW50YWN0aWNhbFBhcnNlci5pbnNlcnRTeW1ib2wobmV3IHZjKEUsTikseSkseT0hMSwhMCk6ITEpKWNvbnRpbnVlOyhOLktleXdvcmR8fE4uUHVuY3R1YXRvcnx8Ti5EaXZQdW5jdHVhdG9yKSYmcy5oYXNPd25Qcm9wZXJ0eShOLnRvU3RyaW5nKCkpJiYoaD10aGlzLnN5bnRhY3RpY2FsUGFyc2VyLmluc2VydFN5bWJvbChuZXcgdmMoTi50b1N0cmluZygpLE4pLHkpKX1jYXRjaChFKXt0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gIitOKX19cmV0dXJuIHRoaXMuc3ludGFjdGljYWxQYXJzZXIuZ3JhbW1hclRyZWV9fXZhciBYdj1uZXcgUms7ZnVuY3Rpb24geGsoZil7WHYucmVzZXQoKSx0aGlzLnRyZWU9WHYucGFyc2UoZiksdGhpcy5wYXRocz1bXTt2YXIgcz1PYmplY3QuY3JlYXRlKG51bGwpLHA9dGhpcyx3PU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5pc1NpbXBsZSx0aGlzLmlzQ29uc3QseSh0aGlzLnRyZWUpLE4odGhpcy50cmVlKSx0aGlzLnBhdGhzLmxlbmd0aD09PTAmJih0aGlzLmlzQ29uc3Q9ITApLHRoaXMuc2V0dGVyPWZ1bmN0aW9uKFIpe2Zvcih2YXIgRGU9cyxOdD0wO050PFIubGVuZ3RoLTE7TnQrKylEZVtSW050XV18fChEZVtSW050XV09T2JqZWN0LmNyZWF0ZShudWxsKSksRGU9RGVbUltOdF1dO3JldHVybntpc0NvbXBsZXRlZDpmdW5jdGlvbigpe2Zvcih2YXIgVXQgaW4gdylpZighd1tVdF0pcmV0dXJuITE7cmV0dXJuITB9LHNldDpmdW5jdGlvbihVdCl7aWYod1tSLmpvaW4oIi4iKV18fCh3W1Iuam9pbigiLiIpXT0hMCksRGVbUltOdF1dPVV0LHRoaXMuaXNDb21wbGV0ZWQoKSlyZXR1cm4gcC5leGVjKCl9fX0sdGhpcy52YWx1ZU9mPXRoaXMuZXhlYz1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4oMCxldmFsKShmKX0uY2FsbChzKX1jYXRjaChSKXt9fTtmdW5jdGlvbiBOKFIpe2Zvcih2YXIgRGU9UjtEZS5jaGlsZE5vZGVzLmxlbmd0aDw9MSYmRGUubmFtZSE9PSJNZW1iZXJFeHByZXNzaW9uIjspRGU9RGUuY2hpbGROb2Rlc1swXTtEZS5uYW1lPT09Ik1lbWJlckV4cHJlc3Npb24iP3AuaXNTaW1wbGU9ITA6cC5pc1NpbXBsZT0hMX1mdW5jdGlvbiB5KFIpe2lmKFIubmFtZT09PSJDYWxsRXhwcmVzc2lvbiImJlIuY2hpbGROb2Rlc1tSLmNoaWxkTm9kZXMubGVuZ3RoLTFdLm5hbWUhPT0iQ2FsbEV4cHJlc3Npb24iKXt2YXIgRGU9aChSLmNoaWxkTm9kZXNbMV0pO3koUi5jaGlsZE5vZGVzWzBdKX1lbHNlIGlmKFIubmFtZT09PSJOZXdFeHByZXNzaW9uIiYmUi5jaGlsZE5vZGVzLmxlbmd0aD09PTEpdmFyIERlPWgoUi5jaGlsZE5vZGVzWzBdKTtlbHNlIGlmKFIubmFtZT09PSJNZW1iZXJFeHByZXNzaW9uIiYmUi5jaGlsZE5vZGVzLmxlbmd0aD09PTEpdmFyIERlPWgoUik7ZWxzZSBmb3IodmFyIE50PTA7TnQ8Ui5jaGlsZE5vZGVzLmxlbmd0aDtOdCsrKXkoUi5jaGlsZE5vZGVzW050XSl9ZnVuY3Rpb24gaChSKXtpZihSLmNoaWxkTm9kZXNbMF0ubmFtZT09PSJJZGVudGlmaWVyTmFtZSIpe3ZhciBEZT1oKFIuY2hpbGROb2Rlc1syXSk7cmV0dXJuIERlJiYoRGU9RGUuY29uY2F0KFIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnRva2VuLnRvU3RyaW5nKCkpKSxFKERlKSxEZX1lbHNlIGlmKFIuY2hpbGROb2Rlc1swXS5uYW1lPT09IlByaW1hcnlFeHByZXNzaW9uIilpZihSLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5uYW1lPT09IklkZW50aWZpZXIiKXt2YXIgRGU9W1IuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnRva2VuLnRvU3RyaW5nKCldO3JldHVybiBFKERlKSxEZX1lbHNlIHJldHVybiBudWxsO2Vsc2V7aWYoUi5jaGlsZE5vZGVzWzBdLm5hbWU9PT0iXSIpcmV0dXJuIGgoUi5jaGlsZE5vZGVzWzNdKSx5KFIuY2hpbGROb2Rlc1sxXSksbnVsbDtpZihSLmNoaWxkTm9kZXNbMF0ubmFtZT09PSJBcmd1bWVudHMiKXJldHVybiB5KFIuY2hpbGROb2Rlc1swXSkseShSLmNoaWxkTm9kZXNbMV0pLG51bGw7Zm9yKHZhciBOdD0wO050PFIuY2hpbGROb2Rlcy5sZW5ndGg7TnQrKyl5KFIuY2hpbGROb2Rlc1tOdF0pfX1mdW5jdGlvbiBFKFIpe2Zvcih2YXIgRGU9cyxOdD0wO050PFIubGVuZ3RoLTE7TnQrKylEZVtSW050XV18fChEZVtSW050XV09T2JqZWN0LmNyZWF0ZShudWxsKSksRGU9RGVbUltOdF1dO3AucGF0aHMucHVzaChSKSx3W1Iuam9pbigiLiIpXT0hMX19ZnVuY3Rpb24gdWwoZil7dmFyIHM9Zi5jaGlsZE5vZGVzLnNsaWNlKCkucmV2ZXJzZSgpLHA9cy5maWx0ZXIoUj0+IVIudG9rZW58fCFSLnRva2VuLlB1bmN0dWF0b3IpO2lmKGYubmFtZT09PSJVbmFyeUV4cHJlc3Npb24iJiZzLmxlbmd0aD09PTImJnNbMF0ubmFtZT09PSItIiYmcC5sZW5ndGg9PT0xKXt2YXIgdz11bChwWzBdKTtyZXR1cm4gdy52YWx1ZT0tdy52YWx1ZSx3fWlmKGYubmFtZT09PSJBcmd1bWVudHMiKXtmb3IodmFyIE49W10seT1wWzBdO3k7KXkuY2hpbGROb2Rlcy5sZW5ndGg9PT0zJiYoTi51bnNoaWZ0KHkuY2hpbGROb2Rlc1swXSkseT15LmNoaWxkTm9kZXNbMl0pLHkuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiYoTi51bnNoaWZ0KHkuY2hpbGROb2Rlc1swXSkseT1udWxsKTtyZXR1cm57dHlwZToiQXJndW1lbnRzIixjaGlsZHJlbjpOLm1hcChSPT51bChSKSl9fWlmKHAmJnAubGVuZ3RoPT09MSl7dmFyIHc9dWwocFswXSk7cmV0dXJuIHd9aWYoZi50b2tlbiYmWyJOdWxsTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVtZXJpY0xpdGVyYWwiLCJTdHJpbmdMaXRlcmFsIiwiSWRlbnRpZmllciJdLnNvbWUoUj0+Zi50b2tlbltSXSkpe3ZhciBoPU9iamVjdC5rZXlzKGYudG9rZW4pLmZpbHRlcihSPT5SLm1hdGNoKC9MaXRlcmFsLyl8fFIubWF0Y2goL0lkZW50aWZpZXIvKSlbMF0sRT17TnVsbExpdGVyYWw6bnVsbCxCb29sZWFuTGl0ZXJhbDpCb29sZWFuKGYudG9rZW4pLE51bWVyaWNMaXRlcmFsOk51bWJlcihmLnRva2VuKSxTdHJpbmdMaXRlcmFsOmYudG9rZW4sSWRlbnRpZmllcjpmLnRva2VufVtoXTtyZXR1cm57dHlwZTpoLHZhbHVlOkV9fXJldHVybiBmLm5hbWU9PT0iQ2FsbEV4cHJlc3Npb24iP3t0eXBlOiJDYWxsRXhwcmVzc2lvbiIsY2hpbGRyZW46W3VsKHNbMF0pLHVsKHNbMV0pXX06e3R5cGU6cy5maWx0ZXIoUj0+Ui50b2tlbiYmUi50b2tlbi5QdW5jdHVhdG9yKVswXS5uYW1lLGNoaWxkcmVuOnMuZmlsdGVyKFI9PiFSLnRva2VufHwhUi50b2tlbi5QdW5jdHVhdG9yKS5tYXAoUj0+dWwoUikpfX1mdW5jdGlvbiBRdihmKXt2YXIgcz1uZXcgeGsoZik7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHVsKHMudHJlZSksbnVsbCl9ZnVuY3Rpb24gQmsoZixzKXtyZXR1cm4gcz09PSJiaW5kIiYmKGY9PT0iYmluZGluZ3gifHxmPT09ImJpbmRpbmciKX1mdW5jdGlvbiBlbShmKXtpZighZilyZXR1cm47dHJ5e2Y9SlNPTi5wYXJzZShmKX1jYXRjaChwKXt9bGV0IHM9e307aWYoYmkoZik/cy5vcmlnaW49ZjpmJiYocy5vcmlnaW49Zi5vcmlnaW4scy50cmFuc2Zvcm1lZD1mLnRyYW5zZm9ybWVkKSwhKCFzLnRyYW5zZm9ybWVkJiYhcy5vcmlnaW4pKXJldHVybiBzLnRyYW5zZm9ybWVkPXMudHJhbnNmb3JtZWR8fFF2KHMub3JpZ2luKSxzfWZ1bmN0aW9uIE1rKGYpe3JldHVybiBmJiYoZi5leGl0RXhwcmVzc2lvbj1lbShmLmV4aXRFeHByZXNzaW9uKSxmLnByb3BzJiZmLnByb3BzLmZvckVhY2gocz0+e3MuZXhwcmVzc2lvbj1lbShzLmV4cHJlc3Npb24pfSksZil9ZnVuY3Rpb24gTGsoZil7cmV0dXJuIGZ1bmN0aW9uKHM9e30pe2lmKEZuKGYpKXJldHVybiBmKHtzdGF0ZTpzLnN0YXRlPT09ImVuZCI/ImV4aXQiOnMuc3RhdGUsdDpzLnQhPT12b2lkIDA/cy50OnMuZGVsdGFUfSl9fWZ1bmN0aW9uIHRtKGYscyxwKXtyZXR1cm4gcCYmKEJrKGYscyk/ZnVuY3Rpb24odyxOPWZ1bmN0aW9uKCl7fSl7aWYoIXcpdGhyb3cgbmV3IEVycm9yKCJzaG91bGQgcGFzcyBvcHRpb25zIGZvciBiaW5kaW5nIik7cmV0dXJuIE1rKHcpLHAodyx3JiZ3LmV2ZW50VHlwZT09PSJ0aW1pbmciP0xrKE4pOk4pfTpwKX1mdW5jdGlvbiBEayhmLHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iLHt2YWx1ZTpzfSl9ZnVuY3Rpb24gbm0oZil7cmV0dXJuIGZbIltbQ3VycmVudEluc3RhbmNlSWRdXSJdfWZ1bmN0aW9uIEZrKGYscyxwKXtsZXQgdz1VcihmKTtyZXR1cm4hd3x8IUZuKHcuc2VuZCk/KGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCR7Zn0pLmApLG51bGwpOiguLi5OKT0+dy5zZW5kKCJtb2R1bGUiLHttb2R1bGU6cyxtZXRob2Q6cH0sTil9ZnVuY3Rpb24gVmsoZixzLHAsdyl7bGV0IE49VXIoZik7cmV0dXJuIU58fCFGbihOLnNlbmQpPyhjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZmluZCB0YXNrQ2VudGVyICgke2Z9KS5gKSxudWxsKTpGbih3KT95PT5OLnNlbmQoIm1vZHVsZSIse21vZHVsZTpzLG1ldGhvZDpwfSxbeV0pOihjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSAke3N9LiR7cH0gbXVzdCBiZSBhc3NpZ25lZCBhcyBhIGZ1bmN0aW9uLmApLG51bGwpfXZhciBndT1jbGFzc3tjb25zdHJ1Y3RvcihzLHApe0RrKHRoaXMsU3RyaW5nKHMpKSx0aGlzLmNvbmZpZz1wfHx7fSx0aGlzLmRvY3VtZW50PW5ldyBxbyhzLHRoaXMuY29uZmlnLmJ1bmRsZVVybCksdGhpcy5yZXF1aXJlTW9kdWxlPXRoaXMucmVxdWlyZU1vZHVsZS5iaW5kKHRoaXMpLHRoaXMuaW1wb3J0U2NyaXB0PXRoaXMuaW1wb3J0U2NyaXB0LmJpbmQodGhpcyksdGhpcy5pc1JlZ2lzdGVyZWRNb2R1bGU9dXUsdGhpcy5pc1JlZ2lzdGVyZWRDb21wb25lbnQ9TmZ9cmVxdWlyZU1vZHVsZShzKXtsZXQgcD1ubSh0aGlzKTtpZighKHAmJnRoaXMuZG9jdW1lbnQmJnRoaXMuZG9jdW1lbnQudGFza0NlbnRlcikpe2NvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byByZXF1aXJlTW9kdWxlKCIke3N9IiksIGluc3RhbmNlICgke3B9KSBkb2Vzbid0IGV4aXN0IGFueW1vcmUuYCk7cmV0dXJufWlmKCF1dShzKSl7Y29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSBcdTVGNTNcdTUyNERcdThGRDBcdTg4NENcdTc2ODRcdTU3RkFcdTVFQTdcdTRFMERcdTUzMDVcdTU0MkJcdTUzOUZcdTc1MUZcdTYzRDJcdTRFRjZbJHtzfV1cdUZGMENcdThCRjdcdTU3MjhtYW5pZmVzdFx1NEUyRFx1OTE0RFx1N0Y2RVx1OEJFNVx1NjNEMlx1NEVGNlx1RkYwQ1x1OTFDRFx1NjVCMFx1NTIzNlx1NEY1Q1x1NTMwNVx1NjJFQ1x1OEJFNVx1NTM5Rlx1NzUxRlx1NjNEMlx1NEVGNlx1NzY4NFx1ODFFQVx1NUI5QVx1NEU0OVx1OEZEMFx1ODg0Q1x1NTdGQVx1NUVBN2ApO3JldHVybn1sZXQgdz17fSxOPWZ2KHMpO2ZvcihsZXQgeSBpbiBOKU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3LHkse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+dG0ocyx5LEZrKHAscyx5KSksc2V0Omg9PlZrKHAscyx5LGgpfSk7cmV0dXJuIHd9c3VwcG9ydHMocyl7aWYoIWJpKHMpKXJldHVybiBudWxsO2xldCBwPXMubWF0Y2goL15AKFx3KylcLyhbXHctXSspKFwuKFx3KykpPyQvaSk7aWYocCl7bGV0IHc9cFsxXSxOPXBbMl0seT1wWzRdO3N3aXRjaCh3KXtjYXNlIm1vZHVsZSI6cmV0dXJuIHV1KE4seSk7Y2FzZSJjb21wb25lbnQiOnJldHVybiBOZihOKX19cmV0dXJuIG51bGx9aW1wb3J0U2NyaXB0KHMscD17fSl7bGV0IHc9bm0odGhpcyksTj1Vcih3KTtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oeSxoKXtpZighTnx8IUZuKE4uc2VuZCkpcmV0dXJuIGgobmV3IEVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gaW1wb3J0IHNjcmlwdCAiJHtzfSIsIG5vIHRhc2tDZW50ZXIgKCR7d30pIG1hdGNoZWQuYCkpO3RyeXtOLnNlbmQoIm1vZHVsZSIse21vZHVsZToic2NyaXB0IixtZXRob2Q6ImltcG9ydFNjcmlwdCJ9LFtzLHBdLHtjYWxsYmFjazpbRT0+eShFKSxFPT5oKEUpXX0pfWNhdGNoKEUpe2goRSl9fSl9fTtmdW5jdGlvbiBVayhmLHMpe2xldCBwPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIHAuc2VydmljZT1PYmplY3QuY3JlYXRlKG51bGwpLGtzLmZvckVhY2goKHtuYW1lOncsb3B0aW9uczpOfSk9PntsZXQgeT1OLmNyZWF0ZTtpZih5KXRyeXtsZXQgaD15KGYscyk7SGkocC5zZXJ2aWNlLGgpLEhpKHAsaC5pbnN0YW5jZSl9Y2F0Y2goaCl7Y29uc29sZS5lcnJvcihgW0pTIFJ1bnRpbWVdIEZhaWxlZCB0byBjcmVhdGUgc2VydmljZSAke3d9LmApfX0pLGRlbGV0ZSBwLnNlcnZpY2UuaW5zdGFuY2UsT2EocC5zZXJ2aWNlKSxwfXZhciAkaz17dWlkOjB9LEhrPUpwKGhjKSxqaz1xcChoYyk7ZnVuY3Rpb24gcm0oZixzLHApe2xldCB3PW5ldyBndShmLHMpLE49IlZ1ZSIseT1VayhmLHt3ZWV4OncsbnZ1ZTp3LGNvbmZpZzpzLGNyZWF0ZWQ6RGF0ZS5ub3coKSxmcmFtZXdvcms6Tn0pO09hKHkpO2xldCBoPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEhpKGgsS2sodykpLEhpKGgseSx7U2hhcmVkT2JqZWN0OiRrLHdlZXg6dyxudnVlOncscmVxdWlyZU1vZHVsZTpFPT53LnJlcXVpcmVNb2R1bGUoRSksX19XRUVYX0NBTExfSkFWQVNDUklQVF9fOlBmLHNlcnZpY2VzOnl9KSxoLnBsdXM9bmV3IGguV2VleFBsdXModyksaC5WdWVTaGFyZWQ9aGMsaC5VbmlTaGFyZWQ9SGssaC5WdWVSZWFjdGl2aXR5PWprLHp2KGYsaCksT2EoaCksaH1mdW5jdGlvbiB6ayhmLHMscD17fSl7bGV0IHc9IlZ1ZSI7cD1wZihwKSxwLmVudj1wZihnbG9iYWwuV1hFbnZpcm9ubWVudHx8e30pLHAuYnVuZGxlVHlwZT13O2xldCBOPXJtKGYscCk7V2socyxOKX1mdW5jdGlvbiBXayhmLHMpe2xldCBwPVtdLHc9W107Zm9yKGxldCBoIGluIHMpcC5wdXNoKGgpLHcucHVzaChzW2hdKTtsZXQgeT0iKGZ1bmN0aW9uIChnbG9iYWwpIHsgIitgCmdsb2JhbCA9IChmdW5jdGlvbiAoKSB7CiAgdmFyIGcKICAvLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZQogIGcgPSAoZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXMKICB9KSgpCiAgdHJ5IHsKICAgIC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKQogICAgZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCkKICB9IGNhdGNoIChlKSB7CiAgICAvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZQogICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiKSBnID0gd2luZG93CiAgfQogIHJldHVybiBnCn0pKCkgfHwgZ2xvYmFsOwpgK2YrIiB9KShPYmplY3QuY3JlYXRlKHRoaXMpKSI7cmV0dXJuIG5ldyBGdW5jdGlvbiguLi5wLHkpKC4uLncpfWZ1bmN0aW9uIEdrKGYpe2xldCBzPXJzKGYpO3RyeXtpZihzJiZzLmJvZHkpcmV0dXJuIHMuYm9keS50b0pTT04oKX1jYXRjaChwKXtjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZ2V0IHRoZSB2aXJ0dWFsIGRvbSB0cmVlLiIpO3JldHVybn19ZnVuY3Rpb24gWWsoZil7VnAoZiksa3MuZm9yRWFjaChzPT57bGV0IHA9cy5vcHRpb25zLmRlc3Ryb3k7cCYmcChmKX0pfWZ1bmN0aW9uIHFrKGYpe1VwKGYpLGtzLmZvckVhY2gocz0+e2xldCBwPXMub3B0aW9ucy5yZWZyZXNoO3AmJnAoZil9KX12YXIgSms9e2NyZWF0ZUluc3RhbmNlOnprLGNyZWF0ZUluc3RhbmNlQ29udGV4dDpybSxnZXRSb290OkdrLGdldERvY3VtZW50OnJzLHJlZ2lzdGVyU2VydmljZTpmdSx1bnJlZ2lzdGVyU2VydmljZTpkdSxjYWxsSlMoZixzKXtyZXR1cm4gUGYoZixzKX0scmVnaXN0ZXJDb21wb25lbnRzOmR2LHJlZ2lzdGVyTW9kdWxlczp1dixkZXN0cm95SW5zdGFuY2U6WWsscmVmcmVzaEluc3RhbmNlOnFrfTtmdW5jdGlvbiBWZigpe3JldHVybiBjdigpLEprfWZ1bmN0aW9uIEtrKGYpe2lmKGdsb2JhbC5zZXRUaW1lb3V0JiZnbG9iYWwuc2V0SW50ZXJ2YWwpcmV0dXJue3NldFRpbWVvdXQ6Z2xvYmFsLnNldFRpbWVvdXQsc2V0SW50ZXJ2YWw6Z2xvYmFsLnNldEludGVydmFsLGNsZWFyVGltZW91dDpnbG9iYWwuY2xlYXJUaW1lb3V0LGNsZWFySW50ZXJ2YWw6Z2xvYmFsLmNsZWFySW50ZXJ2YWx9O2xldCBzPWYucmVxdWlyZU1vZHVsZSgidGltZXIiKTtyZXR1cm57c2V0VGltZW91dDooLi4udyk9PntsZXQgTj1mdW5jdGlvbigpe3dbMF0oLi4udy5zbGljZSgyKSl9O3JldHVybiBzLnNldFRpbWVvdXQoTix3WzFdKSxmLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKCl9LHNldEludGVydmFsOiguLi53KT0+e2xldCBOPWZ1bmN0aW9uKCl7d1swXSguLi53LnNsaWNlKDIpKX07cmV0dXJuIHMuc2V0SW50ZXJ2YWwoTix3WzFdKSxmLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKCl9LGNsZWFyVGltZW91dDp3PT57cy5jbGVhclRpbWVvdXQodyl9LGNsZWFySW50ZXJ2YWw6dz0+e3MuY2xlYXJJbnRlcnZhbCh3KX19fXZhciBpbT17RG9jdW1lbnQ6cW8sRWxlbWVudDpubyxDb21tZW50OmNsLExpc3RlbmVyOlVsLFRhc2tDZW50ZXI6Vmwsc2VuZFRhc2tzKC4uLmYpe3JldHVybiBGbihjYWxsTmF0aXZlKT9jYWxsTmF0aXZlKC4uLmYpOihnbG9iYWwuY2FsbE5hdGl2ZXx8KCgpPT57fSkpKC4uLmYpfX07cW8uaGFuZGxlcj1pbS5zZW5kVGFza3M7dmFyIGZsPWltO2Z1bmN0aW9uIFprKCl7T2EoZmwuQ29tbWVudCksT2EoZmwuTGlzdGVuZXIpLE9hKGZsLkRvY3VtZW50LnByb3RvdHlwZSksT2EoZmwuQ29tbWVudC5wcm90b3R5cGUpLE9hKGZsLkxpc3RlbmVyLnByb3RvdHlwZSl9dmFyIHB1PXtzZXJ2aWNlOntyZWdpc3RlcjpmdSx1bnJlZ2lzdGVyOmR1LGhhczprZn0sZnJlZXplUHJvdG90eXBlOlprLGluaXQ6VmYsY29uZmlnOmZsfTt2YXIgVWY9Y2xhc3N7Y29uc3RydWN0b3IocyxwPXt9KXt0aGlzLnR5cGU9c3x8Im1lc3NhZ2UiLHRoaXMuZGF0YT1wLmRhdGF8fG51bGwsdGhpcy5vcmlnaW49cC5vcmlnaW58fCIiLHRoaXMuc291cmNlPXAuc291cmNlfHxudWxsLHRoaXMucG9ydHM9cC5wb3J0c3x8W10sdGhpcy50YXJnZXQ9bnVsbCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfX07dmFyIFJzPXt9LG1jPXt9O2Z1bmN0aW9uICRmKCl7fSRmLnByb3RvdHlwZS5wb3N0TWVzc2FnZT1mdW5jdGlvbihmKXtpZih0aGlzLl9jbG9zZWQpdGhyb3cgbmV3IEVycm9yKGBCcm9hZGNhc3RDaGFubmVsICIke3RoaXMubmFtZX0iIGlzIGNsb3NlZC5gKTtsZXQgcz1Sc1t0aGlzLm5hbWVdO2lmKHMmJnMubGVuZ3RoKWZvcihsZXQgcD0wO3A8cy5sZW5ndGg7KytwKXtsZXQgdz1zW3BdO3cuX2Nsb3NlZHx8dz09PXRoaXN8fEZuKHcub25tZXNzYWdlKSYmdy5vbm1lc3NhZ2UobmV3IFVmKCJtZXNzYWdlIix7ZGF0YTpmfSkpfX07JGYucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Nsb3NlZCYmKHRoaXMuX2Nsb3NlZD0hMCxSc1t0aGlzLm5hbWVdKSl7bGV0IGY9UnNbdGhpcy5uYW1lXS5maWx0ZXIocz0+cyE9PXRoaXMpO2YubGVuZ3RoP1JzW3RoaXMubmFtZV09ZjpkZWxldGUgUnNbdGhpcy5uYW1lXX19O3ZhciBvbT17Y3JlYXRlOmY9PntpZihtY1tmXT1bXSxGbihnbG9iYWwuQnJvYWRjYXN0Q2hhbm5lbCkpcmV0dXJue307bGV0IHM9e0Jyb2FkY2FzdENoYW5uZWw6ZnVuY3Rpb24ocCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm5hbWUiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMSx2YWx1ZTpTdHJpbmcocCl9KSx0aGlzLl9jbG9zZWQ9ITEsdGhpcy5vbm1lc3NhZ2U9bnVsbCxSc1t0aGlzLm5hbWVdfHwoUnNbdGhpcy5uYW1lXT1bXSksUnNbdGhpcy5uYW1lXS5wdXNoKHRoaXMpLG1jW2ZdLnB1c2godGhpcyl9fTtyZXR1cm4gcy5Ccm9hZGNhc3RDaGFubmVsLnByb3RvdHlwZT0kZi5wcm90b3R5cGUse2luc3RhbmNlOnN9fSxkZXN0cm95OmY9PnttY1tmXSYmKG1jW2ZdLmZvckVhY2gocz0+cy5jbG9zZSgpKSxkZWxldGUgbWNbZl0pfX07ZnVuY3Rpb24gSGYoKXtsZXR7aW5pdDpmfT1wdTtwdS5zZXJ2aWNlLnJlZ2lzdGVyKCJCcm9hZGNhc3RDaGFubmVsIixvbSkscHUuZnJlZXplUHJvdG90eXBlKCk7bGV0IHM9ZigpO2ZvcihsZXQgcCBpbiBzKWdsb2JhbFtwXT0oLi4udyk9PntsZXQgTj1zW3BdKC4uLncpO3JldHVybiBOIGluc3RhbmNlb2YgRXJyb3ImJmNvbnNvbGUuZXJyb3IoTi50b1N0cmluZygpKSxOfX12YXIgSEI9Z2xvYmFsLmNvbnNvbGU7ZnVuY3Rpb24gYW0oKXtpZihacCgpLGdsb2JhbC5XWEVudmlyb25tZW50JiZnbG9iYWwuV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSE9PSJXZWIiKWdsb2JhbC5jb25zb2xlPXtkZWJ1ZzooLi4uZik9PntucigiZGVidWciKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi5fYyhmKSwiX19ERUJVRyIpfSxsb2c6KC4uLmYpPT57bnIoImxvZyIpJiZnbG9iYWwubmF0aXZlTG9nKC4uLl9jKGYpLCJfX0xPRyIpfSxpbmZvOiguLi5mKT0+e25yKCJpbmZvIikmJmdsb2JhbC5uYXRpdmVMb2coLi4uX2MoZiksIl9fSU5GTyIpfSx3YXJuOiguLi5mKT0+e25yKCJ3YXJuIikmJmdsb2JhbC5uYXRpdmVMb2coLi4uX2MoZiksIl9fV0FSTiIpfSxlcnJvcjooLi4uZik9PntucigiZXJyb3IiKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi5fYyhmKSwiX19FUlJPUiIpfX07ZWxzZXtsZXR7ZGVidWc6Zixsb2c6cyxpbmZvOnAsd2Fybjp3LGVycm9yOk59PWNvbnNvbGU7Y29uc29sZS5fX29yaV9fPXtkZWJ1ZzpmLGxvZzpzLGluZm86cCx3YXJuOncsZXJyb3I6Tn0sY29uc29sZS5kZWJ1Zz0oLi4ueSk9PntucigiZGVidWciKSYmY29uc29sZS5fX29yaV9fLmRlYnVnLmFwcGx5KGNvbnNvbGUseSl9LGNvbnNvbGUubG9nPSguLi55KT0+e25yKCJsb2ciKSYmY29uc29sZS5fX29yaV9fLmxvZy5hcHBseShjb25zb2xlLHkpfSxjb25zb2xlLmluZm89KC4uLnkpPT57bnIoImluZm8iKSYmY29uc29sZS5fX29yaV9fLmluZm8uYXBwbHkoY29uc29sZSx5KX0sY29uc29sZS53YXJuPSguLi55KT0+e25yKCJ3YXJuIikmJmNvbnNvbGUuX19vcmlfXy53YXJuLmFwcGx5KGNvbnNvbGUseSl9LGNvbnNvbGUuZXJyb3I9KC4uLnkpPT57bnIoImVycm9yIikmJmNvbnNvbGUuX19vcmlfXy5lcnJvci5hcHBseShjb25zb2xlLHkpfX19ZnVuY3Rpb24gX2MoZil7cmV0dXJuIGYubWFwKHM9PntpZihNYShzKS50b0xvd2VyQ2FzZSgpPT09IltvYmplY3Qgb2JqZWN0XSIpdHJ5e3M9SlNPTi5zdHJpbmdpZnkocyl9Y2F0Y2godyl7cz0iW29iamVjdCBvYmplY3RdIn1lbHNlIHM9U3RyaW5nKHMpO3JldHVybiBzfSl9YW0oKTtIZigpO30pKCk7Cg== \ No newline at end of file diff --git a/UniMPSDK/Core/Resources/uni-jsframework.js b/UniMPSDK/Core/Resources/uni-jsframework.js index 2079b404663d9814f02fd9b290cca65c42a69cb8..08c1c6bea808ca967308714175765302c986ce43 100644 --- a/UniMPSDK/Core/Resources/uni-jsframework.js +++ b/UniMPSDK/Core/Resources/uni-jsframework.js @@ -1,2 +1,2 @@ -//{"version":"3.99","encode":"base64"} -dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fPURhdGUubm93KCksZ2xvYmFsPXRoaXMscHJvY2Vzcz17ZW52Ont9fSxzZXRUaW1lb3V0PWdsb2JhbC5zZXRUaW1lb3V0OyFmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/dCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOnQoKX0oMCxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgc3VidmVyc2lvbj17ZnJhbWV3b3JrOiIwLjI5LjYiLHRyYW5zZm9ybWVyOiI+PTAuMS41IDwwLjUifTtmdW5jdGlvbiBnZXRIb29rS2V5KGUsdCxuKXtyZXR1cm4gdCsiQCIrbisiIyIrZX12YXIgQ2FsbGJhY2tNYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuaW5zdGFuY2VJZD1TdHJpbmcoZSksdGhpcy5sYXN0Q2FsbGJhY2tJZD0wLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319O0NhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkKyssdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF09ZSx0aGlzLmxhc3RDYWxsYmFja0lkfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNhbGxiYWNrc1tlXTtyZXR1cm4gZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2VdLHR9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWdldEhvb2tLZXkoZSx0LG4pO3RoaXMuaG9va3NbaV0mJmNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gT3ZlcnJpZGUgYW4gZXhpc3RpbmcgY29tcG9uZW50IGhvb2sgIicraSsnIi4nKSx0aGlzLmhvb2tzW2ldPXJ9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUudHJpZ2dlckhvb2s9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9Z2V0SG9va0tleShlLHQsbiksbz10aGlzLmhvb2tzW2ldO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXJldHVybiBjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGhvb2sgZnVuY3Rpb24gdHlwZSAoIit0eXBlb2YgbysnKSBvbiAiJytpKyciLicpLG51bGw7dmFyIGE9bnVsbDt0cnl7YT1vLmFwcGx5KG51bGwscnx8W10pfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBob29rIGZ1bmN0aW9uIG9uICInK2krJyIuJyksZX1yZXR1cm4gYX0sQ2FsbGJhY2tNYW5hZ2VyLnByb3RvdHlwZS5jb25zdW1lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmNhbGxiYWNrc1tlXTtpZih2b2lkIDAhPT1uJiYhMSE9PW58fGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tlXSwiZnVuY3Rpb24iPT10eXBlb2Ygcil0cnl7cmV0dXJuIHIuY2FsbChudWxsLHQsbil9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOlxuICIrZS50b1N0cmluZygpKSxlfXJldHVybiBuZXcgRXJyb3IoJ2ludmFsaWQgY2FsbGJhY2sgaWQgIicrZSsnIicpfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX07dmFyIG5leHROb2RlUmVmPTE7ZnVuY3Rpb24gdW5pcXVlSWQoKXtyZXR1cm4obmV4dE5vZGVSZWYrKykudG9TdHJpbmcoKX1mdW5jdGlvbiB0eXBvZihlKXt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc3Vic3RyaW5nKDgsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBoYXNPd24oZSx0KXtyZXR1cm4gaXNQbGFpbk9iamVjdChlKSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ZnVuY3Rpb24gYnVmZmVyVG9CYXNlNjQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGJ0b2EpcmV0dXJuIiI7dmFyIHQ9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGUpLGZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSkuam9pbigiIik7cmV0dXJuIGJ0b2EodCl9ZnVuY3Rpb24gaXNFbXB0eShlKXtpZighZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiEwO2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfXZhciBMRVZFTFM9WyJvZmYiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwibG9nIiwiZGVidWciXSxsZXZlbE1hcD17fTtmdW5jdGlvbiBnZW5lcmF0ZUxldmVsTWFwKCl7TEVWRUxTLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49TEVWRUxTLmluZGV4T2YodCk7bGV2ZWxNYXBbdF09e30sTEVWRUxTLmZvckVhY2goZnVuY3Rpb24oZSl7TEVWRUxTLmluZGV4T2YoZSk8PW4mJihsZXZlbE1hcFt0XVtlXT0hMCl9KX0pfWZ1bmN0aW9uIGNoZWNrTGV2ZWwoZSl7dmFyIHQ9Z2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsfHwibG9nIjtyZXR1cm4gbGV2ZWxNYXBbdF0mJmxldmVsTWFwW3RdW2VdfWZ1bmN0aW9uIGRlYnVnTG9nKGUpe2dsb2JhbC5uYXRpdmVMb2coInd4SW50ZXJhY3Rpb25BbmFseXplcjogW2pzZm1dIitlLCJfX0RFQlVHIil9dmFyIGRvY01hcD17fTtmdW5jdGlvbiBhZGREb2MoZSx0KXtlJiYoZG9jTWFwW2VdPXQpfWZ1bmN0aW9uIGdldERvYyhlKXtyZXR1cm4gZG9jTWFwW2VdfWZ1bmN0aW9uIHJlbW92ZURvYyhlKXtkZWxldGUgZG9jTWFwW2VdfWZ1bmN0aW9uIGdldFRhc2tDZW50ZXIoZSl7dmFyIHQ9ZG9jTWFwW2VdO3JldHVybiB0JiZ0LnRhc2tDZW50ZXI/dC50YXNrQ2VudGVyOm51bGx9ZnVuY3Rpb24gYXBwZW5kQm9keShlLHQsbil7dmFyIHI9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoISgwPHIucHVyZUNoaWxkcmVuLmxlbmd0aHx8dC5wYXJlbnROb2RlKSl7dmFyIGk9ci5jaGlsZHJlbixvPWkuaW5kZXhPZihuKTtvPDA/aS5wdXNoKHQpOmkuc3BsaWNlKG8sMCx0KSwxPT09dC5ub2RlVHlwZT8oImJvZHkiPT09dC5yb2xlPyh0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUsdC5wYXJlbnROb2RlPXIsbGlua1BhcmVudCh0LHIpKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksc2V0Qm9keShlLHQpLHQuZG9jSWQ9ZS5pZCx0Lm93bmVyRG9jdW1lbnQ9ZSxsaW5rUGFyZW50KHQsciksZGVsZXRlIGUubm9kZU1hcFt0Lm5vZGVJZF0pLHIucHVyZUNoaWxkcmVuLnB1c2godCksc2VuZEJvZHkoZSx0KSk6KHQucGFyZW50Tm9kZT1yLGUubm9kZU1hcFt0LnJlZl09dCksdC5yZWFkeT0hMCx0LmNvbXB1dGVDbGFzc0xpc3QmJnQuY29tcHV0ZUNsYXNzTGlzdCgpfX1mdW5jdGlvbiBzZW5kQm9keShlLHQpe3ZhciBuPXQudG9KU09OKCk7ZSYmZS50YXNrQ2VudGVyJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50YXNrQ2VudGVyLnNlbmQmJmUudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUJvZHkifSxbbl0pfWZ1bmN0aW9uIHNldEJvZHkoZSx0KXt0LnJvbGU9ImJvZHkiLHQuZGVwdGg9MSxkZWxldGUgZS5ub2RlTWFwW3Qubm9kZUlkXSx0LnJlZj0iX3Jvb3QiLGUubm9kZU1hcC5fcm9vdD10LGUuYm9keT10fWZ1bmN0aW9uIGxpbmtQYXJlbnQodCxlKXsodC5wYXJlbnROb2RlPWUpLmRvY0lkJiYodC5kb2NJZD1lLmRvY0lkLHQub3duZXJEb2N1bWVudD1lLm93bmVyRG9jdW1lbnQsKHQub3duZXJEb2N1bWVudC5ub2RlTWFwW3Qubm9kZUlkXT10KS5kZXB0aD1lLmRlcHRoKzEpLHQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtsaW5rUGFyZW50KGUsdCl9KX1mdW5jdGlvbiBuZXh0RWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIHByZXZpb3VzRWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUucHJldmlvdXNTaWJsaW5nfX1mdW5jdGlvbiBpbnNlcnRJbmRleChlLHQsbixyKXtuPDAmJihuPTApO3ZhciBpPXRbbi0xXSxvPXRbbl07cmV0dXJuIHQuc3BsaWNlKG4sMCxlKSxyJiYoaSYmKGkubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9aSwoZS5uZXh0U2libGluZz1vKSYmKG8ucHJldmlvdXNTaWJsaW5nPWUpKSxufWZ1bmN0aW9uIG1vdmVJbmRleChlLHQsbixyKXt2YXIgaT10LmluZGV4T2YoZSk7aWYoaTwwKXJldHVybi0xO2lmKHIpe3ZhciBvPXRbaS0xXSxhPXRbaSsxXTtvJiYoby5uZXh0U2libGluZz1hKSxhJiYoYS5wcmV2aW91c1NpYmxpbmc9byl9dC5zcGxpY2UoaSwxKTt2YXIgcz1uO2k8PW4mJihzPW4tMSk7dmFyIGM9dFtzLTFdLHU9dFtzXTtyZXR1cm4gdC5zcGxpY2UocywwLGUpLHImJihjJiYoYy5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1jLChlLm5leHRTaWJsaW5nPXUpJiYodS5wcmV2aW91c1NpYmxpbmc9ZSkpLGk9PT1zPy0xOm59ZnVuY3Rpb24gcmVtb3ZlSW5kZXgoZSx0LG4pe3ZhciByPXQuaW5kZXhPZihlKTtpZighKHI8MCkpe2lmKG4pe3ZhciBpPXRbci0xXSxvPXRbcisxXTtpJiYoaS5uZXh0U2libGluZz1vKSxvJiYoby5wcmV2aW91c1NpYmxpbmc9aSl9dC5zcGxpY2UociwxKX19dmFyIE5vZGU9ZnVuY3Rpb24oKXt0aGlzLm5vZGVJZD11bmlxdWVJZCgpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGx9LEVsZW1lbnQkMjtmdW5jdGlvbiBzZXRFbGVtZW50KGUpe0VsZW1lbnQkMj1lfU5vZGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT1nZXREb2ModGhpcy5kb2NJZCk7ZSYmKGRlbGV0ZSB0aGlzLmRvY0lkLGRlbGV0ZSBlLm5vZGVNYXBbdGhpcy5ub2RlSWRdKSx0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kZXN0cm95KCl9KX07dmFyIHJlZ2lzdGVyZWRFbGVtZW50cz17fTtmdW5jdGlvbiByZWdpc3RlckVsZW1lbnQoaSxlKXtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCl7dmFyIHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj10fShFbGVtZW50JDIpO2UuZm9yRWFjaChmdW5jdGlvbihyKXt0LnByb3RvdHlwZVtyXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2lmKG4pcmV0dXJuIG4uc2VuZCgiY29tcG9uZW50Iix7cmVmOnRoaXMucmVmLGNvbXBvbmVudDppLG1ldGhvZDpyfSxlKX19KSxyZWdpc3RlcmVkRWxlbWVudHNbaV09dH19ZnVuY3Rpb24gZ2V0V2VleEVsZW1lbnQoZSl7cmV0dXJuIHJlZ2lzdGVyZWRFbGVtZW50c1tlXX1mdW5jdGlvbiBjYWNoZWQodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgcGFyc2VTdHlsZVRleHQ9Y2FjaGVkKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KSxmaXJzdExldHRlclRvTG93ZXJDYXNlPWNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKStlLnNsaWNlKDEpfSk7ZnVuY3Rpb24gaXNEZWYoZSl7cmV0dXJuIHZvaWQgMCE9PWV9ZnVuY3Rpb24gaXNGbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX12YXIgX3RvU3RyaW5nPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gdG9SYXdUeXBlKGUpe3JldHVybiBfdG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKX1mdW5jdGlvbiBoYXNMaWZlY3ljbGVIb29rKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmxlbmd0aH12YXIgcHJvY2Vzc29ycz17c2xpZGVyOntjaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJue2luZGV4OmUuaW5kZXgsc291cmNlOmUuc291cmNlfX0sc2Nyb2xsOmZ1bmN0aW9uKGUpe3JldHVybntvZmZzZXRYUmF0aW86ZS5vZmZzZXRYUmF0aW8sb2Zmc2V0WVJhdGlvOmUub2Zmc2V0WVJhdGlvLGRyYWc6ZS5kcmFnfX19LCJzY3JvbGwtdmlldyI6e3Njcm9sbGVuZDpmdW5jdGlvbihlKXtyZXR1cm57Y29udGVudE9mZnNldDplLmNvbnRlbnRPZmZzZXR9fX19O2Z1bmN0aW9uIHByb2Nlc3NUYXJnZXQoZSl7dmFyIHQ9ZS5hdHRyLG49ZS5vZmZzZXRMZWZ0LHI9ZS5vZmZzZXRUb3AsaT17fTtyZXR1cm4gT2JqZWN0LmtleXModHx8e30pLmZvckVhY2goZnVuY3Rpb24oZSl7MD09PWUuaW5kZXhPZigiZGF0YSIpJiYoaVtmaXJzdExldHRlclRvTG93ZXJDYXNlKGUucmVwbGFjZSgiZGF0YSIsIiIpKV09dFtlXSl9KSx7aWQ6dCYmdC5pZHx8IiIsZGF0YXNldDppLG9mZnNldExlZnQ6bnx8MCxvZmZzZXRUb3A6cnx8MH19ZnVuY3Rpb24gcHJvY2Vzc0N1c3RvbUV2ZW50KGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KSxuPXByb2Nlc3NUYXJnZXQobikse3R5cGU6ZSx0aW1lU3RhbXA6RGF0ZS5ub3coKSx0YXJnZXQ6bixjdXJyZW50VGFyZ2V0Om4sZGV0YWlsOnR9fXZhciBXRUVYX1RBR1M9WyJhIiwiZGl2IiwibGlzdCIsImNlbGwiLCJsb2FkaW5nIiwicmVmcmVzaCIsInJlY3ljbGUtbGlzdCIsInNjcm9sbGVyIiwiaW5kaWNhdG9yIiwid2F0ZXJmYWxsIiwid2ViIiwicmljaHRleHQiXSxJR05PUkVfRVZFTlRTPVsidmlld2FwcGVhciIsInZpZXdkaXNhcHBlYXIiLCJpdGVtY2xpY2siXSxFVkVOVF9FWFRSQVM9e21hcmtlcnRhcDpbIm1hcmtlcklkIl0sY29udHJvbHRhcDpbImNvbnRyb2xJZCJdLHJlZ2lvbmNoYW5nZTpbImNhdXNlZEJ5Il0sZW5kOlsiY2F1c2VkQnkiXSxhcHBlYXI6WyJkaXJlY3Rpb24iXSxkaXNhcHBlYXI6WyJkaXJlY3Rpb24iXX07ZnVuY3Rpb24gcHJvY2Vzc0V2ZW50KHQsZSl7dmFyIG49dC50eXBlO2lmKC0xIT09SUdOT1JFX0VWRU5UUy5pbmRleE9mKG4pKXJldHVybiB0O3ZhciByPXQuY3VycmVudFRhcmdldCxpPXIudHlwZS5yZXBsYWNlKCJ1LSIsIiIpO2lmKC0xIT09V0VFWF9UQUdTLmluZGV4T2YoaSkpcmV0dXJuIHQ7dmFyIG89dC50aW1lc3RhbXAsYT10LnRhcmdldDtpZighaXNEZWYoZSkpe3ZhciBzPXByb2Nlc3NvcnNbaV07ZT1zJiZpc0ZuKHNbbl0pP3Nbbl0odCk6dC5kZXRhaWx8fHt9fXZhciBjPXt0eXBlOm4sdGltZVN0YW1wOm8sdGFyZ2V0OnByb2Nlc3NUYXJnZXQoYSksY3VycmVudFRhcmdldDpwcm9jZXNzVGFyZ2V0KHIpLGRldGFpbDplLHRvdWNoZXM6InRvdWNoZW5kIj09PW58fCJwYW5lbmQiPT09bj9bXTp0LmNoYW5nZWRUb3VjaGVzLGNoYW5nZWRUb3VjaGVzOnQuY2hhbmdlZFRvdWNoZXN9O3QuY29tcG9uZW50SWQmJihjLmNvbXBvbmVudElkPXQuY29tcG9uZW50SWQpO3ZhciB1PUVWRU5UX0VYVFJBU1tuXTtyZXR1cm4gdSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuaGFzT3duUHJvcGVydHkoZSkmJihjW2VdPXRbZV0pfSksY312YXIgQkFTRV9ERVZJQ0VfV0lEVEg9NzUwLGRldmljZURQUj0xLGRldmljZVdpZHRoPTA7ZnVuY3Rpb24gdXB4MnB4KGUsdCl7aWYoMD09PWRldmljZVdpZHRoJiYoZGV2aWNlRFBSPWdsb2JhbC5XWEVudmlyb25tZW50LnNjYWxlLGRldmljZVdpZHRoPU1hdGguY2VpbChnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aC9kZXZpY2VEUFIpKSwwPT09KGU9TnVtYmVyKGUpKSlyZXR1cm4gMDt2YXIgbj1lL0JBU0VfREVWSUNFX1dJRFRIKih0fHxkZXZpY2VXaWR0aCkscj1uLnRvU3RyaW5nKCkuc3BsaXQoIi4iKTtyZXR1cm4gMj09PXIubGVuZ3RoPyhyWzFdPXJbMV0uc3Vic3RyaW5nKDAsMiksTnVtYmVyKHIuam9pbigiLiIpKSk6bn12YXIgVU5JVF9SRT0vKFsrLV0/XGQrKFwuXGQrKT8pW3J8dV1weC9nO2Z1bmN0aW9uIG5vcm1hbGl6ZVVuaXQobil7cmV0dXJuIGdsb2JhbC5XWEVudmlyb25tZW50LmR5bmFtaWNScHh8fCJPYmplY3QiIT09dHlwb2Yobil8fE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTsic3RyaW5nIj09dHlwZW9mIHQmJihuW2VdPXQucmVwbGFjZShVTklUX1JFLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVweDJweCh0KX0pKX0pLG59ZnVuY3Rpb24gZGVlcENsb25lKGUsaSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uIGUodCl7dmFyIG49dC5jaGlsZHJlbiYmdC5jaGlsZHJlbi5tYXAoZSkscj1pKHQudGFnLHQuZGF0YSxuKTtyZXR1cm4gci50ZXh0PXQudGV4dCxyLmlzQ29tbWVudD10LmlzQ29tbWVudCxyLmNvbXBvbmVudE9wdGlvbnM9dC5jb21wb25lbnRPcHRpb25zLHIuZWxtPXQuZWxtLHIuY29udGV4dD10LmNvbnRleHQsci5ucz10Lm5zLHIuaXNTdGF0aWM9dC5pc1N0YXRpYyxyLmtleT10LmtleSxyfSl9ZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbihlLHQsbil7cmV0dXJue3R5cGU6ImRlY2xhcmF0aW9uIixwcm9wZXJ0eTplLHZhbHVlOnR9fWZ1bmN0aW9uIGNsZWFySW1wb3J0YW50KGUpe3ZhciB0PVN0cmluZyhlKS5yZXBsYWNlKC9ccyohaW1wb3J0YW50L2csIiIpO3JldHVybnt2YWx1ZTp0LGltcG9ydGFudDplIT09dH19ZnVuY3Rpb24gY3JlYXRlUGFyc2VyKHMpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPWUucG9zaXRpb24sbz1uLnNwbGl0KC9ccysvKSxhPVtdO3N3aXRjaChvLmxlbmd0aCl7Y2FzZSAxOm8ucHVzaChvWzBdLG9bMF0sb1swXSk7YnJlYWs7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIlRvcCIsb1swXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiUmlnaHQiLG9bMV0scixpKSxnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIkJvdHRvbSIsb1syXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiTGVmdCIsb1szXSxyLGkpKSxhfX12YXIgbWFyZ2luPWNyZWF0ZVBhcnNlcigibWFyZ2luIikscGFkZGluZz1jcmVhdGVQYXJzZXIoInBhZGRpbmciKTtmdW5jdGlvbiBib3JkZXIoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LG89bi5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyksYT1bL15bXGQuXStcUyokLywvXihzb2xpZHxkYXNoZWR8ZG90dGVkKSQvLC9cUysvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9by5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDpvLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIG8ubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oaSsiV2lkdGgiLChhWzBdfHwiMCIpLnRyaW0oKSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKGkrIlN0eWxlIiwoYVsxXXx8InNvbGlkIikudHJpbSgpLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oaSsiQ29sb3IiLChhWzJdfHwiIzAwMDAwMCIpLnRyaW0oKSxyKV19ZnVuY3Rpb24gYm9yZGVyUHJvcGVydHkoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LnN1YnN0cmluZyg2KSxvPW4ucmVwbGFjZSgvXHMqLFxzKi9nLCIsIikuc3BsaXQoL1xzKy8pLGE9W107c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGU7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJUb3AiK2ksb1swXSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJSaWdodCIraSxvWzFdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckJvdHRvbSIraSxvWzJdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckxlZnQiK2ksb1szXSxyKSksYX1mdW5jdGlvbiBib3JkZXJSYWRpdXMoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1uLnNwbGl0KC9ccysvKSxvPVtdO2lmKG4uaW5jbHVkZXMoIi8iKSlyZXR1cm4gZTtzd2l0Y2goaS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6aS5wdXNoKGlbMF0saVsxXSk7YnJlYWs7Y2FzZSAzOmkucHVzaChpWzFdKX1yZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlclRvcExlZnRSYWRpdXMiLGlbMF0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyVG9wUmlnaHRSYWRpdXMiLGlbMV0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLGlbMl0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyIsaVszXSxyKSksb31mdW5jdGlvbiBmbGV4RmxvdyhlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4uc3BsaXQoL1xzKy8pLG89Wy9eKGNvbHVtbnxjb2x1bW4tcmV2ZXJzZXxyb3d8cm93LXJldmVyc2UpJC8sL14obm93cmFwfHdyYXB8d3JhcC1yZXZlcnNlKSQvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9aS5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDppLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIGkubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhEaXJlY3Rpb24iLG9bMF18fCJjb2x1bW4iLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhXcmFwIixvWzFdfHwibm93cmFwIixyKV19ZnVuY3Rpb24gZm9udChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4ucmVwbGFjZSgvLFxzKi9nLCIsIikucmVwbGFjZSgvXHMqXC9ccyovLCIvIikucmVwbGFjZSgvWyciXS4rP1snIl0vZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9ccysvZywiIyIpfSkuc3BsaXQoL1xzKy8pLG89W10sYT1bIm5vcm1hbCIsIml0YWxpYyIsIm9ibGlxdWUiXTtvLnB1c2goZ2VuZXJhdGVEZWNsYXJhdGlvbigiZm9udFN0eWxlIixhW01hdGgubWF4KDAsYS5pbmRleE9mKGlbMF0pKV0scikpO3ZhciBzPWkuc2xpY2UoMCwtMikuZmluZChmdW5jdGlvbihlKXtyZXR1cm4vbm9ybWFsfGJvbGR8bGlnaHRlcnxib2xkZXJ8XGQrLy50ZXN0KGUpfSk7aWYocyYmby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRXZWlnaHQiLHMscikpLGk9aS5zbGljZSgtMiksL1tcZC5dK1xTKihcL1tcZC5dK1xTKik/Ly50ZXN0KGlbMF0pKXt2YXIgYz1pWzBdLnNwbGl0KCIvIiksdT1jWzBdLGw9Y1sxXTtyZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRTaXplIix1LHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImxpbmVIZWlnaHQiLGx8fCJub3JtYWwiLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRGYW1pbHkiLGlbMV0ucmVwbGFjZSgvIy9nLCIgIikscikpLG99cmV0dXJuW119ZnVuY3Rpb24gYmFja2dyb3VuZChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudDtyZXR1cm4vXiM/XFMrJC8udGVzdChuKXx8L15yZ2JhPyguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRDb2xvciIsbixyKTovXmxpbmVhci1ncmFkaWVudCguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRJbWFnZSIsbixyKTplfXZhciBwYXJzZXJDb2xsZWN0aW9uPXttYXJnaW46bWFyZ2luLHBhZGRpbmc6cGFkZGluZyxib3JkZXI6Ym9yZGVyLGJvcmRlclRvcDpib3JkZXIsYm9yZGVyUmlnaHQ6Ym9yZGVyLGJvcmRlckJvdHRvbTpib3JkZXIsYm9yZGVyTGVmdDpib3JkZXIsYm9yZGVyU3R5bGU6Ym9yZGVyUHJvcGVydHksYm9yZGVyV2lkdGg6Ym9yZGVyUHJvcGVydHksYm9yZGVyQ29sb3I6Ym9yZGVyUHJvcGVydHksYm9yZGVyUmFkaXVzOmJvcmRlclJhZGl1cyxmbGV4RmxvdzpmbGV4Rmxvdyxmb250OmZvbnQsYmFja2dyb3VuZDpiYWNrZ3JvdW5kfTtmdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRQcm9wZXJ0eShlKXt2YXIgdD1wYXJzZXJDb2xsZWN0aW9uW2UucHJvcGVydHldO3JldHVybiB0JiYoZT10KGUpKSxbXS5jb25jYXQoZSl9dmFyIERFRkFVTFRfVEFHX05BTUU9ImRpdiIsQlVCQkxFX0VWRU5UUz1bImNsaWNrIiwibG9uZ3ByZXNzIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIiwiaG9yaXpvbnRhbHBhbiIsInZlcnRpY2FscGFuIiwic3dpcGUiXTtmdW5jdGlvbiByZWdpc3Rlck5vZGUoZSx0KXtnZXREb2MoZSkubm9kZU1hcFt0Lm5vZGVJZF09dH12YXIgRWxlbWVudD1mdW5jdGlvbihpKXtmdW5jdGlvbiBlKGUsdCxuKXt2b2lkIDA9PT1lJiYoZT1ERUZBVUxUX1RBR19OQU1FKSxpLmNhbGwodGhpcyk7dmFyIHI9Z2V0V2VleEVsZW1lbnQoZSk7aWYociYmIW4pcmV0dXJuIG5ldyByKGUsdCwhMCk7dD10fHx7fSx0aGlzLm5vZGVUeXBlPTEsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ZSx0aGlzLmF0dHI9dC5hdHRyfHx7fSx0aGlzLnN0eWxlPXQuc3R5bGV8fHt9LHRoaXMuY2xhc3NTdHlsZT10LmNsYXNzU3R5bGV8fHt9LHRoaXMuZXZlbnQ9e30sdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLmNsYXNzTGlzdD10LmNsYXNzTGlzdHx8W10sdGhpcy5zdHlsZXNoZWV0PXQuc3R5bGVzaGVldHx8W10sdGhpcy5yZWFkeT0hMX1yZXR1cm4gaSYmKGUuX19wcm90b19fPWkpLCgoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShpJiZpLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihlKXtpZighZS5wYXJlbnROb2RlfHxlLnBhcmVudE5vZGU9PT10aGlzKWlmKGUucGFyZW50Tm9kZSl7aWYoY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthcHBlbmRDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIE1vdmUgPCIrZS50eXBlKyI+IHRvICIrdGhpcy5jaGlsZHJlbi5sZW5ndGgrIiBvZiA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksMT09PWUubm9kZVR5cGUpe3ZhciB0PW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO24mJjA8PXQmJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxuLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbZS5yZWYsdGhpcy5yZWYsdF0pKX19ZWxzZSBpZihjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2FwcGVuZENoaWxkXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgQXBwZW5kIDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe2luc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKTt2YXIgcj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO3ImJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxyLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixlLnRvSlNPTigpLC0xXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUubmV4dFNpYmxpbmcmJmUubmV4dFNpYmxpbmc9PT10KSlpZihlLnBhcmVudE5vZGUpe2lmKG1vdmVJbmRleChlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIG49bmV4dEVsZW1lbnQodCkscj1tb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixuP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7aSYmMDw9ciYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLGkuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixyXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QmVmb3JlXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgSW5zZXJ0IDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIiksIGJlZm9yZSAoIit0LnJlZisiKS4iKSxsaW5rUGFyZW50KGUsdGhpcyksaW5zZXJ0SW5kZXgoZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBvPW5leHRFbGVtZW50KHQpLGE9aW5zZXJ0SW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixvP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobyk6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxzPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7cyYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHMuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGUudG9KU09OKCksYV0pKSxlLnJlYWR5PSEwfX0sZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUucHJldmlvdXNTaWJsaW5nJiZlLnByZXZpb3VzU2libGluZz09PXQpKWlmKGUucGFyZW50Tm9kZSl7aWYobW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksMT09PWUubm9kZVR5cGUpe3ZhciBuPW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHJldmlvdXNFbGVtZW50KHQpKSsxKSxyPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmMDw9biYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHIuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixuXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QWZ0ZXJdKCIrdGhpcy5kb2NJZCsiLCIrZS50eXBlKyIsIitlLnJlZisiKSBJbnNlcnQgPCIrZS50eXBlKyI+IHRvIDwiK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKSwgYWZ0ZXIgKCIrdC5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBpPWluc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihwcmV2aW91c0VsZW1lbnQodCkpKzEpLG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtvJiYodGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSksby5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYsZS50b0pTT04oKSxpXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihlLHQpe2lmKGUucGFyZW50Tm9kZSl7aWYocmVtb3ZlSW5kZXgoZSx0aGlzLmNoaWxkcmVuLCEwKSwxPT09ZS5ub2RlVHlwZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltyZW1vdmVDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIFJlbW92ZSA8IitlLnR5cGUrIj4gZnJvbSA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIikscmVtb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbik7dmFyIG49Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtuJiZuLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRWxlbWVudCJ9LFtlLnJlZl0pLGUucmVhZHk9ITF9dGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSxlLm5leHRTaWJsaW5nfHx7fSl9dHx8ZS5kZXN0cm95KCl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0aGlzLnB1cmVDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QmJnQuc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFbGVtZW50In0sW2UucmVmXSksZS5yZWFkeT0hMX0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnNldEF0dHI9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuYXR0cltlXSE9PXR8fCExPT09bil7dGhpcy5hdHRyW2VdPXQ7dmFyIHI9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtpZighbiYmcil7dmFyIGk9e307aVtlXT10LHIuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixpXSl9fX0sZS5wcm90b3R5cGUuc2V0QXR0cnM9ZnVuY3Rpb24oZSx0KXtpZighaXNFbXB0eShlKSl7dmFyIG49e307Zm9yKHZhciByIGluIGUpdGhpcy5hdHRyW3JdIT09ZVtyXSYmKHRoaXMuYXR0cltyXT1lW3JdLG5bcl09ZVtyXSk7aWYoIWlzRW1wdHkobikpe3ZhciBpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7IXQmJmkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixuXSl9fX0sZS5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG8pe3ZhciBhPXRoaXM7ZXhwYW5kU2hvcnRoYW5kUHJvcGVydHkoe3Byb3BlcnR5OmUsdmFsdWU6dH0pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcm9wZXJ0eSxuPWUudmFsdWU7aWYoYS5zdHlsZVt0XSE9PW58fCExPT09byl7YS5zdHlsZVt0XT1uO3ZhciByPWdldFRhc2tDZW50ZXIoYS5kb2NJZCk7aWYoIW8mJnIpe3ZhciBpPXt9O2lbdF09IiI9PT1uJiZ0IGluIGEuY2xhc3NTdHlsZT9hLmNsYXNzU3R5bGVbdF06bixyLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbYS5yZWYsaV0pfX19KX0sZS5wcm90b3R5cGUuc2V0U3R5bGVzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztpZighaXNFbXB0eShlKSl7dmFyIGk9e307Zm9yKHZhciBuIGluIGUpe2V4cGFuZFNob3J0aGFuZFByb3BlcnR5KHtwcm9wZXJ0eTpuLHZhbHVlOmVbbl19KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucHJvcGVydHksbj1lLnZhbHVlO3Iuc3R5bGVbdF0hPT1uJiYoci5zdHlsZVt0XT1uLGlbdF09IiI9PT1uJiZ0IGluIHIuY2xhc3NTdHlsZT9yLmNsYXNzU3R5bGVbdF06bil9KX1pZighaXNFbXB0eShpKSl7dmFyIG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTshdCYmbyYmby5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLGldKX19fSxlLnByb3RvdHlwZS5zZXRDbGFzc1N0eWxlPWZ1bmN0aW9uKGUpe3ZhciB0PSExO2Zvcih2YXIgbiBpbiB0aGlzLmNsYXNzU3R5bGUpbiBpbiBlfHwodD0hMCx0aGlzLmNsYXNzU3R5bGVbbl09IiIpO2Zvcih2YXIgciBpbiBlKWVbcl0hPT10aGlzLmNsYXNzU3R5bGVbcl0mJih0PSEwLHRoaXMuY2xhc3NTdHlsZVtyXT1lW3JdKTtpZih0KXt2YXIgaT1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2kmJnRoaXMucmVhZHkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZix0aGlzLnRvU3R5bGUoKV0pfX0sZS5wcm90b3R5cGUuYWRkRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZXZlbnR8fCh0aGlzLmV2ZW50PXt9KSwhdGhpcy5ldmVudFtlXSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthZGRFdmVudF0oIit0aGlzLmRvY0lkKyIsIit0aGlzLnR5cGUrIiwiK3RoaXMucmVmKycpIEFkZCAiJytlKyciIGV2ZW50IG9uIDwnK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKS4iKSx0aGlzLmV2ZW50W2VdPXtoYW5kbGVyOnQscGFyYW1zOm59O3ZhciByPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmci5zZW5kKCJkb20iLHthY3Rpb246ImFkZEV2ZW50In0sW3RoaXMucmVmLGVdKX19LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuZXZlbnQmJnRoaXMuZXZlbnRbZV0pe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbcmVtb3ZlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBSZW1vdmUgIicrZSsnIiBldmVudCBvbiA8Jyt0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksZGVsZXRlIHRoaXMuZXZlbnRbZV07dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0JiZ0LnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRXZlbnQifSxbdGhpcy5yZWYsZV0pfX0sZS5wcm90b3R5cGUuZmlyZUV2ZW50PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGwsbz0hMSxhPXRoaXMuZXZlbnRbdF07aWYoYSYmZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltmaXJlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBGaXJlICInK3QrJyIgZXZlbnQgb24gPCcrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLiIpO3ZhciBzPWEuaGFuZGxlcjtlLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe289ITB9O3RyeXtpPXImJnIucGFyYW1zP3MuY2FsbC5hcHBseShzLFt0aGlzXS5jb25jYXQoci5wYXJhbXMsW2VdKSk6cy5jYWxsKHRoaXMsZSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGludm9rZSB0aGUgZXZlbnQgaGFuZGxlciBvZiAiJyt0KyciIG9uICcrdGhpcy50eXBlKyIgKCIrdGhpcy5yZWYrIik6XG4gIitlLnRvU3RyaW5nKCkpLGV9fXJldHVybiFvJiZuJiYtMSE9PUJVQkJMRV9FVkVOVFMuaW5kZXhPZih0KSYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50JiYoZS5jdXJyZW50VGFyZ2V0PXRoaXMucGFyZW50Tm9kZSx0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50KHQsZSxuKSksaX0sZS5wcm90b3R5cGUudG9TdHlsZT1mdW5jdGlvbigpe3ZhciBlPU9iamVjdC5hc3NpZ24oe30sdGhpcy5jbGFzc1N0eWxlKSx0PXRoaXMuc3R5bGU7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ZVtuXT0iIj09PXImJm4gaW4gdGhpcy5jbGFzc1N0eWxlP3RoaXMuY2xhc3NTdHlsZVtuXTpyfXJldHVybiBlfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciB0PXtyZWY6dGhpcy5yZWYudG9TdHJpbmcoKSx0eXBlOnRoaXMudHlwZSxhdHRyOnRoaXMuYXR0cixzdHlsZTpub3JtYWxpemVVbml0KHRoaXMudG9TdHlsZSgpKX07dGhpcy5jbGFzc0xpc3QmJnRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmKHQuY2xhc3M9dGhpcy5jbGFzc0xpc3Quam9pbigiICIpKTt2YXIgbj1bXTtmb3IodmFyIHIgaW4gdGhpcy5ldmVudCl7dmFyIGk9dGhpcy5ldmVudFtyXS5wYXJhbXM7aT9uLnB1c2goe3R5cGU6cixwYXJhbXM6aX0pOm4ucHVzaChyKX1yZXR1cm4gbi5sZW5ndGgmJih0LmV2ZW50PW4pLCFlJiZ0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgmJih0LmNoaWxkcmVuPXRoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSx0fSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiI8Iit0aGlzLnR5cGUrIiBhdHRyPSIrSlNPTi5zdHJpbmdpZnkodGhpcy5hdHRyKSsiIHN0eWxlPSIrSlNPTi5zdHJpbmdpZnkodGhpcy50b1N0eWxlKCkpKyI+Iit0aGlzLnB1cmVDaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0pLmpvaW4oIiIpKyI8LyIrdGhpcy50eXBlKyI+In0sZS5wcm90b3R5cGUuc2V0Q2xhc3NMaXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLmNsYXNzTGlzdC5sZW5ndGgmJjA9PT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hdC5jbGFzc0xpc3QuaW5jbHVkZXMoZSl9KS5sZW5ndGh8fCh0aGlzLmNsYXNzTGlzdD1lLHRoaXMucGFyZW50Tm9kZSYmdGhpcy5jb21wdXRlQ2xhc3NMaXN0KCkpfSxlLnByb3RvdHlwZS5zZXRTdHlsZXNoZWV0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLnN0eWxlc2hlZXQubGVuZ3RoJiYwPT09ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIXQuc3R5bGVzaGVldC5pbmNsdWRlcyhlKX0pLmxlbmd0aHx8KHRoaXMuc3R5bGVzaGVldD1lLHRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLmNvbXB1dGVDbGFzc0xpc3QoKSl9LGUucHJvdG90eXBlLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2hpbGRyZW4scj10fHxlLGk9cj9uLmluZGV4T2Yocik6MCxvPW4ubGVuZ3RoLTE7Zm9yKCFlfHxlLmNsYXNzTGlzdCYmZS5jbGFzc0xpc3QubGVuZ3RofHwobz10P2ktMTppKTswPD1pJiZpPD1vO2krKyl7dmFyIGE9bltpXTthLmNvbXB1dGVDbGFzc0xpc3QmJmEuY29tcHV0ZUNsYXNzTGlzdCgpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUNsYXNzTGlzdD1mdW5jdGlvbigpe3ZhciB1PXRoaXMsZT10aGlzLmNsYXNzTGlzdCx0PXRoaXMuc3R5bGVzaGVldCxwPXt9LGg9e307ZnVuY3Rpb24gbChlLHQpe3ZhciBuPXQmJnQuY2xhc3NMaXN0O3JldHVybiBuJiZuLmluY2x1ZGVzKGUpfXQuZm9yRWFjaChmdW5jdGlvbihuLGYpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtpZigoblsiQFZFUlNJT04iXXx8MSk8Mil7dmFyIHQ9bltlXTt0JiZPYmplY3QuYXNzaWduKHAsdCl9ZWxzZXt2YXIgYz1uWyIuIitlXTtjJiZPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXU7aWYoZSlmb3IodmFyIG49ZS5zcGxpdCgiLiIpLHI9bi5sZW5ndGgtMTswPHI7ci0tKXt2YXIgaT1uW3JdLG89aVtpLmxlbmd0aC0xXSxhPWkucmVwbGFjZSgvWyt+PiBdJC8sIiIpO2lmKCJ+Ij09PW98fCIgIj09PW8pe2Zvcih2YXIgcz0ifiI9PT1vPyJwcmV2aW91c1NpYmxpbmciOiJwYXJlbnROb2RlIjt0JiYhbChhLHQ9dFtzXSk7KTtpZighdClyZXR1cm59ZWxzZSBpZigiPiI9PT1vP3Q9dCYmdC5wYXJlbnROb2RlOiIrIj09PW8mJih0PXQmJnQucHJldmlvdXNTaWJsaW5nKSwhbChhLHQpKXJldHVybn12YXIgZD1jW2VdO09iamVjdC5rZXlzKGQpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZFtlXSxuPXRbMF0scj10WzFdLGk9dFsyXSxvPXRbM10sYT1bcixpLGYsb10scz1oW2VdLGM9ITA7aWYocylmb3IodmFyIHU9MDt1PHMubGVuZ3RoO3UrKyl7dmFyIGw9YVt1XS1zW3VdO2lmKDAhPT1sKXtjPTA8bDticmVha319YyYmKHBbZV09bixoW2VdPWEpfSl9KX19KX0pLHRoaXMuc2V0Q2xhc3NTdHlsZShwKSx0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdCgpfSxlfShOb2RlKTtmdW5jdGlvbiBub3JtYWxpemVQcmltaXRpdmUoZSl7dmFyIHQ9dHlwb2YoZSk7c3dpdGNoKHQpe2Nhc2UiVW5kZWZpbmVkIjpjYXNlIk51bGwiOnJldHVybiIiO2Nhc2UiUmVnRXhwIjpyZXR1cm4gZS50b1N0cmluZygpO2Nhc2UiRGF0ZSI6cmV0dXJuIGUudG9JU09TdHJpbmcoKTtjYXNlIk51bWJlciI6Y2FzZSJTdHJpbmciOmNhc2UiQm9vbGVhbiI6Y2FzZSJBcnJheSI6Y2FzZSJPYmplY3QiOnJldHVybiBlO2Nhc2UiQXJyYXlCdWZmZXIiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOnQsYmFzZTY0OmJ1ZmZlclRvQmFzZTY0KGUpfTtjYXNlIkludDhBcnJheSI6Y2FzZSJVaW50OEFycmF5IjpjYXNlIlVpbnQ4Q2xhbXBlZEFycmF5IjpjYXNlIkludDE2QXJyYXkiOmNhc2UiVWludDE2QXJyYXkiOmNhc2UiSW50MzJBcnJheSI6Y2FzZSJVaW50MzJBcnJheSI6Y2FzZSJGbG9hdDMyQXJyYXkiOmNhc2UiRmxvYXQ2NEFycmF5IjpyZXR1cm57IkB0eXBlIjoiYmluYXJ5IixkYXRhVHlwZTp0LGJhc2U2NDpidWZmZXJUb0Jhc2U2NChlLmJ1ZmZlcil9O2RlZmF1bHQ6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfX1zZXRFbGVtZW50KEVsZW1lbnQpO3ZhciBmYWxsYmFjaz1mdW5jdGlvbigpe30sVGFza0NlbnRlcj1mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbnN0YW5jZUlkIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpTdHJpbmcoZSl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FsbGJhY2tNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpuZXcgQ2FsbGJhY2tNYW5hZ2VyKGUpfSksZmFsbGJhY2s9dHx8ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBpbml0JDEoKXt2YXIgZT17Y3JlYXRlRmluaXNoOmdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLHVwZGF0ZUZpbmlzaDpnbG9iYWwuY2FsbFVwZGF0ZUZpbmlzaCxyZWZyZXNoRmluaXNoOmdsb2JhbC5jYWxsUmVmcmVzaEZpbmlzaCxjcmVhdGVCb2R5Omdsb2JhbC5jYWxsQ3JlYXRlQm9keSxhZGRFbGVtZW50Omdsb2JhbC5jYWxsQWRkRWxlbWVudCxyZW1vdmVFbGVtZW50Omdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxtb3ZlRWxlbWVudDpnbG9iYWwuY2FsbE1vdmVFbGVtZW50LHVwZGF0ZUF0dHJzOmdsb2JhbC5jYWxsVXBkYXRlQXR0cnMsdXBkYXRlU3R5bGU6Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxhZGRFdmVudDpnbG9iYWwuY2FsbEFkZEV2ZW50LHJlbW92ZUV2ZW50Omdsb2JhbC5jYWxsUmVtb3ZlRXZlbnQsX191cGRhdGVDb21wb25lbnREYXRhOmdsb2JhbC5fX3VwZGF0ZUNvbXBvbmVudERhdGF9LHQ9VGFza0NlbnRlci5wcm90b3R5cGUsbj1mdW5jdGlvbihuKXt2YXIgcj1lW25dO3Rbbl09cj9mdW5jdGlvbihlLHQpe3JldHVybiByLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHQpKX06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZToiZG9tIixtZXRob2Q6bixhcmdzOnR9XSwiLTEiKX19O2Zvcih2YXIgciBpbiBlKW4ocik7dC5jb21wb25lbnRIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlQ29tcG9uZW50fHxmdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBmYWxsYmFjayhlLFt7Y29tcG9uZW50OmkuY29tcG9uZW50LHJlZjp0LG1ldGhvZDpuLGFyZ3M6cn1dKX0sdC5tb2R1bGVIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlTW9kdWxlfHxmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZTp0LG1ldGhvZDpuLGFyZ3M6cn1dKX19ZnVuY3Rpb24gZmlyZUV2ZW50KGUsdCxuLHIsaSxvKXt2YXIgYT1lLmdldFJlZih0KTtyZXR1cm4gYT9lLmZpcmVFdmVudChhLG4scixpLG8pOnI/KHIuX25vZGVJZD10LGUuZmlyZUV2ZW50KGUuZ2V0UmVmKCJfZG9jdW1lbnRFbGVtZW50IiksbixyLGksbykpOnZvaWQgMH1mdW5jdGlvbiBjYWxsYmFjayhlLHQsbixyKXtyZXR1cm4gZS50YXNrQ2VudGVyLmNhbGxiYWNrKHQsbixyKX1mdW5jdGlvbiBjb21wb25lbnRIb29rKGUsdCxuLHIsaSl7aWYoIWV8fCFlLnRhc2tDZW50ZXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIENhblwndCBmaW5kICJkb2N1bWVudCIgb3IgInRhc2tDZW50ZXIiLicpLG51bGw7dmFyIG89bnVsbDt0cnl7bz1lLnRhc2tDZW50ZXIudHJpZ2dlckhvb2sodCxuLHIsaSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHRyaWdnZXIgdGhlICInK24rIkAiK3IrJyIgaG9vayBvbiAnK3QrIi4iKSxlfXJldHVybiBvfWZ1bmN0aW9uIHJlY2VpdmVUYXNrcyhlLHQpe3ZhciBuPWdldERvYyhlKTtyZXR1cm4gbj9BcnJheS5pc0FycmF5KHQpP3QubWFwKGZ1bmN0aW9uKGUpe3N3aXRjaChlLm1ldGhvZCl7Y2FzZSJjYWxsYmFjayI6cmV0dXJuIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCxbbl0uY29uY2F0KGUuYXJncykpO2Nhc2UiZmlyZUV2ZW50U3luYyI6Y2FzZSJmaXJlRXZlbnQiOnJldHVybiBmaXJlRXZlbnQuYXBwbHkodm9pZCAwLFtuXS5jb25jYXQoZS5hcmdzKSk7Y2FzZSJjb21wb25lbnRIb29rIjpyZXR1cm4gY29tcG9uZW50SG9vay5hcHBseSh2b2lkIDAsW25dLmNvbmNhdChlLmFyZ3MpKX19KTp2b2lkIDA6bmV3IEVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVjZWl2ZVRhc2tzLCBpbnN0YW5jZSAoIitlKyIpIGlzIG5vdCBhdmFpbGFibGUuIil9VGFza0NlbnRlci5wcm90b3R5cGUuY2FsbGJhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jb25zdW1lKGUsdCxuKX0sVGFza0NlbnRlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuKGU9dGhpcy5jYWxsYmFja01hbmFnZXIpLnJlZ2lzdGVySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS50cmlnZ2VySG9vaz1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09YXJndW1lbnRzW25dO3JldHVybihlPXRoaXMuY2FsbGJhY2tNYW5hZ2VyKS50cmlnZ2VySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNlbmQoIm1vZHVsZSIse21vZHVsZToiZG9tIixtZXRob2Q6InVwZGF0ZUNvbXBvbmVudERhdGEifSxbZSx0LG5dKX0sVGFza0NlbnRlci5wcm90b3R5cGUuZGVzdHJveUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNsb3NlKCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciByPXR5cG9mKGUpO2lmKGUmJmUgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLnJlZjtpZihlJiZlLl9pc1Z1ZSYmZS4kZWwgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLiRlbC5yZWY7aWYoIkZ1bmN0aW9uIj09PXIpcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZChlKS50b1N0cmluZygpO2lmKHQpe2lmKCJPYmplY3QiPT09cil7dmFyIGk9e307Zm9yKHZhciBvIGluIGUpaVtvXT1uLm5vcm1hbGl6ZShlW29dLCEwKTtyZXR1cm4gaX1pZigiQXJyYXkiPT09cilyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG4ubm9ybWFsaXplKGUsITApfSl9cmV0dXJuIGUmJmUucmVmJiZlWyJbW1ZpcnR1YWxFbGVtZW50XV0iXT9lLnJlZjpub3JtYWxpemVQcmltaXRpdmUoZSl9LFRhc2tDZW50ZXIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcyxvPXQuYWN0aW9uLGE9dC5jb21wb25lbnQscz10LnJlZixjPXQubW9kdWxlLHU9dC5tZXRob2Q7c3dpdGNoKG49bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkubm9ybWFsaXplKGUpfSksIk9iamVjdCI9PT10eXBvZihyKSYmKHI9dGhpcy5ub3JtYWxpemUociwhMCkpLGUpe2Nhc2UiZG9tIjpyZXR1cm4gY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlt0YXNrXSgiK3RoaXMuaW5zdGFuY2VJZCsiLCIrdGhpcy50eXBlKyIsIitvKyIpICIrSlNPTi5zdHJpbmdpZnkobikpLHRoaXNbb10odGhpcy5pbnN0YW5jZUlkLG4pO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxzLHUsbixPYmplY3QuYXNzaWduKHtjb21wb25lbnQ6YX0scikpO2RlZmF1bHQ6cmV0dXJuIGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbdGFza10oIit0aGlzLmluc3RhbmNlSWQrIiwiK2MrIiwiK3UrIikgIitKU09OLnN0cmluZ2lmeShuKSksdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxjLHUsbixyKX19LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxET009ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpc1tlXSh0aGlzLmluc3RhbmNlSWQsdCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxDb21wb25lbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxNb2R1bGU9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMubW9kdWxlSGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9O3ZhciB3ZWV4TW9kdWxlcz17fTtmdW5jdGlvbiByZWdpc3Rlck1vZHVsZXMoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWZ1bmN0aW9uKHQpe2hhc093bih3ZWV4TW9kdWxlcyx0KXx8KHdlZXhNb2R1bGVzW3RdPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlP3dlZXhNb2R1bGVzW3RdW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS5uYW1lJiYod2VleE1vZHVsZXNbdF1bZS5uYW1lXT1lLmFyZ3N8fFtdKX0pfTtmb3IodmFyIG4gaW4gZSl0KG4pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZE1vZHVsZShlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8hKCF3ZWV4TW9kdWxlc1tlXXx8IXdlZXhNb2R1bGVzW2VdW3RdKTohIXdlZXhNb2R1bGVzW2VdfWZ1bmN0aW9uIGdldE1vZHVsZURlc2NyaXB0aW9uKGUpe3JldHVybiB3ZWV4TW9kdWxlc1tlXX12YXIgd2VleENvbXBvbmVudHM9e307ZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRzKGUpe0FycmF5LmlzQXJyYXkoZSkmJmUuZm9yRWFjaChmdW5jdGlvbihlKXtlJiYoInN0cmluZyI9PXR5cGVvZiBlP3dlZXhDb21wb25lbnRzW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS50eXBlJiZyZWdpc3RlckVsZW1lbnQoKHdlZXhDb21wb25lbnRzW2UudHlwZV09ZSkudHlwZSxlLm1ldGhvZHMpKX0pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZENvbXBvbmVudChlKXtyZXR1cm4hIXdlZXhDb21wb25lbnRzW2VdfXZhciBzZXJ2aWNlcz1bXTtmdW5jdGlvbiByZWdpc3RlcihlLHQpe2hhcyhlKT9jb25zb2xlLndhcm4oJ1NlcnZpY2UgIicrZSsnIiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhJyk6KHQ9T2JqZWN0LmFzc2lnbih7fSx0KSxzZXJ2aWNlcy5wdXNoKHtuYW1lOmUsb3B0aW9uczp0fSkpfWZ1bmN0aW9uIHVucmVnaXN0ZXIobil7c2VydmljZXMuc29tZShmdW5jdGlvbihlLHQpe2lmKGUubmFtZT09PW4pcmV0dXJuIHNlcnZpY2VzLnNwbGljZSh0LDEpLCEwfSl9ZnVuY3Rpb24gaGFzKGUpe3JldHVybiAwPD1pbmRleE9mKGUpfWZ1bmN0aW9uIGluZGV4T2YoZSl7cmV0dXJuIHNlcnZpY2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lfSkuaW5kZXhPZihlKX12YXIgQ29tbWVudD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm5vZGVUeXBlPTgsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ImNvbW1lbnQiLHRoaXMudmFsdWU9ZSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlx4M2MhLS0gIit0aGlzLnZhbHVlKyIgLS1ceDNlIn0sZX0oTm9kZSk7ZnVuY3Rpb24gY3JlYXRlQWN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PVtdKSx7bW9kdWxlOiJkb20iLG1ldGhvZDplLGFyZ3M6dH19dmFyIExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuYmF0Y2hlZD0hMSx0aGlzLnVwZGF0ZXM9W10sImZ1bmN0aW9uIj09dHlwZW9mIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImhhbmRsZXIiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6Y29uc29sZS5lcnJvcigiW0pTIFJ1bnRpbWVdIGludmFsaWQgcGFyYW1ldGVyLCBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfTtMaXN0ZW5lci5wcm90b3R5cGUuY3JlYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigiY3JlYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUudXBkYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigidXBkYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVmcmVzaEZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4oMCx0aGlzLmhhbmRsZXIpKFtjcmVhdGVBY3Rpb24oInJlZnJlc2hGaW5pc2giKV0sZSl9LExpc3RlbmVyLnByb3RvdHlwZS5jcmVhdGVCb2R5PWZ1bmN0aW9uKGUpe3ZhciB0PWUudG9KU09OKCksbj10LmNoaWxkcmVuO2RlbGV0ZSB0LmNoaWxkcmVuO3ZhciByPVtjcmVhdGVBY3Rpb24oImNyZWF0ZUJvZHkiLFt0XSldO3JldHVybiBuJiZyLnB1c2guYXBwbHkocixuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJhZGRFbGVtZW50IixbdC5yZWYsZSwtMV0pfSkpLHRoaXMuYWRkQWN0aW9ucyhyKX0sTGlzdGVuZXIucHJvdG90eXBlLmFkZEVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAwPD1ufHwobj0tMSksdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigiYWRkRWxlbWVudCIsW3QsZS50b0pTT04oKSxuXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVtb3ZlRWxlbWVudD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgdD1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJyZW1vdmVFbGVtZW50IixbZV0pfSk7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyh0KX1yZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigicmVtb3ZlRWxlbWVudCIsW2VdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5tb3ZlRWxlbWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oIm1vdmVFbGVtZW50IixbZSx0LG5dKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRBdHRyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyZXR1cm4gclt0XT1uLHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInVwZGF0ZUF0dHJzIixbZSxyXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByW3RdPW4sdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHJdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRTdHlsZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHRdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRFdmVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCJhZGRFdmVudCIsW2UsdF0pKX0sTGlzdGVuZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInJlbW92ZUV2ZW50IixbZSx0XSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuaGFuZGxlcj1mdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0KCl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRBY3Rpb25zPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudXBkYXRlcyxuPXRoaXMuaGFuZGxlcjtpZihBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pLCF0aGlzLmJhdGNoZWQpcmV0dXJuIG4oZSk7dC5wdXNoLmFwcGx5KHQsZSl9O3ZhciBoYW5kbGVyTWFwPXtjcmVhdGVCb2R5OiJjYWxsQ3JlYXRlQm9keSIsYWRkRWxlbWVudDoiY2FsbEFkZEVsZW1lbnQiLHJlbW92ZUVsZW1lbnQ6ImNhbGxSZW1vdmVFbGVtZW50Iixtb3ZlRWxlbWVudDoiY2FsbE1vdmVFbGVtZW50Iix1cGRhdGVBdHRyczoiY2FsbFVwZGF0ZUF0dHJzIix1cGRhdGVTdHlsZToiY2FsbFVwZGF0ZVN0eWxlIixhZGRFdmVudDoiY2FsbEFkZEV2ZW50IixyZW1vdmVFdmVudDoiY2FsbFJlbW92ZUV2ZW50In07ZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihyLGUpe3ZhciBpPWV8fGdsb2JhbC5jYWxsTmF0aXZlO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBpJiZjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyIiksZnVuY3Rpb24oZSl7QXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZGlzcGF0Y2hUYXNrKHIsZVt0XSxpKTtpZigtMT09PW4pcmV0dXJuIG59fX1mdW5jdGlvbiBoYXNBdmFpbGFibGVIYW5kbGVyKGUsdCl7cmV0dXJuImRvbSI9PT1lJiZoYW5kbGVyTWFwW3RdJiYiZnVuY3Rpb24iPT10eXBlb2YgZ2xvYmFsW2hhbmRsZXJNYXBbdF1dfWZ1bmN0aW9uIGRpc3BhdGNoVGFzayhlLHQsbil7dmFyIHI9dC5tb2R1bGUsaT10Lm1ldGhvZCxvPXQuYXJncztyZXR1cm4gaGFzQXZhaWxhYmxlSGFuZGxlcihyLGkpP2dsb2JhbFtoYW5kbGVyTWFwW2ldXS5hcHBseShnbG9iYWwsW2VdLmNvbmNhdChvLFsiLTEiXSkpOm4oZSxbdF0sIi0xIil9ZnVuY3Rpb24gdXBkYXRlRWxlbWVudChlLHQpe3ZhciBuPXQuYXR0cnN8fHt9O2Zvcih2YXIgciBpbiBuKWUuc2V0QXR0cihyLG5bcl0sITApO3ZhciBpPXQuc3R5bGV8fHt9O2Zvcih2YXIgbyBpbiBpKWUuc2V0U3R5bGUobyxpW29dLCEwKX12YXIgRG9jdW1lbnQ9ZnVuY3Rpb24gZSh0LG4scil7dD10P3QudG9TdHJpbmcoKToiIix0aGlzLmlkPXQsdGhpcy5VUkw9bixhZGREb2ModCx0aGlzKSx0aGlzLm5vZGVNYXA9e307dmFyIGk9ZS5MaXN0ZW5lcnx8TGlzdGVuZXI7dGhpcy5saXN0ZW5lcj1uZXcgaSh0LHJ8fGNyZWF0ZUhhbmRsZXIodCxlLmhhbmRsZXIpKSx0aGlzLnRhc2tDZW50ZXI9bmV3IFRhc2tDZW50ZXIodCxyP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gci5hcHBseSh2b2lkIDAsdCl9OmUuaGFuZGxlciksdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX07RG9jdW1lbnQucHJvdG90eXBlLmdldFJlZj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlTWFwW2VdfSxEb2N1bWVudC5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3RoaXMubGlzdGVuZXIuYmF0Y2hlZD0hMX0sRG9jdW1lbnQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSEwfSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztpZighdGhpcy5kb2N1bWVudEVsZW1lbnQpe3ZhciBlPW5ldyBFbGVtZW50KCJkb2N1bWVudCIpO2UuZG9jSWQ9dGhpcy5pZCxlLm93bmVyRG9jdW1lbnQ9dGhpcyxlLnJvbGU9ImRvY3VtZW50RWxlbWVudCIsZS5kZXB0aD0wLGUucmVmPSJfZG9jdW1lbnRFbGVtZW50Iix0aGlzLm5vZGVNYXAuX2RvY3VtZW50RWxlbWVudD1lLHRoaXMuZG9jdW1lbnRFbGVtZW50PWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSl7YXBwZW5kQm9keShuLGUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJpbnNlcnRCZWZvcmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlLHQpe2FwcGVuZEJvZHkobixlLHQpfX0pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCdDcmVhdGUgZG9jdW1lbnQgZWxlbWVudCAoaWQ6ICInK2UuZG9jSWQrJyIsIHJlZjogIicrZS5yZWYrJyIpJyl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQm9keT1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLmJvZHkpe3ZhciBuPW5ldyBFbGVtZW50KGUsdCk7c2V0Qm9keSh0aGlzLG4pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbY3JlYXRlQm9keV0oIit0aGlzLmlkKyIsIituLnR5cGUrIiwiK24ucmVmKyIpICgiK0pTT04uc3RyaW5naWZ5KG4udG9KU09OKCEwKSkrIikuIil9cmV0dXJuIHRoaXMuYm9keX0sRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgRWxlbWVudChlLHQpO3JldHVybiBjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2NyZWF0ZUVsZW1lbnRdKCIrdGhpcy5pZCsiLCIrbi50eXBlKyIsIituLnJlZisiKSAoIitKU09OLnN0cmluZ2lmeShuLnRvSlNPTighMCkpKyIpLiIpLG59LERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQ29tbWVudChlKX0sRG9jdW1lbnQucHJvdG90eXBlLmZpcmVFdmVudD1mdW5jdGlvbihlLHQsbixyLGkpe2lmKGUpeyhuPW58fHt9KS50eXBlPW4udHlwZXx8dCxuLnRhcmdldD1lLG4uY3VycmVudFRhcmdldD1lLG4udGltZXN0YW1wPURhdGUubm93KCksciYmdXBkYXRlRWxlbWVudChlLHIpO3ZhciBvPSJ3ZWV4IiE9PXRoaXMuX18kY29tcGlsZXJfXyxhPXRoaXMuZ2V0UmVmKCJfcm9vdCIpO2lmKGEmJmEuYXR0cil7dmFyIHM9YS5hdHRyLmJ1YmJsZTtvPSJ0cnVlIj09PXN8fCEwPT09c3x8byYmdm9pZCAwPT09c31yZXR1cm4id2VleCIhPT10aGlzLl9fJGNvbXBpbGVyX18mJihuPXByb2Nlc3NFdmVudChuKSksZS5maXJlRXZlbnQodCxuLG8saSl9fSxEb2N1bWVudC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbZGVzdHJveV0oIit0aGlzLmlkKyIsZG9jdW1lbnQsIit0aGlzLnJlZisnKSBEZXN0cm95IGRvY3VtZW50IChpZDogIicrdGhpcy5pZCsnIiwgVVJMOiAiJyt0aGlzLlVSTCsnIiknKSx0aGlzLnRhc2tDZW50ZXIuZGVzdHJveUNhbGxiYWNrKCksZGVsZXRlIHRoaXMubGlzdGVuZXIsZGVsZXRlIHRoaXMubm9kZU1hcCxkZWxldGUgdGhpcy50YXNrQ2VudGVyLHJlbW92ZURvYyh0aGlzLmlkKX0sRG9jdW1lbnQuaGFuZGxlcj1udWxsO3ZhciBsZXg9e0lucHV0RWxlbWVudERpdjoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsSW5wdXRFbGVtZW50UmVnRXhwOiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixSZXNlcnZlZFdvcmQ6IjxLZXl3b3JkPnw8TnVsbExpdGVyYWw+fDxCb29sZWFuTGl0ZXJhbD4iLFdoaXRlU3BhY2U6L1tcdFx2XGZcdTAwMjBcdTAwQTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVmXHUzMDAwXHVGRUZGXS8sTGluZVRlcm1pbmF0b3I6L1tcblxyXHUyMDI4XHUyMDI5XS8sS2V5d29yZDovbmV3KD8hW18kYS16QS1aMC05XSl8dm9pZCg/IVtfJGEtekEtWjAtOV0pfGRlbGV0ZSg/IVtfJGEtekEtWjAtOV0pfGluKD8hW18kYS16QS1aMC05XSl8aW5zdGFuY2VvZig/IVtfJGEtekEtWjAtOV0pfHR5cGVvZig/IVtfJGEtekEtWjAtOV0pLyxOdWxsTGl0ZXJhbDovbnVsbCg/IVtfJGEtekEtWjAtOV0pLyxCb29sZWFuTGl0ZXJhbDovKD86dHJ1ZXxmYWxzZSkoPyFbXyRhLXpBLVowLTldKS8sSWRlbnRpZmllcjovW18kYS16QS1aXVtfJGEtekEtWjAtOV0qLyxQdW5jdHVhdG9yOi9cL3w9PnxcKlwqfD4+Pj18Pj49fDw8PXw9PT18IT09fD4+Pnw8PHwlPXxcKj18LT18XCs9fDw9fD49fD09fCE9fFxePXxcfD18XHxcfHwmJnwmPXw+PnxcK1wrfC0tfFw6fH18XCp8JnxcfHxcXnwhfH58LXxcK3xcP3wlfD18Pnw8fCx8O3xcLig/IVswLTldKXxcXXxcW3xcKXxcKHx7LyxEaXZQdW5jdHVhdG9yOi9cLz18XC8vLE51bWVyaWNMaXRlcmFsOi8oPzowW3hYXVswLTlhLWZBLUZdKnxcLlswLTldK3woPzpbMS05XStbMC05XSp8MCkoPzpcLlswLTldKnxcLik/KSg/OltlRV1bKy1dezAsMX1bMC05XSspPyg/IVtfJGEtekEtWjAtOV0pLyxTdHJpbmdMaXRlcmFsOi8iKD86W14iXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKiJ8Jyg/OlteJ1xuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSonLyxSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWw6L1wvKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W14qXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkoPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKlwvWzAtOWEtekEtWl0qL307ZnVuY3Rpb24gWFJlZ0V4cChyLGUsaSl7dmFyIG89W2VdO3ZhciBhPWZ1bmN0aW9uIG4oZSl7dmFyIHQ9bmV3IFJlZ0V4cDtyZXR1cm4gdC5jb21waWxlKGUucmVwbGFjZSgvPChbXj5dKyk+L2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gclt0XT8oby5wdXNoKHQpLHJbdF1pbnN0YW5jZW9mIFJlZ0V4cD8iKCIrclt0XS5zb3VyY2UrIikiOiIoIituKHJbdF0pLnNvdXJjZSsiKSIpOiIifSksaSksdH0ocltlXSk7dGhpcy5leGVjPWZ1bmN0aW9uKGUpe3ZhciB0PWEuZXhlYyhlKTtpZihudWxsPT10KXJldHVybiBudWxsO2Zvcih2YXIgbj1uZXcgU3RyaW5nKHRbMF0pLHI9MDtyPG8ubGVuZ3RoO3IrKyl0W3JdJiYobltvW3JdXT10W3JdKTtyZXR1cm4gbn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxhc3RJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhLmxhc3RJbmRleH0sc2V0OmZ1bmN0aW9uKGUpe2EubGFzdEluZGV4PWV9fSl9ZnVuY3Rpb24gTGV4aWNhbFBhcnNlcigpe3ZhciBpLG89bmV3IFhSZWdFeHAobGV4LCJJbnB1dEVsZW1lbnREaXYiLCJnIiksYT1uZXcgWFJlZ0V4cChsZXgsIklucHV0RWxlbWVudFJlZ0V4cCIsImciKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic291cmNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbihlKXtpPWUsby5sYXN0SW5kZXg9MCxhLmxhc3RJbmRleD0wfX0pLHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtvLmxhc3RJbmRleD0wLGEubGFzdEluZGV4PTB9LHRoaXMuZ2V0TmV4dFRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0LG49by5sYXN0SW5kZXgscj0odD1lP286YSkuZXhlYyhpKTtpZihyJiZ0Lmxhc3RJbmRleC1uPnIubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBJTExFR0FMIik7cmV0dXJuIG8ubGFzdEluZGV4PXQubGFzdEluZGV4LGEubGFzdEluZGV4PXQubGFzdEluZGV4LHJ9fXZhciBydWxlcz17SWRlbnRpZmllck5hbWU6W1siSWRlbnRpZmllciJdXSxMaXRlcmFsOltbIk51bGxMaXRlcmFsIl0sWyJCb29sZWFuTGl0ZXJhbCJdLFsiTnVtZXJpY0xpdGVyYWwiXSxbIlN0cmluZ0xpdGVyYWwiXSxbIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCJdXSxQcmltYXJ5RXhwcmVzc2lvbjpbWyJJZGVudGlmaWVyIl0sWyJMaXRlcmFsIl0sWyIoIiwiRXhwcmVzc2lvbiIsIikiXV0sQ2FsbEV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iLCJBcmd1bWVudHMiXSxbIkNhbGxFeHByZXNzaW9uIiwiQXJndW1lbnRzIl1dLEFyZ3VtZW50czpbWyIoIiwiKSJdLFsiKCIsIkFyZ3VtZW50TGlzdCIsIikiXV0sQXJndW1lbnRMaXN0OltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiQXJndW1lbnRMaXN0IiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxMZWZ0SGFuZFNpZGVFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIl0sWyJDYWxsRXhwcmVzc2lvbiJdXSxVbmFyeUV4cHJlc3Npb246W1siTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiJdLFsidm9pZCIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiKyIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiLSIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsifiIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiISIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxFeHBvbmVudGlhdGlvbkV4cHJlc3Npb246W1siVW5hcnlFeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iLCIqKiIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiLyIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIqIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIlIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl1dLEFkZGl0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIisiLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIi0iLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXV0sU2hpZnRFeHByZXNzaW9uOltbIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPDwiLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+Pj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXV0sUmVsYXRpb25hbEV4cHJlc3Npb246W1siU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjwiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbnN0YW5jZW9mIiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluIiwiU2hpZnRFeHByZXNzaW9uIl1dLEVxdWFsaXR5RXhwcmVzc2lvbjpbWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl1dLEJpdHdpc2VBTkRFeHByZXNzaW9uOltbIkVxdWFsaXR5RXhwcmVzc2lvbiJdLFsiQml0d2lzZUFOREV4cHJlc3Npb24iLCImIiwiRXF1YWxpdHlFeHByZXNzaW9uIl1dLEJpdHdpc2VYT1JFeHByZXNzaW9uOltbIkJpdHdpc2VBTkRFeHByZXNzaW9uIl0sWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiIsIl4iLCJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdXSxCaXR3aXNlT1JFeHByZXNzaW9uOltbIkJpdHdpc2VYT1JFeHByZXNzaW9uIl0sWyJCaXR3aXNlT1JFeHByZXNzaW9uIiwifCIsIkJpdHdpc2VYT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxBTkRFeHByZXNzaW9uOltbIkJpdHdpc2VPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIiwiJiYiLCJCaXR3aXNlT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxPUkV4cHJlc3Npb246W1siTG9naWNhbEFOREV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCJ8fCIsIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl1dLENvbmRpdGlvbmFsRXhwcmVzc2lvbjpbWyJMb2dpY2FsT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwiPyIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI6IiwiTG9naWNhbE9SRXhwcmVzc2lvbiJdXSxFeHByZXNzaW9uOltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXhwcmVzc2lvbiIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sUHJvZ3JhbTpbWyJFeHByZXNzaW9uIl1dfTtmdW5jdGlvbiBTeW1ib2wkMShlLHQpe3RoaXMubmFtZT1lLHRoaXMudG9rZW49dCx0aGlzLmNoaWxkTm9kZXM9W10sdGhpcy50b1N0cmluZz1mdW5jdGlvbihlKXtpZihlfHwoZT0iIiksMT09dGhpcy5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdLnRvU3RyaW5nKGUpO2Zvcih2YXIgdD1lK3RoaXMubmFtZSsobnVsbCE9dGhpcy50b2tlbiYmdGhpcy5uYW1lIT10aGlzLnRva2VuPyI6Iit0aGlzLnRva2VuOiIiKSsiXG4iLG49MDtuPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXQrPXRoaXMuY2hpbGROb2Rlc1tuXS50b1N0cmluZyhlKyIgICAgIik7cmV0dXJuIHR9fWZ1bmN0aW9uIFN5bnRhY3RpY2FsUGFyc2VyKCl7dmFyIGU9e1Byb2dyYW06IiQifSxvPXt9OyFmdW5jdGlvbiBlKG4pe29bSlNPTi5zdHJpbmdpZnkobildPW47Zm9yKHZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG4pO3IubGVuZ3RoOyl7dmFyIGk9ci5zaGlmdCgpO3J1bGVzW2ldJiZydWxlc1tpXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZVswXV18fHIucHVzaChlWzBdKTt2YXIgdD1uO2UuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdfHwodFtlXT17fSksdD10W2VdfSksbltpXS4kZGl2JiYodC4kZGl2PSEwKSx0LiRyZWR1Y2U9aSx0LiRjb3VudD1lLmxlbmd0aH0pfWZvcih2YXIgdCBpbiBuKSJvYmplY3QiIT10eXBlb2Ygblt0XXx8IiQiPT10LmNoYXJBdCgwKXx8blt0XS4kY2xvc3VyZXx8KG9bSlNPTi5zdHJpbmdpZnkoblt0XSldP25bdF09b1tKU09OLnN0cmluZ2lmeShuW3RdKV06ZShuW3RdKSk7bi4kY2xvc3VyZT0hMH0oZSk7dmFyIGk9W10sYT1bZV0scz1lO3RoaXMuaW5zZXJ0U3ltYm9sPWZ1bmN0aW9uKGUsdCl7Zm9yKDshc1tlLm5hbWVdJiZzLiRyZWR1Y2U7KXtmb3IodmFyIG49cy4kY291bnQscj1uZXcgU3ltYm9sJDEocy4kcmVkdWNlKTtuLS07KXIuY2hpbGROb2Rlcy5wdXNoKGkucG9wKCkpLGEucG9wKCk7cz1hW2EubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKHIpfWlmKHM9c1tlLm5hbWVdLGkucHVzaChlKSxhLnB1c2gocyksIXMpdGhyb3cgbmV3IEVycm9yO3JldHVybiBzLiRkaXZ9LHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtpPVtdLGE9W3M9ZV19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFtbWFyVHJlZSIse2dldDpmdW5jdGlvbigpe3RyeXtmb3IoO3MuJHJlZHVjZTspe2Zvcih2YXIgZT1zLiRjb3VudCx0PW5ldyBTeW1ib2wkMShzLiRyZWR1Y2UpO2UtLTspdC5jaGlsZE5vZGVzLnB1c2goaS5wb3AoKSksYS5wb3AoKTtzPWFbYS5sZW5ndGgtMV0sdGhpcy5pbnNlcnRTeW1ib2wodCl9aWYoMDxpLmxlbmd0aCYmc1siOyJdKXJldHVybiB0aGlzLmluc2VydFN5bWJvbChuZXcgU3ltYm9sJDEoIjsiLCI7IikpLHRoaXMuZ3JhbW1hclRyZWU7aWYoMSE9aS5sZW5ndGh8fCJQcm9ncmFtIiE9aVswXS5uYW1lKXRocm93IG5ldyBFcnJvcn1jYXRjaChlKXt0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iil9cmV0dXJuIGlbMF19fSl9ZnVuY3Rpb24gUGFyc2VyKCl7dGhpcy5sZXhpY2FsUGFyc2VyPW5ldyBMZXhpY2FsUGFyc2VyLHRoaXMuc3ludGFjdGljYWxQYXJzZXI9bmV3IFN5bnRhY3RpY2FsUGFyc2VyO3ZhciBhPXt9O1siTnVsbExpdGVyYWwiLCJCb29sZWFuTGl0ZXJhbCIsIk51bWVyaWNMaXRlcmFsIiwiU3RyaW5nTGl0ZXJhbCIsIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCIsIklkZW50aWZpZXIiLCIqKiIsIj0+IiwieyIsIn0iLCIoIiwiKSIsIlsiLCJdIiwiLiIsIjsiLCIsIiwiPCIsIj4iLCI8PSIsIj49IiwiPT0iLCIhPSIsIj09PSIsIiE9PSIsIisiLCItIiwiKiIsIiUiLCIrKyIsIi0tIiwiPDwiLCI+PiIsIj4+PiIsIiYiLCJ8IiwiXiIsIiEiLCJ+IiwiJiYiLCJ8fCIsIj8iLCI6IiwiPSIsIis9IiwiLT0iLCIqPSIsIiU9IiwiPDw9IiwiPj49IiwiPj4+PSIsIiY9IiwifD0iLCJePSIsIi8iLCIvPSIsImluc3RhbmNlb2YiLCJ0eXBlb2YiLCJuZXciLCJ2b2lkIiwiZGVidWdnZXIiLCJ0aGlzIiwiZGVsZXRlIiwiaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGUse30pfSksdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGV4aWNhbFBhcnNlci5yZXNldCgpLHRoaXMuc3ludGFjdGljYWxQYXJzZXIucmVzZXQoKX0sdGhpcy5wYXJzZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcyxpPSExO3RoaXMubGV4aWNhbFBhcnNlci5zb3VyY2U9ZTtmb3IodmFyIG89ITE7bj10aGlzLmxleGljYWxQYXJzZXIuZ2V0TmV4dFRva2VuKG8pOyl7dCYmdChuKTt0cnl7aWYoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobikuc29tZShmdW5jdGlvbihlKXtyZXR1cm4hIWEuaGFzT3duUHJvcGVydHkoZSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShlLG4pLGkpLCEoaT0hMSkpfSkpY29udGludWU7KG4uS2V5d29yZHx8bi5QdW5jdHVhdG9yfHxuLkRpdlB1bmN0dWF0b3IpJiZhLmhhc093blByb3BlcnR5KG4udG9TdHJpbmcoKSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShuLnRvU3RyaW5nKCksbiksaSkpfWNhdGNoKGUpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAiK24pfX1yZXR1cm4gdGhpcy5zeW50YWN0aWNhbFBhcnNlci5ncmFtbWFyVHJlZX19dmFyIHBhcnNlcj1uZXcgUGFyc2VyO2Z1bmN0aW9uIEphdmFTY3JpcHRFeHByZXNzaW9uKHRleHQpe3BhcnNlci5yZXNldCgpLHRoaXMudHJlZT1wYXJzZXIucGFyc2UodGV4dCksdGhpcy5wYXRocz1bXTt2YXIgY29udGV4dD1PYmplY3QuY3JlYXRlKG51bGwpLG1lPXRoaXMscGF0aEluZGV4PU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gY2hlY2tTaW1wbGUoZSl7Zm9yKHZhciB0PWU7dC5jaGlsZE5vZGVzLmxlbmd0aDw9MSYmIk1lbWJlckV4cHJlc3Npb24iIT09dC5uYW1lOyl0PXQuY2hpbGROb2Rlc1swXTsiTWVtYmVyRXhwcmVzc2lvbiI9PT10Lm5hbWU/bWUuaXNTaW1wbGU9ITA6bWUuaXNTaW1wbGU9ITF9ZnVuY3Rpb24gd2FsayhlKXtpZigiQ2FsbEV4cHJlc3Npb24iPT09ZS5uYW1lJiYiQ2FsbEV4cHJlc3Npb24iIT09ZS5jaGlsZE5vZGVzW2UuY2hpbGROb2Rlcy5sZW5ndGgtMV0ubmFtZSl7Z2V0UGF0aChlLmNoaWxkTm9kZXNbMV0pO3dhbGsoZS5jaGlsZE5vZGVzWzBdKX1lbHNlIGlmKCJOZXdFeHByZXNzaW9uIj09PWUubmFtZSYmMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgpZ2V0UGF0aChlLmNoaWxkTm9kZXNbMF0pO2Vsc2UgaWYoIk1lbWJlckV4cHJlc3Npb24iPT09ZS5uYW1lJiYxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aClnZXRQYXRoKGUpO2Vsc2UgZm9yKHZhciB0PTA7dDxlLmNoaWxkTm9kZXMubGVuZ3RoO3QrKyl3YWxrKGUuY2hpbGROb2Rlc1t0XSl9ZnVuY3Rpb24gZ2V0UGF0aChlKXt2YXIgdDtpZigiSWRlbnRpZmllck5hbWUiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuKHQ9Z2V0UGF0aChlLmNoaWxkTm9kZXNbMl0pKSYmKHQ9dC5jb25jYXQoZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKSkpLGNyZWF0ZVBhdGgodCksdDtpZigiUHJpbWFyeUV4cHJlc3Npb24iPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIklkZW50aWZpZXIiPT09ZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0ubmFtZT8oY3JlYXRlUGF0aCh0PVtlLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS50b2tlbi50b1N0cmluZygpXSksdCk6bnVsbDtpZigiXSI9PT1lLmNoaWxkTm9kZXNbMF0ubmFtZSlyZXR1cm4gZ2V0UGF0aChlLmNoaWxkTm9kZXNbM10pLHdhbGsoZS5jaGlsZE5vZGVzWzFdKSxudWxsO2lmKCJBcmd1bWVudHMiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIHdhbGsoZS5jaGlsZE5vZGVzWzBdKSx3YWxrKGUuY2hpbGROb2Rlc1sxXSksbnVsbDtmb3IodmFyIG49MDtuPGUuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXdhbGsoZS5jaGlsZE5vZGVzW25dKX1mdW5jdGlvbiBjcmVhdGVQYXRoKGUpe2Zvcih2YXIgdD1jb250ZXh0LG49MDtuPGUubGVuZ3RoLTE7bisrKXRbZVtuXV18fCh0W2Vbbl1dPU9iamVjdC5jcmVhdGUobnVsbCkpLHQ9dFtlW25dXTttZS5wYXRocy5wdXNoKGUpLHBhdGhJbmRleFtlLmpvaW4oIi4iKV09ITF9dGhpcy5pc1NpbXBsZSx0aGlzLmlzQ29uc3Qsd2Fsayh0aGlzLnRyZWUpLGNoZWNrU2ltcGxlKHRoaXMudHJlZSksMD09PXRoaXMucGF0aHMubGVuZ3RoJiYodGhpcy5pc0NvbnN0PSEwKSx0aGlzLnNldHRlcj1mdW5jdGlvbih0KXtmb3IodmFyIG49Y29udGV4dCxyPTA7cjx0Lmxlbmd0aC0xO3IrKyluW3Rbcl1dfHwoblt0W3JdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxuPW5bdFtyXV07cmV0dXJue2lzQ29tcGxldGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHBhdGhJbmRleClpZighcGF0aEluZGV4W2VdKXJldHVybiExO3JldHVybiEwfSxzZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHBhdGhJbmRleFt0LmpvaW4oIi4iKV18fChwYXRoSW5kZXhbdC5qb2luKCIuIildPSEwKSxuW3Rbcl1dPWUsdGhpcy5pc0NvbXBsZXRlZCgpP21lLmV4ZWMoKTp2b2lkIDB9fX0sdGhpcy52YWx1ZU9mPXRoaXMuZXhlYz1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZXZhbCh0ZXh0KX0uY2FsbChjb250ZXh0KX1jYXRjaChlKXt9fX1mdW5jdGlvbiB2aXNpdCh0KXt2YXIgZSxuPXQuY2hpbGROb2Rlcy5zbGljZSgpLnJldmVyc2UoKSxyPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSk7aWYoIlVuYXJ5RXhwcmVzc2lvbiI9PT10Lm5hbWUmJigyPT09bi5sZW5ndGgmJiItIj09PW5bMF0ubmFtZSYmMT09PXIubGVuZ3RoKSlyZXR1cm4oZT12aXNpdChyWzBdKSkudmFsdWU9LWUudmFsdWUsZTtpZigiQXJndW1lbnRzIj09PXQubmFtZSl7Zm9yKHZhciBpPVtdLG89clswXTtvOykzPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89by5jaGlsZE5vZGVzWzJdKSwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89bnVsbCk7cmV0dXJue3R5cGU6IkFyZ3VtZW50cyIsY2hpbGRyZW46aS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHZpc2l0KGUpfSl9fWlmKHImJjE9PT1yLmxlbmd0aClyZXR1cm4gZT12aXNpdChyWzBdKTtpZih0LnRva2VuJiZbIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJJZGVudGlmaWVyIl0uc29tZShmdW5jdGlvbihlKXtyZXR1cm4gdC50b2tlbltlXX0pKXt2YXIgYT1PYmplY3Qua2V5cyh0LnRva2VuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL0xpdGVyYWwvKXx8ZS5tYXRjaCgvSWRlbnRpZmllci8pfSlbMF07cmV0dXJue3R5cGU6YSx2YWx1ZTp7TnVsbExpdGVyYWw6bnVsbCxCb29sZWFuTGl0ZXJhbDpCb29sZWFuKHQudG9rZW4pLE51bWVyaWNMaXRlcmFsOk51bWJlcih0LnRva2VuKSxTdHJpbmdMaXRlcmFsOnQudG9rZW4sSWRlbnRpZmllcjp0LnRva2VufVthXX19cmV0dXJuIkNhbGxFeHByZXNzaW9uIj09PXQubmFtZT97dHlwZToiQ2FsbEV4cHJlc3Npb24iLGNoaWxkcmVuOlt2aXNpdChuWzBdKSx2aXNpdChuWzFdKV19Ont0eXBlOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRva2VuJiZlLnRva2VuLlB1bmN0dWF0b3J9KVswXS5uYW1lLGNoaWxkcmVuOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB2aXNpdChlKX0pfX1mdW5jdGlvbiBwYXJzZShlKXt2YXIgdD1uZXcgSmF2YVNjcmlwdEV4cHJlc3Npb24oZSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHZpc2l0KHQudHJlZSksbnVsbCl9dmFyIG9sZENhbGxVcGRhdGVTdHlsZT1nbG9iYWwuY2FsbFVwZGF0ZVN0eWxlO2Z1bmN0aW9uIGlzQmluZE1ldGhvZChlLHQpe3JldHVybigiYmluZGluZ3giPT09ZXx8ImJpbmRpbmciPT09ZSkmJiJiaW5kIj09PXR9ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbihlKXtpZih2b2lkIDAhPT1lKXt0cnl7ZT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe312YXIgdD17fTtpZigic3RyaW5nIj09dHlwZW9mIGU/dC5vcmlnaW49ZTplJiYodC5vcmlnaW49ZS5vcmlnaW4sdC50cmFuc2Zvcm1lZD1lLnRyYW5zZm9ybWVkKSx0LnRyYW5zZm9ybWVkfHx0Lm9yaWdpbilyZXR1cm4gdC50cmFuc2Zvcm1lZD10LnRyYW5zZm9ybWVkfHxwYXJzZSh0Lm9yaWdpbiksdH19ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbnMoZSl7cmV0dXJuIGUmJihlLmV4aXRFeHByZXNzaW9uPWZvcm1hdEV4cHJlc3Npb24oZS5leGl0RXhwcmVzc2lvbiksZS5wcm9wcyYmZS5wcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZXhwcmVzc2lvbj1mb3JtYXRFeHByZXNzaW9uKGUuZXhwcmVzc2lvbil9KSksZX1mdW5jdGlvbiBmaXhDYWxsYmFjayh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9e30pLCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiB0KHtzdGF0ZToiZW5kIj09PWUuc3RhdGU/ImV4aXQiOmUuc3RhdGUsdDp2b2lkIDAhPT1lLnQ/ZS50OmUuZGVsdGFUfSl9fWZ1bmN0aW9uIGhhbmRsZU1vZHVsZUdldHRlcihlLHQsbil7cmV0dXJuIGlzQmluZE1ldGhvZChlLHQpP2Z1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ZnVuY3Rpb24oKXt9KSwhZSl0aHJvdyBuZXcgRXJyb3IoInNob3VsZCBwYXNzIG9wdGlvbnMgZm9yIGJpbmRpbmciKTtyZXR1cm4gZm9ybWF0RXhwcmVzc2lvbnMoZSksbihlLGUmJiJ0aW1pbmciPT09ZS5ldmVudFR5cGU/Zml4Q2FsbGJhY2sodCk6dCl9Om59ZnVuY3Rpb24gc2V0SWQoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiW1tDdXJyZW50SW5zdGFuY2VJZF1dIix7dmFsdWU6dH0pfWZ1bmN0aW9uIGdldElkKGUpe3JldHVybiBlWyJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iXX1mdW5jdGlvbiBtb2R1bGVHZXR0ZXIoZSxuLHIpe3ZhciBpPWdldFRhc2tDZW50ZXIoZSk7cmV0dXJuIGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLnNlbmQ/ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOm4sbWV0aG9kOnJ9LGUpfTooY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoIitlKyIpLiIpLG51bGwpfWZ1bmN0aW9uIG1vZHVsZVNldHRlcihlLHQsbixyKXt2YXIgaT1nZXRUYXNrQ2VudGVyKGUpO3JldHVybiBpJiYiZnVuY3Rpb24iPT10eXBlb2YgaS5zZW5kPyJmdW5jdGlvbiIhPXR5cGVvZiByPyhjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSAiK3QrIi4iK24rIiBtdXN0IGJlIGFzc2lnbmVkIGFzIGEgZnVuY3Rpb24uIiksbnVsbCk6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOnQsbWV0aG9kOm59LFtlXSl9Oihjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZmluZCB0YXNrQ2VudGVyICgiK2UrIikuIiksbnVsbCl9Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoLTE7MDxuLS07KXRbbl09YXJndW1lbnRzW24rMV07cmV0dXJuIHRbMV0mJih0WzFdPW5vcm1hbGl6ZVVuaXQodFsxXSkpLG9sZENhbGxVcGRhdGVTdHlsZS5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdCh0KSl9O3ZhciBXZWV4SW5zdGFuY2U9ZnVuY3Rpb24oZSx0LG4pe3NldElkKHRoaXMsU3RyaW5nKGUpKSx0aGlzLmNvbmZpZz10fHx7fSx0aGlzLl9uYXRpdmVEYXRhPW58fHt9LHRoaXMuZG9jdW1lbnQ9bmV3IERvY3VtZW50KGUsdGhpcy5jb25maWcuYnVuZGxlVXJsKSx0aGlzLnJlcXVpcmVNb2R1bGU9dGhpcy5yZXF1aXJlTW9kdWxlLmJpbmQodGhpcyksdGhpcy5pbXBvcnRTY3JpcHQ9dGhpcy5pbXBvcnRTY3JpcHQuYmluZCh0aGlzKSx0aGlzLmlzUmVnaXN0ZXJlZE1vZHVsZT1pc1JlZ2lzdGVyZWRNb2R1bGUsdGhpcy5pc1JlZ2lzdGVyZWRDb21wb25lbnQ9aXNSZWdpc3RlcmVkQ29tcG9uZW50fSxfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2UsX19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZSx1bmksZ2V0QXBwLGdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U7ZnVuY3Rpb24gY3JlYXRlU2VydmljZUNvbnRleHQoZWcsdGcsbmcscmcsZSl7dmFyIGlnPWUuc2V0VGltZW91dCxvZz1lLmNsZWFyVGltZW91dCxhZz1lLnNldEludGVydmFsLHNnPWUuY2xlYXJJbnRlcnZhbCxjZz1lLl9fdW5pQ29uZmlnLHVnPWUuX191bmlSb3V0ZXMsdD1mdW5jdGlvbigpe3ZhciBlLGksdD1bImJhc2U2NFRvQXJyYXlCdWZmZXIiLCJhcnJheUJ1ZmZlclRvQmFzZTY0IiwiYWRkSW50ZXJjZXB0b3IiLCJyZW1vdmVJbnRlcmNlcHRvciIsImludGVyY2VwdG9ycyJdLmNvbmNhdChbInJlcXVlc3QiLCJ1cGxvYWRGaWxlIiwiZG93bmxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCIsIm9uU29ja2V0T3BlbiIsIm9uU29ja2V0RXJyb3IiLCJzZW5kU29ja2V0TWVzc2FnZSIsIm9uU29ja2V0TWVzc2FnZSIsImNsb3NlU29ja2V0Iiwib25Tb2NrZXRDbG9zZSIsImdldFVwZGF0ZU1hbmFnZXIiLCJjb25maWdNVExTIl0sWyJuYXZpZ2F0ZVRvIiwicmVkaXJlY3RUbyIsInJlTGF1bmNoIiwic3dpdGNoVGFiIiwibmF2aWdhdGVCYWNrIl0sWyJzZXRTdG9yYWdlIiwic2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlIiwiZ2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlSW5mbyIsImdldFN0b3JhZ2VJbmZvU3luYyIsInJlbW92ZVN0b3JhZ2UiLCJyZW1vdmVTdG9yYWdlU3luYyIsImNsZWFyU3RvcmFnZSIsImNsZWFyU3RvcmFnZVN5bmMiXSxbImdldExvY2F0aW9uIiwiY2hvb3NlTG9jYXRpb24iLCJvcGVuTG9jYXRpb24iLCJjcmVhdGVNYXBDb250ZXh0Iiwib25Mb2NhdGlvbkNoYW5nZSIsIm9uTG9jYXRpb25DaGFuZ2VFcnJvciIsInN0YXJ0TG9jYXRpb25VcGRhdGUiLCJzdG9wTG9jYXRpb25VcGRhdGUiLCJvZmZMb2NhdGlvbkNoYW5nZSIsIm9mZkxvY2F0aW9uQ2hhbmdlRXJyb3IiXSxbImNob29zZUltYWdlIiwiY2hvb3NlRmlsZSIsInByZXZpZXdJbWFnZSIsImNsb3NlUHJldmlld0ltYWdlIiwiZ2V0SW1hZ2VJbmZvIiwiZ2V0VmlkZW9JbmZvIiwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIsImNvbXByZXNzSW1hZ2UiLCJjb21wcmVzc1ZpZGVvIiwiZ2V0UmVjb3JkZXJNYW5hZ2VyIiwiZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsImNyZWF0ZUF1ZGlvQ29udGV4dCIsImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0IiwiY2hvb3NlVmlkZW8iLCJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtIiwiY3JlYXRlVmlkZW9Db250ZXh0IiwiY3JlYXRlQ2FtZXJhQ29udGV4dCIsImNyZWF0ZUxpdmVQbGF5ZXJDb250ZXh0IiwiY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiXSxbImdldFN5c3RlbUluZm8iLCJnZXRTeXN0ZW1JbmZvU3luYyIsImdldFdpbmRvd0luZm8iLCJnZXREZXZpY2VJbmZvIiwiZ2V0QXBwQmFzZUluZm8iLCJjYW5JVXNlIiwib25NZW1vcnlXYXJuaW5nIiwiZ2V0TmV0d29ya1R5cGUiLCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLCJvZmZOZXR3b3JrU3RhdHVzQ2hhbmdlIiwib25BY2NlbGVyb21ldGVyQ2hhbmdlIiwib2ZmQWNjZWxlcm9tZXRlckNoYW5nZSIsInN0YXJ0QWNjZWxlcm9tZXRlciIsInN0b3BBY2NlbGVyb21ldGVyIiwib25Db21wYXNzQ2hhbmdlIiwib2ZmQ29tcGFzc0NoYW5nZSIsInN0YXJ0Q29tcGFzcyIsInN0b3BDb21wYXNzIiwib25HeXJvc2NvcGVDaGFuZ2UiLCJzdGFydEd5cm9zY29wZSIsInN0b3BHeXJvc2NvcGUiLCJtYWtlUGhvbmVDYWxsIiwic2NhbkNvZGUiLCJzZXRDbGlwYm9hcmREYXRhIiwiZ2V0Q2xpcGJvYXJkRGF0YSIsInNldFNjcmVlbkJyaWdodG5lc3MiLCJnZXRTY3JlZW5CcmlnaHRuZXNzIiwic2V0S2VlcFNjcmVlbk9uIiwib25Vc2VyQ2FwdHVyZVNjcmVlbiIsInZpYnJhdGVMb25nIiwidmlicmF0ZVNob3J0IiwiYWRkUGhvbmVDb250YWN0Iiwib3BlbkJsdWV0b290aEFkYXB0ZXIiLCJzdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aERldmljZUZvdW5kIiwic3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIsImdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMiLCJnZXRCbHVldG9vdGhEZXZpY2VzIiwiZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlIiwiY2xvc2VCbHVldG9vdGhBZGFwdGVyIiwid3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIiwicmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSIsIm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsIm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsImNyZWF0ZUJMRUNvbm5lY3Rpb24iLCJjbG9zZUJMRUNvbm5lY3Rpb24iLCJzZXRCTEVNVFUiLCJnZXRCTEVEZXZpY2VSU1NJIiwib25CZWFjb25TZXJ2aWNlQ2hhbmdlIiwib25CZWFjb25VcGRhdGUiLCJnZXRCZWFjb25zIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiLCJzdG9wQmVhY29uRGlzY292ZXJ5IiwiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uIiwiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZSIsInN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbiIsIm9uVGhlbWVDaGFuZ2UiLCJvZmZUaGVtZUNoYW5nZSIsIm9uVUlTdHlsZUNoYW5nZSIsImdldFN5c3RlbVNldHRpbmciLCJnZXRBcHBBdXRob3JpemVTZXR0aW5nIiwib3BlbkFwcEF1dGhvcml6ZVNldHRpbmciXSxbImhpZGVLZXlib2FyZCIsIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLCJvZmZLZXlib2FyZEhlaWdodENoYW5nZSIsImdldFNlbGVjdGVkVGV4dFJhbmdlIl0sWyJzaG93VG9hc3QiLCJoaWRlVG9hc3QiLCJzaG93TG9hZGluZyIsImhpZGVMb2FkaW5nIiwic2hvd01vZGFsIiwic2hvd0FjdGlvblNoZWV0Iiwic2V0TmF2aWdhdGlvbkJhclRpdGxlIiwic2V0TmF2aWdhdGlvbkJhckNvbG9yIiwic2hvd05hdmlnYXRpb25CYXJMb2FkaW5nIiwiaGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nIiwic2V0VGFiQmFySXRlbSIsInNldFRhYkJhclN0eWxlIiwiaGlkZVRhYkJhciIsInNob3dUYWJCYXIiLCJzZXRUYWJCYXJCYWRnZSIsInJlbW92ZVRhYkJhckJhZGdlIiwic2hvd1RhYkJhclJlZERvdCIsImhpZGVUYWJCYXJSZWREb3QiLCJvblRhYkJhck1pZEJ1dHRvblRhcCIsInNldEJhY2tncm91bmRDb2xvciIsInNldEJhY2tncm91bmRUZXh0U3R5bGUiLCJjcmVhdGVBbmltYXRpb24iLCJwYWdlU2Nyb2xsVG8iLCJvbldpbmRvd1Jlc2l6ZSIsIm9mZldpbmRvd1Jlc2l6ZSIsImxvYWRGb250RmFjZSIsInN0YXJ0UHVsbERvd25SZWZyZXNoIiwic3RvcFB1bGxEb3duUmVmcmVzaCIsImNyZWF0ZVNlbGVjdG9yUXVlcnkiLCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIsImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIsImdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QiLCJzaG93VG9wV2luZG93Iiwic2hvd0xlZnRXaW5kb3ciLCJzaG93UmlnaHRXaW5kb3ciLCJoaWRlVG9wV2luZG93IiwiaGlkZUxlZnRXaW5kb3ciLCJoaWRlUmlnaHRXaW5kb3ciLCJnZXRUb3BXaW5kb3dTdHlsZSIsImdldExlZnRXaW5kb3dTdHlsZSIsImdldFJpZ2h0V2luZG93U3R5bGUiLCJzZXRUb3BXaW5kb3dTdHlsZSIsInNldExlZnRXaW5kb3dTdHlsZSIsInNldFJpZ2h0V2luZG93U3R5bGUiLCJnZXRMb2NhbGUiLCJzZXRMb2NhbGUiLCJvbkxvY2FsZUNoYW5nZSJdLFsiJGVtaXQiLCIkb24iLCIkb25jZSIsIiRvZmYiXSxbInNhdmVGaWxlIiwiZ2V0U2F2ZWRGaWxlTGlzdCIsImdldFNhdmVkRmlsZUluZm8iLCJyZW1vdmVTYXZlZEZpbGUiLCJnZXRGaWxlSW5mbyIsIm9wZW5Eb2N1bWVudCIsImdldEZpbGVTeXN0ZW1NYW5hZ2VyIl0sWyJjcmVhdGVPZmZzY3JlZW5DYW52YXMiLCJjcmVhdGVDYW52YXNDb250ZXh0IiwiY2FudmFzVG9UZW1wRmlsZVBhdGgiLCJjYW52YXNQdXRJbWFnZURhdGEiLCJjYW52YXNHZXRJbWFnZURhdGEiXSxbImdldFByb3ZpZGVyIiwibG9naW4iLCJjaGVja1Nlc3Npb24iLCJnZXRVc2VySW5mbyIsImdldFVzZXJQcm9maWxlIiwicHJlTG9naW4iLCJjbG9zZUF1dGhWaWV3IiwiZ2V0Q2hlY2tCb3hTdGF0ZSIsImdldFVuaXZlcmlmeU1hbmFnZXIiLCJzaGFyZSIsInNoYXJlV2l0aFN5c3RlbSIsInNob3dTaGFyZU1lbnUiLCJoaWRlU2hhcmVNZW51IiwicmVxdWVzdFBheW1lbnQiLCJzdWJzY3JpYmVQdXNoIiwidW5zdWJzY3JpYmVQdXNoIiwib25QdXNoIiwib2ZmUHVzaCIsInJlcXVpcmVOYXRpdmVQbHVnaW4iLCJ1cHgycHgiLCJyZXN0b3JlR2xvYmFsIiwicmVxdWlyZUdsb2JhbCIsImdldFN1Yk5WdWVCeUlkIiwiZ2V0Q3VycmVudFN1Yk5WdWUiLCJzZXRQYWdlTWV0YSIsIm9uSG9zdEV2ZW50UmVjZWl2ZSIsIm9uTmF0aXZlRXZlbnRSZWNlaXZlIiwic2VuZE5hdGl2ZUV2ZW50IiwicHJlbG9hZFBhZ2UiLCJ1blByZWxvYWRQYWdlIiwibG9hZFN1YlBhY2thZ2UiLCJzZW5kSG9zdEV2ZW50IiwibmF2aWdhdGVUb01pbmlQcm9ncmFtIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJnZXRFbnRlck9wdGlvbnNTeW5jIiwiaW5pdFVUU1Byb3h5Q2xhc3MiLCJpbml0VVRTUHJveHlGdW5jdGlvbiIsImluaXRVVFNJbmRleENsYXNzTmFtZSIsImluaXRVVFNDbGFzc05hbWUiLCJpbml0VVRTUGFja2FnZU5hbWUiLCJyZXF1aXJlVVRTUGx1Z2luIiwicmVnaXN0ZXJVVFNQbHVnaW4iLCJyZWdpc3RlclVUU0ludGVyZmFjZSJdLFsiY3JlYXRlUmV3YXJkZWRWaWRlb0FkIiwiY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQiLCJjcmVhdGVJbnRlcnN0aXRpYWxBZCIsImNyZWF0ZUludGVyYWN0aXZlQWQiXSxbImludm9rZVB1c2hDYWxsYmFjayIsImdldFB1c2hDbGllbnRJZCIsIm9uUHVzaE1lc3NhZ2UiLCJvZmZQdXNoTWVzc2FnZSIsImNyZWF0ZVB1c2hNZXNzYWdlIl0pO3RyeXt2YXIgbj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe319KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLG4pfWNhdGNoKGUpe312YXIgYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLHM9L14oPzpbQS1aYS16XGQrL117NH0pKj8oPzpbQS1aYS16XGQrL117Mn0oPzo9PSk/fFtBLVphLXpcZCsvXXszfT0/KT8kLztmdW5jdGlvbiBjKCl7dmFyIGUsdCxuPWxnLmdldFN0b3JhZ2VTeW5jKCJ1bmlfaWRfdG9rZW4iKXx8IiIscj1uLnNwbGl0KCIuIik7aWYoIW58fDMhPT1yLmxlbmd0aClyZXR1cm57dWlkOm51bGwscm9sZTpbXSxwZXJtaXNzaW9uOltdLHRva2VuRXhwaXJlZDowfTt0cnl7ZT1KU09OLnBhcnNlKCh0PXJbMV0sZGVjb2RlVVJJQ29tcG9uZW50KGkodCkuc3BsaXQoIiIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iJSIrKCIwMCIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfSkuam9pbigiIikpKSl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCLojrflj5blvZPliY3nlKjmiLfkv6Hmga/lh7rplJnvvIzor6bnu4bplJnor6/kv6Hmga/kuLrvvJoiK2UubWVzc2FnZSl9cmV0dXJuIGUudG9rZW5FeHBpcmVkPTFlMyplLmV4cCxkZWxldGUgZS5leHAsZGVsZXRlIGUuaWF0LGV9aT0iZnVuY3Rpb24iIT10eXBlb2YgYXRvYj9mdW5jdGlvbihlKXtpZihlPVN0cmluZyhlKS5yZXBsYWNlKC9bXHRcblxmXHIgXSsvZywiIiksIXMudGVzdChlKSl0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdhdG9iJyBvbiAnV2luZG93JzogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iKTt2YXIgdDtlKz0iPT0iLnNsaWNlKDItKDMmZS5sZW5ndGgpKTtmb3IodmFyIG4scixpPSIiLG89MDtvPGUubGVuZ3RoOyl0PWEuaW5kZXhPZihlLmNoYXJBdChvKyspKTw8MTh8YS5pbmRleE9mKGUuY2hhckF0KG8rKykpPDwxMnwobj1hLmluZGV4T2YoZS5jaGFyQXQobysrKSkpPDw2fChyPWEuaW5kZXhPZihlLmNoYXJBdChvKyspKSksaSs9NjQ9PT1uP1N0cmluZy5mcm9tQ2hhckNvZGUodD4+MTYmMjU1KTo2ND09PXI/U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUsdD4+OCYyNTUpOlN0cmluZy5mcm9tQ2hhckNvZGUodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0KTtyZXR1cm4gaX06YXRvYjt2YXIgcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx5PU9iamVjdC5hc3NpZ247ZnVuY3Rpb24gQyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiB1KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX12YXIgbD11O2Z1bmN0aW9uIGQoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9ZnVuY3Rpb24gVChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PXIuY2FsbChlKX1mdW5jdGlvbiBrKGUsdCl7cmV0dXJuIG8uY2FsbChlLHQpfWZ1bmN0aW9uIGYoKXt9ZnVuY3Rpb24gcChlKXtyZXR1cm4gci5jYWxsKGUpLnNsaWNlKDgsLTEpfWZ1bmN0aW9uIGgodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgdj0vLShcdykvZyxnPWgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSh2LGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSxtPWgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pO2Z1bmN0aW9uIF8odCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT1kKHQpLHI9ZChuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gXyhlLG5bdF0pfSk7aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LmdldFRpbWUoKT09PW4uZ2V0VGltZSgpO2lmKGl8fG8pcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXModCkscz1PYmplY3Qua2V5cyhuKTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gXyh0W2VdLG5bZV0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fXZhciBiPS9bIScoKSpdL2csdz1mdW5jdGlvbihlKXtyZXR1cm4iJSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KX0sUz0vJTJDL2cseD1mdW5jdGlvbihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoYix3KS5yZXBsYWNlKFMsIiwiKX0sTz1kZWNvZGVVUklDb21wb25lbnQ7ZnVuY3Rpb24gRShlKXt2YXIgaT17fTtyZXR1cm4oZT1lLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKSkmJmUuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj1PKHQuc2hpZnQoKSkscj0wPHQubGVuZ3RoP08odC5qb2luKCI9IikpOm51bGw7dm9pZCAwPT09aVtuXT9pW25dPXI6QXJyYXkuaXNBcnJheShpW25dKT9pW25dLnB1c2gocik6aVtuXT1baVtuXSxyXX0pLGl9ZnVuY3Rpb24gSShyLGkpe3ZvaWQgMD09PWkmJihpPXgpO3ZhciBlPXI/T2JqZWN0LmtleXMocikubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPXJbdF07aWYodm9pZCAwPT09ZSlyZXR1cm4iIjtpZihudWxsPT09ZSlyZXR1cm4gaSh0KTtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbj1bXTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJihudWxsPT09ZT9uLnB1c2goaSh0KSk6bi5wdXNoKGkodCkrIj0iK2koZSkpKX0pLG4uam9pbigiJiIpfXJldHVybiBpKHQpKyI9IitpKGUpfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwPGUubGVuZ3RofSkuam9pbigiJiIpOm51bGw7cmV0dXJuIGU/Ij8iK2U6IiJ9dmFyIEE9MCwkPXt9O2Z1bmN0aW9uIFAoZSx0KXt2YXIgbj0kW2VdfHx7fTtkZWxldGUgJFtlXTt2YXIgcj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHIpP24uZmFpbCYmbi5mYWlsKHQpOm4uc3VjY2VzcyYmbi5zdWNjZXNzKHQpLG4uY29tcGxldGUmJm4uY29tcGxldGUodCl9dmFyIE09e3dhcnA6ZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1TdHJpbmcoQSsrKTskW3RdPXtzdWNjZXNzOmUuc3VjY2VzcyxmYWlsOmUuZmFpbCxjb21wbGV0ZTplLmNvbXBsZXRlfTt2YXIgbj1PYmplY3QuYXNzaWduKHt9LGUpLHI9aS5iaW5kKHRoaXMpKG4sdCk7ciYmUCh0LHIpfX0saW52b2tlOlB9LGo9e2JsYWNrOiJyZ2JhKDAsMCwwLDAuNCkiLHdoaXRlOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkifTtmdW5jdGlvbiBOKGUsbyxhKXt2b2lkIDA9PT1vJiYobz17fSksdm9pZCAwPT09YSYmKGE9ImxpZ2h0Iik7dmFyIHM9b1thXSx0PXt9O3JldHVybiBzPyhPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBpPWVbcl07dFtyXT1mdW5jdGlvbigpe2lmKFQoaSkpcmV0dXJuIE4oaSxvLGEpO2lmKEFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIGkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBUKGUpP04oZSxvLGEpOmV9KTtpZih1KGkpJiZpLnN0YXJ0c1dpdGgoIkAiKSl7dmFyIGU9aS5yZXBsYWNlKCJAIiwiIiksdD1zW2VdfHxpO3N3aXRjaChyKXtjYXNlImJvcmRlclN0eWxlIjp0PShuPXQpJiZuIGluIGo/altuXTpufXJldHVybiB0fXZhciBuO3JldHVybiBpfSgpfSksdCk6ZX1mdW5jdGlvbiBCKGUpe3JldHVybiBmdW5jdGlvbigpe3RyeXtyZXR1cm4gZS5hcHBseShlLGFyZ3VtZW50cyl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19fWZ1bmN0aW9uIEwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX19dmFyIEQ9WyJpbnZva2UiLCJzdWNjZXNzIiwiZmFpbCIsImNvbXBsZXRlIiwicmV0dXJuVmFsdWUiXSxSPXt9LEY9e307ZnVuY3Rpb24gVShpLG8pe09iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQsbixyOy0xIT09RC5pbmRleE9mKGUpJiZDKG9bZV0pJiYoaVtlXT0odD1pW2VdLG49b1tlXSwocj1uP3Q/dC5jb25jYXQobik6QXJyYXkuaXNBcnJheShuKT9uOltuXTp0KT9mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKS0xPT09dC5pbmRleE9mKGVbbl0pJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9KHIpOnIpKX0pfWZ1bmN0aW9uIHooaSxvKXtpJiZvJiZPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0LG4scjstMSE9PUQuaW5kZXhPZihlKSYmQyhvW2VdKSYmKHQ9aVtlXSxuPW9bZV0sLTEhPT0ocj10LmluZGV4T2YobikpJiZ0LnNwbGljZShyLDEpKX0pfWZ1bmN0aW9uIFYodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKXx8ZX19ZnVuY3Rpb24gcShlKXtyZXR1cm4hIWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbn1mdW5jdGlvbiBXKGUsdCxuKXtmb3IodmFyIHI9ITEsaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO2lmKHIpcj1Qcm9taXNlLnJlc29sdmUoVihvLG4pKTtlbHNle3ZhciBhPW8odCxuKTtpZihxKGEpJiYocj1Qcm9taXNlLnJlc29sdmUoYSkpLCExPT09YSlyZXR1cm57dGhlbjpmdW5jdGlvbigpe319fX1yZXR1cm4gcnx8e3RoZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9fX1mdW5jdGlvbiBIKHIsaSl7cmV0dXJuIHZvaWQgMD09PWkmJihpPXt9KSxbInN1Y2Nlc3MiLCJmYWlsIiwiY29tcGxldGUiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkoclt0XSkpe3ZhciBuPWlbdF07aVt0XT1mdW5jdGlvbihlKXtXKHJbdF0sZSxpKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBDKG4pJiZuKGUpfHxlfSl9fX0pLGl9ZnVuY3Rpb24gRyhlLHQpe3ZhciBuPVtdO0FycmF5LmlzQXJyYXkoUi5yZXR1cm5WYWx1ZSkmJm4ucHVzaC5hcHBseShuLFIucmV0dXJuVmFsdWUpO3ZhciByPUZbZV07cmV0dXJuIHImJkFycmF5LmlzQXJyYXkoci5yZXR1cm5WYWx1ZSkmJm4ucHVzaC5hcHBseShuLHIucmV0dXJuVmFsdWUpLG4uZm9yRWFjaChmdW5jdGlvbihlKXt0PWUodCl8fHR9KSx0fWZ1bmN0aW9uIEooZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtPYmplY3Qua2V5cyhSKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJyZXR1cm5WYWx1ZSIhPT1lJiYodFtlXT1SW2VdLnNsaWNlKCkpfSk7dmFyIG49RltlXTtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXsicmV0dXJuVmFsdWUiIT09ZSYmKHRbZV09KHRbZV18fFtdKS5jb25jYXQobltlXSkpfSksdH1mdW5jdGlvbiBYKHQsbixlKXtmb3IodmFyIHI9W10saT1hcmd1bWVudHMubGVuZ3RoLTM7MDxpLS07KXJbaV09YXJndW1lbnRzW2krM107dmFyIG89Sih0KTtyZXR1cm4gbyYmT2JqZWN0LmtleXMobykubGVuZ3RoP0FycmF5LmlzQXJyYXkoby5pbnZva2UpP1coby5pbnZva2UsZSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbi5hcHBseSh2b2lkIDAsW0goSih0KSxlKV0uY29uY2F0KHIpKX0pOm4uYXBwbHkodm9pZCAwLFtIKG8sZSldLmNvbmNhdChyKSk6bi5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdChyKSl9dmFyIFk9e3JldHVyblZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBxKGUpP25ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZS50aGVuKGZ1bmN0aW9uKGUpe2VbMF0/bihlWzBdKTp0KGVbMV0pfSl9KTplfX0sSz0vXlwkfFdpbmRvdyR8V2luZG93U3R5bGUkfHNlbmRIb3N0RXZlbnR8c2VuZE5hdGl2ZUV2ZW50fHJlc3RvcmVHbG9iYWx8cmVxdWlyZUdsb2JhbHxnZXRDdXJyZW50U3ViTlZ1ZXxnZXRNZW51QnV0dG9uQm91bmRpbmdDbGllbnRSZWN0fF5yZXBvcnR8aW50ZXJjZXB0b3JzfEludGVyY2VwdG9yJHxnZXRTdWJOVnVlQnlJZHxyZXF1aXJlTmF0aXZlUGx1Z2lufHVweDJweHxoaWRlS2V5Ym9hcmR8Y2FuSVVzZXxeY3JlYXRlfFN5bmMkfE1hbmFnZXIkfGJhc2U2NFRvQXJyYXlCdWZmZXJ8YXJyYXlCdWZmZXJUb0Jhc2U2NHxnZXRMb2NhbGV8c2V0TG9jYWxlfGludm9rZVB1c2hDYWxsYmFja3xnZXRXaW5kb3dJbmZvfGdldERldmljZUluZm98Z2V0QXBwQmFzZUluZm98Z2V0U3lzdGVtU2V0dGluZ3xnZXRBcHBBdXRob3JpemVTZXR0aW5nfGluaXRVVFN8cmVxdWlyZVVUU3xyZWdpc3RlclVUUy8sWj0vXmNyZWF0ZXxNYW5hZ2VyJC8sUT1bImNyZWF0ZUJMRUNvbm5lY3Rpb24iXSxlZT1bInJlcXVlc3QiLCJkb3dubG9hZEZpbGUiLCJ1cGxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCJdLHRlPVsiY3JlYXRlQkxFQ29ubmVjdGlvbiIsImNyZWF0ZVB1c2hNZXNzYWdlIl0sbmU9L15vbnxeb2ZmLztmdW5jdGlvbiByZShlKXtyZXR1cm4gSy50ZXN0KGUpJiYtMT09PXRlLmluZGV4T2YoZSl9ZnVuY3Rpb24gaWUoZSl7cmV0dXJuIG5lLnRlc3QoZSkmJiJvblB1c2giIT09ZX1mdW5jdGlvbiBvZShlKXtyZXR1cm4gdD1lLCEoWi50ZXN0KHQpJiYtMT09PVEuaW5kZXhPZih0KXx8cmUoZSl8fGllKGUpKTt2YXIgdH1mdW5jdGlvbiBhZShlKXt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSl7dmFyIHI9ZVtuXTtDKHIpJiYodFtuXT1MKHIpLGRlbGV0ZSBlW25dKX1yZXR1cm4gdH1Qcm9taXNlLnByb3RvdHlwZS5maW5hbGx5fHwoUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseT1mdW5jdGlvbih0KXt2YXIgbj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIG4ucmVzb2x2ZSh0KCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZX0pfSxmdW5jdGlvbihlKXtyZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IGV9KX0pfSk7dmFyIHNlPVt7bmFtZToiYmFzZTY0Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLGNlPVt7bmFtZToiYXJyYXlCdWZmZXIiLHR5cGU6W0FycmF5QnVmZmVyLFVpbnQ4QXJyYXldLHJlcXVpcmVkOiEwfV0sdWU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYmFzZTY0VG9BcnJheUJ1ZmZlcjpzZSxhcnJheUJ1ZmZlclRvQmFzZTY0OmNlfSksbGU9W3tuYW1lOiJzY2hlbWEiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sZGU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FuSVVzZTpsZX0pLGZlPVt7bmFtZToiZXZlbnQiLHR5cGU6W1N0cmluZyxBcnJheV0scmVxdWlyZWQ6ITB9LHtuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMH1dLHBlPWZlLGhlPVt7bmFtZToiZXZlbnQiLHR5cGU6W1N0cmluZyxBcnJheV19LHtuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbn1dLHZlPVt7bmFtZToiZXZlbnQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sZ2U9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsJG9uOmZlLCRvbmNlOnBlLCRvZmY6aGUsJGVtaXQ6dmV9KSxtZT1be25hbWU6Im1ldGhvZCIsdHlwZTpbU3RyaW5nLE9iamVjdF0scmVxdWlyZWQ6ITB9XSx5ZT1tZSxfZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhZGRJbnRlcmNlcHRvcjptZSxyZW1vdmVJbnRlcmNlcHRvcjp5ZX0pLGJlPVt7bmFtZToidXB4Iix0eXBlOltOdW1iZXIsU3RyaW5nXSxyZXF1aXJlZDohMH1dLHdlPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVweDJweDpiZX0pO2Z1bmN0aW9uIGtlKG4pe3JldHVybiBmdW5jdGlvbihlLHQpe2UmJih0W25dPU1hdGgucm91bmQoZSkpfX12YXIgU2U9e2NhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0seDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJ4Iil9LHk6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjprZSgieSIpfSx3aWR0aDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJ3aWR0aCIpfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjprZSgiaGVpZ2h0Iil9fSx4ZT17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxkYXRhOnt0eXBlOlVpbnQ4Q2xhbXBlZEFycmF5LHJlcXVpcmVkOiEwfSx4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoIngiKX0seTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJ5Iil9LHdpZHRoOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoIndpZHRoIil9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmtlKCJoZWlnaHQiKX19LENlPXtQTkc6InBuZyIsSlBHOiJqcGciLEpQRUc6ImpwZyJ9LFRlPXt4Ont0eXBlOk51bWJlcixkZWZhdWx0OjAsdmFsaWRhdG9yOmtlKCJ4Iil9LHk6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCx2YWxpZGF0b3I6a2UoInkiKX0sd2lkdGg6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjprZSgid2lkdGgiKX0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6a2UoImhlaWdodCIpfSxkZXN0V2lkdGg6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjprZSgiZGVzdFdpZHRoIil9LGRlc3RIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjprZSgiZGVzdEhlaWdodCIpfSxjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGZpbGVUeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKSx0LmZpbGVUeXBlPWUgaW4gQ2U/Q2VbZV06Q2UuUE5HfX0scXVhbGl0eTp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5xdWFsaXR5PTA8ZSYmZTwxP2U6MX19fSxPZT17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxhY3Rpb25zOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfSxyZXNlcnZlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LEVlPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNhbnZhc0dldEltYWdlRGF0YTpTZSxjYW52YXNQdXRJbWFnZURhdGE6eGUsY2FudmFzVG9UZW1wRmlsZVBhdGg6VGUsZHJhd0NhbnZhczpPZX0pLEllPVt7bmFtZToiaWQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sQWU9SWUsJGU9SWUsUGU9SWUsTWU9W3tuYW1lOiJjYW52YXNJZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHtuYW1lOiJjb21wb25lbnRJbnN0YW5jZSIsdHlwZTpPYmplY3R9XSxqZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVBdWRpb0NvbnRleHQ6QWUsY3JlYXRlVmlkZW9Db250ZXh0OiRlLGNyZWF0ZU1hcENvbnRleHQ6UGUsY3JlYXRlQ2FudmFzQ29udGV4dDpNZX0pLE5lPXtmaXJzdE5hbWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4iYWRkUGhvbmVDb250YWN0OmZhaWwgcGFyYW1ldGVyIGVycm9yOiBwYXJhbWV0ZXIuZmlyc3ROYW1lIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nOyJ9fX0sQmU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYWRkUGhvbmVDb250YWN0Ok5lfSksTGU9e3Bob25lTnVtYmVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIm1ha2VQaG9uZUNhbGw6ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5waG9uZU51bWJlciBzaG91bGQgbm90IGJlIGVtcHR5IFN0cmluZzsifX19LERlPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG1ha2VQaG9uZUNhbGw6TGV9KSxSZT17b25seUZyb21DYW1lcmE6e3R5cGU6Qm9vbGVhbn0sc2NhblR5cGU6e3R5cGU6QXJyYXl9LGF1dG9EZWNvZGVDaGFyU2V0Ont0eXBlOkJvb2xlYW59LHNvdW5kOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJub25lIn0sYXV0b1pvb206e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfX0sRmU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2NhbkNvZGU6UmV9KSxVZT1bInsiLCJ9Il0semU9ZnVuY3Rpb24oKXt0aGlzLl9jYWNoZXM9T2JqZWN0LmNyZWF0ZShudWxsKX07emUucHJvdG90eXBlLmludGVycG9sYXRlPWZ1bmN0aW9uKGUsdCxuKXtpZih2b2lkIDA9PT1uJiYobj1VZSksIXQpcmV0dXJuW2VdO3ZhciByPXRoaXMuX2NhY2hlc1tlXTtyZXR1cm4gcnx8KHI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10WzBdLHI9dFsxXSxpPVtdLG89MCxhPSIiO2Zvcig7bzxlLmxlbmd0aDspe3ZhciBzPWVbbysrXTtpZihzPT09bil7YSYmaS5wdXNoKHt0eXBlOiJ0ZXh0Iix2YWx1ZTphfSk7dmFyIGM9YT0iIjtmb3Iocz1lW28rK107dm9pZCAwIT09cyYmcyE9PXI7KWMrPXMscz1lW28rK107dmFyIHU9cz09PXIsbD1WZS50ZXN0KGMpPyJsaXN0Ijp1JiZxZS50ZXN0KGMpPyJuYW1lZCI6InVua25vd24iO2kucHVzaCh7dmFsdWU6Yyx0eXBlOmx9KX1lbHNlIGErPXN9cmV0dXJuIGEmJmkucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6YX0pLGl9KGUsbiksdGhpcy5fY2FjaGVzW2VdPXIpLGZ1bmN0aW9uKGUsdCl7dmFyIG49W10scj0wLGk9QXJyYXkuaXNBcnJheSh0KT8ibGlzdCI6KG89dCxudWxsIT09byYmIm9iamVjdCI9PXR5cGVvZiBvPyJuYW1lZCI6InVua25vd24iKTt2YXIgbztpZigidW5rbm93biI9PT1pKXJldHVybiBuO2Zvcig7cjxlLmxlbmd0aDspe3ZhciBhPWVbcl07c3dpdGNoKGEudHlwZSl7Y2FzZSJ0ZXh0IjpuLnB1c2goYS52YWx1ZSk7YnJlYWs7Y2FzZSJsaXN0IjpuLnB1c2godFtwYXJzZUludChhLnZhbHVlLDEwKV0pO2JyZWFrO2Nhc2UibmFtZWQiOiJuYW1lZCI9PT1pJiZuLnB1c2godFthLnZhbHVlXSl9cisrfXJldHVybiBufShyLHQpfTt2YXIgVmU9L14oPzpcZCkrLyxxZT0vXig/Olx3KSsvO3ZhciBXZT0iemgtSGFucyIsSGU9InpoLUhhbnQiLEdlPSJlbiIsSmU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxYZT1mdW5jdGlvbihlLHQpe3JldHVybiBKZS5jYWxsKGUsdCl9LFllPW5ldyB6ZTtmdW5jdGlvbiBLZShlLHQpe2lmKGUpe2lmKGU9ZS50cmltKCkucmVwbGFjZSgvXy9nLCItIiksdCYmdFtlXSlyZXR1cm4gZTtpZigiY2hpbmVzZSI9PT0oZT1lLnRvTG93ZXJDYXNlKCkpKXJldHVybiBXZTtpZigwPT09ZS5pbmRleE9mKCJ6aCIpKXJldHVybi0xPGUuaW5kZXhPZigiLWhhbnMiKT9XZTotMTxlLmluZGV4T2YoIi1oYW50Iik/SGU6KG49ZSxbIi10dyIsIi1oayIsIi1tbyIsIi1jaHQiXS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybi0xIT09bi5pbmRleE9mKGUpfSk/SGU6V2UpO3ZhciBuLHI9W0dlLCJmciIsImVzIl07dCYmMDxPYmplY3Qua2V5cyh0KS5sZW5ndGgmJihyPU9iamVjdC5rZXlzKHQpKTt2YXIgaSxvPShpPWUsci5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09aS5pbmRleE9mKGUpfSkpO3JldHVybiBvfHx2b2lkIDB9fXZhciBaZT1mdW5jdGlvbihlKXt2YXIgdD1lLmxvY2FsZSxuPWUuZmFsbGJhY2tMb2NhbGUscj1lLm1lc3NhZ2VzLGk9ZS53YXRjaGVyLG89ZS5mb3JtYXRlcjt0aGlzLmxvY2FsZT1HZSx0aGlzLmZhbGxiYWNrTG9jYWxlPUdlLHRoaXMubWVzc2FnZT17fSx0aGlzLm1lc3NhZ2VzPXt9LHRoaXMud2F0Y2hlcnM9W10sbiYmKHRoaXMuZmFsbGJhY2tMb2NhbGU9biksdGhpcy5mb3JtYXRlcj1vfHxZZSx0aGlzLm1lc3NhZ2VzPXJ8fHt9LHRoaXMuc2V0TG9jYWxlKHR8fEdlKSxpJiZ0aGlzLndhdGNoTG9jYWxlKGkpfTtmdW5jdGlvbiBRZShlLHQpe3JldHVybi0xPGUuaW5kZXhPZih0WzBdKX1aZS5wcm90b3R5cGUuc2V0TG9jYWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLmxvY2FsZTt0aGlzLmxvY2FsZT1LZShlLHRoaXMubWVzc2FnZXMpfHx0aGlzLmZhbGxiYWNrTG9jYWxlLHRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdfHwodGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV09e30pLHRoaXMubWVzc2FnZT10aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXSxuIT09dGhpcy5sb2NhbGUmJnRoaXMud2F0Y2hlcnMuZm9yRWFjaChmdW5jdGlvbihlKXtlKHQubG9jYWxlLG4pfSl9LFplLnByb3RvdHlwZS5nZXRMb2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbGV9LFplLnByb3RvdHlwZS53YXRjaExvY2FsZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy53YXRjaGVycy5wdXNoKGUpLTE7cmV0dXJuIGZ1bmN0aW9uKCl7dC53YXRjaGVycy5zcGxpY2UobiwxKX19LFplLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPSEwKTt2YXIgcj10aGlzLm1lc3NhZ2VzW2VdO3I/bj9PYmplY3QuYXNzaWduKHIsdCk6T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXtYZShyLGUpfHwocltlXT10W2VdKX0pOnRoaXMubWVzc2FnZXNbZV09dH0sWmUucHJvdG90eXBlLmY9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmZvcm1hdGVyLmludGVycG9sYXRlKGUsdCxuKS5qb2luKCIiKX0sWmUucHJvdG90eXBlLnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMubWVzc2FnZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KHQ9S2UodCx0aGlzLm1lc3NhZ2VzKSkmJihyPXRoaXMubWVzc2FnZXNbdF0pOm49dCxYZShyLGUpP3RoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUocltlXSxuKS5qb2luKCIiKTooY29uc29sZS53YXJuKCJDYW5ub3QgdHJhbnNsYXRlIHRoZSB2YWx1ZSBvZiBrZXlwYXRoICIrZSsiLiBVc2UgdGhlIHZhbHVlIG9mIGtleXBhdGggYXMgZGVmYXVsdC4iKSxlKX07dmFyIGV0LHR0PTQ0LG50PSJvblRoZW1lQ2hhbmdlIixydD0iZW4iLGl0PXt9O09iamVjdC5hc3NpZ24oaXQsKChlPXt9KVtydF09eyJ1bmkuYXBwLnF1aXQiOiJQcmVzcyBiYWNrIGJ1dHRvbiBhZ2FpbiB0byBleGl0IiwidW5pLmFzeW5jLmVycm9yIjoiVGhlIGNvbm5lY3Rpb24gdGltZWQgb3V0LCBjbGljayB0aGUgc2NyZWVuIHRvIHRyeSBhZ2Fpbi4iLCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCI6IkNhbmNlbCIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiJQbGVhc2Ugbm90ZSBzaG93VG9hc3QgbXVzdCBiZSBwYWlyZWQgd2l0aCBoaWRlVG9hc3QiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiJQbGVhc2Ugbm90ZSBzaG93TG9hZGluZyBtdXN0IGJlIHBhaXJlZCB3aXRoIGhpZGVMb2FkaW5nIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiJDYW5jZWwiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiJPSyIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiJDYW5jZWwiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IkFsYnVtIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ2FtZXJhIiwidW5pLmNob29zZVZpZGVvLmNhbmNlbCI6IkNhbmNlbCIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiJDYW1lcmEiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IkZpbGUgY2hvb3NlciBkaWFsb2cgY2FuIG9ubHkgYmUgc2hvd24gd2l0aCBhIHVzZXIgYWN0aXZhdGlvbiIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoiQ2FuY2VsIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6IlNhdmUgSW1hZ2UiLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6IlNhdmVkIHN1Y2Nlc3NmdWxseSIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoiU2F2ZSBmYWlsZWQiLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoiQ29udGVudCBjb3BpZWQiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiJTY2FuIGNvZGUiLCJ1bmkuc2NhbkNvZGUuYWxidW0iOiJBbGJ1bSIsInVuaS5zY2FuQ29kZS5mYWlsIjoiUmVjb2duaXRpb24gZmFpbHVyZSIsInVuaS5zY2FuQ29kZS5mbGFzaC5vbiI6IlRhcCB0byB0dXJuIGxpZ2h0IG9uIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiI6IlRhcCB0byB0dXJuIGxpZ2h0IG9mZiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiOiJGaW5nZXJwcmludCByZWNvZ25pdGlvbiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiOiJVbnJlY29nbml6YWJsZSIsInVuaS5waWNrZXIuZG9uZSI6IkRvbmUiLCJ1bmkucGlja2VyLmNhbmNlbCI6IkNhbmNlbCIsInVuaS52aWRlby5kYW5tdSI6IkRhbm11IiwidW5pLnZpZGVvLnZvbHVtZSI6IlZvbHVtZSIsInVuaS5idXR0b24uZmVlZGJhY2sudGl0bGUiOiJmZWVkYmFjayIsInVuaS5idXR0b24uZmVlZGJhY2suc2VuZCI6InNlbmQiLCJ1bmkuY2hvb3NlTG9jYXRpb24uc2VhcmNoIjoiRmluZCBQbGFjZSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiJDYW5jZWwifSxlLmVzPXsidW5pLmFwcC5xdWl0IjoiUHVsc2Ugb3RyYSB2ZXogcGFyYSBzYWxpciIsInVuaS5hc3luYy5lcnJvciI6IlNlIGFnb3TDsyBlbCB0aWVtcG8gZGUgY29uZXhpw7NuLCBoYWdhIGNsaWMgZW4gbGEgcGFudGFsbGEgcGFyYSB2b2x2ZXIgYSBpbnRlbnRhcmxvLiIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoiVGVuZ2EgZW4gY3VlbnRhIHF1ZSBzaG93VG9hc3QgZGViZSBlc3RhciBlbXBhcmVqYWRvIGNvbiBoaWRlVG9hc3QiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiJUZW5nYSBlbiBjdWVudGEgcXVlIHNob3dMb2FkaW5nIGRlYmUgZXN0YXIgZW1wYXJlamFkbyBjb24gaGlkZUxvYWRpbmciLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IkNhbmNlbGFyIiwidW5pLnNob3dNb2RhbC5jb25maXJtIjoiT0siLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IsOBbGJ1bSIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IkPDoW1hcmEiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSI6IsOBbGJ1bSIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IkPDoW1hcmEiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IkVsIGN1YWRybyBkZSBkacOhbG9nbyBkZWwgc2VsZWN0b3IgZGUgYXJjaGl2b3Mgc29sbyBzZSBwdWVkZSBtb3N0cmFyIGNvbiBsYSBhY3RpdmFjacOzbiBkZWwgdXN1YXJpbyIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoiR3VhcmRhciBpbWFnZW4iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6Ikd1YXJkYWRvIGV4aXRvc2FtZW50ZSIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoiRXJyb3IgYWwgZ3VhcmRhciIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiJDb250ZW5pZG8gY29waWFkbyIsInVuaS5zY2FuQ29kZS50aXRsZSI6IkPDs2RpZ28gZGUgZXNjYW5lbyIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IsOBbGJ1bSIsInVuaS5zY2FuQ29kZS5mYWlsIjoiw4ljaGVjIGRlIGxhIHJlY29ubmFpc3NhbmNlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoiVG9xdWUgcGFyYSBlbmNlbmRlciBsYSBsdXoiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoiVG9xdWUgcGFyYSBhcGFnYXIgbGEgbHV6IiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IlJlY29ub2NpbWllbnRvIGRlIGh1ZWxsYXMgZGFjdGlsYXJlcyIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiOiJJcnJlY29ub2NpYmxlIiwidW5pLnBpY2tlci5kb25lIjoiT0siLCJ1bmkucGlja2VyLmNhbmNlbCI6IkNhbmNlbGFyIiwidW5pLnZpZGVvLmRhbm11IjoiRGFubXUiLCJ1bmkudmlkZW8udm9sdW1lIjoiVm9sdW1lbiIsInVuaS5idXR0b24uZmVlZGJhY2sudGl0bGUiOiJyZWFsaW1lbnRhY2nDs24iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnNlbmQiOiJlbnZpYXIiLCJ1bmkuY2hvb3NlTG9jYXRpb24uc2VhcmNoIjoiRW5jb250cmFyIiwidW5pLmNob29zZUxvY2F0aW9uLmNhbmNlbCI6IkNhbmNlbGFyIn0sZS5mcj17InVuaS5hcHAucXVpdCI6IkFwcHV5ZXogw6Agbm91dmVhdSBwb3VyIHF1aXR0ZXIgbCdhcHBsaWNhdGlvbiIsInVuaS5hc3luYy5lcnJvciI6IkxhIGNvbm5leGlvbiBhIGV4cGlyw6ksIGNsaXF1ZXogc3VyIGwnw6ljcmFuIHBvdXIgcsOpZXNzYXllci4iLCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoiVmV1aWxsZXogbm90ZXIgcXVlIHNob3dUb2FzdCBkb2l0IMOqdHJlIGFzc29jacOpIMOgIGhpZGVUb2FzdCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6IlZldWlsbGV6IG5vdGVyIHF1ZSBzaG93TG9hZGluZyBkb2l0IMOqdHJlIGFzc29jacOpIMOgIGhpZGVMb2FkaW5nIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiJBbm51bGVyIiwidW5pLnNob3dNb2RhbC5jb25maXJtIjoiT0siLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoiQW5udWxlciIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiJDYW3DqXJhIiwidW5pLmNob29zZVZpZGVvLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSI6IkFsYnVtIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ2Ftw6lyYSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoiTGEgYm/DrnRlIGRlIGRpYWxvZ3VlIGR1IHPDqWxlY3RldXIgZGUgZmljaGllciBuZSBwZXV0IMOqdHJlIGFmZmljaMOpZSBxdSdhdmVjIHVuZSBhY3RpdmF0aW9uIHBhciBsJ3V0aWxpc2F0ZXVyIiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiJBbm51bGVyIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6Ikd1YXJkYXIgaW1hZ2VuIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiOiJFbnJlZ2lzdHLDqSBhdmVjIHN1Y2PDqHMiLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCI6IsOJY2hlYyBkZSBsYSBzYXV2ZWdhcmRlIiwidW5pLnNldENsaXBib2FyZERhdGEuc3VjY2VzcyI6IkNvbnRlbnUgY29wacOpIiwidW5pLnNjYW5Db2RlLnRpdGxlIjoiQ29kZSBk4oCZYW5hbHlzZSIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IkFsYnVtIiwidW5pLnNjYW5Db2RlLmZhaWwiOiJGYWxsbyBkZSByZWNvbm9jaW1pZW50byIsInVuaS5zY2FuQ29kZS5mbGFzaC5vbiI6IkFwcHV5ZXogcG91ciBhY3RpdmVyIGwnw6ljbGFpcmFnZSIsInVuaS5zY2FuQ29kZS5mbGFzaC5vZmYiOiJBcHB1eWV6IHBvdXIgZMOpc2FjdGl2ZXIgbCfDqWNsYWlyYWdlIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IlJlY29ubmFpc3NhbmNlIGRlIGwnZW1wcmVpbnRlIGRpZ2l0YWxlIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6Ik3DqWNvbm5haXNzYWJsZSIsInVuaS5waWNrZXIuZG9uZSI6Ik9LIiwidW5pLnBpY2tlci5jYW5jZWwiOiJBbm51bGVyIiwidW5pLnZpZGVvLmRhbm11IjoiRGFubXUiLCJ1bmkudmlkZW8udm9sdW1lIjoiTGUgVm9sdW1lIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6InJldG91ciBkJ2luZm9ybWF0aW9uIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoiZW52b3llciIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiJUcm91dmUiLCJ1bmkuY2hvb3NlTG9jYXRpb24uY2FuY2VsIjoiQW5udWxlciJ9LGVbInpoLUhhbnMiXT17InVuaS5hcHAucXVpdCI6IuWGjeaMieS4gOasoemAgOWHuuW6lOeUqCIsInVuaS5hc3luYy5lcnJvciI6Iui/nuaOpeacjeWKoeWZqOi2heaXtu+8jOeCueWHu+Wxj+W5lemHjeivlSIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnNob3dUb2FzdC51bnBhaXJlZCI6Iuivt+azqOaEjyBzaG93VG9hc3Qg5LiOIGhpZGVUb2FzdCDlv4XpobvphY3lr7nkvb/nlKgiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiLor7fms6jmhI8gc2hvd0xvYWRpbmcg5LiOIGhpZGVMb2FkaW5nIOW/hemhu+mFjeWvueS9v+eUqCIsInVuaS5zaG93TW9kYWwuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnNob3dNb2RhbC5jb25maXJtIjoi56Gu5a6aIiwidW5pLmNob29zZUltYWdlLmNhbmNlbCI6IuWPlua2iCIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoi5LuO55u45YaM6YCJ5oupIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoi5ouN5pGEIiwidW5pLmNob29zZVZpZGVvLmNhbmNlbCI6IuWPlua2iCIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoi5LuO55u45YaM6YCJ5oupIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIjoi5ouN5pGEIiwidW5pLmNob29zZUZpbGUubm90VXNlckFjdGl2YXRpb24iOiLmlofku7bpgInmi6nlmajlr7nor53moYblj6rog73lnKjnlLHnlKjmiLfmv4DmtLvml7bmmL7npLoiLCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCI6IuWPlua2iCIsInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiOiLkv53lrZjlm77lg48iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6IuS/neWtmOWbvuWDj+WIsOebuOWGjOaIkOWKnyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoi5L+d5a2Y5Zu+5YOP5Yiw55u45YaM5aSx6LSlIiwidW5pLnNldENsaXBib2FyZERhdGEuc3VjY2VzcyI6IuWGheWuueW3suWkjeWItiIsInVuaS5zY2FuQ29kZS50aXRsZSI6IuaJq+eggSIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IuebuOWGjCIsInVuaS5zY2FuQ29kZS5mYWlsIjoi6K+G5Yir5aSx6LSlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoi6L276Kem54Wn5LquIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiI6Iui9u+inpuWFs+mXrSIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiOiLmjIfnurnor4bliKvkuK0uLi4iLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50Ijoi5peg5rOV6K+G5YirIiwidW5pLnBpY2tlci5kb25lIjoi5a6M5oiQIiwidW5pLnBpY2tlci5jYW5jZWwiOiLlj5bmtogiLCJ1bmkudmlkZW8uZGFubXUiOiLlvLnluZUiLCJ1bmkudmlkZW8udm9sdW1lIjoi6Z+z6YePIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6IumXrumimOWPjemmiCIsInVuaS5idXR0b24uZmVlZGJhY2suc2VuZCI6IuWPkemAgSIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiLmkJzntKLlnLDngrkiLCJ1bmkuY2hvb3NlTG9jYXRpb24uY2FuY2VsIjoi5Y+W5raIIn0sZVsiemgtSGFudCJdPXsidW5pLmFwcC5xdWl0Ijoi5YaN5oyJ5LiA5qyh6YCA5Ye65oeJ55SoIiwidW5pLmFzeW5jLmVycm9yIjoi6YCj5o6l5pyN5YuZ5Zmo6LaF5pmC77yM6bue5pOK5bGP5bmV6YeN6KmmIiwidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoi6KuL5rOo5oSPIHNob3dUb2FzdCDoiIcgaGlkZVRvYXN0IOW/hemgiOmFjeWwjeS9v+eUqCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6Iuiri+azqOaEjyBzaG93TG9hZGluZyDoiIcgaGlkZUxvYWRpbmcg5b+F6aCI6YWN5bCN5L2/55SoIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiLnorrlrpoiLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iOiLlvp7nm7jlhorpgbjmk4ciLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiLmi43mlJ0iLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iOiLlvp7nm7jlhorpgbjmk4ciLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiLmi43mlJ0iLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IuaWh+S7tumBuOaTh+WZqOWwjeipseahhuWPquiDveWcqOeUseeUqOaItua/gOa0u+aZgumhr+ekuiIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6IuS/neWtmOWcluWDjyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoi5L+d5a2Y5ZyW5YOP5Yiw55u45YaK5oiQ5YqfIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiLkv53lrZjlnJblg4/liLDnm7jlhorlpLHmlZciLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoi5YWn5a655bey5b6p5Yi2IiwidW5pLnNjYW5Db2RlLnRpdGxlIjoi5o6D56K8IiwidW5pLnNjYW5Db2RlLmFsYnVtIjoi55u45YaKIiwidW5pLnNjYW5Db2RlLmZhaWwiOiLorZjliKXlpLHmlZciLCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iOiLovJXop7jnhafkuq4iLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoi6LyV6Ke46Zec6ZaJIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IuaMh+e0i+itmOWIpeS4rS4uLiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiOiLnhKHms5XorZjliKUiLCJ1bmkucGlja2VyLmRvbmUiOiLlrozmiJAiLCJ1bmkucGlja2VyLmNhbmNlbCI6IuWPlua2iCIsInVuaS52aWRlby5kYW5tdSI6IuW9iOW5lSIsInVuaS52aWRlby52b2x1bWUiOiLpn7Pph48iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoi5ZWP6aGM5Y+N6aWLIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoi55m86YCBIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IuaQnOe0ouWcsOm7niIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiLlj5bmtogifSxlKSksZXQ9Im9iamVjdCI9PXR5cGVvZiB0Zz90Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKToiIixmdW5jdGlvbigpe2lmKGR0KCkpe3ZhciBlPU9iamVjdC5rZXlzKGNnLmxvY2FsZXMpO2UubGVuZ3RoJiZlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9aXRbZV0sbj1jZy5sb2NhbGVzW2VdO3Q/T2JqZWN0LmFzc2lnbih0LG4pOml0W2VdPW59KX19KCk7dmFyIG90PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpO3ZvaWQgMD09PXQmJih0PXt9KSwic3RyaW5nIiE9dHlwZW9mIGUmJihlPShpPVt0LGVdKVswXSx0PWlbMV0pLCJzdHJpbmciIT10eXBlb2YgZSYmKGU9dm9pZCAwIT09bGcmJmxnLmdldExvY2FsZT9sZy5nZXRMb2NhbGUoKTp2b2lkIDAhPT1nbG9iYWwmJmdsb2JhbC5nZXRMb2NhbGU/Z2xvYmFsLmdldExvY2FsZSgpOkdlKSwic3RyaW5nIiE9dHlwZW9mIG4mJihuPXZvaWQgMCE9PWNnJiZjZy5mYWxsYmFja0xvY2FsZXx8R2UpO3ZhciBhPW5ldyBaZSh7bG9jYWxlOmUsZmFsbGJhY2tMb2NhbGU6bixtZXNzYWdlczp0LHdhdGNoZXI6cn0pLHM9ZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZGcpcz1mdW5jdGlvbihlLHQpe3JldHVybiBhLnQoZSx0KX07ZWxzZXt2YXIgbz0hMTtzPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWRnKCkuJHZtO3JldHVybiBpJiYoaS4kbG9jYWxlLG98fChvPSEwLHI9YSwobj1pKS4kd2F0Y2hMb2NhbGU/bi4kd2F0Y2hMb2NhbGUoZnVuY3Rpb24oZSl7ci5zZXRMb2NhbGUoZSl9KTpuLiR3YXRjaChmdW5jdGlvbigpe3JldHVybiBuLiRsb2NhbGV9LGZ1bmN0aW9uKGUpe3Iuc2V0TG9jYWxlKGUpfSkpKSxhLnQoZSx0KX19cmV0dXJuIHMoZSx0KX07cmV0dXJue2kxOG46YSxmOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYS5mKGUsdCxuKX0sdDpmdW5jdGlvbihlLHQpe3JldHVybiBzKGUsdCl9LGFkZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPSEwKSxhLmFkZChlLHQsbil9LHdhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiBhLndhdGNoTG9jYWxlKGUpfSxnZXRMb2NhbGU6ZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRMb2NhbGUoKX0sc2V0TG9jYWxlOmZ1bmN0aW9uKGUpe3JldHVybiBhLnNldExvY2FsZShlKX19fShldCxpdCksYXQ9b3QudCxzdD0ob3QubWl4aW49e2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1vdC5pMThuLndhdGNoTG9jYWxlKGZ1bmN0aW9uKCl7ZS4kZm9yY2VVcGRhdGUoKX0pO3RoaXMuJG9uY2UoImhvb2s6YmVmb3JlRGVzdHJveSIsZnVuY3Rpb24oKXt0KCl9KX0sbWV0aG9kczp7JCR0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGF0KGUsdCl9fX0sb3QuZ2V0TG9jYWxlKTt2YXIgY3Q9WyIlIiwiJSJdO2Z1bmN0aW9uIHV0KGUpe3JldHVybiBRZShlLGN0KT9vdC5mKGUsKHQ9bGcuZ2V0TG9jYWxlKCksKG49Y2cubG9jYWxlcylbdF18fG5bY2cuZmFsbGJhY2tMb2NhbGVdfHxuW3J0XXx8e30pLGN0KTplO3ZhciB0LG59ZnVuY3Rpb24gbHQodCxlKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxuKXt2YXIgcj1mdW5jdGlvbiBlKHQsbil7aWYoMSE9PW4ubGVuZ3RoKXt2YXIgcj1uLnNoaWZ0KCk7cmV0dXJuIGUodCYmdFtyXSxuKX1pZih0KXt2YXIgaT1mdW5jdGlvbihlKXtyZXR1cm4gdShlKSYmUWUoZSxjdCl9LG89blswXSxhPVtdO2lmKEFycmF5LmlzQXJyYXkodCkmJihhPXQuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBpKGVbb10pfSkpLmxlbmd0aClyZXR1cm4gYTt2YXIgcz10W29dO2lmKGkocykpcmV0dXJuIHR9fShlLG4pO2lmKCFyKXJldHVybiExO3ZhciBpPW5bbi5sZW5ndGgtMV07aWYoQXJyYXkuaXNBcnJheShyKSlyLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxbaV0pfSk7ZWxzZXt2YXIgbz1yW2ldO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGkse2dldDpmdW5jdGlvbigpe3JldHVybiB1dChvKX0sc2V0OmZ1bmN0aW9uKGUpe289ZX19KX1yZXR1cm4hMH0odCxlKX0pfWZ1bmN0aW9uIGR0KCl7cmV0dXJuIHZvaWQgMCE9PWNnJiZjZy5sb2NhbGVzJiYhIU9iamVjdC5rZXlzKGNnLmxvY2FsZXMpLmxlbmd0aH12YXIgZnQ9e2RhdGE6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzaG93VG9hc3Q6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxiZWZvcmVTdWNjZXNzOmZ1bmN0aW9uKGUsdCl7aWYodC5zaG93VG9hc3Qpe3ZhciBuPWF0KCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIik7biYmbGcuc2hvd1RvYXN0KHt0aXRsZTpuLGljb246InN1Y2Nlc3MiLG1hc2s6ITEsc3R5bGU6e3dpZHRoOnZvaWQgMH19KX19fSxwdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzZXRDbGlwYm9hcmREYXRhOmZ0fSk7ZnVuY3Rpb24gaHQoZSx0KXtpZih0KXtpZigwPT09dC5pbmRleE9mKCIvIikpcmV0dXJuIHR9ZWxzZXtpZigwPT09KHQ9ZSkuaW5kZXhPZigiLyIpKXJldHVybiB0O3ZhciBuPWZnKCk7ZT1uLmxlbmd0aD9uW24ubGVuZ3RoLTFdLiRwYWdlLnJvdXRlOiIifWlmKDA9PT10LmluZGV4T2YoIi4vIikpcmV0dXJuIGh0KGUsdC5zdWJzdHIoMikpO2Zvcih2YXIgcj10LnNwbGl0KCIvIiksaT1yLmxlbmd0aCxvPTA7bzxpJiYiLi4iPT09cltvXTtvKyspO3Iuc3BsaWNlKDAsbyksdD1yLmpvaW4oIi8iKTt2YXIgYT0wPGUubGVuZ3RoP2Uuc3BsaXQoIi8iKTpbXTtyZXR1cm4gYS5zcGxpY2UoYS5sZW5ndGgtby0xLG8rMSksIi8iK2EuY29uY2F0KHIpLmpvaW4oIi8iKX12YXIgdnQsZ3Q9L14oW2Etei1dKzopP1wvXC8vaSxtdD0vXmRhdGE6LiosLiovO2Z1bmN0aW9uIHl0KGUpe3JldHVybiBuZy5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpLnJlcGxhY2UoL15cLz9hcHBzXC8vLCIvYW5kcm9pZF9hc3NldC9hcHBzLyIpLnJlcGxhY2UoL1wvJC8sIiIpfWZ1bmN0aW9uIF90KGUpe3JldHVybiB2dHx8KHZ0PSJmaWxlOi8vIit5dCgiX3d3dyIpKyIvIiksdnQrZX1mdW5jdGlvbiBidChlKXtpZigwPT09ZS5pbmRleE9mKCIvIikpcmV0dXJuIDA9PT1lLmluZGV4T2YoIi8vIik/Imh0dHBzOiIrZTplLnN0YXJ0c1dpdGgoIi9zdG9yYWdlLyIpfHxlLnN0YXJ0c1dpdGgoIi9zZGNhcmQvIil8fGUuaW5jbHVkZXMoIi9Db250YWluZXJzL0RhdGEvQXBwbGljYXRpb24vIik/ImZpbGU6Ly8iK2U6X3QoZS5zdWJzdHIoMSkpO2lmKGd0LnRlc3QoZSl8fG10LnRlc3QoZSl8fDA9PT1lLmluZGV4T2YoImJsb2I6IikpcmV0dXJuIGU7aWYoMD09PWUuaW5kZXhPZigiX3d3dyIpfHwwPT09ZS5pbmRleE9mKCJfZG8iKSlyZXR1cm4iZmlsZTovLyIreXQoZSk7dmFyIHQ9ZmcoKTtyZXR1cm4gdC5sZW5ndGg/X3QoaHQodFt0Lmxlbmd0aC0xXS4kcGFnZS5yb3V0ZSxlKS5zdWJzdHIoMSkpOmV9dmFyIHd0PXt0ZW1wRmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QudGVtcEZpbGVQYXRoPWJ0KGUpfX19LGt0PVsibWQ1Iiwic2hhMSJdLFN0PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1idChlKX19LGRpZ2VzdEFsZ29yaXRobTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5kaWdlc3RBbGdvcml0aG09a3QuaW5jbHVkZXMoZSk/ZTprdFswXX0sZGVmYXVsdDprdFswXX19LHh0PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1idChlKX19fSxDdD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZmlsZVBhdGg9YnQoZSl9fX0sVHQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2F2ZUZpbGU6d3QsZ2V0RmlsZUluZm86U3QsZ2V0U2F2ZWRGaWxlSW5mbzp4dCxyZW1vdmVTYXZlZEZpbGU6Q3R9KSxPdD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlVHlwZTp7dHlwZTpTdHJpbmd9fSxFdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuRG9jdW1lbnQ6T3R9KSxJdD17a2V5d29yZDp7dHlwZTpTdHJpbmd9fSxBdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VMb2NhdGlvbjpJdH0pLCR0PVsid2dzODQiLCJnY2owMiJdLFB0PXt0eXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9Mb3dlckNhc2UoKSx0LnR5cGU9JHQuaW5kZXhPZihlKTwwPyR0WzBdOmV9fSxhbHRpdHVkZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxNdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRMb2NhdGlvbjpQdH0pLGp0PXtsYXRpdHVkZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LGxvbmdpdHVkZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LHNjYWxlOnt0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPU1hdGguZmxvb3IoZSksdC5zY2FsZT01PD1lJiZlPD0xOD9lOjE4fSxkZWZhdWx0OjE4fSxuYW1lOnt0eXBlOlN0cmluZ30sYWRkcmVzczp7dHlwZTpTdHJpbmd9fSxOdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246anR9KSxCdD1bImFsbCIsImltYWdlIiwidmlkZW8iXSxMdD1bImFsYnVtIiwiY2FtZXJhIl0sRHQ9e2NvdW50Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMSxkZWZhdWx0OjEwMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPD0wJiYodC5jb3VudD0xMDApfX0sc291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0Okx0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIEx0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6THR9fSx0eXBlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OiJhbGwiLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe0J0LmluY2x1ZGVzKGUpfHwodC50eXBlPUJ0WzBdKSx0LnR5cGU9ImFsbCI9PT10LnR5cGU/dC50eXBlPSIqIjp0LnR5cGV9fSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxSdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VGaWxlOkR0fSksRnQ9WyJvcmlnaW5hbCIsImNvbXByZXNzZWQiXSxVdD1bImFsYnVtIiwiY2FtZXJhIl0senQ9e2NvdW50Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMSxkZWZhdWx0OjksdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZTw9MCYmKHQuY291bnQ9OSl9fSxzaXplVHlwZTp7dHlwZTpbQXJyYXksU3RyaW5nXSxyZXF1aXJlZDohMSxkZWZhdWx0OkZ0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGU9InN0cmluZyI9PXR5cGVvZiBlP1tlXTplKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIEZ0LmluY2x1ZGVzKGUpfSksdC5zaXplVHlwZT1lLmxlbmd0aD9lOkZ0fX0sc291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0OlV0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIFV0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6VXR9fSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIioiXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiJ9fX0sVnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlSW1hZ2U6enR9KSxxdD1bImFsYnVtIiwiY2FtZXJhIl0sV3Q9e3NvdXJjZVR5cGU6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITEsZGVmYXVsdDpxdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBxdC5pbmNsdWRlcyhlKX0pLHQuc291cmNlVHlwZT1lLmxlbmd0aD9lOnF0fX0sY29tcHJlc3NlZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LG1heER1cmF0aW9uOnt0eXBlOk51bWJlcixkZWZhdWx0OjYwfSxjYW1lcmE6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJhY2sifSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIioiXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiJ9fX0sSHQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlVmlkZW86V3R9KSxHdD17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnNyYz1idChlKX19fSxKdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb21wcmVzc0ltYWdlOkd0fSksWHQ9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9YnQoZSl9fSxxdWFsaXR5Ont0eXBlOlN0cmluZ30sYml0cmF0ZTp7dHlwZTpOdW1iZXJ9LGZwczp7dHlwZTpOdW1iZXJ9LHJlc29sdXRpb246e3R5cGU6TnVtYmVyfX0sWXQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY29tcHJlc3NWaWRlbzpYdH0pLEt0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPWJ0KGUpfX19LFp0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldEltYWdlSW5mbzpLdH0pLFF0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPWJ0KGUpfX19LGVuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFZpZGVvSW5mbzpRdH0pLHRuPXt1cmxzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3ZhciBuO2lmKHQudXJscz1lLm1hcChmdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGJ0KGUpO249ITB9KSxuKXJldHVybiJ1cmwgaXMgbm90IHN0cmluZyJ9fSxjdXJyZW50Ont0eXBlOltTdHJpbmcsTnVtYmVyXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXsibnVtYmVyIj09dHlwZW9mIGU/dC5jdXJyZW50PTA8ZSYmZTx0LnVybHMubGVuZ3RoP2U6MDoic3RyaW5nIj09dHlwZW9mIGUmJmUmJih0LmN1cnJlbnQ9YnQoZSkpfSxkZWZhdWx0OjB9fSxubj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwcmV2aWV3SW1hZ2U6dG59KSxybj17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZmlsZVBhdGg9YnQoZSl9fX0sb249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2F2ZUltYWdlVG9QaG90b3NBbGJ1bTpybn0pLGFuPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX19LHNuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRvd25sb2FkRmlsZTphbn0pLGNuPXtPUFRJT05TOiJPUFRJT05TIixHRVQ6IkdFVCIsSEVBRDoiSEVBRCIsUE9TVDoiUE9TVCIsUFVUOiJQVVQiLERFTEVURToiREVMRVRFIixUUkFDRToiVFJBQ0UiLENPTk5FQ1Q6IkNPTk5FQ1QiLFBBVENIOiJQQVRDSCJ9LHVuPSJqc29uIixsbj17VEVYVDoidGV4dCIsQVJSQVlCVUZGRVI6ImFycmF5YnVmZmVyIn0sZG49ZW5jb2RlVVJJQ29tcG9uZW50O3ZhciBmbixwbj17bWV0aG9kOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKSx0Lm1ldGhvZD1PYmplY3QudmFsdWVzKGNuKS5pbmRleE9mKGUpPDA/Y24uR0VUOmV9fSxkYXRhOnt0eXBlOltPYmplY3QsU3RyaW5nLEFycmF5LEFycmF5QnVmZmVyXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRhdGE9ZXx8IiJ9fSx1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QubWV0aG9kPT09Y24uR0VUJiZUKHQuZGF0YSkmJk9iamVjdC5rZXlzKHQuZGF0YSkubGVuZ3RoJiYodC51cmw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNwbGl0KCIjIikscj1uWzFdfHwiIixpPShuPW5bMF0uc3BsaXQoIj8iKSlbMV18fCIiO2U9blswXTt2YXIgbz1pLnNwbGl0KCImIikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSk7Zm9yKHZhciBhIGluIGk9e30sby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9ZS5zcGxpdCgiPSIpLGlbZVswXV09ZVsxXX0pLHQpaWYoayh0LGEpKXt2YXIgcz10W2FdO251bGw9PXM/cz0iIjpUKHMpJiYocz1KU09OLnN0cmluZ2lmeShzKSksaVtkbihhKV09ZG4ocyl9cmV0dXJuIGUrKChpPU9iamVjdC5rZXlzKGkpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZSsiPSIraVtlXX0pLmpvaW4oIiYiKSk/Ij8iK2k6IiIpKyhyPyIjIityOiIiKX0oZSx0LmRhdGEpKX19LGhlYWRlcjp7dHlwZTpPYmplY3QsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5oZWFkZXI9ZXx8e307dC5tZXRob2QhPT1jbi5HRVQmJihPYmplY3Qua2V5cyhuKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiJjb250ZW50LXR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpfSl8fChuWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiIpKX19LGRhdGFUeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRhdGFUeXBlPShlfHx1bikudG9Mb3dlckNhc2UoKX19LHJlc3BvbnNlVHlwZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZXx8IiIpLnRvTG93ZXJDYXNlKCksdC5yZXNwb25zZVR5cGU9T2JqZWN0LnZhbHVlcyhsbikuaW5kZXhPZihlKTwwP2xuLlRFWFQ6ZX19LHdpdGhDcmVkZW50aWFsczp7dHlwZTpCb29sZWFufSx0aW1lb3V0Ont0eXBlOk51bWJlcn19LGhuPXtjZXJ0aWZpY2F0ZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKGUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIiE9PXAoZS5ob3N0KX0pKXJldHVybiLlj4LmlbDphY3nva7plJnor6/vvIzor7fnoa7orqTlkI7ph43or5UifX19LHZuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlcXVlc3Q6cG4sY29uZmlnTVRMUzpobn0pLGduPXtPUFRJT05TOiJPUFRJT05TIixHRVQ6IkdFVCIsSEVBRDoiSEVBRCIsUE9TVDoiUE9TVCIsUFVUOiJQVVQiLERFTEVURToiREVMRVRFIixUUkFDRToiVFJBQ0UiLENPTk5FQ1Q6IkNPTk5FQ1QifSxtbj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmhlYWRlcj1lfHx7fX19LG1ldGhvZDp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZXx8IiIpLnRvVXBwZXJDYXNlKCksdC5tZXRob2Q9T2JqZWN0LnZhbHVlcyhnbikuaW5kZXhPZihlKTwwP2duLkdFVDplfX0scHJvdG9jb2xzOnt0eXBlOltBcnJheSxTdHJpbmddLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKSx0LnByb3RvY29scz0oZXx8W10pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9KX19fSx5bj17ZGF0YTp7dHlwZTpbU3RyaW5nLEFycmF5QnVmZmVyXX19LF9uPXtjb2RlOnt0eXBlOk51bWJlcn0scmVhc29uOnt0eXBlOlN0cmluZ319LGJuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbm5lY3RTb2NrZXQ6bW4sc2VuZFNvY2tldE1lc3NhZ2U6eW4sY2xvc2VTb2NrZXQ6X259KSx3bj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZXM6e3R5cGU6QXJyYXl9LGZpbGVQYXRoOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlJiYodC5maWxlUGF0aD1idChlKSl9fSxuYW1lOnt0eXBlOlN0cmluZ30saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmhlYWRlcj1lfHx7fX19LGZvcm1EYXRhOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZvcm1EYXRhPWV8fHt9fX19LGtuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVwbG9hZEZpbGU6d259KSxTbj17T0FVVEg6Ik9BVVRIIixTSEFSRToiU0hBUkUiLFBBWU1FTlQ6IlBBWU1FTlQiLFBVU0g6IlBVU0gifSx4bj17c2VydmljZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoKGU9KGV8fCIiKS50b1VwcGVyQ2FzZSgpKSYmT2JqZWN0LnZhbHVlcyhTbikuaW5kZXhPZihlKTwwKXJldHVybiJzZXJ2aWNlIGVycm9yIn19fSxDbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRQcm92aWRlcjp4bn0pLFRuPXtyb290Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24odCxlKXt2YXIgbj1jZy5zdWJQYWNrYWdlcztyZXR1cm4gQXJyYXkuaXNBcnJheShuKSYmMCE9PW4ubGVuZ3RoP24uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5yb290PT09dH0pP3ZvaWQgMDoicm9vdCBgIit0KyJgIGlzIG5vdCBmb3VuZCI6Im5vIHN1YlBhY2thZ2VzIn19fSxPbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxsb2FkU3ViUGFja2FnZTpUbn0pLEVuPXtVTklWRVJJRlk6InVuaXZlcmlmeSJ9LEluPXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsZGVmYXVsdDpFbi5VTklWRVJJRlksdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoT2JqZWN0LnZhbHVlcyhFbikuaW5kZXhPZihlKTwwKXJldHVybiJwcm92aWRlciBlcnJvciJ9fX0sQW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJlTG9naW46SW59KTtmdW5jdGlvbiAkbihhKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgcj0oZT1odChlKSkuc3BsaXQoIj8iKVswXSxuPXVnLmZpbmQoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXRoLG49ZS5hbGlhcztyZXR1cm4gdD09PXJ8fG49PT1yfSk7aWYoIW4pcmV0dXJuInBhZ2UgYCIrZSsiYCBpcyBub3QgZm91bmQiO2lmKCJuYXZpZ2F0ZVRvIj09PWF8fCJyZWRpcmVjdFRvIj09PWEpe2lmKG4ubWV0YS5pc1RhYkJhcilyZXR1cm4iY2FuIG5vdCAiK2ErIiBhIHRhYmJhciBwYWdlIn1lbHNlIGlmKCJzd2l0Y2hUYWIiPT09YSYmIW4ubWV0YS5pc1RhYkJhcilyZXR1cm4iY2FuIG5vdCBzd2l0Y2ggdG8gbm8tdGFiQmFyIHBhZ2UiO2lmKCJzd2l0Y2hUYWIiIT09YSYmInByZWxvYWRQYWdlIiE9PWF8fCFuLm1ldGEuaXNUYWJCYXJ8fCJhcHBMYXVuY2giPT09dC5vcGVuVHlwZXx8KGU9ciksbi5tZXRhLmlzRW50cnkmJihlPWUucmVwbGFjZShuLmFsaWFzLCIvIikpLHQudXJsPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgdD1lLmluZGV4T2YoIj8iKTtpZigtMT09PXQpcmV0dXJuIGU7dmFyIG49ZS5zdWJzdHIodCsxKS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIik7aWYoIW4pcmV0dXJuIGU7ZT1lLnN1YnN0cigwLHQpO3ZhciBpPVtdO3JldHVybiBuLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLG49dC5zaGlmdCgpLHI9MDx0Lmxlbmd0aD90LmpvaW4oIj0iKToiIjtpLnB1c2gobisiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHIpKX0pLGkubGVuZ3RoP2UrIj8iK2kuam9pbigiJiIpOmV9KGUpLCJ1blByZWxvYWRQYWdlIiE9PWEpaWYoInByZWxvYWRQYWdlIiE9PWEpe2lmKGZuPT09ZSYmImFwcExhdW5jaCIhPT10Lm9wZW5UeXBlKXJldHVybiBmbisiIGxvY2tlZCI7Y2cucmVhZHkmJiExIT09Y2cuZW5hYmxlTmF2aWdhdG9yTG9jayYmKGZuPWUpfWVsc2V7aWYoIW4ubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYobi5tZXRhLmlzVGFiQmFyKXt2YXIgaT1mZyghMCksbz0obi5hbGlhc3x8bi5wYXRoKS5zdWJzdHIoMSk7aWYoaS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJvdXRlPT09b30pKXJldHVybiJ0YWJCYXIgcGFnZSBgIitvKyJgIGFscmVhZHkgZXhpc3RzIn19fX1mdW5jdGlvbiBQbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksT2JqZWN0LmFzc2lnbih7dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6JG4oZSl9LGJlZm9yZUFsbDpmdW5jdGlvbigpe2ZuPSIifX0sdCl9ZnVuY3Rpb24gTW4odCl7cmV0dXJue2FuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZihlJiYtMT09PXQuaW5kZXhPZihlKSlyZXR1cm4iYCIrZSsiYCBpcyBub3Qgc3VwcG9ydGVkIGZvciBgYW5pbWF0aW9uVHlwZWAgKHN1cHBvcnRlZCB2YWx1ZXMgYXJlOiBgIit0LmpvaW4oImB8YCIpKyJgKSJ9fSxhbmltYXRpb25EdXJhdGlvbjp7dHlwZTpOdW1iZXJ9fX12YXIgam4sTm4sQm49UG4oInJlZGlyZWN0VG8iKSxMbj1QbigicmVMYXVuY2giKSxEbj1QbigibmF2aWdhdGVUbyIsTW4oWyJzbGlkZS1pbi1yaWdodCIsInNsaWRlLWluLWxlZnQiLCJzbGlkZS1pbi10b3AiLCJzbGlkZS1pbi1ib3R0b20iLCJmYWRlLWluIiwiem9vbS1vdXQiLCJ6b29tLWZhZGUtb3V0IiwicG9wLWluIiwibm9uZSJdKSksUm49UG4oInN3aXRjaFRhYiIpLEZuPU9iamVjdC5hc3NpZ24oe2RlbHRhOnt0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPXBhcnNlSW50KGUpfHwxLHQuZGVsdGE9TWF0aC5taW4oZmcoKS5sZW5ndGgtMSxlKX19fSxNbihbInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdKSksVW49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOiRuKCJwcmVsb2FkUGFnZSIpfX0sem49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOiRuKCJ1blByZWxvYWRQYWdlIil9fSxWbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZWRpcmVjdFRvOkJuLHJlTGF1bmNoOkxuLG5hdmlnYXRlVG86RG4sc3dpdGNoVGFiOlJuLG5hdmlnYXRlQmFjazpGbixwcmVsb2FkUGFnZTpVbix1blByZWxvYWRQYWdlOnpufSkscW49e2tleTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxXbj1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxIbj17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGF0YTp7cmVxdWlyZWQ6ITB9fSxHbj1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHtuYW1lOiJkYXRhIixyZXF1aXJlZDohMH1dLEpuPXFuLFhuPVduLFluPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFN0b3JhZ2U6cW4sZ2V0U3RvcmFnZVN5bmM6V24sc2V0U3RvcmFnZTpIbixzZXRTdG9yYWdlU3luYzpHbixyZW1vdmVTdG9yYWdlOkpuLHJlbW92ZVN0b3JhZ2VTeW5jOlhufSksS249e2ZhbWlseTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHNvdXJjZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRlc2M6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiExfSxzdWNjZXNzOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfSxmYWlsOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfSxjb21wbGV0ZTp7dHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMX19LFpuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGxvYWRGb250RmFjZTpLbn0pLFFuPVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxlcj17ZnJvbnRDb2xvcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoLTE9PT1Rbi5pbmRleE9mKGUpKXJldHVybidpbnZhbGlkIGZyb250Q29sb3IgIicrZSsnIid9fSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxhbmltYXRpb246e3R5cGU6T2JqZWN0LGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZHVyYXRpb246MCx0aW1pbmdGdW5jOiJsaW5lYXIifX0sdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0sdHI9e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LG5yPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldE5hdmlnYXRpb25CYXJDb2xvcjplcixzZXROYXZpZ2F0aW9uQmFyVGl0bGU6dHJ9KSxycj17c2Nyb2xsVG9wOnt0eXBlOk51bWJlcn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MzAwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZHVyYXRpb249TWF0aC5tYXgoMCxlKX19fSxpcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwYWdlU2Nyb2xsVG86cnJ9KSxvcj17dGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNvbnRlbnQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNob3dDYW5jZWw6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxjYW5jZWxUZXh0Ont0eXBlOlN0cmluZyxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuIGF0KCJ1bmkuc2hvd01vZGFsLmNhbmNlbCIpfX0sY2FuY2VsQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDAifSxjb25maXJtVGV4dDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybiBhdCgidW5pLnNob3dNb2RhbC5jb25maXJtIil9fSxjb25maXJtQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSx2aXNpYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH19LGFyPXt0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0saWNvbjp7ZGVmYXVsdDoic3VjY2VzcyIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7LTE9PT1bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihlKSYmKHQuaWNvbj0ic3VjY2VzcyIpfX0saW1hZ2U6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmKHQuaW1hZ2U9YnQoZSkpfX0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MTUwMH0sbWFzazp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfX0sc3I9e3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpY29uOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJsb2FkaW5nIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MWU4fSxtYXNrOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSxjcj17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybiJwYXJhbWV0ZXIuaXRlbUxpc3Qgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMSBpdGVtIn19LGl0ZW1Db2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMCJ9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxwb3BvdmVyOnt0eXBlOk9iamVjdH19LHVyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNob3dNb2RhbDpvcixzaG93VG9hc3Q6YXIsc2hvd0xvYWRpbmc6c3Isc2hvd0FjdGlvblNoZWV0OmNyfSksbHI9e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSxkcj17aW5kZXg6bHIsdGV4dDp7dHlwZTpTdHJpbmd9LGljb25QYXRoOnt0eXBlOlN0cmluZ30sc2VsZWN0ZWRJY29uUGF0aDp7dHlwZTpTdHJpbmd9LHBhZ2VQYXRoOnt0eXBlOlN0cmluZ319LGZyPXtjb2xvcjp7dHlwZTpTdHJpbmd9LHNlbGVjdGVkQ29sb3I6e3R5cGU6U3RyaW5nfSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nfSxiYWNrZ3JvdW5kSW1hZ2U6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJiEvXihsaW5lYXJ8cmFkaWFsKS1ncmFkaWVudFwoLis/XCk7PyQvLnRlc3QoZSkmJih0LmJhY2tncm91bmRJbWFnZT1idChlKSl9fSxiYWNrZ3JvdW5kUmVwZWF0Ont0eXBlOlN0cmluZ30sYm9yZGVyU3R5bGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJih0LmJvcmRlclN0eWxlPSJibGFjayI9PT1lPyJibGFjayI6IndoaXRlIil9fX0scHI9e2FuaW1hdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxocj17YW5pbWF0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LHZyPXtpbmRleDpscn0sZ3I9e2luZGV4OmxyfSxtcj17aW5kZXg6bHJ9LHlyPXtpbmRleDpscix0ZXh0Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2YXIgbjt2b2lkIDA9PT0obj1lKSYmKG49IiIpLDQ8PSgiIituKS5yZXBsYWNlKC9bXlx4MDAtXHhmZl0vZywiKioiKS5sZW5ndGgmJih0LnRleHQ9Ii4uLiIpfX19LF9yPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldFRhYkJhckl0ZW06ZHIsc2V0VGFiQmFyU3R5bGU6ZnIsaGlkZVRhYkJhcjpwcixzaG93VGFiQmFyOmhyLGhpZGVUYWJCYXJSZWREb3Q6dnIsc2hvd1RhYkJhclJlZERvdDpncixyZW1vdmVUYWJCYXJCYWRnZTptcixzZXRUYWJCYXJCYWRnZTp5cn0pLGJyPU9iamVjdC5jcmVhdGUobnVsbCksd3I9KGpuPXsiLi9iYXNlL2Jhc2U2NC5qcyI6dWUsIi4vYmFzZS9jYW4taS11c2UuanMiOmRlLCIuL2Jhc2UvZXZlbnQtYnVzLmpzIjpnZSwiLi9iYXNlL2ludGVyY2VwdG9yLmpzIjpfZSwiLi9iYXNlL3VweDJweC5qcyI6d2UsIi4vY29udGV4dC9jYW52YXMuanMiOkVlLCIuL2NvbnRleHQvY29udGV4dC5qcyI6amUsIi4vZGV2aWNlL2FkZC1waG9uZS1jb250YWN0LmpzIjpCZSwiLi9kZXZpY2UvbWFrZS1waG9uZS1jYWxsLmpzIjpEZSwiLi9kZXZpY2Uvc2Nhbi1jb2RlLmpzIjpGZSwiLi9kZXZpY2Uvc2V0LWNsaXBib2FyZC1kYXRhLmpzIjpwdCwiLi9maWxlL2ZpbGUuanMiOlR0LCIuL2ZpbGUvb3Blbi1kb2N1bWVudC5qcyI6RXQsIi4vbG9jYXRpb24vY2hvb3NlLWxvY2F0aW9uLmpzIjpBdCwiLi9sb2NhdGlvbi9nZXQtbG9jYXRpb24uanMiOk10LCIuL2xvY2F0aW9uL29wZW4tbG9jYXRpb24uanMiOk50LCIuL21lZGlhL2Nob29zZS1maWxlLmpzIjpSdCwiLi9tZWRpYS9jaG9vc2UtaW1hZ2UuanMiOlZ0LCIuL21lZGlhL2Nob29zZS12aWRlby5qcyI6SHQsIi4vbWVkaWEvY29tcHJlc3MtaW1hZ2UuanMiOkp0LCIuL21lZGlhL2NvbXByZXNzLXZpZGVvLmpzIjpZdCwiLi9tZWRpYS9nZXQtaW1hZ2UtaW5mby5qcyI6WnQsIi4vbWVkaWEvZ2V0LXZpZGVvLWluZm8uanMiOmVuLCIuL21lZGlhL3ByZXZpZXctaW1hZ2UuanMiOm5uLCIuL21lZGlhL3NhdmUtaW1hZ2UtdG8tcGhvdG9zLWFsYnVtLmpzIjpvbiwiLi9uZXR3b3JrL2Rvd25sb2FkLWZpbGUuanMiOnNuLCIuL25ldHdvcmsvcmVxdWVzdC5qcyI6dm4sIi4vbmV0d29yay9zb2NrZXQuanMiOmJuLCIuL25ldHdvcmsvdXBsb2FkLWZpbGUuanMiOmtuLCIuL3BsdWdpbi9nZXQtcHJvdmlkZXIuanMiOkNuLCIuL3BsdWdpbi9sb2FkLXN1Yi1wYWNrYWdlLmpzIjpPbiwiLi9wbHVnaW4vcHJlLWxvZ2luLmpzIjpBbiwiLi9yb3V0ZS9yb3V0ZS5qcyI6Vm4sIi4vc3RvcmFnZS9zdG9yYWdlLmpzIjpZbiwiLi91aS9sb2FkLWZvbnQtZmFjZS5qcyI6Wm4sIi4vdWkvbmF2aWdhdGlvbi1iYXIuanMiOm5yLCIuL3VpL3BhZ2Utc2Nyb2xsLXRvLmpzIjppciwiLi91aS9wb3B1cC5qcyI6dXIsIi4vdWkvdGFiLWJhci5qcyI6X3J9LChObj1mdW5jdGlvbihlKXtyZXR1cm4gam5bZV18fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZSsiJy4iKX0oKX0pLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMoam4pfSxObik7ZnVuY3Rpb24ga3IoZSx0LG4pe3ZhciByPXRbZV0saT0hayhuLGUpLG89bltlXTtpZigtMTxmdW5jdGlvbihlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBUcih0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKFRyKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9KEJvb2xlYW4sci50eXBlKSYmaSYmIWsociwiZGVmYXVsdCIpJiYobz0hMSksdm9pZCAwPT09byYmayhyLCJkZWZhdWx0Iikpe3ZhciBhPXIuZGVmYXVsdDtvPUMoYSk/YSgpOmEsbltlXT1vfXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe2lmKGUucmVxdWlyZWQmJnIpcmV0dXJuIk1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGAiK3QrImAiO2lmKG51bGw9PW4mJiFlLnJlcXVpcmVkKXt2YXIgbz1lLnZhbGlkYXRvcjtyZXR1cm4gbz9vKG4saSk6dm9pZCAwfXZhciBhPWUudHlwZSxzPSFhfHwhMD09PWEsYz1bXTtpZihhKXtBcnJheS5pc0FycmF5KGEpfHwoYT1bYV0pO2Zvcih2YXIgdT0wO3U8YS5sZW5ndGgmJiFzO3UrKyl7dmFyIGw9eHIobixhW3VdKTtjLnB1c2gobC5leHBlY3RlZFR5cGV8fCIiKSxzPWwudmFsaWR9fWlmKCFzKXJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI9InBhcmFtZXRlciBgIitlKyJgLiBFeHBlY3RlZCAiK24uam9pbigiLCAiKSxpPW5bMF0sbz1wKHQpLGE9T3IodCxpKSxzPU9yKHQsbyk7MT09PW4ubGVuZ3RoJiZJcihpKSYmIWZ1bmN0aW9uKCl7dmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO2Zvcig7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09PWUudG9Mb3dlckNhc2UoKX0pfShpLG8pJiYocis9IiB3aXRoIHZhbHVlICIrYSk7cis9IiwgZ290ICIrbysiICIsSXIobykmJihyKz0id2l0aCB2YWx1ZSAiK3MrIi4iKTtyZXR1cm4gcn0odCxuLGMpO3ZhciBkPWUudmFsaWRhdG9yO2lmKGQpcmV0dXJuIGQobixpKX0ocixlLG8saSxuKX13ci5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbihlKXtPYmplY3QuYXNzaWduKGJyLHdyKGUpKX0pO3ZhciBTcj0vXihTdHJpbmd8TnVtYmVyfEJvb2xlYW58RnVuY3Rpb258U3ltYm9sKSQvO2Z1bmN0aW9uIHhyKGUsdCl7dmFyIG4scj1Dcih0KTtpZihTci50ZXN0KHIpKXt2YXIgaT10eXBlb2YgZTsobj1pPT09ci50b0xvd2VyQ2FzZSgpKXx8Im9iamVjdCIhPT1pfHwobj1lIGluc3RhbmNlb2YgdCl9ZWxzZSBuPTA8PWUuYnl0ZUxlbmd0aHx8KCJPYmplY3QiPT09cj9UKGUpOiJBcnJheSI9PT1yP0FycmF5LmlzQXJyYXkoZSk6ZSBpbnN0YW5jZW9mIHR8fHAoZSk9PT1Dcih0KSk7cmV0dXJue3ZhbGlkOm4sZXhwZWN0ZWRUeXBlOnJ9fWZ1bmN0aW9uIENyKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBUcihlLHQpe3JldHVybiBDcihlKT09PUNyKHQpfWZ1bmN0aW9uIE9yKGUsdCl7cmV0dXJuIlN0cmluZyI9PT10PyciJytlKyciJzoiTnVtYmVyIj09PXQ/IiIrTnVtYmVyKGUpOiIiK2V9dmFyIEVyPVsic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiJdO2Z1bmN0aW9uIElyKHQpe3JldHVybiBFci5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0LnRvTG93ZXJDYXNlKCk9PT1lfSl9ZnVuY3Rpb24gQXIoZSx0LG4pe3ZhciByPXQrIjpmYWlsICIrZTtpZigtMT09PW4pdGhyb3cgbmV3IEVycm9yKHIpO3JldHVybiJudW1iZXIiPT10eXBlb2YgbiYmTHIobix7ZXJyTXNnOnJ9KSwhMX12YXIgJHI9W3tuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMH1dLFByPVsiYmVmb3JlVmFsaWRhdGUiLCJiZWZvcmVBbGwiLCJiZWZvcmVTdWNjZXNzIl07ZnVuY3Rpb24gTXIoZSxuLHQpe3ZhciByPWJyW2VdO2lmKCFyJiZpZShlKSYmKHI9JHIpLHIpe2lmKEFycmF5LmlzQXJyYXkocikmJkFycmF5LmlzQXJyYXkobikpe3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCksbz1PYmplY3QuY3JlYXRlKG51bGwpLGE9bi5sZW5ndGg7ci5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7aVtlLm5hbWVdPWUsdDxhJiYob1tlLm5hbWVdPW5bdF0pfSkscj1pLG49b31pZihDKHIuYmVmb3JlVmFsaWRhdGUpKXt2YXIgcz1yLmJlZm9yZVZhbGlkYXRlKG4pO2lmKHMpcmV0dXJuIEFyKHMsZSx0KX1mb3IodmFyIGM9T2JqZWN0LmtleXMociksdT0wO3U8Yy5sZW5ndGg7dSsrKWlmKC0xPT09UHIuaW5kZXhPZihjW3VdKSl7dmFyIGw9a3IoY1t1XSxyLG4pO2lmKGwpcmV0dXJuIEFyKGwsZSx0KX19cmV0dXJuITB9dmFyIGpyPTEsTnI9e307ZnVuY3Rpb24gQnIoZSx0LG4pe3ZvaWQgMD09PXQmJih0PXt9KSx2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9ZnVuY3Rpb24oaSxvLGUpe2lmKHZvaWQgMD09PW8mJihvPXt9KSx2b2lkIDA9PT1lJiYoZT17fSksIVQobykpcmV0dXJue3BhcmFtczpvfTt2YXIgdD1hZShvPU9iamVjdC5hc3NpZ24oe30sbykpLGE9dC5zdWNjZXNzLHM9dC5mYWlsLGM9dC5jYW5jZWwsdT10LmNvbXBsZXRlLGw9QyhhKSxkPUMocyksZj1DKGMpLHA9Qyh1KTtpZighKGx8fGR8fGZ8fHApKXJldHVybntwYXJhbXM6b307dmFyIG49e307Zm9yKHZhciByIGluIGUpe3ZhciBoPWVbcl07QyhoKSYmKG5bcl09QihoKSl9dmFyIHY9bi5iZWZvcmVTdWNjZXNzLGc9bi5hZnRlclN1Y2Nlc3MsbT1uLmJlZm9yZUZhaWwseT1uLmFmdGVyRmFpbCxfPW4uYmVmb3JlQ2FuY2VsLGI9bi5hZnRlckNhbmNlbCx3PW4uYmVmb3JlQWxsLGs9bi5hZnRlckFsbCxTPWpyKysseD0iYXBpLiIraSsiLiIrUztyZXR1cm4gTnJbU109e25hbWU6eCxjYWxsYmFjazpmdW5jdGlvbihlKXtpZihlLmVyck1zZz1lLmVyck1zZ3x8aSsiOm9rIiwtMSE9PWUuZXJyTXNnLmluZGV4T2YoIjpvayIpKWUuZXJyTXNnPWkrIjpvayI7ZWxzZSBpZigtMSE9PWUuZXJyTXNnLmluZGV4T2YoIjpjYW5jZWwiKSllLmVyck1zZz1pKyI6Y2FuY2VsIjtlbHNlIGlmKC0xIT09ZS5lcnJNc2cuaW5kZXhPZigiOmZhaWwiKSl7dmFyIHQ9IiIsbj1lLmVyck1zZy5pbmRleE9mKCIgIik7LTE8biYmKHQ9ZS5lcnJNc2cuc3Vic3RyKG4pKSxlLmVyck1zZz1pKyI6ZmFpbCIrdH1DKHcpJiZ3KGUpO3ZhciByPWUuZXJyTXNnOzA9PT1yLmluZGV4T2YoaSsiOm9rIik/KEModikmJnYoZSxvKSxsJiZhKGUpLEMoZykmJmcoZSkpOjA9PT1yLmluZGV4T2YoaSsiOmNhbmNlbCIpPyhlLmVyck1zZz1lLmVyck1zZy5yZXBsYWNlKGkrIjpjYW5jZWwiLGkrIjpmYWlsIGNhbmNlbCIpLGQmJnMoZSksQyhfKSYmXyhlKSxmJiZjKGUpLEMoYikmJmIoZSkpOjA9PT1yLmluZGV4T2YoaSsiOmZhaWwiKSYmKEMobSkmJm0oZSksZCYmcyhlKSxDKHkpJiZ5KGUpKSxwJiZ1KGUpLEMoaykmJmsoZSl9fSx7cGFyYW1zOm8sY2FsbGJhY2tJZDpTfX0oZSx0LG4pLGk9ci5wYXJhbXMsbz1yLmNhbGxiYWNrSWQ7cmV0dXJuIFQoaSkmJiFNcihlLGksbyk/e3BhcmFtczppLGNhbGxiYWNrSWQ6ITF9OntwYXJhbXM6aSxjYWxsYmFja0lkOm99fWZ1bmN0aW9uIExyKGUsdCxuKXtpZigibnVtYmVyIj09dHlwZW9mIGUpe3ZhciByPU5yW2VdO2lmKHIpcmV0dXJuIHIua2VlcEFsaXZlfHxkZWxldGUgTnJbZV0sci5jYWxsYmFjayh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIERyKHQpe3JldHVybiBmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKCJBUEkgYCIrdCsiYCBpcyBub3QgeWV0IGltcGxlbWVudGVkIil9fXZhciBScj1bImdldFB1c2hDbGllbnRJZCIsIm9uUHVzaE1lc3NhZ2UiLCJvZmZQdXNoTWVzc2FnZSJdO2Z1bmN0aW9uIEZyKGMsdSxsKXtyZXR1cm4gdm9pZCAwPT09bCYmKGw9e30pLC0xPFJyLmluZGV4T2YoYyl8fCFDKHUpP3U6KGU9bCwodD1icltjXSkmJihDKHQuYmVmb3JlQWxsKSYmKGUuYmVmb3JlQWxsPXQuYmVmb3JlQWxsKSxDKHQuYmVmb3JlU3VjY2VzcykmJihlLmJlZm9yZVN1Y2Nlc3M9dC5iZWZvcmVTdWNjZXNzKSksZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWFyZ3VtZW50c1tuXTtpZihyZShjKSl7aWYoTXIoYyx0LC0xKSlyZXR1cm4gdS5hcHBseShudWxsLHQpfWVsc2UgaWYoaWUoYykpe2lmKE1yKGMsdCwtMSkpcmV0dXJuIHUoKGMuc3RhcnRzV2l0aCgib2ZmIik/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gTnIpe3ZhciByPU5yW25dO2lmKHIubmFtZS5zdGFydHNXaXRoKCJhcGkuIitlLnJlcGxhY2UoL15vZmYvLCJvbiIpKSYmci5jYWxsYmFjaz09PXQpcmV0dXJuIGRlbGV0ZSBOcltuXSxOdW1iZXIobil9cmV0dXJuImZhaWwifTpmdW5jdGlvbihlLHQpe3ZhciBuPWpyKysscj0iYXBpLiIrZSsiLiIrbjtyZXR1cm4gTnJbbl09e25hbWU6cixrZWVwQWxpdmU6ITAsY2FsbGJhY2s6dH0sbn0pKGMsdFswXSkpfWVsc2V7dmFyIHI9e307dC5sZW5ndGgmJihyPXRbMF0pO3ZhciBpLG89QnIoYyxyLGwpLGE9by5wYXJhbXMscz1vLmNhbGxiYWNrSWQ7aWYoITEhPT1zKXJldHVybihpPUMoYSk/dShzKTp1KGEscykpJiYoZT1jLC0xPT09ZWUuaW5kZXhPZihlKSkmJlQoaT1McihzLGkpKSYmKGkuZXJyTXNnPWkuZXJyTXNnfHxjKyI6b2siKSxpfX0pO3ZhciBlLHR9ZnVuY3Rpb24gVXIoZSx0KXtyZXR1cm4gZSh0PXtleHBvcnRzOnt9fSx0LmV4cG9ydHMpLHQuZXhwb3J0c312YXIgenI9VXIoZnVuY3Rpb24oZSx0KXshZnVuY3Rpb24oKXtmb3IodmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGQ9bmV3IFVpbnQ4QXJyYXkoMjU2KSxlPTA7ZTxvLmxlbmd0aDtlKyspZFtvLmNoYXJDb2RlQXQoZSldPWU7dC5lbmNvZGU9ZnVuY3Rpb24oZSl7dmFyIHQsbj1uZXcgVWludDhBcnJheShlKSxyPW4ubGVuZ3RoLGk9IiI7Zm9yKHQ9MDt0PHI7dCs9MylpKz1vW25bdF0+PjJdLGkrPW9bKDMmblt0XSk8PDR8blt0KzFdPj40XSxpKz1vWygxNSZuW3QrMV0pPDwyfG5bdCsyXT4+Nl0saSs9b1s2MyZuW3QrMl1dO3JldHVybiByJTM9PTI/aT1pLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpKyI9IjpyJTM9PTEmJihpPWkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMikrIj09IiksaX0sdC5kZWNvZGU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPS43NSplLmxlbmd0aCxzPWUubGVuZ3RoLGM9MDsiPSI9PT1lW2UubGVuZ3RoLTFdJiYoYS0tLCI9Ij09PWVbZS5sZW5ndGgtMl0mJmEtLSk7dmFyIHU9bmV3IEFycmF5QnVmZmVyKGEpLGw9bmV3IFVpbnQ4QXJyYXkodSk7Zm9yKHQ9MDt0PHM7dCs9NCluPWRbZS5jaGFyQ29kZUF0KHQpXSxyPWRbZS5jaGFyQ29kZUF0KHQrMSldLGk9ZFtlLmNoYXJDb2RlQXQodCsyKV0sbz1kW2UuY2hhckNvZGVBdCh0KzMpXSxsW2MrK109bjw8MnxyPj40LGxbYysrXT0oMTUmcik8PDR8aT4+MixsW2MrK109KDMmaSk8PDZ8NjMmbztyZXR1cm4gdX19KCl9KSxWcj16ci5lbmNvZGUscXI9enIuZGVjb2RlO3ZhciBXcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxiYXNlNjRUb0FycmF5QnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBxcihlKX0sYXJyYXlCdWZmZXJUb0Jhc2U2NDpmdW5jdGlvbihlKXtyZXR1cm4gVnIoZSl9fSksSHI9e307dmFyIEdyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNhbklVc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoSHIsZSk/SHJbZV06ISFrKG92LGUpfX0pLEpyPXtwcm9taXNlSW50ZXJjZXB0b3I6WX0sWHI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaW50ZXJjZXB0b3JzOkpyLGFkZEludGVyY2VwdG9yOmZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlJiZUKHQpP1UoRltlXXx8KEZbZV09e30pLHQpOlQoZSkmJlUoUixlKX0scmVtb3ZlSW50ZXJjZXB0b3I6ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGU/VCh0KT96KEZbZV0sdCk6ZGVsZXRlIEZbZV06VChlKSYmeihSLGUpfX0pLFlyPSExLEtyPTAsWnI9MDtmdW5jdGlvbiBRcihlLHQpe3JldHVybiBlPU51bWJlcihlKSxpc05hTihlKT90OmV9dmFyIGVpPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVweDJweDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvO2lmKDA9PT1LciYmKG49bGcuZ2V0U3lzdGVtSW5mb1N5bmMoKSxyPW4ucGxhdGZvcm0saT1uLnBpeGVsUmF0aW8sbz1uLndpbmRvd1dpZHRoLEtyPW8sWnI9aSxZcj0iaW9zIj09PXIpLDA9PT0oZT1OdW1iZXIoZSkpKXJldHVybiAwO3ZhciBhPWNnLmdsb2JhbFN0eWxlfHxjZy53aW5kb3d8fHt9LHM9UXIoYS5ycHhDYWxjTWF4RGV2aWNlV2lkdGgsOTYwKSxjPVFyKGEucnB4Q2FsY0Jhc2VEZXZpY2VXaWR0aCwzNzUpLHU9UXIoYS5ycHhDYWxjSW5jbHVkZVdpZHRoLDc1MCksbD10fHxLcixkPWUvNzUwKihsPWU9PT11fHxsPD1zP2w6Yyk7cmV0dXJuIGQ8MCYmKGQ9LWQpLDA9PT0oZD1NYXRoLmZsb29yKGQrMWUtNCkpJiYoZD0xIT09WnImJllyPy41OjEpLGU8MD8tZDpkfX0pO2Z1bmN0aW9uIHRpKGUsdCxuLHIpe3JnLnB1Ymxpc2hIYW5kbGVyKHQrIi1hdWRpby0iK2Use2F1ZGlvSWQ6ZSx0eXBlOm4sZGF0YTpyfSx0KX12YXIgbmk9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlSWQ9dH07bmkucHJvdG90eXBlLnNldFNyYz1mdW5jdGlvbihlKXt0aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJzZXRTcmMiLHtzcmM6ZX0pfSxuaS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBsYXkiKX0sbmkucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicGF1c2UiKX0sbmkucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24oZSl7dGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VlayIse3Bvc2l0aW9uOmV9KX07dmFyIHJpPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUF1ZGlvQ29udGV4dDpmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIG5ldyBuaShlLHQuJHBhZ2UuaWQpO3ZhciBuPWRnKCk7aWYobi4kcm91dGUmJm4uJHJvdXRlLnBhcmFtcy5fX2lkX18pcmV0dXJuIG5ldyBuaShlLG4uJHJvdXRlLnBhcmFtcy5fX2lkX18pO3JnLmVtaXQoIm9uRXJyb3IiLCJjcmVhdGVBdWRpb0NvbnRleHQ6ZmFpbCIpfX0pLGlpPW5ldyBlZztmdW5jdGlvbiBvaShlLHQsbil7cmV0dXJuIGVbdF0uYXBwbHkoZSxuKX1mdW5jdGlvbiBhaSgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSk7ZS0tOyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gb2koaWksIiRvbiIsW10uY29uY2F0KHQpKX1mdW5jdGlvbiBzaSgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSk7ZS0tOyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gb2koaWksIiRvZmYiLFtdLmNvbmNhdCh0KSl9ZnVuY3Rpb24gY2koKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpO2UtLTspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIG9pKGlpLCIkb25jZSIsW10uY29uY2F0KHQpKX1mdW5jdGlvbiB1aSgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSk7ZS0tOyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gb2koaWksIiRlbWl0IixbXS5jb25jYXQodCkpfXZhciBsaSxkaT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCwkb246YWksJG9mZjpzaSwkb25jZTpjaSwkZW1pdDp1aX0pO2Z1bmN0aW9uIGZpKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiByZy5pbnZva2VDYWxsYmFja0hhbmRsZXIuYXBwbHkocmcsZSl9ZnVuY3Rpb24gcGkoZSl7cmV0dXJuIGxnLnJlcXVpcmVOYXRpdmVQbHVnaW4oZSl9ZnVuY3Rpb24gaGkoZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3JldHVybiByZy5lbWl0LmFwcGx5KHJnLFsiYXBpLiIrZV0uY29uY2F0KHQpKX12YXIgdmk9bmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlO2Z1bmN0aW9uIGdpKGUpe3ZpKGxpPWUpfWZ1bmN0aW9uIG1pKGUpe2lmKCFlKXt2YXIgdD1mZygpO2lmKCF0Lmxlbmd0aClyZXR1cm47aWYoIShlPXRbdC5sZW5ndGgtMV0uJHBhZ2UubWV0YS5zdGF0dXNCYXJTdHlsZSl8fGU9PT1saSlyZXR1cm59ZSE9PWxpJiYobGk9ZSxuZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoZSkpfWZ1bmN0aW9uIHlpKHQpe2lmKHZvaWQgMD09PXQmJih0PSIiKSwhY2cudGFiQmFyfHwhQXJyYXkuaXNBcnJheShjZy50YWJCYXIubGlzdCkpcmV0dXJuITE7dHJ5e2lmKCF0KXt2YXIgZT1mZygpO2lmKCFlLmxlbmd0aClyZXR1cm4hMTt2YXIgbj1lW2UubGVuZ3RoLTFdO3JldHVybiEhbiYmbi4kcGFnZS5tZXRhLmlzVGFiQmFyfS9eXC8vLnRlc3QodCl8fCh0PSIvIit0KTt2YXIgcj11Zy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT10fSk7cmV0dXJuIHImJnIubWV0YS5pc1RhYkJhcn1jYXRjaChlKXt9cmV0dXJuITF9ZnVuY3Rpb24gX2koZSl7cmV0dXJuIHFyKGUpfWZ1bmN0aW9uIGJpKGUpe3JldHVybiBWcihlKX1mdW5jdGlvbiB3aShlLHQsbixyKXt2YXIgaT1lKHQpO3JldHVybiBpJiZpLmVyck1zZyYmKGkuZXJyTXNnPWkuZXJyTXNnLnJlcGxhY2UobixyKSksaX1mdW5jdGlvbiBraShlKXtyZXR1cm4gZT9lLiRnZXRBcHBXZWJ2aWV3KCk6U2koKX1mdW5jdGlvbiBTaSgpe3RyeXt2YXIgZT1mZygpO2lmKGUubGVuZ3RoKXJldHVybiBlW2UubGVuZ3RoLTFdLiRnZXRBcHBXZWJ2aWV3KCl9Y2F0Y2goZSl7fX1uZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU9Z2k7dmFyIHhpPWZ1bmN0aW9uKGUsdCl7aWYoMD09PXQuaW5kZXhPZigiLi8iKSlyZXR1cm4geGkoZSx0LnN1YnN0cigyKSk7dmFyIG4scixpPXQuc3BsaXQoIi8iKTtmb3Iobj0wLHI9aS5sZW5ndGg7bjxyJiYiLi4iPT09aVtuXTtuKyspO2kuc3BsaWNlKDAsbiksdD1pLmpvaW4oIi8iKTt2YXIgbz0wPGUubGVuZ3RoP2Uuc3BsaXQoIi8iKTpbXTtyZXR1cm4gby5zcGxpY2Uoby5sZW5ndGgtbi0xLG4rMSksby5jb25jYXQoaSkuam9pbigiLyIpfSxDaT1mdW5jdGlvbihlKXtyZXR1cm4gbmcuaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKS5yZXBsYWNlKC9eXC8/YXBwc1wvLywiL2FuZHJvaWRfYXNzZXQvYXBwcy8iKS5yZXBsYWNlKC9cLyQvLCIiKX07ZnVuY3Rpb24gVGkoZSl7aWYoMD09PWUuaW5kZXhPZigiLy8iKSlyZXR1cm4iaHR0cHM6IitlO2lmKC9eKFthLXotXSs6KT9cL1wvL2kudGVzdChlKXx8L15kYXRhOi4qLC4qLy50ZXN0KGUpKXJldHVybiBlO2lmKDA9PT1lLmluZGV4T2YoIl93d3ciKXx8MD09PWUuaW5kZXhPZigiX2RvYyIpfHwwPT09ZS5pbmRleE9mKCJfZG9jdW1lbnRzIil8fDA9PT1lLmluZGV4T2YoIl9kb3dubG9hZHMiKSlyZXR1cm4iZmlsZTovLyIrQ2koZSk7dmFyIHQ9ImZpbGU6Ly8iK0NpKCJfd3d3Iik7aWYoMD09PWUuaW5kZXhPZigiLyIpKXJldHVybiBlLnN0YXJ0c1dpdGgoIi9zdG9yYWdlLyIpfHxlLnN0YXJ0c1dpdGgoIi9zZGNhcmQvIil8fGUuaW5jbHVkZXMoIi9Db250YWluZXJzL0RhdGEvQXBwbGljYXRpb24vIik/ImZpbGU6Ly8iK2U6dCtlO2lmKDA9PT1lLmluZGV4T2YoIi4uLyIpfHwwPT09ZS5pbmRleE9mKCIuLyIpKXtpZigic3RyaW5nIj09dHlwZW9mIF9faWRfXylyZXR1cm4gdCt4aSgiLyIrX19pZF9fLGUpO3ZhciBuPWZnKCk7aWYobi5sZW5ndGgpcmV0dXJuIHQreGkoIi8iK25bbi5sZW5ndGgtMV0ucm91dGUsZSl9cmV0dXJuIGV9dmFyIE9pPTMuMTQxNTkyNjUzNTg5NzkzLEVpPTYzNzgyNDUsSWk9LjAwNjY5MzQyMTYyMjk2NTk0Mzt2YXIgQWk9ZnVuY3Rpb24oZSx0KXt2YXIgbj0yKmUtMTAwKzMqdCsuMip0KnQrLjEqZSp0Ky4yKk1hdGguc3FydChNYXRoLmFicyhlKSk7cmV0dXJuIG4rPTIqKDIwKk1hdGguc2luKDYqZSpPaSkrMjAqTWF0aC5zaW4oMiplKk9pKSkvMyxuKz0yKigyMCpNYXRoLnNpbih0Kk9pKSs0MCpNYXRoLnNpbih0LzMqT2kpKS8zLG4rPTIqKDE2MCpNYXRoLnNpbih0LzEyKk9pKSszMjAqTWF0aC5zaW4odCpPaS8zMCkpLzN9LCRpPWZ1bmN0aW9uKGUsdCl7dmFyIG49MzAwK2UrMip0Ky4xKmUqZSsuMSplKnQrLjEqTWF0aC5zcXJ0KE1hdGguYWJzKGUpKTtyZXR1cm4gbis9MiooMjAqTWF0aC5zaW4oNiplKk9pKSsyMCpNYXRoLnNpbigyKmUqT2kpKS8zLG4rPTIqKDIwKk1hdGguc2luKGUqT2kpKzQwKk1hdGguc2luKGUvMypPaSkpLzMsbis9MiooMTUwKk1hdGguc2luKGUvMTIqT2kpKzMwMCpNYXRoLnNpbihlLzMwKk9pKSkvM30sUGk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZTw3Mi4wMDR8fDEzNy44MzQ3PGV8fHQ8LjgyOTN8fDU1LjgyNzE8dHx8ITF9O2Z1bmN0aW9uIE1pKGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQpe25nW2VdW25dKGZ1bmN0aW9uKGUpe2UmJihkZWxldGUgZS5jb2RlLGRlbGV0ZSBlLm1lc3NhZ2UpLGZpKHQsZSl9KX19ZnVuY3Rpb24gamkodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fSxmaSh0LE9iamVjdC5hc3NpZ24oe30sZSx7ZXJyTXNnOm4rIjpvayJ9KSl9fWZ1bmN0aW9uIE5pKGEscyxjKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9KGU9ZXx8e30pLmNvZGU7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49ZS5tZXNzYWdlLHI9e307Zm9yKHZhciBpIGluIGUpLTE9PT1bImNvZGUiLCJtZXNzYWdlIl0uaW5kZXhPZihpKSYmKHJbaV09ZVtpXSk7dmFyIG89cjtmaShhLE9iamVjdC5hc3NpZ24oe30se2Vyck1zZzpzKyI6ZmFpbCAiKyhufHxjfHwiIiksZXJyQ29kZTp0LGNvZGU6dH0sbykpfX1mdW5jdGlvbiBCaShuLHIsaSxvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgaSYmKGU9aShlKSksbmdbbl1bcl0oT2JqZWN0LmFzc2lnbihlLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KSxkZWxldGUgZS5jb2RlLGRlbGV0ZSBlLm1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIG8mJihlPW8oZSkpLGZpKHQsT2JqZWN0LmFzc2lnbih7fSxlLHtlcnJNc2c6cisiOm9rIn0pKX0sZmFpbDpOaSh0LHIpfSkpfX1mdW5jdGlvbiBMaShlKXt2YXIgdD1lLnNwbGl0KCIvIik7cmV0dXJuIHRbdC5sZW5ndGgtMV19dmFyIERpLFJpPSJwbGF5YmFjayIsRmk9e30sVWk9WyJwbGF5IiwiY2FucGxheSIsImVuZGVkIiwic3RvcCIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIiwicGF1c2UiXSx6aT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksaGkoIm9uQXVkaW9TdGF0ZUNoYW5nZSIsT2JqZWN0LmFzc2lnbih7c3RhdGU6ZX0sdCkpfTt2YXIgVmk9bnVsbCxxaT0yNTAsV2k9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLGhpKCJvbkJhY2tncm91bmRBdWRpb1N0YXRlQ2hhbmdlIixPYmplY3QuYXNzaWduKHtzdGF0ZTplfSx0KSl9LEhpPVsicGxheSIsInBhdXNlIiwiZW5kZWQiLCJzdG9wIiwiY2FucGxheSJdO2Z1bmN0aW9uIEdpKCl7RGl8fCgoRGk9bmcuYXVkaW8uY3JlYXRlUGxheWVyKHthdXRvcGxheTohMCxiYWNrZ3JvdW5kQ29udHJvbDohMH0pKS5zcmM9RGkudGl0bGU9RGkuZXBuYW1lPURpLnNpbmdlcj1EaS5jb3ZlckltZ1VybD1EaS53ZWJVcmw9IiIsRGkuc3RhcnRUaW1lPTAsSGkuZm9yRWFjaChmdW5jdGlvbih0KXtEaS5hZGRFdmVudExpc3RlbmVyKHQsZnVuY3Rpb24oKXsicGxheSI9PT10PyhEaS5pc1N0b3BwZWQ9ITEsSmkoKSxXaSgidGltZVVwZGF0ZSIse30pLFZpPWFnKGZ1bmN0aW9uKCl7V2koInRpbWVVcGRhdGUiLHt9KX0scWkpKToic3RvcCI9PT10JiYoRGkuaXNTdG9wcGVkPSEwKSwicGF1c2UiIT09dCYmImVuZGVkIiE9PXQmJiJzdG9wIiE9PXR8fEppKCk7dmFyIGU9Im9uTXVzaWMiKyh0WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSkpO2hpKGUse2RhdGFVcmw6RGkuc3JjLGVyck1zZzplKyI6b2sifSksV2kodCx7ZGF0YVVybDpEaS5zcmN9KX0pfSksRGkuYWRkRXZlbnRMaXN0ZW5lcigid2FpdGluZyIsZnVuY3Rpb24oKXtKaSgpLFdpKCJ3YWl0aW5nIix7ZGF0YVVybDpEaS5zcmN9KX0pLERpLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihlKXtKaSgpLGhpKCJvbk11c2ljRXJyb3IiLHtkYXRhVXJsOkRpLnNyYyxlcnJNc2c6IkVycm9yOiIrZS5tZXNzYWdlfSksV2koImVycm9yIix7ZGF0YVVybDpEaS5zcmMsZXJyTXNnOmUubWVzc2FnZSxlcnJDb2RlOmUuY29kZX0pfSksRGkuYWRkRXZlbnRMaXN0ZW5lcigicHJldiIsZnVuY3Rpb24oKXtyZXR1cm4gaGkoIm9uQmFja2dyb3VuZEF1ZGlvUHJldiIpfSksRGkuYWRkRXZlbnRMaXN0ZW5lcigibmV4dCIsZnVuY3Rpb24oKXtyZXR1cm4gaGkoIm9uQmFja2dyb3VuZEF1ZGlvTmV4dCIpfSkpfWZ1bmN0aW9uIEppKCl7bnVsbCE9PVZpJiZzZyhWaSl9ZnVuY3Rpb24gWGkobixlKXtHaSgpO3ZhciByPVsic3JjIiwic3RhcnRUaW1lIiwiY292ZXJJbWdVcmwiLCJ3ZWJVcmwiLCJzaW5nZXIiLCJlcG5hbWUiLCJ0aXRsZSJdO2lmKGUmJiJwbGF5YmFja1JhdGUiPT09ZSl7dmFyIHQ9bltlXTtEaS5wbGF5YmFja1JhdGUmJkRpLnBsYXliYWNrUmF0ZShwYXJzZUZsb2F0KHQpKX1lbHNle3ZhciBpPXt9O09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoMDw9ci5pbmRleE9mKGUpKXt2YXIgdD1uW2VdO2U9PT1yWzBdJiZ0JiYodD1UaSh0KSksRGlbZV09aVtlXT10fX0pLERpLnNldFN0eWxlcyhpKX19ZnVuY3Rpb24gWWkoKXtyZXR1cm4gRGl9ZnVuY3Rpb24gS2koZSl7dmFyIHQ9ZS5vcGVyYXRpb25UeXBlLG49ZS5kYXRhVXJsLHI9ZS5wb3NpdGlvbixpPWUuYXBpO3ZvaWQgMD09PWkmJihpPSJvcGVyYXRlTXVzaWNQbGF5ZXIiKTt2YXIgbz1lLnRpdGxlLGE9ZS5jb3ZlckltZ1VybCxzPVlpKCk7cmV0dXJuIDA8WyJyZXN1bWUiLCJwYXVzZSIsInN0b3AiXS5pbmRleE9mKHQpP3MmJnNbdF0oKToicGxheSI9PT10PyhYaSh7c3JjOm4sc3RhcnRUaW1lOnIsdGl0bGU6byxjb3ZlckltZ1VybDphfSkscy5wbGF5KCkpOiJzZWVrIj09PXQmJnMmJnMuc2Vla1RvKHIpLHtlcnJNc2c6aSsiOm9rIn19dmFyIFppPSJzdWNjZXNzIixRaT0iZmFpbCIsZW89W1ppLFFpLCJjb21wbGV0ZSJdO2Z1bmN0aW9uIHRvKGUsdCxuLHIpe2lmKGUpe2lmKHZvaWQgMD09PW4pcmV0dXJuIGVbdF0oKTt2YXIgaT1pbyhuLHIpWzFdO3JldHVybiBPYmplY3Qua2V5cyhpKS5sZW5ndGg/ZVt0XShvbyh0LGkpKTplW3RdKCl9fWZ1bmN0aW9uIG5vKGUsdCxuLHIpe2lmKGUpe3ZhciBpPWlvKG4sciksbz1pWzBdLGE9aVsxXTtyZXR1cm4gT2JqZWN0LmtleXMoYSkubGVuZ3RoP2VbdF0obyxvbyh0LGEpKTplW3RdKG8pfX1mdW5jdGlvbiBybyhlLHQpe3ZhciBuPWZ1bmN0aW9uIGUodCxuKXtpZighdHx8IW4pcmV0dXJuO2lmKG4uYXR0ciYmbi5hdHRyLmlkPT09dClyZXR1cm4gbjt2YXIgcj1uLmNoaWxkcmVuO2lmKCFyKXJldHVybjtmb3IodmFyIGk9MCxvPXIubGVuZ3RoO2k8bztpKyspe3ZhciBhPWUodCxyW2ldKTtpZihhKXJldHVybiBhfX0oZSx0LiRlbCk7cmV0dXJuIG58fGNvbnNvbGUuZXJyb3IoIkNhbiBub3QgZmluZCBgIitlKyJgIil9ZnVuY3Rpb24gaW8obixlKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKSx0PWZ1bmN0aW9uKGUpe3ZhciB0PW5bZV07Qyh0KSYmKHJbZV09dCxkZWxldGUgbltlXSl9O3JldHVybiBlby5mb3JFYWNoKHQpLGUmJmUuZm9yRWFjaCh0KSxbbixyXX1mdW5jdGlvbiBvbyhpLG8pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGU7ZGVsZXRlIGUudHlwZTt2YXIgbj1vW3RdO2lmKHQ9PT1aaT9lLmVyck1zZz1pKyI6b2siOnQ9PT1RaSYmKGUuZXJyTXNnPWkrIjpmYWlsIisoZS5tc2c/IiAiK2UubXNnOiIiKSksZGVsZXRlIGUuY29kZSxkZWxldGUgZS5tc2csQyhuKSYmbihlKSx0PT09Wml8fHQ9PT1RaSl7dmFyIHI9by5jb21wbGV0ZTtDKHIpJiZyKGUpfX19dmFyIGFvPXtnZXRDZW50ZXJMb2NhdGlvbjpmdW5jdGlvbihlLHQpe3JldHVybiB0byhlLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9LG1vdmVUb0xvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsIm1vdmVUb0xvY2F0aW9uIix0KX0sdHJhbnNsYXRlTWFya2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInRyYW5zbGF0ZU1hcmtlciIsdCxbImFuaW1hdGlvbkVuZCJdKX0saW5jbHVkZVBvaW50czpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJpbmNsdWRlUG9pbnRzIix0KX0sZ2V0UmVnaW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRvKGUsImdldFJlZ2lvbiIsdCl9LGdldFNjYWxlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRvKGUsImdldFNjYWxlIix0KX0sYWRkQ3VzdG9tTGF5ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwiYWRkQ3VzdG9tTGF5ZXIiLHQpfSxyZW1vdmVDdXN0b21MYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJyZW1vdmVDdXN0b21MYXllciIsdCl9LGFkZEdyb3VuZE92ZXJsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9LHJlbW92ZUdyb3VuZE92ZXJsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwicmVtb3ZlR3JvdW5kT3ZlcmxheSIsdCl9LHVwZGF0ZUdyb3VuZE92ZXJsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwidXBkYXRlR3JvdW5kT3ZlcmxheSIsdCl9LGluaXRNYXJrZXJDbHVzdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsImluaXRNYXJrZXJDbHVzdGVyIix0KX0sYWRkTWFya2VyczpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJhZGRNYXJrZXJzIix0KX0scmVtb3ZlTWFya2VyczpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJyZW1vdmVNYXJrZXJzIix0KX0sbW92ZUFsb25nOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsIm1vdmVBbG9uZyIsdCl9LHNldExvY01hcmtlckljb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwic2V0TG9jTWFya2VySWNvbiIsdCl9LG9wZW5NYXBBcHA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwib3Blbk1hcEFwcCIsdCl9LG9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUub24odC5uYW1lLHQuY2FsbGJhY2spfX07dmFyIHNvPXtwbGF5OmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJwbGF5Iil9LHBhdXNlOmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJwYXVzZSIpfSxzZWVrOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInNlZWsiLHQucG9zaXRpb24pfSxzdG9wOmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJzdG9wIil9LHNlbmREYW5tdTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJzZW5kRGFubXUiLHQpfSxwbGF5YmFja1JhdGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwicGxheWJhY2tSYXRlIix0LnJhdGUpfSxyZXF1ZXN0RnVsbFNjcmVlbjpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJyZXF1ZXN0RnVsbFNjcmVlbiIsdCl9LGV4aXRGdWxsU2NyZWVuOmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJleGl0RnVsbFNjcmVlbiIpfSxzaG93U3RhdHVzQmFyOmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJzaG93U3RhdHVzQmFyIil9LGhpZGVTdGF0dXNCYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsImhpZGVTdGF0dXNCYXIiKX19O3ZhciBjbz1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLmN0eD10fTtmdW5jdGlvbiB1byhlLHQsbixyKXt2YXIgaT10LiRwYWdlLmlkO3JnLnB1Ymxpc2hIYW5kbGVyKGkrIi1saXZlcHVzaGVyLSIrZSx7bGl2ZVB1c2hlcklkOmUsdHlwZTpuLGRhdGE6cn0saSl9Y28ucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RhcnQiLGUpfSxjby5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInN0b3AiLGUpfSxjby5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJwYXVzZSIsZSl9LGNvLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJyZXN1bWUiLGUpfSxjby5wcm90b3R5cGUuc3dpdGNoQ2FtZXJhPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3dpdGNoQ2FtZXJhIixlKX0sY28ucHJvdG90eXBlLnNuYXBzaG90PWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic25hcHNob3QiLGUpfSxjby5wcm90b3R5cGUudG9nZ2xlVG9yY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJ0b2dnbGVUb3JjaCIsZSl9LGNvLnByb3RvdHlwZS5wbGF5QkdNPWZ1bmN0aW9uKGUpe3JldHVybiBubyh0aGlzLmN0eCwicGxheUJHTSIsZSl9LGNvLnByb3RvdHlwZS5zdG9wQkdNPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RvcEJHTSIsZSl9LGNvLnByb3RvdHlwZS5wYXVzZUJHTT1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInBhdXNlQkdNIixlKX0sY28ucHJvdG90eXBlLnJlc3VtZUJHTT1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInJlc3VtZUJHTSIsZSl9LGNvLnByb3RvdHlwZS5zZXRCR01Wb2x1bWU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5vKHRoaXMuY3R4LCJzZXRCR01Wb2x1bWUiLGUpfSxjby5wcm90b3R5cGUuc3RhcnRQcmV2aWV3PWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RhcnRQcmV2aWV3IixlKX0sY28ucHJvdG90eXBlLnN0b3BQcmV2aWV3PWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RvcFByZXZpZXciLGUpfSxyZy5zdWJzY3JpYmUoIm9uTGl2ZVB1c2hlck1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7TS5pbnZva2UodCxuKX0pO3ZhciBsbz17c3RhcnRQcmV2aWV3OiJwcmV2aWV3IixzdG9wUHJldmlldzoic3RvcCJ9LGZvPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMucGFnZVZtPXR9O2ZvLnByb3RvdHlwZS5vbj1mdW5jdGlvbihlLHQpe3VvKHRoaXMuaWQsdGhpcy5wYWdlVm0sIm9uIix7bmFtZTplLGNhbGxiYWNrOnR9KX0sWyJzdGFydCIsInN0b3AiLCJwYXVzZSIsInJlc3VtZSIsInN3aXRjaENhbWVyYSIsInN0YXJ0UHJldmlldyIsInN0b3BQcmV2aWV3Iiwic25hcHNob3QiXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe2ZvLnByb3RvdHlwZVtyXT1NLndhcnAoZnVuY3Rpb24oZSx0KXtlLmNhbGxiYWNrSWQ9dDt2YXIgbj1sb1tyXT9sb1tyXTpyO3VvKHRoaXMuaWQsdGhpcy5wYWdlVm0sbixlKX0pfSk7dmFyIHBvLGhvPTIwMCx2bz1bInVua25vd24iLCJub25lIiwiZXRoZXJuZXQiLCJ3aWZpIiwiMmciLCIzZyIsIjRnIiwiNWciXSxnbz0iX19VTklBUFBfTUFQIixtbz0iX2RvYy91bmlhcHBfdGVtcCIseW89bW8rIl8iK0RhdGUubm93KCksX289W107ZnVuY3Rpb24gYm8oZSx0KXtwbz1wb3x8bmcuYWNjZWxlcm9tZXRlci53YXRjaEFjY2VsZXJhdGlvbihmdW5jdGlvbih0KXtfby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUse3g6dC54QXhpcyx5OnQueUF4aXMsejp0LnpBeGlzfSl9KX0sZnVuY3Rpb24oZSl7cG89bnVsbCxmaSh0LHtlcnJNc2c6InN0YXJ0QWNjZWxlcm9tZXRlcjpmYWlsICIrZS5tZXNzYWdlfSl9LHtmcmVxdWVuY3k6aG99KSxpZyhmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoic3RhcnRBY2NlbGVyb21ldGVyOm9rIn0pfSxobyl9ZnVuY3Rpb24gd28oKXtyZXR1cm4gcG8mJihuZy5hY2NlbGVyb21ldGVyLmNsZWFyV2F0Y2gocG8pLHBvPW51bGwpLHt9fXZhciBrbz17bmFtZTp7Z2l2ZW5OYW1lOiJmaXJzdE5hbWUiLG1pZGRsZU5hbWU6Im1pZGRsZU5hbWUiLGZhbWlseU5hbWU6Imxhc3ROYW1lIn0sbmlja25hbWU6Im5pY2tOYW1lIixwaG90b3M6e3R5cGU6InVybCIsdmFsdWU6InBob3RvRmlsZVBhdGgifSxub3RlOiJyZW1hcmsiLHBob25lTnVtYmVyczpbe3R5cGU6Im1vYmlsZSIsdmFsdWU6Im1vYmlsZVBob25lTnVtYmVyIn0se3R5cGU6IndvcmsiLHZhbHVlOiJ3b3JrUGhvbmVOdW1iZXIifSx7dHlwZToiY29tcGFueSIsdmFsdWU6Imhvc3ROdW1iZXIifSx7dHlwZToiaG9tZSBmYXgiLHZhbHVlOiJob21lRmF4TnVtYmVyIn0se3R5cGU6IndvcmsgZmF4Iix2YWx1ZToid29ya0ZheE51bWJlciJ9XSxlbWFpbHM6W3t0eXBlOiJob21lIix2YWx1ZToiZW1haWwifV0sdXJsczpbe3R5cGU6Im90aGVyIix2YWx1ZToidXJsIn1dLG9yZ2FuaXphdGlvbnM6W3t0eXBlOiJjb21wYW55IixuYW1lOiJvcmdhbml6YXRpb24iLHRpdGxlOiJ0aXRsZSJ9XSxpbXM6W3t0eXBlOiJvdGhlciIsdmFsdWU6IndlQ2hhdE51bWJlciJ9XSxhZGRyZXNzZXM6W3t0eXBlOiJvdGhlciIscHJlZmVycmVkOiEwLGNvdW50cnk6ImFkZHJlc3NDb3VudHJ5IixyZWdpb246ImFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJhZGRyZXNzU3RyZWV0Iixwb3N0YWxDb2RlOiJhZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJob21lIixjb3VudHJ5OiJob21lQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiaG9tZUFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImhvbWVBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoiaG9tZUFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImhvbWVBZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJjb21wYW55Iixjb3VudHJ5OiJ3b3JrQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoid29ya0FkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6IndvcmtBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoid29ya0FkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6IndvcmtBZGRyZXNzUG9zdGFsQ29kZSJ9XX0sU289WyJ0eXBlIiwicHJlZmVycmVkIl07dmFyIHhvPU1pKCJibHVldG9vdGgiLCJvbkJsdWV0b290aERldmljZUZvdW5kIiksQ289TWkoImJsdWV0b290aCIsIm9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlIiksVG89TWkoImJsdWV0b290aCIsIm9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIiksT289TWkoImJsdWV0b290aCIsIm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIpO2Z1bmN0aW9uIEVvKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmRldmljZUlkO3QmJihlLmRldmljZUlkPXQudG9VcHBlckNhc2UoKSk7dmFyIG49ZS5zZXJ2aWNlSWQ7cmV0dXJuIG4mJihlLnNlcnZpY2VJZD1uLnRvVXBwZXJDYXNlKCkpLGV9dmFyIElvLEFvPUJpKCJibHVldG9vdGgiLCJvcGVuQmx1ZXRvb3RoQWRhcHRlciIpLCRvPUJpKCJibHVldG9vdGgiLCJjbG9zZUJsdWV0b290aEFkYXB0ZXIiKSxQbz1CaSgiYmx1ZXRvb3RoIiwiZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlIiksTW89QmkoImJsdWV0b290aCIsInN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIsRW8pLGpvPUJpKCJibHVldG9vdGgiLCJzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIpLE5vPUJpKCJibHVldG9vdGgiLCJnZXRCbHVldG9vdGhEZXZpY2VzIiksQm89QmkoImJsdWV0b290aCIsImdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMiLEVvKSxMbz1CaSgiYmx1ZXRvb3RoIiwiY3JlYXRlQkxFQ29ubmVjdGlvbiIsRW8pLERvPUJpKCJibHVldG9vdGgiLCJjbG9zZUJMRUNvbm5lY3Rpb24iLEVvKSxSbz1CaSgiYmx1ZXRvb3RoIiwiZ2V0QkxFRGV2aWNlU2VydmljZXMiLEVvKSxGbz1CaSgiYmx1ZXRvb3RoIiwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzIixFbyksVW89QmkoImJsdWV0b290aCIsIm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UiLEVvKSx6bz1CaSgiYmx1ZXRvb3RoIiwicmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLEVvKSxWbz1CaSgiYmx1ZXRvb3RoIiwid3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIixFbykscW89QmkoImJsdWV0b290aCIsInNldEJMRU1UVSIsRW8pLFdvPUJpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VSU1NJIixFbyk7dmFyIEhvPVtdO2Z1bmN0aW9uIEdvKGUsdCl7SW89SW98fG5nLm9yaWVudGF0aW9uLndhdGNoT3JpZW50YXRpb24oZnVuY3Rpb24odCl7SG8uZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHtkaXJlY3Rpb246dC5tYWduZXRpY0hlYWRpbmd9KX0pfSxmdW5jdGlvbihlKXtJbz1udWxsLGZpKHQse2Vyck1zZzoic3RhcnRDb21wYXNzOmZhaWwgIitlLm1lc3NhZ2V9KX0se2ZyZXF1ZW5jeTpob30pLGlnKGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJzdGFydENvbXBhc3M6b2sifSl9LGhvKX1mdW5jdGlvbiBKbygpe3JldHVybiBJbyYmKG5nLm9yaWVudGF0aW9uLmNsZWFyV2F0Y2goSW8pLElvPW51bGwpLHt9fXZhciBYbz1NaSgiaWJlYWNvbiIsIm9uQmVhY29uVXBkYXRlIiksWW89TWkoImliZWFjb24iLCJvbkJlYWNvblNlcnZpY2VDaGFuZ2UiKSxLbz1CaSgiaWJlYWNvbiIsImdldEJlYWNvbnMiKSxabz1CaSgiaWJlYWNvbiIsInN0YXJ0QmVhY29uRGlzY292ZXJ5IiksUW89QmkoImliZWFjb24iLCJzdG9wQmVhY29uRGlzY292ZXJ5Iik7dmFyIGVhPSJBbmRyb2lkIj09PW5nLm9zLm5hbWUmJnBhcnNlSW50KG5nLm9zLnZlcnNpb24pPDYsdGE9ZWE/InNsaWRlLWluLXJpZ2h0IjoicG9wLWluIixuYT0zMDAscmE9ZWE/InNsaWRlLW91dC1yaWdodCI6InBvcC1vdXQiLGlhPTUwLG9hPSJfd3d3L19fdW5pYXBwdmlldy5odG1sIixhYT0iZiIsc2E9ImkiLGNhPSJlIix1YT0idi1zaG93IixsYT0iYyIsZGE9InMiLGZhPSJzYyIscGE9e30saGE9IldFQl9JTlZPS0VfQVBQU0VSVklDRSI7ZnVuY3Rpb24gdmEoZSx0KXtpZihlPT09aGEpcmV0dXJuIGhpKGhhLHQuZGF0YSx0LndlYnZpZXdJZHMpLCEwO3ZhciBuPXBhW2VdO3JldHVybiEhbiYmKG4odCksbi5rZWVwQWxpdmV8fGRlbGV0ZSBwYVtlXSwhMCl9ZnVuY3Rpb24gZ2EoZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPSEwKSxwYVtlXSlyZXR1cm4gY29uc29sZS53YXJuKCInIitlKyInIHJlZ2lzdGVyZWQ6ICIrcGFbZV0udG9TdHJpbmcoKSk7dC5rZWVwQWxpdmU9ISFuLHBhW2VdPXR9dmFyIG1hPSJfX1VOSUFQUF9TQ0FOIix5YT0iX3d3dy9fX3VuaWFwcHNjYW4uaHRtbCIsX2E9InNjYW5Db2RlIjt2YXIgYmEsd2Esa2EsU2EseGEsQ2E9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsU0NBTl9JRDptYSxTQ0FOX1BBVEg6eWEsc2NhbkNvZGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm9ubHlGcm9tQ2FtZXJhO3ZvaWQgMD09PW4mJihuPSExKTt2YXIgcj1lLnNjYW5UeXBlLGk9ZS5hdXRvRGVjb2RlQ2hhclNldCxvPW5nLmJhcmNvZGUsYT17cXJDb2RlOltvLlFSLG8uQVpURUMsby5NQVhJQ09ERV0sYmFyQ29kZTpbby5FQU4xMyxvLkVBTjgsby5VUENBLG8uVVBDRSxvLkNPREFCQVIsby5DT0RFMTI4LG8uQ09ERTM5LG8uQ09ERTkzLG8uSVRGLG8uUlNTMTQsby5SU1NFWFBBTkRFRF0sZGF0YW1hdHJpeDpbby5EQVRBTUFUUklYXSxwZGY0MTc6W28uUERGNDE3XX0scz17fTtzW28uUVJdPSJRUl9DT0RFIixzW28uRUFOMTNdPSJFQU5fMTMiLHNbby5FQU44XT0iRUFOXzgiLHNbby5EQVRBTUFUUklYXT0iREFUQV9NQVRSSVgiLHNbby5VUENBXT0iVVBDX0EiLHNbby5VUENFXT0iVVBDX0UiLHNbby5DT0RBQkFSXT0iQ09EQUJBUiIsc1tvLkNPREUzOV09IkNPREVfMzkiLHNbby5DT0RFOTNdPSJDT0RFXzkzIixzW28uQ09ERTEyOF09IkNPREVfMTI4IixzW28uSVRGXT0iQ09ERV8yNSIsc1tvLlBERjQxN109IlBERl80MTciLHNbby5BWlRFQ109IkFaVEVDIixzW28uUlNTMTRdPSJSU1NfMTQiLHNbby5SU1NFWFBBTkRFRF09IlJTU0VYUEFOREVEIjt2YXIgYyx1LGw9ImxpZ2h0IiE9PSgiVUlTdGF0dXNCYXJTdHlsZUJsYWNrVHJhbnNsdWNlbnQiPT09KGM9bmcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCkpfHwiVUlTdGF0dXNCYXJTdHlsZUJsYWNrT3BhcXVlIj09PWN8fCJudWxsIj09PWM/Yz0ibGlnaHQiOiJVSVN0YXR1c0JhclN0eWxlRGVmYXVsdCI9PT1jJiYoYz0iZGFyayIpLGMpLGQ9W107QXJyYXkuaXNBcnJheShyKSYmci5sZW5ndGgmJnIuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1hW2VdO3QmJihkPWQuY29uY2F0KHQpKX0pLGQubGVuZ3RofHwoZD1kLmNvbmNhdChhLnFyQ29kZSkuY29uY2F0KGEuYmFyQ29kZSkuY29uY2F0KGEuZGF0YW1hdHJpeCkuY29uY2F0KGEucGRmNDE3KSk7dmFyIGY9W107bnx8Zi5wdXNoKHtmbG9hdDoicmlnaHQiLHRleHQ6YXQoInVuaS5zY2FuQ29kZS5hbGJ1bSIpLGZvbnRTaXplOiIxN3B4Iix3aWR0aDoiNjBweCIsb25jbGljazpmdW5jdGlvbigpe25nLmdhbGxlcnkucGljayhmdW5jdGlvbihlKXtvLnNjYW4oZSxmdW5jdGlvbihlLHQsbixyKXtsJiZuZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSx1PXt0eXBlOmUsY29kZTp0LGNoYXJTZXQ6cn0scC5jbG9zZSgiYXV0byIpfSxmdW5jdGlvbigpe25nLm5hdGl2ZVVJLnRvYXN0KGF0KCJ1bmkuc2NhbkNvZGUuZmFpbCIpKX0sZCxpKX0sZnVuY3Rpb24oZSl7ZS5jb2RlIT09KCJBbmRyb2lkIj09PW5nLm9zLm5hbWU/MTI6LTIpJiZuZy5uYXRpdmVVSS50b2FzdChhdCgidW5pLnNjYW5Db2RlLmZhaWwiKSl9LHttdWx0aXBsZTohMSxzeXN0ZW06ITEsZmlsZW5hbWU6eW8rIi9nYWxsZXJ5LyIscGVybWlzc2lvbkFsZXJ0OiEwfSl9fSk7dmFyIHA9bmcud2Vidmlldy5jcmVhdGUoeWEsbWEse3RpdGxlTlZpZXc6e2F1dG9CYWNrQnV0dG9uOiEwLHR5cGU6ImZsb2F0IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLHRpdGxlQ29sb3I6IiNmZmZmZmYiLHRpdGxlVGV4dDphdCgidW5pLnNjYW5Db2RlLnRpdGxlIiksdGl0bGVTaXplOiIxN3B4IixidXR0b25zOmZ9LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0se19fdW5pYXBwX3R5cGU6InNjYW4iLF9fdW5pYXBwX2Rhcms6bCxfX3VuaWFwcF9zY2FuX3R5cGU6ZCxfX3VuaWFwcF9hdXRvX2RlY29kZV9jaGFyX3NldDppLF9fdW5pYXBwX2xvY2FsZTpzdCgpLCJ1bmktYXBwIjoibm9uZSJ9KSxoPW5nLm5hdGl2ZVVJLnNob3dXYWl0aW5nKCk7cC5hZGRFdmVudExpc3RlbmVyKCJ0aXRsZVVwZGF0ZSIsZnVuY3Rpb24oKXtwLnNob3codGEsbmEsZnVuY3Rpb24oKXtoLmNsb3NlKCl9KX0pLHAuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7ZmkodCx1P3tyZXN1bHQ6dS5jb2RlLHNjYW5UeXBlOnNbdS50eXBlXXx8IiIsY2hhclNldDp1LmNoYXJTZXR8fCJ1dGY4IixwYXRoOiIiLGVyck1zZzoic2NhbkNvZGU6b2sifTp7ZXJyTXNnOiJzY2FuQ29kZTpmYWlsIGNhbmNlbCJ9KSx2YShfYSl9KSxsJiYobmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpLHAuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49ZS5yZXN1bHQ7InN0YXJ0Ij09PXQ/bmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6ImVuZCIhPT10fHxufHxuZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSksZ2EoX2EsZnVuY3Rpb24oZSl7ZSYmImNvZGUiaW4gZSYmKHU9ZSl9LCExKX19KTtmdW5jdGlvbiBUYSgpe3JldHVybiJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudD8id2VidmlldyI6InY4In1mdW5jdGlvbiBPYSgpe3JldHVybiBiYS53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWR9dmFyIEVhPXt9O2Z1bmN0aW9uIElhKGUpe3ZhciB0PWUuZGF0YSYmZS5kYXRhLl9fbWVzc2FnZTtpZih0JiZ0Ll9fcGFnZSl7dmFyIG49dC5fX3BhZ2Uscj1FYVtuXTtyJiZyKHQpLHQua2VlcHx8ZGVsZXRlIEVhW25dfX12YXIgQWE9ZnVuY3Rpb24oZSl7dGhpcy53ZWJ2aWV3PWV9O2Z1bmN0aW9uICRhKGUpe3ZhciB0PWUuY29udGV4dDt2b2lkIDA9PT10JiYodD17fSk7dmFyIG49ZS51cmwscj1lLmRhdGE7dm9pZCAwPT09ciYmKHI9e30pO3ZhciBpPWUuc3R5bGU7dm9pZCAwPT09aSYmKGk9e30pO3ZhciBvPWUub25NZXNzYWdlLGE9ZS5vbkNsb3NlO2JhPXQucGx1c3x8bmcsd2E9dC53ZWV4fHwoIm9iamVjdCI9PXR5cGVvZiB0Zz90ZzpudWxsKSxrYT10LkJyb2FkY2FzdENoYW5uZWx8fCgib2JqZWN0Ij09dHlwZW9mIEJyb2FkY2FzdENoYW5uZWw/QnJvYWRjYXN0Q2hhbm5lbDpudWxsKTt2YXIgcz0icGFnZSIrRGF0ZS5ub3coKTshMSE9PShpPU9iamVjdC5hc3NpZ24oe30saSkpLnRpdGxlTlZpZXcmJiJub25lIiE9PWkudGl0bGVOVmlldyYmKGkudGl0bGVOVmlldz1PYmplY3QuYXNzaWduKHthdXRvQmFja0J1dHRvbjohMCx0aXRsZVNpemU6IjE3cHgifSxpLnRpdGxlTlZpZXcpKTt2YXIgYz17dG9wOjAsYm90dG9tOjAsdXNpbmdDb21wb25lbnRzOnt9LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUiLGFuaW1hdGlvblR5cGU6InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246MjAwLHVuaU5WaWV3OntwYXRoOigic3RyaW5nIj09dHlwZW9mIFZVRV9BUFBfVEVNUExBVEVfUEFUSD9WVUVfQVBQX1RFTVBMQVRFX1BBVEg6IiIpKyIvIituKyIuanMiLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpiYS5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07aT1PYmplY3QuYXNzaWduKGMsaSk7dmFyIHUsbCxkPWJhLndlYnZpZXcuY3JlYXRlKCIiLHMsaSx7ZXh0cmFzOntmcm9tOk9hKCkscnVudGltZTpUYSgpLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxyLHtkYXJrbW9kZTpjZy5kYXJrbW9kZX0pLHVzZUdsb2JhbEV2ZW50OiFrYX19KTtyZXR1cm4gZC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsYSksdT1zLGw9ZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oZS5kYXRhKSxlLmtlZXB8fGQuY2xvc2UoImF1dG8iKX0sInY4Ij09PVRhKCk/a2E/KFNhJiZTYS5jbG9zZSgpLChTYT1uZXcga2EoT2EoKSkpLm9ubWVzc2FnZT1JYSk6eGF8fCh4YT13YS5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpKS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsSWEpOndpbmRvdy5fX3BsdXNNZXNzYWdlPUlhLEVhW3VdPWwsZC5zaG93KGkuYW5pbWF0aW9uVHlwZSxpLmFuaW1hdGlvbkR1cmF0aW9uKSxuZXcgQWEoZCl9QWEucHJvdG90eXBlLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciB0PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe19fbWVzc2FnZTp7ZGF0YTplfX0pKSxuPXRoaXMud2Vidmlldy5pZDtrYT9uZXcga2EobikucG9zdE1lc3NhZ2UodCk6YmEud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcodCxuKX0sQWEucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy53ZWJ2aWV3LmNsb3NlKCl9O3ZhciBQYT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzY2FuQ29kZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0obj1uZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09bnx8Im51bGwiPT09bj9uPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PW4mJihuPSJkYXJrIiksbiksbz0kYSh7dXJsOiJfX3VuaWFwcHNjYW4iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHttZXNzYWdlczp7ZmFpbDphdCgidW5pLnNjYW5Db2RlLmZhaWwiKSwiZmxhc2gub24iOmF0KCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iKSwiZmxhc2gub2ZmIjphdCgidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiIpfX0pLHN0eWxlOnthbmltYXRpb25UeXBlOmUuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsdGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLHRpdGxlVGV4dDplLnRpdGxlVGV4dHx8YXQoInVuaS5zY2FuQ29kZS50aXRsZSIpLHRpdGxlQ29sb3I6IiNmZmZmZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsYnV0dG9uczplLm9ubHlGcm9tQ2FtZXJhP1tdOlt7dGV4dDplLmFsYnVtVGV4dHx8YXQoInVuaS5zY2FuQ29kZS5hbGJ1bSIpLGZvbnRTaXplOiIxN3B4Iix3aWR0aDoiNjBweCIsb25jbGljazpmdW5jdGlvbigpe28uc2VuZE1lc3NhZ2Uoe3R5cGU6ImdhbGxlcnkifSl9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrZ3JvdW5kOiIjMDAwMDAwIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25NZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZXZlbnQsbj1lLmRldGFpbDsocj1uKS5lcnJNc2c9Im1hcmtlZCI9PT10PyJzY2FuQ29kZTpvayI6InNjYW5Db2RlOmZhaWwgIituLm1lc3NhZ2V9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtpJiZuZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxmaSh0LHJ8fHtlcnJNc2c6InNjYW5Db2RlOmZhaWwgY2FuY2VsIn0pfX0pO2kmJihuZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksby53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P25nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8bmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfX0pO2Z1bmN0aW9uIE1hKCl7aWYoImlvcyIhPT1uZy5vcy5uYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuITE7dmFyIGU9cGkoImZhY2VJRCIpO3JldHVybiEoIWV8fCFlLmlzU3VwcG9ydCgpKX1mdW5jdGlvbiBqYSgpe3JldHVybiEoIW5nLmZpbmdlcnByaW50fHwhbmcuZmluZ2VycHJpbnQuaXNTdXBwb3J0KCkpfWZ1bmN0aW9uIE5hKCl7dmFyIGU9W107cmV0dXJuIGphKCkmJmUucHVzaCgiZmluZ2VyUHJpbnQiKSxNYSgpJiZlLnB1c2goImZhY2lhbCIpLHtzdXBwb3J0TW9kZTplLGVyck1zZzoiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOm9rIn19ZnVuY3Rpb24gQmEoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuY2hlY2tBdXRoTW9kZTtpZigiZmluZ2VyUHJpbnQiPT09dClyZXR1cm4gamEoKT97aXNFbnJvbGxlZDpuZy5maW5nZXJwcmludC5pc0tleWd1YXJkU2VjdXJlKCkmJm5nLmZpbmdlcnByaW50LmlzRW5yb2xsZWRGaW5nZXJwcmludHMoKSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifTp7aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9O2lmKCJmYWNpYWwiPT09dCl7aWYoTWEoKSl7dmFyIG49cGkoImZhY2VJRCIpO3JldHVybntpc0Vucm9sbGVkOm4mJm4uaXNLZXlndWFyZFNlY3VyZSgpJiZuLmlzRW5yb2xsZWRGYWNlSUQoKSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifX1yZXR1cm57aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9fXJldHVybntpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19ZnVuY3Rpb24gTGEoZSl7dmFyIHQ9ZS5idXR0b25zO3JldHVybiBBcnJheS5pc0FycmF5KHQpJiZ0LmZvckVhY2goZnVuY3Rpb24oZSx0KXt2YXIgcjtlLm9uY2xpY2s9KHI9dCxmdW5jdGlvbihlKXt2YXIgdD1mZygpO2lmKHQubGVuZ3RoKXtlLmluZGV4PXI7dmFyIG49dFt0Lmxlbmd0aC0xXTtuLiR2bSYmbi4kdm0uX19jYWxsX2hvb2smJm4uJHZtLl9fY2FsbF9ob29rKCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLGUpfX0pfSksZX1mdW5jdGlvbiBEYShuLHIpe3ZhciBlPWZ1bmN0aW9uKGUpe2lmKGR0KCkpcmV0dXJuIGx0KGUsW1sidGl0bGVUZXh0Il0sWyJzZWFyY2hJbnB1dCIsInBsYWNlaG9sZGVyIl0sWyJidXR0b25zIiwidGV4dCJdXSl9KHIpO2lmKCFlKXJldHVybiByO3ZhciBpPWVbMF0sbz1lWzFdO3JldHVybihpfHxvKSYmbGcub25Mb2NhbGVDaGFuZ2UoZnVuY3Rpb24oKXt2YXIgZT1uZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG4rIiIpO2lmKGUpe3ZhciB0PXt9O2kmJih0LnRpdGxlVGV4dD1yLnRpdGxlVGV4dCksbyYmKHQuc2VhcmNoSW5wdXQ9e3BsYWNlaG9sZGVyOnIuc2VhcmNoSW5wdXQucGxhY2Vob2xkZXJ9KSxlLnNldFN0eWxlKHt0aXRsZU5WaWV3OnR9KX19KSxyfXZhciBSYT0vKFxkKyhcLlxkKyk/KVtyfHVdcHgvZztmdW5jdGlvbiBGYSh0KXt2YXIgbj17fSxlPUpTT04uc3RyaW5naWZ5KHQpO2lmKH5lLmluZGV4T2YoInVweCIpfHx+ZS5pbmRleE9mKCJycHgiKSl0cnl7bj1KU09OLnBhcnNlKGUucmVwbGFjZShSYSxmdW5jdGlvbihlLHQpe3JldHVybiBsZy51cHgycHgocGFyc2VJbnQodCl8fDApKyJweCJ9KSl9Y2F0Y2goZSl7bj10LGNvbnNvbGUuZXJyb3IoZSl9ZWxzZSBuPUpTT04ucGFyc2UoZSk7cmV0dXJuIG59dmFyIFVhPVsibmF2aWdhdGlvbkJhckJhY2tncm91bmRDb2xvciIsIm5hdmlnYXRpb25CYXJUZXh0U3R5bGUiLCJuYXZpZ2F0aW9uQmFyVGl0bGVUZXh0IiwibmF2aWdhdGlvbkJhclNoYWRvdyIsIm5hdmlnYXRpb25TdHlsZSIsImRpc2FibGVTY3JvbGwiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kVGV4dFN0eWxlIiwiZW5hYmxlUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbURpc3RhbmNlIiwidXNpbmdDb21wb25lbnRzIiwidGl0bGVOVmlldyIsInB1bGxUb1JlZnJlc2giXTtmdW5jdGlvbiB6YShlLHQsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByPXtib3VuY2U6InZlcnRpY2FsIn07bi53aW5kb3c9RmEoT2JqZWN0LmFzc2lnbihKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNnLndpbmRvd3x8e30pKSxuLndpbmRvd3x8e30pKTt2YXIgaT1EcyhuKTtPYmplY3Qua2V5cyhpLndpbmRvdykuZm9yRWFjaChmdW5jdGlvbihlKXstMT09PVVhLmluZGV4T2YoZSkmJihyW2VdPWkud2luZG93W2VdKX0pO3ZhciBvPWkud2luZG93LmJhY2tncm91bmRDb2xvcjsoL14jW2EtejAtOV17Nn0kL2kudGVzdChvKXx8InRyYW5zcGFyZW50Ij09PW8pJiYoci5iYWNrZ3JvdW5kP289ci5iYWNrZ3JvdW5kOnIuYmFja2dyb3VuZD1vLHIuYmFja2dyb3VuZENvbG9yVG9wfHwoci5iYWNrZ3JvdW5kQ29sb3JUb3A9byksci5iYWNrZ3JvdW5kQ29sb3JCb3R0b218fChyLmJhY2tncm91bmRDb2xvckJvdHRvbT1vKSxyLmFuaW1hdGlvbkFscGhhQkdDb2xvcnx8KHIuYW5pbWF0aW9uQWxwaGFCR0NvbG9yPW8pLHZvaWQgMD09PXIud2Vidmlld0JHVHJhbnNwYXJlbnQmJihyLndlYnZpZXdCR1RyYW5zcGFyZW50PSEwKSk7dmFyIGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LndpbmRvdyxyPW4udGl0bGVOVmlldztpZih0Lm1ldGEuc3RhdHVzQmFyU3R5bGU9IndoaXRlIj09PW4ubmF2aWdhdGlvbkJhclRleHRTdHlsZT8ibGlnaHQiOiJkYXJrIiwhMT09PXJ8fCJmYWxzZSI9PT1yfHwiY3VzdG9tIj09PW4ubmF2aWdhdGlvblN0eWxlJiYhVChyKXx8ImFsd2F5cyI9PT1uLnRyYW5zcGFyZW50VGl0bGUmJiFUKHIpKXJldHVybiExO3ZhciBpPW4udGl0bGVJbWFnZXx8IiIsbz1uLnRyYW5zcGFyZW50VGl0bGV8fCJub25lIixhPW4ubmF2aWdhdGlvbkJhckJhY2tncm91bmRDb2xvcixzPXthdXRvQmFja0J1dHRvbjohdC5tZXRhLmlzUXVpdCx0aXRsZVRleHQ6IiI9PT1pJiZuLm5hdmlnYXRpb25CYXJUaXRsZVRleHR8fCIiLHRpdGxlQ29sb3I6IndoaXRlIj09PW4ubmF2aWdhdGlvbkJhclRleHRTdHlsZT8iI2ZmZmZmZiI6IiMwMDAwMDAiLHR5cGU6e25vbmU6ImRlZmF1bHQiLGF1dG86InRyYW5zcGFyZW50IixhbHdheXM6ImZsb2F0In1bb10sYmFja2dyb3VuZENvbG9yOi9eI1thLXowLTldezZ9JC9pLnRlc3QoYSl8fCJ0cmFuc3BhcmVudCI9PT1hP2E6IiNmOGY4ZjgiLHRhZ3M6IiI9PT1pP1tdOlt7dGFnOiJpbWciLHNyYzppLHBvc2l0aW9uOntsZWZ0OiJhdXRvIix0b3A6ImF1dG8iLHdpZHRoOiJhdXRvIixoZWlnaHQ6IjI2cHgifX1dfTtyZXR1cm4gVChyKT9EYShlLE9iamVjdC5hc3NpZ24ocyxMYShyKSkpOkRhKGUscyl9KGUsaSk7YSYmKDE9PT1lJiZjZy5yZWFsRW50cnlQYWdlUGF0aCYmIWkubWV0YS5pc1F1aXQmJihhLmF1dG9CYWNrQnV0dG9uPSEwKSxyLnRpdGxlTlZpZXc9YSk7dmFyIHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aW5kb3c7aWYodC5lbmFibGVQdWxsRG93blJlZnJlc2h8fHQucHVsbFRvUmVmcmVzaCYmdC5wdWxsVG9SZWZyZXNoLnN1cHBvcnQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIkFuZHJvaWQiPT09bmcub3MubmFtZT9PYmplY3QuYXNzaWduKG4se3N1cHBvcnQ6ITAsc3R5bGU6ImNpcmNsZSJ9KTpPYmplY3QuYXNzaWduKG4se3N1cHBvcnQ6ITAsc3R5bGU6ImRlZmF1bHQiLGhlaWdodDoiNTBweCIscmFuZ2U6IjIwMHB4Iixjb250ZW50ZG93bjp7Y2FwdGlvbjoiIn0sY29udGVudG92ZXI6e2NhcHRpb246IiJ9LGNvbnRlbnRyZWZyZXNoOntjYXB0aW9uOiIifX0pLHQuYmFja2dyb3VuZFRleHRTdHlsZSYmKG4uY29sb3I9dC5iYWNrZ3JvdW5kVGV4dFN0eWxlLG4uc25vd0NvbG9yPXQuYmFja2dyb3VuZFRleHRTdHlsZSksT2JqZWN0LmFzc2lnbihuLHQucHVsbFRvUmVmcmVzaHx8e30pLG59fShpKTtyZXR1cm4gcyYmKCJjaXJjbGUiPT09cy5zdHlsZSYmKHIuYm91bmNlPSJub25lIiksci5wdWxsVG9SZWZyZXNoPXMpLCJoaWRlIj09PXIucG9wR2VzdHVyZSYmZGVsZXRlIHIucG9wR2VzdHVyZSxpLm1ldGEuaXNRdWl0JiYoci5wb3BHZXN0dXJlPSJpT1MiPT09bmcub3MubmFtZT8iYXBwYmFjayI6Im5vbmUiKSx0JiZpLm1ldGEuaXNOVnVlJiYoci51bmlOVmlldz17cGF0aDp0LGRlZmF1bHRGb250U2l6ZTpjZy5kZWZhdWx0Rm9udFNpemUsdmlld3BvcnQ6Y2cudmlld3BvcnR9KSxuLm1ldGE9aS5tZXRhLHJ9ZnVuY3Rpb24gVmEoKXtsZy5uYXZpZ2F0ZUJhY2soe2Zyb206ImJhY2tidXR0b24ifSl9ZnVuY3Rpb24gcWEoKXtyZXR1cm4gbmcubmF2aWdhdG9yLmlzSW1tZXJzZWRTdGF0dXNiYXIoKT9NYXRoLnJvdW5kKCJpT1MiPT09bmcub3MubmFtZT9uZy5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS50b3A6bmcubmF2aWdhdG9yLmdldFN0YXR1c2JhckhlaWdodCgpKTowfWZ1bmN0aW9uIFdhKGUsdCxuKXtpZihlLnBhdGgpe3ZhciByPWUuc3R5bGV8fHt9LGk9Im5hdmlnYXRpb25CYXIiPT09ZS50eXBlLG89InBvcHVwIj09PWUudHlwZTtkZWxldGUgci50eXBlLG8mJiFlLmlkJiZjb25zb2xlLndhcm4oInN1Yk5WdWVbIitlLnBhdGgrIl0gaXMgbWlzc2luZyBpZCIpLHIudW5pTlZpZXc9e3BhdGg6ZS5wYXRoLnJlcGxhY2UoIi5udnVlIiwiLmpzIiksZGVmYXVsdEZvbnRTaXplOmNnLmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDpjZy52aWV3cG9ydH07dmFyIGEscz17X191bmlhcHBfaG9zdDp0LnBhdGgsX191bmlhcHBfb3JpZ2luOnIudW5pTlZpZXcucGF0aC5zcGxpdCgiPyIpWzBdLnJlcGxhY2UoIi5qcyIsIiIpLF9fdW5pYXBwX29yaWdpbl9pZDpuLmlkLF9fdW5pYXBwX29yaWdpbl90eXBlOm4uX191bmlhcHBfdHlwZX07aT8oci5wb3NpdGlvbj0iZG9jayIsci5kb2NrPSJ0b3AiLHIudG9wPTAsci53aWR0aD0iMTAwJSIsci5oZWlnaHQ9dHQrcWEoKSxkZWxldGUgci5sZWZ0LGRlbGV0ZSByLnJpZ2h0LGRlbGV0ZSByLmJvdHRvbSxkZWxldGUgci5tYXJnaW4pOm8mJihyLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYT15aSh0LnBhdGgpP3FzOm4scy5fX3VuaWFwcF9tYXNrPXIubWFza3x8InJnYmEoMCwwLDAsMC41KSIscy5fX3VuaWFwcF9tYXNrX2lkPWEuaWQpLGRlbGV0ZSByLm1hc2s7dmFyIGMsdT1uZy53ZWJ2aWV3LmNyZWF0ZSgiIixlLmlkLHIscyk7bz9mdW5jdGlvbihlLHQsbil7bi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c3x8KG4ucG9wdXBTdWJOVnVlV2Vidmlld3M9e30pLG4ucG9wdXBTdWJOVnVlV2Vidmlld3NbZS5pZF09ZTt2YXIgcj1mdW5jdGlvbigpe24uc2V0U3R5bGUoe21hc2s6Im5vbmUifSksZS5oaWRlKCJhdXRvIil9O24uYWRkRXZlbnRMaXN0ZW5lcigibWFza0NsaWNrIixyKTt2YXIgaT0hMTtlLmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLGZ1bmN0aW9uKCl7aXx8KG5nLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSksbmcua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLHIpLGk9ITApfSksZS5hZGRFdmVudExpc3RlbmVyKCJoaWRlIixmdW5jdGlvbigpe2kmJihuZy5rZXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsciksbmcua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFZhKSxpPSExKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7ZGVsZXRlIG4ucG9wdXBTdWJOVnVlV2Vidmlld3NbZS5pZF0saSYmKG5nLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixyKSxuZy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsVmEpLGk9ITEpfSl9KHUsMCxhKTooYz11LG4uYXBwZW5kKGMpKX19ZnVuY3Rpb24gSGEoaSl7dmFyIG4scixvLGU7aS5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLChuPWZ1bmN0aW9uKGUpe3ZhciB0PWUud2lkdGgsbj1lLmhlaWdodCxyPXtkZXZpY2VPcmllbnRhdGlvbjo5MD09PU1hdGguYWJzKG5nLm5hdmlnYXRvci5nZXRPcmllbnRhdGlvbigpKT8ibGFuZHNjYXBlIjoicG9ydHJhaXQiLHNpemU6e3dpbmRvd1dpZHRoOk1hdGguY2VpbCh0KSx3aW5kb3dIZWlnaHQ6TWF0aC5jZWlsKG4pfX07aGkoIm9uVmlld0RpZFJlc2l6ZSIscikscmcuZW1pdCgib25SZXNpemUiLHIscGFyc2VJbnQoaS5pZCkpfSxyPTUwLChlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLHQ9dGhpcztvZyhvKSxvPWlnKGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodCxlKX0scil9KS5jYW5jZWw9ZnVuY3Rpb24oKXtvZyhvKX0sZSkpfXZhciBHYSxKYT0yLFhhPSJ2ZFN5bmMiLFlhPSJ3ZWJ2aWV3UmVhZHkiLEthPSJ2ZFN5bmNDYWxsYmFjayIsWmE9Imludm9rZUFwaSIsUWE9IldFQl9JTlZPS0VfQVBQU0VSVklDRSIsZXM9IndlYnZpZXdJbnNlcnRlZCIsdHM9IndlYnZpZXdSZW1vdmVkIixucz0id2Vidmlld0lkIjtmdW5jdGlvbiBycyhlKXt2YXIgbDtlLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe2lmKCJzdGFydCI9PT1lLnR5cGUpe3ZhciB0PWZnKCksbj10W3QubGVuZ3RoLTJdO2w9bGk7dmFyIHI9biYmbi4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlO3ImJm1pKHIpfWVsc2UgaWYoImVuZCIhPT1lLnR5cGV8fGUucmVzdWx0KXtpZigiZW5kIj09PWUudHlwZSYmZS5yZXN1bHQpe3ZhciBpPWZnKCksbz1pLmxlbmd0aCxhPWlbaS5sZW5ndGgtMV07YSYmYS4kcmVtb3ZlKCksbWkoKSxhJiYxPT09byYmKHU9YSxjZy5yZWFsRW50cnlQYWdlUGF0aCYmdS4kcGFnZS5yb3V0ZT09PWNnLmVudHJ5UGFnZVBhdGgpPyhjZy5lbnRyeVBhZ2VQYXRoPWNnLnJlYWxFbnRyeVBhZ2VQYXRoLGRlbGV0ZSBjZy5yZWFsRW50cnlQYWdlUGF0aCxsZy5yZUxhdW5jaCh7dXJsOihzPWNnLmVudHJ5UGFnZVBhdGgsYz1zLDA9PT1jLmluZGV4T2YoIi8iKT9zOiIvIitzKX0pKTpyZy5lbWl0KCJvbkFwcFJvdXRlIix7dHlwZToibmF2aWdhdGVCYWNrIn0pfX1lbHNlIG1pKGwpO3ZhciBzLGMsdX0pfXZhciBpcz0yLG9zPXtwdWxsVG9SZWZyZXNoOiJvblB1bGxEb3duUmVmcmVzaCIsdGl0bGVOVmlld1NlYXJjaElucHV0Q2hhbmdlZDoib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIix0aXRsZU5WaWV3U2VhcmNoSW5wdXRDb25maXJtZWQ6Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIix0aXRsZU5WaWV3U2VhcmNoSW5wdXRDbGlja2VkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENsaWNrZWQiLHRpdGxlTlZpZXdTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZDoib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQifTtmdW5jdGlvbiBhcyhlKXtHYT1lfWZ1bmN0aW9uIHNzKGUpe3JldHVybiBlfWZ1bmN0aW9uIGNzKGUsdCl7dmFyIG49dD9JKHQsc3MpOiIiO3JldHVybntwYXRoOmUuc3Vic3RyKDEpLHF1ZXJ5Om4/bi5zdWJzdHIoMSk6bn19ZnVuY3Rpb24gdXMoZSx0LG4scil7aWYodm9pZCAwPT09ciYmKHI9e30pLHQubWV0YS5pc05WdWUpe3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIHphKG8sZSx0KX0sbz1pcysrLGE9aSgpO2EudW5pUGFnZVVybD1jcyhlLG4pLGEuaXNUYWI9ISF0Lm1ldGEuaXNUYWJCYXI7dmFyIHM9bmcud2Vidmlldy5jcmVhdGUoIiIsU3RyaW5nKG8pLGEsT2JqZWN0LmFzc2lnbih7bnZ1ZTohMH0scikpO3JldHVybiBScyhzLGkpLHN9cmV0dXJuIDI9PT1pcz9uZy53ZWJ2aWV3LmdldExhdW5jaFdlYnZpZXcoKTpHYX1mdW5jdGlvbiBscyhuLGUsdCxyKXtpZigiMSI9PT1uLmlkfHwhZS5tZXRhLmlzTlZ1ZSl7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gemEocGFyc2VJbnQobi5pZCksIiIsZSl9LG89aSgpO28udW5pUGFnZVVybD1jcyh0LHIpLGUubWV0YS5pc05WdWU/by5pc1RhYj0hIWUubWV0YS5pc1RhYkJhcjpvLmRlYnVnUmVmcmVzaD0oYT10LGM9ZSx1PShzPXIpP0kocyxzcyk6IiIse2lzVGFiOmMubWV0YS5pc1RhYkJhcixhcmd1bWVudHM6SlNPTi5zdHJpbmdpZnkoe3BhdGg6YS5zdWJzdHIoMSkscXVlcnk6dT91LnN1YnN0cigxKTp1fSl9KSxScyhuLGkpLG4uc2V0U3R5bGUobyl9dmFyIGEscyxjLHUsbCxkLGYscCxoLHYsZyxtLHksXz1yZy5vbixiPXJnLmVtaXQ7cmV0dXJuIGQ9biwoZj0obD1lKS53aW5kb3cuc3ViTlZ1ZXMpJiZmLmxlbmd0aCYmZi5mb3JFYWNoKGZ1bmN0aW9uKGUpe1dhKGUsbCxkKX0pLE9iamVjdC5rZXlzKG9zKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe24uYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2Iob3NbdF0sZSxwYXJzZUludChuLmlkKSl9KX0pLChwPW4pLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzJiZwLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixmdW5jdGlvbigpe09iamVjdC5rZXlzKHAucG9wdXBTdWJOVnVlV2Vidmlld3MpLmZvckVhY2goZnVuY3Rpb24oZSl7cC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlXS5jbG9zZSgibm9uZSIpfSl9KSxIYShuKSwiaU9TIj09PW5nLm9zLm5hbWUmJighbi5udnVlJiYoaD1uLHY9cmcuc3Vic2NyaWJlLGc9cmcudW5zdWJzY3JpYmUsbT1oLmlkLHk9ZnVuY3Rpb24oZSx0KXtpZihtPT09dCl7ZyhZYSx5KSx0PXBhcnNlSW50KHQpO3ZhciBuPWZnKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO2lmKCFuKXJldHVybiBjb25zb2xlLmVycm9yKCJQYWdlWyIrdCsiXSBub3QgZm91bmQiKTtuLiR2bS5fJHZkLnJlc3RvcmUoKX19LGguYWRkRXZlbnRMaXN0ZW5lcigicmVjb3ZlcnkiLGZ1bmN0aW9uKGUpe3YoWWEseSl9KSkscnMobikpLF8obi5pZCsiLnN0YXJ0UHVsbERvd25SZWZyZXNoIixmdW5jdGlvbigpe24uYmVnaW5QdWxsVG9SZWZyZXNoKCl9KSxfKG4uaWQrIi5zdG9wUHVsbERvd25SZWZyZXNoIixmdW5jdGlvbigpe24uZW5kUHVsbFRvUmVmcmVzaCgpfSksbn12YXIgZHM9e307ZnVuY3Rpb24gZnMoZSx0KXsoZHNbZV18fChkc1tlXT1bXSkpLnB1c2godCl9dmFyIHBzPSExO2Z1bmN0aW9uIGhzKHQsZSxuKXtwcz17cGF0aDp0LG52dWU6dWcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09dH0pLm1ldGEuaXNOVnVlLG5hdmlnYXRlOmV9fWZ1bmN0aW9uIHZzKGUsdCxuKXtpZihuJiZjZy5zcGxhc2hzY3JlZW4mJmNnLnNwbGFzaHNjcmVlbi5hdXRvY2xvc2UmJiFjZy5zcGxhc2hzY3JlZW4uYWx3YXlzU2hvd0JlZm9yZVJlbmRlciYmbmcubmF2aWdhdG9yLmNsb3NlU3BsYXNoc2NyZWVuKCksIW4mJnBzKXJldHVybiBjb25zb2xlLmVycm9yKCJXYWl0aW5nIHRvIG5hdmlnYXRlIHRvOiAiK3BzLnBhdGgrIiwgZG8gbm90IG9wZXJhdGUgY29udGludW91c2x5OiAiK2UrIi4iKTtpZigibmF0aXZlIj09PWNnLnJlbmRlcmVyKXJldHVybiAwPT09ZmcoKS5sZW5ndGg/aHMoZSx0KTp0KCk7dmFyIHI9IUdhfHxHYSYmR2EuX191bmlhcHBfcm91dGUsaT1HYSYmIUdhLmxvYWRlZDtyfHxpP2hzKGUsdCk6dCgpLGkmJmZzKEdhLmlkLGdzKX1mdW5jdGlvbiBncygpe2lmKHBzKXt2YXIgZT1wcy5uYXZpZ2F0ZTtyZXR1cm4gcHM9ITEsZSgpfX1mdW5jdGlvbiBtcygpe2lmKCJuYXRpdmUiPT09Y2cucmVuZGVyZXIpe2lmKCFwcylyZXR1cm47cmV0dXJuIHBzLm52dWU/Z3MoKTp2b2lkIDB9dmFyIGU9KEdhJiYhR2EuX191bmlhcHBfcm91dGV8fChHYT1uZy53ZWJ2aWV3LmNyZWF0ZShvYSxTdHJpbmcoaXMrKykse2NvbnRlbnRBZGp1c3Q6ITF9KSksR2EpO2lmKHBzKXJldHVybiBwcy5udnVlP2dzKCk6dm9pZChlLmxvYWRlZD9wcy5uYXZpZ2F0ZSgpOmZzKGUuaWQsZ3MpKX12YXIgeXM9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgX3M9aChmdW5jdGlvbihlKXtyZXR1cm4geXNbZV0oKX0pO3ZhciBicz1bXTtmdW5jdGlvbiB3cyh0LGUpe3ZhciBuPSExLHI9Y2cuc3ViUGFja2FnZXM7aWYoQXJyYXkuaXNBcnJheShyKSl7dmFyIGk9ci5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09dC5pbmRleE9mKGUucm9vdCl9KTtpJiYobj0hMCxmdW5jdGlvbihlLHQpe2lmKC0xIT09YnMuaW5kZXhPZihlKSlyZXR1cm4gdCgpO1NzKFtlXSxmdW5jdGlvbigpe3QoKX0pfShpLnJvb3QsZSkpfW58fGUoKX12YXIga3M9ImFwcC1zdWItc2VydmljZS5qcyI7ZnVuY3Rpb24gU3MoZSx0KXt2YXIgbixyO249ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGJzLnB1c2goZSksZSsiLyIra3N9KSxyPWZ1bmN0aW9uKGUpe3QmJnQoITApfSxjZy5vblNlcnZpY2VSZWFkeShmdW5jdGlvbigpe3RnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5ldmFsSlNGaWxlcyhuLHIpfSl9dmFyIHhzPU9iamVjdC5hc3NpZ247dmFyIENzPXtwYXRoOiIiLHF1ZXJ5Ont9LHNjZW5lOjEwMDEscmVmZXJyZXJJbmZvOnthcHBJZDoiIixleHRyYURhdGE6e319fSxUcz17cGF0aDoiIixxdWVyeTp7fSxzY2VuZToxMDAxLHJlZmVycmVySW5mbzp7YXBwSWQ6IiIsZXh0cmFEYXRhOnt9fX07ZnVuY3Rpb24gT3MoKXtyZXR1cm4gQ3N9ZnVuY3Rpb24gRXMoKXt2YXIgZT10Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aWYoZS5nZXRSZWRpcmVjdEluZm8pe3ZhciB0PWUuZ2V0UmVkaXJlY3RJbmZvKCl8fHt9LG49dC5wYXRoLHI9dC5xdWVyeSxpPXQuZXh0cmFEYXRhLG89dC51c2VyQWN0aW9uLGE9e2FwcElkOnQuZnJvbUFwcGlkLGV4dHJhRGF0YTp7fX07cmV0dXJuIGkmJihhLmV4dHJhRGF0YT1pKSx7cGF0aDpufHwiIixxdWVyeTpyPyI/IityOiIiLHJlZmVycmVySW5mbzphLHVzZXJBY3Rpb246b319fXZhciBJcz0hMTtmdW5jdGlvbiBBcygpe2lmKCFJcyl7dmFyIGUsdDtpZihJcz0hMCx0Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0UmVkaXJlY3RJbmZvKXt2YXIgbj1FcygpLHI9bi5wYXRoLGk9bi5xdWVyeSxvPW4ucmVmZXJyZXJJbmZvO3ImJihlPXIsdD1pKSxjZy5yZWZlcnJlckluZm89b31lbHNle3ZhciBhPW5nLnJ1bnRpbWUuYXJndW1lbnRzO2lmKCFhKXJldHVybjt0cnl7dmFyIHM9SlNPTi5wYXJzZShhKTtlPXMucGF0aHx8cy5wYXRoTmFtZSx0PXMucXVlcnk/Ij8iK3MucXVlcnk6IiJ9Y2F0Y2goZSl7fX1pZihlJiZlIT09Y2cuZW50cnlQYWdlUGF0aCl7dmFyIGM9Ii8iK2UsdT11Zy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1jfSk7dT8odS5tZXRhLmlzVGFiQmFyfHwoY2cucmVhbEVudHJ5UGFnZVBhdGg9Y2cucmVhbEVudHJ5UGFnZVBhdGh8fGNnLmVudHJ5UGFnZVBhdGgpLGNnLmVudHJ5UGFnZVBhdGg9ZSxjZy5lbnRyeVBhZ2VRdWVyeT10KTpjb25zb2xlLmVycm9yKCJbdW5pLWFwcF0gIitlKyIgbm90IGZvdW5kLi4uIil9ZWxzZSB0JiYoY2cuZW50cnlQYWdlUXVlcnk9dCl9fXZhciAkcz1bXTtmdW5jdGlvbiBQcyhlKXtyZXR1cm4gZT8kcy5zbGljZSgwKTokcy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuJHBhZ2UubWV0YS5pc1RhYkJhcnx8ZS4kcGFnZS5tZXRhLnZpc2libGV9KX12YXIgTXM9e307ZnVuY3Rpb24ganMoZSl7dmFyIHQ9ZS51cmwsbj1lLnBhdGgsaT1lLnF1ZXJ5LHI9ZS5vcGVuVHlwZSxvPWUud2VidmlldyxhPWUuZXZlbnRDaGFubmVsO2lmKG8mJkFzKCksTXNbdF0mJihvPU1zW3RdKS5fX3BhZ2VfXyl7aWYoIVBzKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09by5fX3BhZ2VfX30pKXJldHVybiBhJiYoby5fX3BhZ2VfXy5ldmVudENoYW5uZWw9YSksJHMucHVzaChvLl9fcGFnZV9fKSxvO289bnVsbH12YXIgcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHVnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PW59KSkpOyJyZUxhdW5jaCI9PT1yfHwhY2cucmVhbEVudHJ5UGFnZVBhdGgmJjA9PT1QcygpLmxlbmd0aD9zLm1ldGEuaXNRdWl0PSEwOnMubWV0YS5pc1RhYkJhcnx8KHMubWV0YS5pc1F1aXQ9ITEpLG8/KG89bmcud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChvLmlkKSkubnZ1ZT1zLm1ldGEuaXNOVnVlOm89dXMobixzLGkpLHMubWV0YS5pc1RhYkJhciYmKHMubWV0YS52aXNpYmxlPSEwKSxzLm1ldGEuaXNUYWJCYXImJnFzLmFwcGVuZChvKTt2YXIgYz0iMSI9PT1vLmlkJiZvLm52dWU7bHMobyxzLG4saSk7dmFyIHU9bi5zbGljZSgxKSxsPXtyb3V0ZTpvLl9fdW5pYXBwX3JvdXRlPXUsb3B0aW9uczpPYmplY3QuYXNzaWduKHt9LGl8fHt9KSwkZ2V0QXBwV2VidmlldzpmdW5jdGlvbigpe3JldHVybiBuZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG8uaWQpfSxldmVudENoYW5uZWw6YSwkcGFnZTp7aWQ6cGFyc2VJbnQoby5pZCksbWV0YTpzLm1ldGEscGF0aDpuLHJvdXRlOnUsZnVsbFBhdGg6dCxvcGVuVHlwZTpyfSwkcmVtb3ZlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPSRzLmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9KTstMSE9PWUmJihvLm52dWV8fHRoaXMuJHZtLiRkZXN0cm95KCksJHMuc3BsaWNlKGUsMSkpfSxzZWxlY3RDb21wb25lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHZtLnNlbGVjdENvbXBvbmVudChlKX0sc2VsZWN0QWxsQ29tcG9uZW50czpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdm0uc2VsZWN0QWxsQ29tcG9uZW50cyhlKX19O2lmKCRzLnB1c2gobCksby5fX3ByZWxvYWRfXyYmKG8uX19wYWdlX189bCksYyYmKGNnLnNwbGFzaHNjcmVlbiYmY2cuc3BsYXNoc2NyZWVuLmF1dG9jbG9zZSYmIWNnLnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZuZy5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKSxjZy5vblJlYWR5KGZ1bmN0aW9uKCl7bXMoKX0pKSwhby5udnVlKXt2YXIgZD1vLmlkO3RyeXt3cyh1LGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7KGU9dSx0PWQsbj1pLHI9bCx5c1tlXXx8Y29uc29sZS5lcnJvcihlKyIgbm90IGZvdW5kIiksbmV3KF9zKGUpKSh7bXBUeXBlOiJwYWdlIixwYWdlSWQ6dCxwYWdlUGF0aDplLHBhZ2VRdWVyeTpuLHBhZ2VJbnN0YW5jZTpyfSkpLiRtb3VudCgpfSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19cmV0dXJuIG99dmFyIE5zPSJhcGkub25UaGVtZUNoYW5nZSI7ZnVuY3Rpb24gQnMoZSl7dm9pZCAwPT09ZSYmKGU9ZnVuY3Rpb24oKXt9KSxyZy5vbihOcyxlKX1mdW5jdGlvbiBMcygpe2lmKGNnLmRhcmttb2RlKXt2YXIgdD0iZGFyayI9PT1uZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpPyJsaWdodCI6ImRhcmsiO21pKHQpLFBzKCEwKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuJHBhZ2UubWV0YS5zdGF0dXNCYXJTdHlsZT10fSl9fWZ1bmN0aW9uIERzKGUpe2lmKGNnLmRhcmttb2RlKXt2YXIgdD1uZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpLG49SnMoKTtyZXR1cm4gbiYmbi5ob3N0VGhlbWUmJih0PW4uaG9zdFRoZW1lKSxOKGUsY2cudGhlbWVDb25maWcsdCl9cmV0dXJuIGV9ZnVuY3Rpb24gUnMocixpKXtpZihjZy5kYXJrbW9kZSl7dmFyIHQ9ZnVuY3Rpb24oKXt2YXIgZT1pKCksdD17YW5pbWF0aW9uQWxwaGFCR0NvbG9yOmUuYW5pbWF0aW9uQWxwaGFCR0NvbG9yLGJhY2tncm91bmQ6ZS5iYWNrZ3JvdW5kLGJhY2tncm91bmRDb2xvckJvdHRvbTplLmJhY2tncm91bmRDb2xvckJvdHRvbSxiYWNrZ3JvdW5kQ29sb3JUb3A6ZS5iYWNrZ3JvdW5kQ29sb3JUb3B9LG49ZS50aXRsZU5WaWV3O3ZvaWQgMCE9PW4mJih0LnRpdGxlTlZpZXc9Im9iamVjdCI9PXR5cGVvZiBuP3tiYWNrZ3JvdW5kQ29sb3I6bi5iYWNrZ3JvdW5kQ29sb3IsdGl0bGVDb2xvcjpuLnRpdGxlQ29sb3J9Om4pLHImJnIuc2V0U3R5bGUoZSl9O0JzKHQpLHIuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PShlPXQpJiYoZT1mdW5jdGlvbigpe30pLHZvaWQgcmcub2ZmKE5zLGUpO3ZhciBlfSl9fXZhciBGcyxVcyx6cz0hMDt2YXIgVnM9W10scXM9e2lkOiIwIixpbml0OmZ1bmN0aW9uKGUsbil7ZSYmZS5saXN0Lmxlbmd0aCYmKEZzPWUpO3RyeXtVcz1waSgidW5pLXRhYnZpZXciKX1jYXRjaChlKXtjb25zb2xlLmxvZygndW5pLnJlcXVpcmVOYXRpdmVQbHVnaW4oInVuaS10YWJ2aWV3IikgZXJyb3IgJytlKX1Vcy5vbk1hc2tDbGljayhmdW5jdGlvbigpe1ZzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSgpfSl9KSxVcyYmVXMub25DbGljayhmdW5jdGlvbihlKXt2YXIgdD1lLmluZGV4O24oRnMubGlzdFt0XSx0KX0pLFVzJiZVcy5vbk1pZEJ1dHRvbkNsaWNrKGZ1bmN0aW9uKCl7aGkoIm9uVGFiQmFyTWlkQnV0dG9uVGFwIix7fSl9KSxmdW5jdGlvbihyLGkpe2lmKGNnLmRhcmttb2RlKXt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPURzKGkpLHQ9ZS5saXN0O3ZvaWQgMD09PXQmJih0PVtdKTt2YXIgbj17Y29sb3I6ZS5jb2xvcixzZWxlY3RlZENvbG9yOmUuc2VsZWN0ZWRDb2xvcixiYWNrZ3JvdW5kQ29sb3I6ZS5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyU3R5bGU6ZS5ib3JkZXJTdHlsZX07ciYmci5zZXRUYWJCYXJTdHlsZShuKSxyJiZyLnNldFRhYkJhckl0ZW1zKHtsaXN0OnQubWFwKGZ1bmN0aW9uKGUpe3JldHVybntpY29uUGF0aDplLmljb25QYXRoLHNlbGVjdGVkSWNvblBhdGg6ZS5zZWxlY3RlZEljb25QYXRoLHZpc2libGU6ZS52aXNpYmxlfX0pfSl9O2UoKSxCcyhlKX19KFVzLGUpfSxpbmRleE9mOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29uZmlnLG49dCYmdC5saXN0JiZ0Lmxpc3QubGVuZ3RoO2lmKG4pZm9yKHZhciByPTA7cjxuO3IrKylpZih0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1lfHx0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1lKyIuaHRtbCIpcmV0dXJuIHI7cmV0dXJuLTF9LHN3aXRjaFRhYjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmluZGV4T2YoZSk7cmV0dXJuIDA8PXQmJihVcyYmVXMuc3dpdGNoU2VsZWN0KHtpbmRleDp0fSksITApfSxzZXRUYWJCYXJCYWRnZTpmdW5jdGlvbihlLHQsbil7VXMmJigibm9uZSI9PT1lPyhVcy5oaWRlVGFiQmFyUmVkRG90KHtpbmRleDp0fSksVXMucmVtb3ZlVGFiQmFyQmFkZ2Uoe2luZGV4OnR9KSk6InRleHQiPT09ZT9Vcy5zZXRUYWJCYXJCYWRnZSh7aW5kZXg6dCx0ZXh0Om59KToicmVkRG90Ij09PWUmJlVzLnNob3dUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSl9LHNldFRhYkJhckl0ZW06ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZhciBhLHM9e2luZGV4OmV9O2lmKHZvaWQgMCE9PXQmJihzLnRleHQ9dCksbiYmKHMuaWNvblBhdGg9VGkobikpLHImJihzLnNlbGVjdGVkSWNvblBhdGg9VGkocikpLHZvaWQgMCE9PW8mJihzLmljb25mb250PW8pLHZvaWQgMCE9PWkpe3MudmlzaWJsZT1Gcy5saXN0W2VdLnZpc2libGU9aSxkZWxldGUgcy5pbmRleDt2YXIgYz1Gcy5saXN0Lm1hcChmdW5jdGlvbihlKXtyZXR1cm57dmlzaWJsZTplLnZpc2libGV9fSk7Y1tlXT1zLGE9e2xpc3Q6Y30sVXMmJlVzLnNldFRhYkJhckl0ZW1zKGEpfWVsc2UgVXMmJlVzLnNldFRhYkJhckl0ZW0ocyl9LHNldFRhYkJhclN0eWxlOmZ1bmN0aW9uKGUpe1VzJiZVcy5zZXRUYWJCYXJTdHlsZShlKX0saGlkZVRhYkJhcjpmdW5jdGlvbihlKXt6cz0hMSxVcyYmVXMuaGlkZVRhYkJhcih7YW5pbWF0aW9uOmV9KX0sc2hvd1RhYkJhcjpmdW5jdGlvbihlKXt6cz0hMCxVcyYmVXMuc2hvd1RhYkJhcih7YW5pbWF0aW9uOmV9KX0sYXBwZW5kOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7VXMmJlVzLmFwcGVuZCh7aWQ6dC5pZH0sZnVuY3Rpb24oZSl7MCE9PWUuY29kZSYmaWcoZnVuY3Rpb24oKXtuLmFwcGVuZCh0KX0sMjApfSl9LGdldCBjb25maWcoKXtyZXR1cm4gRnN8fGNnLnRhYkJhcn0sZ2V0IHZpc2libGUoKXtyZXR1cm4genN9LGdldCBoZWlnaHQoKXt2YXIgZT10aGlzLmNvbmZpZztyZXR1cm4oZSYmZS5oZWlnaHQ/cGFyc2VGbG9hdChlLmhlaWdodCk6NTApK25nLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLmRldmljZUJvdHRvbX0sZ2V0IGNvdmVyKCl7dmFyIGU9dGhpcy5jb25maWc7cmV0dXJuIGUmJjA8PVsiZXh0cmFsaWdodCIsImxpZ2h0IiwiZGFyayJdLmluZGV4T2YoZS5ibHVyRWZmZWN0KX0sc2V0U3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXNrO1VzLnNldE1hc2soe2NvbG9yOnR9KX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe1ZzLnB1c2godCl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1Wcy5pbmRleE9mKHQpO1ZzLnNwbGljZShuLDEpfX07ZnVuY3Rpb24gV3MoKXt2YXIgZSx0LG4scixpPSJpb3MiPT09bmcub3MubmFtZS50b0xvd2VyQ2FzZSgpLG89KGU9bmcuc2NyZWVuLmdldEN1cnJlbnRTaXplKCksdD1lLnJlc29sdXRpb25XaWR0aCxuPWUucmVzb2x1dGlvbkhlaWdodCx7c2NyZWVuV2lkdGg6TWF0aC5yb3VuZCh0KSxzY3JlZW5IZWlnaHQ6TWF0aC5yb3VuZChuKX0pLGE9by5zY3JlZW5XaWR0aCxzPW8uc2NyZWVuSGVpZ2h0LGM9cWEoKSx1PXtoZWlnaHQ6MCxjb3ZlcjohMX0sbD1TaSgpO2lmKGwpe3ZhciBkPWwuZ2V0U3R5bGUoKTsoZD1kJiZkLnRpdGxlTlZpZXcpJiZkLnR5cGUmJiJub25lIiE9PWQudHlwZSYmKHUuaGVpZ2h0PSJ0cmFuc3BhcmVudCI9PT1kLnR5cGU/MDpjK3R0LHUuY292ZXI9InRyYW5zcGFyZW50Ij09PWQudHlwZXx8ImZsb2F0Ij09PWQudHlwZSkscj1sLmdldFNhZmVBcmVhSW5zZXRzKCl9ZWxzZSByPW5nLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpO3ZhciBmPXtoZWlnaHQ6MCxjb3ZlcjohMX07eWkoKSYmKGYuaGVpZ2h0PXFzLnZpc2libGU/cXMuaGVpZ2h0OjAsZi5jb3Zlcj1xcy5jb3Zlcik7dmFyIHA9dS5jb3Zlcj91LmhlaWdodDowLGg9Zi5jb3Zlcj9mLmhlaWdodDowLHY9cy11LmhlaWdodC1mLmhlaWdodCxnPXMtKHUuY292ZXI/MDp1LmhlaWdodCktKGYuY292ZXI/MDpmLmhlaWdodCksbT1hO2YuaGVpZ2h0JiYhZi5jb3Zlcnx8ci5ib3R0b218fCFyLmRldmljZUJvdHRvbXx8KHYtPXIuZGV2aWNlQm90dG9tLGctPXIuZGV2aWNlQm90dG9tKTt2YXIgeT17bGVmdDoocj1pP3I6e2xlZnQ6MCxyaWdodDowLHRvcDp1LmhlaWdodCYmIXUuY292ZXI/MDpjLGJvdHRvbTowfSkubGVmdCxyaWdodDptLXIucmlnaHQsdG9wOnIudG9wLGJvdHRvbTpnLXIuYm90dG9tLHdpZHRoOm0tci5sZWZ0LXIucmlnaHQsaGVpZ2h0Omctci50b3Atci5ib3R0b219O3JldHVybntwaXhlbFJhdGlvOm5nLnNjcmVlbi5zY2FsZSxzY3JlZW5XaWR0aDphLHNjcmVlbkhlaWdodDpzLHdpbmRvd1dpZHRoOm0sd2luZG93SGVpZ2h0OnYsc3RhdHVzQmFySGVpZ2h0OmMsc2FmZUFyZWE6eSxzYWZlQXJlYUluc2V0czp7dG9wOnIudG9wLHJpZ2h0OnIucmlnaHQsYm90dG9tOnIuYm90dG9tLGxlZnQ6ci5sZWZ0fSx3aW5kb3dUb3A6cCx3aW5kb3dCb3R0b206aCxzY3JlZW5Ub3A6cy12fX12YXIgSHM9e30sR3M9ITA7ZnVuY3Rpb24gSnMoKXtpZihHcyl7dmFyIGU9dGcucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldFN5c3RlbUluZm9TeW5jO2lmKCJzdHJpbmciPT10eXBlb2YoSHM9ZSgpKSl0cnl7SHM9SlNPTi5wYXJzZShIcyl9Y2F0Y2goZSl7fXJldHVybiBIc319ZnVuY3Rpb24gWHMoKXtKcygpO3ZhciBlPUhzLmRldmljZUJyYW5kO3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgdD1Icy5kZXZpY2VNb2RlbCxuPUhzLm9zTmFtZSxyPUhzLm9zVmVyc2lvbixpPUhzLmRldmljZU9yaWVudGF0aW9uLG89SHMuZGV2aWNlVHlwZSxhPUhzLmRldmljZUlkLHM9ZS50b0xvd2VyQ2FzZSgpLGM9bi50b0xvd2VyQ2FzZSgpO3JldHVybnticmFuZDpzLGRldmljZUJyYW5kOnMsZGV2aWNlTW9kZWw6dCxkZXZpY2VQaXhlbFJhdGlvOm5nLnNjcmVlbi5zY2FsZSxkZXZpY2VJZDphLGRldmljZU9yaWVudGF0aW9uOmksZGV2aWNlVHlwZTpvLG1vZGVsOnQscGxhdGZvcm06YyxzeXN0ZW06KCJpb3MiPT09Yz8iaU9TIjoiQW5kcm9pZCIpKyIgIityfX1mdW5jdGlvbiBZcygpe0pzKCk7dmFyIGU9SHMuaG9zdFBhY2thZ2VOYW1lLHQ9SHMuaG9zdE5hbWUsbj1Icy5vc0xhbmd1YWdlLHI9SHMuaG9zdFZlcnNpb24saT1Icy5ob3N0TGFuZ3VhZ2Usbz1Icy5ob3N0VGhlbWU7cmV0dXJue2FwcElkOkhzLmFwcElkLGFwcE5hbWU6SHMuYXBwTmFtZSxhcHBWZXJzaW9uOkhzLmFwcFZlcnNpb24sYXBwVmVyc2lvbkNvZGU6SHMuYXBwVmVyc2lvbkNvZGUsYXBwV2d0VmVyc2lvbjpIcy5hcHBXZ3RWZXJzaW9uLGFwcExhbmd1YWdlOmxnJiZsZy5nZXRMb2NhbGU/bGcuZ2V0TG9jYWxlKCk6aSxlbmFibGVEZWJ1ZzohMSxob3N0U0RLVmVyc2lvbjp2b2lkIDAsaG9zdFBhY2thZ2VOYW1lOmUsaG9zdE5hbWU6dCxob3N0VmVyc2lvbjpyLGhvc3RMYW5ndWFnZTppLGhvc3RUaGVtZTpvLGhvc3RGb250U2l6ZVNldHRpbmc6dm9pZCAwLGxhbmd1YWdlOm4sU0RLVmVyc2lvbjoiIix0aGVtZTpuZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpLHZlcnNpb246bmcucnVudGltZS5pbm5lclZlcnNpb259fWZ1bmN0aW9uIEtzKCl7R3M9ITAsSnMoKSxHcz0hMTt2YXIgZT1XcygpLHQ9WHMoKSxuPVlzKCk7R3M9ITA7dmFyIHI9e2Vyck1zZzoiZ2V0U3lzdGVtSW5mbzpvayIsZm9udFNpemVTZXR0aW5nOm4uaG9zdEZvbnRTaXplU2V0dGluZyxvc05hbWU6SHMub3NOYW1lLnRvTG93ZXJDYXNlKCl9O0hzLmhvc3ROYW1lJiYoci5ob3N0U0RLVmVyc2lvbj1Icy51bmlSdW50aW1lVmVyc2lvbik7dmFyIGksbyxhPU9iamVjdC5hc3NpZ24oe30sSHMsZSx0LG4scik7cmV0dXJuIGRlbGV0ZSBhLnNjcmVlblRvcCxkZWxldGUgYS5lbmFibGVEZWJ1ZyxjZy5kYXJrbW9kZXx8ZGVsZXRlIGEudGhlbWUsbz17fSxUKGk9YSkmJk9iamVjdC5rZXlzKGkpLnNvcnQoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe29bZV09aVtlXX0pLE9iamVjdC5rZXlzKG8pP286aX1mdW5jdGlvbiBacygpe3ZhciBlPSgwLHRnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRBcHBBdXRob3JpemVTZXR0aW5nKSgpO3RyeXsic3RyaW5nIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpfWNhdGNoKGUpe31mb3IodmFyIHQgaW4gZSl7aWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSx0KSkidW5kZWZpbmVkIj09PWVbdF0mJihlW3RdPXZvaWQgMCl9cmV0dXJuIGV9dmFyIFFzPSJ1bmlhcHBfc2F2ZSIsZWM9Il9kb2MvIitRcztmdW5jdGlvbiB0Yyh0LG4pe249bnx8ZnVuY3Rpb24oKXt9LG5nLmlvLnJlcXVlc3RGaWxlU3lzdGVtKG5nLmlvLlBSSVZBVEVfRE9DLGZ1bmN0aW9uKGUpe2Uucm9vdC5nZXREaXJlY3RvcnkoUXMse2NyZWF0ZTohMH0sdCxuKX0sbil9dmFyIG5jPTA7dmFyIHJjPUJpKCJpbyIsImdldEZpbGVJbmZvIik7dmFyIGljPSJjaG9vc2VMb2NhdGlvbiI7dmFyIG9jPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNob29zZUxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCkscj1uZy53ZWJ2aWV3LmNyZWF0ZSgiX3d3dy9fX3VuaWFwcGNob29zZWxvY2F0aW9uLmh0bWwiLGdvLHt0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCxiYWNrZ3JvdW5kQ29sb3I6IiMwMDAwMDAiLHRpdGxlQ29sb3I6IiNmZmZmZmYiLHRpdGxlVGV4dDoi6YCJ5oup5L2N572uIix0aXRsZVNpemU6IjE3cHgiLGJ1dHRvbnM6W3tmbG9hdDoicmlnaHQiLHRleHQ6IuWujOaIkCIsZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7ci5ldmFsSlMoIl9fY2hvb3NlTG9jYXRpb25Db25maXJtX18oKSIpfX1dfSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIn0se19fdW5pYXBwX3R5cGU6Im1hcCIsX191bmlhcHBfc3RhdHVzYmFyX3N0eWxlOm4sInVuaS1hcHAiOiJub25lIn0pOyJkYXJrIj09PW4mJihuZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksci5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9uZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fG5nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKTt2YXIgaSxvPTAsYT1mdW5jdGlvbigpezI9PSsrbyYmci5ldmFsSlMoIl9fY2hvb3NlTG9jYXRpb25fXygiK0pTT04uc3RyaW5naWZ5KGUpKyIpIil9O3IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkIixhKSxyLnNob3coInNsaWRlLWluLWJvdHRvbSIsbmEsYSksci5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtpP2ZpKHQse25hbWU6aS5wb2luYW1lLGFkZHJlc3M6aS5wb2lhZGRyZXNzLGxhdGl0dWRlOmkubGF0bG5nLmxhdCxsb25naXR1ZGU6aS5sYXRsbmcubG5nLGVyck1zZzoiY2hvb3NlTG9jYXRpb246b2sifSk6KHZhKGljKSxmaSh0LHtlcnJNc2c6ImNob29zZUxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pKX0pLGdhKGljLGZ1bmN0aW9uKGUpe2UmJiJsYXRsbmciaW4gZSYmKGk9ZSl9LCExKX19KTt2YXIgYWM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlTG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ImxpZ2h0IiE9PSgiVUlTdGF0dXNCYXJTdHlsZUJsYWNrVHJhbnNsdWNlbnQiPT09KG49bmcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCkpfHwiVUlTdGF0dXNCYXJTdHlsZUJsYWNrT3BhcXVlIj09PW58fCJudWxsIj09PW4/bj0ibGlnaHQiOiJVSVN0YXR1c0JhclN0eWxlRGVmYXVsdCI9PT1uJiYobj0iZGFyayIpLG4pLG89JGEoe3VybDoiX191bmlhcHBjaG9vc2Vsb2NhdGlvbiIsZGF0YTpPYmplY3QuYXNzaWduKHt9LGUse2xvY2FsZTpzdCgpfSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwic2xpZGUtaW4tYm90dG9tIix0aXRsZU5WaWV3OiExLHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSxvbk1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ldmVudCxuPWUuZGV0YWlsOyJzZWxlY3RlZCI9PT10JiYoKHI9bikuZXJyTXNnPSJjaG9vc2VMb2NhdGlvbjpvayIpfSxvbkNsb3NlOmZ1bmN0aW9uKCl7aSYmbmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksZmkodCxyfHx7ZXJyTXNnOiJjaG9vc2VMb2NhdGlvbjpmYWlsIGNhbmNlbCJ9KX19KTtpJiYobmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpLG8ud2Vidmlldy5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9uZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fG5nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKX19KTtmdW5jdGlvbiBzYyhlLHQsbil7dmFyIHIsaT10LmNvb3JkcztlIT09dC5jb29yZHNUeXBlJiYoIndnczg0Ij09PWU/cj1mdW5jdGlvbihlLHQpe2lmKFBpKGU9K2UsdD0rdCkpcmV0dXJuW2UsdF07dmFyIG49QWkoZS0xMDUsdC0zNSkscj0kaShlLTEwNSx0LTM1KSxpPXQvMTgwKk9pLG89TWF0aC5zaW4oaSk7bz0xLUlpKm8qbzt2YXIgYT1NYXRoLnNxcnQobyk7cmV0dXJuIG49MTgwKm4vKEVpKigxLUlpKS8obyphKSpPaSksWzIqZS0oZSsocj0xODAqci8oRWkvYSpNYXRoLmNvcyhpKSpPaSkpKSwyKnQtKHQrbildfShpLmxvbmdpdHVkZSxpLmxhdGl0dWRlKToiZ2NqMDIiPT09ZSYmKHI9ZnVuY3Rpb24oZSx0KXtpZihQaShlPStlLHQ9K3QpKXJldHVybltlLHRdO3ZhciBuPUFpKGUtMTA1LHQtMzUpLHI9JGkoZS0xMDUsdC0zNSksaT10LzE4MCpPaSxvPU1hdGguc2luKGkpO289MS1JaSpvKm87dmFyIGE9TWF0aC5zcXJ0KG8pO3JldHVybiBuPTE4MCpuLyhFaSooMS1JaSkvKG8qYSkqT2kpLFtlKyhyPTE4MCpyLyhFaS9hKk1hdGguY29zKGkpKk9pKSksdCtuXX0oaS5sb25naXR1ZGUsaS5sYXRpdHVkZSkpLHImJihpLmxvbmdpdHVkZT1yWzBdLGkubGF0aXR1ZGU9clsxXSkpO2ZpKG4se3R5cGU6ZSxhbHRpdHVkZTppLmFsdGl0dWRlfHwwLGxhdGl0dWRlOmkubGF0aXR1ZGUsbG9uZ2l0dWRlOmkubG9uZ2l0dWRlLHNwZWVkOmkuc3BlZWQsYWNjdXJhY3k6aS5hY2N1cmFjeSxhZGRyZXNzOnQuYWRkcmVzcyxlcnJNc2c6ImdldExvY2F0aW9uOm9rIn0pfXZhciBjYz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246ZnVuY3Rpb24oZSl7dmFyIHQ9bmcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCksbj1uZy53ZWJ2aWV3LmNyZWF0ZSgiX3d3dy9fX3VuaWFwcG9wZW5sb2NhdGlvbi5odG1sIixnbyx7dGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OiIiLHRpdGxlU2l6ZToiMTdweCIsdHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIn0se19fdW5pYXBwX3R5cGU6Im1hcCIsX191bmlhcHBfc3RhdHVzYmFyX3N0eWxlOnQsInVuaS1hcHAiOiJub25lIn0pO3JldHVybiJsaWdodCI9PT10JiYobmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksbi5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9uZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iik6ImVuZCIhPT10fHxufHxuZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKX0pKSxuLnNob3codGEsbmEsZnVuY3Rpb24oKXtuLmV2YWxKUygiX19vcGVuTG9jYXRpb25fXygiK0pTT04uc3RyaW5naWZ5KGUpKyIpIil9KSx7ZXJyTXNnOiJvcGVuTG9jYXRpb246b2sifX19KTt2YXIgdWM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb3BlbkxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICRhKHt1cmw6Il9fdW5pYXBwb3BlbmxvY2F0aW9uIixkYXRhOk9iamVjdC5hc3NpZ24oe30sZSx7bG9jYWxlOnN0KCl9KSxzdHlsZTp7dGl0bGVOVmlldzp7dHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtmaSh0LHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpmYWlsIGNhbmNlbCJ9KX19KSx7ZXJyTXNnOiJvcGVuTG9jYXRpb246b2sifX19KTt2YXIgbGM9W10sZGM9W10sZmM9ITEscGM9MDt2YXIgaGMsdmMsZ2MsbWMseWM7dmFyIF9jLGJjLHdjPUJpKCJpbyIsImdldEltYWdlSW5mbyIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2F2ZVBhdGg9ZS5maWxlbmFtZT15bysiL2Rvd25sb2FkLyIsZX0pLGtjPUJpKCJpbyIsImdldFZpZGVvSW5mbyIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuZmlsZVBhdGg9ZS5zcmMsZX0sZnVuY3Rpb24oZSl7cmV0dXJue29yaWVudGF0aW9uOmUub3JpZW50YXRpb24sdHlwZTplLnR5cGUsZHVyYXRpb246ZS5kdXJhdGlvbixzaXplOmUuc2l6ZS8xMDI0LGhlaWdodDplLmhlaWdodCx3aWR0aDplLndpZHRoLGZwczplLmZwc3x8MzAsYml0cmF0ZTplLmJpdHJhdGV9fSk7dmFyIFNjPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9e30pLGhpKCJvblJlY29yZGVyU3RhdGVDaGFuZ2UiLE9iamVjdC5hc3NpZ24oe3N0YXRlOmV9LHQpKX0seGM9e3N0YXJ0OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5kdXJhdGlvbjt2b2lkIDA9PT1uJiYobj02ZTQpO3ZhciByPWUuc2FtcGxlUmF0ZSxpPShlLm51bWJlck9mQ2hhbm5lbHMsZS5lbmNvZGVCaXRSYXRlLGUuZm9ybWF0KTt2b2lkIDA9PT1pJiYoaT0ibXAzIik7ZS5mcmFtZVNpemU7dmFyIG89ZS5hdWRpb1NvdXJjZTtpZih2b2lkIDA9PT1vJiYobz0iYXV0byIpLF9jKXJldHVybiBTYygic3RhcnQiKTsoX2M9bmcuYXVkaW8uZ2V0UmVjb3JkZXIoKSkucmVjb3JkKHtmb3JtYXQ6aSxzYW1wbGVyYXRlOnIsZmlsZW5hbWU6eW8rIi9yZWNvcmRlci8ifSxmdW5jdGlvbihlKXtyZXR1cm4gU2MoInN0b3AiLHt0ZW1wRmlsZVBhdGg6ZX0pfSxmdW5jdGlvbihlKXtyZXR1cm4gU2MoImVycm9yIix7ZXJyTXNnOmUubWVzc2FnZX0pfSksYmM9aWcoZnVuY3Rpb24oKXt4Yy5zdG9wKCl9LG4pLFNjKCJzdGFydCIpfSxzdG9wOmZ1bmN0aW9uKCl7X2MmJihfYy5zdG9wKCksX2M9ITEsYmMmJm9nKGJjKSl9LHBhdXNlOmZ1bmN0aW9uKCl7X2MmJlNjKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiBwYXVzZSJ9KX0scmVzdW1lOmZ1bmN0aW9uKCl7X2MmJlNjKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiByZXN1bWUifSl9fTt2YXIgQ2M9MCxUYz17fSxPYz1mdW5jdGlvbihlKXtoaSgib25Eb3dubG9hZFRhc2tTdGF0ZUNoYW5nZSIsZSl9O3ZhciBFYz0wLEljPXt9LEFjPWZ1bmN0aW9uKGUpe2hpKCJvblJlcXVlc3RUYXNrU3RhdGVDaGFuZ2UiLGUpLGRlbGV0ZSBJY1tFY119LCRjPWZ1bmN0aW9uKGUpe3ZhciB0PWVbIlNldC1Db29raWUiXXx8ZVsic2V0LWNvb2tpZSJdLG49W107aWYoIXQpcmV0dXJuW107IlsiPT09dFswXSYmIl0iPT09dFt0Lmxlbmd0aC0xXSYmKHQ9dC5zbGljZSgxLC0xKSk7Zm9yKHZhciByPXQuc3BsaXQoIjsiKSxpPTA7aTxyLmxlbmd0aDtpKyspLTEhPT1yW2ldLmluZGV4T2YoIkV4cGlyZXM9Iil8fC0xIT09cltpXS5pbmRleE9mKCJleHBpcmVzPSIpP24ucHVzaChyW2ldLnJlcGxhY2UoIiwiLCIiKSk6bi5wdXNoKHJbaV0pO3JldHVybiBuPW4uam9pbigiOyIpLnNwbGl0KCIsIil9O2Z1bmN0aW9uIFBjKGMsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXJsLG49ZS5kYXRhLHI9ZS5oZWFkZXIsaT1lLm1ldGhvZDt2b2lkIDA9PT1pJiYoaT0iR0VUIik7dmFyIHU9ZS5yZXNwb25zZVR5cGUsbz1lLnNzbFZlcmlmeTt2b2lkIDA9PT1vJiYobz0hMCk7dmFyIGE9ZS5maXJzdElwdjQ7dm9pZCAwPT09YSYmKGE9ITEpO3ZhciBzPWUudGxzLGw9ZS50aW1lb3V0O3ZvaWQgMD09PWwmJihsPWNnLm5ldHdvcmtUaW1lb3V0JiZjZy5uZXR3b3JrVGltZW91dC5yZXF1ZXN0fHw2ZTQpO3ZhciBkLGYscD1waSgic3RyZWFtIiksaD17fSx2PSExO2Zvcih2YXIgZyBpbiByKWlmKHZ8fCJjb250ZW50LXR5cGUiIT09Zy50b0xvd2VyQ2FzZSgpKWhbZ109cltnXTtlbHNlIGlmKHY9ITAsaFsiQ29udGVudC1UeXBlIl09cltnXSwiR0VUIiE9PWkmJjA9PT1yW2ddLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYic3RyaW5nIiE9dHlwZW9mIG4mJiEobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSl7dmFyIG09W107Zm9yKHZhciB5IGluIG4payhuLHkpJiZtLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHkpKyI9IitlbmNvZGVVUklDb21wb25lbnQoblt5XSkpO249bS5qb2luKCImIil9dnx8IlBPU1QiIT09aXx8KGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiKSxsJiYoZD1pZyhmdW5jdGlvbigpe2Y9ITAsQWMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTowLGVyck1zZzoidGltZW91dCJ9KX0sbCsyMDApKTt2YXIgXyxiPXttZXRob2Q6aSx1cmw6dC50cmltKCksaGVhZGVyczpoLHR5cGU6ImFycmF5YnVmZmVyIj09PXU/ImJhc2U2NCI6InRleHQiLHRpbWVvdXQ6bHx8NmU1LHNzbFZlcmlmeTohbyxmaXJzdElwdjQ6YSx0bHM6c307IkdFVCIhPT1pJiYoIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXRvU3RyaW5nLmNhbGwobik/Xz0hMDpiLmJvZHk9InN0cmluZyI9PXR5cGVvZiBuP246SlNPTi5zdHJpbmdpZnkobikpO3ZhciB3PWZ1bmN0aW9uKGUpe3ZhciB0PWUub2ssbj1lLnN0YXR1cyxyPWUuZGF0YSxpPWUuaGVhZGVycyxvPWUuZXJyb3JNc2c7aWYoIWYpe2QmJm9nKGQpO3ZhciBhPW47aWYoMDxhKUFjKHtyZXF1ZXN0VGFza0lkOmMsc3RhdGU6InN1Y2Nlc3MiLGRhdGE6dCYmImFycmF5YnVmZmVyIj09PXU/X2kocik6cixzdGF0dXNDb2RlOmEsaGVhZGVyOmksY29va2llczokYyhpKX0pO2Vsc2V7dmFyIHM9ImFib3J0IHN0YXR1c0NvZGU6IithO28mJihzPXMrIiAiK28pLEFjKHtyZXF1ZXN0VGFza0lkOmMsc3RhdGU6ImZhaWwiLHN0YXR1c0NvZGU6YSxlcnJNc2c6c30pfX19O3RyeXtfP3AuZmV0Y2hXaXRoQXJyYXlCdWZmZXIoeyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OmJpKG4pfSxiLHcpOnAuZmV0Y2goYix3KSxJY1tjXT17YWJvcnQ6ZnVuY3Rpb24oKXtmPSEwLGQmJm9nKGQpLEFjKHtyZXF1ZXN0VGFza0lkOmMsc3RhdGU6ImZhaWwiLHN0YXR1c0NvZGU6MCxlcnJNc2c6ImFib3J0In0pfX19Y2F0Y2goZSl7cmV0dXJue3JlcXVlc3RUYXNrSWQ6YyxlcnJNc2c6ImNyZWF0ZVJlcXVlc3RUYXNrOmZhaWwifX1yZXR1cm57cmVxdWVzdFRhc2tJZDpjLGVyck1zZzoiY3JlYXRlUmVxdWVzdFRhc2s6b2sifX12YXIgTWMsamM9e30sTmM9ZnVuY3Rpb24oZSl7aGkoIm9uU29ja2V0VGFza1N0YXRlQ2hhbmdlIixlKX07dmFyIEJjPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBuPXQudXJsLHI9KHQuZGF0YSx0LmhlYWRlciksaT0odC5tZXRob2QsdC5wcm90b2NvbHMpLG89TWN8fCgoTWM9cGkoInVuaS13ZWJTb2NrZXQiKSkub25vcGVuKGZ1bmN0aW9uKGUpe05jKHtzb2NrZXRUYXNrSWQ6ZS5pZCxzdGF0ZToib3BlbiJ9KX0pLE1jLm9ubWVzc2FnZShmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7TmMoe3NvY2tldFRhc2tJZDplLmlkLHN0YXRlOiJtZXNzYWdlIixkYXRhOiJvYmplY3QiPT10eXBlb2YgdD9faSh0LmJhc2U2NCk6dH0pfSksTWMub25lcnJvcihmdW5jdGlvbihlKXtOYyh7c29ja2V0VGFza0lkOmUuaWQsc3RhdGU6ImVycm9yIixlcnJNc2c6ZS5kYXRhfSl9KSxNYy5vbmNsb3NlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQsbj1lLmNvZGUscj1lLnJlYXNvbjtkZWxldGUgamNbdF0sTmMoe3NvY2tldFRhc2tJZDp0LHN0YXRlOiJjbG9zZSIsY29kZTpuLHJlYXNvbjpyfSl9KSxNYyk7cmV0dXJuIG8uV2ViU29ja2V0KHtpZDplLHVybDpuLHByb3RvY29sOkFycmF5LmlzQXJyYXkoaSk/aS5qb2luKCIsIik6aSxoZWFkZXI6cn0pLGpjW2VdPW8se3NvY2tldFRhc2tJZDplLGVyck1zZzoiY3JlYXRlU29ja2V0VGFzazpvayJ9fTt2YXIgTGM9MCxEYz17fSxSYz1mdW5jdGlvbihlKXtoaSgib25VcGxvYWRUYXNrU3RhdGVDaGFuZ2UiLGUpfTt2YXIgRmMsVWM9e29hdXRoOmZ1bmN0aW9uKHQpe25nLm9hdXRoLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHNoYXJlOmZ1bmN0aW9uKHQpe25nLnNoYXJlLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHBheW1lbnQ6ZnVuY3Rpb24odCl7bmcucGF5bWVudC5nZXRDaGFubmVscyhmdW5jdGlvbihlKXt2YXIgbj1bXTtlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtuLnB1c2godCl9KSx0KG51bGwsbixlKX0sZnVuY3Rpb24oZSl7dChlKX0pfSxwdXNoOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PXRnfHx2b2lkIDAhPT1uZyl7dmFyIHQ9bmcucHVzaC5nZXRDbGllbnRJbmZvKCk7ZShudWxsLFt0LmlkXSxbdF0pfWVsc2UgZShudWxsLFtdKX19O2Z1bmN0aW9uIHpjKGkpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLHIpe25nLm9hdXRoLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWl9KTt0P24odCk6cihuZXcgRXJyb3IoInByb3ZpZGVyIG5vdCBmaW5kIikpfSxyKX0pfWZ1bmN0aW9uIFZjKG4scixlKXt2b2lkIDA9PT1lJiYoZT0hMCk7dmFyIGk9bi5wcm92aWRlcnx8IndlaXhpbiIsbz1LYyhyLCJsb2dpbiIsZSksYT0iYXBwbGUiPT09aSxzPWE/e3Njb3BlOiJlbWFpbCJ9Om4udW5pdmVyaWZ5U3R5bGU/e3VuaXZlcmlmeVN0eWxlOmZ1bmN0aW9uKGUscil7VChlKSYmVChlLmJ1dHRvbnMpJiYiQXJyYXkiPT09cChlLmJ1dHRvbnMubGlzdCkmJmUuYnV0dG9ucy5saXN0LmZvckVhY2goZnVuY3Rpb24odCxuKXtlLmJ1dHRvbnMubGlzdFtuXS5vbmNsaWNrPWZ1bmN0aW9uKCl7dmFyIGU9e2NvZGU6IjMwMDA4IixtZXNzYWdlOiLnlKjmiLfngrnlh7vkuoboh6rlrprkuYnmjInpkq4iLGluZGV4Om4scHJvdmlkZXI6dC5wcm92aWRlcn07VChGYyk/RmMuX3RyaWdnZXJVbml2ZXJpZnlCdXR0b25zQ2xpY2soZSk6SGMoKS50aGVuKGZ1bmN0aW9uKCl7cihlKX0pfX0pO3JldHVybiBlfShuLnVuaXZlcmlmeVN0eWxlLG8pfTp7fSxjPWU/Zmk6TS5pbnZva2U7emMoaSkudGhlbihmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7bi5vbmx5QXV0aG9yaXplJiYid2VpeGluIj09PWk/ZS5hdXRob3JpemUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb2RlO2Mocix7Y29kZTp0LGF1dGhSZXN1bHQ6IiIsZXJyTXNnOiJsb2dpbjpvayJ9KX0sbyk6ZS5sb2dpbihmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldC5hdXRoUmVzdWx0LG49ZS50YXJnZXQuYXBwbGVJbmZvO2Mocix7Y29kZTp0LmNvZGUsYXV0aFJlc3VsdDp0LGFwcGxlSW5mbzpuLGVyck1zZzoibG9naW46b2sifSl9LG8scyl9YXx8InVuaXZlcmlmeSI9PT1pP3QoKTplLmxvZ291dCh0LHQpfSkuY2F0Y2gobyl9ZnVuY3Rpb24gcWMoYSxzKXt2YXIgYz1hLnByb3ZpZGVyfHwid2VpeGluIixlPU5pKHMsIm9wZXJhdGVXWERhdGEiKTt6YyhjKS50aGVuKGZ1bmN0aW9uKG8pe28uZ2V0VXNlckluZm8oZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIndlaXhpbiI9PT1jKXt2YXIgbj1vLnVzZXJJbmZvO3Q9e29wZW5JZDpuLm9wZW5pZCxuaWNrTmFtZTpuLm5pY2tuYW1lLGdlbmRlcjpuLnNleCxjaXR5Om4uY2l0eSxwcm92aW5jZTpuLnByb3ZpbmNlLGNvdW50cnk6bi5jb3VudHJ5LGF2YXRhclVybDpuLmhlYWRpbWd1cmwsdW5pb25JZDpuLnVuaW9uaWR9fWVsc2UgaWYoImFwcGxlIj09PWMpe3ZhciByPW8uYXBwbGVJbmZvO3Q9e29wZW5JZDpyLnVzZXIsZnVsbE5hbWU6ci5mdWxsTmFtZSxlbWFpbDpyLmVtYWlsLGF1dGhvcml6YXRpb25Db2RlOnIuYXV0aG9yaXphdGlvbkNvZGUsaWRlbnRpdHlUb2tlbjpyLmlkZW50aXR5VG9rZW4scmVhbFVzZXJTdGF0dXM6ci5yZWFsVXNlclN0YXR1c319ZWxzZSh0PW8udXNlckluZm8pLm9wZW5JZD10Lm9wZW5JZHx8dC5vcGVuaWR8fG8uYXV0aFJlc3VsdC5vcGVuaWQsdC5uaWNrTmFtZT10Lm5pY2tOYW1lfHx0Lm5pY2tuYW1lLHQuYXZhdGFyVXJsPXQuYXZhdGFyVXJsfHx0LmhlYWRpbWd1cmw7dmFyIGk9e2Vyck1zZzoib3BlcmF0ZVdYRGF0YTpvayJ9O2EuZGF0YSYmIndlYmFwaV9nZXR1c2VyaW5mbyI9PT1hLmRhdGEuYXBpX25hbWU/aS5kYXRhPXtkYXRhOkpTT04uc3RyaW5naWZ5KHQpLHJhd0RhdGE6IiIsc2lnbmF0dXJlOiIiLGVuY3J5cHRlZERhdGE6IiIsaXY6IiJ9OmkudXNlckluZm89dCxmaShzLGkpfSxlKX0pLmNhdGNoKGZ1bmN0aW9uKCl7Zmkocyx7ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOmZhaWwg6K+35YWI6LCD55SoIHVuaS5sb2dpbiJ9KX0pfWZ1bmN0aW9uIFdjKGUsdCxuKXt2YXIgcj1ZYyh0LCJwcmVMb2dpbiIsbiksaT1LYyh0LCJwcmVMb2dpbiIsbik7emMoZS5wcm92aWRlcikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5wcmVMb2dpbihyLGkpfSkuY2F0Y2goaSl9ZnVuY3Rpb24gSGMoKXtyZXR1cm4gemMoInVuaXZlcmlmeSIpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2VBdXRoVmlldygpfSl9ZnVuY3Rpb24gR2MoZSx0LG4pe3ZhciByPVljKHQsImdldENoZWNrQm94U3RhdGUiLG4pLGk9S2ModCwiZ2V0Q2hlY2tCb3hTdGF0ZSIsbik7dHJ5e3pjKCJ1bml2ZXJpZnkiKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0Q2hlY2tCb3hTdGF0ZSgpO3Ioe3N0YXRlOnR9KX0pfWNhdGNoKGUpe2koZSl9fXZhciBKYyxYYz1mdW5jdGlvbigpe3RoaXMucHJvdmlkZXI9InVuaXZlcmlmeSIsdGhpcy5ldmVudE5hbWU9ImFwaS51bml2ZXJpZnlCdXR0b25zQ2xpY2sifTtmdW5jdGlvbiBZYyh0LG4sZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSEwKSxlP2ppKHQsbik6ZnVuY3Rpb24oZSl7TS5pbnZva2UodCxPYmplY3QuYXNzaWduKHt9LGUse2Vyck1zZzpuKyI6b2sifSkpfX1mdW5jdGlvbiBLYyhyLGksZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSEwKSxlP05pKHIsaSk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb2RlO3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWUubWVzc2FnZTtNLmludm9rZShyLHtlcnJNc2c6aSsiOmZhaWwgIisobnx8IiIpLGVyckNvZGU6dCxjb2RlOnR9KX19WGMucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7SGMoKX0sWGMucHJvdG90eXBlLmxvZ2luPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gVmMoZSx0LCExKX0sZSl9LFhjLnByb3RvdHlwZS5nZXRDaGVja0JveFN0YXRlPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gR2MoMCx0LCExKX0sZSl9LFhjLnByb3RvdHlwZS5wcmVMb2dpbj1mdW5jdGlvbihlKXt0aGlzLl93YXJwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFdjKGUsdCwhMSl9LGUpfSxYYy5wcm90b3R5cGUub25CdXR0b25zQ2xpY2s9ZnVuY3Rpb24oZSl7cmcub24odGhpcy5ldmVudE5hbWUsZSl9LFhjLnByb3RvdHlwZS5vZmZCdXR0b25zQ2xpY2s9ZnVuY3Rpb24oZSl7cmcub2ZmKHRoaXMuZXZlbnROYW1lLGUpfSxYYy5wcm90b3R5cGUuX3RyaWdnZXJVbml2ZXJpZnlCdXR0b25zQ2xpY2s9ZnVuY3Rpb24oZSl7cmcuZW1pdCh0aGlzLmV2ZW50TmFtZSxlKX0sWGMucHJvdG90eXBlLl93YXJwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE0ud2FycChlKSh0aGlzLl9nZXRPcHRpb25zKHQpKX07dmFyIFpjPSEoWGMucHJvdG90eXBlLl9nZXRPcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksT2JqZWN0LmFzc2lnbih7fSxlLHtwcm92aWRlcjp0aGlzLnByb3ZpZGVyfSl9KSxRYz0hMTtmdW5jdGlvbiBldShlKXtyZXR1cm4gdGcucmVxdWlyZU1vZHVsZShlKX12YXIgdHU9ezA6e25hbWU6IndlYiIsdGl0bGU6IuWbvuaWhyJ9LDE6e25hbWU6InRleHQiLHRpdGxlOiLnuq/mloflrZcifSwyOntuYW1lOiJpbWFnZSIsdGl0bGU6Iue6r+WbvueJhyJ9LDM6e25hbWU6Im11c2ljIix0aXRsZToi6Z+z5LmQIn0sNDp7bmFtZToidmlkZW8iLHRpdGxlOiLop4bpopEifSw1OntuYW1lOiJtaW5pUHJvZ3JhbSIsdGl0bGU6IuWwj+eoi+W6jyJ9fSxudT1mdW5jdGlvbihlLHQsbil7ZS50eXBlPWUudHlwZXx8MDt2YXIgcj1lLnByb3ZpZGVyLGk9ZS50eXBlLG89ZS50aXRsZSxhPWUuc3VtbWFyeSxzPWUuaHJlZixjPWUuaW1hZ2VVcmwsdT1lLm1lZGlhVXJsLGw9ZS5zY2VuZSxkPWUubWluaVByb2dyYW0sZj1lLm9wZW5DdXN0b21lclNlcnZpY2VDaGF0LHA9ZS5jb3JwaWQsaD1lLmN1c3RvbWVyVXJsOyJzdHJpbmciPT10eXBlb2YgYyYmYyYmKGM9VGkoYykpO3ZhciB2PXR1W2krIiJdO2lmKHYpe3ZhciBnPXtwcm92aWRlcjpyLHR5cGU6di5uYW1lLHRpdGxlOm8sY29udGVudDphLGhyZWY6cyxwaWN0dXJlczpbY10sdGh1bWJzOltjXSxtZWRpYTp1LG1pbmlQcm9ncmFtOmQsZXh0cmE6e3NjZW5lOmx9LG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OmYsY29ycGlkOnAsdXJsOmh9O3JldHVybiJ3ZWl4aW4iIT09cnx8MSE9PWkmJjIhPT1pfHxkZWxldGUgZy50aHVtYnMsZ31yZXR1cm4i5YiG5Lqr5Y+C5pWwIHR5cGUg5LiN5q2j56GuIn0scnU9ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9InNoYXJlIik7dmFyIGk9TmkobixyKSxvPXQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQ/Im9wZW5DdXN0b21lclNlcnZpY2VDaGF0Ijoic2VuZCI7dHJ5e2Vbb10odCxmdW5jdGlvbigpe2ZpKG4se2Vyck1zZzpyKyI6b2sifSl9LGkpfWNhdGNoKGUpe2koe21lc3NhZ2U6dC5wcm92aWRlcisiICIrbysiIOaWueazleiwg+eUqOWksei0pSJ9KX19O2Z1bmN0aW9uIGl1KG4scixpKXt2b2lkIDA9PT1pJiYoaT0ic2hhcmUiKSxuPW51KG4pO3ZhciBvPU5pKHIsaSk7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiBmaShyLHtlcnJNc2c6aSsiOmZhaWwgIitufSk7dmFyIGE9bi5wcm92aWRlcjtuZy5zaGFyZS5nZXRTZXJ2aWNlcyhmdW5jdGlvbihlKXt2YXIgdD1lLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWQ9PT1hfSk7dD90LmF1dGhlbnRpY2F0ZWQ/cnUodCxuLHIpOnQuYXV0aG9yaXplKGZ1bmN0aW9uKCl7cmV0dXJuIHJ1KHQsbixyKX0sbyk6Zmkocix7ZXJyTXNnOmkrIjpmYWlsIHNlcnZpY2Ugbm90IGZvdW5kIn0pfSxvKX1mdW5jdGlvbiBvdShuKXtuLiRwcm9jZXNzZWQ9ITAsbi5wb3N0TWVzc2FnZT1mdW5jdGlvbihlKXtuZy53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyh7dHlwZToiVW5pQXBwU3ViTlZ1ZSIsZGF0YTplfSxuLmlkKX07dmFyIHI9W107aWYobi5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7ci5wdXNoKGUpfSxuLiRjb25zdW1lTWVzc2FnZT1mdW5jdGlvbih0KXtyLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KX0sbi5fX3VuaWFwcF9tYXNrX2lkKXt2YXIgaT1uLl9fdW5pYXBwX21hc2ssbz0iMCI9PT1uLl9fdW5pYXBwX21hc2tfaWQ/e3NldFN0eWxlOmZ1bmN0aW9uKGUpe3ZhciB0PWUubWFzaztldSgidW5pLXRhYnZpZXciKS5zZXRNYXNrKHtjb2xvcjp0fSl9fTpuZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG4uX191bmlhcHBfbWFza19pZCksYT1uLnNob3cscz1uLmhpZGUsYz1uLmNsb3NlLHU9ZnVuY3Rpb24oKXtvLnNldFN0eWxlKHttYXNrOiJub25lIn0pfTtuLnNob3c9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIG8uc2V0U3R5bGUoe21hc2s6aX0pLGEuYXBwbHkobixlKX0sbi5oaWRlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiB1KCkscy5hcHBseShuLGUpfSxuLmNsb3NlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiB1KCkscj1bXSxjLmFwcGx5KG4sZSl9fX1mdW5jdGlvbiBhdShlKXt2YXIgdD1uZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKGUpO2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCBTdWJOVnVlLCBpZD0iK2UpO3QmJiF0LiRwcm9jZXNzZWQmJm91KHQpO3ZhciBuPXQuc2V0U3R5bGUscj1uZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQuX191bmlhcHBfbWFza19pZCk7cmV0dXJuIHQuc2V0U3R5bGU9ZnVuY3Rpb24oZSl7ZSYmZS5tYXNrJiYociYmci5zZXRTdHlsZSh7bWFzazplLm1hc2t9KSxkZWxldGUgZS5tYXNrKSxuLmNhbGwodGhpcyxlKX0sdH12YXIgc3U9W107ZnVuY3Rpb24gY3UoZSx0LG4pe3JldHVybiB0Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuc2VuZE5hdGl2ZUV2ZW50KGUsdCxuKX1yZy5vbigiYXBpLnVuaU1QTmF0aXZlRXZlbnQiLGZ1bmN0aW9uKHQpe3N1LmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx0LmV2ZW50LHQuZGF0YSl9KX0pO3ZhciB1dT1jdTt2YXIgbHUsZHU9MSxmdT17fTtmdW5jdGlvbiBwdSgpe3JldHVybiBsdXx8KGx1PWxnLnJlcXVpcmVOYXRpdmVQbHVnaW4oIlVUUy1Qcm94eSIpKSxsdX1mdW5jdGlvbiBodShlLHQsbixyLGkpe2lmKCF0KXRocm93IG5ldyBFcnJvcigi6L+U5Zue5YC85Li677yaIitKU09OLnN0cmluZ2lmeSh0KSsi77yb6K+35rGC5Y+C5pWw5Li677yaIitKU09OLnN0cmluZ2lmeShlKSk7aWYobCh0KSl0cnl7dD1KU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiSlNPTi5wYXJzZSgiK3QrIik6ICIrZSl9aWYodC5lcnJNc2cpdGhyb3cgbmV3IEVycm9yKHQuZXJyTXNnKTtpZihuJiYiaW50ZXJmYWNlIj09PW4udHlwZSYmIm51bWJlciI9PXR5cGVvZiB0LnBhcmFtcyl7aWYoIXQucGFyYW1zKXJldHVybiBudWxsO2lmKHQucGFyYW1zPT09ciYmaSlyZXR1cm4gaTtpZihrdVtuLm9wdGlvbnNdKXJldHVybiBuZXcoYnUoeSh7aW5zdGFuY2VJZDp0LnBhcmFtc30sa3Vbbi5vcHRpb25zXSkpKX1yZXR1cm4gdC5wYXJhbXN9ZnVuY3Rpb24gdnUoZSl7aWYoZS5lcnJNc2cpdGhyb3cgbmV3IEVycm9yKGUuZXJyTXNnKTtyZXR1cm4gZGVsZXRlIGUuZXJyTXNnLGh1KGUscHUoKS5pbnZva2VTeW5jKGUsZnVuY3Rpb24oKXt9KSl9ZnVuY3Rpb24gZ3UobixlLGksbyl7dmFyIHQ9ZS5tb2R1bGVOYW1lLHI9ZS5tb2R1bGVUeXBlLGE9ZS5wYWNrYWdlLHM9ZS5jbGFzcyxjPWUubmFtZSx1PWUubWV0aG9kLGw9ZS5jb21wYW5pb24sZD1lLnBhcmFtcyxmPWUucmV0dXJuLHA9ZS5lcnJNc2csaD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkLG49ZS5uYW1lLHI9ZS5wYXJhbXMsaT1lLmtlZXBBbGl2ZSxvPWZ1W3RdO28/KG8uYXBwbHkodm9pZCAwLHIpLGl8fGRlbGV0ZSBmdVt0XSk6Y29uc29sZS5lcnJvcigiIithK3MrIi4iK2MrIiAiK24rIiBpcyBub3QgZm91bmQiKX0sdj1pP3ttb2R1bGVOYW1lOnQsbW9kdWxlVHlwZTpyLGlkOmksbmFtZTpjLG1ldGhvZDpkfTp7bW9kdWxlTmFtZTp0LG1vZHVsZVR5cGU6cixwYWNrYWdlOmEsY2xhc3M6cyxuYW1lOnV8fGMsY29tcGFuaW9uOmwsbWV0aG9kOmR9O3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtpZihwKXRocm93IG5ldyBFcnJvcihwKTt2YXIgcj15KHt9LHYse3BhcmFtczplLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gdChuKXtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbil7dmFyIGU9T2JqZWN0LmtleXMoZnUpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1W2VdPT09bn0pLHI9ZT9wYXJzZUludChlKTpkdSsrO3JldHVybiBmdVtyXT1uLHJ9cmV0dXJuIFQobikmJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7bltlXT10KG5bZV0pfSksbn0oZSl9KX0pO3JldHVybiBuP25ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7cHUoKS5pbnZva2VBc3luYyhyLGZ1bmN0aW9uKGUpeyJyZXR1cm4iIT09ZS50eXBlP2goZSk6ZS5lcnJNc2c/bihlLmVyck1zZyk6dChlLnBhcmFtcyl9KX0pOmh1KHIscHUoKS5pbnZva2VTeW5jKHIsaCksZixpLG8pfX1mdW5jdGlvbiBtdShlLHQpe3JldHVybiB0Lm1haW4mJiF0Lm1ldGhvZCYmdm9pZCAwIT09bmcmJiJpT1MiPT09bmcub3MubmFtZSYmKHQubWV0aG9kPSJzXyIrdC5uYW1lKSxndShlLHQsMCl9dmFyIHl1PW11O2Z1bmN0aW9uIF91KGUsdCl7cmV0dXJuIGsodCxlKyJCeUpzIik/ZSsiQnlKcyI6ZX1mdW5jdGlvbiBidShlKXt2YXIgbixmPWUubW9kdWxlTmFtZSxwPWUubW9kdWxlVHlwZSx0PWUucGFja2FnZSxyPWUuY2xhc3MsaD1lLm1ldGhvZHMsdj1lLnByb3BzLGc9ZS5lcnJNc2csbT17bW9kdWxlTmFtZTpmLG1vZHVsZVR5cGU6cCxwYWNrYWdlOnQsY2xhc3M6cixlcnJNc2c6Z30saT1bXSxzPXt9LGM9W10sbz0hMTt2b2lkIDAhPT1lLmluc3RhbmNlSWQ/KG89ITAsbj1lLmluc3RhbmNlSWQpOihpPWUuY29uc3RydWN0b3IucGFyYW1zLHM9ZS5zdGF0aWNNZXRob2RzLGM9ZS5zdGF0aWNQcm9wcyksdm9pZCAwIT09bmcmJiJpT1MiPT09bmcub3MubmFtZSYmaS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiJVVFNDYWxsYmFjayI9PT1lLnR5cGV8fDA8ZS50eXBlLmluZGV4T2YoIkpTT05PYmplY3QiKX0pJiZpLnB1c2goe25hbWU6Il9ieUpzIix0eXBlOiJib29sZWFuIn0pO3ZhciB1PXt9O3JldHVybiBuZXcgUHJveHkoZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07aWYodGhpcy5fX2luc3RhbmNlSWQ9MCxnKXRocm93IG5ldyBFcnJvcihnKTt2YXIgdT17fTtpZihvPyJudW1iZXIiPT10eXBlb2YgbiYmKHRoaXMuX19pbnN0YW5jZUlkPW4pOnRoaXMuX19pbnN0YW5jZUlkPWd1KCExLHkoe25hbWU6ImNvbnN0cnVjdG9yIixwYXJhbXM6aX0sbSksMCkuYXBwbHkobnVsbCxlKSwhdGhpcy5fX2luc3RhbmNlSWQpdGhyb3cgbmV3IEVycm9yKCJuZXcgIityKyIgaXMgZmFpbGVkIik7dmFyIGw9dGhpcyxkPW5ldyBQcm94eShsLHtnZXQ6ZnVuY3Rpb24oZSx0KXtpZighdVt0XSlpZih0PV91KHQsaCksayhoLHQpKXt2YXIgbj1oW3RdLHI9bi5hc3luYyxpPW4ucGFyYW1zLG89bi5yZXR1cm47dVt0XT0oYT0hIXIscz15KHtuYW1lOnQscGFyYW1zOmkscmV0dXJuOm99LG0pLGM9bC5fX2luc3RhbmNlSWQsZ3UoYSxzLGMsZCkpfWVsc2UgaWYodi5pbmNsdWRlcyh0KSlyZXR1cm4gdnUoe21vZHVsZU5hbWU6Zixtb2R1bGVUeXBlOnAsaWQ6bC5fX2luc3RhbmNlSWQsbmFtZTp0LGVyck1zZzpnfSk7dmFyIGEscyxjO3JldHVybiB1W3RdfX0pO3JldHVybiBkfSx7Z2V0OmZ1bmN0aW9uKGUsdCxuKXtpZih0PV91KHQscyksayhzLHQpKXtpZighdVt0XSl7dmFyIHI9c1t0XSxpPXIuYXN5bmMsbz1yLnBhcmFtcyxhPXIucmV0dXJuO3VbdF09bXUoISFpLHkoe25hbWU6dCxjb21wYW5pb246ITAscGFyYW1zOm8scmV0dXJuOmF9LG0pKX1yZXR1cm4gdVt0XX1yZXR1cm4gYy5pbmNsdWRlcyh0KT92dSh5KHtuYW1lOnQsY29tcGFuaW9uOiEwfSxtKSk6UmVmbGVjdC5nZXQoZSx0LG4pfX0pfWZ1bmN0aW9uIHd1KGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09bmc/IiI6IkFuZHJvaWQiPT09bmcub3MubmFtZT90OiJpT1MiPT09bmcub3MubmFtZT8iVVRTU0RLIisobj8iTW9kdWxlcyI6IiIpK20oZSkrbSh0KToiIn12YXIga3U9e307dmFyIFN1PXt9O2Z1bmN0aW9uIHh1KGUsdCxuKXtlW2UuX19wcmVsb2FkX18/ImhpZGUiOiJjbG9zZSJdKHQsbil9ZnVuY3Rpb24gQ3UobixyLGUsaSx0KXt2b2lkIDA9PT10JiYodD1uLm52dWU/MDoxMDApO3ZhciBvPShlPXZvaWQgMD09PWU/bmE6cGFyc2VJbnQoZSkpfHxuYTtpZyhmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7ZS5fY2FsbGVkfHwoZS5fY2FsbGVkPSEwLGkmJmkoKSxtcygpKX0sdD1pZyhmdW5jdGlvbigpe2UoKX0sbysxNTApO24uc2hvdyhyfHx0YSxvLGZ1bmN0aW9uKCl7ZS5fY2FsbGVkfHxvZyh0KSxlKCl9KX0sdCl9dmFyIFR1PTA7ZnVuY3Rpb24gT3UodCxuLHIpe3ZhciBpPWZnKCksbz1pLmxlbmd0aCxhPWlbby0xXTsxPHQmJmkuc2xpY2Uoby10LG8tMSkucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24oZSl7eHUoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIil9KTt2YXIgZT1mdW5jdGlvbihlKXtuP3h1KGUsbixyfHxuYSk6InJlZGlyZWN0Ij09PWEuJHBhZ2Uub3BlblR5cGU/eHUoZSxyYSxuYSk6eHUoZSwiYXV0byIpLGkuc2xpY2Uoby10LG8pLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHJlbW92ZSgpfSksbWkoKSxyZy5lbWl0KCJvbkFwcFJvdXRlIix7dHlwZToibmF2aWdhdGVCYWNrIn0pfSxzPWEuJGdldEFwcFdlYnZpZXcoKTtpZighYS5fX3VuaWFwcF93ZWJ2aWV3KXJldHVybiBlKHMpOyFmdW5jdGlvbihlLHQpe3ZhciBuPWUuY2hpbGRyZW4oKTtpZighbnx8IW4ubGVuZ3RoKXJldHVybiB0KCk7dmFyIHI9bi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZS5pZC5pbmRleE9mKG5zKX0pfHxuWzBdO3IuY2FuQmFjayhmdW5jdGlvbihlKXtlLmNhbkJhY2s/ci5iYWNrKCk6dCgpfSl9KHMsZnVuY3Rpb24oKXtlKHMpfSl9ZnVuY3Rpb24gRXUoZSl7dmFyIHQ9ZS5mcm9tO3ZvaWQgMD09PXQmJih0PSJuYXZpZ2F0ZUJhY2siKTt2YXIgbj1lLmRlbHRhLHI9ZS5hbmltYXRpb25UeXBlLGk9ZS5hbmltYXRpb25EdXJhdGlvbixvPWZnKCksYT1vW28ubGVuZ3RoLTFdO2lmKCEoYS4kdm0mJmEuJHZtLiRvcHRpb25zLm9uQmFja1ByZXNzJiZhLiR2bS5fX2NhbGxfaG9vayYmYS4kdm0uX19jYWxsX2hvb2soIm9uQmFja1ByZXNzIix7ZnJvbTp0fSkpKXJldHVybiBsZy5oaWRlVG9hc3QoKSxsZy5oaWRlTG9hZGluZygpLGEuJHBhZ2UubWV0YS5pc1F1aXQ/VHU/RGF0ZS5ub3coKS1UdTwyZTMmJm5nLnJ1bnRpbWUucXVpdCgpOihUdT1EYXRlLm5vdygpLG5nLm5hdGl2ZVVJLnRvYXN0KGF0KCJ1bmkuYXBwLnF1aXQiKSksaWcoZnVuY3Rpb24oKXtUdT1udWxsfSwyZTMpKToxPT09YS4kcGFnZS5pZCYmY2cucmVhbEVudHJ5UGFnZVBhdGg/KGNnLmVudHJ5UGFnZVBhdGg9Y2cucmVhbEVudHJ5UGFnZVBhdGgsZGVsZXRlIGNnLnJlYWxFbnRyeVBhZ2VQYXRoLGxnLnJlTGF1bmNoKHt1cmw6Ii8iK2NnLmVudHJ5UGFnZVBhdGh9KSk6T3UobixyLGkpLHtlcnJNc2c6Im5hdmlnYXRlQmFjazpvayJ9fXZhciBJdT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5pZD1lLHRoaXMubGlzdGVuZXI9e30sdGhpcy5lbWl0Q2FjaGU9e30sdCYmT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXtuLm9uKGUsdFtlXSl9KX07SXUucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3ZhciByPXRoaXMubGlzdGVuZXJbZV07aWYoIXIpcmV0dXJuKHRoaXMuZW1pdENhY2hlW2VdfHwodGhpcy5lbWl0Q2FjaGVbZV09W10pKS5wdXNoKHQpO3IuZm9yRWFjaChmdW5jdGlvbihlKXtlLmZuLmFwcGx5KGUuZm4sdCl9KSx0aGlzLmxpc3RlbmVyW2VdPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJvbmNlIiE9PWUudHlwZX0pfSxJdS5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0KXt0aGlzLl9hZGRMaXN0ZW5lcihlLCJvbiIsdCksdGhpcy5fY2xlYXJDYWNoZShlKX0sSXUucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZSx0KXt0aGlzLl9hZGRMaXN0ZW5lcihlLCJvbmNlIix0KSx0aGlzLl9jbGVhckNhY2hlKGUpfSxJdS5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5saXN0ZW5lcltlXTtpZihuKWlmKHQpZm9yKHZhciByPTA7cjxuLmxlbmd0aDspbltyXS5mbj09PXQmJihuLnNwbGljZShyLDEpLHItLSkscisrO2Vsc2UgZGVsZXRlIHRoaXMubGlzdGVuZXJbZV19LEl1LnByb3RvdHlwZS5fY2xlYXJDYWNoZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVtaXRDYWNoZVtlXTtpZih0KWZvcig7MDx0Lmxlbmd0aDspdGhpcy5lbWl0LmFwcGx5KHRoaXMsW2VdLmNvbmNhdCh0LnNoaWZ0KCkpKX0sSXUucHJvdG90eXBlLl9hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQsbil7KHRoaXMubGlzdGVuZXJbZV18fCh0aGlzLmxpc3RlbmVyW2VdPVtdKSkucHVzaCh7Zm46bix0eXBlOnR9KX07dmFyIEF1PTA7ZnVuY3Rpb24gJHUoZSx0KXt2YXIgbj1lLnVybCxyPWUucGF0aCxpPWUucXVlcnksbz1lLmV2ZW50cyxhPWUuYW5pbWF0aW9uVHlwZSxzPWUuYW5pbWF0aW9uRHVyYXRpb247cmcuZW1pdCgib25BcHBSb3V0ZSIse3R5cGU6Im5hdmlnYXRlVG8iLHBhdGg6cn0pO3ZhciBjPSh2b2lkIDA9PT0hMSYmITAsbmV3IEl1KCsrQXUsbykpO0N1KGpzKHt1cmw6bixwYXRoOnIscXVlcnk6aSxvcGVuVHlwZToibmF2aWdhdGUiLGV2ZW50Q2hhbm5lbDpjfSksYSxzLGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJuYXZpZ2F0ZVRvOm9rIixldmVudENoYW5uZWw6Y30pfSksbWkoKX1mdW5jdGlvbiBQdShlLHQpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksQXJyYXkuaXNBcnJheShlW3RdKSYmZVt0XS5sZW5ndGh9ZnVuY3Rpb24gTXUoZSxyKXt2YXIgdD1lLnVybCxuPWUucGF0aCxpPWUucXVlcnksbz1lLmV4aXN0cyxhPWZnKCkscz1hLmxlbmd0aC0xO2lmKCJiYWNrIj09PW8pe3ZhciBjPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1mZygpLG49dC5sZW5ndGg7bi0tOyl7dmFyIHI9dFtuXTtpZihyLiRwYWdlJiZyLiRwYWdlLmZ1bGxQYXRoPT09ZSlyZXR1cm4gbn1yZXR1cm4tMX0odCk7aWYoLTEhPT1jKXt2YXIgdT1zLWM7aWYoMDx1KXJldHVybiBFdSh7ZGVsdGE6dX0pLHZvaWQgZmkocix7ZXJyTXNnOiJyZWRpcmVjdFRvOm9rIn0pfX12YXIgbD1hW3NdO2wmJmwuJHJlbW92ZSgpLEN1KGpzKHt1cmw6dCxwYXRoOm4scXVlcnk6aSxvcGVuVHlwZToicmVkaXJlY3QifSksIm5vbmUiLDAsZnVuY3Rpb24oKXtpZihsKXt2YXIgZT1sLiRnZXRBcHBXZWJ2aWV3KCk7ZS5fX3ByZWxvYWRfXyYmKHQ9ZSwobj1PYmplY3Qua2V5cyhNcykuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gTXNbZV0uaWQ9PT10LmlkfSkpJiZkZWxldGUgTXNbbl0pLGUuY2xvc2UoIm5vbmUiKX12YXIgdCxuO2ZpKHIse2Vyck1zZzoicmVkaXJlY3RUbzpvayJ9KX0pLG1pKCl9dmFyIGp1LE51LEJ1LEx1PSJfX1RZUEUiLER1PSJ1bmktc3RvcmFnZS1rZXlzIjtmdW5jdGlvbiBSdShlKXt0cnl7dmFyIHQ9InN0cmluZyI9PXR5cGVvZiBlP0pTT04ucGFyc2UoZSk6ZSxuPXQudHlwZTtpZigwPD1bIm9iamVjdCIsInN0cmluZyIsIm51bWJlciIsImJvb2xlYW4iLCJ1bmRlZmluZWQiXS5pbmRleE9mKG4pKXt2YXIgcj1PYmplY3Qua2V5cyh0KTtpZigyPT09ci5sZW5ndGgmJiJkYXRhImluIHQpe2lmKHR5cGVvZiB0LmRhdGE9PT1uKXJldHVybiB0LmRhdGE7aWYoIm9iamVjdCI9PT1uJiYvXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9XDpcZHsyfVw6XGR7Mn1cLlxkezN9WiQvLnRlc3QodC5kYXRhKSlyZXR1cm4gbmV3IERhdGUodC5kYXRhKX1lbHNlIGlmKDE9PT1yLmxlbmd0aClyZXR1cm4iIn19Y2F0Y2goZSl7fX1mdW5jdGlvbiBGdShlLHQpe3ZhciBuPXQ7aWYoInN0cmluZyIhPT1lfHwic3RyaW5nIj09PWUmJid7InR5cGUiOiJ1bmRlZmluZWQifSc9PT10KXRyeXt2YXIgcj1KU09OLnBhcnNlKHQpLGk9UnUocik7aWYodm9pZCAwIT09aSluPWk7ZWxzZSBpZihlJiYic3RyaW5nIj09dHlwZW9mKG49cikpe3ZhciBvPXR5cGVvZihyPUpTT04ucGFyc2UocikpOyJudW1iZXIiPT09byYmImRhdGUiPT09ZT9uPW5ldyBEYXRlKHIpOm89PT0oWyJudWxsIiwiYXJyYXkiXS5pbmRleE9mKGUpPDA/ZToib2JqZWN0IikmJihuPXIpfX1jYXRjaChlKXt9cmV0dXJuIG59ZnVuY3Rpb24gVXUoKXtmb3IodmFyIGU9bmcuc3RvcmFnZS5sZW5ndGh8fG5nLnN0b3JhZ2UuZ2V0TGVuZ3RoKCl8fDAsdD1bXSxuPTAscj0wO3I8ZTtyKyspe3ZhciBpPW5nLnN0b3JhZ2Uua2V5KHIpO2lmKGkhPT1EdSYmKGkuaW5kZXhPZihMdSk8MHx8aS5pbmRleE9mKEx1KStMdS5sZW5ndGghPT1pLmxlbmd0aCkpe3ZhciBvPW5nLnN0b3JhZ2UuZ2V0SXRlbShpKTtuKz1pLmxlbmd0aCtvLmxlbmd0aCx0LnB1c2goaSl9fXJldHVybntrZXlzOnQsY3VycmVudFNpemU6TWF0aC5jZWlsKDIqbi8xMDI0KSxsaW1pdFNpemU6TnVtYmVyLk1BWF9WQUxVRSxlcnJNc2c6ImdldFN0b3JhZ2VJbmZvOm9rIn19ZnVuY3Rpb24genUoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudGl0bGU7dm9pZCAwPT09dCYmKHQ9IiIpO3ZhciBuPWUuaWNvbjt2b2lkIDA9PT1uJiYobj0ic3VjY2VzcyIpO3ZhciByPWUuaW1hZ2U7dm9pZCAwPT09ciYmKHI9IiIpO3ZhciBpPWUuZHVyYXRpb247dm9pZCAwPT09aSYmKGk9MTUwMCk7dmFyIG89ZS5tYXNrO3ZvaWQgMD09PW8mJihvPSExKTt2YXIgYT1lLnBvc2l0aW9uO3ZvaWQgMD09PWEmJihhPSIiKTt2YXIgcz1lLnR5cGU7dm9pZCAwPT09cyYmKHM9InRvYXN0Iik7dmFyIGM9ZS5zdHlsZTtpZihWdShudWxsKSxOdT1zLFsidG9wIiwiY2VudGVyIiwiYm90dG9tIl0uaW5jbHVkZXMoYSkpbmcubmF0aXZlVUkudG9hc3QodCx7dmVydGljYWxBbGlnbjphfSksanU9ITA7ZWxzZXtuJiYhflsic3VjY2VzcyIsImxvYWRpbmciLCJlcnJvciIsIm5vbmUiXS5pbmRleE9mKG4pJiYobj0ic3VjY2VzcyIpO3ZhciB1PXttb2RhbDpvLGJhY2s6InRyYW5zbWl0IixwYWRkaW5nOiIxMHB4IixzaXplOiIxNnB4In07cnx8biYmIm5vbmUiIT09bj8odS53aWR0aD0iMTQwcHgiLHUuaGVpZ2h0PSIxMTJweCIpOnUubG9hZGluZz17ZGlzcGxheToibm9uZSJ9LHI/dS5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOnIsaW50ZXJ2YWw6aX06LTEhPT1bInN1Y2Nlc3MiLCJlcnJvciJdLmluZGV4T2YobikmJih1LmxvYWRpbmc9e2Rpc3BsYXk6ImJsb2NrIixoZWlnaHQ6IjU1cHgiLGljb246InN1Y2Nlc3MiPT09bj8iX191bmlhcHBzdWNjZXNzLnBuZyI6Il9fdW5pYXBwZXJyb3IucG5nIixpbnRlcnZhbDppfSksanU9bmcubmF0aXZlVUkuc2hvd1dhaXRpbmcodCxPYmplY3QuYXNzaWduKHUsYykpfXJldHVybiBCdT1pZyhmdW5jdGlvbigpe1Z1KG51bGwpfSxpKSx7ZXJyTXNnOiJzaG93VG9hc3Q6b2sifX1mdW5jdGlvbiBWdShlKXtpZih2b2lkIDA9PT1lJiYoZT0idG9hc3QiKSwhZXx8ZT09PU51KXJldHVybiBCdSYmKG9nKEJ1KSxCdT1udWxsKSwhMD09PWp1P25nLm5hdGl2ZVVJLmNsb3NlVG9hc3QoKTpqdSYmanUuY2xvc2UmJmp1LmNsb3NlKCksTnU9anU9bnVsbCx7ZXJyTXNnOiJoaWRlOm9rIn19dmFyIHF1LFd1PXtsaWdodDp7aXRlbUNvbG9yOiIjMDAwMDAwIn0sZGFyazp7aXRlbUNvbG9yOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCkifX07dmFyIEh1PXt9O2Z1bmN0aW9uIEd1KGUpe3ZhciBuPUh1W2VdO3JldHVybiBufHwobj17aWQ6MSxjYWxsYmFja3M6T2JqZWN0LmNyZWF0ZShudWxsKX0sSHVbZV09bikse2dldDpmdW5jdGlvbihlKXtyZXR1cm4gbi5jYWxsYmFja3NbZV19LHBvcDpmdW5jdGlvbihlKXt2YXIgdD1uLmNhbGxiYWNrc1tlXTtyZXR1cm4gdCYmZGVsZXRlIG4uY2FsbGJhY2tzW2VdLHR9LHB1c2g6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5pZCsrO3JldHVybiBuLmNhbGxiYWNrc1t0XT1lLHR9fX12YXIgSnU9R3UoInJlcXVlc3RDb21wb25lbnRJbmZvIik7ZnVuY3Rpb24gWHUobil7dmFyIHI9e307cmV0dXJuIE9iamVjdC5rZXlzKG58fHt9KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKDA9PT1lLmluZGV4T2YoImRhdGEiKSl7dmFyIHQ9ZS5yZXBsYWNlKCJkYXRhIiwiIik7dD10LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK3Quc2xpY2UoMSksclt0XT1uW2VdfX0pLHJ9ZnVuY3Rpb24gWXUoZSx0LG4pe3ZhciByPWUuXyR3ZWV4LnJlcXVpcmVNb2R1bGUoImRvbSIpLGk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXS5zZWxlY3RvcjswPT09ci5pbmRleE9mKCIjIikmJnQucHVzaChyLnN1YnN0cmluZygxKSl9cmV0dXJuIHR9KHQpLG89bmV3IEFycmF5KGkubGVuZ3RoKTshZnVuY3Rpb24gZSh0LG4scil7dmFyIGk9bi5jaGlsZHJlbjtpZighQXJyYXkuaXNBcnJheShpKSlyZXR1cm4hMTtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGE9aVtvXTtpZihhLmF0dHIpe3ZhciBzPXQuaW5kZXhPZihhLmF0dHIuaWQpO2lmKDA8PXMmJihyW3NdPXtpZDp0W3NdLHJlZjphLnJlZixkYXRhc2V0Olh1KGEuYXR0cil9LDE9PT10Lmxlbmd0aCkpYnJlYWt9YS5jaGlsZHJlbiYmZSh0LGEscil9fShpLGUuJGVsLG8pLGZ1bmN0aW9uIHQobixyLGksbyxhKXt2YXIgcz1yW2ldO24uZ2V0Q29tcG9uZW50UmVjdChzLnJlZixmdW5jdGlvbihlKXtlLnNpemUuaWQ9cy5pZCxlLnNpemUuZGF0YXNldD1zLmRhdGFzZXQsby5wdXNoKGUuc2l6ZSksKGkrPTEpPHIubGVuZ3RoP3QobixyLGksbyxhKTphKG8pfSl9KHIsbywwLFtdLGZ1bmN0aW9uKGUpe24oZSl9KX1mdW5jdGlvbiBLdShlLHQsbixyKXtyZy5wdWJsaXNoSGFuZGxlcih0LHt0eXBlOm4sZGF0YTpyfSxlKX1yZy5zdWJzY3JpYmUoIm9uQWRNZXRob2RDYWxsYmFjayIsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNhbGxiYWNrSWQ7IWZ1bmN0aW9uKGUsbix0KXt2YXIgcj1lLmFkcGlkLGk9ZS53aWR0aCxvPXIrIi0iK2ksYT1adVtvXTtpZihhJiYwPGEubGVuZ3RoKXJldHVybiBuKGEuc3BsaWNlKDAsMSlbMF0pO25nLmFkLmdldEFkcyhlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuYWRzO24odC5zcGxpY2UoMCwxKVswXSksWnVbb109YT9hLmNvbmNhdCh0KTp0fSxmdW5jdGlvbihlKXt0KHtlcnJDb2RlOmUuY29kZSxlcnJNc2c6ZS5tZXNzYWdlfSl9KX0oZS5kYXRhLGZ1bmN0aW9uKGUpe0t1KHQsbiwic3VjY2VzcyIsZSl9LGZ1bmN0aW9uKGUpe0t1KHQsbiwiZmFpbCIsZSl9KX0pO3ZhciBadT17fTt2YXIgUXU9WyJsb2FkIiwiY2xvc2UiLCJ2ZXJpZnkiLCJlcnJvciIsImFkQ2xpY2tlZCJdLGVsPVstNTAwMSwtNTAwMiwtNTAwMywtNTAwNCwtNTAwNSwtNTAwNl0sdGw9e2NvZGU6LTUwMDgsZXJyTXNnOiLlub/lkYrmlbDmja7lt7Lov4fmnJ/vvIzor7fph43mlrDliqDovb0ifSxubD0iY3NqIixybD1mdW5jdGlvbihlKXt2YXIgaT10aGlzO3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10aGlzLl9jYWxsYmFja3M9e307UXUuZm9yRWFjaChmdW5jdGlvbih0KXtuW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtpWyJvbiIrZV09ZnVuY3Rpb24oZSl7blt0XS5wdXNoKGUpfX0pLHRoaXMuX3ByZWxvYWQ9dm9pZCAwPT09ZS5wcmVsb2FkfHxlLnByZWxvYWQsdGhpcy5faXNMb2FkPSExLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9hZEVycm9yPSIiLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fbGFzdExvYWRUaW1lPTA7dmFyIHQ9dGhpcy5fcmV3YXJkQWQ9bmcuYWQuY3JlYXRlUmV3YXJkZWRWaWRlb0FkKGUpO3Qub25Mb2FkKGZ1bmN0aW9uKGUpe2kuX2lzTG9hZD0hMCxpLl9pc0xvYWRpbmc9ITEsaS5fbGFzdExvYWRUaW1lPURhdGUubm93KCksaS5fZGlzcGF0Y2hFdmVudCgibG9hZCIse30pLG51bGwhPWkuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKGkuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLGkuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKX0pLHQub25DbG9zZShmdW5jdGlvbihlKXtpLl9pc0xvYWQ9ITEsaS5faXNMb2FkaW5nPSExLGkuX3ByZWxvYWQmJmkuX2xvYWRBZCgpLGkuX2Rpc3BhdGNoRXZlbnQoImNsb3NlIix7aXNFbmRlZDplLmlzRW5kZWR9KX0pLHQub25WZXJpZnkmJnQub25WZXJpZnkoZnVuY3Rpb24oZSl7aS5fZGlzcGF0Y2hFdmVudCgidmVyaWZ5Iix7aXNWYWxpZDplLmlzVmFsaWR9KX0pLHQub25FcnJvcihmdW5jdGlvbihlKXtpLl9pc0xvYWRpbmc9ITE7dmFyIHQ9ZS5jb2RlLG49ZS5tZXNzYWdlLHI9e2NvZGU6dCxlcnJNc2c6bn07aS5fYWRFcnJvcj1uLC01MDA4PT09dCYmKGkuX2lzTG9hZD0hMSksaS5fZGlzcGF0Y2hFdmVudCgiZXJyb3IiLHIpLC01MDA1IT09dCYmLTEhPT1lbC5pbmRleCh0KXx8bnVsbD09aS5fbG9hZFByb21pc2VSZWplY3R8fChpLl9sb2FkUHJvbWlzZVJlamVjdChyKSxpLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsKX0pLHQub25BZENsaWNrZWQoZnVuY3Rpb24oZSl7aS5fZGlzcGF0Y2hFdmVudCgiYWRDbGlja2VkIix7fSl9KSx0aGlzLl9sb2FkQWQoKX0saWw9e2lzRXhwaXJlZDp7Y29uZmlndXJhYmxlOiEwfX07aWwuaXNFeHBpcmVkLmdldD1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5fbGFzdExvYWRUaW1lJiYxOGU1PE1hdGguYWJzKERhdGUubm93KCktdGhpcy5fbGFzdExvYWRUaW1lKX0scmwucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe24uX2xvYWRQcm9taXNlUmVzb2x2ZT1lLG4uX2xvYWRQcm9taXNlUmVqZWN0PXQsbi5faXNMb2FkaW5nfHwobi5faXNMb2FkP2UoKTpuLl9sb2FkQWQoKSl9KX0scmwucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe2lmKCFuLl9pc0xvYWRpbmcpe2lmKG4uZ2V0UHJvdmlkZXIoKT09PW5sJiZuLmlzRXhwaXJlZClyZXR1cm4gbi5faXNMb2FkPSExLG4uX2Rpc3BhdGNoRXZlbnQoImVycm9yIix0bCksdm9pZCB0KG5ldyBFcnJvcih0bC5lcnJNc2cpKTtuLl9pc0xvYWQ/KG4uX3Jld2FyZEFkLnNob3coKSxlKCkpOnQobmV3IEVycm9yKG4uX2FkRXJyb3IpKX19KX0scmwucHJvdG90eXBlLmdldFByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jld2FyZEFkLmdldFByb3ZpZGVyKCl9LHJsLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fcmV3YXJkQWQuZGVzdHJveSgpfSxybC5wcm90b3R5cGUuX2xvYWRBZD1mdW5jdGlvbigpe3RoaXMuX2lzTG9hZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITAsdGhpcy5fcmV3YXJkQWQubG9hZCgpfSxybC5wcm90b3R5cGUuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9jYWxsYmFja3NbZV0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSh0fHx7fSl9KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmwucHJvdG90eXBlLGlsKTt2YXIgb2w9ImxvYWQiLGFsPSJjbG9zZSIsc2w9ImVycm9yIixjbD0iYWRDbGlja2VkIix1bD1bb2wsYWwsc2wsY2xdLGxsPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcyxuPXRoaXMuX2NhbGxiYWNrcz17fTt1bC5mb3JFYWNoKGZ1bmN0aW9uKHQpe25bdF09W107dmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpO3JbIm9uIitlXT1mdW5jdGlvbihlKXtuW3RdLnB1c2goZSl9fSksdGhpcy5fcHJlbG9hZD12b2lkIDAhPT10LnByZWxvYWQmJnQucHJlbG9hZCx0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGw7dmFyIGk9dGhpcy5fYWQ9ZTtpLm9uTG9hZChmdW5jdGlvbihlKXtyLl9pc0xvYWRlZD0hMCxyLl9pc0xvYWRpbmc9ITEsbnVsbCE9ci5fbG9hZFByb21pc2VSZXNvbHZlJiYoci5fbG9hZFByb21pc2VSZXNvbHZlKCksci5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwpLG51bGwhPXIuX3Nob3dQcm9taXNlUmVzb2x2ZSYmKHIuX3Nob3dQcm9taXNlUmVzb2x2ZSgpLHIuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHIuX3Nob3dBZCgpKSxyLl9kaXNwYXRjaEV2ZW50KG9sLHt9KX0pLGkub25DbG9zZShmdW5jdGlvbihlKXtyLl9pc0xvYWRlZD0hMSxyLl9pc0xvYWRpbmc9ITEsci5fZGlzcGF0Y2hFdmVudChhbCx7aXNFbmRlZDplLmlzRW5kZWR9KSwhMD09PXIuX3ByZWxvYWQmJnIuX2xvYWRBZCgpfSksaS5vbkVycm9yKGZ1bmN0aW9uKGUpe3IuX2lzTG9hZGluZz0hMTt2YXIgdD17Y29kZTplLmNvZGUsZXJyQ29kZTplLmNvZGUsZXJyTXNnOmUubWVzc2FnZSxkZXRhaWw6ZS5kZXRhaWx9O3IuX2FkRXJyb3I9dCxyLl9kaXNwYXRjaEV2ZW50KHNsLHQpO3ZhciBuPW5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyLl9hZEVycm9yKSk7bi5jb2RlPWUuY29kZSxuLmVyck1zZz1lLm1lc3NhZ2Usbi5kZXRhaWw9ZS5kZXRhaWwsbnVsbCE9ci5fbG9hZFByb21pc2VSZWplY3QmJihyLl9sb2FkUHJvbWlzZVJlamVjdChuKSxyLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsKSxudWxsIT1yLl9zaG93UHJvbWlzZVJlamVjdCYmKHIuX3Nob3dQcm9taXNlUmVqZWN0KG4pLHIuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpfSksaS5vbkFkQ2xpY2tlZCYmaS5vbkFkQ2xpY2tlZChmdW5jdGlvbihlKXtyLl9kaXNwYXRjaEV2ZW50KGNsLHt9KX0pfTtsbC5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fbG9hZFByb21pc2VSZXNvbHZlPWUsbi5fbG9hZFByb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9pc0xvYWRlZD9lKCk6bi5fbG9hZEFkKCkpfSl9LGxsLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9zaG93UHJvbWlzZVJlc29sdmU9ZSxuLl9zaG93UHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2lzTG9hZGVkPyhuLl9zaG93QWQoKSxlKCkpOm4uX2xvYWRBZCgpKX0pfSxsbC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2FkLmRlc3Ryb3koKX0sbGwucHJvdG90eXBlLmdldFByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FkLmdldFByb3ZpZGVyKCl9LGxsLnByb3RvdHlwZS5fbG9hZEFkPWZ1bmN0aW9uKCl7dGhpcy5fYWRFcnJvcj0iIix0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITAsdGhpcy5fYWQubG9hZCgpfSxsbC5wcm90b3R5cGUuX3Nob3dBZD1mdW5jdGlvbigpe3RoaXMuX2FkLnNob3coKX0sbGwucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUodHx8e30pfSl9O3ZhciBkbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KSx0LmNhbGwodGhpcyxuZy5hZC5jcmVhdGVGdWxsU2NyZWVuVmlkZW9BZChlKSxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZX0obGwpO3ZhciBmbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KSx0LmNhbGwodGhpcyxuZy5hZC5jcmVhdGVJbnRlcnN0aXRpYWxBZChlKSxlKSx0aGlzLl9sb2FkQWQoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZX0obGwpO3ZhciBwbD17fSxobD17fTt2YXIgdmw9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxyPXRoaXMuX2NhbGxiYWNrcz17fTt1bC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JbdF09W107dmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpO25bIm9uIitlXT1mdW5jdGlvbihlKXtyW3RdLnB1c2goZSl9fSksdGhpcy5fYWQ9bnVsbCx0aGlzLl9hZEVycm9yPSIiLHRoaXMuX2FkcGlkPWUuYWRwaWQsdGhpcy5fcHJvdmlkZXI9ZS5wcm92aWRlcix0aGlzLl91c2VyRGF0YT1lLnVzZXJEYXRhfHx7fSx0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsLGlnKGZ1bmN0aW9uKCl7bi5faW5pdCgpfSl9O3ZsLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fYWRFcnJvcj0iIixmdW5jdGlvbihlKXt2YXIgcj1lLnByb3ZpZGVyO2lmKHBsW3JdfHwocGxbcl09e30pLCJvYmplY3QiIT10eXBlb2YgcGxbcl0uaW5zdGFuY2UpaWYoaGxbcl18fChobFtyXT1bXSksaGxbcl0ucHVzaChlKSwhMCE9PXBsW3JdLmxvYWRpbmcpe3BsW3JdLmxvYWRpbmc9ITA7dmFyIGk9cGkocil8fHt9LHQ9aS5pbml0fHxpLmluaXRTREs7aWYoIXQpcmV0dXJuIGhsW3JdLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5mYWlsKHtjb2RlOi0xLG1lc3NhZ2U6InByb3ZpZGVyIFsiK3IrIl0gaW52YWxpZCJ9KX0pLGhsW3JdLmxlbmd0aD0wLHBsW3JdLmxvYWRpbmc9ITE7cGxbcl0ucGx1Z2luPWksZS5fX3BsdWdpbj1pLHQoZnVuY3Rpb24odCl7dmFyIGU9dC5jb2RlLG49IkJYTS1BRCI9PT1yPzA9PT1lfHwxPT09ZTowPT09ZTtuP3BsW3JdLmluc3RhbmNlPWk6cGxbcl0ubG9hZGluZz0hMSxobFtyXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24/ZS5zdWNjZXNzKGUuX19wbHVnaW4pOmUuZmFpbCh0KX0pLGhsW3JdLmxlbmd0aD0wfSl9ZWxzZSBlLl9fcGx1Z2luPXBsW3JdLnBsdWdpbjtlbHNlIGUuc3VjY2VzcyhwbFtyXS5pbnN0YW5jZSl9KHtwcm92aWRlcjp0aGlzLl9wcm92aWRlcixzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuX2FkPWUsdC5fdXNlckRhdGEmJnQuYmluZFVzZXJEYXRhKHQuX3VzZXJEYXRhKSx0Ll9sb2FkQWQoKX0sZmFpbDpmdW5jdGlvbihlKXt0Ll9hZEVycm9yPWUsdC5fZGlzcGF0Y2hFdmVudChzbCxlKX19KX0sdmwucHJvdG90eXBlLmdldFByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyfSx2bC5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fbG9hZFByb21pc2VSZXNvbHZlPWUsbi5fbG9hZFByb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9hZEVycm9yP24uX2luaXQoKTpuLl9pc0xvYWRlZD9lKCk6bi5fbG9hZEFkKCkpfSl9LHZsLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9zaG93UHJvbWlzZVJlc29sdmU9ZSxuLl9zaG93UHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2FkRXJyb3I/bi5faW5pdCgpOm4uX2lzTG9hZGVkPyhuLl9zaG93QWQoKSxlKCkpOm4uX2xvYWRBZCgpKX0pfSx2bC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe251bGwhPT10aGlzLl9hZCYmdGhpcy5fYWQuZGVzdHJveSYmdGhpcy5fYWQuZGVzdHJveSh7YWRwaWQ6dGhpcy5fYWRwaWR9KX0sdmwucHJvdG90eXBlLmJpbmRVc2VyRGF0YT1mdW5jdGlvbihlKXtudWxsIT09dGhpcy5fYWQmJnRoaXMuX2FkLmJpbmRVc2VyRGF0YSYmdGhpcy5fYWQuYmluZFVzZXJEYXRhKGUpfSx2bC5wcm90b3R5cGUuX2xvYWRBZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYobnVsbCE9PXRoaXMuX2FkKXtpZighMD09PXRoaXMuX2lzTG9hZGluZylyZXR1cm47dGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkLmxvYWREYXRhKE9iamVjdC5hc3NpZ24oe30se2FkcGlkOnRoaXMuX2FkcGlkfSx0aGlzLl91c2VyRGF0YSksZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITAsdC5faXNMb2FkaW5nPSExLG51bGwhPXQuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKHQuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHQuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSxudWxsIT10Ll9zaG93UHJvbWlzZVJlc29sdmUmJih0Ll9zaG93UHJvbWlzZVJlc29sdmUoKSx0Ll9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0Ll9zaG93QWQoKSksdC5fZGlzcGF0Y2hFdmVudChvbCxlKX0sZnVuY3Rpb24oZSl7dC5faXNMb2FkaW5nPSExLG51bGwhPXQuX3Nob3dQcm9taXNlUmVqZWN0JiYodC5fc2hvd1Byb21pc2VSZWplY3QodC5fY3JlYXRlRXJyb3IoZSkpLHQuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHQuX2Rpc3BhdGNoRXZlbnQoc2wsZSl9KX19LHZsLnByb3RvdHlwZS5fc2hvd0FkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztudWxsIT09dGhpcy5fYWQmJiEwPT09dGhpcy5faXNMb2FkZWQmJnRoaXMuX2FkLnNob3coe2FkcGlkOnRoaXMuX2FkcGlkfSxmdW5jdGlvbihlKXt0Ll9pc0xvYWRlZD0hMX0sZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITEsbnVsbCE9dC5fc2hvd1Byb21pc2VSZWplY3QmJih0Ll9zaG93UHJvbWlzZVJlamVjdCh0Ll9jcmVhdGVFcnJvcihlKSksdC5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCksdC5fZGlzcGF0Y2hFdmVudChzbCxlKX0pfSx2bC5wcm90b3R5cGUuX2NyZWF0ZUVycm9yPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlKSk7cmV0dXJuIHQuY29kZT1lLmNvZGUsdC5lcnJNc2c9ZS5tZXNzYWdlLHR9LHZsLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHR8fHt9KX0pfTt2YXIgZ2w9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaW5pdFVUU1Byb3h5Q2xhc3M6YnUsaW5pdFVUU1Byb3h5RnVuY3Rpb246eXUsaW5pdFVUU0luZGV4Q2xhc3NOYW1lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PW5nPyIiOnd1KGUsImlPUyI9PT1uZy5vcy5uYW1lPyJJbmRleFN3aWZ0IjoiSW5kZXhLdCIsdCl9LGluaXRVVFNDbGFzc05hbWU6d3UsaW5pdFVUU1BhY2thZ2VOYW1lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMCE9PW5nJiYiQW5kcm9pZCI9PT1uZy5vcy5uYW1lPyJ1dHMuc2RrLiIrKHQ/Im1vZHVsZXMuIjoiIikrZToiIn0scmVxdWlyZVVUU1BsdWdpbjpmdW5jdGlvbihlKXt2YXIgdD1TdVtlXTtyZXR1cm4gdHx8Y29uc29sZS5lcnJvcihlKyIgaXMgbm90IGZvdW5kIiksdH0scmVnaXN0ZXJVVFNQbHVnaW46ZnVuY3Rpb24oZSx0KXtTdVtlXT10fSxyZWdpc3RlclVUU0ludGVyZmFjZTpmdW5jdGlvbihlLHQpe2t1W2VdPXR9LHN0YXJ0UHVsbERvd25SZWZyZXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHF1JiZxdS5lbmRQdWxsVG9SZWZyZXNoKCksKHF1PVNpKCkpPyhxdS5iZWdpblB1bGxUb1JlZnJlc2goKSx7ZXJyTXNnOiJzdGFydFB1bGxEb3duUmVmcmVzaDpvayJ9KTp7ZXJyTXNnOiJzdGFydFB1bGxEb3duUmVmcmVzaDpmYWlsIn19LHN0b3BQdWxsRG93blJlZnJlc2g6ZnVuY3Rpb24oKXtyZXR1cm4gcXV8fChxdT1TaSgpKSxxdT8ocXUuZW5kUHVsbFRvUmVmcmVzaCgpLHF1PW51bGwse2Vyck1zZzoic3RvcFB1bGxEb3duUmVmcmVzaDpvayJ9KTp7ZXJyTXNnOiJzdG9wUHVsbERvd25SZWZyZXNoOmZhaWwifX0sJG9uOmFpLCRvZmY6c2ksJG9uY2U6Y2ksJGVtaXQ6dWksY3JlYXRlQXVkaW9JbnN0YW5jZTpmdW5jdGlvbigpe3ZhciBlPSIiK0RhdGUubm93KCkrTWF0aC5yYW5kb20oKSx0PUZpW2VdPW5nLmF1ZGlvLmNyZWF0ZVBsYXllcigiIik7cmV0dXJuIHQuc3JjPSIiLHQudm9sdW1lPTEsdC5zdGFydFRpbWU9MCx0LnNldFNlc3Npb25DYXRlZ29yeShSaSkse2Vyck1zZzoiY3JlYXRlQXVkaW9JbnN0YW5jZTpvayIsYXVkaW9JZDplfX0sZGVzdHJveUF1ZGlvSW5zdGFuY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdWRpb0lkO3JldHVybiBGaVt0XSYmKEZpW3RdLmNsb3NlKCksZGVsZXRlIEZpW3RdKSx7ZXJyTXNnOiJkZXN0cm95QXVkaW9JbnN0YW5jZTpvayIsYXVkaW9JZDp0fX0sc2V0QXVkaW9TdGF0ZTpmdW5jdGlvbihlKXt2YXIgdD1lLmF1ZGlvSWQsbj1lLnNyYyxyPWUuc3RhcnRUaW1lLGk9ZS5hdXRvcGxheTt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIG89ZS5sb29wO3ZvaWQgMD09PW8mJihvPSExKSxlLm9iZXlNdXRlU3dpdGNoO3ZhciBhPWUudm9sdW1lLHM9ZS5zZXNzaW9uQ2F0ZWdvcnk7dm9pZCAwPT09cyYmKHM9UmkpO3ZhciBjLHUsbD1lLnBsYXliYWNrUmF0ZSxkPUZpW3RdO2lmKGQpe3ZhciBmPXtsb29wOm8sYXV0b3BsYXk6aX07aWYobil7dmFyIHA9VGkobik7ZC5zcmMhPT1wJiYoZC5zcmM9Zi5zcmM9cCl9ciYmKGQuc3RhcnRUaW1lPWYuc3RhcnRUaW1lPXIpLCJudW1iZXIiPT10eXBlb2YgYSYmKGQudm9sdW1lPWYudm9sdW1lPWEpLGQuc2V0U3R5bGVzKGYpLHMmJmQuc2V0U2Vzc2lvbkNhdGVnb3J5KHMpLGwmJmQucGxheWJhY2tSYXRlJiZkLnBsYXliYWNrUmF0ZShsKSwodT1GaVtjPXRdKSYmKHUuaW5pdFN0YXRlQ2hhZ2V8fCh1LmluaXRTdGF0ZUNoYWdlPSEwLHUuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGUpe3ppKCJlcnJvciIse2F1ZGlvSWQ6YyxlcnJNc2c6Ik1lZGlhRXJyb3IiLGVyckNvZGU6ZS5jb2RlfSl9KSxVaS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKCl7InBsYXkiPT09ZT91LmlzU3RvcHBlZD0hMToic3RvcCI9PT1lJiYodS5pc1N0b3BwZWQ9ITApLHppKGUse2F1ZGlvSWQ6Y30pfSl9KSkpfXJldHVybntlcnJNc2c6InNldEF1ZGlvU3RhdGU6b2sifX0sZ2V0QXVkaW9TdGF0ZTpmdW5jdGlvbihlKXt2YXIgdD1lLmF1ZGlvSWQsbj1GaVt0XTtpZighbilyZXR1cm57ZXJyTXNnOiJnZXRBdWRpb1N0YXRlOmZhaWwifTt2YXIgcj1uLnNyYyxpPW4uc3RhcnRUaW1lLG89bi52b2x1bWU7cmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpvayIsZHVyYXRpb246MWUzKihuLmdldER1cmF0aW9uKCl8fDApLGN1cnJlbnRUaW1lOm4uaXNTdG9wcGVkPzA6MWUzKm4uZ2V0UG9zaXRpb24oKSxwYXVzZWQ6bi5pc1BhdXNlZCgpLHNyYzpyLHZvbHVtZTpvLHN0YXJ0VGltZToxZTMqaSxidWZmZXJlZDoxZTMqbi5nZXRCdWZmZXJlZCgpfX0sb3BlcmF0ZUF1ZGlvOmZ1bmN0aW9uKGUpe3ZhciB0PWUub3BlcmF0aW9uVHlwZSxuPWUuYXVkaW9JZCxyPWUuY3VycmVudFRpbWUsaT1GaVtuXSxvPVsicGxheSIsInBhdXNlIiwic3RvcCJdO3JldHVybiAwPD1vLmluZGV4T2YodCk/aVt0PT09b1swXSYmaS5pc1BhdXNlZCgpPyJyZXN1bWUiOnRdKCk6InNlZWsiPT09dCYmaS5zZWVrVG8oci8xZTMpLHtlcnJNc2c6Im9wZXJhdGVBdWRpbzpvayJ9fSxnZXRNdXNpY1BsYXllclN0YXRlOmZ1bmN0aW9uKCl7dmFyIGU9WWkoKTtyZXR1cm4gZT97ZGF0YVVybDplLnNyYyxkdXJhdGlvbjplLmdldER1cmF0aW9uKCl8fDAsY3VycmVudFBvc2l0aW9uOmUuZ2V0UG9zaXRpb24oKSxzdGF0dXM6ZS5pc1BhdXNlZCgpPzA6MSxkb3dubG9hZFBlcmNlbnQ6TWF0aC5yb3VuZCgxMDAqZS5nZXRCdWZmZXJlZCgpL2UuZ2V0RHVyYXRpb24oKSksZXJyTXNnOiJnZXRNdXNpY1BsYXllclN0YXRlOm9rIn06e3N0YXR1czoyLGVyck1zZzoiZ2V0TXVzaWNQbGF5ZXJTdGF0ZTpvayJ9fSxvcGVyYXRlTXVzaWNQbGF5ZXI6S2ksc2V0QmFja2dyb3VuZEF1ZGlvU3RhdGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWGkoZSx0KSx7ZXJyTXNnOiJzZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpvayJ9fSxvcGVyYXRlQmFja2dyb3VuZEF1ZGlvOmZ1bmN0aW9uKGUpe3ZhciB0PWUub3BlcmF0aW9uVHlwZSxuPWUuc3JjLHI9ZS5zdGFydFRpbWUsaT1lLmN1cnJlbnRUaW1lO3JldHVybiBLaSh7b3BlcmF0aW9uVHlwZTp0LGRhdGFVcmw6bixwb3NpdGlvbjpyfHxpfHwwLGFwaToib3BlcmF0ZUJhY2tncm91bmRBdWRpbyJ9KX0sZ2V0QmFja2dyb3VuZEF1ZGlvU3RhdGU6ZnVuY3Rpb24oKXt2YXIgZT17ZHVyYXRpb246MCxjdXJyZW50VGltZTowLHBhdXNlZDohMSxzcmM6IiIsYnVmZmVyZWQ6MCx0aXRsZToiIixlcG5hbWU6IiIsc2luZ2VyOiIiLGNvdmVySW1nVXJsOiIiLHdlYlVybDoiIixzdGFydFRpbWU6MCxlcnJNc2c6ImdldEJhY2tncm91bmRBdWRpb1N0YXRlOm9rIn0sdD1ZaSgpO2lmKHQpe3ZhciBuPXtkdXJhdGlvbjp0LmdldER1cmF0aW9uKCl8fDAsY3VycmVudFRpbWU6dC5pc1N0b3BwZWQ/MDp0LmdldFBvc2l0aW9uKCkscGF1c2VkOnQuaXNQYXVzZWQoKSxzcmM6dC5zcmMsYnVmZmVyZWQ6dC5nZXRCdWZmZXJlZCgpLHRpdGxlOnQudGl0bGUsZXBuYW1lOnQuZXBuYW1lLHNpbmdlcjp0LnNpbmdlcixjb3ZlckltZ1VybDp0LmNvdmVySW1nVXJsLHdlYlVybDp0LndlYlVybCxzdGFydFRpbWU6dC5zdGFydFRpbWV9O2U9T2JqZWN0LmFzc2lnbihlLG4pfXJldHVybiBlfSxvcGVyYXRlTWFwUGxheWVyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLGMsdSxsO3QuJHBhZ2UubWV0YS5pc05WdWU/KGM9ZSx1PXQsbD1yLGFvW25dKHJvKGMsdSksbCkpOihpPWUsbz1uLGE9cixzPXQuJHBhZ2UuaWQscmcucHVibGlzaEhhbmRsZXIocysiLW1hcC0iK2kse21hcElkOmksdHlwZTpvLGRhdGE6YX0scykpfSxvcGVyYXRlVmlkZW9QbGF5ZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsYyx1LGw7dC4kcGFnZS5tZXRhLmlzTlZ1ZT8oYz1lLHU9dCxsPXIsc29bbl0ocm8oYyx1KSxsKSk6KGk9ZSxvPW4sYT1yLHM9dC4kcGFnZS5pZCxyZy5wdWJsaXNoSGFuZGxlcihzKyItdmlkZW8tIitpLHt2aWRlb0lkOmksdHlwZTpvLGRhdGE6YX0scykpfSxMaXZlUHVzaGVyQ29udGV4dDpmbyxjcmVhdGVMaXZlUHVzaGVyQ29udGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiB0LiRwYWdlLm1ldGEuaXNOVnVlP2Z1bmN0aW9uKGUsdCl7aWYoIXQpcmV0dXJuIGNvbnNvbGUud2FybigidW5pLmNyZWF0ZUxpdmVQdXNoZXJDb250ZXh0OiAyIGFyZ3VtZW50cyByZXF1aXJlZCwgYnV0IG9ubHkgMSBwcmVzZW50Iik7dmFyIG49cm8oZSx0KTtyZXR1cm4gbj9uZXcgY28oZSxuKTpjb25zb2xlLndhcm4oIkNhbiBub3QgZmluZCBgIitlKyJgIil9KGUsdCk6bmV3IGZvKGUsdCl9LHN0YXJ0QWNjZWxlcm9tZXRlcjpibyxzdG9wQWNjZWxlcm9tZXRlcjp3byxvbkFjY2VsZXJvbWV0ZXJDaGFuZ2U6ZnVuY3Rpb24oZSl7X28ubGVuZ3RofHxibygpLF9vLnB1c2goZSl9LG9mZkFjY2VsZXJvbWV0ZXJDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9X28uaW5kZXhPZihlKTswPD10JiZfby5zcGxpY2UodCwxKX1fby5sZW5ndGh8fHdvKCl9LGFkZFBob25lQ29udGFjdDpmdW5jdGlvbihuLHIpe25nLmNvbnRhY3RzLmdldEFkZHJlc3NCb29rKG5nLmNvbnRhY3RzLkFERFJFU1NCT09LX1BIT05FLGZ1bmN0aW9uKGUpeyFuLnBob3RvRmlsZVBhdGgmJihuLnBob3RvRmlsZVBhdGg9IiIpO3ZhciB0PWUuY3JlYXRlKCk7IWZ1bmN0aW9uIHIoaSxvLHQpe3ZhciBhPTA7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7dmFyIGU9dFtuXTsib2JqZWN0IiE9dHlwZW9mIGU/LTEhPT1Tby5pbmRleE9mKG4pP2lbbl09dFtuXTp2b2lkIDAhPT1vW2VdPyhhKyssaVtuXT1vW2VdKTpkZWxldGUgaVtuXTplIGluc3RhbmNlb2YgQXJyYXk/KGlbbl09W10sZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXt9O3IodCxvLGUpJiZpW25dLnB1c2godCl9KSxpW25dLmxlbmd0aD9hKys6ZGVsZXRlIGlbbl0pOihpW25dPXt9LHIoaVtuXSxvLGUpP2ErKzpkZWxldGUgaVtuXSl9KSxhfSh0LG4sa28pLHQuc2F2ZShmdW5jdGlvbigpe2ZpKHIse2Vyck1zZzoiYWRkUGhvbmVDb250YWN0Om9rIn0pfSxmdW5jdGlvbihlKXtmaShyLHtlcnJNc2c6ImFkZFBob25lQ29udGFjdDpmYWlsIn0pfSl9LGZ1bmN0aW9uKGUpe2ZpKHIse2Vyck1zZzoiYWRkUGhvbmVDb250YWN0OmZhaWwifSl9KX0sb25CbHVldG9vdGhEZXZpY2VGb3VuZDp4byxvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZTpDbyxvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZTpUbyxvbkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2U6T28sb3BlbkJsdWV0b290aEFkYXB0ZXI6QW8sY2xvc2VCbHVldG9vdGhBZGFwdGVyOiRvLGdldEJsdWV0b290aEFkYXB0ZXJTdGF0ZTpQbyxzdGFydEJsdWV0b290aERldmljZXNEaXNjb3Zlcnk6TW8sc3RvcEJsdWV0b290aERldmljZXNEaXNjb3Zlcnk6am8sZ2V0Qmx1ZXRvb3RoRGV2aWNlczpObyxnZXRDb25uZWN0ZWRCbHVldG9vdGhEZXZpY2VzOkJvLGNyZWF0ZUJMRUNvbm5lY3Rpb246TG8sY2xvc2VCTEVDb25uZWN0aW9uOkRvLGdldEJMRURldmljZVNlcnZpY2VzOlJvLGdldEJMRURldmljZUNoYXJhY3RlcmlzdGljczpGbyxub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOlVvLHJlYWRCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlOnpvLHdyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTpWbyxzZXRCTEVNVFU6cW8sZ2V0QkxFRGV2aWNlUlNTSTpXbyxnZXRTY3JlZW5CcmlnaHRuZXNzOmZ1bmN0aW9uKCl7cmV0dXJue2Vyck1zZzoiZ2V0U2NyZWVuQnJpZ2h0bmVzczpvayIsdmFsdWU6bmcuc2NyZWVuLmdldEJyaWdodG5lc3MoITEpfX0sc2V0U2NyZWVuQnJpZ2h0bmVzczpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS52YWx1ZTtyZXR1cm4gbmcuc2NyZWVuLnNldEJyaWdodG5lc3ModCwhMSkse2Vyck1zZzoic2V0U2NyZWVuQnJpZ2h0bmVzczpvayJ9fSxzZXRLZWVwU2NyZWVuT246ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUua2VlcFNjcmVlbk9uO3JldHVybiBuZy5kZXZpY2Uuc2V0V2FrZWxvY2soISF0KSx7ZXJyTXNnOiJzZXRLZWVwU2NyZWVuT246b2sifX0sZ2V0Q2xpcGJvYXJkRGF0YTpmdW5jdGlvbihlLHQpe3BpKCJjbGlwYm9hcmQiKS5nZXRTdHJpbmcoZnVuY3Rpb24oZSl7InN1Y2Nlc3MiPT09ZS5yZXN1bHQ/ZmkodCx7ZGF0YTplLmRhdGEsZXJyTXNnOiJnZXRDbGlwYm9hcmREYXRhOm9rIn0pOmZpKHQse2RhdGE6ZS5yZXN1bHQsZXJyTXNnOiJnZXRDbGlwYm9hcmREYXRhOmZhaWwifSl9KX0sc2V0Q2xpcGJvYXJkRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7cmV0dXJuIHBpKCJjbGlwYm9hcmQiKS5zZXRTdHJpbmcodCkse2Vyck1zZzoic2V0Q2xpcGJvYXJkRGF0YTpvayJ9fSxzdGFydENvbXBhc3M6R28sc3RvcENvbXBhc3M6Sm8sb25Db21wYXNzQ2hhbmdlOmZ1bmN0aW9uKGUpe0hvLmxlbmd0aHx8R28oKSxIby5wdXNoKGUpfSxvZmZDb21wYXNzQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PUhvLmluZGV4T2YoZSk7MDw9dCYmSG8uc3BsaWNlKHQsMSl9SG8ubGVuZ3RofHxKbygpfSxnZXROZXR3b3JrVHlwZTpmdW5jdGlvbigpe3JldHVybntlcnJNc2c6ImdldE5ldHdvcmtUeXBlOm9rIixuZXR3b3JrVHlwZTp2b1tuZy5uZXR3b3JraW5mby5nZXRDdXJyZW50VHlwZSgpXXx8InVua25vd24ifX0sb25CZWFjb25VcGRhdGU6WG8sb25CZWFjb25TZXJ2aWNlQ2hhbmdlOllvLGdldEJlYWNvbnM6S28sc3RhcnRCZWFjb25EaXNjb3Zlcnk6Wm8sc3RvcEJlYWNvbkRpc2NvdmVyeTpRbyxtYWtlUGhvbmVDYWxsOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnBob25lTnVtYmVyO3JldHVybiBuZy5kZXZpY2UuZGlhbCh0KSx7ZXJyTXNnOiJtYWtlUGhvbmVDYWxsOm9rIn19LHNjYW5Db2RlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPSJ3ZWV4IiE9PWNnLm52dWVDb21waWxlcj9QYTpDYTtyZXR1cm4gbi5zY2FuQ29kZS5hcHBseShuLGUpfSxjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb246TmEsY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpCYSxzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5yZXF1ZXN0QXV0aE1vZGVzLHI9ZS5jaGFsbGVuZ2U7dm9pZCAwPT09ciYmKHI9ITEpO3ZhciBpPWUuYXV0aENvbnRlbnQsbz1OYSgpLnN1cHBvcnRNb2RlO2lmKDA9PT1vLmxlbmd0aClyZXR1cm57YXV0aE1vZGU6b1swXXx8ImZpbmdlclByaW50IixlcnJDb2RlOjkwMDAxLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm90IHN1cHBvcnQifTt2YXIgYT1bXTtpZihuLm1hcChmdW5jdGlvbihlLHQpey0xPG8uaW5kZXhPZihlKSYmYS5wdXNoKGUpfSksMD09PWEubGVuZ3RoKXJldHVybnthdXRoTW9kZTphWzBdfHwiZmluZ2VyUHJpbnQiLGVyckNvZGU6OTAwMDMsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBubyBjb3JyZXNwb25kaW5nIG1vZGUifTt2YXIgcz1bXTtpZihhLm1hcChmdW5jdGlvbihlLHQpe0JhKHtjaGVja0F1dGhNb2RlOmV9KS5pc0Vucm9sbGVkJiZzLnB1c2goZSl9KSwwPT09cy5sZW5ndGgpcmV0dXJue2F1dGhNb2RlOmFbMF0sZXJyQ29kZTo5MDAxMSxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vICIrYVswXSsiIGVucm9sbGVkIn07dmFyIGM9c1swXTtpZigiZmluZ2VyUHJpbnQiPT09Yyl7dmFyIHUsbD1udWxsLGQ9aXx8YXQoInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiKTsiYW5kcm9pZCI9PT1uZy5vcy5uYW1lLnRvTG93ZXJDYXNlKCkmJigobD1uZy5uYXRpdmVVSS5zaG93V2FpdGluZyhkKSkub25jbG9zZT1mdW5jdGlvbigpe25nLmZpbmdlcnByaW50LmNhbmNlbCgpfSksbmcuZmluZ2VycHJpbnQuYXV0aGVudGljYXRlKGZ1bmN0aW9uKCl7bmcubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246b2sifSl9LGZ1bmN0aW9uKGUpe3N3aXRjaChlLmNvZGUpe2Nhc2UgZS5BVVRIRU5USUNBVEVfTUlTTUFUQ0g6bCYmKG9nKHUpLGwuc2V0VGl0bGUoYXQoInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiKSksdT1pZyhmdW5jdGlvbigpe2wmJmwuc2V0VGl0bGUoZCl9LDFlMykpO2JyZWFrO2Nhc2UgZS5BVVRIRU5USUNBVEVfT1ZFUkxJTUlUOm5nLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLGZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAxMCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGF1dGhlbnRpY2F0ZSBmcmVlemUuIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIifSk7YnJlYWs7Y2FzZSBlLkNBTkNFTDpuZy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxmaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6OTAwMDgsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBjYW5jZWwifSk7YnJlYWs7ZGVmYXVsdDpuZy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxmaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6OTAwMDcsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCJ9KX19LHttZXNzYWdlOml9KX1lbHNlImZhY2lhbCI9PT1jJiZwaSgiZmFjZUlEIikuYXV0aGVudGljYXRlKHttZXNzYWdlOml9LGZ1bmN0aW9uKGUpe2lmKCJzdWNjZXNzIj09PWUudHlwZSYmMD09PWUuY29kZSlmaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6MCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpvayJ9KTtlbHNlIHN3aXRjaChlLmNvZGUpe2Nhc2UgNDpmaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6OTAwMDksZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCJ9KTticmVhaztjYXNlIDU6ZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDEwLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgYXV0aGVudGljYXRlIGZyZWV6ZS4gcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciJ9KTticmVhaztjYXNlIDY6ZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA4LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgY2FuY2VsIn0pO2JyZWFrO2RlZmF1bHQ6ZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA3LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSl9fSl9LHdlZXhHZXRTeXN0ZW1JbmZvU3luYzpKcyxnZXREZXZpY2VJbmZvOlhzLGdldEFwcEJhc2VJbmZvOllzLGdldFN5c3RlbUluZm9TeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIHdpKEtzLE9iamVjdC5jcmVhdGUobnVsbCksImdldFN5c3RlbUluZm8iLCJnZXRTeXN0ZW1JbmZvU3luYyIpfSxnZXRTeXN0ZW1JbmZvOktzLHZpYnJhdGVMb25nOmZ1bmN0aW9uKCl7cmV0dXJuIG5nLmRldmljZS52aWJyYXRlKDQwMCkse2Vyck1zZzoidmlicmF0ZUxvbmc6b2sifX0sdmlicmF0ZVNob3J0OmZ1bmN0aW9uKCl7cmV0dXJuIG5nLmRldmljZS52aWJyYXRlKDE1KSx7ZXJyTXNnOiJ2aWJyYXRlU2hvcnQ6b2sifX0sZ2V0V2luZG93SW5mbzpXcyxnZXRTeXN0ZW1TZXR0aW5nOmZ1bmN0aW9uKCl7dmFyIGU9KDAsdGcucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldFN5c3RlbVNldHRpbmcpKCk7dHJ5eyJzdHJpbmciPT10eXBlb2YgZSYmKGU9SlNPTi5wYXJzZShlKSl9Y2F0Y2goZSl7fXJldHVybiBlfSxnZXRBcHBBdXRob3JpemVTZXR0aW5nOlpzLG9wZW5BcHBBdXRob3JpemVTZXR0aW5nOmZ1bmN0aW9uKGUsdCl7KDAsdGcucmVxdWlyZU1vZHVsZSgicGx1cyIpLm9wZW5BcHBBdXRob3JpemVTZXR0aW5nKShmdW5jdGlvbihlKXsic3VjY2VzcyI9PT1lLnR5cGU/ZmkodCx7ZXJyTXNnOiJvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpvayJ9KTpmaSh0LHtlcnJNc2c6Im9wZW5BcHBBdXRob3JpemVTZXR0aW5nOmZhaWwifSl9KX0sc2F2ZUZpbGU6ZnVuY3Rpb24oZSxuKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQscj1lLnRlbXBGaWxlUGF0aCxpPU5pKG4sInNhdmVGaWxlIiksbz0iIitEYXRlLm5vdygpK25jKysrKDE8KHQ9ci5zcGxpdCgiLiIpKS5sZW5ndGg/Ii4iK3RbdC5sZW5ndGgtMV06IiIpO25nLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwocixmdW5jdGlvbih0KXt0YyhmdW5jdGlvbihlKXt0LmNvcHlUbyhlLG8sZnVuY3Rpb24oKXtmaShuLHtlcnJNc2c6InNhdmVGaWxlOm9rIixzYXZlZEZpbGVQYXRoOmVjKyIvIitvfSl9LGkpfSxpKX0saSl9LGdldFNhdmVkRmlsZUxpc3Q6ZnVuY3Rpb24oZSxpKXt2YXIgbz1OaShpLCJnZXRTYXZlZEZpbGVMaXN0Iik7dGMoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jcmVhdGVSZWFkZXIoKSxyPVtdO3QucmVhZEVudHJpZXMoZnVuY3Rpb24obil7biYmbi5sZW5ndGg/bi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZ2V0TWV0YWRhdGEoZnVuY3Rpb24oZSl7ci5wdXNoKHtmaWxlUGF0aDpuZy5pby5jb252ZXJ0QWJzb2x1dGVGaWxlU3lzdGVtKHQuZnVsbFBhdGgpLGNyZWF0ZVRpbWU6ZS5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOmUuc2l6ZX0pLHIubGVuZ3RoPT09bi5sZW5ndGgmJmZpKGkse2Vyck1zZzoiZ2V0U2F2ZWRGaWxlTGlzdDpvayIsZmlsZUxpc3Q6cn0pfSxvLCExKX0pOmZpKGkse2Vyck1zZzoiZ2V0U2F2ZWRGaWxlTGlzdDpvayIsZmlsZUxpc3Q6cn0pfSxvKX0sbyl9LGdldEZpbGVJbmZvOnJjLGdldFNhdmVkRmlsZUluZm86ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPU5pKHQsImdldFNhdmVkRmlsZUluZm8iKTtuZy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKG4sZnVuY3Rpb24oZSl7ZS5nZXRNZXRhZGF0YShmdW5jdGlvbihlKXtmaSh0LHtjcmVhdGVUaW1lOmUubW9kaWZpY2F0aW9uVGltZS5nZXRUaW1lKCksc2l6ZTplLnNpemUsZXJyTXNnOiJnZXRTYXZlZEZpbGVJbmZvOm9rIn0pfSxyLCExKX0scil9LHJlbW92ZVNhdmVkRmlsZTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9TmkodCwicmVtb3ZlU2F2ZWRGaWxlIik7bmcuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChuLGZ1bmN0aW9uKGUpe2UucmVtb3ZlKGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJyZW1vdmVTYXZlZEZpbGU6b2sifSl9LHIpfSxyKX0sb3BlbkRvY3VtZW50OmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGgscj0oZS5maWxlVHlwZSxqaSh0LCJzYXZlRmlsZSIpKSxpPU5pKHQsInNhdmVGaWxlIik7bmcucnVudGltZS5vcGVuRG9jdW1lbnQoVGkobiksdm9pZCAwLHIsaSl9LGNob29zZUxvY2F0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPSJ3ZWV4IiE9PWNnLm52dWVDb21waWxlcj9hYzpvYztyZXR1cm4gbi5jaG9vc2VMb2NhdGlvbi5hcHBseShuLGUpfSxnZXRMb2NhdGlvbjpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLnR5cGU7dm9pZCAwPT09biYmKG49Indnczg0Iik7dmFyIHI9ZS5nZW9jb2RlO3ZvaWQgMD09PXImJihyPSExKTt2YXIgaT1lLmFsdGl0dWRlO3ZvaWQgMD09PWkmJihpPSExKTt2YXIgbz1lLmlzSGlnaEFjY3VyYWN5O3ZvaWQgMD09PW8mJihvPSExKTt2YXIgYT1lLmhpZ2hBY2N1cmFjeUV4cGlyZVRpbWUscz1OaSh0LCJnZXRMb2NhdGlvbiIpO25nLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihmdW5jdGlvbihlKXtzYyhuLGUsdCl9LGZ1bmN0aW9uKGUpezE1MDEhPT1lLmNvZGU/cyhlKTpzYyhuLGUsdCl9LHtnZW9jb2RlOnIsZW5hYmxlSGlnaEFjY3VyYWN5Om98fGksdGltZW91dDphLGNvb3Jkc1R5cGU6bn0pfSxvcGVuTG9jYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG49IndlZXgiIT09Y2cubnZ1ZUNvbXBpbGVyP3VjOmNjO3JldHVybiBuLm9wZW5Mb2NhdGlvbi5hcHBseShuLGUpfSxzdGFydExvY2F0aW9uVXBkYXRlOmZ1bmN0aW9uKGUsbil7dmFyIHQ9ZS50eXBlO3ZvaWQgMD09PXQmJih0PSJnY2owMiIpLHBjPXBjfHxuZy5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKGZ1bmN0aW9uKHQpe2ZjPSEwLGxjLmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx0LmNvb3Jkcyl9KX0sZnVuY3Rpb24odCl7ZmN8fChmaShuLHtlcnJNc2c6InN0YXJ0TG9jYXRpb25VcGRhdGU6ZmFpbCAiK3QubWVzc2FnZX0pLGZjPSEwKSxkYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUse2Vyck1zZzoib25Mb2NhdGlvbkNoYW5nZTpmYWlsICIrdC5tZXNzYWdlfSl9KX0se2Nvb3Jkc1R5cGU6dH0pLGlnKGZ1bmN0aW9uKCl7Zmkobix7ZXJyTXNnOiJzdGFydExvY2F0aW9uVXBkYXRlOm9rIn0pfSwxMDApfSxzdG9wTG9jYXRpb25VcGRhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXBjJiYobmcuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaChwYyksZmM9ITEscGM9MCkse319LG9uTG9jYXRpb25DaGFuZ2U6ZnVuY3Rpb24oZSl7bGMucHVzaChlKX0sb2ZmTG9jYXRpb25DaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9bGMuaW5kZXhPZihlKTswPD10JiZsYy5zcGxpY2UodCwxKX1lbHNlIGxjPVtdfSxvbkxvY2F0aW9uQ2hhbmdlRXJyb3I6ZnVuY3Rpb24oZSl7ZGMucHVzaChlKX0sb2ZmTG9jYXRpb25DaGFuZ2VFcnJvcjpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1kYy5pbmRleE9mKGUpOzA8PXQmJmRjLnNwbGljZSh0LDEpfWVsc2UgZGM9W119LHN0YXJ0UmVjb3JkOmZ1bmN0aW9uKGUsdCl7aGMmJmhjLnN0b3AoKSwoaGM9bmcuYXVkaW8uZ2V0UmVjb3JkZXIoKSkucmVjb3JkKHtmaWxlbmFtZToiX2RvYy9hdWRpby8iLGZvcm1hdDoiYWFjIn0sZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJzdGFydFJlY29yZDpvayIsdGVtcEZpbGVQYXRoOmV9KX0sZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJzdGFydFJlY29yZDpmYWlsIn0pfSksdmM9aWcoZnVuY3Rpb24oKXtoYy5zdG9wKCksaGM9ITF9LDM2ZTUpfSxzdG9wUmVjb3JkOmZ1bmN0aW9uKCl7cmV0dXJuIGhjPyh2YyYmb2codmMpLGhjLnN0b3AoKSx7ZXJyTXNnOiJzdG9wUmVjb3JkOm9rIn0pOntlcnJNc2c6InN0b3BSZWNvcmQ6ZmFpbCJ9fSxwbGF5Vm9pY2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aDtpZihnYyYmbWM9PT1uJiYicGF1c2UiPT09eWMpcmV0dXJuIHljPSJwbGF5IixnYy5wbGF5KGZ1bmN0aW9uKGUpe3ljPW1jPWdjPSExLGZpKHQse2Vyck1zZzoicGxheVZvaWNlOm9rIn0pfSkse2Vyck1zZzoicGxheVZvaWNlOm9rIn07Z2MmJmdjLnN0b3AoKSxtYz1uLHljPSJwbGF5IiwoZ2M9bmcuYXVkaW8uY3JlYXRlUGxheWVyKFRpKG4pKSkucGxheShmdW5jdGlvbihlKXt5Yz1tYz1nYz0hMSxmaSh0LHtlcnJNc2c6InBsYXlWb2ljZTpvayJ9KX0pfSxwYXVzZVZvaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIGdjJiYicGxheSI9PT15YyYmKGdjLnBhdXNlKCkseWM9InBhdXNlIikse2Vyck1zZzoicGF1c2VWb2ljZTpvayJ9fSxzdG9wVm9pY2U6ZnVuY3Rpb24oKXtyZXR1cm4gZ2MmJihnYy5zdG9wKCkseWM9bWM9Z2M9ITEpLHtlcnJNc2c6InN0b3BWb2ljZTpvayJ9fSxjaG9vc2VJbWFnZTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmNvdW50LHI9ZS5zaXplVHlwZSxpPWUuc291cmNlVHlwZSxvPWUuY3JvcCxhPU5pKHQsImNob29zZUltYWdlIiwiY2FuY2VsIik7ZnVuY3Rpb24gcyhyKXt2YXIgaT1bXSxvPVtdO1Byb21pc2UuYWxsKHIubWFwKGZ1bmN0aW9uKGUpe3JldHVybiByPWUsbmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtuZy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHIsZnVuY3Rpb24oZSl7ZS5nZXRNZXRhZGF0YSh0LG4sITEpfSxuKX0pO3ZhciByfSkpLnRoZW4oZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7dmFyIG49clt0XTtvLnB1c2gobiksaS5wdXNoKHtwYXRoOm4sc2l6ZTplLnNpemV9KX0pLGZpKHQse2Vyck1zZzoiY2hvb3NlSW1hZ2U6b2siLHRlbXBGaWxlUGF0aHM6byx0ZW1wRmlsZXM6aX0pfSkuY2F0Y2goYSl9ZnVuY3Rpb24gYygpe25nLmNhbWVyYS5nZXRDYW1lcmEoKS5jYXB0dXJlSW1hZ2UoZnVuY3Rpb24oZSl7cmV0dXJuIHMoW2VdKX0sYSx7ZmlsZW5hbWU6eW8rIi9jYW1lcmEvIixyZXNvbHV0aW9uOiJoaWdoIixjcm9wOm8sc2l6ZVR5cGU6cn0pfWZ1bmN0aW9uIHUoKXtuZy5nYWxsZXJ5LnBpY2soZnVuY3Rpb24oZSl7cmV0dXJuIHMoZS5maWxlcyl9LGEse21heGltdW06bixtdWx0aXBsZTohMCxzeXN0ZW06ITEsZmlsZW5hbWU6eW8rIi9nYWxsZXJ5LyIscGVybWlzc2lvbkFsZXJ0OiEwLGNyb3A6byxzaXplVHlwZTpyfSl9aWYoMT09PWkubGVuZ3RoKXtpZihpLmluY2x1ZGVzKCJhbGJ1bSIpKXJldHVybiB2b2lkIHUoKTtpZihpLmluY2x1ZGVzKCJjYW1lcmEiKSlyZXR1cm4gdm9pZCBjKCl9bmcubmF0aXZlVUkuYWN0aW9uU2hlZXQoe2NhbmNlbDphdCgidW5pLmNob29zZUltYWdlLmNhbmNlbCIpLGJ1dHRvbnM6W3t0aXRsZTphdCgidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTphdCgidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iKX1dfSxmdW5jdGlvbihlKXtzd2l0Y2goZS5pbmRleCl7Y2FzZSAxOmMoKTticmVhaztjYXNlIDI6dSgpO2JyZWFrO2RlZmF1bHQ6YSgpfX0pfSxjaG9vc2VWaWRlbzpmdW5jdGlvbihlLHIpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnNvdXJjZVR5cGUsbj1lLmNvbXByZXNzZWQsaT1lLm1heER1cmF0aW9uLG89ZS5jYW1lcmEsYT1OaShyLCJjaG9vc2VWaWRlbyIsImNhbmNlbCIpO2Z1bmN0aW9uIHMobil7dm9pZCAwPT09biYmKG49IiIpLG5nLmlvLmdldFZpZGVvSW5mbyh7ZmlsZVBhdGg6bixzdWNjZXNzOmZ1bmN0aW9uKGUpe3ZhciB0PXtlcnJNc2c6ImNob29zZVZpZGVvOm9rIix0ZW1wRmlsZVBhdGg6bn07dC5zaXplPWUuc2l6ZSx0LmR1cmF0aW9uPWUuZHVyYXRpb24sdC53aWR0aD1lLndpZHRoLHQuaGVpZ2h0PWUuaGVpZ2h0LGZpKHIsdCl9LGZhaWw6YX0pfWZ1bmN0aW9uIGMoKXtuZy5nYWxsZXJ5LnBpY2soZnVuY3Rpb24oZSl7cmV0dXJuIHMoZS5maWxlc1swXSl9LGEse2ZpbHRlcjoidmlkZW8iLHN5c3RlbTohMSxtdWx0aXBsZTohMCxtYXhpbXVtOjEsZmlsZW5hbWU6eW8rIi9nYWxsZXJ5LyIscGVybWlzc2lvbkFsZXJ0OiEwLHZpZGVvQ29tcHJlc3M6bn0pfWZ1bmN0aW9uIHUoKXtuZy5jYW1lcmEuZ2V0Q2FtZXJhKCkuc3RhcnRWaWRlb0NhcHR1cmUocyxhLHtpbmRleDoiZnJvbnQiPT09bz8yOjEsdmlkZW9NYXhpbXVtRHVyYXRpb246aSxmaWxlbmFtZTp5bysiL2NhbWVyYS8iLHZpZGVvQ29tcHJlc3M6bn0pfWlmKDE9PT10Lmxlbmd0aCl7aWYodC5pbmNsdWRlcygiYWxidW0iKSlyZXR1cm4gdm9pZCBjKCk7aWYodC5pbmNsdWRlcygiY2FtZXJhIikpcmV0dXJuIHZvaWQgdSgpfW5nLm5hdGl2ZVVJLmFjdGlvblNoZWV0KHtjYW5jZWw6YXQoInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6YXQoInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSIpfSx7dGl0bGU6YXQoInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIil9XX0sZnVuY3Rpb24oZSl7c3dpdGNoKGUuaW5kZXgpe2Nhc2UgMTp1KCk7YnJlYWs7Y2FzZSAyOmMoKTticmVhaztkZWZhdWx0OmEoKX19KX0sY29tcHJlc3NJbWFnZTpmdW5jdGlvbihlLHQpe3ZhciBuPXlvKyIvY29tcHJlc3NlZC8iK0RhdGUubm93KCkrIl8iK0xpKGUuc3JjKSxyPU5pKHQsImNvbXByZXNzSW1hZ2UiKSxpPWUuY29tcHJlc3NlZFdpZHRoLG89ZS5jb21wcmVzc2VkSGVpZ2h0OyJudW1iZXIiPT10eXBlb2YgaSYmKGUud2lkdGg9aSsicHgiKSwibnVtYmVyIj09dHlwZW9mIG8mJihlLmhlaWdodD1vKyJweCIpLG5nLnppcC5jb21wcmVzc0ltYWdlKE9iamVjdC5hc3NpZ24oe30sZSx7ZHN0Om59KSxmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoiY29tcHJlc3NJbWFnZTpvayIsdGVtcEZpbGVQYXRoOm59KX0scil9LGNvbXByZXNzVmlkZW86ZnVuY3Rpb24oZSx0KXt2YXIgbj15bysiL2NvbXByZXNzZWQvIitEYXRlLm5vdygpKyJfIitMaShlLnNyYykscj1qaSh0LCJjb21wcmVzc1ZpZGVvIiksaT1OaSh0LCJjb21wcmVzc1ZpZGVvIik7bmcuemlwLmNvbXByZXNzVmlkZW8oT2JqZWN0LmFzc2lnbih7fSxlLHtmaWxlbmFtZTpufSkscixpKX0sZ2V0SW1hZ2VJbmZvOndjLGdldFZpZGVvSW5mbzprYyxwcmV2aWV3SW1hZ2VQbHVzOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmN1cnJlbnQ7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49ZS5iYWNrZ3JvdW5kO3ZvaWQgMD09PW4mJihuPSIjMDAwMDAwIik7dmFyIHI9ZS5pbmRpY2F0b3I7dm9pZCAwPT09ciYmKHI9Im51bWJlciIpO3ZhciBpPWUubG9vcDt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIG89ZS51cmxzLGE9ZS5sb25nUHJlc3NBY3Rpb25zO289by5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFRpKGUpfSk7dmFyIHM9TnVtYmVyKHQpO3JldHVybiB0PWlzTmFOKHMpPyh0PW8uaW5kZXhPZihUaSh0KSkpPDA/MDp0OnMsbmcubmF0aXZlVUkucHJldmlld0ltYWdlKG8se2N1cnJlbnQ6dCxiYWNrZ3JvdW5kOm4saW5kaWNhdG9yOnIsbG9vcDppLG9uTG9uZ1ByZXNzOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49IiIscj0iIixpPWEmJmEuY2FsbGJhY2tJZDtpPyhlPWEuaXRlbUxpc3Q/YS5pdGVtTGlzdDpbXSxuPWEuaXRlbUNvbG9yP2EuaXRlbUNvbG9yOiIjMDAwMDAwIixyPWEudGl0bGU/YS50aXRsZToiIik6KGU9W2F0KCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIildLG49IiMwMDAwMDAiLHI9IiIpO3ZhciBvPXtidXR0b25zOmUubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt0aXRsZTplLGNvbG9yOm59fSksY2FuY2VsOmF0KCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCIpfTtyJiYoby50aXRsZT1yKSxuZy5uYXRpdmVVSS5hY3Rpb25TaGVldChvLGZ1bmN0aW9uKGUpe2lmKDA8ZS5pbmRleCl7aWYoaSlyZXR1cm4gdm9pZCBoaShhLmNhbGxiYWNrSWQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0Om9rIix0YXBJbmRleDplLmluZGV4LTEsaW5kZXg6dC5pbmRleH0pO25nLmdhbGxlcnkuc2F2ZSh0LnVybCxmdW5jdGlvbihlKXtuZy5uYXRpdmVVSS50b2FzdChhdCgidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiKSl9LGZ1bmN0aW9uKCl7bmcubmF0aXZlVUkudG9hc3QoYXQoInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIikpfSl9ZWxzZSBpJiZoaShhLmNhbGxiYWNrSWQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIn0pfSl9fSkse2Vyck1zZzoicHJldmlld0ltYWdlOm9rIn19LGNsb3NlUHJldmlld0ltYWdlUGx1czpmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmcubmF0aXZlVUkuY2xvc2VQcmV2aWV3SW1hZ2UoKSx7ZXJyTXNnOiJjbG9zZVByZXZpZXdJbWFnZVBsdXM6b2sifX1jYXRjaChlKXtyZXR1cm57ZXJyTXNnOiJjbG9zZVByZXZpZXdJbWFnZVBsdXM6ZmFpbCJ9fX0sb3BlcmF0ZVJlY29yZGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5vcGVyYXRpb25UeXBlLHI9e307Zm9yKHZhciBpIGluIGUpLTE9PT1bIm9wZXJhdGlvblR5cGUiXS5pbmRleE9mKGkpJiYocltpXT1lW2ldKTt2YXIgbz1yO3JldHVybiB4Y1tuXShvKSx7ZXJyTXNnOiJvcGVyYXRlUmVjb3JkZXI6b2sifX0sc2F2ZUltYWdlVG9QaG90b3NBbGJ1bTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9amkodCwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIpLGk9TmkodCwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIpO25nLmdhbGxlcnkuc2F2ZShUaShuKSxyLGkpfSxzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGg7bmcuZ2FsbGVyeS5zYXZlKFRpKG4pLGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoic2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpvayJ9KX0sZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtOmZhaWwifSl9KX0sb3BlcmF0ZURvd25sb2FkVGFzazpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5kb3dubG9hZFRhc2tJZCxuPWUub3BlcmF0aW9uVHlwZSxyPVRjW3RdO3JldHVybiByJiYiYWJvcnQiPT09bj8oZGVsZXRlIFRjW3RdLHIuYWJvcnQoKSxPYyh7ZG93bmxvYWRUYXNrSWQ6dCxzdGF0ZToiZmFpbCIsZXJyTXNnOiJhYm9ydCJ9KSx7ZXJyTXNnOiJvcGVyYXRlRG93bmxvYWRUYXNrOm9rIn0pOntlcnJNc2c6Im9wZXJhdGVEb3dubG9hZFRhc2s6ZmFpbCJ9fSxjcmVhdGVEb3dubG9hZFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXJsLHI9ZS5oZWFkZXIsaT1lLnRpbWVvdXQ7aT0oaXx8Y2cubmV0d29ya1RpbWVvdXQmJmNnLm5ldHdvcmtUaW1lb3V0LnJlcXVlc3R8fDZlNCkvMWUzO3ZhciBvPW5nLmRvd25sb2FkZXIuY3JlYXRlRG93bmxvYWQodCx7dGltZW91dDppLGZpbGVuYW1lOnlvKyIvZG93bmxvYWQvIixyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sZnVuY3Rpb24oZSx0KXtPYyh0P3tkb3dubG9hZFRhc2tJZDpuLHN0YXRlOiJzdWNjZXNzIix0ZW1wRmlsZVBhdGg6ZS5maWxlbmFtZSxzdGF0dXNDb2RlOnR9Ontkb3dubG9hZFRhc2tJZDpuLHN0YXRlOiJmYWlsIixzdGF0dXNDb2RlOnR9KX0pO2Zvcih2YXIgYSBpbiByKWsocixhKSYmby5zZXRSZXF1ZXN0SGVhZGVyKGEsclthXSk7cmV0dXJuIG8uYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIixmdW5jdGlvbihlLHQpe2UuZG93bmxvYWRlZFNpemUmJmUudG90YWxTaXplJiZPYyh7ZG93bmxvYWRUYXNrSWQ6bixzdGF0ZToicHJvZ3Jlc3NVcGRhdGUiLHByb2dyZXNzOnBhcnNlSW50KGUuZG93bmxvYWRlZFNpemUvZS50b3RhbFNpemUqMTAwKSx0b3RhbEJ5dGVzV3JpdHRlbjplLmRvd25sb2FkZWRTaXplLHRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGU6ZS50b3RhbFNpemV9KX0pLChUY1tuXT1vKS5zdGFydCgpLHtkb3dubG9hZFRhc2tJZDpuLGVyck1zZzoiY3JlYXRlRG93bmxvYWRUYXNrOm9rIn19KCsrQ2MsZSl9LGNyZWF0ZVJlcXVlc3RUYXNrQnlJZDpQYyxjcmVhdGVSZXF1ZXN0VGFzazpmdW5jdGlvbihlKXtyZXR1cm4gUGMoKytFYyxlKX0sb3BlcmF0ZVJlcXVlc3RUYXNrOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnJlcXVlc3RUYXNrSWQsbj1lLm9wZXJhdGlvblR5cGUscj1JY1t0XTtyZXR1cm4gciYmImFib3J0Ij09PW4/KHIuYWJvcnQoKSx7ZXJyTXNnOiJvcGVyYXRlUmVxdWVzdFRhc2s6b2sifSk6e2Vyck1zZzoib3BlcmF0ZVJlcXVlc3RUYXNrOmZhaWwifX0sY29uZmlnTVRMUzpmdW5jdGlvbihlLGkpe3ZhciB0PWUuY2VydGlmaWNhdGVzO3BpKCJzdHJlYW0iKS5jb25maWdNVExTKHQsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49ZS5jb2RlLHI9ZS5tZXNzYWdlO3N3aXRjaCh0KXtjYXNlInN1Y2Nlc3MiOmZpKGkse2Vyck1zZzoiY29uZmlnTVRMUzpvayIsY29kZTpufSk7YnJlYWs7Y2FzZSJmYWlsIjpmaShpLHtlcnJNc2c6ImNvbmZpZ01UTFM6ZmFpbCAiK3IsY29kZTpufSl9fSl9LGNyZWF0ZVNvY2tldFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIEJjKFN0cmluZyhEYXRlLm5vdygpKSxlKX0sb3BlcmF0ZVNvY2tldFRhc2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSxuPXQub3BlcmF0aW9uVHlwZSxyPXQuY29kZSxpPXQucmVhc29uLG89dC5kYXRhLGE9dC5zb2NrZXRUYXNrSWQscz1qY1thXTtpZighcylyZXR1cm57ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpmYWlsIn07c3dpdGNoKG4pe2Nhc2Uic2VuZCI6cmV0dXJuIG8mJnMuc2VuZCh7aWQ6YSxkYXRhOiJvYmplY3QiPT10eXBlb2Ygbz97IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6Ymkobyl9Om99KSx7ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpvayJ9O2Nhc2UiY2xvc2UiOnJldHVybiBzLmNsb3NlKHtpZDphLGNvZGU6cixyZWFzb246aX0pLGRlbGV0ZSBqY1thXSx7ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpvayJ9fXJldHVybntlcnJNc2c6Im9wZXJhdGVTb2NrZXRUYXNrOmZhaWwifX0sb3BlcmF0ZVVwbG9hZFRhc2s6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXBsb2FkVGFza0lkLG49ZS5vcGVyYXRpb25UeXBlLHI9RGNbdF07cmV0dXJuIHImJiJhYm9ydCI9PT1uPyhkZWxldGUgRGNbdF0sci5hYm9ydCgpLFJjKHt1cGxvYWRUYXNrSWQ6dCxzdGF0ZToiZmFpbCIsZXJyTXNnOiJhYm9ydCJ9KSx7ZXJyTXNnOiJvcGVyYXRlVXBsb2FkVGFzazpvayJ9KTp7ZXJyTXNnOiJvcGVyYXRlVXBsb2FkVGFzazpmYWlsIn19LGNyZWF0ZVVwbG9hZFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXJsLHI9ZS5maWxlUGF0aCxpPWUubmFtZSxvPWUuZmlsZXMsYT1lLmhlYWRlcixzPWUuZm9ybURhdGEsYz1lLnRpbWVvdXQ7Yz0oY3x8Y2cubmV0d29ya1RpbWVvdXQmJmNnLm5ldHdvcmtUaW1lb3V0LnVwbG9hZEZpbGV8fDZlNCkvMWUzO3ZhciB1PW5nLnVwbG9hZGVyLmNyZWF0ZVVwbG9hZCh0LHt0aW1lb3V0OmMscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LGZ1bmN0aW9uKGUsdCl7UmModD97dXBsb2FkVGFza0lkOm4sc3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZS5yZXNwb25zZVRleHQsc3RhdHVzQ29kZTp0fTp7dXBsb2FkVGFza0lkOm4sc3RhdGU6ImZhaWwiLGRhdGE6IiIsc3RhdHVzQ29kZTp0fSksZGVsZXRlIERjW25dfSk7Zm9yKHZhciBsIGluIGEpayhhLGwpJiZ1LnNldFJlcXVlc3RIZWFkZXIobCxTdHJpbmcoYVtsXSkpO2Zvcih2YXIgZCBpbiBzKWsocyxkKSYmdS5hZGREYXRhKGQsU3RyaW5nKHNbZF0pKTtyZXR1cm4gbyYmby5sZW5ndGg/by5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UuYWRkRmlsZShUaShlLnVyaXx8ZS5maWxlUGF0aCkse2tleTplLm5hbWV8fCJmaWxlIn0pfSk6dS5hZGRGaWxlKFRpKHIpLHtrZXk6aX0pLHUuYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIixmdW5jdGlvbihlLHQpe2UudXBsb2FkZWRTaXplJiZlLnRvdGFsU2l6ZSYmUmMoe3VwbG9hZFRhc2tJZDpuLHN0YXRlOiJwcm9ncmVzc1VwZGF0ZSIscHJvZ3Jlc3M6cGFyc2VJbnQoZS51cGxvYWRlZFNpemUvZS50b3RhbFNpemUqMTAwKSx0b3RhbEJ5dGVzU2VudDplLnVwbG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQ6ZS50b3RhbFNpemV9KX0pLChEY1tuXT11KS5zdGFydCgpLHt1cGxvYWRUYXNrSWQ6bixlcnJNc2c6ImNyZWF0ZVVwbG9hZFRhc2s6b2sifX0oKytMYyxlKX0sZ2V0UHJvdmlkZXI6ZnVuY3Rpb24oZSxyKXt2YXIgaT1lLnNlcnZpY2U7VWNbaV0/VWNbaV0oZnVuY3Rpb24oZSx0LG4pe2ZpKHIsZT97ZXJyTXNnOiJnZXRQcm92aWRlcjpmYWlsICIrZS5tZXNzYWdlfTp7ZXJyTXNnOiJnZXRQcm92aWRlcjpvayIsc2VydmljZTppLHByb3ZpZGVyOnQscHJvdmlkZXJzOm4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGUuc2VydmljZVJlYWR5JiYoZS5pc0FwcEV4aXN0PWUuc2VydmljZVJlYWR5KSwiYm9vbGVhbiI9PXR5cGVvZiBlLm5hdGl2ZUNsaWVudCYmKGUuaXNBcHBFeGlzdD1lLm5hdGl2ZUNsaWVudCksZX0pfSl9KTpmaShyLHtlcnJNc2c6ImdldFByb3ZpZGVyOmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LGxvZ2luOlZjLGdldFVzZXJJbmZvOnFjLGdldFVzZXJQcm9maWxlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHFjKGUsdCl9LG9wZXJhdGVXWERhdGE6ZnVuY3Rpb24oZSx0KXtzd2l0Y2goZS5kYXRhLmFwaV9uYW1lKXtjYXNlIndlYmFwaV9nZXR1c2VyaW5mbyI6cWMoZSx0KTticmVhaztkZWZhdWx0OnJldHVybntlcnJNc2c6Im9wZXJhdGVXWERhdGE6ZmFpbCJ9fX0scHJlTG9naW46V2MsY2xvc2VBdXRoVmlldzpIYyxnZXRDaGVja0JveFN0YXRlOkdjLGdldFVuaXZlcmlmeU1hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gRmN8fChGYz1uZXcgWGMpfSxyZXF1ZXN0UGF5bWVudDpmdW5jdGlvbihuLHIpe3ZhciBpPW4ucHJvdmlkZXIsbz1OaShyLCJyZXF1ZXN0UGF5bWVudCIpO25nLnBheW1lbnQuZ2V0Q2hhbm5lbHMoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkPT09aX0pO3Q/bmcucGF5bWVudC5yZXF1ZXN0KHQsbi5vcmRlckluZm8sZnVuY3Rpb24oZSl7ZS5lcnJNc2c9InJlcXVlc3RQYXltZW50Om9rIixmaShyLGUpfSxvKTpmaShyLHtlcnJNc2c6InJlcXVlc3RQYXltZW50OmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LG8pfSxzdWJzY3JpYmVQdXNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmcucHVzaC5nZXRDbGllbnRJbmZvKCk7cmV0dXJuIG4/KFpjfHwoWmM9ITAsbmcucHVzaC5hZGRFdmVudExpc3RlbmVyKCJyZWNlaXZlIixmdW5jdGlvbihlKXtKYyYmIVFjJiZoaSgib25QdXNoTWVzc2FnZSIse21lc3NhZ2VJZDplLl9fVVVJRF9fLGRhdGE6ZS5wYXlsb2FkLGVyck1zZzoib25QdXNoOm9rIn0pfSkpLFFjPSExLG4uZXJyTXNnPSJzdWJzY3JpYmVQdXNoOm9rIixuKTp7ZXJyTXNnOiJzdWJzY3JpYmVQdXNoOmZhaWwg6K+356Gu5L+d5b2T5YmN6L+Q6KGM546v5aKD5bey5YyF5ZCrIHB1c2gg5qih5Z2XIn19LHVuc3Vic2NyaWJlUHVzaDpmdW5jdGlvbihlKXtyZXR1cm4gUWM9ITAse2Vyck1zZzoidW5zdWJzY3JpYmVQdXNoOm9rIn19LG9uUHVzaDpmdW5jdGlvbigpe3JldHVybiBaYz9uZy5wdXNoLmdldENsaWVudEluZm8oKT8oSmM9ITAse2Vyck1zZzoib25QdXNoOm9rIn0pOntlcnJNc2c6Im9uUHVzaDpmYWlsIOivt+ehruS/neW9k+WJjei/kOihjOeOr+Wig+W3suWMheWQqyBwdXNoIOaooeWdlyJ9OntlcnJNc2c6Im9uUHVzaDpmYWlsIOivt+WFiOiwg+eUqCB1bmkuc3Vic2NyaWJlUHVzaCJ9fSxvZmZQdXNoOmZ1bmN0aW9uKGUpe3JldHVybiBKYz0hMSx7ZXJyTXNnOiJvZmZQdXNoOm9rIn19LGNyZWF0ZVB1c2hNZXNzYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49WnMoKTtpZigiYXV0aG9yaXplZCIhPT1uLm5vdGlmaWNhdGlvbkF1dGhvcml6ZWQpcmV0dXJuIGZpKHQse2Vyck1zZzoiY3JlYXRlUHVzaE1lc3NhZ2U6ZmFpbCBub3RpZmljYXRpb25BdXRob3JpemVkOiAiK24ubm90aWZpY2F0aW9uQXV0aG9yaXplZH0pO3ZhciByPU9iamVjdC5hc3NpZ24oe30sZSk7ZGVsZXRlIHIuY29udGVudCxkZWxldGUgci5wYXlsb2FkLG5nLnB1c2guY3JlYXRlTWVzc2FnZShlLmNvbnRlbnQsZS5wYXlsb2FkLHIpLGZpKHQse2Vyck1zZzoiY3JlYXRlUHVzaE1lc3NhZ2U6b2sifSl9LHJlcXVpcmVOYXRpdmVQbHVnaW46ZXUsc2hhcmVBcHBNZXNzYWdlRGlyZWN0bHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRpdGxlLHI9ZS5wYXRoLGk9ZS5pbWFnZVVybCxvPWUudXNlRGVmYXVsdFNuYXBzaG90O249bnx8Y2cuYXBwbmFtZTt2YXIgYT1mdW5jdGlvbigpe2l1KHtwcm92aWRlcjoid2VpeGluIix0eXBlOjAsdGl0bGU6bixpbWFnZVVybDppLGhyZWY6cixzY2VuZToiV1hTY2VuZVNlc3Npb24ifSx0LCJzaGFyZUFwcE1lc3NhZ2VEaXJlY3RseSIpfSxzPU5pKHQsInNoYXJlQXBwTWVzc2FnZURpcmVjdGx5Iik7aWYobyl7dmFyIGM9ZmcoKSx1PW5nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoY1tjLmxlbmd0aC0xXS5fX3d4V2Vidmlld0lkX18rIiIpO2lmKHUpe3ZhciBsPW5ldyBuZy5uYXRpdmVPYmouQml0bWFwO3UuZHJhdyhsLGZ1bmN0aW9uKCl7dmFyIGU9eW8rIi9zaGFyZS9zbmFwc2hvdC5qcGciO2wuc2F2ZShlLHtvdmVyd3JpdGU6ITAsZm9ybWF0OiJqcGcifSxmdW5jdGlvbigpe2k9ZSxhKCl9LHMpfSxzKX1lbHNlIGEoKX1lbHNlIGEoKX0sc2hhcmU6aXUsc2hhcmVXaXRoU3lzdGVtOmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj0ic2hhcmVXaXRoU3lzdGVtIik7dmFyIHI9ZS50eXBlLGk9ZS5pbWFnZVVybCxvPWUuc3VtbWFyeSxhPWUuaHJlZjtyPXJ8fCJ0ZXh0Ijt2YXIgcz1OaSh0LG4pO1sidGV4dCIsImltYWdlIl0uaW5kZXhPZihyKTwwJiZmaSh0LHtlcnJNc2c6bisiOmZhaWwg5YiG5Lqr5Y+C5pWwIHR5cGUg5LiN5q2j56GuIn0pLCJzdHJpbmciPT10eXBlb2YgaSYmaSYmKGk9VGkoaSkpLG5nLnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOnIscGljdHVyZXM6aSYmW2ldLGNvbnRlbnQ6byxocmVmOmF9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzpuKyI6b2sifSl9LHMpfSxyZXN0b3JlR2xvYmFsOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgYTtuZyE9PXQmJih0Zz1lLGE9KG5nPXQpLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSx2aT1hLG5nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1naSxpZz1uLG9nPXIsYWc9aSxzZz1vKSxjZy5zZXJ2aWNlUmVhZHk9ITB9LHJlcXVpcmVHbG9iYWw6ZnVuY3Rpb24oKXtmb3IodmFyIGU9WyJBcnJheUJ1ZmZlciIsIkludDhBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkJpZ0ludDY0QXJyYXkiLCJCaWdVaW50NjRBcnJheSJdLHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fSxnZXRTdWJOVnVlQnlJZDphdSxnZXRDdXJyZW50U3ViTlZ1ZTpmdW5jdGlvbigpe3JldHVybiBhdShuZy53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWQpfSxvbkhvc3RFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7c3UucHVzaChlKX0sb25OYXRpdmVFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7c3UucHVzaChlKX0sc2VuZE5hdGl2ZUV2ZW50OmN1LGxvYWRTdWJQYWNrYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUucm9vdDtpZigtMSE9PWJzLmluZGV4T2YoaSkpcmV0dXJue2Vyck1zZzoibG9hZFN1YlBhY2thZ2U6b2sifTticy5wdXNoKGkpLG49aSsiL2FwcC1zdWItc2VydmljZS5qcyIscj1mdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6ImxvYWRTdWJQYWNrYWdlOm9rIn0pfSxjZy5vblNlcnZpY2VSZWFkeShmdW5jdGlvbigpe3RnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5ldmFsSlNGaWxlcyhbbl0scil9KX0sc2VuZEhvc3RFdmVudDp1dSxuYXZpZ2F0ZVRvTWluaVByb2dyYW06ZnVuY3Rpb24oZSx0KXt1dSgibmF2aWdhdGVUb1VuaU1QIixlLGZ1bmN0aW9uKGUpe2lmKGUuZXJyTXNnJiYtMT09PWUuZXJyTXNnLmluZGV4T2YoIjpvayIpKXJldHVybiBmaSh0LHtlcnJNc2c6ZS5lcnJNc2d9KTtmaSh0LHtlcnJNc2c6Im5hdmlnYXRlVG9NaW5pUHJvZ3JhbTpvayJ9KX0pfSxnZXRMYXVuY2hPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBUc30sZ2V0RW50ZXJPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBPcygpfSxuYXZpZ2F0ZUJhY2s6RXUsbmF2aWdhdGVUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5ldmVudHMsaT1lLm9wZW5UeXBlLG89ZS5hbmltYXRpb25UeXBlLGE9ZS5hbmltYXRpb25EdXJhdGlvbixzPW4uc3BsaXQoIj8iKSxjPXNbMF0sdT11Zy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1jfSkud2luZG93LGw9Y2cud2luZG93fHx7fTtvfHwobz11LmFuaW1hdGlvblR5cGV8fGwuYW5pbWF0aW9uVHlwZXx8dGEpLGF8fChhPXUuYW5pbWF0aW9uRHVyYXRpb258fGwuYW5pbWF0aW9uRHVyYXRpb258fG5hKTt2YXIgZD1FKHNbMV18fCIiKTt2cyhjLGZ1bmN0aW9uKCl7JHUoe3VybDpuLHBhdGg6YyxxdWVyeTpkLGV2ZW50czpyLGFuaW1hdGlvblR5cGU6byxhbmltYXRpb25EdXJhdGlvbjphfSx0KX0sImFwcExhdW5jaCI9PT1pKX0scmVMYXVuY2g6ZnVuY3Rpb24oZSxhKXt2YXIgcz1lLnVybCx0PXMuc3BsaXQoIj8iKSxjPXRbMF0sdT1FKHRbMV18fCIiKTt2cyhjLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvO3Q9YSxuPShlPXt1cmw6cyxwYXRoOmMscXVlcnk6dX0pLnVybCxyPWUucGF0aCxpPWUucXVlcnksbz1mZyghMCkuc2xpY2UoMCksdWcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09cn0pLm1ldGEuaXNUYWJCYXImJnFzLnN3aXRjaFRhYihyLnNsaWNlKDEpKSxDdShqcyh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6InJlTGF1bmNoIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuJHJlbW92ZSgpLHh1KGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSksZmkodCx7ZXJyTXNnOiJyZUxhdW5jaDpvayJ9KX0pLG1pKCl9KX0scmVkaXJlY3RUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5leGlzdHMsaT1uLnNwbGl0KCI/Iiksbz1pWzBdLGE9RShpWzFdfHwiIik7dnMobyxmdW5jdGlvbigpe011KHt1cmw6bixwYXRoOm8scXVlcnk6YSxleGlzdHM6cn0sdCl9KX0sc3dpdGNoVGFiOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51cmwscj1lLmZyb20saT1lLm9wZW5UeXBlLG89bi5zcGxpdCgiPyIpLGE9b1swXSxzPUUob1sxXXx8IiIpO3ZzKGEsZnVuY3Rpb24oKXshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnVybCxyPWUucGF0aCxpPWUucXVlcnk7ZS5mcm9tLHFzLnN3aXRjaFRhYihyLnNsaWNlKDEpKTt2YXIgbyxhLHM9ZmcoKSxjPXMubGVuZ3RoLHU9ITEsbD0hMTtpZigxPD1jJiYoKG89c1tjLTFdKS4kcGFnZS5tZXRhLmlzVGFiQmFyP3U9ITA6KGw9ITAscy5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihlKXtlLiRwYWdlLm1ldGEuaXNUYWJCYXJ8fGU9PT1vfHwoZS4kcmVtb3ZlKCkseHUoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIikpfSksby4kcmVtb3ZlKCksaWcoZnVuY3Rpb24oKXsicmVkaXJlY3QiPT09by4kcGFnZS5vcGVuVHlwZT94dShvLiRnZXRBcHBXZWJ2aWV3KCkscmEsbmEpOnh1KG8uJGdldEFwcFdlYnZpZXcoKSwiYXV0byIpfSwxMDApKSksZmcoITApLmZvckVhY2goZnVuY3Rpb24oZSl7Ii8iK2Uucm91dGU9PT1yPyhlLiRwYWdlLm1ldGEudmlzaWJsZXx8KGw9ITApLGUuJHBhZ2UubWV0YS52aXNpYmxlPSEwLGE9ZSk6ZS4kcGFnZS5tZXRhLmlzVGFiQmFyJiYoZS4kcGFnZS5tZXRhLnZpc2libGU9ITEpfSksbz09PWEmJih1PSExKSxvJiZ1JiZvLiR2bS5fX2NhbGxfaG9vaygib25IaWRlIiksIWEpcmV0dXJuIEN1KGpzKHt1cmw6bixwYXRoOnIscXVlcnk6aSxvcGVuVHlwZToic3dpdGNoVGFiIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7bWkoKSxmaSh0LHtlcnJNc2c6InN3aXRjaFRhYjpvayJ9KX0sNzApO3ZhciBkPWEuJGdldEFwcFdlYnZpZXcoKTtkLnNob3coIm5vbmUiKSxsJiYhZC5fX3ByZWxvYWRfXyYmYS4kdm0uX19jYWxsX2hvb2soIm9uU2hvdyIpLG1pKCksZmkodCx7ZXJyTXNnOiJzd2l0Y2hUYWI6b2sifSl9KHt1cmw6bixwYXRoOmEscXVlcnk6cyxmcm9tOnJ9LHQpfSwiYXBwTGF1bmNoIj09PWkpfSx1blByZWxvYWRQYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLnVybCxpPSgobj1Nc1t0PXJdKSYmKG4uX19wYWdlX18mJlBzKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bi5fX3BhZ2VfX30pP24uX19wcmVsb2FkX189ITE6bi5jbG9zZSgibm9uZSIpLGRlbGV0ZSBNc1t0XSksbik7cmV0dXJuIGk/e2lkOmkuaWQsdXJsOnIsZXJyTXNnOiJ1blByZWxvYWRQYWdlOm9rIn06e3VybDpyLGVyck1zZzoidW5QcmVsb2FkUGFnZTpmYWlsIG5vdCBmb3VuZCJ9fSxwcmVsb2FkUGFnZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9bi5zcGxpdCgiPyIpO2ZpKHQse2lkOmZ1bmN0aW9uKGUpe3ZhciB0PWUudXJsLG49ZS5wYXRoLHI9ZS5xdWVyeTtpZighTXNbdF0pe3ZhciBpPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodWcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09bn0pKSk7TXNbdF09dXMobixpLHIse19fcHJlbG9hZF9fOiEwLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeShyKX0pfXJldHVybiBNc1t0XX0oe3VybDpuLHBhdGg6clswXSxxdWVyeTpFKHJbMV18fCIiKX0pLmlkLHVybDpuLGVyck1zZzoicHJlbG9hZFBhZ2U6b2sifSl9LHNldFN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5rZXkscj1lLmRhdGEsaT0oZS5pc1N5bmMsdHlwZW9mIHIpLG89InN0cmluZyI9PT1pP3I6SlNPTi5zdHJpbmdpZnkoe3R5cGU6aSxkYXRhOnJ9KTt0cnl7InN0cmluZyI9PT1pJiZ2b2lkIDAhPT1SdShvKT9uZy5zdG9yYWdlLnNldEl0ZW1Bc3luYyhuK0x1LGksZnVuY3Rpb24oKXt9KTpuZy5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuK0x1LGZ1bmN0aW9uKCl7fSksbmcuc3RvcmFnZS5zZXRJdGVtQXN5bmMobixvLGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOm9rIn0pfSxmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6InNldFN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9Y2F0Y2goZSl7ZmkodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOmZhaWwgIitlfSl9fSxzZXRTdG9yYWdlU3luYzpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiB0LHI9InN0cmluZyI9PT1uP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6bixkYXRhOnR9KTt0cnl7InN0cmluZyI9PT1uJiZ2b2lkIDAhPT1SdShyKT9uZy5zdG9yYWdlLnNldEl0ZW0oZStMdSxuKTpuZy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStMdSksbmcuc3RvcmFnZS5zZXRJdGVtKGUscil9Y2F0Y2goZSl7fX0sZ2V0U3RvcmFnZTpmdW5jdGlvbihlLHIpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmtleTtuZy5zdG9yYWdlLmdldEl0ZW1Bc3luYyh0LGZ1bmN0aW9uKG4pe25nLnN0b3JhZ2UuZ2V0SXRlbUFzeW5jKHQrTHUsZnVuY3Rpb24oZSl7dmFyIHQ9KGUuZGF0YXx8IiIpLnRvTG93ZXJDYXNlKCk7Zmkocix7ZGF0YTpGdSh0LG4uZGF0YSksZXJyTXNnOiJnZXRTdG9yYWdlOm9rIn0pfSxmdW5jdGlvbigpe2ZpKHIse2RhdGE6RnUoIiIsbi5kYXRhKSxlcnJNc2c6ImdldFN0b3JhZ2U6b2sifSl9KX0sZnVuY3Rpb24oZSl7Zmkocix7ZGF0YToiIixlcnJNc2c6ImdldFN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9LGdldFN0b3JhZ2VTeW5jOmZ1bmN0aW9uKGUpe3ZhciB0PW5nLnN0b3JhZ2UuZ2V0SXRlbShlKSxuPShuZy5zdG9yYWdlLmdldEl0ZW0oZStMdSl8fCIiKS50b0xvd2VyQ2FzZSgpO3JldHVybiJzdHJpbmciIT10eXBlb2YgdD8iIjpGdShuLHQpfSxyZW1vdmVTdG9yYWdlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUua2V5O25nLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKG4rTHUsZnVuY3Rpb24oKXt9KSxuZy5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuLGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoicmVtb3ZlU3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJyZW1vdmVTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxyZW1vdmVTdG9yYWdlU3luYzpmdW5jdGlvbihlKXtuZy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStMdSksbmcuc3RvcmFnZS5yZW1vdmVJdGVtKGUpfSxjbGVhclN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXtuZy5zdG9yYWdlLmNsZWFyQXN5bmMoZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJjbGVhclN0b3JhZ2U6b2sifSl9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoiY2xlYXJTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxjbGVhclN0b3JhZ2VTeW5jOmZ1bmN0aW9uKCl7bmcuc3RvcmFnZS5jbGVhcigpfSxnZXRTdG9yYWdlSW5mbzpVdSxnZXRTdG9yYWdlSW5mb1N5bmM6ZnVuY3Rpb24oKXt2YXIgZT1VdSgpO3JldHVybiBkZWxldGUgZS5lcnJNc2csZX0sc2hvd0tleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIG5nLmtleS5zaG93U29mdEtleWJvcmQoKSx7ZXJyTXNnOiJzaG93S2V5Ym9hcmQ6b2sifX0saGlkZUtleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIG5nLmtleS5oaWRlU29mdEtleWJvcmQoKSx7ZXJyTXNnOiJoaWRlS2V5Ym9hcmQ6b2sifX0sc2V0TmF2aWdhdGlvbkJhclRpdGxlOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLl9fcGFnZV9fLG49ZS50aXRsZTt2b2lkIDA9PT1uJiYobj0iIik7dmFyIHI9a2kodCk7aWYocil7dmFyIGk9ci5nZXRTdHlsZSgpO3JldHVybiBpJiZpLnRpdGxlTlZpZXcmJnIuc2V0U3R5bGUoe3RpdGxlTlZpZXc6e3RpdGxlVGV4dDpufX0pLHtlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpvayJ9fXJldHVybntlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpmYWlsIn19LHNob3dOYXZpZ2F0aW9uQmFyTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiBuZy5uYXRpdmVVSS5zaG93V2FpdGluZygiIix7bW9kYWw6ITF9KSx7ZXJyTXNnOiJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmc6b2sifX0saGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIG5nLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHtlcnJNc2c6ImhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzpvayJ9fSxzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LG4scj1lLl9fcGFnZV9fLGk9ZS5mcm9udENvbG9yLG89ZS5iYWNrZ3JvdW5kQ29sb3IsYT1raShyKTtpZihhKXt2YXIgcz17fTtpJiYocy50aXRsZUNvbG9yPWkpLG8mJihzLmJhY2tncm91bmRDb2xvcj1vKTt2YXIgYz0iIzAwMDAwMCI9PT1pPyJkYXJrIjoibGlnaHQiO25nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShjKSx0PWMsKG49ZmcoKSkubGVuZ3RoJiYobltuLmxlbmd0aC0xXS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlPXQpO3ZhciB1PWEuZ2V0U3R5bGUoKTtyZXR1cm4gdSYmdS50aXRsZU5WaWV3JiYodS50aXRsZU5WaWV3LmF1dG9CYWNrQnV0dG9uJiYocy5iYWNrQnV0dG9uPXMuYmFja0J1dHRvbnx8e30scy5iYWNrQnV0dG9uLmNvbG9yPWkpLGEuc2V0U3R5bGUoe3RpdGxlTlZpZXc6c30pKSx7ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6b2sifX1yZXR1cm57ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZmFpbCJ9fSxzaG93TG9hZGluZzpmdW5jdGlvbihlKXtyZXR1cm4gd2koenUsT2JqZWN0LmFzc2lnbih7fSxlLHt0eXBlOiJsb2FkaW5nIn0pLCJzaG93VG9hc3QiLCJzaG93TG9hZGluZyIpfSxoaWRlTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiB3aShWdSwibG9hZGluZyIsImhpZGUiLCJoaWRlTG9hZGluZyIpfSxzaG93VG9hc3Q6enUsaGlkZVRvYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHdpKFZ1LCJ0b2FzdCIsImhpZGUiLCJoaWRlVG9hc3QiKX0saGlkZTpWdSxzaG93TW9kYWw6ZnVuY3Rpb24oZSxpKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS50aXRsZTt2b2lkIDA9PT10JiYodD0iIik7dmFyIG49ZS5jb250ZW50O3ZvaWQgMD09PW4mJihuPSIiKTt2YXIgbz1lLnNob3dDYW5jZWw7dm9pZCAwPT09byYmKG89ITApO3ZhciByPWUuY2FuY2VsVGV4dCxhPShlLmNhbmNlbENvbG9yLGUuY29uZmlybVRleHQpLHM9KGUuY29uZmlybUNvbG9yLGUuZWRpdGFibGUpO3ZvaWQgMD09PXMmJihzPSExKTt2YXIgYz1lLnBsYWNlaG9sZGVyVGV4dDt2b2lkIDA9PT1jJiYoYz0iIik7dmFyIHU9bz9bcixhXTpbYV0sbD1zP2M6dTtuPW58fCIgIixuZy5uYXRpdmVVSVtzPyJwcm9tcHQiOiJjb25maXJtIl0obixmdW5jdGlvbihlKXtpZihvKXt2YXIgdD0xPT09ZS5pbmRleCxuPXtlcnJNc2c6InNob3dNb2RhbDpvayIsY29uZmlybTp0LGNhbmNlbDowPT09ZS5pbmRleHx8LTE9PT1lLmluZGV4fTt0JiZzJiYobi5jb250ZW50PWUudmFsdWUpLGZpKGksbil9ZWxzZXt2YXIgcj17ZXJyTXNnOiJzaG93TW9kYWw6b2siLGNvbmZpcm06MD09PWUuaW5kZXgsY2FuY2VsOiExfTtzJiYoci5jb250ZW50PWUudmFsdWUpLGZpKGkscil9fSx0LGwsdSl9LHNob3dBY3Rpb25TaGVldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuaXRlbUxpc3Q7dm9pZCAwPT09biYmKG49W10pO3ZhciByPWUuaXRlbUNvbG9yLGk9ZS50aXRsZTt2b2lkIDA9PT1pJiYoaT0iIik7dmFyIG89ZS5wb3BvdmVyOyIjMDAwIj09PXImJmNnLmRhcmttb2RlJiYocj1XdVtuZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpXS5pdGVtQ29sb3IpO3ZhciBhPXtidXR0b25zOm4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt0aXRsZTplLGNvbG9yOnJ9fSl9O2kmJihhLnRpdGxlPWkpLGEuY2FuY2VsPWF0KCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCIpLG5nLm5hdGl2ZVVJLmFjdGlvblNoZWV0KE9iamVjdC5hc3NpZ24oYSx7cG9wb3ZlcjpvfSksZnVuY3Rpb24oZSl7MDxlLmluZGV4P2ZpKHQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0Om9rIix0YXBJbmRleDplLmluZGV4LTF9KTpmaSh0LHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCJ9KX0pfSxzZXRUYWJCYXJCYWRnZTpmdW5jdGlvbihlKXt2YXIgdD1lLmluZGV4LG49ZS50ZXh0LHI9ZS50eXBlO3JldHVybiB2b2lkIDA9PT1yJiYocj0idGV4dCIpLHFzLnNldFRhYkJhckJhZGdlKHIsdCxuKSx7ZXJyTXNnOiJzZXRUYWJCYXJCYWRnZTpvayJ9fSxzZXRUYWJCYXJJdGVtOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXgsbj1lLnRleHQscj1lLmljb25QYXRoLGk9ZS5zZWxlY3RlZEljb25QYXRoLG89ZS5wYWdlUGF0aCxhPWUudmlzaWJsZSxzPWUuaWNvbmZvbnQ7cXMuc2V0VGFiQmFySXRlbSh0LG4scixpLGEscyk7dmFyIGM9byYmdWcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09b30pO2lmKGMpe3ZhciB1PWMubWV0YTt1LmlzVGFiQmFyPSEwLHUudGFiQmFySW5kZXg9dCx1LmlzUXVpdD0hMDt2YXIgbD1jZy50YWJCYXI7bCYmbC5saXN0JiZsLmxpc3RbdF0mJihsLmxpc3RbdF0ucGFnZVBhdGg9by5zdGFydHNXaXRoKCIvIik/by5zdWJzdHJpbmcoMSk6byl9cmV0dXJue2Vyck1zZzoic2V0VGFiQmFySXRlbTpvayJ9fSxzZXRUYWJCYXJTdHlsZTpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIXlpKCkpcmV0dXJue2Vyck1zZzoic2V0VGFiQmFyU3R5bGU6ZmFpbCBub3QgVGFiQmFyIHBhZ2UifTt2YXIgdD17YmxhY2s6InJnYmEoMCwwLDAsMC40KSIsd2hpdGU6InJnYmEoMjU1LDI1NSwyNTUsMC40KSJ9LG49ZS5ib3JkZXJTdHlsZTtyZXR1cm4gbiBpbiB0JiYoZS5ib3JkZXJTdHlsZT10W25dKSxxcy5zZXRUYWJCYXJTdHlsZShlKSx7ZXJyTXNnOiJzZXRUYWJCYXJTdHlsZTpvayJ9fSxoaWRlVGFiQmFyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYW5pbWF0aW9uO3JldHVybiB5aSgpPyhxcy5oaWRlVGFiQmFyKHQpLHtlcnJNc2c6ImhpZGVUYWJCYXI6b2sifSk6e2Vyck1zZzoiaGlkZVRhYkJhcjpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9fSxzaG93VGFiQmFyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYW5pbWF0aW9uO3JldHVybiB5aSgpPyhxcy5zaG93VGFiQmFyKHQpLHtlcnJNc2c6InNob3dUYWJCYXI6b2sifSk6e2Vyck1zZzoic2hvd1RhYkJhcjpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9fSxyZXF1ZXN0Q29tcG9uZW50SW5mbzpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvO2UuJHBhZ2UubWV0YS5pc05WdWU/WXUoZSx0LG4pOihyPWUsaT10LG89bixyZy5wdWJsaXNoSGFuZGxlcigicmVxdWVzdENvbXBvbmVudEluZm8iLHtyZXFJZDpKdS5wdXNoKG8pLHJlcXM6aX0sci4kcGFnZS5pZCkpfSxjcmVhdGVSZXdhcmRlZFZpZGVvQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBybChlKX0sY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBkbChlKX0sY3JlYXRlSW50ZXJzdGl0aWFsQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBmbChlKX0sY3JlYXRlSW50ZXJhY3RpdmVBZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wcm92aWRlcj9lLmFkcGlkP25ldyB2bChlKTpuZXcgRXJyb3IoImFkcGlkIGludmFsaWQiKTpuZXcgRXJyb3IoInByb3ZpZGVyIGludmFsaWQiKX19KSxtbD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksZ2wsZGkpO2Z1bmN0aW9uIHlsKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gbWxbZV0uYXBwbHkobnVsbCx0KX1mdW5jdGlvbiBfbChlLHQpe3JldHVybiByZy5vbigiYXBpLiIrZSx0KX1mdW5jdGlvbiBibChlKXt2YXIgdD1mZygpLG49dC5sZW5ndGg7cmV0dXJuIG58fHJnLmVtaXQoIm9uRXJyb3IiLGUrIjpmYWlsIiksdFtuLTFdLiR2bX1mdW5jdGlvbiB3bCgpe3ZhciBlPWZnKCksdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0JiZ0LiRwYWdlLmlkfXZhciBrbD1bImNhbnBsYXkiLCJwbGF5IiwicGF1c2UiLCJzdG9wIiwiZW5kZWQiLCJ0aW1lVXBkYXRlIiwicHJldiIsIm5leHQiLCJlcnJvciIsIndhaXRpbmciXSxTbD17fTtrbC5mb3JFYWNoKGZ1bmN0aW9uKGUpe1NsW2VdPVtdfSk7dmFyIHhsLENsPVt7bmFtZToiZHVyYXRpb24iLHJlYWRvbmx5OiEwfSx7bmFtZToiY3VycmVudFRpbWUiLHJlYWRvbmx5OiEwfSx7bmFtZToicGF1c2VkIixyZWFkb25seTohMH0se25hbWU6InNyYyIsY2FjaGU6ITB9LHtuYW1lOiJzdGFydFRpbWUiLGRlZmF1bHQ6MCxjYWNoZTohMH0se25hbWU6ImJ1ZmZlcmVkIixyZWFkb25seTohMH0se25hbWU6InRpdGxlIixjYWNoZTohMH0se25hbWU6ImVwbmFtZSIsY2FjaGU6ITB9LHtuYW1lOiJzaW5nZXIiLGNhY2hlOiEwfSx7bmFtZToiY292ZXJJbWdVcmwiLGNhY2hlOiEwfSx7bmFtZToid2ViVXJsIixjYWNoZTohMH0se25hbWU6InByb3RvY29sIixyZWFkb25seTohMCxkZWZhdWx0OiJodHRwIn0se25hbWU6InBsYXliYWNrUmF0ZSIsZGVmYXVsdDoxLGNhY2hlOiEwfV0sVGw9WyJwcmV2IiwibmV4dCJdLE9sPWZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9vcHRpb25zPXt9LF9sKCJvbkJhY2tncm91bmRBdWRpb1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlLG49ZS5lcnJNc2cscj1lLmVyckNvZGU7U2xbdF0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgiZXJyb3IiPT09dD97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX0pLFRsLmZvckVhY2goZnVuY3Rpb24oZSl7X2woIm9uQmFja2dyb3VuZEF1ZGlvIisoZVswXS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyKDEpKSxmdW5jdGlvbigpe1NsW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUoe30pfSl9KX0pLENsLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5uYW1lLGU9e2dldDpmdW5jdGlvbigpe3ZhciBlPXQuY2FjaGU/dGhpcy5fb3B0aW9uczp5bCgiZ2V0QmFja2dyb3VuZEF1ZGlvU3RhdGUiKTtyZXR1cm4gbiBpbiBlP2Vbbl06dC5kZWZhdWx0fX07dC5yZWFkb25seXx8KGUuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuX29wdGlvbnNbbl09ZSx5bCgic2V0QmFja2dyb3VuZEF1ZGlvU3RhdGUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSksbil9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLGUpfSl9O09sLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfSxPbC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwYXVzZSIpfSxPbC5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInN0b3AiKX0sT2wucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24oZSl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOmV9KX0sT2wucHJvdG90eXBlLl9vcGVyYXRlPWZ1bmN0aW9uKGUsdCl7eWwoIm9wZXJhdGVCYWNrZ3JvdW5kQXVkaW8iLE9iamVjdC5hc3NpZ24oe30sdCx7b3BlcmF0aW9uVHlwZTplfSkpfSxrbC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtPbC5wcm90b3R5cGVbIm9uIitlXT1mdW5jdGlvbihlKXtTbFt0XS5wdXNoKGUpfX0pO3ZhciBFbD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRCYWNrZ3JvdW5kQXVkaW9NYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHhsfHwoeGw9bmV3IE9sKX19KSxJbD1VcihmdW5jdGlvbihlLHQpe3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50MTZBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBJbnQzMkFycmF5O3QuYXNzaWduPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3IubGVuZ3RoOyl7dmFyIGk9ci5zaGlmdCgpO2lmKGkpe2lmKCJvYmplY3QiIT10eXBlb2YgaSl0aHJvdyBuZXcgVHlwZUVycm9yKGkrIm11c3QgYmUgbm9uLW9iamVjdCIpO2Zvcih2YXIgbyBpbiBpKXQ9aSxuPW8sT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW29dPWlbb10pfX1yZXR1cm4gZX0sdC5zaHJpbmtCdWY9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5sZW5ndGg9PT10P2U6ZS5zdWJhcnJheT9lLnN1YmFycmF5KDAsdCk6KGUubGVuZ3RoPXQsZSl9O3ZhciByPXthcnJheVNldDpmdW5jdGlvbihlLHQsbixyLGkpe2lmKHQuc3ViYXJyYXkmJmUuc3ViYXJyYXkpZS5zZXQodC5zdWJhcnJheShuLG4rciksaSk7ZWxzZSBmb3IodmFyIG89MDtvPHI7bysrKWVbaStvXT10W24rb119LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhO2Zvcih0PXI9MCxuPWUubGVuZ3RoO3Q8bjt0Kyspcis9ZVt0XS5sZW5ndGg7Zm9yKGE9bmV3IFVpbnQ4QXJyYXkociksdD1pPTAsbj1lLmxlbmd0aDt0PG47dCsrKW89ZVt0XSxhLnNldChvLGkpLGkrPW8ubGVuZ3RoO3JldHVybiBhfX0saT17YXJyYXlTZXQ6ZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIG89MDtvPHI7bysrKWVbaStvXT10W24rb119LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7cmV0dXJuW10uY29uY2F0LmFwcGx5KFtdLGUpfX07dC5zZXRUeXBlZD1mdW5jdGlvbihlKXtlPyh0LkJ1Zjg9VWludDhBcnJheSx0LkJ1ZjE2PVVpbnQxNkFycmF5LHQuQnVmMzI9SW50MzJBcnJheSx0LmFzc2lnbih0LHIpKToodC5CdWY4PUFycmF5LHQuQnVmMTY9QXJyYXksdC5CdWYzMj1BcnJheSx0LmFzc2lnbih0LGkpKX0sdC5zZXRUeXBlZChuKX0pLEFsPShJbC5hc3NpZ24sSWwuc2hyaW5rQnVmLElsLnNldFR5cGVkLElsLkJ1ZjgsSWwuQnVmMTYsSWwuQnVmMzIsMCksJGw9MTtmdW5jdGlvbiBQbChlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7MDw9LS10OyllW3RdPTB9dmFyIE1sPTAsamw9MjksTmw9MjU2LEJsPU5sKzEramwsTGw9MzAsRGw9MTksUmw9MipCbCsxLEZsPTE1LFVsPTE2LHpsPTcsVmw9MjU2LHFsPTE2LFdsPTE3LEhsPTE4LEdsPVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdLEpsPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSxYbD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sWWw9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLEtsPW5ldyBBcnJheSgyKihCbCsyKSk7UGwoS2wpO3ZhciBabD1uZXcgQXJyYXkoMipMbCk7UGwoWmwpO3ZhciBRbD1uZXcgQXJyYXkoNTEyKTtQbChRbCk7dmFyIGVkPW5ldyBBcnJheSgyNTYpO1BsKGVkKTt2YXIgdGQ9bmV3IEFycmF5KGpsKTtQbCh0ZCk7dmFyIG5kLHJkLGlkLG9kPW5ldyBBcnJheShMbCk7ZnVuY3Rpb24gYWQoZSx0LG4scixpKXt0aGlzLnN0YXRpY190cmVlPWUsdGhpcy5leHRyYV9iaXRzPXQsdGhpcy5leHRyYV9iYXNlPW4sdGhpcy5lbGVtcz1yLHRoaXMubWF4X2xlbmd0aD1pLHRoaXMuaGFzX3N0cmVlPWUmJmUubGVuZ3RofWZ1bmN0aW9uIHNkKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fWZ1bmN0aW9uIGNkKGUpe3JldHVybiBlPDI1Nj9RbFtlXTpRbFsyNTYrKGU+Pj43KV19ZnVuY3Rpb24gdWQoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9ZnVuY3Rpb24gbGQoZSx0LG4pe2UuYmlfdmFsaWQ+VWwtbj8oZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsdWQoZSxlLmJpX2J1ZiksZS5iaV9idWY9dD4+VWwtZS5iaV92YWxpZCxlLmJpX3ZhbGlkKz1uLVVsKTooZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZS5iaV92YWxpZCs9bil9ZnVuY3Rpb24gZGQoZSx0LG4pe2xkKGUsblsyKnRdLG5bMip0KzFdKX1mdW5jdGlvbiBmZChlLHQpe2Zvcih2YXIgbj0wO258PTEmZSxlPj4+PTEsbjw8PTEsMDwtLXQ7KTtyZXR1cm4gbj4+PjF9ZnVuY3Rpb24gcGQoZSx0LG4pe3ZhciByLGksbz1uZXcgQXJyYXkoRmwrMSksYT0wO2ZvcihyPTE7cjw9Rmw7cisrKW9bcl09YT1hK25bci0xXTw8MTtmb3IoaT0wO2k8PXQ7aSsrKXt2YXIgcz1lWzIqaSsxXTswIT09cyYmKGVbMippXT1mZChvW3NdKysscykpfX1mdW5jdGlvbiBoZChlKXt2YXIgdDtmb3IodD0wO3Q8Qmw7dCsrKWUuZHluX2x0cmVlWzIqdF09MDtmb3IodD0wO3Q8TGw7dCsrKWUuZHluX2R0cmVlWzIqdF09MDtmb3IodD0wO3Q8RGw7dCsrKWUuYmxfdHJlZVsyKnRdPTA7ZS5keW5fbHRyZWVbMipWbF09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH1mdW5jdGlvbiB2ZChlKXs4PGUuYmlfdmFsaWQ/dWQoZSxlLmJpX2J1Zik6MDxlLmJpX3ZhbGlkJiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wfWZ1bmN0aW9uIGdkKGUsdCxuLHIpe3ZhciBpPTIqdCxvPTIqbjtyZXR1cm4gZVtpXTxlW29dfHxlW2ldPT09ZVtvXSYmclt0XTw9cltuXX1mdW5jdGlvbiBtZChlLHQsbil7Zm9yKHZhciByPWUuaGVhcFtuXSxpPW48PDE7aTw9ZS5oZWFwX2xlbiYmKGk8ZS5oZWFwX2xlbiYmZ2QodCxlLmhlYXBbaSsxXSxlLmhlYXBbaV0sZS5kZXB0aCkmJmkrKywhZ2QodCxyLGUuaGVhcFtpXSxlLmRlcHRoKSk7KWUuaGVhcFtuXT1lLmhlYXBbaV0sbj1pLGk8PD0xO2UuaGVhcFtuXT1yfWZ1bmN0aW9uIHlkKGUsdCxuKXt2YXIgcixpLG8sYSxzPTA7aWYoMCE9PWUubGFzdF9saXQpZm9yKDtyPWUucGVuZGluZ19idWZbZS5kX2J1ZisyKnNdPDw4fGUucGVuZGluZ19idWZbZS5kX2J1ZisyKnMrMV0saT1lLnBlbmRpbmdfYnVmW2UubF9idWYrc10scysrLDA9PT1yP2RkKGUsaSx0KTooZGQoZSwobz1lZFtpXSkrTmwrMSx0KSwwIT09KGE9R2xbb10pJiZsZChlLGktPXRkW29dLGEpLGRkKGUsbz1jZCgtLXIpLG4pLDAhPT0oYT1KbFtvXSkmJmxkKGUsci09b2Rbb10sYSkpLHM8ZS5sYXN0X2xpdDspO2RkKGUsVmwsdCl9ZnVuY3Rpb24gX2QoZSx0KXt2YXIgbixyLGksbz10LmR5bl90cmVlLGE9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUscz10LnN0YXRfZGVzYy5oYXNfc3RyZWUsYz10LnN0YXRfZGVzYy5lbGVtcyx1PS0xO2ZvcihlLmhlYXBfbGVuPTAsZS5oZWFwX21heD1SbCxuPTA7bjxjO24rKykwIT09b1syKm5dPyhlLmhlYXBbKytlLmhlYXBfbGVuXT11PW4sZS5kZXB0aFtuXT0wKTpvWzIqbisxXT0wO2Zvcig7ZS5oZWFwX2xlbjwyOylvWzIqKGk9ZS5oZWFwWysrZS5oZWFwX2xlbl09dTwyPysrdTowKV09MSxlLmRlcHRoW2ldPTAsZS5vcHRfbGVuLS0scyYmKGUuc3RhdGljX2xlbi09YVsyKmkrMV0pO2Zvcih0Lm1heF9jb2RlPXUsbj1lLmhlYXBfbGVuPj4xOzE8PW47bi0tKW1kKGUsbyxuKTtmb3IoaT1jO249ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxtZChlLG8sMSkscj1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09bixlLmhlYXBbLS1lLmhlYXBfbWF4XT1yLG9bMippXT1vWzIqbl0rb1syKnJdLGUuZGVwdGhbaV09KGUuZGVwdGhbbl0+PWUuZGVwdGhbcl0/ZS5kZXB0aFtuXTplLmRlcHRoW3JdKSsxLG9bMipuKzFdPW9bMipyKzFdPWksZS5oZWFwWzFdPWkrKyxtZChlLG8sMSksMjw9ZS5oZWFwX2xlbjspO2UuaGVhcFstLWUuaGVhcF9tYXhdPWUuaGVhcFsxXSxmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjPXQuZHluX3RyZWUsdT10Lm1heF9jb2RlLGw9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsZD10LnN0YXRfZGVzYy5oYXNfc3RyZWUsZj10LnN0YXRfZGVzYy5leHRyYV9iaXRzLHA9dC5zdGF0X2Rlc2MuZXh0cmFfYmFzZSxoPXQuc3RhdF9kZXNjLm1heF9sZW5ndGgsdj0wO2ZvcihvPTA7bzw9Rmw7bysrKWUuYmxfY291bnRbb109MDtmb3IoY1syKmUuaGVhcFtlLmhlYXBfbWF4XSsxXT0wLG49ZS5oZWFwX21heCsxO248Umw7bisrKWg8KG89Y1syKmNbMioocj1lLmhlYXBbbl0pKzFdKzFdKzEpJiYobz1oLHYrKyksY1syKnIrMV09byx1PHJ8fChlLmJsX2NvdW50W29dKyssYT0wLHA8PXImJihhPWZbci1wXSkscz1jWzIqcl0sZS5vcHRfbGVuKz1zKihvK2EpLGQmJihlLnN0YXRpY19sZW4rPXMqKGxbMipyKzFdK2EpKSk7aWYoMCE9PXYpe2Rve2ZvcihvPWgtMTswPT09ZS5ibF9jb3VudFtvXTspby0tO2UuYmxfY291bnRbb10tLSxlLmJsX2NvdW50W28rMV0rPTIsZS5ibF9jb3VudFtoXS0tLHYtPTJ9d2hpbGUoMDx2KTtmb3Iobz1oOzAhPT1vO28tLSlmb3Iocj1lLmJsX2NvdW50W29dOzAhPT1yOyl1PChpPWUuaGVhcFstLW5dKXx8KGNbMippKzFdIT09byYmKGUub3B0X2xlbis9KG8tY1syKmkrMV0pKmNbMippXSxjWzIqaSsxXT1vKSxyLS0pfX0oZSx0KSxwZChvLHUsZS5ibF9jb3VudCl9ZnVuY3Rpb24gYmQoZSx0LG4pe3ZhciByLGksbz0tMSxhPXRbMV0scz0wLGM9Nyx1PTQ7Zm9yKDA9PT1hJiYoYz0xMzgsdT0zKSx0WzIqKG4rMSkrMV09NjU1MzUscj0wO3I8PW47cisrKWk9YSxhPXRbMioocisxKSsxXSwrK3M8YyYmaT09PWF8fChzPHU/ZS5ibF90cmVlWzIqaV0rPXM6MCE9PWk/KGkhPT1vJiZlLmJsX3RyZWVbMippXSsrLGUuYmxfdHJlZVsyKnFsXSsrKTpzPD0xMD9lLmJsX3RyZWVbMipXbF0rKzplLmJsX3RyZWVbMipIbF0rKyxvPWksKHM9MCk9PT1hPyhjPTEzOCx1PTMpOmk9PT1hPyhjPTYsdT0zKTooYz03LHU9NCkpfWZ1bmN0aW9uIHdkKGUsdCxuKXt2YXIgcixpLG89LTEsYT10WzFdLHM9MCxjPTcsdT00O2ZvcigwPT09YSYmKGM9MTM4LHU9Mykscj0wO3I8PW47cisrKWlmKGk9YSxhPXRbMioocisxKSsxXSwhKCsrczxjJiZpPT09YSkpe2lmKHM8dSlmb3IoO2RkKGUsaSxlLmJsX3RyZWUpLDAhPS0tczspO2Vsc2UgMCE9PWk/KGkhPT1vJiYoZGQoZSxpLGUuYmxfdHJlZSkscy0tKSxkZChlLHFsLGUuYmxfdHJlZSksbGQoZSxzLTMsMikpOnM8PTEwPyhkZChlLFdsLGUuYmxfdHJlZSksbGQoZSxzLTMsMykpOihkZChlLEhsLGUuYmxfdHJlZSksbGQoZSxzLTExLDcpKTtvPWksKHM9MCk9PT1hPyhjPTEzOCx1PTMpOmk9PT1hPyhjPTYsdT0zKTooYz03LHU9NCl9fVBsKG9kKTt2YXIga2Q9ITE7ZnVuY3Rpb24gU2QoZSx0LG4scil7dmFyIGksbyxhLHM7bGQoZSwoTWw8PDEpKyhyPzE6MCksMyksbz10LGE9bixzPSEwLHZkKGk9ZSkscyYmKHVkKGksYSksdWQoaSx+YSkpLElsLmFycmF5U2V0KGkucGVuZGluZ19idWYsaS53aW5kb3csbyxhLGkucGVuZGluZyksaS5wZW5kaW5nKz1hfXZhciB4ZD17X3RyX2luaXQ6ZnVuY3Rpb24oZSl7a2R8fChmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbz1uZXcgQXJyYXkoRmwrMSk7Zm9yKHI9bj0wO3I8amwtMTtyKyspZm9yKHRkW3JdPW4sZT0wO2U8MTw8R2xbcl07ZSsrKWVkW24rK109cjtmb3IoZWRbbi0xXT1yLHI9aT0wO3I8MTY7cisrKWZvcihvZFtyXT1pLGU9MDtlPDE8PEpsW3JdO2UrKylRbFtpKytdPXI7Zm9yKGk+Pj03O3I8TGw7cisrKWZvcihvZFtyXT1pPDw3LGU9MDtlPDE8PEpsW3JdLTc7ZSsrKVFsWzI1NitpKytdPXI7Zm9yKHQ9MDt0PD1GbDt0Kyspb1t0XT0wO2ZvcihlPTA7ZTw9MTQzOylLbFsyKmUrMV09OCxlKyssb1s4XSsrO2Zvcig7ZTw9MjU1OylLbFsyKmUrMV09OSxlKyssb1s5XSsrO2Zvcig7ZTw9Mjc5OylLbFsyKmUrMV09NyxlKyssb1s3XSsrO2Zvcig7ZTw9Mjg3OylLbFsyKmUrMV09OCxlKyssb1s4XSsrO2ZvcihwZChLbCxCbCsxLG8pLGU9MDtlPExsO2UrKylabFsyKmUrMV09NSxabFsyKmVdPWZkKGUsNSk7bmQ9bmV3IGFkKEtsLEdsLE5sKzEsQmwsRmwpLHJkPW5ldyBhZChabCxKbCwwLExsLEZsKSxpZD1uZXcgYWQobmV3IEFycmF5KDApLFhsLDAsRGwsemwpfSgpLGtkPSEwKSxlLmxfZGVzYz1uZXcgc2QoZS5keW5fbHRyZWUsbmQpLGUuZF9kZXNjPW5ldyBzZChlLmR5bl9kdHJlZSxyZCksZS5ibF9kZXNjPW5ldyBzZChlLmJsX3RyZWUsaWQpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wLGhkKGUpfSxfdHJfc3RvcmVkX2Jsb2NrOlNkLF90cl9mbHVzaF9ibG9jazpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9MDswPGUubGV2ZWw/KDI9PT1lLnN0cm0uZGF0YV90eXBlJiYoZS5zdHJtLmRhdGFfdHlwZT1mdW5jdGlvbihlKXt2YXIgdCxuPTQwOTM2MjQ0NDc7Zm9yKHQ9MDt0PD0zMTt0Kyssbj4+Pj0xKWlmKDEmbiYmMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIEFsO2lmKDAhPT1lLmR5bl9sdHJlZVsxOF18fDAhPT1lLmR5bl9sdHJlZVsyMF18fDAhPT1lLmR5bl9sdHJlZVsyNl0pcmV0dXJuICRsO2Zvcih0PTMyO3Q8Tmw7dCsrKWlmKDAhPT1lLmR5bl9sdHJlZVsyKnRdKXJldHVybiAkbDtyZXR1cm4gQWx9KGUpKSxfZChlLGUubF9kZXNjKSxfZChlLGUuZF9kZXNjKSxhPWZ1bmN0aW9uKGUpe3ZhciB0O2ZvcihiZChlLGUuZHluX2x0cmVlLGUubF9kZXNjLm1heF9jb2RlKSxiZChlLGUuZHluX2R0cmVlLGUuZF9kZXNjLm1heF9jb2RlKSxfZChlLGUuYmxfZGVzYyksdD1EbC0xOzM8PXQmJjA9PT1lLmJsX3RyZWVbMipZbFt0XSsxXTt0LS0pO3JldHVybiBlLm9wdF9sZW4rPTMqKHQrMSkrNSs1KzQsdH0oZSksaT1lLm9wdF9sZW4rMys3Pj4+Mywobz1lLnN0YXRpY19sZW4rMys3Pj4+Myk8PWkmJihpPW8pKTppPW89bis1LG4rNDw9aSYmLTEhPT10P1NkKGUsdCxuLHIpOjQ9PT1lLnN0cmF0ZWd5fHxvPT09aT8obGQoZSwyKyhyPzE6MCksMykseWQoZSxLbCxabCkpOihsZChlLDQrKHI/MTowKSwzKSxmdW5jdGlvbihlLHQsbixyKXt2YXIgaTtmb3IobGQoZSx0LTI1Nyw1KSxsZChlLG4tMSw1KSxsZChlLHItNCw0KSxpPTA7aTxyO2krKylsZChlLGUuYmxfdHJlZVsyKllsW2ldKzFdLDMpO3dkKGUsZS5keW5fbHRyZWUsdC0xKSx3ZChlLGUuZHluX2R0cmVlLG4tMSl9KGUsZS5sX2Rlc2MubWF4X2NvZGUrMSxlLmRfZGVzYy5tYXhfY29kZSsxLGErMSkseWQoZSxlLmR5bl9sdHJlZSxlLmR5bl9kdHJlZSkpLGhkKGUpLHImJnZkKGUpfSxfdHJfdGFsbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0XT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqZS5sYXN0X2xpdCsxXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UubF9idWYrZS5sYXN0X2xpdF09MjU1Jm4sZS5sYXN0X2xpdCsrLDA9PT10P2UuZHluX2x0cmVlWzIqbl0rKzooZS5tYXRjaGVzKyssdC0tLGUuZHluX2x0cmVlWzIqKGVkW25dK05sKzEpXSsrLGUuZHluX2R0cmVlWzIqY2QodCldKyspLGUubGFzdF9saXQ9PT1lLmxpdF9idWZzaXplLTF9LF90cl9hbGlnbjpmdW5jdGlvbihlKXt2YXIgdDtsZChlLDIsMyksZGQoZSxWbCxLbCksMTY9PT0odD1lKS5iaV92YWxpZD8odWQodCx0LmJpX2J1ZiksdC5iaV9idWY9MCx0LmJpX3ZhbGlkPTApOjg8PXQuYmlfdmFsaWQmJih0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmdC5iaV9idWYsdC5iaV9idWY+Pj04LHQuYmlfdmFsaWQtPTgpfX07dmFyIENkPWZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaT02NTUzNSZlfDAsbz1lPj4+MTYmNjU1MzV8MCxhPTA7MCE9PW47KXtmb3Iobi09YT0yZTM8bj8yZTM6bjtvPW8rKGk9aSt0W3IrK118MCl8MCwtLWE7KTtpJT02NTUyMSxvJT02NTUyMX1yZXR1cm4gaXxvPDwxNnwwfTt2YXIgVGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPTA7bjwyNTY7bisrKXtlPW47Zm9yKHZhciByPTA7cjw4O3IrKyllPTEmZT8zOTg4MjkyMzg0XmU+Pj4xOmU+Pj4xO3Rbbl09ZX1yZXR1cm4gdH0oKTt2YXIgT2QsRWQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9VGQsbz1yK247ZV49LTE7Zm9yKHZhciBhPXI7YTxvO2ErKyllPWU+Pj44XmlbMjU1JihlXnRbYV0pXTtyZXR1cm4tMV5lfSxJZD17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9LEFkPTAsJGQ9NCxQZD0wLE1kPS0yLGpkPS0xLE5kPTQsQmQ9MixMZD04LERkPTksUmQ9Mjg2LEZkPTMwLFVkPTE5LHpkPTIqUmQrMSxWZD0xNSxxZD0zLFdkPTI1OCxIZD1XZCtxZCsxLEdkPTQyLEpkPTExMyxYZD0xLFlkPTIsS2Q9MyxaZD00O2Z1bmN0aW9uIFFkKGUsdCl7cmV0dXJuIGUubXNnPUlkW3RdLHR9ZnVuY3Rpb24gZWYoZSl7cmV0dXJuKGU8PDEpLSg0PGU/OTowKX1mdW5jdGlvbiB0ZihlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7MDw9LS10OyllW3RdPTB9ZnVuY3Rpb24gbmYoZSl7dmFyIHQ9ZS5zdGF0ZSxuPXQucGVuZGluZztuPmUuYXZhaWxfb3V0JiYobj1lLmF2YWlsX291dCksMCE9PW4mJihJbC5hcnJheVNldChlLm91dHB1dCx0LnBlbmRpbmdfYnVmLHQucGVuZGluZ19vdXQsbixlLm5leHRfb3V0KSxlLm5leHRfb3V0Kz1uLHQucGVuZGluZ19vdXQrPW4sZS50b3RhbF9vdXQrPW4sZS5hdmFpbF9vdXQtPW4sdC5wZW5kaW5nLT1uLDA9PT10LnBlbmRpbmcmJih0LnBlbmRpbmdfb3V0PTApKX1mdW5jdGlvbiByZihlLHQpe3hkLl90cl9mbHVzaF9ibG9jayhlLDA8PWUuYmxvY2tfc3RhcnQ/ZS5ibG9ja19zdGFydDotMSxlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQsdCksZS5ibG9ja19zdGFydD1lLnN0cnN0YXJ0LG5mKGUuc3RybSl9ZnVuY3Rpb24gb2YoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10fWZ1bmN0aW9uIGFmKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0fWZ1bmN0aW9uIHNmKGUsdCl7dmFyIG4scixpPWUubWF4X2NoYWluX2xlbmd0aCxvPWUuc3Ryc3RhcnQsYT1lLnByZXZfbGVuZ3RoLHM9ZS5uaWNlX21hdGNoLGM9ZS5zdHJzdGFydD5lLndfc2l6ZS1IZD9lLnN0cnN0YXJ0LShlLndfc2l6ZS1IZCk6MCx1PWUud2luZG93LGw9ZS53X21hc2ssZD1lLnByZXYsZj1lLnN0cnN0YXJ0K1dkLHA9dVtvK2EtMV0saD11W28rYV07ZS5wcmV2X2xlbmd0aD49ZS5nb29kX21hdGNoJiYoaT4+PTIpLHM+ZS5sb29rYWhlYWQmJihzPWUubG9va2FoZWFkKTtkb3tpZih1WyhuPXQpK2FdPT09aCYmdVtuK2EtMV09PT1wJiZ1W25dPT09dVtvXSYmdVsrK25dPT09dVtvKzFdKXtvKz0yLG4rKztkb3t9d2hpbGUodVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJm88Zik7aWYocj1XZC0oZi1vKSxvPWYtV2QsYTxyKXtpZihlLm1hdGNoX3N0YXJ0PXQsczw9KGE9cikpYnJlYWs7cD11W28rYS0xXSxoPXVbbythXX19fXdoaWxlKCh0PWRbdCZsXSk+YyYmMCE9LS1pKTtyZXR1cm4gYTw9ZS5sb29rYWhlYWQ/YTplLmxvb2thaGVhZH1mdW5jdGlvbiBjZihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHUsbCxkPWUud19zaXplO2Rve2lmKGk9ZS53aW5kb3dfc2l6ZS1lLmxvb2thaGVhZC1lLnN0cnN0YXJ0LGUuc3Ryc3RhcnQ+PWQrKGQtSGQpKXtmb3IoSWwuYXJyYXlTZXQoZS53aW5kb3csZS53aW5kb3csZCxkLDApLGUubWF0Y2hfc3RhcnQtPWQsZS5zdHJzdGFydC09ZCxlLmJsb2NrX3N0YXJ0LT1kLHQ9bj1lLmhhc2hfc2l6ZTtyPWUuaGVhZFstLXRdLGUuaGVhZFt0XT1kPD1yP3ItZDowLC0tbjspO2Zvcih0PW49ZDtyPWUucHJldlstLXRdLGUucHJldlt0XT1kPD1yP3ItZDowLC0tbjspO2krPWR9aWYoMD09PWUuc3RybS5hdmFpbF9pbilicmVhaztpZihhPWUuc3RybSxzPWUud2luZG93LGM9ZS5zdHJzdGFydCtlLmxvb2thaGVhZCx1PWksbD12b2lkIDAsbD1hLmF2YWlsX2luLHU8bCYmKGw9dSksbj0wPT09bD8wOihhLmF2YWlsX2luLT1sLElsLmFycmF5U2V0KHMsYS5pbnB1dCxhLm5leHRfaW4sbCxjKSwxPT09YS5zdGF0ZS53cmFwP2EuYWRsZXI9Q2QoYS5hZGxlcixzLGwsYyk6Mj09PWEuc3RhdGUud3JhcCYmKGEuYWRsZXI9RWQoYS5hZGxlcixzLGwsYykpLGEubmV4dF9pbis9bCxhLnRvdGFsX2luKz1sLGwpLGUubG9va2FoZWFkKz1uLGUubG9va2FoZWFkK2UuaW5zZXJ0Pj1xZClmb3Iobz1lLnN0cnN0YXJ0LWUuaW5zZXJ0LGUuaW5zX2g9ZS53aW5kb3dbb10sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W28rMV0pJmUuaGFzaF9tYXNrO2UuaW5zZXJ0JiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W28rcWQtMV0pJmUuaGFzaF9tYXNrLGUucHJldltvJmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPW8sbysrLGUuaW5zZXJ0LS0sIShlLmxvb2thaGVhZCtlLmluc2VydDxxZCkpOyk7fXdoaWxlKGUubG9va2FoZWFkPEhkJiYwIT09ZS5zdHJtLmF2YWlsX2luKX1mdW5jdGlvbiB1ZihlLHQpe2Zvcih2YXIgbixyOzspe2lmKGUubG9va2FoZWFkPEhkKXtpZihjZihlKSxlLmxvb2thaGVhZDxIZCYmdD09PUFkKXJldHVybiBYZDtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1xZCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K3FkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLDAhPT1uJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLUhkJiYoZS5tYXRjaF9sZW5ndGg9c2YoZSxuKSksZS5tYXRjaF9sZW5ndGg+PXFkKWlmKHI9eGQuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0LGUubWF0Y2hfbGVuZ3RoLXFkKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg8PWUubWF4X2xhenlfbWF0Y2gmJmUubG9va2FoZWFkPj1xZCl7Zm9yKGUubWF0Y2hfbGVuZ3RoLS07ZS5zdHJzdGFydCsrLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K3FkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQsMCE9LS1lLm1hdGNoX2xlbmd0aDspO2Uuc3Ryc3RhcnQrK31lbHNlIGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTAsZS5pbnNfaD1lLndpbmRvd1tlLnN0cnN0YXJ0XSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCsxXSkmZS5oYXNoX21hc2s7ZWxzZSByPXhkLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrO2lmKHImJihyZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIFhkfXJldHVybiBlLmluc2VydD1lLnN0cnN0YXJ0PHFkLTE/ZS5zdHJzdGFydDpxZC0xLHQ9PT0kZD8ocmYoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/S2Q6WmQpOmUubGFzdF9saXQmJihyZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/WGQ6WWR9ZnVuY3Rpb24gbGYoZSx0KXtmb3IodmFyIG4scixpOzspe2lmKGUubG9va2FoZWFkPEhkKXtpZihjZihlKSxlLmxvb2thaGVhZDxIZCYmdD09PUFkKXJldHVybiBYZDtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1xZCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K3FkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9cWQtMSwwIT09biYmZS5wcmV2X2xlbmd0aDxlLm1heF9sYXp5X21hdGNoJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLUhkJiYoZS5tYXRjaF9sZW5ndGg9c2YoZSxuKSxlLm1hdGNoX2xlbmd0aDw9NSYmKDE9PT1lLnN0cmF0ZWd5fHxlLm1hdGNoX2xlbmd0aD09PXFkJiY0MDk2PGUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydCkmJihlLm1hdGNoX2xlbmd0aD1xZC0xKSksZS5wcmV2X2xlbmd0aD49cWQmJmUubWF0Y2hfbGVuZ3RoPD1lLnByZXZfbGVuZ3RoKXtmb3IoaT1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLXFkLHI9eGQuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC0xLWUucHJldl9tYXRjaCxlLnByZXZfbGVuZ3RoLXFkKSxlLmxvb2thaGVhZC09ZS5wcmV2X2xlbmd0aC0xLGUucHJldl9sZW5ndGgtPTI7KytlLnN0cnN0YXJ0PD1pJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrcWQtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksMCE9LS1lLnByZXZfbGVuZ3RoOyk7aWYoZS5tYXRjaF9hdmFpbGFibGU9MCxlLm1hdGNoX2xlbmd0aD1xZC0xLGUuc3Ryc3RhcnQrKyxyJiYocmYoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBYZH1lbHNlIGlmKGUubWF0Y2hfYXZhaWxhYmxlKXtpZigocj14ZC5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pKSYmcmYoZSwhMSksZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS0sMD09PWUuc3RybS5hdmFpbF9vdXQpcmV0dXJuIFhkfWVsc2UgZS5tYXRjaF9hdmFpbGFibGU9MSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLX1yZXR1cm4gZS5tYXRjaF9hdmFpbGFibGUmJihyPXhkLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDxxZC0xP2Uuc3Ryc3RhcnQ6cWQtMSx0PT09JGQ/KHJmKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P0tkOlpkKTplLmxhc3RfbGl0JiYocmYoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP1hkOllkfWZ1bmN0aW9uIGRmKGUsdCxuLHIsaSl7dGhpcy5nb29kX2xlbmd0aD1lLHRoaXMubWF4X2xhenk9dCx0aGlzLm5pY2VfbGVuZ3RoPW4sdGhpcy5tYXhfY2hhaW49cix0aGlzLmZ1bmM9aX1mdW5jdGlvbiBmZigpe3RoaXMuc3RybT1udWxsLHRoaXMuc3RhdHVzPTAsdGhpcy5wZW5kaW5nX2J1Zj1udWxsLHRoaXMucGVuZGluZ19idWZfc2l6ZT0wLHRoaXMucGVuZGluZ19vdXQ9MCx0aGlzLnBlbmRpbmc9MCx0aGlzLndyYXA9MCx0aGlzLmd6aGVhZD1udWxsLHRoaXMuZ3ppbmRleD0wLHRoaXMubWV0aG9kPUxkLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBJbC5CdWYxNigyKnpkKSx0aGlzLmR5bl9kdHJlZT1uZXcgSWwuQnVmMTYoMiooMipGZCsxKSksdGhpcy5ibF90cmVlPW5ldyBJbC5CdWYxNigyKigyKlVkKzEpKSx0Zih0aGlzLmR5bl9sdHJlZSksdGYodGhpcy5keW5fZHRyZWUpLHRmKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IElsLkJ1ZjE2KFZkKzEpLHRoaXMuaGVhcD1uZXcgSWwuQnVmMTYoMipSZCsxKSx0Zih0aGlzLmhlYXApLHRoaXMuaGVhcF9sZW49MCx0aGlzLmhlYXBfbWF4PTAsdGhpcy5kZXB0aD1uZXcgSWwuQnVmMTYoMipSZCsxKSx0Zih0aGlzLmRlcHRoKSx0aGlzLmxfYnVmPTAsdGhpcy5saXRfYnVmc2l6ZT0wLHRoaXMubGFzdF9saXQ9MCx0aGlzLmRfYnVmPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1mdW5jdGlvbiBwZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oZS50b3RhbF9pbj1lLnRvdGFsX291dD0wLGUuZGF0YV90eXBlPUJkLCh0PWUuc3RhdGUpLnBlbmRpbmc9MCx0LnBlbmRpbmdfb3V0PTAsdC53cmFwPDAmJih0LndyYXA9LXQud3JhcCksdC5zdGF0dXM9dC53cmFwP0dkOkpkLGUuYWRsZXI9Mj09PXQud3JhcD8wOjEsdC5sYXN0X2ZsdXNoPUFkLHhkLl90cl9pbml0KHQpLFBkKTpRZChlLE1kKX1mdW5jdGlvbiBoZihlKXt2YXIgdCxuPXBmKGUpO3JldHVybiBuPT09UGQmJigodD1lLnN0YXRlKS53aW5kb3dfc2l6ZT0yKnQud19zaXplLHRmKHQuaGVhZCksdC5tYXhfbGF6eV9tYXRjaD1PZFt0LmxldmVsXS5tYXhfbGF6eSx0Lmdvb2RfbWF0Y2g9T2RbdC5sZXZlbF0uZ29vZF9sZW5ndGgsdC5uaWNlX21hdGNoPU9kW3QubGV2ZWxdLm5pY2VfbGVuZ3RoLHQubWF4X2NoYWluX2xlbmd0aD1PZFt0LmxldmVsXS5tYXhfY2hhaW4sdC5zdHJzdGFydD0wLHQuYmxvY2tfc3RhcnQ9MCx0Lmxvb2thaGVhZD0wLHQuaW5zZXJ0PTAsdC5tYXRjaF9sZW5ndGg9dC5wcmV2X2xlbmd0aD1xZC0xLHQubWF0Y2hfYXZhaWxhYmxlPTAsdC5pbnNfaD0wKSxufWZ1bmN0aW9uIHZmKGUsdCxuLHIsaSxvKXtpZighZSlyZXR1cm4gTWQ7dmFyIGE9MTtpZih0PT09amQmJih0PTYpLHI8MD8oYT0wLHI9LXIpOjE1PHImJihhPTIsci09MTYpLGk8MXx8RGQ8aXx8biE9PUxkfHxyPDh8fDE1PHJ8fHQ8MHx8OTx0fHxvPDB8fE5kPG8pcmV0dXJuIFFkKGUsTWQpOzg9PT1yJiYocj05KTt2YXIgcz1uZXcgZmY7cmV0dXJuKGUuc3RhdGU9cykuc3RybT1lLHMud3JhcD1hLHMuZ3poZWFkPW51bGwscy53X2JpdHM9cixzLndfc2l6ZT0xPDxzLndfYml0cyxzLndfbWFzaz1zLndfc2l6ZS0xLHMuaGFzaF9iaXRzPWkrNyxzLmhhc2hfc2l6ZT0xPDxzLmhhc2hfYml0cyxzLmhhc2hfbWFzaz1zLmhhc2hfc2l6ZS0xLHMuaGFzaF9zaGlmdD1+figocy5oYXNoX2JpdHMrcWQtMSkvcWQpLHMud2luZG93PW5ldyBJbC5CdWY4KDIqcy53X3NpemUpLHMuaGVhZD1uZXcgSWwuQnVmMTYocy5oYXNoX3NpemUpLHMucHJldj1uZXcgSWwuQnVmMTYocy53X3NpemUpLHMubGl0X2J1ZnNpemU9MTw8aSs2LHMucGVuZGluZ19idWZfc2l6ZT00KnMubGl0X2J1ZnNpemUscy5wZW5kaW5nX2J1Zj1uZXcgSWwuQnVmOChzLnBlbmRpbmdfYnVmX3NpemUpLHMuZF9idWY9MSpzLmxpdF9idWZzaXplLHMubF9idWY9MypzLmxpdF9idWZzaXplLHMubGV2ZWw9dCxzLnN0cmF0ZWd5PW8scy5tZXRob2Q9bixoZihlKX1PZD1bbmV3IGRmKDAsMCwwLDAsZnVuY3Rpb24oZSx0KXt2YXIgbj02NTUzNTtmb3Iobj5lLnBlbmRpbmdfYnVmX3NpemUtNSYmKG49ZS5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKGUubG9va2FoZWFkPD0xKXtpZihjZihlKSwwPT09ZS5sb29rYWhlYWQmJnQ9PT1BZClyZXR1cm4gWGQ7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWUuc3Ryc3RhcnQrPWUubG9va2FoZWFkLGUubG9va2FoZWFkPTA7dmFyIHI9ZS5ibG9ja19zdGFydCtuO2lmKCgwPT09ZS5zdHJzdGFydHx8ZS5zdHJzdGFydD49cikmJihlLmxvb2thaGVhZD1lLnN0cnN0YXJ0LXIsZS5zdHJzdGFydD1yLHJmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gWGQ7aWYoZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0Pj1lLndfc2l6ZS1IZCYmKHJmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gWGR9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PSRkPyhyZihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9LZDpaZCk6KGUuc3Ryc3RhcnQ+ZS5ibG9ja19zdGFydCYmKHJmKGUsITEpLGUuc3RybS5hdmFpbF9vdXQpLFhkKX0pLG5ldyBkZig0LDQsOCw0LHVmKSxuZXcgZGYoNCw1LDE2LDgsdWYpLG5ldyBkZig0LDYsMzIsMzIsdWYpLG5ldyBkZig0LDQsMTYsMTYsbGYpLG5ldyBkZig4LDE2LDMyLDMyLGxmKSxuZXcgZGYoOCwxNiwxMjgsMTI4LGxmKSxuZXcgZGYoOCwzMiwxMjgsMjU2LGxmKSxuZXcgZGYoMzIsMTI4LDI1OCwxMDI0LGxmKSxuZXcgZGYoMzIsMjU4LDI1OCw0MDk2LGxmKV07dmFyIGdmPXtkZWZsYXRlSW5pdDpmdW5jdGlvbihlLHQpe3JldHVybiB2ZihlLHQsTGQsMTUsOCwwKX0sZGVmbGF0ZUluaXQyOnZmLGRlZmxhdGVSZXNldDpoZixkZWZsYXRlUmVzZXRLZWVwOnBmLGRlZmxhdGVTZXRIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5zdGF0ZT8yIT09ZS5zdGF0ZS53cmFwP01kOihlLnN0YXRlLmd6aGVhZD10LFBkKTpNZH0sZGVmbGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvO2lmKCFlfHwhZS5zdGF0ZXx8NTx0fHx0PDApcmV0dXJuIGU/UWQoZSxNZCk6TWQ7aWYocj1lLnN0YXRlLCFlLm91dHB1dHx8IWUuaW5wdXQmJjAhPT1lLmF2YWlsX2lufHw2NjY9PT1yLnN0YXR1cyYmdCE9PSRkKXJldHVybiBRZChlLDA9PT1lLmF2YWlsX291dD8tNTpNZCk7aWYoci5zdHJtPWUsbj1yLmxhc3RfZmx1c2gsci5sYXN0X2ZsdXNoPXQsci5zdGF0dXM9PT1HZClpZigyPT09ci53cmFwKWUuYWRsZXI9MCxvZihyLDMxKSxvZihyLDEzOSksb2Yociw4KSxyLmd6aGVhZD8ob2Yociwoci5nemhlYWQudGV4dD8xOjApKyhyLmd6aGVhZC5oY3JjPzI6MCkrKHIuZ3poZWFkLmV4dHJhPzQ6MCkrKHIuZ3poZWFkLm5hbWU/ODowKSsoci5nemhlYWQuY29tbWVudD8xNjowKSksb2YociwyNTUmci5nemhlYWQudGltZSksb2YocixyLmd6aGVhZC50aW1lPj44JjI1NSksb2YocixyLmd6aGVhZC50aW1lPj4xNiYyNTUpLG9mKHIsci5nemhlYWQudGltZT4+MjQmMjU1KSxvZihyLDk9PT1yLmxldmVsPzI6Mjw9ci5zdHJhdGVneXx8ci5sZXZlbDwyPzQ6MCksb2YociwyNTUmci5nemhlYWQub3MpLHIuZ3poZWFkLmV4dHJhJiZyLmd6aGVhZC5leHRyYS5sZW5ndGgmJihvZihyLDI1NSZyLmd6aGVhZC5leHRyYS5sZW5ndGgpLG9mKHIsci5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLHIuZ3poZWFkLmhjcmMmJihlLmFkbGVyPUVkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmcsMCkpLHIuZ3ppbmRleD0wLHIuc3RhdHVzPTY5KToob2YociwwKSxvZihyLDApLG9mKHIsMCksb2YociwwKSxvZihyLDApLG9mKHIsOT09PXIubGV2ZWw/MjoyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/NDowKSxvZihyLDMpLHIuc3RhdHVzPUpkKTtlbHNle3ZhciBhPUxkKyhyLndfYml0cy04PDw0KTw8ODthfD0oMjw9ci5zdHJhdGVneXx8ci5sZXZlbDwyPzA6ci5sZXZlbDw2PzE6Nj09PXIubGV2ZWw/MjozKTw8NiwwIT09ci5zdHJzdGFydCYmKGF8PTMyKSxhKz0zMS1hJTMxLHIuc3RhdHVzPUpkLGFmKHIsYSksMCE9PXIuc3Ryc3RhcnQmJihhZihyLGUuYWRsZXI+Pj4xNiksYWYociw2NTUzNSZlLmFkbGVyKSksZS5hZGxlcj0xfWlmKDY5PT09ci5zdGF0dXMpaWYoci5nemhlYWQuZXh0cmEpe2ZvcihpPXIucGVuZGluZztyLmd6aW5kZXg8KDY1NTM1JnIuZ3poZWFkLmV4dHJhLmxlbmd0aCkmJihyLnBlbmRpbmchPT1yLnBlbmRpbmdfYnVmX3NpemV8fChyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9RWQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxuZihlKSxpPXIucGVuZGluZyxyLnBlbmRpbmchPT1yLnBlbmRpbmdfYnVmX3NpemUpKTspb2YociwyNTUmci5nemhlYWQuZXh0cmFbci5nemluZGV4XSksci5nemluZGV4Kys7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPUVkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksci5nemluZGV4PT09ci5nemhlYWQuZXh0cmEubGVuZ3RoJiYoci5nemluZGV4PTAsci5zdGF0dXM9NzMpfWVsc2Ugci5zdGF0dXM9NzM7aWYoNzM9PT1yLnN0YXR1cylpZihyLmd6aGVhZC5uYW1lKXtpPXIucGVuZGluZztkb3tpZihyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9RWQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxuZihlKSxpPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKXtvPTE7YnJlYWt9b2YocixvPXIuZ3ppbmRleDxyLmd6aGVhZC5uYW1lLmxlbmd0aD8yNTUmci5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKTowKX13aGlsZSgwIT09byk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPUVkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksMD09PW8mJihyLmd6aW5kZXg9MCxyLnN0YXR1cz05MSl9ZWxzZSByLnN0YXR1cz05MTtpZig5MT09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLmNvbW1lbnQpe2k9ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1FZChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLG5mKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31vZihyLG89ci5nemluZGV4PHIuZ3poZWFkLmNvbW1lbnQubGVuZ3RoPzI1NSZyLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQoci5nemluZGV4KyspOjApfXdoaWxlKDAhPT1vKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9RWQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSwwPT09byYmKHIuc3RhdHVzPTEwMyl9ZWxzZSByLnN0YXR1cz0xMDM7aWYoMTAzPT09ci5zdGF0dXMmJihyLmd6aGVhZC5oY3JjPyhyLnBlbmRpbmcrMj5yLnBlbmRpbmdfYnVmX3NpemUmJm5mKGUpLHIucGVuZGluZysyPD1yLnBlbmRpbmdfYnVmX3NpemUmJihvZihyLDI1NSZlLmFkbGVyKSxvZihyLGUuYWRsZXI+PjgmMjU1KSxlLmFkbGVyPTAsci5zdGF0dXM9SmQpKTpyLnN0YXR1cz1KZCksMCE9PXIucGVuZGluZyl7aWYobmYoZSksMD09PWUuYXZhaWxfb3V0KXJldHVybiByLmxhc3RfZmx1c2g9LTEsUGR9ZWxzZSBpZigwPT09ZS5hdmFpbF9pbiYmZWYodCk8PWVmKG4pJiZ0IT09JGQpcmV0dXJuIFFkKGUsLTUpO2lmKDY2Nj09PXIuc3RhdHVzJiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gUWQoZSwtNSk7aWYoMCE9PWUuYXZhaWxfaW58fDAhPT1yLmxvb2thaGVhZHx8dCE9PUFkJiY2NjYhPT1yLnN0YXR1cyl7dmFyIHM9Mj09PXIuc3RyYXRlZ3k/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG47Oyl7aWYoMD09PWUubG9va2FoZWFkJiYoY2YoZSksMD09PWUubG9va2FoZWFkKSl7aWYodD09PUFkKXJldHVybiBYZDticmVha31pZihlLm1hdGNoX2xlbmd0aD0wLG49eGQuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyssbiYmKHJmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gWGR9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PSRkPyhyZihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9LZDpaZCk6ZS5sYXN0X2xpdCYmKHJmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT9YZDpZZH0ocix0KTozPT09ci5zdHJhdGVneT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGksbyxhPWUud2luZG93Ozspe2lmKGUubG9va2FoZWFkPD1XZCl7aWYoY2YoZSksZS5sb29rYWhlYWQ8PVdkJiZ0PT09QWQpcmV0dXJuIFhkO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj1xZCYmMDxlLnN0cnN0YXJ0JiYocj1hW2k9ZS5zdHJzdGFydC0xXSk9PT1hWysraV0mJnI9PT1hWysraV0mJnI9PT1hWysraV0pe289ZS5zdHJzdGFydCtXZDtkb3t9d2hpbGUocj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmaTxvKTtlLm1hdGNoX2xlbmd0aD1XZC0oby1pKSxlLm1hdGNoX2xlbmd0aD5lLmxvb2thaGVhZCYmKGUubWF0Y2hfbGVuZ3RoPWUubG9va2FoZWFkKX1pZihlLm1hdGNoX2xlbmd0aD49cWQ/KG49eGQuX3RyX3RhbGx5KGUsMSxlLm1hdGNoX2xlbmd0aC1xZCksZS5sb29rYWhlYWQtPWUubWF0Y2hfbGVuZ3RoLGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTApOihuPXhkLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrKSxuJiYocmYoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBYZH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09JGQ/KHJmKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P0tkOlpkKTplLmxhc3RfbGl0JiYocmYoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP1hkOllkfShyLHQpOk9kW3IubGV2ZWxdLmZ1bmMocix0KTtpZihzIT09S2QmJnMhPT1aZHx8KHIuc3RhdHVzPTY2Nikscz09PVhkfHxzPT09S2QpcmV0dXJuIDA9PT1lLmF2YWlsX291dCYmKHIubGFzdF9mbHVzaD0tMSksUGQ7aWYocz09PVlkJiYoMT09PXQ/eGQuX3RyX2FsaWduKHIpOjUhPT10JiYoeGQuX3RyX3N0b3JlZF9ibG9jayhyLDAsMCwhMSksMz09PXQmJih0ZihyLmhlYWQpLDA9PT1yLmxvb2thaGVhZCYmKHIuc3Ryc3RhcnQ9MCxyLmJsb2NrX3N0YXJ0PTAsci5pbnNlcnQ9MCkpKSxuZihlKSwwPT09ZS5hdmFpbF9vdXQpKXJldHVybiByLmxhc3RfZmx1c2g9LTEsUGR9cmV0dXJuIHQhPT0kZD9QZDpyLndyYXA8PTA/MTooMj09PXIud3JhcD8ob2YociwyNTUmZS5hZGxlciksb2YocixlLmFkbGVyPj44JjI1NSksb2YocixlLmFkbGVyPj4xNiYyNTUpLG9mKHIsZS5hZGxlcj4+MjQmMjU1KSxvZihyLDI1NSZlLnRvdGFsX2luKSxvZihyLGUudG90YWxfaW4+PjgmMjU1KSxvZihyLGUudG90YWxfaW4+PjE2JjI1NSksb2YocixlLnRvdGFsX2luPj4yNCYyNTUpKTooYWYocixlLmFkbGVyPj4+MTYpLGFmKHIsNjU1MzUmZS5hZGxlcikpLG5mKGUpLDA8ci53cmFwJiYoci53cmFwPS1yLndyYXApLDAhPT1yLnBlbmRpbmc/UGQ6MSl9LGRlZmxhdGVFbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUmJmUuc3RhdGU/KHQ9ZS5zdGF0ZS5zdGF0dXMpIT09R2QmJjY5IT09dCYmNzMhPT10JiY5MSE9PXQmJjEwMyE9PXQmJnQhPT1KZCYmNjY2IT09dD9RZChlLE1kKTooZS5zdGF0ZT1udWxsLHQ9PT1KZD9RZChlLC0zKTpQZCk6TWR9LGRlZmxhdGVTZXREaWN0aW9uYXJ5OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGMsdSxsPXQubGVuZ3RoO2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gTWQ7aWYoMj09PShvPShuPWUuc3RhdGUpLndyYXApfHwxPT09byYmbi5zdGF0dXMhPT1HZHx8bi5sb29rYWhlYWQpcmV0dXJuIE1kO2ZvcigxPT09byYmKGUuYWRsZXI9Q2QoZS5hZGxlcix0LGwsMCkpLG4ud3JhcD0wLGw+PW4ud19zaXplJiYoMD09PW8mJih0ZihuLmhlYWQpLG4uc3Ryc3RhcnQ9MCxuLmJsb2NrX3N0YXJ0PTAsbi5pbnNlcnQ9MCksdT1uZXcgSWwuQnVmOChuLndfc2l6ZSksSWwuYXJyYXlTZXQodSx0LGwtbi53X3NpemUsbi53X3NpemUsMCksdD11LGw9bi53X3NpemUpLGE9ZS5hdmFpbF9pbixzPWUubmV4dF9pbixjPWUuaW5wdXQsZS5hdmFpbF9pbj1sLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxjZihuKTtuLmxvb2thaGVhZD49cWQ7KXtmb3Iocj1uLnN0cnN0YXJ0LGk9bi5sb29rYWhlYWQtKHFkLTEpO24uaW5zX2g9KG4uaW5zX2g8PG4uaGFzaF9zaGlmdF5uLndpbmRvd1tyK3FkLTFdKSZuLmhhc2hfbWFzayxuLnByZXZbciZuLndfbWFza109bi5oZWFkW24uaW5zX2hdLG4uaGVhZFtuLmluc19oXT1yLHIrKywtLWk7KTtuLnN0cnN0YXJ0PXIsbi5sb29rYWhlYWQ9cWQtMSxjZihuKX1yZXR1cm4gbi5zdHJzdGFydCs9bi5sb29rYWhlYWQsbi5ibG9ja19zdGFydD1uLnN0cnN0YXJ0LG4uaW5zZXJ0PW4ubG9va2FoZWFkLG4ubG9va2FoZWFkPTAsbi5tYXRjaF9sZW5ndGg9bi5wcmV2X2xlbmd0aD1xZC0xLG4ubWF0Y2hfYXZhaWxhYmxlPTAsZS5uZXh0X2luPXMsZS5pbnB1dD1jLGUuYXZhaWxfaW49YSxuLndyYXA9byxQZH0sZGVmbGF0ZUluZm86InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSxtZj0hMCx5Zj0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2goZSl7bWY9ITF9dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2goZSl7eWY9ITF9Zm9yKHZhciBfZj1uZXcgSWwuQnVmOCgyNTYpLGJmPTA7YmY8MjU2O2JmKyspX2ZbYmZdPTI1Mjw9YmY/NjoyNDg8PWJmPzU6MjQwPD1iZj80OjIyNDw9YmY/MzoxOTI8PWJmPzI6MTtfZlsyNTRdPV9mWzI1NF09MTtmdW5jdGlvbiB3ZihlLHQpe2lmKHQ8NjU1MzQmJihlLnN1YmFycmF5JiZ5Znx8IWUuc3ViYXJyYXkmJm1mKSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLElsLnNocmlua0J1ZihlLHQpKTtmb3IodmFyIG49IiIscj0wO3I8dDtyKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW3JdKTtyZXR1cm4gbn12YXIga2Y9e3N0cmluZzJidWY6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPWUubGVuZ3RoLHM9MDtmb3IoaT0wO2k8YTtpKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoaSkpKSYmaSsxPGEmJjU2MzIwPT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksaSsrKSxzKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PW5ldyBJbC5CdWY4KHMpLGk9bz0wO288cztpKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoaSkpKSYmaSsxPGEmJjU2MzIwPT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksaSsrKSxuPDEyOD90W28rK109bjoobjwyMDQ4P3RbbysrXT0xOTJ8bj4+PjY6KG48NjU1MzY/dFtvKytdPTIyNHxuPj4+MTI6KHRbbysrXT0yNDB8bj4+PjE4LHRbbysrXT0xMjh8bj4+PjEyJjYzKSx0W28rK109MTI4fG4+Pj42JjYzKSx0W28rK109MTI4fDYzJm4pO3JldHVybiB0fSxidWYyYmluc3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB3ZihlLGUubGVuZ3RoKX0sYmluc3RyaW5nMmJ1ZjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9bmV3IElsLkJ1ZjgoZS5sZW5ndGgpLG49MCxyPXQubGVuZ3RoO248cjtuKyspdFtuXT1lLmNoYXJDb2RlQXQobik7cmV0dXJuIHR9LGJ1ZjJzdHJpbmc6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhPXR8fGUubGVuZ3RoLHM9bmV3IEFycmF5KDIqYSk7Zm9yKG49cj0wO248YTspaWYoKGk9ZVtuKytdKTwxMjgpc1tyKytdPWk7ZWxzZSBpZig0PChvPV9mW2ldKSlzW3IrK109NjU1MzMsbis9by0xO2Vsc2V7Zm9yKGkmPTI9PT1vPzMxOjM9PT1vPzE1Ojc7MTxvJiZuPGE7KWk9aTw8Nnw2MyZlW24rK10sby0tOzE8bz9zW3IrK109NjU1MzM6aTw2NTUzNj9zW3IrK109aTooaS09NjU1MzYsc1tyKytdPTU1Mjk2fGk+PjEwJjEwMjMsc1tyKytdPTU2MzIwfDEwMjMmaSl9cmV0dXJuIHdmKHMscil9LHV0Zjhib3JkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IoKHQ9dHx8ZS5sZW5ndGgpPmUubGVuZ3RoJiYodD1lLmxlbmd0aCksbj10LTE7MDw9biYmMTI4PT0oMTkyJmVbbl0pOyluLS07cmV0dXJuIG48MD90OjA9PT1uP3Q6bitfZltlW25dXT50P246dH19O3ZhciBTZj1mdW5jdGlvbigpe3RoaXMuaW5wdXQ9bnVsbCx0aGlzLm5leHRfaW49MCx0aGlzLmF2YWlsX2luPTAsdGhpcy50b3RhbF9pbj0wLHRoaXMub3V0cHV0PW51bGwsdGhpcy5uZXh0X291dD0wLHRoaXMuYXZhaWxfb3V0PTAsdGhpcy50b3RhbF9vdXQ9MCx0aGlzLm1zZz0iIix0aGlzLnN0YXRlPW51bGwsdGhpcy5kYXRhX3R5cGU9Mix0aGlzLmFkbGVyPTB9LHhmPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsQ2Y9MCxUZj0tMSxPZj0wLEVmPTg7ZnVuY3Rpb24gSWYoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgSWYpKXJldHVybiBuZXcgSWYoZSk7dGhpcy5vcHRpb25zPUlsLmFzc2lnbih7bGV2ZWw6VGYsbWV0aG9kOkVmLGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6T2YsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJjA8dC53aW5kb3dCaXRzP3Qud2luZG93Qml0cz0tdC53aW5kb3dCaXRzOnQuZ3ppcCYmMDx0LndpbmRvd0JpdHMmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cys9MTYpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IFNmLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbj1nZi5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLHQubGV2ZWwsdC5tZXRob2QsdC53aW5kb3dCaXRzLHQubWVtTGV2ZWwsdC5zdHJhdGVneSk7aWYobiE9PUNmKXRocm93IG5ldyBFcnJvcihJZFtuXSk7aWYodC5oZWFkZXImJmdmLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLHQuaGVhZGVyKSx0LmRpY3Rpb25hcnkpe3ZhciByO2lmKHI9InN0cmluZyI9PXR5cGVvZiB0LmRpY3Rpb25hcnk/a2Yuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT14Zi5jYWxsKHQuZGljdGlvbmFyeSk/bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KTp0LmRpY3Rpb25hcnksKG49Z2YuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHIpKSE9PUNmKXRocm93IG5ldyBFcnJvcihJZFtuXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIEFmKGUsdCl7dmFyIG49bmV3IElmKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8SWRbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1JZi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzLnN0cm0sbz10aGlzLm9wdGlvbnMuY2h1bmtTaXplO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7cj10PT09fn50P3Q6ITA9PT10PzQ6MCwic3RyaW5nIj09dHlwZW9mIGU/aS5pbnB1dD1rZi5zdHJpbmcyYnVmKGUpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT14Zi5jYWxsKGUpP2kuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6aS5pbnB1dD1lLGkubmV4dF9pbj0wLGkuYXZhaWxfaW49aS5pbnB1dC5sZW5ndGg7ZG97aWYoMD09PWkuYXZhaWxfb3V0JiYoaS5vdXRwdXQ9bmV3IElsLkJ1ZjgobyksaS5uZXh0X291dD0wLGkuYXZhaWxfb3V0PW8pLDEhPT0obj1nZi5kZWZsYXRlKGkscikpJiZuIT09Q2YpcmV0dXJuIHRoaXMub25FbmQobiksISh0aGlzLmVuZGVkPSEwKTswIT09aS5hdmFpbF9vdXQmJigwIT09aS5hdmFpbF9pbnx8NCE9PXImJjIhPT1yKXx8KCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMub25EYXRhKGtmLmJ1ZjJiaW5zdHJpbmcoSWwuc2hyaW5rQnVmKGkub3V0cHV0LGkubmV4dF9vdXQpKSk6dGhpcy5vbkRhdGEoSWwuc2hyaW5rQnVmKGkub3V0cHV0LGkubmV4dF9vdXQpKSl9d2hpbGUoKDA8aS5hdmFpbF9pbnx8MD09PWkuYXZhaWxfb3V0KSYmMSE9PW4pO3JldHVybiA0PT09cj8obj1nZi5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1DZik6MiE9PXJ8fCh0aGlzLm9uRW5kKENmKSwhKGkuYXZhaWxfb3V0PTApKX0sSWYucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxJZi5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PUNmJiYoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9SWwuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307dmFyICRmPXtEZWZsYXRlOklmLGRlZmxhdGU6QWYsZGVmbGF0ZVJhdzpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAsQWYoZSx0KX0sZ3ppcDpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5nemlwPSEwLEFmKGUsdCl9fSxQZj1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGYscCxoLHYsZyxtLHksXyxiLHcsayxTLHgsQyxUO249ZS5zdGF0ZSxyPWUubmV4dF9pbixDPWUuaW5wdXQsaT1yKyhlLmF2YWlsX2luLTUpLG89ZS5uZXh0X291dCxUPWUub3V0cHV0LGE9by0odC1lLmF2YWlsX291dCkscz1vKyhlLmF2YWlsX291dC0yNTcpLGM9bi5kbWF4LHU9bi53c2l6ZSxsPW4ud2hhdmUsZD1uLnduZXh0LGY9bi53aW5kb3cscD1uLmhvbGQsaD1uLmJpdHMsdj1uLmxlbmNvZGUsZz1uLmRpc3Rjb2RlLG09KDE8PG4ubGVuYml0cyktMSx5PSgxPDxuLmRpc3RiaXRzKS0xO2U6ZG97aDwxNSYmKHArPUNbcisrXTw8aCxoKz04LHArPUNbcisrXTw8aCxoKz04KSxfPXZbcCZtXTt0OmZvcig7Oyl7aWYocD4+Pj1iPV8+Pj4yNCxoLT1iLDA9PT0oYj1fPj4+MTYmMjU1KSlUW28rK109NjU1MzUmXztlbHNle2lmKCEoMTYmYikpe2lmKDA9PSg2NCZiKSl7Xz12Wyg2NTUzNSZfKSsocCYoMTw8YiktMSldO2NvbnRpbnVlIHR9aWYoMzImYil7bi5tb2RlPTEyO2JyZWFrIGV9ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPTMwO2JyZWFrIGV9dz02NTUzNSZfLChiJj0xNSkmJihoPGImJihwKz1DW3IrK108PGgsaCs9OCksdys9cCYoMTw8YiktMSxwPj4+PWIsaC09YiksaDwxNSYmKHArPUNbcisrXTw8aCxoKz04LHArPUNbcisrXTw8aCxoKz04KSxfPWdbcCZ5XTtuOmZvcig7Oyl7aWYocD4+Pj1iPV8+Pj4yNCxoLT1iLCEoMTYmKGI9Xz4+PjE2JjI1NSkpKXtpZigwPT0oNjQmYikpe189Z1soNjU1MzUmXykrKHAmKDE8PGIpLTEpXTtjb250aW51ZSBufWUubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT0zMDticmVhayBlfWlmKGs9NjU1MzUmXyxoPChiJj0xNSkmJihwKz1DW3IrK108PGgsKGgrPTgpPGImJihwKz1DW3IrK108PGgsaCs9OCkpLGM8KGsrPXAmKDE8PGIpLTEpKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVhayBlfWlmKHA+Pj49YixoLT1iLChiPW8tYSk8ayl7aWYobDwoYj1rLWIpJiZuLnNhbmUpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPTMwO2JyZWFrIGV9aWYoeD1mLChTPTApPT09ZCl7aWYoUys9dS1iLGI8dyl7Zm9yKHctPWI7VFtvKytdPWZbUysrXSwtLWI7KTtTPW8tayx4PVR9fWVsc2UgaWYoZDxiKXtpZihTKz11K2QtYiwoYi09ZCk8dyl7Zm9yKHctPWI7VFtvKytdPWZbUysrXSwtLWI7KTtpZihTPTAsZDx3KXtmb3Iody09Yj1kO1RbbysrXT1mW1MrK10sLS1iOyk7Uz1vLWsseD1UfX19ZWxzZSBpZihTKz1kLWIsYjx3KXtmb3Iody09YjtUW28rK109ZltTKytdLC0tYjspO1M9by1rLHg9VH1mb3IoOzI8dzspVFtvKytdPXhbUysrXSxUW28rK109eFtTKytdLFRbbysrXT14W1MrK10sdy09Mzt3JiYoVFtvKytdPXhbUysrXSwxPHcmJihUW28rK109eFtTKytdKSl9ZWxzZXtmb3IoUz1vLWs7VFtvKytdPVRbUysrXSxUW28rK109VFtTKytdLFRbbysrXT1UW1MrK10sMjwody09Myk7KTt3JiYoVFtvKytdPVRbUysrXSwxPHcmJihUW28rK109VFtTKytdKSl9YnJlYWt9fWJyZWFrfX13aGlsZShyPGkmJm88cyk7ci09dz1oPj4zLHAmPSgxPDwoaC09dzw8MykpLTEsZS5uZXh0X2luPXIsZS5uZXh0X291dD1vLGUuYXZhaWxfaW49cjxpP2ktcis1OjUtKHItaSksZS5hdmFpbF9vdXQ9bzxzP3MtbysyNTc6MjU3LShvLXMpLG4uaG9sZD1wLG4uYml0cz1ofSxNZj1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLGpmPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sTmY9WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdLEJmPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0sTGY9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt2YXIgYyx1LGwsZCxmLHAsaCx2LGcsbT1zLmJpdHMseT0wLF89MCxiPTAsdz0wLGs9MCxTPTAseD0wLEM9MCxUPTAsTz0wLEU9bnVsbCxJPTAsQT1uZXcgSWwuQnVmMTYoMTYpLCQ9bmV3IElsLkJ1ZjE2KDE2KSxQPW51bGwsTT0wO2Zvcih5PTA7eTw9MTU7eSsrKUFbeV09MDtmb3IoXz0wO188cjtfKyspQVt0W24rX11dKys7Zm9yKGs9bSx3PTE1OzE8PXcmJjA9PT1BW3ddO3ctLSk7aWYodzxrJiYoaz13KSwwPT09dylyZXR1cm4gaVtvKytdPTIwOTcxNTIwLGlbbysrXT0yMDk3MTUyMCxzLmJpdHM9MSwwO2ZvcihiPTE7Yjx3JiYwPT09QVtiXTtiKyspO2ZvcihrPGImJihrPWIpLHk9Qz0xO3k8PTE1O3krKylpZihDPDw9MSwoQy09QVt5XSk8MClyZXR1cm4tMTtpZigwPEMmJigwPT09ZXx8MSE9PXcpKXJldHVybi0xO2ZvcigkWzFdPTAseT0xO3k8MTU7eSsrKSRbeSsxXT0kW3ldK0FbeV07Zm9yKF89MDtfPHI7XysrKTAhPT10W24rX10mJihhWyRbdFtuK19dXSsrXT1fKTtpZigwPT09ZT8oRT1QPWEscD0xOSk6MT09PWU/KEU9TWYsSS09MjU3LFA9amYsTS09MjU3LHA9MjU2KTooRT1OZixQPUJmLHA9LTEpLHk9YixmPW8seD1fPU89MCxsPS0xLGQ9KFQ9MTw8KFM9aykpLTEsMT09PWUmJjg1MjxUfHwyPT09ZSYmNTkyPFQpcmV0dXJuIDE7Zm9yKDs7KXtmb3IoaD15LXgsYVtfXTxwPyh2PTAsZz1hW19dKTphW19dPnA/KHY9UFtNK2FbX11dLGc9RVtJK2FbX11dKToodj05NixnPTApLGM9MTw8eS14LGI9dT0xPDxTO2lbZisoTz4+eCkrKHUtPWMpXT1oPDwyNHx2PDwxNnxnfDAsMCE9PXU7KTtmb3IoYz0xPDx5LTE7TyZjOyljPj49MTtpZigwIT09Yz8oTyY9Yy0xLE8rPWMpOk89MCxfKyssMD09LS1BW3ldKXtpZih5PT09dylicmVhazt5PXRbbithW19dXX1pZihrPHkmJihPJmQpIT09bCl7Zm9yKDA9PT14JiYoeD1rKSxmKz1iLEM9MTw8KFM9eS14KTtTK3g8dyYmISgoQy09QVtTK3hdKTw9MCk7KVMrKyxDPDw9MTtpZihUKz0xPDxTLDE9PT1lJiY4NTI8VHx8Mj09PWUmJjU5MjxUKXJldHVybiAxO2lbbD1PJmRdPWs8PDI0fFM8PDE2fGYtb3wwfX1yZXR1cm4gMCE9PU8mJihpW2YrT109eS14PDwyNHw2NDw8MTZ8MCkscy5iaXRzPWssMH0sRGY9MSxSZj0yLEZmPTAsVWY9LTIsemY9MSxWZj04NTIscWY9NTkyO2Z1bmN0aW9uIFdmKGUpe3JldHVybihlPj4+MjQmMjU1KSsoZT4+PjgmNjUyODApKygoNjUyODAmZSk8PDgpKygoMjU1JmUpPDwyNCl9ZnVuY3Rpb24gSGYoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IElsLkJ1ZjE2KDMyMCksdGhpcy53b3JrPW5ldyBJbC5CdWYxNigyODgpLHRoaXMubGVuZHluPW51bGwsdGhpcy5kaXN0ZHluPW51bGwsdGhpcy5zYW5lPTAsdGhpcy5iYWNrPTAsdGhpcy53YXM9MH1mdW5jdGlvbiBHZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8odD1lLnN0YXRlLGUudG90YWxfaW49ZS50b3RhbF9vdXQ9dC50b3RhbD0wLGUubXNnPSIiLHQud3JhcCYmKGUuYWRsZXI9MSZ0LndyYXApLHQubW9kZT16Zix0Lmxhc3Q9MCx0LmhhdmVkaWN0PTAsdC5kbWF4PTMyNzY4LHQuaGVhZD1udWxsLHQuaG9sZD0wLHQuYml0cz0wLHQubGVuY29kZT10LmxlbmR5bj1uZXcgSWwuQnVmMzIoVmYpLHQuZGlzdGNvZGU9dC5kaXN0ZHluPW5ldyBJbC5CdWYzMihxZiksdC5zYW5lPTEsdC5iYWNrPS0xLEZmKTpVZn1mdW5jdGlvbiBKZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oKHQ9ZS5zdGF0ZSkud3NpemU9MCx0LndoYXZlPTAsdC53bmV4dD0wLEdmKGUpKTpVZn1mdW5jdGlvbiBYZihlLHQpe3ZhciBuLHI7cmV0dXJuIGUmJmUuc3RhdGU/KHI9ZS5zdGF0ZSx0PDA/KG49MCx0PS10KToobj0xKyh0Pj40KSx0PDQ4JiYodCY9MTUpKSx0JiYodDw4fHwxNTx0KT9VZjoobnVsbCE9PXIud2luZG93JiZyLndiaXRzIT09dCYmKHIud2luZG93PW51bGwpLHIud3JhcD1uLHIud2JpdHM9dCxKZihlKSkpOlVmfWZ1bmN0aW9uIFlmKGUsdCl7dmFyIG4scjtyZXR1cm4gZT8ocj1uZXcgSGYsKGUuc3RhdGU9cikud2luZG93PW51bGwsKG49WGYoZSx0KSkhPT1GZiYmKGUuc3RhdGU9bnVsbCksbik6VWZ9dmFyIEtmLFpmLFFmPSEwO2Z1bmN0aW9uIGVwKGUpe2lmKFFmKXt2YXIgdDtmb3IoS2Y9bmV3IElsLkJ1ZjMyKDUxMiksWmY9bmV3IElsLkJ1ZjMyKDMyKSx0PTA7dDwxNDQ7KWUubGVuc1t0KytdPTg7Zm9yKDt0PDI1NjspZS5sZW5zW3QrK109OTtmb3IoO3Q8MjgwOyllLmxlbnNbdCsrXT03O2Zvcig7dDwyODg7KWUubGVuc1t0KytdPTg7Zm9yKExmKERmLGUubGVucywwLDI4OCxLZiwwLGUud29yayx7Yml0czo5fSksdD0wO3Q8MzI7KWUubGVuc1t0KytdPTU7TGYoUmYsZS5sZW5zLDAsMzIsWmYsMCxlLndvcmsse2JpdHM6NX0pLFFmPSExfWUubGVuY29kZT1LZixlLmxlbmJpdHM9OSxlLmRpc3Rjb2RlPVpmLGUuZGlzdGJpdHM9NX1mdW5jdGlvbiB0cChlLHQsbixyKXt2YXIgaSxvPWUuc3RhdGU7cmV0dXJuIG51bGw9PT1vLndpbmRvdyYmKG8ud3NpemU9MTw8by53Yml0cyxvLnduZXh0PTAsby53aGF2ZT0wLG8ud2luZG93PW5ldyBJbC5CdWY4KG8ud3NpemUpKSxyPj1vLndzaXplPyhJbC5hcnJheVNldChvLndpbmRvdyx0LG4tby53c2l6ZSxvLndzaXplLDApLG8ud25leHQ9MCxvLndoYXZlPW8ud3NpemUpOihyPChpPW8ud3NpemUtby53bmV4dCkmJihpPXIpLElsLmFycmF5U2V0KG8ud2luZG93LHQsbi1yLGksby53bmV4dCksKHItPWkpPyhJbC5hcnJheVNldChvLndpbmRvdyx0LG4tcixyLDApLG8ud25leHQ9cixvLndoYXZlPW8ud3NpemUpOihvLnduZXh0Kz1pLG8ud25leHQ9PT1vLndzaXplJiYoby53bmV4dD0wKSxvLndoYXZlPG8ud3NpemUmJihvLndoYXZlKz1pKSkpLDB9dmFyIG5wPXtpbmZsYXRlUmVzZXQ6SmYsaW5mbGF0ZVJlc2V0MjpYZixpbmZsYXRlUmVzZXRLZWVwOkdmLGluZmxhdGVJbml0OmZ1bmN0aW9uKGUpe3JldHVybiBZZihlLDE1KX0saW5mbGF0ZUluaXQyOllmLGluZmxhdGU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsYyx1LGwsZCxmLHAsaCx2LGcsbSx5LF8sYix3LGssUyx4LEMsVD0wLE89bmV3IElsLkJ1ZjgoNCksRT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIWV8fCFlLnN0YXRlfHwhZS5vdXRwdXR8fCFlLmlucHV0JiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gVWY7MTI9PT0obj1lLnN0YXRlKS5tb2RlJiYobi5tb2RlPTEzKSxhPWUubmV4dF9vdXQsaT1lLm91dHB1dCxjPWUuYXZhaWxfb3V0LG89ZS5uZXh0X2luLHI9ZS5pbnB1dCxzPWUuYXZhaWxfaW4sdT1uLmhvbGQsbD1uLmJpdHMsZD1zLGY9YyxTPUZmO2U6Zm9yKDs7KXN3aXRjaChuLm1vZGUpe2Nhc2UgemY6aWYoMD09PW4ud3JhcCl7bi5tb2RlPTEzO2JyZWFrfWZvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKDImbi53cmFwJiYzNTYxNT09PXUpe09bbi5jaGVjaz0wXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPUVkKG4uY2hlY2ssTywyLDApLGw9dT0wLG4ubW9kZT0yO2JyZWFrfWlmKG4uZmxhZ3M9MCxuLmhlYWQmJihuLmhlYWQuZG9uZT0hMSksISgxJm4ud3JhcCl8fCgoKDI1NSZ1KTw8OCkrKHU+PjgpKSUzMSl7ZS5tc2c9ImluY29ycmVjdCBoZWFkZXIgY2hlY2siLG4ubW9kZT0zMDticmVha31pZig4IT0oMTUmdSkpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPTMwO2JyZWFrfWlmKGwtPTQsaz04KygxNSYodT4+Pj00KSksMD09PW4ud2JpdHMpbi53Yml0cz1rO2Vsc2UgaWYoaz5uLndiaXRzKXtlLm1zZz0iaW52YWxpZCB3aW5kb3cgc2l6ZSIsbi5tb2RlPTMwO2JyZWFrfW4uZG1heD0xPDxrLGUuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT01MTImdT8xMDoxMixsPXU9MDticmVhaztjYXNlIDI6Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobi5mbGFncz11LDghPSgyNTUmbi5mbGFncykpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPTMwO2JyZWFrfWlmKDU3MzQ0Jm4uZmxhZ3Mpe2UubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLG4ubW9kZT0zMDticmVha31uLmhlYWQmJihuLmhlYWQudGV4dD11Pj44JjEpLDUxMiZuLmZsYWdzJiYoT1swXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPUVkKG4uY2hlY2ssTywyLDApKSxsPXU9MCxuLm1vZGU9MztjYXNlIDM6Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bi5oZWFkJiYobi5oZWFkLnRpbWU9dSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LE9bMl09dT4+PjE2JjI1NSxPWzNdPXU+Pj4yNCYyNTUsbi5jaGVjaz1FZChuLmNoZWNrLE8sNCwwKSksbD11PTAsbi5tb2RlPTQ7Y2FzZSA0OmZvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4uaGVhZCYmKG4uaGVhZC54ZmxhZ3M9MjU1JnUsbi5oZWFkLm9zPXU+PjgpLDUxMiZuLmZsYWdzJiYoT1swXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPUVkKG4uY2hlY2ssTywyLDApKSxsPXU9MCxuLm1vZGU9NTtjYXNlIDU6aWYoMTAyNCZuLmZsYWdzKXtmb3IoO2w8MTY7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmxlbmd0aD11LG4uaGVhZCYmKG4uaGVhZC5leHRyYV9sZW49dSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9RWQobi5jaGVjayxPLDIsMCkpLGw9dT0wfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmV4dHJhPW51bGwpO24ubW9kZT02O2Nhc2UgNjppZigxMDI0Jm4uZmxhZ3MmJihzPChwPW4ubGVuZ3RoKSYmKHA9cykscCYmKG4uaGVhZCYmKGs9bi5oZWFkLmV4dHJhX2xlbi1uLmxlbmd0aCxuLmhlYWQuZXh0cmF8fChuLmhlYWQuZXh0cmE9bmV3IEFycmF5KG4uaGVhZC5leHRyYV9sZW4pKSxJbC5hcnJheVNldChuLmhlYWQuZXh0cmEscixvLHAsaykpLDUxMiZuLmZsYWdzJiYobi5jaGVjaz1FZChuLmNoZWNrLHIscCxvKSkscy09cCxvKz1wLG4ubGVuZ3RoLT1wKSxuLmxlbmd0aCkpYnJlYWsgZTtuLmxlbmd0aD0wLG4ubW9kZT03O2Nhc2UgNzppZigyMDQ4Jm4uZmxhZ3Mpe2lmKDA9PT1zKWJyZWFrIGU7Zm9yKHA9MDtrPXJbbytwKytdLG4uaGVhZCYmayYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShrKSksayYmcDxzOyk7aWYoNTEyJm4uZmxhZ3MmJihuLmNoZWNrPUVkKG4uY2hlY2sscixwLG8pKSxzLT1wLG8rPXAsaylicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLm5hbWU9bnVsbCk7bi5sZW5ndGg9MCxuLm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZuLmZsYWdzKXtpZigwPT09cylicmVhayBlO2ZvcihwPTA7az1yW28rcCsrXSxuLmhlYWQmJmsmJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUoaykpLGsmJnA8czspO2lmKDUxMiZuLmZsYWdzJiYobi5jaGVjaz1FZChuLmNoZWNrLHIscCxvKSkscy09cCxvKz1wLGspYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5jb21tZW50PW51bGwpO24ubW9kZT05O2Nhc2UgOTppZig1MTImbi5mbGFncyl7Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodSE9PSg2NTUzNSZuLmNoZWNrKSl7ZS5tc2c9ImhlYWRlciBjcmMgbWlzbWF0Y2giLG4ubW9kZT0zMDticmVha31sPXU9MH1uLmhlYWQmJihuLmhlYWQuaGNyYz1uLmZsYWdzPj45JjEsbi5oZWFkLmRvbmU9ITApLGUuYWRsZXI9bi5jaGVjaz0wLG4ubW9kZT0xMjticmVhaztjYXNlIDEwOmZvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWUuYWRsZXI9bi5jaGVjaz1XZih1KSxsPXU9MCxuLm1vZGU9MTE7Y2FzZSAxMTppZigwPT09bi5oYXZlZGljdClyZXR1cm4gZS5uZXh0X291dD1hLGUuYXZhaWxfb3V0PWMsZS5uZXh0X2luPW8sZS5hdmFpbF9pbj1zLG4uaG9sZD11LG4uYml0cz1sLDI7ZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPTEyO2Nhc2UgMTI6aWYoNT09PXR8fDY9PT10KWJyZWFrIGU7Y2FzZSAxMzppZihuLmxhc3Qpe3U+Pj49NyZsLGwtPTcmbCxuLm1vZGU9Mjc7YnJlYWt9Zm9yKDtsPDM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1zd2l0Y2gobi5sYXN0PTEmdSxsLT0xLDMmKHU+Pj49MSkpe2Nhc2UgMDpuLm1vZGU9MTQ7YnJlYWs7Y2FzZSAxOmlmKGVwKG4pLG4ubW9kZT0yMCw2PT09dCl7dT4+Pj0yLGwtPTI7YnJlYWsgZX1icmVhaztjYXNlIDI6bi5tb2RlPTE3O2JyZWFrO2Nhc2UgMzplLm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixuLm1vZGU9MzB9dT4+Pj0yLGwtPTI7YnJlYWs7Y2FzZSAxNDpmb3IodT4+Pj03JmwsbC09NyZsO2w8MzI7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZigoNjU1MzUmdSkhPSh1Pj4+MTZeNjU1MzUpKXtlLm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsbi5tb2RlPTMwO2JyZWFrfWlmKG4ubGVuZ3RoPTY1NTM1JnUsbD11PTAsbi5tb2RlPTE1LDY9PT10KWJyZWFrIGU7Y2FzZSAxNTpuLm1vZGU9MTY7Y2FzZSAxNjppZihwPW4ubGVuZ3RoKXtpZihzPHAmJihwPXMpLGM8cCYmKHA9YyksMD09PXApYnJlYWsgZTtJbC5hcnJheVNldChpLHIsbyxwLGEpLHMtPXAsbys9cCxjLT1wLGErPXAsbi5sZW5ndGgtPXA7YnJlYWt9bi5tb2RlPTEyO2JyZWFrO2Nhc2UgMTc6Zm9yKDtsPDE0Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobi5ubGVuPTI1NysoMzEmdSksdT4+Pj01LGwtPTUsbi5uZGlzdD0xKygzMSZ1KSx1Pj4+PTUsbC09NSxuLm5jb2RlPTQrKDE1JnUpLHU+Pj49NCxsLT00LDI4NjxuLm5sZW58fDMwPG4ubmRpc3Qpe2UubXNnPSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyIsbi5tb2RlPTMwO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT0xODtjYXNlIDE4OmZvcig7bi5oYXZlPG4ubmNvZGU7KXtmb3IoO2w8Mzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ubGVuc1tFW24uaGF2ZSsrXV09NyZ1LHU+Pj49MyxsLT0zfWZvcig7bi5oYXZlPDE5OyluLmxlbnNbRVtuLmhhdmUrK11dPTA7aWYobi5sZW5jb2RlPW4ubGVuZHluLG4ubGVuYml0cz03LHg9e2JpdHM6bi5sZW5iaXRzfSxTPUxmKDAsbi5sZW5zLDAsMTksbi5sZW5jb2RlLDAsbi53b3JrLHgpLG4ubGVuYml0cz14LmJpdHMsUyl7ZS5tc2c9ImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsbi5tb2RlPTMwO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT0xOTtjYXNlIDE5OmZvcig7bi5oYXZlPG4ubmxlbituLm5kaXN0Oyl7Zm9yKDttPShUPW4ubGVuY29kZVt1JigxPDxuLmxlbmJpdHMpLTFdKT4+PjE2JjI1NSx5PTY1NTM1JlQsISgoZz1UPj4+MjQpPD1sKTspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKHk8MTYpdT4+Pj1nLGwtPWcsbi5sZW5zW24uaGF2ZSsrXT15O2Vsc2V7aWYoMTY9PT15KXtmb3IoQz1nKzI7bDxDOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodT4+Pj1nLGwtPWcsMD09PW4uaGF2ZSl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT0zMDticmVha31rPW4ubGVuc1tuLmhhdmUtMV0scD0zKygzJnUpLHU+Pj49MixsLT0yfWVsc2UgaWYoMTc9PT15KXtmb3IoQz1nKzM7bDxDOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bC09ZyxrPTAscD0zKyg3Jih1Pj4+PWcpKSx1Pj4+PTMsbC09M31lbHNle2ZvcihDPWcrNztsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1sLT1nLGs9MCxwPTExKygxMjcmKHU+Pj49ZykpLHU+Pj49NyxsLT03fWlmKG4uaGF2ZStwPm4ubmxlbituLm5kaXN0KXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPTMwO2JyZWFrfWZvcig7cC0tOyluLmxlbnNbbi5oYXZlKytdPWt9fWlmKDMwPT09bi5tb2RlKWJyZWFrO2lmKDA9PT1uLmxlbnNbMjU2XSl7ZS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsbi5tb2RlPTMwO2JyZWFrfWlmKG4ubGVuYml0cz05LHg9e2JpdHM6bi5sZW5iaXRzfSxTPUxmKERmLG4ubGVucywwLG4ubmxlbixuLmxlbmNvZGUsMCxuLndvcmsseCksbi5sZW5iaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IixuLm1vZGU9MzA7YnJlYWt9aWYobi5kaXN0Yml0cz02LG4uZGlzdGNvZGU9bi5kaXN0ZHluLHg9e2JpdHM6bi5kaXN0Yml0c30sUz1MZihSZixuLmxlbnMsbi5ubGVuLG4ubmRpc3Qsbi5kaXN0Y29kZSwwLG4ud29yayx4KSxuLmRpc3RiaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixuLm1vZGU9MzA7YnJlYWt9aWYobi5tb2RlPTIwLDY9PT10KWJyZWFrIGU7Y2FzZSAyMDpuLm1vZGU9MjE7Y2FzZSAyMTppZig2PD1zJiYyNTg8PWMpe2UubmV4dF9vdXQ9YSxlLmF2YWlsX291dD1jLGUubmV4dF9pbj1vLGUuYXZhaWxfaW49cyxuLmhvbGQ9dSxuLmJpdHM9bCxQZihlLGYpLGE9ZS5uZXh0X291dCxpPWUub3V0cHV0LGM9ZS5hdmFpbF9vdXQsbz1lLm5leHRfaW4scj1lLmlucHV0LHM9ZS5hdmFpbF9pbix1PW4uaG9sZCxsPW4uYml0cywxMj09PW4ubW9kZSYmKG4uYmFjaz0tMSk7YnJlYWt9Zm9yKG4uYmFjaz0wO209KFQ9bi5sZW5jb2RlW3UmKDE8PG4ubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobSYmMD09KDI0MCZtKSl7Zm9yKF89ZyxiPW0sdz15O209KFQ9bi5sZW5jb2RlW3crKCh1JigxPDxfK2IpLTEpPj5fKV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKF8rKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH11Pj4+PV8sbC09XyxuLmJhY2srPV99aWYodT4+Pj1nLGwtPWcsbi5iYWNrKz1nLG4ubGVuZ3RoPXksMD09PW0pe24ubW9kZT0yNjticmVha31pZigzMiZtKXtuLmJhY2s9LTEsbi5tb2RlPTEyO2JyZWFrfWlmKDY0Jm0pe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLG4ubW9kZT0zMDticmVha31uLmV4dHJhPTE1Jm0sbi5tb2RlPTIyO2Nhc2UgMjI6aWYobi5leHRyYSl7Zm9yKEM9bi5leHRyYTtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmxlbmd0aCs9dSYoMTw8bi5leHRyYSktMSx1Pj4+PW4uZXh0cmEsbC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9bi53YXM9bi5sZW5ndGgsbi5tb2RlPTIzO2Nhc2UgMjM6Zm9yKDttPShUPW4uZGlzdGNvZGVbdSYoMTw8bi5kaXN0Yml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYoMD09KDI0MCZtKSl7Zm9yKF89ZyxiPW0sdz15O209KFQ9bi5kaXN0Y29kZVt3KygodSYoMTw8XytiKS0xKT4+XyldKT4+PjE2JjI1NSx5PTY1NTM1JlQsIShfKyhnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9dT4+Pj1fLGwtPV8sbi5iYWNrKz1ffWlmKHU+Pj49ZyxsLT1nLG4uYmFjays9Zyw2NCZtKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixuLm1vZGU9MzA7YnJlYWt9bi5vZmZzZXQ9eSxuLmV4dHJhPTE1Jm0sbi5tb2RlPTI0O2Nhc2UgMjQ6aWYobi5leHRyYSl7Zm9yKEM9bi5leHRyYTtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLm9mZnNldCs9dSYoMTw8bi5leHRyYSktMSx1Pj4+PW4uZXh0cmEsbC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9aWYobi5vZmZzZXQ+bi5kbWF4KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVha31uLm1vZGU9MjU7Y2FzZSAyNTppZigwPT09YylicmVhayBlO2lmKHA9Zi1jLG4ub2Zmc2V0PnApe2lmKChwPW4ub2Zmc2V0LXApPm4ud2hhdmUmJm4uc2FuZSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9MzA7YnJlYWt9cD5uLnduZXh0PyhwLT1uLnduZXh0LGg9bi53c2l6ZS1wKTpoPW4ud25leHQtcCxwPm4ubGVuZ3RoJiYocD1uLmxlbmd0aCksdj1uLndpbmRvd31lbHNlIHY9aSxoPWEtbi5vZmZzZXQscD1uLmxlbmd0aDtmb3IoYzxwJiYocD1jKSxjLT1wLG4ubGVuZ3RoLT1wO2lbYSsrXT12W2grK10sLS1wOyk7MD09PW4ubGVuZ3RoJiYobi5tb2RlPTIxKTticmVhaztjYXNlIDI2OmlmKDA9PT1jKWJyZWFrIGU7aVthKytdPW4ubGVuZ3RoLGMtLSxuLm1vZGU9MjE7YnJlYWs7Y2FzZSAyNzppZihuLndyYXApe2Zvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHV8PXJbbysrXTw8bCxsKz04fWlmKGYtPWMsZS50b3RhbF9vdXQrPWYsbi50b3RhbCs9ZixmJiYoZS5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/RWQobi5jaGVjayxpLGYsYS1mKTpDZChuLmNoZWNrLGksZixhLWYpKSxmPWMsKG4uZmxhZ3M/dTpXZih1KSkhPT1uLmNoZWNrKXtlLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLG4ubW9kZT0zMDticmVha31sPXU9MH1uLm1vZGU9Mjg7Y2FzZSAyODppZihuLndyYXAmJm4uZmxhZ3Mpe2Zvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKHUhPT0oNDI5NDk2NzI5NSZuLnRvdGFsKSl7ZS5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLG4ubW9kZT0zMDticmVha31sPXU9MH1uLm1vZGU9Mjk7Y2FzZSAyOTpTPTE7YnJlYWsgZTtjYXNlIDMwOlM9LTM7YnJlYWsgZTtjYXNlIDMxOnJldHVybi00O2Nhc2UgMzI6ZGVmYXVsdDpyZXR1cm4gVWZ9cmV0dXJuIGUubmV4dF9vdXQ9YSxlLmF2YWlsX291dD1jLGUubmV4dF9pbj1vLGUuYXZhaWxfaW49cyxuLmhvbGQ9dSxuLmJpdHM9bCwobi53c2l6ZXx8ZiE9PWUuYXZhaWxfb3V0JiZuLm1vZGU8MzAmJihuLm1vZGU8Mjd8fDQhPT10KSkmJnRwKGUsZS5vdXRwdXQsZS5uZXh0X291dCxmLWUuYXZhaWxfb3V0KSxkLT1lLmF2YWlsX2luLGYtPWUuYXZhaWxfb3V0LGUudG90YWxfaW4rPWQsZS50b3RhbF9vdXQrPWYsbi50b3RhbCs9ZixuLndyYXAmJmYmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz9FZChuLmNoZWNrLGksZixlLm5leHRfb3V0LWYpOkNkKG4uY2hlY2ssaSxmLGUubmV4dF9vdXQtZikpLGUuZGF0YV90eXBlPW4uYml0cysobi5sYXN0PzY0OjApKygxMj09PW4ubW9kZT8xMjg6MCkrKDIwPT09bi5tb2RlfHwxNT09PW4ubW9kZT8yNTY6MCksKDA9PT1kJiYwPT09Znx8ND09PXQpJiZTPT09RmYmJihTPS01KSxTfSxpbmZsYXRlRW5kOmZ1bmN0aW9uKGUpe2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gVWY7dmFyIHQ9ZS5zdGF0ZTtyZXR1cm4gdC53aW5kb3cmJih0LndpbmRvdz1udWxsKSxlLnN0YXRlPW51bGwsRmZ9LGluZmxhdGVHZXRIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gZSYmZS5zdGF0ZT8wPT0oMiYobj1lLnN0YXRlKS53cmFwKT9VZjooKG4uaGVhZD10KS5kb25lPSExLEZmKTpVZn0saW5mbGF0ZVNldERpY3Rpb25hcnk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXQubGVuZ3RoO3JldHVybiBlJiZlLnN0YXRlPzAhPT0obj1lLnN0YXRlKS53cmFwJiYxMSE9PW4ubW9kZT9VZjoxMT09PW4ubW9kZSYmQ2QoMSx0LHIsMCkhPT1uLmNoZWNrPy0zOnRwKGUsdCxyLHIpPyhuLm1vZGU9MzEsLTQpOihuLmhhdmVkaWN0PTEsRmYpOlVmfSxpbmZsYXRlSW5mbzoicGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LHJwPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9O3ZhciBpcD1mdW5jdGlvbigpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfSxvcD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIGFwKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGFwKSlyZXR1cm4gbmV3IGFwKGUpO3RoaXMub3B0aW9ucz1JbC5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJjA8PXQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHMsMD09PXQud2luZG93Qml0cyYmKHQud2luZG93Qml0cz0tMTUpKSwhKDA8PXQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2KXx8ZSYmZS53aW5kb3dCaXRzfHwodC53aW5kb3dCaXRzKz0zMiksMTU8dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8NDgmJjA9PSgxNSZ0LndpbmRvd0JpdHMpJiYodC53aW5kb3dCaXRzfD0xNSksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgU2YsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPW5wLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sdC53aW5kb3dCaXRzKTtpZihuIT09cnAuWl9PSyl0aHJvdyBuZXcgRXJyb3IoSWRbbl0pO2lmKHRoaXMuaGVhZGVyPW5ldyBpcCxucC5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSx0aGlzLmhlYWRlciksdC5kaWN0aW9uYXJ5JiYoInN0cmluZyI9PXR5cGVvZiB0LmRpY3Rpb25hcnk/dC5kaWN0aW9uYXJ5PWtmLnN0cmluZzJidWYodC5kaWN0aW9uYXJ5KToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09b3AuY2FsbCh0LmRpY3Rpb25hcnkpJiYodC5kaWN0aW9uYXJ5PW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSkpLHQucmF3JiYobj1ucC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdC5kaWN0aW9uYXJ5KSkhPT1ycC5aX09LKSl0aHJvdyBuZXcgRXJyb3IoSWRbbl0pfWZ1bmN0aW9uIHNwKGUsdCl7dmFyIG49bmV3IGFwKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8SWRbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1hcC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz10aGlzLnN0cm0sYz10aGlzLm9wdGlvbnMuY2h1bmtTaXplLHU9dGhpcy5vcHRpb25zLmRpY3Rpb25hcnksbD0hMTtpZih0aGlzLmVuZGVkKXJldHVybiExO3I9dD09PX5+dD90OiEwPT09dD9ycC5aX0ZJTklTSDpycC5aX05PX0ZMVVNILCJzdHJpbmciPT10eXBlb2YgZT9zLmlucHV0PWtmLmJpbnN0cmluZzJidWYoZSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PW9wLmNhbGwoZSk/cy5pbnB1dD1uZXcgVWludDhBcnJheShlKTpzLmlucHV0PWUscy5uZXh0X2luPTAscy5hdmFpbF9pbj1zLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09cy5hdmFpbF9vdXQmJihzLm91dHB1dD1uZXcgSWwuQnVmOChjKSxzLm5leHRfb3V0PTAscy5hdmFpbF9vdXQ9YyksKG49bnAuaW5mbGF0ZShzLHJwLlpfTk9fRkxVU0gpKT09PXJwLlpfTkVFRF9ESUNUJiZ1JiYobj1ucC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdSkpLG49PT1ycC5aX0JVRl9FUlJPUiYmITA9PT1sJiYobj1ycC5aX09LLGw9ITEpLG4hPT1ycC5aX1NUUkVBTV9FTkQmJm4hPT1ycC5aX09LKXJldHVybiB0aGlzLm9uRW5kKG4pLCEodGhpcy5lbmRlZD0hMCk7cy5uZXh0X291dCYmKDAhPT1zLmF2YWlsX291dCYmbiE9PXJwLlpfU1RSRUFNX0VORCYmKDAhPT1zLmF2YWlsX2lufHxyIT09cnAuWl9GSU5JU0gmJnIhPT1ycC5aX1NZTkNfRkxVU0gpfHwoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/KGk9a2YudXRmOGJvcmRlcihzLm91dHB1dCxzLm5leHRfb3V0KSxvPXMubmV4dF9vdXQtaSxhPWtmLmJ1ZjJzdHJpbmcocy5vdXRwdXQsaSkscy5uZXh0X291dD1vLHMuYXZhaWxfb3V0PWMtbyxvJiZJbC5hcnJheVNldChzLm91dHB1dCxzLm91dHB1dCxpLG8sMCksdGhpcy5vbkRhdGEoYSkpOnRoaXMub25EYXRhKElsLnNocmlua0J1ZihzLm91dHB1dCxzLm5leHRfb3V0KSkpKSwwPT09cy5hdmFpbF9pbiYmMD09PXMuYXZhaWxfb3V0JiYobD0hMCl9d2hpbGUoKDA8cy5hdmFpbF9pbnx8MD09PXMuYXZhaWxfb3V0KSYmbiE9PXJwLlpfU1RSRUFNX0VORCk7cmV0dXJuIG49PT1ycC5aX1NUUkVBTV9FTkQmJihyPXJwLlpfRklOSVNIKSxyPT09cnAuWl9GSU5JU0g/KG49bnAuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQobiksdGhpcy5lbmRlZD0hMCxuPT09cnAuWl9PSyk6ciE9PXJwLlpfU1lOQ19GTFVTSHx8KHRoaXMub25FbmQocnAuWl9PSyksIShzLmF2YWlsX291dD0wKSl9LGFwLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0sYXAucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1ycC5aX09LJiYoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9SWwuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307dmFyIGNwPXtJbmZsYXRlOmFwLGluZmxhdGU6c3AsaW5mbGF0ZVJhdzpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAsc3AoZSx0KX0sdW5nemlwOnNwfSx1cD17fTsoMCxJbC5hc3NpZ24pKHVwLCRmLGNwLHJwKTt2YXIgbHA9dXAsZHA9R3UoImNhbnZhc0V2ZW50Iik7ZnVuY3Rpb24gZnAoZSx0LG4scil7cmcucHVibGlzaEhhbmRsZXIodCsiLWNhbnZhcy0iK2Use2NhbnZhc0lkOmUsdHlwZTpuLGRhdGE6cn0sdCl9cmcuc3Vic2NyaWJlKCJvbkNhbnZhc01ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGEscj1kcC5wb3AodCk7ciYmcihuKX0pO3ZhciBwcD17YWxpY2VibHVlOiIjZjBmOGZmIixhbnRpcXVld2hpdGU6IiNmYWViZDciLGFxdWE6IiMwMGZmZmYiLGFxdWFtYXJpbmU6IiM3ZmZmZDQiLGF6dXJlOiIjZjBmZmZmIixiZWlnZToiI2Y1ZjVkYyIsYmlzcXVlOiIjZmZlNGM0IixibGFjazoiIzAwMDAwMCIsYmxhbmNoZWRhbG1vbmQ6IiNmZmViY2QiLGJsdWU6IiMwMDAwZmYiLGJsdWV2aW9sZXQ6IiM4YTJiZTIiLGJyb3duOiIjYTUyYTJhIixidXJseXdvb2Q6IiNkZWI4ODciLGNhZGV0Ymx1ZToiIzVmOWVhMCIsY2hhcnRyZXVzZToiIzdmZmYwMCIsY2hvY29sYXRlOiIjZDI2OTFlIixjb3JhbDoiI2ZmN2Y1MCIsY29ybmZsb3dlcmJsdWU6IiM2NDk1ZWQiLGNvcm5zaWxrOiIjZmZmOGRjIixjcmltc29uOiIjZGMxNDNjIixjeWFuOiIjMDBmZmZmIixkYXJrYmx1ZToiIzAwMDA4YiIsZGFya2N5YW46IiMwMDhiOGIiLGRhcmtnb2xkZW5yb2Q6IiNiODg2MGIiLGRhcmtncmF5OiIjYTlhOWE5IixkYXJrZ3JleToiI2E5YTlhOSIsZGFya2dyZWVuOiIjMDA2NDAwIixkYXJra2hha2k6IiNiZGI3NmIiLGRhcmttYWdlbnRhOiIjOGIwMDhiIixkYXJrb2xpdmVncmVlbjoiIzU1NmIyZiIsZGFya29yYW5nZToiI2ZmOGMwMCIsZGFya29yY2hpZDoiIzk5MzJjYyIsZGFya3JlZDoiIzhiMDAwMCIsZGFya3NhbG1vbjoiI2U5OTY3YSIsZGFya3NlYWdyZWVuOiIjOGZiYzhmIixkYXJrc2xhdGVibHVlOiIjNDgzZDhiIixkYXJrc2xhdGVncmF5OiIjMmY0ZjRmIixkYXJrc2xhdGVncmV5OiIjMmY0ZjRmIixkYXJrdHVycXVvaXNlOiIjMDBjZWQxIixkYXJrdmlvbGV0OiIjOTQwMGQzIixkZWVwcGluazoiI2ZmMTQ5MyIsZGVlcHNreWJsdWU6IiMwMGJmZmYiLGRpbWdyYXk6IiM2OTY5NjkiLGRpbWdyZXk6IiM2OTY5NjkiLGRvZGdlcmJsdWU6IiMxZTkwZmYiLGZpcmVicmljazoiI2IyMjIyMiIsZmxvcmFsd2hpdGU6IiNmZmZhZjAiLGZvcmVzdGdyZWVuOiIjMjI4YjIyIixmdWNoc2lhOiIjZmYwMGZmIixnYWluc2Jvcm86IiNkY2RjZGMiLGdob3N0d2hpdGU6IiNmOGY4ZmYiLGdvbGQ6IiNmZmQ3MDAiLGdvbGRlbnJvZDoiI2RhYTUyMCIsZ3JheToiIzgwODA4MCIsZ3JleToiIzgwODA4MCIsZ3JlZW46IiMwMDgwMDAiLGdyZWVueWVsbG93OiIjYWRmZjJmIixob25leWRldzoiI2YwZmZmMCIsaG90cGluazoiI2ZmNjliNCIsaW5kaWFucmVkOiIjY2Q1YzVjIixpbmRpZ286IiM0YjAwODIiLGl2b3J5OiIjZmZmZmYwIixraGFraToiI2YwZTY4YyIsbGF2ZW5kZXI6IiNlNmU2ZmEiLGxhdmVuZGVyYmx1c2g6IiNmZmYwZjUiLGxhd25ncmVlbjoiIzdjZmMwMCIsbGVtb25jaGlmZm9uOiIjZmZmYWNkIixsaWdodGJsdWU6IiNhZGQ4ZTYiLGxpZ2h0Y29yYWw6IiNmMDgwODAiLGxpZ2h0Y3lhbjoiI2UwZmZmZiIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IiNmYWZhZDIiLGxpZ2h0Z3JheToiI2QzZDNkMyIsbGlnaHRncmV5OiIjZDNkM2QzIixsaWdodGdyZWVuOiIjOTBlZTkwIixsaWdodHBpbms6IiNmZmI2YzEiLGxpZ2h0c2FsbW9uOiIjZmZhMDdhIixsaWdodHNlYWdyZWVuOiIjMjBiMmFhIixsaWdodHNreWJsdWU6IiM4N2NlZmEiLGxpZ2h0c2xhdGVncmF5OiIjNzc4ODk5IixsaWdodHNsYXRlZ3JleToiIzc3ODg5OSIsbGlnaHRzdGVlbGJsdWU6IiNiMGM0ZGUiLGxpZ2h0eWVsbG93OiIjZmZmZmUwIixsaW1lOiIjMDBmZjAwIixsaW1lZ3JlZW46IiMzMmNkMzIiLGxpbmVuOiIjZmFmMGU2IixtYWdlbnRhOiIjZmYwMGZmIixtYXJvb246IiM4MDAwMDAiLG1lZGl1bWFxdWFtYXJpbmU6IiM2NmNkYWEiLG1lZGl1bWJsdWU6IiMwMDAwY2QiLG1lZGl1bW9yY2hpZDoiI2JhNTVkMyIsbWVkaXVtcHVycGxlOiIjOTM3MGRiIixtZWRpdW1zZWFncmVlbjoiIzNjYjM3MSIsbWVkaXVtc2xhdGVibHVlOiIjN2I2OGVlIixtZWRpdW1zcHJpbmdncmVlbjoiIzAwZmE5YSIsbWVkaXVtdHVycXVvaXNlOiIjNDhkMWNjIixtZWRpdW12aW9sZXRyZWQ6IiNjNzE1ODUiLG1pZG5pZ2h0Ymx1ZToiIzE5MTk3MCIsbWludGNyZWFtOiIjZjVmZmZhIixtaXN0eXJvc2U6IiNmZmU0ZTEiLG1vY2Nhc2luOiIjZmZlNGI1IixuYXZham93aGl0ZToiI2ZmZGVhZCIsbmF2eToiIzAwMDA4MCIsb2xkbGFjZToiI2ZkZjVlNiIsb2xpdmU6IiM4MDgwMDAiLG9saXZlZHJhYjoiIzZiOGUyMyIsb3JhbmdlOiIjZmZhNTAwIixvcmFuZ2VyZWQ6IiNmZjQ1MDAiLG9yY2hpZDoiI2RhNzBkNiIscGFsZWdvbGRlbnJvZDoiI2VlZThhYSIscGFsZWdyZWVuOiIjOThmYjk4IixwYWxldHVycXVvaXNlOiIjYWZlZWVlIixwYWxldmlvbGV0cmVkOiIjZGI3MDkzIixwYXBheWF3aGlwOiIjZmZlZmQ1IixwZWFjaHB1ZmY6IiNmZmRhYjkiLHBlcnU6IiNjZDg1M2YiLHBpbms6IiNmZmMwY2IiLHBsdW06IiNkZGEwZGQiLHBvd2RlcmJsdWU6IiNiMGUwZTYiLHB1cnBsZToiIzgwMDA4MCIscmViZWNjYXB1cnBsZToiIzY2MzM5OSIscmVkOiIjZmYwMDAwIixyb3N5YnJvd246IiNiYzhmOGYiLHJveWFsYmx1ZToiIzQxNjllMSIsc2FkZGxlYnJvd246IiM4YjQ1MTMiLHNhbG1vbjoiI2ZhODA3MiIsc2FuZHlicm93bjoiI2Y0YTQ2MCIsc2VhZ3JlZW46IiMyZThiNTciLHNlYXNoZWxsOiIjZmZmNWVlIixzaWVubmE6IiNhMDUyMmQiLHNpbHZlcjoiI2MwYzBjMCIsc2t5Ymx1ZToiIzg3Y2VlYiIsc2xhdGVibHVlOiIjNmE1YWNkIixzbGF0ZWdyYXk6IiM3MDgwOTAiLHNsYXRlZ3JleToiIzcwODA5MCIsc25vdzoiI2ZmZmFmYSIsc3ByaW5nZ3JlZW46IiMwMGZmN2YiLHN0ZWVsYmx1ZToiIzQ2ODJiNCIsdGFuOiIjZDJiNDhjIix0ZWFsOiIjMDA4MDgwIix0aGlzdGxlOiIjZDhiZmQ4Iix0b21hdG86IiNmZjYzNDciLHR1cnF1b2lzZToiIzQwZTBkMCIsdmlvbGV0OiIjZWU4MmVlIix3aGVhdDoiI2Y1ZGViMyIsd2hpdGU6IiNmZmZmZmYiLHdoaXRlc21va2U6IiNmNWY1ZjUiLHllbGxvdzoiI2ZmZmYwMCIseWVsbG93Z3JlZW46IiM5YWNkMzIiLHRyYW5zcGFyZW50OiIjMDAwMDAwMDAifTtmdW5jdGlvbiBocChlKXt2YXIgdD1udWxsO2lmKG51bGwhPSh0PS9eIyhbMC05fEEtRnxhLWZdezZ9KSQvLmV4ZWMoZT1lfHwiIzAwMDAwMCIpKSlyZXR1cm5bcGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxwYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLHBhcnNlSW50KHRbMV0uc2xpY2UoNCksMTYpLDI1NV07aWYobnVsbCE9KHQ9L14jKFswLTl8QS1GfGEtZl17M30pJC8uZXhlYyhlKSkpe3ZhciBuPXRbMV0uc2xpY2UoMCwxKSxyPXRbMV0uc2xpY2UoMSwyKSxpPXRbMV0uc2xpY2UoMiwzKTtyZXR1cm5bbj1wYXJzZUludChuK24sMTYpLHI9cGFyc2VJbnQocityLDE2KSxpPXBhcnNlSW50KGkraSwxNiksMjU1XX1pZihudWxsIT0odD0vXnJnYlwoKC4rKVwpJC8uZXhlYyhlKSkpcmV0dXJuIHRbMV0uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWluKDI1NSxwYXJzZUludChlLnRyaW0oKSkpfSkuY29uY2F0KDI1NSk7aWYobnVsbCE9KHQ9L15yZ2JhXCgoLispXCkkLy5leGVjKGUpKSlyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiAzPT09dD9NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUudHJpbSgpKSk6TWF0aC5taW4oMjU1LHBhcnNlSW50KGUudHJpbSgpKSl9KTt2YXIgbz1lLnRvTG93ZXJDYXNlKCk7aWYoayhwcCxvKSl7dD0vXiMoWzAtOXxBLUZ8YS1mXXs2LDh9KSQvLmV4ZWMocHBbb10pO3ZhciBhPXBhcnNlSW50KHRbMV0uc2xpY2UoMCwyKSwxNikscz1wYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLGM9cGFyc2VJbnQodFsxXS5zbGljZSg0LDYpLDE2KSx1PXBhcnNlSW50KHRbMV0uc2xpY2UoNiw4KSwxNik7cmV0dXJuW2EscyxjLHU9MDw9dT91OjI1NV19cmV0dXJuIGNvbnNvbGUuZXJyb3IoInVuc3VwcG9ydGVkIGNvbG9yOiIrZSksWzAsMCwwLDI1NV19ZnVuY3Rpb24gdnAoZSx0KXt0aGlzLnR5cGU9InBhdHRlcm4iLHRoaXMuZGF0YT1lLHRoaXMuY29sb3JTdG9wPXR9dmFyIGdwPWZ1bmN0aW9uKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXQsdGhpcy5jb2xvclN0b3A9W119O2dwLnByb3RvdHlwZS5hZGRDb2xvclN0b3A9ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbG9yU3RvcC5wdXNoKFtlLGhwKHQpXSl9O2Z1bmN0aW9uIG1wKGUpe3RoaXMud2lkdGg9ZX12YXIgeXA9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlSWQ9dCx0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09W10sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMuZHJhd2luZ1N0YXRlPVtdLHRoaXMuc3RhdGU9e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX0sX3A9e2xpbmVEYXNoT2Zmc2V0Ontjb25maWd1cmFibGU6ITB9LGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfSxzaGFkb3dCbHVyOntjb25maWd1cmFibGU6ITB9LHNoYWRvd0NvbG9yOntjb25maWd1cmFibGU6ITB9LHNoYWRvd09mZnNldFg6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93T2Zmc2V0WTp7Y29uZmlndXJhYmxlOiEwfSxmb250Ontjb25maWd1cmFibGU6ITB9LGZpbGxTdHlsZTp7Y29uZmlndXJhYmxlOiEwfSxzdHJva2VTdHlsZTp7Y29uZmlndXJhYmxlOiEwfSxnbG9iYWxBbHBoYTp7Y29uZmlndXJhYmxlOiEwfSx0ZXh0QWxpZ246e2NvbmZpZ3VyYWJsZTohMH0sbGluZUNhcDp7Y29uZmlndXJhYmxlOiEwfSxsaW5lSm9pbjp7Y29uZmlndXJhYmxlOiEwfSxsaW5lV2lkdGg6e2NvbmZpZ3VyYWJsZTohMH0sbWl0ZXJMaW1pdDp7Y29uZmlndXJhYmxlOiEwfSx0ZXh0QmFzZWxpbmU6e2NvbmZpZ3VyYWJsZTohMH19O3lwLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciBuLHI9W10uY29uY2F0KHRoaXMuYWN0aW9ucyk7dGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSwiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49ZHAucHVzaCh0KSksZnAodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWN0aW9uc0NoYW5nZWQiLHthY3Rpb25zOnIscmVzZXJ2ZTplLGNhbGxiYWNrSWQ6bn0pfSx5cC5wcm90b3R5cGUuY3JlYXRlTGluZWFyR3JhZGllbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5ldyBncCgibGluZWFyIixbZSx0LG4scl0pfSx5cC5wcm90b3R5cGUuY3JlYXRlQ2lyY3VsYXJHcmFkaWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBncCgicmFkaWFsIixbZSx0LG5dKX0seXAucHJvdG90eXBlLmNyZWF0ZVBhdHRlcm49ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10KWNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IDIgYXJndW1lbnRzIHJlcXVpcmVkLCBidXQgb25seSAxIHByZXNlbnQuIik7ZWxzZXtpZighKFsicmVwZWF0IiwicmVwZWF0LXgiLCJyZXBlYXQteSIsIm5vLXJlcGVhdCJdLmluZGV4T2YodCk8MCkpcmV0dXJuIG5ldyB2cChlLHQpO2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IFRoZSBwcm92aWRlZCB0eXBlICgnIit0KyInKSBpcyBub3Qgb25lIG9mICdyZXBlYXQnLCAnbm8tcmVwZWF0JywgJ3JlcGVhdC14Jywgb3IgJ3JlcGVhdC15Jy4iKX19LHlwLnByb3RvdHlwZS5tZWFzdXJlVGV4dD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnN0YXRlLmZvbnQsbj0wLHI9bmcud2Vidmlldy5hbGwoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFVSTCgpLmVuZHNXaXRoKCJ3d3cvX191bmlhcHB2aWV3Lmh0bWwiKX0pO3JldHVybiByJiYobj1OdW1iZXIoci5ldmFsSlNTeW5jKCIoIitmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7cmV0dXJuIG4uZm9udD10LG4ubWVhc3VyZVRleHQoZSkud2lkdGh8fDB9LnRvU3RyaW5nKCkrIikoIitKU09OLnN0cmluZ2lmeShlKSsiLCIrSlNPTi5zdHJpbmdpZnkodCkrIikiKSkpLG5ldyBtcChuKX0seXAucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzYXZlIixkYXRhOltdfSksdGhpcy5kcmF3aW5nU3RhdGUucHVzaCh0aGlzLnN0YXRlKX0seXAucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJyZXN0b3JlIixkYXRhOltdfSksdGhpcy5zdGF0ZT10aGlzLmRyYXdpbmdTdGF0ZS5wb3AoKXx8e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX0seXAucHJvdG90eXBlLmJlZ2luUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmVnaW5QYXRoIixkYXRhOltdfSl9LHlwLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W2UsdF19KSx0aGlzLnN1YnBhdGg9W1tlLHRdXX0seXAucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbihlLHQpezA9PT10aGlzLnBhdGgubGVuZ3RoJiYwPT09dGhpcy5zdWJwYXRoLmxlbmd0aD90aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W2UsdF19KTp0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJsaW5lVG8iLGRhdGE6W2UsdF19KSx0aGlzLnN1YnBhdGgucHVzaChbZSx0XSl9LHlwLnByb3RvdHlwZS5xdWFkcmF0aWNDdXJ2ZVRvPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InF1YWRyYXRpY0N1cnZlVG8iLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdWJwYXRoLnB1c2goW24scl0pfSx5cC5wcm90b3R5cGUuYmV6aWVyQ3VydmVUbz1mdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmV6aWVyQ3VydmVUbyIsZGF0YTpbZSx0LG4scixpLG9dfSksdGhpcy5zdWJwYXRoLnB1c2goW2ksb10pfSx5cC5wcm90b3R5cGUuYXJjPWZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2b2lkIDA9PT1vJiYobz0hMSksdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYXJjIixkYXRhOltlLHQsbixyLGksb119KSx0aGlzLnN1YnBhdGgucHVzaChbZSx0XSl9LHlwLnByb3RvdHlwZS5yZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdWJwYXRoPVtbZSx0XV19LHlwLnByb3RvdHlwZS5hcmNUbz1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyY1RvIixkYXRhOltlLHQsbixyLGldfSksdGhpcy5zdWJwYXRoLnB1c2goW24scl0pfSx5cC5wcm90b3R5cGUuY2xpcD1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImNsaXAiLGRhdGE6W10uY29uY2F0KHRoaXMucGF0aCl9KX0seXAucHJvdG90eXBlLmNsb3NlUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImNsb3NlUGF0aCIsZGF0YTpbXX0pLHRoaXMuc3VicGF0aC5sZW5ndGgmJih0aGlzLnN1YnBhdGg9W3RoaXMuc3VicGF0aC5zaGlmdCgpXSl9LHlwLnByb3RvdHlwZS5jbGVhckFjdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXX0seXAucHJvdG90eXBlLmdldEFjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgZT1bXS5jb25jYXQodGhpcy5hY3Rpb25zKTtyZXR1cm4gdGhpcy5jbGVhckFjdGlvbnMoKSxlfSxfcC5saW5lRGFzaE9mZnNldC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZURhc2hPZmZzZXQiLGRhdGE6W2VdfSl9LF9wLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbi5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIixkYXRhOltlXX0pfSxfcC5zaGFkb3dCbHVyLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dCbHVyIixkYXRhOltlXX0pfSxfcC5zaGFkb3dDb2xvci5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Q29sb3IiLGRhdGE6W2VdfSl9LF9wLnNoYWRvd09mZnNldFguc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFgiLGRhdGE6W2VdfSl9LF9wLnNoYWRvd09mZnNldFkuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFkiLGRhdGE6W2VdfSl9LF9wLmZvbnQuc2V0PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMsdD0odGhpcy5zdGF0ZS5mb250PWUpLm1hdGNoKC9eKChbXHdcLV0rXHMpKikoXGQrcj9weCkoXC8oXGQrXC4/XGQqKHI/cHgpPykpP1xzKyguKikvKTtpZih0KXt2YXIgcj10WzFdLnRyaW0oKS5zcGxpdCgvXHMvKSxpPXBhcnNlRmxvYXQodFszXSksbz10WzddLGE9W107ci5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7LTE8WyJpdGFsaWMiLCJvYmxpcXVlIiwibm9ybWFsIl0uaW5kZXhPZihlKT8oYS5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbZV19KSxuLnN0YXRlLmZvbnRTdHlsZT1lKTotMTxbImJvbGQiLCJub3JtYWwiXS5pbmRleE9mKGUpPyhhLnB1c2goe21ldGhvZDoic2V0Rm9udFdlaWdodCIsZGF0YTpbZV19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9ZSk6MD09PXQ/KGEucHVzaCh7bWV0aG9kOiJzZXRGb250U3R5bGUiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFN0eWxlPSJub3JtYWwiKToxPT09dCYmcygpfSksMT09PXIubGVuZ3RoJiZzKCkscj1hLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5kYXRhWzBdfSkuam9pbigiICIpLHRoaXMuc3RhdGUuZm9udFNpemU9aSx0aGlzLnN0YXRlLmZvbnRGYW1pbHk9byx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRGb250IixkYXRhOltyKyIgIitpKyJweCAiK29dfSl9ZWxzZSBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBzZXQgJ2ZvbnQnIG9uICdDYW52YXNDb250ZXh0JzogaW52YWxpZCBmb3JtYXQuIik7ZnVuY3Rpb24gcygpe2EucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOlsibm9ybWFsIl19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9Im5vcm1hbCJ9fSxfcC5mb250LmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlLmZvbnR9LF9wLmZpbGxTdHlsZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRGaWxsU3R5bGUoZSl9LF9wLnN0cm9rZVN0eWxlLnNldD1mdW5jdGlvbihlKXt0aGlzLnNldFN0cm9rZVN0eWxlKGUpfSxfcC5nbG9iYWxBbHBoYS5zZXQ9ZnVuY3Rpb24oZSl7ZT1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxBbHBoYSIsZGF0YTpbZV19KX0sX3AudGV4dEFsaWduLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QWxpZ24iLGRhdGE6W2VdfSl9LF9wLmxpbmVDYXAuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVDYXAiLGRhdGE6W2VdfSl9LF9wLmxpbmVKb2luLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lSm9pbiIsZGF0YTpbZV19KX0sX3AubGluZVdpZHRoLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lV2lkdGgiLGRhdGE6W2VdfSl9LF9wLm1pdGVyTGltaXQuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldE1pdGVyTGltaXQiLGRhdGE6W2VdfSl9LF9wLnRleHRCYXNlbGluZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0VGV4dEJhc2VsaW5lIixkYXRhOltlXX0pfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh5cC5wcm90b3R5cGUsX3ApLFsic2NhbGUiLCJyb3RhdGUiLCJ0cmFuc2xhdGUiLCJzZXRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXS5jb25jYXQoWyJkcmF3SW1hZ2UiLCJmaWxsVGV4dCIsImZpbGwiLCJzdHJva2UiLCJmaWxsUmVjdCIsInN0cm9rZVJlY3QiLCJjbGVhclJlY3QiLCJzdHJva2VUZXh0Il0pLmZvckVhY2goZnVuY3Rpb24oZSl7eXAucHJvdG90eXBlW2VdPWZ1bmN0aW9uKGQpe3N3aXRjaChkKXtjYXNlImZpbGwiOmNhc2Uic3Ryb2tlIjpyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmQrIlBhdGgiLGRhdGE6W10uY29uY2F0KHRoaXMucGF0aCl9KX07Y2FzZSJmaWxsUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImZpbGxQYXRoIixkYXRhOlt7bWV0aG9kOiJyZWN0IixkYXRhOltlLHQsbixyXX1dfSl9O2Nhc2Uic3Ryb2tlUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InN0cm9rZVBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfV19KX07Y2FzZSJmaWxsVGV4dCI6Y2FzZSJzdHJva2VUZXh0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9W2UudG9TdHJpbmcoKSx0LG5dOyJudW1iZXIiPT10eXBlb2YgciYmaS5wdXNoKHIpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCxkYXRhOml9KX07Y2FzZSJkcmF3SW1hZ2UiOnJldHVybiBmdW5jdGlvbihlLHQsbixyLGksbyxhLHMsYyl7dmFyIHU7ZnVuY3Rpb24gbChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9dm9pZCAwPT09YyYmKG89dCxhPW4scz1yLGM9aSxpPXI9bj10PXZvaWQgMCksdT1sKHQpJiZsKG4pJiZsKHIpJiZsKGkpP1tlLG8sYSxzLGMsdCxuLHIsaV06bChzKSYmbChjKT9bZSxvLGEscyxjXTpbZSxvLGFdLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCxkYXRhOnV9KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6ZX0pfX19KGUpfSksWyJzZXRGaWxsU3R5bGUiLCJzZXRUZXh0QWxpZ24iLCJzZXRTdHJva2VTdHlsZSIsInNldEdsb2JhbEFscGhhIiwic2V0U2hhZG93Iiwic2V0Rm9udFNpemUiLCJzZXRMaW5lQ2FwIiwic2V0TGluZUpvaW4iLCJzZXRMaW5lV2lkdGgiLCJzZXRNaXRlckxpbWl0Iiwic2V0VGV4dEJhc2VsaW5lIiwic2V0TGluZURhc2giXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3lwLnByb3RvdHlwZVtlXT1mdW5jdGlvbihpKXtzd2l0Y2goaSl7Y2FzZSJzZXRGaWxsU3R5bGUiOmNhc2Uic2V0U3Ryb2tlU3R5bGUiOnJldHVybiBmdW5jdGlvbihlKXsib2JqZWN0IiE9dHlwZW9mIGU/dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6WyJub3JtYWwiLGhwKGUpXX0pOnRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlLnR5cGUsZS5kYXRhLGUuY29sb3JTdG9wXX0pfTtjYXNlInNldEdsb2JhbEFscGhhIjpyZXR1cm4gZnVuY3Rpb24oZSl7ZT1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZV19KX07Y2FzZSJzZXRTaGFkb3ciOnJldHVybiBmdW5jdGlvbihlLHQsbixyKXtyPWhwKHIpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlLHQsbixyXX0pLHRoaXMuc3RhdGUuc2hhZG93Qmx1cj1uLHRoaXMuc3RhdGUuc2hhZG93Q29sb3I9cix0aGlzLnN0YXRlLnNoYWRvd09mZnNldFg9ZSx0aGlzLnN0YXRlLnNoYWRvd09mZnNldFk9dH07Y2FzZSJzZXRMaW5lRGFzaCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZT1lfHxbMCwwXSx0PXR8fDAsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UsdF19KSx0aGlzLnN0YXRlLmxpbmVEYXNoPWV9O2Nhc2Uic2V0Rm9udFNpemUiOnJldHVybiBmdW5jdGlvbihlKXt0aGlzLnN0YXRlLmZvbnQ9dGhpcy5zdGF0ZS5mb250LnJlcGxhY2UoL1xkK1wuP1xkKnB4LyxlKyJweCIpLHRoaXMuc3RhdGUuZm9udFNpemU9ZSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZV19KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6ZX0pfX19KGUpfSk7dmFyIGJwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLENhbnZhc0NvbnRleHQ6eXAsY3JlYXRlQ2FudmFzQ29udGV4dDpmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIG5ldyB5cChlLHQuJHBhZ2UuaWQpO3ZhciBuPXdsKCk7aWYobilyZXR1cm4gbmV3IHlwKGUsbik7cmcuZW1pdCgib25FcnJvciIsImNyZWF0ZUNhbnZhc0NvbnRleHQ6ZmFpbCIpfSxjYW52YXNHZXRJbWFnZURhdGE6ZnVuY3Rpb24oZSxuKXt2YXIgdD1lLmNhbnZhc0lkLHI9ZS54LGk9ZS55LG89ZS53aWR0aCxhPWUuaGVpZ2h0LHM9d2woKTtzP2ZwKHQscywiZ2V0SW1hZ2VEYXRhIix7eDpyLHk6aSx3aWR0aDpvLGhlaWdodDphLGNhbGxiYWNrSWQ6ZHAucHVzaChmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dCYmdC5sZW5ndGgmJihlLmNvbXByZXNzZWQmJih0PWxwLmluZmxhdGVSYXcodCksZGVsZXRlIGUuY29tcHJlc3NlZCksZS5kYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KSksZmkobixlKX0pfSk6Zmkobix7ZXJyTXNnOiJjYW52YXNHZXRJbWFnZURhdGE6ZmFpbCJ9KX0sY2FudmFzUHV0SW1hZ2VEYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYW52YXNJZCxyPWUuZGF0YSxpPWUueCxvPWUueSxhPWUud2lkdGgscz1lLmhlaWdodCxjPXdsKCk7aWYoYyl7dmFyIHUsbD1kcC5wdXNoKGZ1bmN0aW9uKGUpe2ZpKHQsZSl9KTsiaU9TIiE9PW5nLm9zLm5hbWV8fCJib29sZWFuIj09dHlwZW9mIF9fV0VFWF9ERVZUT09MX18/KHI9bHAuZGVmbGF0ZVJhdyhyLHt0bzoic3RyaW5nIn0pLHU9ITApOnI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwociksZnAobixjLCJwdXRJbWFnZURhdGEiLHtkYXRhOnIseDppLHk6byx3aWR0aDphLGhlaWdodDpzLGNvbXByZXNzZWQ6dSxjYWxsYmFja0lkOmx9KX1lbHNlIGZpKHQse2Vyck1zZzoiY2FudmFzUHV0SW1hZ2VEYXRhOmZhaWwifSl9LGNhbnZhc1RvVGVtcEZpbGVQYXRoOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS54O3ZvaWQgMD09PW4mJihuPTApO3ZhciByPWUueTt2b2lkIDA9PT1yJiYocj0wKTt2YXIgaT1lLndpZHRoLG89ZS5oZWlnaHQsYT1lLmRlc3RXaWR0aCxzPWUuZGVzdEhlaWdodCxjPWUuY2FudmFzSWQsdT1lLmZpbGVUeXBlLGw9ZS5xdWFsaXR5LGQ9d2woKTtpZihkKXt2YXIgZj1kcC5wdXNoKGZ1bmN0aW9uKGUpe2ZpKHQsZSl9KTtmcChjLGQsInRvVGVtcEZpbGVQYXRoIix7eDpuLHk6cix3aWR0aDppLGhlaWdodDpvLGRlc3RXaWR0aDphLGRlc3RIZWlnaHQ6cyxmaWxlVHlwZTp1LHF1YWxpdHk6bCxkaXJuYW1lOnlvKyIvY2FudmFzIixjYWxsYmFja0lkOmZ9KX1lbHNlIGZpKHQse2Vyck1zZzoiY2FudmFzVG9UZW1wRmlsZVBhdGg6ZmFpbCJ9KX19KTtmdW5jdGlvbiB3cChlLHQsbixyKXt5bCgib3BlcmF0ZU1hcFBsYXllciIsZSx0LG4scil9cmcuc3Vic2NyaWJlKCJvbk1hcE1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7TS5pbnZva2UodCxuKX0pO3ZhciBrcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VWbT10fTtrcC5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0KXt3cCh0aGlzLmlkLHRoaXMucGFnZVZtLCJvbiIse25hbWU6ZSxjYWxsYmFjazp0fSl9LGtwLnByb3RvdHlwZS4kZ2V0QXBwTWFwPWZ1bmN0aW9uKCl7cmV0dXJuIG5nLm1hcHMuZ2V0TWFwQnlJZCh0aGlzLnBhZ2VWbS4kcGFnZS5pZCsiLW1hcC0iK3RoaXMuaWQpfSxbImdldENlbnRlckxvY2F0aW9uIiwibW92ZVRvTG9jYXRpb24iLCJnZXRTY2FsZSIsImdldFJlZ2lvbiIsImluY2x1ZGVQb2ludHMiLCJ0cmFuc2xhdGVNYXJrZXIiLCJhZGRDdXN0b21MYXllciIsInJlbW92ZUN1c3RvbUxheWVyIiwiYWRkR3JvdW5kT3ZlcmxheSIsInJlbW92ZUdyb3VuZE92ZXJsYXkiLCJ1cGRhdGVHcm91bmRPdmVybGF5IiwiaW5pdE1hcmtlckNsdXN0ZXIiLCJhZGRNYXJrZXJzIiwicmVtb3ZlTWFya2VycyIsIm1vdmVBbG9uZyIsInNldExvY01hcmtlckljb24iLCJvcGVuTWFwQXBwIl0uZm9yRWFjaChmdW5jdGlvbihuKXtrcC5wcm90b3R5cGVbbl09TS53YXJwKGZ1bmN0aW9uKGUsdCl7ZS5jYWxsYmFja0lkPXQsd3AodGhpcy5pZCx0aGlzLnBhZ2VWbSxuLGUpfSl9KTt2YXIgU3A9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsTWFwQ29udGV4dDprcCxjcmVhdGVNYXBDb250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBrcChlLHR8fGJsKCJjcmVhdGVNYXBDb250ZXh0IikpfX0pLHhwPVsuNSwuOCwxLDEuMjUsMS41LDJdO2Z1bmN0aW9uIENwKGUsdCxuLHIpe3lsKCJvcGVyYXRlVmlkZW9QbGF5ZXIiLGUsdCxuLHIpfXZhciBUcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VWbT10fTtUcC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe0NwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInBsYXkiKX0sVHAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7Q3AodGhpcy5pZCx0aGlzLnBhZ2VWbSwicGF1c2UiKX0sVHAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtDcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJzdG9wIil9LFRwLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe0NwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNlZWsiLHtwb3NpdGlvbjplfSl9LFRwLnByb3RvdHlwZS5zZW5kRGFubXU9ZnVuY3Rpb24oZSl7Q3AodGhpcy5pZCx0aGlzLnBhZ2VWbSwic2VuZERhbm11IixlKX0sVHAucHJvdG90eXBlLnBsYXliYWNrUmF0ZT1mdW5jdGlvbihlKXt+eHAuaW5kZXhPZihlKXx8KGU9MSksQ3AodGhpcy5pZCx0aGlzLnBhZ2VWbSwicGxheWJhY2tSYXRlIix7cmF0ZTplfSl9LFRwLnByb3RvdHlwZS5yZXF1ZXN0RnVsbFNjcmVlbj1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksQ3AodGhpcy5pZCx0aGlzLnBhZ2VWbSwicmVxdWVzdEZ1bGxTY3JlZW4iLGUpfSxUcC5wcm90b3R5cGUuZXhpdEZ1bGxTY3JlZW49ZnVuY3Rpb24oKXtDcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJleGl0RnVsbFNjcmVlbiIpfSxUcC5wcm90b3R5cGUuc2hvd1N0YXR1c0Jhcj1mdW5jdGlvbigpe0NwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNob3dTdGF0dXNCYXIiKX0sVHAucHJvdG90eXBlLmhpZGVTdGF0dXNCYXI9ZnVuY3Rpb24oKXtDcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJoaWRlU3RhdHVzQmFyIil9O3ZhciBPcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxWaWRlb0NvbnRleHQ6VHAsY3JlYXRlVmlkZW9Db250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBUcChlLHR8fGJsKCJjcmVhdGVWaWRlb0NvbnRleHQiKSl9fSk7ZnVuY3Rpb24gRXAoZSx0LG4scil7cmcucHVibGlzaEhhbmRsZXIodCsiLWVkaXRvci0iK2Use2NvbXBvbmVudElkOmUsdHlwZTpuLGRhdGE6cn0sdCl9cmcuc3Vic2NyaWJlKCJvbkVkaXRvck1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7TS5pbnZva2UodCxuKX0pO3ZhciBJcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10fTtJcC5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKGUsdCl7RXAodGhpcy5pZCx0aGlzLnBhZ2VJZCwiZm9ybWF0Iix7b3B0aW9uczp7bmFtZTplLHZhbHVlOnR9fSl9LFsiaW5zZXJ0RGl2aWRlciIsImluc2VydEltYWdlIiwiaW5zZXJ0VGV4dCIsInNldENvbnRlbnRzIiwiZ2V0Q29udGVudHMiLCJjbGVhciIsInJlbW92ZUZvcm1hdCIsInVuZG8iLCJyZWRvIiwiYmx1ciIsImdldFNlbGVjdGlvblRleHQiLCJzY3JvbGxJbnRvVmlldyJdLmZvckVhY2goZnVuY3Rpb24obil7SXAucHJvdG90eXBlW25dPU0ud2FycChmdW5jdGlvbihlLHQpe0VwKHRoaXMuaWQsdGhpcy5wYWdlSWQsbix7b3B0aW9uczplLGNhbGxiYWNrSWQ6dH0pfSl9KTt2YXIgQXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsRWRpdG9yQ29udGV4dDpJcH0pLCRwPVsiY2FucGxheSIsInBsYXkiLCJwYXVzZSIsInN0b3AiLCJlbmRlZCIsInRpbWVVcGRhdGUiLCJlcnJvciIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIl0sUHA9W3tuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJhdXRvcGxheSIsZGVmYXVsdDohMSxjYWNoZTohMH0se25hbWU6Imxvb3AiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJvYmV5TXV0ZVN3aXRjaCIsZGVmYXVsdDohMCxyZWFkb25seTohMCxjYWNoZTohMH0se25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ2b2x1bWUifSx7bmFtZToic2Vzc2lvbkNhdGVnb3J5In0se25hbWU6InBsYXliYWNrUmF0ZSIsY2FjaGU6ITB9XSxNcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuaWQ9ZSx0aGlzLl9jYWxsYmFja3M9e30sdGhpcy5fb3B0aW9ucz17fSwkcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuX2NhbGxiYWNrc1tlLnRvTG93ZXJDYXNlKCldPVtdfSksUHAuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj1uLm5hbWUsZT17Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9bi5jYWNoZT90aGlzLl9vcHRpb25zOnlsKCJnZXRBdWRpb1N0YXRlIix7YXVkaW9JZDp0aGlzLmlkfSksdD1yIGluIGU/ZVtyXTpuLmRlZmF1bHQ7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiYidm9sdW1lIiE9PXI/dC8xZTM6dH19O24ucmVhZG9ubHl8fChlLnNldD1mdW5jdGlvbihlKXt0aGlzLl9vcHRpb25zW3JdPWUseWwoInNldEF1ZGlvU3RhdGUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSkpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixlKX0pfTtmdW5jdGlvbiBqcChlLHQsbixyKXtlLl9jYWxsYmFja3NbdF0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgiZXJyb3IiPT09dD97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX1NcC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInBsYXkiKX0sTXAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgicGF1c2UiKX0sTXAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJzdG9wIil9LE1wLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZToxZTMqZX0pfSxNcC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3NnKHRoaXMuX190aW1pbmcpLHlsKCJkZXN0cm95QXVkaW9JbnN0YW5jZSIse2F1ZGlvSWQ6dGhpcy5pZH0pLGRlbGV0ZSBOcFt0aGlzLmlkXX0sTXAucHJvdG90eXBlLl9vcGVyYXRlPWZ1bmN0aW9uKGUsdCl7eWwoIm9wZXJhdGVBdWRpbyIsT2JqZWN0LmFzc2lnbih7fSx0LHthdWRpb0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZTplfSkpfSwkcC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBlPXJbMF0udG9VcHBlckNhc2UoKStyLnN1YnN0cigxKTtyPXIudG9Mb3dlckNhc2UoKSxNcC5wcm90b3R5cGVbIm9uIitlXT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Nbcl0ucHVzaChlKX0sTXAucHJvdG90eXBlWyJvZmYiK2VdPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrc1tyXSxuPXQuaW5kZXhPZihlKTswPD1uJiZ0LnNwbGljZShuLDEpfX0pLF9sKCJvbkF1ZGlvU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdGUsbj1lLmF1ZGlvSWQscj1lLmVyck1zZyxpPWUuZXJyQ29kZSxvPU5wW25dO2lmKG8paWYoanAobyx0LHIsaSksInBsYXkiPT09dCl7dmFyIGE9by5jdXJyZW50VGltZTtqcChvLCJ0aW1ldXBkYXRlIiksby5fX3RpbWluZz1hZyhmdW5jdGlvbigpe28uY3VycmVudFRpbWUhPT1hJiZqcChvLCJ0aW1ldXBkYXRlIil9LDIwMCl9ZWxzZSJwYXVzZSIhPT10JiYic3RvcCIhPT10JiYiZXJyb3IiIT09dHx8c2coby5fX3RpbWluZyl9KTt2YXIgTnA9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgQnA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6ZnVuY3Rpb24oKXt2YXIgZT15bCgiY3JlYXRlQXVkaW9JbnN0YW5jZSIpLmF1ZGlvSWQsdD1uZXcgTXAoZSk7cmV0dXJuIE5wW2VdPXR9fSksTHA9W107X2woIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIsZnVuY3Rpb24odCl7THAuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQpfSl9KTt2YXIgRHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25OZXR3b3JrU3RhdHVzQ2hhbmdlOmZ1bmN0aW9uKGUpe0xwLnB1c2goZSl9LG9mZk5ldHdvcmtTdGF0dXNDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9THAuaW5kZXhPZihlKTswPD10JiZMcC5zcGxpY2UodCwxKX19fSksUnA9W10sRnA9W107X2wobnQsZnVuY3Rpb24odCl7UnAuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQpfSl9KSxfbCgib25VSVN0eWxlQ2hhbmdlIixmdW5jdGlvbih0KXtGcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdCl9KX0pO3ZhciBVcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvblRoZW1lQ2hhbmdlOmZ1bmN0aW9uKGUpe1JwLnB1c2goZSl9LG9mZlRoZW1lQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PVJwLmluZGV4T2YoZSk7MDw9dCYmUnAuc3BsaWNlKHQsMSl9fSxvblVJU3R5bGVDaGFuZ2U6ZnVuY3Rpb24oZSl7RnAucHVzaChlKSxjb25zb2xlLndhcm4oJ1RoZSAidW5pLm9uVUlTdHlsZUNoYW5nZSIgQVBJIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgInVuaS5vblRoZW1lQ2hhbmdlIi4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLm5ldC5jbi9hcGkvc3lzdGVtL3RoZW1lLicpfX0pLHpwPUd1KCJnZXRTZWxlY3RlZFRleHRSYW5nZUV2ZW50Iik7cmcuc3Vic2NyaWJlKCJvbkdldFNlbGVjdGVkVGV4dFJhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7Y29uc29sZS5sb2coIm9uR2V0U2VsZWN0ZWRUZXh0UmFuZ2UiKTt2YXIgcj16cC5wb3AodCk7ciYmcihuKX0pO3ZhciBWcCxxcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRTZWxlY3RlZFRleHRSYW5nZTpmdW5jdGlvbihlLHQpe3ZhciBuPXdsKCk7cmcucHVibGlzaEhhbmRsZXIoImdldFNlbGVjdGVkVGV4dFJhbmdlIix7cGFnZUlkOm4sY2FsbGJhY2tJZDp6cC5wdXNoKGZ1bmN0aW9uKGUpe2ZpKHQsZSl9KX0sbil9fSk7X2woIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe1ZwJiZmaShWcCxlKX0pO3ZhciBXcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0O3Q9VnAscmcucmVtb3ZlQ2FsbGJhY2tIYW5kbGVyKHQpLFZwPWV9LG9mZktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKCl7VnA9bnVsbH19KSxIcD0ibG9uZ1ByZXNzQWN0aW9uc0NhbGxiYWNrIixHcD17fTtfbChIcCxmdW5jdGlvbihlKXt2YXIgdD1lLmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHQpP0dwLmZhaWwmJkdwLmZhaWwoZSk6R3Auc3VjY2VzcyYmR3Auc3VjY2VzcyhlKSxHcC5jb21wbGV0ZSYmR3AuY29tcGxldGUoZSl9KTt2YXIgSnAsWHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksKChHcD1lLmxvbmdQcmVzc0FjdGlvbnN8fHt9KS5zdWNjZXNzfHxHcC5mYWlsfHxHcC5jb21wbGV0ZSkmJihHcC5jYWxsYmFja0lkPUhwKSx5bCgicHJldmlld0ltYWdlUGx1cyIsZSl9LGNsb3NlUHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSkseWwoImNsb3NlUHJldmlld0ltYWdlUGx1cyIsZSl9fSksWXA9e3BhdXNlOm51bGwscmVzdW1lOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsZXJyb3I6bnVsbH0sS3A9ZnVuY3Rpb24oKXtfbCgib25SZWNvcmRlclN0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlO2RlbGV0ZSBlLnN0YXRlLGRlbGV0ZSBlLmVyck1zZywiZnVuY3Rpb24iPT10eXBlb2YgWXBbdF0mJllwW3RdKGUpfSl9O0twLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe1lwLmVycm9yPWV9LEtwLnByb3RvdHlwZS5vbkZyYW1lUmVjb3JkZWQ9ZnVuY3Rpb24oZSl7fSxLcC5wcm90b3R5cGUub25JbnRlcnJ1cHRpb25CZWdpbj1mdW5jdGlvbihlKXt9LEtwLnByb3RvdHlwZS5vbkludGVycnVwdGlvbkVuZD1mdW5jdGlvbihlKXt9LEtwLnByb3RvdHlwZS5vblBhdXNlPWZ1bmN0aW9uKGUpe1lwLnBhdXNlPWV9LEtwLnByb3RvdHlwZS5vblJlc3VtZT1mdW5jdGlvbihlKXtZcC5yZXN1bWU9ZX0sS3AucHJvdG90eXBlLm9uU3RhcnQ9ZnVuY3Rpb24oZSl7WXAuc3RhcnQ9ZX0sS3AucHJvdG90eXBlLm9uU3RvcD1mdW5jdGlvbihlKXtZcC5zdG9wPWV9LEtwLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3lsKCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJwYXVzZSJ9KX0sS3AucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3lsKCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJyZXN1bWUifSl9LEtwLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlKXt5bCgib3BlcmF0ZVJlY29yZGVyIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InN0YXJ0In0pKX0sS3AucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt5bCgib3BlcmF0ZVJlY29yZGVyIix7b3BlcmF0aW9uVHlwZToic3RvcCJ9KX07dmFyIFpwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFJlY29yZGVyTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBKcHx8KEpwPW5ldyBLcCl9fSksUXA9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tJZD10LHRoaXMuX2NhbGxiYWNrcz1bXX07UXAucHJvdG90eXBlLmFib3J0PWZ1bmN0aW9uKCl7eWwoIm9wZXJhdGVEb3dubG9hZFRhc2siLHtkb3dubG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxRcC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LFFwLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30sUXAucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0sUXAucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIGVoPU9iamVjdC5jcmVhdGUobnVsbCk7X2woIm9uRG93bmxvYWRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZG93bmxvYWRUYXNrSWQsbj1lLnN0YXRlLHI9ZS50ZW1wRmlsZVBhdGgsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzV3JpdHRlbixzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZSxjPWUuZXJyTXNnLHU9ZWhbdF0sbD11Ll9jYWxsYmFja0lkO3N3aXRjaChuKXtjYXNlInByb2dyZXNzVXBkYXRlIjp1Ll9jYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihlKXtlKHtwcm9ncmVzczpvLHRvdGFsQnl0ZXNXcml0dGVuOmEsdG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZTpzfSl9KTticmVhaztjYXNlInN1Y2Nlc3MiOmZpKGwse3RlbXBGaWxlUGF0aDpyLHN0YXR1c0NvZGU6aSxlcnJNc2c6InJlcXVlc3Q6b2sifSk7Y2FzZSJmYWlsIjpmaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2N9KTtkZWZhdWx0OmlnKGZ1bmN0aW9uKCl7ZGVsZXRlIGVoW3RdfSwxMDApfX0pO3ZhciB0aD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkb3dubG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj15bCgiY3JlYXRlRG93bmxvYWRUYXNrIixlKS5kb3dubG9hZFRhc2tJZCxyPW5ldyBRcChuLHQpO3JldHVybiBlaFtuXT1yfX0pLG5oPU9iamVjdC5jcmVhdGUobnVsbCk7X2woIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuc3RhdHVzQ29kZSxvPWUuaGVhZGVyLGE9ZS5lcnJNc2cscz1lLmNvb2tpZXMsYz1uaFt0XXx8e30sdT1jLmFyZ3MsbD1jLmNhbGxiYWNrSWQ7aWYobClzd2l0Y2goZGVsZXRlIG5oW3RdLG4pe2Nhc2Uic3VjY2VzcyI6ZmkobCxmdW5jdGlvbihyLGUpe2lmKCJzdHJpbmciPT10eXBlb2Ygci5kYXRhJiY2NTI3OT09PXIuZGF0YS5jaGFyQ29kZUF0KDApJiYoci5kYXRhPXIuZGF0YS5zdWJzdHIoMSkpLHIuc3RhdHVzQ29kZT1wYXJzZUludChyLnN0YXR1c0NvZGUsMTApLFQoci5oZWFkZXIpJiYoci5oZWFkZXI9T2JqZWN0LmtleXMoci5oZWFkZXIpLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXIuaGVhZGVyW3RdO3JldHVybiBBcnJheS5pc0FycmF5KG4pP2VbdF09bi5qb2luKCIsIik6InN0cmluZyI9PXR5cGVvZiBuJiYoZVt0XT1uKSxlfSx7fSkpLGUuZGF0YVR5cGUmJiJqc29uIj09PWUuZGF0YVR5cGUudG9Mb3dlckNhc2UoKSl0cnl7ci5kYXRhPUpTT04ucGFyc2Uoci5kYXRhKX1jYXRjaChlKXt9cmV0dXJuIHJ9KHtkYXRhOnIsc3RhdHVzQ29kZTppLGhlYWRlcjpvLGVyck1zZzoicmVxdWVzdDpvayIsY29va2llczpzfSx1KSk7YnJlYWs7Y2FzZSJmYWlsIjpmaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2F9KX19KTt2YXIgcmg9ZnVuY3Rpb24oZSl7dGhpcy5pZD1lfTtyaC5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXt5bCgib3BlcmF0ZVJlcXVlc3RUYXNrIix7cmVxdWVzdFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxyaC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxyaC5wcm90b3R5cGUub25IZWFkZXJzUmVjZWl2ZWQ9ZnVuY3Rpb24oKXt9O3ZhciBpaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKHZhciByIGluIGUuaGVhZGVyKWlmKCJjb250ZW50LXR5cGUiPT09ci50b0xvd2VyQ2FzZSgpKXtuPWUuaGVhZGVyW3JdO2JyZWFrfSJHRVQiIT09ZS5tZXRob2QmJjA9PT1uLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKSYmVChlLmRhdGEpJiYoZS5kYXRhPUpTT04uc3RyaW5naWZ5KGUuZGF0YSkpO3ZhciBpPXlsKCJjcmVhdGVSZXF1ZXN0VGFzayIsZSkucmVxdWVzdFRhc2tJZDtyZXR1cm4gbmhbaV09e2FyZ3M6ZSxjYWxsYmFja0lkOnR9LG5ldyByaChpKX19KSxvaD1mdW5jdGlvbihlKXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tzPXtvcGVuOltdLGNsb3NlOltdLGVycm9yOltdLG1lc3NhZ2U6W119LHRoaXMuQ0xPU0VEPTMsdGhpcy5DTE9TSU5HPTIsdGhpcy5DT05ORUNUSU5HPTAsdGhpcy5PUEVOPTEsdGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VEfTtvaC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnJlYWR5U3RhdGUhPT10aGlzLk9QRU4mJnRoaXMuX2NhbGxiYWNrKGUsInNlbmRTb2NrZXRNZXNzYWdlOmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTt2YXIgdD15bCgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic2VuZCIsc29ja2V0VGFza0lkOnRoaXMuaWR9KSkuZXJyTXNnO3RoaXMuX2NhbGxiYWNrKGUsdC5yZXBsYWNlKCJvcGVyYXRlU29ja2V0VGFzayIsInNlbmRTb2NrZXRNZXNzYWdlIikpfSxvaC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oZSl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0lORzt2YXIgdD15bCgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToiY2xvc2UiLHNvY2tldFRhc2tJZDp0aGlzLmlkfSkpLmVyck1zZzt0aGlzLl9jYWxsYmFjayhlLHQucmVwbGFjZSgib3BlcmF0ZVNvY2tldFRhc2siLCJjbG9zZVNvY2tldCIpKX0sb2gucHJvdG90eXBlLm9uT3Blbj1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Mub3Blbi5wdXNoKGUpfSxvaC5wcm90b3R5cGUub25DbG9zZT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MuY2xvc2UucHVzaChlKX0sb2gucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLmVycm9yLnB1c2goZSl9LG9oLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLm1lc3NhZ2UucHVzaChlKX0sb2gucHJvdG90eXBlLl9jYWxsYmFjaz1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLnN1Y2Nlc3Mscj1lLmZhaWwsaT1lLmNvbXBsZXRlLG89e2Vyck1zZzp0fTsvOm9rJC8udGVzdCh0KT8iZnVuY3Rpb24iPT10eXBlb2YgbiYmbihvKToiZnVuY3Rpb24iPT10eXBlb2YgciYmcihvKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaShvKX07dmFyIGFoPU9iamVjdC5jcmVhdGUobnVsbCksc2g9W10sY2g9T2JqZWN0LmNyZWF0ZShudWxsKTtfbCgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc29ja2V0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuY29kZSxvPWUucmVhc29uLGE9KGUuZXJyTXNnLGFoW3RdKTtpZihhKXt2YXIgcz0ibWVzc2FnZSI9PT1uP3tkYXRhOnJ9OiJjbG9zZSI9PT1uP3tjb2RlOmkscmVhc29uOm99Ont9O2lmKCJvcGVuIj09PW4mJihhLnJlYWR5U3RhdGU9YS5PUEVOKSxhPT09c2hbMF0mJmNoW25dJiZmaShjaFtuXSxzKSwiZXJyb3IiPT09bnx8ImNsb3NlIj09PW4pe2EucmVhZHlTdGF0ZT1hLkNMT1NFRCxkZWxldGUgYWhbdF07dmFyIGM9c2guaW5kZXhPZihhKTswPD1jJiZzaC5zcGxpY2UoYywxKX1hLl9jYWxsYmFja3Nbbl0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZShzKX0pfX0pO3ZhciB1aCxsaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb25uZWN0U29ja2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49eWwoImNyZWF0ZVNvY2tldFRhc2siLGUpLnNvY2tldFRhc2tJZCxyPW5ldyBvaChuKTtyZXR1cm4gYWhbbl09cixzaC5wdXNoKHIpLGlnKGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJjb25uZWN0U29ja2V0Om9rIn0pfSwwKSxyfSxzZW5kU29ja2V0TWVzc2FnZTpmdW5jdGlvbihlLHQpe3ZhciBuPXNoWzBdO2lmKG4mJm4ucmVhZHlTdGF0ZT09PW4uT1BFTilyZXR1cm4geWwoIm9wZXJhdGVTb2NrZXRUYXNrIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InNlbmQiLHNvY2tldFRhc2tJZDpuLmlkfSkpO2ZpKHQse2Vyck1zZzoic2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCBXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCJ9KX0sY2xvc2VTb2NrZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1zaFswXTtpZihuKXJldHVybiBuLnJlYWR5U3RhdGU9bi5DTE9TSU5HLHlsKCJvcGVyYXRlU29ja2V0VGFzayIsT2JqZWN0LmFzc2lnbih7fSxlLHtvcGVyYXRpb25UeXBlOiJjbG9zZSIsc29ja2V0VGFza0lkOm4uaWR9KSk7ZmkodCx7ZXJyTXNnOiJjbG9zZVNvY2tldDpmYWlsIFdlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIn0pfSxvblNvY2tldE9wZW46ZnVuY3Rpb24oZSl7Y2gub3Blbj1lfSxvblNvY2tldEVycm9yOmZ1bmN0aW9uKGUpe2NoLmVycm9yPWV9LG9uU29ja2V0TWVzc2FnZTpmdW5jdGlvbihlKXtjaC5tZXNzYWdlPWV9LG9uU29ja2V0Q2xvc2U6ZnVuY3Rpb24oZSl7Y2guY2xvc2U9ZX19KSxkaD1mdW5jdGlvbigpe307ZGgucHJvdG90eXBlLm9uQ2hlY2tGb3JVcGRhdGU9ZnVuY3Rpb24oKXt9LGRoLnByb3RvdHlwZS5vblVwZGF0ZVJlYWR5PWZ1bmN0aW9uKCl7fSxkaC5wcm90b3R5cGUub25VcGRhdGVGYWlsZWQ9ZnVuY3Rpb24oKXt9LGRoLnByb3RvdHlwZS5hcHBseVVwZGF0ZT1mdW5jdGlvbigpe307dmFyIGZoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFVwZGF0ZU1hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdWh8fCh1aD1uZXcgZGgpfX0pLHBoPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuX2NhbGxiYWNrSWQ9dCx0aGlzLl9jYWxsYmFja3M9W119O3BoLnByb3RvdHlwZS5hYm9ydD1mdW5jdGlvbigpe3lsKCJvcGVyYXRlVXBsb2FkVGFzayIse3VwbG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxwaC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LHBoLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30scGgucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0scGgucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIGhoPU9iamVjdC5jcmVhdGUobnVsbCk7X2woIm9uVXBsb2FkVGFza1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnVwbG9hZFRhc2tJZCxuPWUuc3RhdGUscj1lLmRhdGEsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzU2VudCxzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kLGM9ZS5lcnJNc2csdT1oaFt0XSxsPXUuX2NhbGxiYWNrSWQ7c3dpdGNoKG4pe2Nhc2UicHJvZ3Jlc3NVcGRhdGUiOnUuX2NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uoe3Byb2dyZXNzOm8sdG90YWxCeXRlc1NlbnQ6YSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQ6c30pfSk7YnJlYWs7Y2FzZSJzdWNjZXNzIjpmaShsLHtkYXRhOnIsc3RhdHVzQ29kZTppLGVyck1zZzoicmVxdWVzdDpvayJ9KTtjYXNlImZhaWwiOmZpKGwse2Vyck1zZzoicmVxdWVzdDpmYWlsICIrY30pO2RlZmF1bHQ6aWcoZnVuY3Rpb24oKXtkZWxldGUgaGhbdF19LDEwMCl9fSk7dmFyIHZoLGdoLG1oLHloLF9oPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVwbG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj15bCgiY3JlYXRlVXBsb2FkVGFzayIsZSkudXBsb2FkVGFza0lkLHI9bmV3IHBoKG4sdCk7cmV0dXJuIGhoW25dPXJ9fSk7ZnVuY3Rpb24gYmgoZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGUpe31yZXR1cm4gZX1mdW5jdGlvbiB3aCh0KXtpZigiZW5hYmxlZCI9PT10LnR5cGUpbWg9ITAseWg9dC5vZmZsaW5lO2Vsc2UgaWYoImNsaWVudElkIj09PXQudHlwZSl2aD10LmNpZCxnaD10LmVyck1zZyxTaCh2aCx0LmVyck1zZyk7ZWxzZSBpZigicHVzaE1zZyI9PT10LnR5cGUpZm9yKHZhciBlPXt0eXBlOiJyZWNlaXZlIixkYXRhOmJoKHQubWVzc2FnZSl9LG49MDtuPHhoLmxlbmd0aDtuKyspe2lmKCgwLHhoW25dKShlKSxlLnN0b3BwZWQpYnJlYWt9ZWxzZSJjbGljayI9PT10LnR5cGUmJnhoLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh7dHlwZToiY2xpY2siLGRhdGE6YmgodC5tZXNzYWdlKX0pfSl9dmFyIGtoPVtdO2Z1bmN0aW9uIFNoKHQsbil7a2guZm9yRWFjaChmdW5jdGlvbihlKXtlKHQsbil9KSxraC5sZW5ndGg9MH12YXIgeGg9W10sQ2g9ITEsVGg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaW52b2tlUHVzaENhbGxiYWNrOndoLGdldFB1c2hDbGllbnRJZDpmdW5jdGlvbihlKXtUKGUpfHwoZT17fSk7dmFyIHQ9YWUoZSkscj10LnN1Y2Nlc3MsaT10LmZhaWwsbz10LmNvbXBsZXRlLGE9QyhyKSxzPUMoaSksYz1DKG8pO3loP25nLnB1c2guZ2V0Q2xpZW50SW5mb0FzeW5jKGZ1bmN0aW9uKGUpe3ZhciB0PXtlcnJNc2c6ImdldFB1c2hDbGllbnRJZDpvayIsY2lkOmUuY2xpZW50aWR9O2EmJnIodCksYyYmbyh0KX0sZnVuY3Rpb24oZSl7ZT17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6ZmFpbCAiK2UuY29kZSsiOiAiK2UubWVzc2FnZX0scyYmaShlKSxjJiZvKGUpfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3ZvaWQgMD09PW1oJiYobWg9ITEsdmg9IiIsZ2g9InVuaVB1c2ggaXMgbm90IGVuYWJsZWQiKSxraC5wdXNoKGZ1bmN0aW9uKGUsdCl7dmFyIG47ZT8obj17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6b2siLGNpZDplfSxhJiZyKG4pKToobj17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6ZmFpbCIrKHQ/IiAiK3Q6IiIpfSxzJiZpKG4pKSxjJiZvKG4pfSksdm9pZCAwIT09dmgmJlNoKHZoLGdoKX0pfSxvblB1c2hNZXNzYWdlOmZ1bmN0aW9uKGUpey0xPT09eGguaW5kZXhPZihlKSYmeGgucHVzaChlKSxDaHx8KENoPSEwLG5nLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpe3doKHt0eXBlOiJjbGljayIsbWVzc2FnZTplfSl9KSxuZy5wdXNoLmFkZEV2ZW50TGlzdGVuZXIoInJlY2VpdmUiLGZ1bmN0aW9uKGUpe3doKHt0eXBlOiJwdXNoTXNnIixtZXNzYWdlOmV9KX0pKX0sb2ZmUHVzaE1lc3NhZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9eGguaW5kZXhPZihlKTstMTx0JiZ4aC5zcGxpY2UodCwxKX1lbHNlIHhoLmxlbmd0aD0wfX0pLE9oPXtkdXJhdGlvbjo0MDAsdGltaW5nRnVuY3Rpb246ImxpbmVhciIsZGVsYXk6MCx0cmFuc2Zvcm1PcmlnaW46IjUwJSA1MCUgMCJ9LEVoPWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09e30sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMub3B0aW9uPU9iamVjdC5hc3NpZ24oe30sT2gsZSl9O0VoLnByb3RvdHlwZS5fZ2V0T3B0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXt0cmFuc2l0aW9uOk9iamVjdC5hc3NpZ24oe30sdGhpcy5vcHRpb24sZSl9O3JldHVybiB0LnRyYW5zZm9ybU9yaWdpbj10LnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLGRlbGV0ZSB0LnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLHR9LEVoLnByb3RvdHlwZS5fcHVzaEFuaW1hdGVzPWZ1bmN0aW9uKGUsdCl7dGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzLnB1c2goe3R5cGU6ZSxhcmdzOnR9KX0sRWgucHJvdG90eXBlLl9jb252ZXJUeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1tBLVpdL2csZnVuY3Rpb24oZSl7cmV0dXJuIi0iK2UudG9Mb3dlckNhc2UoKX0pfSxFaC5wcm90b3R5cGUuX2dldFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9lKyJweCI6ZX0sRWgucHJvdG90eXBlLmV4cG9ydD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYWN0aW9ucztyZXR1cm4gdGhpcy5hY3Rpb25zPVtdLHthY3Rpb25zOmV9fSxFaC5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMuZm9yRWFjaChmdW5jdGlvbihlKXsic3R5bGUiIT09ZS50eXBlP3QuY3VycmVudFRyYW5zZm9ybVtlLnR5cGVdPWU6dC5jdXJyZW50VHJhbnNmb3JtW2UudHlwZSsiLiIrZS5hcmdzWzBdXT1lfSksdGhpcy5hY3Rpb25zLnB1c2goe2FuaW1hdGVzOk9iamVjdC52YWx1ZXModGhpcy5jdXJyZW50VHJhbnNmb3JtKSxvcHRpb246dGhpcy5fZ2V0T3B0aW9uKGUpfSksdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXN9O3ZhciBJaD1bIm9wYWNpdHkiLCJiYWNrZ3JvdW5kQ29sb3IiXSxBaD1bIndpZHRoIiwiaGVpZ2h0IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl07WyJtYXRyaXgiLCJtYXRyaXgzZCIsInJvdGF0ZSIsInJvdGF0ZTNkIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwic2NhbGUiLCJzY2FsZTNkIiwic2NhbGVYIiwic2NhbGVZIiwic2NhbGVaIiwic2tldyIsInNrZXdYIiwic2tld1kiLCJ0cmFuc2xhdGUiLCJ0cmFuc2xhdGUzZCIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiJdLmNvbmNhdChJaCxBaCkuZm9yRWFjaChmdW5jdGlvbihuKXtFaC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIEloLmNvbmNhdChBaCkuaW5jbHVkZXMobik/dGhpcy5fcHVzaEFuaW1hdGVzKCJzdHlsZSIsW3RoaXMuX2NvbnZlclR5cGUobiksQWguaW5jbHVkZXMobik/dGhpcy5fZ2V0VmFsdWUoZVswXSk6ZVswXV0pOnRoaXMuX3B1c2hBbmltYXRlcyhuLGUpLHRoaXN9fSk7dmFyICRoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUFuaW1hdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEVoKGUpfX0pLFBoPUd1KCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiKSxNaD17dGhyZXNob2xkczpbMF0saW5pdGlhbFJhdGlvOjAsb2JzZXJ2ZUFsbDohMX0samg9ZnVuY3Rpb24oZSx0KXt0aGlzLnBhZ2VJZD1lLiRwYWdlJiZlLiRwYWdlLmlkLHRoaXMuY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSxNaCx0KX07amgucHJvdG90eXBlLl9tYWtlUm9vdE1hcmdpbj1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy5vcHRpb25zLnJvb3RNYXJnaW49WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuKE51bWJlcih0W2VdKXx8MCkrInB4In0pLmpvaW4oIiAiKX0samgucHJvdG90eXBlLnJlbGF0aXZlVG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnJlbGF0aXZlVG9TZWxlY3Rvcj1lLHRoaXMuX21ha2VSb290TWFyZ2luKHQpLHRoaXN9LGpoLnByb3RvdHlwZS5yZWxhdGl2ZVRvVmlld3BvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9bnVsbCx0aGlzLl9tYWtlUm9vdE1hcmdpbihlKSx0aGlzfSxqaC5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodGhpcy5vcHRpb25zLnNlbGVjdG9yPWUsdGhpcy5yZXFJZD1QaC5wdXNoKHQpLHJnLnB1Ymxpc2hIYW5kbGVyKCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkLGNvbXBvbmVudDp0aGlzLmNvbXBvbmVudCxvcHRpb25zOnRoaXMub3B0aW9uc30sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSkpfSxqaC5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe3JnLnB1Ymxpc2hIYW5kbGVyKCJkZXN0cm95Q29tcG9uZW50T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKX07dmFyIE5oPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX2lzVnVlfHwodD1lLGU9bnVsbCksbmV3IGpoKGV8fGJsKCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIpLHQpfX0pLEJoPUd1KCJyZXF1ZXN0TWVkaWFRdWVyeU9ic2VydmVyIiksTGg9ZnVuY3Rpb24oZSx0KXt0aGlzLnBhZ2VJZD1lLiRwYWdlJiZlLiRwYWdlLmlkLHRoaXMuY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzLm9wdGlvbnM9dH07TGgucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucz1lLHRoaXMucmVxSWQ9QmgucHVzaCh0KSxyZy5wdWJsaXNoSGFuZGxlcigicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIse3JlcUlkOnRoaXMucmVxSWQsY29tcG9uZW50OnRoaXMuY29tcG9uZW50LG9wdGlvbnM6dGhpcy5vcHRpb25zfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKSl9LExoLnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKCl7cmcucHVibGlzaEhhbmRsZXIoImRlc3Ryb3lNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKX07dmFyIERoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlLl9pc1Z1ZXx8KHQ9ZSxlPW51bGwpLG5ldyBMaChlfHxibCgiY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyIiksdCl9fSksUmg9e2NhbnZhczp5cCxtYXA6a3AsdmlkZW86VHAsZWRpdG9yOklwfTtmdW5jdGlvbiBGaChlKXtpZihlJiZlLmNvbnRleHQpe3ZhciB0PWUuY29udGV4dCxuPXQuaWQscj10Lm5hbWUsaT10LnBhZ2Usbz1SaFtyXTtlLmNvbnRleHQ9byYmbmV3IG8obixpKX19dmFyIFVoPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuX3NlbGVjdG9yUXVlcnk9ZSx0aGlzLl9jb21wb25lbnQ9dCx0aGlzLl9zZWxlY3Rvcj1uLHRoaXMuX3NpbmdsZT1yfTtVaC5wcm90b3R5cGUuYm91bmRpbmdDbGllbnRSZWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAscmVjdDohMCxzaXplOiEwfSxlKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fSxVaC5wcm90b3R5cGUuZmllbGRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSxlLHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9LFVoLnByb3RvdHlwZS5zY3JvbGxPZmZzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7aWQ6ITAsZGF0YXNldDohMCxzY3JvbGxPZmZzZXQ6ITB9LGUpLHRoaXMuX3NlbGVjdG9yUXVlcnl9LFVoLnByb3RvdHlwZS5jb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2NvbnRleHQ6ITB9LGUpLHRoaXMuX3NlbGVjdG9yUXVlcnl9O3ZhciB6aD1mdW5jdGlvbihlKXt0aGlzLl9wYWdlPWUsdGhpcy5fcXVldWU9W10sdGhpcy5fcXVldWVDYj1bXSx0aGlzLl9ub2Rlc1JlZj1udWxsfTt6aC5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbih0KXt2YXIgaT10aGlzO3JldHVybiB5bCgicmVxdWVzdENvbXBvbmVudEluZm8iLHRoaXMuX3BhZ2UsdGhpcy5fcXVldWUsZnVuY3Rpb24oZSl7dmFyIHI9aS5fcXVldWVDYjtlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaChGaCk6RmgoZSk7dmFyIG49clt0XTtDKG4pJiZuLmNhbGwoaSxlKX0pLEModCkmJnQuY2FsbChpLGUpfSksdGhpcy5fbm9kZXNSZWZ9LHpoLnByb3RvdHlwZS5pbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzfSx6aC5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgVWgodGhpcyx0aGlzLl9jb21wb25lbnQsZSwhMCl9LHpoLnByb3RvdHlwZS5zZWxlY3RBbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBVaCh0aGlzLHRoaXMuX2NvbXBvbmVudCxlLCExKX0semgucHJvdG90eXBlLnNlbGVjdFZpZXdwb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBVaCh0aGlzLDAsIiIsITApfSx6aC5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24oZSx0LG4scixpKXt0aGlzLl9xdWV1ZS5wdXNoKHtjb21wb25lbnQ6dCxzZWxlY3RvcjplLHNpbmdsZTpuLGZpZWxkczpyfSksdGhpcy5fcXVldWVDYi5wdXNoKGkpfTt2YXIgVmg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlU2VsZWN0b3JRdWVyeTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHpoKGV8fGJsKCJjcmVhdGVTZWxlY3RvclF1ZXJ5IikpfX0pO3JnLnN1YnNjcmliZSgib25Mb2FkRm9udEZhY2VDYWxsYmFjayIsZnVuY3Rpb24oZSl7ZmkoZS5jYWxsYmFja0lkLGUuZGF0YSl9KTt2YXIgcWg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbG9hZEZvbnRGYWNlOmZ1bmN0aW9uKGUsdCl7dmFyIG49d2woKTtpZighbilyZXR1cm57ZXJyTXNnOiJsb2FkRm9udEZhY2U6ZmFpbCBub3QgZm9udCBwYWdlIn07cmcucHVibGlzaEhhbmRsZXIoImxvYWRGb250RmFjZSIse29wdGlvbnM6ZSxjYWxsYmFja0lkOnR9LG4pfX0pO3ZhciBXaD1bXTt2YXIgSGg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0TG9jYWxlOmZ1bmN0aW9uKCl7dmFyIGU9ZGcoe2FsbG93RGVmYXVsdDohMH0pO3JldHVybiBlJiZlLiR2bT9lLiR2bS4kbG9jYWxlOm90LmdldExvY2FsZSgpfSxzZXRMb2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIGRnKCkuJHZtLiRsb2NhbGUhPT10JiYoZGcoKS4kdm0uJGxvY2FsZT10LGZnKCkuZm9yRWFjaChmdW5jdGlvbihlKXtyZy5wdWJsaXNoSGFuZGxlcigic2V0TG9jYWxlIix0LGUuJHBhZ2UuaWQpfSksdGcucmVxdWlyZU1vZHVsZSgicGx1cyIpLnNldExhbmd1YWdlKHQpLFdoLmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx7bG9jYWxlOnR9KX0pLCEwKX0sb25Mb2NhbGVDaGFuZ2U6ZnVuY3Rpb24oZSl7V2gucHVzaChlKX19KTt2YXIgR2g9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscGFnZVNjcm9sbFRvOmZ1bmN0aW9uKGUpe3ZhciB0PWZnKCk7cmV0dXJuIHQubGVuZ3RoJiZyZy5wdWJsaXNoSGFuZGxlcigicGFnZVNjcm9sbFRvIixlLHRbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLHt9fX0pO3ZhciBKaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzZXRQYWdlTWV0YTpmdW5jdGlvbihlKXt2YXIgdD1mZygpO3JldHVybiB0Lmxlbmd0aCYmcmcucHVibGlzaEhhbmRsZXIoInNldFBhZ2VNZXRhIixlLHRbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLHt9fX0pO2Z1bmN0aW9uIFhoKGUpe3JldHVybiB5bCgic2V0VGFiQmFyQmFkZ2UiLHtpbmRleDplLmluZGV4LHR5cGU6Im5vbmUifSl9dmFyIFloPVhoLEtoPVtdO19sKCJvblRhYkJhck1pZEJ1dHRvblRhcCIsZnVuY3Rpb24odCl7S2guZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQpfSl9KTt2YXIgWmg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscmVtb3ZlVGFiQmFyQmFkZ2U6WGgsc2hvd1RhYkJhclJlZERvdDpmdW5jdGlvbihlKXtyZXR1cm4geWwoInNldFRhYkJhckJhZGdlIix7aW5kZXg6ZS5pbmRleCx0eXBlOiJyZWREb3QifSl9LGhpZGVUYWJCYXJSZWREb3Q6WWgsb25UYWJCYXJNaWRCdXR0b25UYXA6ZnVuY3Rpb24oZSl7S2gucHVzaChlKX19KSxRaD1bXTtfbCgib25WaWV3RGlkUmVzaXplIixmdW5jdGlvbih0KXtRaC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdCl9KX0pO3ZhciBldix0dixudj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbldpbmRvd1Jlc2l6ZTpmdW5jdGlvbihlKXtRaC5wdXNoKGUpfSxvZmZXaW5kb3dSZXNpemU6ZnVuY3Rpb24oZSl7UWguc3BsaWNlKFFoLmluZGV4T2YoZSksMSl9fSkscnY9T2JqZWN0LmNyZWF0ZShudWxsKSxpdj0oZXY9eyIuL2Jhc2UvYmFzZTY0LmpzIjpXciwiLi9iYXNlL2Nhbi1pLXVzZS5qcyI6R3IsIi4vYmFzZS9pbnRlcmNlcHRvci5qcyI6WHIsIi4vYmFzZS91cHgycHguanMiOmVpLCIuL2NvbnRleHQvYXVkaW8uanMiOnJpLCIuL2NvbnRleHQvYmFja2dyb3VuZC1hdWRpby5qcyI6RWwsIi4vY29udGV4dC9jYW52YXMuanMiOmJwLCIuL2NvbnRleHQvY3JlYXRlLW1hcC1jb250ZXh0LmpzIjpTcCwiLi9jb250ZXh0L2NyZWF0ZS12aWRlby1jb250ZXh0LmpzIjpPcCwiLi9jb250ZXh0L2VkaXRvci5qcyI6QXAsIi4vY29udGV4dC9pbm5lci1hdWRpby5qcyI6QnAsIi4vZGV2aWNlL25ldHdvcmsuanMiOkRwLCIuL2RldmljZS90aGVtZS5qcyI6VXAsIi4va2V5Ym9hcmQvZ2V0LXNlbGVjdGVkLXRleHQtcmFuZ2UuanMiOnFwLCIuL2tleWJvYXJkL2tleWJvYXJkLmpzIjpXcCwiLi9tZWRpYS9wcmV2aWV3LWltYWdlLmpzIjpYcCwiLi9tZWRpYS9yZWNvcmRlci5qcyI6WnAsIi4vbmV0d29yay9kb3dubG9hZC1maWxlLmpzIjp0aCwiLi9uZXR3b3JrL3JlcXVlc3QuanMiOmloLCIuL25ldHdvcmsvc29ja2V0LmpzIjpsaCwiLi9uZXR3b3JrL3VwZGF0ZS5qcyI6ZmgsIi4vbmV0d29yay91cGxvYWQtZmlsZS5qcyI6X2gsIi4vcGx1Z2luL3B1c2guanMiOlRoLCIuL3VpL2NyZWF0ZS1hbmltYXRpb24uanMiOiRoLCIuL3VpL2NyZWF0ZS1pbnRlcnNlY3Rpb24tb2JzZXJ2ZXIuanMiOk5oLCIuL3VpL2NyZWF0ZS1tZWRpYS1xdWVyeS1vYnNlcnZlci5qcyI6RGgsIi4vdWkvY3JlYXRlLXNlbGVjdG9yLXF1ZXJ5LmpzIjpWaCwiLi91aS9sb2FkLWZvbnQtZmFjZS5qcyI6cWgsIi4vdWkvbG9jYWxlLmpzIjpIaCwiLi91aS9wYWdlLXNjcm9sbC10by5qcyI6R2gsIi4vdWkvc2V0LXBhZ2UtbWV0YS5qcyI6SmgsIi4vdWkvdGFiLWJhci5qcyI6WmgsIi4vdWkvd2luZG93LmpzIjpudn0sKHR2PWZ1bmN0aW9uKGUpe3JldHVybiBldltlXXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitlKyInLiIpfSgpfSkua2V5cz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyhldil9LHR2KTtpdi5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbihlKXtPYmplY3QuYXNzaWduKHJ2LGl2KGUpKX0pO3ZhciBvdj1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCkscnYsbWwpLGF2PU9iamVjdC5jcmVhdGUobnVsbCk7dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBpLG87b3ZbZV0/YXZbZV09KG89RnIoaT1lLG92W2VdKSxvZShpKSYmQyhvKT9mdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7Zm9yKHZhciByPVtdLGU9YXJndW1lbnRzLmxlbmd0aC0xOzA8ZS0tOylyW2VdPWFyZ3VtZW50c1tlKzFdO3JldHVybiBDKG4uc3VjY2Vzcyl8fEMobi5mYWlsKXx8QyhuLmNvbXBsZXRlKT9HKGksWC5hcHBseSh2b2lkIDAsW2ksbyxuXS5jb25jYXQocikpKTpHKGksbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtYLmFwcGx5KHZvaWQgMCxbaSxvLE9iamVjdC5hc3NpZ24oe30sbix7c3VjY2VzczplLGZhaWw6dH0pXS5jb25jYXQocikpfSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm5bbnVsbCxlXX0pLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybltlXX0pKX06byk6YXZbZV09RHIoZSl9KTt2YXIgc3Y9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBjdihlLHQsbil7cmV0dXJuIm9uRXJyb3IiIT09dCYmY29uc29sZS5kZWJ1ZygiQXBw77yaIit0KyIgaGF2ZSBiZWVuIGludm9rZWQiKyhuPyIgIitKU09OLnN0cmluZ2lmeShuKToiIikpLChlPWUuJHZtfHxlKS5fX2NhbGxfaG9vayYmZS5fX2NhbGxfaG9vayh0LG4pfWZ1bmN0aW9uIHV2KGUsdCxuKXtyZXR1cm4ib25QYWdlU2Nyb2xsIiE9PXQmJmNvbnNvbGUuZGVidWcoZS4kcGFnZS5yb3V0ZSsiWyIrZS4kcGFnZS5pZCsiXe+8miIrdCsiIGhhdmUgYmVlbiBpbnZva2VkIiksaT10LG89biwocj0ocj1lKS4kdm18fHIpLl9fY2FsbF9ob29rJiZyLl9fY2FsbF9ob29rKGksbyk7dmFyIHIsaSxvfWZ1bmN0aW9uIGx2KGUsdCl7dmFyIG49ZS5uYW1lLHI9ZS5hcmc7InBvc3RNZXNzYWdlIj09PW4/ZnVuY3Rpb24odCxlKXt0PXBhcnNlSW50KHQpO3ZhciBuPWZnKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO2lmKG4mJiFuLiRwYWdlLm1ldGEuaXNOVnVlKXt2YXIgcj1uLiR2bS5fJHZkLmVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIndlYi12aWV3Ij09PWUudHlwZSYmZS5ldmVudHMubWVzc2FnZX0pO2lmKCFyKXJldHVybjtyLmRpc3BhdGNoRXZlbnQoIm1lc3NhZ2UiLHt0eXBlOiJtZXNzYWdlIix0YXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSxjdXJyZW50VGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksdGltZVN0YW1wOkRhdGUubm93KCksZGV0YWlsOntkYXRhOltlXX19KX19KHRbMF0scik6bGdbbl0ocil9ZnVuY3Rpb24gZHYoZSx0KXt2YXIgbj10LmdldEFwcCxpPXQuZ2V0Q3VycmVudFBhZ2VzO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj1pKCk7bi5sZW5ndGgmJnV2KG5bbi5sZW5ndGgtMV0sZSx0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbihlKXtyKHQsZSl9fXZhciBhPXtuYXZpZ2F0ZVRvOmZ1bmN0aW9uKCl7cigib25IaWRlIil9LG5hdmlnYXRlQmFjazpmdW5jdGlvbigpe3IoIm9uU2hvdyIpfX07ZSgib25FcnJvciIsZnVuY3Rpb24oZSl7Y3YobigpLCJvbkVycm9yIixlKX0pLGUoIm9uUGFnZU5vdEZvdW5kIixmdW5jdGlvbihlKXtjdihuKCksIm9uUGFnZU5vdEZvdW5kIixlKX0pLGUoIm9uQXBwUm91dGUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWFbdF07biYmbigpfSksZSgib25BcHBFbnRlckJhY2tncm91bmQiLGZ1bmN0aW9uKCl7Y3YobigpLCJvbkhpZGUiKSxyKCJvbkhpZGUiKX0pLGUoIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixmdW5jdGlvbihlKXtjdihuKCksIm9uU2hvdyIsZSksMCE9PWkoKS5sZW5ndGgmJnIoIm9uU2hvdyIpfSksZSgib25SZXNpemUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49aSgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7biYmdXYobiwib25SZXNpemUiLGUpfSksZSgib25QdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pKCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtyJiYocXU9Im51bWJlciI9PXR5cGVvZihuPXQpP25nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKG4pKTpuLHV2KHIsIm9uUHVsbERvd25SZWZyZXNoIikpfSksZSgib25UYWJJdGVtVGFwIixvKCJvblRhYkl0ZW1UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIixvKCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLG8oIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsbygib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCIpKSxlKCJvbldlYkludm9rZUFwcFNlcnZpY2UiLGx2KX10LmZvckVhY2goZnVuY3Rpb24oZSl7b3ZbZV0/c3ZbZV09RnIoZSxvdltlXSk6c3ZbZV09RHIoZSl9KTt2YXIgZnY9ITE7ZnVuY3Rpb24gcHYoZSx0KXt2YXIgbj0iMSI9PT10O2lmKCFufHwhZnYpe2lmKG4/KGZ2PSEwLGFzKG5nLndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpKSk6R2F8fGFzKG5nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodCkpLEdhLmlkIT09dClyZXR1cm4gY29uc29sZS5lcnJvcigid2Vidmlld1JlYWR5WyIrR2EuaWQrIl1bIit0KyJdIG5vdCBtYXRjaCIpO3ZhciByLGk7aWYoR2EubG9hZGVkPSEwLGk9ZHNbcj10XSxBcnJheS5pc0FycmF5KGkpJiZpLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pLGRlbGV0ZSBkc1tyXSxuKXt2YXIgbz0iLyIrY2cuZW50cnlQYWdlUGF0aCxhPXVnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PW99KTtpZighYS5tZXRhLmlzTlZ1ZSl7dmFyIHM9YS5tZXRhLmlzVGFiQmFyPyJzd2l0Y2hUYWIiOiJuYXZpZ2F0ZVRvIjtyZXR1cm4gbGdbc10oe3VybDpvKyhjZy5lbnRyeVBhZ2VRdWVyeXx8IiIpLG9wZW5UeXBlOiJhcHBMYXVuY2gifSl9fX19dmFyIGh2PU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gdnYoZSx0KXt2YXIgbj1lLmRhdGEscj0oZS5vcHRpb25zLGh2W3RdKTtBcnJheS5pc0FycmF5KHIpJiZyLmZvckVhY2goZnVuY3Rpb24oZSl7ZShuKX0pfXZhciBndixtdj1bXTtmdW5jdGlvbiB5digpe2Zvcih2YXIgZT1tdi5zbGljZSgwKSx0PW12Lmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX1mdW5jdGlvbiBfdihlKXt2YXIgdD1lLmRhdGEsbj10Lm1ldGhvZCxyPXQuYXJncztsZ1tuXSYmbGdbbl0ocil9ZnVuY3Rpb24gYnYoZSx0KXt2YXIgbj1lLmNpZCxyPWUubWV0aG9kLGk9ZS5hcmdzO3Q9cGFyc2VJbnQodCk7dmFyIG89ZmcoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW8pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO3ZhciBhPW8uJHZtLl8kdmQuZ2V0Vm0obik7aWYoIWEpcmV0dXJuIGNvbnNvbGUuZXJyb3IoInZtWyIrbisiXSBub3QgZm91bmQiKTthW3JdJiZhW3JdKGkpfWZ1bmN0aW9uIHd2KHQpe3Q9cGFyc2VJbnQodCk7dmFyIGU9ZmcoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7cmV0dXJuIGV8fGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpfWZ1bmN0aW9uIGt2KGUsdCl7dmFyIG49d3YodCk7biYmKG4uX191bmlhcHBfd2Vidmlldz0hMCl9ZnVuY3Rpb24gU3YoZSx0KXt2YXIgbj13dih0KTtuJiZkZWxldGUgbi5fX3VuaWFwcF93ZWJ2aWV3fWZ1bmN0aW9uIHh2KCl7dmFyIGU9cmcub24sbj1yZy5lbWl0LHQ9cmcuc3Vic2NyaWJlLHI9cmcucHVibGlzaEhhbmRsZXIsaT1yZy5zdWJzY3JpYmVIYW5kbGVyO2lmKGZ1bmN0aW9uKGUsdCl7dC5nZXRBcHA7dmFyIGk9dC5nZXRDdXJyZW50UGFnZXM7ZnVuY3Rpb24gbihyKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0PXBhcnNlSW50KHQpO3ZhciBuPWkoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO24mJnV2KG4scixlKX19dmFyIG89R3UoInJlcXVlc3RDb21wb25lbnRJbmZvIiksYT1HdSgicmVxdWVzdENvbXBvbmVudE9ic2VydmVyIikscz1HdSgicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIpO2UoIm9uUGFnZVNjcm9sbCIsbigib25QYWdlU2Nyb2xsIikpLGUoIm9uUmVhY2hCb3R0b20iLG4oIm9uUmVhY2hCb3R0b20iKSksZSgib25SZXF1ZXN0Q29tcG9uZW50SW5mbyIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXFJZCxuPWUucmVzLHI9by5wb3AodCk7ciYmcihuKX0pLGUoIm9uUmVxdWVzdENvbXBvbmVudE9ic2VydmVyIixmdW5jdGlvbihlKXt2YXIgdD1lLnJlcUlkLG49ZS5yZXFFbmQscj1lLnJlcyxpPWEuZ2V0KHQpO2lmKGkpe2lmKG4pcmV0dXJuIHZvaWQgYS5wb3AodCk7aShyKX19KSxlKCJvblJlcXVlc3RNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxSWQsbj1lLnJlcUVuZCxyPWUucmVzLGk9cy5nZXQodCk7aWYoaSl7aWYobilyZXR1cm4gdm9pZCBzLnBvcCh0KTtpKHIpfX0pfSh0LHtnZXRBcHA6ZGcsZ2V0Q3VycmVudFBhZ2VzOmZnfSksZ2EoInN1YnNjcmliZUhhbmRsZXIiLGZ1bmN0aW9uKGUpe2koZS50eXBlLGUuZGF0YSxlLnBhZ2VJZCl9KSwibmF0aXZlIiE9PWNnLnJlbmRlcmVyKXt0KFlhLHB2KSx0KFhhLHZ2KSx0KEthLHl2KTt2YXIgbz0iLyIrY2cuZW50cnlQYWdlUGF0aDt1Zy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1vfSkubWV0YS5pc05WdWV8fHIoWWEsT2JqZWN0LmNyZWF0ZShudWxsKSxbMV0pfWUoImFwaS4iK1FhLGZ1bmN0aW9uKGUsdCl7bigib25XZWJJbnZva2VBcHBTZXJ2aWNlIixlLHQpfSksdCgib25XeHNJbnZva2VDYWxsTWV0aG9kIixidiksdChaYSxfdiksdChlcyxrdiksdCh0cyxTdil9dmFyIEN2PXtnbG9iYWxEYXRhOnt9fTtmdW5jdGlvbiBUdihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5hbGxvd0RlZmF1bHQ7cmV0dXJuIHZvaWQgMD09PXQmJih0PSExKSxndnx8KHQ/Q3Y6dm9pZCBjb25zb2xlLmVycm9yKCJbd2Fybl06IGdldEFwcCgpIGZhaWxlZC4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLmlvL2NvbGxvY2F0aW9uL2ZyYW1lL3dpbmRvdz9pZD1nZXRhcHAuIikpfWZ1bmN0aW9uIE92KCl7dmFyIGU9cGkoImdsb2JhbEV2ZW50Iiksbz1yZy5lbWl0O3RnLmNvbmZpZy5wcmVsb2FkP25nLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSk6bmcuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigic3BsYXNoY2xvc2VkIixmdW5jdGlvbigpe25nLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSl9KSxuZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsZnVuY3Rpb24oKXtvKCJvbkFwcEVudGVyQmFja2dyb3VuZCIpfSksbmcuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVzdW1lIixmdW5jdGlvbigpe3ZhciBlLHQsbixyLGk9RXMoKTtpJiZpLnVzZXJBY3Rpb24mJih0PShlPWkpLnBhdGgsbj1lLnF1ZXJ5LHI9ZS5yZWZlcnJlckluZm8seHMoQ3Mse3BhdGg6dCxxdWVyeTpuP0Uobik6e30scmVmZXJyZXJJbmZvOnJ8fHt9fSkpLG8oIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixPcygpKX0pLG5nLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoIm5ldGNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgZT12b1tuZy5uZXR3b3JraW5mby5nZXRDdXJyZW50VHlwZSgpXXx8InVua25vd24iO2hpKCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLHtpc0Nvbm5lY3RlZDoibm9uZSIhPT1lLG5ldHdvcmtUeXBlOmV9KX0pO3ZhciB0PTA7bmcuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigiS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe3QhPT1lLmhlaWdodCYmaGkoIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLHtoZWlnaHQ6dD1lLmhlaWdodH0pfSksZS5hZGRFdmVudExpc3RlbmVyKCJ1aXN0eWxlY2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdCxuPXt0aGVtZTplLnVpc3R5bGV9O2N2KGd2LG50LG4pLGhpKG50LG4pLHJnLnB1Ymxpc2hIYW5kbGVyKG50LG4sKHQ9UHMoKSlbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLGhpKCJvblVJU3R5bGVDaGFuZ2UiLHtzdHlsZTplLnVpc3R5bGV9KSxMcygpfSksZS5hZGRFdmVudExpc3RlbmVyKCJ1bmlNUE5hdGl2ZUV2ZW50IixmdW5jdGlvbihlKXtoaSgidW5pTVBOYXRpdmVFdmVudCIsZSl9KSxuZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsRXYpLG5nLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoIldlYnZpZXdQb3N0TWVzc2FnZSIsRXYpfWZ1bmN0aW9uIEV2KGUpe2UuZGF0YSYmZS5kYXRhLnR5cGUmJnZhKGUuZGF0YS50eXBlLGUuZGF0YS5hcmdzfHx7fSl9ZnVuY3Rpb24gSXYoZSl7dmFyIHQsbixyLGksbz0odD17cGF0aDpjZy5lbnRyeVBhZ2VQYXRoLHF1ZXJ5OmNnLmVudHJ5UGFnZVF1ZXJ5LHJlZmVycmVySW5mbzpjZy5yZWZlcnJlckluZm99LG49dC5wYXRoLHI9dC5xdWVyeSxpPXQucmVmZXJyZXJJbmZvLHhzKFRzLHtwYXRoOm4scXVlcnk6cj9FKHIpOnt9LHJlZmVycmVySW5mbzppfHx7fSxjaGFubmVsOm5nLnJ1bnRpbWUuY2hhbm5lbCxsYXVuY2hlcjpuZy5ydW50aW1lLmxhdW5jaGVyfSkseHMoQ3MsVHMpLFRzKTtjdihlLCJvbkxhdW5jaCIsbyksY3YoZSwib25TaG93IixvKTt2YXIgYT10Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0QXBwU3RhdGU7Mj09PShhJiZOdW1iZXIoYSgpKSkmJmN2KGUsIm9uSGlkZSIsbyl9ZnVuY3Rpb24gQXYoKXtmdW5jdGlvbiBlKGUpe3JldHVybiAwPT09KGU9ZS5yZXBsYWNlKC9cLyQvLCIiKSkuaW5kZXhPZigiXyIpP25nLmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSk6ZX12YXIgdD1lKG1vKSxuPWUoeW8pLHI9bi5zcGxpdCgiLyIpO3IucG9wKCkscj1yLmpvaW4oIi8iKSxuZy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKG5nLmlvLmNvbnZlcnRBYnNvbHV0ZUZpbGVTeXN0ZW0ociksZnVuY3Rpb24oZSl7ZS5jcmVhdGVSZWFkZXIoKS5yZWFkRW50cmllcyhmdW5jdGlvbihlKXtlJiZlLmxlbmd0aCYmZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaXNEaXJlY3RvcnkmJjA9PT1lLmZ1bGxQYXRoLmluZGV4T2YodCkmJjAhPT1lLmZ1bGxQYXRoLmluZGV4T2YobikmJmUucmVtb3ZlUmVjdXJzaXZlbHkoKX0pfSl9KX1mdW5jdGlvbiAkdihlLHQpe3ZhciBuLHIsaSxvOyhndj1lKS4kdm09ZSxuPWUsaT10Lm9ic2VydmFibGUoe2xvY2FsZTpyfHxvdC5nZXRMb2NhbGUoKX0pLG89W10sbi4kd2F0Y2hMb2NhbGU9ZnVuY3Rpb24oZSl7by5wdXNoKGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiJGxvY2FsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBpLmxvY2FsZX0sc2V0OmZ1bmN0aW9uKHQpe2kubG9jYWxlPXQsby5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKHQpfSl9fSksT2JqZWN0LmFzc2lnbihndixDdik7dmFyIGE9ZS4kb3B0aW9ucy5nbG9iYWxEYXRhfHx7fTtndi5nbG9iYWxEYXRhPU9iamVjdC5hc3NpZ24oYSxndi5nbG9iYWxEYXRhKSxkdihyZy5vbix7Z2V0QXBwOlR2LGdldEN1cnJlbnRQYWdlczpQc30pLEFzKCksZnVuY3Rpb24oKXtpZihjZy50YWJCYXImJmNnLnRhYkJhci5saXN0JiZjZy50YWJCYXIubGlzdC5sZW5ndGgpe2NnLnRhYkJhci5zZWxlY3RlZD0wO3ZhciBlPWNnLnRhYkJhci5saXN0LmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYWdlUGF0aD09PWNnLmVudHJ5UGFnZVBhdGh9KTtxcy5pbml0KGNnLnRhYkJhcixmdW5jdGlvbihlLHQpe2xnLnN3aXRjaFRhYih7dXJsOiIvIitlLnBhZ2VQYXRoLG9wZW5UeXBlOiJzd2l0Y2hUYWIiLGZyb206InRhYkJhciIsc3VjY2VzczpmdW5jdGlvbigpe3JnLmVtaXQoIm9uVGFiSXRlbVRhcCIse2luZGV4OnQsdGV4dDplLnRleHQscGFnZVBhdGg6ZS5wYWdlUGF0aH0pfX0pfSksLTEhPT1lJiYwIT09KGNnLnRhYkJhci5zZWxlY3RlZD1lKSYmcXMuc3dpdGNoVGFiKGNnLmVudHJ5UGFnZVBhdGgpfX0oKSxPdigpLHh2KCksSXYoZSksaWcoQXYsMWU0KSxjZy5yZWFkeT0hMH12YXIgUHY9WyJ1bmktYXBwIiwidW5pLWxheW91dCIsInVuaS1jb250ZW50IiwidW5pLW1haW4iLCJ1bmktdG9wLXdpbmRvdyIsInVuaS1sZWZ0LXdpbmRvdyIsInVuaS1yaWdodC13aW5kb3ciLCJ1bmktdGFiYmFyIiwidW5pLXBhZ2UiLCJ1bmktcGFnZS1oZWFkIiwidW5pLXBhZ2Utd3JhcHBlciIsInVuaS1wYWdlLWJvZHkiLCJ1bmktcGFnZS1yZWZyZXNoIiwidW5pLWFjdGlvbnNoZWV0IiwidW5pLW1vZGFsIiwidW5pLXRvYXN0IiwidW5pLXJlc2l6ZS1zZW5zb3IiLCJ1bmktc2hhZG93LXJvb3QiLCJ1bmktYWQiLCJ1bmktYXVkaW8iLCJ1bmktYnV0dG9uIiwidW5pLWNhbWVyYSIsInVuaS1jYW52YXMiLCJ1bmktY2hlY2tib3giLCJ1bmktY2hlY2tib3gtZ3JvdXAiLCJ1bmktY292ZXItaW1hZ2UiLCJ1bmktY292ZXItdmlldyIsInVuaS1lZGl0b3IiLCJ1bmktZm9ybSIsInVuaS1mdW5jdGlvbmFsLXBhZ2UtbmF2aWdhdG9yIiwidW5pLWljb24iLCJ1bmktaW1hZ2UiLCJ1bmktaW5wdXQiLCJ1bmktbGFiZWwiLCJ1bmktbGl2ZS1wbGF5ZXIiLCJ1bmktbGl2ZS1wdXNoZXIiLCJ1bmktbWFwIiwidW5pLW1vdmFibGUtYXJlYSIsInVuaS1tb3ZhYmxlLXZpZXciLCJ1bmktbmF2aWdhdG9yIiwidW5pLW9mZmljaWFsLWFjY291bnQiLCJ1bmktb3Blbi1kYXRhIiwidW5pLXBpY2tlciIsInVuaS1waWNrZXItdmlldyIsInVuaS1waWNrZXItdmlldy1jb2x1bW4iLCJ1bmktcHJvZ3Jlc3MiLCJ1bmktcmFkaW8iLCJ1bmktcmFkaW8tZ3JvdXAiLCJ1bmktcmljaC10ZXh0IiwidW5pLXNjcm9sbC12aWV3IiwidW5pLXNsaWRlciIsInVuaS1zd2lwZXIiLCJ1bmktc3dpcGVyLWl0ZW0iLCJ1bmktc3dpdGNoIiwidW5pLXRleHQiLCJ1bmktdGV4dGFyZWEiLCJ1bmktdmlkZW8iLCJ1bmktdmlldyIsInVuaS13ZWItdmlldyJdO2Z1bmN0aW9uIE12KGUpe2lmKDA9PT1lLmluZGV4T2YoIiMiKSl7dmFyIHQ9ZS5zdWJzdHIoMSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiEoIWUuY29tcG9uZW50SW5zdGFuY2V8fGUuY29tcG9uZW50SW5zdGFuY2UuaWQhPT10KXx8ISghZS5kYXRhfHwhZS5kYXRhLmF0dHJzfHxlLmRhdGEuYXR0cnMuaWQhPT10KX19aWYoMD09PWUuaW5kZXhPZigiLiIpKXt2YXIgbj1lLnN1YnN0cigxKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGF0YSYmZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQmJih0PSIiKTt2b2lkIDA9PT1uJiYobj0iIik7aWYodClyZXR1cm4tMSE9PXQuc3BsaXQoanYpLmluZGV4T2YoZSk7aWYobiYmInN0cmluZyI9PXR5cGVvZiBuKXJldHVybi0xIT09bi5zcGxpdChqdikuaW5kZXhPZihlKX0obixlLmRhdGEuc3RhdGljQ2xhc3MsZS5kYXRhLmNsYXNzKX19fXZhciBqdj0vXHMrLztmdW5jdGlvbiBOdihlKXtlLnByb3RvdHlwZS5jcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcj1mdW5jdGlvbihlKXtyZXR1cm4gbGcuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcyxlKX0sZS5wcm90b3R5cGUuY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyPWZ1bmN0aW9uKGUpe3JldHVybiBsZy5jcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXIodGhpcyxlKX0sZS5wcm90b3R5cGUuc2VsZWN0Q29tcG9uZW50PWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBlKHQsbil7aWYobih0LiR2bm9kZXx8dC5fdm5vZGUpKXJldHVybiB0O2Zvcih2YXIgcj10LiRjaGlsZHJlbixpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPWUocltpXSxuKTtpZihvKXJldHVybiBvfX0odGhpcyxNdihlKSl9LGUucHJvdG90eXBlLnNlbGVjdEFsbENvbXBvbmVudHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe24odC4kdm5vZGV8fHQuX3Zub2RlKSYmci5wdXNoKHQpO2Zvcih2YXIgaT10LiRjaGlsZHJlbixvPTA7bzxpLmxlbmd0aDtvKyspZShpW29dLG4scik7cmV0dXJuIHJ9KHRoaXMsTXYoZSksW10pfX1mdW5jdGlvbiBCdihlLHQsbil7aWYoIWUuJHBhcmVudClyZXR1cm4iLTEiO3ZhciByPWUuJHZub2RlLGk9ci5jb250ZXh0LG89ci5kYXRhLmF0dHJzLl9pO3JldHVybiBuJiZrKHIuZGF0YSwia2V5IikmJihvPW8rIjsiK3IuZGF0YS5rZXkpLGkmJmkhPT10JiZpLl8kaWQ/aS5fJGlkKyI7Iit0Ll8kaWQrIiwiK286dC5fJGlkKyIsIitvfXZhciBMdixEdixSdj0iYW5kcm9pZCI9PT1uZy5vcy5uYW1lLnRvTG93ZXJDYXNlKCk/MzAwOjcwMCxGdj0wO2Z1bmN0aW9uIFV2KGUpe3JldHVybiBlLnByZXZlbnREZWZhdWx0PWYsZS5zdG9wUHJvcGFnYXRpb249ZiwodD1lKS5tcD1PYmplY3QuYXNzaWduKHsiQHdhcm5pbmciOiJtcCBpcyBkZXByZWNhdGVkIn0sdCksdC5fcHJvY2Vzc2VkPSEwLHQ7dmFyIHR9X2woIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe2lmKDA8KEZ2PWUuaGVpZ2h0KSl7dmFyIHQ9THY7THY9bnVsbCx0JiZ0KCl9fSk7dmFyIHp2PXt9O3p2WzIwXT1mdW5jdGlvbihlLHMpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lWzBdLG49ZVsxXSxyPWVbMl07bj1TdHJpbmcobik7dmFyIGk9cy5lbGVtZW50cy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNpZD09PXQmJmUubmlkPT09bn0pO2lmKGkpe3ZhciBvPXIudHlwZSxhPVV2KHIpOyJmb2N1cyI9PT1vfHwiYmx1ciI9PT1vP2Z1bmN0aW9uKGUsdCl7aWYoTHY9bnVsbCxEdiYmb2coRHYpLCJmb2N1cyI9PT1lLnR5cGUpe2lmKCEoMDxGdikpcmV0dXJuIER2PWlnKGZ1bmN0aW9uKCl7ZS5kZXRhaWwuaGVpZ2h0PUZ2LHQoZSl9LFJ2KSxMdj1mdW5jdGlvbigpe29nKER2KSxlLmRldGFpbC5oZWlnaHQ9RnYsdChlKX07ZS5kZXRhaWwuaGVpZ2h0PUZ2fXQoZSl9KGEsZnVuY3Rpb24oZSl7aS5kaXNwYXRjaEV2ZW50KG8sZSl9KTppLmRpc3BhdGNoRXZlbnQobyxhKX19KX07dmFyIFZ2PWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGFnZUlkPWUsdGhpcy5wYWdlUGF0aD10LHRoaXMucGFnZVF1ZXJ5PW4sdGhpcy5wYWdlVm09cix0aGlzLmJhdGNoRGF0YT1bXSx0aGlzLnZtcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5wYWdlQ3JlYXRlRGF0YT0hMSx0aGlzLmVsZW1lbnRzPVtdLHRoaXMuX2luaXQoKX07ZnVuY3Rpb24gcXYoZSx0LG4pe2VbdF09bn1mdW5jdGlvbiBXdihlLHQpe3ZhciBuLHIsaTtmb3IociBpbiBlKWk9ZVtyXSxfKHRbcl0saSl8fHF2KG58fChuPU9iamVjdC5jcmVhdGUobnVsbCkpLHIsaSk7cmV0dXJuIG59ZnVuY3Rpb24gSHYoZSx0LG4pe3ZhciByLGksbztmb3IociBpbiBlKWlmKGk9ZVtyXSxvPXRbcl0pe3ZhciBhPVd2KGksbyk7YSYmcXYobixyLGEpfWVsc2UgcXYobixyLGkpO3JldHVybiBufWZ1bmN0aW9uIEd2KG4scil7dmFyIGU9ci4kb3B0aW9ucy5tcE9wdGlvbnM7cmV0dXJuIGUmJkFycmF5LmlzQXJyYXkoZS5leHRlcm5hbENsYXNzZXMpJiZlLmV4dGVybmFsQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZyhlKV07dCYmKG49bi5yZXBsYWNlKGUsdCkpfSksbn1mdW5jdGlvbiBKdihlLHQsbil7c3dpdGNoKHQpe2Nhc2UgbGE6bj1Hdih0aGlzLl8kc3RyaW5naWZ5Q2xhc3MobiksdGhpcyk7YnJlYWs7Y2FzZSBmYTpuPUd2KG4sdGhpcyk7YnJlYWs7Y2FzZSBkYTpuPXRoaXMuXyRub3JtYWxpemVTdHlsZUJpbmRpbmcobik7YnJlYWs7Y2FzZSBzYTpjYXNlIHVhOmNhc2UgY2E6bj1uPzE6MDticmVhaztjYXNlIGFhOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuXyRuZXdEYXRhW2VdfHwodGhpcy5fJG5ld0RhdGFbZV09e30pLHI9blthYV18fChuW2FhXT1bXSk7aWYodC5mb3JJdGVtcylyZXR1cm4gdC5maWxsJiZmdW5jdGlvbihlLHQpe3ZhciBuLHI7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRbbl09bjtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobj0wO248ZTtuKyspdFtuXT1uO2Vsc2UgaWYoZChlKSlmb3Iobj0wLHI9T2JqZWN0LmtleXMoZSkubGVuZ3RoO248cjtuKyspdFtuXT1ufSh0LmZvckl0ZW1zLHIpLHQuZm9ySXRlbXM7dmFyIGk9dC5mb3JJbmRleCxvPXQua2V5O2sodCwia2V5SW5kZXgiKT8oIm9iamVjdCIhPXR5cGVvZiByW2ldJiYocltpXT17fSkscltpXVsiayIrdC5rZXlJbmRleF09byk6cltpXT1vO3JldHVybiBvfS5jYWxsKHRoaXMsZSxuKTtjYXNlImlzIjoiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49bi5vcHRpb25zKX1yZXR1cm4odGhpcy5fJG5ld0RhdGFbZV18fCh0aGlzLl8kbmV3RGF0YVtlXT17fSkpW3RdPW59VnYucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKCl7dmFyIGUsdCxuPXRoaXM7ZT10aGlzLnBhZ2VJZCx0PWZ1bmN0aW9uKGUpe3ZhciByO3I9bixlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXSxuPWVbMV07enZbdF0obixyKX0pfSwoaHZbZV18fChodltlXT1bXSkpLnB1c2godCl9LFZ2LnByb3RvdHlwZS5hZGRNb3VudGVkVm09ZnVuY3Rpb24oZSl7ZS5fJG1vdW50ZWQoKSx0aGlzLmFkZFZkU3luY0NhbGxiYWNrKGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygibW91bnRlZCIpfSl9LFZ2LnByb3RvdHlwZS5hZGRVcGRhdGVkVm09ZnVuY3Rpb24oZSl7ZS5fJHVwZGF0ZWQoKSx0aGlzLmFkZFZkU3luY0NhbGxiYWNrKGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygidXBkYXRlZCIpfSl9LFZ2LnByb3RvdHlwZS5hZGRWZFN5bmNDYWxsYmFjaz1mdW5jdGlvbihlKXtDKGUpJiZtdi5wdXNoKGUpfSxWdi5wcm90b3R5cGUuZ2V0Vm09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudm1zW2VdfSxWdi5wcm90b3R5cGUuYWRkVm09ZnVuY3Rpb24oZSl7dmFyIG49ZS5fJGlkLHQ9dGhpcy52bXNbbl07aWYodCl7dmFyIHI9QnYodCx0LiRwYXJlbnQsSmEpO3QuXyRpZD1yLHRoaXMudm1zW3JdPXQsdGhpcy5lbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2lkO2UuY2lkPXQ9PT1uP3I6dH0pfXRoaXMudm1zW25dPWV9LFZ2LnByb3RvdHlwZS5yZW1vdmVWbT1mdW5jdGlvbihlKXt2YXIgdD1lLl8kaWQ7ZT09PXRoaXMudm1zW3RdJiYodGhpcy5iYXRjaERhdGE9dGhpcy5iYXRjaERhdGEuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlWzFdWzBdIT09dH0pLGRlbGV0ZSB0aGlzLnZtc1t0XSl9LFZ2LnByb3RvdHlwZS5hZGRFbGVtZW50PWZ1bmN0aW9uKGUpey0xPT09dGhpcy5lbGVtZW50cy5pbmRleE9mKGUpJiZ0aGlzLmVsZW1lbnRzLnB1c2goZSl9LFZ2LnByb3RvdHlwZS5yZW1vdmVFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZWxlbWVudHMuaW5kZXhPZihlKTstMSE9PXQmJnRoaXMuZWxlbWVudHMuc3BsaWNlKHQsMSl9LFZ2LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPVt0LG5dO3ImJmkucHVzaChyKSx0aGlzLmJhdGNoRGF0YS5wdXNoKFtlLGldKX0sVnYucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5iYXRjaERhdGEuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZVswXT09PXQmJmVbMV1bMF09PT1ufSl9LFZ2LnByb3RvdHlwZS5zZW5kUGFnZUNyZWF0ZT1mdW5jdGlvbihlKXt0aGlzLnBhZ2VDcmVhdGVEYXRhPWUscmcucHVibGlzaEhhbmRsZXIoWGEse2RhdGE6W1syLGVdXSxvcHRpb25zOnt0aW1lc3RhbXA6RGF0ZS5ub3coKX19LFt0aGlzLnBhZ2VJZF0pfSxWdi5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxpemVkfHwodGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLmJhdGNoRGF0YS5wdXNoKFsxMCxbdGhpcy5wYWdlSWQsdGhpcy5wYWdlUGF0aCx0aGlzLnBhZ2VRdWVyeV1dKSk7dmFyIGU9dGhpcy5iYXRjaERhdGEuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiEoNj09PWVbMF0mJiFPYmplY3Qua2V5cyhlWzFdWzFdKS5sZW5ndGgpfSk7dGhpcy5iYXRjaERhdGEubGVuZ3RoPTAsZS5sZW5ndGgmJnJnLnB1Ymxpc2hIYW5kbGVyKFhhLHtkYXRhOmUsb3B0aW9uczp7dGltZXN0YW1wOkRhdGUubm93KCl9fSxbdGhpcy5wYWdlSWRdKX0sVnYucHJvdG90eXBlLnJlc3RvcmVQYWdlQ3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5iYXRjaERhdGEucHVzaChbMix0aGlzLnBhZ2VDcmVhdGVEYXRhXSl9LFZ2LnByb3RvdHlwZS5yZXN0b3JlTW91bnRlZERhdGE9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZnVuY3Rpb24oZSl7ZS5fJGlkJiZ0LnB1c2goNCxlLl8kaWQsZS5fJGRhdGEsdm9pZCAwKSxlLiRjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBuKGUpfSl9O24odGhpcy5wYWdlVm0pfSxWdi5wcm90b3R5cGUucmVzdG9yZVBhZ2VDcmVhdGVkPWZ1bmN0aW9uKCl7dGhpcy5iYXRjaERhdGEucHVzaChbMTAsW3RoaXMucGFnZUlkLHRoaXMucGFnZVBhdGgsdGhpcy5wYWdlUXVlcnldXSl9LFZ2LnByb3RvdHlwZS5yZXN0b3JlPWZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCx0aGlzLnJlc3RvcmVQYWdlQ3JlYXRlKCksdGhpcy5yZXN0b3JlTW91bnRlZERhdGEoKSx0aGlzLnJlc3RvcmVQYWdlQ3JlYXRlZCgpLHRoaXMuZmx1c2goKX0sVnYucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCx0aGlzLnZtcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5lbGVtZW50cy5sZW5ndGg9MCxlPXRoaXMucGFnZUlkLGRlbGV0ZSBodltlXX07dmFyIFh2PVsib25MYXVuY2giLCJvblNob3ciLCJvbkhpZGUiLCJvblVuaU5WaWV3TWVzc2FnZSIsIm9uUGFnZU5vdEZvdW5kIiwib25UaGVtZUNoYW5nZSIsIm9uRXJyb3IiLCJvblVuaGFuZGxlZFJlamVjdGlvbiIsIm9uSW5pdCIsIm9uTG9hZCIsIm9uUmVhZHkiLCJvblVubG9hZCIsIm9uUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbSIsIm9uVGFiSXRlbVRhcCIsIm9uQWRkVG9GYXZvcml0ZXMiLCJvblNoYXJlVGltZWxpbmUiLCJvblNoYXJlQXBwTWVzc2FnZSIsIm9uUmVzaXplIiwib25QYWdlU2Nyb2xsIiwib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIiwib25CYWNrUHJlc3MiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIiwib25QYWdlU2hvdyIsIm9uUGFnZUhpZGUiLCJvblBhZ2VSZXNpemUiLCJvblNlcnZpY2VDcmVhdGVkIiwib25TZXJ2aWNlQXR0YWNoZWQiXSxZdj1bImRhdGEiLCJwcm9wZXJ0aWVzIiwib3B0aW9ucyIsInJlbGF0aW9ucyJdO2Z1bmN0aW9uIEt2KGksbyl7dmFyIGUsdDtZdi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0LG4scjt0PWksKG49bylbcj1lXSYmT2JqZWN0LmFzc2lnbih0W3JdfHwodFtyXT17fSksbltyXSl9KSxvLmV4dGVybmFsQ2xhc3NlcyYmKGU9aS5leHRlcm5hbENsYXNzZXN8fChpLmV4dGVybmFsQ2xhc3Nlcz1bXSksdD1vLmV4dGVybmFsQ2xhc3NlcyxlLnB1c2guYXBwbHkoZSx0KSksby5wYXRoJiYoaS5wYXRoPW8ucGF0aCl9ZnVuY3Rpb24gWnYoZyl7IWZ1bmN0aW9uKGUpe3ZhciBpPWUuZXh0ZW5kO2UuZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBuPSh0PXR8fHt9KS5tZXRob2RzO24mJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7LTEhPT1Ydi5pbmRleE9mKGUpJiYodFtlXT1uW2VdLGRlbGV0ZSBuW2VdKX0pO3ZhciBlPXQuc2V0dXA7aWYoZSl7dmFyIHI9IiI7dHJ5e3I9ZS50b1N0cmluZygpfWNhdGNoKGUpe31bIm9uUGFnZVNjcm9sbCIsIm9uUmVhY2hCb3R0b20iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuaW5kZXhPZigidW5pQXBwLiIrZSkmJiF0W2VdJiYodFtlXT1bZnVuY3Rpb24oKXt9XSl9KX1yZXR1cm4gaS5jYWxsKHRoaXMsdCl9O3ZhciB0PWUuY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcyxuPXQuY3JlYXRlZDtYdi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pLHQubXBPcHRpb25zPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIHQ7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gS3YobixlKSx0JiZLdihuLHQpLG59fShnKSxnLm1peGluKHtiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy4kb3B0aW9ucztlLnN0b3JlJiYhZy5wcm90b3R5cGUuJHN0b3JlJiYoZy5wcm90b3R5cGUuJHN0b3JlPWUuc3RvcmUpO3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGY9ZS53eHM7aWYoZiYmT2JqZWN0LmtleXMoZikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZbZV19KSwicGFnZSI9PT10aGlzLm1wVHlwZSl7dmFyIHA9ZGcoKTtwLiR2bSYmcC4kdm0uJGkxOG4mJih0aGlzLl9pMThuPXAuJHZtLiRpMThuKSx0aGlzLiRzY29wZT10aGlzLiRvcHRpb25zLnBhZ2VJbnN0YW5jZSxkZWxldGUodGhpcy4kc2NvcGUuJHZtPXRoaXMpLiRvcHRpb25zLnBhZ2VJbnN0YW5jZTt2YXIgaD10aGlzLiRzY29wZS5yb3V0ZSx2PXRoaXMuJHNjb3BlLiRwYWdlLmlkO3RoaXMuXyR2ZC5zZW5kUGFnZUNyZWF0ZShbdixoLChuPXRoaXMscj1oLGk9Ii8iK3Isbz11Zy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1pfSksYT1PYmplY3QuYXNzaWduKHt9LGNnLndpbmRvdyxvLndpbmRvdykscz0hMD09PWEuZGlzYWJsZVNjcm9sbD8xOjAsYz1rKGEsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIpP3BhcnNlSW50KGEub25SZWFjaEJvdHRvbURpc3RhbmNlKTppYSx1PVB1KG4uJG9wdGlvbnMsIm9uUGFnZVNjcm9sbCIpPzE6MCxsPVB1KG4uJG9wdGlvbnMsIm9uUmVhY2hCb3R0b20iKT8xOjAsZD1xYSgpLHt2ZXJzaW9uOkphLGxvY2FsZTp0Zy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKSxkaXNhYmxlU2Nyb2xsOnMsb25QYWdlU2Nyb2xsOnUsb25QYWdlUmVhY2hCb3R0b206bCxvblJlYWNoQm90dG9tRGlzdGFuY2U6YyxzdGF0dXNiYXJIZWlnaHQ6ZCx3aW5kb3dUb3A6YS50aXRsZU5WaWV3JiYiZmxvYXQiPT09YS50aXRsZU5WaWV3LnR5cGU/ZCt0dDowLHdpbmRvd0JvdHRvbTowPD1xcy5pbmRleE9mKHIpJiZxcy5jb3Zlcj9xcy5oZWlnaHQ6MH0pXSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJih1dih0aGlzLiRzY29wZSwib25Mb2FkIixmdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9e307cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24odCl7dHJ5e3JbdF09TyhuW3RdKX1jYXRjaChlKXtyW3RdPW5bdF19fSkscn0odGhpcy4kb3B0aW9ucy5wYWdlUXVlcnkpKSx1dih0aGlzLiRzY29wZSwib25TaG93IikpfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJnV2KHRoaXMuJHNjb3BlLCJvblVubG9hZCIpfSxtb3VudGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJih1dih0aGlzLiRzY29wZSwib25SZWFkeSIpLGZ1bmN0aW9uKGUpe2lmKGNnLnByZWxvYWRSdWxlKXt2YXIgdD1jZy5wcmVsb2FkUnVsZVtlXTt0JiZBcnJheS5pc0FycmF5KHQucGFja2FnZXMpJiZ0LnBhY2thZ2VzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4tMT09PWJzLmluZGV4T2YoZSl9KS5sZW5ndGgmJlNzKHQucGFja2FnZXMpfX0odGhpcy4kc2NvcGUucm91dGUpKX19KX12YXIgUXY9e2luc3RhbGw6ZnVuY3Rpb24obyxlKXt2YXIgdCxuOyFmdW5jdGlvbihvKXtvLmNvbmZpZy5lcnJvckhhbmRsZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXAoZSk7by51dGlsLndhcm4oIkVycm9yIGluICIrbisnOiAiJysoIkVycm9yIj09PXI/ZS50b1N0cmluZygpOmUpKyciJyx0KTt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgZGcmJmRnKCk7aSYmUHUoaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9O3ZhciB0PW8uY29uZmlnLmlzUmVzZXJ2ZWRUYWc7by5jb25maWcuaXNSZXNlcnZlZFRhZz1mdW5jdGlvbihlKXtyZXR1cm4tMSE9PVB2LmluZGV4T2YoZSl8fHQoZSl9LG8uY29uZmlnLmlnbm9yZWRFbGVtZW50cz1Qdjt2YXIgbj1vLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2Uscj1bInN3aXRjaCIsImltYWdlIiwidGV4dCIsInZpZXciXTtvLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIX5yLmluZGV4T2YoZSkmJm4oZSl9fShvKSwodD1vKS5wcm90b3R5cGUuXyRzPUp2LHQucHJvdG90eXBlLl8kc2V0RGF0YT1mdW5jdGlvbihlLHQpe3RoaXMuXyR2ZC5wdXNoKGUsdGhpcy5fJGlkLHQsND09PWUmJnZvaWQgMCl9LHQucHJvdG90eXBlLl8kbW91bnRlZD1mdW5jdGlvbigpe3RoaXMuXyR2ZCYmKEh2KHRoaXMuXyRuZXdEYXRhLHRoaXMuXyRkYXRhLHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuXyRuZXdEYXRhKSksInBhZ2UiPT09dGhpcy5tcFR5cGUmJnRoaXMuXyR2ZC5mbHVzaCgpKX0sdC5wcm90b3R5cGUuXyR1cGRhdGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl8kdmQmJihIdih0aGlzLl8kbmV3RGF0YSx0aGlzLl8kZGF0YSx0aGlzLl8kdmRVcGRhdGVkRGF0YSksdGhpcy5fJGRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLl8kbmV3RGF0YSkpLHRoaXMuXyR2ZC5pbml0aWFsaXplZCYmaWcoZnVuY3Rpb24oKXtlLiRuZXh0VGljayhlLl8kdmQuZmx1c2guYmluZChlLl8kdmQpKX0sMCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIl8kdmQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC5fJHZkb21TeW5jfX0pLHQubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3RoaXMuJG9wdGlvbnMubXBUeXBlJiYodGhpcy5tcFR5cGU9dGhpcy4kb3B0aW9ucy5tcFR5cGUpLCJhcHAiIT09dGhpcy5tcFR5cGUmJigicGFnZSI9PT10aGlzLm1wVHlwZSYmKHRoaXMuXyR2ZG9tU3luYz1uZXcgVnYodGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCx0aGlzLiRvcHRpb25zLnBhZ2VRdWVyeSx0aGlzKSksdGhpcy5fJHZkJiYodGhpcy5fJGlkPUJ2KHRoaXMsdGhpcy4kcGFyZW50LEphKSx0aGlzLl8kdmQuYWRkVm0odGhpcyksdGhpcy5fJHZkTW91bnRlZERhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kc2V0RGF0YSg0LHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRuZXdEYXRhPU9iamVjdC5jcmVhdGUobnVsbCkpKX0sYmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fJHZkKXt2YXIgZT10aGlzLl8kdmQuZmluZCg0LHRoaXMuXyRpZCk7ZT8odGhpcy5fJGRhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kdmRVcGRhdGVkRGF0YT1lWzFdWzFdPU9iamVjdC5jcmVhdGUobnVsbCkpOih0aGlzLl8kdmRVcGRhdGVkRGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRzZXREYXRhKDYsdGhpcy5fJHZkVXBkYXRlZERhdGEpKSx0aGlzLl8kbmV3RGF0YT1PYmplY3QuY3JlYXRlKG51bGwpfX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuXyR2ZCYmKHRoaXMuXyR2ZC5yZW1vdmVWbSh0aGlzKSx0aGlzLl8kdmRvbVN5bmMmJnRoaXMuXyR2ZG9tU3luYy5kZXN0cm95KCkpfX0pLFp2KG8pLE52KG8pLChuPW8pLnByb3RvdHlwZS51bmlJREhhc1JvbGU9ZnVuY3Rpb24oZSl7cmV0dXJuLTE8YygpLnJvbGUuaW5kZXhPZihlKX0sbi5wcm90b3R5cGUudW5pSURIYXNQZXJtaXNzaW9uPWZ1bmN0aW9uKGUpe3ZhciB0PWMoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxuLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLnRva2VuRXhwaXJlZD5EYXRlLm5vdygpfSxvLnByb3RvdHlwZS5nZXRPcGVuZXJFdmVudENoYW5uZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfHwodGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsPW5ldyBJdSksdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsIiRwYWdlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvb3QuJHNjb3BlLiRwYWdlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJG1wIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue3BhZ2U6dGhpcy4kcm9vdC4kc2NvcGV9fX0pO3ZhciByPW8ucHJvdG90eXBlLiRtb3VudDtvLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCJhcHAiPT09dGhpcy5tcFR5cGUpe2lmKHRoaXMuJG9wdGlvbnMucmVuZGVyPWZ1bmN0aW9uKCl7fSx0Zy5jb25maWcucHJlbG9hZClyZXR1cm4gdm9pZCB0Zy5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtuZy51cGRhdGVDb25maWdJbmZvJiZuZy51cGRhdGVDb25maWdJbmZvKCksJHYobixvKSxyLmNhbGwobixlLHQpfSk7JHYodGhpcyxvKX1yZXR1cm4gci5jYWxsKHRoaXMsZSx0KX0sby5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMscj10aGlzLl93YXRjaGVyLGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQsZT1uZXcgUHJvbWlzZShmdW5jdGlvbihlKXtyJiZuLl8kcXVldWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gcj09PWV9KT9tdi5wdXNoKGk/dC5iaW5kKG4pOmUpOm8ubmV4dFRpY2soaT9mdW5jdGlvbigpe3JldHVybiB0LmNhbGwobil9OmUpLGkmJmUoKX0pO3JldHVybiBpP3ZvaWQgMDplfX19O3JldHVybiBhdi5fXyR3eF9fPXN2LHJnLnB1Ymxpc2hIYW5kbGVyPWZ1bmN0aW9uKGUsdCxuKXt0PUpTT04uc3RyaW5naWZ5KHQpLEFycmF5LmlzQXJyYXkobil8fChuPVtuXSk7dmFyIHI9InR5cGVvZiBVbmlWaWV3SlNCcmlkZ2UgIT09ICd1bmRlZmluZWQnICYmIFVuaVZpZXdKU0JyaWRnZS5zdWJzY3JpYmVIYW5kbGVyKFwiIitlKyciLCcrdCsiLF9fUEFHRV9JRF9fKSI7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW5nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKGUpKTt0JiZ0LmV2YWxKUyhyLnJlcGxhY2UoIl9fUEFHRV9JRF9fIixlKSl9KX0scmcuaW52b2tlQ2FsbGJhY2tIYW5kbGVyPUxyLHJnLnJlbW92ZUNhbGxiYWNrSGFuZGxlcj1mdW5jdGlvbihlKXtkZWxldGUgTnJbZV19LHtfX3Z1ZVBsdWdpbjpRdixfX2RlZmluZVBhZ2U6ZnVuY3Rpb24oZSx0KXt5c1tlXT10fSxfX3JlZ2lzdGVyQXBwOiR2LF9fcmVnaXN0ZXJQYWdlOmpzLHVuaTphdixnZXRBcHA6VHYsZ2V0Q3VycmVudFBhZ2VzOlBzLEV2ZW50Q2hhbm5lbDpJdX19KCksbGc9dC51bmksZGc9dC5nZXRBcHAsZmc9dC5nZXRDdXJyZW50UGFnZXM7cmV0dXJuIHR9ZnVuY3Rpb24gZXhpdChlKXtlLnJlZ2lzdGVyVVRTSW50ZXJmYWNlLGUuaW5pdFVUU1Byb3h5Q2xhc3M7dmFyIHQ9ZS5pbml0VVRTUHJveHlGdW5jdGlvbixuPWUuaW5pdFVUU1BhY2thZ2VOYW1lLHI9ZS5pbml0VVRTSW5kZXhDbGFzc05hbWUsaT0oZS5pbml0VVRTQ2xhc3NOYW1lLCJEQ2xvdWRVbmlFeGl0Iiksbz1uKGksITApLGE9cihpLCEwKTtlLmV4aXQ9dCghMSx7bW9kdWxlTmFtZToidW5pLWV4aXQiLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOm8sY2xhc3M6YSxuYW1lOiJleGl0QnlKcyIscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUV4aXRFeGl0T3B0aW9uc0pTT05PYmplY3QiLGRlZmF1bHQ6IlVUU051bGwifV0scmV0dXJuOiIifSl9ZnVuY3Rpb24gZmFjaWFsUmVjb2duaXRpb25WZXJpZnkoZSl7ZS5yZWdpc3RlclVUU0ludGVyZmFjZSxlLmluaXRVVFNQcm94eUNsYXNzO3ZhciB0PWUuaW5pdFVUU1Byb3h5RnVuY3Rpb24sbj1lLmluaXRVVFNQYWNrYWdlTmFtZSxyPWUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLGk9KGUuaW5pdFVUU0NsYXNzTmFtZSwiRENsb3VkVW5pRmFjaWFsUmVjb2duaXRpb25WZXJpZnkiKSxvPSJGYWNpYWxSZWNvZ25pdGlvblZlcmlmeSjlrp7kurrorqTor4EpIixhPW4oaSwhMCkscz1yKGksITApO2Uuc3RhcnRGYWNpYWxSZWNvZ25pdGlvblZlcmlmeT10KCExLHttb2R1bGVOYW1lOm8sbW9kdWxlVHlwZToiYnVpbHQtaW4iLGVyck1zZzoiIixtYWluOiEwLHBhY2thZ2U6YSxjbGFzczpzLG5hbWU6InN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlCeUpzIixwYXJhbXM6W3tuYW1lOiJmYWNlU3R5bGUiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeVN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KSxlLmdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm89dCghMSx7bW9kdWxlTmFtZTpvLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOmEsY2xhc3M6cyxuYW1lOiJnZXRGYWNpYWxSZWNvZ25pdGlvbk1ldGFJbmZvQnlKcyIscGFyYW1zOltdLHJldHVybjoiIn0pfWZ1bmN0aW9uIGZpbGVTeXN0ZW1NYW5hZ2VyKGUpe3ZhciB0PWUucmVnaXN0ZXJVVFNJbnRlcmZhY2Usbj0oZS5pbml0VVRTUHJveHlDbGFzcyxlLmluaXRVVFNQcm94eUZ1bmN0aW9uKSxyPWUuaW5pdFVUU1BhY2thZ2VOYW1lLGk9ZS5pbml0VVRTSW5kZXhDbGFzc05hbWUsbz1lLmluaXRVVFNDbGFzc05hbWUsYT0iRENsb3VkVW5pRmlsZVN5c3RlbU1hbmFnZXIiLHM9InVuaS1maWxlLW1hbmFnZXIiLGM9cihhLCEwKSx1PWkoYSwhMCk7dCgiRmlsZVN5c3RlbU1hbmFnZXJPcHRpb25zIixPYmplY3QuYXNzaWduKHttb2R1bGVOYW1lOnMsbW9kdWxlVHlwZToiYnVpbHQtaW4iLGVyck1zZzoiIixwYWNrYWdlOmMsY2xhc3M6byhhLCJGaWxlU3lzdGVtTWFuYWdlckJ5SnNQcm94eSIsITApfSx7bWV0aG9kczp7cmVhZEZpbGVCeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pRmlsZVN5c3RlbU1hbmFnZXJSZWFkRmlsZU9wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjp7fX0sd3JpdGVGaWxlQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZpbGVTeXN0ZW1NYW5hZ2VyV3JpdGVGaWxlT3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOnt9fSx1bmxpbmtCeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pRmlsZVN5c3RlbU1hbmFnZXJVbkxpbmtPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46e319LG1rZGlyQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZpbGVTeXN0ZW1NYW5hZ2VyTWtEaXJPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46e319LHJtZGlyQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZpbGVTeXN0ZW1NYW5hZ2VyUm1EaXJPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46e319LHJlYWRkaXJCeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pRmlsZVN5c3RlbU1hbmFnZXJSZWFkRGlyT3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOnt9fSxhY2Nlc3NCeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pRmlsZVN5c3RlbU1hbmFnZXJBY2Nlc3NPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46e319LHJlbmFtZUJ5SnM6e2FzeW5jOiExLHBhcmFtczpbe25hbWU6Im9wdGlvbnMiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGaWxlU3lzdGVtTWFuYWdlclJlbmFtZU9wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjp7fX0sY29weUZpbGVCeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pRmlsZVN5c3RlbU1hbmFnZXJDb3B5RmlsZU9wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjp7fX0sZ2V0RmlsZUluZm9CeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pRmlsZVN5c3RlbU1hbmFnZXJHZXRGaWxlSW5mb09wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjp7fX0sc3RhdEJ5SnM6e2FzeW5jOiExLHBhcmFtczpbe25hbWU6Im9wdGlvbnMiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGaWxlU3lzdGVtTWFuYWdlclN0YXRPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46e319fSxwcm9wczpbXX0pKSxlLmdldEZpbGVTeXN0ZW1NYW5hZ2VyPW4oITEse21vZHVsZU5hbWU6cyxtb2R1bGVUeXBlOiJidWlsdC1pbiIsZXJyTXNnOiIiLG1haW46ITAscGFja2FnZTpjLGNsYXNzOnUsbmFtZToiZ2V0RmlsZVN5c3RlbU1hbmFnZXJCeUpzIixwYXJhbXM6W10scmV0dXJuOnt0eXBlOiJpbnRlcmZhY2UiLG9wdGlvbnM6IkZpbGVTeXN0ZW1NYW5hZ2VyT3B0aW9ucyJ9fSl9ZnVuY3Rpb24gaW5zdGFsbEFwayhlKXtlLnJlZ2lzdGVyVVRTSW50ZXJmYWNlLGUuaW5pdFVUU1Byb3h5Q2xhc3M7dmFyIHQ9ZS5pbml0VVRTUHJveHlGdW5jdGlvbixuPWUuaW5pdFVUU1BhY2thZ2VOYW1lLHI9ZS5pbml0VVRTSW5kZXhDbGFzc05hbWUsaT0oZS5pbml0VVRTQ2xhc3NOYW1lLCJEQ2xvdWRVbmlJbnN0YWxsQXBrIiksbz1uKGksITApLGE9cihpLCEwKTtlLmluc3RhbGxBcGs9dCghMSx7bW9kdWxlTmFtZToidW5pLWluc3RhbGxBcGsiLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOm8sY2xhc3M6YSxuYW1lOiJpbnN0YWxsQXBrQnlKcyIscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUluc3RhbGxBcGtJbnN0YWxsQXBrT3B0aW9uc0pTT05PYmplY3QifV0scmV0dXJuOiIifSl9ZnVuY3Rpb24gaW5pdFVuaUV4dEFwaXMoZSl7ZXhpdChlKSxmYWNpYWxSZWNvZ25pdGlvblZlcmlmeShlKSxmaWxlU3lzdGVtTWFuYWdlcihlKSxpbnN0YWxsQXBrKGUpfWZ1bmN0aW9uIGluaXRTZXJ2aWNlSlNCcmlkZ2UoZSl7dmFyIHI9bmV3IGU7VW5pU2VydmljZUpTQnJpZGdlPXtvbjpyLiRvbi5iaW5kKHIpLG9mZjpyLiRvZmYuYmluZChyKSxvbmNlOnIuJG9uY2UuYmluZChyKSxlbWl0OnIuJGVtaXQuYmluZChyKSxzdWJzY3JpYmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci4kb24oInZpZXcuIitlLHQpfSx1bnN1YnNjcmliZTpmdW5jdGlvbihlLHQpe3JldHVybiByLiRvZmYoInZpZXcuIitlLHQpfSxzdWJzY3JpYmVIYW5kbGVyOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gci4kZW1pdCgidmlldy4iK2UsdCxuKX19fWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlQ29udGV4dCQxKGUpe3ZhciB0LG49ZS53ZWV4LHI9ZS5WdWUsaT1uZXcgZS5XZWV4UGx1cyhuKTsoVW5pU2VydmljZUpTQnJpZGdlfHxpbml0U2VydmljZUpTQnJpZGdlKHIpLHVuaSl8fCh0PWNyZWF0ZVNlcnZpY2VDb250ZXh0KHIsbixpLFVuaVNlcnZpY2VKU0JyaWRnZSxlKSxfX3Z1ZVBsdWdpbj10Ll9fdnVlUGx1Z2luLF9fZGVmaW5lUGFnZT10Ll9fZGVmaW5lUGFnZSxfX3JlZ2lzdGVyQXBwPXQuX19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZT10Ll9fcmVnaXN0ZXJQYWdlLHVuaT10LnVuaSxnZXRBcHA9dC5nZXRBcHAsZ2V0Q3VycmVudFBhZ2VzPXQuZ2V0Q3VycmVudFBhZ2VzLGluaXRVbmlFeHRBcGlzKHVuaSkpO3JldHVybntfX3Z1ZVBsdWdpbjpfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2U6X19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHA6X19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZTpfX3JlZ2lzdGVyUGFnZSxwbHVzOmksdW5pOnVuaSx3eDp1bmkuX18kd3hfX3x8dW5pLGdldEFwcDpnZXRBcHAsZ2V0Q3VycmVudFBhZ2VzOmdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U6VW5pU2VydmljZUpTQnJpZGdlfX1mdW5jdGlvbiBzdHlsZU1peGluKGUpe2UucHJvdG90eXBlLl9fbWVyZ2Vfc3R5bGU9ZnVuY3Rpb24ocixlKXtpZih2b2lkIDA9PT1yJiYocj17fSkscil7dmFyIGk9ZXx8dGhpcy4kb3B0aW9ucy5zdHlsZTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07aWYodCl7dmFyIG49cltlXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBhPW5bZV0scz10W2VdOyJvYmplY3QiPT10eXBlb2YgYT8oIm9iamVjdCIhPXR5cGVvZiBzJiYocz10W2VdPXt9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PSEwO2lmKHNbZV0pZm9yKHZhciBuPWFbZV0uc2xpY2UoMSwzKSxyPXNbZV0uc2xpY2UoMSwzKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPW5baV0tcltpXTtpZigwIT09byl7dD0wPG87YnJlYWt9fXQmJihzW2VdPWFbZV0pfSkpOnRbZV09YX0pfWVsc2UgaVtlXT1PYmplY3QuYXNzaWduKHt9LHJbZV0pfSksZXx8KHRoaXMuJG9wdGlvbnMuc3R5bGU9aSl9fX1mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYXRvYihlKS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSl9ZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJJbmZvKCl7dmFyIGUsdD10aGlzLnVuaS5nZXRTdG9yYWdlU3luYygidW5pX2lkX3Rva2VuIil8fCIiLG49dC5zcGxpdCgiLiIpO2lmKCF0fHwzIT09bi5sZW5ndGgpcmV0dXJue3VpZDpudWxsLHJvbGU6W10scGVybWlzc2lvbjpbXSx0b2tlbkV4cGlyZWQ6MH07dHJ5e2U9SlNPTi5wYXJzZShiNjREZWNvZGVVbmljb2RlKG5bMV0pKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8miIrZS5tZXNzYWdlKX1yZXR1cm4gZS50b2tlbkV4cGlyZWQ9MWUzKmUuZXhwLGRlbGV0ZSBlLmV4cCxkZWxldGUgZS5pYXQsZX1mdW5jdGlvbiB1bmlJZE1peGluKGUsbil7ZS5wcm90b3R5cGUudW5pSURIYXNSb2xlPWZ1bmN0aW9uKGUpe3JldHVybi0xPGdldEN1cnJlbnRVc2VySW5mby5iaW5kKG4pKCkucm9sZS5pbmRleE9mKGUpfSxlLnByb3RvdHlwZS51bmlJREhhc1Blcm1pc3Npb249ZnVuY3Rpb24oZSl7dmFyIHQ9Z2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxlLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS50b2tlbkV4cGlyZWQ+RGF0ZS5ub3coKX19V2VleEluc3RhbmNlLnByb3RvdHlwZS5yZXF1aXJlTW9kdWxlPWZ1bmN0aW9uKG4pe3ZhciByPWdldElkKHRoaXMpO2lmKHImJnRoaXMuZG9jdW1lbnQmJnRoaXMuZG9jdW1lbnQudGFza0NlbnRlcil7aWYoaXNSZWdpc3RlcmVkTW9kdWxlKG4pKXt2YXIgZT17fSx0PWdldE1vZHVsZURlc2NyaXB0aW9uKG4pLGk9ZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZU1vZHVsZUdldHRlcihuLHQsbW9kdWxlR2V0dGVyKHIsbix0KSl9LHNldDpmdW5jdGlvbihlKXtyZXR1cm4gbW9kdWxlU2V0dGVyKHIsbix0LGUpfX0pfTtmb3IodmFyIG8gaW4gdClpKG8pO3JldHVybiBlfWNvbnNvbGUud2FybigiW0pTIEZyYW1ld29ya10g5b2T5YmN6L+Q6KGM55qE5Z+65bqn5LiN5YyF5ZCr5Y6f55Sf5o+S5Lu2WyIrbisiXe+8jOivt+WcqG1hbmlmZXN05Lit6YWN572u6K+l5o+S5Lu277yM6YeN5paw5Yi25L2c5YyF5ous6K+l5Y6f55Sf5o+S5Lu255qE6Ieq5a6a5LmJ6L+Q6KGM5Z+65bqnIil9ZWxzZSBjb25zb2xlLmVycm9yKCdbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVxdWlyZU1vZHVsZSgiJytuKyciKSwgaW5zdGFuY2UgKCcrcisiKSBkb2Vzbid0IGV4aXN0IGFueW1vcmUuIil9LFdlZXhJbnN0YW5jZS5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3ZhciB0PWUubWF0Y2goL15AKFx3KylcLyhbXHctXSspKFwuKFx3KykpPyQvaSk7aWYodCl7dmFyIG49dFsxXSxyPXRbMl0saT10WzRdO3N3aXRjaChuKXtjYXNlIm1vZHVsZSI6cmV0dXJuIGlzUmVnaXN0ZXJlZE1vZHVsZShyLGkpO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gaXNSZWdpc3RlcmVkQ29tcG9uZW50KHIpfX1yZXR1cm4gbnVsbH0sV2VleEluc3RhbmNlLnByb3RvdHlwZS5pbXBvcnRTY3JpcHQ9ZnVuY3Rpb24oZSxyKXt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9Z2V0SWQodGhpcyksbz1nZXRUYXNrQ2VudGVyKGkpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe28mJiJmdW5jdGlvbiI9PXR5cGVvZiBvLnNlbmR8fG4obmV3IEVycm9yKCdbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gaW1wb3J0IHNjcmlwdCAiJytlKyciLCBubyB0YXNrQ2VudGVyICgnK2krIikgbWF0Y2hlZC4iKSk7dHJ5e28uc2VuZCgibW9kdWxlIix7bW9kdWxlOiJzY3JpcHQiLG1ldGhvZDoiaW1wb3J0U2NyaXB0In0sW2Uscl0se2NhbGxiYWNrOltmdW5jdGlvbihlKXtyZXR1cm4gdChlKX0sZnVuY3Rpb24oZSl7cmV0dXJuIG4oZSl9XX0pfWNhdGNoKGUpe24oZSl9fSl9O3ZhciBkZWNvZGU9ZGVjb2RlVVJJQ29tcG9uZW50O2Z1bmN0aW9uIHBhcnNlUXVlcnkoZSl7dmFyIGk9e307cmV0dXJuKGU9ZS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIikpJiZlLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLG49ZGVjb2RlKHQuc2hpZnQoKSkscj0wPHQubGVuZ3RoP2RlY29kZSh0LmpvaW4oIj0iKSk6bnVsbDt2b2lkIDA9PT1pW25dP2lbbl09cjpBcnJheS5pc0FycmF5KGlbbl0pP2lbbl0ucHVzaChyKTppW25dPVtpW25dLHJdfSksaX12YXIgTElGRUNZQ0xFX0hPT0tTPVsib25MYXVuY2giLCJvblNob3ciLCJvbkhpZGUiLCJvblVuaU5WaWV3TWVzc2FnZSIsIm9uUGFnZU5vdEZvdW5kIiwib25UaGVtZUNoYW5nZSIsIm9uRXJyb3IiLCJvblVuaGFuZGxlZFJlamVjdGlvbiIsIm9uTG9hZCIsIm9uUmVhZHkiLCJvblVubG9hZCIsIm9uUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbSIsIm9uVGFiSXRlbVRhcCIsIm9uQWRkVG9GYXZvcml0ZXMiLCJvblNoYXJlVGltZWxpbmUiLCJvblNoYXJlQXBwTWVzc2FnZSIsIm9uUmVzaXplIiwib25QYWdlU2Nyb2xsIiwib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIiwib25CYWNrUHJlc3MiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsIm9uUGFnZVNob3ciLCJvblBhZ2VIaWRlIiwib25QYWdlUmVzaXplIl07ZnVuY3Rpb24gcGFyc2VRdWVyeUJ5QnVuZGxlVXJsKGUpe3ZhciB0PXt9O2lmKGUmJiJzdHJpbmciPT10eXBlb2YgZSl7dmFyIG49ZS5pbmRleE9mKCI/Iik7aWYoLTEhPT1uKXt2YXIgcj1lLnN1YnN0cihuKzEpOyIuanMiPT09ci5zdWJzdHIoLTMpJiYocj1yLnN1YnN0cigwLHIubGVuZ3RoLTMpKSx0PXBhcnNlUXVlcnkocil9fXJldHVybiB0fXZhciBJTlNUQU5DRV9JRD0iW1tDdXJyZW50SW5zdGFuY2VJZF1dIjtmdW5jdGlvbiBnZXRJZCQxKGUpe3JldHVybiBlW0lOU1RBTkNFX0lEXX1mdW5jdGlvbiBpbml0U2NvcGUodCxlKXt2YXIgbj1lLmdldEN1cnJlbnRQYWdlcygpLHI9bltuLmxlbmd0aC0xXTtpZih0aGlzLiRvcHRpb25zLnJvdXRlPT09ci5yb3V0ZSlyLiR2bT10aGlzLHJbSU5TVEFOQ0VfSURdPWdldElkJDEodCk7ZWxzZSBpZih0LmNvbmZpZy5vbGRJbnN0YW5jZUlkKXt2YXIgaT1lLmdldEN1cnJlbnRQYWdlcyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZ2V0SWQkMShlKT09PXQuY29uZmlnLm9sZEluc3RhbmNlSWR9KTtpJiYoaS4kdm09dGhpcyl9dGhpcy4kc2NvcGU9cn1mdW5jdGlvbiBsaWZlY3ljbGVNaXhpbihyLGksbyl7dmFyIHQ9ci5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzLG49dC5jcmVhdGVkO0xJRkVDWUNMRV9IT09LUy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pO3ZhciBhPXBhcnNlUXVlcnlCeUJ1bmRsZVVybChpLmNvbmZpZy5idW5kbGVVcmwpO3IubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fJHdlZXg9aTt0cnl7dmFyIHQ9by5nZXRBcHAoe2FsbG93RGVmYXVsdDohMH0pO3QmJiF0aGlzLiRzdG9yZSYmKHQuJHN0b3JlfHx0LiR2bSYmdC4kdm0uJHN0b3JlKSYmKHRoaXMuJHN0b3JlPXQuJHN0b3JlfHx0LiR2bS4kc3RvcmUpfWNhdGNoKGUpe31zd2l0Y2godGhpcy4kb3B0aW9ucy5tcFR5cGUpe2Nhc2UiYXBwIjppZih0aGlzLm1wVHlwZT0iYXBwIix0aGlzLiRvcHRpb25zLnJlbmRlcj1mdW5jdGlvbigpe30sby53ZWV4LmNvbmZpZy5wcmVsb2FkKW8ud2VleC5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtvLnBsdXMudXBkYXRlQ29uZmlnSW5mbyYmby5wbHVzLnVwZGF0ZUNvbmZpZ0luZm8oKSxvLl9fcmVnaXN0ZXJBcHAoZSxyKX0pO2Vsc2Ugby5fX3JlZ2lzdGVyQXBwKHRoaXMscik7YnJlYWs7Y2FzZSJwYWdlIjp0aGlzLm1wVHlwZT0icGFnZSI7dmFyIG49by5wbHVzLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKTtuLl9fcHJlbG9hZF9fPyhuLmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLGZ1bmN0aW9uKCl7IWUuJHNjb3BlJiZpbml0U2NvcGUuY2FsbChlLGksbyksZS5fX2NhbGxfaG9vaygib25TaG93Iil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygib25IaWRlIil9KSk6KDA9PT1vLmdldEN1cnJlbnRQYWdlcygpLmxlbmd0aCYmby5fX3JlZ2lzdGVyUGFnZSh7dXJsOiIvIit0aGlzLiRvcHRpb25zLnJvdXRlLHBhdGg6Ii8iK3RoaXMuJG9wdGlvbnMucm91dGUsd2VidmlldzpufSksaW5pdFNjb3BlLmNhbGwodGhpcyxpLG8pKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtpZigicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSl7dmFyIGU9by5wbHVzLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKTtpZihlLl9fcHJlbG9hZF9fKXt2YXIgdD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYSk7aWYoZS5fX3F1ZXJ5X18pdHJ5e09iamVjdC5hc3NpZ24odCxKU09OLnBhcnNlKGUuX19xdWVyeV9fKSl9Y2F0Y2goZSl7fXRoaXMuX19jYWxsX2hvb2soIm9uTG9hZCIsdCl9ZWxzZXt2YXIgbj1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYSkscj1vLmdldEN1cnJlbnRQYWdlcygpO09iamVjdC5hc3NpZ24obixyW3IubGVuZ3RoLTFdLm9wdGlvbnMpLHRoaXMuX19jYWxsX2hvb2soIm9uTG9hZCIsbiksdGhpcy5fX2NhbGxfaG9vaygib25TaG93Iil9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7InBhZ2UiPT09dGhpcy4kb3B0aW9ucy5tcFR5cGUmJih0aGlzLl9fY2FsbF9ob29rKCJvblJlYWR5IiksdGhpcy4kb3B0aW9ucy5vblBhZ2VTY3JvbGwmJnRoaXMuJGVsLmFkZEV2ZW50KCJzY3JvbGwiLGZ1bmN0aW9uKGUpe2Uuc2Nyb2xsVG9wPWUuZGV0YWlsLnNjcm9sbFRvcCx0Ll9fY2FsbF9ob29rKCJvblBhZ2VTY3JvbGwiLGUpfSksdGhpcy4kb3B0aW9ucy5vblJlYWNoQm90dG9tJiZ0aGlzLiRlbC5hZGRFdmVudCgic2Nyb2xsdG9sb3dlciIsZnVuY3Rpb24oZSl7dC5fX2NhbGxfaG9vaygib25SZWFjaEJvdHRvbSIsZSl9KSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXsicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSYmdGhpcy5fX2NhbGxfaG9vaygib25VbmxvYWQiKX19KX1mdW5jdGlvbiBicm9hZGNhc3QoZSx0KXtmb3IodmFyIG49W10scj1hcmd1bWVudHMubGVuZ3RoLTI7MDxyLS07KW5bcl09YXJndW1lbnRzW3IrMl07Zm9yKHZhciBpPXRoaXMuJGNoaWxkcmVuLG89aS5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzPWlbYV0sYz1zLiRvcHRpb25zLm5hbWU7aWYofmUuaW5kZXhPZihjKSlyZXR1cm4gcy4kZW1pdC5hcHBseShzLFt0XS5jb25jYXQobikpLCExO2lmKCExPT09YnJvYWRjYXN0LmFwcGx5KHMsW2UsdF0uY29uY2F0KFtuXSkpKXJldHVybiExfX12YXIgZW1pdHRlcj17bWV0aG9kczp7JHRyaWdnZXI6ZnVuY3Rpb24oZSx0KXt0aGlzLiRlbWl0KGUscHJvY2Vzc0N1c3RvbUV2ZW50LmNhbGwodGhpcyxlLHQsdGhpcy4kZWwpKX0sJGRpc3BhdGNoOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aC0yOzA8ci0tOyluW3JdPWFyZ3VtZW50c1tyKzJdOyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKTtmb3IodmFyIGk9dGhpcy4kcGFyZW50fHx0aGlzLiRyb290LG89aS4kb3B0aW9ucy5uYW1lO2kmJighb3x8IX5lLmluZGV4T2YobykpOykoaT1pLiRwYXJlbnQpJiYobz1pLiRvcHRpb25zLm5hbWUpO2kmJmkuJGVtaXQuYXBwbHkoaSxbdF0uY29uY2F0KG4pKX0sJGJyb2FkY2FzdDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGgtMjswPHItLTspbltyXT1hcmd1bWVudHNbcisyXTsic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksYnJvYWRjYXN0LmFwcGx5KHRoaXMsW2UsdF0uY29uY2F0KG4pKX19fSxsaXN0ZW5lcnM9e3Byb3BzOntpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuX2FkZExpc3RlbmVycyh0aGlzLmlkKSx0aGlzLiR3YXRjaCgiaWQiLGZ1bmN0aW9uKGUsdCl7bi5fcmVtb3ZlTGlzdGVuZXJzKHQsITApLG4uX2FkZExpc3RlbmVycyhlLCEwKX0pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKHRoaXMuaWQpfSxtZXRob2RzOntfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZighbnx8dCl7dmFyIGk9dGhpcy4kb3B0aW9ucy5saXN0ZW5lcnM7Ik9iamVjdCI9PT10eXBvZihpKSYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihlKXtuPzAhPT1lLmluZGV4T2YoIkAiKSYmMCE9PWUuaW5kZXhPZigidW5pLSIpJiZyLl8kYnVzLiRvbigidW5pLSIrZSsiLSIrdCxyW2lbZV1dKTowPT09ZS5pbmRleE9mKCJAIik/ci4kb24oInVuaS0iK2Uuc3Vic3RyKDEpLHJbaVtlXV0pOjA9PT1lLmluZGV4T2YoInVuaS0iKT9yLl8kYnVzLiRvbihlLHJbaVtlXV0pOnQmJnIuXyRidXMuJG9uKCJ1bmktIitlKyItIityLiRwYWdlLmlkKyItIit0LHJbaVtlXV0pfSl9fSxfcmVtb3ZlTGlzdGVuZXJzOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZighbnx8dCl7dmFyIGk9dGhpcy4kb3B0aW9ucy5saXN0ZW5lcnM7Ik9iamVjdCI9PT10eXBvZihpKSYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihlKXtuPzAhPT1lLmluZGV4T2YoIkAiKSYmMCE9PWUuaW5kZXhPZigidW5pLSIpJiZyLl8kYnVzLiRvZmYoInVuaS0iK2UrIi0iK3QscltpW2VdXSk6MD09PWUuaW5kZXhPZigiQCIpP3IuJG9mZigidW5pLSIrZS5zdWJzdHIoMSkscltpW2VdXSk6MD09PWUuaW5kZXhPZigidW5pLSIpP3IuXyRidXMuJG9mZihlLHJbaVtlXV0pOnQmJnIuXyRidXMuJG9mZigidW5pLSIrZSsiLSIrci4kcGFnZS5pZCsiLSIrdCxyW2lbZV1dKX0pfX19fSxfYWREYXRhQ2FjaGU9e307ZnVuY3Rpb24gZ2V0QWREYXRhKGUsdCxuLHIsaSxvKXt2YXIgYT10KyItIituLHM9X2FkRGF0YUNhY2hlW2FdO3MmJjA8cy5sZW5ndGg/aShzLnNwbGljZSgwLDEpWzBdKTplLmFkLmdldEFkcyh7YWRwaWQ6dCxjb3VudDo1LHdpZHRoOm4sZXh0OntjaGFubmVsOnJ9fSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztpKHQuc3BsaWNlKDAsMSlbMF0pLF9hZERhdGFDYWNoZVthXT1zP3MuY29uY2F0KHQpOnR9LGZ1bmN0aW9uKGUpe28oe2VyckNvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2V9KX0pfWZ1bmN0aW9uIGdldEFkKG4scil7cmV0dXJue25hbWU6IkFkIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOnthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpPYmplY3R9LHdpZHRoOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjaGFubmVsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnthZFdpZHRoOjAsYWREYXRhOnt9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5kYXRhKXRoaXMuX2ZpbGxEYXRhKHRoaXMuZGF0YSk7ZWxzZSBpZih0aGlzLmFkcGlkKXtpZih0aGlzLndpZHRoJiYwPHRoaXMud2lkdGgubGVuZ3RoKXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMud2lkdGgpO3JldHVybi9cZCtbdXJdcHgkL2kudGVzdCh0aGlzLndpZHRoKT90aGlzLmFkV2lkdGg9dXB4MnB4KGUpOnRoaXMuYWRXaWR0aD1lLHZvaWQgdGhpcy5fbG9hZERhdGEoKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHQuJHJlZnMuYWQsZnVuY3Rpb24oZSl7dC5hZFdpZHRoPTA9PT1lLnNpemUud2lkdGg/LTE6ZS5zaXplLndpZHRoLHQuX2xvYWREYXRhKCl9KX0sNTApfX0sd2F0Y2g6e2FkcGlkOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2xvYWREYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2ZpbGxEYXRhKGUpfX0sbWV0aG9kczp7X29uZG93bmxvYWRjaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigiZG93bmxvYWRjaGFuZ2UiLGUuZGV0YWlsKX0sX29uZGlzbGlrZTpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJjbG9zZSIsZS5kZXRhaWwpfSxfbG9hZERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztnZXRBZERhdGEoci5wbHVzfHxuZXcgci5XZWV4UGx1cyhyLndlZXgpLGV8fHRoaXMuYWRwaWQsdGhpcy5hZFdpZHRoLHRoaXMuY2hhbm5lbCxmdW5jdGlvbihlKXt0Ll9maWxsRGF0YShlKX0sZnVuY3Rpb24oZSl7dC4kdHJpZ2dlcigiZXJyb3IiLGUpfSl9LF9maWxsRGF0YTpmdW5jdGlvbihlKXt0aGlzLmFkRGF0YT1lLHRoaXMuJHRyaWdnZXIoImxvYWQiLHt9KX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD17fSxuPXRoaXMuJGxpc3RlbmVycztyZXR1cm4gbi5kb3dubG9hZGNoYW5nZSYmKHQuZG93bmxvYWRjaGFuZ2U9dGhpcy5fb25kb3dubG9hZGNoYW5nZSksbi5jbG9zZSYmKHQuZGlzbGlrZT10aGlzLl9vbmRpc2xpa2UpLGUoInUtYWQiLHRoaXMuX2coe3JlZjoiYWQiLGF0dHJzOntkYXRhOnRoaXMuYWREYXRhLHJlbmRlcmluZzohMH0sb246dH0sbiksW10sMSl9fX1mdW5jdGlvbiBpbml0JDMoZSx0LG4pe2UuY29tcG9uZW50KCJhZCIsZ2V0QWQodCxuKSl9dmFyIF9hZERhdGFDYWNoZSQxPXt9O2Z1bmN0aW9uIGdldEFkRGF0YSQxKGUsdCxuLHIsaSxvKXt2YXIgYT10KyItIituLHM9X2FkRGF0YUNhY2hlJDFbYV07cyYmMDxzLmxlbmd0aD9pKHMuc3BsaWNlKDAsMSlbMF0pOmUuYWQuZ2V0RHJhd0Fkcyh7YWRwaWQ6dCxjb3VudDozLHdpZHRoOm4saGVpZ2h0OnJ9LGZ1bmN0aW9uKGUpe3ZhciB0PWUuYWRzO2kodC5zcGxpY2UoMCwxKVswXSksX2FkRGF0YUNhY2hlJDFbYV09cz9zLmNvbmNhdCh0KTp0fSxmdW5jdGlvbihlKXtvKHtlcnJDb2RlOmUuY29kZSxlcnJNc2c6ZS5tZXNzYWdlfSl9KX1mdW5jdGlvbiBnZXRBZCQxKGUsbil7cmV0dXJue25hbWU6IkFkRHJhdyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7YWRwaWQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6IiJ9LGRhdGE6e3R5cGU6T2JqZWN0fSx3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57YWRXaWR0aDowLGFkSGVpZ2h0OjAsYWREYXRhOnt9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kYXRhP3RoaXMuX2ZpbGxEYXRhKHRoaXMuZGF0YSk6dGhpcy5hZHBpZCYmc2V0VGltZW91dChmdW5jdGlvbigpe2UucmVxdWlyZU1vZHVsZSgiZG9tIikuZ2V0Q29tcG9uZW50UmVjdCh0LiRyZWZzLmFkLGZ1bmN0aW9uKGUpe3QuYWRXaWR0aD0wPT09ZS5zaXplLndpZHRoPy0xOmUuc2l6ZS53aWR0aCx0LmFkSGVpZ2h0PTA9PT1lLnNpemUuaGVpZ2h0Py0xOmUuc2l6ZS5oZWlnaHQsdC5fbG9hZERhdGEoKX0pfSwxMDApfSx3YXRjaDp7YWRwaWQ6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fbG9hZERhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fZmlsbERhdGEoZSl9fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7KG4ucGx1c3x8bmV3IG4uV2VleFBsdXMobi53ZWV4KSkuYWQucmVsZWFzZUFkRGF0YSh0aGlzLmFkRGF0YSl9LG1ldGhvZHM6e19vbmRpc2xpa2U6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigiY2xvc2UiLGUuZGV0YWlsKX0sX2xvYWREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7Z2V0QWREYXRhJDEobi5wbHVzfHxuZXcgbi5XZWV4UGx1cyhuLndlZXgpLGV8fHRoaXMuYWRwaWQsdGhpcy5hZFdpZHRoLHRoaXMuYWRIZWlnaHQsZnVuY3Rpb24oZSl7dC5fZmlsbERhdGEoZSl9LGZ1bmN0aW9uKGUpe3QuJHRyaWdnZXIoImVycm9yIixlKX0pfSxfZmlsbERhdGE6ZnVuY3Rpb24oZSl7dGhpcy5hZERhdGE9ZSx0aGlzLiR0cmlnZ2VyKCJsb2FkIix7fSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj10aGlzLiRsaXN0ZW5lcnM7cmV0dXJuIG4uY2xvc2UmJih0LmRpc2xpa2U9dGhpcy5fb25kaXNsaWtlKSxlKCJ1LWFkLWRyYXciLHRoaXMuX2coe3JlZjoiYWQiLGF0dHJzOntkYXRhOnRoaXMuYWREYXRhLHJlbmRlcmluZzohMH0sb246dH0sbiksW10sMSl9fX1mdW5jdGlvbiBpbml0JDQoZSx0LG4pe2UuY29tcG9uZW50KCJhZC1kcmF3IixnZXRBZCQxKHQsbikpfXZhciBPUEVOX1RZUEVTPVsiYWdyZWVQcml2YWN5IiwiZGlzYWdyZWVQcml2YWN5Il07ZnVuY3Rpb24gZ2V0QnV0dG9uKGUscil7cmV0dXJue25hbWU6IkJ1dHRvbiIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7aG92ZXJDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiYnV0dG9uLWhvdmVyIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiZGVmYXVsdCJ9LHNpemU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImRlZmF1bHQifSxwbGFpbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGxvYWRpbmc6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjIwfSxob3ZlclN0YXlUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjcwfSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZm9ybVR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybn5bIiIsInN1Ym1pdCIsInJlc2V0Il0uaW5kZXhPZihlKX19fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue1RZUEVTOntkZWZhdWx0OiJkIixwcmltYXJ5OiJwIix3YXJuOiJ3In0sY2xpY2tGdW5jdGlvbjpudWxsfX0sbWV0aG9kczp7X29uQ2xpY2s6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5kaXNhYmxlZCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNsaWNrRnVuY3Rpb24mJnRoaXMuY2xpY2tGdW5jdGlvbihlKSx0aGlzLmZvcm1UeXBlJiZ0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInN1Ym1pdCI9PT10aGlzLmZvcm1UeXBlPyJ1bmktZm9ybS1zdWJtaXQiOiJ1bmktZm9ybS1yZXNldCIse3R5cGU6dGhpcy5mb3JtVHlwZX0sdGhpcyksMDx0aGlzLm9wZW5UeXBlLmxlbmd0aCYmMDw9T1BFTl9UWVBFUy5pbmRleE9mKHRoaXMub3BlblR5cGUpKSl7dmFyIG49ci5wbHVzfHxuZXcgci5XZWV4UGx1cyhyLndlZXgpO3RoaXNbIl8iK3RoaXMub3BlblR5cGVdKG4pLHRoaXMuJHRyaWdnZXIodGhpcy5vcGVuVHlwZS50b0xvd2VyQ2FzZSgpLHt9KX19LF9hZ3JlZVByaXZhY3k6ZnVuY3Rpb24oZSl7ZS5ydW50aW1lLmFncmVlUHJpdmFjeSgpfSxfZGlzYWdyZWVQcml2YWN5OmZ1bmN0aW9uKGUpe2UucnVudGltZS5kaXNhZ3JlZVByaXZhY3koKX0sX2dldENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSJ1Yi0iK3RoaXMuVFlQRVNbdGhpcy50eXBlXStlO3JldHVybiB0aGlzLmRpc2FibGVkJiYodCs9Ii1kIiksdGhpcy5wbGFpbiYmKHQrPSItcGxhaW4iKSwiLXQiPT09ZSYmIm1pbmkiPT09dGhpcy5zaXplJiYodCs9IiB1Yi1taW5pIiksdH0sX2dldEhvdmVyQ2xhc3M6ZnVuY3Rpb24oZSl7aWYodGhpcy5kaXNhYmxlZClyZXR1cm4iIjt2YXIgdD0idWItIit0aGlzLlRZUEVTW3RoaXMudHlwZV0rZSsiLWhvdmVyIjtyZXR1cm4gdGhpcy5wbGFpbiYmKHQrPSItcGxhaW4iKSx0fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1BcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP3RoaXMuJHNsb3RzLmRlZmF1bHQ6W107cmV0dXJuIDE9PT1uLmxlbmd0aCYmblswXS50ZXh0JiYobj1lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInViLXQiXSxjbGFzczp0Ll9nZXRDbGFzcygiLXQiKX0sW3QuX3QoImRlZmF1bHQiKV0sMikpLHRoaXMuY2xpY2tGdW5jdGlvbj10LiRsaXN0ZW5lcnMuY2xpY2ssZGVsZXRlIHQuJGxpc3RlbmVycy5jbGljayxlKCJ2aWV3Iix0Ll9nKHtzdGF0aWNDbGFzczpbInViIl0sY2xhc3M6dC5fZ2V0Q2xhc3MoIiIpLGF0dHJzOntkYXRhVW5jVHlwZToidW5pLWJ1dHRvbiIsaG92ZXJDbGFzczp0Ll9nZXRIb3ZlckNsYXNzKCIiKSxob3ZlclN0YXJ0VGltZTp0LmhvdmVyU3RhcnRUaW1lLGhvdmVyU3RheVRpbWU6dC5ob3ZlclN0YXlUaW1lfSxvbjp7Y2xpY2s6dC5fb25DbGlja319LHQuJGxpc3RlbmVycyksW3QubG9hZGluZz9lKCJsb2FkaW5nLWluZGljYXRvciIse3N0YXRpY0NsYXNzOlsidWItbG9hZGluZyJdLGNsYXNzOlsidWItIit0LlRZUEVTW3QudHlwZV0rIi1sb2FkaW5nIl0sYXR0cnM6e2Fycm93OiJmYWxzZSIsYW5pbWF0aW5nOiJ0cnVlIn19KTp0Ll9lKCldLmNvbmNhdChuKSwxKX0sc3R5bGU6e3ViOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIscG9zaXRpb246InJlbGF0aXZlIixwYWRkaW5nTGVmdDoiNSIscGFkZGluZ1JpZ2h0OiI1IixvdmVyZmxvdzoiaGlkZGVuIixjb2xvcjoiIzAwMDAwMCIsYmFja2dyb3VuZENvbG9yOiIjZjhmOGY4Iixib3JkZXJSYWRpdXM6IjUiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZGJkYmRiIn0sInViLXQiOntjb2xvcjoiIzAwMDAwMCIsZm9udFNpemU6IjE4Iix0ZXh0RGVjb3JhdGlvbjoibm9uZSIsbGluZUhlaWdodDoiNDYifSwidWItZCI6e2JhY2tncm91bmRDb2xvcjoiI2Y4ZjhmOCJ9LCJ1Yi1wIjp7YmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIixib3JkZXJDb2xvcjoiIzAwNjJjYyJ9LCJ1Yi13Ijp7YmFja2dyb3VuZENvbG9yOiIjZTY0MzQwIixib3JkZXJDb2xvcjoiI2I4MzYzMyJ9LCJ1Yi1kLXQiOntjb2xvcjoiIzAwMDAwMCJ9LCJ1Yi1wLXQiOntjb2xvcjoiI2ZmZmZmZiJ9LCJ1Yi13LXQiOntjb2xvcjoiI2ZmZmZmZiJ9LCJ1Yi1kLWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNmN2Y3ZjcifSwidWItcC1kIjp7YmFja2dyb3VuZENvbG9yOiIjNjNhY2ZjIixib3JkZXJDb2xvcjoiIzRmOGFjYSJ9LCJ1Yi13LWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNlYzhiODkiLGJvcmRlckNvbG9yOiIjYmQ2ZjZlIn0sInViLWQtdC1kIjp7Y29sb3I6IiNjY2NjY2MifSwidWItcC10LWQiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLXctdC1kIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9LCJ1Yi1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiMzNTM1MzUiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiMwMDdhZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi13LXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNlNjQzNDAiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLXQtcGxhaW4iOntjb2xvcjoiIzM1MzUzNSJ9LCJ1Yi1wLXQtcGxhaW4iOntjb2xvcjoiIzAwN2FmZiJ9LCJ1Yi13LXQtcGxhaW4iOntjb2xvcjoiI2U2NDM0MCJ9LCJ1Yi1kLWQtcGxhaW4iOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXAtZC1wbGFpbiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLXQtZC1wbGFpbiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifSwidWItcC10LWQtcGxhaW4iOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn0sInViLXctdC1kLXBsYWluIjp7Y29sb3I6InJnYmEoMCwwLDAsMC4yKSJ9LCJ1Yi1taW5pIjp7bGluZUhlaWdodDoiMzAiLGZvbnRTaXplOiIxMyIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDoiMTcuNSIscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OiIxNy41In0sInViLWxvYWRpbmciOnt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLG1hcmdpblJpZ2h0OiIxMCJ9LCJ1Yi1kLWxvYWRpbmciOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItcC1sb2FkaW5nIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXctbG9hZGluZyI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLWxvYWRpbmctcGxhaW4iOntjb2xvcjoiIzM1MzUzNSJ9LCJ1Yi1wLWxvYWRpbmctcGxhaW4iOntjb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiIjMDA2MmNjIn0sInViLXctbG9hZGluZy1wbGFpbiI6e2NvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItZC1ob3ZlciI6e29wYWNpdHk6LjgsYmFja2dyb3VuZENvbG9yOiIjZGVkZWRlIn0sInViLXAtaG92ZXIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9LCJ1Yi13LWhvdmVyIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiNjZTNjMzkifSwidWItZC10LWhvdmVyIjp7Y29sb3I6InJnYmEoMCwwLDAsMC42KSJ9LCJ1Yi1wLXQtaG92ZXIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLXctdC1ob3ZlciI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifSwidWItZC1ob3Zlci1wbGFpbiI6e2NvbG9yOiJyZ2JhKDUzLDUzLDUzLDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDUzLDUzLDUzLDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLWhvdmVyLXBsYWluIjp7Y29sb3I6InJnYmEoMjYsMTczLDI1LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDAsMTIyLDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1ob3Zlci1wbGFpbiI6e2NvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixib3JkZXJDb2xvcjoicmdiYSgyMzAsNjcsNjQsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LGxpc3RlbmVyczp7ImxhYmVsLWNsaWNrIjoiX29uQ2xpY2siLCJAbGFiZWwtY2xpY2siOiJfb25DbGljayJ9fX1mdW5jdGlvbiBpbml0JDUoZSx0LG4pe2UuY29tcG9uZW50KCJidXR0b24iLGdldEJ1dHRvbih0LG4pKX1mdW5jdGlvbiBnZXRDaGVja2JveEdyb3VwKGUpe3JldHVybntuYW1lOiJDaGVja2JveEdyb3VwIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntjaGVja2JveExpc3Q6W119fSxsaXN0ZW5lcnM6eyJAY2hlY2tib3gtY2hhbmdlIjoiX2NoYW5nZUhhbmRsZXIiLCJAY2hlY2tib3gtZ3JvdXAtdXBkYXRlIjoiX2NoZWNrYm94R3JvdXBVcGRhdGVIYW5kbGVyIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfY2hhbmdlSGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdD1bXTt0aGlzLmNoZWNrYm94TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tib3hDaGVja2VkJiZ0LnB1c2goZS52YWx1ZSl9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0fSl9LF9jaGVja2JveEdyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLmNoZWNrYm94TGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5jaGVja2JveExpc3QuaW5kZXhPZihlLnZtKTt0aGlzLmNoZWNrYm94TGlzdC5zcGxpY2UodCwxKX19LF9nZXRGb3JtRGF0YTpmdW5jdGlvbigpe3ZhciBlPXt9O2lmKCIiIT09dGhpcy5uYW1lKXt2YXIgdD1bXTt0aGlzLmNoZWNrYm94TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tib3hDaGVja2VkJiZ0LnB1c2goZS52YWx1ZSl9KSxlLnZhbHVlPXQsZS5rZXk9dGhpcy5uYW1lfXJldHVybiBlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLWNoZWNrYm94LWdyb3VwIl19LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9LHN0eWxlOnt9fX1mdW5jdGlvbiBpbml0JDYoZSx0KXtlLmNvbXBvbmVudCgiY2hlY2tib3gtZ3JvdXAiLGdldENoZWNrYm94R3JvdXAodCkpfWZ1bmN0aW9uIGdldENoZWNrYm94KGUpe3JldHVybntuYW1lOiJDaGVja2JveCIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2NoZWNrYm94Q2hlY2tlZDp0aGlzLmNoZWNrZWQsY2hlY2tib3hWYWx1ZTp0aGlzLnZhbHVlfX0sd2F0Y2g6e2NoZWNrZWQ6ZnVuY3Rpb24oZSl7dGhpcy5jaGVja2JveENoZWNrZWQ9ZX0sdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5jaGVja2JveFZhbHVlPWV9fSxsaXN0ZW5lcnM6eyJsYWJlbC1jbGljayI6Il9vbkNsaWNrIiwiQGxhYmVsLWNsaWNrIjoiX29uQ2xpY2sifSxjb21wdXRlZDp7Y2hlY2tib3hDb2xvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkPyIjYWRhZGFkIjp0aGlzLmNvbG9yfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJDaGVja2JveEdyb3VwIiwidW5pLWNoZWNrYm94LWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiQ2hlY2tib3hHcm91cCIsInVuaS1jaGVja2JveC1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlKXt0aGlzLmRpc2FibGVkfHwodGhpcy5jaGVja2JveENoZWNrZWQ9IXRoaXMuY2hlY2tib3hDaGVja2VkLHRoaXMuJGRpc3BhdGNoKCJDaGVja2JveEdyb3VwIiwidW5pLWNoZWNrYm94LWNoYW5nZSIsZSkpfSxfcmVzZXRGb3JtRGF0YTpmdW5jdGlvbigpe3RoaXMuY2hlY2tib3hDaGVja2VkPSExfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7YXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktY2hlY2tib3gifSxvbjp7Y2xpY2s6dC5fb25DbGlja319LHQuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLWNoZWNrYm94Il19LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1jaGVja2JveC1pbnB1dCJdLGNsYXNzOlt0LmRpc2FibGVkPyJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOiIiXX0sW3QuY2hlY2tib3hDaGVja2VkP2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLWljb24iXSxzdHlsZTp7Y29sb3I6dC5jaGVja2JveENvbG9yfX0sW3QuX3YodC5fcygi7qiIIikpXSk6dC5fZSgpXSksZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xvdCJdfSxbdC5fdCgiZGVmYXVsdCIpXSwyKV0pXSl9LHN0eWxlOnsidW5pLWNoZWNrYm94Ijp7ZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIifSwidW5pLWNoZWNrYm94LWlucHV0Ijp7anVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLGJvcmRlcldpZHRoOiIxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsYm9yZGVyU3R5bGU6InNvbGlkIixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclJhZGl1czoiMyIsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIn0sInVuaS1pY29uIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMiLGZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiMiIsbWFyZ2luVG9wOiIyIixjb2xvcjoiIzAwN2FmZiJ9LCJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNlMWUxZTEifSwidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkLWJlZm9yZSI6e2NvbG9yOiIjYWRhZGFkIn0sInVuaS1zbG90Ijp7Zm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiI1In0sInVuaS1jaGVja2JveC1ncm91cCI6e2Rpc3BsYXk6ImJsb2NrIn19fX1mdW5jdGlvbiBpbml0JDcoZSx0KXtlLmNvbXBvbmVudCgiY2hlY2tib3giLGdldENoZWNrYm94KHQpKX12YXIgTkFUSVZFX0NPTVBPTkVOVF9UWVBFUz1bInUtaW5wdXQiLCJ1LXRleHRhcmVhIl07ZnVuY3Rpb24gZ2V0Rm9ybShlKXt2YXIgaT1lLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtyZXR1cm57bmFtZToiRm9ybSIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2NoaWxkcmVuTGlzdDpbXX19LGxpc3RlbmVyczp7IkBmb3JtLXN1Ym1pdCI6Il9vblN1Ym1pdCIsIkBmb3JtLXJlc2V0IjoiX29uUmVzZXQiLCJAZm9ybS1ncm91cC11cGRhdGUiOiJfZm9ybUdyb3VwVXBkYXRlSGFuZGxlciJ9LG1ldGhvZHM6e19vblN1Ym1pdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXROYXRpdmVGb3JtRGF0YSgpfHx7fTt0aGlzLmNoaWxkcmVuTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuX2dldEZvcm1EYXRhJiZlLl9nZXRGb3JtRGF0YSgpLmtleSYmKHRbZS5fZ2V0Rm9ybURhdGEoKS5rZXldPWUuX2dldEZvcm1EYXRhKCkudmFsdWUpfSksdGhpcy4kdHJpZ2dlcigic3VibWl0Iix7dmFsdWU6dH0pfSxfb25SZXNldDpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJyZXNldCIse30pLHRoaXMuX2dldE5hdGl2ZUZvcm1EYXRhKCEwKSx0aGlzLmNoaWxkcmVuTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuX3Jlc2V0Rm9ybURhdGEmJmUuX3Jlc2V0Rm9ybURhdGEoKX0pfSxfZm9ybUdyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLmNoaWxkcmVuTGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5jaGlsZHJlbkxpc3QuaW5kZXhPZihlLnZtKTt0aGlzLmNoaWxkcmVuTGlzdC5zcGxpY2UodCwxKX19LF9nZXROYXRpdmVGb3JtRGF0YTpmdW5jdGlvbihuKXt2YXIgcj17fTtyZXR1cm4gZnVuY3Rpb24gdChlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7MDw9TkFUSVZFX0NPTVBPTkVOVF9UWVBFUy5pbmRleE9mKGUudGFnKSYmZS5kYXRhLmF0dHJzJiZlLmRhdGEuYXR0cnMubmFtZSYmKG4/ZS5lbG0uc2V0VmFsdWUoIiIpOnJbZS5kYXRhLmF0dHJzLm5hbWVdPWkuZ2V0VmFsdWUoZS5lbG0ubm9kZUlkKSksZS5jaGlsZHJlbiYmdChlLmNoaWxkcmVuKX0pfSh0aGlzLiR2bm9kZS5jb21wb25lbnRPcHRpb25zLmNoaWxkcmVuKSxyfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ2aWV3Iix0aGlzLl9nKHt9LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDgoZSx0KXtlLmNvbXBvbmVudCgiZm9ybSIsZ2V0Rm9ybSh0KSl9dmFyIGljb25DaGFycz17c3VjY2Vzczoi7qiGIixpbmZvOiLuqIMiLHdhcm46Iu6oiyIsd2FpdGluZzoi7qiJIixzYWZlX3N1Y2Nlc3M6Iu6ohCIsc2FmZV93YXJuOiLuqIUiLHN1Y2Nlc3NfY2lyY2xlOiLuqIciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiLuqIgiLHdhaXRpbmdfY2lyY2xlOiLuqIoiLGNpcmNsZToi7qiBIixkb3dubG9hZDoi7qiCIixpbmZvX2NpcmNsZToi7qiMIixjYW5jZWw6Iu6ojSIsc2VhcmNoOiLuqI4iLGNsZWFyOiLuqI8ifSxpY29uQ29sb3JzPXtzdWNjZXNzOiIjMDliYjA3IixpbmZvOiIjMTBhZWZmIix3YXJuOiIjZjc2MjYwIix3YWl0aW5nOiIjMTBhZWZmIixzYWZlX3N1Y2Nlc3M6IiMwOWJiMDciLHNhZmVfd2FybjoiI2ZmYmUwMCIsc3VjY2Vzc19jaXJjbGU6IiMwOWJiMDciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiIjMDliYjA3Iix3YWl0aW5nX2NpcmNsZToiIzEwYWVmZiIsY2lyY2xlOiIjYzljOWM5Iixkb3dubG9hZDoiIzA5YmIwNyIsaW5mb19jaXJjbGU6IiMwOWJiMDciLGNhbmNlbDoiI2Y0MzUzMCIsc2VhcmNoOiIjYjJiMmIyIixjbGVhcjoiI2IyYjJiMiJ9O2Z1bmN0aW9uIGdldEljb24oZSl7cmV0dXJue25hbWU6Ikljb24iLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e3R5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNpemU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MjN9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntpY29uQ2hhcnM6aWNvbkNoYXJzfX0sYmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7fSxjb21wdXRlZDp7c3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJue2NvbG9yOnRoaXMuY29sb3J8fGljb25Db2xvcnNbdGhpcy50eXBlXSxmb250U2l6ZTp0aGlzLnNpemV9fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ1LXRleHQiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLWljb24iXSxzdHlsZTp0aGlzLnN0eWxlc30sdGhpcy4kbGlzdGVuZXJzKSxbdGhpcy5pY29uQ2hhcnNbdGhpcy50eXBlXV0pfSxzdHlsZTp7InVuaS1pY29uIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMifX19fWZ1bmN0aW9uIGluaXQkOShlLHQpe2UuY29tcG9uZW50KCJpY29uIixnZXRJY29uKHQpKX1mdW5jdGlvbiBnZXRMYWJlbChlKXtyZXR1cm57bmFtZToiTGFiZWwiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2Zvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LG1ldGhvZHM6e19vbkNsaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LmF0dHIuZGF0YVVuY1R5cGV8fCIiLG49L151bmktKGNoZWNrYm94fHJhZGlvfHN3aXRjaCktLy50ZXN0KHQpO258fChuPS9edW5pLShjaGVja2JveHxyYWRpb3xzd2l0Y2h8YnV0dG9uKSQvaS50ZXN0KHQpKSxufHwodGhpcy5mb3I/dGhpcy5fJGJ1cy4kZW1pdCgidW5pLWxhYmVsLWNsaWNrLSIrdGhpcy4kcGFnZS5pZCsiLSIrdGhpcy5mb3IsZSwhMCk6dGhpcy4kYnJvYWRjYXN0KFsiQ2hlY2tib3giLCJSYWRpbyIsIlN3aXRjaCIsIkJ1dHRvbiJdLCJ1bmktbGFiZWwtY2xpY2siLGUsITApKX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHtvbjp7Y2xpY2s6dGhpcy5fb25DbGlja319LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDEwKGUsdCl7ZS5jb21wb25lbnQoImxhYmVsIixnZXRMYWJlbCh0KSl9ZnVuY3Rpb24gZ2V0TW92YWJsZUFyZWEoZSl7dmFyIHQ9ZS5yZXF1aXJlTW9kdWxlKCJkb20iKTtyZXR1cm57bmFtZToiTW92YWJsZUFyZWEiLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e3NjYWxlQXJlYTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOjAsaGVpZ2h0OjAsaXRlbXM6W119fSxtZXRob2RzOntfcmVzaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9nZXRXSCgpLnRoZW4oZnVuY3Rpb24oKXtlLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jb21wb25lbnRJbnN0YW5jZS5zZXRQYXJlbnQoKX0pfSl9LF9wYW5zdGFydDpmdW5jdGlvbihlKXt0aGlzLnRvdWNoSXRlbSYmdGhpcy50b3VjaEl0ZW0udG91Y2hzdGFydChlKX0sX3Bhbm1vdmU6ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnRvdWNoSXRlbSYmdGhpcy50b3VjaEl0ZW0udG91Y2htb3ZlKGUpfSxfcGFuZW5kOmZ1bmN0aW9uKGUpe3RoaXMudG91Y2hJdGVtJiYodGhpcy50b3VjaEl0ZW0udG91Y2hlbmQoZSksdGhpcy50b3VjaEl0ZW09bnVsbCl9LF9nZXRXSDpmdW5jdGlvbigpe3ZhciBvPXRoaXM7cmV0dXJuIHRoaXMuX2dldENvbXBvbmVudFNpemUodGhpcy4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLndpZHRoLG49ZS5oZWlnaHQscj1lLnRvcCxpPWUubGVmdDtvLndpZHRoPXQsby5oZWlnaHQ9bixvLnRvcD1yLG8ubGVmdD1pfSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0LmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXSx0aGlzLmdhcFY9e3g6bnVsbCx5Om51bGx9LHRoaXMucGluY2hTdGFydExlbj1udWxsfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fX2lzTW91bnRlZD0hMCxlLl9yZXNpemUoKX0sMjAwKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1bXTsoQXJyYXkuaXNBcnJheSh0aGlzLiRzbG90cy5kZWZhdWx0KT9kZWVwQ2xvbmUodGhpcy4kc2xvdHMuZGVmYXVsdCxlKTpbXSkuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNvbXBvbmVudE9wdGlvbnMmJiJtb3ZhYmxlLXZpZXciPT09ZS5jb21wb25lbnRPcHRpb25zLnRhZyYmbi5wdXNoKGUpfSksdGhpcy5pdGVtcz1uO3ZhciByPXt9O3JldHVyblsicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIl0uZm9yRWFjaChmdW5jdGlvbihlKXtyW2VdPXRbIl8iK2VdfSksZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixvbjpyLHN0YXRpY0NsYXNzOlsidW5pLW1vdmFibGUtYXJlYSJdfSx0aGlzLiRsaXN0ZW5lcnMpLG4sMil9LHN0eWxlOnsidW5pLW1vdmFibGUtYXJlYSI6e292ZXJmbG93OiJoaWRkZW4iLHdpZHRoOiIxMHB4IixoZWlnaHQ6IjEwcHgifX19fWZ1bmN0aW9uIGluaXQkMTEoZSx0KXtlLmNvbXBvbmVudCgibW92YWJsZS1hcmVhIixnZXRNb3ZhYmxlQXJlYSh0KSl9dmFyIHRvdWNodHJhY2s9e21ldGhvZHM6e3RvdWNodHJhY2s6ZnVuY3Rpb24oaSl7dmFyIG89dGhpcyxhPTAscz0wLGM9MCx1PTAsbj1mdW5jdGlvbihlLHQsbixyKXtpZighMT09PW9baV0oe3RhcmdldDplLnRhcmdldCxjdXJyZW50VGFyZ2V0OmUuY3VycmVudFRhcmdldCxzdG9wUHJvcGFnYXRpb246ZS5zdG9wUHJvcGFnYXRpb24uYmluZChlKSx0b3VjaGVzOmUudG91Y2hlcyxjaGFuZ2VkVG91Y2hlczplLmNoYW5nZWRUb3VjaGVzLGRldGFpbDp7c3RhdGU6dCx4MDpuLHkwOnIsZHg6bi1hLGR5OnItcyxkZHg6bi1jLGRkeTpyLXUsdGltZVN0YW1wOmUudGltZVN0YW1wfHxEYXRlLm5vdygpfX0pKXJldHVybiExfSxyPW51bGw7dGhpcy5hZGRMaXN0ZW5lcigidG91Y2hzdGFydCIsZnVuY3Rpb24oZSl7aWYoIXIpcmV0dXJuIGE9Yz0ocj1lKS50b3VjaGVzWzBdLnBhZ2VYLHM9dT1lLnRvdWNoZXNbMF0ucGFnZVksbihlLCJzdGFydCIsYSxzKX0pLHRoaXMuYWRkTGlzdGVuZXIoInRvdWNobW92ZSIsZnVuY3Rpb24oZSl7aWYocil7dmFyIHQ9bihlLCJtb3ZlIixlLnRvdWNoZXNbMF0ucGFnZVgsZS50b3VjaGVzWzBdLnBhZ2VZKTtyZXR1cm4gYz1lLnRvdWNoZXNbMF0ucGFnZVgsdT1lLnRvdWNoZXNbMF0ucGFnZVksdH19KSx0aGlzLmFkZExpc3RlbmVyKCJ0b3VjaGVuZCIsZnVuY3Rpb24oZSl7aWYocilyZXR1cm4gcj1udWxsLG4oZSwiZW5kIixlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYLGUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVkpfSl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24oZSl7dGhpcy5jYWxsYmFjaygidG91Y2hzdGFydCIsZSl9LHRvdWNobW92ZTpmdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrKCJ0b3VjaG1vdmUiLGUpfSx0b3VjaGVuZDpmdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrKCJ0b3VjaGVuZCIsZSl9LGFkZExpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dGhpcy5fX2V2ZW50W2VdPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZS50b3VjaGVzPWUuY2hhbmdlZFRvdWNoZXMsITE9PT10KGUpJiZlLnN0b3BQcm9wYWdhdGlvbigpKX19LGNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dGhpcy5fX2V2ZW50W2VdJiZ0aGlzLl9fZXZlbnRbZV0odCl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fX2V2ZW50PXt9fX07ZnVuY3Rpb24gZShlLHQsbil7cmV0dXJuIHQtbjxlJiZlPHQrbn1mdW5jdGlvbiB0KHQsbil7cmV0dXJuIGUodCwwLG4pfWZ1bmN0aW9uIERlY2xpbmUoKXt9ZnVuY3Rpb24gRnJpY3Rpb24oZSx0KXt0aGlzLl9tPWUsdGhpcy5fZj0xZTMqdCx0aGlzLl9zdGFydFRpbWU9MCx0aGlzLl92PTB9ZnVuY3Rpb24gU3ByaW5nKGUsdCxuKXt0aGlzLl9tPWUsdGhpcy5faz10LHRoaXMuX2M9bix0aGlzLl9zb2x1dGlvbj1udWxsLHRoaXMuX2VuZFBvc2l0aW9uPTAsdGhpcy5fc3RhcnRUaW1lPTB9ZnVuY3Rpb24gU1REKGUsdCxuKXt0aGlzLl9zcHJpbmdYPW5ldyBTcHJpbmcoZSx0LG4pLHRoaXMuX3NwcmluZ1k9bmV3IFNwcmluZyhlLHQsbiksdGhpcy5fc3ByaW5nU2NhbGU9bmV3IFNwcmluZyhlLHQsbiksdGhpcy5fc3RhcnRUaW1lPTB9RGVjbGluZS5wcm90b3R5cGUueD1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5zcXJ0KGUpfSxGcmljdGlvbi5wcm90b3R5cGUuc2V0Vj1mdW5jdGlvbihlLHQpe3ZhciBuPU1hdGgucG93KE1hdGgucG93KGUsMikrTWF0aC5wb3codCwyKSwuNSk7dGhpcy5feF92PWUsdGhpcy5feV92PXQsdGhpcy5feF9hPS10aGlzLl9mKnRoaXMuX3hfdi9uLHRoaXMuX3lfYT0tdGhpcy5fZip0aGlzLl95X3Yvbix0aGlzLl90PU1hdGguYWJzKGUvdGhpcy5feF9hKXx8TWF0aC5hYnModC90aGlzLl95X2EpLHRoaXMuX2xhc3REdD1udWxsLHRoaXMuX3N0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKX0sRnJpY3Rpb24ucHJvdG90eXBlLnNldFM9ZnVuY3Rpb24oZSx0KXt0aGlzLl94X3M9ZSx0aGlzLl95X3M9dH0sRnJpY3Rpb24ucHJvdG90eXBlLnM9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSxlPnRoaXMuX3QmJihlPXRoaXMuX3QsdGhpcy5fbGFzdER0PWUpO3ZhciB0PXRoaXMuX3hfdiplKy41KnRoaXMuX3hfYSpNYXRoLnBvdyhlLDIpK3RoaXMuX3hfcyxuPXRoaXMuX3lfdiplKy41KnRoaXMuX3lfYSpNYXRoLnBvdyhlLDIpK3RoaXMuX3lfcztyZXR1cm4oMDx0aGlzLl94X2EmJnQ8dGhpcy5fZW5kUG9zaXRpb25YfHx0aGlzLl94X2E8MCYmdD50aGlzLl9lbmRQb3NpdGlvblgpJiYodD10aGlzLl9lbmRQb3NpdGlvblgpLCgwPHRoaXMuX3lfYSYmbjx0aGlzLl9lbmRQb3NpdGlvbll8fHRoaXMuX3lfYTwwJiZuPnRoaXMuX2VuZFBvc2l0aW9uWSkmJihuPXRoaXMuX2VuZFBvc2l0aW9uWSkse3g6dCx5Om59fSxGcmljdGlvbi5wcm90b3R5cGUuZHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSgobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksZT50aGlzLl90JiYoZT10aGlzLl90KSx7ZHg6dGhpcy5feF92K3RoaXMuX3hfYSplLGR5OnRoaXMuX3lfdit0aGlzLl95X2EqZX19LEZyaWN0aW9uLnByb3RvdHlwZS5kZWx0YT1mdW5jdGlvbigpe3JldHVybnt4Oi0xLjUqTWF0aC5wb3codGhpcy5feF92LDIpL3RoaXMuX3hfYXx8MCx5Oi0xLjUqTWF0aC5wb3codGhpcy5feV92LDIpL3RoaXMuX3lfYXx8MH19LEZyaWN0aW9uLnByb3RvdHlwZS5kdD1mdW5jdGlvbigpe3JldHVybi10aGlzLl94X3YvdGhpcy5feF9hfSxGcmljdGlvbi5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbigpe3ZhciB0PWUodGhpcy5zKCkueCx0aGlzLl9lbmRQb3NpdGlvblgpfHxlKHRoaXMucygpLnksdGhpcy5fZW5kUG9zaXRpb25ZKXx8dGhpcy5fbGFzdER0PT09dGhpcy5fdDtyZXR1cm4gdGhpcy5fbGFzdER0PW51bGwsdH0sRnJpY3Rpb24ucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX2VuZFBvc2l0aW9uWD1lLHRoaXMuX2VuZFBvc2l0aW9uWT10fSxGcmljdGlvbi5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oZSx0KXt0aGlzLl9tPWUsdGhpcy5fZj0xZTMqdH0sU3ByaW5nLnByb3RvdHlwZS5fc29sdmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9jLHI9dGhpcy5fbSxpPXRoaXMuX2ssbz1uKm4tNCpyKmk7aWYoMD09PW8pe3ZhciBhPS1uLygyKnIpLHM9ZSxjPXQvKGEqZSk7cmV0dXJue3g6ZnVuY3Rpb24oZSl7cmV0dXJuKHMrYyplKSpNYXRoLnBvdyhNYXRoLkUsYSplKX0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5wb3coTWF0aC5FLGEqZSk7cmV0dXJuIGEqKHMrYyplKSp0K2MqdH19fWlmKDA8byl7dmFyIHU9KC1uLU1hdGguc3FydChvKSkvKDIqciksbD0oLW4rTWF0aC5zcXJ0KG8pKS8oMipyKSxkPSh0LXUqZSkvKGwtdSksZj1lLWQ7cmV0dXJue3g6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gZT09PXRoaXMuX3QmJih0PXRoaXMuX3Bvd0VSMVQsbj10aGlzLl9wb3dFUjJUKSx0aGlzLl90PWUsdHx8KHQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsdSplKSksbnx8KG49dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsbCplKSksZip0K2Qqbn0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gZT09PXRoaXMuX3QmJih0PXRoaXMuX3Bvd0VSMVQsbj10aGlzLl9wb3dFUjJUKSx0aGlzLl90PWUsdHx8KHQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsdSplKSksbnx8KG49dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsbCplKSksZip1KnQrZCpsKm59fX12YXIgcD1NYXRoLnNxcnQoNCpyKmktbipuKS8oMipyKSxoPS1uLzIqcix2PWUsZz0odC1oKmUpL3A7cmV0dXJue3g6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KE1hdGguRSxoKmUpKih2Kk1hdGguY29zKHAqZSkrZypNYXRoLnNpbihwKmUpKX0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5wb3coTWF0aC5FLGgqZSksbj1NYXRoLmNvcyhwKmUpLHI9TWF0aC5zaW4ocCplKTtyZXR1cm4gdCooZypwKm4tdipwKnIpK2gqdCooZypyK3Yqbil9fX0sU3ByaW5nLnByb3RvdHlwZS54PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHRoaXMuX3NvbHV0aW9uP3RoaXMuX2VuZFBvc2l0aW9uK3RoaXMuX3NvbHV0aW9uLngoZSk6MH0sU3ByaW5nLnByb3RvdHlwZS5keD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9zb2x1dGlvbi5keChlKTowfSxTcHJpbmcucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihlLG4scil7aWYocnx8KHI9KG5ldyBEYXRlKS5nZXRUaW1lKCkpLGUhPT10aGlzLl9lbmRQb3NpdGlvbnx8IXQobiwuMSkpe249bnx8MDt2YXIgaT10aGlzLl9lbmRQb3NpdGlvbjt0aGlzLl9zb2x1dGlvbiYmKHQobiwuMSkmJihuPXRoaXMuX3NvbHV0aW9uLmR4KChyLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSksaT10aGlzLl9zb2x1dGlvbi54KChyLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0KG4sLjEpJiYobj0wKSx0KGksLjEpJiYoaT0wKSxpKz10aGlzLl9lbmRQb3NpdGlvbiksdGhpcy5fc29sdXRpb24mJnQoaS1lLC4xKSYmdChuLC4xKXx8KHRoaXMuX2VuZFBvc2l0aW9uPWUsdGhpcy5fc29sdXRpb249dGhpcy5fc29sdmUoaS10aGlzLl9lbmRQb3NpdGlvbixuKSx0aGlzLl9zdGFydFRpbWU9cil9fSxTcHJpbmcucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2VuZFBvc2l0aW9uPWUsdGhpcy5fc29sdXRpb249e3g6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gMH19fSxTcHJpbmcucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24obil7cmV0dXJuIG58fChuPShuZXcgRGF0ZSkuZ2V0VGltZSgpKSxlKHRoaXMueCgpLHRoaXMuX2VuZFBvc2l0aW9uLC4xKSYmdCh0aGlzLmR4KCksLjEpfSxTcHJpbmcucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLl9tPWUsdGhpcy5faz10LHRoaXMuX2M9bix0aGlzLmRvbmUoKXx8KHRoaXMuX3NvbHV0aW9uPXRoaXMuX3NvbHZlKHRoaXMueCgpLXRoaXMuX2VuZFBvc2l0aW9uLHRoaXMuZHgoKSksdGhpcy5fc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKX0sU3ByaW5nLnByb3RvdHlwZS5zcHJpbmdDb25zdGFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9rfSxTcHJpbmcucHJvdG90eXBlLmRhbXBpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY30sU3ByaW5nLnByb3RvdHlwZS5jb25maWd1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuW3tsYWJlbDoiU3ByaW5nIENvbnN0YW50IixyZWFkOnRoaXMuc3ByaW5nQ29uc3RhbnQuYmluZCh0aGlzKSx3cml0ZTpmdW5jdGlvbihlLHQpe2UucmVjb25maWd1cmUoMSx0LGUuZGFtcGluZygpKX0uYmluZCh0aGlzLHRoaXMpLG1pbjoxMDAsbWF4OjFlM30se2xhYmVsOiJEYW1waW5nIixyZWFkOnRoaXMuZGFtcGluZy5iaW5kKHRoaXMpLHdyaXRlOmZ1bmN0aW9uKGUsdCl7ZS5yZWNvbmZpZ3VyZSgxLGUuc3ByaW5nQ29uc3RhbnQoKSx0KX0uYmluZCh0aGlzLHRoaXMpLG1pbjoxLG1heDo1MDB9XX0sU1RELnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dGhpcy5fc3ByaW5nWC5zZXRFbmQoZSxyLGkpLHRoaXMuX3NwcmluZ1kuc2V0RW5kKHQscixpKSx0aGlzLl9zcHJpbmdTY2FsZS5zZXRFbmQobixyLGkpLHRoaXMuX3N0YXJ0VGltZT1pfSxTVEQucHJvdG90eXBlLng9ZnVuY3Rpb24oKXt2YXIgZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTM7cmV0dXJue3g6dGhpcy5fc3ByaW5nWC54KGUpLHk6dGhpcy5fc3ByaW5nWS54KGUpLHNjYWxlOnRoaXMuX3NwcmluZ1NjYWxlLngoZSl9fSxTVEQucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdGhpcy5fc3ByaW5nWC5kb25lKGUpJiZ0aGlzLl9zcHJpbmdZLmRvbmUoZSkmJnRoaXMuX3NwcmluZ1NjYWxlLmRvbmUoZSl9LFNURC5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX3NwcmluZ1gucmVjb25maWd1cmUoZSx0LG4pLHRoaXMuX3NwcmluZ1kucmVjb25maWd1cmUoZSx0LG4pLHRoaXMuX3NwcmluZ1NjYWxlLnJlY29uZmlndXJlKGUsdCxuKX07dmFyIHJlcXVlc3Rpbmc9ITE7ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpe3JldHVybiBzZXRUaW1lb3V0KGUsMTYpfWZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGUpe2NsZWFyVGltZW91dChlKX1mdW5jdGlvbiBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpe3JlcXVlc3Rpbmd8fChyZXF1ZXN0aW5nPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2UoKSxyZXF1ZXN0aW5nPSExfSkpfWZ1bmN0aW9uIHYoZSx0KXtyZXR1cm4rKCgxZTMqZS0xZTMqdCkvMWUzKS50b0ZpeGVkKDEpfWZ1bmN0aW9uIGcoYSxlLHQpe3ZhciBuPXtpZDowLGNhbmNlbGxlZDohMX07cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIsaSl7aWYoIXR8fCF0LmNhbmNlbGxlZCl7cihuKTt2YXIgbz1hLmRvbmUoKTtvfHx0LmNhbmNlbGxlZHx8KHQuaWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUuYmluZChudWxsLHQsbixyLGkpKSksbyYmaSYmaShuKX19KG4sYSxlLHQpLHtjYW5jZWw6ZnVuY3Rpb24oZSl7ZSYmZS5pZCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoZS5pZCksZSYmKGUuY2FuY2VsbGVkPSEwKX0uYmluZChudWxsLG4pLG1vZGVsOmF9fWZ1bmN0aW9uIGdldE1vdmFibGVWaWV3KGUpe3ZhciB0PWUucmVxdWlyZU1vZHVsZSgiZG9tIikscz1lLnJlcXVpcmVNb2R1bGUoImFuaW1hdGlvbiIpO3JldHVybntuYW1lOiJNb3ZhYmxlVmlldyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W3RvdWNodHJhY2ssZW1pdHRlcl0scHJvcHM6e2RpcmVjdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibm9uZSJ9LGluZXJ0aWE6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxvdXRPZkJvdW5kczp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0seTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxkYW1waW5nOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxmcmljdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHNjYWxlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2NhbGVNaW46e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6LjV9LHNjYWxlTWF4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjEwfSxzY2FsZVZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGFuaW1hdGlvbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITB9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3hTeW5jOnRoaXMuX2dldFB4KHRoaXMueCkseVN5bmM6dGhpcy5fZ2V0UHgodGhpcy55KSxzY2FsZVZhbHVlU3luYzp0aGlzLl9nZXRTY2FsZU51bWJlcih0aGlzLnNjYWxlVmFsdWUpLHdpZHRoOjAsaGVpZ2h0OjAsbWluWDowLG1pblk6MCxtYXhYOjAsbWF4WTowfX0sY29tcHV0ZWQ6e2RhbXBpbmdOdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5kYW1waW5nKTtyZXR1cm4gaXNOYU4oZSk/MjA6ZX0sZnJpY3Rpb25OdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5mcmljdGlvbik7cmV0dXJuIGlzTmFOKGUpfHxlPD0wPzI6ZX0sc2NhbGVNaW5OdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5zY2FsZU1pbik7cmV0dXJuIGlzTmFOKGUpPy41OmV9LHNjYWxlTWF4TnVtYmVyOmZ1bmN0aW9uKCl7dmFyIGU9TnVtYmVyKHRoaXMuc2NhbGVNYXgpO3JldHVybiBpc05hTihlKT8xMDplfSx4TW92ZTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5kaXJlY3Rpb258fCJob3Jpem9udGFsIj09PXRoaXMuZGlyZWN0aW9ufSx5TW92ZTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCI9PT10aGlzLmRpcmVjdGlvbn19LHdhdGNoOnt4OmZ1bmN0aW9uKGUpe3RoaXMueFN5bmM9dGhpcy5fZ2V0UHgoZSl9LHhTeW5jOmZ1bmN0aW9uKGUpe3RoaXMuX3NldFgoZSl9LHk6ZnVuY3Rpb24oZSl7dGhpcy55U3luYz10aGlzLl9nZXRQeChlKX0seVN5bmM6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0WShlKX0sc2NhbGVWYWx1ZTpmdW5jdGlvbihlKXt0aGlzLl9zZXRTY2FsZVZhbHVlKHRoaXMuX2dldFNjYWxlTnVtYmVyKGUpKX0sc2NhbGVWYWx1ZVN5bmM6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0U2NhbGVWYWx1ZShlKX0sc2NhbGVNaW5OdW1iZXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTY2FsZU1pbk9yTWF4KCl9LHNjYWxlTWF4TnVtYmVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2NhbGVNaW5Pck1heCgpfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX29mZnNldD17eDowLHk6MH0sdGhpcy5fc2NhbGVPZmZzZXQ9e3g6MCx5OjB9LHRoaXMuX3RyYW5zbGF0ZVg9MCx0aGlzLl90cmFuc2xhdGVZPTAsdGhpcy5fc2NhbGU9MSx0aGlzLl9vbGRTY2FsZT0xLHRoaXMuX1NURD1uZXcgU1REKDEsOSpNYXRoLnBvdyh0aGlzLmRhbXBpbmdOdW1iZXIsMikvNDAsdGhpcy5kYW1waW5nTnVtYmVyKSx0aGlzLl9mcmljdGlvbj1uZXcgRnJpY3Rpb24oMSx0aGlzLmZyaWN0aW9uTnVtYmVyKSx0aGlzLl9kZWNsaW5lWD1uZXcgRGVjbGluZSx0aGlzLl9kZWNsaW5lWT1uZXcgRGVjbGluZSx0aGlzLl9fdG91Y2hJbmZvPXtoaXN0b3J5WDpbMCwwXSxoaXN0b3J5WTpbMCwwXSxoaXN0b3J5VDpbMCwwXX0sdGhpcy5fcmVjdD17dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnRvdWNodHJhY2soIl9vblRyYWNrIiksc2V0VGltZW91dChmdW5jdGlvbigpe2UuX3VwZGF0ZVJlY3QoKS50aGVuKGZ1bmN0aW9uKCl7ZS5zZXRQYXJlbnQoKX0pfSwxMDApLHRoaXMuX2ZyaWN0aW9uLnJlY29uZmlndXJlKDEsdGhpcy5mcmljdGlvbk51bWJlciksdGhpcy5fU1RELnJlY29uZmlndXJlKDEsOSpNYXRoLnBvdyh0aGlzLmRhbXBpbmdOdW1iZXIsMikvNDAsdGhpcy5kYW1waW5nTnVtYmVyKX0sbWV0aG9kczp7X2dldFB4OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoZSl8fDB9LF9nZXRTY2FsZU51bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1OdW1iZXIoZSksaXNOYU4oZSk/MTplfSxfc2V0WDpmdW5jdGlvbihlKXtpZih0aGlzLnhNb3ZlKXtpZihlK3RoaXMuX3NjYWxlT2Zmc2V0Lng9PT10aGlzLl90cmFuc2xhdGVYKXJldHVybiB0aGlzLl90cmFuc2xhdGVYO3RoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvblRvKGUrdGhpcy5fc2NhbGVPZmZzZXQueCx0aGlzLnlTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0LnksdGhpcy5fc2NhbGUpfXJldHVybiBlfSxfc2V0WTpmdW5jdGlvbihlKXtpZih0aGlzLnlNb3ZlKXtpZihlK3RoaXMuX3NjYWxlT2Zmc2V0Lnk9PT10aGlzLl90cmFuc2xhdGVZKXJldHVybiB0aGlzLl90cmFuc2xhdGVZO3RoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvblRvKHRoaXMueFN5bmMrdGhpcy5fc2NhbGVPZmZzZXQueCxlK3RoaXMuX3NjYWxlT2Zmc2V0LnksdGhpcy5fc2NhbGUpfXJldHVybiBlfSxfc2V0U2NhbGVNaW5Pck1heDpmdW5jdGlvbigpe2lmKCF0aGlzLnNjYWxlKXJldHVybiExO3RoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX3NjYWxlLCEwKSx0aGlzLl91cGRhdGVPbGRTY2FsZSh0aGlzLl9zY2FsZSl9LF9zZXRTY2FsZVZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy5zY2FsZSYmKGU9dGhpcy5fYWRqdXN0U2NhbGUoZSksdGhpcy5fdXBkYXRlU2NhbGUoZSwhMCksdGhpcy5fdXBkYXRlT2xkU2NhbGUoZSksZSl9LF9faGFuZGxlVG91Y2hTdGFydDpmdW5jdGlvbigpe3RoaXMuX2lzU2NhbGluZ3x8dGhpcy5kaXNhYmxlZHx8KHRoaXMuX0ZBJiZ0aGlzLl9GQS5jYW5jZWwoKSx0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYPVswLDBdLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVk9WzAsMF0sdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VD1bMCwwXSx0aGlzLnhNb3ZlJiYodGhpcy5fX2Jhc2VYPXRoaXMuX3RyYW5zbGF0ZVgpLHRoaXMueU1vdmUmJih0aGlzLl9fYmFzZVk9dGhpcy5fdHJhbnNsYXRlWSksdGhpcy5fY2hlY2tDYW5Nb3ZlPW51bGwsdGhpcy5fZmlyc3RNb3ZlRGlyZWN0aW9uPW51bGwsdGhpcy5faXNUb3VjaGluZz0hMCl9LF9faGFuZGxlVG91Y2hNb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2lzU2NhbGluZyYmIXRoaXMuZGlzYWJsZWQmJnRoaXMuX2lzVG91Y2hpbmcpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVgscj10aGlzLl90cmFuc2xhdGVZO2lmKG51bGw9PT10aGlzLl9maXJzdE1vdmVEaXJlY3Rpb24mJih0aGlzLl9maXJzdE1vdmVEaXJlY3Rpb249MTxNYXRoLmFicyhlLmRldGFpbC5keC9lLmRldGFpbC5keSk/Imh0b3VjaG1vdmUiOiJ2dG91Y2htb3ZlIiksdGhpcy54TW92ZSYmKG49ZS5kZXRhaWwuZHgrdGhpcy5fX2Jhc2VYLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVguc2hpZnQoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYLnB1c2gobiksdGhpcy55TW92ZXx8bnVsbCE9PXRoaXMuX2NoZWNrQ2FuTW92ZXx8KHRoaXMuX2NoZWNrQ2FuTW92ZT1NYXRoLmFicyhlLmRldGFpbC5keC9lLmRldGFpbC5keSk8MSkpLHRoaXMueU1vdmUmJihyPWUuZGV0YWlsLmR5K3RoaXMuX19iYXNlWSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlZLnNoaWZ0KCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WS5wdXNoKHIpLHRoaXMueE1vdmV8fG51bGwhPT10aGlzLl9jaGVja0Nhbk1vdmV8fCh0aGlzLl9jaGVja0Nhbk1vdmU9TWF0aC5hYnMoZS5kZXRhaWwuZHkvZS5kZXRhaWwuZHgpPDEpKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlULnNoaWZ0KCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VC5wdXNoKGUuZGV0YWlsLnRpbWVTdGFtcCksIXRoaXMuX2NoZWNrQ2FuTW92ZSl7dmFyIGk9InRvdWNoIjtuPHRoaXMubWluWD90aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixuPXRoaXMubWluWC10aGlzLl9kZWNsaW5lWC54KHRoaXMubWluWC1uKSk6bj10aGlzLm1pblg6bj50aGlzLm1heFgmJih0aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixuPXRoaXMubWF4WCt0aGlzLl9kZWNsaW5lWC54KG4tdGhpcy5tYXhYKSk6bj10aGlzLm1heFgpLHI8dGhpcy5taW5ZP3RoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLHI9dGhpcy5taW5ZLXRoaXMuX2RlY2xpbmVZLngodGhpcy5taW5ZLXIpKTpyPXRoaXMubWluWTpyPnRoaXMubWF4WSYmKHRoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLHI9dGhpcy5tYXhZK3RoaXMuX2RlY2xpbmVZLngoci10aGlzLm1heFkpKTpyPXRoaXMubWF4WSksX3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuX3NldFRyYW5zZm9ybShuLHIsdC5fc2NhbGUsaSl9KX19fSxfX2hhbmRsZVRvdWNoRW5kOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcztpZighdGhpcy5faXNTY2FsaW5nJiYhdGhpcy5kaXNhYmxlZCYmdGhpcy5faXNUb3VjaGluZyYmKHRoaXMuX2lzVG91Y2hpbmc9ITEsIXRoaXMuX2NoZWNrQ2FuTW92ZSYmIXRoaXMuX3JldmlzZSgib3V0LW9mLWJvdW5kcyIpJiZ0aGlzLmluZXJ0aWEpKXt2YXIgZT0xZTMqKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVhbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WFswXSkvKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFswXSksdD0xZTMqKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVlbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WVswXSkvKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFswXSk7dGhpcy5fZnJpY3Rpb24uc2V0VihlLHQpLHRoaXMuX2ZyaWN0aW9uLnNldFModGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKTt2YXIgbj10aGlzLl9mcmljdGlvbi5kZWx0YSgpLngsaT10aGlzLl9mcmljdGlvbi5kZWx0YSgpLnksbz1uK3RoaXMuX3RyYW5zbGF0ZVgsYT1pK3RoaXMuX3RyYW5zbGF0ZVk7bzx0aGlzLm1pblg/KG89dGhpcy5taW5YLGE9dGhpcy5fdHJhbnNsYXRlWSsodGhpcy5taW5YLXRoaXMuX3RyYW5zbGF0ZVgpKmkvbik6bz50aGlzLm1heFgmJihvPXRoaXMubWF4WCxhPXRoaXMuX3RyYW5zbGF0ZVkrKHRoaXMubWF4WC10aGlzLl90cmFuc2xhdGVYKSppL24pLGE8dGhpcy5taW5ZPyhhPXRoaXMubWluWSxvPXRoaXMuX3RyYW5zbGF0ZVgrKHRoaXMubWluWS10aGlzLl90cmFuc2xhdGVZKSpuL2kpOmE+dGhpcy5tYXhZJiYoYT10aGlzLm1heFksbz10aGlzLl90cmFuc2xhdGVYKyh0aGlzLm1heFktdGhpcy5fdHJhbnNsYXRlWSkqbi9pKSx0aGlzLl9mcmljdGlvbi5zZXRFbmQobyxhKSx0aGlzLl9GQT1nKHRoaXMuX2ZyaWN0aW9uLGZ1bmN0aW9uKCl7dmFyIGU9ci5fZnJpY3Rpb24ucygpLHQ9ZS54LG49ZS55O3IuX3NldFRyYW5zZm9ybSh0LG4sci5fc2NhbGUsImZyaWN0aW9uIil9LGZ1bmN0aW9uKCl7ci5fRkEuY2FuY2VsKCl9KX19LF9vblRyYWNrOmZ1bmN0aW9uKGUpe3N3aXRjaChlLmRldGFpbC5zdGF0ZSl7Y2FzZSJzdGFydCI6dGhpcy5fX2hhbmRsZVRvdWNoU3RhcnQoKTticmVhaztjYXNlIm1vdmUiOnRoaXMuX19oYW5kbGVUb3VjaE1vdmUoZSk7YnJlYWs7Y2FzZSJlbmQiOnRoaXMuX19oYW5kbGVUb3VjaEVuZCgpfX0sX2dldExpbWl0WFk6ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTtyZXR1cm4gZT50aGlzLm1heFg/KGU9dGhpcy5tYXhYLG49ITApOmU8dGhpcy5taW5YJiYoZT10aGlzLm1pblgsbj0hMCksdD50aGlzLm1heFk/KHQ9dGhpcy5tYXhZLG49ITApOnQ8dGhpcy5taW5ZJiYodD10aGlzLm1pblksbj0hMCkse3g6ZSx5OnQsb3V0T2ZCb3VuZHM6bn19LHNldFBhcmVudDpmdW5jdGlvbigpe2lmKHRoaXMuJHBhcmVudC5fX2lzTW91bnRlZCl7dGhpcy5fRkEmJnRoaXMuX0ZBLmNhbmNlbCgpLHRoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpO3ZhciBlPXRoaXMuc2NhbGU/dGhpcy5zY2FsZVZhbHVlU3luYzoxO3RoaXMuX3VwZGF0ZU9mZnNldCgpLHRoaXMuX3VwZGF0ZVdIKGUpLHRoaXMuX3VwZGF0ZUJvdW5kYXJ5KCksdGhpcy5fdHJhbnNsYXRlWD10aGlzLnhTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0LngsdGhpcy5fdHJhbnNsYXRlWT10aGlzLnlTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0Lnk7dmFyIHQ9dGhpcy5fZ2V0TGltaXRYWSh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpLG49dC54LHI9dC55O3RoaXMuX3NldFRyYW5zZm9ybShuLHIsZSwiIiwhMCksdGhpcy5fdXBkYXRlT2xkU2NhbGUoZSl9fSxfdXBkYXRlT2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2V0Lng9dGhpcy5fcmVjdC5sZWZ0LXRoaXMuJHBhcmVudC5sZWZ0LHRoaXMuX29mZnNldC55PXRoaXMuX3JlY3QudG9wLXRoaXMuJHBhcmVudC50b3B9LF91cGRhdGVXSDpmdW5jdGlvbihlKXtlPWV8fHRoaXMuX3NjYWxlLGU9dGhpcy5fYWRqdXN0U2NhbGUoZSk7dmFyIHQ9dGhpcy5fcmVjdDt0aGlzLmhlaWdodD10LmhlaWdodC90aGlzLl9zY2FsZSx0aGlzLndpZHRoPXQud2lkdGgvdGhpcy5fc2NhbGU7dmFyIG49dGhpcy5oZWlnaHQqZSxyPXRoaXMud2lkdGgqZTt0aGlzLl9zY2FsZU9mZnNldC54PShyLXRoaXMud2lkdGgpLzIsdGhpcy5fc2NhbGVPZmZzZXQueT0obi10aGlzLmhlaWdodCkvMn0sX3VwZGF0ZUJvdW5kYXJ5OmZ1bmN0aW9uKCl7dmFyIGU9MC10aGlzLl9vZmZzZXQueCt0aGlzLl9zY2FsZU9mZnNldC54LHQ9dGhpcy4kcGFyZW50LndpZHRoLXRoaXMud2lkdGgtdGhpcy5fb2Zmc2V0LngtdGhpcy5fc2NhbGVPZmZzZXQueDt0aGlzLm1pblg9TWF0aC5taW4oZSx0KSx0aGlzLm1heFg9TWF0aC5tYXgoZSx0KTt2YXIgbj0wLXRoaXMuX29mZnNldC55K3RoaXMuX3NjYWxlT2Zmc2V0Lnkscj10aGlzLiRwYXJlbnQuaGVpZ2h0LXRoaXMuaGVpZ2h0LXRoaXMuX29mZnNldC55LXRoaXMuX3NjYWxlT2Zmc2V0Lnk7dGhpcy5taW5ZPU1hdGgubWluKG4sciksdGhpcy5tYXhZPU1hdGgubWF4KG4scil9LF9iZWdpblNjYWxlOmZ1bmN0aW9uKCl7dGhpcy5faXNTY2FsaW5nPSEwfSxfZW5kU2NhbGU6ZnVuY3Rpb24oKXt0aGlzLl9pc1NjYWxpbmc9ITEsdGhpcy5fdXBkYXRlT2xkU2NhbGUodGhpcy5fc2NhbGUpfSxfc2V0U2NhbGU6ZnVuY3Rpb24oZSl7dGhpcy5zY2FsZSYmKGU9dGhpcy5fYWRqdXN0U2NhbGUoZSksZT10aGlzLl9vbGRTY2FsZSplLHRoaXMuX2JlZ2luU2NhbGUoKSx0aGlzLl91cGRhdGVTY2FsZShlKSl9LF91cGRhdGVTY2FsZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYodGhpcy5zY2FsZSl7ZT10aGlzLl9hZGp1c3RTY2FsZShlKSx0aGlzLl91cGRhdGVXSChlKSx0aGlzLl91cGRhdGVCb3VuZGFyeSgpO3ZhciByPXRoaXMuX2dldExpbWl0WFkodGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKSxpPXIueCxvPXIueTt0P3RoaXMuX2FuaW1hdGlvblRvKGksbyxlLCIiLCEwLCEwKTpfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7bi5fc2V0VHJhbnNmb3JtKGksbyxlLCIiLCEwLCEwKX0pfX0sX3VwZGF0ZU9sZFNjYWxlOmZ1bmN0aW9uKGUpe3RoaXMuX29sZFNjYWxlPWV9LF9hZGp1c3RTY2FsZTpmdW5jdGlvbihlKXtyZXR1cm4gZT1NYXRoLm1heCguNSx0aGlzLnNjYWxlTWluTnVtYmVyLGUpLGU9TWF0aC5taW4oMTAsdGhpcy5zY2FsZU1heE51bWJlcixlKX0sX2FuaW1hdGlvblRvOmZ1bmN0aW9uKGUsdCxuLGksbyxhKXt2YXIgcz10aGlzO3RoaXMuX0ZBJiZ0aGlzLl9GQS5jYW5jZWwoKSx0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLnhNb3ZlfHwoZT10aGlzLl90cmFuc2xhdGVYKSx0aGlzLnlNb3ZlfHwodD10aGlzLl90cmFuc2xhdGVZKSx0aGlzLnNjYWxlfHwobj10aGlzLl9zY2FsZSk7dmFyIHI9dGhpcy5fZ2V0TGltaXRYWShlLHQpO2U9ci54LHQ9ci55LHRoaXMuYW5pbWF0aW9uPyh0aGlzLl9TVEQuX3NwcmluZ1guX3NvbHV0aW9uPW51bGwsdGhpcy5fU1RELl9zcHJpbmdZLl9zb2x1dGlvbj1udWxsLHRoaXMuX1NURC5fc3ByaW5nU2NhbGUuX3NvbHV0aW9uPW51bGwsdGhpcy5fU1RELl9zcHJpbmdYLl9lbmRQb3NpdGlvbj10aGlzLl90cmFuc2xhdGVYLHRoaXMuX1NURC5fc3ByaW5nWS5fZW5kUG9zaXRpb249dGhpcy5fdHJhbnNsYXRlWSx0aGlzLl9TVEQuX3NwcmluZ1NjYWxlLl9lbmRQb3NpdGlvbj10aGlzLl9zY2FsZSx0aGlzLl9TVEQuc2V0RW5kKGUsdCxuLDEpLHRoaXMuX1NGQT1nKHRoaXMuX1NURCxmdW5jdGlvbigpe3ZhciBlPXMuX1NURC54KCksdD1lLngsbj1lLnkscj1lLnNjYWxlO3MuX3NldFRyYW5zZm9ybSh0LG4scixpLG8sYSl9LGZ1bmN0aW9uKCl7cy5fU0ZBLmNhbmNlbCgpfSkpOnRoaXMuX3NldFRyYW5zZm9ybShlLHQsbixpLG8sYSl9LF9yZXZpc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0TGltaXRYWSh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpLG49dC54LHI9dC55LGk9dC5vdXRPZkJvdW5kcztyZXR1cm4gaSYmdGhpcy5fYW5pbWF0aW9uVG8obixyLHRoaXMuX3NjYWxlLGUpLGl9LF9zZXRUcmFuc2Zvcm06ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZvaWQgMD09PXImJihyPSIiKSxudWxsIT09ZSYmIk5hTiIhPT1lLnRvU3RyaW5nKCkmJiJudW1iZXIiPT10eXBlb2YgZXx8KGU9dGhpcy5fdHJhbnNsYXRlWHx8MCksbnVsbCE9PXQmJiJOYU4iIT09dC50b1N0cmluZygpJiYibnVtYmVyIj09dHlwZW9mIHR8fCh0PXRoaXMuX3RyYW5zbGF0ZVl8fDApLGU9TnVtYmVyKGUudG9GaXhlZCgxKSksdD1OdW1iZXIodC50b0ZpeGVkKDEpKSxuPU51bWJlcihuLnRvRml4ZWQoMSkpLHRoaXMuX3RyYW5zbGF0ZVg9PT1lJiZ0aGlzLl90cmFuc2xhdGVZPT09dHx8aXx8dGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7eDp2KGUsdGhpcy5fc2NhbGVPZmZzZXQueCkseTp2KHQsdGhpcy5fc2NhbGVPZmZzZXQueSksc291cmNlOnJ9KSx0aGlzLnNjYWxlfHwobj10aGlzLl9zY2FsZSksbj0rKG49dGhpcy5fYWRqdXN0U2NhbGUobikpLnRvRml4ZWQoMyksbyYmbiE9PXRoaXMuX3NjYWxlJiZ0aGlzLiR0cmlnZ2VyKCJzY2FsZSIse3g6ZSx5OnQsc2NhbGU6bn0pO3ZhciBhPSJ0cmFuc2xhdGUoIitlKyJweCwgIit0KyJweCkgc2NhbGUoIituKyIpIjtzLnRyYW5zaXRpb24odGhpcy4kcmVmcy5lbCx7c3R5bGVzOnt0cmFuc2Zvcm06YX0sZHVyYXRpb246MCxkZWxheTowfSksdGhpcy5fdHJhbnNsYXRlWD1lLHRoaXMuX3RyYW5zbGF0ZVk9dCx0aGlzLl9zY2FsZT1ufSxfdG91Y2hzdGFydDpmdW5jdGlvbigpe3RoaXMuJHBhcmVudC50b3VjaEl0ZW09dGhpc30sX2dldENvbXBvbmVudFNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe3QuZ2V0Q29tcG9uZW50UmVjdChlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2l6ZTtuKHQpfSl9KX0sX3VwZGF0ZVJlY3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9nZXRDb21wb25lbnRTaXplKHRoaXMuJHJlZnMuZWwpLnRoZW4oZnVuY3Rpb24oZSl7dC5fcmVjdD1lfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e3RvdWNoc3RhcnQ6dGhpcy5fdG91Y2hzdGFydH07cmV0dXJuIGUoImRpdiIsdGhpcy5fZyh7cmVmOiJlbCIsb246dCxzdGF0aWNDbGFzczpbInVuaS1tb3ZhYmxlLXZpZXciXSxzdGF0aWNTdHlsZTp7dHJhbnNmb3JtT3JpZ2luOiJjZW50ZXIifSxhdHRyczp7cHJldmVudEdlc3R1cmU6ITB9fSx0aGlzLiRsaXN0ZW5lcnMpLHRoaXMuJHNsb3RzLmRlZmF1bHQsMil9LHN0eWxlOnsidW5pLW1vdmFibGUtdmlldyI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiIwcHgiLGxlZnQ6IjBweCIsd2lkdGg6IjEwcHgiLGhlaWdodDoiMTBweCJ9fX19ZnVuY3Rpb24gaW5pdCQxMihlLHQpe2UuY29tcG9uZW50KCJtb3ZhYmxlLXZpZXciLGdldE1vdmFibGVWaWV3KHQpKX12YXIgT1BFTl9UWVBFUyQxPXtuYXZpZ2F0ZToibmF2aWdhdGVUbyIscmVkaXJlY3Q6InJlZGlyZWN0VG8iLHN3aXRjaFRhYjoic3dpdGNoVGFiIixyZUxhdW5jaDoicmVMYXVuY2giLG5hdmlnYXRlQmFjazoibmF2aWdhdGVCYWNrIn0sQU5JTUFUSU9OX1RZUEVfSU49WyJzbGlkZS1pbi1yaWdodCIsInNsaWRlLWluLWxlZnQiLCJzbGlkZS1pbi10b3AiLCJzbGlkZS1pbi1ib3R0b20iLCJmYWRlLWluIiwiem9vbS1vdXQiLCJ6b29tLWZhZGUtb3V0IiwicG9wLWluIiwibm9uZSJdLEFOSU1BVElPTl9UWVBFX09VVD1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLHBsdXNfLEJyb2FkY2FzdENoYW5uZWxfLGNoYW5uZWw7ZnVuY3Rpb24gZ2V0TmF2aWdhdG9yKGUsdCl7cmV0dXJue25hbWU6Ik5hdmlnYXRvciIsaXNSZXNlcnZlZDohMCxwcm9wczp7dXJsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibmF2aWdhdGUiLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4hIU9QRU5fVFlQRVMkMVtlXX19LGRlbHRhOnt0eXBlOk51bWJlcixkZWZhdWx0OjF9LGFuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4hZXx8fkFOSU1BVElPTl9UWVBFX0lOLmNvbmNhdChBTklNQVRJT05fVFlQRV9PVVQpLmluZGV4T2YoZSl9fSxhbmltYXRpb25EdXJhdGlvbjp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDozMDB9LGhvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRvci1ob3ZlciJ9LGhvdmVyU3RvcFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0saG92ZXJTdGFydFRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NTB9LGhvdmVyU3RheVRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NjAwfX0sbWV0aG9kczp7X2NsaWNrOmZ1bmN0aW9uKCl7aWYoIm5hdmlnYXRlQmFjayI9PT10aGlzLm9wZW5UeXBlfHx0aGlzLnVybCl7dmFyIGU9cGFyc2VJbnQodGhpcy5hbmltYXRpb25EdXJhdGlvbik7c3dpdGNoKHRoaXMub3BlblR5cGUpe2Nhc2UibmF2aWdhdGUiOnQubmF2aWdhdGVUbyh7dXJsOnRoaXMudXJsLGFuaW1hdGlvblR5cGU6dGhpcy5hbmltYXRpb25UeXBlfHwicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjplfSk7YnJlYWs7Y2FzZSJyZWRpcmVjdCI6dC5yZWRpcmVjdFRvKHt1cmw6dGhpcy51cmx9KTticmVhaztjYXNlInN3aXRjaFRhYiI6dC5zd2l0Y2hUYWIoe3VybDp0aGlzLnVybH0pO2JyZWFrO2Nhc2UicmVMYXVuY2giOnQucmVMYXVuY2goe3VybDp0aGlzLnVybH0pO2JyZWFrO2Nhc2UibmF2aWdhdGVCYWNrIjp0Lm5hdmlnYXRlQmFjayh7ZGVsdGE6dGhpcy5kZWx0YSxhbmltYXRpb25UeXBlOnRoaXMuYW5pbWF0aW9uVHlwZXx8InBvcC1vdXQiLGFuaW1hdGlvbkR1cmF0aW9uOmV9KX19ZWxzZSBjb25zb2xlLmVycm9yKCI8bmF2aWdhdG9yLz4gc2hvdWxkIGhhdmUgdXJsIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIG5hdmlnYXRlVG8sIHJlZGlyZWN0VG8sIHJlTGF1bmNoIG9yIHN3aXRjaFRhYiIpfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ2aWV3Iix0aGlzLl9nKHthdHRyczp7aG92ZXJDbGFzczp0aGlzLmhvdmVyQ2xhc3MsaG92ZXJTdG9wUHJvcGFnYXRpb246dGhpcy5ob3ZlclN0b3BQcm9wYWdhdGlvbixob3ZlclN0YXJ0VGltZTp0aGlzLmhvdmVyU3RhcnRUaW1lLGhvdmVyU3RheVRpbWU6dGhpcy5ob3ZlclN0YXlUaW1lfSxvbjp7Y2xpY2s6dGhpcy5fY2xpY2t9fSx0aGlzLiRsaXN0ZW5lcnMpLFt0aGlzLl90KCJkZWZhdWx0IildLDIpfSxzdHlsZTp7Im5hdmlnYXRvci1ob3ZlciI6e2JhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwLjEpIixvcGFjaXR5Oi43fX19fWZ1bmN0aW9uIGluaXQkMTMoZSx0LG4pe2UuY29tcG9uZW50KCJuYXZpZ2F0b3IiLGdldE5hdmlnYXRvcih0LG4udW5pKSl9ZnVuY3Rpb24gZ2V0UnVudGltZSgpe3JldHVybiJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudD8id2VidmlldyI6InY4In1mdW5jdGlvbiBnZXRQYWdlSWQoKXtyZXR1cm4gcGx1c18ud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkfXZhciBjYWxsYmFja3M9e307ZnVuY3Rpb24gb25QbHVzTWVzc2FnZShlKXt2YXIgdD1lLmRhdGEmJmUuZGF0YS5fX21lc3NhZ2U7aWYodCYmdC5fX3BhZ2Upe3ZhciBuPXQuX19wYWdlLHI9Y2FsbGJhY2tzW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgY2FsbGJhY2tzW25dfX1mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGUsdCl7InY4Ij09PWdldFJ1bnRpbWUoKT8oY2hhbm5lbCYmY2hhbm5lbC5jbG9zZSgpLChjaGFubmVsPW5ldyBCcm9hZGNhc3RDaGFubmVsXyhnZXRQYWdlSWQoKSkpLm9ubWVzc2FnZT1vblBsdXNNZXNzYWdlKTp3aW5kb3cuX19wbHVzTWVzc2FnZT1vblBsdXNNZXNzYWdlLGNhbGxiYWNrc1tlXT10fXZhciBQYWdlPWZ1bmN0aW9uKGUpe3RoaXMud2Vidmlldz1lfTtmdW5jdGlvbiBzaG93UGFnZShlKXt2YXIgdD1lLmNvbnRleHQ7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBuPWUudXJsLHI9ZS5kYXRhO3ZvaWQgMD09PXImJihyPXt9KTt2YXIgaT1lLnN0eWxlO3ZvaWQgMD09PWkmJihpPXt9KTt2YXIgbz1lLm9uTWVzc2FnZSxhPWUub25DbG9zZTtwbHVzXz10LnBsdXN8fHBsdXMsQnJvYWRjYXN0Q2hhbm5lbF89dC5Ccm9hZGNhc3RDaGFubmVsfHxCcm9hZGNhc3RDaGFubmVsO3ZhciBzPSJwYWdlIitEYXRlLm5vdygpOyExIT09KGk9T2JqZWN0LmFzc2lnbih7fSxpKSkudGl0bGVOVmlldyYmIm5vbmUiIT09aS50aXRsZU5WaWV3JiYoaS50aXRsZU5WaWV3PU9iamVjdC5hc3NpZ24oe2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGkudGl0bGVOVmlldykpO3ZhciBjPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6KCJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy5lbnYmJnByb2Nlc3MuZW52LlZVRV9BUFBfVEVNUExBVEVfUEFUSHx8IiIpKyIvIituKyIuanMiLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpwbHVzXy5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07aT1PYmplY3QuYXNzaWduKGMsaSk7dmFyIHU9cGx1c18ud2Vidmlldy5jcmVhdGUoIiIscyxpLHtleHRyYXM6e2Zyb206Z2V0UGFnZUlkKCkscnVudGltZTpnZXRSdW50aW1lKCksZGF0YTpyfX0pO3JldHVybiB1LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixhKSxhZGRFdmVudExpc3RlbmVyKHMsZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oZS5kYXRhKSxlLmtlZXB8fHUuY2xvc2UoImF1dG8iKX0pLHUuc2hvdyhpLmFuaW1hdGlvblR5cGUsaS5hbmltYXRpb25EdXJhdGlvbiksbmV3IFBhZ2UodSl9ZnVuY3Rpb24gZ2V0UGlja2VyKGUsdCl7dmFyIG89e1NFTEVDVE9SOiJzZWxlY3RvciIsTVVMVElTRUxFQ1RPUjoibXVsdGlTZWxlY3RvciIsVElNRToidGltZSIsREFURToiZGF0ZSJ9LGE9e1lFQVI6InllYXIiLE1PTlRIOiJtb250aCIsREFZOiJkYXkifSxyPVsicmFuZ2UiLCJyYW5nZUtleSIsInZhbHVlIiwibW9kZSIsImZpZWxkcyIsInN0YXJ0IiwiZW5kIiwiZGlzYWJsZWQiXTtmdW5jdGlvbiBzKGUpe3JldHVybiA5PGU/ZToiMCIrZX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49bmV3IERhdGU7cmV0dXJuIGU9U3RyaW5nKGV8fCIiKSx0PT09by5USU1FPzI9PT0oZT1lLnNwbGl0KCI6IikpLmxlbmd0aCYmbi5zZXRIb3VycyhwYXJzZUludChlWzBdKSxwYXJzZUludChlWzFdKSk6Mz09PShlPWUuc3BsaXQoIi0iKSkubGVuZ3RoJiZuLnNldEZ1bGxZZWFyKHBhcnNlSW50KGVbMF0pLHBhcnNlSW50KGVbMV0tMSkscGFyc2VJbnQoZVsyXSkpLG59cmV0dXJue25hbWU6IlBpY2tlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOntyYW5nZTp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fSxyYW5nZUtleTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmcsQXJyYXldLGRlZmF1bHQ6MH0sbW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpvLlNFTEVDVE9SLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gMDw9T2JqZWN0LnZhbHVlcyhvKS5pbmRleE9mKGUpfX0sZmllbGRzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxzdGFydDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmdW5jdGlvbigpe2lmKHRoaXMubW9kZT09PW8uVElNRSlyZXR1cm4iMDA6MDAiO2lmKHRoaXMubW9kZT09PW8uREFURSl7dmFyIGU9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLTEwMDtzd2l0Y2godGhpcy5maWVsZHMpe2Nhc2UgYS5ZRUFSOnJldHVybiBlO2Nhc2UgYS5NT05USDpyZXR1cm4gZSsiLTAxIjtkZWZhdWx0OnJldHVybiBlKyItMDEtMDEifX1yZXR1cm4iIn19LGVuZDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmdW5jdGlvbigpe2lmKHRoaXMubW9kZT09PW8uVElNRSlyZXR1cm4iMjM6NTkiO2lmKHRoaXMubW9kZT09PW8uREFURSl7dmFyIGU9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpKzEwMDtzd2l0Y2godGhpcy5maWVsZHMpe2Nhc2UgYS5ZRUFSOnJldHVybiBlO2Nhc2UgYS5NT05USDpyZXR1cm4gZSsiLTEyIjtkZWZhdWx0OnJldHVybiBlKyItMTItMzEifX1yZXR1cm4iIn19LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGNvbXB1dGVkOnthdHRyczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj17fTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09dC4kcHJvcHNbZV19KSxufX0sbWV0aG9kczp7X3Nob3c6ZnVuY3Rpb24oKXt0aGlzLl9zaG93UGlja2VyKE9iamVjdC5hc3NpZ24oe30sdGhpcy5hdHRycykpfSxfc2hvd1BpY2tlcjpmdW5jdGlvbihuKXt2YXIgcj10aGlzLGU9dC5wbHVzfHxuZXcgdC5XZWV4UGx1cyh0LndlZXgpO2lmKGUua2V5LmhpZGVTb2Z0S2V5Ym9yZCgpLHRoaXMubW9kZSE9PW8uVElNRSYmdGhpcy5tb2RlIT09by5EQVRFfHxuLmZpZWxkcyl7bi5maWVsZHM9T2JqZWN0LnZhbHVlcyhhKS5pbmNsdWRlcyhuLmZpZWxkcyk/bi5maWVsZHM6YS5EQVk7dmFyIGk9e2V2ZW50OiJjYW5jZWwifTt0aGlzLnBhZ2U9c2hvd1BhZ2Uoe2NvbnRleHQ6T2JqZWN0LmFzc2lnbih7fSx0LHtwbHVzOmV9KSx1cmw6Il9fdW5pYXBwcGlja2VyIixkYXRhOm4sc3R5bGU6e3RpdGxlTlZpZXc6ITEsYW5pbWF0aW9uVHlwZToibm9uZSIsYW5pbWF0aW9uRHVyYXRpb246MCxiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDApIixwb3BHZXN0dXJlOiJub25lIn0sb25NZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZXZlbnQ7aWYoImNyZWF0ZWQiIT09dClyZXR1cm4iY29sdW1uY2hhbmdlIj09PXQ/KGRlbGV0ZSBlLmV2ZW50LHZvaWQgci4kdHJpZ2dlcih0LGUpKTp2b2lkKGk9ZSk7ci5fdXBkYXRlUGlja2VyKG4pfSxvbkNsb3NlOmZ1bmN0aW9uKCl7ci5wYWdlPW51bGw7dmFyIGU9aS5ldmVudDtkZWxldGUgaS5ldmVudCxyLiR0cmlnZ2VyKGUsaSl9fSl9ZWxzZSBlLm5hdGl2ZVVJW3RoaXMubW9kZT09PW8uVElNRT8icGlja1RpbWUiOiJwaWNrRGF0ZSJdKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTpyLm1vZGU9PT1vLlRJTUU/cyh0LmdldEhvdXJzKCkpKyI6IitzKHQuZ2V0TWludXRlcygpKTp0LmdldEZ1bGxZZWFyKCkrIi0iK3ModC5nZXRNb250aCgpKzEpKyItIitzKHQuZ2V0RGF0ZSgpKX0pfSxmdW5jdGlvbigpe3IuJHRyaWdnZXIoImNhbmNlbCIse30pfSx0aGlzLm1vZGU9PT1vLlRJTUU/e3RpbWU6Yyh0aGlzLnZhbHVlLG8uVElNRSl9OntkYXRlOmModGhpcy52YWx1ZSxvLkRBVEUpLG1pbkRhdGU6Yyh0aGlzLnN0YXJ0LG8uREFURSksbWF4RGF0ZTpjKHRoaXMuZW5kLG8uREFURSl9KX0sX3VwZGF0ZVBpY2tlcjpmdW5jdGlvbihlKXt0aGlzLnBhZ2UmJnRoaXMucGFnZS5zZW5kTWVzc2FnZShlKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuJHdhdGNoKCJhdHRycyIsZnVuY3Rpb24oZSl7dC5fdXBkYXRlUGlja2VyKGUpfSx7ZGVlcDohMH0pfSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCh0LmNsaWNrPXRoaXMuX3Nob3cpLGUoImRpdiIsdGhpcy5fZyh7b246dH0sdGhpcy4kbGlzdGVuZXIpLHRoaXMuJHNsb3RzLmRlZmF1bHQsMil9fX1mdW5jdGlvbiBpbml0JDE0KGUsdCxuKXtlLmNvbXBvbmVudCgicGlja2VyIixnZXRQaWNrZXIodCxuKSl9UGFnZS5wcm90b3R5cGUuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOmV9fSkpO25ldyBCcm9hZGNhc3RDaGFubmVsXyh0aGlzLndlYnZpZXcuaWQpLnBvc3RNZXNzYWdlKHQpfSxQYWdlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMud2Vidmlldy5jbG9zZSgpfTt2YXIgUFJJTUFSWV9DT0xPUj0iIzAwN0FGRiIsQkFDS0dST1VORF9DT0xPUj0iI0VCRUJFQiIsQU5JTUFURV9JTlRFUlZBTF9ERUZBVUxUPTMwLEZPTlRfU0laRT0xNixTVFJPS0VfV0lEVEg9NjtmdW5jdGlvbiBnZXRQcm9ncmVzcyhlLG4pe3JldHVybntuYW1lOiJQcm9ncmVzcyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOntwZXJjZW50Ont0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjB9LHNob3dJbmZvOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYm9yZGVyUmFkaXVzOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjB9LGZvbnRTaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OkZPTlRfU0laRX0sc3Ryb2tlV2lkdGg6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6U1RST0tFX1dJRFRIfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpQUklNQVJZX0NPTE9SfSxhY3RpdmVNb2RlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJiYWNrd2FyZHMifSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6QkFDS0dST1VORF9DT0xPUn0sZHVyYXRpb246e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6QU5JTUFURV9JTlRFUlZBTF9ERUZBVUxUfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDowLGN1clBlcmNlbnQ6MH19LGNvbXB1dGVkOntiYXJTdHlsZTpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6dGhpcy5zdHJva2VXaWR0aCxib3JkZXJSYWRpdXM6dGhpcy5ib3JkZXJSYWRpdXMsYmFja2dyb3VuZENvbG9yOnRoaXMuYmFja2dyb3VuZENvbG9yfX0saW5uZXJCYXJTdHlsZTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp0aGlzLmFjdGl2ZVdpZHRoLGhlaWdodDp0aGlzLnN0cm9rZVdpZHRoLGJhY2tncm91bmRDb2xvcjp0aGlzLmFjdGl2ZUNvbG9yfX0sYWN0aXZlV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJQZXJjZW50KnRoaXMud2lkdGgvMTAwfSxmaW5hbFBlcmNlbnQ6ZnVuY3Rpb24oKXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMucGVyY2VudCwxMCk7cmV0dXJuIDEwMDxlJiYoZT0xMDApLGU8MCYmKGU9MCksZX19LHdhdGNoOntmaW5hbFBlcmNlbnQ6ZnVuY3Rpb24oZSx0KXt0aGlzLl90aW1lcklkJiZuLmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXJJZCksdGhpcy5fbGFzdFBlcmNlbnQ9dHx8MCx0aGlzLl9hbmltYXRlKCl9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHQuJHJlZnMucHJvZ3Jlc3MsZnVuY3Rpb24oZSl7dC53aWR0aD1lLnNpemUud2lkdGgsdC5fYW5pbWF0ZSgpfSl9LDUwKX0sbWV0aG9kczp7X2FuaW1hdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5maW5hbFBlcmNlbnQ7aWYoIXRoaXMuYWN0aXZlKXJldHVybiB0aGlzLmN1clBlcmNlbnQ9dDt0aGlzLmN1clBlcmNlbnQ9ImZvcndhcmRzIj09PXRoaXMuYWN0aXZlTW9kZT90aGlzLl9sYXN0UGVyY2VudDowLHRoaXMuX3RpbWVySWQ9bi5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3Q8PWUuY3VyUGVyY2VudCsxPyhlLmN1clBlcmNlbnQ9dCxuLmNsZWFySW50ZXJ2YWwoZS5fdGltZXJJZCksZS4kdHJpZ2dlcigiYWN0aXZlZW5kIix7Y3VyUGVyY2VudDplLmN1clBlcmNlbnR9KSk6KytlLmN1clBlcmNlbnR9LHRoaXMuZHVyYXRpb24pfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3JlZjoicHJvZ3Jlc3MiLHN0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzIl19LHRoaXMuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzLWJhciJdLHN0eWxlOnRoaXMuYmFyU3R5bGV9LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1wcm9ncmVzcy1pbm5lci1iYXIiXSxzdHlsZTp0aGlzLmlubmVyQmFyU3R5bGV9KV0pLHRoaXMuc2hvd0luZm8/W2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzLWluZm8iXSxzdHlsZTp7Zm9udFNpemU6dGhpcy5mb250U2l6ZX19LFt0aGlzLmN1clBlcmNlbnQrIiUiXSldOnRoaXMuX2UoKV0sMil9LHN0eWxlOnsidW5pLXByb2dyZXNzIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn0sInVuaS1wcm9ncmVzcy1iYXIiOntmbGV4OjF9LCJ1bmktcHJvZ3Jlc3MtaW5uZXItYmFyIjp7cG9zaXRpb246ImFic29sdXRlIn0sInVuaS1wcm9ncmVzcy1pbmZvIjp7bWFyZ2luTGVmdDoiMTVweCJ9fX19ZnVuY3Rpb24gaW5pdCQxNShlLHQsbil7ZS5jb21wb25lbnQoInByb2dyZXNzIixnZXRQcm9ncmVzcyh0LG4pKX1mdW5jdGlvbiBnZXRSYWRpb0dyb3VwKGUpe3JldHVybntuYW1lOiJSYWRpb0dyb3VwIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntyYWRpb0xpc3Q6W119fSxsaXN0ZW5lcnM6eyJAcmFkaW8tY2hhbmdlIjoiX2NoYW5nZUhhbmRsZXIiLCJAcmFkaW8tZ3JvdXAtdXBkYXRlIjoiX3JhZGlvR3JvdXBVcGRhdGVIYW5kbGVyIn0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0UmFkaW9Hcm91cFZhbHVlKHRoaXMucmFkaW9MaXN0Lmxlbmd0aC0xKX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfY2hhbmdlSGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMucmFkaW9MaXN0LmluZGV4T2YodCk7dGhpcy5fcmVzZXRSYWRpb0dyb3VwVmFsdWUobiwhMCksdGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7dmFsdWU6dC5yYWRpb1ZhbHVlfSl9LF9yYWRpb0dyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLnJhZGlvTGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5yYWRpb0xpc3QuaW5kZXhPZihlLnZtKTt0aGlzLnJhZGlvTGlzdC5zcGxpY2UodCwxKX19LF9yZXNldFJhZGlvR3JvdXBWYWx1ZTpmdW5jdGlvbih0LHIpe3ZhciBpPXRoaXM7dGhpcy5yYWRpb0xpc3QuZm9yRWFjaChmdW5jdGlvbihlLG4pe24hPT10JiYocj9pLnJhZGlvTGlzdFtuXS5yYWRpb0NoZWNrZWQ9ITE6aS5yYWRpb0xpc3QuZm9yRWFjaChmdW5jdGlvbihlLHQpe3Q8PW58fGkucmFkaW9MaXN0W3RdLnJhZGlvQ2hlY2tlZCYmKGkucmFkaW9MaXN0W25dLnJhZGlvQ2hlY2tlZD0hMSl9KSl9KX0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307aWYoIiIhPT10aGlzLm5hbWUpe3ZhciB0PSIiO3RoaXMucmFkaW9MaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yYWRpb0NoZWNrZWQmJih0PWUudmFsdWUpfSksZS52YWx1ZT10LGUua2V5PXRoaXMubmFtZX1yZXR1cm4gZX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHt9LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDE2KGUsdCl7ZS5jb21wb25lbnQoInJhZGlvLWdyb3VwIixnZXRSYWRpb0dyb3VwKHQpKX1mdW5jdGlvbiBnZXRSYWRpbyhlKXtyZXR1cm57bmFtZToiUmFkaW8iLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2NoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN0FGRiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntyYWRpb0NoZWNrZWQ6dGhpcy5jaGVja2VkLHJhZGlvVmFsdWU6dGhpcy52YWx1ZX19LGxpc3RlbmVyczp7ImxhYmVsLWNsaWNrIjoiX29uQ2xpY2siLCJAbGFiZWwtY2xpY2siOiJfb25DbGljayJ9LGNvbXB1dGVkOntjaGVja2VkU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57YmFja2dyb3VuZENvbG9yOnRoaXMuY29sb3IsYm9yZGVyQ29sb3I6dGhpcy5jb2xvcn19LHVuY2hlY2tlZFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2JvcmRlckNvbG9yOiIjZDFkMWQxIn19fSx3YXRjaDp7Y2hlY2tlZDpmdW5jdGlvbihlKXt0aGlzLnJhZGlvQ2hlY2tlZD1lfSx2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnJhZGlvVmFsdWU9ZX19LGJlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe30sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJSYWRpb0dyb3VwIiwidW5pLXJhZGlvLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiUmFkaW9Hcm91cCIsInVuaS1yYWRpby1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlKXt0aGlzLmRpc2FibGVkfHx0aGlzLnJhZGlvQ2hlY2tlZHx8KHRoaXMucmFkaW9DaGVja2VkPSEwLHRoaXMuJGRpc3BhdGNoKCJSYWRpb0dyb3VwIiwidW5pLXJhZGlvLWNoYW5nZSIsZSx0aGlzKSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5yYWRpb0NoZWNrZWQ9ITF9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgiZGl2Iix0Ll9nKHtzdGF0aWNDbGFzczpbInVuaS1yYWRpbyJdLGF0dHJzOntkYXRhVW5jVHlwZToidW5pLXJhZGlvIn0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSx0LiRsaXN0ZW5lcnMpLFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1yYWRpby1pbnB1dCJdLHN0eWxlOnQucmFkaW9DaGVja2VkP3QuY2hlY2tlZFN0eWxlOnQudW5jaGVja2VkU3R5bGV9LFt0LnJhZGlvQ2hlY2tlZD9lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInVuaS1yYWRpby1pbnB1dC1pY29uIl19LFt0Ll92KHQuX3MoIu6oiCIpKV0pOnQuX2UoKV0sMSksZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktdGV4dCJdfSxbdC5fdCgiZGVmYXVsdCIpXSwyKV0sMSl9LHN0eWxlOnsidW5pLXJhZGlvIjp7YWxpZ25JdGVtczoiY2VudGVyIixmbGV4RGlyZWN0aW9uOiJyb3cifSwidW5pLXJhZGlvLWlucHV0Ijp7cG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLG1hcmdpblJpZ2h0OiI1IixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixib3JkZXJSYWRpdXM6NTAsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIixvdXRsaW5lOjB9LCJ1bmktcmFkaW8taW5wdXQtaWNvbiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIixmb250U2l6ZToiMTQiLGNvbG9yOiIjZmZmZmZmIn0sInVuaS1yYWRpby1pbnB1dC1kaXNhYmxlZCI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGNvbG9yOiIjYWRhZGFkIn19fX1mdW5jdGlvbiBpbml0JDE3KGUsdCl7ZS5jb21wb25lbnQoInJhZGlvIixnZXRSYWRpbyh0KSl9ZnVuY3Rpb24gbm9ybWFsaXplTm9kZXMoZSx0LG4pe3ZhciBjPVsic3BhbiIsImEiLCJpbWFnZSIsImltZyJdO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUuX19ibG9jaz0hMCxlfWZ1bmN0aW9uIHIobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHI9byxpPXQsIShuPWUpLnN0eWxlLmZvbnRTaXplJiYobi5zdHlsZS5mb250U2l6ZT1pLmRlZmF1bHRGb250U2l6ZSpyKSxhKHMobikpO3ZhciBuLHIsaX19ZnVuY3Rpb24gcyhlKXtyZXR1cm4hZS5zdHlsZS5mb250V2VpZ2h0JiYoZS5zdHlsZS5mb250V2VpZ2h0PSJib2xkIiksZX12YXIgdT17YmxvY2txdW90ZTphLGJyOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9fdmFsdWU9IiAiLGEoZSl9LGRpdjphLGRsOmEsaDE6cigyKSxoMjpyKDEuNSksaDM6cigxLjE3KSxoNDpyKDEpLGg1OnIoLjgzKSxoNjpyKC42NyksaHI6YSxvbDphLHA6YSxzdHJvbmc6cyx0YWJsZTphLHRib2R5OmEsdGZvb3Q6YSx0aGVhZDphLHVsOmF9LGw9LyYoYW1wfGd0fGx0fG5ic3B8cXVvdHxhcG9zKTsvZyxkPXthbXA6IiYiLGd0OiI+IixsdDoiPCIsbmJzcDoiICIscXVvdDonIicsYXBvczoiJyJ9O3ZhciBmLHA9e19fYmxvY2s6ITAsX19icmVhazohMCxjaGlsZHJlbjpbXX07ZnVuY3Rpb24gaSh0LGUsbil7dmFyIHI9KHQubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCksaT1yLG89dVtyXTstMT09PWMuaW5kZXhPZihyKSYmKHI9InNwYW4iKSwiaW1nIj09PXImJihyPSJpbWFnZSIpO3ZhciBhPXt0eXBlOnIsX190eXBlOmksYXR0cjpPYmplY3QuY3JlYXRlKG51bGwpfTtpZigoInRleHQiPT09dC50eXBlfHx0LnRleHQpJiYoYS5fX3ZhbHVlPWEuYXR0ci52YWx1ZT0odC50ZXh0fHwiIikudHJpbSgpLnJlcGxhY2UobCxmdW5jdGlvbihlLHQpe3JldHVybiBkW3RdfSkpLHQuYXR0cnMmJk9iamVjdC5rZXlzKHQuYXR0cnMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImNsYXNzIiE9PWUmJiJzdHlsZSIhPT1lJiYoYS5hdHRyW2VdPXQuYXR0cnNbZV0pfSksYS5zdHlsZT1ub3JtYWxpemVVbml0KGZ1bmN0aW9uKGUsdCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihlLmF0dHJzKXt2YXIgcj0oZS5hdHRycy5jbGFzc3x8IiIpLnNwbGl0KCIgIiksaT10LiRvcHRpb25zLnN0eWxlfHx7fTtyLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmaVtlXSYmT2JqZWN0LmFzc2lnbihuLGlbZV0pfSksT2JqZWN0LmFzc2lnbihuLHBhcnNlU3R5bGVUZXh0KGUuYXR0cnMuc3R5bGV8fCIiKSl9aWYoImltZyI9PT1lLm5hbWV8fCJpbWFnZSI9PT1lLm5hbWUpe3ZhciBvPWUuYXR0cnM7bi53aWR0aD1uLndpZHRofHxvLndpZHRoLG4uaGVpZ2h0PW4uaGVpZ2h0fHxvLmhlaWdodH1yZXR1cm4gbn0odCxlKSksbyYmbyhhLG4pLChwLl9fYmxvY2t8fGEuX19ibG9jaykmJiFmKXt2YXIgcz17dHlwZToic3BhbiIsX190eXBlOiJicmVhayIsYXR0cjp7dmFsdWU6IlxuIn19O3AuY2hpbGRyZW4ucHVzaChzKSxmPVtwLHNdfXJldHVybigocD1hKS5fX3ZhbHVlfHwiaW1hZ2UiPT09cC50eXBlJiZwLmF0dHIuc3JjKSYmKGY9bnVsbCksYS5jaGlsZHJlbj1oKHQuY2hpbGRyZW4sZSxuKSwocD1hKS5fX2Jsb2NrJiZwLnN0eWxlLmhlaWdodCYmIS9eMChweCk/JC8udGVzdChwLnN0eWxlLmhlaWdodCkmJihmPW51bGwpLGF9ZnVuY3Rpb24gaChlLHQsbil7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSx0LG4pfSk6W119dmFyIG89aChlLHQsbik7aWYoZil7dmFyIHY9ZlswXSxnPWZbMV0sbT12LmNoaWxkcmVuLHk9bS5pbmRleE9mKGcpO20uc3BsaWNlKHksMSl9cmV0dXJuIG99ZnVuY3Rpb24gZ2V0UmljaFRleHQoZSl7cmV0dXJue25hbWU6IlJpY2hUZXh0Iixpc1Jlc2VydmVkOiEwLHByb3BzOntub2Rlczp7dHlwZTpbQXJyYXksU3RyaW5nXSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PW5vcm1hbGl6ZU5vZGVzKHRoaXMubm9kZXN8fFtdLHRoaXMuJHZub2RlLmNvbnRleHQse2RlZmF1bHRGb250U2l6ZToxNn0pO3JldHVybiBlKCJ1LXJpY2gtdGV4dCIsdGhpcy5fZyh7YXR0cnM6e3ZhbHVlOnR9fSx0aGlzLiRsaXN0ZW5lcnMpKX19fWZ1bmN0aW9uIGluaXQkMTgoZSx0KXtlLmNvbXBvbmVudCgicmljaC10ZXh0IixnZXRSaWNoVGV4dCh0KSl9ZnVuY3Rpb24gZ2V0U3dpcGVySXRlbShlKXtyZXR1cm57bmFtZToiU3dpcGVySXRlbSIsaXNSZXNlcnZlZDohMCxwcm9wczp7aXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLXN3aXBlci1pdGVtIl0sc3RhdGljU3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9fSx0aGlzLiRsaXN0ZW5lcnMpLHRoaXMuX3QoImRlZmF1bHQiKSwyKX19fWZ1bmN0aW9uIGluaXQkMTkoZSx0KXtlLmNvbXBvbmVudCgic3dpcGVyLWl0ZW0iLGdldFN3aXBlckl0ZW0odCkpfWZ1bmN0aW9uIGdldFN3aXBlcihyKXt2YXIgdD1yLnJlcXVpcmVNb2R1bGUoImRvbSIpO3JldHVybntuYW1lOiJTd2lwZXIiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyXSxwcm9wczp7aW5kaWNhdG9yRG90czp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHZlcnRpY2FsOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sYXV0b3BsYXk6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjaXJjdWxhcjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGludGVydmFsOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjVlM30sZHVyYXRpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NTAwfSxjdXJyZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LGluZGljYXRvckNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJyZ2JhKDAsMCwwLC4zKSJ9LGluZGljYXRvckFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDAwMDAwIn0scHJldmlvdXNNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG5leHRNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGN1cnJlbnRJdGVtSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNraXBIaWRkZW5JdGVtTGF5b3V0Ont0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZGlzcGxheU11bHRpcGxlSXRlbXM6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZVRvdWNoOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudFN5bmM6dGhpcy5jdXJyZW50LGN1cnJlbnRDaGFuZ2VTb3VyY2U6ImF1dG9wbGF5In19LHdhdGNoOntjdXJyZW50OmZ1bmN0aW9uKCl7dGhpcy5fY3VycmVudENoZWNrKCl9LGN1cnJlbnRJdGVtSWQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJyZW50Q2hlY2soKX0sY3VycmVudFN5bmM6ZnVuY3Rpb24oKXt0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHRoaXMuX2dldERldGFpbCgpKX19LG1ldGhvZHM6e29uQ2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGV0YWlsOyJzdHJpbmciPT10eXBlb2YgdC5zb3VyY2UmJih0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2U9dC5zb3VyY2UpLHRoaXMuY3VycmVudFN5bmM9dC5pbmRleCx0aGlzLl9sYXN0T2Zmc2V0UmF0aW89MH0sb25TY3JvbGw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy52ZXJ0aWNhbD9lLmRldGFpbC5vZmZzZXRZUmF0aW86ZS5kZXRhaWwub2Zmc2V0WFJhdGlvO2lmKChlLmRyYWd8fGUuZGV0YWlsLmRyYWcpJiYodGhpcy5jdXJyZW50Q2hhbmdlU291cmNlPSJ0b3VjaCIpLDA9PT10KXt2YXIgbj1NYXRoLmFicyh0aGlzLl9sYXN0T2Zmc2V0UmF0aW8pO2lmKDE9PT1uKXJldHVybjsuNTxuJiYodD0xKX10aGlzLl9sYXN0T2Zmc2V0UmF0aW89dCx0aGlzLiR0cmlnZ2VyKCJ0cmFuc2l0aW9uIix7ZHg6dGhpcy52ZXJ0aWNhbD8wOi10aGlzLl93aWR0aCp0LGR5OnRoaXMudmVydGljYWw/LXRoaXMuX2hlaWdodCp0OjB9KX0sb25TY3JvbGxFbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWZ1bmN0aW9uKCl7dC4kdHJpZ2dlcigiYW5pbWF0aW9uZmluaXNoIix0Ll9nZXREZXRhaWwoKSksdC5jdXJyZW50Q2hhbmdlU291cmNlPSJhdXRvcGxheSJ9OyJpT1MiPT09ci5jb25maWcuZW52LnBsYXRmb3JtP3NldFRpbWVvdXQobiw1MCk6bigpfSxfZ2V0RGV0YWlsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jdXJyZW50U3luYyx0PXRoaXMuaXRlbXNbZV18fHt9O3JldHVybntjdXJyZW50OmUsY3VycmVudEl0ZW1JZDp0LmNvbXBvbmVudEluc3RhbmNlJiZ0LmNvbXBvbmVudEluc3RhbmNlLml0ZW1JZHx8IiIsc291cmNlOnRoaXMuY3VycmVudENoYW5nZVNvdXJjZX19LF9jdXJyZW50Q2hlY2s6ZnVuY3Rpb24oKXt2YXIgZT0tMTtpZih0aGlzLmN1cnJlbnRJdGVtSWQpZm9yKHZhciB0PTAsbj10aGlzLml0ZW1zO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdLmNvbXBvbmVudEluc3RhbmNlO2lmKHImJnIuaXRlbUlkPT09dGhpcy5jdXJyZW50SXRlbUlkKXtlPXQ7YnJlYWt9fWU8MCYmKGU9TWF0aC5yb3VuZCh0aGlzLmN1cnJlbnQpfHwwKSxlPWU8MD8wOmUsdGhpcy5jdXJyZW50U3luYyE9PWUmJih0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2U9IiIsdGhpcy5jdXJyZW50U3luYz1lKX0sX2dldFdIOmZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9nZXRDb21wb25lbnRTaXplKHRoaXMuJHJlZnMuZWwpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0O2UudG9wLGUubGVmdDtyLl93aWR0aD10LHIuX2hlaWdodD1ufSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0LmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXSx0aGlzLl93aWR0aD10aGlzLmhlaWdodD0wfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9jdXJyZW50Q2hlY2soKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fZ2V0V0goKX0sMTAwKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdOyhBcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP2RlZXBDbG9uZSh0aGlzLiRzbG90cy5kZWZhdWx0LGUpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50T3B0aW9ucyYmInN3aXBlci1pdGVtIj09PWUuY29tcG9uZW50T3B0aW9ucy50YWcmJnQucHVzaChlKX0pLHRoaXMuaXRlbXM9dDt2YXIgbj17fSxyPXRoaXMuJGxpc3RlbmVycztyZXR1cm4oci5jaGFuZ2V8fHIuYW5pbWF0aW9uZmluaXNofHxyLnRyYW5zaXRpb24pJiYobi5zY3JvbGw9dGhpcy5vblNjcm9sbCxuLnNjcm9sbGVuZD10aGlzLm9uU2Nyb2xsRW5kKSxyLmNoYW5nZSYmKG4uY2hhbmdlPXRoaXMub25DaGFuZ2UpLGUoImRpdiIsdGhpcy5fZyh7cmVmOiJlbCIsc3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyIl19LHIpLFtlKCJzbGlkZXIiLHtzdGF0aWNDbGFzczpbInVuaS1zd2lwZXItc2xpZGVyIl0sYXR0cnM6e2F1dG9QbGF5OnRoaXMuYXV0b3BsYXksaW50ZXJ2YWw6dGhpcy5pbnRlcnZhbCxpbmRleDp0aGlzLmN1cnJlbnRTeW5jLGtlZXBJbmRleDohMCxzaG93SW5kaWNhdG9yczp0aGlzLmluZGljYXRvckRvdHMsaW5maW5pdGU6dGhpcy5jaXJjdWxhcix2ZXJ0aWNhbDp0aGlzLnZlcnRpY2FsLHNjcm9sbGFibGU6IXRoaXMuZGlzYWJsZVRvdWNofSxvbjpufSx0LmNvbmNhdChbZSgiaW5kaWNhdG9yIix7c3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyLWRvdHMiXSxzdHlsZTp7aXRlbUNvbG9yOnRoaXMuaW5kaWNhdG9yQ29sb3IsaXRlbVNlbGVjdGVkQ29sb3I6dGhpcy5pbmRpY2F0b3JBY3RpdmVDb2xvcixpdGVtU2l6ZTo4LG9wYWNpdHk6dGhpcy5pbmRpY2F0b3JEb3RzPzE6MH19KV0pLDIpXSl9LHN0eWxlOnsidW5pLXN3aXBlciI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OiIxNTBweCJ9LCJ1bmktc3dpcGVyLXNsaWRlciI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9LCJ1bmktc3dpcGVyLWRvdHMiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLGJvdHRvbToiMTAiLGhlaWdodDoiMTAifX19fWZ1bmN0aW9uIGluaXQkMjAoZSx0KXtlLmNvbXBvbmVudCgic3dpcGVyIixnZXRTd2lwZXIodCkpfWZ1bmN0aW9uIGdldFN3aXRjaChlKXtyZXR1cm57bmFtZToiU3dpdGNoIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoic3dpdGNoIn0sY2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntzd2l0Y2hDaGVja2VkOnRoaXMuY2hlY2tlZH19LHdhdGNoOntjaGVja2VkOmZ1bmN0aW9uKGUpe3RoaXMuc3dpdGNoQ2hlY2tlZD1lfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlLHQpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLnN3aXRjaENoZWNrZWQ9ZS5kZXRhaWw/ZS5kZXRhaWwudmFsdWU6IXRoaXMuc3dpdGNoQ2hlY2tlZCx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0aGlzLnN3aXRjaENoZWNrZWR9KSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zd2l0Y2hDaGVja2VkPSExfSxfZ2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4iIiE9PXRoaXMubmFtZSYmKGUudmFsdWU9dGhpcy5zd2l0Y2hDaGVja2VkLGUua2V5PXRoaXMubmFtZSksZX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kbGlzdGVuZXJzO3JldHVybiBlKCJkaXYiLHQuX2coe3N0eWxlOntwYWRkaW5nUmlnaHQ6NX19LG4pLFsic3dpdGNoIj09PXQudHlwZT9lKCJkYy1zd2l0Y2giLHthdHRyczp7ZGF0YVVuY1R5cGU6InVuaS1zd2l0Y2giLGNvbG9yOnQuY29sb3IsY2hlY2tlZDp0LnN3aXRjaENoZWNrZWQsZGlzYWJsZWQ6dC5kaXNhYmxlZH0sc3R5bGU6e3dpZHRoOjUyLGhlaWdodDozMn0sb246e2NoYW5nZTp0Ll9vbkNsaWNrfX0pOnQuX2UoKSwiY2hlY2tib3giPT09dC50eXBlP2UoImNoZWNrYm94Iix7YXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktc3dpdGNoIixjaGVja2VkOnQuc3dpdGNoQ2hlY2tlZCxkaXNhYmxlZDp0LmRpc2FibGVkfSxzdHlsZTp7Y29sb3I6dC5jb2xvcn0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSk6dC5fZSgpXSwxKX0sbGlzdGVuZXJzOnsibGFiZWwtY2xpY2siOiJfb25DbGljayIsIkBsYWJlbC1jbGljayI6Il9vbkNsaWNrIn19fWZ1bmN0aW9uIGluaXQkMjEoZSx0KXtlLmNvbXBvbmVudCgic3dpdGNoIixnZXRTd2l0Y2godCkpfWZ1bmN0aW9uIGdldFNsaWRlcihlKXtyZXR1cm57bmFtZToiVVNsaWRlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMDB9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHN0ZXA6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LGJsb2NrQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNmZmZmZmYifSxibG9ja1NpemU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mjh9LHNob3dWYWx1ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3NsaWRlcldpZHRoOjAsc2xpZGVyVmFsdWU6TnVtYmVyKHRoaXMudmFsdWUpfX0sY29tcHV0ZWQ6e3NsaWRlclRodW1iT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE51bWJlcih0aGlzLmJsb2NrU2l6ZSkvMn0sdHJhY2tUYXBTdHlsZTpmdW5jdGlvbigpe3JldHVybntwYWRkaW5nVG9wOnRoaXMuc2xpZGVyVGh1bWJPZmZzZXQscGFkZGluZ0JvdHRvbTp0aGlzLnNsaWRlclRodW1iT2Zmc2V0fX0sdHJhY2tTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QmdDb2xvcigpLG1hcmdpbkxlZnQ6dGhpcy5zbGlkZXJUaHVtYk9mZnNldCxtYXJnaW5SaWdodDp0aGlzLnNsaWRlclRodW1iT2Zmc2V0fX0sdHJhY2tBY3RpdmVTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QWN0aXZlQ29sb3IoKSx3aWR0aDp0aGlzLnRodW1iVmFsdWUrInB4In19LHRodW1iU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6dGhpcy5ibG9ja1NpemUrInB4IixoZWlnaHQ6dGhpcy5ibG9ja1NpemUrInB4IixsZWZ0OnRoaXMudGh1bWJWYWx1ZSsicHgiLGJhY2tncm91bmRDb2xvcjp0aGlzLmJsb2NrQ29sb3J9fSx0aHVtYlZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuc2xpZGVyVmFsdWUtTnVtYmVyKHRoaXMubWluKSkvKE51bWJlcih0aGlzLm1heCktTnVtYmVyKHRoaXMubWluKSkqdGhpcy5zbGlkZXJXaWR0aH19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnNsaWRlclZhbHVlPU51bWJlcihlKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3gwPTAsdGhpcy5feDE9MCx0aGlzLiRldmVudE9sZD1udWxsLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QodC4kcmVmc1sic2xpZGVyLXRyYWNrIl0sZnVuY3Rpb24oZSl7dC5zbGlkZXJXaWR0aD1lLnNpemUud2lkdGh9KX0sNTApfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSl9LG1ldGhvZHM6e19oYW5kbGVTdGFydDpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJiF0aGlzLl8kZXZlbnRPbGQpe3ZhciB0PSh0aGlzLl8kZXZlbnRPbGQ9ZSkuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg7dGhpcy5feDA9dGhpcy5feDE9dCx0aGlzLl9vblRyYWNrKCJzdGFydCIsdCl9fSxfaGFuZGxlTW92ZTpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJnRoaXMuXyRldmVudE9sZCl7dmFyIHQ9ZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDt0aGlzLl9vblRyYWNrKCJtb3ZlIix0KSx0aGlzLl94MT10fX0sX2hhbmRsZUVuZDpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJnRoaXMuXyRldmVudE9sZCl7dmFyIHQ9ZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDt0aGlzLl8kZXZlbnRPbGQ9bnVsbCx0aGlzLl9vblRyYWNrKCJlbmQiLHQpfX0sX29uVHJhY2s6ZnVuY3Rpb24oZSx0KXt0aGlzLmRpc2FibGVkfHwoIm1vdmUiPT09ZT8odGhpcy5fb25Vc2VyQ2hhbmdlZFZhbHVlKHt4OnR9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2luZyIse3ZhbHVlOnRoaXMuc2xpZGVyVmFsdWV9KSk6ImVuZCI9PT1lJiYodGhpcy5fb25Vc2VyQ2hhbmdlZFZhbHVlKHt4OnR9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0aGlzLnNsaWRlclZhbHVlfSkpKX0sX29uVXNlckNoYW5nZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLngtdGhpcy5ibG9ja1NpemUvMjt0PDAmJih0PTApLHQ+dGhpcy5zbGlkZXJXaWR0aCYmKHQ9dGhpcy5zbGlkZXJXaWR0aCk7dmFyIG49TnVtYmVyKHRoaXMubWluKSxyPU51bWJlcih0aGlzLm1heCksaT1OdW1iZXIodGhpcy5zdGVwKSxvPXQvdGhpcy5zbGlkZXJXaWR0aCooci1uKTswPGkmJmk8byYmbyVpL2khPTAmJihvLT1vJWkpLHRoaXMuc2xpZGVyVmFsdWU9cGFyc2VJbnQobytuKX0sX2dldEJnQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iI2U5ZTllOSIhPT10aGlzLmJhY2tncm91bmRDb2xvcj90aGlzLmJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiIhPT10aGlzLmNvbG9yP3RoaXMuY29sb3I6IiMwMDdhZmYifSxfZ2V0QWN0aXZlQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iIzAwN2FmZiIhPT10aGlzLmFjdGl2ZUNvbG9yP3RoaXMuYWN0aXZlQ29sb3I6IiNlOWU5ZTkiIT09dGhpcy5zZWxlY3RlZENvbG9yP3RoaXMuc2VsZWN0ZWRDb2xvcjoiI2U5ZTllOSJ9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zbGlkZXJWYWx1ZT10aGlzLm1pbn0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIiIhPT10aGlzLm5hbWUmJihlLnZhbHVlPXRoaXMuc2xpZGVyVmFsdWUsZS5rZXk9dGhpcy5uYW1lKSxlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyIl19LHQuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXNsaWRlci13cmFwcGVyIl19LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdGFwLWFyZWEiXSxvbjp7dG91Y2hzdGFydDp0Ll9oYW5kbGVTdGFydCx0b3VjaG1vdmU6dC5faGFuZGxlTW92ZSx0b3VjaGVuZDp0Ll9oYW5kbGVFbmR9LHN0eWxlOnQudHJhY2tUYXBTdHlsZX0sW2UoImRpdiIse3JlZjoic2xpZGVyLXRyYWNrIixzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItaGFuZGxlLXdyYXBwZXIiXSxzdHlsZTp0LnRyYWNrU3R5bGV9LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdHJhY2siXSxzdHlsZTp0LnRyYWNrQWN0aXZlU3R5bGV9KV0pLGUoImRpdiIse3JlZjoidW5pLXNsaWRlci1oYW5kbGUiLHN0YXRpY0NsYXNzOlsidW5pLXNsaWRlci10aHVtYiJdLHN0eWxlOnQudGh1bWJTdHlsZX0pXSksdC5zaG93VmFsdWU/ZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyLXZhbHVlIl19LFt0Ll92KHQuX3ModC5zbGlkZXJWYWx1ZSkpXSk6dC5fZSgpXSldKX0sc3R5bGU6eyJ1bmktc2xpZGVyIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246ImNvbHVtbiJ9LCJ1bmktc2xpZGVyLXdyYXBwZXIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9LCJ1bmktc2xpZGVyLXRhcC1hcmVhIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIiLHBhZGRpbmdUb3A6IjE0IixwYWRkaW5nQm90dG9tOiIxNCJ9LCJ1bmktc2xpZGVyLWhhbmRsZS13cmFwcGVyIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsaGVpZ2h0OiIyIixtYXJnaW5SaWdodDoiMTQiLG1hcmdpbkxlZnQ6IjE0Iixib3JkZXJSYWRpdXM6IjUiLGJhY2tncm91bmRDb2xvcjoiI2U5ZTllOSJ9LCJ1bmktc2xpZGVyLXRyYWNrIjp7aGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjYiLGJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiJ9LCJ1bmktc2xpZGVyLXRodW1iIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjEiLHdpZHRoOiIyOCIsaGVpZ2h0OiIyOCIsYm9yZGVyUmFkaXVzOjUwLGJveFNoYWRvdzoiMCAwIDRweCAjZWJlYmViIn0sInVuaS1zbGlkZXItdmFsdWUiOntjb2xvcjoiIzg4ODg4OCIsZm9udFNpemU6IjE2Iix3aWR0aDoiMzAifX19fWZ1bmN0aW9uIGluaXQkMjIoZSx0KXtlLmNvbXBvbmVudCgidS1zbGlkZXIiLGdldFNsaWRlcih0KSl9ZnVuY3Rpb24gZ2V0UGlja2VyVmlldyhlKXtyZXR1cm57bmFtZToiUGlja2VyVmlldyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOnt2YWx1ZTp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119LHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKSYmZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfSkubGVuZ3RoPT09ZS5sZW5ndGh9fSxoZWlnaHQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0saW5kaWNhdG9yU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1hc2tUb3BTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza0JvdHRvbVN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnttYXNrVG9wU3R5bGVTeW5jOnRoaXMuZ2V0U3R5bGUodGhpcy5tYXNrVG9wU3R5bGUpLG1hc2tCb3R0b21TdHlsZVN5bmM6dGhpcy5nZXRTdHlsZSh0aGlzLm1hc2tCb3R0b21TdHlsZSksaW5kaWNhdG9yU3R5bGVTeW5jOnRoaXMuZ2V0U3R5bGUodGhpcy5pbmRpY2F0b3JTdHlsZSksdmFsdWVTeW5jOltdLmNvbmNhdCh0aGlzLnZhbHVlKX19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbihlKXt2YXIgbj10aGlzO3RoaXMudmFsdWVTeW5jLmxlbmd0aD1lLmxlbmd0aCxlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlIT09bi52YWx1ZVN5bmNbdF0mJihuLnZhbHVlU3luY1t0XT1lLG4uaXRlbXNbdF0uY29tcG9uZW50SW5zdGFuY2Uuc2V0Q3VycmVudChlKSl9KX0sbWFza1RvcFN0eWxlOmZ1bmN0aW9uKGUpe3RoaXMubWFza1RvcFN0eWxlU3luYz10aGlzLmdldFN0eWxlKGUpfSxtYXNrQm90dG9tU3R5bGU6ZnVuY3Rpb24oZSl7dGhpcy5tYXNrQm90dG9tU3R5bGVTeW5jPXRoaXMuZ2V0U3R5bGUoZSl9LGluZGljYXRvclN0eWxlOmZ1bmN0aW9uKGUpe3RoaXMuaW5kaWNhdG9yU3R5bGVTeW5jPXRoaXMuZ2V0U3R5bGUoZSl9fSxtZXRob2RzOntnZXRTdHlsZTpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwic3RyaW5nIj09dHlwZW9mIGU/cGFyc2VTdHlsZVRleHQoZSk6ZSl9LGdldEl0ZW1JbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pdGVtcy5pbmRleE9mKGUpfSxnZXRJdGVtVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudmFsdWVTeW5jW3RoaXMuZ2V0SXRlbUluZGV4KGUuJHZub2RlKV18fDB9LHNldEl0ZW1WYWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0SXRlbUluZGV4KGUuJHZub2RlKTt0aGlzLnZhbHVlU3luY1tuXT10O3ZhciByPVtdLmNvbmNhdCh0aGlzLnZhbHVlU3luYyk7dGhpcy4kZW1pdCgidXBkYXRlOnZhbHVlIixyKSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTpyfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybihBcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP2RlZXBDbG9uZSh0aGlzLiRzbG90cy5kZWZhdWx0LGUpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50T3B0aW9ucyYmInBpY2tlci12aWV3LWNvbHVtbiI9PT1lLmNvbXBvbmVudE9wdGlvbnMudGFnJiZ0LnB1c2goZSl9KSx0aGlzLml0ZW1zPXQsZSgiZGl2Iix0aGlzLl9nKHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldyJdLGF0dHJzOntwcmV2ZW50R2VzdHVyZTohMH19LHRoaXMuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LXdyYXBwZXIiXX0sdCldLDIpfSxzdHlsZTp7InVuaS1waWNrZXItdmlldyI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9LCJ1bmktcGlja2VyLXZpZXctd3JhcHBlciI6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246InJvdyIscG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxvdmVyZmxvdzoiaGlkZGVuIn19fX1mdW5jdGlvbiBpbml0JDIzKGUsdCl7ZS5jb21wb25lbnQoInBpY2tlci12aWV3IixnZXRQaWNrZXJWaWV3KHQpKX1mdW5jdGlvbiBnZXRIZWlnaHQoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PShlLmhlaWdodHx8ZS5saW5lSGVpZ2h0fHwiIikubWF0Y2goLygtP1tcZFwuXSspcHgvKSxuPTA7cmV0dXJuIHQmJihuPXBhcnNlRmxvYXQodFsxXSkpLG59ZnVuY3Rpb24gZ2V0UGlja2VyVmlld0NvbHVtbihlKXt2YXIgcj1lLnJlcXVpcmVNb2R1bGUoImRvbSIpLG89ImFuZHJvaWQiPT09ZS5jb25maWcuZW52LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7cmV0dXJue25hbWU6IlBpY2tlclZpZXdDb2x1bW4iLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e2xlbmd0aDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntpbmRpY2F0b3JIZWlnaHQ6Z2V0SGVpZ2h0KHRoaXMuJHBhcmVudC5pbmRpY2F0b3JTdHlsZVN5bmMpLGhlaWdodDpwYXJzZUZsb2F0KHRoaXMuJHBhcmVudC5oZWlnaHQpLGN1cnJlbnQ6dGhpcy4kcGFyZW50LmdldEl0ZW1WYWx1ZSh0aGlzKX19LHdhdGNoOntjdXJyZW50OmZ1bmN0aW9uKGUpe3RoaXMuX2lzTW91bnRlZCYmdGhpcy4kcGFyZW50LnNldEl0ZW1WYWx1ZSh0aGlzLGUpfSxsZW5ndGg6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnNldEN1cnJlbnQoZS5jdXJyZW50LCEwLCEwKX0sMTUwKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNoZWNrTW91bnRlZCgpfSxtZXRob2RzOntjaGVja01vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgbixyLGk9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7UHJvbWlzZS5hbGwoW2kuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLmhlaWdodDtuPWkuaGVpZ2h0PXR9KSxvJiZpLmxlbmd0aD9pLl9nZXRDb21wb25lbnRTaXplKGkuJHJlZnMuaXRlbSkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLmhlaWdodDtyPWkuaW5kaWNhdG9ySGVpZ2h0PXQvaS5sZW5ndGh9KTppLl9nZXRDb21wb25lbnRTaXplKGkuJHJlZnMuaW5kaWNhdG9yKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O3I9aS5pbmRpY2F0b3JIZWlnaHQ9dH0pXSkudGhlbihmdW5jdGlvbigpe24mJnI/c2V0VGltZW91dChmdW5jdGlvbigpe2kuc2V0Q3VycmVudChpLmN1cnJlbnQsITEsITApLGkuX2lzTW91bnRlZD0hMH0sNTApOmkuY2hlY2tNb3VudGVkKCl9KX0sNTApfSxvblNjcm9sbGVuZDpmdW5jdGlvbihlKXtpZighKERhdGUubm93KCktdGhpcy5zY3JvbGxUb0VsZW1lbnRUaW1lPDM0MCkpe3ZhciB0PWUuZGV0YWlsLmNvbnRlbnRPZmZzZXQueSxuPU1hdGgucm91bmQodC90aGlzLmluZGljYXRvckhlaWdodCk7dCV0aGlzLmluZGljYXRvckhlaWdodD90aGlzLnNldEN1cnJlbnQobiwhMCwhMCk6dGhpcy5jdXJyZW50PW59fSxzZXRDdXJyZW50OmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT10JiYodD0hMCksKHRoaXMuY3VycmVudCE9PWV8fG4pJiYoci5zY3JvbGxUb0VsZW1lbnQodGhpcy4kcmVmcy5jb250ZW50LHtvZmZzZXQ6ZSp0aGlzLmluZGljYXRvckhlaWdodCxhbmltYXRlZDp0fSksdGhpcy5jdXJyZW50PWUsdCYmKHRoaXMuc2Nyb2xsVG9FbGVtZW50VGltZT1EYXRlLm5vdygpKSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXtyLmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kc2xvdHMuZGVmYXVsdCxuPSh0aGlzLmhlaWdodC10aGlzLmluZGljYXRvckhlaWdodCkvMixyPXRoaXMuaGVpZ2h0LW4rInB4IjtuKz0icHgiO3ZhciBpPXtzaG93U2Nyb2xsYmFyOiExLHNjcm9sbFRvQmVnaW46ITEsZGVjZWxlcmF0aW9uUmF0ZTouMyxzY3JvbGxZOiEwfTtyZXR1cm4gb3x8KGkuc2Nyb2xsVG9wPXRoaXMuY3VycmVudCp0aGlzLmluZGljYXRvckhlaWdodCksZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1jb2x1bW4iXX0sdGhpcy4kbGlzdGVuZXJzKSxbZSgic2Nyb2xsLXZpZXciLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1ncm91cCJdLGF0dHJzOmksb246e3Njcm9sbGVuZDp0aGlzLm9uU2Nyb2xsZW5kfSxzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIn19LFtlKCJkaXYiLHtyZWY6ImNvbnRlbnQiLHN0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiXSxzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIixwYWRkaW5nVG9wOm4scGFkZGluZ0JvdHRvbTpufX0sbz9bZSgiZGl2Iix7cmVmOiJpdGVtIixzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIn19LHQpXTp0KV0pLGUoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIl19LFtlKCJ1LXNjYWxhYmxlIix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctbWFzayIsInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCJdLHN0eWxlOk9iamVjdC5hc3NpZ24oe30sdGhpcy4kcGFyZW50Lm1hc2tUb3BTdHlsZVN5bmMse2JvdHRvbTpyfSl9KSxlKCJ1LXNjYWxhYmxlIix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctbWFzayIsInVuaS1waWNrZXItdmlldy1tYXNrLWJvdHRvbSJdLHN0eWxlOk9iamVjdC5hc3NpZ24oe30sdGhpcy4kcGFyZW50Lm1hc2tCb3R0b21TdHlsZVN5bmMse3RvcDpyfSl9KV0pLGUoInUtc2NhbGFibGUiLHtyZWY6ImluZGljYXRvciIsc3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIl0sc3R5bGU6T2JqZWN0LmFzc2lnbih7fSx0aGlzLiRwYXJlbnQuaW5kaWNhdG9yU3R5bGVTeW5jLHt0b3A6bn0pfSldLDIpfSxzdHlsZTp7InVuaS1waWNrZXItdmlldy1jb2x1bW4iOntmbGV4OjEscG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJzdHJldGNoIixvdmVyZmxvdzoiaGlkZGVuIn0sInVuaS1waWNrZXItdmlldy1tYXNrIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxwb2ludGVyRXZlbnRzOiJub25lIn0sInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCI6e2JvdHRvbTowLGJhY2tncm91bmRJbWFnZToibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkifSwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIjp7dG9wOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gdG9wLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9LCJ1bmktcGlja2VyLXZpZXctZ3JvdXAiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowfSwidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiOntwYWRkaW5nVG9wOjAscGFkZGluZ1JpZ2h0OjAscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OjB9LCJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCx0b3A6MCxoZWlnaHQ6IjM0cHgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGJvcmRlckNvbG9yOiIjZTVlNWU1Iixib3JkZXJUb3BXaWR0aDoiMXB4Iixib3JkZXJCb3R0b21XaWR0aDoiMXB4In19fX1mdW5jdGlvbiBpbml0JDI0KGUsdCl7ZS5jb21wb25lbnQoInBpY2tlci12aWV3LWNvbHVtbiIsZ2V0UGlja2VyVmlld0NvbHVtbih0KSl9dmFyIGluaXRDb21wb25lbnRzPVtpbml0JDMsaW5pdCQ0LGluaXQkNSxpbml0JDYsaW5pdCQ3LGluaXQkOCxpbml0JDksaW5pdCQxMCxpbml0JDExLGluaXQkMTIsaW5pdCQxMyxpbml0JDE0LGluaXQkMTUsaW5pdCQxNixpbml0JDE3LGluaXQkMTgsaW5pdCQxOSxpbml0JDIwLGluaXQkMjEsaW5pdCQyMixpbml0JDIzLGluaXQkMjRdLHVuaUFwcD17aW5zdGFsbDpmdW5jdGlvbihvLGEpe28uY29uZmlnLmVycm9ySGFuZGxlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dG9SYXdUeXBlKGUpO28udXRpbC53YXJuKCJFcnJvciBpbiAiK24rJzogIicrKCJFcnJvciI9PT1yP2UudG9TdHJpbmcoKTplKSsnIicsdCk7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QXBwJiZhLmdldEFwcCgpO2kmJmhhc0xpZmVjeWNsZUhvb2soaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9LG8ucHJvdG90eXBlLl8kYnVzPW5ldyBvLG8ucHJvdG90eXBlLmdldE9wZW5lckV2ZW50Q2hhbm5lbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx8fCh0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWw9bmV3IGEuRXZlbnRDaGFubmVsKSx0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJHBhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy4kc2NvcGUmJnRoaXMuJHJvb3QmJnRoaXMuJHJvb3QuJHNjb3BlJiYodGhpcy4kc2NvcGU9dGhpcy4kcm9vdC4kc2NvcGUpLHRoaXMuJHNjb3BlLiRwYWdlfX0pLHN0eWxlTWl4aW4obyksdW5pSWRNaXhpbihvLGEpLGxpZmVjeWNsZU1peGluKG8sYS53ZWV4LGEpLCJ3ZWV4IiE9PWEuX191bmlDb25maWcubnZ1ZUNvbXBpbGVyJiZpbml0Q29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UobyxhLndlZXgsYSl9KX19O2Z1bmN0aW9uIHZ1ZUZhY3RvcnkoZSx0KXt2YXIgbT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBFKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gQShlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gYyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIHkoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB1KGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiAwPD10JiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gSShlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHx1KGUpJiZlLnRvU3RyaW5nPT09cj9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19cygic2xvdCxjb21wb25lbnQiLCEwKTt2YXIgbD1zKCJrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcyIpO2Z1bmN0aW9uIGIoZSx0KXtpZihlLmxlbmd0aCl7dmFyIG49ZS5pbmRleE9mKHQpO2lmKC0xPG4pcmV0dXJuIGUuc3BsaWNlKG4sMSl9fXZhciBhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZChlLHQpe3JldHVybiBhLmNhbGwoZSx0KX1mdW5jdGlvbiBmKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfHwobltlXT10KGUpKX19dmFyIHA9Ly0oXHcpL2csaD1mKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UocCxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKToiIn0pfSksdj1mKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9KSxnPS9cQihbQS1aXSkvZyx3PWYoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShnLCItJDEiKS50b0xvd2VyQ2FzZSgpfSk7dmFyIGs9RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5iaW5kKHQpfTpmdW5jdGlvbihuLHIpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gdD8xPHQ/bi5hcHBseShyLGFyZ3VtZW50cyk6bi5jYWxsKHIsZSk6bi5jYWxsKHIpfXJldHVybiBlLl9sZW5ndGg9bi5sZW5ndGgsZX07ZnVuY3Rpb24gUyhlLHQpe3Q9dHx8MDtmb3IodmFyIG49ZS5sZW5ndGgtdCxyPW5ldyBBcnJheShuKTtuLS07KXJbbl09ZVtuK3RdO3JldHVybiByfWZ1bmN0aW9uIHgoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gQyhlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKWVbbl0mJngodCxlW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBUKGUsdCxuKXt9dmFyIE89ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSwkPWZ1bmN0aW9uKGUpe3JldHVybiBlfTtmdW5jdGlvbiBQKHQsbil7aWYodD09PW4pcmV0dXJuITA7dmFyIGU9eSh0KSxyPXkobik7aWYoIWV8fCFyKXJldHVybiFlJiYhciYmU3RyaW5nKHQpPT09U3RyaW5nKG4pO3RyeXt2YXIgaT1BcnJheS5pc0FycmF5KHQpLG89QXJyYXkuaXNBcnJheShuKTtpZihpJiZvKXJldHVybiB0Lmxlbmd0aD09PW4ubGVuZ3RoJiZ0LmV2ZXJ5KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFAoZSxuW3RdKX0pO2lmKHQgaW5zdGFuY2VvZiBEYXRlJiZuIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gdC5nZXRUaW1lKCk9PT1uLmdldFRpbWUoKTtpZihpfHxvKXJldHVybiExO3ZhciBhPU9iamVjdC5rZXlzKHQpLHM9T2JqZWN0LmtleXMobik7cmV0dXJuIGEubGVuZ3RoPT09cy5sZW5ndGgmJmEuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIFAodFtlXSxuW2VdKX0pfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBNKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoUChlW25dLHQpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIGooZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX12YXIgTj0iZGF0YS1zZXJ2ZXItcmVuZGVyZWQiLEI9WyJjb21wb25lbnQiLCJkaXJlY3RpdmUiLCJmaWx0ZXIiXSxMPVsiYmVmb3JlQ3JlYXRlIiwiY3JlYXRlZCIsImJlZm9yZU1vdW50IiwibW91bnRlZCIsImJlZm9yZVVwZGF0ZSIsInVwZGF0ZWQiLCJiZWZvcmVEZXN0cm95IiwiZGVzdHJveWVkIiwiYWN0aXZhdGVkIiwiZGVhY3RpdmF0ZWQiLCJlcnJvckNhcHR1cmVkIiwic2VydmVyUHJlZmV0Y2giXSxEPXtvcHRpb25NZXJnZVN0cmF0ZWdpZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxzaWxlbnQ6ITEscHJvZHVjdGlvblRpcDohMSxkZXZ0b29sczohMSxwZXJmb3JtYW5jZTohMSxlcnJvckhhbmRsZXI6bnVsbCx3YXJuSGFuZGxlcjpudWxsLGlnbm9yZWRFbGVtZW50czpbXSxrZXlDb2RlczpPYmplY3QuY3JlYXRlKG51bGwpLGlzUmVzZXJ2ZWRUYWc6Tyxpc1Jlc2VydmVkQXR0cjpPLGlzVW5rbm93bkVsZW1lbnQ6TyxnZXRUYWdOYW1lc3BhY2U6VCxwYXJzZVBsYXRmb3JtVGFnTmFtZTokLG11c3RVc2VQcm9wOk8sYXN5bmM6ITAsX2xpZmVjeWNsZUhvb2tzOkx9O2Z1bmN0aW9uIFIoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgRj1uZXcgUmVnRXhwKCJbXiIrL2EtekEtWlx1MDBCN1x1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDNGLVx1MjA0MFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZELy5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgVSx6PSJfX3Byb3RvX18iaW57fSxWPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LHE9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sVz1xJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSD1WJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLEc9SCYmL21zaWV8dHJpZGVudC8udGVzdChIKSxKPShIJiZILmluZGV4T2YoIm1zaWUgOS4wIiksSCYmMDxILmluZGV4T2YoImVkZ2UvIikpLFg9KEgmJkguaW5kZXhPZigiYW5kcm9pZCIpLEgmJi9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChIKSxIJiYvY2hyb21lXC9cZCsvLnRlc3QoSCksSCYmL3BoYW50b21qcy8udGVzdChIKSxIJiZILm1hdGNoKC9maXJlZm94XC8oXGQrKS8pLHt9LndhdGNoKTtpZihWKXRyeXt2YXIgWT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe319KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLFkpfWNhdGNoKGUpe312YXIgSz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1VJiYoVT0hViYmIXEmJnZvaWQgMCE9PWdsb2JhbCYmKGdsb2JhbC5wcm9jZXNzJiYic2VydmVyIj09PWdsb2JhbC5wcm9jZXNzLmVudi5WVUVfRU5WKSksVX0sWj1WJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztmdW5jdGlvbiBRKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgZWUsdGU9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlEoU3ltYm9sKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZRKFJlZmxlY3Qub3duS2V5cyk7ZWU9InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJlEoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBuZT1ULHJlPTAsaWU9ZnVuY3Rpb24oKXt0aGlzLmlkPXZvaWQgMCE9PXQ/dC51aWQrKzpyZSsrLHRoaXMuc3Vicz1bXX07ZnVuY3Rpb24gb2UoZSl7aWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLnB1c2goZSksaWUuU2hhcmVkT2JqZWN0LnRhcmdldD1lfWZ1bmN0aW9uIGFlKCl7aWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLnBvcCgpLGllLlNoYXJlZE9iamVjdC50YXJnZXQ9aWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrW2llLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5sZW5ndGgtMV19aWUucHJvdG90eXBlLmFkZFN1Yj1mdW5jdGlvbihlKXt0aGlzLnN1YnMucHVzaChlKX0saWUucHJvdG90eXBlLnJlbW92ZVN1Yj1mdW5jdGlvbihlKXtiKHRoaXMuc3VicyxlKX0saWUucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2llLlNoYXJlZE9iamVjdC50YXJnZXQmJmllLlNoYXJlZE9iamVjdC50YXJnZXQuYWRkRGVwKHRoaXMpfSxpZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuc3Vicy5zbGljZSgpLHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0saWUuU2hhcmVkT2JqZWN0PXZvaWQgMCE9PXQ/dDp7fSxpZS5TaGFyZWRPYmplY3QudGFyZ2V0PW51bGwsaWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrPVtdO3ZhciBzZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sY2U9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtjZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc2UucHJvdG90eXBlLGNlKTt2YXIgdWU9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBzZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIG5ldyBzZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIGRlKGUpe3ZhciB0PW5ldyBzZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIGZlPUFycmF5LnByb3RvdHlwZSxwZT1PYmplY3QuY3JlYXRlKGZlKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIHM9ZmVbYV07UihwZSxhLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcixpPXMuYXBwbHkodGhpcyx0KSxvPXRoaXMuX19vYl9fO3N3aXRjaChhKXtjYXNlInB1c2giOmNhc2UidW5zaGlmdCI6cj10O2JyZWFrO2Nhc2Uic3BsaWNlIjpyPXQuc2xpY2UoMil9cmV0dXJuIHImJm8ub2JzZXJ2ZUFycmF5KHIpLG8uZGVwLm5vdGlmeSgpLGl9KX0pO3ZhciBoZT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwZSksdmU9ITA7ZnVuY3Rpb24gZ2UoZSl7dmU9ZX12YXIgbWU9ZnVuY3Rpb24oZSl7dmFyIHQ7dGhpcy52YWx1ZT1lLHRoaXMuZGVwPW5ldyBpZSx0aGlzLnZtQ291bnQ9MCxSKGUsIl9fb2JfXyIsdGhpcyksQXJyYXkuaXNBcnJheShlKT8oej8odD1wZSxlLl9fcHJvdG9fXz10KTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO1IoZSxvLHRbb10pfX0oZSxwZSxoZSksdGhpcy5vYnNlcnZlQXJyYXkoZSkpOnRoaXMud2FsayhlKX07ZnVuY3Rpb24geWUoZSx0KXt2YXIgbjtpZih5KGUpJiYhKGUgaW5zdGFuY2VvZiBzZSkpcmV0dXJuIGQoZSwiX19vYl9fIikmJmUuX19vYl9fIGluc3RhbmNlb2YgbWU/bj1lLl9fb2JfXzp2ZSYmIUsoKSYmKEFycmF5LmlzQXJyYXkoZSl8fHUoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyBtZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiBfZShuLGUscix0LGkpe3ZhciBvPW5ldyBpZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChyPW5bZV0pO3ZhciB1PSFpJiZ5ZShyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1zP3MuY2FsbChuKTpyO3JldHVybiBpZS5TaGFyZWRPYmplY3QudGFyZ2V0JiYoby5kZXBlbmQoKSx1JiYodS5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheShlKSYmZnVuY3Rpb24gZSh0KXtmb3IodmFyIG49dm9pZCAwLHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspKG49dFtyXSkmJm4uX19vYl9fJiZuLl9fb2JfXy5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheShuKSYmZShuKX0oZSkpKSxlfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9cz9zLmNhbGwobik6cjtlPT09dHx8ZSE9ZSYmdCE9dHx8cyYmIWN8fChjP2MuY2FsbChuLGUpOnI9ZSx1PSFpJiZ5ZShlKSxvLm5vdGlmeSgpKX19KX19ZnVuY3Rpb24gYmUoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkmJmkodCkpcmV0dXJuIGUubGVuZ3RoPU1hdGgubWF4KGUubGVuZ3RoLHQpLGUuc3BsaWNlKHQsMSxuKSxuO2lmKHQgaW4gZSYmISh0IGluIE9iamVjdC5wcm90b3R5cGUpKXJldHVybiBlW3RdPW47dmFyIHI9ZS5fX29iX187cmV0dXJuIGUuX2lzVnVlfHxyJiZyLnZtQ291bnQ/bjpyPyhfZShyLnZhbHVlLHQsbiksci5kZXAubm90aWZ5KCksbik6ZVt0XT1ufWZ1bmN0aW9uIHdlKGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSYmaSh0KSllLnNwbGljZSh0LDEpO2Vsc2V7dmFyIG49ZS5fX29iX187ZS5faXNWdWV8fG4mJm4udm1Db3VudHx8ZChlLHQpJiYoZGVsZXRlIGVbdF0sbiYmbi5kZXAubm90aWZ5KCkpfX1tZS5wcm90b3R5cGUud2Fsaz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7bisrKV9lKGUsdFtuXSl9LG1lLnByb3RvdHlwZS5vYnNlcnZlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXllKGVbdF0pfTt2YXIga2U9RC5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7ZnVuY3Rpb24gU2UoZSx0KXtpZighdClyZXR1cm4gZTtmb3IodmFyIG4scixpLG89dGU/UmVmbGVjdC5vd25LZXlzKHQpOk9iamVjdC5rZXlzKHQpLGE9MDthPG8ubGVuZ3RoO2ErKykiX19vYl9fIiE9PShuPW9bYV0pJiYocj1lW25dLGk9dFtuXSxkKGUsbik/ciE9PWkmJnUocikmJnUoaSkmJlNlKHIsaSk6YmUoZSxuLGkpKTtyZXR1cm4gZX1mdW5jdGlvbiB4ZShuLHIsaSl7cmV0dXJuIGk/ZnVuY3Rpb24oKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwoaSxpKTpyLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKGksaSk6bjtyZXR1cm4gZT9TZShlLHQpOnR9OnI/bj9mdW5jdGlvbigpe3JldHVybiBTZSgiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwodGhpcyx0aGlzKTpyLCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbCh0aGlzLHRoaXMpOm4pfTpyOm59ZnVuY3Rpb24gQ2UoZSx0KXt2YXIgbj10P2U/ZS5jb25jYXQodCk6QXJyYXkuaXNBcnJheSh0KT90Olt0XTplO3JldHVybiBuP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0obik6bn1mdW5jdGlvbiBUZShlLHQsbixyKXt2YXIgaT1PYmplY3QuY3JlYXRlKGV8fG51bGwpO3JldHVybiB0P3goaSx0KTppfWtlLmRhdGE9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP3hlKGUsdCxuKTp0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnhlKGUsdCl9LEwuZm9yRWFjaChmdW5jdGlvbihlKXtrZVtlXT1DZX0pLEIuZm9yRWFjaChmdW5jdGlvbihlKXtrZVtlKyJzIl09VGV9KSxrZS53YXRjaD1mdW5jdGlvbihlLHQsbixyKXtpZihlPT09WCYmKGU9dm9pZCAwKSx0PT09WCYmKHQ9dm9pZCAwKSwhdClyZXR1cm4gT2JqZWN0LmNyZWF0ZShlfHxudWxsKTtpZighZSlyZXR1cm4gdDt2YXIgaT17fTtmb3IodmFyIG8gaW4geChpLGUpLHQpe3ZhciBhPWlbb10scz10W29dO2EmJiFBcnJheS5pc0FycmF5KGEpJiYoYT1bYV0pLGlbb109YT9hLmNvbmNhdChzKTpBcnJheS5pc0FycmF5KHMpP3M6W3NdfXJldHVybiBpfSxrZS5wcm9wcz1rZS5tZXRob2RzPWtlLmluamVjdD1rZS5jb21wdXRlZD1mdW5jdGlvbihlLHQsbixyKXtpZighZSlyZXR1cm4gdDt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiB4KGksZSksdCYmeChpLHQpLGl9LGtlLnByb3ZpZGU9eGU7dmFyIE9lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/ZTp0fTtmdW5jdGlvbiBFZShuLHIsaSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHImJihyPXIub3B0aW9ucyksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnByb3BzO2lmKG4pe3ZhciByLGksbz17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcihyPW4ubGVuZ3RoO3ItLTspInN0cmluZyI9PXR5cGVvZihpPW5bcl0pJiYob1toKGkpXT17dHlwZTpudWxsfSk7ZWxzZSBpZih1KG4pKWZvcih2YXIgYSBpbiBuKWk9blthXSxvW2goYSldPXUoaSk/aTp7dHlwZTppfTtlLnByb3BzPW99fShyKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUuaW5qZWN0O2lmKG4pe3ZhciByPWUuaW5qZWN0PXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspcltuW2ldXT17ZnJvbTpuW2ldfTtlbHNlIGlmKHUobikpZm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107cltvXT11KGEpP3goe2Zyb206b30sYSk6e2Zyb206YX19fX0ociksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kaXJlY3RpdmVzO2lmKHQpZm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ImZ1bmN0aW9uIj09dHlwZW9mIHImJih0W25dPXtiaW5kOnIsdXBkYXRlOnJ9KX19KHIpLCFyLl9iYXNlJiYoci5leHRlbmRzJiYobj1FZShuLHIuZXh0ZW5kcyxpKSksci5taXhpbnMpKWZvcih2YXIgZT0wLHQ9ci5taXhpbnMubGVuZ3RoO2U8dDtlKyspbj1FZShuLHIubWl4aW5zW2VdLGkpO3ZhciBvLGE9e307Zm9yKG8gaW4gbilzKG8pO2ZvcihvIGluIHIpZChuLG8pfHxzKG8pO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9a2VbZV18fE9lO2FbZV09dChuW2VdLHJbZV0saSxlKX1yZXR1cm4gYX1mdW5jdGlvbiBJZShlLHQsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBpPWVbdF07aWYoZChpLG4pKXJldHVybiBpW25dO3ZhciBvPWgobik7aWYoZChpLG8pKXJldHVybiBpW29dO3ZhciBhPXYobyk7cmV0dXJuIGQoaSxhKT9pW2FdOmlbbl18fGlbb118fGlbYV19fWZ1bmN0aW9uIEFlKGUsdCxuLHIpe3ZhciBpPXRbZV0sbz0hZChuLGUpLGE9bltlXSxzPU1lKEJvb2xlYW4saS50eXBlKTtpZigtMTxzKWlmKG8mJiFkKGksImRlZmF1bHQiKSlhPSExO2Vsc2UgaWYoIiI9PT1hfHxhPT09dyhlKSl7dmFyIGM9TWUoU3RyaW5nLGkudHlwZSk7KGM8MHx8czxjKSYmKGE9ITApfWlmKHZvaWQgMD09PWEpe2E9ZnVuY3Rpb24oZSx0LG4pe2lmKCFkKHQsImRlZmF1bHQiKSlyZXR1cm47dmFyIHI9dC5kZWZhdWx0O2lmKGUmJmUuJG9wdGlvbnMucHJvcHNEYXRhJiZ2b2lkIDA9PT1lLiRvcHRpb25zLnByb3BzRGF0YVtuXSYmdm9pZCAwIT09ZS5fcHJvcHNbbl0pcmV0dXJuIGUuX3Byb3BzW25dO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByJiYiRnVuY3Rpb24iIT09JGUodC50eXBlKT9yLmNhbGwoZSk6cn0ocixpLGUpO3ZhciB1PXZlO2dlKCEwKSx5ZShhKSxnZSh1KX1yZXR1cm4gYX1mdW5jdGlvbiAkZShlKXt2YXIgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvbiAoXHcrKS8pO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gUGUoZSx0KXtyZXR1cm4gJGUoZSk9PT0kZSh0KX1mdW5jdGlvbiBNZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBQZSh0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKFBlKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gamUoZSx0LG4pe29lKCk7dHJ5e2lmKHQpZm9yKHZhciByPXQ7cj1yLiRwYXJlbnQ7KXt2YXIgaT1yLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7aWYoaSlmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl0cnl7aWYoITE9PT1pW29dLmNhbGwocixlLHQsbikpcmV0dXJufWNhdGNoKGUpe0JlKGUsciwiZXJyb3JDYXB0dXJlZCBob29rIil9fUJlKGUsdCxuKX1maW5hbGx5e2FlKCl9fWZ1bmN0aW9uIE5lKGUsdCxuLHIsaSl7dmFyIG87dHJ5eyhvPW4/ZS5hcHBseSh0LG4pOmUuY2FsbCh0KSkmJiFvLl9pc1Z1ZSYmXyhvKSYmIW8uX2hhbmRsZWQmJihvLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybiBqZShlLHIsaSsiIChQcm9taXNlL2FzeW5jKSIpfSksby5faGFuZGxlZD0hMCl9Y2F0Y2goZSl7amUoZSxyLGkpfXJldHVybiBvfWZ1bmN0aW9uIEJlKHQsZSxuKXtpZihELmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIEQuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCx0LGUsbil9Y2F0Y2goZSl7ZSE9PXQmJkxlKGUsbnVsbCwiY29uZmlnLmVycm9ySGFuZGxlciIpfUxlKHQsZSxuKX1mdW5jdGlvbiBMZShlLHQsbil7aWYoIVYmJiFxfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGUpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciBEZT1bXSxSZT0hMTtmdW5jdGlvbiBGZSgpe1JlPSExO2Zvcih2YXIgZT1EZS5zbGljZSgwKSx0PURlLmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX12YXIgVWU9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KEZlLDApfTtmdW5jdGlvbiB6ZShlLHQpe3ZhciBuO2lmKERlLnB1c2goZnVuY3Rpb24oKXtpZihlKXRyeXtlLmNhbGwodCl9Y2F0Y2goZSl7amUoZSx0LCJuZXh0VGljayIpfWVsc2UgbiYmbih0KX0pLFJlfHwoUmU9ITAsVWUoKSksIWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7bj1lfSl9dmFyIFZlPW5ldyBlZTtmdW5jdGlvbiBxZShlKXshZnVuY3Rpb24gZSh0LG4pe3ZhciByLGk7dmFyIG89QXJyYXkuaXNBcnJheSh0KTtpZighbyYmIXkodCl8fE9iamVjdC5pc0Zyb3plbih0KXx8dCBpbnN0YW5jZW9mIHNlKXJldHVybjtpZih0Ll9fb2JfXyl7dmFyIGE9dC5fX29iX18uZGVwLmlkO2lmKG4uaGFzKGEpKXJldHVybjtuLmFkZChhKX1pZihvKWZvcihyPXQubGVuZ3RoO3ItLTspZSh0W3JdLG4pO2Vsc2UgZm9yKGk9T2JqZWN0LmtleXModCkscj1pLmxlbmd0aDtyLS07KWUodFtpW3JdXSxuKX0oZSxWZSksVmUuY2xlYXIoKX12YXIgV2U9ZihmdW5jdGlvbihlKXt2YXIgdD0iJiI9PT1lLmNoYXJBdCgwKSxuPSJ+Ij09PShlPXQ/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCkscj0iISI9PT0oZT1uP2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApO3JldHVybntuYW1lOmU9cj9lLnNsaWNlKDEpOmUsb25jZTpuLGNhcHR1cmU6cixwYXNzaXZlOnR9fSk7ZnVuY3Rpb24gSGUoZSxpKXtmdW5jdGlvbiBvKCl7dmFyIGU9YXJndW1lbnRzLHQ9by5mbnM7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIE5lKHQsbnVsbCxhcmd1bWVudHMsaSwidi1vbiBoYW5kbGVyIik7Zm9yKHZhciBuPXQuc2xpY2UoKSxyPTA7cjxuLmxlbmd0aDtyKyspTmUobltyXSxudWxsLGUsaSwidi1vbiBoYW5kbGVyIil9cmV0dXJuIG8uZm5zPWUsb31mdW5jdGlvbiBHZShlLHQsbixyLGksbyl7dmFyIGEscyxjLHU7Zm9yKGEgaW4gZSlzPWVbYV0sYz10W2FdLHU9V2UoYSksRShzKXx8KEUoYyk/KEUocy5mbnMpJiYocz1lW2FdPUhlKHMsbykpLEEodS5vbmNlKSYmKHM9ZVthXT1pKHUubmFtZSxzLHUuY2FwdHVyZSkpLG4odS5uYW1lLHMsdS5jYXB0dXJlLHUucGFzc2l2ZSx1LnBhcmFtcykpOnMhPT1jJiYoYy5mbnM9cyxlW2FdPWMpKTtmb3IoYSBpbiB0KUUoZVthXSkmJnIoKHU9V2UoYSkpLm5hbWUsdFthXSx1LmNhcHR1cmUpfWZ1bmN0aW9uIEplKGUsdCxuKXt2YXIgcjtlIGluc3RhbmNlb2Ygc2UmJihlPWUuZGF0YS5ob29rfHwoZS5kYXRhLmhvb2s9e30pKTt2YXIgaT1lW3RdO2Z1bmN0aW9uIG8oKXtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiKHIuZm5zLG8pfUUoaSk/cj1IZShbb10pOkkoaS5mbnMpJiZBKGkubWVyZ2VkKT8ocj1pKS5mbnMucHVzaChvKTpyPUhlKFtpLG9dKSxyLm1lcmdlZD0hMCxlW3RdPXJ9ZnVuY3Rpb24gWGUoZSx0LG4scil7dmFyIGk9dC5vcHRpb25zLm1wT3B0aW9ucyYmdC5vcHRpb25zLm1wT3B0aW9ucy5wcm9wZXJ0aWVzO2lmKEUoaSkpcmV0dXJuIG47dmFyIG89dC5vcHRpb25zLm1wT3B0aW9ucy5leHRlcm5hbENsYXNzZXN8fFtdLGE9ZS5hdHRycyxzPWUucHJvcHM7aWYoSShhKXx8SShzKSlmb3IodmFyIGMgaW4gaSl7dmFyIHU9dyhjKTsoWWUobixzLGMsdSwhMCl8fFllKG4sYSxjLHUsITEpKSYmbltjXSYmLTEhPT1vLmluZGV4T2YodSkmJnJbaChuW2NdKV0mJihuW2NdPXJbaChuW2NdKV0pfXJldHVybiBufWZ1bmN0aW9uIFllKGUsdCxuLHIsaSl7aWYoSSh0KSl7aWYoZCh0LG4pKXJldHVybiBlW25dPXRbbl0saXx8ZGVsZXRlIHRbbl0sITA7aWYoZCh0LHIpKXJldHVybiBlW25dPXRbcl0saXx8ZGVsZXRlIHRbcl0sITB9cmV0dXJuITF9ZnVuY3Rpb24gS2UoZSl7cmV0dXJuIGMoZSk/W2xlKGUpXTpBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uIGUodCxuKXt2YXIgcj1bXTt2YXIgaSxvLGEscztmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKUUobz10W2ldKXx8ImJvb2xlYW4iPT10eXBlb2Ygb3x8KGE9ci5sZW5ndGgtMSxzPXJbYV0sQXJyYXkuaXNBcnJheShvKT8wPG8ubGVuZ3RoJiYoWmUoKG89ZShvLChufHwiIikrIl8iK2kpKVswXSkmJlplKHMpJiYoclthXT1sZShzLnRleHQrb1swXS50ZXh0KSxvLnNoaWZ0KCkpLHIucHVzaC5hcHBseShyLG8pKTpjKG8pP1plKHMpP3JbYV09bGUocy50ZXh0K28pOiIiIT09byYmci5wdXNoKGxlKG8pKTpaZShvKSYmWmUocyk/clthXT1sZShzLnRleHQrby50ZXh0KTooQSh0Ll9pc1ZMaXN0KSYmSShvLnRhZykmJkUoby5rZXkpJiZJKG4pJiYoby5rZXk9Il9fdmxpc3QiK24rIl8iK2krIl9fIiksci5wdXNoKG8pKSk7cmV0dXJuIHJ9KGUpOnZvaWQgMH1mdW5jdGlvbiBaZShlKXtyZXR1cm4gSShlKSYmSShlLnRleHQpJiYhMT09PWUuaXNDb21tZW50fWZ1bmN0aW9uIFFlKGUsdCl7aWYoZSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj10ZT9SZWZsZWN0Lm93bktleXMoZSk6T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldO2lmKCJfX29iX18iIT09byl7Zm9yKHZhciBhPWVbb10uZnJvbSxzPXQ7czspe2lmKHMuX3Byb3ZpZGVkJiZkKHMuX3Byb3ZpZGVkLGEpKXtuW29dPXMuX3Byb3ZpZGVkW2FdO2JyZWFrfXM9cy4kcGFyZW50fWlmKCFzJiYiZGVmYXVsdCJpbiBlW29dKXt2YXIgYz1lW29dLmRlZmF1bHQ7bltvXT0iZnVuY3Rpb24iPT10eXBlb2YgYz9jLmNhbGwodCk6Y319fXJldHVybiBufX1mdW5jdGlvbiBldChlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl0sYT1vLmRhdGE7aWYoYSYmYS5hdHRycyYmYS5hdHRycy5zbG90JiZkZWxldGUgYS5hdHRycy5zbG90LG8uY29udGV4dCE9PXQmJm8uZm5Db250ZXh0IT09dHx8IWF8fG51bGw9PWEuc2xvdCkobi5kZWZhdWx0fHwobi5kZWZhdWx0PVtdKSkucHVzaChvKTtlbHNle3ZhciBzPWEuc2xvdCxjPW5bc118fChuW3NdPVtdKTsidGVtcGxhdGUiPT09by50YWc/Yy5wdXNoLmFwcGx5KGMsby5jaGlsZHJlbnx8W10pOmMucHVzaChvKX19Zm9yKHZhciB1IGluIG4pblt1XS5ldmVyeSh0dCkmJmRlbGV0ZSBuW3VdO3JldHVybiBufWZ1bmN0aW9uIHR0KGUpe3JldHVybiBlLmlzQ29tbWVudCYmIWUuYXN5bmNGYWN0b3J5fHwiICI9PT1lLnRleHR9ZnVuY3Rpb24gbnQoZSx0LG4pe3ZhciByLGk9MDxPYmplY3Qua2V5cyh0KS5sZW5ndGgsbz1lPyEhZS4kc3RhYmxlOiFpLGE9ZSYmZS4ka2V5O2lmKGUpe2lmKGUuX25vcm1hbGl6ZWQpcmV0dXJuIGUuX25vcm1hbGl6ZWQ7aWYobyYmbiYmbiE9PW0mJmE9PT1uLiRrZXkmJiFpJiYhbi4kaGFzTm9ybWFsKXJldHVybiBuO2Zvcih2YXIgcyBpbiByPXt9LGUpZVtzXSYmIiQiIT09c1swXSYmKHJbc109cnQodCxzLGVbc10pKX1lbHNlIHI9e307Zm9yKHZhciBjIGluIHQpYyBpbiByfHwocltjXT1pdCh0LGMpKTtyZXR1cm4gZSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmKGUuX25vcm1hbGl6ZWQ9ciksUihyLCIkc3RhYmxlIixvKSxSKHIsIiRrZXkiLGEpLFIociwiJGhhc05vcm1hbCIsaSkscn1mdW5jdGlvbiBydChlLHQsbil7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoP24uYXBwbHkobnVsbCxhcmd1bWVudHMpOm4oe30pO3JldHVybihlPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIUFycmF5LmlzQXJyYXkoZSk/W2VdOktlKGUpKSYmKDA9PT1lLmxlbmd0aHx8MT09PWUubGVuZ3RoJiZlWzBdLmlzQ29tbWVudCk/dm9pZCAwOmV9O3JldHVybiBuLnByb3h5JiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHJ9ZnVuY3Rpb24gaXQoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19ZnVuY3Rpb24gb3QoZSx0KXt2YXIgbixyLGksbyxhO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZS5sZW5ndGgpLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbltyXT10KGVbcl0scixyLHIpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKyluW3JdPXQocisxLHIscixyKTtlbHNlIGlmKHkoZSkpaWYodGUmJmVbU3ltYm9sLml0ZXJhdG9yXSl7bj1bXTt2YXIgcz1lW1N5bWJvbC5pdGVyYXRvcl0oKSxjPXMubmV4dCgpO2ZvcihyPTA7IWMuZG9uZTspbi5wdXNoKHQoYy52YWx1ZSxuLmxlbmd0aCxyLHIrKykpLGM9cy5uZXh0KCl9ZWxzZSBmb3Iobz1PYmplY3Qua2V5cyhlKSxuPW5ldyBBcnJheShvLmxlbmd0aCkscj0wLGk9by5sZW5ndGg7cjxpO3IrKylhPW9bcl0sbltyXT10KGVbYV0sYSxyLHIpO3JldHVybiBJKG4pfHwobj1bXSksbi5faXNWTGlzdD0hMCxufWZ1bmN0aW9uIGF0KGUsdCxuLHIpe3ZhciBpLG89dGhpcy4kc2NvcGVkU2xvdHNbZV07bz8obj1ufHx7fSxyJiYobj14KHgoe30sciksbikpLGk9byhuLHRoaXMsbi5faSl8fHQpOmk9dGhpcy4kc2xvdHNbZV18fHQ7dmFyIGE9biYmbi5zbG90O3JldHVybiBhP3RoaXMuJGNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIix7c2xvdDphfSxpKTppfWZ1bmN0aW9uIHN0KGUpe3JldHVybiBJZSh0aGlzLiRvcHRpb25zLCJmaWx0ZXJzIixlKXx8JH1mdW5jdGlvbiBjdChlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPT09ZS5pbmRleE9mKHQpOmUhPT10fWZ1bmN0aW9uIHV0KGUsdCxuLHIsaSl7dmFyIG89RC5rZXlDb2Rlc1t0XXx8bjtyZXR1cm4gaSYmciYmIUQua2V5Q29kZXNbdF0/Y3QoaSxyKTpvP2N0KG8sZSk6cj93KHIpIT09dDp2b2lkIDB9ZnVuY3Rpb24gbHQoaSxvLGEscyxjKXtpZihhKWlmKHkoYSkpe3ZhciB1O0FycmF5LmlzQXJyYXkoYSkmJihhPUMoYSkpO3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCJjbGFzcyI9PT10fHwic3R5bGUiPT09dHx8bCh0KSl1PWk7ZWxzZXt2YXIgZT1pLmF0dHJzJiZpLmF0dHJzLnR5cGU7dT1zfHxELm11c3RVc2VQcm9wKG8sZSx0KT9pLmRvbVByb3BzfHwoaS5kb21Qcm9wcz17fSk6aS5hdHRyc3x8KGkuYXR0cnM9e30pfXZhciBuPWgodCkscj13KHQpO24gaW4gdXx8ciBpbiB1fHwodVt0XT1hW3RdLGMmJigoaS5vbnx8KGkub249e30pKVsidXBkYXRlOiIrdF09ZnVuY3Rpb24oZSl7YVt0XT1lfSkpfTtmb3IodmFyIHQgaW4gYSllKHQpfWVsc2U7cmV0dXJuIGl9ZnVuY3Rpb24gZHQoZSx0KXt2YXIgbj10aGlzLl9zdGF0aWNUcmVlc3x8KHRoaXMuX3N0YXRpY1RyZWVzPVtdKSxyPW5bZV07cmV0dXJuIHImJiF0fHxwdChyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLCJfX3N0YXRpY19fIitlLCExKSxyfWZ1bmN0aW9uIGZ0KGUsdCxuKXtyZXR1cm4gcHQoZSwiX19vbmNlX18iK3QrKG4/Il8iK246IiIpLCEwKSxlfWZ1bmN0aW9uIHB0KGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJiJzdHJpbmciIT10eXBlb2YgZVtyXSYmaHQoZVtyXSx0KyJfIityLG4pO2Vsc2UgaHQoZSx0LG4pfWZ1bmN0aW9uIGh0KGUsdCxuKXtlLmlzU3RhdGljPSEwLGUua2V5PXQsZS5pc09uY2U9bn1mdW5jdGlvbiB2dChlLHQpe2lmKHQpaWYodSh0KSl7dmFyIG49ZS5vbj1lLm9uP3goe30sZS5vbik6e307Zm9yKHZhciByIGluIHQpe3ZhciBpPW5bcl0sbz10W3JdO25bcl09aT9bXS5jb25jYXQoaSxvKTpvfX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIGd0KGUsdCxuLHIpe3Q9dHx8eyRzdGFibGU6IW59O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO0FycmF5LmlzQXJyYXkobyk/Z3Qobyx0LG4pOm8mJihvLnByb3h5JiYoby5mbi5wcm94eT0hMCksdFtvLmtleV09by5mbil9cmV0dXJuIHImJih0LiRrZXk9ciksdH1mdW5jdGlvbiBtdChlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9Mil7dmFyIHI9dFtuXTsic3RyaW5nIj09dHlwZW9mIHImJnImJihlW3Rbbl1dPXRbbisxXSl9cmV0dXJuIGV9ZnVuY3Rpb24geXQoZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/dCtlOmV9ZnVuY3Rpb24gX3QoZSl7ZS5fbz1mdCxlLl9uPW8sZS5fcz1uLGUuX2w9b3QsZS5fdD1hdCxlLl9xPVAsZS5faT1NLGUuX209ZHQsZS5fZj1zdCxlLl9rPXV0LGUuX2I9bHQsZS5fdj1sZSxlLl9lPXVlLGUuX3U9Z3QsZS5fZz12dCxlLl9kPW10LGUuX3A9eXR9ZnVuY3Rpb24gYnQoZSx0LG4sbyxyKXt2YXIgYSxpPXRoaXMscz1yLm9wdGlvbnM7ZChvLCJfdWlkIik/KGE9T2JqZWN0LmNyZWF0ZShvKSkuX29yaWdpbmFsPW86bz0oYT1vKS5fb3JpZ2luYWw7dmFyIGM9QShzLl9jb21waWxlZCksdT0hYzt0aGlzLmRhdGE9ZSx0aGlzLnByb3BzPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9ZS5vbnx8bSx0aGlzLmluamVjdGlvbnM9UWUocy5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBpLiRzbG90c3x8bnQoZS5zY29wZWRTbG90cyxpLiRzbG90cz1ldChuLG8pKSxpLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjb3BlZFNsb3RzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnQoZS5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGMmJih0aGlzLiRvcHRpb25zPXMsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPW50KGUuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSxzLl9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9SXQoYSxlLHQsbixyLHUpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXMuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gSXQoYSxlLHQsbixyLHUpfX1mdW5jdGlvbiB3dChlLHQsbixyLGkpe3ZhciBvPWRlKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsdC5zbG90JiYoKG8uZGF0YXx8KG8uZGF0YT17fSkpLnNsb3Q9dC5zbG90KSxvfWZ1bmN0aW9uIGt0KGUsdCl7Zm9yKHZhciBuIGluIHQpZVtoKG4pXT10W25dfV90KGJ0LnByb3RvdHlwZSk7dmFyIFN0PXtpbml0OmZ1bmN0aW9uKGUsdCl7aWYoZS5jb21wb25lbnRJbnN0YW5jZSYmIWUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkJiZlLmRhdGEua2VlcEFsaXZlKXt2YXIgbj1lO1N0LnByZXBhdGNoKG4sbil9ZWxzZXsoZS5jb21wb25lbnRJbnN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciBuPXtfaXNDb21wb25lbnQ6ITAsX3BhcmVudFZub2RlOmUscGFyZW50OnR9LHI9ZS5kYXRhLmlubGluZVRlbXBsYXRlO0kocikmJihuLnJlbmRlcj1yLnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz1yLnN0YXRpY1JlbmRlckZucyk7cmV0dXJuIG5ldyBlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihuKX0oZSxMdCkpLiRtb3VudCh0P2UuZWxtOnZvaWQgMCx0KX19LHByZXBhdGNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5jb21wb25lbnRPcHRpb25zOyFmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPXIuZGF0YS5zY29wZWRTbG90cyxhPWUuJHNjb3BlZFNsb3RzLHM9ISEobyYmIW8uJHN0YWJsZXx8YSE9PW0mJiFhLiRzdGFibGV8fG8mJmUuJHNjb3BlZFNsb3RzLiRrZXkhPT1vLiRrZXkpLGM9ISEoaXx8ZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW58fHMpO2UuJG9wdGlvbnMuX3BhcmVudFZub2RlPXIsZS4kdm5vZGU9cixlLl92bm9kZSYmKGUuX3Zub2RlLnBhcmVudD1yKTtpZihlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbj1pLGUuJGF0dHJzPXIuZGF0YS5hdHRyc3x8bSxlLiRsaXN0ZW5lcnM9bnx8bSx0JiZlLiRvcHRpb25zLnByb3BzKXtnZSghMSk7Zm9yKHZhciB1PWUuX3Byb3BzLGw9ZS4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLGQ9MDtkPGwubGVuZ3RoO2QrKyl7dmFyIGY9bFtkXSxwPWUuJG9wdGlvbnMucHJvcHM7dVtmXT1BZShmLHAsdCxlKX1nZSghMCksZS4kb3B0aW9ucy5wcm9wc0RhdGE9dH1lLl8kdXBkYXRlUHJvcGVydGllcyYmZS5fJHVwZGF0ZVByb3BlcnRpZXMoZSksbj1ufHxtO3ZhciBoPWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztlLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM9bixCdChlLG4saCksYyYmKGUuJHNsb3RzPWV0KGksci5jb250ZXh0KSxlLiRmb3JjZVVwZGF0ZSgpKX0odC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlLG4ucHJvcHNEYXRhLG4ubGlzdGVuZXJzLHQsbi5jaGlsZHJlbil9LGluc2VydDpmdW5jdGlvbihlKXt2YXIgdCxuPWUuY29udGV4dCxyPWUuY29tcG9uZW50SW5zdGFuY2U7ci5faXNNb3VudGVkfHwoci5faXNNb3VudGVkPSEwLHIuXyR2ZD8oRnQociwib25TZXJ2aWNlQ3JlYXRlZCIpLEZ0KHIsIm9uU2VydmljZUF0dGFjaGVkIiksci5fJHZkLmFkZE1vdW50ZWRWbShyKSk6RnQociwibW91bnRlZCIpKSxlLmRhdGEua2VlcEFsaXZlJiYobi5faXNNb3VudGVkPygodD1yKS5faW5hY3RpdmU9ITEsenQucHVzaCh0KSk6UnQociwhMCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tcG9uZW50SW5zdGFuY2U7dC5faXNEZXN0cm95ZWR8fChlLmRhdGEua2VlcEFsaXZlP2Z1bmN0aW9uIGUodCxuKXtpZihuJiYodC5fZGlyZWN0SW5hY3RpdmU9ITAsRHQodCkpKXJldHVybjtpZighdC5faW5hY3RpdmUpe3QuX2luYWN0aXZlPSEwO2Zvcih2YXIgcj0wO3I8dC4kY2hpbGRyZW4ubGVuZ3RoO3IrKyllKHQuJGNoaWxkcmVuW3JdKTtGdCh0LCJkZWFjdGl2YXRlZCIpfX0odCwhMCk6dC4kZGVzdHJveSgpKX19LHh0PU9iamVjdC5rZXlzKFN0KTtmdW5jdGlvbiBDdChlLHQsbixyLGkpe2lmKCFFKGUpKXt2YXIgbz1uLiRvcHRpb25zLl9iYXNlO2lmKHkoZSkmJihlPW8uZXh0ZW5kKGUpKSwiZnVuY3Rpb24iPT10eXBlb2YgZSl7dmFyIGEscyxjLHUsbCxkLGY7aWYoRShlLmNpZCkmJnZvaWQgMD09PShlPWZ1bmN0aW9uKHQsbil7aWYoQSh0LmVycm9yKSYmSSh0LmVycm9yQ29tcCkpcmV0dXJuIHQuZXJyb3JDb21wO2lmKEkodC5yZXNvbHZlZCkpcmV0dXJuIHQucmVzb2x2ZWQ7dmFyIGU9JHQ7ZSYmSSh0Lm93bmVycykmJi0xPT09dC5vd25lcnMuaW5kZXhPZihlKSYmdC5vd25lcnMucHVzaChlKTtpZihBKHQubG9hZGluZykmJkkodC5sb2FkaW5nQ29tcCkpcmV0dXJuIHQubG9hZGluZ0NvbXA7aWYoZSYmIUkodC5vd25lcnMpKXt2YXIgcj10Lm93bmVycz1bZV0saT0hMCxvPW51bGwsYT1udWxsO2UuJG9uKCJob29rOmRlc3Ryb3llZCIsZnVuY3Rpb24oKXtyZXR1cm4gYihyLGUpfSk7dmFyIHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKXJbdF0uJGZvcmNlVXBkYXRlKCk7ZSYmKHIubGVuZ3RoPTAsbnVsbCE9PW8mJihjbGVhclRpbWVvdXQobyksbz1udWxsKSxudWxsIT09YSYmKGNsZWFyVGltZW91dChhKSxhPW51bGwpKX0sYz1qKGZ1bmN0aW9uKGUpe3QucmVzb2x2ZWQ9UHQoZSxuKSxpP3IubGVuZ3RoPTA6cyghMCl9KSx1PWooZnVuY3Rpb24oZSl7SSh0LmVycm9yQ29tcCkmJih0LmVycm9yPSEwLHMoITApKX0pLGw9dChjLHUpO3JldHVybiB5KGwpJiYoXyhsKT9FKHQucmVzb2x2ZWQpJiZsLnRoZW4oYyx1KTpfKGwuY29tcG9uZW50KSYmKGwuY29tcG9uZW50LnRoZW4oYyx1KSxJKGwuZXJyb3IpJiYodC5lcnJvckNvbXA9UHQobC5lcnJvcixuKSksSShsLmxvYWRpbmcpJiYodC5sb2FkaW5nQ29tcD1QdChsLmxvYWRpbmcsbiksMD09PWwuZGVsYXk/dC5sb2FkaW5nPSEwOm89c2V0VGltZW91dChmdW5jdGlvbigpe289bnVsbCxFKHQucmVzb2x2ZWQpJiZFKHQuZXJyb3IpJiYodC5sb2FkaW5nPSEwLHMoITEpKX0sbC5kZWxheXx8MjAwKSksSShsLnRpbWVvdXQpJiYoYT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YT1udWxsLEUodC5yZXNvbHZlZCkmJnUobnVsbCl9LGwudGltZW91dCkpKSksaT0hMSx0LmxvYWRpbmc/dC5sb2FkaW5nQ29tcDp0LnJlc29sdmVkfX0oYT1lLG8pKSlyZXR1cm4gcz1hLGM9dCx1PW4sbD1yLGQ9aSwoZj11ZSgpKS5hc3luY0ZhY3Rvcnk9cyxmLmFzeW5jTWV0YT17ZGF0YTpjLGNvbnRleHQ6dSxjaGlsZHJlbjpsLHRhZzpkfSxmO3Q9dHx8e30sdm4oZSksSSh0Lm1vZGVsKSYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1vZGVsJiZlLm1vZGVsLnByb3B8fCJ2YWx1ZSIscj1lLm1vZGVsJiZlLm1vZGVsLmV2ZW50fHwiaW5wdXQiOyh0LmF0dHJzfHwodC5hdHRycz17fSkpW25dPXQubW9kZWwudmFsdWU7dmFyIGk9dC5vbnx8KHQub249e30pLG89aVtyXSxhPXQubW9kZWwuY2FsbGJhY2s7SShvKT8oQXJyYXkuaXNBcnJheShvKT8tMT09PW8uaW5kZXhPZihhKTpvIT09YSkmJihpW3JdPVthXS5jb25jYXQobykpOmlbcl09YX0oZS5vcHRpb25zLHQpO3ZhciBwPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXQub3B0aW9ucy5wcm9wcztpZihFKGkpKXJldHVybiBYZShlLHQse30scik7dmFyIG89e30sYT1lLmF0dHJzLHM9ZS5wcm9wcztpZihJKGEpfHxJKHMpKWZvcih2YXIgYyBpbiBpKXt2YXIgdT13KGMpO1llKG8scyxjLHUsITApfHxZZShvLGEsYyx1LCExKX1yZXR1cm4gWGUoZSx0LG8scil9KHQsZSwwLG4pO2lmKEEoZS5vcHRpb25zLmZ1bmN0aW9uYWwpKXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPWUub3B0aW9ucyxhPXt9LHM9by5wcm9wcztpZihJKHMpKWZvcih2YXIgYyBpbiBzKWFbY109QWUoYyxzLHR8fG0pO2Vsc2UgSShuLmF0dHJzKSYma3QoYSxuLmF0dHJzKSxJKG4ucHJvcHMpJiZrdChhLG4ucHJvcHMpO3ZhciB1PW5ldyBidChuLGEsaSxyLGUpLGw9by5yZW5kZXIuY2FsbChudWxsLHUuX2MsdSk7aWYobCBpbnN0YW5jZW9mIHNlKXJldHVybiB3dChsLG4sdS5wYXJlbnQsbyk7aWYoQXJyYXkuaXNBcnJheShsKSl7Zm9yKHZhciBkPUtlKGwpfHxbXSxmPW5ldyBBcnJheShkLmxlbmd0aCkscD0wO3A8ZC5sZW5ndGg7cCsrKWZbcF09d3QoZFtwXSxuLHUucGFyZW50LG8pO3JldHVybiBmfX0oZSxwLHQsbixyKTt2YXIgaD10Lm9uO2lmKHQub249dC5uYXRpdmVPbixBKGUub3B0aW9ucy5hYnN0cmFjdCkpe3ZhciB2PXQuc2xvdDt0PXt9LHYmJih0LnNsb3Q9dil9IWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmhvb2t8fChlLmhvb2s9e30pLG49MDtuPHh0Lmxlbmd0aDtuKyspe3ZhciByPXh0W25dLGk9dFtyXSxvPVN0W3JdO2k9PT1vfHxpJiZpLl9tZXJnZWR8fCh0W3JdPWk/VHQobyxpKTpvKX19KHQpO3ZhciBnPWUub3B0aW9ucy5uYW1lfHxpO3JldHVybiBuZXcgc2UoInZ1ZS1jb21wb25lbnQtIitlLmNpZCsoZz8iLSIrZzoiIiksdCx2b2lkIDAsdm9pZCAwLHZvaWQgMCxuLHtDdG9yOmUscHJvcHNEYXRhOnAsbGlzdGVuZXJzOmgsdGFnOmksY2hpbGRyZW46cn0sYSl9fX1mdW5jdGlvbiBUdChuLHIpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7bihlLHQpLHIoZSx0KX07cmV0dXJuIGUuX21lcmdlZD0hMCxlfXZhciBPdD0xLEV0PTI7ZnVuY3Rpb24gSXQoZSx0LG4scixpLG8pe3JldHVybihBcnJheS5pc0FycmF5KG4pfHxjKG4pKSYmKGk9cixyPW4sbj12b2lkIDApLEEobykmJihpPUV0KSxmdW5jdGlvbihlLHQsbixyLGkpe2lmKEkobikmJkkobi5fX29iX18pKXJldHVybiB1ZSgpO0kobikmJkkobi5pcykmJih0PW4uaXMpO2lmKCF0KXJldHVybiB1ZSgpO0FycmF5LmlzQXJyYXkocikmJiJmdW5jdGlvbiI9PXR5cGVvZiByWzBdJiYoKG49bnx8e30pLnNjb3BlZFNsb3RzPXtkZWZhdWx0OnJbMF19LHIubGVuZ3RoPTApO2k9PT1FdD9yPUtlKHIpOmk9PT1PdCYmKHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoQXJyYXkuaXNBcnJheShlW3RdKSlyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxlKTtyZXR1cm4gZX0ocikpO3ZhciBvLGE7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgczthPWUuJHZub2RlJiZlLiR2bm9kZS5uc3x8RC5nZXRUYWdOYW1lc3BhY2UodCksbz1ELmlzUmVzZXJ2ZWRUYWcodCk/bmV3IHNlKEQucGFyc2VQbGF0Zm9ybVRhZ05hbWUodCksbixyLHZvaWQgMCx2b2lkIDAsZSk6biYmbi5wcmV8fCFJKHM9SWUoZS4kb3B0aW9ucywiY29tcG9uZW50cyIsdCkpP25ldyBzZSh0LG4scix2b2lkIDAsdm9pZCAwLGUpOkN0KHMsbixlLHIsdCl9ZWxzZSBvPUN0KHQsbixlLHIpO3JldHVybiBBcnJheS5pc0FycmF5KG8pP286SShvKT8oSShhKSYmZnVuY3Rpb24gZSh0LG4scil7dC5ucz1uOyJmb3JlaWduT2JqZWN0Ij09PXQudGFnJiYocj0hKG49dm9pZCAwKSk7aWYoSSh0LmNoaWxkcmVuKSlmb3IodmFyIGk9MCxvPXQuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspe3ZhciBhPXQuY2hpbGRyZW5baV07SShhLnRhZykmJihFKGEubnMpfHxBKHIpJiYic3ZnIiE9PWEudGFnKSYmZShhLG4scil9fShvLGEpLEkobikmJmZ1bmN0aW9uKGUpe3koZS5zdHlsZSkmJnFlKGUuc3R5bGUpO3koZS5jbGFzcykmJnFlKGUuY2xhc3MpfShuKSxvKTp1ZSgpfShlLHQsbixyLGkpfXZhciBBdCwkdD1udWxsO2Z1bmN0aW9uIFB0KGUsdCl7cmV0dXJuKGUuX19lc01vZHVsZXx8dGUmJiJNb2R1bGUiPT09ZVtTeW1ib2wudG9TdHJpbmdUYWddKSYmKGU9ZS5kZWZhdWx0KSx5KGUpP3QuZXh0ZW5kKGUpOmV9ZnVuY3Rpb24gTXQoZSx0KXtBdC4kb24oZSx0KX1mdW5jdGlvbiBqdChlLHQpe0F0LiRvZmYoZSx0KX1mdW5jdGlvbiBOdCh0LG4pe3ZhciByPUF0O3JldHVybiBmdW5jdGlvbiBlKCl7bnVsbCE9PW4uYXBwbHkobnVsbCxhcmd1bWVudHMpJiZyLiRvZmYodCxlKX19ZnVuY3Rpb24gQnQoZSx0LG4pe0dlKHQsbnx8e30sTXQsanQsTnQsQXQ9ZSksQXQ9dm9pZCAwfXZhciBMdD1udWxsO2Z1bmN0aW9uIER0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gUnQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxEdChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKVJ0KGUuJGNoaWxkcmVuW25dKTtGdChlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gRnQoZSx0KXtvZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspTmUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxhZSgpfXZhciBVdD1bXSx6dD1bXSxWdD17fSxxdD0hMSxXdD0hMSxIdD0wO3ZhciBHdD1EYXRlLm5vdztpZihWJiYhRyl7dmFyIEp0PXdpbmRvdy5wZXJmb3JtYW5jZTtKdCYmImZ1bmN0aW9uIj09dHlwZW9mIEp0Lm5vdyYmR3QoKT5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKS50aW1lU3RhbXAmJihHdD1mdW5jdGlvbigpe3JldHVybiBKdC5ub3coKX0pfWZ1bmN0aW9uIFh0KCl7dmFyIGUsdDtmb3IoR3QoKSxXdD0hMCxVdC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQtdC5pZH0pLEh0PTA7SHQ8VXQubGVuZ3RoO0h0KyspKGU9VXRbSHRdKS5iZWZvcmUmJmUuYmVmb3JlKCksdD1lLmlkLFZ0W3RdPW51bGwsZS5ydW4oKTt2YXIgbj16dC5zbGljZSgpLHI9VXQuc2xpY2UoKTtIdD1VdC5sZW5ndGg9enQubGVuZ3RoPTAscXQ9V3Q9IShWdD17fSksZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5faW5hY3RpdmU9ITAsUnQoZVt0XSwhMCl9KG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2Zvcig7dC0tOyl7dmFyIG49ZVt0XSxyPW4udm07ci5fd2F0Y2hlcj09PW4mJnIuX2lzTW91bnRlZCYmIXIuX2lzRGVzdHJveWVkJiYoci5fJHZkP3IuXyR2ZC5hZGRVcGRhdGVkVm0ocik6RnQociwidXBkYXRlZCIpKX19KHIpLFomJkQuZGV2dG9vbHMmJlouZW1pdCgiZmx1c2giKX12YXIgWXQ9MCxLdD1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMudm09ZSxpJiYoZS5fd2F0Y2hlcj10aGlzKSxlLl93YXRjaGVycy5wdXNoKHRoaXMpLHI/KHRoaXMuZGVlcD0hIXIuZGVlcCx0aGlzLnVzZXI9ISFyLnVzZXIsdGhpcy5sYXp5PSEhci5sYXp5LHRoaXMuc3luYz0hIXIuc3luYyx0aGlzLmJlZm9yZT1yLmJlZm9yZSk6dGhpcy5kZWVwPXRoaXMudXNlcj10aGlzLmxhenk9dGhpcy5zeW5jPSExLHRoaXMuY2I9bix0aGlzLmlkPSsrWXQsdGhpcy5hY3RpdmU9ITAsdGhpcy5kaXJ0eT10aGlzLmxhenksdGhpcy5kZXBzPVtdLHRoaXMubmV3RGVwcz1bXSx0aGlzLmRlcElkcz1uZXcgZWUsdGhpcy5uZXdEZXBJZHM9bmV3IGVlLHRoaXMuZXhwcmVzc2lvbj0iIiwiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmdldHRlcj10Oih0aGlzLmdldHRlcj1mdW5jdGlvbihlKXtpZighRi50ZXN0KGUpKXt2YXIgbj1lLnNwbGl0KCIuIik7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7dCsrKXtpZighZSlyZXR1cm47ZT1lW25bdF1dfXJldHVybiBlfX19KHQpLHRoaXMuZ2V0dGVyfHwodGhpcy5nZXR0ZXI9VCkpLHRoaXMudmFsdWU9dGhpcy5sYXp5P3ZvaWQgMDp0aGlzLmdldCgpfTtLdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7dmFyIGU7b2UodGhpcyk7dmFyIHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO2plKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZxZShlKSxhZSgpLHRoaXMuY2xlYW51cERlcHMoKX1yZXR1cm4gZX0sS3QucHJvdG90eXBlLmFkZERlcD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkO3RoaXMubmV3RGVwSWRzLmhhcyh0KXx8KHRoaXMubmV3RGVwSWRzLmFkZCh0KSx0aGlzLm5ld0RlcHMucHVzaChlKSx0aGlzLmRlcElkcy5oYXModCl8fGUuYWRkU3ViKHRoaXMpKX0sS3QucHJvdG90eXBlLmNsZWFudXBEZXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl7dmFyIHQ9dGhpcy5kZXBzW2VdO3RoaXMubmV3RGVwSWRzLmhhcyh0LmlkKXx8dC5yZW1vdmVTdWIodGhpcyl9dmFyIG49dGhpcy5kZXBJZHM7dGhpcy5kZXBJZHM9dGhpcy5uZXdEZXBJZHMsdGhpcy5uZXdEZXBJZHM9bix0aGlzLm5ld0RlcElkcy5jbGVhcigpLG49dGhpcy5kZXBzLHRoaXMuZGVwcz10aGlzLm5ld0RlcHMsdGhpcy5uZXdEZXBzPW4sdGhpcy5uZXdEZXBzLmxlbmd0aD0wfSxLdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5sYXp5P3RoaXMuZGlydHk9ITA6dGhpcy5zeW5jP3RoaXMucnVuKCk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtpZihudWxsPT1WdFt0XSl7aWYoVnRbdF09ITAsV3Qpe2Zvcih2YXIgbj1VdC5sZW5ndGgtMTtIdDxuJiZVdFtuXS5pZD5lLmlkOyluLS07VXQuc3BsaWNlKG4rMSwwLGUpfWVsc2UgVXQucHVzaChlKTtxdHx8KHF0PSEwLHplKFh0KSl9fSh0aGlzKX0sS3QucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt2YXIgZT10aGlzLmdldCgpO2lmKGUhPT10aGlzLnZhbHVlfHx5KGUpfHx0aGlzLmRlZXApe3ZhciB0PXRoaXMudmFsdWU7aWYodGhpcy52YWx1ZT1lLHRoaXMudXNlcil0cnl7dGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX1jYXRjaChlKXtqZShlLHRoaXMudm0sJ2NhbGxiYWNrIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWVsc2UgdGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX19fSxLdC5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMuZ2V0KCksdGhpcy5kaXJ0eT0hMX0sS3QucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLmRlcGVuZCgpfSxLdC5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZHx8Yih0aGlzLnZtLl93YXRjaGVycyx0aGlzKTtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5yZW1vdmVTdWIodGhpcyk7dGhpcy5hY3RpdmU9ITF9fTt2YXIgWnQ9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpULHNldDpUfTtmdW5jdGlvbiBRdChlLHQsbil7WnQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bbl19LFp0LnNldD1mdW5jdGlvbihlKXt0aGlzW3RdW25dPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sWnQpfWZ1bmN0aW9uIGVuKGUpe2UuX3dhdGNoZXJzPVtdO3ZhciB0PWUuJG9wdGlvbnM7dC5wcm9wcyYmZnVuY3Rpb24obixyKXt2YXIgaT1uLiRvcHRpb25zLnByb3BzRGF0YXx8e30sbz1uLl9wcm9wcz17fSxhPW4uJG9wdGlvbnMuX3Byb3BLZXlzPVtdO24uJHBhcmVudCYmZ2UoITEpO3ZhciBlPWZ1bmN0aW9uKGUpe2EucHVzaChlKTt2YXIgdD1BZShlLHIsaSxuKTtfZShvLGUsdCksZSBpbiBufHxRdChuLCJfcHJvcHMiLGUpfTtmb3IodmFyIHQgaW4gcillKHQpO2dlKCEwKX0oZSx0LnByb3BzKSx0Lm1ldGhvZHMmJmZ1bmN0aW9uKGUsdCl7ZS4kb3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdCllW25dPSJmdW5jdGlvbiIhPXR5cGVvZiB0W25dP1Q6ayh0W25dLGUpfShlLHQubWV0aG9kcyksdC5kYXRhP2Z1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YTt1KHQ9ZS5fZGF0YT0iZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbihlLHQpe29lKCk7dHJ5e3JldHVybiBlLmNhbGwodCx0KX1jYXRjaChlKXtyZXR1cm4gamUoZSx0LCJkYXRhKCkiKSx7fX1maW5hbGx5e2FlKCl9fSh0LGUpOnR8fHt9KXx8KHQ9e30pO3ZhciBuPU9iamVjdC5rZXlzKHQpLHI9ZS4kb3B0aW9ucy5wcm9wcyxpPShlLiRvcHRpb25zLm1ldGhvZHMsbi5sZW5ndGgpO2Zvcig7aS0tOyl7dmFyIG89bltpXTtyJiZkKHIsbyl8fCh2b2lkIDAsMzYhPT0oYT0obysiIikuY2hhckNvZGVBdCgwKSkmJjk1IT09YSYmUXQoZSwiX2RhdGEiLG8pKX12YXIgYTt5ZSh0LCEwKX0oZSk6eWUoZS5fZGF0YT17fSwhMCksdC5jb21wdXRlZCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLl9jb21wdXRlZFdhdGNoZXJzPU9iamVjdC5jcmVhdGUobnVsbCkscj1LKCk7Zm9yKHZhciBpIGluIHQpe3ZhciBvPXRbaV0sYT0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vOm8uZ2V0O3J8fChuW2ldPW5ldyBLdChlLGF8fFQsVCx0bikpLGkgaW4gZXx8bm4oZSxpLG8pfX0oZSx0LmNvbXB1dGVkKSx0LndhdGNoJiZ0LndhdGNoIT09WCYmZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZihBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKWFuKGUsbixyW2ldKTtlbHNlIGFuKGUsbixyKX19KGUsdC53YXRjaCl9dmFyIHRuPXtsYXp5OiEwfTtmdW5jdGlvbiBubihlLHQsbil7dmFyIHI9IUsoKTsiZnVuY3Rpb24iPT10eXBlb2Ygbj8oWnQuZ2V0PXI/cm4odCk6b24obiksWnQuc2V0PVQpOihadC5nZXQ9bi5nZXQ/ciYmITEhPT1uLmNhY2hlP3JuKHQpOm9uKG4uZ2V0KTpULFp0LnNldD1uLnNldHx8VCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxadCl9ZnVuY3Rpb24gcm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY29tcHV0ZWRXYXRjaGVycyYmdGhpcy5fY29tcHV0ZWRXYXRjaGVyc1t0XTtpZihlKXJldHVybiBlLmRpcnR5JiZlLmV2YWx1YXRlKCksaWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmZS5kZXBlbmQoKSxlLnZhbHVlfX1mdW5jdGlvbiBvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMsdGhpcyl9fWZ1bmN0aW9uIGFuKGUsdCxuLHIpe3JldHVybiB1KG4pJiYobj0ocj1uKS5oYW5kbGVyKSwic3RyaW5nIj09dHlwZW9mIG4mJihuPWVbbl0pLGUuJHdhdGNoKHQsbixyKX12YXIgc24sY24sdW4sbG4sZG4sZm4scG4saG49MDtmdW5jdGlvbiB2bihlKXt2YXIgdD1lLm9wdGlvbnM7aWYoZS5zdXBlcil7dmFyIG49dm4oZS5zdXBlcik7aWYobiE9PWUuc3VwZXJPcHRpb25zKXtlLnN1cGVyT3B0aW9ucz1uO3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5vcHRpb25zLHI9ZS5zZWFsZWRPcHRpb25zO2Zvcih2YXIgaSBpbiBuKW5baV0hPT1yW2ldJiYodHx8KHQ9e30pLHRbaV09bltpXSk7cmV0dXJuIHR9KGUpO3ImJngoZS5leHRlbmRPcHRpb25zLHIpLCh0PWUub3B0aW9ucz1FZShuLGUuZXh0ZW5kT3B0aW9ucykpLm5hbWUmJih0LmNvbXBvbmVudHNbdC5uYW1lXT1lKX19cmV0dXJuIHR9ZnVuY3Rpb24gZ24oZSl7dGhpcy5faW5pdChlKX1mdW5jdGlvbiBtbihlKXtlLmNpZD0wO3ZhciBhPTE7ZS5leHRlbmQ9ZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10aGlzLG49dC5jaWQscj1lLl9DdG9yfHwoZS5fQ3Rvcj17fSk7aWYocltuXSlyZXR1cm4gcltuXTt2YXIgaT1lLm5hbWV8fHQub3B0aW9ucy5uYW1lLG89ZnVuY3Rpb24oZSl7dGhpcy5faW5pdChlKX07cmV0dXJuKChvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9bykuY2lkPWErKyxvLm9wdGlvbnM9RWUodC5vcHRpb25zLGUpLG8uc3VwZXI9dCxvLm9wdGlvbnMucHJvcHMmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdClRdChlLnByb3RvdHlwZSwiX3Byb3BzIixuKX0obyksby5vcHRpb25zLmNvbXB1dGVkJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMuY29tcHV0ZWQ7Zm9yKHZhciBuIGluIHQpbm4oZS5wcm90b3R5cGUsbix0W25dKX0obyksby5leHRlbmQ9dC5leHRlbmQsby5taXhpbj10Lm1peGluLG8udXNlPXQudXNlLEIuZm9yRWFjaChmdW5jdGlvbihlKXtvW2VdPXRbZV19KSxpJiYoby5vcHRpb25zLmNvbXBvbmVudHNbaV09byksby5zdXBlck9wdGlvbnM9dC5vcHRpb25zLG8uZXh0ZW5kT3B0aW9ucz1lLG8uc2VhbGVkT3B0aW9ucz14KHt9LG8ub3B0aW9ucykscltuXT1vfX1mdW5jdGlvbiB5bihlKXtyZXR1cm4gZSYmKGUuQ3Rvci5vcHRpb25zLm5hbWV8fGUudGFnKX1mdW5jdGlvbiBfbihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPGUuaW5kZXhPZih0KToic3RyaW5nIj09dHlwZW9mIGU/LTE8ZS5zcGxpdCgiLCIpLmluZGV4T2YodCk6KG49ZSwiW29iamVjdCBSZWdFeHBdIj09PXIuY2FsbChuKSYmZS50ZXN0KHQpKTt2YXIgbn1mdW5jdGlvbiBibihlLHQpe3ZhciBuPWUuY2FjaGUscj1lLmtleXMsaT1lLl92bm9kZTtmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtpZihhKXt2YXIgcz15bihhLmNvbXBvbmVudE9wdGlvbnMpO3MmJiF0KHMpJiZ3bihuLG8scixpKX19fWZ1bmN0aW9uIHduKGUsdCxuLHIpe3ZhciBpPWVbdF07IWl8fHImJmkudGFnPT09ci50YWd8fGkuY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKSxlW3RdPW51bGwsYihuLHQpfWduLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvPXRoaXM7by5fdWlkPWhuKyssby5faXNWdWU9ITAsZSYmZS5faXNDb21wb25lbnQ/ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50O3ZhciBpPShuLl9wYXJlbnRWbm9kZT1yKS5jb21wb25lbnRPcHRpb25zO24ucHJvcHNEYXRhPWkucHJvcHNEYXRhLG4uX3BhcmVudExpc3RlbmVycz1pLmxpc3RlbmVycyxuLl9yZW5kZXJDaGlsZHJlbj1pLmNoaWxkcmVuLG4uX2NvbXBvbmVudFRhZz1pLnRhZyx0LnJlbmRlciYmKG4ucmVuZGVyPXQucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zKX0obyxlKTpvLiRvcHRpb25zPUVlKHZuKG8uY29uc3RydWN0b3IpLGV8fHt9LG8pLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfSgoby5fcmVuZGVyUHJveHk9bykuX3NlbGY9byksZnVuY3Rpb24oZSl7ZS5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksZS5faGFzSG9va0V2ZW50PSExO3ZhciB0PWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczt0JiZCdChlLHQpfShvKSxmdW5jdGlvbihpKXtpLl92bm9kZT1udWxsLGkuX3N0YXRpY1RyZWVzPW51bGw7dmFyIGU9aS4kb3B0aW9ucyx0PWkuJHZub2RlPWUuX3BhcmVudFZub2RlLG49dCYmdC5jb250ZXh0O2kuJHNsb3RzPWV0KGUuX3JlbmRlckNoaWxkcmVuLG4pLGkuJHNjb3BlZFNsb3RzPW0saS5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gSXQoaSxlLHQsbixyLCExKX0saS4kY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gSXQoaSxlLHQsbixyLCEwKX07dmFyIHI9dCYmdC5kYXRhO19lKGksIiRhdHRycyIsciYmci5hdHRyc3x8bSxudWxsLCEwKSxfZShpLCIkbGlzdGVuZXJzIixlLl9wYXJlbnRMaXN0ZW5lcnN8fG0sbnVsbCwhMCl9KG8pLEZ0KG8sImJlZm9yZUNyZWF0ZSIpLChuPVFlKCh0PW8pLiRvcHRpb25zLmluamVjdCx0KSkmJihnZSghMSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtfZSh0LGUsbltlXSl9KSxnZSghMCkpLGVuKG8pLChpPShyPW8pLiRvcHRpb25zLnByb3ZpZGUpJiYoci5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5jYWxsKHIpOmkpLEZ0KG8sImNyZWF0ZWQiKSxvLiRvcHRpb25zLmVsJiZvLiRtb3VudChvLiRvcHRpb25zLmVsKX0sc249Z24sY249e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0sdW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wc319LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzbi5wcm90b3R5cGUsIiRkYXRhIixjbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KHNuLnByb3RvdHlwZSwiJHByb3BzIix1biksc24ucHJvdG90eXBlLiRzZXQ9YmUsc24ucHJvdG90eXBlLiRkZWxldGU9d2Usc24ucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZih1KHQpKXJldHVybiBhbihyLGUsdCxuKTsobj1ufHx7fSkudXNlcj0hMDt2YXIgaT1uZXcgS3QocixlLHQsbik7aWYobi5pbW1lZGlhdGUpdHJ5e3QuY2FsbChyLGkudmFsdWUpfWNhdGNoKGUpe2plKGUsciwnY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyICInK2kuZXhwcmVzc2lvbisnIicpfXJldHVybiBmdW5jdGlvbigpe2kudGVhcmRvd24oKX19LGRuPS9eaG9vazovLChsbj1nbikucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9uKGVbbl0sdCk7ZWxzZSh0aGlzLl9ldmVudHNbZV18fCh0aGlzLl9ldmVudHNbZV09W10pKS5wdXNoKHQpLGRuLnRlc3QoZSkmJih0aGlzLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiB0aGlzfSxsbi5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sbG4ucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcztpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb2ZmKGVbbl0sdCk7cmV0dXJuIHRoaXN9dmFyIGksbz10aGlzLl9ldmVudHNbZV07aWYoIW8pcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuX2V2ZW50c1tlXT1udWxsLHRoaXM7Zm9yKHZhciBhPW8ubGVuZ3RoO2EtLTspaWYoKGk9b1thXSk9PT10fHxpLmZuPT09dCl7by5zcGxpY2UoYSwxKTticmVha31yZXR1cm4gdGhpc30sbG4ucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PTE8dC5sZW5ndGg/Uyh0KTp0O2Zvcih2YXIgbj1TKGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKU5lKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9LChmbj1nbikucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMsaT1yLiRlbCxvPXIuX3Zub2RlLGE9KG49THQsTHQ9cixmdW5jdGlvbigpe0x0PW59KTtyLl92bm9kZT1lLHIuJGVsPW8/ci5fX3BhdGNoX18obyxlKTpyLl9fcGF0Y2hfXyhyLiRlbCxlLHQsITEpLGEoKSxpJiYoaS5fX3Z1ZV9fPW51bGwpLHIuJGVsJiYoci4kZWwuX192dWVfXz1yKSxyLiR2bm9kZSYmci4kcGFyZW50JiZyLiR2bm9kZT09PXIuJHBhcmVudC5fdm5vZGUmJihyLiRwYXJlbnQuJGVsPXIuJGVsKX0sZm4ucHJvdG90eXBlLiRmb3JjZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3dhdGNoZXImJnRoaXMuX3dhdGNoZXIudXBkYXRlKCl9LGZuLnByb3RvdHlwZS4kZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIWUuX2lzQmVpbmdEZXN0cm95ZWQpe0Z0KGUsImJlZm9yZURlc3Ryb3kiKSxlLl9pc0JlaW5nRGVzdHJveWVkPSEwO3ZhciB0PWUuJHBhcmVudDshdHx8dC5faXNCZWluZ0Rlc3Ryb3llZHx8ZS4kb3B0aW9ucy5hYnN0cmFjdHx8Yih0LiRjaGlsZHJlbixlKSxlLl93YXRjaGVyJiZlLl93YXRjaGVyLnRlYXJkb3duKCk7Zm9yKHZhciBuPWUuX3dhdGNoZXJzLmxlbmd0aDtuLS07KWUuX3dhdGNoZXJzW25dLnRlYXJkb3duKCk7ZS5fZGF0YS5fX29iX18mJmUuX2RhdGEuX19vYl9fLnZtQ291bnQtLSxlLl9pc0Rlc3Ryb3llZD0hMCxlLl9fcGF0Y2hfXyhlLl92bm9kZSxudWxsKSxGdChlLCJkZXN0cm95ZWQiKSxlLiRvZmYoKSxlLiRlbCYmKGUuJGVsLl9fdnVlX189bnVsbCksZS4kdm5vZGUmJihlLiR2bm9kZS5wYXJlbnQ9bnVsbCl9fSxfdCgocG49Z24pLnByb3RvdHlwZSkscG4ucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gemUoZSx0aGlzKX0scG4ucHJvdG90eXBlLl9yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxuPXRoaXMsZT1uLiRvcHRpb25zLHI9ZS5yZW5kZXIsaT1lLl9wYXJlbnRWbm9kZTtpJiYobi4kc2NvcGVkU2xvdHM9bnQoaS5kYXRhLnNjb3BlZFNsb3RzLG4uJHNsb3RzLG4uJHNjb3BlZFNsb3RzKSksbi4kdm5vZGU9aTt0cnl7JHQ9bix0PXIuY2FsbChuLl9yZW5kZXJQcm94eSxuLiRjcmVhdGVFbGVtZW50KX1jYXRjaChlKXtqZShlLG4sInJlbmRlciIpLHQ9bi5fdm5vZGV9ZmluYWxseXskdD1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGgmJih0PXRbMF0pLHQgaW5zdGFuY2VvZiBzZXx8KHQ9dWUoKSksdC5wYXJlbnQ9aSx0fTt2YXIga24sU24seG4sQ249W1N0cmluZyxSZWdFeHAsQXJyYXldLFRuPXtLZWVwQWxpdmU6e25hbWU6ImtlZXAtYWxpdmUiLGFic3RyYWN0OiEwLHByb3BzOntpbmNsdWRlOkNuLGV4Y2x1ZGU6Q24sbWF4OltTdHJpbmcsTnVtYmVyXX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuY2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmtleXM9W119LGRlc3Ryb3llZDpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLmNhY2hlKXduKHRoaXMuY2FjaGUsZSx0aGlzLmtleXMpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiR3YXRjaCgiaW5jbHVkZSIsZnVuY3Rpb24odCl7Ym4oZSxmdW5jdGlvbihlKXtyZXR1cm4gX24odCxlKX0pfSksdGhpcy4kd2F0Y2goImV4Y2x1ZGUiLGZ1bmN0aW9uKHQpe2JuKGUsZnVuY3Rpb24oZSl7cmV0dXJuIV9uKHQsZSl9KX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzbG90cy5kZWZhdWx0LHQ9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XTtpZihJKG4pJiYoSShuLmNvbXBvbmVudE9wdGlvbnMpfHwocj1uKS5pc0NvbW1lbnQmJnIuYXN5bmNGYWN0b3J5KSlyZXR1cm4gbn12YXIgcn0oZSksbj10JiZ0LmNvbXBvbmVudE9wdGlvbnM7aWYobil7dmFyIHI9eW4obiksaT10aGlzLmluY2x1ZGUsbz10aGlzLmV4Y2x1ZGU7aWYoaSYmKCFyfHwhX24oaSxyKSl8fG8mJnImJl9uKG8scikpcmV0dXJuIHQ7dmFyIGE9dGhpcy5jYWNoZSxzPXRoaXMua2V5cyxjPW51bGw9PXQua2V5P24uQ3Rvci5jaWQrKG4udGFnPyI6OiIrbi50YWc6IiIpOnQua2V5O2FbY10/KHQuY29tcG9uZW50SW5zdGFuY2U9YVtjXS5jb21wb25lbnRJbnN0YW5jZSxiKHMsYykscy5wdXNoKGMpKTooYVtjXT10LHMucHVzaChjKSx0aGlzLm1heCYmcy5sZW5ndGg+cGFyc2VJbnQodGhpcy5tYXgpJiZ3bihhLHNbMF0scyx0aGlzLl92bm9kZSkpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fX07a249Z24seG49e2dldDpmdW5jdGlvbigpe3JldHVybiBEfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGtuLCJjb25maWciLHhuKSxrbi51dGlsPXt3YXJuOm5lLGV4dGVuZDp4LG1lcmdlT3B0aW9uczpFZSxkZWZpbmVSZWFjdGl2ZTpfZX0sa24uc2V0PWJlLGtuLmRlbGV0ZT13ZSxrbi5uZXh0VGljaz16ZSxrbi5vYnNlcnZhYmxlPWZ1bmN0aW9uKGUpe3JldHVybiB5ZShlKSxlfSxrbi5vcHRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksQi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2tuLm9wdGlvbnNbZSsicyJdPU9iamVjdC5jcmVhdGUobnVsbCl9KSx4KChrbi5vcHRpb25zLl9iYXNlPWtuKS5vcHRpb25zLmNvbXBvbmVudHMsVG4pLGtuLnVzZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnN0YWxsZWRQbHVnaW5zfHwodGhpcy5faW5zdGFsbGVkUGx1Z2lucz1bXSk7aWYoLTE8dC5pbmRleE9mKGUpKXJldHVybiB0aGlzO3ZhciBuPVMoYXJndW1lbnRzLDEpO3JldHVybiBuLnVuc2hpZnQodGhpcyksImZ1bmN0aW9uIj09dHlwZW9mIGUuaW5zdGFsbD9lLmluc3RhbGwuYXBwbHkoZSxuKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hcHBseShudWxsLG4pLHQucHVzaChlKSx0aGlzfSxrbi5taXhpbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zPUVlKHRoaXMub3B0aW9ucyxlKSx0aGlzfSxtbihrbiksU249a24sQi5mb3JFYWNoKGZ1bmN0aW9uKG4pe1NuW25dPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/KCJjb21wb25lbnQiPT09biYmdSh0KSYmKHQubmFtZT10Lm5hbWV8fGUsdD10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKHQpKSwiZGlyZWN0aXZlIj09PW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD17YmluZDp0LHVwZGF0ZTp0fSksdGhpcy5vcHRpb25zW24rInMiXVtlXT10KTp0aGlzLm9wdGlvbnNbbisicyJdW2VdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbi5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDpLfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGduLnByb3RvdHlwZSwiJHNzckNvbnRleHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGduLCJGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCIse3ZhbHVlOmJ0fSksZ24udmVyc2lvbj0iMi42LjExIjt2YXIgT249MTtmdW5jdGlvbiBFbigpe3JldHVybihPbisrKS50b1N0cmluZygpfXZhciBJbj1mdW5jdGlvbigpe3RoaXMubm9kZUlkPUVuKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLm5leHRTaWJsaW5nPW51bGwsdGhpcy5wcmV2aW91c1NpYmxpbmc9bnVsbH07SW4ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl8kdmQmJnRoaXMuXyR2ZC5yZW1vdmVFbGVtZW50KHRoaXMpLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pfTt2YXIgQW49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5ub2RlVHlwZT04LHRoaXMubm9kZUlkPUVuKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy50eXBlPSJjb21tZW50Iix0aGlzLnZhbHVlPWUsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLCgoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJceDNjIS0tICIrdGhpcy52YWx1ZSsiIC0tXHgzZSJ9LGV9KEluKTtmdW5jdGlvbiAkbihlLHQsbil7dmFyIHI9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoISgwPHIucHVyZUNoaWxkcmVuLmxlbmd0aCYmMT09PXQubm9kZVR5cGV8fHQucGFyZW50Tm9kZSkpe3ZhciBpPXIuY2hpbGRyZW4sbz1pLmluZGV4T2Yobik7bzwwP2kucHVzaCh0KTppLnNwbGljZShvLDAsdCksMT09PXQubm9kZVR5cGU/KCJib2R5Ij09PXQucm9sZT8odC5kb2NJZD1lLmlkLHQub3duZXJEb2N1bWVudD1lLHQucGFyZW50Tm9kZT1yKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksUG4oZSx0KSx0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUpLE1uKHQsciksci5wdXJlQ2hpbGRyZW4ucHVzaCh0KSk6dC5wYXJlbnROb2RlPXJ9fWZ1bmN0aW9uIFBuKGUsdCl7dC5yb2xlPSJib2R5Iix0LmRlcHRoPTEsdC5yZWY9Il9yb290IixlLmJvZHk9dH1mdW5jdGlvbiBNbih0LGUpeyh0LnBhcmVudE5vZGU9ZSkuZG9jSWQmJih0LmRvY0lkPWUuZG9jSWQsdC5vd25lckRvY3VtZW50PWUub3duZXJEb2N1bWVudCx0LmRlcHRoPWUuZGVwdGgrMSksdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe01uKGUsdCl9KX1mdW5jdGlvbiBqbihlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIE5uKGUpe2Zvcig7ZTspe2lmKDE9PT1lLm5vZGVUeXBlKXJldHVybiBlO2U9ZS5wcmV2aW91c1NpYmxpbmd9fWZ1bmN0aW9uIEJuKGUsdCxuLHIpe248MCYmKG49MCk7dmFyIGk9dFtuLTFdLG89dFtuXTtyZXR1cm4gdC5zcGxpY2UobiwwLGUpLHImJihpJiYoaS5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1pLChlLm5leHRTaWJsaW5nPW8pJiYoby5wcmV2aW91c1NpYmxpbmc9ZSkpLG59ZnVuY3Rpb24gTG4oZSx0LG4scil7dmFyIGk9dC5pbmRleE9mKGUpO2lmKGk8MClyZXR1cm4tMTtpZihyKXt2YXIgbz10W2ktMV0sYT10W2krMV07byYmKG8ubmV4dFNpYmxpbmc9YSksYSYmKGEucHJldmlvdXNTaWJsaW5nPW8pfXQuc3BsaWNlKGksMSk7dmFyIHM9bjtpPD1uJiYocz1uLTEpO3ZhciBjPXRbcy0xXSx1PXRbc107cmV0dXJuIHQuc3BsaWNlKHMsMCxlKSxyJiYoYyYmKGMubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9YywoZS5uZXh0U2libGluZz11KSYmKHUucHJldmlvdXNTaWJsaW5nPWUpKSxpPT09cz8tMTpufWZ1bmN0aW9uIERuKGUsdCxuKXt2YXIgcj10LmluZGV4T2YoZSk7aWYoIShyPDApKXtpZihuKXt2YXIgaT10W3ItMV0sbz10W3IrMV07aSYmKGkubmV4dFNpYmxpbmc9byksbyYmKG8ucHJldmlvdXNTaWJsaW5nPWkpfXQuc3BsaWNlKHIsMSl9fXZhciBSbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPSJ2aWV3IiksdC5jYWxsKHRoaXMpLHRoaXMubm9kZVR5cGU9MSx0aGlzLm5vZGVJZD1FbigpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMudHlwZT1lLHRoaXMuYXR0cj17fSx0aGlzLmV2ZW50cz17fSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnNldEF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpeyJjaWQiPT09ZT90aGlzLmNpZD10OiJuaWQiPT09ZSYmKHRoaXMubmlkPXQpfSxlLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ldmVudHNbZV07biYmbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodCl9KX0sZS5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe2lmKCIiPT09dGhpcy5jaWR8fCIiPT09dGhpcy5uaWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiBhZGRFdmVudExpc3RlbmVyKCIrZSsiKSBub3QgZm91bmQiKTsodGhpcy5ldmVudHNbZV18fCh0aGlzLmV2ZW50c1tlXT1bXSkpLnB1c2godCksdGhpcy5fJHZkLmFkZEVsZW1lbnQodGhpcyl9LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCIiPT09dGhpcy5jaWR8fCIiPT09dGhpcy5uaWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiByZW1vdmVFdmVudExpc3RlbmVyKCIrZSsiKSBub3QgZm91bmQiKTt2YXIgcj0hMTtpZih0aGlzLmV2ZW50c1tlXSl7dmFyIGk9dGhpcy5ldmVudHNbZV0uaW5kZXhPZih0KTstMSE9PWkmJih0aGlzLmV2ZW50c1tlXS5zcGxpY2UoaSwxKSxyPSEwKX1yfHxjb25zb2xlLmVycm9yKCJjaWQ9Iit0aGlzLmNpZCsiLG5pZD0iK3RoaXMubmlkKyIgcmVtb3ZlRXZlbnRMaXN0ZW5lcigiK2UrIikgaGFuZGxlciBub3QgZm91bmQiKSxPYmplY3Qua2V5cyh0aGlzLmV2ZW50cykuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1uLmV2ZW50c1tlXS5sZW5ndGh9KSYmdGhpcy5fJHZkLnJlbW92ZUVsZW1lbnQodGhpcyl9LGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8KGUucGFyZW50Tm9kZT8oTG4oZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCEwKSwxPT09ZS5ub2RlVHlwZSYmTG4oZSx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpKTooTW4oZSx0aGlzKSxCbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLDE9PT1lLm5vZGVUeXBlJiZCbihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCkpKX0sZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGUsdCl7aWYoIShlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLm5leHRTaWJsaW5nJiZlLm5leHRTaWJsaW5nPT09dCkpaWYoZS5wYXJlbnROb2RlKXtpZihMbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIG49am4odCk7TG4oZSx0aGlzLnB1cmVDaGlsZHJlbixuP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKX19ZWxzZSBpZihNbihlLHRoaXMpLEJuKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCksITApLDE9PT1lLm5vZGVUeXBlKXt2YXIgcj1qbih0KTtCbihlLHRoaXMucHVyZUNoaWxkcmVuLHI/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihyKTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpfX0sZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLnByZXZpb3VzU2libGluZyYmZS5wcmV2aW91c1NpYmxpbmc9PT10fHwoZS5wYXJlbnROb2RlPyhMbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLDE9PT1lLm5vZGVUeXBlJiZMbihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoTm4odCkpKzEpKTooTW4oZSx0aGlzKSxCbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLDE9PT1lLm5vZGVUeXBlJiZCbihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoTm4odCkpKzEpKSl9LGUucHJvdG90eXBlLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGUsdCl7ZS5wYXJlbnROb2RlJiYoRG4oZSx0aGlzLmNoaWxkcmVuLCEwKSwxPT09ZS5ub2RlVHlwZSYmRG4oZSx0aGlzLnB1cmVDaGlsZHJlbikpLHR8fGUuZGVzdHJveSgpfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIjwiK3RoaXMudHlwZSsiIGF0dHI9IitKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpKyIgc3R5bGU9IitKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkrIj4iK3RoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkuam9pbigiIikrIjwvIit0aGlzLnR5cGUrIj4ifSxlfShJbiksRm49ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWU/ZS50b1N0cmluZygpOiIiLHRoaXMuVVJMPXQsdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX07Rm4ucHJvdG90eXBlLmNyZWF0ZURvY3VtZW50RWxlbWVudD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7aWYoIXRoaXMuZG9jdW1lbnRFbGVtZW50KXt2YXIgZT1uZXcgUm4oImRvY3VtZW50Iik7ZS5kb2NJZD10aGlzLmlkLGUub3duZXJEb2N1bWVudD10aGlzLGUucm9sZT0iZG9jdW1lbnRFbGVtZW50IixlLmRlcHRoPTAsZS5yZWY9Il9kb2N1bWVudEVsZW1lbnQiLHRoaXMuZG9jdW1lbnRFbGVtZW50PWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSl7JG4obixlKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiaW5zZXJ0QmVmb3JlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSx0KXskbihuLGUsdCl9fSl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fSxGbi5wcm90b3R5cGUuY3JlYXRlQm9keT1mdW5jdGlvbihlKXt0aGlzLmJvZHl8fFBuKHRoaXMsbmV3IFJuKGUpKTtyZXR1cm4gdGhpcy5ib2R5fSxGbi5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFJuKGUpfSxGbi5wcm90b3R5cGUuY3JlYXRlQ29tbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IEFuKGUpfSxGbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe307dmFyIFVuPXMoInN0eWxlLGNsYXNzIiksem49KHMoImlucHV0LHRleHRhcmVhLG9wdGlvbixzZWxlY3QscHJvZ3Jlc3MiKSxzKCJjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2siKSxzKCJldmVudHMsY2FyZXQsdHlwaW5nLHBsYWludGV4dC1vbmx5IikscygiYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSxkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsZW5hYmxlZCxmb3Jtbm92YWxpZGF0ZSxoaWRkZW4saW5kZXRlcm1pbmF0ZSxpbmVydCxpc21hcCxpdGVtc2NvcGUsbG9vcCxtdWx0aXBsZSxtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LHJlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cmFuc2xhdGUsdHJ1ZXNwZWVkLHR5cGVtdXN0bWF0Y2gsdmlzaWJsZSIpLHMoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IikpO3ZhciBWbj1PYmplY3QuZnJlZXplKHtjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUm4oZSl9LGNyZWF0ZUVsZW1lbnROUzpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUm4oZSsiOiIrdCl9LGNyZWF0ZVRleHROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSbigidGV4dCIpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQW4oZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2UuYXBwZW5kQ2hpbGQodCl9LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oKXt9fSkscW49e2NyZWF0ZTpmdW5jdGlvbihlLHQpe1duKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKFduKGUsITApLFduKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXtXbihlLCEwKX19O2Z1bmN0aW9uIFduKGUsdCl7dmFyIG49ZS5kYXRhLnJlZjtpZihJKG4pKXt2YXIgcj1lLmNvbnRleHQsaT1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxvPXIuJHJlZnM7dD9BcnJheS5pc0FycmF5KG9bbl0pP2Iob1tuXSxpKTpvW25dPT09aSYmKG9bbl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShvW25dKT9vW25dLmluZGV4T2YoaSk8MCYmb1tuXS5wdXNoKGkpOm9bbl09W2ldOm9bbl09aX19cygiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSxzKCJzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsZm9yZWlnbk9iamVjdCxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldyIsITApO3ZhciBIbj1zKCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpLEduPW5ldyBzZSgiIix7fSxbXSksSm49WyJjcmVhdGUiLCJhY3RpdmF0ZSIsInVwZGF0ZSIsInJlbW92ZSIsImRlc3Ryb3kiXTtmdW5jdGlvbiBYbihlLHQpe3JldHVybiBlLmtleT09PXQua2V5JiYoZS50YWc9PT10LnRhZyYmZS5pc0NvbW1lbnQ9PT10LmlzQ29tbWVudCYmSShlLmRhdGEpPT09SSh0LmRhdGEpJiZmdW5jdGlvbihlLHQpe2lmKCJpbnB1dCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgbixyPUkobj1lLmRhdGEpJiZJKG49bi5hdHRycykmJm4udHlwZSxpPUkobj10LmRhdGEpJiZJKG49bi5hdHRycykmJm4udHlwZTtyZXR1cm4gcj09PWl8fEhuKHIpJiZIbihpKX0oZSx0KXx8QShlLmlzQXN5bmNQbGFjZWhvbGRlcikmJmUuYXN5bmNGYWN0b3J5PT09dC5hc3luY0ZhY3RvcnkmJkUodC5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBZbihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihyPXQ7cjw9bjsrK3IpSShpPWVbcl0ua2V5KSYmKG9baV09cik7cmV0dXJuIG99dmFyIEtuPXtjcmVhdGU6Wm4sdXBkYXRlOlpuLGRlc3Ryb3k6ZnVuY3Rpb24oZSl7Wm4oZSxHbil9fTtmdW5jdGlvbiBabihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZmdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPXQ9PT1HbixhPW49PT1HbixzPWVyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksYz1lcihuLmRhdGEuZGlyZWN0aXZlcyxuLmNvbnRleHQpLHU9W10sbD1bXTtmb3IoZSBpbiBjKXI9c1tlXSxpPWNbZV0scj8oaS5vbGRWYWx1ZT1yLnZhbHVlLGkub2xkQXJnPXIuYXJnLHRyKGksInVwZGF0ZSIsbix0KSxpLmRlZiYmaS5kZWYuY29tcG9uZW50VXBkYXRlZCYmbC5wdXNoKGkpKToodHIoaSwiYmluZCIsbix0KSxpLmRlZiYmaS5kZWYuaW5zZXJ0ZWQmJnUucHVzaChpKSk7aWYodS5sZW5ndGgpe3ZhciBkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx1Lmxlbmd0aDtlKyspdHIodVtlXSwiaW5zZXJ0ZWQiLG4sdCl9O28/SmUobiwiaW5zZXJ0IixkKTpkKCl9bC5sZW5ndGgmJkplKG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPGwubGVuZ3RoO2UrKyl0cihsW2VdLCJjb21wb25lbnRVcGRhdGVkIixuLHQpfSk7aWYoIW8pZm9yKGUgaW4gcyljW2VdfHx0cihzW2VdLCJ1bmJpbmQiLHQsdCxhKX0oZSx0KX12YXIgUW49T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBlcihlLHQpe3ZhciBuLHIsaSxvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIG87Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1RbiksKG9bKGk9cixpLnJhd05hbWV8fGkubmFtZSsiLiIrT2JqZWN0LmtleXMoaS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIikpXT1yKS5kZWY9SWUodC4kb3B0aW9ucywiZGlyZWN0aXZlcyIsci5uYW1lKTtyZXR1cm4gb31mdW5jdGlvbiB0cih0LG4scixlLGkpe3ZhciBvPXQuZGVmJiZ0LmRlZltuXTtpZihvKXRyeXtvKHIuZWxtLHQscixlLGkpfWNhdGNoKGUpe2plKGUsci5jb250ZXh0LCJkaXJlY3RpdmUgIit0Lm5hbWUrIiAiK24rIiBob29rIil9fWZ1bmN0aW9uIG5yKGUsbil7aWYoIUUoZS5kYXRhLnd4c1Byb3BzKXx8IUUobi5kYXRhLnd4c1Byb3BzKSl7dmFyIHI9ZS4kd3hzV2F0Y2hlcyx0PU9iamVjdC5rZXlzKG4uZGF0YS53eHNQcm9wcyk7aWYocnx8dC5sZW5ndGgpe3J8fChyPXt9KTt2YXIgaT1uLmRhdGEud3hzUHJvcHM7bi4kd3hzV2F0Y2hlcz17fSxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07bi4kd3hzV2F0Y2hlc1tlXT1yW2VdfHxuLmNvbnRleHQuJHdhdGNoKHQsZnVuY3Rpb24oKXt0aGlzLiRmb3JjZVVwZGF0ZSgpfSx7aW1tZWRpYXRlOiEwLGRlZXA6ITB9KX0pLE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7bi4kd3hzV2F0Y2hlc1tlXXx8KHJbZV0oKSxkZWxldGUgcltlXSl9KX19fWZ1bmN0aW9uIHJyKGUsdCl7dmFyIG49dC5kYXRhLmF0dHJzO2lmKCFFKG4pJiYhRShuLl9pKSl7dmFyIHIsaSxvPXQuZWxtO28uZGF0YXNldD1PYmplY3QuYXNzaWduKG8uZGF0YXNldHx8e30sKHI9bixpPU9iamVjdC5jcmVhdGUobnVsbCksT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbih0KXtpZigwPT09dC5pbmRleE9mKCJkYXRhLSIpKXt2YXIgbj1oKHQucmVwbGFjZSgiZGF0YS0iLCIiKSk7dHJ5e2lbbl09SlNPTi5wYXJzZShyW3RdKX1jYXRjaChlKXtpW25dPXJbdF19fX0pLGkpKX19dmFyIGlyLG9yPSJfX3IiLGFyPSJfX2MiO2Z1bmN0aW9uIHNyKHQsbixyKXt2YXIgaT1pcjtyZXR1cm4gZnVuY3Rpb24gZSgpe251bGwhPT1uLmFwcGx5KG51bGwsYXJndW1lbnRzKSYmdXIodCxlLHIsaSl9fWZ1bmN0aW9uIGNyKGUsdCl7aXIuYWRkRXZlbnRMaXN0ZW5lcihlLHQpfWZ1bmN0aW9uIHVyKGUsdCxuLHIpe3QmJihyfHxpcikucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQuX3dyYXBwZXJ8fHQpfWZ1bmN0aW9uIGxyKGUsdCl7aWYoIUUoZS5kYXRhLm9uKXx8IUUodC5kYXRhLm9uKSl7dmFyIG49dC5kYXRhLm9ufHx7fSxyPWUuZGF0YS5vbnx8e307KGlyPXQuZWxtKS5fJHZkPXQuY29udGV4dC5fJHZkO2Zvcih2YXIgaT10LmNvbnRleHQsbz0odC5kYXRhLmF0dHJzfHx7fSkuX2ksYT10LnBhcmVudDthJiZhLmNvbXBvbmVudEluc3RhbmNlOyl7dmFyIHM9YS5jb21wb25lbnRJbnN0YW5jZS4kYXR0cnMmJmEuY29tcG9uZW50SW5zdGFuY2UuJGF0dHJzLl9pO0kocykmJihvPSJyLSIrcyksYT1hLnBhcmVudH1pci5zZXRBdHRyaWJ1dGUoIm5pZCIsU3RyaW5nKG8pKSxpci5zZXRBdHRyaWJ1dGUoImNpZCIsaS5fJGlkKSxmdW5jdGlvbihlKXtJKGVbb3JdKSYmKGUuaW5wdXQ9W10uY29uY2F0KGVbb3JdLGUuaW5wdXR8fFtdKSxkZWxldGUgZVtvcl0pO0koZVthcl0pJiYoZS5jaGFuZ2U9W10uY29uY2F0KGVbYXJdLGUuY2hhbmdlfHxbXSksZGVsZXRlIGVbYXJdKX0obiksR2UobixyLGNyLHVyLHNyLHQuY29udGV4dCksaXI9dm9pZCAwfX12YXIgZHI9ZnVuY3Rpb24oZSl7dmFyIHIsdCxnPXt9LG49ZS5tb2R1bGVzLG09ZS5ub2RlT3BzO2ZvcihyPTA7cjxKbi5sZW5ndGg7KytyKWZvcihnW0puW3JdXT1bXSx0PTA7dDxuLmxlbmd0aDsrK3QpSShuW3RdW0puW3JdXSkmJmdbSm5bcl1dLnB1c2goblt0XVtKbltyXV0pO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9bS5wYXJlbnROb2RlKGUpO0kodCkmJm0ucmVtb3ZlQ2hpbGQodCxlKX1mdW5jdGlvbiB5KGUsdCxuLHIsaSxvLGEpe2lmKEkoZS5lbG0pJiZJKG8pJiYoZT1vW2FdPWRlKGUpKSxlLmlzUm9vdEluc2VydD0haSwhZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5kYXRhO2lmKEkoaSkpe3ZhciBvPUkoZS5jb21wb25lbnRJbnN0YW5jZSkmJmkua2VlcEFsaXZlO2lmKEkoaT1pLmhvb2spJiZJKGk9aS5pbml0KSYmaShlLCExKSxJKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBwKGUsdCksbChuLGUuZWxtLHIpLEEobykmJmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaSxvPWU7by5jb21wb25lbnRJbnN0YW5jZTspaWYobz1vLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxJKGk9by5kYXRhKSYmSShpPWkudHJhbnNpdGlvbikpe2ZvcihpPTA7aTxnLmFjdGl2YXRlLmxlbmd0aDsrK2kpZy5hY3RpdmF0ZVtpXShHbixvKTt0LnB1c2gobyk7YnJlYWt9bChuLGUuZWxtLHIpfShlLHQsbixyKSwhMH19KGUsdCxuLHIpKXt2YXIgcz1lLmRhdGEsYz1lLmNoaWxkcmVuLHU9ZS50YWc7SSh1KT8oZS5lbG09ZS5ucz9tLmNyZWF0ZUVsZW1lbnROUyhlLm5zLHUpOm0uY3JlYXRlRWxlbWVudCh1LGUpLGQoZSksaChlLGMsdCksSShzKSYmdihlLHQpKTpBKGUuaXNDb21tZW50KT9lLmVsbT1tLmNyZWF0ZUNvbW1lbnQoZS50ZXh0KTplLmVsbT1tLmNyZWF0ZVRleHROb2RlKGUudGV4dCksbChuLGUuZWxtLHIpfX1mdW5jdGlvbiBwKGUsdCl7SShlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsXyhlKT8odihlLHQpLGQoZSkpOihXbihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIGwoZSx0LG4pe0koZSkmJihJKG4pP20ucGFyZW50Tm9kZShuKT09PWUmJm0uaW5zZXJ0QmVmb3JlKGUsdCxuKTptLmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIGgoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpeSh0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpO2Vsc2UgYyhlLnRleHQpJiZtLmFwcGVuZENoaWxkKGUuZWxtLG0uY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiBfKGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gSShlLnRhZyl9ZnVuY3Rpb24gdihlLHQpe2Zvcih2YXIgbj0wO248Zy5jcmVhdGUubGVuZ3RoOysrbilnLmNyZWF0ZVtuXShHbixlKTtJKHI9ZS5kYXRhLmhvb2spJiYoSShyLmNyZWF0ZSkmJnIuY3JlYXRlKEduLGUpLEkoci5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGQoZSl7dmFyIHQ7aWYoSSh0PWUuZm5TY29wZUlkKSltLnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIG49ZTtuOylJKHQ9bi5jb250ZXh0KSYmSSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZtLnNldFN0eWxlU2NvcGUoZS5lbG0sdCksbj1uLnBhcmVudDtJKHQ9THQpJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJkkodD10LiRvcHRpb25zLl9zY29wZUlkKSYmbS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIGIoZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpeShuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gdyhlKXt2YXIgdCxuLHI9ZS5kYXRhO2lmKEkocikpZm9yKEkodD1yLmhvb2spJiZJKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDxnLmRlc3Ryb3kubGVuZ3RoOysrdClnLmRlc3Ryb3lbdF0oZSk7aWYoSSh0PWUuY2hpbGRyZW4pKWZvcihuPTA7bjxlLmNoaWxkcmVuLmxlbmd0aDsrK24pdyhlLmNoaWxkcmVuW25dKX1mdW5jdGlvbiBrKGUsdCxuKXtmb3IoO3Q8PW47Kyt0KXt2YXIgcj1lW3RdO0kocikmJihJKHIudGFnKT8oYShyKSx3KHIpKTpvKHIuZWxtKSl9fWZ1bmN0aW9uIGEoZSx0KXtpZihJKHQpfHxJKGUuZGF0YSkpe3ZhciBuLHIsaT1nLnJlbW92ZS5sZW5ndGgrMTtpZihJKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxJKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkkobj1uLl92bm9kZSkmJkkobi5kYXRhKSlhKG4sdCk7ZWxzZSBpZihJKHI9ZS5jaGlsZHJlbikpZm9yKG49MDtuPHIubGVuZ3RoO24rKylyW25dLnRhZyYmYShyW25dKTtmb3Iobj0wO248Zy5yZW1vdmUubGVuZ3RoOysrbilnLnJlbW92ZVtuXShlLHQpO0kobj1lLmRhdGEuaG9vaykmJkkobj1uLnJlbW92ZSk/bihlLHQpOnQoKX1lbHNlIG8oZS5lbG0pfWZ1bmN0aW9uIFMoZSx0LG4scil7Zm9yKHZhciBpPW47aTxyO2krKyl7dmFyIG89dFtpXTtpZihJKG8pJiZYbihlLG8pKXJldHVybiBpfX1mdW5jdGlvbiB4KGUsdCxuLHIsaSxvKXtpZihlIT09dCl7SSh0LmVsbSkmJkkocikmJih0PXJbaV09ZGUodCkpO3ZhciBhPXQuZWxtPWUuZWxtO2lmKEEoZS5pc0FzeW5jUGxhY2Vob2xkZXIpKUkodC5hc3luY0ZhY3RvcnkucmVzb2x2ZWQpP08oZS5lbG0sdCxuKTp0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMDtlbHNlIGlmKEEodC5pc1N0YXRpYykmJkEoZS5pc1N0YXRpYykmJnQua2V5PT09ZS5rZXkmJihBKHQuaXNDbG9uZWQpfHxBKHQuaXNPbmNlKSkpdC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlO2Vsc2V7dmFyIHMsYz10LmRhdGE7SShjKSYmSShzPWMuaG9vaykmJkkocz1zLnByZXBhdGNoKSYmcyhlLHQpO3ZhciB1PWUuY2hpbGRyZW4sbD10LmNoaWxkcmVuO2lmKEkoYykmJl8odCkpe2ZvcihzPTA7czxnLnVwZGF0ZS5sZW5ndGg7KytzKWcudXBkYXRlW3NdKGUsdCk7SShzPWMuaG9vaykmJkkocz1zLnVwZGF0ZSkmJnMoZSx0KX1FKHQudGV4dCk/SSh1KSYmSShsKT91IT09bCYmZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLGM9MCx1PTAsbD10Lmxlbmd0aC0xLGQ9dFswXSxmPXRbbF0scD1uLmxlbmd0aC0xLGg9blswXSx2PW5bcF0sZz0haTtjPD1sJiZ1PD1wOylFKGQpP2Q9dFsrK2NdOkUoZik/Zj10Wy0tbF06WG4oZCxoKT8oeChkLGgscixuLHUpLGQ9dFsrK2NdLGg9blsrK3VdKTpYbihmLHYpPyh4KGYsdixyLG4scCksZj10Wy0tbF0sdj1uWy0tcF0pOlhuKGQsdik/KHgoZCx2LHIsbixwKSxnJiZtLmluc2VydEJlZm9yZShlLGQuZWxtLG0ubmV4dFNpYmxpbmcoZi5lbG0pKSxkPXRbKytjXSx2PW5bLS1wXSk6KFhuKGYsaCk/KHgoZixoLHIsbix1KSxnJiZtLmluc2VydEJlZm9yZShlLGYuZWxtLGQuZWxtKSxmPXRbLS1sXSk6KEUobykmJihvPVluKHQsYyxsKSksRShhPUkoaC5rZXkpP29baC5rZXldOlMoaCx0LGMsbCkpP3koaCxyLGUsZC5lbG0sITEsbix1KTpYbihzPXRbYV0saCk/KHgocyxoLHIsbix1KSx0W2FdPXZvaWQgMCxnJiZtLmluc2VydEJlZm9yZShlLHMuZWxtLGQuZWxtKSk6eShoLHIsZSxkLmVsbSwhMSxuLHUpKSxoPW5bKyt1XSk7bDxjP2IoZSxFKG5bcCsxXSk/bnVsbDpuW3ArMV0uZWxtLG4sdSxwLHIpOnA8dSYmayh0LGMsbCl9KGEsdSxsLG4sbyk6SShsKT8oSShlLnRleHQpJiZtLnNldFRleHRDb250ZW50KGEsIiIpLGIoYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpJKHUpP2sodSwwLHUubGVuZ3RoLTEpOkkoZS50ZXh0KSYmbS5zZXRUZXh0Q29udGVudChhLCIiKTplLnRleHQhPT10LnRleHQmJm0uc2V0VGV4dENvbnRlbnQoYSx0LnRleHQpLEkoYykmJkkocz1jLmhvb2spJiZJKHM9cy5wb3N0cGF0Y2gpJiZzKGUsdCl9fX1mdW5jdGlvbiBDKGUsdCxuKXtpZihBKG4pJiZJKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKXRbcl0uZGF0YS5ob29rLmluc2VydCh0W3JdKX12YXIgVD1zKCJhdHRycyxjbGFzcyxzdGF0aWNDbGFzcyxzdGF0aWNTdHlsZSxrZXkiKTtmdW5jdGlvbiBPKGUsdCxuLHIpe3ZhciBpLG89dC50YWcsYT10LmRhdGEscz10LmNoaWxkcmVuO2lmKHI9cnx8YSYmYS5wcmUsdC5lbG09ZSxBKHQuaXNDb21tZW50KSYmSSh0LmFzeW5jRmFjdG9yeSkpcmV0dXJuIHQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2lmKEkoYSkmJihJKGk9YS5ob29rKSYmSShpPWkuaW5pdCkmJmkodCwhMCksSShpPXQuY29tcG9uZW50SW5zdGFuY2UpKSlyZXR1cm4gcCh0LG4pLCEwO2lmKEkobykpe2lmKEkocykpaWYoZS5oYXNDaGlsZE5vZGVzKCkpaWYoSShpPWEpJiZJKGk9aS5kb21Qcm9wcykmJkkoaT1pLmlubmVySFRNTCkpe2lmKGkhPT1lLmlubmVySFRNTClyZXR1cm4hMX1lbHNle2Zvcih2YXIgYz0hMCx1PWUuZmlyc3RDaGlsZCxsPTA7bDxzLmxlbmd0aDtsKyspe2lmKCF1fHwhTyh1LHNbbF0sbixyKSl7Yz0hMTticmVha311PXUubmV4dFNpYmxpbmd9aWYoIWN8fHUpcmV0dXJuITF9ZWxzZSBoKHQscyxuKTtpZihJKGEpKXt2YXIgZD0hMTtmb3IodmFyIGYgaW4gYSlpZighVChmKSl7ZD0hMCx2KHQsbik7YnJlYWt9IWQmJmEuY2xhc3MmJnFlKGEuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXJldHVybiBmdW5jdGlvbihlLHQsbixyKXtpZighRSh0KSl7dmFyIGksbz0hMSxhPVtdO2lmKEUoZSkpbz0hMCx5KHQsYSk7ZWxzZXt2YXIgcz1JKGUubm9kZVR5cGUpO2lmKCFzJiZYbihlLHQpKXgoZSx0LGEsbnVsbCxudWxsLHIpO2Vsc2V7aWYocyl7aWYoMT09PWUubm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKE4pJiYoZS5yZW1vdmVBdHRyaWJ1dGUoTiksbj0hMCksQShuKSYmTyhlLHQsYSkpcmV0dXJuIEModCxhLCEwKSxlO2k9ZSxlPW5ldyBzZShtLnRhZ05hbWUoaSkudG9Mb3dlckNhc2UoKSx7fSxbXSx2b2lkIDAsaSl9dmFyIGM9ZS5lbG0sdT1tLnBhcmVudE5vZGUoYyk7aWYoeSh0LGEsYy5fbGVhdmVDYj9udWxsOnUsbS5uZXh0U2libGluZyhjKSksSSh0LnBhcmVudCkpZm9yKHZhciBsPXQucGFyZW50LGQ9Xyh0KTtsOyl7Zm9yKHZhciBmPTA7ZjxnLmRlc3Ryb3kubGVuZ3RoOysrZilnLmRlc3Ryb3lbZl0obCk7aWYobC5lbG09dC5lbG0sZCl7Zm9yKHZhciBwPTA7cDxnLmNyZWF0ZS5sZW5ndGg7KytwKWcuY3JlYXRlW3BdKEduLGwpO3ZhciBoPWwuZGF0YS5ob29rLmluc2VydDtpZihoLm1lcmdlZClmb3IodmFyIHY9MTt2PGguZm5zLmxlbmd0aDt2KyspaC5mbnNbdl0oKX1lbHNlIFduKGwpO2w9bC5wYXJlbnR9SSh1KT9rKFtlXSwwLDApOkkoZS50YWcpJiZ3KGUpfX1yZXR1cm4gQyh0LGEsbyksdC5lbG19SShlKSYmdyhlKX19KHtub2RlT3BzOlZuLG1vZHVsZXM6W3tjcmVhdGU6bnIsdXBkYXRlOm5yfSx7Y3JlYXRlOnJyLHVwZGF0ZTpycn0se2NyZWF0ZTpscix1cGRhdGU6bHJ9XS5jb25jYXQoW3FuLEtuXSl9KSxmcj17bW9kZWw6e30sc2hvdzp7fX07ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49IiIscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKylJKHQ9cHIoZVtyXSkpJiYiIiE9PXQmJihuJiYobis9IiAiKSxuKz10KTtyZXR1cm4gbn0oZSk6eShlKT9mdW5jdGlvbihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSllW25dJiYodCYmKHQrPSIgIiksdCs9bik7cmV0dXJuIHR9KGUpOiJzdHJpbmciPT10eXBlb2YgZT9lOiIifXZhciBocj1mKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KTtmdW5jdGlvbiB2cihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9DKGUpOiJzdHJpbmciPT10eXBlb2YgZT9ocihlKTplfWZ1bmN0aW9uIGdyKGUsdCl7b2UoKTt2YXIgbixyPXRoaXMuJG9wdGlvbnNbZV0saT1lKyIgaG9vayI7aWYocilmb3IodmFyIG89MCxhPXIubGVuZ3RoO288YTtvKyspbj1OZShyW29dLHRoaXMsdD9bdF06bnVsbCx0aGlzLGkpO3JldHVybiB0aGlzLl9oYXNIb29rRXZlbnQmJnRoaXMuJGVtaXQoImhvb2s6IitlLHQpLGFlKCksbn12YXIgbXI9e2luc3RhbGw6ZnVuY3Rpb24oZSl7ZS5wcm90b3R5cGUuXyRxdWV1ZT1VdCxlLnByb3RvdHlwZS5fX2NhbGxfaG9vaz1ncixlLnByb3RvdHlwZS5fJHN0cmluZ2lmeUNsYXNzPXByLGUucHJvdG90eXBlLl8kbm9ybWFsaXplU3R5bGVCaW5kaW5nPXZyfX07Z24uY29uZmlnLm11c3RVc2VQcm9wPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGduLmNvbmZpZy5pc1Jlc2VydmVkVGFnPXpuLGduLmNvbmZpZy5pc1Jlc2VydmVkQXR0cj1Vbixnbi5jb25maWcuZ2V0VGFnTmFtZXNwYWNlPWZ1bmN0aW9uKCl7fSxnbi5jb25maWcuaXNVbmtub3duRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiExfSx4KGduLm9wdGlvbnMuZGlyZWN0aXZlcyxmcikseChnbi5vcHRpb25zLmNvbXBvbmVudHMse30pLGduLnByb3RvdHlwZS5fX3BhdGNoX189ZHIsZ24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe2lmKCJwYWdlIj09PXRoaXMuJG9wdGlvbnMubXBUeXBlKXt2YXIgbj1uZXcgRm4odGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCk7KGU9bi5jcmVhdGVDb21tZW50KCJyb290IikpLmhhc0F0dHJpYnV0ZT1lLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbigpe30sbi5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZSl9cmV0dXJuIGk9ZSxvPXQsKHI9dGhpcykuJGVsPWksci4kb3B0aW9ucy5yZW5kZXJ8fChyLiRvcHRpb25zLnJlbmRlcj11ZSksRnQociwiYmVmb3JlTW91bnQiKSxuZXcgS3QocixmdW5jdGlvbigpe3IuX3VwZGF0ZShyLl9yZW5kZXIoKSxvKX0sVCx7YmVmb3JlOmZ1bmN0aW9uKCl7ci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJkZ0KHIsImJlZm9yZVVwZGF0ZSIpfX0sITApLG89ITEsbnVsbD09ci4kdm5vZGUmJihyLl9pc01vdW50ZWQ9ITAsci5fJHZkPyhGdChyLCJvblNlcnZpY2VDcmVhdGVkIiksRnQociwib25TZXJ2aWNlQXR0YWNoZWQiKSxyLl8kdmQuYWRkTW91bnRlZFZtKHIpKTpGdChyLCJtb3VudGVkIikpLHI7dmFyIHIsaSxvfSxnbi51c2UobXIpLGUuVnVlPWdufXZhciBpc0ZpcnN0PSEwLGZyYW1ld29ya3MscnVudGltZUNvbmZpZztmdW5jdGlvbiBpbml0JDIoZSl7aWYoZS5fX3VuaUNvbmZpZyl7dmFyIHQ9ZS53ZWV4O2lzRmlyc3QmJihnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aD10LmNvbmZpZy5lbnYuZGV2aWNlV2lkdGgpO3ZhciBuPWUuX191bmlDb25maWcscj0id2VleCI9PT1uLm52dWVDb21waWxlcjt0LmRvY3VtZW50Ll9fJGF1dG9tYXRvcl9fPSEhbi5hdXRvbWF0b3IsdC5kb2N1bWVudC5fXyRjb21waWxlcl9fPXI/IndlZXgiOiJ1bmktYXBwIix0LmRvY3VtZW50Ll9fJHN0eWxlQ29tcGlsZXJfXz0id2VleCI9PT1uLm52dWVTdHlsZUNvbXBpbGVyPyJ3ZWV4IjoidW5pLWFwcCIsZ2xvYmFsLldYRW52aXJvbm1lbnQuZHluYW1pY1JweD0hKCFuLndpbmRvd3x8IW4ud2luZG93LmR5bmFtaWNScHgpO3ZhciBpPSJuYXRpdmUiIT09bi5yZW5kZXJlciYmLTEhPT10LmNvbmZpZy5idW5kbGVVcmwuaW5kZXhPZigiYXBwLXNlcnZpY2UuanMiKTtpZihpKXt2YXIgbz17fTt2dWVGYWN0b3J5KG8sZS5TaGFyZWRPYmplY3QpLGUuVnVlPW8uVnVlfWlmKE9iamVjdC5hc3NpZ24oZSxjcmVhdGVJbnN0YW5jZUNvbnRleHQkMShlKSksaSYmZS5WdWUudXNlKGUuX192dWVQbHVnaW4pLGRlbGV0ZSBlLl9fdnVlUGx1Z2luLCFyKXt2YXIgYT1lLnBsdXM7aWYoImlvcyI9PT1nbG9iYWwuV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpKXt2YXIgcz1hLnNjcmVlbjtnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aD1zLndpZHRoLGdsb2JhbC5XWEVudmlyb25tZW50LmRldmljZUhlaWdodD1zLmhlaWdodH12YXIgYz1nbG9iYWwuV1hFbnZpcm9ubWVudCx1PWMuc2NhbGUsbD1jLmRldmljZVdpZHRoLGQ9Yy5wbGF0Zm9ybSxmPU1hdGguY2VpbChsL3UpLHA9dC5yZXF1aXJlTW9kdWxlKCJtZXRhIik7aWYoIjEiPT09dC5jb25maWcucGx1c193ZWJfaWQpe3ZhciBoPXQucmVxdWlyZU1vZHVsZSgicGx1cyIpO2guc2V0RGVmYXVsdEZvbnRTaXplJiZoLnNldERlZmF1bHRGb250U2l6ZSgxNil9ImlvcyI9PT1kLnRvTG93ZXJDYXNlKCkmJnAuc2V0Vmlld3BvcnQoe3dpZHRoOmYscm91bmRPZmZEZXZpYXRpb246ITF9KX1pfHxlLlZ1ZS51c2UodW5pQXBwLGUpfX1mdW5jdGlvbiBnZXRKU0ZNVmVyc2lvbigpe3JldHVybiIwLjI5LjYifWZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VzKGksbyxhKXt2YXIgcz1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBzLnNlcnZpY2U9T2JqZWN0LmNyZWF0ZShudWxsKSxzZXJ2aWNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZSxuPWUub3B0aW9ucy5jcmVhdGU7aWYobil0cnl7dmFyIHI9bihpLG8sYSk7T2JqZWN0LmFzc2lnbihzLnNlcnZpY2UsciksT2JqZWN0LmFzc2lnbihzLHIuaW5zdGFuY2UpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIltKUyBSdW50aW1lXSBGYWlsZWQgdG8gY3JlYXRlIHNlcnZpY2UgIit0KyIuIil9fSksZGVsZXRlIHMuc2VydmljZS5pbnN0YW5jZSxPYmplY3QuZnJlZXplKHMuc2VydmljZSksc312YXIgaW5zdGFuY2VUeXBlTWFwPXt9O2Z1bmN0aW9uIGdldEZyYW1ld29ya1R5cGUoZSl7cmV0dXJuIGluc3RhbmNlVHlwZU1hcFtlXX12YXIgU2hhcmVkT2JqZWN0PXt1aWQ6MH07ZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsdCxuKXt2b2lkIDA9PT10JiYodD17fSk7dmFyIHI9bmV3IFdlZXhJbnN0YW5jZShlLHQsbik7aW5zdGFuY2VUeXBlTWFwW2VdPSJWdWUiO3ZhciBpPXJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrcy5WdWU7aWYoIWkpcmV0dXJuIG5ldyBFcnJvcignW0pTIEZyYW1ld29ya10gSW52YWxpZCBidW5kbGUgdHlwZSAiVnVlIi4nKTt2YXIgbz1jcmVhdGVTZXJ2aWNlcyhlLHt3ZWV4OnIsY29uZmlnOnQsY3JlYXRlZDpEYXRlLm5vdygpLGZyYW1ld29yazoiVnVlIixidW5kbGVUeXBlOiJWdWUifSxydW50aW1lQ29uZmlnKTtPYmplY3QuZnJlZXplKG8pO3ZhciBhPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmFzc2lnbihhLG8se1NoYXJlZE9iamVjdDpTaGFyZWRPYmplY3Qsd2VleDpyLGdldEpTRk1WZXJzaW9uOmdldEpTRk1WZXJzaW9uLHJlcXVpcmVNb2R1bGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHIucmVxdWlyZU1vZHVsZS5hcHBseShyLGUpfSxfX1dFRVhfQ0FMTF9KQVZBU0NSSVBUX186cmVjZWl2ZVRhc2tzLHNlcnZpY2VzOm99KSxPYmplY3QuZnJlZXplKGEpO3ZhciBzPU9iamVjdC5hc3NpZ24oe30sYSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGkuY3JlYXRlSW5zdGFuY2VDb250ZXh0JiZPYmplY3QuYXNzaWduKHMsaS5jcmVhdGVJbnN0YW5jZUNvbnRleHQoZSxhLG4pKSxpbml0JDIocyksT2JqZWN0LmZyZWV6ZShzKSxzfWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGUsdCxuLHIpe2lmKGluc3RhbmNlVHlwZU1hcFtlXSlyZXR1cm4gbmV3IEVycm9yKCdUaGUgaW5zdGFuY2UgaWQgIicrZSsnIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQhJyk7dmFyIGk9IlZ1ZSI7aW5zdGFuY2VUeXBlTWFwW2VdPWksKG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShufHx7fSkpKS5lbnY9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnbG9iYWwuV1hFbnZpcm9ubWVudHx8e30pKSxuLmJ1bmRsZVR5cGU9aTt2YXIgbz1ydW50aW1lQ29uZmlnLmZyYW1ld29ya3MuVnVlO2lmKCFvKXJldHVybiBuZXcgRXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEludmFsaWQgYnVuZGxlIHR5cGUgIlZ1ZSIuJyk7dmFyIGE9Y3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsbixyKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygby5jcmVhdGVJbnN0YW5jZSlyZXR1cm4gby5jcmVhdGVJbnN0YW5jZShlLHQsbixyLGEpO3J1bkluQ29udGV4dCh0LGEpfWZ1bmN0aW9uIHJ1bkluQ29udGV4dChlLHQpe3ZhciBuPVtdLHI9W107Zm9yKHZhciBpIGluIHQpbi5wdXNoKGkpLHIucHVzaCh0W2ldKTt2YXIgbz0iXG4gICAgKGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICAgICIrZSsiXG4gICAgfSkoT2JqZWN0LmNyZWF0ZSh0aGlzKSlcbiAgIjtyZXR1cm4obmV3KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KEZ1bmN0aW9uLFtudWxsXS5jb25jYXQobixbb10pKSkpLmFwcGx5KHZvaWQgMCxyKX1mdW5jdGlvbiBnZXRSb290KGUpe3ZhciB0PWdldERvYyhlKTt0cnl7aWYodCYmdC5ib2R5KXJldHVybiB0LmJvZHkudG9KU09OKCl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGdldCB0aGUgdmlydHVhbCBkb20gdHJlZS4iKX19dmFyIG1ldGhvZHM9e2NyZWF0ZUluc3RhbmNlOmNyZWF0ZUluc3RhbmNlLGNyZWF0ZUluc3RhbmNlQ29udGV4dDpjcmVhdGVJbnN0YW5jZUNvbnRleHQsZ2V0Um9vdDpnZXRSb290LGdldEpTRk1WZXJzaW9uOmdldEpTRk1WZXJzaW9uLGdldERvY3VtZW50OmdldERvYyxyZWdpc3RlclNlcnZpY2U6cmVnaXN0ZXIsdW5yZWdpc3RlclNlcnZpY2U6dW5yZWdpc3RlcixjYWxsSlM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1mcmFtZXdvcmtzW2dldEZyYW1ld29ya1R5cGUoZSldO3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5yZWNlaXZlVGFza3M/bi5yZWNlaXZlVGFza3MoZSx0KTpyZWNlaXZlVGFza3MoZSx0KX19O2Z1bmN0aW9uIGdlbkluc3RhbmNlKHMpe21ldGhvZHNbc109ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG4scj1lWzBdLGk9Z2V0RnJhbWV3b3JrVHlwZShyKTtpZihpJiZmcmFtZXdvcmtzW2ldKXt2YXIgbz0obj1mcmFtZXdvcmtzW2ldKVtzXS5hcHBseShuLGUpLGE9e2ZyYW1ld29yazppfTtyZXR1cm4icmVmcmVzaEluc3RhbmNlIj09PXM/c2VydmljZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucmVmcmVzaDt0JiZ0KHIse2luZm86YSxydW50aW1lOnJ1bnRpbWVDb25maWd9KX0pOiJkZXN0cm95SW5zdGFuY2UiPT09cyYmKHNlcnZpY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmRlc3Ryb3k7dCYmdChyLHtpbmZvOmEscnVudGltZTpydW50aW1lQ29uZmlnfSl9KSxkZWxldGUgaW5zdGFuY2VUeXBlTWFwW3JdKSxvfX19ZnVuY3Rpb24gYWRhcHRNZXRob2QoaSxvKXttZXRob2RzW2ldPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2Zvcih2YXIgbiBpbiJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvLmFwcGx5KHZvaWQgMCxlKSxydW50aW1lQ29uZmlnLmZyYW1ld29ya3Mpe3ZhciByPXJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrc1tuXTtyJiZyW2ldJiZyW2ldLmFwcGx5KHIsZSl9fX1mdW5jdGlvbiBpbml0JCQxKGUpe2Zvcih2YXIgdCBpbiBmcmFtZXdvcmtzPShydW50aW1lQ29uZmlnPWV8fHt9KS5mcmFtZXdvcmtzfHx7fSxpbml0JDEoKSxmcmFtZXdvcmtzKXt2YXIgbj1mcmFtZXdvcmtzW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuLmluaXQpdHJ5e24uaW5pdChlKX1jYXRjaChlKXt9fXJldHVybiBhZGFwdE1ldGhvZCgicmVnaXN0ZXJDb21wb25lbnRzIixyZWdpc3RlckNvbXBvbmVudHMpLGFkYXB0TWV0aG9kKCJyZWdpc3Rlck1vZHVsZXMiLHJlZ2lzdGVyTW9kdWxlcyksYWRhcHRNZXRob2QoInJlZ2lzdGVyTWV0aG9kcyIpLFsiZGVzdHJveUluc3RhbmNlIiwicmVmcmVzaEluc3RhbmNlIl0uZm9yRWFjaChnZW5JbnN0YW5jZSksbWV0aG9kc312YXIgY29uZmlnPXtEb2N1bWVudDpEb2N1bWVudCxFbGVtZW50OkVsZW1lbnQsQ29tbWVudDpDb21tZW50LExpc3RlbmVyOkxpc3RlbmVyLFRhc2tDZW50ZXI6VGFza0NlbnRlcixzZW5kVGFza3M6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGNhbGxOYXRpdmU/Y2FsbE5hdGl2ZS5hcHBseSh2b2lkIDAsZSk6KGdsb2JhbC5jYWxsTmF0aXZlfHxmdW5jdGlvbigpe30pLmFwcGx5KHZvaWQgMCxlKX19O2Z1bmN0aW9uIGZyZWV6ZVByb3RvdHlwZSgpe09iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQpLE9iamVjdC5mcmVlemUoY29uZmlnLkxpc3RlbmVyKSxPYmplY3QuZnJlZXplKGNvbmZpZy5Eb2N1bWVudC5wcm90b3R5cGUpLE9iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQucHJvdG90eXBlKSxPYmplY3QuZnJlZXplKGNvbmZpZy5MaXN0ZW5lci5wcm90b3R5cGUpfURvY3VtZW50LmhhbmRsZXI9Y29uZmlnLnNlbmRUYXNrczt2YXIgcnVudGltZT17c2VydmljZTp7cmVnaXN0ZXI6cmVnaXN0ZXIsdW5yZWdpc3Rlcjp1bnJlZ2lzdGVyLGhhczpoYXN9LGZyZWV6ZVByb3RvdHlwZTpmcmVlemVQcm90b3R5cGUsaW5pdDppbml0JCQxLGNvbmZpZzpjb25maWd9O2Z1bmN0aW9uIE1lc3NhZ2VFdmVudChlLHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLnR5cGU9ZXx8Im1lc3NhZ2UiLHRoaXMuZGF0YT10LmRhdGF8fG51bGwsdGhpcy5vcmlnaW49dC5vcmlnaW58fCIiLHRoaXMuc291cmNlPXQuc291cmNlfHxudWxsLHRoaXMucG9ydHM9dC5wb3J0c3x8W10sdGhpcy50YXJnZXQ9bnVsbCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfXZhciBjaGFubmVscz17fSxpbnN0YW5jZXM9e307ZnVuY3Rpb24gQnJvYWRjYXN0Q2hhbm5lbCQxKCl7fUJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUucG9zdE1lc3NhZ2U9ZnVuY3Rpb24oZSl7aWYodGhpcy5fY2xvc2VkKXRocm93IG5ldyBFcnJvcignQnJvYWRjYXN0Q2hhbm5lbCAiJyt0aGlzLm5hbWUrJyIgaXMgY2xvc2VkLicpO3ZhciB0PWNoYW5uZWxzW3RoaXMubmFtZV07aWYodCYmdC5sZW5ndGgpZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciByPXRbbl07ci5fY2xvc2VkfHxyPT09dGhpc3x8ImZ1bmN0aW9uIj09dHlwZW9mIHIub25tZXNzYWdlJiZyLm9ubWVzc2FnZShuZXcgTWVzc2FnZUV2ZW50KCJtZXNzYWdlIix7ZGF0YTplfSkpfX0sQnJvYWRjYXN0Q2hhbm5lbCQxLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2Nsb3NlZCYmKHRoaXMuX2Nsb3NlZD0hMCxjaGFubmVsc1t0aGlzLm5hbWVdKSl7dmFyIGU9Y2hhbm5lbHNbdGhpcy5uYW1lXS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10fSk7ZS5sZW5ndGg/Y2hhbm5lbHNbdGhpcy5uYW1lXT1lOmRlbGV0ZSBjaGFubmVsc1t0aGlzLm5hbWVdfX07dmFyIEJyb2FkY2FzdENoYW5uZWwkMj17Y3JlYXRlOmZ1bmN0aW9uKHQsZSxuKXtpZihpbnN0YW5jZXNbdF09W10sImZ1bmN0aW9uIj09dHlwZW9mIGdsb2JhbC5Ccm9hZGNhc3RDaGFubmVsKXJldHVybnt9O3ZhciByPXtCcm9hZGNhc3RDaGFubmVsOmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITEsdmFsdWU6U3RyaW5nKGUpfSksdGhpcy5fY2xvc2VkPSExLHRoaXMub25tZXNzYWdlPW51bGwsY2hhbm5lbHNbdGhpcy5uYW1lXXx8KGNoYW5uZWxzW3RoaXMubmFtZV09W10pLGNoYW5uZWxzW3RoaXMubmFtZV0ucHVzaCh0aGlzKSxpbnN0YW5jZXNbdF0ucHVzaCh0aGlzKX19O3JldHVybiByLkJyb2FkY2FzdENoYW5uZWwucHJvdG90eXBlPUJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUse2luc3RhbmNlOnJ9fSxkZXN0cm95OmZ1bmN0aW9uKGUsdCl7aW5zdGFuY2VzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2UoKX0pLGRlbGV0ZSBpbnN0YW5jZXNbZV19fSxzZXJ2aWNlcyQxPXtCcm9hZGNhc3RDaGFubmVsOkJyb2FkY2FzdENoYW5uZWwkMn0seFhiLHlYYixBWGIsQlhiO2Z1bmN0aW9uIHNldHVwKGUpe3ZhciB0PXJ1bnRpbWUuaW5pdCxuPXJ1bnRpbWUuY29uZmlnO24uZnJhbWV3b3Jrcz1lO3ZhciByPXN1YnZlcnNpb24ubmF0aXZlLGk9c3VidmVyc2lvbi50cmFuc2Zvcm1lcjtmb3IodmFyIG8gaW4gc2VydmljZXMkMSlydW50aW1lLnNlcnZpY2UucmVnaXN0ZXIobyxzZXJ2aWNlcyQxW29dKTtydW50aW1lLmZyZWV6ZVByb3RvdHlwZSgpLGdsb2JhbC5mcmFtZXdvcmtWZXJzaW9uPXIsZ2xvYmFsLnRyYW5zZm9ybWVyVmVyc2lvbj1pO3ZhciBhPXQobikscz1mdW5jdGlvbihyKXtnbG9iYWxbcl09ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG49YVtyXS5hcHBseShhLGUpO3JldHVybiBuIGluc3RhbmNlb2YgRXJyb3ImJmNvbnNvbGUuZXJyb3Iobi50b1N0cmluZygpKSxufX07Zm9yKHZhciBjIGluIGEpcyhjKX1mdW5jdGlvbiB1bndyYXBFeHBvcnRzKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZSx0KXtyZXR1cm4gZSh0PXtleHBvcnRzOnt9fSx0LmV4cG9ydHMpLHQuZXhwb3J0c31BcnJheS5mcm9tfHwoQXJyYXkuZnJvbT0oeFhiPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcseVhiPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfHwiW29iamVjdCBGdW5jdGlvbl0iPT09eFhiLmNhbGwoZSl9LEFYYj1NYXRoLnBvdygyLDUzKS0xLEJYYj1mdW5jdGlvbihlKXt2YXIgdCxuPSh0PU51bWJlcihlKSxpc05hTih0KT8wOjAhPT10JiZpc0Zpbml0ZSh0KT8oMDx0PzE6LTEpKk1hdGguZmxvb3IoTWF0aC5hYnModCkpOnQpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChuLDApLEFYYil9LGZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdChlKTtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LmZyb20gcmVxdWlyZXMgYW4gYXJyYXktbGlrZSBvYmplY3QgLSBub3QgbnVsbCBvciB1bmRlZmluZWQiKTt2YXIgbixyPTE8YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMV06dm9pZCAwO2lmKHZvaWQgMCE9PXIpe2lmKCF5WGIocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24iKTsyPGFyZ3VtZW50cy5sZW5ndGgmJihuPWFyZ3VtZW50c1syXSl9Zm9yKHZhciBpLG89QlhiKHQubGVuZ3RoKSxhPXlYYih0aGlzKT9PYmplY3QobmV3IHRoaXMobykpOm5ldyBBcnJheShvKSxzPTA7czxvOylpPXRbc10sYVtzXT1yP3ZvaWQgMD09PW4/cihpLHMpOnIuY2FsbChuLGkscyk6aSxzKz0xO3JldHVybiBhLmxlbmd0aD1vLGF9KSk7dmFyIF9nbG9iYWw9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOyJudW1iZXIiPT10eXBlb2YgX19nJiYoX19nPXQpfSksX2NvcmU9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5leHBvcnRzPXt2ZXJzaW9uOiIyLjUuNyJ9OyJudW1iZXIiPT10eXBlb2YgX19lJiYoX19lPXQpfSksX2NvcmVfMT1fY29yZS52ZXJzaW9uLF9pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/bnVsbCE9PWU6ImZ1bmN0aW9uIj09dHlwZW9mIGV9LF9hbk9iamVjdD1mdW5jdGlvbihlKXtpZighX2lzT2JqZWN0KGUpKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGFuIG9iamVjdCEiKTtyZXR1cm4gZX0sX2ZhaWxzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4hIWUoKX1jYXRjaChlKXtyZXR1cm4hMH19LF9kZXNjcmlwdG9ycz0hX2ZhaWxzKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSxkb2N1bWVudCQxPV9nbG9iYWwuZG9jdW1lbnQsaXM9X2lzT2JqZWN0KGRvY3VtZW50JDEpJiZfaXNPYmplY3QoZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KSxfZG9tQ3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBpcz9kb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoZSk6e319LF9pZThEb21EZWZpbmU9IV9kZXNjcmlwdG9ycyYmIV9mYWlscyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoX2RvbUNyZWF0ZSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSksX3RvUHJpbWl0aXZlPWZ1bmN0aW9uKGUsdCl7aWYoIV9pc09iamVjdChlKSlyZXR1cm4gZTt2YXIgbixyO2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUudG9TdHJpbmcpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjtpZigiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnZhbHVlT2YpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjtpZighdCYmImZ1bmN0aW9uIj09dHlwZW9mKG49ZS50b1N0cmluZykmJiFfaXNPYmplY3Qocj1uLmNhbGwoZSkpKXJldHVybiByO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9LGRQPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxmPV9kZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4pe2lmKF9hbk9iamVjdChlKSx0PV90b1ByaW1pdGl2ZSh0LCEwKSxfYW5PYmplY3QobiksX2llOERvbURlZmluZSl0cnl7cmV0dXJuIGRQKGUsdCxuKX1jYXRjaChlKXt9aWYoImdldCJpbiBufHwic2V0ImluIG4pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEiKTtyZXR1cm4idmFsdWUiaW4gbiYmKGVbdF09bi52YWx1ZSksZX0sX29iamVjdERwPXtmOmZ9LF9wcm9wZXJ0eURlc2M9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZW51bWVyYWJsZTohKDEmZSksY29uZmlndXJhYmxlOiEoMiZlKSx3cml0YWJsZTohKDQmZSksdmFsdWU6dH19LF9oaWRlPV9kZXNjcmlwdG9ycz9mdW5jdGlvbihlLHQsbil7cmV0dXJuIF9vYmplY3REcC5mKGUsdCxfcHJvcGVydHlEZXNjKDEsbikpfTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbdF09bixlfSxoYXNPd25Qcm9wZXJ0eT17fS5oYXNPd25Qcm9wZXJ0eSxfaGFzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZSx0KX0saWQ9MCxweD1NYXRoLnJhbmRvbSgpLF91aWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIlN5bWJvbCgiLmNvbmNhdCh2b2lkIDA9PT1lPyIiOmUsIilfIiwoKytpZCtweCkudG9TdHJpbmcoMzYpKX0sX3JlZGVmaW5lPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciBvPV91aWQoInNyYyIpLHQ9InRvU3RyaW5nIixuPUZ1bmN0aW9uW3RdLGE9KCIiK24pLnNwbGl0KHQpO19jb3JlLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbChlKX0sKGUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgbjtpJiYoX2hhcyhuLCJuYW1lIil8fF9oaWRlKG4sIm5hbWUiLHQpKSxlW3RdIT09biYmKGkmJihfaGFzKG4sbyl8fF9oaWRlKG4sbyxlW3RdPyIiK2VbdF06YS5qb2luKFN0cmluZyh0KSkpKSxlPT09X2dsb2JhbD9lW3RdPW46cj9lW3RdP2VbdF09bjpfaGlkZShlLHQsbik6KGRlbGV0ZSBlW3RdLF9oaWRlKGUsdCxuKSkpfSkoRnVuY3Rpb24ucHJvdG90eXBlLHQsZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdGhpc1tvXXx8bi5jYWxsKHRoaXMpfSl9KSxfYUZ1bmN0aW9uPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGEgZnVuY3Rpb24hIik7cmV0dXJuIGV9LF9jdHg9ZnVuY3Rpb24ocixpLGUpe2lmKF9hRnVuY3Rpb24ociksdm9pZCAwPT09aSlyZXR1cm4gcjtzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gci5jYWxsKGksZSl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5jYWxsKGksZSx0KX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuY2FsbChpLGUsdCxuKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHIuYXBwbHkoaSxhcmd1bWVudHMpfX0sUFJPVE9UWVBFPSJwcm90b3R5cGUiLCRleHBvcnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZSYkZXhwb3J0LkYsYz1lJiRleHBvcnQuRyx1PWUmJGV4cG9ydC5TLGw9ZSYkZXhwb3J0LlAsZD1lJiRleHBvcnQuQixmPWM/X2dsb2JhbDp1P19nbG9iYWxbdF18fChfZ2xvYmFsW3RdPXt9KTooX2dsb2JhbFt0XXx8e30pW1BST1RPVFlQRV0scD1jP19jb3JlOl9jb3JlW3RdfHwoX2NvcmVbdF09e30pLGg9cFtQUk9UT1RZUEVdfHwocFtQUk9UT1RZUEVdPXt9KTtmb3IociBpbiBjJiYobj10KSxuKW89KChpPSFzJiZmJiZ2b2lkIDAhPT1mW3JdKT9mOm4pW3JdLGE9ZCYmaT9fY3R4KG8sX2dsb2JhbCk6bCYmImZ1bmN0aW9uIj09dHlwZW9mIG8/X2N0eChGdW5jdGlvbi5jYWxsLG8pOm8sZiYmX3JlZGVmaW5lKGYscixvLGUmJGV4cG9ydC5VKSxwW3JdIT1vJiZfaGlkZShwLHIsYSksbCYmaFtyXSE9byYmKGhbcl09byl9O19nbG9iYWwuY29yZT1fY29yZSwkZXhwb3J0LkY9MSwkZXhwb3J0Lkc9MiwkZXhwb3J0LlM9NCwkZXhwb3J0LlA9OCwkZXhwb3J0LkI9MTYsJGV4cG9ydC5XPTMyLCRleHBvcnQuVT02NCwkZXhwb3J0LlI9MTI4O3ZhciBfZXhwb3J0PSRleHBvcnQsdG9TdHJpbmckMT17fS50b1N0cmluZyxfY29mPWZ1bmN0aW9uKGUpe3JldHVybiB0b1N0cmluZyQxLmNhbGwoZSkuc2xpY2UoOCwtMSl9LF9pb2JqZWN0PU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApP09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09X2NvZihlKT9lLnNwbGl0KCIiKTpPYmplY3QoZSl9LF9kZWZpbmVkPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIitlKTtyZXR1cm4gZX0sX3RvSW9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gX2lvYmplY3QoX2RlZmluZWQoZSkpfSxjZWlsPU1hdGguY2VpbCxmbG9vcj1NYXRoLmZsb29yLF90b0ludGVnZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGlzTmFOKGU9K2UpPzA6KDA8ZT9mbG9vcjpjZWlsKShlKX0sbWluPU1hdGgubWluLF90b0xlbmd0aD1mdW5jdGlvbihlKXtyZXR1cm4gMDxlP21pbihfdG9JbnRlZ2VyKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9LG1heD1NYXRoLm1heCxtaW4kMT1NYXRoLm1pbixfdG9BYnNvbHV0ZUluZGV4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGU9X3RvSW50ZWdlcihlKSk8MD9tYXgoZSt0LDApOm1pbiQxKGUsdCl9LF9hcnJheUluY2x1ZGVzPWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1fdG9Jb2JqZWN0KGUpLG89X3RvTGVuZ3RoKGkubGVuZ3RoKSxhPV90b0Fic29sdXRlSW5kZXgobixvKTtpZihzJiZ0IT10KXtmb3IoO2E8bzspaWYoKHI9aVthKytdKSE9cilyZXR1cm4hMH1lbHNlIGZvcig7YTxvO2ErKylpZigoc3x8YSBpbiBpKSYmaVthXT09PXQpcmV0dXJuIHN8fGF8fDA7cmV0dXJuIXMmJi0xfX0sX2xpYnJhcnk9ITEsX3NoYXJlZD1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgdD0iX19jb3JlLWpzX3NoYXJlZF9fIixuPV9nbG9iYWxbdF18fChfZ2xvYmFsW3RdPXt9KTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5bZV18fChuW2VdPXZvaWQgMCE9PXQ/dDp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOl9jb3JlLnZlcnNpb24sbW9kZTpfbGlicmFyeT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE4IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSksc2hhcmVkJDI9X3NoYXJlZCgia2V5cyIpLF9zaGFyZWRLZXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHNoYXJlZCQyW2VdfHwoc2hhcmVkJDJbZV09X3VpZChlKSl9LGFycmF5SW5kZXhPZj1fYXJyYXlJbmNsdWRlcyghMSksSUVfUFJPVE89X3NoYXJlZEtleSgiSUVfUFJPVE8iKSxfb2JqZWN0S2V5c0ludGVybmFsPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1fdG9Jb2JqZWN0KGUpLGk9MCxvPVtdO2ZvcihuIGluIHIpbiE9SUVfUFJPVE8mJl9oYXMocixuKSYmby5wdXNoKG4pO2Zvcig7dC5sZW5ndGg+aTspX2hhcyhyLG49dFtpKytdKSYmKH5hcnJheUluZGV4T2YobyxuKXx8by5wdXNoKG4pKTtyZXR1cm4gb30sX2VudW1CdWdLZXlzPSJjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YiLnNwbGl0KCIsIiksX29iamVjdEtleXM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3JldHVybiBfb2JqZWN0S2V5c0ludGVybmFsKGUsX2VudW1CdWdLZXlzKX0sZiQxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsX29iamVjdEdvcHM9e2Y6ZiQxfSxmJDI9e30ucHJvcGVydHlJc0VudW1lcmFibGUsX29iamVjdFBpZT17ZjpmJDJ9LF90b09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KF9kZWZpbmVkKGUpKX0sJGFzc2lnbj1PYmplY3QuYXNzaWduLF9vYmplY3RBc3NpZ249ISRhc3NpZ258fF9mYWlscyhmdW5jdGlvbigpe3ZhciBlPXt9LHQ9e30sbj1TeW1ib2woKSxyPSJhYmNkZWZnaGlqa2xtbm9wcXJzdCI7cmV0dXJuIGVbbl09NyxyLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09ZX0pLDchPSRhc3NpZ24oe30sZSlbbl18fE9iamVjdC5rZXlzKCRhc3NpZ24oe30sdCkpLmpvaW4oIiIpIT1yfSk/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49YXJndW1lbnRzLHI9X3RvT2JqZWN0KGUpLGk9YXJndW1lbnRzLmxlbmd0aCxvPTEsYT1fb2JqZWN0R29wcy5mLHM9X29iamVjdFBpZS5mO288aTspZm9yKHZhciBjLHU9X2lvYmplY3QobltvKytdKSxsPWE/X29iamVjdEtleXModSkuY29uY2F0KGEodSkpOl9vYmplY3RLZXlzKHUpLGQ9bC5sZW5ndGgsZj0wO2Y8ZDspcy5jYWxsKHUsYz1sW2YrK10pJiYocltjXT11W2NdKTtyZXR1cm4gcn06JGFzc2lnbjtfZXhwb3J0KF9leHBvcnQuUytfZXhwb3J0LkYsIk9iamVjdCIse2Fzc2lnbjpfb2JqZWN0QXNzaWdufSk7dmFyIGFzc2lnbj1fY29yZS5PYmplY3QuYXNzaWduO09iamVjdC5zZXRQcm90b3R5cGVPZnx8KE9iamVjdC5zZXRQcm90b3R5cGVPZj1mdW5jdGlvbih0LG4pe3ZhciByO2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4gci5jYWxsKGUsdCksZX10cnl7KHI9dC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodC5wcm90b3R5cGUsbikuc2V0KS5jYWxsKHt9LG51bGwpfWNhdGNoKGUpe2lmKHQucHJvdG90eXBlIT09e31bbl0pcmV0dXJuO3I9ZnVuY3Rpb24oZSl7dGhpc1tuXT1lfSxpLnBvbHlmaWxsPWkoaSh7fSxudWxsKSx0LnByb3RvdHlwZSlpbnN0YW5jZW9mIHR9cmV0dXJuIGl9KE9iamVjdCwiX19wcm90b19fIikpO3ZhciBXWEVudmlyb25tZW50JDE9Z2xvYmFsLldYRW52aXJvbm1lbnQ7dm9pZCAwPT09V1hFbnZpcm9ubWVudCQxfHwiaU9TIiE9PVdYRW52aXJvbm1lbnQkMS5wbGF0Zm9ybXx8V1hFbnZpcm9ubWVudCQxLl9fZW5hYmxlX25hdGl2ZV9wcm9taXNlX198fChnbG9iYWwuUHJvbWlzZT12b2lkIDApO3ZhciBfd2tzPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PV9zaGFyZWQoIndrcyIpLG49X2dsb2JhbC5TeW1ib2wscj0iZnVuY3Rpb24iPT10eXBlb2YgbjsoZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfHwodFtlXT1yJiZuW2VdfHwocj9uOl91aWQpKCJTeW1ib2wuIitlKSl9KS5zdG9yZT10fSksVEFHPV93a3MoInRvU3RyaW5nVGFnIiksQVJHPSJBcmd1bWVudHMiPT1fY29mKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSksdHJ5R2V0PWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBlW3RdfWNhdGNoKGUpe319LF9jbGFzc29mPWZ1bmN0aW9uKGUpe3ZhciB0LG4scjtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPXRyeUdldCh0PU9iamVjdChlKSxUQUcpKT9uOkFSRz9fY29mKHQpOiJPYmplY3QiPT0ocj1fY29mKHQpKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY2FsbGVlPyJBcmd1bWVudHMiOnJ9LHRlc3Q9e307dGVzdFtfd2tzKCJ0b1N0cmluZ1RhZyIpXT0ieiIsdGVzdCsiIiE9IltvYmplY3Qgel0iJiZfcmVkZWZpbmUoT2JqZWN0LnByb3RvdHlwZSwidG9TdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIitfY2xhc3NvZih0aGlzKSsiXSJ9LCEwKTt2YXIgX3N0cmluZ0F0PWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1TdHJpbmcoX2RlZmluZWQoZSkpLG89X3RvSW50ZWdlcih0KSxhPWkubGVuZ3RoO3JldHVybiBvPDB8fGE8PW8/cz8iIjp2b2lkIDA6KG49aS5jaGFyQ29kZUF0KG8pKTw1NTI5Nnx8NTYzMTk8bnx8bysxPT09YXx8KHI9aS5jaGFyQ29kZUF0KG8rMSkpPDU2MzIwfHw1NzM0MzxyP3M/aS5jaGFyQXQobyk6bjpzP2kuc2xpY2UobyxvKzIpOnItNTYzMjArKG4tNTUyOTY8PDEwKSs2NTUzNn19LF9pdGVyYXRvcnM9e30sX29iamVjdERwcz1fZGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24oZSx0KXtfYW5PYmplY3QoZSk7Zm9yKHZhciBuLHI9X29iamVjdEtleXModCksaT1yLmxlbmd0aCxvPTA7bzxpOylfb2JqZWN0RHAuZihlLG49cltvKytdLHRbbl0pO3JldHVybiBlfSxkb2N1bWVudCQyPV9nbG9iYWwuZG9jdW1lbnQsX2h0bWw9ZG9jdW1lbnQkMiYmZG9jdW1lbnQkMi5kb2N1bWVudEVsZW1lbnQsSUVfUFJPVE8kMT1fc2hhcmVkS2V5KCJJRV9QUk9UTyIpLEVtcHR5PWZ1bmN0aW9uKCl7fSxQUk9UT1RZUEUkMT0icHJvdG90eXBlIixjcmVhdGVEaWN0PWZ1bmN0aW9uKCl7dmFyIGUsdD1fZG9tQ3JlYXRlKCJpZnJhbWUiKSxuPV9lbnVtQnVnS2V5cy5sZW5ndGg7Zm9yKHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsX2h0bWwuYXBwZW5kQ2hpbGQodCksdC5zcmM9ImphdmFzY3JpcHQ6IiwoZT10LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSxlLndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFwvc2NyaXB0PiIpLGUuY2xvc2UoKSxjcmVhdGVEaWN0PWUuRjtuLS07KWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRSQxXVtfZW51bUJ1Z0tleXNbbl1dO3JldHVybiBjcmVhdGVEaWN0KCl9LF9vYmplY3RDcmVhdGU9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gbnVsbCE9PWU/KEVtcHR5W1BST1RPVFlQRSQxXT1fYW5PYmplY3QoZSksbj1uZXcgRW1wdHksRW1wdHlbUFJPVE9UWVBFJDFdPW51bGwsbltJRV9QUk9UTyQxXT1lKTpuPWNyZWF0ZURpY3QoKSx2b2lkIDA9PT10P246X29iamVjdERwcyhuLHQpfSxkZWY9X29iamVjdERwLmYsVEFHJDE9X3drcygidG9TdHJpbmdUYWciKSxfc2V0VG9TdHJpbmdUYWc9ZnVuY3Rpb24oZSx0LG4pe2UmJiFfaGFzKGU9bj9lOmUucHJvdG90eXBlLFRBRyQxKSYmZGVmKGUsVEFHJDEse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTp0fSl9LEl0ZXJhdG9yUHJvdG90eXBlPXt9O19oaWRlKEl0ZXJhdG9yUHJvdG90eXBlLF93a3MoIml0ZXJhdG9yIiksZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBfaXRlckNyZWF0ZT1mdW5jdGlvbihlLHQsbil7ZS5wcm90b3R5cGU9X29iamVjdENyZWF0ZShJdGVyYXRvclByb3RvdHlwZSx7bmV4dDpfcHJvcGVydHlEZXNjKDEsbil9KSxfc2V0VG9TdHJpbmdUYWcoZSx0KyIgSXRlcmF0b3IiKX0sSUVfUFJPVE8kMj1fc2hhcmVkS2V5KCJJRV9QUk9UTyIpLE9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGUsX29iamVjdEdwbz1PYmplY3QuZ2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGUpe3JldHVybiBlPV90b09iamVjdChlKSxfaGFzKGUsSUVfUFJPVE8kMik/ZVtJRV9QUk9UTyQyXToiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3RvciYmZSBpbnN0YW5jZW9mIGUuY29uc3RydWN0b3I/ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6ZSBpbnN0YW5jZW9mIE9iamVjdD9PYmplY3RQcm90bzpudWxsfSxJVEVSQVRPUj1fd2tzKCJpdGVyYXRvciIpLEJVR0dZPSEoW10ua2V5cyYmIm5leHQiaW5bXS5rZXlzKCkpLEZGX0lURVJBVE9SPSJAQGl0ZXJhdG9yIixLRVlTPSJrZXlzIixWQUxVRVM9InZhbHVlcyIscmV0dXJuVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxfaXRlckRlZmluZT1mdW5jdGlvbihlLHQsbixyLGksbyxhKXtfaXRlckNyZWF0ZShuLHQscik7dmFyIHMsYyx1LGw9ZnVuY3Rpb24oZSl7aWYoIUJVR0dZJiZlIGluIGgpcmV0dXJuIGhbZV07c3dpdGNoKGUpe2Nhc2UgS0VZUzpjYXNlIFZBTFVFUzpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyxlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsZSl9fSxkPXQrIiBJdGVyYXRvciIsZj1pPT1WQUxVRVMscD0hMSxoPWUucHJvdG90eXBlLHY9aFtJVEVSQVRPUl18fGhbRkZfSVRFUkFUT1JdfHxpJiZoW2ldLGc9dnx8bChpKSxtPWk/Zj9sKCJlbnRyaWVzIik6Zzp2b2lkIDAseT0iQXJyYXkiPT10JiZoLmVudHJpZXN8fHY7aWYoeSYmKHU9X29iamVjdEdwbyh5LmNhbGwobmV3IGUpKSkhPT1PYmplY3QucHJvdG90eXBlJiZ1Lm5leHQmJihfc2V0VG9TdHJpbmdUYWcodSxkLCEwKSxfbGlicmFyeXx8ImZ1bmN0aW9uIj09dHlwZW9mIHVbSVRFUkFUT1JdfHxfaGlkZSh1LElURVJBVE9SLHJldHVyblRoaXMpKSxmJiZ2JiZ2Lm5hbWUhPT1WQUxVRVMmJihwPSEwLGc9ZnVuY3Rpb24oKXtyZXR1cm4gdi5jYWxsKHRoaXMpfSksX2xpYnJhcnkmJiFhfHwhQlVHR1kmJiFwJiZoW0lURVJBVE9SXXx8X2hpZGUoaCxJVEVSQVRPUixnKSxfaXRlcmF0b3JzW3RdPWcsX2l0ZXJhdG9yc1tkXT1yZXR1cm5UaGlzLGkpaWYocz17dmFsdWVzOmY/ZzpsKFZBTFVFUyksa2V5czpvP2c6bChLRVlTKSxlbnRyaWVzOm19LGEpZm9yKGMgaW4gcyljIGluIGh8fF9yZWRlZmluZShoLGMsc1tjXSk7ZWxzZSBfZXhwb3J0KF9leHBvcnQuUCtfZXhwb3J0LkYqKEJVR0dZfHxwKSx0LHMpO3JldHVybiBzfSwkYXQ9X3N0cmluZ0F0KCEwKTtfaXRlckRlZmluZShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24oZSl7dGhpcy5fdD1TdHJpbmcoZSksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5fdCxuPXRoaXMuX2k7cmV0dXJuIG4+PXQubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KGU9JGF0KHQsbiksdGhpcy5faSs9ZS5sZW5ndGgse3ZhbHVlOmUsZG9uZTohMX0pfSk7dmFyIFVOU0NPUEFCTEVTPV93a3MoInVuc2NvcGFibGVzIiksQXJyYXlQcm90bz1BcnJheS5wcm90b3R5cGU7bnVsbD09QXJyYXlQcm90b1tVTlNDT1BBQkxFU10mJl9oaWRlKEFycmF5UHJvdG8sVU5TQ09QQUJMRVMse30pO3ZhciBfYWRkVG9VbnNjb3BhYmxlcz1mdW5jdGlvbihlKXtBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtlXT0hMH0sX2l0ZXJTdGVwPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3ZhbHVlOnQsZG9uZTohIWV9fSxlczZfYXJyYXlfaXRlcmF0b3I9X2l0ZXJEZWZpbmUoQXJyYXksIkFycmF5IixmdW5jdGlvbihlLHQpe3RoaXMuX3Q9X3RvSW9iamVjdChlKSx0aGlzLl9pPTAsdGhpcy5faz10fSxmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3QsdD10aGlzLl9rLG49dGhpcy5faSsrO3JldHVybiFlfHxuPj1lLmxlbmd0aD8odGhpcy5fdD12b2lkIDAsX2l0ZXJTdGVwKDEpKTpfaXRlclN0ZXAoMCwia2V5cyI9PXQ/bjoidmFsdWVzIj09dD9lW25dOltuLGVbbl1dKX0sInZhbHVlcyIpO19pdGVyYXRvcnMuQXJndW1lbnRzPV9pdGVyYXRvcnMuQXJyYXksX2FkZFRvVW5zY29wYWJsZXMoImtleXMiKSxfYWRkVG9VbnNjb3BhYmxlcygidmFsdWVzIiksX2FkZFRvVW5zY29wYWJsZXMoImVudHJpZXMiKTtmb3IodmFyIElURVJBVE9SJDE9X3drcygiaXRlcmF0b3IiKSxUT19TVFJJTkdfVEFHPV93a3MoInRvU3RyaW5nVGFnIiksQXJyYXlWYWx1ZXM9X2l0ZXJhdG9ycy5BcnJheSxET01JdGVyYWJsZXM9e0NTU1J1bGVMaXN0OiEwLENTU1N0eWxlRGVjbGFyYXRpb246ITEsQ1NTVmFsdWVMaXN0OiExLENsaWVudFJlY3RMaXN0OiExLERPTVJlY3RMaXN0OiExLERPTVN0cmluZ0xpc3Q6ITEsRE9NVG9rZW5MaXN0OiEwLERhdGFUcmFuc2Zlckl0ZW1MaXN0OiExLEZpbGVMaXN0OiExLEhUTUxBbGxDb2xsZWN0aW9uOiExLEhUTUxDb2xsZWN0aW9uOiExLEhUTUxGb3JtRWxlbWVudDohMSxIVE1MU2VsZWN0RWxlbWVudDohMSxNZWRpYUxpc3Q6ITAsTWltZVR5cGVBcnJheTohMSxOYW1lZE5vZGVNYXA6ITEsTm9kZUxpc3Q6ITAsUGFpbnRSZXF1ZXN0TGlzdDohMSxQbHVnaW46ITEsUGx1Z2luQXJyYXk6ITEsU1ZHTGVuZ3RoTGlzdDohMSxTVkdOdW1iZXJMaXN0OiExLFNWR1BhdGhTZWdMaXN0OiExLFNWR1BvaW50TGlzdDohMSxTVkdTdHJpbmdMaXN0OiExLFNWR1RyYW5zZm9ybUxpc3Q6ITEsU291cmNlQnVmZmVyTGlzdDohMSxTdHlsZVNoZWV0TGlzdDohMCxUZXh0VHJhY2tDdWVMaXN0OiExLFRleHRUcmFja0xpc3Q6ITEsVG91Y2hMaXN0OiExfSxjb2xsZWN0aW9ucz1fb2JqZWN0S2V5cyhET01JdGVyYWJsZXMpLGk9MDtpPGNvbGxlY3Rpb25zLmxlbmd0aDtpKyspe3ZhciBOQU1FPWNvbGxlY3Rpb25zW2ldLGV4cGxpY2l0PURPTUl0ZXJhYmxlc1tOQU1FXSxDb2xsZWN0aW9uPV9nbG9iYWxbTkFNRV0scHJvdG89Q29sbGVjdGlvbiYmQ29sbGVjdGlvbi5wcm90b3R5cGUsa2V5O2lmKHByb3RvJiYocHJvdG9bSVRFUkFUT1IkMV18fF9oaWRlKHByb3RvLElURVJBVE9SJDEsQXJyYXlWYWx1ZXMpLHByb3RvW1RPX1NUUklOR19UQUddfHxfaGlkZShwcm90byxUT19TVFJJTkdfVEFHLE5BTUUpLF9pdGVyYXRvcnNbTkFNRV09QXJyYXlWYWx1ZXMsZXhwbGljaXQpKWZvcihrZXkgaW4gZXM2X2FycmF5X2l0ZXJhdG9yKXByb3RvW2tleV18fF9yZWRlZmluZShwcm90byxrZXksZXM2X2FycmF5X2l0ZXJhdG9yW2tleV0sITApfXZhciBfYW5JbnN0YW5jZT1mdW5jdGlvbihlLHQsbixyKXtpZighKGUgaW5zdGFuY2VvZiB0KXx8dm9pZCAwIT09ciYmciBpbiBlKXRocm93IFR5cGVFcnJvcihuKyI6IGluY29ycmVjdCBpbnZvY2F0aW9uISIpO3JldHVybiBlfSxfaXRlckNhbGw9ZnVuY3Rpb24odCxlLG4scil7dHJ5e3JldHVybiByP2UoX2FuT2JqZWN0KG4pWzBdLG5bMV0pOmUobil9Y2F0Y2goZSl7dmFyIGk9dC5yZXR1cm47dGhyb3cgdm9pZCAwIT09aSYmX2FuT2JqZWN0KGkuY2FsbCh0KSksZX19LElURVJBVE9SJDI9X3drcygiaXRlcmF0b3IiKSxBcnJheVByb3RvJDE9QXJyYXkucHJvdG90eXBlLF9pc0FycmF5SXRlcj1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZSYmKF9pdGVyYXRvcnMuQXJyYXk9PT1lfHxBcnJheVByb3RvJDFbSVRFUkFUT1IkMl09PT1lKX0sSVRFUkFUT1IkMz1fd2tzKCJpdGVyYXRvciIpLGNvcmVfZ2V0SXRlcmF0b3JNZXRob2Q9X2NvcmUuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24oZSl7aWYobnVsbCE9ZSlyZXR1cm4gZVtJVEVSQVRPUiQzXXx8ZVsiQEBpdGVyYXRvciJdfHxfaXRlcmF0b3JzW19jbGFzc29mKGUpXX0sX2Zvck9mPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciBmPXt9LHA9e30sdD1lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsYyx1PWk/ZnVuY3Rpb24oKXtyZXR1cm4gZX06Y29yZV9nZXRJdGVyYXRvck1ldGhvZChlKSxsPV9jdHgobixyLHQ/MjoxKSxkPTA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHUpdGhyb3cgVHlwZUVycm9yKGUrIiBpcyBub3QgaXRlcmFibGUhIik7aWYoX2lzQXJyYXlJdGVyKHUpKXtmb3Iobz1fdG9MZW5ndGgoZS5sZW5ndGgpO2Q8bztkKyspaWYoKGM9dD9sKF9hbk9iamVjdChhPWVbZF0pWzBdLGFbMV0pOmwoZVtkXSkpPT09Znx8Yz09PXApcmV0dXJuIGN9ZWxzZSBmb3Iocz11LmNhbGwoZSk7IShhPXMubmV4dCgpKS5kb25lOylpZigoYz1faXRlckNhbGwocyxsLGEudmFsdWUsdCkpPT09Znx8Yz09PXApcmV0dXJuIGN9O3QuQlJFQUs9Zix0LlJFVFVSTj1wfSksU1BFQ0lFUz1fd2tzKCJzcGVjaWVzIiksX3NwZWNpZXNDb25zdHJ1Y3Rvcj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9X2FuT2JqZWN0KGUpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1yfHxudWxsPT0obj1fYW5PYmplY3QocilbU1BFQ0lFU10pP3Q6X2FGdW5jdGlvbihuKX0sX2ludm9rZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dm9pZCAwPT09bjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gcj9lKCk6ZS5jYWxsKG4pO2Nhc2UgMTpyZXR1cm4gcj9lKHRbMF0pOmUuY2FsbChuLHRbMF0pO2Nhc2UgMjpyZXR1cm4gcj9lKHRbMF0sdFsxXSk6ZS5jYWxsKG4sdFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHI/ZSh0WzBdLHRbMV0sdFsyXSk6ZS5jYWxsKG4sdFswXSx0WzFdLHRbMl0pO2Nhc2UgNDpyZXR1cm4gcj9lKHRbMF0sdFsxXSx0WzJdLHRbM10pOmUuY2FsbChuLHRbMF0sdFsxXSx0WzJdLHRbM10pfXJldHVybiBlLmFwcGx5KG4sdCl9LHByb2Nlc3MkMj1fZ2xvYmFsLnByb2Nlc3Msc2V0VGFzaz1fZ2xvYmFsLnNldEltbWVkaWF0ZSxjbGVhclRhc2s9X2dsb2JhbC5jbGVhckltbWVkaWF0ZSxNZXNzYWdlQ2hhbm5lbD1fZ2xvYmFsLk1lc3NhZ2VDaGFubmVsLERpc3BhdGNoPV9nbG9iYWwuRGlzcGF0Y2gsY291bnRlcj0wLHF1ZXVlPXt9LE9OUkVBRFlTVEFURUNIQU5HRT0ib25yZWFkeXN0YXRlY2hhbmdlIixkZWZlcixjaGFubmVsJDEscG9ydCxydW49ZnVuY3Rpb24oKXt2YXIgZT0rdGhpcztpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIHQ9cXVldWVbZV07ZGVsZXRlIHF1ZXVlW2VdLHQoKX19LGxpc3RlbmVyPWZ1bmN0aW9uKGUpe3J1bi5jYWxsKGUuZGF0YSl9O3NldFRhc2smJmNsZWFyVGFza3x8KHNldFRhc2s9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWFyZ3VtZW50cyxuPVtdLHI9MTthcmd1bWVudHMubGVuZ3RoPnI7KW4ucHVzaCh0W3IrK10pO3JldHVybiBxdWV1ZVsrK2NvdW50ZXJdPWZ1bmN0aW9uKCl7X2ludm9rZSgiZnVuY3Rpb24iPT10eXBlb2YgZT9lOkZ1bmN0aW9uKGUpLG4pfSxkZWZlcihjb3VudGVyKSxjb3VudGVyfSxjbGVhclRhc2s9ZnVuY3Rpb24oZSl7ZGVsZXRlIHF1ZXVlW2VdfSwicHJvY2VzcyI9PV9jb2YocHJvY2VzcyQyKT9kZWZlcj1mdW5jdGlvbihlKXtwcm9jZXNzJDIubmV4dFRpY2soX2N0eChydW4sZSwxKSl9OkRpc3BhdGNoJiZEaXNwYXRjaC5ub3c/ZGVmZXI9ZnVuY3Rpb24oZSl7RGlzcGF0Y2gubm93KF9jdHgocnVuLGUsMSkpfTpNZXNzYWdlQ2hhbm5lbD8oY2hhbm5lbCQxPW5ldyBNZXNzYWdlQ2hhbm5lbCxwb3J0PWNoYW5uZWwkMS5wb3J0MixjaGFubmVsJDEucG9ydDEub25tZXNzYWdlPWxpc3RlbmVyLGRlZmVyPV9jdHgocG9ydC5wb3N0TWVzc2FnZSxwb3J0LDEpKTpfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBwb3N0TWVzc2FnZSYmIV9nbG9iYWwuaW1wb3J0U2NyaXB0cz8oZGVmZXI9ZnVuY3Rpb24oZSl7X2dsb2JhbC5wb3N0TWVzc2FnZShlKyIiLCIqIil9LF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbGlzdGVuZXIsITEpKTpkZWZlcj1PTlJFQURZU1RBVEVDSEFOR0UgaW4gX2RvbUNyZWF0ZSgic2NyaXB0Iik/ZnVuY3Rpb24oZSl7X2h0bWwuYXBwZW5kQ2hpbGQoX2RvbUNyZWF0ZSgic2NyaXB0IikpW09OUkVBRFlTVEFURUNIQU5HRV09ZnVuY3Rpb24oKXtfaHRtbC5yZW1vdmVDaGlsZCh0aGlzKSxydW4uY2FsbChlKX19OmZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoX2N0eChydW4sZSwxKSwwKX0pO3ZhciBfdGFzaz17c2V0OnNldFRhc2ssY2xlYXI6Y2xlYXJUYXNrfSxtYWNyb3Rhc2s9X3Rhc2suc2V0LE9ic2VydmVyPV9nbG9iYWwuTXV0YXRpb25PYnNlcnZlcnx8X2dsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHByb2Nlc3MkMz1fZ2xvYmFsLnByb2Nlc3MsUHJvbWlzZSQxPV9nbG9iYWwuUHJvbWlzZSxpc05vZGUkMT0icHJvY2VzcyI9PV9jb2YocHJvY2VzcyQzKSxfbWljcm90YXNrPWZ1bmN0aW9uKCl7dmFyIG4scixpLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2Zvcihpc05vZGUkMSYmKGU9cHJvY2VzcyQzLmRvbWFpbikmJmUuZXhpdCgpO247KXt0PW4uZm4sbj1uLm5leHQ7dHJ5e3QoKX1jYXRjaChlKXt0aHJvdyBuP2koKTpyPXZvaWQgMCxlfX1yPXZvaWQgMCxlJiZlLmVudGVyKCl9O2lmKGlzTm9kZSQxKWk9ZnVuY3Rpb24oKXtwcm9jZXNzJDMubmV4dFRpY2soZSl9O2Vsc2UgaWYoIU9ic2VydmVyfHxfZ2xvYmFsLm5hdmlnYXRvciYmX2dsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSlpZihQcm9taXNlJDEmJlByb21pc2UkMS5yZXNvbHZlKXt2YXIgdD1Qcm9taXNlJDEucmVzb2x2ZSh2b2lkIDApO2k9ZnVuY3Rpb24oKXt0LnRoZW4oZSl9fWVsc2UgaT1mdW5jdGlvbigpe21hY3JvdGFzay5jYWxsKF9nbG9iYWwsZSl9O2Vsc2V7dmFyIG89ITAsYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bmV3IE9ic2VydmVyKGUpLm9ic2VydmUoYSx7Y2hhcmFjdGVyRGF0YTohMH0pLGk9ZnVuY3Rpb24oKXthLmRhdGE9bz0hb319cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXtmbjplLG5leHQ6dm9pZCAwfTtyJiYoci5uZXh0PXQpLG58fChuPXQsaSgpKSxyPXR9fTtmdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShlKXt2YXIgbixyO3RoaXMucHJvbWlzZT1uZXcgZShmdW5jdGlvbihlLHQpe2lmKHZvaWQgMCE9PW58fHZvaWQgMCE9PXIpdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO249ZSxyPXR9KSx0aGlzLnJlc29sdmU9X2FGdW5jdGlvbihuKSx0aGlzLnJlamVjdD1fYUZ1bmN0aW9uKHIpfXZhciBmJDM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShlKX0sX25ld1Byb21pc2VDYXBhYmlsaXR5PXtmOmYkM30sX3BlcmZvcm09ZnVuY3Rpb24oZSl7dHJ5e3JldHVybntlOiExLHY6ZSgpfX1jYXRjaChlKXtyZXR1cm57ZTohMCx2OmV9fX0sbmF2aWdhdG9yJDE9X2dsb2JhbC5uYXZpZ2F0b3IsX3VzZXJBZ2VudD1uYXZpZ2F0b3IkMSYmbmF2aWdhdG9yJDEudXNlckFnZW50fHwiIixfcHJvbWlzZVJlc29sdmU9ZnVuY3Rpb24oZSx0KXtpZihfYW5PYmplY3QoZSksX2lzT2JqZWN0KHQpJiZ0LmNvbnN0cnVjdG9yPT09ZSlyZXR1cm4gdDt2YXIgbj1fbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihlKTtyZXR1cm4oMCxuLnJlc29sdmUpKHQpLG4ucHJvbWlzZX0sX3JlZGVmaW5lQWxsPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIgaW4gdClfcmVkZWZpbmUoZSxyLHRbcl0sbik7cmV0dXJuIGV9LFNQRUNJRVMkMT1fd2tzKCJzcGVjaWVzIiksX3NldFNwZWNpZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9X2dsb2JhbFtlXTtfZGVzY3JpcHRvcnMmJnQmJiF0W1NQRUNJRVMkMV0mJl9vYmplY3REcC5mKHQsU1BFQ0lFUyQxLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9LElURVJBVE9SJDQ9X3drcygiaXRlcmF0b3IiKSxTQUZFX0NMT1NJTkc9ITE7dHJ5e3ZhciByaXRlcj1bN11bSVRFUkFUT1IkNF0oKTtyaXRlci5yZXR1cm49ZnVuY3Rpb24oKXtTQUZFX0NMT1NJTkc9ITB9fWNhdGNoKGUpe312YXIgX2l0ZXJEZXRlY3Q9ZnVuY3Rpb24oZSx0KXtpZighdCYmIVNBRkVfQ0xPU0lORylyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIHI9WzddLGk9cltJVEVSQVRPUiQ0XSgpO2kubmV4dD1mdW5jdGlvbigpe3JldHVybntkb25lOm49ITB9fSxyW0lURVJBVE9SJDRdPWZ1bmN0aW9uKCl7cmV0dXJuIGl9LGUocil9Y2F0Y2goZSl7fXJldHVybiBufSx0YXNrPV90YXNrLnNldCxtaWNyb3Rhc2s9X21pY3JvdGFzaygpLFBST01JU0U9IlByb21pc2UiLFR5cGVFcnJvciQxPV9nbG9iYWwuVHlwZUVycm9yLHByb2Nlc3MkMT1fZ2xvYmFsLnByb2Nlc3MsdmVyc2lvbnM9cHJvY2VzcyQxJiZwcm9jZXNzJDEudmVyc2lvbnMsdjg9dmVyc2lvbnMmJnZlcnNpb25zLnY4fHwiIiwkUHJvbWlzZT1fZ2xvYmFsW1BST01JU0VdLGlzTm9kZT0icHJvY2VzcyI9PV9jbGFzc29mKHByb2Nlc3MkMSksZW1wdHk9ZnVuY3Rpb24oKXt9LEludGVybmFsLG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSxPd25Qcm9taXNlQ2FwYWJpbGl0eSxXcmFwcGVyLG5ld1Byb21pc2VDYXBhYmlsaXR5PW5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eT1fbmV3UHJvbWlzZUNhcGFiaWxpdHkuZixVU0VfTkFUSVZFPSEhZnVuY3Rpb24oKXt0cnl7dmFyIGU9JFByb21pc2UucmVzb2x2ZSgxKSx0PShlLmNvbnN0cnVjdG9yPXt9KVtfd2tzKCJzcGVjaWVzIildPWZ1bmN0aW9uKGUpe2UoZW1wdHksZW1wdHkpfTtyZXR1cm4oaXNOb2RlfHwiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50KSYmZS50aGVuKGVtcHR5KWluc3RhbmNlb2YgdCYmMCE9PXY4LmluZGV4T2YoIjYuNiIpJiYtMT09PV91c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lLzY2Iil9Y2F0Y2goZSl7fX0oKSxpc1RoZW5hYmxlPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiEoIV9pc09iamVjdChlKXx8ImZ1bmN0aW9uIiE9dHlwZW9mKHQ9ZS50aGVuKSkmJnR9LG5vdGlmeT1mdW5jdGlvbihsLG4pe2lmKCFsLl9uKXtsLl9uPSEwO3ZhciByPWwuX2M7bWljcm90YXNrKGZ1bmN0aW9uKCl7Zm9yKHZhciBjPWwuX3YsdT0xPT1sLl9zLGU9MCx0PWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPXU/ZS5vazplLmZhaWwsbz1lLnJlc29sdmUsYT1lLnJlamVjdCxzPWUuZG9tYWluO3RyeXtpPyh1fHwoMj09bC5faCYmb25IYW5kbGVVbmhhbmRsZWQobCksbC5faD0xKSwhMD09PWk/dD1jOihzJiZzLmVudGVyKCksdD1pKGMpLHMmJihzLmV4aXQoKSxyPSEwKSksdD09PWUucHJvbWlzZT9hKFR5cGVFcnJvciQxKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOihuPWlzVGhlbmFibGUodCkpP24uY2FsbCh0LG8sYSk6byh0KSk6YShjKX1jYXRjaChlKXtzJiYhciYmcy5leGl0KCksYShlKX19O3IubGVuZ3RoPmU7KXQocltlKytdKTtsLl9jPVtdLGwuX249ITEsbiYmIWwuX2gmJm9uVW5oYW5kbGVkKGwpfSl9fSxvblVuaGFuZGxlZD1mdW5jdGlvbihvKXt0YXNrLmNhbGwoX2dsb2JhbCxmdW5jdGlvbigpe3ZhciBlLHQsbixyPW8uX3YsaT1pc1VuaGFuZGxlZChvKTtpZihpJiYoZT1fcGVyZm9ybShmdW5jdGlvbigpe2lzTm9kZT9wcm9jZXNzJDEuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixyLG8pOih0PV9nbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pP3Qoe3Byb21pc2U6byxyZWFzb246cn0pOihuPV9nbG9iYWwuY29uc29sZSkmJm4uZXJyb3ImJm4uZXJyb3IoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIscil9KSxvLl9oPWlzTm9kZXx8aXNVbmhhbmRsZWQobyk/MjoxKSxvLl9hPXZvaWQgMCxpJiZlLmUpdGhyb3cgZS52fSl9LGlzVW5oYW5kbGVkPWZ1bmN0aW9uKGUpe3JldHVybiAxIT09ZS5faCYmMD09PShlLl9hfHxlLl9jKS5sZW5ndGh9LG9uSGFuZGxlVW5oYW5kbGVkPWZ1bmN0aW9uKHQpe3Rhc2suY2FsbChfZ2xvYmFsLGZ1bmN0aW9uKCl7dmFyIGU7aXNOb2RlP3Byb2Nlc3MkMS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTooZT1fZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkmJmUoe3Byb21pc2U6dCxyZWFzb246dC5fdn0pfSl9LCRyZWplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Ll9kfHwodC5fZD0hMCwodD10Ll93fHx0KS5fdj1lLHQuX3M9Mix0Ll9hfHwodC5fYT10Ll9jLnNsaWNlKCkpLG5vdGlmeSh0LCEwKSl9LCRyZXNvbHZlPWZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcztpZighci5fZCl7ci5fZD0hMCxyPXIuX3d8fHI7dHJ5e2lmKHI9PT1lKXRocm93IFR5cGVFcnJvciQxKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpOyhuPWlzVGhlbmFibGUoZSkpP21pY3JvdGFzayhmdW5jdGlvbigpe3ZhciB0PXtfdzpyLF9kOiExfTt0cnl7bi5jYWxsKGUsX2N0eCgkcmVzb2x2ZSx0LDEpLF9jdHgoJHJlamVjdCx0LDEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwodCxlKX19KTooci5fdj1lLHIuX3M9MSxub3RpZnkociwhMSkpfWNhdGNoKGUpeyRyZWplY3QuY2FsbCh7X3c6cixfZDohMX0sZSl9fX07VVNFX05BVElWRXx8KCRQcm9taXNlPWZ1bmN0aW9uKGUpe19hbkluc3RhbmNlKHRoaXMsJFByb21pc2UsUFJPTUlTRSwiX2giKSxfYUZ1bmN0aW9uKGUpLEludGVybmFsLmNhbGwodGhpcyk7dHJ5e2UoX2N0eCgkcmVzb2x2ZSx0aGlzLDEpLF9jdHgoJHJlamVjdCx0aGlzLDEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwodGhpcyxlKX19LEludGVybmFsPWZ1bmN0aW9uKGUpe3RoaXMuX2M9W10sdGhpcy5fYT12b2lkIDAsdGhpcy5fcz0wLHRoaXMuX2Q9ITEsdGhpcy5fdj12b2lkIDAsdGhpcy5faD0wLHRoaXMuX249ITF9LEludGVybmFsLnByb3RvdHlwZT1fcmVkZWZpbmVBbGwoJFByb21pc2UucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3UHJvbWlzZUNhcGFiaWxpdHkoX3NwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCRQcm9taXNlKSk7cmV0dXJuIG4ub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fGUsbi5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LG4uZG9tYWluPWlzTm9kZT9wcm9jZXNzJDEuZG9tYWluOnZvaWQgMCx0aGlzLl9jLnB1c2gobiksdGhpcy5fYSYmdGhpcy5fYS5wdXNoKG4pLHRoaXMuX3MmJm5vdGlmeSh0aGlzLCExKSxuLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLE93blByb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IEludGVybmFsO3RoaXMucHJvbWlzZT1lLHRoaXMucmVzb2x2ZT1fY3R4KCRyZXNvbHZlLGUsMSksdGhpcy5yZWplY3Q9X2N0eCgkcmVqZWN0LGUsMSl9LF9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mPW5ld1Byb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKGUpe3JldHVybiBlPT09JFByb21pc2V8fGU9PT1XcmFwcGVyP25ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShlKTpuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoZSl9KSxfZXhwb3J0KF9leHBvcnQuRytfZXhwb3J0LlcrX2V4cG9ydC5GKiFVU0VfTkFUSVZFLHtQcm9taXNlOiRQcm9taXNlfSksX3NldFRvU3RyaW5nVGFnKCRQcm9taXNlLFBST01JU0UpLF9zZXRTcGVjaWVzKFBST01JU0UpLFdyYXBwZXI9X2NvcmVbUFJPTUlTRV0sX2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GKiFVU0VfTkFUSVZFLFBST01JU0Use3JlamVjdDpmdW5jdGlvbihlKXt2YXIgdD1uZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtyZXR1cm4oMCx0LnJlamVjdCkoZSksdC5wcm9taXNlfX0pLF9leHBvcnQoX2V4cG9ydC5TK19leHBvcnQuRiooX2xpYnJhcnl8fCFVU0VfTkFUSVZFKSxQUk9NSVNFLHtyZXNvbHZlOmZ1bmN0aW9uKGUpe3JldHVybiBfcHJvbWlzZVJlc29sdmUoX2xpYnJhcnkmJnRoaXM9PT1XcmFwcGVyPyRQcm9taXNlOnRoaXMsZSl9fSksX2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GKiEoVVNFX05BVElWRSYmX2l0ZXJEZXRlY3QoZnVuY3Rpb24oZSl7JFByb21pc2UuYWxsKGUpLmNhdGNoKGVtcHR5KX0pKSxQUk9NSVNFLHthbGw6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyx0PW5ld1Byb21pc2VDYXBhYmlsaXR5KGEpLHM9dC5yZXNvbHZlLGM9dC5yZWplY3Qsbj1fcGVyZm9ybShmdW5jdGlvbigpe3ZhciByPVtdLGk9MCxvPTE7X2Zvck9mKGUsITEsZnVuY3Rpb24oZSl7dmFyIHQ9aSsrLG49ITE7ci5wdXNoKHZvaWQgMCksbysrLGEucmVzb2x2ZShlKS50aGVuKGZ1bmN0aW9uKGUpe258fChuPSEwLHJbdF09ZSwtLW98fHMocikpfSxjKX0pLC0tb3x8cyhyKX0pO3JldHVybiBuLmUmJmMobi52KSx0LnByb21pc2V9LHJhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPW5ld1Byb21pc2VDYXBhYmlsaXR5KHQpLHI9bi5yZWplY3QsaT1fcGVyZm9ybShmdW5jdGlvbigpe19mb3JPZihlLCExLGZ1bmN0aW9uKGUpe3QucmVzb2x2ZShlKS50aGVuKG4ucmVzb2x2ZSxyKX0pfSk7cmV0dXJuIGkuZSYmcihpLnYpLG4ucHJvbWlzZX19KTt2YXIgJGluY2x1ZGVzPV9hcnJheUluY2x1ZGVzKCEwKTtfZXhwb3J0KF9leHBvcnQuUCwiQXJyYXkiLHtpbmNsdWRlczpmdW5jdGlvbihlKXtyZXR1cm4gJGluY2x1ZGVzKHRoaXMsZSwxPGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksX2FkZFRvVW5zY29wYWJsZXMoImluY2x1ZGVzIik7dmFyIGlzRW51bT1fb2JqZWN0UGllLmYsX29iamVjdFRvQXJyYXk9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPV90b0lvYmplY3QoZSkscj1fb2JqZWN0S2V5cyhuKSxpPXIubGVuZ3RoLG89MCxhPVtdO288aTspaXNFbnVtLmNhbGwobix0PXJbbysrXSkmJmEucHVzaChzP1t0LG5bdF1dOm5bdF0pO3JldHVybiBhfX0sJHZhbHVlcz1fb2JqZWN0VG9BcnJheSghMSk7X2V4cG9ydChfZXhwb3J0LlMsIk9iamVjdCIse3ZhbHVlczpmdW5jdGlvbihlKXtyZXR1cm4gJHZhbHVlcyhlKX19KTt2YXIgb3JpZ2luYWxDb25zb2xlPWdsb2JhbC5jb25zb2xlO2Z1bmN0aW9uIHNldE5hdGl2ZUNvbnNvbGUoKXtpZihnZW5lcmF0ZUxldmVsTWFwKCksZ2xvYmFsLldYRW52aXJvbm1lbnQmJiJXZWIiIT09Z2xvYmFsLldYRW52aXJvbm1lbnQucGxhdGZvcm0pZ2xvYmFsLmNvbnNvbGU9e2RlYnVnOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImRlYnVnIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX0RFQlVHIl0pKX0sbG9nOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImxvZyIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19MT0ciXSkpfSxpbmZvOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImluZm8iKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fSU5GTyJdKSl9LHdhcm46ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgid2FybiIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19XQVJOIl0pKX0sZXJyb3I6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZXJyb3IiKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fRVJST1IiXSkpfX07ZWxzZXt2YXIgZT1jb25zb2xlLmRlYnVnLHQ9Y29uc29sZS5sb2csbj1jb25zb2xlLmluZm8scj1jb25zb2xlLndhcm4saT1jb25zb2xlLmVycm9yO2NvbnNvbGUuX19vcmlfXz17ZGVidWc6ZSxsb2c6dCxpbmZvOm4sd2FybjpyLGVycm9yOml9LGNvbnNvbGUuZGVidWc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZGVidWciKSYmY29uc29sZS5fX29yaV9fLmRlYnVnLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUubG9nPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImxvZyIpJiZjb25zb2xlLl9fb3JpX18ubG9nLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUuaW5mbz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJpbmZvIikmJmNvbnNvbGUuX19vcmlfXy5pbmZvLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUud2Fybj1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJ3YXJuIikmJmNvbnNvbGUuX19vcmlfXy53YXJuLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUuZXJyb3I9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZXJyb3IiKSYmY29uc29sZS5fX29yaV9fLmVycm9yLmFwcGx5KGNvbnNvbGUsZSl9fX1mdW5jdGlvbiBmb3JtYXQoZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlPSJbb2JqZWN0IG9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnRvTG93ZXJDYXNlKCk/SlNPTi5zdHJpbmdpZnkoZSk6U3RyaW5nKGUpfSl9dmFyIG9yaWdpbmFsU2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dCxzZXRUaW1lb3V0TmF0aXZlPWdsb2JhbC5zZXRUaW1lb3V0TmF0aXZlO2Z1bmN0aW9uIHNldE5hdGl2ZVRpbWVyKCl7aWYodm9pZCAwPT09c2V0VGltZW91dCYmImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXROYXRpdmUpe3ZhciBuPXt9LHI9MDtnbG9iYWwuc2V0VGltZW91dD1mdW5jdGlvbihlLHQpe25bKytyXT1lLHNldFRpbWVvdXROYXRpdmUoci50b1N0cmluZygpLHQpfSxnbG9iYWwuc2V0VGltZW91dENhbGxiYWNrPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBuW2VdJiYobltlXSgpLGRlbGV0ZSBuW2VdKX19fXNldE5hdGl2ZVRpbWVyKCksInVuZGVmaW5lZCI9PXR5cGVvZiBXWEVudmlyb25tZW50fHxXWEVudmlyb25tZW50Ll9fZW5hYmxlX25hdGl2ZV9wcm9taXNlX187dmFyIGZhY3Rvcnk9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsYSx0KXt2YXIgXz1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBFKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gQShlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gJChlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIGIoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBkKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiAwPD10JiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdyhlKXtyZXR1cm4gSShlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxkKGUpJiZlLnRvU3RyaW5nPT09cj9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19cygic2xvdCxjb21wb25lbnQiLCEwKTt2YXIgbD1zKCJrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcyIpO2Z1bmN0aW9uIGsoZSx0KXtpZihlLmxlbmd0aCl7dmFyIG49ZS5pbmRleE9mKHQpO2lmKC0xPG4pcmV0dXJuIGUuc3BsaWNlKG4sMSl9fXZhciBjPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZihlLHQpe3JldHVybiBjLmNhbGwoZSx0KX1mdW5jdGlvbiB1KHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfHwobltlXT10KGUpKX19dmFyIHA9Ly0oXHcpL2csaD11KGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UocCxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKToiIn0pfSksdj11KGZ1bmN0aW9uKGUpe3JldHVybiBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9KSxnPS9cQihbQS1aXSkvZyxTPXUoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShnLCItJDEiKS50b0xvd2VyQ2FzZSgpfSk7dmFyIG09RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5iaW5kKHQpfTpmdW5jdGlvbihuLHIpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gdD8xPHQ/bi5hcHBseShyLGFyZ3VtZW50cyk6bi5jYWxsKHIsZSk6bi5jYWxsKHIpfXJldHVybiBlLl9sZW5ndGg9bi5sZW5ndGgsZX07ZnVuY3Rpb24geShlLHQpe3Q9dHx8MDtmb3IodmFyIG49ZS5sZW5ndGgtdCxyPW5ldyBBcnJheShuKTtuLS07KXJbbl09ZVtuK3RdO3JldHVybiByfWZ1bmN0aW9uIEIoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24geChlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKWVbbl0mJkIodCxlW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBMKGUsdCxuKXt9dmFyIEM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSxUPWZ1bmN0aW9uKGUpe3JldHVybiBlfTtmdW5jdGlvbiBPKHQsbil7aWYodD09PW4pcmV0dXJuITA7dmFyIGU9Yih0KSxyPWIobik7aWYoIWV8fCFyKXJldHVybiFlJiYhciYmU3RyaW5nKHQpPT09U3RyaW5nKG4pO3RyeXt2YXIgaT1BcnJheS5pc0FycmF5KHQpLG89QXJyYXkuaXNBcnJheShuKTtpZihpJiZvKXJldHVybiB0Lmxlbmd0aD09PW4ubGVuZ3RoJiZ0LmV2ZXJ5KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE8oZSxuW3RdKX0pO2lmKHQgaW5zdGFuY2VvZiBEYXRlJiZuIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gdC5nZXRUaW1lKCk9PT1uLmdldFRpbWUoKTtpZihpfHxvKXJldHVybiExO3ZhciBhPU9iamVjdC5rZXlzKHQpLHM9T2JqZWN0LmtleXMobik7cmV0dXJuIGEubGVuZ3RoPT09cy5sZW5ndGgmJmEuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIE8odFtlXSxuW2VdKX0pfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBQKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoTyhlW25dLHQpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIEQoZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX12YXIgTT0iZGF0YS1zZXJ2ZXItcmVuZGVyZWQiLGo9WyJjb21wb25lbnQiLCJkaXJlY3RpdmUiLCJmaWx0ZXIiXSxOPVsiYmVmb3JlQ3JlYXRlIiwiY3JlYXRlZCIsImJlZm9yZU1vdW50IiwibW91bnRlZCIsImJlZm9yZVVwZGF0ZSIsInVwZGF0ZWQiLCJiZWZvcmVEZXN0cm95IiwiZGVzdHJveWVkIiwiYWN0aXZhdGVkIiwiZGVhY3RpdmF0ZWQiLCJlcnJvckNhcHR1cmVkIiwic2VydmVyUHJlZmV0Y2giXSxSPXtvcHRpb25NZXJnZVN0cmF0ZWdpZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxzaWxlbnQ6ITEscHJvZHVjdGlvblRpcDohMSxkZXZ0b29sczohMSxwZXJmb3JtYW5jZTohMSxlcnJvckhhbmRsZXI6bnVsbCx3YXJuSGFuZGxlcjpudWxsLGlnbm9yZWRFbGVtZW50czpbXSxrZXlDb2RlczpPYmplY3QuY3JlYXRlKG51bGwpLGlzUmVzZXJ2ZWRUYWc6Qyxpc1Jlc2VydmVkQXR0cjpDLGlzVW5rbm93bkVsZW1lbnQ6QyxnZXRUYWdOYW1lc3BhY2U6TCxwYXJzZVBsYXRmb3JtVGFnTmFtZTpULG11c3RVc2VQcm9wOkMsYXN5bmM6ITAsX2xpZmVjeWNsZUhvb2tzOk59O2Z1bmN0aW9uIEYoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgVT1uZXcgUmVnRXhwKCJbXiIrL2EtekEtWlx1MDBCN1x1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDNGLVx1MjA0MFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZELy5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgeixWPSJfX3Byb3RvX18iaW57fSxxPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFc9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSD1XJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksRz1xJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLEo9RyYmL21zaWV8dHJpZGVudC8udGVzdChHKSxYPUcmJjA8Ry5pbmRleE9mKCJtc2llIDkuMCIpLFk9RyYmMDxHLmluZGV4T2YoImVkZ2UvIiksSz0oRyYmRy5pbmRleE9mKCJhbmRyb2lkIiksRyYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEcpLEcmJi9jaHJvbWVcL1xkKy8udGVzdChHKSxHJiYvcGhhbnRvbWpzLy50ZXN0KEcpLEcmJkcubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykse30ud2F0Y2gpO2lmKHEpdHJ5e3ZhciBaPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShaLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsWil9Y2F0Y2goZSl7fXZhciBRPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXomJih6PSFxJiYhVyYmdm9pZCAwIT09Z2xvYmFsJiYoZ2xvYmFsLnByb2Nlc3MmJiJzZXJ2ZXIiPT09Z2xvYmFsLnByb2Nlc3MuZW52LlZVRV9FTlYpKSx6fSxlZT1xJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztmdW5jdGlvbiB0ZShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmL25hdGl2ZSBjb2RlLy50ZXN0KGUudG9TdHJpbmcoKSl9dmFyIG5lLHJlPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZ0ZShTeW1ib2wpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJnRlKFJlZmxlY3Qub3duS2V5cyk7bmU9InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJnRlKFNldCk/U2V0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4hMD09PXRoaXMuc2V0W2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRbZV09ITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX0sZX0oKTt2YXIgaWU9TCxvZT0wLGFlPWZ1bmN0aW9uKCl7dGhpcy5pZD12b2lkIDAhPT10P3QudWlkKys6b2UrKyx0aGlzLnN1YnM9W119O2Z1bmN0aW9uIHNlKGUpe2FlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wdXNoKGUpLGFlLlNoYXJlZE9iamVjdC50YXJnZXQ9ZX1mdW5jdGlvbiBjZSgpe2FlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wb3AoKSxhZS5TaGFyZWRPYmplY3QudGFyZ2V0PWFlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFja1thZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2subGVuZ3RoLTFdfWFlLnByb3RvdHlwZS5hZGRTdWI9ZnVuY3Rpb24oZSl7dGhpcy5zdWJzLnB1c2goZSl9LGFlLnByb3RvdHlwZS5yZW1vdmVTdWI9ZnVuY3Rpb24oZSl7ayh0aGlzLnN1YnMsZSl9LGFlLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXthZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZhZS5TaGFyZWRPYmplY3QudGFyZ2V0LmFkZERlcCh0aGlzKX0sYWUucHJvdG90eXBlLm5vdGlmeT1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnN1YnMuc2xpY2UoKSx0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWVbdF0udXBkYXRlKCl9LGFlLlNoYXJlZE9iamVjdD12b2lkIDAhPT10P3Q6e30sYWUuU2hhcmVkT2JqZWN0LnRhcmdldD1udWxsLGFlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjaz1bXTt2YXIgdWU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt0JiZBcnJheS5pc0FycmF5KHQuY2xhc3MpJiYodC5jbGFzcz10LmNsYXNzLnNsaWNlKDApKSx0aGlzLnRhZz1lLHRoaXMuZGF0YT10LHRoaXMuY2hpbGRyZW49bix0aGlzLnRleHQ9cix0aGlzLmVsbT1pLHRoaXMubnM9dm9pZCAwLHRoaXMuY29udGV4dD1vLHRoaXMuZm5Db250ZXh0PXZvaWQgMCx0aGlzLmZuT3B0aW9ucz12b2lkIDAsdGhpcy5mblNjb3BlSWQ9dm9pZCAwLHRoaXMua2V5PXQmJnQua2V5LHRoaXMuY29tcG9uZW50T3B0aW9ucz1hLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9dm9pZCAwLHRoaXMucGFyZW50PXZvaWQgMCx0aGlzLnJhdz0hMSx0aGlzLmlzU3RhdGljPSExLHRoaXMuaXNSb290SW5zZXJ0PSEwLHRoaXMuaXNDb21tZW50PSExLHRoaXMuaXNDbG9uZWQ9ITEsdGhpcy5pc09uY2U9ITEsdGhpcy5hc3luY0ZhY3Rvcnk9cyx0aGlzLmFzeW5jTWV0YT12b2lkIDAsdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXI9ITF9LGxlPXtjaGlsZDp7Y29uZmlndXJhYmxlOiEwfX07bGUuY2hpbGQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVlLnByb3RvdHlwZSxsZSk7dmFyIGRlPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgdD1uZXcgdWU7cmV0dXJuIHQudGV4dD1lLHQuaXNDb21tZW50PSEwLHR9O2Z1bmN0aW9uIGZlKGUpe3JldHVybiBuZXcgdWUodm9pZCAwLHZvaWQgMCx2b2lkIDAsU3RyaW5nKGUpKX1mdW5jdGlvbiBwZShlKXt2YXIgdD1uZXcgdWUoZS50YWcsZS5kYXRhLGUuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc2xpY2UoKSxlLnRleHQsZS5lbG0sZS5jb250ZXh0LGUuY29tcG9uZW50T3B0aW9ucyxlLmFzeW5jRmFjdG9yeSk7cmV0dXJuIHQubnM9ZS5ucyx0LmlzU3RhdGljPWUuaXNTdGF0aWMsdC5rZXk9ZS5rZXksdC5pc0NvbW1lbnQ9ZS5pc0NvbW1lbnQsdC5mbkNvbnRleHQ9ZS5mbkNvbnRleHQsdC5mbk9wdGlvbnM9ZS5mbk9wdGlvbnMsdC5mblNjb3BlSWQ9ZS5mblNjb3BlSWQsdC5hc3luY01ldGE9ZS5hc3luY01ldGEsdC5pc0Nsb25lZD0hMCx0fXZhciBoZT1BcnJheS5wcm90b3R5cGUsdmU9T2JqZWN0LmNyZWF0ZShoZSk7WyJwdXNoIiwicG9wIiwic2hpZnQiLCJ1bnNoaWZ0Iiwic3BsaWNlIiwic29ydCIsInJldmVyc2UiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBzPWhlW2FdO0YodmUsYSxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHIsaT1zLmFwcGx5KHRoaXMsdCksbz10aGlzLl9fb2JfXztzd2l0Y2goYSl7Y2FzZSJwdXNoIjpjYXNlInVuc2hpZnQiOnI9dDticmVhaztjYXNlInNwbGljZSI6cj10LnNsaWNlKDIpfXJldHVybiByJiZvLm9ic2VydmVBcnJheShyKSxvLmRlcC5ub3RpZnkoKSxpfSl9KTt2YXIgZ2U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmUpLG1lPSEwO2Z1bmN0aW9uIHllKGUpe21lPWV9dmFyIF9lPWZ1bmN0aW9uKGUpe3ZhciB0O3RoaXMudmFsdWU9ZSx0aGlzLmRlcD1uZXcgYWUsdGhpcy52bUNvdW50PTAsRihlLCJfX29iX18iLHRoaXMpLEFycmF5LmlzQXJyYXkoZSk/KFY/KHQ9dmUsZS5fX3Byb3RvX189dCk6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXTtGKGUsbyx0W29dKX19KGUsdmUsZ2UpLHRoaXMub2JzZXJ2ZUFycmF5KGUpKTp0aGlzLndhbGsoZSl9O2Z1bmN0aW9uIGJlKGUsdCl7dmFyIG47aWYoYihlKSYmIShlIGluc3RhbmNlb2YgdWUpKXJldHVybiBmKGUsIl9fb2JfXyIpJiZlLl9fb2JfXyBpbnN0YW5jZW9mIF9lP249ZS5fX29iX186bWUmJiFRKCkmJihBcnJheS5pc0FycmF5KGUpfHxkKGUpKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmIWUuX2lzVnVlJiYobj1uZXcgX2UoZSkpLHQmJm4mJm4udm1Db3VudCsrLG59ZnVuY3Rpb24gd2UobixlLHIsdCxpKXt2YXIgbz1uZXcgYWUsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSk7aWYoIWF8fCExIT09YS5jb25maWd1cmFibGUpe3ZhciBzPWEmJmEuZ2V0LGM9YSYmYS5zZXQ7cyYmIWN8fDIhPT1hcmd1bWVudHMubGVuZ3RofHwocj1uW2VdKTt2YXIgdT0haSYmYmUocik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9cz9zLmNhbGwobik6cjtyZXR1cm4gYWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmKG8uZGVwZW5kKCksdSYmKHUuZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkoZSkmJmZ1bmN0aW9uIGUodCl7Zm9yKHZhciBuPXZvaWQgMCxyPTAsaT10Lmxlbmd0aDtyPGk7cisrKShuPXRbcl0pJiZuLl9fb2JfXyYmbi5fX29iX18uZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkobikmJmUobil9KGUpKSksZX0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXM/cy5jYWxsKG4pOnI7ZT09PXR8fGUhPWUmJnQhPXR8fHMmJiFjfHwoYz9jLmNhbGwobixlKTpyPWUsdT0haSYmYmUoZSksby5ub3RpZnkoKSl9fSl9fWZ1bmN0aW9uIGtlKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpJiZpKHQpKXJldHVybiBlLmxlbmd0aD1NYXRoLm1heChlLmxlbmd0aCx0KSxlLnNwbGljZSh0LDEsbiksbjtpZih0IGluIGUmJiEodCBpbiBPYmplY3QucHJvdG90eXBlKSlyZXR1cm4gZVt0XT1uO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8od2Uoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOmVbdF09bn1mdW5jdGlvbiBTZShlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkmJmkodCkpZS5zcGxpY2UodCwxKTtlbHNle3ZhciBuPWUuX19vYl9fO2UuX2lzVnVlfHxuJiZuLnZtQ291bnR8fGYoZSx0KSYmKGRlbGV0ZSBlW3RdLG4mJm4uZGVwLm5vdGlmeSgpKX19X2UucHJvdG90eXBlLndhbGs9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoO24rKyl3ZShlLHRbbl0pfSxfZS5wcm90b3R5cGUub2JzZXJ2ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyliZShlW3RdKX07dmFyIHhlPVIub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO2Z1bmN0aW9uIENlKGUsdCl7aWYoIXQpcmV0dXJuIGU7Zm9yKHZhciBuLHIsaSxvPXJlP1JlZmxlY3Qub3duS2V5cyh0KTpPYmplY3Qua2V5cyh0KSxhPTA7YTxvLmxlbmd0aDthKyspIl9fb2JfXyIhPT0obj1vW2FdKSYmKHI9ZVtuXSxpPXRbbl0sZihlLG4pP3IhPT1pJiZkKHIpJiZkKGkpJiZDZShyLGkpOmtlKGUsbixpKSk7cmV0dXJuIGV9ZnVuY3Rpb24gVGUobixyLGkpe3JldHVybiBpP2Z1bmN0aW9uKCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5jYWxsKGksaSk6cix0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbChpLGkpOm47cmV0dXJuIGU/Q2UoZSx0KTp0fTpyP24/ZnVuY3Rpb24oKXtyZXR1cm4gQ2UoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5jYWxsKHRoaXMsdGhpcyk6ciwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodGhpcyx0aGlzKTpuKX06cjpufWZ1bmN0aW9uIE9lKGUsdCl7dmFyIG49dD9lP2UuY29uY2F0KHQpOkFycmF5LmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbj9mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKS0xPT09dC5pbmRleE9mKGVbbl0pJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9KG4pOm59ZnVuY3Rpb24gRWUoZSx0LG4scil7dmFyIGk9T2JqZWN0LmNyZWF0ZShlfHxudWxsKTtyZXR1cm4gdD9CKGksdCk6aX14ZS5kYXRhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj9UZShlLHQsbik6dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTpUZShlLHQpfSxOLmZvckVhY2goZnVuY3Rpb24oZSl7eGVbZV09T2V9KSxqLmZvckVhY2goZnVuY3Rpb24oZSl7eGVbZSsicyJdPUVlfSkseGUud2F0Y2g9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT09PUsmJihlPXZvaWQgMCksdD09PUsmJih0PXZvaWQgMCksIXQpcmV0dXJuIE9iamVjdC5jcmVhdGUoZXx8bnVsbCk7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9e307Zm9yKHZhciBvIGluIEIoaSxlKSx0KXt2YXIgYT1pW29dLHM9dFtvXTthJiYhQXJyYXkuaXNBcnJheShhKSYmKGE9W2FdKSxpW29dPWE/YS5jb25jYXQocyk6QXJyYXkuaXNBcnJheShzKT9zOltzXX1yZXR1cm4gaX0seGUucHJvcHM9eGUubWV0aG9kcz14ZS5pbmplY3Q9eGUuY29tcHV0ZWQ9ZnVuY3Rpb24oZSx0LG4scil7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gQihpLGUpLHQmJkIoaSx0KSxpfSx4ZS5wcm92aWRlPVRlO3ZhciBJZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P2U6dH07ZnVuY3Rpb24gQWUobixyLGkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yLm9wdGlvbnMpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5wcm9wcztpZihuKXt2YXIgcixpLG89e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3Iocj1uLmxlbmd0aDtyLS07KSJzdHJpbmciPT10eXBlb2YoaT1uW3JdKSYmKG9baChpKV09e3R5cGU6bnVsbH0pO2Vsc2UgaWYoZChuKSlmb3IodmFyIGEgaW4gbilpPW5bYV0sb1toKGEpXT1kKGkpP2k6e3R5cGU6aX07ZS5wcm9wcz1vfX0ociksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmluamVjdDtpZihuKXt2YXIgcj1lLmluamVjdD17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXJbbltpXV09e2Zyb206bltpXX07ZWxzZSBpZihkKG4pKWZvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO3Jbb109ZChhKT9CKHtmcm9tOm99LGEpOntmcm9tOmF9fX19KHIpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGlyZWN0aXZlcztpZih0KWZvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dOyJmdW5jdGlvbiI9PXR5cGVvZiByJiYodFtuXT17YmluZDpyLHVwZGF0ZTpyfSl9fShyKSwhci5fYmFzZSYmKHIuZXh0ZW5kcyYmKG49QWUobixyLmV4dGVuZHMsaSkpLHIubWl4aW5zKSlmb3IodmFyIGU9MCx0PXIubWl4aW5zLmxlbmd0aDtlPHQ7ZSsrKW49QWUobixyLm1peGluc1tlXSxpKTt2YXIgbyxhPXt9O2ZvcihvIGluIG4pcyhvKTtmb3IobyBpbiByKWYobixvKXx8cyhvKTtmdW5jdGlvbiBzKGUpe3ZhciB0PXhlW2VdfHxJZTthW2VdPXQobltlXSxyW2VdLGksZSl9cmV0dXJuIGF9ZnVuY3Rpb24gJGUoZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgaT1lW3RdO2lmKGYoaSxuKSlyZXR1cm4gaVtuXTt2YXIgbz1oKG4pO2lmKGYoaSxvKSlyZXR1cm4gaVtvXTt2YXIgYT12KG8pO3JldHVybiBmKGksYSk/aVthXTppW25dfHxpW29dfHxpW2FdfX1mdW5jdGlvbiBQZShlLHQsbixyKXt2YXIgaT10W2VdLG89IWYobixlKSxhPW5bZV0scz1OZShCb29sZWFuLGkudHlwZSk7aWYoLTE8cylpZihvJiYhZihpLCJkZWZhdWx0IikpYT0hMTtlbHNlIGlmKCIiPT09YXx8YT09PVMoZSkpe3ZhciBjPU5lKFN0cmluZyxpLnR5cGUpOyhjPDB8fHM8YykmJihhPSEwKX1pZih2b2lkIDA9PT1hKXthPWZ1bmN0aW9uKGUsdCxuKXtpZighZih0LCJkZWZhdWx0IikpcmV0dXJuO3ZhciByPXQuZGVmYXVsdDtpZihlJiZlLiRvcHRpb25zLnByb3BzRGF0YSYmdm9pZCAwPT09ZS4kb3B0aW9ucy5wcm9wc0RhdGFbbl0mJnZvaWQgMCE9PWUuX3Byb3BzW25dKXJldHVybiBlLl9wcm9wc1tuXTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgciYmIkZ1bmN0aW9uIiE9PU1lKHQudHlwZSk/ci5jYWxsKGUpOnJ9KHIsaSxlKTt2YXIgdT1tZTt5ZSghMCksYmUoYSkseWUodSl9cmV0dXJuIGF9ZnVuY3Rpb24gTWUoZSl7dmFyIHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gdD90WzFdOiIifWZ1bmN0aW9uIGplKGUsdCl7cmV0dXJuIE1lKGUpPT09TWUodCl9ZnVuY3Rpb24gTmUoZSx0KXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gamUodCxlKT8wOi0xO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZihqZSh0W25dLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIEJlKGUsdCxuKXtzZSgpO3RyeXtpZih0KWZvcih2YXIgcj10O3I9ci4kcGFyZW50Oyl7dmFyIGk9ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkO2lmKGkpZm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspdHJ5e2lmKCExPT09aVtvXS5jYWxsKHIsZSx0LG4pKXJldHVybn1jYXRjaChlKXtEZShlLHIsImVycm9yQ2FwdHVyZWQgaG9vayIpfX1EZShlLHQsbil9ZmluYWxseXtjZSgpfX1mdW5jdGlvbiBMZShlLHQsbixyLGkpe3ZhciBvO3RyeXsobz1uP2UuYXBwbHkodCxuKTplLmNhbGwodCkpJiYhby5faXNWdWUmJncobykmJiFvLl9oYW5kbGVkJiYoby5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gQmUoZSxyLGkrIiAoUHJvbWlzZS9hc3luYykiKX0pLG8uX2hhbmRsZWQ9ITApfWNhdGNoKGUpe0JlKGUscixpKX1yZXR1cm4gb31mdW5jdGlvbiBEZSh0LGUsbil7aWYoUi5lcnJvckhhbmRsZXIpdHJ5e3JldHVybiBSLmVycm9ySGFuZGxlci5jYWxsKG51bGwsdCxlLG4pfWNhdGNoKGUpe2UhPT10JiZSZShlLG51bGwsImNvbmZpZy5lcnJvckhhbmRsZXIiKX1SZSh0LGUsbil9ZnVuY3Rpb24gUmUoZSx0LG4pe2lmKCFxJiYhV3x8InVuZGVmaW5lZCI9PXR5cGVvZiBjb25zb2xlKXRocm93IGU7Y29uc29sZS5lcnJvcihlKX12YXIgRmU9W10sVWU9ITE7ZnVuY3Rpb24gemUoKXtVZT0hMTtmb3IodmFyIGU9RmUuc2xpY2UoMCksdD1GZS5sZW5ndGg9MDt0PGUubGVuZ3RoO3QrKyllW3RdKCl9dmFyIFZlPWZ1bmN0aW9uKCl7c2V0VGltZW91dCh6ZSwwKX07ZnVuY3Rpb24gcWUoZSx0KXt2YXIgbjtpZihGZS5wdXNoKGZ1bmN0aW9uKCl7aWYoZSl0cnl7ZS5jYWxsKHQpfWNhdGNoKGUpe0JlKGUsdCwibmV4dFRpY2siKX1lbHNlIG4mJm4odCl9KSxVZXx8KFVlPSEwLFZlKCkpLCFlJiYidW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe249ZX0pfXZhciBXZT1uZXcgbmU7ZnVuY3Rpb24gSGUoZSl7IWZ1bmN0aW9uIGUodCxuKXt2YXIgcixpO3ZhciBvPUFycmF5LmlzQXJyYXkodCk7aWYoIW8mJiFiKHQpfHxPYmplY3QuaXNGcm96ZW4odCl8fHQgaW5zdGFuY2VvZiB1ZSlyZXR1cm47aWYodC5fX29iX18pe3ZhciBhPXQuX19vYl9fLmRlcC5pZDtpZihuLmhhcyhhKSlyZXR1cm47bi5hZGQoYSl9aWYobylmb3Iocj10Lmxlbmd0aDtyLS07KWUodFtyXSxuKTtlbHNlIGZvcihpPU9iamVjdC5rZXlzKHQpLHI9aS5sZW5ndGg7ci0tOyllKHRbaVtyXV0sbil9KGUsV2UpLFdlLmNsZWFyKCl9dmFyIEdlPXUoZnVuY3Rpb24oZSl7dmFyIHQ9IiYiPT09ZS5jaGFyQXQoMCksbj0ifiI9PT0oZT10P2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApLHI9IiEiPT09KGU9bj9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKTtyZXR1cm57bmFtZTplPXI/ZS5zbGljZSgxKTplLG9uY2U6bixjYXB0dXJlOnIscGFzc2l2ZTp0fX0pO2Z1bmN0aW9uIEplKGUsaSl7ZnVuY3Rpb24gbygpe3ZhciBlPWFyZ3VtZW50cyx0PW8uZm5zO2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBMZSh0LG51bGwsYXJndW1lbnRzLGksInYtb24gaGFuZGxlciIpO2Zvcih2YXIgbj10LnNsaWNlKCkscj0wO3I8bi5sZW5ndGg7cisrKUxlKG5bcl0sbnVsbCxlLGksInYtb24gaGFuZGxlciIpfXJldHVybiBvLmZucz1lLG99ZnVuY3Rpb24gWGUoZSx0LG4scixpLG8pe3ZhciBhLHMsYyx1LGw7Zm9yKGEgaW4gZSlzPWM9ZVthXSx1PXRbYV0sbD1HZShhKSxkKHMpJiYoYz1zLmhhbmRsZXIsbC5wYXJhbXM9cy5wYXJhbXMpLEUoYyl8fChFKHUpPyhFKGMuZm5zKSYmKGM9ZVthXT1KZShjLG8pKSxBKGwub25jZSkmJihjPWVbYV09aShsLm5hbWUsYyxsLmNhcHR1cmUpKSxuKGwubmFtZSxjLGwuY2FwdHVyZSxsLnBhc3NpdmUsbC5wYXJhbXMpKTpjIT09dSYmKHUuZm5zPWMsZVthXT11KSk7Zm9yKGEgaW4gdClFKGVbYV0pJiZyKChsPUdlKGEpKS5uYW1lLHRbYV0sbC5jYXB0dXJlKX1mdW5jdGlvbiBZZShlLHQsbil7dmFyIHI7ZSBpbnN0YW5jZW9mIHVlJiYoZT1lLmRhdGEuaG9va3x8KGUuZGF0YS5ob29rPXt9KSk7dmFyIGk9ZVt0XTtmdW5jdGlvbiBvKCl7bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksayhyLmZucyxvKX1FKGkpP3I9SmUoW29dKTpJKGkuZm5zKSYmQShpLm1lcmdlZCk/KHI9aSkuZm5zLnB1c2gobyk6cj1KZShbaSxvXSksci5tZXJnZWQ9ITAsZVt0XT1yfWZ1bmN0aW9uIEtlKGUsdCxuLHIsaSl7aWYoSSh0KSl7aWYoZih0LG4pKXJldHVybiBlW25dPXRbbl0saXx8ZGVsZXRlIHRbbl0sITA7aWYoZih0LHIpKXJldHVybiBlW25dPXRbcl0saXx8ZGVsZXRlIHRbcl0sITB9cmV0dXJuITF9ZnVuY3Rpb24gWmUoZSl7cmV0dXJuICQoZSk/W2ZlKGUpXTpBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uIGUodCxuKXt2YXIgcj1bXTt2YXIgaSxvLGEscztmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKUUobz10W2ldKXx8ImJvb2xlYW4iPT10eXBlb2Ygb3x8KGE9ci5sZW5ndGgtMSxzPXJbYV0sQXJyYXkuaXNBcnJheShvKT8wPG8ubGVuZ3RoJiYoUWUoKG89ZShvLChufHwiIikrIl8iK2kpKVswXSkmJlFlKHMpJiYoclthXT1mZShzLnRleHQrb1swXS50ZXh0KSxvLnNoaWZ0KCkpLHIucHVzaC5hcHBseShyLG8pKTokKG8pP1FlKHMpP3JbYV09ZmUocy50ZXh0K28pOiIiIT09byYmci5wdXNoKGZlKG8pKTpRZShvKSYmUWUocyk/clthXT1mZShzLnRleHQrby50ZXh0KTooQSh0Ll9pc1ZMaXN0KSYmSShvLnRhZykmJkUoby5rZXkpJiZJKG4pJiYoby5rZXk9Il9fdmxpc3QiK24rIl8iK2krIl9fIiksci5wdXNoKG8pKSk7cmV0dXJuIHJ9KGUpOnZvaWQgMH1mdW5jdGlvbiBRZShlKXtyZXR1cm4gSShlKSYmSShlLnRleHQpJiYhMT09PWUuaXNDb21tZW50fWZ1bmN0aW9uIGV0KGUpe3ZhciB0PWUuJG9wdGlvbnMucHJvdmlkZTt0JiYoZS5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKGUpOnQpfWZ1bmN0aW9uIHR0KHQpe3ZhciBuPW50KHQuJG9wdGlvbnMuaW5qZWN0LHQpO24mJih5ZSghMSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXt3ZSh0LGUsbltlXSl9KSx5ZSghMCkpfWZ1bmN0aW9uIG50KGUsdCl7aWYoZSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1yZT9SZWZsZWN0Lm93bktleXMoZSk6T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldO2lmKCJfX29iX18iIT09byl7Zm9yKHZhciBhPWVbb10uZnJvbSxzPXQ7czspe2lmKHMuX3Byb3ZpZGVkJiZmKHMuX3Byb3ZpZGVkLGEpKXtuW29dPXMuX3Byb3ZpZGVkW2FdO2JyZWFrfXM9cy4kcGFyZW50fWlmKCFzJiYiZGVmYXVsdCJpbiBlW29dKXt2YXIgYz1lW29dLmRlZmF1bHQ7bltvXT0iZnVuY3Rpb24iPT10eXBlb2YgYz9jLmNhbGwodCk6Y319fXJldHVybiBufX1mdW5jdGlvbiBydChlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl0sYT1vLmRhdGE7aWYoYSYmYS5hdHRycyYmYS5hdHRycy5zbG90JiZkZWxldGUgYS5hdHRycy5zbG90LG8uY29udGV4dCE9PXQmJm8uZm5Db250ZXh0IT09dHx8IWF8fG51bGw9PWEuc2xvdClvLmFzeW5jTWV0YSYmby5hc3luY01ldGEuZGF0YSYmInBhZ2UiPT09by5hc3luY01ldGEuZGF0YS5zbG90PyhuLnBhZ2V8fChuLnBhZ2U9W10pKS5wdXNoKG8pOihuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKG8pO2Vsc2V7dmFyIHM9YS5zbG90LGM9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KGl0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gaXQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBvdChlLHQsbil7dmFyIHIsaT0wPE9iamVjdC5rZXlzKHQpLmxlbmd0aCxvPWU/ISFlLiRzdGFibGU6IWksYT1lJiZlLiRrZXk7aWYoZSl7aWYoZS5fbm9ybWFsaXplZClyZXR1cm4gZS5fbm9ybWFsaXplZDtpZihvJiZuJiZuIT09XyYmYT09PW4uJGtleSYmIWkmJiFuLiRoYXNOb3JtYWwpcmV0dXJuIG47Zm9yKHZhciBzIGluIHI9e30sZSllW3NdJiYiJCIhPT1zWzBdJiYocltzXT1hdCh0LHMsZVtzXSkpfWVsc2Ugcj17fTtmb3IodmFyIGMgaW4gdCljIGluIHJ8fChyW2NdPXN0KHQsYykpO3JldHVybiBlJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYoZS5fbm9ybWFsaXplZD1yKSxGKHIsIiRzdGFibGUiLG8pLEYociwiJGtleSIsYSksRihyLCIkaGFzTm9ybWFsIixpKSxyfWZ1bmN0aW9uIGF0KGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg/bi5hcHBseShudWxsLGFyZ3VtZW50cyk6bih7fSk7cmV0dXJuKGU9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYhQXJyYXkuaXNBcnJheShlKT9bZV06WmUoZSkpJiYoMD09PWUubGVuZ3RofHwxPT09ZS5sZW5ndGgmJmVbMF0uaXNDb21tZW50KT92b2lkIDA6ZX07cmV0dXJuIG4ucHJveHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSkscn1mdW5jdGlvbiBzdChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3RdfX1mdW5jdGlvbiBjdChlLHQpe3ZhciBuLHIsaSxvLGE7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluW3JdPXQoZVtyXSxyKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspbltyXT10KHIrMSxyKTtlbHNlIGlmKGIoZSkpaWYocmUmJmVbU3ltYm9sLml0ZXJhdG9yXSl7bj1bXTtmb3IodmFyIHM9ZVtTeW1ib2wuaXRlcmF0b3JdKCksYz1zLm5leHQoKTshYy5kb25lOyluLnB1c2godChjLnZhbHVlLG4ubGVuZ3RoKSksYz1zLm5leHQoKX1lbHNlIGZvcihvPU9iamVjdC5rZXlzKGUpLG49bmV3IEFycmF5KG8ubGVuZ3RoKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKWE9b1tyXSxuW3JdPXQoZVthXSxhLHIpO3JldHVybiBJKG4pfHwobj1bXSksbi5faXNWTGlzdD0hMCxufWZ1bmN0aW9uIHV0KGUsdCxuLHIpe3ZhciBpLG89dGhpcy4kc2NvcGVkU2xvdHNbZV07bz8obj1ufHx7fSxyJiYobj1CKEIoe30sciksbikpLGk9byhuKXx8dCk6aT10aGlzLiRzbG90c1tlXXx8dDt2YXIgYT1uJiZuLnNsb3Q7cmV0dXJuIGE/dGhpcy4kY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiLHtzbG90OmF9LGkpOml9ZnVuY3Rpb24gbHQoZSl7cmV0dXJuICRlKHRoaXMuJG9wdGlvbnMsImZpbHRlcnMiLGUpfHxUfWZ1bmN0aW9uIGR0KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE9PT1lLmluZGV4T2YodCk6ZSE9PXR9ZnVuY3Rpb24gZnQoZSx0LG4scixpKXt2YXIgbz1SLmtleUNvZGVzW3RdfHxuO3JldHVybiBpJiZyJiYhUi5rZXlDb2Rlc1t0XT9kdChpLHIpOm8/ZHQobyxlKTpyP1MocikhPT10OnZvaWQgMH1mdW5jdGlvbiBwdChpLG8sYSxzLGMpe2lmKGEpaWYoYihhKSl7dmFyIHU7QXJyYXkuaXNBcnJheShhKSYmKGE9eChhKSk7dmFyIGU9ZnVuY3Rpb24odCl7aWYoImNsYXNzIj09PXR8fCJzdHlsZSI9PT10fHxsKHQpKXU9aTtlbHNle3ZhciBlPWkuYXR0cnMmJmkuYXR0cnMudHlwZTt1PXN8fFIubXVzdFVzZVByb3AobyxlLHQpP2kuZG9tUHJvcHN8fChpLmRvbVByb3BzPXt9KTppLmF0dHJzfHwoaS5hdHRycz17fSl9dmFyIG49aCh0KSxyPVModCk7biBpbiB1fHxyIGluIHV8fCh1W3RdPWFbdF0sYyYmKChpLm9ufHwoaS5vbj17fSkpWyJ1cGRhdGU6Iit0XT1mdW5jdGlvbihlKXthW3RdPWV9KSl9O2Zvcih2YXIgdCBpbiBhKWUodCl9ZWxzZTtyZXR1cm4gaX1mdW5jdGlvbiBodChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXR8fGd0KHI9bltlXT10aGlzLiRvcHRpb25zLnN0YXRpY1JlbmRlckZuc1tlXS5jYWxsKHRoaXMuX3JlbmRlclByb3h5LG51bGwsdGhpcyksIl9fc3RhdGljX18iK2UsITEpLHJ9ZnVuY3Rpb24gdnQoZSx0LG4pe3JldHVybiBndChlLCJfX29uY2VfXyIrdCsobj8iXyIrbjoiIiksITApLGV9ZnVuY3Rpb24gZ3QoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmInN0cmluZyIhPXR5cGVvZiBlW3JdJiZtdChlW3JdLHQrIl8iK3Isbik7ZWxzZSBtdChlLHQsbil9ZnVuY3Rpb24gbXQoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIHl0KGUsdCl7aWYodClpZihkKHQpKXt2YXIgbj1lLm9uPWUub24/Qih7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2U7cmV0dXJuIGV9ZnVuY3Rpb24gX3QoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9fdChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIGJ0KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dOyJzdHJpbmciPT10eXBlb2YgciYmciYmKGVbdFtuXV09dFtuKzFdKX1yZXR1cm4gZX1mdW5jdGlvbiB3dChlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90K2U6ZX1mdW5jdGlvbiBrdChlKXtlLl9vPXZ0LGUuX249byxlLl9zPW4sZS5fbD1jdCxlLl90PXV0LGUuX3E9TyxlLl9pPVAsZS5fbT1odCxlLl9mPWx0LGUuX2s9ZnQsZS5fYj1wdCxlLl92PWZlLGUuX2U9ZGUsZS5fdT1fdCxlLl9nPXl0LGUuX2Q9YnQsZS5fcD13dH1mdW5jdGlvbiBTdChlLHQsbixvLHIpe3ZhciBhLGk9dGhpcyxzPXIub3B0aW9ucztmKG8sIl91aWQiKT8oYT1PYmplY3QuY3JlYXRlKG8pKS5fb3JpZ2luYWw9bzpvPShhPW8pLl9vcmlnaW5hbDt2YXIgYz1BKHMuX2NvbXBpbGVkKSx1PSFjO3RoaXMuZGF0YT1lLHRoaXMucHJvcHM9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy5wYXJlbnQ9byx0aGlzLmxpc3RlbmVycz1lLm9ufHxfLHRoaXMuaW5qZWN0aW9ucz1udChzLmluamVjdCxvKSx0aGlzLnNsb3RzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuJHNsb3RzfHxvdChlLnNjb3BlZFNsb3RzLGkuJHNsb3RzPXJ0KG4sbykpLGkuJHNsb3RzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2NvcGVkU2xvdHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvdChlLnNjb3BlZFNsb3RzLHRoaXMuc2xvdHMoKSl9fSksYyYmKHRoaXMuJG9wdGlvbnM9cyx0aGlzLiRzbG90cz10aGlzLnNsb3RzKCksdGhpcy4kc2NvcGVkU2xvdHM9b3QoZS5zY29wZWRTbG90cyx0aGlzLiRzbG90cykpLHMuX3Njb3BlSWQ/dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1WdChhLGUsdCxuLHIsdSk7cmV0dXJuIGkmJiFBcnJheS5pc0FycmF5KGkpJiYoaS5mblNjb3BlSWQ9cy5fc2NvcGVJZCxpLmZuQ29udGV4dD1vKSxpfTp0aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBWdChhLGUsdCxuLHIsdSl9fWZ1bmN0aW9uIHh0KGUsdCxuLHIsaSl7dmFyIG89cGUoZSk7cmV0dXJuIG8uZm5Db250ZXh0PW4sby5mbk9wdGlvbnM9cix0LnNsb3QmJigoby5kYXRhfHwoby5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLG99ZnVuY3Rpb24gQ3QoZSx0KXtmb3IodmFyIG4gaW4gdCllW2gobildPXRbbl19a3QoU3QucHJvdG90eXBlKTt2YXIgVHQ9IkBpblJlY3ljbGVMaXN0IjtmdW5jdGlvbiBPdChlLHQsbixyKXtpZihhJiZhLnRhc2tDZW50ZXIpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGEudGFza0NlbnRlci5yZWdpc3Rlckhvb2s/YS50YXNrQ2VudGVyLnJlZ2lzdGVySG9vayhlLHQsbixyKTp2b2lkIDB9ZnVuY3Rpb24gRXQoZSxuLHQpe2lmKGIobikpaWYodCllLiRyZWZzPXt9O2Vsc2V7dmFyIHI9ZS4kcmVmc3x8e307T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1uW2VdO3JbZV09MT09PXQubGVuZ3RoP3RbMF06dH0pLGUuJHJlZnM9cn19ZnVuY3Rpb24gSXQoZSxuLHIsdCl7aWYoYihyKSl7dmFyIGk9ZS4kcmVmc3x8e307dD9PYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZV07aVtlXSYmKDE9PT10Lmxlbmd0aCYmQXJyYXkuaXNBcnJheShpW2VdKT9kZWxldGUgaVtlXVtuXTpkZWxldGUgaVtlXSl9KTooT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdOzE9PT10Lmxlbmd0aD8oQXJyYXkuaXNBcnJheShpW2VdKXx8KGlbZV09W10pLGlbZV1bbl09dFswXSk6aVtlXT10fSksZS4kcmVmcz1pKX19dmFyIEF0PTA7ZnVuY3Rpb24gJHQoZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhLG49ZS4kb3B0aW9ucy5jb21wdXRlZHx8e30scj1lLl9kYXRhP09iamVjdC5hc3NpZ24oe30sZS5fZGF0YSk6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/d24odCxlKTp0fHx7fSxpPXt9O2Zvcih2YXIgbyBpbiBuKWlbb109ZVtvXTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyLGkpfWZ1bmN0aW9uIFB0KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgcj10aGlzLHQ9ZS5jb21wb25lbnRJZDtGKHIsIl92bVRlbXBsYXRlIixlLnZtVGVtcGxhdGUpLHIuX3VpZD10fHwidmlydHVhbC1jb21wb25lbnQtIitBdCsrLHIuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P05uKHIsZSk6ci4kb3B0aW9ucz1BZShCbihyLmNvbnN0cnVjdG9yKSxlfHx7fSxyKSxubigoci5fcmVuZGVyUHJveHk9cikuX3NlbGY9ciksWXQocikscXQociksYW4ociwiYmVmb3JlQ3JlYXRlIiksdHQociksYm4ociksZXQociksYW4ociwiY3JlYXRlZCIpLE90KHQsImxpZmVjeWNsZSIsImF0dGFjaCIsZnVuY3Rpb24oZSl7RXQocixlJiZlLnJlZnMpLGFuKHIsImJlZm9yZU1vdW50IiksbmV3IG1uKHIsZnVuY3Rpb24oKXtyZXR1cm4gJHQocil9LGZ1bmN0aW9uKCl7cmV0dXJuIHIuX3VwZGF0ZShyLl92bm9kZSwhMSl9KSxyLl9pc01vdW50ZWQ9ITAsYW4ociwibW91bnRlZCIpfSksT3QodCwibGlmZWN5Y2xlIiwidXBkYXRlIixmdW5jdGlvbihlKXtFdChyLGUmJmUucmVmcyksci5fdXBkYXRlKHIuX3Zub2RlLCExKX0pLE90KHQsImxpZmVjeWNsZSIsInN5bmNTdGF0ZSIsZnVuY3Rpb24oZSx0KXtpZihkKHQpKWZvcih2YXIgbiBpbiB0KXJbbl09dFtuXTtyZXR1cm4gJHQocil9KSxPdCh0LCJsaWZlY3ljbGUiLCJkZXRhY2giLGZ1bmN0aW9uKGUpe0V0KHIsZSYmZS5yZWZzLCEwKSxyLiRkZXN0cm95KCksci5fdm1UZW1wbGF0ZSYmKHIuX3ZtVGVtcGxhdGUucmVtb3ZlVmlydHVhbENvbXBvbmVudChyLl91aWQpLGRlbGV0ZSByLl92bVRlbXBsYXRlKX0pfWZ1bmN0aW9uIE10KGUpe3ZhciB0PXRoaXMsbj10LiRvcHRpb25zLmNvbXBvbmVudElkOyh0Ll9pc01vdW50ZWQmJmFuKHQsImJlZm9yZVVwZGF0ZSIpLHQuX3Zub2RlPWUsdC5faXNNb3VudGVkJiZuKSYmZnVuY3Rpb24oZSx0LG4pe2lmKGEmJmEudGFza0NlbnRlcikiZnVuY3Rpb24iPT10eXBlb2YgYS50YXNrQ2VudGVyLnVwZGF0ZURhdGEmJmEudGFza0NlbnRlci51cGRhdGVEYXRhKGUsdCxuKX0obiwkdCh0KSxmdW5jdGlvbigpe2FuKHQsInVwZGF0ZWQiKX0pfWZ1bmN0aW9uIGp0KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD10aGlzO3QuX3VpZD0idmlydHVhbC1jb21wb25lbnQtdGVtcGxhdGUtIitBdCsrLHQuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P05uKHQsZSk6dC4kb3B0aW9ucz1BZShCbih0LmNvbnN0cnVjdG9yKSxlfHx7fSx0KSxZdCh0Ll9zZWxmPXQpLHF0KHQpLGJuKHQpLHRoaXMucmVnaXN0ZXJWaXJ0dWFsQ29tcG9uZW50KCl9ZnVuY3Rpb24gTnQoZSl7dmFyIHQsbixpLG87ZGVsZXRlIGUuZGF0YS5hdHRyc1tUdF0sbj0odD1lKS5jb21wb25lbnRPcHRpb25zLkN0b3IsaT1uLmV4dGVuZCh7fSksbz1pLnByb3RvdHlwZS4kZW1pdCxpLnByb3RvdHlwZS5faW5pdD1QdCxpLnByb3RvdHlwZS5fdXBkYXRlPU10LGkucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcj10aGlzLl91aWQsaT10aGlzLl92bVRlbXBsYXRlO3JldHVybiByJiZpJiYodC5wdXNoKHIpLG8uYXBwbHkoaSx0KSksby5hcHBseSh0aGlzLHQpfSx0LmNvbXBvbmVudE9wdGlvbnMuQ3Rvcj1uLmV4dGVuZCh7bWV0aG9kczp7cmVnaXN0ZXJWaXJ0dWFsQ29tcG9uZW50OmZ1bmN0aW9uKCl7dmFyIHI9dGhpcztGKHIsIl92aXJ0dWFsQ29tcG9uZW50cyIse30pLE90KFN0cmluZyhyLl91aWQpLCJsaWZlY3ljbGUiLCJjcmVhdGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGkoe3ZtVGVtcGxhdGU6cixjb21wb25lbnRJZDplLHByb3BzRGF0YTp0fSk7cmV0dXJuIG4uX3VpZD1lLHIuX3ZpcnR1YWxDb21wb25lbnRzJiYoci5fdmlydHVhbENvbXBvbmVudHNbZV09biksJHQobil9KX0scmVtb3ZlVmlydHVhbENvbXBvbmVudDpmdW5jdGlvbihlKXtkZWxldGUgdGhpcy5fdmlydHVhbENvbXBvbmVudHNbZV19fSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fdmlydHVhbENvbXBvbmVudHN9fSksdC5jb21wb25lbnRPcHRpb25zLkN0b3IucHJvdG90eXBlLl9pbml0PWp0LHQuY29tcG9uZW50T3B0aW9ucy5DdG9yLnByb3RvdHlwZS5fdXBkYXRlPUw7dmFyIHI9UnQoZSksYT1yLiRvcHRpb25zWyJAcmVuZGVyIl07aWYoYSl0cnl7cmV0dXJuIGEuY2FsbChyKX1jYXRjaChlKXtCZShlLHIsIkByZW5kZXIiKX19dmFyIEJ0PXtpbml0OmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUuY29tcG9uZW50SW5zdGFuY2UmJiFlLmNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCYmZS5kYXRhLmtlZXBBbGl2ZSl7dmFyIGk9ZTtCdC5wcmVwYXRjaChpLGkpfWVsc2V7KGUuY29tcG9uZW50SW5zdGFuY2U9UnQoZSx0bixuLHIpKS4kbW91bnQodD9lLmVsbTp2b2lkIDAsdCl9fSxwcmVwYXRjaDpmdW5jdGlvbihlLHQpe3ZhciBuPXQuY29tcG9uZW50T3B0aW9uczshZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1yLmRhdGEuc2NvcGVkU2xvdHMsYT1lLiRzY29wZWRTbG90cyxzPSEhKG8mJiFvLiRzdGFibGV8fGEhPT1fJiYhYS4kc3RhYmxlfHxvJiZlLiRzY29wZWRTbG90cy4ka2V5IT09by4ka2V5KSxjPSEhKGl8fGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVufHxzKTtlLiRvcHRpb25zLl9wYXJlbnRWbm9kZT1yLGUuJHZub2RlPXIsZS5fdm5vZGUmJihlLl92bm9kZS5wYXJlbnQ9cik7aWYoZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW49aSxlLiRhdHRycz1yLmRhdGEuYXR0cnN8fF8sZS4kbGlzdGVuZXJzPW58fF8sdCYmZS4kb3B0aW9ucy5wcm9wcyl7eWUoITEpO2Zvcih2YXIgdT1lLl9wcm9wcyxsPWUuJG9wdGlvbnMuX3Byb3BLZXlzfHxbXSxkPTA7ZDxsLmxlbmd0aDtkKyspe3ZhciBmPWxbZF0scD1lLiRvcHRpb25zLnByb3BzO3VbZl09UGUoZixwLHQsZSl9eWUoITApLGUuJG9wdGlvbnMucHJvcHNEYXRhPXR9bj1ufHxfO3ZhciBoPWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztlLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM9bixlbihlLG4saCksYyYmKGUuJHNsb3RzPXJ0KGksci5jb250ZXh0KSxlLiRmb3JjZVVwZGF0ZSgpKX0odC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlLG4ucHJvcHNEYXRhLG4ubGlzdGVuZXJzLHQsbi5jaGlsZHJlbil9LGluc2VydDpmdW5jdGlvbihlKXt2YXIgdCxuPWUuY29udGV4dCxyPWUuY29tcG9uZW50SW5zdGFuY2U7ci5faXNNb3VudGVkfHwoci5faXNNb3VudGVkPSEwLGFuKHIsIm1vdW50ZWQiKSksZS5kYXRhLmtlZXBBbGl2ZSYmKG4uX2lzTW91bnRlZD8oKHQ9cikuX2luYWN0aXZlPSExLGNuLnB1c2godCkpOm9uKHIsITApKX0sZGVzdHJveTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbXBvbmVudEluc3RhbmNlO3QuX2lzRGVzdHJveWVkfHwoZS5kYXRhLmtlZXBBbGl2ZT9mdW5jdGlvbiBlKHQsbil7aWYobiYmKHQuX2RpcmVjdEluYWN0aXZlPSEwLHJuKHQpKSlyZXR1cm47aWYoIXQuX2luYWN0aXZlKXt0Ll9pbmFjdGl2ZT0hMDtmb3IodmFyIHI9MDtyPHQuJGNoaWxkcmVuLmxlbmd0aDtyKyspZSh0LiRjaGlsZHJlbltyXSk7YW4odCwiZGVhY3RpdmF0ZWQiKX19KHQsITApOnQuJGRlc3Ryb3koKSl9fSxMdD1PYmplY3Qua2V5cyhCdCk7ZnVuY3Rpb24gRHQoZSx0LG4scixpKXtpZighRShlKSl7dmFyIG89bi4kb3B0aW9ucy5fYmFzZTtpZihiKGUpJiYoZT1vLmV4dGVuZChlKSksImZ1bmN0aW9uIj09dHlwZW9mIGUpe3ZhciBhLHMsYyx1LGwsZCxmO2lmKEUoZS5jaWQpJiZ2b2lkIDA9PT0oZT1mdW5jdGlvbih0LG4pe2lmKEEodC5lcnJvcikmJkkodC5lcnJvckNvbXApKXJldHVybiB0LmVycm9yQ29tcDtpZihJKHQucmVzb2x2ZWQpKXJldHVybiB0LnJlc29sdmVkO3ZhciBlPUh0O2UmJkkodC5vd25lcnMpJiYtMT09PXQub3duZXJzLmluZGV4T2YoZSkmJnQub3duZXJzLnB1c2goZSk7aWYoQSh0LmxvYWRpbmcpJiZJKHQubG9hZGluZ0NvbXApKXJldHVybiB0LmxvYWRpbmdDb21wO2lmKGUmJiFJKHQub3duZXJzKSl7dmFyIHI9dC5vd25lcnM9W2VdLGk9ITAsbz1udWxsLGE9bnVsbDtlLiRvbigiaG9vazpkZXN0cm95ZWQiLGZ1bmN0aW9uKCl7cmV0dXJuIGsocixlKX0pO3ZhciBzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ci5sZW5ndGg7dDxuO3QrKylyW3RdLiRmb3JjZVVwZGF0ZSgpO2UmJihyLmxlbmd0aD0wLG51bGwhPT1vJiYoY2xlYXJUaW1lb3V0KG8pLG89bnVsbCksbnVsbCE9PWEmJihjbGVhclRpbWVvdXQoYSksYT1udWxsKSl9LGM9RChmdW5jdGlvbihlKXt0LnJlc29sdmVkPUd0KGUsbiksaT9yLmxlbmd0aD0wOnMoITApfSksdT1EKGZ1bmN0aW9uKGUpe0kodC5lcnJvckNvbXApJiYodC5lcnJvcj0hMCxzKCEwKSl9KSxsPXQoYyx1KTtyZXR1cm4gYihsKSYmKHcobCk/RSh0LnJlc29sdmVkKSYmbC50aGVuKGMsdSk6dyhsLmNvbXBvbmVudCkmJihsLmNvbXBvbmVudC50aGVuKGMsdSksSShsLmVycm9yKSYmKHQuZXJyb3JDb21wPUd0KGwuZXJyb3IsbikpLEkobC5sb2FkaW5nKSYmKHQubG9hZGluZ0NvbXA9R3QobC5sb2FkaW5nLG4pLDA9PT1sLmRlbGF5P3QubG9hZGluZz0hMDpvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvPW51bGwsRSh0LnJlc29sdmVkKSYmRSh0LmVycm9yKSYmKHQubG9hZGluZz0hMCxzKCExKSl9LGwuZGVsYXl8fDIwMCkpLEkobC50aW1lb3V0KSYmKGE9c2V0VGltZW91dChmdW5jdGlvbigpe2E9bnVsbCxFKHQucmVzb2x2ZWQpJiZ1KG51bGwpfSxsLnRpbWVvdXQpKSkpLGk9ITEsdC5sb2FkaW5nP3QubG9hZGluZ0NvbXA6dC5yZXNvbHZlZH19KGE9ZSxvKSkpcmV0dXJuIHM9YSxjPXQsdT1uLGw9cixkPWksKGY9ZGUoKSkuYXN5bmNGYWN0b3J5PXMsZi5hc3luY01ldGE9e2RhdGE6Yyxjb250ZXh0OnUsY2hpbGRyZW46bCx0YWc6ZH0sZjt0PXR8fHt9LEJuKGUpLEkodC5tb2RlbCkmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5tb2RlbCYmZS5tb2RlbC5wcm9wfHwidmFsdWUiLHI9ZS5tb2RlbCYmZS5tb2RlbC5ldmVudHx8ImlucHV0IjsodC5hdHRyc3x8KHQuYXR0cnM9e30pKVtuXT10Lm1vZGVsLnZhbHVlO3ZhciBpPXQub258fCh0Lm9uPXt9KSxvPWlbcl0sYT10Lm1vZGVsLmNhbGxiYWNrO0kobyk/KEFycmF5LmlzQXJyYXkobyk/LTE9PT1vLmluZGV4T2YoYSk6byE9PWEpJiYoaVtyXT1bYV0uY29uY2F0KG8pKTppW3JdPWF9KGUub3B0aW9ucyx0KTt2YXIgcD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5vcHRpb25zLnByb3BzO2lmKCFFKHIpKXt2YXIgaT17fSxvPWUuYXR0cnMsYT1lLnByb3BzO2lmKEkobyl8fEkoYSkpZm9yKHZhciBzIGluIHIpe3ZhciBjPVMocyk7S2UoaSxhLHMsYywhMCl8fEtlKGksbyxzLGMsITEpfXJldHVybiBpfX0odCxlKTtpZihBKGUub3B0aW9ucy5mdW5jdGlvbmFsKSlyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1lLm9wdGlvbnMsYT17fSxzPW8ucHJvcHM7aWYoSShzKSlmb3IodmFyIGMgaW4gcylhW2NdPVBlKGMscyx0fHxfKTtlbHNlIEkobi5hdHRycykmJkN0KGEsbi5hdHRycyksSShuLnByb3BzKSYmQ3QoYSxuLnByb3BzKTt2YXIgdT1uZXcgU3QobixhLGkscixlKSxsPW8ucmVuZGVyLmNhbGwobnVsbCx1Ll9jLHUpO2lmKGwgaW5zdGFuY2VvZiB1ZSlyZXR1cm4geHQobCxuLHUucGFyZW50LG8pO2lmKEFycmF5LmlzQXJyYXkobCkpe2Zvcih2YXIgZD1aZShsKXx8W10sZj1uZXcgQXJyYXkoZC5sZW5ndGgpLHA9MDtwPGQubGVuZ3RoO3ArKylmW3BdPXh0KGRbcF0sbix1LnBhcmVudCxvKTtyZXR1cm4gZn19KGUscCx0LG4scik7dmFyIGg9dC5vbjtpZih0Lm9uPXQubmF0aXZlT24sQShlLm9wdGlvbnMuYWJzdHJhY3QpKXt2YXIgdj10LnNsb3Q7dD17fSx2JiYodC5zbG90PXYpfSFmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5ob29rfHwoZS5ob29rPXt9KSxuPTA7bjxMdC5sZW5ndGg7bisrKXt2YXIgcj1MdFtuXSxpPXRbcl0sbz1CdFtyXTtpPT09b3x8aSYmaS5fbWVyZ2VkfHwodFtyXT1pP0Z0KG8saSk6byl9fSh0KTt2YXIgZyxtPWUub3B0aW9ucy5uYW1lfHxpLHk9bmV3IHVlKCJ2dWUtY29tcG9uZW50LSIrZS5jaWQrKG0/Ii0iK206IiIpLHQsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbix7Q3RvcjplLHByb3BzRGF0YTpwLGxpc3RlbmVyczpoLHRhZzppLGNoaWxkcmVuOnJ9LGEpO3JldHVybihnPXkpLmRhdGEuYXR0cnMmJlR0IGluIGcuZGF0YS5hdHRycz9OdCh5KTp5fX19ZnVuY3Rpb24gUnQoZSx0LG4scil7dmFyIGk9e19pc0NvbXBvbmVudDohMCxfcGFyZW50Vm5vZGU6ZSxwYXJlbnQ6dCxfcGFyZW50RWxtOm58fG51bGwsX3JlZkVsbTpyfHxudWxsfSxvPWUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtyZXR1cm4gSShvKSYmKGkucmVuZGVyPW8ucmVuZGVyLGkuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zKSxuZXcgZS5jb21wb25lbnRPcHRpb25zLkN0b3IoaSl9ZnVuY3Rpb24gRnQobixyKXt2YXIgZT1mdW5jdGlvbihlLHQpe24oZSx0KSxyKGUsdCl9O3JldHVybiBlLl9tZXJnZWQ9ITAsZX12YXIgVXQ9MSx6dD0yO2Z1bmN0aW9uIFZ0KGUsdCxuLHIsaSxvKXtyZXR1cm4oQXJyYXkuaXNBcnJheShuKXx8JChuKSkmJihpPXIscj1uLG49dm9pZCAwKSxBKG8pJiYoaT16dCksZnVuY3Rpb24oZSx0LG4scixpKXtpZihJKG4pJiZJKG4uX19vYl9fKSlyZXR1cm4gZGUoKTtJKG4pJiZJKG4uaXMpJiYodD1uLmlzKTtpZighdClyZXR1cm4gZGUoKTtBcnJheS5pc0FycmF5KHIpJiYiZnVuY3Rpb24iPT10eXBlb2YgclswXSYmKChuPW58fHt9KS5zY29wZWRTbG90cz17ZGVmYXVsdDpyWzBdfSxyLmxlbmd0aD0wKTtpPT09enQ/cj1aZShyKTppPT09VXQmJihyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKEFycmF5LmlzQXJyYXkoZVt0XSkpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSk7cmV0dXJuIGV9KHIpKTt2YXIgbyxhO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHM7YT1lLiR2bm9kZSYmZS4kdm5vZGUubnN8fFIuZ2V0VGFnTmFtZXNwYWNlKHQpLG89Ui5pc1Jlc2VydmVkVGFnKHQpP25ldyB1ZShSLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHQpLG4scix2b2lkIDAsdm9pZCAwLGUpOm4mJm4ucHJlfHwhSShzPSRlKGUuJG9wdGlvbnMsImNvbXBvbmVudHMiLHQpKT9uZXcgdWUodCxuLHIsdm9pZCAwLHZvaWQgMCxlKTpEdChzLG4sZSxyLHQpfWVsc2Ugbz1EdCh0LG4sZSxyKTtyZXR1cm4gQXJyYXkuaXNBcnJheShvKT9vOkkobyk/KEkoYSkmJmZ1bmN0aW9uIGUodCxuLHIpe3QubnM9bjsiZm9yZWlnbk9iamVjdCI9PT10LnRhZyYmKHI9IShuPXZvaWQgMCkpO2lmKEkodC5jaGlsZHJlbikpZm9yKHZhciBpPTAsbz10LmNoaWxkcmVuLmxlbmd0aDtpPG87aSsrKXt2YXIgYT10LmNoaWxkcmVuW2ldO0koYS50YWcpJiYoRShhLm5zKXx8QShyKSYmInN2ZyIhPT1hLnRhZykmJmUoYSxuLHIpfX0obyxhKSxJKG4pJiZmdW5jdGlvbihlKXtiKGUuc3R5bGUpJiZIZShlLnN0eWxlKTtiKGUuY2xhc3MpJiZIZShlLmNsYXNzKX0obiksbyk6ZGUoKX0oZSx0LG4scixpKX1mdW5jdGlvbiBxdChpKXtpLl92bm9kZT1udWxsLGkuX3N0YXRpY1RyZWVzPW51bGw7dmFyIGU9aS4kb3B0aW9ucyx0PWkuJHZub2RlPWUuX3BhcmVudFZub2RlLG49dCYmdC5jb250ZXh0O2kuJHNsb3RzPXJ0KGUuX3JlbmRlckNoaWxkcmVuLG4pLGkuJHNjb3BlZFNsb3RzPV8saS5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVnQoaSxlLHQsbixyLCExKX0saS4kY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVnQoaSxlLHQsbixyLCEwKX07dmFyIHI9dCYmdC5kYXRhO3dlKGksIiRhdHRycyIsciYmci5hdHRyc3x8XyxudWxsLCEwKSx3ZShpLCIkbGlzdGVuZXJzIixlLl9wYXJlbnRMaXN0ZW5lcnN8fF8sbnVsbCwhMCl9dmFyIFd0LEh0PW51bGw7ZnVuY3Rpb24gR3QoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHxyZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLGIoZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBKdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIFh0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07aWYoSShuKSYmKEkobi5jb21wb25lbnRPcHRpb25zKXx8SnQobikpKXJldHVybiBufX1mdW5jdGlvbiBZdChlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJmVuKGUsdCl9ZnVuY3Rpb24gS3QoZSx0KXtXdC4kb24oZSx0KX1mdW5jdGlvbiBadChlLHQpe1d0LiRvZmYoZSx0KX1mdW5jdGlvbiBRdCh0LG4pe3ZhciByPVd0O3JldHVybiBmdW5jdGlvbiBlKCl7bnVsbCE9PW4uYXBwbHkobnVsbCxhcmd1bWVudHMpJiZyLiRvZmYodCxlKX19ZnVuY3Rpb24gZW4oZSx0LG4pe1hlKHQsbnx8e30sS3QsWnQsUXQsV3Q9ZSksV3Q9dm9pZCAwfXZhciB0bj1udWxsO2Z1bmN0aW9uIG5uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfWZ1bmN0aW9uIHJuKGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gb24oZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxybihlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKW9uKGUuJGNoaWxkcmVuW25dKTthbihlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gYW4oZSx0KXtzZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspTGUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxjZSgpfXZhciBzbj1bXSxjbj1bXSx1bj17fSxsbj0hMSxkbj0hMSxmbj0wO3ZhciBwbj1EYXRlLm5vdztpZihxJiYhSil7dmFyIGhuPXdpbmRvdy5wZXJmb3JtYW5jZTtobiYmImZ1bmN0aW9uIj09dHlwZW9mIGhuLm5vdyYmcG4oKT5hLmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKHBuPWZ1bmN0aW9uKCl7cmV0dXJuIGhuLm5vdygpfSl9ZnVuY3Rpb24gdm4oKXt2YXIgZSx0O2ZvcihwbigpLGRuPSEwLHNuLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksZm49MDtmbjxzbi5sZW5ndGg7Zm4rKykoZT1zbltmbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsdW5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPWNuLnNsaWNlKCkscj1zbi5zbGljZSgpO2ZuPXNuLmxlbmd0aD1jbi5sZW5ndGg9MCxsbj1kbj0hKHVuPXt9KSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxvbihlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJmFuKHIsInVwZGF0ZWQiKX19KHIpLGVlJiZSLmRldnRvb2xzJiZlZS5lbWl0KCJmbHVzaCIpfXZhciBnbj0wLG1uPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9Kytnbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBuZSx0aGlzLm5ld0RlcElkcz1uZXcgbmUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFVLnRlc3QoZSkpe3ZhciBuPWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe2lmKCFlKXJldHVybjtlPWVbblt0XV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1MKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O21uLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtzZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7QmUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJkhlKGUpLGNlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxtbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxtbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LG1uLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PXVuW3RdKXtpZih1blt0XT0hMCxkbil7Zm9yKHZhciBuPXNuLmxlbmd0aC0xO2ZuPG4mJnNuW25dLmlkPmUuaWQ7KW4tLTtzbi5zcGxpY2UobisxLDAsZSl9ZWxzZSBzbi5wdXNoKGUpO2xufHwobG49ITAscWUodm4pKX19KHRoaXMpfSxtbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fGIoZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe0JlKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LG1uLnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxtbi5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LG1uLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxrKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciB5bj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Okwsc2V0Okx9O2Z1bmN0aW9uIF9uKGUsdCxuKXt5bi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0seW4uc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix5bil9ZnVuY3Rpb24gYm4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihuLHIpe3ZhciBpPW4uJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxvPW4uX3Byb3BzPXt9LGE9bi4kb3B0aW9ucy5fcHJvcEtleXM9W107bi4kcGFyZW50JiZ5ZSghMSk7dmFyIGU9ZnVuY3Rpb24oZSl7YS5wdXNoKGUpO3ZhciB0PVBlKGUscixpLG4pO3dlKG8sZSx0KSxlIGluIG58fF9uKG4sIl9wcm9wcyIsZSl9O2Zvcih2YXIgdCBpbiByKWUodCk7eWUoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXtlLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09ImZ1bmN0aW9uIiE9dHlwZW9mIHRbbl0/TDptKHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO2QodD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3duKHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJmYocixvKXx8KHZvaWQgMCwzNiE9PShhPShvKyIiKS5jaGFyQ29kZUF0KDApKSYmOTUhPT1hJiZfbihlLCJfZGF0YSIsbykpfXZhciBhO2JlKHQsITApfShlKTpiZShlLl9kYXRhPXt9LCEwKSx0LmNvbXB1dGVkJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2NvbXB1dGVkV2F0Y2hlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxyPVEoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IG1uKGUsYXx8TCxMLGtuKSksaSBpbiBlfHxTbihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1LJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspVG4oZSxuLHJbaV0pO2Vsc2UgVG4oZSxuLHIpfX0oZSx0LndhdGNoKX1mdW5jdGlvbiB3bihlLHQpe3NlKCk7dHJ5e3JldHVybiBlLmNhbGwodCx0KX1jYXRjaChlKXtyZXR1cm4gQmUoZSx0LCJkYXRhKCkiKSx7fX1maW5hbGx5e2NlKCl9fXZhciBrbj17bGF6eTohMH07ZnVuY3Rpb24gU24oZSx0LG4pe3ZhciByPSFRKCk7ImZ1bmN0aW9uIj09dHlwZW9mIG4/KHluLmdldD1yP3huKHQpOkNuKG4pLHluLnNldD1MKTooeW4uZ2V0PW4uZ2V0P3ImJiExIT09bi5jYWNoZT94bih0KTpDbihuLmdldCk6TCx5bi5zZXQ9bi5zZXR8fEwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQseW4pfWZ1bmN0aW9uIHhuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NvbXB1dGVkV2F0Y2hlcnMmJnRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNbdF07aWYoZSlyZXR1cm4gZS5kaXJ0eSYmZS5ldmFsdWF0ZSgpLGFlLlNoYXJlZE9iamVjdC50YXJnZXQmJmUuZGVwZW5kKCksZS52YWx1ZX19ZnVuY3Rpb24gQ24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzLHRoaXMpfX1mdW5jdGlvbiBUbihlLHQsbixyKXtyZXR1cm4gZChuKSYmKG49KHI9bikuaGFuZGxlciksInN0cmluZyI9PXR5cGVvZiBuJiYobj1lW25dKSxlLiR3YXRjaCh0LG4scil9dmFyIE9uLEVuLEluLEFuLCRuLFBuLE1uLGpuPTA7ZnVuY3Rpb24gTm4oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50LG4uX3BhcmVudFZub2RlPXIsbi5fcGFyZW50RWxtPXQuX3BhcmVudEVsbSxuLl9yZWZFbG09dC5fcmVmRWxtO3ZhciBpPXIuY29tcG9uZW50T3B0aW9ucztuLnByb3BzRGF0YT1pLnByb3BzRGF0YSxuLl9wYXJlbnRMaXN0ZW5lcnM9aS5saXN0ZW5lcnMsbi5fcmVuZGVyQ2hpbGRyZW49aS5jaGlsZHJlbixuLl9jb21wb25lbnRUYWc9aS50YWcsdC5yZW5kZXImJihuLnJlbmRlcj10LnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyl9ZnVuY3Rpb24gQm4oZSl7dmFyIHQ9ZS5vcHRpb25zO2lmKGUuc3VwZXIpe3ZhciBuPUJuKGUuc3VwZXIpO2lmKG4hPT1lLnN1cGVyT3B0aW9ucyl7ZS5zdXBlck9wdGlvbnM9bjt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdCxuPWUub3B0aW9ucyxyPWUuc2VhbGVkT3B0aW9ucztmb3IodmFyIGkgaW4gbiluW2ldIT09cltpXSYmKHR8fCh0PXt9KSx0W2ldPW5baV0pO3JldHVybiB0fShlKTtyJiZCKGUuZXh0ZW5kT3B0aW9ucyxyKSwodD1lLm9wdGlvbnM9QWUobixlLmV4dGVuZE9wdGlvbnMpKS5uYW1lJiYodC5jb21wb25lbnRzW3QubmFtZV09ZSl9fXJldHVybiB0fWZ1bmN0aW9uIExuKGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24gRG4oZSl7ZS5jaWQ9MDt2YXIgYT0xO2UuZXh0ZW5kPWZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIHQ9dGhpcyxuPXQuY2lkLHI9ZS5fQ3Rvcnx8KGUuX0N0b3I9e30pO2lmKHJbbl0pcmV0dXJuIHJbbl07dmFyIGk9ZS5uYW1lfHx0Lm9wdGlvbnMubmFtZSxvPWZ1bmN0aW9uKGUpe3RoaXMuX2luaXQoZSl9O3JldHVybigoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8pLmNpZD1hKyssby5vcHRpb25zPUFlKHQub3B0aW9ucyxlKSxvLnN1cGVyPXQsby5vcHRpb25zLnByb3BzJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpX24oZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9KG8pLG8ub3B0aW9ucy5jb21wdXRlZCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KVNuKGUucHJvdG90eXBlLG4sdFtuXSl9KG8pLG8uZXh0ZW5kPXQuZXh0ZW5kLG8ubWl4aW49dC5taXhpbixvLnVzZT10LnVzZSxqLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT10W2VdfSksaSYmKG8ub3B0aW9ucy5jb21wb25lbnRzW2ldPW8pLG8uc3VwZXJPcHRpb25zPXQub3B0aW9ucyxvLmV4dGVuZE9wdGlvbnM9ZSxvLnNlYWxlZE9wdGlvbnM9Qih7fSxvLm9wdGlvbnMpLHJbbl09b319ZnVuY3Rpb24gUm4oZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24gRm4oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMTxlLmluZGV4T2YodCk6InN0cmluZyI9PXR5cGVvZiBlPy0xPGUuc3BsaXQoIiwiKS5pbmRleE9mKHQpOihuPWUsIltvYmplY3QgUmVnRXhwXSI9PT1yLmNhbGwobikmJmUudGVzdCh0KSk7dmFyIG59ZnVuY3Rpb24gVW4oZSx0KXt2YXIgbj1lLmNhY2hlLHI9ZS5rZXlzLGk9ZS5fdm5vZGU7Zm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107aWYoYSl7dmFyIHM9Um4oYS5jb21wb25lbnRPcHRpb25zKTtzJiYhdChzKSYmem4obixvLHIsaSl9fX1mdW5jdGlvbiB6bihlLHQsbixyKXt2YXIgaT1lW3RdOyFpfHxyJiZpLnRhZz09PXIudGFnfHxpLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLGsobix0KX1Mbi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Ll91aWQ9am4rKyx0Ll9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9Obih0LGUpOnQuJG9wdGlvbnM9QWUoQm4odC5jb25zdHJ1Y3RvciksZXx8e30sdCksbm4oKHQuX3JlbmRlclByb3h5PXQpLl9zZWxmPXQpLFl0KHQpLHF0KHQpLGFuKHQsImJlZm9yZUNyZWF0ZSIpLCJtcC10b3V0aWFvIiE9PXQubXBIb3N0JiZ0dCh0KSxibih0KSwibXAtdG91dGlhbyIhPT10Lm1wSG9zdCYmZXQodCksIm1wLXRvdXRpYW8iIT09dC5tcEhvc3QmJmFuKHQsImNyZWF0ZWQiKSx0LiRvcHRpb25zLmVsJiZ0LiRtb3VudCh0LiRvcHRpb25zLmVsKX0sT249TG4sRW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0sSW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wc319LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPbi5wcm90b3R5cGUsIiRkYXRhIixFbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KE9uLnByb3RvdHlwZSwiJHByb3BzIixJbiksT24ucHJvdG90eXBlLiRzZXQ9a2UsT24ucHJvdG90eXBlLiRkZWxldGU9U2UsT24ucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZihkKHQpKXJldHVybiBUbihyLGUsdCxuKTsobj1ufHx7fSkudXNlcj0hMDt2YXIgaT1uZXcgbW4ocixlLHQsbik7aWYobi5pbW1lZGlhdGUpdHJ5e3QuY2FsbChyLGkudmFsdWUpfWNhdGNoKGUpe0JlKGUsciwnY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyICInK2kuZXhwcmVzc2lvbisnIicpfXJldHVybiBmdW5jdGlvbigpe2kudGVhcmRvd24oKX19LCRuPS9eaG9vazovLChBbj1MbikucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9uKGVbbl0sdCk7ZWxzZSh0aGlzLl9ldmVudHNbZV18fCh0aGlzLl9ldmVudHNbZV09W10pKS5wdXNoKHQpLCRuLnRlc3QoZSkmJih0aGlzLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiB0aGlzfSxBbi5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sQW4ucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcztpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb2ZmKGVbbl0sdCk7cmV0dXJuIHRoaXN9dmFyIGksbz10aGlzLl9ldmVudHNbZV07aWYoIW8pcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuX2V2ZW50c1tlXT1udWxsLHRoaXM7Zm9yKHZhciBhPW8ubGVuZ3RoO2EtLTspaWYoKGk9b1thXSk9PT10fHxpLmZuPT09dCl7by5zcGxpY2UoYSwxKTticmVha31yZXR1cm4gdGhpc30sQW4ucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PTE8dC5sZW5ndGg/eSh0KTp0O2Zvcih2YXIgbj15KGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKUxlKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9LChQbj1MbikucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMsaT1yLiRlbCxvPXIuX3Zub2RlLGE9KG49dG4sdG49cixmdW5jdGlvbigpe3RuPW59KTtyLl92bm9kZT1lLG8/ci4kZWw9ci5fX3BhdGNoX18obyxlKTooci4kZWw9ci5fX3BhdGNoX18oci4kZWwsZSx0LCExLHIuJG9wdGlvbnMuX3BhcmVudEVsbSxyLiRvcHRpb25zLl9yZWZFbG0pLHIuJG9wdGlvbnMuX3BhcmVudEVsbT1yLiRvcHRpb25zLl9yZWZFbG09bnVsbCksYSgpLGkmJihpLl9fdnVlX189bnVsbCksci4kZWwmJihyLiRlbC5fX3Z1ZV9fPXIpLHIuJHZub2RlJiZyLiRwYXJlbnQmJnIuJHZub2RlPT09ci4kcGFyZW50Ll92bm9kZSYmKHIuJHBhcmVudC4kZWw9ci4kZWwpfSxQbi5wcm90b3R5cGUuJGZvcmNlVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fd2F0Y2hlciYmdGhpcy5fd2F0Y2hlci51cGRhdGUoKX0sUG4ucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7YW4oZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxrKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLGFuKGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19LGt0KChNbj1MbikucHJvdG90eXBlKSxNbi5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKGUpe3JldHVybiBxZShlLHRoaXMpfSxNbi5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciB0LG49dGhpcyxlPW4uJG9wdGlvbnMscj1lLnJlbmRlcixpPWUuX3BhcmVudFZub2RlO2kmJihuLiRzY29wZWRTbG90cz1vdChpLmRhdGEuc2NvcGVkU2xvdHMsbi4kc2xvdHMsbi4kc2NvcGVkU2xvdHMpKSxuLiR2bm9kZT1pO3RyeXtIdD1uLHQ9ci5jYWxsKG4uX3JlbmRlclByb3h5LG4uJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKGUpe0JlKGUsbiwicmVuZGVyIiksdD1uLl92bm9kZX1maW5hbGx5e0h0PW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJjE9PT10Lmxlbmd0aCYmKHQ9dFswXSksdCBpbnN0YW5jZW9mIHVlfHwodD1kZSgpKSx0LnBhcmVudD1pLHR9O3ZhciBWbixxbixXbixIbj1bU3RyaW5nLFJlZ0V4cCxBcnJheV0sR249e0tlZXBBbGl2ZTp7bmFtZToia2VlcC1hbGl2ZSIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6SG4sZXhjbHVkZTpIbixtYXg6W1N0cmluZyxOdW1iZXJdfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMua2V5cz1bXX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuY2FjaGUpem4odGhpcy5jYWNoZSxlLHRoaXMua2V5cyl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJHdhdGNoKCJpbmNsdWRlIixmdW5jdGlvbih0KXtVbihlLGZ1bmN0aW9uKGUpe3JldHVybiBGbih0LGUpfSl9KSx0aGlzLiR3YXRjaCgiZXhjbHVkZSIsZnVuY3Rpb24odCl7VW4oZSxmdW5jdGlvbihlKXtyZXR1cm4hRm4odCxlKX0pfSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNsb3RzLmRlZmF1bHQsdD1YdChlKSxuPXQmJnQuY29tcG9uZW50T3B0aW9ucztpZihuKXt2YXIgcj1SbihuKSxpPXRoaXMuaW5jbHVkZSxvPXRoaXMuZXhjbHVkZTtpZihpJiYoIXJ8fCFGbihpLHIpKXx8byYmciYmRm4obyxyKSlyZXR1cm4gdDt2YXIgYT10aGlzLmNhY2hlLHM9dGhpcy5rZXlzLGM9bnVsbD09dC5rZXk/bi5DdG9yLmNpZCsobi50YWc/Ijo6IituLnRhZzoiIik6dC5rZXk7YVtjXT8odC5jb21wb25lbnRJbnN0YW5jZT1hW2NdLmNvbXBvbmVudEluc3RhbmNlLGsocyxjKSxzLnB1c2goYykpOihhW2NdPXQscy5wdXNoKGMpLHRoaXMubWF4JiZzLmxlbmd0aD5wYXJzZUludCh0aGlzLm1heCkmJnpuKGEsc1swXSxzLHRoaXMuX3Zub2RlKSksdC5kYXRhLmtlZXBBbGl2ZT0hMH1yZXR1cm4gdHx8ZSYmZVswXX19fTtWbj1MbixXbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFJ9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVm4sImNvbmZpZyIsV24pLFZuLnV0aWw9e3dhcm46aWUsZXh0ZW5kOkIsbWVyZ2VPcHRpb25zOkFlLGRlZmluZVJlYWN0aXZlOndlfSxWbi5zZXQ9a2UsVm4uZGVsZXRlPVNlLFZuLm5leHRUaWNrPXFlLFZuLm9ic2VydmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGJlKGUpLGV9LFZuLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxqLmZvckVhY2goZnVuY3Rpb24oZSl7Vm4ub3B0aW9uc1tlKyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLEIoKFZuLm9wdGlvbnMuX2Jhc2U9Vm4pLm9wdGlvbnMuY29tcG9uZW50cyxHbiksVm4udXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZigtMTx0LmluZGV4T2YoZSkpcmV0dXJuIHRoaXM7dmFyIG49eShhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9LFZuLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9QWUodGhpcy5vcHRpb25zLGUpLHRoaXN9LERuKFZuKSxxbj1WbixqLmZvckVhY2goZnVuY3Rpb24obil7cW5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8oImNvbXBvbmVudCI9PT1uJiZkKHQpJiYodC5uYW1lPXQubmFtZXx8ZSx0PXRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQodCkpLCJkaXJlY3RpdmUiPT09biYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXtiaW5kOnQsdXBkYXRlOnR9KSx0aGlzLm9wdGlvbnNbbisicyJdW2VdPXQpOnRoaXMub3B0aW9uc1tuKyJzIl1bZV19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KExuLnByb3RvdHlwZSwiJGlzU2VydmVyIix7Z2V0OlF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTG4ucHJvdG90eXBlLCIkc3NyQ29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTG4sIkZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0Iix7dmFsdWU6U3R9KSxMbi52ZXJzaW9uPSIyLjYuMTAiO3ZhciBKbj0xO2Z1bmN0aW9uIFhuKGUpe3RoaXMuaW5zdGFuY2VJZD0iIix0aGlzLm5vZGVJZD1KbisrLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubm9kZVR5cGU9Myx0aGlzLnRleHQ9ZX1mdW5jdGlvbiBZbihlKXtyZXR1cm4gYS5jcmVhdGVFbGVtZW50KGUpfXZhciBLbj1PYmplY3QuZnJlZXplKHtuYW1lc3BhY2VNYXA6e30sY3JlYXRlRWxlbWVudDpZbixjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYS5jcmVhdGVFbGVtZW50KGUrIjoiK3QpfSxjcmVhdGVUZXh0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFhuKGUpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBhLmNyZWF0ZUNvbW1lbnQoZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7aWYoMyE9PXQubm9kZVR5cGUpZS5pbnNlcnRCZWZvcmUodCxuKTtlbHNle3ZhciByPSJ3ZWV4Ij09PWEuX18kY29tcGlsZXJfXz8idGV4dCI6InUtdGV4dCI7aWYoZS50eXBlPT09cillLnNldEF0dHIoInZhbHVlIix0LnRleHQpLHQucGFyZW50Tm9kZT1lO2Vsc2V7dmFyIGk9WW4ocik7aS5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSxlLmluc2VydEJlZm9yZShpLG4pfX19LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCl7MyE9PXQubm9kZVR5cGU/ZS5yZW1vdmVDaGlsZCh0KTplLnNldEF0dHIoInZhbHVlIiwiIil9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUsdCl7aWYoMyE9PXQubm9kZVR5cGUpZS5hcHBlbmRDaGlsZCh0KTtlbHNle3ZhciBuPSJ3ZWV4Ij09PWEuX18kY29tcGlsZXJfXz8idGV4dCI6InUtdGV4dCI7aWYoZS50eXBlPT09billLnNldEF0dHIoInZhbHVlIix0LnRleHQpLHQucGFyZW50Tm9kZT1lO2Vsc2V7dmFyIHI9WW4obik7ci5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSxlLmFwcGVuZENoaWxkKHIpfX19LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZXRBdHRyKCJ2YWx1ZSIsdCl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7ZS5zZXRBdHRyKHQsbil9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHIoIkBzdHlsZVNjb3BlIix0KX19KSxabj17Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7UW4odCl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe2UuZGF0YS5yZWYhPT10LmRhdGEucmVmJiYoUW4oZSwhMCksUW4odCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe1FuKGUsITApfX07ZnVuY3Rpb24gUW4oZSx0KXt2YXIgbj1lLmRhdGEucmVmO2lmKEkobikpe3ZhciByPWUuY29udGV4dCxpPWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZWxtLG89ci4kcmVmczt0P0FycmF5LmlzQXJyYXkob1tuXSk/ayhvW25dLGkpOm9bbl09PT1pJiYob1tuXT12b2lkIDApOmUuZGF0YS5yZWZJbkZvcj9BcnJheS5pc0FycmF5KG9bbl0pP29bbl0uaW5kZXhPZihpKTwwJiZvW25dLnB1c2goaSk6b1tuXT1baV06b1tuXT1pfX1zKCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIpLHMoInN2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSxmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3IiwhMCk7dmFyIGVyPXMoInRleHQsbnVtYmVyLHBhc3N3b3JkLHNlYXJjaCxlbWFpbCx0ZWwsdXJsIiksdHI9bmV3IHVlKCIiLHt9LFtdKSxucj1bImNyZWF0ZSIsImFjdGl2YXRlIiwidXBkYXRlIiwicmVtb3ZlIiwiZGVzdHJveSJdO2Z1bmN0aW9uIHJyKGUsdCl7cmV0dXJuIGUua2V5PT09dC5rZXkmJihlLnRhZz09PXQudGFnJiZlLmlzQ29tbWVudD09PXQuaXNDb21tZW50JiZJKGUuZGF0YSk9PT1JKHQuZGF0YSkmJmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0IiE9PWUudGFnKXJldHVybiEwO3ZhciBuLHI9SShuPWUuZGF0YSkmJkkobj1uLmF0dHJzKSYmbi50eXBlLGk9SShuPXQuZGF0YSkmJkkobj1uLmF0dHJzKSYmbi50eXBlO3JldHVybiByPT09aXx8ZXIocikmJmVyKGkpfShlLHQpfHxBKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT10LmFzeW5jRmFjdG9yeSYmRSh0LmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIGlyKGUsdCxuKXt2YXIgcixpLG89e307Zm9yKHI9dDtyPD1uOysrcilJKGk9ZVtyXS5rZXkpJiYob1tpXT1yKTtyZXR1cm4gb312YXIgb3I9e2NyZWF0ZTphcix1cGRhdGU6YXIsZGVzdHJveTpmdW5jdGlvbihlKXthcihlLHRyKX19O2Z1bmN0aW9uIGFyKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89dD09PXRyLGE9bj09PXRyLHM9Y3IodC5kYXRhLmRpcmVjdGl2ZXMsdC5jb250ZXh0KSxjPWNyKG4uZGF0YS5kaXJlY3RpdmVzLG4uY29udGV4dCksdT1bXSxsPVtdO2ZvcihlIGluIGMpcj1zW2VdLGk9Y1tlXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsdXIoaSwidXBkYXRlIixuLHQpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOih1cihpLCJiaW5kIixuLHQpLGkuZGVmJiZpLmRlZi5pbnNlcnRlZCYmdS5wdXNoKGkpKTtpZih1Lmxlbmd0aCl7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHUubGVuZ3RoO2UrKyl1cih1W2VdLCJpbnNlcnRlZCIsbix0KX07bz9ZZShuLCJpbnNlcnQiLGQpOmQoKX1sLmxlbmd0aCYmWWUobiwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bC5sZW5ndGg7ZSsrKXVyKGxbZV0sImNvbXBvbmVudFVwZGF0ZWQiLG4sdCl9KTtpZighbylmb3IoZSBpbiBzKWNbZV18fHVyKHNbZV0sInVuYmluZCIsdCx0LGEpfShlLHQpfXZhciBzcj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIGNyKGUsdCl7dmFyIG4scixpLG89T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gbztmb3Iobj0wO248ZS5sZW5ndGg7bisrKShyPWVbbl0pLm1vZGlmaWVyc3x8KHIubW9kaWZpZXJzPXNyKSwob1soaT1yLGkucmF3TmFtZXx8aS5uYW1lKyIuIitPYmplY3Qua2V5cyhpLm1vZGlmaWVyc3x8e30pLmpvaW4oIi4iKSldPXIpLmRlZj0kZSh0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixyLm5hbWUpO3JldHVybiBvfWZ1bmN0aW9uIHVyKHQsbixyLGUsaSl7dmFyIG89dC5kZWYmJnQuZGVmW25dO2lmKG8pdHJ5e28oci5lbG0sdCxyLGUsaSl9Y2F0Y2goZSl7QmUoZSxyLmNvbnRleHQsImRpcmVjdGl2ZSAiK3QubmFtZSsiICIrbisiIGhvb2siKX19dmFyIGxyPVtabixvcl0sZHI9dShmdW5jdGlvbihlKXt2YXIgbj17fSxyPS86KC4rKS87cmV0dXJuIGUuc3BsaXQoLzsoPyFbXihdKlwpKS9nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWUuc3BsaXQocik7MTx0Lmxlbmd0aCYmKG5bdFswXS50cmltKCldPXRbMV0udHJpbSgpKX19KSxufSk7ZnVuY3Rpb24gZnIoZSl7dmFyIHQ9cHIoZS5zdHlsZSk7cmV0dXJuIGUuc3RhdGljU3R5bGU/QihlLnN0YXRpY1N0eWxlLHQpOnR9ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/eChlKToic3RyaW5nIj09dHlwZW9mIGU/ZHIoZSk6ZX12YXIgaHI9e3ZpZXc6e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSxidXR0b246e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSxuYXZpZ2F0b3I6e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSwidS1pbnB1dCI6e2NsYXNzOlsicGxhY2Vob2xkZXJDbGFzcyJdLHN0eWxlOlsicGxhY2Vob2xkZXJTdHlsZSJdfSwidS10ZXh0YXJlYSI6e2NsYXNzOlsicGxhY2Vob2xkZXJDbGFzcyJdLHN0eWxlOlsicGxhY2Vob2xkZXJTdHlsZSJdfSwicGlja2VyLXZpZXciOntjbGFzczpbImluZGljYXRvckNsYXNzIiwibWFza0NsYXNzIl0sc3R5bGU6WyJpbmRpY2F0b3JTdHlsZSIsIm1hc2tTdHlsZSJdfX07ZnVuY3Rpb24gdnIoZSx0LG4scil7aWYoIXQpcmV0dXJuIHQ7dmFyIGk9aHJbbi50eXBlXTtpZihpKXtpZigtMSE9PWkuY2xhc3MuaW5kZXhPZihlKSlyZXR1cm4gci4kb3B0aW9ucy5zdHlsZSYmci4kb3B0aW9ucy5zdHlsZVt0XXx8e307aWYoLTEhPT1pLnN0eWxlLmluZGV4T2YoZSkpcmV0dXJuIHByKHQpfXJldHVybiB0fWZ1bmN0aW9uIGdyKGUsdCl7aWYoZS5kYXRhLmF0dHJzfHx0LmRhdGEuYXR0cnMpe3ZhciBuLHIsaT10LmVsbSxvPWUuZGF0YS5hdHRyc3x8e30sYT10LmRhdGEuYXR0cnN8fHt9O2EuX19vYl9fJiYoYT10LmRhdGEuYXR0cnM9Qih7fSxhKSk7dmFyIHM9ImZ1bmN0aW9uIj09dHlwZW9mIGkuc2V0QXR0cnMsYz17fTtmb3IobiBpbiBhKXI9YVtuXSxvW25dIT09ciYmKHM/Y1tuXT1yOmkuc2V0QXR0cihuLHZyKG4scixpLHQuY29udGV4dCkpKTtmb3IobiBpbiBvKW51bGw9PWFbbl0mJihzP2Nbbl09dm9pZCAwOmkuc2V0QXR0cihuKSk7cyYmaS5zZXRBdHRycyhmdW5jdGlvbihvLGUsdCl7dmFyIGE9aHJbZS50eXBlXTtpZighYSlyZXR1cm4gbzt2YXIgcz10LiRvcHRpb25zLnN0eWxlfHx7fSxjPXNbIkBWRVJTSU9OIl18fDE7cmV0dXJuIE9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9b1tlXTtpZigtMSE9PWEuY2xhc3MuaW5kZXhPZihlKSlpZihjPDJ8fCEoIi4iK3QgaW4gcykpb1tlXT1zW3RdfHx7fTtlbHNle3ZhciBuPShzWyIuIit0XXx8e30pWyIiXXx8e30scj17fTtmb3IodmFyIGkgaW4gbilyW2ldPW5baV1bMF07b1tlXT1yfWVsc2UtMSE9PWEuc3R5bGUuaW5kZXhPZihlKSYmKG9bZV09cHIodCkpfSksb30oYyxpLHQuY29udGV4dCkpfX12YXIgbXI9e2NyZWF0ZTpncix1cGRhdGU6Z3J9O2Z1bmN0aW9uIHlyKGUpe2Zvcih2YXIgdD1fcihlKSxuPWUscj1lO0koci5jb21wb25lbnRJbnN0YW5jZSk7KShyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmci5kYXRhJiYodD1CKF9yKHIpLHQpKTtmb3IoO0kobj1uLnBhcmVudCk7KW4mJm4uZGF0YSYmKHQ9Qih0LF9yKG4pKSk7cmV0dXJuIHR9ZnVuY3Rpb24gX3IoZSl7dmFyIHQsbixyLGksbz1lLmRhdGE7cmV0dXJuIEUoby5zdGF0aWNDbGFzcykmJkUoby5jbGFzcyk/e306KHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1lLnN0YXRpY0NsYXNzLHI9ZS5jbGFzcztuJiZ0LnB1c2guYXBwbHkodCxuKTtBcnJheS5pc0FycmF5KHIpP3QucHVzaC5hcHBseSh0LHIpOmIocik/dC5wdXNoLmFwcGx5KHQsT2JqZWN0LmtleXMocikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiByW2VdfSkpOiJzdHJpbmciPT10eXBlb2YgciYmdC5wdXNoLmFwcGx5KHQsci50cmltKCkuc3BsaXQoL1xzKy8pKTtyZXR1cm4gdH0obyksbj1lLmNvbnRleHQscj1uLiRvcHRpb25zLnN0eWxlfHx7fSxpPXt9LHQuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdO0IoaSx0KX0pLGkpfWZ1bmN0aW9uIGJyKGUsdCxuLHIpe3ZhciBpLG8sYT17fTtmb3IobyBpbiBuKUUodFtvXSkmJihhW3IobyldPSIiKTtmb3IobyBpbiB0KShpPXRbb10pIT09bltvXSYmKGFbcihvKV09aSk7ZS5zZXRTdHlsZXMoYSl9ZnVuY3Rpb24gd3IoZSx0LG4pe3ZhciByPXQmJnQuY29udGV4dC4kb3B0aW9ucy5zdHlsZTtyJiYhZS5pbmNsdWRlcyhyKSYmKG4/ZS51bnNoaWZ0KHIpOmUucHVzaChyKSl9ZnVuY3Rpb24ga3IoZSl7Zm9yKHZhciB0PWUuZGF0YSxuPWUscj1lO0koci5jb21wb25lbnRJbnN0YW5jZSk7KShyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmci5kYXRhJiYodD1TcihyLmRhdGEsdCkpO2Zvcig7SShuPW4ucGFyZW50KTspbiYmbi5kYXRhJiYodD1Tcih0LG4uZGF0YSkpO3JldHVybiBmdW5jdGlvbihlLHQpe2lmKEkoZSl8fEkodCkpcmV0dXJuIHhyKENyKGUpLENyKHQpKTtyZXR1cm4iIn0odC5zdGF0aWNDbGFzcyx0LmNsYXNzKX1mdW5jdGlvbiBTcihlLHQpe3JldHVybntzdGF0aWNDbGFzczp4cihDcihlLnN0YXRpY0NsYXNzKSxDcih0LnN0YXRpY0NsYXNzKSksY2xhc3M6SShlLmNsYXNzKT9bZS5jbGFzcyx0LmNsYXNzXTp0LmNsYXNzfX1mdW5jdGlvbiB4cihlLHQpe3JldHVybiBlP3Q/ZSsiICIrdDplOnR8fCIifWZ1bmN0aW9uIENyKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPSIiLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspSSh0PUNyKGVbcl0pKSYmIiIhPT10JiYobiYmKG4rPSIgIiksbis9dCk7cmV0dXJuIG59KGUpOmIoZSk/ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz0iICIpLHQrPW4pO3JldHVybiB0fShlKToic3RyaW5nIj09dHlwZW9mIGU/ZToiIn1mdW5jdGlvbiBUcihlLHQpe3ZhciBuPXQuZGF0YSxyPWUuZGF0YTtpZighKEUobi5zdGF0aWNDbGFzcykmJkUobi5jbGFzcykmJihFKHIpfHxFKHIuc3RhdGljQ2xhc3MpJiZFKHIuY2xhc3MpKSkpe3ZhciBpPSJ3ZWV4Ij09PWEuX18kc3R5bGVDb21waWxlcl9fO2lmKGEuX18kYXV0b21hdG9yX198fCFpKXtpfHx0LmVsbS5zZXRTdHlsZXNoZWV0JiZ0LmVsbS5zZXRTdHlsZXNoZWV0KGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49ZSxyPWU7Zm9yKHdyKHQsZSk7SShyLmNvbXBvbmVudEluc3RhbmNlKTspd3IodCxyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLCEwKTtmb3IoO0kobj1uLnBhcmVudCk7KXdyKHQsbik7cmV0dXJuIHR9KHQpKTt2YXIgbz1rcih0KTt0LmVsbS5zZXRDbGFzc0xpc3QmJnQuZWxtLnNldENsYXNzTGlzdChvLnNwbGl0KCIgIikpfWkmJmJyKHQuZWxtLHlyKHQpLHlyKGUpLE9yKX19ZnVuY3Rpb24gT3IoZSl7cmV0dXJuIGV9dmFyIEVyLElyLEFyPXtjcmVhdGU6VHIsdXBkYXRlOlRyfTtmdW5jdGlvbiAkcihlLHQsbixyLGkpe2lmKG4pY29uc29sZS5sb2coIldlZXggZG8gbm90IHN1cHBvcnQgZXZlbnQgaW4gYnViYmxlIHBoYXNlLiIpO2Vsc2V7aWYoSXImJklyLl92aXJ0dWFsQ29tcG9uZW50cyl7RXIuX2NvbnRleHQ9SXI7dmFyIG89dDt0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcj0odFswXXx8e30pLmNvbXBvbmVudElkLGk9dGhpcy5fY29udGV4dDtyJiZ0aGlzLl9jb250ZXh0JiYoaT0odGhpcy5fY29udGV4dC5fdmlydHVhbENvbXBvbmVudHN8fHt9KVtyXXx8aSk7dHJ5eyFmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49bnVsbCk7dmFyIHI9ZS5mbnM7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseShuLHQpOmUuYXBwbHkobix0KTtmb3IodmFyIGk9ci5zbGljZSgpLG89MDtvPGkubGVuZ3RoO28rKylpW29dLmFwcGx5KG4sdCl9KG8sdCxpKX1jYXRjaChlKXtCZShlLGksIkZhaWxlZCB0byBpbnZva2UgdmlydHVhbCBjb21wb25lbnQgaGFuZGxlciAoIityKyIpIil9fX1Fci5hZGRFdmVudChlLHQsaSl9fWZ1bmN0aW9uIFByKGUsdCxuLHIpeyhyfHxFcikucmVtb3ZlRXZlbnQoZSl9ZnVuY3Rpb24gTXIoZSx0KXtpZihlLmRhdGEub258fHQuZGF0YS5vbil7dmFyIG49dC5kYXRhLm9ufHx7fSxyPWUuZGF0YS5vbnx8e307RXI9dC5lbG0sSXI9dC5jb250ZXh0LFhlKG4sciwkcixQcix0LmNvbnRleHQpLElyPUVyPXZvaWQgMH19dmFyIGpyPXtjcmVhdGU6TXIsdXBkYXRlOk1yfSxOcj11KGgpO2Z1bmN0aW9uIEJyKGUsdCl7dmFyIG49dC5kYXRhLHI9ZS5kYXRhO2lmKCEoRShuLnN0YXRpY1N0eWxlKSYmRShuLnN0eWxlKSYmRShyLnN0YXRpY1N0eWxlKSYmRShyLnN0eWxlKSkpe3ZhciBpPXQuZWxtLG89ci5zdGF0aWNTdHlsZSxhPXIubm9ybWFsaXplZFN0eWxlfHxyLnN0eWxlfHx7fSxzPW98fGEsYz1wcih0LmRhdGEuc3R5bGUpfHx7fTt0LmRhdGEubm9ybWFsaXplZFN0eWxlPUkoYy5fX29iX18pP0Ioe30sYyk6YyxicihpLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj17fTtpZih0KWZvcih2YXIgaT1lO2kuY29tcG9uZW50SW5zdGFuY2U7KShpPWkuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmaS5kYXRhJiYobj1mcihpLmRhdGEpKSYmQihyLG4pOyhuPWZyKGUuZGF0YSkpJiZCKHIsbik7Zm9yKHZhciBvPWU7bz1vLnBhcmVudDspby5kYXRhJiYobj1mcihvLmRhdGEpKSYmQihyLG4pO3JldHVybiByfSh0LCEwKSxzLE5yKX19dmFyIExyPXtjcmVhdGU6QnIsdXBkYXRlOkJyfTtmdW5jdGlvbiBEcihlKXtpZihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciB0PXt9O3JldHVybiExIT09ZS5jc3MmJkIodCxScihlLm5hbWV8fCJ2IikpLEIodCxlKSx0fXJldHVybiJzdHJpbmciPT10eXBlb2YgZT9ScihlKTp2b2lkIDB9fXZhciBScj11KGZ1bmN0aW9uKGUpe3JldHVybntlbnRlckNsYXNzOmUrIi1lbnRlciIsZW50ZXJUb0NsYXNzOmUrIi1lbnRlci10byIsZW50ZXJBY3RpdmVDbGFzczplKyItZW50ZXItYWN0aXZlIixsZWF2ZUNsYXNzOmUrIi1sZWF2ZSIsbGVhdmVUb0NsYXNzOmUrIi1sZWF2ZS10byIsbGVhdmVBY3RpdmVDbGFzczplKyItbGVhdmUtYWN0aXZlIn19KTtxJiYhWCYmKHZvaWQgMD09PXdpbmRvdy5vbnRyYW5zaXRpb25lbmQmJndpbmRvdy5vbndlYmtpdHRyYW5zaXRpb25lbmQsdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ3aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQpO3EmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpO2Z1bmN0aW9uIEZyKGUsbil7dmFyIHI9bi5lbG07ci5fbGVhdmVDYiYmKHIuX2xlYXZlQ2IuY2FuY2VsbGVkPSEwLHIuX2xlYXZlQ2IoKSk7dmFyIHQ9RHIobi5kYXRhLnRyYW5zaXRpb24pO2lmKHQmJiFyLl9lbnRlckNiKXtmb3IodmFyIGk9dC5lbnRlckNsYXNzLG89dC5lbnRlclRvQ2xhc3MsYT10LmVudGVyQWN0aXZlQ2xhc3Mscz10LmFwcGVhckNsYXNzLGM9dC5hcHBlYXJUb0NsYXNzLHU9dC5hcHBlYXJBY3RpdmVDbGFzcyxsPXQuYmVmb3JlRW50ZXIsZD10LmVudGVyLGY9dC5hZnRlckVudGVyLHA9dC5lbnRlckNhbmNlbGxlZCxoPXQuYmVmb3JlQXBwZWFyLHY9dC5hcHBlYXIsZz10LmFmdGVyQXBwZWFyLG09dC5hcHBlYXJDYW5jZWxsZWQseT10bixfPXRuLiR2bm9kZTtfJiZfLnBhcmVudDspeT0oXz1fLnBhcmVudCkuY29udGV4dDt2YXIgYj0heS5faXNNb3VudGVkfHwhbi5pc1Jvb3RJbnNlcnQ7aWYoIWJ8fHZ8fCIiPT09dil7dmFyIHc9Yj9zOmksaz1iP2M6byxTPWI/dTphLHg9YiYmaHx8bCxDPWImJiJmdW5jdGlvbiI9PXR5cGVvZiB2P3Y6ZCxUPWImJmd8fGYsTz1iJiZtfHxwLEU9QyYmMTwoQy5fbGVuZ3RofHxDLmxlbmd0aCksST1uLmNvbnRleHQuJG9wdGlvbnMuc3R5bGV8fHt9LEE9SVt3XSwkPUlbIkBUUkFOU0lUSU9OIl0mJklbIkBUUkFOU0lUSU9OIl1bU118fHt9LFA9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz17fSxhPXRbbl0scz10W3JdLGM9dFtpXTtpZihhKWZvcih2YXIgdSBpbiBhKW9bdV09ZS5zdHlsZVt1XTtpZihjKWZvcih2YXIgbCBpbiBjKTAhPT1sLmluZGV4T2YoInRyYW5zaXRpb24iKSYmKG9bbF09Y1tsXSk7cyYmQihvLHMpO3JldHVybiBvfShyLEksdyxrLFMpLE09MDxPYmplY3Qua2V5cyhQKS5sZW5ndGgsaj1yLl9lbnRlckNiPUQoZnVuY3Rpb24oKXtqLmNhbmNlbGxlZD9PJiZPKHIpOlQmJlQociksci5fZW50ZXJDYj1udWxsfSk7aWYoc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlPXIucGFyZW50Tm9kZSx0PWUmJmUuX3BlbmRpbmcmJmUuX3BlbmRpbmdbbi5rZXldOyh0JiZ0LmNvbnRleHQ9PT1uLmNvbnRleHQmJnQudGFnPT09bi50YWcmJnQuZWxtLl9sZWF2ZUNiJiZ0LmVsbS5fbGVhdmVDYigpLEMmJkMocixqKSxNKT9uLmNvbnRleHQuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6UCxkdXJhdGlvbjokLmR1cmF0aW9ufHwwLGRlbGF5OiQuZGVsYXl8fDAsdGltaW5nRnVuY3Rpb246JC50aW1pbmdGdW5jdGlvbnx8ImxpbmVhciJ9LEU/TDpqKTpFfHxqKCl9LDE2KSx4JiZ4KHIpLEEpaWYoImZ1bmN0aW9uIj09dHlwZW9mIHIuc2V0U3R5bGVzKXIuc2V0U3R5bGVzKEEpO2Vsc2UgZm9yKHZhciBOIGluIEEpci5zZXRTdHlsZShOLEFbTl0pO018fEV8fGooKX19fXZhciBVcj1mdW5jdGlvbihlKXt2YXIgcix0LHk9e30sbj1lLm1vZHVsZXMsXz1lLm5vZGVPcHM7Zm9yKHI9MDtyPG5yLmxlbmd0aDsrK3IpZm9yKHlbbnJbcl1dPVtdLHQ9MDt0PG4ubGVuZ3RoOysrdClJKG5bdF1bbnJbcl1dKSYmeVtucltyXV0ucHVzaChuW3RdW25yW3JdXSk7ZnVuY3Rpb24gbyhlKXt2YXIgdD1fLnBhcmVudE5vZGUoZSk7SSh0KSYmXy5yZW1vdmVDaGlsZCh0LGUpfWZ1bmN0aW9uIGIoZSx0LG4scixpLG8sYSl7aWYoSShlLmVsbSkmJkkobykmJihlPW9bYV09cGUoZSkpLGUuaXNSb290SW5zZXJ0PSFpLCFmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmRhdGE7aWYoSShpKSl7dmFyIG89SShlLmNvbXBvbmVudEluc3RhbmNlKSYmaS5rZWVwQWxpdmU7aWYoSShpPWkuaG9vaykmJkkoaT1pLmluaXQpJiZpKGUsITEsbixyKSxJKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBwKGUsdCksZChuLGUuZWxtLHIpLEEobykmJmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaSxvPWU7by5jb21wb25lbnRJbnN0YW5jZTspaWYobz1vLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxJKGk9by5kYXRhKSYmSShpPWkudHJhbnNpdGlvbikpe2ZvcihpPTA7aTx5LmFjdGl2YXRlLmxlbmd0aDsrK2kpeS5hY3RpdmF0ZVtpXSh0cixvKTt0LnB1c2gobyk7YnJlYWt9ZChuLGUuZWxtLHIpfShlLHQsbixyKSwhMH19KGUsdCxuLHIpKXt2YXIgcz1lLmRhdGEsYz1lLmNoaWxkcmVuLHU9ZS50YWc7aWYoSSh1KSl7ZS5lbG09ZS5ucz9fLmNyZWF0ZUVsZW1lbnROUyhlLm5zLHUpOl8uY3JlYXRlRWxlbWVudCh1LGUpLGYoZSk7dmFyIGw9SShzKSYmQShzLmFwcGVuZEFzVHJlZSk7bHx8KEkocykmJnYoZSx0KSxkKG4sZS5lbG0scikpLGgoZSxjLHQpLGwmJihJKHMpJiZ2KGUsdCksZChuLGUuZWxtLHIpKX1lbHNlIEEoZS5pc0NvbW1lbnQpP2UuZWxtPV8uY3JlYXRlQ29tbWVudChlLnRleHQpOmUuZWxtPV8uY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSxkKG4sZS5lbG0scil9fWZ1bmN0aW9uIHAoZSx0KXtJKGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSYmKHQucHVzaC5hcHBseSh0LGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSxlLmRhdGEucGVuZGluZ0luc2VydD1udWxsKSxlLmVsbT1lLmNvbXBvbmVudEluc3RhbmNlLiRlbCx3KGUpPyh2KGUsdCksZihlKSk6KFFuKGUpLHQucHVzaChlKSl9ZnVuY3Rpb24gZChlLHQsbil7SShlKSYmKEkobik/Xy5wYXJlbnROb2RlKG4pPT09ZSYmXy5pbnNlcnRCZWZvcmUoZSx0LG4pOl8uYXBwZW5kQ2hpbGQoZSx0KSl9ZnVuY3Rpb24gaChlLHQsbil7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrciliKHRbcl0sbixlLmVsbSxudWxsLCEwLHQscik7ZWxzZSAkKGUudGV4dCkmJl8uYXBwZW5kQ2hpbGQoZS5lbG0sXy5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoZS50ZXh0KSkpfWZ1bmN0aW9uIHcoZSl7Zm9yKDtlLmNvbXBvbmVudEluc3RhbmNlOyllPWUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO3JldHVybiBJKGUudGFnKX1mdW5jdGlvbiB2KGUsdCl7Zm9yKHZhciBuPTA7bjx5LmNyZWF0ZS5sZW5ndGg7KytuKXkuY3JlYXRlW25dKHRyLGUpO0kocj1lLmRhdGEuaG9vaykmJihJKHIuY3JlYXRlKSYmci5jcmVhdGUodHIsZSksSShyLmluc2VydCkmJnQucHVzaChlKSl9ZnVuY3Rpb24gZihlKXt2YXIgdDtpZihJKHQ9ZS5mblNjb3BlSWQpKV8uc2V0U3R5bGVTY29wZShlLmVsbSx0KTtlbHNlIGZvcih2YXIgbj1lO247KUkodD1uLmNvbnRleHQpJiZJKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJl8uc2V0U3R5bGVTY29wZShlLmVsbSx0KSxuPW4ucGFyZW50O0kodD10bikmJnQhPT1lLmNvbnRleHQmJnQhPT1lLmZuQ29udGV4dCYmSSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZfLnNldFN0eWxlU2NvcGUoZS5lbG0sdCl9ZnVuY3Rpb24gbShlLHQsbixyLGksbyl7Zm9yKDtyPD1pOysrciliKG5bcl0sbyxlLHQsITEsbixyKX1mdW5jdGlvbiBrKGUpe3ZhciB0LG4scj1lLmRhdGE7aWYoSShyKSlmb3IoSSh0PXIuaG9vaykmJkkodD10LmRlc3Ryb3kpJiZ0KGUpLHQ9MDt0PHkuZGVzdHJveS5sZW5ndGg7Kyt0KXkuZGVzdHJveVt0XShlKTtpZihJKHQ9ZS5jaGlsZHJlbikpZm9yKG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoOysrbilrKGUuY2hpbGRyZW5bbl0pfWZ1bmN0aW9uIFMoZSx0LG4scil7Zm9yKDtuPD1yOysrbil7dmFyIGk9dFtuXTtJKGkpJiYoSShpLnRhZyk/KGEoaSksayhpKSk6byhpLmVsbSkpfX1mdW5jdGlvbiBhKGUsdCl7aWYoSSh0KXx8SShlLmRhdGEpKXt2YXIgbixyPXkucmVtb3ZlLmxlbmd0aCsxO2ZvcihJKHQpP3QubGlzdGVuZXJzKz1yOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxyKSxJKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkkobj1uLl92bm9kZSkmJkkobi5kYXRhKSYmYShuLHQpLG49MDtuPHkucmVtb3ZlLmxlbmd0aDsrK24peS5yZW1vdmVbbl0oZSx0KTtJKG49ZS5kYXRhLmhvb2spJiZJKG49bi5yZW1vdmUpP24oZSx0KTp0KCl9ZWxzZSBvKGUuZWxtKX1mdW5jdGlvbiB4KGUsdCxuLHIpe2Zvcih2YXIgaT1uO2k8cjtpKyspe3ZhciBvPXRbaV07aWYoSShvKSYmcnIoZSxvKSlyZXR1cm4gaX19ZnVuY3Rpb24gQyhlLHQsbixyLGksbyl7aWYoZSE9PXQpe0kodC5lbG0pJiZJKHIpJiYodD1yW2ldPXBlKHQpKTt2YXIgYT10LmVsbT1lLmVsbTtpZihBKGUuaXNBc3luY1BsYWNlaG9sZGVyKSlJKHQuYXN5bmNGYWN0b3J5LnJlc29sdmVkKT9PKGUuZWxtLHQsbik6dC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7ZWxzZSBpZihBKHQuaXNTdGF0aWMpJiZBKGUuaXNTdGF0aWMpJiZ0LmtleT09PWUua2V5JiYoQSh0LmlzQ2xvbmVkKXx8QSh0LmlzT25jZSkpKXQuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZTtlbHNle3ZhciBzLGM9dC5kYXRhO0koYykmJkkocz1jLmhvb2spJiZJKHM9cy5wcmVwYXRjaCkmJnMoZSx0KTt2YXIgdT1lLmNoaWxkcmVuLGw9dC5jaGlsZHJlbjtpZihJKGMpJiZ3KHQpKXtmb3Iocz0wO3M8eS51cGRhdGUubGVuZ3RoOysrcyl5LnVwZGF0ZVtzXShlLHQpO0kocz1jLmhvb2spJiZJKHM9cy51cGRhdGUpJiZzKGUsdCl9RSh0LnRleHQpP0kodSkmJkkobCk/dSE9PWwmJmZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyxjPTAsdT0wLGw9dC5sZW5ndGgtMSxkPXRbMF0sZj10W2xdLHA9bi5sZW5ndGgtMSxoPW5bMF0sdj1uW3BdLGc9IWk7Yzw9bCYmdTw9cDspRShkKT9kPXRbKytjXTpFKGYpP2Y9dFstLWxdOnJyKGQsaCk/KEMoZCxoLHIsbix1KSxkPXRbKytjXSxoPW5bKyt1XSk6cnIoZix2KT8oQyhmLHYscixuLHApLGY9dFstLWxdLHY9blstLXBdKTpycihkLHYpPyhDKGQsdixyLG4scCksZyYmXy5pbnNlcnRCZWZvcmUoZSxkLmVsbSxfLm5leHRTaWJsaW5nKGYuZWxtKSksZD10WysrY10sdj1uWy0tcF0pOihycihmLGgpPyhDKGYsaCxyLG4sdSksZyYmXy5pbnNlcnRCZWZvcmUoZSxmLmVsbSxkLmVsbSksZj10Wy0tbF0pOihFKG8pJiYobz1pcih0LGMsbCkpLEUoYT1JKGgua2V5KT9vW2gua2V5XTp4KGgsdCxjLGwpKT9iKGgscixlLGQuZWxtLCExLG4sdSk6cnIocz10W2FdLGgpPyhDKHMsaCxyLG4sdSksdFthXT12b2lkIDAsZyYmXy5pbnNlcnRCZWZvcmUoZSxzLmVsbSxkLmVsbSkpOmIoaCxyLGUsZC5lbG0sITEsbix1KSksaD1uWysrdV0pO2w8Yz9tKGUsRShuW3ArMV0pP251bGw6bltwKzFdLmVsbSxuLHUscCxyKTpwPHUmJlMoMCx0LGMsbCl9KGEsdSxsLG4sbyk6SShsKT8oSShlLnRleHQpJiZfLnNldFRleHRDb250ZW50KGEsIiIpLG0oYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpJKHUpP1MoMCx1LDAsdS5sZW5ndGgtMSk6SShlLnRleHQpJiZfLnNldFRleHRDb250ZW50KGEsIiIpOmUudGV4dCE9PXQudGV4dCYmXy5zZXRUZXh0Q29udGVudChhLHQudGV4dCksSShjKSYmSShzPWMuaG9vaykmJkkocz1zLnBvc3RwYXRjaCkmJnMoZSx0KX19fWZ1bmN0aW9uIFQoZSx0LG4pe2lmKEEobikmJkkoZS5wYXJlbnQpKWUucGFyZW50LmRhdGEucGVuZGluZ0luc2VydD10O2Vsc2UgZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5kYXRhLmhvb2suaW5zZXJ0KHRbcl0pfXZhciBnPXMoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE8oZSx0LG4scil7dmFyIGksbz10LnRhZyxhPXQuZGF0YSxzPXQuY2hpbGRyZW47aWYocj1yfHxhJiZhLnByZSx0LmVsbT1lLEEodC5pc0NvbW1lbnQpJiZJKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7aWYoSShhKSYmKEkoaT1hLmhvb2spJiZJKGk9aS5pbml0KSYmaSh0LCEwKSxJKGk9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBwKHQsbiksITA7aWYoSShvKSl7aWYoSShzKSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihJKGk9YSkmJkkoaT1pLmRvbVByb3BzKSYmSShpPWkuaW5uZXJIVE1MKSl7aWYoaSE9PWUuaW5uZXJIVE1MKXJldHVybiExfWVsc2V7Zm9yKHZhciBjPSEwLHU9ZS5maXJzdENoaWxkLGw9MDtsPHMubGVuZ3RoO2wrKyl7aWYoIXV8fCFPKHUsc1tsXSxuLHIpKXtjPSExO2JyZWFrfXU9dS5uZXh0U2libGluZ31pZighY3x8dSlyZXR1cm4hMX1lbHNlIGgodCxzLG4pO2lmKEkoYSkpe3ZhciBkPSExO2Zvcih2YXIgZiBpbiBhKWlmKCFnKGYpKXtkPSEwLHYodCxuKTticmVha30hZCYmYS5jbGFzcyYmSGUoYS5jbGFzcyl9fWVsc2UgZS5kYXRhIT09dC50ZXh0JiYoZS5kYXRhPXQudGV4dCk7cmV0dXJuITB9cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtpZighRSh0KSl7dmFyIGEscz0hMSxjPVtdO2lmKEUoZSkpcz0hMCxiKHQsYyxpLG8pO2Vsc2V7dmFyIHU9SShlLm5vZGVUeXBlKTtpZighdSYmcnIoZSx0KSlDKGUsdCxjLG51bGwsbnVsbCxyKTtlbHNle2lmKHUpe2lmKDE9PT1lLm5vZGVUeXBlJiZlLmhhc0F0dHJpYnV0ZShNKSYmKGUucmVtb3ZlQXR0cmlidXRlKE0pLG49ITApLEEobikmJk8oZSx0LGMpKXJldHVybiBUKHQsYywhMCksZTthPWUsZT1uZXcgdWUoXy50YWdOYW1lKGEpLnRvTG93ZXJDYXNlKCkse30sW10sdm9pZCAwLGEpfXZhciBsPWUuZWxtLGQ9Xy5wYXJlbnROb2RlKGwpO2lmKGIodCxjLGwuX2xlYXZlQ2I/bnVsbDpkLF8ubmV4dFNpYmxpbmcobCkpLEkodC5wYXJlbnQpKWZvcih2YXIgZj10LnBhcmVudCxwPXcodCk7Zjspe2Zvcih2YXIgaD0wO2g8eS5kZXN0cm95Lmxlbmd0aDsrK2gpeS5kZXN0cm95W2hdKGYpO2lmKGYuZWxtPXQuZWxtLHApe2Zvcih2YXIgdj0wO3Y8eS5jcmVhdGUubGVuZ3RoOysrdil5LmNyZWF0ZVt2XSh0cixmKTt2YXIgZz1mLmRhdGEuaG9vay5pbnNlcnQ7aWYoZy5tZXJnZWQpZm9yKHZhciBtPTE7bTxnLmZucy5sZW5ndGg7bSsrKWcuZm5zW21dKCl9ZWxzZSBRbihmKTtmPWYucGFyZW50fUkoZCk/UygwLFtlXSwwLDApOkkoZS50YWcpJiZrKGUpfX1yZXR1cm4gVCh0LGMscyksdC5lbG19SShlKSYmayhlKX19KHtub2RlT3BzOktuLG1vZHVsZXM6W21yLEFyLGpyLExyLHtjcmVhdGU6RnIsYWN0aXZhdGU6RnIscmVtb3ZlOmZ1bmN0aW9uKG4sZSl7dmFyIHI9bi5lbG07ci5fZW50ZXJDYiYmKHIuX2VudGVyQ2IuY2FuY2VsbGVkPSEwLHIuX2VudGVyQ2IoKSk7dmFyIHQ9RHIobi5kYXRhLnRyYW5zaXRpb24pO2lmKCF0KXJldHVybiBlKCk7aWYoci5fbGVhdmVDYilyZXR1cm47dmFyIGk9dC5sZWF2ZUNsYXNzLG89dC5sZWF2ZVRvQ2xhc3MsYT10LmxlYXZlQWN0aXZlQ2xhc3Mscz10LmJlZm9yZUxlYXZlLGM9dC5sZWF2ZSx1PXQuYWZ0ZXJMZWF2ZSxsPXQubGVhdmVDYW5jZWxsZWQsZD10LmRlbGF5TGVhdmUsZj1jJiYxPChjLl9sZW5ndGh8fGMubGVuZ3RoKSxwPW4uY29udGV4dC4kb3B0aW9ucy5zdHlsZXx8e30saD1wW2ldLHY9cFtvXXx8cFthXSxnPXBbIkBUUkFOU0lUSU9OIl0mJnBbIkBUUkFOU0lUSU9OIl1bYV18fHt9LG09ci5fbGVhdmVDYj1EKGZ1bmN0aW9uKCl7ci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUuX3BlbmRpbmcmJihyLnBhcmVudE5vZGUuX3BlbmRpbmdbbi5rZXldPW51bGwpLG0uY2FuY2VsbGVkP2wmJmwocik6KGUoKSx1JiZ1KHIpKSxyLl9sZWF2ZUNiPW51bGx9KTtkP2QoeSk6eSgpO2Z1bmN0aW9uIHkoKXt2YXIgZT1uLmNvbnRleHQuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKTtmdW5jdGlvbiB0KCl7ZS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6dixkdXJhdGlvbjpnLmR1cmF0aW9ufHwwLGRlbGF5OmcuZGVsYXl8fDAsdGltaW5nRnVuY3Rpb246Zy50aW1pbmdGdW5jdGlvbnx8ImxpbmVhciJ9LGY/TDptKX1tLmNhbmNlbGxlZHx8KG4uZGF0YS5zaG93fHwoKHIucGFyZW50Tm9kZS5fcGVuZGluZ3x8KHIucGFyZW50Tm9kZS5fcGVuZGluZz17fSkpW24ua2V5XT1uKSxzJiZzKHIpLGg/ZS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6aH0sdCk6dCgpLGMmJmMocixtKSx2fHxmfHxtKCkpfX19XS5jb25jYXQobHIpLExPTkdfTElTVF9USFJFU0hPTEQ6MTB9KSx6cj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2ZSk7ZnVuY3Rpb24gVnIoZSxyKXt2YXIgaT1lLiRlbDtyZXR1cm4gaSYmImZ1bmN0aW9uIj09dHlwZW9mIGlbcl0/ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3JldHVybiBpW3JdLmFwcGx5KGksdCl9OihpZSgiQ2FuJ3QgZmluZCBjb21wb25lbnQgbWV0aG9kIFwiIityKyciIG9uICcraS50eXBlKSxMKX1mdW5jdGlvbiBxcihlLG4pe0FycmF5LmlzQXJyYXkobikmJighZnVuY3Rpb24oZixuKXtmb3IodmFyIGU9ZnVuY3Rpb24oZSx0KXt2YXIgZD16cltlXTtGKG4sZCxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHI9dGhpcy5sZW5ndGgsaT12ZVtkXTsiZnVuY3Rpb24iPT10eXBlb2YgaSYmaS5hcHBseSh0aGlzLHQpO3ZhciBvPVZyKGYsInJlbW92ZURhdGEiKSxhPVZyKGYsImluc2VydFJhbmdlIikscz1WcihmLCJzZXRMaXN0RGF0YSIpO3N3aXRjaChkKXtjYXNlInB1c2giOmEocix0KTticmVhaztjYXNlInBvcCI6byhyLTEsMSk7YnJlYWs7Y2FzZSJzaGlmdCI6bygwLDEpO2JyZWFrO2Nhc2UidW5zaGlmdCI6YSgwLHQpO2JyZWFrO2Nhc2Uic3BsaWNlIjp2YXIgYz10WzBdLHU9dFsxXSxsPXQuc2xpY2UoMik7MDx1JiZvKGMsdSksMDxsLmxlbmd0aCYmYShjLGwpO2JyZWFrO2Nhc2Uic29ydCI6Y2FzZSJyZXZlcnNlIjpzKHRoaXMuc2xpY2UoKSl9fSl9LHQ9MCxyPXpyLmxlbmd0aDt0PHI7dCsrKWUodCl9KGUsbiksbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2QodCkmJiFmKHQsIltbV2F0Y2hlZF1dIikmJihGKHQsIltbV2F0Y2hlZF1dIiwhMCksZS4kd2F0Y2goZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdCl0W2VdfSxmdW5jdGlvbigpe1ZyKGUsInVwZGF0ZURhdGEiKShuLmluZGV4T2YodCksdCl9LHtkZWVwOiEwfSkpfSkpfXZhciBXcj17bmFtZToicmVjeWNsZS1saXN0IixtZXRob2RzOntjbG9zZXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT10W3JdO3JldHVybihlPXRoaXMuJGVsKS5jbG9zZXN0LmFwcGx5KGUsbil9LHF1ZXJ5RWxlbWVudDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkucXVlcnlFbGVtZW50LmFwcGx5KGUsbil9LHF1ZXJ5RWxlbWVudEFsbDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkucXVlcnlFbGVtZW50QWxsLmFwcGx5KGUsbil9LHNjcm9sbFRvRWxlbWVudDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkuc2Nyb2xsVG9FbGVtZW50LmFwcGx5KGUsbil9LHJlc2V0TG9hZG1vcmU6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnJlc2V0TG9hZG1vcmUuYXBwbHkoZSxuKX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHRoaXMuX3Zub2RlJiZ0aGlzLiRvcHRpb25zWyJbW1VzZUNhY2hlXV0iXSlyZXR1cm4gRih0aGlzLiRvcHRpb25zLCJbW1VzZUNhY2hlXV0iLCExKSx0aGlzLl92bm9kZTt2YXIgbj10aGlzLiRvcHRpb25zLnBhcmVudCxyPXRoaXMuJGF0dHJzLmJpbmRpbmdFeHByZXNzaW9uO3JldHVybiBuJiZyJiYobi4kd2F0Y2gocixmdW5jdGlvbigpe3JldHVybiBGKHQuJG9wdGlvbnMsIltbVXNlQ2FjaGVdXSIsITApfSx7ZGVlcDohMCxpbW1lZGlhdGU6ITB9KSxxcih0aGlzLHRoaXMuJGF0dHJzLmxpc3REYXRhKSxuLiR3YXRjaChyLGZ1bmN0aW9uKGUpe3FyKHQsZSl9KSksdGhpcy5fZXZlbnRzLl9hdHRhY2hfc2xvdD1mdW5jdGlvbihlKXtJdCh0LiRwYXJlbnR8fHQsZS5wb3NpdGlvbixlLnJlZnMpfSx0aGlzLl9ldmVudHMuX2RldGFjaF9zbG90PWZ1bmN0aW9uKGUpe0l0KHQuJHBhcmVudHx8dCxlLnBvc2l0aW9uLGUucmVmcywhMCl9LGUoIndlZXg6cmVjeWNsZS1saXN0Iix7b246dGhpcy5fZXZlbnRzfSx0aGlzLiRzbG90cy5kZWZhdWx0KX0scmVuZGVyRXJyb3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSgidGV4dCIse3N0eWxlOntmb250U2l6ZToiMzZweCIsY29sb3I6IiNGRjAwMDAifSx2YWx1ZTp0LnRvU3RyaW5nKCl9KX19LEhyPXtuYW1lOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixjc3M6Qm9vbGVhbixtb2RlOlN0cmluZyx0eXBlOlN0cmluZyxlbnRlckNsYXNzOlN0cmluZyxsZWF2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxkdXJhdGlvbjpbTnVtYmVyLFN0cmluZyxPYmplY3RdfTtmdW5jdGlvbiBHcihlKXt2YXIgdD1lJiZlLmNvbXBvbmVudE9wdGlvbnM7cmV0dXJuIHQmJnQuQ3Rvci5vcHRpb25zLmFic3RyYWN0P0dyKFh0KHQuY2hpbGRyZW4pKTplfWZ1bmN0aW9uIEpyKGUpe3ZhciB0PXt9LG49ZS4kb3B0aW9ucztmb3IodmFyIHIgaW4gbi5wcm9wc0RhdGEpdFtyXT1lW3JdO3ZhciBpPW4uX3BhcmVudExpc3RlbmVycztmb3IodmFyIG8gaW4gaSl0W2gobyldPWlbb107cmV0dXJuIHR9ZnVuY3Rpb24gWHIoZSx0KXtpZigvXGQta2VlcC1hbGl2ZSQvLnRlc3QodC50YWcpKXJldHVybiBlKCJrZWVwLWFsaXZlIix7cHJvcHM6dC5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YX0pfXZhciBZcj1mdW5jdGlvbihlKXtyZXR1cm4gZS50YWd8fEp0KGUpfSxLcj1mdW5jdGlvbihlKXtyZXR1cm4ic2hvdyI9PT1lLm5hbWV9LFpyPXtuYW1lOiJ0cmFuc2l0aW9uIixwcm9wczpIcixhYnN0cmFjdDohMCxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuJHNsb3RzLmRlZmF1bHQ7aWYobiYmKG49bi5maWx0ZXIoWXIpKS5sZW5ndGgpe3ZhciByPXRoaXMubW9kZSxpPW5bMF07aWYoZnVuY3Rpb24oZSl7Zm9yKDtlPWUucGFyZW50OylpZihlLmRhdGEudHJhbnNpdGlvbilyZXR1cm4hMH0odGhpcy4kdm5vZGUpKXJldHVybiBpO3ZhciBvPUdyKGkpO2lmKCFvKXJldHVybiBpO2lmKHRoaXMuX2xlYXZpbmcpcmV0dXJuIFhyKGUsaSk7dmFyIGE9Il9fdHJhbnNpdGlvbi0iK3RoaXMuX3VpZCsiLSI7by5rZXk9bnVsbD09by5rZXk/by5pc0NvbW1lbnQ/YSsiY29tbWVudCI6YStvLnRhZzokKG8ua2V5KT8wPT09U3RyaW5nKG8ua2V5KS5pbmRleE9mKGEpP28ua2V5OmErby5rZXk6by5rZXk7dmFyIHMsYyx1PShvLmRhdGF8fChvLmRhdGE9e30pKS50cmFuc2l0aW9uPUpyKHRoaXMpLGw9dGhpcy5fdm5vZGUsZD1HcihsKTtpZihvLmRhdGEuZGlyZWN0aXZlcyYmby5kYXRhLmRpcmVjdGl2ZXMuc29tZShLcikmJihvLmRhdGEuc2hvdz0hMCksZCYmZC5kYXRhJiYocz1vLChjPWQpLmtleSE9PXMua2V5fHxjLnRhZyE9PXMudGFnKSYmIUp0KGQpJiYoIWQuY29tcG9uZW50SW5zdGFuY2V8fCFkLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpKXt2YXIgZj1kLmRhdGEudHJhbnNpdGlvbj1CKHt9LHUpO2lmKCJvdXQtaW4iPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCxZZShmLCJhZnRlckxlYXZlIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLFhyKGUsaSk7aWYoImluLW91dCI9PT1yKXtpZihKdChvKSlyZXR1cm4gbDt2YXIgcCxoPWZ1bmN0aW9uKCl7cCgpfTtZZSh1LCJhZnRlckVudGVyIixoKSxZZSh1LCJlbnRlckNhbmNlbGxlZCIsaCksWWUoZiwiZGVsYXlMZWF2ZSIsZnVuY3Rpb24oZSl7cD1lfSl9fXJldHVybiBpfX19LFFyPUIoe3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30sSHIpO2RlbGV0ZSBRci5tb2RlO3ZhciBlaT17UmVjeWNsZUxpc3Q6V3IsVHJhbnNpdGlvbjpacixUcmFuc2l0aW9uR3JvdXA6e3Byb3BzOlFyLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgiZG9tIik7dGhpcy5nZXRQb3NpdGlvbj1mdW5jdGlvbihyKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlLmdldENvbXBvbmVudFJlY3Qoci5yZWYsZnVuY3Rpb24oZSl7ZS5yZXN1bHQ/dChlLnNpemUpOm4obmV3IEVycm9yKCJmYWlsZWQgdG8gZ2V0IHJlY3QgZm9yIGVsZW1lbnQ6ICIrci50YWcpKX0pfSl9O3ZhciByPXRoaXMuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKTt0aGlzLmFuaW1hdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7ci50cmFuc2l0aW9uKHQucmVmLG4sZSl9KX19LHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHwic3BhbiIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixpPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLG89dGhpcy5jaGlsZHJlbj1bXSxhPUpyKHRoaXMpLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGM9aVtzXTtjLnRhZyYmbnVsbCE9Yy5rZXkmJjAhPT1TdHJpbmcoYy5rZXkpLmluZGV4T2YoIl9fdmxpc3QiKSYmKG8ucHVzaChjKSwoKG5bYy5rZXldPWMpLmRhdGF8fChjLmRhdGE9e30pKS50cmFuc2l0aW9uPWEpfWlmKHIpe3ZhciB1PVtdLGw9W107ci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGF0YS50cmFuc2l0aW9uPWEsbltlLmtleV0/dS5wdXNoKGUpOmwucHVzaChlKX0pLHRoaXMua2VwdD1lKHQsbnVsbCx1KSx0aGlzLnJlbW92ZWQ9bH1yZXR1cm4gZSh0LG51bGwsbyl9LGJlZm9yZVVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX19wYXRjaF9fKHRoaXMuX3Zub2RlLHRoaXMua2VwdCwhMSwhMCksdGhpcy5fdm5vZGU9dGhpcy5rZXB0fSx1cGRhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcmV2Q2hpbGRyZW4sdD10aGlzLm1vdmVDbGFzc3x8KHRoaXMubmFtZXx8InYiKSsiLW1vdmUiO2UubGVuZ3RoJiZ0aGlzLmdldE1vdmVEYXRhKGVbMF0uY29udGV4dCx0KX0sbWV0aG9kczp7Z2V0TW92ZURhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zLnN0eWxlfHx7fTtyZXR1cm4gblsiQFRSQU5TSVRJT04iXSYmblsiQFRSQU5TSVRJT04iXVt0XX19fX0sdGk9cygidGVtcGxhdGUsc2NyaXB0LHN0eWxlLGVsZW1lbnQsY29udGVudCxzbG90LGxpbmssbWV0YSxzdmcsdmlldyxhLGRpdixpbWcsaW1hZ2UsdGV4dCx1LXRleHQsc3BhbixpbnB1dCx0ZXh0YXJlYSxzcGlubmVyLHNlbGVjdCxzbGlkZXIsc2xpZGVyLW5laWdoYm9yLGluZGljYXRvcixjYW52YXMsbGlzdCxjZWxsLGhlYWRlcixsb2FkaW5nLGxvYWRpbmctaW5kaWNhdG9yLHJlZnJlc2gsc2Nyb2xsYWJsZSxzY3JvbGxlcix2aWRlbyx3ZWIsZW1iZWQsdGFiYmFyLHRhYmhlYWRlcixkYXRlcGlja2VyLHRpbWVwaWNrZXIsbWFycXVlZSxjb3VudGRvd24iLCEwKSxuaT0ocygid2ViLHNwaW5uZXIsc3dpdGNoLHZpZGVvLHRleHRhcmVhLGNhbnZhcyxpbmRpY2F0b3IsbWFycXVlZSxjb3VudGRvd24iLCEwKSxzKCJyaWNodGV4dCx0cmFuc2l0aW9uLHRyYW5zaXRpb24tZ3JvdXAscmVjeWNsZS1saXN0IiwhMCkpO3MoImVtYmVkLGltZyxpbWFnZSxpbnB1dCxsaW5rLG1ldGEiLCEwKTtMbi5jb25maWcubXVzdFVzZVByb3A9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTG4uY29uZmlnLmlzUmVzZXJ2ZWRUYWc9dGksTG4uY29uZmlnLmlzUnVudGltZUNvbXBvbmVudD1uaSxMbi5jb25maWcuaXNVbmtub3duRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiExfSxMbi5vcHRpb25zLmRpcmVjdGl2ZXM9e30sTG4ub3B0aW9ucy5jb21wb25lbnRzPWVpLExuLnByb3RvdHlwZS5fX3BhdGNoX189VXIsTG4ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBuPXRoaXMscj1lJiYobz10aGlzLiRkb2N1bWVudCwoYT1vLmNyZWF0ZUNvbW1lbnQoInJvb3QiKSkuaGFzQXR0cmlidXRlPWEucmVtb3ZlQXR0cmlidXRlPUwsby5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYSksYSksaT10LG4uJGVsPXIsbi4kb3B0aW9ucy5yZW5kZXJ8fChuLiRvcHRpb25zLnJlbmRlcj1kZSksYW4obiwiYmVmb3JlTW91bnQiKSxuZXcgbW4obixmdW5jdGlvbigpe24uX3VwZGF0ZShuLl9yZW5kZXIoKSxpKX0sTCx7YmVmb3JlOmZ1bmN0aW9uKCl7bi5faXNNb3VudGVkJiYhbi5faXNEZXN0cm95ZWQmJmFuKG4sImJlZm9yZVVwZGF0ZSIpfX0sITApLGk9ITEsbnVsbD09bi4kdm5vZGUmJihuLl9pc01vdW50ZWQ9ITAsYW4obiwibW91bnRlZCIpKSxuO3ZhciBuLHIsaSxvLGF9LExuLnByb3RvdHlwZS5fX2NhbGxfaG9vaz1mdW5jdGlvbihlLHQpe3NlKCk7dmFyIG4scj10aGlzLiRvcHRpb25zW2VdLGk9ZSsiIGhvb2siO2lmKHIpZm9yKHZhciBvPTAsYT1yLmxlbmd0aDtvPGE7bysrKW49TGUocltvXSx0aGlzLHQ/W3RdOm51bGwsdGhpcyxpKTtyZXR1cm4gdGhpcy5faGFzSG9va0V2ZW50JiZ0aGlzLiRlbWl0KCJob29rOiIrZSx0KSxjZSgpLG59LGUuVnVlPUxufX0pO3Vud3JhcEV4cG9ydHMoZmFjdG9yeSk7dmFyIHdlZXhWdWVGcmFtZXdvcms9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGQ9e307dC5jcmVhdGVJbnN0YW5jZUNvbnRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcixpLG8sYSxzPXQud2VleCxjPShkW2VdPXtpbnN0YW5jZUlkOmUsY29uZmlnOnMuY29uZmlnLGRvY3VtZW50OnMuZG9jdW1lbnQsZGF0YTpufSkuVnVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtmYWN0b3J5KHIsdC5kb2N1bWVudCxuKTt2YXIgaT1yLlZ1ZSxvPWRbZV0sYT0vXndlZXg6L2kscz1pLmNvbmZpZy5pc1Jlc2VydmVkVGFnfHxmdW5jdGlvbigpe3JldHVybiExfSxjPWkuY29uZmlnLmlzUnVudGltZUNvbXBvbmVudHx8ZnVuY3Rpb24oKXtyZXR1cm4hMX07cmV0dXJuIGkuY29uZmlnLmlzUmVzZXJ2ZWRUYWc9ZnVuY3Rpb24oZSl7cmV0dXJuIWMoZSkmJnQuc3VwcG9ydHMoIkBjb21wb25lbnQvIitlKXx8cyhlKXx8YS50ZXN0KGUpfSxpLmNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGEsIiIpfSxpLnByb3RvdHlwZS4kaW5zdGFuY2VJZD1lLGkucHJvdG90eXBlLiRkb2N1bWVudD1vLmRvY3VtZW50LGkucHJvdG90eXBlLiRyZXF1aXJlV2VleE1vZHVsZT10LnJlcXVpcmVNb2R1bGUsaS5taXhpbih7YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kb3B0aW9ucztpZihlLmVsKXt2YXIgdD1lLmRhdGEsbj0oImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpfHx7fTtlLmRhdGE9T2JqZWN0LmFzc2lnbihuLG8uZGF0YSksby5hcHA9dGhpc319LG1vdW50ZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLiRvcHRpb25zLmVsJiZ0LmRvY3VtZW50JiZvLmFwcD09PXRoaXMpdHJ5e3QuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUZpbmlzaCJ9LFtdKX1jYXRjaChlKXt9fX0pLGkucHJvdG90eXBlLiRnZXRDb25maWc9ZnVuY3Rpb24oKXtpZihvLmFwcCBpbnN0YW5jZW9mIGkpcmV0dXJuIG8uY29uZmlnfSxpfShlLHMsdC5TaGFyZWRPYmplY3QpLHU9KHI9ZSxpPXMucmVxdWlyZU1vZHVsZSxvPWRbcl0sYT1pKCJ0aW1lciIpLHtzZXRUaW1lb3V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtpZihhLnNldFRpbWVvdXQpe3ZhciByPW8uZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQ7cmV0dXJuIGEuc2V0VGltZW91dChmdW5jdGlvbigpe3RbMF0uYXBwbHkodCx0LnNsaWNlKDIpKX0sdFsxXSksKHIrMSkudG9TdHJpbmcoKX19LHNldEludGVydmFsOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtpZihhLnNldEludGVydmFsKXt2YXIgcj1vLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkO3JldHVybiBhLnNldEludGVydmFsKGZ1bmN0aW9uKCl7dFswXS5hcHBseSh0LHQuc2xpY2UoMikpfSx0WzFdKSwocisxKS50b1N0cmluZygpfX0sY2xlYXJUaW1lb3V0OmZ1bmN0aW9uKGUpe2EuY2xlYXJUaW1lb3V0JiZhLmNsZWFyVGltZW91dChlKX0sY2xlYXJJbnRlcnZhbDpmdW5jdGlvbihlKXthLmNsZWFySW50ZXJ2YWwmJmEuY2xlYXJJbnRlcnZhbChlKX19KSxsPU9iamVjdC5hc3NpZ24oe1Z1ZTpjfSx1KTtyZXR1cm4gT2JqZWN0LmZyZWV6ZShsKSxsfSx0LmRlc3Ryb3lJbnN0YW5jZT1mdW5jdGlvbihlKXt2YXIgdD1kW2VdO2lmKHQmJnQuYXBwIGluc3RhbmNlb2YgdC5WdWUpe3RyeXt0LmFwcC4kZGVzdHJveSgpLHQuZG9jdW1lbnQuZGVzdHJveSgpfWNhdGNoKGUpe31kZWxldGUgdC5kb2N1bWVudCxkZWxldGUgdC5hcHB9ZGVsZXRlIGRbZV19LHQucmVmcmVzaEluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZFtlXTtpZighKG4mJm4uYXBwIGluc3RhbmNlb2Ygbi5WdWUpKXJldHVybiBuZXcgRXJyb3IoInJlZnJlc2hJbnN0YW5jZTogaW5zdGFuY2UgIitlKyIgbm90IGZvdW5kISIpO2lmKG4uVnVlJiZuLlZ1ZS5zZXQpZm9yKHZhciByIGluIHQpbi5WdWUuc2V0KG4uYXBwLHIsdFtyXSk7bi5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoicmVmcmVzaEZpbmlzaCJ9LFtdKX19KSxpbmRleD11bndyYXBFeHBvcnRzKHdlZXhWdWVGcmFtZXdvcmspLHdlZXhWdWVGcmFtZXdvcmtfMT13ZWV4VnVlRnJhbWV3b3JrLmNyZWF0ZUluc3RhbmNlQ29udGV4dCx3ZWV4VnVlRnJhbWV3b3JrXzI9d2VleFZ1ZUZyYW1ld29yay5kZXN0cm95SW5zdGFuY2Usd2VleFZ1ZUZyYW1ld29ya18zPXdlZXhWdWVGcmFtZXdvcmsucmVmcmVzaEluc3RhbmNlLFZ1ZT1PYmplY3QuZnJlZXplKHtkZWZhdWx0OmluZGV4LF9fbW9kdWxlRXhwb3J0czp3ZWV4VnVlRnJhbWV3b3JrLGNyZWF0ZUluc3RhbmNlQ29udGV4dDp3ZWV4VnVlRnJhbWV3b3JrXzEsZGVzdHJveUluc3RhbmNlOndlZXhWdWVGcmFtZXdvcmtfMixyZWZyZXNoSW5zdGFuY2U6d2VleFZ1ZUZyYW1ld29ya18zfSk7c2V0TmF0aXZlQ29uc29sZSgpLHNldHVwKHtWdWU6VnVlfSl9KTsK \ No newline at end of file +//{"version":"4.08","encode":"base64"} +dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fPURhdGUubm93KCksZ2xvYmFsPXRoaXMscHJvY2Vzcz17ZW52Ont9fSxzZXRUaW1lb3V0PWdsb2JhbC5zZXRUaW1lb3V0OyFmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/dCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOnQoKX0oMCxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgc3VidmVyc2lvbj17ZnJhbWV3b3JrOiIwLjI5LjYiLHRyYW5zZm9ybWVyOiI+PTAuMS41IDwwLjUifTtmdW5jdGlvbiBnZXRIb29rS2V5KGUsdCxuKXtyZXR1cm4gdCsiQCIrbisiIyIrZX12YXIgQ2FsbGJhY2tNYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuaW5zdGFuY2VJZD1TdHJpbmcoZSksdGhpcy5sYXN0Q2FsbGJhY2tJZD0wLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319O0NhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkKyssdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF09ZSx0aGlzLmxhc3RDYWxsYmFja0lkfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNhbGxiYWNrc1tlXTtyZXR1cm4gZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2VdLHR9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWdldEhvb2tLZXkoZSx0LG4pO3RoaXMuaG9va3NbaV0mJmNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gT3ZlcnJpZGUgYW4gZXhpc3RpbmcgY29tcG9uZW50IGhvb2sgIicraSsnIi4nKSx0aGlzLmhvb2tzW2ldPXJ9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUudHJpZ2dlckhvb2s9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9Z2V0SG9va0tleShlLHQsbiksbz10aGlzLmhvb2tzW2ldO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXJldHVybiBjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGhvb2sgZnVuY3Rpb24gdHlwZSAoIit0eXBlb2YgbysnKSBvbiAiJytpKyciLicpLG51bGw7dmFyIGE9bnVsbDt0cnl7YT1vLmFwcGx5KG51bGwscnx8W10pfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBob29rIGZ1bmN0aW9uIG9uICInK2krJyIuJyksZX1yZXR1cm4gYX0sQ2FsbGJhY2tNYW5hZ2VyLnByb3RvdHlwZS5jb25zdW1lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmNhbGxiYWNrc1tlXTtpZih2b2lkIDAhPT1uJiYhMSE9PW58fGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tlXSwiZnVuY3Rpb24iPT10eXBlb2Ygcil0cnl7cmV0dXJuIHIuY2FsbChudWxsLHQsbil9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOlxuICIrZS50b1N0cmluZygpKSxlfXJldHVybiBuZXcgRXJyb3IoJ2ludmFsaWQgY2FsbGJhY2sgaWQgIicrZSsnIicpfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX07dmFyIG5leHROb2RlUmVmPTE7ZnVuY3Rpb24gdW5pcXVlSWQoKXtyZXR1cm4obmV4dE5vZGVSZWYrKykudG9TdHJpbmcoKX1mdW5jdGlvbiB0eXBvZihlKXt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc3Vic3RyaW5nKDgsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBoYXNPd24oZSx0KXtyZXR1cm4gaXNQbGFpbk9iamVjdChlKSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ZnVuY3Rpb24gYnVmZmVyVG9CYXNlNjQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGJ0b2EpcmV0dXJuIiI7dmFyIHQ9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGUpLGZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSkuam9pbigiIik7cmV0dXJuIGJ0b2EodCl9ZnVuY3Rpb24gaXNFbXB0eShlKXtpZighZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiEwO2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfXZhciBMRVZFTFM9WyJvZmYiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwibG9nIiwiZGVidWciXSxsZXZlbE1hcD17fTtmdW5jdGlvbiBnZW5lcmF0ZUxldmVsTWFwKCl7TEVWRUxTLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49TEVWRUxTLmluZGV4T2YodCk7bGV2ZWxNYXBbdF09e30sTEVWRUxTLmZvckVhY2goZnVuY3Rpb24oZSl7TEVWRUxTLmluZGV4T2YoZSk8PW4mJihsZXZlbE1hcFt0XVtlXT0hMCl9KX0pfWZ1bmN0aW9uIGNoZWNrTGV2ZWwoZSl7dmFyIHQ9Z2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsfHwibG9nIjtyZXR1cm4gbGV2ZWxNYXBbdF0mJmxldmVsTWFwW3RdW2VdfWZ1bmN0aW9uIGRlYnVnTG9nKGUpe2dsb2JhbC5uYXRpdmVMb2coInd4SW50ZXJhY3Rpb25BbmFseXplcjogW2pzZm1dIitlLCJfX0RFQlVHIil9dmFyIGRvY01hcD17fTtmdW5jdGlvbiBhZGREb2MoZSx0KXtlJiYoZG9jTWFwW2VdPXQpfWZ1bmN0aW9uIGdldERvYyhlKXtyZXR1cm4gZG9jTWFwW2VdfWZ1bmN0aW9uIHJlbW92ZURvYyhlKXtkZWxldGUgZG9jTWFwW2VdfWZ1bmN0aW9uIGdldFRhc2tDZW50ZXIoZSl7dmFyIHQ9ZG9jTWFwW2VdO3JldHVybiB0JiZ0LnRhc2tDZW50ZXI/dC50YXNrQ2VudGVyOm51bGx9ZnVuY3Rpb24gYXBwZW5kQm9keShlLHQsbil7dmFyIHI9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoISgwPHIucHVyZUNoaWxkcmVuLmxlbmd0aHx8dC5wYXJlbnROb2RlKSl7dmFyIGk9ci5jaGlsZHJlbixvPWkuaW5kZXhPZihuKTtvPDA/aS5wdXNoKHQpOmkuc3BsaWNlKG8sMCx0KSwxPT09dC5ub2RlVHlwZT8oImJvZHkiPT09dC5yb2xlPyh0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUsdC5wYXJlbnROb2RlPXIsbGlua1BhcmVudCh0LHIpKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksc2V0Qm9keShlLHQpLHQuZG9jSWQ9ZS5pZCx0Lm93bmVyRG9jdW1lbnQ9ZSxsaW5rUGFyZW50KHQsciksZGVsZXRlIGUubm9kZU1hcFt0Lm5vZGVJZF0pLHIucHVyZUNoaWxkcmVuLnB1c2godCksc2VuZEJvZHkoZSx0KSk6KHQucGFyZW50Tm9kZT1yLGUubm9kZU1hcFt0LnJlZl09dCksdC5yZWFkeT0hMCx0LmNvbXB1dGVDbGFzc0xpc3QmJnQuY29tcHV0ZUNsYXNzTGlzdCgpfX1mdW5jdGlvbiBzZW5kQm9keShlLHQpe3ZhciBuPXQudG9KU09OKCk7ZSYmZS50YXNrQ2VudGVyJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50YXNrQ2VudGVyLnNlbmQmJmUudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUJvZHkifSxbbl0pfWZ1bmN0aW9uIHNldEJvZHkoZSx0KXt0LnJvbGU9ImJvZHkiLHQuZGVwdGg9MSxkZWxldGUgZS5ub2RlTWFwW3Qubm9kZUlkXSx0LnJlZj0iX3Jvb3QiLGUubm9kZU1hcC5fcm9vdD10LGUuYm9keT10fWZ1bmN0aW9uIGxpbmtQYXJlbnQodCxlKXsodC5wYXJlbnROb2RlPWUpLmRvY0lkJiYodC5kb2NJZD1lLmRvY0lkLHQub3duZXJEb2N1bWVudD1lLm93bmVyRG9jdW1lbnQsKHQub3duZXJEb2N1bWVudC5ub2RlTWFwW3Qubm9kZUlkXT10KS5kZXB0aD1lLmRlcHRoKzEpLHQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtsaW5rUGFyZW50KGUsdCl9KX1mdW5jdGlvbiBuZXh0RWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIHByZXZpb3VzRWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUucHJldmlvdXNTaWJsaW5nfX1mdW5jdGlvbiBpbnNlcnRJbmRleChlLHQsbixyKXtuPDAmJihuPTApO3ZhciBpPXRbbi0xXSxvPXRbbl07cmV0dXJuIHQuc3BsaWNlKG4sMCxlKSxyJiYoaSYmKGkubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9aSwoZS5uZXh0U2libGluZz1vKSYmKG8ucHJldmlvdXNTaWJsaW5nPWUpKSxufWZ1bmN0aW9uIG1vdmVJbmRleChlLHQsbixyKXt2YXIgaT10LmluZGV4T2YoZSk7aWYoaTwwKXJldHVybi0xO2lmKHIpe3ZhciBvPXRbaS0xXSxhPXRbaSsxXTtvJiYoby5uZXh0U2libGluZz1hKSxhJiYoYS5wcmV2aW91c1NpYmxpbmc9byl9dC5zcGxpY2UoaSwxKTt2YXIgcz1uO2k8PW4mJihzPW4tMSk7dmFyIGM9dFtzLTFdLHU9dFtzXTtyZXR1cm4gdC5zcGxpY2UocywwLGUpLHImJihjJiYoYy5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1jLChlLm5leHRTaWJsaW5nPXUpJiYodS5wcmV2aW91c1NpYmxpbmc9ZSkpLGk9PT1zPy0xOm59ZnVuY3Rpb24gcmVtb3ZlSW5kZXgoZSx0LG4pe3ZhciByPXQuaW5kZXhPZihlKTtpZighKHI8MCkpe2lmKG4pe3ZhciBpPXRbci0xXSxvPXRbcisxXTtpJiYoaS5uZXh0U2libGluZz1vKSxvJiYoby5wcmV2aW91c1NpYmxpbmc9aSl9dC5zcGxpY2UociwxKX19dmFyIE5vZGU9ZnVuY3Rpb24oKXt0aGlzLm5vZGVJZD11bmlxdWVJZCgpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGx9LEVsZW1lbnQkMjtmdW5jdGlvbiBzZXRFbGVtZW50KGUpe0VsZW1lbnQkMj1lfU5vZGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT1nZXREb2ModGhpcy5kb2NJZCk7ZSYmKGRlbGV0ZSB0aGlzLmRvY0lkLGRlbGV0ZSBlLm5vZGVNYXBbdGhpcy5ub2RlSWRdKSx0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kZXN0cm95KCl9KX07dmFyIHJlZ2lzdGVyZWRFbGVtZW50cz17fTtmdW5jdGlvbiByZWdpc3RlckVsZW1lbnQoaSxlKXtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCl7dmFyIHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj10fShFbGVtZW50JDIpO2UuZm9yRWFjaChmdW5jdGlvbihyKXt0LnByb3RvdHlwZVtyXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2lmKG4pcmV0dXJuIG4uc2VuZCgiY29tcG9uZW50Iix7cmVmOnRoaXMucmVmLGNvbXBvbmVudDppLG1ldGhvZDpyfSxlKX19KSxyZWdpc3RlcmVkRWxlbWVudHNbaV09dH19ZnVuY3Rpb24gZ2V0V2VleEVsZW1lbnQoZSl7cmV0dXJuIHJlZ2lzdGVyZWRFbGVtZW50c1tlXX1mdW5jdGlvbiBjYWNoZWQodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgcGFyc2VTdHlsZVRleHQ9Y2FjaGVkKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KSxmaXJzdExldHRlclRvTG93ZXJDYXNlPWNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKStlLnNsaWNlKDEpfSk7ZnVuY3Rpb24gaXNEZWYoZSl7cmV0dXJuIHZvaWQgMCE9PWV9ZnVuY3Rpb24gaXNGbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX12YXIgX3RvU3RyaW5nPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gdG9SYXdUeXBlKGUpe3JldHVybiBfdG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKX1mdW5jdGlvbiBoYXNMaWZlY3ljbGVIb29rKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmxlbmd0aH12YXIgcHJvY2Vzc29ycz17c2xpZGVyOntjaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJue2luZGV4OmUuaW5kZXgsc291cmNlOmUuc291cmNlfX0sc2Nyb2xsOmZ1bmN0aW9uKGUpe3JldHVybntvZmZzZXRYUmF0aW86ZS5vZmZzZXRYUmF0aW8sb2Zmc2V0WVJhdGlvOmUub2Zmc2V0WVJhdGlvLGRyYWc6ZS5kcmFnfX19LCJzY3JvbGwtdmlldyI6e3Njcm9sbGVuZDpmdW5jdGlvbihlKXtyZXR1cm57Y29udGVudE9mZnNldDplLmNvbnRlbnRPZmZzZXR9fX19O2Z1bmN0aW9uIHByb2Nlc3NUYXJnZXQoZSl7dmFyIHQ9ZS5hdHRyLG49ZS5vZmZzZXRMZWZ0LHI9ZS5vZmZzZXRUb3AsaT17fTtyZXR1cm4gT2JqZWN0LmtleXModHx8e30pLmZvckVhY2goZnVuY3Rpb24oZSl7MD09PWUuaW5kZXhPZigiZGF0YSIpJiYoaVtmaXJzdExldHRlclRvTG93ZXJDYXNlKGUucmVwbGFjZSgiZGF0YSIsIiIpKV09dFtlXSl9KSx7aWQ6dCYmdC5pZHx8IiIsZGF0YXNldDppLG9mZnNldExlZnQ6bnx8MCxvZmZzZXRUb3A6cnx8MH19ZnVuY3Rpb24gcHJvY2Vzc0N1c3RvbUV2ZW50KGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KSxuPXByb2Nlc3NUYXJnZXQobikse3R5cGU6ZSx0aW1lU3RhbXA6RGF0ZS5ub3coKSx0YXJnZXQ6bixjdXJyZW50VGFyZ2V0Om4sZGV0YWlsOnR9fXZhciBXRUVYX1RBR1M9WyJhIiwiZGl2IiwibGlzdCIsImNlbGwiLCJsb2FkaW5nIiwicmVmcmVzaCIsInJlY3ljbGUtbGlzdCIsInNjcm9sbGVyIiwiaW5kaWNhdG9yIiwid2F0ZXJmYWxsIiwid2ViIiwicmljaHRleHQiXSxJR05PUkVfRVZFTlRTPVsidmlld2FwcGVhciIsInZpZXdkaXNhcHBlYXIiLCJpdGVtY2xpY2siXSxFVkVOVF9FWFRSQVM9e21hcmtlcnRhcDpbIm1hcmtlcklkIl0sY29udHJvbHRhcDpbImNvbnRyb2xJZCJdLHJlZ2lvbmNoYW5nZTpbImNhdXNlZEJ5Il0sZW5kOlsiY2F1c2VkQnkiXSxhcHBlYXI6WyJkaXJlY3Rpb24iXSxkaXNhcHBlYXI6WyJkaXJlY3Rpb24iXX07ZnVuY3Rpb24gcHJvY2Vzc0V2ZW50KHQsZSl7dmFyIG49dC50eXBlO2lmKC0xIT09SUdOT1JFX0VWRU5UUy5pbmRleE9mKG4pKXJldHVybiB0O3ZhciByPXQuY3VycmVudFRhcmdldCxpPXIudHlwZS5yZXBsYWNlKCJ1LSIsIiIpO2lmKC0xIT09V0VFWF9UQUdTLmluZGV4T2YoaSkpcmV0dXJuIHQ7dmFyIG89dC50aW1lc3RhbXAsYT10LnRhcmdldDtpZighaXNEZWYoZSkpe3ZhciBzPXByb2Nlc3NvcnNbaV07ZT1zJiZpc0ZuKHNbbl0pP3Nbbl0odCk6dC5kZXRhaWx8fHt9fXZhciBjPXt0eXBlOm4sdGltZVN0YW1wOm8sdGFyZ2V0OnByb2Nlc3NUYXJnZXQoYSksY3VycmVudFRhcmdldDpwcm9jZXNzVGFyZ2V0KHIpLGRldGFpbDplLHRvdWNoZXM6InRvdWNoZW5kIj09PW58fCJwYW5lbmQiPT09bj9bXTp0LmNoYW5nZWRUb3VjaGVzLGNoYW5nZWRUb3VjaGVzOnQuY2hhbmdlZFRvdWNoZXN9O3QuY29tcG9uZW50SWQmJihjLmNvbXBvbmVudElkPXQuY29tcG9uZW50SWQpO3ZhciB1PUVWRU5UX0VYVFJBU1tuXTtyZXR1cm4gdSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuaGFzT3duUHJvcGVydHkoZSkmJihjW2VdPXRbZV0pfSksY312YXIgQkFTRV9ERVZJQ0VfV0lEVEg9NzUwLGRldmljZURQUj0xLGRldmljZVdpZHRoPTA7ZnVuY3Rpb24gdXB4MnB4KGUsdCl7aWYoMD09PWRldmljZVdpZHRoJiYoZGV2aWNlRFBSPWdsb2JhbC5XWEVudmlyb25tZW50LnNjYWxlLGRldmljZVdpZHRoPU1hdGguY2VpbChnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aC9kZXZpY2VEUFIpKSwwPT09KGU9TnVtYmVyKGUpKSlyZXR1cm4gMDt2YXIgbj1lL0JBU0VfREVWSUNFX1dJRFRIKih0fHxkZXZpY2VXaWR0aCkscj1uLnRvU3RyaW5nKCkuc3BsaXQoIi4iKTtyZXR1cm4gMj09PXIubGVuZ3RoPyhyWzFdPXJbMV0uc3Vic3RyaW5nKDAsMiksTnVtYmVyKHIuam9pbigiLiIpKSk6bn12YXIgVU5JVF9SRT0vKFsrLV0/XGQrKFwuXGQrKT8pW3J8dV1weC9nO2Z1bmN0aW9uIG5vcm1hbGl6ZVVuaXQobil7cmV0dXJuIGdsb2JhbC5XWEVudmlyb25tZW50LmR5bmFtaWNScHh8fCJPYmplY3QiIT09dHlwb2Yobil8fE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTsic3RyaW5nIj09dHlwZW9mIHQmJihuW2VdPXQucmVwbGFjZShVTklUX1JFLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVweDJweCh0KX0pKX0pLG59ZnVuY3Rpb24gZGVlcENsb25lKGUsaSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uIGUodCl7dmFyIG49dC5jaGlsZHJlbiYmdC5jaGlsZHJlbi5tYXAoZSkscj1pKHQudGFnLHQuZGF0YSxuKTtyZXR1cm4gci50ZXh0PXQudGV4dCxyLmlzQ29tbWVudD10LmlzQ29tbWVudCxyLmNvbXBvbmVudE9wdGlvbnM9dC5jb21wb25lbnRPcHRpb25zLHIuZWxtPXQuZWxtLHIuY29udGV4dD10LmNvbnRleHQsci5ucz10Lm5zLHIuaXNTdGF0aWM9dC5pc1N0YXRpYyxyLmtleT10LmtleSxyfSl9ZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbihlLHQsbil7cmV0dXJue3R5cGU6ImRlY2xhcmF0aW9uIixwcm9wZXJ0eTplLHZhbHVlOnR9fWZ1bmN0aW9uIGNsZWFySW1wb3J0YW50KGUpe3ZhciB0PVN0cmluZyhlKS5yZXBsYWNlKC9ccyohaW1wb3J0YW50L2csIiIpO3JldHVybnt2YWx1ZTp0LGltcG9ydGFudDplIT09dH19ZnVuY3Rpb24gY3JlYXRlUGFyc2VyKHMpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPWUucG9zaXRpb24sbz1uLnNwbGl0KC9ccysvKSxhPVtdO3N3aXRjaChvLmxlbmd0aCl7Y2FzZSAxOm8ucHVzaChvWzBdLG9bMF0sb1swXSk7YnJlYWs7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIlRvcCIsb1swXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiUmlnaHQiLG9bMV0scixpKSxnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIkJvdHRvbSIsb1syXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiTGVmdCIsb1szXSxyLGkpKSxhfX12YXIgbWFyZ2luPWNyZWF0ZVBhcnNlcigibWFyZ2luIikscGFkZGluZz1jcmVhdGVQYXJzZXIoInBhZGRpbmciKTtmdW5jdGlvbiBib3JkZXIoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LG89bi5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyksYT1bL15bXGQuXStcUyokLywvXihzb2xpZHxkYXNoZWR8ZG90dGVkKSQvLC9cUysvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9by5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDpvLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIG8ubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oaSsiV2lkdGgiLChhWzBdfHwiMCIpLnRyaW0oKSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKGkrIlN0eWxlIiwoYVsxXXx8InNvbGlkIikudHJpbSgpLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oaSsiQ29sb3IiLChhWzJdfHwiIzAwMDAwMCIpLnRyaW0oKSxyKV19ZnVuY3Rpb24gYm9yZGVyUHJvcGVydHkoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LnN1YnN0cmluZyg2KSxvPW4ucmVwbGFjZSgvXHMqLFxzKi9nLCIsIikuc3BsaXQoL1xzKy8pLGE9W107c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGU7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJUb3AiK2ksb1swXSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJSaWdodCIraSxvWzFdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckJvdHRvbSIraSxvWzJdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckxlZnQiK2ksb1szXSxyKSksYX1mdW5jdGlvbiBib3JkZXJSYWRpdXMoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1uLnNwbGl0KC9ccysvKSxvPVtdO2lmKG4uaW5jbHVkZXMoIi8iKSlyZXR1cm4gZTtzd2l0Y2goaS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6aS5wdXNoKGlbMF0saVsxXSk7YnJlYWs7Y2FzZSAzOmkucHVzaChpWzFdKX1yZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlclRvcExlZnRSYWRpdXMiLGlbMF0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyVG9wUmlnaHRSYWRpdXMiLGlbMV0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLGlbMl0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyIsaVszXSxyKSksb31mdW5jdGlvbiBmbGV4RmxvdyhlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4uc3BsaXQoL1xzKy8pLG89Wy9eKGNvbHVtbnxjb2x1bW4tcmV2ZXJzZXxyb3d8cm93LXJldmVyc2UpJC8sL14obm93cmFwfHdyYXB8d3JhcC1yZXZlcnNlKSQvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9aS5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDppLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIGkubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhEaXJlY3Rpb24iLG9bMF18fCJjb2x1bW4iLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhXcmFwIixvWzFdfHwibm93cmFwIixyKV19ZnVuY3Rpb24gZm9udChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4ucmVwbGFjZSgvLFxzKi9nLCIsIikucmVwbGFjZSgvXHMqXC9ccyovLCIvIikucmVwbGFjZSgvWyciXS4rP1snIl0vZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9ccysvZywiIyIpfSkuc3BsaXQoL1xzKy8pLG89W10sYT1bIm5vcm1hbCIsIml0YWxpYyIsIm9ibGlxdWUiXTtvLnB1c2goZ2VuZXJhdGVEZWNsYXJhdGlvbigiZm9udFN0eWxlIixhW01hdGgubWF4KDAsYS5pbmRleE9mKGlbMF0pKV0scikpO3ZhciBzPWkuc2xpY2UoMCwtMikuZmluZChmdW5jdGlvbihlKXtyZXR1cm4vbm9ybWFsfGJvbGR8bGlnaHRlcnxib2xkZXJ8XGQrLy50ZXN0KGUpfSk7aWYocyYmby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRXZWlnaHQiLHMscikpLGk9aS5zbGljZSgtMiksL1tcZC5dK1xTKihcL1tcZC5dK1xTKik/Ly50ZXN0KGlbMF0pKXt2YXIgYz1pWzBdLnNwbGl0KCIvIiksdT1jWzBdLGw9Y1sxXTtyZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRTaXplIix1LHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImxpbmVIZWlnaHQiLGx8fCJub3JtYWwiLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRGYW1pbHkiLGlbMV0ucmVwbGFjZSgvIy9nLCIgIikscikpLG99cmV0dXJuW119ZnVuY3Rpb24gYmFja2dyb3VuZChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudDtyZXR1cm4vXiM/XFMrJC8udGVzdChuKXx8L15yZ2JhPyguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRDb2xvciIsbixyKTovXmxpbmVhci1ncmFkaWVudCguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRJbWFnZSIsbixyKTplfXZhciBwYXJzZXJDb2xsZWN0aW9uPXttYXJnaW46bWFyZ2luLHBhZGRpbmc6cGFkZGluZyxib3JkZXI6Ym9yZGVyLGJvcmRlclRvcDpib3JkZXIsYm9yZGVyUmlnaHQ6Ym9yZGVyLGJvcmRlckJvdHRvbTpib3JkZXIsYm9yZGVyTGVmdDpib3JkZXIsYm9yZGVyU3R5bGU6Ym9yZGVyUHJvcGVydHksYm9yZGVyV2lkdGg6Ym9yZGVyUHJvcGVydHksYm9yZGVyQ29sb3I6Ym9yZGVyUHJvcGVydHksYm9yZGVyUmFkaXVzOmJvcmRlclJhZGl1cyxmbGV4RmxvdzpmbGV4Rmxvdyxmb250OmZvbnQsYmFja2dyb3VuZDpiYWNrZ3JvdW5kfTtmdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRQcm9wZXJ0eShlKXt2YXIgdD1wYXJzZXJDb2xsZWN0aW9uW2UucHJvcGVydHldO3JldHVybiB0JiYoZT10KGUpKSxbXS5jb25jYXQoZSl9dmFyIERFRkFVTFRfVEFHX05BTUU9ImRpdiIsQlVCQkxFX0VWRU5UUz1bImNsaWNrIiwibG9uZ3ByZXNzIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIiwiaG9yaXpvbnRhbHBhbiIsInZlcnRpY2FscGFuIiwic3dpcGUiXTtmdW5jdGlvbiByZWdpc3Rlck5vZGUoZSx0KXtnZXREb2MoZSkubm9kZU1hcFt0Lm5vZGVJZF09dH12YXIgRWxlbWVudD1mdW5jdGlvbihpKXtmdW5jdGlvbiBlKGUsdCxuKXt2b2lkIDA9PT1lJiYoZT1ERUZBVUxUX1RBR19OQU1FKSxpLmNhbGwodGhpcyk7dmFyIHI9Z2V0V2VleEVsZW1lbnQoZSk7aWYociYmIW4pcmV0dXJuIG5ldyByKGUsdCwhMCk7dD10fHx7fSx0aGlzLm5vZGVUeXBlPTEsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ZSx0aGlzLmF0dHI9dC5hdHRyfHx7fSx0aGlzLnN0eWxlPXQuc3R5bGV8fHt9LHRoaXMuY2xhc3NTdHlsZT10LmNsYXNzU3R5bGV8fHt9LHRoaXMuZXZlbnQ9e30sdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLmNsYXNzTGlzdD10LmNsYXNzTGlzdHx8W10sdGhpcy5zdHlsZXNoZWV0PXQuc3R5bGVzaGVldHx8W10sdGhpcy5yZWFkeT0hMX1yZXR1cm4gaSYmKGUuX19wcm90b19fPWkpLCgoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShpJiZpLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihlKXtpZighZS5wYXJlbnROb2RlfHxlLnBhcmVudE5vZGU9PT10aGlzKWlmKGUucGFyZW50Tm9kZSl7aWYoY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthcHBlbmRDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIE1vdmUgPCIrZS50eXBlKyI+IHRvICIrdGhpcy5jaGlsZHJlbi5sZW5ndGgrIiBvZiA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksMT09PWUubm9kZVR5cGUpe3ZhciB0PW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO24mJjA8PXQmJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxuLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbZS5yZWYsdGhpcy5yZWYsdF0pKX19ZWxzZSBpZihjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2FwcGVuZENoaWxkXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgQXBwZW5kIDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe2luc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKTt2YXIgcj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO3ImJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxyLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixlLnRvSlNPTigpLC0xXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUubmV4dFNpYmxpbmcmJmUubmV4dFNpYmxpbmc9PT10KSlpZihlLnBhcmVudE5vZGUpe2lmKG1vdmVJbmRleChlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIG49bmV4dEVsZW1lbnQodCkscj1tb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixuP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7aSYmMDw9ciYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLGkuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixyXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QmVmb3JlXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgSW5zZXJ0IDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIiksIGJlZm9yZSAoIit0LnJlZisiKS4iKSxsaW5rUGFyZW50KGUsdGhpcyksaW5zZXJ0SW5kZXgoZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBvPW5leHRFbGVtZW50KHQpLGE9aW5zZXJ0SW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixvP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobyk6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxzPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7cyYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHMuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGUudG9KU09OKCksYV0pKSxlLnJlYWR5PSEwfX0sZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUucHJldmlvdXNTaWJsaW5nJiZlLnByZXZpb3VzU2libGluZz09PXQpKWlmKGUucGFyZW50Tm9kZSl7aWYobW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksMT09PWUubm9kZVR5cGUpe3ZhciBuPW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHJldmlvdXNFbGVtZW50KHQpKSsxKSxyPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmMDw9biYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHIuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixuXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QWZ0ZXJdKCIrdGhpcy5kb2NJZCsiLCIrZS50eXBlKyIsIitlLnJlZisiKSBJbnNlcnQgPCIrZS50eXBlKyI+IHRvIDwiK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKSwgYWZ0ZXIgKCIrdC5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBpPWluc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihwcmV2aW91c0VsZW1lbnQodCkpKzEpLG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtvJiYodGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSksby5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYsZS50b0pTT04oKSxpXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihlLHQpe2lmKGUucGFyZW50Tm9kZSl7aWYocmVtb3ZlSW5kZXgoZSx0aGlzLmNoaWxkcmVuLCEwKSwxPT09ZS5ub2RlVHlwZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltyZW1vdmVDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIFJlbW92ZSA8IitlLnR5cGUrIj4gZnJvbSA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIikscmVtb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbik7dmFyIG49Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtuJiZuLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRWxlbWVudCJ9LFtlLnJlZl0pLGUucmVhZHk9ITF9dGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSxlLm5leHRTaWJsaW5nfHx7fSl9dHx8ZS5kZXN0cm95KCl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0aGlzLnB1cmVDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QmJnQuc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFbGVtZW50In0sW2UucmVmXSksZS5yZWFkeT0hMX0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnNldEF0dHI9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuYXR0cltlXSE9PXR8fCExPT09bil7dGhpcy5hdHRyW2VdPXQ7dmFyIHI9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtpZighbiYmcil7dmFyIGk9e307aVtlXT10LHIuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixpXSl9fX0sZS5wcm90b3R5cGUuc2V0QXR0cnM9ZnVuY3Rpb24oZSx0KXtpZighaXNFbXB0eShlKSl7dmFyIG49e307Zm9yKHZhciByIGluIGUpdGhpcy5hdHRyW3JdIT09ZVtyXSYmKHRoaXMuYXR0cltyXT1lW3JdLG5bcl09ZVtyXSk7aWYoIWlzRW1wdHkobikpe3ZhciBpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7IXQmJmkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixuXSl9fX0sZS5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG8pe3ZhciBhPXRoaXM7ZXhwYW5kU2hvcnRoYW5kUHJvcGVydHkoe3Byb3BlcnR5OmUsdmFsdWU6dH0pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcm9wZXJ0eSxuPWUudmFsdWU7aWYoYS5zdHlsZVt0XSE9PW58fCExPT09byl7YS5zdHlsZVt0XT1uO3ZhciByPWdldFRhc2tDZW50ZXIoYS5kb2NJZCk7aWYoIW8mJnIpe3ZhciBpPXt9O2lbdF09IiI9PT1uJiZ0IGluIGEuY2xhc3NTdHlsZT9hLmNsYXNzU3R5bGVbdF06bixyLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbYS5yZWYsaV0pfX19KX0sZS5wcm90b3R5cGUuc2V0U3R5bGVzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztpZighaXNFbXB0eShlKSl7dmFyIGk9e307Zm9yKHZhciBuIGluIGUpe2V4cGFuZFNob3J0aGFuZFByb3BlcnR5KHtwcm9wZXJ0eTpuLHZhbHVlOmVbbl19KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucHJvcGVydHksbj1lLnZhbHVlO3Iuc3R5bGVbdF0hPT1uJiYoci5zdHlsZVt0XT1uLGlbdF09IiI9PT1uJiZ0IGluIHIuY2xhc3NTdHlsZT9yLmNsYXNzU3R5bGVbdF06bil9KX1pZighaXNFbXB0eShpKSl7dmFyIG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTshdCYmbyYmby5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLGldKX19fSxlLnByb3RvdHlwZS5zZXRDbGFzc1N0eWxlPWZ1bmN0aW9uKGUpe3ZhciB0PSExO2Zvcih2YXIgbiBpbiB0aGlzLmNsYXNzU3R5bGUpbiBpbiBlfHwodD0hMCx0aGlzLmNsYXNzU3R5bGVbbl09IiIpO2Zvcih2YXIgciBpbiBlKWVbcl0hPT10aGlzLmNsYXNzU3R5bGVbcl0mJih0PSEwLHRoaXMuY2xhc3NTdHlsZVtyXT1lW3JdKTtpZih0KXt2YXIgaT1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2kmJnRoaXMucmVhZHkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZix0aGlzLnRvU3R5bGUoKV0pfX0sZS5wcm90b3R5cGUuYWRkRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZXZlbnR8fCh0aGlzLmV2ZW50PXt9KSwhdGhpcy5ldmVudFtlXSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthZGRFdmVudF0oIit0aGlzLmRvY0lkKyIsIit0aGlzLnR5cGUrIiwiK3RoaXMucmVmKycpIEFkZCAiJytlKyciIGV2ZW50IG9uIDwnK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKS4iKSx0aGlzLmV2ZW50W2VdPXtoYW5kbGVyOnQscGFyYW1zOm59O3ZhciByPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmci5zZW5kKCJkb20iLHthY3Rpb246ImFkZEV2ZW50In0sW3RoaXMucmVmLGVdKX19LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuZXZlbnQmJnRoaXMuZXZlbnRbZV0pe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbcmVtb3ZlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBSZW1vdmUgIicrZSsnIiBldmVudCBvbiA8Jyt0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksZGVsZXRlIHRoaXMuZXZlbnRbZV07dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0JiZ0LnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRXZlbnQifSxbdGhpcy5yZWYsZV0pfX0sZS5wcm90b3R5cGUuZmlyZUV2ZW50PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGwsbz0hMSxhPXRoaXMuZXZlbnRbdF07aWYoYSYmZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltmaXJlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBGaXJlICInK3QrJyIgZXZlbnQgb24gPCcrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLiIpO3ZhciBzPWEuaGFuZGxlcjtlLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe289ITB9O3RyeXtpPXImJnIucGFyYW1zP3MuY2FsbC5hcHBseShzLFt0aGlzXS5jb25jYXQoci5wYXJhbXMsW2VdKSk6cy5jYWxsKHRoaXMsZSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGludm9rZSB0aGUgZXZlbnQgaGFuZGxlciBvZiAiJyt0KyciIG9uICcrdGhpcy50eXBlKyIgKCIrdGhpcy5yZWYrIik6XG4gIitlLnRvU3RyaW5nKCkpLGV9fXJldHVybiFvJiZuJiYtMSE9PUJVQkJMRV9FVkVOVFMuaW5kZXhPZih0KSYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50JiYoZS5jdXJyZW50VGFyZ2V0PXRoaXMucGFyZW50Tm9kZSx0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50KHQsZSxuKSksaX0sZS5wcm90b3R5cGUudG9TdHlsZT1mdW5jdGlvbigpe3ZhciBlPU9iamVjdC5hc3NpZ24oe30sdGhpcy5jbGFzc1N0eWxlKSx0PXRoaXMuc3R5bGU7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ZVtuXT0iIj09PXImJm4gaW4gdGhpcy5jbGFzc1N0eWxlP3RoaXMuY2xhc3NTdHlsZVtuXTpyfXJldHVybiBlfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciB0PXtyZWY6dGhpcy5yZWYudG9TdHJpbmcoKSx0eXBlOnRoaXMudHlwZSxhdHRyOnRoaXMuYXR0cixzdHlsZTpub3JtYWxpemVVbml0KHRoaXMudG9TdHlsZSgpKX07dGhpcy5jbGFzc0xpc3QmJnRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmKHQuY2xhc3M9dGhpcy5jbGFzc0xpc3Quam9pbigiICIpKTt2YXIgbj1bXTtmb3IodmFyIHIgaW4gdGhpcy5ldmVudCl7dmFyIGk9dGhpcy5ldmVudFtyXS5wYXJhbXM7aT9uLnB1c2goe3R5cGU6cixwYXJhbXM6aX0pOm4ucHVzaChyKX1yZXR1cm4gbi5sZW5ndGgmJih0LmV2ZW50PW4pLCFlJiZ0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgmJih0LmNoaWxkcmVuPXRoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSx0fSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiI8Iit0aGlzLnR5cGUrIiBhdHRyPSIrSlNPTi5zdHJpbmdpZnkodGhpcy5hdHRyKSsiIHN0eWxlPSIrSlNPTi5zdHJpbmdpZnkodGhpcy50b1N0eWxlKCkpKyI+Iit0aGlzLnB1cmVDaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0pLmpvaW4oIiIpKyI8LyIrdGhpcy50eXBlKyI+In0sZS5wcm90b3R5cGUuc2V0Q2xhc3NMaXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLmNsYXNzTGlzdC5sZW5ndGgmJjA9PT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hdC5jbGFzc0xpc3QuaW5jbHVkZXMoZSl9KS5sZW5ndGh8fCh0aGlzLmNsYXNzTGlzdD1lLHRoaXMucGFyZW50Tm9kZSYmdGhpcy5jb21wdXRlQ2xhc3NMaXN0KCkpfSxlLnByb3RvdHlwZS5zZXRTdHlsZXNoZWV0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLnN0eWxlc2hlZXQubGVuZ3RoJiYwPT09ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIXQuc3R5bGVzaGVldC5pbmNsdWRlcyhlKX0pLmxlbmd0aHx8KHRoaXMuc3R5bGVzaGVldD1lLHRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLmNvbXB1dGVDbGFzc0xpc3QoKSl9LGUucHJvdG90eXBlLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2hpbGRyZW4scj10fHxlLGk9cj9uLmluZGV4T2Yocik6MCxvPW4ubGVuZ3RoLTE7Zm9yKCFlfHxlLmNsYXNzTGlzdCYmZS5jbGFzc0xpc3QubGVuZ3RofHwobz10P2ktMTppKTswPD1pJiZpPD1vO2krKyl7dmFyIGE9bltpXTthLmNvbXB1dGVDbGFzc0xpc3QmJmEuY29tcHV0ZUNsYXNzTGlzdCgpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUNsYXNzTGlzdD1mdW5jdGlvbigpe3ZhciB1PXRoaXMsZT10aGlzLmNsYXNzTGlzdCx0PXRoaXMuc3R5bGVzaGVldCxwPXt9LGg9e307ZnVuY3Rpb24gbChlLHQpe3ZhciBuPXQmJnQuY2xhc3NMaXN0O3JldHVybiBuJiZuLmluY2x1ZGVzKGUpfXQuZm9yRWFjaChmdW5jdGlvbihuLGYpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtpZigoblsiQFZFUlNJT04iXXx8MSk8Mil7dmFyIHQ9bltlXTt0JiZPYmplY3QuYXNzaWduKHAsdCl9ZWxzZXt2YXIgYz1uWyIuIitlXTtjJiZPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXU7aWYoZSlmb3IodmFyIG49ZS5zcGxpdCgiLiIpLHI9bi5sZW5ndGgtMTswPHI7ci0tKXt2YXIgaT1uW3JdLG89aVtpLmxlbmd0aC0xXSxhPWkucmVwbGFjZSgvWyt+PiBdJC8sIiIpO2lmKCJ+Ij09PW98fCIgIj09PW8pe2Zvcih2YXIgcz0ifiI9PT1vPyJwcmV2aW91c1NpYmxpbmciOiJwYXJlbnROb2RlIjt0JiYhbChhLHQ9dFtzXSk7KTtpZighdClyZXR1cm59ZWxzZSBpZigiPiI9PT1vP3Q9dCYmdC5wYXJlbnROb2RlOiIrIj09PW8mJih0PXQmJnQucHJldmlvdXNTaWJsaW5nKSwhbChhLHQpKXJldHVybn12YXIgZD1jW2VdO09iamVjdC5rZXlzKGQpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZFtlXSxuPXRbMF0scj10WzFdLGk9dFsyXSxvPXRbM10sYT1bcixpLGYsb10scz1oW2VdLGM9ITA7aWYocylmb3IodmFyIHU9MDt1PHMubGVuZ3RoO3UrKyl7dmFyIGw9YVt1XS1zW3VdO2lmKDAhPT1sKXtjPTA8bDticmVha319YyYmKHBbZV09bixoW2VdPWEpfSl9KX19KX0pLHRoaXMuc2V0Q2xhc3NTdHlsZShwKSx0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdCgpfSxlfShOb2RlKTtmdW5jdGlvbiBub3JtYWxpemVQcmltaXRpdmUoZSl7dmFyIHQ9dHlwb2YoZSk7c3dpdGNoKHQpe2Nhc2UiVW5kZWZpbmVkIjpjYXNlIk51bGwiOnJldHVybiIiO2Nhc2UiUmVnRXhwIjpyZXR1cm4gZS50b1N0cmluZygpO2Nhc2UiRGF0ZSI6cmV0dXJuIGUudG9JU09TdHJpbmcoKTtjYXNlIk51bWJlciI6Y2FzZSJTdHJpbmciOmNhc2UiQm9vbGVhbiI6Y2FzZSJBcnJheSI6Y2FzZSJPYmplY3QiOnJldHVybiBlO2Nhc2UiQXJyYXlCdWZmZXIiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOnQsYmFzZTY0OmJ1ZmZlclRvQmFzZTY0KGUpfTtjYXNlIkludDhBcnJheSI6Y2FzZSJVaW50OEFycmF5IjpjYXNlIlVpbnQ4Q2xhbXBlZEFycmF5IjpjYXNlIkludDE2QXJyYXkiOmNhc2UiVWludDE2QXJyYXkiOmNhc2UiSW50MzJBcnJheSI6Y2FzZSJVaW50MzJBcnJheSI6Y2FzZSJGbG9hdDMyQXJyYXkiOmNhc2UiRmxvYXQ2NEFycmF5IjpyZXR1cm57IkB0eXBlIjoiYmluYXJ5IixkYXRhVHlwZTp0LGJhc2U2NDpidWZmZXJUb0Jhc2U2NChlLmJ1ZmZlcil9O2RlZmF1bHQ6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfX1zZXRFbGVtZW50KEVsZW1lbnQpO3ZhciBmYWxsYmFjaz1mdW5jdGlvbigpe30sVGFza0NlbnRlcj1mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbnN0YW5jZUlkIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpTdHJpbmcoZSl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FsbGJhY2tNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpuZXcgQ2FsbGJhY2tNYW5hZ2VyKGUpfSksZmFsbGJhY2s9dHx8ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBpbml0JDEoKXt2YXIgZT17Y3JlYXRlRmluaXNoOmdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLHVwZGF0ZUZpbmlzaDpnbG9iYWwuY2FsbFVwZGF0ZUZpbmlzaCxyZWZyZXNoRmluaXNoOmdsb2JhbC5jYWxsUmVmcmVzaEZpbmlzaCxjcmVhdGVCb2R5Omdsb2JhbC5jYWxsQ3JlYXRlQm9keSxhZGRFbGVtZW50Omdsb2JhbC5jYWxsQWRkRWxlbWVudCxyZW1vdmVFbGVtZW50Omdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxtb3ZlRWxlbWVudDpnbG9iYWwuY2FsbE1vdmVFbGVtZW50LHVwZGF0ZUF0dHJzOmdsb2JhbC5jYWxsVXBkYXRlQXR0cnMsdXBkYXRlU3R5bGU6Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxhZGRFdmVudDpnbG9iYWwuY2FsbEFkZEV2ZW50LHJlbW92ZUV2ZW50Omdsb2JhbC5jYWxsUmVtb3ZlRXZlbnQsX191cGRhdGVDb21wb25lbnREYXRhOmdsb2JhbC5fX3VwZGF0ZUNvbXBvbmVudERhdGF9LHQ9VGFza0NlbnRlci5wcm90b3R5cGUsbj1mdW5jdGlvbihuKXt2YXIgcj1lW25dO3Rbbl09cj9mdW5jdGlvbihlLHQpe3JldHVybiByLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHQpKX06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZToiZG9tIixtZXRob2Q6bixhcmdzOnR9XSwiLTEiKX19O2Zvcih2YXIgciBpbiBlKW4ocik7dC5jb21wb25lbnRIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlQ29tcG9uZW50fHxmdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBmYWxsYmFjayhlLFt7Y29tcG9uZW50OmkuY29tcG9uZW50LHJlZjp0LG1ldGhvZDpuLGFyZ3M6cn1dKX0sdC5tb2R1bGVIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlTW9kdWxlfHxmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZTp0LG1ldGhvZDpuLGFyZ3M6cn1dKX19ZnVuY3Rpb24gZmlyZUV2ZW50KGUsdCxuLHIsaSxvKXt2YXIgYT1lLmdldFJlZih0KTtyZXR1cm4gYT9lLmZpcmVFdmVudChhLG4scixpLG8pOnI/KHIuX25vZGVJZD10LGUuZmlyZUV2ZW50KGUuZ2V0UmVmKCJfZG9jdW1lbnRFbGVtZW50IiksbixyLGksbykpOnZvaWQgMH1mdW5jdGlvbiBjYWxsYmFjayhlLHQsbixyKXtyZXR1cm4gZS50YXNrQ2VudGVyLmNhbGxiYWNrKHQsbixyKX1mdW5jdGlvbiBjb21wb25lbnRIb29rKGUsdCxuLHIsaSl7aWYoIWV8fCFlLnRhc2tDZW50ZXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIENhblwndCBmaW5kICJkb2N1bWVudCIgb3IgInRhc2tDZW50ZXIiLicpLG51bGw7dmFyIG89bnVsbDt0cnl7bz1lLnRhc2tDZW50ZXIudHJpZ2dlckhvb2sodCxuLHIsaSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHRyaWdnZXIgdGhlICInK24rIkAiK3IrJyIgaG9vayBvbiAnK3QrIi4iKSxlfXJldHVybiBvfWZ1bmN0aW9uIHJlY2VpdmVUYXNrcyhlLHQpe3ZhciBuPWdldERvYyhlKTtyZXR1cm4gbj9BcnJheS5pc0FycmF5KHQpP3QubWFwKGZ1bmN0aW9uKGUpe3N3aXRjaChlLm1ldGhvZCl7Y2FzZSJjYWxsYmFjayI6cmV0dXJuIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCxbbl0uY29uY2F0KGUuYXJncykpO2Nhc2UiZmlyZUV2ZW50U3luYyI6Y2FzZSJmaXJlRXZlbnQiOnJldHVybiBmaXJlRXZlbnQuYXBwbHkodm9pZCAwLFtuXS5jb25jYXQoZS5hcmdzKSk7Y2FzZSJjb21wb25lbnRIb29rIjpyZXR1cm4gY29tcG9uZW50SG9vay5hcHBseSh2b2lkIDAsW25dLmNvbmNhdChlLmFyZ3MpKX19KTp2b2lkIDA6bmV3IEVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVjZWl2ZVRhc2tzLCBpbnN0YW5jZSAoIitlKyIpIGlzIG5vdCBhdmFpbGFibGUuIil9VGFza0NlbnRlci5wcm90b3R5cGUuY2FsbGJhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jb25zdW1lKGUsdCxuKX0sVGFza0NlbnRlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuKGU9dGhpcy5jYWxsYmFja01hbmFnZXIpLnJlZ2lzdGVySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS50cmlnZ2VySG9vaz1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09YXJndW1lbnRzW25dO3JldHVybihlPXRoaXMuY2FsbGJhY2tNYW5hZ2VyKS50cmlnZ2VySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNlbmQoIm1vZHVsZSIse21vZHVsZToiZG9tIixtZXRob2Q6InVwZGF0ZUNvbXBvbmVudERhdGEifSxbZSx0LG5dKX0sVGFza0NlbnRlci5wcm90b3R5cGUuZGVzdHJveUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNsb3NlKCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciByPXR5cG9mKGUpO2lmKGUmJmUgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLnJlZjtpZihlJiZlLl9pc1Z1ZSYmZS4kZWwgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLiRlbC5yZWY7aWYoIkZ1bmN0aW9uIj09PXIpcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZChlKS50b1N0cmluZygpO2lmKHQpe2lmKCJPYmplY3QiPT09cil7dmFyIGk9e307Zm9yKHZhciBvIGluIGUpaVtvXT1uLm5vcm1hbGl6ZShlW29dLCEwKTtyZXR1cm4gaX1pZigiQXJyYXkiPT09cilyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG4ubm9ybWFsaXplKGUsITApfSl9cmV0dXJuIGUmJmUucmVmJiZlWyJbW1ZpcnR1YWxFbGVtZW50XV0iXT9lLnJlZjpub3JtYWxpemVQcmltaXRpdmUoZSl9LFRhc2tDZW50ZXIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcyxvPXQuYWN0aW9uLGE9dC5jb21wb25lbnQscz10LnJlZixjPXQubW9kdWxlLHU9dC5tZXRob2Q7c3dpdGNoKG49bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkubm9ybWFsaXplKGUpfSksIk9iamVjdCI9PT10eXBvZihyKSYmKHI9dGhpcy5ub3JtYWxpemUociwhMCkpLGUpe2Nhc2UiZG9tIjpyZXR1cm4gY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlt0YXNrXSgiK3RoaXMuaW5zdGFuY2VJZCsiLCIrdGhpcy50eXBlKyIsIitvKyIpICIrSlNPTi5zdHJpbmdpZnkobikpLHRoaXNbb10odGhpcy5pbnN0YW5jZUlkLG4pO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxzLHUsbixPYmplY3QuYXNzaWduKHtjb21wb25lbnQ6YX0scikpO2RlZmF1bHQ6cmV0dXJuIGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbdGFza10oIit0aGlzLmluc3RhbmNlSWQrIiwiK2MrIiwiK3UrIikgIitKU09OLnN0cmluZ2lmeShuKSksdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxjLHUsbixyKX19LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxET009ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpc1tlXSh0aGlzLmluc3RhbmNlSWQsdCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxDb21wb25lbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxNb2R1bGU9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMubW9kdWxlSGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9O3ZhciB3ZWV4TW9kdWxlcz17fTtmdW5jdGlvbiByZWdpc3Rlck1vZHVsZXMoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWZ1bmN0aW9uKHQpe2hhc093bih3ZWV4TW9kdWxlcyx0KXx8KHdlZXhNb2R1bGVzW3RdPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlP3dlZXhNb2R1bGVzW3RdW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS5uYW1lJiYod2VleE1vZHVsZXNbdF1bZS5uYW1lXT1lLmFyZ3N8fFtdKX0pfTtmb3IodmFyIG4gaW4gZSl0KG4pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZE1vZHVsZShlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8hKCF3ZWV4TW9kdWxlc1tlXXx8IXdlZXhNb2R1bGVzW2VdW3RdKTohIXdlZXhNb2R1bGVzW2VdfWZ1bmN0aW9uIGdldE1vZHVsZURlc2NyaXB0aW9uKGUpe3JldHVybiB3ZWV4TW9kdWxlc1tlXX12YXIgd2VleENvbXBvbmVudHM9e307ZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRzKGUpe0FycmF5LmlzQXJyYXkoZSkmJmUuZm9yRWFjaChmdW5jdGlvbihlKXtlJiYoInN0cmluZyI9PXR5cGVvZiBlP3dlZXhDb21wb25lbnRzW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS50eXBlJiZyZWdpc3RlckVsZW1lbnQoKHdlZXhDb21wb25lbnRzW2UudHlwZV09ZSkudHlwZSxlLm1ldGhvZHMpKX0pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZENvbXBvbmVudChlKXtyZXR1cm4hIXdlZXhDb21wb25lbnRzW2VdfXZhciBzZXJ2aWNlcz1bXTtmdW5jdGlvbiByZWdpc3RlcihlLHQpe2hhcyhlKT9jb25zb2xlLndhcm4oJ1NlcnZpY2UgIicrZSsnIiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhJyk6KHQ9T2JqZWN0LmFzc2lnbih7fSx0KSxzZXJ2aWNlcy5wdXNoKHtuYW1lOmUsb3B0aW9uczp0fSkpfWZ1bmN0aW9uIHVucmVnaXN0ZXIobil7c2VydmljZXMuc29tZShmdW5jdGlvbihlLHQpe2lmKGUubmFtZT09PW4pcmV0dXJuIHNlcnZpY2VzLnNwbGljZSh0LDEpLCEwfSl9ZnVuY3Rpb24gaGFzKGUpe3JldHVybiAwPD1pbmRleE9mKGUpfWZ1bmN0aW9uIGluZGV4T2YoZSl7cmV0dXJuIHNlcnZpY2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lfSkuaW5kZXhPZihlKX12YXIgQ29tbWVudD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm5vZGVUeXBlPTgsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ImNvbW1lbnQiLHRoaXMudmFsdWU9ZSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlx4M2MhLS0gIit0aGlzLnZhbHVlKyIgLS1ceDNlIn0sZX0oTm9kZSk7ZnVuY3Rpb24gY3JlYXRlQWN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PVtdKSx7bW9kdWxlOiJkb20iLG1ldGhvZDplLGFyZ3M6dH19dmFyIExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuYmF0Y2hlZD0hMSx0aGlzLnVwZGF0ZXM9W10sImZ1bmN0aW9uIj09dHlwZW9mIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImhhbmRsZXIiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6Y29uc29sZS5lcnJvcigiW0pTIFJ1bnRpbWVdIGludmFsaWQgcGFyYW1ldGVyLCBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfTtMaXN0ZW5lci5wcm90b3R5cGUuY3JlYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigiY3JlYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUudXBkYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigidXBkYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVmcmVzaEZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4oMCx0aGlzLmhhbmRsZXIpKFtjcmVhdGVBY3Rpb24oInJlZnJlc2hGaW5pc2giKV0sZSl9LExpc3RlbmVyLnByb3RvdHlwZS5jcmVhdGVCb2R5PWZ1bmN0aW9uKGUpe3ZhciB0PWUudG9KU09OKCksbj10LmNoaWxkcmVuO2RlbGV0ZSB0LmNoaWxkcmVuO3ZhciByPVtjcmVhdGVBY3Rpb24oImNyZWF0ZUJvZHkiLFt0XSldO3JldHVybiBuJiZyLnB1c2guYXBwbHkocixuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJhZGRFbGVtZW50IixbdC5yZWYsZSwtMV0pfSkpLHRoaXMuYWRkQWN0aW9ucyhyKX0sTGlzdGVuZXIucHJvdG90eXBlLmFkZEVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAwPD1ufHwobj0tMSksdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigiYWRkRWxlbWVudCIsW3QsZS50b0pTT04oKSxuXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVtb3ZlRWxlbWVudD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgdD1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJyZW1vdmVFbGVtZW50IixbZV0pfSk7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyh0KX1yZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigicmVtb3ZlRWxlbWVudCIsW2VdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5tb3ZlRWxlbWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oIm1vdmVFbGVtZW50IixbZSx0LG5dKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRBdHRyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyZXR1cm4gclt0XT1uLHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInVwZGF0ZUF0dHJzIixbZSxyXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByW3RdPW4sdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHJdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRTdHlsZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHRdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRFdmVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCJhZGRFdmVudCIsW2UsdF0pKX0sTGlzdGVuZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInJlbW92ZUV2ZW50IixbZSx0XSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuaGFuZGxlcj1mdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0KCl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRBY3Rpb25zPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudXBkYXRlcyxuPXRoaXMuaGFuZGxlcjtpZihBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pLCF0aGlzLmJhdGNoZWQpcmV0dXJuIG4oZSk7dC5wdXNoLmFwcGx5KHQsZSl9O3ZhciBoYW5kbGVyTWFwPXtjcmVhdGVCb2R5OiJjYWxsQ3JlYXRlQm9keSIsYWRkRWxlbWVudDoiY2FsbEFkZEVsZW1lbnQiLHJlbW92ZUVsZW1lbnQ6ImNhbGxSZW1vdmVFbGVtZW50Iixtb3ZlRWxlbWVudDoiY2FsbE1vdmVFbGVtZW50Iix1cGRhdGVBdHRyczoiY2FsbFVwZGF0ZUF0dHJzIix1cGRhdGVTdHlsZToiY2FsbFVwZGF0ZVN0eWxlIixhZGRFdmVudDoiY2FsbEFkZEV2ZW50IixyZW1vdmVFdmVudDoiY2FsbFJlbW92ZUV2ZW50In07ZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihyLGUpe3ZhciBpPWV8fGdsb2JhbC5jYWxsTmF0aXZlO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBpJiZjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyIiksZnVuY3Rpb24oZSl7QXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZGlzcGF0Y2hUYXNrKHIsZVt0XSxpKTtpZigtMT09PW4pcmV0dXJuIG59fX1mdW5jdGlvbiBoYXNBdmFpbGFibGVIYW5kbGVyKGUsdCl7cmV0dXJuImRvbSI9PT1lJiZoYW5kbGVyTWFwW3RdJiYiZnVuY3Rpb24iPT10eXBlb2YgZ2xvYmFsW2hhbmRsZXJNYXBbdF1dfWZ1bmN0aW9uIGRpc3BhdGNoVGFzayhlLHQsbil7dmFyIHI9dC5tb2R1bGUsaT10Lm1ldGhvZCxvPXQuYXJncztyZXR1cm4gaGFzQXZhaWxhYmxlSGFuZGxlcihyLGkpP2dsb2JhbFtoYW5kbGVyTWFwW2ldXS5hcHBseShnbG9iYWwsW2VdLmNvbmNhdChvLFsiLTEiXSkpOm4oZSxbdF0sIi0xIil9ZnVuY3Rpb24gdXBkYXRlRWxlbWVudChlLHQpe3ZhciBuPXQuYXR0cnN8fHt9O2Zvcih2YXIgciBpbiBuKWUuc2V0QXR0cihyLG5bcl0sITApO3ZhciBpPXQuc3R5bGV8fHt9O2Zvcih2YXIgbyBpbiBpKWUuc2V0U3R5bGUobyxpW29dLCEwKX12YXIgRG9jdW1lbnQ9ZnVuY3Rpb24gZSh0LG4scil7dD10P3QudG9TdHJpbmcoKToiIix0aGlzLmlkPXQsdGhpcy5VUkw9bixhZGREb2ModCx0aGlzKSx0aGlzLm5vZGVNYXA9e307dmFyIGk9ZS5MaXN0ZW5lcnx8TGlzdGVuZXI7dGhpcy5saXN0ZW5lcj1uZXcgaSh0LHJ8fGNyZWF0ZUhhbmRsZXIodCxlLmhhbmRsZXIpKSx0aGlzLnRhc2tDZW50ZXI9bmV3IFRhc2tDZW50ZXIodCxyP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gci5hcHBseSh2b2lkIDAsdCl9OmUuaGFuZGxlciksdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX07RG9jdW1lbnQucHJvdG90eXBlLmdldFJlZj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlTWFwW2VdfSxEb2N1bWVudC5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3RoaXMubGlzdGVuZXIuYmF0Y2hlZD0hMX0sRG9jdW1lbnQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSEwfSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztpZighdGhpcy5kb2N1bWVudEVsZW1lbnQpe3ZhciBlPW5ldyBFbGVtZW50KCJkb2N1bWVudCIpO2UuZG9jSWQ9dGhpcy5pZCxlLm93bmVyRG9jdW1lbnQ9dGhpcyxlLnJvbGU9ImRvY3VtZW50RWxlbWVudCIsZS5kZXB0aD0wLGUucmVmPSJfZG9jdW1lbnRFbGVtZW50Iix0aGlzLm5vZGVNYXAuX2RvY3VtZW50RWxlbWVudD1lLHRoaXMuZG9jdW1lbnRFbGVtZW50PWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSl7YXBwZW5kQm9keShuLGUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJpbnNlcnRCZWZvcmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlLHQpe2FwcGVuZEJvZHkobixlLHQpfX0pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCdDcmVhdGUgZG9jdW1lbnQgZWxlbWVudCAoaWQ6ICInK2UuZG9jSWQrJyIsIHJlZjogIicrZS5yZWYrJyIpJyl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQm9keT1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLmJvZHkpe3ZhciBuPW5ldyBFbGVtZW50KGUsdCk7c2V0Qm9keSh0aGlzLG4pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbY3JlYXRlQm9keV0oIit0aGlzLmlkKyIsIituLnR5cGUrIiwiK24ucmVmKyIpICgiK0pTT04uc3RyaW5naWZ5KG4udG9KU09OKCEwKSkrIikuIil9cmV0dXJuIHRoaXMuYm9keX0sRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgRWxlbWVudChlLHQpO3JldHVybiBjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2NyZWF0ZUVsZW1lbnRdKCIrdGhpcy5pZCsiLCIrbi50eXBlKyIsIituLnJlZisiKSAoIitKU09OLnN0cmluZ2lmeShuLnRvSlNPTighMCkpKyIpLiIpLG59LERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQ29tbWVudChlKX0sRG9jdW1lbnQucHJvdG90eXBlLmZpcmVFdmVudD1mdW5jdGlvbihlLHQsbixyLGkpe2lmKGUpeyhuPW58fHt9KS50eXBlPW4udHlwZXx8dCxuLnRhcmdldD1lLG4uY3VycmVudFRhcmdldD1lLG4udGltZXN0YW1wPURhdGUubm93KCksciYmdXBkYXRlRWxlbWVudChlLHIpO3ZhciBvPSJ3ZWV4IiE9PXRoaXMuX18kY29tcGlsZXJfXyxhPXRoaXMuZ2V0UmVmKCJfcm9vdCIpO2lmKGEmJmEuYXR0cil7dmFyIHM9YS5hdHRyLmJ1YmJsZTtvPSJ0cnVlIj09PXN8fCEwPT09c3x8byYmdm9pZCAwPT09c31yZXR1cm4id2VleCIhPT10aGlzLl9fJGNvbXBpbGVyX18mJihuPXByb2Nlc3NFdmVudChuKSksZS5maXJlRXZlbnQodCxuLG8saSl9fSxEb2N1bWVudC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbZGVzdHJveV0oIit0aGlzLmlkKyIsZG9jdW1lbnQsIit0aGlzLnJlZisnKSBEZXN0cm95IGRvY3VtZW50IChpZDogIicrdGhpcy5pZCsnIiwgVVJMOiAiJyt0aGlzLlVSTCsnIiknKSx0aGlzLnRhc2tDZW50ZXIuZGVzdHJveUNhbGxiYWNrKCksZGVsZXRlIHRoaXMubGlzdGVuZXIsZGVsZXRlIHRoaXMubm9kZU1hcCxkZWxldGUgdGhpcy50YXNrQ2VudGVyLHJlbW92ZURvYyh0aGlzLmlkKX0sRG9jdW1lbnQuaGFuZGxlcj1udWxsO3ZhciBsZXg9e0lucHV0RWxlbWVudERpdjoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsSW5wdXRFbGVtZW50UmVnRXhwOiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixSZXNlcnZlZFdvcmQ6IjxLZXl3b3JkPnw8TnVsbExpdGVyYWw+fDxCb29sZWFuTGl0ZXJhbD4iLFdoaXRlU3BhY2U6L1tcdFx2XGZcdTAwMjBcdTAwQTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVmXHUzMDAwXHVGRUZGXS8sTGluZVRlcm1pbmF0b3I6L1tcblxyXHUyMDI4XHUyMDI5XS8sS2V5d29yZDovbmV3KD8hW18kYS16QS1aMC05XSl8dm9pZCg/IVtfJGEtekEtWjAtOV0pfGRlbGV0ZSg/IVtfJGEtekEtWjAtOV0pfGluKD8hW18kYS16QS1aMC05XSl8aW5zdGFuY2VvZig/IVtfJGEtekEtWjAtOV0pfHR5cGVvZig/IVtfJGEtekEtWjAtOV0pLyxOdWxsTGl0ZXJhbDovbnVsbCg/IVtfJGEtekEtWjAtOV0pLyxCb29sZWFuTGl0ZXJhbDovKD86dHJ1ZXxmYWxzZSkoPyFbXyRhLXpBLVowLTldKS8sSWRlbnRpZmllcjovW18kYS16QS1aXVtfJGEtekEtWjAtOV0qLyxQdW5jdHVhdG9yOi9cL3w9PnxcKlwqfD4+Pj18Pj49fDw8PXw9PT18IT09fD4+Pnw8PHwlPXxcKj18LT18XCs9fDw9fD49fD09fCE9fFxePXxcfD18XHxcfHwmJnwmPXw+PnxcK1wrfC0tfFw6fH18XCp8JnxcfHxcXnwhfH58LXxcK3xcP3wlfD18Pnw8fCx8O3xcLig/IVswLTldKXxcXXxcW3xcKXxcKHx7LyxEaXZQdW5jdHVhdG9yOi9cLz18XC8vLE51bWVyaWNMaXRlcmFsOi8oPzowW3hYXVswLTlhLWZBLUZdKnxcLlswLTldK3woPzpbMS05XStbMC05XSp8MCkoPzpcLlswLTldKnxcLik/KSg/OltlRV1bKy1dezAsMX1bMC05XSspPyg/IVtfJGEtekEtWjAtOV0pLyxTdHJpbmdMaXRlcmFsOi8iKD86W14iXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKiJ8Jyg/OlteJ1xuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSonLyxSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWw6L1wvKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W14qXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkoPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKlwvWzAtOWEtekEtWl0qL307ZnVuY3Rpb24gWFJlZ0V4cChyLGUsaSl7dmFyIG89W2VdO3ZhciBhPWZ1bmN0aW9uIG4oZSl7dmFyIHQ9bmV3IFJlZ0V4cDtyZXR1cm4gdC5jb21waWxlKGUucmVwbGFjZSgvPChbXj5dKyk+L2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gclt0XT8oby5wdXNoKHQpLHJbdF1pbnN0YW5jZW9mIFJlZ0V4cD8iKCIrclt0XS5zb3VyY2UrIikiOiIoIituKHJbdF0pLnNvdXJjZSsiKSIpOiIifSksaSksdH0ocltlXSk7dGhpcy5leGVjPWZ1bmN0aW9uKGUpe3ZhciB0PWEuZXhlYyhlKTtpZihudWxsPT10KXJldHVybiBudWxsO2Zvcih2YXIgbj1uZXcgU3RyaW5nKHRbMF0pLHI9MDtyPG8ubGVuZ3RoO3IrKyl0W3JdJiYobltvW3JdXT10W3JdKTtyZXR1cm4gbn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxhc3RJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhLmxhc3RJbmRleH0sc2V0OmZ1bmN0aW9uKGUpe2EubGFzdEluZGV4PWV9fSl9ZnVuY3Rpb24gTGV4aWNhbFBhcnNlcigpe3ZhciBpLG89bmV3IFhSZWdFeHAobGV4LCJJbnB1dEVsZW1lbnREaXYiLCJnIiksYT1uZXcgWFJlZ0V4cChsZXgsIklucHV0RWxlbWVudFJlZ0V4cCIsImciKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic291cmNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbihlKXtpPWUsby5sYXN0SW5kZXg9MCxhLmxhc3RJbmRleD0wfX0pLHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtvLmxhc3RJbmRleD0wLGEubGFzdEluZGV4PTB9LHRoaXMuZ2V0TmV4dFRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0LG49by5sYXN0SW5kZXgscj0odD1lP286YSkuZXhlYyhpKTtpZihyJiZ0Lmxhc3RJbmRleC1uPnIubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBJTExFR0FMIik7cmV0dXJuIG8ubGFzdEluZGV4PXQubGFzdEluZGV4LGEubGFzdEluZGV4PXQubGFzdEluZGV4LHJ9fXZhciBydWxlcz17SWRlbnRpZmllck5hbWU6W1siSWRlbnRpZmllciJdXSxMaXRlcmFsOltbIk51bGxMaXRlcmFsIl0sWyJCb29sZWFuTGl0ZXJhbCJdLFsiTnVtZXJpY0xpdGVyYWwiXSxbIlN0cmluZ0xpdGVyYWwiXSxbIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCJdXSxQcmltYXJ5RXhwcmVzc2lvbjpbWyJJZGVudGlmaWVyIl0sWyJMaXRlcmFsIl0sWyIoIiwiRXhwcmVzc2lvbiIsIikiXV0sQ2FsbEV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iLCJBcmd1bWVudHMiXSxbIkNhbGxFeHByZXNzaW9uIiwiQXJndW1lbnRzIl1dLEFyZ3VtZW50czpbWyIoIiwiKSJdLFsiKCIsIkFyZ3VtZW50TGlzdCIsIikiXV0sQXJndW1lbnRMaXN0OltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiQXJndW1lbnRMaXN0IiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxMZWZ0SGFuZFNpZGVFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIl0sWyJDYWxsRXhwcmVzc2lvbiJdXSxVbmFyeUV4cHJlc3Npb246W1siTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiJdLFsidm9pZCIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiKyIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiLSIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsifiIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiISIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxFeHBvbmVudGlhdGlvbkV4cHJlc3Npb246W1siVW5hcnlFeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iLCIqKiIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiLyIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIqIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIlIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl1dLEFkZGl0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIisiLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIi0iLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXV0sU2hpZnRFeHByZXNzaW9uOltbIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPDwiLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+Pj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXV0sUmVsYXRpb25hbEV4cHJlc3Npb246W1siU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjwiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbnN0YW5jZW9mIiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluIiwiU2hpZnRFeHByZXNzaW9uIl1dLEVxdWFsaXR5RXhwcmVzc2lvbjpbWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl1dLEJpdHdpc2VBTkRFeHByZXNzaW9uOltbIkVxdWFsaXR5RXhwcmVzc2lvbiJdLFsiQml0d2lzZUFOREV4cHJlc3Npb24iLCImIiwiRXF1YWxpdHlFeHByZXNzaW9uIl1dLEJpdHdpc2VYT1JFeHByZXNzaW9uOltbIkJpdHdpc2VBTkRFeHByZXNzaW9uIl0sWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiIsIl4iLCJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdXSxCaXR3aXNlT1JFeHByZXNzaW9uOltbIkJpdHdpc2VYT1JFeHByZXNzaW9uIl0sWyJCaXR3aXNlT1JFeHByZXNzaW9uIiwifCIsIkJpdHdpc2VYT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxBTkRFeHByZXNzaW9uOltbIkJpdHdpc2VPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIiwiJiYiLCJCaXR3aXNlT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxPUkV4cHJlc3Npb246W1siTG9naWNhbEFOREV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCJ8fCIsIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl1dLENvbmRpdGlvbmFsRXhwcmVzc2lvbjpbWyJMb2dpY2FsT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwiPyIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI6IiwiTG9naWNhbE9SRXhwcmVzc2lvbiJdXSxFeHByZXNzaW9uOltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXhwcmVzc2lvbiIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sUHJvZ3JhbTpbWyJFeHByZXNzaW9uIl1dfTtmdW5jdGlvbiBTeW1ib2wkMShlLHQpe3RoaXMubmFtZT1lLHRoaXMudG9rZW49dCx0aGlzLmNoaWxkTm9kZXM9W10sdGhpcy50b1N0cmluZz1mdW5jdGlvbihlKXtpZihlfHwoZT0iIiksMT09dGhpcy5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdLnRvU3RyaW5nKGUpO2Zvcih2YXIgdD1lK3RoaXMubmFtZSsobnVsbCE9dGhpcy50b2tlbiYmdGhpcy5uYW1lIT10aGlzLnRva2VuPyI6Iit0aGlzLnRva2VuOiIiKSsiXG4iLG49MDtuPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXQrPXRoaXMuY2hpbGROb2Rlc1tuXS50b1N0cmluZyhlKyIgICAgIik7cmV0dXJuIHR9fWZ1bmN0aW9uIFN5bnRhY3RpY2FsUGFyc2VyKCl7dmFyIGU9e1Byb2dyYW06IiQifSxvPXt9OyFmdW5jdGlvbiBlKG4pe29bSlNPTi5zdHJpbmdpZnkobildPW47Zm9yKHZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG4pO3IubGVuZ3RoOyl7dmFyIGk9ci5zaGlmdCgpO3J1bGVzW2ldJiZydWxlc1tpXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZVswXV18fHIucHVzaChlWzBdKTt2YXIgdD1uO2UuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdfHwodFtlXT17fSksdD10W2VdfSksbltpXS4kZGl2JiYodC4kZGl2PSEwKSx0LiRyZWR1Y2U9aSx0LiRjb3VudD1lLmxlbmd0aH0pfWZvcih2YXIgdCBpbiBuKSJvYmplY3QiIT10eXBlb2Ygblt0XXx8IiQiPT10LmNoYXJBdCgwKXx8blt0XS4kY2xvc3VyZXx8KG9bSlNPTi5zdHJpbmdpZnkoblt0XSldP25bdF09b1tKU09OLnN0cmluZ2lmeShuW3RdKV06ZShuW3RdKSk7bi4kY2xvc3VyZT0hMH0oZSk7dmFyIGk9W10sYT1bZV0scz1lO3RoaXMuaW5zZXJ0U3ltYm9sPWZ1bmN0aW9uKGUsdCl7Zm9yKDshc1tlLm5hbWVdJiZzLiRyZWR1Y2U7KXtmb3IodmFyIG49cy4kY291bnQscj1uZXcgU3ltYm9sJDEocy4kcmVkdWNlKTtuLS07KXIuY2hpbGROb2Rlcy5wdXNoKGkucG9wKCkpLGEucG9wKCk7cz1hW2EubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKHIpfWlmKHM9c1tlLm5hbWVdLGkucHVzaChlKSxhLnB1c2gocyksIXMpdGhyb3cgbmV3IEVycm9yO3JldHVybiBzLiRkaXZ9LHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtpPVtdLGE9W3M9ZV19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFtbWFyVHJlZSIse2dldDpmdW5jdGlvbigpe3RyeXtmb3IoO3MuJHJlZHVjZTspe2Zvcih2YXIgZT1zLiRjb3VudCx0PW5ldyBTeW1ib2wkMShzLiRyZWR1Y2UpO2UtLTspdC5jaGlsZE5vZGVzLnB1c2goaS5wb3AoKSksYS5wb3AoKTtzPWFbYS5sZW5ndGgtMV0sdGhpcy5pbnNlcnRTeW1ib2wodCl9aWYoMDxpLmxlbmd0aCYmc1siOyJdKXJldHVybiB0aGlzLmluc2VydFN5bWJvbChuZXcgU3ltYm9sJDEoIjsiLCI7IikpLHRoaXMuZ3JhbW1hclRyZWU7aWYoMSE9aS5sZW5ndGh8fCJQcm9ncmFtIiE9aVswXS5uYW1lKXRocm93IG5ldyBFcnJvcn1jYXRjaChlKXt0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iil9cmV0dXJuIGlbMF19fSl9ZnVuY3Rpb24gUGFyc2VyKCl7dGhpcy5sZXhpY2FsUGFyc2VyPW5ldyBMZXhpY2FsUGFyc2VyLHRoaXMuc3ludGFjdGljYWxQYXJzZXI9bmV3IFN5bnRhY3RpY2FsUGFyc2VyO3ZhciBhPXt9O1siTnVsbExpdGVyYWwiLCJCb29sZWFuTGl0ZXJhbCIsIk51bWVyaWNMaXRlcmFsIiwiU3RyaW5nTGl0ZXJhbCIsIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCIsIklkZW50aWZpZXIiLCIqKiIsIj0+IiwieyIsIn0iLCIoIiwiKSIsIlsiLCJdIiwiLiIsIjsiLCIsIiwiPCIsIj4iLCI8PSIsIj49IiwiPT0iLCIhPSIsIj09PSIsIiE9PSIsIisiLCItIiwiKiIsIiUiLCIrKyIsIi0tIiwiPDwiLCI+PiIsIj4+PiIsIiYiLCJ8IiwiXiIsIiEiLCJ+IiwiJiYiLCJ8fCIsIj8iLCI6IiwiPSIsIis9IiwiLT0iLCIqPSIsIiU9IiwiPDw9IiwiPj49IiwiPj4+PSIsIiY9IiwifD0iLCJePSIsIi8iLCIvPSIsImluc3RhbmNlb2YiLCJ0eXBlb2YiLCJuZXciLCJ2b2lkIiwiZGVidWdnZXIiLCJ0aGlzIiwiZGVsZXRlIiwiaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGUse30pfSksdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGV4aWNhbFBhcnNlci5yZXNldCgpLHRoaXMuc3ludGFjdGljYWxQYXJzZXIucmVzZXQoKX0sdGhpcy5wYXJzZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcyxpPSExO3RoaXMubGV4aWNhbFBhcnNlci5zb3VyY2U9ZTtmb3IodmFyIG89ITE7bj10aGlzLmxleGljYWxQYXJzZXIuZ2V0TmV4dFRva2VuKG8pOyl7dCYmdChuKTt0cnl7aWYoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobikuc29tZShmdW5jdGlvbihlKXtyZXR1cm4hIWEuaGFzT3duUHJvcGVydHkoZSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShlLG4pLGkpLCEoaT0hMSkpfSkpY29udGludWU7KG4uS2V5d29yZHx8bi5QdW5jdHVhdG9yfHxuLkRpdlB1bmN0dWF0b3IpJiZhLmhhc093blByb3BlcnR5KG4udG9TdHJpbmcoKSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShuLnRvU3RyaW5nKCksbiksaSkpfWNhdGNoKGUpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAiK24pfX1yZXR1cm4gdGhpcy5zeW50YWN0aWNhbFBhcnNlci5ncmFtbWFyVHJlZX19dmFyIHBhcnNlcj1uZXcgUGFyc2VyO2Z1bmN0aW9uIEphdmFTY3JpcHRFeHByZXNzaW9uKHRleHQpe3BhcnNlci5yZXNldCgpLHRoaXMudHJlZT1wYXJzZXIucGFyc2UodGV4dCksdGhpcy5wYXRocz1bXTt2YXIgY29udGV4dD1PYmplY3QuY3JlYXRlKG51bGwpLG1lPXRoaXMscGF0aEluZGV4PU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gY2hlY2tTaW1wbGUoZSl7Zm9yKHZhciB0PWU7dC5jaGlsZE5vZGVzLmxlbmd0aDw9MSYmIk1lbWJlckV4cHJlc3Npb24iIT09dC5uYW1lOyl0PXQuY2hpbGROb2Rlc1swXTsiTWVtYmVyRXhwcmVzc2lvbiI9PT10Lm5hbWU/bWUuaXNTaW1wbGU9ITA6bWUuaXNTaW1wbGU9ITF9ZnVuY3Rpb24gd2FsayhlKXtpZigiQ2FsbEV4cHJlc3Npb24iPT09ZS5uYW1lJiYiQ2FsbEV4cHJlc3Npb24iIT09ZS5jaGlsZE5vZGVzW2UuY2hpbGROb2Rlcy5sZW5ndGgtMV0ubmFtZSl7Z2V0UGF0aChlLmNoaWxkTm9kZXNbMV0pO3dhbGsoZS5jaGlsZE5vZGVzWzBdKX1lbHNlIGlmKCJOZXdFeHByZXNzaW9uIj09PWUubmFtZSYmMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgpZ2V0UGF0aChlLmNoaWxkTm9kZXNbMF0pO2Vsc2UgaWYoIk1lbWJlckV4cHJlc3Npb24iPT09ZS5uYW1lJiYxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aClnZXRQYXRoKGUpO2Vsc2UgZm9yKHZhciB0PTA7dDxlLmNoaWxkTm9kZXMubGVuZ3RoO3QrKyl3YWxrKGUuY2hpbGROb2Rlc1t0XSl9ZnVuY3Rpb24gZ2V0UGF0aChlKXt2YXIgdDtpZigiSWRlbnRpZmllck5hbWUiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuKHQ9Z2V0UGF0aChlLmNoaWxkTm9kZXNbMl0pKSYmKHQ9dC5jb25jYXQoZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKSkpLGNyZWF0ZVBhdGgodCksdDtpZigiUHJpbWFyeUV4cHJlc3Npb24iPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIklkZW50aWZpZXIiPT09ZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0ubmFtZT8oY3JlYXRlUGF0aCh0PVtlLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS50b2tlbi50b1N0cmluZygpXSksdCk6bnVsbDtpZigiXSI9PT1lLmNoaWxkTm9kZXNbMF0ubmFtZSlyZXR1cm4gZ2V0UGF0aChlLmNoaWxkTm9kZXNbM10pLHdhbGsoZS5jaGlsZE5vZGVzWzFdKSxudWxsO2lmKCJBcmd1bWVudHMiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIHdhbGsoZS5jaGlsZE5vZGVzWzBdKSx3YWxrKGUuY2hpbGROb2Rlc1sxXSksbnVsbDtmb3IodmFyIG49MDtuPGUuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXdhbGsoZS5jaGlsZE5vZGVzW25dKX1mdW5jdGlvbiBjcmVhdGVQYXRoKGUpe2Zvcih2YXIgdD1jb250ZXh0LG49MDtuPGUubGVuZ3RoLTE7bisrKXRbZVtuXV18fCh0W2Vbbl1dPU9iamVjdC5jcmVhdGUobnVsbCkpLHQ9dFtlW25dXTttZS5wYXRocy5wdXNoKGUpLHBhdGhJbmRleFtlLmpvaW4oIi4iKV09ITF9dGhpcy5pc1NpbXBsZSx0aGlzLmlzQ29uc3Qsd2Fsayh0aGlzLnRyZWUpLGNoZWNrU2ltcGxlKHRoaXMudHJlZSksMD09PXRoaXMucGF0aHMubGVuZ3RoJiYodGhpcy5pc0NvbnN0PSEwKSx0aGlzLnNldHRlcj1mdW5jdGlvbih0KXtmb3IodmFyIG49Y29udGV4dCxyPTA7cjx0Lmxlbmd0aC0xO3IrKyluW3Rbcl1dfHwoblt0W3JdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxuPW5bdFtyXV07cmV0dXJue2lzQ29tcGxldGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHBhdGhJbmRleClpZighcGF0aEluZGV4W2VdKXJldHVybiExO3JldHVybiEwfSxzZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHBhdGhJbmRleFt0LmpvaW4oIi4iKV18fChwYXRoSW5kZXhbdC5qb2luKCIuIildPSEwKSxuW3Rbcl1dPWUsdGhpcy5pc0NvbXBsZXRlZCgpP21lLmV4ZWMoKTp2b2lkIDB9fX0sdGhpcy52YWx1ZU9mPXRoaXMuZXhlYz1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZXZhbCh0ZXh0KX0uY2FsbChjb250ZXh0KX1jYXRjaChlKXt9fX1mdW5jdGlvbiB2aXNpdCh0KXt2YXIgZSxuPXQuY2hpbGROb2Rlcy5zbGljZSgpLnJldmVyc2UoKSxyPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSk7aWYoIlVuYXJ5RXhwcmVzc2lvbiI9PT10Lm5hbWUmJigyPT09bi5sZW5ndGgmJiItIj09PW5bMF0ubmFtZSYmMT09PXIubGVuZ3RoKSlyZXR1cm4oZT12aXNpdChyWzBdKSkudmFsdWU9LWUudmFsdWUsZTtpZigiQXJndW1lbnRzIj09PXQubmFtZSl7Zm9yKHZhciBpPVtdLG89clswXTtvOykzPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89by5jaGlsZE5vZGVzWzJdKSwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89bnVsbCk7cmV0dXJue3R5cGU6IkFyZ3VtZW50cyIsY2hpbGRyZW46aS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHZpc2l0KGUpfSl9fWlmKHImJjE9PT1yLmxlbmd0aClyZXR1cm4gZT12aXNpdChyWzBdKTtpZih0LnRva2VuJiZbIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJJZGVudGlmaWVyIl0uc29tZShmdW5jdGlvbihlKXtyZXR1cm4gdC50b2tlbltlXX0pKXt2YXIgYT1PYmplY3Qua2V5cyh0LnRva2VuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL0xpdGVyYWwvKXx8ZS5tYXRjaCgvSWRlbnRpZmllci8pfSlbMF07cmV0dXJue3R5cGU6YSx2YWx1ZTp7TnVsbExpdGVyYWw6bnVsbCxCb29sZWFuTGl0ZXJhbDpCb29sZWFuKHQudG9rZW4pLE51bWVyaWNMaXRlcmFsOk51bWJlcih0LnRva2VuKSxTdHJpbmdMaXRlcmFsOnQudG9rZW4sSWRlbnRpZmllcjp0LnRva2VufVthXX19cmV0dXJuIkNhbGxFeHByZXNzaW9uIj09PXQubmFtZT97dHlwZToiQ2FsbEV4cHJlc3Npb24iLGNoaWxkcmVuOlt2aXNpdChuWzBdKSx2aXNpdChuWzFdKV19Ont0eXBlOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRva2VuJiZlLnRva2VuLlB1bmN0dWF0b3J9KVswXS5uYW1lLGNoaWxkcmVuOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB2aXNpdChlKX0pfX1mdW5jdGlvbiBwYXJzZShlKXt2YXIgdD1uZXcgSmF2YVNjcmlwdEV4cHJlc3Npb24oZSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHZpc2l0KHQudHJlZSksbnVsbCl9dmFyIG9sZENhbGxVcGRhdGVTdHlsZT1nbG9iYWwuY2FsbFVwZGF0ZVN0eWxlO2Z1bmN0aW9uIGlzQmluZE1ldGhvZChlLHQpe3JldHVybigiYmluZGluZ3giPT09ZXx8ImJpbmRpbmciPT09ZSkmJiJiaW5kIj09PXR9ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbihlKXtpZih2b2lkIDAhPT1lKXt0cnl7ZT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe312YXIgdD17fTtpZigic3RyaW5nIj09dHlwZW9mIGU/dC5vcmlnaW49ZTplJiYodC5vcmlnaW49ZS5vcmlnaW4sdC50cmFuc2Zvcm1lZD1lLnRyYW5zZm9ybWVkKSx0LnRyYW5zZm9ybWVkfHx0Lm9yaWdpbilyZXR1cm4gdC50cmFuc2Zvcm1lZD10LnRyYW5zZm9ybWVkfHxwYXJzZSh0Lm9yaWdpbiksdH19ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbnMoZSl7cmV0dXJuIGUmJihlLmV4aXRFeHByZXNzaW9uPWZvcm1hdEV4cHJlc3Npb24oZS5leGl0RXhwcmVzc2lvbiksZS5wcm9wcyYmZS5wcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZXhwcmVzc2lvbj1mb3JtYXRFeHByZXNzaW9uKGUuZXhwcmVzc2lvbil9KSksZX1mdW5jdGlvbiBmaXhDYWxsYmFjayh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9e30pLCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiB0KHtzdGF0ZToiZW5kIj09PWUuc3RhdGU/ImV4aXQiOmUuc3RhdGUsdDp2b2lkIDAhPT1lLnQ/ZS50OmUuZGVsdGFUfSl9fWZ1bmN0aW9uIGhhbmRsZU1vZHVsZUdldHRlcihlLHQsbil7cmV0dXJuIGlzQmluZE1ldGhvZChlLHQpP2Z1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ZnVuY3Rpb24oKXt9KSwhZSl0aHJvdyBuZXcgRXJyb3IoInNob3VsZCBwYXNzIG9wdGlvbnMgZm9yIGJpbmRpbmciKTtyZXR1cm4gZm9ybWF0RXhwcmVzc2lvbnMoZSksbihlLGUmJiJ0aW1pbmciPT09ZS5ldmVudFR5cGU/Zml4Q2FsbGJhY2sodCk6dCl9Om59ZnVuY3Rpb24gc2V0SWQoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiW1tDdXJyZW50SW5zdGFuY2VJZF1dIix7dmFsdWU6dH0pfWZ1bmN0aW9uIGdldElkKGUpe3JldHVybiBlWyJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iXX1mdW5jdGlvbiBtb2R1bGVHZXR0ZXIoZSxuLHIpe3ZhciBpPWdldFRhc2tDZW50ZXIoZSk7cmV0dXJuIGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLnNlbmQ/ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOm4sbWV0aG9kOnJ9LGUpfTooY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoIitlKyIpLiIpLG51bGwpfWZ1bmN0aW9uIG1vZHVsZVNldHRlcihlLHQsbixyKXt2YXIgaT1nZXRUYXNrQ2VudGVyKGUpO3JldHVybiBpJiYiZnVuY3Rpb24iPT10eXBlb2YgaS5zZW5kPyJmdW5jdGlvbiIhPXR5cGVvZiByPyhjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSAiK3QrIi4iK24rIiBtdXN0IGJlIGFzc2lnbmVkIGFzIGEgZnVuY3Rpb24uIiksbnVsbCk6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOnQsbWV0aG9kOm59LFtlXSl9Oihjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZmluZCB0YXNrQ2VudGVyICgiK2UrIikuIiksbnVsbCl9Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoLTE7MDxuLS07KXRbbl09YXJndW1lbnRzW24rMV07cmV0dXJuIHRbMV0mJih0WzFdPW5vcm1hbGl6ZVVuaXQodFsxXSkpLG9sZENhbGxVcGRhdGVTdHlsZS5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdCh0KSl9O3ZhciBXZWV4SW5zdGFuY2U9ZnVuY3Rpb24oZSx0LG4pe3NldElkKHRoaXMsU3RyaW5nKGUpKSx0aGlzLmNvbmZpZz10fHx7fSx0aGlzLl9uYXRpdmVEYXRhPW58fHt9LHRoaXMuZG9jdW1lbnQ9bmV3IERvY3VtZW50KGUsdGhpcy5jb25maWcuYnVuZGxlVXJsKSx0aGlzLnJlcXVpcmVNb2R1bGU9dGhpcy5yZXF1aXJlTW9kdWxlLmJpbmQodGhpcyksdGhpcy5pbXBvcnRTY3JpcHQ9dGhpcy5pbXBvcnRTY3JpcHQuYmluZCh0aGlzKSx0aGlzLmlzUmVnaXN0ZXJlZE1vZHVsZT1pc1JlZ2lzdGVyZWRNb2R1bGUsdGhpcy5pc1JlZ2lzdGVyZWRDb21wb25lbnQ9aXNSZWdpc3RlcmVkQ29tcG9uZW50fSxfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2UsX19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZSx1bmksZ2V0QXBwLGdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U7ZnVuY3Rpb24gY3JlYXRlU2VydmljZUNvbnRleHQocmcsaWcsb2csYWcsZSl7dmFyIHNnPWUuc2V0VGltZW91dCxjZz1lLmNsZWFyVGltZW91dCx1Zz1lLnNldEludGVydmFsLGxnPWUuY2xlYXJJbnRlcnZhbCxkZz1lLl9fdW5pQ29uZmlnLGZnPWUuX191bmlSb3V0ZXMsdD1mdW5jdGlvbigpe3ZhciBlLGksdD1bImJhc2U2NFRvQXJyYXlCdWZmZXIiLCJhcnJheUJ1ZmZlclRvQmFzZTY0IiwiYWRkSW50ZXJjZXB0b3IiLCJyZW1vdmVJbnRlcmNlcHRvciIsImludGVyY2VwdG9ycyJdLmNvbmNhdChbInJlcXVlc3QiLCJ1cGxvYWRGaWxlIiwiZG93bmxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCIsIm9uU29ja2V0T3BlbiIsIm9uU29ja2V0RXJyb3IiLCJzZW5kU29ja2V0TWVzc2FnZSIsIm9uU29ja2V0TWVzc2FnZSIsImNsb3NlU29ja2V0Iiwib25Tb2NrZXRDbG9zZSIsImdldFVwZGF0ZU1hbmFnZXIiLCJjb25maWdNVExTIl0sWyJuYXZpZ2F0ZVRvIiwicmVkaXJlY3RUbyIsInJlTGF1bmNoIiwic3dpdGNoVGFiIiwibmF2aWdhdGVCYWNrIl0sWyJzZXRTdG9yYWdlIiwic2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlIiwiZ2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlSW5mbyIsImdldFN0b3JhZ2VJbmZvU3luYyIsInJlbW92ZVN0b3JhZ2UiLCJyZW1vdmVTdG9yYWdlU3luYyIsImNsZWFyU3RvcmFnZSIsImNsZWFyU3RvcmFnZVN5bmMiXSxbImdldExvY2F0aW9uIiwiY2hvb3NlTG9jYXRpb24iLCJvcGVuTG9jYXRpb24iLCJjcmVhdGVNYXBDb250ZXh0Iiwib25Mb2NhdGlvbkNoYW5nZSIsIm9uTG9jYXRpb25DaGFuZ2VFcnJvciIsInN0YXJ0TG9jYXRpb25VcGRhdGUiLCJzdG9wTG9jYXRpb25VcGRhdGUiLCJvZmZMb2NhdGlvbkNoYW5nZSIsIm9mZkxvY2F0aW9uQ2hhbmdlRXJyb3IiXSxbImNob29zZUltYWdlIiwiY2hvb3NlRmlsZSIsInByZXZpZXdJbWFnZSIsImNsb3NlUHJldmlld0ltYWdlIiwiZ2V0SW1hZ2VJbmZvIiwiZ2V0VmlkZW9JbmZvIiwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIsImNvbXByZXNzSW1hZ2UiLCJjb21wcmVzc1ZpZGVvIiwiZ2V0UmVjb3JkZXJNYW5hZ2VyIiwiZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsImNyZWF0ZUF1ZGlvQ29udGV4dCIsImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0IiwiY2hvb3NlVmlkZW8iLCJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtIiwiY3JlYXRlVmlkZW9Db250ZXh0IiwiY3JlYXRlQ2FtZXJhQ29udGV4dCIsImNyZWF0ZUxpdmVQbGF5ZXJDb250ZXh0IiwiY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiXSxbImdldFN5c3RlbUluZm8iLCJnZXRTeXN0ZW1JbmZvU3luYyIsImdldFdpbmRvd0luZm8iLCJnZXREZXZpY2VJbmZvIiwiZ2V0QXBwQmFzZUluZm8iLCJjYW5JVXNlIiwib25NZW1vcnlXYXJuaW5nIiwiZ2V0TmV0d29ya1R5cGUiLCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLCJvZmZOZXR3b3JrU3RhdHVzQ2hhbmdlIiwib25BY2NlbGVyb21ldGVyQ2hhbmdlIiwib2ZmQWNjZWxlcm9tZXRlckNoYW5nZSIsInN0YXJ0QWNjZWxlcm9tZXRlciIsInN0b3BBY2NlbGVyb21ldGVyIiwib25Db21wYXNzQ2hhbmdlIiwib2ZmQ29tcGFzc0NoYW5nZSIsInN0YXJ0Q29tcGFzcyIsInN0b3BDb21wYXNzIiwib25HeXJvc2NvcGVDaGFuZ2UiLCJzdGFydEd5cm9zY29wZSIsInN0b3BHeXJvc2NvcGUiLCJtYWtlUGhvbmVDYWxsIiwic2NhbkNvZGUiLCJzZXRDbGlwYm9hcmREYXRhIiwiZ2V0Q2xpcGJvYXJkRGF0YSIsInNldFNjcmVlbkJyaWdodG5lc3MiLCJnZXRTY3JlZW5CcmlnaHRuZXNzIiwic2V0S2VlcFNjcmVlbk9uIiwib25Vc2VyQ2FwdHVyZVNjcmVlbiIsInZpYnJhdGVMb25nIiwidmlicmF0ZVNob3J0IiwiYWRkUGhvbmVDb250YWN0Iiwib3BlbkJsdWV0b290aEFkYXB0ZXIiLCJzdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aERldmljZUZvdW5kIiwic3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIsImdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMiLCJnZXRCbHVldG9vdGhEZXZpY2VzIiwiZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlIiwiY2xvc2VCbHVldG9vdGhBZGFwdGVyIiwid3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIiwicmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSIsIm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsIm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsImNyZWF0ZUJMRUNvbm5lY3Rpb24iLCJjbG9zZUJMRUNvbm5lY3Rpb24iLCJzZXRCTEVNVFUiLCJnZXRCTEVEZXZpY2VSU1NJIiwib25CZWFjb25TZXJ2aWNlQ2hhbmdlIiwib25CZWFjb25VcGRhdGUiLCJnZXRCZWFjb25zIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiLCJzdG9wQmVhY29uRGlzY292ZXJ5IiwiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uIiwiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZSIsInN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbiIsIm9uVGhlbWVDaGFuZ2UiLCJvZmZUaGVtZUNoYW5nZSIsIm9uVUlTdHlsZUNoYW5nZSIsImdldFN5c3RlbVNldHRpbmciLCJnZXRBcHBBdXRob3JpemVTZXR0aW5nIiwib3BlbkFwcEF1dGhvcml6ZVNldHRpbmciXSxbImhpZGVLZXlib2FyZCIsIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLCJvZmZLZXlib2FyZEhlaWdodENoYW5nZSIsImdldFNlbGVjdGVkVGV4dFJhbmdlIl0sWyJzaG93VG9hc3QiLCJoaWRlVG9hc3QiLCJzaG93TG9hZGluZyIsImhpZGVMb2FkaW5nIiwic2hvd01vZGFsIiwic2hvd0FjdGlvblNoZWV0Iiwic2V0TmF2aWdhdGlvbkJhclRpdGxlIiwic2V0TmF2aWdhdGlvbkJhckNvbG9yIiwic2hvd05hdmlnYXRpb25CYXJMb2FkaW5nIiwiaGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nIiwic2V0VGFiQmFySXRlbSIsInNldFRhYkJhclN0eWxlIiwiaGlkZVRhYkJhciIsInNob3dUYWJCYXIiLCJzZXRUYWJCYXJCYWRnZSIsInJlbW92ZVRhYkJhckJhZGdlIiwic2hvd1RhYkJhclJlZERvdCIsImhpZGVUYWJCYXJSZWREb3QiLCJvblRhYkJhck1pZEJ1dHRvblRhcCIsInNldEJhY2tncm91bmRDb2xvciIsInNldEJhY2tncm91bmRUZXh0U3R5bGUiLCJjcmVhdGVBbmltYXRpb24iLCJwYWdlU2Nyb2xsVG8iLCJvbldpbmRvd1Jlc2l6ZSIsIm9mZldpbmRvd1Jlc2l6ZSIsImxvYWRGb250RmFjZSIsInN0YXJ0UHVsbERvd25SZWZyZXNoIiwic3RvcFB1bGxEb3duUmVmcmVzaCIsImNyZWF0ZVNlbGVjdG9yUXVlcnkiLCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIsImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIsImdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QiLCJzaG93VG9wV2luZG93Iiwic2hvd0xlZnRXaW5kb3ciLCJzaG93UmlnaHRXaW5kb3ciLCJoaWRlVG9wV2luZG93IiwiaGlkZUxlZnRXaW5kb3ciLCJoaWRlUmlnaHRXaW5kb3ciLCJnZXRUb3BXaW5kb3dTdHlsZSIsImdldExlZnRXaW5kb3dTdHlsZSIsImdldFJpZ2h0V2luZG93U3R5bGUiLCJzZXRUb3BXaW5kb3dTdHlsZSIsInNldExlZnRXaW5kb3dTdHlsZSIsInNldFJpZ2h0V2luZG93U3R5bGUiLCJnZXRMb2NhbGUiLCJzZXRMb2NhbGUiLCJvbkxvY2FsZUNoYW5nZSJdLFsiJGVtaXQiLCIkb24iLCIkb25jZSIsIiRvZmYiXSxbInNhdmVGaWxlIiwiZ2V0U2F2ZWRGaWxlTGlzdCIsImdldFNhdmVkRmlsZUluZm8iLCJyZW1vdmVTYXZlZEZpbGUiLCJnZXRGaWxlSW5mbyIsIm9wZW5Eb2N1bWVudCIsImdldEZpbGVTeXN0ZW1NYW5hZ2VyIl0sWyJjcmVhdGVPZmZzY3JlZW5DYW52YXMiLCJjcmVhdGVDYW52YXNDb250ZXh0IiwiY2FudmFzVG9UZW1wRmlsZVBhdGgiLCJjYW52YXNQdXRJbWFnZURhdGEiLCJjYW52YXNHZXRJbWFnZURhdGEiXSxbImdldFByb3ZpZGVyIiwibG9naW4iLCJjaGVja1Nlc3Npb24iLCJnZXRVc2VySW5mbyIsImdldFVzZXJQcm9maWxlIiwicHJlTG9naW4iLCJjbG9zZUF1dGhWaWV3IiwiZ2V0Q2hlY2tCb3hTdGF0ZSIsImdldFVuaXZlcmlmeU1hbmFnZXIiLCJzaGFyZSIsInNoYXJlV2l0aFN5c3RlbSIsInNob3dTaGFyZU1lbnUiLCJoaWRlU2hhcmVNZW51IiwicmVxdWVzdFBheW1lbnQiLCJzdWJzY3JpYmVQdXNoIiwidW5zdWJzY3JpYmVQdXNoIiwib25QdXNoIiwib2ZmUHVzaCIsInJlcXVpcmVOYXRpdmVQbHVnaW4iLCJ1cHgycHgiLCJyZXN0b3JlR2xvYmFsIiwicmVxdWlyZUdsb2JhbCIsImdldFN1Yk5WdWVCeUlkIiwiZ2V0Q3VycmVudFN1Yk5WdWUiLCJzZXRQYWdlTWV0YSIsIm9uSG9zdEV2ZW50UmVjZWl2ZSIsIm9uTmF0aXZlRXZlbnRSZWNlaXZlIiwic2VuZE5hdGl2ZUV2ZW50IiwicHJlbG9hZFBhZ2UiLCJ1blByZWxvYWRQYWdlIiwibG9hZFN1YlBhY2thZ2UiLCJzZW5kSG9zdEV2ZW50IiwibmF2aWdhdGVUb01pbmlQcm9ncmFtIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJnZXRFbnRlck9wdGlvbnNTeW5jIiwiaW5pdFVUU1Byb3h5Q2xhc3MiLCJpbml0VVRTUHJveHlGdW5jdGlvbiIsImluaXRVVFNJbmRleENsYXNzTmFtZSIsImluaXRVVFNDbGFzc05hbWUiLCJpbml0VVRTUGFja2FnZU5hbWUiLCJyZXF1aXJlVVRTUGx1Z2luIiwicmVnaXN0ZXJVVFNQbHVnaW4iLCJyZWdpc3RlclVUU0ludGVyZmFjZSJdLFsiY3JlYXRlUmV3YXJkZWRWaWRlb0FkIiwiY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQiLCJjcmVhdGVJbnRlcnN0aXRpYWxBZCIsImNyZWF0ZUludGVyYWN0aXZlQWQiXSxbImludm9rZVB1c2hDYWxsYmFjayIsImdldFB1c2hDbGllbnRJZCIsIm9uUHVzaE1lc3NhZ2UiLCJvZmZQdXNoTWVzc2FnZSIsImNyZWF0ZVB1c2hNZXNzYWdlIiwiZ2V0Q2hhbm5lbE1hbmFnZXIiXSk7dHJ5e3ZhciBuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsbil9Y2F0Y2goZSl7fXZhciBhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIscz0vXig/OltBLVphLXpcZCsvXXs0fSkqPyg/OltBLVphLXpcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxkKy9dezN9PT8pPyQvO2Z1bmN0aW9uIGMoKXt2YXIgZSx0LG49cGcuZ2V0U3RvcmFnZVN5bmMoInVuaV9pZF90b2tlbiIpfHwiIixyPW4uc3BsaXQoIi4iKTtpZighbnx8MyE9PXIubGVuZ3RoKXJldHVybnt1aWQ6bnVsbCxyb2xlOltdLHBlcm1pc3Npb246W10sdG9rZW5FeHBpcmVkOjB9O3RyeXtlPUpTT04ucGFyc2UoKHQ9clsxXSxkZWNvZGVVUklDb21wb25lbnQoaSh0KS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSkpKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8miIrZS5tZXNzYWdlKX1yZXR1cm4gZS50b2tlbkV4cGlyZWQ9MWUzKmUuZXhwLGRlbGV0ZSBlLmV4cCxkZWxldGUgZS5pYXQsZX1pPSJmdW5jdGlvbiIhPXR5cGVvZiBhdG9iP2Z1bmN0aW9uKGUpe2lmKGU9U3RyaW5nKGUpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCIiKSwhcy50ZXN0KGUpKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2F0b2InIG9uICdXaW5kb3cnOiBUaGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpO3ZhciB0O2UrPSI9PSIuc2xpY2UoMi0oMyZlLmxlbmd0aCkpO2Zvcih2YXIgbixyLGk9IiIsbz0wO288ZS5sZW5ndGg7KXQ9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpPDwxOHxhLmluZGV4T2YoZS5jaGFyQXQobysrKSk8PDEyfChuPWEuaW5kZXhPZihlLmNoYXJBdChvKyspKSk8PDZ8KHI9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpKSxpKz02ND09PW4/U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUpOjY0PT09cj9TdHJpbmcuZnJvbUNoYXJDb2RlKHQ+PjE2JjI1NSx0Pj44JjI1NSk6U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQpO3JldHVybiBpfTphdG9iO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHk9T2JqZWN0LmFzc2lnbjtmdW5jdGlvbiBDKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIHUoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfXZhciBsPXU7ZnVuY3Rpb24gZChlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX1mdW5jdGlvbiBUKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm4gby5jYWxsKGUsdCl9ZnVuY3Rpb24gZigpe31mdW5jdGlvbiBwKGUpe3JldHVybiByLmNhbGwoZSkuc2xpY2UoOCwtMSl9ZnVuY3Rpb24gaCh0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbltlXXx8KG5bZV09dChlKSl9fXZhciB2PS8tKFx3KS9nLGc9aChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHYsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD90LnRvVXBwZXJDYXNlKCk6IiJ9KX0pLG09aChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfSk7ZnVuY3Rpb24gXyh0LG4pe2lmKHQ9PT1uKXJldHVybiEwO3ZhciBlPWQodCkscj1kKG4pO2lmKCFlfHwhcilyZXR1cm4hZSYmIXImJlN0cmluZyh0KT09PVN0cmluZyhuKTt0cnl7dmFyIGk9QXJyYXkuaXNBcnJheSh0KSxvPUFycmF5LmlzQXJyYXkobik7aWYoaSYmbylyZXR1cm4gdC5sZW5ndGg9PT1uLmxlbmd0aCYmdC5ldmVyeShmdW5jdGlvbihlLHQpe3JldHVybiBfKGUsblt0XSl9KTtpZih0IGluc3RhbmNlb2YgRGF0ZSYmbiBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHQuZ2V0VGltZSgpPT09bi5nZXRUaW1lKCk7aWYoaXx8bylyZXR1cm4hMTt2YXIgYT1PYmplY3Qua2V5cyh0KSxzPU9iamVjdC5rZXlzKG4pO3JldHVybiBhLmxlbmd0aD09PXMubGVuZ3RoJiZhLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiBfKHRbZV0sbltlXSl9KX1jYXRjaChlKXtyZXR1cm4hMX19dmFyIGI9L1shJygpKl0vZyx3PWZ1bmN0aW9uKGUpe3JldHVybiIlIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpfSxTPS8lMkMvZyx4PWZ1bmN0aW9uKGUpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZShiLHcpLnJlcGxhY2UoUywiLCIpfSxPPWRlY29kZVVSSUNvbXBvbmVudDtmdW5jdGlvbiBFKGUpe3ZhciBpPXt9O3JldHVybihlPWUudHJpbSgpLnJlcGxhY2UoL14oXD98I3wmKS8sIiIpKSYmZS5zcGxpdCgiJiIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC9cKy9nLCIgIikuc3BsaXQoIj0iKSxuPU8odC5zaGlmdCgpKSxyPTA8dC5sZW5ndGg/Tyh0LmpvaW4oIj0iKSk6bnVsbDt2b2lkIDA9PT1pW25dP2lbbl09cjpBcnJheS5pc0FycmF5KGlbbl0pP2lbbl0ucHVzaChyKTppW25dPVtpW25dLHJdfSksaX1mdW5jdGlvbiBJKHIsaSl7dm9pZCAwPT09aSYmKGk9eCk7dmFyIGU9cj9PYmplY3Qua2V5cyhyKS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9clt0XTtpZih2b2lkIDA9PT1lKXJldHVybiIiO2lmKG51bGw9PT1lKXJldHVybiBpKHQpO2lmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciBuPVtdO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7dm9pZCAwIT09ZSYmKG51bGw9PT1lP24ucHVzaChpKHQpKTpuLnB1c2goaSh0KSsiPSIraShlKSkpfSksbi5qb2luKCImIil9cmV0dXJuIGkodCkrIj0iK2koZSl9KS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIDA8ZS5sZW5ndGh9KS5qb2luKCImIik6bnVsbDtyZXR1cm4gZT8iPyIrZToiIn12YXIgQT0wLCQ9e307ZnVuY3Rpb24gUChlLHQpe3ZhciBuPSRbZV18fHt9O2RlbGV0ZSAkW2VdO3ZhciByPXQuZXJyTXNnfHwiIjtuZXcgUmVnRXhwKCJcXDpcXHMqZmFpbCIpLnRlc3Qocik/bi5mYWlsJiZuLmZhaWwodCk6bi5zdWNjZXNzJiZuLnN1Y2Nlc3ModCksbi5jb21wbGV0ZSYmbi5jb21wbGV0ZSh0KX12YXIgTT17d2FycDpmdW5jdGlvbihpKXtyZXR1cm4gZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PVN0cmluZyhBKyspOyRbdF09e3N1Y2Nlc3M6ZS5zdWNjZXNzLGZhaWw6ZS5mYWlsLGNvbXBsZXRlOmUuY29tcGxldGV9O3ZhciBuPU9iamVjdC5hc3NpZ24oe30sZSkscj1pLmJpbmQodGhpcykobix0KTtyJiZQKHQscil9fSxpbnZva2U6UH0saj17YmxhY2s6InJnYmEoMCwwLDAsMC40KSIsd2hpdGU6InJnYmEoMjU1LDI1NSwyNTUsMC40KSJ9O2Z1bmN0aW9uIEwoZSxvLGEpe3ZvaWQgMD09PW8mJihvPXt9KSx2b2lkIDA9PT1hJiYoYT0ibGlnaHQiKTt2YXIgcz1vW2FdLHQ9e307cmV0dXJuIHM/KE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24ocil7dmFyIGk9ZVtyXTt0W3JdPWZ1bmN0aW9uKCl7aWYoVChpKSlyZXR1cm4gTChpLG8sYSk7aWYoQXJyYXkuaXNBcnJheShpKSlyZXR1cm4gaS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFQoZSk/TChlLG8sYSk6ZX0pO2lmKHUoaSkmJmkuc3RhcnRzV2l0aCgiQCIpKXt2YXIgZT1pLnJlcGxhY2UoIkAiLCIiKSx0PXNbZV18fGk7c3dpdGNoKHIpe2Nhc2UiYm9yZGVyU3R5bGUiOnQ9KG49dCkmJm4gaW4gaj9qW25dOm59cmV0dXJuIHR9dmFyIG47cmV0dXJuIGl9KCl9KSx0KTplfWZ1bmN0aW9uIEIoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX19ZnVuY3Rpb24gTihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkoZSxhcmd1bWVudHMpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fX12YXIgRD1bImludm9rZSIsInN1Y2Nlc3MiLCJmYWlsIiwiY29tcGxldGUiLCJyZXR1cm5WYWx1ZSJdLFI9e30sRj17fTtmdW5jdGlvbiBVKGksbyl7T2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxuLHI7LTEhPT1ELmluZGV4T2YoZSkmJkMob1tlXSkmJihpW2VdPSh0PWlbZV0sbj1vW2VdLChyPW4/dD90LmNvbmNhdChuKTpBcnJheS5pc0FycmF5KG4pP246W25dOnQpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0ocik6cikpfSl9ZnVuY3Rpb24geihpLG8pe2kmJm8mJk9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQsbixyOy0xIT09RC5pbmRleE9mKGUpJiZDKG9bZV0pJiYodD1pW2VdLG49b1tlXSwtMSE9PShyPXQuaW5kZXhPZihuKSkmJnQuc3BsaWNlKHIsMSkpfSl9ZnVuY3Rpb24gVih0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlLG4pfHxlfX1mdW5jdGlvbiBxKGUpe3JldHVybiEhZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50aGVufWZ1bmN0aW9uIFcoZSx0LG4pe2Zvcih2YXIgcj0hMSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07aWYocilyPVByb21pc2UucmVzb2x2ZShWKG8sbikpO2Vsc2V7dmFyIGE9byh0LG4pO2lmKHEoYSkmJihyPVByb21pc2UucmVzb2x2ZShhKSksITE9PT1hKXJldHVybnt0aGVuOmZ1bmN0aW9uKCl7fX19fXJldHVybiByfHx7dGhlbjpmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX19fWZ1bmN0aW9uIEgocixpKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9e30pLFsic3VjY2VzcyIsImZhaWwiLCJjb21wbGV0ZSJdLmZvckVhY2goZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheShyW3RdKSl7dmFyIG49aVt0XTtpW3RdPWZ1bmN0aW9uKGUpe1coclt0XSxlLGkpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIEMobikmJm4oZSl8fGV9KX19fSksaX1mdW5jdGlvbiBHKGUsdCl7dmFyIG49W107QXJyYXkuaXNBcnJheShSLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sUi5yZXR1cm5WYWx1ZSk7dmFyIHI9RltlXTtyZXR1cm4gciYmQXJyYXkuaXNBcnJheShyLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sci5yZXR1cm5WYWx1ZSksbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9ZSh0KXx8dH0pLHR9ZnVuY3Rpb24gWChlKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO09iamVjdC5rZXlzKFIpLmZvckVhY2goZnVuY3Rpb24oZSl7InJldHVyblZhbHVlIiE9PWUmJih0W2VdPVJbZV0uc2xpY2UoKSl9KTt2YXIgbj1GW2VdO3JldHVybiBuJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJyZXR1cm5WYWx1ZSIhPT1lJiYodFtlXT0odFtlXXx8W10pLmNvbmNhdChuW2VdKSl9KSx0fWZ1bmN0aW9uIEoodCxuLGUpe2Zvcih2YXIgcj1bXSxpPWFyZ3VtZW50cy5sZW5ndGgtMzswPGktLTspcltpXT1hcmd1bWVudHNbaSszXTt2YXIgbz1YKHQpO3JldHVybiBvJiZPYmplY3Qua2V5cyhvKS5sZW5ndGg/QXJyYXkuaXNBcnJheShvLmludm9rZSk/VyhvLmludm9rZSxlKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBuLmFwcGx5KHZvaWQgMCxbSChYKHQpLGUpXS5jb25jYXQocikpfSk6bi5hcHBseSh2b2lkIDAsW0gobyxlKV0uY29uY2F0KHIpKTpuLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHIpKX12YXIgWT17cmV0dXJuVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHEoZSk/bmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlLnRoZW4oZnVuY3Rpb24oZSl7ZVswXT9uKGVbMF0pOnQoZVsxXSl9KX0pOmV9fSxLPS9eXCR8V2luZG93JHxXaW5kb3dTdHlsZSR8c2VuZEhvc3RFdmVudHxzZW5kTmF0aXZlRXZlbnR8cmVzdG9yZUdsb2JhbHxyZXF1aXJlR2xvYmFsfGdldEN1cnJlbnRTdWJOVnVlfGdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3R8XnJlcG9ydHxpbnRlcmNlcHRvcnN8SW50ZXJjZXB0b3IkfGdldFN1Yk5WdWVCeUlkfHJlcXVpcmVOYXRpdmVQbHVnaW58dXB4MnB4fGhpZGVLZXlib2FyZHxjYW5JVXNlfF5jcmVhdGV8U3luYyR8TWFuYWdlciR8YmFzZTY0VG9BcnJheUJ1ZmZlcnxhcnJheUJ1ZmZlclRvQmFzZTY0fGdldExvY2FsZXxzZXRMb2NhbGV8aW52b2tlUHVzaENhbGxiYWNrfGdldFdpbmRvd0luZm98Z2V0RGV2aWNlSW5mb3xnZXRBcHBCYXNlSW5mb3xnZXRTeXN0ZW1TZXR0aW5nfGdldEFwcEF1dGhvcml6ZVNldHRpbmd8aW5pdFVUU3xyZXF1aXJlVVRTfHJlZ2lzdGVyVVRTLyxaPS9eY3JlYXRlfE1hbmFnZXIkLyxRPVsiY3JlYXRlQkxFQ29ubmVjdGlvbiJdLGVlPVsicmVxdWVzdCIsImRvd25sb2FkRmlsZSIsInVwbG9hZEZpbGUiLCJjb25uZWN0U29ja2V0Il0sdGU9WyJjcmVhdGVCTEVDb25uZWN0aW9uIiwiY3JlYXRlUHVzaE1lc3NhZ2UiXSxuZT0vXm9ufF5vZmYvO2Z1bmN0aW9uIHJlKGUpe3JldHVybiBLLnRlc3QoZSkmJi0xPT09dGUuaW5kZXhPZihlKX1mdW5jdGlvbiBpZShlKXtyZXR1cm4gbmUudGVzdChlKSYmIm9uUHVzaCIhPT1lfWZ1bmN0aW9uIG9lKGUpe3JldHVybiB0PWUsIShaLnRlc3QodCkmJi0xPT09US5pbmRleE9mKHQpfHxyZShlKXx8aWUoZSkpO3ZhciB0fWZ1bmN0aW9uIGFlKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXt2YXIgcj1lW25dO0MocikmJih0W25dPU4ociksZGVsZXRlIGVbbl0pfXJldHVybiB0fVByb21pc2UucHJvdG90eXBlLmZpbmFsbHl8fChQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5PWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBlfSl9LGZ1bmN0aW9uKGUpe3JldHVybiBuLnJlc29sdmUodCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgZX0pfSl9KTt2YXIgc2U9W3tuYW1lOiJiYXNlNjQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sY2U9W3tuYW1lOiJhcnJheUJ1ZmZlciIsdHlwZTpbQXJyYXlCdWZmZXIsVWludDhBcnJheV0scmVxdWlyZWQ6ITB9XSx1ZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxiYXNlNjRUb0FycmF5QnVmZmVyOnNlLGFycmF5QnVmZmVyVG9CYXNlNjQ6Y2V9KSxsZT1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxkZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjYW5JVXNlOmxlfSksZmU9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XSxyZXF1aXJlZDohMH0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0scGU9ZmUsaGU9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XX0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9ufV0sdmU9W3tuYW1lOiJldmVudCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxnZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCwkb246ZmUsJG9uY2U6cGUsJG9mZjpoZSwkZW1pdDp2ZX0pLG1lPVt7bmFtZToibWV0aG9kIix0eXBlOltTdHJpbmcsT2JqZWN0XSxyZXF1aXJlZDohMH1dLHllPW1lLF9lPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGFkZEludGVyY2VwdG9yOm1lLHJlbW92ZUludGVyY2VwdG9yOnllfSksYmU9W3tuYW1lOiJ1cHgiLHR5cGU6W051bWJlcixTdHJpbmddLHJlcXVpcmVkOiEwfV0sd2U9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXB4MnB4OmJlfSk7ZnVuY3Rpb24ga2Uobil7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZSYmKHRbbl09TWF0aC5yb3VuZChlKSl9fXZhciBTZT17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoIngiKX0seTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJ5Iil9LHdpZHRoOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoIndpZHRoIil9LGhlaWdodDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJoZWlnaHQiKX19LHhlPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRhdGE6e3R5cGU6VWludDhDbGFtcGVkQXJyYXkscmVxdWlyZWQ6ITB9LHg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjprZSgieCIpfSx5Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoInkiKX0sd2lkdGg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjprZSgid2lkdGgiKX0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6a2UoImhlaWdodCIpfX0sQ2U9e1BORzoicG5nIixKUEc6ImpwZyIsSlBFRzoianBnIn0sVGU9e3g6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCx2YWxpZGF0b3I6a2UoIngiKX0seTp7dHlwZTpOdW1iZXIsZGVmYXVsdDowLHZhbGlkYXRvcjprZSgieSIpfSx3aWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmtlKCJ3aWR0aCIpfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjprZSgiaGVpZ2h0Iil9LGRlc3RXaWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmtlKCJkZXN0V2lkdGgiKX0sZGVzdEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmtlKCJkZXN0SGVpZ2h0Iil9LGNhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpLHQuZmlsZVR5cGU9ZSBpbiBDZT9DZVtlXTpDZS5QTkd9fSxxdWFsaXR5Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnF1YWxpdHk9MDxlJiZlPDE/ZToxfX19LE9lPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGFjdGlvbnM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHJlc2VydmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sRWU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FudmFzR2V0SW1hZ2VEYXRhOlNlLGNhbnZhc1B1dEltYWdlRGF0YTp4ZSxjYW52YXNUb1RlbXBGaWxlUGF0aDpUZSxkcmF3Q2FudmFzOk9lfSksSWU9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxBZT1JZSwkZT1JZSxQZT1JZSxNZT1be25hbWU6ImNhbnZhc0lkIix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNvbXBvbmVudEluc3RhbmNlIix0eXBlOk9iamVjdH1dLGplPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUF1ZGlvQ29udGV4dDpBZSxjcmVhdGVWaWRlb0NvbnRleHQ6JGUsY3JlYXRlTWFwQ29udGV4dDpQZSxjcmVhdGVDYW52YXNDb250ZXh0Ok1lfSksTGU9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5maXJzdE5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmc7In19fSxCZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhZGRQaG9uZUNvbnRhY3Q6TGV9KSxOZT17cGhvbmVOdW1iZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4ibWFrZVBob25lQ2FsbDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLnBob25lTnVtYmVyIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nOyJ9fX0sRGU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbWFrZVBob25lQ2FsbDpOZX0pLFJlPXtvbmx5RnJvbUNhbWVyYTp7dHlwZTpCb29sZWFufSxzY2FuVHlwZTp7dHlwZTpBcnJheX0sYXV0b0RlY29kZUNoYXJTZXQ6e3R5cGU6Qm9vbGVhbn0sc291bmQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5vbmUifSxhdXRvWm9vbTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSxGZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzY2FuQ29kZTpSZX0pLFVlPVsieyIsIn0iXSx6ZT1mdW5jdGlvbigpe3RoaXMuX2NhY2hlcz1PYmplY3QuY3JlYXRlKG51bGwpfTt6ZS5wcm90b3R5cGUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPVVlKSwhdClyZXR1cm5bZV07dmFyIHI9dGhpcy5fY2FjaGVzW2VdO3JldHVybiByfHwocj1mdW5jdGlvbihlLHQpe3ZhciBuPXRbMF0scj10WzFdLGk9W10sbz0wLGE9IiI7Zm9yKDtvPGUubGVuZ3RoOyl7dmFyIHM9ZVtvKytdO2lmKHM9PT1uKXthJiZpLnB1c2goe3R5cGU6InRleHQiLHZhbHVlOmF9KTt2YXIgYz1hPSIiO2ZvcihzPWVbbysrXTt2b2lkIDAhPT1zJiZzIT09cjspYys9cyxzPWVbbysrXTt2YXIgdT1zPT09cixsPVZlLnRlc3QoYyk/Imxpc3QiOnUmJnFlLnRlc3QoYyk/Im5hbWVkIjoidW5rbm93biI7aS5wdXNoKHt2YWx1ZTpjLHR5cGU6bH0pfWVsc2UgYSs9c31yZXR1cm4gYSYmaS5wdXNoKHt0eXBlOiJ0ZXh0Iix2YWx1ZTphfSksaX0oZSxuKSx0aGlzLl9jYWNoZXNbZV09ciksZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxyPTAsaT1BcnJheS5pc0FycmF5KHQpPyJsaXN0Ijoobz10LG51bGwhPT1vJiYib2JqZWN0Ij09dHlwZW9mIG8/Im5hbWVkIjoidW5rbm93biIpO3ZhciBvO2lmKCJ1bmtub3duIj09PWkpcmV0dXJuIG47Zm9yKDtyPGUubGVuZ3RoOyl7dmFyIGE9ZVtyXTtzd2l0Y2goYS50eXBlKXtjYXNlInRleHQiOm4ucHVzaChhLnZhbHVlKTticmVhaztjYXNlImxpc3QiOm4ucHVzaCh0W3BhcnNlSW50KGEudmFsdWUsMTApXSk7YnJlYWs7Y2FzZSJuYW1lZCI6Im5hbWVkIj09PWkmJm4ucHVzaCh0W2EudmFsdWVdKX1yKyt9cmV0dXJuIG59KHIsdCl9O3ZhciBWZT0vXig/OlxkKSsvLHFlPS9eKD86XHcpKy87dmFyIFdlPSJ6aC1IYW5zIixIZT0iemgtSGFudCIsR2U9ImVuIixYZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEplPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFhlLmNhbGwoZSx0KX0sWWU9bmV3IHplO2Z1bmN0aW9uIEtlKGUsdCl7aWYoZSl7aWYoZT1lLnRyaW0oKS5yZXBsYWNlKC9fL2csIi0iKSx0JiZ0W2VdKXJldHVybiBlO2lmKCJjaGluZXNlIj09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIFdlO2lmKDA9PT1lLmluZGV4T2YoInpoIikpcmV0dXJuLTE8ZS5pbmRleE9mKCItaGFucyIpP1dlOi0xPGUuaW5kZXhPZigiLWhhbnQiKT9IZToobj1lLFsiLXR3IiwiLWhrIiwiLW1vIiwiLWNodCJdLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1uLmluZGV4T2YoZSl9KT9IZTpXZSk7dmFyIG4scj1bR2UsImZyIiwiZXMiXTt0JiYwPE9iamVjdC5rZXlzKHQpLmxlbmd0aCYmKHI9T2JqZWN0LmtleXModCkpO3ZhciBpLG89KGk9ZSxyLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1pLmluZGV4T2YoZSl9KSk7cmV0dXJuIG98fHZvaWQgMH19dmFyIFplPWZ1bmN0aW9uKGUpe3ZhciB0PWUubG9jYWxlLG49ZS5mYWxsYmFja0xvY2FsZSxyPWUubWVzc2FnZXMsaT1lLndhdGNoZXIsbz1lLmZvcm1hdGVyO3RoaXMubG9jYWxlPUdlLHRoaXMuZmFsbGJhY2tMb2NhbGU9R2UsdGhpcy5tZXNzYWdlPXt9LHRoaXMubWVzc2FnZXM9e30sdGhpcy53YXRjaGVycz1bXSxuJiYodGhpcy5mYWxsYmFja0xvY2FsZT1uKSx0aGlzLmZvcm1hdGVyPW98fFllLHRoaXMubWVzc2FnZXM9cnx8e30sdGhpcy5zZXRMb2NhbGUodHx8R2UpLGkmJnRoaXMud2F0Y2hMb2NhbGUoaSl9O2Z1bmN0aW9uIFFlKGUsdCl7cmV0dXJuLTE8ZS5pbmRleE9mKHRbMF0pfVplLnByb3RvdHlwZS5zZXRMb2NhbGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMubG9jYWxlO3RoaXMubG9jYWxlPUtlKGUsdGhpcy5tZXNzYWdlcyl8fHRoaXMuZmFsbGJhY2tMb2NhbGUsdGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV18fCh0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXT17fSksdGhpcy5tZXNzYWdlPXRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdLG4hPT10aGlzLmxvY2FsZSYmdGhpcy53YXRjaGVycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodC5sb2NhbGUsbil9KX0sWmUucHJvdG90eXBlLmdldExvY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2FsZX0sWmUucHJvdG90eXBlLndhdGNoTG9jYWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLndhdGNoZXJzLnB1c2goZSktMTtyZXR1cm4gZnVuY3Rpb24oKXt0LndhdGNoZXJzLnNwbGljZShuLDEpfX0sWmUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49ITApO3ZhciByPXRoaXMubWVzc2FnZXNbZV07cj9uP09iamVjdC5hc3NpZ24ocix0KTpPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0plKHIsZSl8fChyW2VdPXRbZV0pfSk6dGhpcy5tZXNzYWdlc1tlXT10fSxaZS5wcm90b3R5cGUuZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUoZSx0LG4pLmpvaW4oIiIpfSxaZS5wcm90b3R5cGUudD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5tZXNzYWdlO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8odD1LZSh0LHRoaXMubWVzc2FnZXMpKSYmKHI9dGhpcy5tZXNzYWdlc1t0XSk6bj10LEplKHIsZSk/dGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShyW2VdLG4pLmpvaW4oIiIpOihjb25zb2xlLndhcm4oIkNhbm5vdCB0cmFuc2xhdGUgdGhlIHZhbHVlIG9mIGtleXBhdGggIitlKyIuIFVzZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCBhcyBkZWZhdWx0LiIpLGUpfTt2YXIgZXQsdHQ9NDQsbnQ9Im9uVGhlbWVDaGFuZ2UiLHJ0PSJlbiIsaXQ9e307T2JqZWN0LmFzc2lnbihpdCwoKGU9e30pW3J0XT17InVuaS5hcHAucXVpdCI6IlByZXNzIGJhY2sgYnV0dG9uIGFnYWluIHRvIGV4aXQiLCJ1bmkuYXN5bmMuZXJyb3IiOiJUaGUgY29ubmVjdGlvbiB0aW1lZCBvdXQsIGNsaWNrIHRoZSBzY3JlZW4gdG8gdHJ5IGFnYWluLiIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoiQ2FuY2VsIiwidW5pLnNob3dUb2FzdC51bnBhaXJlZCI6IlBsZWFzZSBub3RlIHNob3dUb2FzdCBtdXN0IGJlIHBhaXJlZCB3aXRoIGhpZGVUb2FzdCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6IlBsZWFzZSBub3RlIHNob3dMb2FkaW5nIG11c3QgYmUgcGFpcmVkIHdpdGggaGlkZUxvYWRpbmciLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IkNhbmNlbCIsInVuaS5zaG93TW9kYWwuY29uZmlybSI6Ik9LIiwidW5pLmNob29zZUltYWdlLmNhbmNlbCI6IkNhbmNlbCIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiJDYW1lcmEiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoiQ2FuY2VsIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iOiJBbGJ1bSIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IkNhbWVyYSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoiRmlsZSBjaG9vc2VyIGRpYWxvZyBjYW4gb25seSBiZSBzaG93biB3aXRoIGEgdXNlciBhY3RpdmF0aW9uIiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiJDYW5jZWwiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoiU2F2ZSBJbWFnZSIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoiU2F2ZWQgc3VjY2Vzc2Z1bGx5IiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiJTYXZlIGZhaWxlZCIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiJDb250ZW50IGNvcGllZCIsInVuaS5zY2FuQ29kZS50aXRsZSI6IlNjYW4gY29kZSIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IkFsYnVtIiwidW5pLnNjYW5Db2RlLmZhaWwiOiJSZWNvZ25pdGlvbiBmYWlsdXJlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoiVGFwIHRvIHR1cm4gbGlnaHQgb24iLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoiVGFwIHRvIHR1cm4gbGlnaHQgb2ZmIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IkZpbmdlcnByaW50IHJlY29nbml0aW9uIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6IlVucmVjb2duaXphYmxlIiwidW5pLnBpY2tlci5kb25lIjoiRG9uZSIsInVuaS5waWNrZXIuY2FuY2VsIjoiQ2FuY2VsIiwidW5pLnZpZGVvLmRhbm11IjoiRGFubXUiLCJ1bmkudmlkZW8udm9sdW1lIjoiVm9sdW1lIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6ImZlZWRiYWNrIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoic2VuZCIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiJGaW5kIFBsYWNlIiwidW5pLmNob29zZUxvY2F0aW9uLmNhbmNlbCI6IkNhbmNlbCJ9LGUuZXM9eyJ1bmkuYXBwLnF1aXQiOiJQdWxzZSBvdHJhIHZleiBwYXJhIHNhbGlyIiwidW5pLmFzeW5jLmVycm9yIjoiU2UgYWdvdMOzIGVsIHRpZW1wbyBkZSBjb25leGnDs24sIGhhZ2EgY2xpYyBlbiBsYSBwYW50YWxsYSBwYXJhIHZvbHZlciBhIGludGVudGFybG8uIiwidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiJUZW5nYSBlbiBjdWVudGEgcXVlIHNob3dUb2FzdCBkZWJlIGVzdGFyIGVtcGFyZWphZG8gY29uIGhpZGVUb2FzdCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6IlRlbmdhIGVuIGN1ZW50YSBxdWUgc2hvd0xvYWRpbmcgZGViZSBlc3RhciBlbXBhcmVqYWRvIGNvbiBoaWRlTG9hZGluZyIsInVuaS5zaG93TW9kYWwuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiJPSyIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoiw4FsYnVtIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ8OhbWFyYSIsInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoiw4FsYnVtIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ8OhbWFyYSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoiRWwgY3VhZHJvIGRlIGRpw6Fsb2dvIGRlbCBzZWxlY3RvciBkZSBhcmNoaXZvcyBzb2xvIHNlIHB1ZWRlIG1vc3RyYXIgY29uIGxhIGFjdGl2YWNpw7NuIGRlbCB1c3VhcmlvIiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiOiJHdWFyZGFyIGltYWdlbiIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoiR3VhcmRhZG8gZXhpdG9zYW1lbnRlIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiJFcnJvciBhbCBndWFyZGFyIiwidW5pLnNldENsaXBib2FyZERhdGEuc3VjY2VzcyI6IkNvbnRlbmlkbyBjb3BpYWRvIiwidW5pLnNjYW5Db2RlLnRpdGxlIjoiQ8OzZGlnbyBkZSBlc2NhbmVvIiwidW5pLnNjYW5Db2RlLmFsYnVtIjoiw4FsYnVtIiwidW5pLnNjYW5Db2RlLmZhaWwiOiLDiWNoZWMgZGUgbGEgcmVjb25uYWlzc2FuY2UiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iOiJUb3F1ZSBwYXJhIGVuY2VuZGVyIGxhIGx1eiIsInVuaS5zY2FuQ29kZS5mbGFzaC5vZmYiOiJUb3F1ZSBwYXJhIGFwYWdhciBsYSBsdXoiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50IjoiUmVjb25vY2ltaWVudG8gZGUgaHVlbGxhcyBkYWN0aWxhcmVzIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6IklycmVjb25vY2libGUiLCJ1bmkucGlja2VyLmRvbmUiOiJPSyIsInVuaS5waWNrZXIuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkudmlkZW8uZGFubXUiOiJEYW5tdSIsInVuaS52aWRlby52b2x1bWUiOiJWb2x1bWVuIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6InJlYWxpbWVudGFjacOzbiIsInVuaS5idXR0b24uZmVlZGJhY2suc2VuZCI6ImVudmlhciIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiJFbmNvbnRyYXIiLCJ1bmkuY2hvb3NlTG9jYXRpb24uY2FuY2VsIjoiQ2FuY2VsYXIifSxlLmZyPXsidW5pLmFwcC5xdWl0IjoiQXBwdXlleiDDoCBub3V2ZWF1IHBvdXIgcXVpdHRlciBsJ2FwcGxpY2F0aW9uIiwidW5pLmFzeW5jLmVycm9yIjoiTGEgY29ubmV4aW9uIGEgZXhwaXLDqSwgY2xpcXVleiBzdXIgbCfDqWNyYW4gcG91ciByw6llc3NheWVyLiIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoiQW5udWxlciIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiJWZXVpbGxleiBub3RlciBxdWUgc2hvd1RvYXN0IGRvaXQgw6p0cmUgYXNzb2Npw6kgw6AgaGlkZVRvYXN0IiwidW5pLnNob3dMb2FkaW5nLnVucGFpcmVkIjoiVmV1aWxsZXogbm90ZXIgcXVlIHNob3dMb2FkaW5nIGRvaXQgw6p0cmUgYXNzb2Npw6kgw6AgaGlkZUxvYWRpbmciLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiJPSyIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiJBbm51bGVyIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iOiJBbGJ1bSIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IkNhbcOpcmEiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoiQW5udWxlciIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiJDYW3DqXJhIiwidW5pLmNob29zZUZpbGUubm90VXNlckFjdGl2YXRpb24iOiJMYSBib8OudGUgZGUgZGlhbG9ndWUgZHUgc8OpbGVjdGV1ciBkZSBmaWNoaWVyIG5lIHBldXQgw6p0cmUgYWZmaWNow6llIHF1J2F2ZWMgdW5lIGFjdGl2YXRpb24gcGFyIGwndXRpbGlzYXRldXIiLCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoiR3VhcmRhciBpbWFnZW4iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6IkVucmVnaXN0csOpIGF2ZWMgc3VjY8OocyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoiw4ljaGVjIGRlIGxhIHNhdXZlZ2FyZGUiLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoiQ29udGVudSBjb3Bpw6kiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiJDb2RlIGTigJlhbmFseXNlIiwidW5pLnNjYW5Db2RlLmFsYnVtIjoiQWxidW0iLCJ1bmkuc2NhbkNvZGUuZmFpbCI6IkZhbGxvIGRlIHJlY29ub2NpbWllbnRvIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoiQXBwdXlleiBwb3VyIGFjdGl2ZXIgbCfDqWNsYWlyYWdlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiI6IkFwcHV5ZXogcG91ciBkw6lzYWN0aXZlciBsJ8OpY2xhaXJhZ2UiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50IjoiUmVjb25uYWlzc2FuY2UgZGUgbCdlbXByZWludGUgZGlnaXRhbGUiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50IjoiTcOpY29ubmFpc3NhYmxlIiwidW5pLnBpY2tlci5kb25lIjoiT0siLCJ1bmkucGlja2VyLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkudmlkZW8uZGFubXUiOiJEYW5tdSIsInVuaS52aWRlby52b2x1bWUiOiJMZSBWb2x1bWUiLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoicmV0b3VyIGQnaW5mb3JtYXRpb24iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnNlbmQiOiJlbnZveWVyIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IlRyb3V2ZSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiJBbm51bGVyIn0sZVsiemgtSGFucyJdPXsidW5pLmFwcC5xdWl0Ijoi5YaN5oyJ5LiA5qyh6YCA5Ye65bqU55SoIiwidW5pLmFzeW5jLmVycm9yIjoi6L+e5o6l5pyN5Yqh5Zmo6LaF5pe277yM54K55Ye75bGP5bmV6YeN6K+VIiwidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoi6K+35rOo5oSPIHNob3dUb2FzdCDkuI4gaGlkZVRvYXN0IOW/hemhu+mFjeWvueS9v+eUqCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6Iuivt+azqOaEjyBzaG93TG9hZGluZyDkuI4gaGlkZUxvYWRpbmcg5b+F6aG76YWN5a+55L2/55SoIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiLnoa7lrpoiLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iOiLku47nm7jlhozpgInmi6kiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiLmi43mkYQiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iOiLku47nm7jlhozpgInmi6kiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiLmi43mkYQiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IuaWh+S7tumAieaLqeWZqOWvueivneahhuWPquiDveWcqOeUseeUqOaIt+a/gOa0u+aXtuaYvuekuiIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6IuS/neWtmOWbvuWDjyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoi5L+d5a2Y5Zu+5YOP5Yiw55u45YaM5oiQ5YqfIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiLkv53lrZjlm77lg4/liLDnm7jlhozlpLHotKUiLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoi5YaF5a655bey5aSN5Yi2IiwidW5pLnNjYW5Db2RlLnRpdGxlIjoi5omr56CBIiwidW5pLnNjYW5Db2RlLmFsYnVtIjoi55u45YaMIiwidW5pLnNjYW5Db2RlLmZhaWwiOiLor4bliKvlpLHotKUiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iOiLovbvop6bnhafkuq4iLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoi6L276Kem5YWz6ZetIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IuaMh+e6ueivhuWIq+S4rS4uLiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiOiLml6Dms5Xor4bliKsiLCJ1bmkucGlja2VyLmRvbmUiOiLlrozmiJAiLCJ1bmkucGlja2VyLmNhbmNlbCI6IuWPlua2iCIsInVuaS52aWRlby5kYW5tdSI6IuW8ueW5lSIsInVuaS52aWRlby52b2x1bWUiOiLpn7Pph48iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoi6Zeu6aKY5Y+N6aaIIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoi5Y+R6YCBIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IuaQnOe0ouWcsOeCuSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiLlj5bmtogifSxlWyJ6aC1IYW50Il09eyJ1bmkuYXBwLnF1aXQiOiLlho3mjInkuIDmrKHpgIDlh7rmh4nnlKgiLCJ1bmkuYXN5bmMuZXJyb3IiOiLpgKPmjqXmnI3li5nlmajotoXmmYLvvIzpu57mk4rlsY/luZXph43oqaYiLCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCI6IuWPlua2iCIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiLoq4vms6jmhI8gc2hvd1RvYXN0IOiIhyBoaWRlVG9hc3Qg5b+F6aCI6YWN5bCN5L2/55SoIiwidW5pLnNob3dMb2FkaW5nLnVucGFpcmVkIjoi6KuL5rOo5oSPIHNob3dMb2FkaW5nIOiIhyBoaWRlTG9hZGluZyDlv4XpoIjphY3lsI3kvb/nlKgiLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IuWPlua2iCIsInVuaS5zaG93TW9kYWwuY29uZmlybSI6IueiuuWumiIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IuW+nuebuOWGiumBuOaThyIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IuaLjeaUnSIsInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSI6IuW+nuebuOWGiumBuOaThyIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IuaLjeaUnSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoi5paH5Lu26YG45pOH5Zmo5bCN6Kmx5qGG5Y+q6IO95Zyo55Sx55So5oi25r+A5rS75pmC6aGv56S6IiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiLlj5bmtogiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoi5L+d5a2Y5ZyW5YOPIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiOiLkv53lrZjlnJblg4/liLDnm7jlhormiJDlip8iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCI6IuS/neWtmOWcluWDj+WIsOebuOWGiuWkseaVlyIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiLlhaflrrnlt7LlvqnliLYiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiLmjoPnorwiLCJ1bmkuc2NhbkNvZGUuYWxidW0iOiLnm7jlhooiLCJ1bmkuc2NhbkNvZGUuZmFpbCI6IuitmOWIpeWkseaVlyIsInVuaS5zY2FuQ29kZS5mbGFzaC5vbiI6Iui8leinuOeFp+S6riIsInVuaS5zY2FuQ29kZS5mbGFzaC5vZmYiOiLovJXop7jpl5zplokiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50Ijoi5oyH57SL6K2Y5Yil5LitLi4uIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6IueEoeazleitmOWIpSIsInVuaS5waWNrZXIuZG9uZSI6IuWujOaIkCIsInVuaS5waWNrZXIuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnZpZGVvLmRhbm11Ijoi5b2I5bmVIiwidW5pLnZpZGVvLnZvbHVtZSI6Iumfs+mHjyIsInVuaS5idXR0b24uZmVlZGJhY2sudGl0bGUiOiLllY/poYzlj43ppYsiLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnNlbmQiOiLnmbzpgIEiLCJ1bmkuY2hvb3NlTG9jYXRpb24uc2VhcmNoIjoi5pCc57Si5Zyw6bueIiwidW5pLmNob29zZUxvY2F0aW9uLmNhbmNlbCI6IuWPlua2iCJ9LGUpKSxldD0ib2JqZWN0Ij09dHlwZW9mIGlnP2lnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRMYW5ndWFnZSgpOiIiLGZ1bmN0aW9uKCl7aWYoZHQoKSl7dmFyIGU9T2JqZWN0LmtleXMoZGcubG9jYWxlcyk7ZS5sZW5ndGgmJmUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1pdFtlXSxuPWRnLmxvY2FsZXNbZV07dD9PYmplY3QuYXNzaWduKHQsbik6aXRbZV09bn0pfX0oKTt2YXIgb3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk7dm9pZCAwPT09dCYmKHQ9e30pLCJzdHJpbmciIT10eXBlb2YgZSYmKGU9KGk9W3QsZV0pWzBdLHQ9aVsxXSksInN0cmluZyIhPXR5cGVvZiBlJiYoZT12b2lkIDAhPT1wZyYmcGcuZ2V0TG9jYWxlP3BnLmdldExvY2FsZSgpOnZvaWQgMCE9PWdsb2JhbCYmZ2xvYmFsLmdldExvY2FsZT9nbG9iYWwuZ2V0TG9jYWxlKCk6R2UpLCJzdHJpbmciIT10eXBlb2YgbiYmKG49dm9pZCAwIT09ZGcmJmRnLmZhbGxiYWNrTG9jYWxlfHxHZSk7dmFyIGE9bmV3IFplKHtsb2NhbGU6ZSxmYWxsYmFja0xvY2FsZTpuLG1lc3NhZ2VzOnQsd2F0Y2hlcjpyfSkscz1mdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBoZylzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEudChlLHQpfTtlbHNle3ZhciBvPSExO3M9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9aGcoKS4kdm07cmV0dXJuIGkmJihpLiRsb2NhbGUsb3x8KG89ITAscj1hLChuPWkpLiR3YXRjaExvY2FsZT9uLiR3YXRjaExvY2FsZShmdW5jdGlvbihlKXtyLnNldExvY2FsZShlKX0pOm4uJHdhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uJGxvY2FsZX0sZnVuY3Rpb24oZSl7ci5zZXRMb2NhbGUoZSl9KSkpLGEudChlLHQpfX1yZXR1cm4gcyhlLHQpfTtyZXR1cm57aTE4bjphLGY6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBhLmYoZSx0LG4pfSx0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHMoZSx0KX0sYWRkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ITApLGEuYWRkKGUsdCxuKX0sd2F0Y2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGEud2F0Y2hMb2NhbGUoZSl9LGdldExvY2FsZTpmdW5jdGlvbigpe3JldHVybiBhLmdldExvY2FsZSgpfSxzZXRMb2NhbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGEuc2V0TG9jYWxlKGUpfX19KGV0LGl0KSxhdD1vdC50LHN0PShvdC5taXhpbj17YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PW90LmkxOG4ud2F0Y2hMb2NhbGUoZnVuY3Rpb24oKXtlLiRmb3JjZVVwZGF0ZSgpfSk7dGhpcy4kb25jZSgiaG9vazpiZWZvcmVEZXN0cm95IixmdW5jdGlvbigpe3QoKX0pfSxtZXRob2RzOnskJHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXQoZSx0KX19fSxvdC5nZXRMb2NhbGUpO3ZhciBjdD1bIiUiLCIlIl07ZnVuY3Rpb24gdXQoZSl7cmV0dXJuIFFlKGUsY3QpP290LmYoZSwodD1wZy5nZXRMb2NhbGUoKSwobj1kZy5sb2NhbGVzKVt0XXx8bltkZy5mYWxsYmFja0xvY2FsZV18fG5bcnRdfHx7fSksY3QpOmU7dmFyIHQsbn1mdW5jdGlvbiBsdCh0LGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gdChlLG4pe3ZhciByPWZ1bmN0aW9uIGUodCxuKXtpZigxIT09bi5sZW5ndGgpe3ZhciByPW4uc2hpZnQoKTtyZXR1cm4gZSh0JiZ0W3JdLG4pfWlmKHQpe3ZhciBpPWZ1bmN0aW9uKGUpe3JldHVybiB1KGUpJiZRZShlLGN0KX0sbz1uWzBdLGE9W107aWYoQXJyYXkuaXNBcnJheSh0KSYmKGE9dC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZVtvXSl9KSkubGVuZ3RoKXJldHVybiBhO3ZhciBzPXRbb107aWYoaShzKSlyZXR1cm4gdH19KGUsbik7aWYoIXIpcmV0dXJuITE7dmFyIGk9bltuLmxlbmd0aC0xXTtpZihBcnJheS5pc0FycmF5KHIpKXIuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdChlLFtpXSl9KTtlbHNle3ZhciBvPXJbaV07T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsaSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHV0KG8pfSxzZXQ6ZnVuY3Rpb24oZSl7bz1lfX0pfXJldHVybiEwfSh0LGUpfSl9ZnVuY3Rpb24gZHQoKXtyZXR1cm4gdm9pZCAwIT09ZGcmJmRnLmxvY2FsZXMmJiEhT2JqZWN0LmtleXMoZGcubG9jYWxlcykubGVuZ3RofXZhciBmdD17ZGF0YTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHNob3dUb2FzdDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LGJlZm9yZVN1Y2Nlc3M6ZnVuY3Rpb24oZSx0KXtpZih0LnNob3dUb2FzdCl7dmFyIG49YXQoInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiKTtuJiZwZy5zaG93VG9hc3Qoe3RpdGxlOm4saWNvbjoic3VjY2VzcyIsbWFzazohMSxzdHlsZTp7d2lkdGg6dm9pZCAwfX0pfX19LHB0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldENsaXBib2FyZERhdGE6ZnR9KTtmdW5jdGlvbiBodChlLHQpe2lmKHQpe2lmKDA9PT10LmluZGV4T2YoIi8iKSlyZXR1cm4gdH1lbHNle2lmKDA9PT0odD1lKS5pbmRleE9mKCIvIikpcmV0dXJuIHQ7dmFyIG49dmcoKTtlPW4ubGVuZ3RoP25bbi5sZW5ndGgtMV0uJHBhZ2Uucm91dGU6IiJ9aWYoMD09PXQuaW5kZXhPZigiLi8iKSlyZXR1cm4gaHQoZSx0LnN1YnN0cigyKSk7Zm9yKHZhciByPXQuc3BsaXQoIi8iKSxpPXIubGVuZ3RoLG89MDtvPGkmJiIuLiI9PT1yW29dO28rKyk7ci5zcGxpY2UoMCxvKSx0PXIuam9pbigiLyIpO3ZhciBhPTA8ZS5sZW5ndGg/ZS5zcGxpdCgiLyIpOltdO3JldHVybiBhLnNwbGljZShhLmxlbmd0aC1vLTEsbysxKSwiLyIrYS5jb25jYXQocikuam9pbigiLyIpfXZhciB2dCxndD0vXihbYS16LV0rOik/XC9cLy9pLG10PS9eZGF0YTouKiwuKi87ZnVuY3Rpb24geXQoZSl7cmV0dXJuIG9nLmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSkucmVwbGFjZSgvXlwvP2FwcHNcLy8sIi9hbmRyb2lkX2Fzc2V0L2FwcHMvIikucmVwbGFjZSgvXC8kLywiIil9ZnVuY3Rpb24gX3QoZSl7cmV0dXJuIHZ0fHwodnQ9ImZpbGU6Ly8iK3l0KCJfd3d3IikrIi8iKSx2dCtlfWZ1bmN0aW9uIGJ0KGUpe2lmKDA9PT1lLmluZGV4T2YoIi8iKSlyZXR1cm4gMD09PWUuaW5kZXhPZigiLy8iKT8iaHR0cHM6IitlOmUuc3RhcnRzV2l0aCgiL3N0b3JhZ2UvIil8fGUuc3RhcnRzV2l0aCgiL3NkY2FyZC8iKXx8ZS5pbmNsdWRlcygiL0NvbnRhaW5lcnMvRGF0YS9BcHBsaWNhdGlvbi8iKT8iZmlsZTovLyIrZTpfdChlLnN1YnN0cigxKSk7aWYoZ3QudGVzdChlKXx8bXQudGVzdChlKXx8MD09PWUuaW5kZXhPZigiYmxvYjoiKSlyZXR1cm4gZTtpZigwPT09ZS5pbmRleE9mKCJfd3d3Iil8fDA9PT1lLmluZGV4T2YoIl9kbyIpKXJldHVybiJmaWxlOi8vIit5dChlKTt2YXIgdD12ZygpO3JldHVybiB0Lmxlbmd0aD9fdChodCh0W3QubGVuZ3RoLTFdLiRwYWdlLnJvdXRlLGUpLnN1YnN0cigxKSk6ZX12YXIgd3Q9e3RlbXBGaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC50ZW1wRmlsZVBhdGg9YnQoZSl9fX0sa3Q9WyJtZDUiLCJzaGExIl0sU3Q9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZpbGVQYXRoPWJ0KGUpfX0sZGlnZXN0QWxnb3JpdGhtOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRpZ2VzdEFsZ29yaXRobT1rdC5pbmNsdWRlcyhlKT9lOmt0WzBdfSxkZWZhdWx0Omt0WzBdfX0seHQ9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZpbGVQYXRoPWJ0KGUpfX19LEN0PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1idChlKX19fSxUdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzYXZlRmlsZTp3dCxnZXRGaWxlSW5mbzpTdCxnZXRTYXZlZEZpbGVJbmZvOnh0LHJlbW92ZVNhdmVkRmlsZTpDdH0pLE90PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGZpbGVUeXBlOnt0eXBlOlN0cmluZ319LEV0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Eb2N1bWVudDpPdH0pLEl0PXtrZXl3b3JkOnt0eXBlOlN0cmluZ319LEF0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNob29zZUxvY2F0aW9uOkl0fSksJHQ9WyJ3Z3M4NCIsImdjajAyIl0sUHQ9e3R5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLHQudHlwZT0kdC5pbmRleE9mKGUpPDA/JHRbMF06ZX19LGFsdGl0dWRlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LE10PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldExvY2F0aW9uOlB0fSksanQ9e2xhdGl0dWRlOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMH0sbG9uZ2l0dWRlOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMH0sc2NhbGU6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9TWF0aC5mbG9vcihlKSx0LnNjYWxlPTU8PWUmJmU8PTE4P2U6MTh9LGRlZmF1bHQ6MTh9LG5hbWU6e3R5cGU6U3RyaW5nfSxhZGRyZXNzOnt0eXBlOlN0cmluZ319LEx0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Mb2NhdGlvbjpqdH0pLEJ0PVsiYWxsIiwiaW1hZ2UiLCJ2aWRlbyJdLE50PVsiYWxidW0iLCJjYW1lcmEiXSxEdD17Y291bnQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiExLGRlZmF1bHQ6MTAwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U8PTAmJih0LmNvdW50PTEwMCl9fSxzb3VyY2VUeXBlOnt0eXBlOkFycmF5LHJlcXVpcmVkOiExLGRlZmF1bHQ6TnQsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gTnQuaW5jbHVkZXMoZSl9KSx0LnNvdXJjZVR5cGU9ZS5sZW5ndGg/ZTpOdH19LHR5cGU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6ImFsbCIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7QnQuaW5jbHVkZXMoZSl8fCh0LnR5cGU9QnRbMF0pLHQudHlwZT0iYWxsIj09PXQudHlwZT90LnR5cGU9IioiOnQudHlwZX19LGV4dGVuc2lvbjp7dHlwZTpBcnJheSxkZWZhdWx0OlsiIl0sdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoMD09PWUubGVuZ3RoKXJldHVybiJwYXJhbSBleHRlbnNpb24gc2hvdWxkIG5vdCBiZSBlbXB0eS4ifX19LFJ0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNob29zZUZpbGU6RHR9KSxGdD1bIm9yaWdpbmFsIiwiY29tcHJlc3NlZCJdLFV0PVsiYWxidW0iLCJjYW1lcmEiXSx6dD17Y291bnQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiExLGRlZmF1bHQ6OSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPD0wJiYodC5jb3VudD05KX19LHNpemVUeXBlOnt0eXBlOltBcnJheSxTdHJpbmddLHJlcXVpcmVkOiExLGRlZmF1bHQ6RnQsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZT0ic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gRnQuaW5jbHVkZXMoZSl9KSx0LnNpemVUeXBlPWUubGVuZ3RoP2U6RnR9fSxzb3VyY2VUeXBlOnt0eXBlOkFycmF5LHJlcXVpcmVkOiExLGRlZmF1bHQ6VXQsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gVXQuaW5jbHVkZXMoZSl9KSx0LnNvdXJjZVR5cGU9ZS5sZW5ndGg/ZTpVdH19LGV4dGVuc2lvbjp7dHlwZTpBcnJheSxkZWZhdWx0OlsiKiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxWdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VJbWFnZTp6dH0pLHF0PVsiYWxidW0iLCJjYW1lcmEiXSxXdD17c291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0OnF0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHF0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6cXR9fSxjb21wcmVzc2VkOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH0sbWF4RHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NjB9LGNhbWVyYTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiYmFjayJ9LGV4dGVuc2lvbjp7dHlwZTpBcnJheSxkZWZhdWx0OlsiKiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxIdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VWaWRlbzpXdH0pLEd0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPWJ0KGUpfX19LFh0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbXByZXNzSW1hZ2U6R3R9KSxKdD17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnNyYz1idChlKX19LHF1YWxpdHk6e3R5cGU6U3RyaW5nfSxiaXRyYXRlOnt0eXBlOk51bWJlcn0sZnBzOnt0eXBlOk51bWJlcn0scmVzb2x1dGlvbjp7dHlwZTpOdW1iZXJ9fSxZdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb21wcmVzc1ZpZGVvOkp0fSksS3Q9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9YnQoZSl9fX0sWnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0SW1hZ2VJbmZvOkt0fSksUXQ9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9YnQoZSl9fX0sZW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0VmlkZW9JbmZvOlF0fSksdG49e3VybHM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG47aWYodC51cmxzPWUubWFwKGZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gYnQoZSk7bj0hMH0pLG4pcmV0dXJuInVybCBpcyBub3Qgc3RyaW5nIn19LGN1cnJlbnQ6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpeyJudW1iZXIiPT10eXBlb2YgZT90LmN1cnJlbnQ9MDxlJiZlPHQudXJscy5sZW5ndGg/ZTowOiJzdHJpbmciPT10eXBlb2YgZSYmZSYmKHQuY3VycmVudD1idChlKSl9LGRlZmF1bHQ6MH19LG5uPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHByZXZpZXdJbWFnZTp0bn0pLHJuPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1idChlKX19fSxvbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtOnJufSksYW49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGhlYWRlcjp7dHlwZTpPYmplY3QsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5oZWFkZXI9ZXx8e319fX0sc249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZG93bmxvYWRGaWxlOmFufSksY249e09QVElPTlM6Ik9QVElPTlMiLEdFVDoiR0VUIixIRUFEOiJIRUFEIixQT1NUOiJQT1NUIixQVVQ6IlBVVCIsREVMRVRFOiJERUxFVEUiLFRSQUNFOiJUUkFDRSIsQ09OTkVDVDoiQ09OTkVDVCIsUEFUQ0g6IlBBVENIIn0sdW49Impzb24iLGxuPXtURVhUOiJ0ZXh0IixBUlJBWUJVRkZFUjoiYXJyYXlidWZmZXIifSxkbj1lbmNvZGVVUklDb21wb25lbnQ7dmFyIGZuLHBuPXttZXRob2Q6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpLHQubWV0aG9kPU9iamVjdC52YWx1ZXMoY24pLmluZGV4T2YoZSk8MD9jbi5HRVQ6ZX19LGRhdGE6e3R5cGU6W09iamVjdCxTdHJpbmcsQXJyYXksQXJyYXlCdWZmZXJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZGF0YT1lfHwiIn19LHVybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5tZXRob2Q9PT1jbi5HRVQmJlQodC5kYXRhKSYmT2JqZWN0LmtleXModC5kYXRhKS5sZW5ndGgmJih0LnVybD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuc3BsaXQoIiMiKSxyPW5bMV18fCIiLGk9KG49blswXS5zcGxpdCgiPyIpKVsxXXx8IiI7ZT1uWzBdO3ZhciBvPWkuc3BsaXQoIiYiKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KTtmb3IodmFyIGEgaW4gaT17fSxvLmZvckVhY2goZnVuY3Rpb24oZSl7ZT1lLnNwbGl0KCI9IiksaVtlWzBdXT1lWzFdfSksdClpZihrKHQsYSkpe3ZhciBzPXRbYV07bnVsbD09cz9zPSIiOlQocykmJihzPUpTT04uc3RyaW5naWZ5KHMpKSxpW2RuKGEpXT1kbihzKX1yZXR1cm4gZSsoKGk9T2JqZWN0LmtleXMoaSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlKyI9IitpW2VdfSkuam9pbigiJiIpKT8iPyIraToiIikrKHI/IiMiK3I6IiIpfShlLHQuZGF0YSkpfX0saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmhlYWRlcj1lfHx7fTt0Lm1ldGhvZCE9PWNuLkdFVCYmKE9iamVjdC5rZXlzKG4pLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuImNvbnRlbnQtdHlwZSI9PT1lLnRvTG93ZXJDYXNlKCl9KXx8KG5bIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIikpfX0sZGF0YVR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZGF0YVR5cGU9KGV8fHVuKS50b0xvd2VyQ2FzZSgpfX0scmVzcG9uc2VUeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9Mb3dlckNhc2UoKSx0LnJlc3BvbnNlVHlwZT1PYmplY3QudmFsdWVzKGxuKS5pbmRleE9mKGUpPDA/bG4uVEVYVDplfX0sd2l0aENyZWRlbnRpYWxzOnt0eXBlOkJvb2xlYW59LHRpbWVvdXQ6e3R5cGU6TnVtYmVyfX0saG49e2NlcnRpZmljYXRlczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7aWYoZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiJTdHJpbmciIT09cChlLmhvc3QpfSkpcmV0dXJuIuWPguaVsOmFjee9rumUmeivr++8jOivt+ehruiupOWQjumHjeivlSJ9fX0sdm49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscmVxdWVzdDpwbixjb25maWdNVExTOmhufSksZ249e09QVElPTlM6Ik9QVElPTlMiLEdFVDoiR0VUIixIRUFEOiJIRUFEIixQT1NUOiJQT1NUIixQVVQ6IlBVVCIsREVMRVRFOiJERUxFVEUiLFRSQUNFOiJUUkFDRSIsQ09OTkVDVDoiQ09OTkVDVCJ9LG1uPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX0sbWV0aG9kOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKSx0Lm1ldGhvZD1PYmplY3QudmFsdWVzKGduKS5pbmRleE9mKGUpPDA/Z24uR0VUOmV9fSxwcm90b2NvbHM6e3R5cGU6W0FycmF5LFN0cmluZ10sdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pLHQucHJvdG9jb2xzPShlfHxbXSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0pfX19LHluPXtkYXRhOnt0eXBlOltTdHJpbmcsQXJyYXlCdWZmZXJdfX0sX249e2NvZGU6e3R5cGU6TnVtYmVyfSxyZWFzb246e3R5cGU6U3RyaW5nfX0sYm49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY29ubmVjdFNvY2tldDptbixzZW5kU29ja2V0TWVzc2FnZTp5bixjbG9zZVNvY2tldDpfbn0pLHduPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlczp7dHlwZTpBcnJheX0sZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJih0LmZpbGVQYXRoPWJ0KGUpKX19LG5hbWU6e3R5cGU6U3RyaW5nfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX0sZm9ybURhdGE6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZm9ybURhdGE9ZXx8e319fX0sa249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXBsb2FkRmlsZTp3bn0pLFNuPXtPQVVUSDoiT0FVVEgiLFNIQVJFOiJTSEFSRSIsUEFZTUVOVDoiUEFZTUVOVCIsUFVTSDoiUFVTSCJ9LHhuPXtzZXJ2aWNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigoZT0oZXx8IiIpLnRvVXBwZXJDYXNlKCkpJiZPYmplY3QudmFsdWVzKFNuKS5pbmRleE9mKGUpPDApcmV0dXJuInNlcnZpY2UgZXJyb3IifX19LENuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFByb3ZpZGVyOnhufSksVG49e3Jvb3Q6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbih0LGUpe3ZhciBuPWRnLnN1YlBhY2thZ2VzO3JldHVybiBBcnJheS5pc0FycmF5KG4pJiYwIT09bi5sZW5ndGg/bi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJvb3Q9PT10fSk/dm9pZCAwOiJyb290IGAiK3QrImAgaXMgbm90IGZvdW5kIjoibm8gc3ViUGFja2FnZXMifX19LE9uPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGxvYWRTdWJQYWNrYWdlOlRufSksRW49e1VOSVZFUklGWToidW5pdmVyaWZ5In0sSW49e3Byb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCxkZWZhdWx0OkVuLlVOSVZFUklGWSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZihPYmplY3QudmFsdWVzKEVuKS5pbmRleE9mKGUpPDApcmV0dXJuInByb3ZpZGVyIGVycm9yIn19fSxBbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwcmVMb2dpbjpJbn0pO2Z1bmN0aW9uICRuKGEpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciByPShlPWh0KGUpKS5zcGxpdCgiPyIpWzBdLG49ZmcuZmluZChmdW5jdGlvbihlKXt2YXIgdD1lLnBhdGgsbj1lLmFsaWFzO3JldHVybiB0PT09cnx8bj09PXJ9KTtpZighbilyZXR1cm4icGFnZSBgIitlKyJgIGlzIG5vdCBmb3VuZCI7aWYoIm5hdmlnYXRlVG8iPT09YXx8InJlZGlyZWN0VG8iPT09YSl7aWYobi5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90ICIrYSsiIGEgdGFiYmFyIHBhZ2UifWVsc2UgaWYoInN3aXRjaFRhYiI9PT1hJiYhbi5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90IHN3aXRjaCB0byBuby10YWJCYXIgcGFnZSI7aWYoInN3aXRjaFRhYiIhPT1hJiYicHJlbG9hZFBhZ2UiIT09YXx8IW4ubWV0YS5pc1RhYkJhcnx8ImFwcExhdW5jaCI9PT10Lm9wZW5UeXBlfHwoZT1yKSxuLm1ldGEuaXNFbnRyeSYmKGU9ZS5yZXBsYWNlKG4uYWxpYXMsIi8iKSksdC51cmw9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO3ZhciB0PWUuaW5kZXhPZigiPyIpO2lmKC0xPT09dClyZXR1cm4gZTt2YXIgbj1lLnN1YnN0cih0KzEpLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKTtpZighbilyZXR1cm4gZTtlPWUuc3Vic3RyKDAsdCk7dmFyIGk9W107cmV0dXJuIG4uc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj10LnNoaWZ0KCkscj0wPHQubGVuZ3RoP3Quam9pbigiPSIpOiIiO2kucHVzaChuKyI9IitlbmNvZGVVUklDb21wb25lbnQocikpfSksaS5sZW5ndGg/ZSsiPyIraS5qb2luKCImIik6ZX0oZSksInVuUHJlbG9hZFBhZ2UiIT09YSlpZigicHJlbG9hZFBhZ2UiIT09YSl7aWYoZm49PT1lJiYiYXBwTGF1bmNoIiE9PXQub3BlblR5cGUpcmV0dXJuIGZuKyIgbG9ja2VkIjtkZy5yZWFkeSYmITEhPT1kZy5lbmFibGVOYXZpZ2F0b3JMb2NrJiYoZm49ZSl9ZWxzZXtpZighbi5tZXRhLmlzTlZ1ZSlyZXR1cm4iY2FuIG5vdCBwcmVsb2FkIHZ1ZSBwYWdlIjtpZihuLm1ldGEuaXNUYWJCYXIpe3ZhciBpPXZnKCEwKSxvPShuLmFsaWFzfHxuLnBhdGgpLnN1YnN0cigxKTtpZihpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucm91dGU9PT1vfSkpcmV0dXJuInRhYkJhciBwYWdlIGAiK28rImAgYWxyZWFkeSBleGlzdHMifX19fWZ1bmN0aW9uIFBuKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxPYmplY3QuYXNzaWduKHt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjokbihlKX0sYmVmb3JlQWxsOmZ1bmN0aW9uKCl7Zm49IiJ9fSx0KX1mdW5jdGlvbiBNbih0KXtyZXR1cm57YW5pbWF0aW9uVHlwZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKGUmJi0xPT09dC5pbmRleE9mKGUpKXJldHVybiJgIitlKyJgIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGBhbmltYXRpb25UeXBlYCAoc3VwcG9ydGVkIHZhbHVlcyBhcmU6IGAiK3Quam9pbigiYHxgIikrImApIn19LGFuaW1hdGlvbkR1cmF0aW9uOnt0eXBlOk51bWJlcn19fXZhciBqbixMbixCbj1QbigicmVkaXJlY3RUbyIpLE5uPVBuKCJyZUxhdW5jaCIpLERuPVBuKCJuYXZpZ2F0ZVRvIixNbihbInNsaWRlLWluLXJpZ2h0Iiwic2xpZGUtaW4tbGVmdCIsInNsaWRlLWluLXRvcCIsInNsaWRlLWluLWJvdHRvbSIsImZhZGUtaW4iLCJ6b29tLW91dCIsInpvb20tZmFkZS1vdXQiLCJwb3AtaW4iLCJub25lIl0pKSxSbj1Qbigic3dpdGNoVGFiIiksRm49T2JqZWN0LmFzc2lnbih7ZGVsdGE6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9cGFyc2VJbnQoZSl8fDEsdC5kZWx0YT1NYXRoLm1pbih2ZygpLmxlbmd0aC0xLGUpfX19LE1uKFsic2xpZGUtb3V0LXJpZ2h0Iiwic2xpZGUtb3V0LWxlZnQiLCJzbGlkZS1vdXQtdG9wIiwic2xpZGUtb3V0LWJvdHRvbSIsImZhZGUtb3V0Iiwiem9vbS1pbiIsInpvb20tZmFkZS1pbiIsInBvcC1vdXQiLCJub25lIl0pKSxVbj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6JG4oInByZWxvYWRQYWdlIil9fSx6bj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6JG4oInVuUHJlbG9hZFBhZ2UiKX19LFZuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlZGlyZWN0VG86Qm4scmVMYXVuY2g6Tm4sbmF2aWdhdGVUbzpEbixzd2l0Y2hUYWI6Um4sbmF2aWdhdGVCYWNrOkZuLHByZWxvYWRQYWdlOlVuLHVuUHJlbG9hZFBhZ2U6em59KSxxbj17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFduPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLEhuPXtrZXk6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxkYXRhOntyZXF1aXJlZDohMH19LEduPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImRhdGEiLHJlcXVpcmVkOiEwfV0sWG49cW4sSm49V24sWW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0U3RvcmFnZTpxbixnZXRTdG9yYWdlU3luYzpXbixzZXRTdG9yYWdlOkhuLHNldFN0b3JhZ2VTeW5jOkduLHJlbW92ZVN0b3JhZ2U6WG4scmVtb3ZlU3RvcmFnZVN5bmM6Sm59KSxLbj17ZmFtaWx5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc291cmNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzYzp7dHlwZTpPYmplY3QscmVxdWlyZWQ6ITF9LHN1Y2Nlc3M6e3R5cGU6RnVuY3Rpb24scmVxdWlyZWQ6ITF9LGZhaWw6e3R5cGU6RnVuY3Rpb24scmVxdWlyZWQ6ITF9LGNvbXBsZXRlOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfX0sWm49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbG9hZEZvbnRGYWNlOktufSksUW49WyIjZmZmZmZmIiwiIzAwMDAwMCJdLGVyPXtmcm9udENvbG9yOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigtMT09PVFuLmluZGV4T2YoZSkpcmV0dXJuJ2ludmFsaWQgZnJvbnRDb2xvciAiJytlKyciJ319LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGFuaW1hdGlvbjp7dHlwZTpPYmplY3QsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybntkdXJhdGlvbjowLHRpbWluZ0Z1bmM6ImxpbmVhciJ9fSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSksdC5hbmltYXRpb249e2R1cmF0aW9uOmUuZHVyYXRpb258fDAsdGltaW5nRnVuYzplLnRpbWluZ0Z1bmN8fCJsaW5lYXIifX19fSx0cj17dGl0bGU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sbnI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2V0TmF2aWdhdGlvbkJhckNvbG9yOmVyLHNldE5hdmlnYXRpb25CYXJUaXRsZTp0cn0pLHJyPXtzY3JvbGxUb3A6e3R5cGU6TnVtYmVyfSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDozMDAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5kdXJhdGlvbj1NYXRoLm1heCgwLGUpfX19LGlyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHBhZ2VTY3JvbGxUbzpycn0pLG9yPXt0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY29udGVudDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc2hvd0NhbmNlbDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LGNhbmNlbFRleHQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm4gYXQoInVuaS5zaG93TW9kYWwuY2FuY2VsIil9fSxjYW5jZWxDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMCJ9LGNvbmZpcm1UZXh0Ont0eXBlOlN0cmluZyxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuIGF0KCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iKX19LGNvbmZpcm1Db2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfX0sYXI9e3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpY29uOntkZWZhdWx0OiJzdWNjZXNzIix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXstMT09PVsic3VjY2VzcyIsImxvYWRpbmciLCJlcnJvciIsIm5vbmUiXS5pbmRleE9mKGUpJiYodC5pY29uPSJzdWNjZXNzIil9fSxpbWFnZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlJiYodC5pbWFnZT1idChlKSl9fSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxNTAwfSxtYXNrOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSxzcj17dGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGljb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImxvYWRpbmcifSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxZTh9LG1hc2s6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSx2aXNpYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH19LGNyPXtpdGVtTGlzdDp7dHlwZTpBcnJheSxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZighZS5sZW5ndGgpcmV0dXJuInBhcmFtZXRlci5pdGVtTGlzdCBzaG91bGQgaGF2ZSBhdCBsZWFzdCAxIGl0ZW0ifX0saXRlbUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDAwIn0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LHBvcG92ZXI6e3R5cGU6T2JqZWN0fX0sdXI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2hvd01vZGFsOm9yLHNob3dUb2FzdDphcixzaG93TG9hZGluZzpzcixzaG93QWN0aW9uU2hlZXQ6Y3J9KSxscj17dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LGRyPXtpbmRleDpscix0ZXh0Ont0eXBlOlN0cmluZ30saWNvblBhdGg6e3R5cGU6U3RyaW5nfSxzZWxlY3RlZEljb25QYXRoOnt0eXBlOlN0cmluZ30scGFnZVBhdGg6e3R5cGU6U3RyaW5nfX0sZnI9e2NvbG9yOnt0eXBlOlN0cmluZ30sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmd9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmd9LGJhY2tncm91bmRJbWFnZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmIS9eKGxpbmVhcnxyYWRpYWwpLWdyYWRpZW50XCguKz9cKTs/JC8udGVzdChlKSYmKHQuYmFja2dyb3VuZEltYWdlPWJ0KGUpKX19LGJhY2tncm91bmRSZXBlYXQ6e3R5cGU6U3RyaW5nfSxib3JkZXJTdHlsZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmKHQuYm9yZGVyU3R5bGU9ImJsYWNrIj09PWU/ImJsYWNrIjoid2hpdGUiKX19fSxwcj17YW5pbWF0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LGhyPXthbmltYXRpb246e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sdnI9e2luZGV4OmxyfSxncj17aW5kZXg6bHJ9LG1yPXtpbmRleDpscn0seXI9e2luZGV4OmxyLHRleHQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3ZhciBuO3ZvaWQgMD09PShuPWUpJiYobj0iIiksNDw9KCIiK24pLnJlcGxhY2UoL1teXHgwMC1ceGZmXS9nLCIqKiIpLmxlbmd0aCYmKHQudGV4dD0iLi4uIil9fX0sX3I9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2V0VGFiQmFySXRlbTpkcixzZXRUYWJCYXJTdHlsZTpmcixoaWRlVGFiQmFyOnByLHNob3dUYWJCYXI6aHIsaGlkZVRhYkJhclJlZERvdDp2cixzaG93VGFiQmFyUmVkRG90OmdyLHJlbW92ZVRhYkJhckJhZGdlOm1yLHNldFRhYkJhckJhZGdlOnlyfSksYnI9T2JqZWN0LmNyZWF0ZShudWxsKSx3cj0oam49eyIuL2Jhc2UvYmFzZTY0LmpzIjp1ZSwiLi9iYXNlL2Nhbi1pLXVzZS5qcyI6ZGUsIi4vYmFzZS9ldmVudC1idXMuanMiOmdlLCIuL2Jhc2UvaW50ZXJjZXB0b3IuanMiOl9lLCIuL2Jhc2UvdXB4MnB4LmpzIjp3ZSwiLi9jb250ZXh0L2NhbnZhcy5qcyI6RWUsIi4vY29udGV4dC9jb250ZXh0LmpzIjpqZSwiLi9kZXZpY2UvYWRkLXBob25lLWNvbnRhY3QuanMiOkJlLCIuL2RldmljZS9tYWtlLXBob25lLWNhbGwuanMiOkRlLCIuL2RldmljZS9zY2FuLWNvZGUuanMiOkZlLCIuL2RldmljZS9zZXQtY2xpcGJvYXJkLWRhdGEuanMiOnB0LCIuL2ZpbGUvZmlsZS5qcyI6VHQsIi4vZmlsZS9vcGVuLWRvY3VtZW50LmpzIjpFdCwiLi9sb2NhdGlvbi9jaG9vc2UtbG9jYXRpb24uanMiOkF0LCIuL2xvY2F0aW9uL2dldC1sb2NhdGlvbi5qcyI6TXQsIi4vbG9jYXRpb24vb3Blbi1sb2NhdGlvbi5qcyI6THQsIi4vbWVkaWEvY2hvb3NlLWZpbGUuanMiOlJ0LCIuL21lZGlhL2Nob29zZS1pbWFnZS5qcyI6VnQsIi4vbWVkaWEvY2hvb3NlLXZpZGVvLmpzIjpIdCwiLi9tZWRpYS9jb21wcmVzcy1pbWFnZS5qcyI6WHQsIi4vbWVkaWEvY29tcHJlc3MtdmlkZW8uanMiOll0LCIuL21lZGlhL2dldC1pbWFnZS1pbmZvLmpzIjpadCwiLi9tZWRpYS9nZXQtdmlkZW8taW5mby5qcyI6ZW4sIi4vbWVkaWEvcHJldmlldy1pbWFnZS5qcyI6bm4sIi4vbWVkaWEvc2F2ZS1pbWFnZS10by1waG90b3MtYWxidW0uanMiOm9uLCIuL25ldHdvcmsvZG93bmxvYWQtZmlsZS5qcyI6c24sIi4vbmV0d29yay9yZXF1ZXN0LmpzIjp2biwiLi9uZXR3b3JrL3NvY2tldC5qcyI6Ym4sIi4vbmV0d29yay91cGxvYWQtZmlsZS5qcyI6a24sIi4vcGx1Z2luL2dldC1wcm92aWRlci5qcyI6Q24sIi4vcGx1Z2luL2xvYWQtc3ViLXBhY2thZ2UuanMiOk9uLCIuL3BsdWdpbi9wcmUtbG9naW4uanMiOkFuLCIuL3JvdXRlL3JvdXRlLmpzIjpWbiwiLi9zdG9yYWdlL3N0b3JhZ2UuanMiOlluLCIuL3VpL2xvYWQtZm9udC1mYWNlLmpzIjpabiwiLi91aS9uYXZpZ2F0aW9uLWJhci5qcyI6bnIsIi4vdWkvcGFnZS1zY3JvbGwtdG8uanMiOmlyLCIuL3VpL3BvcHVwLmpzIjp1ciwiLi91aS90YWItYmFyLmpzIjpfcn0sKExuPWZ1bmN0aW9uKGUpe3JldHVybiBqbltlXXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitlKyInLiIpfSgpfSkua2V5cz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyhqbil9LExuKTtmdW5jdGlvbiBrcihlLHQsbil7dmFyIHI9dFtlXSxpPSFrKG4sZSksbz1uW2VdO2lmKC0xPGZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIFRyKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoVHIodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX0oQm9vbGVhbixyLnR5cGUpJiZpJiYhayhyLCJkZWZhdWx0IikmJihvPSExKSx2b2lkIDA9PT1vJiZrKHIsImRlZmF1bHQiKSl7dmFyIGE9ci5kZWZhdWx0O289QyhhKT9hKCk6YSxuW2VdPW99cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoZS5yZXF1aXJlZCYmcilyZXR1cm4iTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgYCIrdCsiYCI7aWYobnVsbD09biYmIWUucmVxdWlyZWQpe3ZhciBvPWUudmFsaWRhdG9yO3JldHVybiBvP28obixpKTp2b2lkIDB9dmFyIGE9ZS50eXBlLHM9IWF8fCEwPT09YSxjPVtdO2lmKGEpe0FycmF5LmlzQXJyYXkoYSl8fChhPVthXSk7Zm9yKHZhciB1PTA7dTxhLmxlbmd0aCYmIXM7dSsrKXt2YXIgbD14cihuLGFbdV0pO2MucHVzaChsLmV4cGVjdGVkVHlwZXx8IiIpLHM9bC52YWxpZH19aWYoIXMpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0icGFyYW1ldGVyIGAiK2UrImAuIEV4cGVjdGVkICIrbi5qb2luKCIsICIpLGk9blswXSxvPXAodCksYT1Pcih0LGkpLHM9T3IodCxvKTsxPT09bi5sZW5ndGgmJklyKGkpJiYhZnVuY3Rpb24oKXt2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7Zm9yKDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBlLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT09ZS50b0xvd2VyQ2FzZSgpfSl9KGksbykmJihyKz0iIHdpdGggdmFsdWUgIithKTtyKz0iLCBnb3QgIitvKyIgIixJcihvKSYmKHIrPSJ3aXRoIHZhbHVlICIrcysiLiIpO3JldHVybiByfSh0LG4sYyk7dmFyIGQ9ZS52YWxpZGF0b3I7aWYoZClyZXR1cm4gZChuLGkpfShyLGUsbyxpLG4pfXdyLmtleXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5hc3NpZ24oYnIsd3IoZSkpfSk7dmFyIFNyPS9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87ZnVuY3Rpb24geHIoZSx0KXt2YXIgbixyPUNyKHQpO2lmKFNyLnRlc3Qocikpe3ZhciBpPXR5cGVvZiBlOyhuPWk9PT1yLnRvTG93ZXJDYXNlKCkpfHwib2JqZWN0IiE9PWl8fChuPWUgaW5zdGFuY2VvZiB0KX1lbHNlIG49MDw9ZS5ieXRlTGVuZ3RofHwoIk9iamVjdCI9PT1yP1QoZSk6IkFycmF5Ij09PXI/QXJyYXkuaXNBcnJheShlKTplIGluc3RhbmNlb2YgdHx8cChlKT09PUNyKHQpKTtyZXR1cm57dmFsaWQ6bixleHBlY3RlZFR5cGU6cn19ZnVuY3Rpb24gQ3IoZSl7dmFyIHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gdD90WzFdOiIifWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIENyKGUpPT09Q3IodCl9ZnVuY3Rpb24gT3IoZSx0KXtyZXR1cm4iU3RyaW5nIj09PXQ/JyInK2UrJyInOiJOdW1iZXIiPT09dD8iIitOdW1iZXIoZSk6IiIrZX12YXIgRXI9WyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl07ZnVuY3Rpb24gSXIodCl7cmV0dXJuIEVyLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKT09PWV9KX1mdW5jdGlvbiBBcihlLHQsbil7dmFyIHI9dCsiOmZhaWwgIitlO2lmKC0xPT09bil0aHJvdyBuZXcgRXJyb3Iocik7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBuJiZOcihuLHtlcnJNc2c6cn0pLCExfXZhciAkcj1be25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sUHI9WyJiZWZvcmVWYWxpZGF0ZSIsImJlZm9yZUFsbCIsImJlZm9yZVN1Y2Nlc3MiXTtmdW5jdGlvbiBNcihlLG4sdCl7dmFyIHI9YnJbZV07aWYoIXImJmllKGUpJiYocj0kcikscil7aWYoQXJyYXkuaXNBcnJheShyKSYmQXJyYXkuaXNBcnJheShuKSl7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKSxvPU9iamVjdC5jcmVhdGUobnVsbCksYT1uLmxlbmd0aDtyLmZvckVhY2goZnVuY3Rpb24oZSx0KXtpW2UubmFtZV09ZSx0PGEmJihvW2UubmFtZV09blt0XSl9KSxyPWksbj1vfWlmKEMoci5iZWZvcmVWYWxpZGF0ZSkpe3ZhciBzPXIuYmVmb3JlVmFsaWRhdGUobik7aWYocylyZXR1cm4gQXIocyxlLHQpfWZvcih2YXIgYz1PYmplY3Qua2V5cyhyKSx1PTA7dTxjLmxlbmd0aDt1KyspaWYoLTE9PT1Qci5pbmRleE9mKGNbdV0pKXt2YXIgbD1rcihjW3VdLHIsbik7aWYobClyZXR1cm4gQXIobCxlLHQpfX1yZXR1cm4hMH12YXIganI9MSxMcj17fTtmdW5jdGlvbiBCcihlLHQsbil7dm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1mdW5jdGlvbihpLG8sZSl7aWYodm9pZCAwPT09byYmKG89e30pLHZvaWQgMD09PWUmJihlPXt9KSwhVChvKSlyZXR1cm57cGFyYW1zOm99O3ZhciB0PWFlKG89T2JqZWN0LmFzc2lnbih7fSxvKSksYT10LnN1Y2Nlc3Mscz10LmZhaWwsYz10LmNhbmNlbCx1PXQuY29tcGxldGUsbD1DKGEpLGQ9QyhzKSxmPUMoYykscD1DKHUpO2lmKCEobHx8ZHx8Znx8cCkpcmV0dXJue3BhcmFtczpvfTt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSl7dmFyIGg9ZVtyXTtDKGgpJiYobltyXT1CKGgpKX12YXIgdj1uLmJlZm9yZVN1Y2Nlc3MsZz1uLmFmdGVyU3VjY2VzcyxtPW4uYmVmb3JlRmFpbCx5PW4uYWZ0ZXJGYWlsLF89bi5iZWZvcmVDYW5jZWwsYj1uLmFmdGVyQ2FuY2VsLHc9bi5iZWZvcmVBbGwsaz1uLmFmdGVyQWxsLFM9anIrKyx4PSJhcGkuIitpKyIuIitTO3JldHVybiBMcltTXT17bmFtZTp4LGNhbGxiYWNrOmZ1bmN0aW9uKGUpe2lmKGUuZXJyTXNnPWUuZXJyTXNnfHxpKyI6b2siLC0xIT09ZS5lcnJNc2cuaW5kZXhPZigiOm9rIikpZS5lcnJNc2c9aSsiOm9rIjtlbHNlIGlmKC0xIT09ZS5lcnJNc2cuaW5kZXhPZigiOmNhbmNlbCIpKWUuZXJyTXNnPWkrIjpjYW5jZWwiO2Vsc2UgaWYoLTEhPT1lLmVyck1zZy5pbmRleE9mKCI6ZmFpbCIpKXt2YXIgdD0iIixuPWUuZXJyTXNnLmluZGV4T2YoIiAiKTstMTxuJiYodD1lLmVyck1zZy5zdWJzdHIobikpLGUuZXJyTXNnPWkrIjpmYWlsIit0fUModykmJncoZSk7dmFyIHI9ZS5lcnJNc2c7MD09PXIuaW5kZXhPZihpKyI6b2siKT8oQyh2KSYmdihlLG8pLGwmJmEoZSksQyhnKSYmZyhlKSk6MD09PXIuaW5kZXhPZihpKyI6Y2FuY2VsIik/KGUuZXJyTXNnPWUuZXJyTXNnLnJlcGxhY2UoaSsiOmNhbmNlbCIsaSsiOmZhaWwgY2FuY2VsIiksZCYmcyhlKSxDKF8pJiZfKGUpLGYmJmMoZSksQyhiKSYmYihlKSk6MD09PXIuaW5kZXhPZihpKyI6ZmFpbCIpJiYoQyhtKSYmbShlKSxkJiZzKGUpLEMoeSkmJnkoZSkpLHAmJnUoZSksQyhrKSYmayhlKX19LHtwYXJhbXM6byxjYWxsYmFja0lkOlN9fShlLHQsbiksaT1yLnBhcmFtcyxvPXIuY2FsbGJhY2tJZDtyZXR1cm4gVChpKSYmIU1yKGUsaSxvKT97cGFyYW1zOmksY2FsbGJhY2tJZDohMX06e3BhcmFtczppLGNhbGxiYWNrSWQ6b319ZnVuY3Rpb24gTnIoZSx0LG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIHI9THJbZV07aWYocilyZXR1cm4gci5rZWVwQWxpdmV8fGRlbGV0ZSBMcltlXSxyLmNhbGxiYWNrKHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gRHIodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoIkFQSSBgIit0KyJgIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKX19dmFyIFJyPVsiZ2V0UHVzaENsaWVudElkIiwib25QdXNoTWVzc2FnZSIsIm9mZlB1c2hNZXNzYWdlIl07ZnVuY3Rpb24gRnIoYyx1LGwpe3JldHVybiB2b2lkIDA9PT1sJiYobD17fSksLTE8UnIuaW5kZXhPZihjKXx8IUModSk/dTooZT1sLCh0PWJyW2NdKSYmKEModC5iZWZvcmVBbGwpJiYoZS5iZWZvcmVBbGw9dC5iZWZvcmVBbGwpLEModC5iZWZvcmVTdWNjZXNzKSYmKGUuYmVmb3JlU3VjY2Vzcz10LmJlZm9yZVN1Y2Nlc3MpKSxmdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09YXJndW1lbnRzW25dO2lmKHJlKGMpKXtpZihNcihjLHQsLTEpKXJldHVybiB1LmFwcGx5KG51bGwsdCl9ZWxzZSBpZihpZShjKSl7aWYoTXIoYyx0LC0xKSlyZXR1cm4gdSgoYy5zdGFydHNXaXRoKCJvZmYiKT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBMcil7dmFyIHI9THJbbl07aWYoci5uYW1lLnN0YXJ0c1dpdGgoImFwaS4iK2UucmVwbGFjZSgvXm9mZi8sIm9uIikpJiZyLmNhbGxiYWNrPT09dClyZXR1cm4gZGVsZXRlIExyW25dLE51bWJlcihuKX1yZXR1cm4iZmFpbCJ9OmZ1bmN0aW9uKGUsdCl7dmFyIG49anIrKyxyPSJhcGkuIitlKyIuIituO3JldHVybiBMcltuXT17bmFtZTpyLGtlZXBBbGl2ZTohMCxjYWxsYmFjazp0fSxufSkoYyx0WzBdKSl9ZWxzZXt2YXIgcj17fTt0Lmxlbmd0aCYmKHI9dFswXSk7dmFyIGksbz1CcihjLHIsbCksYT1vLnBhcmFtcyxzPW8uY2FsbGJhY2tJZDtpZighMSE9PXMpcmV0dXJuKGk9QyhhKT91KHMpOnUoYSxzKSkmJihlPWMsLTE9PT1lZS5pbmRleE9mKGUpKSYmVChpPU5yKHMsaSkpJiYoaS5lcnJNc2c9aS5lcnJNc2d8fGMrIjpvayIpLGl9fSk7dmFyIGUsdH1mdW5jdGlvbiBVcihlLHQpe3JldHVybiBlKHQ9e2V4cG9ydHM6e319LHQuZXhwb3J0cyksdC5leHBvcnRzfXZhciB6cj1VcihmdW5jdGlvbihlLHQpeyFmdW5jdGlvbigpe2Zvcih2YXIgbz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZD1uZXcgVWludDhBcnJheSgyNTYpLGU9MDtlPG8ubGVuZ3RoO2UrKylkW28uY2hhckNvZGVBdChlKV09ZTt0LmVuY29kZT1mdW5jdGlvbihlKXt2YXIgdCxuPW5ldyBVaW50OEFycmF5KGUpLHI9bi5sZW5ndGgsaT0iIjtmb3IodD0wO3Q8cjt0Kz0zKWkrPW9bblt0XT4+Ml0saSs9b1soMyZuW3RdKTw8NHxuW3QrMV0+PjRdLGkrPW9bKDE1Jm5bdCsxXSk8PDJ8blt0KzJdPj42XSxpKz1vWzYzJm5bdCsyXV07cmV0dXJuIHIlMz09Mj9pPWkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSkrIj0iOnIlMz09MSYmKGk9aS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0yKSsiPT0iKSxpfSx0LmRlY29kZT1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE9Ljc1KmUubGVuZ3RoLHM9ZS5sZW5ndGgsYz0wOyI9Ij09PWVbZS5sZW5ndGgtMV0mJihhLS0sIj0iPT09ZVtlLmxlbmd0aC0yXSYmYS0tKTt2YXIgdT1uZXcgQXJyYXlCdWZmZXIoYSksbD1uZXcgVWludDhBcnJheSh1KTtmb3IodD0wO3Q8czt0Kz00KW49ZFtlLmNoYXJDb2RlQXQodCldLHI9ZFtlLmNoYXJDb2RlQXQodCsxKV0saT1kW2UuY2hhckNvZGVBdCh0KzIpXSxvPWRbZS5jaGFyQ29kZUF0KHQrMyldLGxbYysrXT1uPDwyfHI+PjQsbFtjKytdPSgxNSZyKTw8NHxpPj4yLGxbYysrXT0oMyZpKTw8Nnw2MyZvO3JldHVybiB1fX0oKX0pLFZyPXpyLmVuY29kZSxxcj16ci5kZWNvZGU7dmFyIFdyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGJhc2U2NFRvQXJyYXlCdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHFyKGUpfSxhcnJheUJ1ZmZlclRvQmFzZTY0OmZ1bmN0aW9uKGUpe3JldHVybiBWcihlKX19KSxIcj17fTt2YXIgR3I9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FuSVVzZTpmdW5jdGlvbihlKXtyZXR1cm4gayhIcixlKT9IcltlXTohIWsoY3YsZSl9fSksWHI9e3Byb21pc2VJbnRlcmNlcHRvcjpZfSxKcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxpbnRlcmNlcHRvcnM6WHIsYWRkSW50ZXJjZXB0b3I6ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGUmJlQodCk/VShGW2VdfHwoRltlXT17fSksdCk6VChlKSYmVShSLGUpfSxyZW1vdmVJbnRlcmNlcHRvcjpmdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZT9UKHQpP3ooRltlXSx0KTpkZWxldGUgRltlXTpUKGUpJiZ6KFIsZSl9fSksWXI9ITEsS3I9MCxacj0wO2Z1bmN0aW9uIFFyKGUsdCl7cmV0dXJuIGU9TnVtYmVyKGUpLGlzTmFOKGUpP3Q6ZX12YXIgZWk9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXB4MnB4OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG87aWYoMD09PUtyJiYobj1wZy5nZXRTeXN0ZW1JbmZvU3luYygpLHI9bi5wbGF0Zm9ybSxpPW4ucGl4ZWxSYXRpbyxvPW4ud2luZG93V2lkdGgsS3I9byxacj1pLFlyPSJpb3MiPT09ciksMD09PShlPU51bWJlcihlKSkpcmV0dXJuIDA7dmFyIGE9ZGcuZ2xvYmFsU3R5bGV8fGRnLndpbmRvd3x8e30scz1RcihhLnJweENhbGNNYXhEZXZpY2VXaWR0aCw5NjApLGM9UXIoYS5ycHhDYWxjQmFzZURldmljZVdpZHRoLDM3NSksdT1RcihhLnJweENhbGNJbmNsdWRlV2lkdGgsNzUwKSxsPXR8fEtyLGQ9ZS83NTAqKGw9ZT09PXV8fGw8PXM/bDpjKTtyZXR1cm4gZDwwJiYoZD0tZCksMD09PShkPU1hdGguZmxvb3IoZCsxZS00KSkmJihkPTEhPT1aciYmWXI/LjU6MSksZTwwPy1kOmR9fSk7ZnVuY3Rpb24gdGkoZSx0LG4scil7YWcucHVibGlzaEhhbmRsZXIodCsiLWF1ZGlvLSIrZSx7YXVkaW9JZDplLHR5cGU6bixkYXRhOnJ9LHQpfXZhciBuaT1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10fTtuaS5wcm90b3R5cGUuc2V0U3JjPWZ1bmN0aW9uKGUpe3RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNldFNyYyIse3NyYzplfSl9LG5pLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicGxheSIpfSxuaS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJwYXVzZSIpfSxuaS5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXt0aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJzZWVrIix7cG9zaXRpb246ZX0pfTt2YXIgcmk9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlQXVkaW9Db250ZXh0OmZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gbmV3IG5pKGUsdC4kcGFnZS5pZCk7dmFyIG49aGcoKTtpZihuLiRyb3V0ZSYmbi4kcm91dGUucGFyYW1zLl9faWRfXylyZXR1cm4gbmV3IG5pKGUsbi4kcm91dGUucGFyYW1zLl9faWRfXyk7YWcuZW1pdCgib25FcnJvciIsImNyZWF0ZUF1ZGlvQ29udGV4dDpmYWlsIil9fSksaWk9bmV3IHJnO2Z1bmN0aW9uIG9pKGUsdCxuKXtyZXR1cm4gZVt0XS5hcHBseShlLG4pfWZ1bmN0aW9uIGFpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBvaShpaSwiJG9uIixbXS5jb25jYXQodCkpfWZ1bmN0aW9uIHNpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBvaShpaSwiJG9mZiIsW10uY29uY2F0KHQpKX1mdW5jdGlvbiBjaSgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSk7ZS0tOyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gb2koaWksIiRvbmNlIixbXS5jb25jYXQodCkpfWZ1bmN0aW9uIHVpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBvaShpaSwiJGVtaXQiLFtdLmNvbmNhdCh0KSl9dmFyIGxpLGRpPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLCRvbjphaSwkb2ZmOnNpLCRvbmNlOmNpLCRlbWl0OnVpfSk7ZnVuY3Rpb24gZmkoKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIGFnLmludm9rZUNhbGxiYWNrSGFuZGxlci5hcHBseShhZyxlKX1mdW5jdGlvbiBwaShlKXtyZXR1cm4gcGcucmVxdWlyZU5hdGl2ZVBsdWdpbihlKX1mdW5jdGlvbiBoaShlKXtmb3IodmFyIHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoLTE7MDxuLS07KXRbbl09YXJndW1lbnRzW24rMV07cmV0dXJuIGFnLmVtaXQuYXBwbHkoYWcsWyJhcGkuIitlXS5jb25jYXQodCkpfXZhciB2aT1vZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU7ZnVuY3Rpb24gZ2koZSl7dmkobGk9ZSl9ZnVuY3Rpb24gbWkoZSl7aWYoIWUpe3ZhciB0PXZnKCk7aWYoIXQubGVuZ3RoKXJldHVybjtpZighKGU9dFt0Lmxlbmd0aC0xXS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlKXx8ZT09PWxpKXJldHVybn1lIT09bGkmJihsaT1lLG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShlKSl9ZnVuY3Rpb24geWkodCl7aWYodm9pZCAwPT09dCYmKHQ9IiIpLCFkZy50YWJCYXJ8fCFBcnJheS5pc0FycmF5KGRnLnRhYkJhci5saXN0KSlyZXR1cm4hMTt0cnl7aWYoIXQpe3ZhciBlPXZnKCk7aWYoIWUubGVuZ3RoKXJldHVybiExO3ZhciBuPWVbZS5sZW5ndGgtMV07cmV0dXJuISFuJiZuLiRwYWdlLm1ldGEuaXNUYWJCYXJ9L15cLy8udGVzdCh0KXx8KHQ9Ii8iK3QpO3ZhciByPWZnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PXR9KTtyZXR1cm4gciYmci5tZXRhLmlzVGFiQmFyfWNhdGNoKGUpe31yZXR1cm4hMX1mdW5jdGlvbiBfaShlKXtyZXR1cm4gcXIoZSl9ZnVuY3Rpb24gYmkoZSl7cmV0dXJuIFZyKGUpfWZ1bmN0aW9uIHdpKGUsdCxuLHIpe3ZhciBpPWUodCk7cmV0dXJuIGkmJmkuZXJyTXNnJiYoaS5lcnJNc2c9aS5lcnJNc2cucmVwbGFjZShuLHIpKSxpfWZ1bmN0aW9uIGtpKGUpe3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpTaSgpfWZ1bmN0aW9uIFNpKCl7dHJ5e3ZhciBlPXZnKCk7aWYoZS5sZW5ndGgpcmV0dXJuIGVbZS5sZW5ndGgtMV0uJGdldEFwcFdlYnZpZXcoKX1jYXRjaChlKXt9fW9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1naTt2YXIgeGk9ZnVuY3Rpb24oZSx0KXtpZigwPT09dC5pbmRleE9mKCIuLyIpKXJldHVybiB4aShlLHQuc3Vic3RyKDIpKTt2YXIgbixyLGk9dC5zcGxpdCgiLyIpO2ZvcihuPTAscj1pLmxlbmd0aDtuPHImJiIuLiI9PT1pW25dO24rKyk7aS5zcGxpY2UoMCxuKSx0PWkuam9pbigiLyIpO3ZhciBvPTA8ZS5sZW5ndGg/ZS5zcGxpdCgiLyIpOltdO3JldHVybiBvLnNwbGljZShvLmxlbmd0aC1uLTEsbisxKSxvLmNvbmNhdChpKS5qb2luKCIvIil9LENpPWZ1bmN0aW9uKGUpe3JldHVybiBvZy5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpLnJlcGxhY2UoL15cLz9hcHBzXC8vLCIvYW5kcm9pZF9hc3NldC9hcHBzLyIpLnJlcGxhY2UoL1wvJC8sIiIpfTtmdW5jdGlvbiBUaShlKXtpZigwPT09ZS5pbmRleE9mKCIvLyIpKXJldHVybiJodHRwczoiK2U7aWYoL14oW2Etei1dKzopP1wvXC8vaS50ZXN0KGUpfHwvXmRhdGE6LiosLiovLnRlc3QoZSkpcmV0dXJuIGU7aWYoMD09PWUuaW5kZXhPZigiX3d3dyIpfHwwPT09ZS5pbmRleE9mKCJfZG9jIil8fDA9PT1lLmluZGV4T2YoIl9kb2N1bWVudHMiKXx8MD09PWUuaW5kZXhPZigiX2Rvd25sb2FkcyIpKXJldHVybiJmaWxlOi8vIitDaShlKTt2YXIgdD0iZmlsZTovLyIrQ2koIl93d3ciKTtpZigwPT09ZS5pbmRleE9mKCIvIikpcmV0dXJuIGUuc3RhcnRzV2l0aCgiL3N0b3JhZ2UvIil8fGUuc3RhcnRzV2l0aCgiL3NkY2FyZC8iKXx8ZS5pbmNsdWRlcygiL0NvbnRhaW5lcnMvRGF0YS9BcHBsaWNhdGlvbi8iKT8iZmlsZTovLyIrZTp0K2U7aWYoMD09PWUuaW5kZXhPZigiLi4vIil8fDA9PT1lLmluZGV4T2YoIi4vIikpe2lmKCJzdHJpbmciPT10eXBlb2YgX19pZF9fKXJldHVybiB0K3hpKCIvIitfX2lkX18sZSk7dmFyIG49dmcoKTtpZihuLmxlbmd0aClyZXR1cm4gdCt4aSgiLyIrbltuLmxlbmd0aC0xXS5yb3V0ZSxlKX1yZXR1cm4gZX12YXIgT2k9My4xNDE1OTI2NTM1ODk3OTMsRWk9NjM3ODI0NSxJaT0uMDA2NjkzNDIxNjIyOTY1OTQzO3ZhciBBaT1mdW5jdGlvbihlLHQpe3ZhciBuPTIqZS0xMDArMyp0Ky4yKnQqdCsuMSplKnQrLjIqTWF0aC5zcXJ0KE1hdGguYWJzKGUpKTtyZXR1cm4gbis9MiooMjAqTWF0aC5zaW4oNiplKk9pKSsyMCpNYXRoLnNpbigyKmUqT2kpKS8zLG4rPTIqKDIwKk1hdGguc2luKHQqT2kpKzQwKk1hdGguc2luKHQvMypPaSkpLzMsbis9MiooMTYwKk1hdGguc2luKHQvMTIqT2kpKzMyMCpNYXRoLnNpbih0Kk9pLzMwKSkvM30sJGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj0zMDArZSsyKnQrLjEqZSplKy4xKmUqdCsuMSpNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0yKigyMCpNYXRoLnNpbig2KmUqT2kpKzIwKk1hdGguc2luKDIqZSpPaSkpLzMsbis9MiooMjAqTWF0aC5zaW4oZSpPaSkrNDAqTWF0aC5zaW4oZS8zKk9pKSkvMyxuKz0yKigxNTAqTWF0aC5zaW4oZS8xMipPaSkrMzAwKk1hdGguc2luKGUvMzAqT2kpKS8zfSxQaT1mdW5jdGlvbihlLHQpe3JldHVybiBlPDcyLjAwNHx8MTM3LjgzNDc8ZXx8dDwuODI5M3x8NTUuODI3MTx0fHwhMX07ZnVuY3Rpb24gTWkoZSxuKXtyZXR1cm4gZnVuY3Rpb24odCl7b2dbZV1bbl0oZnVuY3Rpb24oZSl7ZSYmKGRlbGV0ZSBlLmNvZGUsZGVsZXRlIGUubWVzc2FnZSksZmkodCxlKX0pfX1mdW5jdGlvbiBqaSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtlPWV8fHt9LGZpKHQsT2JqZWN0LmFzc2lnbih7fSxlLHtlcnJNc2c6bisiOm9rIn0pKX19ZnVuY3Rpb24gTGkoYSxzLGMpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0oZT1lfHx7fSkuY29kZTt2b2lkIDA9PT10JiYodD0wKTt2YXIgbj1lLm1lc3NhZ2Uscj17fTtmb3IodmFyIGkgaW4gZSktMT09PVsiY29kZSIsIm1lc3NhZ2UiXS5pbmRleE9mKGkpJiYocltpXT1lW2ldKTt2YXIgbz1yO2ZpKGEsT2JqZWN0LmFzc2lnbih7fSx7ZXJyTXNnOnMrIjpmYWlsICIrKG58fGN8fCIiKSxlcnJDb2RlOnQsY29kZTp0fSxvKSl9fWZ1bmN0aW9uIEJpKG4scixpLG8pe3JldHVybiBmdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoZT1pKGUpKSxvZ1tuXVtyXShPYmplY3QuYXNzaWduKGUse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pLGRlbGV0ZSBlLmNvZGUsZGVsZXRlIGUubWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmKGU9byhlKSksZmkodCxPYmplY3QuYXNzaWduKHt9LGUse2Vyck1zZzpyKyI6b2sifSkpfSxmYWlsOkxpKHQscil9KSl9fWZ1bmN0aW9uIE5pKGUpe3ZhciB0PWUuc3BsaXQoIi8iKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX12YXIgRGksUmk9InBsYXliYWNrIixGaT17fSxVaT1bInBsYXkiLCJjYW5wbGF5IiwiZW5kZWQiLCJzdG9wIiwid2FpdGluZyIsInNlZWtpbmciLCJzZWVrZWQiLCJwYXVzZSJdLHppPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxoaSgib25BdWRpb1N0YXRlQ2hhbmdlIixPYmplY3QuYXNzaWduKHtzdGF0ZTplfSx0KSl9O3ZhciBWaT1udWxsLHFpPTI1MCxXaT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksaGkoIm9uQmFja2dyb3VuZEF1ZGlvU3RhdGVDaGFuZ2UiLE9iamVjdC5hc3NpZ24oe3N0YXRlOmV9LHQpKX0sSGk9WyJwbGF5IiwicGF1c2UiLCJlbmRlZCIsInN0b3AiLCJjYW5wbGF5Il07ZnVuY3Rpb24gR2koKXtEaXx8KChEaT1vZy5hdWRpby5jcmVhdGVQbGF5ZXIoe2F1dG9wbGF5OiEwLGJhY2tncm91bmRDb250cm9sOiEwfSkpLnNyYz1EaS50aXRsZT1EaS5lcG5hbWU9RGkuc2luZ2VyPURpLmNvdmVySW1nVXJsPURpLndlYlVybD0iIixEaS5zdGFydFRpbWU9MCxIaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0RpLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbigpeyJwbGF5Ij09PXQ/KERpLmlzU3RvcHBlZD0hMSxYaSgpLFdpKCJ0aW1lVXBkYXRlIix7fSksVmk9dWcoZnVuY3Rpb24oKXtXaSgidGltZVVwZGF0ZSIse30pfSxxaSkpOiJzdG9wIj09PXQmJihEaS5pc1N0b3BwZWQ9ITApLCJwYXVzZSIhPT10JiYiZW5kZWQiIT09dCYmInN0b3AiIT09dHx8WGkoKTt2YXIgZT0ib25NdXNpYyIrKHRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKSk7aGkoZSx7ZGF0YVVybDpEaS5zcmMsZXJyTXNnOmUrIjpvayJ9KSxXaSh0LHtkYXRhVXJsOkRpLnNyY30pfSl9KSxEaS5hZGRFdmVudExpc3RlbmVyKCJ3YWl0aW5nIixmdW5jdGlvbigpe1hpKCksV2koIndhaXRpbmciLHtkYXRhVXJsOkRpLnNyY30pfSksRGkuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGUpe1hpKCksaGkoIm9uTXVzaWNFcnJvciIse2RhdGFVcmw6RGkuc3JjLGVyck1zZzoiRXJyb3I6IitlLm1lc3NhZ2V9KSxXaSgiZXJyb3IiLHtkYXRhVXJsOkRpLnNyYyxlcnJNc2c6ZS5tZXNzYWdlLGVyckNvZGU6ZS5jb2RlfSl9KSxEaS5hZGRFdmVudExpc3RlbmVyKCJwcmV2IixmdW5jdGlvbigpe3JldHVybiBoaSgib25CYWNrZ3JvdW5kQXVkaW9QcmV2Iil9KSxEaS5hZGRFdmVudExpc3RlbmVyKCJuZXh0IixmdW5jdGlvbigpe3JldHVybiBoaSgib25CYWNrZ3JvdW5kQXVkaW9OZXh0Iil9KSl9ZnVuY3Rpb24gWGkoKXtudWxsIT09VmkmJmxnKFZpKX1mdW5jdGlvbiBKaShuLGUpe0dpKCk7dmFyIHI9WyJzcmMiLCJzdGFydFRpbWUiLCJjb3ZlckltZ1VybCIsIndlYlVybCIsInNpbmdlciIsImVwbmFtZSIsInRpdGxlIl07aWYoZSYmInBsYXliYWNrUmF0ZSI9PT1lKXt2YXIgdD1uW2VdO0RpLnBsYXliYWNrUmF0ZSYmRGkucGxheWJhY2tSYXRlKHBhcnNlRmxvYXQodCkpfWVsc2V7dmFyIGk9e307T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPD1yLmluZGV4T2YoZSkpe3ZhciB0PW5bZV07ZT09PXJbMF0mJnQmJih0PVRpKHQpKSxEaVtlXT1pW2VdPXR9fSksRGkuc2V0U3R5bGVzKGkpfX1mdW5jdGlvbiBZaSgpe3JldHVybiBEaX1mdW5jdGlvbiBLaShlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLmRhdGFVcmwscj1lLnBvc2l0aW9uLGk9ZS5hcGk7dm9pZCAwPT09aSYmKGk9Im9wZXJhdGVNdXNpY1BsYXllciIpO3ZhciBvPWUudGl0bGUsYT1lLmNvdmVySW1nVXJsLHM9WWkoKTtyZXR1cm4gMDxbInJlc3VtZSIsInBhdXNlIiwic3RvcCJdLmluZGV4T2YodCk/cyYmc1t0XSgpOiJwbGF5Ij09PXQ/KEppKHtzcmM6bixzdGFydFRpbWU6cix0aXRsZTpvLGNvdmVySW1nVXJsOmF9KSxzLnBsYXkoKSk6InNlZWsiPT09dCYmcyYmcy5zZWVrVG8ocikse2Vyck1zZzppKyI6b2sifX12YXIgWmk9InN1Y2Nlc3MiLFFpPSJmYWlsIixlbz1bWmksUWksImNvbXBsZXRlIl07ZnVuY3Rpb24gdG8oZSx0LG4scil7aWYoZSl7aWYodm9pZCAwPT09bilyZXR1cm4gZVt0XSgpO3ZhciBpPWlvKG4scilbMV07cmV0dXJuIE9iamVjdC5rZXlzKGkpLmxlbmd0aD9lW3RdKG9vKHQsaSkpOmVbdF0oKX19ZnVuY3Rpb24gbm8oZSx0LG4scil7aWYoZSl7dmFyIGk9aW8obixyKSxvPWlbMF0sYT1pWzFdO3JldHVybiBPYmplY3Qua2V5cyhhKS5sZW5ndGg/ZVt0XShvLG9vKHQsYSkpOmVbdF0obyl9fWZ1bmN0aW9uIHJvKGUsdCl7dmFyIG49ZnVuY3Rpb24gZSh0LG4pe2lmKCF0fHwhbilyZXR1cm47aWYobi5hdHRyJiZuLmF0dHIuaWQ9PT10KXJldHVybiBuO3ZhciByPW4uY2hpbGRyZW47aWYoIXIpcmV0dXJuO2Zvcih2YXIgaT0wLG89ci5sZW5ndGg7aTxvO2krKyl7dmFyIGE9ZSh0LHJbaV0pO2lmKGEpcmV0dXJuIGF9fShlLHQuJGVsKTtyZXR1cm4gbnx8Y29uc29sZS5lcnJvcigiQ2FuIG5vdCBmaW5kIGAiK2UrImAiKX1mdW5jdGlvbiBpbyhuLGUpe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpLHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTtDKHQpJiYocltlXT10LGRlbGV0ZSBuW2VdKX07cmV0dXJuIGVvLmZvckVhY2godCksZSYmZS5mb3JFYWNoKHQpLFtuLHJdfWZ1bmN0aW9uIG9vKGksbyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZTtkZWxldGUgZS50eXBlO3ZhciBuPW9bdF07aWYodD09PVppP2UuZXJyTXNnPWkrIjpvayI6dD09PVFpJiYoZS5lcnJNc2c9aSsiOmZhaWwiKyhlLm1zZz8iICIrZS5tc2c6IiIpKSxkZWxldGUgZS5jb2RlLGRlbGV0ZSBlLm1zZyxDKG4pJiZuKGUpLHQ9PT1aaXx8dD09PVFpKXt2YXIgcj1vLmNvbXBsZXRlO0MocikmJnIoZSl9fX12YXIgYW89e2dldENlbnRlckxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRvKGUsImdldENlbnRlckxvY2F0aW9uIix0KX0sbW92ZVRvTG9jYXRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwibW92ZVRvTG9jYXRpb24iLHQpfSx0cmFuc2xhdGVNYXJrZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwidHJhbnNsYXRlTWFya2VyIix0LFsiYW5pbWF0aW9uRW5kIl0pfSxpbmNsdWRlUG9pbnRzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsImluY2x1ZGVQb2ludHMiLHQpfSxnZXRSZWdpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdG8oZSwiZ2V0UmVnaW9uIix0KX0sZ2V0U2NhbGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdG8oZSwiZ2V0U2NhbGUiLHQpfSxhZGRDdXN0b21MYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJhZGRDdXN0b21MYXllciIsdCl9LHJlbW92ZUN1c3RvbUxheWVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInJlbW92ZUN1c3RvbUxheWVyIix0KX0sYWRkR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJhZGRHcm91bmRPdmVybGF5Iix0KX0scmVtb3ZlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX0sdXBkYXRlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJ1cGRhdGVHcm91bmRPdmVybGF5Iix0KX0saW5pdE1hcmtlckNsdXN0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwiaW5pdE1hcmtlckNsdXN0ZXIiLHQpfSxhZGRNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsImFkZE1hcmtlcnMiLHQpfSxyZW1vdmVNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInJlbW92ZU1hcmtlcnMiLHQpfSxtb3ZlQWxvbmc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwibW92ZUFsb25nIix0KX0sc2V0TG9jTWFya2VySWNvbjpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJzZXRMb2NNYXJrZXJJY29uIix0KX0sb3Blbk1hcEFwcDpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJvcGVuTWFwQXBwIix0KX0sb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5vbih0Lm5hbWUsdC5jYWxsYmFjayl9fTt2YXIgc289e3BsYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsInBsYXkiKX0scGF1c2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsInBhdXNlIil9LHNlZWs6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwic2VlayIsdC5wb3NpdGlvbil9LHN0b3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsInN0b3AiKX0sc2VuZERhbm11OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInNlbmREYW5tdSIsdCl9LHBsYXliYWNrUmF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJwbGF5YmFja1JhdGUiLHQucmF0ZSl9LHJlcXVlc3RGdWxsU2NyZWVuOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInJlcXVlc3RGdWxsU2NyZWVuIix0KX0sZXhpdEZ1bGxTY3JlZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsImV4aXRGdWxsU2NyZWVuIil9LHNob3dTdGF0dXNCYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsInNob3dTdGF0dXNCYXIiKX0saGlkZVN0YXR1c0JhcjpmdW5jdGlvbihlKXtyZXR1cm4gdG8oZSwiaGlkZVN0YXR1c0JhciIpfX07dmFyIGNvPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuY3R4PXR9O2Z1bmN0aW9uIHVvKGUsdCxuLHIpe3ZhciBpPXQuJHBhZ2UuaWQ7YWcucHVibGlzaEhhbmRsZXIoaSsiLWxpdmVwdXNoZXItIitlLHtsaXZlUHVzaGVySWQ6ZSx0eXBlOm4sZGF0YTpyfSxpKX1jby5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzdGFydCIsZSl9LGNvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RvcCIsZSl9LGNvLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInBhdXNlIixlKX0sY28ucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInJlc3VtZSIsZSl9LGNvLnByb3RvdHlwZS5zd2l0Y2hDYW1lcmE9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzd2l0Y2hDYW1lcmEiLGUpfSxjby5wcm90b3R5cGUuc25hcHNob3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzbmFwc2hvdCIsZSl9LGNvLnByb3RvdHlwZS50b2dnbGVUb3JjaD1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInRvZ2dsZVRvcmNoIixlKX0sY28ucHJvdG90eXBlLnBsYXlCR009ZnVuY3Rpb24oZSl7cmV0dXJuIG5vKHRoaXMuY3R4LCJwbGF5QkdNIixlKX0sY28ucHJvdG90eXBlLnN0b3BCR009ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzdG9wQkdNIixlKX0sY28ucHJvdG90eXBlLnBhdXNlQkdNPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwicGF1c2VCR00iLGUpfSxjby5wcm90b3R5cGUucmVzdW1lQkdNPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwicmVzdW1lQkdNIixlKX0sY28ucHJvdG90eXBlLnNldEJHTVZvbHVtZT1mdW5jdGlvbihlKXtyZXR1cm4gbm8odGhpcy5jdHgsInNldEJHTVZvbHVtZSIsZSl9LGNvLnByb3RvdHlwZS5zdGFydFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzdGFydFByZXZpZXciLGUpfSxjby5wcm90b3R5cGUuc3RvcFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzdG9wUHJldmlldyIsZSl9LGFnLnN1YnNjcmliZSgib25MaXZlUHVzaGVyTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtNLmludm9rZSh0LG4pfSk7dmFyIGxvPXtzdGFydFByZXZpZXc6InByZXZpZXciLHN0b3BQcmV2aWV3OiJzdG9wIn0sZm89ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlVm09dH07Zm8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7dW8odGhpcy5pZCx0aGlzLnBhZ2VWbSwib24iLHtuYW1lOmUsY2FsbGJhY2s6dH0pfSxbInN0YXJ0Iiwic3RvcCIsInBhdXNlIiwicmVzdW1lIiwic3dpdGNoQ2FtZXJhIiwic3RhcnRQcmV2aWV3Iiwic3RvcFByZXZpZXciLCJzbmFwc2hvdCJdLmZvckVhY2goZnVuY3Rpb24ocil7Zm8ucHJvdG90eXBlW3JdPU0ud2FycChmdW5jdGlvbihlLHQpe2UuY2FsbGJhY2tJZD10O3ZhciBuPWxvW3JdP2xvW3JdOnI7dW8odGhpcy5pZCx0aGlzLnBhZ2VWbSxuLGUpfSl9KTt2YXIgcG8saG89MjAwLHZvPVsidW5rbm93biIsIm5vbmUiLCJldGhlcm5ldCIsIndpZmkiLCIyZyIsIjNnIiwiNGciLCI1ZyJdLGdvPSJfX1VOSUFQUF9NQVAiLG1vPSJfZG9jL3VuaWFwcF90ZW1wIix5bz1tbysiXyIrRGF0ZS5ub3coKSxfbz1bXTtmdW5jdGlvbiBibyhlLHQpe3BvPXBvfHxvZy5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKGZ1bmN0aW9uKHQpe19vLmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx7eDp0LnhBeGlzLHk6dC55QXhpcyx6OnQuekF4aXN9KX0pfSxmdW5jdGlvbihlKXtwbz1udWxsLGZpKHQse2Vyck1zZzoic3RhcnRBY2NlbGVyb21ldGVyOmZhaWwgIitlLm1lc3NhZ2V9KX0se2ZyZXF1ZW5jeTpob30pLHNnKGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJzdGFydEFjY2VsZXJvbWV0ZXI6b2sifSl9LGhvKX1mdW5jdGlvbiB3bygpe3JldHVybiBwbyYmKG9nLmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaChwbykscG89bnVsbCkse319dmFyIGtvPXtuYW1lOntnaXZlbk5hbWU6ImZpcnN0TmFtZSIsbWlkZGxlTmFtZToibWlkZGxlTmFtZSIsZmFtaWx5TmFtZToibGFzdE5hbWUifSxuaWNrbmFtZToibmlja05hbWUiLHBob3Rvczp7dHlwZToidXJsIix2YWx1ZToicGhvdG9GaWxlUGF0aCJ9LG5vdGU6InJlbWFyayIscGhvbmVOdW1iZXJzOlt7dHlwZToibW9iaWxlIix2YWx1ZToibW9iaWxlUGhvbmVOdW1iZXIifSx7dHlwZToid29yayIsdmFsdWU6IndvcmtQaG9uZU51bWJlciJ9LHt0eXBlOiJjb21wYW55Iix2YWx1ZToiaG9zdE51bWJlciJ9LHt0eXBlOiJob21lIGZheCIsdmFsdWU6ImhvbWVGYXhOdW1iZXIifSx7dHlwZToid29yayBmYXgiLHZhbHVlOiJ3b3JrRmF4TnVtYmVyIn1dLGVtYWlsczpbe3R5cGU6ImhvbWUiLHZhbHVlOiJlbWFpbCJ9XSx1cmxzOlt7dHlwZToib3RoZXIiLHZhbHVlOiJ1cmwifV0sb3JnYW5pemF0aW9uczpbe3R5cGU6ImNvbXBhbnkiLG5hbWU6Im9yZ2FuaXphdGlvbiIsdGl0bGU6InRpdGxlIn1dLGltczpbe3R5cGU6Im90aGVyIix2YWx1ZToid2VDaGF0TnVtYmVyIn1dLGFkZHJlc3Nlczpbe3R5cGU6Im90aGVyIixwcmVmZXJyZWQ6ITAsY291bnRyeToiYWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiYWRkcmVzc1N0YXRlIixsb2NhbGl0eToiYWRkcmVzc0NpdHkiLHN0cmVldEFkZHJlc3M6ImFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImhvbWUiLGNvdW50cnk6ImhvbWVBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJob21lQWRkcmVzc1N0YXRlIixsb2NhbGl0eToiaG9tZUFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJob21lQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToiaG9tZUFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImNvbXBhbnkiLGNvdW50cnk6IndvcmtBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJ3b3JrQWRkcmVzc1N0YXRlIixsb2NhbGl0eToid29ya0FkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJ3b3JrQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToid29ya0FkZHJlc3NQb3N0YWxDb2RlIn1dfSxTbz1bInR5cGUiLCJwcmVmZXJyZWQiXTt2YXIgeG89TWkoImJsdWV0b290aCIsIm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiKSxDbz1NaSgiYmx1ZXRvb3RoIiwib25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiKSxUbz1NaSgiYmx1ZXRvb3RoIiwib25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UiKSxPbz1NaSgiYmx1ZXRvb3RoIiwib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIik7ZnVuY3Rpb24gRW8oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuZGV2aWNlSWQ7dCYmKGUuZGV2aWNlSWQ9dC50b1VwcGVyQ2FzZSgpKTt2YXIgbj1lLnNlcnZpY2VJZDtyZXR1cm4gbiYmKGUuc2VydmljZUlkPW4udG9VcHBlckNhc2UoKSksZX12YXIgSW8sQW89QmkoImJsdWV0b290aCIsIm9wZW5CbHVldG9vdGhBZGFwdGVyIiksJG89QmkoImJsdWV0b290aCIsImNsb3NlQmx1ZXRvb3RoQWRhcHRlciIpLFBvPUJpKCJibHVldG9vdGgiLCJnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUiKSxNbz1CaSgiYmx1ZXRvb3RoIiwic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IixFbyksam89QmkoImJsdWV0b290aCIsInN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IiksTG89QmkoImJsdWV0b290aCIsImdldEJsdWV0b290aERldmljZXMiKSxCbz1CaSgiYmx1ZXRvb3RoIiwiZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsRW8pLE5vPUJpKCJibHVldG9vdGgiLCJjcmVhdGVCTEVDb25uZWN0aW9uIixFbyksRG89QmkoImJsdWV0b290aCIsImNsb3NlQkxFQ29ubmVjdGlvbiIsRW8pLFJvPUJpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsRW8pLEZvPUJpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3MiLEVvKSxVbz1CaSgiYmx1ZXRvb3RoIiwibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsRW8pLHpvPUJpKCJibHVldG9vdGgiLCJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsRW8pLFZvPUJpKCJibHVldG9vdGgiLCJ3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLEVvKSxxbz1CaSgiYmx1ZXRvb3RoIiwic2V0QkxFTVRVIixFbyksV289QmkoImJsdWV0b290aCIsImdldEJMRURldmljZVJTU0kiLEVvKTt2YXIgSG89W107ZnVuY3Rpb24gR28oZSx0KXtJbz1Jb3x8b2cub3JpZW50YXRpb24ud2F0Y2hPcmllbnRhdGlvbihmdW5jdGlvbih0KXtIby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUse2RpcmVjdGlvbjp0Lm1hZ25ldGljSGVhZGluZ30pfSl9LGZ1bmN0aW9uKGUpe0lvPW51bGwsZmkodCx7ZXJyTXNnOiJzdGFydENvbXBhc3M6ZmFpbCAiK2UubWVzc2FnZX0pfSx7ZnJlcXVlbmN5OmhvfSksc2coZnVuY3Rpb24oKXtmaSh0LHtlcnJNc2c6InN0YXJ0Q29tcGFzczpvayJ9KX0saG8pfWZ1bmN0aW9uIFhvKCl7cmV0dXJuIElvJiYob2cub3JpZW50YXRpb24uY2xlYXJXYXRjaChJbyksSW89bnVsbCkse319dmFyIEpvPU1pKCJpYmVhY29uIiwib25CZWFjb25VcGRhdGUiKSxZbz1NaSgiaWJlYWNvbiIsIm9uQmVhY29uU2VydmljZUNoYW5nZSIpLEtvPUJpKCJpYmVhY29uIiwiZ2V0QmVhY29ucyIpLFpvPUJpKCJpYmVhY29uIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiKSxRbz1CaSgiaWJlYWNvbiIsInN0b3BCZWFjb25EaXNjb3ZlcnkiKTt2YXIgZWE9IkFuZHJvaWQiPT09b2cub3MubmFtZSYmcGFyc2VJbnQob2cub3MudmVyc2lvbik8Nix0YT1lYT8ic2xpZGUtaW4tcmlnaHQiOiJwb3AtaW4iLG5hPTMwMCxyYT1lYT8ic2xpZGUtb3V0LXJpZ2h0IjoicG9wLW91dCIsaWE9NTAsb2E9Il93d3cvX191bmlhcHB2aWV3Lmh0bWwiLGFhPSJmIixzYT0iaSIsY2E9ImUiLHVhPSJ2LXNob3ciLGxhPSJjIixkYT0icyIsZmE9InNjIixwYT17fSxoYT0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIjtmdW5jdGlvbiB2YShlLHQpe2lmKGU9PT1oYSlyZXR1cm4gaGkoaGEsdC5kYXRhLHQud2Vidmlld0lkcyksITA7dmFyIG49cGFbZV07cmV0dXJuISFuJiYobih0KSxuLmtlZXBBbGl2ZXx8ZGVsZXRlIHBhW2VdLCEwKX1mdW5jdGlvbiBnYShlLHQsbil7aWYodm9pZCAwPT09biYmKG49ITApLHBhW2VdKXJldHVybiBjb25zb2xlLndhcm4oIiciK2UrIicgcmVnaXN0ZXJlZDogIitwYVtlXS50b1N0cmluZygpKTt0LmtlZXBBbGl2ZT0hIW4scGFbZV09dH12YXIgbWE9Il9fVU5JQVBQX1NDQU4iLHlhPSJfd3d3L19fdW5pYXBwc2Nhbi5odG1sIixfYT0ic2NhbkNvZGUiO3ZhciBiYSx3YSxrYSxTYSx4YSxDYT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxTQ0FOX0lEOm1hLFNDQU5fUEFUSDp5YSxzY2FuQ29kZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUub25seUZyb21DYW1lcmE7dm9pZCAwPT09biYmKG49ITEpO3ZhciByPWUuc2NhblR5cGUsaT1lLmF1dG9EZWNvZGVDaGFyU2V0LG89b2cuYmFyY29kZSxhPXtxckNvZGU6W28uUVIsby5BWlRFQyxvLk1BWElDT0RFXSxiYXJDb2RlOltvLkVBTjEzLG8uRUFOOCxvLlVQQ0Esby5VUENFLG8uQ09EQUJBUixvLkNPREUxMjgsby5DT0RFMzksby5DT0RFOTMsby5JVEYsby5SU1MxNCxvLlJTU0VYUEFOREVEXSxkYXRhbWF0cml4OltvLkRBVEFNQVRSSVhdLHBkZjQxNzpbby5QREY0MTddfSxzPXt9O3Nbby5RUl09IlFSX0NPREUiLHNbby5FQU4xM109IkVBTl8xMyIsc1tvLkVBTjhdPSJFQU5fOCIsc1tvLkRBVEFNQVRSSVhdPSJEQVRBX01BVFJJWCIsc1tvLlVQQ0FdPSJVUENfQSIsc1tvLlVQQ0VdPSJVUENfRSIsc1tvLkNPREFCQVJdPSJDT0RBQkFSIixzW28uQ09ERTM5XT0iQ09ERV8zOSIsc1tvLkNPREU5M109IkNPREVfOTMiLHNbby5DT0RFMTI4XT0iQ09ERV8xMjgiLHNbby5JVEZdPSJDT0RFXzI1IixzW28uUERGNDE3XT0iUERGXzQxNyIsc1tvLkFaVEVDXT0iQVpURUMiLHNbby5SU1MxNF09IlJTU18xNCIsc1tvLlJTU0VYUEFOREVEXT0iUlNTRVhQQU5ERUQiO3ZhciBjLHUsbD0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0oYz1vZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09Y3x8Im51bGwiPT09Yz9jPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PWMmJihjPSJkYXJrIiksYyksZD1bXTtBcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aCYmci5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWFbZV07dCYmKGQ9ZC5jb25jYXQodCkpfSksZC5sZW5ndGh8fChkPWQuY29uY2F0KGEucXJDb2RlKS5jb25jYXQoYS5iYXJDb2RlKS5jb25jYXQoYS5kYXRhbWF0cml4KS5jb25jYXQoYS5wZGY0MTcpKTt2YXIgZj1bXTtufHxmLnB1c2goe2Zsb2F0OiJyaWdodCIsdGV4dDphdCgidW5pLnNjYW5Db2RlLmFsYnVtIiksZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7b2cuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe28uc2NhbihlLGZ1bmN0aW9uKGUsdCxuLHIpe2wmJm9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLHU9e3R5cGU6ZSxjb2RlOnQsY2hhclNldDpyfSxwLmNsb3NlKCJhdXRvIil9LGZ1bmN0aW9uKCl7b2cubmF0aXZlVUkudG9hc3QoYXQoInVuaS5zY2FuQ29kZS5mYWlsIikpfSxkLGkpfSxmdW5jdGlvbihlKXtlLmNvZGUhPT0oIkFuZHJvaWQiPT09b2cub3MubmFtZT8xMjotMikmJm9nLm5hdGl2ZVVJLnRvYXN0KGF0KCJ1bmkuc2NhbkNvZGUuZmFpbCIpKX0se211bHRpcGxlOiExLHN5c3RlbTohMSxmaWxlbmFtZTp5bysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITB9KX19KTt2YXIgcD1vZy53ZWJ2aWV3LmNyZWF0ZSh5YSxtYSx7dGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OmF0KCJ1bmkuc2NhbkNvZGUudGl0bGUiKSx0aXRsZVNpemU6IjE3cHgiLGJ1dHRvbnM6Zn0scG9wR2VzdHVyZToiY2xvc2UiLGJhY2tCdXR0b25BdXRvQ29udHJvbDoiY2xvc2UifSx7X191bmlhcHBfdHlwZToic2NhbiIsX191bmlhcHBfZGFyazpsLF9fdW5pYXBwX3NjYW5fdHlwZTpkLF9fdW5pYXBwX2F1dG9fZGVjb2RlX2NoYXJfc2V0OmksX191bmlhcHBfbG9jYWxlOnN0KCksInVuaS1hcHAiOiJub25lIn0pLGg9b2cubmF0aXZlVUkuc2hvd1dhaXRpbmcoKTtwLmFkZEV2ZW50TGlzdGVuZXIoInRpdGxlVXBkYXRlIixmdW5jdGlvbigpe3Auc2hvdyh0YSxuYSxmdW5jdGlvbigpe2guY2xvc2UoKX0pfSkscC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtmaSh0LHU/e3Jlc3VsdDp1LmNvZGUsc2NhblR5cGU6c1t1LnR5cGVdfHwiIixjaGFyU2V0OnUuY2hhclNldHx8InV0ZjgiLHBhdGg6IiIsZXJyTXNnOiJzY2FuQ29kZTpvayJ9OntlcnJNc2c6InNjYW5Db2RlOmZhaWwgY2FuY2VsIn0pLHZhKF9hKX0pLGwmJihvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IikscC5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9vZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKSxnYShfYSxmdW5jdGlvbihlKXtlJiYiY29kZSJpbiBlJiYodT1lKX0sITEpfX0pO2Z1bmN0aW9uIFRhKCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiYib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50PyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIE9hKCl7cmV0dXJuIGJhLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH12YXIgRWE9e307ZnVuY3Rpb24gSWEoZSl7dmFyIHQ9ZS5kYXRhJiZlLmRhdGEuX19tZXNzYWdlO2lmKHQmJnQuX19wYWdlKXt2YXIgbj10Ll9fcGFnZSxyPUVhW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgRWFbbl19fXZhciBBYT1mdW5jdGlvbihlKXt0aGlzLndlYnZpZXc9ZX07ZnVuY3Rpb24gJGEoZSl7dmFyIHQ9ZS5jb250ZXh0O3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgbj1lLnVybCxyPWUuZGF0YTt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9ZS5zdHlsZTt2b2lkIDA9PT1pJiYoaT17fSk7dmFyIG89ZS5vbk1lc3NhZ2UsYT1lLm9uQ2xvc2U7YmE9dC5wbHVzfHxvZyx3YT10LndlZXh8fCgib2JqZWN0Ij09dHlwZW9mIGlnP2lnOm51bGwpLGthPXQuQnJvYWRjYXN0Q2hhbm5lbHx8KCJvYmplY3QiPT10eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbD9Ccm9hZGNhc3RDaGFubmVsOm51bGwpO3ZhciBzPSJwYWdlIitEYXRlLm5vdygpOyExIT09KGk9T2JqZWN0LmFzc2lnbih7fSxpKSkudGl0bGVOVmlldyYmIm5vbmUiIT09aS50aXRsZU5WaWV3JiYoaS50aXRsZU5WaWV3PU9iamVjdC5hc3NpZ24oe2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGkudGl0bGVOVmlldykpO3ZhciBjPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6KCJzdHJpbmciPT10eXBlb2YgVlVFX0FQUF9URU1QTEFURV9QQVRIP1ZVRV9BUFBfVEVNUExBVEVfUEFUSDoiIikrIi8iK24rIi5qcyIsZGVmYXVsdEZvbnRTaXplOjE2LHZpZXdwb3J0OmJhLnNjcmVlbi5yZXNvbHV0aW9uV2lkdGh9fTtpPU9iamVjdC5hc3NpZ24oYyxpKTt2YXIgdSxsLGQ9YmEud2Vidmlldy5jcmVhdGUoIiIscyxpLHtleHRyYXM6e2Zyb206T2EoKSxydW50aW1lOlRhKCksZGF0YTpPYmplY3QuYXNzaWduKHt9LHIse2Rhcmttb2RlOmRnLmRhcmttb2RlfSksdXNlR2xvYmFsRXZlbnQ6IWthfX0pO3JldHVybiBkLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixhKSx1PXMsbD1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgbyYmbyhlLmRhdGEpLGUua2VlcHx8ZC5jbG9zZSgiYXV0byIpfSwidjgiPT09VGEoKT9rYT8oU2EmJlNhLmNsb3NlKCksKFNhPW5ldyBrYShPYSgpKSkub25tZXNzYWdlPUlhKTp4YXx8KHhhPXdhLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IikpLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIixJYSk6d2luZG93Ll9fcGx1c01lc3NhZ2U9SWEsRWFbdV09bCxkLnNob3coaS5hbmltYXRpb25UeXBlLGkuYW5pbWF0aW9uRHVyYXRpb24pLG5ldyBBYShkKX1BYS5wcm90b3R5cGUuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOmV9fSkpLG49dGhpcy53ZWJ2aWV3LmlkO2thP25ldyBrYShuKS5wb3N0TWVzc2FnZSh0KTpiYS53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyh0LG4pfSxBYS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLndlYnZpZXcuY2xvc2UoKX07dmFyIFBhPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNjYW5Db2RlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPSJsaWdodCIhPT0oIlVJU3RhdHVzQmFyU3R5bGVCbGFja1RyYW5zbHVjZW50Ij09PShuPW9nLm5hdmlnYXRvci5nZXRTdGF0dXNCYXJTdHlsZSgpKXx8IlVJU3RhdHVzQmFyU3R5bGVCbGFja09wYXF1ZSI9PT1ufHwibnVsbCI9PT1uP249ImxpZ2h0IjoiVUlTdGF0dXNCYXJTdHlsZURlZmF1bHQiPT09biYmKG49ImRhcmsiKSxuKSxvPSRhKHt1cmw6Il9fdW5pYXBwc2NhbiIsZGF0YTpPYmplY3QuYXNzaWduKHt9LGUse21lc3NhZ2VzOntmYWlsOmF0KCJ1bmkuc2NhbkNvZGUuZmFpbCIpLCJmbGFzaC5vbiI6YXQoInVuaS5zY2FuQ29kZS5mbGFzaC5vbiIpLCJmbGFzaC5vZmYiOmF0KCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIil9fSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwicG9wLWluIix0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0eXBlOiJmbG9hdCIsdGl0bGVUZXh0OmUudGl0bGVUZXh0fHxhdCgidW5pLnNjYW5Db2RlLnRpdGxlIiksdGl0bGVDb2xvcjoiI2ZmZmZmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixidXR0b25zOmUub25seUZyb21DYW1lcmE/W106W3t0ZXh0OmUuYWxidW1UZXh0fHxhdCgidW5pLnNjYW5Db2RlLmFsYnVtIiksZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7by5zZW5kTWVzc2FnZSh7dHlwZToiZ2FsbGVyeSJ9KX19XX0scG9wR2VzdHVyZToiY2xvc2UiLGJhY2tncm91bmQ6IiMwMDAwMDAiLGJhY2tCdXR0b25BdXRvQ29udHJvbDoiY2xvc2UifSxvbk1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ldmVudCxuPWUuZGV0YWlsOyhyPW4pLmVyck1zZz0ibWFya2VkIj09PXQ/InNjYW5Db2RlOm9rIjoic2NhbkNvZGU6ZmFpbCAiK24ubWVzc2FnZX0sb25DbG9zZTpmdW5jdGlvbigpe2kmJm9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLGZpKHQscnx8e2Vyck1zZzoic2NhbkNvZGU6ZmFpbCBjYW5jZWwifSl9fSk7aSYmKG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxvLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49ZS5yZXN1bHQ7InN0YXJ0Ij09PXQ/b2cubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6ImVuZCIhPT10fHxufHxvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSl9fSk7ZnVuY3Rpb24gTWEoKXtpZigiaW9zIiE9PW9nLm9zLm5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4hMTt2YXIgZT1waSgiZmFjZUlEIik7cmV0dXJuISghZXx8IWUuaXNTdXBwb3J0KCkpfWZ1bmN0aW9uIGphKCl7cmV0dXJuISghb2cuZmluZ2VycHJpbnR8fCFvZy5maW5nZXJwcmludC5pc1N1cHBvcnQoKSl9ZnVuY3Rpb24gTGEoKXt2YXIgZT1bXTtyZXR1cm4gamEoKSYmZS5wdXNoKCJmaW5nZXJQcmludCIpLE1hKCkmJmUucHVzaCgiZmFjaWFsIikse3N1cHBvcnRNb2RlOmUsZXJyTXNnOiJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb246b2sifX1mdW5jdGlvbiBCYShlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5jaGVja0F1dGhNb2RlO2lmKCJmaW5nZXJQcmludCI9PT10KXJldHVybiBqYSgpP3tpc0Vucm9sbGVkOm9nLmZpbmdlcnByaW50LmlzS2V5Z3VhcmRTZWN1cmUoKSYmb2cuZmluZ2VycHJpbnQuaXNFbnJvbGxlZEZpbmdlcnByaW50cygpLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpvayJ9Ontpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In07aWYoImZhY2lhbCI9PT10KXtpZihNYSgpKXt2YXIgbj1waSgiZmFjZUlEIik7cmV0dXJue2lzRW5yb2xsZWQ6biYmbi5pc0tleWd1YXJkU2VjdXJlKCkmJm4uaXNFbnJvbGxlZEZhY2VJRCgpLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpvayJ9fXJldHVybntpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19cmV0dXJue2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX1mdW5jdGlvbiBOYShlKXt2YXIgdD1lLmJ1dHRvbnM7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJnQuZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciByO2Uub25jbGljaz0ocj10LGZ1bmN0aW9uKGUpe3ZhciB0PXZnKCk7aWYodC5sZW5ndGgpe2UuaW5kZXg9cjt2YXIgbj10W3QubGVuZ3RoLTFdO24uJHZtJiZuLiR2bS5fX2NhbGxfaG9vayYmbi4kdm0uX19jYWxsX2hvb2soIm9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsZSl9fSl9KSxlfWZ1bmN0aW9uIERhKG4scil7dmFyIGU9ZnVuY3Rpb24oZSl7aWYoZHQoKSlyZXR1cm4gbHQoZSxbWyJ0aXRsZVRleHQiXSxbInNlYXJjaElucHV0IiwicGxhY2Vob2xkZXIiXSxbImJ1dHRvbnMiLCJ0ZXh0Il1dKX0ocik7aWYoIWUpcmV0dXJuIHI7dmFyIGk9ZVswXSxvPWVbMV07cmV0dXJuKGl8fG8pJiZwZy5vbkxvY2FsZUNoYW5nZShmdW5jdGlvbigpe3ZhciBlPW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQobisiIik7aWYoZSl7dmFyIHQ9e307aSYmKHQudGl0bGVUZXh0PXIudGl0bGVUZXh0KSxvJiYodC5zZWFyY2hJbnB1dD17cGxhY2Vob2xkZXI6ci5zZWFyY2hJbnB1dC5wbGFjZWhvbGRlcn0pLGUuc2V0U3R5bGUoe3RpdGxlTlZpZXc6dH0pfX0pLHJ9dmFyIFJhPS8oXGQrKFwuXGQrKT8pW3J8dV1weC9nO2Z1bmN0aW9uIEZhKHQpe3ZhciBuPXt9LGU9SlNPTi5zdHJpbmdpZnkodCk7aWYofmUuaW5kZXhPZigidXB4Iil8fH5lLmluZGV4T2YoInJweCIpKXRyeXtuPUpTT04ucGFyc2UoZS5yZXBsYWNlKFJhLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHBnLnVweDJweChwYXJzZUludCh0KXx8MCkrInB4In0pKX1jYXRjaChlKXtuPXQsY29uc29sZS5lcnJvcihlKX1lbHNlIG49SlNPTi5wYXJzZShlKTtyZXR1cm4gbn12YXIgVWE9WyJuYXZpZ2F0aW9uQmFyQmFja2dyb3VuZENvbG9yIiwibmF2aWdhdGlvbkJhclRleHRTdHlsZSIsIm5hdmlnYXRpb25CYXJUaXRsZVRleHQiLCJuYXZpZ2F0aW9uQmFyU2hhZG93IiwibmF2aWdhdGlvblN0eWxlIiwiZGlzYWJsZVNjcm9sbCIsImJhY2tncm91bmRDb2xvciIsImJhY2tncm91bmRUZXh0U3R5bGUiLCJlbmFibGVQdWxsRG93blJlZnJlc2giLCJvblJlYWNoQm90dG9tRGlzdGFuY2UiLCJ1c2luZ0NvbXBvbmVudHMiLCJ0aXRsZU5WaWV3IiwicHVsbFRvUmVmcmVzaCJdO2Z1bmN0aW9uIHphKGUsdCxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9e2JvdW5jZToidmVydGljYWwifTtuLndpbmRvdz1GYShPYmplY3QuYXNzaWduKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGcud2luZG93fHx7fSkpLG4ud2luZG93fHx7fSkpO3ZhciBpPURzKG4pO09iamVjdC5rZXlzKGkud2luZG93KS5mb3JFYWNoKGZ1bmN0aW9uKGUpey0xPT09VWEuaW5kZXhPZihlKSYmKHJbZV09aS53aW5kb3dbZV0pfSk7dmFyIG89aS53aW5kb3cuYmFja2dyb3VuZENvbG9yOygvXiNbYS16MC05XXs2fSQvaS50ZXN0KG8pfHwidHJhbnNwYXJlbnQiPT09bykmJihyLmJhY2tncm91bmQ/bz1yLmJhY2tncm91bmQ6ci5iYWNrZ3JvdW5kPW8sci5iYWNrZ3JvdW5kQ29sb3JUb3B8fChyLmJhY2tncm91bmRDb2xvclRvcD1vKSxyLmJhY2tncm91bmRDb2xvckJvdHRvbXx8KHIuYmFja2dyb3VuZENvbG9yQm90dG9tPW8pLHIuYW5pbWF0aW9uQWxwaGFCR0NvbG9yfHwoci5hbmltYXRpb25BbHBoYUJHQ29sb3I9byksdm9pZCAwPT09ci53ZWJ2aWV3QkdUcmFuc3BhcmVudCYmKHIud2Vidmlld0JHVHJhbnNwYXJlbnQ9ITApKTt2YXIgYT1mdW5jdGlvbihlLHQpe3ZhciBuPXQud2luZG93LHI9bi50aXRsZU5WaWV3O2lmKHQubWV0YS5zdGF0dXNCYXJTdHlsZT0id2hpdGUiPT09bi5uYXZpZ2F0aW9uQmFyVGV4dFN0eWxlPyJsaWdodCI6ImRhcmsiLCExPT09cnx8ImZhbHNlIj09PXJ8fCJjdXN0b20iPT09bi5uYXZpZ2F0aW9uU3R5bGUmJiFUKHIpfHwiYWx3YXlzIj09PW4udHJhbnNwYXJlbnRUaXRsZSYmIVQocikpcmV0dXJuITE7dmFyIGk9bi50aXRsZUltYWdlfHwiIixvPW4udHJhbnNwYXJlbnRUaXRsZXx8Im5vbmUiLGE9bi5uYXZpZ2F0aW9uQmFyQmFja2dyb3VuZENvbG9yLHM9e2F1dG9CYWNrQnV0dG9uOiF0Lm1ldGEuaXNRdWl0LHRpdGxlVGV4dDoiIj09PWkmJm4ubmF2aWdhdGlvbkJhclRpdGxlVGV4dHx8IiIsdGl0bGVDb2xvcjoid2hpdGUiPT09bi5uYXZpZ2F0aW9uQmFyVGV4dFN0eWxlPyIjZmZmZmZmIjoiIzAwMDAwMCIsdHlwZTp7bm9uZToiZGVmYXVsdCIsYXV0bzoidHJhbnNwYXJlbnQiLGFsd2F5czoiZmxvYXQifVtvXSxiYWNrZ3JvdW5kQ29sb3I6L14jW2EtejAtOV17Nn0kL2kudGVzdChhKXx8InRyYW5zcGFyZW50Ij09PWE/YToiI2Y4ZjhmOCIsdGFnczoiIj09PWk/W106W3t0YWc6ImltZyIsc3JjOmkscG9zaXRpb246e2xlZnQ6ImF1dG8iLHRvcDoiYXV0byIsd2lkdGg6ImF1dG8iLGhlaWdodDoiMjZweCJ9fV19O3JldHVybiBUKHIpP0RhKGUsT2JqZWN0LmFzc2lnbihzLE5hKHIpKSk6RGEoZSxzKX0oZSxpKTthJiYoMT09PWUmJmRnLnJlYWxFbnRyeVBhZ2VQYXRoJiYhaS5tZXRhLmlzUXVpdCYmKGEuYXV0b0JhY2tCdXR0b249ITApLHIudGl0bGVOVmlldz1hKTt2YXIgcz1mdW5jdGlvbihlKXt2YXIgdD1lLndpbmRvdztpZih0LmVuYWJsZVB1bGxEb3duUmVmcmVzaHx8dC5wdWxsVG9SZWZyZXNoJiZ0LnB1bGxUb1JlZnJlc2guc3VwcG9ydCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4iQW5kcm9pZCI9PT1vZy5vcy5uYW1lP09iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiY2lyY2xlIn0pOk9iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiZGVmYXVsdCIsaGVpZ2h0OiI1MHB4IixyYW5nZToiMjAwcHgiLGNvbnRlbnRkb3duOntjYXB0aW9uOiIifSxjb250ZW50b3Zlcjp7Y2FwdGlvbjoiIn0sY29udGVudHJlZnJlc2g6e2NhcHRpb246IiJ9fSksdC5iYWNrZ3JvdW5kVGV4dFN0eWxlJiYobi5jb2xvcj10LmJhY2tncm91bmRUZXh0U3R5bGUsbi5zbm93Q29sb3I9dC5iYWNrZ3JvdW5kVGV4dFN0eWxlKSxPYmplY3QuYXNzaWduKG4sdC5wdWxsVG9SZWZyZXNofHx7fSksbn19KGkpO3JldHVybiBzJiYoImNpcmNsZSI9PT1zLnN0eWxlJiYoci5ib3VuY2U9Im5vbmUiKSxyLnB1bGxUb1JlZnJlc2g9cyksImhpZGUiPT09ci5wb3BHZXN0dXJlJiZkZWxldGUgci5wb3BHZXN0dXJlLGkubWV0YS5pc1F1aXQmJihyLnBvcEdlc3R1cmU9ImlPUyI9PT1vZy5vcy5uYW1lPyJhcHBiYWNrIjoibm9uZSIpLHQmJmkubWV0YS5pc05WdWUmJihyLnVuaU5WaWV3PXtwYXRoOnQsZGVmYXVsdEZvbnRTaXplOmRnLmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDpkZy52aWV3cG9ydH0pLG4ubWV0YT1pLm1ldGEscn1mdW5jdGlvbiBWYSgpe3BnLm5hdmlnYXRlQmFjayh7ZnJvbToiYmFja2J1dHRvbiJ9KX1mdW5jdGlvbiBxYSgpe3JldHVybiBvZy5uYXZpZ2F0b3IuaXNJbW1lcnNlZFN0YXR1c2JhcigpP01hdGgucm91bmQoImlPUyI9PT1vZy5vcy5uYW1lP29nLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLnRvcDpvZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzYmFySGVpZ2h0KCkpOjB9ZnVuY3Rpb24gV2EoZSx0LG4pe2lmKGUucGF0aCl7dmFyIHI9ZS5zdHlsZXx8e30saT0ibmF2aWdhdGlvbkJhciI9PT1lLnR5cGUsbz0icG9wdXAiPT09ZS50eXBlO2RlbGV0ZSByLnR5cGUsbyYmIWUuaWQmJmNvbnNvbGUud2Fybigic3ViTlZ1ZVsiK2UucGF0aCsiXSBpcyBtaXNzaW5nIGlkIiksci51bmlOVmlldz17cGF0aDplLnBhdGgucmVwbGFjZSgiLm52dWUiLCIuanMiKSxkZWZhdWx0Rm9udFNpemU6ZGcuZGVmYXVsdEZvbnRTaXplLHZpZXdwb3J0OmRnLnZpZXdwb3J0fTt2YXIgYSxzPXtfX3VuaWFwcF9ob3N0OnQucGF0aCxfX3VuaWFwcF9vcmlnaW46ci51bmlOVmlldy5wYXRoLnNwbGl0KCI/IilbMF0ucmVwbGFjZSgiLmpzIiwiIiksX191bmlhcHBfb3JpZ2luX2lkOm4uaWQsX191bmlhcHBfb3JpZ2luX3R5cGU6bi5fX3VuaWFwcF90eXBlfTtpPyhyLnBvc2l0aW9uPSJkb2NrIixyLmRvY2s9InRvcCIsci50b3A9MCxyLndpZHRoPSIxMDAlIixyLmhlaWdodD10dCtxYSgpLGRlbGV0ZSByLmxlZnQsZGVsZXRlIHIucmlnaHQsZGVsZXRlIHIuYm90dG9tLGRlbGV0ZSByLm1hcmdpbik6byYmKHIucG9zaXRpb249ImFic29sdXRlIixhPXlpKHQucGF0aCk/cXM6bixzLl9fdW5pYXBwX21hc2s9ci5tYXNrfHwicmdiYSgwLDAsMCwwLjUpIixzLl9fdW5pYXBwX21hc2tfaWQ9YS5pZCksZGVsZXRlIHIubWFzazt2YXIgYyx1PW9nLndlYnZpZXcuY3JlYXRlKCIiLGUuaWQscixzKTtvP2Z1bmN0aW9uKGUsdCxuKXtuLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzfHwobi5wb3B1cFN1Yk5WdWVXZWJ2aWV3cz17fSksbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXT1lO3ZhciByPWZ1bmN0aW9uKCl7bi5zZXRTdHlsZSh7bWFzazoibm9uZSJ9KSxlLmhpZGUoImF1dG8iKX07bi5hZGRFdmVudExpc3RlbmVyKCJtYXNrQ2xpY2siLHIpO3ZhciBpPSExO2UuYWRkRXZlbnRMaXN0ZW5lcigic2hvdyIsZnVuY3Rpb24oKXtpfHwob2cua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFZhKSxvZy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsciksaT0hMCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGZ1bmN0aW9uKCl7aSYmKG9nLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixyKSxvZy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsVmEpLGk9ITEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtkZWxldGUgbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXSxpJiYob2cua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLHIpLG9nLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSksaT0hMSl9KX0odSwwLGEpOihjPXUsbi5hcHBlbmQoYykpfX1mdW5jdGlvbiBIYShpKXt2YXIgbixyLG8sZTtpLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKG49ZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0LHI9e2RldmljZU9yaWVudGF0aW9uOjkwPT09TWF0aC5hYnMob2cubmF2aWdhdG9yLmdldE9yaWVudGF0aW9uKCkpPyJsYW5kc2NhcGUiOiJwb3J0cmFpdCIsc2l6ZTp7d2luZG93V2lkdGg6TWF0aC5jZWlsKHQpLHdpbmRvd0hlaWdodDpNYXRoLmNlaWwobil9fTtoaSgib25WaWV3RGlkUmVzaXplIixyKSxhZy5lbWl0KCJvblJlc2l6ZSIscixwYXJzZUludChpLmlkKSl9LHI9NTAsKGU9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMsdD10aGlzO2NnKG8pLG89c2coZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0LGUpfSxyKX0pLmNhbmNlbD1mdW5jdGlvbigpe2NnKG8pfSxlKSl9dmFyIEdhLFhhPTIsSmE9InZkU3luYyIsWWE9IndlYnZpZXdSZWFkeSIsS2E9InZkU3luY0NhbGxiYWNrIixaYT0iaW52b2tlQXBpIixRYT0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIixlcz0id2Vidmlld0luc2VydGVkIix0cz0id2Vidmlld1JlbW92ZWQiLG5zPSJ3ZWJ2aWV3SWQiO2Z1bmN0aW9uIHJzKGUpe3ZhciBsO2UuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsZnVuY3Rpb24oZSl7aWYoInN0YXJ0Ij09PWUudHlwZSl7dmFyIHQ9dmcoKSxuPXRbdC5sZW5ndGgtMl07bD1saTt2YXIgcj1uJiZuLiRwYWdlLm1ldGEuc3RhdHVzQmFyU3R5bGU7ciYmbWkocil9ZWxzZSBpZigiZW5kIiE9PWUudHlwZXx8ZS5yZXN1bHQpe2lmKCJlbmQiPT09ZS50eXBlJiZlLnJlc3VsdCl7dmFyIGk9dmcoKSxvPWkubGVuZ3RoLGE9aVtpLmxlbmd0aC0xXTthJiZhLiRyZW1vdmUoKSxtaSgpLGEmJjE9PT1vJiYodT1hLGRnLnJlYWxFbnRyeVBhZ2VQYXRoJiZ1LiRwYWdlLnJvdXRlPT09ZGcuZW50cnlQYWdlUGF0aCk/KGRnLmVudHJ5UGFnZVBhdGg9ZGcucmVhbEVudHJ5UGFnZVBhdGgsZGVsZXRlIGRnLnJlYWxFbnRyeVBhZ2VQYXRoLHBnLnJlTGF1bmNoKHt1cmw6KHM9ZGcuZW50cnlQYWdlUGF0aCxjPXMsMD09PWMuaW5kZXhPZigiLyIpP3M6Ii8iK3MpfSkpOmFnLmVtaXQoIm9uQXBwUm91dGUiLHt0eXBlOiJuYXZpZ2F0ZUJhY2sifSl9fWVsc2UgbWkobCk7dmFyIHMsYyx1fSl9dmFyIGlzPTIsb3M9e3B1bGxUb1JlZnJlc2g6Im9uUHVsbERvd25SZWZyZXNoIix0aXRsZU5WaWV3U2VhcmNoSW5wdXRDaGFuZ2VkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLHRpdGxlTlZpZXdTZWFyY2hJbnB1dENvbmZpcm1lZDoib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLHRpdGxlTlZpZXdTZWFyY2hJbnB1dENsaWNrZWQ6Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsdGl0bGVOVmlld1NlYXJjaElucHV0Rm9jdXNDaGFuZ2VkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCJ9O2Z1bmN0aW9uIGFzKGUpe0dhPWV9ZnVuY3Rpb24gc3MoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gY3MoZSx0KXt2YXIgbj10P0kodCxzcyk6IiI7cmV0dXJue3BhdGg6ZS5zdWJzdHIoMSkscXVlcnk6bj9uLnN1YnN0cigxKTpufX1mdW5jdGlvbiB1cyhlLHQsbixyKXtpZih2b2lkIDA9PT1yJiYocj17fSksdC5tZXRhLmlzTlZ1ZSl7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gemEobyxlLHQpfSxvPWlzKyssYT1pKCk7YS51bmlQYWdlVXJsPWNzKGUsbiksYS5pc1RhYj0hIXQubWV0YS5pc1RhYkJhcjt2YXIgcz1vZy53ZWJ2aWV3LmNyZWF0ZSgiIixTdHJpbmcobyksYSxPYmplY3QuYXNzaWduKHtudnVlOiEwfSxyKSk7cmV0dXJuIFJzKHMsaSksc31yZXR1cm4gMj09PWlzP29nLndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpOkdhfWZ1bmN0aW9uIGxzKG4sZSx0LHIpe2lmKCIxIj09PW4uaWR8fCFlLm1ldGEuaXNOVnVlKXt2YXIgaT1mdW5jdGlvbigpe3JldHVybiB6YShwYXJzZUludChuLmlkKSwiIixlKX0sbz1pKCk7by51bmlQYWdlVXJsPWNzKHQsciksZS5tZXRhLmlzTlZ1ZT9vLmlzVGFiPSEhZS5tZXRhLmlzVGFiQmFyOm8uZGVidWdSZWZyZXNoPShhPXQsYz1lLHU9KHM9cik/SShzLHNzKToiIix7aXNUYWI6Yy5tZXRhLmlzVGFiQmFyLGFyZ3VtZW50czpKU09OLnN0cmluZ2lmeSh7cGF0aDphLnN1YnN0cigxKSxxdWVyeTp1P3Uuc3Vic3RyKDEpOnV9KX0pLFJzKG4saSksbi5zZXRTdHlsZShvKX12YXIgYSxzLGMsdSxsLGQsZixwLGgsdixnLG0seSxfPWFnLm9uLGI9YWcuZW1pdDtyZXR1cm4gZD1uLChmPShsPWUpLndpbmRvdy5zdWJOVnVlcykmJmYubGVuZ3RoJiZmLmZvckVhY2goZnVuY3Rpb24oZSl7V2EoZSxsLGQpfSksT2JqZWN0LmtleXMob3MpLmZvckVhY2goZnVuY3Rpb24odCl7bi5hZGRFdmVudExpc3RlbmVyKHQsZnVuY3Rpb24oZSl7Yihvc1t0XSxlLHBhcnNlSW50KG4uaWQpKX0pfSksKHA9bikucG9wdXBTdWJOVnVlV2Vidmlld3MmJnAuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7T2JqZWN0LmtleXMocC5wb3B1cFN1Yk5WdWVXZWJ2aWV3cykuZm9yRWFjaChmdW5jdGlvbihlKXtwLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzW2VdLmNsb3NlKCJub25lIil9KX0pLEhhKG4pLCJpT1MiPT09b2cub3MubmFtZSYmKCFuLm52dWUmJihoPW4sdj1hZy5zdWJzY3JpYmUsZz1hZy51bnN1YnNjcmliZSxtPWguaWQseT1mdW5jdGlvbihlLHQpe2lmKG09PT10KXtnKFlhLHkpLHQ9cGFyc2VJbnQodCk7dmFyIG49dmcoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW4pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO24uJHZtLl8kdmQucmVzdG9yZSgpfX0saC5hZGRFdmVudExpc3RlbmVyKCJyZWNvdmVyeSIsZnVuY3Rpb24oZSl7dihZYSx5KX0pKSxycyhuKSksXyhuLmlkKyIuc3RhcnRQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5iZWdpblB1bGxUb1JlZnJlc2goKX0pLF8obi5pZCsiLnN0b3BQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5lbmRQdWxsVG9SZWZyZXNoKCl9KSxufXZhciBkcz17fTtmdW5jdGlvbiBmcyhlLHQpeyhkc1tlXXx8KGRzW2VdPVtdKSkucHVzaCh0KX12YXIgcHM9ITE7ZnVuY3Rpb24gaHModCxlLG4pe3BzPXtwYXRoOnQsbnZ1ZTpmZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT10fSkubWV0YS5pc05WdWUsbmF2aWdhdGU6ZX19ZnVuY3Rpb24gdnMoZSx0LG4pe2lmKG4mJmRnLnNwbGFzaHNjcmVlbiYmZGcuc3BsYXNoc2NyZWVuLmF1dG9jbG9zZSYmIWRnLnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZvZy5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKSwhbiYmcHMpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIldhaXRpbmcgdG8gbmF2aWdhdGUgdG86ICIrcHMucGF0aCsiLCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICIrZSsiLiIpO2lmKCJuYXRpdmUiPT09ZGcucmVuZGVyZXIpcmV0dXJuIDA9PT12ZygpLmxlbmd0aD9ocyhlLHQpOnQoKTt2YXIgcj0hR2F8fEdhJiZHYS5fX3VuaWFwcF9yb3V0ZSxpPUdhJiYhR2EubG9hZGVkO3J8fGk/aHMoZSx0KTp0KCksaSYmZnMoR2EuaWQsZ3MpfWZ1bmN0aW9uIGdzKCl7aWYocHMpe3ZhciBlPXBzLm5hdmlnYXRlO3JldHVybiBwcz0hMSxlKCl9fWZ1bmN0aW9uIG1zKCl7aWYoIm5hdGl2ZSI9PT1kZy5yZW5kZXJlcil7aWYoIXBzKXJldHVybjtyZXR1cm4gcHMubnZ1ZT9ncygpOnZvaWQgMH12YXIgZT0oR2EmJiFHYS5fX3VuaWFwcF9yb3V0ZXx8KEdhPW9nLndlYnZpZXcuY3JlYXRlKG9hLFN0cmluZyhpcysrKSx7Y29udGVudEFkanVzdDohMX0pKSxHYSk7aWYocHMpcmV0dXJuIHBzLm52dWU/Z3MoKTp2b2lkKGUubG9hZGVkP3BzLm5hdmlnYXRlKCk6ZnMoZS5pZCxncykpfXZhciB5cz1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBfcz1oKGZ1bmN0aW9uKGUpe3JldHVybiB5c1tlXSgpfSk7dmFyIGJzPVtdO2Z1bmN0aW9uIHdzKHQsZSl7dmFyIG49ITEscj1kZy5zdWJQYWNrYWdlcztpZihBcnJheS5pc0FycmF5KHIpKXt2YXIgaT1yLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT10LmluZGV4T2YoZS5yb290KX0pO2kmJihuPSEwLGZ1bmN0aW9uKGUsdCl7aWYoLTEhPT1icy5pbmRleE9mKGUpKXJldHVybiB0KCk7U3MoW2VdLGZ1bmN0aW9uKCl7dCgpfSl9KGkucm9vdCxlKSl9bnx8ZSgpfXZhciBrcz0iYXBwLXN1Yi1zZXJ2aWNlLmpzIjtmdW5jdGlvbiBTcyhlLHQpe3ZhciBuLHI7bj1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gYnMucHVzaChlKSxlKyIvIitrc30pLHI9ZnVuY3Rpb24oZSl7dCYmdCghMCl9LGRnLm9uU2VydmljZVJlYWR5KGZ1bmN0aW9uKCl7aWcucmVxdWlyZU1vZHVsZSgicGx1cyIpLmV2YWxKU0ZpbGVzKG4scil9KX12YXIgeHM9T2JqZWN0LmFzc2lnbjt2YXIgQ3M9e3BhdGg6IiIscXVlcnk6e30sc2NlbmU6MTAwMSxyZWZlcnJlckluZm86e2FwcElkOiIiLGV4dHJhRGF0YTp7fX19LFRzPXtwYXRoOiIiLHF1ZXJ5Ont9LHNjZW5lOjEwMDEscmVmZXJyZXJJbmZvOnthcHBJZDoiIixleHRyYURhdGE6e319fTtmdW5jdGlvbiBPcygpe3JldHVybiBDc31mdW5jdGlvbiBFcygpe3ZhciBlPWlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtpZihlLmdldFJlZGlyZWN0SW5mbyl7dmFyIHQ9ZS5nZXRSZWRpcmVjdEluZm8oKXx8e30sbj10LnBhdGgscj10LnF1ZXJ5LGk9dC5leHRyYURhdGEsbz10LnVzZXJBY3Rpb24sYT17YXBwSWQ6dC5mcm9tQXBwaWQsZXh0cmFEYXRhOnt9fTtyZXR1cm4gaSYmKGEuZXh0cmFEYXRhPWkpLHtwYXRoOm58fCIiLHF1ZXJ5OnI/Ij8iK3I6IiIscmVmZXJyZXJJbmZvOmEsdXNlckFjdGlvbjpvfX19dmFyIElzPSExO2Z1bmN0aW9uIEFzKCl7aWYoIUlzKXt2YXIgZSx0O2lmKElzPSEwLGlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRSZWRpcmVjdEluZm8pe3ZhciBuPUVzKCkscj1uLnBhdGgsaT1uLnF1ZXJ5LG89bi5yZWZlcnJlckluZm87ciYmKGU9cix0PWkpLGRnLnJlZmVycmVySW5mbz1vfWVsc2V7dmFyIGE9b2cucnVudGltZS5hcmd1bWVudHM7aWYoIWEpcmV0dXJuO3RyeXt2YXIgcz1KU09OLnBhcnNlKGEpO2U9cy5wYXRofHxzLnBhdGhOYW1lLHQ9cy5xdWVyeT8iPyIrcy5xdWVyeToiIn1jYXRjaChlKXt9fWlmKGUmJmUhPT1kZy5lbnRyeVBhZ2VQYXRoKXt2YXIgYz0iLyIrZSx1PWZnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PWN9KTt1Pyh1Lm1ldGEuaXNUYWJCYXJ8fChkZy5yZWFsRW50cnlQYWdlUGF0aD1kZy5yZWFsRW50cnlQYWdlUGF0aHx8ZGcuZW50cnlQYWdlUGF0aCksZGcuZW50cnlQYWdlUGF0aD1lLGRnLmVudHJ5UGFnZVF1ZXJ5PXQpOmNvbnNvbGUuZXJyb3IoIlt1bmktYXBwXSAiK2UrIiBub3QgZm91bmQuLi4iKX1lbHNlIHQmJihkZy5lbnRyeVBhZ2VRdWVyeT10KX19dmFyICRzPVtdO2Z1bmN0aW9uIFBzKGUpe3JldHVybiBlPyRzLnNsaWNlKDApOiRzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS4kcGFnZS5tZXRhLmlzVGFiQmFyfHxlLiRwYWdlLm1ldGEudmlzaWJsZX0pfXZhciBNcz17fTtmdW5jdGlvbiBqcyhlKXt2YXIgdD1lLnVybCxuPWUucGF0aCxpPWUucXVlcnkscj1lLm9wZW5UeXBlLG89ZS53ZWJ2aWV3LGE9ZS5ldmVudENoYW5uZWw7aWYobyYmQXMoKSxNc1t0XSYmKG89TXNbdF0pLl9fcGFnZV9fKXtpZighUHMoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1vLl9fcGFnZV9ffSkpcmV0dXJuIGEmJihvLl9fcGFnZV9fLmV2ZW50Q2hhbm5lbD1hKSwkcy5wdXNoKG8uX19wYWdlX18pLG87bz1udWxsfXZhciBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09bn0pKSk7InJlTGF1bmNoIj09PXJ8fCFkZy5yZWFsRW50cnlQYWdlUGF0aCYmMD09PVBzKCkubGVuZ3RoP3MubWV0YS5pc1F1aXQ9ITA6cy5tZXRhLmlzVGFiQmFyfHwocy5tZXRhLmlzUXVpdD0hMSksbz8obz1vZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG8uaWQpKS5udnVlPXMubWV0YS5pc05WdWU6bz11cyhuLHMsaSkscy5tZXRhLmlzVGFiQmFyJiYocy5tZXRhLnZpc2libGU9ITApLHMubWV0YS5pc1RhYkJhciYmcXMuYXBwZW5kKG8pO3ZhciBjPSIxIj09PW8uaWQmJm8ubnZ1ZTtscyhvLHMsbixpKTt2YXIgdT1uLnNsaWNlKDEpLGw9e3JvdXRlOm8uX191bmlhcHBfcm91dGU9dSxvcHRpb25zOk9iamVjdC5hc3NpZ24oe30saXx8e30pLCRnZXRBcHBXZWJ2aWV3OmZ1bmN0aW9uKCl7cmV0dXJuIG9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoby5pZCl9LGV2ZW50Q2hhbm5lbDphLCRwYWdlOntpZDpwYXJzZUludChvLmlkKSxtZXRhOnMubWV0YSxwYXRoOm4scm91dGU6dSxmdWxsUGF0aDp0LG9wZW5UeXBlOnJ9LCRyZW1vdmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9JHMuZmluZEluZGV4KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0pOy0xIT09ZSYmKG8ubnZ1ZXx8dGhpcy4kdm0uJGRlc3Ryb3koKSwkcy5zcGxpY2UoZSwxKSl9LHNlbGVjdENvbXBvbmVudDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdm0uc2VsZWN0Q29tcG9uZW50KGUpfSxzZWxlY3RBbGxDb21wb25lbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR2bS5zZWxlY3RBbGxDb21wb25lbnRzKGUpfX07aWYoJHMucHVzaChsKSxvLl9fcHJlbG9hZF9fJiYoby5fX3BhZ2VfXz1sKSxjJiYoZGcuc3BsYXNoc2NyZWVuJiZkZy5zcGxhc2hzY3JlZW4uYXV0b2Nsb3NlJiYhZGcuc3BsYXNoc2NyZWVuLmFsd2F5c1Nob3dCZWZvcmVSZW5kZXImJm9nLm5hdmlnYXRvci5jbG9zZVNwbGFzaHNjcmVlbigpLGRnLm9uUmVhZHkoZnVuY3Rpb24oKXttcygpfSkpLCFvLm52dWUpe3ZhciBkPW8uaWQ7dHJ5e3dzKHUsZnVuY3Rpb24oKXt2YXIgZSx0LG4scjsoZT11LHQ9ZCxuPWkscj1sLHlzW2VdfHxjb25zb2xlLmVycm9yKGUrIiBub3QgZm91bmQiKSxuZXcoX3MoZSkpKHttcFR5cGU6InBhZ2UiLHBhZ2VJZDp0LHBhZ2VQYXRoOmUscGFnZVF1ZXJ5Om4scGFnZUluc3RhbmNlOnJ9KSkuJG1vdW50KCl9KX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX1yZXR1cm4gb312YXIgTHM9ImFwaS5vblRoZW1lQ2hhbmdlIjtmdW5jdGlvbiBCcyhlKXt2b2lkIDA9PT1lJiYoZT1mdW5jdGlvbigpe30pLGFnLm9uKExzLGUpfWZ1bmN0aW9uIE5zKCl7aWYoZGcuZGFya21vZGUpe3ZhciB0PSJkYXJrIj09PW9nLm5hdmlnYXRvci5nZXRVSVN0eWxlKCk/ImxpZ2h0IjoiZGFyayI7bWkodCksUHMoITApLmZvckVhY2goZnVuY3Rpb24oZSl7ZS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlPXR9KX19ZnVuY3Rpb24gRHMoZSl7aWYoZGcuZGFya21vZGUpe3ZhciB0PW9nLm5hdmlnYXRvci5nZXRVSVN0eWxlKCksbj1YcygpO3JldHVybiBuJiZuLmhvc3RUaGVtZSYmKHQ9bi5ob3N0VGhlbWUpLEwoZSxkZy50aGVtZUNvbmZpZyx0KX1yZXR1cm4gZX1mdW5jdGlvbiBScyhyLGkpe2lmKGRnLmRhcmttb2RlKXt2YXIgdD1mdW5jdGlvbigpe3ZhciBlPWkoKSx0PXthbmltYXRpb25BbHBoYUJHQ29sb3I6ZS5hbmltYXRpb25BbHBoYUJHQ29sb3IsYmFja2dyb3VuZDplLmJhY2tncm91bmQsYmFja2dyb3VuZENvbG9yQm90dG9tOmUuYmFja2dyb3VuZENvbG9yQm90dG9tLGJhY2tncm91bmRDb2xvclRvcDplLmJhY2tncm91bmRDb2xvclRvcH0sbj1lLnRpdGxlTlZpZXc7dm9pZCAwIT09biYmKHQudGl0bGVOVmlldz0ib2JqZWN0Ij09dHlwZW9mIG4/e2JhY2tncm91bmRDb2xvcjpuLmJhY2tncm91bmRDb2xvcix0aXRsZUNvbG9yOm4udGl0bGVDb2xvcn06biksciYmci5zZXRTdHlsZShlKX07QnModCksci5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09KGU9dCkmJihlPWZ1bmN0aW9uKCl7fSksdm9pZCBhZy5vZmYoTHMsZSk7dmFyIGV9KX19dmFyIEZzLFVzLHpzPSEwO3ZhciBWcz1bXSxxcz17aWQ6IjAiLGluaXQ6ZnVuY3Rpb24oZSxuKXtlJiZlLmxpc3QubGVuZ3RoJiYoRnM9ZSk7dHJ5e1VzPXBpKCJ1bmktdGFidmlldyIpfWNhdGNoKGUpe2NvbnNvbGUubG9nKCd1bmkucmVxdWlyZU5hdGl2ZVBsdWdpbigidW5pLXRhYnZpZXciKSBlcnJvciAnK2UpfVVzLm9uTWFza0NsaWNrKGZ1bmN0aW9uKCl7VnMuZm9yRWFjaChmdW5jdGlvbihlKXtlKCl9KX0pLFVzJiZVcy5vbkNsaWNrKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXg7bihGcy5saXN0W3RdLHQpfSksVXMmJlVzLm9uTWlkQnV0dG9uQ2xpY2soZnVuY3Rpb24oKXtoaSgib25UYWJCYXJNaWRCdXR0b25UYXAiLHt9KX0pLGZ1bmN0aW9uKHIsaSl7aWYoZGcuZGFya21vZGUpe3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9RHMoaSksdD1lLmxpc3Q7dm9pZCAwPT09dCYmKHQ9W10pO3ZhciBuPXtjb2xvcjplLmNvbG9yLHNlbGVjdGVkQ29sb3I6ZS5zZWxlY3RlZENvbG9yLGJhY2tncm91bmRDb2xvcjplLmJhY2tncm91bmRDb2xvcixib3JkZXJTdHlsZTplLmJvcmRlclN0eWxlfTtyJiZyLnNldFRhYkJhclN0eWxlKG4pLHImJnIuc2V0VGFiQmFySXRlbXMoe2xpc3Q6dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue2ljb25QYXRoOmUuaWNvblBhdGgsc2VsZWN0ZWRJY29uUGF0aDplLnNlbGVjdGVkSWNvblBhdGgsdmlzaWJsZTplLnZpc2libGV9fSl9KX07ZSgpLEJzKGUpfX0oVXMsZSl9LGluZGV4T2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb25maWcsbj10JiZ0Lmxpc3QmJnQubGlzdC5sZW5ndGg7aWYobilmb3IodmFyIHI9MDtyPG47cisrKWlmKHQubGlzdFtyXS5wYWdlUGF0aD09PWV8fHQubGlzdFtyXS5wYWdlUGF0aD09PWUrIi5odG1sIilyZXR1cm4gcjtyZXR1cm4tMX0sc3dpdGNoVGFiOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuaW5kZXhPZihlKTtyZXR1cm4gMDw9dCYmKFVzJiZVcy5zd2l0Y2hTZWxlY3Qoe2luZGV4OnR9KSwhMCl9LHNldFRhYkJhckJhZGdlOmZ1bmN0aW9uKGUsdCxuKXtVcyYmKCJub25lIj09PWU/KFVzLmhpZGVUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSxVcy5yZW1vdmVUYWJCYXJCYWRnZSh7aW5kZXg6dH0pKToidGV4dCI9PT1lP1VzLnNldFRhYkJhckJhZGdlKHtpbmRleDp0LHRleHQ6bn0pOiJyZWREb3QiPT09ZSYmVXMuc2hvd1RhYkJhclJlZERvdCh7aW5kZXg6dH0pKX0sc2V0VGFiQmFySXRlbTpmdW5jdGlvbihlLHQsbixyLGksbyl7dmFyIGEscz17aW5kZXg6ZX07aWYodm9pZCAwIT09dCYmKHMudGV4dD10KSxuJiYocy5pY29uUGF0aD1UaShuKSksciYmKHMuc2VsZWN0ZWRJY29uUGF0aD1UaShyKSksdm9pZCAwIT09byYmKHMuaWNvbmZvbnQ9byksdm9pZCAwIT09aSl7cy52aXNpYmxlPUZzLmxpc3RbZV0udmlzaWJsZT1pLGRlbGV0ZSBzLmluZGV4O3ZhciBjPUZzLmxpc3QubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt2aXNpYmxlOmUudmlzaWJsZX19KTtjW2VdPXMsYT17bGlzdDpjfSxVcyYmVXMuc2V0VGFiQmFySXRlbXMoYSl9ZWxzZSBVcyYmVXMuc2V0VGFiQmFySXRlbShzKX0sc2V0VGFiQmFyU3R5bGU6ZnVuY3Rpb24oZSl7VXMmJlVzLnNldFRhYkJhclN0eWxlKGUpfSxoaWRlVGFiQmFyOmZ1bmN0aW9uKGUpe3pzPSExLFVzJiZVcy5oaWRlVGFiQmFyKHthbmltYXRpb246ZX0pfSxzaG93VGFiQmFyOmZ1bmN0aW9uKGUpe3pzPSEwLFVzJiZVcy5zaG93VGFiQmFyKHthbmltYXRpb246ZX0pfSxhcHBlbmQ6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztVcyYmVXMuYXBwZW5kKHtpZDp0LmlkfSxmdW5jdGlvbihlKXswIT09ZS5jb2RlJiZzZyhmdW5jdGlvbigpe24uYXBwZW5kKHQpfSwyMCl9KX0sZ2V0IGNvbmZpZygpe3JldHVybiBGc3x8ZGcudGFiQmFyfSxnZXQgdmlzaWJsZSgpe3JldHVybiB6c30sZ2V0IGhlaWdodCgpe3ZhciBlPXRoaXMuY29uZmlnO3JldHVybihlJiZlLmhlaWdodD9wYXJzZUZsb2F0KGUuaGVpZ2h0KTo1MCkrb2cubmF2aWdhdG9yLmdldFNhZmVBcmVhSW5zZXRzKCkuZGV2aWNlQm90dG9tfSxnZXQgY292ZXIoKXt2YXIgZT10aGlzLmNvbmZpZztyZXR1cm4gZSYmMDw9WyJleHRyYWxpZ2h0IiwibGlnaHQiLCJkYXJrIl0uaW5kZXhPZihlLmJsdXJFZmZlY3QpfSxzZXRTdHlsZTpmdW5jdGlvbihlKXt2YXIgdD1lLm1hc2s7VXMuc2V0TWFzayh7Y29sb3I6dH0pfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7VnMucHVzaCh0KX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPVZzLmluZGV4T2YodCk7VnMuc3BsaWNlKG4sMSl9fTtmdW5jdGlvbiBXcygpe3ZhciBlLHQsbixyLGk9ImlvcyI9PT1vZy5vcy5uYW1lLnRvTG93ZXJDYXNlKCksbz0oZT1vZy5zY3JlZW4uZ2V0Q3VycmVudFNpemUoKSx0PWUucmVzb2x1dGlvbldpZHRoLG49ZS5yZXNvbHV0aW9uSGVpZ2h0LHtzY3JlZW5XaWR0aDpNYXRoLnJvdW5kKHQpLHNjcmVlbkhlaWdodDpNYXRoLnJvdW5kKG4pfSksYT1vLnNjcmVlbldpZHRoLHM9by5zY3JlZW5IZWlnaHQsYz1xYSgpLHU9e2hlaWdodDowLGNvdmVyOiExfSxsPVNpKCk7aWYobCl7dmFyIGQ9bC5nZXRTdHlsZSgpOyhkPWQmJmQudGl0bGVOVmlldykmJmQudHlwZSYmIm5vbmUiIT09ZC50eXBlJiYodS5oZWlnaHQ9InRyYW5zcGFyZW50Ij09PWQudHlwZT8wOmMrdHQsdS5jb3Zlcj0idHJhbnNwYXJlbnQiPT09ZC50eXBlfHwiZmxvYXQiPT09ZC50eXBlKSxyPWwuZ2V0U2FmZUFyZWFJbnNldHMoKX1lbHNlIHI9b2cubmF2aWdhdG9yLmdldFNhZmVBcmVhSW5zZXRzKCk7dmFyIGY9e2hlaWdodDowLGNvdmVyOiExfTt5aSgpJiYoZi5oZWlnaHQ9cXMudmlzaWJsZT9xcy5oZWlnaHQ6MCxmLmNvdmVyPXFzLmNvdmVyKTt2YXIgcD11LmNvdmVyP3UuaGVpZ2h0OjAsaD1mLmNvdmVyP2YuaGVpZ2h0OjAsdj1zLXUuaGVpZ2h0LWYuaGVpZ2h0LGc9cy0odS5jb3Zlcj8wOnUuaGVpZ2h0KS0oZi5jb3Zlcj8wOmYuaGVpZ2h0KSxtPWE7Zi5oZWlnaHQmJiFmLmNvdmVyfHxyLmJvdHRvbXx8IXIuZGV2aWNlQm90dG9tfHwodi09ci5kZXZpY2VCb3R0b20sZy09ci5kZXZpY2VCb3R0b20pO3ZhciB5PXtsZWZ0OihyPWk/cjp7bGVmdDowLHJpZ2h0OjAsdG9wOnUuaGVpZ2h0JiYhdS5jb3Zlcj8wOmMsYm90dG9tOjB9KS5sZWZ0LHJpZ2h0Om0tci5yaWdodCx0b3A6ci50b3AsYm90dG9tOmctci5ib3R0b20sd2lkdGg6bS1yLmxlZnQtci5yaWdodCxoZWlnaHQ6Zy1yLnRvcC1yLmJvdHRvbX07cmV0dXJue3BpeGVsUmF0aW86b2cuc2NyZWVuLnNjYWxlLHNjcmVlbldpZHRoOmEsc2NyZWVuSGVpZ2h0OnMsd2luZG93V2lkdGg6bSx3aW5kb3dIZWlnaHQ6dixzdGF0dXNCYXJIZWlnaHQ6YyxzYWZlQXJlYTp5LHNhZmVBcmVhSW5zZXRzOnt0b3A6ci50b3AscmlnaHQ6ci5yaWdodCxib3R0b206ci5ib3R0b20sbGVmdDpyLmxlZnR9LHdpbmRvd1RvcDpwLHdpbmRvd0JvdHRvbTpoLHNjcmVlblRvcDpzLXZ9fXZhciBIcz17fSxHcz0hMDtmdW5jdGlvbiBYcygpe2lmKEdzKXt2YXIgZT1pZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0U3lzdGVtSW5mb1N5bmM7aWYoInN0cmluZyI9PXR5cGVvZihIcz1lKCkpKXRyeXtIcz1KU09OLnBhcnNlKEhzKX1jYXRjaChlKXt9cmV0dXJuIEhzfX1mdW5jdGlvbiBKcygpe1hzKCk7dmFyIGU9SHMuZGV2aWNlQnJhbmQ7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PUhzLmRldmljZU1vZGVsLG49SHMub3NOYW1lLHI9SHMub3NWZXJzaW9uLGk9SHMuZGV2aWNlT3JpZW50YXRpb24sbz1Icy5kZXZpY2VUeXBlLGE9SHMuZGV2aWNlSWQscz1lLnRvTG93ZXJDYXNlKCksYz1uLnRvTG93ZXJDYXNlKCk7cmV0dXJue2JyYW5kOnMsZGV2aWNlQnJhbmQ6cyxkZXZpY2VNb2RlbDp0LGRldmljZVBpeGVsUmF0aW86b2cuc2NyZWVuLnNjYWxlLGRldmljZUlkOmEsZGV2aWNlT3JpZW50YXRpb246aSxkZXZpY2VUeXBlOm8sbW9kZWw6dCxwbGF0Zm9ybTpjLHN5c3RlbTooImlvcyI9PT1jPyJpT1MiOiJBbmRyb2lkIikrIiAiK3J9fWZ1bmN0aW9uIFlzKCl7WHMoKTt2YXIgZT1Icy5ob3N0UGFja2FnZU5hbWUsdD1Icy5ob3N0TmFtZSxuPUhzLm9zTGFuZ3VhZ2Uscj1Icy5ob3N0VmVyc2lvbixpPUhzLmhvc3RMYW5ndWFnZSxvPUhzLmhvc3RUaGVtZTtyZXR1cm57YXBwSWQ6SHMuYXBwSWQsYXBwTmFtZTpIcy5hcHBOYW1lLGFwcFZlcnNpb246SHMuYXBwVmVyc2lvbixhcHBWZXJzaW9uQ29kZTpIcy5hcHBWZXJzaW9uQ29kZSxhcHBXZ3RWZXJzaW9uOkhzLmFwcFdndFZlcnNpb24sYXBwTGFuZ3VhZ2U6cGcmJnBnLmdldExvY2FsZT9wZy5nZXRMb2NhbGUoKTppLGVuYWJsZURlYnVnOiExLGhvc3RTREtWZXJzaW9uOnZvaWQgMCxob3N0UGFja2FnZU5hbWU6ZSxob3N0TmFtZTp0LGhvc3RWZXJzaW9uOnIsaG9zdExhbmd1YWdlOmksaG9zdFRoZW1lOm8saG9zdEZvbnRTaXplU2V0dGluZzp2b2lkIDAsbGFuZ3VhZ2U6bixTREtWZXJzaW9uOiIiLHRoZW1lOm9nLm5hdmlnYXRvci5nZXRVSVN0eWxlKCksdmVyc2lvbjpvZy5ydW50aW1lLmlubmVyVmVyc2lvbn19ZnVuY3Rpb24gS3MoKXtHcz0hMCxYcygpLEdzPSExO3ZhciBlPVdzKCksdD1KcygpLG49WXMoKTtHcz0hMDt2YXIgcj17ZXJyTXNnOiJnZXRTeXN0ZW1JbmZvOm9rIixmb250U2l6ZVNldHRpbmc6bi5ob3N0Rm9udFNpemVTZXR0aW5nLG9zTmFtZTpIcy5vc05hbWUudG9Mb3dlckNhc2UoKX07SHMuaG9zdE5hbWUmJihyLmhvc3RTREtWZXJzaW9uPUhzLnVuaVJ1bnRpbWVWZXJzaW9uKTt2YXIgaSxvLGE9T2JqZWN0LmFzc2lnbih7fSxIcyxlLHQsbixyKTtyZXR1cm4gZGVsZXRlIGEuc2NyZWVuVG9wLGRlbGV0ZSBhLmVuYWJsZURlYnVnLGRnLmRhcmttb2RlfHxkZWxldGUgYS50aGVtZSxvPXt9LFQoaT1hKSYmT2JqZWN0LmtleXMoaSkuc29ydCgpLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT1pW2VdfSksT2JqZWN0LmtleXMobyk/bzppfWZ1bmN0aW9uIFpzKCl7dmFyIGU9KDAsaWcucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldEFwcEF1dGhvcml6ZVNldHRpbmcpKCk7dHJ5eyJzdHJpbmciPT10eXBlb2YgZSYmKGU9SlNPTi5wYXJzZShlKSl9Y2F0Y2goZSl7fWZvcih2YXIgdCBpbiBlKXtpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKSJ1bmRlZmluZWQiPT09ZVt0XSYmKGVbdF09dm9pZCAwKX1yZXR1cm4gZX12YXIgUXM9InVuaWFwcF9zYXZlIixlYz0iX2RvYy8iK1FzO2Z1bmN0aW9uIHRjKHQsbil7bj1ufHxmdW5jdGlvbigpe30sb2cuaW8ucmVxdWVzdEZpbGVTeXN0ZW0ob2cuaW8uUFJJVkFURV9ET0MsZnVuY3Rpb24oZSl7ZS5yb290LmdldERpcmVjdG9yeShRcyx7Y3JlYXRlOiEwfSx0LG4pfSxuKX12YXIgbmM9MDt2YXIgcmM9QmkoImlvIiwiZ2V0RmlsZUluZm8iKTt2YXIgaWM9ImNob29zZUxvY2F0aW9uIjt2YXIgb2M9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlTG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1vZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSxyPW9nLndlYnZpZXcuY3JlYXRlKCJfd3d3L19fdW5pYXBwY2hvb3NlbG9jYXRpb24uaHRtbCIsZ28se3RpdGxlTlZpZXc6e2F1dG9CYWNrQnV0dG9uOiEwLGJhY2tncm91bmRDb2xvcjoiIzAwMDAwMCIsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OiLpgInmi6nkvY3nva4iLHRpdGxlU2l6ZToiMTdweCIsYnV0dG9uczpbe2Zsb2F0OiJyaWdodCIsdGV4dDoi5a6M5oiQIixmb250U2l6ZToiMTdweCIsd2lkdGg6IjYwcHgiLG9uY2xpY2s6ZnVuY3Rpb24oKXtyLmV2YWxKUygiX19jaG9vc2VMb2NhdGlvbkNvbmZpcm1fXygpIil9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSx7X191bmlhcHBfdHlwZToibWFwIixfX3VuaWFwcF9zdGF0dXNiYXJfc3R5bGU6biwidW5pLWFwcCI6Im5vbmUifSk7ImRhcmsiPT09biYmKG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxyLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P29nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8b2cubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpO3ZhciBpLG89MCxhPWZ1bmN0aW9uKCl7Mj09KytvJiZyLmV2YWxKUygiX19jaG9vc2VMb2NhdGlvbl9fKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiKX07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWQiLGEpLHIuc2hvdygic2xpZGUtaW4tYm90dG9tIixuYSxhKSxyLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixmdW5jdGlvbigpe2k/ZmkodCx7bmFtZTppLnBvaW5hbWUsYWRkcmVzczppLnBvaWFkZHJlc3MsbGF0aXR1ZGU6aS5sYXRsbmcubGF0LGxvbmdpdHVkZTppLmxhdGxuZy5sbmcsZXJyTXNnOiJjaG9vc2VMb2NhdGlvbjpvayJ9KToodmEoaWMpLGZpKHQse2Vyck1zZzoiY2hvb3NlTG9jYXRpb246ZmFpbCBjYW5jZWwifSkpfSksZ2EoaWMsZnVuY3Rpb24oZSl7ZSYmImxhdGxuZyJpbiBlJiYoaT1lKX0sITEpfX0pO3ZhciBhYz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VMb2NhdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0obj1vZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09bnx8Im51bGwiPT09bj9uPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PW4mJihuPSJkYXJrIiksbiksbz0kYSh7dXJsOiJfX3VuaWFwcGNob29zZWxvY2F0aW9uIixkYXRhOk9iamVjdC5hc3NpZ24oe30sZSx7bG9jYWxlOnN0KCl9KSxzdHlsZTp7YW5pbWF0aW9uVHlwZTplLmFuaW1hdGlvblR5cGV8fCJzbGlkZS1pbi1ib3R0b20iLHRpdGxlTlZpZXc6ITEscG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSJ9LG9uTWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgdD1lLmV2ZW50LG49ZS5kZXRhaWw7InNlbGVjdGVkIj09PXQmJigocj1uKS5lcnJNc2c9ImNob29zZUxvY2F0aW9uOm9rIil9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtpJiZvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxmaSh0LHJ8fHtlcnJNc2c6ImNob29zZUxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pfX0pO2kmJihvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksby53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P29nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8b2cubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfX0pO2Z1bmN0aW9uIHNjKGUsdCxuKXt2YXIgcixpPXQuY29vcmRzO2UhPT10LmNvb3Jkc1R5cGUmJigid2dzODQiPT09ZT9yPWZ1bmN0aW9uKGUsdCl7aWYoUGkoZT0rZSx0PSt0KSlyZXR1cm5bZSx0XTt2YXIgbj1BaShlLTEwNSx0LTM1KSxyPSRpKGUtMTA1LHQtMzUpLGk9dC8xODAqT2ksbz1NYXRoLnNpbihpKTtvPTEtSWkqbypvO3ZhciBhPU1hdGguc3FydChvKTtyZXR1cm4gbj0xODAqbi8oRWkqKDEtSWkpLyhvKmEpKk9pKSxbMiplLShlKyhyPTE4MCpyLyhFaS9hKk1hdGguY29zKGkpKk9pKSkpLDIqdC0odCtuKV19KGkubG9uZ2l0dWRlLGkubGF0aXR1ZGUpOiJnY2owMiI9PT1lJiYocj1mdW5jdGlvbihlLHQpe2lmKFBpKGU9K2UsdD0rdCkpcmV0dXJuW2UsdF07dmFyIG49QWkoZS0xMDUsdC0zNSkscj0kaShlLTEwNSx0LTM1KSxpPXQvMTgwKk9pLG89TWF0aC5zaW4oaSk7bz0xLUlpKm8qbzt2YXIgYT1NYXRoLnNxcnQobyk7cmV0dXJuIG49MTgwKm4vKEVpKigxLUlpKS8obyphKSpPaSksW2UrKHI9MTgwKnIvKEVpL2EqTWF0aC5jb3MoaSkqT2kpKSx0K25dfShpLmxvbmdpdHVkZSxpLmxhdGl0dWRlKSksciYmKGkubG9uZ2l0dWRlPXJbMF0saS5sYXRpdHVkZT1yWzFdKSk7Zmkobix7dHlwZTplLGFsdGl0dWRlOmkuYWx0aXR1ZGV8fDAsbGF0aXR1ZGU6aS5sYXRpdHVkZSxsb25naXR1ZGU6aS5sb25naXR1ZGUsc3BlZWQ6aS5zcGVlZCxhY2N1cmFjeTppLmFjY3VyYWN5LGFkZHJlc3M6dC5hZGRyZXNzLGVyck1zZzoiZ2V0TG9jYXRpb246b2sifSl9dmFyIGNjPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Mb2NhdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1vZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSxuPW9nLndlYnZpZXcuY3JlYXRlKCJfd3d3L19fdW5pYXBwb3BlbmxvY2F0aW9uLmh0bWwiLGdvLHt0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0aXRsZUNvbG9yOiIjZmZmZmZmIix0aXRsZVRleHQ6IiIsdGl0bGVTaXplOiIxN3B4Iix0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSx7X191bmlhcHBfdHlwZToibWFwIixfX3VuaWFwcF9zdGF0dXNiYXJfc3R5bGU6dCwidW5pLWFwcCI6Im5vbmUifSk7cmV0dXJuImxpZ2h0Ij09PXQmJihvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxuLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P29nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKToiZW5kIiE9PXR8fG58fG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpfSkpLG4uc2hvdyh0YSxuYSxmdW5jdGlvbigpe24uZXZhbEpTKCJfX29wZW5Mb2NhdGlvbl9fKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiKX0pLHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpvayJ9fX0pO3ZhciB1Yz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJGEoe3VybDoiX191bmlhcHBvcGVubG9jYXRpb24iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHtsb2NhbGU6c3QoKX0pLHN0eWxlOnt0aXRsZU5WaWV3Ont0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25DbG9zZTpmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoib3BlbkxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pfX0pLHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpvayJ9fX0pO3ZhciBsYz1bXSxkYz1bXSxmYz0hMSxwYz0wO3ZhciBoYyx2YyxnYyxtYyx5Yzt2YXIgX2MsYmMsd2M9QmkoImlvIiwiZ2V0SW1hZ2VJbmZvIixmdW5jdGlvbihlKXtyZXR1cm4gZS5zYXZlUGF0aD1lLmZpbGVuYW1lPXlvKyIvZG93bmxvYWQvIixlfSksa2M9QmkoImlvIiwiZ2V0VmlkZW9JbmZvIixmdW5jdGlvbihlKXtyZXR1cm4gZS5maWxlUGF0aD1lLnNyYyxlfSxmdW5jdGlvbihlKXtyZXR1cm57b3JpZW50YXRpb246ZS5vcmllbnRhdGlvbix0eXBlOmUudHlwZSxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLzEwMjQsaGVpZ2h0OmUuaGVpZ2h0LHdpZHRoOmUud2lkdGgsZnBzOmUuZnBzfHwzMCxiaXRyYXRlOmUuYml0cmF0ZX19KTt2YXIgU2M9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD17fSksaGkoIm9uUmVjb3JkZXJTdGF0ZUNoYW5nZSIsT2JqZWN0LmFzc2lnbih7c3RhdGU6ZX0sdCkpfSx4Yz17c3RhcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmR1cmF0aW9uO3ZvaWQgMD09PW4mJihuPTZlNCk7dmFyIHI9ZS5zYW1wbGVSYXRlLGk9KGUubnVtYmVyT2ZDaGFubmVscyxlLmVuY29kZUJpdFJhdGUsZS5mb3JtYXQpO3ZvaWQgMD09PWkmJihpPSJtcDMiKTtlLmZyYW1lU2l6ZTt2YXIgbz1lLmF1ZGlvU291cmNlO2lmKHZvaWQgMD09PW8mJihvPSJhdXRvIiksX2MpcmV0dXJuIFNjKCJzdGFydCIpOyhfYz1vZy5hdWRpby5nZXRSZWNvcmRlcigpKS5yZWNvcmQoe2Zvcm1hdDppLHNhbXBsZXJhdGU6cixmaWxlbmFtZTp5bysiL3JlY29yZGVyLyJ9LGZ1bmN0aW9uKGUpe3JldHVybiBTYygic3RvcCIse3RlbXBGaWxlUGF0aDplfSl9LGZ1bmN0aW9uKGUpe3JldHVybiBTYygiZXJyb3IiLHtlcnJNc2c6ZS5tZXNzYWdlfSl9KSxiYz1zZyhmdW5jdGlvbigpe3hjLnN0b3AoKX0sbiksU2MoInN0YXJ0Iil9LHN0b3A6ZnVuY3Rpb24oKXtfYyYmKF9jLnN0b3AoKSxfYz0hMSxiYyYmY2coYmMpKX0scGF1c2U6ZnVuY3Rpb24oKXtfYyYmU2MoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHBhdXNlIn0pfSxyZXN1bWU6ZnVuY3Rpb24oKXtfYyYmU2MoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHJlc3VtZSJ9KX19O3ZhciBDYz0wLFRjPXt9LE9jPWZ1bmN0aW9uKGUpe2hpKCJvbkRvd25sb2FkVGFza1N0YXRlQ2hhbmdlIixlKX07dmFyIEVjPTAsSWM9e30sQWM9ZnVuY3Rpb24oZSl7aGkoIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZSksZGVsZXRlIEljW0VjXX0sJGM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZVsiU2V0LUNvb2tpZSJdfHxlWyJzZXQtY29va2llIl0sbj1bXTtpZighdClyZXR1cm5bXTsiWyI9PT10WzBdJiYiXSI9PT10W3QubGVuZ3RoLTFdJiYodD10LnNsaWNlKDEsLTEpKTtmb3IodmFyIHI9dC5zcGxpdCgiOyIpLGk9MDtpPHIubGVuZ3RoO2krKyktMSE9PXJbaV0uaW5kZXhPZigiRXhwaXJlcz0iKXx8LTEhPT1yW2ldLmluZGV4T2YoImV4cGlyZXM9Iik/bi5wdXNoKHJbaV0ucmVwbGFjZSgiLCIsIiIpKTpuLnB1c2gocltpXSk7cmV0dXJuIG49bi5qb2luKCI7Iikuc3BsaXQoIiwiKX07ZnVuY3Rpb24gUGMoYyxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS51cmwsbj1lLmRhdGEscj1lLmhlYWRlcixpPWUubWV0aG9kO3ZvaWQgMD09PWkmJihpPSJHRVQiKTt2YXIgdT1lLnJlc3BvbnNlVHlwZSxvPWUuc3NsVmVyaWZ5O3ZvaWQgMD09PW8mJihvPSEwKTt2YXIgYT1lLmZpcnN0SXB2NDt2b2lkIDA9PT1hJiYoYT0hMSk7dmFyIHM9ZS50bHMsbD1lLnRpbWVvdXQ7dm9pZCAwPT09bCYmKGw9ZGcubmV0d29ya1RpbWVvdXQmJmRnLm5ldHdvcmtUaW1lb3V0LnJlcXVlc3R8fDZlNCk7dmFyIGQsZixwPXBpKCJzdHJlYW0iKSxoPXt9LHY9ITE7Zm9yKHZhciBnIGluIHIpaWYodnx8ImNvbnRlbnQtdHlwZSIhPT1nLnRvTG93ZXJDYXNlKCkpaFtnXT1yW2ddO2Vsc2UgaWYodj0hMCxoWyJDb250ZW50LVR5cGUiXT1yW2ddLCJHRVQiIT09aSYmMD09PXJbZ10uaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJiJzdHJpbmciIT10eXBlb2YgbiYmIShuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXt2YXIgbT1bXTtmb3IodmFyIHkgaW4gbilrKG4seSkmJm0ucHVzaChlbmNvZGVVUklDb21wb25lbnQoeSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuW3ldKSk7bj1tLmpvaW4oIiYiKX12fHwiUE9TVCIhPT1pfHwoaFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIpLGwmJihkPXNnKGZ1bmN0aW9uKCl7Zj0hMCxBYyh7cmVxdWVzdFRhc2tJZDpjLHN0YXRlOiJmYWlsIixzdGF0dXNDb2RlOjAsZXJyTXNnOiJ0aW1lb3V0In0pfSxsKzIwMCkpO3ZhciBfLGI9e21ldGhvZDppLHVybDp0LnRyaW0oKSxoZWFkZXJzOmgsdHlwZToiYXJyYXlidWZmZXIiPT09dT8iYmFzZTY0IjoidGV4dCIsdGltZW91dDpsfHw2ZTUsc3NsVmVyaWZ5OiFvLGZpcnN0SXB2NDphLHRsczpzfTsiR0VUIiE9PWkmJigiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dG9TdHJpbmcuY2FsbChuKT9fPSEwOmIuYm9keT0ic3RyaW5nIj09dHlwZW9mIG4/bjpKU09OLnN0cmluZ2lmeShuKSk7dmFyIHc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vayxuPWUuc3RhdHVzLHI9ZS5kYXRhLGk9ZS5oZWFkZXJzLG89ZS5lcnJvck1zZztpZighZil7ZCYmY2coZCk7dmFyIGE9bjtpZigwPGEpQWMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToic3VjY2VzcyIsZGF0YTp0JiYiYXJyYXlidWZmZXIiPT09dT9faShyKTpyLHN0YXR1c0NvZGU6YSxoZWFkZXI6aSxjb29raWVzOiRjKGkpfSk7ZWxzZXt2YXIgcz0iYWJvcnQgc3RhdHVzQ29kZToiK2E7byYmKHM9cysiICIrbyksQWMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTphLGVyck1zZzpzfSl9fX07dHJ5e18/cC5mZXRjaFdpdGhBcnJheUJ1ZmZlcih7IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6Ymkobil9LGIsdyk6cC5mZXRjaChiLHcpLEljW2NdPXthYm9ydDpmdW5jdGlvbigpe2Y9ITAsZCYmY2coZCksQWMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTowLGVyck1zZzoiYWJvcnQifSl9fX1jYXRjaChlKXtyZXR1cm57cmVxdWVzdFRhc2tJZDpjLGVyck1zZzoiY3JlYXRlUmVxdWVzdFRhc2s6ZmFpbCJ9fXJldHVybntyZXF1ZXN0VGFza0lkOmMsZXJyTXNnOiJjcmVhdGVSZXF1ZXN0VGFzazpvayJ9fXZhciBNYyxqYz17fSxMYz1mdW5jdGlvbihlKXtoaSgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGUpfTt2YXIgQmM9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD17fSk7dmFyIG49dC51cmwscj0odC5kYXRhLHQuaGVhZGVyKSxpPSh0Lm1ldGhvZCx0LnByb3RvY29scyksbz1NY3x8KChNYz1waSgidW5pLXdlYlNvY2tldCIpKS5vbm9wZW4oZnVuY3Rpb24oZSl7TGMoe3NvY2tldFRhc2tJZDplLmlkLHN0YXRlOiJvcGVuIn0pfSksTWMub25tZXNzYWdlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTtMYyh7c29ja2V0VGFza0lkOmUuaWQsc3RhdGU6Im1lc3NhZ2UiLGRhdGE6Im9iamVjdCI9PXR5cGVvZiB0P19pKHQuYmFzZTY0KTp0fSl9KSxNYy5vbmVycm9yKGZ1bmN0aW9uKGUpe0xjKHtzb2NrZXRUYXNrSWQ6ZS5pZCxzdGF0ZToiZXJyb3IiLGVyck1zZzplLmRhdGF9KX0pLE1jLm9uY2xvc2UoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZCxuPWUuY29kZSxyPWUucmVhc29uO2RlbGV0ZSBqY1t0XSxMYyh7c29ja2V0VGFza0lkOnQsc3RhdGU6ImNsb3NlIixjb2RlOm4scmVhc29uOnJ9KX0pLE1jKTtyZXR1cm4gby5XZWJTb2NrZXQoe2lkOmUsdXJsOm4scHJvdG9jb2w6QXJyYXkuaXNBcnJheShpKT9pLmpvaW4oIiwiKTppLGhlYWRlcjpyfSksamNbZV09byx7c29ja2V0VGFza0lkOmUsZXJyTXNnOiJjcmVhdGVTb2NrZXRUYXNrOm9rIn19O3ZhciBOYz0wLERjPXt9LFJjPWZ1bmN0aW9uKGUpe2hpKCJvblVwbG9hZFRhc2tTdGF0ZUNoYW5nZSIsZSl9O3ZhciBGYyxVYz17b2F1dGg6ZnVuY3Rpb24odCl7b2cub2F1dGguZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIG49W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7bi5wdXNoKHQpfSksdChudWxsLG4sZSl9LGZ1bmN0aW9uKGUpe3QoZSl9KX0sc2hhcmU6ZnVuY3Rpb24odCl7b2cuc2hhcmUuZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIG49W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7bi5wdXNoKHQpfSksdChudWxsLG4sZSl9LGZ1bmN0aW9uKGUpe3QoZSl9KX0scGF5bWVudDpmdW5jdGlvbih0KXtvZy5wYXltZW50LmdldENoYW5uZWxzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHB1c2g6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09aWd8fHZvaWQgMCE9PW9nKXt2YXIgdD1vZy5wdXNoLmdldENsaWVudEluZm8oKTtlKG51bGwsW3QuaWRdLFt0XSl9ZWxzZSBlKG51bGwsW10pfX07ZnVuY3Rpb24gemMoaSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7b2cub2F1dGguZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkPT09aX0pO3Q/bih0KTpyKG5ldyBFcnJvcigicHJvdmlkZXIgbm90IGZpbmQiKSl9LHIpfSl9ZnVuY3Rpb24gVmMobixyLGUpe3ZvaWQgMD09PWUmJihlPSEwKTt2YXIgaT1uLnByb3ZpZGVyfHwid2VpeGluIixvPUtjKHIsImxvZ2luIixlKSxhPSJhcHBsZSI9PT1pLHM9YT97c2NvcGU6ImVtYWlsIn06bi51bml2ZXJpZnlTdHlsZT97dW5pdmVyaWZ5U3R5bGU6ZnVuY3Rpb24oZSxyKXtUKGUpJiZUKGUuYnV0dG9ucykmJiJBcnJheSI9PT1wKGUuYnV0dG9ucy5saXN0KSYmZS5idXR0b25zLmxpc3QuZm9yRWFjaChmdW5jdGlvbih0LG4pe2UuYnV0dG9ucy5saXN0W25dLm9uY2xpY2s9ZnVuY3Rpb24oKXt2YXIgZT17Y29kZToiMzAwMDgiLG1lc3NhZ2U6IueUqOaIt+eCueWHu+S6huiHquWumuS5ieaMiemSriIsaW5kZXg6bixwcm92aWRlcjp0LnByb3ZpZGVyfTtUKEZjKT9GYy5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljayhlKTpIYygpLnRoZW4oZnVuY3Rpb24oKXtyKGUpfSl9fSk7cmV0dXJuIGV9KG4udW5pdmVyaWZ5U3R5bGUsbyl9Ont9LGM9ZT9maTpNLmludm9rZTt6YyhpKS50aGVuKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtuLm9ubHlBdXRob3JpemUmJiJ3ZWl4aW4iPT09aT9lLmF1dGhvcml6ZShmdW5jdGlvbihlKXt2YXIgdD1lLmNvZGU7YyhyLHtjb2RlOnQsYXV0aFJlc3VsdDoiIixlcnJNc2c6ImxvZ2luOm9rIn0pfSxvKTplLmxvZ2luKGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LmF1dGhSZXN1bHQsbj1lLnRhcmdldC5hcHBsZUluZm87YyhyLHtjb2RlOnQuY29kZSxhdXRoUmVzdWx0OnQsYXBwbGVJbmZvOm4sZXJyTXNnOiJsb2dpbjpvayJ9KX0sbyxzKX1hfHwidW5pdmVyaWZ5Ij09PWk/dCgpOmUubG9nb3V0KHQsdCl9KS5jYXRjaChvKX1mdW5jdGlvbiBxYyhhLHMpe3ZhciBjPWEucHJvdmlkZXJ8fCJ3ZWl4aW4iLGU9TGkocywib3BlcmF0ZVdYRGF0YSIpO3pjKGMpLnRoZW4oZnVuY3Rpb24obyl7by5nZXRVc2VySW5mbyhmdW5jdGlvbihlKXt2YXIgdDtpZigid2VpeGluIj09PWMpe3ZhciBuPW8udXNlckluZm87dD17b3BlbklkOm4ub3BlbmlkLG5pY2tOYW1lOm4ubmlja25hbWUsZ2VuZGVyOm4uc2V4LGNpdHk6bi5jaXR5LHByb3ZpbmNlOm4ucHJvdmluY2UsY291bnRyeTpuLmNvdW50cnksYXZhdGFyVXJsOm4uaGVhZGltZ3VybCx1bmlvbklkOm4udW5pb25pZH19ZWxzZSBpZigiYXBwbGUiPT09Yyl7dmFyIHI9by5hcHBsZUluZm87dD17b3BlbklkOnIudXNlcixmdWxsTmFtZTpyLmZ1bGxOYW1lLGVtYWlsOnIuZW1haWwsYXV0aG9yaXphdGlvbkNvZGU6ci5hdXRob3JpemF0aW9uQ29kZSxpZGVudGl0eVRva2VuOnIuaWRlbnRpdHlUb2tlbixyZWFsVXNlclN0YXR1czpyLnJlYWxVc2VyU3RhdHVzfX1lbHNlKHQ9by51c2VySW5mbykub3BlbklkPXQub3BlbklkfHx0Lm9wZW5pZHx8by5hdXRoUmVzdWx0Lm9wZW5pZCx0Lm5pY2tOYW1lPXQubmlja05hbWV8fHQubmlja25hbWUsdC5hdmF0YXJVcmw9dC5hdmF0YXJVcmx8fHQuaGVhZGltZ3VybDt2YXIgaT17ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOm9rIn07YS5kYXRhJiYid2ViYXBpX2dldHVzZXJpbmZvIj09PWEuZGF0YS5hcGlfbmFtZT9pLmRhdGE9e2RhdGE6SlNPTi5zdHJpbmdpZnkodCkscmF3RGF0YToiIixzaWduYXR1cmU6IiIsZW5jcnlwdGVkRGF0YToiIixpdjoiIn06aS51c2VySW5mbz10LGZpKHMsaSl9LGUpfSkuY2F0Y2goZnVuY3Rpb24oKXtmaShzLHtlcnJNc2c6Im9wZXJhdGVXWERhdGE6ZmFpbCDor7flhYjosIPnlKggdW5pLmxvZ2luIn0pfSl9ZnVuY3Rpb24gV2MoZSx0LG4pe3ZhciByPVljKHQsInByZUxvZ2luIixuKSxpPUtjKHQsInByZUxvZ2luIixuKTt6YyhlLnByb3ZpZGVyKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLnByZUxvZ2luKHIsaSl9KS5jYXRjaChpKX1mdW5jdGlvbiBIYygpe3JldHVybiB6YygidW5pdmVyaWZ5IikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9zZUF1dGhWaWV3KCl9KX1mdW5jdGlvbiBHYyhlLHQsbil7dmFyIHI9WWModCwiZ2V0Q2hlY2tCb3hTdGF0ZSIsbiksaT1LYyh0LCJnZXRDaGVja0JveFN0YXRlIixuKTt0cnl7emMoInVuaXZlcmlmeSIpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRDaGVja0JveFN0YXRlKCk7cih7c3RhdGU6dH0pfSl9Y2F0Y2goZSl7aShlKX19dmFyIFhjLEpjPWZ1bmN0aW9uKCl7dGhpcy5wcm92aWRlcj0idW5pdmVyaWZ5Iix0aGlzLmV2ZW50TmFtZT0iYXBpLnVuaXZlcmlmeUJ1dHRvbnNDbGljayJ9O2Z1bmN0aW9uIFljKHQsbixlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITApLGU/amkodCxuKTpmdW5jdGlvbihlKXtNLmludm9rZSh0LE9iamVjdC5hc3NpZ24oe30sZSx7ZXJyTXNnOm4rIjpvayJ9KSl9fWZ1bmN0aW9uIEtjKHIsaSxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITApLGU/TGkocixpKTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvZGU7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49ZS5tZXNzYWdlO00uaW52b2tlKHIse2Vyck1zZzppKyI6ZmFpbCAiKyhufHwiIiksZXJyQ29kZTp0LGNvZGU6dH0pfX1KYy5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtIYygpfSxKYy5wcm90b3R5cGUubG9naW49ZnVuY3Rpb24oZSl7dGhpcy5fd2FycChmdW5jdGlvbihlLHQpe3JldHVybiBWYyhlLHQsITEpfSxlKX0sSmMucHJvdG90eXBlLmdldENoZWNrQm94U3RhdGU9ZnVuY3Rpb24oZSl7dGhpcy5fd2FycChmdW5jdGlvbihlLHQpe3JldHVybiBHYygwLHQsITEpfSxlKX0sSmMucHJvdG90eXBlLnByZUxvZ2luPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gV2MoZSx0LCExKX0sZSl9LEpjLnByb3RvdHlwZS5vbkJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXthZy5vbih0aGlzLmV2ZW50TmFtZSxlKX0sSmMucHJvdG90eXBlLm9mZkJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXthZy5vZmYodGhpcy5ldmVudE5hbWUsZSl9LEpjLnByb3RvdHlwZS5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXthZy5lbWl0KHRoaXMuZXZlbnROYW1lLGUpfSxKYy5wcm90b3R5cGUuX3dhcnA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTS53YXJwKGUpKHRoaXMuX2dldE9wdGlvbnModCkpfTt2YXIgWmMsUWM9IShKYy5wcm90b3R5cGUuX2dldE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxPYmplY3QuYXNzaWduKHt9LGUse3Byb3ZpZGVyOnRoaXMucHJvdmlkZXJ9KX0pLGV1PSExO2Z1bmN0aW9uIHR1KGUpe3JldHVybiBpZy5yZXF1aXJlTW9kdWxlKGUpfXZhciBudT17MDp7bmFtZToid2ViIix0aXRsZToi5Zu+5paHIn0sMTp7bmFtZToidGV4dCIsdGl0bGU6Iue6r+aWh+WtlyJ9LDI6e25hbWU6ImltYWdlIix0aXRsZToi57qv5Zu+54mHIn0sMzp7bmFtZToibXVzaWMiLHRpdGxlOiLpn7PkuZAifSw0OntuYW1lOiJ2aWRlbyIsdGl0bGU6IuinhumikSJ9LDU6e25hbWU6Im1pbmlQcm9ncmFtIix0aXRsZToi5bCP56iL5bqPIn19LHJ1PWZ1bmN0aW9uKGUsdCxuKXtlLnR5cGU9ZS50eXBlfHwwO3ZhciByPWUucHJvdmlkZXIsaT1lLnR5cGUsbz1lLnRpdGxlLGE9ZS5zdW1tYXJ5LHM9ZS5ocmVmLGM9ZS5pbWFnZVVybCx1PWUubWVkaWFVcmwsbD1lLnNjZW5lLGQ9ZS5taW5pUHJvZ3JhbSxmPWUub3BlbkN1c3RvbWVyU2VydmljZUNoYXQscD1lLmNvcnBpZCxoPWUuY3VzdG9tZXJVcmw7InN0cmluZyI9PXR5cGVvZiBjJiZjJiYoYz1UaShjKSk7dmFyIHY9bnVbaSsiIl07aWYodil7dmFyIGc9e3Byb3ZpZGVyOnIsdHlwZTp2Lm5hbWUsdGl0bGU6byxjb250ZW50OmEsaHJlZjpzLHBpY3R1cmVzOltjXSx0aHVtYnM6W2NdLG1lZGlhOnUsbWluaVByb2dyYW06ZCxleHRyYTp7c2NlbmU6bH0sb3BlbkN1c3RvbWVyU2VydmljZUNoYXQ6Zixjb3JwaWQ6cCx1cmw6aH07cmV0dXJuIndlaXhpbiIhPT1yfHwxIT09aSYmMiE9PWl8fGRlbGV0ZSBnLnRodW1icyxnfXJldHVybiLliIbkuqvlj4LmlbAgdHlwZSDkuI3mraPnoa4ifSxpdT1mdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj0ic2hhcmUiKTt2YXIgaT1MaShuLHIpLG89dC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdD8ib3BlbkN1c3RvbWVyU2VydmljZUNoYXQiOiJzZW5kIjt0cnl7ZVtvXSh0LGZ1bmN0aW9uKCl7Zmkobix7ZXJyTXNnOnIrIjpvayJ9KX0saSl9Y2F0Y2goZSl7aSh7bWVzc2FnZTp0LnByb3ZpZGVyKyIgIitvKyIg5pa55rOV6LCD55So5aSx6LSlIn0pfX07ZnVuY3Rpb24gb3UobixyLGkpe3ZvaWQgMD09PWkmJihpPSJzaGFyZSIpLG49cnUobik7dmFyIG89TGkocixpKTtpZigic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIGZpKHIse2Vyck1zZzppKyI6ZmFpbCAiK259KTt2YXIgYT1uLnByb3ZpZGVyO29nLnNoYXJlLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWF9KTt0P3QuYXV0aGVudGljYXRlZD9pdSh0LG4scik6dC5hdXRob3JpemUoZnVuY3Rpb24oKXtyZXR1cm4gaXUodCxuLHIpfSxvKTpmaShyLHtlcnJNc2c6aSsiOmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LG8pfWZ1bmN0aW9uIGF1KG4pe24uJHByb2Nlc3NlZD0hMCxuLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKGUpe29nLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3KHt0eXBlOiJVbmlBcHBTdWJOVnVlIixkYXRhOmV9LG4uaWQpfTt2YXIgcj1bXTtpZihuLm9uTWVzc2FnZT1mdW5jdGlvbihlKXtyLnB1c2goZSl9LG4uJGNvbnN1bWVNZXNzYWdlPWZ1bmN0aW9uKHQpe3IuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pfSxuLl9fdW5pYXBwX21hc2tfaWQpe3ZhciBpPW4uX191bmlhcHBfbWFzayxvPSIwIj09PW4uX191bmlhcHBfbWFza19pZD97c2V0U3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXNrO3R1KCJ1bmktdGFidmlldyIpLnNldE1hc2soe2NvbG9yOnR9KX19Om9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQobi5fX3VuaWFwcF9tYXNrX2lkKSxhPW4uc2hvdyxzPW4uaGlkZSxjPW4uY2xvc2UsdT1mdW5jdGlvbigpe28uc2V0U3R5bGUoe21hc2s6Im5vbmUifSl9O24uc2hvdz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gby5zZXRTdHlsZSh7bWFzazppfSksYS5hcHBseShuLGUpfSxuLmhpZGU9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHUoKSxzLmFwcGx5KG4sZSl9LG4uY2xvc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHUoKSxyPVtdLGMuYXBwbHkobixlKX19fWZ1bmN0aW9uIHN1KGUpe3ZhciB0PW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoZSk7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBmaW5kIFN1Yk5WdWUsIGlkPSIrZSk7dCYmIXQuJHByb2Nlc3NlZCYmYXUodCk7dmFyIG49dC5zZXRTdHlsZSxyPW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodC5fX3VuaWFwcF9tYXNrX2lkKTtyZXR1cm4gdC5zZXRTdHlsZT1mdW5jdGlvbihlKXtlJiZlLm1hc2smJihyJiZyLnNldFN0eWxlKHttYXNrOmUubWFza30pLGRlbGV0ZSBlLm1hc2spLG4uY2FsbCh0aGlzLGUpfSx0fXZhciBjdT1bXTtmdW5jdGlvbiB1dShlLHQsbil7cmV0dXJuIGlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZW5kTmF0aXZlRXZlbnQoZSx0LG4pfWFnLm9uKCJhcGkudW5pTVBOYXRpdmVFdmVudCIsZnVuY3Rpb24odCl7Y3UuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQuZXZlbnQsdC5kYXRhKX0pfSk7dmFyIGx1PXV1O3ZhciBkdSxmdT0xLHB1PXt9O2Z1bmN0aW9uIGh1KCl7cmV0dXJuIGR1fHwoZHU9cGcucmVxdWlyZU5hdGl2ZVBsdWdpbigiVVRTLVByb3h5IikpLGR1fWZ1bmN0aW9uIHZ1KGUsdCxuLHIsaSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCLov5Tlm57lgLzkuLrvvJoiK0pTT04uc3RyaW5naWZ5KHQpKyLvvJvor7fmsYLlj4LmlbDkuLrvvJoiK0pTT04uc3RyaW5naWZ5KGUpKTtpZihsKHQpKXRyeXt0PUpTT04ucGFyc2UodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCJKU09OLnBhcnNlKCIrdCsiKTogIitlKX1pZih0LmVyck1zZyl0aHJvdyBuZXcgRXJyb3IodC5lcnJNc2cpO2lmKG4mJiJpbnRlcmZhY2UiPT09bi50eXBlJiYibnVtYmVyIj09dHlwZW9mIHQucGFyYW1zKXtpZighdC5wYXJhbXMpcmV0dXJuIG51bGw7aWYodC5wYXJhbXM9PT1yJiZpKXJldHVybiBpO2lmKEN1W24ub3B0aW9uc10pcmV0dXJuIG5ldyh3dSh5KHtpbnN0YW5jZUlkOnQucGFyYW1zfSxDdVtuLm9wdGlvbnNdKSkpfXJldHVybiB0LnBhcmFtc31mdW5jdGlvbiBndShlKXtpZihlLmVyck1zZyl0aHJvdyBuZXcgRXJyb3IoZS5lcnJNc2cpO3JldHVybiBkZWxldGUgZS5lcnJNc2csdnUoZSxodSgpLmludm9rZVN5bmMoZSxmdW5jdGlvbigpe30pKX1mdW5jdGlvbiBtdShuLGUsaSxvKXt2YXIgdD1lLm1vZHVsZU5hbWUscj1lLm1vZHVsZVR5cGUsYT1lLnBhY2thZ2Uscz1lLmNsYXNzLGM9ZS5uYW1lLHU9ZS5tZXRob2QsbD1lLmNvbXBhbmlvbixkPWUucGFyYW1zLGY9ZS5yZXR1cm4scD1lLmVyck1zZyxoPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQsbj1lLm5hbWUscj1lLnBhcmFtcyxpPWUua2VlcEFsaXZlLG89cHVbdF07bz8oby5hcHBseSh2b2lkIDAsciksaXx8ZGVsZXRlIHB1W3RdKTpjb25zb2xlLmVycm9yKCIiK2ErcysiLiIrYysiICIrbisiIGlzIG5vdCBmb3VuZCIpfSx2PWk/e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOnIsaWQ6aSxuYW1lOmMsbWV0aG9kOmR9Onttb2R1bGVOYW1lOnQsbW9kdWxlVHlwZTpyLHBhY2thZ2U6YSxjbGFzczpzLG5hbWU6dXx8Yyxjb21wYW5pb246bCxtZXRob2Q6ZH07cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2lmKHApdGhyb3cgbmV3IEVycm9yKHApO3ZhciByPXkoe30sdix7cGFyYW1zOmUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiB0KG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXt2YXIgZT1PYmplY3Qua2V5cyhwdSkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gcHVbZV09PT1ufSkscj1lP3BhcnNlSW50KGUpOmZ1Kys7cmV0dXJuIHB1W3JdPW4scn1yZXR1cm4gVChuKSYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXQobltlXSl9KSxufShlKX0pfSk7cmV0dXJuIG4/bmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtodSgpLmludm9rZUFzeW5jKHIsZnVuY3Rpb24oZSl7InJldHVybiIhPT1lLnR5cGU/aChlKTplLmVyck1zZz9uKGUuZXJyTXNnKTp0KGUucGFyYW1zKX0pfSk6dnUocixodSgpLmludm9rZVN5bmMocixoKSxmLGksbyl9fWZ1bmN0aW9uIHl1KGUsdCl7cmV0dXJuIHQubWFpbiYmIXQubWV0aG9kJiZTdSgpJiYodC5tZXRob2Q9InNfIit0Lm5hbWUpLG11KGUsdCwwKX12YXIgX3U9eXU7ZnVuY3Rpb24gYnUoZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmsodCxlKyJCeUpzIik/ZSsiQnlKcyI6ZX1mdW5jdGlvbiB3dShlKXt2YXIgbixmPWUubW9kdWxlTmFtZSxwPWUubW9kdWxlVHlwZSx0PWUucGFja2FnZSxyPWUuY2xhc3MsaD1lLm1ldGhvZHMsdj1lLnByb3BzLGc9ZS5lcnJNc2csbT17bW9kdWxlTmFtZTpmLG1vZHVsZVR5cGU6cCxwYWNrYWdlOnQsY2xhc3M6cixlcnJNc2c6Z30saT1bXSxzPXt9LGM9W10sbz0hMTt2b2lkIDAhPT1lLmluc3RhbmNlSWQ/KG89ITAsbj1lLmluc3RhbmNlSWQpOihpPWUuY29uc3RydWN0b3IucGFyYW1zLHM9ZS5zdGF0aWNNZXRob2RzLGM9ZS5zdGF0aWNQcm9wcyksU3UoKSYmaS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiJVVFNDYWxsYmFjayI9PT1lLnR5cGV8fDA8ZS50eXBlLmluZGV4T2YoIkpTT05PYmplY3QiKX0pJiZpLnB1c2goe25hbWU6Il9ieUpzIix0eXBlOiJib29sZWFuIn0pO3ZhciB1PXt9O3JldHVybiBuZXcgUHJveHkoZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07aWYodGhpcy5fX2luc3RhbmNlSWQ9MCxnKXRocm93IG5ldyBFcnJvcihnKTt2YXIgdT17fTtpZihvPyJudW1iZXIiPT10eXBlb2YgbiYmKHRoaXMuX19pbnN0YW5jZUlkPW4pOnRoaXMuX19pbnN0YW5jZUlkPW11KCExLHkoe25hbWU6ImNvbnN0cnVjdG9yIixwYXJhbXM6aX0sbSksMCkuYXBwbHkobnVsbCxlKSwhdGhpcy5fX2luc3RhbmNlSWQpdGhyb3cgbmV3IEVycm9yKCJuZXcgIityKyIgaXMgZmFpbGVkIik7dmFyIGw9dGhpcyxkPW5ldyBQcm94eShsLHtnZXQ6ZnVuY3Rpb24oZSx0KXtpZigiX192X3NraXAiPT09dClyZXR1cm4hMDtpZighdVt0XSlpZih0PWJ1KHQsaCksayhoLHQpKXt2YXIgbj1oW3RdLHI9bi5hc3luYyxpPW4ucGFyYW1zLG89bi5yZXR1cm47dVt0XT0oYT0hIXIscz15KHtuYW1lOnQscGFyYW1zOmkscmV0dXJuOm99LG0pLGM9bC5fX2luc3RhbmNlSWQsbXUoYSxzLGMsZCkpfWVsc2UgaWYodi5pbmNsdWRlcyh0KSlyZXR1cm4gZ3Uoe21vZHVsZU5hbWU6Zixtb2R1bGVUeXBlOnAsaWQ6bC5fX2luc3RhbmNlSWQsbmFtZTp0LGVyck1zZzpnfSk7dmFyIGEscyxjO3JldHVybiB1W3RdfX0pO3JldHVybiBkfSx7Z2V0OmZ1bmN0aW9uKGUsdCxuKXtpZih0PWJ1KHQscyksayhzLHQpKXtpZighdVt0XSl7dmFyIHI9c1t0XSxpPXIuYXN5bmMsbz1yLnBhcmFtcyxhPXIucmV0dXJuO3VbdF09eXUoISFpLHkoe25hbWU6dCxjb21wYW5pb246ITAscGFyYW1zOm8scmV0dXJuOmF9LG0pKX1yZXR1cm4gdVt0XX1yZXR1cm4gYy5pbmNsdWRlcyh0KT9ndSh5KHtuYW1lOnQsY29tcGFuaW9uOiEwfSxtKSk6UmVmbGVjdC5nZXQoZSx0LG4pfX0pfWZ1bmN0aW9uIGt1KCl7cmV0dXJuIHZvaWQgMCE9PW9nJiYiQW5kcm9pZCI9PT1vZy5vcy5uYW1lfWZ1bmN0aW9uIFN1KCl7cmV0dXJuIWt1KCl9ZnVuY3Rpb24geHUoZSx0LG4pe3JldHVybiBrdSgpP3Q6IlVUU1NESyIrKG4/Ik1vZHVsZXMiOiIiKSttKGUpK20odCl9dmFyIEN1PXt9O3ZhciBUdT17fTtmdW5jdGlvbiBPdShlLHQsbil7ZVtlLl9fcHJlbG9hZF9fPyJoaWRlIjoiY2xvc2UiXSh0LG4pfWZ1bmN0aW9uIEV1KG4scixlLGksdCl7dm9pZCAwPT09dCYmKHQ9bi5udnVlPzA6MTAwKTt2YXIgbz0oZT12b2lkIDA9PT1lP25hOnBhcnNlSW50KGUpKXx8bmE7c2coZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe2UuX2NhbGxlZHx8KGUuX2NhbGxlZD0hMCxpJiZpKCksbXMoKSl9LHQ9c2coZnVuY3Rpb24oKXtlKCl9LG8rMTUwKTtuLnNob3cocnx8dGEsbyxmdW5jdGlvbigpe2UuX2NhbGxlZHx8Y2codCksZSgpfSl9LHQpfXZhciBJdT0wO2Z1bmN0aW9uIEF1KHQsbixyKXt2YXIgaT12ZygpLG89aS5sZW5ndGgsYT1pW28tMV07MTx0JiZpLnNsaWNlKG8tdCxvLTEpLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe091KGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSk7dmFyIGU9ZnVuY3Rpb24oZSl7bj9PdShlLG4scnx8bmEpOiJyZWRpcmVjdCI9PT1hLiRwYWdlLm9wZW5UeXBlP091KGUscmEsbmEpOk91KGUsImF1dG8iKSxpLnNsaWNlKG8tdCxvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRyZW1vdmUoKX0pLG1pKCksYWcuZW1pdCgib25BcHBSb3V0ZSIse3R5cGU6Im5hdmlnYXRlQmFjayJ9KX0scz1hLiRnZXRBcHBXZWJ2aWV3KCk7aWYoIWEuX191bmlhcHBfd2VidmlldylyZXR1cm4gZShzKTshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNoaWxkcmVuKCk7aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gdCgpO3ZhciByPW4uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gMD09PWUuaWQuaW5kZXhPZihucyl9KXx8blswXTtyLmNhbkJhY2soZnVuY3Rpb24oZSl7ZS5jYW5CYWNrP3IuYmFjaygpOnQoKX0pfShzLGZ1bmN0aW9uKCl7ZShzKX0pfWZ1bmN0aW9uICR1KGUpe3ZhciB0PWUuZnJvbTt2b2lkIDA9PT10JiYodD0ibmF2aWdhdGVCYWNrIik7dmFyIG49ZS5kZWx0YSxyPWUuYW5pbWF0aW9uVHlwZSxpPWUuYW5pbWF0aW9uRHVyYXRpb24sbz12ZygpLGE9b1tvLmxlbmd0aC0xXTtpZighKGEuJHZtJiZhLiR2bS4kb3B0aW9ucy5vbkJhY2tQcmVzcyYmYS4kdm0uX19jYWxsX2hvb2smJmEuJHZtLl9fY2FsbF9ob29rKCJvbkJhY2tQcmVzcyIse2Zyb206dH0pKSlyZXR1cm4gcGcuaGlkZVRvYXN0KCkscGcuaGlkZUxvYWRpbmcoKSxhLiRwYWdlLm1ldGEuaXNRdWl0P0l1P0RhdGUubm93KCktSXU8MmUzJiZvZy5ydW50aW1lLnF1aXQoKTooSXU9RGF0ZS5ub3coKSxvZy5uYXRpdmVVSS50b2FzdChhdCgidW5pLmFwcC5xdWl0IikpLHNnKGZ1bmN0aW9uKCl7SXU9bnVsbH0sMmUzKSk6MT09PWEuJHBhZ2UuaWQmJmRnLnJlYWxFbnRyeVBhZ2VQYXRoPyhkZy5lbnRyeVBhZ2VQYXRoPWRnLnJlYWxFbnRyeVBhZ2VQYXRoLGRlbGV0ZSBkZy5yZWFsRW50cnlQYWdlUGF0aCxwZy5yZUxhdW5jaCh7dXJsOiIvIitkZy5lbnRyeVBhZ2VQYXRofSkpOkF1KG4scixpKSx7ZXJyTXNnOiJuYXZpZ2F0ZUJhY2s6b2sifX12YXIgUHU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuaWQ9ZSx0aGlzLmxpc3RlbmVyPXt9LHRoaXMuZW1pdENhY2hlPXt9LHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24oZSl7bi5vbihlLHRbZV0pfSl9O1B1LnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTt2YXIgcj10aGlzLmxpc3RlbmVyW2VdO2lmKCFyKXJldHVybih0aGlzLmVtaXRDYWNoZVtlXXx8KHRoaXMuZW1pdENhY2hlW2VdPVtdKSkucHVzaCh0KTtyLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5mbi5hcHBseShlLmZuLHQpfSksdGhpcy5saXN0ZW5lcltlXT1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ib25jZSIhPT1lLnR5cGV9KX0sUHUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5fYWRkTGlzdGVuZXIoZSwib24iLHQpLHRoaXMuX2NsZWFyQ2FjaGUoZSl9LFB1LnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7dGhpcy5fYWRkTGlzdGVuZXIoZSwib25jZSIsdCksdGhpcy5fY2xlYXJDYWNoZShlKX0sUHUucHJvdG90eXBlLm9mZj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMubGlzdGVuZXJbZV07aWYobilpZih0KWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7KW5bcl0uZm49PT10JiYobi5zcGxpY2UociwxKSxyLS0pLHIrKztlbHNlIGRlbGV0ZSB0aGlzLmxpc3RlbmVyW2VdfSxQdS5wcm90b3R5cGUuX2NsZWFyQ2FjaGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lbWl0Q2FjaGVbZV07aWYodClmb3IoOzA8dC5sZW5ndGg7KXRoaXMuZW1pdC5hcHBseSh0aGlzLFtlXS5jb25jYXQodC5zaGlmdCgpKSl9LFB1LnByb3RvdHlwZS5fYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmxpc3RlbmVyW2VdfHwodGhpcy5saXN0ZW5lcltlXT1bXSkpLnB1c2goe2ZuOm4sdHlwZTp0fSl9O3ZhciBNdT0wO2Z1bmN0aW9uIGp1KGUsdCl7dmFyIG49ZS51cmwscj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5ldmVudHMsYT1lLmFuaW1hdGlvblR5cGUscz1lLmFuaW1hdGlvbkR1cmF0aW9uO2FnLmVtaXQoIm9uQXBwUm91dGUiLHt0eXBlOiJuYXZpZ2F0ZVRvIixwYXRoOnJ9KTt2YXIgYz0odm9pZCAwPT09ITEmJiEwLG5ldyBQdSgrK011LG8pKTtFdShqcyh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6Im5hdmlnYXRlIixldmVudENoYW5uZWw6Y30pLGEscyxmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoibmF2aWdhdGVUbzpvayIsZXZlbnRDaGFubmVsOmN9KX0pLG1pKCl9ZnVuY3Rpb24gTHUoZSx0KXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLEFycmF5LmlzQXJyYXkoZVt0XSkmJmVbdF0ubGVuZ3RofWZ1bmN0aW9uIEJ1KGUscil7dmFyIHQ9ZS51cmwsbj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5leGlzdHMsYT12ZygpLHM9YS5sZW5ndGgtMTtpZigiYmFjayI9PT1vKXt2YXIgYz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dmcoKSxuPXQubGVuZ3RoO24tLTspe3ZhciByPXRbbl07aWYoci4kcGFnZSYmci4kcGFnZS5mdWxsUGF0aD09PWUpcmV0dXJuIG59cmV0dXJuLTF9KHQpO2lmKC0xIT09Yyl7dmFyIHU9cy1jO2lmKDA8dSlyZXR1cm4gJHUoe2RlbHRhOnV9KSx2b2lkIGZpKHIse2Vyck1zZzoicmVkaXJlY3RUbzpvayJ9KX19dmFyIGw9YVtzXTtsJiZsLiRyZW1vdmUoKSxFdShqcyh7dXJsOnQscGF0aDpuLHF1ZXJ5Omksb3BlblR5cGU6InJlZGlyZWN0In0pLCJub25lIiwwLGZ1bmN0aW9uKCl7aWYobCl7dmFyIGU9bC4kZ2V0QXBwV2VidmlldygpO2UuX19wcmVsb2FkX18mJih0PWUsKG49T2JqZWN0LmtleXMoTXMpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIE1zW2VdLmlkPT09dC5pZH0pKSYmZGVsZXRlIE1zW25dKSxlLmNsb3NlKCJub25lIil9dmFyIHQsbjtmaShyLHtlcnJNc2c6InJlZGlyZWN0VG86b2sifSl9KSxtaSgpfXZhciBOdSxEdSxSdSxGdT0iX19UWVBFIixVdT0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24genUoZSl7dHJ5e3ZhciB0PSJzdHJpbmciPT10eXBlb2YgZT9KU09OLnBhcnNlKGUpOmUsbj10LnR5cGU7aWYoMDw9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl0uaW5kZXhPZihuKSl7dmFyIHI9T2JqZWN0LmtleXModCk7aWYoMj09PXIubGVuZ3RoJiYiZGF0YSJpbiB0KXtpZih0eXBlb2YgdC5kYXRhPT09bilyZXR1cm4gdC5kYXRhO2lmKCJvYmplY3QiPT09biYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KHQuZGF0YSkpcmV0dXJuIG5ldyBEYXRlKHQuZGF0YSl9ZWxzZSBpZigxPT09ci5sZW5ndGgpcmV0dXJuIiJ9fWNhdGNoKGUpe319ZnVuY3Rpb24gVnUoZSx0KXt2YXIgbj10O2lmKCJzdHJpbmciIT09ZXx8InN0cmluZyI9PT1lJiYneyJ0eXBlIjoidW5kZWZpbmVkIn0nPT09dCl0cnl7dmFyIHI9SlNPTi5wYXJzZSh0KSxpPXp1KHIpO2lmKHZvaWQgMCE9PWkpbj1pO2Vsc2UgaWYoZSYmInN0cmluZyI9PXR5cGVvZihuPXIpKXt2YXIgbz10eXBlb2Yocj1KU09OLnBhcnNlKHIpKTsibnVtYmVyIj09PW8mJiJkYXRlIj09PWU/bj1uZXcgRGF0ZShyKTpvPT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2goZSl7fXJldHVybiBufWZ1bmN0aW9uIHF1KCl7Zm9yKHZhciBlPW9nLnN0b3JhZ2UubGVuZ3RofHxvZy5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wLHI9MDtyPGU7cisrKXt2YXIgaT1vZy5zdG9yYWdlLmtleShyKTtpZihpIT09VXUmJihpLmluZGV4T2YoRnUpPDB8fGkuaW5kZXhPZihGdSkrRnUubGVuZ3RoIT09aS5sZW5ndGgpKXt2YXIgbz1vZy5zdG9yYWdlLmdldEl0ZW0oaSk7bis9aS5sZW5ndGgrby5sZW5ndGgsdC5wdXNoKGkpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbCgyKm4vMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUUsZXJyTXNnOiJnZXRTdG9yYWdlSW5mbzpvayJ9fWZ1bmN0aW9uIFd1KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnRpdGxlO3ZvaWQgMD09PXQmJih0PSIiKTt2YXIgbj1lLmljb247dm9pZCAwPT09biYmKG49InN1Y2Nlc3MiKTt2YXIgcj1lLmltYWdlO3ZvaWQgMD09PXImJihyPSIiKTt2YXIgaT1lLmR1cmF0aW9uO3ZvaWQgMD09PWkmJihpPTE1MDApO3ZhciBvPWUubWFzazt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5wb3NpdGlvbjt2b2lkIDA9PT1hJiYoYT0iIik7dmFyIHM9ZS50eXBlO3ZvaWQgMD09PXMmJihzPSJ0b2FzdCIpO3ZhciBjPWUuc3R5bGU7aWYoSHUobnVsbCksRHU9cyxbInRvcCIsImNlbnRlciIsImJvdHRvbSJdLmluY2x1ZGVzKGEpKW9nLm5hdGl2ZVVJLnRvYXN0KHQse3ZlcnRpY2FsQWxpZ246YX0pLE51PSEwO2Vsc2V7biYmIX5bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihuKSYmKG49InN1Y2Nlc3MiKTt2YXIgdT17bW9kYWw6byxiYWNrOiJ0cmFuc21pdCIscGFkZGluZzoiMTBweCIsc2l6ZToiMTZweCJ9O3J8fG4mJiJub25lIiE9PW4/KHUud2lkdGg9IjE0MHB4Iix1LmhlaWdodD0iMTEycHgiKTp1LmxvYWRpbmc9e2Rpc3BsYXk6Im5vbmUifSxyP3UubG9hZGluZz17ZGlzcGxheToiYmxvY2siLGhlaWdodDoiNTVweCIsaWNvbjpyLGludGVydmFsOml9Oi0xIT09WyJzdWNjZXNzIiwiZXJyb3IiXS5pbmRleE9mKG4pJiYodS5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOiJzdWNjZXNzIj09PW4/Il9fdW5pYXBwc3VjY2Vzcy5wbmciOiJfX3VuaWFwcGVycm9yLnBuZyIsaW50ZXJ2YWw6aX0pLE51PW9nLm5hdGl2ZVVJLnNob3dXYWl0aW5nKHQsT2JqZWN0LmFzc2lnbih1LGMpKX1yZXR1cm4gUnU9c2coZnVuY3Rpb24oKXtIdShudWxsKX0saSkse2Vyck1zZzoic2hvd1RvYXN0Om9rIn19ZnVuY3Rpb24gSHUoZSl7aWYodm9pZCAwPT09ZSYmKGU9InRvYXN0IiksIWV8fGU9PT1EdSlyZXR1cm4gUnUmJihjZyhSdSksUnU9bnVsbCksITA9PT1OdT9vZy5uYXRpdmVVSS5jbG9zZVRvYXN0KCk6TnUmJk51LmNsb3NlJiZOdS5jbG9zZSgpLER1PU51PW51bGwse2Vyck1zZzoiaGlkZTpvayJ9fXZhciBHdSxYdT17bGlnaHQ6e2l0ZW1Db2xvcjoiIzAwMDAwMCJ9LGRhcms6e2l0ZW1Db2xvcjoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpIn19O3ZhciBKdT17fTtmdW5jdGlvbiBZdShlKXt2YXIgbj1KdVtlXTtyZXR1cm4gbnx8KG49e2lkOjEsY2FsbGJhY2tzOk9iamVjdC5jcmVhdGUobnVsbCl9LEp1W2VdPW4pLHtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbGJhY2tzW2VdfSxwb3A6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5jYWxsYmFja3NbZV07cmV0dXJuIHQmJmRlbGV0ZSBuLmNhbGxiYWNrc1tlXSx0fSxwdXNoOmZ1bmN0aW9uKGUpe3ZhciB0PW4uaWQrKztyZXR1cm4gbi5jYWxsYmFja3NbdF09ZSx0fX19dmFyIEt1PVl1KCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIpO2Z1bmN0aW9uIFp1KG4pe3ZhciByPXt9O3JldHVybiBPYmplY3Qua2V5cyhufHx7fSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPT09ZS5pbmRleE9mKCJkYXRhIikpe3ZhciB0PWUucmVwbGFjZSgiZGF0YSIsIiIpO3Q9dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSt0LnNsaWNlKDEpLHJbdF09bltlXX19KSxyfWZ1bmN0aW9uIFF1KGUsdCxuKXt2YXIgcj1lLl8kd2VleC5yZXF1aXJlTW9kdWxlKCJkb20iKSxpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl0uc2VsZWN0b3I7MD09PXIuaW5kZXhPZigiIyIpJiZ0LnB1c2goci5zdWJzdHJpbmcoMSkpfXJldHVybiB0fSh0KSxvPW5ldyBBcnJheShpLmxlbmd0aCk7IWZ1bmN0aW9uIGUodCxuLHIpe3ZhciBpPW4uY2hpbGRyZW47aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuITE7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPWlbb107aWYoYS5hdHRyKXt2YXIgcz10LmluZGV4T2YoYS5hdHRyLmlkKTtpZigwPD1zJiYocltzXT17aWQ6dFtzXSxyZWY6YS5yZWYsZGF0YXNldDpadShhLmF0dHIpfSwxPT09dC5sZW5ndGgpKWJyZWFrfWEuY2hpbGRyZW4mJmUodCxhLHIpfX0oaSxlLiRlbCxvKSxmdW5jdGlvbiB0KG4scixpLG8sYSl7dmFyIHM9cltpXTtuLmdldENvbXBvbmVudFJlY3Qocy5yZWYsZnVuY3Rpb24oZSl7ZS5zaXplLmlkPXMuaWQsZS5zaXplLmRhdGFzZXQ9cy5kYXRhc2V0LG8ucHVzaChlLnNpemUpLChpKz0xKTxyLmxlbmd0aD90KG4scixpLG8sYSk6YShvKX0pfShyLG8sMCxbXSxmdW5jdGlvbihlKXtuKGUpfSl9ZnVuY3Rpb24gZWwoZSx0LG4scil7YWcucHVibGlzaEhhbmRsZXIodCx7dHlwZTpuLGRhdGE6cn0sZSl9YWcuc3Vic2NyaWJlKCJvbkFkTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYWxsYmFja0lkOyFmdW5jdGlvbihlLG4sdCl7dmFyIHI9ZS5hZHBpZCxpPWUud2lkdGgsbz1yKyItIitpLGE9dGxbb107aWYoYSYmMDxhLmxlbmd0aClyZXR1cm4gbihhLnNwbGljZSgwLDEpWzBdKTtvZy5hZC5nZXRBZHMoZSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztuKHQuc3BsaWNlKDAsMSlbMF0pLHRsW29dPWE/YS5jb25jYXQodCk6dH0sZnVuY3Rpb24oZSl7dCh7ZXJyQ29kZTplLmNvZGUsZXJyTXNnOmUubWVzc2FnZX0pfSl9KGUuZGF0YSxmdW5jdGlvbihlKXtlbCh0LG4sInN1Y2Nlc3MiLGUpfSxmdW5jdGlvbihlKXtlbCh0LG4sImZhaWwiLGUpfSl9KTt2YXIgdGw9e307dmFyIG5sPVsibG9hZCIsImNsb3NlIiwidmVyaWZ5IiwiZXJyb3IiLCJhZENsaWNrZWQiXSxybD1bLTUwMDEsLTUwMDIsLTUwMDMsLTUwMDQsLTUwMDUsLTUwMDZdLGlsPXtjb2RlOi01MDA4LGVyck1zZzoi5bm/5ZGK5pWw5o2u5bey6L+H5pyf77yM6K+36YeN5paw5Yqg6L29In0sb2w9ImNzaiIsYWw9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpczt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49dGhpcy5fY2FsbGJhY2tzPXt9O25sLmZvckVhY2goZnVuY3Rpb24odCl7blt0XT1bXTt2YXIgZT10WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSk7aVsib24iK2VdPWZ1bmN0aW9uKGUpe25bdF0ucHVzaChlKX19KSx0aGlzLl9wcmVsb2FkPXZvaWQgMD09PWUucHJlbG9hZHx8ZS5wcmVsb2FkLHRoaXMuX2lzTG9hZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX2xhc3RMb2FkVGltZT0wO3ZhciB0PXRoaXMuX3Jld2FyZEFkPW9nLmFkLmNyZWF0ZVJld2FyZGVkVmlkZW9BZChlKTt0Lm9uTG9hZChmdW5jdGlvbihlKXtpLl9pc0xvYWQ9ITAsaS5faXNMb2FkaW5nPSExLGkuX2xhc3RMb2FkVGltZT1EYXRlLm5vdygpLGkuX2Rpc3BhdGNoRXZlbnQoImxvYWQiLHt9KSxudWxsIT1pLl9sb2FkUHJvbWlzZVJlc29sdmUmJihpLl9sb2FkUHJvbWlzZVJlc29sdmUoKSxpLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCl9KSx0Lm9uQ2xvc2UoZnVuY3Rpb24oZSl7aS5faXNMb2FkPSExLGkuX2lzTG9hZGluZz0hMSxpLl9wcmVsb2FkJiZpLl9sb2FkQWQoKSxpLl9kaXNwYXRjaEV2ZW50KCJjbG9zZSIse2lzRW5kZWQ6ZS5pc0VuZGVkfSl9KSx0Lm9uVmVyaWZ5JiZ0Lm9uVmVyaWZ5KGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoInZlcmlmeSIse2lzVmFsaWQ6ZS5pc1ZhbGlkfSl9KSx0Lm9uRXJyb3IoZnVuY3Rpb24oZSl7aS5faXNMb2FkaW5nPSExO3ZhciB0PWUuY29kZSxuPWUubWVzc2FnZSxyPXtjb2RlOnQsZXJyTXNnOm59O2kuX2FkRXJyb3I9biwtNTAwOD09PXQmJihpLl9pc0xvYWQ9ITEpLGkuX2Rpc3BhdGNoRXZlbnQoImVycm9yIixyKSwtNTAwNSE9PXQmJi0xIT09cmwuaW5kZXgodCl8fG51bGw9PWkuX2xvYWRQcm9taXNlUmVqZWN0fHwoaS5fbG9hZFByb21pc2VSZWplY3QociksaS5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCl9KSx0Lm9uQWRDbGlja2VkKGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoImFkQ2xpY2tlZCIse30pfSksdGhpcy5fbG9hZEFkKCl9LHNsPXtpc0V4cGlyZWQ6e2NvbmZpZ3VyYWJsZTohMH19O3NsLmlzRXhwaXJlZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2xhc3RMb2FkVGltZSYmMThlNTxNYXRoLmFicyhEYXRlLm5vdygpLXRoaXMuX2xhc3RMb2FkVGltZSl9LGFsLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9sb2FkUHJvbWlzZVJlc29sdmU9ZSxuLl9sb2FkUHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2lzTG9hZD9lKCk6bi5fbG9hZEFkKCkpfSl9LGFsLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtpZighbi5faXNMb2FkaW5nKXtpZihuLmdldFByb3ZpZGVyKCk9PT1vbCYmbi5pc0V4cGlyZWQpcmV0dXJuIG4uX2lzTG9hZD0hMSxuLl9kaXNwYXRjaEV2ZW50KCJlcnJvciIsaWwpLHZvaWQgdChuZXcgRXJyb3IoaWwuZXJyTXNnKSk7bi5faXNMb2FkPyhuLl9yZXdhcmRBZC5zaG93KCksZSgpKTp0KG5ldyBFcnJvcihuLl9hZEVycm9yKSl9fSl9LGFsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXdhcmRBZC5nZXRQcm92aWRlcigpfSxhbC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX3Jld2FyZEFkLmRlc3Ryb3koKX0sYWwucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0xvYWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX3Jld2FyZEFkLmxvYWQoKX0sYWwucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUodHx8e30pfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGFsLnByb3RvdHlwZSxzbCk7dmFyIGNsPSJsb2FkIix1bD0iY2xvc2UiLGxsPSJlcnJvciIsZGw9ImFkQ2xpY2tlZCIsZmw9W2NsLHVsLGxsLGRsXSxwbD1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMsbj10aGlzLl9jYWxsYmFja3M9e307ZmwuZm9yRWFjaChmdW5jdGlvbih0KXtuW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtyWyJvbiIrZV09ZnVuY3Rpb24oZSl7blt0XS5wdXNoKGUpfX0pLHRoaXMuX3ByZWxvYWQ9dm9pZCAwIT09dC5wcmVsb2FkJiZ0LnByZWxvYWQsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2FkRXJyb3I9IiIsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsO3ZhciBpPXRoaXMuX2FkPWU7aS5vbkxvYWQoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITAsci5faXNMb2FkaW5nPSExLG51bGwhPXIuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKHIuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHIuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSxudWxsIT1yLl9zaG93UHJvbWlzZVJlc29sdmUmJihyLl9zaG93UHJvbWlzZVJlc29sdmUoKSxyLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCxyLl9zaG93QWQoKSksci5fZGlzcGF0Y2hFdmVudChjbCx7fSl9KSxpLm9uQ2xvc2UoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITEsci5faXNMb2FkaW5nPSExLHIuX2Rpc3BhdGNoRXZlbnQodWwse2lzRW5kZWQ6ZS5pc0VuZGVkfSksITA9PT1yLl9wcmVsb2FkJiZyLl9sb2FkQWQoKX0pLGkub25FcnJvcihmdW5jdGlvbihlKXtyLl9pc0xvYWRpbmc9ITE7dmFyIHQ9e2NvZGU6ZS5jb2RlLGVyckNvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2UsZGV0YWlsOmUuZGV0YWlsfTtyLl9hZEVycm9yPXQsci5fZGlzcGF0Y2hFdmVudChsbCx0KTt2YXIgbj1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoci5fYWRFcnJvcikpO24uY29kZT1lLmNvZGUsbi5lcnJNc2c9ZS5tZXNzYWdlLG4uZGV0YWlsPWUuZGV0YWlsLG51bGwhPXIuX2xvYWRQcm9taXNlUmVqZWN0JiYoci5fbG9hZFByb21pc2VSZWplY3Qobiksci5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCksbnVsbCE9ci5fc2hvd1Byb21pc2VSZWplY3QmJihyLl9zaG93UHJvbWlzZVJlamVjdChuKSxyLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKX0pLGkub25BZENsaWNrZWQmJmkub25BZENsaWNrZWQoZnVuY3Rpb24oZSl7ci5fZGlzcGF0Y2hFdmVudChkbCx7fSl9KX07cGwucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe24uX2xvYWRQcm9taXNlUmVzb2x2ZT1lLG4uX2xvYWRQcm9taXNlUmVqZWN0PXQsbi5faXNMb2FkaW5nfHwobi5faXNMb2FkZWQ/ZSgpOm4uX2xvYWRBZCgpKX0pfSxwbC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fc2hvd1Byb21pc2VSZXNvbHZlPWUsbi5fc2hvd1Byb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9pc0xvYWRlZD8obi5fc2hvd0FkKCksZSgpKTpuLl9sb2FkQWQoKSl9KX0scGwucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9hZC5kZXN0cm95KCl9LHBsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hZC5nZXRQcm92aWRlcigpfSxwbC5wcm90b3R5cGUuX2xvYWRBZD1mdW5jdGlvbigpe3RoaXMuX2FkRXJyb3I9IiIsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkLmxvYWQoKX0scGwucHJvdG90eXBlLl9zaG93QWQ9ZnVuY3Rpb24oKXt0aGlzLl9hZC5zaG93KCl9LHBsLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHR8fHt9KX0pfTt2YXIgaGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdC5jYWxsKHRoaXMsb2cuYWQuY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQoZSksZSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWV9KHBsKTt2YXIgdmw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdC5jYWxsKHRoaXMsb2cuYWQuY3JlYXRlSW50ZXJzdGl0aWFsQWQoZSksZSksdGhpcy5fbG9hZEFkKCl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWV9KHBsKTt2YXIgZ2w9e30sbWw9e307dmFyIHlsPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMscj10aGlzLl9jYWxsYmFja3M9e307ZmwuZm9yRWFjaChmdW5jdGlvbih0KXtyW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtuWyJvbiIrZV09ZnVuY3Rpb24oZSl7clt0XS5wdXNoKGUpfX0pLHRoaXMuX2FkPW51bGwsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9hZHBpZD1lLmFkcGlkLHRoaXMuX3Byb3ZpZGVyPWUucHJvdmlkZXIsdGhpcy5fdXNlckRhdGE9ZS51c2VyRGF0YXx8e30sdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCxzZyhmdW5jdGlvbigpe24uX2luaXQoKX0pfTt5bC5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2FkRXJyb3I9IiIsZnVuY3Rpb24oZSl7dmFyIHI9ZS5wcm92aWRlcjtpZihnbFtyXXx8KGdsW3JdPXt9KSwib2JqZWN0IiE9dHlwZW9mIGdsW3JdLmluc3RhbmNlKWlmKG1sW3JdfHwobWxbcl09W10pLG1sW3JdLnB1c2goZSksITAhPT1nbFtyXS5sb2FkaW5nKXtnbFtyXS5sb2FkaW5nPSEwO3ZhciBpPXBpKHIpfHx7fSx0PWkuaW5pdHx8aS5pbml0U0RLO2lmKCF0KXJldHVybiBtbFtyXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZmFpbCh7Y29kZTotMSxtZXNzYWdlOiJwcm92aWRlciBbIityKyJdIGludmFsaWQifSl9KSxtbFtyXS5sZW5ndGg9MCxnbFtyXS5sb2FkaW5nPSExO2dsW3JdLnBsdWdpbj1pLGUuX19wbHVnaW49aSx0KGZ1bmN0aW9uKHQpe3ZhciBlPXQuY29kZSxuPSJCWE0tQUQiPT09cj8wPT09ZXx8MT09PWU6MD09PWU7bj9nbFtyXS5pbnN0YW5jZT1pOmdsW3JdLmxvYWRpbmc9ITEsbWxbcl0uZm9yRWFjaChmdW5jdGlvbihlKXtuP2Uuc3VjY2VzcyhlLl9fcGx1Z2luKTplLmZhaWwodCl9KSxtbFtyXS5sZW5ndGg9MH0pfWVsc2UgZS5fX3BsdWdpbj1nbFtyXS5wbHVnaW47ZWxzZSBlLnN1Y2Nlc3MoZ2xbcl0uaW5zdGFuY2UpfSh7cHJvdmlkZXI6dGhpcy5fcHJvdmlkZXIsc3VjY2VzczpmdW5jdGlvbihlKXt0Ll9hZD1lLHQuX3VzZXJEYXRhJiZ0LmJpbmRVc2VyRGF0YSh0Ll91c2VyRGF0YSksdC5fbG9hZEFkKCl9LGZhaWw6ZnVuY3Rpb24oZSl7dC5fYWRFcnJvcj1lLHQuX2Rpc3BhdGNoRXZlbnQobGwsZSl9fSl9LHlsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm92aWRlcn0seWwucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe24uX2xvYWRQcm9taXNlUmVzb2x2ZT1lLG4uX2xvYWRQcm9taXNlUmVqZWN0PXQsbi5faXNMb2FkaW5nfHwobi5fYWRFcnJvcj9uLl9pbml0KCk6bi5faXNMb2FkZWQ/ZSgpOm4uX2xvYWRBZCgpKX0pfSx5bC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fc2hvd1Byb21pc2VSZXNvbHZlPWUsbi5fc2hvd1Byb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9hZEVycm9yP24uX2luaXQoKTpuLl9pc0xvYWRlZD8obi5fc2hvd0FkKCksZSgpKTpuLl9sb2FkQWQoKSl9KX0seWwucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYWQmJnRoaXMuX2FkLmRlc3Ryb3kmJnRoaXMuX2FkLmRlc3Ryb3koe2FkcGlkOnRoaXMuX2FkcGlkfSl9LHlsLnByb3RvdHlwZS5iaW5kVXNlckRhdGE9ZnVuY3Rpb24oZSl7bnVsbCE9PXRoaXMuX2FkJiZ0aGlzLl9hZC5iaW5kVXNlckRhdGEmJnRoaXMuX2FkLmJpbmRVc2VyRGF0YShlKX0seWwucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKG51bGwhPT10aGlzLl9hZCl7aWYoITA9PT10aGlzLl9pc0xvYWRpbmcpcmV0dXJuO3RoaXMuX2lzTG9hZGluZz0hMCx0aGlzLl9hZC5sb2FkRGF0YShPYmplY3QuYXNzaWduKHt9LHthZHBpZDp0aGlzLl9hZHBpZH0sdGhpcy5fdXNlckRhdGEpLGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGVkPSEwLHQuX2lzTG9hZGluZz0hMSxudWxsIT10Ll9sb2FkUHJvbWlzZVJlc29sdmUmJih0Ll9sb2FkUHJvbWlzZVJlc29sdmUoKSx0Ll9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCksbnVsbCE9dC5fc2hvd1Byb21pc2VSZXNvbHZlJiYodC5fc2hvd1Byb21pc2VSZXNvbHZlKCksdC5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdC5fc2hvd0FkKCkpLHQuX2Rpc3BhdGNoRXZlbnQoY2wsZSl9LGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGluZz0hMSxudWxsIT10Ll9zaG93UHJvbWlzZVJlamVjdCYmKHQuX3Nob3dQcm9taXNlUmVqZWN0KHQuX2NyZWF0ZUVycm9yKGUpKSx0Ll9zaG93UHJvbWlzZVJlamVjdD1udWxsKSx0Ll9kaXNwYXRjaEV2ZW50KGxsLGUpfSl9fSx5bC5wcm90b3R5cGUuX3Nob3dBZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7bnVsbCE9PXRoaXMuX2FkJiYhMD09PXRoaXMuX2lzTG9hZGVkJiZ0aGlzLl9hZC5zaG93KHthZHBpZDp0aGlzLl9hZHBpZH0sZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITF9LGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGVkPSExLG51bGwhPXQuX3Nob3dQcm9taXNlUmVqZWN0JiYodC5fc2hvd1Byb21pc2VSZWplY3QodC5fY3JlYXRlRXJyb3IoZSkpLHQuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHQuX2Rpc3BhdGNoRXZlbnQobGwsZSl9KX0seWwucHJvdG90eXBlLl9jcmVhdGVFcnJvcj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZSkpO3JldHVybiB0LmNvZGU9ZS5jb2RlLHQuZXJyTXNnPWUubWVzc2FnZSx0fSx5bC5wcm90b3R5cGUuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9jYWxsYmFja3NbZV0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSh0fHx7fSl9KX07dmFyIF9sPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGluaXRVVFNQcm94eUNsYXNzOnd1LGluaXRVVFNQcm94eUZ1bmN0aW9uOl91LGluaXRVVFNJbmRleENsYXNzTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiB4dShlLGt1KCk/IkluZGV4S3QiOiJJbmRleFN3aWZ0Iix0KX0saW5pdFVUU0NsYXNzTmFtZTp4dSxpbml0VVRTUGFja2FnZU5hbWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4ga3UoKT8idXRzLnNkay4iKyh0PyJtb2R1bGVzLiI6IiIpK2U6IiJ9LHJlcXVpcmVVVFNQbHVnaW46ZnVuY3Rpb24oZSl7dmFyIHQ9VHVbZV07cmV0dXJuIHR8fGNvbnNvbGUuZXJyb3IoZSsiIGlzIG5vdCBmb3VuZCIpLHR9LHJlZ2lzdGVyVVRTUGx1Z2luOmZ1bmN0aW9uKGUsdCl7VHVbZV09dH0scmVnaXN0ZXJVVFNJbnRlcmZhY2U6ZnVuY3Rpb24oZSx0KXtDdVtlXT10fSxzdGFydFB1bGxEb3duUmVmcmVzaDpmdW5jdGlvbigpe3JldHVybiBHdSYmR3UuZW5kUHVsbFRvUmVmcmVzaCgpLChHdT1TaSgpKT8oR3UuYmVnaW5QdWxsVG9SZWZyZXNoKCkse2Vyck1zZzoic3RhcnRQdWxsRG93blJlZnJlc2g6b2sifSk6e2Vyck1zZzoic3RhcnRQdWxsRG93blJlZnJlc2g6ZmFpbCJ9fSxzdG9wUHVsbERvd25SZWZyZXNoOmZ1bmN0aW9uKCl7cmV0dXJuIEd1fHwoR3U9U2koKSksR3U/KEd1LmVuZFB1bGxUb1JlZnJlc2goKSxHdT1udWxsLHtlcnJNc2c6InN0b3BQdWxsRG93blJlZnJlc2g6b2sifSk6e2Vyck1zZzoic3RvcFB1bGxEb3duUmVmcmVzaDpmYWlsIn19LCRvbjphaSwkb2ZmOnNpLCRvbmNlOmNpLCRlbWl0OnVpLGNyZWF0ZUF1ZGlvSW5zdGFuY2U6ZnVuY3Rpb24oKXt2YXIgZT0iIitEYXRlLm5vdygpK01hdGgucmFuZG9tKCksdD1GaVtlXT1vZy5hdWRpby5jcmVhdGVQbGF5ZXIoIiIpO3JldHVybiB0LnNyYz0iIix0LnZvbHVtZT0xLHQuc3RhcnRUaW1lPTAsdC5zZXRTZXNzaW9uQ2F0ZWdvcnkoUmkpLHtlcnJNc2c6ImNyZWF0ZUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6ZX19LGRlc3Ryb3lBdWRpb0luc3RhbmNlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXVkaW9JZDtyZXR1cm4gRmlbdF0mJihGaVt0XS5jbG9zZSgpLGRlbGV0ZSBGaVt0XSkse2Vyck1zZzoiZGVzdHJveUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6dH19LHNldEF1ZGlvU3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdWRpb0lkLG49ZS5zcmMscj1lLnN0YXJ0VGltZSxpPWUuYXV0b3BsYXk7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBvPWUubG9vcDt2b2lkIDA9PT1vJiYobz0hMSksZS5vYmV5TXV0ZVN3aXRjaDt2YXIgYT1lLnZvbHVtZSxzPWUuc2Vzc2lvbkNhdGVnb3J5O3ZvaWQgMD09PXMmJihzPVJpKTt2YXIgYyx1LGw9ZS5wbGF5YmFja1JhdGUsZD1GaVt0XTtpZihkKXt2YXIgZj17bG9vcDpvLGF1dG9wbGF5Oml9O2lmKG4pe3ZhciBwPVRpKG4pO2Quc3JjIT09cCYmKGQuc3JjPWYuc3JjPXApfXImJihkLnN0YXJ0VGltZT1mLnN0YXJ0VGltZT1yKSwibnVtYmVyIj09dHlwZW9mIGEmJihkLnZvbHVtZT1mLnZvbHVtZT1hKSxkLnNldFN0eWxlcyhmKSxzJiZkLnNldFNlc3Npb25DYXRlZ29yeShzKSxsJiZkLnBsYXliYWNrUmF0ZSYmZC5wbGF5YmFja1JhdGUobCksKHU9RmlbYz10XSkmJih1LmluaXRTdGF0ZUNoYWdlfHwodS5pbml0U3RhdGVDaGFnZT0hMCx1LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihlKXt6aSgiZXJyb3IiLHthdWRpb0lkOmMsZXJyTXNnOiJNZWRpYUVycm9yIixlcnJDb2RlOmUuY29kZX0pfSksVWkuZm9yRWFjaChmdW5jdGlvbihlKXt1LmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpeyJwbGF5Ij09PWU/dS5pc1N0b3BwZWQ9ITE6InN0b3AiPT09ZSYmKHUuaXNTdG9wcGVkPSEwKSx6aShlLHthdWRpb0lkOmN9KX0pfSkpKX1yZXR1cm57ZXJyTXNnOiJzZXRBdWRpb1N0YXRlOm9rIn19LGdldEF1ZGlvU3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdWRpb0lkLG49RmlbdF07aWYoIW4pcmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpmYWlsIn07dmFyIHI9bi5zcmMsaT1uLnN0YXJ0VGltZSxvPW4udm9sdW1lO3JldHVybntlcnJNc2c6ImdldEF1ZGlvU3RhdGU6b2siLGR1cmF0aW9uOjFlMyoobi5nZXREdXJhdGlvbigpfHwwKSxjdXJyZW50VGltZTpuLmlzU3RvcHBlZD8wOjFlMypuLmdldFBvc2l0aW9uKCkscGF1c2VkOm4uaXNQYXVzZWQoKSxzcmM6cix2b2x1bWU6byxzdGFydFRpbWU6MWUzKmksYnVmZmVyZWQ6MWUzKm4uZ2V0QnVmZmVyZWQoKX19LG9wZXJhdGVBdWRpbzpmdW5jdGlvbihlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLmF1ZGlvSWQscj1lLmN1cnJlbnRUaW1lLGk9Rmlbbl0sbz1bInBsYXkiLCJwYXVzZSIsInN0b3AiXTtyZXR1cm4gMDw9by5pbmRleE9mKHQpP2lbdD09PW9bMF0mJmkuaXNQYXVzZWQoKT8icmVzdW1lIjp0XSgpOiJzZWVrIj09PXQmJmkuc2Vla1RvKHIvMWUzKSx7ZXJyTXNnOiJvcGVyYXRlQXVkaW86b2sifX0sZ2V0TXVzaWNQbGF5ZXJTdGF0ZTpmdW5jdGlvbigpe3ZhciBlPVlpKCk7cmV0dXJuIGU/e2RhdGFVcmw6ZS5zcmMsZHVyYXRpb246ZS5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRQb3NpdGlvbjplLmdldFBvc2l0aW9uKCksc3RhdHVzOmUuaXNQYXVzZWQoKT8wOjEsZG93bmxvYWRQZXJjZW50Ok1hdGgucm91bmQoMTAwKmUuZ2V0QnVmZmVyZWQoKS9lLmdldER1cmF0aW9uKCkpLGVyck1zZzoiZ2V0TXVzaWNQbGF5ZXJTdGF0ZTpvayJ9OntzdGF0dXM6MixlcnJNc2c6ImdldE11c2ljUGxheWVyU3RhdGU6b2sifX0sb3BlcmF0ZU11c2ljUGxheWVyOktpLHNldEJhY2tncm91bmRBdWRpb1N0YXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEppKGUsdCkse2Vyck1zZzoic2V0QmFja2dyb3VuZEF1ZGlvU3RhdGU6b2sifX0sb3BlcmF0ZUJhY2tncm91bmRBdWRpbzpmdW5jdGlvbihlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLnNyYyxyPWUuc3RhcnRUaW1lLGk9ZS5jdXJyZW50VGltZTtyZXR1cm4gS2koe29wZXJhdGlvblR5cGU6dCxkYXRhVXJsOm4scG9zaXRpb246cnx8aXx8MCxhcGk6Im9wZXJhdGVCYWNrZ3JvdW5kQXVkaW8ifSl9LGdldEJhY2tncm91bmRBdWRpb1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGU9e2R1cmF0aW9uOjAsY3VycmVudFRpbWU6MCxwYXVzZWQ6ITEsc3JjOiIiLGJ1ZmZlcmVkOjAsdGl0bGU6IiIsZXBuYW1lOiIiLHNpbmdlcjoiIixjb3ZlckltZ1VybDoiIix3ZWJVcmw6IiIsc3RhcnRUaW1lOjAsZXJyTXNnOiJnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpvayJ9LHQ9WWkoKTtpZih0KXt2YXIgbj17ZHVyYXRpb246dC5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRUaW1lOnQuaXNTdG9wcGVkPzA6dC5nZXRQb3NpdGlvbigpLHBhdXNlZDp0LmlzUGF1c2VkKCksc3JjOnQuc3JjLGJ1ZmZlcmVkOnQuZ2V0QnVmZmVyZWQoKSx0aXRsZTp0LnRpdGxlLGVwbmFtZTp0LmVwbmFtZSxzaW5nZXI6dC5zaW5nZXIsY292ZXJJbWdVcmw6dC5jb3ZlckltZ1VybCx3ZWJVcmw6dC53ZWJVcmwsc3RhcnRUaW1lOnQuc3RhcnRUaW1lfTtlPU9iamVjdC5hc3NpZ24oZSxuKX1yZXR1cm4gZX0sb3BlcmF0ZU1hcFBsYXllcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxjLHUsbDt0LiRwYWdlLm1ldGEuaXNOVnVlPyhjPWUsdT10LGw9cixhb1tuXShybyhjLHUpLGwpKTooaT1lLG89bixhPXIscz10LiRwYWdlLmlkLGFnLnB1Ymxpc2hIYW5kbGVyKHMrIi1tYXAtIitpLHttYXBJZDppLHR5cGU6byxkYXRhOmF9LHMpKX0sb3BlcmF0ZVZpZGVvUGxheWVyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLGMsdSxsO3QuJHBhZ2UubWV0YS5pc05WdWU/KGM9ZSx1PXQsbD1yLHNvW25dKHJvKGMsdSksbCkpOihpPWUsbz1uLGE9cixzPXQuJHBhZ2UuaWQsYWcucHVibGlzaEhhbmRsZXIocysiLXZpZGVvLSIraSx7dmlkZW9JZDppLHR5cGU6byxkYXRhOmF9LHMpKX0sTGl2ZVB1c2hlckNvbnRleHQ6Zm8sY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC4kcGFnZS5tZXRhLmlzTlZ1ZT9mdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybiBjb25zb2xlLndhcm4oInVuaS5jcmVhdGVMaXZlUHVzaGVyQ29udGV4dDogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudCIpO3ZhciBuPXJvKGUsdCk7cmV0dXJuIG4/bmV3IGNvKGUsbik6Y29uc29sZS53YXJuKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfShlLHQpOm5ldyBmbyhlLHQpfSxzdGFydEFjY2VsZXJvbWV0ZXI6Ym8sc3RvcEFjY2VsZXJvbWV0ZXI6d28sb25BY2NlbGVyb21ldGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe19vLmxlbmd0aHx8Ym8oKSxfby5wdXNoKGUpfSxvZmZBY2NlbGVyb21ldGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PV9vLmluZGV4T2YoZSk7MDw9dCYmX28uc3BsaWNlKHQsMSl9X28ubGVuZ3RofHx3bygpfSxhZGRQaG9uZUNvbnRhY3Q6ZnVuY3Rpb24obixyKXtvZy5jb250YWN0cy5nZXRBZGRyZXNzQm9vayhvZy5jb250YWN0cy5BRERSRVNTQk9PS19QSE9ORSxmdW5jdGlvbihlKXshbi5waG90b0ZpbGVQYXRoJiYobi5waG90b0ZpbGVQYXRoPSIiKTt2YXIgdD1lLmNyZWF0ZSgpOyFmdW5jdGlvbiByKGksbyx0KXt2YXIgYT0wO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciBlPXRbbl07Im9iamVjdCIhPXR5cGVvZiBlPy0xIT09U28uaW5kZXhPZihuKT9pW25dPXRbbl06dm9pZCAwIT09b1tlXT8oYSsrLGlbbl09b1tlXSk6ZGVsZXRlIGlbbl06ZSBpbnN0YW5jZW9mIEFycmF5PyhpW25dPVtdLGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD17fTtyKHQsbyxlKSYmaVtuXS5wdXNoKHQpfSksaVtuXS5sZW5ndGg/YSsrOmRlbGV0ZSBpW25dKTooaVtuXT17fSxyKGlbbl0sbyxlKT9hKys6ZGVsZXRlIGlbbl0pfSksYX0odCxuLGtvKSx0LnNhdmUoZnVuY3Rpb24oKXtmaShyLHtlcnJNc2c6ImFkZFBob25lQ29udGFjdDpvayJ9KX0sZnVuY3Rpb24oZSl7Zmkocix7ZXJyTXNnOiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCJ9KX0pfSxmdW5jdGlvbihlKXtmaShyLHtlcnJNc2c6ImFkZFBob25lQ29udGFjdDpmYWlsIn0pfSl9LG9uQmx1ZXRvb3RoRGV2aWNlRm91bmQ6eG8sb25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2U6Q28sb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2U6VG8sb25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOk9vLG9wZW5CbHVldG9vdGhBZGFwdGVyOkFvLGNsb3NlQmx1ZXRvb3RoQWRhcHRlcjokbyxnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGU6UG8sc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Ok1vLHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5OmpvLGdldEJsdWV0b290aERldmljZXM6TG8sZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlczpCbyxjcmVhdGVCTEVDb25uZWN0aW9uOk5vLGNsb3NlQkxFQ29ubmVjdGlvbjpEbyxnZXRCTEVEZXZpY2VTZXJ2aWNlczpSbyxnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3M6Rm8sbm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpVbyxyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTp6byx3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWU6Vm8sc2V0QkxFTVRVOnFvLGdldEJMRURldmljZVJTU0k6V28sZ2V0U2NyZWVuQnJpZ2h0bmVzczpmdW5jdGlvbigpe3JldHVybntlcnJNc2c6ImdldFNjcmVlbkJyaWdodG5lc3M6b2siLHZhbHVlOm9nLnNjcmVlbi5nZXRCcmlnaHRuZXNzKCExKX19LHNldFNjcmVlbkJyaWdodG5lc3M6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudmFsdWU7cmV0dXJuIG9nLnNjcmVlbi5zZXRCcmlnaHRuZXNzKHQsITEpLHtlcnJNc2c6InNldFNjcmVlbkJyaWdodG5lc3M6b2sifX0sc2V0S2VlcFNjcmVlbk9uOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmtlZXBTY3JlZW5PbjtyZXR1cm4gb2cuZGV2aWNlLnNldFdha2Vsb2NrKCEhdCkse2Vyck1zZzoic2V0S2VlcFNjcmVlbk9uOm9rIn19LGdldENsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSx0KXtwaSgiY2xpcGJvYXJkIikuZ2V0U3RyaW5nKGZ1bmN0aW9uKGUpeyJzdWNjZXNzIj09PWUucmVzdWx0P2ZpKHQse2RhdGE6ZS5kYXRhLGVyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpvayJ9KTpmaSh0LHtkYXRhOmUucmVzdWx0LGVyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpmYWlsIn0pfSl9LHNldENsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3JldHVybiBwaSgiY2xpcGJvYXJkIikuc2V0U3RyaW5nKHQpLHtlcnJNc2c6InNldENsaXBib2FyZERhdGE6b2sifX0sc3RhcnRDb21wYXNzOkdvLHN0b3BDb21wYXNzOlhvLG9uQ29tcGFzc0NoYW5nZTpmdW5jdGlvbihlKXtIby5sZW5ndGh8fEdvKCksSG8ucHVzaChlKX0sb2ZmQ29tcGFzc0NoYW5nZTpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1Iby5pbmRleE9mKGUpOzA8PXQmJkhvLnNwbGljZSh0LDEpfUhvLmxlbmd0aHx8WG8oKX0sZ2V0TmV0d29ya1R5cGU6ZnVuY3Rpb24oKXtyZXR1cm57ZXJyTXNnOiJnZXROZXR3b3JrVHlwZTpvayIsbmV0d29ya1R5cGU6dm9bb2cubmV0d29ya2luZm8uZ2V0Q3VycmVudFR5cGUoKV18fCJ1bmtub3duIn19LG9uQmVhY29uVXBkYXRlOkpvLG9uQmVhY29uU2VydmljZUNoYW5nZTpZbyxnZXRCZWFjb25zOktvLHN0YXJ0QmVhY29uRGlzY292ZXJ5OlpvLHN0b3BCZWFjb25EaXNjb3Zlcnk6UW8sbWFrZVBob25lQ2FsbDpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5waG9uZU51bWJlcjtyZXR1cm4gb2cuZGV2aWNlLmRpYWwodCkse2Vyck1zZzoibWFrZVBob25lQ2FsbDpvayJ9fSxzY2FuQ29kZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT1kZy5udnVlQ29tcGlsZXI/UGE6Q2E7cmV0dXJuIG4uc2NhbkNvZGUuYXBwbHkobixlKX0sY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOkxhLGNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6QmEsc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUucmVxdWVzdEF1dGhNb2RlcyxyPWUuY2hhbGxlbmdlO3ZvaWQgMD09PXImJihyPSExKTt2YXIgaT1lLmF1dGhDb250ZW50LG89TGEoKS5zdXBwb3J0TW9kZTtpZigwPT09by5sZW5ndGgpcmV0dXJue2F1dGhNb2RlOm9bMF18fCJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMSxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vdCBzdXBwb3J0In07dmFyIGE9W107aWYobi5tYXAoZnVuY3Rpb24oZSx0KXstMTxvLmluZGV4T2YoZSkmJmEucHVzaChlKX0pLDA9PT1hLmxlbmd0aClyZXR1cm57YXV0aE1vZGU6YVswXXx8ImZpbmdlclByaW50IixlcnJDb2RlOjkwMDAzLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm8gY29ycmVzcG9uZGluZyBtb2RlIn07dmFyIHM9W107aWYoYS5tYXAoZnVuY3Rpb24oZSx0KXtCYSh7Y2hlY2tBdXRoTW9kZTplfSkuaXNFbnJvbGxlZCYmcy5wdXNoKGUpfSksMD09PXMubGVuZ3RoKXJldHVybnthdXRoTW9kZTphWzBdLGVyckNvZGU6OTAwMTEsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBubyAiK2FbMF0rIiBlbnJvbGxlZCJ9O3ZhciBjPXNbMF07aWYoImZpbmdlclByaW50Ij09PWMpe3ZhciB1LGw9bnVsbCxkPWl8fGF0KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50Iik7ImFuZHJvaWQiPT09b2cub3MubmFtZS50b0xvd2VyQ2FzZSgpJiYoKGw9b2cubmF0aXZlVUkuc2hvd1dhaXRpbmcoZCkpLm9uY2xvc2U9ZnVuY3Rpb24oKXtvZy5maW5nZXJwcmludC5jYW5jZWwoKX0pLG9nLmZpbmdlcnByaW50LmF1dGhlbnRpY2F0ZShmdW5jdGlvbigpe29nLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLGZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTowLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOm9rIn0pfSxmdW5jdGlvbihlKXtzd2l0Y2goZS5jb2RlKXtjYXNlIGUuQVVUSEVOVElDQVRFX01JU01BVENIOmwmJihjZyh1KSxsLnNldFRpdGxlKGF0KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50IikpLHU9c2coZnVuY3Rpb24oKXtsJiZsLnNldFRpdGxlKGQpfSwxZTMpKTticmVhaztjYXNlIGUuQVVUSEVOVElDQVRFX09WRVJMSU1JVDpvZy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxmaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6OTAwMTAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBhdXRoZW50aWNhdGUgZnJlZXplLiBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIn0pO2JyZWFrO2Nhc2UgZS5DQU5DRUw6b2cubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA4LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgY2FuY2VsIn0pO2JyZWFrO2RlZmF1bHQ6b2cubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA3LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSl9fSx7bWVzc2FnZTppfSl9ZWxzZSJmYWNpYWwiPT09YyYmcGkoImZhY2VJRCIpLmF1dGhlbnRpY2F0ZSh7bWVzc2FnZTppfSxmdW5jdGlvbihlKXtpZigic3VjY2VzcyI9PT1lLnR5cGUmJjA9PT1lLmNvZGUpZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246b2sifSk7ZWxzZSBzd2l0Y2goZS5jb2RlKXtjYXNlIDQ6ZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA5LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSk7YnJlYWs7Y2FzZSA1OmZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAxMCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGF1dGhlbnRpY2F0ZSBmcmVlemUuIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIifSk7YnJlYWs7Y2FzZSA2OmZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwOCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGNhbmNlbCJ9KTticmVhaztkZWZhdWx0OmZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwNyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIn0pfX0pfSx3ZWV4R2V0U3lzdGVtSW5mb1N5bmM6WHMsZ2V0RGV2aWNlSW5mbzpKcyxnZXRBcHBCYXNlSW5mbzpZcyxnZXRTeXN0ZW1JbmZvU3luYzpmdW5jdGlvbigpe3JldHVybiB3aShLcyxPYmplY3QuY3JlYXRlKG51bGwpLCJnZXRTeXN0ZW1JbmZvIiwiZ2V0U3lzdGVtSW5mb1N5bmMiKX0sZ2V0U3lzdGVtSW5mbzpLcyx2aWJyYXRlTG9uZzpmdW5jdGlvbigpe3JldHVybiBvZy5kZXZpY2UudmlicmF0ZSg0MDApLHtlcnJNc2c6InZpYnJhdGVMb25nOm9rIn19LHZpYnJhdGVTaG9ydDpmdW5jdGlvbigpe3JldHVybiBvZy5kZXZpY2UudmlicmF0ZSgxNSkse2Vyck1zZzoidmlicmF0ZVNob3J0Om9rIn19LGdldFdpbmRvd0luZm86V3MsZ2V0U3lzdGVtU2V0dGluZzpmdW5jdGlvbigpe3ZhciBlPSgwLGlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRTeXN0ZW1TZXR0aW5nKSgpO3RyeXsic3RyaW5nIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpfWNhdGNoKGUpe31yZXR1cm4gZX0sZ2V0QXBwQXV0aG9yaXplU2V0dGluZzpacyxvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpmdW5jdGlvbihlLHQpeygwLGlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5vcGVuQXBwQXV0aG9yaXplU2V0dGluZykoZnVuY3Rpb24oZSl7InN1Y2Nlc3MiPT09ZS50eXBlP2ZpKHQse2Vyck1zZzoib3BlbkFwcEF1dGhvcml6ZVNldHRpbmc6b2sifSk6ZmkodCx7ZXJyTXNnOiJvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpmYWlsIn0pfSl9LHNhdmVGaWxlOmZ1bmN0aW9uKGUsbil7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LHI9ZS50ZW1wRmlsZVBhdGgsaT1MaShuLCJzYXZlRmlsZSIpLG89IiIrRGF0ZS5ub3coKStuYysrKygxPCh0PXIuc3BsaXQoIi4iKSkubGVuZ3RoPyIuIit0W3QubGVuZ3RoLTFdOiIiKTtvZy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHIsZnVuY3Rpb24odCl7dGMoZnVuY3Rpb24oZSl7dC5jb3B5VG8oZSxvLGZ1bmN0aW9uKCl7Zmkobix7ZXJyTXNnOiJzYXZlRmlsZTpvayIsc2F2ZWRGaWxlUGF0aDplYysiLyIrb30pfSxpKX0saSl9LGkpfSxnZXRTYXZlZEZpbGVMaXN0OmZ1bmN0aW9uKGUsaSl7dmFyIG89TGkoaSwiZ2V0U2F2ZWRGaWxlTGlzdCIpO3RjKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlUmVhZGVyKCkscj1bXTt0LnJlYWRFbnRyaWVzKGZ1bmN0aW9uKG4pe24mJm4ubGVuZ3RoP24uZm9yRWFjaChmdW5jdGlvbih0KXt0LmdldE1ldGFkYXRhKGZ1bmN0aW9uKGUpe3IucHVzaCh7ZmlsZVBhdGg6b2cuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbSh0LmZ1bGxQYXRoKSxjcmVhdGVUaW1lOmUubW9kaWZpY2F0aW9uVGltZS5nZXRUaW1lKCksc2l6ZTplLnNpemV9KSxyLmxlbmd0aD09PW4ubGVuZ3RoJiZmaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbywhMSl9KTpmaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbyl9LG8pfSxnZXRGaWxlSW5mbzpyYyxnZXRTYXZlZEZpbGVJbmZvOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGgscj1MaSh0LCJnZXRTYXZlZEZpbGVJbmZvIik7b2cuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChuLGZ1bmN0aW9uKGUpe2UuZ2V0TWV0YWRhdGEoZnVuY3Rpb24oZSl7ZmkodCx7Y3JlYXRlVGltZTplLm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6ZS5zaXplLGVyck1zZzoiZ2V0U2F2ZWRGaWxlSW5mbzpvayJ9KX0sciwhMSl9LHIpfSxyZW1vdmVTYXZlZEZpbGU6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPUxpKHQsInJlbW92ZVNhdmVkRmlsZSIpO29nLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwobixmdW5jdGlvbihlKXtlLnJlbW92ZShmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoicmVtb3ZlU2F2ZWRGaWxlOm9rIn0pfSxyKX0scil9LG9wZW5Eb2N1bWVudDpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9KGUuZmlsZVR5cGUsamkodCwic2F2ZUZpbGUiKSksaT1MaSh0LCJzYXZlRmlsZSIpO29nLnJ1bnRpbWUub3BlbkRvY3VtZW50KFRpKG4pLHZvaWQgMCxyLGkpfSxjaG9vc2VMb2NhdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT1kZy5udnVlQ29tcGlsZXI/YWM6b2M7cmV0dXJuIG4uY2hvb3NlTG9jYXRpb24uYXBwbHkobixlKX0sZ2V0TG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS50eXBlO3ZvaWQgMD09PW4mJihuPSJ3Z3M4NCIpO3ZhciByPWUuZ2VvY29kZTt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGk9ZS5hbHRpdHVkZTt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIG89ZS5pc0hpZ2hBY2N1cmFjeTt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5oaWdoQWNjdXJhY3lFeHBpcmVUaW1lLHM9TGkodCwiZ2V0TG9jYXRpb24iKTtvZy5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZnVuY3Rpb24oZSl7c2MobixlLHQpfSxmdW5jdGlvbihlKXsxNTAxIT09ZS5jb2RlP3MoZSk6c2MobixlLHQpfSx7Z2VvY29kZTpyLGVuYWJsZUhpZ2hBY2N1cmFjeTpvfHxpLHRpbWVvdXQ6YSxjb29yZHNUeXBlOm59KX0sb3BlbkxvY2F0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPSJ3ZWV4IiE9PWRnLm52dWVDb21waWxlcj91YzpjYztyZXR1cm4gbi5vcGVuTG9jYXRpb24uYXBwbHkobixlKX0sc3RhcnRMb2NhdGlvblVwZGF0ZTpmdW5jdGlvbihlLG4pe3ZhciB0PWUudHlwZTt2b2lkIDA9PT10JiYodD0iZ2NqMDIiKSxwYz1wY3x8b2cuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihmdW5jdGlvbih0KXtmYz0hMCxsYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdC5jb29yZHMpfSl9LGZ1bmN0aW9uKHQpe2ZjfHwoZmkobix7ZXJyTXNnOiJzdGFydExvY2F0aW9uVXBkYXRlOmZhaWwgIit0Lm1lc3NhZ2V9KSxmYz0hMCksZGMuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHtlcnJNc2c6Im9uTG9jYXRpb25DaGFuZ2U6ZmFpbCAiK3QubWVzc2FnZX0pfSl9LHtjb29yZHNUeXBlOnR9KSxzZyhmdW5jdGlvbigpe2ZpKG4se2Vyck1zZzoic3RhcnRMb2NhdGlvblVwZGF0ZTpvayJ9KX0sMTAwKX0sc3RvcExvY2F0aW9uVXBkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPT1wYyYmKG9nLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2gocGMpLGZjPSExLHBjPTApLHt9fSxvbkxvY2F0aW9uQ2hhbmdlOmZ1bmN0aW9uKGUpe2xjLnB1c2goZSl9LG9mZkxvY2F0aW9uQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWxjLmluZGV4T2YoZSk7MDw9dCYmbGMuc3BsaWNlKHQsMSl9ZWxzZSBsYz1bXX0sb25Mb2NhdGlvbkNoYW5nZUVycm9yOmZ1bmN0aW9uKGUpe2RjLnB1c2goZSl9LG9mZkxvY2F0aW9uQ2hhbmdlRXJyb3I6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZGMuaW5kZXhPZihlKTswPD10JiZkYy5zcGxpY2UodCwxKX1lbHNlIGRjPVtdfSxzdGFydFJlY29yZDpmdW5jdGlvbihlLHQpe2hjJiZoYy5zdG9wKCksKGhjPW9nLmF1ZGlvLmdldFJlY29yZGVyKCkpLnJlY29yZCh7ZmlsZW5hbWU6Il9kb2MvYXVkaW8vIixmb3JtYXQ6ImFhYyJ9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoic3RhcnRSZWNvcmQ6b2siLHRlbXBGaWxlUGF0aDplfSl9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoic3RhcnRSZWNvcmQ6ZmFpbCJ9KX0pLHZjPXNnKGZ1bmN0aW9uKCl7aGMuc3RvcCgpLGhjPSExfSwzNmU1KX0sc3RvcFJlY29yZDpmdW5jdGlvbigpe3JldHVybiBoYz8odmMmJmNnKHZjKSxoYy5zdG9wKCkse2Vyck1zZzoic3RvcFJlY29yZDpvayJ9KTp7ZXJyTXNnOiJzdG9wUmVjb3JkOmZhaWwifX0scGxheVZvaWNlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGg7aWYoZ2MmJm1jPT09biYmInBhdXNlIj09PXljKXJldHVybiB5Yz0icGxheSIsZ2MucGxheShmdW5jdGlvbihlKXt5Yz1tYz1nYz0hMSxmaSh0LHtlcnJNc2c6InBsYXlWb2ljZTpvayJ9KX0pLHtlcnJNc2c6InBsYXlWb2ljZTpvayJ9O2djJiZnYy5zdG9wKCksbWM9bix5Yz0icGxheSIsKGdjPW9nLmF1ZGlvLmNyZWF0ZVBsYXllcihUaShuKSkpLnBsYXkoZnVuY3Rpb24oZSl7eWM9bWM9Z2M9ITEsZmkodCx7ZXJyTXNnOiJwbGF5Vm9pY2U6b2sifSl9KX0scGF1c2VWb2ljZTpmdW5jdGlvbigpe3JldHVybiBnYyYmInBsYXkiPT09eWMmJihnYy5wYXVzZSgpLHljPSJwYXVzZSIpLHtlcnJNc2c6InBhdXNlVm9pY2U6b2sifX0sc3RvcFZvaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIGdjJiYoZ2Muc3RvcCgpLHljPW1jPWdjPSExKSx7ZXJyTXNnOiJzdG9wVm9pY2U6b2sifX0sY2hvb3NlSW1hZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5jb3VudCxyPWUuc2l6ZVR5cGUsaT1lLnNvdXJjZVR5cGUsbz1lLmNyb3AsYT1MaSh0LCJjaG9vc2VJbWFnZSIsImNhbmNlbCIpO2Z1bmN0aW9uIHMocil7dmFyIGk9W10sbz1bXTtQcm9taXNlLmFsbChyLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gcj1lLG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7b2cuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChyLGZ1bmN0aW9uKGUpe2UuZ2V0TWV0YWRhdGEodCxuLCExKX0sbil9KTt2YXIgcn0pKS50aGVuKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciBuPXJbdF07by5wdXNoKG4pLGkucHVzaCh7cGF0aDpuLHNpemU6ZS5zaXplfSl9KSxmaSh0LHtlcnJNc2c6ImNob29zZUltYWdlOm9rIix0ZW1wRmlsZVBhdGhzOm8sdGVtcEZpbGVzOml9KX0pLmNhdGNoKGEpfWZ1bmN0aW9uIGMoKXtvZy5jYW1lcmEuZ2V0Q2FtZXJhKCkuY2FwdHVyZUltYWdlKGZ1bmN0aW9uKGUpe3JldHVybiBzKFtlXSl9LGEse2ZpbGVuYW1lOnlvKyIvY2FtZXJhLyIscmVzb2x1dGlvbjoiaGlnaCIsY3JvcDpvLHNpemVUeXBlOnJ9KX1mdW5jdGlvbiB1KCl7b2cuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe3JldHVybiBzKGUuZmlsZXMpfSxhLHttYXhpbXVtOm4sbXVsdGlwbGU6ITAsc3lzdGVtOiExLGZpbGVuYW1lOnlvKyIvZ2FsbGVyeS8iLHBlcm1pc3Npb25BbGVydDohMCxjcm9wOm8sc2l6ZVR5cGU6cn0pfWlmKDE9PT1pLmxlbmd0aCl7aWYoaS5pbmNsdWRlcygiYWxidW0iKSlyZXR1cm4gdm9pZCB1KCk7aWYoaS5pbmNsdWRlcygiY2FtZXJhIikpcmV0dXJuIHZvaWQgYygpfW9nLm5hdGl2ZVVJLmFjdGlvblNoZWV0KHtjYW5jZWw6YXQoInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6YXQoInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSIpfSx7dGl0bGU6YXQoInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIil9XX0sZnVuY3Rpb24oZSl7c3dpdGNoKGUuaW5kZXgpe2Nhc2UgMTpjKCk7YnJlYWs7Y2FzZSAyOnUoKTticmVhaztkZWZhdWx0OmEoKX19KX0sY2hvb3NlVmlkZW86ZnVuY3Rpb24oZSxyKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5zb3VyY2VUeXBlLG49ZS5jb21wcmVzc2VkLGk9ZS5tYXhEdXJhdGlvbixvPWUuY2FtZXJhLGE9TGkociwiY2hvb3NlVmlkZW8iLCJjYW5jZWwiKTtmdW5jdGlvbiBzKG4pe3ZvaWQgMD09PW4mJihuPSIiKSxvZy5pby5nZXRWaWRlb0luZm8oe2ZpbGVQYXRoOm4sc3VjY2VzczpmdW5jdGlvbihlKXt2YXIgdD17ZXJyTXNnOiJjaG9vc2VWaWRlbzpvayIsdGVtcEZpbGVQYXRoOm59O3Quc2l6ZT1lLnNpemUsdC5kdXJhdGlvbj1lLmR1cmF0aW9uLHQud2lkdGg9ZS53aWR0aCx0LmhlaWdodD1lLmhlaWdodCxmaShyLHQpfSxmYWlsOmF9KX1mdW5jdGlvbiBjKCl7b2cuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe3JldHVybiBzKGUuZmlsZXNbMF0pfSxhLHtmaWx0ZXI6InZpZGVvIixzeXN0ZW06ITEsbXVsdGlwbGU6ITAsbWF4aW11bToxLGZpbGVuYW1lOnlvKyIvZ2FsbGVyeS8iLHBlcm1pc3Npb25BbGVydDohMCx2aWRlb0NvbXByZXNzOm59KX1mdW5jdGlvbiB1KCl7b2cuY2FtZXJhLmdldENhbWVyYSgpLnN0YXJ0VmlkZW9DYXB0dXJlKHMsYSx7aW5kZXg6ImZyb250Ij09PW8/MjoxLHZpZGVvTWF4aW11bUR1cmF0aW9uOmksZmlsZW5hbWU6eW8rIi9jYW1lcmEvIix2aWRlb0NvbXByZXNzOm59KX1pZigxPT09dC5sZW5ndGgpe2lmKHQuaW5jbHVkZXMoImFsYnVtIikpcmV0dXJuIHZvaWQgYygpO2lmKHQuaW5jbHVkZXMoImNhbWVyYSIpKXJldHVybiB2b2lkIHUoKX1vZy5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmF0KCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIiksYnV0dG9uczpbe3RpdGxlOmF0KCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiKX0se3RpdGxlOmF0KCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSIpfV19LGZ1bmN0aW9uKGUpe3N3aXRjaChlLmluZGV4KXtjYXNlIDE6dSgpO2JyZWFrO2Nhc2UgMjpjKCk7YnJlYWs7ZGVmYXVsdDphKCl9fSl9LGNvbXByZXNzSW1hZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj15bysiL2NvbXByZXNzZWQvIitEYXRlLm5vdygpKyJfIitOaShlLnNyYykscj1MaSh0LCJjb21wcmVzc0ltYWdlIiksaT1lLmNvbXByZXNzZWRXaWR0aCxvPWUuY29tcHJlc3NlZEhlaWdodDsibnVtYmVyIj09dHlwZW9mIGkmJihlLndpZHRoPWkrInB4IiksIm51bWJlciI9PXR5cGVvZiBvJiYoZS5oZWlnaHQ9bysicHgiKSxvZy56aXAuY29tcHJlc3NJbWFnZShPYmplY3QuYXNzaWduKHt9LGUse2RzdDpufSksZnVuY3Rpb24oKXtmaSh0LHtlcnJNc2c6ImNvbXByZXNzSW1hZ2U6b2siLHRlbXBGaWxlUGF0aDpufSl9LHIpfSxjb21wcmVzc1ZpZGVvOmZ1bmN0aW9uKGUsdCl7dmFyIG49eW8rIi9jb21wcmVzc2VkLyIrRGF0ZS5ub3coKSsiXyIrTmkoZS5zcmMpLHI9amkodCwiY29tcHJlc3NWaWRlbyIpLGk9TGkodCwiY29tcHJlc3NWaWRlbyIpO29nLnppcC5jb21wcmVzc1ZpZGVvKE9iamVjdC5hc3NpZ24oe30sZSx7ZmlsZW5hbWU6bn0pLHIsaSl9LGdldEltYWdlSW5mbzp3YyxnZXRWaWRlb0luZm86a2MscHJldmlld0ltYWdlUGx1czpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5jdXJyZW50O3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWUuYmFja2dyb3VuZDt2b2lkIDA9PT1uJiYobj0iIzAwMDAwMCIpO3ZhciByPWUuaW5kaWNhdG9yO3ZvaWQgMD09PXImJihyPSJudW1iZXIiKTt2YXIgaT1lLmxvb3A7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBvPWUudXJscyxhPWUubG9uZ1ByZXNzQWN0aW9ucztvPW8ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBUaShlKX0pO3ZhciBzPU51bWJlcih0KTtyZXR1cm4gdD1pc05hTihzKT8odD1vLmluZGV4T2YoVGkodCkpKTwwPzA6dDpzLG9nLm5hdGl2ZVVJLnByZXZpZXdJbWFnZShvLHtjdXJyZW50OnQsYmFja2dyb3VuZDpuLGluZGljYXRvcjpyLGxvb3A6aSxvbkxvbmdQcmVzczpmdW5jdGlvbih0KXt2YXIgZT1bXSxuPSIiLHI9IiIsaT1hJiZhLmNhbGxiYWNrSWQ7aT8oZT1hLml0ZW1MaXN0P2EuaXRlbUxpc3Q6W10sbj1hLml0ZW1Db2xvcj9hLml0ZW1Db2xvcjoiIzAwMDAwMCIscj1hLnRpdGxlP2EudGl0bGU6IiIpOihlPVthdCgidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSIpXSxuPSIjMDAwMDAwIixyPSIiKTt2YXIgbz17YnV0dG9uczplLm1hcChmdW5jdGlvbihlKXtyZXR1cm57dGl0bGU6ZSxjb2xvcjpufX0pLGNhbmNlbDphdCgidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiKX07ciYmKG8udGl0bGU9ciksb2cubmF0aXZlVUkuYWN0aW9uU2hlZXQobyxmdW5jdGlvbihlKXtpZigwPGUuaW5kZXgpe2lmKGkpcmV0dXJuIHZvaWQgaGkoYS5jYWxsYmFja0lkLHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpvayIsdGFwSW5kZXg6ZS5pbmRleC0xLGluZGV4OnQuaW5kZXh9KTtvZy5nYWxsZXJ5LnNhdmUodC51cmwsZnVuY3Rpb24oZSl7b2cubmF0aXZlVUkudG9hc3QoYXQoInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIikpfSxmdW5jdGlvbigpe29nLm5hdGl2ZVVJLnRvYXN0KGF0KCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCIpKX0pfWVsc2UgaSYmaGkoYS5jYWxsYmFja0lkLHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCJ9KX0pfX0pLHtlcnJNc2c6InByZXZpZXdJbWFnZTpvayJ9fSxjbG9zZVByZXZpZXdJbWFnZVBsdXM6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG9nLm5hdGl2ZVVJLmNsb3NlUHJldmlld0ltYWdlKCkse2Vyck1zZzoiY2xvc2VQcmV2aWV3SW1hZ2VQbHVzOm9rIn19Y2F0Y2goZSl7cmV0dXJue2Vyck1zZzoiY2xvc2VQcmV2aWV3SW1hZ2VQbHVzOmZhaWwifX19LG9wZXJhdGVSZWNvcmRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPWUub3BlcmF0aW9uVHlwZSxyPXt9O2Zvcih2YXIgaSBpbiBlKS0xPT09WyJvcGVyYXRpb25UeXBlIl0uaW5kZXhPZihpKSYmKHJbaV09ZVtpXSk7dmFyIG89cjtyZXR1cm4geGNbbl0obykse2Vyck1zZzoib3BlcmF0ZVJlY29yZGVyOm9rIn19LHNhdmVJbWFnZVRvUGhvdG9zQWxidW06ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPWppKHQsInNhdmVJbWFnZVRvUGhvdG9zQWxidW0iKSxpPUxpKHQsInNhdmVJbWFnZVRvUGhvdG9zQWxidW0iKTtvZy5nYWxsZXJ5LnNhdmUoVGkobikscixpKX0sc2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoO29nLmdhbGxlcnkuc2F2ZShUaShuKSxmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6InNhdmVWaWRlb1RvUGhvdG9zQWxidW06b2sifSl9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoic2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpmYWlsIn0pfSl9LG9wZXJhdGVEb3dubG9hZFRhc2s6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuZG93bmxvYWRUYXNrSWQsbj1lLm9wZXJhdGlvblR5cGUscj1UY1t0XTtyZXR1cm4gciYmImFib3J0Ij09PW4/KGRlbGV0ZSBUY1t0XSxyLmFib3J0KCksT2Moe2Rvd25sb2FkVGFza0lkOnQsc3RhdGU6ImZhaWwiLGVyck1zZzoiYWJvcnQifSkse2Vyck1zZzoib3BlcmF0ZURvd25sb2FkVGFzazpvayJ9KTp7ZXJyTXNnOiJvcGVyYXRlRG93bmxvYWRUYXNrOmZhaWwifX0sY3JlYXRlRG93bmxvYWRUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnVybCxyPWUuaGVhZGVyLGk9ZS50aW1lb3V0O2k9KGl8fGRnLm5ldHdvcmtUaW1lb3V0JiZkZy5uZXR3b3JrVGltZW91dC5yZXF1ZXN0fHw2ZTQpLzFlMzt2YXIgbz1vZy5kb3dubG9hZGVyLmNyZWF0ZURvd25sb2FkKHQse3RpbWVvdXQ6aSxmaWxlbmFtZTp5bysiL2Rvd25sb2FkLyIscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LGZ1bmN0aW9uKGUsdCl7T2ModD97ZG93bmxvYWRUYXNrSWQ6bixzdGF0ZToic3VjY2VzcyIsdGVtcEZpbGVQYXRoOmUuZmlsZW5hbWUsc3RhdHVzQ29kZTp0fTp7ZG93bmxvYWRUYXNrSWQ6bixzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTp0fSl9KTtmb3IodmFyIGEgaW4gcilrKHIsYSkmJm8uc2V0UmVxdWVzdEhlYWRlcihhLHJbYV0pO3JldHVybiBvLmFkZEV2ZW50TGlzdGVuZXIoInN0YXRlY2hhbmdlZCIsZnVuY3Rpb24oZSx0KXtlLmRvd25sb2FkZWRTaXplJiZlLnRvdGFsU2l6ZSYmT2Moe2Rvd25sb2FkVGFza0lkOm4sc3RhdGU6InByb2dyZXNzVXBkYXRlIixwcm9ncmVzczpwYXJzZUludChlLmRvd25sb2FkZWRTaXplL2UudG90YWxTaXplKjEwMCksdG90YWxCeXRlc1dyaXR0ZW46ZS5kb3dubG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlOmUudG90YWxTaXplfSl9KSwoVGNbbl09bykuc3RhcnQoKSx7ZG93bmxvYWRUYXNrSWQ6bixlcnJNc2c6ImNyZWF0ZURvd25sb2FkVGFzazpvayJ9fSgrK0NjLGUpfSxjcmVhdGVSZXF1ZXN0VGFza0J5SWQ6UGMsY3JlYXRlUmVxdWVzdFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIFBjKCsrRWMsZSl9LG9wZXJhdGVSZXF1ZXN0VGFzazpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5yZXF1ZXN0VGFza0lkLG49ZS5vcGVyYXRpb25UeXBlLHI9SWNbdF07cmV0dXJuIHImJiJhYm9ydCI9PT1uPyhyLmFib3J0KCkse2Vyck1zZzoib3BlcmF0ZVJlcXVlc3RUYXNrOm9rIn0pOntlcnJNc2c6Im9wZXJhdGVSZXF1ZXN0VGFzazpmYWlsIn19LGNvbmZpZ01UTFM6ZnVuY3Rpb24oZSxpKXt2YXIgdD1lLmNlcnRpZmljYXRlcztwaSgic3RyZWFtIikuY29uZmlnTVRMUyh0LGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUuY29kZSxyPWUubWVzc2FnZTtzd2l0Y2godCl7Y2FzZSJzdWNjZXNzIjpmaShpLHtlcnJNc2c6ImNvbmZpZ01UTFM6b2siLGNvZGU6bn0pO2JyZWFrO2Nhc2UiZmFpbCI6ZmkoaSx7ZXJyTXNnOiJjb25maWdNVExTOmZhaWwgIityLGNvZGU6bn0pfX0pfSxjcmVhdGVTb2NrZXRUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBCYyhTdHJpbmcoRGF0ZS5ub3coKSksZSl9LG9wZXJhdGVTb2NrZXRUYXNrOmZ1bmN0aW9uKGUpe3ZhciB0PWUsbj10Lm9wZXJhdGlvblR5cGUscj10LmNvZGUsaT10LnJlYXNvbixvPXQuZGF0YSxhPXQuc29ja2V0VGFza0lkLHM9amNbYV07aWYoIXMpcmV0dXJue2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6ZmFpbCJ9O3N3aXRjaChuKXtjYXNlInNlbmQiOnJldHVybiBvJiZzLnNlbmQoe2lkOmEsZGF0YToib2JqZWN0Ij09dHlwZW9mIG8/eyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OmJpKG8pfTpvfSkse2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6b2sifTtjYXNlImNsb3NlIjpyZXR1cm4gcy5jbG9zZSh7aWQ6YSxjb2RlOnIscmVhc29uOml9KSxkZWxldGUgamNbYV0se2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6b2sifX1yZXR1cm57ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpmYWlsIn19LG9wZXJhdGVVcGxvYWRUYXNrOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnVwbG9hZFRhc2tJZCxuPWUub3BlcmF0aW9uVHlwZSxyPURjW3RdO3JldHVybiByJiYiYWJvcnQiPT09bj8oZGVsZXRlIERjW3RdLHIuYWJvcnQoKSxSYyh7dXBsb2FkVGFza0lkOnQsc3RhdGU6ImZhaWwiLGVyck1zZzoiYWJvcnQifSkse2Vyck1zZzoib3BlcmF0ZVVwbG9hZFRhc2s6b2sifSk6e2Vyck1zZzoib3BlcmF0ZVVwbG9hZFRhc2s6ZmFpbCJ9fSxjcmVhdGVVcGxvYWRUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnVybCxyPWUuZmlsZVBhdGgsaT1lLm5hbWUsbz1lLmZpbGVzLGE9ZS5oZWFkZXIscz1lLmZvcm1EYXRhLGM9ZS50aW1lb3V0O2M9KGN8fGRnLm5ldHdvcmtUaW1lb3V0JiZkZy5uZXR3b3JrVGltZW91dC51cGxvYWRGaWxlfHw2ZTQpLzFlMzt2YXIgdT1vZy51cGxvYWRlci5jcmVhdGVVcGxvYWQodCx7dGltZW91dDpjLHJldHJ5OjAscmV0cnlJbnRlcnZhbDowfSxmdW5jdGlvbihlLHQpe1JjKHQ/e3VwbG9hZFRhc2tJZDpuLHN0YXRlOiJzdWNjZXNzIixkYXRhOmUucmVzcG9uc2VUZXh0LHN0YXR1c0NvZGU6dH06e3VwbG9hZFRhc2tJZDpuLHN0YXRlOiJmYWlsIixkYXRhOiIiLHN0YXR1c0NvZGU6dH0pLGRlbGV0ZSBEY1tuXX0pO2Zvcih2YXIgbCBpbiBhKWsoYSxsKSYmdS5zZXRSZXF1ZXN0SGVhZGVyKGwsU3RyaW5nKGFbbF0pKTtmb3IodmFyIGQgaW4gcylrKHMsZCkmJnUuYWRkRGF0YShkLFN0cmluZyhzW2RdKSk7cmV0dXJuIG8mJm8ubGVuZ3RoP28uZm9yRWFjaChmdW5jdGlvbihlKXt1LmFkZEZpbGUoVGkoZS51cml8fGUuZmlsZVBhdGgpLHtrZXk6ZS5uYW1lfHwiZmlsZSJ9KX0pOnUuYWRkRmlsZShUaShyKSx7a2V5Oml9KSx1LmFkZEV2ZW50TGlzdGVuZXIoInN0YXRlY2hhbmdlZCIsZnVuY3Rpb24oZSx0KXtlLnVwbG9hZGVkU2l6ZSYmZS50b3RhbFNpemUmJlJjKHt1cGxvYWRUYXNrSWQ6bixzdGF0ZToicHJvZ3Jlc3NVcGRhdGUiLHByb2dyZXNzOnBhcnNlSW50KGUudXBsb2FkZWRTaXplL2UudG90YWxTaXplKjEwMCksdG90YWxCeXRlc1NlbnQ6ZS51cGxvYWRlZFNpemUsdG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kOmUudG90YWxTaXplfSl9KSwoRGNbbl09dSkuc3RhcnQoKSx7dXBsb2FkVGFza0lkOm4sZXJyTXNnOiJjcmVhdGVVcGxvYWRUYXNrOm9rIn19KCsrTmMsZSl9LGdldFByb3ZpZGVyOmZ1bmN0aW9uKGUscil7dmFyIGk9ZS5zZXJ2aWNlO1VjW2ldP1VjW2ldKGZ1bmN0aW9uKGUsdCxuKXtmaShyLGU/e2Vyck1zZzoiZ2V0UHJvdmlkZXI6ZmFpbCAiK2UubWVzc2FnZX06e2Vyck1zZzoiZ2V0UHJvdmlkZXI6b2siLHNlcnZpY2U6aSxwcm92aWRlcjp0LHByb3ZpZGVyczpuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlLnNlcnZpY2VSZWFkeSYmKGUuaXNBcHBFeGlzdD1lLnNlcnZpY2VSZWFkeSksImJvb2xlYW4iPT10eXBlb2YgZS5uYXRpdmVDbGllbnQmJihlLmlzQXBwRXhpc3Q9ZS5uYXRpdmVDbGllbnQpLGV9KX0pfSk6Zmkocix7ZXJyTXNnOiJnZXRQcm92aWRlcjpmYWlsIHNlcnZpY2Ugbm90IGZvdW5kIn0pfSxsb2dpbjpWYyxnZXRVc2VySW5mbzpxYyxnZXRVc2VyUHJvZmlsZTpmdW5jdGlvbihlLHQpe3JldHVybiBxYyhlLHQpfSxvcGVyYXRlV1hEYXRhOmZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUuZGF0YS5hcGlfbmFtZSl7Y2FzZSJ3ZWJhcGlfZ2V0dXNlcmluZm8iOnFjKGUsdCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm57ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOmZhaWwifX19LHByZUxvZ2luOldjLGNsb3NlQXV0aFZpZXc6SGMsZ2V0Q2hlY2tCb3hTdGF0ZTpHYyxnZXRVbml2ZXJpZnlNYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIEZjfHwoRmM9bmV3IEpjKX0scmVxdWVzdFBheW1lbnQ6ZnVuY3Rpb24obixyKXt2YXIgaT1uLnByb3ZpZGVyLG89TGkociwicmVxdWVzdFBheW1lbnQiKTtvZy5wYXltZW50LmdldENoYW5uZWxzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWl9KTt0P29nLnBheW1lbnQucmVxdWVzdCh0LG4ub3JkZXJJbmZvLGZ1bmN0aW9uKGUpe2UuZXJyTXNnPSJyZXF1ZXN0UGF5bWVudDpvayIsZmkocixlKX0sbyk6Zmkocix7ZXJyTXNnOiJyZXF1ZXN0UGF5bWVudDpmYWlsIHNlcnZpY2Ugbm90IGZvdW5kIn0pfSxvKX0sc3Vic2NyaWJlUHVzaDpmdW5jdGlvbihlLHQpe3ZhciBuPW9nLnB1c2guZ2V0Q2xpZW50SW5mbygpO3JldHVybiBuPyhRY3x8KFFjPSEwLG9nLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigicmVjZWl2ZSIsZnVuY3Rpb24oZSl7WGMmJiFldSYmaGkoIm9uUHVzaE1lc3NhZ2UiLHttZXNzYWdlSWQ6ZS5fX1VVSURfXyxkYXRhOmUucGF5bG9hZCxlcnJNc2c6Im9uUHVzaDpvayJ9KX0pKSxldT0hMSxuLmVyck1zZz0ic3Vic2NyaWJlUHVzaDpvayIsbik6e2Vyck1zZzoic3Vic2NyaWJlUHVzaDpmYWlsIOivt+ehruS/neW9k+WJjei/kOihjOeOr+Wig+W3suWMheWQqyBwdXNoIOaooeWdlyJ9fSx1bnN1YnNjcmliZVB1c2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGV1PSEwLHtlcnJNc2c6InVuc3Vic2NyaWJlUHVzaDpvayJ9fSxvblB1c2g6ZnVuY3Rpb24oKXtyZXR1cm4gUWM/b2cucHVzaC5nZXRDbGllbnRJbmZvKCk/KFhjPSEwLHtlcnJNc2c6Im9uUHVzaDpvayJ9KTp7ZXJyTXNnOiJvblB1c2g6ZmFpbCDor7fnoa7kv53lvZPliY3ov5DooYznjq/looPlt7LljIXlkKsgcHVzaCDmqKHlnZcifTp7ZXJyTXNnOiJvblB1c2g6ZmFpbCDor7flhYjosIPnlKggdW5pLnN1YnNjcmliZVB1c2gifX0sb2ZmUHVzaDpmdW5jdGlvbihlKXtyZXR1cm4gWGM9ITEse2Vyck1zZzoib2ZmUHVzaDpvayJ9fSxjcmVhdGVQdXNoTWVzc2FnZTpmdW5jdGlvbihlLHQpe3ZhciBuPVpzKCk7aWYoImF1dGhvcml6ZWQiIT09bi5ub3RpZmljYXRpb25BdXRob3JpemVkKXJldHVybiBmaSh0LHtlcnJNc2c6ImNyZWF0ZVB1c2hNZXNzYWdlOmZhaWwgbm90aWZpY2F0aW9uQXV0aG9yaXplZDogIituLm5vdGlmaWNhdGlvbkF1dGhvcml6ZWR9KTt2YXIgcj1PYmplY3QuYXNzaWduKHt9LGUpO2RlbGV0ZSByLmNvbnRlbnQsZGVsZXRlIHIucGF5bG9hZCxvZy5wdXNoLmNyZWF0ZU1lc3NhZ2UoZS5jb250ZW50LGUucGF5bG9hZCxyKSxmaSh0LHtlcnJNc2c6ImNyZWF0ZVB1c2hNZXNzYWdlOm9rIn0pfSxnZXRDaGFubmVsTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBaY3x8KFpjPW9nLnB1c2guZ2V0Q2hhbm5lbE1hbmFnZXIoKSl9LHJlcXVpcmVOYXRpdmVQbHVnaW46dHUsc2hhcmVBcHBNZXNzYWdlRGlyZWN0bHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRpdGxlLHI9ZS5wYXRoLGk9ZS5pbWFnZVVybCxvPWUudXNlRGVmYXVsdFNuYXBzaG90O249bnx8ZGcuYXBwbmFtZTt2YXIgYT1mdW5jdGlvbigpe291KHtwcm92aWRlcjoid2VpeGluIix0eXBlOjAsdGl0bGU6bixpbWFnZVVybDppLGhyZWY6cixzY2VuZToiV1hTY2VuZVNlc3Npb24ifSx0LCJzaGFyZUFwcE1lc3NhZ2VEaXJlY3RseSIpfSxzPUxpKHQsInNoYXJlQXBwTWVzc2FnZURpcmVjdGx5Iik7aWYobyl7dmFyIGM9dmcoKSx1PW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoY1tjLmxlbmd0aC0xXS5fX3d4V2Vidmlld0lkX18rIiIpO2lmKHUpe3ZhciBsPW5ldyBvZy5uYXRpdmVPYmouQml0bWFwO3UuZHJhdyhsLGZ1bmN0aW9uKCl7dmFyIGU9eW8rIi9zaGFyZS9zbmFwc2hvdC5qcGciO2wuc2F2ZShlLHtvdmVyd3JpdGU6ITAsZm9ybWF0OiJqcGcifSxmdW5jdGlvbigpe2k9ZSxhKCl9LHMpfSxzKX1lbHNlIGEoKX1lbHNlIGEoKX0sc2hhcmU6b3Usc2hhcmVXaXRoU3lzdGVtOmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj0ic2hhcmVXaXRoU3lzdGVtIik7dmFyIHI9ZS50eXBlLGk9ZS5pbWFnZVVybCxvPWUuc3VtbWFyeSxhPWUuaHJlZjtyPXJ8fCJ0ZXh0Ijt2YXIgcz1MaSh0LG4pO1sidGV4dCIsImltYWdlIl0uaW5kZXhPZihyKTwwJiZmaSh0LHtlcnJNc2c6bisiOmZhaWwg5YiG5Lqr5Y+C5pWwIHR5cGUg5LiN5q2j56GuIn0pLCJzdHJpbmciPT10eXBlb2YgaSYmaSYmKGk9VGkoaSkpLG9nLnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOnIscGljdHVyZXM6aSYmW2ldLGNvbnRlbnQ6byxocmVmOmF9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzpuKyI6b2sifSl9LHMpfSxyZXN0b3JlR2xvYmFsOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgYTtvZyE9PXQmJihpZz1lLGE9KG9nPXQpLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSx2aT1hLG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1naSxzZz1uLGNnPXIsdWc9aSxsZz1vKSxkZy5zZXJ2aWNlUmVhZHk9ITB9LHJlcXVpcmVHbG9iYWw6ZnVuY3Rpb24oKXtmb3IodmFyIGU9WyJBcnJheUJ1ZmZlciIsIkludDhBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkJpZ0ludDY0QXJyYXkiLCJCaWdVaW50NjRBcnJheSJdLHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fSxnZXRTdWJOVnVlQnlJZDpzdSxnZXRDdXJyZW50U3ViTlZ1ZTpmdW5jdGlvbigpe3JldHVybiBzdShvZy53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWQpfSxvbkhvc3RFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7Y3UucHVzaChlKX0sb25OYXRpdmVFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7Y3UucHVzaChlKX0sc2VuZE5hdGl2ZUV2ZW50OnV1LGxvYWRTdWJQYWNrYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUucm9vdDtpZigtMSE9PWJzLmluZGV4T2YoaSkpcmV0dXJue2Vyck1zZzoibG9hZFN1YlBhY2thZ2U6b2sifTticy5wdXNoKGkpLG49aSsiL2FwcC1zdWItc2VydmljZS5qcyIscj1mdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6ImxvYWRTdWJQYWNrYWdlOm9rIn0pfSxkZy5vblNlcnZpY2VSZWFkeShmdW5jdGlvbigpe2lnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5ldmFsSlNGaWxlcyhbbl0scil9KX0sc2VuZEhvc3RFdmVudDpsdSxuYXZpZ2F0ZVRvTWluaVByb2dyYW06ZnVuY3Rpb24oZSx0KXtsdSgibmF2aWdhdGVUb1VuaU1QIixlLGZ1bmN0aW9uKGUpe2lmKGUuZXJyTXNnJiYtMT09PWUuZXJyTXNnLmluZGV4T2YoIjpvayIpKXJldHVybiBmaSh0LHtlcnJNc2c6ZS5lcnJNc2d9KTtmaSh0LHtlcnJNc2c6Im5hdmlnYXRlVG9NaW5pUHJvZ3JhbTpvayJ9KX0pfSxnZXRMYXVuY2hPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBUc30sZ2V0RW50ZXJPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBPcygpfSxuYXZpZ2F0ZUJhY2s6JHUsbmF2aWdhdGVUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5ldmVudHMsaT1lLm9wZW5UeXBlLG89ZS5hbmltYXRpb25UeXBlLGE9ZS5hbmltYXRpb25EdXJhdGlvbixzPW4uc3BsaXQoIj8iKSxjPXNbMF0sdT1mZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1jfSkud2luZG93LGw9ZGcud2luZG93fHx7fTtvfHwobz11LmFuaW1hdGlvblR5cGV8fGwuYW5pbWF0aW9uVHlwZXx8dGEpLGF8fChhPXUuYW5pbWF0aW9uRHVyYXRpb258fGwuYW5pbWF0aW9uRHVyYXRpb258fG5hKTt2YXIgZD1FKHNbMV18fCIiKTt2cyhjLGZ1bmN0aW9uKCl7anUoe3VybDpuLHBhdGg6YyxxdWVyeTpkLGV2ZW50czpyLGFuaW1hdGlvblR5cGU6byxhbmltYXRpb25EdXJhdGlvbjphfSx0KX0sImFwcExhdW5jaCI9PT1pKX0scmVMYXVuY2g6ZnVuY3Rpb24oZSxhKXt2YXIgcz1lLnVybCx0PXMuc3BsaXQoIj8iKSxjPXRbMF0sdT1FKHRbMV18fCIiKTt2cyhjLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvO3Q9YSxuPShlPXt1cmw6cyxwYXRoOmMscXVlcnk6dX0pLnVybCxyPWUucGF0aCxpPWUucXVlcnksbz12ZyghMCkuc2xpY2UoMCksZmcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09cn0pLm1ldGEuaXNUYWJCYXImJnFzLnN3aXRjaFRhYihyLnNsaWNlKDEpKSxFdShqcyh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6InJlTGF1bmNoIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuJHJlbW92ZSgpLE91KGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSksZmkodCx7ZXJyTXNnOiJyZUxhdW5jaDpvayJ9KX0pLG1pKCl9KX0scmVkaXJlY3RUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5leGlzdHMsaT1uLnNwbGl0KCI/Iiksbz1pWzBdLGE9RShpWzFdfHwiIik7dnMobyxmdW5jdGlvbigpe0J1KHt1cmw6bixwYXRoOm8scXVlcnk6YSxleGlzdHM6cn0sdCl9KX0sc3dpdGNoVGFiOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51cmwscj1lLmZyb20saT1lLm9wZW5UeXBlLG89bi5zcGxpdCgiPyIpLGE9b1swXSxzPUUob1sxXXx8IiIpO3ZzKGEsZnVuY3Rpb24oKXshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnVybCxyPWUucGF0aCxpPWUucXVlcnk7ZS5mcm9tLHFzLnN3aXRjaFRhYihyLnNsaWNlKDEpKTt2YXIgbyxhLHM9dmcoKSxjPXMubGVuZ3RoLHU9ITEsbD0hMTtpZigxPD1jJiYoKG89c1tjLTFdKS4kcGFnZS5tZXRhLmlzVGFiQmFyP3U9ITA6KGw9ITAscy5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihlKXtlLiRwYWdlLm1ldGEuaXNUYWJCYXJ8fGU9PT1vfHwoZS4kcmVtb3ZlKCksT3UoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIikpfSksby4kcmVtb3ZlKCksc2coZnVuY3Rpb24oKXsicmVkaXJlY3QiPT09by4kcGFnZS5vcGVuVHlwZT9PdShvLiRnZXRBcHBXZWJ2aWV3KCkscmEsbmEpOk91KG8uJGdldEFwcFdlYnZpZXcoKSwiYXV0byIpfSwxMDApKSksdmcoITApLmZvckVhY2goZnVuY3Rpb24oZSl7Ii8iK2Uucm91dGU9PT1yPyhlLiRwYWdlLm1ldGEudmlzaWJsZXx8KGw9ITApLGUuJHBhZ2UubWV0YS52aXNpYmxlPSEwLGE9ZSk6ZS4kcGFnZS5tZXRhLmlzVGFiQmFyJiYoZS4kcGFnZS5tZXRhLnZpc2libGU9ITEpfSksbz09PWEmJih1PSExKSxvJiZ1JiZvLiR2bS5fX2NhbGxfaG9vaygib25IaWRlIiksIWEpcmV0dXJuIEV1KGpzKHt1cmw6bixwYXRoOnIscXVlcnk6aSxvcGVuVHlwZToic3dpdGNoVGFiIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7bWkoKSxmaSh0LHtlcnJNc2c6InN3aXRjaFRhYjpvayJ9KX0sNzApO3ZhciBkPWEuJGdldEFwcFdlYnZpZXcoKTtkLnNob3coIm5vbmUiKSxsJiYhZC5fX3ByZWxvYWRfXyYmYS4kdm0uX19jYWxsX2hvb2soIm9uU2hvdyIpLG1pKCksZmkodCx7ZXJyTXNnOiJzd2l0Y2hUYWI6b2sifSl9KHt1cmw6bixwYXRoOmEscXVlcnk6cyxmcm9tOnJ9LHQpfSwiYXBwTGF1bmNoIj09PWkpfSx1blByZWxvYWRQYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLnVybCxpPSgobj1Nc1t0PXJdKSYmKG4uX19wYWdlX18mJlBzKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bi5fX3BhZ2VfX30pP24uX19wcmVsb2FkX189ITE6bi5jbG9zZSgibm9uZSIpLGRlbGV0ZSBNc1t0XSksbik7cmV0dXJuIGk/e2lkOmkuaWQsdXJsOnIsZXJyTXNnOiJ1blByZWxvYWRQYWdlOm9rIn06e3VybDpyLGVyck1zZzoidW5QcmVsb2FkUGFnZTpmYWlsIG5vdCBmb3VuZCJ9fSxwcmVsb2FkUGFnZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9bi5zcGxpdCgiPyIpO2ZpKHQse2lkOmZ1bmN0aW9uKGUpe3ZhciB0PWUudXJsLG49ZS5wYXRoLHI9ZS5xdWVyeTtpZighTXNbdF0pe3ZhciBpPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09bn0pKSk7TXNbdF09dXMobixpLHIse19fcHJlbG9hZF9fOiEwLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeShyKX0pfXJldHVybiBNc1t0XX0oe3VybDpuLHBhdGg6clswXSxxdWVyeTpFKHJbMV18fCIiKX0pLmlkLHVybDpuLGVyck1zZzoicHJlbG9hZFBhZ2U6b2sifSl9LHNldFN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5rZXkscj1lLmRhdGEsaT0oZS5pc1N5bmMsdHlwZW9mIHIpLG89InN0cmluZyI9PT1pP3I6SlNPTi5zdHJpbmdpZnkoe3R5cGU6aSxkYXRhOnJ9KTt0cnl7InN0cmluZyI9PT1pJiZ2b2lkIDAhPT16dShvKT9vZy5zdG9yYWdlLnNldEl0ZW1Bc3luYyhuK0Z1LGksZnVuY3Rpb24oKXt9KTpvZy5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuK0Z1LGZ1bmN0aW9uKCl7fSksb2cuc3RvcmFnZS5zZXRJdGVtQXN5bmMobixvLGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOm9rIn0pfSxmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6InNldFN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9Y2F0Y2goZSl7ZmkodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOmZhaWwgIitlfSl9fSxzZXRTdG9yYWdlU3luYzpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiB0LHI9InN0cmluZyI9PT1uP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6bixkYXRhOnR9KTt0cnl7InN0cmluZyI9PT1uJiZ2b2lkIDAhPT16dShyKT9vZy5zdG9yYWdlLnNldEl0ZW0oZStGdSxuKTpvZy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStGdSksb2cuc3RvcmFnZS5zZXRJdGVtKGUscil9Y2F0Y2goZSl7fX0sZ2V0U3RvcmFnZTpmdW5jdGlvbihlLHIpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmtleTtvZy5zdG9yYWdlLmdldEl0ZW1Bc3luYyh0LGZ1bmN0aW9uKG4pe29nLnN0b3JhZ2UuZ2V0SXRlbUFzeW5jKHQrRnUsZnVuY3Rpb24oZSl7dmFyIHQ9KGUuZGF0YXx8IiIpLnRvTG93ZXJDYXNlKCk7Zmkocix7ZGF0YTpWdSh0LG4uZGF0YSksZXJyTXNnOiJnZXRTdG9yYWdlOm9rIn0pfSxmdW5jdGlvbigpe2ZpKHIse2RhdGE6VnUoIiIsbi5kYXRhKSxlcnJNc2c6ImdldFN0b3JhZ2U6b2sifSl9KX0sZnVuY3Rpb24oZSl7Zmkocix7ZGF0YToiIixlcnJNc2c6ImdldFN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9LGdldFN0b3JhZ2VTeW5jOmZ1bmN0aW9uKGUpe3ZhciB0PW9nLnN0b3JhZ2UuZ2V0SXRlbShlKSxuPShvZy5zdG9yYWdlLmdldEl0ZW0oZStGdSl8fCIiKS50b0xvd2VyQ2FzZSgpO3JldHVybiJzdHJpbmciIT10eXBlb2YgdD8iIjpWdShuLHQpfSxyZW1vdmVTdG9yYWdlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUua2V5O29nLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKG4rRnUsZnVuY3Rpb24oKXt9KSxvZy5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuLGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoicmVtb3ZlU3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJyZW1vdmVTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxyZW1vdmVTdG9yYWdlU3luYzpmdW5jdGlvbihlKXtvZy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStGdSksb2cuc3RvcmFnZS5yZW1vdmVJdGVtKGUpfSxjbGVhclN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXtvZy5zdG9yYWdlLmNsZWFyQXN5bmMoZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJjbGVhclN0b3JhZ2U6b2sifSl9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoiY2xlYXJTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxjbGVhclN0b3JhZ2VTeW5jOmZ1bmN0aW9uKCl7b2cuc3RvcmFnZS5jbGVhcigpfSxnZXRTdG9yYWdlSW5mbzpxdSxnZXRTdG9yYWdlSW5mb1N5bmM6ZnVuY3Rpb24oKXt2YXIgZT1xdSgpO3JldHVybiBkZWxldGUgZS5lcnJNc2csZX0sc2hvd0tleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIG9nLmtleS5zaG93U29mdEtleWJvcmQoKSx7ZXJyTXNnOiJzaG93S2V5Ym9hcmQ6b2sifX0saGlkZUtleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIG9nLmtleS5oaWRlU29mdEtleWJvcmQoKSx7ZXJyTXNnOiJoaWRlS2V5Ym9hcmQ6b2sifX0sc2V0TmF2aWdhdGlvbkJhclRpdGxlOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLl9fcGFnZV9fLG49ZS50aXRsZTt2b2lkIDA9PT1uJiYobj0iIik7dmFyIHI9a2kodCk7aWYocil7dmFyIGk9ci5nZXRTdHlsZSgpO3JldHVybiBpJiZpLnRpdGxlTlZpZXcmJnIuc2V0U3R5bGUoe3RpdGxlTlZpZXc6e3RpdGxlVGV4dDpufX0pLHtlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpvayJ9fXJldHVybntlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpmYWlsIn19LHNob3dOYXZpZ2F0aW9uQmFyTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiBvZy5uYXRpdmVVSS5zaG93V2FpdGluZygiIix7bW9kYWw6ITF9KSx7ZXJyTXNnOiJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmc6b2sifX0saGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIG9nLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHtlcnJNc2c6ImhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzpvayJ9fSxzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LG4scj1lLl9fcGFnZV9fLGk9ZS5mcm9udENvbG9yLG89ZS5iYWNrZ3JvdW5kQ29sb3IsYT1raShyKTtpZihhKXt2YXIgcz17fTtpJiYocy50aXRsZUNvbG9yPWkpLG8mJihzLmJhY2tncm91bmRDb2xvcj1vKTt2YXIgYz0iIzAwMDAwMCI9PT1pPyJkYXJrIjoibGlnaHQiO29nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShjKSx0PWMsKG49dmcoKSkubGVuZ3RoJiYobltuLmxlbmd0aC0xXS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlPXQpO3ZhciB1PWEuZ2V0U3R5bGUoKTtyZXR1cm4gdSYmdS50aXRsZU5WaWV3JiYodS50aXRsZU5WaWV3LmF1dG9CYWNrQnV0dG9uJiYocy5iYWNrQnV0dG9uPXMuYmFja0J1dHRvbnx8e30scy5iYWNrQnV0dG9uLmNvbG9yPWkpLGEuc2V0U3R5bGUoe3RpdGxlTlZpZXc6c30pKSx7ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6b2sifX1yZXR1cm57ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZmFpbCJ9fSxzaG93TG9hZGluZzpmdW5jdGlvbihlKXtyZXR1cm4gd2koV3UsT2JqZWN0LmFzc2lnbih7fSxlLHt0eXBlOiJsb2FkaW5nIn0pLCJzaG93VG9hc3QiLCJzaG93TG9hZGluZyIpfSxoaWRlTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiB3aShIdSwibG9hZGluZyIsImhpZGUiLCJoaWRlTG9hZGluZyIpfSxzaG93VG9hc3Q6V3UsaGlkZVRvYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHdpKEh1LCJ0b2FzdCIsImhpZGUiLCJoaWRlVG9hc3QiKX0saGlkZTpIdSxzaG93TW9kYWw6ZnVuY3Rpb24oZSxpKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS50aXRsZTt2b2lkIDA9PT10JiYodD0iIik7dmFyIG49ZS5jb250ZW50O3ZvaWQgMD09PW4mJihuPSIiKTt2YXIgbz1lLnNob3dDYW5jZWw7dm9pZCAwPT09byYmKG89ITApO3ZhciByPWUuY2FuY2VsVGV4dCxhPShlLmNhbmNlbENvbG9yLGUuY29uZmlybVRleHQpLHM9KGUuY29uZmlybUNvbG9yLGUuZWRpdGFibGUpO3ZvaWQgMD09PXMmJihzPSExKTt2YXIgYz1lLnBsYWNlaG9sZGVyVGV4dDt2b2lkIDA9PT1jJiYoYz0iIik7dmFyIHU9bz9bcixhXTpbYV0sbD1zP2M6dTtuPW58fCIgIixvZy5uYXRpdmVVSVtzPyJwcm9tcHQiOiJjb25maXJtIl0obixmdW5jdGlvbihlKXtpZihvKXt2YXIgdD0xPT09ZS5pbmRleCxuPXtlcnJNc2c6InNob3dNb2RhbDpvayIsY29uZmlybTp0LGNhbmNlbDowPT09ZS5pbmRleHx8LTE9PT1lLmluZGV4fTt0JiZzJiYobi5jb250ZW50PWUudmFsdWUpLGZpKGksbil9ZWxzZXt2YXIgcj17ZXJyTXNnOiJzaG93TW9kYWw6b2siLGNvbmZpcm06MD09PWUuaW5kZXgsY2FuY2VsOiExfTtzJiYoci5jb250ZW50PWUudmFsdWUpLGZpKGkscil9fSx0LGwsdSl9LHNob3dBY3Rpb25TaGVldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuaXRlbUxpc3Q7dm9pZCAwPT09biYmKG49W10pO3ZhciByPWUuaXRlbUNvbG9yLGk9ZS50aXRsZTt2b2lkIDA9PT1pJiYoaT0iIik7dmFyIG89ZS5wb3BvdmVyOyIjMDAwIj09PXImJmRnLmRhcmttb2RlJiYocj1YdVtvZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpXS5pdGVtQ29sb3IpO3ZhciBhPXtidXR0b25zOm4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt0aXRsZTplLGNvbG9yOnJ9fSl9O2kmJihhLnRpdGxlPWkpLGEuY2FuY2VsPWF0KCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCIpLG9nLm5hdGl2ZVVJLmFjdGlvblNoZWV0KE9iamVjdC5hc3NpZ24oYSx7cG9wb3ZlcjpvfSksZnVuY3Rpb24oZSl7MDxlLmluZGV4P2ZpKHQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0Om9rIix0YXBJbmRleDplLmluZGV4LTF9KTpmaSh0LHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCJ9KX0pfSxzZXRUYWJCYXJCYWRnZTpmdW5jdGlvbihlKXt2YXIgdD1lLmluZGV4LG49ZS50ZXh0LHI9ZS50eXBlO3JldHVybiB2b2lkIDA9PT1yJiYocj0idGV4dCIpLHFzLnNldFRhYkJhckJhZGdlKHIsdCxuKSx7ZXJyTXNnOiJzZXRUYWJCYXJCYWRnZTpvayJ9fSxzZXRUYWJCYXJJdGVtOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXgsbj1lLnRleHQscj1lLmljb25QYXRoLGk9ZS5zZWxlY3RlZEljb25QYXRoLG89ZS5wYWdlUGF0aCxhPWUudmlzaWJsZSxzPWUuaWNvbmZvbnQ7cXMuc2V0VGFiQmFySXRlbSh0LG4scixpLGEscyk7dmFyIGM9byYmZmcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09b30pO2lmKGMpe3ZhciB1PWMubWV0YTt1LmlzVGFiQmFyPSEwLHUudGFiQmFySW5kZXg9dCx1LmlzUXVpdD0hMDt2YXIgbD1kZy50YWJCYXI7bCYmbC5saXN0JiZsLmxpc3RbdF0mJihsLmxpc3RbdF0ucGFnZVBhdGg9by5zdGFydHNXaXRoKCIvIik/by5zdWJzdHJpbmcoMSk6byl9cmV0dXJue2Vyck1zZzoic2V0VGFiQmFySXRlbTpvayJ9fSxzZXRUYWJCYXJTdHlsZTpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIXlpKCkpcmV0dXJue2Vyck1zZzoic2V0VGFiQmFyU3R5bGU6ZmFpbCBub3QgVGFiQmFyIHBhZ2UifTt2YXIgdD17YmxhY2s6InJnYmEoMCwwLDAsMC40KSIsd2hpdGU6InJnYmEoMjU1LDI1NSwyNTUsMC40KSJ9LG49ZS5ib3JkZXJTdHlsZTtyZXR1cm4gbiBpbiB0JiYoZS5ib3JkZXJTdHlsZT10W25dKSxxcy5zZXRUYWJCYXJTdHlsZShlKSx7ZXJyTXNnOiJzZXRUYWJCYXJTdHlsZTpvayJ9fSxoaWRlVGFiQmFyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYW5pbWF0aW9uO3JldHVybiB5aSgpPyhxcy5oaWRlVGFiQmFyKHQpLHtlcnJNc2c6ImhpZGVUYWJCYXI6b2sifSk6e2Vyck1zZzoiaGlkZVRhYkJhcjpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9fSxzaG93VGFiQmFyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYW5pbWF0aW9uO3JldHVybiB5aSgpPyhxcy5zaG93VGFiQmFyKHQpLHtlcnJNc2c6InNob3dUYWJCYXI6b2sifSk6e2Vyck1zZzoic2hvd1RhYkJhcjpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9fSxyZXF1ZXN0Q29tcG9uZW50SW5mbzpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvO2UuJHBhZ2UubWV0YS5pc05WdWU/UXUoZSx0LG4pOihyPWUsaT10LG89bixhZy5wdWJsaXNoSGFuZGxlcigicmVxdWVzdENvbXBvbmVudEluZm8iLHtyZXFJZDpLdS5wdXNoKG8pLHJlcXM6aX0sci4kcGFnZS5pZCkpfSxjcmVhdGVSZXdhcmRlZFZpZGVvQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBhbChlKX0sY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBobChlKX0sY3JlYXRlSW50ZXJzdGl0aWFsQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB2bChlKX0sY3JlYXRlSW50ZXJhY3RpdmVBZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wcm92aWRlcj9lLmFkcGlkP25ldyB5bChlKTpuZXcgRXJyb3IoImFkcGlkIGludmFsaWQiKTpuZXcgRXJyb3IoInByb3ZpZGVyIGludmFsaWQiKX19KSxibD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksX2wsZGkpO2Z1bmN0aW9uIHdsKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gYmxbZV0uYXBwbHkobnVsbCx0KX1mdW5jdGlvbiBrbChlLHQpe3JldHVybiBhZy5vbigiYXBpLiIrZSx0KX1mdW5jdGlvbiBTbChlKXt2YXIgdD12ZygpLG49dC5sZW5ndGg7cmV0dXJuIG58fGFnLmVtaXQoIm9uRXJyb3IiLGUrIjpmYWlsIiksdFtuLTFdLiR2bX1mdW5jdGlvbiB4bCgpe3ZhciBlPXZnKCksdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0JiZ0LiRwYWdlLmlkfXZhciBDbD1bImNhbnBsYXkiLCJwbGF5IiwicGF1c2UiLCJzdG9wIiwiZW5kZWQiLCJ0aW1lVXBkYXRlIiwicHJldiIsIm5leHQiLCJlcnJvciIsIndhaXRpbmciXSxUbD17fTtDbC5mb3JFYWNoKGZ1bmN0aW9uKGUpe1RsW2VdPVtdfSk7dmFyIE9sLEVsPVt7bmFtZToiZHVyYXRpb24iLHJlYWRvbmx5OiEwfSx7bmFtZToiY3VycmVudFRpbWUiLHJlYWRvbmx5OiEwfSx7bmFtZToicGF1c2VkIixyZWFkb25seTohMH0se25hbWU6InNyYyIsY2FjaGU6ITB9LHtuYW1lOiJzdGFydFRpbWUiLGRlZmF1bHQ6MCxjYWNoZTohMH0se25hbWU6ImJ1ZmZlcmVkIixyZWFkb25seTohMH0se25hbWU6InRpdGxlIixjYWNoZTohMH0se25hbWU6ImVwbmFtZSIsY2FjaGU6ITB9LHtuYW1lOiJzaW5nZXIiLGNhY2hlOiEwfSx7bmFtZToiY292ZXJJbWdVcmwiLGNhY2hlOiEwfSx7bmFtZToid2ViVXJsIixjYWNoZTohMH0se25hbWU6InByb3RvY29sIixyZWFkb25seTohMCxkZWZhdWx0OiJodHRwIn0se25hbWU6InBsYXliYWNrUmF0ZSIsZGVmYXVsdDoxLGNhY2hlOiEwfV0sSWw9WyJwcmV2IiwibmV4dCJdLEFsPWZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9vcHRpb25zPXt9LGtsKCJvbkJhY2tncm91bmRBdWRpb1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlLG49ZS5lcnJNc2cscj1lLmVyckNvZGU7VGxbdF0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgiZXJyb3IiPT09dD97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX0pLElsLmZvckVhY2goZnVuY3Rpb24oZSl7a2woIm9uQmFja2dyb3VuZEF1ZGlvIisoZVswXS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyKDEpKSxmdW5jdGlvbigpe1RsW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUoe30pfSl9KX0pLEVsLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5uYW1lLGU9e2dldDpmdW5jdGlvbigpe3ZhciBlPXQuY2FjaGU/dGhpcy5fb3B0aW9uczp3bCgiZ2V0QmFja2dyb3VuZEF1ZGlvU3RhdGUiKTtyZXR1cm4gbiBpbiBlP2Vbbl06dC5kZWZhdWx0fX07dC5yZWFkb25seXx8KGUuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuX29wdGlvbnNbbl09ZSx3bCgic2V0QmFja2dyb3VuZEF1ZGlvU3RhdGUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSksbil9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLGUpfSl9O0FsLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfSxBbC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwYXVzZSIpfSxBbC5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInN0b3AiKX0sQWwucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24oZSl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOmV9KX0sQWwucHJvdG90eXBlLl9vcGVyYXRlPWZ1bmN0aW9uKGUsdCl7d2woIm9wZXJhdGVCYWNrZ3JvdW5kQXVkaW8iLE9iamVjdC5hc3NpZ24oe30sdCx7b3BlcmF0aW9uVHlwZTplfSkpfSxDbC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtBbC5wcm90b3R5cGVbIm9uIitlXT1mdW5jdGlvbihlKXtUbFt0XS5wdXNoKGUpfX0pO3ZhciAkbD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRCYWNrZ3JvdW5kQXVkaW9NYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIE9sfHwoT2w9bmV3IEFsKX19KSxQbD1VcihmdW5jdGlvbihlLHQpe3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50MTZBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBJbnQzMkFycmF5O3QuYXNzaWduPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3IubGVuZ3RoOyl7dmFyIGk9ci5zaGlmdCgpO2lmKGkpe2lmKCJvYmplY3QiIT10eXBlb2YgaSl0aHJvdyBuZXcgVHlwZUVycm9yKGkrIm11c3QgYmUgbm9uLW9iamVjdCIpO2Zvcih2YXIgbyBpbiBpKXQ9aSxuPW8sT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW29dPWlbb10pfX1yZXR1cm4gZX0sdC5zaHJpbmtCdWY9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5sZW5ndGg9PT10P2U6ZS5zdWJhcnJheT9lLnN1YmFycmF5KDAsdCk6KGUubGVuZ3RoPXQsZSl9O3ZhciByPXthcnJheVNldDpmdW5jdGlvbihlLHQsbixyLGkpe2lmKHQuc3ViYXJyYXkmJmUuc3ViYXJyYXkpZS5zZXQodC5zdWJhcnJheShuLG4rciksaSk7ZWxzZSBmb3IodmFyIG89MDtvPHI7bysrKWVbaStvXT10W24rb119LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhO2Zvcih0PXI9MCxuPWUubGVuZ3RoO3Q8bjt0Kyspcis9ZVt0XS5sZW5ndGg7Zm9yKGE9bmV3IFVpbnQ4QXJyYXkociksdD1pPTAsbj1lLmxlbmd0aDt0PG47dCsrKW89ZVt0XSxhLnNldChvLGkpLGkrPW8ubGVuZ3RoO3JldHVybiBhfX0saT17YXJyYXlTZXQ6ZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIG89MDtvPHI7bysrKWVbaStvXT10W24rb119LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7cmV0dXJuW10uY29uY2F0LmFwcGx5KFtdLGUpfX07dC5zZXRUeXBlZD1mdW5jdGlvbihlKXtlPyh0LkJ1Zjg9VWludDhBcnJheSx0LkJ1ZjE2PVVpbnQxNkFycmF5LHQuQnVmMzI9SW50MzJBcnJheSx0LmFzc2lnbih0LHIpKToodC5CdWY4PUFycmF5LHQuQnVmMTY9QXJyYXksdC5CdWYzMj1BcnJheSx0LmFzc2lnbih0LGkpKX0sdC5zZXRUeXBlZChuKX0pLE1sPShQbC5hc3NpZ24sUGwuc2hyaW5rQnVmLFBsLnNldFR5cGVkLFBsLkJ1ZjgsUGwuQnVmMTYsUGwuQnVmMzIsMCksamw9MTtmdW5jdGlvbiBMbChlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7MDw9LS10OyllW3RdPTB9dmFyIEJsPTAsTmw9MjksRGw9MjU2LFJsPURsKzErTmwsRmw9MzAsVWw9MTksemw9MipSbCsxLFZsPTE1LHFsPTE2LFdsPTcsSGw9MjU2LEdsPTE2LFhsPTE3LEpsPTE4LFlsPVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdLEtsPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSxabD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sUWw9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLGVkPW5ldyBBcnJheSgyKihSbCsyKSk7TGwoZWQpO3ZhciB0ZD1uZXcgQXJyYXkoMipGbCk7TGwodGQpO3ZhciBuZD1uZXcgQXJyYXkoNTEyKTtMbChuZCk7dmFyIHJkPW5ldyBBcnJheSgyNTYpO0xsKHJkKTt2YXIgaWQ9bmV3IEFycmF5KE5sKTtMbChpZCk7dmFyIG9kLGFkLHNkLGNkPW5ldyBBcnJheShGbCk7ZnVuY3Rpb24gdWQoZSx0LG4scixpKXt0aGlzLnN0YXRpY190cmVlPWUsdGhpcy5leHRyYV9iaXRzPXQsdGhpcy5leHRyYV9iYXNlPW4sdGhpcy5lbGVtcz1yLHRoaXMubWF4X2xlbmd0aD1pLHRoaXMuaGFzX3N0cmVlPWUmJmUubGVuZ3RofWZ1bmN0aW9uIGxkKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fWZ1bmN0aW9uIGRkKGUpe3JldHVybiBlPDI1Nj9uZFtlXTpuZFsyNTYrKGU+Pj43KV19ZnVuY3Rpb24gZmQoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9ZnVuY3Rpb24gcGQoZSx0LG4pe2UuYmlfdmFsaWQ+cWwtbj8oZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZmQoZSxlLmJpX2J1ZiksZS5iaV9idWY9dD4+cWwtZS5iaV92YWxpZCxlLmJpX3ZhbGlkKz1uLXFsKTooZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZS5iaV92YWxpZCs9bil9ZnVuY3Rpb24gaGQoZSx0LG4pe3BkKGUsblsyKnRdLG5bMip0KzFdKX1mdW5jdGlvbiB2ZChlLHQpe2Zvcih2YXIgbj0wO258PTEmZSxlPj4+PTEsbjw8PTEsMDwtLXQ7KTtyZXR1cm4gbj4+PjF9ZnVuY3Rpb24gZ2QoZSx0LG4pe3ZhciByLGksbz1uZXcgQXJyYXkoVmwrMSksYT0wO2ZvcihyPTE7cjw9Vmw7cisrKW9bcl09YT1hK25bci0xXTw8MTtmb3IoaT0wO2k8PXQ7aSsrKXt2YXIgcz1lWzIqaSsxXTswIT09cyYmKGVbMippXT12ZChvW3NdKysscykpfX1mdW5jdGlvbiBtZChlKXt2YXIgdDtmb3IodD0wO3Q8Umw7dCsrKWUuZHluX2x0cmVlWzIqdF09MDtmb3IodD0wO3Q8Rmw7dCsrKWUuZHluX2R0cmVlWzIqdF09MDtmb3IodD0wO3Q8VWw7dCsrKWUuYmxfdHJlZVsyKnRdPTA7ZS5keW5fbHRyZWVbMipIbF09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH1mdW5jdGlvbiB5ZChlKXs4PGUuYmlfdmFsaWQ/ZmQoZSxlLmJpX2J1Zik6MDxlLmJpX3ZhbGlkJiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wfWZ1bmN0aW9uIF9kKGUsdCxuLHIpe3ZhciBpPTIqdCxvPTIqbjtyZXR1cm4gZVtpXTxlW29dfHxlW2ldPT09ZVtvXSYmclt0XTw9cltuXX1mdW5jdGlvbiBiZChlLHQsbil7Zm9yKHZhciByPWUuaGVhcFtuXSxpPW48PDE7aTw9ZS5oZWFwX2xlbiYmKGk8ZS5oZWFwX2xlbiYmX2QodCxlLmhlYXBbaSsxXSxlLmhlYXBbaV0sZS5kZXB0aCkmJmkrKywhX2QodCxyLGUuaGVhcFtpXSxlLmRlcHRoKSk7KWUuaGVhcFtuXT1lLmhlYXBbaV0sbj1pLGk8PD0xO2UuaGVhcFtuXT1yfWZ1bmN0aW9uIHdkKGUsdCxuKXt2YXIgcixpLG8sYSxzPTA7aWYoMCE9PWUubGFzdF9saXQpZm9yKDtyPWUucGVuZGluZ19idWZbZS5kX2J1ZisyKnNdPDw4fGUucGVuZGluZ19idWZbZS5kX2J1ZisyKnMrMV0saT1lLnBlbmRpbmdfYnVmW2UubF9idWYrc10scysrLDA9PT1yP2hkKGUsaSx0KTooaGQoZSwobz1yZFtpXSkrRGwrMSx0KSwwIT09KGE9WWxbb10pJiZwZChlLGktPWlkW29dLGEpLGhkKGUsbz1kZCgtLXIpLG4pLDAhPT0oYT1LbFtvXSkmJnBkKGUsci09Y2Rbb10sYSkpLHM8ZS5sYXN0X2xpdDspO2hkKGUsSGwsdCl9ZnVuY3Rpb24ga2QoZSx0KXt2YXIgbixyLGksbz10LmR5bl90cmVlLGE9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUscz10LnN0YXRfZGVzYy5oYXNfc3RyZWUsYz10LnN0YXRfZGVzYy5lbGVtcyx1PS0xO2ZvcihlLmhlYXBfbGVuPTAsZS5oZWFwX21heD16bCxuPTA7bjxjO24rKykwIT09b1syKm5dPyhlLmhlYXBbKytlLmhlYXBfbGVuXT11PW4sZS5kZXB0aFtuXT0wKTpvWzIqbisxXT0wO2Zvcig7ZS5oZWFwX2xlbjwyOylvWzIqKGk9ZS5oZWFwWysrZS5oZWFwX2xlbl09dTwyPysrdTowKV09MSxlLmRlcHRoW2ldPTAsZS5vcHRfbGVuLS0scyYmKGUuc3RhdGljX2xlbi09YVsyKmkrMV0pO2Zvcih0Lm1heF9jb2RlPXUsbj1lLmhlYXBfbGVuPj4xOzE8PW47bi0tKWJkKGUsbyxuKTtmb3IoaT1jO249ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxiZChlLG8sMSkscj1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09bixlLmhlYXBbLS1lLmhlYXBfbWF4XT1yLG9bMippXT1vWzIqbl0rb1syKnJdLGUuZGVwdGhbaV09KGUuZGVwdGhbbl0+PWUuZGVwdGhbcl0/ZS5kZXB0aFtuXTplLmRlcHRoW3JdKSsxLG9bMipuKzFdPW9bMipyKzFdPWksZS5oZWFwWzFdPWkrKyxiZChlLG8sMSksMjw9ZS5oZWFwX2xlbjspO2UuaGVhcFstLWUuaGVhcF9tYXhdPWUuaGVhcFsxXSxmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjPXQuZHluX3RyZWUsdT10Lm1heF9jb2RlLGw9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsZD10LnN0YXRfZGVzYy5oYXNfc3RyZWUsZj10LnN0YXRfZGVzYy5leHRyYV9iaXRzLHA9dC5zdGF0X2Rlc2MuZXh0cmFfYmFzZSxoPXQuc3RhdF9kZXNjLm1heF9sZW5ndGgsdj0wO2ZvcihvPTA7bzw9Vmw7bysrKWUuYmxfY291bnRbb109MDtmb3IoY1syKmUuaGVhcFtlLmhlYXBfbWF4XSsxXT0wLG49ZS5oZWFwX21heCsxO248emw7bisrKWg8KG89Y1syKmNbMioocj1lLmhlYXBbbl0pKzFdKzFdKzEpJiYobz1oLHYrKyksY1syKnIrMV09byx1PHJ8fChlLmJsX2NvdW50W29dKyssYT0wLHA8PXImJihhPWZbci1wXSkscz1jWzIqcl0sZS5vcHRfbGVuKz1zKihvK2EpLGQmJihlLnN0YXRpY19sZW4rPXMqKGxbMipyKzFdK2EpKSk7aWYoMCE9PXYpe2Rve2ZvcihvPWgtMTswPT09ZS5ibF9jb3VudFtvXTspby0tO2UuYmxfY291bnRbb10tLSxlLmJsX2NvdW50W28rMV0rPTIsZS5ibF9jb3VudFtoXS0tLHYtPTJ9d2hpbGUoMDx2KTtmb3Iobz1oOzAhPT1vO28tLSlmb3Iocj1lLmJsX2NvdW50W29dOzAhPT1yOyl1PChpPWUuaGVhcFstLW5dKXx8KGNbMippKzFdIT09byYmKGUub3B0X2xlbis9KG8tY1syKmkrMV0pKmNbMippXSxjWzIqaSsxXT1vKSxyLS0pfX0oZSx0KSxnZChvLHUsZS5ibF9jb3VudCl9ZnVuY3Rpb24gU2QoZSx0LG4pe3ZhciByLGksbz0tMSxhPXRbMV0scz0wLGM9Nyx1PTQ7Zm9yKDA9PT1hJiYoYz0xMzgsdT0zKSx0WzIqKG4rMSkrMV09NjU1MzUscj0wO3I8PW47cisrKWk9YSxhPXRbMioocisxKSsxXSwrK3M8YyYmaT09PWF8fChzPHU/ZS5ibF90cmVlWzIqaV0rPXM6MCE9PWk/KGkhPT1vJiZlLmJsX3RyZWVbMippXSsrLGUuYmxfdHJlZVsyKkdsXSsrKTpzPD0xMD9lLmJsX3RyZWVbMipYbF0rKzplLmJsX3RyZWVbMipKbF0rKyxvPWksKHM9MCk9PT1hPyhjPTEzOCx1PTMpOmk9PT1hPyhjPTYsdT0zKTooYz03LHU9NCkpfWZ1bmN0aW9uIHhkKGUsdCxuKXt2YXIgcixpLG89LTEsYT10WzFdLHM9MCxjPTcsdT00O2ZvcigwPT09YSYmKGM9MTM4LHU9Mykscj0wO3I8PW47cisrKWlmKGk9YSxhPXRbMioocisxKSsxXSwhKCsrczxjJiZpPT09YSkpe2lmKHM8dSlmb3IoO2hkKGUsaSxlLmJsX3RyZWUpLDAhPS0tczspO2Vsc2UgMCE9PWk/KGkhPT1vJiYoaGQoZSxpLGUuYmxfdHJlZSkscy0tKSxoZChlLEdsLGUuYmxfdHJlZSkscGQoZSxzLTMsMikpOnM8PTEwPyhoZChlLFhsLGUuYmxfdHJlZSkscGQoZSxzLTMsMykpOihoZChlLEpsLGUuYmxfdHJlZSkscGQoZSxzLTExLDcpKTtvPWksKHM9MCk9PT1hPyhjPTEzOCx1PTMpOmk9PT1hPyhjPTYsdT0zKTooYz03LHU9NCl9fUxsKGNkKTt2YXIgQ2Q9ITE7ZnVuY3Rpb24gVGQoZSx0LG4scil7dmFyIGksbyxhLHM7cGQoZSwoQmw8PDEpKyhyPzE6MCksMyksbz10LGE9bixzPSEwLHlkKGk9ZSkscyYmKGZkKGksYSksZmQoaSx+YSkpLFBsLmFycmF5U2V0KGkucGVuZGluZ19idWYsaS53aW5kb3csbyxhLGkucGVuZGluZyksaS5wZW5kaW5nKz1hfXZhciBPZD17X3RyX2luaXQ6ZnVuY3Rpb24oZSl7Q2R8fChmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbz1uZXcgQXJyYXkoVmwrMSk7Zm9yKHI9bj0wO3I8TmwtMTtyKyspZm9yKGlkW3JdPW4sZT0wO2U8MTw8WWxbcl07ZSsrKXJkW24rK109cjtmb3IocmRbbi0xXT1yLHI9aT0wO3I8MTY7cisrKWZvcihjZFtyXT1pLGU9MDtlPDE8PEtsW3JdO2UrKyluZFtpKytdPXI7Zm9yKGk+Pj03O3I8Rmw7cisrKWZvcihjZFtyXT1pPDw3LGU9MDtlPDE8PEtsW3JdLTc7ZSsrKW5kWzI1NitpKytdPXI7Zm9yKHQ9MDt0PD1WbDt0Kyspb1t0XT0wO2ZvcihlPTA7ZTw9MTQzOyllZFsyKmUrMV09OCxlKyssb1s4XSsrO2Zvcig7ZTw9MjU1OyllZFsyKmUrMV09OSxlKyssb1s5XSsrO2Zvcig7ZTw9Mjc5OyllZFsyKmUrMV09NyxlKyssb1s3XSsrO2Zvcig7ZTw9Mjg3OyllZFsyKmUrMV09OCxlKyssb1s4XSsrO2ZvcihnZChlZCxSbCsxLG8pLGU9MDtlPEZsO2UrKyl0ZFsyKmUrMV09NSx0ZFsyKmVdPXZkKGUsNSk7b2Q9bmV3IHVkKGVkLFlsLERsKzEsUmwsVmwpLGFkPW5ldyB1ZCh0ZCxLbCwwLEZsLFZsKSxzZD1uZXcgdWQobmV3IEFycmF5KDApLFpsLDAsVWwsV2wpfSgpLENkPSEwKSxlLmxfZGVzYz1uZXcgbGQoZS5keW5fbHRyZWUsb2QpLGUuZF9kZXNjPW5ldyBsZChlLmR5bl9kdHJlZSxhZCksZS5ibF9kZXNjPW5ldyBsZChlLmJsX3RyZWUsc2QpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wLG1kKGUpfSxfdHJfc3RvcmVkX2Jsb2NrOlRkLF90cl9mbHVzaF9ibG9jazpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9MDswPGUubGV2ZWw/KDI9PT1lLnN0cm0uZGF0YV90eXBlJiYoZS5zdHJtLmRhdGFfdHlwZT1mdW5jdGlvbihlKXt2YXIgdCxuPTQwOTM2MjQ0NDc7Zm9yKHQ9MDt0PD0zMTt0Kyssbj4+Pj0xKWlmKDEmbiYmMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIE1sO2lmKDAhPT1lLmR5bl9sdHJlZVsxOF18fDAhPT1lLmR5bl9sdHJlZVsyMF18fDAhPT1lLmR5bl9sdHJlZVsyNl0pcmV0dXJuIGpsO2Zvcih0PTMyO3Q8RGw7dCsrKWlmKDAhPT1lLmR5bl9sdHJlZVsyKnRdKXJldHVybiBqbDtyZXR1cm4gTWx9KGUpKSxrZChlLGUubF9kZXNjKSxrZChlLGUuZF9kZXNjKSxhPWZ1bmN0aW9uKGUpe3ZhciB0O2ZvcihTZChlLGUuZHluX2x0cmVlLGUubF9kZXNjLm1heF9jb2RlKSxTZChlLGUuZHluX2R0cmVlLGUuZF9kZXNjLm1heF9jb2RlKSxrZChlLGUuYmxfZGVzYyksdD1VbC0xOzM8PXQmJjA9PT1lLmJsX3RyZWVbMipRbFt0XSsxXTt0LS0pO3JldHVybiBlLm9wdF9sZW4rPTMqKHQrMSkrNSs1KzQsdH0oZSksaT1lLm9wdF9sZW4rMys3Pj4+Mywobz1lLnN0YXRpY19sZW4rMys3Pj4+Myk8PWkmJihpPW8pKTppPW89bis1LG4rNDw9aSYmLTEhPT10P1RkKGUsdCxuLHIpOjQ9PT1lLnN0cmF0ZWd5fHxvPT09aT8ocGQoZSwyKyhyPzE6MCksMyksd2QoZSxlZCx0ZCkpOihwZChlLDQrKHI/MTowKSwzKSxmdW5jdGlvbihlLHQsbixyKXt2YXIgaTtmb3IocGQoZSx0LTI1Nyw1KSxwZChlLG4tMSw1KSxwZChlLHItNCw0KSxpPTA7aTxyO2krKylwZChlLGUuYmxfdHJlZVsyKlFsW2ldKzFdLDMpO3hkKGUsZS5keW5fbHRyZWUsdC0xKSx4ZChlLGUuZHluX2R0cmVlLG4tMSl9KGUsZS5sX2Rlc2MubWF4X2NvZGUrMSxlLmRfZGVzYy5tYXhfY29kZSsxLGErMSksd2QoZSxlLmR5bl9sdHJlZSxlLmR5bl9kdHJlZSkpLG1kKGUpLHImJnlkKGUpfSxfdHJfdGFsbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0XT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqZS5sYXN0X2xpdCsxXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UubF9idWYrZS5sYXN0X2xpdF09MjU1Jm4sZS5sYXN0X2xpdCsrLDA9PT10P2UuZHluX2x0cmVlWzIqbl0rKzooZS5tYXRjaGVzKyssdC0tLGUuZHluX2x0cmVlWzIqKHJkW25dK0RsKzEpXSsrLGUuZHluX2R0cmVlWzIqZGQodCldKyspLGUubGFzdF9saXQ9PT1lLmxpdF9idWZzaXplLTF9LF90cl9hbGlnbjpmdW5jdGlvbihlKXt2YXIgdDtwZChlLDIsMyksaGQoZSxIbCxlZCksMTY9PT0odD1lKS5iaV92YWxpZD8oZmQodCx0LmJpX2J1ZiksdC5iaV9idWY9MCx0LmJpX3ZhbGlkPTApOjg8PXQuYmlfdmFsaWQmJih0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmdC5iaV9idWYsdC5iaV9idWY+Pj04LHQuYmlfdmFsaWQtPTgpfX07dmFyIEVkPWZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaT02NTUzNSZlfDAsbz1lPj4+MTYmNjU1MzV8MCxhPTA7MCE9PW47KXtmb3Iobi09YT0yZTM8bj8yZTM6bjtvPW8rKGk9aSt0W3IrK118MCl8MCwtLWE7KTtpJT02NTUyMSxvJT02NTUyMX1yZXR1cm4gaXxvPDwxNnwwfTt2YXIgSWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPTA7bjwyNTY7bisrKXtlPW47Zm9yKHZhciByPTA7cjw4O3IrKyllPTEmZT8zOTg4MjkyMzg0XmU+Pj4xOmU+Pj4xO3Rbbl09ZX1yZXR1cm4gdH0oKTt2YXIgQWQsJGQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9SWQsbz1yK247ZV49LTE7Zm9yKHZhciBhPXI7YTxvO2ErKyllPWU+Pj44XmlbMjU1JihlXnRbYV0pXTtyZXR1cm4tMV5lfSxQZD17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9LE1kPTAsamQ9NCxMZD0wLEJkPS0yLE5kPS0xLERkPTQsUmQ9MixGZD04LFVkPTksemQ9Mjg2LFZkPTMwLHFkPTE5LFdkPTIqemQrMSxIZD0xNSxHZD0zLFhkPTI1OCxKZD1YZCtHZCsxLFlkPTQyLEtkPTExMyxaZD0xLFFkPTIsZWY9Myx0Zj00O2Z1bmN0aW9uIG5mKGUsdCl7cmV0dXJuIGUubXNnPVBkW3RdLHR9ZnVuY3Rpb24gcmYoZSl7cmV0dXJuKGU8PDEpLSg0PGU/OTowKX1mdW5jdGlvbiBvZihlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7MDw9LS10OyllW3RdPTB9ZnVuY3Rpb24gYWYoZSl7dmFyIHQ9ZS5zdGF0ZSxuPXQucGVuZGluZztuPmUuYXZhaWxfb3V0JiYobj1lLmF2YWlsX291dCksMCE9PW4mJihQbC5hcnJheVNldChlLm91dHB1dCx0LnBlbmRpbmdfYnVmLHQucGVuZGluZ19vdXQsbixlLm5leHRfb3V0KSxlLm5leHRfb3V0Kz1uLHQucGVuZGluZ19vdXQrPW4sZS50b3RhbF9vdXQrPW4sZS5hdmFpbF9vdXQtPW4sdC5wZW5kaW5nLT1uLDA9PT10LnBlbmRpbmcmJih0LnBlbmRpbmdfb3V0PTApKX1mdW5jdGlvbiBzZihlLHQpe09kLl90cl9mbHVzaF9ibG9jayhlLDA8PWUuYmxvY2tfc3RhcnQ/ZS5ibG9ja19zdGFydDotMSxlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQsdCksZS5ibG9ja19zdGFydD1lLnN0cnN0YXJ0LGFmKGUuc3RybSl9ZnVuY3Rpb24gY2YoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10fWZ1bmN0aW9uIHVmKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0fWZ1bmN0aW9uIGxmKGUsdCl7dmFyIG4scixpPWUubWF4X2NoYWluX2xlbmd0aCxvPWUuc3Ryc3RhcnQsYT1lLnByZXZfbGVuZ3RoLHM9ZS5uaWNlX21hdGNoLGM9ZS5zdHJzdGFydD5lLndfc2l6ZS1KZD9lLnN0cnN0YXJ0LShlLndfc2l6ZS1KZCk6MCx1PWUud2luZG93LGw9ZS53X21hc2ssZD1lLnByZXYsZj1lLnN0cnN0YXJ0K1hkLHA9dVtvK2EtMV0saD11W28rYV07ZS5wcmV2X2xlbmd0aD49ZS5nb29kX21hdGNoJiYoaT4+PTIpLHM+ZS5sb29rYWhlYWQmJihzPWUubG9va2FoZWFkKTtkb3tpZih1WyhuPXQpK2FdPT09aCYmdVtuK2EtMV09PT1wJiZ1W25dPT09dVtvXSYmdVsrK25dPT09dVtvKzFdKXtvKz0yLG4rKztkb3t9d2hpbGUodVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJm88Zik7aWYocj1YZC0oZi1vKSxvPWYtWGQsYTxyKXtpZihlLm1hdGNoX3N0YXJ0PXQsczw9KGE9cikpYnJlYWs7cD11W28rYS0xXSxoPXVbbythXX19fXdoaWxlKCh0PWRbdCZsXSk+YyYmMCE9LS1pKTtyZXR1cm4gYTw9ZS5sb29rYWhlYWQ/YTplLmxvb2thaGVhZH1mdW5jdGlvbiBkZihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHUsbCxkPWUud19zaXplO2Rve2lmKGk9ZS53aW5kb3dfc2l6ZS1lLmxvb2thaGVhZC1lLnN0cnN0YXJ0LGUuc3Ryc3RhcnQ+PWQrKGQtSmQpKXtmb3IoUGwuYXJyYXlTZXQoZS53aW5kb3csZS53aW5kb3csZCxkLDApLGUubWF0Y2hfc3RhcnQtPWQsZS5zdHJzdGFydC09ZCxlLmJsb2NrX3N0YXJ0LT1kLHQ9bj1lLmhhc2hfc2l6ZTtyPWUuaGVhZFstLXRdLGUuaGVhZFt0XT1kPD1yP3ItZDowLC0tbjspO2Zvcih0PW49ZDtyPWUucHJldlstLXRdLGUucHJldlt0XT1kPD1yP3ItZDowLC0tbjspO2krPWR9aWYoMD09PWUuc3RybS5hdmFpbF9pbilicmVhaztpZihhPWUuc3RybSxzPWUud2luZG93LGM9ZS5zdHJzdGFydCtlLmxvb2thaGVhZCx1PWksbD12b2lkIDAsbD1hLmF2YWlsX2luLHU8bCYmKGw9dSksbj0wPT09bD8wOihhLmF2YWlsX2luLT1sLFBsLmFycmF5U2V0KHMsYS5pbnB1dCxhLm5leHRfaW4sbCxjKSwxPT09YS5zdGF0ZS53cmFwP2EuYWRsZXI9RWQoYS5hZGxlcixzLGwsYyk6Mj09PWEuc3RhdGUud3JhcCYmKGEuYWRsZXI9JGQoYS5hZGxlcixzLGwsYykpLGEubmV4dF9pbis9bCxhLnRvdGFsX2luKz1sLGwpLGUubG9va2FoZWFkKz1uLGUubG9va2FoZWFkK2UuaW5zZXJ0Pj1HZClmb3Iobz1lLnN0cnN0YXJ0LWUuaW5zZXJ0LGUuaW5zX2g9ZS53aW5kb3dbb10sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W28rMV0pJmUuaGFzaF9tYXNrO2UuaW5zZXJ0JiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W28rR2QtMV0pJmUuaGFzaF9tYXNrLGUucHJldltvJmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPW8sbysrLGUuaW5zZXJ0LS0sIShlLmxvb2thaGVhZCtlLmluc2VydDxHZCkpOyk7fXdoaWxlKGUubG9va2FoZWFkPEpkJiYwIT09ZS5zdHJtLmF2YWlsX2luKX1mdW5jdGlvbiBmZihlLHQpe2Zvcih2YXIgbixyOzspe2lmKGUubG9va2FoZWFkPEpkKXtpZihkZihlKSxlLmxvb2thaGVhZDxKZCYmdD09PU1kKXJldHVybiBaZDtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1HZCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K0dkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLDAhPT1uJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLUpkJiYoZS5tYXRjaF9sZW5ndGg9bGYoZSxuKSksZS5tYXRjaF9sZW5ndGg+PUdkKWlmKHI9T2QuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0LGUubWF0Y2hfbGVuZ3RoLUdkKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg8PWUubWF4X2xhenlfbWF0Y2gmJmUubG9va2FoZWFkPj1HZCl7Zm9yKGUubWF0Y2hfbGVuZ3RoLS07ZS5zdHJzdGFydCsrLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K0dkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQsMCE9LS1lLm1hdGNoX2xlbmd0aDspO2Uuc3Ryc3RhcnQrK31lbHNlIGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTAsZS5pbnNfaD1lLndpbmRvd1tlLnN0cnN0YXJ0XSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCsxXSkmZS5oYXNoX21hc2s7ZWxzZSByPU9kLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrO2lmKHImJihzZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIFpkfXJldHVybiBlLmluc2VydD1lLnN0cnN0YXJ0PEdkLTE/ZS5zdHJzdGFydDpHZC0xLHQ9PT1qZD8oc2YoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/ZWY6dGYpOmUubGFzdF9saXQmJihzZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/WmQ6UWR9ZnVuY3Rpb24gcGYoZSx0KXtmb3IodmFyIG4scixpOzspe2lmKGUubG9va2FoZWFkPEpkKXtpZihkZihlKSxlLmxvb2thaGVhZDxKZCYmdD09PU1kKXJldHVybiBaZDtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1HZCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K0dkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9R2QtMSwwIT09biYmZS5wcmV2X2xlbmd0aDxlLm1heF9sYXp5X21hdGNoJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLUpkJiYoZS5tYXRjaF9sZW5ndGg9bGYoZSxuKSxlLm1hdGNoX2xlbmd0aDw9NSYmKDE9PT1lLnN0cmF0ZWd5fHxlLm1hdGNoX2xlbmd0aD09PUdkJiY0MDk2PGUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydCkmJihlLm1hdGNoX2xlbmd0aD1HZC0xKSksZS5wcmV2X2xlbmd0aD49R2QmJmUubWF0Y2hfbGVuZ3RoPD1lLnByZXZfbGVuZ3RoKXtmb3IoaT1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLUdkLHI9T2QuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC0xLWUucHJldl9tYXRjaCxlLnByZXZfbGVuZ3RoLUdkKSxlLmxvb2thaGVhZC09ZS5wcmV2X2xlbmd0aC0xLGUucHJldl9sZW5ndGgtPTI7KytlLnN0cnN0YXJ0PD1pJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrR2QtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksMCE9LS1lLnByZXZfbGVuZ3RoOyk7aWYoZS5tYXRjaF9hdmFpbGFibGU9MCxlLm1hdGNoX2xlbmd0aD1HZC0xLGUuc3Ryc3RhcnQrKyxyJiYoc2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBaZH1lbHNlIGlmKGUubWF0Y2hfYXZhaWxhYmxlKXtpZigocj1PZC5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pKSYmc2YoZSwhMSksZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS0sMD09PWUuc3RybS5hdmFpbF9vdXQpcmV0dXJuIFpkfWVsc2UgZS5tYXRjaF9hdmFpbGFibGU9MSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLX1yZXR1cm4gZS5tYXRjaF9hdmFpbGFibGUmJihyPU9kLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDxHZC0xP2Uuc3Ryc3RhcnQ6R2QtMSx0PT09amQ/KHNmKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P2VmOnRmKTplLmxhc3RfbGl0JiYoc2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP1pkOlFkfWZ1bmN0aW9uIGhmKGUsdCxuLHIsaSl7dGhpcy5nb29kX2xlbmd0aD1lLHRoaXMubWF4X2xhenk9dCx0aGlzLm5pY2VfbGVuZ3RoPW4sdGhpcy5tYXhfY2hhaW49cix0aGlzLmZ1bmM9aX1mdW5jdGlvbiB2Zigpe3RoaXMuc3RybT1udWxsLHRoaXMuc3RhdHVzPTAsdGhpcy5wZW5kaW5nX2J1Zj1udWxsLHRoaXMucGVuZGluZ19idWZfc2l6ZT0wLHRoaXMucGVuZGluZ19vdXQ9MCx0aGlzLnBlbmRpbmc9MCx0aGlzLndyYXA9MCx0aGlzLmd6aGVhZD1udWxsLHRoaXMuZ3ppbmRleD0wLHRoaXMubWV0aG9kPUZkLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBQbC5CdWYxNigyKldkKSx0aGlzLmR5bl9kdHJlZT1uZXcgUGwuQnVmMTYoMiooMipWZCsxKSksdGhpcy5ibF90cmVlPW5ldyBQbC5CdWYxNigyKigyKnFkKzEpKSxvZih0aGlzLmR5bl9sdHJlZSksb2YodGhpcy5keW5fZHRyZWUpLG9mKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IFBsLkJ1ZjE2KEhkKzEpLHRoaXMuaGVhcD1uZXcgUGwuQnVmMTYoMip6ZCsxKSxvZih0aGlzLmhlYXApLHRoaXMuaGVhcF9sZW49MCx0aGlzLmhlYXBfbWF4PTAsdGhpcy5kZXB0aD1uZXcgUGwuQnVmMTYoMip6ZCsxKSxvZih0aGlzLmRlcHRoKSx0aGlzLmxfYnVmPTAsdGhpcy5saXRfYnVmc2l6ZT0wLHRoaXMubGFzdF9saXQ9MCx0aGlzLmRfYnVmPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1mdW5jdGlvbiBnZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oZS50b3RhbF9pbj1lLnRvdGFsX291dD0wLGUuZGF0YV90eXBlPVJkLCh0PWUuc3RhdGUpLnBlbmRpbmc9MCx0LnBlbmRpbmdfb3V0PTAsdC53cmFwPDAmJih0LndyYXA9LXQud3JhcCksdC5zdGF0dXM9dC53cmFwP1lkOktkLGUuYWRsZXI9Mj09PXQud3JhcD8wOjEsdC5sYXN0X2ZsdXNoPU1kLE9kLl90cl9pbml0KHQpLExkKTpuZihlLEJkKX1mdW5jdGlvbiBtZihlKXt2YXIgdCxuPWdmKGUpO3JldHVybiBuPT09TGQmJigodD1lLnN0YXRlKS53aW5kb3dfc2l6ZT0yKnQud19zaXplLG9mKHQuaGVhZCksdC5tYXhfbGF6eV9tYXRjaD1BZFt0LmxldmVsXS5tYXhfbGF6eSx0Lmdvb2RfbWF0Y2g9QWRbdC5sZXZlbF0uZ29vZF9sZW5ndGgsdC5uaWNlX21hdGNoPUFkW3QubGV2ZWxdLm5pY2VfbGVuZ3RoLHQubWF4X2NoYWluX2xlbmd0aD1BZFt0LmxldmVsXS5tYXhfY2hhaW4sdC5zdHJzdGFydD0wLHQuYmxvY2tfc3RhcnQ9MCx0Lmxvb2thaGVhZD0wLHQuaW5zZXJ0PTAsdC5tYXRjaF9sZW5ndGg9dC5wcmV2X2xlbmd0aD1HZC0xLHQubWF0Y2hfYXZhaWxhYmxlPTAsdC5pbnNfaD0wKSxufWZ1bmN0aW9uIHlmKGUsdCxuLHIsaSxvKXtpZighZSlyZXR1cm4gQmQ7dmFyIGE9MTtpZih0PT09TmQmJih0PTYpLHI8MD8oYT0wLHI9LXIpOjE1PHImJihhPTIsci09MTYpLGk8MXx8VWQ8aXx8biE9PUZkfHxyPDh8fDE1PHJ8fHQ8MHx8OTx0fHxvPDB8fERkPG8pcmV0dXJuIG5mKGUsQmQpOzg9PT1yJiYocj05KTt2YXIgcz1uZXcgdmY7cmV0dXJuKGUuc3RhdGU9cykuc3RybT1lLHMud3JhcD1hLHMuZ3poZWFkPW51bGwscy53X2JpdHM9cixzLndfc2l6ZT0xPDxzLndfYml0cyxzLndfbWFzaz1zLndfc2l6ZS0xLHMuaGFzaF9iaXRzPWkrNyxzLmhhc2hfc2l6ZT0xPDxzLmhhc2hfYml0cyxzLmhhc2hfbWFzaz1zLmhhc2hfc2l6ZS0xLHMuaGFzaF9zaGlmdD1+figocy5oYXNoX2JpdHMrR2QtMSkvR2QpLHMud2luZG93PW5ldyBQbC5CdWY4KDIqcy53X3NpemUpLHMuaGVhZD1uZXcgUGwuQnVmMTYocy5oYXNoX3NpemUpLHMucHJldj1uZXcgUGwuQnVmMTYocy53X3NpemUpLHMubGl0X2J1ZnNpemU9MTw8aSs2LHMucGVuZGluZ19idWZfc2l6ZT00KnMubGl0X2J1ZnNpemUscy5wZW5kaW5nX2J1Zj1uZXcgUGwuQnVmOChzLnBlbmRpbmdfYnVmX3NpemUpLHMuZF9idWY9MSpzLmxpdF9idWZzaXplLHMubF9idWY9MypzLmxpdF9idWZzaXplLHMubGV2ZWw9dCxzLnN0cmF0ZWd5PW8scy5tZXRob2Q9bixtZihlKX1BZD1bbmV3IGhmKDAsMCwwLDAsZnVuY3Rpb24oZSx0KXt2YXIgbj02NTUzNTtmb3Iobj5lLnBlbmRpbmdfYnVmX3NpemUtNSYmKG49ZS5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKGUubG9va2FoZWFkPD0xKXtpZihkZihlKSwwPT09ZS5sb29rYWhlYWQmJnQ9PT1NZClyZXR1cm4gWmQ7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWUuc3Ryc3RhcnQrPWUubG9va2FoZWFkLGUubG9va2FoZWFkPTA7dmFyIHI9ZS5ibG9ja19zdGFydCtuO2lmKCgwPT09ZS5zdHJzdGFydHx8ZS5zdHJzdGFydD49cikmJihlLmxvb2thaGVhZD1lLnN0cnN0YXJ0LXIsZS5zdHJzdGFydD1yLHNmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gWmQ7aWYoZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0Pj1lLndfc2l6ZS1KZCYmKHNmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gWmR9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PWpkPyhzZihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9lZjp0Zik6KGUuc3Ryc3RhcnQ+ZS5ibG9ja19zdGFydCYmKHNmKGUsITEpLGUuc3RybS5hdmFpbF9vdXQpLFpkKX0pLG5ldyBoZig0LDQsOCw0LGZmKSxuZXcgaGYoNCw1LDE2LDgsZmYpLG5ldyBoZig0LDYsMzIsMzIsZmYpLG5ldyBoZig0LDQsMTYsMTYscGYpLG5ldyBoZig4LDE2LDMyLDMyLHBmKSxuZXcgaGYoOCwxNiwxMjgsMTI4LHBmKSxuZXcgaGYoOCwzMiwxMjgsMjU2LHBmKSxuZXcgaGYoMzIsMTI4LDI1OCwxMDI0LHBmKSxuZXcgaGYoMzIsMjU4LDI1OCw0MDk2LHBmKV07dmFyIF9mPXtkZWZsYXRlSW5pdDpmdW5jdGlvbihlLHQpe3JldHVybiB5ZihlLHQsRmQsMTUsOCwwKX0sZGVmbGF0ZUluaXQyOnlmLGRlZmxhdGVSZXNldDptZixkZWZsYXRlUmVzZXRLZWVwOmdmLGRlZmxhdGVTZXRIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5zdGF0ZT8yIT09ZS5zdGF0ZS53cmFwP0JkOihlLnN0YXRlLmd6aGVhZD10LExkKTpCZH0sZGVmbGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvO2lmKCFlfHwhZS5zdGF0ZXx8NTx0fHx0PDApcmV0dXJuIGU/bmYoZSxCZCk6QmQ7aWYocj1lLnN0YXRlLCFlLm91dHB1dHx8IWUuaW5wdXQmJjAhPT1lLmF2YWlsX2lufHw2NjY9PT1yLnN0YXR1cyYmdCE9PWpkKXJldHVybiBuZihlLDA9PT1lLmF2YWlsX291dD8tNTpCZCk7aWYoci5zdHJtPWUsbj1yLmxhc3RfZmx1c2gsci5sYXN0X2ZsdXNoPXQsci5zdGF0dXM9PT1ZZClpZigyPT09ci53cmFwKWUuYWRsZXI9MCxjZihyLDMxKSxjZihyLDEzOSksY2Yociw4KSxyLmd6aGVhZD8oY2Yociwoci5nemhlYWQudGV4dD8xOjApKyhyLmd6aGVhZC5oY3JjPzI6MCkrKHIuZ3poZWFkLmV4dHJhPzQ6MCkrKHIuZ3poZWFkLm5hbWU/ODowKSsoci5nemhlYWQuY29tbWVudD8xNjowKSksY2YociwyNTUmci5nemhlYWQudGltZSksY2YocixyLmd6aGVhZC50aW1lPj44JjI1NSksY2YocixyLmd6aGVhZC50aW1lPj4xNiYyNTUpLGNmKHIsci5nemhlYWQudGltZT4+MjQmMjU1KSxjZihyLDk9PT1yLmxldmVsPzI6Mjw9ci5zdHJhdGVneXx8ci5sZXZlbDwyPzQ6MCksY2YociwyNTUmci5nemhlYWQub3MpLHIuZ3poZWFkLmV4dHJhJiZyLmd6aGVhZC5leHRyYS5sZW5ndGgmJihjZihyLDI1NSZyLmd6aGVhZC5leHRyYS5sZW5ndGgpLGNmKHIsci5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLHIuZ3poZWFkLmhjcmMmJihlLmFkbGVyPSRkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmcsMCkpLHIuZ3ppbmRleD0wLHIuc3RhdHVzPTY5KTooY2YociwwKSxjZihyLDApLGNmKHIsMCksY2YociwwKSxjZihyLDApLGNmKHIsOT09PXIubGV2ZWw/MjoyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/NDowKSxjZihyLDMpLHIuc3RhdHVzPUtkKTtlbHNle3ZhciBhPUZkKyhyLndfYml0cy04PDw0KTw8ODthfD0oMjw9ci5zdHJhdGVneXx8ci5sZXZlbDwyPzA6ci5sZXZlbDw2PzE6Nj09PXIubGV2ZWw/MjozKTw8NiwwIT09ci5zdHJzdGFydCYmKGF8PTMyKSxhKz0zMS1hJTMxLHIuc3RhdHVzPUtkLHVmKHIsYSksMCE9PXIuc3Ryc3RhcnQmJih1ZihyLGUuYWRsZXI+Pj4xNiksdWYociw2NTUzNSZlLmFkbGVyKSksZS5hZGxlcj0xfWlmKDY5PT09ci5zdGF0dXMpaWYoci5nemhlYWQuZXh0cmEpe2ZvcihpPXIucGVuZGluZztyLmd6aW5kZXg8KDY1NTM1JnIuZ3poZWFkLmV4dHJhLmxlbmd0aCkmJihyLnBlbmRpbmchPT1yLnBlbmRpbmdfYnVmX3NpemV8fChyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9JGQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxhZihlKSxpPXIucGVuZGluZyxyLnBlbmRpbmchPT1yLnBlbmRpbmdfYnVmX3NpemUpKTspY2YociwyNTUmci5nemhlYWQuZXh0cmFbci5nemluZGV4XSksci5nemluZGV4Kys7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPSRkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksci5nemluZGV4PT09ci5nemhlYWQuZXh0cmEubGVuZ3RoJiYoci5nemluZGV4PTAsci5zdGF0dXM9NzMpfWVsc2Ugci5zdGF0dXM9NzM7aWYoNzM9PT1yLnN0YXR1cylpZihyLmd6aGVhZC5uYW1lKXtpPXIucGVuZGluZztkb3tpZihyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9JGQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxhZihlKSxpPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKXtvPTE7YnJlYWt9Y2YocixvPXIuZ3ppbmRleDxyLmd6aGVhZC5uYW1lLmxlbmd0aD8yNTUmci5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKTowKX13aGlsZSgwIT09byk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPSRkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksMD09PW8mJihyLmd6aW5kZXg9MCxyLnN0YXR1cz05MSl9ZWxzZSByLnN0YXR1cz05MTtpZig5MT09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLmNvbW1lbnQpe2k9ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj0kZChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLGFmKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31jZihyLG89ci5nemluZGV4PHIuZ3poZWFkLmNvbW1lbnQubGVuZ3RoPzI1NSZyLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQoci5nemluZGV4KyspOjApfXdoaWxlKDAhPT1vKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9JGQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSwwPT09byYmKHIuc3RhdHVzPTEwMyl9ZWxzZSByLnN0YXR1cz0xMDM7aWYoMTAzPT09ci5zdGF0dXMmJihyLmd6aGVhZC5oY3JjPyhyLnBlbmRpbmcrMj5yLnBlbmRpbmdfYnVmX3NpemUmJmFmKGUpLHIucGVuZGluZysyPD1yLnBlbmRpbmdfYnVmX3NpemUmJihjZihyLDI1NSZlLmFkbGVyKSxjZihyLGUuYWRsZXI+PjgmMjU1KSxlLmFkbGVyPTAsci5zdGF0dXM9S2QpKTpyLnN0YXR1cz1LZCksMCE9PXIucGVuZGluZyl7aWYoYWYoZSksMD09PWUuYXZhaWxfb3V0KXJldHVybiByLmxhc3RfZmx1c2g9LTEsTGR9ZWxzZSBpZigwPT09ZS5hdmFpbF9pbiYmcmYodCk8PXJmKG4pJiZ0IT09amQpcmV0dXJuIG5mKGUsLTUpO2lmKDY2Nj09PXIuc3RhdHVzJiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gbmYoZSwtNSk7aWYoMCE9PWUuYXZhaWxfaW58fDAhPT1yLmxvb2thaGVhZHx8dCE9PU1kJiY2NjYhPT1yLnN0YXR1cyl7dmFyIHM9Mj09PXIuc3RyYXRlZ3k/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG47Oyl7aWYoMD09PWUubG9va2FoZWFkJiYoZGYoZSksMD09PWUubG9va2FoZWFkKSl7aWYodD09PU1kKXJldHVybiBaZDticmVha31pZihlLm1hdGNoX2xlbmd0aD0wLG49T2QuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyssbiYmKHNmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gWmR9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PWpkPyhzZihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9lZjp0Zik6ZS5sYXN0X2xpdCYmKHNmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT9aZDpRZH0ocix0KTozPT09ci5zdHJhdGVneT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGksbyxhPWUud2luZG93Ozspe2lmKGUubG9va2FoZWFkPD1YZCl7aWYoZGYoZSksZS5sb29rYWhlYWQ8PVhkJiZ0PT09TWQpcmV0dXJuIFpkO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj1HZCYmMDxlLnN0cnN0YXJ0JiYocj1hW2k9ZS5zdHJzdGFydC0xXSk9PT1hWysraV0mJnI9PT1hWysraV0mJnI9PT1hWysraV0pe289ZS5zdHJzdGFydCtYZDtkb3t9d2hpbGUocj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmaTxvKTtlLm1hdGNoX2xlbmd0aD1YZC0oby1pKSxlLm1hdGNoX2xlbmd0aD5lLmxvb2thaGVhZCYmKGUubWF0Y2hfbGVuZ3RoPWUubG9va2FoZWFkKX1pZihlLm1hdGNoX2xlbmd0aD49R2Q/KG49T2QuX3RyX3RhbGx5KGUsMSxlLm1hdGNoX2xlbmd0aC1HZCksZS5sb29rYWhlYWQtPWUubWF0Y2hfbGVuZ3RoLGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTApOihuPU9kLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrKSxuJiYoc2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBaZH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09amQ/KHNmKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P2VmOnRmKTplLmxhc3RfbGl0JiYoc2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP1pkOlFkfShyLHQpOkFkW3IubGV2ZWxdLmZ1bmMocix0KTtpZihzIT09ZWYmJnMhPT10Znx8KHIuc3RhdHVzPTY2Nikscz09PVpkfHxzPT09ZWYpcmV0dXJuIDA9PT1lLmF2YWlsX291dCYmKHIubGFzdF9mbHVzaD0tMSksTGQ7aWYocz09PVFkJiYoMT09PXQ/T2QuX3RyX2FsaWduKHIpOjUhPT10JiYoT2QuX3RyX3N0b3JlZF9ibG9jayhyLDAsMCwhMSksMz09PXQmJihvZihyLmhlYWQpLDA9PT1yLmxvb2thaGVhZCYmKHIuc3Ryc3RhcnQ9MCxyLmJsb2NrX3N0YXJ0PTAsci5pbnNlcnQ9MCkpKSxhZihlKSwwPT09ZS5hdmFpbF9vdXQpKXJldHVybiByLmxhc3RfZmx1c2g9LTEsTGR9cmV0dXJuIHQhPT1qZD9MZDpyLndyYXA8PTA/MTooMj09PXIud3JhcD8oY2YociwyNTUmZS5hZGxlciksY2YocixlLmFkbGVyPj44JjI1NSksY2YocixlLmFkbGVyPj4xNiYyNTUpLGNmKHIsZS5hZGxlcj4+MjQmMjU1KSxjZihyLDI1NSZlLnRvdGFsX2luKSxjZihyLGUudG90YWxfaW4+PjgmMjU1KSxjZihyLGUudG90YWxfaW4+PjE2JjI1NSksY2YocixlLnRvdGFsX2luPj4yNCYyNTUpKToodWYocixlLmFkbGVyPj4+MTYpLHVmKHIsNjU1MzUmZS5hZGxlcikpLGFmKGUpLDA8ci53cmFwJiYoci53cmFwPS1yLndyYXApLDAhPT1yLnBlbmRpbmc/TGQ6MSl9LGRlZmxhdGVFbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUmJmUuc3RhdGU/KHQ9ZS5zdGF0ZS5zdGF0dXMpIT09WWQmJjY5IT09dCYmNzMhPT10JiY5MSE9PXQmJjEwMyE9PXQmJnQhPT1LZCYmNjY2IT09dD9uZihlLEJkKTooZS5zdGF0ZT1udWxsLHQ9PT1LZD9uZihlLC0zKTpMZCk6QmR9LGRlZmxhdGVTZXREaWN0aW9uYXJ5OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGMsdSxsPXQubGVuZ3RoO2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gQmQ7aWYoMj09PShvPShuPWUuc3RhdGUpLndyYXApfHwxPT09byYmbi5zdGF0dXMhPT1ZZHx8bi5sb29rYWhlYWQpcmV0dXJuIEJkO2ZvcigxPT09byYmKGUuYWRsZXI9RWQoZS5hZGxlcix0LGwsMCkpLG4ud3JhcD0wLGw+PW4ud19zaXplJiYoMD09PW8mJihvZihuLmhlYWQpLG4uc3Ryc3RhcnQ9MCxuLmJsb2NrX3N0YXJ0PTAsbi5pbnNlcnQ9MCksdT1uZXcgUGwuQnVmOChuLndfc2l6ZSksUGwuYXJyYXlTZXQodSx0LGwtbi53X3NpemUsbi53X3NpemUsMCksdD11LGw9bi53X3NpemUpLGE9ZS5hdmFpbF9pbixzPWUubmV4dF9pbixjPWUuaW5wdXQsZS5hdmFpbF9pbj1sLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxkZihuKTtuLmxvb2thaGVhZD49R2Q7KXtmb3Iocj1uLnN0cnN0YXJ0LGk9bi5sb29rYWhlYWQtKEdkLTEpO24uaW5zX2g9KG4uaW5zX2g8PG4uaGFzaF9zaGlmdF5uLndpbmRvd1tyK0dkLTFdKSZuLmhhc2hfbWFzayxuLnByZXZbciZuLndfbWFza109bi5oZWFkW24uaW5zX2hdLG4uaGVhZFtuLmluc19oXT1yLHIrKywtLWk7KTtuLnN0cnN0YXJ0PXIsbi5sb29rYWhlYWQ9R2QtMSxkZihuKX1yZXR1cm4gbi5zdHJzdGFydCs9bi5sb29rYWhlYWQsbi5ibG9ja19zdGFydD1uLnN0cnN0YXJ0LG4uaW5zZXJ0PW4ubG9va2FoZWFkLG4ubG9va2FoZWFkPTAsbi5tYXRjaF9sZW5ndGg9bi5wcmV2X2xlbmd0aD1HZC0xLG4ubWF0Y2hfYXZhaWxhYmxlPTAsZS5uZXh0X2luPXMsZS5pbnB1dD1jLGUuYXZhaWxfaW49YSxuLndyYXA9byxMZH0sZGVmbGF0ZUluZm86InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSxiZj0hMCx3Zj0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2goZSl7YmY9ITF9dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2goZSl7d2Y9ITF9Zm9yKHZhciBrZj1uZXcgUGwuQnVmOCgyNTYpLFNmPTA7U2Y8MjU2O1NmKyspa2ZbU2ZdPTI1Mjw9U2Y/NjoyNDg8PVNmPzU6MjQwPD1TZj80OjIyNDw9U2Y/MzoxOTI8PVNmPzI6MTtrZlsyNTRdPWtmWzI1NF09MTtmdW5jdGlvbiB4ZihlLHQpe2lmKHQ8NjU1MzQmJihlLnN1YmFycmF5JiZ3Znx8IWUuc3ViYXJyYXkmJmJmKSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFBsLnNocmlua0J1ZihlLHQpKTtmb3IodmFyIG49IiIscj0wO3I8dDtyKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW3JdKTtyZXR1cm4gbn12YXIgQ2Y9e3N0cmluZzJidWY6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPWUubGVuZ3RoLHM9MDtmb3IoaT0wO2k8YTtpKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoaSkpKSYmaSsxPGEmJjU2MzIwPT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksaSsrKSxzKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PW5ldyBQbC5CdWY4KHMpLGk9bz0wO288cztpKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoaSkpKSYmaSsxPGEmJjU2MzIwPT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksaSsrKSxuPDEyOD90W28rK109bjoobjwyMDQ4P3RbbysrXT0xOTJ8bj4+PjY6KG48NjU1MzY/dFtvKytdPTIyNHxuPj4+MTI6KHRbbysrXT0yNDB8bj4+PjE4LHRbbysrXT0xMjh8bj4+PjEyJjYzKSx0W28rK109MTI4fG4+Pj42JjYzKSx0W28rK109MTI4fDYzJm4pO3JldHVybiB0fSxidWYyYmluc3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB4ZihlLGUubGVuZ3RoKX0sYmluc3RyaW5nMmJ1ZjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9bmV3IFBsLkJ1ZjgoZS5sZW5ndGgpLG49MCxyPXQubGVuZ3RoO248cjtuKyspdFtuXT1lLmNoYXJDb2RlQXQobik7cmV0dXJuIHR9LGJ1ZjJzdHJpbmc6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhPXR8fGUubGVuZ3RoLHM9bmV3IEFycmF5KDIqYSk7Zm9yKG49cj0wO248YTspaWYoKGk9ZVtuKytdKTwxMjgpc1tyKytdPWk7ZWxzZSBpZig0PChvPWtmW2ldKSlzW3IrK109NjU1MzMsbis9by0xO2Vsc2V7Zm9yKGkmPTI9PT1vPzMxOjM9PT1vPzE1Ojc7MTxvJiZuPGE7KWk9aTw8Nnw2MyZlW24rK10sby0tOzE8bz9zW3IrK109NjU1MzM6aTw2NTUzNj9zW3IrK109aTooaS09NjU1MzYsc1tyKytdPTU1Mjk2fGk+PjEwJjEwMjMsc1tyKytdPTU2MzIwfDEwMjMmaSl9cmV0dXJuIHhmKHMscil9LHV0Zjhib3JkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IoKHQ9dHx8ZS5sZW5ndGgpPmUubGVuZ3RoJiYodD1lLmxlbmd0aCksbj10LTE7MDw9biYmMTI4PT0oMTkyJmVbbl0pOyluLS07cmV0dXJuIG48MD90OjA9PT1uP3Q6bitrZltlW25dXT50P246dH19O3ZhciBUZj1mdW5jdGlvbigpe3RoaXMuaW5wdXQ9bnVsbCx0aGlzLm5leHRfaW49MCx0aGlzLmF2YWlsX2luPTAsdGhpcy50b3RhbF9pbj0wLHRoaXMub3V0cHV0PW51bGwsdGhpcy5uZXh0X291dD0wLHRoaXMuYXZhaWxfb3V0PTAsdGhpcy50b3RhbF9vdXQ9MCx0aGlzLm1zZz0iIix0aGlzLnN0YXRlPW51bGwsdGhpcy5kYXRhX3R5cGU9Mix0aGlzLmFkbGVyPTB9LE9mPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRWY9MCxJZj0tMSxBZj0wLCRmPTg7ZnVuY3Rpb24gUGYoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgUGYpKXJldHVybiBuZXcgUGYoZSk7dGhpcy5vcHRpb25zPVBsLmFzc2lnbih7bGV2ZWw6SWYsbWV0aG9kOiRmLGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6QWYsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJjA8dC53aW5kb3dCaXRzP3Qud2luZG93Qml0cz0tdC53aW5kb3dCaXRzOnQuZ3ppcCYmMDx0LndpbmRvd0JpdHMmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cys9MTYpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IFRmLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbj1fZi5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLHQubGV2ZWwsdC5tZXRob2QsdC53aW5kb3dCaXRzLHQubWVtTGV2ZWwsdC5zdHJhdGVneSk7aWYobiE9PUVmKXRocm93IG5ldyBFcnJvcihQZFtuXSk7aWYodC5oZWFkZXImJl9mLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLHQuaGVhZGVyKSx0LmRpY3Rpb25hcnkpe3ZhciByO2lmKHI9InN0cmluZyI9PXR5cGVvZiB0LmRpY3Rpb25hcnk/Q2Yuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1PZi5jYWxsKHQuZGljdGlvbmFyeSk/bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KTp0LmRpY3Rpb25hcnksKG49X2YuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHIpKSE9PUVmKXRocm93IG5ldyBFcnJvcihQZFtuXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIE1mKGUsdCl7dmFyIG49bmV3IFBmKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8UGRbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1QZi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzLnN0cm0sbz10aGlzLm9wdGlvbnMuY2h1bmtTaXplO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7cj10PT09fn50P3Q6ITA9PT10PzQ6MCwic3RyaW5nIj09dHlwZW9mIGU/aS5pbnB1dD1DZi5zdHJpbmcyYnVmKGUpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1PZi5jYWxsKGUpP2kuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6aS5pbnB1dD1lLGkubmV4dF9pbj0wLGkuYXZhaWxfaW49aS5pbnB1dC5sZW5ndGg7ZG97aWYoMD09PWkuYXZhaWxfb3V0JiYoaS5vdXRwdXQ9bmV3IFBsLkJ1ZjgobyksaS5uZXh0X291dD0wLGkuYXZhaWxfb3V0PW8pLDEhPT0obj1fZi5kZWZsYXRlKGkscikpJiZuIT09RWYpcmV0dXJuIHRoaXMub25FbmQobiksISh0aGlzLmVuZGVkPSEwKTswIT09aS5hdmFpbF9vdXQmJigwIT09aS5hdmFpbF9pbnx8NCE9PXImJjIhPT1yKXx8KCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMub25EYXRhKENmLmJ1ZjJiaW5zdHJpbmcoUGwuc2hyaW5rQnVmKGkub3V0cHV0LGkubmV4dF9vdXQpKSk6dGhpcy5vbkRhdGEoUGwuc2hyaW5rQnVmKGkub3V0cHV0LGkubmV4dF9vdXQpKSl9d2hpbGUoKDA8aS5hdmFpbF9pbnx8MD09PWkuYXZhaWxfb3V0KSYmMSE9PW4pO3JldHVybiA0PT09cj8obj1fZi5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1FZik6MiE9PXJ8fCh0aGlzLm9uRW5kKEVmKSwhKGkuYXZhaWxfb3V0PTApKX0sUGYucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxQZi5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PUVmJiYoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9UGwuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307dmFyIGpmPXtEZWZsYXRlOlBmLGRlZmxhdGU6TWYsZGVmbGF0ZVJhdzpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAsTWYoZSx0KX0sZ3ppcDpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5nemlwPSEwLE1mKGUsdCl9fSxMZj1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGYscCxoLHYsZyxtLHksXyxiLHcsayxTLHgsQyxUO249ZS5zdGF0ZSxyPWUubmV4dF9pbixDPWUuaW5wdXQsaT1yKyhlLmF2YWlsX2luLTUpLG89ZS5uZXh0X291dCxUPWUub3V0cHV0LGE9by0odC1lLmF2YWlsX291dCkscz1vKyhlLmF2YWlsX291dC0yNTcpLGM9bi5kbWF4LHU9bi53c2l6ZSxsPW4ud2hhdmUsZD1uLnduZXh0LGY9bi53aW5kb3cscD1uLmhvbGQsaD1uLmJpdHMsdj1uLmxlbmNvZGUsZz1uLmRpc3Rjb2RlLG09KDE8PG4ubGVuYml0cyktMSx5PSgxPDxuLmRpc3RiaXRzKS0xO2U6ZG97aDwxNSYmKHArPUNbcisrXTw8aCxoKz04LHArPUNbcisrXTw8aCxoKz04KSxfPXZbcCZtXTt0OmZvcig7Oyl7aWYocD4+Pj1iPV8+Pj4yNCxoLT1iLDA9PT0oYj1fPj4+MTYmMjU1KSlUW28rK109NjU1MzUmXztlbHNle2lmKCEoMTYmYikpe2lmKDA9PSg2NCZiKSl7Xz12Wyg2NTUzNSZfKSsocCYoMTw8YiktMSldO2NvbnRpbnVlIHR9aWYoMzImYil7bi5tb2RlPTEyO2JyZWFrIGV9ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPTMwO2JyZWFrIGV9dz02NTUzNSZfLChiJj0xNSkmJihoPGImJihwKz1DW3IrK108PGgsaCs9OCksdys9cCYoMTw8YiktMSxwPj4+PWIsaC09YiksaDwxNSYmKHArPUNbcisrXTw8aCxoKz04LHArPUNbcisrXTw8aCxoKz04KSxfPWdbcCZ5XTtuOmZvcig7Oyl7aWYocD4+Pj1iPV8+Pj4yNCxoLT1iLCEoMTYmKGI9Xz4+PjE2JjI1NSkpKXtpZigwPT0oNjQmYikpe189Z1soNjU1MzUmXykrKHAmKDE8PGIpLTEpXTtjb250aW51ZSBufWUubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT0zMDticmVhayBlfWlmKGs9NjU1MzUmXyxoPChiJj0xNSkmJihwKz1DW3IrK108PGgsKGgrPTgpPGImJihwKz1DW3IrK108PGgsaCs9OCkpLGM8KGsrPXAmKDE8PGIpLTEpKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVhayBlfWlmKHA+Pj49YixoLT1iLChiPW8tYSk8ayl7aWYobDwoYj1rLWIpJiZuLnNhbmUpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPTMwO2JyZWFrIGV9aWYoeD1mLChTPTApPT09ZCl7aWYoUys9dS1iLGI8dyl7Zm9yKHctPWI7VFtvKytdPWZbUysrXSwtLWI7KTtTPW8tayx4PVR9fWVsc2UgaWYoZDxiKXtpZihTKz11K2QtYiwoYi09ZCk8dyl7Zm9yKHctPWI7VFtvKytdPWZbUysrXSwtLWI7KTtpZihTPTAsZDx3KXtmb3Iody09Yj1kO1RbbysrXT1mW1MrK10sLS1iOyk7Uz1vLWsseD1UfX19ZWxzZSBpZihTKz1kLWIsYjx3KXtmb3Iody09YjtUW28rK109ZltTKytdLC0tYjspO1M9by1rLHg9VH1mb3IoOzI8dzspVFtvKytdPXhbUysrXSxUW28rK109eFtTKytdLFRbbysrXT14W1MrK10sdy09Mzt3JiYoVFtvKytdPXhbUysrXSwxPHcmJihUW28rK109eFtTKytdKSl9ZWxzZXtmb3IoUz1vLWs7VFtvKytdPVRbUysrXSxUW28rK109VFtTKytdLFRbbysrXT1UW1MrK10sMjwody09Myk7KTt3JiYoVFtvKytdPVRbUysrXSwxPHcmJihUW28rK109VFtTKytdKSl9YnJlYWt9fWJyZWFrfX13aGlsZShyPGkmJm88cyk7ci09dz1oPj4zLHAmPSgxPDwoaC09dzw8MykpLTEsZS5uZXh0X2luPXIsZS5uZXh0X291dD1vLGUuYXZhaWxfaW49cjxpP2ktcis1OjUtKHItaSksZS5hdmFpbF9vdXQ9bzxzP3MtbysyNTc6MjU3LShvLXMpLG4uaG9sZD1wLG4uYml0cz1ofSxCZj1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLE5mPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sRGY9WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdLFJmPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0sRmY9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt2YXIgYyx1LGwsZCxmLHAsaCx2LGcsbT1zLmJpdHMseT0wLF89MCxiPTAsdz0wLGs9MCxTPTAseD0wLEM9MCxUPTAsTz0wLEU9bnVsbCxJPTAsQT1uZXcgUGwuQnVmMTYoMTYpLCQ9bmV3IFBsLkJ1ZjE2KDE2KSxQPW51bGwsTT0wO2Zvcih5PTA7eTw9MTU7eSsrKUFbeV09MDtmb3IoXz0wO188cjtfKyspQVt0W24rX11dKys7Zm9yKGs9bSx3PTE1OzE8PXcmJjA9PT1BW3ddO3ctLSk7aWYodzxrJiYoaz13KSwwPT09dylyZXR1cm4gaVtvKytdPTIwOTcxNTIwLGlbbysrXT0yMDk3MTUyMCxzLmJpdHM9MSwwO2ZvcihiPTE7Yjx3JiYwPT09QVtiXTtiKyspO2ZvcihrPGImJihrPWIpLHk9Qz0xO3k8PTE1O3krKylpZihDPDw9MSwoQy09QVt5XSk8MClyZXR1cm4tMTtpZigwPEMmJigwPT09ZXx8MSE9PXcpKXJldHVybi0xO2ZvcigkWzFdPTAseT0xO3k8MTU7eSsrKSRbeSsxXT0kW3ldK0FbeV07Zm9yKF89MDtfPHI7XysrKTAhPT10W24rX10mJihhWyRbdFtuK19dXSsrXT1fKTtpZigwPT09ZT8oRT1QPWEscD0xOSk6MT09PWU/KEU9QmYsSS09MjU3LFA9TmYsTS09MjU3LHA9MjU2KTooRT1EZixQPVJmLHA9LTEpLHk9YixmPW8seD1fPU89MCxsPS0xLGQ9KFQ9MTw8KFM9aykpLTEsMT09PWUmJjg1MjxUfHwyPT09ZSYmNTkyPFQpcmV0dXJuIDE7Zm9yKDs7KXtmb3IoaD15LXgsYVtfXTxwPyh2PTAsZz1hW19dKTphW19dPnA/KHY9UFtNK2FbX11dLGc9RVtJK2FbX11dKToodj05NixnPTApLGM9MTw8eS14LGI9dT0xPDxTO2lbZisoTz4+eCkrKHUtPWMpXT1oPDwyNHx2PDwxNnxnfDAsMCE9PXU7KTtmb3IoYz0xPDx5LTE7TyZjOyljPj49MTtpZigwIT09Yz8oTyY9Yy0xLE8rPWMpOk89MCxfKyssMD09LS1BW3ldKXtpZih5PT09dylicmVhazt5PXRbbithW19dXX1pZihrPHkmJihPJmQpIT09bCl7Zm9yKDA9PT14JiYoeD1rKSxmKz1iLEM9MTw8KFM9eS14KTtTK3g8dyYmISgoQy09QVtTK3hdKTw9MCk7KVMrKyxDPDw9MTtpZihUKz0xPDxTLDE9PT1lJiY4NTI8VHx8Mj09PWUmJjU5MjxUKXJldHVybiAxO2lbbD1PJmRdPWs8PDI0fFM8PDE2fGYtb3wwfX1yZXR1cm4gMCE9PU8mJihpW2YrT109eS14PDwyNHw2NDw8MTZ8MCkscy5iaXRzPWssMH0sVWY9MSx6Zj0yLFZmPTAscWY9LTIsV2Y9MSxIZj04NTIsR2Y9NTkyO2Z1bmN0aW9uIFhmKGUpe3JldHVybihlPj4+MjQmMjU1KSsoZT4+PjgmNjUyODApKygoNjUyODAmZSk8PDgpKygoMjU1JmUpPDwyNCl9ZnVuY3Rpb24gSmYoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IFBsLkJ1ZjE2KDMyMCksdGhpcy53b3JrPW5ldyBQbC5CdWYxNigyODgpLHRoaXMubGVuZHluPW51bGwsdGhpcy5kaXN0ZHluPW51bGwsdGhpcy5zYW5lPTAsdGhpcy5iYWNrPTAsdGhpcy53YXM9MH1mdW5jdGlvbiBZZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8odD1lLnN0YXRlLGUudG90YWxfaW49ZS50b3RhbF9vdXQ9dC50b3RhbD0wLGUubXNnPSIiLHQud3JhcCYmKGUuYWRsZXI9MSZ0LndyYXApLHQubW9kZT1XZix0Lmxhc3Q9MCx0LmhhdmVkaWN0PTAsdC5kbWF4PTMyNzY4LHQuaGVhZD1udWxsLHQuaG9sZD0wLHQuYml0cz0wLHQubGVuY29kZT10LmxlbmR5bj1uZXcgUGwuQnVmMzIoSGYpLHQuZGlzdGNvZGU9dC5kaXN0ZHluPW5ldyBQbC5CdWYzMihHZiksdC5zYW5lPTEsdC5iYWNrPS0xLFZmKTpxZn1mdW5jdGlvbiBLZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oKHQ9ZS5zdGF0ZSkud3NpemU9MCx0LndoYXZlPTAsdC53bmV4dD0wLFlmKGUpKTpxZn1mdW5jdGlvbiBaZihlLHQpe3ZhciBuLHI7cmV0dXJuIGUmJmUuc3RhdGU/KHI9ZS5zdGF0ZSx0PDA/KG49MCx0PS10KToobj0xKyh0Pj40KSx0PDQ4JiYodCY9MTUpKSx0JiYodDw4fHwxNTx0KT9xZjoobnVsbCE9PXIud2luZG93JiZyLndiaXRzIT09dCYmKHIud2luZG93PW51bGwpLHIud3JhcD1uLHIud2JpdHM9dCxLZihlKSkpOnFmfWZ1bmN0aW9uIFFmKGUsdCl7dmFyIG4scjtyZXR1cm4gZT8ocj1uZXcgSmYsKGUuc3RhdGU9cikud2luZG93PW51bGwsKG49WmYoZSx0KSkhPT1WZiYmKGUuc3RhdGU9bnVsbCksbik6cWZ9dmFyIGVwLHRwLG5wPSEwO2Z1bmN0aW9uIHJwKGUpe2lmKG5wKXt2YXIgdDtmb3IoZXA9bmV3IFBsLkJ1ZjMyKDUxMiksdHA9bmV3IFBsLkJ1ZjMyKDMyKSx0PTA7dDwxNDQ7KWUubGVuc1t0KytdPTg7Zm9yKDt0PDI1NjspZS5sZW5zW3QrK109OTtmb3IoO3Q8MjgwOyllLmxlbnNbdCsrXT03O2Zvcig7dDwyODg7KWUubGVuc1t0KytdPTg7Zm9yKEZmKFVmLGUubGVucywwLDI4OCxlcCwwLGUud29yayx7Yml0czo5fSksdD0wO3Q8MzI7KWUubGVuc1t0KytdPTU7RmYoemYsZS5sZW5zLDAsMzIsdHAsMCxlLndvcmsse2JpdHM6NX0pLG5wPSExfWUubGVuY29kZT1lcCxlLmxlbmJpdHM9OSxlLmRpc3Rjb2RlPXRwLGUuZGlzdGJpdHM9NX1mdW5jdGlvbiBpcChlLHQsbixyKXt2YXIgaSxvPWUuc3RhdGU7cmV0dXJuIG51bGw9PT1vLndpbmRvdyYmKG8ud3NpemU9MTw8by53Yml0cyxvLnduZXh0PTAsby53aGF2ZT0wLG8ud2luZG93PW5ldyBQbC5CdWY4KG8ud3NpemUpKSxyPj1vLndzaXplPyhQbC5hcnJheVNldChvLndpbmRvdyx0LG4tby53c2l6ZSxvLndzaXplLDApLG8ud25leHQ9MCxvLndoYXZlPW8ud3NpemUpOihyPChpPW8ud3NpemUtby53bmV4dCkmJihpPXIpLFBsLmFycmF5U2V0KG8ud2luZG93LHQsbi1yLGksby53bmV4dCksKHItPWkpPyhQbC5hcnJheVNldChvLndpbmRvdyx0LG4tcixyLDApLG8ud25leHQ9cixvLndoYXZlPW8ud3NpemUpOihvLnduZXh0Kz1pLG8ud25leHQ9PT1vLndzaXplJiYoby53bmV4dD0wKSxvLndoYXZlPG8ud3NpemUmJihvLndoYXZlKz1pKSkpLDB9dmFyIG9wPXtpbmZsYXRlUmVzZXQ6S2YsaW5mbGF0ZVJlc2V0MjpaZixpbmZsYXRlUmVzZXRLZWVwOllmLGluZmxhdGVJbml0OmZ1bmN0aW9uKGUpe3JldHVybiBRZihlLDE1KX0saW5mbGF0ZUluaXQyOlFmLGluZmxhdGU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsYyx1LGwsZCxmLHAsaCx2LGcsbSx5LF8sYix3LGssUyx4LEMsVD0wLE89bmV3IFBsLkJ1ZjgoNCksRT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIWV8fCFlLnN0YXRlfHwhZS5vdXRwdXR8fCFlLmlucHV0JiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gcWY7MTI9PT0obj1lLnN0YXRlKS5tb2RlJiYobi5tb2RlPTEzKSxhPWUubmV4dF9vdXQsaT1lLm91dHB1dCxjPWUuYXZhaWxfb3V0LG89ZS5uZXh0X2luLHI9ZS5pbnB1dCxzPWUuYXZhaWxfaW4sdT1uLmhvbGQsbD1uLmJpdHMsZD1zLGY9YyxTPVZmO2U6Zm9yKDs7KXN3aXRjaChuLm1vZGUpe2Nhc2UgV2Y6aWYoMD09PW4ud3JhcCl7bi5tb2RlPTEzO2JyZWFrfWZvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKDImbi53cmFwJiYzNTYxNT09PXUpe09bbi5jaGVjaz0wXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPSRkKG4uY2hlY2ssTywyLDApLGw9dT0wLG4ubW9kZT0yO2JyZWFrfWlmKG4uZmxhZ3M9MCxuLmhlYWQmJihuLmhlYWQuZG9uZT0hMSksISgxJm4ud3JhcCl8fCgoKDI1NSZ1KTw8OCkrKHU+PjgpKSUzMSl7ZS5tc2c9ImluY29ycmVjdCBoZWFkZXIgY2hlY2siLG4ubW9kZT0zMDticmVha31pZig4IT0oMTUmdSkpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPTMwO2JyZWFrfWlmKGwtPTQsaz04KygxNSYodT4+Pj00KSksMD09PW4ud2JpdHMpbi53Yml0cz1rO2Vsc2UgaWYoaz5uLndiaXRzKXtlLm1zZz0iaW52YWxpZCB3aW5kb3cgc2l6ZSIsbi5tb2RlPTMwO2JyZWFrfW4uZG1heD0xPDxrLGUuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT01MTImdT8xMDoxMixsPXU9MDticmVhaztjYXNlIDI6Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobi5mbGFncz11LDghPSgyNTUmbi5mbGFncykpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPTMwO2JyZWFrfWlmKDU3MzQ0Jm4uZmxhZ3Mpe2UubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLG4ubW9kZT0zMDticmVha31uLmhlYWQmJihuLmhlYWQudGV4dD11Pj44JjEpLDUxMiZuLmZsYWdzJiYoT1swXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPSRkKG4uY2hlY2ssTywyLDApKSxsPXU9MCxuLm1vZGU9MztjYXNlIDM6Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bi5oZWFkJiYobi5oZWFkLnRpbWU9dSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LE9bMl09dT4+PjE2JjI1NSxPWzNdPXU+Pj4yNCYyNTUsbi5jaGVjaz0kZChuLmNoZWNrLE8sNCwwKSksbD11PTAsbi5tb2RlPTQ7Y2FzZSA0OmZvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4uaGVhZCYmKG4uaGVhZC54ZmxhZ3M9MjU1JnUsbi5oZWFkLm9zPXU+PjgpLDUxMiZuLmZsYWdzJiYoT1swXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPSRkKG4uY2hlY2ssTywyLDApKSxsPXU9MCxuLm1vZGU9NTtjYXNlIDU6aWYoMTAyNCZuLmZsYWdzKXtmb3IoO2w8MTY7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmxlbmd0aD11LG4uaGVhZCYmKG4uaGVhZC5leHRyYV9sZW49dSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9JGQobi5jaGVjayxPLDIsMCkpLGw9dT0wfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmV4dHJhPW51bGwpO24ubW9kZT02O2Nhc2UgNjppZigxMDI0Jm4uZmxhZ3MmJihzPChwPW4ubGVuZ3RoKSYmKHA9cykscCYmKG4uaGVhZCYmKGs9bi5oZWFkLmV4dHJhX2xlbi1uLmxlbmd0aCxuLmhlYWQuZXh0cmF8fChuLmhlYWQuZXh0cmE9bmV3IEFycmF5KG4uaGVhZC5leHRyYV9sZW4pKSxQbC5hcnJheVNldChuLmhlYWQuZXh0cmEscixvLHAsaykpLDUxMiZuLmZsYWdzJiYobi5jaGVjaz0kZChuLmNoZWNrLHIscCxvKSkscy09cCxvKz1wLG4ubGVuZ3RoLT1wKSxuLmxlbmd0aCkpYnJlYWsgZTtuLmxlbmd0aD0wLG4ubW9kZT03O2Nhc2UgNzppZigyMDQ4Jm4uZmxhZ3Mpe2lmKDA9PT1zKWJyZWFrIGU7Zm9yKHA9MDtrPXJbbytwKytdLG4uaGVhZCYmayYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShrKSksayYmcDxzOyk7aWYoNTEyJm4uZmxhZ3MmJihuLmNoZWNrPSRkKG4uY2hlY2sscixwLG8pKSxzLT1wLG8rPXAsaylicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLm5hbWU9bnVsbCk7bi5sZW5ndGg9MCxuLm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZuLmZsYWdzKXtpZigwPT09cylicmVhayBlO2ZvcihwPTA7az1yW28rcCsrXSxuLmhlYWQmJmsmJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUoaykpLGsmJnA8czspO2lmKDUxMiZuLmZsYWdzJiYobi5jaGVjaz0kZChuLmNoZWNrLHIscCxvKSkscy09cCxvKz1wLGspYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5jb21tZW50PW51bGwpO24ubW9kZT05O2Nhc2UgOTppZig1MTImbi5mbGFncyl7Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodSE9PSg2NTUzNSZuLmNoZWNrKSl7ZS5tc2c9ImhlYWRlciBjcmMgbWlzbWF0Y2giLG4ubW9kZT0zMDticmVha31sPXU9MH1uLmhlYWQmJihuLmhlYWQuaGNyYz1uLmZsYWdzPj45JjEsbi5oZWFkLmRvbmU9ITApLGUuYWRsZXI9bi5jaGVjaz0wLG4ubW9kZT0xMjticmVhaztjYXNlIDEwOmZvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWUuYWRsZXI9bi5jaGVjaz1YZih1KSxsPXU9MCxuLm1vZGU9MTE7Y2FzZSAxMTppZigwPT09bi5oYXZlZGljdClyZXR1cm4gZS5uZXh0X291dD1hLGUuYXZhaWxfb3V0PWMsZS5uZXh0X2luPW8sZS5hdmFpbF9pbj1zLG4uaG9sZD11LG4uYml0cz1sLDI7ZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPTEyO2Nhc2UgMTI6aWYoNT09PXR8fDY9PT10KWJyZWFrIGU7Y2FzZSAxMzppZihuLmxhc3Qpe3U+Pj49NyZsLGwtPTcmbCxuLm1vZGU9Mjc7YnJlYWt9Zm9yKDtsPDM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1zd2l0Y2gobi5sYXN0PTEmdSxsLT0xLDMmKHU+Pj49MSkpe2Nhc2UgMDpuLm1vZGU9MTQ7YnJlYWs7Y2FzZSAxOmlmKHJwKG4pLG4ubW9kZT0yMCw2PT09dCl7dT4+Pj0yLGwtPTI7YnJlYWsgZX1icmVhaztjYXNlIDI6bi5tb2RlPTE3O2JyZWFrO2Nhc2UgMzplLm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixuLm1vZGU9MzB9dT4+Pj0yLGwtPTI7YnJlYWs7Y2FzZSAxNDpmb3IodT4+Pj03JmwsbC09NyZsO2w8MzI7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZigoNjU1MzUmdSkhPSh1Pj4+MTZeNjU1MzUpKXtlLm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsbi5tb2RlPTMwO2JyZWFrfWlmKG4ubGVuZ3RoPTY1NTM1JnUsbD11PTAsbi5tb2RlPTE1LDY9PT10KWJyZWFrIGU7Y2FzZSAxNTpuLm1vZGU9MTY7Y2FzZSAxNjppZihwPW4ubGVuZ3RoKXtpZihzPHAmJihwPXMpLGM8cCYmKHA9YyksMD09PXApYnJlYWsgZTtQbC5hcnJheVNldChpLHIsbyxwLGEpLHMtPXAsbys9cCxjLT1wLGErPXAsbi5sZW5ndGgtPXA7YnJlYWt9bi5tb2RlPTEyO2JyZWFrO2Nhc2UgMTc6Zm9yKDtsPDE0Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobi5ubGVuPTI1NysoMzEmdSksdT4+Pj01LGwtPTUsbi5uZGlzdD0xKygzMSZ1KSx1Pj4+PTUsbC09NSxuLm5jb2RlPTQrKDE1JnUpLHU+Pj49NCxsLT00LDI4NjxuLm5sZW58fDMwPG4ubmRpc3Qpe2UubXNnPSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyIsbi5tb2RlPTMwO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT0xODtjYXNlIDE4OmZvcig7bi5oYXZlPG4ubmNvZGU7KXtmb3IoO2w8Mzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ubGVuc1tFW24uaGF2ZSsrXV09NyZ1LHU+Pj49MyxsLT0zfWZvcig7bi5oYXZlPDE5OyluLmxlbnNbRVtuLmhhdmUrK11dPTA7aWYobi5sZW5jb2RlPW4ubGVuZHluLG4ubGVuYml0cz03LHg9e2JpdHM6bi5sZW5iaXRzfSxTPUZmKDAsbi5sZW5zLDAsMTksbi5sZW5jb2RlLDAsbi53b3JrLHgpLG4ubGVuYml0cz14LmJpdHMsUyl7ZS5tc2c9ImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsbi5tb2RlPTMwO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT0xOTtjYXNlIDE5OmZvcig7bi5oYXZlPG4ubmxlbituLm5kaXN0Oyl7Zm9yKDttPShUPW4ubGVuY29kZVt1JigxPDxuLmxlbmJpdHMpLTFdKT4+PjE2JjI1NSx5PTY1NTM1JlQsISgoZz1UPj4+MjQpPD1sKTspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKHk8MTYpdT4+Pj1nLGwtPWcsbi5sZW5zW24uaGF2ZSsrXT15O2Vsc2V7aWYoMTY9PT15KXtmb3IoQz1nKzI7bDxDOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodT4+Pj1nLGwtPWcsMD09PW4uaGF2ZSl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT0zMDticmVha31rPW4ubGVuc1tuLmhhdmUtMV0scD0zKygzJnUpLHU+Pj49MixsLT0yfWVsc2UgaWYoMTc9PT15KXtmb3IoQz1nKzM7bDxDOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bC09ZyxrPTAscD0zKyg3Jih1Pj4+PWcpKSx1Pj4+PTMsbC09M31lbHNle2ZvcihDPWcrNztsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1sLT1nLGs9MCxwPTExKygxMjcmKHU+Pj49ZykpLHU+Pj49NyxsLT03fWlmKG4uaGF2ZStwPm4ubmxlbituLm5kaXN0KXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPTMwO2JyZWFrfWZvcig7cC0tOyluLmxlbnNbbi5oYXZlKytdPWt9fWlmKDMwPT09bi5tb2RlKWJyZWFrO2lmKDA9PT1uLmxlbnNbMjU2XSl7ZS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsbi5tb2RlPTMwO2JyZWFrfWlmKG4ubGVuYml0cz05LHg9e2JpdHM6bi5sZW5iaXRzfSxTPUZmKFVmLG4ubGVucywwLG4ubmxlbixuLmxlbmNvZGUsMCxuLndvcmsseCksbi5sZW5iaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IixuLm1vZGU9MzA7YnJlYWt9aWYobi5kaXN0Yml0cz02LG4uZGlzdGNvZGU9bi5kaXN0ZHluLHg9e2JpdHM6bi5kaXN0Yml0c30sUz1GZih6ZixuLmxlbnMsbi5ubGVuLG4ubmRpc3Qsbi5kaXN0Y29kZSwwLG4ud29yayx4KSxuLmRpc3RiaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixuLm1vZGU9MzA7YnJlYWt9aWYobi5tb2RlPTIwLDY9PT10KWJyZWFrIGU7Y2FzZSAyMDpuLm1vZGU9MjE7Y2FzZSAyMTppZig2PD1zJiYyNTg8PWMpe2UubmV4dF9vdXQ9YSxlLmF2YWlsX291dD1jLGUubmV4dF9pbj1vLGUuYXZhaWxfaW49cyxuLmhvbGQ9dSxuLmJpdHM9bCxMZihlLGYpLGE9ZS5uZXh0X291dCxpPWUub3V0cHV0LGM9ZS5hdmFpbF9vdXQsbz1lLm5leHRfaW4scj1lLmlucHV0LHM9ZS5hdmFpbF9pbix1PW4uaG9sZCxsPW4uYml0cywxMj09PW4ubW9kZSYmKG4uYmFjaz0tMSk7YnJlYWt9Zm9yKG4uYmFjaz0wO209KFQ9bi5sZW5jb2RlW3UmKDE8PG4ubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobSYmMD09KDI0MCZtKSl7Zm9yKF89ZyxiPW0sdz15O209KFQ9bi5sZW5jb2RlW3crKCh1JigxPDxfK2IpLTEpPj5fKV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKF8rKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH11Pj4+PV8sbC09XyxuLmJhY2srPV99aWYodT4+Pj1nLGwtPWcsbi5iYWNrKz1nLG4ubGVuZ3RoPXksMD09PW0pe24ubW9kZT0yNjticmVha31pZigzMiZtKXtuLmJhY2s9LTEsbi5tb2RlPTEyO2JyZWFrfWlmKDY0Jm0pe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLG4ubW9kZT0zMDticmVha31uLmV4dHJhPTE1Jm0sbi5tb2RlPTIyO2Nhc2UgMjI6aWYobi5leHRyYSl7Zm9yKEM9bi5leHRyYTtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmxlbmd0aCs9dSYoMTw8bi5leHRyYSktMSx1Pj4+PW4uZXh0cmEsbC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9bi53YXM9bi5sZW5ndGgsbi5tb2RlPTIzO2Nhc2UgMjM6Zm9yKDttPShUPW4uZGlzdGNvZGVbdSYoMTw8bi5kaXN0Yml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYoMD09KDI0MCZtKSl7Zm9yKF89ZyxiPW0sdz15O209KFQ9bi5kaXN0Y29kZVt3KygodSYoMTw8XytiKS0xKT4+XyldKT4+PjE2JjI1NSx5PTY1NTM1JlQsIShfKyhnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9dT4+Pj1fLGwtPV8sbi5iYWNrKz1ffWlmKHU+Pj49ZyxsLT1nLG4uYmFjays9Zyw2NCZtKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixuLm1vZGU9MzA7YnJlYWt9bi5vZmZzZXQ9eSxuLmV4dHJhPTE1Jm0sbi5tb2RlPTI0O2Nhc2UgMjQ6aWYobi5leHRyYSl7Zm9yKEM9bi5leHRyYTtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLm9mZnNldCs9dSYoMTw8bi5leHRyYSktMSx1Pj4+PW4uZXh0cmEsbC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9aWYobi5vZmZzZXQ+bi5kbWF4KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVha31uLm1vZGU9MjU7Y2FzZSAyNTppZigwPT09YylicmVhayBlO2lmKHA9Zi1jLG4ub2Zmc2V0PnApe2lmKChwPW4ub2Zmc2V0LXApPm4ud2hhdmUmJm4uc2FuZSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9MzA7YnJlYWt9cD5uLnduZXh0PyhwLT1uLnduZXh0LGg9bi53c2l6ZS1wKTpoPW4ud25leHQtcCxwPm4ubGVuZ3RoJiYocD1uLmxlbmd0aCksdj1uLndpbmRvd31lbHNlIHY9aSxoPWEtbi5vZmZzZXQscD1uLmxlbmd0aDtmb3IoYzxwJiYocD1jKSxjLT1wLG4ubGVuZ3RoLT1wO2lbYSsrXT12W2grK10sLS1wOyk7MD09PW4ubGVuZ3RoJiYobi5tb2RlPTIxKTticmVhaztjYXNlIDI2OmlmKDA9PT1jKWJyZWFrIGU7aVthKytdPW4ubGVuZ3RoLGMtLSxuLm1vZGU9MjE7YnJlYWs7Y2FzZSAyNzppZihuLndyYXApe2Zvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHV8PXJbbysrXTw8bCxsKz04fWlmKGYtPWMsZS50b3RhbF9vdXQrPWYsbi50b3RhbCs9ZixmJiYoZS5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/JGQobi5jaGVjayxpLGYsYS1mKTpFZChuLmNoZWNrLGksZixhLWYpKSxmPWMsKG4uZmxhZ3M/dTpYZih1KSkhPT1uLmNoZWNrKXtlLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLG4ubW9kZT0zMDticmVha31sPXU9MH1uLm1vZGU9Mjg7Y2FzZSAyODppZihuLndyYXAmJm4uZmxhZ3Mpe2Zvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKHUhPT0oNDI5NDk2NzI5NSZuLnRvdGFsKSl7ZS5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLG4ubW9kZT0zMDticmVha31sPXU9MH1uLm1vZGU9Mjk7Y2FzZSAyOTpTPTE7YnJlYWsgZTtjYXNlIDMwOlM9LTM7YnJlYWsgZTtjYXNlIDMxOnJldHVybi00O2Nhc2UgMzI6ZGVmYXVsdDpyZXR1cm4gcWZ9cmV0dXJuIGUubmV4dF9vdXQ9YSxlLmF2YWlsX291dD1jLGUubmV4dF9pbj1vLGUuYXZhaWxfaW49cyxuLmhvbGQ9dSxuLmJpdHM9bCwobi53c2l6ZXx8ZiE9PWUuYXZhaWxfb3V0JiZuLm1vZGU8MzAmJihuLm1vZGU8Mjd8fDQhPT10KSkmJmlwKGUsZS5vdXRwdXQsZS5uZXh0X291dCxmLWUuYXZhaWxfb3V0KSxkLT1lLmF2YWlsX2luLGYtPWUuYXZhaWxfb3V0LGUudG90YWxfaW4rPWQsZS50b3RhbF9vdXQrPWYsbi50b3RhbCs9ZixuLndyYXAmJmYmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz8kZChuLmNoZWNrLGksZixlLm5leHRfb3V0LWYpOkVkKG4uY2hlY2ssaSxmLGUubmV4dF9vdXQtZikpLGUuZGF0YV90eXBlPW4uYml0cysobi5sYXN0PzY0OjApKygxMj09PW4ubW9kZT8xMjg6MCkrKDIwPT09bi5tb2RlfHwxNT09PW4ubW9kZT8yNTY6MCksKDA9PT1kJiYwPT09Znx8ND09PXQpJiZTPT09VmYmJihTPS01KSxTfSxpbmZsYXRlRW5kOmZ1bmN0aW9uKGUpe2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gcWY7dmFyIHQ9ZS5zdGF0ZTtyZXR1cm4gdC53aW5kb3cmJih0LndpbmRvdz1udWxsKSxlLnN0YXRlPW51bGwsVmZ9LGluZmxhdGVHZXRIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gZSYmZS5zdGF0ZT8wPT0oMiYobj1lLnN0YXRlKS53cmFwKT9xZjooKG4uaGVhZD10KS5kb25lPSExLFZmKTpxZn0saW5mbGF0ZVNldERpY3Rpb25hcnk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXQubGVuZ3RoO3JldHVybiBlJiZlLnN0YXRlPzAhPT0obj1lLnN0YXRlKS53cmFwJiYxMSE9PW4ubW9kZT9xZjoxMT09PW4ubW9kZSYmRWQoMSx0LHIsMCkhPT1uLmNoZWNrPy0zOmlwKGUsdCxyLHIpPyhuLm1vZGU9MzEsLTQpOihuLmhhdmVkaWN0PTEsVmYpOnFmfSxpbmZsYXRlSW5mbzoicGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LGFwPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9O3ZhciBzcD1mdW5jdGlvbigpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfSxjcD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIHVwKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHVwKSlyZXR1cm4gbmV3IHVwKGUpO3RoaXMub3B0aW9ucz1QbC5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJjA8PXQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHMsMD09PXQud2luZG93Qml0cyYmKHQud2luZG93Qml0cz0tMTUpKSwhKDA8PXQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2KXx8ZSYmZS53aW5kb3dCaXRzfHwodC53aW5kb3dCaXRzKz0zMiksMTU8dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8NDgmJjA9PSgxNSZ0LndpbmRvd0JpdHMpJiYodC53aW5kb3dCaXRzfD0xNSksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgVGYsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPW9wLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sdC53aW5kb3dCaXRzKTtpZihuIT09YXAuWl9PSyl0aHJvdyBuZXcgRXJyb3IoUGRbbl0pO2lmKHRoaXMuaGVhZGVyPW5ldyBzcCxvcC5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSx0aGlzLmhlYWRlciksdC5kaWN0aW9uYXJ5JiYoInN0cmluZyI9PXR5cGVvZiB0LmRpY3Rpb25hcnk/dC5kaWN0aW9uYXJ5PUNmLnN0cmluZzJidWYodC5kaWN0aW9uYXJ5KToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09Y3AuY2FsbCh0LmRpY3Rpb25hcnkpJiYodC5kaWN0aW9uYXJ5PW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSkpLHQucmF3JiYobj1vcC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdC5kaWN0aW9uYXJ5KSkhPT1hcC5aX09LKSl0aHJvdyBuZXcgRXJyb3IoUGRbbl0pfWZ1bmN0aW9uIGxwKGUsdCl7dmFyIG49bmV3IHVwKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8UGRbbi5lcnJdO3JldHVybiBuLnJlc3VsdH11cC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz10aGlzLnN0cm0sYz10aGlzLm9wdGlvbnMuY2h1bmtTaXplLHU9dGhpcy5vcHRpb25zLmRpY3Rpb25hcnksbD0hMTtpZih0aGlzLmVuZGVkKXJldHVybiExO3I9dD09PX5+dD90OiEwPT09dD9hcC5aX0ZJTklTSDphcC5aX05PX0ZMVVNILCJzdHJpbmciPT10eXBlb2YgZT9zLmlucHV0PUNmLmJpbnN0cmluZzJidWYoZSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PWNwLmNhbGwoZSk/cy5pbnB1dD1uZXcgVWludDhBcnJheShlKTpzLmlucHV0PWUscy5uZXh0X2luPTAscy5hdmFpbF9pbj1zLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09cy5hdmFpbF9vdXQmJihzLm91dHB1dD1uZXcgUGwuQnVmOChjKSxzLm5leHRfb3V0PTAscy5hdmFpbF9vdXQ9YyksKG49b3AuaW5mbGF0ZShzLGFwLlpfTk9fRkxVU0gpKT09PWFwLlpfTkVFRF9ESUNUJiZ1JiYobj1vcC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdSkpLG49PT1hcC5aX0JVRl9FUlJPUiYmITA9PT1sJiYobj1hcC5aX09LLGw9ITEpLG4hPT1hcC5aX1NUUkVBTV9FTkQmJm4hPT1hcC5aX09LKXJldHVybiB0aGlzLm9uRW5kKG4pLCEodGhpcy5lbmRlZD0hMCk7cy5uZXh0X291dCYmKDAhPT1zLmF2YWlsX291dCYmbiE9PWFwLlpfU1RSRUFNX0VORCYmKDAhPT1zLmF2YWlsX2lufHxyIT09YXAuWl9GSU5JU0gmJnIhPT1hcC5aX1NZTkNfRkxVU0gpfHwoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/KGk9Q2YudXRmOGJvcmRlcihzLm91dHB1dCxzLm5leHRfb3V0KSxvPXMubmV4dF9vdXQtaSxhPUNmLmJ1ZjJzdHJpbmcocy5vdXRwdXQsaSkscy5uZXh0X291dD1vLHMuYXZhaWxfb3V0PWMtbyxvJiZQbC5hcnJheVNldChzLm91dHB1dCxzLm91dHB1dCxpLG8sMCksdGhpcy5vbkRhdGEoYSkpOnRoaXMub25EYXRhKFBsLnNocmlua0J1ZihzLm91dHB1dCxzLm5leHRfb3V0KSkpKSwwPT09cy5hdmFpbF9pbiYmMD09PXMuYXZhaWxfb3V0JiYobD0hMCl9d2hpbGUoKDA8cy5hdmFpbF9pbnx8MD09PXMuYXZhaWxfb3V0KSYmbiE9PWFwLlpfU1RSRUFNX0VORCk7cmV0dXJuIG49PT1hcC5aX1NUUkVBTV9FTkQmJihyPWFwLlpfRklOSVNIKSxyPT09YXAuWl9GSU5JU0g/KG49b3AuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQobiksdGhpcy5lbmRlZD0hMCxuPT09YXAuWl9PSyk6ciE9PWFwLlpfU1lOQ19GTFVTSHx8KHRoaXMub25FbmQoYXAuWl9PSyksIShzLmF2YWlsX291dD0wKSl9LHVwLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0sdXAucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1hcC5aX09LJiYoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9UGwuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307dmFyIGRwPXtJbmZsYXRlOnVwLGluZmxhdGU6bHAsaW5mbGF0ZVJhdzpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAsbHAoZSx0KX0sdW5nemlwOmxwfSxmcD17fTsoMCxQbC5hc3NpZ24pKGZwLGpmLGRwLGFwKTt2YXIgcHA9ZnAsaHA9WXUoImNhbnZhc0V2ZW50Iik7ZnVuY3Rpb24gdnAoZSx0LG4scil7YWcucHVibGlzaEhhbmRsZXIodCsiLWNhbnZhcy0iK2Use2NhbnZhc0lkOmUsdHlwZTpuLGRhdGE6cn0sdCl9YWcuc3Vic2NyaWJlKCJvbkNhbnZhc01ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGEscj1ocC5wb3AodCk7ciYmcihuKX0pO3ZhciBncD17YWxpY2VibHVlOiIjZjBmOGZmIixhbnRpcXVld2hpdGU6IiNmYWViZDciLGFxdWE6IiMwMGZmZmYiLGFxdWFtYXJpbmU6IiM3ZmZmZDQiLGF6dXJlOiIjZjBmZmZmIixiZWlnZToiI2Y1ZjVkYyIsYmlzcXVlOiIjZmZlNGM0IixibGFjazoiIzAwMDAwMCIsYmxhbmNoZWRhbG1vbmQ6IiNmZmViY2QiLGJsdWU6IiMwMDAwZmYiLGJsdWV2aW9sZXQ6IiM4YTJiZTIiLGJyb3duOiIjYTUyYTJhIixidXJseXdvb2Q6IiNkZWI4ODciLGNhZGV0Ymx1ZToiIzVmOWVhMCIsY2hhcnRyZXVzZToiIzdmZmYwMCIsY2hvY29sYXRlOiIjZDI2OTFlIixjb3JhbDoiI2ZmN2Y1MCIsY29ybmZsb3dlcmJsdWU6IiM2NDk1ZWQiLGNvcm5zaWxrOiIjZmZmOGRjIixjcmltc29uOiIjZGMxNDNjIixjeWFuOiIjMDBmZmZmIixkYXJrYmx1ZToiIzAwMDA4YiIsZGFya2N5YW46IiMwMDhiOGIiLGRhcmtnb2xkZW5yb2Q6IiNiODg2MGIiLGRhcmtncmF5OiIjYTlhOWE5IixkYXJrZ3JleToiI2E5YTlhOSIsZGFya2dyZWVuOiIjMDA2NDAwIixkYXJra2hha2k6IiNiZGI3NmIiLGRhcmttYWdlbnRhOiIjOGIwMDhiIixkYXJrb2xpdmVncmVlbjoiIzU1NmIyZiIsZGFya29yYW5nZToiI2ZmOGMwMCIsZGFya29yY2hpZDoiIzk5MzJjYyIsZGFya3JlZDoiIzhiMDAwMCIsZGFya3NhbG1vbjoiI2U5OTY3YSIsZGFya3NlYWdyZWVuOiIjOGZiYzhmIixkYXJrc2xhdGVibHVlOiIjNDgzZDhiIixkYXJrc2xhdGVncmF5OiIjMmY0ZjRmIixkYXJrc2xhdGVncmV5OiIjMmY0ZjRmIixkYXJrdHVycXVvaXNlOiIjMDBjZWQxIixkYXJrdmlvbGV0OiIjOTQwMGQzIixkZWVwcGluazoiI2ZmMTQ5MyIsZGVlcHNreWJsdWU6IiMwMGJmZmYiLGRpbWdyYXk6IiM2OTY5NjkiLGRpbWdyZXk6IiM2OTY5NjkiLGRvZGdlcmJsdWU6IiMxZTkwZmYiLGZpcmVicmljazoiI2IyMjIyMiIsZmxvcmFsd2hpdGU6IiNmZmZhZjAiLGZvcmVzdGdyZWVuOiIjMjI4YjIyIixmdWNoc2lhOiIjZmYwMGZmIixnYWluc2Jvcm86IiNkY2RjZGMiLGdob3N0d2hpdGU6IiNmOGY4ZmYiLGdvbGQ6IiNmZmQ3MDAiLGdvbGRlbnJvZDoiI2RhYTUyMCIsZ3JheToiIzgwODA4MCIsZ3JleToiIzgwODA4MCIsZ3JlZW46IiMwMDgwMDAiLGdyZWVueWVsbG93OiIjYWRmZjJmIixob25leWRldzoiI2YwZmZmMCIsaG90cGluazoiI2ZmNjliNCIsaW5kaWFucmVkOiIjY2Q1YzVjIixpbmRpZ286IiM0YjAwODIiLGl2b3J5OiIjZmZmZmYwIixraGFraToiI2YwZTY4YyIsbGF2ZW5kZXI6IiNlNmU2ZmEiLGxhdmVuZGVyYmx1c2g6IiNmZmYwZjUiLGxhd25ncmVlbjoiIzdjZmMwMCIsbGVtb25jaGlmZm9uOiIjZmZmYWNkIixsaWdodGJsdWU6IiNhZGQ4ZTYiLGxpZ2h0Y29yYWw6IiNmMDgwODAiLGxpZ2h0Y3lhbjoiI2UwZmZmZiIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IiNmYWZhZDIiLGxpZ2h0Z3JheToiI2QzZDNkMyIsbGlnaHRncmV5OiIjZDNkM2QzIixsaWdodGdyZWVuOiIjOTBlZTkwIixsaWdodHBpbms6IiNmZmI2YzEiLGxpZ2h0c2FsbW9uOiIjZmZhMDdhIixsaWdodHNlYWdyZWVuOiIjMjBiMmFhIixsaWdodHNreWJsdWU6IiM4N2NlZmEiLGxpZ2h0c2xhdGVncmF5OiIjNzc4ODk5IixsaWdodHNsYXRlZ3JleToiIzc3ODg5OSIsbGlnaHRzdGVlbGJsdWU6IiNiMGM0ZGUiLGxpZ2h0eWVsbG93OiIjZmZmZmUwIixsaW1lOiIjMDBmZjAwIixsaW1lZ3JlZW46IiMzMmNkMzIiLGxpbmVuOiIjZmFmMGU2IixtYWdlbnRhOiIjZmYwMGZmIixtYXJvb246IiM4MDAwMDAiLG1lZGl1bWFxdWFtYXJpbmU6IiM2NmNkYWEiLG1lZGl1bWJsdWU6IiMwMDAwY2QiLG1lZGl1bW9yY2hpZDoiI2JhNTVkMyIsbWVkaXVtcHVycGxlOiIjOTM3MGRiIixtZWRpdW1zZWFncmVlbjoiIzNjYjM3MSIsbWVkaXVtc2xhdGVibHVlOiIjN2I2OGVlIixtZWRpdW1zcHJpbmdncmVlbjoiIzAwZmE5YSIsbWVkaXVtdHVycXVvaXNlOiIjNDhkMWNjIixtZWRpdW12aW9sZXRyZWQ6IiNjNzE1ODUiLG1pZG5pZ2h0Ymx1ZToiIzE5MTk3MCIsbWludGNyZWFtOiIjZjVmZmZhIixtaXN0eXJvc2U6IiNmZmU0ZTEiLG1vY2Nhc2luOiIjZmZlNGI1IixuYXZham93aGl0ZToiI2ZmZGVhZCIsbmF2eToiIzAwMDA4MCIsb2xkbGFjZToiI2ZkZjVlNiIsb2xpdmU6IiM4MDgwMDAiLG9saXZlZHJhYjoiIzZiOGUyMyIsb3JhbmdlOiIjZmZhNTAwIixvcmFuZ2VyZWQ6IiNmZjQ1MDAiLG9yY2hpZDoiI2RhNzBkNiIscGFsZWdvbGRlbnJvZDoiI2VlZThhYSIscGFsZWdyZWVuOiIjOThmYjk4IixwYWxldHVycXVvaXNlOiIjYWZlZWVlIixwYWxldmlvbGV0cmVkOiIjZGI3MDkzIixwYXBheWF3aGlwOiIjZmZlZmQ1IixwZWFjaHB1ZmY6IiNmZmRhYjkiLHBlcnU6IiNjZDg1M2YiLHBpbms6IiNmZmMwY2IiLHBsdW06IiNkZGEwZGQiLHBvd2RlcmJsdWU6IiNiMGUwZTYiLHB1cnBsZToiIzgwMDA4MCIscmViZWNjYXB1cnBsZToiIzY2MzM5OSIscmVkOiIjZmYwMDAwIixyb3N5YnJvd246IiNiYzhmOGYiLHJveWFsYmx1ZToiIzQxNjllMSIsc2FkZGxlYnJvd246IiM4YjQ1MTMiLHNhbG1vbjoiI2ZhODA3MiIsc2FuZHlicm93bjoiI2Y0YTQ2MCIsc2VhZ3JlZW46IiMyZThiNTciLHNlYXNoZWxsOiIjZmZmNWVlIixzaWVubmE6IiNhMDUyMmQiLHNpbHZlcjoiI2MwYzBjMCIsc2t5Ymx1ZToiIzg3Y2VlYiIsc2xhdGVibHVlOiIjNmE1YWNkIixzbGF0ZWdyYXk6IiM3MDgwOTAiLHNsYXRlZ3JleToiIzcwODA5MCIsc25vdzoiI2ZmZmFmYSIsc3ByaW5nZ3JlZW46IiMwMGZmN2YiLHN0ZWVsYmx1ZToiIzQ2ODJiNCIsdGFuOiIjZDJiNDhjIix0ZWFsOiIjMDA4MDgwIix0aGlzdGxlOiIjZDhiZmQ4Iix0b21hdG86IiNmZjYzNDciLHR1cnF1b2lzZToiIzQwZTBkMCIsdmlvbGV0OiIjZWU4MmVlIix3aGVhdDoiI2Y1ZGViMyIsd2hpdGU6IiNmZmZmZmYiLHdoaXRlc21va2U6IiNmNWY1ZjUiLHllbGxvdzoiI2ZmZmYwMCIseWVsbG93Z3JlZW46IiM5YWNkMzIiLHRyYW5zcGFyZW50OiIjMDAwMDAwMDAifTtmdW5jdGlvbiBtcChlKXt2YXIgdD1udWxsO2lmKG51bGwhPSh0PS9eIyhbMC05fEEtRnxhLWZdezZ9KSQvLmV4ZWMoZT1lfHwiIzAwMDAwMCIpKSlyZXR1cm5bcGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxwYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLHBhcnNlSW50KHRbMV0uc2xpY2UoNCksMTYpLDI1NV07aWYobnVsbCE9KHQ9L14jKFswLTl8QS1GfGEtZl17M30pJC8uZXhlYyhlKSkpe3ZhciBuPXRbMV0uc2xpY2UoMCwxKSxyPXRbMV0uc2xpY2UoMSwyKSxpPXRbMV0uc2xpY2UoMiwzKTtyZXR1cm5bbj1wYXJzZUludChuK24sMTYpLHI9cGFyc2VJbnQocityLDE2KSxpPXBhcnNlSW50KGkraSwxNiksMjU1XX1pZihudWxsIT0odD0vXnJnYlwoKC4rKVwpJC8uZXhlYyhlKSkpcmV0dXJuIHRbMV0uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWluKDI1NSxwYXJzZUludChlLnRyaW0oKSkpfSkuY29uY2F0KDI1NSk7aWYobnVsbCE9KHQ9L15yZ2JhXCgoLispXCkkLy5leGVjKGUpKSlyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiAzPT09dD9NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUudHJpbSgpKSk6TWF0aC5taW4oMjU1LHBhcnNlSW50KGUudHJpbSgpKSl9KTt2YXIgbz1lLnRvTG93ZXJDYXNlKCk7aWYoayhncCxvKSl7dD0vXiMoWzAtOXxBLUZ8YS1mXXs2LDh9KSQvLmV4ZWMoZ3Bbb10pO3ZhciBhPXBhcnNlSW50KHRbMV0uc2xpY2UoMCwyKSwxNikscz1wYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLGM9cGFyc2VJbnQodFsxXS5zbGljZSg0LDYpLDE2KSx1PXBhcnNlSW50KHRbMV0uc2xpY2UoNiw4KSwxNik7cmV0dXJuW2EscyxjLHU9MDw9dT91OjI1NV19cmV0dXJuIGNvbnNvbGUuZXJyb3IoInVuc3VwcG9ydGVkIGNvbG9yOiIrZSksWzAsMCwwLDI1NV19ZnVuY3Rpb24geXAoZSx0KXt0aGlzLnR5cGU9InBhdHRlcm4iLHRoaXMuZGF0YT1lLHRoaXMuY29sb3JTdG9wPXR9dmFyIF9wPWZ1bmN0aW9uKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXQsdGhpcy5jb2xvclN0b3A9W119O19wLnByb3RvdHlwZS5hZGRDb2xvclN0b3A9ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbG9yU3RvcC5wdXNoKFtlLG1wKHQpXSl9O2Z1bmN0aW9uIGJwKGUpe3RoaXMud2lkdGg9ZX12YXIgd3A9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlSWQ9dCx0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09W10sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMuZHJhd2luZ1N0YXRlPVtdLHRoaXMuc3RhdGU9e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX0sa3A9e2xpbmVEYXNoT2Zmc2V0Ontjb25maWd1cmFibGU6ITB9LGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfSxzaGFkb3dCbHVyOntjb25maWd1cmFibGU6ITB9LHNoYWRvd0NvbG9yOntjb25maWd1cmFibGU6ITB9LHNoYWRvd09mZnNldFg6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93T2Zmc2V0WTp7Y29uZmlndXJhYmxlOiEwfSxmb250Ontjb25maWd1cmFibGU6ITB9LGZpbGxTdHlsZTp7Y29uZmlndXJhYmxlOiEwfSxzdHJva2VTdHlsZTp7Y29uZmlndXJhYmxlOiEwfSxnbG9iYWxBbHBoYTp7Y29uZmlndXJhYmxlOiEwfSx0ZXh0QWxpZ246e2NvbmZpZ3VyYWJsZTohMH0sbGluZUNhcDp7Y29uZmlndXJhYmxlOiEwfSxsaW5lSm9pbjp7Y29uZmlndXJhYmxlOiEwfSxsaW5lV2lkdGg6e2NvbmZpZ3VyYWJsZTohMH0sbWl0ZXJMaW1pdDp7Y29uZmlndXJhYmxlOiEwfSx0ZXh0QmFzZWxpbmU6e2NvbmZpZ3VyYWJsZTohMH19O3dwLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciBuLHI9W10uY29uY2F0KHRoaXMuYWN0aW9ucyk7dGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSwiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49aHAucHVzaCh0KSksdnAodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWN0aW9uc0NoYW5nZWQiLHthY3Rpb25zOnIscmVzZXJ2ZTplLGNhbGxiYWNrSWQ6bn0pfSx3cC5wcm90b3R5cGUuY3JlYXRlTGluZWFyR3JhZGllbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5ldyBfcCgibGluZWFyIixbZSx0LG4scl0pfSx3cC5wcm90b3R5cGUuY3JlYXRlQ2lyY3VsYXJHcmFkaWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBfcCgicmFkaWFsIixbZSx0LG5dKX0sd3AucHJvdG90eXBlLmNyZWF0ZVBhdHRlcm49ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10KWNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IDIgYXJndW1lbnRzIHJlcXVpcmVkLCBidXQgb25seSAxIHByZXNlbnQuIik7ZWxzZXtpZighKFsicmVwZWF0IiwicmVwZWF0LXgiLCJyZXBlYXQteSIsIm5vLXJlcGVhdCJdLmluZGV4T2YodCk8MCkpcmV0dXJuIG5ldyB5cChlLHQpO2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IFRoZSBwcm92aWRlZCB0eXBlICgnIit0KyInKSBpcyBub3Qgb25lIG9mICdyZXBlYXQnLCAnbm8tcmVwZWF0JywgJ3JlcGVhdC14Jywgb3IgJ3JlcGVhdC15Jy4iKX19LHdwLnByb3RvdHlwZS5tZWFzdXJlVGV4dD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnN0YXRlLmZvbnQsbj0wLHI9b2cud2Vidmlldy5hbGwoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFVSTCgpLmVuZHNXaXRoKCJ3d3cvX191bmlhcHB2aWV3Lmh0bWwiKX0pO3JldHVybiByJiYobj1OdW1iZXIoci5ldmFsSlNTeW5jKCIoIitmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7cmV0dXJuIG4uZm9udD10LG4ubWVhc3VyZVRleHQoZSkud2lkdGh8fDB9LnRvU3RyaW5nKCkrIikoIitKU09OLnN0cmluZ2lmeShlKSsiLCIrSlNPTi5zdHJpbmdpZnkodCkrIikiKSkpLG5ldyBicChuKX0sd3AucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzYXZlIixkYXRhOltdfSksdGhpcy5kcmF3aW5nU3RhdGUucHVzaCh0aGlzLnN0YXRlKX0sd3AucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJyZXN0b3JlIixkYXRhOltdfSksdGhpcy5zdGF0ZT10aGlzLmRyYXdpbmdTdGF0ZS5wb3AoKXx8e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX0sd3AucHJvdG90eXBlLmJlZ2luUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmVnaW5QYXRoIixkYXRhOltdfSl9LHdwLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W2UsdF19KSx0aGlzLnN1YnBhdGg9W1tlLHRdXX0sd3AucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbihlLHQpezA9PT10aGlzLnBhdGgubGVuZ3RoJiYwPT09dGhpcy5zdWJwYXRoLmxlbmd0aD90aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W2UsdF19KTp0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJsaW5lVG8iLGRhdGE6W2UsdF19KSx0aGlzLnN1YnBhdGgucHVzaChbZSx0XSl9LHdwLnByb3RvdHlwZS5xdWFkcmF0aWNDdXJ2ZVRvPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InF1YWRyYXRpY0N1cnZlVG8iLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdWJwYXRoLnB1c2goW24scl0pfSx3cC5wcm90b3R5cGUuYmV6aWVyQ3VydmVUbz1mdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmV6aWVyQ3VydmVUbyIsZGF0YTpbZSx0LG4scixpLG9dfSksdGhpcy5zdWJwYXRoLnB1c2goW2ksb10pfSx3cC5wcm90b3R5cGUuYXJjPWZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2b2lkIDA9PT1vJiYobz0hMSksdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYXJjIixkYXRhOltlLHQsbixyLGksb119KSx0aGlzLnN1YnBhdGgucHVzaChbZSx0XSl9LHdwLnByb3RvdHlwZS5yZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdWJwYXRoPVtbZSx0XV19LHdwLnByb3RvdHlwZS5hcmNUbz1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyY1RvIixkYXRhOltlLHQsbixyLGldfSksdGhpcy5zdWJwYXRoLnB1c2goW24scl0pfSx3cC5wcm90b3R5cGUuY2xpcD1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImNsaXAiLGRhdGE6W10uY29uY2F0KHRoaXMucGF0aCl9KX0sd3AucHJvdG90eXBlLmNsb3NlUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImNsb3NlUGF0aCIsZGF0YTpbXX0pLHRoaXMuc3VicGF0aC5sZW5ndGgmJih0aGlzLnN1YnBhdGg9W3RoaXMuc3VicGF0aC5zaGlmdCgpXSl9LHdwLnByb3RvdHlwZS5jbGVhckFjdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXX0sd3AucHJvdG90eXBlLmdldEFjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgZT1bXS5jb25jYXQodGhpcy5hY3Rpb25zKTtyZXR1cm4gdGhpcy5jbGVhckFjdGlvbnMoKSxlfSxrcC5saW5lRGFzaE9mZnNldC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZURhc2hPZmZzZXQiLGRhdGE6W2VdfSl9LGtwLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbi5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIixkYXRhOltlXX0pfSxrcC5zaGFkb3dCbHVyLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dCbHVyIixkYXRhOltlXX0pfSxrcC5zaGFkb3dDb2xvci5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Q29sb3IiLGRhdGE6W2VdfSl9LGtwLnNoYWRvd09mZnNldFguc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFgiLGRhdGE6W2VdfSl9LGtwLnNoYWRvd09mZnNldFkuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFkiLGRhdGE6W2VdfSl9LGtwLmZvbnQuc2V0PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMsdD0odGhpcy5zdGF0ZS5mb250PWUpLm1hdGNoKC9eKChbXHdcLV0rXHMpKikoXGQrcj9weCkoXC8oXGQrXC4/XGQqKHI/cHgpPykpP1xzKyguKikvKTtpZih0KXt2YXIgcj10WzFdLnRyaW0oKS5zcGxpdCgvXHMvKSxpPXBhcnNlRmxvYXQodFszXSksbz10WzddLGE9W107ci5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7LTE8WyJpdGFsaWMiLCJvYmxpcXVlIiwibm9ybWFsIl0uaW5kZXhPZihlKT8oYS5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbZV19KSxuLnN0YXRlLmZvbnRTdHlsZT1lKTotMTxbImJvbGQiLCJub3JtYWwiXS5pbmRleE9mKGUpPyhhLnB1c2goe21ldGhvZDoic2V0Rm9udFdlaWdodCIsZGF0YTpbZV19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9ZSk6MD09PXQ/KGEucHVzaCh7bWV0aG9kOiJzZXRGb250U3R5bGUiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFN0eWxlPSJub3JtYWwiKToxPT09dCYmcygpfSksMT09PXIubGVuZ3RoJiZzKCkscj1hLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5kYXRhWzBdfSkuam9pbigiICIpLHRoaXMuc3RhdGUuZm9udFNpemU9aSx0aGlzLnN0YXRlLmZvbnRGYW1pbHk9byx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRGb250IixkYXRhOltyKyIgIitpKyJweCAiK29dfSl9ZWxzZSBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBzZXQgJ2ZvbnQnIG9uICdDYW52YXNDb250ZXh0JzogaW52YWxpZCBmb3JtYXQuIik7ZnVuY3Rpb24gcygpe2EucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOlsibm9ybWFsIl19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9Im5vcm1hbCJ9fSxrcC5mb250LmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlLmZvbnR9LGtwLmZpbGxTdHlsZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRGaWxsU3R5bGUoZSl9LGtwLnN0cm9rZVN0eWxlLnNldD1mdW5jdGlvbihlKXt0aGlzLnNldFN0cm9rZVN0eWxlKGUpfSxrcC5nbG9iYWxBbHBoYS5zZXQ9ZnVuY3Rpb24oZSl7ZT1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxBbHBoYSIsZGF0YTpbZV19KX0sa3AudGV4dEFsaWduLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QWxpZ24iLGRhdGE6W2VdfSl9LGtwLmxpbmVDYXAuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVDYXAiLGRhdGE6W2VdfSl9LGtwLmxpbmVKb2luLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lSm9pbiIsZGF0YTpbZV19KX0sa3AubGluZVdpZHRoLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lV2lkdGgiLGRhdGE6W2VdfSl9LGtwLm1pdGVyTGltaXQuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldE1pdGVyTGltaXQiLGRhdGE6W2VdfSl9LGtwLnRleHRCYXNlbGluZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0VGV4dEJhc2VsaW5lIixkYXRhOltlXX0pfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3cC5wcm90b3R5cGUsa3ApLFsic2NhbGUiLCJyb3RhdGUiLCJ0cmFuc2xhdGUiLCJzZXRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXS5jb25jYXQoWyJkcmF3SW1hZ2UiLCJmaWxsVGV4dCIsImZpbGwiLCJzdHJva2UiLCJmaWxsUmVjdCIsInN0cm9rZVJlY3QiLCJjbGVhclJlY3QiLCJzdHJva2VUZXh0Il0pLmZvckVhY2goZnVuY3Rpb24oZSl7d3AucHJvdG90eXBlW2VdPWZ1bmN0aW9uKGQpe3N3aXRjaChkKXtjYXNlImZpbGwiOmNhc2Uic3Ryb2tlIjpyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmQrIlBhdGgiLGRhdGE6W10uY29uY2F0KHRoaXMucGF0aCl9KX07Y2FzZSJmaWxsUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImZpbGxQYXRoIixkYXRhOlt7bWV0aG9kOiJyZWN0IixkYXRhOltlLHQsbixyXX1dfSl9O2Nhc2Uic3Ryb2tlUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InN0cm9rZVBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfV19KX07Y2FzZSJmaWxsVGV4dCI6Y2FzZSJzdHJva2VUZXh0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9W2UudG9TdHJpbmcoKSx0LG5dOyJudW1iZXIiPT10eXBlb2YgciYmaS5wdXNoKHIpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCxkYXRhOml9KX07Y2FzZSJkcmF3SW1hZ2UiOnJldHVybiBmdW5jdGlvbihlLHQsbixyLGksbyxhLHMsYyl7dmFyIHU7ZnVuY3Rpb24gbChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9dm9pZCAwPT09YyYmKG89dCxhPW4scz1yLGM9aSxpPXI9bj10PXZvaWQgMCksdT1sKHQpJiZsKG4pJiZsKHIpJiZsKGkpP1tlLG8sYSxzLGMsdCxuLHIsaV06bChzKSYmbChjKT9bZSxvLGEscyxjXTpbZSxvLGFdLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCxkYXRhOnV9KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6ZX0pfX19KGUpfSksWyJzZXRGaWxsU3R5bGUiLCJzZXRUZXh0QWxpZ24iLCJzZXRTdHJva2VTdHlsZSIsInNldEdsb2JhbEFscGhhIiwic2V0U2hhZG93Iiwic2V0Rm9udFNpemUiLCJzZXRMaW5lQ2FwIiwic2V0TGluZUpvaW4iLCJzZXRMaW5lV2lkdGgiLCJzZXRNaXRlckxpbWl0Iiwic2V0VGV4dEJhc2VsaW5lIiwic2V0TGluZURhc2giXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3dwLnByb3RvdHlwZVtlXT1mdW5jdGlvbihpKXtzd2l0Y2goaSl7Y2FzZSJzZXRGaWxsU3R5bGUiOmNhc2Uic2V0U3Ryb2tlU3R5bGUiOnJldHVybiBmdW5jdGlvbihlKXsib2JqZWN0IiE9dHlwZW9mIGU/dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6WyJub3JtYWwiLG1wKGUpXX0pOnRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlLnR5cGUsZS5kYXRhLGUuY29sb3JTdG9wXX0pfTtjYXNlInNldEdsb2JhbEFscGhhIjpyZXR1cm4gZnVuY3Rpb24oZSl7ZT1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZV19KX07Y2FzZSJzZXRTaGFkb3ciOnJldHVybiBmdW5jdGlvbihlLHQsbixyKXtyPW1wKHIpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlLHQsbixyXX0pLHRoaXMuc3RhdGUuc2hhZG93Qmx1cj1uLHRoaXMuc3RhdGUuc2hhZG93Q29sb3I9cix0aGlzLnN0YXRlLnNoYWRvd09mZnNldFg9ZSx0aGlzLnN0YXRlLnNoYWRvd09mZnNldFk9dH07Y2FzZSJzZXRMaW5lRGFzaCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZT1lfHxbMCwwXSx0PXR8fDAsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UsdF19KSx0aGlzLnN0YXRlLmxpbmVEYXNoPWV9O2Nhc2Uic2V0Rm9udFNpemUiOnJldHVybiBmdW5jdGlvbihlKXt0aGlzLnN0YXRlLmZvbnQ9dGhpcy5zdGF0ZS5mb250LnJlcGxhY2UoL1xkK1wuP1xkKnB4LyxlKyJweCIpLHRoaXMuc3RhdGUuZm9udFNpemU9ZSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZV19KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6ZX0pfX19KGUpfSk7dmFyIFNwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLENhbnZhc0NvbnRleHQ6d3AsY3JlYXRlQ2FudmFzQ29udGV4dDpmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIG5ldyB3cChlLHQuJHBhZ2UuaWQpO3ZhciBuPXhsKCk7aWYobilyZXR1cm4gbmV3IHdwKGUsbik7YWcuZW1pdCgib25FcnJvciIsImNyZWF0ZUNhbnZhc0NvbnRleHQ6ZmFpbCIpfSxjYW52YXNHZXRJbWFnZURhdGE6ZnVuY3Rpb24oZSxuKXt2YXIgdD1lLmNhbnZhc0lkLHI9ZS54LGk9ZS55LG89ZS53aWR0aCxhPWUuaGVpZ2h0LHM9eGwoKTtzP3ZwKHQscywiZ2V0SW1hZ2VEYXRhIix7eDpyLHk6aSx3aWR0aDpvLGhlaWdodDphLGNhbGxiYWNrSWQ6aHAucHVzaChmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dCYmdC5sZW5ndGgmJihlLmNvbXByZXNzZWQmJih0PXBwLmluZmxhdGVSYXcodCksZGVsZXRlIGUuY29tcHJlc3NlZCksZS5kYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KSksZmkobixlKX0pfSk6Zmkobix7ZXJyTXNnOiJjYW52YXNHZXRJbWFnZURhdGE6ZmFpbCJ9KX0sY2FudmFzUHV0SW1hZ2VEYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYW52YXNJZCxyPWUuZGF0YSxpPWUueCxvPWUueSxhPWUud2lkdGgscz1lLmhlaWdodCxjPXhsKCk7aWYoYyl7dmFyIHUsbD1ocC5wdXNoKGZ1bmN0aW9uKGUpe2ZpKHQsZSl9KTsiaU9TIiE9PW9nLm9zLm5hbWV8fCJib29sZWFuIj09dHlwZW9mIF9fV0VFWF9ERVZUT09MX18/KHI9cHAuZGVmbGF0ZVJhdyhyLHt0bzoic3RyaW5nIn0pLHU9ITApOnI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwociksdnAobixjLCJwdXRJbWFnZURhdGEiLHtkYXRhOnIseDppLHk6byx3aWR0aDphLGhlaWdodDpzLGNvbXByZXNzZWQ6dSxjYWxsYmFja0lkOmx9KX1lbHNlIGZpKHQse2Vyck1zZzoiY2FudmFzUHV0SW1hZ2VEYXRhOmZhaWwifSl9LGNhbnZhc1RvVGVtcEZpbGVQYXRoOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS54O3ZvaWQgMD09PW4mJihuPTApO3ZhciByPWUueTt2b2lkIDA9PT1yJiYocj0wKTt2YXIgaT1lLndpZHRoLG89ZS5oZWlnaHQsYT1lLmRlc3RXaWR0aCxzPWUuZGVzdEhlaWdodCxjPWUuY2FudmFzSWQsdT1lLmZpbGVUeXBlLGw9ZS5xdWFsaXR5LGQ9eGwoKTtpZihkKXt2YXIgZj1ocC5wdXNoKGZ1bmN0aW9uKGUpe2ZpKHQsZSl9KTt2cChjLGQsInRvVGVtcEZpbGVQYXRoIix7eDpuLHk6cix3aWR0aDppLGhlaWdodDpvLGRlc3RXaWR0aDphLGRlc3RIZWlnaHQ6cyxmaWxlVHlwZTp1LHF1YWxpdHk6bCxkaXJuYW1lOnlvKyIvY2FudmFzIixjYWxsYmFja0lkOmZ9KX1lbHNlIGZpKHQse2Vyck1zZzoiY2FudmFzVG9UZW1wRmlsZVBhdGg6ZmFpbCJ9KX19KTtmdW5jdGlvbiB4cChlLHQsbixyKXt3bCgib3BlcmF0ZU1hcFBsYXllciIsZSx0LG4scil9YWcuc3Vic2NyaWJlKCJvbk1hcE1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7TS5pbnZva2UodCxuKX0pO3ZhciBDcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VWbT10fTtDcC5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0KXt4cCh0aGlzLmlkLHRoaXMucGFnZVZtLCJvbiIse25hbWU6ZSxjYWxsYmFjazp0fSl9LENwLnByb3RvdHlwZS4kZ2V0QXBwTWFwPWZ1bmN0aW9uKCl7cmV0dXJuIG9nLm1hcHMuZ2V0TWFwQnlJZCh0aGlzLnBhZ2VWbS4kcGFnZS5pZCsiLW1hcC0iK3RoaXMuaWQpfSxbImdldENlbnRlckxvY2F0aW9uIiwibW92ZVRvTG9jYXRpb24iLCJnZXRTY2FsZSIsImdldFJlZ2lvbiIsImluY2x1ZGVQb2ludHMiLCJ0cmFuc2xhdGVNYXJrZXIiLCJhZGRDdXN0b21MYXllciIsInJlbW92ZUN1c3RvbUxheWVyIiwiYWRkR3JvdW5kT3ZlcmxheSIsInJlbW92ZUdyb3VuZE92ZXJsYXkiLCJ1cGRhdGVHcm91bmRPdmVybGF5IiwiaW5pdE1hcmtlckNsdXN0ZXIiLCJhZGRNYXJrZXJzIiwicmVtb3ZlTWFya2VycyIsIm1vdmVBbG9uZyIsInNldExvY01hcmtlckljb24iLCJvcGVuTWFwQXBwIl0uZm9yRWFjaChmdW5jdGlvbihuKXtDcC5wcm90b3R5cGVbbl09TS53YXJwKGZ1bmN0aW9uKGUsdCl7ZS5jYWxsYmFja0lkPXQseHAodGhpcy5pZCx0aGlzLnBhZ2VWbSxuLGUpfSl9KTt2YXIgVHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsTWFwQ29udGV4dDpDcCxjcmVhdGVNYXBDb250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBDcChlLHR8fFNsKCJjcmVhdGVNYXBDb250ZXh0IikpfX0pLE9wPVsuNSwuOCwxLDEuMjUsMS41LDJdO2Z1bmN0aW9uIEVwKGUsdCxuLHIpe3dsKCJvcGVyYXRlVmlkZW9QbGF5ZXIiLGUsdCxuLHIpfXZhciBJcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VWbT10fTtJcC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe0VwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInBsYXkiKX0sSXAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7RXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicGF1c2UiKX0sSXAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtFcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJzdG9wIil9LElwLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe0VwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNlZWsiLHtwb3NpdGlvbjplfSl9LElwLnByb3RvdHlwZS5zZW5kRGFubXU9ZnVuY3Rpb24oZSl7RXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwic2VuZERhbm11IixlKX0sSXAucHJvdG90eXBlLnBsYXliYWNrUmF0ZT1mdW5jdGlvbihlKXt+T3AuaW5kZXhPZihlKXx8KGU9MSksRXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicGxheWJhY2tSYXRlIix7cmF0ZTplfSl9LElwLnByb3RvdHlwZS5yZXF1ZXN0RnVsbFNjcmVlbj1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksRXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicmVxdWVzdEZ1bGxTY3JlZW4iLGUpfSxJcC5wcm90b3R5cGUuZXhpdEZ1bGxTY3JlZW49ZnVuY3Rpb24oKXtFcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJleGl0RnVsbFNjcmVlbiIpfSxJcC5wcm90b3R5cGUuc2hvd1N0YXR1c0Jhcj1mdW5jdGlvbigpe0VwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNob3dTdGF0dXNCYXIiKX0sSXAucHJvdG90eXBlLmhpZGVTdGF0dXNCYXI9ZnVuY3Rpb24oKXtFcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJoaWRlU3RhdHVzQmFyIil9O3ZhciBBcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxWaWRlb0NvbnRleHQ6SXAsY3JlYXRlVmlkZW9Db250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBJcChlLHR8fFNsKCJjcmVhdGVWaWRlb0NvbnRleHQiKSl9fSk7ZnVuY3Rpb24gJHAoZSx0LG4scil7YWcucHVibGlzaEhhbmRsZXIodCsiLWVkaXRvci0iK2Use2NvbXBvbmVudElkOmUsdHlwZTpuLGRhdGE6cn0sdCl9YWcuc3Vic2NyaWJlKCJvbkVkaXRvck1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7TS5pbnZva2UodCxuKX0pO3ZhciBQcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10fTtQcC5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKGUsdCl7JHAodGhpcy5pZCx0aGlzLnBhZ2VJZCwiZm9ybWF0Iix7b3B0aW9uczp7bmFtZTplLHZhbHVlOnR9fSl9LFsiaW5zZXJ0RGl2aWRlciIsImluc2VydEltYWdlIiwiaW5zZXJ0VGV4dCIsInNldENvbnRlbnRzIiwiZ2V0Q29udGVudHMiLCJjbGVhciIsInJlbW92ZUZvcm1hdCIsInVuZG8iLCJyZWRvIiwiYmx1ciIsImdldFNlbGVjdGlvblRleHQiLCJzY3JvbGxJbnRvVmlldyJdLmZvckVhY2goZnVuY3Rpb24obil7UHAucHJvdG90eXBlW25dPU0ud2FycChmdW5jdGlvbihlLHQpeyRwKHRoaXMuaWQsdGhpcy5wYWdlSWQsbix7b3B0aW9uczplLGNhbGxiYWNrSWQ6dH0pfSl9KTt2YXIgTXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsRWRpdG9yQ29udGV4dDpQcH0pLGpwPVsiY2FucGxheSIsInBsYXkiLCJwYXVzZSIsInN0b3AiLCJlbmRlZCIsInRpbWVVcGRhdGUiLCJlcnJvciIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIl0sTHA9W3tuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJhdXRvcGxheSIsZGVmYXVsdDohMSxjYWNoZTohMH0se25hbWU6Imxvb3AiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJvYmV5TXV0ZVN3aXRjaCIsZGVmYXVsdDohMCxyZWFkb25seTohMCxjYWNoZTohMH0se25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ2b2x1bWUifSx7bmFtZToic2Vzc2lvbkNhdGVnb3J5In0se25hbWU6InBsYXliYWNrUmF0ZSIsY2FjaGU6ITB9XSxCcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuaWQ9ZSx0aGlzLl9jYWxsYmFja3M9e30sdGhpcy5fb3B0aW9ucz17fSxqcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuX2NhbGxiYWNrc1tlLnRvTG93ZXJDYXNlKCldPVtdfSksTHAuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj1uLm5hbWUsZT17Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9bi5jYWNoZT90aGlzLl9vcHRpb25zOndsKCJnZXRBdWRpb1N0YXRlIix7YXVkaW9JZDp0aGlzLmlkfSksdD1yIGluIGU/ZVtyXTpuLmRlZmF1bHQ7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiYidm9sdW1lIiE9PXI/dC8xZTM6dH19O24ucmVhZG9ubHl8fChlLnNldD1mdW5jdGlvbihlKXt0aGlzLl9vcHRpb25zW3JdPWUsd2woInNldEF1ZGlvU3RhdGUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSkpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixlKX0pfTtmdW5jdGlvbiBOcChlLHQsbixyKXtlLl9jYWxsYmFja3NbdF0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgiZXJyb3IiPT09dD97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX1CcC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInBsYXkiKX0sQnAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgicGF1c2UiKX0sQnAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJzdG9wIil9LEJwLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZToxZTMqZX0pfSxCcC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2xnKHRoaXMuX190aW1pbmcpLHdsKCJkZXN0cm95QXVkaW9JbnN0YW5jZSIse2F1ZGlvSWQ6dGhpcy5pZH0pLGRlbGV0ZSBEcFt0aGlzLmlkXX0sQnAucHJvdG90eXBlLl9vcGVyYXRlPWZ1bmN0aW9uKGUsdCl7d2woIm9wZXJhdGVBdWRpbyIsT2JqZWN0LmFzc2lnbih7fSx0LHthdWRpb0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZTplfSkpfSxqcC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBlPXJbMF0udG9VcHBlckNhc2UoKStyLnN1YnN0cigxKTtyPXIudG9Mb3dlckNhc2UoKSxCcC5wcm90b3R5cGVbIm9uIitlXT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Nbcl0ucHVzaChlKX0sQnAucHJvdG90eXBlWyJvZmYiK2VdPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrc1tyXSxuPXQuaW5kZXhPZihlKTswPD1uJiZ0LnNwbGljZShuLDEpfX0pLGtsKCJvbkF1ZGlvU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdGUsbj1lLmF1ZGlvSWQscj1lLmVyck1zZyxpPWUuZXJyQ29kZSxvPURwW25dO2lmKG8paWYoTnAobyx0LHIsaSksInBsYXkiPT09dCl7dmFyIGE9by5jdXJyZW50VGltZTtOcChvLCJ0aW1ldXBkYXRlIiksby5fX3RpbWluZz11ZyhmdW5jdGlvbigpe28uY3VycmVudFRpbWUhPT1hJiZOcChvLCJ0aW1ldXBkYXRlIil9LDIwMCl9ZWxzZSJwYXVzZSIhPT10JiYic3RvcCIhPT10JiYiZXJyb3IiIT09dHx8bGcoby5fX3RpbWluZyl9KTt2YXIgRHA9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgUnA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6ZnVuY3Rpb24oKXt2YXIgZT13bCgiY3JlYXRlQXVkaW9JbnN0YW5jZSIpLmF1ZGlvSWQsdD1uZXcgQnAoZSk7cmV0dXJuIERwW2VdPXR9fSksRnA9W107a2woIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIsZnVuY3Rpb24odCl7RnAuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQpfSl9KTt2YXIgVXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25OZXR3b3JrU3RhdHVzQ2hhbmdlOmZ1bmN0aW9uKGUpe0ZwLnB1c2goZSl9LG9mZk5ldHdvcmtTdGF0dXNDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9RnAuaW5kZXhPZihlKTswPD10JiZGcC5zcGxpY2UodCwxKX19fSksenA9W10sVnA9W107a2wobnQsZnVuY3Rpb24odCl7enAuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQpfSl9KSxrbCgib25VSVN0eWxlQ2hhbmdlIixmdW5jdGlvbih0KXtWcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdCl9KX0pO3ZhciBxcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvblRoZW1lQ2hhbmdlOmZ1bmN0aW9uKGUpe3pwLnB1c2goZSl9LG9mZlRoZW1lQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXpwLmluZGV4T2YoZSk7MDw9dCYmenAuc3BsaWNlKHQsMSl9fSxvblVJU3R5bGVDaGFuZ2U6ZnVuY3Rpb24oZSl7VnAucHVzaChlKSxjb25zb2xlLndhcm4oJ1RoZSAidW5pLm9uVUlTdHlsZUNoYW5nZSIgQVBJIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgInVuaS5vblRoZW1lQ2hhbmdlIi4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLm5ldC5jbi9hcGkvc3lzdGVtL3RoZW1lLicpfX0pLFdwPVl1KCJnZXRTZWxlY3RlZFRleHRSYW5nZUV2ZW50Iik7YWcuc3Vic2NyaWJlKCJvbkdldFNlbGVjdGVkVGV4dFJhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7Y29uc29sZS5sb2coIm9uR2V0U2VsZWN0ZWRUZXh0UmFuZ2UiKTt2YXIgcj1XcC5wb3AodCk7ciYmcihuKX0pO3ZhciBIcCxHcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRTZWxlY3RlZFRleHRSYW5nZTpmdW5jdGlvbihlLHQpe3ZhciBuPXhsKCk7YWcucHVibGlzaEhhbmRsZXIoImdldFNlbGVjdGVkVGV4dFJhbmdlIix7cGFnZUlkOm4sY2FsbGJhY2tJZDpXcC5wdXNoKGZ1bmN0aW9uKGUpe2ZpKHQsZSl9KX0sbil9fSk7a2woIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe0hwJiZmaShIcCxlKX0pO3ZhciBYcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0O3Q9SHAsYWcucmVtb3ZlQ2FsbGJhY2tIYW5kbGVyKHQpLEhwPWV9LG9mZktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKCl7SHA9bnVsbH19KSxKcD0ibG9uZ1ByZXNzQWN0aW9uc0NhbGxiYWNrIixZcD17fTtrbChKcCxmdW5jdGlvbihlKXt2YXIgdD1lLmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHQpP1lwLmZhaWwmJllwLmZhaWwoZSk6WXAuc3VjY2VzcyYmWXAuc3VjY2VzcyhlKSxZcC5jb21wbGV0ZSYmWXAuY29tcGxldGUoZSl9KTt2YXIgS3AsWnA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksKChZcD1lLmxvbmdQcmVzc0FjdGlvbnN8fHt9KS5zdWNjZXNzfHxZcC5mYWlsfHxZcC5jb21wbGV0ZSkmJihZcC5jYWxsYmFja0lkPUpwKSx3bCgicHJldmlld0ltYWdlUGx1cyIsZSl9LGNsb3NlUHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksd2woImNsb3NlUHJldmlld0ltYWdlUGx1cyIsZSl9fSksUXA9e3BhdXNlOm51bGwscmVzdW1lOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsZXJyb3I6bnVsbH0sZWg9ZnVuY3Rpb24oKXtrbCgib25SZWNvcmRlclN0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlO2RlbGV0ZSBlLnN0YXRlLGRlbGV0ZSBlLmVyck1zZywiZnVuY3Rpb24iPT10eXBlb2YgUXBbdF0mJlFwW3RdKGUpfSl9O2VoLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe1FwLmVycm9yPWV9LGVoLnByb3RvdHlwZS5vbkZyYW1lUmVjb3JkZWQ9ZnVuY3Rpb24oZSl7fSxlaC5wcm90b3R5cGUub25JbnRlcnJ1cHRpb25CZWdpbj1mdW5jdGlvbihlKXt9LGVoLnByb3RvdHlwZS5vbkludGVycnVwdGlvbkVuZD1mdW5jdGlvbihlKXt9LGVoLnByb3RvdHlwZS5vblBhdXNlPWZ1bmN0aW9uKGUpe1FwLnBhdXNlPWV9LGVoLnByb3RvdHlwZS5vblJlc3VtZT1mdW5jdGlvbihlKXtRcC5yZXN1bWU9ZX0sZWgucHJvdG90eXBlLm9uU3RhcnQ9ZnVuY3Rpb24oZSl7UXAuc3RhcnQ9ZX0sZWgucHJvdG90eXBlLm9uU3RvcD1mdW5jdGlvbihlKXtRcC5zdG9wPWV9LGVoLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3dsKCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJwYXVzZSJ9KX0sZWgucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3dsKCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJyZXN1bWUifSl9LGVoLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlKXt3bCgib3BlcmF0ZVJlY29yZGVyIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InN0YXJ0In0pKX0sZWgucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt3bCgib3BlcmF0ZVJlY29yZGVyIix7b3BlcmF0aW9uVHlwZToic3RvcCJ9KX07dmFyIHRoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFJlY29yZGVyTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBLcHx8KEtwPW5ldyBlaCl9fSksbmg9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tJZD10LHRoaXMuX2NhbGxiYWNrcz1bXX07bmgucHJvdG90eXBlLmFib3J0PWZ1bmN0aW9uKCl7d2woIm9wZXJhdGVEb3dubG9hZFRhc2siLHtkb3dubG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxuaC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LG5oLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30sbmgucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0sbmgucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIHJoPU9iamVjdC5jcmVhdGUobnVsbCk7a2woIm9uRG93bmxvYWRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZG93bmxvYWRUYXNrSWQsbj1lLnN0YXRlLHI9ZS50ZW1wRmlsZVBhdGgsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzV3JpdHRlbixzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZSxjPWUuZXJyTXNnLHU9cmhbdF0sbD11Ll9jYWxsYmFja0lkO3N3aXRjaChuKXtjYXNlInByb2dyZXNzVXBkYXRlIjp1Ll9jYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihlKXtlKHtwcm9ncmVzczpvLHRvdGFsQnl0ZXNXcml0dGVuOmEsdG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZTpzfSl9KTticmVhaztjYXNlInN1Y2Nlc3MiOmZpKGwse3RlbXBGaWxlUGF0aDpyLHN0YXR1c0NvZGU6aSxlcnJNc2c6InJlcXVlc3Q6b2sifSk7Y2FzZSJmYWlsIjpmaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2N9KTtkZWZhdWx0OnNnKGZ1bmN0aW9uKCl7ZGVsZXRlIHJoW3RdfSwxMDApfX0pO3ZhciBpaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkb3dubG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj13bCgiY3JlYXRlRG93bmxvYWRUYXNrIixlKS5kb3dubG9hZFRhc2tJZCxyPW5ldyBuaChuLHQpO3JldHVybiByaFtuXT1yfX0pLG9oPU9iamVjdC5jcmVhdGUobnVsbCk7a2woIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuc3RhdHVzQ29kZSxvPWUuaGVhZGVyLGE9ZS5lcnJNc2cscz1lLmNvb2tpZXMsYz1vaFt0XXx8e30sdT1jLmFyZ3MsbD1jLmNhbGxiYWNrSWQ7aWYobClzd2l0Y2goZGVsZXRlIG9oW3RdLG4pe2Nhc2Uic3VjY2VzcyI6ZmkobCxmdW5jdGlvbihyLGUpe2lmKCJzdHJpbmciPT10eXBlb2Ygci5kYXRhJiY2NTI3OT09PXIuZGF0YS5jaGFyQ29kZUF0KDApJiYoci5kYXRhPXIuZGF0YS5zdWJzdHIoMSkpLHIuc3RhdHVzQ29kZT1wYXJzZUludChyLnN0YXR1c0NvZGUsMTApLFQoci5oZWFkZXIpJiYoci5oZWFkZXI9T2JqZWN0LmtleXMoci5oZWFkZXIpLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXIuaGVhZGVyW3RdO3JldHVybiBBcnJheS5pc0FycmF5KG4pP2VbdF09bi5qb2luKCIsIik6InN0cmluZyI9PXR5cGVvZiBuJiYoZVt0XT1uKSxlfSx7fSkpLGUuZGF0YVR5cGUmJiJqc29uIj09PWUuZGF0YVR5cGUudG9Mb3dlckNhc2UoKSl0cnl7ci5kYXRhPUpTT04ucGFyc2Uoci5kYXRhKX1jYXRjaChlKXt9cmV0dXJuIHJ9KHtkYXRhOnIsc3RhdHVzQ29kZTppLGhlYWRlcjpvLGVyck1zZzoicmVxdWVzdDpvayIsY29va2llczpzfSx1KSk7YnJlYWs7Y2FzZSJmYWlsIjpmaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2F9KX19KTt2YXIgYWg9ZnVuY3Rpb24oZSl7dGhpcy5pZD1lfTthaC5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXt3bCgib3BlcmF0ZVJlcXVlc3RUYXNrIix7cmVxdWVzdFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxhaC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxhaC5wcm90b3R5cGUub25IZWFkZXJzUmVjZWl2ZWQ9ZnVuY3Rpb24oKXt9O3ZhciBzaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKHZhciByIGluIGUuaGVhZGVyKWlmKCJjb250ZW50LXR5cGUiPT09ci50b0xvd2VyQ2FzZSgpKXtuPWUuaGVhZGVyW3JdO2JyZWFrfSJHRVQiIT09ZS5tZXRob2QmJjA9PT1uLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKSYmVChlLmRhdGEpJiYoZS5kYXRhPUpTT04uc3RyaW5naWZ5KGUuZGF0YSkpO3ZhciBpPXdsKCJjcmVhdGVSZXF1ZXN0VGFzayIsZSkucmVxdWVzdFRhc2tJZDtyZXR1cm4gb2hbaV09e2FyZ3M6ZSxjYWxsYmFja0lkOnR9LG5ldyBhaChpKX19KSxjaD1mdW5jdGlvbihlKXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tzPXtvcGVuOltdLGNsb3NlOltdLGVycm9yOltdLG1lc3NhZ2U6W119LHRoaXMuQ0xPU0VEPTMsdGhpcy5DTE9TSU5HPTIsdGhpcy5DT05ORUNUSU5HPTAsdGhpcy5PUEVOPTEsdGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VEfTtjaC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnJlYWR5U3RhdGUhPT10aGlzLk9QRU4mJnRoaXMuX2NhbGxiYWNrKGUsInNlbmRTb2NrZXRNZXNzYWdlOmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTt2YXIgdD13bCgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic2VuZCIsc29ja2V0VGFza0lkOnRoaXMuaWR9KSkuZXJyTXNnO3RoaXMuX2NhbGxiYWNrKGUsdC5yZXBsYWNlKCJvcGVyYXRlU29ja2V0VGFzayIsInNlbmRTb2NrZXRNZXNzYWdlIikpfSxjaC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oZSl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0lORzt2YXIgdD13bCgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToiY2xvc2UiLHNvY2tldFRhc2tJZDp0aGlzLmlkfSkpLmVyck1zZzt0aGlzLl9jYWxsYmFjayhlLHQucmVwbGFjZSgib3BlcmF0ZVNvY2tldFRhc2siLCJjbG9zZVNvY2tldCIpKX0sY2gucHJvdG90eXBlLm9uT3Blbj1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Mub3Blbi5wdXNoKGUpfSxjaC5wcm90b3R5cGUub25DbG9zZT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MuY2xvc2UucHVzaChlKX0sY2gucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLmVycm9yLnB1c2goZSl9LGNoLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLm1lc3NhZ2UucHVzaChlKX0sY2gucHJvdG90eXBlLl9jYWxsYmFjaz1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLnN1Y2Nlc3Mscj1lLmZhaWwsaT1lLmNvbXBsZXRlLG89e2Vyck1zZzp0fTsvOm9rJC8udGVzdCh0KT8iZnVuY3Rpb24iPT10eXBlb2YgbiYmbihvKToiZnVuY3Rpb24iPT10eXBlb2YgciYmcihvKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaShvKX07dmFyIHVoPU9iamVjdC5jcmVhdGUobnVsbCksbGg9W10sZGg9T2JqZWN0LmNyZWF0ZShudWxsKTtrbCgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc29ja2V0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuY29kZSxvPWUucmVhc29uLGE9KGUuZXJyTXNnLHVoW3RdKTtpZihhKXt2YXIgcz0ibWVzc2FnZSI9PT1uP3tkYXRhOnJ9OiJjbG9zZSI9PT1uP3tjb2RlOmkscmVhc29uOm99Ont9O2lmKCJvcGVuIj09PW4mJihhLnJlYWR5U3RhdGU9YS5PUEVOKSxhPT09bGhbMF0mJmRoW25dJiZmaShkaFtuXSxzKSwiZXJyb3IiPT09bnx8ImNsb3NlIj09PW4pe2EucmVhZHlTdGF0ZT1hLkNMT1NFRCxkZWxldGUgdWhbdF07dmFyIGM9bGguaW5kZXhPZihhKTswPD1jJiZsaC5zcGxpY2UoYywxKX1hLl9jYWxsYmFja3Nbbl0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZShzKX0pfX0pO3ZhciBmaCxwaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb25uZWN0U29ja2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49d2woImNyZWF0ZVNvY2tldFRhc2siLGUpLnNvY2tldFRhc2tJZCxyPW5ldyBjaChuKTtyZXR1cm4gdWhbbl09cixsaC5wdXNoKHIpLHNnKGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJjb25uZWN0U29ja2V0Om9rIn0pfSwwKSxyfSxzZW5kU29ja2V0TWVzc2FnZTpmdW5jdGlvbihlLHQpe3ZhciBuPWxoWzBdO2lmKG4mJm4ucmVhZHlTdGF0ZT09PW4uT1BFTilyZXR1cm4gd2woIm9wZXJhdGVTb2NrZXRUYXNrIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InNlbmQiLHNvY2tldFRhc2tJZDpuLmlkfSkpO2ZpKHQse2Vyck1zZzoic2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCBXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCJ9KX0sY2xvc2VTb2NrZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1saFswXTtpZihuKXJldHVybiBuLnJlYWR5U3RhdGU9bi5DTE9TSU5HLHdsKCJvcGVyYXRlU29ja2V0VGFzayIsT2JqZWN0LmFzc2lnbih7fSxlLHtvcGVyYXRpb25UeXBlOiJjbG9zZSIsc29ja2V0VGFza0lkOm4uaWR9KSk7ZmkodCx7ZXJyTXNnOiJjbG9zZVNvY2tldDpmYWlsIFdlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIn0pfSxvblNvY2tldE9wZW46ZnVuY3Rpb24oZSl7ZGgub3Blbj1lfSxvblNvY2tldEVycm9yOmZ1bmN0aW9uKGUpe2RoLmVycm9yPWV9LG9uU29ja2V0TWVzc2FnZTpmdW5jdGlvbihlKXtkaC5tZXNzYWdlPWV9LG9uU29ja2V0Q2xvc2U6ZnVuY3Rpb24oZSl7ZGguY2xvc2U9ZX19KSxoaD1mdW5jdGlvbigpe307aGgucHJvdG90eXBlLm9uQ2hlY2tGb3JVcGRhdGU9ZnVuY3Rpb24oKXt9LGhoLnByb3RvdHlwZS5vblVwZGF0ZVJlYWR5PWZ1bmN0aW9uKCl7fSxoaC5wcm90b3R5cGUub25VcGRhdGVGYWlsZWQ9ZnVuY3Rpb24oKXt9LGhoLnByb3RvdHlwZS5hcHBseVVwZGF0ZT1mdW5jdGlvbigpe307dmFyIHZoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFVwZGF0ZU1hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZmh8fChmaD1uZXcgaGgpfX0pLGdoPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuX2NhbGxiYWNrSWQ9dCx0aGlzLl9jYWxsYmFja3M9W119O2doLnByb3RvdHlwZS5hYm9ydD1mdW5jdGlvbigpe3dsKCJvcGVyYXRlVXBsb2FkVGFzayIse3VwbG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxnaC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LGdoLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30sZ2gucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0sZ2gucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIG1oPU9iamVjdC5jcmVhdGUobnVsbCk7a2woIm9uVXBsb2FkVGFza1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnVwbG9hZFRhc2tJZCxuPWUuc3RhdGUscj1lLmRhdGEsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzU2VudCxzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kLGM9ZS5lcnJNc2csdT1taFt0XSxsPXUuX2NhbGxiYWNrSWQ7c3dpdGNoKG4pe2Nhc2UicHJvZ3Jlc3NVcGRhdGUiOnUuX2NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uoe3Byb2dyZXNzOm8sdG90YWxCeXRlc1NlbnQ6YSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQ6c30pfSk7YnJlYWs7Y2FzZSJzdWNjZXNzIjpmaShsLHtkYXRhOnIsc3RhdHVzQ29kZTppLGVyck1zZzoicmVxdWVzdDpvayJ9KTtjYXNlImZhaWwiOmZpKGwse2Vyck1zZzoicmVxdWVzdDpmYWlsICIrY30pO2RlZmF1bHQ6c2coZnVuY3Rpb24oKXtkZWxldGUgbWhbdF19LDEwMCl9fSk7dmFyIHloLF9oLGJoLHdoLGtoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVwbG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj13bCgiY3JlYXRlVXBsb2FkVGFzayIsZSkudXBsb2FkVGFza0lkLHI9bmV3IGdoKG4sdCk7cmV0dXJuIG1oW25dPXJ9fSk7ZnVuY3Rpb24gU2goZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGUpe31yZXR1cm4gZX1mdW5jdGlvbiB4aCh0KXtpZigiZW5hYmxlZCI9PT10LnR5cGUpYmg9ITAsd2g9dC5vZmZsaW5lO2Vsc2UgaWYoImNsaWVudElkIj09PXQudHlwZSl5aD10LmNpZCxfaD10LmVyck1zZyxUaCh5aCx0LmVyck1zZyk7ZWxzZSBpZigicHVzaE1zZyI9PT10LnR5cGUpZm9yKHZhciBlPXt0eXBlOiJyZWNlaXZlIixkYXRhOlNoKHQubWVzc2FnZSl9LG49MDtuPE9oLmxlbmd0aDtuKyspe2lmKCgwLE9oW25dKShlKSxlLnN0b3BwZWQpYnJlYWt9ZWxzZSJjbGljayI9PT10LnR5cGUmJk9oLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh7dHlwZToiY2xpY2siLGRhdGE6U2godC5tZXNzYWdlKX0pfSl9dmFyIENoPVtdO2Z1bmN0aW9uIFRoKHQsbil7Q2guZm9yRWFjaChmdW5jdGlvbihlKXtlKHQsbil9KSxDaC5sZW5ndGg9MH12YXIgT2g9W10sRWg9ITEsSWg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaW52b2tlUHVzaENhbGxiYWNrOnhoLGdldFB1c2hDbGllbnRJZDpmdW5jdGlvbihlKXtUKGUpfHwoZT17fSk7dmFyIHQ9YWUoZSkscj10LnN1Y2Nlc3MsaT10LmZhaWwsbz10LmNvbXBsZXRlLGE9QyhyKSxzPUMoaSksYz1DKG8pO3doP29nLnB1c2guZ2V0Q2xpZW50SW5mb0FzeW5jKGZ1bmN0aW9uKGUpe3ZhciB0PXtlcnJNc2c6ImdldFB1c2hDbGllbnRJZDpvayIsY2lkOmUuY2xpZW50aWR9O2EmJnIodCksYyYmbyh0KX0sZnVuY3Rpb24oZSl7ZT17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6ZmFpbCAiK2UuY29kZSsiOiAiK2UubWVzc2FnZX0scyYmaShlKSxjJiZvKGUpfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3ZvaWQgMD09PWJoJiYoYmg9ITEseWg9IiIsX2g9InVuaVB1c2ggaXMgbm90IGVuYWJsZWQiKSxDaC5wdXNoKGZ1bmN0aW9uKGUsdCl7dmFyIG47ZT8obj17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6b2siLGNpZDplfSxhJiZyKG4pKToobj17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6ZmFpbCIrKHQ/IiAiK3Q6IiIpfSxzJiZpKG4pKSxjJiZvKG4pfSksdm9pZCAwIT09eWgmJlRoKHloLF9oKX0pfSxvblB1c2hNZXNzYWdlOmZ1bmN0aW9uKGUpey0xPT09T2guaW5kZXhPZihlKSYmT2gucHVzaChlKSxFaHx8KEVoPSEwLG9nLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpe3hoKHt0eXBlOiJjbGljayIsbWVzc2FnZTplfSl9KSxvZy5wdXNoLmFkZEV2ZW50TGlzdGVuZXIoInJlY2VpdmUiLGZ1bmN0aW9uKGUpe3hoKHt0eXBlOiJwdXNoTXNnIixtZXNzYWdlOmV9KX0pKX0sb2ZmUHVzaE1lc3NhZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9T2guaW5kZXhPZihlKTstMTx0JiZPaC5zcGxpY2UodCwxKX1lbHNlIE9oLmxlbmd0aD0wfX0pLEFoPXtkdXJhdGlvbjo0MDAsdGltaW5nRnVuY3Rpb246ImxpbmVhciIsZGVsYXk6MCx0cmFuc2Zvcm1PcmlnaW46IjUwJSA1MCUgMCJ9LCRoPWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09e30sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMub3B0aW9uPU9iamVjdC5hc3NpZ24oe30sQWgsZSl9OyRoLnByb3RvdHlwZS5fZ2V0T3B0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXt0cmFuc2l0aW9uOk9iamVjdC5hc3NpZ24oe30sdGhpcy5vcHRpb24sZSl9O3JldHVybiB0LnRyYW5zZm9ybU9yaWdpbj10LnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLGRlbGV0ZSB0LnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLHR9LCRoLnByb3RvdHlwZS5fcHVzaEFuaW1hdGVzPWZ1bmN0aW9uKGUsdCl7dGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzLnB1c2goe3R5cGU6ZSxhcmdzOnR9KX0sJGgucHJvdG90eXBlLl9jb252ZXJUeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1tBLVpdL2csZnVuY3Rpb24oZSl7cmV0dXJuIi0iK2UudG9Mb3dlckNhc2UoKX0pfSwkaC5wcm90b3R5cGUuX2dldFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9lKyJweCI6ZX0sJGgucHJvdG90eXBlLmV4cG9ydD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYWN0aW9ucztyZXR1cm4gdGhpcy5hY3Rpb25zPVtdLHthY3Rpb25zOmV9fSwkaC5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMuZm9yRWFjaChmdW5jdGlvbihlKXsic3R5bGUiIT09ZS50eXBlP3QuY3VycmVudFRyYW5zZm9ybVtlLnR5cGVdPWU6dC5jdXJyZW50VHJhbnNmb3JtW2UudHlwZSsiLiIrZS5hcmdzWzBdXT1lfSksdGhpcy5hY3Rpb25zLnB1c2goe2FuaW1hdGVzOk9iamVjdC52YWx1ZXModGhpcy5jdXJyZW50VHJhbnNmb3JtKSxvcHRpb246dGhpcy5fZ2V0T3B0aW9uKGUpfSksdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXN9O3ZhciBQaD1bIm9wYWNpdHkiLCJiYWNrZ3JvdW5kQ29sb3IiXSxNaD1bIndpZHRoIiwiaGVpZ2h0IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl07WyJtYXRyaXgiLCJtYXRyaXgzZCIsInJvdGF0ZSIsInJvdGF0ZTNkIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwic2NhbGUiLCJzY2FsZTNkIiwic2NhbGVYIiwic2NhbGVZIiwic2NhbGVaIiwic2tldyIsInNrZXdYIiwic2tld1kiLCJ0cmFuc2xhdGUiLCJ0cmFuc2xhdGUzZCIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiJdLmNvbmNhdChQaCxNaCkuZm9yRWFjaChmdW5jdGlvbihuKXskaC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIFBoLmNvbmNhdChNaCkuaW5jbHVkZXMobik/dGhpcy5fcHVzaEFuaW1hdGVzKCJzdHlsZSIsW3RoaXMuX2NvbnZlclR5cGUobiksTWguaW5jbHVkZXMobik/dGhpcy5fZ2V0VmFsdWUoZVswXSk6ZVswXV0pOnRoaXMuX3B1c2hBbmltYXRlcyhuLGUpLHRoaXN9fSk7dmFyIGpoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUFuaW1hdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3ICRoKGUpfX0pLExoPVl1KCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiKSxCaD17dGhyZXNob2xkczpbMF0saW5pdGlhbFJhdGlvOjAsb2JzZXJ2ZUFsbDohMX0sTmg9ZnVuY3Rpb24oZSx0KXt0aGlzLnBhZ2VJZD1lLiRwYWdlJiZlLiRwYWdlLmlkLHRoaXMuY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSxCaCx0KX07TmgucHJvdG90eXBlLl9tYWtlUm9vdE1hcmdpbj1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy5vcHRpb25zLnJvb3RNYXJnaW49WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuKE51bWJlcih0W2VdKXx8MCkrInB4In0pLmpvaW4oIiAiKX0sTmgucHJvdG90eXBlLnJlbGF0aXZlVG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnJlbGF0aXZlVG9TZWxlY3Rvcj1lLHRoaXMuX21ha2VSb290TWFyZ2luKHQpLHRoaXN9LE5oLnByb3RvdHlwZS5yZWxhdGl2ZVRvVmlld3BvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9bnVsbCx0aGlzLl9tYWtlUm9vdE1hcmdpbihlKSx0aGlzfSxOaC5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodGhpcy5vcHRpb25zLnNlbGVjdG9yPWUsdGhpcy5yZXFJZD1MaC5wdXNoKHQpLGFnLnB1Ymxpc2hIYW5kbGVyKCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkLGNvbXBvbmVudDp0aGlzLmNvbXBvbmVudCxvcHRpb25zOnRoaXMub3B0aW9uc30sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSkpfSxOaC5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe2FnLnB1Ymxpc2hIYW5kbGVyKCJkZXN0cm95Q29tcG9uZW50T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKX07dmFyIERoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX2lzVnVlfHwodD1lLGU9bnVsbCksbmV3IE5oKGV8fFNsKCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIpLHQpfX0pLFJoPVl1KCJyZXF1ZXN0TWVkaWFRdWVyeU9ic2VydmVyIiksRmg9ZnVuY3Rpb24oZSx0KXt0aGlzLnBhZ2VJZD1lLiRwYWdlJiZlLiRwYWdlLmlkLHRoaXMuY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzLm9wdGlvbnM9dH07RmgucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucz1lLHRoaXMucmVxSWQ9UmgucHVzaCh0KSxhZy5wdWJsaXNoSGFuZGxlcigicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIse3JlcUlkOnRoaXMucmVxSWQsY29tcG9uZW50OnRoaXMuY29tcG9uZW50LG9wdGlvbnM6dGhpcy5vcHRpb25zfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKSl9LEZoLnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKCl7YWcucHVibGlzaEhhbmRsZXIoImRlc3Ryb3lNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKX07dmFyIFVoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlLl9pc1Z1ZXx8KHQ9ZSxlPW51bGwpLG5ldyBGaChlfHxTbCgiY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyIiksdCl9fSksemg9e2NhbnZhczp3cCxtYXA6Q3AsdmlkZW86SXAsZWRpdG9yOlBwfTtmdW5jdGlvbiBWaChlKXtpZihlJiZlLmNvbnRleHQpe3ZhciB0PWUuY29udGV4dCxuPXQuaWQscj10Lm5hbWUsaT10LnBhZ2Usbz16aFtyXTtlLmNvbnRleHQ9byYmbmV3IG8obixpKX19dmFyIHFoPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuX3NlbGVjdG9yUXVlcnk9ZSx0aGlzLl9jb21wb25lbnQ9dCx0aGlzLl9zZWxlY3Rvcj1uLHRoaXMuX3NpbmdsZT1yfTtxaC5wcm90b3R5cGUuYm91bmRpbmdDbGllbnRSZWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAscmVjdDohMCxzaXplOiEwfSxlKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fSxxaC5wcm90b3R5cGUuZmllbGRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSxlLHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9LHFoLnByb3RvdHlwZS5zY3JvbGxPZmZzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7aWQ6ITAsZGF0YXNldDohMCxzY3JvbGxPZmZzZXQ6ITB9LGUpLHRoaXMuX3NlbGVjdG9yUXVlcnl9LHFoLnByb3RvdHlwZS5jb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2NvbnRleHQ6ITB9LGUpLHRoaXMuX3NlbGVjdG9yUXVlcnl9O3ZhciBXaD1mdW5jdGlvbihlKXt0aGlzLl9wYWdlPWUsdGhpcy5fcXVldWU9W10sdGhpcy5fcXVldWVDYj1bXSx0aGlzLl9ub2Rlc1JlZj1udWxsfTtXaC5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbih0KXt2YXIgaT10aGlzO3JldHVybiB3bCgicmVxdWVzdENvbXBvbmVudEluZm8iLHRoaXMuX3BhZ2UsdGhpcy5fcXVldWUsZnVuY3Rpb24oZSl7dmFyIHI9aS5fcXVldWVDYjtlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaChWaCk6VmgoZSk7dmFyIG49clt0XTtDKG4pJiZuLmNhbGwoaSxlKX0pLEModCkmJnQuY2FsbChpLGUpfSksdGhpcy5fbm9kZXNSZWZ9LFdoLnByb3RvdHlwZS5pbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzfSxXaC5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgcWgodGhpcyx0aGlzLl9jb21wb25lbnQsZSwhMCl9LFdoLnByb3RvdHlwZS5zZWxlY3RBbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBxaCh0aGlzLHRoaXMuX2NvbXBvbmVudCxlLCExKX0sV2gucHJvdG90eXBlLnNlbGVjdFZpZXdwb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBxaCh0aGlzLDAsIiIsITApfSxXaC5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24oZSx0LG4scixpKXt0aGlzLl9xdWV1ZS5wdXNoKHtjb21wb25lbnQ6dCxzZWxlY3RvcjplLHNpbmdsZTpuLGZpZWxkczpyfSksdGhpcy5fcXVldWVDYi5wdXNoKGkpfTt2YXIgSGg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlU2VsZWN0b3JRdWVyeTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFdoKGV8fFNsKCJjcmVhdGVTZWxlY3RvclF1ZXJ5IikpfX0pO2FnLnN1YnNjcmliZSgib25Mb2FkRm9udEZhY2VDYWxsYmFjayIsZnVuY3Rpb24oZSl7ZmkoZS5jYWxsYmFja0lkLGUuZGF0YSl9KTt2YXIgR2g9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbG9hZEZvbnRGYWNlOmZ1bmN0aW9uKGUsdCl7dmFyIG49eGwoKTtpZighbilyZXR1cm57ZXJyTXNnOiJsb2FkRm9udEZhY2U6ZmFpbCBub3QgZm9udCBwYWdlIn07YWcucHVibGlzaEhhbmRsZXIoImxvYWRGb250RmFjZSIse29wdGlvbnM6ZSxjYWxsYmFja0lkOnR9LG4pfX0pO3ZhciBYaD1bXTt2YXIgSmg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0TG9jYWxlOmZ1bmN0aW9uKCl7dmFyIGU9aGcoe2FsbG93RGVmYXVsdDohMH0pO3JldHVybiBlJiZlLiR2bT9lLiR2bS4kbG9jYWxlOm90LmdldExvY2FsZSgpfSxzZXRMb2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIGhnKCkuJHZtLiRsb2NhbGUhPT10JiYoaGcoKS4kdm0uJGxvY2FsZT10LHZnKCkuZm9yRWFjaChmdW5jdGlvbihlKXthZy5wdWJsaXNoSGFuZGxlcigic2V0TG9jYWxlIix0LGUuJHBhZ2UuaWQpfSksaWcucmVxdWlyZU1vZHVsZSgicGx1cyIpLnNldExhbmd1YWdlKHQpLFhoLmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx7bG9jYWxlOnR9KX0pLCEwKX0sb25Mb2NhbGVDaGFuZ2U6ZnVuY3Rpb24oZSl7WGgucHVzaChlKX19KTt2YXIgWWg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscGFnZVNjcm9sbFRvOmZ1bmN0aW9uKGUpe3ZhciB0PXZnKCk7cmV0dXJuIHQubGVuZ3RoJiZhZy5wdWJsaXNoSGFuZGxlcigicGFnZVNjcm9sbFRvIixlLHRbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLHt9fX0pO3ZhciBLaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzZXRQYWdlTWV0YTpmdW5jdGlvbihlKXt2YXIgdD12ZygpO3JldHVybiB0Lmxlbmd0aCYmYWcucHVibGlzaEhhbmRsZXIoInNldFBhZ2VNZXRhIixlLHRbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLHt9fX0pO2Z1bmN0aW9uIFpoKGUpe3JldHVybiB3bCgic2V0VGFiQmFyQmFkZ2UiLHtpbmRleDplLmluZGV4LHR5cGU6Im5vbmUifSl9dmFyIFFoPVpoLGV2PVtdO2tsKCJvblRhYkJhck1pZEJ1dHRvblRhcCIsZnVuY3Rpb24odCl7ZXYuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQpfSl9KTt2YXIgdHY9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscmVtb3ZlVGFiQmFyQmFkZ2U6Wmgsc2hvd1RhYkJhclJlZERvdDpmdW5jdGlvbihlKXtyZXR1cm4gd2woInNldFRhYkJhckJhZGdlIix7aW5kZXg6ZS5pbmRleCx0eXBlOiJyZWREb3QifSl9LGhpZGVUYWJCYXJSZWREb3Q6UWgsb25UYWJCYXJNaWRCdXR0b25UYXA6ZnVuY3Rpb24oZSl7ZXYucHVzaChlKX19KSxudj1bXTtrbCgib25WaWV3RGlkUmVzaXplIixmdW5jdGlvbih0KXtudi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdCl9KX0pO3ZhciBydixpdixvdj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbldpbmRvd1Jlc2l6ZTpmdW5jdGlvbihlKXtudi5wdXNoKGUpfSxvZmZXaW5kb3dSZXNpemU6ZnVuY3Rpb24oZSl7bnYuc3BsaWNlKG52LmluZGV4T2YoZSksMSl9fSksYXY9T2JqZWN0LmNyZWF0ZShudWxsKSxzdj0ocnY9eyIuL2Jhc2UvYmFzZTY0LmpzIjpXciwiLi9iYXNlL2Nhbi1pLXVzZS5qcyI6R3IsIi4vYmFzZS9pbnRlcmNlcHRvci5qcyI6SnIsIi4vYmFzZS91cHgycHguanMiOmVpLCIuL2NvbnRleHQvYXVkaW8uanMiOnJpLCIuL2NvbnRleHQvYmFja2dyb3VuZC1hdWRpby5qcyI6JGwsIi4vY29udGV4dC9jYW52YXMuanMiOlNwLCIuL2NvbnRleHQvY3JlYXRlLW1hcC1jb250ZXh0LmpzIjpUcCwiLi9jb250ZXh0L2NyZWF0ZS12aWRlby1jb250ZXh0LmpzIjpBcCwiLi9jb250ZXh0L2VkaXRvci5qcyI6TXAsIi4vY29udGV4dC9pbm5lci1hdWRpby5qcyI6UnAsIi4vZGV2aWNlL25ldHdvcmsuanMiOlVwLCIuL2RldmljZS90aGVtZS5qcyI6cXAsIi4va2V5Ym9hcmQvZ2V0LXNlbGVjdGVkLXRleHQtcmFuZ2UuanMiOkdwLCIuL2tleWJvYXJkL2tleWJvYXJkLmpzIjpYcCwiLi9tZWRpYS9wcmV2aWV3LWltYWdlLmpzIjpacCwiLi9tZWRpYS9yZWNvcmRlci5qcyI6dGgsIi4vbmV0d29yay9kb3dubG9hZC1maWxlLmpzIjppaCwiLi9uZXR3b3JrL3JlcXVlc3QuanMiOnNoLCIuL25ldHdvcmsvc29ja2V0LmpzIjpwaCwiLi9uZXR3b3JrL3VwZGF0ZS5qcyI6dmgsIi4vbmV0d29yay91cGxvYWQtZmlsZS5qcyI6a2gsIi4vcGx1Z2luL3B1c2guanMiOkloLCIuL3VpL2NyZWF0ZS1hbmltYXRpb24uanMiOmpoLCIuL3VpL2NyZWF0ZS1pbnRlcnNlY3Rpb24tb2JzZXJ2ZXIuanMiOkRoLCIuL3VpL2NyZWF0ZS1tZWRpYS1xdWVyeS1vYnNlcnZlci5qcyI6VWgsIi4vdWkvY3JlYXRlLXNlbGVjdG9yLXF1ZXJ5LmpzIjpIaCwiLi91aS9sb2FkLWZvbnQtZmFjZS5qcyI6R2gsIi4vdWkvbG9jYWxlLmpzIjpKaCwiLi91aS9wYWdlLXNjcm9sbC10by5qcyI6WWgsIi4vdWkvc2V0LXBhZ2UtbWV0YS5qcyI6S2gsIi4vdWkvdGFiLWJhci5qcyI6dHYsIi4vdWkvd2luZG93LmpzIjpvdn0sKGl2PWZ1bmN0aW9uKGUpe3JldHVybiBydltlXXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitlKyInLiIpfSgpfSkua2V5cz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyhydil9LGl2KTtzdi5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbihlKXtPYmplY3QuYXNzaWduKGF2LHN2KGUpKX0pO3ZhciBjdj1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYXYsYmwpLHV2PU9iamVjdC5jcmVhdGUobnVsbCk7dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBpLG87Y3ZbZV0/dXZbZV09KG89RnIoaT1lLGN2W2VdKSxvZShpKSYmQyhvKT9mdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7Zm9yKHZhciByPVtdLGU9YXJndW1lbnRzLmxlbmd0aC0xOzA8ZS0tOylyW2VdPWFyZ3VtZW50c1tlKzFdO3JldHVybiBDKG4uc3VjY2Vzcyl8fEMobi5mYWlsKXx8QyhuLmNvbXBsZXRlKT9HKGksSi5hcHBseSh2b2lkIDAsW2ksbyxuXS5jb25jYXQocikpKTpHKGksbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtKLmFwcGx5KHZvaWQgMCxbaSxvLE9iamVjdC5hc3NpZ24oe30sbix7c3VjY2VzczplLGZhaWw6dH0pXS5jb25jYXQocikpfSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm5bbnVsbCxlXX0pLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybltlXX0pKX06byk6dXZbZV09RHIoZSl9KTt2YXIgbHY9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBkdihlLHQsbil7cmV0dXJuIm9uRXJyb3IiIT09dCYmY29uc29sZS5kZWJ1ZygiQXBw77yaIit0KyIgaGF2ZSBiZWVuIGludm9rZWQiKyhuPyIgIitKU09OLnN0cmluZ2lmeShuKToiIikpLChlPWUuJHZtfHxlKS5fX2NhbGxfaG9vayYmZS5fX2NhbGxfaG9vayh0LG4pfWZ1bmN0aW9uIGZ2KGUsdCxuKXtyZXR1cm4ib25QYWdlU2Nyb2xsIiE9PXQmJmNvbnNvbGUuZGVidWcoZS4kcGFnZS5yb3V0ZSsiWyIrZS4kcGFnZS5pZCsiXe+8miIrdCsiIGhhdmUgYmVlbiBpbnZva2VkIiksaT10LG89biwocj0ocj1lKS4kdm18fHIpLl9fY2FsbF9ob29rJiZyLl9fY2FsbF9ob29rKGksbyk7dmFyIHIsaSxvfWZ1bmN0aW9uIHB2KGUsdCl7dmFyIG49ZS5uYW1lLHI9ZS5hcmc7InBvc3RNZXNzYWdlIj09PW4/ZnVuY3Rpb24odCxlKXt0PXBhcnNlSW50KHQpO3ZhciBuPXZnKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO2lmKG4mJiFuLiRwYWdlLm1ldGEuaXNOVnVlKXt2YXIgcj1uLiR2bS5fJHZkLmVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIndlYi12aWV3Ij09PWUudHlwZSYmZS5ldmVudHMubWVzc2FnZX0pO2lmKCFyKXJldHVybjtyLmRpc3BhdGNoRXZlbnQoIm1lc3NhZ2UiLHt0eXBlOiJtZXNzYWdlIix0YXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSxjdXJyZW50VGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksdGltZVN0YW1wOkRhdGUubm93KCksZGV0YWlsOntkYXRhOltlXX19KX19KHRbMF0scik6cGdbbl0ocil9ZnVuY3Rpb24gaHYoZSx0KXt2YXIgbj10LmdldEFwcCxpPXQuZ2V0Q3VycmVudFBhZ2VzO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj1pKCk7bi5sZW5ndGgmJmZ2KG5bbi5sZW5ndGgtMV0sZSx0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbihlKXtyKHQsZSl9fXZhciBhPXtuYXZpZ2F0ZVRvOmZ1bmN0aW9uKCl7cigib25IaWRlIil9LG5hdmlnYXRlQmFjazpmdW5jdGlvbigpe3IoIm9uU2hvdyIpfX07ZSgib25FcnJvciIsZnVuY3Rpb24oZSl7ZHYobigpLCJvbkVycm9yIixlKX0pLGUoIm9uUGFnZU5vdEZvdW5kIixmdW5jdGlvbihlKXtkdihuKCksIm9uUGFnZU5vdEZvdW5kIixlKX0pLGUoIm9uQXBwUm91dGUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWFbdF07biYmbigpfSksZSgib25BcHBFbnRlckJhY2tncm91bmQiLGZ1bmN0aW9uKCl7ZHYobigpLCJvbkhpZGUiKSxyKCJvbkhpZGUiKX0pLGUoIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixmdW5jdGlvbihlKXtkdihuKCksIm9uU2hvdyIsZSksMCE9PWkoKS5sZW5ndGgmJnIoIm9uU2hvdyIpfSksZSgib25SZXNpemUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49aSgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7biYmZnYobiwib25SZXNpemUiLGUpfSksZSgib25QdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pKCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtyJiYoR3U9Im51bWJlciI9PXR5cGVvZihuPXQpP29nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKG4pKTpuLGZ2KHIsIm9uUHVsbERvd25SZWZyZXNoIikpfSksZSgib25UYWJJdGVtVGFwIixvKCJvblRhYkl0ZW1UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIixvKCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLG8oIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsbygib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCIpKSxlKCJvbldlYkludm9rZUFwcFNlcnZpY2UiLHB2KX10LmZvckVhY2goZnVuY3Rpb24oZSl7Y3ZbZV0/bHZbZV09RnIoZSxjdltlXSk6bHZbZV09RHIoZSl9KTt2YXIgdnY9ITE7ZnVuY3Rpb24gZ3YoZSx0KXt2YXIgbj0iMSI9PT10O2lmKCFufHwhdnYpe2lmKG4/KHZ2PSEwLGFzKG9nLndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpKSk6R2F8fGFzKG9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodCkpLEdhLmlkIT09dClyZXR1cm4gY29uc29sZS5lcnJvcigid2Vidmlld1JlYWR5WyIrR2EuaWQrIl1bIit0KyJdIG5vdCBtYXRjaCIpO3ZhciByLGk7aWYoR2EubG9hZGVkPSEwLGk9ZHNbcj10XSxBcnJheS5pc0FycmF5KGkpJiZpLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pLGRlbGV0ZSBkc1tyXSxuKXt2YXIgbz0iLyIrZGcuZW50cnlQYWdlUGF0aCxhPWZnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PW99KTtpZighYS5tZXRhLmlzTlZ1ZSl7dmFyIHM9YS5tZXRhLmlzVGFiQmFyPyJzd2l0Y2hUYWIiOiJuYXZpZ2F0ZVRvIjtyZXR1cm4gcGdbc10oe3VybDpvKyhkZy5lbnRyeVBhZ2VRdWVyeXx8IiIpLG9wZW5UeXBlOiJhcHBMYXVuY2gifSl9fX19dmFyIG12PU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24geXYoZSx0KXt2YXIgbj1lLmRhdGEscj0oZS5vcHRpb25zLG12W3RdKTtBcnJheS5pc0FycmF5KHIpJiZyLmZvckVhY2goZnVuY3Rpb24oZSl7ZShuKX0pfXZhciBfdixidj1bXTtmdW5jdGlvbiB3digpe2Zvcih2YXIgZT1idi5zbGljZSgwKSx0PWJ2Lmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX1mdW5jdGlvbiBrdihlKXt2YXIgdD1lLmRhdGEsbj10Lm1ldGhvZCxyPXQuYXJncztwZ1tuXSYmcGdbbl0ocil9ZnVuY3Rpb24gU3YoZSx0KXt2YXIgbj1lLmNpZCxyPWUubWV0aG9kLGk9ZS5hcmdzO3Q9cGFyc2VJbnQodCk7dmFyIG89dmcoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW8pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO3ZhciBhPW8uJHZtLl8kdmQuZ2V0Vm0obik7aWYoIWEpcmV0dXJuIGNvbnNvbGUuZXJyb3IoInZtWyIrbisiXSBub3QgZm91bmQiKTthW3JdJiZhW3JdKGkpfWZ1bmN0aW9uIHh2KHQpe3Q9cGFyc2VJbnQodCk7dmFyIGU9dmcoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7cmV0dXJuIGV8fGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpfWZ1bmN0aW9uIEN2KGUsdCl7dmFyIG49eHYodCk7biYmKG4uX191bmlhcHBfd2Vidmlldz0hMCl9ZnVuY3Rpb24gVHYoZSx0KXt2YXIgbj14dih0KTtuJiZkZWxldGUgbi5fX3VuaWFwcF93ZWJ2aWV3fWZ1bmN0aW9uIE92KCl7dmFyIGU9YWcub24sbj1hZy5lbWl0LHQ9YWcuc3Vic2NyaWJlLHI9YWcucHVibGlzaEhhbmRsZXIsaT1hZy5zdWJzY3JpYmVIYW5kbGVyO2lmKGZ1bmN0aW9uKGUsdCl7dC5nZXRBcHA7dmFyIGk9dC5nZXRDdXJyZW50UGFnZXM7ZnVuY3Rpb24gbihyKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0PXBhcnNlSW50KHQpO3ZhciBuPWkoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO24mJmZ2KG4scixlKX19dmFyIG89WXUoInJlcXVlc3RDb21wb25lbnRJbmZvIiksYT1ZdSgicmVxdWVzdENvbXBvbmVudE9ic2VydmVyIikscz1ZdSgicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIpO2UoIm9uUGFnZVNjcm9sbCIsbigib25QYWdlU2Nyb2xsIikpLGUoIm9uUmVhY2hCb3R0b20iLG4oIm9uUmVhY2hCb3R0b20iKSksZSgib25SZXF1ZXN0Q29tcG9uZW50SW5mbyIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXFJZCxuPWUucmVzLHI9by5wb3AodCk7ciYmcihuKX0pLGUoIm9uUmVxdWVzdENvbXBvbmVudE9ic2VydmVyIixmdW5jdGlvbihlKXt2YXIgdD1lLnJlcUlkLG49ZS5yZXFFbmQscj1lLnJlcyxpPWEuZ2V0KHQpO2lmKGkpe2lmKG4pcmV0dXJuIHZvaWQgYS5wb3AodCk7aShyKX19KSxlKCJvblJlcXVlc3RNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxSWQsbj1lLnJlcUVuZCxyPWUucmVzLGk9cy5nZXQodCk7aWYoaSl7aWYobilyZXR1cm4gdm9pZCBzLnBvcCh0KTtpKHIpfX0pfSh0LHtnZXRBcHA6aGcsZ2V0Q3VycmVudFBhZ2VzOnZnfSksZ2EoInN1YnNjcmliZUhhbmRsZXIiLGZ1bmN0aW9uKGUpe2koZS50eXBlLGUuZGF0YSxlLnBhZ2VJZCl9KSwibmF0aXZlIiE9PWRnLnJlbmRlcmVyKXt0KFlhLGd2KSx0KEphLHl2KSx0KEthLHd2KTt2YXIgbz0iLyIrZGcuZW50cnlQYWdlUGF0aDtmZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1vfSkubWV0YS5pc05WdWV8fHIoWWEsT2JqZWN0LmNyZWF0ZShudWxsKSxbMV0pfWUoImFwaS4iK1FhLGZ1bmN0aW9uKGUsdCl7bigib25XZWJJbnZva2VBcHBTZXJ2aWNlIixlLHQpfSksdCgib25XeHNJbnZva2VDYWxsTWV0aG9kIixTdiksdChaYSxrdiksdChlcyxDdiksdCh0cyxUdil9dmFyIEV2PXtnbG9iYWxEYXRhOnt9fTtmdW5jdGlvbiBJdihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5hbGxvd0RlZmF1bHQ7cmV0dXJuIHZvaWQgMD09PXQmJih0PSExKSxfdnx8KHQ/RXY6dm9pZCBjb25zb2xlLmVycm9yKCJbd2Fybl06IGdldEFwcCgpIGZhaWxlZC4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLmlvL2NvbGxvY2F0aW9uL2ZyYW1lL3dpbmRvdz9pZD1nZXRhcHAuIikpfWZ1bmN0aW9uIEF2KCl7dmFyIGU9cGkoImdsb2JhbEV2ZW50Iiksbz1hZy5lbWl0O2lnLmNvbmZpZy5wcmVsb2FkP29nLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSk6b2cuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigic3BsYXNoY2xvc2VkIixmdW5jdGlvbigpe29nLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSl9KSxvZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsZnVuY3Rpb24oKXtvKCJvbkFwcEVudGVyQmFja2dyb3VuZCIpfSksb2cuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVzdW1lIixmdW5jdGlvbigpe3ZhciBlLHQsbixyLGk9RXMoKTtpJiZpLnVzZXJBY3Rpb24mJih0PShlPWkpLnBhdGgsbj1lLnF1ZXJ5LHI9ZS5yZWZlcnJlckluZm8seHMoQ3Mse3BhdGg6dCxxdWVyeTpuP0Uobik6e30scmVmZXJyZXJJbmZvOnJ8fHt9fSkpLG8oIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixPcygpKX0pLG9nLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoIm5ldGNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgZT12b1tvZy5uZXR3b3JraW5mby5nZXRDdXJyZW50VHlwZSgpXXx8InVua25vd24iO2hpKCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLHtpc0Nvbm5lY3RlZDoibm9uZSIhPT1lLG5ldHdvcmtUeXBlOmV9KX0pO3ZhciB0PTA7b2cuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigiS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe3QhPT1lLmhlaWdodCYmaGkoIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLHtoZWlnaHQ6dD1lLmhlaWdodH0pfSksZS5hZGRFdmVudExpc3RlbmVyKCJ1aXN0eWxlY2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdCxuPXt0aGVtZTplLnVpc3R5bGV9O2R2KF92LG50LG4pLGhpKG50LG4pLGFnLnB1Ymxpc2hIYW5kbGVyKG50LG4sKHQ9UHMoKSlbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLGhpKCJvblVJU3R5bGVDaGFuZ2UiLHtzdHlsZTplLnVpc3R5bGV9KSxOcygpfSksZS5hZGRFdmVudExpc3RlbmVyKCJ1bmlNUE5hdGl2ZUV2ZW50IixmdW5jdGlvbihlKXtoaSgidW5pTVBOYXRpdmVFdmVudCIsZSl9KSxvZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsJHYpLG9nLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoIldlYnZpZXdQb3N0TWVzc2FnZSIsJHYpfWZ1bmN0aW9uICR2KGUpe2UuZGF0YSYmZS5kYXRhLnR5cGUmJnZhKGUuZGF0YS50eXBlLGUuZGF0YS5hcmdzfHx7fSl9ZnVuY3Rpb24gUHYoZSl7dmFyIHQsbixyLGksbz0odD17cGF0aDpkZy5lbnRyeVBhZ2VQYXRoLHF1ZXJ5OmRnLmVudHJ5UGFnZVF1ZXJ5LHJlZmVycmVySW5mbzpkZy5yZWZlcnJlckluZm99LG49dC5wYXRoLHI9dC5xdWVyeSxpPXQucmVmZXJyZXJJbmZvLHhzKFRzLHtwYXRoOm4scXVlcnk6cj9FKHIpOnt9LHJlZmVycmVySW5mbzppfHx7fSxjaGFubmVsOm9nLnJ1bnRpbWUuY2hhbm5lbCxsYXVuY2hlcjpvZy5ydW50aW1lLmxhdW5jaGVyfSkseHMoQ3MsVHMpLFRzKTtkdihlLCJvbkxhdW5jaCIsbyksZHYoZSwib25TaG93IixvKTt2YXIgYT1pZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0QXBwU3RhdGU7Mj09PShhJiZOdW1iZXIoYSgpKSkmJmR2KGUsIm9uSGlkZSIsbyl9ZnVuY3Rpb24gTXYoKXtmdW5jdGlvbiBlKGUpe3JldHVybiAwPT09KGU9ZS5yZXBsYWNlKC9cLyQvLCIiKSkuaW5kZXhPZigiXyIpP29nLmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSk6ZX12YXIgdD1lKG1vKSxuPWUoeW8pLHI9bi5zcGxpdCgiLyIpO3IucG9wKCkscj1yLmpvaW4oIi8iKSxvZy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKG9nLmlvLmNvbnZlcnRBYnNvbHV0ZUZpbGVTeXN0ZW0ociksZnVuY3Rpb24oZSl7ZS5jcmVhdGVSZWFkZXIoKS5yZWFkRW50cmllcyhmdW5jdGlvbihlKXtlJiZlLmxlbmd0aCYmZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaXNEaXJlY3RvcnkmJjA9PT1lLmZ1bGxQYXRoLmluZGV4T2YodCkmJjAhPT1lLmZ1bGxQYXRoLmluZGV4T2YobikmJmUucmVtb3ZlUmVjdXJzaXZlbHkoKX0pfSl9KX1mdW5jdGlvbiBqdihlLHQpe3ZhciBuLHIsaSxvOyhfdj1lKS4kdm09ZSxuPWUsaT10Lm9ic2VydmFibGUoe2xvY2FsZTpyfHxvdC5nZXRMb2NhbGUoKX0pLG89W10sbi4kd2F0Y2hMb2NhbGU9ZnVuY3Rpb24oZSl7by5wdXNoKGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiJGxvY2FsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBpLmxvY2FsZX0sc2V0OmZ1bmN0aW9uKHQpe2kubG9jYWxlPXQsby5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKHQpfSl9fSksT2JqZWN0LmFzc2lnbihfdixFdik7dmFyIGE9ZS4kb3B0aW9ucy5nbG9iYWxEYXRhfHx7fTtfdi5nbG9iYWxEYXRhPU9iamVjdC5hc3NpZ24oYSxfdi5nbG9iYWxEYXRhKSxodihhZy5vbix7Z2V0QXBwOkl2LGdldEN1cnJlbnRQYWdlczpQc30pLEFzKCksZnVuY3Rpb24oKXtpZihkZy50YWJCYXImJmRnLnRhYkJhci5saXN0JiZkZy50YWJCYXIubGlzdC5sZW5ndGgpe2RnLnRhYkJhci5zZWxlY3RlZD0wO3ZhciBlPWRnLnRhYkJhci5saXN0LmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYWdlUGF0aD09PWRnLmVudHJ5UGFnZVBhdGh9KTtxcy5pbml0KGRnLnRhYkJhcixmdW5jdGlvbihlLHQpe3BnLnN3aXRjaFRhYih7dXJsOiIvIitlLnBhZ2VQYXRoLG9wZW5UeXBlOiJzd2l0Y2hUYWIiLGZyb206InRhYkJhciIsc3VjY2VzczpmdW5jdGlvbigpe2FnLmVtaXQoIm9uVGFiSXRlbVRhcCIse2luZGV4OnQsdGV4dDplLnRleHQscGFnZVBhdGg6ZS5wYWdlUGF0aH0pfX0pfSksLTEhPT1lJiYwIT09KGRnLnRhYkJhci5zZWxlY3RlZD1lKSYmcXMuc3dpdGNoVGFiKGRnLmVudHJ5UGFnZVBhdGgpfX0oKSxBdigpLE92KCksUHYoZSksc2coTXYsMWU0KSxkZy5yZWFkeT0hMH12YXIgTHY9WyJ1bmktYXBwIiwidW5pLWxheW91dCIsInVuaS1jb250ZW50IiwidW5pLW1haW4iLCJ1bmktdG9wLXdpbmRvdyIsInVuaS1sZWZ0LXdpbmRvdyIsInVuaS1yaWdodC13aW5kb3ciLCJ1bmktdGFiYmFyIiwidW5pLXBhZ2UiLCJ1bmktcGFnZS1oZWFkIiwidW5pLXBhZ2Utd3JhcHBlciIsInVuaS1wYWdlLWJvZHkiLCJ1bmktcGFnZS1yZWZyZXNoIiwidW5pLWFjdGlvbnNoZWV0IiwidW5pLW1vZGFsIiwidW5pLXRvYXN0IiwidW5pLXJlc2l6ZS1zZW5zb3IiLCJ1bmktc2hhZG93LXJvb3QiLCJ1bmktYWQiLCJ1bmktYXVkaW8iLCJ1bmktYnV0dG9uIiwidW5pLWNhbWVyYSIsInVuaS1jYW52YXMiLCJ1bmktY2hlY2tib3giLCJ1bmktY2hlY2tib3gtZ3JvdXAiLCJ1bmktY292ZXItaW1hZ2UiLCJ1bmktY292ZXItdmlldyIsInVuaS1lZGl0b3IiLCJ1bmktZm9ybSIsInVuaS1mdW5jdGlvbmFsLXBhZ2UtbmF2aWdhdG9yIiwidW5pLWljb24iLCJ1bmktaW1hZ2UiLCJ1bmktaW5wdXQiLCJ1bmktbGFiZWwiLCJ1bmktbGl2ZS1wbGF5ZXIiLCJ1bmktbGl2ZS1wdXNoZXIiLCJ1bmktbWFwIiwidW5pLW1vdmFibGUtYXJlYSIsInVuaS1tb3ZhYmxlLXZpZXciLCJ1bmktbmF2aWdhdG9yIiwidW5pLW9mZmljaWFsLWFjY291bnQiLCJ1bmktb3Blbi1kYXRhIiwidW5pLXBpY2tlciIsInVuaS1waWNrZXItdmlldyIsInVuaS1waWNrZXItdmlldy1jb2x1bW4iLCJ1bmktcHJvZ3Jlc3MiLCJ1bmktcmFkaW8iLCJ1bmktcmFkaW8tZ3JvdXAiLCJ1bmktcmljaC10ZXh0IiwidW5pLXNjcm9sbC12aWV3IiwidW5pLXNsaWRlciIsInVuaS1zd2lwZXIiLCJ1bmktc3dpcGVyLWl0ZW0iLCJ1bmktc3dpdGNoIiwidW5pLXRleHQiLCJ1bmktdGV4dGFyZWEiLCJ1bmktdmlkZW8iLCJ1bmktdmlldyIsInVuaS13ZWItdmlldyJdO2Z1bmN0aW9uIEJ2KGUpe2lmKDA9PT1lLmluZGV4T2YoIiMiKSl7dmFyIHQ9ZS5zdWJzdHIoMSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiEoIWUuY29tcG9uZW50SW5zdGFuY2V8fGUuY29tcG9uZW50SW5zdGFuY2UuaWQhPT10KXx8ISghZS5kYXRhfHwhZS5kYXRhLmF0dHJzfHxlLmRhdGEuYXR0cnMuaWQhPT10KX19aWYoMD09PWUuaW5kZXhPZigiLiIpKXt2YXIgbj1lLnN1YnN0cigxKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGF0YSYmZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQmJih0PSIiKTt2b2lkIDA9PT1uJiYobj0iIik7aWYodClyZXR1cm4tMSE9PXQuc3BsaXQoTnYpLmluZGV4T2YoZSk7aWYobiYmInN0cmluZyI9PXR5cGVvZiBuKXJldHVybi0xIT09bi5zcGxpdChOdikuaW5kZXhPZihlKX0obixlLmRhdGEuc3RhdGljQ2xhc3MsZS5kYXRhLmNsYXNzKX19fXZhciBOdj0vXHMrLztmdW5jdGlvbiBEdihlKXtlLnByb3RvdHlwZS5jcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcj1mdW5jdGlvbihlKXtyZXR1cm4gcGcuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcyxlKX0sZS5wcm90b3R5cGUuY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyPWZ1bmN0aW9uKGUpe3JldHVybiBwZy5jcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXIodGhpcyxlKX0sZS5wcm90b3R5cGUuc2VsZWN0Q29tcG9uZW50PWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBlKHQsbil7aWYobih0LiR2bm9kZXx8dC5fdm5vZGUpKXJldHVybiB0O2Zvcih2YXIgcj10LiRjaGlsZHJlbixpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPWUocltpXSxuKTtpZihvKXJldHVybiBvfX0odGhpcyxCdihlKSl9LGUucHJvdG90eXBlLnNlbGVjdEFsbENvbXBvbmVudHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe24odC4kdm5vZGV8fHQuX3Zub2RlKSYmci5wdXNoKHQpO2Zvcih2YXIgaT10LiRjaGlsZHJlbixvPTA7bzxpLmxlbmd0aDtvKyspZShpW29dLG4scik7cmV0dXJuIHJ9KHRoaXMsQnYoZSksW10pfX1mdW5jdGlvbiBSdihlLHQsbil7aWYoIWUuJHBhcmVudClyZXR1cm4iLTEiO3ZhciByPWUuJHZub2RlLGk9ci5jb250ZXh0LG89ci5kYXRhLmF0dHJzLl9pO3JldHVybiBuJiZrKHIuZGF0YSwia2V5IikmJihvPW8rIjsiK3IuZGF0YS5rZXkpLGkmJmkhPT10JiZpLl8kaWQ/aS5fJGlkKyI7Iit0Ll8kaWQrIiwiK286dC5fJGlkKyIsIitvfXZhciBGdixVdix6dj0iYW5kcm9pZCI9PT1vZy5vcy5uYW1lLnRvTG93ZXJDYXNlKCk/MzAwOjcwMCxWdj0wO2Z1bmN0aW9uIHF2KGUpe3JldHVybiBlLnByZXZlbnREZWZhdWx0PWYsZS5zdG9wUHJvcGFnYXRpb249ZiwodD1lKS5tcD1PYmplY3QuYXNzaWduKHsiQHdhcm5pbmciOiJtcCBpcyBkZXByZWNhdGVkIn0sdCksdC5fcHJvY2Vzc2VkPSEwLHQ7dmFyIHR9a2woIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe2lmKDA8KFZ2PWUuaGVpZ2h0KSl7dmFyIHQ9RnY7RnY9bnVsbCx0JiZ0KCl9fSk7dmFyIFd2PXt9O1d2WzIwXT1mdW5jdGlvbihlLHMpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lWzBdLG49ZVsxXSxyPWVbMl07bj1TdHJpbmcobik7dmFyIGk9cy5lbGVtZW50cy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNpZD09PXQmJmUubmlkPT09bn0pO2lmKGkpe3ZhciBvPXIudHlwZSxhPXF2KHIpOyJmb2N1cyI9PT1vfHwiYmx1ciI9PT1vP2Z1bmN0aW9uKGUsdCl7aWYoRnY9bnVsbCxVdiYmY2coVXYpLCJmb2N1cyI9PT1lLnR5cGUpe2lmKCEoMDxWdikpcmV0dXJuIFV2PXNnKGZ1bmN0aW9uKCl7ZS5kZXRhaWwuaGVpZ2h0PVZ2LHQoZSl9LHp2KSxGdj1mdW5jdGlvbigpe2NnKFV2KSxlLmRldGFpbC5oZWlnaHQ9VnYsdChlKX07ZS5kZXRhaWwuaGVpZ2h0PVZ2fXQoZSl9KGEsZnVuY3Rpb24oZSl7aS5kaXNwYXRjaEV2ZW50KG8sZSl9KTppLmRpc3BhdGNoRXZlbnQobyxhKX19KX07dmFyIEh2PWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGFnZUlkPWUsdGhpcy5wYWdlUGF0aD10LHRoaXMucGFnZVF1ZXJ5PW4sdGhpcy5wYWdlVm09cix0aGlzLmJhdGNoRGF0YT1bXSx0aGlzLnZtcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5wYWdlQ3JlYXRlRGF0YT0hMSx0aGlzLmVsZW1lbnRzPVtdLHRoaXMuX2luaXQoKX07ZnVuY3Rpb24gR3YoZSx0LG4pe2VbdF09bn1mdW5jdGlvbiBYdihlLHQpe3ZhciBuLHIsaTtmb3IociBpbiBlKWk9ZVtyXSxfKHRbcl0saSl8fEd2KG58fChuPU9iamVjdC5jcmVhdGUobnVsbCkpLHIsaSk7cmV0dXJuIG59ZnVuY3Rpb24gSnYoZSx0LG4pe3ZhciByLGksbztmb3IociBpbiBlKWlmKGk9ZVtyXSxvPXRbcl0pe3ZhciBhPVh2KGksbyk7YSYmR3YobixyLGEpfWVsc2UgR3YobixyLGkpO3JldHVybiBufWZ1bmN0aW9uIFl2KG4scil7dmFyIGU9ci4kb3B0aW9ucy5tcE9wdGlvbnM7cmV0dXJuIGUmJkFycmF5LmlzQXJyYXkoZS5leHRlcm5hbENsYXNzZXMpJiZlLmV4dGVybmFsQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZyhlKV07dCYmKG49bi5yZXBsYWNlKGUsdCkpfSksbn1mdW5jdGlvbiBLdihlLHQsbil7c3dpdGNoKHQpe2Nhc2UgbGE6bj1Zdih0aGlzLl8kc3RyaW5naWZ5Q2xhc3MobiksdGhpcyk7YnJlYWs7Y2FzZSBmYTpuPVl2KG4sdGhpcyk7YnJlYWs7Y2FzZSBkYTpuPXRoaXMuXyRub3JtYWxpemVTdHlsZUJpbmRpbmcobik7YnJlYWs7Y2FzZSBzYTpjYXNlIHVhOmNhc2UgY2E6bj1uPzE6MDticmVhaztjYXNlIGFhOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuXyRuZXdEYXRhW2VdfHwodGhpcy5fJG5ld0RhdGFbZV09e30pLHI9blthYV18fChuW2FhXT1bXSk7aWYodC5mb3JJdGVtcylyZXR1cm4gdC5maWxsJiZmdW5jdGlvbihlLHQpe3ZhciBuLHI7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRbbl09bjtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobj0wO248ZTtuKyspdFtuXT1uO2Vsc2UgaWYoZChlKSlmb3Iobj0wLHI9T2JqZWN0LmtleXMoZSkubGVuZ3RoO248cjtuKyspdFtuXT1ufSh0LmZvckl0ZW1zLHIpLHQuZm9ySXRlbXM7dmFyIGk9dC5mb3JJbmRleCxvPXQua2V5O2sodCwia2V5SW5kZXgiKT8oIm9iamVjdCIhPXR5cGVvZiByW2ldJiYocltpXT17fSkscltpXVsiayIrdC5rZXlJbmRleF09byk6cltpXT1vO3JldHVybiBvfS5jYWxsKHRoaXMsZSxuKTtjYXNlImlzIjoiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49bi5vcHRpb25zKX1yZXR1cm4odGhpcy5fJG5ld0RhdGFbZV18fCh0aGlzLl8kbmV3RGF0YVtlXT17fSkpW3RdPW59SHYucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKCl7dmFyIGUsdCxuPXRoaXM7ZT10aGlzLnBhZ2VJZCx0PWZ1bmN0aW9uKGUpe3ZhciByO3I9bixlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXSxuPWVbMV07V3ZbdF0obixyKX0pfSwobXZbZV18fChtdltlXT1bXSkpLnB1c2godCl9LEh2LnByb3RvdHlwZS5hZGRNb3VudGVkVm09ZnVuY3Rpb24oZSl7ZS5fJG1vdW50ZWQoKSx0aGlzLmFkZFZkU3luY0NhbGxiYWNrKGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygibW91bnRlZCIpfSl9LEh2LnByb3RvdHlwZS5hZGRVcGRhdGVkVm09ZnVuY3Rpb24oZSl7ZS5fJHVwZGF0ZWQoKSx0aGlzLmFkZFZkU3luY0NhbGxiYWNrKGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygidXBkYXRlZCIpfSl9LEh2LnByb3RvdHlwZS5hZGRWZFN5bmNDYWxsYmFjaz1mdW5jdGlvbihlKXtDKGUpJiZidi5wdXNoKGUpfSxIdi5wcm90b3R5cGUuZ2V0Vm09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudm1zW2VdfSxIdi5wcm90b3R5cGUuYWRkVm09ZnVuY3Rpb24oZSl7dmFyIG49ZS5fJGlkLHQ9dGhpcy52bXNbbl07aWYodCl7dmFyIHI9UnYodCx0LiRwYXJlbnQsWGEpO3QuXyRpZD1yLHRoaXMudm1zW3JdPXQsdGhpcy5lbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2lkO2UuY2lkPXQ9PT1uP3I6dH0pfXRoaXMudm1zW25dPWV9LEh2LnByb3RvdHlwZS5yZW1vdmVWbT1mdW5jdGlvbihlKXt2YXIgdD1lLl8kaWQ7ZT09PXRoaXMudm1zW3RdJiYodGhpcy5iYXRjaERhdGE9dGhpcy5iYXRjaERhdGEuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlWzFdWzBdIT09dH0pLGRlbGV0ZSB0aGlzLnZtc1t0XSl9LEh2LnByb3RvdHlwZS5hZGRFbGVtZW50PWZ1bmN0aW9uKGUpey0xPT09dGhpcy5lbGVtZW50cy5pbmRleE9mKGUpJiZ0aGlzLmVsZW1lbnRzLnB1c2goZSl9LEh2LnByb3RvdHlwZS5yZW1vdmVFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZWxlbWVudHMuaW5kZXhPZihlKTstMSE9PXQmJnRoaXMuZWxlbWVudHMuc3BsaWNlKHQsMSl9LEh2LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPVt0LG5dO3ImJmkucHVzaChyKSx0aGlzLmJhdGNoRGF0YS5wdXNoKFtlLGldKX0sSHYucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5iYXRjaERhdGEuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZVswXT09PXQmJmVbMV1bMF09PT1ufSl9LEh2LnByb3RvdHlwZS5zZW5kUGFnZUNyZWF0ZT1mdW5jdGlvbihlKXt0aGlzLnBhZ2VDcmVhdGVEYXRhPWUsYWcucHVibGlzaEhhbmRsZXIoSmEse2RhdGE6W1syLGVdXSxvcHRpb25zOnt0aW1lc3RhbXA6RGF0ZS5ub3coKX19LFt0aGlzLnBhZ2VJZF0pfSxIdi5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxpemVkfHwodGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLmJhdGNoRGF0YS5wdXNoKFsxMCxbdGhpcy5wYWdlSWQsdGhpcy5wYWdlUGF0aCx0aGlzLnBhZ2VRdWVyeV1dKSk7dmFyIGU9dGhpcy5iYXRjaERhdGEuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiEoNj09PWVbMF0mJiFPYmplY3Qua2V5cyhlWzFdWzFdKS5sZW5ndGgpfSk7dGhpcy5iYXRjaERhdGEubGVuZ3RoPTAsZS5sZW5ndGgmJmFnLnB1Ymxpc2hIYW5kbGVyKEphLHtkYXRhOmUsb3B0aW9uczp7dGltZXN0YW1wOkRhdGUubm93KCl9fSxbdGhpcy5wYWdlSWRdKX0sSHYucHJvdG90eXBlLnJlc3RvcmVQYWdlQ3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5iYXRjaERhdGEucHVzaChbMix0aGlzLnBhZ2VDcmVhdGVEYXRhXSl9LEh2LnByb3RvdHlwZS5yZXN0b3JlTW91bnRlZERhdGE9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZnVuY3Rpb24oZSl7ZS5fJGlkJiZ0LnB1c2goNCxlLl8kaWQsZS5fJGRhdGEsdm9pZCAwKSxlLiRjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBuKGUpfSl9O24odGhpcy5wYWdlVm0pfSxIdi5wcm90b3R5cGUucmVzdG9yZVBhZ2VDcmVhdGVkPWZ1bmN0aW9uKCl7dGhpcy5iYXRjaERhdGEucHVzaChbMTAsW3RoaXMucGFnZUlkLHRoaXMucGFnZVBhdGgsdGhpcy5wYWdlUXVlcnldXSl9LEh2LnByb3RvdHlwZS5yZXN0b3JlPWZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCx0aGlzLnJlc3RvcmVQYWdlQ3JlYXRlKCksdGhpcy5yZXN0b3JlTW91bnRlZERhdGEoKSx0aGlzLnJlc3RvcmVQYWdlQ3JlYXRlZCgpLHRoaXMuZmx1c2goKX0sSHYucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCx0aGlzLnZtcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5lbGVtZW50cy5sZW5ndGg9MCxlPXRoaXMucGFnZUlkLGRlbGV0ZSBtdltlXX07dmFyIFp2PVsib25MYXVuY2giLCJvblNob3ciLCJvbkhpZGUiLCJvblVuaU5WaWV3TWVzc2FnZSIsIm9uUGFnZU5vdEZvdW5kIiwib25UaGVtZUNoYW5nZSIsIm9uRXJyb3IiLCJvblVuaGFuZGxlZFJlamVjdGlvbiIsIm9uSW5pdCIsIm9uTG9hZCIsIm9uUmVhZHkiLCJvblVubG9hZCIsIm9uUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbSIsIm9uVGFiSXRlbVRhcCIsIm9uQWRkVG9GYXZvcml0ZXMiLCJvblNoYXJlVGltZWxpbmUiLCJvblNoYXJlQXBwTWVzc2FnZSIsIm9uUmVzaXplIiwib25QYWdlU2Nyb2xsIiwib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIiwib25CYWNrUHJlc3MiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIiwib25QYWdlU2hvdyIsIm9uUGFnZUhpZGUiLCJvblBhZ2VSZXNpemUiLCJvblNlcnZpY2VDcmVhdGVkIiwib25TZXJ2aWNlQXR0YWNoZWQiXSxRdj1bImRhdGEiLCJwcm9wZXJ0aWVzIiwib3B0aW9ucyIsInJlbGF0aW9ucyJdO2Z1bmN0aW9uIGVnKGksbyl7dmFyIGUsdDtRdi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0LG4scjt0PWksKG49bylbcj1lXSYmT2JqZWN0LmFzc2lnbih0W3JdfHwodFtyXT17fSksbltyXSl9KSxvLmV4dGVybmFsQ2xhc3NlcyYmKGU9aS5leHRlcm5hbENsYXNzZXN8fChpLmV4dGVybmFsQ2xhc3Nlcz1bXSksdD1vLmV4dGVybmFsQ2xhc3NlcyxlLnB1c2guYXBwbHkoZSx0KSksby5wYXRoJiYoaS5wYXRoPW8ucGF0aCl9ZnVuY3Rpb24gdGcoZyl7IWZ1bmN0aW9uKGUpe3ZhciBpPWUuZXh0ZW5kO2UuZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBuPSh0PXR8fHt9KS5tZXRob2RzO24mJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7LTEhPT1adi5pbmRleE9mKGUpJiYodFtlXT1uW2VdLGRlbGV0ZSBuW2VdKX0pO3ZhciBlPXQuc2V0dXA7aWYoZSl7dmFyIHI9IiI7dHJ5e3I9ZS50b1N0cmluZygpfWNhdGNoKGUpe31bIm9uUGFnZVNjcm9sbCIsIm9uUmVhY2hCb3R0b20iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuaW5kZXhPZigidW5pQXBwLiIrZSkmJiF0W2VdJiYodFtlXT1bZnVuY3Rpb24oKXt9XSl9KX1yZXR1cm4gaS5jYWxsKHRoaXMsdCl9O3ZhciB0PWUuY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcyxuPXQuY3JlYXRlZDtadi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pLHQubXBPcHRpb25zPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIHQ7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZWcobixlKSx0JiZlZyhuLHQpLG59fShnKSxnLm1peGluKHtiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy4kb3B0aW9ucztlLnN0b3JlJiYhZy5wcm90b3R5cGUuJHN0b3JlJiYoZy5wcm90b3R5cGUuJHN0b3JlPWUuc3RvcmUpO3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGY9ZS53eHM7aWYoZiYmT2JqZWN0LmtleXMoZikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZbZV19KSwicGFnZSI9PT10aGlzLm1wVHlwZSl7dmFyIHA9aGcoKTtwLiR2bSYmcC4kdm0uJGkxOG4mJih0aGlzLl9pMThuPXAuJHZtLiRpMThuKSx0aGlzLiRzY29wZT10aGlzLiRvcHRpb25zLnBhZ2VJbnN0YW5jZSxkZWxldGUodGhpcy4kc2NvcGUuJHZtPXRoaXMpLiRvcHRpb25zLnBhZ2VJbnN0YW5jZTt2YXIgaD10aGlzLiRzY29wZS5yb3V0ZSx2PXRoaXMuJHNjb3BlLiRwYWdlLmlkO3RoaXMuXyR2ZC5zZW5kUGFnZUNyZWF0ZShbdixoLChuPXRoaXMscj1oLGk9Ii8iK3Isbz1mZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1pfSksYT1PYmplY3QuYXNzaWduKHt9LGRnLndpbmRvdyxvLndpbmRvdykscz0hMD09PWEuZGlzYWJsZVNjcm9sbD8xOjAsYz1rKGEsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIpP3BhcnNlSW50KGEub25SZWFjaEJvdHRvbURpc3RhbmNlKTppYSx1PUx1KG4uJG9wdGlvbnMsIm9uUGFnZVNjcm9sbCIpPzE6MCxsPUx1KG4uJG9wdGlvbnMsIm9uUmVhY2hCb3R0b20iKT8xOjAsZD1xYSgpLHt2ZXJzaW9uOlhhLGxvY2FsZTppZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKSxkaXNhYmxlU2Nyb2xsOnMsb25QYWdlU2Nyb2xsOnUsb25QYWdlUmVhY2hCb3R0b206bCxvblJlYWNoQm90dG9tRGlzdGFuY2U6YyxzdGF0dXNiYXJIZWlnaHQ6ZCx3aW5kb3dUb3A6YS50aXRsZU5WaWV3JiYiZmxvYXQiPT09YS50aXRsZU5WaWV3LnR5cGU/ZCt0dDowLHdpbmRvd0JvdHRvbTowPD1xcy5pbmRleE9mKHIpJiZxcy5jb3Zlcj9xcy5oZWlnaHQ6MH0pXSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJihmdih0aGlzLiRzY29wZSwib25Mb2FkIixmdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9e307cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24odCl7dHJ5e3JbdF09TyhuW3RdKX1jYXRjaChlKXtyW3RdPW5bdF19fSkscn0odGhpcy4kb3B0aW9ucy5wYWdlUXVlcnkpKSxmdih0aGlzLiRzY29wZSwib25TaG93IikpfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJmZ2KHRoaXMuJHNjb3BlLCJvblVubG9hZCIpfSxtb3VudGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJihmdih0aGlzLiRzY29wZSwib25SZWFkeSIpLGZ1bmN0aW9uKGUpe2lmKGRnLnByZWxvYWRSdWxlKXt2YXIgdD1kZy5wcmVsb2FkUnVsZVtlXTt0JiZBcnJheS5pc0FycmF5KHQucGFja2FnZXMpJiZ0LnBhY2thZ2VzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4tMT09PWJzLmluZGV4T2YoZSl9KS5sZW5ndGgmJlNzKHQucGFja2FnZXMpfX0odGhpcy4kc2NvcGUucm91dGUpKX19KX12YXIgbmc9e2luc3RhbGw6ZnVuY3Rpb24obyxlKXt2YXIgdCxuOyFmdW5jdGlvbihvKXtvLmNvbmZpZy5lcnJvckhhbmRsZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXAoZSk7by51dGlsLndhcm4oIkVycm9yIGluICIrbisnOiAiJysoIkVycm9yIj09PXI/ZS50b1N0cmluZygpOmUpKyciJyx0KTt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgaGcmJmhnKCk7aSYmTHUoaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9O3ZhciB0PW8uY29uZmlnLmlzUmVzZXJ2ZWRUYWc7by5jb25maWcuaXNSZXNlcnZlZFRhZz1mdW5jdGlvbihlKXtyZXR1cm4tMSE9PUx2LmluZGV4T2YoZSl8fHQoZSl9LG8uY29uZmlnLmlnbm9yZWRFbGVtZW50cz1Mdjt2YXIgbj1vLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2Uscj1bInN3aXRjaCIsImltYWdlIiwidGV4dCIsInZpZXciXTtvLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIX5yLmluZGV4T2YoZSkmJm4oZSl9fShvKSwodD1vKS5wcm90b3R5cGUuXyRzPUt2LHQucHJvdG90eXBlLl8kc2V0RGF0YT1mdW5jdGlvbihlLHQpe3RoaXMuXyR2ZC5wdXNoKGUsdGhpcy5fJGlkLHQsND09PWUmJnZvaWQgMCl9LHQucHJvdG90eXBlLl8kbW91bnRlZD1mdW5jdGlvbigpe3RoaXMuXyR2ZCYmKEp2KHRoaXMuXyRuZXdEYXRhLHRoaXMuXyRkYXRhLHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuXyRuZXdEYXRhKSksInBhZ2UiPT09dGhpcy5tcFR5cGUmJnRoaXMuXyR2ZC5mbHVzaCgpKX0sdC5wcm90b3R5cGUuXyR1cGRhdGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl8kdmQmJihKdih0aGlzLl8kbmV3RGF0YSx0aGlzLl8kZGF0YSx0aGlzLl8kdmRVcGRhdGVkRGF0YSksdGhpcy5fJGRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLl8kbmV3RGF0YSkpLHRoaXMuXyR2ZC5pbml0aWFsaXplZCYmc2coZnVuY3Rpb24oKXtlLiRuZXh0VGljayhlLl8kdmQuZmx1c2guYmluZChlLl8kdmQpKX0sMCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIl8kdmQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC5fJHZkb21TeW5jfX0pLHQubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3RoaXMuJG9wdGlvbnMubXBUeXBlJiYodGhpcy5tcFR5cGU9dGhpcy4kb3B0aW9ucy5tcFR5cGUpLCJhcHAiIT09dGhpcy5tcFR5cGUmJigicGFnZSI9PT10aGlzLm1wVHlwZSYmKHRoaXMuXyR2ZG9tU3luYz1uZXcgSHYodGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCx0aGlzLiRvcHRpb25zLnBhZ2VRdWVyeSx0aGlzKSksdGhpcy5fJHZkJiYodGhpcy5fJGlkPVJ2KHRoaXMsdGhpcy4kcGFyZW50LFhhKSx0aGlzLl8kdmQuYWRkVm0odGhpcyksdGhpcy5fJHZkTW91bnRlZERhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kc2V0RGF0YSg0LHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRuZXdEYXRhPU9iamVjdC5jcmVhdGUobnVsbCkpKX0sYmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fJHZkKXt2YXIgZT10aGlzLl8kdmQuZmluZCg0LHRoaXMuXyRpZCk7ZT8odGhpcy5fJGRhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kdmRVcGRhdGVkRGF0YT1lWzFdWzFdPU9iamVjdC5jcmVhdGUobnVsbCkpOih0aGlzLl8kdmRVcGRhdGVkRGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRzZXREYXRhKDYsdGhpcy5fJHZkVXBkYXRlZERhdGEpKSx0aGlzLl8kbmV3RGF0YT1PYmplY3QuY3JlYXRlKG51bGwpfX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuXyR2ZCYmKHRoaXMuXyR2ZC5yZW1vdmVWbSh0aGlzKSx0aGlzLl8kdmRvbVN5bmMmJnRoaXMuXyR2ZG9tU3luYy5kZXN0cm95KCkpfX0pLHRnKG8pLER2KG8pLChuPW8pLnByb3RvdHlwZS51bmlJREhhc1JvbGU9ZnVuY3Rpb24oZSl7cmV0dXJuLTE8YygpLnJvbGUuaW5kZXhPZihlKX0sbi5wcm90b3R5cGUudW5pSURIYXNQZXJtaXNzaW9uPWZ1bmN0aW9uKGUpe3ZhciB0PWMoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxuLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLnRva2VuRXhwaXJlZD5EYXRlLm5vdygpfSxvLnByb3RvdHlwZS5nZXRPcGVuZXJFdmVudENoYW5uZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfHwodGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsPW5ldyBQdSksdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsIiRwYWdlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvb3QuJHNjb3BlLiRwYWdlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJG1wIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue3BhZ2U6dGhpcy4kcm9vdC4kc2NvcGV9fX0pO3ZhciByPW8ucHJvdG90eXBlLiRtb3VudDtvLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCJhcHAiPT09dGhpcy5tcFR5cGUpe2lmKHRoaXMuJG9wdGlvbnMucmVuZGVyPWZ1bmN0aW9uKCl7fSxpZy5jb25maWcucHJlbG9hZClyZXR1cm4gdm9pZCBpZy5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtvZy51cGRhdGVDb25maWdJbmZvJiZvZy51cGRhdGVDb25maWdJbmZvKCksanYobixvKSxyLmNhbGwobixlLHQpfSk7anYodGhpcyxvKX1yZXR1cm4gci5jYWxsKHRoaXMsZSx0KX0sby5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMscj10aGlzLl93YXRjaGVyLGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQsZT1uZXcgUHJvbWlzZShmdW5jdGlvbihlKXtyJiZuLl8kcXVldWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gcj09PWV9KT9idi5wdXNoKGk/dC5iaW5kKG4pOmUpOm8ubmV4dFRpY2soaT9mdW5jdGlvbigpe3JldHVybiB0LmNhbGwobil9OmUpLGkmJmUoKX0pO3JldHVybiBpP3ZvaWQgMDplfX19O3JldHVybiB1di5fXyR3eF9fPWx2LGFnLnB1Ymxpc2hIYW5kbGVyPWZ1bmN0aW9uKGUsdCxuKXt0PUpTT04uc3RyaW5naWZ5KHQpLEFycmF5LmlzQXJyYXkobil8fChuPVtuXSk7dmFyIHI9InR5cGVvZiBVbmlWaWV3SlNCcmlkZ2UgIT09ICd1bmRlZmluZWQnICYmIFVuaVZpZXdKU0JyaWRnZS5zdWJzY3JpYmVIYW5kbGVyKFwiIitlKyciLCcrdCsiLF9fUEFHRV9JRF9fKSI7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKGUpKTt0JiZ0LmV2YWxKUyhyLnJlcGxhY2UoIl9fUEFHRV9JRF9fIixlKSl9KX0sYWcuaW52b2tlQ2FsbGJhY2tIYW5kbGVyPU5yLGFnLnJlbW92ZUNhbGxiYWNrSGFuZGxlcj1mdW5jdGlvbihlKXtkZWxldGUgTHJbZV19LHtfX3Z1ZVBsdWdpbjpuZyxfX2RlZmluZVBhZ2U6ZnVuY3Rpb24oZSx0KXt5c1tlXT10fSxfX3JlZ2lzdGVyQXBwOmp2LF9fcmVnaXN0ZXJQYWdlOmpzLHVuaTp1dixnZXRBcHA6SXYsZ2V0Q3VycmVudFBhZ2VzOlBzLEV2ZW50Q2hhbm5lbDpQdX19KCkscGc9dC51bmksaGc9dC5nZXRBcHAsdmc9dC5nZXRDdXJyZW50UGFnZXM7cmV0dXJuIHR9ZnVuY3Rpb24gY3JlYXRlUmVxdWVzdFBlcm1pc3Npb25MaXN0ZW5lcihlKXt2YXIgdD1lLnJlZ2lzdGVyVVRTSW50ZXJmYWNlLG49KGUuaW5pdFVUU1Byb3h5Q2xhc3MsZS5pbml0VVRTUHJveHlGdW5jdGlvbikscj1lLmluaXRVVFNQYWNrYWdlTmFtZSxpPWUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLG89ZS5pbml0VVRTQ2xhc3NOYW1lLGE9IkRDbG91ZFVuaUNyZWF0ZVJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXIiLHM9InVuaS1jcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyIixjPXIoYSwhMCksdT1pKGEsITApO3QoIlJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXJPcHRpb25zIixPYmplY3QuYXNzaWduKHttb2R1bGVOYW1lOnMsbW9kdWxlVHlwZToiYnVpbHQtaW4iLGVyck1zZzoiIixwYWNrYWdlOmMsY2xhc3M6byhhLCJSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyQnlKc1Byb3h5IiwhMCl9LHttZXRob2RzOntvblJlcXVlc3RCeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJjYWxsYmFjayIsdHlwZToiVVRTQ2FsbGJhY2sifV0scmV0dXJuOnt9fSxvbkNvbmZpcm1CeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJjYWxsYmFjayIsdHlwZToiVVRTQ2FsbGJhY2sifV0scmV0dXJuOnt9fSxvbkNvbXBsZXRlQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToiY2FsbGJhY2siLHR5cGU6IlVUU0NhbGxiYWNrIn1dLHJldHVybjp7fX0sc3RvcEJ5SnM6e2FzeW5jOiExLHBhcmFtczpbXSxyZXR1cm46e319fSxwcm9wczpbXX0pKSxlLmNyZWF0ZVJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXI9bighMSx7bW9kdWxlTmFtZTpzLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOmMsY2xhc3M6dSxuYW1lOiJjcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyQnlKcyIscGFyYW1zOltdLHJldHVybjp7dHlwZToiaW50ZXJmYWNlIixvcHRpb25zOiJSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyT3B0aW9ucyJ9fSl9ZnVuY3Rpb24gZXhpdChlKXtlLnJlZ2lzdGVyVVRTSW50ZXJmYWNlLGUuaW5pdFVUU1Byb3h5Q2xhc3M7dmFyIHQ9ZS5pbml0VVRTUHJveHlGdW5jdGlvbixuPWUuaW5pdFVUU1BhY2thZ2VOYW1lLHI9ZS5pbml0VVRTSW5kZXhDbGFzc05hbWUsaT0oZS5pbml0VVRTQ2xhc3NOYW1lLCJEQ2xvdWRVbmlFeGl0Iiksbz1uKGksITApLGE9cihpLCEwKTtlLmV4aXQ9dCghMSx7bW9kdWxlTmFtZToidW5pLWV4aXQiLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOm8sY2xhc3M6YSxuYW1lOiJleGl0QnlKcyIscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUV4aXRFeGl0T3B0aW9uc0pTT05PYmplY3QiLGRlZmF1bHQ6IlVUU051bGwifV0scmV0dXJuOiIifSl9ZnVuY3Rpb24gZmFjaWFsUmVjb2duaXRpb25WZXJpZnkoZSl7ZS5yZWdpc3RlclVUU0ludGVyZmFjZSxlLmluaXRVVFNQcm94eUNsYXNzO3ZhciB0PWUuaW5pdFVUU1Byb3h5RnVuY3Rpb24sbj1lLmluaXRVVFNQYWNrYWdlTmFtZSxyPWUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLGk9KGUuaW5pdFVUU0NsYXNzTmFtZSwiRENsb3VkVW5pRmFjaWFsUmVjb2duaXRpb25WZXJpZnkiKSxvPSJGYWNpYWxSZWNvZ25pdGlvblZlcmlmeSjlrp7kurrorqTor4EpIixhPW4oaSwhMCkscz1yKGksITApO2Uuc3RhcnRGYWNpYWxSZWNvZ25pdGlvblZlcmlmeT10KCExLHttb2R1bGVOYW1lOm8sbW9kdWxlVHlwZToiYnVpbHQtaW4iLGVyck1zZzoiIixtYWluOiEwLHBhY2thZ2U6YSxjbGFzczpzLG5hbWU6InN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlCeUpzIixwYXJhbXM6W3tuYW1lOiJmYWNlU3R5bGUiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeVN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KSxlLmdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm89dCghMSx7bW9kdWxlTmFtZTpvLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOmEsY2xhc3M6cyxuYW1lOiJnZXRGYWNpYWxSZWNvZ25pdGlvbk1ldGFJbmZvQnlKcyIscGFyYW1zOltdLHJldHVybjoiIn0pfWZ1bmN0aW9uIGluc3RhbGxBcGsoZSl7ZS5yZWdpc3RlclVUU0ludGVyZmFjZSxlLmluaXRVVFNQcm94eUNsYXNzO3ZhciB0PWUuaW5pdFVUU1Byb3h5RnVuY3Rpb24sbj1lLmluaXRVVFNQYWNrYWdlTmFtZSxyPWUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLGk9KGUuaW5pdFVUU0NsYXNzTmFtZSwiRENsb3VkVW5pSW5zdGFsbEFwayIpLG89bihpLCEwKSxhPXIoaSwhMCk7ZS5pbnN0YWxsQXBrPXQoITEse21vZHVsZU5hbWU6InVuaS1pbnN0YWxsQXBrIixtb2R1bGVUeXBlOiJidWlsdC1pbiIsZXJyTXNnOiIiLG1haW46ITAscGFja2FnZTpvLGNsYXNzOmEsbmFtZToiaW5zdGFsbEFwa0J5SnMiLHBhcmFtczpbe25hbWU6Im9wdGlvbnMiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlJbnN0YWxsQXBrSW5zdGFsbEFwa09wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjoiIn0pfWZ1bmN0aW9uIGluaXRVbmlFeHRBcGlzKGUpe2NyZWF0ZVJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXIoZSksZXhpdChlKSxmYWNpYWxSZWNvZ25pdGlvblZlcmlmeShlKSxpbnN0YWxsQXBrKGUpfWZ1bmN0aW9uIGluaXRTZXJ2aWNlSlNCcmlkZ2UoZSl7dmFyIHI9bmV3IGU7VW5pU2VydmljZUpTQnJpZGdlPXtvbjpyLiRvbi5iaW5kKHIpLG9mZjpyLiRvZmYuYmluZChyKSxvbmNlOnIuJG9uY2UuYmluZChyKSxlbWl0OnIuJGVtaXQuYmluZChyKSxzdWJzY3JpYmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci4kb24oInZpZXcuIitlLHQpfSx1bnN1YnNjcmliZTpmdW5jdGlvbihlLHQpe3JldHVybiByLiRvZmYoInZpZXcuIitlLHQpfSxzdWJzY3JpYmVIYW5kbGVyOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gci4kZW1pdCgidmlldy4iK2UsdCxuKX19fWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlQ29udGV4dCQxKGUpe3ZhciB0LG49ZS53ZWV4LHI9ZS5WdWUsaT1uZXcgZS5XZWV4UGx1cyhuKTsoVW5pU2VydmljZUpTQnJpZGdlfHxpbml0U2VydmljZUpTQnJpZGdlKHIpLHVuaSl8fCh0PWNyZWF0ZVNlcnZpY2VDb250ZXh0KHIsbixpLFVuaVNlcnZpY2VKU0JyaWRnZSxlKSxfX3Z1ZVBsdWdpbj10Ll9fdnVlUGx1Z2luLF9fZGVmaW5lUGFnZT10Ll9fZGVmaW5lUGFnZSxfX3JlZ2lzdGVyQXBwPXQuX19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZT10Ll9fcmVnaXN0ZXJQYWdlLHVuaT10LnVuaSxnZXRBcHA9dC5nZXRBcHAsZ2V0Q3VycmVudFBhZ2VzPXQuZ2V0Q3VycmVudFBhZ2VzLGluaXRVbmlFeHRBcGlzKHVuaSkpO3JldHVybntfX3Z1ZVBsdWdpbjpfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2U6X19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHA6X19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZTpfX3JlZ2lzdGVyUGFnZSxwbHVzOmksdW5pOnVuaSx3eDp1bmkuX18kd3hfX3x8dW5pLGdldEFwcDpnZXRBcHAsZ2V0Q3VycmVudFBhZ2VzOmdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U6VW5pU2VydmljZUpTQnJpZGdlfX1mdW5jdGlvbiBzdHlsZU1peGluKGUpe2UucHJvdG90eXBlLl9fbWVyZ2Vfc3R5bGU9ZnVuY3Rpb24ocixlKXtpZih2b2lkIDA9PT1yJiYocj17fSkscil7dmFyIGk9ZXx8dGhpcy4kb3B0aW9ucy5zdHlsZTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07aWYodCl7dmFyIG49cltlXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBhPW5bZV0scz10W2VdOyJvYmplY3QiPT10eXBlb2YgYT8oIm9iamVjdCIhPXR5cGVvZiBzJiYocz10W2VdPXt9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PSEwO2lmKHNbZV0pZm9yKHZhciBuPWFbZV0uc2xpY2UoMSwzKSxyPXNbZV0uc2xpY2UoMSwzKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPW5baV0tcltpXTtpZigwIT09byl7dD0wPG87YnJlYWt9fXQmJihzW2VdPWFbZV0pfSkpOnRbZV09YX0pfWVsc2UgaVtlXT1PYmplY3QuYXNzaWduKHt9LHJbZV0pfSksZXx8KHRoaXMuJG9wdGlvbnMuc3R5bGU9aSl9fX1mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYXRvYihlKS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSl9ZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJJbmZvKCl7dmFyIGUsdD10aGlzLnVuaS5nZXRTdG9yYWdlU3luYygidW5pX2lkX3Rva2VuIil8fCIiLG49dC5zcGxpdCgiLiIpO2lmKCF0fHwzIT09bi5sZW5ndGgpcmV0dXJue3VpZDpudWxsLHJvbGU6W10scGVybWlzc2lvbjpbXSx0b2tlbkV4cGlyZWQ6MH07dHJ5e2U9SlNPTi5wYXJzZShiNjREZWNvZGVVbmljb2RlKG5bMV0pKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8miIrZS5tZXNzYWdlKX1yZXR1cm4gZS50b2tlbkV4cGlyZWQ9MWUzKmUuZXhwLGRlbGV0ZSBlLmV4cCxkZWxldGUgZS5pYXQsZX1mdW5jdGlvbiB1bmlJZE1peGluKGUsbil7ZS5wcm90b3R5cGUudW5pSURIYXNSb2xlPWZ1bmN0aW9uKGUpe3JldHVybi0xPGdldEN1cnJlbnRVc2VySW5mby5iaW5kKG4pKCkucm9sZS5pbmRleE9mKGUpfSxlLnByb3RvdHlwZS51bmlJREhhc1Blcm1pc3Npb249ZnVuY3Rpb24oZSl7dmFyIHQ9Z2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxlLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS50b2tlbkV4cGlyZWQ+RGF0ZS5ub3coKX19V2VleEluc3RhbmNlLnByb3RvdHlwZS5yZXF1aXJlTW9kdWxlPWZ1bmN0aW9uKG4pe3ZhciByPWdldElkKHRoaXMpO2lmKHImJnRoaXMuZG9jdW1lbnQmJnRoaXMuZG9jdW1lbnQudGFza0NlbnRlcil7aWYoaXNSZWdpc3RlcmVkTW9kdWxlKG4pKXt2YXIgZT17fSx0PWdldE1vZHVsZURlc2NyaXB0aW9uKG4pLGk9ZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZU1vZHVsZUdldHRlcihuLHQsbW9kdWxlR2V0dGVyKHIsbix0KSl9LHNldDpmdW5jdGlvbihlKXtyZXR1cm4gbW9kdWxlU2V0dGVyKHIsbix0LGUpfX0pfTtmb3IodmFyIG8gaW4gdClpKG8pO3JldHVybiBlfWNvbnNvbGUud2FybigiW0pTIEZyYW1ld29ya10g5b2T5YmN6L+Q6KGM55qE5Z+65bqn5LiN5YyF5ZCr5Y6f55Sf5o+S5Lu2WyIrbisiXe+8jOivt+WcqG1hbmlmZXN05Lit6YWN572u6K+l5o+S5Lu277yM6YeN5paw5Yi25L2c5YyF5ous6K+l5Y6f55Sf5o+S5Lu255qE6Ieq5a6a5LmJ6L+Q6KGM5Z+65bqnIil9ZWxzZSBjb25zb2xlLmVycm9yKCdbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVxdWlyZU1vZHVsZSgiJytuKyciKSwgaW5zdGFuY2UgKCcrcisiKSBkb2Vzbid0IGV4aXN0IGFueW1vcmUuIil9LFdlZXhJbnN0YW5jZS5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3ZhciB0PWUubWF0Y2goL15AKFx3KylcLyhbXHctXSspKFwuKFx3KykpPyQvaSk7aWYodCl7dmFyIG49dFsxXSxyPXRbMl0saT10WzRdO3N3aXRjaChuKXtjYXNlIm1vZHVsZSI6cmV0dXJuIGlzUmVnaXN0ZXJlZE1vZHVsZShyLGkpO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gaXNSZWdpc3RlcmVkQ29tcG9uZW50KHIpfX1yZXR1cm4gbnVsbH0sV2VleEluc3RhbmNlLnByb3RvdHlwZS5pbXBvcnRTY3JpcHQ9ZnVuY3Rpb24oZSxyKXt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9Z2V0SWQodGhpcyksbz1nZXRUYXNrQ2VudGVyKGkpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe28mJiJmdW5jdGlvbiI9PXR5cGVvZiBvLnNlbmR8fG4obmV3IEVycm9yKCdbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gaW1wb3J0IHNjcmlwdCAiJytlKyciLCBubyB0YXNrQ2VudGVyICgnK2krIikgbWF0Y2hlZC4iKSk7dHJ5e28uc2VuZCgibW9kdWxlIix7bW9kdWxlOiJzY3JpcHQiLG1ldGhvZDoiaW1wb3J0U2NyaXB0In0sW2Uscl0se2NhbGxiYWNrOltmdW5jdGlvbihlKXtyZXR1cm4gdChlKX0sZnVuY3Rpb24oZSl7cmV0dXJuIG4oZSl9XX0pfWNhdGNoKGUpe24oZSl9fSl9O3ZhciBkZWNvZGU9ZGVjb2RlVVJJQ29tcG9uZW50O2Z1bmN0aW9uIHBhcnNlUXVlcnkoZSl7dmFyIGk9e307cmV0dXJuKGU9ZS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIikpJiZlLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLG49ZGVjb2RlKHQuc2hpZnQoKSkscj0wPHQubGVuZ3RoP2RlY29kZSh0LmpvaW4oIj0iKSk6bnVsbDt2b2lkIDA9PT1pW25dP2lbbl09cjpBcnJheS5pc0FycmF5KGlbbl0pP2lbbl0ucHVzaChyKTppW25dPVtpW25dLHJdfSksaX12YXIgTElGRUNZQ0xFX0hPT0tTPVsib25MYXVuY2giLCJvblNob3ciLCJvbkhpZGUiLCJvblVuaU5WaWV3TWVzc2FnZSIsIm9uUGFnZU5vdEZvdW5kIiwib25UaGVtZUNoYW5nZSIsIm9uRXJyb3IiLCJvblVuaGFuZGxlZFJlamVjdGlvbiIsIm9uTG9hZCIsIm9uUmVhZHkiLCJvblVubG9hZCIsIm9uUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbSIsIm9uVGFiSXRlbVRhcCIsIm9uQWRkVG9GYXZvcml0ZXMiLCJvblNoYXJlVGltZWxpbmUiLCJvblNoYXJlQXBwTWVzc2FnZSIsIm9uUmVzaXplIiwib25QYWdlU2Nyb2xsIiwib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIiwib25CYWNrUHJlc3MiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsIm9uUGFnZVNob3ciLCJvblBhZ2VIaWRlIiwib25QYWdlUmVzaXplIl07ZnVuY3Rpb24gcGFyc2VRdWVyeUJ5QnVuZGxlVXJsKGUpe3ZhciB0PXt9O2lmKGUmJiJzdHJpbmciPT10eXBlb2YgZSl7dmFyIG49ZS5pbmRleE9mKCI/Iik7aWYoLTEhPT1uKXt2YXIgcj1lLnN1YnN0cihuKzEpOyIuanMiPT09ci5zdWJzdHIoLTMpJiYocj1yLnN1YnN0cigwLHIubGVuZ3RoLTMpKSx0PXBhcnNlUXVlcnkocil9fXJldHVybiB0fXZhciBJTlNUQU5DRV9JRD0iW1tDdXJyZW50SW5zdGFuY2VJZF1dIjtmdW5jdGlvbiBnZXRJZCQxKGUpe3JldHVybiBlW0lOU1RBTkNFX0lEXX1mdW5jdGlvbiBpbml0U2NvcGUodCxlKXt2YXIgbj1lLmdldEN1cnJlbnRQYWdlcygpLHI9bltuLmxlbmd0aC0xXTtpZih0aGlzLiRvcHRpb25zLnJvdXRlPT09ci5yb3V0ZSlyLiR2bT10aGlzLHJbSU5TVEFOQ0VfSURdPWdldElkJDEodCk7ZWxzZSBpZih0LmNvbmZpZy5vbGRJbnN0YW5jZUlkKXt2YXIgaT1lLmdldEN1cnJlbnRQYWdlcyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZ2V0SWQkMShlKT09PXQuY29uZmlnLm9sZEluc3RhbmNlSWR9KTtpJiYoaS4kdm09dGhpcyl9dGhpcy4kc2NvcGU9cn1mdW5jdGlvbiBsaWZlY3ljbGVNaXhpbihyLGksbyl7dmFyIHQ9ci5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzLG49dC5jcmVhdGVkO0xJRkVDWUNMRV9IT09LUy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pO3ZhciBhPXBhcnNlUXVlcnlCeUJ1bmRsZVVybChpLmNvbmZpZy5idW5kbGVVcmwpO3IubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fJHdlZXg9aTt0cnl7dmFyIHQ9by5nZXRBcHAoe2FsbG93RGVmYXVsdDohMH0pO3QmJiF0aGlzLiRzdG9yZSYmKHQuJHN0b3JlfHx0LiR2bSYmdC4kdm0uJHN0b3JlKSYmKHRoaXMuJHN0b3JlPXQuJHN0b3JlfHx0LiR2bS4kc3RvcmUpfWNhdGNoKGUpe31zd2l0Y2godGhpcy4kb3B0aW9ucy5tcFR5cGUpe2Nhc2UiYXBwIjppZih0aGlzLm1wVHlwZT0iYXBwIix0aGlzLiRvcHRpb25zLnJlbmRlcj1mdW5jdGlvbigpe30sby53ZWV4LmNvbmZpZy5wcmVsb2FkKW8ud2VleC5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtvLnBsdXMudXBkYXRlQ29uZmlnSW5mbyYmby5wbHVzLnVwZGF0ZUNvbmZpZ0luZm8oKSxvLl9fcmVnaXN0ZXJBcHAoZSxyKX0pO2Vsc2Ugby5fX3JlZ2lzdGVyQXBwKHRoaXMscik7YnJlYWs7Y2FzZSJwYWdlIjp0aGlzLm1wVHlwZT0icGFnZSI7dmFyIG49by5wbHVzLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKTtuLl9fcHJlbG9hZF9fPyhuLmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLGZ1bmN0aW9uKCl7IWUuJHNjb3BlJiZpbml0U2NvcGUuY2FsbChlLGksbyksZS5fX2NhbGxfaG9vaygib25TaG93Iil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygib25IaWRlIil9KSk6KDA9PT1vLmdldEN1cnJlbnRQYWdlcygpLmxlbmd0aCYmby5fX3JlZ2lzdGVyUGFnZSh7dXJsOiIvIit0aGlzLiRvcHRpb25zLnJvdXRlLHBhdGg6Ii8iK3RoaXMuJG9wdGlvbnMucm91dGUsd2VidmlldzpufSksaW5pdFNjb3BlLmNhbGwodGhpcyxpLG8pKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtpZigicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSl7dmFyIGU9by5wbHVzLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKTtpZihlLl9fcHJlbG9hZF9fKXt2YXIgdD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYSk7aWYoZS5fX3F1ZXJ5X18pdHJ5e09iamVjdC5hc3NpZ24odCxKU09OLnBhcnNlKGUuX19xdWVyeV9fKSl9Y2F0Y2goZSl7fXRoaXMuX19jYWxsX2hvb2soIm9uTG9hZCIsdCl9ZWxzZXt2YXIgbj1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYSkscj1vLmdldEN1cnJlbnRQYWdlcygpO09iamVjdC5hc3NpZ24obixyW3IubGVuZ3RoLTFdLm9wdGlvbnMpLHRoaXMuX19jYWxsX2hvb2soIm9uTG9hZCIsbiksdGhpcy5fX2NhbGxfaG9vaygib25TaG93Iil9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7InBhZ2UiPT09dGhpcy4kb3B0aW9ucy5tcFR5cGUmJih0aGlzLl9fY2FsbF9ob29rKCJvblJlYWR5IiksdGhpcy4kb3B0aW9ucy5vblBhZ2VTY3JvbGwmJnRoaXMuJGVsLmFkZEV2ZW50KCJzY3JvbGwiLGZ1bmN0aW9uKGUpe2Uuc2Nyb2xsVG9wPWUuZGV0YWlsLnNjcm9sbFRvcCx0Ll9fY2FsbF9ob29rKCJvblBhZ2VTY3JvbGwiLGUpfSksdGhpcy4kb3B0aW9ucy5vblJlYWNoQm90dG9tJiZ0aGlzLiRlbC5hZGRFdmVudCgic2Nyb2xsdG9sb3dlciIsZnVuY3Rpb24oZSl7dC5fX2NhbGxfaG9vaygib25SZWFjaEJvdHRvbSIsZSl9KSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXsicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSYmdGhpcy5fX2NhbGxfaG9vaygib25VbmxvYWQiKX19KX1mdW5jdGlvbiBicm9hZGNhc3QoZSx0KXtmb3IodmFyIG49W10scj1hcmd1bWVudHMubGVuZ3RoLTI7MDxyLS07KW5bcl09YXJndW1lbnRzW3IrMl07Zm9yKHZhciBpPXRoaXMuJGNoaWxkcmVuLG89aS5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzPWlbYV0sYz1zLiRvcHRpb25zLm5hbWU7aWYofmUuaW5kZXhPZihjKSlyZXR1cm4gcy4kZW1pdC5hcHBseShzLFt0XS5jb25jYXQobikpLCExO2lmKCExPT09YnJvYWRjYXN0LmFwcGx5KHMsW2UsdF0uY29uY2F0KFtuXSkpKXJldHVybiExfX12YXIgZW1pdHRlcj17bWV0aG9kczp7JHRyaWdnZXI6ZnVuY3Rpb24oZSx0KXt0aGlzLiRlbWl0KGUscHJvY2Vzc0N1c3RvbUV2ZW50LmNhbGwodGhpcyxlLHQsdGhpcy4kZWwpKX0sJGRpc3BhdGNoOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aC0yOzA8ci0tOyluW3JdPWFyZ3VtZW50c1tyKzJdOyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKTtmb3IodmFyIGk9dGhpcy4kcGFyZW50fHx0aGlzLiRyb290LG89aS4kb3B0aW9ucy5uYW1lO2kmJighb3x8IX5lLmluZGV4T2YobykpOykoaT1pLiRwYXJlbnQpJiYobz1pLiRvcHRpb25zLm5hbWUpO2kmJmkuJGVtaXQuYXBwbHkoaSxbdF0uY29uY2F0KG4pKX0sJGJyb2FkY2FzdDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGgtMjswPHItLTspbltyXT1hcmd1bWVudHNbcisyXTsic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksYnJvYWRjYXN0LmFwcGx5KHRoaXMsW2UsdF0uY29uY2F0KG4pKX19fSxsaXN0ZW5lcnM9e3Byb3BzOntpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuX2FkZExpc3RlbmVycyh0aGlzLmlkKSx0aGlzLiR3YXRjaCgiaWQiLGZ1bmN0aW9uKGUsdCl7bi5fcmVtb3ZlTGlzdGVuZXJzKHQsITApLG4uX2FkZExpc3RlbmVycyhlLCEwKX0pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKHRoaXMuaWQpfSxtZXRob2RzOntfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZighbnx8dCl7dmFyIGk9dGhpcy4kb3B0aW9ucy5saXN0ZW5lcnM7Ik9iamVjdCI9PT10eXBvZihpKSYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihlKXtuPzAhPT1lLmluZGV4T2YoIkAiKSYmMCE9PWUuaW5kZXhPZigidW5pLSIpJiZyLl8kYnVzLiRvbigidW5pLSIrZSsiLSIrdCxyW2lbZV1dKTowPT09ZS5pbmRleE9mKCJAIik/ci4kb24oInVuaS0iK2Uuc3Vic3RyKDEpLHJbaVtlXV0pOjA9PT1lLmluZGV4T2YoInVuaS0iKT9yLl8kYnVzLiRvbihlLHJbaVtlXV0pOnQmJnIuXyRidXMuJG9uKCJ1bmktIitlKyItIityLiRwYWdlLmlkKyItIit0LHJbaVtlXV0pfSl9fSxfcmVtb3ZlTGlzdGVuZXJzOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZighbnx8dCl7dmFyIGk9dGhpcy4kb3B0aW9ucy5saXN0ZW5lcnM7Ik9iamVjdCI9PT10eXBvZihpKSYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihlKXtuPzAhPT1lLmluZGV4T2YoIkAiKSYmMCE9PWUuaW5kZXhPZigidW5pLSIpJiZyLl8kYnVzLiRvZmYoInVuaS0iK2UrIi0iK3QscltpW2VdXSk6MD09PWUuaW5kZXhPZigiQCIpP3IuJG9mZigidW5pLSIrZS5zdWJzdHIoMSkscltpW2VdXSk6MD09PWUuaW5kZXhPZigidW5pLSIpP3IuXyRidXMuJG9mZihlLHJbaVtlXV0pOnQmJnIuXyRidXMuJG9mZigidW5pLSIrZSsiLSIrci4kcGFnZS5pZCsiLSIrdCxyW2lbZV1dKX0pfX19fSxfYWREYXRhQ2FjaGU9e307ZnVuY3Rpb24gZ2V0QWREYXRhKGUsdCxuLHIsaSxvKXt2YXIgYT10KyItIituLHM9X2FkRGF0YUNhY2hlW2FdO3MmJjA8cy5sZW5ndGg/aShzLnNwbGljZSgwLDEpWzBdKTplLmFkLmdldEFkcyh7YWRwaWQ6dCxjb3VudDo1LHdpZHRoOm4sZXh0OntjaGFubmVsOnJ9fSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztpKHQuc3BsaWNlKDAsMSlbMF0pLF9hZERhdGFDYWNoZVthXT1zP3MuY29uY2F0KHQpOnR9LGZ1bmN0aW9uKGUpe28oe2VyckNvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2V9KX0pfWZ1bmN0aW9uIGdldEFkKG4scil7cmV0dXJue25hbWU6IkFkIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOnthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpPYmplY3R9LHdpZHRoOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjaGFubmVsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnthZFdpZHRoOjAsYWREYXRhOnt9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5kYXRhKXRoaXMuX2ZpbGxEYXRhKHRoaXMuZGF0YSk7ZWxzZSBpZih0aGlzLmFkcGlkKXtpZih0aGlzLndpZHRoJiYwPHRoaXMud2lkdGgubGVuZ3RoKXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMud2lkdGgpO3JldHVybi9cZCtbdXJdcHgkL2kudGVzdCh0aGlzLndpZHRoKT90aGlzLmFkV2lkdGg9dXB4MnB4KGUpOnRoaXMuYWRXaWR0aD1lLHZvaWQgdGhpcy5fbG9hZERhdGEoKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHQuJHJlZnMuYWQsZnVuY3Rpb24oZSl7dC5hZFdpZHRoPTA9PT1lLnNpemUud2lkdGg/LTE6ZS5zaXplLndpZHRoLHQuX2xvYWREYXRhKCl9KX0sNTApfX0sd2F0Y2g6e2FkcGlkOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2xvYWREYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2ZpbGxEYXRhKGUpfX0sbWV0aG9kczp7X29uZG93bmxvYWRjaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigiZG93bmxvYWRjaGFuZ2UiLGUuZGV0YWlsKX0sX29uZGlzbGlrZTpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJjbG9zZSIsZS5kZXRhaWwpfSxfbG9hZERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztnZXRBZERhdGEoci5wbHVzfHxuZXcgci5XZWV4UGx1cyhyLndlZXgpLGV8fHRoaXMuYWRwaWQsdGhpcy5hZFdpZHRoLHRoaXMuY2hhbm5lbCxmdW5jdGlvbihlKXt0Ll9maWxsRGF0YShlKX0sZnVuY3Rpb24oZSl7dC4kdHJpZ2dlcigiZXJyb3IiLGUpfSl9LF9maWxsRGF0YTpmdW5jdGlvbihlKXt0aGlzLmFkRGF0YT1lLHRoaXMuJHRyaWdnZXIoImxvYWQiLHt9KX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD17fSxuPXRoaXMuJGxpc3RlbmVycztyZXR1cm4gbi5kb3dubG9hZGNoYW5nZSYmKHQuZG93bmxvYWRjaGFuZ2U9dGhpcy5fb25kb3dubG9hZGNoYW5nZSksbi5jbG9zZSYmKHQuZGlzbGlrZT10aGlzLl9vbmRpc2xpa2UpLGUoInUtYWQiLHRoaXMuX2coe3JlZjoiYWQiLGF0dHJzOntkYXRhOnRoaXMuYWREYXRhLHJlbmRlcmluZzohMH0sb246dH0sbiksW10sMSl9fX1mdW5jdGlvbiBpbml0JDMoZSx0LG4pe2UuY29tcG9uZW50KCJhZCIsZ2V0QWQodCxuKSl9dmFyIF9hZERhdGFDYWNoZSQxPXt9O2Z1bmN0aW9uIGdldEFkRGF0YSQxKGUsdCxuLHIsaSxvKXt2YXIgYT10KyItIituLHM9X2FkRGF0YUNhY2hlJDFbYV07cyYmMDxzLmxlbmd0aD9pKHMuc3BsaWNlKDAsMSlbMF0pOmUuYWQuZ2V0RHJhd0Fkcyh7YWRwaWQ6dCxjb3VudDozLHdpZHRoOm4saGVpZ2h0OnJ9LGZ1bmN0aW9uKGUpe3ZhciB0PWUuYWRzO2kodC5zcGxpY2UoMCwxKVswXSksX2FkRGF0YUNhY2hlJDFbYV09cz9zLmNvbmNhdCh0KTp0fSxmdW5jdGlvbihlKXtvKHtlcnJDb2RlOmUuY29kZSxlcnJNc2c6ZS5tZXNzYWdlfSl9KX1mdW5jdGlvbiBnZXRBZCQxKGUsbil7cmV0dXJue25hbWU6IkFkRHJhdyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7YWRwaWQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6IiJ9LGRhdGE6e3R5cGU6T2JqZWN0fSx3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57YWRXaWR0aDowLGFkSGVpZ2h0OjAsYWREYXRhOnt9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kYXRhP3RoaXMuX2ZpbGxEYXRhKHRoaXMuZGF0YSk6dGhpcy5hZHBpZCYmc2V0VGltZW91dChmdW5jdGlvbigpe2UucmVxdWlyZU1vZHVsZSgiZG9tIikuZ2V0Q29tcG9uZW50UmVjdCh0LiRyZWZzLmFkLGZ1bmN0aW9uKGUpe3QuYWRXaWR0aD0wPT09ZS5zaXplLndpZHRoPy0xOmUuc2l6ZS53aWR0aCx0LmFkSGVpZ2h0PTA9PT1lLnNpemUuaGVpZ2h0Py0xOmUuc2l6ZS5oZWlnaHQsdC5fbG9hZERhdGEoKX0pfSwxMDApfSx3YXRjaDp7YWRwaWQ6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fbG9hZERhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fZmlsbERhdGEoZSl9fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7KG4ucGx1c3x8bmV3IG4uV2VleFBsdXMobi53ZWV4KSkuYWQucmVsZWFzZUFkRGF0YSh0aGlzLmFkRGF0YSl9LG1ldGhvZHM6e19vbmRpc2xpa2U6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigiY2xvc2UiLGUuZGV0YWlsKX0sX2xvYWREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7Z2V0QWREYXRhJDEobi5wbHVzfHxuZXcgbi5XZWV4UGx1cyhuLndlZXgpLGV8fHRoaXMuYWRwaWQsdGhpcy5hZFdpZHRoLHRoaXMuYWRIZWlnaHQsZnVuY3Rpb24oZSl7dC5fZmlsbERhdGEoZSl9LGZ1bmN0aW9uKGUpe3QuJHRyaWdnZXIoImVycm9yIixlKX0pfSxfZmlsbERhdGE6ZnVuY3Rpb24oZSl7dGhpcy5hZERhdGE9ZSx0aGlzLiR0cmlnZ2VyKCJsb2FkIix7fSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj10aGlzLiRsaXN0ZW5lcnM7cmV0dXJuIG4uY2xvc2UmJih0LmRpc2xpa2U9dGhpcy5fb25kaXNsaWtlKSxlKCJ1LWFkLWRyYXciLHRoaXMuX2coe3JlZjoiYWQiLGF0dHJzOntkYXRhOnRoaXMuYWREYXRhLHJlbmRlcmluZzohMH0sb246dH0sbiksW10sMSl9fX1mdW5jdGlvbiBpbml0JDQoZSx0LG4pe2UuY29tcG9uZW50KCJhZC1kcmF3IixnZXRBZCQxKHQsbikpfXZhciBPUEVOX1RZUEVTPVsiYWdyZWVQcml2YWN5IiwiZGlzYWdyZWVQcml2YWN5Il07ZnVuY3Rpb24gZ2V0QnV0dG9uKGUscil7cmV0dXJue25hbWU6IkJ1dHRvbiIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7aG92ZXJDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiYnV0dG9uLWhvdmVyIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiZGVmYXVsdCJ9LHNpemU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImRlZmF1bHQifSxwbGFpbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGxvYWRpbmc6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjIwfSxob3ZlclN0YXlUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjcwfSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZm9ybVR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybn5bIiIsInN1Ym1pdCIsInJlc2V0Il0uaW5kZXhPZihlKX19fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue1RZUEVTOntkZWZhdWx0OiJkIixwcmltYXJ5OiJwIix3YXJuOiJ3In0sY2xpY2tGdW5jdGlvbjpudWxsfX0sbWV0aG9kczp7X29uQ2xpY2s6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5kaXNhYmxlZCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNsaWNrRnVuY3Rpb24mJnRoaXMuY2xpY2tGdW5jdGlvbihlKSx0aGlzLmZvcm1UeXBlJiZ0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInN1Ym1pdCI9PT10aGlzLmZvcm1UeXBlPyJ1bmktZm9ybS1zdWJtaXQiOiJ1bmktZm9ybS1yZXNldCIse3R5cGU6dGhpcy5mb3JtVHlwZX0sdGhpcyksMDx0aGlzLm9wZW5UeXBlLmxlbmd0aCYmMDw9T1BFTl9UWVBFUy5pbmRleE9mKHRoaXMub3BlblR5cGUpKSl7dmFyIG49ci5wbHVzfHxuZXcgci5XZWV4UGx1cyhyLndlZXgpO3RoaXNbIl8iK3RoaXMub3BlblR5cGVdKG4pLHRoaXMuJHRyaWdnZXIodGhpcy5vcGVuVHlwZS50b0xvd2VyQ2FzZSgpLHt9KX19LF9hZ3JlZVByaXZhY3k6ZnVuY3Rpb24oZSl7ZS5ydW50aW1lLmFncmVlUHJpdmFjeSgpfSxfZGlzYWdyZWVQcml2YWN5OmZ1bmN0aW9uKGUpe2UucnVudGltZS5kaXNhZ3JlZVByaXZhY3koKX0sX2dldENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSJ1Yi0iK3RoaXMuVFlQRVNbdGhpcy50eXBlXStlO3JldHVybiB0aGlzLmRpc2FibGVkJiYodCs9Ii1kIiksdGhpcy5wbGFpbiYmKHQrPSItcGxhaW4iKSwiLXQiPT09ZSYmIm1pbmkiPT09dGhpcy5zaXplJiYodCs9IiB1Yi1taW5pIiksdH0sX2dldEhvdmVyQ2xhc3M6ZnVuY3Rpb24oZSl7aWYodGhpcy5kaXNhYmxlZClyZXR1cm4iIjt2YXIgdD0idWItIit0aGlzLlRZUEVTW3RoaXMudHlwZV0rZSsiLWhvdmVyIjtyZXR1cm4gdGhpcy5wbGFpbiYmKHQrPSItcGxhaW4iKSx0fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1BcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP3RoaXMuJHNsb3RzLmRlZmF1bHQ6W107cmV0dXJuIDE9PT1uLmxlbmd0aCYmblswXS50ZXh0JiYobj1lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInViLXQiXSxjbGFzczp0Ll9nZXRDbGFzcygiLXQiKX0sW3QuX3QoImRlZmF1bHQiKV0sMikpLHRoaXMuY2xpY2tGdW5jdGlvbj10LiRsaXN0ZW5lcnMuY2xpY2ssZGVsZXRlIHQuJGxpc3RlbmVycy5jbGljayxlKCJ2aWV3Iix0Ll9nKHtzdGF0aWNDbGFzczpbInViIl0sY2xhc3M6dC5fZ2V0Q2xhc3MoIiIpLGF0dHJzOntkYXRhVW5jVHlwZToidW5pLWJ1dHRvbiIsaG92ZXJDbGFzczp0Ll9nZXRIb3ZlckNsYXNzKCIiKSxob3ZlclN0YXJ0VGltZTp0LmhvdmVyU3RhcnRUaW1lLGhvdmVyU3RheVRpbWU6dC5ob3ZlclN0YXlUaW1lfSxvbjp7Y2xpY2s6dC5fb25DbGlja319LHQuJGxpc3RlbmVycyksW3QubG9hZGluZz9lKCJsb2FkaW5nLWluZGljYXRvciIse3N0YXRpY0NsYXNzOlsidWItbG9hZGluZyJdLGNsYXNzOlsidWItIit0LlRZUEVTW3QudHlwZV0rIi1sb2FkaW5nIl0sYXR0cnM6e2Fycm93OiJmYWxzZSIsYW5pbWF0aW5nOiJ0cnVlIn19KTp0Ll9lKCldLmNvbmNhdChuKSwxKX0sc3R5bGU6e3ViOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIscG9zaXRpb246InJlbGF0aXZlIixwYWRkaW5nTGVmdDoiNSIscGFkZGluZ1JpZ2h0OiI1IixvdmVyZmxvdzoiaGlkZGVuIixjb2xvcjoiIzAwMDAwMCIsYmFja2dyb3VuZENvbG9yOiIjZjhmOGY4Iixib3JkZXJSYWRpdXM6IjUiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZGJkYmRiIn0sInViLXQiOntjb2xvcjoiIzAwMDAwMCIsZm9udFNpemU6IjE4Iix0ZXh0RGVjb3JhdGlvbjoibm9uZSIsbGluZUhlaWdodDoiNDYifSwidWItZCI6e2JhY2tncm91bmRDb2xvcjoiI2Y4ZjhmOCJ9LCJ1Yi1wIjp7YmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIixib3JkZXJDb2xvcjoiIzAwNjJjYyJ9LCJ1Yi13Ijp7YmFja2dyb3VuZENvbG9yOiIjZTY0MzQwIixib3JkZXJDb2xvcjoiI2I4MzYzMyJ9LCJ1Yi1kLXQiOntjb2xvcjoiIzAwMDAwMCJ9LCJ1Yi1wLXQiOntjb2xvcjoiI2ZmZmZmZiJ9LCJ1Yi13LXQiOntjb2xvcjoiI2ZmZmZmZiJ9LCJ1Yi1kLWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNmN2Y3ZjcifSwidWItcC1kIjp7YmFja2dyb3VuZENvbG9yOiIjNjNhY2ZjIixib3JkZXJDb2xvcjoiIzRmOGFjYSJ9LCJ1Yi13LWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNlYzhiODkiLGJvcmRlckNvbG9yOiIjYmQ2ZjZlIn0sInViLWQtdC1kIjp7Y29sb3I6IiNjY2NjY2MifSwidWItcC10LWQiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLXctdC1kIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9LCJ1Yi1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiMzNTM1MzUiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiMwMDdhZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi13LXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNlNjQzNDAiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLXQtcGxhaW4iOntjb2xvcjoiIzM1MzUzNSJ9LCJ1Yi1wLXQtcGxhaW4iOntjb2xvcjoiIzAwN2FmZiJ9LCJ1Yi13LXQtcGxhaW4iOntjb2xvcjoiI2U2NDM0MCJ9LCJ1Yi1kLWQtcGxhaW4iOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXAtZC1wbGFpbiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLXQtZC1wbGFpbiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifSwidWItcC10LWQtcGxhaW4iOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn0sInViLXctdC1kLXBsYWluIjp7Y29sb3I6InJnYmEoMCwwLDAsMC4yKSJ9LCJ1Yi1taW5pIjp7bGluZUhlaWdodDoiMzAiLGZvbnRTaXplOiIxMyIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDoiMTcuNSIscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OiIxNy41In0sInViLWxvYWRpbmciOnt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLG1hcmdpblJpZ2h0OiIxMCJ9LCJ1Yi1kLWxvYWRpbmciOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItcC1sb2FkaW5nIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXctbG9hZGluZyI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLWxvYWRpbmctcGxhaW4iOntjb2xvcjoiIzM1MzUzNSJ9LCJ1Yi1wLWxvYWRpbmctcGxhaW4iOntjb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiIjMDA2MmNjIn0sInViLXctbG9hZGluZy1wbGFpbiI6e2NvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItZC1ob3ZlciI6e29wYWNpdHk6LjgsYmFja2dyb3VuZENvbG9yOiIjZGVkZWRlIn0sInViLXAtaG92ZXIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9LCJ1Yi13LWhvdmVyIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiNjZTNjMzkifSwidWItZC10LWhvdmVyIjp7Y29sb3I6InJnYmEoMCwwLDAsMC42KSJ9LCJ1Yi1wLXQtaG92ZXIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLXctdC1ob3ZlciI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifSwidWItZC1ob3Zlci1wbGFpbiI6e2NvbG9yOiJyZ2JhKDUzLDUzLDUzLDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDUzLDUzLDUzLDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLWhvdmVyLXBsYWluIjp7Y29sb3I6InJnYmEoMjYsMTczLDI1LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDAsMTIyLDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1ob3Zlci1wbGFpbiI6e2NvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixib3JkZXJDb2xvcjoicmdiYSgyMzAsNjcsNjQsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LGxpc3RlbmVyczp7ImxhYmVsLWNsaWNrIjoiX29uQ2xpY2siLCJAbGFiZWwtY2xpY2siOiJfb25DbGljayJ9fX1mdW5jdGlvbiBpbml0JDUoZSx0LG4pe2UuY29tcG9uZW50KCJidXR0b24iLGdldEJ1dHRvbih0LG4pKX1mdW5jdGlvbiBnZXRDaGVja2JveEdyb3VwKGUpe3JldHVybntuYW1lOiJDaGVja2JveEdyb3VwIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntjaGVja2JveExpc3Q6W119fSxsaXN0ZW5lcnM6eyJAY2hlY2tib3gtY2hhbmdlIjoiX2NoYW5nZUhhbmRsZXIiLCJAY2hlY2tib3gtZ3JvdXAtdXBkYXRlIjoiX2NoZWNrYm94R3JvdXBVcGRhdGVIYW5kbGVyIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfY2hhbmdlSGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdD1bXTt0aGlzLmNoZWNrYm94TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tib3hDaGVja2VkJiZ0LnB1c2goZS52YWx1ZSl9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0fSl9LF9jaGVja2JveEdyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLmNoZWNrYm94TGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5jaGVja2JveExpc3QuaW5kZXhPZihlLnZtKTt0aGlzLmNoZWNrYm94TGlzdC5zcGxpY2UodCwxKX19LF9nZXRGb3JtRGF0YTpmdW5jdGlvbigpe3ZhciBlPXt9O2lmKCIiIT09dGhpcy5uYW1lKXt2YXIgdD1bXTt0aGlzLmNoZWNrYm94TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tib3hDaGVja2VkJiZ0LnB1c2goZS52YWx1ZSl9KSxlLnZhbHVlPXQsZS5rZXk9dGhpcy5uYW1lfXJldHVybiBlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLWNoZWNrYm94LWdyb3VwIl19LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9LHN0eWxlOnt9fX1mdW5jdGlvbiBpbml0JDYoZSx0KXtlLmNvbXBvbmVudCgiY2hlY2tib3gtZ3JvdXAiLGdldENoZWNrYm94R3JvdXAodCkpfWZ1bmN0aW9uIGdldENoZWNrYm94KGUpe3JldHVybntuYW1lOiJDaGVja2JveCIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2NoZWNrYm94Q2hlY2tlZDp0aGlzLmNoZWNrZWQsY2hlY2tib3hWYWx1ZTp0aGlzLnZhbHVlfX0sd2F0Y2g6e2NoZWNrZWQ6ZnVuY3Rpb24oZSl7dGhpcy5jaGVja2JveENoZWNrZWQ9ZX0sdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5jaGVja2JveFZhbHVlPWV9fSxsaXN0ZW5lcnM6eyJsYWJlbC1jbGljayI6Il9vbkNsaWNrIiwiQGxhYmVsLWNsaWNrIjoiX29uQ2xpY2sifSxjb21wdXRlZDp7Y2hlY2tib3hDb2xvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkPyIjYWRhZGFkIjp0aGlzLmNvbG9yfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJDaGVja2JveEdyb3VwIiwidW5pLWNoZWNrYm94LWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiQ2hlY2tib3hHcm91cCIsInVuaS1jaGVja2JveC1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlKXt0aGlzLmRpc2FibGVkfHwodGhpcy5jaGVja2JveENoZWNrZWQ9IXRoaXMuY2hlY2tib3hDaGVja2VkLHRoaXMuJGRpc3BhdGNoKCJDaGVja2JveEdyb3VwIiwidW5pLWNoZWNrYm94LWNoYW5nZSIsZSkpfSxfcmVzZXRGb3JtRGF0YTpmdW5jdGlvbigpe3RoaXMuY2hlY2tib3hDaGVja2VkPSExfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7YXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktY2hlY2tib3gifSxvbjp7Y2xpY2s6dC5fb25DbGlja319LHQuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLWNoZWNrYm94Il19LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1jaGVja2JveC1pbnB1dCJdLGNsYXNzOlt0LmRpc2FibGVkPyJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOiIiXX0sW3QuY2hlY2tib3hDaGVja2VkP2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLWljb24iXSxzdHlsZTp7Y29sb3I6dC5jaGVja2JveENvbG9yfX0sW3QuX3YodC5fcygi7qiIIikpXSk6dC5fZSgpXSksZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xvdCJdfSxbdC5fdCgiZGVmYXVsdCIpXSwyKV0pXSl9LHN0eWxlOnsidW5pLWNoZWNrYm94Ijp7ZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIifSwidW5pLWNoZWNrYm94LWlucHV0Ijp7anVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLGJvcmRlcldpZHRoOiIxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsYm9yZGVyU3R5bGU6InNvbGlkIixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclJhZGl1czoiMyIsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIn0sInVuaS1pY29uIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMiLGZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiMiIsbWFyZ2luVG9wOiIyIixjb2xvcjoiIzAwN2FmZiJ9LCJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNlMWUxZTEifSwidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkLWJlZm9yZSI6e2NvbG9yOiIjYWRhZGFkIn0sInVuaS1zbG90Ijp7Zm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiI1In0sInVuaS1jaGVja2JveC1ncm91cCI6e2Rpc3BsYXk6ImJsb2NrIn19fX1mdW5jdGlvbiBpbml0JDcoZSx0KXtlLmNvbXBvbmVudCgiY2hlY2tib3giLGdldENoZWNrYm94KHQpKX12YXIgTkFUSVZFX0NPTVBPTkVOVF9UWVBFUz1bInUtaW5wdXQiLCJ1LXRleHRhcmVhIl07ZnVuY3Rpb24gZ2V0Rm9ybShlKXt2YXIgaT1lLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtyZXR1cm57bmFtZToiRm9ybSIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2NoaWxkcmVuTGlzdDpbXX19LGxpc3RlbmVyczp7IkBmb3JtLXN1Ym1pdCI6Il9vblN1Ym1pdCIsIkBmb3JtLXJlc2V0IjoiX29uUmVzZXQiLCJAZm9ybS1ncm91cC11cGRhdGUiOiJfZm9ybUdyb3VwVXBkYXRlSGFuZGxlciJ9LG1ldGhvZHM6e19vblN1Ym1pdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXROYXRpdmVGb3JtRGF0YSgpfHx7fTt0aGlzLmNoaWxkcmVuTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuX2dldEZvcm1EYXRhJiZlLl9nZXRGb3JtRGF0YSgpLmtleSYmKHRbZS5fZ2V0Rm9ybURhdGEoKS5rZXldPWUuX2dldEZvcm1EYXRhKCkudmFsdWUpfSksdGhpcy4kdHJpZ2dlcigic3VibWl0Iix7dmFsdWU6dH0pfSxfb25SZXNldDpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJyZXNldCIse30pLHRoaXMuX2dldE5hdGl2ZUZvcm1EYXRhKCEwKSx0aGlzLmNoaWxkcmVuTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuX3Jlc2V0Rm9ybURhdGEmJmUuX3Jlc2V0Rm9ybURhdGEoKX0pfSxfZm9ybUdyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLmNoaWxkcmVuTGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5jaGlsZHJlbkxpc3QuaW5kZXhPZihlLnZtKTt0aGlzLmNoaWxkcmVuTGlzdC5zcGxpY2UodCwxKX19LF9nZXROYXRpdmVGb3JtRGF0YTpmdW5jdGlvbihuKXt2YXIgcj17fTtyZXR1cm4gZnVuY3Rpb24gdChlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7MDw9TkFUSVZFX0NPTVBPTkVOVF9UWVBFUy5pbmRleE9mKGUudGFnKSYmZS5kYXRhLmF0dHJzJiZlLmRhdGEuYXR0cnMubmFtZSYmKG4/ZS5lbG0uc2V0VmFsdWUoIiIpOnJbZS5kYXRhLmF0dHJzLm5hbWVdPWkuZ2V0VmFsdWUoZS5lbG0ubm9kZUlkKSksZS5jaGlsZHJlbiYmdChlLmNoaWxkcmVuKX0pfSh0aGlzLiR2bm9kZS5jb21wb25lbnRPcHRpb25zLmNoaWxkcmVuKSxyfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ2aWV3Iix0aGlzLl9nKHt9LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDgoZSx0KXtlLmNvbXBvbmVudCgiZm9ybSIsZ2V0Rm9ybSh0KSl9dmFyIGljb25DaGFycz17c3VjY2Vzczoi7qiGIixpbmZvOiLuqIMiLHdhcm46Iu6oiyIsd2FpdGluZzoi7qiJIixzYWZlX3N1Y2Nlc3M6Iu6ohCIsc2FmZV93YXJuOiLuqIUiLHN1Y2Nlc3NfY2lyY2xlOiLuqIciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiLuqIgiLHdhaXRpbmdfY2lyY2xlOiLuqIoiLGNpcmNsZToi7qiBIixkb3dubG9hZDoi7qiCIixpbmZvX2NpcmNsZToi7qiMIixjYW5jZWw6Iu6ojSIsc2VhcmNoOiLuqI4iLGNsZWFyOiLuqI8ifSxpY29uQ29sb3JzPXtzdWNjZXNzOiIjMDliYjA3IixpbmZvOiIjMTBhZWZmIix3YXJuOiIjZjc2MjYwIix3YWl0aW5nOiIjMTBhZWZmIixzYWZlX3N1Y2Nlc3M6IiMwOWJiMDciLHNhZmVfd2FybjoiI2ZmYmUwMCIsc3VjY2Vzc19jaXJjbGU6IiMwOWJiMDciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiIjMDliYjA3Iix3YWl0aW5nX2NpcmNsZToiIzEwYWVmZiIsY2lyY2xlOiIjYzljOWM5Iixkb3dubG9hZDoiIzA5YmIwNyIsaW5mb19jaXJjbGU6IiMwOWJiMDciLGNhbmNlbDoiI2Y0MzUzMCIsc2VhcmNoOiIjYjJiMmIyIixjbGVhcjoiI2IyYjJiMiJ9O2Z1bmN0aW9uIGdldEljb24oZSl7cmV0dXJue25hbWU6Ikljb24iLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e3R5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNpemU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MjN9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntpY29uQ2hhcnM6aWNvbkNoYXJzfX0sYmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7fSxjb21wdXRlZDp7c3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJue2NvbG9yOnRoaXMuY29sb3J8fGljb25Db2xvcnNbdGhpcy50eXBlXSxmb250U2l6ZTp0aGlzLnNpemV9fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ1LXRleHQiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLWljb24iXSxzdHlsZTp0aGlzLnN0eWxlc30sdGhpcy4kbGlzdGVuZXJzKSxbdGhpcy5pY29uQ2hhcnNbdGhpcy50eXBlXV0pfSxzdHlsZTp7InVuaS1pY29uIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMifX19fWZ1bmN0aW9uIGluaXQkOShlLHQpe2UuY29tcG9uZW50KCJpY29uIixnZXRJY29uKHQpKX1mdW5jdGlvbiBnZXRMYWJlbChlKXtyZXR1cm57bmFtZToiTGFiZWwiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2Zvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LG1ldGhvZHM6e19vbkNsaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LmF0dHIuZGF0YVVuY1R5cGV8fCIiLG49L151bmktKGNoZWNrYm94fHJhZGlvfHN3aXRjaCktLy50ZXN0KHQpO258fChuPS9edW5pLShjaGVja2JveHxyYWRpb3xzd2l0Y2h8YnV0dG9uKSQvaS50ZXN0KHQpKSxufHwodGhpcy5mb3I/dGhpcy5fJGJ1cy4kZW1pdCgidW5pLWxhYmVsLWNsaWNrLSIrdGhpcy4kcGFnZS5pZCsiLSIrdGhpcy5mb3IsZSwhMCk6dGhpcy4kYnJvYWRjYXN0KFsiQ2hlY2tib3giLCJSYWRpbyIsIlN3aXRjaCIsIkJ1dHRvbiJdLCJ1bmktbGFiZWwtY2xpY2siLGUsITApKX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHtvbjp7Y2xpY2s6dGhpcy5fb25DbGlja319LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDEwKGUsdCl7ZS5jb21wb25lbnQoImxhYmVsIixnZXRMYWJlbCh0KSl9ZnVuY3Rpb24gZ2V0TW92YWJsZUFyZWEoZSl7dmFyIHQ9ZS5yZXF1aXJlTW9kdWxlKCJkb20iKTtyZXR1cm57bmFtZToiTW92YWJsZUFyZWEiLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e3NjYWxlQXJlYTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOjAsaGVpZ2h0OjAsaXRlbXM6W119fSxtZXRob2RzOntfcmVzaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9nZXRXSCgpLnRoZW4oZnVuY3Rpb24oKXtlLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jb21wb25lbnRJbnN0YW5jZS5zZXRQYXJlbnQoKX0pfSl9LF9wYW5zdGFydDpmdW5jdGlvbihlKXt0aGlzLnRvdWNoSXRlbSYmdGhpcy50b3VjaEl0ZW0udG91Y2hzdGFydChlKX0sX3Bhbm1vdmU6ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnRvdWNoSXRlbSYmdGhpcy50b3VjaEl0ZW0udG91Y2htb3ZlKGUpfSxfcGFuZW5kOmZ1bmN0aW9uKGUpe3RoaXMudG91Y2hJdGVtJiYodGhpcy50b3VjaEl0ZW0udG91Y2hlbmQoZSksdGhpcy50b3VjaEl0ZW09bnVsbCl9LF9nZXRXSDpmdW5jdGlvbigpe3ZhciBvPXRoaXM7cmV0dXJuIHRoaXMuX2dldENvbXBvbmVudFNpemUodGhpcy4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLndpZHRoLG49ZS5oZWlnaHQscj1lLnRvcCxpPWUubGVmdDtvLndpZHRoPXQsby5oZWlnaHQ9bixvLnRvcD1yLG8ubGVmdD1pfSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0LmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXSx0aGlzLmdhcFY9e3g6bnVsbCx5Om51bGx9LHRoaXMucGluY2hTdGFydExlbj1udWxsfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fX2lzTW91bnRlZD0hMCxlLl9yZXNpemUoKX0sMjAwKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1bXTsoQXJyYXkuaXNBcnJheSh0aGlzLiRzbG90cy5kZWZhdWx0KT9kZWVwQ2xvbmUodGhpcy4kc2xvdHMuZGVmYXVsdCxlKTpbXSkuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNvbXBvbmVudE9wdGlvbnMmJiJtb3ZhYmxlLXZpZXciPT09ZS5jb21wb25lbnRPcHRpb25zLnRhZyYmbi5wdXNoKGUpfSksdGhpcy5pdGVtcz1uO3ZhciByPXt9O3JldHVyblsicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIl0uZm9yRWFjaChmdW5jdGlvbihlKXtyW2VdPXRbIl8iK2VdfSksZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixvbjpyLHN0YXRpY0NsYXNzOlsidW5pLW1vdmFibGUtYXJlYSJdfSx0aGlzLiRsaXN0ZW5lcnMpLG4sMil9LHN0eWxlOnsidW5pLW1vdmFibGUtYXJlYSI6e292ZXJmbG93OiJoaWRkZW4iLHdpZHRoOiIxMHB4IixoZWlnaHQ6IjEwcHgifX19fWZ1bmN0aW9uIGluaXQkMTEoZSx0KXtlLmNvbXBvbmVudCgibW92YWJsZS1hcmVhIixnZXRNb3ZhYmxlQXJlYSh0KSl9dmFyIHRvdWNodHJhY2s9e21ldGhvZHM6e3RvdWNodHJhY2s6ZnVuY3Rpb24oaSl7dmFyIG89dGhpcyxhPTAscz0wLGM9MCx1PTAsbj1mdW5jdGlvbihlLHQsbixyKXtpZighMT09PW9baV0oe3RhcmdldDplLnRhcmdldCxjdXJyZW50VGFyZ2V0OmUuY3VycmVudFRhcmdldCxzdG9wUHJvcGFnYXRpb246ZS5zdG9wUHJvcGFnYXRpb24uYmluZChlKSx0b3VjaGVzOmUudG91Y2hlcyxjaGFuZ2VkVG91Y2hlczplLmNoYW5nZWRUb3VjaGVzLGRldGFpbDp7c3RhdGU6dCx4MDpuLHkwOnIsZHg6bi1hLGR5OnItcyxkZHg6bi1jLGRkeTpyLXUsdGltZVN0YW1wOmUudGltZVN0YW1wfHxEYXRlLm5vdygpfX0pKXJldHVybiExfSxyPW51bGw7dGhpcy5hZGRMaXN0ZW5lcigidG91Y2hzdGFydCIsZnVuY3Rpb24oZSl7aWYoIXIpcmV0dXJuIGE9Yz0ocj1lKS50b3VjaGVzWzBdLnBhZ2VYLHM9dT1lLnRvdWNoZXNbMF0ucGFnZVksbihlLCJzdGFydCIsYSxzKX0pLHRoaXMuYWRkTGlzdGVuZXIoInRvdWNobW92ZSIsZnVuY3Rpb24oZSl7aWYocil7dmFyIHQ9bihlLCJtb3ZlIixlLnRvdWNoZXNbMF0ucGFnZVgsZS50b3VjaGVzWzBdLnBhZ2VZKTtyZXR1cm4gYz1lLnRvdWNoZXNbMF0ucGFnZVgsdT1lLnRvdWNoZXNbMF0ucGFnZVksdH19KSx0aGlzLmFkZExpc3RlbmVyKCJ0b3VjaGVuZCIsZnVuY3Rpb24oZSl7aWYocilyZXR1cm4gcj1udWxsLG4oZSwiZW5kIixlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYLGUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVkpfSl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24oZSl7dGhpcy5jYWxsYmFjaygidG91Y2hzdGFydCIsZSl9LHRvdWNobW92ZTpmdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrKCJ0b3VjaG1vdmUiLGUpfSx0b3VjaGVuZDpmdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrKCJ0b3VjaGVuZCIsZSl9LGFkZExpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dGhpcy5fX2V2ZW50W2VdPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZS50b3VjaGVzPWUuY2hhbmdlZFRvdWNoZXMsITE9PT10KGUpJiZlLnN0b3BQcm9wYWdhdGlvbigpKX19LGNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dGhpcy5fX2V2ZW50W2VdJiZ0aGlzLl9fZXZlbnRbZV0odCl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fX2V2ZW50PXt9fX07ZnVuY3Rpb24gZShlLHQsbil7cmV0dXJuIHQtbjxlJiZlPHQrbn1mdW5jdGlvbiB0KHQsbil7cmV0dXJuIGUodCwwLG4pfWZ1bmN0aW9uIERlY2xpbmUoKXt9ZnVuY3Rpb24gRnJpY3Rpb24oZSx0KXt0aGlzLl9tPWUsdGhpcy5fZj0xZTMqdCx0aGlzLl9zdGFydFRpbWU9MCx0aGlzLl92PTB9ZnVuY3Rpb24gU3ByaW5nKGUsdCxuKXt0aGlzLl9tPWUsdGhpcy5faz10LHRoaXMuX2M9bix0aGlzLl9zb2x1dGlvbj1udWxsLHRoaXMuX2VuZFBvc2l0aW9uPTAsdGhpcy5fc3RhcnRUaW1lPTB9ZnVuY3Rpb24gU1REKGUsdCxuKXt0aGlzLl9zcHJpbmdYPW5ldyBTcHJpbmcoZSx0LG4pLHRoaXMuX3NwcmluZ1k9bmV3IFNwcmluZyhlLHQsbiksdGhpcy5fc3ByaW5nU2NhbGU9bmV3IFNwcmluZyhlLHQsbiksdGhpcy5fc3RhcnRUaW1lPTB9RGVjbGluZS5wcm90b3R5cGUueD1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5zcXJ0KGUpfSxGcmljdGlvbi5wcm90b3R5cGUuc2V0Vj1mdW5jdGlvbihlLHQpe3ZhciBuPU1hdGgucG93KE1hdGgucG93KGUsMikrTWF0aC5wb3codCwyKSwuNSk7dGhpcy5feF92PWUsdGhpcy5feV92PXQsdGhpcy5feF9hPS10aGlzLl9mKnRoaXMuX3hfdi9uLHRoaXMuX3lfYT0tdGhpcy5fZip0aGlzLl95X3Yvbix0aGlzLl90PU1hdGguYWJzKGUvdGhpcy5feF9hKXx8TWF0aC5hYnModC90aGlzLl95X2EpLHRoaXMuX2xhc3REdD1udWxsLHRoaXMuX3N0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKX0sRnJpY3Rpb24ucHJvdG90eXBlLnNldFM9ZnVuY3Rpb24oZSx0KXt0aGlzLl94X3M9ZSx0aGlzLl95X3M9dH0sRnJpY3Rpb24ucHJvdG90eXBlLnM9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSxlPnRoaXMuX3QmJihlPXRoaXMuX3QsdGhpcy5fbGFzdER0PWUpO3ZhciB0PXRoaXMuX3hfdiplKy41KnRoaXMuX3hfYSpNYXRoLnBvdyhlLDIpK3RoaXMuX3hfcyxuPXRoaXMuX3lfdiplKy41KnRoaXMuX3lfYSpNYXRoLnBvdyhlLDIpK3RoaXMuX3lfcztyZXR1cm4oMDx0aGlzLl94X2EmJnQ8dGhpcy5fZW5kUG9zaXRpb25YfHx0aGlzLl94X2E8MCYmdD50aGlzLl9lbmRQb3NpdGlvblgpJiYodD10aGlzLl9lbmRQb3NpdGlvblgpLCgwPHRoaXMuX3lfYSYmbjx0aGlzLl9lbmRQb3NpdGlvbll8fHRoaXMuX3lfYTwwJiZuPnRoaXMuX2VuZFBvc2l0aW9uWSkmJihuPXRoaXMuX2VuZFBvc2l0aW9uWSkse3g6dCx5Om59fSxGcmljdGlvbi5wcm90b3R5cGUuZHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSgobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksZT50aGlzLl90JiYoZT10aGlzLl90KSx7ZHg6dGhpcy5feF92K3RoaXMuX3hfYSplLGR5OnRoaXMuX3lfdit0aGlzLl95X2EqZX19LEZyaWN0aW9uLnByb3RvdHlwZS5kZWx0YT1mdW5jdGlvbigpe3JldHVybnt4Oi0xLjUqTWF0aC5wb3codGhpcy5feF92LDIpL3RoaXMuX3hfYXx8MCx5Oi0xLjUqTWF0aC5wb3codGhpcy5feV92LDIpL3RoaXMuX3lfYXx8MH19LEZyaWN0aW9uLnByb3RvdHlwZS5kdD1mdW5jdGlvbigpe3JldHVybi10aGlzLl94X3YvdGhpcy5feF9hfSxGcmljdGlvbi5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbigpe3ZhciB0PWUodGhpcy5zKCkueCx0aGlzLl9lbmRQb3NpdGlvblgpfHxlKHRoaXMucygpLnksdGhpcy5fZW5kUG9zaXRpb25ZKXx8dGhpcy5fbGFzdER0PT09dGhpcy5fdDtyZXR1cm4gdGhpcy5fbGFzdER0PW51bGwsdH0sRnJpY3Rpb24ucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX2VuZFBvc2l0aW9uWD1lLHRoaXMuX2VuZFBvc2l0aW9uWT10fSxGcmljdGlvbi5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oZSx0KXt0aGlzLl9tPWUsdGhpcy5fZj0xZTMqdH0sU3ByaW5nLnByb3RvdHlwZS5fc29sdmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9jLHI9dGhpcy5fbSxpPXRoaXMuX2ssbz1uKm4tNCpyKmk7aWYoMD09PW8pe3ZhciBhPS1uLygyKnIpLHM9ZSxjPXQvKGEqZSk7cmV0dXJue3g6ZnVuY3Rpb24oZSl7cmV0dXJuKHMrYyplKSpNYXRoLnBvdyhNYXRoLkUsYSplKX0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5wb3coTWF0aC5FLGEqZSk7cmV0dXJuIGEqKHMrYyplKSp0K2MqdH19fWlmKDA8byl7dmFyIHU9KC1uLU1hdGguc3FydChvKSkvKDIqciksbD0oLW4rTWF0aC5zcXJ0KG8pKS8oMipyKSxkPSh0LXUqZSkvKGwtdSksZj1lLWQ7cmV0dXJue3g6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gZT09PXRoaXMuX3QmJih0PXRoaXMuX3Bvd0VSMVQsbj10aGlzLl9wb3dFUjJUKSx0aGlzLl90PWUsdHx8KHQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsdSplKSksbnx8KG49dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsbCplKSksZip0K2Qqbn0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gZT09PXRoaXMuX3QmJih0PXRoaXMuX3Bvd0VSMVQsbj10aGlzLl9wb3dFUjJUKSx0aGlzLl90PWUsdHx8KHQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsdSplKSksbnx8KG49dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsbCplKSksZip1KnQrZCpsKm59fX12YXIgcD1NYXRoLnNxcnQoNCpyKmktbipuKS8oMipyKSxoPS1uLzIqcix2PWUsZz0odC1oKmUpL3A7cmV0dXJue3g6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KE1hdGguRSxoKmUpKih2Kk1hdGguY29zKHAqZSkrZypNYXRoLnNpbihwKmUpKX0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5wb3coTWF0aC5FLGgqZSksbj1NYXRoLmNvcyhwKmUpLHI9TWF0aC5zaW4ocCplKTtyZXR1cm4gdCooZypwKm4tdipwKnIpK2gqdCooZypyK3Yqbil9fX0sU3ByaW5nLnByb3RvdHlwZS54PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHRoaXMuX3NvbHV0aW9uP3RoaXMuX2VuZFBvc2l0aW9uK3RoaXMuX3NvbHV0aW9uLngoZSk6MH0sU3ByaW5nLnByb3RvdHlwZS5keD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9zb2x1dGlvbi5keChlKTowfSxTcHJpbmcucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihlLG4scil7aWYocnx8KHI9KG5ldyBEYXRlKS5nZXRUaW1lKCkpLGUhPT10aGlzLl9lbmRQb3NpdGlvbnx8IXQobiwuMSkpe249bnx8MDt2YXIgaT10aGlzLl9lbmRQb3NpdGlvbjt0aGlzLl9zb2x1dGlvbiYmKHQobiwuMSkmJihuPXRoaXMuX3NvbHV0aW9uLmR4KChyLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSksaT10aGlzLl9zb2x1dGlvbi54KChyLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0KG4sLjEpJiYobj0wKSx0KGksLjEpJiYoaT0wKSxpKz10aGlzLl9lbmRQb3NpdGlvbiksdGhpcy5fc29sdXRpb24mJnQoaS1lLC4xKSYmdChuLC4xKXx8KHRoaXMuX2VuZFBvc2l0aW9uPWUsdGhpcy5fc29sdXRpb249dGhpcy5fc29sdmUoaS10aGlzLl9lbmRQb3NpdGlvbixuKSx0aGlzLl9zdGFydFRpbWU9cil9fSxTcHJpbmcucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2VuZFBvc2l0aW9uPWUsdGhpcy5fc29sdXRpb249e3g6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gMH19fSxTcHJpbmcucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24obil7cmV0dXJuIG58fChuPShuZXcgRGF0ZSkuZ2V0VGltZSgpKSxlKHRoaXMueCgpLHRoaXMuX2VuZFBvc2l0aW9uLC4xKSYmdCh0aGlzLmR4KCksLjEpfSxTcHJpbmcucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLl9tPWUsdGhpcy5faz10LHRoaXMuX2M9bix0aGlzLmRvbmUoKXx8KHRoaXMuX3NvbHV0aW9uPXRoaXMuX3NvbHZlKHRoaXMueCgpLXRoaXMuX2VuZFBvc2l0aW9uLHRoaXMuZHgoKSksdGhpcy5fc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKX0sU3ByaW5nLnByb3RvdHlwZS5zcHJpbmdDb25zdGFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9rfSxTcHJpbmcucHJvdG90eXBlLmRhbXBpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY30sU3ByaW5nLnByb3RvdHlwZS5jb25maWd1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuW3tsYWJlbDoiU3ByaW5nIENvbnN0YW50IixyZWFkOnRoaXMuc3ByaW5nQ29uc3RhbnQuYmluZCh0aGlzKSx3cml0ZTpmdW5jdGlvbihlLHQpe2UucmVjb25maWd1cmUoMSx0LGUuZGFtcGluZygpKX0uYmluZCh0aGlzLHRoaXMpLG1pbjoxMDAsbWF4OjFlM30se2xhYmVsOiJEYW1waW5nIixyZWFkOnRoaXMuZGFtcGluZy5iaW5kKHRoaXMpLHdyaXRlOmZ1bmN0aW9uKGUsdCl7ZS5yZWNvbmZpZ3VyZSgxLGUuc3ByaW5nQ29uc3RhbnQoKSx0KX0uYmluZCh0aGlzLHRoaXMpLG1pbjoxLG1heDo1MDB9XX0sU1RELnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dGhpcy5fc3ByaW5nWC5zZXRFbmQoZSxyLGkpLHRoaXMuX3NwcmluZ1kuc2V0RW5kKHQscixpKSx0aGlzLl9zcHJpbmdTY2FsZS5zZXRFbmQobixyLGkpLHRoaXMuX3N0YXJ0VGltZT1pfSxTVEQucHJvdG90eXBlLng9ZnVuY3Rpb24oKXt2YXIgZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTM7cmV0dXJue3g6dGhpcy5fc3ByaW5nWC54KGUpLHk6dGhpcy5fc3ByaW5nWS54KGUpLHNjYWxlOnRoaXMuX3NwcmluZ1NjYWxlLngoZSl9fSxTVEQucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdGhpcy5fc3ByaW5nWC5kb25lKGUpJiZ0aGlzLl9zcHJpbmdZLmRvbmUoZSkmJnRoaXMuX3NwcmluZ1NjYWxlLmRvbmUoZSl9LFNURC5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX3NwcmluZ1gucmVjb25maWd1cmUoZSx0LG4pLHRoaXMuX3NwcmluZ1kucmVjb25maWd1cmUoZSx0LG4pLHRoaXMuX3NwcmluZ1NjYWxlLnJlY29uZmlndXJlKGUsdCxuKX07dmFyIHJlcXVlc3Rpbmc9ITE7ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpe3JldHVybiBzZXRUaW1lb3V0KGUsMTYpfWZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGUpe2NsZWFyVGltZW91dChlKX1mdW5jdGlvbiBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpe3JlcXVlc3Rpbmd8fChyZXF1ZXN0aW5nPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2UoKSxyZXF1ZXN0aW5nPSExfSkpfWZ1bmN0aW9uIHYoZSx0KXtyZXR1cm4rKCgxZTMqZS0xZTMqdCkvMWUzKS50b0ZpeGVkKDEpfWZ1bmN0aW9uIGcoYSxlLHQpe3ZhciBuPXtpZDowLGNhbmNlbGxlZDohMX07cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIsaSl7aWYoIXR8fCF0LmNhbmNlbGxlZCl7cihuKTt2YXIgbz1hLmRvbmUoKTtvfHx0LmNhbmNlbGxlZHx8KHQuaWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUuYmluZChudWxsLHQsbixyLGkpKSksbyYmaSYmaShuKX19KG4sYSxlLHQpLHtjYW5jZWw6ZnVuY3Rpb24oZSl7ZSYmZS5pZCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoZS5pZCksZSYmKGUuY2FuY2VsbGVkPSEwKX0uYmluZChudWxsLG4pLG1vZGVsOmF9fWZ1bmN0aW9uIGdldE1vdmFibGVWaWV3KGUpe3ZhciB0PWUucmVxdWlyZU1vZHVsZSgiZG9tIikscz1lLnJlcXVpcmVNb2R1bGUoImFuaW1hdGlvbiIpO3JldHVybntuYW1lOiJNb3ZhYmxlVmlldyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W3RvdWNodHJhY2ssZW1pdHRlcl0scHJvcHM6e2RpcmVjdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibm9uZSJ9LGluZXJ0aWE6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxvdXRPZkJvdW5kczp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0seTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxkYW1waW5nOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxmcmljdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHNjYWxlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2NhbGVNaW46e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6LjV9LHNjYWxlTWF4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjEwfSxzY2FsZVZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGFuaW1hdGlvbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITB9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3hTeW5jOnRoaXMuX2dldFB4KHRoaXMueCkseVN5bmM6dGhpcy5fZ2V0UHgodGhpcy55KSxzY2FsZVZhbHVlU3luYzp0aGlzLl9nZXRTY2FsZU51bWJlcih0aGlzLnNjYWxlVmFsdWUpLHdpZHRoOjAsaGVpZ2h0OjAsbWluWDowLG1pblk6MCxtYXhYOjAsbWF4WTowfX0sY29tcHV0ZWQ6e2RhbXBpbmdOdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5kYW1waW5nKTtyZXR1cm4gaXNOYU4oZSk/MjA6ZX0sZnJpY3Rpb25OdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5mcmljdGlvbik7cmV0dXJuIGlzTmFOKGUpfHxlPD0wPzI6ZX0sc2NhbGVNaW5OdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5zY2FsZU1pbik7cmV0dXJuIGlzTmFOKGUpPy41OmV9LHNjYWxlTWF4TnVtYmVyOmZ1bmN0aW9uKCl7dmFyIGU9TnVtYmVyKHRoaXMuc2NhbGVNYXgpO3JldHVybiBpc05hTihlKT8xMDplfSx4TW92ZTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5kaXJlY3Rpb258fCJob3Jpem9udGFsIj09PXRoaXMuZGlyZWN0aW9ufSx5TW92ZTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCI9PT10aGlzLmRpcmVjdGlvbn19LHdhdGNoOnt4OmZ1bmN0aW9uKGUpe3RoaXMueFN5bmM9dGhpcy5fZ2V0UHgoZSl9LHhTeW5jOmZ1bmN0aW9uKGUpe3RoaXMuX3NldFgoZSl9LHk6ZnVuY3Rpb24oZSl7dGhpcy55U3luYz10aGlzLl9nZXRQeChlKX0seVN5bmM6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0WShlKX0sc2NhbGVWYWx1ZTpmdW5jdGlvbihlKXt0aGlzLl9zZXRTY2FsZVZhbHVlKHRoaXMuX2dldFNjYWxlTnVtYmVyKGUpKX0sc2NhbGVWYWx1ZVN5bmM6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0U2NhbGVWYWx1ZShlKX0sc2NhbGVNaW5OdW1iZXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTY2FsZU1pbk9yTWF4KCl9LHNjYWxlTWF4TnVtYmVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2NhbGVNaW5Pck1heCgpfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX29mZnNldD17eDowLHk6MH0sdGhpcy5fc2NhbGVPZmZzZXQ9e3g6MCx5OjB9LHRoaXMuX3RyYW5zbGF0ZVg9MCx0aGlzLl90cmFuc2xhdGVZPTAsdGhpcy5fc2NhbGU9MSx0aGlzLl9vbGRTY2FsZT0xLHRoaXMuX1NURD1uZXcgU1REKDEsOSpNYXRoLnBvdyh0aGlzLmRhbXBpbmdOdW1iZXIsMikvNDAsdGhpcy5kYW1waW5nTnVtYmVyKSx0aGlzLl9mcmljdGlvbj1uZXcgRnJpY3Rpb24oMSx0aGlzLmZyaWN0aW9uTnVtYmVyKSx0aGlzLl9kZWNsaW5lWD1uZXcgRGVjbGluZSx0aGlzLl9kZWNsaW5lWT1uZXcgRGVjbGluZSx0aGlzLl9fdG91Y2hJbmZvPXtoaXN0b3J5WDpbMCwwXSxoaXN0b3J5WTpbMCwwXSxoaXN0b3J5VDpbMCwwXX0sdGhpcy5fcmVjdD17dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnRvdWNodHJhY2soIl9vblRyYWNrIiksc2V0VGltZW91dChmdW5jdGlvbigpe2UuX3VwZGF0ZVJlY3QoKS50aGVuKGZ1bmN0aW9uKCl7ZS5zZXRQYXJlbnQoKX0pfSwxMDApLHRoaXMuX2ZyaWN0aW9uLnJlY29uZmlndXJlKDEsdGhpcy5mcmljdGlvbk51bWJlciksdGhpcy5fU1RELnJlY29uZmlndXJlKDEsOSpNYXRoLnBvdyh0aGlzLmRhbXBpbmdOdW1iZXIsMikvNDAsdGhpcy5kYW1waW5nTnVtYmVyKX0sbWV0aG9kczp7X2dldFB4OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoZSl8fDB9LF9nZXRTY2FsZU51bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1OdW1iZXIoZSksaXNOYU4oZSk/MTplfSxfc2V0WDpmdW5jdGlvbihlKXtpZih0aGlzLnhNb3ZlKXtpZihlK3RoaXMuX3NjYWxlT2Zmc2V0Lng9PT10aGlzLl90cmFuc2xhdGVYKXJldHVybiB0aGlzLl90cmFuc2xhdGVYO3RoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvblRvKGUrdGhpcy5fc2NhbGVPZmZzZXQueCx0aGlzLnlTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0LnksdGhpcy5fc2NhbGUpfXJldHVybiBlfSxfc2V0WTpmdW5jdGlvbihlKXtpZih0aGlzLnlNb3ZlKXtpZihlK3RoaXMuX3NjYWxlT2Zmc2V0Lnk9PT10aGlzLl90cmFuc2xhdGVZKXJldHVybiB0aGlzLl90cmFuc2xhdGVZO3RoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvblRvKHRoaXMueFN5bmMrdGhpcy5fc2NhbGVPZmZzZXQueCxlK3RoaXMuX3NjYWxlT2Zmc2V0LnksdGhpcy5fc2NhbGUpfXJldHVybiBlfSxfc2V0U2NhbGVNaW5Pck1heDpmdW5jdGlvbigpe2lmKCF0aGlzLnNjYWxlKXJldHVybiExO3RoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX3NjYWxlLCEwKSx0aGlzLl91cGRhdGVPbGRTY2FsZSh0aGlzLl9zY2FsZSl9LF9zZXRTY2FsZVZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy5zY2FsZSYmKGU9dGhpcy5fYWRqdXN0U2NhbGUoZSksdGhpcy5fdXBkYXRlU2NhbGUoZSwhMCksdGhpcy5fdXBkYXRlT2xkU2NhbGUoZSksZSl9LF9faGFuZGxlVG91Y2hTdGFydDpmdW5jdGlvbigpe3RoaXMuX2lzU2NhbGluZ3x8dGhpcy5kaXNhYmxlZHx8KHRoaXMuX0ZBJiZ0aGlzLl9GQS5jYW5jZWwoKSx0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYPVswLDBdLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVk9WzAsMF0sdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VD1bMCwwXSx0aGlzLnhNb3ZlJiYodGhpcy5fX2Jhc2VYPXRoaXMuX3RyYW5zbGF0ZVgpLHRoaXMueU1vdmUmJih0aGlzLl9fYmFzZVk9dGhpcy5fdHJhbnNsYXRlWSksdGhpcy5fY2hlY2tDYW5Nb3ZlPW51bGwsdGhpcy5fZmlyc3RNb3ZlRGlyZWN0aW9uPW51bGwsdGhpcy5faXNUb3VjaGluZz0hMCl9LF9faGFuZGxlVG91Y2hNb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2lzU2NhbGluZyYmIXRoaXMuZGlzYWJsZWQmJnRoaXMuX2lzVG91Y2hpbmcpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVgscj10aGlzLl90cmFuc2xhdGVZO2lmKG51bGw9PT10aGlzLl9maXJzdE1vdmVEaXJlY3Rpb24mJih0aGlzLl9maXJzdE1vdmVEaXJlY3Rpb249MTxNYXRoLmFicyhlLmRldGFpbC5keC9lLmRldGFpbC5keSk/Imh0b3VjaG1vdmUiOiJ2dG91Y2htb3ZlIiksdGhpcy54TW92ZSYmKG49ZS5kZXRhaWwuZHgrdGhpcy5fX2Jhc2VYLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVguc2hpZnQoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYLnB1c2gobiksdGhpcy55TW92ZXx8bnVsbCE9PXRoaXMuX2NoZWNrQ2FuTW92ZXx8KHRoaXMuX2NoZWNrQ2FuTW92ZT1NYXRoLmFicyhlLmRldGFpbC5keC9lLmRldGFpbC5keSk8MSkpLHRoaXMueU1vdmUmJihyPWUuZGV0YWlsLmR5K3RoaXMuX19iYXNlWSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlZLnNoaWZ0KCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WS5wdXNoKHIpLHRoaXMueE1vdmV8fG51bGwhPT10aGlzLl9jaGVja0Nhbk1vdmV8fCh0aGlzLl9jaGVja0Nhbk1vdmU9TWF0aC5hYnMoZS5kZXRhaWwuZHkvZS5kZXRhaWwuZHgpPDEpKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlULnNoaWZ0KCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VC5wdXNoKGUuZGV0YWlsLnRpbWVTdGFtcCksIXRoaXMuX2NoZWNrQ2FuTW92ZSl7dmFyIGk9InRvdWNoIjtuPHRoaXMubWluWD90aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixuPXRoaXMubWluWC10aGlzLl9kZWNsaW5lWC54KHRoaXMubWluWC1uKSk6bj10aGlzLm1pblg6bj50aGlzLm1heFgmJih0aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixuPXRoaXMubWF4WCt0aGlzLl9kZWNsaW5lWC54KG4tdGhpcy5tYXhYKSk6bj10aGlzLm1heFgpLHI8dGhpcy5taW5ZP3RoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLHI9dGhpcy5taW5ZLXRoaXMuX2RlY2xpbmVZLngodGhpcy5taW5ZLXIpKTpyPXRoaXMubWluWTpyPnRoaXMubWF4WSYmKHRoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLHI9dGhpcy5tYXhZK3RoaXMuX2RlY2xpbmVZLngoci10aGlzLm1heFkpKTpyPXRoaXMubWF4WSksX3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuX3NldFRyYW5zZm9ybShuLHIsdC5fc2NhbGUsaSl9KX19fSxfX2hhbmRsZVRvdWNoRW5kOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcztpZighdGhpcy5faXNTY2FsaW5nJiYhdGhpcy5kaXNhYmxlZCYmdGhpcy5faXNUb3VjaGluZyYmKHRoaXMuX2lzVG91Y2hpbmc9ITEsIXRoaXMuX2NoZWNrQ2FuTW92ZSYmIXRoaXMuX3JldmlzZSgib3V0LW9mLWJvdW5kcyIpJiZ0aGlzLmluZXJ0aWEpKXt2YXIgZT0xZTMqKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVhbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WFswXSkvKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFswXSksdD0xZTMqKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVlbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WVswXSkvKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFswXSk7dGhpcy5fZnJpY3Rpb24uc2V0VihlLHQpLHRoaXMuX2ZyaWN0aW9uLnNldFModGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKTt2YXIgbj10aGlzLl9mcmljdGlvbi5kZWx0YSgpLngsaT10aGlzLl9mcmljdGlvbi5kZWx0YSgpLnksbz1uK3RoaXMuX3RyYW5zbGF0ZVgsYT1pK3RoaXMuX3RyYW5zbGF0ZVk7bzx0aGlzLm1pblg/KG89dGhpcy5taW5YLGE9dGhpcy5fdHJhbnNsYXRlWSsodGhpcy5taW5YLXRoaXMuX3RyYW5zbGF0ZVgpKmkvbik6bz50aGlzLm1heFgmJihvPXRoaXMubWF4WCxhPXRoaXMuX3RyYW5zbGF0ZVkrKHRoaXMubWF4WC10aGlzLl90cmFuc2xhdGVYKSppL24pLGE8dGhpcy5taW5ZPyhhPXRoaXMubWluWSxvPXRoaXMuX3RyYW5zbGF0ZVgrKHRoaXMubWluWS10aGlzLl90cmFuc2xhdGVZKSpuL2kpOmE+dGhpcy5tYXhZJiYoYT10aGlzLm1heFksbz10aGlzLl90cmFuc2xhdGVYKyh0aGlzLm1heFktdGhpcy5fdHJhbnNsYXRlWSkqbi9pKSx0aGlzLl9mcmljdGlvbi5zZXRFbmQobyxhKSx0aGlzLl9GQT1nKHRoaXMuX2ZyaWN0aW9uLGZ1bmN0aW9uKCl7dmFyIGU9ci5fZnJpY3Rpb24ucygpLHQ9ZS54LG49ZS55O3IuX3NldFRyYW5zZm9ybSh0LG4sci5fc2NhbGUsImZyaWN0aW9uIil9LGZ1bmN0aW9uKCl7ci5fRkEuY2FuY2VsKCl9KX19LF9vblRyYWNrOmZ1bmN0aW9uKGUpe3N3aXRjaChlLmRldGFpbC5zdGF0ZSl7Y2FzZSJzdGFydCI6dGhpcy5fX2hhbmRsZVRvdWNoU3RhcnQoKTticmVhaztjYXNlIm1vdmUiOnRoaXMuX19oYW5kbGVUb3VjaE1vdmUoZSk7YnJlYWs7Y2FzZSJlbmQiOnRoaXMuX19oYW5kbGVUb3VjaEVuZCgpfX0sX2dldExpbWl0WFk6ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTtyZXR1cm4gZT50aGlzLm1heFg/KGU9dGhpcy5tYXhYLG49ITApOmU8dGhpcy5taW5YJiYoZT10aGlzLm1pblgsbj0hMCksdD50aGlzLm1heFk/KHQ9dGhpcy5tYXhZLG49ITApOnQ8dGhpcy5taW5ZJiYodD10aGlzLm1pblksbj0hMCkse3g6ZSx5OnQsb3V0T2ZCb3VuZHM6bn19LHNldFBhcmVudDpmdW5jdGlvbigpe2lmKHRoaXMuJHBhcmVudC5fX2lzTW91bnRlZCl7dGhpcy5fRkEmJnRoaXMuX0ZBLmNhbmNlbCgpLHRoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpO3ZhciBlPXRoaXMuc2NhbGU/dGhpcy5zY2FsZVZhbHVlU3luYzoxO3RoaXMuX3VwZGF0ZU9mZnNldCgpLHRoaXMuX3VwZGF0ZVdIKGUpLHRoaXMuX3VwZGF0ZUJvdW5kYXJ5KCksdGhpcy5fdHJhbnNsYXRlWD10aGlzLnhTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0LngsdGhpcy5fdHJhbnNsYXRlWT10aGlzLnlTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0Lnk7dmFyIHQ9dGhpcy5fZ2V0TGltaXRYWSh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpLG49dC54LHI9dC55O3RoaXMuX3NldFRyYW5zZm9ybShuLHIsZSwiIiwhMCksdGhpcy5fdXBkYXRlT2xkU2NhbGUoZSl9fSxfdXBkYXRlT2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2V0Lng9dGhpcy5fcmVjdC5sZWZ0LXRoaXMuJHBhcmVudC5sZWZ0LHRoaXMuX29mZnNldC55PXRoaXMuX3JlY3QudG9wLXRoaXMuJHBhcmVudC50b3B9LF91cGRhdGVXSDpmdW5jdGlvbihlKXtlPWV8fHRoaXMuX3NjYWxlLGU9dGhpcy5fYWRqdXN0U2NhbGUoZSk7dmFyIHQ9dGhpcy5fcmVjdDt0aGlzLmhlaWdodD10LmhlaWdodC90aGlzLl9zY2FsZSx0aGlzLndpZHRoPXQud2lkdGgvdGhpcy5fc2NhbGU7dmFyIG49dGhpcy5oZWlnaHQqZSxyPXRoaXMud2lkdGgqZTt0aGlzLl9zY2FsZU9mZnNldC54PShyLXRoaXMud2lkdGgpLzIsdGhpcy5fc2NhbGVPZmZzZXQueT0obi10aGlzLmhlaWdodCkvMn0sX3VwZGF0ZUJvdW5kYXJ5OmZ1bmN0aW9uKCl7dmFyIGU9MC10aGlzLl9vZmZzZXQueCt0aGlzLl9zY2FsZU9mZnNldC54LHQ9dGhpcy4kcGFyZW50LndpZHRoLXRoaXMud2lkdGgtdGhpcy5fb2Zmc2V0LngtdGhpcy5fc2NhbGVPZmZzZXQueDt0aGlzLm1pblg9TWF0aC5taW4oZSx0KSx0aGlzLm1heFg9TWF0aC5tYXgoZSx0KTt2YXIgbj0wLXRoaXMuX29mZnNldC55K3RoaXMuX3NjYWxlT2Zmc2V0Lnkscj10aGlzLiRwYXJlbnQuaGVpZ2h0LXRoaXMuaGVpZ2h0LXRoaXMuX29mZnNldC55LXRoaXMuX3NjYWxlT2Zmc2V0Lnk7dGhpcy5taW5ZPU1hdGgubWluKG4sciksdGhpcy5tYXhZPU1hdGgubWF4KG4scil9LF9iZWdpblNjYWxlOmZ1bmN0aW9uKCl7dGhpcy5faXNTY2FsaW5nPSEwfSxfZW5kU2NhbGU6ZnVuY3Rpb24oKXt0aGlzLl9pc1NjYWxpbmc9ITEsdGhpcy5fdXBkYXRlT2xkU2NhbGUodGhpcy5fc2NhbGUpfSxfc2V0U2NhbGU6ZnVuY3Rpb24oZSl7dGhpcy5zY2FsZSYmKGU9dGhpcy5fYWRqdXN0U2NhbGUoZSksZT10aGlzLl9vbGRTY2FsZSplLHRoaXMuX2JlZ2luU2NhbGUoKSx0aGlzLl91cGRhdGVTY2FsZShlKSl9LF91cGRhdGVTY2FsZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYodGhpcy5zY2FsZSl7ZT10aGlzLl9hZGp1c3RTY2FsZShlKSx0aGlzLl91cGRhdGVXSChlKSx0aGlzLl91cGRhdGVCb3VuZGFyeSgpO3ZhciByPXRoaXMuX2dldExpbWl0WFkodGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKSxpPXIueCxvPXIueTt0P3RoaXMuX2FuaW1hdGlvblRvKGksbyxlLCIiLCEwLCEwKTpfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7bi5fc2V0VHJhbnNmb3JtKGksbyxlLCIiLCEwLCEwKX0pfX0sX3VwZGF0ZU9sZFNjYWxlOmZ1bmN0aW9uKGUpe3RoaXMuX29sZFNjYWxlPWV9LF9hZGp1c3RTY2FsZTpmdW5jdGlvbihlKXtyZXR1cm4gZT1NYXRoLm1heCguNSx0aGlzLnNjYWxlTWluTnVtYmVyLGUpLGU9TWF0aC5taW4oMTAsdGhpcy5zY2FsZU1heE51bWJlcixlKX0sX2FuaW1hdGlvblRvOmZ1bmN0aW9uKGUsdCxuLGksbyxhKXt2YXIgcz10aGlzO3RoaXMuX0ZBJiZ0aGlzLl9GQS5jYW5jZWwoKSx0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLnhNb3ZlfHwoZT10aGlzLl90cmFuc2xhdGVYKSx0aGlzLnlNb3ZlfHwodD10aGlzLl90cmFuc2xhdGVZKSx0aGlzLnNjYWxlfHwobj10aGlzLl9zY2FsZSk7dmFyIHI9dGhpcy5fZ2V0TGltaXRYWShlLHQpO2U9ci54LHQ9ci55LHRoaXMuYW5pbWF0aW9uPyh0aGlzLl9TVEQuX3NwcmluZ1guX3NvbHV0aW9uPW51bGwsdGhpcy5fU1RELl9zcHJpbmdZLl9zb2x1dGlvbj1udWxsLHRoaXMuX1NURC5fc3ByaW5nU2NhbGUuX3NvbHV0aW9uPW51bGwsdGhpcy5fU1RELl9zcHJpbmdYLl9lbmRQb3NpdGlvbj10aGlzLl90cmFuc2xhdGVYLHRoaXMuX1NURC5fc3ByaW5nWS5fZW5kUG9zaXRpb249dGhpcy5fdHJhbnNsYXRlWSx0aGlzLl9TVEQuX3NwcmluZ1NjYWxlLl9lbmRQb3NpdGlvbj10aGlzLl9zY2FsZSx0aGlzLl9TVEQuc2V0RW5kKGUsdCxuLDEpLHRoaXMuX1NGQT1nKHRoaXMuX1NURCxmdW5jdGlvbigpe3ZhciBlPXMuX1NURC54KCksdD1lLngsbj1lLnkscj1lLnNjYWxlO3MuX3NldFRyYW5zZm9ybSh0LG4scixpLG8sYSl9LGZ1bmN0aW9uKCl7cy5fU0ZBLmNhbmNlbCgpfSkpOnRoaXMuX3NldFRyYW5zZm9ybShlLHQsbixpLG8sYSl9LF9yZXZpc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0TGltaXRYWSh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpLG49dC54LHI9dC55LGk9dC5vdXRPZkJvdW5kcztyZXR1cm4gaSYmdGhpcy5fYW5pbWF0aW9uVG8obixyLHRoaXMuX3NjYWxlLGUpLGl9LF9zZXRUcmFuc2Zvcm06ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZvaWQgMD09PXImJihyPSIiKSxudWxsIT09ZSYmIk5hTiIhPT1lLnRvU3RyaW5nKCkmJiJudW1iZXIiPT10eXBlb2YgZXx8KGU9dGhpcy5fdHJhbnNsYXRlWHx8MCksbnVsbCE9PXQmJiJOYU4iIT09dC50b1N0cmluZygpJiYibnVtYmVyIj09dHlwZW9mIHR8fCh0PXRoaXMuX3RyYW5zbGF0ZVl8fDApLGU9TnVtYmVyKGUudG9GaXhlZCgxKSksdD1OdW1iZXIodC50b0ZpeGVkKDEpKSxuPU51bWJlcihuLnRvRml4ZWQoMSkpLHRoaXMuX3RyYW5zbGF0ZVg9PT1lJiZ0aGlzLl90cmFuc2xhdGVZPT09dHx8aXx8dGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7eDp2KGUsdGhpcy5fc2NhbGVPZmZzZXQueCkseTp2KHQsdGhpcy5fc2NhbGVPZmZzZXQueSksc291cmNlOnJ9KSx0aGlzLnNjYWxlfHwobj10aGlzLl9zY2FsZSksbj0rKG49dGhpcy5fYWRqdXN0U2NhbGUobikpLnRvRml4ZWQoMyksbyYmbiE9PXRoaXMuX3NjYWxlJiZ0aGlzLiR0cmlnZ2VyKCJzY2FsZSIse3g6ZSx5OnQsc2NhbGU6bn0pO3ZhciBhPSJ0cmFuc2xhdGUoIitlKyJweCwgIit0KyJweCkgc2NhbGUoIituKyIpIjtzLnRyYW5zaXRpb24odGhpcy4kcmVmcy5lbCx7c3R5bGVzOnt0cmFuc2Zvcm06YX0sZHVyYXRpb246MCxkZWxheTowfSksdGhpcy5fdHJhbnNsYXRlWD1lLHRoaXMuX3RyYW5zbGF0ZVk9dCx0aGlzLl9zY2FsZT1ufSxfdG91Y2hzdGFydDpmdW5jdGlvbigpe3RoaXMuJHBhcmVudC50b3VjaEl0ZW09dGhpc30sX2dldENvbXBvbmVudFNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe3QuZ2V0Q29tcG9uZW50UmVjdChlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2l6ZTtuKHQpfSl9KX0sX3VwZGF0ZVJlY3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9nZXRDb21wb25lbnRTaXplKHRoaXMuJHJlZnMuZWwpLnRoZW4oZnVuY3Rpb24oZSl7dC5fcmVjdD1lfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e3RvdWNoc3RhcnQ6dGhpcy5fdG91Y2hzdGFydH07cmV0dXJuIGUoImRpdiIsdGhpcy5fZyh7cmVmOiJlbCIsb246dCxzdGF0aWNDbGFzczpbInVuaS1tb3ZhYmxlLXZpZXciXSxzdGF0aWNTdHlsZTp7dHJhbnNmb3JtT3JpZ2luOiJjZW50ZXIifSxhdHRyczp7cHJldmVudEdlc3R1cmU6ITB9fSx0aGlzLiRsaXN0ZW5lcnMpLHRoaXMuJHNsb3RzLmRlZmF1bHQsMil9LHN0eWxlOnsidW5pLW1vdmFibGUtdmlldyI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiIwcHgiLGxlZnQ6IjBweCIsd2lkdGg6IjEwcHgiLGhlaWdodDoiMTBweCJ9fX19ZnVuY3Rpb24gaW5pdCQxMihlLHQpe2UuY29tcG9uZW50KCJtb3ZhYmxlLXZpZXciLGdldE1vdmFibGVWaWV3KHQpKX12YXIgT1BFTl9UWVBFUyQxPXtuYXZpZ2F0ZToibmF2aWdhdGVUbyIscmVkaXJlY3Q6InJlZGlyZWN0VG8iLHN3aXRjaFRhYjoic3dpdGNoVGFiIixyZUxhdW5jaDoicmVMYXVuY2giLG5hdmlnYXRlQmFjazoibmF2aWdhdGVCYWNrIn0sQU5JTUFUSU9OX1RZUEVfSU49WyJzbGlkZS1pbi1yaWdodCIsInNsaWRlLWluLWxlZnQiLCJzbGlkZS1pbi10b3AiLCJzbGlkZS1pbi1ib3R0b20iLCJmYWRlLWluIiwiem9vbS1vdXQiLCJ6b29tLWZhZGUtb3V0IiwicG9wLWluIiwibm9uZSJdLEFOSU1BVElPTl9UWVBFX09VVD1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLHBsdXNfLEJyb2FkY2FzdENoYW5uZWxfLGNoYW5uZWw7ZnVuY3Rpb24gZ2V0TmF2aWdhdG9yKGUsdCl7cmV0dXJue25hbWU6Ik5hdmlnYXRvciIsaXNSZXNlcnZlZDohMCxwcm9wczp7dXJsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibmF2aWdhdGUiLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4hIU9QRU5fVFlQRVMkMVtlXX19LGRlbHRhOnt0eXBlOk51bWJlcixkZWZhdWx0OjF9LGFuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4hZXx8fkFOSU1BVElPTl9UWVBFX0lOLmNvbmNhdChBTklNQVRJT05fVFlQRV9PVVQpLmluZGV4T2YoZSl9fSxhbmltYXRpb25EdXJhdGlvbjp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDozMDB9LGhvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRvci1ob3ZlciJ9LGhvdmVyU3RvcFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0saG92ZXJTdGFydFRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NTB9LGhvdmVyU3RheVRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NjAwfX0sbWV0aG9kczp7X2NsaWNrOmZ1bmN0aW9uKCl7aWYoIm5hdmlnYXRlQmFjayI9PT10aGlzLm9wZW5UeXBlfHx0aGlzLnVybCl7dmFyIGU9cGFyc2VJbnQodGhpcy5hbmltYXRpb25EdXJhdGlvbik7c3dpdGNoKHRoaXMub3BlblR5cGUpe2Nhc2UibmF2aWdhdGUiOnQubmF2aWdhdGVUbyh7dXJsOnRoaXMudXJsLGFuaW1hdGlvblR5cGU6dGhpcy5hbmltYXRpb25UeXBlfHwicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjplfSk7YnJlYWs7Y2FzZSJyZWRpcmVjdCI6dC5yZWRpcmVjdFRvKHt1cmw6dGhpcy51cmx9KTticmVhaztjYXNlInN3aXRjaFRhYiI6dC5zd2l0Y2hUYWIoe3VybDp0aGlzLnVybH0pO2JyZWFrO2Nhc2UicmVMYXVuY2giOnQucmVMYXVuY2goe3VybDp0aGlzLnVybH0pO2JyZWFrO2Nhc2UibmF2aWdhdGVCYWNrIjp0Lm5hdmlnYXRlQmFjayh7ZGVsdGE6dGhpcy5kZWx0YSxhbmltYXRpb25UeXBlOnRoaXMuYW5pbWF0aW9uVHlwZXx8InBvcC1vdXQiLGFuaW1hdGlvbkR1cmF0aW9uOmV9KX19ZWxzZSBjb25zb2xlLmVycm9yKCI8bmF2aWdhdG9yLz4gc2hvdWxkIGhhdmUgdXJsIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIG5hdmlnYXRlVG8sIHJlZGlyZWN0VG8sIHJlTGF1bmNoIG9yIHN3aXRjaFRhYiIpfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ2aWV3Iix0aGlzLl9nKHthdHRyczp7aG92ZXJDbGFzczp0aGlzLmhvdmVyQ2xhc3MsaG92ZXJTdG9wUHJvcGFnYXRpb246dGhpcy5ob3ZlclN0b3BQcm9wYWdhdGlvbixob3ZlclN0YXJ0VGltZTp0aGlzLmhvdmVyU3RhcnRUaW1lLGhvdmVyU3RheVRpbWU6dGhpcy5ob3ZlclN0YXlUaW1lfSxvbjp7Y2xpY2s6dGhpcy5fY2xpY2t9fSx0aGlzLiRsaXN0ZW5lcnMpLFt0aGlzLl90KCJkZWZhdWx0IildLDIpfSxzdHlsZTp7Im5hdmlnYXRvci1ob3ZlciI6e2JhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwLjEpIixvcGFjaXR5Oi43fX19fWZ1bmN0aW9uIGluaXQkMTMoZSx0LG4pe2UuY29tcG9uZW50KCJuYXZpZ2F0b3IiLGdldE5hdmlnYXRvcih0LG4udW5pKSl9ZnVuY3Rpb24gZ2V0UnVudGltZSgpe3JldHVybiJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudD8id2VidmlldyI6InY4In1mdW5jdGlvbiBnZXRQYWdlSWQoKXtyZXR1cm4gcGx1c18ud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkfXZhciBjYWxsYmFja3M9e307ZnVuY3Rpb24gb25QbHVzTWVzc2FnZShlKXt2YXIgdD1lLmRhdGEmJmUuZGF0YS5fX21lc3NhZ2U7aWYodCYmdC5fX3BhZ2Upe3ZhciBuPXQuX19wYWdlLHI9Y2FsbGJhY2tzW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgY2FsbGJhY2tzW25dfX1mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGUsdCl7InY4Ij09PWdldFJ1bnRpbWUoKT8oY2hhbm5lbCYmY2hhbm5lbC5jbG9zZSgpLChjaGFubmVsPW5ldyBCcm9hZGNhc3RDaGFubmVsXyhnZXRQYWdlSWQoKSkpLm9ubWVzc2FnZT1vblBsdXNNZXNzYWdlKTp3aW5kb3cuX19wbHVzTWVzc2FnZT1vblBsdXNNZXNzYWdlLGNhbGxiYWNrc1tlXT10fXZhciBQYWdlPWZ1bmN0aW9uKGUpe3RoaXMud2Vidmlldz1lfTtmdW5jdGlvbiBzaG93UGFnZShlKXt2YXIgdD1lLmNvbnRleHQ7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBuPWUudXJsLHI9ZS5kYXRhO3ZvaWQgMD09PXImJihyPXt9KTt2YXIgaT1lLnN0eWxlO3ZvaWQgMD09PWkmJihpPXt9KTt2YXIgbz1lLm9uTWVzc2FnZSxhPWUub25DbG9zZTtwbHVzXz10LnBsdXN8fHBsdXMsQnJvYWRjYXN0Q2hhbm5lbF89dC5Ccm9hZGNhc3RDaGFubmVsfHxCcm9hZGNhc3RDaGFubmVsO3ZhciBzPSJwYWdlIitEYXRlLm5vdygpOyExIT09KGk9T2JqZWN0LmFzc2lnbih7fSxpKSkudGl0bGVOVmlldyYmIm5vbmUiIT09aS50aXRsZU5WaWV3JiYoaS50aXRsZU5WaWV3PU9iamVjdC5hc3NpZ24oe2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGkudGl0bGVOVmlldykpO3ZhciBjPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6KCJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy5lbnYmJnByb2Nlc3MuZW52LlZVRV9BUFBfVEVNUExBVEVfUEFUSHx8IiIpKyIvIituKyIuanMiLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpwbHVzXy5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07aT1PYmplY3QuYXNzaWduKGMsaSk7dmFyIHU9cGx1c18ud2Vidmlldy5jcmVhdGUoIiIscyxpLHtleHRyYXM6e2Zyb206Z2V0UGFnZUlkKCkscnVudGltZTpnZXRSdW50aW1lKCksZGF0YTpyfX0pO3JldHVybiB1LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixhKSxhZGRFdmVudExpc3RlbmVyKHMsZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oZS5kYXRhKSxlLmtlZXB8fHUuY2xvc2UoImF1dG8iKX0pLHUuc2hvdyhpLmFuaW1hdGlvblR5cGUsaS5hbmltYXRpb25EdXJhdGlvbiksbmV3IFBhZ2UodSl9ZnVuY3Rpb24gZ2V0UGlja2VyKGUsdCl7dmFyIG89e1NFTEVDVE9SOiJzZWxlY3RvciIsTVVMVElTRUxFQ1RPUjoibXVsdGlTZWxlY3RvciIsVElNRToidGltZSIsREFURToiZGF0ZSJ9LGE9e1lFQVI6InllYXIiLE1PTlRIOiJtb250aCIsREFZOiJkYXkifSxyPVsicmFuZ2UiLCJyYW5nZUtleSIsInZhbHVlIiwibW9kZSIsImZpZWxkcyIsInN0YXJ0IiwiZW5kIiwiZGlzYWJsZWQiXTtmdW5jdGlvbiBzKGUpe3JldHVybiA5PGU/ZToiMCIrZX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49bmV3IERhdGU7cmV0dXJuIGU9U3RyaW5nKGV8fCIiKSx0PT09by5USU1FPzI9PT0oZT1lLnNwbGl0KCI6IikpLmxlbmd0aCYmbi5zZXRIb3VycyhwYXJzZUludChlWzBdKSxwYXJzZUludChlWzFdKSk6Mz09PShlPWUuc3BsaXQoIi0iKSkubGVuZ3RoJiZuLnNldEZ1bGxZZWFyKHBhcnNlSW50KGVbMF0pLHBhcnNlSW50KGVbMV0tMSkscGFyc2VJbnQoZVsyXSkpLG59cmV0dXJue25hbWU6IlBpY2tlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOntyYW5nZTp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fSxyYW5nZUtleTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmcsQXJyYXldLGRlZmF1bHQ6MH0sbW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpvLlNFTEVDVE9SLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gMDw9T2JqZWN0LnZhbHVlcyhvKS5pbmRleE9mKGUpfX0sZmllbGRzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxzdGFydDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmdW5jdGlvbigpe2lmKHRoaXMubW9kZT09PW8uVElNRSlyZXR1cm4iMDA6MDAiO2lmKHRoaXMubW9kZT09PW8uREFURSl7dmFyIGU9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLTEwMDtzd2l0Y2godGhpcy5maWVsZHMpe2Nhc2UgYS5ZRUFSOnJldHVybiBlO2Nhc2UgYS5NT05USDpyZXR1cm4gZSsiLTAxIjtkZWZhdWx0OnJldHVybiBlKyItMDEtMDEifX1yZXR1cm4iIn19LGVuZDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmdW5jdGlvbigpe2lmKHRoaXMubW9kZT09PW8uVElNRSlyZXR1cm4iMjM6NTkiO2lmKHRoaXMubW9kZT09PW8uREFURSl7dmFyIGU9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpKzEwMDtzd2l0Y2godGhpcy5maWVsZHMpe2Nhc2UgYS5ZRUFSOnJldHVybiBlO2Nhc2UgYS5NT05USDpyZXR1cm4gZSsiLTEyIjtkZWZhdWx0OnJldHVybiBlKyItMTItMzEifX1yZXR1cm4iIn19LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGNvbXB1dGVkOnthdHRyczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj17fTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09dC4kcHJvcHNbZV19KSxufX0sbWV0aG9kczp7X3Nob3c6ZnVuY3Rpb24oKXt0aGlzLl9zaG93UGlja2VyKE9iamVjdC5hc3NpZ24oe30sdGhpcy5hdHRycykpfSxfc2hvd1BpY2tlcjpmdW5jdGlvbihuKXt2YXIgcj10aGlzLGU9dC5wbHVzfHxuZXcgdC5XZWV4UGx1cyh0LndlZXgpO2lmKGUua2V5LmhpZGVTb2Z0S2V5Ym9yZCgpLHRoaXMubW9kZSE9PW8uVElNRSYmdGhpcy5tb2RlIT09by5EQVRFfHxuLmZpZWxkcyl7bi5maWVsZHM9T2JqZWN0LnZhbHVlcyhhKS5pbmNsdWRlcyhuLmZpZWxkcyk/bi5maWVsZHM6YS5EQVk7dmFyIGk9e2V2ZW50OiJjYW5jZWwifTt0aGlzLnBhZ2U9c2hvd1BhZ2Uoe2NvbnRleHQ6T2JqZWN0LmFzc2lnbih7fSx0LHtwbHVzOmV9KSx1cmw6Il9fdW5pYXBwcGlja2VyIixkYXRhOm4sc3R5bGU6e3RpdGxlTlZpZXc6ITEsYW5pbWF0aW9uVHlwZToibm9uZSIsYW5pbWF0aW9uRHVyYXRpb246MCxiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDApIixwb3BHZXN0dXJlOiJub25lIn0sb25NZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZXZlbnQ7aWYoImNyZWF0ZWQiIT09dClyZXR1cm4iY29sdW1uY2hhbmdlIj09PXQ/KGRlbGV0ZSBlLmV2ZW50LHZvaWQgci4kdHJpZ2dlcih0LGUpKTp2b2lkKGk9ZSk7ci5fdXBkYXRlUGlja2VyKG4pfSxvbkNsb3NlOmZ1bmN0aW9uKCl7ci5wYWdlPW51bGw7dmFyIGU9aS5ldmVudDtkZWxldGUgaS5ldmVudCxyLiR0cmlnZ2VyKGUsaSl9fSl9ZWxzZSBlLm5hdGl2ZVVJW3RoaXMubW9kZT09PW8uVElNRT8icGlja1RpbWUiOiJwaWNrRGF0ZSJdKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTpyLm1vZGU9PT1vLlRJTUU/cyh0LmdldEhvdXJzKCkpKyI6IitzKHQuZ2V0TWludXRlcygpKTp0LmdldEZ1bGxZZWFyKCkrIi0iK3ModC5nZXRNb250aCgpKzEpKyItIitzKHQuZ2V0RGF0ZSgpKX0pfSxmdW5jdGlvbigpe3IuJHRyaWdnZXIoImNhbmNlbCIse30pfSx0aGlzLm1vZGU9PT1vLlRJTUU/e3RpbWU6Yyh0aGlzLnZhbHVlLG8uVElNRSl9OntkYXRlOmModGhpcy52YWx1ZSxvLkRBVEUpLG1pbkRhdGU6Yyh0aGlzLnN0YXJ0LG8uREFURSksbWF4RGF0ZTpjKHRoaXMuZW5kLG8uREFURSl9KX0sX3VwZGF0ZVBpY2tlcjpmdW5jdGlvbihlKXt0aGlzLnBhZ2UmJnRoaXMucGFnZS5zZW5kTWVzc2FnZShlKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuJHdhdGNoKCJhdHRycyIsZnVuY3Rpb24oZSl7dC5fdXBkYXRlUGlja2VyKGUpfSx7ZGVlcDohMH0pfSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCh0LmNsaWNrPXRoaXMuX3Nob3cpLGUoImRpdiIsdGhpcy5fZyh7b246dH0sdGhpcy4kbGlzdGVuZXIpLHRoaXMuJHNsb3RzLmRlZmF1bHQsMil9fX1mdW5jdGlvbiBpbml0JDE0KGUsdCxuKXtlLmNvbXBvbmVudCgicGlja2VyIixnZXRQaWNrZXIodCxuKSl9UGFnZS5wcm90b3R5cGUuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOmV9fSkpO25ldyBCcm9hZGNhc3RDaGFubmVsXyh0aGlzLndlYnZpZXcuaWQpLnBvc3RNZXNzYWdlKHQpfSxQYWdlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMud2Vidmlldy5jbG9zZSgpfTt2YXIgUFJJTUFSWV9DT0xPUj0iIzAwN0FGRiIsQkFDS0dST1VORF9DT0xPUj0iI0VCRUJFQiIsQU5JTUFURV9JTlRFUlZBTF9ERUZBVUxUPTMwLEZPTlRfU0laRT0xNixTVFJPS0VfV0lEVEg9NjtmdW5jdGlvbiBnZXRQcm9ncmVzcyhlLG4pe3JldHVybntuYW1lOiJQcm9ncmVzcyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOntwZXJjZW50Ont0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjB9LHNob3dJbmZvOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYm9yZGVyUmFkaXVzOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjB9LGZvbnRTaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OkZPTlRfU0laRX0sc3Ryb2tlV2lkdGg6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6U1RST0tFX1dJRFRIfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpQUklNQVJZX0NPTE9SfSxhY3RpdmVNb2RlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJiYWNrd2FyZHMifSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6QkFDS0dST1VORF9DT0xPUn0sZHVyYXRpb246e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6QU5JTUFURV9JTlRFUlZBTF9ERUZBVUxUfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDowLGN1clBlcmNlbnQ6MH19LGNvbXB1dGVkOntiYXJTdHlsZTpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6dGhpcy5zdHJva2VXaWR0aCxib3JkZXJSYWRpdXM6dGhpcy5ib3JkZXJSYWRpdXMsYmFja2dyb3VuZENvbG9yOnRoaXMuYmFja2dyb3VuZENvbG9yfX0saW5uZXJCYXJTdHlsZTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp0aGlzLmFjdGl2ZVdpZHRoLGhlaWdodDp0aGlzLnN0cm9rZVdpZHRoLGJhY2tncm91bmRDb2xvcjp0aGlzLmFjdGl2ZUNvbG9yfX0sYWN0aXZlV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJQZXJjZW50KnRoaXMud2lkdGgvMTAwfSxmaW5hbFBlcmNlbnQ6ZnVuY3Rpb24oKXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMucGVyY2VudCwxMCk7cmV0dXJuIDEwMDxlJiYoZT0xMDApLGU8MCYmKGU9MCksZX19LHdhdGNoOntmaW5hbFBlcmNlbnQ6ZnVuY3Rpb24oZSx0KXt0aGlzLl90aW1lcklkJiZuLmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXJJZCksdGhpcy5fbGFzdFBlcmNlbnQ9dHx8MCx0aGlzLl9hbmltYXRlKCl9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHQuJHJlZnMucHJvZ3Jlc3MsZnVuY3Rpb24oZSl7dC53aWR0aD1lLnNpemUud2lkdGgsdC5fYW5pbWF0ZSgpfSl9LDUwKX0sbWV0aG9kczp7X2FuaW1hdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5maW5hbFBlcmNlbnQ7aWYoIXRoaXMuYWN0aXZlKXJldHVybiB0aGlzLmN1clBlcmNlbnQ9dDt0aGlzLmN1clBlcmNlbnQ9ImZvcndhcmRzIj09PXRoaXMuYWN0aXZlTW9kZT90aGlzLl9sYXN0UGVyY2VudDowLHRoaXMuX3RpbWVySWQ9bi5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3Q8PWUuY3VyUGVyY2VudCsxPyhlLmN1clBlcmNlbnQ9dCxuLmNsZWFySW50ZXJ2YWwoZS5fdGltZXJJZCksZS4kdHJpZ2dlcigiYWN0aXZlZW5kIix7Y3VyUGVyY2VudDplLmN1clBlcmNlbnR9KSk6KytlLmN1clBlcmNlbnR9LHRoaXMuZHVyYXRpb24pfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3JlZjoicHJvZ3Jlc3MiLHN0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzIl19LHRoaXMuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzLWJhciJdLHN0eWxlOnRoaXMuYmFyU3R5bGV9LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1wcm9ncmVzcy1pbm5lci1iYXIiXSxzdHlsZTp0aGlzLmlubmVyQmFyU3R5bGV9KV0pLHRoaXMuc2hvd0luZm8/W2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzLWluZm8iXSxzdHlsZTp7Zm9udFNpemU6dGhpcy5mb250U2l6ZX19LFt0aGlzLmN1clBlcmNlbnQrIiUiXSldOnRoaXMuX2UoKV0sMil9LHN0eWxlOnsidW5pLXByb2dyZXNzIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn0sInVuaS1wcm9ncmVzcy1iYXIiOntmbGV4OjF9LCJ1bmktcHJvZ3Jlc3MtaW5uZXItYmFyIjp7cG9zaXRpb246ImFic29sdXRlIn0sInVuaS1wcm9ncmVzcy1pbmZvIjp7bWFyZ2luTGVmdDoiMTVweCJ9fX19ZnVuY3Rpb24gaW5pdCQxNShlLHQsbil7ZS5jb21wb25lbnQoInByb2dyZXNzIixnZXRQcm9ncmVzcyh0LG4pKX1mdW5jdGlvbiBnZXRSYWRpb0dyb3VwKGUpe3JldHVybntuYW1lOiJSYWRpb0dyb3VwIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntyYWRpb0xpc3Q6W119fSxsaXN0ZW5lcnM6eyJAcmFkaW8tY2hhbmdlIjoiX2NoYW5nZUhhbmRsZXIiLCJAcmFkaW8tZ3JvdXAtdXBkYXRlIjoiX3JhZGlvR3JvdXBVcGRhdGVIYW5kbGVyIn0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0UmFkaW9Hcm91cFZhbHVlKHRoaXMucmFkaW9MaXN0Lmxlbmd0aC0xKX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfY2hhbmdlSGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMucmFkaW9MaXN0LmluZGV4T2YodCk7dGhpcy5fcmVzZXRSYWRpb0dyb3VwVmFsdWUobiwhMCksdGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7dmFsdWU6dC5yYWRpb1ZhbHVlfSl9LF9yYWRpb0dyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLnJhZGlvTGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5yYWRpb0xpc3QuaW5kZXhPZihlLnZtKTt0aGlzLnJhZGlvTGlzdC5zcGxpY2UodCwxKX19LF9yZXNldFJhZGlvR3JvdXBWYWx1ZTpmdW5jdGlvbih0LHIpe3ZhciBpPXRoaXM7dGhpcy5yYWRpb0xpc3QuZm9yRWFjaChmdW5jdGlvbihlLG4pe24hPT10JiYocj9pLnJhZGlvTGlzdFtuXS5yYWRpb0NoZWNrZWQ9ITE6aS5yYWRpb0xpc3QuZm9yRWFjaChmdW5jdGlvbihlLHQpe3Q8PW58fGkucmFkaW9MaXN0W3RdLnJhZGlvQ2hlY2tlZCYmKGkucmFkaW9MaXN0W25dLnJhZGlvQ2hlY2tlZD0hMSl9KSl9KX0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307aWYoIiIhPT10aGlzLm5hbWUpe3ZhciB0PSIiO3RoaXMucmFkaW9MaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yYWRpb0NoZWNrZWQmJih0PWUudmFsdWUpfSksZS52YWx1ZT10LGUua2V5PXRoaXMubmFtZX1yZXR1cm4gZX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHt9LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDE2KGUsdCl7ZS5jb21wb25lbnQoInJhZGlvLWdyb3VwIixnZXRSYWRpb0dyb3VwKHQpKX1mdW5jdGlvbiBnZXRSYWRpbyhlKXtyZXR1cm57bmFtZToiUmFkaW8iLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2NoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN0FGRiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntyYWRpb0NoZWNrZWQ6dGhpcy5jaGVja2VkLHJhZGlvVmFsdWU6dGhpcy52YWx1ZX19LGxpc3RlbmVyczp7ImxhYmVsLWNsaWNrIjoiX29uQ2xpY2siLCJAbGFiZWwtY2xpY2siOiJfb25DbGljayJ9LGNvbXB1dGVkOntjaGVja2VkU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57YmFja2dyb3VuZENvbG9yOnRoaXMuY29sb3IsYm9yZGVyQ29sb3I6dGhpcy5jb2xvcn19LHVuY2hlY2tlZFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2JvcmRlckNvbG9yOiIjZDFkMWQxIn19fSx3YXRjaDp7Y2hlY2tlZDpmdW5jdGlvbihlKXt0aGlzLnJhZGlvQ2hlY2tlZD1lfSx2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnJhZGlvVmFsdWU9ZX19LGJlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe30sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJSYWRpb0dyb3VwIiwidW5pLXJhZGlvLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiUmFkaW9Hcm91cCIsInVuaS1yYWRpby1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlKXt0aGlzLmRpc2FibGVkfHx0aGlzLnJhZGlvQ2hlY2tlZHx8KHRoaXMucmFkaW9DaGVja2VkPSEwLHRoaXMuJGRpc3BhdGNoKCJSYWRpb0dyb3VwIiwidW5pLXJhZGlvLWNoYW5nZSIsZSx0aGlzKSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5yYWRpb0NoZWNrZWQ9ITF9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgiZGl2Iix0Ll9nKHtzdGF0aWNDbGFzczpbInVuaS1yYWRpbyJdLGF0dHJzOntkYXRhVW5jVHlwZToidW5pLXJhZGlvIn0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSx0LiRsaXN0ZW5lcnMpLFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1yYWRpby1pbnB1dCJdLHN0eWxlOnQucmFkaW9DaGVja2VkP3QuY2hlY2tlZFN0eWxlOnQudW5jaGVja2VkU3R5bGV9LFt0LnJhZGlvQ2hlY2tlZD9lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInVuaS1yYWRpby1pbnB1dC1pY29uIl19LFt0Ll92KHQuX3MoIu6oiCIpKV0pOnQuX2UoKV0sMSksZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktdGV4dCJdfSxbdC5fdCgiZGVmYXVsdCIpXSwyKV0sMSl9LHN0eWxlOnsidW5pLXJhZGlvIjp7YWxpZ25JdGVtczoiY2VudGVyIixmbGV4RGlyZWN0aW9uOiJyb3cifSwidW5pLXJhZGlvLWlucHV0Ijp7cG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLG1hcmdpblJpZ2h0OiI1IixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixib3JkZXJSYWRpdXM6NTAsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIixvdXRsaW5lOjB9LCJ1bmktcmFkaW8taW5wdXQtaWNvbiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIixmb250U2l6ZToiMTQiLGNvbG9yOiIjZmZmZmZmIn0sInVuaS1yYWRpby1pbnB1dC1kaXNhYmxlZCI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGNvbG9yOiIjYWRhZGFkIn19fX1mdW5jdGlvbiBpbml0JDE3KGUsdCl7ZS5jb21wb25lbnQoInJhZGlvIixnZXRSYWRpbyh0KSl9ZnVuY3Rpb24gbm9ybWFsaXplTm9kZXMoZSx0LG4pe3ZhciBjPVsic3BhbiIsImEiLCJpbWFnZSIsImltZyJdO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUuX19ibG9jaz0hMCxlfWZ1bmN0aW9uIHIobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHI9byxpPXQsIShuPWUpLnN0eWxlLmZvbnRTaXplJiYobi5zdHlsZS5mb250U2l6ZT1pLmRlZmF1bHRGb250U2l6ZSpyKSxhKHMobikpO3ZhciBuLHIsaX19ZnVuY3Rpb24gcyhlKXtyZXR1cm4hZS5zdHlsZS5mb250V2VpZ2h0JiYoZS5zdHlsZS5mb250V2VpZ2h0PSJib2xkIiksZX12YXIgdT17YmxvY2txdW90ZTphLGJyOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9fdmFsdWU9IiAiLGEoZSl9LGRpdjphLGRsOmEsaDE6cigyKSxoMjpyKDEuNSksaDM6cigxLjE3KSxoNDpyKDEpLGg1OnIoLjgzKSxoNjpyKC42NyksaHI6YSxvbDphLHA6YSxzdHJvbmc6cyx0YWJsZTphLHRib2R5OmEsdGZvb3Q6YSx0aGVhZDphLHVsOmF9LGw9LyYoYW1wfGd0fGx0fG5ic3B8cXVvdHxhcG9zKTsvZyxkPXthbXA6IiYiLGd0OiI+IixsdDoiPCIsbmJzcDoiICIscXVvdDonIicsYXBvczoiJyJ9O3ZhciBmLHA9e19fYmxvY2s6ITAsX19icmVhazohMCxjaGlsZHJlbjpbXX07ZnVuY3Rpb24gaSh0LGUsbil7dmFyIHI9KHQubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCksaT1yLG89dVtyXTstMT09PWMuaW5kZXhPZihyKSYmKHI9InNwYW4iKSwiaW1nIj09PXImJihyPSJpbWFnZSIpO3ZhciBhPXt0eXBlOnIsX190eXBlOmksYXR0cjpPYmplY3QuY3JlYXRlKG51bGwpfTtpZigoInRleHQiPT09dC50eXBlfHx0LnRleHQpJiYoYS5fX3ZhbHVlPWEuYXR0ci52YWx1ZT0odC50ZXh0fHwiIikudHJpbSgpLnJlcGxhY2UobCxmdW5jdGlvbihlLHQpe3JldHVybiBkW3RdfSkpLHQuYXR0cnMmJk9iamVjdC5rZXlzKHQuYXR0cnMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImNsYXNzIiE9PWUmJiJzdHlsZSIhPT1lJiYoYS5hdHRyW2VdPXQuYXR0cnNbZV0pfSksYS5zdHlsZT1ub3JtYWxpemVVbml0KGZ1bmN0aW9uKGUsdCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihlLmF0dHJzKXt2YXIgcj0oZS5hdHRycy5jbGFzc3x8IiIpLnNwbGl0KCIgIiksaT10LiRvcHRpb25zLnN0eWxlfHx7fTtyLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmaVtlXSYmT2JqZWN0LmFzc2lnbihuLGlbZV0pfSksT2JqZWN0LmFzc2lnbihuLHBhcnNlU3R5bGVUZXh0KGUuYXR0cnMuc3R5bGV8fCIiKSl9aWYoImltZyI9PT1lLm5hbWV8fCJpbWFnZSI9PT1lLm5hbWUpe3ZhciBvPWUuYXR0cnM7bi53aWR0aD1uLndpZHRofHxvLndpZHRoLG4uaGVpZ2h0PW4uaGVpZ2h0fHxvLmhlaWdodH1yZXR1cm4gbn0odCxlKSksbyYmbyhhLG4pLChwLl9fYmxvY2t8fGEuX19ibG9jaykmJiFmKXt2YXIgcz17dHlwZToic3BhbiIsX190eXBlOiJicmVhayIsYXR0cjp7dmFsdWU6IlxuIn19O3AuY2hpbGRyZW4ucHVzaChzKSxmPVtwLHNdfXJldHVybigocD1hKS5fX3ZhbHVlfHwiaW1hZ2UiPT09cC50eXBlJiZwLmF0dHIuc3JjKSYmKGY9bnVsbCksYS5jaGlsZHJlbj1oKHQuY2hpbGRyZW4sZSxuKSwocD1hKS5fX2Jsb2NrJiZwLnN0eWxlLmhlaWdodCYmIS9eMChweCk/JC8udGVzdChwLnN0eWxlLmhlaWdodCkmJihmPW51bGwpLGF9ZnVuY3Rpb24gaChlLHQsbil7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSx0LG4pfSk6W119dmFyIG89aChlLHQsbik7aWYoZil7dmFyIHY9ZlswXSxnPWZbMV0sbT12LmNoaWxkcmVuLHk9bS5pbmRleE9mKGcpO20uc3BsaWNlKHksMSl9cmV0dXJuIG99ZnVuY3Rpb24gZ2V0UmljaFRleHQoZSl7cmV0dXJue25hbWU6IlJpY2hUZXh0Iixpc1Jlc2VydmVkOiEwLHByb3BzOntub2Rlczp7dHlwZTpbQXJyYXksU3RyaW5nXSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PW5vcm1hbGl6ZU5vZGVzKHRoaXMubm9kZXN8fFtdLHRoaXMuJHZub2RlLmNvbnRleHQse2RlZmF1bHRGb250U2l6ZToxNn0pO3JldHVybiBlKCJ1LXJpY2gtdGV4dCIsdGhpcy5fZyh7YXR0cnM6e3ZhbHVlOnR9fSx0aGlzLiRsaXN0ZW5lcnMpKX19fWZ1bmN0aW9uIGluaXQkMTgoZSx0KXtlLmNvbXBvbmVudCgicmljaC10ZXh0IixnZXRSaWNoVGV4dCh0KSl9ZnVuY3Rpb24gZ2V0U3dpcGVySXRlbShlKXtyZXR1cm57bmFtZToiU3dpcGVySXRlbSIsaXNSZXNlcnZlZDohMCxwcm9wczp7aXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLXN3aXBlci1pdGVtIl0sc3RhdGljU3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9fSx0aGlzLiRsaXN0ZW5lcnMpLHRoaXMuX3QoImRlZmF1bHQiKSwyKX19fWZ1bmN0aW9uIGluaXQkMTkoZSx0KXtlLmNvbXBvbmVudCgic3dpcGVyLWl0ZW0iLGdldFN3aXBlckl0ZW0odCkpfWZ1bmN0aW9uIGdldFN3aXBlcihyKXt2YXIgdD1yLnJlcXVpcmVNb2R1bGUoImRvbSIpO3JldHVybntuYW1lOiJTd2lwZXIiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyXSxwcm9wczp7aW5kaWNhdG9yRG90czp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHZlcnRpY2FsOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sYXV0b3BsYXk6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjaXJjdWxhcjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGludGVydmFsOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjVlM30sZHVyYXRpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NTAwfSxjdXJyZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LGluZGljYXRvckNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJyZ2JhKDAsMCwwLC4zKSJ9LGluZGljYXRvckFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDAwMDAwIn0scHJldmlvdXNNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG5leHRNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGN1cnJlbnRJdGVtSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNraXBIaWRkZW5JdGVtTGF5b3V0Ont0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZGlzcGxheU11bHRpcGxlSXRlbXM6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZVRvdWNoOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudFN5bmM6dGhpcy5jdXJyZW50LGN1cnJlbnRDaGFuZ2VTb3VyY2U6ImF1dG9wbGF5In19LHdhdGNoOntjdXJyZW50OmZ1bmN0aW9uKCl7dGhpcy5fY3VycmVudENoZWNrKCl9LGN1cnJlbnRJdGVtSWQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJyZW50Q2hlY2soKX0sY3VycmVudFN5bmM6ZnVuY3Rpb24oKXt0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHRoaXMuX2dldERldGFpbCgpKX19LG1ldGhvZHM6e29uQ2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGV0YWlsOyJzdHJpbmciPT10eXBlb2YgdC5zb3VyY2UmJih0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2U9dC5zb3VyY2UpLHRoaXMuY3VycmVudFN5bmM9dC5pbmRleCx0aGlzLl9sYXN0T2Zmc2V0UmF0aW89MH0sb25TY3JvbGw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy52ZXJ0aWNhbD9lLmRldGFpbC5vZmZzZXRZUmF0aW86ZS5kZXRhaWwub2Zmc2V0WFJhdGlvO2lmKChlLmRyYWd8fGUuZGV0YWlsLmRyYWcpJiYodGhpcy5jdXJyZW50Q2hhbmdlU291cmNlPSJ0b3VjaCIpLDA9PT10KXt2YXIgbj1NYXRoLmFicyh0aGlzLl9sYXN0T2Zmc2V0UmF0aW8pO2lmKDE9PT1uKXJldHVybjsuNTxuJiYodD0xKX10aGlzLl9sYXN0T2Zmc2V0UmF0aW89dCx0aGlzLiR0cmlnZ2VyKCJ0cmFuc2l0aW9uIix7ZHg6dGhpcy52ZXJ0aWNhbD8wOi10aGlzLl93aWR0aCp0LGR5OnRoaXMudmVydGljYWw/LXRoaXMuX2hlaWdodCp0OjB9KX0sb25TY3JvbGxFbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWZ1bmN0aW9uKCl7dC4kdHJpZ2dlcigiYW5pbWF0aW9uZmluaXNoIix0Ll9nZXREZXRhaWwoKSksdC5jdXJyZW50Q2hhbmdlU291cmNlPSJhdXRvcGxheSJ9OyJpT1MiPT09ci5jb25maWcuZW52LnBsYXRmb3JtP3NldFRpbWVvdXQobiw1MCk6bigpfSxfZ2V0RGV0YWlsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jdXJyZW50U3luYyx0PXRoaXMuaXRlbXNbZV18fHt9O3JldHVybntjdXJyZW50OmUsY3VycmVudEl0ZW1JZDp0LmNvbXBvbmVudEluc3RhbmNlJiZ0LmNvbXBvbmVudEluc3RhbmNlLml0ZW1JZHx8IiIsc291cmNlOnRoaXMuY3VycmVudENoYW5nZVNvdXJjZX19LF9jdXJyZW50Q2hlY2s6ZnVuY3Rpb24oKXt2YXIgZT0tMTtpZih0aGlzLmN1cnJlbnRJdGVtSWQpZm9yKHZhciB0PTAsbj10aGlzLml0ZW1zO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdLmNvbXBvbmVudEluc3RhbmNlO2lmKHImJnIuaXRlbUlkPT09dGhpcy5jdXJyZW50SXRlbUlkKXtlPXQ7YnJlYWt9fWU8MCYmKGU9TWF0aC5yb3VuZCh0aGlzLmN1cnJlbnQpfHwwKSxlPWU8MD8wOmUsdGhpcy5jdXJyZW50U3luYyE9PWUmJih0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2U9IiIsdGhpcy5jdXJyZW50U3luYz1lKX0sX2dldFdIOmZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9nZXRDb21wb25lbnRTaXplKHRoaXMuJHJlZnMuZWwpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0O2UudG9wLGUubGVmdDtyLl93aWR0aD10LHIuX2hlaWdodD1ufSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0LmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXSx0aGlzLl93aWR0aD10aGlzLmhlaWdodD0wfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9jdXJyZW50Q2hlY2soKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fZ2V0V0goKX0sMTAwKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdOyhBcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP2RlZXBDbG9uZSh0aGlzLiRzbG90cy5kZWZhdWx0LGUpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50T3B0aW9ucyYmInN3aXBlci1pdGVtIj09PWUuY29tcG9uZW50T3B0aW9ucy50YWcmJnQucHVzaChlKX0pLHRoaXMuaXRlbXM9dDt2YXIgbj17fSxyPXRoaXMuJGxpc3RlbmVycztyZXR1cm4oci5jaGFuZ2V8fHIuYW5pbWF0aW9uZmluaXNofHxyLnRyYW5zaXRpb24pJiYobi5zY3JvbGw9dGhpcy5vblNjcm9sbCxuLnNjcm9sbGVuZD10aGlzLm9uU2Nyb2xsRW5kKSxyLmNoYW5nZSYmKG4uY2hhbmdlPXRoaXMub25DaGFuZ2UpLGUoImRpdiIsdGhpcy5fZyh7cmVmOiJlbCIsc3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyIl19LHIpLFtlKCJzbGlkZXIiLHtzdGF0aWNDbGFzczpbInVuaS1zd2lwZXItc2xpZGVyIl0sYXR0cnM6e2F1dG9QbGF5OnRoaXMuYXV0b3BsYXksaW50ZXJ2YWw6dGhpcy5pbnRlcnZhbCxpbmRleDp0aGlzLmN1cnJlbnRTeW5jLGtlZXBJbmRleDohMCxzaG93SW5kaWNhdG9yczp0aGlzLmluZGljYXRvckRvdHMsaW5maW5pdGU6dGhpcy5jaXJjdWxhcix2ZXJ0aWNhbDp0aGlzLnZlcnRpY2FsLHNjcm9sbGFibGU6IXRoaXMuZGlzYWJsZVRvdWNofSxvbjpufSx0LmNvbmNhdChbZSgiaW5kaWNhdG9yIix7c3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyLWRvdHMiXSxzdHlsZTp7aXRlbUNvbG9yOnRoaXMuaW5kaWNhdG9yQ29sb3IsaXRlbVNlbGVjdGVkQ29sb3I6dGhpcy5pbmRpY2F0b3JBY3RpdmVDb2xvcixpdGVtU2l6ZTo4LG9wYWNpdHk6dGhpcy5pbmRpY2F0b3JEb3RzPzE6MH19KV0pLDIpXSl9LHN0eWxlOnsidW5pLXN3aXBlciI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OiIxNTBweCJ9LCJ1bmktc3dpcGVyLXNsaWRlciI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9LCJ1bmktc3dpcGVyLWRvdHMiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLGJvdHRvbToiMTAiLGhlaWdodDoiMTAifX19fWZ1bmN0aW9uIGluaXQkMjAoZSx0KXtlLmNvbXBvbmVudCgic3dpcGVyIixnZXRTd2lwZXIodCkpfWZ1bmN0aW9uIGdldFN3aXRjaChlKXtyZXR1cm57bmFtZToiU3dpdGNoIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoic3dpdGNoIn0sY2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntzd2l0Y2hDaGVja2VkOnRoaXMuY2hlY2tlZH19LHdhdGNoOntjaGVja2VkOmZ1bmN0aW9uKGUpe3RoaXMuc3dpdGNoQ2hlY2tlZD1lfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlLHQpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLnN3aXRjaENoZWNrZWQ9ZS5kZXRhaWw/ZS5kZXRhaWwudmFsdWU6IXRoaXMuc3dpdGNoQ2hlY2tlZCx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0aGlzLnN3aXRjaENoZWNrZWR9KSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zd2l0Y2hDaGVja2VkPSExfSxfZ2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4iIiE9PXRoaXMubmFtZSYmKGUudmFsdWU9dGhpcy5zd2l0Y2hDaGVja2VkLGUua2V5PXRoaXMubmFtZSksZX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kbGlzdGVuZXJzO3JldHVybiBlKCJkaXYiLHQuX2coe3N0eWxlOntwYWRkaW5nUmlnaHQ6NX19LG4pLFsic3dpdGNoIj09PXQudHlwZT9lKCJkYy1zd2l0Y2giLHthdHRyczp7ZGF0YVVuY1R5cGU6InVuaS1zd2l0Y2giLGNvbG9yOnQuY29sb3IsY2hlY2tlZDp0LnN3aXRjaENoZWNrZWQsZGlzYWJsZWQ6dC5kaXNhYmxlZH0sc3R5bGU6e3dpZHRoOjUyLGhlaWdodDozMn0sb246e2NoYW5nZTp0Ll9vbkNsaWNrfX0pOnQuX2UoKSwiY2hlY2tib3giPT09dC50eXBlP2UoImNoZWNrYm94Iix7YXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktc3dpdGNoIixjaGVja2VkOnQuc3dpdGNoQ2hlY2tlZCxkaXNhYmxlZDp0LmRpc2FibGVkfSxzdHlsZTp7Y29sb3I6dC5jb2xvcn0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSk6dC5fZSgpXSwxKX0sbGlzdGVuZXJzOnsibGFiZWwtY2xpY2siOiJfb25DbGljayIsIkBsYWJlbC1jbGljayI6Il9vbkNsaWNrIn19fWZ1bmN0aW9uIGluaXQkMjEoZSx0KXtlLmNvbXBvbmVudCgic3dpdGNoIixnZXRTd2l0Y2godCkpfWZ1bmN0aW9uIGdldFNsaWRlcihlKXtyZXR1cm57bmFtZToiVVNsaWRlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMDB9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHN0ZXA6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LGJsb2NrQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNmZmZmZmYifSxibG9ja1NpemU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mjh9LHNob3dWYWx1ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3NsaWRlcldpZHRoOjAsc2xpZGVyVmFsdWU6TnVtYmVyKHRoaXMudmFsdWUpfX0sY29tcHV0ZWQ6e3NsaWRlclRodW1iT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE51bWJlcih0aGlzLmJsb2NrU2l6ZSkvMn0sdHJhY2tUYXBTdHlsZTpmdW5jdGlvbigpe3JldHVybntwYWRkaW5nVG9wOnRoaXMuc2xpZGVyVGh1bWJPZmZzZXQscGFkZGluZ0JvdHRvbTp0aGlzLnNsaWRlclRodW1iT2Zmc2V0fX0sdHJhY2tTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QmdDb2xvcigpLG1hcmdpbkxlZnQ6dGhpcy5zbGlkZXJUaHVtYk9mZnNldCxtYXJnaW5SaWdodDp0aGlzLnNsaWRlclRodW1iT2Zmc2V0fX0sdHJhY2tBY3RpdmVTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QWN0aXZlQ29sb3IoKSx3aWR0aDp0aGlzLnRodW1iVmFsdWUrInB4In19LHRodW1iU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6dGhpcy5ibG9ja1NpemUrInB4IixoZWlnaHQ6dGhpcy5ibG9ja1NpemUrInB4IixsZWZ0OnRoaXMudGh1bWJWYWx1ZSsicHgiLGJhY2tncm91bmRDb2xvcjp0aGlzLmJsb2NrQ29sb3J9fSx0aHVtYlZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuc2xpZGVyVmFsdWUtTnVtYmVyKHRoaXMubWluKSkvKE51bWJlcih0aGlzLm1heCktTnVtYmVyKHRoaXMubWluKSkqdGhpcy5zbGlkZXJXaWR0aH19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnNsaWRlclZhbHVlPU51bWJlcihlKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3gwPTAsdGhpcy5feDE9MCx0aGlzLiRldmVudE9sZD1udWxsLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QodC4kcmVmc1sic2xpZGVyLXRyYWNrIl0sZnVuY3Rpb24oZSl7dC5zbGlkZXJXaWR0aD1lLnNpemUud2lkdGh9KX0sNTApfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSl9LG1ldGhvZHM6e19oYW5kbGVTdGFydDpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJiF0aGlzLl8kZXZlbnRPbGQpe3ZhciB0PSh0aGlzLl8kZXZlbnRPbGQ9ZSkuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg7dGhpcy5feDA9dGhpcy5feDE9dCx0aGlzLl9vblRyYWNrKCJzdGFydCIsdCl9fSxfaGFuZGxlTW92ZTpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJnRoaXMuXyRldmVudE9sZCl7dmFyIHQ9ZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDt0aGlzLl9vblRyYWNrKCJtb3ZlIix0KSx0aGlzLl94MT10fX0sX2hhbmRsZUVuZDpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJnRoaXMuXyRldmVudE9sZCl7dmFyIHQ9ZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDt0aGlzLl8kZXZlbnRPbGQ9bnVsbCx0aGlzLl9vblRyYWNrKCJlbmQiLHQpfX0sX29uVHJhY2s6ZnVuY3Rpb24oZSx0KXt0aGlzLmRpc2FibGVkfHwoIm1vdmUiPT09ZT8odGhpcy5fb25Vc2VyQ2hhbmdlZFZhbHVlKHt4OnR9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2luZyIse3ZhbHVlOnRoaXMuc2xpZGVyVmFsdWV9KSk6ImVuZCI9PT1lJiYodGhpcy5fb25Vc2VyQ2hhbmdlZFZhbHVlKHt4OnR9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0aGlzLnNsaWRlclZhbHVlfSkpKX0sX29uVXNlckNoYW5nZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLngtdGhpcy5ibG9ja1NpemUvMjt0PDAmJih0PTApLHQ+dGhpcy5zbGlkZXJXaWR0aCYmKHQ9dGhpcy5zbGlkZXJXaWR0aCk7dmFyIG49TnVtYmVyKHRoaXMubWluKSxyPU51bWJlcih0aGlzLm1heCksaT1OdW1iZXIodGhpcy5zdGVwKSxvPXQvdGhpcy5zbGlkZXJXaWR0aCooci1uKTswPGkmJmk8byYmbyVpL2khPTAmJihvLT1vJWkpLHRoaXMuc2xpZGVyVmFsdWU9cGFyc2VJbnQobytuKX0sX2dldEJnQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iI2U5ZTllOSIhPT10aGlzLmJhY2tncm91bmRDb2xvcj90aGlzLmJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiIhPT10aGlzLmNvbG9yP3RoaXMuY29sb3I6IiMwMDdhZmYifSxfZ2V0QWN0aXZlQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iIzAwN2FmZiIhPT10aGlzLmFjdGl2ZUNvbG9yP3RoaXMuYWN0aXZlQ29sb3I6IiNlOWU5ZTkiIT09dGhpcy5zZWxlY3RlZENvbG9yP3RoaXMuc2VsZWN0ZWRDb2xvcjoiI2U5ZTllOSJ9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zbGlkZXJWYWx1ZT10aGlzLm1pbn0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIiIhPT10aGlzLm5hbWUmJihlLnZhbHVlPXRoaXMuc2xpZGVyVmFsdWUsZS5rZXk9dGhpcy5uYW1lKSxlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyIl19LHQuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXNsaWRlci13cmFwcGVyIl19LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdGFwLWFyZWEiXSxvbjp7dG91Y2hzdGFydDp0Ll9oYW5kbGVTdGFydCx0b3VjaG1vdmU6dC5faGFuZGxlTW92ZSx0b3VjaGVuZDp0Ll9oYW5kbGVFbmR9LHN0eWxlOnQudHJhY2tUYXBTdHlsZX0sW2UoImRpdiIse3JlZjoic2xpZGVyLXRyYWNrIixzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItaGFuZGxlLXdyYXBwZXIiXSxzdHlsZTp0LnRyYWNrU3R5bGV9LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdHJhY2siXSxzdHlsZTp0LnRyYWNrQWN0aXZlU3R5bGV9KV0pLGUoImRpdiIse3JlZjoidW5pLXNsaWRlci1oYW5kbGUiLHN0YXRpY0NsYXNzOlsidW5pLXNsaWRlci10aHVtYiJdLHN0eWxlOnQudGh1bWJTdHlsZX0pXSksdC5zaG93VmFsdWU/ZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyLXZhbHVlIl19LFt0Ll92KHQuX3ModC5zbGlkZXJWYWx1ZSkpXSk6dC5fZSgpXSldKX0sc3R5bGU6eyJ1bmktc2xpZGVyIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246ImNvbHVtbiJ9LCJ1bmktc2xpZGVyLXdyYXBwZXIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9LCJ1bmktc2xpZGVyLXRhcC1hcmVhIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIiLHBhZGRpbmdUb3A6IjE0IixwYWRkaW5nQm90dG9tOiIxNCJ9LCJ1bmktc2xpZGVyLWhhbmRsZS13cmFwcGVyIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsaGVpZ2h0OiIyIixtYXJnaW5SaWdodDoiMTQiLG1hcmdpbkxlZnQ6IjE0Iixib3JkZXJSYWRpdXM6IjUiLGJhY2tncm91bmRDb2xvcjoiI2U5ZTllOSJ9LCJ1bmktc2xpZGVyLXRyYWNrIjp7aGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjYiLGJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiJ9LCJ1bmktc2xpZGVyLXRodW1iIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjEiLHdpZHRoOiIyOCIsaGVpZ2h0OiIyOCIsYm9yZGVyUmFkaXVzOjUwLGJveFNoYWRvdzoiMCAwIDRweCAjZWJlYmViIn0sInVuaS1zbGlkZXItdmFsdWUiOntjb2xvcjoiIzg4ODg4OCIsZm9udFNpemU6IjE2Iix3aWR0aDoiMzAifX19fWZ1bmN0aW9uIGluaXQkMjIoZSx0KXtlLmNvbXBvbmVudCgidS1zbGlkZXIiLGdldFNsaWRlcih0KSl9ZnVuY3Rpb24gZ2V0UGlja2VyVmlldyhlKXtyZXR1cm57bmFtZToiUGlja2VyVmlldyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOnt2YWx1ZTp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119LHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKSYmZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfSkubGVuZ3RoPT09ZS5sZW5ndGh9fSxoZWlnaHQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0saW5kaWNhdG9yU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1hc2tUb3BTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza0JvdHRvbVN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnttYXNrVG9wU3R5bGVTeW5jOnRoaXMuZ2V0U3R5bGUodGhpcy5tYXNrVG9wU3R5bGUpLG1hc2tCb3R0b21TdHlsZVN5bmM6dGhpcy5nZXRTdHlsZSh0aGlzLm1hc2tCb3R0b21TdHlsZSksaW5kaWNhdG9yU3R5bGVTeW5jOnRoaXMuZ2V0U3R5bGUodGhpcy5pbmRpY2F0b3JTdHlsZSksdmFsdWVTeW5jOltdLmNvbmNhdCh0aGlzLnZhbHVlKX19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbihlKXt2YXIgbj10aGlzO3RoaXMudmFsdWVTeW5jLmxlbmd0aD1lLmxlbmd0aCxlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlIT09bi52YWx1ZVN5bmNbdF0mJihuLnZhbHVlU3luY1t0XT1lLG4uaXRlbXNbdF0uY29tcG9uZW50SW5zdGFuY2Uuc2V0Q3VycmVudChlKSl9KX0sbWFza1RvcFN0eWxlOmZ1bmN0aW9uKGUpe3RoaXMubWFza1RvcFN0eWxlU3luYz10aGlzLmdldFN0eWxlKGUpfSxtYXNrQm90dG9tU3R5bGU6ZnVuY3Rpb24oZSl7dGhpcy5tYXNrQm90dG9tU3R5bGVTeW5jPXRoaXMuZ2V0U3R5bGUoZSl9LGluZGljYXRvclN0eWxlOmZ1bmN0aW9uKGUpe3RoaXMuaW5kaWNhdG9yU3R5bGVTeW5jPXRoaXMuZ2V0U3R5bGUoZSl9fSxtZXRob2RzOntnZXRTdHlsZTpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwic3RyaW5nIj09dHlwZW9mIGU/cGFyc2VTdHlsZVRleHQoZSk6ZSl9LGdldEl0ZW1JbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pdGVtcy5pbmRleE9mKGUpfSxnZXRJdGVtVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudmFsdWVTeW5jW3RoaXMuZ2V0SXRlbUluZGV4KGUuJHZub2RlKV18fDB9LHNldEl0ZW1WYWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0SXRlbUluZGV4KGUuJHZub2RlKTt0aGlzLnZhbHVlU3luY1tuXT10O3ZhciByPVtdLmNvbmNhdCh0aGlzLnZhbHVlU3luYyk7dGhpcy4kZW1pdCgidXBkYXRlOnZhbHVlIixyKSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTpyfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybihBcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP2RlZXBDbG9uZSh0aGlzLiRzbG90cy5kZWZhdWx0LGUpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50T3B0aW9ucyYmInBpY2tlci12aWV3LWNvbHVtbiI9PT1lLmNvbXBvbmVudE9wdGlvbnMudGFnJiZ0LnB1c2goZSl9KSx0aGlzLml0ZW1zPXQsZSgiZGl2Iix0aGlzLl9nKHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldyJdLGF0dHJzOntwcmV2ZW50R2VzdHVyZTohMH19LHRoaXMuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LXdyYXBwZXIiXX0sdCldLDIpfSxzdHlsZTp7InVuaS1waWNrZXItdmlldyI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9LCJ1bmktcGlja2VyLXZpZXctd3JhcHBlciI6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246InJvdyIscG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxvdmVyZmxvdzoiaGlkZGVuIn19fX1mdW5jdGlvbiBpbml0JDIzKGUsdCl7ZS5jb21wb25lbnQoInBpY2tlci12aWV3IixnZXRQaWNrZXJWaWV3KHQpKX1mdW5jdGlvbiBnZXRIZWlnaHQoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PShlLmhlaWdodHx8ZS5saW5lSGVpZ2h0fHwiIikubWF0Y2goLygtP1tcZFwuXSspcHgvKSxuPTA7cmV0dXJuIHQmJihuPXBhcnNlRmxvYXQodFsxXSkpLG59ZnVuY3Rpb24gZ2V0UGlja2VyVmlld0NvbHVtbihlKXt2YXIgcj1lLnJlcXVpcmVNb2R1bGUoImRvbSIpLG89ImFuZHJvaWQiPT09ZS5jb25maWcuZW52LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7cmV0dXJue25hbWU6IlBpY2tlclZpZXdDb2x1bW4iLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e2xlbmd0aDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntpbmRpY2F0b3JIZWlnaHQ6Z2V0SGVpZ2h0KHRoaXMuJHBhcmVudC5pbmRpY2F0b3JTdHlsZVN5bmMpLGhlaWdodDpwYXJzZUZsb2F0KHRoaXMuJHBhcmVudC5oZWlnaHQpLGN1cnJlbnQ6dGhpcy4kcGFyZW50LmdldEl0ZW1WYWx1ZSh0aGlzKX19LHdhdGNoOntjdXJyZW50OmZ1bmN0aW9uKGUpe3RoaXMuX2lzTW91bnRlZCYmdGhpcy4kcGFyZW50LnNldEl0ZW1WYWx1ZSh0aGlzLGUpfSxsZW5ndGg6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnNldEN1cnJlbnQoZS5jdXJyZW50LCEwLCEwKX0sMTUwKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNoZWNrTW91bnRlZCgpfSxtZXRob2RzOntjaGVja01vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgbixyLGk9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7UHJvbWlzZS5hbGwoW2kuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLmhlaWdodDtuPWkuaGVpZ2h0PXR9KSxvJiZpLmxlbmd0aD9pLl9nZXRDb21wb25lbnRTaXplKGkuJHJlZnMuaXRlbSkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLmhlaWdodDtyPWkuaW5kaWNhdG9ySGVpZ2h0PXQvaS5sZW5ndGh9KTppLl9nZXRDb21wb25lbnRTaXplKGkuJHJlZnMuaW5kaWNhdG9yKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O3I9aS5pbmRpY2F0b3JIZWlnaHQ9dH0pXSkudGhlbihmdW5jdGlvbigpe24mJnI/c2V0VGltZW91dChmdW5jdGlvbigpe2kuc2V0Q3VycmVudChpLmN1cnJlbnQsITEsITApLGkuX2lzTW91bnRlZD0hMH0sNTApOmkuY2hlY2tNb3VudGVkKCl9KX0sNTApfSxvblNjcm9sbGVuZDpmdW5jdGlvbihlKXtpZighKERhdGUubm93KCktdGhpcy5zY3JvbGxUb0VsZW1lbnRUaW1lPDM0MCkpe3ZhciB0PWUuZGV0YWlsLmNvbnRlbnRPZmZzZXQueSxuPU1hdGgucm91bmQodC90aGlzLmluZGljYXRvckhlaWdodCk7dCV0aGlzLmluZGljYXRvckhlaWdodD90aGlzLnNldEN1cnJlbnQobiwhMCwhMCk6dGhpcy5jdXJyZW50PW59fSxzZXRDdXJyZW50OmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT10JiYodD0hMCksKHRoaXMuY3VycmVudCE9PWV8fG4pJiYoci5zY3JvbGxUb0VsZW1lbnQodGhpcy4kcmVmcy5jb250ZW50LHtvZmZzZXQ6ZSp0aGlzLmluZGljYXRvckhlaWdodCxhbmltYXRlZDp0fSksdGhpcy5jdXJyZW50PWUsdCYmKHRoaXMuc2Nyb2xsVG9FbGVtZW50VGltZT1EYXRlLm5vdygpKSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXtyLmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kc2xvdHMuZGVmYXVsdCxuPSh0aGlzLmhlaWdodC10aGlzLmluZGljYXRvckhlaWdodCkvMixyPXRoaXMuaGVpZ2h0LW4rInB4IjtuKz0icHgiO3ZhciBpPXtzaG93U2Nyb2xsYmFyOiExLHNjcm9sbFRvQmVnaW46ITEsZGVjZWxlcmF0aW9uUmF0ZTouMyxzY3JvbGxZOiEwfTtyZXR1cm4gb3x8KGkuc2Nyb2xsVG9wPXRoaXMuY3VycmVudCp0aGlzLmluZGljYXRvckhlaWdodCksZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1jb2x1bW4iXX0sdGhpcy4kbGlzdGVuZXJzKSxbZSgic2Nyb2xsLXZpZXciLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1ncm91cCJdLGF0dHJzOmksb246e3Njcm9sbGVuZDp0aGlzLm9uU2Nyb2xsZW5kfSxzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIn19LFtlKCJkaXYiLHtyZWY6ImNvbnRlbnQiLHN0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiXSxzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIixwYWRkaW5nVG9wOm4scGFkZGluZ0JvdHRvbTpufX0sbz9bZSgiZGl2Iix7cmVmOiJpdGVtIixzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIn19LHQpXTp0KV0pLGUoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIl19LFtlKCJ1LXNjYWxhYmxlIix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctbWFzayIsInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCJdLHN0eWxlOk9iamVjdC5hc3NpZ24oe30sdGhpcy4kcGFyZW50Lm1hc2tUb3BTdHlsZVN5bmMse2JvdHRvbTpyfSl9KSxlKCJ1LXNjYWxhYmxlIix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctbWFzayIsInVuaS1waWNrZXItdmlldy1tYXNrLWJvdHRvbSJdLHN0eWxlOk9iamVjdC5hc3NpZ24oe30sdGhpcy4kcGFyZW50Lm1hc2tCb3R0b21TdHlsZVN5bmMse3RvcDpyfSl9KV0pLGUoInUtc2NhbGFibGUiLHtyZWY6ImluZGljYXRvciIsc3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIl0sc3R5bGU6T2JqZWN0LmFzc2lnbih7fSx0aGlzLiRwYXJlbnQuaW5kaWNhdG9yU3R5bGVTeW5jLHt0b3A6bn0pfSldLDIpfSxzdHlsZTp7InVuaS1waWNrZXItdmlldy1jb2x1bW4iOntmbGV4OjEscG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJzdHJldGNoIixvdmVyZmxvdzoiaGlkZGVuIn0sInVuaS1waWNrZXItdmlldy1tYXNrIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxwb2ludGVyRXZlbnRzOiJub25lIn0sInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCI6e2JvdHRvbTowLGJhY2tncm91bmRJbWFnZToibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkifSwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIjp7dG9wOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gdG9wLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9LCJ1bmktcGlja2VyLXZpZXctZ3JvdXAiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowfSwidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiOntwYWRkaW5nVG9wOjAscGFkZGluZ1JpZ2h0OjAscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OjB9LCJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCx0b3A6MCxoZWlnaHQ6IjM0cHgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGJvcmRlckNvbG9yOiIjZTVlNWU1Iixib3JkZXJUb3BXaWR0aDoiMXB4Iixib3JkZXJCb3R0b21XaWR0aDoiMXB4In19fX1mdW5jdGlvbiBpbml0JDI0KGUsdCl7ZS5jb21wb25lbnQoInBpY2tlci12aWV3LWNvbHVtbiIsZ2V0UGlja2VyVmlld0NvbHVtbih0KSl9dmFyIGluaXRDb21wb25lbnRzPVtpbml0JDMsaW5pdCQ0LGluaXQkNSxpbml0JDYsaW5pdCQ3LGluaXQkOCxpbml0JDksaW5pdCQxMCxpbml0JDExLGluaXQkMTIsaW5pdCQxMyxpbml0JDE0LGluaXQkMTUsaW5pdCQxNixpbml0JDE3LGluaXQkMTgsaW5pdCQxOSxpbml0JDIwLGluaXQkMjEsaW5pdCQyMixpbml0JDIzLGluaXQkMjRdLHVuaUFwcD17aW5zdGFsbDpmdW5jdGlvbihvLGEpe28uY29uZmlnLmVycm9ySGFuZGxlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dG9SYXdUeXBlKGUpO28udXRpbC53YXJuKCJFcnJvciBpbiAiK24rJzogIicrKCJFcnJvciI9PT1yP2UudG9TdHJpbmcoKTplKSsnIicsdCk7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QXBwJiZhLmdldEFwcCgpO2kmJmhhc0xpZmVjeWNsZUhvb2soaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9LG8ucHJvdG90eXBlLl8kYnVzPW5ldyBvLG8ucHJvdG90eXBlLmdldE9wZW5lckV2ZW50Q2hhbm5lbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx8fCh0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWw9bmV3IGEuRXZlbnRDaGFubmVsKSx0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJHBhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy4kc2NvcGUmJnRoaXMuJHJvb3QmJnRoaXMuJHJvb3QuJHNjb3BlJiYodGhpcy4kc2NvcGU9dGhpcy4kcm9vdC4kc2NvcGUpLHRoaXMuJHNjb3BlLiRwYWdlfX0pLHN0eWxlTWl4aW4obyksdW5pSWRNaXhpbihvLGEpLGxpZmVjeWNsZU1peGluKG8sYS53ZWV4LGEpLCJ3ZWV4IiE9PWEuX191bmlDb25maWcubnZ1ZUNvbXBpbGVyJiZpbml0Q29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UobyxhLndlZXgsYSl9KX19O2Z1bmN0aW9uIHZ1ZUZhY3RvcnkoZSx0KXt2YXIgbT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBFKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gQShlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gYyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIHkoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB1KGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiAwPD10JiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gSShlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHx1KGUpJiZlLnRvU3RyaW5nPT09cj9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19cygic2xvdCxjb21wb25lbnQiLCEwKTt2YXIgbD1zKCJrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcyIpO2Z1bmN0aW9uIGIoZSx0KXtpZihlLmxlbmd0aCl7dmFyIG49ZS5pbmRleE9mKHQpO2lmKC0xPG4pcmV0dXJuIGUuc3BsaWNlKG4sMSl9fXZhciBhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZChlLHQpe3JldHVybiBhLmNhbGwoZSx0KX1mdW5jdGlvbiBmKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfHwobltlXT10KGUpKX19dmFyIHA9Ly0oXHcpL2csaD1mKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UocCxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKToiIn0pfSksdj1mKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9KSxnPS9cQihbQS1aXSkvZyx3PWYoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShnLCItJDEiKS50b0xvd2VyQ2FzZSgpfSk7dmFyIGs9RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5iaW5kKHQpfTpmdW5jdGlvbihuLHIpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gdD8xPHQ/bi5hcHBseShyLGFyZ3VtZW50cyk6bi5jYWxsKHIsZSk6bi5jYWxsKHIpfXJldHVybiBlLl9sZW5ndGg9bi5sZW5ndGgsZX07ZnVuY3Rpb24gUyhlLHQpe3Q9dHx8MDtmb3IodmFyIG49ZS5sZW5ndGgtdCxyPW5ldyBBcnJheShuKTtuLS07KXJbbl09ZVtuK3RdO3JldHVybiByfWZ1bmN0aW9uIHgoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gQyhlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKWVbbl0mJngodCxlW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBUKGUsdCxuKXt9dmFyIE89ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSwkPWZ1bmN0aW9uKGUpe3JldHVybiBlfTtmdW5jdGlvbiBQKHQsbil7aWYodD09PW4pcmV0dXJuITA7dmFyIGU9eSh0KSxyPXkobik7aWYoIWV8fCFyKXJldHVybiFlJiYhciYmU3RyaW5nKHQpPT09U3RyaW5nKG4pO3RyeXt2YXIgaT1BcnJheS5pc0FycmF5KHQpLG89QXJyYXkuaXNBcnJheShuKTtpZihpJiZvKXJldHVybiB0Lmxlbmd0aD09PW4ubGVuZ3RoJiZ0LmV2ZXJ5KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFAoZSxuW3RdKX0pO2lmKHQgaW5zdGFuY2VvZiBEYXRlJiZuIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gdC5nZXRUaW1lKCk9PT1uLmdldFRpbWUoKTtpZihpfHxvKXJldHVybiExO3ZhciBhPU9iamVjdC5rZXlzKHQpLHM9T2JqZWN0LmtleXMobik7cmV0dXJuIGEubGVuZ3RoPT09cy5sZW5ndGgmJmEuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIFAodFtlXSxuW2VdKX0pfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBNKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoUChlW25dLHQpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIGooZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX12YXIgTD0iZGF0YS1zZXJ2ZXItcmVuZGVyZWQiLEI9WyJjb21wb25lbnQiLCJkaXJlY3RpdmUiLCJmaWx0ZXIiXSxOPVsiYmVmb3JlQ3JlYXRlIiwiY3JlYXRlZCIsImJlZm9yZU1vdW50IiwibW91bnRlZCIsImJlZm9yZVVwZGF0ZSIsInVwZGF0ZWQiLCJiZWZvcmVEZXN0cm95IiwiZGVzdHJveWVkIiwiYWN0aXZhdGVkIiwiZGVhY3RpdmF0ZWQiLCJlcnJvckNhcHR1cmVkIiwic2VydmVyUHJlZmV0Y2giXSxEPXtvcHRpb25NZXJnZVN0cmF0ZWdpZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxzaWxlbnQ6ITEscHJvZHVjdGlvblRpcDohMSxkZXZ0b29sczohMSxwZXJmb3JtYW5jZTohMSxlcnJvckhhbmRsZXI6bnVsbCx3YXJuSGFuZGxlcjpudWxsLGlnbm9yZWRFbGVtZW50czpbXSxrZXlDb2RlczpPYmplY3QuY3JlYXRlKG51bGwpLGlzUmVzZXJ2ZWRUYWc6Tyxpc1Jlc2VydmVkQXR0cjpPLGlzVW5rbm93bkVsZW1lbnQ6TyxnZXRUYWdOYW1lc3BhY2U6VCxwYXJzZVBsYXRmb3JtVGFnTmFtZTokLG11c3RVc2VQcm9wOk8sYXN5bmM6ITAsX2xpZmVjeWNsZUhvb2tzOk59O2Z1bmN0aW9uIFIoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgRj1uZXcgUmVnRXhwKCJbXiIrL2EtekEtWlx1MDBCN1x1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDNGLVx1MjA0MFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZELy5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgVSx6PSJfX3Byb3RvX18iaW57fSxWPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LHE9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sVz1xJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSD1WJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLEc9SCYmL21zaWV8dHJpZGVudC8udGVzdChIKSxYPShIJiZILmluZGV4T2YoIm1zaWUgOS4wIiksSCYmMDxILmluZGV4T2YoImVkZ2UvIikpLEo9KEgmJkguaW5kZXhPZigiYW5kcm9pZCIpLEgmJi9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChIKSxIJiYvY2hyb21lXC9cZCsvLnRlc3QoSCksSCYmL3BoYW50b21qcy8udGVzdChIKSxIJiZILm1hdGNoKC9maXJlZm94XC8oXGQrKS8pLHt9LndhdGNoKTtpZihWKXRyeXt2YXIgWT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe319KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLFkpfWNhdGNoKGUpe312YXIgSz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1VJiYoVT0hViYmIXEmJnZvaWQgMCE9PWdsb2JhbCYmKGdsb2JhbC5wcm9jZXNzJiYic2VydmVyIj09PWdsb2JhbC5wcm9jZXNzLmVudi5WVUVfRU5WKSksVX0sWj1WJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztmdW5jdGlvbiBRKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgZWUsdGU9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlEoU3ltYm9sKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZRKFJlZmxlY3Qub3duS2V5cyk7ZWU9InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJlEoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBuZT1ULHJlPTAsaWU9ZnVuY3Rpb24oKXt0aGlzLmlkPXZvaWQgMCE9PXQ/dC51aWQrKzpyZSsrLHRoaXMuc3Vicz1bXX07ZnVuY3Rpb24gb2UoZSl7aWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLnB1c2goZSksaWUuU2hhcmVkT2JqZWN0LnRhcmdldD1lfWZ1bmN0aW9uIGFlKCl7aWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLnBvcCgpLGllLlNoYXJlZE9iamVjdC50YXJnZXQ9aWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrW2llLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5sZW5ndGgtMV19aWUucHJvdG90eXBlLmFkZFN1Yj1mdW5jdGlvbihlKXt0aGlzLnN1YnMucHVzaChlKX0saWUucHJvdG90eXBlLnJlbW92ZVN1Yj1mdW5jdGlvbihlKXtiKHRoaXMuc3VicyxlKX0saWUucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2llLlNoYXJlZE9iamVjdC50YXJnZXQmJmllLlNoYXJlZE9iamVjdC50YXJnZXQuYWRkRGVwKHRoaXMpfSxpZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuc3Vicy5zbGljZSgpLHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0saWUuU2hhcmVkT2JqZWN0PXZvaWQgMCE9PXQ/dDp7fSxpZS5TaGFyZWRPYmplY3QudGFyZ2V0PW51bGwsaWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrPVtdO3ZhciBzZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sY2U9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtjZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc2UucHJvdG90eXBlLGNlKTt2YXIgdWU9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBzZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIG5ldyBzZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIGRlKGUpe3ZhciB0PW5ldyBzZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIGZlPUFycmF5LnByb3RvdHlwZSxwZT1PYmplY3QuY3JlYXRlKGZlKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIHM9ZmVbYV07UihwZSxhLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcixpPXMuYXBwbHkodGhpcyx0KSxvPXRoaXMuX19vYl9fO3N3aXRjaChhKXtjYXNlInB1c2giOmNhc2UidW5zaGlmdCI6cj10O2JyZWFrO2Nhc2Uic3BsaWNlIjpyPXQuc2xpY2UoMil9cmV0dXJuIHImJm8ub2JzZXJ2ZUFycmF5KHIpLG8uZGVwLm5vdGlmeSgpLGl9KX0pO3ZhciBoZT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwZSksdmU9ITA7ZnVuY3Rpb24gZ2UoZSl7dmU9ZX12YXIgbWU9ZnVuY3Rpb24oZSl7dmFyIHQ7dGhpcy52YWx1ZT1lLHRoaXMuZGVwPW5ldyBpZSx0aGlzLnZtQ291bnQ9MCxSKGUsIl9fb2JfXyIsdGhpcyksQXJyYXkuaXNBcnJheShlKT8oej8odD1wZSxlLl9fcHJvdG9fXz10KTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO1IoZSxvLHRbb10pfX0oZSxwZSxoZSksdGhpcy5vYnNlcnZlQXJyYXkoZSkpOnRoaXMud2FsayhlKX07ZnVuY3Rpb24geWUoZSx0KXt2YXIgbjtpZih5KGUpJiYhKGUgaW5zdGFuY2VvZiBzZSkpcmV0dXJuIGQoZSwiX19vYl9fIikmJmUuX19vYl9fIGluc3RhbmNlb2YgbWU/bj1lLl9fb2JfXzp2ZSYmIUsoKSYmKEFycmF5LmlzQXJyYXkoZSl8fHUoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyBtZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiBfZShuLGUscix0LGkpe3ZhciBvPW5ldyBpZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChyPW5bZV0pO3ZhciB1PSFpJiZ5ZShyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1zP3MuY2FsbChuKTpyO3JldHVybiBpZS5TaGFyZWRPYmplY3QudGFyZ2V0JiYoby5kZXBlbmQoKSx1JiYodS5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheShlKSYmZnVuY3Rpb24gZSh0KXtmb3IodmFyIG49dm9pZCAwLHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspKG49dFtyXSkmJm4uX19vYl9fJiZuLl9fb2JfXy5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheShuKSYmZShuKX0oZSkpKSxlfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9cz9zLmNhbGwobik6cjtlPT09dHx8ZSE9ZSYmdCE9dHx8cyYmIWN8fChjP2MuY2FsbChuLGUpOnI9ZSx1PSFpJiZ5ZShlKSxvLm5vdGlmeSgpKX19KX19ZnVuY3Rpb24gYmUoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkmJmkodCkpcmV0dXJuIGUubGVuZ3RoPU1hdGgubWF4KGUubGVuZ3RoLHQpLGUuc3BsaWNlKHQsMSxuKSxuO2lmKHQgaW4gZSYmISh0IGluIE9iamVjdC5wcm90b3R5cGUpKXJldHVybiBlW3RdPW47dmFyIHI9ZS5fX29iX187cmV0dXJuIGUuX2lzVnVlfHxyJiZyLnZtQ291bnQ/bjpyPyhfZShyLnZhbHVlLHQsbiksci5kZXAubm90aWZ5KCksbik6ZVt0XT1ufWZ1bmN0aW9uIHdlKGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSYmaSh0KSllLnNwbGljZSh0LDEpO2Vsc2V7dmFyIG49ZS5fX29iX187ZS5faXNWdWV8fG4mJm4udm1Db3VudHx8ZChlLHQpJiYoZGVsZXRlIGVbdF0sbiYmbi5kZXAubm90aWZ5KCkpfX1tZS5wcm90b3R5cGUud2Fsaz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7bisrKV9lKGUsdFtuXSl9LG1lLnByb3RvdHlwZS5vYnNlcnZlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXllKGVbdF0pfTt2YXIga2U9RC5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7ZnVuY3Rpb24gU2UoZSx0KXtpZighdClyZXR1cm4gZTtmb3IodmFyIG4scixpLG89dGU/UmVmbGVjdC5vd25LZXlzKHQpOk9iamVjdC5rZXlzKHQpLGE9MDthPG8ubGVuZ3RoO2ErKykiX19vYl9fIiE9PShuPW9bYV0pJiYocj1lW25dLGk9dFtuXSxkKGUsbik/ciE9PWkmJnUocikmJnUoaSkmJlNlKHIsaSk6YmUoZSxuLGkpKTtyZXR1cm4gZX1mdW5jdGlvbiB4ZShuLHIsaSl7cmV0dXJuIGk/ZnVuY3Rpb24oKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwoaSxpKTpyLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKGksaSk6bjtyZXR1cm4gZT9TZShlLHQpOnR9OnI/bj9mdW5jdGlvbigpe3JldHVybiBTZSgiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwodGhpcyx0aGlzKTpyLCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbCh0aGlzLHRoaXMpOm4pfTpyOm59ZnVuY3Rpb24gQ2UoZSx0KXt2YXIgbj10P2U/ZS5jb25jYXQodCk6QXJyYXkuaXNBcnJheSh0KT90Olt0XTplO3JldHVybiBuP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0obik6bn1mdW5jdGlvbiBUZShlLHQsbixyKXt2YXIgaT1PYmplY3QuY3JlYXRlKGV8fG51bGwpO3JldHVybiB0P3goaSx0KTppfWtlLmRhdGE9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP3hlKGUsdCxuKTp0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnhlKGUsdCl9LE4uZm9yRWFjaChmdW5jdGlvbihlKXtrZVtlXT1DZX0pLEIuZm9yRWFjaChmdW5jdGlvbihlKXtrZVtlKyJzIl09VGV9KSxrZS53YXRjaD1mdW5jdGlvbihlLHQsbixyKXtpZihlPT09SiYmKGU9dm9pZCAwKSx0PT09SiYmKHQ9dm9pZCAwKSwhdClyZXR1cm4gT2JqZWN0LmNyZWF0ZShlfHxudWxsKTtpZighZSlyZXR1cm4gdDt2YXIgaT17fTtmb3IodmFyIG8gaW4geChpLGUpLHQpe3ZhciBhPWlbb10scz10W29dO2EmJiFBcnJheS5pc0FycmF5KGEpJiYoYT1bYV0pLGlbb109YT9hLmNvbmNhdChzKTpBcnJheS5pc0FycmF5KHMpP3M6W3NdfXJldHVybiBpfSxrZS5wcm9wcz1rZS5tZXRob2RzPWtlLmluamVjdD1rZS5jb21wdXRlZD1mdW5jdGlvbihlLHQsbixyKXtpZighZSlyZXR1cm4gdDt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiB4KGksZSksdCYmeChpLHQpLGl9LGtlLnByb3ZpZGU9eGU7dmFyIE9lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/ZTp0fTtmdW5jdGlvbiBFZShuLHIsaSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHImJihyPXIub3B0aW9ucyksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnByb3BzO2lmKG4pe3ZhciByLGksbz17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcihyPW4ubGVuZ3RoO3ItLTspInN0cmluZyI9PXR5cGVvZihpPW5bcl0pJiYob1toKGkpXT17dHlwZTpudWxsfSk7ZWxzZSBpZih1KG4pKWZvcih2YXIgYSBpbiBuKWk9blthXSxvW2goYSldPXUoaSk/aTp7dHlwZTppfTtlLnByb3BzPW99fShyKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUuaW5qZWN0O2lmKG4pe3ZhciByPWUuaW5qZWN0PXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspcltuW2ldXT17ZnJvbTpuW2ldfTtlbHNlIGlmKHUobikpZm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107cltvXT11KGEpP3goe2Zyb206b30sYSk6e2Zyb206YX19fX0ociksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kaXJlY3RpdmVzO2lmKHQpZm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ImZ1bmN0aW9uIj09dHlwZW9mIHImJih0W25dPXtiaW5kOnIsdXBkYXRlOnJ9KX19KHIpLCFyLl9iYXNlJiYoci5leHRlbmRzJiYobj1FZShuLHIuZXh0ZW5kcyxpKSksci5taXhpbnMpKWZvcih2YXIgZT0wLHQ9ci5taXhpbnMubGVuZ3RoO2U8dDtlKyspbj1FZShuLHIubWl4aW5zW2VdLGkpO3ZhciBvLGE9e307Zm9yKG8gaW4gbilzKG8pO2ZvcihvIGluIHIpZChuLG8pfHxzKG8pO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9a2VbZV18fE9lO2FbZV09dChuW2VdLHJbZV0saSxlKX1yZXR1cm4gYX1mdW5jdGlvbiBJZShlLHQsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBpPWVbdF07aWYoZChpLG4pKXJldHVybiBpW25dO3ZhciBvPWgobik7aWYoZChpLG8pKXJldHVybiBpW29dO3ZhciBhPXYobyk7cmV0dXJuIGQoaSxhKT9pW2FdOmlbbl18fGlbb118fGlbYV19fWZ1bmN0aW9uIEFlKGUsdCxuLHIpe3ZhciBpPXRbZV0sbz0hZChuLGUpLGE9bltlXSxzPU1lKEJvb2xlYW4saS50eXBlKTtpZigtMTxzKWlmKG8mJiFkKGksImRlZmF1bHQiKSlhPSExO2Vsc2UgaWYoIiI9PT1hfHxhPT09dyhlKSl7dmFyIGM9TWUoU3RyaW5nLGkudHlwZSk7KGM8MHx8czxjKSYmKGE9ITApfWlmKHZvaWQgMD09PWEpe2E9ZnVuY3Rpb24oZSx0LG4pe2lmKCFkKHQsImRlZmF1bHQiKSlyZXR1cm47dmFyIHI9dC5kZWZhdWx0O2lmKGUmJmUuJG9wdGlvbnMucHJvcHNEYXRhJiZ2b2lkIDA9PT1lLiRvcHRpb25zLnByb3BzRGF0YVtuXSYmdm9pZCAwIT09ZS5fcHJvcHNbbl0pcmV0dXJuIGUuX3Byb3BzW25dO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByJiYiRnVuY3Rpb24iIT09JGUodC50eXBlKT9yLmNhbGwoZSk6cn0ocixpLGUpO3ZhciB1PXZlO2dlKCEwKSx5ZShhKSxnZSh1KX1yZXR1cm4gYX1mdW5jdGlvbiAkZShlKXt2YXIgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvbiAoXHcrKS8pO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gUGUoZSx0KXtyZXR1cm4gJGUoZSk9PT0kZSh0KX1mdW5jdGlvbiBNZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBQZSh0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKFBlKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gamUoZSx0LG4pe29lKCk7dHJ5e2lmKHQpZm9yKHZhciByPXQ7cj1yLiRwYXJlbnQ7KXt2YXIgaT1yLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7aWYoaSlmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl0cnl7aWYoITE9PT1pW29dLmNhbGwocixlLHQsbikpcmV0dXJufWNhdGNoKGUpe0JlKGUsciwiZXJyb3JDYXB0dXJlZCBob29rIil9fUJlKGUsdCxuKX1maW5hbGx5e2FlKCl9fWZ1bmN0aW9uIExlKGUsdCxuLHIsaSl7dmFyIG87dHJ5eyhvPW4/ZS5hcHBseSh0LG4pOmUuY2FsbCh0KSkmJiFvLl9pc1Z1ZSYmXyhvKSYmIW8uX2hhbmRsZWQmJihvLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybiBqZShlLHIsaSsiIChQcm9taXNlL2FzeW5jKSIpfSksby5faGFuZGxlZD0hMCl9Y2F0Y2goZSl7amUoZSxyLGkpfXJldHVybiBvfWZ1bmN0aW9uIEJlKHQsZSxuKXtpZihELmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIEQuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCx0LGUsbil9Y2F0Y2goZSl7ZSE9PXQmJk5lKGUsbnVsbCwiY29uZmlnLmVycm9ySGFuZGxlciIpfU5lKHQsZSxuKX1mdW5jdGlvbiBOZShlLHQsbil7aWYoIVYmJiFxfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGUpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciBEZT1bXSxSZT0hMTtmdW5jdGlvbiBGZSgpe1JlPSExO2Zvcih2YXIgZT1EZS5zbGljZSgwKSx0PURlLmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX12YXIgVWU9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KEZlLDApfTtmdW5jdGlvbiB6ZShlLHQpe3ZhciBuO2lmKERlLnB1c2goZnVuY3Rpb24oKXtpZihlKXRyeXtlLmNhbGwodCl9Y2F0Y2goZSl7amUoZSx0LCJuZXh0VGljayIpfWVsc2UgbiYmbih0KX0pLFJlfHwoUmU9ITAsVWUoKSksIWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7bj1lfSl9dmFyIFZlPW5ldyBlZTtmdW5jdGlvbiBxZShlKXshZnVuY3Rpb24gZSh0LG4pe3ZhciByLGk7dmFyIG89QXJyYXkuaXNBcnJheSh0KTtpZighbyYmIXkodCl8fE9iamVjdC5pc0Zyb3plbih0KXx8dCBpbnN0YW5jZW9mIHNlKXJldHVybjtpZih0Ll9fb2JfXyl7dmFyIGE9dC5fX29iX18uZGVwLmlkO2lmKG4uaGFzKGEpKXJldHVybjtuLmFkZChhKX1pZihvKWZvcihyPXQubGVuZ3RoO3ItLTspZSh0W3JdLG4pO2Vsc2UgZm9yKGk9T2JqZWN0LmtleXModCkscj1pLmxlbmd0aDtyLS07KWUodFtpW3JdXSxuKX0oZSxWZSksVmUuY2xlYXIoKX12YXIgV2U9ZihmdW5jdGlvbihlKXt2YXIgdD0iJiI9PT1lLmNoYXJBdCgwKSxuPSJ+Ij09PShlPXQ/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCkscj0iISI9PT0oZT1uP2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApO3JldHVybntuYW1lOmU9cj9lLnNsaWNlKDEpOmUsb25jZTpuLGNhcHR1cmU6cixwYXNzaXZlOnR9fSk7ZnVuY3Rpb24gSGUoZSxpKXtmdW5jdGlvbiBvKCl7dmFyIGU9YXJndW1lbnRzLHQ9by5mbnM7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIExlKHQsbnVsbCxhcmd1bWVudHMsaSwidi1vbiBoYW5kbGVyIik7Zm9yKHZhciBuPXQuc2xpY2UoKSxyPTA7cjxuLmxlbmd0aDtyKyspTGUobltyXSxudWxsLGUsaSwidi1vbiBoYW5kbGVyIil9cmV0dXJuIG8uZm5zPWUsb31mdW5jdGlvbiBHZShlLHQsbixyLGksbyl7dmFyIGEscyxjLHU7Zm9yKGEgaW4gZSlzPWVbYV0sYz10W2FdLHU9V2UoYSksRShzKXx8KEUoYyk/KEUocy5mbnMpJiYocz1lW2FdPUhlKHMsbykpLEEodS5vbmNlKSYmKHM9ZVthXT1pKHUubmFtZSxzLHUuY2FwdHVyZSkpLG4odS5uYW1lLHMsdS5jYXB0dXJlLHUucGFzc2l2ZSx1LnBhcmFtcykpOnMhPT1jJiYoYy5mbnM9cyxlW2FdPWMpKTtmb3IoYSBpbiB0KUUoZVthXSkmJnIoKHU9V2UoYSkpLm5hbWUsdFthXSx1LmNhcHR1cmUpfWZ1bmN0aW9uIFhlKGUsdCxuKXt2YXIgcjtlIGluc3RhbmNlb2Ygc2UmJihlPWUuZGF0YS5ob29rfHwoZS5kYXRhLmhvb2s9e30pKTt2YXIgaT1lW3RdO2Z1bmN0aW9uIG8oKXtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiKHIuZm5zLG8pfUUoaSk/cj1IZShbb10pOkkoaS5mbnMpJiZBKGkubWVyZ2VkKT8ocj1pKS5mbnMucHVzaChvKTpyPUhlKFtpLG9dKSxyLm1lcmdlZD0hMCxlW3RdPXJ9ZnVuY3Rpb24gSmUoZSx0LG4scil7dmFyIGk9dC5vcHRpb25zLm1wT3B0aW9ucyYmdC5vcHRpb25zLm1wT3B0aW9ucy5wcm9wZXJ0aWVzO2lmKEUoaSkpcmV0dXJuIG47dmFyIG89dC5vcHRpb25zLm1wT3B0aW9ucy5leHRlcm5hbENsYXNzZXN8fFtdLGE9ZS5hdHRycyxzPWUucHJvcHM7aWYoSShhKXx8SShzKSlmb3IodmFyIGMgaW4gaSl7dmFyIHU9dyhjKTsoWWUobixzLGMsdSwhMCl8fFllKG4sYSxjLHUsITEpKSYmbltjXSYmLTEhPT1vLmluZGV4T2YodSkmJnJbaChuW2NdKV0mJihuW2NdPXJbaChuW2NdKV0pfXJldHVybiBufWZ1bmN0aW9uIFllKGUsdCxuLHIsaSl7aWYoSSh0KSl7aWYoZCh0LG4pKXJldHVybiBlW25dPXRbbl0saXx8ZGVsZXRlIHRbbl0sITA7aWYoZCh0LHIpKXJldHVybiBlW25dPXRbcl0saXx8ZGVsZXRlIHRbcl0sITB9cmV0dXJuITF9ZnVuY3Rpb24gS2UoZSl7cmV0dXJuIGMoZSk/W2xlKGUpXTpBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uIGUodCxuKXt2YXIgcj1bXTt2YXIgaSxvLGEscztmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKUUobz10W2ldKXx8ImJvb2xlYW4iPT10eXBlb2Ygb3x8KGE9ci5sZW5ndGgtMSxzPXJbYV0sQXJyYXkuaXNBcnJheShvKT8wPG8ubGVuZ3RoJiYoWmUoKG89ZShvLChufHwiIikrIl8iK2kpKVswXSkmJlplKHMpJiYoclthXT1sZShzLnRleHQrb1swXS50ZXh0KSxvLnNoaWZ0KCkpLHIucHVzaC5hcHBseShyLG8pKTpjKG8pP1plKHMpP3JbYV09bGUocy50ZXh0K28pOiIiIT09byYmci5wdXNoKGxlKG8pKTpaZShvKSYmWmUocyk/clthXT1sZShzLnRleHQrby50ZXh0KTooQSh0Ll9pc1ZMaXN0KSYmSShvLnRhZykmJkUoby5rZXkpJiZJKG4pJiYoby5rZXk9Il9fdmxpc3QiK24rIl8iK2krIl9fIiksci5wdXNoKG8pKSk7cmV0dXJuIHJ9KGUpOnZvaWQgMH1mdW5jdGlvbiBaZShlKXtyZXR1cm4gSShlKSYmSShlLnRleHQpJiYhMT09PWUuaXNDb21tZW50fWZ1bmN0aW9uIFFlKGUsdCl7aWYoZSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj10ZT9SZWZsZWN0Lm93bktleXMoZSk6T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldO2lmKCJfX29iX18iIT09byl7Zm9yKHZhciBhPWVbb10uZnJvbSxzPXQ7czspe2lmKHMuX3Byb3ZpZGVkJiZkKHMuX3Byb3ZpZGVkLGEpKXtuW29dPXMuX3Byb3ZpZGVkW2FdO2JyZWFrfXM9cy4kcGFyZW50fWlmKCFzJiYiZGVmYXVsdCJpbiBlW29dKXt2YXIgYz1lW29dLmRlZmF1bHQ7bltvXT0iZnVuY3Rpb24iPT10eXBlb2YgYz9jLmNhbGwodCk6Y319fXJldHVybiBufX1mdW5jdGlvbiBldChlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl0sYT1vLmRhdGE7aWYoYSYmYS5hdHRycyYmYS5hdHRycy5zbG90JiZkZWxldGUgYS5hdHRycy5zbG90LG8uY29udGV4dCE9PXQmJm8uZm5Db250ZXh0IT09dHx8IWF8fG51bGw9PWEuc2xvdCkobi5kZWZhdWx0fHwobi5kZWZhdWx0PVtdKSkucHVzaChvKTtlbHNle3ZhciBzPWEuc2xvdCxjPW5bc118fChuW3NdPVtdKTsidGVtcGxhdGUiPT09by50YWc/Yy5wdXNoLmFwcGx5KGMsby5jaGlsZHJlbnx8W10pOmMucHVzaChvKX19Zm9yKHZhciB1IGluIG4pblt1XS5ldmVyeSh0dCkmJmRlbGV0ZSBuW3VdO3JldHVybiBufWZ1bmN0aW9uIHR0KGUpe3JldHVybiBlLmlzQ29tbWVudCYmIWUuYXN5bmNGYWN0b3J5fHwiICI9PT1lLnRleHR9ZnVuY3Rpb24gbnQoZSx0LG4pe3ZhciByLGk9MDxPYmplY3Qua2V5cyh0KS5sZW5ndGgsbz1lPyEhZS4kc3RhYmxlOiFpLGE9ZSYmZS4ka2V5O2lmKGUpe2lmKGUuX25vcm1hbGl6ZWQpcmV0dXJuIGUuX25vcm1hbGl6ZWQ7aWYobyYmbiYmbiE9PW0mJmE9PT1uLiRrZXkmJiFpJiYhbi4kaGFzTm9ybWFsKXJldHVybiBuO2Zvcih2YXIgcyBpbiByPXt9LGUpZVtzXSYmIiQiIT09c1swXSYmKHJbc109cnQodCxzLGVbc10pKX1lbHNlIHI9e307Zm9yKHZhciBjIGluIHQpYyBpbiByfHwocltjXT1pdCh0LGMpKTtyZXR1cm4gZSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmKGUuX25vcm1hbGl6ZWQ9ciksUihyLCIkc3RhYmxlIixvKSxSKHIsIiRrZXkiLGEpLFIociwiJGhhc05vcm1hbCIsaSkscn1mdW5jdGlvbiBydChlLHQsbil7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoP24uYXBwbHkobnVsbCxhcmd1bWVudHMpOm4oe30pO3JldHVybihlPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIUFycmF5LmlzQXJyYXkoZSk/W2VdOktlKGUpKSYmKDA9PT1lLmxlbmd0aHx8MT09PWUubGVuZ3RoJiZlWzBdLmlzQ29tbWVudCk/dm9pZCAwOmV9O3JldHVybiBuLnByb3h5JiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHJ9ZnVuY3Rpb24gaXQoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19ZnVuY3Rpb24gb3QoZSx0KXt2YXIgbixyLGksbyxhO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZS5sZW5ndGgpLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbltyXT10KGVbcl0scixyLHIpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKyluW3JdPXQocisxLHIscixyKTtlbHNlIGlmKHkoZSkpaWYodGUmJmVbU3ltYm9sLml0ZXJhdG9yXSl7bj1bXTt2YXIgcz1lW1N5bWJvbC5pdGVyYXRvcl0oKSxjPXMubmV4dCgpO2ZvcihyPTA7IWMuZG9uZTspbi5wdXNoKHQoYy52YWx1ZSxuLmxlbmd0aCxyLHIrKykpLGM9cy5uZXh0KCl9ZWxzZSBmb3Iobz1PYmplY3Qua2V5cyhlKSxuPW5ldyBBcnJheShvLmxlbmd0aCkscj0wLGk9by5sZW5ndGg7cjxpO3IrKylhPW9bcl0sbltyXT10KGVbYV0sYSxyLHIpO3JldHVybiBJKG4pfHwobj1bXSksbi5faXNWTGlzdD0hMCxufWZ1bmN0aW9uIGF0KGUsdCxuLHIpe3ZhciBpLG89dGhpcy4kc2NvcGVkU2xvdHNbZV07bz8obj1ufHx7fSxyJiYobj14KHgoe30sciksbikpLGk9byhuLHRoaXMsbi5faSl8fHQpOmk9dGhpcy4kc2xvdHNbZV18fHQ7dmFyIGE9biYmbi5zbG90O3JldHVybiBhP3RoaXMuJGNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIix7c2xvdDphfSxpKTppfWZ1bmN0aW9uIHN0KGUpe3JldHVybiBJZSh0aGlzLiRvcHRpb25zLCJmaWx0ZXJzIixlKXx8JH1mdW5jdGlvbiBjdChlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPT09ZS5pbmRleE9mKHQpOmUhPT10fWZ1bmN0aW9uIHV0KGUsdCxuLHIsaSl7dmFyIG89RC5rZXlDb2Rlc1t0XXx8bjtyZXR1cm4gaSYmciYmIUQua2V5Q29kZXNbdF0/Y3QoaSxyKTpvP2N0KG8sZSk6cj93KHIpIT09dDp2b2lkIDB9ZnVuY3Rpb24gbHQoaSxvLGEscyxjKXtpZihhKWlmKHkoYSkpe3ZhciB1O0FycmF5LmlzQXJyYXkoYSkmJihhPUMoYSkpO3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCJjbGFzcyI9PT10fHwic3R5bGUiPT09dHx8bCh0KSl1PWk7ZWxzZXt2YXIgZT1pLmF0dHJzJiZpLmF0dHJzLnR5cGU7dT1zfHxELm11c3RVc2VQcm9wKG8sZSx0KT9pLmRvbVByb3BzfHwoaS5kb21Qcm9wcz17fSk6aS5hdHRyc3x8KGkuYXR0cnM9e30pfXZhciBuPWgodCkscj13KHQpO24gaW4gdXx8ciBpbiB1fHwodVt0XT1hW3RdLGMmJigoaS5vbnx8KGkub249e30pKVsidXBkYXRlOiIrdF09ZnVuY3Rpb24oZSl7YVt0XT1lfSkpfTtmb3IodmFyIHQgaW4gYSllKHQpfWVsc2U7cmV0dXJuIGl9ZnVuY3Rpb24gZHQoZSx0KXt2YXIgbj10aGlzLl9zdGF0aWNUcmVlc3x8KHRoaXMuX3N0YXRpY1RyZWVzPVtdKSxyPW5bZV07cmV0dXJuIHImJiF0fHxwdChyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLCJfX3N0YXRpY19fIitlLCExKSxyfWZ1bmN0aW9uIGZ0KGUsdCxuKXtyZXR1cm4gcHQoZSwiX19vbmNlX18iK3QrKG4/Il8iK246IiIpLCEwKSxlfWZ1bmN0aW9uIHB0KGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJiJzdHJpbmciIT10eXBlb2YgZVtyXSYmaHQoZVtyXSx0KyJfIityLG4pO2Vsc2UgaHQoZSx0LG4pfWZ1bmN0aW9uIGh0KGUsdCxuKXtlLmlzU3RhdGljPSEwLGUua2V5PXQsZS5pc09uY2U9bn1mdW5jdGlvbiB2dChlLHQpe2lmKHQpaWYodSh0KSl7dmFyIG49ZS5vbj1lLm9uP3goe30sZS5vbik6e307Zm9yKHZhciByIGluIHQpe3ZhciBpPW5bcl0sbz10W3JdO25bcl09aT9bXS5jb25jYXQoaSxvKTpvfX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIGd0KGUsdCxuLHIpe3Q9dHx8eyRzdGFibGU6IW59O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO0FycmF5LmlzQXJyYXkobyk/Z3Qobyx0LG4pOm8mJihvLnByb3h5JiYoby5mbi5wcm94eT0hMCksdFtvLmtleV09by5mbil9cmV0dXJuIHImJih0LiRrZXk9ciksdH1mdW5jdGlvbiBtdChlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9Mil7dmFyIHI9dFtuXTsic3RyaW5nIj09dHlwZW9mIHImJnImJihlW3Rbbl1dPXRbbisxXSl9cmV0dXJuIGV9ZnVuY3Rpb24geXQoZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/dCtlOmV9ZnVuY3Rpb24gX3QoZSl7ZS5fbz1mdCxlLl9uPW8sZS5fcz1uLGUuX2w9b3QsZS5fdD1hdCxlLl9xPVAsZS5faT1NLGUuX209ZHQsZS5fZj1zdCxlLl9rPXV0LGUuX2I9bHQsZS5fdj1sZSxlLl9lPXVlLGUuX3U9Z3QsZS5fZz12dCxlLl9kPW10LGUuX3A9eXR9ZnVuY3Rpb24gYnQoZSx0LG4sbyxyKXt2YXIgYSxpPXRoaXMscz1yLm9wdGlvbnM7ZChvLCJfdWlkIik/KGE9T2JqZWN0LmNyZWF0ZShvKSkuX29yaWdpbmFsPW86bz0oYT1vKS5fb3JpZ2luYWw7dmFyIGM9QShzLl9jb21waWxlZCksdT0hYzt0aGlzLmRhdGE9ZSx0aGlzLnByb3BzPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9ZS5vbnx8bSx0aGlzLmluamVjdGlvbnM9UWUocy5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBpLiRzbG90c3x8bnQoZS5zY29wZWRTbG90cyxpLiRzbG90cz1ldChuLG8pKSxpLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjb3BlZFNsb3RzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnQoZS5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGMmJih0aGlzLiRvcHRpb25zPXMsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPW50KGUuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSxzLl9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9SXQoYSxlLHQsbixyLHUpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXMuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gSXQoYSxlLHQsbixyLHUpfX1mdW5jdGlvbiB3dChlLHQsbixyLGkpe3ZhciBvPWRlKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsdC5zbG90JiYoKG8uZGF0YXx8KG8uZGF0YT17fSkpLnNsb3Q9dC5zbG90KSxvfWZ1bmN0aW9uIGt0KGUsdCl7Zm9yKHZhciBuIGluIHQpZVtoKG4pXT10W25dfV90KGJ0LnByb3RvdHlwZSk7dmFyIFN0PXtpbml0OmZ1bmN0aW9uKGUsdCl7aWYoZS5jb21wb25lbnRJbnN0YW5jZSYmIWUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkJiZlLmRhdGEua2VlcEFsaXZlKXt2YXIgbj1lO1N0LnByZXBhdGNoKG4sbil9ZWxzZXsoZS5jb21wb25lbnRJbnN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciBuPXtfaXNDb21wb25lbnQ6ITAsX3BhcmVudFZub2RlOmUscGFyZW50OnR9LHI9ZS5kYXRhLmlubGluZVRlbXBsYXRlO0kocikmJihuLnJlbmRlcj1yLnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz1yLnN0YXRpY1JlbmRlckZucyk7cmV0dXJuIG5ldyBlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihuKX0oZSxOdCkpLiRtb3VudCh0P2UuZWxtOnZvaWQgMCx0KX19LHByZXBhdGNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5jb21wb25lbnRPcHRpb25zOyFmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPXIuZGF0YS5zY29wZWRTbG90cyxhPWUuJHNjb3BlZFNsb3RzLHM9ISEobyYmIW8uJHN0YWJsZXx8YSE9PW0mJiFhLiRzdGFibGV8fG8mJmUuJHNjb3BlZFNsb3RzLiRrZXkhPT1vLiRrZXkpLGM9ISEoaXx8ZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW58fHMpO2UuJG9wdGlvbnMuX3BhcmVudFZub2RlPXIsZS4kdm5vZGU9cixlLl92bm9kZSYmKGUuX3Zub2RlLnBhcmVudD1yKTtpZihlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbj1pLGUuJGF0dHJzPXIuZGF0YS5hdHRyc3x8bSxlLiRsaXN0ZW5lcnM9bnx8bSx0JiZlLiRvcHRpb25zLnByb3BzKXtnZSghMSk7Zm9yKHZhciB1PWUuX3Byb3BzLGw9ZS4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLGQ9MDtkPGwubGVuZ3RoO2QrKyl7dmFyIGY9bFtkXSxwPWUuJG9wdGlvbnMucHJvcHM7dVtmXT1BZShmLHAsdCxlKX1nZSghMCksZS4kb3B0aW9ucy5wcm9wc0RhdGE9dH1lLl8kdXBkYXRlUHJvcGVydGllcyYmZS5fJHVwZGF0ZVByb3BlcnRpZXMoZSksbj1ufHxtO3ZhciBoPWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztlLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM9bixCdChlLG4saCksYyYmKGUuJHNsb3RzPWV0KGksci5jb250ZXh0KSxlLiRmb3JjZVVwZGF0ZSgpKX0odC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlLG4ucHJvcHNEYXRhLG4ubGlzdGVuZXJzLHQsbi5jaGlsZHJlbil9LGluc2VydDpmdW5jdGlvbihlKXt2YXIgdCxuPWUuY29udGV4dCxyPWUuY29tcG9uZW50SW5zdGFuY2U7ci5faXNNb3VudGVkfHwoci5faXNNb3VudGVkPSEwLHIuXyR2ZD8oRnQociwib25TZXJ2aWNlQ3JlYXRlZCIpLEZ0KHIsIm9uU2VydmljZUF0dGFjaGVkIiksci5fJHZkLmFkZE1vdW50ZWRWbShyKSk6RnQociwibW91bnRlZCIpKSxlLmRhdGEua2VlcEFsaXZlJiYobi5faXNNb3VudGVkPygodD1yKS5faW5hY3RpdmU9ITEsenQucHVzaCh0KSk6UnQociwhMCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tcG9uZW50SW5zdGFuY2U7dC5faXNEZXN0cm95ZWR8fChlLmRhdGEua2VlcEFsaXZlP2Z1bmN0aW9uIGUodCxuKXtpZihuJiYodC5fZGlyZWN0SW5hY3RpdmU9ITAsRHQodCkpKXJldHVybjtpZighdC5faW5hY3RpdmUpe3QuX2luYWN0aXZlPSEwO2Zvcih2YXIgcj0wO3I8dC4kY2hpbGRyZW4ubGVuZ3RoO3IrKyllKHQuJGNoaWxkcmVuW3JdKTtGdCh0LCJkZWFjdGl2YXRlZCIpfX0odCwhMCk6dC4kZGVzdHJveSgpKX19LHh0PU9iamVjdC5rZXlzKFN0KTtmdW5jdGlvbiBDdChlLHQsbixyLGkpe2lmKCFFKGUpKXt2YXIgbz1uLiRvcHRpb25zLl9iYXNlO2lmKHkoZSkmJihlPW8uZXh0ZW5kKGUpKSwiZnVuY3Rpb24iPT10eXBlb2YgZSl7dmFyIGEscyxjLHUsbCxkLGY7aWYoRShlLmNpZCkmJnZvaWQgMD09PShlPWZ1bmN0aW9uKHQsbil7aWYoQSh0LmVycm9yKSYmSSh0LmVycm9yQ29tcCkpcmV0dXJuIHQuZXJyb3JDb21wO2lmKEkodC5yZXNvbHZlZCkpcmV0dXJuIHQucmVzb2x2ZWQ7dmFyIGU9JHQ7ZSYmSSh0Lm93bmVycykmJi0xPT09dC5vd25lcnMuaW5kZXhPZihlKSYmdC5vd25lcnMucHVzaChlKTtpZihBKHQubG9hZGluZykmJkkodC5sb2FkaW5nQ29tcCkpcmV0dXJuIHQubG9hZGluZ0NvbXA7aWYoZSYmIUkodC5vd25lcnMpKXt2YXIgcj10Lm93bmVycz1bZV0saT0hMCxvPW51bGwsYT1udWxsO2UuJG9uKCJob29rOmRlc3Ryb3llZCIsZnVuY3Rpb24oKXtyZXR1cm4gYihyLGUpfSk7dmFyIHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKXJbdF0uJGZvcmNlVXBkYXRlKCk7ZSYmKHIubGVuZ3RoPTAsbnVsbCE9PW8mJihjbGVhclRpbWVvdXQobyksbz1udWxsKSxudWxsIT09YSYmKGNsZWFyVGltZW91dChhKSxhPW51bGwpKX0sYz1qKGZ1bmN0aW9uKGUpe3QucmVzb2x2ZWQ9UHQoZSxuKSxpP3IubGVuZ3RoPTA6cyghMCl9KSx1PWooZnVuY3Rpb24oZSl7SSh0LmVycm9yQ29tcCkmJih0LmVycm9yPSEwLHMoITApKX0pLGw9dChjLHUpO3JldHVybiB5KGwpJiYoXyhsKT9FKHQucmVzb2x2ZWQpJiZsLnRoZW4oYyx1KTpfKGwuY29tcG9uZW50KSYmKGwuY29tcG9uZW50LnRoZW4oYyx1KSxJKGwuZXJyb3IpJiYodC5lcnJvckNvbXA9UHQobC5lcnJvcixuKSksSShsLmxvYWRpbmcpJiYodC5sb2FkaW5nQ29tcD1QdChsLmxvYWRpbmcsbiksMD09PWwuZGVsYXk/dC5sb2FkaW5nPSEwOm89c2V0VGltZW91dChmdW5jdGlvbigpe289bnVsbCxFKHQucmVzb2x2ZWQpJiZFKHQuZXJyb3IpJiYodC5sb2FkaW5nPSEwLHMoITEpKX0sbC5kZWxheXx8MjAwKSksSShsLnRpbWVvdXQpJiYoYT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YT1udWxsLEUodC5yZXNvbHZlZCkmJnUobnVsbCl9LGwudGltZW91dCkpKSksaT0hMSx0LmxvYWRpbmc/dC5sb2FkaW5nQ29tcDp0LnJlc29sdmVkfX0oYT1lLG8pKSlyZXR1cm4gcz1hLGM9dCx1PW4sbD1yLGQ9aSwoZj11ZSgpKS5hc3luY0ZhY3Rvcnk9cyxmLmFzeW5jTWV0YT17ZGF0YTpjLGNvbnRleHQ6dSxjaGlsZHJlbjpsLHRhZzpkfSxmO3Q9dHx8e30sdm4oZSksSSh0Lm1vZGVsKSYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1vZGVsJiZlLm1vZGVsLnByb3B8fCJ2YWx1ZSIscj1lLm1vZGVsJiZlLm1vZGVsLmV2ZW50fHwiaW5wdXQiOyh0LmF0dHJzfHwodC5hdHRycz17fSkpW25dPXQubW9kZWwudmFsdWU7dmFyIGk9dC5vbnx8KHQub249e30pLG89aVtyXSxhPXQubW9kZWwuY2FsbGJhY2s7SShvKT8oQXJyYXkuaXNBcnJheShvKT8tMT09PW8uaW5kZXhPZihhKTpvIT09YSkmJihpW3JdPVthXS5jb25jYXQobykpOmlbcl09YX0oZS5vcHRpb25zLHQpO3ZhciBwPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXQub3B0aW9ucy5wcm9wcztpZihFKGkpKXJldHVybiBKZShlLHQse30scik7dmFyIG89e30sYT1lLmF0dHJzLHM9ZS5wcm9wcztpZihJKGEpfHxJKHMpKWZvcih2YXIgYyBpbiBpKXt2YXIgdT13KGMpO1llKG8scyxjLHUsITApfHxZZShvLGEsYyx1LCExKX1yZXR1cm4gSmUoZSx0LG8scil9KHQsZSwwLG4pO2lmKEEoZS5vcHRpb25zLmZ1bmN0aW9uYWwpKXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPWUub3B0aW9ucyxhPXt9LHM9by5wcm9wcztpZihJKHMpKWZvcih2YXIgYyBpbiBzKWFbY109QWUoYyxzLHR8fG0pO2Vsc2UgSShuLmF0dHJzKSYma3QoYSxuLmF0dHJzKSxJKG4ucHJvcHMpJiZrdChhLG4ucHJvcHMpO3ZhciB1PW5ldyBidChuLGEsaSxyLGUpLGw9by5yZW5kZXIuY2FsbChudWxsLHUuX2MsdSk7aWYobCBpbnN0YW5jZW9mIHNlKXJldHVybiB3dChsLG4sdS5wYXJlbnQsbyk7aWYoQXJyYXkuaXNBcnJheShsKSl7Zm9yKHZhciBkPUtlKGwpfHxbXSxmPW5ldyBBcnJheShkLmxlbmd0aCkscD0wO3A8ZC5sZW5ndGg7cCsrKWZbcF09d3QoZFtwXSxuLHUucGFyZW50LG8pO3JldHVybiBmfX0oZSxwLHQsbixyKTt2YXIgaD10Lm9uO2lmKHQub249dC5uYXRpdmVPbixBKGUub3B0aW9ucy5hYnN0cmFjdCkpe3ZhciB2PXQuc2xvdDt0PXt9LHYmJih0LnNsb3Q9dil9IWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmhvb2t8fChlLmhvb2s9e30pLG49MDtuPHh0Lmxlbmd0aDtuKyspe3ZhciByPXh0W25dLGk9dFtyXSxvPVN0W3JdO2k9PT1vfHxpJiZpLl9tZXJnZWR8fCh0W3JdPWk/VHQobyxpKTpvKX19KHQpO3ZhciBnPWUub3B0aW9ucy5uYW1lfHxpO3JldHVybiBuZXcgc2UoInZ1ZS1jb21wb25lbnQtIitlLmNpZCsoZz8iLSIrZzoiIiksdCx2b2lkIDAsdm9pZCAwLHZvaWQgMCxuLHtDdG9yOmUscHJvcHNEYXRhOnAsbGlzdGVuZXJzOmgsdGFnOmksY2hpbGRyZW46cn0sYSl9fX1mdW5jdGlvbiBUdChuLHIpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7bihlLHQpLHIoZSx0KX07cmV0dXJuIGUuX21lcmdlZD0hMCxlfXZhciBPdD0xLEV0PTI7ZnVuY3Rpb24gSXQoZSx0LG4scixpLG8pe3JldHVybihBcnJheS5pc0FycmF5KG4pfHxjKG4pKSYmKGk9cixyPW4sbj12b2lkIDApLEEobykmJihpPUV0KSxmdW5jdGlvbihlLHQsbixyLGkpe2lmKEkobikmJkkobi5fX29iX18pKXJldHVybiB1ZSgpO0kobikmJkkobi5pcykmJih0PW4uaXMpO2lmKCF0KXJldHVybiB1ZSgpO0FycmF5LmlzQXJyYXkocikmJiJmdW5jdGlvbiI9PXR5cGVvZiByWzBdJiYoKG49bnx8e30pLnNjb3BlZFNsb3RzPXtkZWZhdWx0OnJbMF19LHIubGVuZ3RoPTApO2k9PT1FdD9yPUtlKHIpOmk9PT1PdCYmKHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoQXJyYXkuaXNBcnJheShlW3RdKSlyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxlKTtyZXR1cm4gZX0ocikpO3ZhciBvLGE7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgczthPWUuJHZub2RlJiZlLiR2bm9kZS5uc3x8RC5nZXRUYWdOYW1lc3BhY2UodCksbz1ELmlzUmVzZXJ2ZWRUYWcodCk/bmV3IHNlKEQucGFyc2VQbGF0Zm9ybVRhZ05hbWUodCksbixyLHZvaWQgMCx2b2lkIDAsZSk6biYmbi5wcmV8fCFJKHM9SWUoZS4kb3B0aW9ucywiY29tcG9uZW50cyIsdCkpP25ldyBzZSh0LG4scix2b2lkIDAsdm9pZCAwLGUpOkN0KHMsbixlLHIsdCl9ZWxzZSBvPUN0KHQsbixlLHIpO3JldHVybiBBcnJheS5pc0FycmF5KG8pP286SShvKT8oSShhKSYmZnVuY3Rpb24gZSh0LG4scil7dC5ucz1uOyJmb3JlaWduT2JqZWN0Ij09PXQudGFnJiYocj0hKG49dm9pZCAwKSk7aWYoSSh0LmNoaWxkcmVuKSlmb3IodmFyIGk9MCxvPXQuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspe3ZhciBhPXQuY2hpbGRyZW5baV07SShhLnRhZykmJihFKGEubnMpfHxBKHIpJiYic3ZnIiE9PWEudGFnKSYmZShhLG4scil9fShvLGEpLEkobikmJmZ1bmN0aW9uKGUpe3koZS5zdHlsZSkmJnFlKGUuc3R5bGUpO3koZS5jbGFzcykmJnFlKGUuY2xhc3MpfShuKSxvKTp1ZSgpfShlLHQsbixyLGkpfXZhciBBdCwkdD1udWxsO2Z1bmN0aW9uIFB0KGUsdCl7cmV0dXJuKGUuX19lc01vZHVsZXx8dGUmJiJNb2R1bGUiPT09ZVtTeW1ib2wudG9TdHJpbmdUYWddKSYmKGU9ZS5kZWZhdWx0KSx5KGUpP3QuZXh0ZW5kKGUpOmV9ZnVuY3Rpb24gTXQoZSx0KXtBdC4kb24oZSx0KX1mdW5jdGlvbiBqdChlLHQpe0F0LiRvZmYoZSx0KX1mdW5jdGlvbiBMdCh0LG4pe3ZhciByPUF0O3JldHVybiBmdW5jdGlvbiBlKCl7bnVsbCE9PW4uYXBwbHkobnVsbCxhcmd1bWVudHMpJiZyLiRvZmYodCxlKX19ZnVuY3Rpb24gQnQoZSx0LG4pe0dlKHQsbnx8e30sTXQsanQsTHQsQXQ9ZSksQXQ9dm9pZCAwfXZhciBOdD1udWxsO2Z1bmN0aW9uIER0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gUnQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxEdChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKVJ0KGUuJGNoaWxkcmVuW25dKTtGdChlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gRnQoZSx0KXtvZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspTGUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxhZSgpfXZhciBVdD1bXSx6dD1bXSxWdD17fSxxdD0hMSxXdD0hMSxIdD0wO3ZhciBHdD1EYXRlLm5vdztpZihWJiYhRyl7dmFyIFh0PXdpbmRvdy5wZXJmb3JtYW5jZTtYdCYmImZ1bmN0aW9uIj09dHlwZW9mIFh0Lm5vdyYmR3QoKT5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKS50aW1lU3RhbXAmJihHdD1mdW5jdGlvbigpe3JldHVybiBYdC5ub3coKX0pfWZ1bmN0aW9uIEp0KCl7dmFyIGUsdDtmb3IoR3QoKSxXdD0hMCxVdC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQtdC5pZH0pLEh0PTA7SHQ8VXQubGVuZ3RoO0h0KyspKGU9VXRbSHRdKS5iZWZvcmUmJmUuYmVmb3JlKCksdD1lLmlkLFZ0W3RdPW51bGwsZS5ydW4oKTt2YXIgbj16dC5zbGljZSgpLHI9VXQuc2xpY2UoKTtIdD1VdC5sZW5ndGg9enQubGVuZ3RoPTAscXQ9V3Q9IShWdD17fSksZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5faW5hY3RpdmU9ITAsUnQoZVt0XSwhMCl9KG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2Zvcig7dC0tOyl7dmFyIG49ZVt0XSxyPW4udm07ci5fd2F0Y2hlcj09PW4mJnIuX2lzTW91bnRlZCYmIXIuX2lzRGVzdHJveWVkJiYoci5fJHZkP3IuXyR2ZC5hZGRVcGRhdGVkVm0ocik6RnQociwidXBkYXRlZCIpKX19KHIpLFomJkQuZGV2dG9vbHMmJlouZW1pdCgiZmx1c2giKX12YXIgWXQ9MCxLdD1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMudm09ZSxpJiYoZS5fd2F0Y2hlcj10aGlzKSxlLl93YXRjaGVycy5wdXNoKHRoaXMpLHI/KHRoaXMuZGVlcD0hIXIuZGVlcCx0aGlzLnVzZXI9ISFyLnVzZXIsdGhpcy5sYXp5PSEhci5sYXp5LHRoaXMuc3luYz0hIXIuc3luYyx0aGlzLmJlZm9yZT1yLmJlZm9yZSk6dGhpcy5kZWVwPXRoaXMudXNlcj10aGlzLmxhenk9dGhpcy5zeW5jPSExLHRoaXMuY2I9bix0aGlzLmlkPSsrWXQsdGhpcy5hY3RpdmU9ITAsdGhpcy5kaXJ0eT10aGlzLmxhenksdGhpcy5kZXBzPVtdLHRoaXMubmV3RGVwcz1bXSx0aGlzLmRlcElkcz1uZXcgZWUsdGhpcy5uZXdEZXBJZHM9bmV3IGVlLHRoaXMuZXhwcmVzc2lvbj0iIiwiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmdldHRlcj10Oih0aGlzLmdldHRlcj1mdW5jdGlvbihlKXtpZighRi50ZXN0KGUpKXt2YXIgbj1lLnNwbGl0KCIuIik7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7dCsrKXtpZighZSlyZXR1cm47ZT1lW25bdF1dfXJldHVybiBlfX19KHQpLHRoaXMuZ2V0dGVyfHwodGhpcy5nZXR0ZXI9VCkpLHRoaXMudmFsdWU9dGhpcy5sYXp5P3ZvaWQgMDp0aGlzLmdldCgpfTtLdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7dmFyIGU7b2UodGhpcyk7dmFyIHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO2plKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZxZShlKSxhZSgpLHRoaXMuY2xlYW51cERlcHMoKX1yZXR1cm4gZX0sS3QucHJvdG90eXBlLmFkZERlcD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkO3RoaXMubmV3RGVwSWRzLmhhcyh0KXx8KHRoaXMubmV3RGVwSWRzLmFkZCh0KSx0aGlzLm5ld0RlcHMucHVzaChlKSx0aGlzLmRlcElkcy5oYXModCl8fGUuYWRkU3ViKHRoaXMpKX0sS3QucHJvdG90eXBlLmNsZWFudXBEZXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl7dmFyIHQ9dGhpcy5kZXBzW2VdO3RoaXMubmV3RGVwSWRzLmhhcyh0LmlkKXx8dC5yZW1vdmVTdWIodGhpcyl9dmFyIG49dGhpcy5kZXBJZHM7dGhpcy5kZXBJZHM9dGhpcy5uZXdEZXBJZHMsdGhpcy5uZXdEZXBJZHM9bix0aGlzLm5ld0RlcElkcy5jbGVhcigpLG49dGhpcy5kZXBzLHRoaXMuZGVwcz10aGlzLm5ld0RlcHMsdGhpcy5uZXdEZXBzPW4sdGhpcy5uZXdEZXBzLmxlbmd0aD0wfSxLdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5sYXp5P3RoaXMuZGlydHk9ITA6dGhpcy5zeW5jP3RoaXMucnVuKCk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtpZihudWxsPT1WdFt0XSl7aWYoVnRbdF09ITAsV3Qpe2Zvcih2YXIgbj1VdC5sZW5ndGgtMTtIdDxuJiZVdFtuXS5pZD5lLmlkOyluLS07VXQuc3BsaWNlKG4rMSwwLGUpfWVsc2UgVXQucHVzaChlKTtxdHx8KHF0PSEwLHplKEp0KSl9fSh0aGlzKX0sS3QucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt2YXIgZT10aGlzLmdldCgpO2lmKGUhPT10aGlzLnZhbHVlfHx5KGUpfHx0aGlzLmRlZXApe3ZhciB0PXRoaXMudmFsdWU7aWYodGhpcy52YWx1ZT1lLHRoaXMudXNlcil0cnl7dGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX1jYXRjaChlKXtqZShlLHRoaXMudm0sJ2NhbGxiYWNrIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWVsc2UgdGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX19fSxLdC5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMuZ2V0KCksdGhpcy5kaXJ0eT0hMX0sS3QucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLmRlcGVuZCgpfSxLdC5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZHx8Yih0aGlzLnZtLl93YXRjaGVycyx0aGlzKTtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5yZW1vdmVTdWIodGhpcyk7dGhpcy5hY3RpdmU9ITF9fTt2YXIgWnQ9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpULHNldDpUfTtmdW5jdGlvbiBRdChlLHQsbil7WnQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bbl19LFp0LnNldD1mdW5jdGlvbihlKXt0aGlzW3RdW25dPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sWnQpfWZ1bmN0aW9uIGVuKGUpe2UuX3dhdGNoZXJzPVtdO3ZhciB0PWUuJG9wdGlvbnM7dC5wcm9wcyYmZnVuY3Rpb24obixyKXt2YXIgaT1uLiRvcHRpb25zLnByb3BzRGF0YXx8e30sbz1uLl9wcm9wcz17fSxhPW4uJG9wdGlvbnMuX3Byb3BLZXlzPVtdO24uJHBhcmVudCYmZ2UoITEpO3ZhciBlPWZ1bmN0aW9uKGUpe2EucHVzaChlKTt2YXIgdD1BZShlLHIsaSxuKTtfZShvLGUsdCksZSBpbiBufHxRdChuLCJfcHJvcHMiLGUpfTtmb3IodmFyIHQgaW4gcillKHQpO2dlKCEwKX0oZSx0LnByb3BzKSx0Lm1ldGhvZHMmJmZ1bmN0aW9uKGUsdCl7ZS4kb3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdCllW25dPSJmdW5jdGlvbiIhPXR5cGVvZiB0W25dP1Q6ayh0W25dLGUpfShlLHQubWV0aG9kcyksdC5kYXRhP2Z1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YTt1KHQ9ZS5fZGF0YT0iZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbihlLHQpe29lKCk7dHJ5e3JldHVybiBlLmNhbGwodCx0KX1jYXRjaChlKXtyZXR1cm4gamUoZSx0LCJkYXRhKCkiKSx7fX1maW5hbGx5e2FlKCl9fSh0LGUpOnR8fHt9KXx8KHQ9e30pO3ZhciBuPU9iamVjdC5rZXlzKHQpLHI9ZS4kb3B0aW9ucy5wcm9wcyxpPShlLiRvcHRpb25zLm1ldGhvZHMsbi5sZW5ndGgpO2Zvcig7aS0tOyl7dmFyIG89bltpXTtyJiZkKHIsbyl8fCh2b2lkIDAsMzYhPT0oYT0obysiIikuY2hhckNvZGVBdCgwKSkmJjk1IT09YSYmUXQoZSwiX2RhdGEiLG8pKX12YXIgYTt5ZSh0LCEwKX0oZSk6eWUoZS5fZGF0YT17fSwhMCksdC5jb21wdXRlZCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLl9jb21wdXRlZFdhdGNoZXJzPU9iamVjdC5jcmVhdGUobnVsbCkscj1LKCk7Zm9yKHZhciBpIGluIHQpe3ZhciBvPXRbaV0sYT0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vOm8uZ2V0O3J8fChuW2ldPW5ldyBLdChlLGF8fFQsVCx0bikpLGkgaW4gZXx8bm4oZSxpLG8pfX0oZSx0LmNvbXB1dGVkKSx0LndhdGNoJiZ0LndhdGNoIT09SiYmZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZihBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKWFuKGUsbixyW2ldKTtlbHNlIGFuKGUsbixyKX19KGUsdC53YXRjaCl9dmFyIHRuPXtsYXp5OiEwfTtmdW5jdGlvbiBubihlLHQsbil7dmFyIHI9IUsoKTsiZnVuY3Rpb24iPT10eXBlb2Ygbj8oWnQuZ2V0PXI/cm4odCk6b24obiksWnQuc2V0PVQpOihadC5nZXQ9bi5nZXQ/ciYmITEhPT1uLmNhY2hlP3JuKHQpOm9uKG4uZ2V0KTpULFp0LnNldD1uLnNldHx8VCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxadCl9ZnVuY3Rpb24gcm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY29tcHV0ZWRXYXRjaGVycyYmdGhpcy5fY29tcHV0ZWRXYXRjaGVyc1t0XTtpZihlKXJldHVybiBlLmRpcnR5JiZlLmV2YWx1YXRlKCksaWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmZS5kZXBlbmQoKSxlLnZhbHVlfX1mdW5jdGlvbiBvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMsdGhpcyl9fWZ1bmN0aW9uIGFuKGUsdCxuLHIpe3JldHVybiB1KG4pJiYobj0ocj1uKS5oYW5kbGVyKSwic3RyaW5nIj09dHlwZW9mIG4mJihuPWVbbl0pLGUuJHdhdGNoKHQsbixyKX12YXIgc24sY24sdW4sbG4sZG4sZm4scG4saG49MDtmdW5jdGlvbiB2bihlKXt2YXIgdD1lLm9wdGlvbnM7aWYoZS5zdXBlcil7dmFyIG49dm4oZS5zdXBlcik7aWYobiE9PWUuc3VwZXJPcHRpb25zKXtlLnN1cGVyT3B0aW9ucz1uO3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5vcHRpb25zLHI9ZS5zZWFsZWRPcHRpb25zO2Zvcih2YXIgaSBpbiBuKW5baV0hPT1yW2ldJiYodHx8KHQ9e30pLHRbaV09bltpXSk7cmV0dXJuIHR9KGUpO3ImJngoZS5leHRlbmRPcHRpb25zLHIpLCh0PWUub3B0aW9ucz1FZShuLGUuZXh0ZW5kT3B0aW9ucykpLm5hbWUmJih0LmNvbXBvbmVudHNbdC5uYW1lXT1lKX19cmV0dXJuIHR9ZnVuY3Rpb24gZ24oZSl7dGhpcy5faW5pdChlKX1mdW5jdGlvbiBtbihlKXtlLmNpZD0wO3ZhciBhPTE7ZS5leHRlbmQ9ZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10aGlzLG49dC5jaWQscj1lLl9DdG9yfHwoZS5fQ3Rvcj17fSk7aWYocltuXSlyZXR1cm4gcltuXTt2YXIgaT1lLm5hbWV8fHQub3B0aW9ucy5uYW1lLG89ZnVuY3Rpb24oZSl7dGhpcy5faW5pdChlKX07cmV0dXJuKChvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9bykuY2lkPWErKyxvLm9wdGlvbnM9RWUodC5vcHRpb25zLGUpLG8uc3VwZXI9dCxvLm9wdGlvbnMucHJvcHMmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdClRdChlLnByb3RvdHlwZSwiX3Byb3BzIixuKX0obyksby5vcHRpb25zLmNvbXB1dGVkJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMuY29tcHV0ZWQ7Zm9yKHZhciBuIGluIHQpbm4oZS5wcm90b3R5cGUsbix0W25dKX0obyksby5leHRlbmQ9dC5leHRlbmQsby5taXhpbj10Lm1peGluLG8udXNlPXQudXNlLEIuZm9yRWFjaChmdW5jdGlvbihlKXtvW2VdPXRbZV19KSxpJiYoby5vcHRpb25zLmNvbXBvbmVudHNbaV09byksby5zdXBlck9wdGlvbnM9dC5vcHRpb25zLG8uZXh0ZW5kT3B0aW9ucz1lLG8uc2VhbGVkT3B0aW9ucz14KHt9LG8ub3B0aW9ucykscltuXT1vfX1mdW5jdGlvbiB5bihlKXtyZXR1cm4gZSYmKGUuQ3Rvci5vcHRpb25zLm5hbWV8fGUudGFnKX1mdW5jdGlvbiBfbihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPGUuaW5kZXhPZih0KToic3RyaW5nIj09dHlwZW9mIGU/LTE8ZS5zcGxpdCgiLCIpLmluZGV4T2YodCk6KG49ZSwiW29iamVjdCBSZWdFeHBdIj09PXIuY2FsbChuKSYmZS50ZXN0KHQpKTt2YXIgbn1mdW5jdGlvbiBibihlLHQpe3ZhciBuPWUuY2FjaGUscj1lLmtleXMsaT1lLl92bm9kZTtmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtpZihhKXt2YXIgcz15bihhLmNvbXBvbmVudE9wdGlvbnMpO3MmJiF0KHMpJiZ3bihuLG8scixpKX19fWZ1bmN0aW9uIHduKGUsdCxuLHIpe3ZhciBpPWVbdF07IWl8fHImJmkudGFnPT09ci50YWd8fGkuY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKSxlW3RdPW51bGwsYihuLHQpfWduLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvPXRoaXM7by5fdWlkPWhuKyssby5faXNWdWU9ITAsZSYmZS5faXNDb21wb25lbnQ/ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50O3ZhciBpPShuLl9wYXJlbnRWbm9kZT1yKS5jb21wb25lbnRPcHRpb25zO24ucHJvcHNEYXRhPWkucHJvcHNEYXRhLG4uX3BhcmVudExpc3RlbmVycz1pLmxpc3RlbmVycyxuLl9yZW5kZXJDaGlsZHJlbj1pLmNoaWxkcmVuLG4uX2NvbXBvbmVudFRhZz1pLnRhZyx0LnJlbmRlciYmKG4ucmVuZGVyPXQucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zKX0obyxlKTpvLiRvcHRpb25zPUVlKHZuKG8uY29uc3RydWN0b3IpLGV8fHt9LG8pLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfSgoby5fcmVuZGVyUHJveHk9bykuX3NlbGY9byksZnVuY3Rpb24oZSl7ZS5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksZS5faGFzSG9va0V2ZW50PSExO3ZhciB0PWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczt0JiZCdChlLHQpfShvKSxmdW5jdGlvbihpKXtpLl92bm9kZT1udWxsLGkuX3N0YXRpY1RyZWVzPW51bGw7dmFyIGU9aS4kb3B0aW9ucyx0PWkuJHZub2RlPWUuX3BhcmVudFZub2RlLG49dCYmdC5jb250ZXh0O2kuJHNsb3RzPWV0KGUuX3JlbmRlckNoaWxkcmVuLG4pLGkuJHNjb3BlZFNsb3RzPW0saS5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gSXQoaSxlLHQsbixyLCExKX0saS4kY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gSXQoaSxlLHQsbixyLCEwKX07dmFyIHI9dCYmdC5kYXRhO19lKGksIiRhdHRycyIsciYmci5hdHRyc3x8bSxudWxsLCEwKSxfZShpLCIkbGlzdGVuZXJzIixlLl9wYXJlbnRMaXN0ZW5lcnN8fG0sbnVsbCwhMCl9KG8pLEZ0KG8sImJlZm9yZUNyZWF0ZSIpLChuPVFlKCh0PW8pLiRvcHRpb25zLmluamVjdCx0KSkmJihnZSghMSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtfZSh0LGUsbltlXSl9KSxnZSghMCkpLGVuKG8pLChpPShyPW8pLiRvcHRpb25zLnByb3ZpZGUpJiYoci5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5jYWxsKHIpOmkpLEZ0KG8sImNyZWF0ZWQiKSxvLiRvcHRpb25zLmVsJiZvLiRtb3VudChvLiRvcHRpb25zLmVsKX0sc249Z24sY249e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0sdW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wc319LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzbi5wcm90b3R5cGUsIiRkYXRhIixjbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KHNuLnByb3RvdHlwZSwiJHByb3BzIix1biksc24ucHJvdG90eXBlLiRzZXQ9YmUsc24ucHJvdG90eXBlLiRkZWxldGU9d2Usc24ucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZih1KHQpKXJldHVybiBhbihyLGUsdCxuKTsobj1ufHx7fSkudXNlcj0hMDt2YXIgaT1uZXcgS3QocixlLHQsbik7aWYobi5pbW1lZGlhdGUpdHJ5e3QuY2FsbChyLGkudmFsdWUpfWNhdGNoKGUpe2plKGUsciwnY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyICInK2kuZXhwcmVzc2lvbisnIicpfXJldHVybiBmdW5jdGlvbigpe2kudGVhcmRvd24oKX19LGRuPS9eaG9vazovLChsbj1nbikucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9uKGVbbl0sdCk7ZWxzZSh0aGlzLl9ldmVudHNbZV18fCh0aGlzLl9ldmVudHNbZV09W10pKS5wdXNoKHQpLGRuLnRlc3QoZSkmJih0aGlzLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiB0aGlzfSxsbi5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sbG4ucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcztpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb2ZmKGVbbl0sdCk7cmV0dXJuIHRoaXN9dmFyIGksbz10aGlzLl9ldmVudHNbZV07aWYoIW8pcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuX2V2ZW50c1tlXT1udWxsLHRoaXM7Zm9yKHZhciBhPW8ubGVuZ3RoO2EtLTspaWYoKGk9b1thXSk9PT10fHxpLmZuPT09dCl7by5zcGxpY2UoYSwxKTticmVha31yZXR1cm4gdGhpc30sbG4ucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PTE8dC5sZW5ndGg/Uyh0KTp0O2Zvcih2YXIgbj1TKGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKUxlKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9LChmbj1nbikucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMsaT1yLiRlbCxvPXIuX3Zub2RlLGE9KG49TnQsTnQ9cixmdW5jdGlvbigpe050PW59KTtyLl92bm9kZT1lLHIuJGVsPW8/ci5fX3BhdGNoX18obyxlKTpyLl9fcGF0Y2hfXyhyLiRlbCxlLHQsITEpLGEoKSxpJiYoaS5fX3Z1ZV9fPW51bGwpLHIuJGVsJiYoci4kZWwuX192dWVfXz1yKSxyLiR2bm9kZSYmci4kcGFyZW50JiZyLiR2bm9kZT09PXIuJHBhcmVudC5fdm5vZGUmJihyLiRwYXJlbnQuJGVsPXIuJGVsKX0sZm4ucHJvdG90eXBlLiRmb3JjZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3dhdGNoZXImJnRoaXMuX3dhdGNoZXIudXBkYXRlKCl9LGZuLnByb3RvdHlwZS4kZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIWUuX2lzQmVpbmdEZXN0cm95ZWQpe0Z0KGUsImJlZm9yZURlc3Ryb3kiKSxlLl9pc0JlaW5nRGVzdHJveWVkPSEwO3ZhciB0PWUuJHBhcmVudDshdHx8dC5faXNCZWluZ0Rlc3Ryb3llZHx8ZS4kb3B0aW9ucy5hYnN0cmFjdHx8Yih0LiRjaGlsZHJlbixlKSxlLl93YXRjaGVyJiZlLl93YXRjaGVyLnRlYXJkb3duKCk7Zm9yKHZhciBuPWUuX3dhdGNoZXJzLmxlbmd0aDtuLS07KWUuX3dhdGNoZXJzW25dLnRlYXJkb3duKCk7ZS5fZGF0YS5fX29iX18mJmUuX2RhdGEuX19vYl9fLnZtQ291bnQtLSxlLl9pc0Rlc3Ryb3llZD0hMCxlLl9fcGF0Y2hfXyhlLl92bm9kZSxudWxsKSxGdChlLCJkZXN0cm95ZWQiKSxlLiRvZmYoKSxlLiRlbCYmKGUuJGVsLl9fdnVlX189bnVsbCksZS4kdm5vZGUmJihlLiR2bm9kZS5wYXJlbnQ9bnVsbCl9fSxfdCgocG49Z24pLnByb3RvdHlwZSkscG4ucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gemUoZSx0aGlzKX0scG4ucHJvdG90eXBlLl9yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxuPXRoaXMsZT1uLiRvcHRpb25zLHI9ZS5yZW5kZXIsaT1lLl9wYXJlbnRWbm9kZTtpJiYobi4kc2NvcGVkU2xvdHM9bnQoaS5kYXRhLnNjb3BlZFNsb3RzLG4uJHNsb3RzLG4uJHNjb3BlZFNsb3RzKSksbi4kdm5vZGU9aTt0cnl7JHQ9bix0PXIuY2FsbChuLl9yZW5kZXJQcm94eSxuLiRjcmVhdGVFbGVtZW50KX1jYXRjaChlKXtqZShlLG4sInJlbmRlciIpLHQ9bi5fdm5vZGV9ZmluYWxseXskdD1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGgmJih0PXRbMF0pLHQgaW5zdGFuY2VvZiBzZXx8KHQ9dWUoKSksdC5wYXJlbnQ9aSx0fTt2YXIga24sU24seG4sQ249W1N0cmluZyxSZWdFeHAsQXJyYXldLFRuPXtLZWVwQWxpdmU6e25hbWU6ImtlZXAtYWxpdmUiLGFic3RyYWN0OiEwLHByb3BzOntpbmNsdWRlOkNuLGV4Y2x1ZGU6Q24sbWF4OltTdHJpbmcsTnVtYmVyXX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuY2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmtleXM9W119LGRlc3Ryb3llZDpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLmNhY2hlKXduKHRoaXMuY2FjaGUsZSx0aGlzLmtleXMpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiR3YXRjaCgiaW5jbHVkZSIsZnVuY3Rpb24odCl7Ym4oZSxmdW5jdGlvbihlKXtyZXR1cm4gX24odCxlKX0pfSksdGhpcy4kd2F0Y2goImV4Y2x1ZGUiLGZ1bmN0aW9uKHQpe2JuKGUsZnVuY3Rpb24oZSl7cmV0dXJuIV9uKHQsZSl9KX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzbG90cy5kZWZhdWx0LHQ9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XTtpZihJKG4pJiYoSShuLmNvbXBvbmVudE9wdGlvbnMpfHwocj1uKS5pc0NvbW1lbnQmJnIuYXN5bmNGYWN0b3J5KSlyZXR1cm4gbn12YXIgcn0oZSksbj10JiZ0LmNvbXBvbmVudE9wdGlvbnM7aWYobil7dmFyIHI9eW4obiksaT10aGlzLmluY2x1ZGUsbz10aGlzLmV4Y2x1ZGU7aWYoaSYmKCFyfHwhX24oaSxyKSl8fG8mJnImJl9uKG8scikpcmV0dXJuIHQ7dmFyIGE9dGhpcy5jYWNoZSxzPXRoaXMua2V5cyxjPW51bGw9PXQua2V5P24uQ3Rvci5jaWQrKG4udGFnPyI6OiIrbi50YWc6IiIpOnQua2V5O2FbY10/KHQuY29tcG9uZW50SW5zdGFuY2U9YVtjXS5jb21wb25lbnRJbnN0YW5jZSxiKHMsYykscy5wdXNoKGMpKTooYVtjXT10LHMucHVzaChjKSx0aGlzLm1heCYmcy5sZW5ndGg+cGFyc2VJbnQodGhpcy5tYXgpJiZ3bihhLHNbMF0scyx0aGlzLl92bm9kZSkpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fX07a249Z24seG49e2dldDpmdW5jdGlvbigpe3JldHVybiBEfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGtuLCJjb25maWciLHhuKSxrbi51dGlsPXt3YXJuOm5lLGV4dGVuZDp4LG1lcmdlT3B0aW9uczpFZSxkZWZpbmVSZWFjdGl2ZTpfZX0sa24uc2V0PWJlLGtuLmRlbGV0ZT13ZSxrbi5uZXh0VGljaz16ZSxrbi5vYnNlcnZhYmxlPWZ1bmN0aW9uKGUpe3JldHVybiB5ZShlKSxlfSxrbi5vcHRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksQi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2tuLm9wdGlvbnNbZSsicyJdPU9iamVjdC5jcmVhdGUobnVsbCl9KSx4KChrbi5vcHRpb25zLl9iYXNlPWtuKS5vcHRpb25zLmNvbXBvbmVudHMsVG4pLGtuLnVzZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnN0YWxsZWRQbHVnaW5zfHwodGhpcy5faW5zdGFsbGVkUGx1Z2lucz1bXSk7aWYoLTE8dC5pbmRleE9mKGUpKXJldHVybiB0aGlzO3ZhciBuPVMoYXJndW1lbnRzLDEpO3JldHVybiBuLnVuc2hpZnQodGhpcyksImZ1bmN0aW9uIj09dHlwZW9mIGUuaW5zdGFsbD9lLmluc3RhbGwuYXBwbHkoZSxuKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hcHBseShudWxsLG4pLHQucHVzaChlKSx0aGlzfSxrbi5taXhpbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zPUVlKHRoaXMub3B0aW9ucyxlKSx0aGlzfSxtbihrbiksU249a24sQi5mb3JFYWNoKGZ1bmN0aW9uKG4pe1NuW25dPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/KCJjb21wb25lbnQiPT09biYmdSh0KSYmKHQubmFtZT10Lm5hbWV8fGUsdD10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKHQpKSwiZGlyZWN0aXZlIj09PW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD17YmluZDp0LHVwZGF0ZTp0fSksdGhpcy5vcHRpb25zW24rInMiXVtlXT10KTp0aGlzLm9wdGlvbnNbbisicyJdW2VdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbi5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDpLfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGduLnByb3RvdHlwZSwiJHNzckNvbnRleHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGduLCJGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCIse3ZhbHVlOmJ0fSksZ24udmVyc2lvbj0iMi42LjExIjt2YXIgT249MTtmdW5jdGlvbiBFbigpe3JldHVybihPbisrKS50b1N0cmluZygpfXZhciBJbj1mdW5jdGlvbigpe3RoaXMubm9kZUlkPUVuKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLm5leHRTaWJsaW5nPW51bGwsdGhpcy5wcmV2aW91c1NpYmxpbmc9bnVsbH07SW4ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl8kdmQmJnRoaXMuXyR2ZC5yZW1vdmVFbGVtZW50KHRoaXMpLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pfTt2YXIgQW49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5ub2RlVHlwZT04LHRoaXMubm9kZUlkPUVuKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy50eXBlPSJjb21tZW50Iix0aGlzLnZhbHVlPWUsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLCgoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJceDNjIS0tICIrdGhpcy52YWx1ZSsiIC0tXHgzZSJ9LGV9KEluKTtmdW5jdGlvbiAkbihlLHQsbil7dmFyIHI9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoISgwPHIucHVyZUNoaWxkcmVuLmxlbmd0aCYmMT09PXQubm9kZVR5cGV8fHQucGFyZW50Tm9kZSkpe3ZhciBpPXIuY2hpbGRyZW4sbz1pLmluZGV4T2Yobik7bzwwP2kucHVzaCh0KTppLnNwbGljZShvLDAsdCksMT09PXQubm9kZVR5cGU/KCJib2R5Ij09PXQucm9sZT8odC5kb2NJZD1lLmlkLHQub3duZXJEb2N1bWVudD1lLHQucGFyZW50Tm9kZT1yKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksUG4oZSx0KSx0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUpLE1uKHQsciksci5wdXJlQ2hpbGRyZW4ucHVzaCh0KSk6dC5wYXJlbnROb2RlPXJ9fWZ1bmN0aW9uIFBuKGUsdCl7dC5yb2xlPSJib2R5Iix0LmRlcHRoPTEsdC5yZWY9Il9yb290IixlLmJvZHk9dH1mdW5jdGlvbiBNbih0LGUpeyh0LnBhcmVudE5vZGU9ZSkuZG9jSWQmJih0LmRvY0lkPWUuZG9jSWQsdC5vd25lckRvY3VtZW50PWUub3duZXJEb2N1bWVudCx0LmRlcHRoPWUuZGVwdGgrMSksdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe01uKGUsdCl9KX1mdW5jdGlvbiBqbihlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIExuKGUpe2Zvcig7ZTspe2lmKDE9PT1lLm5vZGVUeXBlKXJldHVybiBlO2U9ZS5wcmV2aW91c1NpYmxpbmd9fWZ1bmN0aW9uIEJuKGUsdCxuLHIpe248MCYmKG49MCk7dmFyIGk9dFtuLTFdLG89dFtuXTtyZXR1cm4gdC5zcGxpY2UobiwwLGUpLHImJihpJiYoaS5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1pLChlLm5leHRTaWJsaW5nPW8pJiYoby5wcmV2aW91c1NpYmxpbmc9ZSkpLG59ZnVuY3Rpb24gTm4oZSx0LG4scil7dmFyIGk9dC5pbmRleE9mKGUpO2lmKGk8MClyZXR1cm4tMTtpZihyKXt2YXIgbz10W2ktMV0sYT10W2krMV07byYmKG8ubmV4dFNpYmxpbmc9YSksYSYmKGEucHJldmlvdXNTaWJsaW5nPW8pfXQuc3BsaWNlKGksMSk7dmFyIHM9bjtpPD1uJiYocz1uLTEpO3ZhciBjPXRbcy0xXSx1PXRbc107cmV0dXJuIHQuc3BsaWNlKHMsMCxlKSxyJiYoYyYmKGMubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9YywoZS5uZXh0U2libGluZz11KSYmKHUucHJldmlvdXNTaWJsaW5nPWUpKSxpPT09cz8tMTpufWZ1bmN0aW9uIERuKGUsdCxuKXt2YXIgcj10LmluZGV4T2YoZSk7aWYoIShyPDApKXtpZihuKXt2YXIgaT10W3ItMV0sbz10W3IrMV07aSYmKGkubmV4dFNpYmxpbmc9byksbyYmKG8ucHJldmlvdXNTaWJsaW5nPWkpfXQuc3BsaWNlKHIsMSl9fXZhciBSbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPSJ2aWV3IiksdC5jYWxsKHRoaXMpLHRoaXMubm9kZVR5cGU9MSx0aGlzLm5vZGVJZD1FbigpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMudHlwZT1lLHRoaXMuYXR0cj17fSx0aGlzLmV2ZW50cz17fSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnNldEF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpeyJjaWQiPT09ZT90aGlzLmNpZD10OiJuaWQiPT09ZSYmKHRoaXMubmlkPXQpfSxlLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ldmVudHNbZV07biYmbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodCl9KX0sZS5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe2lmKCIiPT09dGhpcy5jaWR8fCIiPT09dGhpcy5uaWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiBhZGRFdmVudExpc3RlbmVyKCIrZSsiKSBub3QgZm91bmQiKTsodGhpcy5ldmVudHNbZV18fCh0aGlzLmV2ZW50c1tlXT1bXSkpLnB1c2godCksdGhpcy5fJHZkLmFkZEVsZW1lbnQodGhpcyl9LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCIiPT09dGhpcy5jaWR8fCIiPT09dGhpcy5uaWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiByZW1vdmVFdmVudExpc3RlbmVyKCIrZSsiKSBub3QgZm91bmQiKTt2YXIgcj0hMTtpZih0aGlzLmV2ZW50c1tlXSl7dmFyIGk9dGhpcy5ldmVudHNbZV0uaW5kZXhPZih0KTstMSE9PWkmJih0aGlzLmV2ZW50c1tlXS5zcGxpY2UoaSwxKSxyPSEwKX1yfHxjb25zb2xlLmVycm9yKCJjaWQ9Iit0aGlzLmNpZCsiLG5pZD0iK3RoaXMubmlkKyIgcmVtb3ZlRXZlbnRMaXN0ZW5lcigiK2UrIikgaGFuZGxlciBub3QgZm91bmQiKSxPYmplY3Qua2V5cyh0aGlzLmV2ZW50cykuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1uLmV2ZW50c1tlXS5sZW5ndGh9KSYmdGhpcy5fJHZkLnJlbW92ZUVsZW1lbnQodGhpcyl9LGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8KGUucGFyZW50Tm9kZT8oTm4oZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCEwKSwxPT09ZS5ub2RlVHlwZSYmTm4oZSx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpKTooTW4oZSx0aGlzKSxCbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLDE9PT1lLm5vZGVUeXBlJiZCbihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCkpKX0sZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGUsdCl7aWYoIShlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLm5leHRTaWJsaW5nJiZlLm5leHRTaWJsaW5nPT09dCkpaWYoZS5wYXJlbnROb2RlKXtpZihObihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIG49am4odCk7Tm4oZSx0aGlzLnB1cmVDaGlsZHJlbixuP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKX19ZWxzZSBpZihNbihlLHRoaXMpLEJuKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCksITApLDE9PT1lLm5vZGVUeXBlKXt2YXIgcj1qbih0KTtCbihlLHRoaXMucHVyZUNoaWxkcmVuLHI/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihyKTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpfX0sZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLnByZXZpb3VzU2libGluZyYmZS5wcmV2aW91c1NpYmxpbmc9PT10fHwoZS5wYXJlbnROb2RlPyhObihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLDE9PT1lLm5vZGVUeXBlJiZObihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoTG4odCkpKzEpKTooTW4oZSx0aGlzKSxCbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLDE9PT1lLm5vZGVUeXBlJiZCbihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoTG4odCkpKzEpKSl9LGUucHJvdG90eXBlLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGUsdCl7ZS5wYXJlbnROb2RlJiYoRG4oZSx0aGlzLmNoaWxkcmVuLCEwKSwxPT09ZS5ub2RlVHlwZSYmRG4oZSx0aGlzLnB1cmVDaGlsZHJlbikpLHR8fGUuZGVzdHJveSgpfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIjwiK3RoaXMudHlwZSsiIGF0dHI9IitKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpKyIgc3R5bGU9IitKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkrIj4iK3RoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkuam9pbigiIikrIjwvIit0aGlzLnR5cGUrIj4ifSxlfShJbiksRm49ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWU/ZS50b1N0cmluZygpOiIiLHRoaXMuVVJMPXQsdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX07Rm4ucHJvdG90eXBlLmNyZWF0ZURvY3VtZW50RWxlbWVudD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7aWYoIXRoaXMuZG9jdW1lbnRFbGVtZW50KXt2YXIgZT1uZXcgUm4oImRvY3VtZW50Iik7ZS5kb2NJZD10aGlzLmlkLGUub3duZXJEb2N1bWVudD10aGlzLGUucm9sZT0iZG9jdW1lbnRFbGVtZW50IixlLmRlcHRoPTAsZS5yZWY9Il9kb2N1bWVudEVsZW1lbnQiLHRoaXMuZG9jdW1lbnRFbGVtZW50PWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSl7JG4obixlKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiaW5zZXJ0QmVmb3JlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSx0KXskbihuLGUsdCl9fSl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fSxGbi5wcm90b3R5cGUuY3JlYXRlQm9keT1mdW5jdGlvbihlKXt0aGlzLmJvZHl8fFBuKHRoaXMsbmV3IFJuKGUpKTtyZXR1cm4gdGhpcy5ib2R5fSxGbi5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFJuKGUpfSxGbi5wcm90b3R5cGUuY3JlYXRlQ29tbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IEFuKGUpfSxGbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe307dmFyIFVuPXMoInN0eWxlLGNsYXNzIiksem49KHMoImlucHV0LHRleHRhcmVhLG9wdGlvbixzZWxlY3QscHJvZ3Jlc3MiKSxzKCJjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2siKSxzKCJldmVudHMsY2FyZXQsdHlwaW5nLHBsYWludGV4dC1vbmx5IikscygiYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSxkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsZW5hYmxlZCxmb3Jtbm92YWxpZGF0ZSxoaWRkZW4saW5kZXRlcm1pbmF0ZSxpbmVydCxpc21hcCxpdGVtc2NvcGUsbG9vcCxtdWx0aXBsZSxtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LHJlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cmFuc2xhdGUsdHJ1ZXNwZWVkLHR5cGVtdXN0bWF0Y2gsdmlzaWJsZSIpLHMoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IikpO3ZhciBWbj1PYmplY3QuZnJlZXplKHtjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUm4oZSl9LGNyZWF0ZUVsZW1lbnROUzpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUm4oZSsiOiIrdCl9LGNyZWF0ZVRleHROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSbigidGV4dCIpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQW4oZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2UuYXBwZW5kQ2hpbGQodCl9LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oKXt9fSkscW49e2NyZWF0ZTpmdW5jdGlvbihlLHQpe1duKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKFduKGUsITApLFduKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXtXbihlLCEwKX19O2Z1bmN0aW9uIFduKGUsdCl7dmFyIG49ZS5kYXRhLnJlZjtpZihJKG4pKXt2YXIgcj1lLmNvbnRleHQsaT1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxvPXIuJHJlZnM7dD9BcnJheS5pc0FycmF5KG9bbl0pP2Iob1tuXSxpKTpvW25dPT09aSYmKG9bbl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShvW25dKT9vW25dLmluZGV4T2YoaSk8MCYmb1tuXS5wdXNoKGkpOm9bbl09W2ldOm9bbl09aX19cygiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSxzKCJzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsZm9yZWlnbk9iamVjdCxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldyIsITApO3ZhciBIbj1zKCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpLEduPW5ldyBzZSgiIix7fSxbXSksWG49WyJjcmVhdGUiLCJhY3RpdmF0ZSIsInVwZGF0ZSIsInJlbW92ZSIsImRlc3Ryb3kiXTtmdW5jdGlvbiBKbihlLHQpe3JldHVybiBlLmtleT09PXQua2V5JiYoZS50YWc9PT10LnRhZyYmZS5pc0NvbW1lbnQ9PT10LmlzQ29tbWVudCYmSShlLmRhdGEpPT09SSh0LmRhdGEpJiZmdW5jdGlvbihlLHQpe2lmKCJpbnB1dCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgbixyPUkobj1lLmRhdGEpJiZJKG49bi5hdHRycykmJm4udHlwZSxpPUkobj10LmRhdGEpJiZJKG49bi5hdHRycykmJm4udHlwZTtyZXR1cm4gcj09PWl8fEhuKHIpJiZIbihpKX0oZSx0KXx8QShlLmlzQXN5bmNQbGFjZWhvbGRlcikmJmUuYXN5bmNGYWN0b3J5PT09dC5hc3luY0ZhY3RvcnkmJkUodC5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBZbihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihyPXQ7cjw9bjsrK3IpSShpPWVbcl0ua2V5KSYmKG9baV09cik7cmV0dXJuIG99dmFyIEtuPXtjcmVhdGU6Wm4sdXBkYXRlOlpuLGRlc3Ryb3k6ZnVuY3Rpb24oZSl7Wm4oZSxHbil9fTtmdW5jdGlvbiBabihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZmdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPXQ9PT1HbixhPW49PT1HbixzPWVyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksYz1lcihuLmRhdGEuZGlyZWN0aXZlcyxuLmNvbnRleHQpLHU9W10sbD1bXTtmb3IoZSBpbiBjKXI9c1tlXSxpPWNbZV0scj8oaS5vbGRWYWx1ZT1yLnZhbHVlLGkub2xkQXJnPXIuYXJnLHRyKGksInVwZGF0ZSIsbix0KSxpLmRlZiYmaS5kZWYuY29tcG9uZW50VXBkYXRlZCYmbC5wdXNoKGkpKToodHIoaSwiYmluZCIsbix0KSxpLmRlZiYmaS5kZWYuaW5zZXJ0ZWQmJnUucHVzaChpKSk7aWYodS5sZW5ndGgpe3ZhciBkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx1Lmxlbmd0aDtlKyspdHIodVtlXSwiaW5zZXJ0ZWQiLG4sdCl9O28/WGUobiwiaW5zZXJ0IixkKTpkKCl9bC5sZW5ndGgmJlhlKG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPGwubGVuZ3RoO2UrKyl0cihsW2VdLCJjb21wb25lbnRVcGRhdGVkIixuLHQpfSk7aWYoIW8pZm9yKGUgaW4gcyljW2VdfHx0cihzW2VdLCJ1bmJpbmQiLHQsdCxhKX0oZSx0KX12YXIgUW49T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBlcihlLHQpe3ZhciBuLHIsaSxvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIG87Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1RbiksKG9bKGk9cixpLnJhd05hbWV8fGkubmFtZSsiLiIrT2JqZWN0LmtleXMoaS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIikpXT1yKS5kZWY9SWUodC4kb3B0aW9ucywiZGlyZWN0aXZlcyIsci5uYW1lKTtyZXR1cm4gb31mdW5jdGlvbiB0cih0LG4scixlLGkpe3ZhciBvPXQuZGVmJiZ0LmRlZltuXTtpZihvKXRyeXtvKHIuZWxtLHQscixlLGkpfWNhdGNoKGUpe2plKGUsci5jb250ZXh0LCJkaXJlY3RpdmUgIit0Lm5hbWUrIiAiK24rIiBob29rIil9fWZ1bmN0aW9uIG5yKGUsbil7aWYoIUUoZS5kYXRhLnd4c1Byb3BzKXx8IUUobi5kYXRhLnd4c1Byb3BzKSl7dmFyIHI9ZS4kd3hzV2F0Y2hlcyx0PU9iamVjdC5rZXlzKG4uZGF0YS53eHNQcm9wcyk7aWYocnx8dC5sZW5ndGgpe3J8fChyPXt9KTt2YXIgaT1uLmRhdGEud3hzUHJvcHM7bi4kd3hzV2F0Y2hlcz17fSxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07bi4kd3hzV2F0Y2hlc1tlXT1yW2VdfHxuLmNvbnRleHQuJHdhdGNoKHQsZnVuY3Rpb24oKXt0aGlzLiRmb3JjZVVwZGF0ZSgpfSx7aW1tZWRpYXRlOiEwLGRlZXA6ITB9KX0pLE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7bi4kd3hzV2F0Y2hlc1tlXXx8KHJbZV0oKSxkZWxldGUgcltlXSl9KX19fWZ1bmN0aW9uIHJyKGUsdCl7dmFyIG49dC5kYXRhLmF0dHJzO2lmKCFFKG4pJiYhRShuLl9pKSl7dmFyIHIsaSxvPXQuZWxtO28uZGF0YXNldD1PYmplY3QuYXNzaWduKG8uZGF0YXNldHx8e30sKHI9bixpPU9iamVjdC5jcmVhdGUobnVsbCksT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbih0KXtpZigwPT09dC5pbmRleE9mKCJkYXRhLSIpKXt2YXIgbj1oKHQucmVwbGFjZSgiZGF0YS0iLCIiKSk7dHJ5e2lbbl09SlNPTi5wYXJzZShyW3RdKX1jYXRjaChlKXtpW25dPXJbdF19fX0pLGkpKX19dmFyIGlyLG9yPSJfX3IiLGFyPSJfX2MiO2Z1bmN0aW9uIHNyKHQsbixyKXt2YXIgaT1pcjtyZXR1cm4gZnVuY3Rpb24gZSgpe251bGwhPT1uLmFwcGx5KG51bGwsYXJndW1lbnRzKSYmdXIodCxlLHIsaSl9fWZ1bmN0aW9uIGNyKGUsdCl7aXIuYWRkRXZlbnRMaXN0ZW5lcihlLHQpfWZ1bmN0aW9uIHVyKGUsdCxuLHIpe3QmJihyfHxpcikucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQuX3dyYXBwZXJ8fHQpfWZ1bmN0aW9uIGxyKGUsdCl7aWYoIUUoZS5kYXRhLm9uKXx8IUUodC5kYXRhLm9uKSl7dmFyIG49dC5kYXRhLm9ufHx7fSxyPWUuZGF0YS5vbnx8e307KGlyPXQuZWxtKS5fJHZkPXQuY29udGV4dC5fJHZkO2Zvcih2YXIgaT10LmNvbnRleHQsbz0odC5kYXRhLmF0dHJzfHx7fSkuX2ksYT10LnBhcmVudDthJiZhLmNvbXBvbmVudEluc3RhbmNlOyl7dmFyIHM9YS5jb21wb25lbnRJbnN0YW5jZS4kYXR0cnMmJmEuY29tcG9uZW50SW5zdGFuY2UuJGF0dHJzLl9pO0kocykmJihvPSJyLSIrcyksYT1hLnBhcmVudH1pci5zZXRBdHRyaWJ1dGUoIm5pZCIsU3RyaW5nKG8pKSxpci5zZXRBdHRyaWJ1dGUoImNpZCIsaS5fJGlkKSxmdW5jdGlvbihlKXtJKGVbb3JdKSYmKGUuaW5wdXQ9W10uY29uY2F0KGVbb3JdLGUuaW5wdXR8fFtdKSxkZWxldGUgZVtvcl0pO0koZVthcl0pJiYoZS5jaGFuZ2U9W10uY29uY2F0KGVbYXJdLGUuY2hhbmdlfHxbXSksZGVsZXRlIGVbYXJdKX0obiksR2UobixyLGNyLHVyLHNyLHQuY29udGV4dCksaXI9dm9pZCAwfX12YXIgZHI9ZnVuY3Rpb24oZSl7dmFyIHIsdCxnPXt9LG49ZS5tb2R1bGVzLG09ZS5ub2RlT3BzO2ZvcihyPTA7cjxYbi5sZW5ndGg7KytyKWZvcihnW1huW3JdXT1bXSx0PTA7dDxuLmxlbmd0aDsrK3QpSShuW3RdW1huW3JdXSkmJmdbWG5bcl1dLnB1c2goblt0XVtYbltyXV0pO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9bS5wYXJlbnROb2RlKGUpO0kodCkmJm0ucmVtb3ZlQ2hpbGQodCxlKX1mdW5jdGlvbiB5KGUsdCxuLHIsaSxvLGEpe2lmKEkoZS5lbG0pJiZJKG8pJiYoZT1vW2FdPWRlKGUpKSxlLmlzUm9vdEluc2VydD0haSwhZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5kYXRhO2lmKEkoaSkpe3ZhciBvPUkoZS5jb21wb25lbnRJbnN0YW5jZSkmJmkua2VlcEFsaXZlO2lmKEkoaT1pLmhvb2spJiZJKGk9aS5pbml0KSYmaShlLCExKSxJKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBwKGUsdCksbChuLGUuZWxtLHIpLEEobykmJmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaSxvPWU7by5jb21wb25lbnRJbnN0YW5jZTspaWYobz1vLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxJKGk9by5kYXRhKSYmSShpPWkudHJhbnNpdGlvbikpe2ZvcihpPTA7aTxnLmFjdGl2YXRlLmxlbmd0aDsrK2kpZy5hY3RpdmF0ZVtpXShHbixvKTt0LnB1c2gobyk7YnJlYWt9bChuLGUuZWxtLHIpfShlLHQsbixyKSwhMH19KGUsdCxuLHIpKXt2YXIgcz1lLmRhdGEsYz1lLmNoaWxkcmVuLHU9ZS50YWc7SSh1KT8oZS5lbG09ZS5ucz9tLmNyZWF0ZUVsZW1lbnROUyhlLm5zLHUpOm0uY3JlYXRlRWxlbWVudCh1LGUpLGQoZSksaChlLGMsdCksSShzKSYmdihlLHQpKTpBKGUuaXNDb21tZW50KT9lLmVsbT1tLmNyZWF0ZUNvbW1lbnQoZS50ZXh0KTplLmVsbT1tLmNyZWF0ZVRleHROb2RlKGUudGV4dCksbChuLGUuZWxtLHIpfX1mdW5jdGlvbiBwKGUsdCl7SShlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsXyhlKT8odihlLHQpLGQoZSkpOihXbihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIGwoZSx0LG4pe0koZSkmJihJKG4pP20ucGFyZW50Tm9kZShuKT09PWUmJm0uaW5zZXJ0QmVmb3JlKGUsdCxuKTptLmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIGgoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpeSh0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpO2Vsc2UgYyhlLnRleHQpJiZtLmFwcGVuZENoaWxkKGUuZWxtLG0uY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiBfKGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gSShlLnRhZyl9ZnVuY3Rpb24gdihlLHQpe2Zvcih2YXIgbj0wO248Zy5jcmVhdGUubGVuZ3RoOysrbilnLmNyZWF0ZVtuXShHbixlKTtJKHI9ZS5kYXRhLmhvb2spJiYoSShyLmNyZWF0ZSkmJnIuY3JlYXRlKEduLGUpLEkoci5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGQoZSl7dmFyIHQ7aWYoSSh0PWUuZm5TY29wZUlkKSltLnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIG49ZTtuOylJKHQ9bi5jb250ZXh0KSYmSSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZtLnNldFN0eWxlU2NvcGUoZS5lbG0sdCksbj1uLnBhcmVudDtJKHQ9TnQpJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJkkodD10LiRvcHRpb25zLl9zY29wZUlkKSYmbS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIGIoZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpeShuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gdyhlKXt2YXIgdCxuLHI9ZS5kYXRhO2lmKEkocikpZm9yKEkodD1yLmhvb2spJiZJKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDxnLmRlc3Ryb3kubGVuZ3RoOysrdClnLmRlc3Ryb3lbdF0oZSk7aWYoSSh0PWUuY2hpbGRyZW4pKWZvcihuPTA7bjxlLmNoaWxkcmVuLmxlbmd0aDsrK24pdyhlLmNoaWxkcmVuW25dKX1mdW5jdGlvbiBrKGUsdCxuKXtmb3IoO3Q8PW47Kyt0KXt2YXIgcj1lW3RdO0kocikmJihJKHIudGFnKT8oYShyKSx3KHIpKTpvKHIuZWxtKSl9fWZ1bmN0aW9uIGEoZSx0KXtpZihJKHQpfHxJKGUuZGF0YSkpe3ZhciBuLHIsaT1nLnJlbW92ZS5sZW5ndGgrMTtpZihJKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxJKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkkobj1uLl92bm9kZSkmJkkobi5kYXRhKSlhKG4sdCk7ZWxzZSBpZihJKHI9ZS5jaGlsZHJlbikpZm9yKG49MDtuPHIubGVuZ3RoO24rKylyW25dLnRhZyYmYShyW25dKTtmb3Iobj0wO248Zy5yZW1vdmUubGVuZ3RoOysrbilnLnJlbW92ZVtuXShlLHQpO0kobj1lLmRhdGEuaG9vaykmJkkobj1uLnJlbW92ZSk/bihlLHQpOnQoKX1lbHNlIG8oZS5lbG0pfWZ1bmN0aW9uIFMoZSx0LG4scil7Zm9yKHZhciBpPW47aTxyO2krKyl7dmFyIG89dFtpXTtpZihJKG8pJiZKbihlLG8pKXJldHVybiBpfX1mdW5jdGlvbiB4KGUsdCxuLHIsaSxvKXtpZihlIT09dCl7SSh0LmVsbSkmJkkocikmJih0PXJbaV09ZGUodCkpO3ZhciBhPXQuZWxtPWUuZWxtO2lmKEEoZS5pc0FzeW5jUGxhY2Vob2xkZXIpKUkodC5hc3luY0ZhY3RvcnkucmVzb2x2ZWQpP08oZS5lbG0sdCxuKTp0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMDtlbHNlIGlmKEEodC5pc1N0YXRpYykmJkEoZS5pc1N0YXRpYykmJnQua2V5PT09ZS5rZXkmJihBKHQuaXNDbG9uZWQpfHxBKHQuaXNPbmNlKSkpdC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlO2Vsc2V7dmFyIHMsYz10LmRhdGE7SShjKSYmSShzPWMuaG9vaykmJkkocz1zLnByZXBhdGNoKSYmcyhlLHQpO3ZhciB1PWUuY2hpbGRyZW4sbD10LmNoaWxkcmVuO2lmKEkoYykmJl8odCkpe2ZvcihzPTA7czxnLnVwZGF0ZS5sZW5ndGg7KytzKWcudXBkYXRlW3NdKGUsdCk7SShzPWMuaG9vaykmJkkocz1zLnVwZGF0ZSkmJnMoZSx0KX1FKHQudGV4dCk/SSh1KSYmSShsKT91IT09bCYmZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLGM9MCx1PTAsbD10Lmxlbmd0aC0xLGQ9dFswXSxmPXRbbF0scD1uLmxlbmd0aC0xLGg9blswXSx2PW5bcF0sZz0haTtjPD1sJiZ1PD1wOylFKGQpP2Q9dFsrK2NdOkUoZik/Zj10Wy0tbF06Sm4oZCxoKT8oeChkLGgscixuLHUpLGQ9dFsrK2NdLGg9blsrK3VdKTpKbihmLHYpPyh4KGYsdixyLG4scCksZj10Wy0tbF0sdj1uWy0tcF0pOkpuKGQsdik/KHgoZCx2LHIsbixwKSxnJiZtLmluc2VydEJlZm9yZShlLGQuZWxtLG0ubmV4dFNpYmxpbmcoZi5lbG0pKSxkPXRbKytjXSx2PW5bLS1wXSk6KEpuKGYsaCk/KHgoZixoLHIsbix1KSxnJiZtLmluc2VydEJlZm9yZShlLGYuZWxtLGQuZWxtKSxmPXRbLS1sXSk6KEUobykmJihvPVluKHQsYyxsKSksRShhPUkoaC5rZXkpP29baC5rZXldOlMoaCx0LGMsbCkpP3koaCxyLGUsZC5lbG0sITEsbix1KTpKbihzPXRbYV0saCk/KHgocyxoLHIsbix1KSx0W2FdPXZvaWQgMCxnJiZtLmluc2VydEJlZm9yZShlLHMuZWxtLGQuZWxtKSk6eShoLHIsZSxkLmVsbSwhMSxuLHUpKSxoPW5bKyt1XSk7bDxjP2IoZSxFKG5bcCsxXSk/bnVsbDpuW3ArMV0uZWxtLG4sdSxwLHIpOnA8dSYmayh0LGMsbCl9KGEsdSxsLG4sbyk6SShsKT8oSShlLnRleHQpJiZtLnNldFRleHRDb250ZW50KGEsIiIpLGIoYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpJKHUpP2sodSwwLHUubGVuZ3RoLTEpOkkoZS50ZXh0KSYmbS5zZXRUZXh0Q29udGVudChhLCIiKTplLnRleHQhPT10LnRleHQmJm0uc2V0VGV4dENvbnRlbnQoYSx0LnRleHQpLEkoYykmJkkocz1jLmhvb2spJiZJKHM9cy5wb3N0cGF0Y2gpJiZzKGUsdCl9fX1mdW5jdGlvbiBDKGUsdCxuKXtpZihBKG4pJiZJKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKXRbcl0uZGF0YS5ob29rLmluc2VydCh0W3JdKX12YXIgVD1zKCJhdHRycyxjbGFzcyxzdGF0aWNDbGFzcyxzdGF0aWNTdHlsZSxrZXkiKTtmdW5jdGlvbiBPKGUsdCxuLHIpe3ZhciBpLG89dC50YWcsYT10LmRhdGEscz10LmNoaWxkcmVuO2lmKHI9cnx8YSYmYS5wcmUsdC5lbG09ZSxBKHQuaXNDb21tZW50KSYmSSh0LmFzeW5jRmFjdG9yeSkpcmV0dXJuIHQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2lmKEkoYSkmJihJKGk9YS5ob29rKSYmSShpPWkuaW5pdCkmJmkodCwhMCksSShpPXQuY29tcG9uZW50SW5zdGFuY2UpKSlyZXR1cm4gcCh0LG4pLCEwO2lmKEkobykpe2lmKEkocykpaWYoZS5oYXNDaGlsZE5vZGVzKCkpaWYoSShpPWEpJiZJKGk9aS5kb21Qcm9wcykmJkkoaT1pLmlubmVySFRNTCkpe2lmKGkhPT1lLmlubmVySFRNTClyZXR1cm4hMX1lbHNle2Zvcih2YXIgYz0hMCx1PWUuZmlyc3RDaGlsZCxsPTA7bDxzLmxlbmd0aDtsKyspe2lmKCF1fHwhTyh1LHNbbF0sbixyKSl7Yz0hMTticmVha311PXUubmV4dFNpYmxpbmd9aWYoIWN8fHUpcmV0dXJuITF9ZWxzZSBoKHQscyxuKTtpZihJKGEpKXt2YXIgZD0hMTtmb3IodmFyIGYgaW4gYSlpZighVChmKSl7ZD0hMCx2KHQsbik7YnJlYWt9IWQmJmEuY2xhc3MmJnFlKGEuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXJldHVybiBmdW5jdGlvbihlLHQsbixyKXtpZighRSh0KSl7dmFyIGksbz0hMSxhPVtdO2lmKEUoZSkpbz0hMCx5KHQsYSk7ZWxzZXt2YXIgcz1JKGUubm9kZVR5cGUpO2lmKCFzJiZKbihlLHQpKXgoZSx0LGEsbnVsbCxudWxsLHIpO2Vsc2V7aWYocyl7aWYoMT09PWUubm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKEwpJiYoZS5yZW1vdmVBdHRyaWJ1dGUoTCksbj0hMCksQShuKSYmTyhlLHQsYSkpcmV0dXJuIEModCxhLCEwKSxlO2k9ZSxlPW5ldyBzZShtLnRhZ05hbWUoaSkudG9Mb3dlckNhc2UoKSx7fSxbXSx2b2lkIDAsaSl9dmFyIGM9ZS5lbG0sdT1tLnBhcmVudE5vZGUoYyk7aWYoeSh0LGEsYy5fbGVhdmVDYj9udWxsOnUsbS5uZXh0U2libGluZyhjKSksSSh0LnBhcmVudCkpZm9yKHZhciBsPXQucGFyZW50LGQ9Xyh0KTtsOyl7Zm9yKHZhciBmPTA7ZjxnLmRlc3Ryb3kubGVuZ3RoOysrZilnLmRlc3Ryb3lbZl0obCk7aWYobC5lbG09dC5lbG0sZCl7Zm9yKHZhciBwPTA7cDxnLmNyZWF0ZS5sZW5ndGg7KytwKWcuY3JlYXRlW3BdKEduLGwpO3ZhciBoPWwuZGF0YS5ob29rLmluc2VydDtpZihoLm1lcmdlZClmb3IodmFyIHY9MTt2PGguZm5zLmxlbmd0aDt2KyspaC5mbnNbdl0oKX1lbHNlIFduKGwpO2w9bC5wYXJlbnR9SSh1KT9rKFtlXSwwLDApOkkoZS50YWcpJiZ3KGUpfX1yZXR1cm4gQyh0LGEsbyksdC5lbG19SShlKSYmdyhlKX19KHtub2RlT3BzOlZuLG1vZHVsZXM6W3tjcmVhdGU6bnIsdXBkYXRlOm5yfSx7Y3JlYXRlOnJyLHVwZGF0ZTpycn0se2NyZWF0ZTpscix1cGRhdGU6bHJ9XS5jb25jYXQoW3FuLEtuXSl9KSxmcj17bW9kZWw6e30sc2hvdzp7fX07ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49IiIscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKylJKHQ9cHIoZVtyXSkpJiYiIiE9PXQmJihuJiYobis9IiAiKSxuKz10KTtyZXR1cm4gbn0oZSk6eShlKT9mdW5jdGlvbihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSllW25dJiYodCYmKHQrPSIgIiksdCs9bik7cmV0dXJuIHR9KGUpOiJzdHJpbmciPT10eXBlb2YgZT9lOiIifXZhciBocj1mKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KTtmdW5jdGlvbiB2cihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9DKGUpOiJzdHJpbmciPT10eXBlb2YgZT9ocihlKTplfWZ1bmN0aW9uIGdyKGUsdCl7b2UoKTt2YXIgbixyPXRoaXMuJG9wdGlvbnNbZV0saT1lKyIgaG9vayI7aWYocilmb3IodmFyIG89MCxhPXIubGVuZ3RoO288YTtvKyspbj1MZShyW29dLHRoaXMsdD9bdF06bnVsbCx0aGlzLGkpO3JldHVybiB0aGlzLl9oYXNIb29rRXZlbnQmJnRoaXMuJGVtaXQoImhvb2s6IitlLHQpLGFlKCksbn12YXIgbXI9e2luc3RhbGw6ZnVuY3Rpb24oZSl7ZS5wcm90b3R5cGUuXyRxdWV1ZT1VdCxlLnByb3RvdHlwZS5fX2NhbGxfaG9vaz1ncixlLnByb3RvdHlwZS5fJHN0cmluZ2lmeUNsYXNzPXByLGUucHJvdG90eXBlLl8kbm9ybWFsaXplU3R5bGVCaW5kaW5nPXZyfX07Z24uY29uZmlnLm11c3RVc2VQcm9wPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGduLmNvbmZpZy5pc1Jlc2VydmVkVGFnPXpuLGduLmNvbmZpZy5pc1Jlc2VydmVkQXR0cj1Vbixnbi5jb25maWcuZ2V0VGFnTmFtZXNwYWNlPWZ1bmN0aW9uKCl7fSxnbi5jb25maWcuaXNVbmtub3duRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiExfSx4KGduLm9wdGlvbnMuZGlyZWN0aXZlcyxmcikseChnbi5vcHRpb25zLmNvbXBvbmVudHMse30pLGduLnByb3RvdHlwZS5fX3BhdGNoX189ZHIsZ24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe2lmKCJwYWdlIj09PXRoaXMuJG9wdGlvbnMubXBUeXBlKXt2YXIgbj1uZXcgRm4odGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCk7KGU9bi5jcmVhdGVDb21tZW50KCJyb290IikpLmhhc0F0dHJpYnV0ZT1lLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbigpe30sbi5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZSl9cmV0dXJuIGk9ZSxvPXQsKHI9dGhpcykuJGVsPWksci4kb3B0aW9ucy5yZW5kZXJ8fChyLiRvcHRpb25zLnJlbmRlcj11ZSksRnQociwiYmVmb3JlTW91bnQiKSxuZXcgS3QocixmdW5jdGlvbigpe3IuX3VwZGF0ZShyLl9yZW5kZXIoKSxvKX0sVCx7YmVmb3JlOmZ1bmN0aW9uKCl7ci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJkZ0KHIsImJlZm9yZVVwZGF0ZSIpfX0sITApLG89ITEsbnVsbD09ci4kdm5vZGUmJihyLl9pc01vdW50ZWQ9ITAsci5fJHZkPyhGdChyLCJvblNlcnZpY2VDcmVhdGVkIiksRnQociwib25TZXJ2aWNlQXR0YWNoZWQiKSxyLl8kdmQuYWRkTW91bnRlZFZtKHIpKTpGdChyLCJtb3VudGVkIikpLHI7dmFyIHIsaSxvfSxnbi51c2UobXIpLGUuVnVlPWdufXZhciBpc0ZpcnN0PSEwLGZyYW1ld29ya3MscnVudGltZUNvbmZpZztmdW5jdGlvbiBpbml0JDIoZSl7aWYoZS5fX3VuaUNvbmZpZyl7dmFyIHQ9ZS53ZWV4O2lzRmlyc3QmJihnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aD10LmNvbmZpZy5lbnYuZGV2aWNlV2lkdGgpO3ZhciBuPWUuX191bmlDb25maWcscj0id2VleCI9PT1uLm52dWVDb21waWxlcjt0LmRvY3VtZW50Ll9fJGF1dG9tYXRvcl9fPSEhbi5hdXRvbWF0b3IsdC5kb2N1bWVudC5fXyRjb21waWxlcl9fPXI/IndlZXgiOiJ1bmktYXBwIix0LmRvY3VtZW50Ll9fJHN0eWxlQ29tcGlsZXJfXz0id2VleCI9PT1uLm52dWVTdHlsZUNvbXBpbGVyPyJ3ZWV4IjoidW5pLWFwcCIsZ2xvYmFsLldYRW52aXJvbm1lbnQuZHluYW1pY1JweD0hKCFuLndpbmRvd3x8IW4ud2luZG93LmR5bmFtaWNScHgpO3ZhciBpPSJuYXRpdmUiIT09bi5yZW5kZXJlciYmLTEhPT10LmNvbmZpZy5idW5kbGVVcmwuaW5kZXhPZigiYXBwLXNlcnZpY2UuanMiKTtpZihpKXt2YXIgbz17fTt2dWVGYWN0b3J5KG8sZS5TaGFyZWRPYmplY3QpLGUuVnVlPW8uVnVlfWlmKE9iamVjdC5hc3NpZ24oZSxjcmVhdGVJbnN0YW5jZUNvbnRleHQkMShlKSksaSYmZS5WdWUudXNlKGUuX192dWVQbHVnaW4pLGRlbGV0ZSBlLl9fdnVlUGx1Z2luLCFyKXt2YXIgYT1lLnBsdXM7aWYoImlvcyI9PT1nbG9iYWwuV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpKXt2YXIgcz1hLnNjcmVlbjtnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aD1zLndpZHRoLGdsb2JhbC5XWEVudmlyb25tZW50LmRldmljZUhlaWdodD1zLmhlaWdodH12YXIgYz1nbG9iYWwuV1hFbnZpcm9ubWVudCx1PWMuc2NhbGUsbD1jLmRldmljZVdpZHRoLGQ9Yy5wbGF0Zm9ybSxmPU1hdGguY2VpbChsL3UpLHA9dC5yZXF1aXJlTW9kdWxlKCJtZXRhIik7aWYoIjEiPT09dC5jb25maWcucGx1c193ZWJfaWQpe3ZhciBoPXQucmVxdWlyZU1vZHVsZSgicGx1cyIpO2guc2V0RGVmYXVsdEZvbnRTaXplJiZoLnNldERlZmF1bHRGb250U2l6ZSgxNil9ImlvcyI9PT1kLnRvTG93ZXJDYXNlKCkmJnAuc2V0Vmlld3BvcnQoe3dpZHRoOmYscm91bmRPZmZEZXZpYXRpb246ITF9KX1pfHxlLlZ1ZS51c2UodW5pQXBwLGUpfX1mdW5jdGlvbiBnZXRKU0ZNVmVyc2lvbigpe3JldHVybiIwLjI5LjYifWZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VzKGksbyxhKXt2YXIgcz1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBzLnNlcnZpY2U9T2JqZWN0LmNyZWF0ZShudWxsKSxzZXJ2aWNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZSxuPWUub3B0aW9ucy5jcmVhdGU7aWYobil0cnl7dmFyIHI9bihpLG8sYSk7T2JqZWN0LmFzc2lnbihzLnNlcnZpY2UsciksT2JqZWN0LmFzc2lnbihzLHIuaW5zdGFuY2UpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIltKUyBSdW50aW1lXSBGYWlsZWQgdG8gY3JlYXRlIHNlcnZpY2UgIit0KyIuIil9fSksZGVsZXRlIHMuc2VydmljZS5pbnN0YW5jZSxPYmplY3QuZnJlZXplKHMuc2VydmljZSksc312YXIgaW5zdGFuY2VUeXBlTWFwPXt9O2Z1bmN0aW9uIGdldEZyYW1ld29ya1R5cGUoZSl7cmV0dXJuIGluc3RhbmNlVHlwZU1hcFtlXX12YXIgU2hhcmVkT2JqZWN0PXt1aWQ6MH07ZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsdCxuKXt2b2lkIDA9PT10JiYodD17fSk7dmFyIHI9bmV3IFdlZXhJbnN0YW5jZShlLHQsbik7aW5zdGFuY2VUeXBlTWFwW2VdPSJWdWUiO3ZhciBpPXJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrcy5WdWU7aWYoIWkpcmV0dXJuIG5ldyBFcnJvcignW0pTIEZyYW1ld29ya10gSW52YWxpZCBidW5kbGUgdHlwZSAiVnVlIi4nKTt2YXIgbz1jcmVhdGVTZXJ2aWNlcyhlLHt3ZWV4OnIsY29uZmlnOnQsY3JlYXRlZDpEYXRlLm5vdygpLGZyYW1ld29yazoiVnVlIixidW5kbGVUeXBlOiJWdWUifSxydW50aW1lQ29uZmlnKTtPYmplY3QuZnJlZXplKG8pO3ZhciBhPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmFzc2lnbihhLG8se1NoYXJlZE9iamVjdDpTaGFyZWRPYmplY3Qsd2VleDpyLGdldEpTRk1WZXJzaW9uOmdldEpTRk1WZXJzaW9uLHJlcXVpcmVNb2R1bGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHIucmVxdWlyZU1vZHVsZS5hcHBseShyLGUpfSxfX1dFRVhfQ0FMTF9KQVZBU0NSSVBUX186cmVjZWl2ZVRhc2tzLHNlcnZpY2VzOm99KSxPYmplY3QuZnJlZXplKGEpO3ZhciBzPU9iamVjdC5hc3NpZ24oe30sYSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGkuY3JlYXRlSW5zdGFuY2VDb250ZXh0JiZPYmplY3QuYXNzaWduKHMsaS5jcmVhdGVJbnN0YW5jZUNvbnRleHQoZSxhLG4pKSxpbml0JDIocyksT2JqZWN0LmZyZWV6ZShzKSxzfWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGUsdCxuLHIpe2lmKGluc3RhbmNlVHlwZU1hcFtlXSlyZXR1cm4gbmV3IEVycm9yKCdUaGUgaW5zdGFuY2UgaWQgIicrZSsnIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQhJyk7dmFyIGk9IlZ1ZSI7aW5zdGFuY2VUeXBlTWFwW2VdPWksKG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShufHx7fSkpKS5lbnY9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnbG9iYWwuV1hFbnZpcm9ubWVudHx8e30pKSxuLmJ1bmRsZVR5cGU9aTt2YXIgbz1ydW50aW1lQ29uZmlnLmZyYW1ld29ya3MuVnVlO2lmKCFvKXJldHVybiBuZXcgRXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEludmFsaWQgYnVuZGxlIHR5cGUgIlZ1ZSIuJyk7dmFyIGE9Y3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsbixyKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygby5jcmVhdGVJbnN0YW5jZSlyZXR1cm4gby5jcmVhdGVJbnN0YW5jZShlLHQsbixyLGEpO3J1bkluQ29udGV4dCh0LGEpfWZ1bmN0aW9uIHJ1bkluQ29udGV4dChlLHQpe3ZhciBuPVtdLHI9W107Zm9yKHZhciBpIGluIHQpbi5wdXNoKGkpLHIucHVzaCh0W2ldKTt2YXIgbz0iXG4gICAgKGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICAgICIrZSsiXG4gICAgfSkoT2JqZWN0LmNyZWF0ZSh0aGlzKSlcbiAgIjtyZXR1cm4obmV3KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KEZ1bmN0aW9uLFtudWxsXS5jb25jYXQobixbb10pKSkpLmFwcGx5KHZvaWQgMCxyKX1mdW5jdGlvbiBnZXRSb290KGUpe3ZhciB0PWdldERvYyhlKTt0cnl7aWYodCYmdC5ib2R5KXJldHVybiB0LmJvZHkudG9KU09OKCl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGdldCB0aGUgdmlydHVhbCBkb20gdHJlZS4iKX19dmFyIG1ldGhvZHM9e2NyZWF0ZUluc3RhbmNlOmNyZWF0ZUluc3RhbmNlLGNyZWF0ZUluc3RhbmNlQ29udGV4dDpjcmVhdGVJbnN0YW5jZUNvbnRleHQsZ2V0Um9vdDpnZXRSb290LGdldEpTRk1WZXJzaW9uOmdldEpTRk1WZXJzaW9uLGdldERvY3VtZW50OmdldERvYyxyZWdpc3RlclNlcnZpY2U6cmVnaXN0ZXIsdW5yZWdpc3RlclNlcnZpY2U6dW5yZWdpc3RlcixjYWxsSlM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1mcmFtZXdvcmtzW2dldEZyYW1ld29ya1R5cGUoZSldO3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5yZWNlaXZlVGFza3M/bi5yZWNlaXZlVGFza3MoZSx0KTpyZWNlaXZlVGFza3MoZSx0KX19O2Z1bmN0aW9uIGdlbkluc3RhbmNlKHMpe21ldGhvZHNbc109ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG4scj1lWzBdLGk9Z2V0RnJhbWV3b3JrVHlwZShyKTtpZihpJiZmcmFtZXdvcmtzW2ldKXt2YXIgbz0obj1mcmFtZXdvcmtzW2ldKVtzXS5hcHBseShuLGUpLGE9e2ZyYW1ld29yazppfTtyZXR1cm4icmVmcmVzaEluc3RhbmNlIj09PXM/c2VydmljZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucmVmcmVzaDt0JiZ0KHIse2luZm86YSxydW50aW1lOnJ1bnRpbWVDb25maWd9KX0pOiJkZXN0cm95SW5zdGFuY2UiPT09cyYmKHNlcnZpY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmRlc3Ryb3k7dCYmdChyLHtpbmZvOmEscnVudGltZTpydW50aW1lQ29uZmlnfSl9KSxkZWxldGUgaW5zdGFuY2VUeXBlTWFwW3JdKSxvfX19ZnVuY3Rpb24gYWRhcHRNZXRob2QoaSxvKXttZXRob2RzW2ldPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2Zvcih2YXIgbiBpbiJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvLmFwcGx5KHZvaWQgMCxlKSxydW50aW1lQ29uZmlnLmZyYW1ld29ya3Mpe3ZhciByPXJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrc1tuXTtyJiZyW2ldJiZyW2ldLmFwcGx5KHIsZSl9fX1mdW5jdGlvbiBpbml0JCQxKGUpe2Zvcih2YXIgdCBpbiBmcmFtZXdvcmtzPShydW50aW1lQ29uZmlnPWV8fHt9KS5mcmFtZXdvcmtzfHx7fSxpbml0JDEoKSxmcmFtZXdvcmtzKXt2YXIgbj1mcmFtZXdvcmtzW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuLmluaXQpdHJ5e24uaW5pdChlKX1jYXRjaChlKXt9fXJldHVybiBhZGFwdE1ldGhvZCgicmVnaXN0ZXJDb21wb25lbnRzIixyZWdpc3RlckNvbXBvbmVudHMpLGFkYXB0TWV0aG9kKCJyZWdpc3Rlck1vZHVsZXMiLHJlZ2lzdGVyTW9kdWxlcyksYWRhcHRNZXRob2QoInJlZ2lzdGVyTWV0aG9kcyIpLFsiZGVzdHJveUluc3RhbmNlIiwicmVmcmVzaEluc3RhbmNlIl0uZm9yRWFjaChnZW5JbnN0YW5jZSksbWV0aG9kc312YXIgY29uZmlnPXtEb2N1bWVudDpEb2N1bWVudCxFbGVtZW50OkVsZW1lbnQsQ29tbWVudDpDb21tZW50LExpc3RlbmVyOkxpc3RlbmVyLFRhc2tDZW50ZXI6VGFza0NlbnRlcixzZW5kVGFza3M6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGNhbGxOYXRpdmU/Y2FsbE5hdGl2ZS5hcHBseSh2b2lkIDAsZSk6KGdsb2JhbC5jYWxsTmF0aXZlfHxmdW5jdGlvbigpe30pLmFwcGx5KHZvaWQgMCxlKX19O2Z1bmN0aW9uIGZyZWV6ZVByb3RvdHlwZSgpe09iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQpLE9iamVjdC5mcmVlemUoY29uZmlnLkxpc3RlbmVyKSxPYmplY3QuZnJlZXplKGNvbmZpZy5Eb2N1bWVudC5wcm90b3R5cGUpLE9iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQucHJvdG90eXBlKSxPYmplY3QuZnJlZXplKGNvbmZpZy5MaXN0ZW5lci5wcm90b3R5cGUpfURvY3VtZW50LmhhbmRsZXI9Y29uZmlnLnNlbmRUYXNrczt2YXIgcnVudGltZT17c2VydmljZTp7cmVnaXN0ZXI6cmVnaXN0ZXIsdW5yZWdpc3Rlcjp1bnJlZ2lzdGVyLGhhczpoYXN9LGZyZWV6ZVByb3RvdHlwZTpmcmVlemVQcm90b3R5cGUsaW5pdDppbml0JCQxLGNvbmZpZzpjb25maWd9O2Z1bmN0aW9uIE1lc3NhZ2VFdmVudChlLHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLnR5cGU9ZXx8Im1lc3NhZ2UiLHRoaXMuZGF0YT10LmRhdGF8fG51bGwsdGhpcy5vcmlnaW49dC5vcmlnaW58fCIiLHRoaXMuc291cmNlPXQuc291cmNlfHxudWxsLHRoaXMucG9ydHM9dC5wb3J0c3x8W10sdGhpcy50YXJnZXQ9bnVsbCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfXZhciBjaGFubmVscz17fSxpbnN0YW5jZXM9e307ZnVuY3Rpb24gQnJvYWRjYXN0Q2hhbm5lbCQxKCl7fUJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUucG9zdE1lc3NhZ2U9ZnVuY3Rpb24oZSl7aWYodGhpcy5fY2xvc2VkKXRocm93IG5ldyBFcnJvcignQnJvYWRjYXN0Q2hhbm5lbCAiJyt0aGlzLm5hbWUrJyIgaXMgY2xvc2VkLicpO3ZhciB0PWNoYW5uZWxzW3RoaXMubmFtZV07aWYodCYmdC5sZW5ndGgpZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciByPXRbbl07ci5fY2xvc2VkfHxyPT09dGhpc3x8ImZ1bmN0aW9uIj09dHlwZW9mIHIub25tZXNzYWdlJiZyLm9ubWVzc2FnZShuZXcgTWVzc2FnZUV2ZW50KCJtZXNzYWdlIix7ZGF0YTplfSkpfX0sQnJvYWRjYXN0Q2hhbm5lbCQxLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2Nsb3NlZCYmKHRoaXMuX2Nsb3NlZD0hMCxjaGFubmVsc1t0aGlzLm5hbWVdKSl7dmFyIGU9Y2hhbm5lbHNbdGhpcy5uYW1lXS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10fSk7ZS5sZW5ndGg/Y2hhbm5lbHNbdGhpcy5uYW1lXT1lOmRlbGV0ZSBjaGFubmVsc1t0aGlzLm5hbWVdfX07dmFyIEJyb2FkY2FzdENoYW5uZWwkMj17Y3JlYXRlOmZ1bmN0aW9uKHQsZSxuKXtpZihpbnN0YW5jZXNbdF09W10sImZ1bmN0aW9uIj09dHlwZW9mIGdsb2JhbC5Ccm9hZGNhc3RDaGFubmVsKXJldHVybnt9O3ZhciByPXtCcm9hZGNhc3RDaGFubmVsOmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITEsdmFsdWU6U3RyaW5nKGUpfSksdGhpcy5fY2xvc2VkPSExLHRoaXMub25tZXNzYWdlPW51bGwsY2hhbm5lbHNbdGhpcy5uYW1lXXx8KGNoYW5uZWxzW3RoaXMubmFtZV09W10pLGNoYW5uZWxzW3RoaXMubmFtZV0ucHVzaCh0aGlzKSxpbnN0YW5jZXNbdF0ucHVzaCh0aGlzKX19O3JldHVybiByLkJyb2FkY2FzdENoYW5uZWwucHJvdG90eXBlPUJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUse2luc3RhbmNlOnJ9fSxkZXN0cm95OmZ1bmN0aW9uKGUsdCl7aW5zdGFuY2VzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2UoKX0pLGRlbGV0ZSBpbnN0YW5jZXNbZV19fSxzZXJ2aWNlcyQxPXtCcm9hZGNhc3RDaGFubmVsOkJyb2FkY2FzdENoYW5uZWwkMn0sQlhiLENYYixFWGIsRlhiO2Z1bmN0aW9uIHNldHVwKGUpe3ZhciB0PXJ1bnRpbWUuaW5pdCxuPXJ1bnRpbWUuY29uZmlnO24uZnJhbWV3b3Jrcz1lO3ZhciByPXN1YnZlcnNpb24ubmF0aXZlLGk9c3VidmVyc2lvbi50cmFuc2Zvcm1lcjtmb3IodmFyIG8gaW4gc2VydmljZXMkMSlydW50aW1lLnNlcnZpY2UucmVnaXN0ZXIobyxzZXJ2aWNlcyQxW29dKTtydW50aW1lLmZyZWV6ZVByb3RvdHlwZSgpLGdsb2JhbC5mcmFtZXdvcmtWZXJzaW9uPXIsZ2xvYmFsLnRyYW5zZm9ybWVyVmVyc2lvbj1pO3ZhciBhPXQobikscz1mdW5jdGlvbihyKXtnbG9iYWxbcl09ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG49YVtyXS5hcHBseShhLGUpO3JldHVybiBuIGluc3RhbmNlb2YgRXJyb3ImJmNvbnNvbGUuZXJyb3Iobi50b1N0cmluZygpKSxufX07Zm9yKHZhciBjIGluIGEpcyhjKX1mdW5jdGlvbiB1bndyYXBFeHBvcnRzKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZSx0KXtyZXR1cm4gZSh0PXtleHBvcnRzOnt9fSx0LmV4cG9ydHMpLHQuZXhwb3J0c31BcnJheS5mcm9tfHwoQXJyYXkuZnJvbT0oQlhiPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsQ1hiPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfHwiW29iamVjdCBGdW5jdGlvbl0iPT09QlhiLmNhbGwoZSl9LEVYYj1NYXRoLnBvdygyLDUzKS0xLEZYYj1mdW5jdGlvbihlKXt2YXIgdCxuPSh0PU51bWJlcihlKSxpc05hTih0KT8wOjAhPT10JiZpc0Zpbml0ZSh0KT8oMDx0PzE6LTEpKk1hdGguZmxvb3IoTWF0aC5hYnModCkpOnQpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChuLDApLEVYYil9LGZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdChlKTtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LmZyb20gcmVxdWlyZXMgYW4gYXJyYXktbGlrZSBvYmplY3QgLSBub3QgbnVsbCBvciB1bmRlZmluZWQiKTt2YXIgbixyPTE8YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMV06dm9pZCAwO2lmKHZvaWQgMCE9PXIpe2lmKCFDWGIocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24iKTsyPGFyZ3VtZW50cy5sZW5ndGgmJihuPWFyZ3VtZW50c1syXSl9Zm9yKHZhciBpLG89RlhiKHQubGVuZ3RoKSxhPUNYYih0aGlzKT9PYmplY3QobmV3IHRoaXMobykpOm5ldyBBcnJheShvKSxzPTA7czxvOylpPXRbc10sYVtzXT1yP3ZvaWQgMD09PW4/cihpLHMpOnIuY2FsbChuLGkscyk6aSxzKz0xO3JldHVybiBhLmxlbmd0aD1vLGF9KSk7dmFyIF9nbG9iYWw9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOyJudW1iZXIiPT10eXBlb2YgX19nJiYoX19nPXQpfSksX2NvcmU9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5leHBvcnRzPXt2ZXJzaW9uOiIyLjUuNyJ9OyJudW1iZXIiPT10eXBlb2YgX19lJiYoX19lPXQpfSksX2NvcmVfMT1fY29yZS52ZXJzaW9uLF9pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/bnVsbCE9PWU6ImZ1bmN0aW9uIj09dHlwZW9mIGV9LF9hbk9iamVjdD1mdW5jdGlvbihlKXtpZighX2lzT2JqZWN0KGUpKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGFuIG9iamVjdCEiKTtyZXR1cm4gZX0sX2ZhaWxzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4hIWUoKX1jYXRjaChlKXtyZXR1cm4hMH19LF9kZXNjcmlwdG9ycz0hX2ZhaWxzKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSxkb2N1bWVudCQxPV9nbG9iYWwuZG9jdW1lbnQsaXM9X2lzT2JqZWN0KGRvY3VtZW50JDEpJiZfaXNPYmplY3QoZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KSxfZG9tQ3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBpcz9kb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoZSk6e319LF9pZThEb21EZWZpbmU9IV9kZXNjcmlwdG9ycyYmIV9mYWlscyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoX2RvbUNyZWF0ZSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSksX3RvUHJpbWl0aXZlPWZ1bmN0aW9uKGUsdCl7aWYoIV9pc09iamVjdChlKSlyZXR1cm4gZTt2YXIgbixyO2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUudG9TdHJpbmcpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjtpZigiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnZhbHVlT2YpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjtpZighdCYmImZ1bmN0aW9uIj09dHlwZW9mKG49ZS50b1N0cmluZykmJiFfaXNPYmplY3Qocj1uLmNhbGwoZSkpKXJldHVybiByO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9LGRQPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxmPV9kZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4pe2lmKF9hbk9iamVjdChlKSx0PV90b1ByaW1pdGl2ZSh0LCEwKSxfYW5PYmplY3QobiksX2llOERvbURlZmluZSl0cnl7cmV0dXJuIGRQKGUsdCxuKX1jYXRjaChlKXt9aWYoImdldCJpbiBufHwic2V0ImluIG4pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEiKTtyZXR1cm4idmFsdWUiaW4gbiYmKGVbdF09bi52YWx1ZSksZX0sX29iamVjdERwPXtmOmZ9LF9wcm9wZXJ0eURlc2M9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZW51bWVyYWJsZTohKDEmZSksY29uZmlndXJhYmxlOiEoMiZlKSx3cml0YWJsZTohKDQmZSksdmFsdWU6dH19LF9oaWRlPV9kZXNjcmlwdG9ycz9mdW5jdGlvbihlLHQsbil7cmV0dXJuIF9vYmplY3REcC5mKGUsdCxfcHJvcGVydHlEZXNjKDEsbikpfTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbdF09bixlfSxoYXNPd25Qcm9wZXJ0eT17fS5oYXNPd25Qcm9wZXJ0eSxfaGFzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZSx0KX0saWQ9MCxweD1NYXRoLnJhbmRvbSgpLF91aWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIlN5bWJvbCgiLmNvbmNhdCh2b2lkIDA9PT1lPyIiOmUsIilfIiwoKytpZCtweCkudG9TdHJpbmcoMzYpKX0sX3JlZGVmaW5lPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciBvPV91aWQoInNyYyIpLHQ9InRvU3RyaW5nIixuPUZ1bmN0aW9uW3RdLGE9KCIiK24pLnNwbGl0KHQpO19jb3JlLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbChlKX0sKGUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgbjtpJiYoX2hhcyhuLCJuYW1lIil8fF9oaWRlKG4sIm5hbWUiLHQpKSxlW3RdIT09biYmKGkmJihfaGFzKG4sbyl8fF9oaWRlKG4sbyxlW3RdPyIiK2VbdF06YS5qb2luKFN0cmluZyh0KSkpKSxlPT09X2dsb2JhbD9lW3RdPW46cj9lW3RdP2VbdF09bjpfaGlkZShlLHQsbik6KGRlbGV0ZSBlW3RdLF9oaWRlKGUsdCxuKSkpfSkoRnVuY3Rpb24ucHJvdG90eXBlLHQsZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdGhpc1tvXXx8bi5jYWxsKHRoaXMpfSl9KSxfYUZ1bmN0aW9uPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGEgZnVuY3Rpb24hIik7cmV0dXJuIGV9LF9jdHg9ZnVuY3Rpb24ocixpLGUpe2lmKF9hRnVuY3Rpb24ociksdm9pZCAwPT09aSlyZXR1cm4gcjtzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gci5jYWxsKGksZSl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5jYWxsKGksZSx0KX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuY2FsbChpLGUsdCxuKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHIuYXBwbHkoaSxhcmd1bWVudHMpfX0sUFJPVE9UWVBFPSJwcm90b3R5cGUiLCRleHBvcnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZSYkZXhwb3J0LkYsYz1lJiRleHBvcnQuRyx1PWUmJGV4cG9ydC5TLGw9ZSYkZXhwb3J0LlAsZD1lJiRleHBvcnQuQixmPWM/X2dsb2JhbDp1P19nbG9iYWxbdF18fChfZ2xvYmFsW3RdPXt9KTooX2dsb2JhbFt0XXx8e30pW1BST1RPVFlQRV0scD1jP19jb3JlOl9jb3JlW3RdfHwoX2NvcmVbdF09e30pLGg9cFtQUk9UT1RZUEVdfHwocFtQUk9UT1RZUEVdPXt9KTtmb3IociBpbiBjJiYobj10KSxuKW89KChpPSFzJiZmJiZ2b2lkIDAhPT1mW3JdKT9mOm4pW3JdLGE9ZCYmaT9fY3R4KG8sX2dsb2JhbCk6bCYmImZ1bmN0aW9uIj09dHlwZW9mIG8/X2N0eChGdW5jdGlvbi5jYWxsLG8pOm8sZiYmX3JlZGVmaW5lKGYscixvLGUmJGV4cG9ydC5VKSxwW3JdIT1vJiZfaGlkZShwLHIsYSksbCYmaFtyXSE9byYmKGhbcl09byl9O19nbG9iYWwuY29yZT1fY29yZSwkZXhwb3J0LkY9MSwkZXhwb3J0Lkc9MiwkZXhwb3J0LlM9NCwkZXhwb3J0LlA9OCwkZXhwb3J0LkI9MTYsJGV4cG9ydC5XPTMyLCRleHBvcnQuVT02NCwkZXhwb3J0LlI9MTI4O3ZhciBfZXhwb3J0PSRleHBvcnQsdG9TdHJpbmckMT17fS50b1N0cmluZyxfY29mPWZ1bmN0aW9uKGUpe3JldHVybiB0b1N0cmluZyQxLmNhbGwoZSkuc2xpY2UoOCwtMSl9LF9pb2JqZWN0PU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApP09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09X2NvZihlKT9lLnNwbGl0KCIiKTpPYmplY3QoZSl9LF9kZWZpbmVkPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIitlKTtyZXR1cm4gZX0sX3RvSW9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gX2lvYmplY3QoX2RlZmluZWQoZSkpfSxjZWlsPU1hdGguY2VpbCxmbG9vcj1NYXRoLmZsb29yLF90b0ludGVnZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGlzTmFOKGU9K2UpPzA6KDA8ZT9mbG9vcjpjZWlsKShlKX0sbWluPU1hdGgubWluLF90b0xlbmd0aD1mdW5jdGlvbihlKXtyZXR1cm4gMDxlP21pbihfdG9JbnRlZ2VyKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9LG1heD1NYXRoLm1heCxtaW4kMT1NYXRoLm1pbixfdG9BYnNvbHV0ZUluZGV4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGU9X3RvSW50ZWdlcihlKSk8MD9tYXgoZSt0LDApOm1pbiQxKGUsdCl9LF9hcnJheUluY2x1ZGVzPWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1fdG9Jb2JqZWN0KGUpLG89X3RvTGVuZ3RoKGkubGVuZ3RoKSxhPV90b0Fic29sdXRlSW5kZXgobixvKTtpZihzJiZ0IT10KXtmb3IoO2E8bzspaWYoKHI9aVthKytdKSE9cilyZXR1cm4hMH1lbHNlIGZvcig7YTxvO2ErKylpZigoc3x8YSBpbiBpKSYmaVthXT09PXQpcmV0dXJuIHN8fGF8fDA7cmV0dXJuIXMmJi0xfX0sX2xpYnJhcnk9ITEsX3NoYXJlZD1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgdD0iX19jb3JlLWpzX3NoYXJlZF9fIixuPV9nbG9iYWxbdF18fChfZ2xvYmFsW3RdPXt9KTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5bZV18fChuW2VdPXZvaWQgMCE9PXQ/dDp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOl9jb3JlLnZlcnNpb24sbW9kZTpfbGlicmFyeT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE4IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSksc2hhcmVkJDI9X3NoYXJlZCgia2V5cyIpLF9zaGFyZWRLZXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHNoYXJlZCQyW2VdfHwoc2hhcmVkJDJbZV09X3VpZChlKSl9LGFycmF5SW5kZXhPZj1fYXJyYXlJbmNsdWRlcyghMSksSUVfUFJPVE89X3NoYXJlZEtleSgiSUVfUFJPVE8iKSxfb2JqZWN0S2V5c0ludGVybmFsPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1fdG9Jb2JqZWN0KGUpLGk9MCxvPVtdO2ZvcihuIGluIHIpbiE9SUVfUFJPVE8mJl9oYXMocixuKSYmby5wdXNoKG4pO2Zvcig7dC5sZW5ndGg+aTspX2hhcyhyLG49dFtpKytdKSYmKH5hcnJheUluZGV4T2YobyxuKXx8by5wdXNoKG4pKTtyZXR1cm4gb30sX2VudW1CdWdLZXlzPSJjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YiLnNwbGl0KCIsIiksX29iamVjdEtleXM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3JldHVybiBfb2JqZWN0S2V5c0ludGVybmFsKGUsX2VudW1CdWdLZXlzKX0sZiQxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsX29iamVjdEdvcHM9e2Y6ZiQxfSxmJDI9e30ucHJvcGVydHlJc0VudW1lcmFibGUsX29iamVjdFBpZT17ZjpmJDJ9LF90b09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KF9kZWZpbmVkKGUpKX0sJGFzc2lnbj1PYmplY3QuYXNzaWduLF9vYmplY3RBc3NpZ249ISRhc3NpZ258fF9mYWlscyhmdW5jdGlvbigpe3ZhciBlPXt9LHQ9e30sbj1TeW1ib2woKSxyPSJhYmNkZWZnaGlqa2xtbm9wcXJzdCI7cmV0dXJuIGVbbl09NyxyLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09ZX0pLDchPSRhc3NpZ24oe30sZSlbbl18fE9iamVjdC5rZXlzKCRhc3NpZ24oe30sdCkpLmpvaW4oIiIpIT1yfSk/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49YXJndW1lbnRzLHI9X3RvT2JqZWN0KGUpLGk9YXJndW1lbnRzLmxlbmd0aCxvPTEsYT1fb2JqZWN0R29wcy5mLHM9X29iamVjdFBpZS5mO288aTspZm9yKHZhciBjLHU9X2lvYmplY3QobltvKytdKSxsPWE/X29iamVjdEtleXModSkuY29uY2F0KGEodSkpOl9vYmplY3RLZXlzKHUpLGQ9bC5sZW5ndGgsZj0wO2Y8ZDspcy5jYWxsKHUsYz1sW2YrK10pJiYocltjXT11W2NdKTtyZXR1cm4gcn06JGFzc2lnbjtfZXhwb3J0KF9leHBvcnQuUytfZXhwb3J0LkYsIk9iamVjdCIse2Fzc2lnbjpfb2JqZWN0QXNzaWdufSk7dmFyIGFzc2lnbj1fY29yZS5PYmplY3QuYXNzaWduO09iamVjdC5zZXRQcm90b3R5cGVPZnx8KE9iamVjdC5zZXRQcm90b3R5cGVPZj1mdW5jdGlvbih0LG4pe3ZhciByO2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4gci5jYWxsKGUsdCksZX10cnl7KHI9dC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodC5wcm90b3R5cGUsbikuc2V0KS5jYWxsKHt9LG51bGwpfWNhdGNoKGUpe2lmKHQucHJvdG90eXBlIT09e31bbl0pcmV0dXJuO3I9ZnVuY3Rpb24oZSl7dGhpc1tuXT1lfSxpLnBvbHlmaWxsPWkoaSh7fSxudWxsKSx0LnByb3RvdHlwZSlpbnN0YW5jZW9mIHR9cmV0dXJuIGl9KE9iamVjdCwiX19wcm90b19fIikpO3ZhciBXWEVudmlyb25tZW50JDE9Z2xvYmFsLldYRW52aXJvbm1lbnQ7dm9pZCAwPT09V1hFbnZpcm9ubWVudCQxfHwiaU9TIiE9PVdYRW52aXJvbm1lbnQkMS5wbGF0Zm9ybXx8V1hFbnZpcm9ubWVudCQxLl9fZW5hYmxlX25hdGl2ZV9wcm9taXNlX198fChnbG9iYWwuUHJvbWlzZT12b2lkIDApO3ZhciBfd2tzPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PV9zaGFyZWQoIndrcyIpLG49X2dsb2JhbC5TeW1ib2wscj0iZnVuY3Rpb24iPT10eXBlb2YgbjsoZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfHwodFtlXT1yJiZuW2VdfHwocj9uOl91aWQpKCJTeW1ib2wuIitlKSl9KS5zdG9yZT10fSksVEFHPV93a3MoInRvU3RyaW5nVGFnIiksQVJHPSJBcmd1bWVudHMiPT1fY29mKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSksdHJ5R2V0PWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBlW3RdfWNhdGNoKGUpe319LF9jbGFzc29mPWZ1bmN0aW9uKGUpe3ZhciB0LG4scjtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPXRyeUdldCh0PU9iamVjdChlKSxUQUcpKT9uOkFSRz9fY29mKHQpOiJPYmplY3QiPT0ocj1fY29mKHQpKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY2FsbGVlPyJBcmd1bWVudHMiOnJ9LHRlc3Q9e307dGVzdFtfd2tzKCJ0b1N0cmluZ1RhZyIpXT0ieiIsdGVzdCsiIiE9IltvYmplY3Qgel0iJiZfcmVkZWZpbmUoT2JqZWN0LnByb3RvdHlwZSwidG9TdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIitfY2xhc3NvZih0aGlzKSsiXSJ9LCEwKTt2YXIgX3N0cmluZ0F0PWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1TdHJpbmcoX2RlZmluZWQoZSkpLG89X3RvSW50ZWdlcih0KSxhPWkubGVuZ3RoO3JldHVybiBvPDB8fGE8PW8/cz8iIjp2b2lkIDA6KG49aS5jaGFyQ29kZUF0KG8pKTw1NTI5Nnx8NTYzMTk8bnx8bysxPT09YXx8KHI9aS5jaGFyQ29kZUF0KG8rMSkpPDU2MzIwfHw1NzM0MzxyP3M/aS5jaGFyQXQobyk6bjpzP2kuc2xpY2UobyxvKzIpOnItNTYzMjArKG4tNTUyOTY8PDEwKSs2NTUzNn19LF9pdGVyYXRvcnM9e30sX29iamVjdERwcz1fZGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24oZSx0KXtfYW5PYmplY3QoZSk7Zm9yKHZhciBuLHI9X29iamVjdEtleXModCksaT1yLmxlbmd0aCxvPTA7bzxpOylfb2JqZWN0RHAuZihlLG49cltvKytdLHRbbl0pO3JldHVybiBlfSxkb2N1bWVudCQyPV9nbG9iYWwuZG9jdW1lbnQsX2h0bWw9ZG9jdW1lbnQkMiYmZG9jdW1lbnQkMi5kb2N1bWVudEVsZW1lbnQsSUVfUFJPVE8kMT1fc2hhcmVkS2V5KCJJRV9QUk9UTyIpLEVtcHR5PWZ1bmN0aW9uKCl7fSxQUk9UT1RZUEUkMT0icHJvdG90eXBlIixjcmVhdGVEaWN0PWZ1bmN0aW9uKCl7dmFyIGUsdD1fZG9tQ3JlYXRlKCJpZnJhbWUiKSxuPV9lbnVtQnVnS2V5cy5sZW5ndGg7Zm9yKHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsX2h0bWwuYXBwZW5kQ2hpbGQodCksdC5zcmM9ImphdmFzY3JpcHQ6IiwoZT10LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSxlLndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFwvc2NyaXB0PiIpLGUuY2xvc2UoKSxjcmVhdGVEaWN0PWUuRjtuLS07KWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRSQxXVtfZW51bUJ1Z0tleXNbbl1dO3JldHVybiBjcmVhdGVEaWN0KCl9LF9vYmplY3RDcmVhdGU9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gbnVsbCE9PWU/KEVtcHR5W1BST1RPVFlQRSQxXT1fYW5PYmplY3QoZSksbj1uZXcgRW1wdHksRW1wdHlbUFJPVE9UWVBFJDFdPW51bGwsbltJRV9QUk9UTyQxXT1lKTpuPWNyZWF0ZURpY3QoKSx2b2lkIDA9PT10P246X29iamVjdERwcyhuLHQpfSxkZWY9X29iamVjdERwLmYsVEFHJDE9X3drcygidG9TdHJpbmdUYWciKSxfc2V0VG9TdHJpbmdUYWc9ZnVuY3Rpb24oZSx0LG4pe2UmJiFfaGFzKGU9bj9lOmUucHJvdG90eXBlLFRBRyQxKSYmZGVmKGUsVEFHJDEse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTp0fSl9LEl0ZXJhdG9yUHJvdG90eXBlPXt9O19oaWRlKEl0ZXJhdG9yUHJvdG90eXBlLF93a3MoIml0ZXJhdG9yIiksZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBfaXRlckNyZWF0ZT1mdW5jdGlvbihlLHQsbil7ZS5wcm90b3R5cGU9X29iamVjdENyZWF0ZShJdGVyYXRvclByb3RvdHlwZSx7bmV4dDpfcHJvcGVydHlEZXNjKDEsbil9KSxfc2V0VG9TdHJpbmdUYWcoZSx0KyIgSXRlcmF0b3IiKX0sSUVfUFJPVE8kMj1fc2hhcmVkS2V5KCJJRV9QUk9UTyIpLE9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGUsX29iamVjdEdwbz1PYmplY3QuZ2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGUpe3JldHVybiBlPV90b09iamVjdChlKSxfaGFzKGUsSUVfUFJPVE8kMik/ZVtJRV9QUk9UTyQyXToiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3RvciYmZSBpbnN0YW5jZW9mIGUuY29uc3RydWN0b3I/ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6ZSBpbnN0YW5jZW9mIE9iamVjdD9PYmplY3RQcm90bzpudWxsfSxJVEVSQVRPUj1fd2tzKCJpdGVyYXRvciIpLEJVR0dZPSEoW10ua2V5cyYmIm5leHQiaW5bXS5rZXlzKCkpLEZGX0lURVJBVE9SPSJAQGl0ZXJhdG9yIixLRVlTPSJrZXlzIixWQUxVRVM9InZhbHVlcyIscmV0dXJuVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxfaXRlckRlZmluZT1mdW5jdGlvbihlLHQsbixyLGksbyxhKXtfaXRlckNyZWF0ZShuLHQscik7dmFyIHMsYyx1LGw9ZnVuY3Rpb24oZSl7aWYoIUJVR0dZJiZlIGluIGgpcmV0dXJuIGhbZV07c3dpdGNoKGUpe2Nhc2UgS0VZUzpjYXNlIFZBTFVFUzpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyxlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsZSl9fSxkPXQrIiBJdGVyYXRvciIsZj1pPT1WQUxVRVMscD0hMSxoPWUucHJvdG90eXBlLHY9aFtJVEVSQVRPUl18fGhbRkZfSVRFUkFUT1JdfHxpJiZoW2ldLGc9dnx8bChpKSxtPWk/Zj9sKCJlbnRyaWVzIik6Zzp2b2lkIDAseT0iQXJyYXkiPT10JiZoLmVudHJpZXN8fHY7aWYoeSYmKHU9X29iamVjdEdwbyh5LmNhbGwobmV3IGUpKSkhPT1PYmplY3QucHJvdG90eXBlJiZ1Lm5leHQmJihfc2V0VG9TdHJpbmdUYWcodSxkLCEwKSxfbGlicmFyeXx8ImZ1bmN0aW9uIj09dHlwZW9mIHVbSVRFUkFUT1JdfHxfaGlkZSh1LElURVJBVE9SLHJldHVyblRoaXMpKSxmJiZ2JiZ2Lm5hbWUhPT1WQUxVRVMmJihwPSEwLGc9ZnVuY3Rpb24oKXtyZXR1cm4gdi5jYWxsKHRoaXMpfSksX2xpYnJhcnkmJiFhfHwhQlVHR1kmJiFwJiZoW0lURVJBVE9SXXx8X2hpZGUoaCxJVEVSQVRPUixnKSxfaXRlcmF0b3JzW3RdPWcsX2l0ZXJhdG9yc1tkXT1yZXR1cm5UaGlzLGkpaWYocz17dmFsdWVzOmY/ZzpsKFZBTFVFUyksa2V5czpvP2c6bChLRVlTKSxlbnRyaWVzOm19LGEpZm9yKGMgaW4gcyljIGluIGh8fF9yZWRlZmluZShoLGMsc1tjXSk7ZWxzZSBfZXhwb3J0KF9leHBvcnQuUCtfZXhwb3J0LkYqKEJVR0dZfHxwKSx0LHMpO3JldHVybiBzfSwkYXQ9X3N0cmluZ0F0KCEwKTtfaXRlckRlZmluZShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24oZSl7dGhpcy5fdD1TdHJpbmcoZSksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5fdCxuPXRoaXMuX2k7cmV0dXJuIG4+PXQubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KGU9JGF0KHQsbiksdGhpcy5faSs9ZS5sZW5ndGgse3ZhbHVlOmUsZG9uZTohMX0pfSk7dmFyIFVOU0NPUEFCTEVTPV93a3MoInVuc2NvcGFibGVzIiksQXJyYXlQcm90bz1BcnJheS5wcm90b3R5cGU7bnVsbD09QXJyYXlQcm90b1tVTlNDT1BBQkxFU10mJl9oaWRlKEFycmF5UHJvdG8sVU5TQ09QQUJMRVMse30pO3ZhciBfYWRkVG9VbnNjb3BhYmxlcz1mdW5jdGlvbihlKXtBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtlXT0hMH0sX2l0ZXJTdGVwPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3ZhbHVlOnQsZG9uZTohIWV9fSxlczZfYXJyYXlfaXRlcmF0b3I9X2l0ZXJEZWZpbmUoQXJyYXksIkFycmF5IixmdW5jdGlvbihlLHQpe3RoaXMuX3Q9X3RvSW9iamVjdChlKSx0aGlzLl9pPTAsdGhpcy5faz10fSxmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3QsdD10aGlzLl9rLG49dGhpcy5faSsrO3JldHVybiFlfHxuPj1lLmxlbmd0aD8odGhpcy5fdD12b2lkIDAsX2l0ZXJTdGVwKDEpKTpfaXRlclN0ZXAoMCwia2V5cyI9PXQ/bjoidmFsdWVzIj09dD9lW25dOltuLGVbbl1dKX0sInZhbHVlcyIpO19pdGVyYXRvcnMuQXJndW1lbnRzPV9pdGVyYXRvcnMuQXJyYXksX2FkZFRvVW5zY29wYWJsZXMoImtleXMiKSxfYWRkVG9VbnNjb3BhYmxlcygidmFsdWVzIiksX2FkZFRvVW5zY29wYWJsZXMoImVudHJpZXMiKTtmb3IodmFyIElURVJBVE9SJDE9X3drcygiaXRlcmF0b3IiKSxUT19TVFJJTkdfVEFHPV93a3MoInRvU3RyaW5nVGFnIiksQXJyYXlWYWx1ZXM9X2l0ZXJhdG9ycy5BcnJheSxET01JdGVyYWJsZXM9e0NTU1J1bGVMaXN0OiEwLENTU1N0eWxlRGVjbGFyYXRpb246ITEsQ1NTVmFsdWVMaXN0OiExLENsaWVudFJlY3RMaXN0OiExLERPTVJlY3RMaXN0OiExLERPTVN0cmluZ0xpc3Q6ITEsRE9NVG9rZW5MaXN0OiEwLERhdGFUcmFuc2Zlckl0ZW1MaXN0OiExLEZpbGVMaXN0OiExLEhUTUxBbGxDb2xsZWN0aW9uOiExLEhUTUxDb2xsZWN0aW9uOiExLEhUTUxGb3JtRWxlbWVudDohMSxIVE1MU2VsZWN0RWxlbWVudDohMSxNZWRpYUxpc3Q6ITAsTWltZVR5cGVBcnJheTohMSxOYW1lZE5vZGVNYXA6ITEsTm9kZUxpc3Q6ITAsUGFpbnRSZXF1ZXN0TGlzdDohMSxQbHVnaW46ITEsUGx1Z2luQXJyYXk6ITEsU1ZHTGVuZ3RoTGlzdDohMSxTVkdOdW1iZXJMaXN0OiExLFNWR1BhdGhTZWdMaXN0OiExLFNWR1BvaW50TGlzdDohMSxTVkdTdHJpbmdMaXN0OiExLFNWR1RyYW5zZm9ybUxpc3Q6ITEsU291cmNlQnVmZmVyTGlzdDohMSxTdHlsZVNoZWV0TGlzdDohMCxUZXh0VHJhY2tDdWVMaXN0OiExLFRleHRUcmFja0xpc3Q6ITEsVG91Y2hMaXN0OiExfSxjb2xsZWN0aW9ucz1fb2JqZWN0S2V5cyhET01JdGVyYWJsZXMpLGk9MDtpPGNvbGxlY3Rpb25zLmxlbmd0aDtpKyspe3ZhciBOQU1FPWNvbGxlY3Rpb25zW2ldLGV4cGxpY2l0PURPTUl0ZXJhYmxlc1tOQU1FXSxDb2xsZWN0aW9uPV9nbG9iYWxbTkFNRV0scHJvdG89Q29sbGVjdGlvbiYmQ29sbGVjdGlvbi5wcm90b3R5cGUsa2V5O2lmKHByb3RvJiYocHJvdG9bSVRFUkFUT1IkMV18fF9oaWRlKHByb3RvLElURVJBVE9SJDEsQXJyYXlWYWx1ZXMpLHByb3RvW1RPX1NUUklOR19UQUddfHxfaGlkZShwcm90byxUT19TVFJJTkdfVEFHLE5BTUUpLF9pdGVyYXRvcnNbTkFNRV09QXJyYXlWYWx1ZXMsZXhwbGljaXQpKWZvcihrZXkgaW4gZXM2X2FycmF5X2l0ZXJhdG9yKXByb3RvW2tleV18fF9yZWRlZmluZShwcm90byxrZXksZXM2X2FycmF5X2l0ZXJhdG9yW2tleV0sITApfXZhciBfYW5JbnN0YW5jZT1mdW5jdGlvbihlLHQsbixyKXtpZighKGUgaW5zdGFuY2VvZiB0KXx8dm9pZCAwIT09ciYmciBpbiBlKXRocm93IFR5cGVFcnJvcihuKyI6IGluY29ycmVjdCBpbnZvY2F0aW9uISIpO3JldHVybiBlfSxfaXRlckNhbGw9ZnVuY3Rpb24odCxlLG4scil7dHJ5e3JldHVybiByP2UoX2FuT2JqZWN0KG4pWzBdLG5bMV0pOmUobil9Y2F0Y2goZSl7dmFyIGk9dC5yZXR1cm47dGhyb3cgdm9pZCAwIT09aSYmX2FuT2JqZWN0KGkuY2FsbCh0KSksZX19LElURVJBVE9SJDI9X3drcygiaXRlcmF0b3IiKSxBcnJheVByb3RvJDE9QXJyYXkucHJvdG90eXBlLF9pc0FycmF5SXRlcj1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZSYmKF9pdGVyYXRvcnMuQXJyYXk9PT1lfHxBcnJheVByb3RvJDFbSVRFUkFUT1IkMl09PT1lKX0sSVRFUkFUT1IkMz1fd2tzKCJpdGVyYXRvciIpLGNvcmVfZ2V0SXRlcmF0b3JNZXRob2Q9X2NvcmUuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24oZSl7aWYobnVsbCE9ZSlyZXR1cm4gZVtJVEVSQVRPUiQzXXx8ZVsiQEBpdGVyYXRvciJdfHxfaXRlcmF0b3JzW19jbGFzc29mKGUpXX0sX2Zvck9mPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciBmPXt9LHA9e30sdD1lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsYyx1PWk/ZnVuY3Rpb24oKXtyZXR1cm4gZX06Y29yZV9nZXRJdGVyYXRvck1ldGhvZChlKSxsPV9jdHgobixyLHQ/MjoxKSxkPTA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHUpdGhyb3cgVHlwZUVycm9yKGUrIiBpcyBub3QgaXRlcmFibGUhIik7aWYoX2lzQXJyYXlJdGVyKHUpKXtmb3Iobz1fdG9MZW5ndGgoZS5sZW5ndGgpO2Q8bztkKyspaWYoKGM9dD9sKF9hbk9iamVjdChhPWVbZF0pWzBdLGFbMV0pOmwoZVtkXSkpPT09Znx8Yz09PXApcmV0dXJuIGN9ZWxzZSBmb3Iocz11LmNhbGwoZSk7IShhPXMubmV4dCgpKS5kb25lOylpZigoYz1faXRlckNhbGwocyxsLGEudmFsdWUsdCkpPT09Znx8Yz09PXApcmV0dXJuIGN9O3QuQlJFQUs9Zix0LlJFVFVSTj1wfSksU1BFQ0lFUz1fd2tzKCJzcGVjaWVzIiksX3NwZWNpZXNDb25zdHJ1Y3Rvcj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9X2FuT2JqZWN0KGUpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1yfHxudWxsPT0obj1fYW5PYmplY3QocilbU1BFQ0lFU10pP3Q6X2FGdW5jdGlvbihuKX0sX2ludm9rZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dm9pZCAwPT09bjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gcj9lKCk6ZS5jYWxsKG4pO2Nhc2UgMTpyZXR1cm4gcj9lKHRbMF0pOmUuY2FsbChuLHRbMF0pO2Nhc2UgMjpyZXR1cm4gcj9lKHRbMF0sdFsxXSk6ZS5jYWxsKG4sdFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHI/ZSh0WzBdLHRbMV0sdFsyXSk6ZS5jYWxsKG4sdFswXSx0WzFdLHRbMl0pO2Nhc2UgNDpyZXR1cm4gcj9lKHRbMF0sdFsxXSx0WzJdLHRbM10pOmUuY2FsbChuLHRbMF0sdFsxXSx0WzJdLHRbM10pfXJldHVybiBlLmFwcGx5KG4sdCl9LHByb2Nlc3MkMj1fZ2xvYmFsLnByb2Nlc3Msc2V0VGFzaz1fZ2xvYmFsLnNldEltbWVkaWF0ZSxjbGVhclRhc2s9X2dsb2JhbC5jbGVhckltbWVkaWF0ZSxNZXNzYWdlQ2hhbm5lbD1fZ2xvYmFsLk1lc3NhZ2VDaGFubmVsLERpc3BhdGNoPV9nbG9iYWwuRGlzcGF0Y2gsY291bnRlcj0wLHF1ZXVlPXt9LE9OUkVBRFlTVEFURUNIQU5HRT0ib25yZWFkeXN0YXRlY2hhbmdlIixkZWZlcixjaGFubmVsJDEscG9ydCxydW49ZnVuY3Rpb24oKXt2YXIgZT0rdGhpcztpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIHQ9cXVldWVbZV07ZGVsZXRlIHF1ZXVlW2VdLHQoKX19LGxpc3RlbmVyPWZ1bmN0aW9uKGUpe3J1bi5jYWxsKGUuZGF0YSl9O3NldFRhc2smJmNsZWFyVGFza3x8KHNldFRhc2s9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWFyZ3VtZW50cyxuPVtdLHI9MTthcmd1bWVudHMubGVuZ3RoPnI7KW4ucHVzaCh0W3IrK10pO3JldHVybiBxdWV1ZVsrK2NvdW50ZXJdPWZ1bmN0aW9uKCl7X2ludm9rZSgiZnVuY3Rpb24iPT10eXBlb2YgZT9lOkZ1bmN0aW9uKGUpLG4pfSxkZWZlcihjb3VudGVyKSxjb3VudGVyfSxjbGVhclRhc2s9ZnVuY3Rpb24oZSl7ZGVsZXRlIHF1ZXVlW2VdfSwicHJvY2VzcyI9PV9jb2YocHJvY2VzcyQyKT9kZWZlcj1mdW5jdGlvbihlKXtwcm9jZXNzJDIubmV4dFRpY2soX2N0eChydW4sZSwxKSl9OkRpc3BhdGNoJiZEaXNwYXRjaC5ub3c/ZGVmZXI9ZnVuY3Rpb24oZSl7RGlzcGF0Y2gubm93KF9jdHgocnVuLGUsMSkpfTpNZXNzYWdlQ2hhbm5lbD8oY2hhbm5lbCQxPW5ldyBNZXNzYWdlQ2hhbm5lbCxwb3J0PWNoYW5uZWwkMS5wb3J0MixjaGFubmVsJDEucG9ydDEub25tZXNzYWdlPWxpc3RlbmVyLGRlZmVyPV9jdHgocG9ydC5wb3N0TWVzc2FnZSxwb3J0LDEpKTpfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBwb3N0TWVzc2FnZSYmIV9nbG9iYWwuaW1wb3J0U2NyaXB0cz8oZGVmZXI9ZnVuY3Rpb24oZSl7X2dsb2JhbC5wb3N0TWVzc2FnZShlKyIiLCIqIil9LF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbGlzdGVuZXIsITEpKTpkZWZlcj1PTlJFQURZU1RBVEVDSEFOR0UgaW4gX2RvbUNyZWF0ZSgic2NyaXB0Iik/ZnVuY3Rpb24oZSl7X2h0bWwuYXBwZW5kQ2hpbGQoX2RvbUNyZWF0ZSgic2NyaXB0IikpW09OUkVBRFlTVEFURUNIQU5HRV09ZnVuY3Rpb24oKXtfaHRtbC5yZW1vdmVDaGlsZCh0aGlzKSxydW4uY2FsbChlKX19OmZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoX2N0eChydW4sZSwxKSwwKX0pO3ZhciBfdGFzaz17c2V0OnNldFRhc2ssY2xlYXI6Y2xlYXJUYXNrfSxtYWNyb3Rhc2s9X3Rhc2suc2V0LE9ic2VydmVyPV9nbG9iYWwuTXV0YXRpb25PYnNlcnZlcnx8X2dsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHByb2Nlc3MkMz1fZ2xvYmFsLnByb2Nlc3MsUHJvbWlzZSQxPV9nbG9iYWwuUHJvbWlzZSxpc05vZGUkMT0icHJvY2VzcyI9PV9jb2YocHJvY2VzcyQzKSxfbWljcm90YXNrPWZ1bmN0aW9uKCl7dmFyIG4scixpLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2Zvcihpc05vZGUkMSYmKGU9cHJvY2VzcyQzLmRvbWFpbikmJmUuZXhpdCgpO247KXt0PW4uZm4sbj1uLm5leHQ7dHJ5e3QoKX1jYXRjaChlKXt0aHJvdyBuP2koKTpyPXZvaWQgMCxlfX1yPXZvaWQgMCxlJiZlLmVudGVyKCl9O2lmKGlzTm9kZSQxKWk9ZnVuY3Rpb24oKXtwcm9jZXNzJDMubmV4dFRpY2soZSl9O2Vsc2UgaWYoIU9ic2VydmVyfHxfZ2xvYmFsLm5hdmlnYXRvciYmX2dsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSlpZihQcm9taXNlJDEmJlByb21pc2UkMS5yZXNvbHZlKXt2YXIgdD1Qcm9taXNlJDEucmVzb2x2ZSh2b2lkIDApO2k9ZnVuY3Rpb24oKXt0LnRoZW4oZSl9fWVsc2UgaT1mdW5jdGlvbigpe21hY3JvdGFzay5jYWxsKF9nbG9iYWwsZSl9O2Vsc2V7dmFyIG89ITAsYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bmV3IE9ic2VydmVyKGUpLm9ic2VydmUoYSx7Y2hhcmFjdGVyRGF0YTohMH0pLGk9ZnVuY3Rpb24oKXthLmRhdGE9bz0hb319cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXtmbjplLG5leHQ6dm9pZCAwfTtyJiYoci5uZXh0PXQpLG58fChuPXQsaSgpKSxyPXR9fTtmdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShlKXt2YXIgbixyO3RoaXMucHJvbWlzZT1uZXcgZShmdW5jdGlvbihlLHQpe2lmKHZvaWQgMCE9PW58fHZvaWQgMCE9PXIpdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO249ZSxyPXR9KSx0aGlzLnJlc29sdmU9X2FGdW5jdGlvbihuKSx0aGlzLnJlamVjdD1fYUZ1bmN0aW9uKHIpfXZhciBmJDM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShlKX0sX25ld1Byb21pc2VDYXBhYmlsaXR5PXtmOmYkM30sX3BlcmZvcm09ZnVuY3Rpb24oZSl7dHJ5e3JldHVybntlOiExLHY6ZSgpfX1jYXRjaChlKXtyZXR1cm57ZTohMCx2OmV9fX0sbmF2aWdhdG9yJDE9X2dsb2JhbC5uYXZpZ2F0b3IsX3VzZXJBZ2VudD1uYXZpZ2F0b3IkMSYmbmF2aWdhdG9yJDEudXNlckFnZW50fHwiIixfcHJvbWlzZVJlc29sdmU9ZnVuY3Rpb24oZSx0KXtpZihfYW5PYmplY3QoZSksX2lzT2JqZWN0KHQpJiZ0LmNvbnN0cnVjdG9yPT09ZSlyZXR1cm4gdDt2YXIgbj1fbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihlKTtyZXR1cm4oMCxuLnJlc29sdmUpKHQpLG4ucHJvbWlzZX0sX3JlZGVmaW5lQWxsPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIgaW4gdClfcmVkZWZpbmUoZSxyLHRbcl0sbik7cmV0dXJuIGV9LFNQRUNJRVMkMT1fd2tzKCJzcGVjaWVzIiksX3NldFNwZWNpZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9X2dsb2JhbFtlXTtfZGVzY3JpcHRvcnMmJnQmJiF0W1NQRUNJRVMkMV0mJl9vYmplY3REcC5mKHQsU1BFQ0lFUyQxLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9LElURVJBVE9SJDQ9X3drcygiaXRlcmF0b3IiKSxTQUZFX0NMT1NJTkc9ITE7dHJ5e3ZhciByaXRlcj1bN11bSVRFUkFUT1IkNF0oKTtyaXRlci5yZXR1cm49ZnVuY3Rpb24oKXtTQUZFX0NMT1NJTkc9ITB9fWNhdGNoKGUpe312YXIgX2l0ZXJEZXRlY3Q9ZnVuY3Rpb24oZSx0KXtpZighdCYmIVNBRkVfQ0xPU0lORylyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIHI9WzddLGk9cltJVEVSQVRPUiQ0XSgpO2kubmV4dD1mdW5jdGlvbigpe3JldHVybntkb25lOm49ITB9fSxyW0lURVJBVE9SJDRdPWZ1bmN0aW9uKCl7cmV0dXJuIGl9LGUocil9Y2F0Y2goZSl7fXJldHVybiBufSx0YXNrPV90YXNrLnNldCxtaWNyb3Rhc2s9X21pY3JvdGFzaygpLFBST01JU0U9IlByb21pc2UiLFR5cGVFcnJvciQxPV9nbG9iYWwuVHlwZUVycm9yLHByb2Nlc3MkMT1fZ2xvYmFsLnByb2Nlc3MsdmVyc2lvbnM9cHJvY2VzcyQxJiZwcm9jZXNzJDEudmVyc2lvbnMsdjg9dmVyc2lvbnMmJnZlcnNpb25zLnY4fHwiIiwkUHJvbWlzZT1fZ2xvYmFsW1BST01JU0VdLGlzTm9kZT0icHJvY2VzcyI9PV9jbGFzc29mKHByb2Nlc3MkMSksZW1wdHk9ZnVuY3Rpb24oKXt9LEludGVybmFsLG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSxPd25Qcm9taXNlQ2FwYWJpbGl0eSxXcmFwcGVyLG5ld1Byb21pc2VDYXBhYmlsaXR5PW5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eT1fbmV3UHJvbWlzZUNhcGFiaWxpdHkuZixVU0VfTkFUSVZFPSEhZnVuY3Rpb24oKXt0cnl7dmFyIGU9JFByb21pc2UucmVzb2x2ZSgxKSx0PShlLmNvbnN0cnVjdG9yPXt9KVtfd2tzKCJzcGVjaWVzIildPWZ1bmN0aW9uKGUpe2UoZW1wdHksZW1wdHkpfTtyZXR1cm4oaXNOb2RlfHwiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50KSYmZS50aGVuKGVtcHR5KWluc3RhbmNlb2YgdCYmMCE9PXY4LmluZGV4T2YoIjYuNiIpJiYtMT09PV91c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lLzY2Iil9Y2F0Y2goZSl7fX0oKSxpc1RoZW5hYmxlPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiEoIV9pc09iamVjdChlKXx8ImZ1bmN0aW9uIiE9dHlwZW9mKHQ9ZS50aGVuKSkmJnR9LG5vdGlmeT1mdW5jdGlvbihsLG4pe2lmKCFsLl9uKXtsLl9uPSEwO3ZhciByPWwuX2M7bWljcm90YXNrKGZ1bmN0aW9uKCl7Zm9yKHZhciBjPWwuX3YsdT0xPT1sLl9zLGU9MCx0PWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPXU/ZS5vazplLmZhaWwsbz1lLnJlc29sdmUsYT1lLnJlamVjdCxzPWUuZG9tYWluO3RyeXtpPyh1fHwoMj09bC5faCYmb25IYW5kbGVVbmhhbmRsZWQobCksbC5faD0xKSwhMD09PWk/dD1jOihzJiZzLmVudGVyKCksdD1pKGMpLHMmJihzLmV4aXQoKSxyPSEwKSksdD09PWUucHJvbWlzZT9hKFR5cGVFcnJvciQxKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOihuPWlzVGhlbmFibGUodCkpP24uY2FsbCh0LG8sYSk6byh0KSk6YShjKX1jYXRjaChlKXtzJiYhciYmcy5leGl0KCksYShlKX19O3IubGVuZ3RoPmU7KXQocltlKytdKTtsLl9jPVtdLGwuX249ITEsbiYmIWwuX2gmJm9uVW5oYW5kbGVkKGwpfSl9fSxvblVuaGFuZGxlZD1mdW5jdGlvbihvKXt0YXNrLmNhbGwoX2dsb2JhbCxmdW5jdGlvbigpe3ZhciBlLHQsbixyPW8uX3YsaT1pc1VuaGFuZGxlZChvKTtpZihpJiYoZT1fcGVyZm9ybShmdW5jdGlvbigpe2lzTm9kZT9wcm9jZXNzJDEuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixyLG8pOih0PV9nbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pP3Qoe3Byb21pc2U6byxyZWFzb246cn0pOihuPV9nbG9iYWwuY29uc29sZSkmJm4uZXJyb3ImJm4uZXJyb3IoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIscil9KSxvLl9oPWlzTm9kZXx8aXNVbmhhbmRsZWQobyk/MjoxKSxvLl9hPXZvaWQgMCxpJiZlLmUpdGhyb3cgZS52fSl9LGlzVW5oYW5kbGVkPWZ1bmN0aW9uKGUpe3JldHVybiAxIT09ZS5faCYmMD09PShlLl9hfHxlLl9jKS5sZW5ndGh9LG9uSGFuZGxlVW5oYW5kbGVkPWZ1bmN0aW9uKHQpe3Rhc2suY2FsbChfZ2xvYmFsLGZ1bmN0aW9uKCl7dmFyIGU7aXNOb2RlP3Byb2Nlc3MkMS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTooZT1fZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkmJmUoe3Byb21pc2U6dCxyZWFzb246dC5fdn0pfSl9LCRyZWplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Ll9kfHwodC5fZD0hMCwodD10Ll93fHx0KS5fdj1lLHQuX3M9Mix0Ll9hfHwodC5fYT10Ll9jLnNsaWNlKCkpLG5vdGlmeSh0LCEwKSl9LCRyZXNvbHZlPWZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcztpZighci5fZCl7ci5fZD0hMCxyPXIuX3d8fHI7dHJ5e2lmKHI9PT1lKXRocm93IFR5cGVFcnJvciQxKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpOyhuPWlzVGhlbmFibGUoZSkpP21pY3JvdGFzayhmdW5jdGlvbigpe3ZhciB0PXtfdzpyLF9kOiExfTt0cnl7bi5jYWxsKGUsX2N0eCgkcmVzb2x2ZSx0LDEpLF9jdHgoJHJlamVjdCx0LDEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwodCxlKX19KTooci5fdj1lLHIuX3M9MSxub3RpZnkociwhMSkpfWNhdGNoKGUpeyRyZWplY3QuY2FsbCh7X3c6cixfZDohMX0sZSl9fX07VVNFX05BVElWRXx8KCRQcm9taXNlPWZ1bmN0aW9uKGUpe19hbkluc3RhbmNlKHRoaXMsJFByb21pc2UsUFJPTUlTRSwiX2giKSxfYUZ1bmN0aW9uKGUpLEludGVybmFsLmNhbGwodGhpcyk7dHJ5e2UoX2N0eCgkcmVzb2x2ZSx0aGlzLDEpLF9jdHgoJHJlamVjdCx0aGlzLDEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwodGhpcyxlKX19LEludGVybmFsPWZ1bmN0aW9uKGUpe3RoaXMuX2M9W10sdGhpcy5fYT12b2lkIDAsdGhpcy5fcz0wLHRoaXMuX2Q9ITEsdGhpcy5fdj12b2lkIDAsdGhpcy5faD0wLHRoaXMuX249ITF9LEludGVybmFsLnByb3RvdHlwZT1fcmVkZWZpbmVBbGwoJFByb21pc2UucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3UHJvbWlzZUNhcGFiaWxpdHkoX3NwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCRQcm9taXNlKSk7cmV0dXJuIG4ub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fGUsbi5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LG4uZG9tYWluPWlzTm9kZT9wcm9jZXNzJDEuZG9tYWluOnZvaWQgMCx0aGlzLl9jLnB1c2gobiksdGhpcy5fYSYmdGhpcy5fYS5wdXNoKG4pLHRoaXMuX3MmJm5vdGlmeSh0aGlzLCExKSxuLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLE93blByb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IEludGVybmFsO3RoaXMucHJvbWlzZT1lLHRoaXMucmVzb2x2ZT1fY3R4KCRyZXNvbHZlLGUsMSksdGhpcy5yZWplY3Q9X2N0eCgkcmVqZWN0LGUsMSl9LF9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mPW5ld1Byb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKGUpe3JldHVybiBlPT09JFByb21pc2V8fGU9PT1XcmFwcGVyP25ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShlKTpuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoZSl9KSxfZXhwb3J0KF9leHBvcnQuRytfZXhwb3J0LlcrX2V4cG9ydC5GKiFVU0VfTkFUSVZFLHtQcm9taXNlOiRQcm9taXNlfSksX3NldFRvU3RyaW5nVGFnKCRQcm9taXNlLFBST01JU0UpLF9zZXRTcGVjaWVzKFBST01JU0UpLFdyYXBwZXI9X2NvcmVbUFJPTUlTRV0sX2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GKiFVU0VfTkFUSVZFLFBST01JU0Use3JlamVjdDpmdW5jdGlvbihlKXt2YXIgdD1uZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtyZXR1cm4oMCx0LnJlamVjdCkoZSksdC5wcm9taXNlfX0pLF9leHBvcnQoX2V4cG9ydC5TK19leHBvcnQuRiooX2xpYnJhcnl8fCFVU0VfTkFUSVZFKSxQUk9NSVNFLHtyZXNvbHZlOmZ1bmN0aW9uKGUpe3JldHVybiBfcHJvbWlzZVJlc29sdmUoX2xpYnJhcnkmJnRoaXM9PT1XcmFwcGVyPyRQcm9taXNlOnRoaXMsZSl9fSksX2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GKiEoVVNFX05BVElWRSYmX2l0ZXJEZXRlY3QoZnVuY3Rpb24oZSl7JFByb21pc2UuYWxsKGUpLmNhdGNoKGVtcHR5KX0pKSxQUk9NSVNFLHthbGw6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyx0PW5ld1Byb21pc2VDYXBhYmlsaXR5KGEpLHM9dC5yZXNvbHZlLGM9dC5yZWplY3Qsbj1fcGVyZm9ybShmdW5jdGlvbigpe3ZhciByPVtdLGk9MCxvPTE7X2Zvck9mKGUsITEsZnVuY3Rpb24oZSl7dmFyIHQ9aSsrLG49ITE7ci5wdXNoKHZvaWQgMCksbysrLGEucmVzb2x2ZShlKS50aGVuKGZ1bmN0aW9uKGUpe258fChuPSEwLHJbdF09ZSwtLW98fHMocikpfSxjKX0pLC0tb3x8cyhyKX0pO3JldHVybiBuLmUmJmMobi52KSx0LnByb21pc2V9LHJhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPW5ld1Byb21pc2VDYXBhYmlsaXR5KHQpLHI9bi5yZWplY3QsaT1fcGVyZm9ybShmdW5jdGlvbigpe19mb3JPZihlLCExLGZ1bmN0aW9uKGUpe3QucmVzb2x2ZShlKS50aGVuKG4ucmVzb2x2ZSxyKX0pfSk7cmV0dXJuIGkuZSYmcihpLnYpLG4ucHJvbWlzZX19KTt2YXIgJGluY2x1ZGVzPV9hcnJheUluY2x1ZGVzKCEwKTtfZXhwb3J0KF9leHBvcnQuUCwiQXJyYXkiLHtpbmNsdWRlczpmdW5jdGlvbihlKXtyZXR1cm4gJGluY2x1ZGVzKHRoaXMsZSwxPGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksX2FkZFRvVW5zY29wYWJsZXMoImluY2x1ZGVzIik7dmFyIGlzRW51bT1fb2JqZWN0UGllLmYsX29iamVjdFRvQXJyYXk9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPV90b0lvYmplY3QoZSkscj1fb2JqZWN0S2V5cyhuKSxpPXIubGVuZ3RoLG89MCxhPVtdO288aTspaXNFbnVtLmNhbGwobix0PXJbbysrXSkmJmEucHVzaChzP1t0LG5bdF1dOm5bdF0pO3JldHVybiBhfX0sJHZhbHVlcz1fb2JqZWN0VG9BcnJheSghMSk7X2V4cG9ydChfZXhwb3J0LlMsIk9iamVjdCIse3ZhbHVlczpmdW5jdGlvbihlKXtyZXR1cm4gJHZhbHVlcyhlKX19KTt2YXIgb3JpZ2luYWxDb25zb2xlPWdsb2JhbC5jb25zb2xlO2Z1bmN0aW9uIHNldE5hdGl2ZUNvbnNvbGUoKXtpZihnZW5lcmF0ZUxldmVsTWFwKCksZ2xvYmFsLldYRW52aXJvbm1lbnQmJiJXZWIiIT09Z2xvYmFsLldYRW52aXJvbm1lbnQucGxhdGZvcm0pZ2xvYmFsLmNvbnNvbGU9e2RlYnVnOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImRlYnVnIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX0RFQlVHIl0pKX0sbG9nOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImxvZyIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19MT0ciXSkpfSxpbmZvOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImluZm8iKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fSU5GTyJdKSl9LHdhcm46ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgid2FybiIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19XQVJOIl0pKX0sZXJyb3I6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZXJyb3IiKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fRVJST1IiXSkpfX07ZWxzZXt2YXIgZT1jb25zb2xlLmRlYnVnLHQ9Y29uc29sZS5sb2csbj1jb25zb2xlLmluZm8scj1jb25zb2xlLndhcm4saT1jb25zb2xlLmVycm9yO2NvbnNvbGUuX19vcmlfXz17ZGVidWc6ZSxsb2c6dCxpbmZvOm4sd2FybjpyLGVycm9yOml9LGNvbnNvbGUuZGVidWc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZGVidWciKSYmY29uc29sZS5fX29yaV9fLmRlYnVnLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUubG9nPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImxvZyIpJiZjb25zb2xlLl9fb3JpX18ubG9nLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUuaW5mbz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJpbmZvIikmJmNvbnNvbGUuX19vcmlfXy5pbmZvLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUud2Fybj1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJ3YXJuIikmJmNvbnNvbGUuX19vcmlfXy53YXJuLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUuZXJyb3I9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZXJyb3IiKSYmY29uc29sZS5fX29yaV9fLmVycm9yLmFwcGx5KGNvbnNvbGUsZSl9fX1mdW5jdGlvbiBmb3JtYXQoZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlPSJbb2JqZWN0IG9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnRvTG93ZXJDYXNlKCk/SlNPTi5zdHJpbmdpZnkoZSk6U3RyaW5nKGUpfSl9dmFyIG9yaWdpbmFsU2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dCxzZXRUaW1lb3V0TmF0aXZlPWdsb2JhbC5zZXRUaW1lb3V0TmF0aXZlO2Z1bmN0aW9uIHNldE5hdGl2ZVRpbWVyKCl7aWYodm9pZCAwPT09c2V0VGltZW91dCYmImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXROYXRpdmUpe3ZhciBuPXt9LHI9MDtnbG9iYWwuc2V0VGltZW91dD1mdW5jdGlvbihlLHQpe25bKytyXT1lLHNldFRpbWVvdXROYXRpdmUoci50b1N0cmluZygpLHQpfSxnbG9iYWwuc2V0VGltZW91dENhbGxiYWNrPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBuW2VdJiYobltlXSgpLGRlbGV0ZSBuW2VdKX19fXNldE5hdGl2ZVRpbWVyKCksInVuZGVmaW5lZCI9PXR5cGVvZiBXWEVudmlyb25tZW50fHxXWEVudmlyb25tZW50Ll9fZW5hYmxlX25hdGl2ZV9wcm9taXNlX187dmFyIGZhY3Rvcnk9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsYSx0KXt2YXIgXz1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBFKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gQShlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gJChlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIGIoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBkKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiAwPD10JiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdyhlKXtyZXR1cm4gSShlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxkKGUpJiZlLnRvU3RyaW5nPT09cj9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19cygic2xvdCxjb21wb25lbnQiLCEwKTt2YXIgbD1zKCJrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcyIpO2Z1bmN0aW9uIGsoZSx0KXtpZihlLmxlbmd0aCl7dmFyIG49ZS5pbmRleE9mKHQpO2lmKC0xPG4pcmV0dXJuIGUuc3BsaWNlKG4sMSl9fXZhciBjPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZihlLHQpe3JldHVybiBjLmNhbGwoZSx0KX1mdW5jdGlvbiB1KHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfHwobltlXT10KGUpKX19dmFyIHA9Ly0oXHcpL2csaD11KGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UocCxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKToiIn0pfSksdj11KGZ1bmN0aW9uKGUpe3JldHVybiBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9KSxnPS9cQihbQS1aXSkvZyxTPXUoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShnLCItJDEiKS50b0xvd2VyQ2FzZSgpfSk7dmFyIG09RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5iaW5kKHQpfTpmdW5jdGlvbihuLHIpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gdD8xPHQ/bi5hcHBseShyLGFyZ3VtZW50cyk6bi5jYWxsKHIsZSk6bi5jYWxsKHIpfXJldHVybiBlLl9sZW5ndGg9bi5sZW5ndGgsZX07ZnVuY3Rpb24geShlLHQpe3Q9dHx8MDtmb3IodmFyIG49ZS5sZW5ndGgtdCxyPW5ldyBBcnJheShuKTtuLS07KXJbbl09ZVtuK3RdO3JldHVybiByfWZ1bmN0aW9uIEIoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24geChlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKWVbbl0mJkIodCxlW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBOKGUsdCxuKXt9dmFyIEM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSxUPWZ1bmN0aW9uKGUpe3JldHVybiBlfTtmdW5jdGlvbiBPKHQsbil7aWYodD09PW4pcmV0dXJuITA7dmFyIGU9Yih0KSxyPWIobik7aWYoIWV8fCFyKXJldHVybiFlJiYhciYmU3RyaW5nKHQpPT09U3RyaW5nKG4pO3RyeXt2YXIgaT1BcnJheS5pc0FycmF5KHQpLG89QXJyYXkuaXNBcnJheShuKTtpZihpJiZvKXJldHVybiB0Lmxlbmd0aD09PW4ubGVuZ3RoJiZ0LmV2ZXJ5KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE8oZSxuW3RdKX0pO2lmKHQgaW5zdGFuY2VvZiBEYXRlJiZuIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gdC5nZXRUaW1lKCk9PT1uLmdldFRpbWUoKTtpZihpfHxvKXJldHVybiExO3ZhciBhPU9iamVjdC5rZXlzKHQpLHM9T2JqZWN0LmtleXMobik7cmV0dXJuIGEubGVuZ3RoPT09cy5sZW5ndGgmJmEuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIE8odFtlXSxuW2VdKX0pfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBQKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoTyhlW25dLHQpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIEQoZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX12YXIgTT0iZGF0YS1zZXJ2ZXItcmVuZGVyZWQiLGo9WyJjb21wb25lbnQiLCJkaXJlY3RpdmUiLCJmaWx0ZXIiXSxMPVsiYmVmb3JlQ3JlYXRlIiwiY3JlYXRlZCIsImJlZm9yZU1vdW50IiwibW91bnRlZCIsImJlZm9yZVVwZGF0ZSIsInVwZGF0ZWQiLCJiZWZvcmVEZXN0cm95IiwiZGVzdHJveWVkIiwiYWN0aXZhdGVkIiwiZGVhY3RpdmF0ZWQiLCJlcnJvckNhcHR1cmVkIiwic2VydmVyUHJlZmV0Y2giXSxSPXtvcHRpb25NZXJnZVN0cmF0ZWdpZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxzaWxlbnQ6ITEscHJvZHVjdGlvblRpcDohMSxkZXZ0b29sczohMSxwZXJmb3JtYW5jZTohMSxlcnJvckhhbmRsZXI6bnVsbCx3YXJuSGFuZGxlcjpudWxsLGlnbm9yZWRFbGVtZW50czpbXSxrZXlDb2RlczpPYmplY3QuY3JlYXRlKG51bGwpLGlzUmVzZXJ2ZWRUYWc6Qyxpc1Jlc2VydmVkQXR0cjpDLGlzVW5rbm93bkVsZW1lbnQ6QyxnZXRUYWdOYW1lc3BhY2U6TixwYXJzZVBsYXRmb3JtVGFnTmFtZTpULG11c3RVc2VQcm9wOkMsYXN5bmM6ITAsX2xpZmVjeWNsZUhvb2tzOkx9O2Z1bmN0aW9uIEYoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgVT1uZXcgUmVnRXhwKCJbXiIrL2EtekEtWlx1MDBCN1x1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDNGLVx1MjA0MFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZELy5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgeixWPSJfX3Byb3RvX18iaW57fSxxPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFc9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSD1XJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksRz1xJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLFg9RyYmL21zaWV8dHJpZGVudC8udGVzdChHKSxKPUcmJjA8Ry5pbmRleE9mKCJtc2llIDkuMCIpLFk9RyYmMDxHLmluZGV4T2YoImVkZ2UvIiksSz0oRyYmRy5pbmRleE9mKCJhbmRyb2lkIiksRyYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEcpLEcmJi9jaHJvbWVcL1xkKy8udGVzdChHKSxHJiYvcGhhbnRvbWpzLy50ZXN0KEcpLEcmJkcubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykse30ud2F0Y2gpO2lmKHEpdHJ5e3ZhciBaPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShaLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsWil9Y2F0Y2goZSl7fXZhciBRPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXomJih6PSFxJiYhVyYmdm9pZCAwIT09Z2xvYmFsJiYoZ2xvYmFsLnByb2Nlc3MmJiJzZXJ2ZXIiPT09Z2xvYmFsLnByb2Nlc3MuZW52LlZVRV9FTlYpKSx6fSxlZT1xJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztmdW5jdGlvbiB0ZShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmL25hdGl2ZSBjb2RlLy50ZXN0KGUudG9TdHJpbmcoKSl9dmFyIG5lLHJlPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZ0ZShTeW1ib2wpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJnRlKFJlZmxlY3Qub3duS2V5cyk7bmU9InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJnRlKFNldCk/U2V0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4hMD09PXRoaXMuc2V0W2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRbZV09ITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX0sZX0oKTt2YXIgaWU9TixvZT0wLGFlPWZ1bmN0aW9uKCl7dGhpcy5pZD12b2lkIDAhPT10P3QudWlkKys6b2UrKyx0aGlzLnN1YnM9W119O2Z1bmN0aW9uIHNlKGUpe2FlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wdXNoKGUpLGFlLlNoYXJlZE9iamVjdC50YXJnZXQ9ZX1mdW5jdGlvbiBjZSgpe2FlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wb3AoKSxhZS5TaGFyZWRPYmplY3QudGFyZ2V0PWFlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFja1thZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2subGVuZ3RoLTFdfWFlLnByb3RvdHlwZS5hZGRTdWI9ZnVuY3Rpb24oZSl7dGhpcy5zdWJzLnB1c2goZSl9LGFlLnByb3RvdHlwZS5yZW1vdmVTdWI9ZnVuY3Rpb24oZSl7ayh0aGlzLnN1YnMsZSl9LGFlLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXthZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZhZS5TaGFyZWRPYmplY3QudGFyZ2V0LmFkZERlcCh0aGlzKX0sYWUucHJvdG90eXBlLm5vdGlmeT1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnN1YnMuc2xpY2UoKSx0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWVbdF0udXBkYXRlKCl9LGFlLlNoYXJlZE9iamVjdD12b2lkIDAhPT10P3Q6e30sYWUuU2hhcmVkT2JqZWN0LnRhcmdldD1udWxsLGFlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjaz1bXTt2YXIgdWU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt0JiZBcnJheS5pc0FycmF5KHQuY2xhc3MpJiYodC5jbGFzcz10LmNsYXNzLnNsaWNlKDApKSx0aGlzLnRhZz1lLHRoaXMuZGF0YT10LHRoaXMuY2hpbGRyZW49bix0aGlzLnRleHQ9cix0aGlzLmVsbT1pLHRoaXMubnM9dm9pZCAwLHRoaXMuY29udGV4dD1vLHRoaXMuZm5Db250ZXh0PXZvaWQgMCx0aGlzLmZuT3B0aW9ucz12b2lkIDAsdGhpcy5mblNjb3BlSWQ9dm9pZCAwLHRoaXMua2V5PXQmJnQua2V5LHRoaXMuY29tcG9uZW50T3B0aW9ucz1hLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9dm9pZCAwLHRoaXMucGFyZW50PXZvaWQgMCx0aGlzLnJhdz0hMSx0aGlzLmlzU3RhdGljPSExLHRoaXMuaXNSb290SW5zZXJ0PSEwLHRoaXMuaXNDb21tZW50PSExLHRoaXMuaXNDbG9uZWQ9ITEsdGhpcy5pc09uY2U9ITEsdGhpcy5hc3luY0ZhY3Rvcnk9cyx0aGlzLmFzeW5jTWV0YT12b2lkIDAsdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXI9ITF9LGxlPXtjaGlsZDp7Y29uZmlndXJhYmxlOiEwfX07bGUuY2hpbGQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVlLnByb3RvdHlwZSxsZSk7dmFyIGRlPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgdD1uZXcgdWU7cmV0dXJuIHQudGV4dD1lLHQuaXNDb21tZW50PSEwLHR9O2Z1bmN0aW9uIGZlKGUpe3JldHVybiBuZXcgdWUodm9pZCAwLHZvaWQgMCx2b2lkIDAsU3RyaW5nKGUpKX1mdW5jdGlvbiBwZShlKXt2YXIgdD1uZXcgdWUoZS50YWcsZS5kYXRhLGUuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc2xpY2UoKSxlLnRleHQsZS5lbG0sZS5jb250ZXh0LGUuY29tcG9uZW50T3B0aW9ucyxlLmFzeW5jRmFjdG9yeSk7cmV0dXJuIHQubnM9ZS5ucyx0LmlzU3RhdGljPWUuaXNTdGF0aWMsdC5rZXk9ZS5rZXksdC5pc0NvbW1lbnQ9ZS5pc0NvbW1lbnQsdC5mbkNvbnRleHQ9ZS5mbkNvbnRleHQsdC5mbk9wdGlvbnM9ZS5mbk9wdGlvbnMsdC5mblNjb3BlSWQ9ZS5mblNjb3BlSWQsdC5hc3luY01ldGE9ZS5hc3luY01ldGEsdC5pc0Nsb25lZD0hMCx0fXZhciBoZT1BcnJheS5wcm90b3R5cGUsdmU9T2JqZWN0LmNyZWF0ZShoZSk7WyJwdXNoIiwicG9wIiwic2hpZnQiLCJ1bnNoaWZ0Iiwic3BsaWNlIiwic29ydCIsInJldmVyc2UiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBzPWhlW2FdO0YodmUsYSxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHIsaT1zLmFwcGx5KHRoaXMsdCksbz10aGlzLl9fb2JfXztzd2l0Y2goYSl7Y2FzZSJwdXNoIjpjYXNlInVuc2hpZnQiOnI9dDticmVhaztjYXNlInNwbGljZSI6cj10LnNsaWNlKDIpfXJldHVybiByJiZvLm9ic2VydmVBcnJheShyKSxvLmRlcC5ub3RpZnkoKSxpfSl9KTt2YXIgZ2U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmUpLG1lPSEwO2Z1bmN0aW9uIHllKGUpe21lPWV9dmFyIF9lPWZ1bmN0aW9uKGUpe3ZhciB0O3RoaXMudmFsdWU9ZSx0aGlzLmRlcD1uZXcgYWUsdGhpcy52bUNvdW50PTAsRihlLCJfX29iX18iLHRoaXMpLEFycmF5LmlzQXJyYXkoZSk/KFY/KHQ9dmUsZS5fX3Byb3RvX189dCk6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXTtGKGUsbyx0W29dKX19KGUsdmUsZ2UpLHRoaXMub2JzZXJ2ZUFycmF5KGUpKTp0aGlzLndhbGsoZSl9O2Z1bmN0aW9uIGJlKGUsdCl7dmFyIG47aWYoYihlKSYmIShlIGluc3RhbmNlb2YgdWUpKXJldHVybiBmKGUsIl9fb2JfXyIpJiZlLl9fb2JfXyBpbnN0YW5jZW9mIF9lP249ZS5fX29iX186bWUmJiFRKCkmJihBcnJheS5pc0FycmF5KGUpfHxkKGUpKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmIWUuX2lzVnVlJiYobj1uZXcgX2UoZSkpLHQmJm4mJm4udm1Db3VudCsrLG59ZnVuY3Rpb24gd2UobixlLHIsdCxpKXt2YXIgbz1uZXcgYWUsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSk7aWYoIWF8fCExIT09YS5jb25maWd1cmFibGUpe3ZhciBzPWEmJmEuZ2V0LGM9YSYmYS5zZXQ7cyYmIWN8fDIhPT1hcmd1bWVudHMubGVuZ3RofHwocj1uW2VdKTt2YXIgdT0haSYmYmUocik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9cz9zLmNhbGwobik6cjtyZXR1cm4gYWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmKG8uZGVwZW5kKCksdSYmKHUuZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkoZSkmJmZ1bmN0aW9uIGUodCl7Zm9yKHZhciBuPXZvaWQgMCxyPTAsaT10Lmxlbmd0aDtyPGk7cisrKShuPXRbcl0pJiZuLl9fb2JfXyYmbi5fX29iX18uZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkobikmJmUobil9KGUpKSksZX0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXM/cy5jYWxsKG4pOnI7ZT09PXR8fGUhPWUmJnQhPXR8fHMmJiFjfHwoYz9jLmNhbGwobixlKTpyPWUsdT0haSYmYmUoZSksby5ub3RpZnkoKSl9fSl9fWZ1bmN0aW9uIGtlKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpJiZpKHQpKXJldHVybiBlLmxlbmd0aD1NYXRoLm1heChlLmxlbmd0aCx0KSxlLnNwbGljZSh0LDEsbiksbjtpZih0IGluIGUmJiEodCBpbiBPYmplY3QucHJvdG90eXBlKSlyZXR1cm4gZVt0XT1uO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8od2Uoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOmVbdF09bn1mdW5jdGlvbiBTZShlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkmJmkodCkpZS5zcGxpY2UodCwxKTtlbHNle3ZhciBuPWUuX19vYl9fO2UuX2lzVnVlfHxuJiZuLnZtQ291bnR8fGYoZSx0KSYmKGRlbGV0ZSBlW3RdLG4mJm4uZGVwLm5vdGlmeSgpKX19X2UucHJvdG90eXBlLndhbGs9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoO24rKyl3ZShlLHRbbl0pfSxfZS5wcm90b3R5cGUub2JzZXJ2ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyliZShlW3RdKX07dmFyIHhlPVIub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO2Z1bmN0aW9uIENlKGUsdCl7aWYoIXQpcmV0dXJuIGU7Zm9yKHZhciBuLHIsaSxvPXJlP1JlZmxlY3Qub3duS2V5cyh0KTpPYmplY3Qua2V5cyh0KSxhPTA7YTxvLmxlbmd0aDthKyspIl9fb2JfXyIhPT0obj1vW2FdKSYmKHI9ZVtuXSxpPXRbbl0sZihlLG4pP3IhPT1pJiZkKHIpJiZkKGkpJiZDZShyLGkpOmtlKGUsbixpKSk7cmV0dXJuIGV9ZnVuY3Rpb24gVGUobixyLGkpe3JldHVybiBpP2Z1bmN0aW9uKCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5jYWxsKGksaSk6cix0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbChpLGkpOm47cmV0dXJuIGU/Q2UoZSx0KTp0fTpyP24/ZnVuY3Rpb24oKXtyZXR1cm4gQ2UoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5jYWxsKHRoaXMsdGhpcyk6ciwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodGhpcyx0aGlzKTpuKX06cjpufWZ1bmN0aW9uIE9lKGUsdCl7dmFyIG49dD9lP2UuY29uY2F0KHQpOkFycmF5LmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbj9mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKS0xPT09dC5pbmRleE9mKGVbbl0pJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9KG4pOm59ZnVuY3Rpb24gRWUoZSx0LG4scil7dmFyIGk9T2JqZWN0LmNyZWF0ZShlfHxudWxsKTtyZXR1cm4gdD9CKGksdCk6aX14ZS5kYXRhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj9UZShlLHQsbik6dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTpUZShlLHQpfSxMLmZvckVhY2goZnVuY3Rpb24oZSl7eGVbZV09T2V9KSxqLmZvckVhY2goZnVuY3Rpb24oZSl7eGVbZSsicyJdPUVlfSkseGUud2F0Y2g9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT09PUsmJihlPXZvaWQgMCksdD09PUsmJih0PXZvaWQgMCksIXQpcmV0dXJuIE9iamVjdC5jcmVhdGUoZXx8bnVsbCk7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9e307Zm9yKHZhciBvIGluIEIoaSxlKSx0KXt2YXIgYT1pW29dLHM9dFtvXTthJiYhQXJyYXkuaXNBcnJheShhKSYmKGE9W2FdKSxpW29dPWE/YS5jb25jYXQocyk6QXJyYXkuaXNBcnJheShzKT9zOltzXX1yZXR1cm4gaX0seGUucHJvcHM9eGUubWV0aG9kcz14ZS5pbmplY3Q9eGUuY29tcHV0ZWQ9ZnVuY3Rpb24oZSx0LG4scil7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gQihpLGUpLHQmJkIoaSx0KSxpfSx4ZS5wcm92aWRlPVRlO3ZhciBJZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P2U6dH07ZnVuY3Rpb24gQWUobixyLGkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yLm9wdGlvbnMpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5wcm9wcztpZihuKXt2YXIgcixpLG89e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3Iocj1uLmxlbmd0aDtyLS07KSJzdHJpbmciPT10eXBlb2YoaT1uW3JdKSYmKG9baChpKV09e3R5cGU6bnVsbH0pO2Vsc2UgaWYoZChuKSlmb3IodmFyIGEgaW4gbilpPW5bYV0sb1toKGEpXT1kKGkpP2k6e3R5cGU6aX07ZS5wcm9wcz1vfX0ociksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmluamVjdDtpZihuKXt2YXIgcj1lLmluamVjdD17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXJbbltpXV09e2Zyb206bltpXX07ZWxzZSBpZihkKG4pKWZvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO3Jbb109ZChhKT9CKHtmcm9tOm99LGEpOntmcm9tOmF9fX19KHIpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGlyZWN0aXZlcztpZih0KWZvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dOyJmdW5jdGlvbiI9PXR5cGVvZiByJiYodFtuXT17YmluZDpyLHVwZGF0ZTpyfSl9fShyKSwhci5fYmFzZSYmKHIuZXh0ZW5kcyYmKG49QWUobixyLmV4dGVuZHMsaSkpLHIubWl4aW5zKSlmb3IodmFyIGU9MCx0PXIubWl4aW5zLmxlbmd0aDtlPHQ7ZSsrKW49QWUobixyLm1peGluc1tlXSxpKTt2YXIgbyxhPXt9O2ZvcihvIGluIG4pcyhvKTtmb3IobyBpbiByKWYobixvKXx8cyhvKTtmdW5jdGlvbiBzKGUpe3ZhciB0PXhlW2VdfHxJZTthW2VdPXQobltlXSxyW2VdLGksZSl9cmV0dXJuIGF9ZnVuY3Rpb24gJGUoZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgaT1lW3RdO2lmKGYoaSxuKSlyZXR1cm4gaVtuXTt2YXIgbz1oKG4pO2lmKGYoaSxvKSlyZXR1cm4gaVtvXTt2YXIgYT12KG8pO3JldHVybiBmKGksYSk/aVthXTppW25dfHxpW29dfHxpW2FdfX1mdW5jdGlvbiBQZShlLHQsbixyKXt2YXIgaT10W2VdLG89IWYobixlKSxhPW5bZV0scz1MZShCb29sZWFuLGkudHlwZSk7aWYoLTE8cylpZihvJiYhZihpLCJkZWZhdWx0IikpYT0hMTtlbHNlIGlmKCIiPT09YXx8YT09PVMoZSkpe3ZhciBjPUxlKFN0cmluZyxpLnR5cGUpOyhjPDB8fHM8YykmJihhPSEwKX1pZih2b2lkIDA9PT1hKXthPWZ1bmN0aW9uKGUsdCxuKXtpZighZih0LCJkZWZhdWx0IikpcmV0dXJuO3ZhciByPXQuZGVmYXVsdDtpZihlJiZlLiRvcHRpb25zLnByb3BzRGF0YSYmdm9pZCAwPT09ZS4kb3B0aW9ucy5wcm9wc0RhdGFbbl0mJnZvaWQgMCE9PWUuX3Byb3BzW25dKXJldHVybiBlLl9wcm9wc1tuXTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgciYmIkZ1bmN0aW9uIiE9PU1lKHQudHlwZSk/ci5jYWxsKGUpOnJ9KHIsaSxlKTt2YXIgdT1tZTt5ZSghMCksYmUoYSkseWUodSl9cmV0dXJuIGF9ZnVuY3Rpb24gTWUoZSl7dmFyIHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gdD90WzFdOiIifWZ1bmN0aW9uIGplKGUsdCl7cmV0dXJuIE1lKGUpPT09TWUodCl9ZnVuY3Rpb24gTGUoZSx0KXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gamUodCxlKT8wOi0xO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZihqZSh0W25dLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIEJlKGUsdCxuKXtzZSgpO3RyeXtpZih0KWZvcih2YXIgcj10O3I9ci4kcGFyZW50Oyl7dmFyIGk9ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkO2lmKGkpZm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspdHJ5e2lmKCExPT09aVtvXS5jYWxsKHIsZSx0LG4pKXJldHVybn1jYXRjaChlKXtEZShlLHIsImVycm9yQ2FwdHVyZWQgaG9vayIpfX1EZShlLHQsbil9ZmluYWxseXtjZSgpfX1mdW5jdGlvbiBOZShlLHQsbixyLGkpe3ZhciBvO3RyeXsobz1uP2UuYXBwbHkodCxuKTplLmNhbGwodCkpJiYhby5faXNWdWUmJncobykmJiFvLl9oYW5kbGVkJiYoby5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gQmUoZSxyLGkrIiAoUHJvbWlzZS9hc3luYykiKX0pLG8uX2hhbmRsZWQ9ITApfWNhdGNoKGUpe0JlKGUscixpKX1yZXR1cm4gb31mdW5jdGlvbiBEZSh0LGUsbil7aWYoUi5lcnJvckhhbmRsZXIpdHJ5e3JldHVybiBSLmVycm9ySGFuZGxlci5jYWxsKG51bGwsdCxlLG4pfWNhdGNoKGUpe2UhPT10JiZSZShlLG51bGwsImNvbmZpZy5lcnJvckhhbmRsZXIiKX1SZSh0LGUsbil9ZnVuY3Rpb24gUmUoZSx0LG4pe2lmKCFxJiYhV3x8InVuZGVmaW5lZCI9PXR5cGVvZiBjb25zb2xlKXRocm93IGU7Y29uc29sZS5lcnJvcihlKX12YXIgRmU9W10sVWU9ITE7ZnVuY3Rpb24gemUoKXtVZT0hMTtmb3IodmFyIGU9RmUuc2xpY2UoMCksdD1GZS5sZW5ndGg9MDt0PGUubGVuZ3RoO3QrKyllW3RdKCl9dmFyIFZlPWZ1bmN0aW9uKCl7c2V0VGltZW91dCh6ZSwwKX07ZnVuY3Rpb24gcWUoZSx0KXt2YXIgbjtpZihGZS5wdXNoKGZ1bmN0aW9uKCl7aWYoZSl0cnl7ZS5jYWxsKHQpfWNhdGNoKGUpe0JlKGUsdCwibmV4dFRpY2siKX1lbHNlIG4mJm4odCl9KSxVZXx8KFVlPSEwLFZlKCkpLCFlJiYidW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe249ZX0pfXZhciBXZT1uZXcgbmU7ZnVuY3Rpb24gSGUoZSl7IWZ1bmN0aW9uIGUodCxuKXt2YXIgcixpO3ZhciBvPUFycmF5LmlzQXJyYXkodCk7aWYoIW8mJiFiKHQpfHxPYmplY3QuaXNGcm96ZW4odCl8fHQgaW5zdGFuY2VvZiB1ZSlyZXR1cm47aWYodC5fX29iX18pe3ZhciBhPXQuX19vYl9fLmRlcC5pZDtpZihuLmhhcyhhKSlyZXR1cm47bi5hZGQoYSl9aWYobylmb3Iocj10Lmxlbmd0aDtyLS07KWUodFtyXSxuKTtlbHNlIGZvcihpPU9iamVjdC5rZXlzKHQpLHI9aS5sZW5ndGg7ci0tOyllKHRbaVtyXV0sbil9KGUsV2UpLFdlLmNsZWFyKCl9dmFyIEdlPXUoZnVuY3Rpb24oZSl7dmFyIHQ9IiYiPT09ZS5jaGFyQXQoMCksbj0ifiI9PT0oZT10P2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApLHI9IiEiPT09KGU9bj9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKTtyZXR1cm57bmFtZTplPXI/ZS5zbGljZSgxKTplLG9uY2U6bixjYXB0dXJlOnIscGFzc2l2ZTp0fX0pO2Z1bmN0aW9uIFhlKGUsaSl7ZnVuY3Rpb24gbygpe3ZhciBlPWFyZ3VtZW50cyx0PW8uZm5zO2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBOZSh0LG51bGwsYXJndW1lbnRzLGksInYtb24gaGFuZGxlciIpO2Zvcih2YXIgbj10LnNsaWNlKCkscj0wO3I8bi5sZW5ndGg7cisrKU5lKG5bcl0sbnVsbCxlLGksInYtb24gaGFuZGxlciIpfXJldHVybiBvLmZucz1lLG99ZnVuY3Rpb24gSmUoZSx0LG4scixpLG8pe3ZhciBhLHMsYyx1LGw7Zm9yKGEgaW4gZSlzPWM9ZVthXSx1PXRbYV0sbD1HZShhKSxkKHMpJiYoYz1zLmhhbmRsZXIsbC5wYXJhbXM9cy5wYXJhbXMpLEUoYyl8fChFKHUpPyhFKGMuZm5zKSYmKGM9ZVthXT1YZShjLG8pKSxBKGwub25jZSkmJihjPWVbYV09aShsLm5hbWUsYyxsLmNhcHR1cmUpKSxuKGwubmFtZSxjLGwuY2FwdHVyZSxsLnBhc3NpdmUsbC5wYXJhbXMpKTpjIT09dSYmKHUuZm5zPWMsZVthXT11KSk7Zm9yKGEgaW4gdClFKGVbYV0pJiZyKChsPUdlKGEpKS5uYW1lLHRbYV0sbC5jYXB0dXJlKX1mdW5jdGlvbiBZZShlLHQsbil7dmFyIHI7ZSBpbnN0YW5jZW9mIHVlJiYoZT1lLmRhdGEuaG9va3x8KGUuZGF0YS5ob29rPXt9KSk7dmFyIGk9ZVt0XTtmdW5jdGlvbiBvKCl7bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksayhyLmZucyxvKX1FKGkpP3I9WGUoW29dKTpJKGkuZm5zKSYmQShpLm1lcmdlZCk/KHI9aSkuZm5zLnB1c2gobyk6cj1YZShbaSxvXSksci5tZXJnZWQ9ITAsZVt0XT1yfWZ1bmN0aW9uIEtlKGUsdCxuLHIsaSl7aWYoSSh0KSl7aWYoZih0LG4pKXJldHVybiBlW25dPXRbbl0saXx8ZGVsZXRlIHRbbl0sITA7aWYoZih0LHIpKXJldHVybiBlW25dPXRbcl0saXx8ZGVsZXRlIHRbcl0sITB9cmV0dXJuITF9ZnVuY3Rpb24gWmUoZSl7cmV0dXJuICQoZSk/W2ZlKGUpXTpBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uIGUodCxuKXt2YXIgcj1bXTt2YXIgaSxvLGEscztmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKUUobz10W2ldKXx8ImJvb2xlYW4iPT10eXBlb2Ygb3x8KGE9ci5sZW5ndGgtMSxzPXJbYV0sQXJyYXkuaXNBcnJheShvKT8wPG8ubGVuZ3RoJiYoUWUoKG89ZShvLChufHwiIikrIl8iK2kpKVswXSkmJlFlKHMpJiYoclthXT1mZShzLnRleHQrb1swXS50ZXh0KSxvLnNoaWZ0KCkpLHIucHVzaC5hcHBseShyLG8pKTokKG8pP1FlKHMpP3JbYV09ZmUocy50ZXh0K28pOiIiIT09byYmci5wdXNoKGZlKG8pKTpRZShvKSYmUWUocyk/clthXT1mZShzLnRleHQrby50ZXh0KTooQSh0Ll9pc1ZMaXN0KSYmSShvLnRhZykmJkUoby5rZXkpJiZJKG4pJiYoby5rZXk9Il9fdmxpc3QiK24rIl8iK2krIl9fIiksci5wdXNoKG8pKSk7cmV0dXJuIHJ9KGUpOnZvaWQgMH1mdW5jdGlvbiBRZShlKXtyZXR1cm4gSShlKSYmSShlLnRleHQpJiYhMT09PWUuaXNDb21tZW50fWZ1bmN0aW9uIGV0KGUpe3ZhciB0PWUuJG9wdGlvbnMucHJvdmlkZTt0JiYoZS5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKGUpOnQpfWZ1bmN0aW9uIHR0KHQpe3ZhciBuPW50KHQuJG9wdGlvbnMuaW5qZWN0LHQpO24mJih5ZSghMSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXt3ZSh0LGUsbltlXSl9KSx5ZSghMCkpfWZ1bmN0aW9uIG50KGUsdCl7aWYoZSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1yZT9SZWZsZWN0Lm93bktleXMoZSk6T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldO2lmKCJfX29iX18iIT09byl7Zm9yKHZhciBhPWVbb10uZnJvbSxzPXQ7czspe2lmKHMuX3Byb3ZpZGVkJiZmKHMuX3Byb3ZpZGVkLGEpKXtuW29dPXMuX3Byb3ZpZGVkW2FdO2JyZWFrfXM9cy4kcGFyZW50fWlmKCFzJiYiZGVmYXVsdCJpbiBlW29dKXt2YXIgYz1lW29dLmRlZmF1bHQ7bltvXT0iZnVuY3Rpb24iPT10eXBlb2YgYz9jLmNhbGwodCk6Y319fXJldHVybiBufX1mdW5jdGlvbiBydChlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl0sYT1vLmRhdGE7aWYoYSYmYS5hdHRycyYmYS5hdHRycy5zbG90JiZkZWxldGUgYS5hdHRycy5zbG90LG8uY29udGV4dCE9PXQmJm8uZm5Db250ZXh0IT09dHx8IWF8fG51bGw9PWEuc2xvdClvLmFzeW5jTWV0YSYmby5hc3luY01ldGEuZGF0YSYmInBhZ2UiPT09by5hc3luY01ldGEuZGF0YS5zbG90PyhuLnBhZ2V8fChuLnBhZ2U9W10pKS5wdXNoKG8pOihuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKG8pO2Vsc2V7dmFyIHM9YS5zbG90LGM9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KGl0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gaXQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBvdChlLHQsbil7dmFyIHIsaT0wPE9iamVjdC5rZXlzKHQpLmxlbmd0aCxvPWU/ISFlLiRzdGFibGU6IWksYT1lJiZlLiRrZXk7aWYoZSl7aWYoZS5fbm9ybWFsaXplZClyZXR1cm4gZS5fbm9ybWFsaXplZDtpZihvJiZuJiZuIT09XyYmYT09PW4uJGtleSYmIWkmJiFuLiRoYXNOb3JtYWwpcmV0dXJuIG47Zm9yKHZhciBzIGluIHI9e30sZSllW3NdJiYiJCIhPT1zWzBdJiYocltzXT1hdCh0LHMsZVtzXSkpfWVsc2Ugcj17fTtmb3IodmFyIGMgaW4gdCljIGluIHJ8fChyW2NdPXN0KHQsYykpO3JldHVybiBlJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYoZS5fbm9ybWFsaXplZD1yKSxGKHIsIiRzdGFibGUiLG8pLEYociwiJGtleSIsYSksRihyLCIkaGFzTm9ybWFsIixpKSxyfWZ1bmN0aW9uIGF0KGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg/bi5hcHBseShudWxsLGFyZ3VtZW50cyk6bih7fSk7cmV0dXJuKGU9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYhQXJyYXkuaXNBcnJheShlKT9bZV06WmUoZSkpJiYoMD09PWUubGVuZ3RofHwxPT09ZS5sZW5ndGgmJmVbMF0uaXNDb21tZW50KT92b2lkIDA6ZX07cmV0dXJuIG4ucHJveHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSkscn1mdW5jdGlvbiBzdChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3RdfX1mdW5jdGlvbiBjdChlLHQpe3ZhciBuLHIsaSxvLGE7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluW3JdPXQoZVtyXSxyKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspbltyXT10KHIrMSxyKTtlbHNlIGlmKGIoZSkpaWYocmUmJmVbU3ltYm9sLml0ZXJhdG9yXSl7bj1bXTtmb3IodmFyIHM9ZVtTeW1ib2wuaXRlcmF0b3JdKCksYz1zLm5leHQoKTshYy5kb25lOyluLnB1c2godChjLnZhbHVlLG4ubGVuZ3RoKSksYz1zLm5leHQoKX1lbHNlIGZvcihvPU9iamVjdC5rZXlzKGUpLG49bmV3IEFycmF5KG8ubGVuZ3RoKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKWE9b1tyXSxuW3JdPXQoZVthXSxhLHIpO3JldHVybiBJKG4pfHwobj1bXSksbi5faXNWTGlzdD0hMCxufWZ1bmN0aW9uIHV0KGUsdCxuLHIpe3ZhciBpLG89dGhpcy4kc2NvcGVkU2xvdHNbZV07bz8obj1ufHx7fSxyJiYobj1CKEIoe30sciksbikpLGk9byhuKXx8dCk6aT10aGlzLiRzbG90c1tlXXx8dDt2YXIgYT1uJiZuLnNsb3Q7cmV0dXJuIGE/dGhpcy4kY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiLHtzbG90OmF9LGkpOml9ZnVuY3Rpb24gbHQoZSl7cmV0dXJuICRlKHRoaXMuJG9wdGlvbnMsImZpbHRlcnMiLGUpfHxUfWZ1bmN0aW9uIGR0KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE9PT1lLmluZGV4T2YodCk6ZSE9PXR9ZnVuY3Rpb24gZnQoZSx0LG4scixpKXt2YXIgbz1SLmtleUNvZGVzW3RdfHxuO3JldHVybiBpJiZyJiYhUi5rZXlDb2Rlc1t0XT9kdChpLHIpOm8/ZHQobyxlKTpyP1MocikhPT10OnZvaWQgMH1mdW5jdGlvbiBwdChpLG8sYSxzLGMpe2lmKGEpaWYoYihhKSl7dmFyIHU7QXJyYXkuaXNBcnJheShhKSYmKGE9eChhKSk7dmFyIGU9ZnVuY3Rpb24odCl7aWYoImNsYXNzIj09PXR8fCJzdHlsZSI9PT10fHxsKHQpKXU9aTtlbHNle3ZhciBlPWkuYXR0cnMmJmkuYXR0cnMudHlwZTt1PXN8fFIubXVzdFVzZVByb3AobyxlLHQpP2kuZG9tUHJvcHN8fChpLmRvbVByb3BzPXt9KTppLmF0dHJzfHwoaS5hdHRycz17fSl9dmFyIG49aCh0KSxyPVModCk7biBpbiB1fHxyIGluIHV8fCh1W3RdPWFbdF0sYyYmKChpLm9ufHwoaS5vbj17fSkpWyJ1cGRhdGU6Iit0XT1mdW5jdGlvbihlKXthW3RdPWV9KSl9O2Zvcih2YXIgdCBpbiBhKWUodCl9ZWxzZTtyZXR1cm4gaX1mdW5jdGlvbiBodChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXR8fGd0KHI9bltlXT10aGlzLiRvcHRpb25zLnN0YXRpY1JlbmRlckZuc1tlXS5jYWxsKHRoaXMuX3JlbmRlclByb3h5LG51bGwsdGhpcyksIl9fc3RhdGljX18iK2UsITEpLHJ9ZnVuY3Rpb24gdnQoZSx0LG4pe3JldHVybiBndChlLCJfX29uY2VfXyIrdCsobj8iXyIrbjoiIiksITApLGV9ZnVuY3Rpb24gZ3QoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmInN0cmluZyIhPXR5cGVvZiBlW3JdJiZtdChlW3JdLHQrIl8iK3Isbik7ZWxzZSBtdChlLHQsbil9ZnVuY3Rpb24gbXQoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIHl0KGUsdCl7aWYodClpZihkKHQpKXt2YXIgbj1lLm9uPWUub24/Qih7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2U7cmV0dXJuIGV9ZnVuY3Rpb24gX3QoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9fdChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIGJ0KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dOyJzdHJpbmciPT10eXBlb2YgciYmciYmKGVbdFtuXV09dFtuKzFdKX1yZXR1cm4gZX1mdW5jdGlvbiB3dChlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90K2U6ZX1mdW5jdGlvbiBrdChlKXtlLl9vPXZ0LGUuX249byxlLl9zPW4sZS5fbD1jdCxlLl90PXV0LGUuX3E9TyxlLl9pPVAsZS5fbT1odCxlLl9mPWx0LGUuX2s9ZnQsZS5fYj1wdCxlLl92PWZlLGUuX2U9ZGUsZS5fdT1fdCxlLl9nPXl0LGUuX2Q9YnQsZS5fcD13dH1mdW5jdGlvbiBTdChlLHQsbixvLHIpe3ZhciBhLGk9dGhpcyxzPXIub3B0aW9ucztmKG8sIl91aWQiKT8oYT1PYmplY3QuY3JlYXRlKG8pKS5fb3JpZ2luYWw9bzpvPShhPW8pLl9vcmlnaW5hbDt2YXIgYz1BKHMuX2NvbXBpbGVkKSx1PSFjO3RoaXMuZGF0YT1lLHRoaXMucHJvcHM9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy5wYXJlbnQ9byx0aGlzLmxpc3RlbmVycz1lLm9ufHxfLHRoaXMuaW5qZWN0aW9ucz1udChzLmluamVjdCxvKSx0aGlzLnNsb3RzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuJHNsb3RzfHxvdChlLnNjb3BlZFNsb3RzLGkuJHNsb3RzPXJ0KG4sbykpLGkuJHNsb3RzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2NvcGVkU2xvdHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvdChlLnNjb3BlZFNsb3RzLHRoaXMuc2xvdHMoKSl9fSksYyYmKHRoaXMuJG9wdGlvbnM9cyx0aGlzLiRzbG90cz10aGlzLnNsb3RzKCksdGhpcy4kc2NvcGVkU2xvdHM9b3QoZS5zY29wZWRTbG90cyx0aGlzLiRzbG90cykpLHMuX3Njb3BlSWQ/dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1WdChhLGUsdCxuLHIsdSk7cmV0dXJuIGkmJiFBcnJheS5pc0FycmF5KGkpJiYoaS5mblNjb3BlSWQ9cy5fc2NvcGVJZCxpLmZuQ29udGV4dD1vKSxpfTp0aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBWdChhLGUsdCxuLHIsdSl9fWZ1bmN0aW9uIHh0KGUsdCxuLHIsaSl7dmFyIG89cGUoZSk7cmV0dXJuIG8uZm5Db250ZXh0PW4sby5mbk9wdGlvbnM9cix0LnNsb3QmJigoby5kYXRhfHwoby5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLG99ZnVuY3Rpb24gQ3QoZSx0KXtmb3IodmFyIG4gaW4gdCllW2gobildPXRbbl19a3QoU3QucHJvdG90eXBlKTt2YXIgVHQ9IkBpblJlY3ljbGVMaXN0IjtmdW5jdGlvbiBPdChlLHQsbixyKXtpZihhJiZhLnRhc2tDZW50ZXIpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGEudGFza0NlbnRlci5yZWdpc3Rlckhvb2s/YS50YXNrQ2VudGVyLnJlZ2lzdGVySG9vayhlLHQsbixyKTp2b2lkIDB9ZnVuY3Rpb24gRXQoZSxuLHQpe2lmKGIobikpaWYodCllLiRyZWZzPXt9O2Vsc2V7dmFyIHI9ZS4kcmVmc3x8e307T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1uW2VdO3JbZV09MT09PXQubGVuZ3RoP3RbMF06dH0pLGUuJHJlZnM9cn19ZnVuY3Rpb24gSXQoZSxuLHIsdCl7aWYoYihyKSl7dmFyIGk9ZS4kcmVmc3x8e307dD9PYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZV07aVtlXSYmKDE9PT10Lmxlbmd0aCYmQXJyYXkuaXNBcnJheShpW2VdKT9kZWxldGUgaVtlXVtuXTpkZWxldGUgaVtlXSl9KTooT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdOzE9PT10Lmxlbmd0aD8oQXJyYXkuaXNBcnJheShpW2VdKXx8KGlbZV09W10pLGlbZV1bbl09dFswXSk6aVtlXT10fSksZS4kcmVmcz1pKX19dmFyIEF0PTA7ZnVuY3Rpb24gJHQoZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhLG49ZS4kb3B0aW9ucy5jb21wdXRlZHx8e30scj1lLl9kYXRhP09iamVjdC5hc3NpZ24oe30sZS5fZGF0YSk6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/d24odCxlKTp0fHx7fSxpPXt9O2Zvcih2YXIgbyBpbiBuKWlbb109ZVtvXTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyLGkpfWZ1bmN0aW9uIFB0KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgcj10aGlzLHQ9ZS5jb21wb25lbnRJZDtGKHIsIl92bVRlbXBsYXRlIixlLnZtVGVtcGxhdGUpLHIuX3VpZD10fHwidmlydHVhbC1jb21wb25lbnQtIitBdCsrLHIuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P0xuKHIsZSk6ci4kb3B0aW9ucz1BZShCbihyLmNvbnN0cnVjdG9yKSxlfHx7fSxyKSxubigoci5fcmVuZGVyUHJveHk9cikuX3NlbGY9ciksWXQocikscXQociksYW4ociwiYmVmb3JlQ3JlYXRlIiksdHQociksYm4ociksZXQociksYW4ociwiY3JlYXRlZCIpLE90KHQsImxpZmVjeWNsZSIsImF0dGFjaCIsZnVuY3Rpb24oZSl7RXQocixlJiZlLnJlZnMpLGFuKHIsImJlZm9yZU1vdW50IiksbmV3IG1uKHIsZnVuY3Rpb24oKXtyZXR1cm4gJHQocil9LGZ1bmN0aW9uKCl7cmV0dXJuIHIuX3VwZGF0ZShyLl92bm9kZSwhMSl9KSxyLl9pc01vdW50ZWQ9ITAsYW4ociwibW91bnRlZCIpfSksT3QodCwibGlmZWN5Y2xlIiwidXBkYXRlIixmdW5jdGlvbihlKXtFdChyLGUmJmUucmVmcyksci5fdXBkYXRlKHIuX3Zub2RlLCExKX0pLE90KHQsImxpZmVjeWNsZSIsInN5bmNTdGF0ZSIsZnVuY3Rpb24oZSx0KXtpZihkKHQpKWZvcih2YXIgbiBpbiB0KXJbbl09dFtuXTtyZXR1cm4gJHQocil9KSxPdCh0LCJsaWZlY3ljbGUiLCJkZXRhY2giLGZ1bmN0aW9uKGUpe0V0KHIsZSYmZS5yZWZzLCEwKSxyLiRkZXN0cm95KCksci5fdm1UZW1wbGF0ZSYmKHIuX3ZtVGVtcGxhdGUucmVtb3ZlVmlydHVhbENvbXBvbmVudChyLl91aWQpLGRlbGV0ZSByLl92bVRlbXBsYXRlKX0pfWZ1bmN0aW9uIE10KGUpe3ZhciB0PXRoaXMsbj10LiRvcHRpb25zLmNvbXBvbmVudElkOyh0Ll9pc01vdW50ZWQmJmFuKHQsImJlZm9yZVVwZGF0ZSIpLHQuX3Zub2RlPWUsdC5faXNNb3VudGVkJiZuKSYmZnVuY3Rpb24oZSx0LG4pe2lmKGEmJmEudGFza0NlbnRlcikiZnVuY3Rpb24iPT10eXBlb2YgYS50YXNrQ2VudGVyLnVwZGF0ZURhdGEmJmEudGFza0NlbnRlci51cGRhdGVEYXRhKGUsdCxuKX0obiwkdCh0KSxmdW5jdGlvbigpe2FuKHQsInVwZGF0ZWQiKX0pfWZ1bmN0aW9uIGp0KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD10aGlzO3QuX3VpZD0idmlydHVhbC1jb21wb25lbnQtdGVtcGxhdGUtIitBdCsrLHQuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P0xuKHQsZSk6dC4kb3B0aW9ucz1BZShCbih0LmNvbnN0cnVjdG9yKSxlfHx7fSx0KSxZdCh0Ll9zZWxmPXQpLHF0KHQpLGJuKHQpLHRoaXMucmVnaXN0ZXJWaXJ0dWFsQ29tcG9uZW50KCl9ZnVuY3Rpb24gTHQoZSl7dmFyIHQsbixpLG87ZGVsZXRlIGUuZGF0YS5hdHRyc1tUdF0sbj0odD1lKS5jb21wb25lbnRPcHRpb25zLkN0b3IsaT1uLmV4dGVuZCh7fSksbz1pLnByb3RvdHlwZS4kZW1pdCxpLnByb3RvdHlwZS5faW5pdD1QdCxpLnByb3RvdHlwZS5fdXBkYXRlPU10LGkucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcj10aGlzLl91aWQsaT10aGlzLl92bVRlbXBsYXRlO3JldHVybiByJiZpJiYodC5wdXNoKHIpLG8uYXBwbHkoaSx0KSksby5hcHBseSh0aGlzLHQpfSx0LmNvbXBvbmVudE9wdGlvbnMuQ3Rvcj1uLmV4dGVuZCh7bWV0aG9kczp7cmVnaXN0ZXJWaXJ0dWFsQ29tcG9uZW50OmZ1bmN0aW9uKCl7dmFyIHI9dGhpcztGKHIsIl92aXJ0dWFsQ29tcG9uZW50cyIse30pLE90KFN0cmluZyhyLl91aWQpLCJsaWZlY3ljbGUiLCJjcmVhdGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGkoe3ZtVGVtcGxhdGU6cixjb21wb25lbnRJZDplLHByb3BzRGF0YTp0fSk7cmV0dXJuIG4uX3VpZD1lLHIuX3ZpcnR1YWxDb21wb25lbnRzJiYoci5fdmlydHVhbENvbXBvbmVudHNbZV09biksJHQobil9KX0scmVtb3ZlVmlydHVhbENvbXBvbmVudDpmdW5jdGlvbihlKXtkZWxldGUgdGhpcy5fdmlydHVhbENvbXBvbmVudHNbZV19fSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fdmlydHVhbENvbXBvbmVudHN9fSksdC5jb21wb25lbnRPcHRpb25zLkN0b3IucHJvdG90eXBlLl9pbml0PWp0LHQuY29tcG9uZW50T3B0aW9ucy5DdG9yLnByb3RvdHlwZS5fdXBkYXRlPU47dmFyIHI9UnQoZSksYT1yLiRvcHRpb25zWyJAcmVuZGVyIl07aWYoYSl0cnl7cmV0dXJuIGEuY2FsbChyKX1jYXRjaChlKXtCZShlLHIsIkByZW5kZXIiKX19dmFyIEJ0PXtpbml0OmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUuY29tcG9uZW50SW5zdGFuY2UmJiFlLmNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCYmZS5kYXRhLmtlZXBBbGl2ZSl7dmFyIGk9ZTtCdC5wcmVwYXRjaChpLGkpfWVsc2V7KGUuY29tcG9uZW50SW5zdGFuY2U9UnQoZSx0bixuLHIpKS4kbW91bnQodD9lLmVsbTp2b2lkIDAsdCl9fSxwcmVwYXRjaDpmdW5jdGlvbihlLHQpe3ZhciBuPXQuY29tcG9uZW50T3B0aW9uczshZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1yLmRhdGEuc2NvcGVkU2xvdHMsYT1lLiRzY29wZWRTbG90cyxzPSEhKG8mJiFvLiRzdGFibGV8fGEhPT1fJiYhYS4kc3RhYmxlfHxvJiZlLiRzY29wZWRTbG90cy4ka2V5IT09by4ka2V5KSxjPSEhKGl8fGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVufHxzKTtlLiRvcHRpb25zLl9wYXJlbnRWbm9kZT1yLGUuJHZub2RlPXIsZS5fdm5vZGUmJihlLl92bm9kZS5wYXJlbnQ9cik7aWYoZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW49aSxlLiRhdHRycz1yLmRhdGEuYXR0cnN8fF8sZS4kbGlzdGVuZXJzPW58fF8sdCYmZS4kb3B0aW9ucy5wcm9wcyl7eWUoITEpO2Zvcih2YXIgdT1lLl9wcm9wcyxsPWUuJG9wdGlvbnMuX3Byb3BLZXlzfHxbXSxkPTA7ZDxsLmxlbmd0aDtkKyspe3ZhciBmPWxbZF0scD1lLiRvcHRpb25zLnByb3BzO3VbZl09UGUoZixwLHQsZSl9eWUoITApLGUuJG9wdGlvbnMucHJvcHNEYXRhPXR9bj1ufHxfO3ZhciBoPWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztlLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM9bixlbihlLG4saCksYyYmKGUuJHNsb3RzPXJ0KGksci5jb250ZXh0KSxlLiRmb3JjZVVwZGF0ZSgpKX0odC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlLG4ucHJvcHNEYXRhLG4ubGlzdGVuZXJzLHQsbi5jaGlsZHJlbil9LGluc2VydDpmdW5jdGlvbihlKXt2YXIgdCxuPWUuY29udGV4dCxyPWUuY29tcG9uZW50SW5zdGFuY2U7ci5faXNNb3VudGVkfHwoci5faXNNb3VudGVkPSEwLGFuKHIsIm1vdW50ZWQiKSksZS5kYXRhLmtlZXBBbGl2ZSYmKG4uX2lzTW91bnRlZD8oKHQ9cikuX2luYWN0aXZlPSExLGNuLnB1c2godCkpOm9uKHIsITApKX0sZGVzdHJveTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbXBvbmVudEluc3RhbmNlO3QuX2lzRGVzdHJveWVkfHwoZS5kYXRhLmtlZXBBbGl2ZT9mdW5jdGlvbiBlKHQsbil7aWYobiYmKHQuX2RpcmVjdEluYWN0aXZlPSEwLHJuKHQpKSlyZXR1cm47aWYoIXQuX2luYWN0aXZlKXt0Ll9pbmFjdGl2ZT0hMDtmb3IodmFyIHI9MDtyPHQuJGNoaWxkcmVuLmxlbmd0aDtyKyspZSh0LiRjaGlsZHJlbltyXSk7YW4odCwiZGVhY3RpdmF0ZWQiKX19KHQsITApOnQuJGRlc3Ryb3koKSl9fSxOdD1PYmplY3Qua2V5cyhCdCk7ZnVuY3Rpb24gRHQoZSx0LG4scixpKXtpZighRShlKSl7dmFyIG89bi4kb3B0aW9ucy5fYmFzZTtpZihiKGUpJiYoZT1vLmV4dGVuZChlKSksImZ1bmN0aW9uIj09dHlwZW9mIGUpe3ZhciBhLHMsYyx1LGwsZCxmO2lmKEUoZS5jaWQpJiZ2b2lkIDA9PT0oZT1mdW5jdGlvbih0LG4pe2lmKEEodC5lcnJvcikmJkkodC5lcnJvckNvbXApKXJldHVybiB0LmVycm9yQ29tcDtpZihJKHQucmVzb2x2ZWQpKXJldHVybiB0LnJlc29sdmVkO3ZhciBlPUh0O2UmJkkodC5vd25lcnMpJiYtMT09PXQub3duZXJzLmluZGV4T2YoZSkmJnQub3duZXJzLnB1c2goZSk7aWYoQSh0LmxvYWRpbmcpJiZJKHQubG9hZGluZ0NvbXApKXJldHVybiB0LmxvYWRpbmdDb21wO2lmKGUmJiFJKHQub3duZXJzKSl7dmFyIHI9dC5vd25lcnM9W2VdLGk9ITAsbz1udWxsLGE9bnVsbDtlLiRvbigiaG9vazpkZXN0cm95ZWQiLGZ1bmN0aW9uKCl7cmV0dXJuIGsocixlKX0pO3ZhciBzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ci5sZW5ndGg7dDxuO3QrKylyW3RdLiRmb3JjZVVwZGF0ZSgpO2UmJihyLmxlbmd0aD0wLG51bGwhPT1vJiYoY2xlYXJUaW1lb3V0KG8pLG89bnVsbCksbnVsbCE9PWEmJihjbGVhclRpbWVvdXQoYSksYT1udWxsKSl9LGM9RChmdW5jdGlvbihlKXt0LnJlc29sdmVkPUd0KGUsbiksaT9yLmxlbmd0aD0wOnMoITApfSksdT1EKGZ1bmN0aW9uKGUpe0kodC5lcnJvckNvbXApJiYodC5lcnJvcj0hMCxzKCEwKSl9KSxsPXQoYyx1KTtyZXR1cm4gYihsKSYmKHcobCk/RSh0LnJlc29sdmVkKSYmbC50aGVuKGMsdSk6dyhsLmNvbXBvbmVudCkmJihsLmNvbXBvbmVudC50aGVuKGMsdSksSShsLmVycm9yKSYmKHQuZXJyb3JDb21wPUd0KGwuZXJyb3IsbikpLEkobC5sb2FkaW5nKSYmKHQubG9hZGluZ0NvbXA9R3QobC5sb2FkaW5nLG4pLDA9PT1sLmRlbGF5P3QubG9hZGluZz0hMDpvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvPW51bGwsRSh0LnJlc29sdmVkKSYmRSh0LmVycm9yKSYmKHQubG9hZGluZz0hMCxzKCExKSl9LGwuZGVsYXl8fDIwMCkpLEkobC50aW1lb3V0KSYmKGE9c2V0VGltZW91dChmdW5jdGlvbigpe2E9bnVsbCxFKHQucmVzb2x2ZWQpJiZ1KG51bGwpfSxsLnRpbWVvdXQpKSkpLGk9ITEsdC5sb2FkaW5nP3QubG9hZGluZ0NvbXA6dC5yZXNvbHZlZH19KGE9ZSxvKSkpcmV0dXJuIHM9YSxjPXQsdT1uLGw9cixkPWksKGY9ZGUoKSkuYXN5bmNGYWN0b3J5PXMsZi5hc3luY01ldGE9e2RhdGE6Yyxjb250ZXh0OnUsY2hpbGRyZW46bCx0YWc6ZH0sZjt0PXR8fHt9LEJuKGUpLEkodC5tb2RlbCkmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5tb2RlbCYmZS5tb2RlbC5wcm9wfHwidmFsdWUiLHI9ZS5tb2RlbCYmZS5tb2RlbC5ldmVudHx8ImlucHV0IjsodC5hdHRyc3x8KHQuYXR0cnM9e30pKVtuXT10Lm1vZGVsLnZhbHVlO3ZhciBpPXQub258fCh0Lm9uPXt9KSxvPWlbcl0sYT10Lm1vZGVsLmNhbGxiYWNrO0kobyk/KEFycmF5LmlzQXJyYXkobyk/LTE9PT1vLmluZGV4T2YoYSk6byE9PWEpJiYoaVtyXT1bYV0uY29uY2F0KG8pKTppW3JdPWF9KGUub3B0aW9ucyx0KTt2YXIgcD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5vcHRpb25zLnByb3BzO2lmKCFFKHIpKXt2YXIgaT17fSxvPWUuYXR0cnMsYT1lLnByb3BzO2lmKEkobyl8fEkoYSkpZm9yKHZhciBzIGluIHIpe3ZhciBjPVMocyk7S2UoaSxhLHMsYywhMCl8fEtlKGksbyxzLGMsITEpfXJldHVybiBpfX0odCxlKTtpZihBKGUub3B0aW9ucy5mdW5jdGlvbmFsKSlyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1lLm9wdGlvbnMsYT17fSxzPW8ucHJvcHM7aWYoSShzKSlmb3IodmFyIGMgaW4gcylhW2NdPVBlKGMscyx0fHxfKTtlbHNlIEkobi5hdHRycykmJkN0KGEsbi5hdHRycyksSShuLnByb3BzKSYmQ3QoYSxuLnByb3BzKTt2YXIgdT1uZXcgU3QobixhLGkscixlKSxsPW8ucmVuZGVyLmNhbGwobnVsbCx1Ll9jLHUpO2lmKGwgaW5zdGFuY2VvZiB1ZSlyZXR1cm4geHQobCxuLHUucGFyZW50LG8pO2lmKEFycmF5LmlzQXJyYXkobCkpe2Zvcih2YXIgZD1aZShsKXx8W10sZj1uZXcgQXJyYXkoZC5sZW5ndGgpLHA9MDtwPGQubGVuZ3RoO3ArKylmW3BdPXh0KGRbcF0sbix1LnBhcmVudCxvKTtyZXR1cm4gZn19KGUscCx0LG4scik7dmFyIGg9dC5vbjtpZih0Lm9uPXQubmF0aXZlT24sQShlLm9wdGlvbnMuYWJzdHJhY3QpKXt2YXIgdj10LnNsb3Q7dD17fSx2JiYodC5zbG90PXYpfSFmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5ob29rfHwoZS5ob29rPXt9KSxuPTA7bjxOdC5sZW5ndGg7bisrKXt2YXIgcj1OdFtuXSxpPXRbcl0sbz1CdFtyXTtpPT09b3x8aSYmaS5fbWVyZ2VkfHwodFtyXT1pP0Z0KG8saSk6byl9fSh0KTt2YXIgZyxtPWUub3B0aW9ucy5uYW1lfHxpLHk9bmV3IHVlKCJ2dWUtY29tcG9uZW50LSIrZS5jaWQrKG0/Ii0iK206IiIpLHQsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbix7Q3RvcjplLHByb3BzRGF0YTpwLGxpc3RlbmVyczpoLHRhZzppLGNoaWxkcmVuOnJ9LGEpO3JldHVybihnPXkpLmRhdGEuYXR0cnMmJlR0IGluIGcuZGF0YS5hdHRycz9MdCh5KTp5fX19ZnVuY3Rpb24gUnQoZSx0LG4scil7dmFyIGk9e19pc0NvbXBvbmVudDohMCxfcGFyZW50Vm5vZGU6ZSxwYXJlbnQ6dCxfcGFyZW50RWxtOm58fG51bGwsX3JlZkVsbTpyfHxudWxsfSxvPWUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtyZXR1cm4gSShvKSYmKGkucmVuZGVyPW8ucmVuZGVyLGkuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zKSxuZXcgZS5jb21wb25lbnRPcHRpb25zLkN0b3IoaSl9ZnVuY3Rpb24gRnQobixyKXt2YXIgZT1mdW5jdGlvbihlLHQpe24oZSx0KSxyKGUsdCl9O3JldHVybiBlLl9tZXJnZWQ9ITAsZX12YXIgVXQ9MSx6dD0yO2Z1bmN0aW9uIFZ0KGUsdCxuLHIsaSxvKXtyZXR1cm4oQXJyYXkuaXNBcnJheShuKXx8JChuKSkmJihpPXIscj1uLG49dm9pZCAwKSxBKG8pJiYoaT16dCksZnVuY3Rpb24oZSx0LG4scixpKXtpZihJKG4pJiZJKG4uX19vYl9fKSlyZXR1cm4gZGUoKTtJKG4pJiZJKG4uaXMpJiYodD1uLmlzKTtpZighdClyZXR1cm4gZGUoKTtBcnJheS5pc0FycmF5KHIpJiYiZnVuY3Rpb24iPT10eXBlb2YgclswXSYmKChuPW58fHt9KS5zY29wZWRTbG90cz17ZGVmYXVsdDpyWzBdfSxyLmxlbmd0aD0wKTtpPT09enQ/cj1aZShyKTppPT09VXQmJihyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKEFycmF5LmlzQXJyYXkoZVt0XSkpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSk7cmV0dXJuIGV9KHIpKTt2YXIgbyxhO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHM7YT1lLiR2bm9kZSYmZS4kdm5vZGUubnN8fFIuZ2V0VGFnTmFtZXNwYWNlKHQpLG89Ui5pc1Jlc2VydmVkVGFnKHQpP25ldyB1ZShSLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHQpLG4scix2b2lkIDAsdm9pZCAwLGUpOm4mJm4ucHJlfHwhSShzPSRlKGUuJG9wdGlvbnMsImNvbXBvbmVudHMiLHQpKT9uZXcgdWUodCxuLHIsdm9pZCAwLHZvaWQgMCxlKTpEdChzLG4sZSxyLHQpfWVsc2Ugbz1EdCh0LG4sZSxyKTtyZXR1cm4gQXJyYXkuaXNBcnJheShvKT9vOkkobyk/KEkoYSkmJmZ1bmN0aW9uIGUodCxuLHIpe3QubnM9bjsiZm9yZWlnbk9iamVjdCI9PT10LnRhZyYmKHI9IShuPXZvaWQgMCkpO2lmKEkodC5jaGlsZHJlbikpZm9yKHZhciBpPTAsbz10LmNoaWxkcmVuLmxlbmd0aDtpPG87aSsrKXt2YXIgYT10LmNoaWxkcmVuW2ldO0koYS50YWcpJiYoRShhLm5zKXx8QShyKSYmInN2ZyIhPT1hLnRhZykmJmUoYSxuLHIpfX0obyxhKSxJKG4pJiZmdW5jdGlvbihlKXtiKGUuc3R5bGUpJiZIZShlLnN0eWxlKTtiKGUuY2xhc3MpJiZIZShlLmNsYXNzKX0obiksbyk6ZGUoKX0oZSx0LG4scixpKX1mdW5jdGlvbiBxdChpKXtpLl92bm9kZT1udWxsLGkuX3N0YXRpY1RyZWVzPW51bGw7dmFyIGU9aS4kb3B0aW9ucyx0PWkuJHZub2RlPWUuX3BhcmVudFZub2RlLG49dCYmdC5jb250ZXh0O2kuJHNsb3RzPXJ0KGUuX3JlbmRlckNoaWxkcmVuLG4pLGkuJHNjb3BlZFNsb3RzPV8saS5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVnQoaSxlLHQsbixyLCExKX0saS4kY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVnQoaSxlLHQsbixyLCEwKX07dmFyIHI9dCYmdC5kYXRhO3dlKGksIiRhdHRycyIsciYmci5hdHRyc3x8XyxudWxsLCEwKSx3ZShpLCIkbGlzdGVuZXJzIixlLl9wYXJlbnRMaXN0ZW5lcnN8fF8sbnVsbCwhMCl9dmFyIFd0LEh0PW51bGw7ZnVuY3Rpb24gR3QoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHxyZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLGIoZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBYdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIEp0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07aWYoSShuKSYmKEkobi5jb21wb25lbnRPcHRpb25zKXx8WHQobikpKXJldHVybiBufX1mdW5jdGlvbiBZdChlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJmVuKGUsdCl9ZnVuY3Rpb24gS3QoZSx0KXtXdC4kb24oZSx0KX1mdW5jdGlvbiBadChlLHQpe1d0LiRvZmYoZSx0KX1mdW5jdGlvbiBRdCh0LG4pe3ZhciByPVd0O3JldHVybiBmdW5jdGlvbiBlKCl7bnVsbCE9PW4uYXBwbHkobnVsbCxhcmd1bWVudHMpJiZyLiRvZmYodCxlKX19ZnVuY3Rpb24gZW4oZSx0LG4pe0plKHQsbnx8e30sS3QsWnQsUXQsV3Q9ZSksV3Q9dm9pZCAwfXZhciB0bj1udWxsO2Z1bmN0aW9uIG5uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfWZ1bmN0aW9uIHJuKGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gb24oZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxybihlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKW9uKGUuJGNoaWxkcmVuW25dKTthbihlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gYW4oZSx0KXtzZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspTmUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxjZSgpfXZhciBzbj1bXSxjbj1bXSx1bj17fSxsbj0hMSxkbj0hMSxmbj0wO3ZhciBwbj1EYXRlLm5vdztpZihxJiYhWCl7dmFyIGhuPXdpbmRvdy5wZXJmb3JtYW5jZTtobiYmImZ1bmN0aW9uIj09dHlwZW9mIGhuLm5vdyYmcG4oKT5hLmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKHBuPWZ1bmN0aW9uKCl7cmV0dXJuIGhuLm5vdygpfSl9ZnVuY3Rpb24gdm4oKXt2YXIgZSx0O2ZvcihwbigpLGRuPSEwLHNuLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksZm49MDtmbjxzbi5sZW5ndGg7Zm4rKykoZT1zbltmbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsdW5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPWNuLnNsaWNlKCkscj1zbi5zbGljZSgpO2ZuPXNuLmxlbmd0aD1jbi5sZW5ndGg9MCxsbj1kbj0hKHVuPXt9KSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxvbihlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJmFuKHIsInVwZGF0ZWQiKX19KHIpLGVlJiZSLmRldnRvb2xzJiZlZS5lbWl0KCJmbHVzaCIpfXZhciBnbj0wLG1uPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9Kytnbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBuZSx0aGlzLm5ld0RlcElkcz1uZXcgbmUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFVLnRlc3QoZSkpe3ZhciBuPWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe2lmKCFlKXJldHVybjtlPWVbblt0XV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1OKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O21uLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtzZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7QmUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJkhlKGUpLGNlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxtbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxtbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LG1uLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PXVuW3RdKXtpZih1blt0XT0hMCxkbil7Zm9yKHZhciBuPXNuLmxlbmd0aC0xO2ZuPG4mJnNuW25dLmlkPmUuaWQ7KW4tLTtzbi5zcGxpY2UobisxLDAsZSl9ZWxzZSBzbi5wdXNoKGUpO2xufHwobG49ITAscWUodm4pKX19KHRoaXMpfSxtbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fGIoZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe0JlKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LG1uLnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxtbi5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LG1uLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxrKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciB5bj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Ok4sc2V0Ok59O2Z1bmN0aW9uIF9uKGUsdCxuKXt5bi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0seW4uc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix5bil9ZnVuY3Rpb24gYm4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihuLHIpe3ZhciBpPW4uJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxvPW4uX3Byb3BzPXt9LGE9bi4kb3B0aW9ucy5fcHJvcEtleXM9W107bi4kcGFyZW50JiZ5ZSghMSk7dmFyIGU9ZnVuY3Rpb24oZSl7YS5wdXNoKGUpO3ZhciB0PVBlKGUscixpLG4pO3dlKG8sZSx0KSxlIGluIG58fF9uKG4sIl9wcm9wcyIsZSl9O2Zvcih2YXIgdCBpbiByKWUodCk7eWUoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXtlLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09ImZ1bmN0aW9uIiE9dHlwZW9mIHRbbl0/TjptKHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO2QodD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3duKHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJmYocixvKXx8KHZvaWQgMCwzNiE9PShhPShvKyIiKS5jaGFyQ29kZUF0KDApKSYmOTUhPT1hJiZfbihlLCJfZGF0YSIsbykpfXZhciBhO2JlKHQsITApfShlKTpiZShlLl9kYXRhPXt9LCEwKSx0LmNvbXB1dGVkJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2NvbXB1dGVkV2F0Y2hlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxyPVEoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IG1uKGUsYXx8TixOLGtuKSksaSBpbiBlfHxTbihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1LJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspVG4oZSxuLHJbaV0pO2Vsc2UgVG4oZSxuLHIpfX0oZSx0LndhdGNoKX1mdW5jdGlvbiB3bihlLHQpe3NlKCk7dHJ5e3JldHVybiBlLmNhbGwodCx0KX1jYXRjaChlKXtyZXR1cm4gQmUoZSx0LCJkYXRhKCkiKSx7fX1maW5hbGx5e2NlKCl9fXZhciBrbj17bGF6eTohMH07ZnVuY3Rpb24gU24oZSx0LG4pe3ZhciByPSFRKCk7ImZ1bmN0aW9uIj09dHlwZW9mIG4/KHluLmdldD1yP3huKHQpOkNuKG4pLHluLnNldD1OKTooeW4uZ2V0PW4uZ2V0P3ImJiExIT09bi5jYWNoZT94bih0KTpDbihuLmdldCk6Tix5bi5zZXQ9bi5zZXR8fE4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQseW4pfWZ1bmN0aW9uIHhuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NvbXB1dGVkV2F0Y2hlcnMmJnRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNbdF07aWYoZSlyZXR1cm4gZS5kaXJ0eSYmZS5ldmFsdWF0ZSgpLGFlLlNoYXJlZE9iamVjdC50YXJnZXQmJmUuZGVwZW5kKCksZS52YWx1ZX19ZnVuY3Rpb24gQ24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzLHRoaXMpfX1mdW5jdGlvbiBUbihlLHQsbixyKXtyZXR1cm4gZChuKSYmKG49KHI9bikuaGFuZGxlciksInN0cmluZyI9PXR5cGVvZiBuJiYobj1lW25dKSxlLiR3YXRjaCh0LG4scil9dmFyIE9uLEVuLEluLEFuLCRuLFBuLE1uLGpuPTA7ZnVuY3Rpb24gTG4oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50LG4uX3BhcmVudFZub2RlPXIsbi5fcGFyZW50RWxtPXQuX3BhcmVudEVsbSxuLl9yZWZFbG09dC5fcmVmRWxtO3ZhciBpPXIuY29tcG9uZW50T3B0aW9ucztuLnByb3BzRGF0YT1pLnByb3BzRGF0YSxuLl9wYXJlbnRMaXN0ZW5lcnM9aS5saXN0ZW5lcnMsbi5fcmVuZGVyQ2hpbGRyZW49aS5jaGlsZHJlbixuLl9jb21wb25lbnRUYWc9aS50YWcsdC5yZW5kZXImJihuLnJlbmRlcj10LnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyl9ZnVuY3Rpb24gQm4oZSl7dmFyIHQ9ZS5vcHRpb25zO2lmKGUuc3VwZXIpe3ZhciBuPUJuKGUuc3VwZXIpO2lmKG4hPT1lLnN1cGVyT3B0aW9ucyl7ZS5zdXBlck9wdGlvbnM9bjt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdCxuPWUub3B0aW9ucyxyPWUuc2VhbGVkT3B0aW9ucztmb3IodmFyIGkgaW4gbiluW2ldIT09cltpXSYmKHR8fCh0PXt9KSx0W2ldPW5baV0pO3JldHVybiB0fShlKTtyJiZCKGUuZXh0ZW5kT3B0aW9ucyxyKSwodD1lLm9wdGlvbnM9QWUobixlLmV4dGVuZE9wdGlvbnMpKS5uYW1lJiYodC5jb21wb25lbnRzW3QubmFtZV09ZSl9fXJldHVybiB0fWZ1bmN0aW9uIE5uKGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24gRG4oZSl7ZS5jaWQ9MDt2YXIgYT0xO2UuZXh0ZW5kPWZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIHQ9dGhpcyxuPXQuY2lkLHI9ZS5fQ3Rvcnx8KGUuX0N0b3I9e30pO2lmKHJbbl0pcmV0dXJuIHJbbl07dmFyIGk9ZS5uYW1lfHx0Lm9wdGlvbnMubmFtZSxvPWZ1bmN0aW9uKGUpe3RoaXMuX2luaXQoZSl9O3JldHVybigoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8pLmNpZD1hKyssby5vcHRpb25zPUFlKHQub3B0aW9ucyxlKSxvLnN1cGVyPXQsby5vcHRpb25zLnByb3BzJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpX24oZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9KG8pLG8ub3B0aW9ucy5jb21wdXRlZCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KVNuKGUucHJvdG90eXBlLG4sdFtuXSl9KG8pLG8uZXh0ZW5kPXQuZXh0ZW5kLG8ubWl4aW49dC5taXhpbixvLnVzZT10LnVzZSxqLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT10W2VdfSksaSYmKG8ub3B0aW9ucy5jb21wb25lbnRzW2ldPW8pLG8uc3VwZXJPcHRpb25zPXQub3B0aW9ucyxvLmV4dGVuZE9wdGlvbnM9ZSxvLnNlYWxlZE9wdGlvbnM9Qih7fSxvLm9wdGlvbnMpLHJbbl09b319ZnVuY3Rpb24gUm4oZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24gRm4oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMTxlLmluZGV4T2YodCk6InN0cmluZyI9PXR5cGVvZiBlPy0xPGUuc3BsaXQoIiwiKS5pbmRleE9mKHQpOihuPWUsIltvYmplY3QgUmVnRXhwXSI9PT1yLmNhbGwobikmJmUudGVzdCh0KSk7dmFyIG59ZnVuY3Rpb24gVW4oZSx0KXt2YXIgbj1lLmNhY2hlLHI9ZS5rZXlzLGk9ZS5fdm5vZGU7Zm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107aWYoYSl7dmFyIHM9Um4oYS5jb21wb25lbnRPcHRpb25zKTtzJiYhdChzKSYmem4obixvLHIsaSl9fX1mdW5jdGlvbiB6bihlLHQsbixyKXt2YXIgaT1lW3RdOyFpfHxyJiZpLnRhZz09PXIudGFnfHxpLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLGsobix0KX1Obi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Ll91aWQ9am4rKyx0Ll9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9Mbih0LGUpOnQuJG9wdGlvbnM9QWUoQm4odC5jb25zdHJ1Y3RvciksZXx8e30sdCksbm4oKHQuX3JlbmRlclByb3h5PXQpLl9zZWxmPXQpLFl0KHQpLHF0KHQpLGFuKHQsImJlZm9yZUNyZWF0ZSIpLCJtcC10b3V0aWFvIiE9PXQubXBIb3N0JiZ0dCh0KSxibih0KSwibXAtdG91dGlhbyIhPT10Lm1wSG9zdCYmZXQodCksIm1wLXRvdXRpYW8iIT09dC5tcEhvc3QmJmFuKHQsImNyZWF0ZWQiKSx0LiRvcHRpb25zLmVsJiZ0LiRtb3VudCh0LiRvcHRpb25zLmVsKX0sT249Tm4sRW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0sSW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wc319LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPbi5wcm90b3R5cGUsIiRkYXRhIixFbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KE9uLnByb3RvdHlwZSwiJHByb3BzIixJbiksT24ucHJvdG90eXBlLiRzZXQ9a2UsT24ucHJvdG90eXBlLiRkZWxldGU9U2UsT24ucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZihkKHQpKXJldHVybiBUbihyLGUsdCxuKTsobj1ufHx7fSkudXNlcj0hMDt2YXIgaT1uZXcgbW4ocixlLHQsbik7aWYobi5pbW1lZGlhdGUpdHJ5e3QuY2FsbChyLGkudmFsdWUpfWNhdGNoKGUpe0JlKGUsciwnY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyICInK2kuZXhwcmVzc2lvbisnIicpfXJldHVybiBmdW5jdGlvbigpe2kudGVhcmRvd24oKX19LCRuPS9eaG9vazovLChBbj1ObikucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9uKGVbbl0sdCk7ZWxzZSh0aGlzLl9ldmVudHNbZV18fCh0aGlzLl9ldmVudHNbZV09W10pKS5wdXNoKHQpLCRuLnRlc3QoZSkmJih0aGlzLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiB0aGlzfSxBbi5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sQW4ucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcztpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb2ZmKGVbbl0sdCk7cmV0dXJuIHRoaXN9dmFyIGksbz10aGlzLl9ldmVudHNbZV07aWYoIW8pcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuX2V2ZW50c1tlXT1udWxsLHRoaXM7Zm9yKHZhciBhPW8ubGVuZ3RoO2EtLTspaWYoKGk9b1thXSk9PT10fHxpLmZuPT09dCl7by5zcGxpY2UoYSwxKTticmVha31yZXR1cm4gdGhpc30sQW4ucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PTE8dC5sZW5ndGg/eSh0KTp0O2Zvcih2YXIgbj15KGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKU5lKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9LChQbj1ObikucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMsaT1yLiRlbCxvPXIuX3Zub2RlLGE9KG49dG4sdG49cixmdW5jdGlvbigpe3RuPW59KTtyLl92bm9kZT1lLG8/ci4kZWw9ci5fX3BhdGNoX18obyxlKTooci4kZWw9ci5fX3BhdGNoX18oci4kZWwsZSx0LCExLHIuJG9wdGlvbnMuX3BhcmVudEVsbSxyLiRvcHRpb25zLl9yZWZFbG0pLHIuJG9wdGlvbnMuX3BhcmVudEVsbT1yLiRvcHRpb25zLl9yZWZFbG09bnVsbCksYSgpLGkmJihpLl9fdnVlX189bnVsbCksci4kZWwmJihyLiRlbC5fX3Z1ZV9fPXIpLHIuJHZub2RlJiZyLiRwYXJlbnQmJnIuJHZub2RlPT09ci4kcGFyZW50Ll92bm9kZSYmKHIuJHBhcmVudC4kZWw9ci4kZWwpfSxQbi5wcm90b3R5cGUuJGZvcmNlVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fd2F0Y2hlciYmdGhpcy5fd2F0Y2hlci51cGRhdGUoKX0sUG4ucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7YW4oZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxrKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLGFuKGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19LGt0KChNbj1ObikucHJvdG90eXBlKSxNbi5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKGUpe3JldHVybiBxZShlLHRoaXMpfSxNbi5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciB0LG49dGhpcyxlPW4uJG9wdGlvbnMscj1lLnJlbmRlcixpPWUuX3BhcmVudFZub2RlO2kmJihuLiRzY29wZWRTbG90cz1vdChpLmRhdGEuc2NvcGVkU2xvdHMsbi4kc2xvdHMsbi4kc2NvcGVkU2xvdHMpKSxuLiR2bm9kZT1pO3RyeXtIdD1uLHQ9ci5jYWxsKG4uX3JlbmRlclByb3h5LG4uJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKGUpe0JlKGUsbiwicmVuZGVyIiksdD1uLl92bm9kZX1maW5hbGx5e0h0PW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJjE9PT10Lmxlbmd0aCYmKHQ9dFswXSksdCBpbnN0YW5jZW9mIHVlfHwodD1kZSgpKSx0LnBhcmVudD1pLHR9O3ZhciBWbixxbixXbixIbj1bU3RyaW5nLFJlZ0V4cCxBcnJheV0sR249e0tlZXBBbGl2ZTp7bmFtZToia2VlcC1hbGl2ZSIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6SG4sZXhjbHVkZTpIbixtYXg6W1N0cmluZyxOdW1iZXJdfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMua2V5cz1bXX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuY2FjaGUpem4odGhpcy5jYWNoZSxlLHRoaXMua2V5cyl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJHdhdGNoKCJpbmNsdWRlIixmdW5jdGlvbih0KXtVbihlLGZ1bmN0aW9uKGUpe3JldHVybiBGbih0LGUpfSl9KSx0aGlzLiR3YXRjaCgiZXhjbHVkZSIsZnVuY3Rpb24odCl7VW4oZSxmdW5jdGlvbihlKXtyZXR1cm4hRm4odCxlKX0pfSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNsb3RzLmRlZmF1bHQsdD1KdChlKSxuPXQmJnQuY29tcG9uZW50T3B0aW9ucztpZihuKXt2YXIgcj1SbihuKSxpPXRoaXMuaW5jbHVkZSxvPXRoaXMuZXhjbHVkZTtpZihpJiYoIXJ8fCFGbihpLHIpKXx8byYmciYmRm4obyxyKSlyZXR1cm4gdDt2YXIgYT10aGlzLmNhY2hlLHM9dGhpcy5rZXlzLGM9bnVsbD09dC5rZXk/bi5DdG9yLmNpZCsobi50YWc/Ijo6IituLnRhZzoiIik6dC5rZXk7YVtjXT8odC5jb21wb25lbnRJbnN0YW5jZT1hW2NdLmNvbXBvbmVudEluc3RhbmNlLGsocyxjKSxzLnB1c2goYykpOihhW2NdPXQscy5wdXNoKGMpLHRoaXMubWF4JiZzLmxlbmd0aD5wYXJzZUludCh0aGlzLm1heCkmJnpuKGEsc1swXSxzLHRoaXMuX3Zub2RlKSksdC5kYXRhLmtlZXBBbGl2ZT0hMH1yZXR1cm4gdHx8ZSYmZVswXX19fTtWbj1ObixXbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFJ9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVm4sImNvbmZpZyIsV24pLFZuLnV0aWw9e3dhcm46aWUsZXh0ZW5kOkIsbWVyZ2VPcHRpb25zOkFlLGRlZmluZVJlYWN0aXZlOndlfSxWbi5zZXQ9a2UsVm4uZGVsZXRlPVNlLFZuLm5leHRUaWNrPXFlLFZuLm9ic2VydmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGJlKGUpLGV9LFZuLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxqLmZvckVhY2goZnVuY3Rpb24oZSl7Vm4ub3B0aW9uc1tlKyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLEIoKFZuLm9wdGlvbnMuX2Jhc2U9Vm4pLm9wdGlvbnMuY29tcG9uZW50cyxHbiksVm4udXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZigtMTx0LmluZGV4T2YoZSkpcmV0dXJuIHRoaXM7dmFyIG49eShhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9LFZuLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9QWUodGhpcy5vcHRpb25zLGUpLHRoaXN9LERuKFZuKSxxbj1WbixqLmZvckVhY2goZnVuY3Rpb24obil7cW5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8oImNvbXBvbmVudCI9PT1uJiZkKHQpJiYodC5uYW1lPXQubmFtZXx8ZSx0PXRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQodCkpLCJkaXJlY3RpdmUiPT09biYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXtiaW5kOnQsdXBkYXRlOnR9KSx0aGlzLm9wdGlvbnNbbisicyJdW2VdPXQpOnRoaXMub3B0aW9uc1tuKyJzIl1bZV19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE5uLnByb3RvdHlwZSwiJGlzU2VydmVyIix7Z2V0OlF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTm4ucHJvdG90eXBlLCIkc3NyQ29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTm4sIkZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0Iix7dmFsdWU6U3R9KSxObi52ZXJzaW9uPSIyLjYuMTAiO3ZhciBYbj0xO2Z1bmN0aW9uIEpuKGUpe3RoaXMuaW5zdGFuY2VJZD0iIix0aGlzLm5vZGVJZD1YbisrLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubm9kZVR5cGU9Myx0aGlzLnRleHQ9ZX1mdW5jdGlvbiBZbihlKXtyZXR1cm4gYS5jcmVhdGVFbGVtZW50KGUpfXZhciBLbj1PYmplY3QuZnJlZXplKHtuYW1lc3BhY2VNYXA6e30sY3JlYXRlRWxlbWVudDpZbixjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYS5jcmVhdGVFbGVtZW50KGUrIjoiK3QpfSxjcmVhdGVUZXh0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEpuKGUpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBhLmNyZWF0ZUNvbW1lbnQoZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7aWYoMyE9PXQubm9kZVR5cGUpZS5pbnNlcnRCZWZvcmUodCxuKTtlbHNle3ZhciByPSJ3ZWV4Ij09PWEuX18kY29tcGlsZXJfXz8idGV4dCI6InUtdGV4dCI7aWYoZS50eXBlPT09cillLnNldEF0dHIoInZhbHVlIix0LnRleHQpLHQucGFyZW50Tm9kZT1lO2Vsc2V7dmFyIGk9WW4ocik7aS5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSxlLmluc2VydEJlZm9yZShpLG4pfX19LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCl7MyE9PXQubm9kZVR5cGU/ZS5yZW1vdmVDaGlsZCh0KTplLnNldEF0dHIoInZhbHVlIiwiIil9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUsdCl7aWYoMyE9PXQubm9kZVR5cGUpZS5hcHBlbmRDaGlsZCh0KTtlbHNle3ZhciBuPSJ3ZWV4Ij09PWEuX18kY29tcGlsZXJfXz8idGV4dCI6InUtdGV4dCI7aWYoZS50eXBlPT09billLnNldEF0dHIoInZhbHVlIix0LnRleHQpLHQucGFyZW50Tm9kZT1lO2Vsc2V7dmFyIHI9WW4obik7ci5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSxlLmFwcGVuZENoaWxkKHIpfX19LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZXRBdHRyKCJ2YWx1ZSIsdCl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7ZS5zZXRBdHRyKHQsbil9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHIoIkBzdHlsZVNjb3BlIix0KX19KSxabj17Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7UW4odCl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe2UuZGF0YS5yZWYhPT10LmRhdGEucmVmJiYoUW4oZSwhMCksUW4odCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe1FuKGUsITApfX07ZnVuY3Rpb24gUW4oZSx0KXt2YXIgbj1lLmRhdGEucmVmO2lmKEkobikpe3ZhciByPWUuY29udGV4dCxpPWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZWxtLG89ci4kcmVmczt0P0FycmF5LmlzQXJyYXkob1tuXSk/ayhvW25dLGkpOm9bbl09PT1pJiYob1tuXT12b2lkIDApOmUuZGF0YS5yZWZJbkZvcj9BcnJheS5pc0FycmF5KG9bbl0pP29bbl0uaW5kZXhPZihpKTwwJiZvW25dLnB1c2goaSk6b1tuXT1baV06b1tuXT1pfX1zKCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIpLHMoInN2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSxmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3IiwhMCk7dmFyIGVyPXMoInRleHQsbnVtYmVyLHBhc3N3b3JkLHNlYXJjaCxlbWFpbCx0ZWwsdXJsIiksdHI9bmV3IHVlKCIiLHt9LFtdKSxucj1bImNyZWF0ZSIsImFjdGl2YXRlIiwidXBkYXRlIiwicmVtb3ZlIiwiZGVzdHJveSJdO2Z1bmN0aW9uIHJyKGUsdCl7cmV0dXJuIGUua2V5PT09dC5rZXkmJihlLnRhZz09PXQudGFnJiZlLmlzQ29tbWVudD09PXQuaXNDb21tZW50JiZJKGUuZGF0YSk9PT1JKHQuZGF0YSkmJmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0IiE9PWUudGFnKXJldHVybiEwO3ZhciBuLHI9SShuPWUuZGF0YSkmJkkobj1uLmF0dHJzKSYmbi50eXBlLGk9SShuPXQuZGF0YSkmJkkobj1uLmF0dHJzKSYmbi50eXBlO3JldHVybiByPT09aXx8ZXIocikmJmVyKGkpfShlLHQpfHxBKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT10LmFzeW5jRmFjdG9yeSYmRSh0LmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIGlyKGUsdCxuKXt2YXIgcixpLG89e307Zm9yKHI9dDtyPD1uOysrcilJKGk9ZVtyXS5rZXkpJiYob1tpXT1yKTtyZXR1cm4gb312YXIgb3I9e2NyZWF0ZTphcix1cGRhdGU6YXIsZGVzdHJveTpmdW5jdGlvbihlKXthcihlLHRyKX19O2Z1bmN0aW9uIGFyKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89dD09PXRyLGE9bj09PXRyLHM9Y3IodC5kYXRhLmRpcmVjdGl2ZXMsdC5jb250ZXh0KSxjPWNyKG4uZGF0YS5kaXJlY3RpdmVzLG4uY29udGV4dCksdT1bXSxsPVtdO2ZvcihlIGluIGMpcj1zW2VdLGk9Y1tlXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsdXIoaSwidXBkYXRlIixuLHQpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOih1cihpLCJiaW5kIixuLHQpLGkuZGVmJiZpLmRlZi5pbnNlcnRlZCYmdS5wdXNoKGkpKTtpZih1Lmxlbmd0aCl7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHUubGVuZ3RoO2UrKyl1cih1W2VdLCJpbnNlcnRlZCIsbix0KX07bz9ZZShuLCJpbnNlcnQiLGQpOmQoKX1sLmxlbmd0aCYmWWUobiwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bC5sZW5ndGg7ZSsrKXVyKGxbZV0sImNvbXBvbmVudFVwZGF0ZWQiLG4sdCl9KTtpZighbylmb3IoZSBpbiBzKWNbZV18fHVyKHNbZV0sInVuYmluZCIsdCx0LGEpfShlLHQpfXZhciBzcj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIGNyKGUsdCl7dmFyIG4scixpLG89T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gbztmb3Iobj0wO248ZS5sZW5ndGg7bisrKShyPWVbbl0pLm1vZGlmaWVyc3x8KHIubW9kaWZpZXJzPXNyKSwob1soaT1yLGkucmF3TmFtZXx8aS5uYW1lKyIuIitPYmplY3Qua2V5cyhpLm1vZGlmaWVyc3x8e30pLmpvaW4oIi4iKSldPXIpLmRlZj0kZSh0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixyLm5hbWUpO3JldHVybiBvfWZ1bmN0aW9uIHVyKHQsbixyLGUsaSl7dmFyIG89dC5kZWYmJnQuZGVmW25dO2lmKG8pdHJ5e28oci5lbG0sdCxyLGUsaSl9Y2F0Y2goZSl7QmUoZSxyLmNvbnRleHQsImRpcmVjdGl2ZSAiK3QubmFtZSsiICIrbisiIGhvb2siKX19dmFyIGxyPVtabixvcl0sZHI9dShmdW5jdGlvbihlKXt2YXIgbj17fSxyPS86KC4rKS87cmV0dXJuIGUuc3BsaXQoLzsoPyFbXihdKlwpKS9nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWUuc3BsaXQocik7MTx0Lmxlbmd0aCYmKG5bdFswXS50cmltKCldPXRbMV0udHJpbSgpKX19KSxufSk7ZnVuY3Rpb24gZnIoZSl7dmFyIHQ9cHIoZS5zdHlsZSk7cmV0dXJuIGUuc3RhdGljU3R5bGU/QihlLnN0YXRpY1N0eWxlLHQpOnR9ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/eChlKToic3RyaW5nIj09dHlwZW9mIGU/ZHIoZSk6ZX12YXIgaHI9e3ZpZXc6e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSxidXR0b246e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSxuYXZpZ2F0b3I6e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSwidS1pbnB1dCI6e2NsYXNzOlsicGxhY2Vob2xkZXJDbGFzcyJdLHN0eWxlOlsicGxhY2Vob2xkZXJTdHlsZSJdfSwidS10ZXh0YXJlYSI6e2NsYXNzOlsicGxhY2Vob2xkZXJDbGFzcyJdLHN0eWxlOlsicGxhY2Vob2xkZXJTdHlsZSJdfSwicGlja2VyLXZpZXciOntjbGFzczpbImluZGljYXRvckNsYXNzIiwibWFza0NsYXNzIl0sc3R5bGU6WyJpbmRpY2F0b3JTdHlsZSIsIm1hc2tTdHlsZSJdfX07ZnVuY3Rpb24gdnIoZSx0LG4scil7aWYoIXQpcmV0dXJuIHQ7dmFyIGk9aHJbbi50eXBlXTtpZihpKXtpZigtMSE9PWkuY2xhc3MuaW5kZXhPZihlKSlyZXR1cm4gci4kb3B0aW9ucy5zdHlsZSYmci4kb3B0aW9ucy5zdHlsZVt0XXx8e307aWYoLTEhPT1pLnN0eWxlLmluZGV4T2YoZSkpcmV0dXJuIHByKHQpfXJldHVybiB0fWZ1bmN0aW9uIGdyKGUsdCl7aWYoZS5kYXRhLmF0dHJzfHx0LmRhdGEuYXR0cnMpe3ZhciBuLHIsaT10LmVsbSxvPWUuZGF0YS5hdHRyc3x8e30sYT10LmRhdGEuYXR0cnN8fHt9O2EuX19vYl9fJiYoYT10LmRhdGEuYXR0cnM9Qih7fSxhKSk7dmFyIHM9ImZ1bmN0aW9uIj09dHlwZW9mIGkuc2V0QXR0cnMsYz17fTtmb3IobiBpbiBhKXI9YVtuXSxvW25dIT09ciYmKHM/Y1tuXT1yOmkuc2V0QXR0cihuLHZyKG4scixpLHQuY29udGV4dCkpKTtmb3IobiBpbiBvKW51bGw9PWFbbl0mJihzP2Nbbl09dm9pZCAwOmkuc2V0QXR0cihuKSk7cyYmaS5zZXRBdHRycyhmdW5jdGlvbihvLGUsdCl7dmFyIGE9aHJbZS50eXBlXTtpZighYSlyZXR1cm4gbzt2YXIgcz10LiRvcHRpb25zLnN0eWxlfHx7fSxjPXNbIkBWRVJTSU9OIl18fDE7cmV0dXJuIE9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9b1tlXTtpZigtMSE9PWEuY2xhc3MuaW5kZXhPZihlKSlpZihjPDJ8fCEoIi4iK3QgaW4gcykpb1tlXT1zW3RdfHx7fTtlbHNle3ZhciBuPShzWyIuIit0XXx8e30pWyIiXXx8e30scj17fTtmb3IodmFyIGkgaW4gbilyW2ldPW5baV1bMF07b1tlXT1yfWVsc2UtMSE9PWEuc3R5bGUuaW5kZXhPZihlKSYmKG9bZV09cHIodCkpfSksb30oYyxpLHQuY29udGV4dCkpfX12YXIgbXI9e2NyZWF0ZTpncix1cGRhdGU6Z3J9O2Z1bmN0aW9uIHlyKGUpe2Zvcih2YXIgdD1fcihlKSxuPWUscj1lO0koci5jb21wb25lbnRJbnN0YW5jZSk7KShyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmci5kYXRhJiYodD1CKF9yKHIpLHQpKTtmb3IoO0kobj1uLnBhcmVudCk7KW4mJm4uZGF0YSYmKHQ9Qih0LF9yKG4pKSk7cmV0dXJuIHR9ZnVuY3Rpb24gX3IoZSl7dmFyIHQsbixyLGksbz1lLmRhdGE7cmV0dXJuIEUoby5zdGF0aWNDbGFzcykmJkUoby5jbGFzcyk/e306KHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1lLnN0YXRpY0NsYXNzLHI9ZS5jbGFzcztuJiZ0LnB1c2guYXBwbHkodCxuKTtBcnJheS5pc0FycmF5KHIpP3QucHVzaC5hcHBseSh0LHIpOmIocik/dC5wdXNoLmFwcGx5KHQsT2JqZWN0LmtleXMocikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiByW2VdfSkpOiJzdHJpbmciPT10eXBlb2YgciYmdC5wdXNoLmFwcGx5KHQsci50cmltKCkuc3BsaXQoL1xzKy8pKTtyZXR1cm4gdH0obyksbj1lLmNvbnRleHQscj1uLiRvcHRpb25zLnN0eWxlfHx7fSxpPXt9LHQuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdO0IoaSx0KX0pLGkpfWZ1bmN0aW9uIGJyKGUsdCxuLHIpe3ZhciBpLG8sYT17fTtmb3IobyBpbiBuKUUodFtvXSkmJihhW3IobyldPSIiKTtmb3IobyBpbiB0KShpPXRbb10pIT09bltvXSYmKGFbcihvKV09aSk7ZS5zZXRTdHlsZXMoYSl9ZnVuY3Rpb24gd3IoZSx0LG4pe3ZhciByPXQmJnQuY29udGV4dC4kb3B0aW9ucy5zdHlsZTtyJiYhZS5pbmNsdWRlcyhyKSYmKG4/ZS51bnNoaWZ0KHIpOmUucHVzaChyKSl9ZnVuY3Rpb24ga3IoZSl7Zm9yKHZhciB0PWUuZGF0YSxuPWUscj1lO0koci5jb21wb25lbnRJbnN0YW5jZSk7KShyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmci5kYXRhJiYodD1TcihyLmRhdGEsdCkpO2Zvcig7SShuPW4ucGFyZW50KTspbiYmbi5kYXRhJiYodD1Tcih0LG4uZGF0YSkpO3JldHVybiBmdW5jdGlvbihlLHQpe2lmKEkoZSl8fEkodCkpcmV0dXJuIHhyKENyKGUpLENyKHQpKTtyZXR1cm4iIn0odC5zdGF0aWNDbGFzcyx0LmNsYXNzKX1mdW5jdGlvbiBTcihlLHQpe3JldHVybntzdGF0aWNDbGFzczp4cihDcihlLnN0YXRpY0NsYXNzKSxDcih0LnN0YXRpY0NsYXNzKSksY2xhc3M6SShlLmNsYXNzKT9bZS5jbGFzcyx0LmNsYXNzXTp0LmNsYXNzfX1mdW5jdGlvbiB4cihlLHQpe3JldHVybiBlP3Q/ZSsiICIrdDplOnR8fCIifWZ1bmN0aW9uIENyKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPSIiLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspSSh0PUNyKGVbcl0pKSYmIiIhPT10JiYobiYmKG4rPSIgIiksbis9dCk7cmV0dXJuIG59KGUpOmIoZSk/ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz0iICIpLHQrPW4pO3JldHVybiB0fShlKToic3RyaW5nIj09dHlwZW9mIGU/ZToiIn1mdW5jdGlvbiBUcihlLHQpe3ZhciBuPXQuZGF0YSxyPWUuZGF0YTtpZighKEUobi5zdGF0aWNDbGFzcykmJkUobi5jbGFzcykmJihFKHIpfHxFKHIuc3RhdGljQ2xhc3MpJiZFKHIuY2xhc3MpKSkpe3ZhciBpPSJ3ZWV4Ij09PWEuX18kc3R5bGVDb21waWxlcl9fO2lmKGEuX18kYXV0b21hdG9yX198fCFpKXtpfHx0LmVsbS5zZXRTdHlsZXNoZWV0JiZ0LmVsbS5zZXRTdHlsZXNoZWV0KGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49ZSxyPWU7Zm9yKHdyKHQsZSk7SShyLmNvbXBvbmVudEluc3RhbmNlKTspd3IodCxyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLCEwKTtmb3IoO0kobj1uLnBhcmVudCk7KXdyKHQsbik7cmV0dXJuIHR9KHQpKTt2YXIgbz1rcih0KTt0LmVsbS5zZXRDbGFzc0xpc3QmJnQuZWxtLnNldENsYXNzTGlzdChvLnNwbGl0KCIgIikpfWkmJmJyKHQuZWxtLHlyKHQpLHlyKGUpLE9yKX19ZnVuY3Rpb24gT3IoZSl7cmV0dXJuIGV9dmFyIEVyLElyLEFyPXtjcmVhdGU6VHIsdXBkYXRlOlRyfTtmdW5jdGlvbiAkcihlLHQsbixyLGkpe2lmKG4pY29uc29sZS5sb2coIldlZXggZG8gbm90IHN1cHBvcnQgZXZlbnQgaW4gYnViYmxlIHBoYXNlLiIpO2Vsc2V7aWYoSXImJklyLl92aXJ0dWFsQ29tcG9uZW50cyl7RXIuX2NvbnRleHQ9SXI7dmFyIG89dDt0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcj0odFswXXx8e30pLmNvbXBvbmVudElkLGk9dGhpcy5fY29udGV4dDtyJiZ0aGlzLl9jb250ZXh0JiYoaT0odGhpcy5fY29udGV4dC5fdmlydHVhbENvbXBvbmVudHN8fHt9KVtyXXx8aSk7dHJ5eyFmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49bnVsbCk7dmFyIHI9ZS5mbnM7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseShuLHQpOmUuYXBwbHkobix0KTtmb3IodmFyIGk9ci5zbGljZSgpLG89MDtvPGkubGVuZ3RoO28rKylpW29dLmFwcGx5KG4sdCl9KG8sdCxpKX1jYXRjaChlKXtCZShlLGksIkZhaWxlZCB0byBpbnZva2UgdmlydHVhbCBjb21wb25lbnQgaGFuZGxlciAoIityKyIpIil9fX1Fci5hZGRFdmVudChlLHQsaSl9fWZ1bmN0aW9uIFByKGUsdCxuLHIpeyhyfHxFcikucmVtb3ZlRXZlbnQoZSl9ZnVuY3Rpb24gTXIoZSx0KXtpZihlLmRhdGEub258fHQuZGF0YS5vbil7dmFyIG49dC5kYXRhLm9ufHx7fSxyPWUuZGF0YS5vbnx8e307RXI9dC5lbG0sSXI9dC5jb250ZXh0LEplKG4sciwkcixQcix0LmNvbnRleHQpLElyPUVyPXZvaWQgMH19dmFyIGpyPXtjcmVhdGU6TXIsdXBkYXRlOk1yfSxMcj11KGgpO2Z1bmN0aW9uIEJyKGUsdCl7dmFyIG49dC5kYXRhLHI9ZS5kYXRhO2lmKCEoRShuLnN0YXRpY1N0eWxlKSYmRShuLnN0eWxlKSYmRShyLnN0YXRpY1N0eWxlKSYmRShyLnN0eWxlKSkpe3ZhciBpPXQuZWxtLG89ci5zdGF0aWNTdHlsZSxhPXIubm9ybWFsaXplZFN0eWxlfHxyLnN0eWxlfHx7fSxzPW98fGEsYz1wcih0LmRhdGEuc3R5bGUpfHx7fTt0LmRhdGEubm9ybWFsaXplZFN0eWxlPUkoYy5fX29iX18pP0Ioe30sYyk6YyxicihpLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj17fTtpZih0KWZvcih2YXIgaT1lO2kuY29tcG9uZW50SW5zdGFuY2U7KShpPWkuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmaS5kYXRhJiYobj1mcihpLmRhdGEpKSYmQihyLG4pOyhuPWZyKGUuZGF0YSkpJiZCKHIsbik7Zm9yKHZhciBvPWU7bz1vLnBhcmVudDspby5kYXRhJiYobj1mcihvLmRhdGEpKSYmQihyLG4pO3JldHVybiByfSh0LCEwKSxzLExyKX19dmFyIE5yPXtjcmVhdGU6QnIsdXBkYXRlOkJyfTtmdW5jdGlvbiBEcihlKXtpZihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciB0PXt9O3JldHVybiExIT09ZS5jc3MmJkIodCxScihlLm5hbWV8fCJ2IikpLEIodCxlKSx0fXJldHVybiJzdHJpbmciPT10eXBlb2YgZT9ScihlKTp2b2lkIDB9fXZhciBScj11KGZ1bmN0aW9uKGUpe3JldHVybntlbnRlckNsYXNzOmUrIi1lbnRlciIsZW50ZXJUb0NsYXNzOmUrIi1lbnRlci10byIsZW50ZXJBY3RpdmVDbGFzczplKyItZW50ZXItYWN0aXZlIixsZWF2ZUNsYXNzOmUrIi1sZWF2ZSIsbGVhdmVUb0NsYXNzOmUrIi1sZWF2ZS10byIsbGVhdmVBY3RpdmVDbGFzczplKyItbGVhdmUtYWN0aXZlIn19KTtxJiYhSiYmKHZvaWQgMD09PXdpbmRvdy5vbnRyYW5zaXRpb25lbmQmJndpbmRvdy5vbndlYmtpdHRyYW5zaXRpb25lbmQsdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ3aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQpO3EmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpO2Z1bmN0aW9uIEZyKGUsbil7dmFyIHI9bi5lbG07ci5fbGVhdmVDYiYmKHIuX2xlYXZlQ2IuY2FuY2VsbGVkPSEwLHIuX2xlYXZlQ2IoKSk7dmFyIHQ9RHIobi5kYXRhLnRyYW5zaXRpb24pO2lmKHQmJiFyLl9lbnRlckNiKXtmb3IodmFyIGk9dC5lbnRlckNsYXNzLG89dC5lbnRlclRvQ2xhc3MsYT10LmVudGVyQWN0aXZlQ2xhc3Mscz10LmFwcGVhckNsYXNzLGM9dC5hcHBlYXJUb0NsYXNzLHU9dC5hcHBlYXJBY3RpdmVDbGFzcyxsPXQuYmVmb3JlRW50ZXIsZD10LmVudGVyLGY9dC5hZnRlckVudGVyLHA9dC5lbnRlckNhbmNlbGxlZCxoPXQuYmVmb3JlQXBwZWFyLHY9dC5hcHBlYXIsZz10LmFmdGVyQXBwZWFyLG09dC5hcHBlYXJDYW5jZWxsZWQseT10bixfPXRuLiR2bm9kZTtfJiZfLnBhcmVudDspeT0oXz1fLnBhcmVudCkuY29udGV4dDt2YXIgYj0heS5faXNNb3VudGVkfHwhbi5pc1Jvb3RJbnNlcnQ7aWYoIWJ8fHZ8fCIiPT09dil7dmFyIHc9Yj9zOmksaz1iP2M6byxTPWI/dTphLHg9YiYmaHx8bCxDPWImJiJmdW5jdGlvbiI9PXR5cGVvZiB2P3Y6ZCxUPWImJmd8fGYsTz1iJiZtfHxwLEU9QyYmMTwoQy5fbGVuZ3RofHxDLmxlbmd0aCksST1uLmNvbnRleHQuJG9wdGlvbnMuc3R5bGV8fHt9LEE9SVt3XSwkPUlbIkBUUkFOU0lUSU9OIl0mJklbIkBUUkFOU0lUSU9OIl1bU118fHt9LFA9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz17fSxhPXRbbl0scz10W3JdLGM9dFtpXTtpZihhKWZvcih2YXIgdSBpbiBhKW9bdV09ZS5zdHlsZVt1XTtpZihjKWZvcih2YXIgbCBpbiBjKTAhPT1sLmluZGV4T2YoInRyYW5zaXRpb24iKSYmKG9bbF09Y1tsXSk7cyYmQihvLHMpO3JldHVybiBvfShyLEksdyxrLFMpLE09MDxPYmplY3Qua2V5cyhQKS5sZW5ndGgsaj1yLl9lbnRlckNiPUQoZnVuY3Rpb24oKXtqLmNhbmNlbGxlZD9PJiZPKHIpOlQmJlQociksci5fZW50ZXJDYj1udWxsfSk7aWYoc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlPXIucGFyZW50Tm9kZSx0PWUmJmUuX3BlbmRpbmcmJmUuX3BlbmRpbmdbbi5rZXldOyh0JiZ0LmNvbnRleHQ9PT1uLmNvbnRleHQmJnQudGFnPT09bi50YWcmJnQuZWxtLl9sZWF2ZUNiJiZ0LmVsbS5fbGVhdmVDYigpLEMmJkMocixqKSxNKT9uLmNvbnRleHQuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6UCxkdXJhdGlvbjokLmR1cmF0aW9ufHwwLGRlbGF5OiQuZGVsYXl8fDAsdGltaW5nRnVuY3Rpb246JC50aW1pbmdGdW5jdGlvbnx8ImxpbmVhciJ9LEU/TjpqKTpFfHxqKCl9LDE2KSx4JiZ4KHIpLEEpaWYoImZ1bmN0aW9uIj09dHlwZW9mIHIuc2V0U3R5bGVzKXIuc2V0U3R5bGVzKEEpO2Vsc2UgZm9yKHZhciBMIGluIEEpci5zZXRTdHlsZShMLEFbTF0pO018fEV8fGooKX19fXZhciBVcj1mdW5jdGlvbihlKXt2YXIgcix0LHk9e30sbj1lLm1vZHVsZXMsXz1lLm5vZGVPcHM7Zm9yKHI9MDtyPG5yLmxlbmd0aDsrK3IpZm9yKHlbbnJbcl1dPVtdLHQ9MDt0PG4ubGVuZ3RoOysrdClJKG5bdF1bbnJbcl1dKSYmeVtucltyXV0ucHVzaChuW3RdW25yW3JdXSk7ZnVuY3Rpb24gbyhlKXt2YXIgdD1fLnBhcmVudE5vZGUoZSk7SSh0KSYmXy5yZW1vdmVDaGlsZCh0LGUpfWZ1bmN0aW9uIGIoZSx0LG4scixpLG8sYSl7aWYoSShlLmVsbSkmJkkobykmJihlPW9bYV09cGUoZSkpLGUuaXNSb290SW5zZXJ0PSFpLCFmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmRhdGE7aWYoSShpKSl7dmFyIG89SShlLmNvbXBvbmVudEluc3RhbmNlKSYmaS5rZWVwQWxpdmU7aWYoSShpPWkuaG9vaykmJkkoaT1pLmluaXQpJiZpKGUsITEsbixyKSxJKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBwKGUsdCksZChuLGUuZWxtLHIpLEEobykmJmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaSxvPWU7by5jb21wb25lbnRJbnN0YW5jZTspaWYobz1vLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxJKGk9by5kYXRhKSYmSShpPWkudHJhbnNpdGlvbikpe2ZvcihpPTA7aTx5LmFjdGl2YXRlLmxlbmd0aDsrK2kpeS5hY3RpdmF0ZVtpXSh0cixvKTt0LnB1c2gobyk7YnJlYWt9ZChuLGUuZWxtLHIpfShlLHQsbixyKSwhMH19KGUsdCxuLHIpKXt2YXIgcz1lLmRhdGEsYz1lLmNoaWxkcmVuLHU9ZS50YWc7aWYoSSh1KSl7ZS5lbG09ZS5ucz9fLmNyZWF0ZUVsZW1lbnROUyhlLm5zLHUpOl8uY3JlYXRlRWxlbWVudCh1LGUpLGYoZSk7dmFyIGw9SShzKSYmQShzLmFwcGVuZEFzVHJlZSk7bHx8KEkocykmJnYoZSx0KSxkKG4sZS5lbG0scikpLGgoZSxjLHQpLGwmJihJKHMpJiZ2KGUsdCksZChuLGUuZWxtLHIpKX1lbHNlIEEoZS5pc0NvbW1lbnQpP2UuZWxtPV8uY3JlYXRlQ29tbWVudChlLnRleHQpOmUuZWxtPV8uY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSxkKG4sZS5lbG0scil9fWZ1bmN0aW9uIHAoZSx0KXtJKGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSYmKHQucHVzaC5hcHBseSh0LGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSxlLmRhdGEucGVuZGluZ0luc2VydD1udWxsKSxlLmVsbT1lLmNvbXBvbmVudEluc3RhbmNlLiRlbCx3KGUpPyh2KGUsdCksZihlKSk6KFFuKGUpLHQucHVzaChlKSl9ZnVuY3Rpb24gZChlLHQsbil7SShlKSYmKEkobik/Xy5wYXJlbnROb2RlKG4pPT09ZSYmXy5pbnNlcnRCZWZvcmUoZSx0LG4pOl8uYXBwZW5kQ2hpbGQoZSx0KSl9ZnVuY3Rpb24gaChlLHQsbil7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrciliKHRbcl0sbixlLmVsbSxudWxsLCEwLHQscik7ZWxzZSAkKGUudGV4dCkmJl8uYXBwZW5kQ2hpbGQoZS5lbG0sXy5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoZS50ZXh0KSkpfWZ1bmN0aW9uIHcoZSl7Zm9yKDtlLmNvbXBvbmVudEluc3RhbmNlOyllPWUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO3JldHVybiBJKGUudGFnKX1mdW5jdGlvbiB2KGUsdCl7Zm9yKHZhciBuPTA7bjx5LmNyZWF0ZS5sZW5ndGg7KytuKXkuY3JlYXRlW25dKHRyLGUpO0kocj1lLmRhdGEuaG9vaykmJihJKHIuY3JlYXRlKSYmci5jcmVhdGUodHIsZSksSShyLmluc2VydCkmJnQucHVzaChlKSl9ZnVuY3Rpb24gZihlKXt2YXIgdDtpZihJKHQ9ZS5mblNjb3BlSWQpKV8uc2V0U3R5bGVTY29wZShlLmVsbSx0KTtlbHNlIGZvcih2YXIgbj1lO247KUkodD1uLmNvbnRleHQpJiZJKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJl8uc2V0U3R5bGVTY29wZShlLmVsbSx0KSxuPW4ucGFyZW50O0kodD10bikmJnQhPT1lLmNvbnRleHQmJnQhPT1lLmZuQ29udGV4dCYmSSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZfLnNldFN0eWxlU2NvcGUoZS5lbG0sdCl9ZnVuY3Rpb24gbShlLHQsbixyLGksbyl7Zm9yKDtyPD1pOysrciliKG5bcl0sbyxlLHQsITEsbixyKX1mdW5jdGlvbiBrKGUpe3ZhciB0LG4scj1lLmRhdGE7aWYoSShyKSlmb3IoSSh0PXIuaG9vaykmJkkodD10LmRlc3Ryb3kpJiZ0KGUpLHQ9MDt0PHkuZGVzdHJveS5sZW5ndGg7Kyt0KXkuZGVzdHJveVt0XShlKTtpZihJKHQ9ZS5jaGlsZHJlbikpZm9yKG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoOysrbilrKGUuY2hpbGRyZW5bbl0pfWZ1bmN0aW9uIFMoZSx0LG4scil7Zm9yKDtuPD1yOysrbil7dmFyIGk9dFtuXTtJKGkpJiYoSShpLnRhZyk/KGEoaSksayhpKSk6byhpLmVsbSkpfX1mdW5jdGlvbiBhKGUsdCl7aWYoSSh0KXx8SShlLmRhdGEpKXt2YXIgbixyPXkucmVtb3ZlLmxlbmd0aCsxO2ZvcihJKHQpP3QubGlzdGVuZXJzKz1yOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxyKSxJKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkkobj1uLl92bm9kZSkmJkkobi5kYXRhKSYmYShuLHQpLG49MDtuPHkucmVtb3ZlLmxlbmd0aDsrK24peS5yZW1vdmVbbl0oZSx0KTtJKG49ZS5kYXRhLmhvb2spJiZJKG49bi5yZW1vdmUpP24oZSx0KTp0KCl9ZWxzZSBvKGUuZWxtKX1mdW5jdGlvbiB4KGUsdCxuLHIpe2Zvcih2YXIgaT1uO2k8cjtpKyspe3ZhciBvPXRbaV07aWYoSShvKSYmcnIoZSxvKSlyZXR1cm4gaX19ZnVuY3Rpb24gQyhlLHQsbixyLGksbyl7aWYoZSE9PXQpe0kodC5lbG0pJiZJKHIpJiYodD1yW2ldPXBlKHQpKTt2YXIgYT10LmVsbT1lLmVsbTtpZihBKGUuaXNBc3luY1BsYWNlaG9sZGVyKSlJKHQuYXN5bmNGYWN0b3J5LnJlc29sdmVkKT9PKGUuZWxtLHQsbik6dC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7ZWxzZSBpZihBKHQuaXNTdGF0aWMpJiZBKGUuaXNTdGF0aWMpJiZ0LmtleT09PWUua2V5JiYoQSh0LmlzQ2xvbmVkKXx8QSh0LmlzT25jZSkpKXQuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZTtlbHNle3ZhciBzLGM9dC5kYXRhO0koYykmJkkocz1jLmhvb2spJiZJKHM9cy5wcmVwYXRjaCkmJnMoZSx0KTt2YXIgdT1lLmNoaWxkcmVuLGw9dC5jaGlsZHJlbjtpZihJKGMpJiZ3KHQpKXtmb3Iocz0wO3M8eS51cGRhdGUubGVuZ3RoOysrcyl5LnVwZGF0ZVtzXShlLHQpO0kocz1jLmhvb2spJiZJKHM9cy51cGRhdGUpJiZzKGUsdCl9RSh0LnRleHQpP0kodSkmJkkobCk/dSE9PWwmJmZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyxjPTAsdT0wLGw9dC5sZW5ndGgtMSxkPXRbMF0sZj10W2xdLHA9bi5sZW5ndGgtMSxoPW5bMF0sdj1uW3BdLGc9IWk7Yzw9bCYmdTw9cDspRShkKT9kPXRbKytjXTpFKGYpP2Y9dFstLWxdOnJyKGQsaCk/KEMoZCxoLHIsbix1KSxkPXRbKytjXSxoPW5bKyt1XSk6cnIoZix2KT8oQyhmLHYscixuLHApLGY9dFstLWxdLHY9blstLXBdKTpycihkLHYpPyhDKGQsdixyLG4scCksZyYmXy5pbnNlcnRCZWZvcmUoZSxkLmVsbSxfLm5leHRTaWJsaW5nKGYuZWxtKSksZD10WysrY10sdj1uWy0tcF0pOihycihmLGgpPyhDKGYsaCxyLG4sdSksZyYmXy5pbnNlcnRCZWZvcmUoZSxmLmVsbSxkLmVsbSksZj10Wy0tbF0pOihFKG8pJiYobz1pcih0LGMsbCkpLEUoYT1JKGgua2V5KT9vW2gua2V5XTp4KGgsdCxjLGwpKT9iKGgscixlLGQuZWxtLCExLG4sdSk6cnIocz10W2FdLGgpPyhDKHMsaCxyLG4sdSksdFthXT12b2lkIDAsZyYmXy5pbnNlcnRCZWZvcmUoZSxzLmVsbSxkLmVsbSkpOmIoaCxyLGUsZC5lbG0sITEsbix1KSksaD1uWysrdV0pO2w8Yz9tKGUsRShuW3ArMV0pP251bGw6bltwKzFdLmVsbSxuLHUscCxyKTpwPHUmJlMoMCx0LGMsbCl9KGEsdSxsLG4sbyk6SShsKT8oSShlLnRleHQpJiZfLnNldFRleHRDb250ZW50KGEsIiIpLG0oYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpJKHUpP1MoMCx1LDAsdS5sZW5ndGgtMSk6SShlLnRleHQpJiZfLnNldFRleHRDb250ZW50KGEsIiIpOmUudGV4dCE9PXQudGV4dCYmXy5zZXRUZXh0Q29udGVudChhLHQudGV4dCksSShjKSYmSShzPWMuaG9vaykmJkkocz1zLnBvc3RwYXRjaCkmJnMoZSx0KX19fWZ1bmN0aW9uIFQoZSx0LG4pe2lmKEEobikmJkkoZS5wYXJlbnQpKWUucGFyZW50LmRhdGEucGVuZGluZ0luc2VydD10O2Vsc2UgZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5kYXRhLmhvb2suaW5zZXJ0KHRbcl0pfXZhciBnPXMoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE8oZSx0LG4scil7dmFyIGksbz10LnRhZyxhPXQuZGF0YSxzPXQuY2hpbGRyZW47aWYocj1yfHxhJiZhLnByZSx0LmVsbT1lLEEodC5pc0NvbW1lbnQpJiZJKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7aWYoSShhKSYmKEkoaT1hLmhvb2spJiZJKGk9aS5pbml0KSYmaSh0LCEwKSxJKGk9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBwKHQsbiksITA7aWYoSShvKSl7aWYoSShzKSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihJKGk9YSkmJkkoaT1pLmRvbVByb3BzKSYmSShpPWkuaW5uZXJIVE1MKSl7aWYoaSE9PWUuaW5uZXJIVE1MKXJldHVybiExfWVsc2V7Zm9yKHZhciBjPSEwLHU9ZS5maXJzdENoaWxkLGw9MDtsPHMubGVuZ3RoO2wrKyl7aWYoIXV8fCFPKHUsc1tsXSxuLHIpKXtjPSExO2JyZWFrfXU9dS5uZXh0U2libGluZ31pZighY3x8dSlyZXR1cm4hMX1lbHNlIGgodCxzLG4pO2lmKEkoYSkpe3ZhciBkPSExO2Zvcih2YXIgZiBpbiBhKWlmKCFnKGYpKXtkPSEwLHYodCxuKTticmVha30hZCYmYS5jbGFzcyYmSGUoYS5jbGFzcyl9fWVsc2UgZS5kYXRhIT09dC50ZXh0JiYoZS5kYXRhPXQudGV4dCk7cmV0dXJuITB9cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtpZighRSh0KSl7dmFyIGEscz0hMSxjPVtdO2lmKEUoZSkpcz0hMCxiKHQsYyxpLG8pO2Vsc2V7dmFyIHU9SShlLm5vZGVUeXBlKTtpZighdSYmcnIoZSx0KSlDKGUsdCxjLG51bGwsbnVsbCxyKTtlbHNle2lmKHUpe2lmKDE9PT1lLm5vZGVUeXBlJiZlLmhhc0F0dHJpYnV0ZShNKSYmKGUucmVtb3ZlQXR0cmlidXRlKE0pLG49ITApLEEobikmJk8oZSx0LGMpKXJldHVybiBUKHQsYywhMCksZTthPWUsZT1uZXcgdWUoXy50YWdOYW1lKGEpLnRvTG93ZXJDYXNlKCkse30sW10sdm9pZCAwLGEpfXZhciBsPWUuZWxtLGQ9Xy5wYXJlbnROb2RlKGwpO2lmKGIodCxjLGwuX2xlYXZlQ2I/bnVsbDpkLF8ubmV4dFNpYmxpbmcobCkpLEkodC5wYXJlbnQpKWZvcih2YXIgZj10LnBhcmVudCxwPXcodCk7Zjspe2Zvcih2YXIgaD0wO2g8eS5kZXN0cm95Lmxlbmd0aDsrK2gpeS5kZXN0cm95W2hdKGYpO2lmKGYuZWxtPXQuZWxtLHApe2Zvcih2YXIgdj0wO3Y8eS5jcmVhdGUubGVuZ3RoOysrdil5LmNyZWF0ZVt2XSh0cixmKTt2YXIgZz1mLmRhdGEuaG9vay5pbnNlcnQ7aWYoZy5tZXJnZWQpZm9yKHZhciBtPTE7bTxnLmZucy5sZW5ndGg7bSsrKWcuZm5zW21dKCl9ZWxzZSBRbihmKTtmPWYucGFyZW50fUkoZCk/UygwLFtlXSwwLDApOkkoZS50YWcpJiZrKGUpfX1yZXR1cm4gVCh0LGMscyksdC5lbG19SShlKSYmayhlKX19KHtub2RlT3BzOktuLG1vZHVsZXM6W21yLEFyLGpyLE5yLHtjcmVhdGU6RnIsYWN0aXZhdGU6RnIscmVtb3ZlOmZ1bmN0aW9uKG4sZSl7dmFyIHI9bi5lbG07ci5fZW50ZXJDYiYmKHIuX2VudGVyQ2IuY2FuY2VsbGVkPSEwLHIuX2VudGVyQ2IoKSk7dmFyIHQ9RHIobi5kYXRhLnRyYW5zaXRpb24pO2lmKCF0KXJldHVybiBlKCk7aWYoci5fbGVhdmVDYilyZXR1cm47dmFyIGk9dC5sZWF2ZUNsYXNzLG89dC5sZWF2ZVRvQ2xhc3MsYT10LmxlYXZlQWN0aXZlQ2xhc3Mscz10LmJlZm9yZUxlYXZlLGM9dC5sZWF2ZSx1PXQuYWZ0ZXJMZWF2ZSxsPXQubGVhdmVDYW5jZWxsZWQsZD10LmRlbGF5TGVhdmUsZj1jJiYxPChjLl9sZW5ndGh8fGMubGVuZ3RoKSxwPW4uY29udGV4dC4kb3B0aW9ucy5zdHlsZXx8e30saD1wW2ldLHY9cFtvXXx8cFthXSxnPXBbIkBUUkFOU0lUSU9OIl0mJnBbIkBUUkFOU0lUSU9OIl1bYV18fHt9LG09ci5fbGVhdmVDYj1EKGZ1bmN0aW9uKCl7ci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUuX3BlbmRpbmcmJihyLnBhcmVudE5vZGUuX3BlbmRpbmdbbi5rZXldPW51bGwpLG0uY2FuY2VsbGVkP2wmJmwocik6KGUoKSx1JiZ1KHIpKSxyLl9sZWF2ZUNiPW51bGx9KTtkP2QoeSk6eSgpO2Z1bmN0aW9uIHkoKXt2YXIgZT1uLmNvbnRleHQuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKTtmdW5jdGlvbiB0KCl7ZS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6dixkdXJhdGlvbjpnLmR1cmF0aW9ufHwwLGRlbGF5OmcuZGVsYXl8fDAsdGltaW5nRnVuY3Rpb246Zy50aW1pbmdGdW5jdGlvbnx8ImxpbmVhciJ9LGY/TjptKX1tLmNhbmNlbGxlZHx8KG4uZGF0YS5zaG93fHwoKHIucGFyZW50Tm9kZS5fcGVuZGluZ3x8KHIucGFyZW50Tm9kZS5fcGVuZGluZz17fSkpW24ua2V5XT1uKSxzJiZzKHIpLGg/ZS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6aH0sdCk6dCgpLGMmJmMocixtKSx2fHxmfHxtKCkpfX19XS5jb25jYXQobHIpLExPTkdfTElTVF9USFJFU0hPTEQ6MTB9KSx6cj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2ZSk7ZnVuY3Rpb24gVnIoZSxyKXt2YXIgaT1lLiRlbDtyZXR1cm4gaSYmImZ1bmN0aW9uIj09dHlwZW9mIGlbcl0/ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3JldHVybiBpW3JdLmFwcGx5KGksdCl9OihpZSgiQ2FuJ3QgZmluZCBjb21wb25lbnQgbWV0aG9kIFwiIityKyciIG9uICcraS50eXBlKSxOKX1mdW5jdGlvbiBxcihlLG4pe0FycmF5LmlzQXJyYXkobikmJighZnVuY3Rpb24oZixuKXtmb3IodmFyIGU9ZnVuY3Rpb24oZSx0KXt2YXIgZD16cltlXTtGKG4sZCxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHI9dGhpcy5sZW5ndGgsaT12ZVtkXTsiZnVuY3Rpb24iPT10eXBlb2YgaSYmaS5hcHBseSh0aGlzLHQpO3ZhciBvPVZyKGYsInJlbW92ZURhdGEiKSxhPVZyKGYsImluc2VydFJhbmdlIikscz1WcihmLCJzZXRMaXN0RGF0YSIpO3N3aXRjaChkKXtjYXNlInB1c2giOmEocix0KTticmVhaztjYXNlInBvcCI6byhyLTEsMSk7YnJlYWs7Y2FzZSJzaGlmdCI6bygwLDEpO2JyZWFrO2Nhc2UidW5zaGlmdCI6YSgwLHQpO2JyZWFrO2Nhc2Uic3BsaWNlIjp2YXIgYz10WzBdLHU9dFsxXSxsPXQuc2xpY2UoMik7MDx1JiZvKGMsdSksMDxsLmxlbmd0aCYmYShjLGwpO2JyZWFrO2Nhc2Uic29ydCI6Y2FzZSJyZXZlcnNlIjpzKHRoaXMuc2xpY2UoKSl9fSl9LHQ9MCxyPXpyLmxlbmd0aDt0PHI7dCsrKWUodCl9KGUsbiksbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2QodCkmJiFmKHQsIltbV2F0Y2hlZF1dIikmJihGKHQsIltbV2F0Y2hlZF1dIiwhMCksZS4kd2F0Y2goZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdCl0W2VdfSxmdW5jdGlvbigpe1ZyKGUsInVwZGF0ZURhdGEiKShuLmluZGV4T2YodCksdCl9LHtkZWVwOiEwfSkpfSkpfXZhciBXcj17bmFtZToicmVjeWNsZS1saXN0IixtZXRob2RzOntjbG9zZXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT10W3JdO3JldHVybihlPXRoaXMuJGVsKS5jbG9zZXN0LmFwcGx5KGUsbil9LHF1ZXJ5RWxlbWVudDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkucXVlcnlFbGVtZW50LmFwcGx5KGUsbil9LHF1ZXJ5RWxlbWVudEFsbDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkucXVlcnlFbGVtZW50QWxsLmFwcGx5KGUsbil9LHNjcm9sbFRvRWxlbWVudDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkuc2Nyb2xsVG9FbGVtZW50LmFwcGx5KGUsbil9LHJlc2V0TG9hZG1vcmU6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnJlc2V0TG9hZG1vcmUuYXBwbHkoZSxuKX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHRoaXMuX3Zub2RlJiZ0aGlzLiRvcHRpb25zWyJbW1VzZUNhY2hlXV0iXSlyZXR1cm4gRih0aGlzLiRvcHRpb25zLCJbW1VzZUNhY2hlXV0iLCExKSx0aGlzLl92bm9kZTt2YXIgbj10aGlzLiRvcHRpb25zLnBhcmVudCxyPXRoaXMuJGF0dHJzLmJpbmRpbmdFeHByZXNzaW9uO3JldHVybiBuJiZyJiYobi4kd2F0Y2gocixmdW5jdGlvbigpe3JldHVybiBGKHQuJG9wdGlvbnMsIltbVXNlQ2FjaGVdXSIsITApfSx7ZGVlcDohMCxpbW1lZGlhdGU6ITB9KSxxcih0aGlzLHRoaXMuJGF0dHJzLmxpc3REYXRhKSxuLiR3YXRjaChyLGZ1bmN0aW9uKGUpe3FyKHQsZSl9KSksdGhpcy5fZXZlbnRzLl9hdHRhY2hfc2xvdD1mdW5jdGlvbihlKXtJdCh0LiRwYXJlbnR8fHQsZS5wb3NpdGlvbixlLnJlZnMpfSx0aGlzLl9ldmVudHMuX2RldGFjaF9zbG90PWZ1bmN0aW9uKGUpe0l0KHQuJHBhcmVudHx8dCxlLnBvc2l0aW9uLGUucmVmcywhMCl9LGUoIndlZXg6cmVjeWNsZS1saXN0Iix7b246dGhpcy5fZXZlbnRzfSx0aGlzLiRzbG90cy5kZWZhdWx0KX0scmVuZGVyRXJyb3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSgidGV4dCIse3N0eWxlOntmb250U2l6ZToiMzZweCIsY29sb3I6IiNGRjAwMDAifSx2YWx1ZTp0LnRvU3RyaW5nKCl9KX19LEhyPXtuYW1lOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixjc3M6Qm9vbGVhbixtb2RlOlN0cmluZyx0eXBlOlN0cmluZyxlbnRlckNsYXNzOlN0cmluZyxsZWF2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxkdXJhdGlvbjpbTnVtYmVyLFN0cmluZyxPYmplY3RdfTtmdW5jdGlvbiBHcihlKXt2YXIgdD1lJiZlLmNvbXBvbmVudE9wdGlvbnM7cmV0dXJuIHQmJnQuQ3Rvci5vcHRpb25zLmFic3RyYWN0P0dyKEp0KHQuY2hpbGRyZW4pKTplfWZ1bmN0aW9uIFhyKGUpe3ZhciB0PXt9LG49ZS4kb3B0aW9ucztmb3IodmFyIHIgaW4gbi5wcm9wc0RhdGEpdFtyXT1lW3JdO3ZhciBpPW4uX3BhcmVudExpc3RlbmVycztmb3IodmFyIG8gaW4gaSl0W2gobyldPWlbb107cmV0dXJuIHR9ZnVuY3Rpb24gSnIoZSx0KXtpZigvXGQta2VlcC1hbGl2ZSQvLnRlc3QodC50YWcpKXJldHVybiBlKCJrZWVwLWFsaXZlIix7cHJvcHM6dC5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YX0pfXZhciBZcj1mdW5jdGlvbihlKXtyZXR1cm4gZS50YWd8fFh0KGUpfSxLcj1mdW5jdGlvbihlKXtyZXR1cm4ic2hvdyI9PT1lLm5hbWV9LFpyPXtuYW1lOiJ0cmFuc2l0aW9uIixwcm9wczpIcixhYnN0cmFjdDohMCxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuJHNsb3RzLmRlZmF1bHQ7aWYobiYmKG49bi5maWx0ZXIoWXIpKS5sZW5ndGgpe3ZhciByPXRoaXMubW9kZSxpPW5bMF07aWYoZnVuY3Rpb24oZSl7Zm9yKDtlPWUucGFyZW50OylpZihlLmRhdGEudHJhbnNpdGlvbilyZXR1cm4hMH0odGhpcy4kdm5vZGUpKXJldHVybiBpO3ZhciBvPUdyKGkpO2lmKCFvKXJldHVybiBpO2lmKHRoaXMuX2xlYXZpbmcpcmV0dXJuIEpyKGUsaSk7dmFyIGE9Il9fdHJhbnNpdGlvbi0iK3RoaXMuX3VpZCsiLSI7by5rZXk9bnVsbD09by5rZXk/by5pc0NvbW1lbnQ/YSsiY29tbWVudCI6YStvLnRhZzokKG8ua2V5KT8wPT09U3RyaW5nKG8ua2V5KS5pbmRleE9mKGEpP28ua2V5OmErby5rZXk6by5rZXk7dmFyIHMsYyx1PShvLmRhdGF8fChvLmRhdGE9e30pKS50cmFuc2l0aW9uPVhyKHRoaXMpLGw9dGhpcy5fdm5vZGUsZD1HcihsKTtpZihvLmRhdGEuZGlyZWN0aXZlcyYmby5kYXRhLmRpcmVjdGl2ZXMuc29tZShLcikmJihvLmRhdGEuc2hvdz0hMCksZCYmZC5kYXRhJiYocz1vLChjPWQpLmtleSE9PXMua2V5fHxjLnRhZyE9PXMudGFnKSYmIVh0KGQpJiYoIWQuY29tcG9uZW50SW5zdGFuY2V8fCFkLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpKXt2YXIgZj1kLmRhdGEudHJhbnNpdGlvbj1CKHt9LHUpO2lmKCJvdXQtaW4iPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCxZZShmLCJhZnRlckxlYXZlIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLEpyKGUsaSk7aWYoImluLW91dCI9PT1yKXtpZihYdChvKSlyZXR1cm4gbDt2YXIgcCxoPWZ1bmN0aW9uKCl7cCgpfTtZZSh1LCJhZnRlckVudGVyIixoKSxZZSh1LCJlbnRlckNhbmNlbGxlZCIsaCksWWUoZiwiZGVsYXlMZWF2ZSIsZnVuY3Rpb24oZSl7cD1lfSl9fXJldHVybiBpfX19LFFyPUIoe3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30sSHIpO2RlbGV0ZSBRci5tb2RlO3ZhciBlaT17UmVjeWNsZUxpc3Q6V3IsVHJhbnNpdGlvbjpacixUcmFuc2l0aW9uR3JvdXA6e3Byb3BzOlFyLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgiZG9tIik7dGhpcy5nZXRQb3NpdGlvbj1mdW5jdGlvbihyKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlLmdldENvbXBvbmVudFJlY3Qoci5yZWYsZnVuY3Rpb24oZSl7ZS5yZXN1bHQ/dChlLnNpemUpOm4obmV3IEVycm9yKCJmYWlsZWQgdG8gZ2V0IHJlY3QgZm9yIGVsZW1lbnQ6ICIrci50YWcpKX0pfSl9O3ZhciByPXRoaXMuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKTt0aGlzLmFuaW1hdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7ci50cmFuc2l0aW9uKHQucmVmLG4sZSl9KX19LHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHwic3BhbiIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixpPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLG89dGhpcy5jaGlsZHJlbj1bXSxhPVhyKHRoaXMpLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGM9aVtzXTtjLnRhZyYmbnVsbCE9Yy5rZXkmJjAhPT1TdHJpbmcoYy5rZXkpLmluZGV4T2YoIl9fdmxpc3QiKSYmKG8ucHVzaChjKSwoKG5bYy5rZXldPWMpLmRhdGF8fChjLmRhdGE9e30pKS50cmFuc2l0aW9uPWEpfWlmKHIpe3ZhciB1PVtdLGw9W107ci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGF0YS50cmFuc2l0aW9uPWEsbltlLmtleV0/dS5wdXNoKGUpOmwucHVzaChlKX0pLHRoaXMua2VwdD1lKHQsbnVsbCx1KSx0aGlzLnJlbW92ZWQ9bH1yZXR1cm4gZSh0LG51bGwsbyl9LGJlZm9yZVVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX19wYXRjaF9fKHRoaXMuX3Zub2RlLHRoaXMua2VwdCwhMSwhMCksdGhpcy5fdm5vZGU9dGhpcy5rZXB0fSx1cGRhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcmV2Q2hpbGRyZW4sdD10aGlzLm1vdmVDbGFzc3x8KHRoaXMubmFtZXx8InYiKSsiLW1vdmUiO2UubGVuZ3RoJiZ0aGlzLmdldE1vdmVEYXRhKGVbMF0uY29udGV4dCx0KX0sbWV0aG9kczp7Z2V0TW92ZURhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zLnN0eWxlfHx7fTtyZXR1cm4gblsiQFRSQU5TSVRJT04iXSYmblsiQFRSQU5TSVRJT04iXVt0XX19fX0sdGk9cygidGVtcGxhdGUsc2NyaXB0LHN0eWxlLGVsZW1lbnQsY29udGVudCxzbG90LGxpbmssbWV0YSxzdmcsdmlldyxhLGRpdixpbWcsaW1hZ2UsdGV4dCx1LXRleHQsc3BhbixpbnB1dCx0ZXh0YXJlYSxzcGlubmVyLHNlbGVjdCxzbGlkZXIsc2xpZGVyLW5laWdoYm9yLGluZGljYXRvcixjYW52YXMsbGlzdCxjZWxsLGhlYWRlcixsb2FkaW5nLGxvYWRpbmctaW5kaWNhdG9yLHJlZnJlc2gsc2Nyb2xsYWJsZSxzY3JvbGxlcix2aWRlbyx3ZWIsZW1iZWQsdGFiYmFyLHRhYmhlYWRlcixkYXRlcGlja2VyLHRpbWVwaWNrZXIsbWFycXVlZSxjb3VudGRvd24iLCEwKSxuaT0ocygid2ViLHNwaW5uZXIsc3dpdGNoLHZpZGVvLHRleHRhcmVhLGNhbnZhcyxpbmRpY2F0b3IsbWFycXVlZSxjb3VudGRvd24iLCEwKSxzKCJyaWNodGV4dCx0cmFuc2l0aW9uLHRyYW5zaXRpb24tZ3JvdXAscmVjeWNsZS1saXN0IiwhMCkpO3MoImVtYmVkLGltZyxpbWFnZSxpbnB1dCxsaW5rLG1ldGEiLCEwKTtObi5jb25maWcubXVzdFVzZVByb3A9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTm4uY29uZmlnLmlzUmVzZXJ2ZWRUYWc9dGksTm4uY29uZmlnLmlzUnVudGltZUNvbXBvbmVudD1uaSxObi5jb25maWcuaXNVbmtub3duRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiExfSxObi5vcHRpb25zLmRpcmVjdGl2ZXM9e30sTm4ub3B0aW9ucy5jb21wb25lbnRzPWVpLE5uLnByb3RvdHlwZS5fX3BhdGNoX189VXIsTm4ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBuPXRoaXMscj1lJiYobz10aGlzLiRkb2N1bWVudCwoYT1vLmNyZWF0ZUNvbW1lbnQoInJvb3QiKSkuaGFzQXR0cmlidXRlPWEucmVtb3ZlQXR0cmlidXRlPU4sby5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYSksYSksaT10LG4uJGVsPXIsbi4kb3B0aW9ucy5yZW5kZXJ8fChuLiRvcHRpb25zLnJlbmRlcj1kZSksYW4obiwiYmVmb3JlTW91bnQiKSxuZXcgbW4obixmdW5jdGlvbigpe24uX3VwZGF0ZShuLl9yZW5kZXIoKSxpKX0sTix7YmVmb3JlOmZ1bmN0aW9uKCl7bi5faXNNb3VudGVkJiYhbi5faXNEZXN0cm95ZWQmJmFuKG4sImJlZm9yZVVwZGF0ZSIpfX0sITApLGk9ITEsbnVsbD09bi4kdm5vZGUmJihuLl9pc01vdW50ZWQ9ITAsYW4obiwibW91bnRlZCIpKSxuO3ZhciBuLHIsaSxvLGF9LE5uLnByb3RvdHlwZS5fX2NhbGxfaG9vaz1mdW5jdGlvbihlLHQpe3NlKCk7dmFyIG4scj10aGlzLiRvcHRpb25zW2VdLGk9ZSsiIGhvb2siO2lmKHIpZm9yKHZhciBvPTAsYT1yLmxlbmd0aDtvPGE7bysrKW49TmUocltvXSx0aGlzLHQ/W3RdOm51bGwsdGhpcyxpKTtyZXR1cm4gdGhpcy5faGFzSG9va0V2ZW50JiZ0aGlzLiRlbWl0KCJob29rOiIrZSx0KSxjZSgpLG59LGUuVnVlPU5ufX0pO3Vud3JhcEV4cG9ydHMoZmFjdG9yeSk7dmFyIHdlZXhWdWVGcmFtZXdvcms9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGQ9e307dC5jcmVhdGVJbnN0YW5jZUNvbnRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcixpLG8sYSxzPXQud2VleCxjPShkW2VdPXtpbnN0YW5jZUlkOmUsY29uZmlnOnMuY29uZmlnLGRvY3VtZW50OnMuZG9jdW1lbnQsZGF0YTpufSkuVnVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtmYWN0b3J5KHIsdC5kb2N1bWVudCxuKTt2YXIgaT1yLlZ1ZSxvPWRbZV0sYT0vXndlZXg6L2kscz1pLmNvbmZpZy5pc1Jlc2VydmVkVGFnfHxmdW5jdGlvbigpe3JldHVybiExfSxjPWkuY29uZmlnLmlzUnVudGltZUNvbXBvbmVudHx8ZnVuY3Rpb24oKXtyZXR1cm4hMX07cmV0dXJuIGkuY29uZmlnLmlzUmVzZXJ2ZWRUYWc9ZnVuY3Rpb24oZSl7cmV0dXJuIWMoZSkmJnQuc3VwcG9ydHMoIkBjb21wb25lbnQvIitlKXx8cyhlKXx8YS50ZXN0KGUpfSxpLmNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGEsIiIpfSxpLnByb3RvdHlwZS4kaW5zdGFuY2VJZD1lLGkucHJvdG90eXBlLiRkb2N1bWVudD1vLmRvY3VtZW50LGkucHJvdG90eXBlLiRyZXF1aXJlV2VleE1vZHVsZT10LnJlcXVpcmVNb2R1bGUsaS5taXhpbih7YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kb3B0aW9ucztpZihlLmVsKXt2YXIgdD1lLmRhdGEsbj0oImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpfHx7fTtlLmRhdGE9T2JqZWN0LmFzc2lnbihuLG8uZGF0YSksby5hcHA9dGhpc319LG1vdW50ZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLiRvcHRpb25zLmVsJiZ0LmRvY3VtZW50JiZvLmFwcD09PXRoaXMpdHJ5e3QuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUZpbmlzaCJ9LFtdKX1jYXRjaChlKXt9fX0pLGkucHJvdG90eXBlLiRnZXRDb25maWc9ZnVuY3Rpb24oKXtpZihvLmFwcCBpbnN0YW5jZW9mIGkpcmV0dXJuIG8uY29uZmlnfSxpfShlLHMsdC5TaGFyZWRPYmplY3QpLHU9KHI9ZSxpPXMucmVxdWlyZU1vZHVsZSxvPWRbcl0sYT1pKCJ0aW1lciIpLHtzZXRUaW1lb3V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtpZihhLnNldFRpbWVvdXQpe3ZhciByPW8uZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQ7cmV0dXJuIGEuc2V0VGltZW91dChmdW5jdGlvbigpe3RbMF0uYXBwbHkodCx0LnNsaWNlKDIpKX0sdFsxXSksKHIrMSkudG9TdHJpbmcoKX19LHNldEludGVydmFsOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtpZihhLnNldEludGVydmFsKXt2YXIgcj1vLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkO3JldHVybiBhLnNldEludGVydmFsKGZ1bmN0aW9uKCl7dFswXS5hcHBseSh0LHQuc2xpY2UoMikpfSx0WzFdKSwocisxKS50b1N0cmluZygpfX0sY2xlYXJUaW1lb3V0OmZ1bmN0aW9uKGUpe2EuY2xlYXJUaW1lb3V0JiZhLmNsZWFyVGltZW91dChlKX0sY2xlYXJJbnRlcnZhbDpmdW5jdGlvbihlKXthLmNsZWFySW50ZXJ2YWwmJmEuY2xlYXJJbnRlcnZhbChlKX19KSxsPU9iamVjdC5hc3NpZ24oe1Z1ZTpjfSx1KTtyZXR1cm4gT2JqZWN0LmZyZWV6ZShsKSxsfSx0LmRlc3Ryb3lJbnN0YW5jZT1mdW5jdGlvbihlKXt2YXIgdD1kW2VdO2lmKHQmJnQuYXBwIGluc3RhbmNlb2YgdC5WdWUpe3RyeXt0LmFwcC4kZGVzdHJveSgpLHQuZG9jdW1lbnQuZGVzdHJveSgpfWNhdGNoKGUpe31kZWxldGUgdC5kb2N1bWVudCxkZWxldGUgdC5hcHB9ZGVsZXRlIGRbZV19LHQucmVmcmVzaEluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZFtlXTtpZighKG4mJm4uYXBwIGluc3RhbmNlb2Ygbi5WdWUpKXJldHVybiBuZXcgRXJyb3IoInJlZnJlc2hJbnN0YW5jZTogaW5zdGFuY2UgIitlKyIgbm90IGZvdW5kISIpO2lmKG4uVnVlJiZuLlZ1ZS5zZXQpZm9yKHZhciByIGluIHQpbi5WdWUuc2V0KG4uYXBwLHIsdFtyXSk7bi5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoicmVmcmVzaEZpbmlzaCJ9LFtdKX19KSxpbmRleD11bndyYXBFeHBvcnRzKHdlZXhWdWVGcmFtZXdvcmspLHdlZXhWdWVGcmFtZXdvcmtfMT13ZWV4VnVlRnJhbWV3b3JrLmNyZWF0ZUluc3RhbmNlQ29udGV4dCx3ZWV4VnVlRnJhbWV3b3JrXzI9d2VleFZ1ZUZyYW1ld29yay5kZXN0cm95SW5zdGFuY2Usd2VleFZ1ZUZyYW1ld29ya18zPXdlZXhWdWVGcmFtZXdvcmsucmVmcmVzaEluc3RhbmNlLFZ1ZT1PYmplY3QuZnJlZXplKHtkZWZhdWx0OmluZGV4LF9fbW9kdWxlRXhwb3J0czp3ZWV4VnVlRnJhbWV3b3JrLGNyZWF0ZUluc3RhbmNlQ29udGV4dDp3ZWV4VnVlRnJhbWV3b3JrXzEsZGVzdHJveUluc3RhbmNlOndlZXhWdWVGcmFtZXdvcmtfMixyZWZyZXNoSW5zdGFuY2U6d2VleFZ1ZUZyYW1ld29ya18zfSk7c2V0TmF0aXZlQ29uc29sZSgpLHNldHVwKHtWdWU6VnVlfSl9KTsK \ No newline at end of file diff --git a/UniMPSwiftDemo/Podfile b/UniMPSwiftDemo/Podfile index 626549402c1cf5da7b57a487f44fd2b82f1dc07b..30dd9eb3645b5c44fc83a14f46c37f2ca3383f53 100644 --- a/UniMPSwiftDemo/Podfile +++ b/UniMPSwiftDemo/Podfile @@ -6,7 +6,7 @@ target 'UniMPSwiftDemo' do ## 判断需要引用哪些模块请参考文档:https://nativesupport.dcloud.net.cn/AppDocs/usemodule/iOSModuleConfig/common.html#%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%E6%A8%A1%E5%9D%97-%E4%B8%89%E6%96%B9sdk ## 根据功能对照表添加,建议一次不要Pod太多模块容易超时 - pod 'unimp', :subspecs => [ + pod 'unimp','~> 3.991', :subspecs => [ 'Core', ##核心库(必需) # 'Log', ## # 'Accelerometer', ##加速度传感器 diff --git a/unimp.podspec b/unimp.podspec index 2876d5c699a285e350a7c31cb562473f6b7fff8d..564693992f7191880c7d13f6f33daab073ef2892 100644 --- a/unimp.podspec +++ b/unimp.podspec @@ -9,7 +9,7 @@ Pod::Spec.new do |s| s.name = "unimp" - s.version = "3.991" + s.version = "4.08" s.summary = "UniMPSDK" s.homepage = "https://gitcode.net/dcloud/unimpsdk-ios" s.license = { :type => 'MIT', :file => 'LICENSE' }